{"version":3,"sources":["components/ad/Banners/images/MkTaxi/mktaxi_logo.png","components/ad/OtherServices/AirportTransferTaxi/images/iyotetsutaxi-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/king-taxi-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/kisakata-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/eastern_airport_logo.png","components/ad/OtherServices/AirportTransferTaxi/images/eastern_airport_logo_en.png","components/ad/OtherServices/AirportTransferTaxi/images/sandenTaxiLogo.png","components/ad/OtherServices/AirportTransferTaxi/images/nahaHireLogo.png","components/ad/OtherServices/AirportTransferTaxi/images/miyakou-taxi-logo.jpg","components/ad/OtherServices/AirportTransferTaxi/images/hinomaruHireLogo.png","components/ad/OtherServices/AirportTransferTaxi/images/nangokuTaxiLogo.png","components/ad/OtherServices/AirportTransferTaxi/images/gotaku-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/asahikawa-chuuo-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/hakodate-taxi-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/daiwa-taxi-logo.jpg","components/ad/OtherServices/AirportTransferTaxi/images/kita-fukushima-taxi-logo.jpg","components/ad/OtherServices/AirportTransferTaxi/images/fukushima-chuo-taxi-logo.jpg","components/ad/OtherServices/AirportTransferTaxi/images/iwaki-taxi-logo.jpg","components/ad/OtherServices/AirportTransferTaxi/images/uchigo-taxi-logo.jpg","components/ad/OtherServices/AirportTransferTaxi/images/tajima-taxi-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/kinugawa-taxi-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/hokto-taxi-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/yoko-taxi-logo.jpg","components/ad/OtherServices/AirportTransferTaxi/images/toden-taxi-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/ishikawa-taxi-logo.jpg","components/ad/OtherServices/AirportTransferTaxi/images/ube-kounai-taxi-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/tsuzu-taxi-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/sakata-no1taxi-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/shoko-hire-logo.png","components/ad/OtherServices/AirportTransferTaxi/images/dummy_taxi_logo.png","components/ad/OtherServices/AirportTransferTaxi/common/Header/images/tabicube_ja.jpg","components/ad/OtherServices/AirportTransferTaxi/common/Header/images/tabicube_en.jpg","components/ad/OtherServices/AirportTransferTaxi/images/logo.png","components/ad/OtherServices/AirportTransferTaxi/images/logoEN.png","components/search/Icons/icon_input_airport.png","components/ad/Banners/images/MkTaxi/bn_mk_taxi_2209_640_100.png","components/ad/Banners/images/MkTaxi/bn_mk_hire_640_100.jpg","components/ad/Banners/images/MkTaxi/bn_mk_kyoto_2209_640_100.png","components/ad/Banners/images/MkTaxi/popup/mktaxi_service_hire.jpg","components/ad/Banners/images/MkTaxi/popup/mktaxi_service.jpg","components/ad/Banners/images/MkTaxi/popup/BarrierFreeImage.png","components/ad/Banners/images/nearMe/popup/service4.png","components/ad/Banners/images/nearMe/logo_black.png","components/result/sections/images/cc.jpg","components/ad/Banners/images/MkTaxi/popup/mktaxi_kyoto_service.jpg","actions/conditionAction.ts","states/conditionState.ts","services/ana/data/arrivalGateToStation.ts","services/ana/data/arrivalGateToStationInt.ts","services/ana/data/busGates.ts","services/ana/data/satelliteGates.ts","states/query.ts","utils/dateTime.ts","utils/Airlines.ts","services/ana/data/airportMapPath.ts","utils/ana.ts","components/result/DepartureGuide/ToArrivalGuide/AirportMap.ts","services/ana/models/flightInfo.ts","states/common.ts","reducers/conditon.ts","actions/publicConditionAction.ts","services/public/models/searchCourse.ts","states/publicConditionState.ts","reducers/publicCondition.ts","actions/generalAction.ts","reducers/general.ts","reducers/index.ts","store.ts","components/common/ScrollToTop.tsx","utils/environment.ts","services/taxi/GetReservation/index.ts","services/taxi/GetTaxiMetaInfo/index.ts","components/ad/OtherServices/AirportTransferTaxi/common/LoadingModal.tsx","utils/regExpUtils.ts","components/common/ScClick.tsx","services/taxi/Reservation/index.ts","components/ad/OtherServices/AirportTransferTaxi/common/Cost.tsx","components/ad/OtherServices/MiyakoTaxi/AlertInReservation/index.tsx","services/taxi/Reservation/ReservationResponse.ts","components/ad/OtherServices/AirportTransferTaxi/Reservation/Form/SelectChildrenNum.tsx","components/ad/OtherServices/AirportTransferTaxi/Reservation/Form/SelectAdultNum.tsx","components/ad/OtherServices/AirportTransferTaxi/Reservation/Form/SelectCarNum.tsx","components/ad/OtherServices/AirportTransferTaxi/Reservation/Form/SelectOtherBag.tsx","components/ad/OtherServices/AirportTransferTaxi/Reservation/Form/SelectSuitcase.tsx","components/ad/OtherServices/AirportTransferTaxi/Reservation/Form/SelectGolfBag.tsx","components/search/LoadingModal.tsx","services/taxi/GetDirectionAndFare/models/getFareSamplesParams.ts","components/ad/OtherServices/AirportTransferTaxi/common/AMCCaution/jp.tsx","components/ad/OtherServices/AirportTransferTaxi/common/AMCCaution/en.tsx","components/ad/OtherServices/AirportTransferTaxi/common/AMCCaution/index.tsx","components/ad/OtherServices/AirportTransferTaxi/common/CautionsEN.tsx","components/ad/OtherServices/AirportTransferTaxi/common/CautionsJP.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Cautions.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Contact.tsx","utils/lang.ts","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/ShowTaxiComapnyLogo.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Map/Coordinates.ts","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/PickupPattern.ts","services/google/GoogleReCaptcha.ts","services/taxi/TemporaryReservation/index.ts","utils/geoLocation.ts","components/search/Candidate.ts","utils/stringUtils.ts","services/google/Place.ts","services/public/api.ts","services/public/googleApi.ts","services/google/api.ts","utils/luxonUtil.ts","utils/getParams.ts","components/ad/OtherServices/AirportTransferTaxi/common/Address.ts","services/taxi/GetDirectionAndFare/index.ts","services/taxi/GetTaxiMetaInfo/model/taxiCompanyConf.ts","components/ad/OtherServices/CommonTaxi/CommonTaxiDateUtils.ts","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/useForm.tsx","components/ad/OtherServices/AirportTransferTaxi/common/RegExp.ts","components/ad/OtherServices/AirportTransferTaxi/Reservation/index.tsx","components/ad/OtherServices/AirportTransferTaxi/Reservation/Form/useForm.tsx","components/ad/OtherServices/AirportTransferTaxi/common/TabiCube.ts","components/ad/OtherServices/AirportTransferTaxi/common/Header/TabiCube.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Header/TaxiAndHireHeader.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Header/index.tsx","components/common/Footer/ExternalLink.tsx","components/common/Footer/ExternalTransmissionDiscipline.tsx","components/common/Footer/PrivacyPolicy.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Footer/Terms.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Footer/ServiceOverview/JP.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Footer/ServiceOverview/EN.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Footer/ServiceOverview/ServiceBody.tsx","utils/tabIndexList.ts","components/common/ModalHeader.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Footer/ServiceOverview/ServiceDialog.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Footer/ServiceOverview/index.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Footer/TabiCube.tsx","components/common/Terms/TermsBodyJP.tsx","components/common/Terms/TermsBodyEN.tsx","components/common/Terms/TermsBody.tsx","components/common/Terms/TermsDialog.tsx","ekispert/extreme.ts","utils/ekispert.ts","services/ekispert/api.ts","components/common/ServiceAboutBody.tsx","components/common/TaxiServiceAboutBody.tsx","components/common/ServiceAboutDialog.tsx","components/public/common/PublicServiceAboutBody.tsx","components/public/common/PublicServiceAboutDialog.tsx","components/common/Footer.tsx","components/ad/OtherServices/AirportTransferTaxi/common/Footer/index.tsx","components/Booking.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/useTemporaryReservation.tsx","containers/bookingContainer.ts","components/NotFound.tsx","themes/ana.ts","themes/universalMaaS.ts","utils/path.ts","components/search/Icons/AswSearch.tsx","services/google/data/replaceWordList.ts","services/google/fixAutocompleteInput.ts","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Map/SearchBox.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Map/index.tsx","components/common/useGoogleMaps.tsx","services/ana/data/airportNameMap.ts","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/SelectAirport.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/SelectFlightHour.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/SelectFlightMinutes.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/SelectHour.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/SelectMinutes.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/SelectDay.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/SelectMonth.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/SelectYear.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/ButtonToSubmit.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/SelectHourAndMinutesPulldown.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Form/SelectFlight.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/index.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Success.tsx","components/ad/OtherServices/MiyakoTaxi/common/EmailCheckList.tsx","components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Unreceived.tsx","components/LinkToTabicube/util.ts","components/LinkToTabicube/index.tsx","App.tsx","serviceWorker.ts","i18n.ts","services/ana/api.ts","services/datalake/api.ts","services/ekispert/data/exitToStations.ts","services/ekispert/data/airportsAndStations.ts","components/ad/Banners/Banner.tsx","components/common/PopupDialog/ButtonToLink.tsx","components/common/PopupDialog/Type.tsx","components/ad/OtherServices/MkTaxi/MkTaxiService.tsx","components/common/PopupDialog/index.tsx","components/ad/OtherServices/NearMe/NearMeServiceBody.tsx","components/ad/OtherServices/NearMe/NearMeLogic.ts","components/result/sections/ButtonOfSection.tsx","components/ad/OtherServices/NearMe/NearMeDialog.tsx","components/ad/OtherServices/SagaAirportTaxi/index.ts","components/ad/OtherServices/SagaAirportTaxi/Button.tsx","components/result/taxiCourse/TaxiReserversButton.tsx","services/mktaxi/util.ts","components/ad/OtherServices/MkTaxi/MkTaxiAgreementService.tsx","components/result/taxiCourse/UniversalMaaSMKTaxiButton.tsx","components/result/taxiCourse/TaxiReserversAllButtons.tsx","components/ad/OtherServices/MkTaxi/MkTaxiKyotoService.tsx","components/ad/common.tsx","services/ekispert/data/showJRHokkaidoNorthFreePassList.ts","services/ekispert/data/JRKyushuReserveLinkList.ts","services/jrkyushu/JRKyushuReserveLinkData.tsx","services/ekispert/data/showTokyoMetroFreePassList.tsx","services/linktivity/TokyoMetro.tsx","services/ekispert/models/UseTaxiCourse.ts","services/tokyolimousinebus/api.ts","utils/formatCourse.ts","services/universalMaas/api.ts","services/universalMaas/util.ts","utils/carRoute.ts","utils/placeInfoFactory.ts","services/ekispert/data/airportsStationCodeMap.ts","services/ekispert/planeTimetable.ts","utils/referrerParam.ts","services/ekispert/models.ts","services/jreEkinet/ekinetInfoLine.ts","services/jreEkinet/index.ts","sagas/index.ts","index.tsx"],"names":["module","exports","ConditionActionType","updateDirections","v","payload","type","UPDATE_DIRECTIONS","updateTaxiFareSummaries","UPDATE_TAXI_FARE_SUMMARIES","switchIsNoSetTerminalHND","updateCourse","updateSearchedAt","UPDATE_SEARCHED_AT","switchConsentAirportArrivalTime","switchAirportModalShow","getRouteType","start","params","ANA_GET_ROUTE_TYPE_START","succeed","result","ANA_GET_ROUTE_TYPE_SUCCEED","fail","error","ANA_GET_ROUTE_TYPE_FAIL","getFlight","ANA_GET_FLIGHT_START","ANA_GET_FLIGHT_SUCCEED","ANA_GET_FLIGHT_FAIL","getExtreme","EKISPERT_GET_EXTREME_START","EKISPERT_GET_EXTREME_SUCCEED","EKISPERT_GET_EXTREME_FAIL","getCondition","EKISPERT_GET_CONDITION_START","EKISPERT_GET_CONDITION_SUCCEED","EKISPERT_GET_CONDITION_FAIL","ModalStatus","ArrivalGateToStation","ArrivalGateToStationInt","BusGates","SatelliteGates","Lang","changeLang","lang","ja","en","BASE_MAX_DATE_OF_DOMESTIC","BASE_MIN_DATE_OF_DOMESTIC","BASE_MAX_DATE_OF_INTERNATINAL","BASE_MIN_DATE_OF_INTERNATINAL","DIFF_UTC_TO_JST_MINUTES","DateTime","dateStr","localDate","test","format","date","slice","time","minutes","Number","hour","Math","floor","isNaN","addDay","setTime","addDays","parse","Date","zonedTimeToUtc","scheduledTime","isDomestic","baseMaxDate","baseMinDate","now","diff","differenceInCalendarDays","min","getMinutes","setMinutes","addHours","ceil","isToday","hourSuffix","minSuffix","hhmm","depDate","isAfter","getTime","addMinutes","oneMonthAgoDiffDay","subMonths","getDate","ableReserveDay","setDate","getHours","diffDay","baseDate","targetDate","differenceInDays","a","subHours","b","busDepDate","isDepAirport","flightArrTime","isBefore","beforeDay","subDays","utcToZonedTime","formatString","option","tokyoDate","getJSTDate","e","diffJSTMinutes","getTimezoneOffset","subMinutes","userSetDate","JSTFormat","flightDate","rideDate","end","getTotalMinutes","str","hour_minutes","split","nowTotalMintes","depTime","diffDays","isAbleReserveDay","isDurationTime","limit","flightArrDate","Airlines","codeNumber","startNumber","endNumber","replace","CodeShareList","isTargetAirlineCodeShare","flightNumber","targetCodeShareAirline","getAirlineFrotmCodeShare","matchFlight","match","length","airlineLetterCode","marchAirline","Object","keys","AirlineLetterCodes","find","airline","includes","targetLetterCodes","x","airlineCode","ANA","JAL","IBX","SJO","APJ","ADO","JAC","AMX","SNJ","FDA","JJP","ASV","TWB","CAL","HKE","AirlineNameList","AirportMapPath","AnaUtil","code","terminal","HND_TERMINAL_1_KEY","HND_TERMINAL_2_KEY","FUK_TERMINAL_NORTH_KEY","FUK_TERMINAL_SOUTH_KEY","AirportMap","constructor","airportCode","airportName","this","getDomesticArrivalUrl","anchorPath","isHND","getKeyByTerminalInHaneda","FlightInfo","terminalCheck","path","anchor","DOMESTIC_EN_BASE_URL","DOMESTIC_JA_BASE_URL","isTeminal1InHaneda","HND_1_KEY","HND_2_KEY","INTERNATIONAL_JA_BASE_URL","INTERNATIONAL_EN_BASE_URL","ARRIVAL_KEY","SPECFIED_AIRPORTS_INT","Status","monthNames","flight","targetAirLine","hasData","etd","eta","atd","ata","userDate","depAirportCode","arrAirportCode","depAirportName","arrAirportName","bordingGate","securtyCheckPoint","depTerminal","arrTerminal","exit","errorMessage","useBusToBoard","useSatelliteBus","remarks","status","apiArrTerminal","isDifferentArrivalDate","airportMap","data","fsList","request","site","defaultTime","skdDepTime","skdDepMonth","skdDepDay","skdArrTime","skdArrMonth","skdArrDay","actDepTime","actDepMonth","actDepDay","actArrTime","actArrMonth","actArrDay","depAirport","arrAirport","getBordingGate","getSecurtyCheckPoint","getDepTerminal","getArrTerminal","getExit","message","checkBusToBoard","checkSatelliteGates","modifyRemarks","getStatus","Unknown","getAirportMap","dep","arr","updateByQuery","query","fromAirportCode","toAirportCode","toTerminal","fromTerminal","std","sta","updatePartialQuery","undefined","updateHNDTerminalBySFJ","airportList","HNDAirportCodeList","setConsiderationSFJTerminalHND","setIsDomestic","value","updateTimeTableLine","line","yyyymmmddStr","etdHHMMSSStr","DepartureState","Datetime","text","etaHHMMSSStr","ArrivalState","concat","operation","setIsDifferentArrivalDate","isSameDay","statusCheck","Error","checkList","thisInfo","obj","getHour","month","day","monthIndex","toUpperCase","parseInt","utcDate","getFullYear","getSecurityCheckInHaneda","securityName","securityCheckA","anotherAirportCode","HNDDepOrArrDate","isSFJ","isSpecialHNDIntTerminalBefore24Hours","isDepartureGuide","getFlightTimeDate","isHND2ndTerminalArr24Limit","getSpecialHNDIntTerminalNumber","targetFlightNumberList","depAirTerminal","exitName","getDeadLineTime","isAvalableOperationInfo","setHours","getBoardingTime","isBordingGate20min","getFlightTime","isInvalidDate","getFlightDepartureDate","getFlightArrivalDate","isDefaultAtd","isDefaultAta","getSearchTime","getArrivalGateToStation","getArrivalGateToStationInt","modifyAirportCode","statusCode","Normal","getStatusDomestic","getStatusInternational","Delay","Canceled","isDelay","isCanceled","setStatusToNormal","baseAirportCode","getTerminal","terminalName","getHNDTerminal","getNRTTerminal","specialHNDIntTerminalNumber","getFixTerminalCode","terminalCode","getAddTerminalAirportCode","hasPriorityAirportBus","terminalNo","toString","getIsAbleUse","PointType","initialState","point","pointCode","via","viaCode","hasVia","pointType","NONE","arrivalTimeToAirport","isEnabledShinkansen","isEnabledLimitedExpress","isEnabledIc","flightStatus","flightStatusForSeachAd","flightStatusUserSetDateForSearchAd","cityName","course","conditionDetail","referrer","isArrivalGuide","hasPriorityCar","hasPriorityCarWithBarrierFree","searchedAt","consentAirportArrivalTime","airportModalShow","modalStatus","carCourse","HIDE","initModal","tokyoLimousineBusModalShow","busTicketOitaModalShow","isNoSetTerminalHND","isAvalable","directions","courseIndex","pointGeoCode","lat","lng","okinawaBusStopList","isShowOkinawaBusLink","place","lastSelectedPlace","taxiFareSummaries","searchHistories","isShowUMModal","conditionReducer","state","action","_objectSpread","UPDATE_POINT_TYPE","UPDATE_FLIGHT_STATUS","UPDATE_FLIGHT_STATUS_FOR_SEARCH_AD","UPDATE_FLIGHT_STATUS_USER_SET_DATE_FOR_SEARCH_AD","UPDATE_ARRIVAL_TIME_TO_AIRPORT","UPDATE_CITY_BANE","UPDATE_QUERY","UPDATE_PLACE","UPDATE_LAST_SELECTED_PLACE","UPDATE_COURSE_INDEX","UPDATE_OKIBAWABUS_BUSSTOPLIST","UPDATE_SEARCH_HISTORIES","SWITCH_IC","SWITCH_PRIORITY_AIRPORT_BUS","SWITCH_PRIORITY_CAR","SWITCH_PRIORITY_CAR_WITH_BARRIER_FREE","UPDATE_MODAL_STATE","SWITCH_IS_AVALABLE","SWITCH_IS_SHOS_OKINAWA_BUS_LINK","UPDATE_TARGET_AIRLINE","SWITCH_IS_SHOWUMMODAL","PublicConditionActionType","OUTBOUND","RETURN_TRIP","RequestSearchType","SortType","initialOnewayState","depPoint","arrPoint","depPointCode","arrPointCode","depPointType","arrPointType","depPointGeoCode","arrPointGeoCode","getTomorrow","setSeconds","priorityCondition","depPlace","arrPlace","depPrefecture","arrPrefecture","depDirections","arrDirections","depLastSelectedPlace","arrLastSelectedPlace","searchType","DEPARTURE","isUnavailableService","isRound","outbound","returnTrip","sortInfo","faster","cheaper","easier","isMapDeparture","outboundDepPoint","outboundDepPointCode","outboundDepPointType","outboundDepPointGeoCode","outboundArrPoint","outboundArrPointCode","outboundArrPointType","outboundArrPointGeoCode","outboundDate","outboundArrivalTimeToAirport","outboundIsEnabledIc","outboundHasPriorityAirportBus","outboundHasPriorityCar","outboundHasPriorityBarrierFreeMode","outboundSearchType","returnTripDepPoint","returnTripDepPointCode","returnTripDepPointType","returnTripDepPointGeoCode","returnTripArrPoint","returnTripArrPointCode","returnTripArrPointType","returnTripArrPointGeoCode","returnTripDate","returnTripArrivalTimeToAirport","returnTripIsEnabledIc","returnTripHasPriorityAirportBus","returnTripHasPriorityCar","returnTripHasPriorityBarrierFreeMode","returnTripSearchType","selectedSortType","FASTER","aswLinkageInfo","dynamicPackageTicketingLinkList","nowSelectOutbound","unsettled","isLoadingASWInfo","isAcceptEstablishedRoute","requestFlightInfoQuery","isUniversalMaaSMode","isFlightReservedMode","searchRequestBody","searchExpiredDate","publicConditionReducer","SWITCH_IS_UNAVAILABLE_SERVICE","SWITCH_IS_LOADING_ASW_INFO","INITIAL_RETURN_TRIP","SWITCH_ROUND","UPDATE_OUTBOUND","UPDATE_RETURN_TRIP","SWITCH_MAP_DEPARTURE","UPDATE_SEARCH_EXPIRED_DATE","UPDATE_DEP_POINT","parentType","UPDATE_ARR_POINT","UPDATE_DEP_POINT_CODE","UPDATE_DEP_POINT_GEOCODE","UPDATE_ARR_POINT_GEOCODE","UPDATE_ARR_POINT_CODE","UPDATE_DEP_POINT_TYPE","UPDATE_ARR_POINT_TYPE","UPDATE_DEP_PLACE","UPDATE_ARR_PLACE","UPDATE_DEP_PREFECTURE","UPDATE_ARR_PREFECTURE","UPDATE_DATE","UPDATE_COURSE","UPDATE_SORT_INFO","UPDATE_SORT_TYPE","UPDATE_ASW_LINKAGE_INFO","UPDATE_DYNAMIC_PACKAGE_TICKETING_LINK_LIST","SWITCH_NOW_SELECT_OUTBOUND","UPDATE_DEP_DIRECTIONS","UPDATE_ARR_DIRECTIONS","SWITCH_HAS_PRIORITY_AIRPORT_BUS","updateOutboundPriorityBusCondition","updateReturnTripPriorityBusCondition","SWITCH_HAS_PRIORITY_CAR","updateOutboundPriorityCarCondition","updateReturnTripPriorityCarCondition","UPDATE_DEP_LAST_SELECTED_PLACE","UPDATE_ARR_LAST_SELECTED_PLACE","UPDATE_SEARCH_TYPE","UPDATE_UNSETTLED_OUTBOUND_DATE","UPDATE_UNSETTLED_RETURN_TRIP_DATE","SWITCH_IS_ACCEPT_ESTABLISHED_ROUTE","UPDATE_REQUEST_FLIGHT_INFO_QUERY","SWITCH_IS_UNIVERSAL_MAAS_MODE","SWITCH_IS_FLIGHT_RESERVED_MODE","UPDATE_UNIVERSALMAAS_COURSE","universalMaaSCourse","UPDATE_SEARCH_REQUEST_BODY","GeneralActionType","switchIsFailInGetCourses","SWITCH_IS_FAIL_IN_GET_COURSES","switchisLoading","SWITCH_IS_LOADING","updateErrorMessage","UPDATE_ERROR_MESSAGE","updateTraininfo","UPDATE_TRAININFO","updateTaxiCompanyConfigurations","UPDATE_TAXI_COMPANY_CONFIGURATIONS","randomTmpAdRoatationValue","random","pow","RANDOM_TMP_AD_ROATATION_VALUE","switchUseV2","SWITCH_USE_V2","genetalInitial","isFailInGetCourses","isShowMap","candidateSelectorIsVia","isShowCandidateListModal","isFromMapToCandidateListModal","isInitial","isLoading","axiosError","traininfoList","isFailInAssignDia","isBackendCrowded","search","getFlightInfo","searchDiaList","tmp","placeInfo","pointName","isUpdateInMapSelector","updateCheck","isShowPublicSummary","applyConvertingToMultipleAirport","publicInterruptTransferStations","isResearch","isOutbound","debugErrorMessage","adRotationRand","universalMaaSQuery","mode","isShowBarrierFreeInfo","isBarrierFreeMode","interruptTransfer","interruptTransferStations","interruptTransferStationsInUndecided","useV2","generalReducer","newInterruptTransfer","SWITCH_SHOW_MAP","SWITCH_CANDIDATE_SELECTOR_IS_VIA","SWITCH_SHOW_CANDIDATE_LIST_MODAL","SWITCH_IS_FROM_MAP_TO_CANDIDATE_LIST_MODAL","SWITCH_IS_INITIAL","SWITCH_IS_FAIL_ASSIGN_DIA","SWITCH_IS_BACKEND_CROWDED_SEARCH","SWITCH_IS_BACKEND_CROWDED_GET_FLIGHT_INFO","SWITCH_IS_BACKEND_CROWDED_SEARCH_DIA_LIST","UPDATE_REFERRER","UPDATE_AXIOS_ERROR","UPDATE_PUBLIC_LANG","UPDATE_TMP_VALUES","UPDATE_UNIVERSAL_MAAS_QUERY","UPDATE_TMP_IS_UPDATE_IN_MAP_SELECTOR","taxiCompanyConfigurations","UPDATE_TAXI_STAND_INFO","taxiStandInfo","SWITCH_MODE","newMode","modeType","UPDATE_INTERRUPT_TRANSFER_STATIONS","UPDATE_INTERRUPT_TRANSFER_STATIONS_IN_UNDECIDED","rootReducer","history","combineReducers","general","condition","publicCondition","router","connectRouter","createBrowserHistory","sagaMiddleware","createSagaMiddleware","ScrollToTop","pathname","useLocation","useEffect","window","scrollTo","Environment","env","PRODUCTION","STAGING","DEV","CHECK_AIRPORT_GROUP","BACKEND_DEV","process","isProduction","isStaging","isLikeProdEnv","toLowerCase","DEFAULT_API_CONFIG","baseURL","timeout","async","getReservation","config","axios","defaults","headers","post","instance","create","setTaxiEndpoint","err","getEnvironmentType","ComponentKey","getTaxiCompanyConfiguration","response","get","reseponseBody","body","useStyles","makeStyles","theme","createStyles","paper","position","width","backgroundColor","palette","background","boxShadow","shadows","padding","spacing","left","top","transform","LoadingModal","props","classes","React","createElement","Modal","open","disableAutoFocus","disableEnforceFocus","className","Grid","container","justify","alignContent","item","CircularProgress","color","size","isFullWidthKana","RegExp","isNumber","isEmail","isLetter","scClick","name","SCClick","console","log","cookieKey","Cookies","set","submitReservation","setPath","root","textAlign","border","borderRadius","marginTop","Cost","Typography","component","label","notice","AlertInReservation","t","useTranslation","severity","setSeverity","pickupPattern","setMessage","Alert","anyMessage","map","index","key","defaultReservationLabels","fareLabel","distanceLabel","durationLabel","alertLabel","defaultReservationFare","fareType","priceType","notesLabel","height","fontSize","SelectChildrenNum","numbers","Array","from","Select","SelectDisplayProps","style","onChange","n","MenuItem","SelectAdultNum","_","i","SelectCarNum","SelectOtherBag","maxOtherBag","SelectSuitcase","maxNum","SelectGolfBag","useSelector","TaxiCompanyList","convertStringToTaxiCompany","companyString","limoTaxi","eastern","miyakou","ubeSanden","nahahire","hinomaru","nangoku","iyotetsutaxi","iyotetsuTaxi2","gotaku","Asahikawachuuo","hakodateTaxi","daiwaj","kitafukushima","fukushimachuo","iwakiTaxi","tajimaTaxi","kinugawaTaxi","hokutocab","yotoTaxi","kingTaxi","toden","ishikawakotsu","dummyVal","tsuzutaxi","kingTaxi2","ubeKounai","sakataNo1Taxi","shokoHire","airport_liner","nikaho_go","GetDirectionAndFareOperation","FlightType","AMCCautionJP","useTheme","useCautionStyles","Fragment","bold","unorderedList","data-cy","companyDisplayName","company","Link","href","target","link","AMCCautionEN","AMCCaution","i18n","language","CautionsEn","redFont","isSupportAMC","isReservationPage","isMeterFare","CautionsJP","isFukushima","isFukushimaTaxi","tachiyoriMessage","primary","main","paddingInlineStart","textDecoration","fontWeight","come","marginLeft","comeBody","marginRight","springMileMain","springMileLeftMargin","Cautions","CautionsEN","Contact","contact","messages","idx","isEmailStr","isLinkMailAddress","isJapanese","JAPANESE","isEnglish","ENGLISH","changeLanguage","searchParams","getStringParam","easternLogo","margin","maxHeight","ubeSandenLogo","maxWidth","nahahireLogo","miyakohLogo","marginBottom","nangokuLogo","iyotetsutaxiLogo","wideShortTaxiLogo","kinugawaTaxiLogo","ShowTaxiComapnyLogo","taxiCompanyConfiguration","EasternLogo","EasternLogoJP","EasternLogoEN","Logos","MiyakoTaxiLogo","SandenLogo","NahaHireLogo","HinomaruHireLogo","NangokuTaxiLogo","IyotetsuLogo","GotakuLogo","HakodateTaxiLogo","AsahikawachuuoLogo","DaiwaTaxiLogo","KitaFukushimaTaxiLogo","FukushimaChuoTaxiLogo","IwakiTaxiLogo","UchigoTaxiLogo","TajimaTaxiLogo","KinugawaTaxiLogo","hokutocabLogo","YokoTaxiLogo","KingTaxiLogo","TodenTaxiLogo","IshikawaKotsuLogo","UbeKounaiLogo","TsuzuTaxiLogo","SakataNo1TaxiLogo","ShokoHireLogo","KisakataLogo","DummyTaxiLogo","classNames","src","alt","logo","cyName","Coordinates","TOKYO_STATION","PickupPattern","TO_AIRPORT","FROM_AIRPORT","ROUND_TRIP","RECAPTCHA_KEY","submitTemporaryReservation","convertEWSToLocation","baseGeoPoint","lati_d","longi_d","gcs","convertLocationToStr","Candidate","geoPoint","prefecture","description","Station","Name","Type","GeoPoint","Prefecture","getTypeLabel","HISTORY","StringUtils","join","Place","city","address","category","formattedAddress","prefectureKey","administrativeAreaLv2Key","cityKey1","cityKey2","premiseKey","postalCode","country","fillwidthMinus","getFullAddress","getAddressToMunicipality","setFromAddressComponents","addressComponent","cityList","reverse","forEach","c","types","longName","long_name","push","indexOf","filter","sort","reduce","setAddress","addressComponents","sublocalityElements","sublocalityKeys","targetComponent","s","StringUtil","isHouseNumber","endsWithNumbers","getCoordinate","toLog","getLocation","fixCity","matchResult","geometry","location","formatted_address","address_components","setPlaceName","sessionStorageKeys","latlng","formatAddress","baseAddress","matchList","isArray","getClosedPlaceDetail","place_id","optionConfig","fields","error_message","JSON","stringify","getClosedGeocode","results","require","toLuxonDateTime","iso8601","fromISO","zone","setZone","toLuxonDateTimeFromUnixTime","unixtime","fromSeconds","getNowLuxonDateTime","second","millisecond","parseFromyyyyMMddHHmm","fromFormat","setBaseDay","minute","URLParams","URLSearchParams","getParam","getNumberParam","getBooleanParam","getDateParam","getDateFromUnixTimeMilisecondsParam","checkParams","k","param","getFloatParam","defaultDate","getLuxonDateTimeUnixTimeMilisecondsParam","hasParam","has","convertLetter","_params$pointInfo","_params$pointInfo2","_params$pointInfo3","_params$pointInfo4","pointInfo","latLng","latLngForPriceCalc","labelForPriceCalc","TaxiTimePattern","CommonTaxiUtils","limit_days","limit_hours","targetAirport","getErrorMessage","originErrorMessage","isLimoTaxiTYO","isLimoTaxi","isTYO","isAvalableEastern","ridingDate","rideingDateBase","nowDateBase","limitDays","days","deadlineDate","minus","getAvailableDate","plus","AirportTransferTaxiMapMode","REFERRER_TYPE","getSCCkickType","taxiCompany","airportAccess","chatan","asw","fukushima","UNSELECTED_RIDING_DATE_STRING","useForm","useHistory","dispatch","useDispatch","_useTranslation","useRecaptchaV2","hours","_React$useState","useState","_React$useState2","_slicedToArray","setAirportCode","_React$useState3","_React$useState4","center","setCenter","_React$useState5","_React$useState6","markerPoint","setMarkerPoint","_React$useState7","_React$useState8","setPointName","_React$useState9","_React$useState10","placeJP","setPlaceJP","_React$useState11","_React$useState12","setFlight","_React$useState13","_React$useState14","setFlightDate","_React$useState15","_React$useState16","setRidingDate","_React$useState17","_React$useState18","selectFlightData","setSelectFlightData","_React$useState19","_React$useState20","isSubmitted","setSubmitted","_React$useState21","_React$useState22","isEmptyAddress","setEmptyAddress","_React$useState23","_React$useState24","email","setEmail","_React$useState25","_React$useState26","isEmptyEmail","setEmptyEmail","_React$useState27","_React$useState28","isInvalidEmail","setInvalidEmail","_React$useState29","_React$useState30","isUnavalableEmail","setUnavalableEmail","_React$useState31","_React$useState32","isEmptyFlight","setEmptyFlight","_React$useState33","_React$useState34","isInvalidFlight","setInvalidFlight","_React$useState35","_React$useState36","isRequiredRetry","setRequiredRetry","_React$useState37","_React$useState38","isFailed","setFailed","_React$useState39","_React$useState40","isOverDeadline","setOverdeadline","_React$useState41","_React$useState42","invalidFlightErrorMessage","setInvalidFlightErrorMessage","_React$useState43","_React$useState44","invalidFlightDateErrorMessage","setInvalidFlightDateErrorMessage","_React$useState45","_React$useState46","needRetryRecaptcha","switchNeedRetryRecaptcha","_React$useState47","_React$useState48","disallowSupportDirection","switchDisallowSupportDirection","_React$useState49","_React$useState50","invalidFlightPattern","switchInvalidFlightPattern","_React$useState51","_React$useState52","toAirport","setToAirport","_React$useState53","_React$useState54","setPickupPattern","_React$useState55","_React$useState56","municipality","setMunicipality","_React$useState57","_React$useState58","setPlace","_React$useState59","_React$useState60","isSubjectArea","switchSubjectArea","_React$useState61","_React$useState62","setDistance","_React$useState63","_React$useState64","distanceText","setDistanceText","_React$useState65","_React$useState66","setDuration","_React$useState67","_React$useState68","durationText","setDurationText","_React$useState69","_React$useState70","fee","setFee","_React$useState71","_React$useState72","totalFee","setTotalFee","_React$useState73","_React$useState74","feeLabel","setFeeLabel","_React$useState75","_React$useState76","setNotesLabel","_React$useState77","_React$useState78","setAlertLabel","_React$useState79","_React$useState80","setTaxiCompany","_React$useState81","_React$useState82","requestCount","setRequestCount","_React$useState83","_React$useState84","isEdited","switchEdited","_React$useState85","_React$useState86","isEndInit","switchIsEndInit","_React$useState87","_React$useState88","setParams","_React$useState89","_React$useState90","selectPointNumber","setSelectPointNumber","_React$useState91","_React$useState92","pointList","setPointList","_React$useState93","_React$useState94","isEndCallTaxiAPI","switchIsEndCallTaxiAPI","_React$useState95","_React$useState96","isFailCallTaxiAPI","switchIsFailCallTaxiAPI","_React$useState97","_React$useState98","taxiCompanyConf","setTaxiCompanyConf","_React$useState99","_React$useState100","targetAirportCodeList","setTargetAirportCodeList","_React$useState101","_React$useState102","setMode","_React$useState103","_React$useState104","setFareType","_React$useState105","_React$useState106","isAvailableReservation","switchIsAvailableReservation","_React$useState107","_React$useState108","setLang","_React$useState109","_React$useState110","defaultPointlabel","setDefaultPointLabel","_React$useState111","normal","_React$useState112","timePattern","setTimePattern","_React$useState113","_React$useState114","selectTimeList","setSelectTimeList","_React$useState115","_React$useState116","isUnselectedRidingDate","switchIsUnselectedRidingDate","_React$useState117","_React$useState118","isUnselectedFlightHour","switchIsUnselectedFlightHour","_React$useState119","_React$useState120","isUnselectedFlightMinutes","switchIsUnselectedFlightMinutes","_React$useState121","_React$useState122","isUnselectedFlightDate","switchIsUnselectedFlightDate","_React$useState123","_React$useState124","setReferrer","_React$useState125","_React$useState126","isInitGetFareInfo","switchIsInitGetFareInfo","_React$useState127","_React$useState128","flightPattern","setFlightPattern","isKisakataTaxi","_React$useState129","_React$useState130","weekdayPointList","setWeekdayPointList","_React$useState131","_React$useState132","holidayPointList","setHolidayPointList","_React$useState133","_React$useState134","dayOfWeek","setDayOfWeek","setPointListByParams","companyCode","componentKey","pulldown","id","then","res","matchPointList","select","onChangedFlightDateCommon","isUnselected","luxonSetObject","year","onChangedFlightDate","points","checkRideDate","taxiConf","taxiUtils","limitHours","isAvalableDate","setErrorMessage","validate","emptyAddress","emptyEmail","emptyFlight","invalidEmail","invalidFlight","isValidFLight","invalidFlightDate","invalidRidingDate","supportDirection","checkJPNArea","isToAirport","getDirectionAndFare","defaultCenter","newCenter","municipalityByAirport","useCallback","useRideDate","googleAPIDepDate","airportLetter","pickup","dropOff","rideDatetime","toFormat","flightType","domestic","international","gate","modeValue","isHolidayDate","isHoliday","newDayOfWeek","usePointList","_pointList$Number","selectedPointId","newListIndex","findIndex","String","newflightPattern","defaultFlightPattern","paramsPointAddress","pointAddress","paramsPointJPAddress","pointJPAddress","setPointLabel","setPointJPLabel","getDirectionAndFareAPI","totalValue","distance","duration","newSelectTimeList","flat","jsDate","toJSDate","isPublicHoliday","holiday","isWeekend","weekday","getTaxiCompanyConf","getParams","getQueryParams","hasRideDate","hasFlightDate","isDeparture","pointLat","pointLng","dryRun","pointJPName","supportAirports","defaultAirportCode","getTaxiCompany","supportAirportCodeList","companyConf","defaulPickupPattern","setDefaultPointName","places","setMunicipalityFromPosition","fetchPointList","weekdayList","holidayList","currentList","setNikahoPointListByParams","flightpattern","finally","onChangedAirport","onChangedEmail","onChangedFlight","onChangedRidingYear","modifiedDate","onChangedRidingMonth","onChangedRidingDay","onChangedRidingHour","onChangedRidingMinutes","onChangedRidingHourAndMinutes","onSubmit","tokenV2","clickName","scClicks","temporaryReservation","clickType","mailAddressCookieName","sendParams","token","sendPoints","selectPointObject","setFlightInfo","number","datetime","jpAddress","jpPlaceName","mailaddress","taxiConnectFlightNumber","count","vr","getSendParams","recaptcha","load","execute","getRecaptchaToken","validatedResult","overwirteBookingUrl","modifyParams","_response$data","successParams","errorCode","catch","onChangedRidingFlight","selectedFlight","forms","notes","tableLeft","tableRight","tableFlex","display","alignItems","formControl","flexDirection","wordBreak","timeSelect","mailForm","mailText","disableMaileTaxt","button","itemName","validationAlert","costNotice","imgContainer","YellowButton","withStyles","Button","AirportTransferTaxi","_reservation$flight","_props$taxiCompanyCon2","_props$taxiCompanyCon3","_reservation$transfer","_reservation$transfer2","_props$taxiCompanyCon4","isMobileSize","useMediaQuery","breakpoints","down","PDF_HOST","_useForm","setIsFailed","setIsRequiredRetry","setIsUnavalableEmail","isInvalidInput","setIsInvalidInput","lastName","setLastName","firstName","setFirstName","lastNameKana","setLastNameKana","firstNameKana","setFirstNameKana","placard","setPlacard","carType","setCarType","adultNum","setAdultNum","childNum","setChildNum","carNum","setCarNum","phoneNumber","setPhoneNumber","suitcase","setSuitcase","maxSuitcase","setmaxSuitcase","maxSuitcasePerUnit","setMaxSuitcasePerUnit","golfBag","setGolfBag","maxGolfBag","setMaxGolfBag","maxGolfBagPerUnit","setMaxGolfBagPerUnit","otherBag","setOtherBag","payment","setPayment","receiptAddress","setReceiptAddress","setRemarks","reservationFare","setReservationFare","reservationLabels","setReservationLabels","defaultOperatorMailaddress","operatorMailaddress","setOperatorMailaddress","mailUndeliveredProblemReproduction","setMailUndeliveredProblemReproduction","acmMileageNumber","setAcmMileageNumber","isSubmitting","switchSubmitting","onChangeAdultNum","onChangeChildNum","onChangeCarNum","onChangeSuitcase","onChangedGolfBag","onChangeOtherBag","_useState","_useState2","isInvalidLastName","setIsInvalidLastName","_useState3","_useState4","isInvalidFirstName","setIsInvalidFirstName","_useState5","_useState6","isInvalidLastNameKana","setIsInvalidLastNameKana","_useState7","_useState8","isInvalidFirstNameKana","setIsInvalidFirstNameKana","_useState9","_useState10","isInvalidPhoneNumber","setIsInvalidPhoneNumber","_useState11","_useState12","isInvalidOperatorMailaddress","setIsInvalidOperatorMailaddress","_useState13","_useState14","isInvalidACMNumber","setIsInvalidACMNumber","_useState15","_useState16","isEmptyLastName","setIsEmptyLastName","_useState17","_useState18","isEmptyFirstName","setIsEmptyFirstName","_useState19","_useState20","isEmptyLastNameKana","setIsEmptyLastNameKana","_useState21","_useState22","isEmptyFirstNameKana","setIsEmptyFirstNameKana","_useState23","_useState24","isEmptyPhoneNumber","setIsEmptyPhoneNumber","_useState25","_useState26","isTooLongPlacard","setIsTooLongPlacard","_useState27","_useState28","isTooLongRemarks","setInTooLongRemarks","reservation","isShowNotesByDifferenceOfTariffs","_props$reservation","_props$reservation$tr","tariffs","transferInfo","fares","_tariffs$x$fare","fare","Set","setGoogleMapURL","airportNoteLabel","_props$taxiCompanyCon","_props$reservation2","ui","suitcaseObj","bags","maxQuantity","golfBagObj","paymentChange","setFareAndLabelsByCarType","_props$reservation3","_transferInfo$tariffs","_transferInfo$tariffs2","labels","isLangJa","resultIsEmptyLastName","resultIsEmptyFirstName","resultIsEmptyLastNameKana","resultIsEmptyFirstNameKana","resultIsEmptyPhoneNumber","resultIsEmptyACMNumber","resultIsInvalidLastName","resultIsInvalidFirstName","resultIsInvalidLastNameKana","resultIsInvalidFirstNameKana","resultIsInvalidPhoneNumber","resultIsInvalidACMNumber","isACMNumber","resultIsTooLongPlacard","resultIsTooLongRemarks","resultIsInvalidOperatorMailaddress","amc","noSendMails","getFlightTimeLabel","isDisplayAMCInputTable","_props$reservation5","supportAMC","airportInfo","letter","supportAMCPeriod","supportPeriod","_ui$carTypes","_ui$carTypes$","_props$reservation6","defaltCarType","carTypes","_ui$paymentMethod","_ui$paymentMethod$","defaultPayMethod","paymentMethod","tariffConfirmed","tariffTypes","isShonaiAreaTaxi","isYamaguchiTaxi","isMileCampaignPhase1Taxi","isMileCampaignPhase2Taxi","Container","xs","originLatLng","originLabel","destLabel","destLatLng","showDateFormat","FormControl","variant","TextField","lastNameChange","inputProps","FormHelperTextProps","firstNameChange","onChangedLastNameKana","onChangedFirstNameKana","supportPlacardName","onChangedPlacard","fullWidth","getHelperTextPlacard","disabled","phoneNumberChange","isDisplayCarModel","RadioGroup","aria-label","getCarType","FormControlLabel","control","Radio","onClick","isDisplayNumberOfCars","bag","SetSelectArea","pay","isRideDateInMileCampaignPeriod","startDate","endDate","receiptAddressChange","remarksChange","multiline","rows","getHelperTextRemarks","isDev","onChangedOperatorMailaddress","helperText","direction","PriceLabel","NotesLabel","noteLabel","alert","endIcon","ArrowForwardIosIcon","sendOperatorMailaddress","sendMailUndeliveredProblemReproduction","passengers","adult","child","numOfCars","other","useTestAddress","_props$reservation4","temporaryDisplayName","isTabiCube","flexGrow","TabiCube","LogoJp","LogoEn","Divider","TaxiAndHireHeader","TaxiLogo","TaxiLogoJP","TaxiLogoEN","AppBar","Toolbar","AirportTransferTaxiHeader","tabiCube","ExternalLink","url","LaunchIcon","verticalAlign","ExternalTransmissionDiscipline","PrivacyPolicy","Terms","subtitle","annotation","JP","gutterBottom","EN","ServiceBody","TabIndexList","isKeyDownEnter","method","keyCode","appBar","minHeight","appBarSmall","title","flex","createMuiTheme","overrides","MuiAppBar","colorPrimary","MuiToolbar","regular","ModalHeader","titleLabel","isSmall","ThemeProvider","handleClose","IconButton","edge","CloseIcon","Transition","forwardRef","ref","Slide","assign","ServiceDialog","openDialog","setOpenDialog","handleOpen","tabIndex","SERVICE_ABOUT_DIALOG","onKeyDown","Dialog","fullScreen","onClose","TransitionComponent","scroll","List","ListItem","children","ServiceOverview","root_search","bottom","root_result","powered_by_text","TabiCubeFooter","setClass","right","TermsBodyJP","rel","TermsBodyEN","TermsBody","TermsDialog","TERMS_DIALOG","Gcs","APIPath","Ekispert","lineName","lineType","lineNumber","fromCharCode","charCodeAt","distanceNumber","escapeString","input","getEkispertAPIFactory","conditions","Extreme","ResultSet","Course","PassStation","Point","Condition","GeoStation","AddressStation","TrainInfo","LightStation","getDataVersion","getClosedStationDetail","getPlaneTimeTbile","railName","yyyymmdd","ServiceAboutBody","copyRights","setCopyRights","init","setInit","getCopyRights","Copyrights","ServiceAboutBodyJP","ServiceAboutBodyEN","TaxiServiceAboutBody","JPBody","EnBody","ServiceAboutDialog","pathName","isTaxi","PublicServiceAboutBody","PublicServiceAboutDialog","Footer","page","isPublic","AirportTransferTaxiFooter","Booking","_useTemporaryReservat","getCode","getToken","getLang","isLoadingReservation","switchLoadingReservation","hasReservation","setHasReservation","tmpReservation","setTmpReservation","getTemporaryReservation","useTemporaryReservation","targetTaxiComf","Helmet","Redirect","to","redirectOrigin","connect","appState","content","footer","notFoundHeader","notFoundMessage","NotFound","switchIsInitial","Box","anaTheme","secondary","dark","borderBottom","MuiButton","MuiInput","opacity","underline","MuiInputLabel","MuiOutlinedInput","notchedOutline","MuiPaper","elevation4","MuiSelect","icon","universalMaaS","typography","fontFamily","Path","ROOT","SEARCH","SUMMARY","RESULT","PUBLC_ROOT","PUBLC_SEARCH","PUBLC_SUMMARY","PUBLC_RESULT","isSearch","isSummary","isResult","PUBLIC_FLIGHTLIST","AswSearch","Icon","Search","replaceWordList","base","ignoreWordList","getClosedFixAutocomplete","replaced","replceInput","word","replaceInput","components","predictions","p","structured_formatting","main_text","getClosedAutocomplete","departureIcon","publicDepartureIcon","destinationIcon","publicDestinationIcon","textField","zIndex","inputText","pointNameText","whiteSpace","descriptionText","paddingLeft","overflow","textOverflow","SearchBox","candidates","setCandidates","isDisplayCandidates","switchDisplayCandidates","onChangeTextBox","SELECT_ON_MAP","getCandidates","initCandidates","currentPosition","CURRENT_POSITION","stations","getClosedStationLight","sortByType","sortedStations","stationsByType","Autocomplete","getOptionLabel","filterOptions","placeId","placeDetail","coordinates","placeJPDetail","station","parseFloat","navigator","geolocation","getCurrentPosition","coords","latitude","longitude","coordinate","placesJP","updateValue","options","autoComplete","disableOpenOnFocus","includeInputInList","freeSolo","debug","groupBy","renderOption","renderInput","InputProps","endAdornment","InputLabelProps","borderLeft","borderRight","Map","isLoaded","_useJsApiLoader","useJsApiLoader","googleMapsApiKey","loadError","useGoogleMaps","mapRef","getGeoDetail","GoogleMap","onCenterChanged","_mapRef$state$map","centerOnMap","getCenter","onDragEnd","_mapRef$state$map2","selectedPlace","selectedJPPlace","onClicked","mapContainerStyle","zoom","fullscreenControl","mapTypeControl","streetViewControl","zoomControlOptions","Marker","AirportNameMap","SelectAirport","native","airpotCode","airportLabel","SelectFlightHour","_props$value","defaultValue","h","padStart","setValue","SelectFlightMinutes","m","SelectHour","SelectMinutes","SelectDay","lastDay","daysInMonth","d","SelectMonth","months","SelectYear","years","unshift","y","ButtonToSubmit","SelectHourAndMinutesPulldown","currentValue","SelectFlight","pattern","contents","supplement","textItemName","textItemAnnotation","seaGaiaSelect","taxiUnderLogoNoticeArea","redZone","flightBefore","paddingRight","paddingTop","paddingBottom","springMileP","springMilePBold","shounaiCampaignArea","hasErrorInEmail","hasErrorInFlight","isShowTaxiFeeArea","recaptchaUrl","isShokouSakataWithCampaign","defer","displayName","md","getFlightHelperLabel","placeholder","getEmailHelperLabel","Checkbox","checked","event","handleClick","wrapper","document","widgetId","grecaptcha","render","sitekey","callback","appendChild","guide","iconInfo","logoArea","Success","AutomaticDeliveryNotice","InfoIcon","checkBoxIcon","mainText","textWithDescription","EmailCheckList","headline","CheckBoxIcon","headlineWithDescription","Unreceived","hasNotTime","LinkToTabicube","isSoratabi","modifySoratabiParams","isHiroshimaAirport","added","add1am","modifyHiroshimaParams","tabiCubeUrl","getTabicubeProductionUrl","getTabicubeStagingUrl","getTabicubeUrl","App","ConnectedRouter","Switch","Route","exact","BookingContainer","BookingTaxi","SuccessBookingTaxi","Boolean","hostname","resources","translation","ad","airdo","otherAirlines","taxi","use","initReactI18next","ns","defaultNS","fallbackLng","interpolation","escapeValue","react","wait","defaultFlightOptions","isIncrementalSearch","getAirlineCode","getFlightFactory","domDate","intDate","flightForCheckIsInternational","flightInfo","intFlight","getDatalakeFactory","datalakeData","isCacheClear","pathList","isUpperStaging","getDatalakeAllowBusListFactory","ExitToStations","AirportsAndStations","image","cursor","imageWithBorder","bannerSetMaxWidth","alignSelf","banner","topArea","prFont","textTransform","gridItemLeft","gridItemRight","typeText","priceNotice","typeArea","mileAreaStyle","mileAreaBottomStyle","linkStyle","modal","justifyContent","closeButton","customButtonArea","inline","topImage","logoImage","textBody","up","ul1st","ul2nd","listStyleType","ulNotice","reservationArea","triipleMileCampaignArea","textLine","reservationNotice","reservationButton","reservationButtonPTag","reservationTitle","noticeArea","noticePTag","noticePTagRed","noticePTagBold","reservationButtonLine","bigFont","redBold","arrowForwardIosIcon","bonusMileCampaign","NearMeServiceBody","TargetLocalityList","targetLocalityList","NearMeAirport","NearMeLogic","airport","FareTable","isTest","noLoginURL","domid","seUrl","companyid","host","mileLogingHostList","prod","utm_source","utm_medium","utm_campaign","allParams","baseURLList","HND","NRT","OKA","FUK","ITM","KIX","CTS","NGO","AOJ","TKS","KKJ","getAirportFromFlightinfo","isDisplayArea","locality","targetList","prefectureList","TargetPrefecture","hopeAirportDate","targetAirline","getMonth","getAirlineThreeLetterCode","HNDterminal","getNoLoginURL","airportParamsList","getHeaderMessage","targetKu","getFare","contained","outlined","iconSizeMedium","NearMeDialog","SagaAirportTaxi","isBeforeDeadline","isReservable","isTargetPeriod","isTargetAddress","isWithinSagaSouthArea","previousDay","modifiedHour","deadline","getReservableDeadline","southAreaPolygon","polygon","sagaSouthAreaPolygon","features","booleanPointInPolygon","adress","MUNICIPALITIES","some","textInlineBlock","summary","alink","MKTaxiClass","_class","ANAMileageClubURL","HireURL","landmarkAirportList","getHost","getANAMileageClubHost","SerenaLimit","DepthLimit","WidthLimit","HeightLimit","PassengerLimit","WeightLimit","AlphardLimit","getHirePrice","isHireCar","isBanner","MKTaxiANAMileageClubURL","mkTaxiURL","useUrl","getMkTaxiUrl","isHire","other3","landmark","departureTime","flightTime","agent","dpdate","flno","fldate","uaccess","generateMkTaxiParamsToURL","generateMkTaxiUMParamsToURL","landmarkToAirportCode","getIsOverCarLoading","umQuery","carLimit","um2","ds6","ds7","ds8","ds9","ds10","ds11","toCm","unit","depth","weight","toKg","getOther3ByBinary","ds1","ds3","um1","um3","other3Part0","other3Part1","isTargetUser","ds1List","ds4","binary1","binary2","binary3","binary4","isOverAlphard","isOverSerena","other3Part2","switchTextUmQuery","umQueryText","ds1TextList","isAllBlank","ds1Text","every","toText","val","case1","case2","text1","text2","overflowY","subContainer","list","listStyle","quesText","textDecorationColor","bar","wheelChairLogoSmall","wheelChairLogoMiddle","wheelChairLogoLarge","section","buttonSagaAirportTaxi","isDisplayJRHokkaidoNorthFreePass","arrivalDate","ShowJRHookaidoNorthFreePass","showLineList","outOfFreePassStationList","arrStationList","JRKyushuLineList","JRKyushuTrainList","JRKyushuStationList","JRKyushuReserveLinkData","isMobile","daType","rsCode","rsType","sectionParams","paramsTable","setShowReserveLinkFlag","JRKyushuStationArray","OperationLinePattern","isShowLink","beforeRouteLineIndex","sectionDepTime","routeLine","Line","routeLineIndex","isShowSection","depStationCode","arrStationCode","isAbleToReserveJR","isShowJRKyushuLink","isTommorowTrain","generateReserveParams","getInitParams","_course$Price$find","Price","kind","chargeIndex","selected","Oneway","isFareSection","paramIdx","stationList","depStation","pushStation","arrStation","pushTrain","splitDepViaArrStation","depStationName","arrStationName","viaStationName","setAll","isAbleToReserveSection","lineIndex","paramIndex","isShow","device","dev","pc","sp","trainList","outParams","dsName","asName","trYearMonth","trDay","trHour","trMinute","tsn","trn","getURL","setFullYear","setMonth","getURLByLineIndex","stationCode","stationName","train","matchTrain","tokyoMetroLineList","keikyuLineList","excludedKeikyuStationList","isShowTokyoMetroFreePass","arrDate","isAirportSiteTransit","UseTaxiCourse","routeInfo","dataType","SerializeData","charges","isLeastTransferCount","isFast","isLowPrice","sumPrice","hasAirportBus","hasByHighwaySection","isShowTokyoMetroBanner","displayIndex","isRealTime","AswInfo","isJP","route","routes","legs","distanceValue","duration_in_traffic","durationValue","durationMinutes","round","planeTime","airportLocation","targetLocation","airportTime","pointTime","end_location","start_location","taxiLine","stopStationCount","timeOnBoard","track","exhaustCO2","exhaustCO2atPassengerCar","dateToState","Destination","TimeReliability","Color","fareIndex","walkLine","targetPoint","Yomi","longi","lati","airportEntrancePoint","securityCheckpointName","securityCheckPoint","timeOther","timeWalk","transferCount","allTime","userSetTime","max","no","toISOString","getLimousineBusDataFactory","limousineBusData","setIsFast","courses","minTime","courseTime","MAX_VALUE","setIsLowPrice","minPrice","_prices$find","_prices$find2","prices","price","setSumPrice","setIsLeastTransferCount","leastTransferCount","leastTransferCountCourseIndexes","getUniversalMaasWalkURL","is_client_map","isUniversalMaaSServiceIn2023","walkPointList","reseponse","filterNullWalkPointRequest","checkWalkPointRequestParams","isCoordinate","generateUniversalMaaSWalkLinkRequestFromat","course_index","lines","line_index","_depPoint$GeoPoint","_depPoint$GeoPoint2","_arrPoint$GeoPoint","_arrPoint$GeoPoint2","isUseDepPlace","isUseArrPlace","depGeoCode","arrGeoCode","start_lat","start_lon","goal_lat","goal_lon","section_index","setUniversalMaaSWalkLinkFromWalkPointResponse","walkPointResponse","walkPoint","_courses$walkPoint$co","_courses$walkPoint$co2","targetLine","universalMaaSWalk","setUniversalMaaSWalkLinkFactory","args","saveDirection","ARRIVAL_MIN_TIME","PEACH_CODE_SHARE_ARRIVAL_MIN_TIME","SPRING_ARRIVAL_MIN_TIME","arrivalTime","airportTimeUnixTime","taxiAPIParams","datetimeAtAirport","needPolyline","setTerminal","setGate","getDirectionAndFareSamplesAPI","PlaceInfoFactory","localStorageKey","dataLimitDay","getAllPlaceData","getData","localStorage","getItem","checkLimitData","setPlaceData","allData","setItem","getPlaceData","getPlaceObject","STATION","stationDetail","COORDINATE","ADDRESS","AirportsStationCodeMap","filterTimeTable","timetables","fixAirline","flightNumberPart","isMatchAirLine","abbreviation","isMatchNumber","getPlaneTimetabile","fligt","isNotGetTimeTablePlane","depAirportStationCode","statingCode","arrAirportStationCode","_averageRail$Line","averageRail","getAverageRail","upPlaneTimeTabile","TimeTable","downPlaneTimeTabile","ReferrerParam","APP","AIRPORTSITE","HIROSHIMA_AIRPORT","FUKUSHIMA_AIRPORT","MATSUYAMA_AIRPORT","KUMAMOTO_AIRPORT","APP_DOM","APP_INT","APP_DOM_1","APP_INT_1","EkinetCompanyType","JRELineListArray","JRELineList","JRHLineListArray","JRHLineList","EkinetInfoLine","isEkinetSection","companies","mostCheapChage","isShowEkinetLink","olpList","add","JRE","JRH","setIsShowLink","acceptTrainNameList","EkinetStationList","EkinetStationObj","EkinetLineListArray","JREEkinet","linkDatas","ekinetInfoLines","setIsShowLinkSections","olp","targetExtendLineLine","olpLineList","isEkinetTargetLine","priceList","fromLineIndex","toLineIndex","Infinity","getCompanies","initJREEkinetBaseParams","stationCodeList","depTimeList","lineIdxList","currentJREEkinetBaseParams","info","isEmpty","tmpComSet","insertEkinetLinkInLine","_this$linkDatas$","firstDepSectionTimeStr","firstDepSectionTime","isAbleDisplayEkinetLink","linkData","ekinetLinkURL","generateEkinetURL","ekinetLink","stationNameList","ekinetName","depStationList","ekinetParams","from_ticketing_stop_time_id","to_ticketing_stop_time_id","boarding_time","num_adult","ADULT_NUM","num_child","CHILD_NUM","UTM_SOURCE","UTM_MEDIUM","UTM_CAMPAIGN","utm_content","UTM_CONTENT","BASE_URL","jreEkinet","setHNDIntAirportPoint","isShowViaSection","HND_3","HND_2","setHNDIntAirportTerminal","makeViaList","userVia","getTargetIdx","nowalk_indexes","runGetRouteType","put","api","flightOptionsInIncremental","call","runGetFlight","queryDate","isReferenceQuery","isAbleFlightInfo","isAbleToGetFlightInfo","boardingDate","flightOptions","isFromAirportSite","isAirportSite","reRequestDate","isDomesticFlight","hugeAirportCode","isShowAirportModal","isShowSearchNoticeModal","runGetCondition","shinkansen","limitedExpress","ticketSystemType","preferredTicketOrder","plane","condtions","runGetExtreme","searchDate","airportPoint","isNotSetTerminal","airportPointAndTerminal","airportTerminal","CTS_DOM","CTS_INT","HND_1","NRT_3","FUK_DOM_NORTH","FUK_DOM_SOUTH","FUK_DOM","FUK_INT","OKA_DOM","OKA_INT","getAirportPointAndTerminal","isUseNRTThirdTerminal","setPointCode","Wgs","selectPoints","bus","connection","highway","detail","searchPoint","acumlate","prototype","apply","pointData","getWalkTime","Distance","generateLandmark","answerCount","interruptTransferStationCodes","viaList","addStopStation","interruptTransferStationCodeList","filterStationList","filterCourses","target_idx","serializeData","sectionIndex","isShowViaTerminal","viaStation","stationLight","viaTerminalName","viaTerminalCode","filterViaStations","taxiDirectionAndFare","texiDirection","directionsApiResponse","hasTaxiCourse","_taxiDirectionAndFare","existMatchedCompany","fareSummaries","filterCourseNum","l","course1","course2","sortByAirportBus","getArrivalTimeToAirport","taxiCourse","setFlags","datalakeAllowBusListAPI","throwDatalakeBusData","AllowBusLineCode","datalakeBusList","c_idx","InsideInformation","setLineCode","navigatorTransportation","input_date","input_line_code","input_station_code","input_time","extractionDatalakeBusData","datalakeApi","busData","koboBusLink","depStaCode","arrStaCode","wayflg","gpcd","rocd","dtym","dtdd","bncd","bscd","onelineQuery","stationTable","bfcd","isDevEnv","btcd","genarateKoboLink","setKoboLink","universalMaasAPI","setUniversalMaaSWalkLinkArgs","throwTokyoLimousineBusData","limousineBusList","isHighWayAirportBus","_depPoint$Station","_arrPoint$Station2","depCode","arrCode","airportBusStopTable","narita","haneda","airpotBusStopList","isTokyoLimousineBus","extractionTokyoLimousineBusData","extractionTokyoLimousineBusDataCourses","limousineBusDataAPI","tokyoLimousineBusLink","isShowTokyoLimousineBus","isError","setTokyoLimousineBusLink","iine_idx","_line$Type","_line$Type2","_arrPoint$Station","isShowOsakaLimousineBus","busName","setOsakaLimousineBusFlag","showSectionLink","_routeLine$InsideInfo","stopStationList","Stop","isShowJRHokkaidoFreePass","sectionPointList","endIdx","setShowJRHokkaidoNorthFreePassFlag","sections","tokyoSubwayAndKeikyuLineList","excludedKeikyuStationArray","courseLineList","lineList","hasOnlyTokyoSubwaySeciton","hasKeikyuSection","hasOnlyKeikyuOrTokyoSubway","hasTargetKeikyuSection","_routeLine$InsideInfo2","stopList","stop","isNotIncludeTicketexcludedKeikyuArea","hasTokyoSubwaySection","hasKeikyuAndSubwayTicketSection","setShowTokyoMetroFreePass","isMobileOnly","insertJREEkinetURLInCourse","informations","Information","runGetTrainInfo","runGetTaxiCompanyConfigurations","runDisplayResult","cookieStatus","queryString","universalMaasQuery","reservedFlight","makeResultQueryString","expires","hasDisplayedSearch","sendAccessLogAfterSeach","watchGetRouteType","takeLatest","watchGetMembers","watchGetFlightSuccess","watchGetConditionSuccess","watchGetCourses","watchSetFlight","store","preloadedState","composeEnhancer","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","compose","createStore","createRootReducer","applyMiddleware","routerMiddleware","configureStore","ReactDOM","Provider","CookiesProvider","getElementById","serviceWorker","ready","registration","unregister","run","all","fork"],"mappings":"+FAAAA,EAAOC,QAAU,IAA0B,yC,8kTCA3CD,EAAOC,QAAU,IAA0B,+C,oBCA3CD,EAAOC,QAAU,IAA0B,4C,oBCA3CD,EAAOC,QAAU,IAA0B,2C,oLCA3CD,EAAOC,QAAU,IAA0B,kD,oBCA3CD,EAAOC,QAAU,IAA0B,qD,kBCA3CD,EAAOC,QAAU,szH,oBCAjBD,EAAOC,QAAU,IAA0B,0C,oBCA3CD,EAAOC,QAAU,IAA0B,+C,oBCA3CD,EAAOC,QAAU,IAA0B,8C,kBCA3CD,EAAOC,QAAU,svO,oBCAjBD,EAAOC,QAAU,IAA0B,yC,oBCA3CD,EAAOC,QAAU,IAA0B,kD,oBCA3CD,EAAOC,QAAU,IAA0B,gD,oBCA3CD,EAAOC,QAAU,IAA0B,6C,oBCA3CD,EAAOC,QAAU,IAA0B,sD,oBCA3CD,EAAOC,QAAU,IAA0B,sD,oBCA3CD,EAAOC,QAAU,IAA0B,6C,oBCA3CD,EAAOC,QAAU,IAA0B,8C,oBCA3CD,EAAOC,QAAU,IAA0B,8C,oBCA3CD,EAAOC,QAAU,IAA0B,gD,oBCA3CD,EAAOC,QAAU,IAA0B,6C,oBCA3CD,EAAOC,QAAU,IAA0B,4C,oBCA3CD,EAAOC,QAAU,IAA0B,6C,oBCA3CD,EAAOC,QAAU,IAA0B,gD,oBCA3CD,EAAOC,QAAU,IAA0B,kD,oBCA3CD,EAAOC,QAAU,IAA0B,6C,oBCA3CD,EAAOC,QAAU,IAA0B,iD,oBCA3CD,EAAOC,QAAU,IAA0B,6C,kBCA3CD,EAAOC,QAAU,khY,oBCAjBD,EAAOC,QAAU,IAA0B,yC,oBCA3CD,EAAOC,QAAU,IAA0B,yC,oBCA3CD,EAAOC,QAAU,IAA0B,kC,oBCA3CD,EAAOC,QAAU,IAA0B,oC,kBCA3CD,EAAOC,QAAU,0qB,66+DCAjBD,EAAOC,QAAU,IAA0B,qD,oBCA3CD,EAAOC,QAAU,IAA0B,gD,oBCA3CD,EAAOC,QAAU,IAA0B,sD,oBCA3CD,EAAOC,QAAU,IAA0B,iD,oBCA3CD,EAAOC,QAAU,IAA0B,4C,oBCA3CD,EAAOC,QAAU,IAA0B,8C,60JCA3CD,EAAOC,QAAU,IAA0B,sC,oBCA3CD,EAAOC,QAAU,IAA0B,wC,g7UCA3CD,EAAO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MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAE9O,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAzBrOF,GA4BGG,eAAiB,CACtB,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAIWH,UC3CR,MAAMI,GAA6B,CACxC,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAGWC,GAA+C,CAC1D30E,GAAI,CACF,eACA,qBACA,qBACA,6CACA,2BACA,2BACA,eACA,uCACA,2BACA,2BACA,2BACA,2BACA,uCACA,iBACA,qBACA,qBACA,qBACA,qBACA,qBACA,8CACA,qBACA,uCACA,iCACA,iCACA,2BACA,6CACA,iCACA,2BACA,yDACA,2BACA,6CACA,2BACA,mDACA,mDACA,6CACA,eACA,yDACA,2BACA,2BACA,qBACA,2BACA,mDACA,mDACA,2BACA,+DACA,qEACA,eACA,2BACA,qBACA,2BACA,6CACA,qBACA,mDACA,uCACA,2BACA,eACA,+DACA,qEACA,eACA,iBACA,yDACA,2BACA,iCACA,6BACA,iCACA,mDACA,eACA,2EACA,6CACA,6CACA,mDACA,6CACA,+DACA,uCACA,6CACA,yDACA,mDACA,2BACA,uCACA,+DACA,uCACA,4BACA,6CACA,mDACA,eACA,+DACA,+DACA,6CACA,mDACA,yDACA,2BACA,6CACA,6CACA,2BACA,6CACA,uCACA,uCACA,yDACA,uCACA,6CACA,gBAEFC,GAAI,CACF,SACA,SACA,SACA,eACA,WACA,QACA,OACA,iBACA,WACA,YACA,QACA,OACA,UACA,eACA,SACA,SACA,SACA,SACA,SACA,iBACA,UACA,qBACA,iBACA,UACA,UACA,wBACA,UACA,UACA,oBACA,WACA,iBACA,qBACA,wBACA,kBACA,eACA,SACA,iBACA,YACA,UACA,SACA,WACA,iBACA,cACA,YACA,kBACA,iBACA,QACA,WACA,aACA,WACA,cACA,SACA,kBACA,YACA,UACA,QACA,mBACA,wBACA,OACA,eACA,uBACA,WACA,iBACA,iBACA,YACA,iBACA,QACA,oBACA,cACA,gBACA,qBACA,eACA,kBACA,kBACA,kBACA,oBACA,iBACA,kBACA,oBACA,uBACA,kBACA,iBACA,eACA,iBACA,OACA,gBACA,kBACA,kBACA,uBACA,8BACA,YACA,sBACA,iBACA,WACA,eACA,WACA,gBACA,kBACA,UACA,kBACA,OACA,QAIS20E,GAAkE,CAC7E,GAAM,CACJ,MAAS,eACT,MAAS,iCACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,6CACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,2BACT,MAAS,iCACT,MAAS,2BACT,MAAS,uCACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,6CACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,2BACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,2BACT,MAAS,iCACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,iCACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,2BACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,6CACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,2BACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,qBACT,MAAS,qBACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,uCACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,6CACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,6CACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,2BACT,MAAS,2BACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,6CACT,MAAS,eACT,MAAS,qBACT,MAAS,iCACT,MAAS,2BACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,iCACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,6CACT,MAAS,2BACT,MAAS,qBACT,MAAS,6CACT,MAAS,6CACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,SACT,MAAS,iCACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,SACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,iCACT,MAAS,2BACT,MAAS,qBACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,qBACT,MAAS,6CACT,MAAS,2BACT,MAAS,uCACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,2BACT,MAAS,qBACT,MAAS,iCACT,MAAS,iCACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,2BACT,MAAS,6CACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,6CACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,qBACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,2BACT,MAAS,2BACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,2BACT,MAAS,2BACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,mDACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,2BACT,MAAS,iCACT,MAAS,2BACT,MAAS,2BACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,2BACT,MAAS,qBACT,MAAS,eACT,MAAS,2BACT,MAAS,eACT,MAAS,2BACT,MAAS,2BACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,mDACT,MAAS,2BACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,2BACT,MAAS,iCACT,MAAS,2BACT,MAAS,2BACT,MAAS,2BACT,MAAS,eACT,MAAS,qBACT,MAAS,mDACT,MAAS,qBACT,MAAS,qBACT,MAAS,mDACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,KAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,iCACT,MAAS,eACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,qBACT,MAAS,2BACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,eACT,MAAS,qBACT,MAAS,6CACT,MAAS,2BACT,MAAS,eACT,MAAS,qBACT,MAAS,mDACT,MAAS,uCACT,MAAS,uCACT,MAAS,eACT,MAAS,2BACT,MAAS,iCACT,MAAS,qBACT,MAAS,2BACT,MAAS,qBACT,MAAS,qBACT,MAAS,qBACT,MAAS,eACT,MAAS,eACT,MAAS,uCACT,MAAS,qBACT,MAAS,6CACT,MAAS,qBACT,MAAS,eACT,MAAS,uCACT,MAAS,2BACT,MAAS,iCACT,MAAS,eACT,MAAS,qBACT,MAAS,kCAEX,GAAM,CACJ,MAAS,QACT,MAAS,eACT,MAAS,QACT,MAAS,SACT,MAAS,MACT,MAAS,SACT,MAAS,UACT,MAAS,SACT,MAAS,gBACT,MAAS,UACT,MAAS,QACT,MAAS,WACT,MAAS,MACT,MAAS,iBACT,MAAS,QACT,MAAS,WACT,MAAS,SACT,MAAS,QACT,MAAS,QACT,MAAS,YACT,MAAS,sBACT,MAAS,OACT,MAAS,WACT,MAAS,SACT,MAAS,eACT,MAAS,SACT,MAAS,UACT,MAAS,YACT,MAAS,SACT,MAAS,cACT,MAAS,WACT,MAAS,SACT,MAAS,QACT,MAAS,UACT,MAAS,gBACT,MAAS,kBACT,MAAS,gBACT,MAAS,kBACT,MAAS,SACT,MAAS,SACT,MAAS,SACT,MAAS,SACT,MAAS,WACT,MAAS,WACT,MAAS,kBACT,MAAS,OACT,MAAS,SACT,MAAS,SACT,MAAS,UACT,MAAS,YACT,MAAS,WACT,MAAS,SACT,MAAS,WACT,MAAS,WACT,MAAS,OACT,MAAS,YACT,MAAS,SACT,MAAS,UACT,MAAS,cACT,MAAS,aACT,MAAS,cACT,MAAS,cACT,MAAS,cACT,MAAS,UACT,MAAS,WACT,MAAS,OACT,MAAS,MACT,MAAS,WACT,MAAS,UACT,MAAS,SACT,MAAS,UACT,MAAS,QACT,MAAS,YACT,MAAS,eACT,MAAS,YACT,MAAS,cACT,MAAS,WACT,MAAS,SACT,MAAS,YACT,MAAS,gBACT,MAAS,iBACT,MAAS,iBACT,MAAS,iBACT,MAAS,gBACT,MAAS,kBACT,MAAS,kBACT,MAAS,eACT,MAAS,iBACT,MAAS,gBACT,MAAS,iBACT,MAAS,mBACT,MAAS,iBACT,MAAS,kBACT,MAAS,UACT,MAAS,SACT,MAAS,QACT,MAAS,YACT,MAAS,OACT,MAAS,SACT,MAAS,eACT,MAAS,MACT,MAAS,SACT,MAAS,OACT,MAAS,WACT,MAAS,eACT,MAAS,cACT,MAAS,YACT,MAAS,SACT,MAAS,YACT,MAAS,SACT,MAAS,WACT,MAAS,QACT,MAAS,SACT,MAAS,YACT,MAAS,iBACT,MAAS,mBACT,MAAS,UACT,MAAS,SACT,MAAS,YACT,MAAS,WACT,MAAS,WACT,MAAS,cACT,MAAS,QACT,MAAS,mBACT,MAAS,iBACT,MAAS,aACT,MAAS,eACT,MAAS,YACT,MAAS,eACT,MAAS,MACT,MAAS,WACT,MAAS,SACT,MAAS,WACT,MAAS,gBACT,MAAS,gBACT,MAAS,gBACT,MAAS,iBACT,MAAS,mBACT,MAAS,OACT,MAAS,SACT,MAAS,SACT,MAAS,YACT,MAAS,OACT,MAAS,YACT,MAAS,UACT,MAAS,SACT,MAAS,YACT,MAAS,SACT,MAAS,SACT,MAAS,QACT,MAAS,QACT,MAAS,QACT,MAAS,QACT,MAAS,SACT,MAAS,OACT,MAAS,UACT,MAAS,eACT,MAAS,MACT,MAAS,UACT,MAAS,eACT,MAAS,aACT,MAAS,aACT,MAAS,UACT,MAAS,UACT,MAAS,UACT,MAAS,WACT,MAAS,eACT,MAAS,SACT,MAAS,YACT,MAAS,WACT,MAAS,OACT,MAAS,OACT,MAAS,YACT,MAAS,OACT,MAAS,cACT,MAAS,UACT,MAAS,OACT,MAAS,OACT,MAAS,YACT,MAAS,WACT,MAAS,cACT,MAAS,YACT,MAAS,aACT,MAAS,gBACT,MAAS,kBACT,MAAS,WACT,MAAS,kBACT,MAAS,eACT,MAAS,cACT,MAAS,aACT,MAAS,aACT,MAAS,gBACT,MAAS,aACT,MAAS,kBACT,MAAS,eACT,MAAS,gBACT,MAAS,aACT,MAAS,eACT,MAAS,kBACT,MAAS,aACT,MAAS,aACT,MAAS,WACT,MAAS,aACT,MAAS,WACT,MAAS,mBACT,MAAS,SACT,MAAS,UACT,MAAS,WACT,MAAS,WACT,MAAS,cACT,MAAS,UACT,MAAS,KACT,MAAS,QACT,MAAS,QACT,MAAS,WACT,MAAS,WACT,MAAS,UACT,MAAS,mBACT,MAAS,UACT,MAAS,SACT,MAAS,OACT,MAAS,SACT,MAAS,YACT,MAAS,QACT,MAAS,UACT,MAAS,WACT,MAAS,WACT,MAAS,SACT,MAAS,gBACT,MAAS,gBACT,MAAS,QACT,MAAS,eACT,MAAS,YACT,MAAS,MACT,MAAS,kBACT,MAAS,cACT,MAAS,aACT,MAAS,eACT,MAAS,aACT,MAAS,YACT,MAAS,YACT,MAAS,WACT,MAAS,MACT,MAAS,QACT,MAAS,UACT,MAAS,MACT,MAAS,iBACT,MAAS,QACT,MAAS,WACT,MAAS,aACT,MAAS,eACT,MAAS,aACT,MAAS,OACT,MAAS,aACT,MAAS,MACT,MAAS,gBACT,MAAS,WACT,MAAS,QACT,MAAS,QACT,MAAS,QACT,MAAS,SACT,MAAS,gBACT,MAAS,YACT,MAAS,WACT,MAAS,WACT,MAAS,kBACT,MAAS,SACT,MAAS,WACT,MAAS,UACT,MAAS,sBACT,MAAS,gBACT,MAAS,WACT,MAAS,sBACT,MAAS,iBACT,MAAS,WACT,MAAS,SACT,MAAS,WACT,MAAS,eACT,MAAS,SACT,MAAS,aACT,MAAS,SACT,MAAS,MACT,MAAS,kBACT,MAAS,SACT,MAAS,SACT,MAAS,YACT,MAAS,YACT,MAAS,kBACT,MAAS,OACT,MAAS,UACT,MAAS,WACT,MAAS,aACT,MAAS,WACT,MAAS,gBACT,MAAS,YACT,MAAS,SACT,MAAS,YACT,MAAS,SACT,MAAS,aACT,MAAS,cACT,MAAS,kBACT,MAAS,SACT,MAAS,cACT,MAAS,SACT,MAAS,aACT,MAAS,SACT,MAAS,SACT,MAAS,QACT,MAAS,SACT,MAAS,UACT,MAAS,SACT,MAAS,SACT,MAAS,QACT,MAAS,UACT,MAAS,MACT,MAAS,cACT,MAAS,MACT,MAAS,OACT,MAAS,MACT,MAAS,OACT,MAAS,SACT,MAAS,QACT,MAAS,UACT,MAAS,QACT,MAAS,UACT,MAAS,OACT,MAAS,aACT,MAAS,UACT,MAAS,WACT,MAAS,QACT,MAAS,cACT,MAAS,UACT,MAAS,WACT,MAAS,SACT,MAAS,QACT,MAAS,aACT,MAAS,SACT,MAAS,SACT,MAAS,UACT,MAAS,WACT,MAAS,WACT,MAAS,QACT,MAAS,cACT,MAAS,SACT,MAAS,SACT,MAAS,QACT,MAAS,WACT,MAAS,WACT,MAAS,UACT,MAAS,UACT,MAAS,YACT,MAAS,UACT,MAAS,SACT,MAAS,UACT,MAAS,QACT,MAAS,UACT,MAAS,aACT,MAAS,cACT,MAAS,aACT,MAAS,eACT,MAAS,OACT,MAAS,kBACT,MAAS,gBACT,MAAS,SACT,MAAS,UACT,MAAS,OACT,MAAS,OACT,MAAS,SACT,MAAS,gBACT,MAAS,eACT,MAAS,YACT,MAAS,iBACT,MAAS,eACT,MAAS,eACT,MAAS,gBACT,MAAS,iBACT,MAAS,iBACT,MAAS,gBACT,MAAS,aACT,MAAS,cACT,MAAS,eACT,MAAS,aACT,MAAS,WACT,MAAS,cACT,MAAS,cACT,MAAS,cACT,MAAS,cACT,MAAS,WACT,MAAS,SACT,MAAS,QACT,MAAS,SACT,MAAS,UACT,MAAS,UACT,MAAS,aACT,MAAS,WACT,MAAS,UACT,MAAS,WACT,MAAS,OACT,MAAS,UACT,MAAS,WACT,MAAS,YACT,MAAS,QACT,MAAS,aACT,MAAS,aACT,MAAS,SACT,MAAS,MACT,MAAS,WACT,MAAS,WACT,MAAS,OACT,MAAS,aACT,MAAS,iBACT,MAAS,WACT,MAAS,SACT,MAAS,eACT,MAAS,SACT,MAAS,WACT,MAAS,UACT,MAAS,YACT,MAAS,eACT,MAAS,sBACT,MAAS,WACT,MAAS,UACT,MAAS,UACT,MAAS,kBACT,MAAS,WACT,MAAS,WACT,MAAS,cACT,MAAS,cACT,MAAS,iBACT,MAAS,QACT,MAAS,SACT,MAAS,QACT,MAAS,kBACT,MAAS,mBACT,MAAS,WACT,MAAS,UACT,MAAS,YACT,MAAS,eACT,MAAS,iBACT,MAAS,kBACT,MAAS,WACT,MAAS,eACT,MAAS,iBACT,MAAS,kBACT,MAAS,cACT,MAAS,cACT,MAAS,mBACT,MAAS,gBACT,MAAS,WACT,MAAS,qBACT,MAAS,sBACT,MAAS,SACT,MAAS,aACT,MAAS,aACT,MAAS,iBACT,MAAS,eACT,MAAS,kBACT,MAAS,SACT,MAAS,UACT,MAAS,aACT,MAAS,WACT,MAAS,kBACT,MAAS,gBACT,MAAS,YACT,MAAS,cACT,MAAS,SACT,MAAS,OACT,MAAS,WACT,MAAS,QACT,MAAS,QACT,MAAS,SACT,MAAS,UACT,MAAS,mBACT,MAAS,SACT,MAAS,mBACT,MAAS,KACT,MAAS,WACT,MAAS,gBACT,MAAS,eACT,MAAS,iBACT,MAAS,mBACT,MAAS,SACT,MAAS,YACT,MAAS,SACT,MAAS,aACT,MAAS,YACT,MAAS,QACT,MAAS,gBACT,MAAS,WACT,MAAS,kBACT,MAAS,kBACT,MAAS,QACT,MAAS,YACT,MAAS,WACT,MAAS,SACT,MAAS,WACT,MAAS,oBACT,MAAS,aACT,MAAS,QACT,MAAS,QACT,MAAS,WACT,MAAS,mBACT,MAAS,mBACT,MAAS,oBACT,MAAS,iBACT,MAAS,oBACT,MAAS,YACT,MAAS,WACT,MAAS,uBACT,MAAS,UACT,MAAS,YACT,MAAS,oBACT,MAAS,WACT,MAAS,WACT,MAAS,QACT,MAAS,YACT,MAAS,cACT,KAAS,UACT,MAAS,aACT,MAAS,WACT,MAAS,cACT,MAAS,iBACT,MAAS,SACT,MAAS,SACT,MAAS,YACT,MAAS,iBACT,MAAS,iBACT,MAAS,aACT,MAAS,WACT,MAAS,YACT,MAAS,aACT,MAAS,aACT,MAAS,eACT,MAAS,mBACT,MAAS,aACT,MAAS,WACT,MAAS,WACT,MAAS,aACT,MAAS,YACT,MAAS,qBACT,MAAS,cACT,MAAS,UACT,MAAS,aACT,MAAS,cACT,MAAS,eACT,MAAS,oBACT,MAAS,YACT,MAAS,aACT,MAAS,iBACT,MAAS,YACT,MAAS,aACT,MAAS,cACT,MAAS,kBACT,MAAS,gBACT,MAAS,QACT,MAAS,UACT,MAAS,qBACT,MAAS,eACT,MAAS,mBACT,MAAS,WACT,MAAS,SACT,MAAS,iBACT,MAAS,cACT,MAAS,qBACT,MAAS,SACT,MAAS,iBACT,MAAS,qBC10CE,MAAMC,GAmBnBjsE,YAAYksE,EAAmB/0E,GAlB/B,KACA+qE,UAAI,EAEJ,KACAiK,YAAM,EACN,KACAC,YAAM,EACN,KACA9pB,WAAK,EACL,KACA+pB,YAAM,EACN,KACAl1E,UAAI,EACJ,KACAm1E,mBAAa,EACb,KACAC,iBAAW,EA8HX,KAIAC,uBAA0BzgE,IACxB,IAEE,MAAM0gE,EAAuB3uE,OAAOC,KAAKiuE,GAAoB50E,IAC7D,GAAG2U,EAAO2gE,qBAAsB,CAE9B,IAAIC,GAAa,EACbC,GAAwB,EACxBC,EAAiB,IAAIh0E,KAAK,IACbkT,EAAO2gE,qBAAqB/uE,OAAQoO,EAAO2gE,qBAAsB,CAAC3gE,EAAO2gE,uBACjFv7C,QAASm6C,IAChB,MAAMwB,EAAY/gE,EAAOkwD,MAAM8Q,KAAKzB,EAAQ0B,eAAe,GAK3D,IAAIC,GAJU3B,EAAQyB,KAAKpvE,OAAQ2tE,EAAQyB,KAAM,CAACzB,EAAQyB,OAEnCtpD,IAAKvd,GAAqBA,EAAKzG,MAEzBmyB,OAAO,CAACvzB,EAAYxD,IACxCwD,GAAKytE,GAAiB3tE,SAAS/F,OAAOyC,KAC5C,GAEH,GAAGoyE,EAAe,CAChB,MAAMC,EAAiBnhE,EAAOkwD,MAAMlS,MAAMuhB,EAAQ0B,eAAiB,GAAGz9C,QAAQ9vB,KACxE0tE,EAAiBphE,EAAOkwD,MAAMlS,MAAMuhB,EAAQ0B,gBAAgBz9C,QAAQ9vB,KAE1EwtE,EAAgBR,EAAqBtuE,SAAS+uE,IAAmBT,EAAqBtuE,SAASgvE,GAQjG,GALGF,GAAiB70E,OAAOkzE,EAAQ0B,gBAAkB,IAAMJ,IACzDD,GAAa,EACbE,EAAiB,IAAIh0E,KAAK,IAE5B+zE,EAAuBx0E,OAAOkzE,EAAQ0B,gBACnCC,GAAiBN,EAAY,CAE9B,MAAMlwE,EAAU,IAAI5D,KAAKi0E,EAAUzmE,eAAeC,SAASC,MAErD6mE,EAAoBz1E,GAASy1E,kBAAkB3wE,GAMrD,GALI2wE,IACFT,GAAa,GAEfG,EAAUO,mBAAqBD,EAE5BN,EAAUO,mBACX,GAAgC,IAA7BR,EAAe5yE,UAEhB4yE,EAAiB/wE,YAAWW,EAAS,OAChC,CAEqB9E,GAAS21E,gBAAgBT,EAAgBpwE,KAEjEqwE,EAAUO,oBAAqB,EAC/BV,GAAa,SAKnBG,EAAUO,oBAAqB,KAIrC,MAAM1xE,GAEH+hB,IAKP,KAIA6vD,sBAAyBxhE,IACvB,IACE,IAAIypB,EAAQr1B,KAAKqtE,gBAEjBzhE,EAAOkwD,MAAM8Q,KAAK57C,QAAQ,CAACjrB,EAAYukB,KAAiB,IAADgjD,EAIrD,MAAMxxB,EAA6G,QAAzGwxB,EAAG1hE,EAAO2hE,MAAMzvE,KAAKqyD,GAAiB,WAAXA,EAAEqd,MAAqBrd,EAAE5sC,QAAUxd,EAAK0nE,aAA+B,SAAftd,EAAEud,iBAAoB,IAAAJ,OAAA,EAAtGA,EAAwGK,OAClH7xB,GAAQ7jD,OAAO6jD,GAAQ,IACxBzmB,EAAMu4C,eAAgB,GAGxB,IAAIC,GAAY,EAChB,GAAG9nE,EAAKmnE,mBAAoB,CAE1B,GAA+B,IAA5B73C,EAAM/4B,QAAQxC,UAAiB,CAChC,MAAMwC,EAAU,IAAI5D,KAAKqN,EAAKG,eAAeC,SAASC,MAEtDivB,EAAM/4B,QAAUX,YAAWW,EAAS,GAGtC,IAAI+4B,EAAMy4C,YAAYtwE,OAAQ,CAC5B,MAAMuwE,EAAaniE,EAAOkwD,MAAMlS,MAAMt/B,GAAK8E,QAC3CiG,EAAQr1B,KAAKguE,YAAYD,EAAY14C,GAEvC,MAAM44C,EAAariE,EAAOkwD,MAAMlS,MAAMt/B,EAAI,GAAG8E,QAC7CiG,EAAQr1B,KAAKguE,YAAYC,EAAY54C,GACrCA,EAAQr1B,KAAKkuE,UAAUnoE,EAAKspB,KAAMgG,GAClCw4C,EAAW7tE,KAAKmsE,cAAc3uE,YACM,IAA5B63B,EAAM/4B,QAAQxC,YAEtBkG,KAAKmsE,cAAc96C,KAAKgE,GACxBA,EAAQr1B,KAAKqtE,iBAEfrtE,KAAKosE,YAAY/6C,KAAKw8C,KAExB7tE,KAAKmsE,cAAc96C,KAAKgE,GACxB,MAAM75B,GAEH+hB,IAKP,KAGA4wD,sBAAwB,KACtBnuE,KAAKmsE,cAAcn7C,QAAUqE,IAC3BA,EAAM+4C,eAAiB/4C,EAAMy4C,YAAY,GACzCz4C,EAAMg5C,eAAiBh5C,EAAMy4C,YAAYh2E,OAAO,GAAG,GACnDu9B,EAAMi5C,eAAiBj5C,EAAMy4C,YAAYh2E,MAAM,GAAI,MAGvD,KAIAy2E,OAAU3iE,IAER5L,KAAKqsE,uBAAuBzgE,GAE5B5L,KAAKotE,sBAAsBxhE,GAE3B5L,KAAKmuE,yBAeP,KAIAK,uBAA0BC,IACxB,IACE,MAAMC,EAAa1uE,KAAKosE,YAAYqC,GAC9Bp5C,EAAQr1B,KAAKmsE,cAAcuC,GAEjC,OAAOr5C,EAAMs5C,QAAUt5C,EAAMu4C,cAC7B,MAAMpyE,GACN,OAAO,IA3QTwE,KAAKhJ,KAAOA,EACZgJ,KAAKmiD,OAAQ,EACb,MAAMllC,EAAMjd,KAAKmiD,MAAO,MAAO,OACzBysB,EAAS7C,EAAU,KAAM,KAC/B/rE,KAAK+hE,KA1BY,CACf8M,IAAK,CACH53E,GAAI,CACF63E,GAAI,qFACJC,GAAI,8FAEN73E,GAAI,CACF43E,GAAI,oFACJC,GAAI,yFAGR9M,KAAM,CACJhrE,GAAI,CACF63E,GAAI,sFACJC,GAAI,+FAEN73E,GAAI,CACF43E,GAAI,qFACJC,GAAI,2FAQW9xD,GAAKjmB,GAAM43E,GAChC5uE,KAAKmsE,cAAgB,GACrBnsE,KAAKisE,OAAS,MACdjsE,KAAKgsE,OAAS,EACdhsE,KAAKksE,OAAS,EACdlsE,KAAKosE,YAAc,GAErBiB,gBACE,MAAO,CACLiB,eAAgB,GAChBhyE,QAAS,IAAI5D,KAAK,GAClBo1E,YAAa,GACbkB,UAAW,GACXL,QAAQ,EACRf,eAAe,GAMnBrgC,UAAUjjB,GACR,MAAMj1B,EAAS2K,KAAKmsE,cAAc7hD,GAClC,IAAIj1B,EACF,MAAM,IAAIuR,MAAM,6CAADL,OAA0B+jB,EAAG,gDAE9C,IAAI2kD,EAAiB,CACnBC,OAAQ75E,EAAO+4E,eACfe,OAAQ95E,EAAOg5E,eACfe,YAAax3E,aAAOvC,EAAOiH,QAAS,UACpC+yE,MAAOz3E,aAAOvC,EAAOiH,QAAS,MAC9BgzE,OAAQ13E,aAAOvC,EAAOiH,QAAS,MAC/BizE,SAAU33E,aAAOvC,EAAOiH,QAAS,MACjC0vE,OAAQhsE,KAAKgsE,OACbE,OAAQlsE,KAAKksE,OACbD,OAAQjsE,KAAKisE,QAQf,OANA52E,EAAOi5E,eAAet9C,QAAQ,CAACw+C,EAAKllD,KAClC2kD,EAAU,SAAD1oE,OAAU+jB,EAAI,IAAOklD,IAEhCn6E,EAAO25E,UAAUh+C,QAAQ,CAACy+C,EAAKnlD,KAC7B2kD,EAAU,UAAD1oE,OAAW+jB,EAAI,IAAOmlD,IAE1BR,EAMTS,OAAOplD,GAEFtqB,KAAKmiD,QACNniD,KAAKmsE,cAAc7hD,GAAKhuB,QAAQqzE,YAAY,MAC5C3vE,KAAKmsE,cAAc7hD,GAAKhuB,QAAQszE,SAAS,IACzC5vE,KAAKmsE,cAAc7hD,GAAKhuB,QAAQlC,QAAQ,KAE1C,MAAMmG,EAAO,IAAIs0B,gBAAgB70B,KAAKutC,UAAUjjB,IAChD,MAAM,GAAN/jB,OAAUvG,KAAK+hE,KAAI,KAAAx7D,OAAIhG,GAMzBsvE,kBAAkBpB,GAChB,MAAMC,EAAa1uE,KAAKosE,YAAYqC,GACpC,OAAOzuE,KAAK0vE,OAAOhB,GAMrBV,YAAYrb,EAAkBt9B,GAC5B,MAAMy6C,EAAcnd,EAAQrzD,KACtBywE,EAAclE,GAAoB7rE,KAAKhJ,MAAM84E,GAKnD,OAHGC,GACD16C,EAAMy4C,YAAYz8C,KAAK0+C,GAElB16C,EAMT64C,UAAU8B,EAAe36C,GACvB,IAAI46C,EAAarE,GAAkB5rE,KAAKhJ,MAAM8G,KAAMI,IACrB,IAAtB8xE,EAAM1+C,QAAQpzB,IAUvB,OAPI+xE,EAIF56C,EAAMs5C,QAAS,EAHfsB,EAAa,GAKf56C,EAAM25C,UAAU39C,KAAK4+C,GACd56C,GA7IUy2C,GAiSZU,WAAc1sE,IAOnB,MAD4B,CAAE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAC3D9B,SAAS8B,I,cChUjC,MAAMowE,GAA+B,CAC1C,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAKWC,GAA2B,CACtC,IACA,KAIWC,GAA8D,CACzE,CAAC1uD,KAAK,eAAKpiB,KAAK,OAChB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,qBAAMpiB,KAAK,OACjB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,iCAAQpiB,KAAK,OACnB,CAACoiB,KAAK,eAAKpiB,KAAK,OAChB,CAACoiB,KAAK,eAAKpiB,KAAK,OAChB,CAACoiB,KAAK,qBAAMpiB,KAAK,OACjB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,eAAKpiB,KAAK,OAChB,CAACoiB,KAAK,+CAAYpiB,KAAK,OACvB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,qBAAMpiB,KAAK,OACjB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,yCAAWpiB,KAAK,OACtB,CAACoiB,KAAK,qBAAMpiB,KAAK,OACjB,CAACoiB,KAAK,qBAAMpiB,KAAK,OACjB,CAACoiB,KAAK,yCAAWpiB,KAAK,OACtB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,qBAAMpiB,KAAK,OACjB,CAACoiB,KAAK,qBAAMpiB,KAAK,OACjB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,eAAKpiB,KAAK,OAChB,CAACoiB,KAAK,eAAKpiB,KAAK,OAChB,CAACoiB,KAAK,qBAAMpiB,KAAK,OACjB,CAACoiB,KAAK,uCAASpiB,KAAK,OACpB,CAACoiB,KAAK,iCAAQpiB,KAAK,OACnB,CAACoiB,KAAK,eAAKpiB,KAAK,OAChB,CAACoiB,KAAK,iCAAQpiB,KAAK,OACnB,CAACoiB,KAAK,eAAKpiB,KAAK,OAChB,CAACoiB,KAAK,iCAAQpiB,KAAK,OACnB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,qBAAMpiB,KAAK,OACjB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,2BAAOpiB,KAAK,OAClB,CAACoiB,KAAK,eAAKpiB,KAAK,QCtDL+wE,GAA2BA,CAACtoE,EAA2BlG,EAAwByuE,EAAeC,KASzG,GAAGA,EAAwB,OAAO,EAElC,GAAGxoE,EAAoB,OAAO,EAG9B,IADyB,CAAC,MAAO,MAAO,OACnB/J,SAAS6D,GAC5B,OAAO,EAGT,MAAM7I,EAAM,IAAIN,KAEhB,OADiBQ,YAAyBo3E,EAASt3E,IAC/B,GCzBP,MAAMw3E,GAqCnB3wE,YAAYgN,EAA6BrB,EAA0BzD,EAA2BqD,EAA8BgO,EAAmBpiB,EAAYy5E,GAAuB,KApClL9/D,gBAAU,OACV+/D,cAAQ,OACRC,mBAAa,OACbpD,WAAK,OACLzR,WAAK,OACLlgB,WAAK,OACLg1B,aAAO,OACPC,0BAAoB,OACpBC,YAAM,OACNC,gBAAU,OACVC,cAAQ,OACRC,mBAAa,OACbC,yBAAmB,OACnB3E,0BAAoB,OACpB4E,4BAAsB,OACtBhwC,cAAQ,EACR,KACAyL,cAAQ,EACR,KACAC,cAAQ,OACRwe,YAAM,OACN+lB,kBAAY,EACa,KACzBC,gBAAU,OACVC,aAAO,EAcL,MAAMC,EAAOv6E,IAASF,EAAKG,GAErBu6E,EAAkB,OAAV3kE,QAAU,IAAVA,OAAU,EAAVA,EAAY4kE,OAAO,GAC3BC,EAAY,OAALF,QAAK,IAALA,OAAK,EAALA,EAAOE,KAAK,GAEzB1xE,KAAK4sC,SAAW6jC,EAAUkB,cAC1B3xE,KAAKqxE,WAAalV,QAAQuV,EAAKE,qBAE/B5xE,KAAK6sC,SAAW4jC,EAAUoB,cAC1B,MAAMC,EAAkB35E,KAAK45E,MAAM/xE,KAAK6sC,SAAS,IAE3CmlC,EAAkBxmE,EAAaxD,kBAAkBD,GACvD,IAEIkqE,EACAC,EAHAC,EAAoB,IAAIz5E,KAAK,GAC7B05E,EAAkB,IAAI15E,KAAK,GAI/B,MAAMw9D,EAAeqb,EAAM,eAAK,UAC1BxxE,EAAW,GAAAwG,OAAMwB,EAAkByD,EAAa1J,eAAgB0J,EAAazJ,eAAc,KAAAwE,OAAI2vD,GAClGnuD,GAEDoqE,EAAcx2E,YAAWq2E,EAAW5mE,GACpCgnE,EAAYz2E,YAAWw2E,EAAaL,GACpCG,EAAkBP,EAAKW,aACvBH,EAAiBR,EAAKY,iBAGtBH,EAAc3mE,EAAavC,eAAc,GACzCmpE,EAAYr4E,YAAWo4E,EAAaL,GACpCG,EAAkBP,EAAKY,eACvBJ,EAAiBR,EAAKW,cAExB,MAAME,EAAiB,CACrBC,iBAAkB,GAClBC,YAAaxmC,OAAO6lC,GACpBY,MAAO,GACPC,WAAY,GACZC,yBAA0B,GAC1BhmC,SAAUX,OAAOjsC,KAAK4sC,UACtBvd,KAAMkiD,EAAO,qBAAQ,kBACrBjiD,KAAM,OACNhpB,aAActG,KAAK6yE,YAAY9qE,EAAmBoqE,EAAcC,GAChEU,YAAa,GACbC,gBAAiB,GACjB7sE,eAAgBlG,KAAK6yE,YAAY9qE,EAAmBqqE,EAAYD,GAEhEa,MAAO,WACPC,UAAW,IAEPC,EAAiB,CACrBV,iBAAkB,GAClBC,YAAa,GACbC,MAAO,GACPC,WAAY,GACZM,UAAW,GACXL,yBAA0B,GAC1BhmC,SAAU,GACVvd,KAAMkiD,EAAM,eAAM,OAClBjiD,KAAM,OACNhpB,aAActG,KAAK6yE,YAAYV,GAC/BW,YAAa,GACbC,gBAAiB,GACjB7sE,eAAgBlG,KAAK6yE,YAAYV,GAEjCa,MAAO,aAEHG,EAAqB,CACzB/jD,QAAS,CACP9vB,KAAM,GACN+vB,KAAMjW,EACNkW,KAAM,GACN8jD,KAAM,IAER5jD,WAAY,CACVlwB,KAAM,GACN+vB,KAAM,IAERE,SAAU,CACR8jD,MAAO,GACPC,KAAM,GACNzkD,QAASod,OAAOimC,EAAejlE,KAC/B6hB,IAAK,GACLF,OAAQqd,OAAOimC,EAAellE,OAG5BumE,EAA8B,CAClCnkD,QAAS,CACP9vB,KAAM,GACN+vB,KAAMtvB,EACNuvB,KAAM,GACN8jD,KAAM,IAER5jD,WAAY,CACVlwB,KAAM,GACN+vB,KAAM,IAERE,SAAU,CACR8jD,MAAO,GACPC,KAAM,GACNzkD,QAASod,OAAOgmC,EAAgBhlE,KAChC6hB,IAAK,GACLF,OAAQqd,OAAOgmC,EAAgBjlE,OAG7BwmE,EAAyBjC,EAAM,iCAAS,iBACxClpE,EAAWkpE,EAAM,eAAM,OACvBkC,EAA4B,CAChCpkD,KAAMtnB,EAAkByrE,EAAwBnrE,EAChD+mB,QAAS,CACP9vB,KAAM,GACN+vB,KAAMtnB,EAAkByrE,EAAwBnrE,EAChDinB,KAAM,GACN8jD,KAAM,IAER5jD,WAAY,CACVlwB,KAAM,GACN+vB,KAAM,IAERE,SAAU,CACR8jD,MAAO,GACPC,KAAM,GACNzkD,QAAS,GACTC,IAAK,GACLF,OAAQ,KAGZ5uB,KAAK2Q,WAAa,UAClB3Q,KAAK0wE,SAAW,GAChB1wE,KAAK2wE,cAAgB,GAErB3wE,KAAKutE,MAAQ,GAEbvtE,KAAK87D,MAAQ,CACX4X,UAAW,IACXjB,YAAaxmC,OAAO6lC,GACpBa,WAAY,IACZC,yBAA0B,IAC1BhmC,SAAU5sC,KAAK4sC,SAASniC,WACxBkpE,SAAU,GACVC,cAAe,IACfhH,KAAM7kE,EAAkB,CAACwqE,EAAUW,GAAW,CAACA,EAAUX,GACzD3oB,MAAO7hD,EAAkB,CAACorE,EAAaI,EAAsBE,GAAqB,CAACA,EAAoBF,EAAsBJ,GAC7HU,QAAS,GAEX7zE,KAAK47C,MAAQ,GACb57C,KAAK4wE,QAAU,GACf5wE,KAAK6wE,sBAAuB,EAC5B7wE,KAAK8wE,QAAS,EACd9wE,KAAK+wE,YAAa,EAClB/wE,KAAKgxE,SAAW,EAChBhxE,KAAKixE,eAAgB,EACrBjxE,KAAKkxE,qBAAsB,EAC3BlxE,KAAKusE,qBAAuB,KAG5BvsE,KAAKmhC,SAAW,GAChBnhC,KAAKqrD,QAAS,EACdrrD,KAAKoxE,aAAe,OAStB,+BAA+B0C,EAAqBj7E,EAAqB4qE,GAKvE,OAAG5qE,EACoB,QAAlB4qE,EACMtrE,KAAK47E,IAAID,EAJc,IAMN,QAAlBrQ,EACCtrE,KAAK47E,IAAID,EANI,IASb37E,KAAK47E,IAAID,EAZC,IAgBZ37E,KAAK47E,IAAID,EAfG,KAuBvBjB,YAAYh7E,GACV,MAAO,CACLm8E,GAAI,GACJ1kD,KAAM,GACNnpB,SAAU,CACRC,KAAMvO,EAAKo8E,cACXztE,UAAW,WC7OnB,MAAMoX,GAAgC,CACpCC,QAASN,mEACTO,QAAS,KAkCEo2D,GAA8B7gD,IACzC,MAAMpV,EAAMrQ,YAAA,GACPgQ,GAAmB,GACnByV,GAELnV,KAAMC,SAASC,QAAQC,KAAK,gBAAkB,oCAC9C,MAAMC,EAAWJ,KAAMK,OAAON,GAuB9B,OArB4BF,UAC1B,IAAIxd,EAGFA,EAAO,iBAIT,IACE,IAAIse,QAAiBP,EAASD,KAAK9d,EAAM4zE,GAGzC,GAAwB,MAApBt1D,EAASpc,QAA+C,MAA7Boc,EAAShc,KAAKwG,WAC3C,MAAM,IAAIzC,MAAM,gBAGlB,OAAOiY,EAAShc,KAAKmc,KACrB,MAAOP,GACP,MAAMA,KCvBL,SAAS21D,GAAUC,GAExB,MAAMC,EAAUD,EAAQ5iD,OAAO,CAAC6iD,EAAgB1oE,KAC9C,MAAM4lE,EAAQ5lE,EAAOkwD,MAEfyY,EAAat8E,OAAOu5E,EAAMiB,aAAex6E,OAAOu5E,EAAMkC,WAAaz7E,OAAOu5E,EAAMmC,UACtF,OAAI/nE,EAAOy/C,OAAeipB,EAClBC,EAAaD,EAAUC,EAAYD,GAC1Cr8E,OAAOu8E,WAiBV,OAfAH,EAAUA,EAAQ/wD,IAAK1X,IACrB,MAAM4lE,EAAQ5lE,EAAOkwD,MAEf+X,EAAU57E,OAAOu5E,EAAMiB,aAAex6E,OAAOu5E,EAAMkC,WAAaz7E,OAAOu5E,EAAMmC,UAUnF,OARA/nE,EAAOkwD,MAAM+X,QAAUA,EAEnBjoE,EAAOy/C,OAETz/C,EAAOklE,QAAS,EAEhBllE,EAAOklE,OAAUwD,IAAYT,EAExBjoE,IAiCJ,SAAS6oE,GAAcJ,GAE5B,MAAMK,EAAWL,EAAQ5iD,OAAO,CAACijD,EAAiB9oE,KAEhDA,EA5BG,SAAqBA,GAE1B,QAAoBrG,IAAjBqG,EAAO2hE,MACR3hE,EAAOolE,SAAW,MAEf,CAAC,IAAD2D,EAAAC,EAEH,MAAMC,EAASvwD,MAAM4O,QAAQtnB,EAAO2hE,OAAQ3hE,EAAO2hE,MAAO,CAAC3hE,EAAO2hE,OAM5DuH,GAJc78E,OAAiD,QAA3C08E,EAACE,EAAO/2E,KAAKI,GAAgB,gBAAXA,EAAEsvE,aAAuB,IAAAmH,OAAA,EAA1CA,EAA4ChH,SAAW,IAE5D11E,OAAmD,QAA7C28E,EAACC,EAAO/2E,KAAKI,GAAgB,kBAAXA,EAAEsvE,aAAyB,IAAAoH,OAAA,EAA5CA,EAA8CjH,SAAW,GAItF/hE,EAAOolE,SAAW8D,EAEpB,OAAOlpE,EAWImpE,CAAYnpE,IACVy/C,OAAeqpB,EAClB9oE,EAAOolE,SAAW0D,EAAW9oE,EAAOolE,SAAU0D,EACrDz8E,OAAOu8E,WAWV,OATAH,EAAUA,EAAQ/wD,IAAK1X,IACjBA,EAAOy/C,OAETz/C,EAAOmlE,YAAa,EAEpBnlE,EAAOmlE,WAAc2D,IAAa9oE,EAAOolE,SAEpCplE,IASJ,SAASopE,GAAwBX,GAEtC,IAAIY,EAA6Bh9E,OAAOu8E,UAEpCU,EAA4C,GAwBhD,OArBAb,EAAQrjD,QAAQ,CAACplB,EAAQ2X,KACvB,MAAMqwD,EAAgB37E,OAAOoP,SAASuE,EAAOkwD,MAAM8X,eAG/CA,EAAgBqB,IAAuBrpE,EAAOy/C,QAEhD4pB,EAAqBrB,EAErBsB,EAAkC,CAAC3xD,IAG1BqwD,IAAkBqB,GAAuBrpE,EAAOy/C,QAEzD6pB,EAAgC7jD,KAAK9N,GAIvC3X,EAAOilE,sBAAuB,IAI3BqE,GAELA,EAAgClkD,QAAShM,IACvCqvD,EAAQrvD,GAAG6rD,sBAAuB,IAE7BwD,GALwCA,EClJjD,MAAMz2D,GAAgC,CACpCC,QAASN,mEACTO,QAAS,KAQEq3D,GAA0Bp3D,UACrC,MAGMq3D,GAAiB59E,GAAS69E,+BAC1Bp3D,EAAoBL,GAC1BM,KAAMC,SAASC,QAAQC,KAAK,gBAAkB,mBAE9C,MAIM9d,EAFE,+BAGF+d,EAAWJ,KAAMK,OAAON,GACxBlb,EAAU,CACdic,KAAMs2D,EACNr4D,IAdsC,OAetCm4D,cAAeA,GAEXG,QAAkBj3D,EAASD,KAAK9d,EAAMwC,GAC5C,GAAiC,MAA9BwyE,EAAU1yE,KAAKwG,WAChB,MAAM,IAAIzC,MAAM2uE,EAAU1yE,KAAKR,cAEjC,OAAOkzE,EAAU1yE,KAAKmc,MCPXw2D,GAA8Bx0D,GACzB,OAATA,EAIIy0D,GAA+Bz0D,IAC1C,MAAM00D,EAAe,oBAErB,MADuB,CAAC,YAAa,YAAa,WAAY,YACxCxL,MAAOhsE,QACRqH,IAAZyb,EAAK9iB,IAAoD,OAAhC8iB,EAAK9iB,GAAGX,MAAMm4E,KAS5CC,GAA6CA,CAACtB,EAAmBtsE,EAA2BqF,IAKzFinE,EAAQ/wD,IAAI,CAAC1X,EAAgBgqE,KAClC,MAAMC,EAAQvxD,MAAM4O,QAAQtnB,EAAOkwD,MAAM8Q,MAAOhhE,EAAOkwD,MAAM8Q,KAAM,CAAChhE,EAAOkwD,MAAM8Q,MA2BjF,OA1BgDiJ,EAAMvyD,IAAI,CAACvd,EAAY+vE,KACrE,GAAiB,SAAd/vE,EAAKupB,MAAiC,iBAAdvpB,EAAKspB,KAAe,CAAC,IAAD0mD,EAAAC,EAAAC,EAAAC,EAC7C,MAAM1mE,EAAkB5D,EAAOkwD,MAAMlS,MAAMksB,GACrCrmE,EAAkB7D,EAAOkwD,MAAMlS,MAAMksB,EAAW,GAChDK,EAAyBpuE,GAAmC,IAAf+tE,IAAqBtmE,EAAS+f,SAC3E6mD,GAA0BruE,GAAoB+tE,IAAeD,EAAMr4E,OAAS,IAAMiS,EAAS8f,SAC3F8mD,EAAsB,CAC1BrpE,IAAKmpE,EAAoB,OAAL/oE,QAAK,IAALA,OAAK,EAALA,EAAOJ,IAAsB,QAAnB+oE,EAAEvmE,EAAS+f,gBAAQ,IAAAwmD,OAAA,EAAjBA,EAAmBnnD,OACnD3hB,IAAKkpE,EAAoB,OAAL/oE,QAAK,IAALA,OAAK,EAALA,EAAOH,IAAsB,QAAnB+oE,EAAExmE,EAAS+f,gBAAQ,IAAAymD,OAAA,EAAjBA,EAAmBnnD,SAE/CynD,EAAsB,CAC1BtpE,IAAKopE,EAAoB,OAALhpE,QAAK,IAALA,OAAK,EAALA,EAAOJ,IAAsB,QAAnBipE,EAAExmE,EAAS8f,gBAAQ,IAAA0mD,OAAA,EAAjBA,EAAmBrnD,OACnD3hB,IAAKmpE,EAAoB,OAALhpE,QAAK,IAALA,OAAK,EAALA,EAAOH,IAAsB,QAAnBipE,EAAEzmE,EAAS8f,gBAAQ,IAAA2mD,OAAA,EAAjBA,EAAmBrnD,SAUrD,MARoC,CAClC0nD,UAAWF,EAAWrpE,IACtBwpE,UAAWH,EAAWppE,IACtBwpE,SAAWH,EAAWtpE,IACtB0pE,SAAWJ,EAAWrpE,IACtB2oE,aAAcA,EACde,cAAeb,GAInB,OAAO,OAEWvkD,OAAOikD,IAA4BjkD,OAAOkkD,MAE/D1oC,OAeG6pC,GAAgDA,CAACvC,EAAmBwC,KACxEA,EAAkB7lD,QAAS8lD,IACzB,IAAIA,EAAUnhF,MAAO,CAAC,IAADohF,EAAAC,EACnB,MAAMC,EAA8D,QAAlCF,EAAG1C,EAAQyC,EAAUlB,qBAAa,IAAAmB,OAAA,EAAO,QAAPC,EAA/BD,EAAiCjb,aAAK,IAAAkb,OAAA,EAAtCA,EAAwCpK,KAAKkK,EAAUH,eACzFM,IACDA,EAAWC,kBAAoBJ,MAI9BzC,GAGI8C,GAAkCA,KAyB7C,OAjBiCp5D,UAE/B,MAAMu3D,EAAoCK,GAA2CyB,EAAK/C,QAAS+C,EAAKrvE,iBAAkBqvE,EAAKhqE,OAC/H,IACE,GAAGkoE,EAAc93E,OAAS,EAAG,CAC3B,MAAMq5E,QAA+C1B,GAAwBG,GAC7E8B,EAAK/C,QAAUuC,GAA8CQ,EAAK/C,QAASwC,IAG/E,MAAMr7E,GACJ,MAAMyhB,EAAcM,SACjBP,GAAYmlC,MAAMllC,IACnB2E,QAAQjsB,MAAM6F,GAGlB,OAAO47E,EAAK/C,UCrHTt2D,eAAes5D,GAActvE,EAA2BqD,EAA8BgC,EAAc5B,EAA0BxU,EAAYysE,GAC/I,IAEE,MAAM6T,EAAmB,GAEnBC,EAAoC,GAEpCC,EAA0B,GAE1B1sE,EAAYikB,GAAqB3hB,EAAMilB,eAEvColD,EAEiB,QAAlBhU,EACMtrE,KAAK47E,IAAI3oE,EAAsBmsE,GAGd,QAAlB9T,EACCtrE,KAAK47E,IAAI3oE,EAAsBosE,GAG/Br/E,KAAK47E,IAAI3oE,EAAsBksE,GASpCnF,EAAoB3mE,EAAavC,cAAclB,EAAkB0vE,GAEjEC,EAA8Bv/E,KAAKC,MAAM+5E,EAAYr4E,UAAU,KAErE,IAAI69E,EAAkD,CAEpD5sC,cAAev/B,EAAapB,mBAAmBrC,GAE/CvB,UAAWuB,EAAkB2f,GAA6BsjB,OAAQtjB,GAA6BujB,QAE/F2sC,kBAAmBF,EAEnBtsC,WAAY5/B,EAAa3S,WAAY8uB,GAAW0jB,SAAU1jB,GAAW2jB,cAErEusC,cAAc,EAEdjvD,SAAU5xB,GAGZ,MAAM8gF,EAActsE,EAAazB,YAAYhC,GAAkB0C,WAC5DqtE,GAA+B,KAAhBA,IAChBH,EAAa/pE,YAAA,GACR+pE,EAAc,CACjBp4E,SAAUu4E,KAId,MAAMC,EAAUvsE,EAAaxJ,YAoB7B,OAnBG+1E,GAAuB,KAAZA,IACZJ,EAAa/pE,YAAA,GACR+pE,EAAc,CACjBpsC,KAAMwsC,KAIVJ,EAAa/pE,YAAA,GACR+pE,EAAc,CACjB3hD,UAAW,CACTC,OAAQnrB,EAER6X,MAAOvV,EAAMsjB,eAAe15B,GAC5Bk/B,mBAAoBprB,EACpBqrB,kBAAmB/oB,EAAMsjB,0BvGtC1B3S,eAA6C1oB,GAElD8/B,GAAY9/B,GACZ,MAAMkL,EAAOie,GAAgB,yBACvBP,EAAMrQ,YAAA,GACPgQ,IAELM,KAAMC,SAASC,QAAQC,KAAK,gBAAkB,oCAE9C,MAAMC,EAAWJ,KAAMK,OAAON,GAExBY,QAAiBP,EAASD,KAAK9d,EAAMlL,GAG3C,OAAuB,MAApBwpB,EAASpc,QAAkBoc,EAAShc,KAC9Bgc,EAAShc,KAQT,KuGmBkDm1E,CAA8BL,GAEvF,MAAMn8E,GAKN,OAHGwhB,GAAYmlC,MAAM5kC,WACnBqE,QAAQjsB,MAAM6F,GAET,M,OC3FX,MAAMy8E,IA+FLrS,GA/FKqS,MAEGC,gBAAkB,qCAFrBD,GAIGE,aAAe,EAJlBF,GAOGG,gBAAkB,KACvB,MAAMC,EAAUv7D,OAAOw7D,aAAaC,QAAQN,GAAiBC,iBAC7D,OAAGG,EACM7kD,KAAK/6B,MAAM4/E,GAGb,IAbLJ,GAiBGO,eAAkB31E,IACvB,MAAM7J,GAAM,IAAIN,MAAOoB,UAOvB,OANA6D,OAAOC,KAAKiF,GAAMmuB,QAASxN,IAEtB3gB,EAAK2gB,GAAK9mB,MAAQ1D,UACZ6J,EAAK2gB,KAGT3gB,GAzBLo1E,GA4BGQ,aAAe,CAACj1D,EAAapW,KAClC,IAAIsrE,EAAqBT,GAAiBG,kBAE1CM,EAAUT,GAAiBO,eAAeE,GAC1C,MAAMh8E,EAAQlE,YAAQ,IAAIE,KAAQu/E,GAAiBE,cAAcr+E,UACjE4+E,EAAQl1D,GAAO,CACb9mB,MAAOA,EACP0Q,MAAOA,GAET0P,OAAOw7D,aAAaK,QAAQV,GAAiBC,gBAAiB1kD,KAAKC,UAAUilD,KArC3ET,GAwCGW,aAAe76D,MAAOjT,EAAmBI,KAC9C,MACM2tE,EADqBZ,GAAiBG,kBACbttE,GAC/B,IACE,GAAG+tE,EACD,OAAO,IAAIhpD,GAAMgpD,EAAezrE,OAG7B,GAAGlC,EAAW,CAEjB,IAAI4nB,EACJ,OAAO5nB,GAEL,KAAKP,GAAUmuE,QACb,MAAMC,QAAsB5uB,GAAuBr/C,GACnDgoB,EAASimD,EAAcxpD,SAASX,OAAO,IAAImqD,EAAcxpD,SAASV,QAClE,MAEF,KAAKlkB,GAAUquE,WAGf,KAAKruE,GAAUsuE,QAEf,KAAKtuE,GAAUmnD,iBACbh/B,EAAShoB,EAGb,QAAcvF,IAAXutB,EAAsB,CAEvB,MAAMyb,QAAe7a,GAAiBZ,GACtC,GAAGyb,EAAO/wC,OAAS,EAAG,CACpB,MAAM4P,EAAQmhC,EAAO,GAGrB,OADA0pC,GAAiBQ,aAAa3tE,EAAWsC,GAClC,IAAIyiB,GAAMziB,IAQrB,OAAO,KAIT,OAAO,KAET,MAAMzX,GAIJ,OAAO,OAKEsiF,U,UC5GR,MAAMiB,GAAoD,CAChE,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,MACT,MAAS,OCnDJC,GAAkBA,CAACC,EAA4Bj8E,EAAsBY,KAEzE,MAAMs7E,EAAyB,QAAZt7E,EAAmB,MAAOA,EAEvCu7E,EAAmBrhF,OAAOkF,EAAaH,QAAQ,UAAU,KAC/D,GAAIo8E,EAAWxM,KAIf,OADctoD,MAAM4O,QAAQkmD,EAAWxM,MAAOwM,EAAWxM,KAAM,CAACwM,EAAWxM,OAC9D9uE,KAAMiI,IAEjB,MAAMwzE,EAAiBF,IAAetzE,EAAKspB,KAAKmqD,aAG1CC,EAAgBH,IAAqBrhF,OAAO8N,EAAK9N,QACvD,OAAOshF,GAAkBE,KAahBC,GAAqB37D,MAAOnc,EAAwBC,EAAwBjI,EAAeuD,EAAsBY,KAQ5H,MAAM47E,EAAQ,IAAIt5E,GAElB,GAAGzD,GAASg9E,uBAAuB77E,GACjC,OAAO47E,EAGT,MAAME,EAAwBl8E,OAAOC,KAAKs7E,IAAwBp7E,KAAMg8E,GAC/DZ,GAAuBY,KAAiBl4E,GAE3Cm4E,EAAwBp8E,OAAOC,KAAKs7E,IAAwBp7E,KAAMg8E,GAC/DZ,GAAuBY,KAAiBj4E,GAEjD,IAAK,IAADm4E,EACF,IAAIH,IAA0BE,EAC5B,MAAM,IAAInzE,MAAM,iIAGlB,MAAMqzE,Q7EgQHl8D,eAA8BgvD,EAAwBC,EAAwB35C,GACnF,MAAMpV,EAAMrQ,YAAA,GACPgQ,GAAmB,GACnByV,GAELnV,KAAMC,SAASC,QAAQC,KAAK,gBAAkB,oCAC9C,MAAMC,EAAWJ,KAAMK,OAAON,GACxB5oB,EAAS,CACb,KAAQ,QACR,KAAQ03E,EACR,GAAMC,GAGR,IACE,IAAInuD,QAAiBP,EAASQ,IAAI,OAAQ,CAAEzpB,WAC5C,GAAwB,MAApBwpB,EAASpc,OACX,MAAM,IAAImE,MAAM,gBAElB,GAAGiY,EAAShc,KAAK4mD,UACf,OAAO5qC,EAAShc,KAAK4mD,UAGrB,MAAM,IAAI7iD,MAAM,4BAGpB,MAAMpL,GACJ,MAAMA,G6E1RoB0+E,CAAeL,EAAuBE,GAE1DjxB,EAAsB,OAAXmxB,QAAW,IAAXA,OAAW,EAAM,QAAND,EAAXC,EAAarN,YAAI,IAAAoN,OAAA,EAAjBA,EAAmB3qD,KACpC,IAAIy5B,EACF,MAAM,IAAIliD,MAAM,6IAKlB,MAAMuzE,QAA0B/vB,GAAkBtB,EAAUlvD,GAAS,GACrE,IAAIq9E,OAAa1xE,EAKjB,GAJG40E,EAAkBC,YACnBnD,EAAakC,GAAgBgB,EAAkBC,UAAWj9E,EAAcY,KAGtEk5E,EAAY,CACd,MAAMoD,QAA4BjwB,GAAkBtB,EAAUlvD,GAAS,GACpEygF,EAAoBD,YACrBnD,EAAakC,GAAgBkB,EAAoBD,UAAWj9E,EAAcY,IAG9E,IAAIk5E,EAAY,CACd,MAAM50E,EAAe,wLAAsC,iBAAAkE,OAClDpJ,EAAY,MAAI,6BAAAoJ,OACd3E,EAAc,MAAI,6BAAA2E,OAClB1E,EAAc,MAAI,6BAAA0E,OAClBxI,GACX,MAAM,IAAI6I,MAAMvE,GAGlB,OADAs3E,EAAM7zE,oBAAoBlM,EAASq9E,GAC5B0C,EAET,MAAMn+E,GAKJ,OAAO,IAAI6E,K,OCrGA,MAAMi6E,GAsCnB,aAAaxuE,GACX,OAAO9L,KAAKu6E,IAAI7kD,IAAI5pB,GAOtB,qBAAqBA,GACnB,OAAO9L,KAAKw6E,YAAY9kD,IAAI5pB,GAO9B,0BAA0BA,GACxB,OAAO9L,KAAKy6E,oBAAsB3uE,EAOpC,0BAA0BA,GACxB,OAAO9L,KAAK06E,oBAAsB5uE,EAOpC,0BAA0BA,GACxB,OAAO9L,KAAK26E,oBAAsB7uE,EAOpC,yBAAyBA,GACvB,OAAO9L,KAAK46E,mBAAqB9uE,GAEpC85D,GAjFoB0U,MAEHO,QAAU,SAFPP,GAIHQ,QAAU,SAJPR,GAMHS,UAAY,UANTT,GAQHU,UAAY,UARTV,GAUHG,kBAAoB,SAVjBH,GAYHI,kBAAoB,SAZjBJ,GAcHK,kBAAoB,SAdjBL,GAgBHM,iBAAmB,SAhBhBN,GAmBHC,IAAM,IAAIx+B,IAAI,CAC5Bu+B,GAAcO,QACdP,GAAcS,UACdT,GAAcQ,QACdR,GAAcU,YAvBGV,GA2BHE,YAAc,IAAIz+B,IAAI,CACpCu+B,GAAcG,kBACdH,GAAcI,kBACdJ,GAAcK,kBACdL,GAAcM,mB,kCCvBX,IAAKK,GAAiB,SAAjBA,GAAiB,OAAjBA,EAAiB,UAAjBA,EAAiB,UAAjBA,EAAiB,KCJ7B,MAAMC,GAA6BC,GAAY73D,IAAKplB,GAC3CA,EAAEoB,MAGL87E,GAA6BC,GAAY/3D,IAAKplB,GAC3CA,EAAEoB,MAIJ,MAAMg8E,GAYXz7E,YAAYkG,GAXK,KACjBw1E,qBAAe,EACE,KACjBC,eAAS,EACW,KACpBC,oBAAc,EACK,KACnBC,sBAAgB,EACE,KAClB31E,UAAI,EAGF/F,KAAKu7E,iBAAkB,EACvBv7E,KAAKy7E,eAAiB,EACtBz7E,KAAKw7E,UAAY,GACjBx7E,KAAK07E,kBAAmB,EACxB17E,KAAK+F,KAAOA,EAOd,oBAAoB41E,GAClB,MAAMH,EAAoC,IAAIz/B,IAW9C,OAVA4/B,EAAQ3qD,QAAS9yB,IAEZg9E,GAAiBl9E,SAASE,IAC3Bs9E,EAAUI,IAAIX,GAAkBY,KAG/BT,GAAiBp9E,SAASE,IAC3Bs9E,EAAUI,IAAIX,GAAkBa,OAG7Bx3D,MAAMC,KAAKi3D,GAMpBO,gBACE,GAAI/7E,KAAKu7E,iBAKJ,GAAGv7E,KAAKw7E,UAAUx9E,SAASi9E,GAAkBY,KAChD77E,KAAK07E,iBAA2C,IAAxB17E,KAAKy7E,oBAG1B,GAAGz7E,KAAKw7E,UAAUx9E,SAASi9E,GAAkBa,KAAM,CACtD,MAAME,EAAsB,CAAC,6CAAW,0DACxCh8E,KAAK07E,iBAAmBM,EAAoBzW,KAAMrnE,GAAa8B,KAAK+F,KAAKspB,KAAKrxB,SAASE,UAVvF8B,KAAK07E,kBAAmB,GC5C9B,MAAMO,GAAsDC,GAEtDhB,GAA6BC,GAAY73D,IAAKplB,GAC3CA,EAAEoB,MAGL87E,GAA6BC,GAAY/3D,IAAKplB,GAC3CA,EAAEoB,MAGL68E,GAAgCjB,GAAiB30E,OAAO60E,IAqC/C,MAAMgB,GAuBnBv8E,YAAY+L,GAPO,KACnBywE,eAAS,EAC0B,KACnCC,qBAAe,EACA,KACf1wE,YAAM,EAGJ5L,KAAKq8E,UAAY,GACjBr8E,KAAKs8E,gBAAkB,GACvBt8E,KAAK4L,OAASA,EAMhB2wE,wBAEEv8E,KAAKs8E,gBAAkBt8E,KAAK4L,OAAOkwD,MAAM8Q,KAAKtpD,IAAKvd,GAC1C,IAAIu1E,GAAev1E,KAEE/F,KAAK4L,OAAO2gE,qBAAqB/uE,OAAQwC,KAAK4L,OAAO2gE,qBAAsB,CAACvsE,KAAK4L,OAAO2gE,uBAChGv7C,QAASwrD,IAE7B,MAAM3P,EAAiB50E,OAAOukF,EAAI3P,gBAE5B4P,EAAuBz8E,KAAKs8E,gBAAgBzP,EAAe,GAI3D6P,GAFWF,EAAI5P,KAAKpvE,OAAQg/E,EAAI5P,KAAM,CAAC4P,EAAI5P,OAEVtpD,IAAKvd,GAAqBA,EAAKzG,MAEtE,IAAIq9E,EAAqBD,EAAYxS,MAAOnkE,GACnCo2E,GAAoBn+E,SAAS+H,IAGtC,MAAMgnE,EAAiB/sE,KAAK4L,OAAOkwD,MAAMlS,MAAMijB,EAAe,GAAGz9C,QAAQ9vB,KACnE0tE,EAAiBhtE,KAAK4L,OAAOkwD,MAAMlS,MAAMijB,GAAgBz9C,QAAQ9vB,KACvEq9E,EAAqBA,QAA4Dp3E,IAAtC02E,GAAkBlP,SAAuExnE,IAAtC02E,GAAkBjP,GAGhH,MAAM4P,EAAY58E,KAAK4L,OAAO2hE,MAAMh8C,OAAQ4+B,GACxB,WAAXA,EAAEqd,MACPv1E,OAAOk4D,EAAE0sB,gBAAkB,IAAMhQ,GACjC50E,OAAOk4D,EAAE2sB,aAAeC,MAAalQ,GAGzC,IAAI4O,EAAiBtjF,KAAKgB,OAAOyjF,EAAUt5D,IAAK6sC,GACvCl4D,OAAOk4D,EAAEwd,UAGlB8N,EAAiBA,IAAmBsB,IAAU,EAAGtB,EACjDgB,EAAqBlB,gBAAkBoB,EACvCF,EAAqBhB,eAAiBA,EACtCgB,EAAqBjB,UAAYF,GAAe0B,aAAaN,GAC7DD,EAAqBV,kBAOzB3O,wBAEE,MAAM6P,EAA+C,CACnDC,gBAAiB,GACjBC,YAAa,GACbC,YAAa,GACb5B,UAAW,IAGb,IAAI6B,EAAkD7pD,KAAK/6B,MAAM+6B,KAAKC,UAAUwpD,IAChFj9E,KAAKs8E,gBAAgBtrD,QAAQ,CAACssD,EAAMhzD,KAClC,MAAMizD,EAAgE,IAAtDF,EAA2BH,gBAAgB1/E,OAC3D,GAAG8/E,EAAK5B,iBAAkB,CAExB,GAAG6B,EAAS,CACV,MAAM/tE,EAAWxP,KAAK4L,OAAOkwD,MAAMlS,MAAMt/B,GAAK8E,QAAQ9vB,KACtD+9E,EAA2BH,gBAAgB7rD,KAAK7hB,GAGlD,MAAMC,EAAWzP,KAAK4L,OAAOkwD,MAAMlS,MAAMt/B,EAAI,GAAG8E,QAAQ9vB,KACxD+9E,EAA2BH,gBAAgB7rD,KAAK5hB,GAEhD,MAAM7V,EAAUoG,KAAK4L,OAAOkwD,MAAM8Q,KAAKtiD,GAAKpkB,eAAeC,SAASC,KACpEi3E,EAA2BF,YAAY9rD,KAAKz3B,GAE5CyjF,EAA2BD,YAAY/rD,KAAK/G,GAE5C,MAAMkzD,EAAY,IAAIzhC,IAAIshC,EAA2B7B,UAAUj1E,OAAO+2E,EAAK9B,YAC3E6B,EAA2B7B,UAAal3D,MAAMC,KAAKi5D,QAG5CD,IACPv9E,KAAKq8E,UAAUhrD,KAAKmC,KAAK/6B,MAAM+6B,KAAKC,UAAU4pD,KAC9CA,EAA6B7pD,KAAK/6B,MAAM+6B,KAAKC,UAAUwpD,OAIW,IAAtDI,EAA2BH,gBAAgB1/E,QAEzDwC,KAAKq8E,UAAUhrD,KAAKmC,KAAK/6B,MAAM+6B,KAAKC,UAAU4pD,KAQlDI,uBAAuB7xE,GAAiB,IAAD8xE,EAErC,MAAMC,GAA0C,QAAjBD,EAAA19E,KAAKq8E,UAAU,UAAE,IAAAqB,OAAA,EAAjBA,EAAmBP,YAAY,KAAM,GAE9DS,EAAsB,IAAIllF,KAAKilF,GAElCnmF,GAASqmF,wBAAwBD,IAClC59E,KAAKq8E,UAAUrrD,QAAS8sD,IAEtB,MAAMC,EAAgB3B,GAAU4B,kBAAkBF,GAElDA,EAASV,YAAYpsD,QAAS1G,IAC5B1e,EAAOkwD,MAAM8Q,KAAKtiD,GAAK2zD,WAAa,CAClC35B,IAAKy5B,EACLtpF,KAAMqpF,EAAStC,eAWzB,yBAAyBsC,GACvB,MAAMI,EAAkBJ,EAASZ,gBAAgB55D,IAAKwsD,GAC7CmM,GAAkBnM,GAAaqO,YAElCC,EAAiBF,EAAgBpmF,MAAM,EAAGomF,EAAgB1gF,OAAS,GACnEkuE,EAAiBwS,EAAgBpmF,MAAM,GACvCumF,EAAgC,CACpCC,4BAA6B9qD,KAAKC,UAAU2qD,GAC5CG,0BAA2B/qD,KAAKC,UAAUi4C,GAC1C8S,cAAehrD,KAAKC,UAAUqqD,EAASX,aACvCsB,UAAWrC,GAAUsC,UACrBC,UAAWvC,GAAUwC,UACrB1c,WAAYka,GAAUyC,WACtB1c,WAAYia,GAAU0C,WACtB1c,aAAcga,GAAU2C,aACxBC,YAAa5C,GAAU6C,aAEzB,MAAM,GAAN14E,OAAU61E,GAAU8C,SAAQ,KAAA34E,OAAI,IAAIsuB,gBAAejnB,YAAC,GAAIywE,IAAe5zE,YAOzE,kCAAkCmB,EAAgB5U,GAEhD,IAAI4U,EAAO2gE,sBAAwBv1E,IAASF,EAAKG,GAC/C,OAEF,MAAMkoF,EAAY,IAAI/C,GAAUxwE,GAEhCuzE,EAAU5C,wBAEV4C,EAAU/R,wBAEV+R,EAAU1B,uBAAuB7xE,IC9LrC,SAASwzE,GAAsBC,EAA2B90E,EAAgCvT,GAExF,OAAIqoF,EAIG90E,EAAuB6zD,GAAoBpnE,GAAMsoF,MAAOlhB,GAAoBpnE,GAAMuoF,MAHhFnhB,GAAoBpnE,GAAMsoF,MAOrC,SAASE,GAAyBH,EAA2B90E,GAC3D,OAAI80E,EAIG90E,EAAuB,QAAS,QAH9B,QAMX,SAASk1E,GAAY76E,EAAYC,EAAY66E,EAAiB,IAC5D,IAAI70E,EAAQjG,EAAM,IAKlB,MAJe,KAAZ86E,IACD70E,GAAS60E,EAAU,KAErB70E,GAAShG,EACFgG,EAQF,SAAS80E,GAAa/zE,EAAgB7D,GAG3C,IAAI63E,EAAiBh0E,EAAOkwD,MAAM8Q,KAAKtpD,IAAI,CAACvd,EAAMwd,IACxCxd,EAAKupB,MAAsB,SAAdvpB,EAAKupB,KAAkB/L,EAAO,MAEpDgO,OAAQxrB,GAAyB,OAATA,GAEzB,OAAQgC,EAAkB63E,EAAe9nF,OAAO,GAAI8nF,GAAgB,GAkJtE,SAAUC,GAAgBlyE,GAAgD,MAChExQ,EAAiBwQ,EAAOnZ,QAAxB2I,aAEFuQ,QAAqBq7B,eAErB5qC,EAAcuP,EAAMyO,UAAU9a,cACpC,UACQy+E,aAAIzoE,IAAgB,IAE1B,MAAM0oE,EAAMxiB,KAGNyiB,EAA6B,CACjC3iB,qBAAqB,EACrBz0C,SAAUlb,EAAMyO,UAAUpX,MAAM/N,KAChC+G,QAASI,GAELiD,QAAe6+E,aAAKF,EAAK5iF,EAAcuQ,EAAMyO,UAAUtkB,KAAMmoF,EAA4BtyE,EAAMyO,UAAU9a,qBAEzGy+E,aAAI3qF,EAAaI,QAAQ,CAAE4H,gBAAgBiE,IACjD,MAAOzL,SACDmqF,aAAI3qF,EAAaO,KAAK,CAAEyH,gBAAgBxH,UACxCmqF,aAAIzoE,IAAgB,KAK9B,SAAU6oE,GAAavyE,GAA6C,MAC1DxQ,EAAiBwQ,EAAOnZ,QAAxB2I,aAEFuQ,QAAqBq7B,eAE3B,UACQ+2C,aAAIzoE,IAAgB,IAE1B,MAAM0oE,EAAMxiB,KAGNx4D,EAAQ2I,EAAMyO,UAAUpX,MACxBo7E,EAAYzyE,EAAMyO,UAAUpU,iBAAkBhD,EAAMK,IAAKL,EAAMM,IAC/D+6E,EAAoB1yE,EAAMyO,UAAU/a,SAAW2D,EAAM5H,cACjCgjF,GAAaz5E,YAAUgH,EAAMyO,UAAUtkB,KAAMsoF,GAEjE/6E,EAAMsI,EAAMyO,UAAUpX,MAAMK,IAAMsI,EAAMyO,UAAUpX,MAAMK,IAAMsI,EAAMyO,UAAUtkB,KAE9EwN,EAAMqI,EAAMyO,UAAUpX,MAAMM,IAAMqI,EAAMyO,UAAUpX,MAAMM,IAAMqI,EAAMyO,UAAUtkB,KAE9EA,EAAO6V,EAAMyO,UAAUtkB,KAEvBb,EAAO0W,EAAMyO,UAAUpX,MAAM/N,KAE7BysE,EAAgB/1D,EAAMyO,UAAU9a,cACtC,IAAIg/E,EAAmBzjF,GAAS0jF,sBAAsB7c,GAKtD,MAAM8c,EAAgBH,IAAqB15E,YAAUtB,EAAKC,GAAQD,EAAMvN,EAIlE2oF,EAAgB,CACpB53D,SAAU5xB,EACV+G,QAJkBnB,GAAS0gE,eAAemG,IAOtC33D,EAAW4B,EAAMyO,UAAUpX,MAAM+G,SAEjC20E,EAAoBnG,GAAcoG,cAAc50E,GAGtD,IAAI1K,EAASi/E,QACLJ,aAAKF,EAAKryE,EAAMyO,UAAUhf,aAAcojF,EAAcC,EAAe9yE,EAAMyO,UAAU9a,qBACrF4+E,aAAKvG,GAAoBhsE,EAAMyO,UAAUpX,MAAMC,gBAAiB0I,EAAMyO,UAAUpX,MAAME,cAAes7E,EAAc7yE,EAAMyO,UAAUpX,MAAM5H,aAAcuQ,EAAMyO,UAAU9a,eAO/K,GAL2B,KAAxBD,EAAOiB,cAAuBo+E,IAC/BJ,GAAmB,EACnBj/E,QAAe6+E,aAAKvG,GAAoBhsE,EAAMyO,UAAUpX,MAAMC,gBAAiB0I,EAAMyO,UAAUpX,MAAME,cAAes7E,EAAc7yE,EAAMyO,UAAUpX,MAAM5H,aAAcuQ,EAAMyO,UAAU9a,gBAGrLo/E,EAAmB,CAEpB,MAAMznF,EAAM,IAAIN,KAEhB,GADgBQ,YAAyBrB,EAAMmB,IACjC,EACZ,MAAM,IAAI4N,MAAM,0PAIpB,IAAK8G,EAAMyO,UAAUpU,mBAAqBs4E,IAExCj/E,EAAOqF,0BAA0B5O,GAE7BuJ,EAAOuB,yBAA2By9E,GAAkB,CAEtD,MAAMO,EAAgBzlF,YAAQrD,EAAM,GAEpCuJ,QAAe6+E,aAAKF,EAAKryE,EAAMyO,UAAUhf,aAAcwjF,EAAeH,GAEtEp/E,EAAOqF,0BAA0B5O,GAE7BuJ,EAAOuB,yBAA0BvB,EAAS,IAAIf,IAsBtD,GAjBGggF,GAAoBzjF,GAASg9E,uBAAuBnW,IAClD7mE,GAASg9E,uBAAuBnW,KAEjCriE,EAAOvI,YAAa,GAEnBunF,GAEDh/E,EAAO0D,cAAcC,IAMvB3D,EAAOkE,mBAAmBP,EAAO2I,EAAMyO,UAAU/a,QAEnDA,EAAOoE,yBACPpE,EAAOuF,cACoB,KAAxBvF,EAAOiB,aAAqB,CAE7B,MAAM+oD,EAAW19C,EAAM2O,OAAOoW,SAAS9V,SAEjC9jB,EAAa+nF,GAAiBlzE,EAAMyO,UAAWivC,GACrDhqD,EAAOwE,cAAc/M,GAGvB,MAAMgoF,EAAkB,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OA8BxF,GA5B2BC,MAEzB,IAAKryB,GAAKW,SAAS1hD,EAAM2O,OAAOoW,SAAS9V,YAAc8xC,GAAKU,UAAUzhD,EAAM2O,OAAOoW,SAAS9V,YACzFjP,EAAMyO,UAAUhQ,0BAA2B,CAM5C,GAAGuB,EAAMyO,UAAUpU,kBACwB,KAAzC2F,EAAMyO,UAAU/Q,uBACfsC,EAAMyO,UAAUhQ,2BACjB00E,EAAgB7iF,SAASoD,EAAOQ,gBAEhC,OAAO,EAGJ,GAAGhF,GAASmkF,wBAAwBtd,GACvC,OAAO,EAGJ,GAAqB,QAAlBA,EACN,OAAO,EAGX,OAAO,GAGLqd,GAEF,kBADMhB,aAAI5qF,GAAuB,WAG3B4qF,aAAI5qF,GAAuB,UAE7B4qF,aAAIjqF,EAAUN,QAAQ,CAAE4H,gBAAgBiE,IAC9C,MAAOzL,GAEJ4nB,QAIGuiE,aAAIvoE,GAAmB,wBAEvBuoE,aAAI7qF,GAAgC,UACpC6qF,aAAIjqF,EAAUH,KAAK,CAAEyH,gBAAgBxH,UACrCmqF,aAAIzoE,IAAgB,KAQ9B,SAAU2pE,KAER,MAAMtzE,QAAqBq7B,eACrBuqB,EAAU,CACd2tB,WAAYvzE,EAAMyO,UAAU9Q,oBAAsB,SAAW,QAC7D61E,eAAgBxzE,EAAMyO,UAAU7Q,wBAA0B,SAAW,QACrE61E,iBAAkBzzE,EAAMyO,UAAU5Q,YAAc,KAAO,SACvD61E,qBAAsB1zE,EAAMyO,UAAU5Q,YAAc,KAAO,OAE3D81E,MAAO,SAGT,IACE,MAAMtB,EAAMz2B,KACNg4B,QAAkBrB,aAAKF,EAAKzsB,EAAS1K,GAAQiB,iBAE7Ci2B,aAAIzpF,EAAad,QAAQ,GAAK+rF,IACpC,MAAO3rF,SACDmqF,aAAIzpF,EAAaX,KAAK,GAAIC,UAC1BmqF,aAAIzoE,IAAgB,KA4D9B,SAAWkqE,KAET,MAAM7zE,QAAqBq7B,eAErB5sB,EAAYzO,EAAMyO,UAClBD,EAAUxO,EAAMwO,cAQhB4jE,aAAIzoE,IAAgB,UAEpByoE,aAAI3oE,IAAyB,UAG7B2oE,aAAIxrF,EAAiB,aAErBwrF,aAAInrF,EAAwB,WAE5BmrF,aAAIhrF,EAAa,KAEvB,IAEE,GAA4B,KAAxBqnB,EAAUrR,UAAoB,MAAMlE,MAAM,gBAC9C,MAAMm5E,EAAMz2B,KAENvhD,EAAmBoU,EAAUpU,iBAE7BqD,EAAuB+Q,EAAU/Q,qBACjCgC,EAAQM,EAAMyO,UAAU/O,MAIxBo0E,EAAaz5E,EAAmBoU,EAAU3Q,aAAavC,cAAcyE,EAAMyO,UAAUpU,iBAAkBoU,EAAU/Q,sBAAwB+Q,EAAU3Q,aAAavC,cAAcyE,EAAMyO,UAAUpU,kBAE9LlP,EAAa6U,EAAMyO,UAAU3Q,aAAa3S,WAC1CuI,EAASsM,EAAMyO,UAAU3Q,aACzBxU,EAAO0W,EAAMyO,UAAUpX,MAAM/N,KAE7BuT,EAAwBmD,EAAMyO,UAAU5R,sBAExCk5D,EAAgB/1D,EAAMyO,UAAU9a,cAEhCvB,EAAciI,EAAmB3G,EAAOQ,eAAiBR,EAAOS,eAChE9B,EAAcgI,EAAmB3G,EAAOU,eAAiBV,EAAOW,eACtE,IAAI0/E,EAAe,GAIfC,GAAmB,EAEvB,GAAGtgF,EAAOwI,aACR,MAAM,IAAIhD,MAAM,sEAGlB,IAAI+6E,EAwgBD,SAAoC9oF,EAAqBuI,EAAoBpK,EAAYuT,EAAgCxC,GAC9H,MAAMjI,EAAciI,EAAmB3G,EAAOQ,eAAiBR,EAAOS,eAChE9B,EAAcgI,EAAmB3G,EAAOU,eAAiBV,EAAOW,eAItE,IAAI0/E,EAAe,GACfG,EAAkB,GAClBF,GAAmB,EAGvB,GAAI35E,EACF,OAAQjI,GACN,IAAK,MACL,IAAK,MAEH2hF,EAAe5oF,EAAaulE,GAAoBpnE,GAAM6qF,QAAUzjB,GAAoBpnE,GAAM8qF,QAC1FF,EAAkB/oF,EAAY,UAAW,UACzC,MAEF,IAAK,MAGH,OADoBuI,EAAO6I,eAAelC,IAGxC,KAAK,EACH05E,EAAerjB,GAAoBpnE,GAAM+qF,MACzCH,EAAkB,QAClB,MAEF,KAAK,EACHH,EAAerjB,GAAoBpnE,GAAMuoF,MACzCqC,EAAkB,QAClB,MAEF,KAAK,EACHH,EAAerjB,GAAoBpnE,GAAMsoF,MACzCsC,EAAkB,QAClB,MAEF,IAAK,MAMHH,EAAerC,IA1CS7hE,EA0C+BhT,EAAuBvT,GAE9E4qF,EAAkBpC,IA5CMjiE,EA4CqChT,GAE7Dm3E,GAAmB,EAGvB,MAEF,IAAK,MAE4C,IAA5CtgF,EAAO8I,eAAenC,IACvB05E,EAAerjB,GAAoBpnE,GAAMgrF,MACzCJ,EAAkB,UAGlBH,EAAerjB,GAAoBpnE,GAAMwrE,IACzCof,EAAkB,OAGtB,IAAK,MACC7hF,EAAY/B,SAAS,UAEnBoD,EAAOc,YAAYlE,SAAS,0CAAcoD,EAAOc,YAAYlE,SAAS,eAAwC,MAAvBoD,EAAOc,aAEhGu/E,EAAerjB,GAAoBpnE,GAAM+qF,MACzCH,EAAkB,UAElBH,EAAerjB,GAAoBpnE,GAAMuoF,MACzCqC,EAAkB,SAEX7hF,EAAY/B,SAAS,YAEiB,IAA5CoD,EAAO8I,eAAenC,IACvB05E,EAAerjB,GAAoBpnE,GAAMgrF,MACzCJ,EAAkB,UAGlBH,EAAerjB,GAAoBpnE,GAAMwrE,IACzCof,EAAkB,QAGtB,MAEF,IAAK,MAEC/oF,EAEGuI,EAAOmH,wBAAwBR,GAIzB3G,EAAOa,kBAAkBjE,SAAS,WAAQoD,EAAOa,kBAAkBjE,SAAS,UACrFyjF,EAAerjB,GAAoBpnE,GAAMirF,cACzCL,EAAkB,iBAETxgF,EAAOa,kBAAkBjE,SAAS,WAAQoD,EAAOa,kBAAkBjE,SAAS,UACrFyjF,EAAerjB,GAAoBpnE,GAAMkrF,cACzCN,EAAkB,kBAGlBH,EAAerjB,GAAoBpnE,GAAMmrF,QACzCP,EAAkB,YAblBH,EAAerjB,GAAoBpnE,GAAMmrF,QACzCP,EAAkB,YAgBpBH,EAAerjB,GAAoBpnE,GAAMorF,QACzCR,EAAkB,WAEpB,MAEF,IAAK,MAEC/oF,GACF4oF,EAAerjB,GAAoBpnE,GAAMqrF,QACzCT,EAAkB,YAElBH,EAAerjB,GAAoBpnE,GAAMsrF,QACzCV,EAAkB,WAEpB,MACF,QAEEH,EAAerjB,GAAoBpnE,GAAM8I,GACzC8hF,EAAkB9hF,OAKtB,OAAQA,GACN,IAAK,MACL,IAAK,MAEH2hF,EAAe5oF,EAAaslE,GAAennE,GAAM6qF,QAAU1jB,GAAennE,GAAM8qF,QAChFF,EAAkB/oF,EAAY,UAAW,UACzC,MAEF,IAAK,MAGH,OADoBuI,EAAO6I,eAAelC,IAGxC,KAAK,EACH05E,EAAerjB,GAAoBpnE,GAAM+qF,MACzCH,EAAkB,QAClB,MAEF,KAAK,EACHH,EAAerjB,GAAoBpnE,GAAMuoF,MACzCqC,EAAkB,QAClB,MAEF,KAAK,EACHH,EAAerjB,GAAoBpnE,GAAMsoF,MACzCsC,EAAkB,QAClB,MAEF,IAAK,MAIHH,EAAerC,IAnKS7hE,EAmK+BhT,EAAuBvT,GAE9E4qF,EAAkBpC,IArKMjiE,EAqKqChT,GAE7Dm3E,GAAmB,EAGvB,MAEF,IAAK,MAE4C,IAA5CtgF,EAAO8I,eAAenC,IACvB05E,EAAetjB,GAAennE,GAAMgrF,MACpCJ,EAAkB,UAGlBH,EAAetjB,GAAennE,GAAMwrE,IACpCof,EAAkB,OAGtB,IAAK,MAEC7hF,EAAY/B,SAAS,UAEnBnF,EAEEuI,EAAOe,YAAYnE,SAAS,0CAAcoD,EAAOe,YAAYnE,SAAS,eAAwC,MAAvBoD,EAAOe,aAEhGs/E,EAAetjB,GAAennE,GAAM+qF,MACpCH,EAAkB,UAGlBH,EAAetjB,GAAennE,GAAMuoF,MACpCqC,EAAkB,UAIpBH,EAAetjB,GAAennE,GAAMsoF,MACpCsC,EAAkB,SAGX7hF,EAAY/B,SAAS,YAEiB,IAA5CoD,EAAO8I,eAAenC,IACvB05E,EAAetjB,GAAennE,GAAMgrF,MACpCJ,EAAkB,UAGlBH,EAAetjB,GAAennE,GAAMwrE,IACpCof,EAAkB,QAGtB,MAEF,IAAK,MAEC/oF,EAEGuI,EAAOmH,wBAAwBR,GAIzB3G,EAAOe,YAAYnE,SAAS,WAAQoD,EAAOe,YAAYnE,SAAS,UACzEyjF,EAAetjB,GAAennE,GAAMirF,cACpCL,EAAkB,iBAETxgF,EAAOe,YAAYnE,SAAS,WAAQoD,EAAOe,YAAYnE,SAAS,UACzEyjF,EAAetjB,GAAennE,GAAMkrF,cACpCN,EAAkB,kBAGlBH,EAAetjB,GAAennE,GAAMmrF,QACpCP,EAAkB,YAblBH,EAAetjB,GAAennE,GAAMmrF,QACpCP,EAAkB,YAgBpBH,EAAetjB,GAAennE,GAAMorF,QACpCR,EAAkB,WAEpB,MAEJ,IAAK,MAEC/oF,GACF4oF,EAAerjB,GAAoBpnE,GAAMqrF,QACzCT,EAAkB,YAElBH,EAAerjB,GAAoBpnE,GAAMsrF,QACzCV,EAAkB,WAEpB,MACA,QAEEH,EAAetjB,GAAennE,GAAM8I,GACpC8hF,EAAkB9hF,EAKxB,MAAO,CACL2hF,aAAcA,EACdG,gBAAiBA,EACjBF,iBAAkBA,GArxBYa,CAA2B1pF,EAAYuI,EAAQpK,EAAMuT,EAAuBxC,GAI1G,GAHA05E,EAAeE,EAAwBF,aACvCC,EAAmBC,EAAwBD,iBAEvC35E,EACF,OAAQjI,GACN,IAAK,MACL,IAAK,MAEH2hF,EAAe5oF,EAAaulE,GAAoBpnE,GAAM6qF,QAAUzjB,GAAoBpnE,GAAM8qF,QAC1F,MAEF,IAAK,MAGH,OADoB1gF,EAAO6I,eAAelC,IAGxC,KAAK,EACH05E,EAAerjB,GAAoBpnE,GAAM+qF,MACzC,MAEF,KAAK,EACHN,EAAerjB,GAAoBpnE,GAAMuoF,MACzC,MAEF,KAAK,EACHkC,EAAerjB,GAAoBpnE,GAAMsoF,MACzC,MAEF,IAAK,MAIHmC,EAAerC,IAlFO7hE,EAkFiChT,EAAuBvT,GAE9E0qF,GAAmB,EAGvB,MAEF,IAAK,MAGDD,EAD6C,IAA5CrgF,EAAO8I,eAAenC,IAA2BnL,GAAS4lF,sBAAsB/e,GAClErF,GAAoBpnE,GAAMgrF,MAG1B5jB,GAAoBpnE,GAAMwrE,IAG7C,IAAK,MACCziE,EAAY/B,SAAS,UAIrByjF,EAFErgF,EAAOc,YAAYlE,SAAS,0CAAcoD,EAAOc,YAAYlE,SAAS,eAAwC,MAAvBoD,EAAOc,YAEjFk8D,GAAoBpnE,GAAM+qF,MAE1B3jB,GAAoBpnE,GAAMuoF,MAElCx/E,EAAY/B,SAAS,YAG5ByjF,EAD6C,IAA5CrgF,EAAO8I,eAAenC,GACRq2D,GAAoBpnE,GAAMgrF,MAG1B5jB,GAAoBpnE,GAAMwrE,KAG7C,MAEF,IAAK,MAQCif,EANA5oF,EAEGuI,EAAOmH,wBAAwBR,GAGzB3G,EAAOa,kBAAkBjE,SAAS,WAAQoD,EAAOa,kBAAkBjE,SAAS,SACtEogE,GAAoBpnE,GAAMirF,cAEhC7gF,EAAOa,kBAAkBjE,SAAS,WAAQoD,EAAOa,kBAAkBjE,SAAS,SACtEogE,GAAoBpnE,GAAMkrF,cAG1B9jB,GAAoBpnE,GAAMmrF,QAT1B/jB,GAAoBpnE,GAAMmrF,QAa5B/jB,GAAoBpnE,GAAMorF,QAE3C,MAEF,IAAK,MAGDX,EADE5oF,EACaulE,GAAoBpnE,GAAMqrF,QAE1BjkB,GAAoBpnE,GAAMsrF,QAE3C,MACF,QAEEb,EAAerjB,GAAoBpnE,GAAM8I,QAK7C,OAAQA,GACN,IAAK,MACL,IAAK,MAEH2hF,EAAe5oF,EAAaslE,GAAennE,GAAM6qF,QAAU1jB,GAAennE,GAAM8qF,QAChF,MAEF,IAAK,MAGH,OADoB1gF,EAAO6I,eAAelC,IAGxC,KAAK,EACH05E,EAAerjB,GAAoBpnE,GAAM+qF,MACzC,MAEF,KAAK,EACHN,EAAerjB,GAAoBpnE,GAAMuoF,MACzC,MAEF,KAAK,EACHkC,EAAerjB,GAAoBpnE,GAAMsoF,MAE3C,IAAK,MAKHmC,EAAerC,IAvLO7hE,EAuLiChT,EAAuBvT,GAE9E0qF,GAAmB,EAGvB,MAEF,IAAK,MAGDD,EAD6C,IAA5CrgF,EAAO8I,eAAenC,GACRo2D,GAAennE,GAAMgrF,MAGrB7jB,GAAennE,GAAMwrE,IAGxC,IAAK,MAECziE,EAAY/B,SAAS,UAMnByjF,EAJA5oF,EAEEuI,EAAOe,YAAYnE,SAAS,0CAAcoD,EAAOe,YAAYnE,SAAS,eAAwC,MAAvBoD,EAAOe,YAEjFg8D,GAAennE,GAAM+qF,MAGrB5jB,GAAennE,GAAMuoF,MAIvBphB,GAAennE,GAAMsoF,MAG7Bv/E,EAAY/B,SAAS,YAG5ByjF,EAD6C,IAA5CrgF,EAAO8I,eAAenC,GACRo2D,GAAennE,GAAMgrF,MAGrB7jB,GAAennE,GAAMwrE,KAGxC,MAEF,IAAK,MAQCif,EANA5oF,EAEGuI,EAAOmH,wBAAwBR,GAGzB3G,EAAOe,YAAYnE,SAAS,WAAQoD,EAAOe,YAAYnE,SAAS,SAC1DmgE,GAAennE,GAAMirF,cAE3B7gF,EAAOe,YAAYnE,SAAS,WAAQoD,EAAOe,YAAYnE,SAAS,SAC1DmgE,GAAennE,GAAMkrF,cAGrB/jB,GAAennE,GAAMmrF,QATrBhkB,GAAennE,GAAMmrF,QAavBhkB,GAAennE,GAAMorF,QAEtC,MAEJ,IAAK,MAGDX,EADE5oF,EACaulE,GAAoBpnE,GAAMqrF,QAE1BjkB,GAAoBpnE,GAAMsrF,QAE3C,MACA,QAEEb,EAAetjB,GAAennE,GAAM8I,GAK1C,IAAIu0E,EAAU,GACVxpE,EAAgB,GACpB,IACE,IAAI43E,EAAetmE,EAAUrR,UAE7B,GAAGqR,EAAUjR,YAAcP,GAAUmuE,QAAS,CAE5C,MAAMv/C,EAAe6vB,GAAajtC,EAAUtR,OAC5C43E,QA5qBR,UAA2Bv3E,EAAmBJ,EAAmBsO,GAC/D,MAAM2mE,EAAMz2B,KACZ,IAAIjgB,EACJ,OAAOn+B,GAEL,KAAKP,GAAUquE,WACf,KAAKruE,GAAUmnD,iBACbzoB,QAAe42C,aAAKF,EAAK,CACvB9wD,SAAS,GAAD1oB,OAAKuE,EAAS,SACtBgkB,IAAK65B,GAAI+5B,KACR95B,GAAQkB,YACX,MAEF,KAAKn/C,GAAUsuE,QACb5vC,QAAe42C,aAAKF,EAAK,CACvBhwD,QAAQ,GAADxpB,OAAKuE,EAAS,SACrBgkB,IAAK65B,GAAI+5B,KACR95B,GAAQmB,gBACX,MACF,QACE,OAAOj/C,EAEX,IAAIu+B,EACF,MAAM,IAAIziC,MAAM,wIAGlB,IAAI+7E,EAAiC,CACnC3S,MAAO,GACP4S,IAAK,GACLC,WAAY,GACZC,QAAS,GACT3/B,MAAO,IAGLjwB,mBAAQmW,KACVA,EAAS,CAACA,IAGZ,IAAI,MAAMx+B,KAASw+B,EAAO,CACxB,IAAIN,GAAS,EAEb,OAD4C,kBAAvBl+B,EAAMukB,QAAQE,KAAoBzkB,EAAMukB,QAAQE,KAAKlpB,KAAMyE,EAAMukB,QAAQE,MAE5F,IAAK,QACAqzD,EAAa3S,MAAMxyE,OAAS,IAC7BmlF,EAAa3S,MAAM3+C,KAAKxmB,GACxBk+B,GAAS,GAEX,MACF,IAAK,MACAl+B,EAAMukB,QAAQE,KAAKyzD,OAAO/kF,SAAS,eAAiB2kF,EAAaE,WAAWrlF,OAAS,GACtFmlF,EAAaE,WAAWxxD,KAAKxmB,GAC7Bk+B,GAAS,GAEHl+B,EAAMukB,QAAQE,KAAKyzD,OAAO/kF,SAAS,YAAc2kF,EAAaG,QAAQtlF,OAAS,GACrFmlF,EAAaG,QAAQzxD,KAAKxmB,GAC1Bk+B,GAAS,GAEH45C,EAAaC,IAAIplF,OAAS,IAChCmlF,EAAaC,IAAIvxD,KAAKxmB,GACtBk+B,GAAS,GAIXA,GACF45C,EAAax/B,MAAM9xB,KAAKxmB,GAG5B,MAAMm4E,EAAcrlF,OAAOC,KAAK+kF,GAAclxD,OAAO,CAACwxD,EAAUz/D,KAC9Dc,MAAM4+D,UAAU7xD,KAAK8xD,MAAMF,EAAUN,EAAan/D,IAC3Cy/D,GACN,IAAInrF,MAAM,EAAG,IAEhBshB,EAAYA,EAAUpc,QAAQ,KAAM,UAEpC,IAAIomF,EAAS,KAAA78E,OAAQ6S,EAAS,KAO9B,OALAgqE,GAAaJ,EAAY1/D,IAAKzY,GAAsBA,EAAMukB,QAAQ9vB,MAAS,IAE3E8jF,GAAaJ,EAAY1/D,IAAKzY,GAAwBg+C,GAASw6B,YAAYx4E,EAAMy4E,WAAgB,KAEjGF,GAAaJ,EAAY1/D,IAAI,IAAa,gBAAS,UAC5C8/D,EA2lBoBG,CAAiBpnE,EAAUjR,UAAWiR,EAAUrR,UAAWyuB,GAIlF1uB,EAAQ9C,EACR03E,GAAYgD,EAAchB,EAActlE,EAAUnR,SAClDy0E,GAAYgC,EAAcgB,EAActmE,EAAUnR,SAElD,MAAMw4E,EAAc9B,EAAmB,EA3Rb,EA4RpBvnE,EAA4BzM,EAAMwO,QAAQhC,kBAAkBnJ,SAASoJ,0BAE3E,GAAIA,EAA0B3c,OAAS,EAAG,CAExC,MAAMimF,EAAgCtpE,EAA0BmJ,IAAK0B,GAAMA,EAAE1lB,MACvEjK,EAAS,CACbquF,QAAS74E,EACThT,KAAML,GAASqE,UAAU2lF,EAAY,YACrCzpF,KAAMP,GAASqE,UAAU2lF,EAAY,QACrC7wE,WAAY5I,EAAmB,UAAY,YAC3C8D,gBAAiB6B,EAAMyO,UAAUtQ,gBACjCijB,IAAK,QAELlG,SAAyC,OAA/Blb,EAAMyO,UAAUpX,MAAM/N,KAAgB,KAAO,KACvDwsF,YAAaA,EACbG,gBAAgB,EAChBC,iCAAkCH,EAA8B7zD,KAAK,MAEvEykD,QAAgB4L,aAAKF,EAAK1qF,EAAQuzD,GAAQY,aAErC,CACL,MAAMn0D,EAAS,CACbquF,QAAS74E,EACThT,KAAML,GAASqE,UAAU2lF,EAAY,YACrCzpF,KAAMP,GAASqE,UAAU2lF,EAAY,QACrC7wE,WAAY5I,EAAmB,UAAY,YAC3C8D,gBAAiB6B,EAAMyO,UAAUtQ,gBACjCijB,IAAK,QAELlG,SAAyC,OAA/Blb,EAAMyO,UAAUpX,MAAM/N,KAAgB,KAAO,KACvDwsF,YAAaA,EACbG,gBAAgB,GAElBtP,QAAgB4L,aAAKF,EAAK1qF,EAAQuzD,GAAQY,UAG9C,MAAMhuD,GAED+hB,EAML,QAAuBhY,WAAZ8uE,EAAuB,CAChC,MAAMv0E,EAAciI,EAAkB2F,EAAMyO,UAAU3Q,aAAa5J,eAAgB8L,EAAMyO,UAAU3Q,aAAa3J,eAC1GyuE,EAAU5iE,EAAMyO,UAAU3Q,aAAaxD,mBAAkB,GAE/DqsE,EAAWA,aAAmB/vD,MAAS+vD,EAAU,CAACA,GAGlD,MAAM9pE,EAAwBmD,EAAMyO,UAAU5R,sBAE9C,GAAGm3E,EAAkB,OAEb5B,aAAIjrF,GAAyB,IACnC,IAAIgvF,EAAoB,GAGtBA,EADCt5E,EACmB,CAAC,QAAS,QAAS,QAAS,SAG5B,CAAC,QAAS,SAAU,QAAS,SAEnD8pE,QA1pBR,UAA4BA,EAAmBtsE,EAA2B87E,EAA6B7sF,GACrG,MAAM+oF,EAAMz2B,KACNw6B,EAA0B,GAChC,IAAI,MAAMl4E,KAAUyoE,EAAQ,CAC1B,MAAM0P,EAAapE,GAAa/zE,EAAQ7D,GAExC,GAAkB,OAAfg8E,EACD,OAGF,MAAM1uF,EAAS,CACb2uF,cAAep4E,EAAO+kE,cACtBsT,aAAcF,EAAW,GAErBvuF,QAAeyqF,aAAKF,EAAK1qF,EAAQuzD,GAAQe,aAEzCmkB,EAAct4E,EAAO8tB,IAAKzY,GAA8BA,EAAMukB,QAAQ9vB,MAE5E,IAAI,IAAIqzD,KAAWkxB,EACjB,GAAG/V,EAAY9vE,SAAS20D,GAAS,CAE/B/mD,EAAOkwD,MAAM8Q,KAAKmX,GAAYG,mBAAoB,EAElD,MAAMC,EAAa3uF,EAAOsI,KAAM+M,GAA8BA,EAAMukB,QAAQ9vB,OAASqzD,GAErF,GAAG37D,IAASF,EAAKI,GAAG,CAClB,MAAMktF,QAAqBnE,aAAKF,EAAK,CACnCzgF,KAAM6kF,EAAW/0D,QAAQ9vB,KACzBspB,SAAU,MACTggC,GAAQqB,cACXr+C,EAAOkwD,MAAM8Q,KAAKmX,GAAYM,gBAAkBD,EAAa/0D,UAE7DzjB,EAAOkwD,MAAM8Q,KAAKmX,GAAYM,gBAAkBF,EAAW/0D,QAAQC,KAErEzjB,EAAOkwD,MAAM8Q,KAAKmX,GAAYO,gBAAkBH,EAAW/0D,QAAQ9vB,KACnEwkF,EAAczyD,KAAKzlB,GACnB,OAIN,OAAOk4E,EAknBeS,CAAkBlQ,EAAStsE,EAAkB87E,EAAmB1nE,EAAUpX,MAAM/N,iBAE1F8oF,aAAIjrF,GAAyB,IAKrCw/E,EAAQ/wD,IAAK1X,IAMX,GALiD,IAA9CjO,OAAOC,KAAKgO,EAAOkwD,MAAMlS,MAAM,IAAIpsD,SACpCoO,EAAOkwD,MAAMlS,MAAM,GAAK,CACtBv6B,KAAMlT,EAAUtR,QAGuC,IAAxDlN,OAAOC,KAAKgO,EAAOkwD,MAAMlS,MAAM9xD,OAAO,GAAG,IAAI0F,OAAe,CAC7D,MAAM8sB,EAAM1e,EAAOkwD,MAAMlS,MAAMpsD,OAC/BoO,EAAOkwD,MAAMlS,MAAMt/B,GAAO,CACxB+E,KAAMlT,EAAUtR,OAGpB,OAAO,OAGT,IACE,IAAIuC,EACF,MAAM,IAAIxG,MAAM,6FAIlB,MAAM49E,QAAiEnN,GAActvE,EAAkBqD,EAAsBgC,EAAOhM,EAAQpK,EAAMysE,GAE5IghB,EAAgBD,EAAqBE,sBAErCC,EAAyC,OAAzBF,EAAchiF,OACjB,IAADmiF,EAAlB,GAAGD,QACK7E,aAAIxrF,EAAiBmwF,IAExBD,EAAqBK,sBAAyD,QAAlCD,EAAAJ,EAAqBM,qBAAa,IAAAF,OAAA,EAAlCA,EAAoCpnF,QAAS,UACpFsiF,aAAInrF,EAAwB6vF,EAAqBM,iBAG3D,MAAMC,EApYkB,EA+YxB,GAPA1Q,EAAUA,EAAQv8E,MAAM,EAAGitF,GAGvBr3E,EAAMyO,UAAU5R,wBAClB8pE,EAgzBV,SAA0BA,GAwBxB,OAtBAA,EAAQrjD,QAASplB,IACfA,EAAOqlE,eAAgB,EACvBrlE,EAAOkwD,MAAM8Q,KAAK57C,QAASg0D,IAEpBA,EAAE11D,MAA0B,kBAAX01D,EAAE11D,MAEF,eAAlB01D,EAAE11D,KAAKyzD,SAA2Bn3E,EAAOqlE,eAAgB,OAIjEoD,EAAQ7iD,KAAK,CAACyzD,EAASC,KACrB,IAAI1vF,EAAS,EASb,OAPIyvF,EAAQhU,eAAiBiU,EAAQjU,gBAAez7E,EAAS,GAExDyvF,EAAQhU,eAAkBiU,EAAQjU,gBAAez7E,EAAS,GAE3DyvF,EAAQhU,gBAAkBiU,EAAQjU,gBAAez7E,GAAU,IAE1DyvF,EAAQhU,eAAiBiU,EAAQjU,gBAAez7E,EAAS,GACvDA,IAEF6+E,EAx0BW8Q,CAAiB9Q,IAG1BoQ,GAAiBtoE,EAAU/O,OAASu3E,EAAe,CACpD,MAAM34E,EAAiB0B,EAAMyO,UAAUnQ,eAEjCy3D,EAAgB/1D,EAAMyO,UAAU9a,cAChC+J,EAAuBolE,GAAc4U,wBAAwB13E,EAAMyO,UAAU/Q,qBAAsBsC,EAAMyO,UAAUtjB,WAAY4qE,GAC/H4hB,EAAa,IAAI7U,GACrBiU,EACA/2E,EAAMyO,UAAU3Q,aAChBzD,EACAqD,EACA+Q,EAAUtR,MACV7T,EACAwtF,EAAqB/T,WAGpBzkE,EACDqoE,EAAQhd,QAAQguB,GAGhBhR,EAAQhjD,KAAKg0D,IAGjB,MAAM7pF,SAEAskF,aAAInrF,EAAwB,KAQpC,GAAsB,IAAnB0/E,EAAQ72E,OACT,MAAM,IAAIoJ,MAAM,wFAIlB,IAAI0jB,EAAM,EACV+pD,EAAUA,EAAQ/wD,IAAK1X,IACrBA,EAAOwlE,aAAexlE,EAAOy/C,OAAQ,OAAQpf,SAAS3hB,GAC/C1e,IAITyoE,EAiZC,SAAkBA,GAUvB,OADAA,EAAUW,GAHVX,EAAUI,GAHVJ,EAAUD,GAAUC,KApZNiR,CAASjR,GAGnB,MAAMvoE,EAAW4B,EAAMyO,UAAUpX,MAAM+G,SAEjCykE,EAAuB+J,GAAcoG,cAAc50E,GAEzD,GAAG4B,EAAMyO,UAAUpX,MAAM/N,OAASF,EAAKG,GAAI,CACzC,IAEE,MAAMsuF,EAA0BrnB,KAK1BsnB,EAkoBT,SAAmCC,EAA2BpR,GACnE,IAAIqR,EAAuC,GA4B3C,OA3BArR,EAAQ/wD,IAAI,CAAC1X,EAAQ+5E,KAyBnB,OAxBcrhE,MAAM4O,QAAQtnB,EAAOkwD,MAAM8Q,MAAOhhE,EAAOkwD,MAAM8Q,KAAM,CAAChhE,EAAOkwD,MAAM8Q,OAC3EtpD,IAAI,CAACvd,EAAMif,KACf,GAAGjf,EAAKupB,KAAM,CAEZ,GAAiB,SADsB,kBAAdvpB,EAAKupB,KAAqBvpB,EAAKupB,KAAOvpB,EAAKupB,KAAKlpB,OAC/CL,EAAK6/E,kBAAoB,CAEjD,IAAIC,EAD4B,IAAIhxD,gBAAgB9uB,EAAK6/E,kBAAkBE,yBACjChnE,IAAI,SAAW,GAEzD+mE,EAAcA,EAAYtvB,SAAS,EAAG,KAEnCkvB,EAAiBznF,SAAS6nF,IAC3BH,EAAgBr0D,KAAK,CACnB00D,WAAYnuF,aAAO,IAAIc,KAAKqN,EAAKG,eAAeC,SAASC,MAAO,YAChE4/E,gBAAiBH,EACjBI,mBAAoBr6E,EAAOkwD,MAAMlS,MAAM5kC,GAAGoK,QAAQ9vB,KAClDs2E,aAAc+P,EACd7P,WAAY9wD,EACZkhE,WAAYjuF,OAAQL,aAAO,IAAIc,KAAKqN,EAAKG,eAAeC,SAASC,MAAO,SAAUqE,cAK1F,OAAO,OAEF,OAEFi7E,EA/pB8BS,OAJElG,aAAKsF,GAIqClR,GAEzE,GAAGmR,EAAqBhoF,OAAS,EAAG,CAElC,MAAM4oF,EAAcvoB,KAIpBwW,EA6bL,SAAqBA,EAAmBvW,GAU7C,OATAA,EAAax6C,IAAK+iE,IAChB,MAAM7U,EAAQ6C,EAAQgS,EAAQzQ,cAAc9Z,MACtC/1D,EAAOyrE,EAAM5E,KAAKyZ,EAAQvQ,YAE1B/I,EAAiByE,EAAM5nB,MAAMy8B,EAAQvQ,YAAY1mD,QAAQ9vB,KACzD0tE,EAAiBwE,EAAM5nB,MAAMy8B,EAAQvQ,WAAW,GAAG1mD,QAAQ9vB,KAEjE,OADAyG,EAAKugF,YAsIT,SAA0BD,EAA4BE,EAAoBC,GACxE,MACMzhF,EAAkB,CACtBg9D,KAFc,6CAGdh9D,MAAO,CACL0hF,OAAQ,IACRC,KAAML,EAAQK,KACdC,MAAO,MAAMN,EAAQM,MAAM7uF,OAAO,GAClC,UAAWuuF,EAAQO,KACnB,WAAY,IAAIP,EAAQQ,MAAM/uF,OAAO,GACrC,WAAY,MAAMuuF,EAAQS,MAAMhvF,OAAO,GACvC,WAAY,IAAIuuF,EAAQU,MAAMjvF,OAAO,GACrC,UAAW,KACX,YAAe,WAEjBkvF,aAAc,IAEVC,EAAoDZ,EAAQY,cAAgB,KAClF,GAAGA,EAAc,CACf,MAAMC,EAAeD,EAAaV,GAC5BY,GAAW5pE,EACd2pE,EACDniF,EAAMA,MAAM,WAAamiF,EACjBC,IACRvlE,QAAQjsB,MAAM,qJACdisB,QAAQjsB,MAAM,YAAYuxF,IAE5B,MAAME,EAAeH,EAAaT,GAC/BY,EACDriF,EAAMA,MAAM,WAAaqiF,EACjBD,IACRvlE,QAAQjsB,MAAM,qJACdisB,QAAQjsB,MAAM,YAAYyxF,IAQ9B,OAHAriF,EAAMiiF,aAAerpF,OAAOC,KAAKmH,EAAMA,OAAO0sB,OAAO,CAACvzB,EAAGxD,IACjD,GAAN6L,OAAUrI,EAAC,KAAAqI,OAAI7L,EAAC,KAAA6L,OAAIxB,EAAMA,MAAMrK,IAC/B,IAAI5C,MAAM,GACNiN,EA9KcsiF,CAAiBhB,EAAStZ,EAAgBC,GACtD,OAEFqH,EAvcaiT,CAAYjT,SAHa4L,aAAKmG,EAAaZ,IACX3iF,KAAKmc,OAIjD,MAAMxjB,GAEH+hB,EAIL,IAEE,MAAMgqE,EAAmBpQ,KAEnBqQ,EAA6D,CACjEnT,QAASA,EACTtsE,iBAAkBA,EAClBqF,MAAOA,GAETinE,QAAgB4L,aAAKsH,EAAkBC,GAEzC,MAAMhsF,GAED+hB,GAMP,IAEE,MAAMkqE,EAkqBd,SAAgDpT,GAC9C,IAAIqT,EAAiD,GAIrD,OAHArT,EAAQrjD,QAAQ,CAACplB,EAAQgqE,KACvB8R,EAAmBA,EAAiBnhF,OAUjC,SAAyCqF,EAAgBgqE,GAC9D,IAAI8R,EAAiD,GAsBrD,OArBcpjE,MAAM4O,QAAQtnB,EAAOkwD,MAAM8Q,MAAOhhE,EAAOkwD,MAAM8Q,KAAM,CAAChhE,EAAOkwD,MAAM8Q,OAC3E57C,QAAQ,CAACjrB,EAAM+vE,KAEnB,GAAG/vE,EAAKupB,MAAQq4D,GAAoB5hF,EAAKupB,MAAO,CAAC,IAADs4D,EAAAC,EAC9C,MAAMr4E,EAAW5D,EAAOkwD,MAAMlS,MAAMksB,GAC9BrmE,EAAW7D,EAAOkwD,MAAMlS,MAAMksB,EAAW,GACzCgS,EAA0B,QAAnBF,EAAGp4E,EAAS4f,eAAO,IAAAw4D,OAAA,EAAhBA,EAAkBtoF,KAC5ByoF,EAA0B,QAAnBF,EAAGp4E,EAAS2f,eAAO,IAAAy4D,OAAA,EAAhBA,EAAkBvoF,KAElC,GAxDN,SAA6BwoF,EAAiBC,GAE5C,IAAID,IAAYC,EACd,OAAO,EAGT,MAAMC,EAA2B,CAC/BC,OAAQ,CAAC,QAAS,SAAU,SAC5BC,OAAQ,CAAC,QAAS,SAAU,UAExBC,EAA8BxqF,OAAOC,KAAKoqF,GAAqBv2D,OAAO,CAACvzB,EAAGxD,IAAawD,EAAEqI,OAAOyhF,EAAoBttF,IAAO,IACjI,OAAOytF,EAAkBnqF,SAAS8pF,IAAYK,EAAkBnqF,SAAS+pF,GA6ClEK,CAAoBN,EAASC,GAAU,CACxC,MAAMzrF,EAAU,IAAI5D,KAAKqN,EAAKG,eAAeC,SAASC,MACtDshF,EAAiBr2D,KAAK,CACpBvkB,YAAa8oE,EACbnH,UAAWqH,EACXgS,QAASA,EACTC,QAASA,EACTzrF,QAAS2vC,OAAO3vC,EAAQxC,UAAU,WAKnC4tF,EAjCsCW,CAAgCz8E,EAAQgqE,MAE9E8R,EAvqBkCY,CAAuCjU,GAE1E,GAAGoT,EAA2BjqF,OAAS,EAAG,CACxC,MAAM+qF,EAAsBrU,KAG5BG,EAyWH,SAAkCA,EAAmBF,GAO1D,OANAA,EAAiBnjD,QAASq1D,IACxB,MACMtgF,EADQsuE,EAAQgS,EAAQv5E,aAAagvD,MACxB8Q,KAAKyZ,EAAQ5X,WAChC1oE,EAAKyiF,sBAAwBnC,EAC7BtgF,EAAK0iF,yBAA2BpC,EAAQqC,UAEnCrU,EAhXWsU,CAAyBtU,QAD0B4L,aAAKsI,EAAqBd,KAwX1F,SAAkCpT,GAChCA,EAAQrjD,QAASplB,IAyBtB,OAxBc0Y,MAAM4O,QAAQtnB,EAAOkwD,MAAM8Q,MAAOhhE,EAAOkwD,MAAM8Q,KAAM,CAAChhE,EAAOkwD,MAAM8Q,OAC3E57C,QAAQ,CAACjrB,EAAM6iF,KAAY,IAADC,EAAAC,EAAAC,EAG9B,GAFAhjF,EAAKijF,yBAA0B,EAEP,kBAAdjjF,EAAKupB,MAAyC,SAAX,QAATu5D,EAAA9iF,EAAKupB,YAAI,IAAAu5D,OAAA,EAATA,EAAWziF,OAAwC,gBAAb,QAAT0iF,EAAA/iF,EAAKupB,YAAI,IAAAw5D,OAAA,EAATA,EAAW/F,QAC1E,OAOF,IAJ8B,CAAC,uCAAU,sBAAuB,2BAAQ,cAAe,uCAAU,oBACzCxd,KAAM0jB,GACrDljF,EAAKspB,KAAKrxB,SAASirF,IAG1B,OAMF,MAEMx5E,GADS6U,MAAM4O,QAAQtnB,EAAOkwD,MAAMlS,OAAQh+C,EAAOkwD,MAAMlS,MAAO,CAACh+C,EAAOkwD,MAAMlS,QAC5Dg/B,EAAS,GACjC7iF,EAAKijF,wBAHkB,CAAC,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,UAGtChrF,SAAiB,OAARyR,QAAQ,IAARA,OAAQ,EAAS,QAATs5E,EAARt5E,EAAU2f,eAAO,IAAA25D,OAAA,EAAjBA,EAAmBzpF,QAErEsM,IA9YHs9E,CAAyB7U,GACzB,MAAM74E,GAEH+hB,EAKF8tD,GAAiCtjE,EAAkBjI,EAAa4N,EAAMyO,UAAUtkB,KAAM6V,EAAMyO,UAAUpX,MAAM/N,OAC7Gq9E,EAAQrjD,QAASplB,IACfA,EA6ZH,SAA4CA,GACjD,IACE,GAAGA,EAAO2gE,qBAAsB,EACb3gE,EAAO2gE,qBAAqB/uE,OAAQoO,EAAO2gE,qBAAsB,CAAC3gE,EAAO2gE,uBACjFjpD,IAAI,CAAC6nD,EAAc7gD,KAC1B,MAAMqiD,EAAY/gE,EAAOkwD,MAAM8Q,KAAKzB,EAAQ0B,eAAe,GAK3D,IAAIsc,GAJUhe,EAAQyB,KAAKpvE,OAAQ2tE,EAAQyB,KAAM,CAACzB,EAAQyB,OAEnCtpD,IAAKvd,GAAqBA,EAAKzG,MAEvBmyB,OAAO,CAACvzB,EAAYxD,IAC1CwD,GAAMqtE,GAA4BC,aAAaxtE,SAAS/F,OAAOyC,KACrE,GACH,GAAGyuF,EAAiB,CAAC,IAADC,EAElB,MAAMC,EAA6C,QAA9BD,EAAGzc,EAAUiZ,yBAAiB,IAAAwD,OAAA,EAA3BA,EAA6BE,KAAKhmE,IAAKplB,GACtDjG,OAAOiG,EAAE0rD,MAAMx6B,QAAQ9vB,OAGhC6pF,EAAiC,OAAfE,QAAe,IAAfA,OAAe,EAAfA,EAAiB53D,OAAO,CAACvzB,EAAGxD,IACrCwD,IAAMqtE,GAA4BE,yBAAyBztE,SAAStD,IAC1E,GAGL,OADAiyE,EAAU4c,yBAA2BJ,EAC9B,OAGT,MAAMK,EAAmB59E,EAAOkwD,MAAMlS,MAAMtmC,IAAKplB,GACxCA,EAAEkxB,QAASlxB,EAAEkxB,QAAQ9vB,KAAM,MAIpC,IAAImqF,EAAiB1M,IACrByM,EAAiBx4D,QAAQ,CAAC9yB,EAAGosB,KAC3Bm/D,EAAUvrF,GAAKqtE,GAA4BG,eAAe1tE,SAAS/F,OAAOiG,IAAMosB,EAAKm/D,IAGvF,IAAI,IAAIzkE,EAAEykE,EAAQzkE,EAAEpZ,EAAOkwD,MAAM8Q,KAAKpvE,OAAQwnB,IAC5CpZ,EAAOkwD,MAAM8Q,KAAK5nD,GAAGukE,0BAA2B,GAGpD,MAAM/tF,GAEH+hB,EAIL,OAAO3R,EA5cU89E,CAAmC99E,KAG7CykE,GAAyBtoE,EAAkBjI,EAAawwE,EAASC,KAElE8D,EA8cD,SAAmCA,GACxC,OAAOA,EAAQ/wD,IAAK1X,IAClB,IACE,GAAGA,EAAO2gE,qBAAsB,CAC9B,MAAMod,EAAW/9E,EAAO2gE,qBAAqB/uE,OAAQoO,EAAO2gE,qBAAsB,CAAC3gE,EAAO2gE,sBAEpFqd,EAAyC1Z,GAAmB3pE,OAAO4pE,IAEnE0Z,EAAuCzZ,GAA0B9sD,IAAKqvC,GACnEA,EAAQrzD,MAEXwqF,EAAiBH,EAASl4D,OAAO,CAACq4D,EAA0B3e,KAChE,MAAMwB,EAAY/gE,EAAOkwD,MAAM8Q,KAAKzB,EAAQ0B,eAAe,GAGrDkd,GAFQ5e,EAAQyB,KAAKpvE,OAAQ2tE,EAAQyB,KAAM,CAACzB,EAAQyB,OAEnCtpD,IAAKvd,GAAqB9N,OAAO8N,EAAKzG,OAE7DqtE,EAAUqd,0BAA4BD,EAASt4D,OAAO,CAACvzB,EAAYxD,IAC1DwD,GAAMgyE,GAAmBlyE,SAAStD,IACxC,GAEH,MAAMuvF,EAAmBF,EAASt4D,OAAO,CAACvzB,EAAYxD,IAC7CwD,GAAMiyE,GAAenyE,SAAStD,IACpC,GAEGwvF,EAA6BH,EAASt4D,OAAO,CAACvzB,EAAYxD,IACvDwD,GAAM0rF,EAA6B5rF,SAAStD,IAClD,GAIH,GADAiyE,EAAUwd,uBAAyBF,GAAoBC,EACpDvd,EAAUwd,uBAAwB,CAAC,IAADC,EAEnC,MAAMC,EAAsC,QAA9BD,EAAGzd,EAAUiZ,yBAAiB,IAAAwE,OAAA,EAA3BA,EAA6Bd,KAAKhmE,IAAKgnE,GAC/CryF,OAAOqyF,EAAK1gC,MAAMx6B,QAAQ9vB,OAEnC,GAAGglB,MAAM4O,QAAQm3D,GAAW,CAE1B,MAAME,EAAgDF,EAAS54D,OAAO,CAACvzB,EAAYy0D,IAC1Ez0D,IAAM2rF,EAA2B7rF,SAAS20D,IAChD,GACHga,EAAUwd,uBAAyBI,GAGvC,OAAOT,EAAevjF,OAAOwjF,IAC5B,IAEHn+E,EAAO4+E,sBAAwBV,EAAer4D,OAAO,CAACvzB,EAAYxD,IACzDwD,GAAKgyE,GAAmBlyE,SAAStD,IACvC,GAEHkR,EAAO6+E,gCAAkC7+E,EAAOkwD,MAAM8Q,KAAKn7C,OAAO,CAACj8B,EAAiBuQ,IAC3EvQ,GAAWuQ,EAAKokF,yBAA0B,GAChD,IAEL,MAAO3uF,GAEJ+hB,EAIL,OAAO3R,IA3gBO8+E,CAA0BrW,IAGnCvI,GAAwBU,WAAW1sE,IAEpCu0E,EAAQrjD,QAASplB,IACfA,EAAOkgE,wBAA0B,IAAIA,GAAwB6e,gBAAc3zF,GAE3E4U,EAAOkgE,wBAAwByC,OAAO3iE,KAK1CyoE,EAAQrjD,QAASplB,IACfwwE,GAAUwO,2BAA2Bh/E,EAAQ5U,WAxjBrD,YACE,MAAM+oF,EAAMz2B,KACNzqC,QAAiBohE,aAAKF,EAAK,GAAIn3B,GAAQoB,iBAEvC81B,aAAIzoE,IAAgB,IAC1B,IAEE,IAAIuB,EAA8B,GAClC,MAAMiyE,EAA4BhsE,EAASisE,YAC3C,IAAI,MAAMxN,KAAQuN,EAChBjyE,EAAc0kE,EAAK1Q,KAAKttE,MAAQg+E,QAE5BwC,aAAIroE,GAAgBmB,IAE5B,MAAMpd,GACJ,MAAMyhB,EAAcM,SACjBP,GAAYmlC,MAAMllC,IACnB2E,QAAQjsB,MAAM6F,GAEjB,cAEOskF,aAAIzoE,IAAgB,KAuiBlB0zE,GACF7uE,EAAQX,kCAtlBlB,YACE,MAAMlmB,EAAS,CACbmuB,IAAK,wBACLoF,SAAUD,GAAKC,UAEjB,IACE,MAAM/J,QAAiBohE,aAAKrhE,GAA6BvpB,GACzD,IAAGwpB,EAASG,KAIV,MAAM,IAAIpY,MAAM,0DAHVk5E,aAAInoE,GAAgCkH,EAASG,OAMvD,MAAMxjB,GACJ,MAAMyhB,EAAcM,SACjBP,GAAYmlC,MAAMllC,IACnB2E,QAAQjsB,MAAM6F,IAukBNwvF,UAKJlL,aAAI/qF,EAAiB,IAAI2D,aAEzBonF,aAAI7pF,EAAWV,QAAQ,CAACmuF,QAAS74E,EAAOikB,IAAK,SAAWulD,IAC9D,MAAO1+E,GACJ4nB,QAIGuiE,aAAI7qF,GAAgC,IAGiC,IAAxEinB,EAAQhC,kBAAkBnJ,SAASoJ,0BAA0B3c,eAAsBsiF,aAAIvoE,GAAmB,wBACvGuoE,aAAI7pF,EAAWP,KAAK,CAACguF,QAAS,GAAI50D,IAAK,SAAUn5B,UAEjDmqF,aAAI3oE,IAAyB,IACpC,cAEO2oE,aAAIzoE,IAAgB,KDv/BT+kE,GAEZ8C,SAAmB,iGAFP9C,GAIZsC,UAAoB,IAJRtC,GAMZwC,UAAoB,IANRxC,GAQZyC,WAAa,KARDzC,GAUZ0C,WAAa,MAVD1C,GAYZ2C,aAAe,UAZH3C,GAcZ6C,YAAc,iBC0jDvB,MAAM0I,GAAuB5+B,GACJ,kBAAbA,IAKiB,QAAlBA,EAAS3iD,MAAsC,UAApB2iD,EAASg6B,QA+E/C,MAAMnC,GAAmBA,CAACzkE,EAA2BivC,IAEhDjvC,EAAUzQ,mCAAmChB,eACvCyR,EAAUzQ,mCAAmC7S,WAEnDsjB,EAAU1Q,uBAAuBf,eAC3ByR,EAAU1Q,uBAAuB5S,WAEvCsjB,EAAU3Q,aAAad,eACjByR,EAAU3Q,aAAa3S,WAG7B41D,GAAKS,SAAS9D,GAERjvC,EAAUtjB,WAIVsjB,EAAUpX,MAAMlM,WAsE3B,SAAUoyF,KAER,MAAMv9E,QAAqBq7B,eAErBmiD,EAAe,CAEnBnmF,MAAO,CACL2c,KAAM,sCAENhlB,MAAOpD,YAAS,IAAIZ,KAAQ,KAI1ByyF,EA3ER,SAA+Bz9E,GAC7B,MAAMyO,EAAYzO,EAAMyO,UAClBD,EAAUxO,EAAMwO,QAEhB9W,EAAM+W,EAAUpX,MAAMK,IAAM5N,GAASqE,UAAUsgB,EAAUpX,MAAMK,IAAK,gBAAkB,GAEtFC,EAAM8W,EAAUpX,MAAMM,IAAM7N,GAASqE,UAAUsgB,EAAUpX,MAAMM,IAAK,gBAAkB,GAEtFxN,EAAOskB,EAAUtkB,KAAOL,GAASqE,UAAUsgB,EAAUtkB,KAAM,YAAc,GAEzEuzF,EAA0BlvE,EAAQpC,mBACxCnc,OAAOC,KAAKwtF,GAAoBp6D,QAASxN,IACnC4nE,EAAmB5nE,WACd4nE,EAAmB5nE,KAI9B,MAAM4nC,EAAW19C,EAAM2O,OAAOoW,SAAS9V,SACjC9jB,EAAa+nF,GAAiBzkE,EAAWivC,GAC/C,OAAO,IAAIv2B,gBAAejnB,YAAC,CACzB/C,MAAOsR,EAAUtR,MACjBC,UAAWqR,EAAUrR,UACrBI,UAAWiR,EAAUjR,UACrB9J,OAAQ+a,EAAU/a,OAClBjE,aAAcgf,EAAUhf,aACxBtF,KAAMA,EACNoT,OAAQkR,EAAUlR,OAAOR,WACzBM,IAAKoR,EAAUpR,IACfC,QAASmR,EAAUnR,QACnBjD,iBAAkBoU,EAAUpU,iBAAiB0C,WAI7CsB,iBAAkBoQ,EAAUpU,kBAAkB0C,WAC9CY,oBAAqB8Q,EAAU9Q,oBAAoBZ,WACnDa,wBAAyB6Q,EAAU7Q,wBAAwBb,WAC3Dc,YAAa4Q,EAAU5Q,YAAYd,WACnCF,sBAAuB4R,EAAU5R,sBAAsBE,WACvDuB,eAAgBmQ,EAAUnQ,eAAevB,WACzCuP,sBAAuBkC,EAAQnC,KAAKC,sBAAsBvP,WAC1DW,qBAAsB+Q,EAAU/Q,qBAAqBX,WAGrD4gF,eAAgBlvE,EAAUpX,MAAM5H,aAChC4G,WAAYoY,EAAUpX,MAAMhB,WAC5BD,WAAYqY,EAAUpX,MAAMjB,WAC5BkB,gBAAiBmX,EAAUpX,MAAMC,gBACjCC,cAAekX,EAAUpX,MAAME,cAC/BE,aAAcgX,EAAUpX,MAAMI,aAC9BD,WAAYiX,EAAUpX,MAAMG,WAC5B7D,cAAe8a,EAAU9a,cAAcoJ,WACvCzT,KAAMmlB,EAAUpX,MAAM/N,KACtB8U,SAAUqQ,EAAUpX,MAAM+G,SAC1BH,SAAUwQ,EAAUxQ,SACpBvG,IAAKA,EACLC,IAAKA,EACLxM,WAAYA,GACTuyF,IACF3gF,WAiBiB6gF,CAAsB59E,GAEpCnN,EAAO,YAAc4qF,EAE3BppE,KAAQC,IAAIkpE,EAAanmF,MAAM2c,KAAMypE,EAAa,CAAEI,QAASL,EAAanmF,MAAMrI,QACnD,OAA1BgR,EAAMyO,UAAU/O,OAEjB6qE,GAAiBQ,aAAa/qE,EAAMyO,UAAUrR,UAAW4C,EAAMyO,UAAU/O,OAkC7E,SAA4B7M,GAE1B,OAASkuD,GAAKW,SAAS7uD,KAAUkuD,GAAKU,UAAU5uD,GA9B5CirF,CAFa99E,EAAM2O,OAAOoW,SAAS9V,kBAECmjE,aAAIzuD,aAAK9wB,KAE9BmN,EAAMyO,UAAU3Q,aAAavC,cAAcyE,EAAMyO,UAAUpU,wBAMxE+3E,aAAIjoE,MAIZ,SAAU4zE,KAIR,IAAIrgC,SAFuBriB,gBAEN1sB,OAAOoW,SAAS9V,SAGjC8xC,GAAKS,SAAS9D,KAChBA,EAAWqD,GAAKG,SAab,SAAU88B,WACTC,aAAWt3F,EAAoBiB,yBAA0BuqF,IAG1D,SAAU+L,WACTD,aAAWt3F,EAAoByB,qBAAsBoqF,IAGtD,SAAU2L,WAETF,aAAWt3F,EAAoB0B,uBAAwBirF,IAGxD,SAAU8K,WAETH,aAAWt3F,EAAoBkC,+BAAgCgrF,IAGhE,SAAUwK,WAETJ,aAAWt3F,EAAoB8B,6BAA8B80F,IAG9D,SAAUe,WACTL,aAAWt3F,EAAoB8B,6BAA8Bs1F,I,qBCz3DrE,MAAMQ,G3JHS,SAAwBC,GACrC,MAAMC,EAAmCrvE,OAAesvE,sCAAwCC,IAoBhG,OAnBcC,YACZC,GAAkBvwE,IAClBkwE,EACAC,EACEK,YACEC,YAAiBzwE,IACjBQ,M2JLMkwE,GAEdC,IAAS9yB,OACPx5C,IAAAC,cAACssE,IAAQ,CAACX,MAAOA,IACf5rE,IAAAC,cAACusE,KAAe,KACdxsE,IAAAC,cAACq7C,GAAG,CAAC3/C,QAASA,OAGlB09C,SAASozB,eAAe,S3CuHpB,kBAAmBj6B,WACrBA,UAAUk6B,cAAcC,MAAMpkD,KAAKqkD,IACjCA,EAAaC,e2ClHnB1wE,GAAe2wE,KD62DA,kBACPC,aAAI,CACRC,aAAKzB,IACLyB,aAAKxB,IACLwB,aAAKvB,IACLuB,aAAKtB,IACLsB,aAAK3B,YAED2B,aAAKrB,S","file":"static/js/main.4c22f474.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/mktaxi_logo.b10d8b75.png\";","module.exports = __webpack_public_path__ + \"static/media/iyotetsutaxi-logo.9434a90a.png\";","module.exports = __webpack_public_path__ + \"static/media/king-taxi-logo.b86c4243.png\";","module.exports = __webpack_public_path__ + \"static/media/kisakata-logo.f7b472a5.png\";","module.exports = __webpack_public_path__ + \"static/media/eastern_airport_logo.3c357fc6.png\";","module.exports = __webpack_public_path__ + \"static/media/eastern_airport_logo_en.903065e9.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/nahaHireLogo.9ae7f4a2.png\";","module.exports = __webpack_public_path__ + \"static/media/miyakou-taxi-logo.bfa064a4.jpg\";","module.exports = __webpack_public_path__ + \"static/media/hinomaruHireLogo.01d99ae6.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/gotaku-logo.190cdac5.png\";","module.exports = __webpack_public_path__ + \"static/media/asahikawa-chuuo-logo.a7a9c44a.png\";","module.exports = __webpack_public_path__ + \"static/media/hakodate-taxi-logo.1c28c74a.png\";","module.exports = __webpack_public_path__ + \"static/media/daiwa-taxi-logo.ebb32668.jpg\";","module.exports = __webpack_public_path__ + \"static/media/kita-fukushima-taxi-logo.8da7af00.jpg\";","module.exports = __webpack_public_path__ + \"static/media/fukushima-chuo-taxi-logo.7ec37ad1.jpg\";","module.exports = __webpack_public_path__ + \"static/media/iwaki-taxi-logo.9b9b2264.jpg\";","module.exports = __webpack_public_path__ + \"static/media/uchigo-taxi-logo.d777c4b5.jpg\";","module.exports = __webpack_public_path__ + \"static/media/tajima-taxi-logo.10036a53.png\";","module.exports = __webpack_public_path__ + \"static/media/kinugawa-taxi-logo.d701721c.png\";","module.exports = __webpack_public_path__ + \"static/media/hokto-taxi-logo.8fb14335.png\";","module.exports = __webpack_public_path__ + \"static/media/yoko-taxi-logo.bb8c012d.jpg\";","module.exports = __webpack_public_path__ + \"static/media/toden-taxi-logo.baee71ca.png\";","module.exports = __webpack_public_path__ + \"static/media/ishikawa-taxi-logo.de65037f.jpg\";","module.exports = __webpack_public_path__ + \"static/media/ube-kounai-taxi-logo.bf7bebff.png\";","module.exports = __webpack_public_path__ + \"static/media/tsuzu-taxi-logo.b73f58e2.png\";","module.exports = __webpack_public_path__ + \"static/media/sakata-no1taxi-logo.71b2eacf.png\";","module.exports = __webpack_public_path__ + \"static/media/shoko-hire-logo.5ffeb8f1.png\";","module.exports = \"data:image/png;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/tabicube_ja.624f3f2d.jpg\";","module.exports = __webpack_public_path__ + \"static/media/tabicube_en.8f601f59.jpg\";","module.exports = __webpack_public_path__ + \"static/media/logo.d3664bd6.png\";","module.exports = __webpack_public_path__ + \"static/media/logoEN.04ef5fdc.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAARCAYAAADZsVyDAAAABGdBTUEAALGPC/xhBQAAAaNJREFUOBHNUz1LA0EQnbk7IearEZSIYGWjRSKChanUSjv/gFXENIKlsQhiEE1lIWLQVLb+htgYFQQ1KfwPQUFR86HJ3Y27513uWO6OQBBcWHbuzczbmbdziPEUQR+LqkV0S5fcwH+NubbhVrGSSCc10DJANGP4Ee9lkPfVSuHaLR59NP6MRgbG38snb1IitU2EOQASpEMdEbN65XRPJBcCbTdr5ZiT8kpNUhUBtwYVaZRvbrOLVCI9p0yvL9qZv5bi9arWqBjts0oZUVavnuWbNkNeiq8BAR1our7J4JLtAvCsuBtkahpQ8LyLmYYDS4o+xUvjSDAy9HF7+ComuH/Tt4h7VtxqNyaMYPb6/PxSaVVMdmAV0eepcceM5CPFdF5iWu5yTa32OSnHeJgkYVETmHuaY+9xM9kQn0IYmK8/Hr1Y/LJl+J1Ue7hSYrMlQhphcVG224BQllDKEMIk+2mmOqAth2PJi3btzhicnir2uzQ8lx5uNLVLTg6Oyj0fz4/M6avfFJ5DQXmBk3Lypt7a4P6+iTmJRc7az2VXxnY49mfrB6ywnxFe0O1IAAAAAElFTkSuQmCC\"","module.exports = __webpack_public_path__ + \"static/media/bn_mk_taxi_2209_640_100.91020aa9.png\";","module.exports = __webpack_public_path__ + \"static/media/bn_mk_hire_640_100.d1288146.jpg\";","module.exports = __webpack_public_path__ + \"static/media/bn_mk_kyoto_2209_640_100.8cf6d754.png\";","module.exports = __webpack_public_path__ + \"static/media/mktaxi_service_hire.d375beaa.jpg\";","module.exports = __webpack_public_path__ + \"static/media/mktaxi_service.b1fd7fd5.jpg\";","module.exports = __webpack_public_path__ + \"static/media/BarrierFreeImage.00a34e3e.png\";","module.exports = __webpack_public_path__ + \"static/media/service4.2c7d0e0d.png\";","module.exports = __webpack_public_path__ + \"static/media/logo_black.6428fbd1.png\";","module.exports = \"data:image/jpeg;base64,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\"","module.exports = __webpack_public_path__ + \"static/media/mktaxi_kyoto_service.886df85e.jpg\";","import { AxiosError } from 'axios';\nimport { Extreme } from '../services/ekispert/models';\nimport FlightInfo from '../services/ana/models/flightInfo';\nimport { Query } from '../states/query';\nimport Place, { PlaceLog } from '../services/google/Place';\nimport { PlaceDirections } from '../services/google/PlaceDirections';\nimport { GeoLocation } from '../utils/geoLocation';\nimport { ModalStatusList } from '../states/conditionState';\nimport { OkinawaBusStop } from '../states/conditionState';\nimport { TaxiFareSummary } from '../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { AirlineList } from '../utils/Airlines';\nimport History from '../components/search/CandidatesModal/Histories/history';\n\n// 探索条件に関わるアクション。\nexport enum ConditionActionType {\n  UPDATE_POINT = 'UPDATE_POINT',\n  UPDATE_POINT_CODE = 'UPDATE_POINT_CODE',\n  UPDATE_POINT_GEOCODE = 'UPDATE_POINT_GEOCODE',\n  UPDATE_VIA = 'UPDATE_VIA',\n  UPDATE_VIA_CODE = 'UPDATE_VIA_CODE',\n  SWITCH_HAS_VIA = 'SWITCH_HAS_VIA',\n  UPDATE_POINT_TYPE = 'UPDATE_POINT_TYPE',\n  UPDATE_DATE = 'UPDATE_DATE',\n  UPDATE_FLIGHT = 'UPDATE_FLIGHT',\n  UPDATE_FLIGHT_NUMBER = 'UPDATE_FLIGHT_NUMBER',\n  UPDATE_FLIGHT_STATUS = 'UPDATE_FLIGHT_STATUS',\n  UPDATE_FLIGHT_STATUS_FOR_SEARCH_AD = 'UPDATE_FLIGHT_STATUS_FOR_SEARCH_AD',\n  UPDATE_FLIGHT_STATUS_USER_SET_DATE_FOR_SEARCH_AD = 'UPDATE_FLIGHT_STATUS_USER_SET_DATE_FOR_SEARCH_AD',\n  UPDATE_ARRIVAL_TIME_TO_AIRPORT = 'UPDATE_ARRIVAL_TIME_TO_AIRPORT',\n  UPDATE_CITY_BANE = 'UPDATE_CITY_BANE',\n  UPDATE_QUERY = 'UPDATE_QUERY',\n  UPDATE_COURSE = 'UPDATE_COURSE',\n  UPDATE_SEARCHED_AT = 'UPDATE_SEARCHED_AT',\n  UPDATE_TRAININFO = 'UPDATE_TRAININFO',\n  UPDATE_PLACE = 'UPDATE_PLACE',\n  UPDATE_LAST_SELECTED_PLACE = 'UPDATE_LAST_SELECTED_PLACE',\n  UPDATE_COURSE_INDEX = 'UPDATE_COURSE_INDEX',\n  UPDATE_DIRECTIONS = 'UPDATE_DIRECTIONS',\n  UPDATE_OKIBAWABUS_BUSSTOPLIST = 'UPDATE_OKIBAWABUS_BUSSTOPLIST',\n  UPDATE_TAXI_FARE_SUMMARIES = 'UPDATE_TAXI_FARE_SUMMARIES',\n  UPDATE_TARGET_AIRLINE = 'UPDATE_TARGET_AIRLINE',\n  UPDATE_SEARCH_HISTORIES = 'UPDATE_SEARCH_HISTORIES',\n  SWITCH_CONSENT_AIRPORT_ARRIVAL_TIME = 'SWITCH_CONSENT_AIRPORT_ARRIVAL_TIME',\n  SWITCH_AIRPORT_MODAL_SHOW = 'SWITCH_AIRPORT_MODAL_SHOW',\n  SWITCH_IS_DEPARTURE_GUIDE = 'SWITCH_IS_DEPARTURE_GUIDE',\n  SWITCH_SHINKANSEN = 'SWITCH_SHINKANSEN',\n  SWITCH_LIMITED_EXPRESS = 'SWITCH_LIMITED_EXPRESS',\n  SWITCH_IC = 'SWITCH_IC',\n  SWITCH_DOMESTIC = 'SWITCH_DOMESTIC',\n  SWITCH_PRIORITY_AIRPORT_BUS = 'SWITCH_PRIORITY_AIRPORT_BUS',\n  SWITCH_PRIORITY_CAR = 'SWITCH_PRIORITY_CAR',\n  SWITCH_PRIORITY_CAR_WITH_BARRIER_FREE = 'SWITCH_PRIORITY_CAR_WITH_BARRIER_FREE',\n  SWITCH_IS_NO_SET_TERMINAL_HND = 'SWITCH_IS_NO_SET_TERMINAL_HND',\n  SWITCH_IS_INITIAL = 'SWITCH_IS_INITIAL',\n  SWITCH_IS_AVALABLE = 'SWITCH_IS_AVALABLE',\n  SWITCH_LIMOUSINE_BUS_MODAL_SHOW = 'SWITCH_LIMOUSINE_BUS_MODAL_SHOW',\n  SWITCH_BUS_TICKET_OITA_MODAL_SHOW = 'SWITCH_BUS_TICKET_OITA_MODAL_SHOW',\n  UPDATE_MODAL_STATE = 'UPDATE_MODAL_STATE',\n  SWITCH_IS_SHOS_OKINAWA_BUS_LINK = 'SWITCH_IS_SHOS_OKINAWA_BUS_LINK',\n  SWITCH_IS_PEACH_CODE_SHARE = 'SWITCH_IS_PEACH_CODE_SHARE',\n  ANA_GET_ROUTE_TYPE_START = 'ANA_GET_ROUTE_TYPE_START',\n  ANA_GET_ROUTE_TYPE_SUCCEED = 'ANA_GET_ROUTE_TYPE_SUCCEED',\n  ANA_GET_ROUTE_TYPE_FAIL = 'ANA_GET_ROUTE_TYPE_FAIL',\n  ANA_GET_FLIGHT_START = 'ANA_GET_FLIGHT_START',\n  ANA_GET_FLIGHT_SUCCEED = 'ANA_GET_FLIGHT_SUCCEED',\n  ANA_GET_FLIGHT_FAIL = 'ANA_GET_FLIGHT_FAIL',\n  EKISPERT_GET_EXTREME_START = 'EKISPERT_GET_EXTREME_START',\n  EKISPERT_GET_EXTREME_SUCCEED = 'EKISPERT_GET_EXTREME_SUCCEED',\n  EKISPERT_GET_EXTREME_FAIL = 'EKISPERT_GET_EXTREME_FAIL',\n  EKISPERT_GET_CONDITION_START = 'EKISPERT_GET_CONDITION_START',\n  EKISPERT_GET_CONDITION_SUCCEED = 'EKISPERT_GET_CONDITION_SUCCEED',\n  EKISPERT_GET_CONDITION_FAIL = 'EKISPERT_GET_CONDITION_FAIL',\n  SWITCH_IS_SHOWUMMODAL = 'SWITCH_IS_SHOWUMMODAL'\n}\n\nexport interface ConditionAction {\n  payload: any;\n  type: ConditionActionType;\n}\n\nexport const updatePoint = (v: string) => ({\n  payload: v,\n  type: 'UPDATE_POINT',\n});\n\nexport const updatePointCode = (v: string) => ({\n  payload: v,\n  type: 'UPDATE_POINT_CODE',\n});\n\nexport const updatePointGeoCode = (v: GeoLocation) => ({\n  payload: v,\n  type: 'UPDATE_POINT_GEOCODE',\n});\n\nexport const updateVia = (v: string) => ({\n  payload: v,\n  type: 'UPDATE_VIA',\n});\n\nexport const updateViaCode = (v: string) => ({\n  payload: v,\n  type: 'UPDATE_VIA_CODE',\n});\n\nexport const switchHasVia = (v: boolean) => ({\n  payload: v,\n  type: 'SWITCH_HAS_VIA',\n});\n\nexport const updatePointType = (v: string) => ({\n  payload: v,\n  type: 'UPDATE_POINT_TYPE',\n})\n\nexport const updateDate = (v: Date) => ({\n  payload: v,\n  type: 'UPDATE_DATE',\n});\n\nexport const updateFlight = (v: string) => ({\n  payload: v,\n  type: 'UPDATE_FLIGHT',\n})\n\nexport const updateFlightNumber = (v: string) => ({\n  payload: v,\n  type: 'UPDATE_FLIGHT_NUMBER',\n})\n\nexport const updateFlightStatus = (v: FlightInfo) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_FLIGHT_STATUS,\n})\n\nexport const updateflightStatusForSeachAd = (v: FlightInfo) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_FLIGHT_STATUS_FOR_SEARCH_AD,\n})\n\n\nexport const updateflightStatusUserSetDateForSearchAd = (v: FlightInfo) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_FLIGHT_STATUS_USER_SET_DATE_FOR_SEARCH_AD,\n})\n\nexport const updateArrivalTimeToAirport = (v: number) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_ARRIVAL_TIME_TO_AIRPORT,\n})\n\nexport const updateCityName = (v: string) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_CITY_BANE,\n})\n\nexport const updateQuery = (v: Query) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_QUERY,\n});\n\nexport const updatePlace = (v: Place | null) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_PLACE,\n});\n\nexport const updateLastSelectedPlace = (v: Place) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_LAST_SELECTED_PLACE,\n});\n\nexport const updateOkinawaBusStopList = (v: OkinawaBusStop[]) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_OKIBAWABUS_BUSSTOPLIST,\n})\n\nexport const updateCourseIndex = (v: number) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_COURSE_INDEX,\n})\n\nexport const updateDirections = (v: PlaceDirections | null) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_DIRECTIONS,\n})\n\nexport const updateTaxiFareSummaries = (v: TaxiFareSummary[]) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_TAXI_FARE_SUMMARIES,\n})\n\nexport const switchIsDepartureGuide = (v: boolean) => ({\n  payload: v,\n  type: 'SWITCH_IS_DEPARTURE_GUIDE',\n})\n\nexport const swtichShinkansen = (v: boolean) => ({\n  payload: v,\n  type: 'SWITCH_SHINKANSEN',\n})\n\nexport const switchLimitedExpress = (v: boolean) => ({\n  payload: v,\n  type: 'SWITCH_LIMITED_EXPRESS',\n})\n\nexport const switchIc = (v: boolean) => ({\n  payload: v,\n  type: ConditionActionType.SWITCH_IC,\n})\n\nexport const switchPriorityAirportBus = (v: boolean) => ({\n  payload: v,\n  type: ConditionActionType.SWITCH_PRIORITY_AIRPORT_BUS,\n})\n\nexport const switchPriorityCar = (v: boolean) => ({\n  payload: v,\n  type: ConditionActionType.SWITCH_PRIORITY_CAR,\n})\n\nexport const switchPriorityCarWithBarrierFree = (v: boolean) => ({\n  payload: v,\n  type: ConditionActionType.SWITCH_PRIORITY_CAR_WITH_BARRIER_FREE,\n})\n\nexport const switchDomestic = (v: boolean) => ({\n  payload: v,\n  type: 'SWITCH_DOMESTIC',\n})\n\nexport const switchIsNoSetTerminalHND = (v: boolean) => ({\n  payload: v,\n  type: 'SWITCH_IS_NO_SET_TERMINAL_HND',\n})\n\nexport const switchIsAvalable = (v: boolean) => ({\n  payload: v,\n  type: ConditionActionType.SWITCH_IS_AVALABLE,\n})\n\nexport const switchIsShowOkinawaBusLink = (v: boolean) => ({\n  payload: v,\n  type: ConditionActionType.SWITCH_IS_SHOS_OKINAWA_BUS_LINK,\n})\n\nexport const updateTargetAirline = (v: AirlineList) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_TARGET_AIRLINE,\n})\n\nexport const updateCourse = (v: object) => ({\n  payload: v,\n  type: 'UPDATE_COURSE',\n})\n\nexport const updateSearchedAt = (v: Date) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_SEARCHED_AT,\n})\n\nexport const updateSearchHistories = (v: History[]) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_SEARCH_HISTORIES,\n})\n\nexport const switchConsentAirportArrivalTime = (v: boolean) => ({\n  payload: v,\n  type: 'SWITCH_CONSENT_AIRPORT_ARRIVAL_TIME',\n})\n\nexport const switchAirportModalShow = (v: boolean) => ({\n  payload: v,\n  type: 'SWITCH_AIRPORT_MODAL_SHOW',\n})\n\nexport const updateModalState = (v: ModalStatusList) => ({\n  payload: v,\n  type: ConditionActionType.UPDATE_MODAL_STATE,\n})\n\nexport const switchLimousineBusModalShow = (v: boolean) => ({\n  payload: v,\n  type: 'SWITCH_LIMOUSINE_BUS_MODAL_SHOW',\n})\n\nexport const switchBusTicketOitaModalShow = (v: boolean) => ({\n  payload: v,\n  type: 'SWITCH_BUS_TICKET_OITA_MODAL_SHOW',\n})\n\nexport const switchIsShowUMModal = (v: boolean) => ({\n  payload: v,\n  type: ConditionActionType.SWITCH_IS_SHOWUMMODAL,\n})\n\ninterface GetFlightParams {\n  flightNumber: string;\n}\ninterface GetFlightResult {\n  flightInfo: FlightInfo;\n}\n\ninterface GetExtremeParams {\n  // 駅コード、駅の名称、座標情報、住所情報または地点データなどのリスト。\n  viaList: string;\n  // 探索日。\n  date?: string,\n  // 探索時刻。\n  time?: string,\n  // 探索種別。\n  searchType?: string,\n  // 詳細探索条件データ。\n  conditionDetail?: string,\n  // 座標の測地系。\n  gcs: string,\n}\n\ninterface GetExtremeResult {\n  extreme: Extreme,\n}\n\ninterface GetConditionParams {\n  shinkansen?: boolean,\n  limitedExpress? : boolean,\n  highwayBus?: boolean,\n  connectionBus?: boolean,\n  localBus?: boolean,\n  ship?: boolean,\n}\n\ninterface GetConditionResult {\n  condition: string,\n}\n\n/**\n * 路線の種別(国内線または国際線)を取得する。\n */\nexport const getRouteType = {\n  start: (params: GetFlightParams) => ({\n    type: ConditionActionType.ANA_GET_ROUTE_TYPE_START as typeof ConditionActionType.ANA_GET_ROUTE_TYPE_START,\n    payload: params,\n  }),\n\n  succeed: (params: GetFlightParams, result: GetFlightResult) => ({\n    type: ConditionActionType.ANA_GET_ROUTE_TYPE_SUCCEED as typeof ConditionActionType.ANA_GET_ROUTE_TYPE_SUCCEED,\n    payload: { params, result },\n  }),\n\n  fail: (params: GetFlightParams, error: AxiosError) => ({\n    type: ConditionActionType.ANA_GET_ROUTE_TYPE_FAIL as typeof ConditionActionType.ANA_GET_ROUTE_TYPE_FAIL,\n    payload: { params, error },\n    error: true,\n  }),\n}\n\nexport const getFlight = {\n  start: (params: GetFlightParams) => ({\n    type: ConditionActionType.ANA_GET_FLIGHT_START as typeof ConditionActionType.ANA_GET_FLIGHT_START,\n    payload: params,\n  }),\n\n  succeed: (params: GetFlightParams, result: GetFlightResult) => ({\n    type: ConditionActionType.ANA_GET_FLIGHT_SUCCEED as typeof ConditionActionType.ANA_GET_FLIGHT_SUCCEED,\n    payload: { params, result },\n  }),\n\n  fail: (params: GetFlightParams, error: AxiosError) => ({\n    type: ConditionActionType.ANA_GET_FLIGHT_FAIL as typeof ConditionActionType.ANA_GET_FLIGHT_FAIL,\n    payload: { params, error },\n    error: true,\n  }),\n};\n\nexport const getExtreme = {\n  start: (params: GetExtremeParams) => ({\n    type: ConditionActionType.EKISPERT_GET_EXTREME_START as typeof ConditionActionType.EKISPERT_GET_EXTREME_START,\n    payload: params,\n  }),\n\n  succeed: (params: GetExtremeParams, result: GetExtremeResult) => ({\n    type: ConditionActionType.EKISPERT_GET_EXTREME_SUCCEED as typeof ConditionActionType.EKISPERT_GET_EXTREME_SUCCEED,\n    payload: { params, result },\n  }),\n\n  fail: (params: GetExtremeParams, error: AxiosError) => ({\n    type: ConditionActionType.EKISPERT_GET_EXTREME_FAIL as typeof ConditionActionType.EKISPERT_GET_EXTREME_FAIL,\n    payload: { params, error },\n    error: true,\n  }),\n};\n\nexport const getCondition = {\n  start: (params: GetConditionParams) => ({\n    type: ConditionActionType.EKISPERT_GET_CONDITION_START as typeof ConditionActionType.EKISPERT_GET_CONDITION_START,\n    payload: params,\n  }),\n\n  succeed: (params: GetConditionParams, result: GetConditionResult) => ({\n    type: ConditionActionType.EKISPERT_GET_CONDITION_SUCCEED as typeof ConditionActionType.EKISPERT_GET_CONDITION_SUCCEED,\n    payload: { params, result },\n  }),\n\n  fail: (params: GetConditionParams, error: AxiosError) => ({\n    type: ConditionActionType.EKISPERT_GET_CONDITION_FAIL as typeof ConditionActionType.EKISPERT_GET_CONDITION_FAIL,\n    payload: { params, error },\n    error: true,\n  }),\n};\n","import { AxiosError } from 'axios';\nimport { Course } from './../services/ekispert/models';\nimport { Query } from '../states/query';\nimport FlightInfo from '../services/ana/models/flightInfo';\nimport Place from '../services/google/Place';\nimport { PlaceDirections } from '../services/google/PlaceDirections';\nimport { GeoLocation } from '../utils/geoLocation';\nimport { PointType } from './common';\nimport { TaxiFareSummary } from '../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { AirlineList } from '../utils/Airlines';\nimport History from '../components/search/CandidatesModal/Histories/history';\n\n// 探索条件に関わる状態。\nexport interface ConditionState {\n  // ユーザーが指定した地点。(出発地または目的地。)\n  point: string,\n  // ユーザーが指定した駅のコード、または地点。\n  pointCode: string,\n  // ユーザーが指定した地点の座標情報\n  pointGeoCode: GeoLocation,\n  // 経由地。\n  via: string,\n  // 経由地の駅コード。\n  viaCode: string,\n  // 経由地があるかを表すフラグ。\n  hasVia: boolean,\n  // ユーザーが取得した地点(出発地または目的地)の種別。\n  // (駅名、緯度経度、住所の3種類。)\n  pointType: PointType,\n  // 探索日時。\n  date: Date,\n  // 搭乗便名。(例. ANA65)\n  flight: string,\n  // 搭乗便名の数字部分。(例. 65)\n  flightNumber: string,\n  // ユーザーが指定する空港滞在時間。\n  arrivalTimeToAirport: number,\n  // 「出発案内」であるかを表すフラグ。\n  // (Falseの場合は「到着案内」として扱う。)\n  isDepartureGuide: boolean,\n  // 新幹線を利用するかのフラグ。\n  isEnabledShinkansen: boolean,\n  // 有料特急を利用するかのフラグ。\n  isEnabledLimitedExpress: boolean,\n  // ICカード運賃を有効にするかのフラグ。\n  isEnabledIc: boolean,\n  // 探索条件詳細。(利用する交通種別など。)\n  conditionDetail: string,\n  /** 【使用非推奨】検索画面において国内線であるかのフラグ:一覧・結果画面では flightStatus.isDomesticを使用してください */\n  isDomestic: boolean,\n  flightStatus: FlightInfo;\n  /** 検索画面の広告用に取得した運航情報。 */\n  flightStatusForSeachAd: FlightInfo;\n  /** 検索画面の広告用に取得したユーザーが指定した日付を元にした運航情報 */\n  flightStatusUserSetDateForSearchAd: FlightInfo;\n  /** 出発地・到着地の市区町村データ */\n  cityName: string;\n  error?: AxiosError | null;\n  course: Course[] | [];\n  // 入力クエリ\n  query: Query;\n  /** 空港連絡バスを優先するフラグ。 */\n  hasPriorityAirportBus: boolean;\n  /** 自動車を優先するフラグ。 */\n  hasPriorityCar: boolean;\n  /** 自動車を優先をバリアフリーからONにしたか判定するフラグ。 */\n  hasPriorityCarWithBarrierFree: boolean;\n  /** 結果画面で表示する情報を提供した日時(表示している結果を取得した日時)。 */\n  searchedAt: Date;\n  /** 利用者が空港到着時間に同意したかを判定 */\n  consentAirportArrivalTime: boolean;\n  /** 空港到着時間同意モーダルを出現するか判定 */\n  airportModalShow: boolean;\n  /** 各種モーダルのステータスを定義 */\n  modalStatus: ModalStatusList;\n  /** リムジンバスモーダルを表示中かを判定 */\n  tokyoLimousineBusModalShow: boolean;\n  /** 大分バスチケットモーダルを表示中かを判定 */\n  busTicketOitaModalShow: boolean;\n  /** 羽田空港国際線利用でかつターミナル名が未決定かどうかを判定 */\n  isNoSetTerminalHND: boolean;\n  /** 空港アクセスナビが利用可能であるかを表すフラグ。 */\n  isAvalable: boolean;\n  /** 結果画面で表示する経路のインデックス。 */\n  courseIndex: number,\n  /** 工房連携で使用する沖縄バスの停留所一覧 */\n  okinawaBusStopList: OkinawaBusStop[];\n  /** 検索画面で沖縄バスのリンクを表示するかを判定 */\n  isShowOkinawaBusLink: boolean;\n  /** インクリメンタルサーチで取得した地点情報 */\n  place: Place | null;\n  /** 最後にインクリメンタルサーチで取得した地点情報 */\n  /** TODO: place に統合したい */\n  lastSelectedPlace: Place | null;\n  /** 空港から目的地までのGoogleDirectionAPIから取得したルート情報 */\n  directions: PlaceDirections | null;\n  /** 連携パラメータより判断する使用する航空会社 */\n  targetAirLine: AirlineList;\n  /** タクシー料金と距離の一覧 */\n  taxiFareSummaries: TaxiFareSummary[],\n  /** 検索時に指定した発着地の履歴。 */\n  searchHistories: History[],\n  /** UM */\n  isShowUMModal: boolean,\n}\n\nexport interface ModalStatusList {\n  /** 自動車経路表示時に1時間前未満を選択した際の注意モーダル */\n  carCourse: ModalStatus,\n  /** 他サイトから遷移時に表示する初期モーダル */\n  initModal: ModalStatus\n}\n\n/**\n * 一度しか表示しないモーダルの状態\n */\nexport enum ModalStatus {\n  HIDE = 'HIDE',\n  SHOW = 'SHOW',\n  ACCEPT = 'ACCEPT'\n}\n\n/** 沖縄バス停留所フォーマット */\nexport interface OkinawaBusStop {\n  lat: number,\n  lng: number,\n  area: string,\n  busStopName: string,\n  direction: string,\n  ekispertCode: string\n}\n","export const ArrivalGateToStation: { [key:string]: number; } = {\n  // 羽田空港\n  \"HND\":  30,\n  // 成田空港\n  'NRT':  30,\n  // 東京\n  'TYO':  30,\n  // 稚内空港\n  'WKJ':  1,\n  // 利尻空港\n  'RIS':  20,\n  // オホーツク紋別空港\n  'MBE':  15,\n  // 女満別空港\n  'MMB':  1,\n  // 根室中標津空港\n  'SHB': 15,\n  // 旭川空港\n  'AKJ':  20,\n  // 釧路空港\n  'KUH':  20,\n  // 帯広空港\n  'OBO':  15,\n  // 新千歳空港\n  'CTS':  30,\n  // 新千歳空港\n  // (ANA APIからは新千歳空港のコードとして「SPK」が返ってくるため。\n  //  丘珠空港はANAが就航していないため、「SPK」も新千歳空港として扱う。)\n  'SPK':  30,\n  // 函館空港\n  'HKD':  15,\n  // 青森空港\n  'AOJ':  15,\n  // 大館能代空港\n  'ONJ':  15,\n  // 秋田空港\n  'AXT':  15,\n  // 庄内空港\n  // 接続バスのダイヤに間に合わせるように10分とする\n  'SYO':  10,\n  // 仙台空港\n  'SDJ':  20,\n  // 新潟空港\n  'KIJ':  20,\n  // 福島空港\n  'FKS':  15,\n  // 八丈島空港\n  'HAC':  20,\n  // 静岡空港\n  'FSZ':  20,\n  // 中部国際空港\n  'NGO':  30,\n  // 伊丹空港\n  'ITM' :  30,\n  // 関西空港(大阪)\n  'KIX':  30,\n  // 神戸空港\n  'UKB':  20,\n  // 徳島空港\n  'TKS':  10,\n  // 高松空港\n  'TAK':  15,\n  // 岡山空港\n  'OKJ':  10,\n  // 高知空港\n  'KCZ':  5,\n  // 松山空港\n  'MYJ':  10,\n  // 広島空港\n  'HIJ':  20,\n  // 岩国空港\n  'IWK':  10,\n  // 富山空港\n  'TOY':  10,\n  // 能登空港\n  'NTQ':  15,\n  // 小松空港\n  'KMQ':  15,\n  // 鳥取空港\n  'TTJ':  10,\n  // 米子空港\n  'YGJ':  15,\n  // 萩・石見空港\n  'IWJ':  20,\n  // 山口宇部空港\n  'UBJ':  15,\n  // 北九州空港\n  'KKJ':  20,\n  // 対馬空港\n  'TSJ':  20,\n  // 壱岐空港\n  'IKI':  20,\n  // 福岡空港\n  'FUK':  30,\n  // 長崎空港\n  'NGS':  20,\n  // 五島福江空港\n  'FUJ':  20,\n  // 佐賀空港\n  'HSG':  15,\n  // 熊本空港\n  'KMJ':  15,\n  // 鹿児島空港\n  'KOJ':  20,\n  // 宮崎空港\n  'KMI':  20,\n  // 大分空港\n  'OIT':  10,\n  // 那覇空港\n  'OKA':  30,\n  // 宮古空港\n  'MMY':  20,\n  // 石垣空港\n  'ISG':  20,\n  // 天草空港\n  'AXJ':  20,\n  // 種子島空港\n  'TNE':  20,\n  // 屋久島空港\n  'KUM':  20,\n  // 与論空港\n  'RNJ':  20,\n  // 喜界空港\n  'KKX':  20,\n  // 沖永良部空港\n  'OKE':  20,\n  // 奄美空港\n  'ASJ':  20,\n  // 徳之島空港\n  'TKN':  20\n}\n","/**\n * 国際線の場合の搭乗便到着ゲートから最寄りの公共交通機関までの所要時間。\n */\nexport const ArrivalGateToStationInt: { [key:string]: number; } = {\n  // 羽田空港\n  \"HND\": 40,\n  // 成田空港\n  'NRT': 60,\n  // 関西空港(大阪)\n  'KIX': 40,\n}\n","/**\n * 搭乗口からバス利用となる各空港ごとの搭乗口のリスト。\n */\nexport const BusGates: { [key:string]: string[]; } = {\n  // 提供データに全角が含まれてた場合は念の為、全角・半角の2パターンを定義。\n  'KOJ': ['4A', '4A'],\n  'SDJ': ['A2', 'A3'],\n  'NRT': ['B', 'C', 'D', 'E', 'F', 'G'],\n  'CTS': ['0', '1B', '3B', '101', '102'],\n  'FUK': ['41', '42', '43', '44', '45', '50', '81', '82'],\n  'HND': ['500', '501', '502', '503', '504', '505', '506', '507', '508', '509', '510', '511', '512', '513'],\n  'ITM': ['5A', '5A', '9A', '9A', '9B', '9B', '9C', '9C'],\n  'KIX': ['201', '202', '211', '212'],\n  'NGO': ['101', '102', '103', '104', '105', '106'],\n  'OKA': ['38A', '38B', '38B', '38D', '96', '97'],\n  'KMJ': ['103', '104', '105'],\n}\n","/**\n * サテライトへ移動するためのバス利用となる搭乗口のリスト。\n * (2020/03/03現在、羽田空港のみ存在する。)\n */\nexport const SatelliteGates: { [key:string]: string[]; } = {\n  'HND': ['46', '47', '48'],\n}\n","export interface Query {\n  // 対象の便の便番号\n  flightNumber: string,\n  // 出発空港\n  depAirport: string,\n  // 到着空港\n  arrAirport: string,\n  // 出発空港の3レターコード\n  fromAirportCode: string,\n  // 到着空港の3レターコード\n  toAirportCode: string,\n  // 出発空港のターミナル名称\n  fromTerminal: string,\n  // 到着空港のターミナル名称\n  toTerminal: string,\n  // 対象便の出発予定日時\n  std: Date | null,\n  // 対象便の到着予定日時\n  sta: Date | null,\n  // 参照元を特定するためのパラメータ\n  referrer: string,\n  // 到着案内フラグ\n  isArrivalGuide: boolean,\n  // 画面の表示言語\n  lang: Lang,\n  // 国内線か\n  isDomestic: boolean\n}\n\n// TOOO: LangClassと統合する\nexport enum Lang {\n  ja = 'ja',\n  en = 'en',\n}\n\nexport const changeLang = (lang: string) => {\n  switch(lang) {\n    case 'ja':\n      return Lang.ja;\n    case 'en':\n      return Lang.en;\n    default:\n      return Lang.ja;\n  }\n}\n","import { differenceInCalendarDays, isBefore, isAfter, setMinutes, addHours, isToday, addDays, subDays, parse, addMinutes, differenceInDays, subHours, subMonths, isSameDay, subMinutes } from \"date-fns\";\nimport { format, utcToZonedTime, zonedTimeToUtc } from 'date-fns-tz';\n\n// 国内線の情報がANA APIから取得できる最大の基準日。(1日先まで取得可能。)\nconst BASE_MAX_DATE_OF_DOMESTIC = 1;\n// 国内線の情報がANA APIから取得できる最小の基準日。(1日前まで取得可能。)\nconst BASE_MIN_DATE_OF_DOMESTIC = -1;\n\n// 国際線の情報がANA APIから取得できる最大の基準日。(2日先まで取得可能。)\nconst BASE_MAX_DATE_OF_INTERNATINAL = 2;\n// 国際線の情報がANA APIから取得できる最小の基準日。(2日前まで取得可能。)\nconst BASE_MIN_DATE_OF_INTERNATINAL = -2;\n// UTCとJSTの時間差(分)\nconst DIFF_UTC_TO_JST_MINUTES = 540;\n\n/**\n * 日時に関する独自の処理をまとめたクラス。\n */\nclass DateTime {\n  /**\n   * 24時間を上回る表記で日付文字列を与えた時に処理をする\n   * @param dateStr 返還対象の日付文字列\n   */\n  static convertOver24HoursDate(dateStr: string | null) {\n    let localDate = null;\n    if(!dateStr){\n      return null;\n    }\n    // YYYYMMDDHHmmで来た場合\n    else if(/^\\d{12}$/.test(dateStr)) {\n      const format = 'yyyyMMddHHmm';\n      const date = dateStr.slice(0, 8);\n      const time = dateStr.slice(8);\n      let minutes = Number(time.slice(2));\n      let hour = Number(time.slice(0, 2)) + Math.floor(minutes/60);\n      if(isNaN(minutes) || isNaN(hour)){\n        return null;\n      }\n      minutes = minutes%60;\n      const addDay = Math.floor(hour/24);\n      hour = hour%24;\n      const setTime = ('0'+hour).slice(-2) + ('0'+minutes).slice(-2);\n      localDate = addDays(parse(date+setTime, format, new Date()), addDay);\n    }\n    // YYYYMMDDで来た場合\n    else if(/^\\d{8}$/.test(dateStr)) {\n      const format = 'yyyyMMdd';\n      localDate = parse(dateStr, format, new Date())\n    }\n    if(localDate !== null) {\n      return zonedTimeToUtc(localDate, 'Asia/Tokyo');\n    }\n    return null;\n  }\n\n  /**\n   * 搭乗便の日付が運行情報(ANA API)を参照可能な日付であるかを判別する。\n   * @param scheduledTime 搭乗便の定刻。\n   * @param isDomestic 搭乗便が国内線であるかのフラグ。\n   */\n  static isAvalableOperationInfo(scheduledTime: Date, isDomestic: boolean) {\n    const baseMaxDate = isDomestic ? BASE_MAX_DATE_OF_DOMESTIC : BASE_MAX_DATE_OF_INTERNATINAL;\n    const baseMinDate = isDomestic ? BASE_MIN_DATE_OF_DOMESTIC : BASE_MIN_DATE_OF_INTERNATINAL;\n    // 現在日時を取得する。(実行環境に応じてタイムゾーンは自動で設定される。)\n    const now = new Date();\n    // 「(搭乗便の定刻の日付) - (現在日時の日付)」の差を取得する。\n    const diff = differenceInCalendarDays(scheduledTime, now);\n    // 差が最大の基準日以下、かつ、差が最小の基準日以上である場合は運行情報を利用できる日付とみなす。\n    return diff <= baseMaxDate && diff >= baseMinDate ;\n  }\n\n  /**\n   * 時刻の分数に応じて、15分刻みの時刻(0分、15分、30分、45分)に整形する。\n   * @param date 日時。\n   */\n  static adjustBy15Minutes(date: Date) {\n    const min = date.getMinutes();\n    // 分数が1~14の場合は15分にする。\n    if (min > 0 && min < 15) {\n      return setMinutes(date, 15);\n    // 分数が16~29の場合は30分にする。\n    } else if (min > 15 && min < 30) {\n      return setMinutes(date, 30);\n    // 分数が31~44の場合は45分にする。\n    } else if (min > 30 && min < 45) {\n      return setMinutes(date, 45);\n    // 分数が46~59の場合は元の時間に1時間足した上で、分数を0分にする。\n    // (例. 9:46の場合、10:00とする。)\n    } else if (min > 45 && min < 60) {\n      return setMinutes(addHours(date, 1), 0);\n    // 分数が0・15・30・45の場合には元の日時をそのまま返す。\n    } else {\n      return date;\n    }\n  }\n  /**\n   * 時刻の分数に応じて、30分刻みの時刻(0分、30分)に整形する。\n   * @param date 日時。\n   */\n  static adjustBy30Minutes(date: Date) {\n    const min = date.getMinutes();\n    // 0 - 29分の場合には0分に切り捨てをする\n    return setMinutes(date, Math.floor(min/30)*30);\n  }\n  /**\n   * 時刻の分数に応じて、30分刻みの時刻(0分、30分)に切り上げて整形する。\n   * @param date 日時。\n   */\n  static adjustBy30MinutesCeil(date: Date) {\n    const min = date.getMinutes();\n    // const hour = date.getHours();\n    // 0 - 29分の場合には30分に切り上げをする\n    return setMinutes(date, Math.ceil(min/30)*30);\n  }\n\n  /**\n   * 時刻の分数に応じて、10分刻みの時刻に整形する。\n   * @param date 日時。\n   */\n  static adjustBy10Minutes(date: Date) {\n    /** 10分単位で分を切り上げる */\n    const min = Math.ceil(date.getMinutes()/10) * 10;\n    /** 60分以上になるときには時間を切り上げる */\n    if(min >= 60) {\n      return setMinutes(addHours(date, 1), (min - 60));\n    }\n    else {\n      return setMinutes(date, min);\n    }\n  }\n\n  /**\n   * 翌日以降であるかを判別する。(レンタカーのバナーの表示条件で利用する。2020/05/07現在。)\n   *  @param date 判別したい日時。\n   * */\n  static isAfterToday(date: Date) {\n    // 今日ではない、かつ、「指定された日時 - 現在日時」の差を取った時に1以上になる場合のみ、翌日以降とみなす。\n    return !isToday(date) && differenceInCalendarDays(date, new Date()) > 0;\n  }\n  /**\n   * 前日以前かを判定する。(Airporter沖縄連携)\n   * @param date 判別したい日時。\n   */\n  static isBeforeToday(date: Date) {\n    return differenceInCalendarDays(date, new Date()) < 0;\n  }\n\n  /** \n   * 当日以降であるかを判別する。(GoToトラベルのバナーの表示条件で利用する。2020/08/04現在。)\n   *  @param date 判別したい日時。\n   * */\n  static isTodayOrLater(date: Date) {\n    // 今日である、または、「指定された日時 - 現在日時」の差を取った時に1以上になる場合のみ、翌日以降とみなす。\n    return isToday(date) || differenceInCalendarDays(date, new Date()) > 0;\n  }\n\n  /**\n   * 所要時間の分数を「x時間xx分」の形式に変換する。\n   * @param minutes 所要時間の分数。\n   */\n  static toHHmm(minutes: number, hourSuffix: string, minSuffix: string) {\n    let hhmm = '';\n    /** 時間。(分数を60で割った商を切り捨てしたもの。) */\n    const hour = Math.floor(minutes / 60);\n    /** 分数。(分数を60で割った余り。) */\n    const min = minutes % 60;\n    // 割り算をした結果、1時間以上である場合は、「xx時間」を返却する文字列に加える。\n    if (hour > 0) { hhmm += hour + hourSuffix; }\n    // 分数を返却する文字列に加える。\n    hhmm += min + minSuffix;\n    return hhmm;\n  }\n\n  /**\n   * JRの列車予約リンクを表示するか\n   * 列車出発10分前 ~ 1ヶ月前の朝10時以降しか予約できない\n   * @param depDate 列車出発日時\n   * @param now 現在時刻(debug用)\n   */\n  static isAbleToReserveJR(depDate: Date, now: Date = new Date()){\n    // 出発10分前を切ると予約ができない\n    const isAfter: boolean = depDate.getTime() > addMinutes(now, 10).getTime();\n    // 出発日1ヶ月前と検索日の日の差を求める\n    let oneMonthAgoDiffDay = differenceInCalendarDays(now, subMonths(depDate, 1));\n    // 1ヶ月前と同じ日が存在しない場合、同じ月の初日が予約可能日となる\n    // 参考リンク:\n    // https://faq.jr-odekake.net/faq_detail.html?id=4294&category=722&page=1\n    if(depDate.getDate() !== subMonths(depDate, 1).getDate()) {\n      const ableReserveDay = depDate.setDate(1);\n      oneMonthAgoDiffDay = differenceInCalendarDays(now, ableReserveDay);\n    }\n    // 検索日の1ヶ月後の10時以降しか予約ができない\n    const isBefore: boolean = oneMonthAgoDiffDay > 0 || (oneMonthAgoDiffDay === 0 && now.getHours() >= 10);\n    return isBefore && isAfter;\n  }\n\n  /**\n   * 南海ラピートの予約が可能か\n   * 列車出発前日 〜 1ヶ月前以降しか予約できない\n   * @param depDate 列車出発日時\n   * @param now 現在時刻(debug用)\n   */\n  static isAbleToReserveNankaiRapid(depDate: Date, now: Date = new Date()) {\n    const diffDay = differenceInCalendarDays(now, depDate);\n    // 検索日の当日以降は予約できない\n    const isAfter = diffDay < 0;\n    // 出発日1ヶ月前と検索日の日の差を求める\n    let oneMonthAgoDiffDay = differenceInCalendarDays(now, subMonths(depDate, 1));\n    // 参考リンク:\n    // https://www.club-nankai.jp/traffic/ticketless/faq.html\n    if(depDate.getDate() !== subMonths(depDate, 1).getDate()) {\n      const ableReserveDay = depDate.setDate(1);\n      oneMonthAgoDiffDay = differenceInCalendarDays(now, ableReserveDay);\n    }\n    // 検索日の1ヶ月後しか予約ができない\n    const isBefore: boolean = oneMonthAgoDiffDay >= 0;\n    return isBefore && isAfter;\n  }\n\n  /**\n   * 沖縄バスのリンクを表示するか\n   * 3ヶ月前の同日がない場合には次の月の初日以降なら予約可能とする\n   * @param depDate 搭乗便の搭乗日\n   * @param now 現在時刻(debug用)\n   */\n  static isShowOkinawaBusBanner(depDate: Date, now: Date = new Date()) {\n    // 前日以前しか予約できない\n    const isAfter: boolean = differenceInCalendarDays(now, depDate) <= 0;\n    // 出発日3ヶ月前と検索日の日の差を求める\n    let diffDay = differenceInCalendarDays(now, subMonths(depDate, 3));\n    // 3ヶ月前と同じ日が存在しない場合、同じ月の初日が予約可能日となる\n    if(depDate.getDate() !== subMonths(depDate, 3).getDate()) {\n      const ableReserveDay = subMonths(depDate, 2).setDate(1);\n      diffDay = differenceInCalendarDays(now, ableReserveDay);\n    }\n    // 検索日の1ヶ月後しか予約ができない\n    const isBefore: boolean = diffDay >= 0;\n    return isBefore && isAfter;\n  }\n  /**\n   * 終電を跨ぐかを判定する\n   * 翌日の午前3時を跨いだ場合には終電を跨いだと判定をする\n   * @param baseDate 基準となる時刻\n   * @param targetDate 判定対象の時刻\n   */\n  static isTommorowTrain(baseDate: Date, targetDate: Date) {\n    // 1日以上離れた場合には跨いだと判定\n    if(differenceInDays(targetDate, baseDate) > 0) {\n      return true;\n    }\n    const a = subHours(baseDate, 3);\n    const b = subHours(targetDate, 3);\n    // 日付を3時間ずらして、日を跨いでいないかを判定\n    return differenceInCalendarDays(b, a) > 0;\n  }\n\n  /**\n   * 東京リムジンバスのバナーを表示するかを判定する関数\n   * @param busDepDate バス出発時刻\n   * @param isDepAirport バスが空港発か\n   * @param flightArrTime フライト到着時刻\n   * @param now 現在時刻(debu用)\n   */\n  static isAbleToReserveTokyoLimousineBus(busDepDate: Date, isDepAirport: boolean, flightArrTime: Date, now: Date = new Date()) {\n    /**\n     * 以下の条件を満たす場合に表示する\n     * 1. 空港発着に関わらず、バス出発10分前以降は予約できないようにする\n     * 2-1. 空港発便の場合、搭乗便の実到着時間以降のみ予約できるようにする\n     * 2-2. 空港着便の場合、30日前以降より予約できるようにする\n     */\n    // 出発10分前を切ると予約ができない\n    const isAfter: boolean = busDepDate.getTime() >= addMinutes(now, 10).getTime();\n    let isBefore;\n    // 空港発の便では搭乗便の実到着時間以降で予約できる\n    if(isDepAirport) {\n      isBefore = now.getTime() >= flightArrTime.getTime();\n    }\n    else {\n      // 空港着の便では30日前以降より予約できるようにする\n      const diffDay = differenceInCalendarDays(busDepDate, now);\n      isBefore = diffDay < 31;\n    }\n    return isBefore && isAfter;\n  }\n\n  /**\n   * MKタクシーのバナーを表示するかを判定する関数\n   * @param date フライト日時\n   */\n  static isMkTaxi(date: Date) {\n    const now = new Date();\n    const beforeDay = subDays(date, 1);\n    const diff = differenceInCalendarDays(beforeDay, now);\n\n    // 前日の16時までは表示する\n    return diff > 0 || (diff === 0 && now.getHours() < 16);\n  }\n  /**\n   * MKタクシーのバナーを表示するかを判定する関数\n   * @param date フライト日時\n   */\n  static isMkTaxiTYO(date: Date, now: Date = new Date()) {\n    const beforeDay = subDays(date, 1);\n    const diff = differenceInCalendarDays(beforeDay, now);\n\n    // 24時間前までは表示する\n    return diff > 0 || (diff === 0 && now.getTime() < beforeDay.getTime());\n  }\n  /**\n   * MKタクシーのバナーを表示するかを判定する関数\n   * @param date フライト日時\n   */\n  static isMkTaxiKyoto(date: Date) {\n    const now = new Date();\n    const beforeDay = subDays(date, 1);\n    const diff = differenceInCalendarDays(beforeDay, now);\n\n    // 2日前の17時までは表示する\n    return diff > 1 || (diff === 1 && now.getHours() < 17);\n  }\n  /**\n   * MKハイヤーのバナーを表示するかを判定する関数\n   * @param date フライト日時\n   */\n  static isMkHire(date: Date) {\n    const now = new Date();\n    const diff = differenceInCalendarDays(date, now);\n\n    // 2日前までは表示する\n    return diff > 1;\n  }\n\n  /**\n   * 検索画面にて大阪リムジンバスのバナーを表示するかを判定する関数\n   * @param date 検索に設定した日付\n   */\n  static isShowSearchOsakaLimousineBus(date: Date, now: Date = new Date()) {\n    // 検索日付が60日前〜当日である場合に表示する\n    const diff = differenceInCalendarDays(date, now);\n    const limitDay = 60;\n    return diff <= limitDay && diff >= 0;\n  }\n\n  /**\n   * 結果画面にて大阪リムジンバスのバナー・ボタンを表示するかを判定する関数\n   * @param busDepDate バス出発時間\n   */\n  static isShowResultOsakaLimousineBus(busDepDate: Date, now: Date = new Date()) {\n    // バス出発日時が60日前〜バス出発時刻までであること\n    const diff = differenceInCalendarDays(busDepDate, now);\n    const limitDay = 60;\n    return diff <= limitDay && busDepDate.getTime() >= now.getTime();\n  }\n\n\n  /** 指定したDateがInvalidDateかを判定する */\n  static isInvalidDate(date: Date) {\n    // UNIX時間を取得したときに数値以外が返ってきた場合はInvaid Dateとしてみなす。\n    return isNaN(date.getTime());\n  }\n\n  /**\n   * 現地時間から日本時間に変換したDate型を取得する\n   * @param date 現地時間Date\n   * @returns\n   */\n  static getJSTDate(date: Date) {\n    // タイムゾーンを'Asia/Tokyo' (日本時間) に変換\n    return utcToZonedTime(date, 'Asia/Tokyo');\n  }\n\n  /**\n   * Date型の時刻表示は必ずこの関数を経由して行うようにする\n   * @param date 表示したい時刻\n   * @param formatString 表示したい形式\n   * @param option\n   * @returns\n   */\n  static JSTFormat(date: Date, formatString: string, option: any = {}) {\n    try {\n      // タイムゾーンを'Asia/Tokyo' (日本時間) に変換\n      const tokyoDate = DateTime.getJSTDate(date);\n      return format(tokyoDate, formatString, option);\n    }\n    catch(e) {\n      // dev環境のみエラーログを出力\n      if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n        console.error(e);\n      }\n      return '';\n    }\n  }\n\n  /**\n   * 現地時間Date -> JSTUNXTIMEを取得する\n   * UTCの 10/01 00:00 を与えたらJST 10/01 00:00 のUNIX TIMEを返す\n   */\n  static getJSTTime(date: Date) {\n    const diffJSTMinutes = date.getTimezoneOffset() + DIFF_UTC_TO_JST_MINUTES;\n    const JSTDate: Date = subMinutes(date, diffJSTMinutes);\n    return JSTDate.getTime();\n  }\n\n  /**\n   * 東京スカイツリーバナーを表示するか\n   * 7日前〜前日のみ掲載\n   */\n  static isShowTokyoSkyTreeBanner(userSetDate: Date, now: Date = new Date()) {\n    const diff = differenceInCalendarDays(userSetDate, now);\n    return diff > 0 && diff < 8;\n  }\n\n  /**\n   * JSTのISO8601形式に変換して返す\n   * @param date\n   */\n  static toISOString(date: Date) {\n    // タイムゾーンを'Asia/Tokyo' (日本時間) に変換\n    return DateTime.JSTFormat(date, \"yyyy-MM-dd'T'HH:mm:ss+09:00\");\n  }\n\n  /**\n   * 北谷MaaS予約ボタンを表示するか\n   */\n  static isShowChatanMaaSButton(flightDate: Date, now: Date = new Date()) {\n    const diff = differenceInCalendarDays(flightDate, now);\n    // 3日前までは表示する\n    return diff > 2;\n  }\n\n  /**\n   * 名鉄バスCentX予約ボタンを表示するか\n   * end: 2023/05/01 00:00\n   */\n  static isShowMeitetsuBusCentxButton(rideDate: Date) {\n    const end = new Date(\"2023-05-01T00:00:00+09:00\");\n    return isBefore(rideDate, end)\n  }\n\n  /**\n   * ANASmartTravelオンラインチェックインバナーバナーを表示するか\n   * @param flightDate フライト日付\n   */\n  static isShowSmartTravelBanner(flightDate: Date) {\n    const now = new Date();\n    const diff = differenceInCalendarDays(flightDate, now);\n    // 2日前までは表示する\n    return diff <= 2;\n  }\n\n\n  /**\n   * 現在が指定の時刻に収まっているかを判定する\n   * @param start 開始時刻(HH:mm)\n   * @param end 終了時刻(HH:mm)\n   * @param now 現在時刻\n   */\n  static isDurationTime(start: string, end: string, now = new Date()) {\n    const getTotalMinutes = (str: string) => {\n      const hour_minutes = str.split(':');\n      return Number(hour_minutes[0]) * 60 + Number(hour_minutes[1]);\n    }\n    const nowTotalMintes = now.getHours() * 60 + now.getMinutes();\n    return nowTotalMintes >= getTotalMinutes(start) && nowTotalMintes <= getTotalMinutes(end);\n  }\n\n  /**\n   * えきねっと予約リンクが表示できるか\n   * @param depTime 最初の区間の列車出発時刻\n   * @param now 現在時刻\n   */\n  static isAbleDisplayEkinetLink(depTime: Date, now = new Date()) {\n    // 入力されたDateが invalid Date のときは表示しない\n    if(isNaN(depTime.getTime())) {\n      return false;\n    }\n    // 出発10分前を切ると予約ができない\n    const isAfter: boolean = depTime.getTime() > addMinutes(now, 10).getTime();\n    // 出発が1ヶ月後+6日前以前の場合には表示しない\n    let diffDays: number = -1;\n    // 1ヶ月前と同じ日が存在しない場合、同じ月の初日が予約可能日となる\n    if(depTime.getDate() !== subMonths(depTime, 1).getDate()) {\n      const ableReserveDay = subDays(depTime.setDate(1), 6);\n      diffDays = differenceInCalendarDays(now, ableReserveDay);\n    }\n    else {\n      /** 予約可能な日付 */\n      const isAbleReserveDay = subDays(subMonths(depTime, 1), 6);\n      diffDays = differenceInCalendarDays(now, isAbleReserveDay);\n    }\n    const isBefore = diffDays >= 0;\n    if(!(isAfter && isBefore)) {\n      return false;\n    }\n    // えきねっとメンテナンス時刻(23:50 - 5:00)までは表示しない\n    return DateTime.isDurationTime(\"05:00\", \"23:50\", now);\n  }\n\n  /**\n   * UniversalMaaS実証実験・社会実装のサービスイン済みか?\n   * 2023-01-27T11:00 以降であれば true\n   * @param now 現在時刻(デバッグ用)\n   */\n  static isUniversalMaaSServiceIn2023(now: Date = new Date()) {\n    const limit = new Date(\"2023-01-27T11:00:00+09:00\");\n    return now.getTime() >= limit.getTime();\n  }\n\n  /**\n   * A2NetworkBannerのバナーを表示するか?\n   * llimit: 2024/01/25 23:59:59\n   */\n  static isShowA2networkBanner(now = new Date()) {\n    const limit = new Date(\"2024-01-26T00:00:00+09:00\");\n    return isBefore(now, limit);\n  }\n\n  /**\n   * 伊予鉄タクシー観光バナー:AM-854\n   * start: 2023/07/01\n   * end: 2024/03/31\n   * @param flightDate\n   * @returns\n   */\n  static isShowIyotetsuTaxiBanner(now: Date = new Date()) {\n    const start = new Date(\"2023-06-30T23:59:59+09:00\");\n    const end = new Date(\"2024-04-01T00:00:00+09:00\");\n    return isAfter(now, start) && isBefore(now, end)\n  }\n\n  /**\n   * NH159便のみ9/2以降は第3ターミナルとなる\n   * @param flightDate フライト日付\n   * @returns 第二ターミナル発着となるか?\n   */\n  static isHND2ndTerminalNH159limit(flightDate: Date) {\n    const limit = new Date(\"2023-09-02T00:00:00+09:00\");\n    return isBefore(flightDate, limit);\n  }\n\n  /**\n   * 羽田国際の特定便到着時は24時間前以前は運行情報APIを見ずにターミナルを確定させる\n   * @param flightArrDate フライト到着時刻\n   * @returns 24時間前を切っているか?\n   */\n  static isHND2ndTerminalArr24Limit(flightArrDate: Date, now: Date = new Date()) {\n    return flightArrDate.getTime() < addHours(now, 24).getTime();\n  }\n\n  /**\n   * AM-858: TIS広告バナー表示条件\n   * start: 2023/08/01\n   * end: 2023/08/31\n   * @param now\n   * @returns\n   */\n  static isShowTISOkinawaBanner(now: Date = new Date()) {\n    const start = new Date(\"2023-07-31T23:59:59+09:00\");\n    const end = new Date(\"2023-09-01T00:00:00+09:00\");\n    return isAfter(now, start) && isBefore(now, end)\n  }\n}\n\n/**\n * HH:mm形式の時刻の文字列にする。\n * @param date 変換したいDate型オブジェクト。\n */\nexport function formatToHHmm(date: Date) {\n  // タイムゾーンを'Asia/Tokyo' (日本時間) に変換\n  return DateTime.JSTFormat(date, \"HH:mm\");\n}\n\n/**\n * Date型のオブジェクトを「yyyyMMddHHmm」形式の日時の文字列にする。\n * @param date 変換したいオブジェクト。\n */\nexport function toyyyyMMddHHmm(date: Date) {\n  // タイムゾーンを'Asia/Tokyo' (日本時間) に変換\n  return DateTime.JSTFormat(date, \"yyyyMMddHHmm\");\n}\n\n/**\n * yyyyMMddHHmm形式の日時の文字列をDate型にパースする。\n * @param dateString 「yyyyMMddHHmm」形式の日時の文字列。\n */\nexport function parseFromyyyyMMddHHmm(dateString: string) {\n  return parse(dateString, 'yyyyMMddHHmm', new Date());\n}\n\n/**\n * 有効なDate型の値であるか(Invalid Dateではないか)を判別する。\n * @param date 判別したいDate型の値。\n */\nexport function isValidDate(date: Date) {\n  return date.toString() !== 'Invalid Date';\n}\n\n/**\n * Date型の初期値(1970/01/01 00:00:00 UTC)であるかを判別する。\n * @param date 判別したいDate型の値。\n */\nexport function isInitialDate(date: Date) {\n  return date.getTime() === 0;\n}\n\n/**\n * 言語設定に応じた年月日の文字列を返す。\n * @param date 探索画面で設定した日付。\n */\nexport function getDate(date: Date, lang: string) {\n  // タイムゾーンを'Asia/Tokyo' (日本時間) に変換\n  const formatString = (lang === 'en') ? 'MMMM do yyyy': 'yyyy/MM/dd';\n  return DateTime.JSTFormat(date, formatString);\n}\n\n/**\n * 引数で指定した開始日と終了日の間に現在日時の日付が含まれているかを判別する。\n * (経路に関して運行情報を表示するかを判別する際に利用する。2020/10/26現在。)\n * @param startDate 開始日。\n * @param endDate 終了日。\n */\nexport function isIncludedToday(startDate: Date, endDate: Date) {\n  const now = new Date();\n  // 以下の2つの条件をともに満たしている場合にtrueを返す。\n  // 1. 現在日時の日付と開始日が一致、または、現在日時の日付が開始日より後の日であること。\n  // 2. 現在日時の日付と終了日が一致、または、現在日時の日付が終了日より前の日であること。\n  return (isSameDay(now, startDate) || isAfter(now, startDate)) && (isSameDay(now, endDate) || isBefore(now, endDate));\n}\n\nexport default DateTime;\n","export type AirlineList = 'ANA' | 'JAL' | 'IBX' | 'SJO' | 'APJ' | 'ADO' | 'JAC' | 'AMX' | 'SNJ' | 'FDA' | 'JJP' | 'ASV' | 'TWB' | 'CAL' | 'HKE';\n\ntype AirlineLetterCodesType = {\n  [key in AirlineList]: string[];\n};\n\n/**\n * ANA以外の航空会社に関するライブラリ\n */\nexport default class Airlines {\n  /** 各航空会社と2レター・3レターの一覧 */\n  static AirlineLetterCodes: AirlineLetterCodesType = {\n    ANA: ['ANA', 'NH'],\n    JAL: ['JAL', 'JL'],\n    IBX: ['IBX', 'FW'],\n    SJO: ['SJO', 'IJ'],\n    APJ: ['APJ', 'MM'],\n    ADO: ['ADO', 'HD'],\n    JAC: ['JAC', 'JC'],\n    AMX: ['AMX', 'AHX', 'MZ'],\n    SNJ: ['SNJ', 'SNA', '6J'],\n    FDA: ['FDA', 'JH'],\n    JJP: ['GK', 'JJP'],\n    ASV: ['RS', 'ASV'],\n    TWB: ['TW', 'TWB'],\n    CAL: ['CI', 'CAL'],\n    HKE: ['UO', 'HKE'],\n  }\n\n  static AirlineNameList: {[key in AirlineList]: string } = {\n    ANA: '全日本空輸',\n    JAL: '日本航空',\n    IBX: 'IBEXエアラインズ',\n    SJO: 'SPRING JAPAN',\n    APJ: 'Peach Aviation',\n    ADO: 'AIRDO',\n    JAC: '日本エアコミューター',\n    AMX: '天草エアライン',\n    SNJ: 'ソラシドエア',\n    FDA: 'フジドリームエアラインズ',\n    JJP: 'ジェットスター',\n    ASV: 'エアソウル',\n    TWB: 'ティーウェイ航空',\n    CAL: 'チャイナエアライン',\n    HKE: '香港エクスプレス'\n  }\n\n  /**\n   * 便名の数字部分より特定の航空会社のコードシェア便かを判定する\n   */\n  static isTargetAirlineCodeShare(codeNumber: number | string, startNumber: number, endNumber: number) {\n    if(typeof codeNumber === 'string') {\n      // 便名から便番号のみを取得する。\n      codeNumber = Number(codeNumber.replace(/[^0-9]/g,''));\n    }\n    return startNumber <= codeNumber && endNumber >= codeNumber;\n  }\n\n  /**\n   * 便名の数字部分よりどの航空会社のコードシェア便かを判定する\n   * @param codeNumber\n   */\n  static getAirlineFrotmCodeShare(codeNumber: number | string): AirlineList {\n    const CodeShareList = {\n      APJ: {\n        start: 4001,\n        end: 4300 // TODO: 範囲については詳細が来たら修正する\n      },\n      AMX: {\n        start: 4301,\n        end: 4314,\n      },\n      JAC: {\n        start: 4321,\n        end: 4400\n      }\n    }\n    /** Peach判定 */\n    if(Airlines.isTargetAirlineCodeShare(codeNumber, CodeShareList.APJ.start, CodeShareList.APJ.end)) {\n      return 'APJ';\n    }\n    /** 日本エアコミューター判定 */\n    if(Airlines.isTargetAirlineCodeShare(codeNumber, CodeShareList.AMX.start, CodeShareList.AMX.end)) {\n      return 'AMX';\n    }\n    /** 天草エアライン判定 */\n    if(Airlines.isTargetAirlineCodeShare(codeNumber, CodeShareList.JAC.start, CodeShareList.JAC.end)) {\n      return 'JAC';\n    }\n    return 'ANA';\n  }\n\n  /** 便名よりどの航空会社かを判別する */\n  static getAriline(flightNumber: string): AirlineList {\n    /** 便名の範囲よりCodeShare便かを判定する */\n    const targetCodeShareAirline = Airlines.getAirlineFrotmCodeShare(flightNumber)\n    if(targetCodeShareAirline !== 'ANA') {\n      return targetCodeShareAirline;\n    }\n    /** NH1000 のようにレターコード+数字で来るのでレターコード部分と数字部分を分離する */\n    const matchFlight = flightNumber.match(/^([A-Z]{2,3})(\\d+)$/);\n    if(matchFlight && matchFlight.length > 2) {\n      /** 抽出されたレターコード */\n      const airlineLetterCode = matchFlight[1];\n      /** AirlineLetterCodesより、どの航空会社に当たるのかを判定する */\n      const marchAirline = Object.keys(Airlines.AirlineLetterCodes).find((airline)=>{\n        const targetLetterCodes = Airlines.AirlineLetterCodes[<AirlineList>airline];\n        return targetLetterCodes.includes(airlineLetterCode);\n      })\n      if(marchAirline) {\n        return <AirlineList>marchAirline;\n      }\n      /** 一覧にない航空会社の場合はANAにする */\n      return 'ANA';\n    }\n    /** flightNumber連携がないときや、異常値が入った場合にはANAにする */\n    else {\n      return 'ANA';\n    }\n  }\n\n  /**\n   * 検索画面から結果画面に遷移するときに注意もーダルを表示する航空会社かを判別する\n   * @param airline 対象となる航空会社\n   * @returns\n   */\n  static isShowSearchNoticeModal(airline: AirlineList) {\n    return ['APJ', 'SJO', 'AMX', 'JAC'].includes(airline)\n  }\n\n  /**\n   * stringからAirlineListに変換する\n   * 対応してない航空会社が入れられた場合にはANAを返す\n   **/\n  static convertAirline(airline: string): AirlineList {\n    return <AirlineList>airline;\n    // const list: string[] = Object.entries(AirlineList).map((x)=>{ return <string>x[1] })\n    // if(list.includes(airline)) {\n    //   return <AirlineList>airline;\n    // }\n    // return 'ANA';\n  }\n\n  /**\n   * 搭乗便名を変更できる航空会社かを判定する\n   * @param airline 対象となる航空会社\n   * @returns\n   */\n  static isAbleToChangeFlightNumber(airline: AirlineList) {\n    const ableList = ['ANA'];\n    return ableList.includes(airline);\n  }\n\n  /**\n   * 日付を変更できる航空会社化を判定する\n   * @param airline 対象となる航空会社\n   * @returns\n   */\n  static isAbleToChangeDate(airline: AirlineList) {\n    const ableList = ['ANA', 'IBX', 'SJO', 'ADO', 'JAL', 'SNJ', 'FDA', 'JJP'];\n    return ableList.includes(airline);\n  }\n\n  /**\n   * 運行情報APIから便情報を取得可能な航空会社か判定する\n   * @param airline 対象となる航空会社\n   * @returns\n   */\n  static isAbleToGetFlightInfo(airline: AirlineList) {\n    const ableList = ['ANA', 'ADO', 'IBX', 'SNJ'];\n    return ableList.includes(airline);\n  }\n\n  /**\n   * 広告を表示する航空会社かを判断する\n   * TODO: 今後は航空会社ごとに表示する広告を選別する予定なのでそのときは別途対応(2022/03/15)\n   */\n  static isShowAd(airline: AirlineList) {\n    const showAdList = ['ANA', 'APJ', 'ADO', 'IBX', 'SNJ', 'ASV', 'TWB', 'CAL', 'HKE'];\n    return showAdList.includes(airline);\n  }\n\n  /**\n   * ヘッダー右上のハンバーガーボタンを表示する航空会社かを判断する\n   */\n  static isShowRightMenu(airline: AirlineList) {\n    const showAdList = ['ANA', 'APJ', 'ADO', 'IBX'];\n    return showAdList.includes(airline);\n  }\n\n  /**\n   * 空港割引クーポンを表示する航空会社かを判断する\n   * @param airline 対象となる航空会社\n   * @returns\n   */\n  static isShowAirportCouponButton(airline: AirlineList) {\n    const showAdList = ['ANA', 'APJ', 'ADO', 'SNJ'];\n    return showAdList.includes(airline);\n  }\n\n  /**\n   * バナー広告を表示する航空会社かを判断する\n   * @param airline 対象となる航空会社\n   * @returns\n   */\n  static isShowBannerAd(airline: AirlineList) {\n    const showAdList = ['ANA', 'APJ', 'ADO', 'IBX', 'SNJ', 'ASV', 'TWB', 'CAL', 'HKE'];\n    return showAdList.includes(airline);\n  }\n\n  /**\n   * 駅すぱあとの空路時刻表より空路情報を取得しない航空会社か\n   * @param airline 対象となる航空会社\n   * @returns\n   */\n  static isNotGetTimeTablePlane(airline: AirlineList) {\n    const showAdList = ['APJ', 'ADO', 'JAC', 'AMX', 'ASV', 'TWB', 'CAL', 'HKE'];\n    return showAdList.includes(airline);\n  }\n\n  /**\n   * 保安検査場通過時刻を表示しない事業者か\n   * @param airline 対象となる航空会社\n   */\n  static isDisableSecurityGateDate(airline: AirlineList) {\n    const target = ['SJO', 'ASV', 'TWB', 'CAL', 'HKE'];\n    return target.includes(airline);\n  }\n\n  /**\n   * 搭乗口締め切り時間時刻を表示しない事業者か\n   * @param airline 対象となる航空会社\n   */\n  static isDisableBoardingGateDate(airline: AirlineList) {\n    const target = ['ASV', 'TWB', 'CAL', 'HKE'];\n    return target.includes(airline);\n  }\n\n  /**\n   * ANA APIにリクエストする際に使用する航空会社コード(2文字)を取得する。\n   * @param 対象となる航空会社\n   * @returns 航空会社コード。\n   */\n  static getAirlineCode(airline: AirlineList) {\n    const targetLetterCodes = Airlines.AirlineLetterCodes[airline];\n    if(targetLetterCodes) {\n      return targetLetterCodes.find((x) => {\n        return x.length === 2;\n      })\n    }\n    return '';\n  }\n\n  /**\n   * 各種連携サービスに遷移する際に連携する航空会社コード(3文字)を取得する。\n   * @param isAirdo AIRDO便であるかを表すフラグ。\n   * @returns 3文字の航空会社コード。\n   */\n  static getAirlineThreeLetterCode(airline: AirlineList): string {\n    const targetLetterCodes = Airlines.AirlineLetterCodes[airline];\n    if(targetLetterCodes) {\n      return targetLetterCodes.find((x) => {\n        return x.length === 3;\n      }) || '';\n    }\n    return '';\n  }\n\n  /**\n   * 成田空港で第三ターミナルを使用する可能性がある事業者かどうか\n   */\n  static isUseNRTThirdTerminal(airline: AirlineList) {\n    const targetAirline = ['SJO'];\n    return targetAirline.includes(airline);\n  }\n\n  /**\n   * 搭乗口で締め切り時間20分前かを判別するか\n   * @param airline 対象となる航空会社\n   */\n  static isBordingGate20min(airline: AirlineList) {\n    const targetAirline = ['SJO', 'APJ'];\n    return targetAirline.includes(airline);\n  }\n\n  /**\n   * 空港内マップを表示するか\n   * @param airline 対象となる航空会社\n   */\n  static isShowAirportMap(airline: AirlineList) {\n    const targetAirline = ['ANA', 'APJ'];\n    return targetAirline.includes(airline);\n  }\n\n  /**\n   * 全画面共通の注意事項で運航情報のリンクを表示するかを判別する。\n   * @param airlineCode 航空会社の3文字のコード。\n   * @returns 運航情報のリンクを表示する場合はtrueを返す。\n   */\n  static isShowFlightStatusLink(airlineCode: AirlineList) {\n    // AIRDO、日本エアコミューター、天草エアラインの場合は表示しない。\n    return airlineCode !== 'ADO' && airlineCode !== 'JAC' && airlineCode !== 'AMX';\n  }\n}\n","export interface Airport {\n  'path': string,\n  'anchor': {\n    'arr': string,\n    'dep': string\n  }\n}\n\nexport const AirportMapPath: { [key:string]: Airport; } = {\n  // 羽田空港第1ターミナル\n  \"HND_1\": {\n    'path': 'hnd.html',\n    'anchor': {\n      'arr': '#floor002',\n      'dep': '#floor001'\n    }\n  },\n  // 羽田空港第2ターミナル\n  \"HND_2\": {\n    'path': 'hnd02.html',\n    'anchor': {\n      'arr': '#floor002',\n      'dep': '#floor001'\n    }\n  },\n  // 成田空港\n  'NRT': {\n    'path': 'nrt.html',\n    'anchor': {\n      'arr': '#floor001',\n      'dep': '#floor003'\n    }\n  },\n  // 稚内空港\n  'WKJ': {\n    'path': 'wkj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 利尻空港\n  'RIS': {\n    'path': 'ris.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // オホーツク紋別空港\n  'MBE': {\n    'path': 'mbe.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 女満別空港\n  'MMB': {\n    'path': 'mmb.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 根室中標津空港\n  'SHB': {\n    'path': 'shb.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 旭川空港\n  'AKJ': {\n    'path': 'akj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 釧路空港\n  'KUH': {\n    'path': 'kuh.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 帯広空港\n  'OBO': {\n    'path': 'obo.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 新千歳空港\n  'CTS': {\n    'path': 'spk.html',\n    'anchor': {\n      'arr': '#floor002',\n      'dep': '#floor001'\n    }\n  },\n  // 新千歳空港\n  // (ANA APIからは新千歳空港のコードとして「SPK」が返ってくるため。\n  //  丘珠空港はANAが就航していないため、「SPK」も新千歳空港として扱う。)\n  'SPK': {\n    'path': 'spk.html',\n    'anchor': {\n      'arr': '#floor002',\n      'dep': '#floor001'\n    }\n  },\n  // 函館空港\n  'HKD': {\n    'path': 'hkd.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 青森空港\n  'AOJ': {\n    'path': 'aoj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 大館能代空港\n  'ONJ': {\n    'path': 'onj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 秋田空港\n  'AXT': {\n    'path': 'axt.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 庄内空港\n  'SYO': {\n    'path': 'syo.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 仙台空港\n  'SDJ': {\n    'path': 'sdj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 新潟空港\n  'KIJ': {\n    'path': 'kij.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 福島空港\n  'FKS': {\n    'path': 'fks.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 八丈島空港\n  'HAC': {\n    'path': 'hac.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 静岡空港\n  'FSZ': {\n    'path': 'fsz.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 中部国際空港\n  'NGO': {\n    'path': 'ngo02.html',\n    'anchor': {\n      'arr': '#floor002',\n      'dep': '#floor001'\n    }\n  },\n  // 伊丹空港\n  'ITM' : {\n    'path': 'itm.html',\n    'anchor': {\n      'arr': '#floor001',\n      'dep': '#floor002'\n    }\n  },\n  // 関西空港(大阪)\n  'KIX': {\n    'path': 'kix.html',\n    'anchor': {\n      'arr': '#floor002',\n      'dep': '#floor002'\n    }\n  },\n  // 神戸空港\n  'UKB': {\n    'path': 'ukb.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 徳島空港\n  'TKS': {\n    'path': 'tks.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 高松空港\n  'TAK': {\n    'path': 'tak.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 岡山空港\n  'OKJ': {\n    'path': 'okj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 高知空港\n  'KCZ': {\n    'path': 'kcz.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 松山空港\n  'MYJ': {\n    'path': 'myj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 広島空港\n  'HIJ': {\n    'path': 'hij.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 岩国空港\n  'IWK': {\n    'path': 'iwk.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 富山空港\n  'TOY': {\n    'path': 'toy.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 能登空港\n  'NTQ': {\n    'path': 'ntq.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 小松空港\n  'KMQ': {\n    'path': 'kmq.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 鳥取空港\n  'TTJ': {\n    'path': 'ttj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 米子空港\n  'YGJ': {\n    'path': 'ygj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 萩・石見空港\n  'IWJ': {\n    'path': 'iwj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 山口宇部空港\n  'UBJ': {\n    'path': 'ubj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 北九州空港\n  'KKJ': {\n    'path': 'kkj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 対馬空港\n  'TSJ': {\n    'path': 'tsj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 壱岐空港\n  'IKI': {\n    'path': 'iki.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 福岡空港\n  'FUK': {\n    'path': 'fuk.html',\n    'anchor': {\n      'arr': '#floor004',\n      'dep': '#floor004'\n    }\n  },\n  // 長崎空港\n  'NGS': {\n    'path': 'ngs.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 五島福江空港\n  'FUJ': {\n    'path': 'fuj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 佐賀空港\n  'HSG': {\n    'path': 'hsg.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 熊本空港\n  'KMJ': {\n    'path': 'kmj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 鹿児島空港\n  'KOJ': {\n    'path': 'koj.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 宮崎空港\n  'KMI': {\n    'path': 'kmi.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 大分空港\n  'OIT': {\n    'path': 'oit.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 那覇空港\n  'OKA': {\n    'path': 'oka.html',\n    'anchor': {\n      'arr': '#floor003',\n      'dep': '#floor001'\n    }\n  },\n  // 宮古空港\n  'MMY': {\n    'path': 'mmy.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n  // 石垣空港\n  'ISG': {\n    'path': 'isg.html',\n    'anchor': {\n      'arr': '',\n      'dep': ''\n    }\n  },\n}\n","/**\n * ANA APIに関する独自の処理をまとめたクラス。\n */\nexport default class AnaUtil {\n  static readonly HND_TERMINAL_1_KEY = 'terminal_1';\n  static readonly HND_TERMINAL_2_KEY = 'terminal_2';\n  static readonly FUK_TERMINAL_NORTH_KEY = 'north';\n  static readonly FUK_TERMINAL_SOUTH_KEY = 'south';\n  /**\n   * 空港コードを設定する。(一般的に利用しない空港コードである場合、適宜変換する。)\n   * @param code 3レターの空港コード。\n   */\n  static setAirportCode(code: string) {\n    switch(code) {\n      // 「TYO」の場合は「HND」(羽田)として扱う。\n      case 'TYO':\n        return 'HND';\n      // 「SPK」の場合は「CTS」(新千歳)として扱う。\n      case 'SPK':\n        return 'CTS';\n      default:\n        return code;\n    }\n  }\n\n  /**\n   * 羽田空港の第1ターミナルであるかを判別する。\n   * @param terminal 搭乗便のターミナル名称。\n   */\n  static isTeminal1InHaneda(terminal: string) {\n    // ターミナル名に「第1ターミナル」・「Terminal 1」を含んでいる場合、または、ターミナルが「1」である場合はtrueを返す。\n    return terminal.includes('第1ターミナル') || terminal.includes('Terminal 1') || terminal === '1';\n  }\n}\n\n/**\n * 国内線の羽田空港のターミナル名のi18nのキーを取得する。\n * @param terminal ANAの運航情報APIから取得、またはパラメーター連携された羽田空港のターミナル名。\n */\nexport function getTerminalKeyDomInHND(terminal: string) {\n  // 到着ターミナル名に「1」を含んでいれば第1ターミナル、それ以外は第2ターミナルとする。\n  return terminal.includes('1') ? AnaUtil.HND_TERMINAL_1_KEY : AnaUtil.HND_TERMINAL_2_KEY;\n}\n\n/**\n * 空港コードが羽田空港のものであるかを判別する。\n * @param airportCode 3レターの空港コード。\n * TODO: airportNameの引数をマストにする\n */\nexport function isHND(airportCode: string, airportName: string = \"Haneda\") {\n  return airportCode === 'HND' || (airportCode === 'TYO' && airportName.includes('Haneda'));\n}\n\n/**\n * 国内線の福岡空港のターミナル名のi18nのキーを取得する。\n * @param terminal ターミナル名。\n */\nexport function getTerminalKeyDomInFUK(terminal: string) {\n  let key = '';\n  // 福岡空港の北側に到着する場合は北側のキーを設定する。\n  if (isNorthTerminalInFUK(terminal)) { key = AnaUtil.FUK_TERMINAL_NORTH_KEY; }\n  // 福岡空港の南側に到着する場合は南側のキーを設定する。\n  if (isSouthTerminalInFUK(terminal)) { key = AnaUtil.FUK_TERMINAL_SOUTH_KEY; }\n  return key;\n}\n\n/**\n * 福岡空港の北ターミナルであるかを判別する。\n * @param terminal ターミナル名。\n */\nexport function isNorthTerminalInFUK(terminal: string) {\n  return terminal.includes('北') || terminal.includes('North');\n}\n\n/**\n * 福岡空港の南ターミナルであるかを判別する。\n * @param terminal ターミナル名。\n */\nexport function isSouthTerminalInFUK(terminal: string) {\n  return terminal.includes('南') || terminal.includes('South');\n}\n","import { AirportMapPath } from \"../../../../services/ana/data/airportMapPath\";\nimport FlightInfo from \"../../../../services/ana/models/flightInfo\";\nimport { Lang } from \"../../../../states/query\";\nimport AnaUtil, { isHND } from \"../../../../utils/ana\";\n\n/** 空港マップを扱うクラス。 */\nexport default class AirportMap {\n  /** 日本語版の国内線の空港マップのベースURL。 */\n  static readonly DOMESTIC_JA_BASE_URL = 'https://www.ana.co.jp/ja/jp/domestic/departure/airport/map/';\n  /** 英語版の国内線の空港マップのベースURL。 */\n  static readonly DOMESTIC_EN_BASE_URL = 'https://www.ana.co.jp/en/jp/domestic/departure/airport/map/';\n  /** 日本語版の国際線の空港マップのベースURL。 */\n  static readonly INTERNATIONAL_JA_BASE_URL = 'https://www.ana.co.jp/ja/jp/international/departure/airport/map/';\n  /** 英語版の国際線の空港マップのベースURL。 */\n  static readonly INTERNATIONAL_EN_BASE_URL = 'https://www.ana.co.jp/en/jp/international/departure/airport/map/';\n  /** 空港内マップURLの辞書データで到着ロビーのアンカーリンクを参照するためのキー。 */\n  static readonly ARRIVAL_KEY = 'arr';\n  /** 空港内マップURLの辞書データで羽田空港第1ターミナルのパスを参照するためのキー。 */\n  static readonly HND_1_KEY = 'HND_1';\n  /** 空港内マップURLの辞書データで羽田空港第2ターミナルのパスを参照するためのキー。 */\n  static readonly HND_2_KEY = 'HND_2';\n  /** 空港コード。 */\n  airportCode: string;\n  /** 空港名。 */\n  airportName: string;\n  /** ターミナル名。 */\n  terminal: string;\n\n  /**\n   * コンストラクタ。\n   * @param airportCode 空港コード。\n   * @param airportName 空港名。\n   * @param terminal ターミナル名。\n   */\n  constructor(airportCode: string, airportName: string, terminal: string) {\n    this.airportCode = airportCode;\n    this.airportName = airportName;\n    this.terminal = terminal;\n  }\n\n  /**\n   * 国内線の到着空港のマップのURLを取得する。\n   * @param lang 言語設定。(日本語版または英語版)\n   */\n  public getDomesticArrivalUrl(lang: string, isDepAirport: boolean) {\n    const anchorPath = isDepAirport? 'dep': 'arr';\n    let airportCode = this.airportCode;\n    // 国内線の羽田空港の場合、案内ページがターミナルごとに分かれるため、ターミナル名に応じてキーを設定する。\n    if (isHND(this.airportCode, this.terminal)) {\n      airportCode = this.getKeyByTerminalInHaneda();\n    }\n    if(AirportMapPath[airportCode]) {\n      // 成田空港第3ターミナルの場合には何も表示しない\n      if(this.airportCode === 'NRT' && FlightInfo.terminalCheck(3, this.terminal)) {\n        return '';\n      }\n      // 空港コードに応じてパスを設定する。\n      const path = AirportMapPath[airportCode]['path'];\n      // 到着ロビー用のアンカーリンクを設定する。\n      const anchor = AirportMapPath[airportCode]['anchor'][anchorPath];\n      // 言語設定が英語であれば英語の、それ以外の場合は日本語のベースURLを設定する。\n      const baseUrl = (lang === Lang.en) ? AirportMap.DOMESTIC_EN_BASE_URL : AirportMap.DOMESTIC_JA_BASE_URL;\n      return baseUrl + path + anchor;\n    }\n    return '';\n  }\n\n  /** 羽田空港のターミナル別のキー(空港内マップURLの辞書データのキー)を取得する。 */\n  getKeyByTerminalInHaneda() {\n    // 第1ターミナルである場合は第1ターミナルのキーを、それ以外の場合は第2ターミナルのキーを返す。\n    return AnaUtil.isTeminal1InHaneda(this.terminal) ? AirportMap.HND_1_KEY : AirportMap.HND_2_KEY;\n  }\n}\n","import { Flight, FSList } from \"../models\";\nimport { addDays, format, isSameDay } from \"date-fns\";\nimport { ArrivalGateToStation } from './../data/arrivalGateToStation';\nimport { ArrivalGateToStationInt } from './../data/arrivalGateToStationInt';\nimport { AirportMapPath } from './../data/airportMapPath';\nimport { AirportMapPathInt } from './../data/airportMapPathInt';\n\nimport { BusGates } from '../data/busGates';\nimport { SatelliteGates } from '../data/satelliteGates';\nimport { Query, Lang } from \"../../../states/query\";\n\nimport DateTime from '../../../utils/dateTime';\nimport Airlines, { AirlineList } from \"../../../utils/Airlines\";\nimport { TimeTableLine } from \"../../ekispert/models/planeTimetable\";\nimport AirportMap from \"../../../components/result/DepartureGuide/ToArrivalGuide/AirportMap\";\nimport { zonedTimeToUtc } from \"date-fns-tz\";\n\n/**\n * 到着案内時に搭乗便到着ゲートから最寄りの公共交通機関までの所要時間を設定する空港のコード。(2020/01/23現在)\n */\nconst SPECFIED_AIRPORTS_INT = ['HND', 'NRT', 'KIX', 'TYO'];\n\n/** 対象の便のステータスを表す定数。 */\nenum Status {\n  /** 通常運航 */\n  Normal = 0,\n  /** 遅延 */\n  Delay = 1,\n  /** 欠航 */\n  Canceled = 2,\n  /** 取得できなかった場合など不明の場合。 */\n  Unknown = 3,\n}\n\n/** ANA API英語版から返却される月名称(MMM形式)に対応する月の数字を定義した連想配列。 */\nconst monthNames: { [key: string]: number } = {\n  'JAN': 1,\n  'FEB': 2,\n  'MAR': 3,\n  'APR': 4,\n  'MAY': 5,\n  'JUN': 6,\n  'JUL': 7,\n  'AUG': 8,\n  'SEP': 9,\n  'OCT': 10,\n  'NOV': 11,\n  'DEC': 12,\n}\n\nclass FlightInfo {\n  flightNumber: string;\n  hasData: boolean;\n  isDomestic: boolean;\n  etd: Date;\n  eta: Date;\n  atd: Date;\n  ata: Date;\n  userDate: Date;\n  depAirportCode: string;\n  arrAirportCode: string;\n  depAirportName: string;\n  arrAirportName: string;\n  bordingGate: string;\n  securtyCheckPoint: string;\n  depTerminal: string;\n  arrTerminal: string;\n  exit: string;\n  errorMessage: string | null;\n  lang: string;\n  /** 搭乗口からバス利用のフラグ。 */\n  useBusToBoard: boolean;\n  /** 搭乗口からサテライトへ移動するためのバス利用のフラグ。 */\n  useSatelliteBus: boolean;\n  remarks: string;\n  status: Status;\n  /** 運行情報APIから返された到着ターミナル情報 */\n  apiArrTerminal: string;\n  /** 到着案内の場合にフォーム上で指定された日付と取得した到着日が異なるかを表すフラグ。 */\n  isDifferentArrivalDate: boolean;\n  /** 空港内マップ情報 */\n  airportMap: {\n    dep: AirportMap,\n    arr: AirportMap\n  }\n  /** 航空会社情報 */\n  targetAirLine: AirlineList\n\n  constructor(flight?: Flight, date?: Date, lang: string = Lang.ja, targetAirLine: AirlineList = 'ANA') {\n    this.hasData = (flight && flight.data !== null) ? true : false;\n    const dummy: any = {};\n    const fsList: FSList = flight && flight.data? flight.data.fsList[0] : dummy;\n    this.isDomestic = flight ? flight.request.site === 'DOM' : false;\n    const defaultTime = new Date(0);\n    const flightNumber = flight? flight.request.flightNumber: '';\n\n    // ユーザが入力した時刻\n    this.userDate = date || defaultTime;\n    this.etd = (fsList.skdDepTime && fsList.skdDepMonth && fsList.skdDepDay && date) ? this.setTime(fsList.skdDepTime, fsList.skdDepMonth, fsList.skdDepDay, date) : defaultTime;\n    this.eta = (fsList.skdArrTime && fsList.skdArrMonth && fsList.skdArrDay && date) ? this.setTime(fsList.skdArrTime, fsList.skdArrMonth, fsList.skdArrDay, date) : defaultTime;\n    this.atd = (fsList.actDepTime && fsList.actDepMonth && fsList.actDepDay && date) ? this.setTime(fsList.actDepTime, fsList.actDepMonth, fsList.actDepDay, date) : defaultTime;\n    this.ata = (fsList.actArrTime && fsList.actArrMonth && fsList.actDepDay && date) ? this.setTime(fsList.actArrTime, fsList.actArrMonth, fsList.actArrDay, date) : defaultTime;\n    this.flightNumber = flightNumber;\n    this.depAirportCode = fsList ? fsList.depAirportCode : '';\n    this.arrAirportCode = fsList ? fsList.arrAirportCode : '';\n    this.depAirportName = fsList ? fsList.depAirport : '';\n    this.arrAirportName = fsList ? fsList.arrAirport : '';\n    this.bordingGate = fsList ? this.getBordingGate(fsList.bordingGate) : '';\n    this.securtyCheckPoint = (fsList && flight) ? this.getSecurtyCheckPoint(fsList.bordingGate, fsList.depAirportCode, fsList.depAirport, flight.request.site, fsList.depTerminal, lang) : '';\n    this.depTerminal = fsList? this.getDepTerminal(fsList.bordingGate, fsList.depAirportCode, fsList.depTerminal) : '';\n    this.arrTerminal = fsList? this.getArrTerminal(fsList.arrTerminal) : '';\n    this.apiArrTerminal = this.arrTerminal;\n    this.exit = fsList ? this.getExit(fsList.arrTerminal) : '';\n    this.errorMessage = (flight && flight.result.status === 'ERROR') ? flight.result.message : '';\n    this.lang = lang;\n    this.useBusToBoard = fsList ? this.checkBusToBoard(this.getBordingGate(fsList.bordingGate)) : false;\n    this.useSatelliteBus = fsList ? this.checkSatelliteGates(fsList.depAirportCode, this.getBordingGate(fsList.bordingGate)) : false;\n    this.remarks = fsList ? this.modifyRemarks(fsList.remarks) : '';\n    this.status = (fsList && flight) ? this.getStatus(fsList.remarks, fsList.actDepTime, flight.request.site) : Status.Unknown;\n    this.isDifferentArrivalDate = false;\n    this.airportMap = this.getAirportMap();\n    this.targetAirLine = targetAirLine;\n  }\n\n  /** 空港内マップを更新する */\n  getAirportMap() {\n    return {\n      dep: new AirportMap(this.depAirportCode, this.depAirportName, this.depTerminal),\n      arr: new AirportMap(this.arrAirportCode, this.arrAirportName, this.arrTerminal)\n    }\n  }\n\n  public updateByQuery(query: Query){\n    /** 運行情報APIより情報が取れない場合のみクエリから内際判定を行う */\n    if(!this.hasData) {\n      this.isDomestic = query.isDomestic;\n    }\n    this.depAirportCode =  this.depAirportCode || query.fromAirportCode;\n    this.arrAirportCode = this.arrAirportCode || query.toAirportCode ;\n    this.depAirportName = this.depAirportName || query.depAirport;\n    this.arrAirportName = this.arrAirportName || query.arrAirport;\n    this.arrTerminal = this.arrTerminal || query.toTerminal;\n    this.depTerminal = this.depTerminal || query.fromTerminal;\n    if(this.etd.getTime() === 0) {\n      this.etd = query.std || this.etd;\n    }\n    if(this.eta.getTime() === 0) {\n      this.eta = query.sta || this.eta;\n    }\n    // クエリより必須要素が取れているならhasDataをtrueにする\n    this.hasData = true;\n    this.airportMap = this.getAirportMap();\n  }\n\n  // 運行情報を取得できない航空会社の場合、日付を変えた場合でも発着空港だけは変更する\n  public updatePartialQuery(query: Query, flightNumber: string) {\n    this.flightNumber = flightNumber;\n    this.depAirportCode =  this.depAirportCode || query.fromAirportCode;\n    this.arrAirportCode = this.arrAirportCode || query.toAirportCode ;\n    this.depAirportName = this.depAirportName || query.depAirport;\n    this.arrAirportName = this.arrAirportName || query.arrAirport;\n    // TODO: 日付変えた場合でもターミナル情報はそのままでいいのか?\n    this.arrTerminal = this.arrTerminal || query.toTerminal;\n    this.depTerminal = this.depTerminal || query.fromTerminal;\n    this.isDomestic = query.isDomestic === undefined? true: query.isDomestic;\n    // クエリより必須要素が取れているならhasDataをtrueにする\n    this.hasData = true;\n    this.airportMap = this.getAirportMap();\n  }\n\n  /**\n   * スターフライヤー便でHND発着の場合はターミナル名に追加処理を加える\n   */\n  public updateHNDTerminalBySFJ() {\n    const airportList = [this.depAirportCode, this.arrAirportCode];\n    const HNDAirportCodeList = ['HND', 'TYO'];\n    // 出発地・到着地いずれかがHNDではない場合は処理を行わない\n    if( airportList.includes(HNDAirportCodeList[0]) || airportList.includes(HNDAirportCodeList[1]) ) {\n      if(HNDAirportCodeList.includes(this.depAirportCode)) {\n        this.depTerminal = this.depTerminal || this.setConsiderationSFJTerminalHND(this.arrAirportCode, this.etd);\n      } else {\n        this.arrTerminal = this.arrTerminal || this.setConsiderationSFJTerminalHND(this.depAirportCode, this.eta);\n      }\n    }\n  }\n\n  /** 国内線であるかを表すフラグを更新する。 */\n  setIsDomestic(value: boolean) {\n    this.isDomestic = value;\n  }\n\n  /** 空路時刻表情報より発着時刻を更新する */\n  updateTimeTableLine(depDate: Date, line: TimeTableLine) {\n    const yyyymmmddStr = DateTime.JSTFormat(depDate, \"yyyy-MM-dd\");\n    const etdHHMMSSStr = line.DepartureState.Datetime.text;\n    const etaHHMMSSStr = line.ArrivalState.Datetime.text;\n    this.etd = new Date(`${yyyymmmddStr}T${etdHHMMSSStr}`);\n    this.eta = new Date(`${yyyymmmddStr}T${etaHHMMSSStr}`);\n    if(line.DepartureState.Datetime.operation === 'yesterday') {\n      this.etd = addDays(this.etd, 1);\n    }\n    if(line.ArrivalState.Datetime.operation === 'yesterday') {\n      this.eta = addDays(this.eta, 1);\n    }\n  }\n\n  /** フォーム上で指定された日付と定刻の到着日付が異なることを表すフラグをセットする。 */\n  setIsDifferentArrivalDate(date: Date) {\n    // 同じ日であればfalseを設定し、別の日であればtrueを設定する。\n    this.isDifferentArrivalDate = isSameDay(date, this.eta) ? false : true;\n  }\n\n  public statusCheck() {\n    if (this.etd.getTime() === 0 || this.eta.getTime() === 0){\n      throw new Error('計画出発・到着時間が設定されていません');\n    }\n    // クエリかANA APIかどちらかのデータが入っているかチェック\n    const checkList:Array<string> = ['depAirportCode', 'arrAirportCode', 'depAirportName', 'arrAirportName'];\n    const thisInfo:any = this;\n    for(const obj of checkList){\n      if(thisInfo[obj] === ''){\n        throw new Error(`必須要素: ${obj} が空です`);\n      }\n    }\n  }\n\n  getHour(time: string): string {\n    return time.split(':')[0];\n  }\n\n  getMinutes(time: string): string {\n    return time.split(':')[1];\n  }\n\n  setTime(time: string, month: string, day: string, date: Date) {\n    const hour = this.getHour(time);\n    const minutes = this.getMinutes(time);\n    // Date型の初期化で指定する月の部分はインデックス(0始まり)のため、実際の月の番号から-1をする。\n    // (英語版の場合、月部分がMMM(月の3文字のアルファベット)形式で返却されるため、対応する月の数に変換する。)\n    // ※急いで直した箇所のため、あとで見直す(2020/03/28現在。)\n    const monthIndex = Object.keys(monthNames).includes(month.toUpperCase()) ? monthNames[month.toUpperCase()] - 1 : Number.parseInt(month) - 1;\n    // 日時をセットする。\n    const utcDate = new Date(\n      date.getFullYear(),\n      monthIndex,\n      Number.parseInt(day),\n      Number.parseInt(hour),\n      Number.parseInt(minutes)\n    );\n    // 'Asia/Tokyo' (日本時間) に変換\n    return zonedTimeToUtc(utcDate, 'Asia/Tokyo');\n  }\n\n  /**\n   * 搭乗口の名称を取得する。\n   * @param value ANA APIから取得した搭乗口の文字列。\n   */\n  getBordingGate(value: string) {\n    if(!value || value === '') { return ''; }\n    // 保安検査場名が含まれる場合があるため分割する。\n    return (value.includes('(')) ? value.split('(')[0] : value;\n  }\n\n  /**\n   * 保安検査場名を取得する。\n   * @param value ANA APIから取得した搭乗口の文字列。(搭乗口名の文字列に含まれる場合がある。)\n   * @param depAirportCode ANA APIから取得した出発空港コード。\n   * @param site ANA APIから取得した国内線または国内線を表す値。\n   * @param lang 言語設定の値。\n   */\n  getSecurtyCheckPoint(value: string, depAirportCode: string, depAirportName: string, site: string, depTerminal: string, lang: string = Lang.ja) {\n    // TODO: 2020年3月以降はAPI仕様が変わるため、ターミナル名称等が取得できる見込みなので見直す。(2020/02/07現在。)\n    let securtyCheckPoint = lang === Lang.en ? 'Security Check' : '保安検査場';\n    switch (depAirportCode) {\n      // 羽田空港の場合。(ANA APIに英語版でアクセスした場合に羽田空港のコードが「TYO」となる場合がある。)\n      case 'HND':\n      case 'TYO':\n        securtyCheckPoint = this.getSecurityCheckInHaneda(value, site, depTerminal, lang);\n        break;\n      default:\n        // 未設定の場合は、デフォルトの保安検査場を返す。\n        if(!value || value === '') { return securtyCheckPoint; }\n        // 搭乗口名称に「(」(カッコ)が含まれていて、カッコ内がターミナル名ではない場合、保安検査場名として採用する。\n        const securityName = value.match(/.*?\\((.*?)\\).*?/);\n        if( securityName ) {\n          if(securityName[1].match(/^(?!.*(ターミナル|Terminal)).+$/)){\n            securtyCheckPoint = securityName[1];\n          } else {\n            // ターミナル名が含まれる場合には 保安検査場(ターミナル名)の形式とする。\n            securtyCheckPoint = `${securtyCheckPoint}(${securityName[1]})`;\n          }\n        }\n        break;\n    }\n    return securtyCheckPoint;\n  }\n\n  /**\n   * 羽田空港の保安検査場名を取得する。\n   * @param bordingGate ANA APIから取得した搭乗口名称。\n   * @param site 国内線または国内線を表す値。\n   * @param lang 言語設定の値。\n   */\n  getSecurityCheckInHaneda(bordingGate: string, site: string, depTerminal: string, lang: string = Lang.ja) {\n    let securtyCheckPoint = lang === Lang.en ? 'Security Check' : '保安検査場';\n    const securityCheckA = lang === Lang.en? 'Security Check A' : '保安検査場A';\n    // 国内線の場合。\n    if (site === 'DOM') {\n      // 第1ターミナルの場合。\n      if (bordingGate.includes('第1ターミナル') || bordingGate.includes('Terminal 1') || depTerminal.includes('1')) {\n        securtyCheckPoint = securityCheckA;\n      } else if (bordingGate.includes('(') && (!bordingGate.includes('ターミナル') || !bordingGate.includes('Terminal'))) {\n        // 第2ターミナルで搭乗口名に保安検査場名が含まれている場合。\n        securtyCheckPoint = bordingGate.split('(')[1].replace(')', '');\n      }\n    }\n    return securtyCheckPoint;\n  }\n\n  /**\n   * HNDスターフライヤー運行便を考慮したターミナル名\n   * @param anotherAirportCode 羽田空港と対となる空港コード\n   * @param HNDDepOrArrDate 羽田空港を到着・出発する日時\n   */\n  setConsiderationSFJTerminalHND(anotherAirportCode: string, HNDDepOrArrDate: Date) {\n    // flightNumberが 3810 - 3899 の間でない場合は考慮しない\n    if(FlightInfo.isSFJ(this.flightNumber)) {\n      return '';\n    } else {\n      // スターフライヤーの場合第一ターミナル発着となる\n      return '1'\n    }\n  }\n\n  /**\n   * HNDスターフライヤー運行便であるか\n   * @param flightNumber\n   * @returns\n   */\n  public static isSFJ(flightNumber: string) {\n    return Number(flightNumber) < 3810 || Number(flightNumber) > 3899;\n  }\n\n  /**\n   * 羽田空港国際線到着で特定の便かつ、到着24時間前を切っていないか\n   **/\n  isSpecialHNDIntTerminalBefore24Hours(isDepartureGuide: boolean): boolean {\n    // 到着案内のみの対応とする\n    if(isDepartureGuide) {\n      return false;\n    }\n    // 到着24時間前からは対象とならない\n    const flightDate = this.getFlightTimeDate(isDepartureGuide);\n    if(DateTime.isHND2ndTerminalArr24Limit(flightDate)) {\n      return false;\n    }\n    // その他羽田空港国際線ターミナル便に該当するか?\n    return this.getSpecialHNDIntTerminalNumber(isDepartureGuide) === 3;\n  }\n\n  /**\n   * 羽田空港発着ターミナル番号を取得する\n   * @param isDepartureGuide 羽田出発便か?\n   * @returns 強制固定されるターミナル番号\n   */\n  getSpecialHNDIntTerminalNumber(isDepartureGuide: boolean): number | null {\n    // ANA便以外は対象外となる\n    if(this.targetAirLine !== 'ANA') {\n      return null;\n    }\n    // 国内線は対象外とする\n    if(this.isDomestic) {\n      return null;\n    }\n    // 対象となるフライト一覧\n    const targetFlightNumberList = {\n      dep: ['859', '851', '211', '969', '853'],\n      arr: ['159', '968']\n    }\n    if(isDepartureGuide) {\n      /** 出発案内で指定便に該当するときには強制で第2ターミナルとする */\n      return targetFlightNumberList.dep.includes(this.flightNumber)? 2: null;\n    }\n    else {\n      /** 到着案内で指定便に該当するときには強制で第3ターミナルとする */\n      return targetFlightNumberList.arr.includes(this.flightNumber)? 3: null;\n    }\n  }\n\n  /**\n   * 出発ターミナルの名称を取得する。\n   * @param value ANA APIから取得した搭乗口の文字列。\n   * @param depAirportCode ANA APIから取得した出発空港コード。\n   * @param depAirTerminal ANA APIから取得した出発ターミナル名\n   */\n  getDepTerminal(value: string, depAirportCode: string, depAirTerminal: string) {\n    // ANA APIから出発ターミナル名が取得出来たならそれを利用する。(2020/03/06)\n    if(depAirTerminal !== ''){\n      return depAirTerminal;\n    }\n    let depTerminal = '';\n    if(!value || value === '') { return depTerminal; }\n    if (depAirportCode === 'HND' && value.includes('(') && (value.includes('ターミナル') || value.includes('Terminal'))) {\n      depTerminal = value.split('(')[1].replace(')', '')\n    }\n    if (depAirportCode === 'TYO' && value.includes('(') && value.includes('Terminal')) {\n      depTerminal = value.split('(')[1].replace(')', '')\n    }\n    // 羽田空港で第1ターミナルを利用する便のみ、搭乗口名称内にターミナル名が設定される、その場合のみこのメンバ変数を利用する。(2020/02/03現在)\n    return depTerminal;\n  }\n\n  /**\n   * 到着ターミナルの名称を取得する。\n   * @param value ANA APIから取得した到着ターミナルの文字列。\n   */\n  getArrTerminal(value: string) {\n    if(!value || value === '') { return ''; }\n    // 出口名が含まれる場合があるため分割する。\n    return (value.includes('(')) ? value.split('(')[1].replace(')', '') : value;\n  }\n\n  /**\n   * 到着出口の名称を取得する。\n   * @param value ANA APIから取得した到着ターミナルの文字列。\n   * (到着ターミナルの文字列に出口名称が含まれる。)\n   */\n  getExit(value: string) {\n    if (!value || value === '') { return ''; }\n    // 出口名が設定されている場合は「(」が含まれているため、その場合のみ「(」より手前の部分を取得する。\n    // 「(」が含まれていない場合は未設定(空文字)として扱う。\n    const exitName = (value.includes('(')) ? value.split('(')[0] : '';\n    // 出口名が「◆」であった場合は空文字(未設定)とし、それ以外の場合は上記で取得できた出口名を返す。\n    return (exitName === '◆') ? '' : exitName;\n  }\n\n  /**\n   * 国内線の場合は保安検査場の締切時刻、国際線の場合は手続き締切時刻を取得する。\n   */\n  public getDeadLineTime(targetAirLine: AirlineList) {\n    // 出発案内の場合のみ利用する処理のため、引数をtrue(出発案内モード)とする。\n    const depTime = this.isAvalableOperationInfo(true) ? this.atd : this.etd;\n    const date = new Date(depTime.getTime());\n    // ピーチコードシェア便かつ関西国際空港発以外の場合には保安検査場締切25分にする\n    if (targetAirLine === 'APJ' && this.depAirportCode !== 'KIX') {\n      date.setMinutes(date.getMinutes() - 25);\n    }\n    // JAL・IBX便では20分前に設定する\n    else if (this.isDomestic) {\n      // 国内線の場合保安検査場締切20分前になる\n      date.setMinutes(date.getMinutes() - 20);\n    }\n    else {\n      // 国際線の場合保安検査場締切は60分前になる\n      date.setHours(date.getHours() - 1);\n    }\n    return date;\n  }\n\n  /**\n   * 搭乗口到着(希望)時間を取得する。\n   */\n  public getBoardingTime(targetAirLine: AirlineList) {\n    // 出発案内の場合のみ利用する処理のため、引数をtrue(出発案内モード)とする。\n    const depTime = this.isAvalableOperationInfo(true) ? this.atd : this.etd;\n    // 搭乗締め切り時間は出発時間の何分前かを定める\n    const minutes = (()=>{\n      // 国際線の場合には30分前となる\n      if(!this.isDomestic) {\n        return 30;\n      }\n      // 20分前指定された事業者かを判定する\n      else if(Airlines.isBordingGate20min(targetAirLine)) {\n        return 20;\n      }\n      // 国内線の場合には10分前となる\n      else {\n        return 10;\n      }\n    })();\n    const date = new Date(depTime.getTime());\n    date.setMinutes(date.getMinutes() - minutes);\n    return date;\n  }\n\n  /**\n   * 搭乗便の出発時刻、または到着時刻を取得する。\n   * @param isDepartureGuide 出発案内であるかを表すフラグ。\n   */\n  public getFlightTime(isDepartureGuide: boolean) {\n    const flightDate = this.getFlightTimeDate(isDepartureGuide);\n    return DateTime.JSTFormat(flightDate, 'HH:mm');\n  }\n\n  /**\n   * 搭乗便の出発時刻、または到着時刻をDate型で取得する。\n   * @param isDepartureGuide 出発案内であるかを表すフラグ。\n   */\n  public getFlightTimeDate(isDepartureGuide: boolean) {\n    if (isDepartureGuide) {\n      return (this.isAvalableOperationInfo(isDepartureGuide) && !DateTime.isInvalidDate(this.atd)) ? this.atd : this.etd;\n    } else {\n      return (this.isAvalableOperationInfo(isDepartureGuide) && !DateTime.isInvalidDate(this.ata)) ? this.ata : this.eta;\n    }\n  }\n\n  /** 搭乗便の出発時刻をDate型で取得する。 */\n  public getFlightDepartureDate() {\n    return (this.isAvalableOperationInfo(true) && !DateTime.isInvalidDate(this.atd)) ? this.atd : this.etd;\n  }\n\n  /** 搭乗便の到着時刻をDate型で取得する。 */\n  public getFlightArrivalDate() {\n    return (this.isAvalableOperationInfo(false) && !DateTime.isInvalidDate(this.ata)) ? this.ata : this.eta;\n  }\n\n  /**\n   * 備考にHTMLタグが含まれている場合があるため、取り除いた文字列を返す。\n   * 参考ページ: https://qiita.com/miiitaka/items/793555b4ccb0259a4cb8\n   * */\n  public modifyRemarks(remarks: string) {\n    if (!remarks) { return ''; }\n    return remarks.replace(/<(\"[^\"]*\"|'[^']*'|[^'\">])*>/g, '');\n  }\n\n  /**\n   * ANA APIで取得した運行情報を参照可能な日付であるかを判別する。\n   * @param isDepartureGuide 出発案内であるかを表すフラグ。\n   */\n  public isAvalableOperationInfo(isDepartureGuide: boolean): boolean {\n    // 最新出発時間・最新到着時間どちらかがdefault値の場合には最新時刻は使用できないとみなす\n    const isDefaultAtd = this.atd.getTime() === 0;\n    const isDefaultAta = this.ata.getTime() === 0;\n    if(isDefaultAtd || isDefaultAta) {\n      return false;\n    }\n    // 出発案内の場合は定刻の出発日時を、到着案内の場合は定刻の到着日時がANA APIの運行情報を参照可能な日付かを判別する。\n    return isDepartureGuide ? DateTime.isAvalableOperationInfo(this.etd, this.isDomestic) : DateTime.isAvalableOperationInfo(this.eta, this.isDomestic);\n  }\n\n  /**\n   * 探索日時を航空便の発着時刻を基準に取得する。\n   * @param isDepartureGuide 出発案内であるかを表すフラグ。\n   * @param minutes ユーザーが指定した「空港到着時間」(出発案内の場合のみ)\n   */\n  public getSearchTime(isDepartureGuide: boolean, minutes?: number) {\n    // TODO: ネストが深いためあとで見直す(2020/01/06現在)\n    // ANA APIの実際の発着時刻を利用できる場合。\n    if (this.isAvalableOperationInfo(isDepartureGuide)) {\n      // 出発案内の場合。\n      if (isDepartureGuide) {\n        if (minutes) {\n          const date = new Date(this.atd.getTime());\n          date.setMinutes(date.getMinutes() - minutes);\n          return date;\n        } else {\n          return this.atd;\n        }\n      // 到着案内の場合。\n      } else {\n        let minutes = 0;\n        // 国内線の場合。\n        if (this.isDomestic) {\n          minutes = this.getArrivalGateToStation();\n        // 国際線の場合。\n        } else {\n          // 指定された空港だった場合は別ファイルで設定された空港ごとの値を参照し、指定外の空港の場合は0とする。\n          minutes = SPECFIED_AIRPORTS_INT.includes(this.arrAirportCode) ? this.getArrivalGateToStationInt() : 0;\n        }\n        const date = new Date(this.ata.getTime());\n        date.setMinutes(date.getMinutes() + minutes);\n        return date;\n      }\n    // ANA APIの予定の発着時刻を利用する場合。\n    } else {\n      // 出発案内の場合。\n      if (isDepartureGuide) {\n        if (minutes) {\n          const date = new Date(this.etd.getTime());\n          date.setMinutes(date.getMinutes() - minutes);\n          return date;\n        } else {\n          return this.etd;\n        }\n      // 到着案内の場合。\n      } else {\n        let minutes = 0;\n        // 国内線の場合。\n        if (this.isDomestic) {\n          minutes = this.getArrivalGateToStation();\n        // 国際線の場合。\n        } else {\n          // 指定された空港だった場合は別ファイルで設定された空港ごとの値を参照し、指定外の空港の場合は0とする。\n          minutes = SPECFIED_AIRPORTS_INT.includes(this.arrAirportCode) ? this.getArrivalGateToStationInt() : 0;\n        }\n        const date = new Date(this.eta.getTime());\n        if(!minutes) {\n          throw new Error('minutesの値が異常です: '+minutes);\n        }\n        date.setMinutes(date.getMinutes() + minutes);\n        return date;\n      }\n    }\n  }\n\n  /**\n   * 国内線の場合の空港から最寄りの公共交通機関の所要時間を設定する。\n   */\n  getArrivalGateToStation() {\n    // 空港コードがTYO(東京のエリアコード)の場合。\n    if (this.arrAirportCode === 'TYO') {\n      // 到着空港名が「Haneda」を含む場合は羽田の所要時間、含まない場合は成田の所要時間を返す。\n      return this.arrAirportName.includes('Haneda') ? ArrivalGateToStation['HND'] : ArrivalGateToStation['NRT'];\n    } else {\n      return ArrivalGateToStation[this.arrAirportCode];\n    }\n  }\n\n  /**\n   * 国際線の場合の空港から最寄りの公共交通機関の所要時間を設定する。\n   */\n  getArrivalGateToStationInt() {\n    // 空港コードがTYO(東京のエリアコード)の場合。\n    if (this.arrAirportCode === 'TYO') {\n      // 到着空港名が「Haneda」を含む場合は羽田の所要時間、含まない場合は成田の所要時間を返す。\n      return this.arrAirportName.includes('Haneda') ? ArrivalGateToStationInt['HND'] : ArrivalGateToStationInt['NRT'];\n    } else {\n      return ArrivalGateToStationInt[this.arrAirportCode];\n    }\n  }\n\n  /**\n   * 取得した搭乗口がバス利用の搭乗口であるかを判別する。\n   * @param bordingGate 搭乗口\n   */\n  checkBusToBoard(bordingGate: string) {\n    // 空港コードがエリアコードの場合は差し替える。\n    const code = this.modifyAirportCode(true);\n    // 搭乗口が未設定、または出発空港にサテライトゲートが存在しない場合は、falseを返す。\n    if (!bordingGate || !Object.keys(BusGates).includes(code)) { return false; }\n    // 空港コードが「TYO」の場合は「HND」を、それ以外の場合は空港コードでバス利用の搭乗口を参照し対象であるかを判別する。\n    return BusGates[code].includes(bordingGate);\n  }\n\n  /**\n   * 取得した搭乗口がサテライトバス利用の搭乗口であるかを判別する。\n   * @param depAirportCode 出発空港コード\n   * @param bordingGate 搭乗口\n   */\n  checkSatelliteGates(depAirportCode: string, bordingGate: string) {\n    // 空港コードが「TYO」の場合は「HND」に差し替え、それ以外の場合はそのままの空港コードでデータを参照する。\n    const code = depAirportCode === 'TYO' ? 'HND': depAirportCode;\n    // 搭乗口が未設定、または出発空港にサテライトゲートが存在しない場合は、falseを返す。\n    if (!bordingGate || !Object.keys(SatelliteGates).includes(code)) { return false; }\n    // 空港コードでサテライトゲート対象の搭乗口を参照し対象であるかを判別する。\n    return SatelliteGates[code].includes(bordingGate);\n  }\n\n  /** 搭乗便のステータスを取得する。 */\n  getStatus(remarks: string, atd: string, site: string) {\n    let statusCode = Status.Normal;\n    statusCode = site === 'DOM' ? this.getStatusDomestic(remarks) : this.getStatusInternational(remarks, atd);\n    return statusCode;\n  }\n\n  /**\n   * 国内線の場合のステータスを取得する。\n   * @param remarks 備考。\n   */\n  getStatusDomestic(remarks: string) {\n    // 備考が未設定の場合は通常運航として扱う。\n    if (remarks === null || !remarks) { return Status.Normal; }\n    // 遅延の場合。\n    if (remarks.includes('出発遅れ') || remarks.includes('Delayed')) { return Status.Delay; }\n    // 欠航の場合。\n    if (remarks.includes('欠航') || remarks.includes('Canceled')) { return Status.Canceled; }\n    return Status.Normal;\n  }\n\n  /**\n   * 国際線の場合の搭乗便ステータスを取得する。\n   * @param remarks 備考。\n   * @param atd 実際の出発時刻。\n   */\n  getStatusInternational(remarks: string, atd: string) {\n    // 備考に何らかの文章が設定されている場合のみ、遅延または欠航として扱う。\n    if (remarks !== '' && remarks !== null && remarks !== '-' && remarks !== '出発遅れ' && remarks !== '欠航') {\n      // 時刻(HH:mm)の値であれば遅延、そうでない場合は欠航として扱う。\n      return atd.match(/[0-2][0-3]:[0-5][0-9]/g) ? Status.Delay : Status.Canceled;\n    }\n    return Status.Normal;\n  }\n\n  /** 搭乗便が遅延しているかを判別する。 */\n  isDelay() {\n    return this.status === Status.Delay;\n  }\n\n  /** 搭乗便が欠航であるかを判別する。 */\n  isCanceled() {\n    return this.status === Status.Canceled;\n  }\n\n  /**\n   * 搭乗便の運航情報のステータスを通常にする。\n   * (検索画面上での便情報取得時に利用する。検索画面上では当日日付で情報取得するため。)\n   * */\n  setStatusToNormal() {\n    this.status = Status.Normal;\n    return this;\n  }\n\n  /** 空港コードがエリアコードの場合は差し替える。(羽田と新千歳のみ。2020/01/18現在) */\n  modifyAirportCode(isDepartureGuide: boolean) {\n    const baseAirportCode = isDepartureGuide? this.depAirportCode: this.arrAirportCode;\n    const airportName = isDepartureGuide? this.depAirportName: this.arrAirportName;\n    switch(baseAirportCode) {\n      case 'TYO':\n        return airportName.includes('Haneda')? 'HND': 'NRT';\n      case 'SPK':\n        return 'CTS';\n      default:\n        return baseAirportCode;\n    }\n  }\n\n  /** ターミナルを取得する */\n  getTerminal(isDepartureGuide: boolean) {\n    const airportCode: string = this.modifyAirportCode(isDepartureGuide);\n    const terminalName = isDepartureGuide? this.depTerminal: this.arrTerminal;\n    switch(airportCode) {\n      case 'HND':\n        return this.getHNDTerminal(isDepartureGuide);\n      case 'NRT':\n        // 現在のANA便は成田には第1ターミナルにしか就航していない\n        // 他社便も対応するため、第三ターミナルの可能性も出てきました(2022/03/17現在)\n        return this.getNRTTerminal(isDepartureGuide);\n      case 'KIX':\n        // 現在のANA便は関西空港には第1ターミナルにしか就航していない\n        return '1';\n      default:\n        return terminalName;\n    }\n  }\n\n  /**\n   * 羽田空港の場合、発着ターミナルを返す\n   * @param isDepartureGuide 出発案内か\n   */\n  getHNDTerminal(isDepartureGuide: boolean) {\n    /** 国際線到着ターミナル未決定時に第2・第3ターミナル両方を経由する経路を表示するか */\n  const isShowViaSection: boolean = process.env['REACT_APP_IS_SHOW_VIA_SECTION'] === 'true';\n    const terminalName = isDepartureGuide? this.depTerminal: this.arrTerminal;\n    // 国内線の場合は第1・第2ターミナルかで分ける。\n    if (this.isDomestic) {\n      // 出発ターミナル名が第1ターミナルの場合。\n      if (FlightInfo.terminalCheck(1, terminalName)) {\n        // 搭乗口情報が存在し、第1ターミナルの文字列が含まれていた場合のみ、第1ターミナルの地点を取得する。\n        return 1;\n      } else {\n        return 2;\n      }\n    // 国際線の場合。\n    } else {\n      /** 2023/07 羽田国際線特別対応を行う */\n      /** NH159/NH968かつ24時間前を切っていないときには強制的に第3ターミナルにする */\n      if(this.isSpecialHNDIntTerminalBefore24Hours(isDepartureGuide)) {\n        return 3;\n      }\n      // 出発ターミナル名が第2ターミナルの場合。\n      // ASW経由のクエリには数字のみで渡されるため、この場合にも対応する\n      if (FlightInfo.terminalCheck(2, terminalName) ) {\n        return 2;\n      } else if (FlightInfo.terminalCheck(3, terminalName)) {\n        return 3;\n      } else {\n        /** 2023/07 羽田国際線特別対応を行う */\n        const specialHNDIntTerminalNumber = this.getSpecialHNDIntTerminalNumber(isDepartureGuide);\n        if(specialHNDIntTerminalNumber === 2) {\n          return specialHNDIntTerminalNumber;\n        }\n        if(!isShowViaSection) {\n          return 3;\n        }\n        return \"2_3\";\n      }\n    }\n  }\n  /**\n   * 成田空港の場合の発着ターミナルを返す\n   * @param isDepartureGuide 出発案内か\n   */\n  getNRTTerminal(isDepartureGuide: boolean) {\n    const terminalName = isDepartureGuide? this.depTerminal: this.arrTerminal;\n    /** 連携されたターミナル名に「3」の文字が含まれていたら第三ターミナルとする */\n    if (FlightInfo.terminalCheck(3, terminalName)) {\n      return 3;\n    }\n    else {\n      return 1;\n    }\n  }\n  /**\n   * タクシー経路で使用するためのコンディション情報を取得する\n   */\n  getCondition(isDepartureGuide: boolean) {\n    const airportCode = isDepartureGuide? this.depAirportCode: this.arrAirportCode;\n    // 搭乗ゲートは出発案内の時のみ取得できる\n    const bordingGate = isDepartureGuide? this.bordingGate: \"\";\n    switch(airportCode) {\n      // 関西国際空港の場合ゲートの番号に合わせて南北を返す\n      case 'KIX':\n        return (()=>{\n          const defaultZone = '北';\n          // 搭乗ゲートは出発案内しか取得できないため、出発案内のみ搭乗ゲートによる判定をする\n          if(bordingGate) {\n            if(this.isDomestic) {\n              if(Number(this.bordingGate)>=16 && Number(this.bordingGate)<=20) {\n                return '北';\n              }\n              else if(Number(this.bordingGate)>=21 && Number(this.bordingGate)<=25) {\n                return '南';\n              }\n              // ゲートが未確定の場合は「北」を返す\n              return defaultZone;\n            }\n            else {\n              if(Number(this.bordingGate)>=1 && Number(this.bordingGate)<=16) {\n                return '北';\n              }\n              else if(Number(this.bordingGate)>=25 && Number(this.bordingGate)<=41) {\n                return '南';\n              }\n              // ゲートが未確定の場合は「北」を返す\n              return defaultZone;\n            }\n          }\n          else {\n            // 到着案内の場合には到着ゲートが不明なため「北」を返す\n            return defaultZone;\n          }\n        })();\n      // 福岡空港の場合、ターミナル名によって判定をする\n      case 'FUK':\n        return (()=>{\n          const defaultZone = '南';\n          if(this.isDomestic) {\n            const terminal = isDepartureGuide? this.depTerminal: this.arrTerminal;\n            if(terminal.includes('北') || terminal.includes('North')) {\n              return '北';\n            }\n            if(terminal.includes('南') || terminal.includes('South')) {\n              return '南';\n            }\n            if(isDepartureGuide) {\n              // ターミナルより判定できない場合には搭乗ゲートより判定をする(出発案内のみ)\n              // 参考:福岡空港搭乗ゲート\n              // https://www.fukuoka-airport.jp/flight/flow_dom/index.html\n              if(Number(this.bordingGate) >= 0 && Number(this.bordingGate) <= 6) {\n                return '北';\n              }\n              if(Number(this.bordingGate) >= 7 && Number(this.bordingGate) <= 12) {\n                return '南';\n              }\n            }\n            // ゲートからも判定できない場合には「南」を返す\n            return defaultZone;\n          }\n          else {\n            return bordingGate;\n          }\n        })();\n      // 到着案内ではarrTerminalからGateを判定する\n      default:\n        return (()=>{\n          if(isDepartureGuide) {\n            return bordingGate;\n          }\n          else {\n            // 「4・5・6」のように黒丸で複数ある場合には先頭を返す\n            return this.exit.split(/[-・]/)[0];\n          }\n        })();\n    }\n  }\n\n  /**\n   * TYO/CTSのような表記ゆれを排除した空港コードを取得する\n   * @param isDepartureGuide 出発案内か否か\n   */\n  getFixTerminalCode(isDepartureGuide: boolean) {\n    let terminalCode = isDepartureGuide? this.depAirportCode: this.arrAirportCode;\n    const airportName = isDepartureGuide ? this.depAirportName : this.arrAirportName;\n    switch(terminalCode) {\n      case 'SPK':\n      case 'CTS':\n        return 'CTS';\n      case 'TYO':\n        return airportName.includes('Haneda')? 'HND': 'NRT';\n      default:\n        return terminalCode;\n    }\n  }\n\n  /**\n   * ターミナルを考慮した空港コードを取得する\n   * @param isDepartureGuide 出発案内か否か\n   * @param hasPriorityAirportBus 空港バス優先オプションが有効か\n   */\n  getAddTerminalAirportCode(isDepartureGuide: boolean, hasPriorityAirportBus: boolean) {\n    let terminalCode = isDepartureGuide? this.depAirportCode: this.arrAirportCode;\n    const terminalName = isDepartureGuide? this.depTerminal: this.arrTerminal;\n    const airportName = isDepartureGuide ? this.depAirportName : this.arrAirportName;\n    switch(terminalCode) {\n      case 'SPK':\n      case 'CTS':\n        // 国内線・国際線とバス停が異なるため分ける。\n        return this.isDomestic? 'CTS_DOM': 'CTS_INT';\n      case 'HND':\n        const HNDTerminal = this.getHNDTerminal(isDepartureGuide);\n        switch(HNDTerminal) {\n          case 1:\n            return 'HND_1';\n          case 2:\n            return 'HND_2';\n          case 3:\n            return 'HND_3';\n          case \"2_3\":\n            return hasPriorityAirportBus? 'HND_3': 'HND_2';\n        }\n      // 東京エリア(羽田・成田共用)の空港コードの場合。\n      // eslint-disable-next-line\n      case 'TYO':\n        if (airportName.includes('Haneda')) {\n          // 出発ターミナル名が第1ターミナルの場合。\n          if (FlightInfo.terminalCheck(1, terminalName)) {\n            // 搭乗口情報が存在し、第1ターミナルの文字列が含まれていた場合のみ、第1ターミナルの地点を取得する。\n            return 'HND_1';\n          } else {\n            return 'HND_2';\n          }\n        } else if (airportName.includes('Narita')) {\n          return 'NRT';\n        }\n        break;\n      // 福岡空港の場合、国際線・国内線(北・南)で地点を分ける。\n      case 'FUK':\n        // 国内線の場合。\n        if (this.isDomestic) {\n          // ターミナル情報がANA APIから取得できる日付ではない場合。\n          if (!this.isAvalableOperationInfo(isDepartureGuide)) {\n            return 'FUK_DOM';\n          // ANA APIの保安検査場名に北が含まれる場合。\n          } else if (this.securtyCheckPoint.includes('北') || this.securtyCheckPoint.includes('North')) {\n            return 'FUK_DOM_NORTH';\n          // ANA APIの保安検査場に南が含まれる場合。\n          } else if (this.securtyCheckPoint.includes('南') || this.securtyCheckPoint.includes('South')) {\n            return 'FUK_DOM_SOUTH';\n          // 未設定の場合。\n          } else {\n            return 'FUK_DOM';\n          }\n        // 国際線の場合。\n        }\n        else {\n          return 'FUK_INT';\n        }\n      // 那覇空港の場合、国際線・国内線で分ける\n      case 'OKA':\n        // 国内線の場合。\n        if (this.isDomestic) {\n          return 'OKA_DOM';\n        } else {\n          return 'OKA_INT';\n        }\n      default:\n        return terminalCode;\n    }\n  }\n\n  // ターミナル名が「第Xターミナル」「Terminal X」「X」の時にはTrueを返す\n  static terminalCheck(terminalNo: number, terminalName: string) {\n    return terminalName.includes(`第${terminalNo}ターミナル`) || terminalName.includes(`Terminal ${terminalNo}`) || terminalName === terminalNo.toString();\n  }\n\n  /** 該当の航空便情報が使用可能か */\n  getIsAbleUse() {\n    return this.errorMessage === '' && this.hasData;\n  }\n}\n\nexport default FlightInfo;\n","/** 発着地の種別。 */\nexport enum PointType {\n  STATION = 'station',\n  COORDINATE = 'coordinate',\n  ADDRESS = 'address',\n  CURRENT_POSITION = 'currentPosition',\n  SELECT_ON_MAP = 'selectOnMap',\n  NONE = '',\n  HISTORY = 'history',\n}\n","import { ConditionAction, ConditionActionType } from './../actions/conditionAction';\nimport { ConditionState, ModalStatus } from './../states/conditionState';\nimport FlightInfo from '../services/ana/models/flightInfo';\nimport { Lang } from '../states/query';\nimport { PointType } from '../states/common';\nimport { AirlineList } from '../utils/Airlines';\n\nconst initialState: ConditionState = {\n  point: '',\n  pointCode: '',\n  via: '',\n  viaCode: '',\n  hasVia: false,\n  pointType: PointType.NONE,\n  date: new Date(),\n  flight: '',\n  flightNumber: '',\n  arrivalTimeToAirport: 0,\n  isDepartureGuide: true,\n  isEnabledShinkansen: true,\n  isEnabledLimitedExpress: true,\n  isEnabledIc: true,\n  isDomestic: true,\n  flightStatus: new FlightInfo(),\n  flightStatusForSeachAd: new FlightInfo(),\n  flightStatusUserSetDateForSearchAd: new FlightInfo(),\n  cityName: '',\n  course: [],\n  conditionDetail: '',\n  query: {\n    flightNumber: '',\n    depAirport: '',\n    arrAirport: '',\n    fromAirportCode: '',\n    toAirportCode: '',\n    fromTerminal: '',\n    toTerminal: '',\n    std: null,\n    sta: null,\n    referrer: '',\n    isArrivalGuide: false,\n    lang: Lang.ja,\n    isDomestic: true\n  },\n  hasPriorityAirportBus: false,\n  /** 自動車利用を優先するフラグ。 */\n  hasPriorityCar: false,\n  hasPriorityCarWithBarrierFree: false,\n  searchedAt: new Date(),\n  consentAirportArrivalTime: false,\n  airportModalShow: false,\n  modalStatus: {\n    carCourse: ModalStatus.HIDE,\n    initModal: ModalStatus.HIDE\n  },\n  tokyoLimousineBusModalShow: false,\n  busTicketOitaModalShow: false,\n  isNoSetTerminalHND: false,\n  isAvalable: true,\n  directions: null,\n  courseIndex: 0,\n  pointGeoCode: {\n    lat: 0,\n    lng: 0\n  },\n  okinawaBusStopList: [],\n  isShowOkinawaBusLink: false,\n  place: null,\n  lastSelectedPlace: null,\n  taxiFareSummaries: [],\n  targetAirLine: 'ANA',\n  searchHistories: [],\n  isShowUMModal: true\n};\n\nconst conditionReducer = (state = initialState, action: ConditionAction) => {\n  switch (action.type) {\n    case 'UPDATE_POINT':\n      return {\n        ...state,\n        point: action.payload,\n      };\n    case 'UPDATE_POINT_CODE':\n      return {\n        ...state,\n        pointCode: action.payload,\n      };\n    case 'UPDATE_POINT_GEOCODE':\n      return {\n        ...state,\n        pointGeoCode: action.payload,\n      };\n    case 'UPDATE_VIA':\n      return {\n        ...state,\n        via: action.payload,\n      };\n    case 'UPDATE_VIA_CODE':\n      return {\n        ...state,\n        viaCode: action.payload,\n      }\n    case 'SWITCH_HAS_VIA':\n      return {\n        ...state,\n        hasVia: action.payload,\n      }\n    case ConditionActionType.UPDATE_POINT_TYPE:\n      return {\n        ...state,\n        pointType: action.payload,\n      }\n    case 'UPDATE_DATE':\n      return {\n        ...state,\n        date: action.payload,\n      };\n    case 'UPDATE_FLIGHT':\n      return {\n        ...state,\n        flight: action.payload,\n      };\n    case 'UPDATE_FLIGHT_NUMBER':\n      return {\n        ...state,\n        flightNumber: action.payload,\n      };\n    case ConditionActionType.UPDATE_FLIGHT_STATUS:\n      return {\n        ...state,\n        flightStatus: action.payload,\n      }\n    case ConditionActionType.UPDATE_FLIGHT_STATUS_FOR_SEARCH_AD:\n      return {\n        ...state,\n        flightStatusForSeachAd: action.payload,\n      }\n    case ConditionActionType.UPDATE_FLIGHT_STATUS_USER_SET_DATE_FOR_SEARCH_AD:\n      return {\n        ...state,\n        flightStatusUserSetDateForSearchAd: action.payload,\n      }\n    case ConditionActionType.UPDATE_ARRIVAL_TIME_TO_AIRPORT:\n      return {\n        ...state,\n        arrivalTimeToAirport: action.payload,\n      }\n    case ConditionActionType.UPDATE_CITY_BANE:\n      return {\n        ...state,\n        cityName: action.payload,\n      }\n    case ConditionActionType.UPDATE_QUERY:\n      return {\n        ...state,\n        query: action.payload,\n      };\n    case ConditionActionType.UPDATE_PLACE:\n      return {\n        ...state,\n        place: action.payload,\n      }\n    case ConditionActionType.UPDATE_LAST_SELECTED_PLACE:\n      return {\n        ...state,\n        lastSelectedPlace: action.payload,\n      }\n    case ConditionActionType.UPDATE_SEARCHED_AT:\n      return {\n        ...state,\n        searchedAt: action.payload,\n      };\n    case ConditionActionType.UPDATE_COURSE_INDEX:\n      return {\n        ...state,\n        courseIndex: action.payload,\n      }\n    case ConditionActionType.UPDATE_DIRECTIONS:\n      return {\n        ...state,\n        directions: action.payload,\n      }\n    case ConditionActionType.UPDATE_OKIBAWABUS_BUSSTOPLIST:\n      return {\n        ...state,\n        okinawaBusStopList: action.payload,\n      }\n    case ConditionActionType.UPDATE_TAXI_FARE_SUMMARIES:\n      return {\n        ...state,\n        taxiFareSummaries: action.payload,\n      }\n    case ConditionActionType.UPDATE_SEARCH_HISTORIES:\n      return {\n        ...state,\n        searchHistories: action.payload,\n      }\n    case 'SWITCH_IS_DEPARTURE_GUIDE':\n      return {\n        ...state,\n        isDepartureGuide: action.payload,\n      };\n    case 'SWITCH_SHINKANSEN':\n      return {\n        ...state,\n        isEnabledShinkansen: action.payload,\n      }\n    case 'SWITCH_LIMITED_EXPRESS':\n      return {\n        ...state,\n        isEnabledLimitedExpress: action.payload,\n      }\n    case ConditionActionType.SWITCH_IC:\n      return {\n        ...state,\n        isEnabledIc: action.payload,\n      }\n    case ConditionActionType.SWITCH_PRIORITY_AIRPORT_BUS:\n      return {\n        ...state,\n        hasPriorityAirportBus: action.payload,\n      }\n    case ConditionActionType.SWITCH_PRIORITY_CAR:\n      return {\n        ...state,\n        hasPriorityCar: action.payload,\n      }\n    case ConditionActionType.SWITCH_PRIORITY_CAR_WITH_BARRIER_FREE:\n      return {\n        ...state,\n        hasPriorityCarWithBarrierFree: action.payload,\n      }\n    case 'SWITCH_DOMESTIC':\n      return {\n        ...state,\n        isDomestic: action.payload,\n      }\n    case 'SWITCH_CONSENT_AIRPORT_ARRIVAL_TIME':\n      return {\n        ...state,\n        consentAirportArrivalTime: action.payload,\n      }\n    case 'SWITCH_AIRPORT_MODAL_SHOW':\n      return {\n        ...state,\n        airportModalShow: action.payload,\n      }\n    case ConditionActionType.UPDATE_MODAL_STATE:\n      return {\n        ...state,\n        modalStatus: action.payload,\n      }\n    case 'SWITCH_LIMOUSINE_BUS_MODAL_SHOW':\n      return {\n        ...state,\n        tokyoLimousineBusModalShow: action.payload,\n      }\n    case 'SWITCH_BUS_TICKET_OITA_MODAL_SHOW':\n      return {\n        ...state,\n        busTicketOitaModalShow: action.payload,\n      }\n    case 'SWITCH_IS_NO_SET_TERMINAL_HND':\n      return {\n        ...state,\n        isNoSetTerminalHND: action.payload,\n      }\n    case ConditionActionType.SWITCH_IS_AVALABLE:\n      return {\n        ...state,\n        isAvalable: action.payload,\n      }\n    case ConditionActionType.SWITCH_IS_SHOS_OKINAWA_BUS_LINK:\n      return {\n        ...state,\n        isShowOkinawaBusLink: action.payload,\n      }\n    case ConditionActionType.UPDATE_TARGET_AIRLINE:\n      return {\n        ...state,\n        targetAirLine: action.payload,\n      }\n    case 'ANA_GET_FLIGHT_START':\n      return {\n        ...state,\n        flightStatus: new FlightInfo(),\n      };\n    case 'ANA_GET_FLIGHT_SUCCEED':\n      return {\n        ...state,\n        flightStatus: action.payload.result,\n      };\n    case 'ANA_GET_FLIGHT_FAIL':\n      return {\n        ...state,\n        error: action.payload.error,\n      };\n    case ConditionActionType.ANA_GET_ROUTE_TYPE_START:\n      return {\n        ...state,\n        flightStatus: new FlightInfo(),\n      };\n    case ConditionActionType.ANA_GET_ROUTE_TYPE_SUCCEED:\n      return {\n        ...state,\n        flightStatus: action.payload.result,\n      };\n    case ConditionActionType.ANA_GET_ROUTE_TYPE_FAIL:\n      return {\n        ...state,\n        error: action.payload.error,\n      };\n    case 'EKISPERT_GET_EXTREME_START':\n      return {\n        ...state,\n        course: {},\n      };\n    case 'EKISPERT_GET_EXTREME_SUCCEED':\n      return {\n        ...state,\n        course: action.payload.result,\n      };\n    case 'EKISPERT_GET_EXTREME_FAIL':\n      return {\n        ...state,\n        error: action.payload.error,\n      };\n    case 'EKISPERT_GET_CONDITION_START':\n      return {\n        ...state,\n        conditionDetail: '',\n      };\n    case 'EKISPERT_GET_CONDITION_SUCCEED':\n      return {\n        ...state,\n        conditionDetail: action.payload.result,\n      };\n    case 'EKISPERT_GET_CONDITION_FAIL':\n      return {\n        ...state,\n        error: action.payload.error,\n      };\n    case 'UPDATE_COURSE':\n      return {\n        ...state,\n        course: action.payload,\n      }\n    case ConditionActionType.SWITCH_IS_SHOWUMMODAL:\n      return {\n        ...state,\n        isShowUMModal: action.payload,\n      }\n    default:\n      return state;\n  }\n}\n\nexport default conditionReducer;\n","import Place from \"../services/google/Place\";\nimport { PlaceDirections } from \"../services/google/PlaceDirections\";\nimport { AswLinkageInfo } from \"../services/public/models/aswLinkageInfo\";\nimport { DynamicPackageTicketingLinkList } from \"../services/public/models/dynamicPackageTicketingLink\";\nimport { RequestSearchType } from \"../services/public/models/searchCourse\";\nimport { UniversalMaaSCourse } from \"../services/universalMaas/models/universalMaaSCourse\";\nimport { PointType } from \"../states/common\";\nimport { displayOrderType, OnewayConditionState, Prefecture, PublicCourse, SortInfo, SortType } from \"../states/publicConditionState\";\nimport { Query } from \"../states/query\";\nimport { GeoLocation } from \"../utils/geoLocation\";\n\n// 探索条件に関わるアクション。\nexport enum PublicConditionActionType {\n  SWITCH_IS_UNAVAILABLE_SERVICE = 'SWITCH_IS_UNAVAILABLE_SERVICE',\n  INITIAL_RETURN_TRIP = 'INITIAL_RETURN_TRIP',\n\n  SWITCH_ROUND = 'SWITCH_ROUND',\n  UPDATE_OUTBOUND = 'UPDATE_OUTBOUND',\n  UPDATE_RETURN_TRIP = 'UPDATE_RETURN_TRIP',\n  SWITCH_MAP_DEPARTURE = 'SWITCH_MAP_DEPARTURE',\n\n  UPDATE_DEP_POINT = 'UPDATE_DEP_POINT',\n  UPDATE_ARR_POINT = 'UPDATE_ARR_POINT',\n  UPDATE_DEP_POINT_CODE = 'UPDATE_DEP_POINT_CODE',\n  UPDATE_ARR_POINT_CODE = 'UPDATE_ARR_POINT_CODE',\n  UPDATE_DEP_POINT_TYPE = 'UPDATE_DEP_POINT_TYPE',\n  UPDATE_ARR_POINT_TYPE = 'UPDATE_ARR_POINT_TYPE',\n  UPDATE_DEP_POINT_GEOCODE = 'UPDATE_DEP_POINT_GEOCODE',\n  UPDATE_ARR_POINT_GEOCODE = 'UPDATE_ARR_POINT_GEOCODE',\n  UPDATE_VIA = 'UPDATE_PUBLIC_VIA',\n  UPDATE_VIA_CODE = 'UPDATE_PUBLIC_VIA_CODE',\n  SWITCH_HAS_VIA = 'SWITCH_PUBLIC_HAS_VIA',\n  UPDATE_DATE = 'UPDATE_PUBLIC_DATE',\n  UPDATE_DISPLAY_ORDER = 'UPDATE_DISPLAY_ORDER',\n  UPDATE_DISPLAY_PAYMENT = 'UPDATE_DISPLAY_PAYMENT',\n  UPDATE_ARRIVAL_TIME_TO_AIRPORT = 'UPDATE_PUBLIC_ARRIVAL_TIME_TO_AIRPORT',\n  UPDATE_COURSE = 'UPDATE_PUBLIC_COURSE',\n  UPDATE_QUERY = 'UPDATE_PUBLIC_QUERY',\n  UPDATE_DEP_PLACE = 'UPDATE_DEP_PLACE',\n  UPDATE_ARR_PLACE = 'UPDATE_ARR_PLACE',\n  UPDATE_DEP_PREFECTURE = 'UPDATE_DEP_PREFECTURE',\n  UPDATE_ARR_PREFECTURE = 'UPDATE_ARR_PREFECTURE',\n  UPDATE_DEP_DIRECTIONS = 'UPDATE_DEP_DIRECTIONS',\n  UPDATE_ARR_DIRECTIONS = 'UPDATE_ARR_DIRECTIONS',\n  UPDATE_SORT_INFO = 'UPDATE_SORT_INFO',\n  UPDATE_COURSE_INDEX = 'UPDATE_COURSE_INDEX',\n  UPDATE_DEP_LAST_SELECTED_PLACE = 'UPDATE_DEP_LAST_SELECTED_PLACE',\n  UPDATE_ARR_LAST_SELECTED_PLACE = 'UPDATE_ARR_LAST_SELECTED_PLACE',\n  UPDATE_SORT_TYPE = 'UPDATE_SORT_TYPE',\n  UPDATE_ASW_LINKAGE_INFO = 'UPDATE_ASW_LINKAGE_INFO',\n  UPDATE_SEARCH_TYPE = 'UPDATE_SEARCH_TYPE',\n  UPDATE_UNSETTLED_OUTBOUND_DATE = 'UPDATE_UNSETTLED_OUTBOUND_DATE',\n  UPDATE_UNSETTLED_RETURN_TRIP_DATE = 'UPDATE_UNSETTLED_RETURN_TRIP_DATE',\n  UPDATE_DYNAMIC_PACKAGE_TICKETING_LINK_LIST = 'UPDATE_DYNAMIC_PACKAGE_TICKETING_LINK_LIST',\n  UPDATE_REQUEST_FLIGHT_INFO_QUERY = 'UPDATE_REQUEST_FLIGHT_INFO_QUERY',\n  UPDATE_UNIVERSALMAAS_COURSE = 'UPDATE_UNIVERSALMAAS_COURSE',\n  UPDATE_SEARCH_REQUEST_BODY = 'UPDATE_SEARCH_REQUEST_BODY',\n  UPDATE_SEARCH_EXPIRED_DATE = 'UPDATE_SEARCH_EXPIRED_DATE',\n\n  SWITCH_IS_ENABLED_SHINKANSEN = 'SWITCH_IS_ENABLED_SHINKANSEN',\n  SWITCH_IS_ENABLED_LIMITED_EXPRESS = 'SWITCH_IS_ENABLED_LIMITED_EXPRESS',\n  SWITCH_IS_ENABLED_IC = 'SWITCH_IS_ENABLED_IC',\n  SWITCH_HAS_PRIORITY_AIRPORT_BUS = 'SWITCH_HAS_PRIORITY_AIRPORT_BUS',\n  SWITCH_HAS_PRIORITY_CAR = 'SWITCH_HAS_PRIORITY_CAR',\n  SWITCH_NOW_SELECT_OUTBOUND = 'SWITCH_NOW_SELECT_OUTBOUND',\n  SWITCH_IS_LOADING_ASW_INFO = 'SWITCH_IS_LOADING_ASW_INFO',\n  SWITCH_IS_ACCEPT_ESTABLISHED_ROUTE = 'SWITCH_IS_ACCEPT_ESTABLISHED_ROUTE',\n  SWITCH_IS_UNIVERSAL_MAAS_MODE = 'SWITCH_IS_UNIVERSAL_MAAS_MODE',\n  SWITCH_IS_FLIGHT_RESERVED_MODE = 'SWITCH_IS_FLIGHT_RESERVED_MODE'\n}\n\nexport const OUTBOUND = 'OUTBOUND';\nexport const RETURN_TRIP = 'RETURN_TRIP';\n\nexport interface PublicConditionAction {\n  payload: any;\n  type: PublicConditionActionType;\n  parentType?: string;\n}\n\nexport const switchIsUnavailableService = (v: boolean) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_IS_UNAVAILABLE_SERVICE,\n});\n\nexport const switchIsUniversalMaaSMode = (v: boolean) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_IS_UNIVERSAL_MAAS_MODE,\n});\n\nexport const initialReturnTrip = (v: OnewayConditionState) => ({\n  payload: v,\n  type: PublicConditionActionType.INITIAL_RETURN_TRIP,\n});\n\nexport const switchRound = (v: boolean) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_ROUND,\n});\n\nexport const updateOutbound = (v: OnewayConditionState) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_OUTBOUND,\n});\n\nexport const updateReturnTrip = (v: OnewayConditionState) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_RETURN_TRIP,\n});\n\nexport const updateSortInfo = (v: SortInfo) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_SORT_INFO\n});\n\nexport const switchMapDeparture = (v: boolean) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_MAP_DEPARTURE,\n});\n\nexport const updateCourseIndex = (v: number) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_COURSE_INDEX,\n});\n\nexport const updateSortType = (v: SortType) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_SORT_TYPE,\n});\n\nexport const updateDepPoint = (v: string, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DEP_POINT,\n  parentType: parentType,\n});\n\nexport const updateArrPoint = (v: string, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_ARR_POINT,\n  parentType: parentType,\n});\n\nexport const updateDepPointCode = (v: string, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DEP_POINT_CODE,\n  parentType: parentType,\n});\n\nexport const updateArrPointCode = (v: string, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_ARR_POINT_CODE,\n  parentType: parentType,\n});\n\nexport const updateDepPointType = (v: string, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DEP_POINT_TYPE,\n  parentType: parentType,\n});\n\nexport const updateArrPointType = (v: string, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_ARR_POINT_TYPE,\n  parentType: parentType,\n});\n\nexport const updateDepPointGeoCode = (v: GeoLocation, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DEP_POINT_GEOCODE,\n  parentType: parentType,\n});\n\nexport const updateArrPointGeoCode = (v: GeoLocation, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_ARR_POINT_GEOCODE,\n  parentType: parentType,\n});\n\nexport const updateVia = (v: boolean, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_VIA,\n  parentType: parentType,\n});\n\nexport const updateViaCode = (v: PointType, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_VIA_CODE,\n  parentType: parentType,\n});\n\nexport const switchHasVia = (v: PointType, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_HAS_VIA,\n  parentType: parentType,\n});\n\nexport const updatePublicDate = (v: Date, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DATE,\n  parentType: parentType,\n});\n\nexport const updateDisplayOrder = (v: displayOrderType, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DISPLAY_ORDER,\n  parentType: parentType,\n});\n\nexport const updateDisplayPayment = (v: number, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DISPLAY_PAYMENT,\n  parentType: parentType,\n});\n\nexport const updateArrivalTimeToAirport = (v: number, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_ARRIVAL_TIME_TO_AIRPORT,\n  parentType: parentType,\n});\n\nexport const updateCourse = (v: PublicCourse[], parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_COURSE,\n  parentType: parentType,\n});\n\nexport const updateAswLinkageInfo = (v: AswLinkageInfo | null) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_ASW_LINKAGE_INFO\n});\n\nexport const updateDynamicPackageTicketingLinkList = (v: DynamicPackageTicketingLinkList | null) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DYNAMIC_PACKAGE_TICKETING_LINK_LIST\n});\n\nexport const updateNowSelectOutbound = (v: boolean) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_NOW_SELECT_OUTBOUND\n});\n\nexport const switchIsLoadingAswInfo = (v: boolean) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_IS_LOADING_ASW_INFO\n});\n\nexport const updatePublicQuery = (v: Query, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_QUERY,\n  parentType: parentType,\n});\n\nexport const updateDepPlace = (v: Place | null, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DEP_PLACE,\n  parentType: parentType,\n});\n\nexport const updateArrPlace = (v: Place | null, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_ARR_PLACE,\n  parentType: parentType,\n});\n\nexport const updateDepPrefecture = (v: Prefecture | null, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DEP_PREFECTURE,\n  parentType: parentType,\n});\n\nexport const updateArrPrefecture = (v: Prefecture | null, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_ARR_PREFECTURE,\n  parentType: parentType,\n});\n\nexport const updateDepDirections = (v: PlaceDirections, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DEP_DIRECTIONS,\n  parentType: parentType,\n});\n\nexport const updateArrDirections = (v: PlaceDirections, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_ARR_DIRECTIONS,\n  parentType: parentType,\n});\n\nexport const switchIsEnabledShinkansen = (v: boolean, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_IS_ENABLED_SHINKANSEN,\n  parentType: parentType,\n});\n\nexport const switchIsEnabledLimitedExpress = (v: boolean, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_IS_ENABLED_LIMITED_EXPRESS,\n  parentType: parentType,\n});\n\nexport const switchIsEnabledIc = (v: boolean, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_IS_ENABLED_IC,\n  parentType: parentType,\n});\n\nexport const switchHasPriorityAirportBus = (v: boolean) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_HAS_PRIORITY_AIRPORT_BUS,\n});\n\nexport const switchHasPriorityCar = (v: boolean) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_HAS_PRIORITY_CAR,\n});\n\nexport const updateDepLastSelectedPlace = (v: Place, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_DEP_LAST_SELECTED_PLACE,\n  parentType: parentType,\n});\n\nexport const switchIsFlightReservedMode = (v: boolean) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_IS_FLIGHT_RESERVED_MODE,\n})\n\nexport const updateArrLastSelectedPlace = (v: Place, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_ARR_LAST_SELECTED_PLACE,\n  parentType: parentType,\n});\n\nexport const updateSearchType = (v: RequestSearchType, parentType: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_SEARCH_TYPE,\n  parentType: parentType,\n})\n\nexport const updateUnsettledOutboundDate = (v: Date) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_UNSETTLED_OUTBOUND_DATE,\n})\n\nexport const updateUnsettledReturnTripDate = (v: Date) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_UNSETTLED_RETURN_TRIP_DATE,\n})\n\nexport const switchIsAcceptEstablishedRoute = (v: boolean) => ({\n  payload: v,\n  type: PublicConditionActionType.SWITCH_IS_ACCEPT_ESTABLISHED_ROUTE,\n})\n\nexport const updateRequestFlightInfoQuery = (v: string) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_REQUEST_FLIGHT_INFO_QUERY,\n})\n\nexport const updateUniversalMaaSCourse = (v: UniversalMaaSCourse) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_UNIVERSALMAAS_COURSE,\n})\n\nexport const updateSearchRequestBody = (v: any) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_SEARCH_REQUEST_BODY,\n})\n\nexport const updateSearchExpiredDate = (v: Date) => ({\n  payload: v,\n  type: PublicConditionActionType.UPDATE_SEARCH_EXPIRED_DATE,\n})\n","import { Lang } from \"../../../states/query\";\n\n/**\n * 経路検索のRequest\n */\nexport interface RequestSearchCourse {\n  mode: string,\n  language: Lang,\n  outwardTrip: OneWayRequestSearchCourse,\n  returnTrip?: OneWayRequestSearchCourse,\n  asyncGetFlightInfo?: boolean,\n  barrierFreeMode?: boolean,\n  searchDrivingRouteMode?: boolean\n}\n\n// 便固定検索時のRequest\nexport interface ReservedFlight {\n  origin: string,\n  destination: string,\n  departureDatetime: string,\n  arrivalDatetime: string,\n  flightNumber: string\n}\n\nexport interface OneWayRequestSearchCourse {\n  origin: RequestSearchPoint,\n  destination: RequestSearchPoint,\n  conditions: {\n    date: string,\n    time: string,\n    searchType: RequestSearchType,\n    arrivalAdjustmentTime: string,\n    prioritizeHighwayBus: boolean,\n    prioritizeCar: boolean,\n    prioritizeIc: boolean,\n    applyConvertingToMultipleAirport: boolean\n  },\n  reservedFlight?: ReservedFlight\n}\n\nexport interface RequestSearchPoint {\n  type: RequesrtPointType,\n  Location?: {\n    latlng: string,\n    name: string\n  }\n  Station?: {\n    latlng: string,\n    code: string\n  }\n}\n\nexport enum RequesrtPointType {\n  STATION = 'station',\n  LOCATION = 'location'\n}\n\nexport enum RequestSearchType {\n  DEPARTURE = 'departure',\n  ARRIVAL = 'arrival'\n}\n\n/**\n * 前後のダイヤ検索のRequest\n */\nexport interface RequestDiaList {\n  serializeData: string,\n  sectionIndex: number,\n  isOnlyANA: boolean,\n  numOfItems?: number,\n  applyTicketInfo: boolean\n}\n\n/**\n * スクレイピング結果取得API\n */\nexport interface GetFlightInfoRequest {\n  query: string\n}\n","import { Course, Price } from './../services/ekispert/models';\nimport Place from '../services/google/Place';\nimport { PlaceDirections } from '../services/google/PlaceDirections';\nimport { GeoLocation } from '../utils/geoLocation';\nimport { PointType } from './common';\nimport { PublicQuery } from './publicQuery';\nimport { AswLinkageInfo } from '../services/public/models/aswLinkageInfo';\nimport { RequestSearchType } from '../services/public/models/searchCourse';\nimport { DynamicPackageTicketingLinkList } from '../services/public/models/dynamicPackageTicketingLink';\nimport { UniversalMaaSCourse } from '../services/universalMaas/models/universalMaaSCourse';\n\nexport enum SortType {\n  FASTER = 'FASTER',\n  CHEAPER = 'CHEAPER',\n  EASIER = 'EASIER'\n}\n\n// 一般開放にて検索に使用する状態\nexport interface PublicConditionState {\n  /** 障害発生時など一時的にサービスが利用不可であるかを表すフラグ。 */\n  isUnavailableService: boolean,\n  // 往復かを判定するフラグ\n  isRound: boolean\n  // 何番目の経路を選択中\n  courseIndex: number,\n  // 往路の情報を格納する\n  outbound: OnewayConditionState,\n  // 復路の情報を格納する\n  returnTrip: OnewayConditionState,\n  // 往路・復路のマッチングテーブル\n  sortInfo: SortInfo,\n  // 地図から選択を出発地で開いたかを判定するフラグ\n  isMapDeparture: boolean,\n  // クエリ色々\n  query: PublicQuery,\n  // 選択中のソートタイプ\n  selectedSortType: SortType,\n  // ASWからスクレイピングで取得した空席情報\n  aswLinkageInfo: AswLinkageInfo | null,\n  // ASWからスクレイピングしたダイナミックパッケージへのURLリスト\n  dynamicPackageTicketingLinkList: DynamicPackageTicketingLinkList | null,\n  // 現在選択中が往路か復路か\n  nowSelectOutbound: boolean,\n  /** 編集中の項目の値。(「確定」ボタンを押す前の編集用のUIで利用する。) */\n  unsettled: Unsettled,\n  // ASWからのスクレイピング情報を読み込み中か\n  isLoadingASWInfo: boolean,\n  /** 旅程が成り立たない検索で出るアラートでOKを押したか */\n  isAcceptEstablishedRoute: boolean,\n  /** フライト情報を取得するためのRequestQuery */\n  requestFlightInfoQuery: string,\n  /** UniversalMaaS実証実験モードか */\n  isUniversalMaaSMode: boolean,\n  /** 便指定モードか */\n  isFlightReservedMode: boolean,\n  // UniversalMaaS実証実験モードで使用する行き止まりページの経路情報\n  universalMaaSCourse?: UniversalMaaSCourse,\n  // 経路検索のResponseBody(簡易経路取得にて利用する)\n  searchRequestBody: any\n  // そらたび検索可能リミット\n  searchExpiredDate: Date\n}\n\n// 往路と復路のマッチングテーブル\nexport interface SortInfo {\n  [key: string]: (number | number[])[],\n  faster: (number | number[])[],\n  cheaper: (number | number[])[],\n  easier: (number | number[])[]\n}\n\n// 一般開放用で表示するフライト概要情報\nexport interface FlightSummary {\n  // 予約ページ遷移用のリンク\n  // TODO: 後々予約ページの使用が固まったら実装する\n  // 予約便のフライトナンバー\n  flightNumber: string,\n  // 出発空港名\n  depAirportName: string,\n  // 到着空港名\n  arrAirportName: string,\n  // 出発空港コード\n  depAirportCode: string,\n  // 到着空港コード\n  arrAirportCode: string,\n  // 空席情報\n  vacancyInfo: string,\n  // 出発時刻\n  depDate: Date,\n  // 到着時刻\n  arrDate: Date,\n  // 運賃\n  price?: Price,\n  // フライト区間のLine要素Index番号\n  lineIndex: number\n}\n\n// 一般開放用の空港まで・空港からの区間のサマリー情報\nexport interface SectionSummary {\n  // (空港・出発地)出発時刻\n  depDate: Date,\n  // (空港・目的地)到着時刻\n  arrDate: Date,\n  // 片道運賃\n  fare: number,\n  // 片道料金\n  charge: number,\n  // 片道合計金額\n  sumPrice: number,\n  // 乗り換え回数\n  transferCount: number\n}\n\n// 一般開放用の経路情報\nexport interface PublicCourse {\n  // ANAの空路を含むか\n  includeAirways: boolean,\n  // 空路の概要\n  flightSummary: FlightSummary[],\n  course: Course,\n  // 出発空港までの情報の概要\n  toAirport: SectionSummary | null,\n  // 到着空港からの情報の概要\n  fromAirport: SectionSummary | null,\n  // 航空便変更にて読み込み中か\n  isReLoading: boolean,\n  // 一度再検索を行ったか\n  isReplaced: boolean\n}\n\n// 往路・復路のそれぞれで使用する検索情報\nexport interface OnewayConditionState {\n  // ユーザーが指定した地点。(出発地または目的地。)\n  depPoint: string,\n  arrPoint: string,\n  // ユーザーが指定した駅のコード、または地点。\n  depPointCode: string,\n  arrPointCode: string,\n  // ユーザーが指定した地点の座標情報\n  depPointGeoCode: GeoLocation,\n  arrPointGeoCode: GeoLocation,\n  // 経由地。\n  via: string,\n  // 経由地の駅コード。\n  viaCode: string,\n  // 経由地があるかを表すフラグ。\n  hasVia: boolean,\n  // ユーザーが取得した地点(出発地または目的地)の種別。\n  // (駅名、緯度経度、住所の3種類。)\n  depPointType: PointType,\n  arrPointType: PointType,\n  // 探索日時。\n  date: Date,\n  // ユーザーが指定する空港滞在時間。\n  arrivalTimeToAirport: number,\n  // 探索条件詳細。(利用する交通種別など。)\n  conditionDetail: string,\n  // 経路情報\n  course: PublicCourse[],\n  // 優先表示\n  priorityCondition: priorityCondition,\n\n  /** インクリメンタルサーチで取得した地点情報 */\n  depPlace: Place | null,\n  arrPlace: Place | null,\n\n  depPrefecture: Prefecture | null,\n  arrPrefecture: Prefecture | null,\n\n  /** 空港から目的地までのGoogleDirectionAPIから取得したルート情報 */\n  depDirections: PlaceDirections | null,\n  arrDirections: PlaceDirections | null,\n  depLastSelectedPlace: Place | null,\n  arrLastSelectedPlace: Place | null,\n  /** 探索種別。(「発時刻探索」または「着時刻探索」のみ。) */\n  // https://docs.ekispert.com/v1/dictionary/search-type/\n  searchType: RequestSearchType,\n}\n\n// 優先表示する情報をまとめる\nexport interface priorityCondition {\n  /** 空港連絡バスを優先するフラグ。 */\n  hasPriorityAirportBus: boolean,\n  /** 自動車を優先するフラグ。 */\n  hasPriorityCar: boolean\n}\n\nexport enum displayOrderType {\n  // 時間順\n  TIME = 'TIME',\n  // 料金順\n  PAYMENT = 'PAYMENT',\n  // 乗換回数順\n  EXCHANGE = 'EXCHANGE'\n}\n\n/** 編集中(未確定)の項目。 */\nexport interface Unsettled {\n  /** 確定前の往路の探索日時。 */\n  outboundDate: Date,\n  /** 確定前の復路の探索日時。 */\n  returnTripDate: Date,\n}\n\nexport interface Prefecture {\n  Name: string,\n  code: string\n}\n","import { OUTBOUND, RETURN_TRIP, PublicConditionAction, PublicConditionActionType } from \"../actions/publicConditionAction\"\nimport { RequestSearchType } from \"../services/public/models/searchCourse\"\nimport { PointType } from \"../states/common\"\nimport { OnewayConditionState, priorityCondition, PublicConditionState, SortType } from \"../states/publicConditionState\"\n\nconst initialPriorityCondition: priorityCondition = {\n  hasPriorityAirportBus: false,\n  hasPriorityCar: false\n}\n\n// 翌日の日付を取得する\nconst getTomorrow = () => {\n  let date = new Date();\n  // 翌日の日付をセット\n  date.setDate( date.getDate() + 1 )\n\n  // 時間は00:00:00にセット\n  date.setHours(7);\n  date.setMinutes(0);\n  date.setSeconds(0);\n  return date;\n}\n\nconst initialOnewayState: OnewayConditionState = {\n  depPoint: '',\n  arrPoint: '',\n  depPointCode: '',\n  arrPointCode: '',\n  depPointType: PointType.NONE,\n  arrPointType: PointType.NONE,\n  depPointGeoCode: {\n    lat: 0,\n    lng: 0\n  },\n  arrPointGeoCode: {\n    lat: 0,\n    lng: 0\n  },\n  via: '',\n  viaCode: '',\n  hasVia: false,\n  date: getTomorrow(),\n  arrivalTimeToAirport: 60,\n  conditionDetail: '',\n  course: [],\n  priorityCondition: initialPriorityCondition,\n  depPlace: null,\n  arrPlace: null,\n  depPrefecture: null,\n  arrPrefecture: null,\n  depDirections: null,\n  arrDirections: null,\n  depLastSelectedPlace: null,\n  arrLastSelectedPlace: null,\n  searchType: RequestSearchType.DEPARTURE,\n}\n\nexport const initialSortInfo = {\n  faster: [],\n  cheaper: [],\n  easier: []\n}\n\nconst initialState: PublicConditionState = {\n  isUnavailableService: false,\n  isRound: true,\n  courseIndex: 0,\n  outbound: initialOnewayState,\n  returnTrip: initialOnewayState,\n  sortInfo: initialSortInfo,\n  isMapDeparture: false,\n  query: {\n    isRound: 'true',\n    outboundDepPoint: '',\n    outboundDepPointCode: '',\n    outboundDepPointType: PointType.NONE,\n    outboundDepPointGeoCode: '',\n    outboundArrPoint: '',\n    outboundArrPointCode: '',\n    outboundArrPointType: PointType.NONE,\n    outboundArrPointGeoCode: '',\n    outboundDate: `${(new Date()).getTime()}`,\n    outboundArrivalTimeToAirport: '60',\n    outboundIsEnabledIc: 'true',\n    outboundHasPriorityAirportBus: '',\n    outboundHasPriorityCar: '',\n    outboundHasPriorityBarrierFreeMode: '',\n    outboundSearchType: RequestSearchType.DEPARTURE,\n    returnTripDepPoint: '',\n    returnTripDepPointCode: '',\n    returnTripDepPointType: '',\n    returnTripDepPointGeoCode: '',\n    returnTripArrPoint: '',\n    returnTripArrPointCode: '',\n    returnTripArrPointType: '',\n    returnTripArrPointGeoCode: '',\n    returnTripDate: '',\n    returnTripArrivalTimeToAirport: '',\n    returnTripIsEnabledIc: '',\n    returnTripHasPriorityAirportBus: '',\n    returnTripHasPriorityCar: '',\n    returnTripHasPriorityBarrierFreeMode: '',\n    returnTripSearchType: RequestSearchType.DEPARTURE,\n  },\n  selectedSortType: SortType.FASTER,\n  aswLinkageInfo: null,\n  dynamicPackageTicketingLinkList: null,\n  nowSelectOutbound: true,\n  unsettled: {\n    outboundDate: new Date(),\n    returnTripDate: new Date(),\n  },\n  isLoadingASWInfo: false,\n  isAcceptEstablishedRoute: false,\n  requestFlightInfoQuery: \"\",\n  isUniversalMaaSMode: false,\n  isFlightReservedMode: false,\n  searchRequestBody: {},\n  /** そらたび検索可能期間 */\n  searchExpiredDate: new Date(\"2023-10-28T00:00:00+09:00\")\n}\n\nconst publicConditionReducer = (state = initialState, action: PublicConditionAction) => {\n  switch(action.type) {\n    case PublicConditionActionType.SWITCH_IS_UNAVAILABLE_SERVICE:\n      return {\n        ...state,\n        isUnavailableService: action.payload,\n      };\n    case PublicConditionActionType.SWITCH_IS_LOADING_ASW_INFO:\n      return {\n        ...state,\n        isLoadingASWInfo: action.payload,\n      };\n    case PublicConditionActionType.INITIAL_RETURN_TRIP:\n      return {\n        ...state,\n        returnTrip: action.payload,\n      };\n    case PublicConditionActionType.SWITCH_ROUND:\n      return {\n        ...state,\n        isRound: action.payload,\n      };\n    case PublicConditionActionType.UPDATE_OUTBOUND:\n      return {\n        ...state,\n        outbound: action.payload,\n      }\n    case PublicConditionActionType.UPDATE_COURSE_INDEX:\n      return {\n        ...state,\n        courseIndex: action.payload,\n      }\n    case PublicConditionActionType.UPDATE_RETURN_TRIP:\n      return {\n        ...state,\n        returnTrip: action.payload,\n      }\n    case PublicConditionActionType.SWITCH_MAP_DEPARTURE:\n      return {\n        ...state,\n        isMapDeparture: action.payload,\n      }\n    case PublicConditionActionType.UPDATE_SEARCH_EXPIRED_DATE:\n      return {\n        ...state,\n        searchExpiredDate: action.payload,\n      }\n    case PublicConditionActionType.UPDATE_DEP_POINT:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, depPoint: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, depPoint: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_ARR_POINT:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, arrPoint: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, arrPoint: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_DEP_POINT_CODE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, depPointCode: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, depPointCode: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_DEP_POINT_GEOCODE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, depPointGeoCode: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, depPointGeoCode: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_ARR_POINT_GEOCODE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, arrPointGeoCode: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, arrPointGeoCode: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_ARR_POINT_CODE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, arrPointCode: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, arrPointCode: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_DEP_POINT_TYPE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, depPointType: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, depPointType: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_ARR_POINT_TYPE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, arrPointType: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, arrPointType: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_DEP_PLACE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, depPlace: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, depPlace: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_ARR_PLACE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, arrPlace: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, arrPlace: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_DEP_PREFECTURE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, depPrefecture: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, depPrefecture: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_ARR_PREFECTURE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, arrPrefecture: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, arrPrefecture: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_DATE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, date: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, date: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_ARRIVAL_TIME_TO_AIRPORT:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, arrivalTimeToAirport: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, arrivalTimeToAirport: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_COURSE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, course: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, course: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_SORT_INFO:\n      return {\n        ...state,\n        sortInfo: action.payload,\n      };\n    case PublicConditionActionType.UPDATE_SORT_TYPE:\n      return {\n        ...state,\n        selectedSortType: action.payload,\n      };\n    case PublicConditionActionType.UPDATE_ASW_LINKAGE_INFO:\n      return {\n        ...state,\n        aswLinkageInfo: action.payload,\n      };\n    case PublicConditionActionType.UPDATE_DYNAMIC_PACKAGE_TICKETING_LINK_LIST:\n      return {\n        ...state,\n        dynamicPackageTicketingLinkList: action.payload,\n      };\n    case PublicConditionActionType.SWITCH_NOW_SELECT_OUTBOUND:\n      return {\n        ...state,\n        nowSelectOutbound: action.payload,\n      };\n    case PublicConditionActionType.UPDATE_DEP_DIRECTIONS:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, depDirections: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, depDirections: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_ARR_DIRECTIONS:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, arrDirections: action.payload}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, arrDirections: action.payload}\n        };\n      }\n      return state;\n    case PublicConditionActionType.SWITCH_HAS_PRIORITY_AIRPORT_BUS:\n      // 往路復路の両方に反映させる\n      const updateOutboundPriorityBusCondition: priorityCondition = {\n        ...state.outbound.priorityCondition,\n        hasPriorityAirportBus: action.payload\n      };\n      const updateReturnTripPriorityBusCondition: priorityCondition = {\n        ...state.returnTrip.priorityCondition,\n        hasPriorityAirportBus: action.payload\n      };\n      return {\n        ...state,\n        outbound: {...state.outbound, priorityCondition: updateOutboundPriorityBusCondition},\n        returnTrip: {...state.returnTrip, priorityCondition: updateReturnTripPriorityBusCondition}\n      };\n    case PublicConditionActionType.SWITCH_HAS_PRIORITY_CAR:\n      // 往路復路の両方に反映させる\n      const updateOutboundPriorityCarCondition: priorityCondition = {\n        ...state.outbound.priorityCondition,\n        hasPriorityCar: action.payload\n      };\n      const updateReturnTripPriorityCarCondition: priorityCondition = {\n        ...state.returnTrip.priorityCondition,\n        hasPriorityCar: action.payload\n      };\n      return {\n        ...state,\n        outbound: {...state.outbound, priorityCondition: updateOutboundPriorityCarCondition},\n        returnTrip: {...state.returnTrip, priorityCondition: updateReturnTripPriorityCarCondition}\n      };\n    case PublicConditionActionType.UPDATE_DEP_LAST_SELECTED_PLACE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, depLastSelectedPlace: action.payload,}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, depLastSelectedPlace: action.payload,}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_ARR_LAST_SELECTED_PLACE:\n      if (action.parentType === OUTBOUND) {\n        return {\n          ...state,\n          outbound: {...state.outbound, arrLastSelectedPlace: action.payload,}\n        };\n      }\n      if (action.parentType === RETURN_TRIP) {\n        return {\n          ...state,\n          returnTrip: {...state.returnTrip, arrLastSelectedPlace: action.payload,}\n        };\n      }\n      return state;\n    case PublicConditionActionType.UPDATE_SEARCH_TYPE:\n      switch(action.parentType) {\n        case OUTBOUND:\n          return {\n            ...state,\n            outbound: {...state.outbound, searchType: action.payload,}\n          };\n        case RETURN_TRIP:\n          return {\n            ...state,\n            returnTrip: {...state.returnTrip, searchType: action.payload,}\n          };\n        default:\n          break;\n      }\n      break;\n    case PublicConditionActionType.UPDATE_UNSETTLED_OUTBOUND_DATE:\n      return {\n        ...state,\n        unsettled: {\n          ...state.unsettled,\n          outboundDate: action.payload,\n        }\n      }\n    case PublicConditionActionType.UPDATE_UNSETTLED_RETURN_TRIP_DATE:\n      return {\n        ...state,\n        unsettled: {\n          ...state.unsettled,\n          returnTripDate: action.payload,\n        }\n      }\n    case PublicConditionActionType.SWITCH_IS_ACCEPT_ESTABLISHED_ROUTE:\n      return {\n        ...state,\n        isAcceptEstablishedRoute: action.payload,\n      };\n    case PublicConditionActionType.UPDATE_REQUEST_FLIGHT_INFO_QUERY:\n      return {\n        ...state,\n        requestFlightInfoQuery: action.payload,\n      };\n    case PublicConditionActionType.SWITCH_IS_UNIVERSAL_MAAS_MODE:\n      return {\n        ...state,\n        isUniversalMaaSMode: action.payload,\n      };\n    case PublicConditionActionType.SWITCH_IS_FLIGHT_RESERVED_MODE:\n      return {\n        ...state,\n        isFlightReservedMode: action.payload,\n      };\n    case PublicConditionActionType.UPDATE_UNIVERSALMAAS_COURSE:\n      return {\n        ...state,\n        universalMaaSCourse: action.payload,\n      };\n    case PublicConditionActionType.UPDATE_SEARCH_REQUEST_BODY:\n      return {\n        ...state,\n        searchRequestBody: action.payload,\n      };\n    default:\n      return state;\n  }\n}\n\nexport default publicConditionReducer;\n","import { AxiosError } from \"axios\";\nimport InterruptTransferStation from \"../components/result/InterruptTransferStation/InterruptTransferStation\";\nimport { TaxiStandInfo } from \"../lib/TaxiStand/data/AirportTaxiMaster\";\nimport { TraininfoList } from \"../services/ekispert/models\";\nimport { TaxiCompanyConfigurations } from \"../services/taxi/GetTaxiMetaInfo/model/taxiCompanyConf\";\nimport { GeneralTmpValues } from \"../states/general\";\nimport { UniversalMaaSQuery } from \"../states/universalMaaSQuery\";\n\n// 探索条件に関わるアクション。\n\nexport enum GeneralActionType {\n  SWITCH_IS_FAIL_IN_GET_COURSES = 'SWITCH_IS_FAIL_IN_GET_COURSES',\n  SWITCH_SHOW_MAP = 'SWITCH_SHOW_MAP',\n  SWITCH_CANDIDATE_SELECTOR_IS_VIA = 'SWITCH_CANDIDATE_SELECTOR_IS_VIA',\n  SWITCH_SHOW_CANDIDATE_LIST_MODAL = 'SWITCH_SHOW_CANDIDATE_LIST_MODAL',\n  SWITCH_IS_FROM_MAP_TO_CANDIDATE_LIST_MODAL = 'SWITCH_IS_FROM_MAP_TO_CANDIDATE_LIST_MODAL',\n  SWITCH_IS_LOADING = 'SWITCH_IS_LOADING',\n  SWITCH_IS_INITIAL = 'SWITCH_IS_INITIAL',\n  SWITCH_IS_FAIL_ASSIGN_DIA = 'SWITCH_IS_FAIL_ASSIGN_DIA',\n  UPDATE_ERROR_MESSAGE = 'UPDATE_ERROR_MESSAGE',\n  UPDATE_REFERRER = 'UPDATE_REFERRER',\n  UPDATE_TRAININFO = 'UPDATE_TRAININFO',\n  UPDATE_AXIOS_ERROR = 'UPDATE_AXIOS_ERROR',\n  UPDATE_PUBLIC_LANG = 'UPDATE_PUBLIC_LANG',\n  UPDATE_TMP_VALUES = 'UPDATE_TMP_VALUES',\n  UPDATE_TMP_IS_UPDATE_IN_MAP_SELECTOR = 'UPDATE_TMP_IS_UPDATE_IN_MAP_SELECTOR',\n  UPDATE_TAXI_COMPANY_CONFIGURATIONS = 'UPDATE_TAXI_COMPANY_CONFIGURATIONS',\n  UPDATE_UNIVERSAL_MAAS_QUERY = \"UPDATE_UNIVERSAL_MAAS_QUERY\",\n  UPDATE_TAXI_STAND_INFO = \"UPDATE_TAXI_STAND_INFO\",\n  UPDATE_INTERRUPT_TRANSFER_STATIONS = \"UPDATE_INTERRUPT_TRANSFER_STATIONS\",\n  UPDATE_INTERRUPT_TRANSFER_STATIONS_IN_UNDECIDED = \"UPDATE_INTERRUPT_TRANSFER_STATIONS_IN_UNDECIDED\",\n  SWITCH_IS_BACKEND_CROWDED_SEARCH = 'SWITCH_IS_BACKEND_CROWDED_SEARCH',\n  SWITCH_IS_BACKEND_CROWDED_GET_FLIGHT_INFO = 'SWITCH_IS_BACKEND_CROWDED_GET_FLIGHT_INFO',\n  SWITCH_IS_BACKEND_CROWDED_SEARCH_DIA_LIST = 'SWITCH_IS_BACKEND_CROWDED_SEARCH_DIA_LIST',\n  SWITCH_MODE = 'SWICH_MODE',\n  SWITCH_USE_V2 = 'SWITCH_USE_V2',\n  RANDOM_TMP_AD_ROATATION_VALUE = 'RANDOM_TMP_AD_ROATATION_VALUE'\n}\n\nexport interface GeneralAction {\n  payload: any;\n  type: GeneralActionType;\n  modeType?: string;\n  isOutbound?: boolean;\n}\n\nexport const switchIsFailInGetCourses = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_IS_FAIL_IN_GET_COURSES,\n})\n\nexport const switchShowMap = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_SHOW_MAP,\n})\n\nexport const switchCandidateSelectorIsVia = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_CANDIDATE_SELECTOR_IS_VIA,\n})\n\nexport const switchShowCandidateListModal = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_SHOW_CANDIDATE_LIST_MODAL,\n})\n\nexport const switchIsFromMapToCandidateListModal = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_IS_FROM_MAP_TO_CANDIDATE_LIST_MODAL,\n})\n\nexport const switchisLoading = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_IS_LOADING,\n})\n\nexport const switchIsInitial = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_IS_INITIAL,\n})\n\nexport const switchIsErrorAssignDia = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_IS_FAIL_ASSIGN_DIA,\n})\n\nexport const updateErrorMessage = (v: string) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_ERROR_MESSAGE,\n})\n\nexport const updateReferrer = (v: string) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_REFERRER,\n});\n\nexport const updateTraininfo = (v: TraininfoList) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_TRAININFO,\n})\n\nexport const updateAxiosError = (v: AxiosError) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_AXIOS_ERROR,\n})\n\nexport const updatePublicLang = (v: string) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_PUBLIC_LANG,\n})\n\nexport const updateTmpValues = (v: GeneralTmpValues) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_TMP_VALUES,\n})\n\nexport const updateInterruptTransferStations = (v: InterruptTransferStation[], isOutbound: boolean = true) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_INTERRUPT_TRANSFER_STATIONS,\n  isOutbound: isOutbound\n})\n\nexport const updateInterruptTransferStationsInUndecided = (v: InterruptTransferStation[], isOutbound: boolean = true) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_INTERRUPT_TRANSFER_STATIONS_IN_UNDECIDED,\n  isOutbound: isOutbound\n})\n\nexport const switchIsBackendCrowdedSearch = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_IS_BACKEND_CROWDED_SEARCH,\n})\n\nexport const switchIsBackendCrowdedFlightInfo = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_IS_BACKEND_CROWDED_GET_FLIGHT_INFO,\n})\n\nexport const switchIsBackendSearchDiaList = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_IS_BACKEND_CROWDED_SEARCH_DIA_LIST,\n})\n\nexport const updateTmpIsUpdateInMapSelector = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_TMP_IS_UPDATE_IN_MAP_SELECTOR,\n})\n\nexport const updateTaxiCompanyConfigurations = (v: TaxiCompanyConfigurations) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_TAXI_COMPANY_CONFIGURATIONS,\n});\n\nexport const updateUniversalMaaSQuery = (v: UniversalMaaSQuery) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_UNIVERSAL_MAAS_QUERY,\n});\n\nexport const updateTaxiStandInfo = (v: TaxiStandInfo) => ({\n  payload: v,\n  type: GeneralActionType.UPDATE_TAXI_STAND_INFO,\n})\n\nexport const switchGeneralMode = (v: boolean, modeType: string) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_MODE,\n  modeType: modeType\n})\n\nexport const randomTmpAdRoatationValue = () => ({\n  payload: Math.floor(Math.random() * Math.pow(10,10)),\n  type: GeneralActionType.RANDOM_TMP_AD_ROATATION_VALUE,\n})\n\nexport const switchUseV2 = (v: boolean) => ({\n  payload: v,\n  type: GeneralActionType.SWITCH_USE_V2,\n})\n","import { GeneralAction, GeneralActionType } from \"../actions/generalAction\";\nimport { General } from \"../states/general\";\nimport { Lang } from \"../states/query\";\n\nconst genetalInitial: General = {\n  /** 経路取得に失敗したことを表すフラグ。 */\n  isFailInGetCourses: false,\n  /** GoogleMapを表示するかを判定するフラグ */\n  isShowMap: false,\n  /** FindCandidateListModalで経由地を選択しているかを判定するフラグ */\n  candidateSelectorIsVia: false,\n  /** 目的地・出発地を選択するモーダルを表示するかを判定するフラグ */\n  isShowCandidateListModal: false,\n  /** 地図画面でから目的地・出発地を選択するモーダルにもだった状態であるかを判定するフラグ */\n  isFromMapToCandidateListModal: false,\n  /** 遷移元のリファラーURL */\n  referrer: '',\n  /** 初期描画であるかを表すフラグ。 */\n  isInitial: true,\n  isLoading: false,\n  axiosError: null,\n  errorMessage: '',\n  traininfoList: {},\n  lang: Lang.ja,\n  isFailInAssignDia: false,\n  isBackendCrowded: {\n    search: false,\n    getFlightInfo: false,\n    searchDiaList: false\n  },\n  tmp: {\n    placeInfo: {\n      pointName: '',\n      pointCode: '',\n      pointType: '',\n      place: null,\n      lastSelectedPlace: null,\n      pointGeoCode: {\n        lat: 0,\n        lng: 0\n      },\n      isUpdateInMapSelector: false\n    },\n    updateCheck: 0,\n    isShowPublicSummary: false,\n    applyConvertingToMultipleAirport: {\n      outbound: false,\n      returnTrip: false\n    },\n    publicInterruptTransferStations: {\n      isResearch: false,\n      isOutbound: false\n    },\n    debugErrorMessage: '',\n    adRotationRand: 0\n  },\n  universalMaaSQuery: {},\n  mode: {\n    isShowBarrierFreeInfo: false,\n    isBarrierFreeMode: false\n  },\n  interruptTransfer: {\n    outbound: {\n      interruptTransferStations: [],\n      interruptTransferStationsInUndecided: []\n    },\n    returnTrip: {\n      interruptTransferStations: [],\n      interruptTransferStationsInUndecided: []\n    }\n  },\n  /** タクシー仮予約ページでreCAPTHCA v2を利用するかを表すフラグ。 */\n  useV2: false,\n}\n\nconst generalReducer = (state = genetalInitial, action: GeneralAction) => {\n  const newInterruptTransfer = state.interruptTransfer;\n  switch(action.type) {\n    case GeneralActionType.SWITCH_IS_FAIL_IN_GET_COURSES:\n      return {\n        ...state,\n        isFailInGetCourses: action.payload,\n      };\n    case GeneralActionType.SWITCH_SHOW_MAP:\n      return {\n        ...state,\n        isShowMap: action.payload,\n      }\n    case GeneralActionType.SWITCH_CANDIDATE_SELECTOR_IS_VIA:\n    return {\n      ...state,\n      candidateSelectorIsVia: action.payload,\n    }\n    case GeneralActionType.SWITCH_SHOW_CANDIDATE_LIST_MODAL:\n      return {\n        ...state,\n        isShowCandidateListModal: action.payload,\n      }\n    case GeneralActionType.SWITCH_IS_FROM_MAP_TO_CANDIDATE_LIST_MODAL:\n    return {\n      ...state,\n      isFromMapToCandidateListModal: action.payload,\n    }\n    case GeneralActionType.SWITCH_IS_LOADING:\n      return {\n        ...state,\n        isLoading: action.payload,\n      }\n    case GeneralActionType.SWITCH_IS_INITIAL:\n      return {\n        ...state,\n        isInitial: action.payload,\n      }\n    case GeneralActionType.SWITCH_IS_FAIL_ASSIGN_DIA:\n      return {\n        ...state,\n        isFailInAssignDia: action.payload,\n      }\n    case GeneralActionType.SWITCH_IS_BACKEND_CROWDED_SEARCH:\n      return {\n        ...state,\n        isBackendCrowded: {\n          ...state.isBackendCrowded,\n          search: action.payload\n        },\n      }\n    case GeneralActionType.SWITCH_IS_BACKEND_CROWDED_GET_FLIGHT_INFO:\n      return {\n        ...state,\n        isBackendCrowded: {\n          ...state.isBackendCrowded,\n          getFlightInfo: action.payload\n        },\n      }\n    case GeneralActionType.SWITCH_IS_BACKEND_CROWDED_SEARCH_DIA_LIST:\n      return {\n        ...state,\n        isBackendCrowded: {\n          ...state.isBackendCrowded,\n          searchDiaList: action.payload\n        },\n      }\n    case GeneralActionType.SWITCH_USE_V2:\n      return {\n        ...state,\n        useV2: action.payload,\n      }\n    case GeneralActionType.UPDATE_ERROR_MESSAGE:\n      return {\n        ...state,\n        errorMessage: action.payload,\n      }\n    case GeneralActionType.UPDATE_REFERRER:\n      return {\n        ...state,\n        referrer: action.payload,\n      };\n    case GeneralActionType.UPDATE_TRAININFO:\n      return {\n        ...state,\n        traininfoList: action.payload,\n      }\n    case GeneralActionType.UPDATE_AXIOS_ERROR:\n      return {\n        ...state,\n        axiosError: action.payload,\n      }\n    case GeneralActionType.UPDATE_PUBLIC_LANG:\n      return {\n        ...state,\n        lang: action.payload,\n      }\n    case GeneralActionType.UPDATE_TMP_VALUES:\n      return {\n        ...state,\n        tmp: action.payload,\n      }\n    case GeneralActionType.UPDATE_UNIVERSAL_MAAS_QUERY:\n      return {\n        ...state,\n        universalMaaSQuery: action.payload,\n      };\n    case GeneralActionType.UPDATE_TMP_IS_UPDATE_IN_MAP_SELECTOR:\n      return {\n        ...state,\n        tmp: {\n          ...state.tmp,\n          placeInfo: {\n            ...state.tmp.placeInfo,\n            isUpdateInMapSelector: action.payload\n          }\n        }\n      }\n    case GeneralActionType.RANDOM_TMP_AD_ROATATION_VALUE:\n      return {\n        ...state,\n        tmp: {\n          ...state.tmp,\n          adRotationRand: action.payload\n        }\n      }\n    case GeneralActionType.UPDATE_TAXI_COMPANY_CONFIGURATIONS:\n      return {\n        ...state,\n        taxiCompanyConfigurations: action.payload,\n      }\n    case GeneralActionType.UPDATE_TAXI_STAND_INFO:\n      return {\n        ...state,\n        taxiStandInfo: action.payload,\n      }\n    case GeneralActionType.SWITCH_MODE:\n      const newMode = state.mode;\n      switch(action.modeType) {\n        case 'isShowBarrierFreeInfo':\n          newMode.isShowBarrierFreeInfo = action.payload;\n          break;\n        case 'isBarrierFreeMode':\n          newMode.isBarrierFreeMode = action.payload;\n          break;\n      }\n      return {\n        ...state,\n        mode: newMode,\n      };\n    case GeneralActionType.UPDATE_INTERRUPT_TRANSFER_STATIONS:\n      if(action.isOutbound) {\n        newInterruptTransfer.outbound.interruptTransferStations = action.payload;\n      }\n      else {\n        newInterruptTransfer.returnTrip.interruptTransferStations = action.payload;\n      }\n      return {\n        ...state,\n        interruptTransfer: newInterruptTransfer,\n      }\n    case GeneralActionType.UPDATE_INTERRUPT_TRANSFER_STATIONS_IN_UNDECIDED:\n      if(action.isOutbound) {\n        newInterruptTransfer.outbound.interruptTransferStationsInUndecided = action.payload;\n      }\n      else {\n        newInterruptTransfer.returnTrip.interruptTransferStationsInUndecided = action.payload;\n      }\n      return {\n        ...state,\n        interruptTransfer: newInterruptTransfer,\n      }\n    default:\n      return state;\n  }\n}\n\nexport default generalReducer;\n","import { combineReducers } from 'redux';\nimport { History } from 'history';\nimport { RouterState, connectRouter } from 'connected-react-router'\nimport { ConditionState } from './../states/conditionState';\nimport conditionReducer from '../reducers/conditon';\nimport publicConditionReducer from './publicCondition';\nimport generalReducer from './general';\nimport { General } from '../states/general';\nimport { PublicConditionState } from '../states/publicConditionState';\n\nconst rootReducer = (history: History) => combineReducers({\n  general: generalReducer,\n  condition: conditionReducer,\n  publicCondition: publicConditionReducer,\n  router: connectRouter(history),\n})\n\nexport interface State {\n  general: General,\n  condition: ConditionState,\n  publicCondition: PublicConditionState,\n  router: RouterState,\n}\n\nexport default rootReducer;\n","import { createBrowserHistory } from 'history';\nimport { applyMiddleware, createStore, compose } from 'redux';\nimport createSagaMiddleware from 'redux-saga';\nimport { routerMiddleware } from 'connected-react-router'\nimport createRootReducer from './reducers'\n\nexport const history = createBrowserHistory();\nexport const sagaMiddleware = createSagaMiddleware();\n\nexport default function configureStore(preloadedState?: any) {\n  const composeEnhancer: typeof compose = (window as any).__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose\n  const store = createStore(\n    createRootReducer(history), // root reducer with router state\n    preloadedState,\n    composeEnhancer(\n      applyMiddleware(\n        routerMiddleware(history),\n        sagaMiddleware,\n      ),\n    ),\n  )\n\n  // Hot reloading\n  if (module.hot) {\n    // Enable Webpack hot module replacement for reducers\n    module.hot.accept('./reducers', () => {\n      store.replaceReducer(createRootReducer(history));\n    });\n  }\n\n  return store;\n}\n\n","import { useEffect } from \"react\";\nimport { useLocation } from \"react-router-dom\";\n\n/** スクロール位置をリセットするためのコンポーネント。 */\nexport default function ScrollToTop() {\n  const { pathname } = useLocation();\n\n  useEffect(() => {\n    window.scrollTo(0, 0);\n  }, [pathname]);\n\n  return null;\n}\n","/** サーバー環境の種別に関する処理のクラス。 */\nexport default class Environment {\n  /** 本番環境の場合に設定する環境変数の値。 */\n  static readonly PRODUCTION = \"master\";\n  /** ステージング環境の場合に設定する環境変数の値。 */\n  static readonly STAGING = \"stage\";\n  /** 開発環境の場合に設定する環境変数の値。 */\n  static readonly DEV = \"dev\";\n  /** 一般開放で空港グループのチェックができる環境 */\n  static readonly CHECK_AIRPORT_GROUP = 'check_airport_group';\n  /** 一般開放でバックエンドのdevを叩く環境 */\n  static readonly BACKEND_DEV = 'backend_dev';\n  /**\n   * 本番環境であるかを判別する。\n   * @param env 実行環境を識別するために設定している環境変数。\n   * */\n  static isProduction(env: string) {\n    return env === Environment.PRODUCTION;\n  }\n  /**\n   * ステージング環境であるかを判別する。\n   * @param env 実行環境を識別するために設定している環境変数。\n   * */\n  static isStaging(env: string) {\n    return env === Environment.STAGING;\n  }\n  /**\n   * 開発環境であるかを判別する。\n   * @param env 実行環境を識別するために設定している環境変数。\n   */\n  static isDev(env: string) {\n    const devEnvList = [Environment.DEV, Environment.CHECK_AIRPORT_GROUP, Environment.BACKEND_DEV];\n    return devEnvList.includes(env);\n  }\n  /**\n   * 空港グループの確認環境かを判定\n   * @param env 実行環境を識別するために設定している環境変数。\n   */\n  static isCheckAirportGroup(env: string) {\n    return env === Environment.CHECK_AIRPORT_GROUP;\n  }\n  /**\n   * バックエンドの環境について\n   * @param env 実行環境を識別するために設定している環境変数。\n   */\n  static isBackendEnv() {\n    return (process.env['REACT_APP_BACKEND_ENV'] || Environment.STAGING);\n  }\n  /**\n   * ステージング環境か本番環境かを判別する。\n   * @param env 実行環境を識別するために設定している環境変数。\n   */\n  static isUpperStaging(env: string) {\n    return Environment.isProduction(env) || Environment.isStaging(env);\n  }\n  /**\n   * strging型よりEnvironment型に変換する\n   * @param env 現在の環境()\n   * @returns\n   */\n  static getEnvironmentType(env: string = (process.env['REACT_APP_STAGE_ENV'] || 'dev')) {\n    if(Environment.isProduction(env)) {\n      return Environment.PRODUCTION;\n    }\n    if(Environment.isStaging(env)) {\n      return Environment.STAGING;\n    }\n    return Environment.DEV;\n  }\n  /**\n   * UniversalMaaSModeかを判定する\n   */\n  static getIsUniversalMaaSMode(isLikeProdEnv?: any): boolean {\n    // 環境変数よりUniversalMaaSModeかを判別する\n    const isUniversalMaaSMode: string = (process.env['REACT_APP_IS_UNIVERSAL_MAAS_MODE'] || 'false')\n    // TODO: 本番反映前に削除したほうが良いかも\n    // POC環境でも疑似的に本番環境のように振る舞わせる\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev' && isLikeProdEnv === 'true') {\n      return false;\n    }\n    return isUniversalMaaSMode.toLowerCase() === 'true';\n  }\n}\n","import axios from 'axios';\nimport Environment from '../../../utils/environment';\nimport { GetReservationParams } from './GetReservationParams';\n\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: process.env['REACT_APP_API_ENDPOINT'] as string,\n  timeout: 7000,\n};\n\n/** 予約情報参照用のAPIを呼び出す。 */\nexport async function getReservation(params: GetReservationParams) {\n  try {\n    const config = {\n      ...DEFAULT_API_CONFIG,\n    };\n    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n    /** axiosのインスタンス。 */\n    const instance = axios.create(config);\n    /** 本予約APIのパス。 */\n    const path = setPath();\n    // 本予約APIにPOSTメソッドでリクエストする。\n    return await instance.post(path, {...params});\n  } catch (err) {\n    // エラーが発生した場合、nullを返す。\n    return null;\n  }\n}\n\n/** 環境に応じて呼び出すAPIのパスを切り替える。 */\nfunction setPath() {\n  return setTaxiEndpoint('get-reservation-info');\n}\n\nexport function setTaxiEndpoint(path: string) {\n  // 環境に応じてパスを切り替える。\n  switch(Environment.getEnvironmentType()) {\n    // 本番環境の場合。\n    case Environment.PRODUCTION:\n      return `/taxi/${path}`;\n    // ステージング環境の場合。\n    case Environment.STAGING:\n      return `/taxi/staging/${path}`;\n    // 開発環境または未設定の場合。\n    case Environment.DEV:\n    default:\n      return `/taxi/development/${path}`;\n  }\n}","import axios from \"axios\";\nimport { TaxiCompanyList } from \"../GetDirectionAndFare/models/getFareSamplesParams\";\nimport { setTaxiEndpoint } from \"../GetReservation\";\nimport { TaxiCompanyConfigurations } from \"./model/taxiCompanyConf\";\n\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: process.env['REACT_APP_API_ENDPOINT'] as string,\n  timeout: 60000,\n};\n\nexport enum ComponentKey {\n  pulldown = 'pulldown'\n}\n\nexport interface GetTaxiCompanyConfParams {\n  key?: string,\n  companyCode?: TaxiCompanyList,\n  componentKey?: ComponentKey,\n  id?: string,\n  language: string\n}\n\n/** タクシー会社のメタ情報取得APIを呼び出す */\nexport async function getTaxiCompanyConfiguration(params: GetTaxiCompanyConfParams) {\n  const path = setTaxiEndpoint('get-configuration');\n  const config = {\n    ...DEFAULT_API_CONFIG,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  /** axiosのインスタンス。 */\n  const instance = axios.create(config);\n  const response = await instance.get(path, {\n    params: params\n  });\n  let reseponseBody: TaxiCompanyConfigurations | null = null;\n  // Response結果が正常ならデータを返す\n  if(response.status === 200 && response.data) {\n    reseponseBody = response.data;\n  }\n  else {\n    // エラーが発生した場合は、debugレベルでエラーログを出力するのみとする。\n    // dev環境のみエラーログを出力\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n      console.error(response);\n    }\n  }\n  return {\n    type: 'getTaxiCompanyConfiguration',\n    body: reseponseBody\n  }\n}\n","import React from 'react';\nimport { CircularProgress, createStyles, Grid, makeStyles, Modal } from '@material-ui/core';\n\nconst useStyles = makeStyles((theme) =>\n  createStyles({\n    paper: {\n      position: 'absolute',\n      width: 100,\n      backgroundColor: theme.palette.background.paper,\n      boxShadow: theme.shadows[5],\n      padding: theme.spacing(2, 4, 3),\n      left: \"50%\",\n      top: \"50%\",\n      transform: \"translate(-50%, -50%)\",\n    },\n  }),\n);\n\ninterface Props {\n  isLoading: boolean\n}\n\n/** 処理の実行中であることを表すアイコン(ぐるぐるアイコン)のコンポーネント。 */\nconst LoadingModal: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n\n  return (\n    // Modalコンポーネントの「disableAutoFocus」「disableEnforceFocus」の2オプションを設定していない場合、\n    // 選択状態の青枠が表示されてしまうためオプションを設定している。\n    <Modal open={props.isLoading} disableAutoFocus disableEnforceFocus>\n      <div className={classes.paper}>\n        <Grid container justify='center' alignContent='center'>\n          <Grid item>\n            <CircularProgress color='primary' size={72}/>\n          </Grid>\n        </Grid>\n      </div>\n    </Modal>\n  )\n}\n\nexport default LoadingModal;\n","// 正規表現を使った処理をまとめたファイル。\n/**\n * 全角カナのみの文字列であるかを判別する。\n * @param value チェックしたい文字列。\n */\nexport function isFullWidthKana(value: string) {\n  const FULL_WIDTH_KANA = RegExp(\"^[ァ-ヶ]+$\");\n  return FULL_WIDTH_KANA.test(value);\n}\n\n/**\n * 数字のみの文字列であるかを判別する。\n * @param value チェックしたい文字列。\n */\nexport function isNumber(value: string) {\n  const NUMBER = RegExp(\"^[0-9]+$\");\n  return NUMBER.test(value);\n}\n\nexport function isACMNumber(value: string) {\n  const ACM_NUMBER_CHECK = RegExp(/^\\d{10}$/)\n  return ACM_NUMBER_CHECK.test(value);\n}\n\n/**\n * メールアドレスの形式となっている文字列であるかを判別する。\n * @param value チェックしたい文字列。\n */\nexport function isEmail(value: string) {\n  const EMAIL = RegExp(\"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:.[a-zA-Z0-9-]+)*$\");\n  return EMAIL.test(value);\n}\n\n/**\n * 文字のみの(空白や絵文字、記号などを含まない)文字列であるかを判別する。\n * @param value チェックしたい文字列。\n */\nexport function isLetter(value: string) {\n  const LETTER = RegExp(/^(\\p{Script=Hiragana}|\\p{Script_Extensions=Katakana}|\\p{Script_Extensions=Han}|[a-zA-Za-zA-Z])+$/u);\n  return LETTER.test(value);\n}\n\n/**\n * 文字と空白のみの(絵文字や記号などを含まない)文字列であるかを判別する。\n * 2021/10/18現在:使用なし\n * @param value チェックしたい文字列。\n */\nexport function isLetterWithSpace(value: string) {\n  // eslint-disable-next-line no-irregular-whitespace\n  const FULL_NAME_REGEX = /^(\\p{Script=Hiragana}|\\p{Script_Extensions=Katakana}|\\p{Script_Extensions=Han}|[a-zA-Za-zA-Z0-90-9])+[ | ]?(\\p{Script=Hiragana}|\\p{Script_Extensions=Katakana}|\\p{Script_Extensions=Han}|[a-zA-Za-zA-Z0-90-9])+$/u;\n  return FULL_NAME_REGEX.test(value);\n}\n","import Environment from \"../../utils/environment\";\nimport Cookies from 'js-cookie';\n\n/** \n * SCクリック(ANAさん側で集計するAdobe Analyticsでの記録)の処理。\n * (主に広告バナーや連携ボタンのクリック時の計測のために利用する。)\n * @param name クリック名。(集計時に識別するための名称。ANAさんから指定してもらう値。)\n * */\nexport default function scClick(name: string) {\n  /** 環境変数で指定された環境種別を識別するための値。 */\n  const stageEnv = process.env['REACT_APP_STAGE_ENV'];\n  // 環境変数「REACT_APP_STAGE_ENV」が設定されている、かつ、\n  // その値に本番環境のものが設定されている場合のみSCクリックを実行する。\n  if (stageEnv && Environment.isProduction(stageEnv)) {\n    try {\n      window.SCClick(name);\n    }\n    catch(e) {\n      console.error(e);\n    }\n  }\n  else {\n    console.log(`SCClick: ${name}`);\n    const cookieKey = 'ana_airport_access_debug_scclick';\n    // デバッグ用のCookieを入れ込めます\n    Cookies.set(cookieKey, name);\n  }\n  return null;\n}\n","import axios from 'axios';\nimport { setTaxiEndpoint } from '../GetReservation';\nimport { ReservationParams } from './ReservationParams';\n\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: process.env['REACT_APP_API_ENDPOINT'] as string,\n  timeout: 60000,\n};\n\n/** 本予約APIを呼び出す。 */\nexport async function submitReservation(params: ReservationParams) {\n  try {\n    const config = {\n      ...DEFAULT_API_CONFIG,\n    };\n    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n    /** axiosのインスタンス。 */\n    const instance = axios.create(config);\n    /** 本予約APIのパス。 */\n    const path = await setPath();\n    // 本予約APIにPOSTメソッドでリクエストする。\n    return await instance.post(path, {...params});\n  } catch (err) {\n    // エラーが発生した場合、nullを返す。\n    return null;\n  }\n}\n\n/** 環境に応じて呼び出すAPIのパスを切り替える。 */\nasync function setPath() {\n  return setTaxiEndpoint('submit-reservation');\n}\n","import * as React from 'react';\nimport { makeStyles, Typography } from '@material-ui/core';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    textAlign: \"center\",\n    backgroundColor: \"#ffffff\",\n    padding: \"5px\",\n    border: \"solid 1px #000\",\n    borderRadius: \"5px\",\n    marginTop: \"10px\"\n  },\n}));\n\nexport interface Props {\n  /** 距離・時間・金額部分のラベル。 */\n  label: string | JSX.Element,\n}\n\n/** 予約ページのコスト(距離・時間・金額)表示部分のコンポーネント。 */\nconst Cost: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  return (\n    <div className={classes.root}>\n      {/* 赤字で表示する。 */}\n      <Typography color='error' component='span'>\n        { props.label }\n      </Typography>\n    </div>\n  );\n}\n\nexport default Cost;\n","import * as React from 'react';\nimport { makeStyles } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport { AlertLabel } from '../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport PickupPattern from '../../AirportTransferTaxi/TemporaryReservation/Form/PickupPattern';\nimport { useTranslation } from 'react-i18next';\nimport { TFunction } from 'i18next';\n\nexport interface Props {\n  /** 警告の種別。 */\n  type?: \"retry\" | \"email\" | \"input\" | \"fail\" | \"address\" | \"unselected\" | \"retry_with_v2\",\n  /** 任意の警告メッセージを表示する */\n  anyMessage?: AlertLabel[],\n  pickupPattern?: PickupPattern\n}\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    marginTop: \"10px\"\n  },\n  notice: {\n    marginTop: \"10px\",\n    color: '#ff0000'\n  }\n}));\n\n/** 警告の重要度を設定する。 */\nfunction setSeverity(type: string) {\n  switch(type) {\n    // 再実行を促す警告の場合、黄色(warning)を設定する。\n    case \"retry\":\n      return \"warning\"\n    // メールアドレスが利用できない場合/予約に失敗した場合/その他エラーの場合は赤色(error)を設定する。\n    case \"email\":\n    case \"input\":\n    case \"fail\":\n    default:\n      return \"error\";\n  }\n}\n\n/**\n * 警告で表示するメッセージを設定する。\n * @param type 警告の種別。\n */\nfunction setMessage(type: string, t: TFunction, pickupPattern?: PickupPattern) {\n  switch(type) {\n    case \"address\":\n      //const trasTypeStr = pickupPattern === PickupPattern.FROM_AIRPORT? t('taxi:sending_location'): t('taxi:pickup_location');\n      return t('taxi:alert_message_address');\n    case \"unselected\":\n      return t('taxi:alert_message_unselected');\n    case \"retry\":\n      return t('taxi:alert_message_retry');\n    case \"email\":\n      return t('taxi:alert_message_email');\n    case \"input\":\n      return t('taxi:alert_message_input');\n    case \"retry_with_v2\":\n      return t('taxi:alert_message_retry_with_v2');\n    case \"fail\":\n    default:\n      return t('taxi:alert_message_fail');\n  }\n}\n\n/** タクシー予約時の警告メッセージ用のコンポーネント。 */\nconst AlertInReservation: React.FC<Props> = (props: Props) => {\n  const { t } = useTranslation();\n  const classes = useStyles();\n\n  let severity: any = \"warning\";\n  if(props.type) {\n    /** 警告の重要度。(この値に応じて警告の色・アイコンが変わる。) */\n    severity = setSeverity(props.type);\n    /** 警告で表示するメッセージ。 */\n    const message = setMessage(props.type, t,props.pickupPattern);\n    return (\n      <Alert severity={severity} className={classes.root}>\n        { message }\n      </Alert>\n    );\n  }\n  else if(props.anyMessage) {\n    /** 任意の警告メッセージが復数ある場合には全てを表示する */\n    return (\n      <>\n        {props.anyMessage.map((label, index)=>{\n          if(label.type === 'alert') {\n            return (\n              <Alert severity={severity} className={classes.root} key={index}>\n                { label.message }\n              </Alert>\n            )\n          }\n          else {\n            return (\n              <div className={classes.notice} key={index}>\n                ※ { label.message }\n              </div>\n            )\n          }\n        })}\n      </>\n    )\n  }\n  return null;\n}\n\nexport default AlertInReservation;\n","import { AlertLabel } from \"../GetDirectionAndFare/models/getFareSamplesParams\";\n\n/** 予約情報参照APIから取得したレスポンスのインターフェース。 */\nexport interface ReservationResponse {\n  /** 搭乗便の情報。 */\n  flight: Flight;\n  /** 出発地名称。 */\n  originLabel: string;\n  /** 出発地座標。 */\n  originLatLng: string;\n  /** 到着地名称。 */\n  destLabel: string;\n  /** 到着地座標。 */\n  destLatLng: string;\n  /** 搭乗日。 */\n  date: string;\n  /** 連携タクシー会社名コード。 */\n  companyCode: string;\n  /** 連携タクシー会社名。 */\n  companyName: string;\n  /** 出発便検索、または到着便検索を表す値。 */\n  operation: string;\n  /** お迎え日時(yyyyMMddHHmm形式)。 */\n  rideDatetime: string;\n  /** のりかえ情報(距離・所要時間・料金)。 */\n  transferInfo: TransferInfo;\n  /** 利用空港の情報。 */\n  airportInfo: AirportInfo;\n  /** 遷移元リファラー情報 */\n  referrer: string;\n  /** 庄内乗合タクシーにおいて連携される搭乗タクシーに対応するフライト情報 */\n  taxiConnectFlightNumber: string;\n}\n\n/** 搭乗便の情報。 */\ninterface Flight {\n  /** ANAまたはNHから始まる便番号。 */\n  number: string;\n  /** yyyyMMddHHmm形式の搭乗便の日時。 */\n  datetime: string;\n  /** datetimeが空港発の日時かを表すフラグ。 */\n  isDeparture: boolean;\n}\n\n/** のりかえ情報(距離・所要時間・料金)。 */\ninterface TransferInfo {\n  /** 発着地と空港の距離(単位:[m])。 */\n  distance: number,\n  /** 発着地と空港間の所要時間(単位:[分])。 */\n  timeRequired: number,\n  /** タリフが固定か */\n  tariffConfirmed: boolean;\n  /** タリフが変動する際に紐づくKey */\n  tariffTypes: string;\n  /** 料金情報。 */\n  fare?: ReservationFare;\n  /** ラベル情報 */\n  labels?: ReservationLabels,\n  /** タリフ情報 */\n  tariffs?: {\n    [key: string]: {\n      /** 料金情報。 */\n      fare: ReservationFare,\n      /** ラベル情報 */\n      labels: ReservationLabels\n    }\n  }\n}\n\n/** ラベル情報 */\nexport interface ReservationLabels {\n  /** 料金ラベル */\n  fareLabel: string,\n  /** 距離ラベル */\n  distanceLabel: string,\n  /** 所要時間ラベル */\n  durationLabel: string,\n  /** アラートラベル */\n  alertLabel: AlertLabel[],\n}\n\n/** 料金情報。 */\nexport interface ReservationFare {\n  fareType: string,\n  /** 金額(単位:[円])。 */\n  value: number,\n  /** 運賃の種別。 */\n  priceType: \"fixed\" | \"ask\" | \"outOfService\" | \"PAYG\" | \"error\",\n  /** 迎車料金の有無. true時のみ存在. 省略時はfalse. */\n  hasPickupFee?: boolean,\n  /** 迎車料金. hasPickupFee=trueのときのみ存在。 */\n  pickupFee?: number,\n  /** 迎車料金が必要な条件情報。 */\n  pickupFeeRequirement?: string,\n  /** 付加情報。 */\n  additionalInfo?: string;\n  /** 備考ラベル */\n  notesLabel: string[]\n}\n\n/** 利用空港の情報。 */\ninterface AirportInfo {\n  type: 'destination' | 'origin',\n  letter: string,\n}\n\nexport const defaultReservationLabels: ReservationLabels = {\n  fareLabel: '',\n  distanceLabel: '',\n  durationLabel: '',\n  alertLabel: []\n}\n\nexport const defaultReservationFare: ReservationFare = {\n  fareType: '',\n  /** 金額(単位:[円])。 */\n  value: 0,\n  /** 運賃の種別。 */\n  priceType: \"error\",\n  /** 備考ラベル */\n  notesLabel: []\n}","import React from 'react';\nimport { MenuItem, Select, makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    height: '1rem',\n    width: '3.0rem',\n    fontSize: '0.75rem'\n  },\n}));\n\ninterface Props {\n  value: number,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\n/** 子供の人数選択のコンポーネント。 */\nexport const SelectChildrenNum: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  /** 子供の人数(0~20までの数値)の値の配列。 */\n  const numbers = Array.from(Array(21).keys())\n\n  return (\n    <Select\n      className={classes.root}\n      SelectDisplayProps={{\n        style: {\n          padding: '10px'\n        }\n      }}\n      onChange={props.onChange}\n      value={props.value}\n    >\n      {\n        numbers.map((n) => {\n          return <MenuItem value={n} key={`children_${n}`}>{n}</MenuItem>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectChildrenNum;\n","import React from 'react';\nimport { MenuItem, Select, makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    height: '1rem',\n    width: '3.0rem',\n    fontSize: '0.75rem'\n  },\n}));\n\ninterface Props {\n  value: number,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\n/** 大人の人数選択のコンポーネント。 */\nexport const SelectAdultNum: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  /** 大人の人数の値(1~20までの数値)の配列。 */\n  const numbers = Array.from({length: 20}, (_, i) => i + 1);\n\n  return (\n    <Select\n      className={classes.root}\n      SelectDisplayProps={{\n        style: {\n          padding: '10px'\n        }\n      }}\n      onChange={props.onChange}\n      value={props.value}\n    >\n      {\n        numbers.map((n) => {\n          return <MenuItem value={n} key={`adult_${n}`}>{n}</MenuItem>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectAdultNum;\n","import React from 'react';\nimport { MenuItem, Select, makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    height: '1rem',\n    width: '3.0rem',\n    fontSize: '0.75rem'\n  },\n}));\n\ninterface Props {\n  value: number,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\n/** タクシーの台数選択のコンポーネント。 */\nexport const SelectCarNum: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  /** タクシーの台数の値(1~20までの数値)の配列。 */\n  const numbers = Array.from({length: 20}, (_, i) => i + 1);\n\n  return (\n    <Select\n      className={classes.root}\n      SelectDisplayProps={{\n        style: {\n          padding: '10px'\n        }\n      }}\n      onChange={props.onChange}\n      value={props.value}\n    >\n      {\n        numbers.map((n) => {\n          return <MenuItem value={n} key={`car_num_${n}`}>{n}</MenuItem>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectCarNum;\n","import React from 'react';\nimport { MenuItem, Select, makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    height: '1rem',\n    width: '3.0rem',\n    fontSize: '0.75rem'\n  },\n}));\n\ninterface Props {\n  value: number,\n  maxOtherBag: number,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\n/** その他荷物(※車椅子など)の個数選択のコンポーネント。 */\nexport const SelectOtherBag: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  /** その他荷物(※車椅子など)の個数(0~Xまでの数値)の値の配列。 */\n  const numbers = Array.from(Array(props.maxOtherBag+1).keys())\n\n  return (\n    <Select\n      className={classes.root}\n      SelectDisplayProps={{\n        style: {\n          padding: '10px'\n        }\n      }}\n      onChange={props.onChange}\n      value={props.value}\n    >\n      {\n        numbers.map((n) => {\n          return <MenuItem value={n} key={`otherbag_${n}`}>{n}</MenuItem>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectOtherBag;\n","import React from 'react';\nimport { MenuItem, Select, makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    height: '1rem',\n    width: '3.0rem',\n    fontSize: '0.75rem'\n  },\n}));\n\ninterface Props {\n  value: number,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n  maxNum: number,\n}\n\n/** スーツケースの個数選択のコンポーネント。 */\nexport const SelectSuitcase: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  /** スーツケースの個数(0からタクシー台数に応じた最大数までの数値)の値の配列。 */\n  const numbers = Array.from(Array(props.maxNum + 1).keys());\n\n  return (\n    <Select\n      className={classes.root}\n      SelectDisplayProps={{\n        style: {\n          padding: '10px'\n        }\n      }}\n      onChange={props.onChange}\n      value={props.value}\n    >\n      {\n        numbers.map((n) => {\n          return <MenuItem value={n} key={`suitcase_${n}`}>{n}</MenuItem>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectSuitcase;\n","import React from 'react';\nimport { MenuItem, Select, makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(() => ({\n  root: {\n    height: '1rem',\n    width: '3.0rem',\n    fontSize: '0.75rem'\n  },\n}));\n\ninterface Props {\n  value: number,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n  maxNum: number,\n}\n\n/** ゴルフバッグの個数選択のコンポーネント。 */\nexport const SelectGolfBag: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  /** ゴルフバッグの個数(0からタクシー台数に応じた最大数までの数値)の値の配列。 */\n  const numbers = Array.from(Array(props.maxNum + 1).keys());\n\n  return (\n    <Select\n      className={classes.root}\n      SelectDisplayProps={{\n        style: {\n          padding: '10px'\n        }\n      }}\n      onChange={props.onChange}\n      value={props.value}\n    >\n      {\n        numbers.map((n) => {\n          return <MenuItem value={n} key={`golfbag_${n}`}>{n}</MenuItem>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectGolfBag;\n","import React from 'react';\nimport { useSelector } from 'react-redux';\nimport { State } from '../../reducers';\nimport { CircularProgress, createStyles, Grid, makeStyles, Modal, Theme } from '@material-ui/core';\n\nconst useStyles = makeStyles((theme: Theme) =>\n  createStyles({\n    paper: {\n      position: 'absolute',\n      width: 100,\n      backgroundColor: theme.palette.background.paper,\n      boxShadow: theme.shadows[5],\n      padding: theme.spacing(2, 4, 3),\n      left: \"50%\",\n      top: \"50%\",\n      transform: \"translate(-50%, -50%)\",\n    },\n  }),\n);\n\n/** 検索画面で検索処理の実行中であることを表すアイコン(ぐるぐるアイコン)のコンポーネント。 */\nconst LoadingModal: React.FC = () => {\n  const classes = useStyles();\n  /** 検索処理中であるかを表すフラグ。 */\n  const isLoading = useSelector((state: State) => state.general.isLoading);\n\n  return (\n    // Modalコンポーネントの「disableAutoFocus」「disableEnforceFocus」の2オプションを設定していない場合、\n    // 選択状態の青枠が表示されてしまうためオプションを設定している。\n    <Modal open={isLoading} disableAutoFocus disableEnforceFocus>\n      <div className={classes.paper}>\n        <Grid container justify='center' alignContent='center'>\n          <Grid item>\n            <CircularProgress color='primary' size={72}/>\n          </Grid>\n        </Grid>\n      </div>\n    </Modal>\n  )\n}\n\nexport default LoadingModal;\n","import { PlaceDirections } from \"../../../google/PlaceDirections\";\n\nexport enum TaxiCompanyList {\n  /** イースタン交通 */\n  limoTaxi = 'limoTaxi',\n  eastern = 'eastern',\n  /** 宮交タクシー */\n  miyakou = 'miyakou',\n  /** 宇部山電タクシー */\n  ubeSanden = 'ubeSanden',\n  /** 那覇ハイヤー */\n  nahahire = 'nahahire',\n  /** 日ノ丸ハイヤー */\n  hinomaru = 'hinomaru',\n  /** 南国タクシー */\n  nangoku = 'nangoku',\n  /** 伊予鉄タクシー */\n  iyotetsutaxi = 'iyotetsutaxi',\n  /** 伊予鉄タクシー(メーター料金) */\n  iyotetsuTaxi2 = 'iyotetsuTaxi2',\n  /** 大分別府合同タクシー */\n  gotaku = 'gotaku',\n  /** 旭川中央タクシー */\n  Asahikawachuuo = 'Asahikawachuuo',\n  /** 函館タクシー */\n  hakodateTaxi = 'hakodateTaxi',\n  /** 大和自動車交通 */\n  daiwaj = 'daiwaj',\n  /** 北福島タクシー */\n  kitafukushima = 'kitafukushima',\n  /** 中央タクシー */\n  fukushimachuo = 'fukushimachuo',\n  /** 磐城タクシー */\n  iwakiTaxi = 'iwakiTaxi',\n  /** 内郷タクシー */\n  'uchi-go' = 'uchi-go',\n  /** 田島タクシー */\n  tajimaTaxi = 'tajimaTaxi',\n  /** 鬼怒川タクシー */\n  kinugawaTaxi = 'kinugawaTaxi',\n  /** 北斗交通 */\n  hokutocab = 'hokutocab',\n  /** 陽東タクシー */\n  yotoTaxi = 'yotoTaxi',\n  /** キングタクシー */\n  kingTaxi = 'kingTaxi',\n  /** 土電タクシー */\n  toden = 'toden',\n  /** 石川交通 */\n  ishikawakotsu = 'ishikawakotsu',\n  /** キングタクシー(メーター料金) */\n  kingTaxi2 = 'kingTaxi2',\n  /** 宇部構内タクシー */\n  ubeKounai = 'ubeKounai',\n  /** 通津タクシー */\n  tsuzutaxi = 'tsuzutaxi',\n  /** 酒田タクシー */\n  sakataNo1Taxi = 'sakataNo1Taxi',\n  /** 庄交ハイヤー */\n  shokoHire = 'shokoHire',\n  /** 秋田エアポートライナー */\n  airport_liner = 'airport_liner',\n  /** にかほGO */\n  nikaho_go = 'nikaho_go',\n  /** 検証用ダミータクシー会社 */\n  dummyVal = 'dummyVal'\n};\n\n// 文字列から TaxiCompanyList に変換する\nexport const convertStringToTaxiCompany = ((companyString: string)=>{\n  switch(companyString) {\n    case TaxiCompanyList.limoTaxi:\n      return TaxiCompanyList.limoTaxi;\n    case TaxiCompanyList.eastern:\n      return TaxiCompanyList.eastern;\n    case TaxiCompanyList.miyakou:\n      return TaxiCompanyList.miyakou;\n    case TaxiCompanyList.ubeSanden:\n      return TaxiCompanyList.ubeSanden;\n    case TaxiCompanyList.nahahire:\n      return TaxiCompanyList.nahahire;\n    case TaxiCompanyList.hinomaru:\n      return TaxiCompanyList.hinomaru;\n    case TaxiCompanyList.nangoku:\n      return TaxiCompanyList.nangoku;\n    case TaxiCompanyList.iyotetsutaxi:\n      return TaxiCompanyList.iyotetsutaxi;\n    case TaxiCompanyList.iyotetsuTaxi2:\n      return TaxiCompanyList.iyotetsuTaxi2;\n    case TaxiCompanyList.gotaku:\n      return TaxiCompanyList.gotaku;\n    case TaxiCompanyList.Asahikawachuuo:\n      return TaxiCompanyList.Asahikawachuuo;\n    case TaxiCompanyList.hakodateTaxi:\n      return TaxiCompanyList.hakodateTaxi;\n    case TaxiCompanyList.daiwaj:\n      return TaxiCompanyList.daiwaj;\n    case TaxiCompanyList.kitafukushima:\n      return TaxiCompanyList.kitafukushima;\n    case TaxiCompanyList.fukushimachuo:\n      return TaxiCompanyList.fukushimachuo;\n    case TaxiCompanyList.iwakiTaxi:\n      return TaxiCompanyList.iwakiTaxi;\n    case TaxiCompanyList['uchi-go']:\n      return TaxiCompanyList['uchi-go'];\n    case TaxiCompanyList.tajimaTaxi:\n      return TaxiCompanyList.tajimaTaxi;\n    case TaxiCompanyList.kinugawaTaxi:\n      return TaxiCompanyList.kinugawaTaxi;\n    case TaxiCompanyList.hokutocab:\n      return TaxiCompanyList.hokutocab;\n    case TaxiCompanyList.yotoTaxi:\n      return TaxiCompanyList.yotoTaxi;\n    case TaxiCompanyList.kingTaxi:\n      return TaxiCompanyList.kingTaxi;\n    case TaxiCompanyList.toden:\n      return TaxiCompanyList.toden;\n    case TaxiCompanyList.ishikawakotsu:\n      return TaxiCompanyList.ishikawakotsu;\n    case TaxiCompanyList.dummyVal:\n      return TaxiCompanyList.dummyVal;\n    case TaxiCompanyList.tsuzutaxi:\n      return TaxiCompanyList.tsuzutaxi;\n    case TaxiCompanyList.kingTaxi2:\n      return TaxiCompanyList.kingTaxi2;\n    case TaxiCompanyList.ubeKounai:\n      return TaxiCompanyList.ubeKounai;\n    case TaxiCompanyList.sakataNo1Taxi:\n      return TaxiCompanyList.sakataNo1Taxi;\n    case TaxiCompanyList.shokoHire:\n      return TaxiCompanyList.shokoHire;\n    case TaxiCompanyList.airport_liner:\n      return TaxiCompanyList.airport_liner;\n    case TaxiCompanyList.nikaho_go:\n      return TaxiCompanyList.nikaho_go;\n    default:\n      return null;\n  }\n})\n\n/**\n * 指定した会社が福島タクシー群かを判定する\n * @param company 判定対象のタクシー会社\n * @returns 指定した会社が福島タクシー群かを\n */\nexport const isFukushimaTaxi = ((company: TaxiCompanyList) => {\n  const fukushimaTaxisList = [\n    TaxiCompanyList.daiwaj,\n    TaxiCompanyList.kitafukushima,\n    TaxiCompanyList.fukushimachuo,\n    TaxiCompanyList.iwakiTaxi,\n    TaxiCompanyList['uchi-go'],\n    TaxiCompanyList.tajimaTaxi,\n    TaxiCompanyList.kinugawaTaxi,\n    TaxiCompanyList.hokutocab,\n    TaxiCompanyList.yotoTaxi\n  ]\n  return fukushimaTaxisList.includes(company);\n})\n\nexport enum GetDirectionAndFareOperation {\n  pickup = 'pickup',\n  dropOff = 'dropOff'\n}\n\nexport enum FlightType {\n  // 国内線\n  domestic = 'domestic',\n  // 国際線\n  international = 'international'\n}\n\nexport interface PointInfo {\n  /** 表示用地点座標。乗車地であるか降車地であるかはoperationパラメータに依存する。 */\n  latLng: string,\n  /** 表示用地点名。乗車地であるか降車地であるかはoperationパラメータに依存する。 */\n  label: string,\n  /** 料金計算用地点座標。乗車地であるか降車地であるかはoperationパラメータに依存する。 */\n  latLngForPriceCalc: string,\n  /** 料金計算用地点名。乗車地であるか降車地であるかはoperationパラメータに依存する。タリフのマッチングは日本語で行うため、英語版でもここは必ず日本語住所が設定される */\n  labelForPriceCalc: string\n}\n\n/**\n * タクシー料金APIのリクエストパラメーターの共通部分\n */\ninterface CommonTaxiAPIParams {\n  // ユーザー指定地点情報\n  pointInfo?: PointInfo,\n  // 空港コード\n  airportLetter: string,\n  // 出発案内か\n  operation: GetDirectionAndFareOperation,\n  // 補助値\n  mode?: string,\n  // 補助値\n  modeValue?: string,\n  // 国内・国際の区別\n  flightType?: FlightType,\n  // ターミナル情報\n  terminal?: string,\n  // 乗降口\n  gate?: string,\n}\n\n/**\n * 仮予約画面にて使用するタクシー料金APIのリクエストパラメーター\n */\nexport interface GetDirectionAndFareParams extends CommonTaxiAPIParams {\n  // 事業者コード\n  companyCode: TaxiCompanyList,\n  // 乗車日時:yyyyMMddhhmm 形式\n  rideDatetime: string,\n  // 言語情報\n  language: string\n}\n\n/**\n * 経路検索画面にて使用するタクシー料金APIのリクエストパラメーター\n */\nexport interface GetDirectionAndFareSamplesParams extends CommonTaxiAPIParams {\n  // 結果にGoogle Directions APIのpolylineを付与するかどうか\n  needPolyline: boolean,\n  // 乗車日時: unixtime\n  datetimeAtAirport: number,\n  // 言語情報\n  language: string\n}\n\n/**\n * 経路検索結果画面でのResponseFormat\n */\nexport interface GetDirectionAndFareSamplesResponse {\n  routeInfo: RouteInfo;\n  existMatchedCompany: boolean,\n  fareSummaries: TaxiFareSummary[],\n  directionsApiResponse: PlaceDirections\n}\n\nexport interface RouteInfo {\n  /** 距離ラベル */\n  distanceLabel: string,\n  /** 所要時間ラベル */\n  durationLabel: string,\n  /** 距離(m) */\n  distanceValue: number,\n  /** 所要時間(s) */\n  durationValue: number\n}\n\nexport interface TaxiFareSummary {\n  mode: string;\n  companyCode: TaxiCompanyList,\n  fareInfo: GetDirectionAndFareResponse\n}\n\n/**\n * 仮予約画面で使用するタクシー料金APIのResponse\n */\nexport interface GetDirectionAndFareResponse {\n  status: string,\n  notesLabel: string[],\n  alertLabel: AlertLabel[],\n  fareType: string,\n  // 廃止予定\n  value: number,\n  // 廃止予定\n  totalValue: number,\n  // 廃止予定\n  distance: number,\n  // 廃止予定\n  duration: number,\n  fareLabel: string,\n  distanceLabel: string,\n  durationLabel: string,\n  timePattern?: string[],\n  flightPattern?: string[]\n}\n\nexport interface AlertLabel {\n  type: string,\n  message: string\n}\n","import React from 'react';\nimport { Link, useTheme } from '@material-ui/core';\nimport { TaxiCompanyList } from '../../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { useCautionStyles } from '../Cautions';\nimport DateTime from '../../../../../../utils/dateTime';\n\ninterface Props {\n  /** 仮予約画面で表示するタクシー会社名 */\n  companyDisplayName: string,\n  /** タクシー会社 */\n  company: TaxiCompanyList\n}\n\n/** AMCマイレージ番号に関する注意事項 */\nexport const AMCCautionJP: React.FC<Props> = (props: Props) => {\n  const theme = useTheme();\n  const classes = useCautionStyles(theme);\n\n  const taxiMileHumanVURL = \"https://www.ana.co.jp/ja/jp/amc/reference/tameru/traffic/human_v.html\";\n  const taxiMileHelpURL = \"https://www.ana.co.jp/ja/jp/site-help/share/contact/mileage_top.html\";\n\n  return (\n    <>\n      <span className={classes.bold}><マイルに関するご注意(必ずご確認ください)></span>\n      <ul className={classes.unorderedList} data-cy={\"booking_taxi_amccaution_jp\"}>\n        <li>\n          本画面にてANAマイレージクラブ会員お客様番号(10桁)をご入力後、{props.companyDisplayName}を予約・乗車・支払い完了された場合に、「200円(税込)につき1マイル」を積算いたします。それ以外の場合は、ご利用になられてもマイルは積算されません\n        </li>\n        {/** この1文は伊予鉄の場合のみ */}\n        { props.company === TaxiCompanyList.iyotetsutaxi &&\n          <li>\n            なお、「マイルがたまる!」ステッカーが貼ってあるタクシーにご乗車、かつ現金でのお支払いの場合、「100円(税込)につき1マイル」が別途積算されます。詳しくは<Link href={taxiMileHumanVURL} target=\"_blank\" className={classes.link}>こちら</Link>をご確認ください。\n          </li>\n        }\n        <li>\n          マイルはご利用後約1~2カ月後にお客様のマイル口座に積算されます。\n        </li>\n        <li>\n          ご予約成立後に予約をキャンセルされた場合は、マイルは積算されません。また、変更・取り消し手数料はマイル積算の対象外となります。\n        </li>\n        <li>\n          ご入力いただいたANAマイレージクラブ会員お客様番号とご名義人が異なる場合は、マイルは積算されません。\n        </li>\n        <li>\n          ご予約完了後のANAマイレージクラブ会員お客様番号の訂正、事後登録はお受けできませんので、お申し込みの際はご注意ください。\n        </li>\n        <li>\n          ANAマイレージクラブに関するお問い合わせは<Link href={taxiMileHelpURL} target=\"_blank\" className={classes.link}>こちら</Link>から。\n        </li>\n      </ul>\n    </>\n  )\n}\n\nexport default AMCCautionJP;\n","import React from 'react';\nimport { Link, useTheme } from '@material-ui/core';\nimport { TaxiCompanyList } from '../../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { useCautionStyles } from '../Cautions';\n\ninterface Props {\n  /** 仮予約画面で表示するタクシー会社名 */\n  companyDisplayName: string,\n  /** タクシー会社 */\n  company: TaxiCompanyList\n}\n\n/** AMCマイレージ番号に関する注意事項 */\nexport const AMCCautionEN: React.FC<Props> = (props: Props) => {\n  const theme = useTheme();\n  const classes = useCautionStyles(theme);\n\n  const taxiMileHelpURL = \"https://www.ana.co.jp/ja/jp/site-help/share/contact/mileage_top.html\";\n  return (\n    <>\n      <span className={classes.bold}>&lt; Notes on Miles (please make sure to confirm) &gt;</span>\n      <ul className={classes.unorderedList} data-cy={\"booking_taxi_amccaution_en\"}>\n        <li>\n          If you book, ride and complete payment with the limousine or taxi operating company after entering your 10-digit ANA Mileage Club membership number on this screen, one mile will be added to your mileage for every JPY 200 (including tax) paid. No miles will be added in other cases.\n        </li>\n        <li>\n          One mile will be added to your mileage separately for every JPY 200 (including tax) paid for payments made using an ANA card.\n        </li>\n        <li>\n          Approximately 1-2 months will be required for the miles to be credited to the mileage balance. The timing is different to the addition of miles due to payment with an ANA card.\n        </li>\n        <li>\n          If you cancel a booking after it has been confirmed, no miles will be added. In addition, change and cancellation processing fees are not subject to the addition of miles.\n        </li>\n        <li>\n          If the entered ANA Mileage Club membership number and name differ, no miles will be added.\n        </li>\n        <li>\n          Please be careful when making a booking as we are unable to accept corrections to an ANA Mileage Club membership number after a booking is confirmed or ex-post registrations.\n        </li>\n        <li>\n          For inquiries about the ANA Mileage Club, click <Link href={taxiMileHelpURL} target=\"_blank\" className={classes.link}>here</Link>.\n        </li>\n      </ul>\n    </>\n  )\n}\n\nexport default AMCCautionEN;\n","import React from 'react';\nimport { TaxiCompanyList } from '../../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { useTranslation } from 'react-i18next';\nimport AMCCautionJP from './jp';\nimport AMCCautionEN from './en';\n\ninterface Props {\n  /** 仮予約画面で表示するタクシー会社名 */\n  companyDisplayName: string,\n  /** タクシー会社 */\n  company: TaxiCompanyList\n}\n\n/** AMCマイレージ番号に関する注意事項 */\nexport const AMCCaution: React.FC<Props> = (props: Props) => {\n  const { i18n } = useTranslation();\n  switch(i18n.language) {\n    case 'en':\n      return (\n        <AMCCautionEN\n          companyDisplayName={props.companyDisplayName}\n          company={props.company}\n        />\n      )\n    case 'jp':\n    default:\n      return (\n        <AMCCautionJP\n          companyDisplayName={props.companyDisplayName}\n          company={props.company}\n        />\n      )\n  }\n}","import React from 'react';\nimport { useTheme } from '@material-ui/core';\nimport { TaxiCompanyList } from '../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { AMCCaution } from './AMCCaution';\nimport { useCautionStyles } from './Cautions';\n\ninterface Props {\n  isMeterFare: boolean,\n  /** 仮予約画面で表示するタクシー会社名 */\n  companyDisplayName: string,\n  /** AMCをサポートする事業者の場合 */\n  isSupportAMC?: boolean,\n  /** 本予約画面か */\n  isReservationPage?: boolean,\n  /** タクシー会社 */\n  company: TaxiCompanyList\n}\n\n/** ハイヤー・タクシー予約画面の注意事項のコンポーネント。 */\nexport const CautionsEn: React.FC<Props> = (props: Props) => {\n  const theme = useTheme();\n  const classes = useCautionStyles(theme);\n\n  return (\n    <div className={classes.root} data-cy=\"cautions-area\">\n      <span className={classes.bold}>&lt; Important points &gt;</span>\n      <ul className={classes.unorderedList}>\n        <li>\n          A booking is a direct contract between the limousine or taxi operating company and the customer.\n        </li>\n        <li className={classes.redFont}>\n          The information you entered will be provided to the limousine or taxi operating company. In addition, the email address entered on this screen will also be communicated to ANA for handling of inquiries, etc., but this information is usually deleted within one year.\n        </li>\n        {/** AMCサポート事業者の場合には文言を追加する。本予約画面のみ表示する */}\n        {props.isSupportAMC && props.isReservationPage &&\n          <li>\n            The ANA Mileage Club membership number (10 digits) entered on this screen will be communicated to ANA for Mileage settlement.\n          </li>\n        }\n        <li className={classes.redFont}>\n          Please note that a booking is not confirmed even when the booking request is complete. A booking is confirmed with the “Confirmation email” sent by the limousine or taxi operating company.\n        </li>\n        <li>\n          You are requested to verify your email address each time you make a booking.\n        </li>\n        <li>\n          A 100% cancellation fee will be charged for cancellation without notice and cancellation on the day of service.\n        </li>\n        <li>\n          No driver waiting fee at the airport will be charged due to a delayed flight and no cancellation fee will be charged if you are unable to use the service due to cancellation of your flight.\n          <br />\n          However, ANA will not communicate such information to the limousine or taxi operating company. Please contact the limousine or taxi operating company.\n        </li>\n        <li>\n          We cannot guarantee plane ticket reservations even if the service is not in time for your flight’s departure time due to a traffic jam, etc.\n        </li>\n        <li>\n          Please pay to the driver at point of service.\n        </li>\n        <li>\n          Stopovers to places other than your pick-up and drop-off location are not included. If you wish to make a stopover, please inquire with the limousine or taxi operating company.\n        </li>\n        {/* メーター料金の場合には注意書きを増やします */}\n        {props.isMeterFare &&\n          <li>\n            Taxi meter charges are approximate based on the assumed travel distance and may differ from actual charges due to the road situation, etc. In addition, expressway tolls, pick-up charges, waiting and stopping due to traffic lights or traffic jams, etc., have not been considered.&nbsp;\n            Charges will differ depending on taxi companies and regions so please consider these simply as reference amounts. Actual charges will be settled based on the meter at the time you ride.\n          </li>\n        }\n        {/** 南国タクシーかつ定額の場合には注意事項を追加する */}\n        {props.company === TaxiCompanyList.nangoku && !props.isMeterFare &&\n          <li>\n            {/* 高速道路などの有料道路通行料やフェリー代など定額料金から別途料金が発生する場合もございます。 */}\n          </li>\n        }\n        {/** 伊予鉄タクシーの場合には高速道路代金の注意事項を追加 */}\n        {props.company === TaxiCompanyList.iyotetsutaxi &&\n          <li>\n            {/* 料金には、目的地または出発地により「高速道路代金」が含まれております。詳しくは、「予約確定メール」にてご確認下さい。 */}\n          </li>\n        }\n      </ul>\n      {/** AMCをサポートしている場合にはAMCの注意事項を追加する */}\n      {props.isSupportAMC && props.isReservationPage &&\n        <AMCCaution\n          companyDisplayName={props.companyDisplayName}\n          company={props.company}\n        />\n      }\n    </div>\n  );\n}\n\nexport default CautionsEn;\n","import React from 'react';\nimport { useTheme } from '@material-ui/core';\nimport { TaxiCompanyList, isFukushimaTaxi } from '../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { AMCCaution } from './AMCCaution';\nimport { useCautionStyles } from './Cautions';\n\ninterface Props {\n  isMeterFare: boolean,\n  /** 仮予約画面で表示するタクシー会社名 */\n  companyDisplayName: string,\n  /** AMCをサポートする事業者の場合 */\n  isSupportAMC?: boolean,\n  /** 本予約画面か */\n  isReservationPage?: boolean,\n  /** タクシー会社 */\n  company: TaxiCompanyList\n}\n\n/** ハイヤー・タクシー予約画面の注意事項のコンポーネント。 */\nexport const CautionsJP: React.FC<Props> = (props: Props) => {\n  const theme = useTheme();\n  const classes = useCautionStyles(theme);\n  /** 福島タクシー群か */\n  const isFukushima = isFukushimaTaxi(props.company);\n  /** 立ち寄りが不可かの文言: 福島タクシー系列かキングタクシー以外の場合は可 */\n  const tachiyoriMessage = (() => {\n    /** 福島タクシー群・キングタクシーの場合のみ乗合タクシーのため立ち寄り不可と明言する */\n    if(isFukushima) {\n      return '指定いただいた乗車地・降車地以外の立ち寄りは出来ません。';\n    }\n    switch(props.company) {\n      case TaxiCompanyList.kingTaxi:\n      case TaxiCompanyList.sakataNo1Taxi:\n      case TaxiCompanyList.shokoHire:\n        return '指定いただいた乗車地・降車地以外の立ち寄りは出来ません。';\n      default:\n        /** それ以外のタクシー会社なら言えば出来るよみたいなニュアンスにする */\n        return `指定いただいた乗車地・降車地以外の立ち寄りは含まれておりません。`\n          + `立ち寄りを希望される場合には、お客様ご自身で${props.companyDisplayName}へお問い合わせください。`\n    }\n  })();\n\n  return (\n    <div className={classes.root} data-cy=\"cautions-area\">\n      <span className={classes.bold}><注意事項></span>\n      <ul className={classes.unorderedList}>\n        <li>\n          ご予約は{props.companyDisplayName}とお客様の直接契約となります。\n        </li>\n        <li className={classes.redFont}>\n          お客様の入力した情報は{props.companyDisplayName}に通知されます。また、問い合わせ等への対応のため、本画面にて入力いただいたEメールアドレスはANAにも通知されますが、通常1年以内に削除いたします。\n        </li>\n        {/** AMCサポート事業者の場合には文言を追加する。本予約画面のみ表示する */}\n        {props.isSupportAMC && props.isReservationPage &&\n          <li>\n            本画面にて入力いただいたANAマイレージクラブお客様番号(10桁)は、マイルの積算のためANAへ連携いたします。\n          </li>\n        }\n        <li className={classes.redFont}>\n          予約リクエストが完了しても予約が確定したわけではありません。{props.companyDisplayName}の「確定メール」をもって予約の確定としています。あらかじめご了承ください。\n        </li>\n        {/** 福島タクシー群の場合のみ乗合タクシー表記を追加する */}\n        {isFukushima &&\n          <li className={classes.redFont}>\n            乗合タクシーのため、他のお客様と混乗となる場合があります。空港にお送りする場合、お迎え先の乗車時間は変更となる場合があります。\n            (その場合は、前日の18時までにご連絡いたします)\n            また、空港発の場合、降車順により所要時間が変動する場合があります。\n          </li>\n        }\n        {/** 伊予鉄メーター料金の場合には別途文言を表示する */}\n        {props.company === TaxiCompanyList.iyotetsuTaxi2 &&\n          <li className={classes.redFont}>\n            本画面に表示されている金額はあくまで目安となります。タクシー会社からの「ご予約確定メール」にて確定料金をご確認いただけます。\n          </li>\n        }\n        {/** 大分別府合同タクシーの場合には別途文言を表示する */}\n        {props.company === TaxiCompanyList.gotaku &&\n          <>\n            <li className={classes.redFont}>\n              イベントやスポーツ会場発(お迎え)→大分空港は、ご予約いただけません。\n            </li>\n            <li className={classes.redFont}>\n              料金には、目的地または出発地により「高速道路代金」が含まれております。詳しくは、「予約確定メール」にてご確認下さい。\n            </li>\n          </>\n        }\n        {/** キングタクシーの場合スペシャルメッセージを表示する */}\n        {(props.company === TaxiCompanyList.kingTaxi) &&\n          <li>\n            乗合運行のため複数の航空便ご利用のお客様と混乗となっております。\n            飛行機の遅延により待機する場合は、 先着のお客様乗車時に最大10分間、他の便到着を待っての待機延長を了承された場合のみとなります。\n            また乗車予定者が、1名様のみの場合は、出発予定時刻の30分まで待機延長しますが、それ以降のご到着の場合はキャンセルの取扱いとなります。\n          </li>\n        }\n        <li>\n          大変お手数をおかけいたしますが、ご予約の際には、毎回メールアドレスの認証が必要となります。\n        </li>\n        <li>\n          ご連絡のないキャンセルや、当日のキャンセルは100%のキャンセル料が発生致します。\n        </li>\n        <li>\n          飛行機の遅延による空港待機料金、欠航によりご乗車できなかった場合のキャンセル料金はかかりません。\n          ただし、ANAからの情報の引継ぎは行われません。\n          <br />\n          大変お手数ですが、お客様ご自身で{props.companyDisplayName}へお問い合わせください。\n        </li>\n        <li>\n          万が一交通渋滞等でフライト出発時間に間に合わない場合も、航空券予約の保証はいたしかねます。\n        </li>\n        <li>\n          お支払いは現地車内にてお願いいたします。\n        </li>\n        {/* 立ち寄りに関するメッセージを表示する */}\n        <li>\n          {tachiyoriMessage}\n        </li>\n        {/* メーター料金の場合には注意書きを増やします */}\n        {props.isMeterFare &&\n          <li>\n            タクシーのメーター料金については想定走行距離を基に算出した目安金額であり、道路事情等により実際と異なる場合がございます。\n            また高速代金や回送料金、待機や信号・渋滞等による停車などの時間は考慮しておりません。各タクシー会社や地域により料金は異なることがありますので、あくまで参考金額としてご確認ください。実際の料金は乗車時のメーターに基づいての精算となります。\n          </li>\n        }\n        {/** 南国タクシーかつ定額の場合には注意事項を追加する */}\n        {props.company === TaxiCompanyList.nangoku && !props.isMeterFare &&\n          <li>\n            高速道路などの有料道路通行料やフェリー代など定額料金から別途料金が発生する場合もございます。\n          </li>\n        }\n        {/** 伊予鉄タクシーの場合には高速道路代金の注意事項を追加 */}\n        {props.company === TaxiCompanyList.iyotetsutaxi &&\n          <li>\n            料金には、目的地または出発地により「高速道路代金」が含まれております。詳しくは、「予約確定メール」にてご確認下さい。\n          </li>\n        }\n        {/** キングタクシーの場合には乗り合いタクシーの注釈を追加 */}\n        { props.company === TaxiCompanyList.kingTaxi &&\n          <li>\n            乗合タクシーは、(空港⇔角館地区・田沢湖地区・田沢湖高原地区・乳頭温泉地区)、(空港⇔男鹿地区・戸賀地区・加茂地区)の運行となるため、場所・宿泊施設によっては、いくつかを経由いたします。\n            また、最終的なお迎え時間はタクシー会社からご連絡いたします。\n          </li>\n        }\n\n      </ul>\n      {/** AMCをサポートしている場合にはAMCの注意事項を追加する */}\n      {props.isSupportAMC && props.isReservationPage &&\n        <AMCCaution\n          companyDisplayName={props.companyDisplayName}\n          company={props.company}\n        />\n      }\n    </div>\n  );\n}\n\nexport default CautionsJP;\n","import { makeStyles } from '@material-ui/core';\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { TaxiCompanyList } from '../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport CautionsEN from './CautionsEN';\nimport CautionsJP from './CautionsJP';\n\nexport const useCautionStyles = makeStyles((theme) => ({\n  root: {\n    color: theme.palette.primary.main,\n    fontSize: '0.875rem',\n    marginTop: '15px',\n  },\n  unorderedList: {\n    paddingInlineStart: '20px',\n  },\n  redFont: {\n    color: '#ff0000'\n  },\n  link: {\n    textDecoration: 'underline',\n    fontWeight: 'bold'\n  },\n  bold: {\n    fontWeight: 'bold'\n  },\n  // TODO: 超やっつけなのでなんとかしたい\n  come: {\n    color: '#ff0000',\n    marginLeft: '-15px'\n  },\n  comeBody: {\n    color: '#ff0000',\n    marginRight: '5px'\n  },\n  springMileMain: {\n    color: '#FF0000'\n  },\n  springMileLeftMargin: {\n    marginLeft: '1rem'\n  }\n\n}));\n\ninterface Props {\n  isMeterFare: boolean,\n  /** 仮予約画面で表示するタクシー会社名 */\n  companyDisplayName: string,\n  /** AMCをサポートする事業者の場合 */\n  isSupportAMC?: boolean,\n  /** 本予約画面か */\n  isReservationPage?: boolean,\n  /** タクシー会社 */\n  company: TaxiCompanyList\n}\n\n/** ハイヤー・タクシー予約画面の注意事項のコンポーネント。 */\nexport const Cautions: React.FC<Props> = (props: Props) => {\n  const { i18n } = useTranslation();\n  switch(i18n.language) {\n    case 'en':\n      return (\n        <CautionsEN\n          isMeterFare={props.isMeterFare}\n          companyDisplayName={props.companyDisplayName}\n          isSupportAMC={props.isSupportAMC}\n          isReservationPage={props.isReservationPage}\n          company={props.company}\n        />\n      );\n    case 'ja':\n    default:\n      return (\n        <CautionsJP\n          isMeterFare={props.isMeterFare}\n          companyDisplayName={props.companyDisplayName}\n          isSupportAMC={props.isSupportAMC}\n          isReservationPage={props.isReservationPage}\n          company={props.company}\n        />\n      );\n  }\n}\n\nexport default Cautions;\n","import React from 'react';\nimport { makeStyles, useTheme, Link, Typography } from '@material-ui/core';\nimport { TaxiCompanyList } from '../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { useSelector } from 'react-redux';\nimport { State } from '../../../../../reducers';\nimport { isEmail } from '../../../../../utils/regExpUtils';\nimport { useTranslation } from 'react-i18next';\n\nconst useStyles = makeStyles((theme) => ({\n  root: {\n    color: theme.palette.primary.main,\n    fontSize: '0.875rem',\n    marginTop: '10px',\n  },\n}));\n\ninterface Props {\n  company: TaxiCompanyList\n}\n\n/** 空港送迎タクシー予約画面の問い合わせ先のコンポーネント。 */\nexport const Contact: React.FC<Props> = (props: Props) => {\n  const theme = useTheme();\n  const classes = useStyles(theme);\n  const { t } = useTranslation();\n  const taxiCompanyConfigurations = useSelector((state: State) => state.general.taxiCompanyConfigurations);\n  if(!taxiCompanyConfigurations) {\n    return null;\n  }\n  const taxiCompanyConfiguration = taxiCompanyConfigurations[props.company] || taxiCompanyConfigurations[TaxiCompanyList.limoTaxi];\n  const contact = taxiCompanyConfiguration.contact;\n\n  return (\n    <Typography className={classes.root} data-cy=\"booking_taxi_contact_area\">\n      {/** 問い合わせ先の表記は各社共通なので個別には表記しない */}\n      {t('taxi:contact')}<br/>\n      { contact.messages.map((message: string, idx: number)=>{\n        const isEmailStr = isEmail(message);\n        // Email文字列の場合にはリンクにする\n        if(contact.isLinkMailAddress === 'true' && isEmailStr) {\n          return (\n            <span key={idx}>\n              <Link href={`mailto:${message}`}>\n                {message}\n              </Link>\n              <br/>\n            </span>\n          )\n        }\n        return (\n          <span key={idx}>\n            {message}<br/>\n          </span>\n        )\n      })}\n    </Typography>\n  );\n}\n\nexport default Contact;\n","import { ja, enUS } from 'date-fns/locale';\nimport URLParams from './getParams';\n\nclass Lang {\n  /** 日本語版を表す文字列。 */\n  static readonly JAPANESE = \"ja\";\n  /** 英語版を表す文字列。 */\n  static readonly ENGLISH = \"en\";\n}\n\n/**\n * 日本語モードであるかを判別する。\n * @param lang 設定されている言語を表す文字列。\n * */\nexport function isJapanese(lang: string) {\n  return lang === Lang.JAPANESE;\n}\n\n/**\n * 英語モードであるかを判別する。\n * @param lang 設定されている言語を表す文字列。\n */\nexport function isEnglish(lang: string) {\n  return lang === Lang.ENGLISH;\n}\n\n/**\n * 言語別のLocaleクラスを返却する\n * @param lang 設定されている言語を表す文字列。\n */\nexport function getLocale(lang: string) {\n  if (isJapanese(lang)) return ja;\n  if (isEnglish(lang)) return enUS;\n\n  return ja;\n}\n\n/**\n * 言語切替共通化関数\n * @param searchParams location.search を引数に取った\n * @param i18n useTranslationで取得したi18n変数\n */\nexport const changeLanguage = (searchParams: URLParams, i18n: any) => {\n  const lang = searchParams.getStringParam('lang') || 'ja';\n  // TODO: 共通化したい\n  switch(lang) {\n    case 'en':\n      i18n.changeLanguage('en');\n      break;\n    case 'ja':\n    default:\n      i18n.changeLanguage('ja');\n      break;\n  }\n}\n","import { makeStyles, useTheme } from \"@material-ui/styles\";\nimport React from \"react\";\nimport { TaxiCompanyList } from \"../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams\";\nimport EasternLogoJP from './../images/eastern_airport_logo.png';\nimport EasternLogoEN from './../images/eastern_airport_logo_en.png';\nimport SandenLogo from './../images/sandenTaxiLogo.png';\nimport NahaHireLogo from './../images/nahaHireLogo.png';\nimport MiyakoTaxiLogo from './../images/miyakou-taxi-logo.jpg';\nimport HinomaruHireLogo from './../images/hinomaruHireLogo.png'\nimport NangokuTaxiLogo from './../images/nangokuTaxiLogo.png';\nimport IyotetsuLogo from './../images/iyotetsutaxi-logo.png';\nimport GotakuLogo from './../images/gotaku-logo.png';\nimport AsahikawachuuoLogo from './../images/asahikawa-chuuo-logo.png'\nimport HakodateTaxiLogo from './../images/hakodate-taxi-logo.png'\n\nimport DaiwaTaxiLogo from './../images/daiwa-taxi-logo.jpg';\nimport KitaFukushimaTaxiLogo from './../images/kita-fukushima-taxi-logo.jpg';\nimport FukushimaChuoTaxiLogo from './../images/fukushima-chuo-taxi-logo.jpg';\nimport IwakiTaxiLogo from './../images/iwaki-taxi-logo.jpg';\nimport UchigoTaxiLogo from './../images/uchigo-taxi-logo.jpg';\nimport TajimaTaxiLogo from './../images/tajima-taxi-logo.png';\nimport KinugawaTaxiLogo from './../images/kinugawa-taxi-logo.png';\nimport hokutocabLogo from './../images/hokto-taxi-logo.png';\nimport YokoTaxiLogo from './../images/yoko-taxi-logo.jpg';\nimport KingTaxiLogo from './../images/king-taxi-logo.png';\nimport TodenTaxiLogo from './../images/toden-taxi-logo.png';\nimport IshikawaKotsuLogo from './../images/ishikawa-taxi-logo.jpg';\nimport UbeKounaiLogo from './../images/ube-kounai-taxi-logo.png';\nimport TsuzuTaxiLogo from './../images/tsuzu-taxi-logo.png';\nimport SakataNo1TaxiLogo from './../images/sakata-no1taxi-logo.png';\nimport ShokoHireLogo from './../images/shoko-hire-logo.png';\nimport KisakataLogo from './../images/kisakata-logo.png';\n\nimport DummyTaxiLogo from './../images/dummy_taxi_logo.png';\n\nimport { useSelector } from \"react-redux\";\nimport { State } from \"../../../../../reducers\";\nimport { Lang } from \"../../../../../states/query\";\nimport { isJapanese } from \"../../../../../utils/lang\";\nimport { useTranslation } from \"react-i18next\";\n\ninterface Props {\n  company: TaxiCompanyList,\n  lang: Lang\n}\n\nconst useStyles = makeStyles(() => ({\n  easternLogo: {\n    margin: '10px 0px',\n    width: '100%',\n    maxHeight: '156px',\n  },\n  ubeSandenLogo: {\n    margin: '10px 0px',\n    width: '100%',\n    maxWidth: '640px',\n    maxHeight: '156px',\n  },\n  nahahireLogo: {\n    margin: '10px 0px',\n    width: '100%',\n    maxWidth: '640px',\n    maxHeight: '156px',\n    background: '#000000'\n  },\n  miyakohLogo: {\n    marginBottom: \"10px\",\n    maxWidth: \"468px\",\n    width: \"100%\",\n  },\n  nangokuLogo: {\n    margin: '10px 0px',\n    width: '100%',\n    maxWidth: '450px'\n  },\n  iyotetsutaxiLogo: {\n    margin: '10px 0px',\n    width: \"100%\",\n    maxWidth: 'min(640px, 100%)',\n    maxHeight: '156px',\n  },\n  wideShortTaxiLogo: {\n    margin: '10px 0px',\n    maxWidth: 'min(640px, 100%)',\n    maxHeight: '156px',\n  },\n  kinugawaTaxiLogo: {\n    margin: '10px 0px',\n    maxWidth: 'min(426px, 100%)',\n    maxHeight: '156px',\n  },\n  body: {\n    width: '100%',\n    textAlign: 'center'\n  }\n}));\n\n/**\n * 各タクシー会社の企業ロゴを表示する\n * @param props 会社名\n * @returns 企業ロゴComponents\n */\nconst ShowTaxiComapnyLogo: React.FC<Props> = (props: Props) => {\n  const { i18n } = useTranslation();\n  const theme = useTheme();\n  const classes = useStyles(theme);\n  const taxiCompanyConfigurations = useSelector((state: State) => state.general.taxiCompanyConfigurations);\n  if(!taxiCompanyConfigurations) {\n    return null;\n  }\n  const taxiCompanyConfiguration = taxiCompanyConfigurations[props.company] || taxiCompanyConfigurations[TaxiCompanyList.limoTaxi];\n  const EasternLogo = isJapanese(i18n.language)? EasternLogoJP: EasternLogoEN;\n\n  const Logos: { [keys in TaxiCompanyList]: string } = {\n    [TaxiCompanyList.eastern]:        EasternLogo,\n    [TaxiCompanyList.limoTaxi]:       EasternLogo,\n    [TaxiCompanyList.miyakou]:        MiyakoTaxiLogo,\n    [TaxiCompanyList.ubeSanden]:      SandenLogo,\n    [TaxiCompanyList.nahahire]:       NahaHireLogo,\n    [TaxiCompanyList.hinomaru]:       HinomaruHireLogo,\n    [TaxiCompanyList.nangoku]:        NangokuTaxiLogo,\n    [TaxiCompanyList.iyotetsutaxi]:   IyotetsuLogo,\n    [TaxiCompanyList.iyotetsuTaxi2]:  IyotetsuLogo,\n    [TaxiCompanyList.gotaku]:         GotakuLogo,\n    [TaxiCompanyList.hakodateTaxi]:   HakodateTaxiLogo,\n    [TaxiCompanyList.Asahikawachuuo]: AsahikawachuuoLogo,\n    [TaxiCompanyList.daiwaj]:         DaiwaTaxiLogo,\n    [TaxiCompanyList.kitafukushima]:  KitaFukushimaTaxiLogo,\n    [TaxiCompanyList.fukushimachuo]:  FukushimaChuoTaxiLogo,\n    [TaxiCompanyList.iwakiTaxi]:      IwakiTaxiLogo,\n    [TaxiCompanyList['uchi-go']]:     UchigoTaxiLogo,\n    [TaxiCompanyList.tajimaTaxi]:     TajimaTaxiLogo,\n    [TaxiCompanyList.kinugawaTaxi]:   KinugawaTaxiLogo,\n    [TaxiCompanyList.hokutocab]:      hokutocabLogo,\n    [TaxiCompanyList.yotoTaxi]:       YokoTaxiLogo,\n    [TaxiCompanyList.kingTaxi]:       KingTaxiLogo,\n    [TaxiCompanyList.toden]:          TodenTaxiLogo,\n    [TaxiCompanyList.ishikawakotsu]:  IshikawaKotsuLogo,\n    [TaxiCompanyList.kingTaxi2]:      KingTaxiLogo,\n    [TaxiCompanyList.ubeKounai]:      UbeKounaiLogo,\n    [TaxiCompanyList.tsuzutaxi]:      TsuzuTaxiLogo,\n    [TaxiCompanyList.sakataNo1Taxi]:      SakataNo1TaxiLogo,\n    [TaxiCompanyList.shokoHire]:      ShokoHireLogo,\n    [TaxiCompanyList.airport_liner]:  KisakataLogo,\n    [TaxiCompanyList.nikaho_go]:      KisakataLogo,\n    [TaxiCompanyList.dummyVal]:       DummyTaxiLogo\n  }\n  const classNames: { [keys in TaxiCompanyList]: string } = {\n    [TaxiCompanyList.eastern]:        classes.easternLogo,\n    [TaxiCompanyList.limoTaxi]:       classes.easternLogo,\n    [TaxiCompanyList.miyakou]:        classes.miyakohLogo,\n    [TaxiCompanyList.ubeSanden]:      classes.ubeSandenLogo,\n    [TaxiCompanyList.nahahire]:       classes.nahahireLogo,\n    [TaxiCompanyList.hinomaru]:       classes.easternLogo,\n    [TaxiCompanyList.nangoku]:        classes.nangokuLogo,\n    [TaxiCompanyList.iyotetsutaxi]:   classes.iyotetsutaxiLogo,\n    [TaxiCompanyList.iyotetsuTaxi2]:  classes.iyotetsutaxiLogo,\n    [TaxiCompanyList.gotaku]:         classes.wideShortTaxiLogo,\n    [TaxiCompanyList.hakodateTaxi]:   classes.wideShortTaxiLogo,\n    [TaxiCompanyList.Asahikawachuuo]: classes.wideShortTaxiLogo,\n    [TaxiCompanyList.daiwaj]:         classes.wideShortTaxiLogo,\n    [TaxiCompanyList.kitafukushima]:  classes.wideShortTaxiLogo,\n    [TaxiCompanyList.fukushimachuo]:  classes.wideShortTaxiLogo,\n    [TaxiCompanyList.iwakiTaxi]:      classes.easternLogo,\n    [TaxiCompanyList['uchi-go']]:     classes.easternLogo,\n    [TaxiCompanyList.tajimaTaxi]:     classes.wideShortTaxiLogo,\n    [TaxiCompanyList.kinugawaTaxi]:   classes.kinugawaTaxiLogo,\n    [TaxiCompanyList.hokutocab]:      classes.wideShortTaxiLogo,\n    [TaxiCompanyList.yotoTaxi]:       classes.easternLogo,\n    [TaxiCompanyList.kingTaxi]:       classes.wideShortTaxiLogo,\n    [TaxiCompanyList.toden]:          classes.wideShortTaxiLogo,\n    [TaxiCompanyList.ishikawakotsu]:  classes.wideShortTaxiLogo,\n    [TaxiCompanyList.kingTaxi2]:      classes.wideShortTaxiLogo,\n    [TaxiCompanyList.ubeKounai]:      classes.wideShortTaxiLogo,\n    [TaxiCompanyList.tsuzutaxi]:      classes.wideShortTaxiLogo,\n    [TaxiCompanyList.sakataNo1Taxi]:      classes.wideShortTaxiLogo,\n    [TaxiCompanyList.shokoHire]:      classes.wideShortTaxiLogo,\n    [TaxiCompanyList.airport_liner]:  classes.wideShortTaxiLogo,\n    [TaxiCompanyList.nikaho_go]:      classes.wideShortTaxiLogo,\n    [TaxiCompanyList.dummyVal]:       classes.easternLogo\n  }\n  const src = Logos[props.company];\n  const className = classNames[props.company];\n  return (\n    <div className={classes.body}>\n      <img\n        src={src}\n        alt={taxiCompanyConfiguration.logo.alt}\n        className={className}\n        data-cy={taxiCompanyConfiguration.cyName.logo}\n      />\n    </div>\n  )\n}\n\nexport default ShowTaxiComapnyLogo;\n","/** タクシー予約画面の緯度経度に関する処理のクラス。 */\nexport default class Coordinates {\n  /** 東京駅の座標(メタ情報を読み込めない時のための本当の初期座標) */\n  static readonly TOKYO_STATION = {\n    lat: 35.68153260987459,\n    lng: 139.76771635598573,\n  };\n}\n","/** 送迎パターンのクラス。 */\nexport default class PickupPattern {\n  /** お迎え先→空港(=空港着)の場合の設定値。 */\n  static readonly TO_AIRPORT = 1;\n\n  /** 空港→お送り先(=空港発)の場合の設定値。 */\n  static readonly FROM_AIRPORT = 2;\n\n  /** 往復の場合の設定値。 */\n  // 2021/07/07現在未使用。\n  static readonly ROUND_TRIP = 3;\n\n  /**\n   * 送迎パターンが空港着であるかを判別する。\n   * @param v\n   */\n  static isToAirport(v: number) {\n    return v === PickupPattern.TO_AIRPORT;\n  }\n}\n","import { load } from 'recaptcha-v3';\n\n/** Google reCAPTCHAのキー情報。 */\nconst RECAPTCHA_KEY = process.env[\"REACT_APP_GOOGLE_RECAPTCHA_KEY\"] as string;\n\n/** Google reCaptcha V3のトークンを取得する。 */\nexport async function getRecaptchaToken() {\n  try {\n    /** Google reCaptchaのインスタンス。 */\n    const recaptcha = await load(RECAPTCHA_KEY);\n    /** Google reCaptchaのトークン。 */\n    const token = await recaptcha.execute('homepage');\n    return token;\n  }\n  catch(e) {\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n      console.error(\"reCAPTCHA v3のトークン取得でエラーが発生しました。\");\n      console.error(e);\n    }\n    return \"\";\n  }\n}\n","import axios from 'axios';\nimport { setTaxiEndpoint } from '../GetReservation';\nimport { TemporaryReservationParams } from './TemporaryReservationParams';\n\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: process.env['REACT_APP_API_ENDPOINT'] as string,\n  timeout: 60000,\n};\n\n/** 仮予約APIを呼び出す。 */\nexport async function submitTemporaryReservation(params: TemporaryReservationParams) {\n  try {\n    const config = {\n      ...DEFAULT_API_CONFIG,\n    };\n    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n    /** axiosのインスタンス。 */\n    const instance = axios.create(config);\n    /** 仮予約APIのパス。 */\n    const path = await setPath();\n    // 仮予約APIにPOSTメソッドでリクエストする。\n    return await instance.post(path, {...params});\n  } catch (err) {\n    // エラーが発生した場合、nullを返す。\n    return null;\n  }\n}\n\n/** 環境に応じて呼び出すAPIのパスを切り替える。 */\nasync function setPath() {\n  return setTaxiEndpoint('submit-temporary-reservation');\n}\n","/**\n * 二点間の距離を求める\n * @param depPoint 出発地\n * @param arrPoint 到着地\n */\nexport const computeDistanceBetween = (depPoint: GeoLocation, arrPoint: GeoLocation) => {\n  const rad = (deg: number) => {\n    return deg * Math.PI / 180;\n  }\n  const depRedPoint = {\n    lat: rad(depPoint.lat),\n    lng: rad(depPoint.lng)\n  }\n  const arrRedPoint = {\n    lat: rad(arrPoint.lat),\n    lng: rad(arrPoint.lng)\n  }\n\n  // 緯度差\n  const latDiff = depRedPoint.lat - arrRedPoint.lat;\n  // 経度差算\n  const lngDiff = depRedPoint.lng - arrRedPoint.lng;\n  // 平均緯度\n  const latAvg = (depRedPoint.lat + arrRedPoint.lat) / 2.0;\n  // 赤道半径\n  const equatorRad = 6378137.0;\n  // 第一離心率^2\n  const e2 = 0.00669438002301188;\n  // 赤道上の子午線曲率半径\n  const a1e2 = 6335439.32708317;\n  const sinLat = Math.sin(latAvg);\n  const W2 = 1.0 - e2 * (sinLat * sinLat);\n  // 子午線曲率半径M\n  const M = a1e2 / (Math.sqrt(W2) * W2);\n  // 卯酉線曲率半径\n  const N = equatorRad / Math.sqrt(W2);\n  const t1 = M * latDiff;\n  const t2 = N * Math.cos(latAvg) * lngDiff;\n  return Math.sqrt((t1 * t1) + (t2 * t2));\n}\n/**\n * 駅すぱあとの緯度経度情報より、GeoLocation形に変換する\n */\nexport const convertEWSToLocation = (baseGeoPoint: EWSGeoPoint): GeoLocation => {\n  return {\n    lat: Number(baseGeoPoint.lati_d),\n    lng: Number(baseGeoPoint.longi_d),\n    gcs: baseGeoPoint.gcs\n  }\n}\n/**\n * Location型を駅すぱあとで使える座標情報文字列に変換する\n */\nexport const convertLocationToStr = (point: GeoLocation): string => {\n  return `${point.lat},${point.lng}`;\n}\n\n/**\n * 文字列をGeoLocation型に変換する\n * @param point 変換対象の文字\n * @returns\n */\nexport const convertStrToLocation = (point: string): GeoLocation => {\n  const lat = Number(point.split(',')[0]);\n  const lng = Number(point.split(',')[1]);\n  if(isNaN(lat) || isNaN(lng)) {\n    throw new Error(`対象の文字列は座標のフォーマットを満たしていません: ${point}`)\n  }\n  return {\n    lat: lat,\n    lng: lng\n  }\n}\n\nexport interface GeoLocation {\n  lat: number;\n  lng: number;\n  gcs?: string;\n}\n\nexport interface EWSGeoPoint {\n  longi: string;\n  lati: string;\n  longi_d: string;\n  lati_d: string;\n  gcs: string;\n}\n","import { Point } from '../../services/ekispert/models';\nimport { Prefecture } from '../../services/ekispert/models/operationLinePattern';\nimport { Type } from '../../services/ekispert/models/stationLight';\nimport { PointType } from '../../states/common';\nimport { convertEWSToLocation, GeoLocation } from '../../utils/geoLocation';\n\n// オートコンプリートで表示する候補のクラス。\nexport class Candidate {\n  name: string;\n  code: string;\n  type: string;\n  geoPoint?: GeoLocation;\n  prefecture?: Prefecture;\n  description?: string;\n\n  /**\n   * constructor\n   * @param name 地点名\n   * @param code 駅コード\n   * @param type 地点種別\n   * @param geoPoint 地点緯度経度情報\n   * @param prefecture 都道府県情報\n   * @param description 備考(住所)\n   */\n  constructor(name: string, code: string, type: string | Type, geoPoint?: GeoLocation | null, prefecture?: Prefecture | null, description?: string) {\n    this.name = name;\n    this.code = code;\n    // stringの場合はそのまま採用し、バスの場合は1階層深いオブジェクトのため分岐している。\n    this.type = typeof type === 'string' ? type : type.text;\n    if(geoPoint) {\n      this.geoPoint = geoPoint;\n    }\n    if(prefecture) {\n      this.prefecture = prefecture;\n    }\n    if(description) {\n      this.description = description;\n    }\n  }\n\n  static convertPointToCandidate(point: Point) {\n    return new Candidate(point.Station.Name, point.Station.code, point.Station.Type, convertEWSToLocation(point.GeoPoint), point.Prefecture);\n  }\n\n  /** 候補リストで表示する各種別に応じたラベルを取得する。 */\n  getTypeLabel(t: any) {\n    switch (this.type) {\n      // 現在地の場合。\n      case 'currentPosition':\n        // 空文字にすることで見出し(背景色つきの部分)は非表示とする。\n        return '';\n      // 鉄道の場合。\n      case 'train':\n        return t('station');\n      // 施設・地点(Google Places APIから取得した候補)の場合。\n      case 'place':\n        return t('place');\n      // バスの場合。\n      case 'bus':\n        return t('bus_stop');\n      // 船の場合。\n      case 'ship':\n        return t('port');\n      // 履歴の場合。\n      case PointType.HISTORY:\n        return  t('search:history') + t('search:history_limit');\n      // それ以外は空文字を返す。\n      default:\n        return '';\n    }\n  }\n}\n","import { Lang } from \"../states/query\";\n\n/** 文字列に関する処理をまとめたクラス。 */\nexport default class StringUtils {\n  /**\n   * 番地の形式(数字のみ、または、全角マイナスつなぎの数字)であるかを判定する。\n   * @param str 判定したい文字列。\n   */\n  static isHouseNumber(str: string) {\n    const regex = RegExp('^[0-90-9−]+$');\n    return regex.test(str);\n  }\n\n  /**\n   * 文字列の末尾が数字であるかを判別する。\n   * @param str 判定したい文字列。\n   */\n  static endsWithNumbers(str: string) {\n    const regex = RegExp('.*[0-90-9]$');\n    return regex.test(str);\n  }\n\n  /**\n   * カッコ付きの文字列にする。\n   * 例:「第1ターミナル」→「(第1ターミナル)」\n   * @param str カッコで括りたい文字列。\n   */\n  static addBracket(str: string) {\n    return '(' + str + ')';\n  }\n\n  /** \n   * 言語設定に応じて文字列の配列の各要素を結合する。\n   * @param data 結合したい文字列の配列。\n   * @param lang 言語設定。\n   * */\n  static join(data: string[], lang: string = Lang.ja) {\n    // 英語版の場合は各単語にスペースを入れて結合する。\n    return (lang === Lang.en) ? data.join(' ') : data.join('');\n  }\n\n  /**\n   * 文字列が緯度経度の形式になっているかを判定する。\n   * @param value 判定したい文字列。\n   */\n  static isCoordinates(value: string) {\n    /** 緯度経度のフォーマットの正規表現。 */\n    const coordinetesRegexp = /^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?),\\s*[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?).*$/;\n    /** 与えられた引数の文字列が緯度経度の形式であるかを判定した結果。 */\n    // matchメソッドの戻り値がnullの場合はfalseを、それ以外(Array)の場合はtrueを返す。\n    const result = value.match(coordinetesRegexp) === null ? false : true;\n    return result;\n  }\n}\n","import { AddressComponent, Result } from \"./PlaceDetail\";\nimport StringUtil from './../../utils/stringUtils';\nimport { Lang } from \"../../states/query\";\nimport { GeoLocation } from \"../../utils/geoLocation\";\nexport interface PlaceLog {\n  prefecture: string;\n  city: string;\n  address: string;\n  place: string;\n  category: string;\n}\n\nexport interface PlaceData {\n  /** 緯度。 */\n  lat: string;\n  /** 経度。 */\n  lng: string;\n  /** 都道府県。 */\n  prefecture: string;\n  /** 市区町村。 */\n  city: string;\n  /** その他の住所。 */\n  address: string;\n  /** 地点名。 */\n  name: string;\n  /** 地点のカテゴリ。 */\n  category: string;\n  /** 住所情報 */\n  formattedAddress: string;\n}\n\n/** Google Places APIから取得した地点を扱うクラス。(検索ログ用の情報を格納する。) */\nexport default class Place implements PlaceData {\n  /** 緯度。 */\n  lat: string;\n  /** 経度。 */\n  lng: string;\n  /** 都道府県。 */\n  prefecture: string;\n  /** 市区町村。 */\n  city: string;\n  /** その他の住所。 */\n  address: string;\n  /** 地点名。 */\n  name: string;\n  /** 地点のカテゴリ。 */\n  category: string;\n  /** 住所情報 */\n  formattedAddress: string;\n\n  // 定数。\n  /** 都道府県として判別するキー。 */\n  prefectureKey = 'administrative_area_level_1';\n  /** 市区町村として判別するキー(その1)。 */\n  administrativeAreaLv2Key = 'administrative_area_level_2';\n  /** 市区町村として判別するキー(その2)。 */\n  cityKey1 = 'locality';\n  /** 市区町村として判別するキー(その3)。 */\n  cityKey2 = 'sublocality_level_1';\n  /** その他の住所として判別するキー。 */\n  premiseKey = 'premise';\n  /** 郵便番号として判別するキー。 */\n  postalCode = 'postal_code';\n  /** 国名として判別するキー。 */\n  country = 'country';\n  /** 全角マイナス。 */\n  fillwidthMinus = '−';\n\n  /** リロード時にも情報を復元できるように格納するSession Storageのキー。 */\n  static readonly sessionStorageKeys = {\n    /** 地点の名称を格納するキー。 */\n    latlng: 'ana-airport-access-navi_latlng',\n  };\n\n  /**\n   * コンストラクタ。\n   * @param response Place Details(https://maps.googleapis.com/maps/api/place/details/)で取得したレスポンス。\n   */\n  constructor(result: Result);\n  constructor(result: Place);\n  constructor(result: PlaceData);\n  constructor(result: any) {\n    // geometry 要素があればPlaceData Typeと判定する\n    if(result.geometry) {\n      this.lat = result.geometry.location.lat.toString();\n      this.lng = result.geometry.location.lng.toString();\n      // 都道府県・市区町村は別メソッドで設定するため、一旦空文字をセットする。\n      this.prefecture = '';\n      this.city = '';\n      // 住所情報を取得する\n      this.formattedAddress = result.formatted_address;\n      // 都道府県・市区町村を設定する。\n      this.setFromAddressComponents(result.address_components);\n      // その他住所をaddress_components要素から設定する。\n      this.address = this.setAddress(result.address_components);\n      // 地点名称はname要素から取得する。\n      this.name = result.name;\n      // スラッシュ区切りでカテゴリ(type)の要素を1つの文字列にする。\n      this.category = result.types.join('/');\n    } else {\n      this.lat = result.lat;\n      this.lng = result.lng;\n      this.prefecture = result.prefecture;\n      this.city = result.city;\n      this.address = result.address;\n      this.name = result.name;\n      this.category = result.category;\n      this.formattedAddress = result.formattedAddress;\n    }\n  }\n\n  /** places/geocode で地点を取得した場合には地点名が取れないので後入れをする */\n  setPlaceName(name: string) {\n    if(!this.name || this.name === '') {\n      this.name = name;\n    }\n  }\n\n  /**\n   * 住所(都道府県・市区町村・字(+番地など))の文字列を取得する。\n   * @param lang 言語設定。未指定の場合は日本語版となる。\n   */\n  getFullAddress = (lang: Lang = Lang.ja) => {\n    // 日本語版の場合は「都道府県」「市区町村」「字(+番地など)」の順の文字列を返す。\n    if(lang === Lang.ja) {\n      return `${this.prefecture}${this.city}${this.address}`;\n    }\n    // 英語版の場合は「字(+番地など)」「市区町村」「都道府県」の順の文字列を返す。\n    else {\n      return `${this.address}, ${this.city}, ${this.prefecture}`;\n    }\n  }\n\n  /**\n   * 市区町村までの住所(都道府県・市区町村)の文字列を取得する。\n   * (空港送迎タクシーの予約時のエリア判別で利用する。2021/07/12現在。)\n   */\n  getAddressToMunicipality = () => {\n    // 「都道府県」「市区町村」を組み合わせた文字列を返す。\n    return `${this.prefecture}${this.city}`;\n  }\n\n  /**\n   * address_component要素から都道府県・市区町村を設定する。\n   * @param addressComponent Place Detailsで取得したレスポンスのaddress_component要素。\n   */\n  setFromAddressComponents = (addressComponent: AddressComponent[]) => {\n    let prefecture = '';\n    let cityList: AddressComponent[] = [];\n    // 日本の住所の記法とは逆順でデータが返却されるため、配列の順序を逆転させた上でループさせる。\n    addressComponent.reverse().forEach((c) => {\n      const types = c.types;\n      const longName = c.long_name;\n      // 名古屋駅などはadministrative_area_level1と2が同じ愛知県になっているため、そのようなケースは捨てる。\n      if (types.includes(this.administrativeAreaLv2Key) && prefecture === longName) { return; }\n      // 種別が郵便番号または国名の場合はスキップする。\n      if (types.includes(this.postalCode) || types.includes(this.country)) {\n        return;\n      // 種別に都道府県を表すキーを含んでいる場合は都道府県の名称として採用する。\n      } else if (types.includes(this.prefectureKey)) {\n        prefecture = longName;\n      // 種別に市区町村を表すキーを含んでいる場合は市区町村の名称として採用する。\n      } else if (types.includes(this.cityKey1) || types.includes(this.cityKey2) || types.includes(this.administrativeAreaLv2Key)) {\n        cityList.push(c);\n      }\n    })\n    // 市区町村を求める\n    this.city = cityList.map((c)=>{\n      // 該当地点がフルアドレス中で何文字目に来るかを求める\n      c.index = this.formattedAddress.indexOf(c.long_name);\n      return c;\n    })\n    // フルアドレスにマッチしない地名は除外する\n    .filter((x)=>{\n      return x.index !== -1;\n    })\n    // フルアドレスに出てくる順に並び替える\n    .sort((a, b)=>{\n      if(a.index === undefined || b.index === undefined) {\n        return 0;\n      }\n      else {\n        return a.index > b.index? 1: -1;\n      }\n    })\n    // フルアドレスに出てくる順に構築する\n    .reduce((x, a)=>{\n      return x + a.long_name;\n    }, \"\");\n    /**\n     * TODO:「奈良県宇陀郡曽爾村」を選択した際に「奈良県曽爾村宇陀郡」になる場合があるので修正処理を入れるが、\n     * デグレが発生する可能性があるので一旦コメントアウトしている(2022/03/04)\n     **/\n    // this.city = this.fixCity()\n    this.prefecture = prefecture;\n  }\n\n  /**\n   * Google APIのデータからその他住所を設定する。\n   * @param addressComponents Google Places Details APIの住所データの配列。\n   */\n  setAddress = (addressComponents: AddressComponent[]) => {\n    let address = '';\n    /** \n     * type要素に「sublocality_level_2」 ~ 「sublocality_level_5」が設定されている要素を格納する配列。\n     * https://developers.google.com/places/supported_types\n     * */\n    const sublocalityElements: AddressComponent[] = [];\n    /** 都道府県より先の住所として扱う住所要素のキーを格納する配列。 */\n    const sublocalityKeys: string[] = [];\n    /** 都道府県より先の住所として扱う住所要素のキーの共通する文字列。 */\n    const subLocalityKey = 'sublocality_level_';\n    // 住所のコンポーネントをループする。\n    addressComponents.forEach((c) => {\n      // type要素の全項目を評価する。\n      c.types.forEach((type) => {\n        // type要素の配列に「sublocality_level_」を含む文字列を含む、かつ、「sublocality_level_1」(都道府県名称)ではない場合、そのtype要素の値を配列に格納する。\n        if (type.includes(subLocalityKey) && type !== 'sublocality_level_1') { sublocalityKeys.push(type); }\n      })\n    })\n    // ソートした「sublocality_level_x」のキーをループする。\n    // (末尾の「x」部分が数字であるため、標準メソッドのソートで並び替えることで順番どおりにループさせる。)\n    sublocalityKeys.sort().forEach((key) => {\n      // あらかじめ取得したキーを持つ住所コンポーネントを取得する。\n      const targetComponent = addressComponents.find((c) => { return c.types.includes(key); })\n      // 住所コンポーネントが取得できた場合のみ、配列に格納する。\n      if (targetComponent) { sublocalityElements.push(targetComponent); }\n    })\n    // 上記のwhile文で「sublocality_level_x」の数字順に取得したsublocality要素をループさせる。\n    sublocalityElements.forEach((s) => {\n      const longName = s.long_name;\n      // 参照している要素が番地の形式(数字のみ、または全角マイナスつなぎの数字)、かつ、現在取得しているその他住所の末尾が数字である場合。\n      if (StringUtil.isHouseNumber(longName) && StringUtil.endsWithNumbers(address)) {\n        // 全角マイナスを追加する。\n        address += this.fillwidthMinus;\n      }\n      address += longName;\n    })\n    // sublocality以下の住所を取得する。\n    addressComponents.forEach((c) => {\n      const types = c.types;\n      if (types.includes(this.premiseKey)) {\n        const longName = c.long_name;\n        // 番地の形式(数字のみ、または全角マイナスつなぎの数字)である場合。\n        if (StringUtil.isHouseNumber(longName)) {\n          // 現在取得しているその他住所の末尾が数字で終わっている場合は全角マイナスを追加する。\n          if (StringUtil.endsWithNumbers(address)) { address += this.fillwidthMinus; }\n          address += longName;\n        }\n      }\n    })\n    // ここまでの処理で「address」が空の場合には「establishment」属性の要素を追加する\n    // AM-796「山形県酒田市 豊川」対応のための処理\n    if(address === '') {\n      addressComponents.forEach((c) => {\n        if(c.types.includes('establishment')) {\n          const longName = c.long_name;\n          address += longName;\n        }\n      })\n    }\n    return address;\n  }\n\n  /** カンマ区切りの緯度経度(駅すぱあとの経路探索で利用する形式)を取得する。 */\n  getCoordinate = () => {\n    return this.lat + ',' + this.lng;\n  }\n\n  /** ログ記録時に利用するオブジェクトに変換する。 */\n  toLog = (): PlaceLog => {\n    return {\n      prefecture: this.prefecture,\n      city: this.city,\n      address: this.address,\n      place: this.name,\n      category: this.category,\n    }\n  }\n\n  /** 地点名の座標をGeoLocation形に変換する */\n  getLocation = (): GeoLocation => {\n    return {\n      lat: Number(this.lat),\n      lng: Number(this.lng)\n    }\n  }\n\n  /**\n   * XXX村XX郡の並びになっている場合には並びを戻す\n   * 奈良県宇陀郡曽爾村を選択した場合に住所がおかしくなる場合があるので、XX郡が含まれる際に並びが正しいかチェックする\n   * TODO: 1ケースしか試していないので他の市区町村のパターンでも正確に直るかを検証したい\n   **/\n  fixCity = () => {\n    const matchPattern = /((?:旭川|伊達|石狩|盛岡|奥州|田村|南相馬|那須塩原|東村山|武蔵村山|羽村|十日町|上越|富山|野々市|大町|蒲郡|四日市|姫路|大和郡山|廿日市|下松|岩国|田川|大村)市|.+?郡(?:玉村|大町|.+?)[町村]|.+?市.+?区|.+?[市区町村])(.+)/\n    const matchResult = this.city.match(matchPattern);\n    // XX村の後にXXX郡が来ている場合にはfalseとする\n    if(matchResult && matchResult[2] && matchResult[2].match(/.+?郡$/)) {\n      return `${matchResult[2]}${matchResult[1]}`;\n    }\n    return this.city;\n  }\n}\n","/* eslint @typescript-eslint/no-unused-vars: 0 */\n\nimport axios from 'axios';\nimport { Candidate } from '../../components/search/Candidate';\nimport { Lang } from '../../states/query';\nimport { convertEWSToLocation, GeoLocation } from '../../utils/geoLocation';\nimport { Point } from '../ekispert/models';\nimport { GetFlightInfoRequest, RequestDiaList, RequestSearchCourse } from './models/searchCourse';\nimport Environment from '../../utils/environment';\nimport { GetFlightInfoResponse } from './models/aswLinkageInfo';\nimport { InterruptToTransferRequest } from './models/interruptToTransfer';\n\n\nexport interface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst TIMEOUT_LIMIT = 40000;\n\n// mockのURLを貼る\nconst MOCK_API_CONFIG: ApiConfig = {\n  baseURL: '/',\n  timeout: TIMEOUT_LIMIT,\n};\n\n// HTTP STATUS TEST用\nconst HTTP_STAT_CONFIG: ApiConfig = {\n  baseURL: 'https://httpstat.us/',\n  timeout: TIMEOUT_LIMIT,\n};\n\nexport const API_DEV_CONFIG: ApiConfig = {\n  baseURL: 'https://ana-maas-api-dev.val.jp/',\n  timeout: TIMEOUT_LIMIT,\n}\n\nexport const API_STAGE_CONFIG: ApiConfig = {\n  baseURL: 'https://ana-maas-api-stg.val.jp/',\n  timeout: TIMEOUT_LIMIT,\n}\n\nexport const API_PROD_CONFIG: ApiConfig = {\n  baseURL: 'https://ana-maas-api.val.jp/',\n  timeout: TIMEOUT_LIMIT,\n}\n\n/**\n * StatusErrorCodeテスト用に、任意のHTTPStatusCodeを返すモックエンドポイントにリクエストを投げる\n * @param statusCode\n * @returns\n */\nconst getErrorStatus = async (statusCode: number) => {\n  const useAPIConfig: ApiConfig = HTTP_STAT_CONFIG;\n  const instance = axios.create(useAPIConfig);\n  return await instance.get(`/${statusCode}`);\n}\n\n/** テスト用のバックエンドを使用するかを判別する */\n/** Localから本番用のエンドポイントを使う場合には常に「API_PROD_CONFIG」を返すように変更してください */\nexport const getUseAPI = (): ApiConfig => {\n  /** 実行環境を判別するための環境変数。 */\n  const env = process.env['REACT_APP_STAGE_ENV'] || '';\n  if(Environment.isProduction(env)) {\n    return API_PROD_CONFIG;\n  }\n  switch(Environment.isBackendEnv()) {\n    case Environment.PRODUCTION:\n      return API_PROD_CONFIG;\n    case Environment.STAGING:\n      return API_STAGE_CONFIG;\n    case Environment.DEV:\n      return API_DEV_CONFIG;\n    default:\n      return API_STAGE_CONFIG;\n  }\n}\n\n/**\n * 駅すぱあとから返されるインクリメンタルサーチの候補のうち、「福岡」など分かりにくい駅名は置換をする\n * @param points \n * @returns \n */\nconst replaceStationName = (points: Point[] | Point) => {\n  const replaceOneStationName = (point: Point) => {\n    // 置き換え対象の駅リスト\n    const replaceStationList = [{\n      point: \"24761\",\n      replaceName: '福岡(富山県)'\n    }];\n    // 対応駅のうち、PointList\n    const replaceStationPointList = replaceStationList.map((station)=>{\n      return station.point;\n    });\n    if(replaceStationPointList.includes(point.Station.code)) {\n      const replacePoint = replaceStationList.find((station)=>{\n        return station.point === point.Station.code\n      });\n      // インクリメンタルサーチに表示される駅名の置き換えをする\n      if(replacePoint) {\n        point.Station.Name = replacePoint.replaceName;\n      }\n    }\n    return point;\n  }\n  if(Array.isArray(points)) {\n    return points.map((point)=>{\n      return replaceOneStationName(point);\n    })\n  }\n  else {\n    return replaceOneStationName(points);\n  }\n}\n\n/**\n * 駅詳細情報を取得する\n * (広告の出発・到着駅の緯度経度を取得するため)\n * codeとname両方とも入れられた場合にはnameを優先する\n * /station/\n * @param code 取得する駅コード\n * @param name テキストボックスで入力された値。\n * @param optionConfig 独自で指定したAPIの設定など(任意)\n */\nexport async function getStationDetail(code: string | null, name: string | null, lang: Lang = Lang.ja, optionConfig?: object) {\n  // 使用するAPI\n  const useAPIConfig: ApiConfig = getUseAPI();\n  const config = {\n    ...useAPIConfig,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n\n  interface StationDetailParams {\n    code?: string,\n    name?: string,\n    language: Lang,\n    type: string,\n    gcs: string\n  }\n  let params: StationDetailParams = {\n    language: lang,\n    type: 'train:ship:bus',\n    gcs: 'wgs84'\n  };\n  if(code) {\n    params.code = code\n  }\n  if(name) {\n    params.name = name\n  }\n  // あとで見直す(2019/12/23現在)\n  // eslint-disable-next-line no-useless-catch\n  let response = await instance.get(`fetch-station`, { params });\n\n  if (response.status !== 200) {\n    throw new Error('Server Error');\n  }\n\n  // 取得したレスポンスがundefinedではない場合に、レスポンスの値を代入する。\n  if (typeof response.data.ResultSet.Point !== undefined && response.data.ResultSet.Point !== undefined) {\n    return replaceStationName(response.data.ResultSet.Point);\n  }\n  return [];\n}\n\nexport const changeStationDetailToCandidate = (points: Point[]): Candidate[] => {\n  if(!points || !Array.isArray(points)) {\n    return [];\n  }\n  return points.map((p)=>{\n    const geoPoint: GeoLocation | null = p.GeoPoint? convertEWSToLocation(p.GeoPoint): null;\n    return new Candidate(p.Station.Name, p.Station.code, p.Station.Type, geoPoint, p.Prefecture);\n  })\n}\n\n/**\n * 駅すぱあと経路検索を行う\n * /search\n * @param conditions \n */\nexport const getCourses = async (conditions: RequestSearchCourse) => {\n  axios.defaults.headers.post['Content-Type'] = 'application/json';\n  // 使用するAPI\n  const useAPIConfig: ApiConfig = getUseAPI();\n  const instance = axios.create(useAPIConfig);\n  const response = await instance.post('/search', conditions, {\n    headers: { \n      'Content-Type': 'application/json'\n    }\n  });\n  return response.data;\n}\n\n/**\n * 前後の列車・バス・搭乗便一覧を取得する\n * @param conditions\n * @returns\n */\nexport const getPublicZengoDia = async (conditions: RequestDiaList) => {\n  axios.defaults.headers.post['Content-Type'] = 'application/json';\n  // 使用するAPI\n  const useAPIConfig: ApiConfig = getUseAPI();\n  const instance = axios.create(useAPIConfig);\n  const response = await instance.post('/search/dia-list', conditions);\n  if (response.status !== 200) {\n    throw new Error('Server Error');\n  }\n  return response.data.ResultSet;\n}\n\n/**\n * ASWスクレイピング結果のフライト情報を取得する\n * /get-flight-info\n * @param conditions\n * @returns\n */\nexport const getFlightInfo = async (conditions: GetFlightInfoRequest): Promise<GetFlightInfoResponse> => {\n  axios.defaults.headers.post['Content-Type'] = 'application/json';\n  // 使用するAPI\n  const useAPIConfig: ApiConfig = getUseAPI();\n  const instance = axios.create(useAPIConfig);\n  const response = await instance.post('/get-flight-info', conditions);\n\n  return response.data;\n}\n\n/*\n * 運行情報を取得する\n * /train-info\n * @param conditions\n */\nexport const getTrainInfo = async () => {\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  // 使用するAPI\n  const useAPIConfig: ApiConfig = getUseAPI();\n  const instance = axios.create(useAPIConfig);\n  const path = '/train-info';\n  const response = await instance.get(path);\n  if (response.status !== 200) {\n    throw new Error('Server Error');\n  }\n  return response.data.ResultSet;\n}\n\n/**\n * 前後のダイヤより再検索をする\n * /search/ekispert/assign-dia\n * @param request 再検索に必要なRequestBody\n */\nexport const assignDia = async (request: any) => {\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  // 使用するAPI\n  const useAPIConfig: ApiConfig = getUseAPI();\n  const instance = axios.create(useAPIConfig);\n  const path = '/search/ekispert/assign-dia';\n  const response = await instance.post(path, request, {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  });\n  if (response.status !== 200) {\n    throw new Error('Server Error');\n  }\n  return response.data;\n}\n\n/**\n * 回避する機能を実行する\n * /search/interrupt-to-transfer\n * @param request 回避機能実行に必要なRequestBody\n */\nexport const interruptToTransfer = async (request: InterruptToTransferRequest) => {\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  // 使用するAPI\n  const useAPIConfig: ApiConfig = getUseAPI();\n  const instance = axios.create(useAPIConfig);\n  const path = '/search/interrupt-to-transfer';\n  const response = await instance.post(path, request, {\n    headers: {\n      'Content-Type': 'application/json'\n    }\n  });\n  if (response.status !== 200) {\n    throw new Error('Server Error');\n  }\n  return response.data;\n}\n","import axios from 'axios';\nimport { PlaceAutocomplete } from '../google/PlaceAutocomplete';\nimport { PlaceDetail, Result } from '../google/PlaceDetail';\nimport Place from '../google/Place';\nimport { ApiConfig, getUseAPI } from './api';\nimport { Candidate } from '../../components/search/Candidate';\nimport { Lang } from '../../states/query';\n\n/**\n * GooglePlacesAPIから取得した住所情報を整形する\n * @param baseAddress\n * @returns\n */\nexport const formatAddress = (baseAddress: string) => {\n  // TODO: 日本語版のみを想定しているので、今後英語版が来たら対応する\n  const matchList = baseAddress.match(/日本、(.*)/);\n  if(matchList && Array.isArray(matchList) && matchList.length > 1 ) {\n    return matchList[1];\n  }\n  else {\n    return baseAddress;\n  }\n}\n\n/**\n * Google Places APIから候補を取得する処理。\n * @param input テキストボックスで入力した値。\n * @param lang 言語指定(ja/en)\n * @param optionConfig\n */\nexport async function getAutocomplete (input: string, lang: string = 'ja', optionConfig?: ApiConfig) {\n  // 使用するAPI\n  const useAPIConfig: ApiConfig = getUseAPI();\n  const config = {\n    ...useAPIConfig,\n    ...optionConfig,\n  };\n  const instance = axios.create(config);\n  const params = {\n    input,\n    // 地点候補の言語指定。\n    language: lang,\n    // 日本のデータのみ取得するよう指定。\n    components: 'country:jp',\n  };\n  // あとで見直す(2020/02/20現在)\n  // eslint-disable-next-line no-useless-catch\n  try {\n    let response = await instance.get(`/places/autocomplete`, { params });\n\n    // ステータスコードが200ではない場合。\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n\n    // 施設(地点)のデータを取得する。\n    const placeAutocomplete: PlaceAutocomplete = response.data;\n    // 取得した施設(地点)のデータを画面上に表示する候補の形式に変換する。\n    const candidates = placeAutocomplete.predictions.map((p) => {\n      const name = p.structured_formatting ? p.structured_formatting.main_text : p.description;\n      return new Candidate(name, p.place_id, 'place', undefined, undefined, formatAddress(p.description));\n    })\n    return candidates;\n  } catch (err) {\n    throw err;\n  }\n}\n\n/**\n * 地点詳細(/places/details)を取得する。\n * (AutoCompleteで取得した地点の緯度経度を取得するために利用する。)\n * @param place_id ユーザーが指定した地点のID。(AutoCompleteで取得したplace_id)\n * @param optionConfig\n */\nexport async function getPlaceDetail (place_id: string, optionConfig?: ApiConfig) {\n  // 使用するAPI\n  const useAPIConfig: ApiConfig = getUseAPI();\n  const config = {\n    ...useAPIConfig,\n    ...optionConfig,\n  };\n  const instance = axios.create(config);\n  const params = {\n    place_id,\n    fields: 'geometry,address_components,type,name,formatted_address',\n    // テキスト部分はログ記録時のみ利用するため、日本語で固定とする。(2020/07/15現在。)\n    language: 'ja',\n  };\n  // あとで見直す(2020/02/20現在)\n  // eslint-disable-next-line no-useless-catch\n  try {\n    let response = await instance.get(`/places/details`, { params });\n\n    // ステータスコードが200ではない場合。\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n    // Place Detailsのレスポンス部分。\n    const data: PlaceDetail = response.data;\n    // 施設(地点)の詳細データをインスタンス化して返す。\n    return new Place(data.result);\n  } catch (err) {\n    throw err;\n  }\n}\n\n/**\n * 位置情報より地点詳細情報を取得する(/places/geocode/)\n */\nexport async function getGeocode(latlng: string, lang: Lang = Lang.ja, optionConfig?: ApiConfig) {\n  // 使用するAPI\n  const useAPIConfig: ApiConfig = getUseAPI();\n  const config = {\n    ...useAPIConfig,\n    ...optionConfig,\n  };\n  const instance = axios.create(config);\n  const params = {\n    latlng,\n    language: lang\n  };\n  // あとで見直す(2020/02/20現在)\n  // eslint-disable-next-line no-useless-catch\n  try {\n    let response = await instance.get(`/places/geocode`, { params });\n\n    // ステータスコードが200ではない場合。\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n\n    // 施設(地点)の詳細データを取得する。\n    return response.data.results.map((x: Result)=>{\n      return new Place(x);\n    });\n  } catch (err) {\n    throw err;\n  }\n}\n","import axios from 'axios';\nimport { PlaceAutocomplete } from './PlaceAutocomplete';\nimport { PlaceDetail, Result } from './PlaceDetail';\nimport { Candidate } from './../../components/search/Candidate';\nimport Place from './Place';\nimport { Lang } from '../../states/query';\nimport { formatAddress } from '../public/googleApi';\n\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: process.env['REACT_APP_API_ENDPOINT'] as string,\n  timeout: 7000,\n};\n\n/**\n * Google Places APIから候補を取得する処理。\n * @param input テキストボックスで入力した値。\n * @param lang 言語指定(ja/en)\n * @param optionConfig\n */\nexport async function getClosedAutocomplete (input: string, lang: string = 'ja', optionConfig?: ApiConfig) {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  const instance = axios.create(config);\n  const params = {\n    // 入力文字列に補正をかける\n    input,\n    // 地点候補の言語指定。\n    language: lang,\n    // 日本のデータのみ取得するよう指定。\n    components: 'country:jp',\n  };\n  // あとで見直す(2020/02/20現在)\n  // eslint-disable-next-line no-useless-catch\n  try {\n    let response = await instance.get(`google/places/autocomplete`, { params });\n\n    // ステータスコードが200ではない場合。\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n\n    // 施設(地点)のデータを取得する。\n    const placeAutocomplete: PlaceAutocomplete = response.data;\n    // 取得した施設(地点)のデータを画面上に表示する候補の形式に変換する。\n    const candidates = placeAutocomplete.predictions.map((p) => {\n      const name = p.structured_formatting ? p.structured_formatting.main_text : p.description;\n      return new Candidate(name, p.place_id, 'place', undefined, undefined, formatAddress(p.description))\n    })\n    return candidates;\n  } catch (err) {\n    throw err;\n  }\n}\n\n/**\n * 地点詳細(/places/detail)を取得する。\n * (AutoCompleteで取得した地点の緯度経度を取得するために利用する。)\n * @param place_id ユーザーが指定した地点のID。(AutoCompleteで取得したplace_id)\n * @param optionConfig\n */\nexport async function getClosedPlaceDetail(place_id: string, optionConfig?: ApiConfig, lang: Lang = Lang.ja) {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  const instance = axios.create(config);\n  const params = {\n    place_id,\n    fields: 'geometry,address_components,type,name,formatted_address',\n    // テキスト部分はログ記録時のみ利用するため、日本語で固定とする。(2020/07/15現在。)\n    // タクシー仮予約画面多言語た対応のため、該当箇所は指定の言語で取得できるようにする(2022/02/22現在)\n    language: lang\n  };\n  // あとで見直す(2020/02/20現在)\n  // eslint-disable-next-line no-useless-catch\n  try {\n    let response = await instance.get(`google/places/detail`, { params });\n\n    // ステータスコードが200ではない場合。\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n    // Place Detailsのレスポンス部分。\n    const data: PlaceDetail = response.data;\n    if(!response.data.result) {\n      throw new Error(response.data.error_message)\n    }\n    // Response.status結果が異常の場合にはエラーを返す\n    if(data.status !== 'OK') {\n      throw new Error(JSON.stringify(data));\n    }\n    // 施設(地点)の詳細データをインスタンス化して返す。\n    return new Place(data.result);\n  } catch (err) {\n    throw err;\n  }\n}\n\n/**\n * 位置情報より地点詳細情報を取得する(/places/geocode/)\n */\nexport async function getClosedGeocode(latlng: string, lang: Lang = Lang.ja, optionConfig?: ApiConfig) {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  const instance = axios.create(config);\n  const params = {\n    latlng,\n    language: lang\n  };\n  // あとで見直す(2020/02/20現在)\n  // eslint-disable-next-line no-useless-catch\n  try {\n    let response = await instance.get(`google/places/geocode`, { params });\n\n    // ステータスコードが200ではない場合。\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n\n    // 施設(地点)の詳細データを取得する。\n    return response.data.results.map((x: Result)=>{\n      return new Place(x);\n    });\n  } catch (err) {\n    throw err;\n  }\n}\n","import luxon from \"luxon\";\nconst { DateTime } = require('luxon')\n\n/**\n * ISO8601形式文字列よりDateTime型に変換する\n * @param iso8601 ISO8601形式時刻表示文字列\n * @return luxon.DateTime型の時刻情報\n */\nexport const toLuxonDateTime = (iso8601: string): luxon.DateTime => {\n  return DateTime.fromISO(iso8601, { zone: 'Asia/Tokyo', setZone: true });\n}\n\n/**\n * UNIXTIMEよりDateTime型に変換する\n * @param unixtime UNIXTIMEの時刻情報\n * @return luxon.DateTime型の時刻情報\n */\nexport const toLuxonDateTimeFromUnixTime = (unixtime: number): luxon.DateTime => {\n  return DateTime.fromSeconds(unixtime, { zone: 'Asia/Tokyo' });\n}\n\n/**\n * Date型よりDateTime型に変換する\n * @param date JavaScriptデフォルトのDate型\n * @returns luxon.DateTime型の時刻情報\n */\nexport const toLuxonDateTimeFronJSDate = (date: Date): luxon.DateTime => {\n  return DateTime.fromJSDate(date, { zone: 'Asia/Tokyo' });\n}\n\n/**\n * 現在時刻を取得する\n * @return luxon.DateTime型の現在時刻情報\n */\nexport const getNowLuxonDateTime = (): luxon.DateTime  => {\n  return DateTime.now()\n    .set({ second: 0, millisecond: 0 })\n    .setZone('Asia/Tokyo');\n}\n\n/**\n * yyyyMMddHHmm形式の日時の文字列をluxon.DateTime型にパースする。\n * @param dateStr yyyyMMddHHmm形式の日時の文字列\n * @returns luxon.DateTime型の時刻情報\n */\nexport const parseFromyyyyMMddHHmm = (dateStr: string): luxon.DateTime => {\n  return DateTime.fromFormat(dateStr, 'yyyyMMddHHmm', { zone: 'Asia/Tokyo' })\n}\n\n/**\n * 指定の日付の0時0分に設定する\n * @param date 任意の時刻情報\n * @returns 0時0分0秒に設定した時刻情報\n */\nexport const setBaseDay = (date: luxon.DateTime): luxon.DateTime => {\n  return date.set({\n    hour: 0,\n    minute: 0,\n    second: 0,\n    millisecond: 0\n  })\n}\n","import { parse } from \"date-fns\";\nimport { getNowLuxonDateTime, toLuxonDateTimeFromUnixTime } from \"./luxonUtil\";\nimport { isNumber } from \"./regExpUtils\";\n\nclass URLParams {\n  searchParams: URLSearchParams;\n\n  constructor(path: string) {\n    this.searchParams = new URLSearchParams(path);\n  }\n\n  /**\n   * 引数で指定されたキーに対応する値を取得する。\n   * @param key パラメーターのキー文字列。\n   * @param type 取得するパラメータの型\n   */\n  getParam(key: string, type: string) {\n    switch(type) {\n      case 'string':\n        return this.getStringParam(key);\n      case 'number':\n        return this.getNumberParam(key);\n      case 'boolean':\n        return this.getBooleanParam(key);\n      case 'date':\n        return this.getDateParam(key);\n      case 'unixtime':\n        return this.getDateFromUnixTimeMilisecondsParam(key);\n      default:\n        return null;\n    }\n  }\n\n  checkParams(keys: string[]): boolean {\n    const result = keys.find((k)=>{\n      return this.searchParams.get(k) === null;\n    })\n    return result === undefined;\n  }\n\n  /**\n   * 引数で指定されたキーに対応する値を取得する。\n   * @param key パラメーターのキー文字列。\n   */\n  getStringParam(key: string): string | null {\n    // nullとなる場合は空文字を返す。\n    return (this.searchParams.get(key) !== null) ? this.searchParams.get(key) : '';\n  }\n\n  /**\n   * 引数で指定されたキーに対応する値を数値型として取得する。\n   * @param key パラメーターのキー文字列。\n   */\n  getNumberParam(key: string): number {\n    // nullとなる場合は0を返す。\n    const param = (this.searchParams.get(key) !== null) ? this.searchParams.get(key) : '0';\n    return Number.parseInt((param === null) ? '0' : param);\n  }\n\n  /**\n   * 引数で指定されたキーに対応する値をfloat型の浮動小数点数値型として取得する。\n   * @param key パラメーターのキー文字列。\n   */\n  getFloatParam(key: string): number {\n    // nullとなる場合は0を返す。\n    const param = (this.searchParams.get(key) !== null) ? this.searchParams.get(key) : '0';\n    return Number((param === null) ? '0' : param);\n  }\n\n  /**\n   * 引数で指定されたキーに対応する値をBoolean型として取得する。\n   * @param key パラメーターのキー文字列。\n   */\n  getBooleanParam(key: string): boolean {\n    // nullとなる場合はfalseを返す。\n    const param = (this.searchParams.get(key) !== null) ? this.searchParams.get(key) : '';\n    return param === 'true' ? true : false;\n  }\n\n  /**\n   * 引数で指定されたキーに対応する値(yyyyMMdd形式の値)をDate型として取得する。\n   * @param key パラメーターのキー文字列。\n   * @param defaultDate パラメーターを解析できなかった時のデフォルト日付\n   */\n  getDateParam(key: string, defaultDate: Date = new Date()): Date {\n    // 空文字やnullとなる場合は現在日時を返す。\n    const param = (this.searchParams.get(key) !== null) ? this.searchParams.get(key) : '';\n    return (param && param !== null) ? parse(param, 'yyyyMMdd', defaultDate) : defaultDate;\n  }\n\n  /**\n   * 引数で指定されたキーに対応する値(UNIXTIME Miliseconds)をDate型として取得する。\n   * @param key パラメーターのキー文字列。\n   * @param defaultDate パラメーターを解析できなかった時のデフォルト日付\n   */\n  getDateFromUnixTimeMilisecondsParam(key: string, defaultDate: Date = new Date()): Date {\n    // 空文字やnullとなる場合は現在日時を返す。\n    const param = (this.searchParams.get(key) !== null) ? this.searchParams.get(key) : '';\n    return (param && param !== null) ? new Date(Number(param)) : defaultDate;\n  }\n\n  /**\n   * 引数で指定されたキーに対応する値(UNIXTIME Miliseconds)を Luxon.DateTime 型として取得する。\n   * @param key パラメーターのキー文字列。\n   * @param defaultDate パラメーターを解析できなかった時のデフォルト日付\n   */\n  getLuxonDateTimeUnixTimeMilisecondsParam(key: string, defaultDate: luxon.DateTime = getNowLuxonDateTime()): luxon.DateTime {\n    // 空文字やnullとなる場合は現在日時を返す。\n    const param = (this.searchParams.get(key) !== null) ? this.searchParams.get(key) : null;\n    // UnixTime Milisecondsで来るので、UnixTimeに変換する\n    return (param && param !== null && isNumber(param)) ? toLuxonDateTimeFromUnixTime(Number(param)/1000) : defaultDate;\n  }\n\n  /**\n   * 引数で指定されたキーに対応する値が存在するかを確認する。\n   * @param key パラメーターのキー文字列。\n   */\n  hasParam(key: string): boolean {\n    return this.searchParams.has(key);\n  }\n}\n\nexport default URLParams;","/**\n * 参照する際などにあたって住所文字列の変換をする。\n * @param value 住所など変換をかけたい文字列。\n */\n export function convertLetter(value: string) {\n  // 大きい「ケ」を「ヶ」に変更する。\n  return value.replace(/ケ/g, 'ヶ');\n}\n","import axios from \"axios\";\nimport { setTaxiEndpoint } from \"../GetReservation\";\nimport { GetDirectionAndFareParams, GetDirectionAndFareSamplesParams } from \"./models/getFareSamplesParams\";\n\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: process.env['REACT_APP_API_ENDPOINT'] as string,\n  timeout: 60000,\n};\n\n/**\n * 必要なパラメーターを満たしているか\n * @param params チェックパラメーター\n * @param isTemporaryReservation 仮予約画面か\n */\nconst checkParams = (params: GetDirectionAndFareParams | GetDirectionAndFareSamplesParams) => {\n  // to空港の場合、出発地点・出発地点座標がないとエラーにする\n  if(!(params.pointInfo?.latLng && params.pointInfo?.label && params.pointInfo?.latLngForPriceCalc && params.pointInfo?.labelForPriceCalc)) {\n    throw new Error('地点情報の要素が足りていません')\n  }\n}\n\n/** タクシー経路料金算出APIを呼び出す */\nexport async function getDirectionAndFareAPI(params: GetDirectionAndFareParams) {\n  // 必要なパラメーターが足りているかチェック\n  checkParams(params)\n  const path = setTaxiEndpoint('get-fare-info');\n  const config = {\n    ...DEFAULT_API_CONFIG,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  /** axiosのインスタンス。 */\n  const instance = axios.create(config);\n  // 仮予約APIにPOSTメソッドでリクエストする。\n  const response = await instance.post(path, params);\n  // Response結果が正常ならデータを返す\n  // 距離ラベルと料金ラベルが取れない時にもエラーを返す\n  if(response.status === 200 && response.data && response.data.distanceLabel && response.data.durationLabel) {\n    return response.data;\n  }\n  else {\n    // エラーが発生した場合は、debugレベルでエラーログを出力するのみとする。\n    // dev環境のみエラーログを出力\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n      console.error(response);\n    }\n    return null;\n  }\n}\n\n/** 汎用タクシー経路料金算出APIを呼び出す */\nexport async function getDirectionAndFareSamplesAPI(params: GetDirectionAndFareSamplesParams) {\n  // 必要なパラメーターが足りているかチェック\n  checkParams(params)\n  const path = setTaxiEndpoint('get-fare-samples-info');\n  const config = {\n    ...DEFAULT_API_CONFIG,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  /** axiosのインスタンス。 */\n  const instance = axios.create(config);\n  // 仮予約APIにPOSTメソッドでリクエストする。\n  const response = await instance.post(path, params);\n  // Response結果が正常ならデータを返す\n  // 距離ラベルと料金ラベルが取れない時にもエラーを返す\n  if(response.status === 200 && response.data) {\n    return response.data;\n  }\n  else {\n    // エラーが発生した場合は、debugレベルでエラーログを出力するのみとする。\n    // dev環境のみエラーログを出力\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n      console.error(response);\n    }\n    return null;\n  }\n}","import { TaxiCompanyList } from \"../../GetDirectionAndFare/models/getFareSamplesParams\";\n\nexport type TaxiCompanyConfigurations = {\n  [key in TaxiCompanyList]: TaxiCompanyConfiguration;\n};\n\nexport interface SCClickSection {\n  asw: string,\n  airportAccess: string,\n  chatan: string,\n  fukushima: string\n}\n\n\nexport interface TaxiCompanyConfiguration {\n  name:                         string;\n  companyName:                  string;\n  displayName:                  string;\n  operatingCompanyName:         string;\n  temporaryDisplayName:         string;\n  hasPAYG_Tariff:               boolean;\n  supportAirports:              string[];\n  defaultAirportCode:           string;\n  scClick: {\n    result: string,\n    temporaryReservation: SCClickSection,\n    reservation: SCClickSection\n  };\n  cyName: {\n    result: string,\n    logo:   string\n  };\n  logo: {\n    alt: string\n  },\n  contact: {\n    isLinkMailAddress: string,\n    messages: string[]\n  }\n  limit: {\n    errorMessage: string,\n    limitDays: number,\n    limitHours: number\n  }\n  tariffType: {\n    [key: string]: string\n  };\n  supportAMC: string[],\n  supportAMCPeriod: {\n    start: string,\n    end: string\n  },\n  supportPlacardName: boolean,\n  ui: {\n    // 対応荷物\n    bags: Element[],\n    // 選択できる車種\n    carTypes: Element[],\n    // 支払い方法\n    paymentMethod: Element[],\n    specifiedMethod: {\n      [key: string]: {\n        component: string;\n        airport?: {\n          [key: string]: boolean;\n        }\n      }\n    }\n  }\n  whenTooLongDistance?: {\n    bookable: boolean,\n    nextAction: string\n  },\n  whenUnsupportedFixedFareArea: {\n    bookable: boolean,\n    nextAction: string\n  };\n  defaultCenter: {\n    [key: string]: {\n      municipality: string,\n      position: {\n        lat: number,\n        lng: number\n      }\n    }\n  },\n  timePattern: TaxiTimePattern,\n  supportDirection: string,\n  defaultFlightPattern: {\n    pickup: string[],\n    dropOff: string[]\n  }\n}\n\nexport interface Element {\n  maxQuantity?: number;\n  id: string,\n  label: string\n}\n\n/** タクシー日付選択タイプ */\nexport enum TaxiTimePattern {\n  /** 通常通り日付を選択できる */\n  normal = 'normal',\n  /** 選択肢の中から時刻を選択する */\n  pulldown = 'pulldown'\n}\n","import { TaxiCompanyList } from \"../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams\";\nimport { Lang } from \"../../../../states/query\";\nimport { getNowLuxonDateTime, setBaseDay } from \"../../../../utils/luxonUtil\";\n\nexport class CommonTaxiUtils {\n  limit_days:  number;\n  limit_hours: number;\n  company:     TaxiCompanyList;\n  targetAirport: string;\n  constructor(limit_days: number, limit_hours: number, company: TaxiCompanyList, targetAirport: string) {\n    this.limit_days = limit_days;\n    this.limit_hours = limit_hours;\n    this.company = company;\n    this.targetAirport = targetAirport;\n  }\n\n  /**\n   * 仮予約画面で予約受付期間外を選んだ際に表示するメッセージ\n   * @param originErrorMessage バックエンドから取得した表示するメッセージ\n   */\n  getErrorMessage(originErrorMessage: string, lang: Lang): string {\n    if(this.isLimoTaxiTYO()) {\n      if(lang === Lang.ja) {\n        return '乗車日時は2日後以降を指定してください。'\n      }\n      else {\n        return 'Please specify a ride date and time from two days’ time on.';\n      }\n    }\n    else {\n      return originErrorMessage;\n    }\n  }\n\n  /**\n   * limoTaxiかつHNDかNRTの時には予約受付締切を2日前に設定する\n   * この例外設定を適用するか判定する\n   * @param targetAirport 搭乗対象の空港コード\n   */\n  isLimoTaxiTYO() {\n    const isLimoTaxi = (this.company === TaxiCompanyList.limoTaxi);\n    const isTYO = ['HND', 'NRT', 'TYO'].includes(this.targetAirport);\n    return isLimoTaxi && isTYO;\n  }\n\n  /**\n   * 現在時刻がイースタンタクシーが予約可能期限内であるかを判別する。\n   * TODO: isAvalableに統合する\n   * @param ridingDate 乗車日\n   */\n  isAvalableEastern(ridingDate: luxon.DateTime): boolean {\n    // そのまま differenceInDays を使うと 23:59と 00:01 の差は0になるので、分と秒は0に一旦揃える\n    const rideingDateBase = setBaseDay(ridingDate);\n    const nowDateBase = setBaseDay(getNowLuxonDateTime());\n    // limotaxiの場合かつ、羽田・成田の場合には2日前までに予約すればよい\n    const limitDays = this.isLimoTaxiTYO() ? 1: this.limit_days;\n    /** 不正な乗車日時である(現在日時のX日後以前)かを表すフラグ。 */\n    return rideingDateBase.diff(nowDateBase, 'days').days > limitDays;\n  }\n\n  /**\n   * 現在時刻がタクシーが予約可能期限内であるかを判別する。\n   * @param flightDate 搭乗日の日時。\n   * @param targetAirport 搭乗対象の空港コード\n   */\n  isAvalable(flightDate: luxon.DateTime): boolean {\n    /** イースタンだけロジックが違うのでこちらにて対応 */\n    if(this.company === TaxiCompanyList.eastern || this.company === TaxiCompanyList.limoTaxi) {\n      return this.isAvalableEastern(flightDate);\n    }\n    /** タクシーの予約期限の日付。 */\n    const deadlineDate = setBaseDay(\n        flightDate.minus({\n        day: this.limit_days\n      })\n    ).set({\n      hour: this.limit_hours\n    })\n    // 搭乗日のX日前のXX時より前である場合のみ、予約可能とする。\n    return getNowLuxonDateTime() < deadlineDate;\n  }\n\n  /**\n   * 現在時刻がタクシーを予約できない日付の場合、予約できる代替の日付を返す\n   * @param flightDate 搭乗日の日時。\n   * @param nowDate 端末の現在時刻\n   * @return 代替の日付\n   */\n  getAvailableDate(flightDate: luxon.DateTime): luxon.DateTime {\n    /** イースタンだけロジックが違うのでこちらにて対応 */\n    if(this.company === TaxiCompanyList.eastern || this.company === TaxiCompanyList.limoTaxi) {\n      if(this.company === TaxiCompanyList.eastern || this.isLimoTaxiTYO()) {\n        return getNowLuxonDateTime().plus({\n          day: 2\n        });\n      }\n      else {\n        return getNowLuxonDateTime().plus({\n          day: 4\n        })\n      }\n    }\n    if(this.isAvalable(flightDate)) {\n      return flightDate;\n    }\n    else {\n      if(getNowLuxonDateTime().hour >= this.limit_hours) {\n        return getNowLuxonDateTime().plus({\n          days: (this.limit_days + 1)\n        })\n      }\n      else {\n        return getNowLuxonDateTime().plus({\n          days: this.limit_days\n        })\n      }\n    }\n  }\n}\n","/* eslint react-hooks/exhaustive-deps: 0 */\n\nimport React from 'react';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport Coordinates from '../Map/Coordinates';\nimport { isEmail } from '../../../../../../utils/regExpUtils';\nimport PickupPattern from './PickupPattern';\nimport { TemporaryReservationParams } from '../../../../../../services/taxi/TemporaryReservation/TemporaryReservationParams';\nimport luxon from \"luxon\";\nimport { getRecaptchaToken } from '../../../../../../services/google/GoogleReCaptcha';\nimport { submitTemporaryReservation } from '../../../../../../services/taxi/TemporaryReservation';\nimport { getClosedGeocode } from '../../../../../../services/google/api';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { switchisLoading, switchUseV2, updateErrorMessage, updateTaxiCompanyConfigurations } from '../../../../../../actions/generalAction';\nimport { isValidFLight } from '../../common/RegExp';\nimport { Location }  from '../../../../../../../src/services/google/PlaceDetail';\n\nimport scClick from '../../../../../common/ScClick';\nimport URLParams from '../../../../../../utils/getParams';\nimport Place from '../../../../../../services/google/Place';\nimport { convertLetter } from '../../common/Address';\nimport Cookies from 'js-cookie';\nimport { SelectPoint } from '../../../MiyakoTaxi/data/SeaGaiaNearbyFacilities';\nimport { getDirectionAndFareAPI} from '../../../../../../services/taxi/GetDirectionAndFare';\nimport { AlertLabel, convertStringToTaxiCompany, FlightType, GetDirectionAndFareOperation, GetDirectionAndFareParams, GetDirectionAndFareResponse, TaxiCompanyList } from '../../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { ComponentKey, getTaxiCompanyConfiguration, GetTaxiCompanyConfParams } from '../../../../../../services/taxi/GetTaxiMetaInfo';\nimport { TaxiCompanyConfiguration, TaxiCompanyConfigurations, TaxiTimePattern } from '../../../../../../services/taxi/GetTaxiMetaInfo/model/taxiCompanyConf';\nimport Environment from '../../../../../../utils/environment';\nimport { CommonTaxiUtils } from '../../../CommonTaxi/CommonTaxiDateUtils';\nimport { useTranslation } from 'react-i18next';\nimport { changeLang, Lang } from '../../../../../../states/query';\nimport { changeLanguage } from '../../../../../../utils/lang';\nimport { getNowLuxonDateTime } from '../../../../../../utils/luxonUtil';\nimport { State } from '../../../../../../reducers';\nimport * as holiday from '@holiday-jp/holiday_jp';\n\nexport interface BookingTaxiQueryParams {\n  // 出発案内か\n  isDeparture: boolean,\n  // 発着地点名\n  pointName: string,\n  // 発着地点アドレス\n  pointAddress: string,\n  // 発着地点緯度\n  pointLat: number,\n  // 発着地点経度\n  pointLng: number,\n  // 発着空港コード\n  airportCode: string,\n  // 搭乗便ナンバー\n  flightNumber: string,\n  // フライトの発着時刻\n  flightDate: luxon.DateTime,\n  // タクシー乗車時刻\n  rideDate: luxon.DateTime,\n  // 国内線か\n  isDomestic: boolean,\n  // ターミナル名\n  terminal: string,\n  // 搭乗・到着ゲート名\n  gate: string,\n  // 連携タクシー\n  company: TaxiCompanyList,\n  // 連携パラメーター(宮交タクシーのシーガイア連携で用いる)\n  mode: string,\n  // 遷移元リファラー情報\n  referrer: string,\n  // 言語情報\n  lang: string,\n  // デバッグ用隠しパラメーター\n  // 実際にメールを送らないか\n  dryRun?: string,\n  // 発着地点日本語アドレス\n  pointJPAddress: string,\n  // 発着地点日本語地点名\n  pointJPName: string,\n  // googleDirectionAPIに投げる出発時刻(フライト出発時刻に優越する)\n  googleAPIDepDate: luxon.DateTime\n}\n\nexport enum AirportTransferTaxiMapMode {\n  // マップ選択モード\n  map = 'map',\n  // 選択モード\n  select = 'select'\n}\n\nenum REFERRER_TYPE {\n  /** ASWから仮予約画面に遷移 */\n  asw = 'asw',\n  /** 空港アクセスナビより遷移 */\n  airportAccess = 'airportAccess',\n  /** 北谷HPより遷移 */\n  chatan = 'chatan',\n  /** 福島空港サイトより遷移 */\n  fukushima = 'fukushima'\n}\n\n/**\n * リファラータイプを返却する\n * @param referrer クエリから受け取ったリファラー値\n * @param taxiCompany 参照しているタクシー事業者\n * @returns\n */\nexport const getSCCkickType = (referrer?: string, taxiCompany?: TaxiCompanyList) => {\n  // 結果画面からの経由で来たか判定\n  // airport_access: 空港アクセスナビ・旅CUBEから来たと判定\n  // chatan: タクシー会社が那覇ハイヤーの場合のみ、北谷MaaSサイトから来たと判定。\n  // それ以外: ASWから来たと判定(実際には referrer=asw で飛んでくる)\n  switch(referrer) {\n    case 'airport_access':\n    case 'tabicube':\n      return REFERRER_TYPE.airportAccess;\n    case 'chatan':\n      if(taxiCompany === undefined) {\n        return REFERRER_TYPE.chatan;\n      }\n      else if(taxiCompany === TaxiCompanyList.nahahire) {\n        return REFERRER_TYPE.chatan;\n      }\n      else {\n        return REFERRER_TYPE.asw;\n      }\n    case 'fukushima':\n      return REFERRER_TYPE.fukushima;\n    default:\n      return REFERRER_TYPE.asw\n  }\n}\n\n/** 未選択状態を識別する文字列 */\nexport const UNSELECTED_RIDING_DATE_STRING = '----------';\n\n/**\n * タクシー予約画面の情報に関するカスタムフック。\n * @returns flightDate - 指定されたフライト日時。\n * @returns setFlightDate - フライト日時日時を更新する関数。\n * @returns email - メールアドレス。\n * @returns setEmail - メールアドレスを更新する関数。\n * @returns isEmptyEmail - メールアドレス欄が空であるかを表すフラグ。\n * @returns isInvalidEmail - 入力された文字列がメールアドレスの形式になっていないかを表すフラグ。\n */\nexport function useForm() {\n  const history = useHistory();\n  const dispatch = useDispatch();\n  const location = useLocation();\n  const { t, i18n } = useTranslation();\n  const useRecaptchaV2 = useSelector((state: State) => state.general.useV2);\n  /** 乗車日時の初期値。(現在日時より5日後を設定する。) */\n  const defaultDate = getNowLuxonDateTime().plus({ hours: 120 });\n\n  const [ airportCode, setAirportCode ] = React.useState('HND');\n  const [ center, setCenter ] = React.useState(Coordinates.TOKYO_STATION);\n  const [ markerPoint, setMarkerPoint ] = React.useState(Coordinates.TOKYO_STATION);\n  const [ pointName, setPointName ] = React.useState('');\n  // 料金取得用日本語地点情報\n  const [ placeJP, setPlaceJP ] = React.useState<Place|null>(null);\n  const [ flight, setFlight ] = React.useState('');\n  const [ flightDate, setFlightDate ] = React.useState<luxon.DateTime>(defaultDate);\n  const [ ridingDate, setRidingDate ] = React.useState<luxon.DateTime>(defaultDate);\n  const [ selectFlightData, setSelectFlightData ] = React.useState(UNSELECTED_RIDING_DATE_STRING);\n  const [ isSubmitted, setSubmitted ] = React.useState(false);\n\n  /** 住所が空であるかを表すフラグ。 */\n  const [ isEmptyAddress, setEmptyAddress ] = React.useState(false);\n\n  const [ email, setEmail ] = React.useState('');\n  /** メールアドレス欄が空であるかを表すフラグ。 */\n  const [ isEmptyEmail, setEmptyEmail ] = React.useState(false);\n  /** メールアドレスの形式になっていない文字列であるかを表すフラグ。 */\n  const [ isInvalidEmail, setInvalidEmail ] = React.useState(false);\n  /** 利用できないメールアドレスであるかを表すフラグ。 */\n  const [ isUnavalableEmail, setUnavalableEmail] = React.useState(false);\n\n  /** 便名が空であるかを表すフラグ。 */\n  const [ isEmptyFlight, setEmptyFlight ] = React.useState(false);\n  /** 便名の形式になっていない文字列であるかを表すフラグ。 */\n  const [ isInvalidFlight, setInvalidFlight ] = React.useState(false);\n  /** ユーザーに再試行してほしい(=もう一度予約ボタンを押してもらいたい)場合であるかを表すフラグ。 */\n  const [ isRequiredRetry, setRequiredRetry] = React.useState(false);\n  /** 予約処理に失敗したかを表すフラグ。 */\n  const [ isFailed, setFailed] = React.useState(false);\n  /** 予約期限を過ぎているかを表すフラグ。 */\n  const [ isOverDeadline, setOverdeadline ] = React.useState(false);\n  /** 日付に関するアラートに表示するメッセージを管理する */\n  const [ invalidFlightErrorMessage, setInvalidFlightErrorMessage ] = React.useState(\"\");\n  /** ご利用便日時に関するアラートに表示するメッセージを管理する */\n  const [ invalidFlightDateErrorMessage, setInvalidFlightDateErrorMessage ] = React.useState(\"\");\n  /** reCaptcha v2での再検証を促すかを表すフラグ。 */\n  const [ needRetryRecaptcha, switchNeedRetryRecaptcha ] = React.useState(false);\n  /** 送迎タイプが許可されたパターンかを判定するフラグ */\n  const [ disallowSupportDirection, switchDisallowSupportDirection ] = React.useState(false);\n  /** 送迎タイプが便選択の場合、便選択がデフォルトかを判定するフラグ */\n  const [ invalidFlightPattern, switchInvalidFlightPattern ] = React.useState(false);\n\n  // TODO: やってることが pickupPattern とかぶるので後々削除する\n  const [ toAirport, setToAirport ] = React.useState(true);\n  const [ pickupPattern, setPickupPattern ] = React.useState(PickupPattern.TO_AIRPORT);\n\n  /** 市区町村までの住所。 */\n  const [municipality, setMunicipality] = React.useState('東京都千代田区');\n  /** 送迎地点の地点情報 */\n  const [place, setPlace] = React.useState<Place>();\n  /** 空港送迎タクシーの対象エリアであるかを表すフラグ。 */\n  const [isSubjectArea, switchSubjectArea] = React.useState(true);\n  /** 距離の数値(m) */\n  const [discance, setDistance] = React.useState(0);\n  /** 距離の表示用ラベル */\n  const [distanceText, setDistanceText] = React.useState('');\n  /** 所要時間の数値(秒) */\n  const [duaration, setDuration] = React.useState(0);\n  /** 所要時間の表示ラベル */\n  const [durationText, setDurationText] = React.useState('');\n  /** 基本料金 */\n  const [fee, setFee] = React.useState(0);\n  /** トータルの料金 */\n  const [totalFee, setTotalFee] = React.useState(0);\n  /** 料金ラベル */\n  const [feeLabel, setFeeLabel] = React.useState('');\n  /** 注意事項ラベル */\n  const [notesLabel, setNotesLabel] = React.useState<string[]>([]);\n  /** アラートラベル */\n  const [alertLabel, setAlertLabel] = React.useState<AlertLabel[]>([]);\n  /** 対象となるタクシー会社 */\n  const [taxiCompany, setTaxiCompany] = React.useState<TaxiCompanyList>(TaxiCompanyList.limoTaxi);\n\n  /** リクエスト回数。 */\n  const [requestCount, setRequestCount] = React.useState(1);\n\n  /** 発着地点が編集済みであるかを表すフラグ。 */\n  const [ isEdited, switchEdited ] = React.useState(false);\n  /** 初期アクセス時にクエリから値を読み取ったかを判定するフラグ */\n  const [ isEndInit, switchIsEndInit ] = React.useState(false);\n  /** クエリパラメーター */\n  const [ params, setParams ] = React.useState<BookingTaxiQueryParams|null>(null);\n  /** Selectモードの際に選択した地点 */\n  const [ selectPointNumber, setSelectPointNumber ] = React.useState(\"0\");\n  /** Selectモードの時の選択できる地点一覧 */\n  const [ pointList, setPointList ] = React.useState<SelectPoint[]>([]);\n  /** タクシー料金APIに問い合わせが完了しているか */\n  const [ isEndCallTaxiAPI, switchIsEndCallTaxiAPI ] = React.useState(true);\n  /** タクシー料金取得が失敗したか */\n  const [ isFailCallTaxiAPI, switchIsFailCallTaxiAPI ] = React.useState(false);\n  /** 対象のタクシー会社のメタデータ */\n  const [ taxiCompanyConf, setTaxiCompanyConf ] = React.useState<TaxiCompanyConfiguration|null>(null);\n  /** 対象空港リスト */\n  const [ targetAirportCodeList, setTargetAirportCodeList ] = React.useState<string[]>([]);\n  /** モード */\n  const [ mode, setMode ] = React.useState<AirportTransferTaxiMapMode>(AirportTransferTaxiMapMode.map);\n  /** 表示されている料金のタイプ */\n  const [ fareType, setFareType ] = React.useState(\"\");\n  /** 料金のステータス情報(予約可能かどうか) */\n  const [ isAvailableReservation, switchIsAvailableReservation ] = React.useState<boolean>(true);\n  /** 言語情報 */\n  const [ lang, setLang ] = React.useState<Lang>(Lang.ja);\n  /** 初期状態で表示されるラベル */\n  const [ defaultPointlabel, setDefaultPointLabel ] = React.useState<string>('');\n  /** 日付選択タイプ */\n  const [ timePattern, setTimePattern ] = React.useState<TaxiTimePattern>(TaxiTimePattern.normal);\n  /** 選択可能な出発日時リスト */\n  const [ selectTimeList, setSelectTimeList ] = React.useState<string[]>([UNSELECTED_RIDING_DATE_STRING]);\n  /** 乗車日時が未選択状態かのフラグ */\n  const [ isUnselectedRidingDate, switchIsUnselectedRidingDate ] = React.useState<boolean>(false);\n  /** ご利用便日時(時間)が未選択状態かのフラグ */\n  const [ isUnselectedFlightHour, switchIsUnselectedFlightHour ] = React.useState<boolean>(false);\n  /** ご利用便日時(分)が未選択状態かのフラグ */\n  const [ isUnselectedFlightMinutes, switchIsUnselectedFlightMinutes ] = React.useState<boolean>(false);\n  /** ご利用便日時が未選択状態かのフラグ */\n  const [ isUnselectedFlightDate, switchIsUnselectedFlightDate ] = React.useState<boolean>(false);\n  /** referrerパラメーターの値。 */\n  const [ referrer, setReferrer ] = React.useState<string>('');\n  /** クエリの情報を元に料金情報を取得するか */\n  const [ isInitGetFareInfo, switchIsInitGetFareInfo ] = React.useState<boolean>(true);\n  /** 送迎に対応する便情報 */\n  const [ flightPattern, setFlightPattern ] = React.useState<string[]>([]);\n\n  /** 象潟合同交通か? */\n  const isKisakataTaxi = [TaxiCompanyList.airport_liner, TaxiCompanyList.nikaho_go].includes(taxiCompany);\n  /** 平日用のプルダウンリスト */\n  const [ weekdayPointList, setWeekdayPointList ] = React.useState<SelectPoint[]>([]);\n  /** 休日用のプルダウンリスト */\n  const [ holidayPointList, setHolidayPointList ] = React.useState<SelectPoint[]>([]);\n  /** 平日か休日か */\n  const [ dayOfWeek, setDayOfWeek ] = React.useState<string>('');\n\n  /**\n   * 象潟合同交通のプルダウンリストを設定する\n   * @param params クエリパラメーター\n   * @param ridingDate 乗車日時\n   */\n  const setNikahoPointListByParams = async (params: BookingTaxiQueryParams, ridingDate: luxon.DateTime, defaulPickupPattern: number) => {\n    /**\n     * プルダウンリストを取得する\n     * @param id s3のjsonファイル名\n     * @returns プルダウンリスト\n     */\n    const fetchPointList = async (id: 'nikahoWeekday' | 'nikahoHoliday') => {\n      const response = await getTaxiCompanyConfiguration({\n        companyCode: params.company,\n        componentKey: ComponentKey.pulldown,\n        id,\n        language: lang\n      });\n    \n      if (response.body !== null && Array.isArray(response.body) && response.body.length > 0) {\n        return response.body;\n      }\n      return [];\n    };\n\n    const weekdayList = await fetchPointList('nikahoWeekday');\n    const holidayList = await fetchPointList('nikahoHoliday');\n    // 平日用のプルダウンリスト\n    setWeekdayPointList(weekdayList);\n    // 休日用のプルダウンリスト\n    setHolidayPointList(holidayList);\n\n    if (weekdayList.length > 0 && holidayList.length > 0) {\n      // セレクトモードに切り替え\n      setMode(AirportTransferTaxiMapMode.select);\n      let currentList: SelectPoint[] = isHoliday(ridingDate) ? holidayList : weekdayList;\n      // defaulPickupPatternが1(TO_AIRPORT)で平日の場合、id001を除外\n      if (defaulPickupPattern === PickupPattern.TO_AIRPORT && !isHoliday(ridingDate)) {\n        currentList = currentList.filter(point => point.id !== '001');\n      }\n      setDayOfWeek(isHoliday(ridingDate) ? 'holiday' : 'weekday');\n      // プルダウンにセット\n      setPointList(currentList);\n    }\n  };\n\n  /** クエリのparamsとcompanyより選択地点の一覧を入れ込む */\n  const setPointListByParams = async (params: BookingTaxiQueryParams) => {\n    const setParams: GetTaxiCompanyConfParams = {\n      companyCode: params.company,\n      // TODO: 現状ではプルダウンだけなので固定値だが、今後風向きが変わったら対応する\n      componentKey: ComponentKey.pulldown,\n      id: params.mode,\n      language: lang\n    }\n    getTaxiCompanyConfiguration(setParams)\n    .then((res)=>{\n      // Responseが配列で要素が入っている場合のみ処理する\n      if(res.body !== null && Array.isArray(res.body) && res.body.length > 0) {\n        let matchPointList: SelectPoint[] = res.body;\n        setPointList(matchPointList);\n        setMode(AirportTransferTaxiMapMode.select);\n      }\n    })\n  }\n\n  /**\n   * メールアドレス欄の値を変更されたときの処理。\n   * @param e テキストボックスの値が変更されたときに受け渡されるイベント。\n   */\n  const onChangedEmail = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    /** テキストボックスに入力された値。 */\n    const value = e.target.value as string;\n    // メールアドレスとして更新する。\n    setEmail(value);\n    // メールアドレスが変更された場合は、メールアドレスが空であるフラグをオフにする。\n    setEmptyEmail(false);\n    // メールアドレスが変更された場合はリクエスト回数を1に戻す。\n    setRequestCount(1);\n  }\n\n  /**\n   * 搭乗便の値を変更されたときの処理。\n   * @param e テキストボックスの値が変更されたときに受け渡されるイベント。\n   */\n  const onChangedFlight = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    /** テキストボックスに入力された値。 */\n    const value = e.target.value as string;\n    // 便名として更新する。\n    setFlight(value);\n    // 便名が変更された場合は、便名が空であるフラグをオフにする。\n    setEmptyFlight(false);\n  }\n\n\n  /**\n   * 空港が変更された場合の処理。\n   * @param e セレクトボックスが変更されたときに受け渡されるイベント。\n   */\n  const onChangedAirport = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    /** セレクトボックスで選択された項目の値。(空港コード) */\n    const value = e.target.value as string;\n    // 選択された項目の値に空港コードを更新する。\n    setAirportCode(value);\n  }\n\n  /**\n   * 乗車日時の日付(「年」部分)が変更された場合の処理。\n   * @param e セレクトボックスが変更されたときに受け渡されるイベント。\n   */\n  const onChangedRidingYear = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    /** セレクトボックスで選択された項目の値。 */\n    const value = e.target.value as number;\n    // セレクトボックスで変更された時刻どおりに乗車日時・フライト日時の「年」部分を設定する。\n    const modifiedDate = ridingDate.set({\n      year: value\n    });\n    // 乗車日時を変更後の日時に更新する。\n    setRidingDate(modifiedDate);\n  }\n\n  /**\n   * 乗車日時の日付(「月」部分)が変更された場合の処理。\n   * @param e セレクトボックスが変更されたときに受け渡されるイベント。\n   */\n  const onChangedRidingMonth = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    /** セレクトボックスで選択された項目の値。 */\n    const value: number = e.target.value as number;\n    // セレクトボックスで変更された時刻どおりに乗車日時・フライト日時の「月」部分を設定する。\n    const modifiedDate = ridingDate.set({\n      month: value\n    });\n    // 乗車日時を変更後の日時に更新する。\n    setRidingDate(modifiedDate);\n  }\n\n  /**\n   * 乗車日時の日付(「日」部分)が変更された場合の処理。\n   * @param e セレクトボックスが変更されたときに受け渡されるイベント。\n   */\n  const onChangedRidingDay = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    /** セレクトボックスで選択された項目の値。 */\n    const value = e.target.value as number;\n    // セレクトボックスで変更された時刻どおりに乗車日時・フライト日時の「日」部分を設定する。\n    const modifiedDate = ridingDate.set({\n      day: value\n    });\n    // 乗車日時を変更後の日時に更新する。\n    setRidingDate(modifiedDate);\n  }\n\n  /**\n   * 乗車日時の時刻(「時」部分)が変更された場合の処理。\n   * @param e セレクトボックスが変更されたときに受け渡されるイベント。\n   */\n  const onChangedRidingHour = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    /** セレクトボックスで選択された項目の値。 */\n    const value = e.target.value as number;\n    /** セレクトボックスで変更された時刻どおりに「時」部分を設定する。 */\n    const modifiedDate = ridingDate.set({\n      hour: value\n    });\n    // 搭乗便の時刻を変更後の日時に更新する。\n    setRidingDate(modifiedDate);\n  }\n\n  /**\n   * 乗車日時の時刻(「分」部分)が変更された場合の処理。\n   * @param e セレクトボックスが変更されたときに受け渡されるイベント。\n   */\n  const onChangedRidingMinutes = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    /** セレクトボックスで選択された項目の値。 */\n    const value = e.target.value as number;\n    /** セレクトボックスで変更された時刻どおりに「分」部分を設定する。 */\n    const modifiedDate = ridingDate.set({\n      minute: value\n    });\n    // 搭乗便の時刻を変更後の日時に更新する。\n    setRidingDate(modifiedDate);\n  }\n\n  /**\n   * 乗車日時の時刻(「時刻・分」部分)がプルダウンから選択されて変更された場合の処理。\n   * @param e セレクトボックスが変更されたときに受け渡されるイベント。\n   */\n  const onChangedRidingHourAndMinutes = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    /** セレクトボックスで選択された項目の値。 */\n    const value = e.target.value as string;\n    /** 未選択状態を選んだ際の挙動 */\n    if(value === UNSELECTED_RIDING_DATE_STRING) {\n      /** 未選択状態をtrueにする */\n      switchIsUnselectedRidingDate(true);\n      return;\n    }\n    const hour = Number(value.slice(0, 2));\n    const minutes = Number(value.slice(-2));\n    /** セレクトボックスで変更された時刻どおりに「時」部分を設定する。 */\n    const modifiedDate = ridingDate.set({\n      hour: hour,\n      minute: minutes\n    });\n    // 搭乗便の時刻を変更後の日時に更新する。\n    setRidingDate(modifiedDate);\n    /** 未選択状態を false にする */\n    switchIsUnselectedRidingDate(false);\n  }\n\n  /**\n   * ご利用便がプルダウンから選択されて変更された場合の処理。\n   * @param e セレクトボックスが変更されたときに受け渡されるイベント。\n   */\n  const onChangedRidingFlight = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    /** セレクトボックスで選択された項目の値。 */\n    const value = e.target.value as string;\n\n    /** 未選択状態を選んだ際の挙動 */\n    if (value === UNSELECTED_RIDING_DATE_STRING) {\n      setSelectFlightData(value);\n    }\n\n    /** 選択されたフライト便の情報を処理する */\n    const selectedFlight = flightPattern.find(flight => flight === value);\n    if (selectedFlight) {\n      setSelectFlightData(selectedFlight);\n    }\n  }\n\n  /**\n   * 搭乗便の時刻が変更された場合の処理共通部分\n   */\n  const onChangedFlightDateCommon = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>, type: string) => {\n    /** 未選択状態かのフラグ */\n    const isUnselected = e.target.value === '---';\n    if (type === 'hour') {\n      switchIsUnselectedFlightHour(isUnselected);\n    } else if (type === 'minutes') {\n      switchIsUnselectedFlightMinutes(isUnselected);\n    }\n    if (isUnselected) return;\n    // /** セレクトボックスで選択された項目の値。 */\n    const value = e.target.value as number;\n    /** セレクトボックスで変更された時刻どおりに「時」部分を設定する。 */\n    const luxonSetObject = ((): luxon.DateObjectUnits => {\n      switch(type) {\n        case 'year':\n          return {year: value};\n        case 'month':\n          return {month: value};\n        case 'day':\n          return {day: value};\n        case 'hour':\n          return {hour: value};\n        case 'minutes':\n        default:\n          return {minute: value};\n      }\n    })()\n    // 搭乗便の時刻を変更後の日時に更新する。\n    setFlightDate(flightDate.set(luxonSetObject));\n  }\n  /**\n   * 搭乗便の時刻が変更された場合の呼び出し口\n   */\n  const onChangedFlightDate = {\n    // 搭乗便の時刻(「年」部分)が変更された場合の処理\n    year: (e: React.ChangeEvent<{\n      name?: string | undefined;\n      value: unknown;\n    }>) => {\n      onChangedFlightDateCommon(e, 'year');\n    },\n    // 搭乗便の時刻(「月」部分)が変更された場合の処理\n    month: (e: React.ChangeEvent<{\n      name?: string | undefined;\n      value: unknown;\n    }>) => {\n      onChangedFlightDateCommon(e, 'month');\n    },\n    // 搭乗便の時刻(「日」部分)が変更された場合の処理\n    day: (e: React.ChangeEvent<{\n      name?: string | undefined;\n      value: unknown;\n    }>) => {\n      onChangedFlightDateCommon(e, 'day');\n    },\n    // 搭乗便の時刻(「時」部分)が変更された場合の処理\n    hour: (e: React.ChangeEvent<{\n      name?: string | undefined;\n      value: unknown;\n    }>) => {\n      onChangedFlightDateCommon(e, 'hour');\n    },\n    // 搭乗便の時刻(「分」部分)が変更された場合の処理\n    minutes: (e: React.ChangeEvent<{\n      name?: string | undefined;\n      value: unknown;\n    }>) => {\n      onChangedFlightDateCommon(e, 'minutes');\n    }\n  }\n\n  /** 発着地情報。 */\n  let points =  {\n    label: pointName,\n    latLng: `${center.lat},${center.lng}`,\n  }\n\n  /** 仮予約APIのリクエストパラメーターを取得する。 */\n  const getSendParams = (token: string): TemporaryReservationParams => {\n    // TODO: いらなさそうならこの辺削除する デフォルトチェックだけ残す\n    let sendPoints = (()=>{\n      if(points.label === defaultPointlabel) {\n        throw new Error('座標がデフォルトのままです');\n      }\n      return points;\n    })();\n    // Selectモードの場合、選んだ選択肢を発着地点座標とラベルに用いる\n    if(pointList.length > 0 && mode === AirportTransferTaxiMapMode.select && selectPointNumber !== '-1') {\n      const selectPointObject = pointList[Number(selectPointNumber)];\n      if(selectPointObject.name) {\n        points = {\n          label: selectPointObject.name,\n          latLng: selectPointObject.latLng\n        }\n      }\n    }\n    // フライト情報\n    let setFlightInfo: any = {\n      number: flight,\n      datetime: flightDate.toFormat('yyyyMMddHHmm'),\n      // 空港着の場合は搭乗便の出発時間として、\n      // 空港発の場合は搭乗便の到着時間として登録する。\n      isDeparture: toAirport\n    }\n    // 国際・国内情報があれば連携する\n    if(params?.isDomestic) {\n      setFlightInfo = {\n        ...setFlightInfo,\n        flightType: params.isDomestic? FlightType.domestic: FlightType.international\n      }\n    }\n    // ターミナル情報があれば連携する\n    if(params?.terminal && params.terminal !== '') {\n      setFlightInfo = {\n        ...setFlightInfo,\n        terminal: params.terminal\n      }\n    }\n    // ゲート情報を連携する\n    if(params?.gate && params.gate !== '') {\n      setFlightInfo = {\n        ...setFlightInfo,\n        gate: params.gate\n      }\n    }\n    // labelForPriceCalc で送る値は施設名を含めるようにする\n    // クエリから取得した日本語住所情報\n    const paramsPointJPAddress: string = params?.pointJPAddress || '';\n    const jpAddress = placeJP? convertLetter(placeJP.getFullAddress().replace(/-/g, '_')): paramsPointJPAddress;\n    const jpPlaceName = placeJP? ( placeJP.name || '' ): (params?.pointJPName || '');\n    const labelForPriceCalc = jpPlaceName !== ''? `${jpAddress} ${jpPlaceName}`: jpAddress;\n\n    let sendParams: TemporaryReservationParams = {\n      mailaddress: email,\n      pointInfo: {\n        latLng: sendPoints.latLng,\n        label: sendPoints.label,\n        latLngForPriceCalc: sendPoints.latLng,\n        // TODO: 今後宮交が英語版対応したときには、Selectで選んだ時の扱いを考える必要がある\n        labelForPriceCalc: labelForPriceCalc\n      },\n      flight: setFlightInfo,\n      taxiConnectFlightNumber: selectFlightData !== UNSELECTED_RIDING_DATE_STRING ? selectFlightData : undefined,\n      rideDatetime: ridingDate.toFormat('yyyyMMddHHmm'),\n      // 空港着の場合はユーザーが指定した地点から乗る値(pickup)を、\n      // 空港発の場合はユーザーが指定した地点で降りる(dropOff)を設定する。\n      operation: toAirport ? \"pickup\" : \"dropOff\",\n      token: token,\n      // 空港送迎タクシーの値(limoTaxi)を設定する。\n      company: taxiCompany,\n      count: requestCount,\n      referrer: params?.referrer || '',\n      language: i18n.language,\n      airportLetter: airportCode,\n    };\n    // reCAPTCHA v2で検証する場合のみ、vrパラメーターを含めてリクエストする。\n    if (useRecaptchaV2) {\n      sendParams = {\n        ...sendParams,\n        vr: useRecaptchaV2,\n      }\n    }\n    // 本番環境以外テストパラメーターを追加する\n    if(process.env['REACT_APP_STAGE_ENV'] !== 'master') {\n      let backURL = `${window.location.protocol}//${window.location.host}/booking`;\n      // localhostの場合には置換はしない\n      if(!backURL.includes('localhost')) {\n        // メールアドレスに書いてある戻り先URLを指定する\n        // 現在アクセスしているURLをそのまま指定する\n        sendParams.overwirteBookingUrl = backURL;\n      }\n      // 実際にメールを送らない\n      if(params?.dryRun === 'true') {\n        sendParams.dryRun = params?.dryRun === 'true';\n      }\n    }\n    if(params && params.mode) {\n      sendParams = {\n        ...sendParams,\n        mode: params.mode\n      };\n    }\n    return sendParams;\n  }\n\n  /**\n   * タクシー乗車が出来ない日時か\n   * @param rideDate 乗車日時\n   * @param taxiCompany タクシー会社\n   * @returns エラーの場合にはtrueが返る\n   */\n  const checkRideDate = (rideDate: luxon.DateTime, taxiCompany: TaxiCompanyList, taxiConf = taxiCompanyConf) => {\n    if(!taxiConf) {\n      return true;\n    }\n    const limit = taxiConf.limit;\n    const taxiUtils = new CommonTaxiUtils(limit.limitDays, limit.limitHours, taxiCompany, airportCode);\n    /** 指定乗車時刻がタクシーが予約可能期限内であるか */\n    const isAvalableDate = !taxiUtils.isAvalable(rideDate);\n    /** 指定乗車時刻がタクシーが予約可能期限内であるか */\n    if(isAvalableDate) {\n      const setErrorMessage = taxiUtils.getErrorMessage(limit.errorMessage, lang);\n      setInvalidFlightErrorMessage(setErrorMessage);\n    }\n    return isAvalableDate;\n  }\n\n  /** 入力フォームで設定された各項目の検証をする。 */\n  const validate = async() => {\n    const emptyAddress = pointName === '';\n    const emptyEmail = email === '';\n    const emptyFlight = flight === '';\n    const invalidEmail = email !== '' && !isEmail(email);\n    const invalidFlight = flight !== '' && !isValidFLight(flight);\n    // ご利用便日時が未選択状態の場合には、エラーにする\n    const invalidFlightDate: boolean = (()=> {\n      if (isUnselectedFlightHour || isUnselectedFlightMinutes) {\n        setInvalidFlightDateErrorMessage(t('taxi:unselected_flight_date_error_msg'));\n        return true;\n      }\n      return false;\n    })();\n    /** 不正な乗車日時である(現在日時より96時間を切っている)かを表すフラグ。 */\n    const invalidRidingDate: boolean = (()=>{\n      // ご利用便日時が未選択状態の場合には、乗車日時の検証をスキップする\n      if(invalidFlightDate) {\n        return false;\n      }\n      /** 未選択状態の場合には未選択エラーメッセージを表示する */\n      if (isUnselectedRidingDate) {\n        setInvalidFlightErrorMessage(t('taxi:unselected_riding_date_error_msg'));\n        return true;\n      }\n      // sakataNo1Taxi または shokoHire の場合は処理をスキップ\n      if (taxiCompany !== TaxiCompanyList.sakataNo1Taxi && taxiCompany !== TaxiCompanyList.shokoHire) {\n        // to空港の場合にはフライト出発時刻が送迎時刻より前の場合にはアラートを出す\n        if (toAirport && ridingDate > flightDate) {\n          setInvalidFlightErrorMessage(t('taxi:set_after_time_dep'));\n          return true;\n        }\n        // from空港の場合には、フライト到着時刻が送迎時刻より後の場合にエラーを出す\n        if (!toAirport && ridingDate < flightDate) {\n          setInvalidFlightErrorMessage(t('taxi:set_after_time_arr'));\n          return true;\n        }\n      }\n      return checkRideDate(ridingDate, taxiCompany);\n    })();\n    setEmptyAddress(emptyAddress);\n    setEmptyEmail(emptyEmail);\n    setEmptyFlight(emptyFlight);\n    setInvalidEmail(invalidEmail);\n    setInvalidFlight(invalidFlight);\n    setOverdeadline(invalidRidingDate);\n    switchIsUnselectedFlightDate(invalidFlightDate);\n    // サポート送迎パターンがALLでないなら、許可されたタイプかの検証をする\n    switch(taxiCompanyConf?.supportDirection) {\n      case 'fromAirport':\n          switchDisallowSupportDirection((pickupPattern !== PickupPattern.FROM_AIRPORT))\n        break;\n      case 'toAirport':\n          switchDisallowSupportDirection((pickupPattern !== PickupPattern.TO_AIRPORT))\n        break;\n      default:\n        switchDisallowSupportDirection(false);\n    }\n    /* 搭乗タクシーと対応フライトがある事業者の場合、対応フライトが選択できていないとエラーにする */\n    const invalidFlightPattern: boolean = (()=> {\n      if(flightPattern.length === 0) {\n        return false;\n      }\n      return selectFlightData === UNSELECTED_RIDING_DATE_STRING;\n    })();\n    switchInvalidFlightPattern(invalidFlightPattern);\n\n    if (\n        emptyEmail ||\n        emptyFlight ||\n        invalidEmail ||\n        invalidFlight ||\n        invalidRidingDate ||\n        invalidFlightDate ||\n        emptyAddress ||\n        isUnselectedRidingDate ||\n        disallowSupportDirection ||\n        invalidFlightPattern\n      ) {\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  /** 本予約APIへのリクエストパラメーターを整形する。 */\n  const modifyParams = (params: TemporaryReservationParams) => {\n    // 本番環境ではテストパラメーターを削除する\n    if(process.env['REACT_APP_STAGE_ENV'] === 'master') {\n      delete params.overwirteBookingUrl;\n      delete params.dryRun;\n    }\n    return params;\n  }\n\n  /**\n   * 仮予約の処理。\n   * @param tokenV2 reCAPTCHA v2のトークン。(reCAPTCHA v2を使用する場合のみ指定)\n   * */\n  const onSubmit = (tokenV2?: any) => {\n    const clickName = (()=>{\n      const scClicks = taxiCompanyConf?.scClick.temporaryReservation;\n      const clickType = getSCCkickType(params?.referrer, taxiCompany);\n      if(!scClicks) {\n        return '';\n      }\n      return scClicks[clickType] || scClicks?.asw;\n    })();\n    // 本番以外ではメールアドレスをCookieに保存する\n    if (Environment.getEnvironmentType() !== Environment.PRODUCTION) {\n      const mailAddressCookieName = 'ana_airport_access_navi_email_address';\n      Cookies.set(mailAddressCookieName, email);\n    }\n    // ダミータクシーの場合にはSCクリックを実行しない\n    if(taxiCompany !== TaxiCompanyList.dummyVal) {\n      // SCクリックの実行。\n      scClick(clickName);\n    }\n    // 送信済み(予約ボタンを押した後)として扱うようフラグを更新。\n    setSubmitted(true);\n    // 処理中フラグをオンにする。\n    dispatch(switchisLoading(true));\n    // 非同期処理を実行するための無名関数の呼び出し。\n    (async() => {\n      /** Google reCapthcaから取得したトークン。 */\n      const token = useRecaptchaV2 ? tokenV2 : await getRecaptchaToken();\n      /** 仮予約APIに送信するパラメーター。 */\n      let sendParams = getSendParams(token);\n      /** 入力フォームの検証結果。 */\n      const validatedResult = await validate();\n      sendParams = modifyParams(sendParams);\n      if (validatedResult) {\n        // 仮予約APIにリクエストする。\n        submitTemporaryReservation(sendParams).then((response) => {\n          const statusCode = response?.status;\n          /** 仮予約成功時に完了ページに送るパラメーター。 */\n          const successParams = new URLSearchParams({\n            company: taxiCompany,\n            lang: lang,\n            referrer: params?.referrer ? params.referrer : '',\n          });\n          switch (statusCode) {\n            case 200:\n              // 予約完了画面に遷移する。\n              // タクシー会社を連携する\n              history.push(`/booking-taxi/success?${successParams.toString()}`);\n              break;\n            case 403:\n              // reCAPTCHA v3の検証に失敗した場合。\n              // (エラーコードが100の場合はreCAPTCHA検証に失敗した場合のレスポンスであるため。)\n              if (response?.data?.errorCode === 100) {\n                // 予約ボタンの再クリック(reCAPTCHA v2での検証)を促すフラグをtrueにする。\n                switchNeedRetryRecaptcha(true);\n                // reCAPTCHA v2を使用するフラグをtrueにする。\n                dispatch(switchUseV2(true));\n              } else {\n                // その他の場合は予約失敗フラグを設定する。\n                setFailed(true);\n              }\n              break;\n            case 499:\n              // 別のメールアドレスを設定するよう促すフラグをtrueにする。\n              setUnavalableEmail(true);\n              break;\n            case 599:\n              // 予約処理の再実行を促すフラグをtrueにする。\n              setRequiredRetry(true);\n              // リクエスト回数をインクリメントする。\n              setRequestCount(requestCount + 1);\n              break;\n            default:\n              // 予約失敗フラグを設定する。\n              setFailed(true);\n              break;\n          }\n        }).catch(() => {\n          // 何らかリクエスト処理に失敗した場合は、予約失敗フラグを設定する。\n          setFailed(true);\n          // 処理中フラグをオフにする。\n        }).finally(() => {\n          // 最後にかならず処理中フラグをオフにする。\n          dispatch(switchisLoading(false));\n        })\n      } else {\n        //  処理中フラグをオフにする。\n        dispatch(switchisLoading(false));\n        return;\n      }\n    })();\n  }\n\n  /** URLクエリパラメータを取得する */\n  const getQueryParams = (searchParams: URLParams, getTaxiCompanyConf: TaxiCompanyConfigurations): BookingTaxiQueryParams | null => {\n    // 連携されたクエリより、該当するタクシー会社を表示する\n    const taxiCompany: TaxiCompanyList = convertStringToTaxiCompany(searchParams.getStringParam('company') || '') || TaxiCompanyList.limoTaxi;\n    const taxiCompanyConf = getTaxiCompanyConf[taxiCompany] || getTaxiCompanyConf[TaxiCompanyList.limoTaxi];\n\n    // 連携がない時に表示するデフォルト日付\n    const defaultDate = (()=>{\n      if(!taxiCompanyConf) {\n        return getNowLuxonDateTime().plus({\n          day: 4\n        });\n      }\n      const limit = taxiCompanyConf.limit;\n      const commonTaxiUtils = new CommonTaxiUtils(limit.limitDays, limit.limitHours, taxiCompany, airportCode);\n      return commonTaxiUtils.getAvailableDate(getNowLuxonDateTime());\n    })();\n    const flightDate = (() => {\n      const hasRideDate = searchParams.hasParam('rideDate');\n      const hasFlightDate = searchParams.hasParam('flightDate');\n      \n      if (hasRideDate && !hasFlightDate) {\n        // ご利用便日時が未選択状態の場合には、時間を未設定状態にする\n        switchIsUnselectedFlightHour(true);\n        switchIsUnselectedFlightMinutes(true);\n        // rideDateの日付部分のみを使用して時刻は未設定状態にする\n        const rideDateTime = searchParams.getLuxonDateTimeUnixTimeMilisecondsParam('rideDate', defaultDate);\n        return rideDateTime\n      }\n      \n      // 既存の処理を維持\n      return searchParams.getLuxonDateTimeUnixTimeMilisecondsParam('flightDate', defaultDate);\n    })();\n    const rideDate = searchParams.getLuxonDateTimeUnixTimeMilisecondsParam('rideDate', defaultDate);\n    let getParams: BookingTaxiQueryParams = {\n      isDeparture:      searchParams.getBooleanParam('isDeparture'),\n      pointAddress:     searchParams.getStringParam('pointAddress') || '',\n      pointName:        searchParams.getStringParam('pointName') || '',\n      pointLat:         searchParams.getFloatParam('pointLat'),\n      pointLng:         searchParams.getFloatParam('pointLng'),\n      airportCode:      searchParams.getStringParam('airportCode') || '',\n      flightNumber:     searchParams.getStringParam('flightNumber') || '',\n      flightDate:       flightDate,\n      rideDate:         rideDate,\n      isDomestic:       searchParams.getBooleanParam('isDomestic'),\n      terminal:         searchParams.getStringParam('terminal') || '',\n      gate:             searchParams.getStringParam('gate') || '',\n      mode:             searchParams.getStringParam('mode') || '',\n      referrer:         searchParams.getStringParam('referrer') || '',\n      company:          taxiCompany,\n      dryRun:           searchParams.getStringParam('dryRun') || undefined,\n      lang:             searchParams.getStringParam('lang') || 'ja',\n      pointJPAddress:   searchParams.getStringParam('pointJPAddress') || '',\n      pointJPName:      searchParams.getStringParam('pointJPName') || '',\n      googleAPIDepDate: searchParams.getLuxonDateTimeUnixTimeMilisecondsParam('googleAPIDepDate', rideDate),\n    }\n\n    // クエリに応じて言語の切り替えをします。\n    switch(i18n.language) {\n      case 'en':\n        setLang(Lang.en);\n        setDefaultPointLabel('Search here');\n        setPointName('Search here');\n        setPlaceJP(null);\n        break;\n      case 'ja':\n      default:\n        setLang(Lang.ja);\n        setDefaultPointLabel('ここで検索');\n        setPointName('ここで検索');\n        setPlaceJP(null);\n        break;\n    }\n\n    const targetAirportCodeList: string[] = taxiCompanyConf.supportAirports;\n    // 空港コードだけ指定のコードリストに一致するか再度チェックを入れる\n    if(!targetAirportCodeList.includes(getParams.airportCode)) {\n      // 会社に合わせたデフォルトを入れる\n      getParams.airportCode = taxiCompanyConf?.defaultAirportCode || '';\n    }\n    // 乗車日時が予約可能な範囲かチェックする\n    const invalidRidingDate = checkRideDate(getParams.rideDate, taxiCompany, taxiCompanyConf);\n    setOverdeadline(invalidRidingDate);\n    if(invalidRidingDate) {\n      const limit = taxiCompanyConf.limit;\n      const commonTaxiUtils = new CommonTaxiUtils(limit.limitDays, limit.limitHours, taxiCompany, airportCode);\n      const setErrorMessage = commonTaxiUtils.getErrorMessage(limit.errorMessage, lang);\n      setInvalidFlightErrorMessage(setErrorMessage);\n    }\n    // 日本のエリア外である場合にはパラメーターを初期化させる\n    if(!checkJPNArea(getParams.pointLat, getParams.pointLng)) {\n      getParams = {\n        ...getParams,\n        pointLat: 0,\n        pointLng: 0\n      }\n    }\n    return getParams;\n  }\n\n  // 座標が日本周辺かを判定する\n  // 日本周辺ならTrueを返す\n  const checkJPNArea = (lat: number, lng: number) => {\n    return lat > 20 && lat < 50 && lng < 155 && lng > 120;\n  }\n\n  /** 座標より住所情報を取得して入れ込める */\n  const setMunicipalityFromPosition = async (position: Location) => {\n    const latlng = `${position.lat},${position.lng}`;\n    const places: Place[] = await getClosedGeocode(latlng, changeLang(i18n.language));\n    if(places.length > 0) {\n      const place: Place = places[0];\n      setPlace(place);\n      /** 「都道府県」・「市区町村」までの住所。 */\n      const municipality = convertLetter(place.getAddressToMunicipality());\n      setMunicipality(municipality);\n    }\n    else {\n      // 位置情報が取れない場合には住所を空欄にする\n      setMunicipality('')\n    }\n    return {\n      'type': 'setMunicipalityFromPosition'\n    }\n  }\n\n  // 送迎パターンが変更された場合、送迎パターンのフラグを変更する処理。\n  React.useEffect(() => {\n    setToAirport(PickupPattern.isToAirport(pickupPattern));\n    /** 送迎パターンが変更されたとき対応フライトも初期値に戻す */\n    setSelectFlightData(UNSELECTED_RIDING_DATE_STRING);\n  }, [pickupPattern, setToAirport]);\n\n  // 空港コードが変更された場合、地図の中心座標と地点の名称を変更する処理。\n  React.useEffect(() => {\n    // 発着地を未編集の場合のみ、名称・座標・市区町村を更新する。\n    // クエリ読み込みが完了している場合のみ更新をかける\n    if (isEndInit && taxiCompanyConf) {\n      // 一度インクリメンタルサーチから候補を選んでいたら料金だけを変える\n      if(isEdited) {\n        getDirectionAndFare();\n      }\n      else {\n        // それ以外の場合には中心座標をデフォルトに変更する\n        const defaultCenter = taxiCompanyConf.defaultCenter[airportCode];\n        const newCenter = defaultCenter.position;\n        // 初期地点名は「ここで検索」に設定\n        setPointName(defaultPointlabel);\n        // 空港に応じた初期座標に更新する。\n        setCenter(newCenter);\n        setMarkerPoint(newCenter);\n        /** 空港ごとに設定されている初期地点の市区町村。 */\n        const municipalityByAirport = defaultCenter.municipality;\n        // 空港ごとの初期値の市区町村に更新する。\n        setMunicipality(municipalityByAirport);\n        // 空港を切り替えて地点が変わらない場合には料金計算APIがそのままでは反応しないので手動で更新する\n        if(center.lat === newCenter.lat && center.lng === newCenter.lng) {\n          getDirectionAndFare();\n        }\n      }\n    }\n  }, [airportCode, setCenter, setPointName, taxiCompanyConf]);\n\n  /**\n   * 料金経路取得APIにリクエストする。\n   * @param origin 出発地の緯度経度。\n   * @param destination 目的地の緯度経度。\n   */\n  const getDirectionAndFare = React.useCallback(async() => {\n    // エラーメッセージを空にする\n    dispatch(updateErrorMessage(''));\n    // 読込中をONにする\n    switchIsEndCallTaxiAPI(false);\n    // タクシー料金取得に失敗したかをFalseにする\n    switchIsFailCallTaxiAPI(false);\n    const useRideDate: luxon.DateTime = (()=>{\n      if(isInitGetFareInfo && params?.googleAPIDepDate) {\n        switchIsInitGetFareInfo(false);\n        return params?.googleAPIDepDate;\n      }\n      return ridingDate;\n    })();\n    // クエリ連携がないデフォルト値を入れ込む\n    let request: GetDirectionAndFareParams = {\n      airportLetter: airportCode,\n      operation: (pickupPattern === PickupPattern.TO_AIRPORT? GetDirectionAndFareOperation.pickup: GetDirectionAndFareOperation.dropOff),\n      companyCode: taxiCompany,\n      rideDatetime: useRideDate.toFormat('yyyyMMddHHmm'),\n      language: i18n.language\n    }\n    // クエリ連携がある場合には、フライトタイプ・ターミナル・ゲート情報を連携する\n    if(params) {\n      request = {\n        ...request,\n        flightType: params.isDomestic? FlightType.domestic: FlightType.international\n      }\n      // ターミナル情報が空出ない場合には入れ込む\n      if(params.terminal !== '') {\n        request = {\n          ...request,\n          terminal: params.terminal\n        }\n      }\n      // 搭乗口情報が空出ない場合には入れ込む\n      if(params.gate !== '') {\n        request = {\n          ...request,\n          gate: params.gate\n        }\n      }\n      // シーガイア識別用\n      if(params.mode === \"seaGaia\") {\n        request = {\n          ...request,\n          mode: params.mode,\n          modeValue: 'true'\n        }\n      }\n    }\n    if(taxiCompany === TaxiCompanyList.nikaho_go && params) {\n      const isHolidayDate = isHoliday(useRideDate);\n      const newDayOfWeek = isHolidayDate ? 'holiday' : 'weekday';\n      let usePointList = isHolidayDate ? holidayPointList : weekdayPointList;\n      // 平日の空港行きの場合、id001を除外\n      if (pickupPattern === PickupPattern.TO_AIRPORT && !isHolidayDate) {\n        usePointList = usePointList.filter(point => point.id !== '001');\n      }\n      // 平日/休日が切り替わる時は必ずリセット\n      if (dayOfWeek !== newDayOfWeek) {\n        setDayOfWeek(newDayOfWeek);\n        setPointList(usePointList);\n        setSelectPointNumber('-1');\n        setFeeLabel('');\n        setDurationText('');\n        setDistanceText('');\n        setPointName(defaultPointlabel);\n        switchIsEndCallTaxiAPI(true);\n        return;\n      }\n      // 平日空港着の場合\n      if (usePointList !== pointList) {\n        const selectedPointId = pointList[Number(selectPointNumber)]?.id;\n        const newListIndex = usePointList.findIndex(point => point.id === selectedPointId);\n        setPointList(usePointList);\n        if (newListIndex === -1) {\n          setSelectPointNumber('-1');\n          setFeeLabel('');\n          setDurationText('');\n          setDistanceText('');\n          setPointName(defaultPointlabel);\n          switchIsEndCallTaxiAPI(true);\n          return;\n        }\n        setSelectPointNumber(String(newListIndex));\n      }\n    }\n    // pointNameが「ここで検索」となっている場合にはエラーにする\n    if(pointName === defaultPointlabel) {\n      switchIsEndCallTaxiAPI(true);\n      // デフォルトで送迎に対応する便情報がある場合にはデフォルトの送迎パターンを発着の初期値を切り替える\n      if(flightPattern.length > 0 && taxiCompanyConf !== null) {\n        const newflightPattern = pickupPattern === PickupPattern.TO_AIRPORT?\n          taxiCompanyConf.defaultFlightPattern.pickup:\n          taxiCompanyConf.defaultFlightPattern.dropOff;\n        setFlightPattern(newflightPattern)\n      }\n      return;\n    }\n    // 発着地点情報を入れる\n    const latlng = `${center.lat},${center.lng}`;\n    // クエリから取得した住所情報\n    const paramsPointAddress: string = params?.pointAddress || '';\n    // クエリから取得した日本語住所情報\n    const paramsPointJPAddress: string = params?.pointJPAddress || '';\n    const setPointLabel = (() => {\n      // 象潟合同の場合はセレクトボックスの選択値を使用\n      if (isKisakataTaxi && pointList.length > 0 && selectPointNumber !== '-1') {\n        const selectedPoint = pointList[Number(selectPointNumber)];\n        return selectedPoint.name || '';\n      }\n      // それ以外は既存の処理を使用\n      return convertLetter(place?.getFullAddress(lang) || paramsPointAddress);\n    })();\n\n    const setPointJPLabel = (() => {\n      // 象潟合同の場合はセレクトボックスの選択値を使用\n      if (isKisakataTaxi && pointList.length > 0 && selectPointNumber !== '-1') {\n        const selectedPoint = pointList[Number(selectPointNumber)];\n        return selectedPoint.name || '';\n      }\n      // それ以外は既存の処理を使用\n      return convertLetter(place?.getFullAddress().replace(/-/g, '_') || paramsPointJPAddress);\n    })();\n    request.pointInfo = {\n      latLng: latlng,\n      label: setPointLabel,\n      latLngForPriceCalc: latlng,\n      labelForPriceCalc: setPointJPLabel\n    }\n    try {\n      /** 料金情報の取得中は予約ボタンを押せないようにする */\n      switchIsAvailableReservation(false);\n      const response: GetDirectionAndFareResponse = await getDirectionAndFareAPI(request);\n      if(response !== null) {\n        // 料金ステータスを更新する\n        switchIsAvailableReservation(response.status === 'available')\n        // 距離ラベルを更新する\n        setDistanceText(response.distanceLabel);\n        // 所要時間ラベルを更新する\n        setDurationText(response.durationLabel);\n        // 基本料金を更新する。\n        setFee(response.value);\n        // 回送料金込の総額料金を更新する。\n        setTotalFee(response.totalValue);\n        // 料金ラベルを設定する\n        setFeeLabel(response.fareLabel)\n        // 距離の整数値が返ってくるようになったら入れ込む\n        setDistance(response.distance)\n        // 所要時間の整数値が返ってくるようになったら入れ込む\n        setDuration(response.duration);\n        // 料金タイプを入れ込む\n        setFareType(response.fareType);\n        // 注意事項ラベルを入れる\n        if(response.notesLabel && response.notesLabel.length > 0) {\n          setNotesLabel(response.notesLabel);\n        }\n        else {\n          setNotesLabel([]);\n        }\n        // アラート情報を入れる\n        if(response.alertLabel && response.alertLabel.length > 0 ) {\n          setAlertLabel(response.alertLabel);\n        }\n        else {\n          setAlertLabel([]);\n        }\n        // 必要であれば指定出発時刻リストを更新する\n        if(response.timePattern) {\n          const newSelectTimeList = [UNSELECTED_RIDING_DATE_STRING, response.timePattern].flat(1);\n          const isSameTimeList = JSON.stringify(newSelectTimeList) === JSON.stringify(selectTimeList);\n          if(!isSameTimeList) {\n            /** 指定出発時刻リストを更新する */\n            setSelectTimeList(newSelectTimeList);\n            /** 未選択状態に変更する */\n            switchIsUnselectedRidingDate(true);\n          }\n        }\n        if(response.flightPattern) {\n          setFlightPattern(response.flightPattern);\n        }\n      }\n      else {\n        throw new Error('料金算出APIでエラーが起きました')\n      }\n    }\n    catch (e) {\n      switchIsFailCallTaxiAPI(true);\n      if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n        console.error(e);\n      }\n    }\n    finally {\n      switchIsEndCallTaxiAPI(true);\n    }\n  }, [center, ridingDate, airportCode, pickupPattern, taxiCompany, params, place]);\n\n  // 送迎パターン、選択地点が変更されたときの処理。\n  // TODO: 送迎パターンを変えると2回呼ばれるので対処する\n  React.useEffect(() => {\n    // クエリ読み込みが完了したときのみ更新をかける\n    if(!isEndInit || !isEndCallTaxiAPI) {\n      return;\n    }\n    // 料金経路取得APIにリクエストする\n    getDirectionAndFare();\n  }, [center, toAirport, isEndInit, ridingDate])\n\n  // リクエスト回数に変更があった場合に発火する処理。\n  React.useEffect(() => {\n    // リクエスト回数が4回以上の場合。\n    if (requestCount > 3) {\n      // 使用できないメールアドレスであるフラグをオンにする。\n      setUnavalableEmail(true);\n    }\n  }, [requestCount]);\n\n  /** 住所情報が空かを判定する */\n  React.useEffect(() => {\n    const isEmptyAddress = (pointName === '' || pointName === defaultPointlabel);\n    setEmptyAddress(isEmptyAddress);\n    // 住所が空の時には予約ボタンを押せないようにする\n    if(isEmptyAddress) {\n      switchIsAvailableReservation(false);\n    }\n  }, [pointName])\n\n  /** 日付が土日祝日かどうかを判定する */\n  const isHoliday = (date: luxon.DateTime): boolean => {\n    // holiday-jpを使って祝日判定\n    const jsDate = date.toJSDate();\n    const isPublicHoliday = holiday.isHoliday(jsDate);\n    \n    // 土日の判定\n    const isWeekend = date.weekday === 6 || date.weekday === 7;\n    \n    return isPublicHoliday || isWeekend;\n  }\n\n  // 初回アクセス時のみクエリを読み込む\n  React.useEffect(() => {\n\n    const searchParams = new URLParams(location.search);\n    /** referrerパラメーターの値。 */\n    const referrer = searchParams.getStringParam('referrer');\n    // referrerパラメーターの値が取得できた場合のみ更新する。\n    if (referrer !== null) {\n      setReferrer(referrer);\n    }\n    // 言語設定をする\n    changeLanguage(searchParams, i18n);\n    // @ts-ignore\n    const company: TaxiCompanyList = searchParams.getStringParam('company') || 'limoTaxi';\n    const metaParams = {\n      key: 'company_configuration',\n      language: searchParams.getStringParam('lang') || 'ja',\n      companyCode: company\n    }\n    // タクシー会社メタ情報を取得する\n    getTaxiCompanyConfiguration(metaParams)\n    .then((res)=>{\n      // 情報が取れないときには何も処理をしない\n      if(!res.body) {\n        return;\n      }\n      const getTaxiCompanyConf: TaxiCompanyConfigurations = res.body;\n      // Redux上にタクシーメタ情報を保存する\n      dispatch(updateTaxiCompanyConfigurations(getTaxiCompanyConf));\n      const getParams = getQueryParams(searchParams, getTaxiCompanyConf);\n      // Stateに保存する\n      setParams(getParams);\n      // タクシー会社の保存をする\n      // 連携パラメーターが無いときにはイースタンとして取り扱う\n      const getTaxiCompany: TaxiCompanyList = getParams?.company? getParams.company: TaxiCompanyList.limoTaxi;\n      setTaxiCompany(getTaxiCompany);\n      setTaxiCompanyConf(getTaxiCompanyConf[getTaxiCompany]);\n      /** 対応している空港一覧をメタ情報より取得する */\n      const supportAirportCodeList = getTaxiCompanyConf[getTaxiCompany].supportAirports;\n      setTargetAirportCodeList(supportAirportCodeList);\n      const companyConf = getTaxiCompanyConf[getTaxiCompany];\n      const defaultAirportCode: string = getParams?.airportCode || companyConf.defaultAirportCode;\n      /** 日付選択タイプを設定する */\n      setTimePattern(companyConf.timePattern);\n      /** 日付選択タイプがプルダウンの場合、一旦選択しないと検索ができないようにする */\n      if(companyConf.timePattern === TaxiTimePattern.pulldown) {\n        switchIsUnselectedRidingDate(true);\n      }\n      if(getParams !== null) {\n        // 空港コードの更新をする\n        setAirportCode(getParams.airportCode);\n        // フライトナンバーの設定をする\n        setFlight(getParams.flightNumber)\n        setEmptyFlight(false);\n        // 搭乗便の時刻変更をする\n        setFlightDate(getParams.flightDate);\n        // 迎車時刻の変更をする\n        setRidingDate(getParams.rideDate);\n        /** デフォルトの送迎パターンを入れる */\n        const defaulPickupPattern = (() => {\n          switch(getTaxiCompanyConf[getTaxiCompany].supportDirection) {\n            case 'toAirport':\n              return PickupPattern.TO_AIRPORT;\n            case 'fromAirport':\n              return PickupPattern.FROM_AIRPORT;\n            case 'all':\n            default:\n              return getParams.isDeparture? PickupPattern.TO_AIRPORT: PickupPattern.FROM_AIRPORT;;\n          }\n        })();\n        setPickupPattern(defaulPickupPattern);\n        // アドレスがある場合にはアドレスを入れる\n        if(getParams.pointAddress !== \"\") {\n          let setDefaultPointName = getParams.pointAddress;\n          // 地点名がある場合には追加で入れる\n          if(getParams.pointName !== \"\") {\n            setDefaultPointName = `${setDefaultPointName} ${getParams.pointName}`;\n          }\n          // クエリで連携された地点名を入れる\n          setPointName(setDefaultPointName);\n        }\n        let position: Location = {\n          lat: getParams.pointLat,\n          lng: getParams.pointLng\n        }\n        // 連携クエリで座標が連携されている場合、読み込む\n        // getQueryParams() 中で日本のArea内かを判定してる\n        if(getParams.pointLat === 0 || getParams.pointLng === 0) {\n          try {\n            const defaultCenter = companyConf.defaultCenter[defaultAirportCode];\n            position = defaultCenter.position;\n          }\n          catch(e) {\n            if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n              console.debug(e);\n            }\n          }\n        }\n        // クエリで連携された地点名に更新する\n        setCenter(position);\n        // クエリで連携された地点にマーカーを建てる\n        setMarkerPoint(position);\n        // 非同期で座標より住所情報を取得して入れ込む\n        setMunicipalityFromPosition(position)\n        // Paramsによって選択モードかマップモードかを切り替える\n        if( getParams.mode !== '' ) {\n          // S3より選択肢一覧を取得する(非同期)\n          setPointListByParams(getParams)\n        }\n        if (getParams.company === TaxiCompanyList.airport_liner) {\n          getParams.mode = 'airportLiner';\n          setPointListByParams(getParams);\n          setSelectPointNumber('-1');\n        }\n        if (getParams.company === TaxiCompanyList.nikaho_go) {\n          setNikahoPointListByParams(getParams, getParams.rideDate, defaulPickupPattern)\n        }\n        // デフォルトフライト選択要素があるならセレクトに追加する\n        if(companyConf.defaultFlightPattern) {\n          const flightpattern = defaulPickupPattern === PickupPattern.TO_AIRPORT?\n            companyConf.defaultFlightPattern.pickup:\n            companyConf.defaultFlightPattern.dropOff;\n          setFlightPattern(flightpattern)\n        }\n      }\n    })\n    .finally(()=>{\n      // クエリがないときにはフラグをONにする\n      switchIsEndInit(true);\n    })\n  }, []);\n\n  return {\n    airportCode, setAirportCode, onChangedAirport,\n    center, setCenter,\n    markerPoint, setMarkerPoint,\n    pointName, setPointName,\n    setPlaceJP,\n    email, onChangedEmail, isEmptyEmail, isInvalidEmail,\n    isUnavalableEmail, isRequiredRetry, isFailed,\n    flight, onChangedFlight,\n    isEmptyFlight, isInvalidFlight,\n    flightDate, setFlightDate, onChangedFlightDate,\n    ridingDate, setRidingDate, onChangedRidingYear, onChangedRidingMonth, onChangedRidingDay,\n    onChangedRidingHour, onChangedRidingMinutes, onChangedRidingHourAndMinutes,\n    isOverDeadline,\n    toAirport, setToAirport, pickupPattern, setPickupPattern,\n    isSubmitted, setSubmitted,\n    onSubmit,\n    municipality, setMunicipality,\n    isSubjectArea, switchSubjectArea,\n    distanceText, durationText,\n    fee, totalFee,\n    switchEdited,\n    taxiCompany,\n    setPlace,\n    mode,\n    selectPointNumber, setSelectPointNumber,\n    pointList,\n    invalidFlightErrorMessage,\n    feeLabel,\n    isEndCallTaxiAPI,\n    isFailCallTaxiAPI,\n    targetAirportCodeList,\n    isEndInit,\n    fareType,\n    notesLabel, alertLabel,\n    isAvailableReservation,\n    isEmptyAddress,\n    taxiCompanyConf,\n    lang,\n    timePattern,\n    flightPattern,\n    selectFlightData,\n    onChangedRidingFlight,\n    selectTimeList,\n    isUnselectedRidingDate,\n    referrer,\n    needRetryRecaptcha,\n    switchNeedRetryRecaptcha,\n    disallowSupportDirection,\n    invalidFlightPattern,\n    isUnselectedFlightHour,\n    isUnselectedFlightMinutes,\n    invalidFlightDateErrorMessage,\n    isUnselectedFlightDate,\n  }\n}\n","/**\n * 便名として入力された文字列が便名の形式になっているかを検証する。\n * @param value 検証したい値。\n */\nexport function isValidFLight(value: string) {\n  const flightFormat = RegExp(/^([a-zA-Za-zA-Z0-90-9]{2}|[a-zA-Za-zA-Z]{3})[0-90-9]{1,4}$/);\n  return flightFormat.test(value);\n}\n","/* eslint react-hooks/exhaustive-deps: 0 */\n\nimport { Container, FormControl, FormControlLabel, Grid, makeStyles, Radio, RadioGroup, TextField, Typography, Button, withStyles, useMediaQuery, Theme, Link, Select, MenuItem } from '@material-ui/core';\nimport React, { useEffect, useState } from 'react';\nimport { useHistory } from 'react-router-dom';\n\nimport ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos';\nimport { isEmail,  isFullWidthKana, isNumber, isLetter, isACMNumber } from '../../../../../utils/regExpUtils';\nimport scClick from '../../../../common/ScClick';\nimport { submitReservation } from '../../../../../services/taxi/Reservation';\nimport { ReservationParams } from '../../../../../services/taxi/Reservation/ReservationParams';\nimport { Alert } from '@material-ui/lab';\nimport Environment from '../../../../../utils/environment';\nimport Cost from './../common/Cost';\nimport AlertInReservation from '../../MiyakoTaxi/AlertInReservation';\nimport { ReservationLabels, ReservationResponse } from '../../../../../services/taxi/Reservation/ReservationResponse';\nimport { useForm } from './Form/useForm';\n\nimport SelectChildrenNum from './Form/SelectChildrenNum';\nimport SelectAdultNum from './Form/SelectAdultNum';\nimport SelectCarNum from './Form/SelectCarNum';\nimport SelectOtherBag from './Form/SelectOtherBag';\nimport SelectSuitcase from './Form/SelectSuitcase';\nimport SelectGolfBag from './Form/SelectGolfBag';\nimport LoadingModal from '../../../../search/LoadingModal';\nimport { switchisLoading } from '../../../../../actions/generalAction';\nimport { useDispatch } from 'react-redux';\nimport Cautions from '../common/Cautions';\nimport Contact from '../common/Contact';\n\nimport { AlertLabel, TaxiCompanyList } from '../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { TaxiCompanyConfiguration } from '../../../../../services/taxi/GetTaxiMetaInfo/model/taxiCompanyConf';\nimport ShowTaxiComapnyLogo from '../TemporaryReservation/ShowTaxiComapnyLogo';\nimport { changeLang, Lang } from '../../../../../states/query';\nimport { useTranslation } from 'react-i18next';\nimport { getSCCkickType } from '../TemporaryReservation/Form/useForm';\nimport { parseFromyyyyMMddHHmm, toLuxonDateTime } from '../../../../../utils/luxonUtil';\n\nconst useStyles = makeStyles(() => ({\n  forms: {\n    marginBottom: \"5px\"\n  },\n  notes: {\n    color: '#ff0000',\n    fontSize: '0.75em'\n  },\n  tableLeft: {\n    backgroundColor: \"#000066\",\n    color: \"#FFF\",\n    fontSize: '0.75rem',\n    border: 'solid 1px #000',\n    padding: '0.5rem 0'\n  },\n  tableRight: {\n    fontSize: '0.75rem',\n    border: 'solid 1px #000',\n    padding: '0.5rem 5px',\n  },\n  tableFlex: {\n    display: 'flex',\n    alignItems: 'center',\n  },\n  formControl: {\n    display: 'flex',\n    fontSize: '0.5rem',\n    flexDirection: 'row',\n    margin: 'auto'\n  },\n  date: {\n    wordBreak: 'keep-all',\n    display: 'flex'\n  },\n  timeSelect: {\n    height: '1rem',\n    width: '3.0rem',\n    fontSize: '0.75rem'\n  },\n  mailForm: {\n    alignItems: 'baseline',\n    padding: '0 5px'\n  },\n  mailText: {\n    fontSize: '0.75rem'\n  },\n  disableMaileTaxt: {\n    fontSize: '0.75rem',\n    background: '#cccccc'\n  },\n  button: {\n    boxShadow: '0 2px 2px 0 rgba(0,0,0,0.30)',\n    borderRadius: '2px',\n    textAlign: 'center',\n    width: '100%',\n    height: '48px',\n    margin: '16px 0',\n  },\n  itemName: {\n    color: \"#ffffff\",\n    fontSize: \"0.75rem\",\n  },\n  text: {\n    color: \"#000000\",\n    fontSize: \"0.75rem\",\n  },\n  validationAlert: {\n    marginTop: \"5px\",\n    padding: \"5px\",\n  },\n  costNotice: {\n    color: '#f44336',\n    textAlign: 'center'\n  },\n  imgContainer: {\n    alignItems: 'flex-start',\n  },\n  easternLogo: {\n    margin: '10px 0px',\n    width: '100%',\n    maxHeight: '156px',\n  },\n  link: {\n    textDecoration: 'underline'\n  }\n}));\n\n/** 背景色を黄色、ラベル色を黒にしたボタンのコンポーネント。 */\nconst YellowButton = withStyles({\n  root: {\n    backgroundColor: \"#FDB50A\",\n  },\n  label: {\n    color: \"#0f0f0f\",\n  },\n})(Button);\n\n\n/** 予約情報のうち、距離・所要時間・金額を表示する部分の文字列。 */\nexport const reservationTransferInfo = (reservationLabels: ReservationLabels) => {\n  const distanceLabel = reservationLabels.distanceLabel;\n  const timeLabel = reservationLabels.durationLabel;\n  const fareLabel = reservationLabels.fareLabel;\n  return `${distanceLabel} ${timeLabel} ${fareLabel}`\n}\n\ninterface Props {\n  /** 仮予約情報。 */\n  reservation?: ReservationResponse,\n  /** 仮予約情報を参照するためのコード。 */\n  code: string,\n  /** 仮予約情報を参照するためのトークン。 */\n  token: string,\n  /** タクシー会社メタ情報 */\n  taxiCompanyConf: TaxiCompanyConfiguration,\n  /** タクシー会社情報 */\n  taxiCompany: TaxiCompanyList\n}\n\n/** 空港送迎タクシーの本予約画面のフォーム部分のコンポーネント。 */\nexport const AirportTransferTaxi: React.FC<Props> = (props: Props) => {\n  /** 実行環境を判別するための環境変数。 */\n  const env = process.env['REACT_APP_STAGE_ENV'] || '';\n  const classes = useStyles();\n  const dispatch = useDispatch();\n  const history = useHistory();\n  const { i18n, t } = useTranslation();\n  const isMobileSize = useMediaQuery((theme: Theme) =>\n    theme.breakpoints.down('sm')\n  );\n\n  /** PDFで利用するHOSTの一覧 */\n  const PDF_HOST_LIST = {\n    stg: \"https://ana-maas-staging.val.jp\",\n    prod: \"https://ana-maas.val.jp\"\n  }\n\n  /** PDFで利用するHOST */\n  const PDF_HOST = process.env['REACT_APP_STAGE_ENV'] === 'master'? PDF_HOST_LIST.prod: PDF_HOST_LIST.stg;\n\n  const {\n    requestCount, setRequestCount,\n    isFailed, setIsFailed,\n    isRequiredRetry, setIsRequiredRetry,\n    isUnavalableEmail, setIsUnavalableEmail,\n    isInvalidInput, setIsInvalidInput,\n    lastName, setLastName,\n    firstName, setFirstName,\n    lastNameKana, setLastNameKana,\n    firstNameKana, setFirstNameKana,\n    placard, setPlacard,\n    carType, setCarType,\n    adultNum, onChangeAdultNum,\n    childNum, onChangeChildNum,\n    carNum, onChangeCarNum,\n    phoneNumber, setPhoneNumber,\n    suitcase, onChangeSuitcase,\n    maxSuitcase,\n    golfBag, onChangedGolfBag, maxGolfBag,\n    otherBag, onChangeOtherBag,\n    payment, setPayment,\n    receiptAddress, setReceiptAddress,\n    remarks, setRemarks,\n    operatorMailaddress, setOperatorMailaddress,\n    acmMileageNumber, setAcmMileageNumber,\n    reservationFare, setReservationFare,\n    reservationLabels, setReservationLabels,\n    setMaxSuitcasePerUnit, setMaxGolfBagPerUnit,\n    setmaxSuitcase, setMaxGolfBag,\n    mailUndeliveredProblemReproduction, setMailUndeliveredProblemReproduction\n  } = useForm();\n\n  // バリデーションで利用する各フラグのState。\n  // 入力された値が適切ではない場合。\n  const [isInvalidLastName, setIsInvalidLastName] = useState(false);\n  const [isInvalidFirstName, setIsInvalidFirstName] = useState(false);\n  const [isInvalidLastNameKana, setIsInvalidLastNameKana] = useState(false);\n  const [isInvalidFirstNameKana, setIsInvalidFirstNameKana] = useState(false);\n  const [isInvalidPhoneNumber, setIsInvalidPhoneNumber] = useState(false);\n  // 領収書で使用する文字列チェック(現在はチェックなし)\n  // const [isInvalidReceiptAddress, setIsInvalidReceiptAddress] = useState(false);\n  const [isInvalidOperatorMailaddress, setIsInvalidOperatorMailaddress] = useState(false);\n  const [isInvalidACMNumber, setIsInvalidACMNumber] = useState(false);\n\n  // 入力された値のうち、必須項目が未設定であることを表すフラグ。\n  const [isEmptyLastName, setIsEmptyLastName] = useState(false);\n  const [isEmptyFirstName, setIsEmptyFirstName] = useState(false);\n  const [isEmptyLastNameKana, setIsEmptyLastNameKana] = useState(false);\n  const [isEmptyFirstNameKana, setIsEmptyFirstNameKana] = useState(false);\n  const [isEmptyPhoneNumber, setIsEmptyPhoneNumber] = useState(false);\n\n  /** プラカードの項目で字数制限を越えている(51文字以上)かを表すフラグ。 */\n  const [isTooLongPlacard, setIsTooLongPlacard] = useState(false);\n\n  /** 備考は500文字以内かを表すフラグ */\n  const [isTooLongRemarks, setInTooLongRemarks] = useState(false);\n\n  /** 仮予約情報。 */\n  const reservation = props.reservation;\n  /** 仮予約情報を参照するためのコード。 */\n  const code = props.code;\n  /** 仮予約情報を参照するためのトークン。 */\n  const token = props.token;\n  /** 空港着の送迎パターンであるかを表すフラグ。 */\n  const isToAirport = reservation?.flight?.isDeparture;\n  /** 車種が復数かつ車種によって金額が異なる場合の注釈を表示するか */\n  const isShowNotesByDifferenceOfTariffs: boolean = (()=>{\n    const tariffs = props.reservation?.transferInfo?.tariffs;\n    if(!tariffs) {\n      return false;\n    }\n    /** 車種が1つだけのときには表示しない */\n    if(Object.keys(tariffs).length < 2) {\n      return false;\n    }\n    /** 車種ごとの料金一覧 */\n    const fares = Object.keys(tariffs).map((x)=>{\n      return tariffs[x].fare?.value;\n    })\n    // 重複を排除した上で料金種類が2種類以上のときには表示する\n    return Array.from(new Set(fares)).length > 1;\n  })()\n  /** 遷移先GoogleMapURL */\n  const setGoogleMapURL = (latlng: string = \"\", lang: Lang) => {\n    if(lang === Lang.ja) {\n      return `https://www.google.co.jp/maps?q=${latlng}`;\n    }\n    return `https://www.google.com/maps?q=${latlng}`;\n  }\n\n  const airportNoteLabel = t('taxi:detail_meeting_point_infomation');\n\n  // 結果画面からの経由で来たか判定\n  // airport_access: 空港アクセスナビから来たと判定\n  // chatan: タクシー会社が那覇ハイヤーの場合のみ、北谷MaaSサイトから来たと判定。\n  // それ以外: ASWから来たと判定(実際には referrer=asw で飛んでくる)\n  const clickName = (()=>{\n    const scClicks = props.taxiCompanyConf?.scClick.reservation;\n    const clickType = getSCCkickType(props.reservation?.referrer);\n    if(!scClicks) {\n      return '';\n    }\n    return scClicks[clickType] || scClicks?.asw;\n  })();\n\n  /** 表示制御用のUI情報 */\n  const ui = props.taxiCompanyConf.ui;\n\n  /** 初回読み込み時のみ処理 */\n  React.useEffect(() => {\n    /** uiよりスーツケースの最大数をセットする */\n    const suitcaseObj = ui.bags.find((x)=> x.id === 'suitcase');\n    if(suitcaseObj && suitcaseObj.maxQuantity) {\n      setMaxSuitcasePerUnit(suitcaseObj.maxQuantity);\n      // スーツケースの個数の最大値を更新する。\n      setmaxSuitcase(suitcaseObj.maxQuantity);\n    }\n    /** uiよりゴルフバッグの最大数をセットする */\n    const golfBagObj = ui.bags.find((x)=> x.id === 'golfBag');\n    if(golfBagObj && golfBagObj.maxQuantity) {\n      setMaxGolfBagPerUnit(golfBagObj.maxQuantity);\n      // スーツケースの個数の最大値を更新する。\n      setMaxGolfBag(golfBagObj.maxQuantity);\n    }\n  }, []);\n\n  /** タクシー会社のメールアドレスとして扱うメールアドレスが変更された場合の処理。 */\n  const onChangedOperatorMailaddress = (value: string) => {\n    setOperatorMailaddress(value);\n  }\n\n  const lastNameChange = (value: string) => {\n    setLastName(value);\n  }\n\n  const firstNameChange = (value: string) => {\n    setFirstName(value);\n  }\n\n  /**\n   * 全角カナの名字の項目が更新された時の処理。\n   * @param value テキストボックスで設定された値。\n   */\n  const onChangedLastNameKana = (value: string) => {\n    setLastNameKana(value);\n  }\n\n  /**\n   * 全角カナの名前の項目が更新された時の処理。\n   * @param value テキストボックスで設定された値。\n   */\n  const onChangedFirstNameKana = (value: string) => {\n    setFirstNameKana(value);\n  }\n\n  const phoneNumberChange = (value: string) => {\n    setPhoneNumber(value);\n  }\n\n  const paymentChange = (value: string) => {\n    setPayment(value);\n  }\n\n  const receiptAddressChange = (value: string) => {\n    setReceiptAddress(value);\n  }\n\n  const remarksChange = (value: string) => {\n    setRemarks(value)\n  }\n\n  /** プラカードの項目の値が更新された時の処理。 */\n  const onChangedPlacard = (value: string) => {\n    setPlacard(value);\n  }\n\n  /** 「名」の欄のヘルパーテキストをフラグに応じて取得する。 */\n  const getHelperTextLastName = () => {\n    if (isEmptyLastName) { return t('taxi:warning_empty_lastname'); }\n    if (isInvalidLastName) { return t('taxi:warning_invalid_lastname'); }\n  }\n\n  /** 「姓」の欄のヘルパーテキストをフラグに応じて取得する。 */\n  const getHelperTextFirstName = () => {\n    if (isEmptyFirstName) { return t('taxi:warning_empty_firstname'); }\n    if (isInvalidFirstName) { return t('taxi:warning_invalid_firstname'); }\n  }\n\n  /** 「メイ」の欄のヘルパーテキストをフラグに応じて取得する。 */\n  const getHelperTextLastNameKana = () => {\n    if (isEmptyLastNameKana) { return \"セイが入力されていません\"; }\n    if (isInvalidLastNameKana) { return \"セイはカタカナで入力してください\"; }\n  }\n\n  /** 「セイ」の欄のヘルパーテキストをフラグに応じて取得する。 */\n  const getHelperTextFirstNameKana = () => {\n    if (isEmptyFirstNameKana) { return \"メイが入力されていません\" }\n    if (isInvalidFirstNameKana) { return \"メイはカタカナで入力してください\"; }\n  }\n\n  /** 「携帯電話番号」の欄のヘルパーテキストをフラグに応じて取得する。 */\n  const getHelperTextPhoneNumber = () => {\n    if (isEmptyPhoneNumber) { return t('taxi:warning_empty_phone_number'); }\n    if (isInvalidPhoneNumber) { return t('taxi:warning_invalid_phone_number'); }\n  }\n\n  /** 「プラカード」の欄のヘルパーテキストをフラグに応じて取得する。 */\n  const getHelperTextPlacard = () => {\n    if (isTooLongPlacard) { return t('taxi:warning_too_long_placard'); }\n  }\n\n  /** 「プラカード」の欄のヘルパーテキストをフラグに応じて取得する。 */\n  const getHelperTextRemarks = () => {\n    if (isTooLongRemarks) { return t('taxi:warning_too_long_remarks'); }\n  }\n\n  /** 自動車タイプより料金・ラベル情報を更新する */\n  const setFareAndLabelsByCarType = (carType: string) => {\n    const transferInfo = props?.reservation?.transferInfo;\n    if(transferInfo && transferInfo.tariffs) {\n      const fare = transferInfo.tariffs[carType]?.fare;\n      if(fare) {\n        setReservationFare(fare);\n      }\n      const labels = transferInfo.tariffs[carType]?.labels;\n      if(labels) {\n        setReservationLabels(labels);\n      }\n    }\n  }\n\n  /** 入力フォームで設定された各項目の検証をする。 */\n  const validate = async() => {\n    const isLangJa = i18n.language === 'ja'\n    /** 「名」の空白チェック結果。 */\n    const resultIsEmptyLastName = lastName === \"\";\n    /** 「姓」の空白チェック結果。 */\n    const resultIsEmptyFirstName = firstName === \"\";\n    /** 「メイ」の空白チェック結果(日本語のみ) */\n    const resultIsEmptyLastNameKana = lastNameKana === \"\" && isLangJa;\n    /** 「セイ」の空白チェック結果(日本語のみ) */\n    const resultIsEmptyFirstNameKana = firstNameKana === \"\" && isLangJa;\n    /** 「携帯電話番号」の空白チェック結果。 */\n    const resultIsEmptyPhoneNumber = phoneNumber === \"\";\n    /** 「携帯電話番号」の空白チェック結果。 */\n    const resultIsEmptyACMNumber = acmMileageNumber === \"\";\n\n    /** 「名」の値のチェック結果。(空白の場合は除く。) */\n    const resultIsInvalidLastName = (!resultIsEmptyLastName && !isLetter(lastName));\n    /** 「姓」の値のチェック結果。(空白の場合は除く。) */\n    const resultIsInvalidFirstName = (!resultIsEmptyFirstName && !isLetter(firstName));\n    /** 「メイ」の値のチェック結果。(空白の場合は除く。) */\n    const resultIsInvalidLastNameKana = isLangJa && (!resultIsEmptyLastNameKana && !isFullWidthKana(lastNameKana));\n    /** 「セイ」の値のチェック結果。(空白の場合は除く。) */\n    const resultIsInvalidFirstNameKana = isLangJa && (!resultIsEmptyFirstNameKana && !isFullWidthKana(firstNameKana));\n    /** 「携帯電話番号」値のチェック結果。(空白の場合は除く。) */\n    const resultIsInvalidPhoneNumber = (!resultIsEmptyPhoneNumber && !isNumber(phoneNumber));\n    /** 「ACM番号」値のチェック結果。(空白の場合は除く。) */\n    const resultIsInvalidACMNumber = (!resultIsEmptyACMNumber && !isACMNumber(acmMileageNumber))\n\n    /** プラカードの項目の検証結果。 */\n    // 任意項目であるため、設定されている場合のみ字数制限(50文字以下であるか)を検証する。\n    const resultIsTooLongPlacard = (placard !== \"\" && placard.length > 50);\n\n    /** 備考の項目の検証結果。 */\n    // 任意項目であるため、設定されている場合のみ字数制限(500文字以下であるか)を検証する。\n    const resultIsTooLongRemarks = (remarks !== \"\" && remarks.length > 500);\n\n    /** 領収書宛名の項目の検証結果。 */\n    // 任意項目であるため、設定されている場合のみ値を検証する。\n    // 現在は領収書宛名の検証は行わない\n    // const resultIsInvalidReceiptAddress = (receiptAddress !== \"\" && !isLetterWithSpace(receiptAddress));\n\n    /** タクシー会社のメールアドレスとして扱うメールアドレスの検証結果。*/\n    // 任意項目であるため、文字列が設定されている場合のみ値を検証する。\n    const resultIsInvalidOperatorMailaddress = (operatorMailaddress !== \"\" && !isEmail(operatorMailaddress));\n\n    // 必須項目の空白チェックの検証結果をStateにセットする。\n    setIsEmptyLastName(resultIsEmptyLastName);\n    setIsEmptyFirstName(resultIsEmptyFirstName);\n    setIsEmptyLastNameKana(resultIsEmptyLastNameKana);\n    setIsEmptyFirstNameKana(resultIsEmptyFirstNameKana);\n    setIsEmptyPhoneNumber(resultIsEmptyPhoneNumber);\n\n    // 代表者氏名の検証結果をStateにセットする。\n    setIsInvalidLastName(resultIsInvalidLastName);\n    setIsInvalidFirstName(resultIsInvalidFirstName);\n\n    // 代表者氏名(全角カナ)での氏名の検証結果をStateにセットする。\n    setIsInvalidLastNameKana(resultIsInvalidLastNameKana);\n    setIsInvalidFirstNameKana(resultIsInvalidFirstNameKana);\n\n    // 電話番号の検証。\n    setIsInvalidPhoneNumber(resultIsInvalidPhoneNumber);\n\n    // ACM番号の検証\n    setIsInvalidACMNumber(resultIsInvalidACMNumber);\n\n    // プラカードの項目の文字数の検証。\n    setIsTooLongPlacard(resultIsTooLongPlacard);\n\n    // 備考の文字数の検証\n    setInTooLongRemarks(resultIsTooLongRemarks)\n\n    // 領収書宛名の検証。(現在はチェックなし)\n    // setIsInvalidReceiptAddress(resultIsInvalidReceiptAddress);\n    // タクシー会社のメールアドレスとして扱うメールアドレスの検証。\n    setIsInvalidOperatorMailaddress(resultIsInvalidOperatorMailaddress);\n\n    // 上記の各項目を検証した結果のうち、1件以上true(検証を通らなかった項目)がある場合、false(入力に不備があること)を返す。\n    if (resultIsEmptyLastName || resultIsEmptyFirstName || resultIsEmptyLastNameKana ||\n        resultIsEmptyFirstNameKana || resultIsEmptyPhoneNumber ||\n        resultIsInvalidLastName || resultIsInvalidFirstName ||\n        resultIsInvalidLastNameKana || resultIsInvalidFirstNameKana ||\n        resultIsInvalidPhoneNumber || resultIsTooLongPlacard ||\n        resultIsInvalidOperatorMailaddress || resultIsTooLongRemarks ) {\n      return false;\n    // 上記の各項目の検証がいずれもfalse(検証を通った状態)であれば、true(入力に不備がないこと)を返す。\n    } else {\n      return true;\n    }\n  }\n\n  /** 予約ボタンを押した時の処理。 */\n  const onSubmit = () => {\n    // 処理中フラグをオンにする。\n    dispatch(switchisLoading(true));\n\n    // ダミータクシーの場合にはSCクリックを実行しない\n    if(props.taxiCompany !== TaxiCompanyList.dummyVal) {\n      // SCクリックの実行。(Adobe Analytics上でのクリック数の集計。)\n      scClick(clickName);\n    }\n\n    // 各フラグをリセットする(オフにする)。\n    // 予約処理に失敗したフラグをオフにする。\n    setIsFailed(false);\n    // 予約処理の再実行を促すフラグをオフにする。\n    setIsRequiredRetry(false);\n    // 設定されたメールアドレスが利用不可であるフラグをオフにする。\n    setIsUnavalableEmail(false);\n    // 入力内容に不備があるフラグをオフにする。\n    setIsInvalidInput(false);\n\n    // リクエスト回数が4回以上の場合、予約処理を実行しない。\n    if (requestCount > 3) {\n      // 利用できないメールアドレスであるフラグをオンにする。\n      setIsUnavalableEmail(true);\n      // 処理中フラグをオフにする。\n      dispatch(switchisLoading(false));\n      return;\n    }\n\n    // 無名関数内で各非同期処理を呼び出す。\n    (async() => {\n      // コード・トークンが未設定の場合はAPIへリクエストしない。\n      if (!code || !token || code === null || token === null) {\n        // 読込中フラグをオフにする。\n        dispatch(switchisLoading(false));\n        return;\n      }\n\n      /** フォームで入力されたすべての値の検証結果。 */\n      // すべての項目で検証が通ればtrue(1件以上検証が通らなかった場合はfalse)となる。\n      const validatedResult = await validate();\n\n      // 本番環境ではoperatorMailaddressを無条件で空文字にします\n      const sendOperatorMailaddress: string = (Environment.getEnvironmentType() !== Environment.PRODUCTION && operatorMailaddress !== undefined)? operatorMailaddress: '';\n      // 本番環境では mailUndeliveredProblemReproduction を無条件でundefinedにします\n      const sendMailUndeliveredProblemReproduction: string | undefined = (Environment.getEnvironmentType() !== Environment.PRODUCTION && mailUndeliveredProblemReproduction !== '')? mailUndeliveredProblemReproduction: undefined;\n\n      // フォームの入力値のすべての項目の検証が通っている場合のみ、本予約APIへリクエストする。\n      if (validatedResult) {\n        /** 本予約APIへリクエストする際のパラメーター。 */\n        // 領収書宛名が設定されている場合は、領収書宛名を含めたオブジェクト、\n        // 領収書宛名が未設定の場合は、領収書宛名を除いたオブジェクトをリクエストパラメーターとする。\n        let params: ReservationParams = {\n          code: code,\n          token: token,\n          lastName: lastName,\n          firstName: firstName,\n          phoneNumber: phoneNumber,\n          passengers: {\n            adult: adultNum,\n            child: childNum,\n          },\n          numOfCars: carNum,\n          carType: carType,\n          paymentMethod: payment,\n          bags: {\n            suitcase: suitcase,\n            golfBag: golfBag,\n            other: otherBag,\n          },\n          placard: placard,\n          count: requestCount,\n          receiptAddress: receiptAddress,\n          remarks: remarks,\n          operatorMailaddress: sendOperatorMailaddress,\n          amc: acmMileageNumber,\n          useTestAddress: sendMailUndeliveredProblemReproduction,\n          // メール送信されないようにするためにはコメントアウトを外す\n          // noSendMails: true,\n          // 言語パラメーター\n          language: i18n.language\n        }\n        if(lastNameKana && firstNameKana) {\n          params = {\n            ...params,\n            lastNameKana: lastNameKana,\n            firstNameKana: firstNameKana,\n          }\n        }\n        /** 整形後のパラメーター。(送信不要な項目が存在する場合は削除した状態のパラメーター。) */\n        const modifiedParams = await modifyParams(params);\n        // 本予約APIにリクエストする。\n        submitReservation(modifiedParams).then((response) => {\n          /** ステータスコード。 */\n          const statusCode = response?.status;\n          /** 予約成功時に完了ページに送るパラメーター。 */\n          const successParams = new URLSearchParams({\n            company: props.taxiCompany,\n            lang: i18n.language,\n            referrer: props.reservation?.referrer ? props.reservation.referrer : '',\n          });\n          // ステータスコードに応じて設定する。\n          switch(statusCode) {\n            case 200:\n              // 予約処理が成功した場合、予約完了ページに遷移する。\n              history.push(`/booking-taxi/success?${successParams.toString()}`);\n              break;\n            case 400:\n              // フォームの入力内容に不備があるフラグをtrueにする。\n              setIsInvalidInput(true);\n              break;\n            case 499:\n              // 別のメールアドレスを設定するよう促すフラグをtrueにする。\n              setIsUnavalableEmail(true);\n              break;\n            case 599:\n              // 予約処理の再実行を促すフラグをtrueにする。\n              setIsRequiredRetry(true);\n              // リクエスト回数をインクリメントする。\n              setRequestCount(requestCount + 1);\n              break;\n            default:\n              // 予約失敗フラグを設定する。\n              setIsFailed(true);\n              break;\n          }\n        }).catch(() => {\n          // 何らかリクエスト処理に失敗した場合は、予約失敗フラグを設定する。\n          setIsFailed(true);\n        }).finally(() => {\n          // 最後にかならず処理中フラグをオフにする。\n          dispatch(switchisLoading(false));\n        });\n      } else {\n        // フォームの入力値のいずれかの項目の検証が通らなかった場合。\n        // 処理中フラグをオフにする。\n        dispatch(switchisLoading(false));\n        // 入力値に不備があるフラグをオンにする。\n        setIsInvalidInput(true);\n        return;\n      }\n    })();\n  }\n\n  /** 本予約APIへのリクエストパラメーターを整形する。 */\n  const modifyParams = async(params: ReservationParams) => {\n    // プラカードの値が未設定の場合は、パラメーターのオブジェクトに「姓」・「名」の値を設定する。\n    if (params.placard === \"\") { params.placard = `${lastName} ${firstName}`; }\n    /** 領収書宛名が未設定の場合は、パラメーターのオブジェクトから削除する。 */\n    if (params.receiptAddress === \"\") { delete params.receiptAddress; }\n    /** タクシー会社のメールアドレスとして扱うアドレスが未設定の場合は、パラメーターのオブジェクトから削除する。 */\n    if (params.operatorMailaddress === \"\") { delete params.operatorMailaddress; }\n    /** マイレージクラブ番号が空の場合には、パラメーターのオブジェクトから削除する */\n    if (!params.amc || params.amc === \"\" ) { delete params.amc; }\n    /** 備考欄が空の場合には、パラメーターのオブジェクトから削除する */\n    if (!params.remarks || params.remarks === \"\" ) { delete params.remarks; }\n    /** 本番環境では開発用パラメーターを削除する */\n    if(process.env['REACT_APP_STAGE_ENV'] === 'master') {\n      /** このメールアドレスがタクシー会社のメールアドレスとして使用され、予約情報などのメールがこちらに送信されるようになる。*/\n      delete params.operatorMailaddress;\n      /** メール送信が行わないようにするための設定 */\n      delete params.noSendMails;\n    }\n    return params;\n  }\n\n  /** フライト時間の項目名のラベルを取得する。 */\n  const getFlightTimeLabel = () => {\n    let label = t('taxi:dep_time');\n    // 予約情報の送迎パターンが「空港発」の場合は、「到着時間」を設定する。\n    if (reservation && reservation.operation === 'dropOff') {\n      label = t('taxi:arr_time');\n    }\n    return label;\n  }\n\n  /** コスト(所要時間・距離)のラベルを取得する。 */\n  const costLabel = () => {\n    if (!reservation) { return ''; }\n    return `${reservationLabels?.distanceLabel} ${reservationLabels?.durationLabel}`;\n  }\n\n  /** 金額ラベルを取得する。 */\n  const PriceLabel: React.FC = () => {\n    if (!reservation || !reservationLabels.fareLabel) {\n      return null;\n    }\n    // バックエンドから返ってきた料金ラベルをそのまま表示する\n    return (\n      <div>{reservationLabels.fareLabel}</div>\n    )\n  }\n\n  /** 備考ラベルを表示する */\n  const NotesLabel: React.FC = () => {\n    if (!reservation || !reservationFare.notesLabel ) {\n      return null;\n    }\n    return (\n      <span data-cy=\"booking_taxi_notes_area\">\n        {reservationFare.notesLabel.map((noteLabel: string, index: number) => {\n          return (\n            <div key={index}>{noteLabel}</div>\n          )\n        })}\n      </span>\n    );\n  }\n\n  /** フォーム上に表示するお迎え日時。 */\n  const rideDatetime = () => {\n    const date = reservation ? parseFromyyyyMMddHHmm(reservation.rideDatetime) : undefined;\n    const showDateFormat = date ? date.toFormat(t('taxi:yyyyMMdd')) : \"\";\n    return `${showDateFormat} ${t('taxi:jst')}`;\n  }\n\n  const rideDate = () => {\n    const date = reservation ? parseFromyyyyMMddHHmm(reservation.rideDatetime) : undefined;\n    const showDateFormat = date ? date.toFormat('yyyy年MM月dd日') : \"\";\n    return `${showDateFormat}`;\n  }\n\n  /** フォーム上に表示する搭乗便の便番号。 */\n  const flightNumber = () => {\n    const flight = reservation ? reservation.flight : undefined;\n    return flight ? flight.number : \"\";\n  }\n\n  /** フォーム上に表示する搭乗便の発着時刻。 */\n  const flightDate = () => {\n    const flightDate = reservation ? parseFromyyyyMMddHHmm(reservation.flight.datetime) : undefined;\n    const showDateFormat = flightDate ? flightDate.toFormat(t('taxi:yyyyMMdd')) : \"\"\n    return `${showDateFormat} ${t('taxi:jst')}`;\n  }\n\n  /** 台数を表示する事業者か判定 */\n  const isDisplayNumberOfCars = (taxiCompany: TaxiCompanyList): boolean => {\n    /** 非表示にする事業者一覧 */\n    return ![\n      TaxiCompanyList.kingTaxi,\n      TaxiCompanyList.sakataNo1Taxi,\n      TaxiCompanyList.shokoHire,\n      TaxiCompanyList.nikaho_go,\n      TaxiCompanyList.airport_liner\n    ].includes(taxiCompany);\n  }\n\n  /** 車種選択欄を表示する事業者か */\n  const isDisplayCarModel = (taxiCompany: TaxiCompanyList): boolean => {\n    /** 非表示にする事業者一覧 */\n    return ![\n      TaxiCompanyList.sakataNo1Taxi,\n      TaxiCompanyList.shokoHire,\n      TaxiCompanyList.nikaho_go,\n      TaxiCompanyList.airport_liner\n    ].includes(taxiCompany);\n  }\n\n  /** タクシーメタ情報を元にしてACM(マイレージ情報)入力欄を表示するか */\n  const isDisplayAMCInputTable = (): boolean => {\n    if(!props.taxiCompanyConf) {\n      return false;\n    }\n    if(!props.taxiCompanyConf.supportAMC.includes(props.reservation?.airportInfo.letter || '')) {\n      return false;\n    }\n    // メタ情報の中にAMC番号のサポート期間要素があるか\n    if(props.taxiCompanyConf.supportAMCPeriod && reservation){\n      const rideDate = parseFromyyyyMMddHHmm(reservation.rideDatetime);\n      const supportPeriod = {\n        start: toLuxonDateTime(props.taxiCompanyConf.supportAMCPeriod.start),\n        end: toLuxonDateTime(props.taxiCompanyConf.supportAMCPeriod.end)\n      }\n      return rideDate >= supportPeriod.start && rideDate <= supportPeriod.end;\n    }\n    // サポート期間要素がない場合には常に表示する\n    // サポート期間要素がある場合には、乗車日がサポート期間内にある場合のみ表示する\n    return true;\n  }\n\n  useEffect(() => {\n    // 初回読み込み時にデフォルトの車種を設定する\n    const defaltCarType = ui?.carTypes?.[0]?.id;\n    if(ui) {\n      if(defaltCarType) {\n        setCarType(defaltCarType);\n      }\n      // デフォルトの決済手段を配置する\n      const defaultPayMethod = ui.paymentMethod?.[0]?.id;\n      if(defaultPayMethod) {\n        paymentChange(defaultPayMethod);\n      }\n    }\n    if(props.reservation?.transferInfo) {\n      const transferInfo = props.reservation.transferInfo;\n      if(transferInfo.tariffConfirmed) {\n        if(transferInfo.fare) {\n          setReservationFare(transferInfo.fare);\n        }\n        if(transferInfo.labels) {\n          setReservationLabels(transferInfo.labels);\n        }\n      }\n      else {\n        // 現在は車種しか想定していない\n        if(transferInfo.tariffTypes === 'carTypes') {\n          setFareAndLabelsByCarType(defaltCarType);\n        }\n      }\n    }\n  }, []);\n\n  /** 庄内エリアのタクシー会社か? */\n  const isShonaiAreaTaxi = [TaxiCompanyList.sakataNo1Taxi, TaxiCompanyList.shokoHire].includes(props.taxiCompany);\n\n  /** 象潟合同のタクシー会社か? */\n  const isKisakataTaxi = [TaxiCompanyList.airport_liner, TaxiCompanyList.nikaho_go].includes(props.taxiCompany);\n\n  /**\n   * 山口県のタクシー会社か?\n   * 対象:宇部山電タクシー、宇部構内タクシー、通津タクシー\n  */\n  const isYamaguchiTaxi = [\n    TaxiCompanyList.ubeSanden,\n    TaxiCompanyList.ubeKounai,\n    TaxiCompanyList.tsuzutaxi\n  ].includes(props.taxiCompany);\n\n  /**\n   * 福島県のタクシー会社か?\n   * 対象:大和自動車交通、北福島タクシー、磐城タクシー\n  */\n  const isFukushimaTaxi = [\n    TaxiCompanyList.daiwaj,\n    TaxiCompanyList.kitafukushima,\n    TaxiCompanyList.iwakiTaxi\n  ].includes(props.taxiCompany);\n\n  /**\n   * マイルキャンペーンver1のタクシーか?\n   * 対象:キングタクシー(kingtaxi2)、石川交通、那覇ハイヤー、別府大分合同タクシー、宮交タクシー\n  */\n  const isMileCampaignPhase1Taxi = [\n    TaxiCompanyList.kingTaxi2,\n    TaxiCompanyList.ishikawakotsu,\n    TaxiCompanyList.nahahire,\n    TaxiCompanyList.gotaku,\n    TaxiCompanyList.miyakou\n  ].includes(props.taxiCompany);\n\n  /**\n   * マイルキャンペーンver2のタクシーか?\n   * 対象:旭川中央交通、函館タクシー、イースタン(羽田/成田)、伊予鉄タクシー(タクシー)、伊予鉄タクシー(ハイヤー)、土電ハイヤー\n  */\n  const isMileCampaignPhase2Taxi = [\n    TaxiCompanyList.Asahikawachuuo,\n    TaxiCompanyList.hakodateTaxi,\n    TaxiCompanyList.limoTaxi,\n    TaxiCompanyList.eastern,\n    TaxiCompanyList.iyotetsutaxi,\n    TaxiCompanyList.iyotetsuTaxi2,\n    TaxiCompanyList.toden\n  ].includes(props.taxiCompany);\n\n  /** 乗車日時が12/19~03/31の間か? */\n  const isRideDateInMileCampaignPeriod = (): boolean => {\n    if(!reservation) {\n      return false;\n    }\n    const rideDate = parseFromyyyyMMddHHmm(reservation.rideDatetime);\n    const startDate = toLuxonDateTime('2024-12-19T00:00:00.000+09:00');\n    const endDate = toLuxonDateTime('2025-03-31T23:59:59.999+09:00');\n    return rideDate >= startDate && rideDate <= endDate;\n  }\n\n  return (\n    <>\n      <Container maxWidth=\"md\" style={{ marginTop: '20px' }}>\n        {/* 本予約の処理実行中に表示する読込中アイコン。 */}\n        <LoadingModal/>\n        {/* タクシーロゴ表示部分。 */}\n        <Grid container justify=\"center\">\n          <Grid item className={classes.imgContainer}>\n            <ShowTaxiComapnyLogo\n              company={props.taxiCompany}\n              lang={changeLang(i18n.language)}\n            />\n          </Grid>\n        </Grid>\n        <Typography style={{ marginTop: \"10px\" }}>\n          {t('taxi:input_reserved_info')}\n        </Typography>\n        <Grid container justify=\"center\">\n          <Grid item xs={3} className={classes.tableLeft}>\n            <Typography className={classes.itemName}>\n              { isToAirport ? t('taxi:pickup_location') : t('taxi:pickup_airport') }\n            </Typography>\n          </Grid>\n          <Grid\n            item\n            xs={9}\n            className={`${classes.tableRight} ${classes.tableFlex}`}\n            data-cy={isToAirport? 'booking_taxi_pickup_location': 'booking_taxi_pickup_airport'}\n          >\n            <div>\n              {/** To空港の場合にはお迎え先の情報をリンクで表示する */}\n              {isToAirport &&\n                <div className={classes.link}>\n                  <Link href={setGoogleMapURL(reservation?.originLatLng, changeLang(i18n.language))} target=\"_blank\">\n                    {/* 出発地の名称。 */}\n                    { reservation?.originLabel }\n                  </Link>\n                </div>\n              }\n              {/* From空港の場合注釈を表示する */}\n              { !isToAirport &&\n                <>\n                  <div>\n                    {/* 出発地の名称。 */}\n                    { reservation?.originLabel }\n                  </div>\n                  <div className={classes.notes}>\n                    {airportNoteLabel}\n                  </div>\n                </>\n              }\n            </div>\n          </Grid>\n          <Grid item xs={3} className={classes.tableLeft}>\n            { isToAirport ? t('taxi:sending_airport') : t('taxi:sending_location') }\n          </Grid>\n          <Grid item xs={9} className={`${classes.tableRight} ${classes.tableFlex}`}>\n            <Grid className={classes.date} data-cy={isToAirport? 'booking_taxi_sending_airport': 'booking_taxi_sending_location'}>\n              {/** To空港の場合には空港名だけ表示する */}\n              { isToAirport &&\n                <div>\n                  {/* 出発地の名称。 */}\n                  { reservation?.destLabel }\n                </div>\n              }\n              {/** From空港の場合にはお送り先の情報をリンクで表示する */}\n              { !isToAirport &&\n                <div className={classes.link}>\n                  <Link href={setGoogleMapURL(reservation?.destLatLng, changeLang(i18n.language))} target=\"_blank\">\n                    {/* 到着地の名称。 */}\n                    { reservation?.destLabel }\n                  </Link>\n                </div>\n              }\n            </Grid>\n          </Grid>\n          {/* ご乗車日時。 */}\n          {props.taxiCompany === TaxiCompanyList.sakataNo1Taxi || props.taxiCompany === TaxiCompanyList.shokoHire ? (\n            <>\n              <Grid item xs={3} className={classes.tableLeft}>\n                {isShonaiAreaTaxi &&\n                  <>\n                    <div>乗合タクシー</div>\n                    <div>ご乗車日/接続する航空便</div>\n                  </>\n                }\n                {!isShonaiAreaTaxi &&\n                  <>\n                    ご乗車日\n                  </>\n                }\n              </Grid>\n              <Grid item xs={9} className={`${classes.tableRight} ${classes.tableFlex}`}>\n                <Grid className={classes.date}>\n                  <div data-cy={\"booking_taxi_ride_date\"}>\n                    {rideDate()}\n                    {isShonaiAreaTaxi &&\n                      <>\n                        {reservation &&\n                          <>\n                            &nbsp;{reservation.taxiConnectFlightNumber}\n                          </>\n                        }\n                        {t('taxi:flight_after')+t('taxi:connect_taxi')}\n                      </>\n                    }\n                  </div>\n                </Grid>\n              </Grid>\n            </>\n          ) : (\n            <>\n              <Grid item xs={3} className={classes.tableLeft}>\n                {t('taxi:boarding_date')}\n              </Grid>\n              <Grid item xs={9} className={`${classes.tableRight} ${classes.tableFlex}`}>\n                <Grid className={classes.date}>\n                  <div data-cy={\"booking_taxi_ride_date\"}>\n                    {/* 仮予約時に設定した乗車日時。 */}\n                    {rideDatetime()}\n                    {isKisakataTaxi &&\n                      <>\n                        {t('taxi:dep_taxi')}\n                      </>\n                    }\n                  </div>\n                </Grid>\n              </Grid>\n            </>\n          )}\n          {/* ご利用便。 */}\n          <Grid item xs={3} className={classes.tableLeft}>\n            {isShonaiAreaTaxi &&\n              <>\n                {t('taxi:flight_number_shonai_taxi')} { getFlightTimeLabel() }\n              </>\n            }\n            {!isShonaiAreaTaxi &&\n              <>\n                {t('taxi:flight_number')} { getFlightTimeLabel() }\n              </>\n            }\n          </Grid>\n          {/* 搭乗便 */}\n          <Grid item xs={9} className={classes.tableRight} data-cy={\"booking_taxi_flight_label\"}>\n            { `${flightNumber()} ${flightDate()} ` }\n          </Grid>\n          {/* 代表者の氏名。 */}\n          <Grid item xs={3} className={classes.tableLeft}>\n            {t('taxi:representative_name')}\n          </Grid>\n          <Grid item xs={9} className={`${classes.tableRight}`}>\n            <Grid container>\n              <FormControl variant=\"outlined\" className={`${classes.mailForm} ${classes.tableFlex}`}>\n                {t('taxi:family_name')}\n                <TextField\n                  className={classes.mailText}\n                  variant=\"outlined\"\n                  value={lastName}\n                  onChange={(e: any) => {lastNameChange(e.target.value)}}\n                  error={ (isEmptyLastName || isInvalidLastName) }\n                  inputProps={{\n                    style: {\n                      padding: '3px',\n                      fontSize: '0.75rem'\n                    }\n                  }}\n                  FormHelperTextProps={{\n                    style: {\n                      margin: '8px 0 0',\n                    }\n                  }}\n                />\n                { (isEmptyLastName || isInvalidLastName) &&\n                    <Alert severity=\"error\" className={classes.validationAlert}>{getHelperTextLastName()}</Alert> }\n              </FormControl>\n              <FormControl variant=\"outlined\" className={`${classes.mailForm} ${classes.tableFlex}`}>\n                {t('taxi:first_name')}\n                <TextField\n                  className={classes.mailText}\n                  variant=\"outlined\"\n                  value={firstName}\n                  onChange={(e: any) => {firstNameChange(e.target.value)}}\n                  error={ (isEmptyFirstName || isInvalidFirstName) }\n                  inputProps={{\n                    style: {\n                      padding: '3px',\n                      fontSize: '0.75rem'\n                    }\n                  }}\n                  FormHelperTextProps={{\n                    style: {\n                      margin: '8px 0 0',\n                    }\n                  }}\n                />\n                { (isEmptyFirstName || isInvalidFirstName) &&\n                    <Alert severity=\"error\" className={classes.validationAlert}>{getHelperTextFirstName()}</Alert> }\n              </FormControl>\n            </Grid>\n            {/** 日本語版のみ氏名のカナを入れる欄を追加する */}\n            { changeLang(i18n.language) === Lang.ja &&\n              <Grid container data-cy={\"booking_taxi_kana_input\"}>\n                <FormControl variant=\"outlined\" className={`${classes.mailForm} ${classes.tableFlex}`}>\n                  セイ(全角カナ)\n                  <TextField\n                    className={classes.mailText}\n                    variant=\"outlined\"\n                    value={lastNameKana}\n                    onChange={(e: any) => {onChangedLastNameKana(e.target.value)}}\n                    error={ (isEmptyLastNameKana || isInvalidLastNameKana) }\n                    inputProps={{\n                      style: {\n                        padding: '3px',\n                        fontSize: '0.75rem'\n                      }\n                    }}\n                    FormHelperTextProps={{\n                      style: {\n                        margin: '8px 0 0',\n                      }\n                    }}\n                  />\n                  { (isEmptyLastNameKana || isInvalidLastNameKana) &&\n                      <Alert severity=\"error\" className={classes.validationAlert}>{getHelperTextLastNameKana()}</Alert> }\n                </FormControl>\n                <FormControl variant=\"outlined\" className={`${classes.mailForm} ${classes.tableFlex}`}>\n                  メイ(全角カナ)\n                  <TextField\n                    className={classes.mailText}\n                    variant=\"outlined\"\n                    value={firstNameKana}\n                    onChange={(e: any) => {onChangedFirstNameKana(e.target.value)}}\n                    error={ (isEmptyFirstNameKana ||isInvalidFirstNameKana) }\n                    inputProps={{\n                      style: {\n                        padding: '3px',\n                        fontSize: '0.75rem'\n                      }\n                    }}\n                    FormHelperTextProps={{\n                      style: {\n                        margin: '8px 0 0',\n                      }\n                    }}\n                  />\n                  { (isEmptyFirstNameKana ||isInvalidFirstNameKana) &&\n                      <Alert severity=\"error\" className={classes.validationAlert}>{getHelperTextFirstNameKana()}</Alert> }\n                </FormControl>\n              </Grid>\n            }\n          </Grid>\n            <Grid item xs={3} className={classes.tableLeft}>\n              {t('taxi:placard_name')}\n            </Grid>\n            <Grid item xs={9} className={classes.tableRight}>\n              {/** supportPlacardName 属性がある場合のみプラカード欄を入力できるようにする。 */}\n              {props.taxiCompanyConf && props.taxiCompanyConf.supportPlacardName &&\n                <FormControl variant=\"outlined\" className={classes.mailForm}>\n                  <TextField\n                    className={classes.mailText}\n                    variant=\"outlined\"\n                    value={placard}\n                    onChange={(e: any) => {onChangedPlacard(e.target.value)}}\n                    error={ (isTooLongPlacard) }\n                    fullWidth\n                    inputProps={{\n                      style: {\n                        padding: '3px',\n                        fontSize: '0.75rem'\n                      }\n                    }}\n                    FormHelperTextProps={{\n                      style: {\n                        margin: '8px 0 8px',\n                      }\n                    }}\n                  />\n                  { (isTooLongPlacard) &&\n                        <Alert severity=\"error\" className={classes.validationAlert}>{getHelperTextPlacard()}</Alert> }\n                  <span className={classes.notes}>{t('taxi:placard_name_notice')}</span>\n                </FormControl>\n              }\n              {/** プラカード欄(入力不可) */}\n              {props.taxiCompanyConf && !props.taxiCompanyConf.supportPlacardName &&\n                <FormControl variant=\"outlined\" disabled={true} className={classes.mailForm}>\n                  <TextField\n                    className={classes.disableMaileTaxt}\n                    variant=\"outlined\"\n                    fullWidth\n                    inputProps={{\n                      style: {\n                        padding: '3px',\n                        fontSize: '0.75rem'\n                      }\n                    }}\n                    FormHelperTextProps={{\n                      style: {\n                        margin: '8px 0 8px',\n                      }\n                    }}\n                    disabled={true}\n                  />\n                  <span className={classes.notes}>{t('taxi:not_surrport_placard')}</span>\n                </FormControl>\n              }\n            </Grid>\n          {/* 連絡先。 */}\n          <Grid item xs={3} className={classes.tableLeft}>\n            {t('taxi:phone_number')}\n          </Grid>\n          <Grid item xs={9} className={classes.tableRight}>\n            <FormControl variant=\"outlined\" className={classes.mailForm}>\n              <TextField\n                className={classes.mailText}\n                variant=\"outlined\"\n                value={phoneNumber}\n                onChange={(e: any) => {phoneNumberChange(e.target.value)}}\n                error={ (isEmptyPhoneNumber || isInvalidPhoneNumber) }\n                fullWidth\n                inputProps={{\n                  style: {\n                    padding: '3px',\n                    fontSize: '0.75rem'\n                  }\n                }}\n                FormHelperTextProps={{\n                  style: {\n                    margin: '8px 0 8px',\n                  }\n                }}\n              />\n              { (isEmptyPhoneNumber || isInvalidPhoneNumber) &&\n                <Alert severity=\"error\" className={classes.validationAlert}>{getHelperTextPhoneNumber()}</Alert> }\n              <Typography className={classes.notes}>{t('taxi:phone_number_notice')}</Typography>\n            </FormControl>\n          </Grid>\n          {/* 車種。 */}\n          { isDisplayCarModel(props.taxiCompany) &&\n            <>\n              <Grid item xs={3} className={classes.tableLeft}>\n                {t('taxi:desired_car_model')}\n              </Grid>\n              <Grid item xs={9} className={classes.tableRight}>\n                <div data-cy={\"booking_taxi_desired_car_model\"}>\n                  {/** 宮交の場合にはスペシャルな注意事項を出す */}\n                  { props.taxiCompany === TaxiCompanyList.miyakou &&\n                    <div className={classes.notes}>\n                      本フォームでご予約いただける車種は小型のみとなります。<br/>\n                      小型以外をご希望の場合は、<br/>\n                      お手数ですが宮交タクシーへ直接お問い合わせください。\n                    </div>\n                  }\n                  <FormControl component=\"fieldset\">\n                    <RadioGroup aria-label=\"car-type\" name=\"car-type\" value={carType}>\n                      {/** 選択可能車種をメタ情報を元に表示 */}\n                      { ui.carTypes.map((getCarType, index)=>{\n                        return (\n                          <FormControlLabel\n                            value={getCarType.id}\n                            label={\n                              <Typography className={classes.text}>{getCarType.label}</Typography>\n                            }\n                            control={\n                              <Radio size='small' onClick={\n                                () => {\n                                  setCarType(getCarType.id);\n                                  setFareAndLabelsByCarType(getCarType.id);\n                                }\n                              }/>\n                            }\n                            key={index}\n                          />\n                        )\n                      }) }\n                    </RadioGroup>\n                  </FormControl>\n                  {/** 車種が復数かつ車種によって金額が異なる場合の注釈を表示する */}\n                  { isShowNotesByDifferenceOfTariffs &&\n                    <div className={classes.notes}>\n                      {t('taxi:desired_car_model_notice')}\n                    </div>\n                  }\n                </div>\n              </Grid>\n            </>\n          }\n          {/* 利用人数。 */}\n          <Grid item xs={3} className={classes.tableLeft}>\n            {t('taxi:user_num')}\n          </Grid>\n          <Grid item xs={9} className={classes.tableRight}>\n            <div className={classes.tableFlex}>\n              <div>\n                {t('taxi:adult')}<br/>\n                <FormControl variant=\"outlined\" className={classes.formControl} style={{marginTop: '0.3rem'}}>\n                  <SelectAdultNum value={adultNum} onChange={onChangeAdultNum} />\n                  <Typography className={classes.text}>\n                    {t('taxi:num')}\n                  </Typography>\n                </FormControl>\n              </div>\n              <div style={{ marginLeft: '1rem' }}>\n                {t('taxi:child')}<br/>\n                <FormControl variant=\"outlined\" className={classes.formControl} style={{marginTop: '0.3rem'}}>\n                  <SelectChildrenNum value={childNum} onChange={onChangeChildNum} />\n                  <Typography className={classes.text}>\n                    {t('taxi:num')}\n                  </Typography>\n                </FormControl>\n              </div>\n            </div>\n            { props.taxiCompany === TaxiCompanyList.nikaho_go &&\n              <div className={classes.notes} style={{ marginTop: '0.3rem'}}>\n                ※幼児から大学生は学割料金(1,000円)但し適用日限定・公的証明書の提示必須<br/>\n                詳しくは、にかほGOウェブサイト(https://www.nikaho-kanko.jp/nikahogo.html)にてご確認ください\n              </div>\n            }\n            { props.taxiCompany === TaxiCompanyList.airport_liner &&\n              <div className={classes.notes} style={{ marginTop: '0.3rem'}}>\n                ※現地でのお支払い時、子供は半額となります。\n              </div>\n            }\n            { isShonaiAreaTaxi &&\n              <div className={classes.notes} style={{ marginTop: '0.3rem'}}>\n                ※現地でのお支払い時、小学生は半額となります。\n              </div>\n            }\n          </Grid>\n          {/** 台数: 特定の事業者の場合は表示しない */}\n          { isDisplayNumberOfCars(props.taxiCompany) &&\n            <>\n              <Grid item xs={3} className={classes.tableLeft}>\n                {t('taxi:number_of_cars')}\n              </Grid>\n              <Grid item xs={9} className={classes.tableRight}>\n                <FormControl variant=\"outlined\" className={classes.formControl}>\n                  <SelectCarNum value={carNum} onChange={onChangeCarNum} />\n                  <Typography className={classes.text}>\n                    {carNum > 1? t('taxi:numbers_car'): t('taxi:number_car')}\n                  </Typography>\n                </FormControl>\n              </Grid>\n            </>\n          }\n          {/** 大きなお荷物 */}\n          <Grid item xs={3} className={classes.tableLeft}>\n            {t('taxi:big_baggage')}\n          </Grid>\n          <Grid item xs={9} className={classes.tableRight}>\n            {/** 選択可能荷物をメタ情報を元に表示 */}\n            { ui.bags.map((bag, index)=>{\n              const SetSelectArea: React.FC = () => {\n                switch(bag.id) {\n                  case 'suitcase':\n                    return (\n                      <SelectSuitcase\n                        value={suitcase}\n                        onChange={onChangeSuitcase}\n                        maxNum={maxSuitcase}\n                      />\n                    );\n                  case 'golfBag':\n                    return (\n                      <SelectGolfBag\n                        value={golfBag}\n                        onChange={onChangedGolfBag}\n                        maxNum={maxGolfBag}\n                      />\n                    );\n                  default:\n                    return (\n                      <SelectOtherBag\n                        value={otherBag}\n                        maxOtherBag={bag.maxQuantity || 9}\n                        onChange={onChangeOtherBag}\n                      />\n                    )\n                }\n              }\n              return (\n                <FormControl variant=\"outlined\" className={classes.formControl} key={index}>\n                  <Typography className={classes.text} style={{marginRight: '0.3rem'}}>\n                    {bag.label}\n                  </Typography>\n                  <SetSelectArea/>\n                  <Typography className={classes.text} style={{marginRight: '0.3rem'}}>\n                    {t('taxi:number_bag')}\n                  </Typography>\n                </FormControl>\n              )\n            }) }\n            <div className={classes.notes}>\n              {/** 選べる車種が1種類のときだけこちらのメッセージを表示する */}\n              { props.taxiCompanyConf?.ui?.carTypes && Object.keys(props.taxiCompanyConf.ui.carTypes).length === 1 &&\n                <>\n                  {t('taxi:bigbag_notice_1')}<br/>\n                </>\n              }\n              {t('taxi:bigbag_notice_2')}\n            </div>\n          </Grid>\n          {/** お支払い方法 */}\n          <Grid item xs={3} className={classes.tableLeft}>\n            {t('taxi:pay_method')}\n          </Grid>\n          <Grid item xs={9} className={classes.tableRight} data-cy={\"booking_taxi_payment\"}>\n            <FormControl component=\"fieldset\">\n              <RadioGroup\n                aria-label=\"payment\"\n                name=\"payment\"\n                value={payment}\n                onChange={(e: any) => {paymentChange(e.target.value)}}\n              >\n                {/** 選択可能決済手段をメタ情報を元に表示 */}\n                { ui.paymentMethod.map((pay, index) => {\n                  return (\n                    <FormControlLabel\n                      value={pay.id}\n                      control={<Radio />}\n                      label={\n                        <Typography className={classes.text}>{pay.label}</Typography>\n                      }\n                      key={index}\n                    />\n                  )\n                })}\n              </RadioGroup>\n            </FormControl>\n            <Typography className={classes.notes}>\n              {t('taxi:pay_notice')}\n            </Typography>\n          </Grid>\n          {/* タクシーメタ情報を元にして、ACM(マイレージ情報)がtrueの時には入力欄を設ける */}\n          { isDisplayAMCInputTable() &&\n            <>\n              <Grid item xs={3} className={classes.tableLeft}>\n                {t('taxi:ana_mileage_club_number')}\n              </Grid>\n              <Grid item xs={9} className={classes.tableRight} data-cy={\"booking_taxi_mileage_club_area\"}>\n                <FormControl variant=\"outlined\" className={classes.mailForm}>\n                  <TextField\n                    className={classes.mailText}\n                    variant=\"outlined\"\n                    value={acmMileageNumber}\n                    onChange={(e: any) => {setAcmMileageNumber(e.target.value)}}\n                    inputProps={{\n                      style: {\n                        padding: '3px',\n                        fontSize: '0.75rem'\n                      }\n                    }}\n                    error={isInvalidACMNumber}\n                    FormHelperTextProps={{\n                      style: {\n                        margin: '8px 0 8px',\n                      }\n                    }}\n                  />\n                  { isYamaguchiTaxi &&\n                    <Typography className={classes.notes} style={{ marginTop: '0.3rem'}}>\n                      ※2024年8月1日~2025年1月31までのご利用でいまだけマイルキャンペーン実施中!詳細は\n                      <Link\n                        href={`${PDF_HOST}/AM-991/mileage-campaign-1.pdf`}\n                        target=\"_blank\"\n                        className={classes.link}\n                      >\n                        こちら\n                      </Link>\n                      にてご確認ください\n                    </Typography>\n                  }\n                  { props.taxiCompany === TaxiCompanyList.hinomaru&&\n                    <Typography className={classes.notes} style={{ marginTop: '0.3rem'}}>\n                      ※2024年11月1日~2025年3月31までのご利用でいまだけマイルキャンペーン実施中!詳細は\n                      <Link\n                        href={`${PDF_HOST}/AM-991/mileage-campaign-2.pdf`}\n                        target=\"_blank\"\n                        className={classes.link}\n                      >\n                        こちら\n                      </Link>\n                      にてご確認ください\n                    </Typography>\n                  }\n                  { isFukushimaTaxi &&\n                    <Typography className={classes.notes} style={{ marginTop: '0.3rem'}}>\n                      ※2024年12月1日~2025年3月31までのご利用でいまだけマイルキャンペーン実施中!詳細は\n                      <Link\n                        href={`${PDF_HOST}/AM-991/mileage-campaign-3.pdf`}\n                        target=\"_blank\"\n                        className={classes.link}\n                      >\n                        こちら\n                      </Link>\n                      にてご確認ください\n                    </Typography>\n                  }\n                  { isMileCampaignPhase1Taxi &&\n                    <Typography className={classes.notes} style={{ marginTop: '0.3rem'}}>\n                      ※2024年12月19日~2025年3月31までのご利用でいまだけマイルキャンペーン実施中!詳細は\n                      <Link\n                        href={`${PDF_HOST}/AM-991/mileage-campaign-4.pdf`}\n                        target=\"_blank\"\n                        className={classes.link}\n                      >\n                        こちら\n                      </Link>\n                      にてご確認ください\n                    </Typography>\n                  }\n                  { (isMileCampaignPhase2Taxi && isRideDateInMileCampaignPeriod()) &&\n                    <Typography className={classes.notes} style={{ marginTop: '0.3rem'}}>\n                      ※2024年12月19日~2025年3月31までのご利用でダブルマイルキャンペーン実施中!詳細は\n                      <Link\n                        href={`${PDF_HOST}/AM-991/mileage-campaign-4.pdf`}\n                        target=\"_blank\"\n                        className={classes.link}\n                      >\n                        こちら\n                      </Link>\n                      にてご確認ください\n                    </Typography>\n                  }\n                  {/* ANAマイレージクラブ会員番号に数字以外が含まれている場合の警告。 */}\n                  { isInvalidACMNumber &&\n                    <Alert severity=\"error\" className={classes.validationAlert}>{t('taxi:ana_mileage_club_notice')}</Alert>\n                  }\n                </FormControl>\n              </Grid>\n            </>\n          }\n          {/** 領収書宛名 */}\n          <Grid item xs={3} className={classes.tableLeft}>\n            {t('taxi:receipt_name')}\n          </Grid>\n          <Grid item xs={9} className={classes.tableRight}>\n            <FormControl variant=\"outlined\" className={classes.mailForm}>\n              <TextField\n                className={classes.mailText}\n                variant=\"outlined\"\n                value={receiptAddress}\n                onChange={(e: any) => {receiptAddressChange(e.target.value)}}\n                fullWidth\n                inputProps={{\n                  style: {\n                    padding: '3px',\n                    fontSize: '0.75rem'\n                  }\n                }}\n                FormHelperTextProps={{\n                  style: {\n                    margin: '8px 0 8px',\n                  }\n                }}\n              />\n            </FormControl>\n          </Grid>\n          {/** 備考 */}\n          <Grid item xs={3} className={classes.tableLeft}>\n            {t('taxi:remarks')}<br/>\n            {t('taxi:remarks_notice')}\n          </Grid>\n          <Grid item xs={9} className={classes.tableRight}>\n            <FormControl variant=\"outlined\" className={classes.mailForm} style={{ width: '70%' }}>\n              <TextField\n                className={classes.mailText}\n                variant=\"outlined\"\n                value={remarks}\n                error={isTooLongRemarks}\n                onChange={(e: any) => {remarksChange(e.target.value)}}\n                fullWidth\n                multiline\n                rows={2}\n                inputProps={{\n                  style: {\n                    padding: '3px',\n                    fontSize: '0.75rem'\n                  }\n                }}\n                FormHelperTextProps={{\n                  style: {\n                    margin: '8px 0 8px',\n                  }\n                }}\n              />\n              {/* エアポートライナーの場合*/}\n              { props.taxiCompany === TaxiCompanyList.airport_liner &&\n                <Typography className={classes.notes}>\n                  ※車いすご利用の場合は、その旨ご記入ください\n                </Typography>\n              }\n\n            { (isTooLongRemarks) &&\n              <Alert severity=\"error\" className={classes.validationAlert}>{getHelperTextRemarks()}</Alert>\n            }\n            </FormControl>\n          </Grid>\n          {/* dev, staging環境でのみ、タクシー会社のメールアドレスとして扱うメールアドレスを設定できる欄を表示する。 */}\n          { (Environment.isDev(env) || Environment.isStaging(env)) &&\n            <>\n              <Grid item xs={3} className={classes.tableLeft}>\n                タクシー会社のメールアドレスとして扱うメールアドレス\n              </Grid>\n              <Grid item xs={9} className={classes.tableRight}>\n                <FormControl variant=\"outlined\" className={classes.mailForm} style={{ width: '70%' }}>\n                  <TextField\n                    className={classes.mailText}\n                    variant=\"outlined\"\n                    value={operatorMailaddress}\n                    onChange={(e: any) => {onChangedOperatorMailaddress(e.target.value)}}\n                    error={ isInvalidOperatorMailaddress }\n                    helperText={ isInvalidOperatorMailaddress && \"不正なメールアドレスです。\"}\n                    fullWidth\n                    inputProps={{\n                      style: {\n                        padding: '3px',\n                        fontSize: '0.75rem'\n                      }\n                    }}\n                    FormHelperTextProps={{\n                      style: {\n                        margin: '8px 0 8px',\n                      }\n                    }}\n                  />\n                  <Typography variant=\"caption\">\n                    ※開発・ステージング環境のみ表示<br/>\n                    予約情報などのメールが指定したアドレスに送信される。\n                  </Typography>\n                </FormControl>\n              </Grid>\n              <Grid item xs={3} className={classes.tableLeft}>\n                タクシーメール未送信への対応\n              </Grid>\n              <Grid item xs={9} className={classes.tableRight}>\n                <FormControl variant=\"outlined\">\n                  <Select\n                    onChange={(e: any) => {\n                      setMailUndeliveredProblemReproduction(e.target.value)\n                    }}\n                    value={mailUndeliveredProblemReproduction}\n                  >\n                    <MenuItem value={\"\"}>なし</MenuItem>\n                    <MenuItem value={\"bounce\"}>バウンス(Bounce)</MenuItem>\n                    <MenuItem value={\"complaint\"}>苦情(Complaint)</MenuItem>\n                    <MenuItem value={\"suppressionlist\"}>suppressionlist</MenuItem>\n                  </Select>\n                  <Typography variant=\"caption\">\n                    bounce: メールがバウンスされた状態を再現<br/>\n                    complaint: メール受信者が「迷惑メール」としてプロバイダに報告した状態で、プロバイダが受信を拒否した状態を再現<br/>\n                    suppressionlist: 当該アドレスに不着が頻発して、SESが送信しないリストに登録された状態を再現(挙動的にはbounceと同じ)<br/><br/>\n                    ※開発・ステージング環境のみ表示<br/>\n                    予約情報などのメールが指定したアドレスに送信される。\n                  </Typography>\n                </FormControl>\n              </Grid>\n            </>\n          }\n        </Grid>\n        {/* 縦並びで料金表示部分・予約ボタンを表示する。 */}\n        <Grid container direction=\"column\">\n          {/* 距離・時間・金額部分。 */}\n          {/* 要お問い合わせの場合。 */}\n          { reservationFare.priceType === 'ask' && <Cost label={t('taxi:notice_amount_details')} />}\n          {/* 定額・メーター料金の場合。 */}\n          { (reservationFare.priceType === 'fixed' || reservationFare.priceType === 'PAYG') && (\n            <Cost label={\n              <span data-cy=\"booking_taxi_cost_area\">\n                { costLabel() }\n                {/* モバイルサイズ(画面幅960px未満)の場合は改行を入れる。 */}\n                { isMobileSize && <br /> }\n                {/* デスクトップサイズ(画面幅960px以上)の場合は空白を入れる。 */}\n                { !isMobileSize && <>&nbsp;</> }\n                {/* 料金ラベルを表示する */}\n                <PriceLabel/>\n                {/* 備考を表示する */}\n                <NotesLabel/>\n              </span>\n            }\n            />\n          )}\n          {/** アラート表示がある場合には掲載する */}\n          { (reservation && reservation.transferInfo?.labels?.alertLabel) && reservation.transferInfo.labels.alertLabel.map((alert: AlertLabel, index: number)=>{\n            if(alert.type === 'alert') {\n              const severity = \"warning\";\n              return (\n                <Alert severity={severity} key={index}>\n                  { alert.message }\n                </Alert>\n              )\n            }\n            else {\n              return (\n                <Grid className={classes.costNotice}>\n                  {alert.message}\n                </Grid>\n              )\n            }\n          })}\n\n          <Grid item>\n            {/* 予約に失敗した場合はその旨の警告を表示する。 */}\n            { isFailed && <AlertInReservation type=\"fail\"/> }\n            {/* 入力内容に不備がある場合はその旨の警告を表示する。 */}\n            { isInvalidInput && <AlertInReservation type=\"input\"/> }\n            {/* 再試行が必要な場合はその旨の警告を表示する。 */}\n            { isRequiredRetry && <AlertInReservation type=\"retry\"/> }\n            {/* 利用できないメールアドレスが設定されている場合はその旨の警告を表示する。 */}\n            { isUnavalableEmail && <AlertInReservation type=\"email\"/> }\n          </Grid>\n          <Grid item>\n            {/* 予約・料金確認などのアクション用のボタン。 */}\n            <YellowButton\n              size=\"large\"\n              variant=\"contained\"\n              className={classes.button}\n              endIcon={<ArrowForwardIosIcon/>}\n              onClick={onSubmit}\n            >\n              {t('taxi:process_reservation_button')}\n            </YellowButton>\n          </Grid>\n          {/* 注意事項。 */}\n          <Grid item>\n            <Cautions\n              isMeterFare={reservationFare.fareType === 'PAYG'}\n              companyDisplayName={props.taxiCompanyConf?.temporaryDisplayName || ''}\n              isSupportAMC={isDisplayAMCInputTable()}\n              company={props.taxiCompany}\n              isReservationPage\n            />\n          </Grid>\n          {/* 問い合わせ先。 */}\n          <Grid item>\n            <Contact\n              company={props.taxiCompany}\n            />\n          </Grid>\n        </Grid>\n      </Container>\n    </>\n  );\n}\n\nexport default AirportTransferTaxi;\n","/* eslint react-hooks/exhaustive-deps: 0 */\n\nimport React from 'react';\nimport Cookies from 'js-cookie';\nimport Environment from '../../../../../../utils/environment';\nimport { defaultReservationFare, defaultReservationLabels, ReservationFare, ReservationLabels } from '../../../../../../services/taxi/Reservation/ReservationResponse';\n\n/**\n * 空港送迎タクシーの本予約画面の情報に関するカスタムフック。\n */\nexport function useForm() {\n  /** リクエスト回数。 */\n  const [requestCount, setRequestCount] = React.useState(1);\n  /** 本予約に失敗したかを表すフラグ。 */\n  const [isFailed, setIsFailed] = React.useState(false);\n  /** 予約処理の再実行を促すかを表すフラグ。 */\n  const [isRequiredRetry, setIsRequiredRetry] = React.useState(false);\n  /** 利用できないメールアドレスが設定されているかを表すフラグ。 */\n  const [isUnavalableEmail, setIsUnavalableEmail] = React.useState(false);\n  /** 入力内容に不備があることを表すフラグ。 */\n  const [isInvalidInput, setIsInvalidInput] = React.useState(false);\n\n  // フォームで設定する各項目の値を管理するState。\n  /** 代表者氏名の姓。 */\n  const [lastName, setLastName] = React.useState('');\n  /** 代表者氏名の名。 */\n  const [firstName, setFirstName] = React.useState('');\n  /** 代表者氏名(全角カナ)の姓。 */\n  const [lastNameKana, setLastNameKana] = React.useState('');\n  /** 代表者氏名(全角カナ)の名。 */\n  const [firstNameKana, setFirstNameKana] = React.useState('');\n  /** プラカードの項目で設定する名前。(自由入力) */\n  const [placard, setPlacard] = React.useState('');\n  /** 選択車種。 */\n  const [carType, setCarType] = React.useState('');\n  /** 大人の人数。 */\n  const [adultNum, setAdultNum] = React.useState(1);\n  /** 子供の人数。 */\n  const [childNum, setChildNum] = React.useState(0);\n  /** 台数。 */\n  const [carNum, setCarNum] = React.useState(1);\n  /** 電話番号。 */\n  const [phoneNumber, setPhoneNumber] = React.useState('');\n  /** スーツケースの個数。 */\n  const [suitcase, setSuitcase] = React.useState(0);\n  /** スーツケースの最大個数。 */\n  const [maxSuitcase, setmaxSuitcase] = React.useState(4);\n  /** 車1台あたりのスーツケースの最大数 */\n  const [maxSuitcasePerUnit, setMaxSuitcasePerUnit] = React.useState(4);\n  /** ゴルフバッグの個数。 */\n  const [golfBag, setGolfBag] = React.useState(0);\n  /** ゴルフバッグの個数。 */\n  const [maxGolfBag, setMaxGolfBag] = React.useState(3);\n  /** 車1台あたりのゴルフバッグの最大数 */\n  const [maxGolfBagPerUnit, setMaxGolfBagPerUnit] = React.useState(3);\n  /** その他(※車椅子など)荷物の個数。 */\n  const [otherBag, setOtherBag] = React.useState(0);\n  /** 支払い方法。 */\n  const [payment, setPayment] = React.useState('');\n  /** 領収書宛名。 */\n  const [receiptAddress, setReceiptAddress] = React.useState('');\n  /** 備考 */\n  const [remarks, setRemarks] = React.useState('');\n  /** 料金情報 */\n  const [ reservationFare, setReservationFare ] = React.useState<ReservationFare>(defaultReservationFare);\n  /** 各種ラベル */\n  const [ reservationLabels, setReservationLabels ] = React.useState<ReservationLabels>(defaultReservationLabels);\n  /** 誤って先方に予約完了メールが届くのを防止する目的で、仮予約画面でユーザーが入力したメールアドレスを設定する */\n  const mailAddressCookieName = 'ana_airport_access_navi_email_address';\n  // 本番以外ではCookieに保存されていたメールアドレスを呼び出す\n  const defaultOperatorMailaddress: string = (()=>{\n    if (Environment.getEnvironmentType() !== Environment.PRODUCTION) {\n      return Cookies.get(mailAddressCookieName) || '';\n    }\n    return '';\n  })()\n  /** 開発・ステージング環境でのみ設定可能とするタクシー会社のメールアドレスとして扱うメールアドレス。 */\n  const [operatorMailaddress, setOperatorMailaddress] = React.useState<string>(defaultOperatorMailaddress);\n  /** 開発・ステージング環境でのみ設定可能: 事業者用メール配信失敗再現 */\n  const [ mailUndeliveredProblemReproduction, setMailUndeliveredProblemReproduction ] = React.useState<string>('');\n  /** ANAマイレージクラブ(ACM番号) */\n  const [acmMileageNumber, setAcmMileageNumber] = React.useState('');\n\n  /** 予約処理の実行中であるかを表すフラグ。 */\n  const [isSubmitting, switchSubmitting] = React.useState(false);\n\n  /** 大人の人数が変更されたときの処理。 */\n  const onChangeAdultNum = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    const value = e.target.value as number;\n    setAdultNum(value);\n  }\n\n  /** 子供の人数が変更されたときの処理。 */\n  const onChangeChildNum = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    const value = e.target.value as number;\n    setChildNum(value);\n  }\n\n  /** タクシーの台数が変更されたときの処理。 */\n  const onChangeCarNum = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    const value = e.target.value as number;\n    setCarNum(value);\n    // 台数が変わると荷物の最大数が変わるためリセットする(0個にする)。\n    setSuitcase(0);\n    setGolfBag(0);\n  }\n\n  /** スーツケースの個数が変更されたときの処理。 */\n  const onChangeSuitcase = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    const value = e.target.value as number;\n    setSuitcase(value);\n  }\n\n  /** ゴルフバッグの個数が変更されたときの処理。 */\n  const onChangedGolfBag = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    const value = e.target.value as number;\n    setGolfBag(value);\n  }\n\n  /** その他荷物(※車椅子など)の個数が変更されたときの処理。 */\n  const onChangeOtherBag = (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => {\n    const value = e.target.value as number;\n    setOtherBag(value);\n  }\n\n  // タクシー台数が変更されたときに実行する処理。\n  React.useEffect(() => {\n    /** スーツケースの個数の最大値。(X個 * タクシー台数。) */\n    const maxSuitcase = carNum * maxSuitcasePerUnit;\n    /** ゴルフバッグの個数の最大値(X個 * タクシー台数。) */\n    const maxGolfBag = carNum * maxGolfBagPerUnit;\n    // スーツケースの個数の最大値を更新する。\n    setmaxSuitcase(maxSuitcase);\n    // ゴルフバッグの個数の最大値を更新する。\n    setMaxGolfBag(maxGolfBag);\n  }, [carNum]);\n\n  return {\n    requestCount, setRequestCount,\n    isFailed, setIsFailed,\n    isRequiredRetry, setIsRequiredRetry,\n    isUnavalableEmail, setIsUnavalableEmail,\n    isInvalidInput, setIsInvalidInput,\n    lastName, setLastName,\n    firstName, setFirstName,\n    lastNameKana, setLastNameKana,\n    firstNameKana, setFirstNameKana,\n    placard, setPlacard,\n    carType, setCarType,\n    adultNum, setAdultNum,onChangeAdultNum,\n    childNum, setChildNum, onChangeChildNum,\n    carNum, setCarNum, onChangeCarNum,\n    phoneNumber, setPhoneNumber,\n    suitcase, setSuitcase, onChangeSuitcase,\n    maxSuitcase,\n    golfBag, setGolfBag, onChangedGolfBag,\n    maxGolfBag,\n    otherBag, setOtherBag, onChangeOtherBag,\n    payment, setPayment,\n    receiptAddress, setReceiptAddress,\n    remarks, setRemarks,\n    operatorMailaddress, setOperatorMailaddress,\n    isSubmitting, switchSubmitting,\n    acmMileageNumber, setAcmMileageNumber,\n    reservationFare, setReservationFare,\n    reservationLabels, setReservationLabels,\n    setMaxSuitcasePerUnit, setMaxGolfBagPerUnit,\n    setmaxSuitcase, setMaxGolfBag,\n    mailUndeliveredProblemReproduction, setMailUndeliveredProblemReproduction\n  }\n}\n","/**\n * 旅CUBE版の表示をするか判定する。\n * @param referrer referrerパラメーターの値。\n * @returns 旅CUBE版の表示をするか判定した結果。\n */\nexport function isTabiCube(referrer: string | null) {\n  return referrer !== 'airport_access';\n}\n","import React from 'react';\nimport { createStyles, makeStyles, Grid, Divider } from '@material-ui/core';\nimport LogoJp from './images/tabicube_ja.jpg';\nimport LogoEn from './images/tabicube_en.jpg';\nimport { useTranslation } from 'react-i18next';\nimport { changeLang } from '../../../../../../states/query';\nimport { isJapanese } from '../../../../../../utils/lang';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    root: {\n      flexGrow: 1,\n      padding: 0,\n    },\n  }),\n);\n\n/** 旅CUBE用のハイヤー・タクシー予約画面用のヘッダー。 */\nconst TabiCube: React.FC = () => {\n  const classes = useStyles({});\n  const { i18n } = useTranslation();\n  const lang = changeLang(i18n.language);\n  const alt = isJapanese(lang) ? '旅CUBE ハイヤー・タクシー予約 ロゴ': 'Travel CUBE Hire/taxi Reservation Logo';\n  const logo = isJapanese(lang) ? LogoJp : LogoEn;\n\n  return (\n    <div className={classes.root}>\n      <Grid container direction='column' alignItems='center'>\n        <Grid item>\n          <img\n            src={logo}\n            alt={alt}\n            style={{ maxHeight: \"80px\" }}\n          />\n        </Grid>\n      </Grid>\n      <Divider />\n    </div>\n  )\n}\n\nexport default TabiCube;\n","import React from 'react';\nimport { AppBar, createStyles, makeStyles, Grid } from '@material-ui/core';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport TaxiLogoJP from './../../images/logo.png';\nimport TaxiLogoEN from './../../images/logoEN.png';\nimport { useTranslation } from 'react-i18next';\nimport { changeLang, Lang } from '../../../../../../states/query';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    root: {\n      flexGrow: 1,\n      padding: 0,\n    },\n  }),\n);\n\n/** ハイヤー・タクシー予約画面用のヘッダー。 */\nconst TaxiAndHireHeader: React.FC = () => {\n  const classes = useStyles({});\n  const { i18n } = useTranslation();\n  const lang = changeLang(i18n.language);\n  const alt = lang === Lang.ja? '空港アクセスナビ ハイヤー・タクシー予約 ロゴ': 'Airport Access Navi Hire/taxi Reservation Logo';\n  const TaxiLogo = lang === Lang.ja? TaxiLogoJP: TaxiLogoEN;\n\n  return (\n    <div className={classes.root}>\n      <AppBar position=\"static\">\n        <Toolbar>\n          <Grid container direction='column' alignItems='center'>\n            <Grid item>\n              {/* タクシー予約用のロゴを表示。現状日本語版のみ。(2021/07/15現在) */}\n              <img\n                src={TaxiLogo}\n                alt={alt}\n                style={{ maxHeight: \"60px\" }}\n              />\n            </Grid>\n          </Grid>\n        </Toolbar>\n      </AppBar>\n    </div>\n  )\n}\n\nexport default TaxiAndHireHeader;\n","import * as React from 'react';\nimport TabiCube from './TabiCube';\nimport TaxiAndHireHeader from './TaxiAndHireHeader';\n\ninterface Props {\n  /** 旅CUBE版の内容に切り替えるフラグ。 */\n  tabiCube?: boolean\n}\n\n/** タクシー・ハイヤー予約サービスのヘッダー。 */\nconst AirportTransferTaxiHeader: React.FC<Props> = (props: Props) => {\n  return (\n    <>\n      {/* 旅CUBE版の場合。 */}\n      { props.tabiCube && <TabiCube /> }\n      {/* 通常(空港アクセスナビ版)の場合。 */}\n      { !props.tabiCube && <TaxiAndHireHeader /> }\n    </>\n  );\n};\n\nexport default AirportTransferTaxiHeader;\n","import * as React from 'react';\nimport Link from '@material-ui/core/Link';\nimport LaunchIcon from '@material-ui/icons/Launch';\n\ninterface Props {\n  url: string,\n  label: string\n}\n\n/** フッターの外部リンクのコンポーネント。 */\nconst ExternalLink: React.FC<Props> = (props: Props) => {\n  return (\n      <Link\n        target='_blank'\n        href={props.url}\n        color='inherit'\n      >\n        {props.label}\n        <LaunchIcon style={{ fontSize: '14px', marginLeft: 1, verticalAlign: 'middle' }}/>\n      </Link>\n  )\n};\n\nexport default ExternalLink;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { isJapanese } from '../../../utils/lang';\nimport ExternalLink from './ExternalLink';\n\n/**\n * 外部送信規律に関するANA公式ページへのリンクのコンポーネント。\n */\nconst ExternalTransmissionDiscipline: React.FC = () => {\n  const { t, i18n } = useTranslation();\n  /** 日本語版のURL。 */\n  const urlJa = 'https://www.ana.co.jp/ja/jp/guide/terms/cookiepolicy/external_transmission/';\n  /** 英語版のURL。 */\n  const urlEn = 'https://www.ana.co.jp/en/jp/guide/terms/cookiepolicy/external_transmission/';\n  /** リンクとして設定するURL。 */\n  // 言語設定に応じてリンク先を切り替える。\n  const url = isJapanese(i18n.language) ? urlJa : urlEn;\n  return (<ExternalLink url={url} label={t('external_transmission_discipline')}/>);\n};\n\nexport default ExternalTransmissionDiscipline;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { isJapanese } from '../../../utils/lang';\nimport ExternalLink from './ExternalLink';\n\n/**\n * プライバシーポリシーに関するANA公式ページへのリンクのコンポーネント。\n */\nconst PrivacyPolicy: React.FC = () => {\n  const { t, i18n } = useTranslation();\n  /** 日本語版のURL。 */\n  const urlJa = 'https://www.ana.co.jp/ja/jp/share/privacy/';\n  /** 英語版のURL。 */\n  const urlEn = 'https://www.ana.co.jp/en/jp/common/aboutana/legal/';\n  /** リンクとして設定するURL。 */\n  // 言語設定に応じてリンク先を切り替える。\n  const url = isJapanese(i18n.language) ? urlJa : urlEn;\n  return (<ExternalLink url={url} label={t('privacy_policy')} />);\n};\n\nexport default PrivacyPolicy;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { isJapanese } from '../../../../../../utils/lang';\nimport ExternalLink from '../../../../../common/Footer/ExternalLink';\n\n/**\n * 旅CUBEの利用規約ページへのリンクのコンポーネント。\n */\nconst Terms: React.FC = () => {\n  const { t, i18n } = useTranslation();\n  /** 日本語版のURL。 */\n  const urlJa = 'https://tabicube.com/web/ja/terms';\n  /** 英語版のURL。 */\n  const urlEn = 'https://tabicube.com/web/en/terms';\n  /** リンクとして設定するURL。 */\n  // 言語設定に応じてリンク先を切り替える。\n  const url = isJapanese(i18n.language) ? urlJa : urlEn;\n  return (<ExternalLink url={url} label={t('terms')} />);\n};\n\nexport default Terms;\n","import React from 'react';\nimport { makeStyles,  createStyles, Typography } from '@material-ui/core';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    subtitle: {\n      textDecoration: 'underline'\n    },\n    annotation: {\n      fontSize: '0.75rem',\n      marginBottom: '5px',\n    },\n    bold: {\n      fontWeight: 'bold',\n    },\n  }),\n);\n\n/** サービス概要の日本語版本文。 */\nconst JP: React.FC = () => {\n  const classes = useStyles();\n  return (\n    <div>\n      <h3 className={classes.subtitle}>このサービスについて</h3>\n      <p>メールによるハイヤー・タクシー配車予約サービスです。ご利用空港およびご利用航空便にあわせて、地図上で選択いただいた「指定地点から空港まで」「空港から指定地点まで」のハイヤー・タクシーの配車予約が可能です。</p>\n      <p className={classes.annotation}>※提携のハイヤー・タクシー会社は順次拡大してまいります。</p>\n      <h3 className={classes.subtitle}>推奨環境</h3>\n      {/* PC環境 */}\n      <Typography className={classes.bold}>・PC</Typography>\n      <Typography className={classes.bold}>Windows</Typography>\n      <Typography>Google Chrome 最新版、Microsoft Edge 最新版</Typography>\n      <Typography className={classes.bold}>Macintosh</Typography>\n      <Typography gutterBottom>Google Chrome 最新版</Typography>\n      {/* スマートフォン・タブレット環境 */}\n      <Typography className={classes.bold}>・スマートフォン・タブレット</Typography>\n      <Typography className={classes.bold}>iOS</Typography>\n      <Typography>Safari 最新版</Typography>\n      <Typography className={classes.bold}>Android</Typography>\n      <Typography gutterBottom>Google Chrome 最新版</Typography>\n      {/* 注釈 */}\n      <Typography className={classes.annotation}>\n        *推奨環境範囲内であっても、ブラウザとOSの組み合わせ等の理由により、一部表示不具合や各種機能がご利用になれない場合がございます(各種ブラウザのベータ版、プレビュー版等でのご利用、一部アドオンのご利用も含みます)。\n      </Typography>\n      <Typography className={classes.annotation}>\n        *新しいブラウザへの対応は随時検討を進めてまいりますが、公表されていないブラウザ固有の不具合により、表示や動作の安定性が確保できていない場合がございます。\n      </Typography>\n      <h3 className={classes.subtitle}>所要距離および所要時間の概算表示について</h3>\n      <p>地図で選択いただいた座標をもとに想定走行距離および想定所要時間を算出しております。所要時間の取得には、ハイヤー・タクシーのご乗車予定時刻を起点とした混雑予想を加味して所要時間を表示しておりますが、道路事情等により実際と異なる場合がございますのでご注意ください。</p>\n      <p>※地図情報提供元:Google</p>\n    </div>\n  );\n}\n\nexport default JP;\n","import React from 'react';\nimport { makeStyles,  createStyles, Typography } from '@material-ui/core';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    subtitle: {\n      textDecoration: 'underline'\n    },\n    annotation: {\n      fontSize: '0.75rem',\n      marginBottom: '5px',\n    },\n    bold: {\n      fontWeight: 'bold',\n    },\n  }),\n);\n\n/** サービス概要の英語版本文。 */\nconst EN: React.FC = () => {\n  const classes = useStyles();\n  return (\n    <div>\n      <h3 className={classes.subtitle}>About this service</h3>\n      <p>This is a limousine and taxi dispatch booking service based on email. You can book a limousine or taxi dispatch “to the airport from your specified location” or “from the airport to your specified location” as selected on a map, based on the airport and airline you are using. </p>\n      <p className={classes.annotation}>* Partnerships with limousine and taxi dispatch service companies will be expanded successively.</p>\n      <h3 className={classes.subtitle}>Recommended environment</h3>\n      {/* PC環境 */}\n      <Typography className={classes.bold}>・PC</Typography>\n      <Typography className={classes.bold}>Windows (excluding Windows RT)</Typography>\n      <Typography>Latest version of Google Chrome</Typography>\n      <Typography>Latest version of Microsoft Edge</Typography>\n      <Typography className={classes.bold}>Macintosh</Typography>\n      <Typography gutterBottom>Latest version of Google Chrome</Typography>\n      {/* スマートフォン・タブレット環境 */}\n      <Typography className={classes.bold}>・Smartphone/Tablet</Typography>\n      <Typography className={classes.bold}>iOS</Typography>\n      <Typography>Latest version of Safari</Typography>\n      <Typography className={classes.bold}>Android browsers</Typography>\n      <Typography gutterBottom>Latest version of Google Chrome</Typography>\n      {/* 注釈 */}\n      <Typography className={classes.annotation}>\n        *Even if your device fulfils the relevant system requirements, some pages may be displayed incorrectly and certain functions may be unavailable for reasons such as your combination of browser and OS. (This also includes the use of some add-ons and beta, preview, or other such browser versions.)\n      </Typography>\n      <Typography className={classes.annotation}>\n        *Although we are always looking into how we can make our website compatible with new browsers, there may be occasions when pages will not display or function correctly due to unique issues with browsers that are yet to be officially released.\n      </Typography>\n      <h3 className={classes.subtitle}>About shown estimate of travel distance and time</h3>\n      <p>The system calculates the estimated driving distance and travel time based on the coordinates you select on the map. To obtain and show the travel time, the system factors in predicted congestion based on the time the limousine taxi is booked for. However, please keep in mind that it may differ from the actual travel time due to the road situation, etc.</p>\n      <p>* Source of map information: Google</p>\n    </div>\n  );\n}\n\nexport default EN;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { isJapanese } from '../../../../../../../utils/lang';\nimport JP from './JP';\nimport EN from './EN';\n\n/** サービス概要の本文部分のコンポーネント。 */\nconst ServiceBody: React.FC = () => {\n  const { i18n } = useTranslation();\n    return isJapanese(i18n.language) ? <JP/> : <EN/> ;\n}\n\nexport default ServiceBody;\n","export enum TabIndexList {\n  'ARROW_BACK_BUTTON'        = 0, // ヘッダー: 戻るボタン\n  'VIA_BUTTON'               = 0, // 検索画面: 経由ボタン\n  'SWITCH_GUIDE_AREA'        = 0, // 検索画面: 発着切り替えボタン\n  'OPTION_AIRPOT_BUS'        = 0, // 検索画面: 空港バス優先オプション\n  'OPTION_CAR'               = 0, // 検索画面: 自動車オプション\n  'OPTION_SHINKANSEN'        = 0, // 検索画面: 新幹線オプション\n  'OPTION_LIMITED_EXPRESS'   = 0, // 検索画面: 特急オプション\n  'OPTION_IC'                = 0, // 検索画面: ICオプション\n  'OPTION_BARRIERFREE'       = 0, // 検索画面: 車椅子オプション\n  'COVID19_TIMETEBLE_NOTICE' = 0, // 注意事項: コロナのお知らせボタン\n  'TERMS_DIALOG'             = 0, // フッター: 利用規約ボタン\n  'SERVICE_ABOUT_DIALOG'     = 0, // フッター: サービス概要ボタン\n  'GUIDANCE'                 = 0, // 結果画面: 回避するボタン\n  'CHANGE_PUBLIC_MODE'       = 0, // メニュー: Publicモードに遷移させるボタン\n  'LINKTIVITY_BUTTON'        = 0, // メニュー: リンクティビティに遷移するボタン\n  'ANA_STORE_LINK'           = 0, // その他:   ANAストアリンクボタン\n  'TAXI_ROUTE_CHECK'         = 0, // 結果画面: 自動車経路を確認するボタン\n  'MK_TAXI_MODAL_BUTTON'     = 0, // その他: MKタクシーモーダルを表示するためのボタン\n  'NEARME_MODAL_BUTTON'      = 0, // その他: NearMeモーダルを表示するためのボタン\n  'VISA_TOUCH_BANNER'        = 0, // その他: Visaタッチ連携モーダルバナー\n  'SHONAI_CAR_SHARE_BANNER'  = 0, // その他: 庄内空港カーシェア連携モーダル\n  'JR_EAST_PASS_BANNER'      = 0, // その他: JR EAST PASS連携バナー\n  'MK_TAXI_MILE_NOTILE'      = 0, // その他: MKタクシーのマイルに関するご注意の詳細事項を出す\n  'OPEN_DETAIL_BUTTON'       = 0, // その他: 詳細開閉ボタン\n  'AIRPORTER_OKINAWA'        = 0  // その他: AirporterOkinawaのマイルに関するご注意の詳細事項を出す\n}\n\nexport const isKeyDownEnter = (e: React.KeyboardEvent, method: (e?: any) => void) => {\n  const EnterKeyCode = 13;\n  // Enterが押された場合には引数のメソッドを実行する\n  if(e.keyCode === EnterKeyCode) {\n    method(e);\n  }\n}\n","import React from 'react';\nimport { Theme, makeStyles, createStyles, AppBar, IconButton, Toolbar, Typography, Button, ThemeProvider, createMuiTheme } from '@material-ui/core';\nimport CloseIcon from '@material-ui/icons/Close';\n\ninterface Props {\n  handleClose: () => void,\n  title: string | React.ReactNode,\n  titleLabel?: string,\n  isSmall?: boolean\n}\n\nconst useStyles = makeStyles((theme: Theme) =>\n  createStyles({\n    appBar: {\n      position: 'relative',\n      minHeight: '60px',\n    },\n    appBarSmall: {\n      position: 'relative',\n      minHeight: '30px',\n      display: 'flex',\n      alignItems: 'flex-end',\n    },\n    title: {\n      marginLeft: theme.spacing(2),\n      flex: 1,\n      fontSize: '1.5rem',\n      marginTop: theme.spacing(1),\n      marginBottom: theme.spacing(1)\n    }\n  }),\n);\n\nconst theme = createMuiTheme({\n  overrides: {\n    MuiAppBar: {\n      colorPrimary: {\n        color: '#fff',\n        backgroundColor: '#002596',\n        boxShadow: 'none'\n      }\n    },\n    MuiToolbar: {\n      regular: {\n        minHeight: '30px !important',\n      },\n    },\n  }\n});\n\nconst ModalHeader: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  const titleLabel: string = props.titleLabel ? props.titleLabel : 'title';\n  return (\n    props.isSmall?\n      <ThemeProvider theme={theme}>\n        <AppBar className={classes.appBarSmall}>\n          <Toolbar>\n            <Button color=\"inherit\" onClick={props.handleClose} aria-label=\"close\">\n              <Typography component=\"span\">閉じる</Typography>\n            </Button>\n          </Toolbar>\n        </AppBar>\n      </ThemeProvider>\n      :\n      <AppBar className={classes.appBar}>\n          <Toolbar>\n            <IconButton edge=\"start\" color=\"inherit\" onClick={props.handleClose} aria-label=\"close\">\n              <CloseIcon />\n            </IconButton>\n            <Typography variant=\"h1\" className={classes.title} aria-label={titleLabel}>\n              {props.title}\n            </Typography>\n          </Toolbar>\n      </AppBar>\n  )\n}\n\nexport default ModalHeader;\n","import React, { ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Dialog, Slide, Theme, makeStyles, createStyles, Button, List, ListItem } from '@material-ui/core';\nimport { TransitionProps } from '@material-ui/core/transitions/transition';\nimport { TabIndexList, isKeyDownEnter } from '../../../../../../../utils/tabIndexList';\nimport ModalHeader from '../../../../../../common/ModalHeader';\n\nconst useStyles = makeStyles((theme: Theme) =>\n  createStyles({\n    appBar: {\n      position: 'relative',\n    },\n    title: {\n      marginLeft: theme.spacing(2),\n      flex: 1,\n    },\n    button: {\n      boxShadow: '0 2px 2px 0 rgba(0,0,0,0.30)',\n      borderRadius: '2px',\n    }\n  }),\n);\n\nconst Transition = React.forwardRef<unknown, TransitionProps>(function Transition(props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />;\n});\n\ninterface Props {\n  /** 子コンポーネント(本文部分)。 */\n  children: ReactNode\n}\n\n/** 旅CUBE版のタクシー予約ページのサービス概要のダイアログ部分。 */\nconst ServiceDialog: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  const [openDialog, setOpenDialog] = React.useState(false);\n  const { t } = useTranslation();\n\n  // ダイアログを閉じる場合\n  const handleClose = () => {\n    setOpenDialog(false);\n  };\n  const handleOpen = () => {\n    setOpenDialog(true);\n  }\n  return (\n    <div>\n      <div\n        onClick={handleOpen}\n        tabIndex={TabIndexList.SERVICE_ABOUT_DIALOG}\n        onKeyDown={ (e) => { isKeyDownEnter(e, handleOpen ) } }\n      >\n        {t('about_service')}\n      </div>\n      <Dialog fullScreen open={openDialog} onClose={handleClose} TransitionComponent={Transition} scroll='body'>\n        <ModalHeader\n          handleClose={handleClose}\n          title={t('about_service')}\n        />\n        <List>\n          <ListItem>\n              { props.children }\n          </ListItem>\n          <ListItem>\n            <Button\n              variant=\"contained\"\n              color=\"primary\"\n              className={classes.button}\n              onClick={handleClose}\n            >\n              {t('close')}\n            </Button>\n          </ListItem>\n        </List>\n      </Dialog>\n    </div>\n  )\n}\n\nexport default ServiceDialog;\n","import React from 'react';\nimport ServiceBody from './ServiceBody';\nimport ServiceDialog from './ServiceDialog';\n\n/** 旅CUBE版のサービス概要。 */\nconst ServiceOverview: React.FC = () => {\n  return (\n    <ServiceDialog>\n      <ServiceBody/>\n    </ServiceDialog>\n  );\n}\n\nexport default ServiceOverview;\n","import React from 'react';\nimport { AppBar, createStyles, makeStyles,  Grid, Typography } from '@material-ui/core';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport { useTranslation } from 'react-i18next';\nimport ExternalTransmissionDiscipline from '../../../../../common/Footer/ExternalTransmissionDiscipline';\nimport PrivacyPolicy from '../../../../../common/Footer/PrivacyPolicy';\nimport Terms from './Terms';\nimport ServiceOverview from './ServiceOverview';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    root_search: {\n      flexGrow: 1,\n      marginTop: '150px',\n      bottom: 0,\n      width: '100%'\n    },\n    root_result: {\n      flexGrow: 1,\n      bottom: 0,\n      width: '100%',\n    },\n    powered_by_text: {\n      fontSize: '14px',\n      padding: '5px',\n    },\n    link: {\n      fontSize: '14px',\n      padding: '5px',\n      color: '#ffffff',\n      textDecoration: 'underline'\n    }\n  }),\n);\n\n/** 旅CUBE版のフッター。 */\nconst TabiCubeFooter: React.FC = () => {\n  const classes = useStyles({});\n  const setClass = classes.root_search;\n\n  const { t } = useTranslation();\n\n  return (\n    <div className={setClass}>\n      <AppBar position=\"static\">\n        <Toolbar>\n        </Toolbar>\n        {/* 「Powered By 駅すぱあと」を表示する。 */}\n        <Grid container justify='space-between'>\n          {/* 利用規約。 */}\n          <Grid item className={classes.link} >\n            <Terms/>\n          </Grid>\n          {/* プライバシーポリシーについてのリンク。 */}\n          <Grid item className={classes.link} >\n            <PrivacyPolicy/>\n          </Grid>\n          {/* 外部通信規律についてのリンク。 */}\n          <Grid item className={classes.link}>\n            <ExternalTransmissionDiscipline/>\n          </Grid>\n          {/* サービス概要。 */}\n          <Grid item className={classes.link} >\n            <ServiceOverview />\n          </Grid>\n          <Grid item>\n            <Typography className={classes.powered_by_text}>\n              { t('powered_by_ekispert') }\n            </Typography>\n          </Grid>\n        </Grid>\n      </AppBar>\n    </div>\n  )\n}\n\nexport default TabiCubeFooter;\n","import React from 'react';\nimport { makeStyles,  createStyles, Link } from '@material-ui/core';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    right: {\n      textAlign: 'right'\n    }\n  }),\n);\n\nconst TermsBodyJP: React.FC = () => {\n  const classes = useStyles();\n  return (\n    <div>\n      <h3>利用規約</h3>\n      <p className={classes.right}>制定日2021年4月21日</p>\n      <h4>第1条 本サービスのご利用</h4>\n      <p>本規約において「本サービス」とは、全日本空輸株式会社(以下「当社」という)が当社または提携社ホームページ及び当社モバイルアプリからの連携により提供する「空港アクセスナビ」上で提供する一連サービスを指します。ご利用にあたっては、本規約内容をご確認頂き、ご同意頂ける場合のみ本サービスをご利用ください。なお、本サービスをご利用頂いた場合は、本規約を本サービスの利用に関するお客様と当社との間の契約の内容とすることにご同意頂いたものとみなします。</p>\n\n      <h4>第2条 本サービスの構成とご利用条件</h4>\n      <p>本サービスは無償にてご利用頂けます。ただし、お客様が本サービスをご利用いただくにあたって発生する通信費やインターネットプロバイダーによる課金、ウェブサイトに接続するためのコンピューター、モデム、携帯端末等の周辺機器及びソフトウェア等は、お客様の責任と負担にてご準備ください。</p>\n\n      <h4>第3条 お客様の責任と義務</h4>\n      <ol>\n        <li>本規約及び当社が本サービスに関して本サービスのウェブサイト上に掲示、またはお客様に連絡する告知等の一切は、本規約と一体のものとして、お客様はこれら全てを遵守する義務を負います。なお、かかる告知等に本規約に相反、または矛盾する内容が記載される場合、本規約の規定を優先して適用します。</li>\n        <li>本サービスの正確性、信頼性、安全性、完成度、有用性、時宜に適したものであるか否か、及び本サービスがお客様の特定目的に合致するか否かについては、お客様が自らの責任でご判断ください。</li>\n        <li>お客様が、本サービスの利用に関して国内外の第三者から、問い合わせ、抗議、クレームを受けた場合や、提訴された場合は、お客様は自らの費用と責任をもってかかる問い合わせ、抗議、クレーム、訴訟に対応するものとします。</li>\n      </ol>\n\n      <h4>第4条 知的財産権</h4>\n      <ol>\n        <li>本サービスに表示される施設情報データの著作権は、Google©及び株式会社ゼンリンまたは当該二社に権利を許諾する第三者に帰属します。</li>\n        <li>本サービスに表示される鉄道運行情報データの著作権は、株式会社レスキューナウまたは当該社に権利を許諾する第三者に帰属します。</li>\n        <li>本サービスに表示される航空・鉄道・バス・船での経路検索データ(経路検索画面及び検索結果出力データ)の著作権は、株式会社ヴァル研究所または当該社に権利を許諾する第三者に帰属します。</li>\n        <li>本サービスに表示される上記以外のデータの著作権は、当社または当該社に権利を許諾する第三者に帰属します。</li>\n        <li>お客様は、本サービスでのみ、鉄道運行情報データ、路線図データ、空港情報、経路検索データ、駅名を含むデータ(以下、「乗換案内データ等」という)を閲覧することができます。お客様は、乗換案内データ等について、これ以外のいかなる権利も取得するものではありません。</li>\n        <li>本サービスで提供する内容(時刻データを含みます)を無断で転載・複写し、または紙媒体、電磁媒体その他いかなる媒体に加工することも禁じます。</li>\n      </ol>\n\n      <h4>第5条 禁止事項</h4>\n      <p>お客様は以下の行為をすることはできません。</p>\n      <ol>\n        <li>本サービスを個人的な利用を超えて、営利目的において利用する行為。</li>\n        <li>本サービスを違法な目的で利用する行為。</li>\n        <li>本サービスの複製、分解、追加、編集、削除、改変、改造及びその他方法、態様の如何を問わず本サービスを変更する行為。</li>\n        <li>本サービスに関して、リバースエンジニアリング、逆コンパイル、逆アセンブル及びその他方法、態様の如何を問わず、本サービスを解析する行為。</li>\n        <li>本サービスを利用する権利につき、有償無償を問わず、譲渡、再販売、担保設定及びその他処分、使用権許諾等する行為。</li>\n        <li>本サービスに関して、意図的に誤情報や有害なコンピュータープログラム等を送信する行為。</li>\n        <li>本サービス及びその他当社の事業運営に支障をきたす恐れのある行為。</li>\n        <li>当社または第三者が有する著作権、特許権、商標権等の知的財産権を侵害する行為、またはその恐れのある行為。</li>\n        <li>当社または第三者のプライバシーを侵害する行為、名誉もしくは信用を毀損する行為、またはその恐れのある行為。</li>\n        <li>法令、本規約または公序良俗に反する行為、及び当社または第三者に不利益を与える行為。</li>\n        <li>本サービスの利用に関して、反社会的勢力に直接または間接に利益を提供する行為。</li>\n        <li>その他前各号に該当する恐れがある行為、これに類する行為、またはその他当社が不適切と判断した行為。</li>\n      </ol>\n      <p>お客様の行為または不作為が本条における禁止事項に該当するか否かは、当社の判断によるものとします。</p>\n\n      <h4>第6条 免責事項</h4>\n      <ol>\n        <li>本サービスに記載された乗換案内データ等について、十分注意、確認した上で掲載しておりますが、必ずしも最適な経路の検索、必ずしも最新、正確または完全でない場合があり、またお客様の使用目的または要求を満たすものではない場合があります。ご利用にあたっては、お客様ご自身の責任においてご利用ください。</li>\n        <li>本サービスで提供する情報は時刻表をもとに検索しています。ただし、交通状況等により異なる運行がされている場合がありますのでご了承ください。</li>\n        <li>迂回ルート表示におきまして、運行状況の乱れがある場合があります。この検索結果は、標準的なダイヤ情報を用いているため、実際の運行と異なることがあることをご了承ください。なお、運行状況、発車時刻等は各交通機関にお尋ねください。</li>\n        <li>本サービスに記載された乗換案内データ等につき、お客様は、お客様の使用目的または要求を満たすものではなく、また全て正確かつ完全ではない場合でも、当社または、株式会社ヴァル研究所がデータの交換・修補その他の責任を負いません。</li>\n        <li>お客様と、本サービス中に広告を行っている広告主または本サービスがリンクしている他のウェブサイトにて行われる事業の事業主との間の取引については、全てお客様とかかる広告主または事業主との責任において行われることとし、当社はかかる取引に関してお客様が被る損害・損失について如何なる保証もせず、また責任を負いません。</li>\n        <li>本サービスをご利用いただくための環境が不完全であることに起因する動作不良やその他の諸影響に関して、当社は責任を負いません。また、お客様のOSやネットワーク環境、ご利用機器やソフトウェアの構成等に起因する動作不良やその他の諸影響に関しても当社は責任を負いません。</li>\n        <li>本サービスの利用に起因してお客様が損害を被った場合でも、当社、株式会社ヴァル研究所は、その損害が自らの故意または重大な過失に起因して生じたものでない限り、責任を負いません。</li>\n      </ol>\n\n      <h4>第7条 サービスの停止・変更</h4>\n      <p>当社は、本サービスの全部または一部について、予告なく変更、中断または終了することがありますが、当社は、かかる変更、中断または終了によりお客様に生じる損害について、賠償責任その他の責任を負いません。</p>\n\n      <h4>第8条 個人情報及びその他の情報の取扱い</h4>\n      <ol>\n        <li>当社は、本サービスの提供を通じて当社が取得するお客様の個人情報について、当社所定の「<Link href=\"https://www.ana.co.jp/ja/jp/share/privacy/\" color='secondary' rel=\"noopener\" target=\"_blank\" >プライバシーポリシー</Link>」を遵守し、適切に管理するものとします。</li>\n        <li>当社は、お客様による本サービスの利用によって取得する情報(目的地等のデータ、GPS機能により取得される位置情報、移動経路情報を含みますが、これらに限られません)について、本サービス若しくはこれに関連するサービスまたは当社のその他の事業のために利用(統計資料の作成、及び当該事業に必要な範囲において第三者に提供することを含みます)することがあります。</li>\n        <li>当社は、前項の情報を第三者に提供する場合、適切な匿名化処置を施し、匿名化した情報を再識別化しないものとします。また、これらの情報を第三者に提供する場合には、提供先が再識別化をすることを契約で禁止します。その他、第1項に定める「<Link href=\"https://www.ana.co.jp/ja/jp/share/privacy/\" color='secondary' rel=\"noopener\" target=\"_blank\" >プライバシーポリシー</Link>」の規定によらずに、お客様の個人情報を第三者に提供することはありません。</li>\n        <li>当社は、お客様の個人情報を基にまたは第2項の情報を基に作成した統計資料について、個人を識別できるものではないことを前提に、取り扱うことができるものとします。</li>\n      </ol>\n\n      <h4>第9条 損害賠償</h4>\n      <p>お客様が、本規約に対する違反行為、または不正行為若しくは違法行為により、当社に損害を与えた場合、当社はそのお客様に対し、かかる違反行為、不正行為または違法行為に基づき生じた損害について、その賠償を請求できるものとします。</p>\n\n      <h4>第10条 一般条項</h4>\n      <ol>\n        <li>当社は、本規約を変更することがあります。</li>\n        <li>当社が本規約の改訂・修正を行う場合は、改訂・修正内容と効力発生時期を本サービスのウェブサイト等の当社の選択する方法で事前に告知します。本規約の変更が効力を生じた後にお客様が本サービスを利用された場合、お客様は変更後の本規約の全ての記載内容に同意したものとみなします。</li>\n        <li>本規約の効力、解釈及び履行については日本国法に準拠するものとします。</li>\n        <li>本規約に関して紛争が生じた場合、東京地方裁判所を第一審の専属的合意管轄裁判所とします。</li>\n      </ol>\n\n      <p className={classes.right}>以 上</p>\n    </div>\n  )\n}\n\nexport default TermsBodyJP;\n","import React from 'react';\nimport { makeStyles,  createStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    right: {\n      textAlign: 'right'\n    }\n  }),\n);\n\nconst TermsBodyEN: React.FC = () => {\n  const classes = useStyles();\n  return (\n    <div>\n      <h3>Terms of Service</h3>\n      <p className={classes.right}>Enacted on March 26, 2020</p>\n      <h4>Article 1. Use of Service</h4>\n      <p>In these Terms of Service (the “Terms”), the “Service” refers to a series of services provided by All Nippon Airways Co., Ltd. (the “Company”) through the “Airport Access” service offered on its website and the websites of its affiliates as well as through its mobile application. Please read these Terms before using the Service. You may use the Service only if you read and agree to the following terms and conditions. By using the Service, you are deemed to have agreed that the Terms form a contract made between you and the Company regarding use of the Service.</p>\n\n      <h4>Article 2. Composition of the Service and the Terms of Use</h4>\n      <p>The Service is available free of charge. Please note, however, that you will be responsible for communication expenses and fees charged by Internet providers, as well as peripheral devices such as personal computers, modems, mobile devices, and software necessary to connect to the website and use the Service. </p>\n\n      <h4>Article 3. Responsibilities and Obligations of Customer</h4>\n      <ol>\n        <li>These Terms and all notices regarding the Service posted on the website of the Service or given to you by the Company should be made an integral part of the Terms, and you are obliged to comply with all of them. Should any conflict or contradiction against the Terms be found in such notices, the provisions of these Terms shall supersede.</li>\n        <li>It is your responsibility to make your own decisions about the accuracy, reliability, security, completeness, usefulness, and timeliness of the Service, and whether the Service meets your specific purposes.</li>\n        <li>You should resolve any inquiry, grievance, complaint, and claim made against you by a third party from home and abroad in connection with using the Service at your own expense and responsibility.</li>\n      </ol>\n\n      <h4>Article 4. Intellectual Property Rights</h4>\n      <ol>\n        <li>Copyrights of information and data on facilities featured on the Service belong to Google© and ZENRIN CO., LTD, or any third party which grants such rights to these two companies.</li>\n        <li>Copyrights of information and data on train services featured on the Service belong to Rescuenow Inc. or any third party which grants such rights to said company.</li>\n        <li>Copyrights of route-finding data using train, bus, and ship, featured on the Service (route-finding screen and search result output data) belong to Val Laboratory Corporation or any third party which grants such rights to said company.</li>\n        <li>Copyrights of any data other than those mentioned above and featured on the Service belong to the Company or any third party which grants such rights to the Company.</li>\n        <li>You can browse information and data on train services, route map data, airport information, route-finding data, and data containing the names of stations (“transfer guide data”) only through this Service. You do not acquire any other rights regarding transfer guide data.</li>\n        <li>Copying or reproducing information (including time data) provided by the Service or processing of such information on paper, electromagnetic, or any other media format is not allowed without permission.</li>\n      </ol>\n\n      <h4>Article 5. Prohibitions</h4>\n      <p>You are not allowed to do the following:</p>\n      <ol>\n        <li>Use the Service for commercial purposes beyond personal use. </li>\n        <li>Use the Service for illegal purposes.</li>\n        <li>Copy, disassemble, add, edit, delete, modify, remodel the Service, or change the Service in any way or manner.</li>\n        <li>Analyze the Service using reverse engineering, decompilation, disassembly tools, or any other means or manner.</li>\n        <li>Transfer, resell, pledge as collateral, dispose of, or license the right to use the Service to others whether with or without compensation.</li>\n        <li>Send misinformation or harmful computer programs regarding the Service by intent.</li>\n        <li>Engage in acts that may affect the Service and other business operations of the Company.</li>\n        <li>Engage in acts that will or may infringe on the intellectual property rights, including copyrights, patents, and trademarks owned by the Company or third parties.</li>\n        <li>Engage in acts that will or may violate the privacy of the Company or third parties, or acts that will or may harm the reputation or credibility thereof.</li>\n        <li>Engage in acts that violate laws, regulations, these Terms or the public policy, and acts that disadvantage the Company or third parties.</li>\n        <li>Directly or indirectly provide benefits to anti-social forces in connection with the use of the Service.</li>\n        <li>Engage in other acts that may fall under any of the preceding items or acts similar thereto.It is the Company, at its discretion, that shall determine whether your acts or omissions fall under any of the prohibitions under this section.</li>\n      </ol>\n\n      <h4>Article 6. Disclaimer</h4>\n      <ol>\n        <li>Although the information provided via the Service, including transfer guide data, have been verified with great care, it may not lead to the optimal route search result or may not always be current, accurate, or complete, and may not meet your purpose of use or demand. Therefore, please use the Service at your own risk.</li>\n        <li>The search results provided by the Service are based on timetables. Please be reminded that actual services may differ depending on traffic conditions.</li>\n        <li>There may be irregularities in train operations regarding detour routes shown on the Service. Please note that these search results use standard timetable information and may differ from actual operations. Please enquire with each transportation company regarding its services and departure times.</li>\n        <li>Neither the Company nor Val Laboratory Corporation shall in any way be responsible or liable to replace or repair data, including transfer guide data shown on the Service, even if they do not meet your purpose of use or demand, and if not all data are accurate and complete.</li>\n        <li>All transactions between you and an advertiser posting an advertisement on the Service or a business owner conducting business using another website to which the Service is linked will be made based on the responsibility of you and the advertiser or the business owner. The Company assumes no guarantee or liability for any damages or losses you may incur in such transactions.</li>\n        <li>The Company shall not be liable for failures or any other effects caused by an incomplete environment for using the Service. In addition, the Company does not accept any liability for malfunctions or other effects attributable to your operating system, network environment, devices used, or software configurations.</li>\n        <li>The Company and Val Laboratory Corporation will not be liable for any damages incurred by you arising from using the Service, except in case of willful intent or gross negligence on their part.</li>\n      </ol>\n\n      <h4>Article 7. Termination or Change of Service</h4>\n      <p>The Company may change, suspend, or terminate all or part of the Service without notice. However, the Company shall not be liable or responsible in any way for any damages that may occur to you due to such change, suspension, or termination. </p>\n\n      <h4>Article 8. Protection of Personal and Other Information</h4>\n      <ol>\n        <li>The Company shall comply with the Privacy Policy set forth by the Company and appropriately manage your personal information obtained through the provision of the Service.</li>\n        <li>The Company may use information collected from your use of the Service (including, but not limited to, data on destinations, position information from GPS, and travel route information) for the good of the Service and/or the related services, or for other business of the Company (including creating statistical data and providing it to third parties to the extent necessary to conduct such business).</li>\n        <li>When submitting the information outlined in the preceding paragraph to a third party, the Company shall ensure proper anonymization and not re-identify the anonymized information. Also, when providing such information to a third party, the Company contractually prohibits the receiving party from re-identifying it. In addition, the Company will not provide your personal information to third parties without following the provisions of the Privacy Policy mentioned in Paragraph 1.</li>\n        <li>The Company shall be able to use statistical data prepared based on your personal information or the information outlined in Paragraph 2 without any restrictions, provided it does not identify any personal details.</li>\n      </ol>\n\n      <h4>Article 9. Indemnity</h4>\n      <p>If you cause any damages to the Company due to any breach of these Terms or fraudulent or illegal acts, you will indemnify and hold the Company harmless against damages arising out of such acts. </p>\n\n      <h4>Article 10. General Provisions</h4>\n      <ol>\n        <li>The Company may alter these Terms.</li>\n        <li>In the event that the Company revises or modifies these Terms, the details of the revision/modification and the effective date will be notified in advance through means selected by the Company, including the website of the Service. If you use the Service after a change to the Terms takes effect, you will be deemed to have agreed to all terms and conditions of the revised Terms.</li>\n        <li>The validity, construction, and performance of these Terms shall be governed by the laws of Japan.</li>\n        <li>The Tokyo District Court shall have exclusive jurisdiction for the first instance concerning all disputes arising under these Terms.</li>\n      </ol>\n\n    </div>\n  )\n}\n\nexport default TermsBodyEN;\n","import React from 'react';\nimport { changeLang, Lang } from '../../../states/query';\nimport { useTranslation } from 'react-i18next';\nimport TermsBodyJP from './TermsBodyJP';\nimport TermsBodyEN from './TermsBodyEN';\n\nconst TermsBody: React.FC = () => {\n  const { i18n } = useTranslation();\n  const lang = changeLang(i18n.language);\n  switch(lang) {\n    case Lang.ja: return <TermsBodyJP/>\n    case Lang.en: return <TermsBodyEN/>\n  }\n}\n\nexport default TermsBody;\n","import React from 'react';\nimport { Dialog, Slide, Theme, makeStyles, createStyles, Button, List, ListItem } from '@material-ui/core';\nimport { TransitionProps } from '@material-ui/core/transitions/transition';\nimport TermsBody from './TermsBody';\nimport ModalHeader from '../ModalHeader';\nimport { isKeyDownEnter, TabIndexList } from '../../../utils/tabIndexList';\nimport { useTranslation } from 'react-i18next';\n\nconst useStyles = makeStyles((theme: Theme) =>\n  createStyles({\n    appBar: {\n      position: 'relative',\n    },\n    title: {\n      marginLeft: theme.spacing(2),\n      flex: 1,\n    },\n    button: {\n      boxShadow: '0 2px 2px 0 rgba(0,0,0,0.30)',\n      borderRadius: '2px',\n    }\n  }),\n);\n\nconst Transition = React.forwardRef<unknown, TransitionProps>(function Transition(props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />;\n});\n\nconst TermsDialog: React.FC = () => {\n  const classes = useStyles();\n  const { t } = useTranslation();\n  const [openDialog, setOpenDialog] = React.useState(false);\n  // ダイアログを閉じる場合\n  const handleClose = () => {\n    setOpenDialog(false);\n  };\n  const handleOpen = () => {\n    setOpenDialog(true);\n  }\n  return (\n    <div>\n      <div\n        onClick={handleOpen}\n        tabIndex={TabIndexList.TERMS_DIALOG}\n        onKeyDown={ (e) => { isKeyDownEnter(e, handleOpen ) } }\n      >\n        {t('terms')}\n      </div>\n      <Dialog fullScreen open={openDialog} onClose={handleClose} TransitionComponent={Transition} scroll='body'>\n        <ModalHeader\n          handleClose={handleClose}\n          title={t('terms')}\n        />\n        <List>\n          <ListItem>\n            <TermsBody/>\n          </ListItem>\n          <ListItem>\n            <Button\n              variant=\"contained\"\n              color=\"primary\"\n              className={classes.button}\n              onClick={handleClose}\n            >\n              {t('close')}\n            </Button>\n          </ListItem>\n        </List>\n      </Dialog>\n    </div>\n  )\n}\n\nexport default TermsDialog;","// To parse this data:\n//\n//   import { Convert, Extreme } from \"./file\";\n//\n//   const extreme = Convert.toExtreme(json);\nexport interface Extreme {\n  ResultSet: ResultSet;\n}\n\nexport interface ResultSet {\n  apiVersion:    string;\n  engineVersion: string;\n  Course:        Course[];\n}\n\nexport interface Course {\n  searchType:    string;\n  dataType:      string;\n  SerializeData: string;\n  Price:         Price[];\n  Route:         Route;\n  fares:         { [key: string]: Fare; };\n  charges:       { [key: string]: Charge; };\n}\n\nexport interface Price {\n  kind:                string;\n  Oneway:              string;\n  Round:               string;\n  fareRevisionStatus?: string;\n  toLineIndex?:        string;\n  fromLineIndex?:      string;\n  index:              string;\n  selected?:           string;\n  Name?:               string;\n  Type?:               string;\n  RevisionStatus?:     string;\n  Rate?:               Rate;\n}\n\nexport interface Rate {\n  text: string;\n  area: string;\n}\n\nexport interface Route {\n  timeOther:                string;\n  timeOnBoard:              string;\n  exhaustCO2:               string;\n  exhaustCO2atPassengerCar: string;\n  distance:                 string;\n  timeWalk:                 string;\n  transferCount:            string;\n  Line:                     Line[];\n  Point:                    Point[];\n}\n\nexport interface Line {\n  stopStationCount:         string;\n  chargeIndex?:             string;\n  timeOnBoard:              string;\n  track:                    string;\n  exhaustCO2:               string;\n  fareIndex:                string;\n  exhaustCO2atPassengerCar: string;\n  distance:                 string;\n  trainID?:                  string;\n  Name:                     string;\n  Type:                     string;\n  ArrivalState:             State;\n  Destination:              string;\n  Number?:                  string;\n  TimeReliability:          string;\n  DepartureState:           State;\n  Color:                    string;\n  LineSymbol?:              LineSymbol;\n  InsideInformation?:       InsideInformation;\n}\n\nexport interface InsideInformation {\n  navigatorTransportation: string;\n  Section?:                Section;\n  Stop?:                   Stop[];\n}\n\nexport interface Section {\n  Name:     string;\n  NickName: string;\n  Previous: Next;\n  Next?:    Next;\n}\n\nexport interface Next {\n  Station: LineSymbol;\n}\n\nexport interface Stop {\n  ArrivalState?:   StopArrivalState;\n  Point:           StopPoint;\n  DepartureState?: StopArrivalState;\n}\n\nexport interface StopArrivalState {\n  Datetime: Datetime;\n}\n\nexport interface StopPoint {\n  getOff:     string;\n  getOn:      string;\n  Station:    LineSymbol;\n  Prefecture: LineSymbol;\n}\n\nexport interface State {\n  no:       string;\n  Type:     string;\n  Datetime: Datetime;\n}\n\nexport interface Datetime {\n  text:      string;\n  operation: string;\n}\n\n\nexport interface LineSymbol {\n  code: string;\n  Name: string;\n}\n\nexport interface TypeClass {\n  text:   string;\n  detail: string;\n}\n\nexport interface Point {\n  Station:    Station;\n  Prefecture: LineSymbol;\n  GeoPoint:   GeoPoint;\n}\n\nexport interface GeoPoint {\n  longi:   string;\n  lati:    string;\n  longi_d: string;\n  gcs:     Gcs;\n  lati_d:  string;\n}\n\nexport enum Gcs {\n  Tokyo = \"tokyo\",\n  Wgs = \"wgs84\"\n}\n\nexport interface Station {\n  code: string;\n  Name: string;\n  Type: string;\n  Yomi: string;\n}\n\n// Converts JSON strings to/from your types\nexport class Convert {\n  public static toExtreme(json: string): Extreme {\n      return JSON.parse(json);\n  }\n\n  /**\n   * 駅すぱあとWebサービスの探索結果のレスポンスをCourse型の配列に整形する。\n   * @param json 駅すぱあとWebサービスから返却された探索結果のJSON\n   */\n  public static toCourses(json: string): Course[] {\n    const extreme: Extreme = JSON.parse(json);\n    let courses: Course[] = [];\n\n    // ResultSet要素・Course要素が存在する場合のみ以下の処理をする。\n    if (extreme.ResultSet && extreme.ResultSet.Course) {\n      // Course要素が配列の場合はそのまま格納する。\n      if (Array.isArray(extreme.ResultSet.Course)) {\n        courses = extreme.ResultSet.Course;\n      // Course要素が配列以外(オブジェクト)の場合は、配列に追加する。\n      } else {\n        courses.push(extreme.ResultSet.Course);\n      }\n\n      // 各経路をループさせる。\n      courses.forEach(course => {\n        let fares: { [key: string]: Fare; } = {};\n        let charges: { [key: string]: Charge; } = {};\n        // 運賃・料金情報の整形をする。\n        course.Price.forEach(p => {\n          switch (p.kind) {\n            // 種別がFare(運賃)の場合。\n            case 'Fare':\n              fares[p.index] = new Fare(p);\n              break;\n            // 種別がCharge(料金)の場合。\n            case 'Charge':\n              charges[p.index] = new Charge(p);\n              break;\n            default:\n              break;\n          }\n        });\n\n        // 路線情報の整形をする。\n        // (路線が1つの場合、配列ではなくオブジェクトで返る場合があるため。)\n        let lines: Line[] = [];\n        if (Array.isArray(course.Route.Line)) {\n          lines = course.Route.Line;\n        } else {\n          lines.push(course.Route.Line);\n        }\n\n        course.fares = fares;\n        course.charges = charges;\n        course.Route.Line = lines;\n      })\n    }\n    return courses;\n  }\n\n  public static extremeToJson(value: Extreme): string {\n      return JSON.stringify(value);\n  }\n}\n\nexport class Fare {\n  fareRevisionStatus?: string;\n  toLineIndex?: string;\n  fromLineIndex?: string;\n  index?: string;\n  selected?: string;\n  oneway?: string;\n  revisionStatus?: string;\n  round?: string;\n\n  constructor(price: Price) {\n    this.fareRevisionStatus = price.fareRevisionStatus;\n    this.toLineIndex = price.toLineIndex;\n    this.fromLineIndex = price.fromLineIndex;\n    this.index = price.index;\n    this.oneway = price.index;\n    this.revisionStatus = price.RevisionStatus;\n    this.round = price.Round;\n    this.selected = price.selected;\n  }\n}\n\nexport class Charge extends Fare{\n  // eslint-disable-next-line\n  constructor(price: Price) {\n    super(price);\n  };\n}\n\nexport enum APIPath {\n  Extreme = '/closed/search/course/extreme',\n  GeoStation = '/geo/station',\n  AddressStation = '/address/station',\n  PassStation = '/course/passStation',\n  Condition = '/toolbox/course/condition',\n  TrainInfo = '/operationLine/service/rescuenow/information',\n  LightStation = '/station/light'\n}\n","import * as colorConvert from 'color-convert';\nimport { TypeClass } from \"../ekispert/extreme\";\nimport { Lang } from \"../states/query\";\nimport { Course, Point } from \"../services/ekispert/models\";\nimport { OperationLinePattern } from \"../services/ekispert/models/operationLinePattern\";\n\n/**\n * 駅すぱあと(Webサービス)に関する独自の処理をまとめたクラス。\n */\nclass Ekispert {\n  /**\n   * 路線名と号車番号を表す文字列を考慮して路線名称を作成する。\n   * @param lineName 駅すぱあと上の経路の区間の路線名。\n   */\n  static setLineName(lineName: string, lineType: string | TypeClass, lineNumber = '', lang: Lang) {\n    const toHankaku = (str: string) => {\n      return str.replace(/[A-Za-z0-9]/g, function(s) {\n        return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);\n      });\n    }\n    // 号車番号の要素が存在する場合。\n    if (lineNumber) {\n      const type = typeof lineType === 'string' ? lineType : lineType.text;\n      // 日本語版の場合。\n      if (lang === Lang.ja) {\n        switch (type) {\n          // 船の場合は末尾に「路線名 + (空白) + xx便」という形式にする。\n          case 'ship':\n            return lineName + ' ' + lineNumber + '便';\n          // (一般開放用):空路の場合には「ANAXXX + (空白) + 便」という形式にする\n          case 'plane':\n            return toHankaku(lineName) + lineNumber + '便';\n          // そのほか(鉄道・バス)の場合は「路線名 + (空白) + xx号」という形式にする。\n          default:\n            return lineName + ' ' + lineNumber + '号';\n        }\n      // 英語版の場合。\n      } else {\n        switch (type) {\n          // 船・バスの場合は「路線名 + (空白) +No.xx」という形式にする。\n          case 'ship':\n          case 'bus':\n            return lineName + ' No.' + lineNumber;\n          default:\n            // そのほか(鉄道)の場合は「路線名 + (空白) + xx」という形式にする。\n            return lineName + ' ' + lineNumber;\n        }\n      }\n    // 号車番号の要素が存在しない場合。\n    } else {\n      return lineName;\n    }\n  }\n\n  /**\n  * 取得した経路から特定の経路を経由する経路のみを絞り込む。\n  * 距離から徒歩での所要時間を求める。\n  * @param distance 距離(m)\n  */\n  static getWalkTime(distance: string) {\n    // 1分間に進む距離(m)を空港アクセスナビ内では53m(=80mを1.5分で進む速度)と定義する。\n    const sppedPerMinute = 53;\n    // 文字列型で受け取った距離(m)を数値型に変換する。\n    const distanceNumber = Number.parseInt(distance);\n    // 20m以下である場合は0分、所要分数を1分間で進む距離で割った値を切り上げた分数を返す。\n    return (distanceNumber <= 20) ? '0' : Math.ceil(distanceNumber / sppedPerMinute).toString();\n  }\n\n}\n\n/**\n * 乗換回避の駅として割当可能かを判別する。\n * @param points 1経路内の駅・バス停(ポイント)の配列。\n * @param index 経路上で何番目の駅かを表すインデックス。\n * @param isDepartureGuide 出発案内かを表すフラグ。\n * @param pointLength Pointsの配列の長さ\n * @param isPublic そらたび検索か\n */\nexport function assignableAsInterruptTransferStation(point: Point, index: number, isDepartureGuide: boolean, pointLength: number, isPublic?: boolean) {\n  // 以降の条件を満たす場合は、乗換回避の対象駅として設定しない。\n  // 経路の1駅目である場合。\n  if ( index === 0 ) { return false; }\n  // 経路上の最後の駅(=到着案内の場合はユーザーが指定した目的地、出発案内の場合は仮想の空港のランドマーク)の場合。\n  if (index === pointLength - 1) { return false; }\n  // 駅情報が設定されていない場合。(地点などの場合。)\n  if ( !point.Station ) { return false; }\n  // 駅情報に種別が設定されていない場合。\n  if ( !point.Station.Type ) { return false; }\n  // そらたび検索の時にはこちらをスキップする\n  if(!isPublic) {\n    // 出発案内で経路の最後から2番目の駅(=空港最寄りの交通機関)の場合。\n    if ( isDepartureGuide && index === pointLength - 2 ) { return false; }\n    // 到着案内で経路上の2番目の駅(=空港最寄りの交通機関)の場合。\n    if (!isDepartureGuide && index === 1 ) { return false; }\n  }\n  // 除外する駅の種別一覧\n  const rejectStationTypeList = ['plane', 'walk', 'strange'];\n  // 駅の種別が「空港」「徒歩」「特殊」の場合には乗り換え回避の対象駅にしない\n  if(rejectStationTypeList.includes(point.Station.Type)) {\n    return false;\n  }\n  // 上記の条件をいずれも満たさない場合のみ、trueを返す。\n  return true;\n}\n\n/**\n * 選択している経路の運行路線パターンを取得する。\n * @param 1経路に紐づく運行路線パターン。\n */\nexport function getOperationLinePatterns(operationLinePatterns: any): OperationLinePattern[] {\n  // 未定義の場合は空配列を返す。\n  if (!operationLinePatterns) { return []; }\n  // 配列の場合はそのまま返す。\n  if (Array.isArray(operationLinePatterns)) {\n    return operationLinePatterns;\n  // 配列ではない場合は配列化して返す。\n  } else {\n    return [operationLinePatterns];\n  }\n}\n\n/** \n * 区間インデックス(0始まり)に対応する運行路線パターンを取得する。\n * @param operationLinePatterns 経路全体の運行路線パターンの配列。\n * @param 区間インデックス(0始まりの値)。\n * */\nexport function getOperationLinePatternInSection(operationLinePatterns: OperationLinePattern[], sectionIndex: number) {\n  return operationLinePatterns.find((pattern) => pattern.routeLineIndex === (sectionIndex + 1).toString());\n}\n\n/** \n * 運行路線パターンから運行路線コードを取得する。\n * @param operationLinePattern 運行路線パターン。(運行路線パターン1件分のオブジェクト。)\n * */\nexport function getOperationLineCodes(operationLinePattern: OperationLinePattern) {\n  // 運行路線パターンの路線情報が配列であった場合。\n  if (Array.isArray(operationLinePattern.Line)) {\n    // 運行路線パターンコードのみの配列を取得する。\n    return operationLinePattern.Line.map((l) => l.code);\n  } else {\n    // 運行路線パターンの路線情報が配列ではない(オブジェクトである)場合。\n    return [operationLinePattern.Line.code];\n  }\n}\n\n/**\n * 経路全体での出発日時(最初の区間の出発日時)を取得する。\n * @param course 1経路分のCourseオブジェクト。\n */\nexport function getDepartureDateTimeInCourse(course: Course) {\n  const lines = Array.isArray(course.Route.Line)? course.Route.Line: [course.Route.Line];\n  /** 経路の最初(1番目)のLineオブジェクト。 */\n  const firstLine = lines[0];\n  // 経路全体での出発日時(最初の区間の出発日時)を返す。\n  return firstLine.DepartureState.Datetime.text;\n}\n\n/**\n * 経路全体での到着日時(最後の区間の到着日時)を取得する。\n * @param course 1経路分のCourseオブジェクト。\n */\nexport function getArrivalDateTimeInCourse(course: Course) {\n  const lines = Array.isArray(course.Route.Line)? course.Route.Line: [course.Route.Line];\n  /** 経路の最後(1番目)のLineオブジェクト。 */\n  const lastLine = lines.slice(-1)[0];\n  // 経路全体での到着日時(最後の区間の到着日時)を返す。\n  return lastLine.ArrivalState.Datetime.text;\n}\n\n/**\n* 10進数のRGBの値をCSSで利用できるカラーコードに変換する。\n* @param {string} rgbCode パラメーターで渡ってきた10進数のRGBを表す9ケタの値(例:076160206)\n* @return {string} CSSで利用できる16進数のカラーコード(例:#4CA0CE)\n*/\nexport function convertToHexColorCode(rgbCode: string): string {\n  // 9ケタの数値のうち、R部分(1文字目から3文字目)を切り出す。\n  const r = Number.parseInt(rgbCode.slice(0, 3));\n  // 9ケタの数値のうち、G部分(4文字目から6文字目)を切り出す。\n  const g = Number.parseInt(rgbCode.slice(3, 6));\n  // 9ケタの数値のうち、B部分(7文字目から9文字目)を切り出す。\n  const b = Number.parseInt(rgbCode.slice(6, 9));\n\n  // 10進数のRGBの値を16進数の数値に変換し、1文字目に「#」を加えてCSSで利用できるカラーコードにする。\n  return '#' + colorConvert.rgb.hex([r, g, b]);\n}\n\nexport default Ekispert;\n","import axios from 'axios';\nimport { subDays, format, addDays } from 'date-fns'\nimport { ConditionDetail, Extreme, Line } from './models';\nimport { Point } from './models/stationLight';\nimport { Candidate } from './../../components/search/Candidate';\nimport { APIPath } from '../../ekispert/extreme';\n\nimport Ekispert from '../../utils/ekispert';\nimport { Lang } from '../../states/query';\nimport DateTime from '../../utils/dateTime';\n\n/**\n * インクリメンタルサーチをする際に特定の文字列をエスケープする\n * @param input 入力文字列\n */\nexport function escapeString(input: string) {\n  return input.replace(/[&=$?]/g, '');\n}\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: `${process.env['REACT_APP_API_ENDPOINT']}/ekispert/` || '',\n  timeout: 7000,\n};\n\nexport const getEkispertAPIFactory = (optionConfig?: ApiConfig) => {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n\n  const getEkispertAPI = async (conditions: object, path: APIPath) => {\n    axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n    // リクエストパラメーター。\n    const params = {\n      ...conditions,\n    };\n    try {\n      const response = await instance.get(path, { params });\n      if (response.status !== 200) {\n        throw new Error('Server Error');\n      }\n      // 各APIに応じてResponseを成形して返す\n      switch(path){\n        case APIPath.Extreme:\n          // レスポンス内にCourse要素が存在しない場合。\n          if (!response.data.ResultSet.Course) {\n            throw new Error('Not Found Course');\n          }\n          let extreme: Extreme = response.data;\n          // APIレスポンスの経路を返す。\n          return extreme.ResultSet.Course;\n        case APIPath.PassStation:\n          return response.data.ResultSet.Point;\n        case APIPath.Condition:\n          let condition: ConditionDetail = response.data;\n          return condition.ResultSet.Condition;\n        case APIPath.GeoStation:\n        case APIPath.AddressStation:\n          return response.data.ResultSet.Point;\n        case APIPath.TrainInfo:\n          return response.data.ResultSet;\n        case APIPath.LightStation:\n          return response.data.ResultSet.Point.Station;\n        default:\n          return response.data.ResultSet;\n      }\n    } catch(err) {\n      throw err;\n    }\n  }\n  return getEkispertAPI;\n};\n\n\nconst getRail = async (conditions: object) => {\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(DEFAULT_API_CONFIG);\n  // リクエストパラメーター。\n  const params = {\n    ...conditions,\n  };\n  try {\n    const response = await instance.get(`rail`, { params });\n    return response;\n  } catch(err) {\n    throw err;\n  }\n}\n\n// 発着時間を追加したLine\nexport interface AddTimeLine extends Line {\n  depTime: Date,\n  arrTime: Date\n}\n\n/**\n * 駅すぱあとの前後のダイヤ一覧から取得しら時刻文字列よりDate型に復元させる\n * @param baseDate 基準となる日付\n * @param dateString 駅すぱあとの前後のダイヤ一覧から取得した時刻文字列( 例: 08:55:00+09:00 )\n */\nexport const getRestoreTime = (baseDate: Date, dateString: string) => {\n  const baseFormat: string = DateTime.JSTFormat(baseDate, 'yyyy/MM/dd');\n  const getTimeRegExp = /(\\d{2}:\\d{2}:\\d{2}\\+\\d{2}:\\d{2})/;\n  const match = dateString.match(getTimeRegExp);\n  if(match && match[1]) {\n    return new Date(`${baseFormat} ${match[1]}`);\n  }\n  return null;\n}\n\nexport const filterTrainList = (lines: Line[], selectedLine: Line, lang: Lang) => {\n  const range = 5;\n  // 配列であればそのまま、配列ではない場合は配列化して格納する。\n  lines = (lines instanceof Array) ? lines: [lines];\n  let matchIdx: number = -1;\n  const depTime = selectedLine.DepartureState.Datetime.text.split('T')[1];\n  const arrTime = selectedLine.ArrivalState.Datetime.text.split('T')[1];\n  // 基準となる日付を選択した路線情報から求める\n  let baseDate = new Date(selectedLine.ArrivalState.Datetime.text);\n  // 選択した路線が 00:00 を過ぎる列車だった場合、前日を基準日とする\n  if(selectedLine.ArrivalState.Datetime.operation === 'yesterday' ){\n    baseDate = subDays(baseDate, 1);\n  }\n  let setLines: AddTimeLine[] = lines.map((line:Line, idx:number) => {\n    const setLine: AddTimeLine = {\n      ...line,\n      depTime: new Date(),\n      arrTime: new Date()\n    };\n    const baseDepDate = (line.DepartureState.Datetime.operation ===  'yesterday')? addDays(baseDate, 1): baseDate;\n    const getDepDate: Date | null = getRestoreTime(baseDepDate, line.DepartureState.Datetime.text);\n    if(getDepDate !== null) {\n      setLine.depTime = getDepDate;\n    }\n    const baseArrDate = (line.ArrivalState.Datetime.operation ===  'yesterday')? addDays(baseDate, 1): baseDate;\n    const getArrDate: Date | null = getRestoreTime(baseArrDate, line.ArrivalState.Datetime.text);\n    if(getArrDate !== null) {\n      setLine.arrTime = getArrDate;\n    }\n    // 出発時刻・到着時刻が一致するか判定\n    if(matchIdx < 0 && line.DepartureState.Datetime.text === depTime && line.ArrivalState.Datetime.text === arrTime ){\n      matchIdx = idx;\n    }\n    return setLine;\n  });\n\n  // 路線名を号車番号(Number)要素を考慮して設定する。\n  setLines = setLines.map((line: AddTimeLine) => {\n    const lineType = (typeof line.Type === 'string') ? line.Type : line.Type.text;\n    // 日本語版と英語版の鉄道の場合は号車番号があれば付与する。\n    if (lang === Lang.ja || lineType === 'train') {\n      line.Name = Ekispert.setLineName(line.Name, line.Type, line.Number, lang);\n    }\n    return line;\n  })\n\n  // 前後の列車に分割\n  if(matchIdx >= 0){\n    return {\n      before: setLines.slice((matchIdx - range < 0? 0: matchIdx - range), matchIdx),\n      current: setLines[matchIdx],\n      after: setLines.slice(matchIdx + 1, matchIdx + range + 1)\n    }\n  }\n  return null;\n}\n\n/**\n * 前後5本と該当の列車に分離します\n * @param conditions /rail に渡すためのパラメーター\n * @param selectedLine 選択している列車のObject\n * @param lang アプリケーション上で指定されている言語設定の値。\n */\nexport const getZengoTrain = async (conditions: object, selectedLine: Line, lang: Lang) => {\n  const response = await getRail(conditions);\n  let lines: Line[] = response.data.ResultSet.Line;\n  if(typeof lines === 'undefined'){\n    return null;\n  }\n  return filterTrainList(lines, selectedLine, lang);\n}\n\nexport const getCourseEdit = async (conditions: object) => {\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(DEFAULT_API_CONFIG);\n  // リクエストパラメーター。\n  const params = {\n    ...conditions,\n  };\n  try {\n    const response = await instance.get(`closed/course/edit`, { params });\n    return response;\n  } catch(err) {\n    throw err;\n  }\n}\n\n/**\n * データバージョンを取得する\n */\nexport async function getDataVersion() {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n  const params = {};\n  try {\n    const response = await instance.get('dataversion', { params });\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n    return response.data.ResultSet;\n  } catch (err) {\n    throw err;\n  }\n}\n\n/**\n * 駅簡易情報(/station/light)を取得する。\n * (主に駅名のインクリメンタルサーチ用途。)\n * @param input テキストボックスで入力された値。\n * @param lang 言語指定(ja/en)\n * @param optionConfig 独自で指定したAPIの設定など(任意)\n */\nexport async function getClosedStationLight (input: string, lang:string = 'ja', optionConfig?: object) {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n\n  const params = {\n    'name': escapeString(input),\n    'language': lang,\n    'type': 'train:ship:bus',\n    'stationNameType': 'unique',\n  };\n\n  // あとで見直す(2019/12/23現在)\n  // eslint-disable-next-line no-useless-catch\n  try {\n    if(params.name === '') {\n      throw new Error('入力値{name}が空です');\n    }\n    let response = await instance.get(`station/light`, { params });\n\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n\n    let points: Point[] = [];\n\n    // 取得したレスポンスがundefinedではない場合に、レスポンスの値を代入する。\n    if (typeof response.data.ResultSet.Point !== undefined && response.data.ResultSet.Point !== undefined) {\n      // 取得した簡易駅情報が配列の場合はそのまま、オブジェクトの場合は配列にはめる。\n      points = (response.data.ResultSet.Point instanceof Array) ? response.data.ResultSet.Point : [response.data.ResultSet.Point];\n    }\n\n    const stations = points.length === 0 ? [] : points.map(p => (new Candidate(p.Station.Name, p.Station.code, p.Station.Type)));\n    return stations;\n  } catch (err) {\n    // dev環境のみエラー内容を出力する\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n      console.error(\"インクリメンタルサーチ(/station/light)にてエラーが発生しました。\");\n      console.error(err);\n    }\n    return [];\n  }\n}\n\n/**\n * 駅詳細情報(/station/)を取得する\n * (広告の出発・到着駅の緯度経度を取得するため)\n * @param code 取得する駅コード\n * @param optionConfig 独自で指定したAPIの設定など(任意)\n */\nexport async function getClosedStationDetail(code: string, optionConfig?: object) {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n\n  const params = {\n    'code': code,\n    'type': 'train:ship:bus',\n    'gcs': 'wgs84'\n  };\n  // あとで見直す(2019/12/23現在)\n  // eslint-disable-next-line no-useless-catch\n  try {\n    let response = await instance.get(`station`, { params });\n\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n\n    // 取得したレスポンスがundefinedではない場合に、レスポンスの値を代入する。\n    if (typeof response.data.ResultSet.Point !== undefined && response.data.ResultSet.Point !== undefined) {\n      return response.data.ResultSet.Point;\n    }\n  } catch (err) {\n    throw err;\n  }\n}\n\n/**\n * 空路平均路線を取得する(/rail)\n * @param depStationCode 出発地駅コード\n * @param arrStationCode 目的地駅コード\n * @param optionConfig 独自で指定したAPIの設定など(任意)\n */\nexport async function getAverageRail(depStationCode: string, arrStationCode: string, optionConfig?: object) {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n  const params = {\n    'type': 'plane',\n    'from': depStationCode,\n    'to': arrStationCode\n  };\n\n  try {\n    let response = await instance.get(`rail`, { params });\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n    if(response.data.ResultSet) {\n      return response.data.ResultSet;\n    }\n    else {\n      throw new Error('/rail Response is Wrong!')\n    }\n  }\n  catch(e) {\n    throw e;\n  }\n}\n\n/**\n * 空路時刻表を取得する  (/plane/timetable)\n * @param railName 対応する路線名(/railで取得した名前)\n * @param date 取得する日付\n * @param direction 上りかどうか\n * @param optionConfig 独自で指定したAPIの設定など(任意)\n */\nexport async function getPlaneTimeTbile(railName: string, date: Date, direction: boolean, optionConfig?: object) {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n  const yyyymmdd = DateTime.JSTFormat(date, 'yyyyMMdd');\n  const params = {\n    'railName': railName,\n    'direction': direction.toString(),\n    'date': yyyymmdd\n  };\n\n  try {\n    let response = await instance.get(`plane/timetable`, { params });\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n    if(response.data.ResultSet) {\n      return response.data.ResultSet;\n    }\n    else {\n      throw new Error('/plane/timetable Response is Wrong!')\n    }\n  }\n  catch(e) {\n    throw e;\n  }\n}\n","import React from 'react';\nimport { changeLang, Lang } from '../../states/query';\nimport { makeStyles,  createStyles } from '@material-ui/core';\nimport { getDataVersion } from '../../services/ekispert/api';\nimport { useTranslation } from 'react-i18next';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    subtitle: {\n      textDecoration: 'underline'\n    },\n    annotation: {\n      fontSize: '12px',\n    }\n  }),\n);\n\nconst ServiceAboutBody: React.FC = () => {\n  const [copyRights, setCopyRights] = React.useState<string[]> ([]);\n  const [ init, setInit ] = React.useState(true);\n  const { i18n } = useTranslation();\n  const classes = useStyles();\n  const lang = changeLang(i18n.language)\n  React.useEffect(()=>{\n    if(init) {\n      getCopyRights();\n      setInit(false);\n    }\n  }, [init]);\n  const getCopyRights = async () => {\n    const dataVersion = await getDataVersion();\n    let copyRights = dataVersion.Copyrights.text.split('\\n');\n    // 先頭の交承だけANAのものに差し替え\n    copyRights[0] = \"交承 令和2年 177号\";\n    setCopyRights(copyRights);\n  }\n\n  const ServiceAboutBodyJP: React.FC = () => {\n    return (\n      <div>\n        <h3 className={classes.subtitle}>このサービスについて</h3>\n        <p>航空便の最新運航情報*3とターミナルや搭乗口・保安検査場などのロケーション情報を経路検索サービスに統合し、「出発地から搭乗まで」「降機から最終目的地まで」の一気通貫なルート案内を行うことでシームレスな移動体験をご提供いたします。また、地上交通機関との連携<sup>*1</sup> により、空港までのアクセスの予約・決済<sup>*2</sup>  も可能になります。</p>\n        <p className={classes.annotation}>*1. 地上交通機関との連携は順次拡大してまいります。</p>\n        <p className={classes.annotation}>*2. 地上交通機関サイトでの予約となります。</p>\n        <p className={classes.annotation}>*3. Peach、JAC(日本エアコミューター)、天草エアラインとのコードシェア便または JAL,Spring Japan運航便は反映されません。詳しくは各社ホームページをご確認ください。</p>\n        <h3 className={classes.subtitle}>推奨環境</h3>\n        <p>●PC・スマートフォン(ブラウザ)</p>\n        <p>Google chrome(最新版)</p>\n        <p>Safari(最新版)</p>\n        <p>●スマートフォン(OS)</p>\n        <p>iOS11以降</p>\n        <p>Android5.0以降</p>\n        <h3 className={classes.subtitle}>時刻表について</h3>\n        {\n          copyRights && copyRights.map((x, index)=>{\n            if(x){\n              return (\n                <p key={index}>{x}</p>\n              )\n            }\n            return null;\n          })\n        }\n        <p>※経路情報提供元:駅すぱあと</p>\n        <p>「駅すぱあと」は株式会社ヴァル研究所の登録商標です。</p>\n        <p>※鉄道運行情報:列車遅延など、鉄道の運行情報もご確認いただけます。</p>\n        <p>鉄道運行情報提供元:株式会社レスキューナウ</p>\n      </div>\n    );\n  }\n\n  const ServiceAboutBodyEN: React.FC = () => {\n    return (\n      <div>\n        <h3 className={classes.subtitle}>What is Airport Access</h3>\n        <p>You can now get information on how to get to the departure airport and board your flight, and also on how to get to your final destination after disembarkation.</p>\n\n        <h3 className={classes.subtitle}>Recommended Environment</h3>\n        <p>●PC /Smartphone―Browser</p>\n        <p>Google Chrome latest version</p>\n        <p>Safari latest version</p>\n        <p>●Smartphone―APP</p>\n        <p>iOS11</p>\n        <p>Android 5.0</p>\n\n        <h3 className={classes.subtitle}>About Timetable</h3>\n        <p>【Kosho Reiwa 2<sup>nd</sup>, No117】</p>\n        <p>・JR timetable data is provided by KOTSUSHINBUNSHA. This data has been based on the latest edition. No part of this site may be distributed, modified and reproduced in any form without our written permission.</p>\n        <p>・JR bus timetable data is provided by KOTSUSHINBUNSHA. This data has been based on the latest edition. No part of this site may be distributed, modified and reproduced in any form without our written permission</p>\n        <p>・Meitetsu Bus timetable is based on data created by Meitetsu Bus Co., Ltd. However, some bus stop pole information was processed by Val Laboratory Corporation at their own responsibility. In addition, some contents have been processed by Val Laboratory Corporation at their own responsibility.</p>\n\n        <p>*Route Information provided by Eki-spert</p>\n        <p> “Eki-Spert”  is registered trademark of Val Laboratory</p>\n        <p>*You can also check train operation status such as train delays.</p>\n        <p>Information provided by  Rescuenow Inc. </p>\n      </div>\n    )\n  }\n\n  if(lang === Lang.ja){\n    return <ServiceAboutBodyJP/>\n  } else {\n    return <ServiceAboutBodyEN/>\n  }\n}\n\nexport default ServiceAboutBody;\n","import React from 'react';\nimport { makeStyles,  createStyles } from '@material-ui/core';\nimport { useTranslation } from 'react-i18next';\nimport { changeLang, Lang } from '../../states/query';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    subtitle: {\n      textDecoration: 'underline'\n    },\n    annotation: {\n      fontSize: '12px',\n    }\n  }),\n);\n\nconst TaxiServiceAboutBody: React.FC = () => {\n  const classes = useStyles();\n  const { i18n } = useTranslation();\n  const lang = changeLang(i18n.language);\n\n  const JPBody: React.FC = () => {\n    return (\n      <div>\n        <h3 className={classes.subtitle}>このサービスについて</h3>\n        <p>メールによるハイヤー・タクシー配車予約サービスです。ご利用空港およびご利用航空便にあわせて、地図上で選択いただいた「指定地点から空港まで」「空港から指定地点まで」のハイヤー・タクシーの配車予約が可能です。</p>\n        <p className={classes.annotation}>※提携のハイヤー・タクシー会社は順次拡大してまいります。</p>\n        <h3 className={classes.subtitle}>推奨環境</h3>\n        <p>●PC・スマートフォン(ブラウザ)</p>\n        <p>Google chrome(最新版)</p>\n        <p>Safari(最新版)</p>\n        <p>●スマートフォン(OS)</p>\n        <p>iOS11以降</p>\n        <p>Android5.0以降</p>\n        <h3 className={classes.subtitle}>所要距離および所要時間の概算表示について</h3>\n        <p>地図で選択いただいた座標をもとに想定走行距離および想定所要時間を算出しております。所要時間の取得には、ハイヤー・タクシーのご乗車予定時刻を起点とした混雑予想を加味して所要時間を表示しておりますが、道路事情等により実際と異なる場合がございますのでご注意ください。</p>\n        <p>※地図情報提供元:Google</p>\n      </div>\n    );\n  }\n\n  const EnBody: React.FC = () => {\n    return (\n      <div>\n        <h3 className={classes.subtitle}>About this service</h3>\n        <p>This is a limousine and taxi dispatch booking service based on email. You can book a limousine or taxi dispatch “to the airport from your specified location” or “from the airport to your specified location” as selected on a map, based on the airport and airline you are using. </p>\n        <p className={classes.annotation}>* Partnerships with limousine and taxi dispatch service companies will be expanded successively.</p>\n        <h3 className={classes.subtitle}>Recommended environment</h3>\n        <p>PC / smartphone (browser)</p>\n        <p>Google Chrome (latest version)</p>\n        <p>Safari (latest version)</p>\n        <p>Smartphone (OS)</p>\n        <p>iOS 11 or later</p>\n        <p>Android 5.0 or later</p>\n        <h3 className={classes.subtitle}>About shown estimate of travel distance and time</h3>\n        <p>The system calculates the estimated driving distance and travel time based on the coordinates you select on the map. To obtain and show the travel time, the system factors in predicted congestion based on the time the limousine taxi is booked for. However, please keep in mind that it may differ from the actual travel time due to the road situation, etc.</p>\n        <p>* Source of map information: Google</p>\n      </div>\n    );\n  }\n\n  switch(lang) {\n    case Lang.en:\n      return <EnBody/>\n    case Lang.ja:\n      return <JPBody/>\n  }\n\n}\n\nexport default TaxiServiceAboutBody;\n","import React from 'react';\nimport { useLocation } from \"react-router-dom\";\nimport { Dialog, Slide, Theme, makeStyles, createStyles, Button, List, ListItem } from '@material-ui/core';\nimport { TransitionProps } from '@material-ui/core/transitions/transition';\nimport ServiceAboutBody from './ServiceAboutBody';\nimport ModalHeader from './ModalHeader';\nimport { useTranslation } from 'react-i18next';\nimport { TabIndexList, isKeyDownEnter } from '../../utils/tabIndexList';\nimport TaxiServiceAboutBody from './TaxiServiceAboutBody';\n\nconst useStyles = makeStyles((theme: Theme) =>\n  createStyles({\n    appBar: {\n      position: 'relative',\n    },\n    title: {\n      marginLeft: theme.spacing(2),\n      flex: 1,\n    },\n    button: {\n      boxShadow: '0 2px 2px 0 rgba(0,0,0,0.30)',\n      borderRadius: '2px',\n    }\n  }),\n);\n\nconst Transition = React.forwardRef<unknown, TransitionProps>(function Transition(props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />;\n});\n\nconst ServiceAboutDialog: React.FC = () => {\n  const classes = useStyles();\n  const [openDialog, setOpenDialog] = React.useState(false);\n  const { t  } = useTranslation();\n  const location = useLocation();\n  const pathName = location.pathname;\n  const isTaxi = pathName.includes('booking-taxi') || pathName.includes('booking');\n\n  // ダイアログを閉じる場合\n  const handleClose = () => {\n    setOpenDialog(false);\n  };\n  const handleOpen = () => {\n    setOpenDialog(true);\n  }\n  return (\n    <div>\n      <div\n        onClick={handleOpen}\n        tabIndex={TabIndexList.SERVICE_ABOUT_DIALOG}\n        onKeyDown={ (e) => { isKeyDownEnter(e, handleOpen ) } }\n      >\n        {t('about_service')}\n      </div>\n      <Dialog fullScreen open={openDialog} onClose={handleClose} TransitionComponent={Transition} scroll='body'>\n        <ModalHeader\n          handleClose={handleClose}\n          title={t('about_service')}\n        />\n        <List>\n          <ListItem>\n              { isTaxi ? <TaxiServiceAboutBody /> : <ServiceAboutBody /> }\n          </ListItem>\n          <ListItem>\n            <Button\n              variant=\"contained\"\n              color=\"primary\"\n              className={classes.button}\n              onClick={handleClose}\n            >\n              {t('close')}\n            </Button>\n          </ListItem>\n        </List>\n      </Dialog>\n    </div>\n  )\n}\n\nexport default ServiceAboutDialog;\n","import React from 'react';\nimport { makeStyles,  createStyles } from '@material-ui/core';\nimport { getDataVersion } from '../../../services/ekispert/api';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    subtitle: {\n      textDecoration: 'underline'\n    },\n    annotation: {\n      fontSize: '12px',\n    }\n  }),\n);\n\nconst PublicServiceAboutBody: React.FC = () => {\n  const [copyRights, setCopyRights] = React.useState<string[]> ([]);\n  const [ init, setInit ] = React.useState(true);\n  React.useEffect(()=>{\n    if(init) {\n      getCopyRights();\n      setInit(false);\n    }\n  }, [init]);\n  const getCopyRights = async () => {\n    const dataVersion = await getDataVersion();\n    let copyRights = dataVersion.Copyrights.text.split('\\n');\n    // 先頭の交承だけANAのものに差し替え\n    copyRights[0] = \"交承 令和2年 177号\";\n    setCopyRights(copyRights);\n  }\n  const classes = useStyles();\n  return (\n    <div>\n      <h3 className={classes.subtitle}>このサービスについて</h3>\n      <p>\n        ご希望のスケジュールや条件に合わせた最適なANA便と地上交通機関の組み合わせ経路をご案内いたします。<br/>\n        旅のプランニングから航空券予約までをワンストップで提供する「空港アクセスナビ」の新しいサービスです。\n      </p>\n      <h3 className={classes.subtitle}>推奨環境</h3>\n      <p>●PC・スマートフォン(ブラウザ)</p>\n      <p>Google chrome(最新版)</p>\n      <p>Safari(最新版)</p>\n      <p>●スマートフォン(OS)</p>\n      <p>iOS11以降</p>\n      <p>Android5.0以降</p>\n\n      <h3 className={classes.subtitle}>時刻表について</h3>\n      {\n        copyRights && copyRights.map((x, index)=>{\n          if(x){\n            return (\n              <p key={index}>{x}</p>\n            )\n          }\n          return null;\n        })\n      }\n\n      <p>※経路情報提供元:駅すぱあと</p>\n      <p>「駅すぱあと」は株式会社ヴァル研究所の登録商標です。</p>\n      <p>※鉄道運行情報:列車遅延など、鉄道の運行情報もご確認いただけます。</p>\n      <p>鉄道運行情報提供元:株式会社レスキューナウ</p>\n\n\n    </div>\n  );\n}\n\nexport default PublicServiceAboutBody;\n","import React from 'react';\nimport { Dialog, Slide, Theme, makeStyles, createStyles, Button, List, ListItem } from '@material-ui/core';\nimport { TransitionProps } from '@material-ui/core/transitions/transition';\nimport ModalHeader from '../../common/ModalHeader';\nimport { useTranslation } from 'react-i18next';\nimport PublicServiceAboutBody from './PublicServiceAboutBody';\n\nconst useStyles = makeStyles((theme: Theme) =>\n  createStyles({\n    appBar: {\n      position: 'relative',\n    },\n    title: {\n      marginLeft: theme.spacing(2),\n      flex: 1,\n    },\n    button: {\n      boxShadow: '0 2px 2px 0 rgba(0,0,0,0.30)',\n      borderRadius: '2px',\n    }\n  }),\n);\n\nconst Transition = React.forwardRef<unknown, TransitionProps>(function Transition(props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />;\n});\n\nconst PublicServiceAboutDialog: React.FC = () => {\n  const classes = useStyles();\n  const [openDialog, setOpenDialog] = React.useState(false);\n  const { t  } = useTranslation();\n  // ダイアログを閉じる場合\n  const handleClose = () => {\n    setOpenDialog(false);\n  };\n  const handleOpen = () => {\n    setOpenDialog(true);\n  }\n  return (\n    <div>\n      <div onClick={handleOpen}>\n        {t('about_service')}\n      </div>\n      <Dialog fullScreen open={openDialog} onClose={handleClose} TransitionComponent={Transition} scroll='body'>\n        <ModalHeader\n          handleClose={handleClose}\n          title={t('about_service')}\n        />\n        <List>\n          <ListItem>\n              <PublicServiceAboutBody/>\n          </ListItem>\n          <ListItem>\n            <Button\n              variant=\"contained\"\n              color=\"primary\"\n              className={classes.button}\n              onClick={handleClose}\n            >\n              {t('close')}\n            </Button>\n          </ListItem>\n        </List>\n      </Dialog>\n    </div>\n  )\n}\n\nexport default PublicServiceAboutDialog;\n","import React from 'react';\nimport { AppBar, createStyles, makeStyles,  Grid, Typography } from '@material-ui/core';\nimport Toolbar from '@material-ui/core/Toolbar';\nimport { useTranslation } from 'react-i18next';\nimport TermsDialog from './Terms/TermsDialog';\nimport ServiceAboutDialog from './ServiceAboutDialog';\nimport PublicServiceAboutDialog from '../public/common/PublicServiceAboutDialog';\nimport Environment from '../../utils/environment';\nimport ExternalTransmissionDiscipline from './Footer/ExternalTransmissionDiscipline';\nimport PrivacyPolicy from './Footer/PrivacyPolicy';\n\ninterface Props {\n  page: string,\n  /** 一般開放版の表示であるかを表すフラグ。 */\n  isPublic?: boolean,\n}\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    root_search: {\n      flexGrow: 1,\n      marginTop: '150px',\n      bottom: 0,\n      width: '100%'\n    },\n    root_result: {\n      flexGrow: 1,\n      bottom: 0,\n      width: '100%',\n    },\n    powered_by_text: {\n      fontSize: '14px',\n      padding: '5px',\n    },\n    link: {\n      fontSize: '14px',\n      padding: '5px',\n      color: '#ffffff',\n      textDecoration: 'underline'\n    }\n  }),\n);\n\ntype FooterProps = Props;\nconst Footer: React.FC<FooterProps> = (props: FooterProps) => {\n  /** 環境変数で指定された環境種別を識別するための値。 */\n  const stageEnv = process.env['REACT_APP_STAGE_ENV'] || '';\n  const classes = useStyles({});\n  const setClass = (props.page === 'search')? classes.root_search: classes.root_result;\n\n  const { t } = useTranslation();\n\n  return (\n    <div className={setClass}>\n      {/** Cypressのチェック用にSCクリックの値をここに出力する */}\n      {(stageEnv &&!Environment.isProduction(stageEnv)) &&\n        <Typography>\n        </Typography>\n      }\n      <AppBar position=\"static\">\n        <Toolbar>\n        </Toolbar>\n        {/* 「Powered By 駅すぱあと」を表示する。 */}\n        <Grid container justify='space-between'>\n          <Grid item className={classes.link} >\n            <TermsDialog/>\n          </Grid>\n          {/* プライバシーポリシーについてのリンク。 */}\n          <Grid item className={classes.link} >\n            <PrivacyPolicy/>\n          </Grid>\n          {/* 外部通信規律についてのリンク。 */}\n          <Grid item className={classes.link}>\n            <ExternalTransmissionDiscipline/>\n          </Grid>\n          <Grid item className={classes.link} >\n            { props.isPublic &&\n              <PublicServiceAboutDialog />\n            }\n            { !props.isPublic &&\n              <ServiceAboutDialog/>\n            }\n          </Grid>\n          <Grid item>\n            <Typography className={classes.powered_by_text}>\n              { t('powered_by_ekispert') }\n            </Typography>\n          </Grid>\n        </Grid>\n      </AppBar>\n    </div>\n  )\n}\n\nexport default Footer;\n","import * as React from 'react';\nimport TabiCubeFooter from './TabiCube';\nimport Footer from '../../../../../common/Footer';\n\ninterface Props {\n  /** 旅CUBE版の内容に切り替えるフラグ。 */\n  tabiCube?: boolean\n}\n\n/** タクシー・ハイヤー予約サービスのフッター。 */\nconst AirportTransferTaxiFooter: React.FC<Props> = (props: Props) => {\n  return (\n    <>\n      {/* 旅CUBE版の場合。 */}\n      { props.tabiCube && <TabiCubeFooter/> }\n      {/* 通常(空港アクセスナビ版)の場合。 */}\n      { !props.tabiCube && <Footer page='search' /> }\n    </>\n  );\n};\n\nexport default AirportTransferTaxiFooter;\n","import React from 'react';\n\nimport { Redirect, useLocation } from 'react-router-dom';\nimport Helmet from \"react-helmet\";\nimport { useTranslation } from 'react-i18next';\nimport ScrollToTop from './common/ScrollToTop';\nimport { useTemporaryReservation } from './ad/OtherServices/AirportTransferTaxi/TemporaryReservation/useTemporaryReservation';\nimport LoadingModal from './ad/OtherServices/AirportTransferTaxi/common/LoadingModal';\nimport AirportTransferTaxi from './ad/OtherServices/AirportTransferTaxi/Reservation';\nimport { convertStringToTaxiCompany } from '../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { isTabiCube } from './ad/OtherServices/AirportTransferTaxi/common/TabiCube';\nimport AirportTransferTaxiHeader from './ad/OtherServices/AirportTransferTaxi/common/Header';\nimport AirportTransferTaxiFooter from './ad/OtherServices/AirportTransferTaxi/common/Footer';\n\nexport const Booking: React.FC = () => {\n  const location = useLocation();\n  const { t } = useTranslation();\n\n  const {\n    code,\n    token,\n    isLoadingReservation,\n    hasReservation,\n    tmpReservation,\n    taxiCompanyConf\n  } = useTemporaryReservation();\n\n  /** 仮予約情報の会社コード。 */\n  const companyCode = tmpReservation?.companyCode;\n  const company = convertStringToTaxiCompany(companyCode || '')\n\n  const targetTaxiComf = (()=>{\n    if(company && taxiCompanyConf) {\n      return taxiCompanyConf[company];\n    }\n  })()\n\n  /** 仮予約情報に含まれたreferrerパラメーターの値。 */\n  const referrer = tmpReservation?.referrer;\n  /** 旅CUBEモードであるかを表すフラグ。 */\n  const tabiCube = isTabiCube(referrer || '');\n  /** ページタイトル。 */\n  const title = tabiCube ? t('tabicube') : t('title');\n\n  return (\n    <div>\n      <Helmet>\n        {/* ページタイトルを設定する。 */}\n        <title>{title}</title>\n        {/* Adobe Analyticsでタクシー予約画面のアクセス数の集計をする。 */}\n        <script type=\"application/javascript\">\n          s.pageName=location.origin+&quot;/booking&quot;;\n          s.t();\n        </script>\n      </Helmet>\n      {/* 読込中は読込中アイコンを表示する。 */}\n      <LoadingModal isLoading={isLoadingReservation}/>\n      {/* タクシーの仮予約情報が参照できた場合。 */}\n      { (hasReservation && tmpReservation && targetTaxiComf) &&\n        <>\n          {/* 画面遷移時に画面トップへ遷移させるためのコンポーネント。 */}\n          <ScrollToTop />\n          {/* ヘッダー部分 */}\n          <AirportTransferTaxiHeader tabiCube={tabiCube} />\n          {/* タクシー会社が存在するの場合。 */}\n          { company !== null &&\n            <AirportTransferTaxi\n              code={code}\n              token={token}\n              reservation={tmpReservation}\n              // TODO: Reduxから取得するようにしたい\n              taxiCompanyConf={targetTaxiComf}\n              taxiCompany={company}\n            />\n          }\n          {/* フッター部分 */}\n          <AirportTransferTaxiFooter tabiCube={tabiCube} />\n        </>\n      }\n      {/* APIへリクエストしていない状態で、予約情報が取得できなかった場合は404ページにリダイレクトする。 */}\n      { (!isLoadingReservation && !hasReservation) &&\n          <Redirect to={{ pathname: '/404', state: {redirectOrigin: location.pathname} }} />\n      }\n    </div>\n  );\n}\n\nexport default Booking;\n","/* eslint react-hooks/exhaustive-deps: 0 */\n\nimport React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\nimport { updateTaxiCompanyConfigurations } from '../../../../../actions/generalAction';\nimport { getReservation } from '../../../../../services/taxi/GetReservation';\nimport { getTaxiCompanyConfiguration } from '../../../../../services/taxi/GetTaxiMetaInfo';\nimport { TaxiCompanyConfigurations } from '../../../../../services/taxi/GetTaxiMetaInfo/model/taxiCompanyConf';\nimport { ReservationResponse } from '../../../../../services/taxi/Reservation/ReservationResponse';\n\n/**\n * タクシーの仮予約情報に関するカスタムフック。\n * @returns code 仮予約情報を参照するためのコード。\n * @returns token 仮予約情報を参照するためのトークン。\n * @returns isLoadingReservation 仮予約情報を取得中であるかのフラグ。\n * @returns hasReservation 仮予約情報が存在するかを表すフラグ。\n * @returns tmpReservation 仮予約情報。\n */\nexport function useTemporaryReservation() {\n  const location = useLocation();\n  const dispatch = useDispatch();\n  const { i18n } = useTranslation();\n  /** URLパラメーター。 */\n  const searchParams = new URLSearchParams(location.search);\n  /** 仮予約情報を参照するためのコードをURLパラメーターから取得する関数 */\n  const getCode = () => {\n    if (searchParams.has(\"code\")) {\n       /** URLパラメーター「code」の値。 */\n      const value = searchParams.get(\"code\");\n      // nullではない場合のみそのまま値を、nullの場合は空文字を返す。\n      return (value !== null) ? value : '';\n    } else {\n      return '';\n    }\n  }\n\n  /** 仮予約情報を参照するためのトークンをURLパラメーターから取得する関数。 */\n  const getToken = () => {\n    if (searchParams.has(\"token\")) {\n      /** URLパラメーター「token」の値。 */\n      const value = searchParams.get(\"token\");\n      // nullではない場合のみそのまま値を、nullの場合は空文字を返す。\n      return  (value !== null) ? value : '';\n    } else {\n      return '';\n    }\n  }\n\n  /** 言語情報を取得する */\n  const getLang = (): string => {\n    if (searchParams.has(\"language\")) {\n      /** URLパラメーター「token」の値。 */\n      const value = searchParams.get(\"language\");\n      // nullではない場合のみそのまま値を、nullの場合はjaを返す。\n      return  (value !== null) ? value : 'ja';\n    } else {\n      return 'ja';\n    }\n  }\n\n  /** 仮予約時に発行したコード。 */\n  const code = getCode();\n  /** 仮予約時に発行したトークン。 */\n  const token = getToken();\n  /** 言語情報を取得する */\n  const language = getLang();\n\n  React.useEffect(()=>{\n    /** 言語情報をセットする */\n    switch(language) {\n      case 'en':\n        i18n.changeLanguage('en');\n        break;\n      case 'ja':\n      default:\n        i18n.changeLanguage('ja');\n        break;\n    }\n  }, [])\n\n\n  const [isLoadingReservation, switchLoadingReservation] = React.useState(false);\n  /** 仮予約情報が存在するかを表すフラグ。 */\n  const [hasReservation, setHasReservation] = React.useState(true);\n  /** 仮予約情報。 */\n  const [tmpReservation, setTmpReservation] = React.useState<ReservationResponse>();\n  /** タクシー会社ごとのメタデータ */\n  const [ taxiCompanyConf, setTaxiCompanyConf ] = React.useState<TaxiCompanyConfigurations|null>(null);\n\n  /**\n   * 仮予約情報を参照するAPIにリクエストする。\n   * @param code 仮予約時に発行したコード。\n   * @param token 仮予約時に発行したトークン。\n   * @param language 言語情報\n   */\n  const getTemporaryReservation = React.useCallback(async(code: string, token: string, language: string) => {\n    return getReservation({code, token, language});\n  }, []);\n\n  // 画面読み込み時に予約コード・予約トークンの存在チェックをする処理。\n  React.useEffect(() => {\n    // コードとトークンが未設定の場合は、予約なしとして扱う。\n    if (!code || !token || code === null || token === null) {\n      setHasReservation(false);\n    }\n  }, [code, token]);\n\n  // 仮予約情報を参照する処理。\n  React.useEffect(() => {\n    // コードとトークンが設定されている場合のみ、予約情報を参照する。\n    if (code && token) {\n      // 読込中フラグをオンにする。\n      switchLoadingReservation(true);\n      // 仮予約情報を参照する。\n      getTemporaryReservation(code, token, language)\n      .then((response) => {\n        // 正常にレスポンスが返却された場合。\n        if (response !== null && response.status === 200) {\n          // 予約情報が存在するフラグをtrueにする。\n          setHasReservation(true);\n          // 予約情報をセットする。\n          setTmpReservation(response.data as ReservationResponse);\n        } else {\n          // 予約情報が存在するフラグをfalseにする。\n          setHasReservation(false);\n        }\n        const params = {\n          companyCode: response?.data?.companyCode,\n          key: 'company_configuration',\n          language: i18n.language\n        }\n        // タクシー会社メタ情報を取得する\n        return getTaxiCompanyConfiguration(params)\n      })\n      .then((response)=>{\n        // 情報が取れないときには何も処理をしない\n        if(!response.body) {\n          return;\n        }\n        const getTaxiCompanyConf: TaxiCompanyConfigurations = response.body;\n        // Redux上にタクシーメタ情報を保存する\n        dispatch(updateTaxiCompanyConfigurations(getTaxiCompanyConf));\n        setTaxiCompanyConf(getTaxiCompanyConf);\n      })\n      .catch(() => {\n        // 予約情報が存在するフラグをfalseにする。\n        setHasReservation(false);\n      })\n      .finally(() => {\n        // 読込中フラグをオフにする。\n        switchLoadingReservation(false);\n      })\n    }\n  }, [code, token, getTemporaryReservation]);\n\n  return {\n    code, token,\n    isLoadingReservation,\n    hasReservation,\n    tmpReservation,\n    taxiCompanyConf\n  }\n}\n","import { Dispatch } from 'redux';\nimport { connect } from 'react-redux';\nimport { State } from '../reducers';\n// import { } from '../actions/conditionAction';\nimport Booking from '../components/Booking';\n\nexport interface ConditionActions {}\n\nfunction mapDispatchToProps(dispatch: Dispatch) {\n  return {};\n}\n\nfunction mapStateToProps(appState: State) {\n  return Object.assign({}, appState.condition);\n}\n\nexport default connect(mapStateToProps, mapDispatchToProps)(Booking);\n","/* eslint react-hooks/exhaustive-deps: 0 */\n\nimport React, { useEffect } from \"react\";\nimport Helmet from \"react-helmet\";\nimport { AppBar, Box, createStyles, Grid, makeStyles, Toolbar, Typography } from \"@material-ui/core\";\nimport { useTranslation } from \"react-i18next\";\nimport { Lang } from \"../states/query\";\nimport { State } from \"../reducers\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport { useLocation } from \"react-router-dom\";\n\nimport { switchIsInitial } from \"../actions/generalAction\";\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    content: {\n      minHeight: '80vh',\n    },\n    footer: {\n      top: \"auto\",\n      bottom: 0,\n      minHeight: '10vh'\n    },\n    notFoundHeader: {\n      fontSize: '18px',\n      textAlign: 'center',\n      fontWeight: 'bold',\n    },\n    notFoundMessage: {\n      textAlign: 'center',\n      fontSize: '15px'\n    },\n  }),\n);\n\n/** Not Found(404)用のコンポーネント。 */\nexport const NotFound: React.FC = () => {\n  const dispatch = useDispatch();\n  const location = useLocation();\n  const { t, i18n } = useTranslation();\n  const isInitial = useSelector((state: State) => state.general.isInitial);\n  const lang = useSelector((state: State) => state.condition.query.lang);\n  const classes = useStyles({});\n  // クエリとして連携された値を取得する\n  const query = useSelector((state: State) => state.condition.query);\n  // リファラーを取得する。\n  const referrer = useSelector((state: State) => state.general.referrer);\n\n  // リクエストパラメーターを取得する。\n  const searchParams = new URLSearchParams(location.search);\n  /** リダイレクト元のパスを取得する。 */\n  // リダイレクト時にState内でリダイレクト元の値を渡されている場合のみその値を設定する。\n  const redirectOrigin = location.state ? location.state.redirectOrigin : \"\";\n\n  useEffect(() => {\n    // アプリケーション上で最初の描画の場合のみ、言語設定をする。\n    if (isInitial) {\n      // 英語の場合。\n      if (lang === Lang.en || (searchParams.get('lang') === Lang.en)) {\n        i18n.changeLanguage('en');\n      // 英語以外(日本語)の場合。\n      } else {\n        i18n.changeLanguage('ja');\n      }\n      // 最初の描画であるフラグをfalseにする。\n      dispatch(switchIsInitial(false));\n    }\n  }, [dispatch, lang, i18n, isInitial, searchParams]);\n\n  return (\n    <Box>\n      <Helmet>\n        {/* ページタイトルを設定する。 */}\n        <title>{t('title')}</title>\n      </Helmet>\n      {/* ヘッダー部分。 */}\n      <AppBar position='static'>\n        <Toolbar/>\n      </AppBar>\n      <Grid container alignContent='center' justify='center' alignItems='center' className={classes.content}>\n        <Grid item>\n          <Typography color='primary' className={classes.notFoundHeader}>\n            { t('not_found_header') }\n          </Typography>\n          <Typography color='textSecondary' className={classes.notFoundMessage}>\n            { t('not_found_message') }\n          </Typography>\n        </Grid>\n      </Grid>\n      {/* フッター部分。 */}\n      <AppBar position=\"fixed\" color=\"primary\" className={classes.footer} />\n    </Box>\n  )\n}\n\nexport default NotFound;\n","import { createMuiTheme } from '@material-ui/core/styles';\n\nexport const anaTheme = createMuiTheme({\n  palette: {\n    text: {\n      primary: '#0B308E',\n      secondary: '#526391',\n    },\n    primary: {\n      main: '#0B308E',\n      dark: '#0B308E',\n    },\n    secondary: {\n      main: '#0090e8',\n      dark: '#0090e8',\n    }\n  },\n  overrides: {\n    MuiAppBar: {\n      root: {\n        borderBottom: '1px solid #CBD2E3',\n      }\n    },\n    MuiButton: {\n      root: {\n        borderRadius: '2px',\n      }\n    },\n    MuiInput: {\n      input: {\n        '&::placeholder': {\n          color: '#526391',\n          opacity: 0.8,\n          fontSize: '11px',\n        }\n      },\n      underline: {\n        '&:before': {\n          borderBottom: '1px solid #CBD2E3',\n        }\n      },\n    },\n    MuiInputLabel: {\n      root: {\n        color: '#526391',\n      }\n    },\n    MuiOutlinedInput: {\n      input: {\n        '&::placeholder': {\n          color: '#526391',\n          opacity: 0.8,\n          fontSize: \"0.75rem\",\n        }\n      },\n      notchedOutline: {\n        border: '1px solid #CBD2E3',\n      },\n    },\n    MuiPaper: {\n      elevation4: {\n        boxShadow: undefined,\n      }\n    },\n    MuiSelect: {\n      icon: {\n        color: '#0B308E',\n      }\n    },\n  }\n});\n","import { createMuiTheme } from '@material-ui/core/styles';\n\n/** ANA Universal MaaSの配色などを適用したテーマ。 */\nexport const universalMaaS = createMuiTheme({\n  palette: {\n    text: {\n      primary: '#002596',\n      secondary: '#373737',\n    },\n    primary: {\n      main: '#002596',\n      dark: '#002596',\n    },\n    secondary: {\n      main: '#0090e8',\n      dark: '#0090e8',\n    },\n    error: {\n      main: '#BF0000',\n    }\n  },\n  typography: {\n    fontFamily: [\n      'Noto Sans JP',\n      '-apple-system',\n      'BlinkMacSystemFont',\n      '\"Segoe UI\"',\n      'Roboto',\n      '\"Helvetica Neue\"',\n      'Arial',\n      'sans-serif',\n      '\"Apple Color Emoji\"',\n      '\"Segoe UI Emoji\"',\n      '\"Segoe UI Symbol\"',\n    ].join(','),\n  },\n  overrides: {\n    MuiAppBar: {\n      root: {\n        borderBottom: '1px solid #CBD2E3',\n      }\n    },\n    MuiButton: {\n      root: {\n        borderRadius: '2px',\n      }\n    },\n    MuiInput: {\n      input: {\n        '&::placeholder': {\n          color: '#526391',\n          opacity: 0.8,\n          fontSize: '11px',\n        }\n      },\n      underline: {\n        '&:before': {\n          borderBottom: '1px solid #CBD2E3',\n        }\n      },\n    },\n    MuiInputLabel: {\n      root: {\n        color: '#526391',\n      }\n    },\n    MuiOutlinedInput: {\n      input: {\n        '&::placeholder': {\n          color: '#526391',\n          opacity: 0.8,\n          fontSize: \"0.75rem\",\n        }\n      },\n      notchedOutline: {\n        border: '1px solid #CBD2E3',\n      },\n    },\n    MuiPaper: {\n      elevation4: {\n        boxShadow: undefined,\n      }\n    },\n    MuiSelect: {\n      icon: {\n        color: '#0B308E',\n      }\n    },\n  }\n});\n","export type ClosedPathType = 'search' | 'summary' | 'result';\n\n/** このアプリケーション内のパスに関する定数・処理のクラス。 */\nexport default class Path {\n  /** ルートパス(検索画面)の文字列。 */\n  static readonly ROOT = '/';\n  /** 検索画面のパスの文字列。 */\n  static readonly SEARCH = '/search';\n  /** サマリー画面のパスの文字列。 */\n  static readonly SUMMARY = '/summary';\n  /** 結果画面のパスの文字列。 */\n  static readonly RESULT = '/result';\n  /** 一般開放の検索画面のパスの文字列 */\n  static readonly PUBLC_ROOT = '/public';\n  /** 一般開放の検索画面のパスの文字列 */\n  static readonly PUBLC_SEARCH = '/public/search';\n  /** 一般開放のサマリー画面のパスの文字列 */\n  static readonly PUBLC_SUMMARY = '/public/summary';\n  /** 一般開放の結果画面のパスの文字列 */\n  static readonly PUBLC_RESULT = '/public/result';\n  /** 一般開放の搭乗便一覧画面のパスの文字列 */\n  static readonly PUBLIC_FLIGHTLIST = '/public/flightlist';\n\n  /**\n   * 現在ページが検索画面であるかを判別する。\n   * @param pathName 現在ページURLのパス名。\n   */\n  static isSearch(pathName: string) {\n    return pathName === this.ROOT || pathName.includes(this.SEARCH);\n  }\n\n  /**\n   * 現在ページがサマリー画面であるかを判別する。\n   * @param pathName 現在ページURLのパス名。\n   */\n  static isSummary(pathName: string) {\n    return pathName.includes(this.SUMMARY);\n  }\n\n  /**\n   * 現在ページが結果画面であるかを判別する。\n   * @param pathName 現在ページURLのパス名。\n   */\n  static isResult(pathName: string) {\n    return pathName.includes(this.RESULT);\n  }\n\n  /**\n   * 現在ページが一般開放画面であるかを判別する。\n   * @param pathName 現在ページURLのパス名。\n   */\n  static isPublic(pathName: string) {\n    return pathName.includes(this.PUBLC_ROOT);\n  }\n\n  /**\n   * 現在ページが一般開放の検索画面か判別する\n   * @param pathName 現在ページURLのパス名。\n   */\n  static isPublicSearch(pathName: string) {\n    return pathName === this.PUBLC_ROOT || pathName.includes(this.PUBLC_SEARCH);\n  }\n\n  /**\n   * 現在ページが一般開放のサマリー画面か判別する\n   * @param pathName 現在ページURLのパス名。\n   */\n  static isPublicSummary(pathName: string) {\n    return pathName.includes(this.PUBLC_SUMMARY);\n  }\n\n  /**\n   * 現在ページが一般開放の結果画面か判別する\n   * @param pathName 現在ページURLのパス名。\n   */\n  static isPublicResult(pathName: string) {\n    return pathName.includes(this.PUBLC_RESULT);\n  }\n\n  /**\n   * 空港アクセスナビにおける現在のPathを返す\n   */\n  static getClosedPathType(pathName: string): ClosedPathType | null {\n    if(this.isSearch(pathName)) {\n      return 'search';\n    }\n    else if(this.isSummary(pathName)) {\n      return 'summary';\n    }\n    else if(this.isResult(pathName)) {\n      return 'result';\n    }\n    return null;\n  }\n}\n","import React from 'react';\nimport { Icon, IconProps } from '@material-ui/core';\nimport Search from './icon_input_airport.png';\n\nexport const AswSearch: React.FC<IconProps> = (props: IconProps) => {\n  return (\n    <Icon {...props}>\n      <img src={Search} alt='Search' />\n    </Icon>\n  );\n}\n\nexport default AswSearch;\n","interface ReplaceWord {\n  base: string,\n  replace: string\n}\n\n/** インクリメンタルサーチで置換をする単語リスト */\nexport const replaceWordList: ReplaceWord[] = [\n  {\n    base: '宇部興産',\n    replace: '宇部興産株式会社'\n  }\n];\n\n/** インクリメンタルサーチで無視をする単語リスト */\nexport const ignoreWordList: string[] = [\n  '現在地'\n]","import { getClosedAutocomplete } from \"./api\";\nimport { replaceWordList, ignoreWordList } from \"./data/replaceWordList\";\n\n/**\n * バックエンドに投げるAutoompleteの文字列に補正をかける\n * @param input 入力文字列\n * @returns APIに投げる文字列\n */\nexport const replaceInput = (input: string) => {\n  const replceInput = replaceWordList.map((word)=>{\n    if(input === word.base) {\n      return word.replace;\n    }\n    return null;\n  })\n  .find((x)=>{\n    return x !== null;\n  });\n  if(replceInput) {\n    return replceInput;\n  }\n  return input;\n}\n\n/**\n * バックエンドに投げる文字列に補正をかけた状態でAutocompleteにリクエストを投げる\n * @param input 入力文字列\n * @returns バックエンドからのResponse\n */\nexport const getClosedFixAutocomplete = async (input: string, lang: string = 'ja') => {\n  const replaced = replaceInput(input);\n  // 無視リストにある場合にはインクリメンタルサーチを行わない\n  if(ignoreWordList.includes(input)) {\n    return null;\n  }\n  return await getClosedAutocomplete(replaced, lang)\n}\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport {\n  createStyles,\n  makeStyles,\n  TextField,\n  useTheme\n} from '@material-ui/core';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\n\nimport { Candidate } from './../../../../../search/Candidate';\nimport AswSearch from './../../../../../search/Icons/AswSearch';\nimport { PointType } from '../../../../../../states/common';\nimport Place from '../../../../../../services/google/Place';\n\nimport {\n  getClosedStationDetail,\n  getClosedStationLight\n} from '../../../../../../services/ekispert/api';\nimport {\n  getClosedGeocode,\n  getClosedPlaceDetail\n} from '../../../../../../services/google/api';\nimport {\n  convertLocationToStr,\n  GeoLocation\n} from '../../../../../../utils/geoLocation';\nimport { convertLetter } from '../../common/Address';\nimport { getClosedFixAutocomplete } from '../../../../../../services/google/fixAutocompleteInput';\nimport { updateErrorMessage } from '../../../../../../actions/generalAction';\nimport { useDispatch } from 'react-redux';\nimport { changeLang, Lang } from '../../../../../../states/query';\nimport History from '../../../../../search/CandidatesModal/Histories/history';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    root: {\n      height: '0px',\n    },\n    // 出発地アイコン用のスタイル設定。\n    departureIcon: {\n      fontSize: 18,\n    },\n    publicDepartureIcon: {\n      fontSize: 28,\n    },\n    // 目的地アイコン用のスタイル設定。\n    destinationIcon: {\n      fontSize: 20,\n    },\n    publicDestinationIcon: {\n      fontSize: 28,\n    },\n    textField: {\n      backgroundColor: '#ffffff',\n      width: '80%',\n      position: 'relative',\n      top: '10px',\n      left: '10%',\n      zIndex: 1,\n    },\n    inputText: {\n      borderRadius: '10px',\n      height: '50px',\n      boxShadow: '4px 4px 4px rgba(0, 0, 0, 0.25)',\n      fontSize: '18px'\n    },\n    pointNameText: {\n      whiteSpace: 'nowrap'\n    },\n    descriptionText: {\n      paddingLeft: '10px',\n      color: '#999999',\n      fontSize: '12px',\n      whiteSpace: 'nowrap',\n      overflow: 'hidden',\n      textOverflow: 'ellipsis'\n    }\n  }),\n);\n\ninterface Props {\n  pointName: string,\n  setCenter: (v: {\n    lat: number;\n    lng: number;\n  }) => void,\n  setMarkerPoint: (v: {\n    lat: number;\n    lng: number;\n  }) => void,\n  setPointName: (v: string) => void,\n  setMunicipality: (v: string) => void,\n  switchEdited: (v: boolean) => void,\n  setPlace: (v: Place) => void,\n  setPlaceJP: (v: Place|null) => void,\n}\n\n/** Google Mapsの地図上に表示する検索窓のコンポーネント。 */\nexport const SearchBox: React.FC<Props> = (props: Props) => {\n  // 候補のフック。\n  const [candidates, setCandidates] = React.useState<Candidate[]> ([]);\n  const { t, i18n } = useTranslation();\n  // インクリメンタルサーチの候補を表示するか\n  const [isDisplayCandidates, switchDisplayCandidates] = React.useState(false);\n  const [lang, setLang] = React.useState<Lang> (Lang.ja);\n\n  const classes = useStyles();\n  const theme = useTheme();\n  const dispatch = useDispatch();\n\n  React.useEffect(() => {\n    setLang(changeLang(i18n.language))\n  }, [i18n.language])\n\n  /** テキストボックスに文字を入力した際に呼ばれる */\n  const onChangeTextBox = (e: any) => {\n    if(e.target.value.type !== PointType.SELECT_ON_MAP) {\n      getCandidates(e.target.value);\n    }\n    // 文字が入力された際にはプルダウンメニューを表示する\n    switchDisplayCandidates(true);\n  }\n\n  /** 候補の初期値を展開する。 */\n  const initCandidates = () => {\n    /** 「現在地」の項目。 */\n    const currentPosition = [\n      new Candidate(t('now_place'), '', PointType.CURRENT_POSITION)\n    ]\n    // 初期値として「現在地」のみ候補を格納する。\n    setCandidates(currentPosition);\n  }\n\n  /** テキストボックスをクリックしたときの処理。 */\n  const onClick = (e: any) => {\n    // 候補が空の場合には初期値を格納する。\n    // または、テキストボックスが未入力(undefined)の場合も初期値を格納する。\n    if (candidates.length === 0 || e.target.value === undefined) {\n      initCandidates();\n    } else if (e.target.value.length > 0) {\n      getCandidates(e.target.value);\n    }\n    // クリックした際に候補を表示する。\n    switchDisplayCandidates(true);\n  }\n\n  /**\n   * 候補を取得する処理。\n   */\n  const getCandidates = async (value: string) => {\n    let candidates: Candidate[] = [];\n    // 入力ボックスの値が空の場合は駅情報を取得しない。\n    if (value && value !== '') {\n      // 駅すぱあとWebサービスから駅の候補を取得する。\n      const stations = await getClosedStationLight(value, i18n.language);\n      // Google Places APIから地点の候補を取得する。\n      const places = await getClosedFixAutocomplete(value, i18n.language);\n      if(places) {\n        // 駅と地点の候補をひとつの配列にする。\n        candidates = candidates.concat(stations, places);\n      }\n    }\n    // 種別ごとのソートを実行する。\n    candidates = sortByType(candidates);\n    setCandidates(candidates);\n    return candidates;\n  }\n\n  /**\n   * 発着地のサジェスト(候補)を種別ごとにソートする。\n   * @param candidates 駅すぱあとAPI(/station/light)から取得した候補。\n   */\n  const sortByType = (candidates: Candidate[]) => {\n    /** 駅の種別ごとにソート済みの駅候補を格納する配列。 */\n    let sortedStations: Candidate[] = [];\n    // 種別の順序を固定するために、あらかじめキーと初期値を設定する。\n    // 順序は「鉄道」「バス」「船」の順。(2020/02/18現在。)\n    let stationsByType: { [key: string]: Candidate[] } = {\n      'currentPosition': [\n        new Candidate(t('now_place'), '', PointType.CURRENT_POSITION)\n      ],\n      'selectMap': [],\n      'train': [],\n      'place': [],\n      'bus': [],\n      'ship': [],\n    };\n    candidates.forEach(c => {\n      // あらかじめ宣言した種別の駅データのみ、各種別ごとに格納する。\n      if (Object.keys(stationsByType).includes(c.type)) { stationsByType[c.type].push(c); }\n    })\n    // 連想配列のキーをループする。\n    Object.keys(stationsByType).forEach((key) => {\n      const stations = stationsByType[key];\n      // 各種別ごとの配列の要素が存在する場合のみ以下の処理を実行する。\n      // (ネストが深いのであとで見直す。2020/02/18現在。)\n      if (stations && stations !== []) {\n        // 種別順にならんだ連想配列の値(駅候補の配列)を結合する。\n        sortedStations = sortedStations.concat(stations);\n      }\n    });\n    return sortedStations;\n  }\n\n  /**\n   * 検索ボックスに文字が追加された場合 or 地点を確定した際に呼ばれる\n   * @param value 文字追加の場合 string、地点確定の場合 Candidate\n   * @returns\n   */\n  const updateValue = async (value: string | Candidate) => {\n    // エラーメッセージを空にする\n    dispatch(updateErrorMessage(''));\n    // 同じ地点を連続で再選択した場合にラベル部分が更新されない場合があるため、\n    // 候補の変更時に一旦空文字を設定する。\n    props.setPointName('');\n    props.setPlaceJP(null)\n    // 中心座標が変更された場合、編集済みフラグをオンにする。\n    // (このフラグがオンの場合、利用空港が変更された際、初期位置が変更されない。)\n    props.switchEdited(true);\n    if (value instanceof Candidate ) {\n      // サジェストから「施設(地点)」を選択した場合の処理。\n      if (value.type === 'place') {\n        /** 選択された地点のID。 */\n        const placeId = value.code;\n        try {\n          /** 選択された地点情報。(緯度経度など) */\n          const placeDetail = await getClosedPlaceDetail(placeId, undefined, lang);\n          // 地点情報が取得できなかった場合は、以降の処理を実行しない。\n          if (!placeDetail) { return; }\n          /** 選択された地点の緯度経度。 */\n          const coordinates = placeDetail.getLocation();\n\n          // 一旦ジオコーディングAPIからの情報取得は取りやめる (2022/02/09)\n          /** ジオコーディングAPIから取得した地点情報。 */\n          // const places: Place[] = await getClosedGeocode(`${coordinates.lat},${coordinates.lng}`);\n          // places.forEach((x)=>{ console.log(x.getFullAddress()) })\n          /** 取得した地点情報のうちの1件目。 */\n          // const place2 = places[0];\n          // 地点情報が取得できなかった場合は、以降の処理を実行しない。\n          // if (!place) { return; }\n\n          const place = placeDetail;\n          /** 市区町村までの住所。 */\n          const municipality = convertLetter(place.getAddressToMunicipality());\n          /** 住所。 */\n          const address = convertLetter(place.getFullAddress(changeLang(i18n.language)));\n          // 日本語用地点名の更新を\n          if(i18n.language !== 'ja') {\n            const placeJPDetail = await getClosedPlaceDetail(placeId, undefined, Lang.ja);\n            if(placeJPDetail) {\n              props.setPlaceJP(placeJPDetail);\n            }\n          }\n          else {\n            props.setPlaceJP(place);\n          }\n          /** 地点名として更新するラベル(住所 + 施設名) */\n          const label = `${address} ${value.name}`;\n          // 市区町村までの住所を更新する。\n          props.setMunicipality(municipality);\n          // 選択された地点名を更新する。\n          props.setPointName(label);\n          // 選択された地点を更新する\n          props.setPlace(place);\n          // 選択された地点の緯度経度を発着地の地点として更新する。\n          props.setCenter(coordinates);\n          // 選択された地点の緯度経度をマーカーを表示する座標として更新する。\n          props.setMarkerPoint(coordinates);\n        }\n        catch(e) {\n          const errorMessage = \"必要な住所情報が取得できませんでした。恐れ入りますが、別の名称で再検索いただくか、詳細場所を地図上のピンで指定してください。\";\n          dispatch(updateErrorMessage(errorMessage));\n          if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n            console.error(e);\n          }\n        }\n      }\n      // サジェストから「駅・バス停・港」のいずれかを選択した場合の処理。\n      if (value.type === 'train' || value.type === 'bus' || value.type === 'ship') {\n        const code = value.code\n        const station = await getClosedStationDetail(code);\n        /** 選択された駅・バス停・港の緯度。 */\n        const lat = station.GeoPoint.lati_d;\n        /** 選択された駅・バス停・港の経度。 */\n        const lng = station.GeoPoint.longi_d;\n        /** 選択された地点の緯度経度。 */\n        const coordinates = {\n          lat: Number.parseFloat(lat),\n          lng: Number.parseFloat(lng),\n        }\n        const places: Place[] = await getClosedGeocode(`${lat},${lng}`, lang);\n        // 地点情報が取得出来る場合、住所情報とラベルの取得をする\n        if (places) {\n          const place = places[0];\n          /** 市区町村までの住所。 */\n          const municipality = convertLetter(place.getAddressToMunicipality());\n          // 市区町村までの住所を更新する。\n          props.setMunicipality(municipality);\n          /** 住所。 */\n          const address = convertLetter(place.getFullAddress(lang));\n          /** 地点名として更新するラベル(住所 + 施設名) */\n          const label = `${address} ${value.name}`;\n          // 選択された地点名を更新する。\n          props.setPointName(label);\n          // 選択された地点を更新する\n          props.setPlace(place);\n          if(lang !== Lang.ja) {\n            const placeJPDetail = await getClosedGeocode(`${lat},${lng}`, Lang.ja);\n            if(placeJPDetail[0]) {\n              props.setPlaceJP(placeJPDetail[0]);\n            }\n          }\n          else {\n            props.setPlaceJP(place);\n          }\n        }\n        // 中心座標更新と共に料金取得リクエストが走るため、最後に中心座標を入れている\n        props.setCenter(coordinates);\n        props.setMarkerPoint(coordinates);\n\n      }\n      // サジェストから「現在地」を選択した場合は、現在地の緯度経度をReduxに格納する。\n      if (value.type === PointType.CURRENT_POSITION) {\n        navigator.geolocation.getCurrentPosition(async (position) => {\n          const lat = position.coords.latitude;\n          const lng = position.coords.longitude;\n          // 現在地の緯度経度のオブジェクト。\n          const geoPoint: GeoLocation = { lat, lng };\n          /** 現在地の座標(緯度経度)。 */\n          const coordinate = convertLocationToStr(geoPoint);\n          /** 現在地の座標から取得した地点情報。 */\n          const places: Place[] = await getClosedGeocode(coordinate, lang);\n          // 地点情報が取得できなかった場合は、以降の処理を実行しない。\n          if (!places) { return; }\n          /** 取得した地点情報の中の1件目。 */\n          const place = places[0];\n          /** 市区町村までの住所。 */\n          const municipality = convertLetter(place.getAddressToMunicipality());\n          /** 住所。 */\n          const address = convertLetter(place.getFullAddress(lang));\n          // 料金取得API用に日本語名称を取得する\n          if(lang !== Lang.ja) {\n            const placesJP: Place[] = await getClosedGeocode(coordinate, Lang.ja);\n            if(placesJP[0]) {\n              props.setPlaceJP(placesJP[0]);\n            }\n          }\n          else {\n            props.setPlaceJP(place);\n          }\n          // 市区町村までの住所を更新する。\n          props.setMunicipality(municipality);\n          // 選択された地点名を更新する。\n          props.setPointName(address);\n          // 選択された地点を更新する\n          props.setPlace(place);\n          // 中心座標を更新する\n          props.setCenter({lat, lng});\n          props.setMarkerPoint({lat, lng});\n        }, (e) => {\n          /** 現在地を取得できない場合 */\n          dispatch(updateErrorMessage(t('no_get_now_place')));\n          return;\n        });\n      }\n    }\n  }\n\n  /** インクリメンタルサーチの候補に表示する文字列 */\n  const renderOption = (option: Candidate) => {\n    if(option.description) {\n      return (\n        <>\n          <span className={classes.pointNameText}>\n            {option.name}\n          </span>\n          <span className={classes.descriptionText}>\n            {option.description}\n          </span>\n        </>\n      )\n    }\n    return option.name;\n  }\n\n  return (\n    <Autocomplete\n      className={classes.root}\n      getOptionLabel={option => (typeof option === 'string' ? option : option.name)}\n      filterOptions={x => x}\n      onChange={(e, value) => { updateValue(value); }}\n      options={ candidates }\n      value={props.pointName}\n      autoComplete\n      disableOpenOnFocus\n      includeInputInList\n      freeSolo\n      debug\n      groupBy={(option: Candidate | History) => option.getTypeLabel(t) }\n      open={isDisplayCandidates}\n      onClose={()=>{\n        switchDisplayCandidates(false);\n      }}\n      renderOption={renderOption}\n      renderInput={params => (\n        <TextField\n          {...params}\n          variant=\"outlined\"\n          className={classes.textField}\n          onClick={onClick}\n          onChange={onChangeTextBox}\n          InputProps={{\n            ...params.InputProps,\n            className: '',\n            endAdornment: (\n              <AswSearch/>\n            )\n          }}\n          InputLabelProps={{\n            style: {\n              color: theme.palette.text.secondary,\n            }\n          }}\n        />\n      )}\n    />\n  );\n}\n\nexport default SearchBox;\n","import React, { Fragment } from 'react';\nimport { GoogleMap, Marker } from '@react-google-maps/api';\nimport { useGoogleMaps } from '../../../../../common/useGoogleMaps';\nimport { getClosedGeocode } from '../../../../../../services/google/api';\nimport Place from '../../../../../../services/google/Place';\nimport SearchBox from './SearchBox';\nimport { makeStyles, createStyles } from '@material-ui/core';\nimport { convertLetter } from '../../common/Address';\nimport { changeLang, Lang } from '../../../../../../states/query';\nimport { useTranslation } from 'react-i18next';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    root: {\n      borderLeft: 'solid 1px #000000',\n      borderRight: 'solid 1px #000000',\n    },\n  }),\n);\n\ninterface Props {\n  center: {\n    lat: number;\n    lng: number;\n  },\n  markerPoint: {\n    lat: number;\n    lng: number;\n  },\n  pointName: string,\n  setPointName: (v: string) => void,\n  setPlaceJP: (v: Place|null) => void,\n  setCenter: (v: {\n    lat: number;\n    lng: number;\n  }) => void,\n  setMarkerPoint: (v: {\n    lat: number;\n    lng: number;\n  }) => void,\n  setMunicipality: (v: string) => void,\n  switchEdited: (v: boolean) => void,\n  setPlace: (v: Place) => void\n}\n\n/** タクシー・ハイヤー予約時の地点選択用の地図のコンポーネント。 */\nexport const Map: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  const containerStyle = {\n    height: \"300px\",\n    width: \"100%\",\n  };\n  const { i18n } = useTranslation();\n\n  /** Google Mapsのスクリプトの読み込みが完了したかを表すフラグ。 */\n  const { isLoaded } = useGoogleMaps();\n\n  /** マーカーとして使用するピンのアイコンのパス。 */\n  const pinIcon = \"/icons/mapPin.png\";\n\n  /** Google MapsのDOMノードを格納する変数。 */\n  let mapRef: GoogleMap | null = null;\n\n  /** 中心座標が変更された場合の処理。 */\n  // (マーカーを表示する座標のみ更新する。)\n  const onCenterChanged = () => {\n    // Google MapsのDOMノードが存在しない場合、以降の処理は実行しない。\n    if (!mapRef) { return; }\n    /** 地図上の中心地点の情報。 */\n    const centerOnMap = mapRef.state.map?.getCenter();\n    // 地図上の中心地点の情報が存在しない場合、以降の処理は実行しない。\n    if (!centerOnMap) { return; }\n    /** 地図上で表示されている中心座標。 */\n    const coordinate = {\n      lat: centerOnMap.lat(),\n      lng: centerOnMap.lng(),\n    };\n    props.setMarkerPoint(coordinate);\n  }\n\n  /** 地図上をクリックしたときの処理。 */\n  const onClicked = () => {\n    // 地図がクリックされた場合、編集済みフラグをオンにする。\n    // (このフラグがオンの場合、利用空港が変更された際、初期位置が変更されない。)\n    props.switchEdited(true);\n  }\n\n  /** ドラッグ操作が終わったタイミングの処理。 */\n  const onDragEnd = async() => {\n    // Google MapsのDOMノードが存在しない場合、以降の処理は実行しない。\n    if (!mapRef) { return; }\n    /** 地図上の中心地点の情報。 */\n    const centerOnMap = mapRef.state.map?.getCenter();\n    // 地図上の中心地点の情報が存在しない場合、以降の処理は実行しない。\n    if (!centerOnMap) { return; }\n    /** 地図上で表示されている中心座標。 */\n    const coordinate = {\n      lat: centerOnMap.lat(),\n      lng: centerOnMap.lng(),\n    }\n    const latLng = `${centerOnMap.lat()},${centerOnMap.lng()}`;\n    /** 選択された地点の住所などを含んだ詳細情報。 */\n    const selectedPlace = await getGeoDetail(latLng, changeLang(i18n.language));\n    // 地点の詳細情報が取得できない場合(太平洋上などの場合)、以降の処理は実行しない。\n    if (!selectedPlace) { return; }\n    /** 選択された地点情報を更新する */\n    props.setPlace(selectedPlace);\n    /** 言語情報を取得する */\n    const lang = changeLang(i18n.language);\n    /** 選択された地点の住所。 */\n    const address = convertLetter(selectedPlace.getFullAddress(lang).replace(/-/g, '_'));\n    /** 「都道府県」・「市区町村」までの住所。 */\n    const municipality = convertLetter(selectedPlace.getAddressToMunicipality());\n    // 日本語以外の場合、日本語の住所を取得する\n    // 日本語名称取得が完了してから中心地点を更新する\n    if(i18n.language !== 'ja') {\n      const selectedJPPlace = await getGeoDetail(latLng, Lang.ja);\n      props.setPlaceJP(selectedJPPlace);\n    }\n    else {\n      props.setPlaceJP(selectedPlace);\n    }\n    // 住所を選択された地点名として更新する。\n    props.setPointName(address);\n    // ドラッグ操作が終了したタイミングの中心座標を選択地点として更新する。\n    props.setCenter(coordinate);\n    // 市区町村までの住所を更新する。\n    props.setMunicipality(municipality);\n  }\n\n  /**\n   * 緯度経度から地点情報を取得する。\n   * @param latLng 緯度経度の文字列。(例: 35.68153260987459,139.76771635598573)\n   */\n  async function getGeoDetail(latLng: string, lang: Lang) {\n    const places: Place[] = await getClosedGeocode(latLng, lang);\n    /** 取得できた地点情報の配列のうち1件目。 */\n    const place = places[0];\n    return place;\n  }\n\n  return (\n    isLoaded ?\n      <div className={classes.root} data-cy=\"google_map_area\">\n        <SearchBox\n          pointName={props.pointName}\n          setCenter={props.setCenter}\n          setMarkerPoint={props.setMarkerPoint}\n          setPointName={props.setPointName}\n          setMunicipality={props.setMunicipality}\n          switchEdited={props.switchEdited}\n          setPlace={props.setPlace}\n          setPlaceJP={props.setPlaceJP}\n        />\n        <GoogleMap\n          center={props.markerPoint}\n          ref={(ref) => {mapRef = ref}}\n          onCenterChanged={onCenterChanged}\n          onDragEnd={onDragEnd}\n          onClick={onClicked}\n          mapContainerStyle={containerStyle}\n          zoom={15}\n          options={{\n            fullscreenControl: false,\n            mapTypeControl: false,\n            streetViewControl: false,\n            zoomControlOptions: {\n              position: 8\n            }\n          }}\n        >\n          <Marker position={props.markerPoint} icon={pinIcon} />\n        </GoogleMap>\n      </div> : <Fragment/>\n  )\n}\n\nexport default Map;\n","import { useJsApiLoader } from '@react-google-maps/api';\n\n/**\n * Google Maps全体のJavaScriptファイルの読み込みに関するカスタムフック。\n * @returns isLoaded - Google Mapsスクリプトの読み込みが完了したかを表すフラグ。\n * @returns loadError - Google Mapsスクリプトの読み込みでエラーが発生した場合のエラー情報。\n */\nexport function useGoogleMaps() {\n  /** リクエストパラメーター。 */\n  const searchParams = new URLSearchParams(window.location.search);\n  /** 言語設定。 */\n  const lang = searchParams.get('lang') || 'ja';\n  /** GOOGLE MAPS APIのキー。(環境変数から参照する。) */\n  const GOOGLE_API_KEY = process.env.REACT_APP_GOOGLE_API_KEY as string;\n  const { isLoaded, loadError } = useJsApiLoader({\n    googleMapsApiKey: GOOGLE_API_KEY,\n    language: lang,\n  })\n  return { isLoaded, loadError }\n}\n","export const AirportNameMap: { [key:string]: string; } = {\n  \"CTS\": \"札幌(千歳)\",\n  \"RIS\": \"利尻\",\n  \"WKJ\": \"稚内\",\n  \"MBE\": \"オホーツク紋別\",\n  \"MMB\": \"女満別\",\n  \"AKJ\": \"旭川\",\n  \"SHB\": \"根室中標津\",\n  \"KUH\": \"釧路\",\n  \"OBO\": \"帯広\",\n  \"HKD\": \"函館\",\n  \"AOJ\": \"青森\",\n  \"ONJ\": \"大館能代\",\n  \"AXT\": \"秋田\",\n  \"SYO\": \"庄内\",\n  \"SDJ\": \"仙台\",\n  \"FKS\": \"福島\",\n  \"HND\": \"東京(羽田)\",\n  \"NRT\": \"東京(成田)\",\n  \"HAC\": \"八丈島\",\n  \"KIJ\": \"新潟\",\n  \"FSZ\": \"静岡\",\n  \"NGO\": \"名古屋(中部)\",\n  \"TOY\": \"富山\",\n  \"KMQ\": \"小松\",\n  \"NTQ\": \"能登\",\n  \"ITM\": \"大阪(伊丹)\",\n  \"KIX\": \"大阪(関西)\",\n  \"UKB\": \"大阪(神戸)\",\n  \"OKJ\": \"岡山\",\n  \"HIJ\": \"広島\",\n  \"IWK\": \"岩国\",\n  \"UBJ\": \"山口宇部\",\n  \"TTJ\": \"鳥取\",\n  \"YGJ\": \"米子\",\n  \"IWJ\": \"萩・石見\",\n  \"TAK\": \"高松\",\n  \"TKS\": \"徳島\",\n  \"MYJ\": \"松山\",\n  \"KCZ\": \"高知\",\n  \"FUK\": \"福岡\",\n  \"KKJ\": \"北九州\",\n  \"HSG\": \"佐賀\",\n  \"OIT\": \"大分\",\n  \"KMJ\": \"熊本\",\n  \"NGS\": \"長崎\",\n  \"TSJ\": \"対馬\",\n  \"IKI\": \"壱岐\",\n  \"FUJ\": \"五島福江\",\n  \"KMI\": \"宮崎\",\n  \"KOJ\": \"鹿児島\",\n  \"OKA\": \"沖縄(那覇)\",\n  \"MMY\": \"宮古\",\n  \"ISG\": \"石垣\",\n  'AXJ': \"天草\",\n  'TNE': \"種子島\",\n  'KUM': \"屋久島\",\n  'RNJ': \"与論\",\n  'KKX': \"喜界\",\n  'OKE': \"沖永良部\",\n  'ASJ': \"奄美\",\n  'TKN':  \"徳之島\"\n};\n","import React from 'react';\nimport { Select } from '@material-ui/core';\nimport { AirportNameMap } from '../../../../../../services/ana/data/airportNameMap';\nimport { useTranslation } from 'react-i18next';\n\ninterface Props {\n  value: string,\n  // ターゲット空港一覧\n  targetAirportCodeList: string[],\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\n/** タクシー・ハイヤー予約画面の空港選択のセレクトボックスのコンポーネント。 */\nexport const SelectAirport: React.FC<Props> = (props: Props) => {\n  const { t } = useTranslation();\n  return (\n    <Select native value={props.value} onChange={props.onChange}>\n      {props.targetAirportCodeList.map((airpotCode, idx)=>{\n        const isNoMatch = t(`taxi:${airpotCode}`) === airpotCode;\n        // airportNameListに定義されていない空港の場合には汎用リストから取得する\n        // TODO: AirportNameMapは日本語のみなので、英語用のリストを作成する\n        const airportLabel = isNoMatch? AirportNameMap[airpotCode]: t(`taxi:${airpotCode}`);\n        return (\n          <option value={airpotCode} key={idx}>{airportLabel}</option>\n        )\n      })}\n    </Select>\n  );\n}\n\nexport default SelectAirport;\n","import React from 'react';\nimport { Select } from '@material-ui/core';\n\ninterface Props {\n  value: luxon.DateTime,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n  isUnselectedFlightHour: boolean\n}\n\n/** タクシー・ハイヤー予約画面の時刻のセレクトボックスのコンポーネント。 */\nexport const SelectFlightHour: React.FC<Props> = (props: Props) => {\n  /** 「時」部分(1~23までの数値)の配列。 */\n  const hours = Array.from(Array(24).keys());\n  const defaultValue = props.isUnselectedFlightHour ? '---' : props.value?.hour;\n\n  const setValue = (v: number) => {\n    return v.toString().padStart(2, '0');\n  }\n\n  return (\n    <Select native value={defaultValue} onChange={props.onChange}>\n      {props.isUnselectedFlightHour && <option value='---'>---</option>}\n      {\n        hours.map((h) => {\n          return <option value={h} key={`hours_${h}`}>{setValue(h)}</option>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectFlightHour;\n","import React from 'react';\nimport { Select } from '@material-ui/core';\n\ninterface Props {\n  value: luxon.DateTime,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n  isUnselectedFlightMinutes: boolean\n}\n\n/** タクシー・ハイヤー予約画面の時刻のセレクトボックスのコンポーネント。 */\nexport const SelectFlightMinutes: React.FC<Props> = (props: Props) => {\n  /** 「分」部分(0~59までの数値)の配列。 */\n  const minutes = Array.from(Array(60).keys())\n\n  const setValue = (v: number) => {\n    return v.toString().padStart(2, '0');\n  }\n\n  const defaultValue = props.isUnselectedFlightMinutes ? '---' : props.value?.minute;\n\n  return (\n    <Select native value={defaultValue} onChange={props.onChange}>\n      {props.isUnselectedFlightMinutes && <option value='---'>---</option>}\n      {\n        minutes.map((m) => {\n          return <option value={m} key={`minutes_${m}`}>{setValue(m)}</option>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectFlightMinutes;\n","import React from 'react';\nimport { Select } from '@material-ui/core';\n\ninterface Props {\n  value: luxon.DateTime,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\n/** タクシー・ハイヤー予約画面の時刻のセレクトボックスのコンポーネント。 */\nexport const SelectHour: React.FC<Props> = (props: Props) => {\n  /** 「時」部分(1~23までの数値)の配列。 */\n  const hours = Array.from(Array(24).keys());\n  const defaultValue = props.value.hour;\n\n  const setValue = (v: number) => {\n    return v.toString().padStart(2, '0');\n  }\n\n  return (\n    <Select native value={defaultValue} onChange={props.onChange}>\n      {\n        hours.map((h) => {\n          return <option value={h} key={`hours_${h}`}>{setValue(h)}</option>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectHour;\n","import React from 'react';\nimport { Select } from '@material-ui/core';\n\ninterface Props {\n  value: luxon.DateTime,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\n/** タクシー・ハイヤー予約画面の時刻のセレクトボックスのコンポーネント。 */\nexport const SelectMinutes: React.FC<Props> = (props: Props) => {\n  /** 「分」部分(0~59までの数値)の配列。 */\n  const minutes = Array.from(Array(60).keys())\n\n  const setValue = (v: number) => {\n    return v.toString().padStart(2, '0');\n  }\n\n  const defaultValue = props.value.minute;\n\n  return (\n    <Select native value={defaultValue} onChange={props.onChange}>\n      {\n        minutes.map((m) => {\n          return <option value={m} key={`minutes_${m}`}>{setValue(m)}</option>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectMinutes;\n","import React from 'react';\nimport { Select } from '@material-ui/core';\n\ninterface Props {\n  value: luxon.DateTime,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\n/** タクシー・ハイヤー予約画面の日付のセレクトボックスのコンポーネント。 */\nexport const SelectDay: React.FC<Props> = (props: Props) => {\n  /**\n   * フォーム上で設定されている月の最終日。\n   * (例: 1月の場合は31日、うるう年ではない2月は28日)\n   * */\n  const lastDay = Number(props.value.daysInMonth);\n  /** 「日」部分(1~31までの数値)の配列。 */\n  const days = Array.from({length: lastDay}, (_, i) => i + 1);\n\n  /** 初期値。 */\n  const defaultValue = props.value.day;\n\n  const setValue = (v: number) => {\n    return v.toString().padStart(2, '0');\n  }\n\n  return (\n    <Select native value={defaultValue} onChange={props.onChange}>\n      {\n        days.map((d) => {\n          return <option value={d} key={`days_${d}`}>{setValue(d)}</option>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectDay;\n","import React from 'react';\nimport { Select } from '@material-ui/core';\n\ninterface Props {\n  value: luxon.DateTime,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\n/** タクシー・ハイヤー予約画面の日付のセレクトボックスのコンポーネント。 */\nexport const SelectMonth: React.FC<Props> = (props: Props) => {\n  /** 「月」部分(1~12までの数値)の配列。 */\n  const months = Array.from({length: 12}, (_, i) => i + 1);\n\n  const setValue = (v: number) => {\n    return v.toString().padStart(2, '0');\n  }\n\n  /** 初期値。 */\n  const defaultValue = props.value.month;\n\n  return (\n    <Select native value={defaultValue} onChange={props.onChange}>\n      {\n        months.map((m) => {\n          return <option value={m} key={`months_${m}`}>{setValue(m)}</option>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectMonth;\n","import React from 'react';\nimport { Select } from '@material-ui/core';\nimport { getNowLuxonDateTime } from '../../../../../../utils/luxonUtil';\n\ninterface Props {\n  value: luxon.DateTime,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\n/** タクシー・ハイヤー予約画面の日付(年号部分)のセレクトボックスのコンポーネント。 */\nexport const SelectYear: React.FC<Props> = (props: Props) => {\n  /** 現在日時。 */\n  const now = getNowLuxonDateTime();\n  /** 現在日時の年部分。 */\n  const year = now.year;\n  /** 現在日時の翌年。 */\n  const nextYear = year + 1;\n  /** 選択対象の年号(現在日時の年と翌年)の年号を格納した配列。 */\n  const years = [\n    year,\n    nextYear,\n  ];\n  // 年始の場合には前の年も選べるようにする\n  if(now.month === 0 && now.day < 4) {\n    years.unshift(year - 1);\n  }\n\n  /** セレクトボックスの初期値。 */\n  // 設定されている日時の年号。\n  const defaultValue = props.value.year;\n\n  return (\n    <Select native value={defaultValue} onChange={props.onChange}>\n      {\n        years.map((y) => {\n          return (<option value={y} key={`years_${y}`}>{y}</option>);\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectYear;\n","import React from 'react';\nimport { Button, makeStyles, withStyles, ButtonProps } from '@material-ui/core';\nimport ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos';\nimport { useTranslation } from 'react-i18next';\n\nconst useStyles = makeStyles(() => ({\n  button: {\n    boxShadow: '0 2px 2px 0 rgba(0,0,0,0.30)',\n    borderRadius: '2px',\n    textAlign: 'center',\n    width: '100%',\n    height: '48px',\n    marginTop: '16px',\n  },\n}));\n\n/** タクシー・ハイヤー予約画面の予約ボタンのコンポーネント。 */\nexport const ButtonToSubmit: React.FC<ButtonProps> = (props: ButtonProps) => {\n  const { t } = useTranslation();\n  const classes = useStyles();\n  /** 背景色を黄色、ラベル色を黒にしたボタンのコンポーネント。 */\n  const YellowButton = withStyles({\n    root: {\n      backgroundColor: \"#FDB50A\",\n    },\n    label: {\n      color: \"#0f0f0f\",\n    },\n  })(Button);\n  return (\n    <YellowButton\n      size=\"large\"\n      variant=\"contained\"\n      className={classes.button}\n      endIcon={<ArrowForwardIosIcon/>}\n      disabled={props.disabled}\n      {...props}\n    >\n      {t('taxi:process_reservation_button')}\n    </YellowButton>\n  );\n}\n","import React from 'react';\nimport { Select } from '@material-ui/core';\nimport { UNSELECTED_RIDING_DATE_STRING } from './useForm';\n\ninterface Props {\n  value: luxon.DateTime,\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n  selectTimeList: string[],\n  isUnselectedRidingDate: boolean\n}\n\n/** タクシー・ハイヤー予約画面の時刻のセレクトボックスのコンポーネント。 */\nexport const SelectHourAndMinutesPulldown: React.FC<Props> = (props: Props) => {\n  /** 未選択状態なら未選択の値を選択 */\n  const currentValue = props.isUnselectedRidingDate? UNSELECTED_RIDING_DATE_STRING: props.value.toFormat('HHmm');\n\n  const setValue = (v: string) => {\n    /** 未選択状態であればそのまま返す */\n    if(v === UNSELECTED_RIDING_DATE_STRING) {\n      return UNSELECTED_RIDING_DATE_STRING;\n    }\n    return `${v.slice(0, 2)} 時 ${v.slice(-2)} 分`;\n  }\n\n  return (\n    <Select native value={currentValue} onChange={props.onChange}>\n      {\n        props.selectTimeList.map((time) => {\n          return <option value={time} key={`hours_${time}`}>{setValue(time)}</option>\n        })\n      }\n    </Select>\n  );\n}\n\nexport default SelectHourAndMinutesPulldown;\n","import React from 'react';\nimport { Select } from '@material-ui/core';\nimport { UNSELECTED_RIDING_DATE_STRING } from './useForm';\n\ninterface Props {\n  flightPattern: string[];\n  selectFlightData: string;\n  onChange: (e: React.ChangeEvent<{\n    name?: string | undefined;\n    value: unknown;\n  }>) => void,\n}\n\nconst SelectFlight: React.FC<Props> = (props: Props) => {\n  const defaultValue = UNSELECTED_RIDING_DATE_STRING;\n\n  return (\n    <Select\n      native\n      onChange={props.onChange}\n      value={props.selectFlightData}\n    >\n      <option value={defaultValue}>\n        {defaultValue}\n      </option>\n      {props.flightPattern.map((pattern, index) => (\n        <option key={index} value={pattern}>\n          {pattern}\n        </option>\n      ))}\n    </Select>\n  );\n};\n\nexport default SelectFlight;\n","import React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Helmet from 'react-helmet';\n\nimport { Container, FormControl, FormControlLabel, Grid, makeStyles, Radio, RadioGroup, TextField, Typography, useTheme, useMediaQuery, Theme, MenuItem, Select, CircularProgress, Checkbox } from '@material-ui/core';\n\nimport ScrollToTop from '../../../../common/ScrollToTop';\nimport Cost from './../common/Cost';\nimport Map from './Map';\nimport SelectAirport from './Form/SelectAirport';\nimport { AirportTransferTaxiMapMode, UNSELECTED_RIDING_DATE_STRING, useForm } from './Form/useForm';\nimport PickupPattern from './Form/PickupPattern';\nimport SelectFlightHour from './Form/SelectFlightHour';\nimport SelectFlightMinutes from './Form/SelectFlightMinutes';\nimport SelectHour from './Form/SelectHour';\nimport SelectMinutes from './Form/SelectMinutes';\nimport SelectDay from './Form/SelectDay';\nimport SelectMonth from './Form/SelectMonth';\nimport SelectYear from './Form/SelectYear';\nimport { ButtonToSubmit } from './Form/ButtonToSubmit';\nimport Cautions from '../common/Cautions';\nimport LoadingModal from '../../../../search/LoadingModal';\nimport Contact from '../common/Contact';\nimport AlertInReservation from '../../MiyakoTaxi/AlertInReservation';\nimport { Alert } from '@material-ui/lab';\n\nimport ShowTaxiComapnyLogo from './ShowTaxiComapnyLogo';\nimport { TaxiCompanyList } from '../../../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { State } from '../../../../../reducers';\nimport { TaxiTimePattern } from '../../../../../services/taxi/GetTaxiMetaInfo/model/taxiCompanyConf';\nimport SelectHourAndMinutesPulldown from './Form/SelectHourAndMinutesPulldown';\nimport AirportTransferTaxiFooter from '../common/Footer';\nimport AirportTransferTaxiHeader from '../common/Header';\nimport { isTabiCube } from '../common/TabiCube';\nimport { switchUseV2 } from '../../../../../actions/generalAction';\nimport Environment from '../../../../../utils/environment';\nimport SelectFlight from './Form/SelectFlight';\nimport { DateTime, Interval } from 'luxon';\n\nconst useStyles = makeStyles((theme) => ({\n  contents: {\n    padding: '5px',\n    border: 'solid 1px #000000',\n    height: 'calc(100% - 12px)'\n  },\n  alert: {\n    margin: '10px 0px',\n  },\n  imgContainer: {\n    alignItems: 'flex-start',\n    marginTop: '10px',\n    minHeight: 'min(18vw, 200px)'\n  },\n  // 補足の部分のスタイル設定。\n  supplement: {\n    fontSize: '0.875rem',\n  },\n  tableLeft: {\n    backgroundColor: theme.palette.primary.main,\n    border: 'solid 1px #000000',\n  },\n  textItemName: {\n    color: '#ffffff',\n    fontSize: '0.8rem',\n    fontWeight: 'bold',\n    padding: '5px',\n  },\n  textItemAnnotation: {\n    color: '#ffff00',\n    fontSize: '0.8rem',\n    fontWeight: 'bold'\n  },\n  seaGaiaSelect: {\n    height: '2.2rem',\n    width: '90%',\n    fontSize: '0.75rem'\n  },\n  taxiUnderLogoNoticeArea: {\n    fontSize: '0.875rem',\n    color: '#0B308E'\n  },\n  redZone: {\n    color: '#f44336'\n  },\n  flightBefore: {\n    paddingRight: \"10px\"\n  },\n  springMileMain: {\n    color: '#FF0000',\n    paddingTop: '1rem',\n    paddingBottom: '1rem',\n    fontSize: '0.875rem'\n  },\n  springMileP: {\n    margin: '0rem'\n  },\n  springMilePBold: {\n    margin: '0rem',\n    fontWeight: 'bold'\n  },\n  // 庄内タクシー期間限定キャンペーンエリア\n  shounaiCampaignArea: {\n    marginTop: '1rem'\n  }\n}));\n\n/** タクシー・ハイヤー予約画面のコンポーネント。 */\nexport const Booking: React.FC = () => {\n  const { t } = useTranslation();\n  const dispatch = useDispatch();\n  const theme = useTheme();\n  const classes = useStyles(theme);\n  /** 実行環境を判別するための環境変数。 */\n  const env = process.env['REACT_APP_STAGE_ENV'] || '';\n  /** reCAPTCHA v2を使用するかを表すフラグ。 */\n  const useRecaptchaV2 = useSelector((state: State) => state.general.useV2);\n  const errorMessage = useSelector((state: State) => state.general.errorMessage);\n\n  const isMobileSize = useMediaQuery((theme: Theme) =>\n    theme.breakpoints.down('sm')\n  );\n\n  // タクシー予約画面で設定された情報に関するカスタムフック。\n  const {\n    airportCode,  onChangedAirport,\n    center, setCenter,\n    markerPoint, setMarkerPoint,\n    pointName, setPointName,\n    setPlaceJP,\n    email, onChangedEmail, isEmptyEmail, isInvalidEmail,\n    isUnavalableEmail, isRequiredRetry, isFailed,\n    flight, onChangedFlight,\n    isEmptyFlight, isInvalidFlight,\n    flightDate,  onChangedFlightDate,\n    ridingDate,  onChangedRidingYear, onChangedRidingMonth,onChangedRidingDay,\n    onChangedRidingHour, onChangedRidingMinutes, onChangedRidingHourAndMinutes,\n    isOverDeadline,\n    toAirport,  pickupPattern, setPickupPattern,\n    isSubmitted,\n    onSubmit,\n    setMunicipality,\n    isSubjectArea,\n    distanceText, durationText,\n    switchEdited,\n    taxiCompany,\n    setPlace,\n    mode,\n    selectPointNumber, setSelectPointNumber,\n    pointList,\n    invalidFlightErrorMessage,\n    feeLabel,\n    isEndCallTaxiAPI,\n    isFailCallTaxiAPI,\n    targetAirportCodeList,\n    isEndInit,\n    fareType,\n    flightPattern,\n    selectFlightData,\n    onChangedRidingFlight,\n    notesLabel, alertLabel,\n    isAvailableReservation,\n    isEmptyAddress,\n    taxiCompanyConf,\n    lang,\n    timePattern,\n    selectTimeList,\n    isUnselectedRidingDate,\n    referrer,\n    needRetryRecaptcha,\n    switchNeedRetryRecaptcha,\n    disallowSupportDirection,\n    invalidFlightPattern,\n    isUnselectedFlightHour,\n    isUnselectedFlightMinutes,\n    invalidFlightDateErrorMessage,\n    isUnselectedFlightDate,\n  } = useForm();\n\n  /** コスト(所要時間・距離)のラベルを取得する。 */\n  const costLabel = () => {\n    return `${distanceText} ${durationText}`;\n  }\n\n  /** メールアドレス欄に不備があるかを表すフラグ。 */\n  // 予約ボタン押下済みで、メールアドレスが空または文字列がメールアドレスの形式になっていない場合はtrueとする。\n  const hasErrorInEmail = isSubmitted && (isEmptyEmail || isInvalidEmail);\n\n  /** 搭乗便欄に不備があるかを表すフラグ。 */\n  // 予約ボタン押下済みで、メールアドレスが空または文字列が搭乗便の形式になっていない場合はtrueとする。\n  const hasErrorInFlight = isSubmitted && ((isEmptyFlight && selectFlightData === UNSELECTED_RIDING_DATE_STRING) || isInvalidFlight);\n\n  /** エラー時にメールアドレス欄で表示するメッセージを取得する。 */\n  const getEmailHelperLabel = () => {\n    let label = '';\n    if (isEmptyEmail) { label = t('taxi:empty_email'); }\n    if (isInvalidEmail) { label = t('taxi:invalid_email') }\n    return label;\n  }\n\n  /** エラー時に搭乗便欄で表示するメッセージを取得する。 */\n  const getFlightHelperLabel = () => {\n    let label = '';\n    if (isEmptyFlight && selectFlightData === UNSELECTED_RIDING_DATE_STRING) { label = t('taxi:empty_fligtnumber'); }\n    if (isInvalidFlight) { label = t('taxi:invalid_flightnumber') }\n    return label;\n  }\n\n  /** タクシー料金・距離・時間を表示するか判定する */\n  const isShowTaxiFeeArea = () => {\n    return isEndCallTaxiAPI && !isFailCallTaxiAPI;\n  }\n\n  /** 旅CUBEモードであるかを表すフラグ。 */\n  const tabiCube = isTabiCube(referrer || '');\n  /** ページタイトル。 */\n  const title = tabiCube ? t('tabicube') : t('title');\n\n  /** 予約ボタンクリック時の処理。 */\n  const handleClick = () => {\n    // reCaptcha v2での認証を促すフラグを一旦オフにする。\n    switchNeedRetryRecaptcha(false);\n    // reCAPTCHA v2を使用する場合。\n    if (useRecaptchaV2) {\n      /** reCAPTCHA v2用のエレメント。 */\n      const wrapper = document.createElement('div');\n      const widgetId = grecaptcha.render(wrapper, {\n        sitekey: process.env.REACT_APP_GOOGLE_RECAPTCHA_V2_KEY,\n        size: 'invisible',\n        callback: (token: string) => {\n          // 予約処理の関数。\n          onSubmit(token);\n        }\n      });\n      // reCAPTCHA v2用のエレメントをbodyタグ内に追加する。\n      document.body.appendChild(wrapper);\n      // reCAPCHA v2のチャレンジを実行する。\n      grecaptcha.execute(widgetId);\n    } else {\n      // reCAPTCHA v3を使用する場合、そのまま仮予約処理を実行する。\n      onSubmit();\n    }\n  };\n\n  /** Google reCAPTCHAのjsファイルのURL。 */\n  const recaptchaUrl = `https://www.google.com/recaptcha/api.js?render=${process.env.REACT_APP_GOOGLE_RECAPTCHA_KEY}`;\n\n  /** 庄内エリアのタクシー会社か? */\n  const isShonaiAreaTaxi = [TaxiCompanyList.sakataNo1Taxi, TaxiCompanyList.shokoHire].includes(taxiCompany);\n\n  /** 象潟合同交通か? */\n  const isKisakataTaxi = [TaxiCompanyList.airport_liner, TaxiCompanyList.nikaho_go].includes(taxiCompany);\n\n  /** 庄交ハイヤー・酒田第一タクシーかつ、campaign期間内か? */\n  const isShokouSakataWithCampaign = (()=>{\n    /** 庄交ハイヤー・酒田第一タクシーでない場合には出さない */\n    if(!isShonaiAreaTaxi) {\n      return false;\n    }\n    /** 期間内に収まっているか判定 */\n    const now = DateTime.now();\n    const end = DateTime.fromISO(\"2025-03-01T00:00:00+09:00\");\n    return now < end;\n  })()\n\n  return (\n    <div>\n      <Helmet>\n        {/* ページタイトルを設定する。 */}\n        <title>{title}</title>\n        {/* Google reCAPTHCAのJavaScriptファイルの読み込み。 */}\n        <script src={recaptchaUrl} async defer />\n        {/* Adobe Analyticsでタクシー予約画面のアクセス数の集計をする。 */}\n        <script type=\"application/javascript\">\n          s.pageName=location.origin+&quot;/booking-taxi&quot;;\n          s.t();\n        </script>\n      </Helmet>\n        <>\n          {/* 画面遷移時に画面トップへ遷移させるためのコンポーネント。 */}\n          <ScrollToTop />\n          {/* ヘッダー。 */}\n          <AirportTransferTaxiHeader tabiCube={tabiCube} />\n          {/* 仮予約の処理中に表示するアイコン。 */}\n          <LoadingModal />\n          {/** 読込中に表示するアイコン */}\n          {!isEndInit &&\n            <Container maxWidth=\"md\">\n              <Grid container direction=\"column\">\n                <Grid item container justify='center' style={{ margin: '20px' }}>\n                  <CircularProgress color='primary' size={64}/>\n                </Grid>\n              </Grid>\n            </Container>\n          }\n          {/* 読み込みが終わった際にBodyを表示する */}\n          {isEndInit &&\n            <Container maxWidth=\"md\">\n              <Grid container direction=\"column\">\n                <Grid item className={classes.imgContainer}>\n                  {/* 企業ロゴを表示する */}\n                  <ShowTaxiComapnyLogo\n                    company={taxiCompany}\n                    lang={lang}\n                  />\n                  {/** イースタンの場合にはここ表示しない */}\n                  {/** 多言語化対応はイースタンのみのため対応をしない(2022/02/18 現在) */}\n                  { (taxiCompany !== TaxiCompanyList.eastern && taxiCompany !== TaxiCompanyList.limoTaxi) &&\n                    <div className={classes.taxiUnderLogoNoticeArea}>\n                      <div>\n                        {taxiCompanyConf?.displayName}のご予約が可能です。内容をご確認いただき、よろしければ、「予約に進む」ボタンを選択してください。本ページでご入力いただいたメールアドレスに確認メールが送信されます。\n                      </div>\n                      <div className={classes.redZone}>\n                        {/* キングタクシー2のみ */}\n                        {(taxiCompany === TaxiCompanyList.kingTaxi2) &&\n                          <>\n                            ※ご注意<br/>\n                            こちらの予約はエアポートライナー(乗合タクシー)「速籠便(秋田市内)」のものではありません。<br/>\n                          </>\n                        }\n                        {/* 庄内エリアのタクシーか否かで文言が変わる */}\n                        {(isShonaiAreaTaxi || isKisakataTaxi) &&\n                          <>\n                            ※料金は現地でのお支払いとなります。\n                          </>\n                        }\n                        {(!isShonaiAreaTaxi && !isKisakataTaxi) &&\n                          <>\n                            ※ハイヤー・タクシー料金は現地でのお支払いとなります。\n                          </>\n                        }\n                      </div>\n                      {/* キャンペーン期間中のお知らせ掲載 */}\n                      {isShokouSakataWithCampaign &&\n                        <div className={classes.shounaiCampaignArea}>\n                          <div>2025年1月9日(木)~ 2025年2月28日(金)の間に、庄内空港発着の航空便へご搭乗のうえ乗合タクシーをご利用いただくと、通常 大人(中学生以上)1,860円/人の料金が 1,000円/人になる割引キャンペーンを実施中!</div>\n                          <div className={classes.redZone}>※ご利用には、事前の予約申し込みと、当日の搭乗券やeチケット控えなどのご提示が必要です。</div>\n                          <div>※小学生以下は半額(500円/人)となります。</div>\n                        </div>\n                      }\n                    </div>\n                  }\n                </Grid>\n                {/* 送迎パターン選択の行。 */}\n                <Grid item container>\n                  <Grid item xs={4} className={classes.tableLeft}>\n                    <Grid container direction=\"column\" justify=\"center\" style={{ height: \"100%\" }}>\n                      <Grid item>\n                        <Typography className={classes.textItemName}>\n                          {t('taxi:select_pickup_pattern')}\n                        </Typography>\n                      </Grid>\n                    </Grid>\n                  </Grid>\n                  <Grid item xs={8} className={classes.contents}>\n                    <FormControl component=\"fieldset\">\n                      <RadioGroup value={pickupPattern} aria-label=\"pick-up pattern\" name=\"pick-up-pattern-radios\">\n                        {/** 【お迎え先 → 空港】の選択肢 */}\n                        {(taxiCompanyConf?.supportDirection !== 'fromAirport') &&\n                          <FormControlLabel\n                            value={PickupPattern.TO_AIRPORT}\n                            control={<Radio onClick={() => {setPickupPattern(PickupPattern.TO_AIRPORT)}} />}\n                            label={t('taxi:point_to_airport')}\n                          />\n                        }\n                        {/** 【空港 → お送り先】の選択肢 */}\n                        {(taxiCompanyConf?.supportDirection !== 'toAirport') &&\n                          <FormControlLabel\n                            value={PickupPattern.FROM_AIRPORT}\n                            control={<Radio onClick={() => {setPickupPattern(PickupPattern.FROM_AIRPORT)}} />}\n                            label={t('taxi:airport_to_point')}\n                          />\n                        }\n                      </RadioGroup>\n                    </FormControl>\n                    {/** 許可されていない送迎パターンを選択した際のアラート */}\n                    {disallowSupportDirection &&\n                      <Alert severity=\"error\">\n                        {t('taxi:invalid_ride_pattern')}\n                      </Alert>\n                    }\n                  </Grid>\n                </Grid>\n\n                {/* お迎え先空港の行。 */}\n                { !toAirport &&\n                  <Grid item container>\n                    <Grid item xs={4} className={classes.tableLeft}>\n                      <Typography className={classes.textItemName}>\n                        {t('taxi:pickup_airport')}\n                      </Typography>\n                    </Grid>\n                    <Grid item xs={8}>\n                      <div className={classes.contents} data-cy=\"booking_taxi_select_airport\" >\n                        <SelectAirport\n                          value={airportCode}\n                          onChange={onChangedAirport}\n                          targetAirportCodeList={targetAirportCodeList}\n                        />\n                        {t('taxi:airport')}\n                      </div>\n                    </Grid>\n                  </Grid>\n                }\n\n\n                { mode === AirportTransferTaxiMapMode.map &&\n                  <>\n                  <Grid item className={classes.tableLeft} style={{ width: \"100%\" }}>\n                    <Typography className={classes.textItemName}>\n                      <span>\n                        { toAirport ? t('taxi:pickup_location') : t('taxi:sending_location') }\n                      </span><br/>\n                      <span className={classes.textItemAnnotation}>\n                        {t('taxi:location_notice')}\n                      </span>\n                    </Typography>\n                  </Grid>\n                  <Grid item>\n                    <Map\n                      center={center}\n                      markerPoint={markerPoint}\n                      setCenter={setCenter}\n                      setMarkerPoint={setMarkerPoint}\n                      pointName={pointName}\n                      setPointName={setPointName}\n                      setPlaceJP={setPlaceJP}\n                      setMunicipality={setMunicipality}\n                      switchEdited={switchEdited}\n                      setPlace={setPlace}\n                    />\n                  </Grid>\n                  </>\n                }\n                {/** 乗降地点選択プルダウンメニュー */}\n                {/** 多言語化対応はイースタンのみのため対応をしない(2022/02/18 現在) */}\n                { (mode === AirportTransferTaxiMapMode.select && !isKisakataTaxi) &&\n                  <Grid item container>\n                    <Grid item xs={4} className={classes.tableLeft}>\n                      <Typography className={classes.textItemName}>\n                        <span>\n                          { toAirport? 'お迎え場所': '降車場所'}\n                        </span>\n                        <br/>\n                        <span>\n                          ※プルダウンで定額対象施設を選択してください\n                        </span>\n                      </Typography>\n                    </Grid>\n                    <Grid item xs={8}>\n                      <div className={classes.contents} data-cy=\"booking_taxi_select_area\">\n                        <Select\n                          value={selectPointNumber}\n                          className={classes.seaGaiaSelect}\n                          SelectDisplayProps={{\n                            style: {\n                              padding: '10px 20px 10px 5px',\n                              whiteSpace: 'unset'\n                            }\n                          }}\n                          onChange={(e: any) => {setSelectPointNumber(e.target.value);}}\n                          fullWidth\n                        >\n                          { pointList.map((x, a) => {\n                            return (\n                              <MenuItem value={a} key={`seaGaiaMenuItem_${a}`} style={{fontSize:'0.8rem'}}>\n                                {x.name}\n                              </MenuItem>\n                            )\n                          }) }\n                        </Select>\n                      </div>\n                    </Grid>\n                  </Grid>\n                }\n\n                {/** 乗降地点選択プルダウンメニュー */}\n                {/** 象潟合同交通 */}\n                { (mode === AirportTransferTaxiMapMode.select && isKisakataTaxi) &&\n                  <Grid item container>\n                    <Grid item xs={4} className={classes.tableLeft}>\n                      <Typography className={classes.textItemName}>\n                        <span>\n                          { toAirport? 'お迎え場所': '降車場所'}\n                        </span>\n                        <br/>\n                        <span>\n                          ※プルダウンで定額対象施設を選択してください\n                        </span>\n                      </Typography>\n                    </Grid>\n                    <Grid item xs={8}>\n                      <div className={classes.contents} data-cy=\"booking_taxi_select_area\">\n                        <Select\n                          value={selectPointNumber}\n                          className={classes.seaGaiaSelect}\n                          SelectDisplayProps={{\n                            style: {\n                              padding: '10px 20px 10px 5px',\n                              whiteSpace: 'unset'\n                            }\n                          }}\n                          onChange={(e: any) => {\n                            const value = Number(e.target.value);\n                            setSelectPointNumber(e.target.value);\n                            if (value === -1) {\n                              // 未選択の場合\n                              setPointName('ここで検索');\n                              setCenter({ lat: 0, lng: 0 });\n                            } else {\n                              // 地点が選択された場合\n                              setPointName(pointList[value].name);\n                              setCenter({ \n                                lat: Number(pointList[value].latLng.split(',')[0]), \n                                lng: Number(pointList[value].latLng.split(',')[1]) \n                              });\n                            }\n                          }}\n                          fullWidth\n                        >\n                          <MenuItem value={-1} key=\"unselected\" style={{fontSize:'0.8rem'}}>\n                            選択してください\n                          </MenuItem>\n                          { pointList.map((x, a) => {\n                            return (\n                              <MenuItem value={a} key={`seaGaiaMenuItem_${a}`} style={{fontSize:'0.8rem'}}>\n                                {x.name}\n                              </MenuItem>\n                            )\n                          }) }\n                        </Select>\n                        {taxiCompany === TaxiCompanyList.nikaho_go &&\n                          <Typography color=\"error\" style={{fontSize: '0.875rem', marginTop: '8px'}}>\n                            ※ 平日/土日祝日で運行区間が異なります。<br/>\n                            &nbsp;&nbsp;&nbsp;ご乗車日を変更した場合は、あらためて区間をご選択ください。\n                          </Typography>\n                        }\n                      </div>\n                    </Grid>\n                  </Grid>\n                }\n\n                {/* お送り先空港の行。 */}\n                { toAirport &&\n                  <Grid item container>\n                    <Grid item xs={4} className={classes.tableLeft}>\n                      <Typography className={classes.textItemName}>\n                        {t('taxi:sending_airport')}\n                      </Typography>\n                    </Grid>\n                    <Grid item xs={8}>\n                      <div className={classes.contents} data-cy=\"booking_taxi_select_airport\">\n                        <SelectAirport\n                          value={airportCode}\n                          onChange={onChangedAirport}\n                          targetAirportCodeList={targetAirportCodeList}\n                        />\n                        {t('taxi:airport')}\n                      </div>\n                    </Grid>\n                  </Grid>\n                }\n\n                {/* 利用便の行。 */}\n                <Grid item container>\n                  <Grid item xs={4} className={classes.tableLeft}>\n                    <Typography className={classes.textItemName}>\n                      {/* 庄内エリア・それ以外で文言を変える */}\n                      {isShonaiAreaTaxi &&\n                        <>\n                          {t('taxi:flight_number_shonai_taxi')}\n                          { toAirport ? t('taxi:dep_time') : t('taxi:arr_time') }\n                        </>\n                      }\n                      {!isShonaiAreaTaxi &&\n                        <>\n                          {t('taxi:flight_number')}\n                          { toAirport ? t('taxi:dep_time') : t('taxi:arr_time') }\n                        </>\n                      }\n                    </Typography>\n                  </Grid>\n                  <Grid item xs={8} container direction='column'>\n                    <div className={classes.contents}>\n                      {/* ご利用便の入力部分。 */}\n                      <Grid item container>\n                        <Grid item xs={12} md={5}>\n                          <span className={classes.flightBefore}>\n                            {t('taxi:flight_before')}\n                          </span>\n                          <TextField\n                            value={flight}\n                            onChange={onChangedFlight}\n                            error={hasErrorInFlight}\n                            helperText={getFlightHelperLabel()}\n                          />\n                          {t('taxi:flight_after')}\n                        </Grid>\n                        <Grid item xs={12} md={7}>\n                          <Typography color='textSecondary' component='span' className={classes.supplement}>\n                            {t('taxi:example_flight_number')}\n                          </Typography>\n                        </Grid>\n                      </Grid>\n                      {/* 乗車日時の選択部分。 */}\n                      <Grid item>\n                        <SelectYear value={flightDate} onChange={onChangedFlightDate.year}/>\n                        {t('taxi:year')}\n                        <SelectMonth value={flightDate} onChange={onChangedFlightDate.month}/>\n                        {t('taxi:month')}\n                        <SelectDay value={flightDate} onChange={onChangedFlightDate.day}/>\n                        {t('taxi:day')}\n                        <SelectFlightHour value={flightDate} onChange={onChangedFlightDate.hour} isUnselectedFlightHour={isUnselectedFlightHour}/>\n                        {t('taxi:hour')}\n                        <SelectFlightMinutes value={flightDate} onChange={onChangedFlightDate.minutes} isUnselectedFlightMinutes={isUnselectedFlightMinutes}/>\n                        {t('taxi:minutes')}\n                        {t('taxi:jst')}\n                      </Grid>\n                      {/* ご利用便日時に関するアラート */}\n                      {isUnselectedFlightDate &&\n                        <Alert severity='error' className={classes.alert}>\n                          {invalidFlightDateErrorMessage}\n                        </Alert>\n                      }\n                    </div>\n                  </Grid>\n                </Grid>\n\n                {/* 乗車日時の行。 */}\n                <Grid item container>\n                  <Grid item xs={4} className={classes.tableLeft}>\n                    <Typography className={classes.textItemName}>\n                    {isShonaiAreaTaxi && t('taxi:select_flight').split('\\n').map((s) => {\n                      return (\n                        <div>\n                          {s}\n                        </div>\n                      )\n                    })}\n                    {isKisakataTaxi && t('taxi:share_taxi').split('\\n').map((s) => {\n                      return (\n                        <div>\n                          {s}\n                        </div>\n                      )\n                    })}\n                    {(!isShonaiAreaTaxi && !isKisakataTaxi) &&\n                      <>\n                        {t('taxi:boarding_date')}\n                      </>\n                    }\n                    </Typography>\n                  </Grid>\n                  <Grid item xs={8} className={classes.contents}>\n                    <div>\n                      <span>\n                        <SelectYear value={ridingDate} onChange={onChangedRidingYear}/>\n                        {t('taxi:year')}\n                        <SelectMonth value={ridingDate} onChange={onChangedRidingMonth}/>\n                        {t('taxi:month')}\n                        <SelectDay value={ridingDate} onChange={onChangedRidingDay}/>\n                        {t('taxi:day')}\n                      </span>\n\n                      {isShonaiAreaTaxi ? (\n                        <span>\n                          <SelectFlight\n                            flightPattern={flightPattern}\n                            onChange={onChangedRidingFlight}\n                            selectFlightData={selectFlightData}\n                          />\n                          {t('taxi:flight_after')}\n                          {t('taxi:connect_taxi')}\n                        </span>\n                      ):(\n                        <>\n                          {/** 任意に時刻を選べる場合 */}\n                          {timePattern === TaxiTimePattern.normal &&\n                            <span>\n                              <SelectHour value={ridingDate} onChange={onChangedRidingHour}/>\n                              {t('taxi:hour')}\n                              <SelectMinutes value={ridingDate} onChange={onChangedRidingMinutes}/>\n                              {t('taxi:minutes')}\n                            </span>\n                          }\n                          {/** 選択肢より時刻を選べる場合 */}\n                          {timePattern === TaxiTimePattern.pulldown &&\n                            <SelectHourAndMinutesPulldown\n                              value={ridingDate}\n                              onChange={onChangedRidingHourAndMinutes}\n                              selectTimeList={selectTimeList}\n                              isUnselectedRidingDate={isUnselectedRidingDate}\n                            />\n                          }\n                          <span>\n                          {t(isKisakataTaxi ? 'taxi:dep_taxi' : 'taxi:jst')}\n                          </span>\n                        </>\n                      )}\n                    </div>\n                    {/* 予約期限を過ぎている場合の警告。 */}\n                    { isOverDeadline &&\n                        <Alert severity='error' className={classes.alert}>\n                          {invalidFlightErrorMessage}\n                        </Alert>\n                    }\n                    {/* タクシー乗車に関する注意事項 */}\n                    {(!isShonaiAreaTaxi && !isKisakataTaxi) &&\n                      <Typography color='error' className={classes.supplement}>\n                        {t('taxi:congestion_notice_1')}\n                        <br />\n                        &ensp;{t('taxi:congestion_notice_2')}\n                      </Typography>\n                    }\n                    {/* 象潟合同交通かつfrom空港の場合 */}\n                    {(isKisakataTaxi && !toAirport) &&\n                      <Typography color='error' className={classes.supplement}>\n                        {t('taxi:kisakata_notice_1').split('\\n').map((s) => {\n                          return (\n                            <div>\n                              {s}\n                            </div>\n                          )\n                        })}\n                      </Typography>\n                    }\n                    {/* 象潟合同交通かつto空港の場合 */}\n                    {(isKisakataTaxi && toAirport) &&\n                      <Typography color='error' className={classes.supplement}>\n                        {t('taxi:kisakata_notice_2')}\n                      </Typography>\n                    }\n                    {/* 酒田第一タクシーかつto空港の場合 */}\n                    {(toAirport && taxiCompany === TaxiCompanyList.sakataNo1Taxi) &&\n                      <Typography color='error' className={classes.supplement}>\n                        {t('taxi:congestion_notice_3')}\n                        <br />\n                        {t('taxi:congestion_notice_4')}\n                      </Typography>\n                    }\n                    {/* 庄交ハイヤーかつto空港の場合 */}\n                    {(toAirport && taxiCompany === TaxiCompanyList.shokoHire) &&\n                      <Typography color='error' className={classes.supplement}>\n                        {t('taxi:congestion_notice_3')}\n                        <br />\n                        {t('taxi:congestion_notice_5')}\n                      </Typography>\n                    }\n                    {/* 酒田第一タクシーかつfrom空港の場合 */}\n                    {(!toAirport && taxiCompany === TaxiCompanyList.sakataNo1Taxi) &&\n                      <Typography color='error' className={classes.supplement}>\n                        {t('taxi:congestion_notice_6')}\n                        <br />\n                        {t('taxi:congestion_notice_7')}\n                      </Typography>\n                    }\n                    {/* 庄交ハイヤーかつfrom空港の場合 */}\n                    {(!toAirport && taxiCompany === TaxiCompanyList.shokoHire) &&\n                      <Typography color='error' className={classes.supplement}>\n                        {t('taxi:congestion_notice_6')}\n                        <br />\n                        {t('taxi:congestion_notice_8')}\n                        <br />\n                        {t('taxi:congestion_notice_7')}\n                      </Typography>\n                    }\n                    {/** 対応便が選択されていないときのアラート */}\n                    {invalidFlightPattern &&\n                      <Alert severity=\"error\">\n                        乗合タクシーの接続便を選択してください\n                      </Alert>\n                    }\n                  </Grid>\n                </Grid>\n\n                {/* メールアドレスの行。 */}\n                <Grid item container>\n                  <Grid item xs={4} className={classes.tableLeft}>\n                    <Typography className={classes.textItemName}>\n                      {t('taxi:mail_address')}\n                    </Typography>\n                  </Grid>\n                  <Grid item xs={8}>\n                    <div className={classes.contents}>\n                      <TextField\n                        variant='outlined'\n                        placeholder={t('taxi:email_example')}\n                        value={email}\n                        onChange={onChangedEmail}\n                        error={hasErrorInEmail}\n                        helperText={getEmailHelperLabel()}\n                        fullWidth\n                        inputProps={{\n                          style: {\n                            padding: '3px',\n                            fontSize: '1rem'\n                          }\n                        }}\n                      />\n                    </div>\n                  </Grid>\n                </Grid>\n                {/* dev/stg環境のみ表示するチェックボックス。 */}\n                { (Environment.isDev(env) || Environment.isStaging(env)) &&\n                  <Grid item container>\n                    <Grid item xs={4} className={classes.tableLeft}>\n                      <Typography className={classes.textItemName}>\n                        reCAPTCHA v2で認証する<br/>\n                        ※開発・ステージング環境のみ表示\n                      </Typography>\n                    </Grid>\n                    <Grid item xs={8}>\n                      <div className={classes.contents}>\n                        <FormControlLabel\n                          control={\n                            <Checkbox\n                              checked={useRecaptchaV2}\n                              onChange={(event) => dispatch(switchUseV2(event.target.checked))}\n                            />\n                          }\n                          label=\"reCAPTCHA v2で認証する\"\n                        />\n                      </div>\n                    </Grid>\n                  </Grid>\n                }\n                <Grid item>\n                  {/* 対象エリアの場合は所要時間・距離・料金を表示する。 */}\n                  { (isShowTaxiFeeArea() && isSubjectArea) &&\n                    <Cost label={\n                      <span data-cy=\"booking_taxi_cost_area\">\n                        { costLabel() }\n                        {/* モバイルサイズ(画面幅960px未満)の場合は改行を入れる。 */}\n                        { isMobileSize && <br /> }\n                        {/* デスクトップサイズ(画面幅960px以上)の場合は空白を入れる。 */}\n                        { !isMobileSize && <>&nbsp;</> }\n                        { feeLabel }\n                        {/** 注意書きがある場合には全て表示する */}\n                        { (notesLabel && notesLabel.length > 0) &&\n                          <span data-cy=\"booking_taxi_notes_area\">\n                            {notesLabel.map((label, index)=>{\n                              return (\n                                <span key={index}>\n                                  <br/>\n                                  <span>{label}</span>\n                                </span>\n                              )\n                            })}\n                          </span>\n                        }\n                      </span>\n                      }\n                    />\n                  }\n                  {/* 対象エリア外の場合は固定のメッセージを表示する。 */}\n                  { (isShowTaxiFeeArea() && !isSubjectArea) &&\n                    <Cost label={t('taxi:notice_outside_target_area')} />\n                  }\n                  {/* タクシー料金APIに金額を問い合わせ中の時 */}\n                  { !isEndCallTaxiAPI &&\n                    <Cost label={\n                      <CircularProgress color='primary' size={48}/>\n                    }/>\n                  }\n                  {/* タクシー料金APIから結果が得られなかった時 */}\n                  { isFailCallTaxiAPI &&\n                    <Cost label={t('taxi:notice_fail_get_fee')} />\n                  }\n                </Grid>\n                {/* 警告を表示する行。 */}\n                <Grid item>\n                  {/* 予約に失敗した場合はその旨の警告を表示する。 */}\n                  { isFailed && <AlertInReservation type='fail'/> }\n                  { isRequiredRetry && <AlertInReservation type='retry'/> }\n                  { isUnavalableEmail && <AlertInReservation type='email'/> }\n                  {/* reCAPTCHA v2でのリトライを促す場合の警告。 */}\n                  { (isSubmitted && needRetryRecaptcha) && <AlertInReservation type='retry_with_v2' /> }\n                  { (hasErrorInEmail || hasErrorInFlight) && <AlertInReservation type='input'/> }\n                  { (isEmptyAddress && errorMessage === '' && !isKisakataTaxi) &&\n                    <AlertInReservation\n                      type='address'\n                      pickupPattern={pickupPattern}\n                    />\n                  }\n                  { (isEmptyAddress && errorMessage === '' && isKisakataTaxi) &&\n                    <AlertInReservation\n                      type='unselected'\n                      pickupPattern={pickupPattern}\n                    />\n                  }\n                  {/** 料金取得APIから任意のアラートResponseが来たときには掲示する */}\n                  { alertLabel.length > 0 &&\n                    <AlertInReservation\n                      anyMessage={alertLabel}\n                    />\n                  }\n                  {/** errorMessageに格納された任意の警告を表示する */}\n                  { errorMessage !== '' &&\n                    <AlertInReservation\n                      anyMessage={\n                        [\n                          {\n                            type: 'alert',\n                            message: errorMessage\n                          }\n                        ]\n                      }\n                    />\n                  }\n                </Grid>\n                {/* 予約するボタンの行。 */}\n                <Grid item>\n                  <ButtonToSubmit onClick={handleClick} disabled={!isAvailableReservation} />\n                </Grid>\n                {/* 注意事項。 */}\n                <Grid item>\n                  <Cautions\n                    isMeterFare={fareType === 'PAYG'}\n                    companyDisplayName={taxiCompanyConf?.temporaryDisplayName || ''}\n                    isSupportAMC={taxiCompanyConf?.supportAMC.includes(airportCode)}\n                    company={taxiCompany}\n                  />\n                </Grid>\n                {/* お問い合わせ先。 */}\n                <Grid item>\n                  <Contact\n                    company={taxiCompany}\n                  />\n                </Grid>\n              </Grid>\n            </Container>\n          }\n          <AirportTransferTaxiFooter tabiCube={tabiCube} />\n        </>\n    </div>\n  );\n}\n\nexport default Booking;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Helmet from 'react-helmet';\n\nimport { makeStyles, Typography, Container, useTheme } from '@material-ui/core';\nimport InfoIcon from '@material-ui/icons/Info';\n\nimport ScrollToTop from '../../../../common/ScrollToTop';\nimport { Link, useLocation } from 'react-router-dom';\nimport URLParams from '../../../../../utils/getParams';\nimport { changeLanguage, isEnglish } from '../../../../../utils/lang';\nimport { isTabiCube } from '../common/TabiCube';\nimport AirportTransferTaxiHeader from '../common/Header';\n\nconst useStyles = makeStyles((theme) => ({\n  guide: {\n    marginTop: 10,\n  },\n  iconInfo: {\n    fontSize: '22px',\n    verticalAlign: 'top',\n  },\n  typography: {\n    marginTop: '10px',\n  },\n  underline: {\n    color: theme.palette.error.main,\n    textDecoration: 'underline',\n  },\n  logoArea: {\n    marginTop: '10px'\n  }\n}));\n\n/** タクシーの仮予約完了後の画面のコンポーネント。 */\nconst Success: React.FC = () => {\n  const { t, i18n } = useTranslation();\n  const theme = useTheme();\n  const classes = useStyles(theme);\n  const location = useLocation();\n\n  // 会社ごとの切り分けが必要になったらコメントアウトを外す\n  const searchParams = new URLParams(location.search);\n  // const company = convertStringToTaxiCompany(searchParams.getStringParam('company') || '' );\n\n  // 言語設定をする\n  changeLanguage(searchParams, i18n);\n  /** 言語設定。 */\n  const lang = i18n.language;\n  /** referrerパラメーターの値。 */\n  const referrer = searchParams.getStringParam('referrer');\n  /** 旅CUBEモードであるかを表すフラグ。 */\n  const tabiCube = isTabiCube(referrer || '');\n  /** ページタイトル。 */\n  const title = tabiCube ? t('tabicube') : t('title');\n\n  /** メールが届かない場合の案内画面ページに渡すパラメーター。 */\n  const params = new URLSearchParams({\n    lang: lang,\n    referrer: referrer === null ? '' : referrer,\n  });\n  /** メールが届かない場合の案内画面ページへのパス。 */\n  const path = `/booking-taxi/unreceived?${params.toString()}`;\n\n  const AutomaticDeliveryNotice: React.FC = () => {\n    if (isEnglish(lang)) {\n      return (\n        <Typography color='error' className={classes.guide}>\n          <InfoIcon color='error' className={classes.iconInfo}/>\n            If the auto generated email is not received, you may also confirm&nbsp;\n          <Link to={path}>\n            <span className={classes.underline}>here.</span>\n          </Link>\n        </Typography>\n      )\n    } else {\n      return (\n        <Typography color='error' className={classes.guide}>\n          <InfoIcon color='error' className={classes.iconInfo}/>\n          自動配信メールが届かないお客様は\n          <Link to={path}>\n            <span className={classes.underline}>こちら</span>\n          </Link>\n          もご確認ください。\n        </Typography>\n      )\n    }\n  }\n\n  return (\n    <div>\n      <Helmet>\n        {/* ページタイトルを設定する。 */}\n        <title>{title}</title>\n        {/* Adobe Analyticsでタクシー予約画面のアクセス数の集計をする。 */}\n        <script type=\"application/javascript\">\n          s.pageName=location.origin+&quot;/booking-taxi/success&quot;;\n          s.t();\n        </script>\n      </Helmet>\n      {/* 画面遷移時に画面トップへ遷移させるためのコンポーネント。 */}\n      <ScrollToTop />\n      {/* ヘッダー部分(常にハイヤー・タクシー予約に統一) */}\n      <AirportTransferTaxiHeader tabiCube={tabiCube} />\n      <Container maxWidth=\"md\">\n        <Typography color='primary' className={classes.typography}>\n          {t('taxi:temporary_reservation_success_string_1')}<br/>\n          {t('taxi:temporary_reservation_success_string_2')}\n        </Typography>\n        <Typography color='error' className={classes.typography}>\n          {tabiCube?\n            <>\n              {t('taxi:temporary_reservation_success_string_4')}\n            </>\n            :\n            <>\n              {t('taxi:temporary_reservation_success_string_3')}\n            </>\n          }\n        </Typography>\n        {/* 自動配信メールが届いていない場合の案内を開くテキスト部分。 */}\n        <AutomaticDeliveryNotice/>\n      </Container>\n    </div>\n  )\n};\n\nexport default Success;\n","import * as React from 'react';\nimport { makeStyles, Typography } from '@material-ui/core';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport { useTranslation } from 'react-i18next';\n\nconst useStyles = makeStyles(() => ({\n  checkBoxIcon: {\n    fontSize: \"22px\",\n    verticalAlign: \"top\",\n  },\n  mainText: {\n    color: \"#000000\",\n  },\n  description: {\n    color: \"#000000\",\n    margin: \"0px 0px 15px 22px\",\n  },\n  text: {\n    fontWeight: \"bold\",\n    margin: \"15px 0px\"\n  },\n  textWithDescription: {\n    fontWeight: \"bold\",\n    marginTop: \"15px\",\n  },\n  underline: {\n    textDecoration: \"underline\",\n  }\n}));\n\n/** 宮交タクシーの予約ページでメールが届かない場合の確認事項。 */\nconst EmailCheckList: React.FC = () => {\n  const classes = useStyles();\n  const { t, i18n } = useTranslation();\n\n  /**\n   * チェックボックスアイコン付きの見出し。\n   * @param text チェックボックスアイコンの右側に表示する文言。\n   * */\n  const headline = (text: string) => {\n    return (\n      <Typography color=\"primary\" className={classes.text}>\n        <CheckBoxIcon color='inherit' className={classes.checkBoxIcon}/>\n        { text }\n      </Typography>\n    );\n  }\n\n  /**\n   * チェックボックスアイコン付きの見出し(詳細部分がついている場合)。\n   * @param text チェックボックスアイコンの右側に表示する文言。\n   * */\n  const headlineWithDescription = (text: string) => {\n    return (\n      <Typography color=\"primary\" className={classes.textWithDescription}>\n        <CheckBoxIcon color='inherit' className={classes.checkBoxIcon}/>\n        { text }\n      </Typography>\n    );\n  }\n\n  return (\n    <div>\n      <Typography className={classes.mainText}>\n        {t('taxi:temporary_reservation_unreceived_string_1')}\n      </Typography>\n      { headline(t('taxi:wrong_mailaddress')) }\n      { headline(t('taxi:in_trash')) }\n      { headline(t('taxi:full_mailbox')) }\n\n      { headlineWithDescription(t('taxi:security_soft_setting')) }\n      <Typography className={classes.description}>\n        {t('taxi:temporary_reservation_unreceived_string_2')}\n      </Typography>\n\n      { headlineWithDescription(t('taxi:provider_setting')) }\n      <Typography className={classes.description}>\n        {t('taxi:temporary_reservation_unreceived_string_3')}\n        {t('taxi:temporary_reservation_unreceived_string_4')}\n        {t('taxi:temporary_reservation_unreceived_string_5')}\n      </Typography>\n\n      { headlineWithDescription(t('taxi:reject_domain')) }\n      { (i18n.language === 'en') &&\n        <Typography className={classes.description}>\n          For this service, emails are sent with (<span className={classes.underline}>{\"@ana-maas-val.jp\"}</span>).<br/>\n          If this domain designation has been rejected, please deactivate the designation rejection.\n        </Typography>\n      }\n      { (i18n.language !== 'en') &&\n        <Typography className={classes.description}>\n          本サービスでは(<span className={classes.underline}>{\"@ana-maas-val.jp\"}</span>)よりメールを送信いたします。<br/>\n          ドメイン指定拒否がされている場合、指定拒否を解除いただくようお願いいたします。\n        </Typography>\n      }\n    </div>\n  );\n}\n\nexport default EmailCheckList;\n","import * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport Helmet from 'react-helmet';\n\nimport { Container, makeStyles } from '@material-ui/core';\n\nimport ScrollToTop from '../../../../common/ScrollToTop';\nimport EmailCheckList from '../../MiyakoTaxi/common/EmailCheckList';\nimport URLParams from '../../../../../utils/getParams';\nimport { changeLanguage } from '../../../../../utils/lang';\nimport { useLocation } from 'react-router-dom';\nimport { isTabiCube } from '../common/TabiCube';\nimport AirportTransferTaxiHeader from '../common/Header';\n\nconst useStyles = makeStyles(() => ({\n  container: {\n    marginTop: 10,\n  },\n}));\n\n/** メールが届かない場合の案内画面のコンポーネント。 */\nconst Unreceived: React.FC = () => {\n  const { t, i18n } = useTranslation();\n  const classes = useStyles();\n  const location = useLocation();\n  const searchParams = new URLParams(location.search);\n  // 言語設定をする\n  changeLanguage(searchParams, i18n);\n  /** referrerパラメーターの値。 */\n  const referrer = searchParams.getStringParam('referrer');\n  /** 旅CUBEモードであるか判定した結果。 */\n  const tabiCube = isTabiCube(referrer || '');\n  /** ページタイトル。 */\n  const title = tabiCube ? t('tabicube') : t('title');\n  return (\n    <div>\n      <Helmet>\n        {/* ページタイトルを設定する。 */}\n        <title>{title}</title>\n        {/* Adobe Analyticsでタクシー予約画面のアクセス数の集計をする。 */}\n        <script type=\"application/javascript\">\n          s.pageName=location.origin+&quot;/booking-taxi/unreceived&quot;;\n          s.t();\n        </script>\n      </Helmet>\n      {/* 画面遷移時に画面トップへ遷移させるためのコンポーネント。 */}\n      <ScrollToTop />\n      {/* ヘッダー。 */}\n      <AirportTransferTaxiHeader tabiCube={tabiCube} />\n      <Container maxWidth=\"md\" className={classes.container}>\n        <EmailCheckList/>\n      </Container>\n    </div>\n  )\n};\n\nexport default Unreceived;\n","import Environment from \"../../utils/environment\";\n\n/**\n * 旅CUBEのURLを取得する。\n * @param searchParams URLパラメーター。(例. ?lang=en)\n * @returns パラメーターを含めた旅CUBEのURL。\n */\nexport function getTabicubeUrl(searchParams: string) {\n  /** 環境変数で指定された環境種別を識別するための値。 */\n  const env = process.env['REACT_APP_STAGE_ENV'] || '';\n  // 本番環境の場合は本番環境用URLを、それ以外の場合はステージング環境URLを返却する。\n  return Environment.isProduction(env) ?\n    getTabicubeProductionUrl(searchParams) :\n    getTabicubeStagingUrl(searchParams);\n}\n\n/**\n * 旅CUBEの本番環境URLを取得する。\n * @param searchParams URLパラメーター。(例. ?lang=en)\n * @returns パラメーターを含めた本番環境の旅CUBEのURL。\n */\nexport function getTabicubeProductionUrl(searchParams: string) {\n  return `https://tabicube.com${searchParams}`;\n}\n\n/**\n * 旅CUBEのステージング環境URLを取得する。\n * @param searchParams URLパラメーター。(例. ?lang=en)\n * @returns パラメーターを含めたステージング環境の旅CUBEのURL。\n */\nexport function getTabicubeStagingUrl(searchParams: string) {\n  return `https://stg.tabicube.com${searchParams}`;\n}\n\n/**\n * 現在表示しているパスがそらたび(/public以下のパス)であるかを判定する。\n * @param pathname 表示しているページのパス名。\n * @returns 現在表示しているパスがそらたび(/public以下のパス)であるかを判定した結果。\n */\nexport function isSoratabi(pathname: string) {\n  return pathname.includes('/public');\n}\n\n/**\n * そらたびの場合にURLパラメーターを整形する。\n * @param searchParams URLパラメーター部分の文字列。\n * @returns 整形後のURLパラメーター。\n */\nexport function modifySoratabiParams(searchParams: string) {\n  const params = new URLSearchParams(searchParams);\n  // 必ず「referrer=aswdms」を追加する。\n  params.set('referrer', 'aswdms');\n  return `?${params.toString()}`;\n}\n\n/**\n * 広島空港連携の場合にURLパラメーターを整形する。\n * @param searchParams URLパラメーター部分の文字列。\n * @returns 整形後のURLパラメーター。\n */\nexport function modifyHiroshimaParams(searchParams: string) {\n  const params = new URLSearchParams(searchParams);\n  /** stdパラメーターの値。 */\n  const std = params.get('std');\n  /** staパラメーターの値。 */\n  const sta = params.get('sta');\n  // stdパラメーターに年月日のみ設定されている場合、時刻を追加する。\n  if (std !== null && hasNotTime(std)) {\n    /** 日付に時刻(午前0時)を追加した値。 */\n    const added = add0am(std);\n    params.set('std', added);\n  }\n  // staパラメーターに年月日のみ設定されている場合、時刻を追加する。\n  if (sta !== null && hasNotTime(sta)) {\n    /** 日付に時刻(午前1時)を追加した値。 */\n    const added = add1am(sta);\n    params.set('sta', added);\n  }\n  return `?${params.toString()}`;\n\n}\n\n/**\n * URLパラメーターから広島連携であるかを判定する。\n * @param searchParams URLパラメーター。\n * @returns URLパラメーターから広島連携であるかを判定した結果。\n */\nexport function isHiroshimaAirport(searchParams: string) {\n  return searchParams.includes('referrer=hijapo');\n}\n\n/**\n * 時刻が未設定(数字8ケタの値)であるかを判定する。\n * @param value 判定したい文字列。\n * @returns 時刻が未設定であるか判定した結果。\n */\nexport function hasNotTime(value: string) {\n  const regexp = RegExp(/^\\d{8}$/);\n  return regexp.test(value);\n}\n\n/**\n * yyyyMMdd形式の年月日にHHmm形式の午前0時を追加する。\n * @param value 年月日の文字列。\n * @returns yyyyMMddHHmm形式の日時の文字列。\n */\nexport function add0am(value: string) {\n  return value.concat('0000');\n}\n\n/**\n * yyyyMMdd形式の年月日にHHmm形式の午前1時を追加する。\n * @param value 年月日の文字列。\n * @returns yyyyMMddHHmm形式の日時の文字列。\n */\nexport function add1am(value: string) {\n  return value.concat('0100');\n}\n","import React from \"react\";\nimport { useLocation } from \"react-router-dom\";\nimport { getTabicubeUrl, isHiroshimaAirport, isSoratabi, modifyHiroshimaParams, modifySoratabiParams } from \"./util\";\n\n/** 旅CUBEへリダイレクトさせるためのコンポーネント。 */\nexport const LinkToTabicube: React.FC = () => {\n  const location = useLocation();\n  /** 現在表示しているページのパス名。 */\n  const pathname = location.pathname;\n  /** URLパラメーター部分の文字列。 */\n  let params = location.search;\n  // そらたびページの場合、パラメーターを整形する。\n  if (isSoratabi(pathname)) {\n    params = modifySoratabiParams(params);\n  }\n  // 広島空港連携の場合、発着日時のパラメーターを整形する。\n  if (isHiroshimaAirport(params)) {\n    params = modifyHiroshimaParams(params);\n  }\n  /** リダイレクト先の旅CUBEのURL。 */\n  let tabiCubeUrl = getTabicubeUrl(params);\n  window.location.href = tabiCubeUrl;\n  return null;\n}\n\nexport default LinkToTabicube;\n","import React from 'react';\nimport { History } from 'history';\nimport { ConnectedRouter } from 'connected-react-router';\nimport { Route, Switch } from 'react-router-dom';\nimport BookingContainer from './containers/bookingContainer';\nimport NotFound from './components/NotFound';\nimport './App.css';\n\nimport { anaTheme } from './themes/ana';\nimport { universalMaaS } from './themes/universalMaaS';\nimport { ThemeProvider } from '@material-ui/core';\nimport Helmet from 'react-helmet';\nimport Path from './utils/path';\nimport BookingTaxi from './components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation';\nimport SuccessBookingTaxi from './components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Success';\nimport Unreceived from './components/ad/OtherServices/AirportTransferTaxi/TemporaryReservation/Unreceived';\nimport LinkToTabicube from './components/LinkToTabicube';\n\ninterface AppProps {\n  history: History;\n}\n\nconst App: React.FC<AppProps> = ({ history }: AppProps) => {\n  /** 適用するTheme。 */\n  // Publicモードの場合はUniversal MaaS、それ以外(Closedモード)の場合はClosedモード用のThemeを適用する。\n  const theme = Path.isPublic(window.location.pathname) ? universalMaaS : anaTheme;\n  return (\n    <div className=\"App\">\n      <Helmet>\n        <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\"/>\n        <link href=\"https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@300;400;700&display=swap\" rel=\"stylesheet\"/>\n      </Helmet>\n      <ConnectedRouter history={history}>\n        <ThemeProvider theme={theme}>\n          <Switch>\n            {/* 空港アクセスナビ・そらたびのパス(旅CUBEにリダイレクトする)。 */}\n            <Route path=\"/\" exact component={LinkToTabicube} />\n            <Route path=\"/search\" exact component={LinkToTabicube} />\n            <Route path=\"/result\" exact component={LinkToTabicube} />\n            <Route path=\"/summary\" exact component={LinkToTabicube} />\n            <Route path=\"/public\" exact component={LinkToTabicube} />\n            <Route path=\"/public/summary\" exact component={LinkToTabicube} />\n            <Route path=\"/public/result\" exact component={LinkToTabicube} />\n            {/* タクシー予約に関するパス。 */}\n            <Route path=\"/booking\" exact component={BookingContainer} />\n            <Route path=\"/booking-taxi\" exact component={BookingTaxi} />\n            <Route path=\"/booking-taxi/success\" exact component={SuccessBookingTaxi} />\n            <Route path=\"/booking-taxi/unreceived\" exact component={Unreceived}/>\n            {/* 404ページ。 */}\n            <Route path=\"/404\" exact component={NotFound} />\n            <Route component={NotFound} />\n          </Switch>\n        </ThemeProvider>\n      </ConnectedRouter>\n    </div>\n  );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === 'localhost' ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === '[::1]' ||\n    // 127.0.0.0/8 are considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n    )\n);\n\ntype Config = {\n  onSuccess?: (registration: ServiceWorkerRegistration) => void;\n  onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(\n      process.env.PUBLIC_URL,\n      window.location.href\n    );\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener('load', () => {\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.log(\n            'This web app is being served cache-first by a service ' +\n              'worker. To learn more, visit https://bit.ly/CRA-PWA'\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then(registration => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === 'installed') {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n              console.log(\n                'New content is available and will be used when all ' +\n                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n              console.log('Content is cached for offline use.');\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch(error => {\n      console.error('Error during service worker registration:', error);\n    });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: { 'Service-Worker': 'script' }\n  })\n    .then(response => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get('content-type');\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf('javascript') === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then(registration => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch(() => {\n      console.log(\n        'No internet connection found. App is running in offline mode.'\n      );\n    });\n}\n\nexport function unregister() {\n  if ('serviceWorker' in navigator) {\n    navigator.serviceWorker.ready.then(registration => {\n      registration.unregister();\n    });\n  }\n}\n","import i18n from 'i18next';\nimport enTranslation from './locales/en/translation.json';\nimport enSearch from './locales/en/search.json';\nimport enAd from './locales/en/ad.json';\nimport enAirdo from './locales/en/airdo.json';\nimport enOtherAirlines from './locales/en/other_airlines.json';\nimport enTaxi from './locales/en/taxi.json';\nimport jaTranslation from './locales/ja/translation.json';\nimport jaSearch from './locales/ja/search.json';\nimport jaAd from './locales/ja/ad.json';\nimport jaAirdo from './locales/ja/airdo.json';\nimport jaOtherAirlines from './locales/ja/other_airlines.json';\nimport jaTaxi from './locales/ja/taxi.json';\nimport {initReactI18next} from 'react-i18next';\n\nconst resources = {\n  en: {\n    translation: enTranslation,\n    search: enSearch,\n    ad: enAd,\n    airdo: enAirdo,\n    otherAirlines: enOtherAirlines,\n    taxi: enTaxi\n  },\n  ja: {\n    translation: jaTranslation,\n    search: jaSearch,\n    ad: jaAd,\n    airdo: jaAirdo,\n    otherAirlines: jaOtherAirlines,\n    taxi: jaTaxi\n  },\n};\n\ni18n\n  .use(initReactI18next)\n  .init({\n    lng: 'ja',\n    ns: ['translation', 'search', 'ad', 'taxi', 'airdo' ],\n    defaultNS: 'translation',\n    fallbackLng: 'ja',\n    debug: true,\n\n    interpolation: {\n      escapeValue: false,\n    },\n\n    react: {\n      wait: true,\n    },\n    resources: resources,\n  });\n\nexport default i18n;\n","import axios from 'axios';\nimport differenceInDays from 'date-fns/differenceInDays';\nimport format from 'date-fns/format'\nimport { Lang } from '../../states/query';\nimport Airlines, { AirlineList } from '../../utils/Airlines';\nimport Environment from '../../utils/environment';\nimport { Flight } from './models';\nimport FlightInfo from './models/flightInfo';\nimport DateTime from '../../utils/dateTime';\n\ninterface FlightOptions {\n  /** インクリメンタルサーチでのフライト情報取得であるかを表すフラグ。 */\n  isIncrementalSearch?: boolean;\n  /** 言語設定。 */\n  language?: string;\n  /** 航空会社コード。 */\n  airline?: string;\n}\n\n/** 運航情報を取得する際のオプションのデフォルト値。 */\nconst defaultFlightOptions: FlightOptions = {\n  /** インクリメンタルサーチでのフライト情報取得であるかを表すフラグ。 */\n  // デフォルトでは通常(インクリメンタルサーチ)ではないリクエストとする。\n  isIncrementalSearch: false,\n  /** 言語設定。 */\n  // デフォルトでは日本語とする。\n  language: Lang.ja,\n  /** 航空会社コード。 */\n  // デフォルトではANAの航空会社コード(NH)とする。\n  airline: Airlines.getAirlineCode('ANA')\n}\n\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: process.env['REACT_APP_API_ENDPOINT'] as string,\n  timeout: 7000,\n};\n\nexport const getFlightFactory = (optionConfig?: ApiConfig) => {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n\n  /**\n   * ANA APIから運航情報を取得する。\n   * @param flightNumber 便番号。(数字部分のみ)\n   * @param flightDate 搭乗日。\n   * @param options オプション。\n   * @returns 指定した搭乗日の便の運航情報。\n   */\n  const getFlight = async (flightNumber: string, flightDate: Date, options?: FlightOptions, targetAirLine: AirlineList = 'ANA') => {\n    let domDate, intDate;\n    /** 国内線であることを表すフラグ。(日付が検索対象外の場合にのみ利用。) */\n    let isDomestic = true;\n    /** 国際線であるかを判別するためにANA APIから取得した情報を格納する。(日付が検索対象外の場合にのみ利用。) */\n    let flightForCheckIsInternational: Flight;\n    let flight: FlightInfo;\n    /** インクリメンタルサーチ上でリクエストするかを表すフラグ。 */\n    const isIncrementalSearch = (options && options.isIncrementalSearch) ? options.isIncrementalSearch : defaultFlightOptions.isIncrementalSearch;\n    /** 言語設定。 */\n    const language = (options && options.language) ? options.language : defaultFlightOptions.language;\n    /** 航空会社コード。 */\n    const airline = (options && options.airline) ? options.airline : defaultFlightOptions.airline;\n    // リクエストパラメーター。\n    const params = {\n      'flightNumber': flightNumber,\n      'language': language,\n      'airline': airline,\n    };\n    const now = new Date();\n    // あとで見直す(2019/12/23現在)\n    // eslint-disable-next-line no-useless-catch\n    try {\n      if(isIncrementalSearch){\n        domDate = differenceInDays(flightDate, now) > 0 ? DateTime.JSTFormat(now, 'yyyy-MM-dd') : DateTime.JSTFormat(flightDate, 'yyyy-MM-dd');\n      } else {\n        domDate = DateTime.JSTFormat(flightDate, 'yyyy-MM-dd');\n      }\n      let response = await instance.get(`/flight`, { params :{ ...params, date: domDate }} );\n      if (response.status !== 200) {\n        throw new Error('Server Error');\n      }\n\n      let flightInfo: Flight = response.data;\n      // 存在しない場合は国際線として扱う。\n      switch(flightInfo.result.code){\n        // 正常時\n        case '0000':\n          return new FlightInfo(flightInfo, flightDate, language, targetAirLine);\n        // 国際線の場合\n        case '0409':\n          if(isIncrementalSearch){\n            intDate = differenceInDays(flightDate, now) > 1 ? DateTime.JSTFormat(now, 'yyyy-MM-dd') : DateTime.JSTFormat(flightDate, 'yyyy-MM-dd');\n          } else {\n            intDate = DateTime.JSTFormat(flightDate, 'yyyy-MM-dd');\n          }\n          response = await instance.get(`/flight`, {\n            params: { ...params, international: 'Y', date: intDate }\n          });\n          flightInfo = response.data;\n          if(flightInfo.result.code === '0000') {\n            const intFlight = new FlightInfo(flightInfo, flightDate, language, targetAirLine);\n            // 国内線フラグのみを更新する。\n            intFlight.setIsDomestic(false);\n            return intFlight;\n          }\n          // 国際便として再検索しても正常な結果が得られない場合\n          else {\n            const env = process.env['REACT_APP_STAGE_ENV'] || '';\n            if(Environment.isDev(env)) {\n              console.error(flightInfo.result);\n            }\n            throw new Error('対象便の情報が取得できませんでした');\n          }\n        // 日付が検索対象期間外の場合。\n        case '0407':\n          // 国際線であるかを判別するために、当日日付で国際線APIにリクエストする。\n          // (この処理がない場合、常に国内線として扱われるため。)\n          intDate = DateTime.JSTFormat(now, 'yyyy-MM-dd');\n          response = await instance.get(`/flight`, {\n            params: { ...params, international: 'Y', date: intDate }\n          });\n          // 国際線か判別するための変数に格納する。\n          flightForCheckIsInternational = response.data;\n          // 正常に国際線APIから情報を取得できた場合は国内線フラグをfalseにする。(国際線として扱う。)\n          if (flightForCheckIsInternational.result.code === '0000') { isDomestic = false; }\n          // 元の日付が検索対象期間外の場合のレスポンスでインスタンスを作成する。\n          flight = new FlightInfo(flightInfo, flightDate, language, targetAirLine);\n          // 国内線フラグのみを更新する。\n          flight.setIsDomestic(isDomestic);\n          return flight;\n        default:\n          throw new Error('ANA APIからの返却値が想定外です');\n      }\n    } catch (err) {\n      throw err;\n    }\n  };\n\n  return getFlight;\n};\n","import axios from 'axios';\nimport Environment from '../../utils/environment';\n\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: process.env['REACT_APP_API_ENDPOINT'] as string,\n  timeout: 7000,\n};\n\nexport interface datalakeBusFormat {\n  input_date: string,\n  input_time: string,\n  input_station_code: string,\n  input_line_code: string,\n  course_index: number,\n  line_index: number,\n  gpcd?: string;\n  rocd?: string;\n  dtym?: string;\n  dtdd?: string;\n  bncd?: string;\n  bscd?: string;\n  stationTable?: { [key: string]: string; };\n}\n\nexport const getDatalakeFactory = (optionConfig?: ApiConfig) => {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n\n  const getDatalake = async (datalakeData: datalakeBusFormat[]) => {\n    const params = {\n      data: datalakeData,\n      isCacheClear: 'false'\n    };\n    // staging環境以上なら工房連携エンドポイントはprodを参照する\n    const env: string = process.env['REACT_APP_STAGE_ENV'] || '';\n    const pathList = {\n      'dev': '/kobotable/staging/',\n      'prod': '/kobotable//'\n    }\n    const path = Environment.isUpperStaging(env)? pathList.prod: pathList.dev;\n    try {\n      let response = await instance.post(path, params);\n  \n      // ステータスコードが200ではない場合。\n      if (response.status !== 200) {\n        throw new Error('Server Error');\n      }\n  \n      return response;\n    } catch (err) {\n      throw err;\n    }\n  }\n  return getDatalake;\n}\n\nexport const getDatalakeAllowBusListFactory = (optionConfig?: ApiConfig) => {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n  const getDatalakeAllowBusList = async () => {\n    // staging環境以上なら工房連携の許可リストはprodを参照する\n    const env: string = process.env['REACT_APP_STAGE_ENV'] || '';\n    const pathList = {\n      'dev': '/kobotable/allowedbuslist/dev',\n      'prod': '/kobotable/allowedbuslist/'\n    }\n    const path = Environment.isUpperStaging(env)? pathList.prod: pathList.dev;\n    try {\n      let response = await instance.get(path);\n      // ステータスコードが200ではない場合。\n      if (response.status !== 200) {\n        throw new Error('Server Error');\n      }\n      return response.data.body;\n    } catch (err) {\n      throw err;\n    }\n  }\n  return getDatalakeAllowBusList;\n}\n\nexport const getOkinawaBusStopListFactory = (optionConfig?: ApiConfig) => {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n  const getOkinawaBusStopList = async () => {\n    const env: string = process.env['REACT_APP_STAGE_ENV'] || '';\n    const pathList = {\n      'dev': '/kobotable/okinawabusstoplist/dev',\n      'prod': '/kobotable/okinawabusstoplist/'\n    }\n    // staging環境以上なら本番環境エンドポイントを指す\n    const path = Environment.isUpperStaging(env)? pathList.prod: pathList.dev;\n    try {\n      let response = await instance.get(path);\n      // ステータスコードが200ではない場合。\n      if (response.status !== 200) {\n        throw new Error('Server Error');\n      }\n      return response.data.body;\n    } catch (err) {\n      throw err;\n    }\n  }\n  return getOkinawaBusStopList;\n}\n\n// TODO: 後で getDatalakeAllowBusListFactory で取得した値をReduxに保存して使うようにし、\n// こちらの関数は削除する。\nexport const getDatalakeAllowBusList = async (optionConfig?: ApiConfig) => {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n  // staging環境以上なら工房連携の許可リストはprodを参照する\n  const env: string = process.env['REACT_APP_STAGE_ENV'] || '';\n  const pathList = {\n    'dev': '/kobotable/allowedbuslist/dev',\n    'prod': '/kobotable/allowedbuslist/'\n  }\n  const path = Environment.isUpperStaging(env)? pathList.prod: pathList.dev;\n  try {\n    let response = await instance.get(path);\n    // ステータスコードが200ではない場合。\n    if (response.status !== 200) {\n      throw new Error('Server Error');\n    }\n    return response.data.body;\n  } catch (err) {\n    throw err;\n  }\n}","// 各空港の出口から各公共交通機関の所要時間を設定した地点。\nexport const ExitToStations: { [key: string]: any; } = {\n  'ja': {\n    // 羽田空港第1ターミナル\n    'HND_1': 'P-出口-29509,22911,29511,51649-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 羽田空港第2ターミナル\n    'HND_2' : 'P-出口-29510,22911,29512,52106-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 羽田空港第3ターミナル\n    'HND_3' : 'P-出口-29672,305577,51650,29671-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 成田空港(第1ターミナル)\n    'NRT' : 'P-出口-22392,29573-0,0--徒歩,徒歩--0----',\n    // 成田空港(第3ターミナル)\n    'NRT_3': 'P-出口-304034,22267,29574-0,15,15--徒歩,徒歩,徒歩--0----',\n\n    // 以下はダミーデータ(2020/01/14現在。)\n    // 稚内空港\n    'WKJ': 'P-出口-307111-0--徒歩--0----',\n    // 利尻空港\n    'RIS': 'P-出口-307459-0--徒歩--0----',\n    // オホーツク紋別空港\n    'MBE': 'P-出口-307346-0--徒歩--0----',\n    // 女満別空港\n    'MMB': 'P-出口-307110-0--徒歩--0----',\n    // 根室中標津空港\n    'SHB': 'P-出口-307112-0--徒歩--0----',\n    // 旭川空港\n    'AKJ': 'P-出口-307115-0--徒歩--0----',\n    // 釧路空港\n    'KUH': 'P-出口-307113-0--徒歩--0----',\n    // 帯広空港\n    'OBO': 'P-出口-307114-0--徒歩--0----',\n    // 新千歳空港(国内線)\n    'CTS_DOM': 'P-出口-20274,649323,1053276,307066-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----', \n    // 新千歳空港(国際線)\n    'CTS_INT': 'P-出口-20274,1053277,307066,649386-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 函館空港\n    'HKD': 'P-出口-307116,1053990-0,0--徒歩,徒歩--0----',\n    // 青森空港\n    'AOJ': 'P-出口-307117,611348,1165006-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 大館能代空港\n    'ONJ': 'P-出口-307157-0--徒歩--0----',\n    // 秋田空港\n    'AXT': 'P-出口-307119-0--徒歩--0----',\n    // 庄内空港\n    'SYO': 'P-出口-307120-0--徒歩--0----',\n    // 仙台空港\n    'SDJ': 'P-出口-29549,307145,1068016-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 新潟空港\n    'KIJ': 'P-出口-307148,834434-0,0--徒歩,徒歩--0----',\n    // 福島空港\n    'FKS': 'P-出口-307147-0--徒歩--0----',\n    // 八丈島空港\n    'HAC': 'P-出口-406013-0--徒歩--0----',\n    // 静岡空港\n    'FSZ': 'P-出口-307486-0--徒歩--0----',\n    // 中部国際空港\n    'NGO': 'P-出口-29529,319195,307162-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 伊丹空港\n    'ITM' : 'P-出口-307124,29175-0,0--徒歩,徒歩--0----',\n    // 関西空港(大阪)\n    'KIX': 'P-出口-25891,307150,29098,307172-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 神戸空港\n    'UKB': 'P-出口-29559,305569,257162,29576-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 徳島空港\n    'TKS': 'P-出口-307132,797701-0,0--徒歩,徒歩--0----',\n    // 高松空港\n    'TAK': 'P-出口-307133-0--徒歩--0----',\n    // 岡山空港\n    'OKJ': 'P-出口-304172-0--徒歩--0----',\n    // 高知空港\n    'KCZ': 'P-出口-307134-0--徒歩--0----',\n    // 松山空港\n    'MYJ': 'P-出口-304557-0--徒歩--0----',\n    // 広島空港\n    'HIJ': 'P-出口-307130,994333-0,0--徒歩,徒歩--0----',\n    // 岩国空港\n    'IWK': 'P-出口-309198-0--徒歩--0----',\n    // 富山空港\n    'TOY': 'P-出口-307122,1033582-0,0--徒歩,徒歩--0----',\n    // 能登空港\n    'NTQ': 'P-出口-307159-0--徒歩--0----',\n    // 小松空港\n    'KMQ': 'P-出口-307123-0--徒歩--0----',\n    // 鳥取空港\n    'TTJ': 'P-出口-307126-0--徒歩--0----',\n    // 米子空港\n    'YGJ': 'P-出口-26855,307127-0,0--徒歩,徒歩--0----',\n    // 萩・石見空港\n    'IWJ': 'P-出口-307143-0--徒歩--0----',\n    // 山口宇部空港\n    'UBJ': 'P-出口-307131,822966,27487-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 北九州空港\n    'KKJ': 'P-出口-307136,673337-0,0--徒歩,徒歩--0----',\n    // 対馬空港\n    'TSJ': 'P-出口-29119-0--徒歩--0----',\n    // 壱岐空港\n    'IKI': 'P-出口-307500-0--徒歩--0----',\n    // 福岡空港(ターミナルが未確定の日付の場合に利用する。)\n    'FUK_DOM': 'P-出口-28304,306294,304559-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 福岡空港(国内線北ターミナル)\n    'FUK_DOM_NORTH': 'P-出口(北)-28304,304559,675189-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 福岡空港(国内線南ターミナル)\n    'FUK_DOM_SOUTH': 'P-出口(南)-28304,304559,675185-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 福岡空港(国際線ターミナル)\n    'FUK_INT': 'P-出口(国際)-306294,675186-0,0--徒歩,徒歩--0----',\n    // 長崎空港\n    'NGS': 'P-出口-319126,307139,815800,865041-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 五島福江空港\n    'FUJ': 'P-出口-五島福江空港-0--徒歩--0----',\n    // 佐賀空港\n    'HSG': 'P-出口-307158,1163127-0,0--徒歩,徒歩--0----',\n    // 熊本空港\n    'KMJ': 'P-出口-307138-0--徒歩--0----',\n    // 鹿児島空港\n    'KOJ': 'P-出口-307142,1117457,585719,304489-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 宮崎空港\n    'KMI': 'P-出口-28904,307141,453417-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 大分空港\n    'OIT': 'P-出口-307140,877746-0,0--徒歩,徒歩--0----',\n    // 那覇空港(国内線ターミナル)\n    'OKA_DOM': 'P-出口-29031,112259,1126026-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 那覇空港(国際線ターミナル)\n    'OKA_INT': 'P-出口-29031,112258,1126027-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 宮古空港\n    'MMY': 'P-出口-307497,1198940-0,0--徒歩,徒歩--0----',\n    // 石垣空港\n    'ISG': 'P-出口-307315-0--徒歩--0----',\n    // 天草空港\n    'AXJ': 'P-出口-307503-0--徒歩--0----',\n    // 種子島空港\n    'TNE': 'P-出口-307493-0--徒歩--0----',\n    // 屋久島空港(バス停なし)\n    'KUM': 'P-出口-29122-0--徒歩--0----',\n    // 与論空港(バス停なし)\n    'RNJ': 'P-出口-29125-0--徒歩--0----',\n    // 喜界空港(バス停なし)\n    'KKX': 'P-出口-29128-0--徒歩--0----',\n    // 沖永良部空港\n    'OKE': 'P-出口-307470-0--徒歩--0----',\n    // 奄美空港\n    'ASJ': 'P-出口-307474-0--徒歩--0----',\n    // 徳之島空港\n    'TKN': 'P-出口-307471-0--徒歩--0----'\n  },\n  'en': {\n     // 羽田空港第1ターミナル\n    'HND_1': 'P-exit-29509,22911,29511,51649-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 羽田空港第2ターミナル\n    'HND_2' : 'P-exit-29510,22911,29512,52106-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 羽田空港第3ターミナル\n    'HND_3' : 'P-exit-29672,305577,51650,29671-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 成田空港(第1ターミナル)\n    'NRT' : 'P-exit-22392,29573-0,0--Walk,Walk--0----',\n    // 成田空港(第3ターミナル)\n    'NRT_3': 'P-出口-304034,22267,29574-0,15,15--Walk,Walk,Walk--0----',\n\n    // 以下はダミーデータ(2020/01/14現在。)\n    // 稚内空港\n    'WKJ': 'P-exit-307111-0--Walk--0----',\n    // 利尻空港\n    'RIS': 'P-exit-307459-0--Walk--0----',\n    // オホーツク紋別空港\n    'MBE': 'P-exit-307346-0--Walk--0----',\n    // 女満別空港\n    'MMB': 'P-exit-307110-0--Walk--0----',\n    // 根室中標津空港\n    'SHB': 'P-exit-307112-0--Walk--0----',\n    // 旭川空港\n    'AKJ': 'P-exit-307115-0--Walk--0----',\n    // 釧路空港\n    'KUH': 'P-exit-307113-0--Walk--0----',\n    // 帯広空港\n    'OBO': 'P-exit-307114-0--Walk--0----',\n    // 新千歳空港(国内線)\n    'CTS_DOM': 'P-exit-20274,649323,1053276,307066-0,0,0,0--Walk,Walk,Walk,Walk--0----', \n    // 新千歳空港(国際線)\n    'CTS_INT': 'P-exit-20274,1053277,307066,649386-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 函館空港\n    'HKD': 'P-exit-307116,1053990-0,0--Walk,Walk--0----',\n    // 青森空港\n    'AOJ': 'P-exit-307117,611348,1165006-0,0,0--Walk,Walk,Walk--0----',\n    // 大館能代空港\n    'ONJ': 'P-exit-307157-0--Walk--0----',\n    // 秋田空港\n    'AXT': 'P-exit-307119-0--Walk--0----',\n    // 庄内空港\n    'SYO': 'P-exit-307120-0--Walk--0----',\n    // 仙台空港\n    'SDJ': 'P-exit-29549,307145,1068016-0,0,0--Walk,Walk,Walk--0----',\n    // 新潟空港\n    'KIJ': 'P-exit-307148,834434-0,0--Walk,Walk--0----',\n    // 福島空港\n    'FKS': 'P-exit-307147-0--Walk--0----',\n    // 八丈島空港\n    'HAC': 'P-exit-406013-0--Walk--0----',\n    // 静岡空港\n    'FSZ': 'P-exit-307486-0--Walk--0----',\n    // 中部国際空港\n    'NGO': 'P-exit-29529,319195,307162-0,0,0--Walk,Walk,Walk--0----',\n    // 伊丹空港\n    'ITM' : 'P-exit-307124,29175-0,0--Walk,Walk--0----',\n    // 関西空港(大阪)\n    'KIX': 'P-exit-25891,307150,29098,307172-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 神戸空港\n    'UKB': 'P-exit-29559,305569,257162,29576-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 徳島空港\n    'TKS': 'P-exit-307132,797701-0,0--Walk,Walk--0----',\n    // 高松空港\n    'TAK': 'P-exit-307133-0--Walk--0----',\n    // 岡山空港\n    'OKJ': 'P-exit-304172-0--Walk--0----',\n    // 高知空港\n    'KCZ': 'P-exit-307134-0--Walk--0----',\n    // 松山空港\n    'MYJ': 'P-exit-304557-0--Walk--0----',\n    // 広島空港\n    'HIJ': 'P-exit-307130,994333-0,0--Walk,Walk--0----',\n    // 岩国空港\n    'IWK': 'P-exit-309198-0--Walk--0----',\n    // 富山空港\n    'TOY': 'P-exit-307122,1033582-0,0--Walk,Walk--0----',\n    // 能登空港\n    'NTQ': 'P-exit-307159-0--Walk--0----',\n    // 小松空港\n    'KMQ': 'P-exit-307123-0--Walk--0----',\n    // 鳥取空港\n    'TTJ': 'P-exit-307126-0--Walk--0----',\n    // 米子空港\n    'YGJ': 'P-exit-26855,307127-0,0--Walk,Walk--0----',\n    // 萩・石見空港\n    'IWJ': 'P-exit-307143-0--Walk--0----',\n    // 山口宇部空港\n    'UBJ': 'P-exit-307131,822966,27487-0,0,0--Walk,Walk,Walk--0----',\n    // 北九州空港\n    'KKJ': 'P-exit-307136,673337-0,0--Walk,Walk--0----',\n    // 対馬空港\n    'TSJ': 'P-exit-29119-0--Walk--0----',\n    // 壱岐空港\n    'IKI': 'P-exit-307500-0--Walk--0----',\n    // 福岡空港(ターミナルが未確定の日付の場合に利用する。)\n    'FUK_DOM': 'P-exit-28304,306294,304559-0,0,0--Walk,Walk,Walk--0----',\n    // 福岡空港(国内線北ターミナル)\n    'FUK_DOM_NORTH': 'P-exit(North)-28304,304559,675189-0,0,0--Walk,Walk,Walk--0----',\n    // 福岡空港(国内線南ターミナル)\n    'FUK_DOM_SOUTH': 'P-exit(South)-28304,304559,675185-0,0,0--Walk,Walk,Walk--0----',\n    // 福岡空港(国際線ターミナル)\n    'FUK_INT': 'P-exit(International)-306294,675186-0,0--Walk,Walk--0----',\n    // 長崎空港\n    'NGS': 'P-exit-319126,307139,815800,865041-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 五島福江空港\n    'FUJ': 'P-exit-五島福江空港-0--Walk--0----',\n    // 佐賀空港\n    'HSG': 'P-exit-307158,1163127-0,0--Walk,Walk--0----',\n    // 熊本空港\n    'KMJ': 'P-exit-307138-0--Walk--0----',\n    // 鹿児島空港\n    'KOJ': 'P-exit-307142,1117457,585719,304489-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 宮崎空港\n    'KMI': 'P-exit-28904,307141,453417-0,0,0--Walk,Walk,Walk--0----',\n    // 大分空港\n    'OIT': 'P-exit-307140,877746-0,0--Walk,Walk--0----',\n    // 那覇空港(国内線ターミナル)\n    'OKA_DOM': 'P-exit-29031,112259,1126026-0,0,0--Walk,Walk,Walk--0----',\n    // 那覇空港(国際線ターミナル)\n    'OKA_INT': 'P-exit-29031,112258,1126027-0,0,0--Walk,Walk,Walk--0----',\n    // 宮古空港\n    'MMY': 'P-exit-307497,1198940-0,0--Walk,Walk--0----',\n    // 石垣空港\n    'ISG': 'P-exit-307315-0--Walk--0----',\n    // 天草空港\n    'AXJ': 'P-exit-307503-0--Walk--0----',\n    // 種子島空港\n    'TNE': 'P-exit-307493-0--Walk--0----',\n    // 屋久島空港(バス停なし)\n    'KUM': 'P-exit-29122-0--Walk--0----',\n    // 与論空港(バス停なし)\n    'RNJ': 'P-exit-29125-0--Walk--0----',\n    // 喜界空港(バス停なし)\n    'KKX': 'P-exit-29128-0--Walk--0----',\n    // 沖永良部空港\n    'OKE': 'P-exit-307470-0--Walk--0----',\n    // 奄美空港\n    'ASJ': 'P-exit-307474-0--Walk--0----',\n    // 徳之島空港\n    'TKN': 'P-exit-307471-0--Walk--0----'\n  }\n}\n","// 各空港のと各公共交通機関のリンクを設定した地点。\nexport const AirportsAndStations: { [key: string]: any; } = {\n  'ja': {\n    // 羽田空港第1ターミナル\n    'HND_1': 'P-羽田空港第1ターミナル-29509,22911,29511,51649-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 羽田空港第2ターミナル\n    'HND_2' : 'P-羽田空港第2ターミナル-29510,22911,29512,52106-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 羽田空港第3ターミナル\n    'HND_3' : 'P-羽田空港第3ターミナル-29672,305577,51650,29671-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 成田空港(第1ターミナル)\n    'NRT' : 'P-成田空港(第1ターミナル)-22392,29573-0,0--徒歩,徒歩--0----',\n    // 成田空港(第3ターミナル)\n    'NRT_3': 'P-成田空港(第3ターミナル)-304034,22267,29574-0,15,15--徒歩,徒歩,徒歩--0----',\n    // 稚内空港\n    'WKJ': 'P-稚内空港-307111-0--徒歩--0----',\n    // 利尻空港\n    'RIS': 'P-利尻空港-307459-0--徒歩--0----',\n    // オホーツク紋別空港\n    'MBE': 'P-オホーツク紋別空港-307346-0--徒歩--0----',\n    // 女満別空港\n    'MMB': 'P-女満別空港-307110-0--徒歩--0----',\n    // 根室中標津空港\n    'SHB': 'P-根室中標津空港-307112-0--徒歩--0----',\n    // 旭川空港\n    'AKJ': 'P-旭川空港-307115-0--徒歩--0----',\n    // 釧路空港\n    'KUH': 'P-釧路空港-307113-0--徒歩--0----',\n    // 帯広空港\n    'OBO': 'P-帯広空港-307114-0--徒歩--0----',\n    // 新千歳空港(国内線)\n    'CTS_DOM': 'P-新千歳空港(国内線)-20274,649323,1053276,307066-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 新千歳空港(国際線)\n    'CTS_INT': 'P-新千歳空港(国際線)-20274,1053277,307066,649386-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 函館空港\n    'HKD': 'P-函館空港-307116,1053990-0,0--徒歩,徒歩--0----',\n    // 青森空港\n    'AOJ': 'P-青森空港-307117,611348,1165006-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 大館能代空港\n    'ONJ': 'P-大館能代空港-307157-0--徒歩--0----',\n    // 秋田空港\n    'AXT': 'P-秋田空港-307119-0--徒歩--0----',\n    // 庄内空港\n    'SYO': 'P-庄内空港-307120-0--徒歩--0----',\n    // 仙台空港\n    'SDJ': 'P-仙台空港-29549,307145,1068016-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 新潟空港\n    'KIJ': 'P-新潟空港-307148,834434-0,0--徒歩,徒歩--0----',\n    // 福島空港\n    'FKS': 'P-福島空港-307147-0--徒歩--0----',\n    // 八丈島空港\n    'HAC': 'P-八丈島空港-406013-0--徒歩--0----',\n    // 静岡空港\n    'FSZ': 'P-静岡空港-307486-0--徒歩--0----',\n    // 中部国際空港\n    'NGO': 'P-中部国際空港-29529,319195,307162-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 伊丹空港\n    'ITM' : 'P-伊丹空港-307124,29175-0,0--徒歩,徒歩--0----',\n    // 関西空港(大阪)\n    'KIX': 'P-関西空港(大阪)-25891,307150,29098,307172-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 神戸空港\n    'UKB': 'P-神戸空港-29559,305569,257162,29576-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 徳島空港\n    'TKS': 'P-徳島空港-307132,797701-0,0--徒歩,徒歩--0----',\n    // 高松空港\n    'TAK': 'P-高松空港-307133-0--徒歩--0----',\n    // 岡山空港\n    'OKJ': 'P-岡山空港-304172-0--徒歩--0----',\n    // 高知空港\n    'KCZ': 'P-高知空港-307134-0--徒歩--0----',\n    // 松山空港\n    'MYJ': 'P-松山空港-304557-0--徒歩--0----',\n    // 広島空港\n    'HIJ': 'P-広島空港-307130,994333-0,0--徒歩,徒歩--0----',\n    // 岩国空港\n    'IWK': 'P-岩国空港-309198-0--徒歩--0----',\n    // 富山空港\n    'TOY': 'P-富山空港-307122,1033582-0,0--徒歩,徒歩--0----',\n    // 能登空港\n    'NTQ': 'P-能登空港-307159-0--徒歩--0----',\n    // 小松空港\n    'KMQ': 'P-小松空港-307123-0--徒歩--0----',\n    // 鳥取空港\n    'TTJ': 'P-鳥取空港-307126-0--徒歩--0----',\n    // 米子空港\n    'YGJ': 'P-米子空港-26855,307127-0,0--徒歩,徒歩--0----',\n    // 萩・石見空港\n    'IWJ': 'P-萩・石見空港-307143-0--徒歩--0----',\n    // 山口宇部空港\n    'UBJ': 'P-山口宇部空港-307131,822966,27487-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 北九州空港\n    'KKJ': 'P-北九州空港-307136,673337-0,0--徒歩,徒歩--0----',\n    // 対馬空港\n    'TSJ': 'P-対馬空港-29119-0--徒歩--0----',\n    // 壱岐空港\n    'IKI': 'P-壱岐空港-307500-0--徒歩--0----',\n    // 福岡空港(ターミナルが未確定の日付の場合に利用する。)\n    'FUK_DOM': 'P-福岡空港(国内線)-28304,306294,304559-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 福岡空港(国内線北ターミナル)\n    'FUK_DOM_NORTH': 'P-福岡空港(国内線北ターミナル)-28304,304559,675189-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 福岡空港(国内線南ターミナル)\n    'FUK_DOM_SOUTH': 'P-福岡空港(国内線南ターミナル)-28304,304559,675185-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 福岡空港(国際線ターミナル)\n    'FUK_INT': 'P-福岡空港(国際線ターミナル)-306294,675186-0,0--徒歩,徒歩--0----',\n    // 長崎空港\n    'NGS': 'P-長崎空港-319126,307139,815800,865041-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 五島福江空港\n    'FUJ': 'P-五島福江空港-五島福江空港-0--徒歩--0----',\n    // 佐賀空港\n    'HSG': 'P-佐賀空港-307158,1163127-0,0--徒歩,徒歩--0----',\n    // 熊本空港\n    'KMJ': 'P-熊本空港-307138-0--徒歩--0----',\n    // 鹿児島空港\n    'KOJ': 'P-鹿児島空港-307142,1117457,585719,304489-0,0,0,0--徒歩,徒歩,徒歩,徒歩--0----',\n    // 宮崎空港\n    'KMI': 'P-宮崎空港-28904,307141,453417-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 大分空港\n    'OIT': 'P-大分空港-307140,877746-0,0--徒歩,徒歩--0----',\n    // 那覇空港(国内線ターミナル)\n    'OKA_DOM': 'P-出口-29031,112259,1126026-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 那覇空港(国際線ターミナル)\n    'OKA_INT': 'P-出口-29031,112258,1126027-0,0,0--徒歩,徒歩,徒歩--0----',\n    // 宮古空港\n    'MMY': 'P-宮古空港-307497,1198940-0,0--徒歩,徒歩--0----',\n    // 石垣空港\n    'ISG': 'P-石垣空港-307315-0--徒歩--0----',\n    // 天草空港\n    'AXJ': 'P-天草空港-307503-0--徒歩--0----',\n    // 種子島空港\n    'TNE': 'P-種子島空港-307493-0--徒歩--0----',\n    // 屋久島空港(バス停なし)\n    'KUM': 'P-屋久島空港-29122-0--徒歩--0----',\n    // 与論空港(バス停なし)\n    'RNJ': 'P-与論空港-29125-0--徒歩--0----',\n    // 喜界空港(バス停なし)\n    'KKX': 'P-喜界空港-29128-0--徒歩--0----',\n    // 沖永良部空港\n    'OKE': 'P-沖永良部空港-307470-0--徒歩--0----',\n    // 奄美空港\n    'ASJ': 'P-奄美空港-307474-0--徒歩--0----',\n    // 徳之島空港\n    'TKN': 'P-徳之島空港-307471-0--徒歩--0----'\n  },\n  'en': {\n    // 羽田空港第1ターミナル\n    'HND_1': 'P-羽田空港第1ターミナル-29509,22911,29511,51649-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 羽田空港第2ターミナル\n    'HND_2' : 'P-羽田空港第2ターミナル-29510,22911,29512,52106-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 羽田空港第3ターミナル\n    'HND_3' : 'P-羽田空港第3ターミナル-29672,305577,51650,29671-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 成田空港(第1ターミナル)\n    'NRT' : 'P-成田空港(第1ターミナル)-22392,29573-0,0--Walk,Walk--0----',\n    // 成田空港(第3ターミナル)\n    'NRT_3': 'P-成田空港(第3ターミナル)-304034,22267,29574-0,15,15--Walk,Walk,Walk--0----',\n    // 稚内空港\n    'WKJ': 'P-稚内空港-307111-0--Walk--0----',\n    // 利尻空港\n    'RIS': 'P-利尻空港-307459-0--Walk--0----',\n    // オホーツク紋別空港\n    'MBE': 'P-オホーツク紋別空港-307346-0--Walk--0----',\n    // 女満別空港\n    'MMB': 'P-女満別空港-307110-0--Walk--0----',\n    // 根室中標津空港\n    'SHB': 'P-根室中標津空港-307112-0--Walk--0----',\n    // 旭川空港\n    'AKJ': 'P-旭川空港-307115-0--Walk--0----',\n    // 釧路空港\n    'KUH': 'P-釧路空港-307113-0--Walk--0----',\n    // 帯広空港\n    'OBO': 'P-帯広空港-307114-0--Walk--0----',\n    // 新千歳空港(国内線)\n    'CTS_DOM': 'P-新千歳空港(国内線)-20274,649323,1053276,307066-0,0,0,0--Walk,Walk,Walk,Walk--0----', \n    // 新千歳空港(国際線)\n    'CTS_INT': 'P-新千歳空港(国際線)-20274,1053277,307066,649386-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 函館空港\n    'HKD': 'P-函館空港-307116,1053990-0,0--Walk,Walk--0----',\n    // 青森空港\n    'AOJ': 'P-青森空港-307117,611348,1165006-0,0,0--Walk,Walk,Walk--0----',\n    // 大館能代空港\n    'ONJ': 'P-大館能代空港-307157-0--Walk--0----',\n    // 秋田空港\n    'AXT': 'P-秋田空港-307119-0--Walk--0----',\n    // 庄内空港\n    'SYO': 'P-庄内空港-307120-0--Walk--0----',\n    // 仙台空港\n    'SDJ': 'P-仙台空港-29549,307145,1068016-0,0,0--Walk,Walk,Walk--0----',\n    // 新潟空港\n    'KIJ': 'P-新潟空港-307148,834434-0,0--Walk,Walk--0----',\n    // 福島空港\n    'FKS': 'P-福島空港-307147-0--Walk--0----',\n    // 八丈島空港\n    'HAC': 'P-八丈島空港-406013-0--Walk--0----',\n    // 静岡空港\n    'FSZ': 'P-静岡空港-307486-0--Walk--0----',\n    // 中部国際空港\n    'NGO': 'P-中部国際空港-29529,319195,307162-0,0,0--Walk,Walk,Walk--0----',\n    // 伊丹空港\n    'ITM' : 'P-伊丹空港-307124,29175-0,0--Walk,Walk--0----',\n    // 関西空港(大阪)\n    'KIX': 'P-関西空港(大阪)-25891,307150,29098,307172-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 神戸空港\n    'UKB': 'P-神戸空港-29559,305569,257162,29576-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 徳島空港\n    'TKS': 'P-徳島空港-307132,797701-0,0--Walk,Walk--0----',\n    // 高松空港\n    'TAK': 'P-高松空港-307133-0--Walk--0----',\n    // 岡山空港\n    'OKJ': 'P-岡山空港-304172-0--Walk--0----',\n    // 高知空港\n    'KCZ': 'P-高知空港-307134-0--Walk--0----',\n    // 松山空港\n    'MYJ': 'P-松山空港-304557-0--Walk--0----',\n    // 広島空港\n    'HIJ': 'P-広島空港-307130,994333-0,0--Walk,Walk--0----',\n    // 岩国空港\n    'IWK': 'P-岩国空港-309198-0--Walk--0----',\n    // 富山空港\n    'TOY': 'P-富山空港-307122,1033582-0,0--Walk,Walk--0----',\n    // 能登空港\n    'NTQ': 'P-能登空港-307159-0--Walk--0----',\n    // 小松空港\n    'KMQ': 'P-小松空港-307123-0--Walk--0----',\n    // 鳥取空港\n    'TTJ': 'P-鳥取空港-307126-0--Walk--0----',\n    // 米子空港\n    'YGJ': 'P-米子空港-26855,307127-0,0--Walk,Walk--0----',\n    // 萩・石見空港\n    'IWJ': 'P-萩・石見空港-307143-0--Walk--0----',\n    // 山口宇部空港\n    'UBJ': 'P-山口宇部空港-307131,822966,27487-0,0,0--Walk,Walk,Walk--0----',\n    // 北九州空港\n    'KKJ': 'P-北九州空港-307136,673337-0,0--Walk,Walk--0----',\n    // 対馬空港\n    'TSJ': 'P-対馬空港-29119-0--Walk--0----',\n    // 壱岐空港\n    'IKI': 'P-壱岐空港-307500-0--Walk--0----',\n    // 福岡空港(ターミナルが未確定の日付の場合に利用する。)\n    'FUK_DOM': 'P-福岡空港(国内線)-28304,306294,304559-0,0,0--Walk,Walk,Walk--0----',\n    // 福岡空港(国内線北ターミナル)\n    'FUK_DOM_NORTH': 'P-福岡空港(国内線北ターミナル)-28304,304559,675189-0,0,0--Walk,Walk,Walk--0----',\n    // 福岡空港(国内線南ターミナル)\n    'FUK_DOM_SOUTH': 'P-福岡空港(国内線南ターミナル)-28304,304559,675185-0,0,0--Walk,Walk,Walk--0----',\n    // 福岡空港(国際線ターミナル)\n    'FUK_INT': 'P-福岡空港(国際線ターミナル)-306294,675186-0,0--Walk,Walk--0----',\n    // 長崎空港\n    'NGS': 'P-長崎空港-319126,307139,815800,865041-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 五島福江空港\n    'FUJ': 'P-五島福江空港-五島福江空港-0--Walk--0----',\n    // 佐賀空港\n    'HSG': 'P-佐賀空港-307158,1163127-0,0--Walk,Walk--0----',\n    // 熊本空港\n    'KMJ': 'P-熊本空港-307138-0--Walk--0----',\n    // 鹿児島空港\n    'KOJ': 'P-鹿児島空港-307142,1117457,585719,304489-0,0,0,0--Walk,Walk,Walk,Walk--0----',\n    // 宮崎空港\n    'KMI': 'P-宮崎空港-28904,307141,453417-0,0,0--Walk,Walk,Walk--0----',\n    // 大分空港\n    'OIT': 'P-大分空港-307140,877746-0,0--Walk,Walk--0----',\n    // 那覇空港(国内線ターミナル)\n    'OKA_DOM': 'P-exit-29031,112259,1126026-0,0,0--Walk,Walk,Walk--0----',\n    // 那覇空港(国際線ターミナル)\n    'OKA_INT': 'P-exit-29031,112258,1126027-0,0,0--Walk,Walk,Walk--0----',\n    // 宮古空港\n    'MMY': 'P-宮古空港-307497,1198940-0,0--Walk,Walk--0----',\n    // 石垣空港\n    'ISG': 'P-石垣空港-307315-0--Walk--0----',\n    // 天草空港\n    'AXJ': 'P-天草空港-307503-0--Walk--0----',\n    // 種子島空港\n    'TNE': 'P-種子島空港-307493-0--Walk--0----',\n    // 屋久島空港(バス停なし)\n    'KUM': 'P-屋久島空港-29122-0--Walk--0----',\n    // 与論空港(バス停なし)\n    'RNJ': 'P-与論空港-29125-0--Walk--0----',\n    // 喜界空港(バス停なし)\n    'KKX': 'P-喜界空港-29128-0--Walk--0----',\n    // 沖永良部空港\n    'OKE': 'P-沖永良部空港-307470-0--Walk--0----',\n    // 奄美空港\n    'ASJ': 'P-奄美空港-307474-0--Walk--0----',\n    // 徳之島空港\n    'TKN': 'P-徳之島空港-307471-0--Walk--0----'\n  },\n}\n","import * as React from 'react';\nimport { Grid, createStyles, makeStyles, Button, Link } from '@material-ui/core';\nimport scClick from '../../common/ScClick';\nimport { isKeyDownEnter } from '../../../utils/tabIndexList';\n\ninterface Props {\n  /** 表示するバナー画像のパス。 */\n  src: string,\n  /** リンク先のURL。 */\n  url?: string,\n  /** Adobe Analyticsでのクリック数の集計用の名称。 */\n  clickName?: string,\n  /** バナー画像のalt属性に指定する文字列。 */\n  alt: string,\n  /** 境界線があるかを指定するフラグ。 */\n  hasBorder?: boolean,\n  /** POSTメソッドでリンク先へ遷移するかを指定するフラグ。 */\n  post?: boolean,\n  /** POSTメソッドで送信するパラメーターのオブジェクト。 */\n  params?: { [key: string]: string },\n  /** Cookieを保存する関数。 */\n  saveCookie?: () => void,\n  /** Cypressで識別するための名称。 */\n  cyName?: string,\n  /** モーダル内に表示するか否か */\n  isShowModal?: boolean,\n  /** URLが未設定の際にクリックした際に発火するイベント */\n  noSetUrlOnClick?: () => void,\n  /** tabIndexの値 */\n  tabIndex?: number,\n  /** バナーの上側に表示する要素 */\n  topArea?: JSX.Element | string\n}\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    image: {\n      width: '100%',\n      maxWidth: '640px',\n      cursor: 'pointer'\n    },\n    imageWithBorder: {\n      width: '98.76%',\n      border: 'solid 2px #b2b2b2',\n      maxWidth: '640px',\n      cursor: 'pointer'\n    },\n    bannerSetMaxWidth: {\n      alignSelf: 'center',\n      width: '80%',\n      maxWidth: '400px',\n      textAlign: 'center',\n      margin: 'auto'\n    },\n    banner: {\n      alignSelf: 'center',\n      textAlign: 'center',\n      margin: 'auto'\n    },\n    topArea: {\n      width: '100%',\n      maxWidth: '640px',\n      margin: 'auto',\n      textAlign: 'left'\n    },\n    prFont: {\n      fontSize: '0.625rem',\n      color: '#6d6d6d'\n    }\n  }),\n);\n\n/** バナー広告のベースとなるコンポーネント。 */\nconst Banner: React.FC<Props> = (props: Props) => {\n  const classes = useStyles({});\n  /** バナークリック時の処理。 */\n  const onClick = () => {\n    if(props.clickName) {\n      /** クリック数の集計。 */\n      scClick(props.clickName);\n    }\n    // Cookieを保存する関数が渡されている場合は、3秒後にその関数を実行する。\n    // (リンク先への遷移前にCookieの格納を検知して、URLの変更が発火してしまう場合があるため。)\n    if (props.saveCookie) {\n      setTimeout(() => {\n        // この階層でも関数の存在チェックをする必要があるため2重で判別している。\n        if (props.saveCookie) { props.saveCookie(); }\n      }, 3000);\n    }\n    if( props.noSetUrlOnClick ) {\n      props.noSetUrlOnClick();\n    }\n  }\n  return (\n    <Grid container justify='center' alignItems='center' style={{ marginTop: 10 }} data-cy={props.cyName} >\n      <Grid item xs={12} >\n        <div className={props.isShowModal? classes.bannerSetMaxWidth: classes.banner}>\n          {/** バナーの上側に表示する文字を入れる */}\n          <div className={classes.topArea}>\n            <span className={classes.prFont}>\n              {props.topArea}\n            </span>\n          </div>\n          {/* POSTでリクエストする場合。 */}\n          { (props.post && props.params) && props.url &&\n            <form action={props.url} method=\"post\" target=\"_blank\">\n              {\n                Object.keys(props.params).map( (key: string) => {\n                  if (props.params) {\n                    // リクエストパラメーターをhiddenタグで埋め込む。\n                    return ( <input key={key} type=\"hidden\" name={key} value={props.params[key]} /> )\n                  }\n                  return null;\n                })\n              }\n              <Button\n                onClick={ () => {\n                  if(props.clickName) {\n                    scClick(props.clickName)}\n                  }\n                }\n                type='submit'\n                tabIndex={props.tabIndex || 0}\n                onKeyDown={\n                  (e) => {\n                    isKeyDownEnter(e, () => {\n                      if(props.clickName) {\n                        scClick(props.clickName)\n                      }\n                    })\n                  }\n                }\n              >\n                <img\n                  src={props.src}\n                  alt={props.alt}\n                  className={`${props.hasBorder ? classes.imageWithBorder : classes.image}`}\n                />\n              </Button>\n            </form>\n          }\n          {/* GETでリクエストする場合。 */}\n          { !props.post && props.url &&\n            <Link href={props.url} rel=\"noopener\" target=\"_blank\" onClick={ onClick }>\n              <img\n                src={props.src}\n                alt={props.alt}\n                className={`${props.hasBorder ? classes.imageWithBorder : classes.image}`}\n              />\n            </Link>\n          }\n          {/** URLが未設定の場合 */}\n          { !props.url &&\n            <img\n              src={props.src}\n              alt={props.alt}\n              className={`${props.hasBorder ? classes.imageWithBorder : classes.image}`}\n              onClick={onClick}\n              tabIndex={props.tabIndex || 0}\n              onKeyDown={\n                (e) => {\n                  isKeyDownEnter(e, () => {\n                    onClick();\n                  })\n                }\n              }\n            />\n          }\n        </div>\n      </Grid>\n    </Grid>\n  )\n};\n\nexport default Banner;\n","import React from 'react';\n\nimport { createStyles, makeStyles, Button, withStyles, Link } from '@material-ui/core';\n\nimport ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos';\nimport scClick from '../ScClick';\n\nexport interface Props {\n  /** ボタンに表示するラベル。 */\n  label: string | React.ReactNode,\n  /** リンク先のURL。 */\n  url: string,\n  /** Adobe Analyticsでのクリック数の集計用の名称。(任意) */\n  clickName?: string,\n  /** ボタンの背景色 */\n  backgroundColor?: string\n}\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    button: {\n      boxShadow: '0 2px 2px 0 rgba(0,0,0,0.30)',\n      borderRadius: '2px',\n      textAlign: 'center',\n      width: '100%',\n      height: '48px',\n      marginTop: '16px',\n      fontSize: '0.9rem'\n    },\n    link: {\n      \"&:hover\": {\n        textDecoration: \"none\",\n      },\n    },\n  }),\n);\n\n/** 背景色を黄色、ラベル色を黒にしたボタンのコンポーネント。 */\nconst YellowButton = withStyles({\n  root: {\n    backgroundColor: \"#FDB50A\",\n    paddingTop: '4px'\n  },\n  label: {\n    color: \"#0f0f0f\",\n    textTransform: 'none',\n  },\n})(Button);\n\n/** ポップアップ画面内の黄色いリンク(予約・料金確認)用ボタンのコンポーネント。 */\nconst ButtonToLink: React.FC<Props> = (props: Props) => {\n  const classes = useStyles({});\n\n  /** このボタンを押されたときの処理。 */\n  const onClick = () => {\n    // クリック名画設定されている場合は、SCクリックを実行する。\n    if (props.clickName) { scClick(props.clickName) }\n  }\n\n  return (\n    <Link href={props.url} target=\"_blank\" className={classes.link}>\n      <YellowButton\n        size=\"large\"\n        variant=\"contained\"\n        className={classes.button}\n        endIcon={<ArrowForwardIosIcon/>}\n        onClick={onClick}\n        style={{ backgroundColor: props.backgroundColor }}\n      >\n        {props.label}\n      </YellowButton>\n    </Link>\n)\n}\n\nexport default ButtonToLink;\n","import React from 'react';\n\nimport { createStyles, makeStyles, Typography, Grid } from '@material-ui/core';\n\nexport interface Props {\n  /** 「タクシー」など空港送迎サービスの種別の名称部分の文字列、またはコンポーネント。 */\n  name: string | React.ReactNode,\n  /** 価格設定部分の文字列、またはコンポーネント。 */\n  pricing: string | React.ReactNode,\n  /** 価格設定部分2行目の文字列、またはコンポーネント */\n  priceNotice?: string | React.ReactNode,\n  /** 価格設定部分3行目の文字列、またはコンポーネント */\n  priceNoticeSecond?: string | React.ReactNode,\n}\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    gridItemLeft: {\n      backgroundColor: \"#FBE4D4\",\n      border: \"1px solid #0f0f0f\",\n      borderRight: \"0px\",\n      padding: 5,\n    },\n    gridItemRight: {\n      border: \"1px solid #0f0f0f\",\n      padding: 5,\n    },\n    typeText: {\n      color: \"#0f0f0f\",\n      fontSize: \"14px\"\n    },\n    priceNotice: {\n      fontSize: \"12px\"\n    },\n    typeArea: {\n      marginBottom: \"10px\"\n    }\n  }),\n);\n\n/** 空港送迎サービスの種別・料金設定のコンポーネント。 */\nconst Type: React.FC<Props> = (props: Props) => {\n  const classes = useStyles({});\n  return (\n    <Grid container className={classes.typeArea}>\n      {/* 種別名称の列。 */}\n      <Grid item xs={4} sm={3} className={classes.gridItemLeft} container direction=\"column\" justify=\"center\">\n        <Grid item>\n          <Typography className={classes.typeText}>{props.name}</Typography>\n        </Grid>\n      </Grid> \n      {/* 価格設定の列。 */}\n      <Grid item xs={8} sm={9} className={classes.gridItemRight}>\n        <Typography color=\"error\">{props.pricing}</Typography>\n        { props.priceNotice &&\n          <Typography color=\"error\" className={classes.priceNotice}>{props.priceNotice}</Typography>\n        }\n        { props.priceNoticeSecond &&\n          <Typography color=\"error\" className={classes.priceNotice}>{props.priceNoticeSecond}</Typography>\n        }\n      </Grid>\n    </Grid>\n  )\n}\n\nexport default Type;\n","import * as React from 'react';\nimport ServiceDetail, { SearviceDetailButton } from '../../../common/PopupDialog/ServiceDetail';\nimport BasicImage from '../../../ad/Banners/images/MkTaxi/popup/mktaxi_service.jpg';\nimport BarrierFreeImage from '../../../ad/Banners/images/MkTaxi/popup/BarrierFreeImage.png'\nimport MkTaxiLogo from '../../../ad/Banners/images/MkTaxi/mktaxi_logo.png';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport Type from '../../../common/PopupDialog/Type';\nimport { createStyles, Grid, Link, makeStyles, Typography } from '@material-ui/core';\nimport { TaxiPrice } from '../../../../services/mktaxi/data/PriceList';\nimport { useState } from 'react';\nimport { isKeyDownEnter, TabIndexList } from '../../../../utils/tabIndexList';\nimport DateTime from '../../../../utils/dateTime';\n\ninterface Props {\n  price?: TaxiPrice,\n  url: string,\n  /** 羽田or成田発着か */\n  isTYO: boolean,\n  /** ANAマイレージクラブにログインして予約に進む際のURL */\n  anaMileageClubURL: string,\n  /** バリアフリー用のイメージを表示するか */\n  isShowBarrierFreeImage?: boolean\n}\n\ninterface ImageProps {\n  maxWidth: string,\n  width: string,\n  height?: string,\n  maxHeight?: string,\n  src: string\n}\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    mileAreaStyle: {\n      width: '100%',\n      marginTop: \"5px\",\n      marginBottom: \"5px\",\n      padding: \"0px 5px\",\n      fontSize: '0.875rem'\n    },\n    mileAreaBottomStyle: {\n      width: '100%',\n      marginTop: \"40px\",\n      marginBottom: \"5px\",\n      padding: \"0px 5px\",\n      fontSize: '0.875rem'\n    },\n    linkStyle: {\n      fontWeight: 'bold',\n      textDecoration: 'underline'\n    }\n  }),\n);\n\nconst MkTaxiService: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  interface MileProps {\n    /** 羽田or成田発着か */\n    isTYO: boolean\n  }\n\n  const [displayCoupon, setDisplayCoupon] = React.useState<React.ReactNode[]> ([]);\n\n  /** 種別・料金設定の部分のコンポーネント。 */\n  const TitleType: React.FC<Props> = (props: Props) => {\n    if (props.price) {\n      const priceTitle = props.price.isLabelMeter? 'メータータクシー': '空港定額タクシー';\n      return (\n        <Type\n          name={priceTitle}\n          pricing={`約${props.price.pay.toLocaleString()}円〜`}\n          priceNotice=\"※詳細な料金は MKタクシーのサイトにてご確認ください。\"\n          priceNoticeSecond=\"※配車対象外の場合もございます\"\n        />\n      )\n    }\n    return null;\n  };\n\n  /** クーポン部分(またはお得な情報部分)のコンポーネント。 */\n  const Coupon: React.FC<Props> = (props: Props) => {\n    return (\n      <>\n        <Typography component=\"p\" style={{ color: \"#ff0000\", fontWeight: 'bold' }} data-cy={\"mktaxi-coupon-area\"}>\n          車種「指定なし」を選択された方に<br/>\n          無料アップグレード実施中!<br/>\n          <span style={{ fontSize: '0.8rem' }}> ※予約の混雑状況によってはアップグレード車両でのご案内ができかねる場合もございますので予めご了承ください。</span>\n        </Typography>\n      </>\n    )\n  }\n\n  const Description: React.FC = () => {\n    return (\n      <Typography color=\"primary\" variant=\"subtitle2\" component=\"p\" style={{ marginBottom: \"5px\", padding: \"0px 5px\" }}>\n        ・自宅、ご希望地⇔空港まで直行のリーズナブルで安心な定額料金を全国8空港で展開! <br/>\n        ・遅延による待機料金、欠航によるキャンセル料金は発生いたしません。<br/>\n        ・豊富な車種を人数や荷物の量によってお選びいただけます。\n      </Typography>\n    );\n  }\n\n  /** 注意事項部分のコンポーネントのProps。 */\n  interface NotesProps {\n    /** 成田・羽田発着(東京MK)であるかを表すフラグ。 */\n    isTYO: boolean,\n  }\n  /** 注意事項部分のコンポーネント。 */\n  const Notes: React.FC<NotesProps> = (props: NotesProps) => {\n    return (\n      <Typography color=\"primary\" variant=\"subtitle2\" component=\"p\" style={{ marginBottom: \"5px\", padding: \"0px 5px\" }}>\n        ・MKタクシーのウェブサイト上での予約となります。<br/>\n        { props.isTYO &&\n          <span style={{ color: \"red\"}}>\n            ・羽田および成田空港をご利用の場合、タクシー予約の受付は、 ご利用日時の24時間前までとなります。<br/>\n          </span>\n        }\n        ・お支払は現地車内にてお願いいたします。<br/>\n        ・ご連絡のないキャンセルは100%のキャンセル料が発生いたします。<br/>\n        ・定額対象地域は限られ、対象地域以外はメーター料金となります。<br/>\n          金額詳細についてはMKタクシーサイトにてご確認ください。<br/>\n        ・高速道路などの有料道路通行料/空港お迎えご利用時の駐車代/深夜早朝時間帯(22:00~翌5:00)<br/>\n          割増運賃(2割増)など定額料金から別途料金が発生する場合もございます。<br/>\n          {/* 東京MK(羽田・成田発着)の場合のみ表示する注意事項。 */}\n          { props.isTYO &&\n            <>\n              ・別途、時間指定料金や車種指定料金がかかる場合がございます。<br/>\n              金額詳細についてはMKタクシーサイトにてご確認ください。<br/>\n            </>\n          }\n        ・フライトの変更は自動的に引き継がれませんので、ご自身で直接MKタクシーにお問い合わせください。<br/>\n        ・万が一、交通渋滞等でフライト出発時刻に間に合わない場合も、航空券予約の保証はいたしかねます。\n      </Typography>\n    );\n  }\n\n  const NoticeMileUp: React.FC<MileProps> = (props: MileProps) => {\n    return (\n      <Grid container className={classes.mileAreaStyle} style={{ color: '#002596' }}>\n        <Grid item style={{ fontWeight: 'bold'}}>\n          ANAマイレージクラブにログインして進んでいただくとマイルが貯まります!<br/>\n        </Grid>\n        { props.isTYO &&\n          <Grid item style={{ fontWeight: 'bold'}}>\n            また、東京MKのみ、乗車時に料金をANAカードでお支払いいただくと、さらにマイルが貯まります!\n          </Grid>\n        }\n      </Grid>\n    )\n  }\n\n  const NoticeMileDown: React.FC<MileProps> = (props: MileProps) => {\n    const mileContactURL = \"https://www.ana.co.jp/ja/jp/site-help/share/contact/mileage_top.htm\";\n    const tokyoMKTaxiURL = \"https://www.ana.co.jp/ja/jp/amc/reference/tameru/airport-access/tokyomk.html\";\n    const [hyde, setHyde] = useState(true);\n    const onClick = () => { setHyde(!hyde); }\n    return (\n      <Grid container className={classes.mileAreaBottomStyle} data-cy=\"mxtaxi-notice-area\" style={{ color: '#002596' }}>\n        <Grid item xs={12} style={{ fontWeight: 'bold', textAlign: 'center' }}>\n          マイルに関するご注意(必ずご確認ください)<br/>\n        </Grid>\n        {!hyde &&\n          <>\n            <Grid item xs={12}>\n              ・本ページを経由してANAマイレージクラブ会員お客様番号をご入力後、MKタクシーウェブサイトにて予約・乗車・支払い完了された場合に、「200円(税込)につき1マイル」を積算いたします。それ以外の場合は、ご利用になられてもマイルは積算されません。\n            </Grid>\n            { props.isTYO &&\n              <Grid item xs={12}>\n              ・東京MKのみ、ANAカードでのお支払いにおいて、「100円(税込)につき1マイル」が別途積算されます。\n              </Grid>\n            }\n            <Grid item xs={12}>\n              ・マイルはご利用後約1~2カ月後にお客様のマイル口座に積算されます。\n            </Grid>\n            { props.isTYO &&\n              <Grid item xs={12}>\n                ANAカードでのお支払いによるマイル積算とはタイミングが異なります。\n              </Grid>\n            }\n            <Grid item xs={12}>\n              ・ご予約成立後に予約をキャンセルされた場合は、マイルは積算されません。また、変更・取り消し手数料はマイル積算の対象外となります。<br/>\n              ・ご入力いただいたANAマイレージクラブ会員お客様番号とご名義人が異なる場合は、マイルは積算されません。<br/>\n              ・ご予約完了後のANAマイレージクラブ会員お客様番号の訂正、事後登録はお受けできませんので、お申し込みの際はご注意ください。<br/>\n              ・ANAマイレージクラブに関するお問い合わせは<Link href={mileContactURL} target=\"_blank\" className={classes.linkStyle}>こちら</Link>から。\n              { props.isTYO &&\n                <><br/>・ANAカードマイルプラスの詳細については<Link href={tokyoMKTaxiURL} target=\"_blank\" className={classes.linkStyle}>こちら</Link>から。</>\n              }\n            </Grid>\n          </>\n        }\n        <Grid item style={{ width: '100%', textAlign: 'center' }}>\n          {hyde?\n            <ExpandMoreIcon\n              onClick={onClick}\n              tabIndex={TabIndexList.MK_TAXI_MILE_NOTILE}\n              onKeyDown={\n                (e) => {\n                  isKeyDownEnter(e, () => {\n                    onClick();\n                  })\n                }\n              }\n              data-cy=\"mktaxi-expand-more-button\"\n            />:\n            <ExpandLessIcon\n              onClick={onClick}\n              tabIndex={TabIndexList.MK_TAXI_MILE_NOTILE}\n              onKeyDown={\n                (e) => {\n                  isKeyDownEnter(e, () => {\n                    onClick();\n                  })\n                }\n              }\n            />\n          }\n        </Grid>\n      </Grid>\n    )\n  }\n\n  const button: SearviceDetailButton[] = [\n    {\n      label: [\"ANAマイレージクラブに\", \"ログインして予約に進む\"],\n      url: props.anaMileageClubURL,\n      scClickName: \"ana-maas_mk_book\",\n      backgroundColor: '#FDB509'\n    },\n    {\n      label: [\"ANAマイレージクラブに\", \"ログインしないで予約に進む\"],\n      url: props.url,\n      scClickName: \"ana-maas_mk_book\",\n      backgroundColor: '#FECF60'\n    }\n  ];\n\n  const SetImage: React.FC<ImageProps> = (props: ImageProps) => {\n    return (\n      <div style={{ height: props.height, maxHeight: props.maxHeight }}>\n        <img src={props.src} alt=\"サービス概要\" style={{ maxWidth: props.maxWidth, width: props.width }}/>\n      </div>\n    );\n  }\n\n  /** 表示するクーポンを組み立てる */\n  React.useEffect(() => {\n    /** 通常のクーポンを表示する */\n    const tmpCoupon = [<Coupon {...props}/>];\n    setDisplayCoupon(tmpCoupon);\n  }, []);\n\n  return <ServiceDetail\n      coupon={displayCoupon}\n      description={<Description/>}\n      button={button}\n      image={\n        <SetImage\n          src={props.isShowBarrierFreeImage? BarrierFreeImage: BasicImage}\n          maxWidth=\"519px\"\n          width=\"100%\"\n          height=\"65vw\"\n          maxHeight=\"350px\"\n        />\n      }\n      logo={\n        <SetImage\n          src={MkTaxiLogo}\n          maxWidth=\"468px\"\n          width=\"100%\"\n        />\n      }\n      notes={<Notes isTYO={props.isTYO}/>}\n      type={<TitleType {...props}/>}\n      isMileArea={true}\n      noticeMileUp={\n        <NoticeMileUp\n          isTYO={props.isTYO}\n        />\n      }\n      noticeMileDown={\n        <NoticeMileDown\n          isTYO={props.isTYO}\n        />\n      }\n    />\n};\n\nexport default MkTaxiService;\n","import React, { useState } from 'react';\nimport { useTranslation } from 'react-i18next';\n\nimport { createStyles, makeStyles, Theme, Button, Dialog, Slide, Grid, Box } from '@material-ui/core';\nimport { TransitionProps } from '@material-ui/core/transitions';\n\nimport scClick from '../ScClick';\nimport ModalHeader from '../ModalHeader';\nimport { isKeyDownEnter } from '../../../utils/tabIndexList';\n\nexport interface Props {\n  /** Dialog部分のタイトル。 */\n  title: string | React.ReactNode,\n  titleLabel?: string,\n  /** Dialogを開くためのボタンなどのコンポーネント。 */\n  openComponent?: React.ReactNode,\n  /** Dialog内で表示するサービス紹介部分のコンポーネント、またはコンポーネントの配列。 */\n  services: React.ReactNode | Array<React.ReactNode>,\n  /** Adobe Analyticsでのクリック数の集計用の名称。(任意) */\n  clickName?: string,\n  /** タイトル部分が画像であるかを表すフラグ。 */\n  isImageTitle?: boolean,\n  /** カスタム閉じるボタン */\n  customClosedButton?: React.ReactNode,\n  /** 閉じるボタンの上に表示されるカスタムボタン */\n  customButton?: React.ReactNode,\n  /** ボタンエリアが中央揃えか */\n  isButtonAreaCenter?: boolean,\n  /** モーダルの開閉フラグを引数により制御させる */\n  isOpen?: boolean,\n  /** モーダルの開閉フラグを引数により制御させる */\n  isSetOpen?: React.Dispatch<React.SetStateAction<boolean>>,\n  /** tabIndex */\n  tabIndex?: number,\n  /** 表示する開閉ボタンがバナーかを判定する */\n  isBanner: boolean\n  /** 表示する開閉ボタンを最大表示するかを判定する */\n  isInline?: boolean\n  /** Dialog内のボタンの下に表示するサービス紹介部分のコンポーネント、またはコンポーネントの配列。 */\n  bottomServices?: React.ReactNode | Array<React.ReactNode>\n}\n\nconst useStyles = makeStyles((theme: Theme) =>\n  createStyles({\n    appBar: {\n      position: 'relative',\n    },\n    modal: {\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n    },\n    paper: {\n      backgroundColor: theme.palette.background.paper,\n      border: '2px solid #000',\n      boxShadow: theme.shadows[5],\n      padding: theme.spacing(2, 4, 3),\n    },\n    center: {\n      textAlign: 'center',\n    },\n    button: {\n      boxShadow: '0 2px 2px 0 rgba(0,0,0,0.30)',\n      borderRadius: '2px',\n      textAlign: 'center',\n      width: '80px',\n      marginTop: '16px'\n    },\n    closeButton: {\n      backgroundColor: '#808080'\n    },\n    customButtonArea: {\n      marginBottom: '20px'\n    },\n    banner: {\n      maxWidth: '640px',\n      marginRight: 'auto',\n      marginLeft: 'auto'\n    },\n    inline:{\n      maxWidth: '640px',\n      marginRight: 'auto',\n      marginLeft: 'auto',\n      display:\"inline\"\n    }\n  }),\n);\n\nconst Transition = React.forwardRef<unknown, TransitionProps>(function Transition(props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />;\n});\n\n/** ポップアップ(SmartRydeなどの連携で利用する)部分のDialog部分のベースのコンポーネント。 */\nconst PopupDialog: React.FC<Props> = (props: Props) => {\n  const classes = useStyles({});\n  const { t } = useTranslation();\n  /** Dialog部分の開閉を管理するフラグとその関数。 */\n  // 初期値はfalse(閉じた状態)とする。\n  let [isOpen, setIsOpen] = useState(false);\n  /** モーダルの開閉フラグ制御をComponents外で行っている場合には引数で置き換える */\n  if(props.isOpen !== undefined && props.isSetOpen !== undefined) {\n    [isOpen, setIsOpen] = [props.isOpen, props.isSetOpen];\n  }\n\n  /** 閉じるなどのボタンはレイアウトの中央揃えか、左揃えか */\n  const isButtonAreaCenter: boolean = props.isButtonAreaCenter || false;\n\n  /** 開くボタンを押したときの処理。 */\n  const onOpen = () => {\n    // 開閉フラグをfalse(Dialogを閉じた状態)にする。\n    setIsOpen(true);\n    // クリック名が設定されている場合は、SCクリックを実行する。\n    if (props.clickName) { scClick(props.clickName); }\n  }\n\n  /** 閉じるボタンを押したときの処理。 */\n  const onClose = () => {\n    // 開閉フラグをfalse(Dialogを閉じた状態)にする。\n    setIsOpen(false);\n  }\n\n  /** 標準で用意されている閉じるボタン */\n  const DefaultClosedButton: React.FC = () => {\n    return (\n      <Button variant=\"contained\" color=\"primary\" className={classes.button} onClick={onClose}>\n        {t('close')}\n      </Button>\n    )\n  }\n\n  interface SectionProps {\n    /** Dialog内で表示するサービス紹介部分のコンポーネント、またはコンポーネントの配列。 */\n    services: React.ReactNode | Array<React.ReactNode>,\n  }\n\n  const SetSection: React.FC<SectionProps> = (props: SectionProps) => {\n    /* 表示するサービスが2件以上で画面幅600px以上の場合は2列で表示する。 */\n    if(props.services instanceof Array) {\n      return (\n        <div>\n          {props.services.map((s, index) => {\n            return <Grid key={index} item xs={12} sm={6}>{s}</Grid>\n          })};\n        </div>\n      )\n    }\n    /* 表示するサービスが1件の場合(配列ではない場合)は常に1列で表示する。 */\n    return <Grid item>{props.services}</Grid>\n  }\n\n  let className = ''\n  if(props.isInline && props.isBanner){\n    className = classes.inline\n  }else if(props.isBanner){\n    className = classes.banner\n  }\n\n  return (\n    <>\n      {/* Dialogを開く部分のコンポーネント。 */}\n      {props.openComponent &&\n        <div\n          onClick={onOpen}\n          onKeyDown={props.isSetOpen? undefined: (e)=>{\n            isKeyDownEnter(e, onOpen);\n          }}\n          className={className}\n        >\n          {props.openComponent}\n        </div>\n      }\n      {/* 以降が実際のDialogの部分。 */}\n      <Dialog fullScreen open={isOpen} onClose={onClose} TransitionComponent={Transition} scroll='body'>\n        <ModalHeader\n          handleClose={onClose}\n          title={props.title}\n          titleLabel={props.titleLabel}\n        />\n        <Box style={{ padding: 10 }}>\n          <Grid container spacing={1}>\n            {/* 表示するサービスが2件以上で画面幅600px以上の場合は2列で表示する。 */}\n            {\n              (props.services instanceof Array) && props.services.map((s, index) => {\n                return <Grid key={index} item xs={12} sm={6}>{s}</Grid>\n              })\n            }\n            {/* 表示するサービスが1件の場合(配列ではない場合)は常に1列で表示する。 */}\n            {\n              !(props.services instanceof Array) &&\n                <Grid item xs={12}>{props.services}</Grid>\n            }\n          </Grid>\n          <Grid container className={(isButtonAreaCenter && classes.center) || ''}>\n            {/** カスタムボタンが設定されている場合には表示する */}\n            <Grid item xs={12} className={classes.customButtonArea}>\n              {props.customButton &&\n                <div>\n                  {props.customButton}\n                </div>\n              }\n            </Grid>\n            {/** 閉じるボタンを表示する */}\n            <Grid item xs={12} onClick={onClose}>\n              {props.customClosedButton &&\n                <>\n                  {props.customClosedButton}\n                </>\n              }\n              {!props.customClosedButton &&\n                <DefaultClosedButton/>\n              }\n            </Grid>\n          </Grid>\n          {props.bottomServices &&\n            <Grid container spacing={1}>\n              <SetSection\n                services={props.bottomServices}\n              />\n            </Grid>\n          }\n        </Box>\n      </Dialog>\n    </>\n  )\n}\n\nexport default PopupDialog;\n","import * as React from 'react';\nimport { useSelector } from 'react-redux';\nimport { createStyles, makeStyles, Theme, Grid,  Link } from '@material-ui/core';\n\nimport TopImage from '../../Banners/images/nearMe/popup/service4.png';\nimport NearmeLog from '../../Banners/images/nearMe/logo_black.png';\nimport Type from '../../../common/PopupDialog/Type';\nimport { useTranslation } from 'react-i18next';\nimport ServiceDetail, { SearviceDetailButton } from '../../../common/PopupDialog/ServiceDetail';\nimport { useState } from 'react';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { State } from '../../../../reducers';\nimport DateTime from '../../../../utils/dateTime';\n\nexport interface NearMePopUpProps {\n  /** 出発案内か否か */\n  isDeparture: boolean,\n  /** 出発・到着空港名 */\n  targetAirport?: string,\n  /** NearMeの利用料金 */\n  fare?: number,\n  /** 非ログインURL */\n  noLoginURL: string,\n  /** ログインURL */\n  loginURL: string,\n  /** Adobe Analyticsでのバナークリック数集計用の処理の関数。 */\n  scClick: string,\n  /** 料金に付属する文言 */\n  addFeeLabel: string\n}\n\nexport const useStylesNearMeBody = makeStyles((theme: Theme) =>\n  createStyles({\n    topImage: {\n      width: '100%',\n      maxWidth: '640px'\n    },\n    logoImage: {\n      width: '50vw',\n      maxWidth: '320px',\n      marginBottom: '1vw'\n    },\n    textBody: {\n      fontSize: '13px',\n      [theme.breakpoints.up('sm')]: {\n        fontSize: '18px',\n      }\n    },\n    ul1st: {\n      paddingLeft: '20px'\n    },\n    ul2nd: {\n      paddingLeft: '0px',\n      listStyleType: 'none'\n    },\n    ulNotice: {\n      paddingLeft: '12px'\n    },\n    reservationArea: {\n      color: '#FF0000',\n      fontSize: '12px',\n      backgroundColor: '#fff2cc',\n      paddingTop: '10px',\n      paddingBottom: '10px',\n      marginTop: '10px',\n      marginBottom: '10px',\n      [theme.breakpoints.up('sm')]: {\n        fontSize: '16px'\n      }\n    },\n    triipleMileCampaignArea: {\n      color: '#FF0000',\n      fontSize: '12px',\n      backgroundColor: '#fff2cc',\n      paddingTop: '10px',\n      paddingBottom: '10px',\n      marginTop: '10px',\n      marginBottom: '10px',\n      [theme.breakpoints.up('sm')]: {\n        fontSize: '16px'\n      }\n    },\n    textLine: {\n      marginTop: '0px',\n      marginBottom: '0px',\n      marginLeft: '5px'\n    },\n    reservationNotice: {\n      fontSize: '12px',\n      marginTop: '0px',\n      marginBottom: '0px',\n      marginLeft: '5px',\n      [theme.breakpoints.up('sm')]: {\n        fontSize: '16px',\n      }\n    },\n    reservationButton: {\n      fontSize: '11px',\n      paddingLeft: '4px',\n      paddingRight: '4px',\n      paddingTop: '10px',\n      paddingBottom: '10px',\n      marginRight: '4px',\n      width: '100%',\n      backgroundColor: '#FDB50A',\n      color: '#000000',\n      textTransform: 'none',\n      [theme.breakpoints.up('sm')]: {\n        fontSize: '16px',\n        paddingBottom: '15px'\n      }\n    },\n    reservationButtonPTag: {\n      marginTop: '0px',\n      marginBottom: '0px',\n    },\n    reservationTitle: {\n      fontSize: '18px',\n      marginTop: '0px',\n      marginBottom: '0px',\n      marginLeft: '5px',\n      fontWeight: 'bold'\n    },\n    noticeArea: {\n      fontSize: '12px',\n      [theme.breakpoints.up('sm')]: {\n        fontSize: '16px',\n      },\n      marginTop: '10px',\n    },\n    noticePTag: {\n      marginTop: '0px',\n      marginBottom: '0px',\n      marginLeft: '2px'\n    },\n    noticePTagRed: {\n      marginTop: '0px',\n      marginBottom: '0px',\n      marginLeft: '2px',\n      color: 'red'\n    },\n    noticePTagBold: {\n      marginTop: '0px',\n      marginBottom: '0px',\n      marginLeft: '2px',\n      fontWeight: 'bold'\n    },\n    reservationButtonLine: {\n      marginTop: '0px',\n      marginBottom: '0px',\n      fontSize: '1rem',\n      fontWeight: 'bold'\n    },\n    bigFont: {\n      fontSize: '14px',\n      color: '#0000ff',\n      fontWeight: 'bold',\n      [theme.breakpoints.up('sm')]: {\n        fontSize: '20px',\n      }\n    },\n    redBold: {\n      color: '#ff0000',\n      fontWeight: 'bold'\n    },\n    arrowForwardIosIcon: {\n      fontSize: '1rem',\n      verticalAlign: 'middle',\n      marginTop: '0.3rem'\n    },\n    linkStyle: {\n      fontWeight: 'bold',\n      textDecoration: 'underline'\n    },\n    mileAreaStyle: {\n      width: '100%',\n      marginTop: \"5px\",\n      marginBottom: \"5px\",\n      padding: \"0px 5px\",\n      fontSize: '0.875rem'\n    },\n    mileAreaBottomStyle: {\n      width: '100%',\n      marginTop: \"40px\",\n      marginBottom: \"5px\",\n      padding: \"0px 5px\",\n      fontSize: '0.875rem'\n    },\n    typeArea: {\n      height: '50px',\n      marginBottom: '10px'\n    },\n    bonusMileCampaign: {\n      border: 'solid red',\n      marginTop: '16px'\n    },\n    bold: {\n      fontWeight: 'bold'\n    }\n  }),\n);\n\nconst NearMeServiceBody: React.FC<NearMePopUpProps> = (props: NearMePopUpProps) => {\n  const { t } = useTranslation();\n  const classes = useStylesNearMeBody({});\n  const priceLabel = props.fare? `${props.addFeeLabel} ${props.fare.toLocaleString()}円/人〜`: '';\n  const tripleMileCampaignURL = 'https://www.ana.co.jp/ja/jp/amc/reference/tameru/airport-access/nearmesmartshuttle.html';\n\n  /** ボタンにセットするSCクリック値 */\n  const setSCClick = props.scClick || 'ana-maas_nearme_book';\n  interface NearMeLinkProps {\n    href: string\n  }\n\n  const NearMeLink: React.FC<NearMeLinkProps> = (props: NearMeLinkProps) => {\n    return (\n      <Link\n        href={props.href}\n        target=\"_blank\"\n        className={classes.linkStyle}\n      >\n        こちら\n      </Link>\n    )\n  }\n\n  /** 薄黄色背景のトリプルマイルキャンペーン概要表示欄 */\n  const TripleMileCampaignArea: React.FC = () => {\n    return (\n      <Grid container className={classes.triipleMileCampaignArea}>\n        <Grid item xs={12}>\n          <p className={classes.reservationTitle}>あわせてダブルマイル!</p>\n          <p className={classes.reservationNotice}>\n            「空港アクセスナビ(本画面)」を経由し、nearMe.Airportサービスをご予約・ご乗車いただくと、通常、ご利用金額200円(税込)につき1マイルのところ、1マイルプラスの、200円(税込)につき合計2マイル貯まります。\n          </p>\n          <p className={classes.reservationNotice}>\n            *nearMe.AirportウェブサイトにてANAマイレージクラブお客様番号(10桁)をご入力いただく必要がございます。\n          </p>\n          <p className={classes.reservationNotice}>\n            *本画面経由で貯まるマイルは決済完了から約1~2か月後の積算となり、通常の積算とはタイミングが異なりますのでご注意ください。\n          </p>\n          <p className={classes.reservationNotice}>\n            <NearMeLink href={tripleMileCampaignURL} />も併せてご確認ください。\n          </p>\n        </Grid>\n      </Grid>\n    )\n  }\n\n  /** NearMe全体に関する注意事項コンポーネント */\n  const Description: React.FC = () => {\n    return (\n      <>\n        <Grid item xs={12}  className={classes.textBody}>\n          <ul className={classes.ul1st}>\n            {(props.targetAirport !== undefined && props.fare !== undefined) &&\n              <li>空港定額:{props.targetAirport}便は片道 {priceLabel}</li>\n            }\n            <li>オンライン事前決済、完全予約制(前日15時まで)</li>\n            <li>\n              新型コロナ対策として以下実施\n              <ul className={classes.ul2nd}>\n                <li>{'> '}少人数制(最大9人乗り車両で6名まで)</li>\n                <li>{'> '}車内換気、乗車後の清掃とアルコール消毒</li>\n                <li>{'> '}全乗務員の運行前検温とマスクの着用</li>\n                <li>{'> '}利用客へのマスク着用の依頼</li>\n              </ul>\n            </li>\n          </ul>\n        </Grid>\n        <Grid item xs={12} className={classes.textBody}>\n          <TripleMileCampaignArea/>\n        </Grid>\n        <Grid item xs={12} className={classes.textBody}>\n          ※参加登録のため、一度ログイン画面にてログインをいただきますが、マイル積算にはお手数ですが<span className={classes.redBold}>nearMe.Airportページにて再度ANAマイレージクラブお客様番号(10桁)をご入力いただく必要がございます。</span>\n        </Grid>\n      </>\n    )\n  }\n\n  /** NearMe全体の注意事項 */\n  const Notes: React.FC = () => {\n    return (\n      <Grid item xs={12} className={classes.textBody}>\n        <p className={classes.textLine}>(!)ご注意</p>\n        <ul className={classes.ulNotice}>\n          <li>\n            <p className={classes.noticePTagBold}>配車対象エリアが限られますので、詳細はnearMe.Airportウェブサイトにてご確認ください。</p>\n          </li>\n          <li>\n            <p className={classes.noticePTagBold}>nearMe.Airportウェブサイト上での予約・購入となります。</p>\n            <p className={classes.noticePTag}>ご搭乗便の変更等は自動で引き継がれませんのでご注意ください。</p>\n          </li>\n          <li>\n            <p className={classes.noticePTagRed}>\n              予約リクエストが完了しても予約が確定したわけではありません。nearMeからの「確定メール」をもって予約の確定としています。あらかじめご了承ください。\n            </p>\n          </li>\n          <li>\n            <p className={classes.noticePTag}>フライト遅延・欠航によるキャンセルの場合は請求されません。</p>\n            <p className={classes.noticePTag}>(ご自身にてNearMeに直接お問い合わせいただく必要があります)</p>\n          </li>\n          <li>\n            <p className={classes.noticePTag}> 同乗のお客様もいらっしゃるため、予約時間となりましたら発車いたしますのでご了承ください。(フライト遅延時含む)</p>\n          </li>\n          <li>\n            <p className={classes.noticePTag}>万が一、交通渋滞等でフライト出発時刻に間に合わない場合も、航空券予約の保証はいたしかねます。</p>\n          </li>\n          <li>\n            <p className={classes.noticePTag}>ご乗車の前日15時が予約受付締切となります。</p>\n          </li>\n        </ul>\n      </Grid>\n    )\n  }\n\n    /** マイルに関する注意事項。(下段) */\n  const MileDownArea: React.FC = () => {\n    const mileContactURL = \"https://www.ana.co.jp/ja/jp/site-help/share/contact/mileage_top.html\";\n    const [hyde, setHyde] = useState(true);\n\n    return (\n      <Grid container className={classes.mileAreaBottomStyle}>\n        <Grid item  xs={12} style={{ fontWeight: 'bold', textAlign: 'center' }}>\n          マイルに関するご注意(必ずご確認ください)<br/>\n        </Grid>\n        {!hyde &&\n          <Grid item xs={12} className={classes.noticeArea}>\n            ・本ページを経由してnearMe.Airportウェブサイトにて予約・乗車・支払い完了、かつ、フライト番号欄にANAの便名もしくはAIRDOの便名、またマイレージ番号欄にANAマイレージクラブお客様番号(10桁)をご入力された場合に、通常ご利用金額200円(税込)につき1マイルのところ、1マイルプラスの、200円(税込)につき合計2マイルを積算いたします。<br/>\n            ・参加登録のため一度ログイン画面にてログインをいただきますが、マイル積算にはお手数ですがnearMe.Airportウェブサイトにて再度ANAマイレージクラブお客様番号(10桁)をご入力いただく必要がございます。<br/>\n            ・本画面からのキャンペーンマイル(200円(税込)につき1マイル分)は決済完了から約1~2か月後の積算となり、通常の積算とはタイミングが異なりますのでご注意ください。<br/>\n            ・ご予約成立後に予約をキャンセルされた場合は、マイルは積算されません。また、変更・取り消し手数料はマイル積算の対象外となります。<br/>\n            ・ご入力いただいたANAマイレージクラブお客様番号(10桁)とご名義人が異なる場合は、マイルは積算されません。<br/>\n            ・ご予約完了後のANAマイレージクラブお客様番号(10桁)の訂正、事後登録はお受けできませんので、お申し込みの際はご注意ください。<br/>\n            ・ANAマイレージクラブに関するお問い合わせは<Link href={mileContactURL} target=\"_blank\" className={classes.linkStyle}>こちら</Link>から。<br/>\n          </Grid>\n        }\n        <Grid item style={{ width: '100%', textAlign: 'center' }}>\n          {hyde?\n            <ExpandMoreIcon onClick={ () => { setHyde(!hyde); } } />:\n            <ExpandLessIcon onClick={ () => { setHyde(!hyde); } } />\n          }\n        </Grid>\n      </Grid>\n    )\n  }\n\n  const button: SearviceDetailButton[] = [\n    {\n      label: [\"ANAマイレージクラブに\", \"ログインして予約に進む\"],\n      url: props.loginURL,\n      scClickName: setSCClick,\n      backgroundColor: '#FDB509'\n    },\n    {\n      label: [\"ANAマイレージクラブに\", \"ログインしないで予約に進む\"],\n      url: props.noLoginURL,\n      scClickName: setSCClick,\n      backgroundColor: '#FECF60'\n    }\n  ];\n\n  return <ServiceDetail\n    description={<Description/>}\n    image={<img src={TopImage} className={classes.topImage} alt='NearMeトップ画像' />}\n    logo={<img src={NearmeLog} className={classes.logoImage} alt='NearMeロゴ画像' />}\n    notes={<Notes/>}\n    type={\n      <div className={classes.typeArea}>\n        <Type\n          name={t('rideshare_service')}\n          pricing={priceLabel}\n        />\n      </div>\n    }\n    button={button}\n    noticeMileDown={<MileDownArea/>}\n  />\n\n}\n\nexport default NearMeServiceBody;\n","import { Lang } from \"../../../../states/query\";\nimport FlightInfo from \"../../../../services/ana/models/flightInfo\";\nimport { differenceInCalendarDays } from \"date-fns\";\nimport Place from \"../../../../services/google/Place\";\nimport Airlines, { AirlineList } from \"../../../../utils/Airlines\";\nimport targetLocalityList from \"./data/TargetLocality.json\";\nimport airportParamsList from \"./data/airportParams.json\";\nimport TargetPrefecture from \"./data/TargetPrefecture.json\";\nimport FareTable from \"./data/Fare.json\";\n\nconst TargetLocalityList: { [key in NearMeAirport]: string[] } = targetLocalityList;\n\nexport enum NearMeAirport {\n  /** 成田空港 */\n  NRT = 'NRT',\n  /** 羽田空港 */\n  HND = 'HND',\n  /** 那覇空港  */\n  OKA = 'OKA',\n  /** 福岡空港 */\n  FUK = 'FUK',\n  /** 伊丹空港 */\n  ITM = 'ITM',\n  /** 関西国際空港 */\n  KIX = 'KIX',\n  /** 新千歳空港 */\n  CTS = 'CTS',\n  /** 中部国際空港 */\n  NGO = 'NGO',\n  /** 青森空港 */\n  AOJ = 'AOJ',\n  /** 徳島空港 */\n  TKS = 'TKS',\n  /** 北九州空港 */\n  KKJ = 'KKJ'\n}\n\nexport type Direction = 'from' | 'to';\n\ninterface NearMeParams {\n  direction: string,\n  airport: string,\n  year: string,\n  month: string,\n  day: string,\n  hour: string,\n  minute: string,\n  flight: string,\n  utm_source: string;\n  utm_medium: string;\n  utm_campaign: string;\n  [key: string]: string\n}\n\nexport default class NearMeLogic {\n  /** 空港設定 */\n  airport: NearMeAirport;\n  /** ベースURL */\n  baseURL: string;\n  /** 言語設定 */\n  lang: Lang;\n  /** 出発・目的地 */\n  address: string;\n  /** 空港から/空港まで */\n  direction: Direction;\n  /** 希望空港出発/到着時刻 */\n  hopeAirportDate: {\n    date: Date | null,\n    year: string,\n    month: string,\n    day: string,\n    hour: string,\n    minute: string\n  };\n  /** 搭乗便のフライトナンバー */\n  flightNumber: string;\n  /** ターミナル情報 */\n  terminal: number | null;\n\n  // 英語版が復活する可能性があるため、英語用URLを残しておく\n  static baseURLList = {\n    ja: \"https://app.nearme.jp/airport-shuttle/\",\n    en: \"https://app.nearme.jp/en_us/airport-shuttle/\"\n  }\n\n  static mileLogingHostList = {\n    test: \"https://stg.test.cam.ana.co.jp/psz/fwd/jsp/login_cooperation/shareEcoLoginJa.jsp\",\n    prod: \"https://cam.ana.co.jp/psz/fwd/jsp/login_cooperation/shareEcoLoginJa.jsp\"\n  };\n\n  static utm_source = 'online';\n  static utm_medium = 'web';\n  static utm_campaign = 'ana2020';\n\n  /**\n   * 料金を取得する\n   * @param airport 対象空港\n   * @returns NearMe乗車料金\n   */\n  static getStaticFare(airport: NearMeAirport) {\n    return FareTable[airport];\n  }\n\n  /**\n   * ログイン状態の遷移URLを取得する\n   * @param isTest テスト環境に遷移させるか\n   * @returns ログイン状態の遷移URL\n   */\n  static getLoginURL(isTest: boolean, noLoginURL: string) {\n    const params = {\n      domid: \"se_lp\",\n      seUrl: noLoginURL,\n      companyid: \"nearme\"\n    }\n    const host = isTest? NearMeLogic.mileLogingHostList.test: NearMeLogic.mileLogingHostList.prod;\n    return `${host}?${new URLSearchParams(params).toString()}`;\n  }\n\n  /**\n   * 固定ページにおける非ログインURLを取得する\n   */\n  static getStandPageNoLoginURL() {\n    const params = {\n      direction: 'to',\n      airport: 'haneda',\n      utm_source: this.utm_source,\n      utm_medium: this.utm_medium,\n      utm_campaign: 'anatravel',\n    };\n    const allParams = new URLSearchParams(params);\n    return `${NearMeLogic.baseURLList.ja}?${allParams.toString()}`;\n  }\n\n  // 目的・出発地の空港を割り出す\n  static getAirportFromFlightinfo(flight: FlightInfo, isDepartureGuide: boolean) {\n    const airport = isDepartureGuide? flight.depAirportCode: flight.arrAirportCode;\n    switch(airport){\n      case 'HND':\n      case 'TYO':\n        return NearMeAirport.HND;\n      case 'NRT':\n        return NearMeAirport.NRT;\n      case 'OKA':\n        return NearMeAirport.OKA;\n      case 'FUK':\n        return NearMeAirport.FUK;\n      case 'ITM':\n        return NearMeAirport.ITM;\n      case 'KIX':\n        return NearMeAirport.KIX;\n      case 'SPK':\n      case 'CTS':\n        return NearMeAirport.CTS;\n      case 'NGO':\n        return NearMeAirport.NGO;\n      case 'AOJ':\n        return NearMeAirport.AOJ;\n      case 'TKS':\n        return NearMeAirport.TKS;\n      case 'KKJ':\n        return NearMeAirport.KKJ;\n      default:\n        return null;\n    }\n  }\n  /**\n   * NearMeのバナーを表示するかを判別する関数\n   * @param flightStatus 検索用に取得したAD用フライト情報\n   * @param isDepartureGuide 出発案内か\n   * @param date 検索で指定した日付\n   * @param place ユーザが指定した地点情報\n   */\n  static isDisplayNearMe(flightStatus: FlightInfo, isDepartureGuide: boolean, date: Date, place: Place | null, lang: Lang) {\n    // 以下の条件を満たすこと(2020/11/30現在)\n    // 1.発着空港が成田・羽田・那覇・福岡・大阪\n    // 2.出発・目的地が指定する区内\n    // 3.検索日が搭乗日の前々日まで\n    // 7. 検索画面:クエリ or ANA APIより運行情報が取得できている\n    //    SearchAdより、指定した日付で検索できない場合には flightStatus に初期値が渡されるため\n    //    別途条件を指定しなくても 1. の条件で弾かれる\n    // 8. 搭乗便が欠航していない(検索画面)\n    // 9. 日本語版の場合\n\n    // 1.発着空港が成田・羽田・那覇・福岡・大阪\n    const targetAirport = NearMeLogic.getAirportFromFlightinfo(flightStatus, isDepartureGuide);\n    if(!targetAirport || place === null) {\n      return false;\n    }\n    // 2.出発・目的地が指定する区内\n    if(!this.isDisplayArea(place, targetAirport)) {\n      return false;\n    }\n\n    // 3.検索日が搭乗日の前日の15時まで\n    // NearMeを使うのは到着案内なら到着日、出発案内なら出発日となるので検索で指定した日付をそのまま使える\n    const now = new Date();\n    const diffDays = differenceInCalendarDays(date, now);\n    if(diffDays < 1) {\n      return false;\n    }\n    else if(diffDays === 1) {\n      // 前日15時以降なら連携リンクを表示しない\n      if(now.getHours() >= 15) {\n        return false;\n      }\n    }\n\n    // 8. 搭乗便が欠航していない(検索画面)\n    if(flightStatus.isCanceled()) {\n      return false;\n    }\n\n    // 9. 日本語版の場合\n    if(lang !== Lang.ja) {\n      return false;\n    }\n\n    return true;\n  }\n  /**\n   * 市区町村の文字列を入れ、対象内かを判定する判定\n   * @params locality 市区町村の文字列\n   * @params area 目的地となる空港があるエリア\n   */\n  static isDisplayArea(place: Place, airportCode: NearMeAirport) {\n    const locality = place.city;\n    const targetList = TargetLocalityList[airportCode];\n    const prefectureList: string[] = TargetPrefecture[airportCode];\n    // 沖縄の場合、首里駅で検索した際に「島尻郡那覇市」となるため部分一致にて検索をかける\n    return targetList.find((name)=>{ return locality.indexOf(name) !== -1 }) && prefectureList.includes(place.prefecture);\n  }\n\n  /**\n   * NearMe連携のロジック周りを処理する\n   * @param airport 送迎対象の空港(羽田・成田・那覇・福岡・伊丹・関空)\n   * @param lang 表示する言語\n   * @param isDepartureGuide 空港までの検索か\n   * @param address 出発・目的地点名\n   * @param hopeAirportDate 希望する空港到着時間(出発案内のみ)\n   * @param userSetDate ユーザーが検索欄に入力した日付\n   * @param flightInfo 搭乗便情報\n   * @param isAirdo AIRDOモードであるかを表すフラグ。\n   */\n  constructor(airport: NearMeAirport, isDepartureGuide: boolean, address: string, hopeAirportDate: (Date | null), flightInfo: FlightInfo, targetAirline: AirlineList) {\n    const flightDate = flightInfo.getFlightTimeDate(isDepartureGuide);\n\n    this.baseURL = NearMeLogic.baseURLList.ja;\n    // 空港からの場合\n    if (isDepartureGuide) {\n      this.direction = 'to';\n    } else {\n      this.direction = 'from';\n    }\n    this.address = address;\n    this.airport = airport;\n    // 英語版設定が復活したら引数をもたせて処理する\n    this.lang = Lang.ja;\n    this.hopeAirportDate = {\n      date: hopeAirportDate || flightDate,\n      year: (hopeAirportDate? hopeAirportDate: flightDate).getFullYear().toString(),\n      month: ((hopeAirportDate? hopeAirportDate: flightDate).getMonth()+1).toString(),\n      day: (hopeAirportDate? hopeAirportDate: flightDate).getDate().toString(),\n      hour: hopeAirportDate? hopeAirportDate.getHours().toString(): '',\n      minute: hopeAirportDate? hopeAirportDate.getMinutes().toString(): ''\n    };\n    /** 航空会社コード。 */\n    const airlineCode = Airlines.getAirlineThreeLetterCode(targetAirline);\n    this.flightNumber = airlineCode + flightInfo.flightNumber;\n    // 羽田空港の場合、ターミナル名称に応じてターミナル名を決定\n    if(this.airport === NearMeAirport.HND) {\n      const HNDterminal = flightInfo.getHNDTerminal(isDepartureGuide);\n      // ターミナル未確定の場合には仮でnullとしている\n      if(typeof HNDterminal === \"string\" && HNDterminal === \"2_3\") {\n        this.terminal = null;\n      } else {\n        this.terminal = HNDterminal;\n      }\n    }\n    // 成田空港の場合、第一ターミナルを指定する\n    else if(this.airport === NearMeAirport.NRT) {\n      this.terminal = 1;\n    }\n    else {\n      this.terminal = null;\n    }\n  }\n  /** 非ログイン状態の遷移URLを取得する */\n  getNoLoginURL() {\n    const allParams = new URLSearchParams(this.getParams());\n    return `${this.baseURL}?${allParams.toString()}`;\n  }\n\n  /** リンクに必要なパラメータを返す */\n  getParams(): NearMeParams {\n    let params: NearMeParams = {\n      direction: this.direction,\n      airport: airportParamsList[this.airport],\n      year: this.hopeAirportDate.year,\n      month: this.hopeAirportDate.month,\n      day: this.hopeAirportDate.day,\n      hour: this.hopeAirportDate.hour,\n      minute: this.hopeAirportDate.minute,\n      flight: this.flightNumber,\n      utm_source: NearMeLogic.utm_source,\n      utm_medium: NearMeLogic.utm_medium,\n      utm_campaign: NearMeLogic.utm_campaign\n    };\n    if(this.terminal) {\n      params.terminal = this.terminal.toString()\n    }\n    return params;\n  }\n\n  /** ヘッダー部分の文言を返す */\n  getHeaderMessage(targetKu: string, airportName: string, lang: Lang, t: any){\n    if(lang === Lang.ja) {\n      return this.direction === 'from' ? `${airportName}から${targetKu}まで`: `${targetKu}から${airportName}まで`;\n    } else {\n      return this.direction === 'from' ? `From ${airportName} To ${t(targetKu)}`: `From ${t(targetKu)} To ${airportName}`;\n    }\n  }\n\n  /** 料金を返す */\n  getFare() {\n    return FareTable[this.airport];\n  }\n}\n","import * as React from 'react';\nimport { Button, createMuiTheme, makeStyles, ThemeProvider, Typography, useMediaQuery, Theme, Grid } from '@material-ui/core';\nimport scClick from '../../common/ScClick';\n\ninterface Props {\n  /** Cypressで識別するための名称。 */\n  cyName: string,\n  /** ボタンのラベルの行数 */\n  labels: (string | React.ReactNode)[],\n  /** ボタンの背景色。 */\n  backgroundColor?: string,\n  /** ボタンの文字色。 */\n  color?: string,\n  /** ボタンの見た目の種別。 */\n  variant?: 'text' | 'outlined' | 'contained' | undefined,\n  /** ボタンの種別。 */\n  type?: 'submit' | 'reset' | 'button',\n  /** ボタンの高さ。 */\n  minHeight?: string,\n  /** SCクリック(計測)で利用する名称。 */\n  clickName?: string,\n  /** ボタンの左端に表示するアイコン */\n  startIcon?: React.ReactNode,\n  /** ボタンの右端に表示するアイコン */\n  endIcon?: React.ReactNode\n}\n\n/** このコンポーネント用に上書きしたMaterial UIのテーマ。 */\nconst theme = createMuiTheme({\n  overrides: {\n    MuiButton: {\n      root: {\n        borderRadius: '2px',\n        minHeight: '54px',\n      },\n      contained: {\n        padding: '6px 8px',\n      },\n      outlined: {\n        padding: '6px 8px',\n      },\n      iconSizeMedium: {\n        \"& > *:first-child\": {\n          fontSize: '0.6rem',\n        }\n      }\n    }\n  }\n});\n\n/** デフォルトのボタンの背景色(オレンジ色)のカラーコード。 */\nconst defaultBackgroundColor = '#eb7309';\n\nconst useStylesWithProps = makeStyles({\n  root: (props: Props) => ({\n    // propsで背景色が指定されている場合はその色を、未指定の場合はデフォルトのオレンジ色を設定する。\n    background: props.backgroundColor ? props.backgroundColor: defaultBackgroundColor,\n    // propsで文字色が指定されている場合はその色を、未指定の場合はデフォルトの白色を設定する。\n    color: props.color ? props.color : '#FFFFFF',\n    marginTop: '10px',\n    textTransform: 'none',\n    width: '100%',\n    minHeight: props.minHeight ? props.minHeight : '54px',\n    '&:hover': {\n      // propsで背景色が指定されている場合はその色を、未指定の場合はデフォルトのオレンジ色を設定する。\n      backgroundColor: props.backgroundColor ? props.backgroundColor: defaultBackgroundColor,\n    }\n  }),\n  label: {\n    fontSize: '0.875rem',\n    fontWeight: 'bold',\n  }\n});\n\n/** 区間(Section)で表示するボタンのコンポーネント。 */\nconst ButtonOfSection: React.FC<Props> = (props: Props) => {\n  const classes = useStylesWithProps(props);\n  /** ボタンの種別。 */\n  const type = props.type ? props.type : 'button';\n  /** ボタンの見た目の種別。 */\n  const variant = props.variant ? props.variant : 'contained';\n  /** ボタンの境界線のカラーコード。 */\n  const borderColor = (props.variant === 'outlined' && props.color) ? props.color: undefined;\n\n  /** ボタンをクリックした時の処理。 */\n  const onClick = () => {\n    // クリック名が設定されている場合のみ、SCクリックを実行する。\n    if (props.clickName) { scClick(props.clickName); }\n  }\n\n  return (\n    <ThemeProvider theme={theme}>\n      <Button\n        type={type}\n        variant={variant}\n        onClick={onClick}\n        className={classes.root}\n        data-cy={props.cyName}\n        endIcon={props.endIcon}\n        style={{ borderColor }}\n        startIcon={props.startIcon}\n      >\n        { props.labels.length <= 1 &&\n          // ボタンのラベルが1行である場合。\n          <Typography className={classes.label}>{props.labels[0]}</Typography>\n        }\n        { props.labels.length > 1 &&\n          // ボタンのラベルが2行以上である場合。\n          <div>\n            { props.labels.map((label, id)=>{\n              return (\n                <Typography key={id} className={classes.label}>{label}</Typography>\n              )\n            })}\n          </div>\n        }\n      </Button>\n    </ThemeProvider>\n  )\n};\n\nexport default ButtonOfSection;\n","import * as React from 'react';\nimport { useSelector } from 'react-redux';\nimport { State } from '../../../../reducers';\nimport { Slide, Theme, makeStyles, createStyles, Button, Dialog, List, ListItem } from '@material-ui/core';\nimport NearMeServiceBody from './NearMeServiceBody';\nimport { useTranslation } from 'react-i18next';\nimport { TransitionProps } from '@material-ui/core/transitions';\nimport NearMeLogic, { NearMeAirport } from './NearMeLogic';\nimport scClick from '../../../common/ScClick';\nimport { useLocation } from 'react-router-dom';\nimport ModalHeader from '../../../common/ModalHeader';\nimport { getNearMeAddFeeLabel } from './NearMeModalButton';\n\ninterface Props {\n  openDialog: boolean,\n  onClose: VoidFunction,\n}\n\nconst Transition = React.forwardRef<unknown, TransitionProps>(function Transition(props, ref) {\n  return <Slide direction=\"up\" ref={ref} {...props} />;\n});\n\nconst useStyles = makeStyles((theme: Theme) =>\n  createStyles({\n    appBar: {\n      position: 'relative',\n    },\n    title: {\n      marginLeft: theme.spacing(2),\n      flex: 1,\n    },\n    button: {\n      boxShadow: '0 2px 2px 0 rgba(0,0,0,0.30)',\n      borderRadius: '2px',\n    }\n  }),\n);\n\n/** NearMeのバナーのコンポーネント。 */\nconst NearMeDialog: React.FC<Props> = (props: Props) => {\n  const lang = useSelector((state: State) => state.condition.query.lang);\n  const { t } = useTranslation();\n  const isDepartureGuide = useSelector((state: State) => state.condition.isDepartureGuide);\n  /** 現在のパス。 */\n  const location = useLocation();\n  const pathName = location.pathname;\n  const classes = useStyles({});\n\n  // 使用するフライト情報\n  const flightStatus = useSelector((state: State) => state.condition.flightStatus);\n  const flightStatusForSeachAd = useSelector((state: State) => state.condition.flightStatusForSeachAd);\n  // TODO: Path Classを使って書き直す\n  const isSearch = pathName === '/' || pathName === '/search';\n  const useFlightStatus = isSearch? flightStatusForSeachAd: flightStatus;\n  // 使用するフライト情報が使用できるか\n  const isUseTodayFlightInfo: boolean = (useFlightStatus.eta.getTime() === 0 || useFlightStatus.etd.getTime() === 0);\n  // 地点名\n  const point = useSelector((state: State) => state.condition.point);\n  // 使用する区名\n  const cityName = useSelector((state: State) => state.condition.cityName);\n  // 空港到着時間\n  const arrivalTimeToAirport = useSelector((state: State) => state.condition.arrivalTimeToAirport);\n  /** 対象となるエアライン */\n  const targetAirline = useSelector((state: State) => state.condition.targetAirLine);\n  // 空港到着・出発時刻\n  let hopeAirportDate = (isDepartureGuide && !isUseTodayFlightInfo)? useFlightStatus.getSearchTime(isDepartureGuide, arrivalTimeToAirport): null;\n  // NearMeAirport型で定義される空港コード\n  const airportCode: NearMeAirport | null = NearMeLogic.getAirportFromFlightinfo(useFlightStatus, isDepartureGuide);\n\n  if(!airportCode) {\n    return null;\n  }\n\n  // 表示で出てくる空港の名称\n  const airportName: string = t(airportCode);\n\n  const nearMeLogic = new NearMeLogic(\n    airportCode,\n    isDepartureGuide,\n    point,\n    hopeAirportDate,\n    useFlightStatus,\n    targetAirline\n  );\n\n  /** ダイアログを閉じる場合 */\n  const handleClose = () => {\n    props.onClose();\n  };\n\n  const scClickValue = 'ana-maas_nearme_book';\n\n  const noLoginURL = nearMeLogic.getNoLoginURL();\n  const loginURL = NearMeLogic.getLoginURL(false, noLoginURL);\n\n  return (\n    <Dialog fullScreen open={props.openDialog} onClose={handleClose} TransitionComponent={Transition} scroll='body'>\n      <ModalHeader\n        handleClose={handleClose}\n        title={nearMeLogic.getHeaderMessage(cityName, airportName, lang, t)}\n      />\n      <List>\n        <ListItem>\n          <NearMeServiceBody\n            isDeparture={isDepartureGuide}\n            targetAirport={airportName}\n            fare={nearMeLogic.getFare()}\n            noLoginURL={noLoginURL}\n            loginURL={loginURL}\n            scClick={scClickValue}\n            addFeeLabel={getNearMeAddFeeLabel(airportCode)}\n          />\n        </ListItem>\n        <ListItem>\n          <Button\n            variant=\"contained\"\n            color=\"primary\"\n            className={classes.button}\n            onClick={handleClose}\n          >\n            {t('close')}\n          </Button>\n        </ListItem>\n      </List>\n    </Dialog>\n  )\n};\n\nexport default NearMeDialog;\n","import { subDays, setHours, isAfter, isBefore, setMinutes } from \"date-fns\";\nimport { point, polygon } from \"@turf/helpers\";\nimport booleanPointInPolygon from \"@turf/boolean-point-in-polygon\";\n\nimport sagaSouthAreaPolygon from './data/saga_south_area.json';\n\n/** 佐賀空港タクシーに関する処理のクラス。 */\nexport default class SagaAirportTaxi {\n\n  /** 表示対象の市区町村の名称。 */\n  static readonly MUNICIPALITIES = [\n    '佐賀県鳥栖市',\n    '佐賀県多久市',\n    '佐賀県武雄市',\n    '佐賀県鹿島市',\n    '佐賀県小城市',\n    '佐賀県嬉野市',\n    '佐賀県神埼市',\n    '佐賀県神埼郡吉野ヶ里町',\n    '佐賀県三養基郡基山町',\n    '佐賀県三養基郡上峰町',\n    '佐賀県三養基郡みやき町',\n    '佐賀県西松浦郡有田町',\n    '佐賀県杵島郡大町町',\n    '佐賀県杵島郡江北町',\n    '佐賀県杵島郡白石町',\n    '佐賀県藤津郡太良町',\n    '福岡県久留米市',\n    '福岡県大牟田市',\n    '福岡県柳川市',\n    '福岡県大川市',\n    '福岡県筑後市',\n    '福岡県みやま市',\n    '福岡県三潴郡大木町',\n  ];\n\n  /**\n   * 佐賀空港タクシーのリンクを表示可能であるかを判別する。\n   * @param flightDate 搭乗便の発着日時。\n   * @param address 発着地の市区町村までの住所。(例.佐賀県鳥栖市)\n   * @param lat 発着地の緯度。\n   * @param lng 発着地の経度。\n   */\n  static isDisplayable(flightDate: Date, address: string, lat: number | null, lng: number | null) {\n    // 下記の3つの条件を満たす場合に表示する。\n    // 1. 現在日時が表示期限(2021/04/01 0:00 JST)より前であること。\n    // 2. 現在日時が予約可能な期限(搭乗便の発着日の前日15:00)より後であること。\n    // 3. 搭乗便の発着日が対象期間内(2021/08/01 ~ 2022/03/31まで)であること。\n    // 4. 発着地の住所が対象の市区町村、または佐賀市南エリア内の緯度経度であること。\n    return this.isBeforeDeadline() &&\n      this.isReservable(flightDate) &&\n      this.isTargetPeriod(flightDate) &&\n      (this.isTargetAddress(address) || this.isWithinSagaSouthArea(lat, lng));\n  }\n\n  /** 現在日時が表示期限より前であるかを判別する。 */\n  static isBeforeDeadline() {\n    /** 表示期限。(2021/04/01 0:00 JST) */\n    const deadline = 1648738800000;\n    /** 現在日時のタイムスタンプ。 */\n    const now = new Date().getTime();\n    // 現在日時が表示期限より前(2021/04/01 0:00以前)の場合、trueを返す。\n    return now < deadline;\n  }\n\n  /**\n   * 搭乗便の発着日時を元に予約期限を取得する関数。\n   * @param flightDate 搭乗便の発着日時。\n   */\n   static getReservableDeadline(flightDate: Date) {\n    /** 搭乗便の発着日の前日。(1日前) */\n    const previousDay = subDays(flightDate, 1);\n    /** 搭乗便の発着日の前日の日時の「時」を15時台に設定した値。 */\n    const modifiedHour = setHours(previousDay, 15);\n    /** 搭乗便の発着日の前日の日時の「分」を0分に設定した値。 */\n    const modifiedMinutes = setMinutes(modifiedHour, 0);\n    // 搭乗便の発着日時の前日15:00の日時を返す。\n    return modifiedMinutes;\n  }\n\n  /**\n   * 現在日時が予約可能な日時であるかを判別する。\n   * @param flightDate 搭乗便の発着日時。\n   */\n  static isReservable(flightDate: Date) {\n    /** 予約可能である期限。(搭乗日の前日15:00まで) */\n    const deadline = this.getReservableDeadline(flightDate);\n    /** 現在日時のタイムスタンプ。 */\n    const now = new Date();\n    // 現在日時が予約可能な日時以降であるかを判別する。\n    return isBefore(now, deadline);\n  }\n\n  /**\n   * 搭乗便の発着日時が対象期間であるかを判定する。\n   * @param flightDate 搭乗便の発着日時。\n   */\n  static isTargetPeriod(flightDate: Date) {\n    /** 対象期間の開始日時。(2021/07/01 0:00) */\n    const startDate = new Date(2021, 6, 31, 23, 59);\n    /** 対象期間の終了日時。(2022/04/01 0:00) */\n    const endDate = new Date(2022, 3, 1, 0, 0);\n    // 搭乗日時が対象期間内(2021/08/01 ~ 2022/03/31まで)であること。\n    return isAfter(flightDate, startDate) && isBefore(flightDate, endDate);\n  }\n\n  /**\n   * 指定した緯度経度が佐賀市南エリア内であるかを判定する。\n   * @param lat 緯度。\n   * @param lng 経度。\n   */\n  static isWithinSagaSouthArea(lat: number | null, lng: number | null) {\n    // 緯度経度のいずれかがnullまたは数値ではない場合はfalseを返す。\n    if (lat === null || lng === null || isNaN(lat) || isNaN(lng)) {\n      return false;\n    }\n    /** エリア内であるか判定したい地点。 */\n    const p = point([lng, lat]);\n    /** 佐賀市南エリアのポリゴン。 */\n    const southAreaPolygon = polygon(sagaSouthAreaPolygon.features[0].geometry.coordinates);\n    // 佐賀市南エリアのポリゴン内に指定された地点の座標が含まれるか判定した値を返す。\n    return booleanPointInPolygon(p, southAreaPolygon);\n  }\n\n  /**\n   * 発着地が表示対象の住所であるかを判別する。\n   * @param adress 市区町村までの住所の文字列。(例.佐賀県鳥栖市)\n   */\n  static isTargetAddress(adress: string) {\n    return this.MUNICIPALITIES.some(m => adress.includes(m));\n  }\n}\n","import React from 'react';\nimport { makeStyles, createStyles, Link } from '@material-ui/core';\nimport scClick from '../../../common/ScClick';\nimport { useSelector } from 'react-redux';\nimport { State } from '../../../../reducers';\nimport ButtonOfSection from '../../../result/sections/ButtonOfSection';\nimport { isEnglish } from '../../../../utils/lang';\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    link: {\n      textTransform: 'none',\n      '&:hover': {\n        textDecoration: 'none',\n      }\n    },\n    textInlineBlock: {\n      display: 'inline-block',\n    },\n  }),\n);\n\n/** 佐賀空港タクシーのボタンのコンポーネント。 */\nconst ButtonSagaAirportTaxi: React.FC = () => {\n  const classes = useStyles();\n  /** 言語設定。 */\n  const lang = useSelector((state: State) => state.condition.query.lang);\n  /** 英語版であるかを表すフラグ。 */\n  const isEn = isEnglish(lang);\n  /** リンク先URL。 */\n  // 英語版の場合は英語版URLを、それ以外(日本語版)の場合は日本語版ページのURLを設定する。\n  const url = isEn ?\n    'https://sagaap-limousinetaxi.com/?lang=en' :\n    'https://sagaap-limousinetaxi.com/?lang=jp';\n  /** ボタン内で表示するラベル。 */\n  const label = isEn ?\n    // 英語版のラベル。\n    ['Airport Limousine Taxi', 'Flat rate ¥1,500〜'] :\n    // 日本語版のラベル。\n    // 改行が発生する場合「リムジン」・「タクシー予約」で区切るようスタイル設定した状態でボタン上に展開する。\n    [\n      <>\n        <span key={1} className={classes.textInlineBlock}>リムジン</span>\n        <span key={2} className={classes.textInlineBlock}>タクシー予約</span>\n      </>,\n      <span key={3}>定額 1,500円〜</span>\n    ];\n  /** リンクボタンをクリックしたときの処理。 */\n  const onClick = () => {\n    // SCクリックを実行する。\n    scClick('ana-maas_sagataxi_button_result');\n  }\n\n  return (\n    <Link\n      href={url}\n      target='_blank'\n      className={classes.link}\n      onClick={onClick}\n    >\n      <ButtonOfSection\n        labels={label}\n        backgroundColor='#FDB50A'\n        color='#0f0f0f'\n        cyName='button_saga_taxi'\n      />\n    </Link>\n  )\n}\n\nexport default ButtonSagaAirportTaxi;\n","import { Grid, Link, makeStyles } from \"@material-ui/core\";\nimport React, { useEffect, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { useSelector } from \"react-redux\";\nimport { State } from \"../../../reducers\";\nimport { getClosedGeocode } from \"../../../services/google/api\";\nimport Place from \"../../../services/google/Place\";\nimport { convertStringToTaxiCompany, TaxiCompanyList, TaxiFareSummary } from \"../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams\";\nimport { CommonTaxiUtils } from \"../../ad/OtherServices/CommonTaxi/CommonTaxiDateUtils\";\nimport scClick from \"../../common/ScClick\";\nimport ButtonOfSection from \"../sections/ButtonOfSection\";\nimport { toLuxonDateTimeFronJSDate } from \"../../../utils/luxonUtil\";\n\ninterface Props {\n  // タクシー料金\n  fee: TaxiFareSummary,\n  // お迎え時間(タクシー区間の出発時間)\n  depTime?: Date,\n  // タクシー会社名表示 Add 2022.10.12\n  displayTaxiCompany?: boolean,\n  // 運賃ラベル指定\n  labelFare?: string\n}\n\nconst useStyles = makeStyles(() => ({\n  summary: {\n    color: '#0B308E'\n  },\n  alink: {\n    textDecoration: \"none\"\n  },\n}));\n\n// タクシー予約ボタン\nexport const TaxiReserversButton: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  const flightStatus = useSelector((state: State) => state.condition.flightStatus);\n  const isDepartureGuide = useSelector((state: State) => state.condition.isDepartureGuide);\n  const point = useSelector((state: State) => state.condition.point);\n  const flight = useSelector((state: State) => state.condition.flight);\n  const place = useSelector((state: State) => state.condition.place);\n  const lang = useSelector((state: State) => state.condition.query.lang);\n  const taxiCompanyConfigurations = useSelector((state: State) => state.general.taxiCompanyConfigurations);\n  const airportCode = flightStatus.getFixTerminalCode(isDepartureGuide);\n  const isDomestic = flightStatus.isDomestic;\n  const [ url, setURL ] = useState('');\n  const { t } = useTranslation();\n  /** 対象の会社 */\n  const company: TaxiCompanyList | null = convertStringToTaxiCompany(props.fee.companyCode)\n  /** 緯度。(地点情報が存在しない場合はnullを代入する。) */\n  const lat = place ? Number.parseFloat(place.lat) : null;\n  /** 経度。(地点情報が存在しない場合はnullを代入する。) */\n  const lng = place ? Number.parseFloat(place.lng) : null;\n\n  // URLをセットする\n  const generateURL = (localLangPlace?: Place) => {\n    if(props.fee === undefined || lat === null || lng === null || place === null || !props.depTime) {\n      return '';\n    }\n    /** 空港側の座標情報 */\n    // TODO: 型を定義する\n    let paramsObj: any = {\n      isDeparture: isDepartureGuide.toString(),\n      // 英語版では英語アドレスを設定する\n      pointAddress: localLangPlace? localLangPlace.getFullAddress(lang): place.getFullAddress(lang),\n      pointName: point,\n      pointLat: lat.toString(),\n      pointLng: lng.toString(),\n      isDomestic: isDomestic.toString(),\n      terminal: flightStatus.getTerminal(isDepartureGuide).toString(),\n      gate: flightStatus.bordingGate,\n      airportCode: airportCode,\n      flightNumber: flight,\n      flightDate: flightStatus.getFlightTimeDate(isDepartureGuide).getTime().toString(),\n      rideDate: props.depTime.getTime().toString(),\n      company: company,\n      referrer: 'airport_access',\n      lang: lang,\n      pointJPAddress: place.getFullAddress(),\n      pointJPName: place.name || ''\n    }\n    const mode = props.fee.mode;\n    if(mode && mode !== '') {\n      paramsObj = {\n        ...paramsObj,\n        mode: mode\n      }\n    }\n    const params = new URLSearchParams(paramsObj);\n    const url = `/booking-taxi/?${params.toString()}`;\n    setURL(url);\n  }\n\n  useEffect(() => {\n    generateURL();\n    // 現地語の住所を取得して入れ込む(場所はここで正しいか確認する必要あり)\n    getClosedGeocode(`${lat},${lng}`, lang)\n    .then((places) => {\n      const enPlace: Place = places[0];\n      generateURL(enPlace);\n    })\n  }, []);\n\n  if(company === null || taxiCompanyConfigurations === undefined) {\n    return null;\n  }\n\n  const taxiCompanyConfiguration = taxiCompanyConfigurations[company];\n  const limit = taxiCompanyConfiguration.limit;\n  /** 対象となる空港名 */\n  const targetAirport = isDepartureGuide? flightStatus.depAirportCode: flightStatus.arrAirportCode;\n  const commonTaxiUtils = new CommonTaxiUtils(limit.limitDays, limit.limitHours, company, targetAirport);\n\n  /** 宮交タクシーが利用可能な経路かを判別する。 */\n  const isAvalableMiyakoTaxi = (() => {\n    // 以下の条件を満たす場合、利用可能として扱う。\n    // 1. この経路がタクシー経路かつリアルタイム情報(過去の検索)ではないこと。\n    // 2. 現在日時が宮交タクシー予約可能な日付(搭乗日の3日前の17時より前)であること。\n    // 3. 日本語版であること。\n    // 4. 宮交タクシーの料金が取得できるか\n    // 5-1. 出発案内の場合は出発空港が宮崎空港であること。\n    // 5-2. または到着案内の場合は到着空港が宮崎空港であること。\n    return ((isDepartureGuide && flightStatus.depAirportCode === \"KMI\") ||\n      (isDepartureGuide === false && flightStatus.arrAirportCode === \"KMI\"));\n  })();\n  /** タクシーが利用可能かを判別する */\n  // 以下の条件を満たす場合、利用可能として扱う。\n  // 1. この経路がタクシー経路かつリアルタイム情報(過去の検索)ではないこと。\n  // 2. 現在日時がタクシー予約可能な日付(搭乗日のX日前のXX時より前)であること。\n  // 3. 日本語版であること。\n  // 料金や座標・出発時刻・Place情報が取れない時にはボタンを出さない\n  if(props.fee === undefined || lat === null || lng === null || place === null || !props.depTime) {\n    return null;\n  }\n  // 予約可能な日付でない場合には出さない\n  const isAvalableDateTaxi = commonTaxiUtils.isAvalable(\n      toLuxonDateTimeFronJSDate(\n        flightStatus.getFlightTimeDate(isDepartureGuide)\n      )\n    )\n  if(!isAvalableDateTaxi) {\n    return null;\n  }\n  // 宮交連携かつ、宮交タクシー利用可能条件を満たさない場合には表示しない\n  if(company === TaxiCompanyList.miyakou && !isAvalableMiyakoTaxi ) {\n    return null;\n  }\n  // 料金を取得できない場合には出さない\n  if(!props.fee.fareInfo.totalValue) {\n    return null;\n  }\n  // 伊予鉄タクシーがキャンペーン期間中か判定する\n  const isIyotetsuMileageCampaign = ((flightDate: Date) => {\n    // 搭乗日が22/12/08~23/2/28の方のみ文言を変える\n    const start = new Date('2022-12-07T23:59+09:00');\n    const end   = new Date('2023-03-01T00:00+09:00');\n    if(flightDate.getTime() > start.getTime() && flightDate.getTime() < end.getTime()) {\n      return true\n    }\n    return false\n  })\n\n  const flightDate = flightStatus.getFlightTimeDate(isDepartureGuide);\n  let fareLabel = props.fee.fareInfo.fareLabel;\n\n  // 運賃ラベル文言指定 Add 2022.10.12\n  if (props.labelFare) {\n    fareLabel = props.labelFare\n  }\n\n  /** タクシー予約ボタンの1行目に表示するラベル */\n  const firstLabel = (()=>{\n    // タクシー会社名表示 Add 2022.10.12\n    if (props.displayTaxiCompany) {\n      return (taxiCompanyConfigurations[company].displayName) + (props.labelFare ? 'の' : '')\n    }\n    const taxiCompanyFirstLabel: { [key in TaxiCompanyList]: string } = {\n      // 那覇ハイヤーの場合には「ハイヤー予約」にする\n      nahahire: t('taxi:reserve_hire'),\n      // イースタンの場合にはラベルなしにする\n      limoTaxi: '',\n      iyotetsutaxi: '',\n      // 伊予鉄タクシーメーターの場合には「マイルも貯まる!」の文言を入れる\n      // ダブルマイルキャンペーン中は文言を変える\n      iyotetsuTaxi2: isIyotetsuMileageCampaign(flightDate) ? t('taxi:double_mile_campaign') : t('taxi:save_mile'),\n      // 函館タクシー・旭川中央交通の場合には「マイルが貯まる!」の文言を入れる\n      Asahikawachuuo: t('taxi:mile_ga_tamaru'),\n      hakodateTaxi: t('taxi:mile_ga_tamaru'),\n      // 福島空港タクシー郡では「乗合タクシー予約」と入れる\n      daiwaj: t('taxi:noriai_taxi_reserve'),\n      kitafukushima: t('taxi:noriai_taxi_reserve'),\n      fukushimachuo: t('taxi:noriai_taxi_reserve'),\n      iwakiTaxi: t('taxi:noriai_taxi_reserve'),\n      'uchi-go': t('taxi:noriai_taxi_reserve'),\n      tajimaTaxi: t('taxi:noriai_taxi_reserve'),\n      kinugawaTaxi: t('taxi:noriai_taxi_reserve'),\n      hokutocab: t('taxi:noriai_taxi_reserve'),\n      yotoTaxi: t('taxi:noriai_taxi_reserve'),\n      // その他のタクシーでは「タクシー予約」と入れる\n      miyakou: t('taxi:reserve_taxi'),\n      ubeSanden: t('taxi:reserve_taxi'),\n      eastern: t('taxi:reserve_taxi'),\n      hinomaru: t('taxi:reserve_taxi'),\n      nangoku: t('taxi:reserve_taxi'),\n      gotaku: t('taxi:reserve_taxi'),\n      ishikawakotsu: t('taxi:reserve_taxi'),\n      // 土電ハイヤーでは「マイルが貯まる!」と入れる\n      toden: t('taxi:mile_ga_tamaru'),\n      // キングタクシーは「乗合タクシー」と入れる\n      kingTaxi: t('taxi:noriai_taxi_reserve'),\n      kingTaxi2: t('taxi:noriai_taxi_reserve'),\n      // 宇部構内タクシーでは「マイルが貯まる!」と入れる\n      ubeKounai: t('taxi:mile_ga_tamaru'),\n      // 通津タクシーでは「マイルが貯まる!」と入れる\n      tsuzutaxi: t('taxi:mile_ga_tamaru'),\n      // 酒田タクシーでは「乗合タクシー」と入れる\n      sakataNo1Taxi: t('taxi:noriai_taxi_reserve'),\n      //庄交ハイヤーでは「乗合タクシー」\n      shokoHire: t('taxi:noriai_taxi_reserve'),\n      // 秋田エアポートライナーでは「定額乗合タクシー予約」と入れる\n      airport_liner: t('taxi:fixed_fare_noriai_taxi_reserve'),\n      // にかほGOでは「定額乗合タクシー予約」と入れる\n      nikaho_go: t('taxi:fixed_fare_noriai_taxi_reserve'),\n      // 検証用の場合には「タクシー予約検証用」と入れる\n      dummyVal: 'タクシー予約検証用'\n    }\n    return taxiCompanyFirstLabel[company];\n  })()\n\n  /** タクシー予約2行目のラベルを入れる */\n  const secondLabel = (()=>{\n    switch(company) {\n      case TaxiCompanyList.iyotetsutaxi:\n        // 伊予鉄の場合には「マイルも貯まる! 空港送迎ハイヤー」と表示する\n        if((company === TaxiCompanyList.iyotetsutaxi)) {\n          // ダブルマイルキャンペーン中は文言を変える\n          if(isIyotetsuMileageCampaign(flightDate)){\n            return t('taxi:double_mile_campaign');\n          }\n          return t('taxi:save_mile');\n        }\n        else {\n          return '';\n        }\n      // 伊予鉄タクシーメーターの場合には「マイルも貯まる!」の文言を入れる\n      case TaxiCompanyList.iyotetsuTaxi2:\n        return t('taxi:reserve_taxi');\n      case TaxiCompanyList.limoTaxi:\n      case TaxiCompanyList.eastern:\n        // マイルが貯まる!\n        const targetAirportMileGaTamaru = [\"HND\",\"NRT\",\"TYO\"];\n        // マイル連携あり\n        const targetAirportMileRenkeiAri = [\"KIX\",\"ITM\",\"UKB\"];\n        if(targetAirportMileGaTamaru.includes(airportCode)) {\n          // 搭乗日が 3/9 - 4/30: 「今ならダブルマイル!」\n          const start = new Date('2022-03-09T00:00+09:00');\n          const end   = new Date('2022-05-01T00:00+09:00');\n          // 端末日付が 3/9 15:00 以降\n          const nowTimeStart = new Date('2022-03-09T15:00+09:00');\n          const now = new Date();\n          if(flightDate.getTime() > start.getTime() && flightDate.getTime() < end.getTime() && now.getTime() > nowTimeStart.getTime() ) {\n            return t('taxi:double_mile');\n          }\n          return t('taxi:mile_ga_tamaru')\n        }\n        // マイル連携あり\n        if(targetAirportMileRenkeiAri.includes(airportCode)) {\n          return t('taxi:have_mile')\n        }\n        return '';\n      // 函館タクシー・旭川中央交通の場合には「タクシー予約」の文言を入れる\n      case TaxiCompanyList.Asahikawachuuo:\n      case TaxiCompanyList.hakodateTaxi:\n        return t('taxi:reserve_taxi');\n      default:\n        return '';\n    }\n  })();\n\n  const labels = [\n    firstLabel,\n    secondLabel,\n    // イースタンの場合には「空港送迎ハイヤー」と表示する\n    ([TaxiCompanyList.limoTaxi, TaxiCompanyList.iyotetsutaxi].includes(company))? t('taxi:airport_hire'): '',\n    fareLabel\n  ]\n\n  const cyName = taxiCompanyConfiguration? taxiCompanyConfiguration.cyName.result: '';\n  // 結果画面で予約ボタンを押した時のSCクリック値\n  const scClickValue = taxiCompanyConfiguration? taxiCompanyConfiguration.scClick.result: '';\n  const onClick = () => {\n    if(scClickValue !== '' || company !== TaxiCompanyList.dummyVal) {\n      scClick(scClickValue);\n    }\n  }\n\n  return (\n    <Grid item className={classes.summary}>\n      <Link\n        href={url}\n        target='_blank'\n        className={classes.alink}\n        onClick={onClick}\n      >\n        <ButtonOfSection\n          cyName={cyName}\n          backgroundColor='#fdb409'\n          color='#000000'\n          labels={labels}\n        />\n      </Link>\n    </Grid>\n  )\n}\n","import { addMinutes, format, subMinutes } from \"date-fns\";\nimport { UniversalMaaSQuery } from \"../../states/universalMaaSQuery\";\nimport { ArrivalGateToStation } from \"../ana/data/arrivalGateToStation\";\nimport { ArrivalGateToStationInt } from \"../ana/data/arrivalGateToStationInt\";\nimport FlightInfo from \"../ana/models/flightInfo\";\nimport Place from \"../google/Place\";\n\nexport interface MkTaxiParams {\n  landmark: string,\n  lat: string,\n  lng: string,\n  agent: string,\n  dpdate: string,\n  pattern: string,\n  flno: string,\n  fldate: string,\n  // サポートリクエストID\n  other2?: string,\n  // 車椅子区分\n  other3?: string,\n  // Universal Access code\n  uaccess?: string\n}\nexport interface MkTaxiUMParams {\n  // 車椅子区分\n  other3?: string\n}\nexport interface CarLoadingLimit{\n  // 奥行最大(ds6)\n  DepthLimit: number,\n  // 横幅最大(ds7)\n  WidthLimit: number,\n  // 高さ最大(ds8)\n  HeightLimit: number,\n  // 乗車定員(um3)\n  PassengerLimit: number,\n  // 重量最大(ds10)\n  WeightLimit: number,\n}\n\nexport default class MKTaxiClass {\n  static baseURL: any = {\n    'dev': 'https://taxism02w.meitetsucom.co.jp/mk/AirportTransferOrdering/',\n    'prod': 'https://secure2.mk-group.co.jp/AirportTransferOrdering/'\n  }\n  static ANAMileageClubURL: any = {\n    'dev': 'https://stg.test.cam.ana.co.jp/psz/fwd/jsp/login_cooperation/shareEcoLoginJa.jsp',\n    'prod': 'https://cam.ana.co.jp/psz/fwd/jsp/login_cooperation/shareEcoLoginJa.jsp'\n  }\n  static HireURL: string = 'https://secure.mk-group.co.jp/airport-hire.ana/';\n  static landmarkAirportList: string[] = ['SPK', 'NGO', 'ITM', 'KIX', 'UKB', 'FUK', '', 'NRT', 'HND'];\n\n  static getHost = () => {\n    return MKTaxiClass.baseURL.prod;\n  }\n\n  static getANAMileageClubHost = () => {\n    return MKTaxiClass.ANAMileageClubURL.prod;\n  }\n\n  static SerenaLimit: CarLoadingLimit ={\n    DepthLimit: 124.5,\n    WidthLimit: 66,\n    HeightLimit: 118,\n    PassengerLimit: 4,\n    WeightLimit: 325\n  }\n\n  static AlphardLimit: CarLoadingLimit ={\n    DepthLimit: 115,\n    WidthLimit: 33,\n    HeightLimit: 96,\n    PassengerLimit: 5,\n    WeightLimit: 390\n  }\n\n  /**\n   * 空港コードより、東京周辺の空港(羽田・成田)であることを判定する\n   * @param airportCode 判別する空港コード\n   * @returns\n   */\n  static isTYO = (airportCode: string) => {\n    return airportCode === 'HND' || airportCode === 'NRT' || airportCode === 'TYO';\n  }\n\n  /** ハイヤーの料金を取得する(暫定的) */\n  static getHirePrice = (place: Place, airportCode: string) => {\n    // ハイヤーは羽田、成田ともに、到着地(バナーの場合は出発地も)は「東京、千葉、神奈川、埼玉、茨城」の場合のみ、ボタンとバナーに金額表示する\n    const targetPrefectureList = ['東京都', '千葉県', '神奈川県', '埼玉県', '茨城県'];\n    if(targetPrefectureList.includes(place.prefecture)) {\n      // 羽田では13000円\n      if(airportCode === 'HND') {\n        return 13000;\n      }\n      else {\n        // 成田では\n        // 千葉県の場合はエリア判別して=「10,000円~」\n        // 「東京、神奈川、埼玉、茨城」=「30,000円~」\n        return place.prefecture === '千葉県'? 10000: 30000;\n      }\n    }\n    return 0;\n  }\n  /** ハイヤーのリンクを表示する判定 */\n  static isHireCar = (flightStatus: FlightInfo, isDepartureGuide: boolean, isBanner: boolean)=> {\n    // const targetAirports = ['TYO', 'NRT', 'HND'];\n    // // 羽田または成田の国際線の場合\n    // // 国際線の到着時はバナー・ボタン両方ともハイヤー\n    // // 国際線の出発時はバナーはハイヤーでボタンはタクシー\n    // if (targetAirports.indexOf(flightStatus.arrAirportCode) && !flightStatus.isDomestic) {\n    //   if(isDepartureGuide) {\n    //     return isBanner;\n    //   }\n    //   else {\n    //     return true;\n    //   }\n    // }\n    // 2022/04/26: 無条件でタクシーを表示する\n    return false;\n  }\n  /** MKタクシーのANAマイレージクラブログイン用URLを設定する */\n  static MKTaxiANAMileageClubURL = (mkTaxiURL: string, airportCode: string): string => {\n    const targetAirports = ['TYO', 'NRT', 'HND'];\n    const useUrl = MKTaxiClass.getANAMileageClubHost();\n    const params = {\n      domid: 'se_lp',\n      seUrl: mkTaxiURL,\n      companyid: (targetAirports.indexOf(airportCode) !== -1)? 'tokyomk': 'mktaxi'\n    }\n    return `${useUrl}?${new URLSearchParams(params)}`;\n  }\n  /**\n   * MKタクシーの遷移先URLを設定する\n   * @param flightStatus 搭乗便の運航情報。\n   * @param isDepartureGuide 出発案内であるかのフラグ。\n   * @param arrivalTimeToAirport 空港到着時間。\n   * @param place 発着地情報。\n   * @param isHire ハイヤーであるかのフラグ。\n   * @param airlineCode 航空会社コード。\n   * */\n  static getMkTaxiUrl = (flightStatus: FlightInfo, isDepartureGuide: boolean, arrivalTimeToAirport: number, place: Place, isHire: boolean, airlineCode: string, other3?: string) => {\n    if (isHire) {\n      return MKTaxiClass.HireURL;\n    }\n\n    const airportName = isDepartureGuide ? flightStatus.depAirportName : flightStatus.arrAirportName;\n    let airportCode = isDepartureGuide? flightStatus.depAirportCode : flightStatus.arrAirportCode;\n\n    // 空港コードがTYOの場合\n    if (airportCode === 'TYO') {\n      if (airportName.includes('Haneda')) {\n        // Hanedaが含まれていたら、羽田空港とする\n        airportCode = 'HND';\n      } else if (airportName.includes('Narita')) {\n        // Naritaが含まれていたら、成田空港とする\n        airportCode = 'NRT';\n      }\n    }\n\n    // 新千歳空港が、CTSの場合があるため、SPKとする\n    if (airportCode === 'CTS') {\n      airportCode = 'SPK';\n    }\n\n    const landmark = MKTaxiClass.landmarkAirportList.indexOf(airportCode);\n\n    // 配車日時\n    const departureTime: Date = flightStatus.getFlightTimeDate(isDepartureGuide);\n    const flightTime = format(departureTime, 'yyyyMMddHHmm');\n\n    let depDate = departureTime;\n    if (departureTime.toString() !== 'Invalid Date') {\n      if (isDepartureGuide) {\n        // 便出発時間 - お客様が入力した到着希望時間 - 1時間\n        depDate = subMinutes(departureTime, arrivalTimeToAirport + 60);\n      } else {\n        // 空港から検索\n        // 便到着時間 + アクセスナビの検索設定時間\n        //(国内は羽田、成田、伊丹、関西、福岡、千歳、中部、那覇が30分、それ以外は20分、国際はHND:40分 NRT:60分 KIX:40分)\n        let minutes = 0;\n        // 国内線の場合。\n        if (flightStatus.isDomestic) {\n          minutes = ArrivalGateToStation[airportCode];\n        // 国際線の場合。\n        } else {\n          // 指定された空港だった場合は別ファイルで設定された空港ごとの値を参照し、指定外の空港の場合は0とする。\n          // minutes = SPECFIED_AIRPORTS_INT.includes(this.arrAirportCode) ? this.getArrivalGateToStationInt() : 0;\n          minutes = ArrivalGateToStationInt[airportCode];\n        }\n        if(minutes !== undefined) {\n          depDate = addMinutes(departureTime, minutes);\n        }\n      }\n    }\n\n    /** 便名。 */\n    const flightNumber = `${airlineCode}${flightStatus.flightNumber}`;\n\n    let params: MkTaxiParams = {\n      landmark: String(landmark + 1),\n      lat: place.lat,\n      lng: place.lng,\n      agent: 'ana',\n      dpdate: format(depDate, 'yyyyMMdd'),\n      pattern: isDepartureGuide? \"0\": \"1\",\n      flno: flightNumber,\n      fldate: flightTime,\n      uaccess: other3 !== undefined? '1': '0'\n    }\n    if(other3){\n      params.other3 = other3;\n    }\n    return MKTaxiClass.generateMkTaxiParamsToURL(params)\n  }\n\n  static generateMkTaxiParamsToURL = (params: MkTaxiParams) => {\n    // eslint-disable-next-line\n    return `${MKTaxiClass.getHost()}?${new URLSearchParams(<string><unknown>params)}`\n  }\n\n  static generateMkTaxiUMParamsToURL = (params: MkTaxiUMParams) => {\n    // eslint-disable-next-line\n    return `${MKTaxiClass.getHost()}?${new URLSearchParams(<string><unknown>params)}`\n  }\n  static landmarkToAirportCode = (landmark: number) => {\n    return MKTaxiClass.landmarkAirportList[landmark];\n  }\n  // 各車種の制限を超えるか\n  static getIsOverCarLoading = (umQuery: UniversalMaaSQuery, carLimit:CarLoadingLimit, um2:string) => {\n    if(!umQuery.ds6 || !umQuery.ds7 || !umQuery.ds8 || !umQuery.ds9 || !umQuery.ds10 || !umQuery.ds11 || !um2) {\n      return null;\n    }\n    // cmに変換\n    const toCm = (length: string, unit: string) => {\n      if(unit === '1') {\n        return Number(length);\n      }\n      else {\n        return Number(length) * 2.54;\n      }\n    }\n    // kgに変換\n    const toKg = (weight: string, unit: string) => {\n      if(unit === '1') {\n        return Number(weight);\n      }\n      else {\n        return Number(weight) * 0.45359237;\n      }\n    }\n    // 乗車人数最大\n    const PassengerLimit = carLimit.PassengerLimit\n    // 乗車人数\n    const passengers = parseInt(um2)\n    // 奥行最大(ds6)\n    const DepthLimit = carLimit.DepthLimit;\n    // 横幅最大(ds7)\n    const WidthLimit = carLimit.WidthLimit;\n    // 高さ最大(ds8)\n    const HeightLimit = carLimit.HeightLimit;\n    // 重量最大(ds10)\n    const WeightLimit = carLimit.WeightLimit - (55 * (passengers + 1));\n    // 奥行\n    const depth = toCm(umQuery.ds6, umQuery.ds9);\n    // 横幅\n    const width = toCm(umQuery.ds7, umQuery.ds9);\n    // 高さ\n    const height = toCm(umQuery.ds8, umQuery.ds9);\n    // 重量\n    const weight = toKg(umQuery.ds10, umQuery.ds11);\n    // どれか制限を超過していたらにはTrueを返す\n    return (depth > DepthLimit) ||\n      (width > WidthLimit) ||\n      (height > HeightLimit) ||\n      (weight > WeightLimit) ||\n      (passengers > PassengerLimit);\n  }\n\n  static getOther3ByBinary = (umQuery: UniversalMaaSQuery) => {\n    if(!umQuery.ds1 || !umQuery.ds3) {\n      return null;\n    }\n    const um1 = umQuery.um1 || '0';\n    const um2 = umQuery.um2 || '0';\n    const um3 = umQuery.um3 || '0';\n    // お客様の特性情報\n    const other3Part0 = umQuery.ds1;\n    // 車いす区分\n    let other3Part1;\n    let isTargetUser = false;\n    if(umQuery.ds1){\n      const ds1List = umQuery.ds1.split(\"_\");\n      for(const ds1 of ds1List){\n        if(['1', '2', '3'].includes(ds1)) {\n          isTargetUser = true;\n        }\n      }\n    }\n    other3Part1 = '0';\n    if(umQuery.ds4 && (['E', 'M'].includes(umQuery.ds4)) && isTargetUser) {\n      other3Part1 = umQuery.ds4;\n    }\n    // 車種区分\n    let binary1 = '0';\n    let binary2 = '0';\n    let binary3 = '0';\n    let binary4 = '0';\n\n    // ds3=1(折り畳み可)かつ、ds6~ds11がアルファード乗車制限内の場合、binary4に1を設定する\n    const isOverAlphard = MKTaxiClass.getIsOverCarLoading(umQuery, MKTaxiClass.AlphardLimit, um2);\n    // 必要パラメーターが足りないときには空文字を返す\n    if(isOverAlphard === null){\n      return null;\n    }\n    if(umQuery.ds3 === '1' && !isOverAlphard){\n      binary4 = '1';\n    }\n    // ds3=0(折り畳み不可)かつ、ds6~ds11がセレナ乗車制限内の場合、binary3に1を設定する\n    const isOverSerena = MKTaxiClass.getIsOverCarLoading(umQuery, MKTaxiClass.SerenaLimit, um2);\n    // 必要パラメーターが足りないときには空文字を返す\n    if(isOverSerena === null){\n      return null;\n    }\n    if(umQuery.ds3 === '0' && !isOverSerena){\n      binary3 = '1';\n    }\n    // ds3=1(折り畳み可能)の場合と車いすユーザ以外の場合、binary2に1を設定する\n    if((umQuery.ds3 === '1' || !isTargetUser) && (!isOverAlphard || !isOverSerena)){\n      binary2 = '1';\n    }\n    // 上記すべての値が0の時、binary1に1を設定する\n    if(binary2 === '0' && binary3 === '0' && binary4 === '0'){\n      binary1 = '1';\n    }\n    // binary5~binary1までを2進数の桁として10進数に変換する(一桁の場合は0を補完する)\n    let other3Part2: any = parseInt(binary4 + binary3 + binary2 + binary1, 2);\n    if(other3Part2 < 10){\n      other3Part2 = '0' + other3Part2;\n    } else {\n      other3Part2 = other3Part2.toString();\n    }\n    const other3: string = other3Part0 + other3Part1 + other3Part2 + um1 + um2 + um3;\n    return other3;\n  }\n\n  static switchTextUmQuery = (umQuery: UniversalMaaSQuery) => {\n    const umQueryText = {\n      ds1: [''],\n      ds3: '',\n      ds4: '',\n      ds9: '',\n      ds11: '',\n      um1: '',\n      um2: '',\n      um3: ''\n    }\n    if(umQuery.ds1){\n      const ds1List = umQuery.ds1.split(\"_\");\n      let ds1TextList:string[] = []\n      for(const ds1 of ds1List){\n        ds1TextList.push((()=>{\n          switch(ds1) {\n            case '1': return '階段の昇り降りはできるが、長距離の歩行はできない';\n            case '2': return '機内の移動はできるが、階段の昇り降りはできない';\n            case '3': return '歩行ができない(機内の座席近くまで車いすを利用し、移乗の介助が必要)';\n            case '4': return '目に不自由がある';\n            case '5': return '耳や言葉に不自由がある';\n            case '6': return '機内で医療用酸素ボンベ・酸素濃縮器・人工呼吸器の使用が必要である(診断書が必要)';\n            case '7': return '妊娠中で出産予定日を含め28日以内のご搭乗である(診断書が必要)';\n            default: return '';\n          }\n        })())\n      }\n      const isAllBlank = (ds1Text: string) => ds1Text === '';\n      if(ds1TextList.every(isAllBlank)){\n        ds1TextList = ['-'];\n      }\n      umQueryText.ds1 = ds1TextList;\n    }\n    const toText = (val: string | undefined, case1: string, case2: string, text1: string, text2: string):string => {\n      switch(val) {\n        case case1: return text1;\n        case case2: return text2;\n        default: return '-';\n      }\n    }\n    umQueryText.ds3 = toText(umQuery.ds3,'0','1','いいえ','はい');\n    umQueryText.ds4 = toText(umQuery.ds4,'M','E','手動','電動');\n    umQueryText.ds9 = toText(umQuery.ds9,'1','2','cm','inch');\n    umQueryText.ds11 = toText(umQuery.ds11,'1','2','kg','lb');\n    umQueryText.um1 = (()=>{\n      switch(umQuery.um1) {\n        case '1': return 'あり';\n        case '2': return 'なし';\n        case undefined: return '-';\n        default: return '不明';\n      }\n    })()\n    umQueryText.um2 = umQuery.um2 === undefined? '-': umQuery.um2.toString();\n    umQueryText.um3 = (()=>{\n      switch(umQuery.um3) {\n        case '1': return '座席乗車';\n        case '2': return '車椅子のまま乗車';\n        case undefined: return '-';\n        default: return '不明';\n      }\n    })()\n    return umQueryText\n  }\n}\n","import React, { useState } from 'react';\nimport { createStyles, Grid, AppBar, makeStyles, Theme, Modal, Toolbar, Typography, Button, Checkbox, FormGroup, FormControlLabel, Link } from '@material-ui/core';\nimport { TaxiPrice } from '../../../../services/mktaxi/data/PriceList';\nimport { State } from \"../../../../reducers\";\nimport { useSelector, useDispatch } from \"react-redux\";\nimport MkTaxiService from './MkTaxiService';\nimport FlightInfo from '../../../../services/ana/models/flightInfo';\nimport Place from '../../../../services/google/Place';\n\nimport MKTaxiClass, { MkTaxiParams } from '../../../../services/mktaxi/util';\nimport { switchIsShowUMModal } from '../../../../actions/conditionAction';\nimport ModalHeader from '../../../common/ModalHeader';\n\ninterface Props {\n  price?: TaxiPrice,\n  flightStatus: FlightInfo,\n  isDepartureGuide: boolean,\n  arrivalTimeToAirport: number,\n  place: Place\n  isHireLink: boolean,\n  airlineCode: string,\n  airportCode: string,\n  /** 羽田or成田発着か */\n  isTYO: boolean,\n  /** バリアフリー用のイメージを表示するか */\n  isShowBarrierFreeImage?: boolean,\n  /** モーダルの開閉フラグを引数により制御させる */\n  isOpen: boolean,\n  /** モーダルの開閉フラグを引数により制御させる */\n  isSetOpen: React.Dispatch<React.SetStateAction<boolean>>,\n}\n\nconst useStyles = makeStyles((theme: Theme) =>\n  createStyles({\n    paper: {\n      width: '100%',\n      height: '100%',\n      maxWidth: '100%',\n      maxHeight: '100%',\n      backgroundColor: theme.palette.background.paper,\n      overflowY: 'scroll'\n    },\n    container: {\n      padding: theme.spacing(2, 2, 3)\n    },\n    subContainer: {\n      margin: theme.spacing(1, 3)\n    },\n    input: {\n      marginLeft: '12px'\n    },\n    list: {\n      width: '100%',\n      border: '1px solid #CBD2E3',\n      marginTop: '5px'\n    },\n    listStyle: {\n      listStyle: 'none'\n    },\n    border: {\n      width: '85px',\n      border: 'solid',\n    },\n    button: {\n      marginTop: \"auto\",\n      marginBottom: theme.spacing(5),\n      width: \"50%\",\n      margin: theme.spacing(1),\n      background: '#d74100',\n      '&:hover': {\n        background: '#d74100',\n      }\n    },\n    closeButton: {\n      marginTop: \"auto\",\n      marginBottom: theme.spacing(5),\n      margin: theme.spacing(1),\n    },\n    mileAreaStyle: {\n      width: '100%',\n      marginTop: \"5px\",\n      marginBottom: \"5px\",\n      padding: \"0px 5px\",\n      fontSize: '0.875rem'\n    },\n    mileAreaBottomStyle: {\n      width: '100%',\n      marginTop: \"40px\",\n      marginBottom: \"5px\",\n      padding: \"0px 5px\",\n      fontSize: '0.875rem'\n    },\n    linkStyle: {\n      fontWeight: 'bold',\n      textDecoration: 'underline'\n    },\n    quesText: {\n      color: \"red\",\n      fontWeight: 'bold',\n      fontSize: '1.2rem'\n    },\n    text: {\n      color: \"#0B308E\"\n    },\n    textDecoration: {\n      textDecoration: \"underline\",\n      textDecorationColor: \"#0B308E\"\n    },\n    bar: {\n      alignItems: 'center',\n      fontSize: '1.2rem'\n    }\n  }),\n);\n\nconst MkTaxiAgreementService: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  const dispatch = useDispatch();\n  const isShowUMModal = useSelector((state: State) => state.condition.isShowUMModal);\n  const umQuery = useSelector((state: State) => state.general.universalMaaSQuery);\n\n  // UM情報連携用MKTaxiURL\n  const other3 = MKTaxiClass.getOther3ByBinary(umQuery);\n  let umTaxiUrl: string ;\n  let umAnaMileageClubURL: string ;\n  if(other3) {\n    umTaxiUrl = MKTaxiClass.getMkTaxiUrl(props.flightStatus, props.isDepartureGuide, props.arrivalTimeToAirport, props.place, props.isHireLink, props.airlineCode, other3);\n    umAnaMileageClubURL = MKTaxiClass.MKTaxiANAMileageClubURL(umTaxiUrl, props.airportCode);\n  } else {\n    umTaxiUrl = MKTaxiClass.getMkTaxiUrl(props.flightStatus, props.isDepartureGuide, props.arrivalTimeToAirport, props.place, props.isHireLink, props.airlineCode);\n    umAnaMileageClubURL = MKTaxiClass.MKTaxiANAMileageClubURL(umTaxiUrl, props.airportCode);\n  }\n\n  let [isAgree, setIsAgree] = useState(true);\n  const umText = MKTaxiClass.switchTextUmQuery(umQuery);\n  const privacyUrl = 'https://www.ana.co.jp/ja/jp/guide/terms/privacy/'\n\n  const onClose = () => {\n    props.isSetOpen(false);\n    dispatch(switchIsShowUMModal(false));\n  }\n  return (\n    <>\n      {/* // Modalコンポーネントの「disableAutoFocus」「disableEnforceFocus」の2オプションを設定していない場合、\n      // 選択状態の青枠が表示されてしまうためオプションを設定している。 */}\n      <Modal open={isShowUMModal} disableAutoFocus disableEnforceFocus>\n        <div className={classes.paper}>\n        <ModalHeader\n          handleClose={onClose}\n          title=\"「車いす対応車両」のタクシー手配\"\n        />\n          <div className={classes.container}>\n            <Grid container spacing={2} direction=\"column\">\n              <Grid item>\n                <Typography className={classes.quesText}>\n                車両手配を行うにあたり、ANAの航空券予約時にご登録いただいた以下「サポート情報」を、MKタクシーに共有してもよいですか?\n                </Typography>\n              </Grid>\n              <Grid item className={classes.subContainer}>\n                <AppBar position=\"static\" color=\"primary\" className={classes.bar}>\n                  <Toolbar >ご登録内容</Toolbar>\n                </AppBar>\n                <Grid item className={classes.list}>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umText.ds1.map((ds1) => {\n                          return <li className={classes.listStyle} key={ds1}>{ds1}</li>\n                        })}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                        車いすは折り畳み式である\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umText.ds3}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                        車いすの種類\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umText.ds4}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                        奥行\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umQuery.ds6? umQuery.ds6:'-'}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                        横幅\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umQuery.ds7? umQuery.ds7:'-'}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                        高さ\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umQuery.ds8? umQuery.ds8:'-'}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                        車いすサイズ単位\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umText.ds9}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                        重量\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umQuery.ds10? umQuery.ds10:'-'}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                        車いす重量単位\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umText.ds11}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                        介助者同行有無\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umText.um1}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                        乗車予定人数\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umText.um2}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                  <AppBar position=\"static\" color=\"inherit\">\n                    <Toolbar variant=\"dense\">\n                      <Typography variant=\"h6\" color=\"inherit\" component=\"div\">\n                      乗車情報\n                      </Typography>\n                    </Toolbar>\n                    <Toolbar variant=\"dense\">\n                      <Typography  color=\"inherit\" component=\"div\">\n                        {umText.um3}\n                      </Typography>\n                    </Toolbar>\n                  </AppBar>\n                </Grid>\n              </Grid>\n              <Grid item>\n                <Link href={privacyUrl} rel=\"noopener\" target=\"_blank\" className={classes.textDecoration}>\n                    プライバシーポリシー\n                </Link>\n                <FormGroup>\n                  <FormControlLabel\n                    control={\n                      <Checkbox color=\"primary\"\n                        onClick={()=>{\n                          setIsAgree(!isAgree)\n                        }}\n                      />\n                    }\n                    className={classes.text}\n                    label='上記プライバシーポリシーに同意し、かつ、上記「サポート情報」をMKタクシーに共有する' />\n                </FormGroup>\n              </Grid>\n              <Grid item>\n                <Button\n                  color=\"primary\"\n                  variant=\"contained\"\n                  onClick={onClose}\n                  className={classes.closeButton}\n                >\n                  <div>閉じる</div>\n                </Button>\n                <Button\n                  disabled={isAgree}\n                  color=\"primary\"\n                  variant=\"contained\"\n                  onClick={()=>{\n                    dispatch(switchIsShowUMModal(false));\n                  }}\n                  className={classes.button}\n                >\n                  <div>同意して次へ</div>\n                </Button>\n              </Grid>\n            </Grid>\n          </div>\n        </div>\n      </Modal>\n      <MkTaxiService\n        price={props.price}\n        url={umTaxiUrl}\n        isTYO={props.isTYO}\n        anaMileageClubURL={umAnaMileageClubURL}\n        isShowBarrierFreeImage={true}\n      />\n    </>\n  )\n};\n\nexport default MkTaxiAgreementService;\n","import { Grid, Link, makeStyles, Theme, useMediaQuery } from '@material-ui/core';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { State } from '../../../reducers';\nimport { getTargetAirportName, getTargetTaxiPrice } from '../../../services/mktaxi/data/PriceList';\nimport scClick from '../../common/ScClick';\nimport ButtonOfSection from '../sections/ButtonOfSection';\nimport PopupDialog from '../../common/PopupDialog';\nimport MkTaxiService from '../../ad/OtherServices/MkTaxi/MkTaxiService';\nimport MkTaxiAgreementService from '../../ad/OtherServices/MkTaxi/MkTaxiAgreementService';\nimport MkHireService from '../../ad/OtherServices/MkTaxi/MkHireService';\nimport FlightInfo from '../../../services/ana/models/flightInfo';\nimport DateTime from '../../../utils/dateTime';\nimport MKTaxiClass from '../../../services/mktaxi/util';\nimport Airlines from '../../../utils/Airlines';\nimport { switchIsShowUMModal } from '../../../actions/conditionAction';\nimport ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos';\nimport wheelChairLogo from '../sections/images/cc.jpg';\n\ninterface Props {\n  /** お迎え時間(タクシー区間の出発時間) */\n  depTime?: Date\n}\n\ninterface MkTaxiReserveButtonProps {\n  /** お迎え時間(タクシー区間の出発時間) */\n  depTime?: Date,\n  /** UniversalMaaS用MKタクシー予約ボタンか */\n  isUniversalMaaS: boolean\n}\n\nexport const useTaxiButtonStyles = makeStyles(() => ({\n  summary: {\n    color: '#0B308E'\n  },\n  alink: {\n    textDecoration: \"none\"\n  },\n  wheelChairLogoSmall: {\n    maxHeight: \"3em\",\n    position: 'absolute',\n    right: '5px',\n    top: '18px'\n  },\n  wheelChairLogoMiddle: {\n    maxHeight: \"3.5em\",\n    position: 'absolute',\n    right: '5px',\n    top: '15px'\n  },\n  wheelChairLogoLarge: {\n    maxHeight: \"4em\",\n    position: 'absolute',\n    right: '10px',\n    top: '10px'\n  },\n  arrowForwardIosIcon: {\n    paddingTop: \"1em\"\n  }\n}));\n\nexport const getMkTaxiModalTitle = (isDepartureGuide: boolean, flightStatus: FlightInfo, airportCode: string) => {\n  const airportName = isDepartureGuide ? flightStatus.depAirportName : flightStatus.arrAirportName;\n\n  // 表示で出てくる空港の名称\n  const displayAirportName: string = getTargetAirportName(airportCode, airportName);\n  return isDepartureGuide ? `${displayAirportName}まで`: `${displayAirportName}から`;\n}\n\nexport const MkTaxiReserveButton: React.FC<MkTaxiReserveButtonProps> = (props: MkTaxiReserveButtonProps) => {\n  const dispatch = useDispatch();\n  const classes = useTaxiButtonStyles();\n  const flightStatus = useSelector((state: State) => state.condition.flightStatus);\n  const isDepartureGuide = useSelector((state: State) => state.condition.isDepartureGuide);\n  const place = useSelector((state: State) => state.condition.place);\n  /** 駅すぱあとから取得した経路全体。 */\n  const courses = useSelector((state: State) => state.condition.course);\n  const courseIndex = useSelector((state: State) => state.condition.courseIndex);\n  const date = useSelector((state: State) => state.condition.date);\n\n  const isSmallSize = useMediaQuery((theme: Theme) =>\n    theme.breakpoints.down('xs')\n  );\n  const isMiddleSize = useMediaQuery((theme: Theme) =>\n    theme.breakpoints.down('sm')\n  );\n\n  const { t } = useTranslation();\n\n  if(place === null) {\n    return null;\n  }\n\n  /** TODO: 2021/09/21 今後の動向によってMKハイヤーを非表示化する */\n  const isShowMKHireServiceString = process.env['REACT_APP_IS_SHOW_MK_HIRE'] as string;\n  const isShowMKHireService = isShowMKHireServiceString === 'true';\n  const isHireLink = MKTaxiClass.isHireCar(flightStatus, isDepartureGuide, false);\n  const airportCode = isDepartureGuide? flightStatus.depAirportCode: flightStatus.arrAirportCode;\n  const hirePrice = MKTaxiClass.getHirePrice(place, airportCode);\n\n  /** ハイヤーかつMKハイヤー非表示化の場合には予約ボタンを表示しない */\n  if(!isShowMKHireService && isHireLink) {\n    return null;\n  }\n  const hirePriceLabel = (hirePrice === 0)? 'お見積り': `${hirePrice.toLocaleString()}円~`;\n  if(place === null || courses.length === 0 ) {\n    return null;\n  }\n  /** 選択している経路。 */\n  const course = courses[courseIndex];\n\n  /** 選択している経路で最初のLine要素。 */\n  const firstLine = course.Route.Line[0];\n  /** 選択している経路の最初の区間の出発時刻。 */\n  const firstDepartureTime = new Date(firstLine.DepartureState.Datetime.text);\n\n  const price = getTargetTaxiPrice(flightStatus, isDepartureGuide, place, isHireLink);\n  if(!price) {\n    return null;\n  }\n  const labels = [\n    '空港定額タクシー',\n    `目安 約${price.pay.toLocaleString()}円~`\n  ]\n\n  if (isHireLink) {\n    labels[0] = '空港送迎ハイヤー予約';\n    labels[1] = hirePriceLabel;\n  }\n  else {\n    if (price.isLabelMeter) {\n      labels[0] = 'メータータクシー';\n    }\n    // MKタクシーの場合には「マイルもたまる!」を追加\n    const unshiftString = t('rideshare_service_button_label_1');\n    labels.unshift(unshiftString);\n  }\n  const scClickName = isHireLink? \"ana-maas_mklimo_button\": \"ana-maas_mk_button\";\n\n  /** 予約ボタンの右側に表示するバリアフリーアイコン */\n  const MKTaxiButtonIcon: React.ReactNode[] = (()=>{\n    const wheelChairAlt = '車いすマーク';\n    const rightIcons: React.ReactNode[] = [\n      <ArrowForwardIosIcon\n        className={classes.arrowForwardIosIcon}\n      />\n    ]\n    /** UniversalMaaS用でない場合には車イスマークを出さない */\n    if(!props.isUniversalMaaS) {\n      return rightIcons;\n    }\n    /** 車椅子アイコンに適用するClass */\n    const wheelChairLogoClass = (()=>{\n      if(isSmallSize) {\n        return classes.wheelChairLogoSmall;\n      }\n      else if(isMiddleSize) {\n        return classes.wheelChairLogoMiddle\n      }\n      return classes.wheelChairLogoLarge\n    })()\n    rightIcons.push(\n      <img\n        src={wheelChairLogo}\n        alt={wheelChairAlt}\n        className={wheelChairLogoClass}\n      />\n    )\n    return rightIcons;\n  })()\n\n  return (\n    <Grid item className={classes.summary} onClick={()=>{\n      scClick(scClickName);\n      dispatch(switchIsShowUMModal(true));\n    }}>\n      <Link\n        className={classes.alink}\n      >\n        <ButtonOfSection\n          labels={labels}\n          cyName='mk_taxi_reserve_button'\n          backgroundColor='#fdb409'\n          color='#000000'\n          endIcon={MKTaxiButtonIcon}\n        />\n      </Link>\n    </Grid>\n  )\n}\n\n\n/** MKタクシーの予約モーダル中身 */\nconst MKTaxiReserveBodyComponent: React.FC<Props> = (props: Props) => {\n  const flightStatus = useSelector((state: State) => state.condition.flightStatus);\n  const isDepartureGuide = useSelector((state: State) => state.condition.isDepartureGuide);\n  const place = useSelector((state: State) => state.condition.place);\n  const courseIndex = useSelector((state: State) => state.condition.courseIndex);\n  const arrivalTimeToAirport = useSelector((state: State) => state.condition.arrivalTimeToAirport);\n  /** 駅すぱあとから取得した経路全体。 */\n  const courses = useSelector((state: State) => state.condition.course);\n  /** 対象となるエアライン */\n  const targetAirline = useSelector((state: State) => state.condition.targetAirLine);\n  const date = useSelector((state: State) => state.condition.date);\n\n  if(place === null) {\n    return null;\n  }\n\n  /** 選択している経路。 */\n  const course = courses[courseIndex];\n\n  /** 選択している経路で最初のLine要素。 */\n  const firstLine = course.Route.Line[0];\n  /** 選択している経路の最初の区間の出発時刻。 */\n  const firstDepartureTime = new Date(firstLine.DepartureState.Datetime.text);\n  const isHireLink = MKTaxiClass.isHireCar(flightStatus, isDepartureGuide, false);\n  const airportCode = isDepartureGuide? flightStatus.depAirportCode : flightStatus.arrAirportCode;\n  /** 3文字の航空会社コード。 */\n  const airlineCode = Airlines.getAirlineThreeLetterCode(targetAirline);\n  const hirePrice = MKTaxiClass.getHirePrice(place, airportCode);\n  const price = getTargetTaxiPrice(flightStatus, isDepartureGuide, place, isHireLink);\n  const taxiUrl = MKTaxiClass.getMkTaxiUrl(flightStatus, isDepartureGuide, arrivalTimeToAirport, place, isHireLink, airlineCode);\n  const anaMileageClubURL: string = MKTaxiClass.MKTaxiANAMileageClubURL(taxiUrl, airportCode);\n  /** TODO: 2021/09/21 今後の動向によってMKハイヤーを非表示化する */\n  const isShowMKHireServiceString = process.env['REACT_APP_IS_SHOW_MK_HIRE'] as string;\n  const isShowMKHireService = isShowMKHireServiceString === 'true';\n\n  if(isHireLink && isShowMKHireService) {\n    return (\n      <MkHireService\n        price={hirePrice}\n        url={taxiUrl}\n      />\n    )\n  }\n  // 定額タクシーのポップアップページ\n  return (\n    <MkTaxiService\n      price={price}\n      url={taxiUrl}\n      isTYO={MKTaxiClass.isTYO(airportCode)}\n      anaMileageClubURL={anaMileageClubURL}\n    />\n  )\n}\n\n/**\n * UniversalMaaS用MKタクシーボタンコンポーネント\n * @param props\n * @returns\n */\nexport const UniversalMaaSMKTaxiButton: React.FC<Props> = (props: Props) => {\n  const flightStatus = useSelector((state: State) => state.condition.flightStatus);\n  const isDepartureGuide = useSelector((state: State) => state.condition.isDepartureGuide);\n  const place = useSelector((state: State) => state.condition.place);\n  const arrivalTimeToAirport = useSelector((state: State) => state.condition.arrivalTimeToAirport);\n  /** 駅すぱあとから取得した経路全体。 */\n  const courses = useSelector((state: State) => state.condition.course);\n  const courseIndex = useSelector((state: State) => state.condition.courseIndex);\n  /** 対象となるエアライン */\n  const targetAirline = useSelector((state: State) => state.condition.targetAirLine);\n  const date = useSelector((state: State) => state.condition.date);\n\n  /** バリアフリー情報共有同意画面の開閉。 */\n  const [isOpen, setIsOpen] = React.useState(false);\n\n  if(place === null) {\n    return null;\n  }\n\n  /** 選択している経路。 */\n  const course = courses[courseIndex];\n  /** 選択している経路で最初のLine要素。 */\n  const firstLine = course.Route.Line[0];\n  /** 選択している経路の最初の区間の出発時刻。 */\n  const firstDepartureTime = new Date(firstLine.DepartureState.Datetime.text);\n  const airportCode = isDepartureGuide? flightStatus.depAirportCode : flightStatus.arrAirportCode;\n  const MkTaxiModalTitle: string = getMkTaxiModalTitle(isDepartureGuide, flightStatus, airportCode);\n  const isHireLink = MKTaxiClass.isHireCar(flightStatus, isDepartureGuide, false);\n  const price = getTargetTaxiPrice(flightStatus, isDepartureGuide, place, isHireLink);\n  /** 3文字の航空会社コード。 */\n  const airlineCode = Airlines.getAirlineThreeLetterCode(targetAirline);\n\n  return (\n    <PopupDialog\n      title={MkTaxiModalTitle}\n      openComponent={\n        <MkTaxiReserveButton\n          depTime={props.depTime}\n          isUniversalMaaS={true}\n        />\n      }\n      services={\n        <MkTaxiAgreementService\n          price={price}\n          flightStatus={flightStatus}\n          isDepartureGuide={isDepartureGuide}\n          arrivalTimeToAirport={arrivalTimeToAirport}\n          place={place}\n          isHireLink={isHireLink}\n          airlineCode={airlineCode}\n          airportCode={airportCode}\n          isTYO={MKTaxiClass.isTYO(airportCode)}\n          isOpen={isOpen}\n          isSetOpen={setIsOpen}\n        />\n      }\n      isBanner={false}\n      isOpen={isOpen}\n      isSetOpen={setIsOpen}\n    />\n  )\n}\n\n/**\n * 通常のMKタクシーボタンコンポーネント\n * @param props\n * @returns\n */\nexport const MKTaxiButton: React.FC<Props> = (props: Props) => {\n  const flightStatus = useSelector((state: State) => state.condition.flightStatus);\n  const isDepartureGuide = useSelector((state: State) => state.condition.isDepartureGuide);\n  const airportCode = isDepartureGuide? flightStatus.depAirportCode : flightStatus.arrAirportCode;\n\n  const MkTaxiModalTitle: string = getMkTaxiModalTitle(isDepartureGuide, flightStatus, airportCode);\n  return (\n    <PopupDialog\n      title={MkTaxiModalTitle}\n      openComponent={\n        <MkTaxiReserveButton\n          depTime={props.depTime}\n          isUniversalMaaS={false}\n        />\n      }\n      services={\n        <MKTaxiReserveBodyComponent\n          depTime={props.depTime}\n        />\n      }\n      isBanner={false}\n    />\n  )\n}","import { Grid, Link, makeStyles, Theme, useMediaQuery } from '@material-ui/core';\nimport * as React from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { State } from '../../../reducers';\nimport { getTargetAirportName, getTargetTaxiPrice } from '../../../services/mktaxi/data/PriceList';\nimport NearMeDialog from '../../ad/OtherServices/NearMe/NearMeDialog';\nimport ButtonOfSection from '../sections/ButtonOfSection';\nimport PopupDialog from '../../common/PopupDialog';\nimport FlightInfo from '../../../services/ana/models/flightInfo';\nimport DateTime from '../../../utils/dateTime';\nimport SagaAirportTaxi from '../../ad/OtherServices/SagaAirportTaxi';\nimport ButtonSagaAirportTaxi from '../../ad/OtherServices/SagaAirportTaxi/Button';\nimport { TaxiFareSummary } from '../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { TaxiReserversButton } from './TaxiReserversButton';\nimport MKTaxiClass from '../../../services/mktaxi/util';\nimport NearMeModalButton from '../../ad/OtherServices/NearMe/NearMeModalButton';\nimport { convertStringToTaxiCompany, TaxiCompanyList } from \"../../../services/taxi/GetDirectionAndFare/models/getFareSamplesParams\";\nimport { CommonTaxiUtils } from \"../../ad/OtherServices/CommonTaxi/CommonTaxiDateUtils\";\nimport { MKTaxiButton, UniversalMaaSMKTaxiButton } from './UniversalMaaSMKTaxiButton';\nimport Environment from '../../../utils/environment';\nimport { toLuxonDateTimeFronJSDate } from '../../../utils/luxonUtil';\n\ninterface Props {\n  // お迎え時間(タクシー区間の出発時間)。\n  depTime?: Date\n}\n\nexport const useTaxiButtonStyles = makeStyles(() => ({\n  summary: {\n    color: '#0B308E'\n  },\n  section: {\n    display: 'inline-block',\n    marginRight: '10px'\n  },\n  alink: {\n    textDecoration: \"none\"\n  },\n  buttonSagaAirportTaxi: {\n    margin: '5px 0px',\n  }\n}));\n\nexport const getMkTaxiModalTitle = (isDepartureGuide: boolean, flightStatus: FlightInfo, airportCode: string) => {\n  const airportName = isDepartureGuide ? flightStatus.depAirportName : flightStatus.arrAirportName;\n\n  // 表示で出てくる空港の名称\n  const displayAirportName: string = getTargetAirportName(airportCode, airportName);\n  return isDepartureGuide ? `${displayAirportName}まで`: `${displayAirportName}から`;\n}\n\n/**\n * MKタクシー・ハイヤーのボタンリンクに関するコンポーネント\n * タクシーの距離・所要時間などの概要情報は TaxiSummary にて表示する\n * @param props\n */\nconst TaxiReserversAllButtons: React.FC<Props> = (props: Props) => {\n  const classes = useTaxiButtonStyles();\n\n  // const dispatch = useDispatch();\n  const flightStatus = useSelector((state: State) => state.condition.flightStatus);\n  const isDepartureGuide = useSelector((state: State) => state.condition.isDepartureGuide);\n  const place = useSelector((state: State) => state.condition.place);\n  const { t } = useTranslation();\n  /** Reduxに保存したタクシー料金情報の一覧 */\n  const taxiFareSummaries = useSelector((state: State) => state.condition.taxiFareSummaries);\n  /** Add 2022.10.12 タクシー会社設定 */\n  const taxiCompanyConfigurations = useSelector((state: State) => state.general.taxiCompanyConfigurations);\n  /** UniversalMaaSQuery */\n  const umQuery = useSelector((state: State) => state.general.universalMaaSQuery);\n  /** 市区町村までの住所。 */\n  const address = place ? place.prefecture + place.city : '';\n  /** 緯度。(地点情報が存在しない場合はnullを代入する。) */\n  const lat = place ? Number.parseFloat(place.lat) : null;\n  /** 経度。(地点情報が存在しない場合はnullを代入する。) */\n  const lng = place ? Number.parseFloat(place.lng) : null;\n  /** バリアフリー情報フラグ。 */\n  const isShowBarrierFreeInfo = useSelector((state: State) => state.general.mode.isShowBarrierFreeInfo);\n  try {\n    const [openNearMeDialog, setOpenNearMeDialog] = React.useState(false);\n    const airportCode = isDepartureGuide? flightStatus.depAirportCode : flightStatus.arrAirportCode;\n\n    if(place === null) {\n      return null;\n    }\n\n    const isHireLink = MKTaxiClass.isHireCar(flightStatus, isDepartureGuide, false);\n    /** TODO: 2021/09/21 今後の動向によってMKハイヤーを非表示化する */\n    const isShowMKHireServiceString = process.env['REACT_APP_IS_SHOW_MK_HIRE'] as string;\n    const isShowMKHireService = isShowMKHireServiceString === 'true';\n\n    /** ダイアログを閉じる場合 */\n    const handleClose = () => {\n      setOpenNearMeDialog(false);\n    };\n\n    const flightDate = flightStatus.getFlightTimeDate(isDepartureGuide);\n    const isTYO = MKTaxiClass.isTYO(airportCode);\n    // MKタクシーとMKハイヤーで表示するリミット時刻が違うので判定条件を求めておく\n    const isShowDate = (()=>{\n      if(isHireLink) {\n        return DateTime.isMkHire(flightDate)\n      }\n      return isTYO? DateTime.isMkTaxiTYO(flightDate): DateTime.isMkTaxi(flightDate);\n    })()\n    /** MKタクシーの予約ボタンを出すかの判定 */\n    const isShowMKTaxiButton: boolean = (() => {\n      if(!isShowDate) {\n        return false;\n      }\n      if(isHireLink && !isShowMKHireService) {\n        return false;\n      }\n      return true;\n    })();\n\n  /** UniversalMaaS用MKタクシーボタンを表示するか */\n  const isShowUniversalMaaSMKTaxi = (() => {\n    if(!isShowBarrierFreeInfo) {\n      return false;\n    }\n    const airportCode = isDepartureGuide? flightStatus.depAirportCode: flightStatus.arrAirportCode;\n    /**\n     * 新千歳空港の場合:\n     * 1. ds3=1であること\n     *\n     * 伊丹/福岡空港の場合:\n     * 1. ds1=1or2or3であること\n     */\n    switch(airportCode) {\n      case 'CTS':\n      case 'SPK':\n        return umQuery.dr3 === '1';\n      case 'ITM':\n      case 'FUK':\n        // ds1クエリ中に1, 2, 3が含まれる場合trueにする\n        return (umQuery.ds1 || '').split(\"_\").some((x)=>{\n          return ['1','2','3'].includes(x)\n        });\n      default:\n        return false;\n    }\n  })();\n\n    // タクシー予約ボタン複数表示対応(福島空港専用)\n    const isFukusimApirport = airportCode === \"FKS\";\n    // タクシー予約ボタン表示チェック(TaxiReserversButton.tsxより抽出)\n    const checkTaxiButton = (props: { fee: TaxiFareSummary, depTime?: Date }) => {\n      /** 対象の会社 */\n      const company: TaxiCompanyList | null = convertStringToTaxiCompany(props.fee.companyCode)\n      if(company === null || taxiCompanyConfigurations === undefined) {\n        return null;\n      }\n\n      const taxiCompanyConfiguration = taxiCompanyConfigurations[company];\n      const limit = taxiCompanyConfiguration.limit;\n      /** 対象となる空港名 */\n      const targetAirport = isDepartureGuide? flightStatus.depAirportCode: flightStatus.arrAirportCode;\n      const commonTaxiUtils = new CommonTaxiUtils(limit.limitDays, limit.limitHours, company, targetAirport);\n\n      /** タクシーが利用可能かを判別する */\n      // 以下の条件を満たす場合、利用可能として扱う。\n      // 1. この経路がタクシー経路かつリアルタイム情報(過去の検索)ではないこと。\n      // 2. 現在日時がタクシー予約可能な日付(搭乗日のX日前のXX時より前)であること。\n      // 3. 日本語版であること。\n      // 料金や座標・出発時刻・Place情報が取れない時にはボタンを出さない\n      if(props.fee === undefined || lat === null || lng === null || place === null || !props.depTime) {\n        return null;\n      }\n      // 予約可能な日付でない場合には出さない\n      const isAvalableDateTaxi = commonTaxiUtils.isAvalable(\n          toLuxonDateTimeFronJSDate(\n            flightStatus.getFlightTimeDate(isDepartureGuide)\n          )\n        );\n      if(!isAvalableDateTaxi) {\n        return null;\n      }\n      // 料金を取得できない場合には出さない\n      if(!props.fee.fareInfo.totalValue) {\n        return null;\n      }\n      return true;\n    }\n\n    // タクシー予約ボタン表示件数\n    const taxiButtonCount = (() => {\n      const buttonStatus = taxiFareSummaries.map((taxiFareSummary:TaxiFareSummary )=>{\n        return checkTaxiButton({ fee: taxiFareSummary, depTime: props.depTime})\n      })\n      return buttonStatus.filter((v) => v===true).length\n    })();\n\n    // (福島空港専用)最低定額運賃タクシー抽出\n    const minFareTaxi = (() => {\n      if(isFukusimApirport){\n        return taxiFareSummaries.filter((v)=>v.fareInfo.fareType=='fixed')\n          .reduce((v1: TaxiFareSummary, v2: TaxiFareSummary)=>{\n            return (v1.fareInfo.totalValue<v2.fareInfo.totalValue) ? v1 : v2\n        })\n      }\n      return null\n    })()\n\n    // (福島空港専用)複数タクシー予約ボタンの場合に表示するボタン\n    const FukusimaAirportTaxiButtonComponent: React.FC = () => {\n      return (\n        <Link\n          className={classes.alink}\n        >\n          <ButtonOfSection\n            cyName=\"button_fixed_taxies\"\n            backgroundColor='#fdb409'\n            color='#000000'\n            labels={[t('taxi:noriai_taxi_reserve'), `${minFareTaxi?.fareInfo.fareLabel}`]}\n          />\n        </Link>\n      )\n    }\n\n    // タクシー予約ボタン\n    const TaxiButtonsComponent: React.FC<{popupMode?: boolean}> = (myProps: {popupMode?: boolean}) => {\n      if (myProps.popupMode) {\n        // Popup表示内容\n        return (\n          <div style={{\n              width:\"100%\",\n              height:\"auto\",\n              display:\"flex\",\n              flexDirection:\"column\",\n              justifyContent:\"center\"\n            }}\n          >\n            <div>\n              <p>\n                お一人様からの予約制で、自宅や会社と空港間を送迎します(福島県外は指定場所と空港間を送迎)。\n              </p>\n            </div>\n            <div style={{ border:\"2px solid #ddd\", width:\"calc(100% - 30px)\", padding:\"12px\" }}>\n              <p>\n                タクシー会社を選択し、予約にお進みください。\n              </p>\n              {taxiFareSummaries.map((taxiFareSummary:TaxiFareSummary, idx: number)=>(\n                <div key={idx}>\n                  <TaxiReserversButton\n                    fee={taxiFareSummary}\n                    depTime={props.depTime}\n                    displayTaxiCompany={true}\n                    labelFare=\"予約へ進む\"\n                  />\n                </div>\n              ))}\n            </div>\n            <div>\n              <p>\n                (!)ご注意<br/>\n                <br/>\n                ・運賃は、大人・子ども同額となります。<br/>\n                ・警戒区域等、一部通行できない地域があります。また、予約状況によっては、お迎えの場所・時間を予め指定させていただく場合がある他、ご予約をお受けできない可能性があります。詳しくは、運行会社にお問合せ下さい。<br/>\n                ・ご予約をキャンセルする場合は、前日までにタクシー会社へ直接ご連絡をお願いします。当日、お迎えに上がってからのキャンセルは、運賃の全額をお支払いいただくこととなります。\n              </p>\n            </div>\n          </div>\n        )\n      } else {\n        // ボタン1つの場合\n        return (\n          <>\n            {taxiFareSummaries.map((taxiFareSummary:TaxiFareSummary, idx: number)=> {\n              // 本番環境かつ dummyValなら返さない\n              const env = process.env['REACT_APP_STAGE_ENV'] || 'dev';\n              const isProd = Environment.isProduction(env);\n              if(isProd && taxiFareSummary.companyCode === TaxiCompanyList.dummyVal) {\n                return null;\n              }\n              return (\n                <div key={idx}>\n                <TaxiReserversButton\n                  fee={taxiFareSummary}\n                  depTime={props.depTime}\n                  // ボタンにタクシー会社名が必要なければ以下をfalseにする\n                  displayTaxiCompany={false}\n                />\n              </div>\n              )\n            })}\n          </>\n        )\n      }\n    }\n    return (\n      <Grid container direction='column' data-cy={\"taxi_reserve_all_button\"} >\n        {/* UniversalMaaS用 MKタクシーの予約ボタン */}\n        { (isShowUniversalMaaSMKTaxi && isShowMKTaxiButton) &&\n          <UniversalMaaSMKTaxiButton\n            depTime={props.depTime}\n          />\n        }\n        {/* NearMeのボタン */}\n        <NearMeModalButton\n          setOpenNearMeDialog={setOpenNearMeDialog}\n        />\n        {/** NearMe用のダイアログ */}\n        <NearMeDialog\n          openDialog={ openNearMeDialog }\n          onClose={ handleClose }\n        />\n        {/* MKタクシーの予約ボタン */}\n        { (!isShowUniversalMaaSMKTaxi && isShowMKTaxiButton) &&\n          <MKTaxiButton\n            depTime={props.depTime}\n          />\n        }\n        {/* 佐賀空港タクシーの表示条件を満たす場合のみ、ボタンを表示する。 */}\n        { SagaAirportTaxi.isDisplayable(flightStatus.getFlightTimeDate(isDepartureGuide), address, lat, lng) && (\n            <div className={classes.buttonSagaAirportTaxi}>\n              <ButtonSagaAirportTaxi />\n            </div>\n          )\n        }\n        {/* 予約ができるタイプのタクシー予約ボタン */}\n        {/** イースタン・宮交タクシー・宇部山電 */}\n        { /* Del 2022.10.12 (既存ロジック削除)-----------\n          taxiFareSummaries.map((taxiFareSummary:TaxiFareSummary, idx: number)=>{\n          return (\n            <div key={idx}>\n              <TaxiReserversButton\n                fee={taxiFareSummary}\n                depTime={props.depTime}\n              />\n            </div>\n          )\n        })}*/}\n\n        {/* Add 2022.10.12 ----------------------------- */}\n        {\n          (isFukusimApirport && taxiButtonCount > 1) ?\n            // 福島空港タクシーボタン処理\n            <PopupDialog\n              title=\"福島空港乗合タクシー(予約制)\"\n              openComponent={<FukusimaAirportTaxiButtonComponent />}\n              services={<TaxiButtonsComponent popupMode={true} />}\n              isBanner={false}\n            />\n            :\n            // 通常タクシーボタン処理\n            <TaxiButtonsComponent />\n        }\n      </Grid>\n    )\n  }\n  catch (e){\n    // dev環境のみエラーログを出力\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n      console.error(e);\n    }\n    return <></>\n  }\n};\n\nexport default TaxiReserversAllButtons;\n","import * as React from 'react';\nimport { useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { createStyles, Grid, Link, makeStyles, Typography } from '@material-ui/core';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ServiceDetail, { SearviceDetailButton } from '../../../common/PopupDialog/ServiceDetail';\nimport Type from '../../../common/PopupDialog/Type';\nimport { TaxiPrice } from '../../../../services/mktaxi/data/PriceList';\nimport { isKeyDownEnter, TabIndexList } from '../../../../utils/tabIndexList';\nimport KyotoImage from '../../../ad/Banners/images/MkTaxi/popup/mktaxi_kyoto_service.jpg'\nimport MkTaxiLogo from '../../../ad/Banners/images/MkTaxi/mktaxi_logo.png';\nimport { State } from '../../../../reducers';\nimport { format } from 'date-fns';\nimport DateTime from '../../../../utils/dateTime';\n\ninterface Props {\n  price?: TaxiPrice\n}\n\ninterface ImageProps {\n  maxWidth: string,\n  width: string,\n  height?: string,\n  maxHeight?: string,\n  src: string\n}\n\nconst useStyles = makeStyles(() =>\n  createStyles({\n    mileAreaStyle: {\n      width: '100%',\n      marginTop: \"5px\",\n      marginBottom: \"5px\",\n      padding: \"0px 5px\",\n      fontSize: '0.875rem'\n    },\n    mileAreaBottomStyle: {\n      width: '100%',\n      marginTop: \"40px\",\n      marginBottom: \"5px\",\n      padding: \"0px 5px\",\n      fontSize: '0.875rem'\n    },\n    linkStyle: {\n      fontWeight: 'bold',\n      textDecoration: 'underline'\n    }\n  }),\n);\n\nconst MkTaxiKyotoService: React.FC<Props> = (props: Props) => {\n  const classes = useStyles();\n  const isDepartureGuide = useSelector((state: State) => state.condition.isDepartureGuide);\n  const flight = useSelector((state: State) => state.condition.flightStatus);\n  /** フライトの日付 */\n  const flightDate = flight.getFlightTimeDate(isDepartureGuide);\n  const flightDateString = format(flightDate, 'yyyyMMdd');\n  /** ログイン・非ログイン用の遷移URLを設定する */\n  const normalURL = `https://secure.mk-group.co.jp/iframe/ana/lp-sight.html?fldate=${flightDateString}`;\n  const loginParams = {\n    domid: 'se_lp',\n    seUrl: normalURL,\n    companyid: 'mktourism'\n  }\n  const loginBaseURL = {\n    test: 'https://stg.test.cam.ana.co.jp/psz/fwd/jsp/login_cooperation/shareEcoLoginJa.jsp',\n    prod: 'https://cam.ana.co.jp/psz/fwd/jsp/login_cooperation/shareEcoLoginJa.jsp'\n  }\n  const loginURL = `${loginBaseURL.prod}?${new URLSearchParams(loginParams)}`;\n  /** ログイン・非ログイン用の遷移URLを設定ここまで */\n\n  const [displayCoupon, setDisplayCoupon] = React.useState<React.ReactNode[]> ([]);\n\n  /** 種別・料金設定の部分のコンポーネント。 */\n  const TitleType: React.FC<Props> = (props: Props) => {\n    const priceTitle = '観光貸切タクシー';\n    return (\n      <Type\n        name={priceTitle}\n        pricing={'3時間スタンダード車両 18,200円〜'}\n        priceNotice=\"※ご予約の時間が30分単位で、ご指定いただけます\"\n        priceNoticeSecond=\"※モデルコースは、時間に応じた料金となっています。\"\n      />\n    )\n  };\n\n  /** クーポン部分(またはお得な情報部分)のコンポーネント。 */\n  const Coupon: React.FC<Props> = (props: Props) => {\n    return (\n      <Typography component=\"p\" style={{ color: \"#ff0000\", fontWeight: 'bold', border: 'solid #ff0000 1px', padding: \"0px 5px\"}} data-cy={\"mktaxi-coupon-double-mile\"}>\n        下記期間にご乗車いただいたお客様に積算マイルが5倍になるキャンペーン実施!<br/>\n        <span style={{ paddingLeft: \"10px\" }}>期間:2022年12月19日(月)~2023年2月28日(火)</span><br/>\n        <span style={{ fontSize: '0.8rem' }}> ※今後も同様のキャンペーンを実施する可能性があります</span>\n      </Typography>\n    )\n  }\n\n  const Description: React.FC = () => {\n    return (\n      <Typography color=\"primary\" variant=\"subtitle2\" component=\"p\" style={{ marginBottom: \"5px\", padding: \"0px 5px\" }}>\n        ・京都を知り尽くしたドライバーがご案内。お客様の「したい」を叶え、旅の快適と素敵な想い出を約束します。<br/>\n        ・時間内であれば料金は一定の定額料金。\n      </Typography>\n    );\n  }\n\n  /** 注意事項部分のコンポーネント。 */\n  const Notes: React.FC = () => {\n    return (\n      <Typography color=\"primary\" variant=\"subtitle2\" component=\"p\" style={{ marginBottom: \"5px\", padding: \"0px 5px\" }}>\n        ご予約については、下記すべての事項にご同意いただいたものとして取り扱わせていただきます。<br/>\n        ・ご予約はご利用2日前17:00までの受付となります。<br/>\n        ・お取消についてはご利用前日18:00まで無料、18:00以降は全額ご請求となります。<br/>\n        ・観光車両は台数に限りがございます。予約リクエストが完了しても予約が確定したわけではありません。MKからの「確定メール」をもって予約の確定としています。あらかじめご了承ください。<br/>\n        ・ご予約の際にご希望のお時間を入力してください。ただし、お寺の拝観や各施設での見学を含まれる場合は閉門又は閉館時間に間に合うように終了時間を設定してください。<br/>\n        ・英会話ドライバーをご希望される場合は、その旨備考欄にご記入ください。 但し、1時間につき1,000円の手数料が追加となります。<br/>\n        ・英語以外の外国語ドライバー(中国語・韓国語・フランス語)は、別途指名料2,000円を頂きます。<br/>\n        ・拝観料・駐車料・高速代等は、上記とは別途お客様のご負担となります。<br/>\n        ・車内禁煙及び、車内での飲食はご遠慮いただいております。<br/>\n        ・観光案内可能時間は7:00~19:00までとなります。<br/><br/>\n        <キャンセルポリシー><br/>\n        ・ご利用前日18:00まで無料、18:00以降は全額ご請求となります。<br/>\n        (ご利用前日18:00以降のお時間短縮についても、変更前のお時間でのご請求となります。)<br/>\n        ・ご利用前日18:00以降、又は当日にお迎え時間を早められた場合は、できる限りの対応となります。<br/><br/>\n        ・その他観光貸切に関する詳細につきましては、エムケイ株式会社のホームページよりご確認ください。\n      </Typography>\n    );\n  }\n\n  const NoticeMileUp: React.FC = () => {\n    return (\n      <Grid container className={classes.mileAreaStyle} style={{ color: '#002596' }}>\n        <Grid item style={{ fontWeight: 'bold'}}>\n          ANAマイレージクラブにログインして進んでいただくとマイルが貯まります!<br/>\n        </Grid>\n      </Grid>\n    )\n  }\n\n  const NoticeMileDown: React.FC = () => {\n    const mileContactURL = \"https://www.ana.co.jp/ja/jp/site-help/share/contact/mileage_top.htm\";\n    const [hyde, setHyde] = useState(true);\n    const onClick = () => { setHyde(!hyde); }\n    return (\n      <Grid container className={classes.mileAreaBottomStyle} data-cy=\"mxtaxi-notice-area\" style={{ color: '#002596' }}>\n        <Grid item xs={12} style={{ fontWeight: 'bold', textAlign: 'center' }}>\n          マイルに関するご注意(必ずご確認ください)<br/>\n        </Grid>\n        {!hyde &&\n          <>\n            <Grid item xs={12}>\n              ・本ページを経由してANAマイレージクラブ会員お客様番号をご入力後、MKタクシーウェブサイトにて予約・乗車・支払い完了された場合に、「200円(税込)につき1マイル」を積算いたします。それ以外の場合は、ご利用になられてもマイルは積算されません。\n            </Grid>\n            <Grid item xs={12}>\n              ・マイルはご利用後約1~2カ月後にお客様のマイル口座に積算されます。\n            </Grid>\n            <Grid item xs={12}>\n              ・ご予約成立後に予約をキャンセルされた場合は、マイルは積算されません。また、変更・取り消し手数料はマイル積算の対象外となります。<br/>\n              ・ご入力いただいたANAマイレージクラブ会員お客様番号とご名義人が異なる場合は、マイルは積算されません。<br/>\n              ・ご予約完了後のANAマイレージクラブ会員お客様番号の訂正、事後登録はお受けできませんので、お申し込みの際はご注意ください。<br/>\n              ・ANAマイレージクラブに関するお問い合わせは<Link href={mileContactURL} target=\"_blank\" className={classes.linkStyle}>こちら</Link>から。\n            </Grid>\n          </>\n        }\n        <Grid item style={{ width: '100%', textAlign: 'center' }}>\n          {hyde?\n            <ExpandMoreIcon\n              onClick={onClick}\n              tabIndex={TabIndexList.MK_TAXI_MILE_NOTILE}\n              onKeyDown={\n                (e) => {\n                  isKeyDownEnter(e, () => {\n                    onClick();\n                  })\n                }\n              }\n              data-cy=\"mktaxi-expand-more-button\"\n            />:\n            <ExpandLessIcon\n              onClick={onClick}\n              tabIndex={TabIndexList.MK_TAXI_MILE_NOTILE}\n              onKeyDown={\n                (e) => {\n                  isKeyDownEnter(e, () => {\n                    onClick();\n                  })\n                }\n              }\n            />\n          }\n        </Grid>\n      </Grid>\n    )\n  }\n\n  const button: SearviceDetailButton[] = [\n    {\n      label: [\"ANAマイレージクラブに\", \"ログインして予約に進む\"],\n      url: loginURL,\n      scClickName: \"ana-maas_mktourismhire_book\",\n      backgroundColor: '#FDB509'\n    },\n    {\n      label: [\"ANAマイレージクラブに\", \"ログインしないで予約に進む\"],\n      url: normalURL,\n      scClickName: \"ana-maas_mktourismhire_book\",\n      backgroundColor: '#FECF60'\n    }\n  ];\n\n  const SetImage: React.FC<ImageProps> = (props: ImageProps) => {\n    return (\n      <div style={{ height: props.height, maxHeight: props.maxHeight }}>\n        <img src={props.src} alt=\"サービス概要\" style={{ maxWidth: props.maxWidth, width: props.width }}/>\n      </div>\n    );\n  }\n\n  /** 表示するクーポンを組み立てる */\n  React.useEffect(() => {\n    /** 通常のクーポンを表示する */\n    setDisplayCoupon([]);\n  }, []);\n\n  return <ServiceDetail\n      coupon={displayCoupon}\n      description={<Description/>}\n      button={button}\n      image={\n        <SetImage\n          src={KyotoImage}\n          maxWidth=\"519px\"\n          width=\"100%\"\n          height=\"65vw\"\n          maxHeight=\"350px\"\n        />\n      }\n      logo={\n        <SetImage\n          src={MkTaxiLogo}\n          maxWidth=\"468px\"\n          width=\"100%\"\n        />\n      }\n      notes={<Notes/>}\n      type={<TitleType {...props}/>}\n      isMileArea={true}\n      noticeMileUp={\n        <NoticeMileUp />\n      }\n      noticeMileDown={\n        <NoticeMileDown />\n      }\n    />\n};\n\nexport default MkTaxiKyotoService;\n","import React from \"react\";\nimport FlightInfo from \"../../services/ana/models/flightInfo\";\nimport { Lang } from \"../../states/query\";\nimport DateTime from \"../../utils/dateTime\";\nimport { isSameDay, isToday } from 'date-fns';\nimport Place from \"../../services/google/Place\";\nimport MkTaxi from \"./Banners/MkTaxi\";\nimport { getTargetTaxiPrice } from \"../../services/mktaxi/data/PriceList\";\nimport { ResTokyoLimousineBusFormat } from \"../../services/tokyolimousinebus/api\";\nimport MKTaxiClass from \"../../services/mktaxi/util\";\nimport { Box, Grid, GridList, GridListTile } from \"@material-ui/core\";\nimport { UniversalMaaSQuery } from \"../../states/universalMaaSQuery\";\nimport { isJapanese } from \"../../utils/lang\";\n\ninterface DisplayADBodyProps {\n  nodes: React.ReactNode[],\n  showBannerMax: number\n}\n\n/**\n * 指定した表示件数の広告コンポーネントを抽出する\n * @param nodes\n * @param showBannerMax\n */\nexport const DisplayAdBody: React.FC<DisplayADBodyProps> = (props: DisplayADBodyProps) => {\n  // 先頭の表示件数を抽出する\n  const nodes: React.ReactNode[] = props.nodes.slice(0, props.showBannerMax);\n  return (\n    <>\n      {nodes.map((node, id)=>{\n        return (\n          <div key={id}>\n            {node}\n          </div>\n        )\n      })}\n    </>\n  )\n}\n\nexport const DisplayRectangleAdBody: React.FC<DisplayADBodyProps> = (props: DisplayADBodyProps) => {\n  // 先頭の表示件数を抽出する\n  const nodes: React.ReactNode[] = props.nodes.slice(0, props.showBannerMax);\n  return (\n    <Grid item xs={4} lg={3} style={{ maxWidth: 315 }}>\n      <Box style={{ height: \"100%\", margin: \"0 0 0 15px\" }}>\n        <GridList cellHeight=\"auto\" cols={1} spacing={0}>\n          {nodes.map((node, id) => {\n            return (\n              <GridListTile key={id}>\n                { node }\n              </GridListTile>\n            )\n          })}\n        </GridList>\n      </Box>\n    </Grid>\n  )\n}\n\n/** ANAきた北海道フリーパスバナーを出すかを判定する関数 */\n/** TODO: 現在非表示:削除検討中 */\nexport const isDisplayJRHokkaidoNorthFreePass = (isDepartureGuide: boolean, airportCode: string, arrivalDate: Date, lang: Lang) => {\n  // 以下の条件を満たす場合に表示する\n  // 1. 到着案内であること\n  // 2. 新千歳空港・稚内空港・旭川空港を到着とする便であること\n  // 3. 日付が20201/03/31 以前であること\n  // 4. 言語が日本語版のみであること\n\n  // 1. 到着案内であること\n  if(isDepartureGuide) {\n    return false;\n  }\n  // 2. 新千歳空港を発着とする便であること\n  // 表示する空港リスト\n  const showAirportCodeList = ['CTS', 'SPK', 'AKJ', 'WKJ'];\n  if(!showAirportCodeList.includes(airportCode)) {\n    return false;\n  }\n  // 3. 日付が20201/03/31 以前であること\n  return false;\n  // 4. 言語が日本語版のみであること\n  return lang === Lang.ja;\n}\n\n/**\n * 宮崎MaaSバナーを表示するかを判定する関数\n * @param flightStatus フライト情報\n * @param lang 表示する言語\n */\nexport const isDisplayMiyazakiMaasBanner = (flightStatus: FlightInfo, lang: Lang) => {\n  /**\n   * 以下の条件を満たす場合に表示する\n   * 1. 日本語版のみであること\n   * 2. 宮崎空港着とすること\n   */\n  if(lang !== Lang.ja) {\n    return false;\n  }\n  return flightStatus.arrAirportCode === \"KMI\";\n}\n\n/**\n * 庄内空港カーシェアバナーを表示するかを判定する関数\n * @param flightStatus フライト情報\n * @param lang 表示する言語\n */\nexport const isDisplayShonaiCarShare = (flightStatus: FlightInfo, lang: Lang) => {\n  /**\n   * 以下の条件を満たす場合に表示する\n   * 1. 日本語版のみであること\n   * 2. 羽田空港発・庄内空港着とすること\n   */\n  if(lang !== Lang.ja) {\n    return false;\n  }\n  return flightStatus.depAirportCode === 'HND' && flightStatus.arrAirportCode === \"SYO\";\n}\n\n/**\n * 東京リムジンバスのバナー・リンクを表示するかを判定する関数\n * @param flightStatus フライト情報\n * @param busData リムジンバスの情報\n * @param isDepartureGuide 出発案内か\n */\nexport const isDisploayTokyoLimousineBusLink = (flightStatus: FlightInfo, busData: ResTokyoLimousineBusFormat, isDepartureGuide: boolean) => {\n  const busDepDate: Date = new Date(Number(busData.depTime)*1000);\n  const flightArrDate: Date = flightStatus.getFlightTimeDate(false);\n  return DateTime.isAbleToReserveTokyoLimousineBus(busDepDate, !isDepartureGuide, flightArrDate);\n}\n\n/**\n * MKタクシーのバナーを表示するか\n * @param place ユーザ指定地点情報\n * @param course 選択中の経路\n * @param firstDepartureTime 最初の区間の出発時刻\n * @param isDepartureGuide 出発案内か\n */\nexport const displayMkTaxiBanner = (place: Place | null, firstDepartureTime: Date, flightStatus: FlightInfo, isDepartureGuide: boolean): React.ReactNode | null => {\n  const isHire = MKTaxiClass.isHireCar(flightStatus, isDepartureGuide, true);\n  // MKハイヤーの場合には表示しない\n  if(isHire || !place) {\n    return null;\n  }\n  \n  const flightDate = flightStatus.getFlightTimeDate(isDepartureGuide);\n  const airportCode = isDepartureGuide? flightStatus.depAirportCode : flightStatus.arrAirportCode;\n  const isTYO = MKTaxiClass.isTYO(airportCode);\n  const isShowDateTYO = DateTime.isMkTaxiTYO(flightDate);\n  // バナー表示有効期間外の場合には何も表示しない\n  const isShowOtherAirportDate = DateTime.isMkTaxi(flightDate);\n  const isShowDate = isTYO? isShowDateTYO: isShowOtherAirportDate;\n  if(!isShowDate) {\n    return null;\n  }\n  // // 国際線到着のときには表示しない\n  // if(!flightStatus.isDomestic && !isDepartureGuide) {\n  //   return null;\n  // }\n  const price = getTargetTaxiPrice(flightStatus, isDepartureGuide, place, isHire);\n  if (price) {\n    return (\n      <MkTaxi\n        flightInfo={flightStatus}\n      />\n    )\n  }\n  return null;\n}\n\n/**\n * MKハイヤーのバナーを表示する\n * @param place ユーザ指定地点情報\n * @param course 選択中の経路\n * @param firstDepartureTime 最初の区間の出発時刻\n * @param isDepartureGuide 出発案内か\n */\nexport const displayMkHireBanner = (place: Place | null, firstDepartureTime: Date, flightStatus: FlightInfo, isDepartureGuide: boolean): React.ReactNode | null => {\n  const isHire = MKTaxiClass.isHireCar(flightStatus, isDepartureGuide, true);\n  // MKタクシーの場合のみ表示する\n  if(!isHire || !place) {\n    return null;\n  }\n\n  const isShowDate = DateTime.isMkHire(firstDepartureTime);\n  // バナー表示有効期間外の場合には何も表示しない\n  if(!isShowDate) {\n    return null;\n  }\n  // 到着案内のみ表示する\n  if(isDepartureGuide) {\n    return null;\n  }\n  const price = getTargetTaxiPrice(flightStatus, isDepartureGuide, place, isHire);\n  if (price) {\n    return (\n      <MkTaxi\n        flightInfo={flightStatus}\n      />\n    )\n  }\n  return null;\n}\n\n/** 搭乗便が欠航であるかを判別する。 */\nconst isCanceled = (flightInfo: FlightInfo, date: Date) => {\n  // フォーム上で指定された日付と一致する(フォーム上で指定された日付で運航情報が取得できている)、かつ欠航である場合。\n  return isSameDay(flightInfo.eta, date) && flightInfo.isCanceled();\n}\n\n/** dr4=HNDかつ羽田到着の場合には特定のバナーを非表示にする */\nexport const isHiddenHNDArrival = (universalMaaSQuery: UniversalMaaSQuery, flightStatus: FlightInfo) => {\n  return universalMaaSQuery.dr4 === 'HND' && flightStatus.arrAirportCode === 'HND';\n}\n\n/**\n * レンタカーバナーの表示条件を満たすかを判別する関数。\n * @param lang 言語情報\n * @param isDomestic 国内線化\n * @param flightInfo フライト情報\n * @param date ユーザー指定日付情報\n * @param um UniversalMaaS用クエリ\n * @returns\n */\nexport const isDisplayRentalCar = (lang: Lang, isDomestic: boolean, flightInfo: FlightInfo, date: Date, um: UniversalMaaSQuery) => {\n  // 下記の4つの条件を満たすこと。(2022/05/17 現在。)\n  // 1.空港アクセスナビが日本語版であること。\n  // 2.指定された便名が国内線であること。\n  // 3.指定された便名で情報が取得できていること。\n  // 4.フォーム上で指定された日付が翌日以降であること。\n  // 5.フォーム上の日付で運航情報を取得できている場合、運航予定である(欠航ではない)こと。\n  // 6. dr4=HNDかつ到着空港が羽田ではないこと\n  return lang === Lang.ja && isDomestic && flightInfo.hasData && DateTime.isAfterToday(date) && !isCanceled(flightInfo, date) && !isHiddenHNDArrival(um, flightInfo);\n}\n\n/** 沖縄バスの広告表示をするかを判定する関数 */\nexport const isDisplayOkinawaBus = (lang: Lang, isDepartureGuide: boolean, date: Date, isShowOkinawaBusLink: boolean) => {\n  /**\n   * 以下の条件を満たすこと\n   * 1. 入力された地点が沖縄バスのバス停の近くであること(結果はisShowOkinawaBusLinkに格納済)\n   * 2. 到着案内であること\n   * 3. 那覇空港到着便であること(未確認)\n   * 4. 日本語版であること\n   * 5. 日付が異常値でないこと\n   * 6. 3ヶ月前の同日〜前日までの間であること\n   */\n  // 2. 到着案内であること\n  if(isDepartureGuide) {\n    return false;\n  }\n  // 4. 日本語版であること\n  if(lang !== Lang.ja) {\n    return false;\n  }\n  // 5. 日付が異常値でないこと\n  if(DateTime.isInvalidDate(date)) {\n    return false;\n  }\n  // 6. 3ヶ月前の同日〜前日までの間であること\n  if(!DateTime.isShowOkinawaBusBanner(date)) {\n    return false;\n  }\n  // 1. 入力された地点が沖縄バスのバス停の近くであること\n  return isShowOkinawaBusLink;\n}\n\n/** Airporter沖縄の表示条件を満たすかを判別する関数 */\nexport const isDisplayAirporterOkinawa = (flightStatus: FlightInfo, lang: Lang) => {\n  // 以下の4つの条件を満たすこと。(2021/11/08 現在)\n  // 1.那覇空港発着の場合\n  // 2-1. 空港→ホテルの配送の場合、那覇空港に14:00までに到着する便であること(2021/11/08更新)\n  // 2-2. ホテル→空港の配送の場合、那覇空港17:30以降出発便であること\n  // 3-1. 翌日以降の搭乗便の場合であること\n  // 3-2. 今日の搭乗便かつ空港→ホテルの配送の場合、現在時刻が14:00以前であること(2022/03/22更新)\n  // 3-3. 今日の搭乗便かつホテル→空港の配送の場合、現在時刻が10:30以前であること\n  // 4. (暫定:英語版バナーが来るまで) 日本語版の場合\n  const now = new Date();\n  const airportCodeList = [ flightStatus.depAirportCode, flightStatus.arrAirportCode ];\n  /** 空港→ホテルの配送(沖縄到着便)であるかを表すフラグ。 */\n  const isAirportToHotel = flightStatus.arrAirportCode === 'OKA';\n  /** フライト日時。(「空港→ホテル」の配送の場合はフライト到着時間、「ホテル→空港」の配送の場合はフライト出発時間を設定する。) */\n  const flightDate = isAirportToHotel ? flightStatus.getFlightArrivalDate() : flightStatus.getFlightDepartureDate();\n  // 1.那覇空港発着の場合\n  if( !airportCodeList.includes('OKA') ) {\n    return false;\n  }\n  if( isAirportToHotel ) {\n    // 2-1. 空港→ホテルの配送の場合、那覇空港に14:00までに到着する便であること(2021/11/08更新)\n    if( flightDate.getHours() > 14 || (flightDate.getHours() === 14 && flightDate.getMinutes() > 0) ) {\n      return false;\n    }\n  } else {\n    // 2-2. 那覇空港17:30以降出発便\n    if( flightDate.getHours() < 17 || (flightDate.getHours() === 17 && flightDate.getMinutes() < 30) ) {\n      return false;\n    }\n  }\n  // 3-1. 翌日以降の搭乗便の場合\n  if(DateTime.isBeforeToday(flightDate)) {\n    return false;\n  }\n  // 3-2. 今日の搭乗便かつ空港→ホテルの配送の場合、現在時刻が14:00以前であること(2022/03/22更新)\n  if(isToday(flightDate)) {\n    if(isAirportToHotel) {\n      if( now.getHours() > 14 || (now.getHours() === 14 && now.getMinutes() > 0)) {\n        return false;\n      }\n    } else {\n      // 3-3. 今日の搭乗便かつホテル→空港の配送の場合、現在時刻が10:30以前であること\n      if( now.getHours() > 10 || (now.getHours() === 10 && now.getMinutes() > 30)) {\n        return false;\n      }\n    }\n  }\n  // 4. (暫定:英語版バナーが来るまで) 日本語版の場合\n  if(lang !== Lang.ja) {\n    return false;\n  }\n  return true;\n}\n\n/**\n * 北谷MaaSのバナー表示判定条件\n * @param place ユーザ指定地点情報\n * @param flightStatus フライト情報\n * @param lang 言語情報\n * @returns\n */\nexport const isDisplayChatanMaasBanner = (isDepartureGuide: boolean, place: Place, flightStatus: FlightInfo, lang: Lang) => {\n  // 以下の4つの条件を満たすこと。(2021/11/2 現在)\n  // 1. 那覇空港着の場合\n  // 2-1. 那覇空港→目的地(住所が北谷町)までの経路検索\n  // 2-2. 那覇空港→目的地(住所が北谷町)までの結果一覧画面\n  // 2-3. 那覇空港→目的地(住所が北谷町)までの結果詳細画面\n  // 3. 日本語版の場合\n\n  // 1. 到着案内であること\n  if(isDepartureGuide) {\n    return false;\n  }\n\n  /** 沖縄到着便であるかを表すフラグ。 */\n  const isArrAirportOKA = flightStatus.arrAirportCode === 'OKA';\n  if(!isArrAirportOKA) {\n    return false;\n  }\n\n  /** 2. 目的地に北谷町が含まれているかどうか */\n  const isArrPlaceOfChatan = (place.prefecture.includes('沖縄県') && place.city.includes('北谷町'));\n  if(!isArrPlaceOfChatan) {\n    return false;\n  }\n\n  // 3. 日本語版の場合\n  return lang === Lang.ja;\n}\n\n/**\n * ANA保険バナーを表示するか判定\n * @param lang 言語情報\n * @param flightInfo フライト情報\n * @param um UMクエリ情報\n * @returns\n */\nexport const isDisplayANAInsurance = (lang: Lang, flightInfo: FlightInfo, um: UniversalMaaSQuery) => {\n  return isJapanese(lang) && !isHiddenHNDArrival(um, flightInfo);\n}\n","// ANAきた北海道フリーパス関連の定数を扱うClass\nclass ShowJRHookaidoNorthFreePass {\n  // 使用する路線一覧\n  static showLineList = [\n    5,  // JR函館本線(小樽-旭川)\n    9,  // JR千歳線(苫小牧-札幌)\n    10, // JR千歳線(新千歳空港-南千歳)\n    11, // JR石勝線(南千歳-新得)\n    13, // JR室蘭本線(長万部-岩見沢)\n    16, // JR留萌本線\n    17, // JR富良野線\n    18, // JR根室本線\n    20, // JR宗谷本線\n    21  // JR石北本線\n  ];\n  // フリーパス区間外の駅一覧\n  static outOfFreePassStationList = [\n    // JR根室本線(布部〜釧路)\n    20422, 20589, 20252, 20119, 20465, 20031, 20100, 20275, 20349, 20542, 20571, 20301, 20392, 20440, 20105, 20219, 20532, 20351, 20033, 20347, 20359, 20282, 20061, 20022, 20111, 20506, 20262, 20399, 20232, 20097, 20267, 20279, 20177,\n    // JR千歳線(植苗-苫小牧)\n    20053, 20425, 20352,\n    // JR石勝線(川端-新得)\n    20142, 20307, 20281, 20251, 20353, 20275,\n    // JR石北本線(南永山-網走)\n    20555, 20459, 20163, 20216, 20344, 20229, 20029, 20007, 20369, 20004, 20028, 20342, 20129, 20261, 20538, 20295, 20068, 20584, 20032, 20030, 29320, 20607, 20006, 20458, 20395, 20168, 20439, 20047, 20311, 20457, 20495, 20415, 20569, 20602, 20025,\n    // JR室蘭本線(安平-長万部)\n    20026, 20453, 20340, 20425, 20352, 20008, 20045, 20394, 20225, 20260, 20438, 20170, 20308, 20194, 20433, 20354, 20525, 20616, 20475, 20577, 20214, 20192, 20541, 20167, 20313, 20381, 20055, 20345, 20357, 20072, 20610, 20198, 20241, 20089\n  ];\n  // 目的地リスト\n  static arrStationList = [\n    20274, // 新千歳空港\n    20553, // 南千歳\n    20220, // 札幌\n    20098, // 小樽\n    20069, // 追分\n    20052, // 岩見沢\n    20306, // 滝川\n    20499, // 深川\n    20012, // 旭川\n    20490, // 美瑛\n    20504, // 富良野\n    20608, // 留萌\n    20612, // 稚内\n  ]\n}\n\nexport default ShowJRHookaidoNorthFreePass;\n","/**\n * JR九州の路線コード一覧\n */\nexport const JRKyushuLineList: number[] = [\n  233, // JR九州新幹線\n  234, // JR山陽本線(下関-門司)\n  235, // JR鹿児島本線(門司港-八代)\n  236, // JR鹿児島本線(川内-鹿児島)\n  237, // JR香椎線\n  240, // JR福北ゆたか線\n  241, // JR三角線\n  242, // JR肥薩線\n  244, // JR指宿枕崎線\n  245, // JR長崎本線\n  246, // JR長崎本線(喜々津-長与-浦上)\n  247, // JR唐津線\n  248, // JR筑肥線(姪浜-西唐津)\n  249, // JR筑肥線(西唐津-伊万里)\n  250, // JR佐世保線\n  251, // JR大村線\n  252, // JR久大本線\n  254, // JR豊肥本線\n  256, // JR日豊本線\n  257, // JR日田彦山線\n  258, // JR日南線\n  259, // JR宮崎空港線\n  261, // JR吉都線\n  263, // JR若松線\n  264, // JR原田線\n  265  // JR後藤寺線\n];\n\nexport const JRKyushuTrainList: {[key: string]: string[]} = {\n  ja: [\n    \"有明\",\n    \"かもめ\",\n    \"みどり\",\n    \"ハウステンボス\",\n    \"にちりん\",\n    \"ソニック\",\n    \"ゆふ\",\n    \"ゆふいんの森\",\n    \"きらめき\",\n    \"きりしま\",\n    \"ひゅうが\",\n    \"かいおう\",\n    \"あそぼーい!\",\n    \"SL人吉\",\n    \"ひかり\",\n    \"のぞみ\",\n    \"こだま\",\n    \"さくら\",\n    \"みずほ\",\n    \"快速 有田陶器市\",\n    \"つばめ\",\n    \"九州横断特急\",\n    \"はやとの風\",\n    \"いさぶろう\",\n    \"しんぺい\",\n    \"指宿のたまて箱\",\n    \"いさぶろう\",\n    \"しんぺい\",\n    \"かわせみ やませみ\",\n    \"きらめき\",\n    \"ランタンかもめ\",\n    \"海幸山幸\",\n    \"有田陶器市みどり\",\n    \"マリン・パノラマ\",\n    \"マリンライナ-\",\n    \"雷鳥\",\n    \"びわこエクスプレス\",\n    \"しらさぎ\",\n    \"まいづる\",\n    \"はるか\",\n    \"くろしお\",\n    \"スーパーくろしお\",\n    \"オーシャンアロー\",\n    \"はしだて\",\n    \"タンゴディスカバリー\",\n    \"タンゴエクスプローラー\",\n    \"文殊\",\n    \"きのさき\",\n    \"北近畿\",\n    \"はまかぜ\",\n    \"スーパーいなば\",\n    \"やくも\",\n    \"スーパーまつかぜ\",\n    \"スーパーおき\",\n    \"うずしお\",\n    \"南風\",\n    \"うずしおアンパンマン\",\n    \"ビジネスサンダーバード\",\n    \"ひだ\",\n    \"SL山口\",\n    \"瀬戸内マリンビュー\",\n    \"きたぐに\",\n    \"みすず潮彩\",\n    \"SL北びわこ\",\n    \"こうのとり\",\n    \"南風アンパンマン\",\n    \"南紀\",\n    \"ユニバーサルエクスプレス\",\n    \"コバルトブルー\",\n    \"あまるべロマン\",\n    \"かにカニはまかぜ\",\n    \"スーパーはくと\",\n    \"タンゴディスカバリー\",\n    \"ふるさと雷鳥\",\n    \"阿蘇ゆるっと博\",\n    \"コンサートきりしま\",\n    \"コンサートかもめ\",\n    \"山笠有明\",\n    \"山笠きらめき\",\n    \"瀬戸大橋アンパンマン\",\n    \"奥出雲おろち\",\n    \"関門・MUSASHI\",\n    \"B&Sみやざき\",\n    \"おはようくろしお\",\n    \"能登\",\n    \"おはようエクスプレス\",\n    \"おやすみエクスプレス\",\n    \"A列車で行こう\",\n    \"清盛マリンビュー\",\n    \"水戸岡鋭治幸福列車\",\n    \"快速人吉\",\n    \"九十九島みどり\",\n    \"官兵衛きらめき\",\n    \"しおかぜ\",\n    \"サンダーバード\",\n    \"ダイナスター\",\n    \"能登かがり火\",\n    \"ハウステンボスCD\",\n    \"あそぼーい!\",\n    \"らくラクはりま\",\n    \"あそ\"\n  ],\n  en: [\n    \"Ariake\",\n    \"Kamome\",\n    \"Midori\",\n    \"HuisTenBosch\",\n    \"Nichirin\",\n    \"Sonic\",\n    \"Yufu\",\n    \"Yufuin-No-Mori\",\n    \"Kirameki\",\n    \"Kirishima\",\n    \"Hyuga\",\n    \"Kaio\",\n    \"Asoboy!\",\n    \"SL-Hitoyoshi\",\n    \"Hikari\",\n    \"Nozomi\",\n    \"Kodama\",\n    \"Sakura\",\n    \"Mizuho\",\n    \"Arita-Tokiichi\",\n    \"Tsubame\",\n    \"Kyushu-Odan-Tokkyu\",\n    \"Hayato-No-Kaze\",\n    \"Isaburo\",\n    \"Shimpei\",\n    \"Ibusuki-no-Tamatebako\",\n    \"Isaburo\",\n    \"Shimpei\",\n    \"Kawasemi-Yamasemi\",\n    \"Kirameki\",\n    \"Lantern-Kamome\",\n    \"Umisachi-Yamasachi\",\n    \"Arita-Tokiichi-Midori\",\n    \"Marine-Panorama\",\n    \"Marine-Liner\",\n    \"Raicho\",\n    \"Biwako-Express\",\n    \"Shirasagi\",\n    \"Maizuru\",\n    \"Haruka\",\n    \"Kuroshio\",\n    \"Super-Kuroshio\",\n    \"Ocean-Arrow\",\n    \"Hashidate\",\n    \"Tango-Discovery\",\n    \"Tango-Explorer\",\n    \"Monju\",\n    \"Kinosaki\",\n    \"Kita-Kinki\",\n    \"Hamakaze\",\n    \"Super-Inaba\",\n    \"Yakumo\",\n    \"Super-Matsukaze\",\n    \"Super-Oki\",\n    \"Uzushio\",\n    \"Nanpu\",\n    \"Uzushio-Anpanman\",\n    \"Business-Thunder-Bird\",\n    \"Hida\",\n    \"SL-Yamaguchi\",\n    \"Setouchi-Marine-View\",\n    \"Kitaguni\",\n    \"Misuzu-Shiosai\",\n    \"SL-Kita-Biwako\",\n    \"Kounotori\",\n    \"Nanpu-Anpanman\",\n    \"Nanki\",\n    \"Universal-Express\",\n    \"Cobalt-Blue\",\n    \"Amarube-Roman\",\n    \"Kani-Kani-Hamakaze\",\n    \"Super-Hakuto\",\n    \"Tango-Discovery\",\n    \"Furusato-Raicho\",\n    \"Aso-Yuruttohaku\",\n    \"Concert-Kirishima\",\n    \"Concert-Kamome\",\n    \"Yamakasa-Ariake\",\n    \"Yamakasa-Kirameki\",\n    \"Seto-ohashi-Anpanman\",\n    \"Okuizumo-Orochi\",\n    \"Kanmon-Musashi\",\n    \"B&S Miyazaki\",\n    \"Ohayo-Kuroshio\",\n    \"Noto\",\n    \"Ohayo-Express\",\n    \"Oyasumi-Express\",\n    \"A-Ressha-de-Iko\",\n    \"Kiyomori-Marine-View\",\n    \"Mitooka-Eiji-Koufuku-Ressha\",\n    \"Hitoyoshi\",\n    \"Kujyukushima-Midori\",\n    \"Kanbe-Kirameki\",\n    \"Shiokaze\",\n    \"Thunder-Bird\",\n    \"Dinostar\",\n    \"Noto-Kagaribi\",\n    \"HuisTenBosch-CD\",\n    \"Asoboy!\",\n    \"Rakuraku-harima\",\n    \"36+3\",\n    \"Aso\"\n  ]\n};\n\nexport const JRKyushuStationList: { [key: string]: {[key: string]: string} } = {\n  \"ja\": {\n    \"28054\": \"赤間\",\n    \"28058\": \"安部山公園\",\n    \"28061\": \"荒木\",\n    \"28062\": \"飯塚\",\n    \"28063\": \"伊賀\",\n    \"28064\": \"一貴山\",\n    \"28065\": \"池尻\",\n    \"28066\": \"石田\",\n    \"28067\": \"石原町\",\n    \"28074\": \"今宿\",\n    \"28075\": \"うきは\",\n    \"28077\": \"宇島\",\n    \"28078\": \"宇美\",\n    \"28079\": \"海ノ中道\",\n    \"28080\": \"浦田\",\n    \"28082\": \"枝光\",\n    \"28084\": \"海老津\",\n    \"28088\": \"大野城\",\n    \"28093\": \"大牟田\",\n    \"28095\": \"奥洞海\",\n    \"28097\": \"小波瀬西工大前\",\n    \"28098\": \"折尾\",\n    \"28100\": \"遠賀川\",\n    \"28105\": \"香椎\",\n    \"28107\": \"香椎神宮\",\n    \"28109\": \"春日\",\n    \"28112\": \"勝野\",\n    \"28113\": \"門松\",\n    \"28116\": \"加布里\",\n    \"28120\": \"上穂波\",\n    \"28121\": \"上三緒\",\n    \"28122\": \"香春\",\n    \"28124\": \"苅田\",\n    \"28127\": \"雁ノ巣\",\n    \"28128\": \"九産大前\",\n    \"28129\": \"九州工大前\",\n    \"28130\": \"教育大前\",\n    \"28135\": \"城戸南蔵院前\",\n    \"28137\": \"銀水\",\n    \"28138\": \"朽網\",\n    \"28142\": \"鞍手\",\n    \"28144\": \"久留米\",\n    \"28145\": \"九郎原\",\n    \"28146\": \"黒崎\",\n    \"28149\": \"桂川(福岡県)\",\n    \"28152\": \"古賀\",\n    \"28155\": \"小倉\",\n    \"28156\": \"小竹\",\n    \"28157\": \"小森江\",\n    \"28162\": \"西戸崎\",\n    \"28163\": \"採銅所\",\n    \"28164\": \"酒殿\",\n    \"28167\": \"篠栗\",\n    \"28168\": \"笹原\",\n    \"28171\": \"志井\",\n    \"28173\": \"志井公園\",\n    \"28174\": \"椎田\",\n    \"28176\": \"鹿家\",\n    \"28180\": \"下鴨生\",\n    \"28181\": \"下曽根\",\n    \"28182\": \"下山門\",\n    \"28184\": \"新飯塚\",\n    \"28186\": \"新田原\",\n    \"28188\": \"新入\",\n    \"28189\": \"新原\",\n    \"28190\": \"城野\",\n    \"28193\": \"須恵\",\n    \"28194\": \"須恵中央\",\n    \"28195\": \"周船寺\",\n    \"28196\": \"瀬高\",\n    \"28197\": \"善導寺\",\n    \"28198\": \"添田\",\n    \"28201\": \"田川伊田\",\n    \"28202\": \"田川後藤寺\",\n    \"28203\": \"竹下\",\n    \"28205\": \"田主丸\",\n    \"28207\": \"大行司\",\n    \"28209\": \"大入\",\n    \"28211\": \"長者原\",\n    \"28212\": \"筑後大石\",\n    \"28213\": \"筑後草野\",\n    \"28214\": \"筑後吉井\",\n    \"28216\": \"筑前岩屋\",\n    \"28217\": \"筑前植木\",\n    \"28218\": \"筑前内野\",\n    \"28219\": \"筑前庄内\",\n    \"28220\": \"福工大前\",\n    \"28221\": \"筑前大分\",\n    \"28222\": \"筑前垣生\",\n    \"28223\": \"筑前深江\",\n    \"28224\": \"筑前前原\",\n    \"28225\": \"筑前山家\",\n    \"28226\": \"筑前山手\",\n    \"28230\": \"千鳥\",\n    \"28232\": \"築城\",\n    \"28237\": \"天道\",\n    \"28238\": \"天拝山\",\n    \"28239\": \"東郷\",\n    \"28246\": \"戸畑\",\n    \"28248\": \"都府楼南\",\n    \"28250\": \"土井\",\n    \"28255\": \"中間\",\n    \"28257\": \"奈多\",\n    \"28258\": \"鯰田\",\n    \"28260\": \"西小倉\",\n    \"28262\": \"西添田\",\n    \"28278\": \"西牟田\",\n    \"28280\": \"直方\",\n    \"28282\": \"羽犬塚\",\n    \"28283\": \"博多\",\n    \"28286\": \"箱崎\",\n    \"28289\": \"波多江\",\n    \"28293\": \"原田\",\n    \"28294\": \"原町\",\n    \"28299\": \"東福間\",\n    \"28300\": \"東水巻\",\n    \"28301\": \"彦山\",\n    \"28305\": \"福間\",\n    \"28306\": \"福吉\",\n    \"28309\": \"藤ノ木\",\n    \"28310\": \"二島\",\n    \"28311\": \"二日市\",\n    \"28312\": \"船尾\",\n    \"28313\": \"筑後船小屋\",\n    \"28315\": \"豊前川崎\",\n    \"28316\": \"豊前松江\",\n    \"28317\": \"豊前桝田\",\n    \"28318\": \"宝珠山\",\n    \"28322\": \"舞松原\",\n    \"28326\": \"御井\",\n    \"28328\": \"三毛門\",\n    \"28329\": \"水城\",\n    \"28331\": \"水巻\",\n    \"28334\": \"南久留米\",\n    \"28335\": \"南小倉\",\n    \"28336\": \"南瀬高\",\n    \"28337\": \"南福岡\",\n    \"28338\": \"南行橋\",\n    \"28343\": \"姪浜\",\n    \"28344\": \"門司\",\n    \"28345\": \"門司港\",\n    \"28351\": \"八幡\",\n    \"28353\": \"行橋\",\n    \"28354\": \"柚須\",\n    \"28356\": \"吉塚\",\n    \"28357\": \"吉野\",\n    \"28358\": \"呼野\",\n    \"28359\": \"若松\",\n    \"28360\": \"和白\",\n    \"28361\": \"渡瀬\",\n    \"28362\": \"有田\",\n    \"28363\": \"伊賀屋\",\n    \"28364\": \"伊万里\",\n    \"28365\": \"岩屋\",\n    \"28366\": \"牛津\",\n    \"28368\": \"相知\",\n    \"28369\": \"大川野\",\n    \"28371\": \"大町(佐賀県)\",\n    \"28372\": \"小城\",\n    \"28373\": \"鬼塚\",\n    \"28374\": \"金石原\",\n    \"28376\": \"上有田\",\n    \"28377\": \"上伊万里\",\n    \"28378\": \"唐津\",\n    \"28380\": \"神埼\",\n    \"28381\": \"厳木\",\n    \"28382\": \"北方\",\n    \"28383\": \"基山\",\n    \"28386\": \"久保田\",\n    \"28387\": \"けやき台\",\n    \"28388\": \"駒鳴\",\n    \"28389\": \"佐賀\",\n    \"28391\": \"佐里\",\n    \"28393\": \"高橋\",\n    \"28394\": \"多久\",\n    \"28395\": \"武雄温泉\",\n    \"28396\": \"田代\",\n    \"28398\": \"多良\",\n    \"28399\": \"鳥栖\",\n    \"28400\": \"中多久\",\n    \"28401\": \"中原\",\n    \"28402\": \"永尾\",\n    \"28403\": \"鍋島\",\n    \"28405\": \"西相知\",\n    \"28406\": \"西唐津\",\n    \"28407\": \"虹ノ松原\",\n    \"28409\": \"浜崎\",\n    \"28410\": \"東唐津\",\n    \"28411\": \"東多久\",\n    \"28413\": \"肥前旭\",\n    \"28414\": \"肥前飯田\",\n    \"28415\": \"肥前大浦\",\n    \"28416\": \"肥前鹿島\",\n    \"28417\": \"肥前久保\",\n    \"28418\": \"肥前白石\",\n    \"28419\": \"肥前長野\",\n    \"28420\": \"肥前七浦\",\n    \"28421\": \"肥前浜\",\n    \"28422\": \"肥前麓\",\n    \"28423\": \"肥前山口\",\n    \"28424\": \"肥前竜王\",\n    \"28426\": \"本牟田部\",\n    \"28428\": \"三間坂\",\n    \"28430\": \"桃川\",\n    \"28432\": \"山本\",\n    \"28433\": \"吉野ヶ里公園\",\n    \"28434\": \"和多田\",\n    \"28443\": \"諫早\",\n    \"28446\": \"市布\",\n    \"28449\": \"岩松\",\n    \"28451\": \"現川\",\n    \"28452\": \"浦上\",\n    \"28457\": \"小江\",\n    \"28460\": \"大草\",\n    \"28464\": \"大村\",\n    \"28465\": \"小串郷\",\n    \"28473\": \"川棚\",\n    \"28475\": \"喜々津\",\n    \"28482\": \"高田(長崎県)\",\n    \"28484\": \"小長井\",\n    \"28490\": \"佐世保\",\n    \"28506\": \"諏訪\",\n    \"28512\": \"彼杵\",\n    \"28518\": \"竹松\",\n    \"28524\": \"大塔\",\n    \"28525\": \"千綿\",\n    \"28533\": \"長崎\",\n    \"28537\": \"長里\",\n    \"28538\": \"長与\",\n    \"28541\": \"西諫早\",\n    \"28542\": \"西浦上\",\n    \"28547\": \"早岐\",\n    \"28548\": \"ハウステンボス\",\n    \"28549\": \"南風崎\",\n    \"28552\": \"日宇\",\n    \"28553\": \"東諫早\",\n    \"28555\": \"東園\",\n    \"28557\": \"肥前古賀\",\n    \"28558\": \"肥前長田\",\n    \"28565\": \"本川内\",\n    \"28571\": \"松原\",\n    \"28574\": \"三河内\",\n    \"28576\": \"道ノ尾\",\n    \"28583\": \"湯江\",\n    \"28586\": \"赤瀬\",\n    \"28587\": \"赤水\",\n    \"28588\": \"阿蘇\",\n    \"28591\": \"荒尾(熊本県)\",\n    \"28592\": \"有佐\",\n    \"28593\": \"一勝地\",\n    \"28595\": \"いこいの村\",\n    \"28596\": \"石打ダム\",\n    \"28597\": \"市ノ川\",\n    \"28599\": \"植木\",\n    \"28601\": \"内牧\",\n    \"28602\": \"宇土\",\n    \"28605\": \"網田\",\n    \"28606\": \"大野下\",\n    \"28608\": \"小川\",\n    \"28609\": \"大畑\",\n    \"28610\": \"海路\",\n    \"28612\": \"鎌瀬\",\n    \"28613\": \"上熊本\",\n    \"28618\": \"川尻\",\n    \"28622\": \"球泉洞\",\n    \"28626\": \"熊本\",\n    \"28629\": \"崇城大学前\",\n    \"28642\": \"木葉\",\n    \"28645\": \"坂本\",\n    \"28648\": \"三里木\",\n    \"28652\": \"白石(熊本県)\",\n    \"28653\": \"新水前寺\",\n    \"28657\": \"水前寺\",\n    \"28662\": \"住吉(熊本県)\",\n    \"28664\": \"瀬田(熊本県)\",\n    \"28665\": \"瀬戸石\",\n    \"28666\": \"千丁\",\n    \"28669\": \"滝水\",\n    \"28671\": \"竜田口\",\n    \"28672\": \"立野\",\n    \"28673\": \"田原坂\",\n    \"28674\": \"玉名\",\n    \"28677\": \"段\",\n    \"28681\": \"東海学園前\",\n    \"28685\": \"長洲\",\n    \"28686\": \"波野\",\n    \"28687\": \"那良口\",\n    \"28689\": \"西里\",\n    \"28690\": \"西人吉\",\n    \"28693\": \"葉木\",\n    \"28696\": \"波多浦\",\n    \"28697\": \"原水\",\n    \"28700\": \"肥後伊倉\",\n    \"28701\": \"肥後大津\",\n    \"28704\": \"肥後長浜\",\n    \"28707\": \"人吉\",\n    \"28711\": \"平成\",\n    \"28714\": \"松橋\",\n    \"28715\": \"三角\",\n    \"28717\": \"緑川\",\n    \"28719\": \"南荒尾\",\n    \"28720\": \"南熊本\",\n    \"28722\": \"宮地\",\n    \"28724\": \"武蔵塚\",\n    \"28726\": \"矢岳\",\n    \"28727\": \"八代\",\n    \"28730\": \"吉尾\",\n    \"28731\": \"渡\",\n    \"28732\": \"朝地\",\n    \"28733\": \"浅海井\",\n    \"28734\": \"天ケ瀬\",\n    \"28735\": \"天津\",\n    \"28736\": \"犬飼\",\n    \"28737\": \"今津\",\n    \"28738\": \"今山\",\n    \"28739\": \"宇佐\",\n    \"28740\": \"臼杵\",\n    \"28741\": \"恵良\",\n    \"28742\": \"大分\",\n    \"28744\": \"大神\",\n    \"28745\": \"大在\",\n    \"28746\": \"大鶴\",\n    \"28747\": \"緒方\",\n    \"28748\": \"鬼瀬\",\n    \"28749\": \"小野屋\",\n    \"28750\": \"海崎\",\n    \"28751\": \"賀来\",\n    \"28752\": \"上臼杵\",\n    \"28753\": \"上岡\",\n    \"28754\": \"亀川\",\n    \"28755\": \"狩生\",\n    \"28756\": \"北山田\",\n    \"28757\": \"杵築\",\n    \"28758\": \"熊崎\",\n    \"28759\": \"幸崎\",\n    \"28760\": \"佐伯\",\n    \"28761\": \"坂ノ市\",\n    \"28762\": \"佐志生\",\n    \"28763\": \"庄内\",\n    \"28764\": \"敷戸\",\n    \"28765\": \"重岡\",\n    \"28766\": \"下ノ江\",\n    \"28767\": \"菅尾\",\n    \"28768\": \"杉河内\",\n    \"28769\": \"宗太郎\",\n    \"28770\": \"高城\",\n    \"28771\": \"滝尾\",\n    \"28772\": \"竹中\",\n    \"28773\": \"立石\",\n    \"28774\": \"玉来\",\n    \"28775\": \"津久見\",\n    \"28776\": \"鶴崎\",\n    \"28777\": \"光岡\",\n    \"28778\": \"天神\",\n    \"28779\": \"直川\",\n    \"28780\": \"直見\",\n    \"28781\": \"中津\",\n    \"28782\": \"中判田\",\n    \"28783\": \"中山香\",\n    \"28784\": \"西大分\",\n    \"28785\": \"西屋敷\",\n    \"28786\": \"野矢\",\n    \"28787\": \"東中津\",\n    \"28788\": \"東別府\",\n    \"28789\": \"引治\",\n    \"28790\": \"日代\",\n    \"28791\": \"日出\",\n    \"28792\": \"日田\",\n    \"28793\": \"古国府\",\n    \"28794\": \"豊前善光寺\",\n    \"28795\": \"豊前長洲\",\n    \"28796\": \"豊後荻\",\n    \"28797\": \"豊後清川\",\n    \"28798\": \"豊後国分\",\n    \"28799\": \"豊後竹田\",\n    \"28800\": \"豊後豊岡\",\n    \"28801\": \"豊後中川\",\n    \"28802\": \"豊後中村\",\n    \"28803\": \"豊後三芳\",\n    \"28804\": \"豊後森\",\n    \"28805\": \"別府(大分県)\",\n    \"28806\": \"別府大学\",\n    \"28807\": \"牧(大分県)\",\n    \"28808\": \"三重町\",\n    \"28809\": \"南大分\",\n    \"28810\": \"南由布\",\n    \"28811\": \"向之原\",\n    \"28812\": \"柳ケ浦\",\n    \"28813\": \"湯平\",\n    \"28814\": \"由布院\",\n    \"28815\": \"夜明\",\n    \"28816\": \"暘谷\",\n    \"28817\": \"青井岳\",\n    \"28818\": \"青島\",\n    \"28819\": \"旭ケ丘\",\n    \"28820\": \"油津\",\n    \"28822\": \"五十市\",\n    \"28823\": \"市棚\",\n    \"28824\": \"伊比井\",\n    \"28825\": \"内海\",\n    \"28826\": \"内之田\",\n    \"28827\": \"運動公園\",\n    \"28828\": \"えびの\",\n    \"28829\": \"えびの飯野\",\n    \"28830\": \"えびの上江\",\n    \"28831\": \"大堂津\",\n    \"28832\": \"飫肥\",\n    \"28833\": \"折生迫\",\n    \"28835\": \"門川\",\n    \"28836\": \"加納\",\n    \"28840\": \"川南\",\n    \"28841\": \"京町温泉\",\n    \"28842\": \"北川\",\n    \"28843\": \"北郷\",\n    \"28844\": \"北延岡\",\n    \"28845\": \"木花\",\n    \"28846\": \"清武\",\n    \"28847\": \"串間\",\n    \"28848\": \"小内海\",\n    \"28849\": \"子供の国\",\n    \"28850\": \"小林(宮崎県)\",\n    \"28852\": \"佐土原\",\n    \"28853\": \"財光寺\",\n    \"28855\": \"曽山寺\",\n    \"28856\": \"高崎新田\",\n    \"28858\": \"高鍋\",\n    \"28859\": \"高原\",\n    \"28860\": \"谷頭\",\n    \"28861\": \"谷之口\",\n    \"28862\": \"田野(宮崎県)\",\n    \"28863\": \"都農\",\n    \"28864\": \"土々呂\",\n    \"28865\": \"南郷\",\n    \"28866\": \"西小林\",\n    \"28868\": \"西都城\",\n    \"28869\": \"日南\",\n    \"28870\": \"延岡\",\n    \"28872\": \"蓮ケ池\",\n    \"28874\": \"日向大束\",\n    \"28876\": \"日向北方\",\n    \"28877\": \"日向沓掛\",\n    \"28878\": \"日向市\",\n    \"28879\": \"日向庄内\",\n    \"28880\": \"日向新富\",\n    \"28881\": \"日向住吉\",\n    \"28882\": \"日向長井\",\n    \"28883\": \"日向前田\",\n    \"28885\": \"東高崎\",\n    \"28886\": \"東都農\",\n    \"28888\": \"広原\",\n    \"28890\": \"福島今町\",\n    \"28891\": \"福島高松\",\n    \"28894\": \"真幸\",\n    \"28895\": \"万ケ塚\",\n    \"28896\": \"南方\",\n    \"28897\": \"南延岡\",\n    \"28898\": \"南日向\",\n    \"28899\": \"南宮崎\",\n    \"28900\": \"三股\",\n    \"28901\": \"美々津\",\n    \"28902\": \"都城\",\n    \"28903\": \"宮崎\",\n    \"28904\": \"宮崎空港\",\n    \"28905\": \"宮崎神宮\",\n    \"28907\": \"餅原\",\n    \"28908\": \"山之口\",\n    \"28909\": \"榎原\",\n    \"28910\": \"姶良\",\n    \"28914\": \"石垣\",\n    \"28915\": \"伊集院\",\n    \"28916\": \"出水\",\n    \"28917\": \"市来\",\n    \"28919\": \"指宿\",\n    \"28920\": \"入野(鹿児島県)\",\n    \"28921\": \"植村\",\n    \"28923\": \"宇宿\",\n    \"28925\": \"頴娃\",\n    \"28926\": \"頴娃大川\",\n    \"28927\": \"大隅大川原\",\n    \"28928\": \"大隅夏井\",\n    \"28929\": \"大隅横川\",\n    \"28930\": \"大山\",\n    \"28932\": \"開聞\",\n    \"28933\": \"鹿児島\",\n    \"28936\": \"加治木\",\n    \"28938\": \"上伊集院\",\n    \"28942\": \"嘉例川\",\n    \"28943\": \"喜入\",\n    \"28945\": \"北永野田\",\n    \"28946\": \"北俣\",\n    \"28947\": \"霧島神宮\",\n    \"28948\": \"霧島温泉\",\n    \"28949\": \"錦江\",\n    \"28951\": \"串木野\",\n    \"28952\": \"隈之城\",\n    \"28953\": \"栗野\",\n    \"28957\": \"郡元\",\n    \"28959\": \"国分(鹿児島県)\",\n    \"28960\": \"木場茶屋\",\n    \"28962\": \"五位野\",\n    \"28963\": \"御領\",\n    \"28964\": \"坂之上\",\n    \"28967\": \"薩摩板敷\",\n    \"28968\": \"薩摩今和泉\",\n    \"28970\": \"薩摩川尻\",\n    \"28971\": \"薩摩塩屋\",\n    \"28973\": \"薩摩松元\",\n    \"28974\": \"重富\",\n    \"28975\": \"志布志\",\n    \"28977\": \"白沢(鹿児島県)\",\n    \"28982\": \"慈眼寺\",\n    \"28983\": \"瀬々串\",\n    \"28984\": \"川内(鹿児島県)\",\n    \"28988\": \"財部\",\n    \"28990\": \"谷山\",\n    \"28993\": \"帖佐\",\n    \"28994\": \"鶴丸\",\n    \"28999\": \"中福良\",\n    \"29000\": \"中名\",\n    \"29002\": \"二月田\",\n    \"29005\": \"西頴娃\",\n    \"29006\": \"西大山\",\n    \"29007\": \"鹿児島中央\",\n    \"29010\": \"生見\",\n    \"29012\": \"隼人\",\n    \"29013\": \"表木山\",\n    \"29014\": \"東市来\",\n    \"29015\": \"東開聞\",\n    \"29016\": \"日当山\",\n    \"29017\": \"平川\",\n    \"29018\": \"前之浜\",\n    \"29019\": \"枕崎\",\n    \"29020\": \"松ケ浦\",\n    \"29021\": \"水成川\",\n    \"29022\": \"南鹿児島\",\n    \"29024\": \"宮ケ浜\",\n    \"29026\": \"山川\",\n    \"29027\": \"湯之元\",\n    \"29028\": \"吉松\",\n    \"29029\": \"竜ケ水\",\n    \"29041\": \"吉富(福岡県)\",\n    \"29061\": \"美咲が丘\",\n    \"29087\": \"田吉\",\n    \"29176\": \"一本松\",\n    \"29268\": \"スペースワールド\",\n    \"29277\": \"バルーンさが\",\n    \"29309\": \"久留米大学前\",\n    \"29328\": \"陣原\",\n    \"29348\": \"弥生が丘\",\n    \"29381\": \"大分大学前\",\n    \"29391\": \"新鳥栖\",\n    \"29392\": \"新大牟田\",\n    \"29393\": \"新玉名\",\n    \"29394\": \"新八代\",\n    \"29395\": \"新水俣\",\n    \"29450\": \"本城\",\n    \"29471\": \"千早\",\n    \"29551\": \"九大学研都市\",\n    \"29563\": \"光の森\",\n    \"29615\": \"歓遊舎ひこさん\",\n    \"29660\": \"ししぶ\",\n    \"29661\": \"広木\",\n    \"29662\": \"久留米高校前\",\n    \"29683\": \"新宮中央\",\n    \"29684\": \"神村学園前\",\n    \"29690\": \"富合\",\n    \"29774\": \"西熊本\",\n    \"29803\": \"糸島高校前\"\n  },\n  \"en\": {\n    \"28054\": \"AKAMA\",\n    \"28058\": \"ABEYAMA-KOEN\",\n    \"28061\": \"ARAKI\",\n    \"28062\": \"IIZUKA\",\n    \"28063\": \"IGA\",\n    \"28064\": \"IKISAN\",\n    \"28065\": \"IKEJIRI\",\n    \"28066\": \"ISHIDA\",\n    \"28067\": \"ISHIHARAMACHI\",\n    \"28074\": \"IMAJUKU\",\n    \"28075\": \"UKIHA\",\n    \"28077\": \"UNOSHIMA\",\n    \"28078\": \"UMI\",\n    \"28079\": \"UMINONAKAMICHI\",\n    \"28080\": \"URATA\",\n    \"28082\": \"EDAMITSU\",\n    \"28084\": \"EBITSU\",\n    \"28088\": \"ONOJO\",\n    \"28093\": \"OMUTA\",\n    \"28095\": \"OKU-DOKAI\",\n    \"28097\": \"OBASENISHIKODAI-MAE\",\n    \"28098\": \"ORIO\",\n    \"28100\": \"ONGAGAWA\",\n    \"28105\": \"KASHII\",\n    \"28107\": \"KASHII-JINGU\",\n    \"28109\": \"KASUGA\",\n    \"28112\": \"KATSUNO\",\n    \"28113\": \"KADOMATSU\",\n    \"28116\": \"KAFURI\",\n    \"28120\": \"KAMI-HONAMI\",\n    \"28121\": \"KAMI-MIO\",\n    \"28122\": \"KAWARA\",\n    \"28124\": \"KANDA\",\n    \"28127\": \"GANNOSU\",\n    \"28128\": \"KYUSANDAI-MAE\",\n    \"28129\": \"KYUSHUKODAI-MAE\",\n    \"28130\": \"KYOIKUDAI-MAE\",\n    \"28135\": \"KIDONANZOIN-MAE\",\n    \"28137\": \"GINSUI\",\n    \"28138\": \"KUSAMI\",\n    \"28142\": \"KURATE\",\n    \"28144\": \"KURUME\",\n    \"28145\": \"KUROBARU\",\n    \"28146\": \"KUROSAKI\",\n    \"28149\": \"KEISEN(FUKUOKA)\",\n    \"28152\": \"KOGA\",\n    \"28155\": \"KOKURA\",\n    \"28156\": \"KOTAKE\",\n    \"28157\": \"KOMORIE\",\n    \"28162\": \"SAITOZAKI\",\n    \"28163\": \"SAIDOSHO\",\n    \"28164\": \"SAKADO\",\n    \"28167\": \"SASAGURI\",\n    \"28168\": \"SASABARU\",\n    \"28171\": \"SHII\",\n    \"28173\": \"SHII-KOEN\",\n    \"28174\": \"SHIIDA\",\n    \"28176\": \"SHIKAKA\",\n    \"28180\": \"SHIMO-KAMOO\",\n    \"28181\": \"SHIMO-SONE\",\n    \"28182\": \"SHIMOYAMATO\",\n    \"28184\": \"SHIN-IIZUKA\",\n    \"28186\": \"SHINDEMBARU\",\n    \"28188\": \"SHINNYU\",\n    \"28189\": \"SHIMBARU\",\n    \"28190\": \"JONO\",\n    \"28193\": \"SUE\",\n    \"28194\": \"SUE-CHUO\",\n    \"28195\": \"SUSENJI\",\n    \"28196\": \"SETAKA\",\n    \"28197\": \"ZENDOJI\",\n    \"28198\": \"SOEDA\",\n    \"28201\": \"TAGAWAITA\",\n    \"28202\": \"TAGAWAGOTOJI\",\n    \"28203\": \"TAKESHITA\",\n    \"28205\": \"TANUSHIMARU\",\n    \"28207\": \"DAIGYOJI\",\n    \"28209\": \"DAINYU\",\n    \"28211\": \"CHOJABARU\",\n    \"28212\": \"CHIKUGO-OISHI\",\n    \"28213\": \"CHIKUGO-KUSANO\",\n    \"28214\": \"CHIKUGO-YOSHII\",\n    \"28216\": \"CHIKUZEN-IWAYA\",\n    \"28217\": \"CHIKUZEN-UEKI\",\n    \"28218\": \"CHIKUZEN-UCHINO\",\n    \"28219\": \"CHIKUZEN-SHONAI\",\n    \"28220\": \"FUKKODAI-MAE\",\n    \"28221\": \"CHIKUZEN-DAIBU\",\n    \"28222\": \"CHIKUZEN-HABU\",\n    \"28223\": \"CHIKUZEN-FUKAE\",\n    \"28224\": \"CHIKUZEN-MAEBARU\",\n    \"28225\": \"CHIKUZEN-YAMAE\",\n    \"28226\": \"CHIKUZEN-YAMATE\",\n    \"28230\": \"CHIDORI\",\n    \"28232\": \"TSUIKI\",\n    \"28237\": \"TENTO\",\n    \"28238\": \"TEMPAIZAN\",\n    \"28239\": \"TOGO\",\n    \"28246\": \"TOBATA\",\n    \"28248\": \"TOFUROMINAMI\",\n    \"28250\": \"DOI\",\n    \"28255\": \"NAKAMA\",\n    \"28257\": \"NATA\",\n    \"28258\": \"NAMAZUTA\",\n    \"28260\": \"NISHI-KOKURA\",\n    \"28262\": \"NISHI-SOEDA\",\n    \"28278\": \"NISHIMUTA\",\n    \"28280\": \"NOGATA\",\n    \"28282\": \"HAINUZUKA\",\n    \"28283\": \"HAKATA\",\n    \"28286\": \"HAKOZAKI\",\n    \"28289\": \"HATAE\",\n    \"28293\": \"HARUDA\",\n    \"28294\": \"HARUMACHI\",\n    \"28299\": \"HIGASHI-FUKUMA\",\n    \"28300\": \"HIGASHI-MIZUMAKI\",\n    \"28301\": \"HIKOSAN\",\n    \"28305\": \"FUKUMA\",\n    \"28306\": \"FUKUYOSHI\",\n    \"28309\": \"FUJINOKI\",\n    \"28310\": \"FUTAJIMA\",\n    \"28311\": \"FUTSUKAICHI\",\n    \"28312\": \"FUNAO\",\n    \"28313\": \"CHIKUGO-FUNAGOYA\",\n    \"28315\": \"BUZEN-KAWASAKI\",\n    \"28316\": \"BUZEN-SHOE\",\n    \"28317\": \"BUZEN-MASUDA\",\n    \"28318\": \"HOSHUYAMA\",\n    \"28322\": \"MAIMATSUBARA\",\n    \"28326\": \"MII\",\n    \"28328\": \"MIKEKADO\",\n    \"28329\": \"MIZUKI\",\n    \"28331\": \"MIZUMAKI\",\n    \"28334\": \"MINAMI-KURUME\",\n    \"28335\": \"MINAMI-KOKURA\",\n    \"28336\": \"MINAMI-SETAKA\",\n    \"28337\": \"MINAMI-FUKUOKA\",\n    \"28338\": \"MINAMI-YUKUHASHI\",\n    \"28344\": \"MOJI\",\n    \"28345\": \"MOJIKO\",\n    \"28351\": \"YAHATA\",\n    \"28353\": \"YUKUHASHI\",\n    \"28354\": \"YUSU\",\n    \"28356\": \"YOSHIZUKA\",\n    \"28357\": \"YOSHINO\",\n    \"28358\": \"YOBUNO\",\n    \"28359\": \"WAKAMATSU\",\n    \"28360\": \"WAJIRO\",\n    \"28361\": \"WATAZE\",\n    \"28362\": \"ARITA\",\n    \"28363\": \"IGAYA\",\n    \"28364\": \"IMARI\",\n    \"28365\": \"IWAYA\",\n    \"28366\": \"USHIZU\",\n    \"28368\": \"OCHI\",\n    \"28369\": \"OKAWANO\",\n    \"28371\": \"OMACHI(SAGA)\",\n    \"28372\": \"OGI\",\n    \"28373\": \"ONIZUKA\",\n    \"28374\": \"KANAISHIHARA\",\n    \"28376\": \"KAMI-ARITA\",\n    \"28377\": \"KAMI-IMARI\",\n    \"28378\": \"KARATSU\",\n    \"28380\": \"KANZAKI\",\n    \"28381\": \"KYURAGI\",\n    \"28382\": \"KITAGATA\",\n    \"28383\": \"KIYAMA(SAGA)\",\n    \"28386\": \"KUBOTA\",\n    \"28387\": \"KEYAKIDAI\",\n    \"28388\": \"KOMANAKI\",\n    \"28389\": \"SAGA\",\n    \"28391\": \"SARI\",\n    \"28393\": \"TAKAHASHI\",\n    \"28394\": \"TAKU\",\n    \"28395\": \"TAKEO-ONSEN\",\n    \"28396\": \"TASHIRO\",\n    \"28398\": \"TARA\",\n    \"28399\": \"TOSU\",\n    \"28400\": \"NAKA-TAKU\",\n    \"28401\": \"NAKABARU\",\n    \"28402\": \"NAGAO(SAGA)\",\n    \"28403\": \"NABESHIMA\",\n    \"28405\": \"NISHI-OCHI\",\n    \"28406\": \"NISHI-KARATSU\",\n    \"28407\": \"NIJINOMATSUBARA\",\n    \"28409\": \"HAMASAKI\",\n    \"28410\": \"HIGASHI-KARATSU\",\n    \"28411\": \"HIGASHI-TAKU\",\n    \"28413\": \"HIZEN-ASAHI\",\n    \"28414\": \"HIZEN-IIDA\",\n    \"28415\": \"HIZEN-OURA\",\n    \"28416\": \"HIZEN-KASHIMA\",\n    \"28417\": \"HIZEN-KUBO\",\n    \"28418\": \"HIZEN-SHIROISHI\",\n    \"28419\": \"HIZEN-NAGANO\",\n    \"28420\": \"HIZEN-NANAURA\",\n    \"28421\": \"HIZEN-HAMA\",\n    \"28422\": \"HIZEN-FUMOTO\",\n    \"28423\": \"HIZEN-YAMAGUCHI\",\n    \"28424\": \"HIZEN-RYUO\",\n    \"28426\": \"HON-MUTABE\",\n    \"28428\": \"MIMASAKA\",\n    \"28430\": \"MOMONOKAWA\",\n    \"28432\": \"YAMAMOTO\",\n    \"28433\": \"YOSHINOGARI-KOEN\",\n    \"28434\": \"WATADA\",\n    \"28443\": \"ISAHAYA\",\n    \"28446\": \"ICHINUNO\",\n    \"28449\": \"IWAMATSU\",\n    \"28451\": \"UTSUTSUGAWA\",\n    \"28452\": \"URAKAMI\",\n    \"28457\": \"OE\",\n    \"28460\": \"OKUSA\",\n    \"28464\": \"OMURA\",\n    \"28465\": \"OGUSHIGO\",\n    \"28473\": \"KAWATANA\",\n    \"28475\": \"KIKITSU\",\n    \"28482\": \"TAKADA(NAGASAKI)\",\n    \"28484\": \"KONAGAI\",\n    \"28490\": \"SASEBO\",\n    \"28506\": \"SUWA\",\n    \"28512\": \"SONOGI\",\n    \"28518\": \"TAKEMATSU\",\n    \"28524\": \"DAITO\",\n    \"28525\": \"CHIWATA\",\n    \"28533\": \"NAGASAKI\",\n    \"28537\": \"NAGASATO\",\n    \"28538\": \"NAGAYO\",\n    \"28541\": \"NISHI-ISAHAYA\",\n    \"28542\": \"NISHI-URAKAMI\",\n    \"28547\": \"HAIKI\",\n    \"28548\": \"HUISTENBOSCH\",\n    \"28549\": \"HAENOSAKI\",\n    \"28552\": \"HIU\",\n    \"28553\": \"HIGASHI-ISAHAYA\",\n    \"28555\": \"HIGASHISONO\",\n    \"28557\": \"HIZEN-KOGA\",\n    \"28558\": \"HIZEN-NAGATA\",\n    \"28565\": \"HONKAWACHI\",\n    \"28571\": \"MATSUBARA\",\n    \"28574\": \"MIKAWACHI\",\n    \"28576\": \"MICHINOO\",\n    \"28583\": \"YUE\",\n    \"28586\": \"AKASE\",\n    \"28587\": \"AKAMIZU\",\n    \"28588\": \"ASO\",\n    \"28591\": \"ARAO(KUMAMOTO)\",\n    \"28592\": \"ARISA\",\n    \"28593\": \"ISSHOCHI\",\n    \"28595\": \"IKOINOMURA\",\n    \"28596\": \"ISHIUCHI-DAM\",\n    \"28597\": \"ICHINOKAWA\",\n    \"28599\": \"UEKI\",\n    \"28601\": \"UCHINOMAKI\",\n    \"28602\": \"UTO\",\n    \"28605\": \"ODA(KUMAMOTO)\",\n    \"28606\": \"ONOSHIMO\",\n    \"28608\": \"OGAWA\",\n    \"28609\": \"OKOBA\",\n    \"28610\": \"KAIJI\",\n    \"28612\": \"KAMASE\",\n    \"28613\": \"KAMI-KUMAMOTO\",\n    \"28618\": \"KAWASHIRI\",\n    \"28622\": \"KYUSENDO\",\n    \"28626\": \"KUMAMOTO\",\n    \"28629\": \"SOJODAIGAKU-MAE\",\n    \"28642\": \"KONOHA\",\n    \"28645\": \"SAKAMOTO\",\n    \"28648\": \"SANRIGI\",\n    \"28652\": \"SHIROISHI(KUMAMOTO)\",\n    \"28653\": \"SHIN-SUIZENJI\",\n    \"28657\": \"SUIZENJI\",\n    \"28662\": \"SUMIYOSHI(KUMAMOTO)\",\n    \"28664\": \"SETA(KUMAMOTO)\",\n    \"28665\": \"SETOISHI\",\n    \"28666\": \"SENCHO\",\n    \"28669\": \"TAKIMIZU\",\n    \"28671\": \"TATSUTAGUCHI\",\n    \"28672\": \"TATENO\",\n    \"28673\": \"TABARUZAKA\",\n    \"28674\": \"TAMANA\",\n    \"28677\": \"DAN\",\n    \"28681\": \"TOKAIGAKUEN-MAE\",\n    \"28685\": \"NAGASU\",\n    \"28686\": \"NAMINO\",\n    \"28687\": \"NARAGUCHI\",\n    \"28689\": \"NISHISATO\",\n    \"28690\": \"NISHI-HITOYOSHI\",\n    \"28693\": \"HAKI\",\n    \"28696\": \"HATAURA\",\n    \"28697\": \"HARAMIZU\",\n    \"28700\": \"HIGO-IKURA\",\n    \"28701\": \"HIGO-OZU\",\n    \"28704\": \"HIGO-NAGAHAMA\",\n    \"28707\": \"HITOYOSHI\",\n    \"28711\": \"HEISEI\",\n    \"28714\": \"MATSUBASE\",\n    \"28715\": \"MISUMI\",\n    \"28717\": \"MIDORIKAWA\",\n    \"28719\": \"MINAMI-ARAO\",\n    \"28720\": \"MINAMI-KUMAMOTO\",\n    \"28722\": \"MIYAJI\",\n    \"28724\": \"MUSASHIZUKA\",\n    \"28726\": \"YATAKE\",\n    \"28727\": \"YATSUSHIRO\",\n    \"28730\": \"YOSHIO\",\n    \"28731\": \"WATARI\",\n    \"28732\": \"ASAJI\",\n    \"28733\": \"AZAMUI\",\n    \"28734\": \"AMAGASE\",\n    \"28735\": \"AMATSU\",\n    \"28736\": \"INUKAI\",\n    \"28737\": \"IMAZU\",\n    \"28738\": \"IMAYAMA\",\n    \"28739\": \"USA\",\n    \"28740\": \"USUKI(OITA)\",\n    \"28741\": \"ERA\",\n    \"28742\": \"OITA\",\n    \"28744\": \"OGA\",\n    \"28745\": \"OZAI\",\n    \"28746\": \"OTSURU\",\n    \"28747\": \"OGATA\",\n    \"28748\": \"ONIGASE\",\n    \"28749\": \"ONOYA\",\n    \"28750\": \"KAIZAKI\",\n    \"28751\": \"KAKU\",\n    \"28752\": \"KAMI-USUKI\",\n    \"28753\": \"KAMIOKA\",\n    \"28754\": \"KAMEGAWA\",\n    \"28755\": \"KARIU\",\n    \"28756\": \"KITA-YAMADA\",\n    \"28757\": \"KITSUKI\",\n    \"28758\": \"KUMASAKI\",\n    \"28759\": \"KOZAKI\",\n    \"28760\": \"SAIKI\",\n    \"28761\": \"SAKANOICHI\",\n    \"28762\": \"SASHIU\",\n    \"28763\": \"SHONAI\",\n    \"28764\": \"SHIKIDO\",\n    \"28765\": \"SHIGEOKA\",\n    \"28766\": \"SHITANOE\",\n    \"28767\": \"SUGAO\",\n    \"28768\": \"SUGIKAWACHI\",\n    \"28769\": \"SOTARO\",\n    \"28770\": \"TAKAJO\",\n    \"28771\": \"TAKIO\",\n    \"28772\": \"TAKENAKA\",\n    \"28773\": \"TATEISHI\",\n    \"28774\": \"TAMARAI\",\n    \"28775\": \"TSUKUMI\",\n    \"28776\": \"TSURUSAKI\",\n    \"28777\": \"TERUOKA\",\n    \"28778\": \"TENJIN\",\n    \"28779\": \"NAOKAWA\",\n    \"28780\": \"NAOMI\",\n    \"28781\": \"NAKATSU\",\n    \"28782\": \"NAKA-HANDA\",\n    \"28783\": \"NAKA-YAMAGA\",\n    \"28784\": \"NISHI-OITA\",\n    \"28785\": \"NISHIYASHIKI\",\n    \"28786\": \"NOYA\",\n    \"28787\": \"HIGASHI-NAKATSU\",\n    \"28788\": \"HIGASHI-BEPPU\",\n    \"28789\": \"HIKIJI\",\n    \"28790\": \"HISHIRO\",\n    \"28791\": \"HIJI\",\n    \"28792\": \"HITA\",\n    \"28793\": \"FURUGO\",\n    \"28794\": \"BUZEN-ZENKOJI\",\n    \"28795\": \"BUZEN-NAGASU\",\n    \"28796\": \"BUNGO-OGI\",\n    \"28797\": \"BUNGO-KIYOKAWA\",\n    \"28798\": \"BUNGO-KOKUBU\",\n    \"28799\": \"BUNGO-TAKETA\",\n    \"28800\": \"BUNGO-TOYOOKA\",\n    \"28801\": \"BUNGO-NAKAGAWA\",\n    \"28802\": \"BUNGO-NAKAMURA\",\n    \"28803\": \"BUNGO-MIYOSHI\",\n    \"28804\": \"BUNGO-MORI\",\n    \"28805\": \"BEPPU(OITA)\",\n    \"28806\": \"BEPPUDAIGAKU\",\n    \"28807\": \"MAKI(OITA)\",\n    \"28808\": \"MIEMACHI\",\n    \"28809\": \"MINAMI-OITA\",\n    \"28810\": \"MINAMI-YUFU\",\n    \"28811\": \"MUKAINOHARU\",\n    \"28812\": \"YANAGIGAURA\",\n    \"28813\": \"YUNOHIRA\",\n    \"28814\": \"YUFUIN\",\n    \"28815\": \"YOAKE\",\n    \"28816\": \"YOKOKU\",\n    \"28817\": \"AOIDAKE\",\n    \"28818\": \"AOSHIMA\",\n    \"28819\": \"ASAHIGAOKA\",\n    \"28820\": \"ABURATSU\",\n    \"28822\": \"ISOICHI\",\n    \"28823\": \"ICHITANA\",\n    \"28824\": \"IBII\",\n    \"28825\": \"UCHIUMI\",\n    \"28826\": \"UCHINODA\",\n    \"28827\": \"UNDO-KOEN\",\n    \"28828\": \"EBINO\",\n    \"28829\": \"EBINO-IINO\",\n    \"28830\": \"EBINO-UWAE\",\n    \"28831\": \"ODOTSU\",\n    \"28832\": \"OBI\",\n    \"28833\": \"ORYUZAKO\",\n    \"28835\": \"KADOGAWA\",\n    \"28836\": \"KANO\",\n    \"28840\": \"KAWAMINAMI\",\n    \"28841\": \"KYOMACHI-ONSEN\",\n    \"28842\": \"KITAGAWA\",\n    \"28843\": \"KITAGO\",\n    \"28844\": \"KITA-NOBEOKA\",\n    \"28845\": \"KIBANA\",\n    \"28846\": \"KIYOTAKE\",\n    \"28847\": \"KUSHIMA\",\n    \"28848\": \"KOUCHIUMI\",\n    \"28849\": \"KODOMONOKUNI\",\n    \"28850\": \"KOBAYASHI(MIYAZAKI)\",\n    \"28852\": \"SADOWARA\",\n    \"28853\": \"ZAIKOJI\",\n    \"28855\": \"SOSANJI\",\n    \"28856\": \"TAKASAKISHINDEN\",\n    \"28858\": \"TAKANABE\",\n    \"28859\": \"TAKAHARU\",\n    \"28860\": \"TANIGASHIRA\",\n    \"28861\": \"TANINOKUCHI\",\n    \"28862\": \"TANO(MIYAZAKI)\",\n    \"28863\": \"TSUNO\",\n    \"28864\": \"TOTORO\",\n    \"28865\": \"NANGO\",\n    \"28866\": \"NISHI-KOBAYASHI\",\n    \"28868\": \"NISHI-MIYAKONOJO\",\n    \"28869\": \"NICHINAN\",\n    \"28870\": \"NOBEOKA\",\n    \"28872\": \"HASUGAIKE\",\n    \"28874\": \"HYUGA-OTSUKA\",\n    \"28876\": \"HYUGA-KITAKATA\",\n    \"28877\": \"HYUGA-KUTSUKAKE\",\n    \"28878\": \"HYUGASHI\",\n    \"28879\": \"HYUGA-SHONAI\",\n    \"28880\": \"HYUGA-SHINTOMI\",\n    \"28881\": \"HYUGA-SUMIYOSHI\",\n    \"28882\": \"HYUGA-NAGAI\",\n    \"28883\": \"HYUGA-MAEDA\",\n    \"28885\": \"HIGASHI-TAKASAKI\",\n    \"28886\": \"HIGASHI-TSUNO\",\n    \"28888\": \"HIROWARA\",\n    \"28890\": \"FUKUSHIMA-IMAMACHI\",\n    \"28891\": \"FUKUSHIMA-TAKAMATSU\",\n    \"28894\": \"MASAKI\",\n    \"28895\": \"MANGATSUKA\",\n    \"28896\": \"MINAMIKATA\",\n    \"28897\": \"MINAMI-NOBEOKA\",\n    \"28898\": \"MINAMI-HYUGA\",\n    \"28899\": \"MINAMI-MIYAZAKI\",\n    \"28900\": \"MIMATA\",\n    \"28901\": \"MIMITSU\",\n    \"28902\": \"MIYAKONOJO\",\n    \"28903\": \"MIYAZAKI\",\n    \"28904\": \"MIYAZAKIAIRPORT\",\n    \"28905\": \"MIYAZAKIJINGU\",\n    \"28907\": \"MOCHIBARU\",\n    \"28908\": \"YAMANOKUCHI\",\n    \"28909\": \"YOWARA\",\n    \"28910\": \"AIRA\",\n    \"28914\": \"ISHIKAKI\",\n    \"28915\": \"IJUIN\",\n    \"28916\": \"IZUMI\",\n    \"28917\": \"ICHIKI\",\n    \"28919\": \"IBUSUKI\",\n    \"28920\": \"IRINO(KAGOSHIMA)\",\n    \"28921\": \"UEMURA\",\n    \"28923\": \"USUKI(KAGOSHIMA)\",\n    \"28925\": \"EI\",\n    \"28926\": \"EI-OKAWA\",\n    \"28927\": \"OSUMI-OKAWARA\",\n    \"28928\": \"OSUMI-NATSUI\",\n    \"28929\": \"OSUMI-YOKOGAWA\",\n    \"28930\": \"OYAMA(KAGOCHIMA)\",\n    \"28932\": \"KAIMON\",\n    \"28933\": \"KAGOSHIMA\",\n    \"28936\": \"KAJIKI\",\n    \"28938\": \"KAMI-IJUIN\",\n    \"28942\": \"KAREIGAWA\",\n    \"28943\": \"KIIRE\",\n    \"28945\": \"KITA-NAGANODA\",\n    \"28946\": \"KITAMATA\",\n    \"28947\": \"KIRISHIMA-JINGU\",\n    \"28948\": \"KIRISHIMA-ONSEN\",\n    \"28949\": \"KINKO\",\n    \"28951\": \"KUSHIKINO\",\n    \"28952\": \"KUMANOJO\",\n    \"28953\": \"KURINO\",\n    \"28957\": \"KORIMOTO\",\n    \"28959\": \"KOKUBU(KAGOSHIMA)\",\n    \"28960\": \"KOBANCHAYA\",\n    \"28962\": \"GOINO\",\n    \"28963\": \"GORYO\",\n    \"28964\": \"SAKANOUE\",\n    \"28967\": \"SATSUMA-ITASHIKI\",\n    \"28968\": \"SATSUMA-IMAIZUMI\",\n    \"28970\": \"SATSUMA-KAWASHIRI\",\n    \"28971\": \"SATSUMA-SHIOYA\",\n    \"28973\": \"SATSUMA-MATSUMOTO\",\n    \"28974\": \"SHIGETOMI\",\n    \"28975\": \"SHIBUSHI\",\n    \"28977\": \"SHIRASAWA(KAGOSHIMA)\",\n    \"28982\": \"JIGENJI\",\n    \"28983\": \"SESEKUSHI\",\n    \"28984\": \"SENDAI(KAGOSHIMA)\",\n    \"28988\": \"TAKARABE\",\n    \"28990\": \"TANIYAMA\",\n    \"28993\": \"CHOSA\",\n    \"28994\": \"TSURUMARU\",\n    \"28999\": \"NAKA-FUKURA\",\n    \"29000\": \"NAKAMYO\",\n    \"29002\": \"NIGATSUDEN\",\n    \"29005\": \"NISHI-EI\",\n    \"29006\": \"NISHI-OYAMA\",\n    \"29007\": \"KAGOSHIMA-CHUO\",\n    \"29010\": \"NUKUMI\",\n    \"29012\": \"HAYATO\",\n    \"29013\": \"HYOKIYAMA\",\n    \"29014\": \"HIGASHI-ICHIKI\",\n    \"29015\": \"HIGASHI-KAIMON\",\n    \"29016\": \"HINATAYAMA\",\n    \"29017\": \"HIRAKAWA\",\n    \"29018\": \"MAENOHAMA\",\n    \"29019\": \"MAKURAZAKI\",\n    \"29020\": \"MATSUGAURA\",\n    \"29021\": \"MIZUNARIKAWA\",\n    \"29022\": \"MINAMI-KAGOSHIMA\",\n    \"29024\": \"MIYAGAHAMA\",\n    \"29026\": \"YAMAKAWA\",\n    \"29027\": \"YUNOMOTO\",\n    \"29028\": \"YOSHIMATSU\",\n    \"29029\": \"RYUGAMIZU\",\n    \"29041\": \"YOSHITOMI(FUKUOKA)\",\n    \"29061\": \"MISAKIGAOKA\",\n    \"29087\": \"TAYOSHI\",\n    \"29176\": \"IPPOMMATSU\",\n    \"29268\": \"SPACE WORLD\",\n    \"29277\": \"BALLOON-SAGA\",\n    \"29309\": \"KURUME-DAIGAKUMAE\",\n    \"29328\": \"JINNOHARU\",\n    \"29348\": \"YAYOIGAOKA\",\n    \"29381\": \"OITADAIGAKUMAE\",\n    \"29391\": \"SHIN-TOSU\",\n    \"29392\": \"SHIN-OMUTA\",\n    \"29393\": \"SHIN-TAMANA\",\n    \"29394\": \"SHIN-YATSUSHIRO\",\n    \"29395\": \"SHIN-MINAMATA\",\n    \"29450\": \"HONJO\",\n    \"29471\": \"CHIHAYA\",\n    \"29551\": \"KYUDAI-GAKKENTOSHI\",\n    \"29563\": \"HIKARINOMORI\",\n    \"29615\": \"KANYUSHA-HIKOSAN\",\n    \"29660\": \"SHISHIBU\",\n    \"29661\": \"HIROKI\",\n    \"29662\": \"KURUMEKOKO-MAE\",\n    \"29683\": \"SHINGU-CHUO\",\n    \"29684\": \"KAMIMURAGAKUEN-MAE\",\n    \"29690\": \"TOMIAI\",\n    \"29774\": \"NISHI-KUMAMOTO\",\n    \"29803\": \"ITOSHIMAKOKO-MAE\"\n  }\n}\n","import { Course, Line, Station } from \"../ekispert/models\";\nimport { JRKyushuLineList, JRKyushuStationList, JRKyushuTrainList } from \"../ekispert/data/JRKyushuReserveLinkList\";\nimport DateTime from \"../../utils/dateTime\";\nimport { format, subMinutes } from 'date-fns';\nimport { Lang } from \"../../states/query\";\n\ninterface JRKyushuParams {\n  // 出発駅\n  depStationName?: string;\n  // 到着駅\n  arrStationName?: string;\n  // 出発時刻\n  depTime: Date;\n  // 乗換駅\n  viaStationName: string[];\n  // 使用する駅リスト\n  stationList: string[];\n  // 使用する列車リスト\n  trainList: string[];\n  // 表示するかどうか\n  // 経由する列車が全て普通列車の場合は表示しない\n  isShow: boolean;\n  // 有料の料金区間が存在するか\n  isFareSection: boolean;\n}\n\nexport default class JRKyushuReserveLinkData {\n  // 連携先のURL\n  host: string;\n  // 発着区分\n  // 「0:出発」「1:到着」「2:始発」「3:終電」\n  daType: number;\n  // 連携元コード(ANA固定)\n  rsCode: string;\n  // dev環境へのアクセスか\n  isDev: boolean;\n  // 駅名検索方法\n  rsType: number;\n  // 表示言語\n  lang: Lang;\n  // 区間パラメータ\n  sectionParams: JRKyushuParams[];\n  // Line要素のindexと使用するsectionParamsのindexの対応表\n  paramsTable: number[];\n\n  constructor(isMobile: boolean, lang: Lang) {\n    const hostList = {\n      dev: {\n        ja: {\n          pc: 'https://test.yoyaku.jrkyushu.co.jp/jr/pc/consumer/route/TopAction/searchStation.do',\n          sp: 'https://test.yoyaku.jrkyushu.co.jp/jr/smart/consumer/route/TopSmartAction/searchStation.do'\n        },\n        en: {\n          pc: 'https://test.yoyaku.jrkyushu.co.jp/jr/pc/inbound/route/TopAction/searchStation.do',\n          sp: 'https://test.yoyaku.jrkyushu.co.jp/jr/smart/inbound/route/TopAction/searchStation.do'\n        }\n      },\n      prod: {\n        ja: {\n          pc: 'https://train.yoyaku.jrkyushu.co.jp/jr/pc/consumer/route/TopAction/searchStation.do',\n          sp: 'https://train.yoyaku.jrkyushu.co.jp/jr/smart/consumer/route/TopSmartAction/searchStation.do'\n        },\n        en: {\n          pc: 'https://train.yoyaku.jrkyushu.co.jp/jr/pc/inbound/route/TopAction/searchStation.do',\n          sp: 'https://train.yoyaku.jrkyushu.co.jp/jr/smart/inbound/route/TopAction/searchStation.do'\n        }\n      }\n    }\n    this.lang = lang;\n    this.isDev = false;\n    const env = this.isDev? 'dev': 'prod';\n    const device = isMobile? 'sp': 'pc';\n    this.host = hostList[env][lang][device];\n    this.sectionParams = [];\n    this.rsCode = 'ana';\n    this.daType = 0;\n    this.rsType = 1;\n    this.paramsTable = [];\n  }\n  getInitParams(): JRKyushuParams {\n    return {\n      viaStationName: [],\n      depTime: new Date(0),\n      stationList: [],\n      trainList: [],\n      isShow: false,\n      isFareSection: false\n    }\n  }\n  /**\n   * 連携パラメータの一覧を返す\n   */\n  getParams(idx: number) {\n    const params = this.sectionParams[idx];\n    if(!params) {\n      throw new Error(`JR九州連携: sectionParams[${idx}]は存在しません`);\n    }\n    let outParams: any = {\n      dsName: params.depStationName,\n      asName: params.arrStationName,\n      trYearMonth: format(params.depTime, 'yyyyMM'),\n      trDay: format(params.depTime, 'dd'),\n      trHour: format(params.depTime, 'HH'),\n      trMinute: format(params.depTime, 'mm'),\n      daType: this.daType,\n      rsType: this.rsType,\n      rsCode: this.rsCode\n    };\n    params.viaStationName.forEach((tsn, idx)=>{\n      outParams[`tsName${idx+1}`] = tsn;\n    })\n    params.trainList.forEach((trn, idx)=>{\n      outParams[`trTrain${idx+1}`] = trn;\n    })\n    return outParams;\n  }\n  /**\n   * 遷移用のURLを返す\n   * @param idx 返すParamsのIndex番号\n   */\n  getURL(idx: number) {\n    // テスト環境の場合は現在日付は2015/12/25固定となるため、少し後の日付を指定する\n    if(this.isDev) {\n      this.sectionParams[idx].depTime.setFullYear(2015);\n      this.sectionParams[idx].depTime.setMonth(11);\n      this.sectionParams[idx].depTime.setDate(29);\n    }\n    const path = new URLSearchParams(this.getParams(idx));\n    return `${this.host}?${path}`;\n  }\n  /**\n   * 遷移用のURLをLine要素のIndexから求めて返す\n   * @param lineIndex Line要素のIndex番号\n   */\n  getURLByLineIndex(lineIndex: number) {\n    const paramIndex = this.paramsTable[lineIndex];\n    return this.getURL(paramIndex);\n  }\n  /**\n   * Station情報から対応するJR九州リンク駅名を追加する\n   * @param station EWSから取得したStation情報\n   */\n  pushStation(station: Station, param: JRKyushuParams) {\n    const stationCode = station.code;\n    const stationName = JRKyushuStationList[this.lang][stationCode];\n    // 駅が存在する場合のみ追加する\n    if(stationName) {\n      param.stationList.push(stationName);\n    }\n    return param;\n  }\n  /**\n   * EWSから取得した列車名より、JR九州予約サイトで使用できる列車名形式に変換する\n   * @param train EWSから取得した列車名情報\n   */\n  pushTrain(train: string, param: JRKyushuParams) {\n    let matchTrain = JRKyushuTrainList[this.lang].find((x)=>{\n      return train.indexOf(x) !== -1;\n    });\n    // 一致しない場合は普通列車として扱う\n    if(!matchTrain) {\n      matchTrain = '';\n    } else {\n      // 予約可能な列車が含まれる場合にはリンクを表示する\n      param.isShow = true;\n    }\n    param.trainList.push(matchTrain);\n    return param;\n  }\n  /**\n   * JR九州列車予約連携リンクを表示するかのフラグ・リンクパラメーターを設定する\n   * @param course フラグをセットする経路\n   */\n  setShowReserveLinkFlag = (course: Course) => {\n    try {\n      // JR九州の駅リスト\n      const JRKyushuStationArray = Object.keys(JRKyushuStationList.ja);\n      if(course.OperationLinePattern) {\n        // 経路中にリンクを表示するかを判断\n        let isShowLink = true;\n        let beforeRouteLineIndex = -1;\n        let sectionDepTime = new Date(0);\n        const sections = course.OperationLinePattern.length? course.OperationLinePattern: [course.OperationLinePattern];\n        sections.forEach((section: any)=>{\n          const routeLine = course.Route.Line[section.routeLineIndex-1];\n          const lines = section.Line.length? section.Line: [section.Line];\n          // 1区間に跨る線区の一覧\n          const lineList = lines.map((line: any)=>{ return line.code; });\n          // 区間中にJR九州の区間があるかを判定\n          let isShowSection = lineList.reduce((x: boolean, a: string) => {\n            return x && JRKyushuLineList.includes(Number(a));\n          }, true);\n          // 発駅・着駅がJR九州の駅かを判定する\n          if(isShowSection) {\n            const depStationCode = course.Route.Point[section.routeLineIndex - 1].Station.code;\n            const arrStationCode = course.Route.Point[section.routeLineIndex].Station.code;\n            // JR九州の駅リストに発駅・着駅が含まれている場合のみ連携リンクを表示する\n            isShowSection = JRKyushuStationArray.includes(depStationCode) && JRKyushuStationArray.includes(arrStationCode);\n          }\n          // Lineが連番でないときにはリンク表示フラグをリセットする\n          if(isShowSection && Number(section.routeLineIndex) - 1 !== beforeRouteLineIndex) {\n            isShowLink = true;\n            sectionDepTime = new Date(0);\n          }\n          beforeRouteLineIndex = Number(section.routeLineIndex);\n          if(isShowSection && isShowLink) {\n            // 列車の出発時間が現在時刻の10分後以降かつ、1ヶ月後より以前の場合\n            const depTime = new Date(routeLine.DepartureState.Datetime.text);\n            // 対象の列車が時間的に間に合わない場合には以後の列車予約全て表示しない\n            const isAbleToReserveJR = DateTime.isAbleToReserveJR(depTime);\n            if(!isAbleToReserveJR) {\n              isShowLink = false;\n            }\n            routeLine.isShowJRKyushuLink = isAbleToReserveJR;\n            // 出発時刻が初期値の場合には出発日時を設定する\n            if(routeLine.isShowJRKyushuLink) {\n              if(sectionDepTime.getTime() === 0) {\n                // 検索時の出発時刻はちょうどだとヒットしないため、5分前に設定する\n                sectionDepTime = subMinutes(depTime, 5);\n              } else {\n                // 日付が午前3時を跨ぐ場合には終電を跨ぐと判断し、以後は表示しない\n                const isAfterEndOfTrain = DateTime.isTommorowTrain(sectionDepTime, depTime);\n                if(isAfterEndOfTrain) {\n                  routeLine.isShowJRKyushuLink = false;\n                  isShowLink = false;\n                }\n              }\n            }\n          } else {\n            routeLine.isShowJRKyushuLink = false;\n          }\n        });\n      }\n    } catch(e) {\n      // dev環境のみエラーログを出力\n      if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n        console.error(e);\n      }\n    }\n  }\n  /**\n   * JR九州列車予約リンクのパラメーターを構築する\n   * @param course フラグをセットする経路\n   */\n  generateReserveParams = (course: Course) => {\n    try {\n      let param = this.getInitParams();\n      // EWSの結果と対応表から駅名・列車名を抽出\n      course.Route.Line.forEach((line: Line, idx: number) => {\n        // 料金部分を取得する\n        // 宮崎空港->宮崎・早岐->佐世保のような特急列車の無料特例区間を排除する\n        // 料金部分の取得はResultコンポーネントで使用しているものを用いる\n        const fare = course.Price.find(p => (p.kind === 'Charge' && p.index === line.chargeIndex) && p.selected === 'true')?.Oneway;\n        if(fare && Number(fare) > 0) {\n          param.isFareSection = true;\n        }\n        // 対応表に入れ込むparamsのindex\n        let paramIdx = -1;\n        if(line.isShowJRKyushuLink) {\n          // 初期値の場合には出発時間を設定する\n          if(param.depTime.getTime() === 0) {\n            const depTime = new Date(line.DepartureState.Datetime.text);\n            // 検索時の出発時刻はちょうどだとヒットしないため、5分前に設定する\n            param.depTime = subMinutes(depTime, 5);\n          }\n          // 駅リストが空の時は出発駅も追加する\n          if(!param.stationList.length) {\n            const depStation = course.Route.Point[idx].Station;\n            param = this.pushStation(depStation, param);\n          }\n          const arrStation = course.Route.Point[idx+1].Station;\n          param = this.pushStation(arrStation, param);\n          param = this.pushTrain(line.Name, param);\n          paramIdx = this.sectionParams.length;\n        } else if(param.depTime.getTime() !== 0) {\n          // JR九州以外の区間が間に入った場合にはリンクを区切る\n          this.sectionParams.push(param);\n          param = this.getInitParams();\n        }\n        this.paramsTable.push(paramIdx);\n      });\n      this.sectionParams.push(param);\n    } catch(e) {\n      // dev環境のみエラーログを出力\n      if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n        console.error(e);\n      }\n    }\n  }\n  /**\n   * 駅リストより出発・到着・経由駅を分離する\n   */\n  splitDepViaArrStation = () => {\n    this.sectionParams.forEach( (param: JRKyushuParams)=>{\n      param.depStationName = param.stationList[0];\n      param.arrStationName = param.stationList.slice(-1)[0];\n      param.viaStationName = param.stationList.slice(1, -1);\n    })\n  }\n  /**\n   * 1経路あたりのJR九州列車予約リンクパラメータ一連の流れを処理する\n   * @param course フラグをセットする経路\n   */\n  setAll = (course: Course) => {\n    // 経路中の各LineにJR九州リンクの予約リンクを表示するかのフラグを立てる\n    this.setShowReserveLinkFlag(course);\n    // 経路中のJR九州リンクの予約パラメータを生成する\n    this.generateReserveParams(course);\n    // 駅リストより出発・経由・到着駅リストをパラメータに設定する\n    this.splitDepViaArrStation();\n  }\n  /**\n   * 連携リンクを表示するための前提条件\n   * @param airportCode 発着する空港コード\n   */\n  static isShowLink = (airportCode: string) => {\n    /**\n     * 以下の条件を満たす場合に表示する\n     * 1. 発着がJR九州内の空港であること\n     * 福岡・北九州・佐賀・大分・熊本・宮崎・長崎・対馬・五島福江\n     */\n    const showAirportCodeList = [ 'FUK', 'KKJ', 'HSG', 'OIT', 'KMJ', 'KMI', 'NGS', 'TSJ', 'FUJ']; \n    return showAirportCodeList.includes(airportCode);\n  }\n  /**\n   * 該当区間に予約可能な列車が含まれるかを判定\n   * @param lineIndex Line要素のIndex番号\n   */\n  isAbleToReserveSection = (lineIndex: number) => {\n    try {\n      const paramIndex = this.paramsTable[lineIndex];\n      const param = this.sectionParams[paramIndex];\n      // 特急を使う経路があり、料金部分が1円以上の場合には予約ボタンを表示する\n      return param.isShow && param.isFareSection;\n    } catch(e) {\n      return false;\n    }\n  }\n}\n","// リンクティビティ連携・東京メトロフリーパスのアフィリエイトリンクを表示するための路線リスト\n// 東京メトロ・都営地下鉄の路線リスト\nexport const tokyoMetroLineList: number[] = [\n  327, // 銀座線\n  328, // 丸ノ内線(池袋-荻窪)\n  329, // 丸ノ内線(中野坂上-方南町)\n  330, // 日比谷線\n  331, // 東西線\n  332, // 千代田線(綾瀬-代々木上原)\n  333, // 千代田線(綾瀬-北綾瀬)\n  334, // 有楽町線\n  335, // 半蔵門線\n  336, // 南北線\n  337, // 副都心線\n  338, // 都営地下鉄浅草線\n  339, // 都営地下鉄三田線\n  340, // 都営地下鉄新宿線\n  341, // 都営地下鉄大江戸線(都庁前-飯田橋-清澄白河)\n  757  // 都営地下鉄大江戸線\n]\n\n// 京急線リスト\n// 京急大師線, 京急逗子線, 京急久里浜線は範囲外のため含まず\nexport const keikyuLineList: number[] = [\n  322, // 京急本線\n  323  // 京急空港線\n]\n\n// 京急&TokyoSubwayTicketの範囲外となる京急の駅一覧\nexport const excludedKeikyuStationList: { name: string, code: number }[] = [\n  {name:\"浦賀\",code:23084},\n  {name:\"馬堀海岸\",code:23325},\n  {name:\"京急大津\",code:23146},\n  {name:\"堀ノ内\",code:23317},\n  {name:\"県立大学\",code:23154},\n  {name:\"横須賀中央\",code:23367},\n  {name:\"汐入\",code:23196},\n  {name:\"逸見\",code:23312},\n  {name:\"安針塚\",code:23062},\n  {name:\"京急田浦\",code:23150},\n  {name:\"追浜\",code:23089},\n  {name:\"金沢八景(京急線)\",code:23113},\n  {name:\"金沢文庫\",code:23115},\n  {name:\"能見台\",code:23272},\n  {name:\"京急富岡\",code:23152},\n  {name:\"杉田(神奈川県)\",code:23215},\n  {name:\"屏風浦\",code:23301},\n  {name:\"上大岡\",code:23119},\n  {name:\"弘明寺(京急線)\",code:23144},\n  {name:\"井土ケ谷\",code:23075},\n  {name:\"南太田\",code:23334},\n  {name:\"黄金町\",code:23159},\n  {name:\"日ノ出町\",code:23296},\n  {name:\"戸部\",code:23252},\n  {name:\"横浜\",code:23368},\n  {name:\"神奈川\",code:23111},\n  {name:\"京急東神奈川\",code:23256},\n  {name:\"神奈川新町\",code:23112},\n  {name:\"子安\",code:23166},\n  {name:\"京急新子安\",code:23149},\n  {name:\"生麦\",code:23261},\n  {name:\"花月総持寺\",code:23102},\n  {name:\"京急鶴見\",code:23151},\n  {name:\"鶴見市場\",code:23245},\n  {name:\"八丁畷\",code:23277},\n  {name:\"京急川崎\",code:23147},\n  {name:\"六郷土手\",code:23051},\n  {name:\"雑色\",code:22785}\n]\n","import { differenceInCalendarDays } from \"date-fns\";\nimport DateTime from \"../../utils/dateTime\";\nimport FlightInfo from \"../ana/models/flightInfo\";\nimport { Course } from \"../ekispert/models\";\n\n/**\n * リンクティビティ東京メトロ連携ボタン・バナーの共通表示条件\n * 該当区間でリンクを出すかは別の箇所で判定\n * @param isDepartureGuide 出発案内か\n * @param arrAirportCode 到着空港コード\n * @param arrDate 到着時刻\n * @param isAirportSiteTransit 各種空港からの遷移か\n */\nexport const isShowTokyoMetroFreePass = (isDepartureGuide: boolean, arrAirportCode: string, arrDate: Date, isAirportSiteTransit: boolean) => {\n  /**\n   * 以下の条件を満たす場合に表示する\n   * 0. 各種空港HPからの遷移ではない\n   * 1. 到着案内である\n   * 2. 羽田・成田着の便を使用する\n   * 3. 検索日付が今日以降(過去の日付での検索ではない)\n   */\n  // 0. 広島空港からの遷移ではない\n  if(isAirportSiteTransit) { return false; }\n  // 1. 到着案内である\n  if(isDepartureGuide) { return false }\n  // 2. 羽田・成田着の便を使用する\n  const matchAirportList = ['TYO', 'HND', 'NRT'];\n  if(!matchAirportList.includes(arrAirportCode)) {\n    return false;\n  }\n  // 3. 検索日付が今日以降(過去の日付での検索ではない)\n  const now = new Date();\n  const diffDays = differenceInCalendarDays(arrDate, now);\n  return (diffDays >= 0);\n}\n\n/**\n * リンクティビティ東京メトロ連携バナーの追加表示条件\n * @param course 判定をするCourse\n */\nexport const isShowTokyoMetroFreePassBanner = (course: Course | undefined, flightStatus: FlightInfo) => {\n  /**\n   * 以下の条件を満たす場合に表示する(2020/09/16)\n   * 1. 経路中に東京メトロ・都営地下鉄を利用する区間がある\n   * 2. 経路中に京急&Subwayチケットを表示する区間がない\n   */\n  if(!course) {\n    return false;\n  }\n  if(course.hasKeikyuAndSubwayTicketSection && isShowKeikyuAndTokyoMetroFreePass(flightStatus)) {\n    return false;\n  }\n  return course.hasTokyoSubwaySection;\n}\n\n/**\n * リンクティビティ:京急&東京メトロパス表示の追加表示条件\n*/\nexport const isShowKeikyuAndTokyoMetroFreePass = (flight: FlightInfo) => {\n  /**\n   * 以下の条件を満たす場合に表示する\n   * 1. 国内線を利用する場合\n   * 2. 羽田空港着の場合\n   */\n  switch (flight.arrAirportCode) {\n    case 'HND':\n      return true;\n    case 'TYO':\n      return flight.arrAirportName.includes('Haneda');\n    default:\n      return false;\n  }\n}\n\n/**\n * リンクティビティ東京メトロ連携の遷移先URLリスト\n */\nexport const tokyoSubwayTicketUrl = {\n  ja: {\n    dev: 'https://ars-ana-dev.linktivity.io/activity/ja/LINKTIVITY-Tokyosubway-ana?lang=ja',\n    prod: 'https://ars-ana.linktivity.io/activity/ja/LINKTIVITY-Tokyosubway-ana?lang=ja'\n  },\n  en: {\n    dev: 'https://ars-ana-dev.linktivity.io/activity/en/LINKTIVITY-Tokyosubway-ana?lang=en',\n    prod: 'https://ars-ana.linktivity.io/activity/en/LINKTIVITY-Tokyosubway-ana?lang=en'\n  }\n}","import { addMinutes, subMinutes } from 'date-fns';\nimport FlightInfo from '../../ana/models/flightInfo';\nimport { PlaceDirections, Location } from \"../../google/PlaceDirections\";\nimport { Charge, Course, Fare, Line, Point, Price, Route, State } from \"../models\";\nimport { Lang } from '../../../states/query';\nimport { RouteInfo } from '../../taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { AirlineList } from '../../../utils/Airlines';\n\nexport default class UseTaxiCourse implements Course {\n  searchType: string;\n  dataType: string;\n  SerializeData: string;\n  Price: Price[];\n  Route: Route;\n  fares: { [key: string]: Fare; };\n  charges: { [key: string]: Charge; };\n  isLeastTransferCount: boolean;\n  isFast: boolean;\n  isLowPrice: boolean;\n  sumPrice: number;\n  hasAirportBus: boolean;\n  hasByHighwaySection: boolean;\n  OperationLinePattern: any;\n  isShowTokyoMetroBanner?: boolean | undefined;\n  feeLabel: string;\n  // タクシー所要距離(m)\n  distance: number;\n  // タクシー所要時間(s)\n  duration: number;\n  isTaxi: boolean;\n  displayIndex: string;\n  /** 混雑情報を加味したリアルタイム情報か */\n  isRealTime: boolean;\n  AswInfo: undefined;\n\n  /**\n   * タクシーのCourseを生成するClass\n   * @param directions GoogleDirectionsAPIのResponse\n   * @param flightStatus フライト情報\n   * @param isDepartureGuide 出発案内か否か\n   * @param arrivalTimeToAirport 空港到着時間\n   * @param pointName 出発・到着地点名\n   * @param lang 言語設定\n   * @param routeInfo APIから取得したルートの概要情報\n   */\n  constructor(directions: PlaceDirections, flightStatus: FlightInfo, isDepartureGuide: boolean, arrivalTimeToAirport: number, pointName: string, lang: Lang, routeInfo: RouteInfo) {\n    // TODO: i18nが使えるのなら置き換える\n    const isJP = lang === Lang.ja;\n    // タクシーを使用したルート\n    const route = directions?.routes[0];\n    const legs = route?.legs[0];\n    // 所用距離(m)\n    this.distance = routeInfo.distanceValue;\n    this.isRealTime = Boolean(legs.duration_in_traffic);\n    // 所要時間(s)\n    this.duration = routeInfo.durationValue;\n    const durationMinutes = Math.round(this.duration/60);\n    // 飛行機の出発・到着時間\n    const planeTime: Date = flightStatus.getFlightTimeDate(isDepartureGuide);\n    let airportTime: Date = new Date(0);\n    let pointTime: Date = new Date(0);\n    let airportLocation: Location;\n    let targetLocation: Location;\n    // 空港名称\n    const airportLabel = isJP? '空港':'Airport';\n    const airportName = `${isDepartureGuide? flightStatus.depAirportName: flightStatus.arrAirportName} ${airportLabel}`;\n    if(isDepartureGuide) {\n      // 空港到着時間\n      airportTime = subMinutes(planeTime, arrivalTimeToAirport);\n      pointTime = subMinutes(airportTime, durationMinutes);\n      airportLocation = legs.end_location;\n      targetLocation = legs.start_location;\n    }\n    else {\n      airportTime = flightStatus.getSearchTime(false);\n      pointTime = addMinutes(airportTime, durationMinutes);\n      airportLocation = legs.start_location;\n      targetLocation = legs.end_location;\n    }\n    const taxiLine: Line = {\n      stopStationCount: '',\n      timeOnBoard: String(durationMinutes),\n      track: '',\n      exhaustCO2: '',\n      exhaustCO2atPassengerCar: '',\n      distance: String(this.distance),\n      Name: isJP ? 'クルマ' : 'Car, taxi, etc.',\n      Type: 'taxi',\n      ArrivalState: this.dateToState(isDepartureGuide ? airportTime : pointTime),\n      Destination: '',\n      TimeReliability: '',\n      DepartureState: this.dateToState(isDepartureGuide ? pointTime : airportTime),\n      // #82ca3f の10進数変換\n      Color: '13020263',\n      fareIndex: ''\n    };\n    const walkLine: Line = {\n      stopStationCount: '',\n      timeOnBoard: '',\n      track: '',\n      exhaustCO2: '',\n      fareIndex: '',\n      exhaustCO2atPassengerCar: '',\n      distance: '',\n      Name: isJP? '徒歩': 'walk',\n      Type: 'walk',\n      ArrivalState: this.dateToState(airportTime),\n      Destination: '',\n      TimeReliability: '',\n      DepartureState: this.dateToState(airportTime),\n      // #969696 の10進数表現\n      Color: '150150150',\n    };\n    const targetPoint: Point = {\n      Station: {\n        code: '',\n        Name: pointName,\n        Type: '',\n        Yomi: ''\n      },\n      Prefecture: {\n        code: '',\n        Name: ''\n      },\n      GeoPoint: {\n        longi: '',\n        lati: '',\n        longi_d: String(targetLocation.lng),\n        gcs: '',\n        lati_d: String(targetLocation.lat)\n      }\n    }\n    const airportEntrancePoint: Point = {\n      Station: {\n        code: '',\n        Name: airportName,\n        Type: '',\n        Yomi: ''\n      },\n      Prefecture: {\n        code: '',\n        Name: ''\n      },\n      GeoPoint: {\n        longi: '',\n        lati: '',\n        longi_d: String(airportLocation.lng),\n        gcs: '',\n        lati_d: String(airportLocation.lat),\n      }\n    }\n    const securityCheckpointName = isJP? '保安検査場': 'Security Check';\n    const exitName = isJP? '出口': 'exit';\n    const securityCheckPoint: Point = {\n      Name: isDepartureGuide? securityCheckpointName: exitName,\n      Station: {\n        code: '',\n        Name: isDepartureGuide? securityCheckpointName: exitName,\n        Type: '',\n        Yomi: ''\n      },\n      Prefecture: {\n        code: '',\n        Name: ''\n      },\n      GeoPoint: {\n        longi: '',\n        lati: '',\n        longi_d: '',\n        gcs: '',\n        lati_d: ''\n      }\n    }\n    this.searchType = 'arrival';\n    this.dataType = '';\n    this.SerializeData = '';\n    // 同一区間でもタクシー会社により運賃は変わるため、経路情報には料金情報を持たせない\n    this.Price = [];\n    // this.Price = [taxiFare, taxiFareSummary];\n    this.Route = {\n      timeOther: '0',\n      timeOnBoard: String(durationMinutes),\n      exhaustCO2: '0',\n      exhaustCO2atPassengerCar: '0',\n      distance: this.distance.toString(),\n      timeWalk: '',\n      transferCount: '0',\n      Line: isDepartureGuide? [taxiLine, walkLine]: [walkLine, taxiLine],\n      Point: isDepartureGuide? [targetPoint, airportEntrancePoint, securityCheckPoint]: [securityCheckPoint, airportEntrancePoint, targetPoint],\n      allTime: 0\n    };\n    this.fares = {};\n    this.charges = {};\n    this.isLeastTransferCount = true;\n    this.isFast = true;\n    this.isLowPrice = true;\n    this.sumPrice = 0;\n    this.hasAirportBus = false;\n    this.hasByHighwaySection = false;\n    this.OperationLinePattern = null;\n    // 区間に表示する運賃のラベル\n    // 同一区間でもタクシー会社により運賃は変わるため、経路情報には料金情報を持\n    this.feeLabel = ''\n    this.isTaxi = true;\n    this.displayIndex = 'taxi';\n  }\n\n  /**\n   * 空港到着時刻が指定時間以前かを判定する\n   * @param userSetTime ユーザーがセットした空港到着時間\n   * @param isDomestic フライトが国内線か\n   * @param targetAirline 対象となる航空会社\n   */\n  static getArrivalTimeToAirport(userSetTime: number, isDomestic: boolean, targetAirline: AirlineList) {\n    const MAX_DOM_TIME = 60;\n    const MAX_INT_TIME = 120;\n    const MAX_PEACH_CODE_SHARE_TIME = 75;\n    const MAX_SPRING_TIME = 75;\n    if(isDomestic) {\n      if(targetAirline === 'APJ'){\n        return Math.max(userSetTime, MAX_PEACH_CODE_SHARE_TIME);\n      }\n      else if(targetAirline === 'SJO') {\n        return Math.max(userSetTime, MAX_SPRING_TIME);\n      }\n      else {\n        return Math.max(userSetTime, MAX_DOM_TIME);\n      }\n    }\n    else {\n      return Math.max(userSetTime, MAX_INT_TIME);\n    }\n  }\n\n  /**\n   * Date型をState形に変換します\n   * @param date\n   */\n  dateToState(date: Date): State {\n    return {\n      no: '',\n      Type: '',\n      Datetime: {\n        text: date.toISOString(),\n        operation: 'today'\n      }\n    }\n  }\n}\n","import axios from 'axios';\n\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: process.env['REACT_APP_API_ENDPOINT'] as string,\n  timeout: 7000,\n};\n\n// 東京リムジンバス運行情報リクエストFormat \nexport interface ReqTokyoLumousineBusFormat {\n  courseIndex: number,\n  lineIndex: number,\n  depCode: string,\n  arrCode: string,\n  depTime: string\n}\n\n// 東京リムジンバス運行情報レスポンスFormat\nexport interface ResTokyoLimousineBusFormat extends ReqTokyoLumousineBusFormat {\n  isMidnight: boolean,\n  isTargetBusStopDep: boolean,\n  serviceType: string,\n  depBusData: TokyoLimousineBusStopFormat,\n  arrBusData: TokyoLimousineBusStopFormat,\n  isError: boolean,\n  errorBody: string\n}\n\n// 空港リムジンバスバス停Format \ninterface TokyoLimousineBusStopFormat {\n  busStopCode: string,\n  busStopName: string,\n  areaCode: string,\n  areaName: string,\n  ESCode: string,\n  ESName: string,\n  isMidnight: boolean\n}\n\nexport const getLimousineBusDataFactory = (optionConfig?: ApiConfig) => {\n  const config = {\n    ...DEFAULT_API_CONFIG,\n    ...optionConfig,\n  };\n  axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';\n  const instance = axios.create(config);\n\n  const getLimousineBusData = async (limousineBusData: ReqTokyoLumousineBusFormat[]) => {\n    let path;\n    // master/staging環境以外は、リムジンバス運行情報APIははdevを参照する\n    if(process.env['REACT_APP_STAGE_ENV'] === 'master' || process.env['REACT_APP_STAGE_ENV'] === 'stage') {\n      path = '/limousinebus/';\n    } else {\n      path = '/limousinebus/dev';\n    }\n    try {\n      let response = await instance.post(path, limousineBusData);\n  \n      // ステータスコードが200ではない場合。\n      if (response.status !== 200 || response.data.statusCode !== 200) {\n        throw new Error('Server Error');\n      }\n  \n      return response.data.body;\n    } catch (err) {\n      throw err;\n    }\n  }\n  return getLimousineBusData;\n}\n","// 経路の整形をする関数群\nimport { Course } from \"../services/ekispert/models\";\nimport { PublicCourse } from \"../states/publicConditionState\";\n\n\n/**\n * 一般開放モードにて「早」フラグをセットする\n * @param courses \n */\nexport function publicSetInFast(courses: PublicCourse[]): PublicCourse[] {\n  let normalCourses: Course[] = courses.map((course)=>{ return course.course });\n  normalCourses = setIsFast(normalCourses);\n  return publicSetFlag(courses, normalCourses);\n}\n\n/**\n * 一般開放モードにて「安」フラグをセットする\n * @param courses \n */\nexport function publicSetIsLowPrice(courses: PublicCourse[]): PublicCourse[] {\n  let normalCourses: Course[] = courses.map((course)=>{ return course.course });\n  normalCourses = setIsLowPrice(normalCourses);\n  return publicSetFlag(courses, normalCourses);\n}\n\n/**\n * 一般開放モードにて「楽」フラグをセットする\n * @param courses \n */\nexport function publicSetIsLeastTransferCount(courses: PublicCourse[]): PublicCourse[] {\n  let normalCourses: Course[] = courses.map((course)=>{ return course.course });\n  normalCourses = setIsLeastTransferCount(normalCourses);\n  return publicSetFlag(courses, normalCourses);\n}\n\nfunction publicSetFlag(courses: PublicCourse[], normalCourses: Course[]) {\n  return courses.map((course, idx)=>{\n    course.course = normalCourses[idx];\n    return course;\n  });\n}\n\n/**\n * 取得したすべての経路の中で「早」(所要時間が最も短い経路)となる経路にフラグをセットする。\n * @param courses \n */\nexport function setIsFast(courses: Course[]): Course[] {\n  // 最速時間を求める\n  const minTime = courses.reduce((minTime:number, course: Course)=>{\n    const route = course.Route;\n    // 乗車時間 + 待機時間 + 徒歩時間の合計値を所要時間として求める\n    const courseTime = Number(route.timeOnBoard) + Number(route.timeOther) + Number(route.timeWalk);\n    if (course.isTaxi) return minTime; // タクシー経路は判定に含めない\n    return (courseTime < minTime)? courseTime: minTime;\n  }, Number.MAX_VALUE);\n  // 所要時間が最速の場合、早フラグを立てる\n  courses = courses.map((course: Course) => {\n    const route = course.Route;\n    // 探査中のコースの合計所要時間を求める\n    const allTime = Number(route.timeOnBoard) + Number(route.timeOther) + Number(route.timeWalk);\n    // 合計所要時間をview側で簡単に取得できるよう、値を格納する。\n    course.Route.allTime = allTime;\n    // 探査中のコースの所要時間が最速ならば、対象の経路の「早」フラグをセットする\n    if (course.isTaxi) {\n      // 同一の場合があるため、タクシー経路の場合は必ずフラグをfalseにする\n      course.isFast = false;\n    } else {\n      course.isFast = (minTime === allTime);\n    }\n    return course;\n  });\n  return courses;\n}\n\n/**\n * 取得した各経路の合計金額をsumPriceとしてセットする\n * @param courses \n */\nexport function setSumPrice(course: Course): Course {\n  // 空港最寄りから検索した時には course.Price がない場合もある\n  if(course.Price === undefined) {\n    course.sumPrice = 0;\n  }\n  else {\n    // 運賃・料金一覧\n    const prices = Array.isArray(course.Price)? course.Price: [course.Price];\n    // 片道運賃\n    const fareSummary = Number(prices.find(x => x.kind === 'FareSummary')?.Oneway) || 0;\n    // 片道料金\n    const chargeSummary = Number(prices.find(x => x.kind === 'ChargeSummary')?.Oneway) || 0;\n    // 片道運賃 + 料金\n    const price = fareSummary + chargeSummary;\n    // 合計金額をview側で簡単に取得できるよう、値を格納する。\n    course.sumPrice = price;\n  }\n  return course;\n}\n\n/**\n * 取得したすべての経路の中で「安」(運賃と料金の合計が最も安い経路)となる経路にフラグをセットする。\n * @param courses\n */\nexport function setIsLowPrice(courses: Course[]): Course[] {\n  // 最安値を求める\n  const minPrice = courses.reduce((minPrice:number, course: Course)=>{\n    // SumPriceをセットする\n    course = setSumPrice(course);\n    if (course.isTaxi) return minPrice; // タクシー経路は判定に含めない\n    return (course.sumPrice < minPrice)? course.sumPrice: minPrice;\n  }, Number.MAX_VALUE);\n  // 片道運賃+料金が最安値の場合、安フラグを立てる\n  courses = courses.map((course: Course) => {\n    if (course.isTaxi) {\n      // 同一の場合があるため、タクシー経路の場合は必ずフラグをfalseにする\n      course.isLowPrice = false;\n    } else {\n      course.isLowPrice = (minPrice === course.sumPrice);\n    }\n    return course;\n  });\n  return courses;\n}\n\n/**\n * 取得したすべての経路の中で「楽」(乗換回数の最も少ない経路)となる経路にフラグをセットする。\n * @param courses 取得した経路\n */\nexport function setIsLeastTransferCount(courses: Course[]): Course[] {\n  /** 最小の乗換回数を格納する変数。 */\n  let leastTransferCount: number = Number.MAX_VALUE;\n  /** 最小の乗換回数の経路のインデックスを格納する配列。 */\n  let leastTransferCountCourseIndexes: number[] = [];\n\n  // 各経路の乗換回数を比較する。\n  courses.forEach((course, index) => {\n    const transferCount = Number.parseInt(course.Route.transferCount);\n    // 次の経路の乗換回数が最小の乗換回数として記録した回数より少ない場合。\n    // タクシー経路は判定に含めない\n    if (transferCount < leastTransferCount && !course.isTaxi) {\n      // 最小の乗換回数を更新。\n      leastTransferCount = transferCount;\n      // 最小の乗換回数の経路のインデックスの配列を更新する。\n      leastTransferCountCourseIndexes = [index];\n    // 最小の乗換回数が同じ経路が複数存在した場合。\n    // タクシー経路は同じ場合でも追加しない\n    } else if (transferCount === leastTransferCount && !course.isTaxi) {\n      // インデックスの配列に追加する。\n      leastTransferCountCourseIndexes.push(index);\n    }\n    // デフォルト値としてfalseを設定する。\n    // (あとで経路用のクラスを作成し、経路データ整形時にこの値を持つようにする。2020/01/24現在。)\n    course.isLeastTransferCount = false;\n  })\n\n  // 最小の乗換回数の経路のインデックスを格納する配列が未代入の場合は経路データを加工せず、元の値を返す。\n  if (!leastTransferCountCourseIndexes) { return courses; }\n  // 最小の乗換回数の経路のインデックスを元に、対象の経路の「楽」フラグをセットする。\n  leastTransferCountCourseIndexes.forEach((i) => {\n    courses[i].isLeastTransferCount = true;\n  })\n  return courses;\n}\n","import axios from 'axios';\nimport DateTime from '../../utils/dateTime';\nimport { WalkPointRequest } from './util';\n\ninterface ApiConfig {\n  baseURL: string;\n  timeout: number;\n}\n\nconst DEFAULT_API_CONFIG: ApiConfig = {\n  baseURL: process.env['REACT_APP_API_ENDPOINT'] as string,\n  timeout: 7000,\n};\n\n/**\n * UniversalMaas用の徒歩リンク遷移用のURLを取得する\n * @param walkPointList 徒歩リンクリクエスト\n * @returns signatureを組み込んだ遷移先URLList\n */\nexport const getUniversalMaasWalkURL = async (walkPointList: WalkPointRequest[]) => {\n  const isGetDevURL = process.env['REACT_APP_BACKEND_ENV'] === 'dev';\n  const env: string = isGetDevURL? 'dev': 'prod';\n  /** 組み込むURLが /map にするか? */\n  const is_client_map = !DateTime.isUniversalMaaSServiceIn2023();\n  const config: ApiConfig = DEFAULT_API_CONFIG;\n  axios.defaults.headers.post['Content-Type'] = 'application/json';\n  // TODO: 本番反映時には単純に/makewalklink/ にアクセスさせるようにする\n  const pathList = {\n    dev: '/universalMaas/makewalklink/dev',\n    prod: '/universalMaas/makewalklink/'\n  }\n  const path = isGetDevURL? pathList.dev: pathList.prod;\n  const instance = axios.create(config);\n  const request = {\n    body: walkPointList,\n    env: env,\n    is_client_map: is_client_map\n  }\n  const reseponse = await instance.post(path, request);\n  if(reseponse.data.statusCode !== 200) {\n    throw new Error(reseponse.data.errorMessage);\n  }\n  return reseponse.data.body;\n}\n","import Environment from \"../../utils/environment\";\nimport { Course, Line, Point } from \"../ekispert/models\";\nimport Place from \"../google/Place\";\nimport { getUniversalMaasWalkURL } from \"./api\";\n\n// Lambdaに投げるFormat\nexport interface WalkPointRequest {\n  start_lat?: string,\n  start_lon?: string,\n  goal_lat?:  string,\n  goal_lon?:  string,\n  course_index: number,\n  section_index: number,\n  // Publicで使用する往路か復路かのフラグ\n  isOutbound?: boolean,\n  no_change?: boolean,\n  /** UnivMaaSで使用する要素 */\n  /** サポートリクエストID */\n  support_req_id?: string,\n  /** 表示レベル */\n  display_level?: string,\n  /** 表示するURLのモード */\n  mode?: string\n  [key: string]: any\n}\n\n// Lambdaから返ってくるResponse形式\nexport interface WalkPointResponse extends WalkPointRequest {\n  signature: string,\n  url: string,\n  error: boolean\n}\n\n\n// null要素を排除する\nexport const filterNullWalkPointRequest = (item: WalkPointRequest | null): item is WalkPointRequest => {\n  return item !== null;\n}\n\n// 必要な要素を満たしていないリクエストを排除する\nexport const checkWalkPointRequestParams = (item: WalkPointRequest): item is WalkPointRequest => {\n  const isCoordinate = /^\\d{2,3}\\.\\d{1,}$/;\n  const needParamsList = ['start_lat', 'start_lon', 'goal_lat', 'goal_lon'];\n  return needParamsList.every((x: string)=>{\n    return item[x] !== undefined && item[x].match(isCoordinate) !== null;\n  });\n}\n\n/**\n * UniversalMaas徒歩リンク取得APIに投げるRequestを生成する\n * @param courses 経路全体\n * @returns APIに投げる形式\n */\nconst generateUniversalMaaSWalkLinkRequestFromat = (courses: Course[], isDepartureGuide: boolean, place: Place | null): WalkPointRequest[] => {\n  interface GeoCode {\n    lat?: string,\n    lng?: string\n  }\n  return courses.map((course: Course, course_index: number)=>{\n    const lines = Array.isArray(course.Route.Line)? course.Route.Line: [course.Route.Line];\n    const walkLineBase: (WalkPointRequest|null)[] = lines.map((line: Line, line_index: number)=>{\n      if(line.Type === 'walk' || line.Name === '徒歩') {\n        const depPoint: Point = course.Route.Point[line_index];\n        const arrPoint: Point = course.Route.Point[line_index+1];\n        const isUseDepPlace: boolean = isDepartureGuide && line_index === 0 && !depPoint.GeoPoint;\n        const isUseArrPlace: boolean = !isDepartureGuide && line_index === lines.length - 1 && !arrPoint.GeoPoint;\n        const depGeoCode: GeoCode = {\n          lat: isUseDepPlace? place?.lat: depPoint.GeoPoint?.lati_d,\n          lng: isUseDepPlace? place?.lng: depPoint.GeoPoint?.longi_d\n        }\n        const arrGeoCode: GeoCode = {\n          lat: isUseArrPlace? place?.lat: arrPoint.GeoPoint?.lati_d,\n          lng: isUseArrPlace? place?.lng: arrPoint.GeoPoint?.longi_d\n        }\n        const walkPoint: WalkPointRequest = {\n          start_lat: depGeoCode.lat,\n          start_lon: depGeoCode.lng,\n          goal_lat:  arrGeoCode.lat,\n          goal_lon:  arrGeoCode.lng,\n          course_index: course_index,\n          section_index: line_index\n        };\n        return walkPoint;\n      }\n      return null;\n    })\n    return walkLineBase.filter(filterNullWalkPointRequest).filter(checkWalkPointRequestParams);\n  })\n  .flat();\n}\n\nexport interface SetUniversalMaaSWalkLinkArgs {\n  courses: Course[],\n  isDepartureGuide: boolean,\n  place: Place | null\n}\n\n/**\n * UniversalMaas徒歩リンク取得APIからの戻り値を元に、Coursedに徒歩リンク情報を当てはめる\n * @param courses 経路情報の一覧\n * @param walkPointResponse APIからのレスポンス\n * @returns 経路情報の一覧\n */\nconst setUniversalMaaSWalkLinkFromWalkPointResponse = (courses: Course[], walkPointResponse: WalkPointResponse[]) => {\n  walkPointResponse.forEach((walkPoint: WalkPointResponse) => {\n    if(!walkPoint.error) {\n      const targetLine: Line | undefined = courses[walkPoint.course_index]?.Route?.Line[walkPoint.section_index];\n      if(targetLine) {\n        targetLine.universalMaaSWalk = walkPoint;\n      }\n    }\n  });\n  return courses;\n}\n\nexport const setUniversalMaaSWalkLinkFactory = () => {\n  /**\n   * UniversalMaas用の徒歩リンク遷移用のURLを取得して経路中に埋め込む\n   * @param courses 全ての経路情報\n   * @param isDepartureGuide 出発案内は\n   * @param place ユーザー指定の発着地情報\n   * @returns 全ての経路情報\n   */\n  const setUniversalMaaSWalkLink = async (args: SetUniversalMaaSWalkLinkArgs) => {\n    // Lambdaに投げるための要素を生成する\n    const walkPointList: WalkPointRequest[] = generateUniversalMaaSWalkLinkRequestFromat(args.courses, args.isDepartureGuide, args.place);\n    try {\n      if(walkPointList.length > 0) {\n        const walkPointResponse: WalkPointResponse[] = await getUniversalMaasWalkURL(walkPointList);\n        args.courses = setUniversalMaaSWalkLinkFromWalkPointResponse(args.courses, walkPointResponse);\n      }\n    }\n    catch(e) {\n      const env: string = process.env['REACT_APP_STAGE_ENV'] || '';\n      if(Environment.isDev(env)) {\n        console.error(e);\n      }\n    }\n    return args.courses;\n  }\n  return setUniversalMaaSWalkLink;\n}\n\n/**\n * 再検索時にUniversamMaaSの徒歩リンクが途切れないように元の経路の\n * @param oldCourse 古い経路\n * @param researchCourse 再検索により再取得した経路\n * @returns\n */\nexport const resetUniversalMaaSWalkLink = async (oldCourse: Course, researchCourse: Course, isDepartureGuide: boolean, place: Place | null) => {\n  // 新旧それぞれの経路が変わっていないことを確認\n  const oldRequest: WalkPointRequest[] = generateUniversalMaaSWalkLinkRequestFromat([oldCourse], isDepartureGuide, place);\n  let newRequest: WalkPointRequest[] = generateUniversalMaaSWalkLinkRequestFromat([researchCourse], isDepartureGuide, place);\n  newRequest = newRequest.map((req: WalkPointRequest)=>{\n    const fixOldReq = oldRequest.find((x)=>{\n      return x.section_index === req.section_index;\n    });\n    req.no_change = (()=>{\n      return req.start_lat === fixOldReq?.start_lat &&\n      req.start_lon === fixOldReq?.start_lon &&\n      req.goal_lat  === fixOldReq?.goal_lat &&\n      req.goal_lon  === fixOldReq?.goal_lon\n    })();\n    // 変更がない場合には経路データの上書きをする\n    if(req.no_change) {\n      const index = req.section_index;\n      const oldLine = oldCourse.Route.Line[index];\n      const newLine = researchCourse.Route.Line[index];\n      if(oldLine.universalMaaSWalk) {\n        newLine.universalMaaSWalk = oldLine.universalMaaSWalk;\n      }\n    }\n    return req;\n  })\n  .filter((x)=>{\n    return !x.no_change;\n  });\n  // 位置変更が発生した区間が1件以上ある場合には再度問い合わせを行い、置き換えをする\n  if(newRequest.length > 0) {\n    try {\n      const walkPointResponse: WalkPointResponse[] = await getUniversalMaasWalkURL(newRequest);\n      researchCourse = setUniversalMaaSWalkLinkFromWalkPointResponse([researchCourse], walkPointResponse)[0];\n    }\n    catch(e) {\n      const env: string = process.env['REACT_APP_STAGE_ENV'] || '';\n      if(Environment.isDev(env)) {\n        console.error(e);\n      }\n    }\n  }\n  return researchCourse;\n}\n","import FlightInfo from \"../services/ana/models/flightInfo\";\nimport Place from \"../services/google/Place\";\nimport { getDirectionAndFareSamplesAPI } from \"../services/taxi/GetDirectionAndFare\";\nimport { FlightType, GetDirectionAndFareOperation, GetDirectionAndFareSamplesParams, GetDirectionAndFareSamplesResponse } from \"../services/taxi/GetDirectionAndFare/models/getFareSamplesParams\";\nimport { Lang } from \"../states/query\";\nimport { AirlineList } from \"./Airlines\";\nimport Environment from \"./environment\";\nimport { convertLocationToStr } from \"./geoLocation\";\n\n/**\n * Closedモードにおいて自動車経路を取り扱う関数群\n */\n\n/**\n * 出発・目的地から空港までの自動車経路の道のりを取得する\n * @param isDepartureGuide 出発案内か否か\n * @param arrivalTimeToAirport 出発案内の場合、空港までの到着時間\n * @param place 選択した地点情報\n * @param flightStatus 搭乗便情報\n * @param targetAirline 対象となる航空会社\n */\nexport async function saveDirection(isDepartureGuide: boolean, arrivalTimeToAirport: number, place: Place, flightStatus: FlightInfo, lang: Lang, targetAirline: AirlineList) {\n  try {\n    // 空港到着最小時間\n    const ARRIVAL_MIN_TIME = 60;\n    // ピーチ便使用時の空港到着最小時間\n    const PEACH_CODE_SHARE_ARRIVAL_MIN_TIME = 75;\n    // 春秋航空使用時の空港最小時間\n    const SPRING_ARRIVAL_MIN_TIME = 75;\n    // 地点情報の文字列\n    const pointCode = convertLocationToStr(place.getLocation());\n    // 空港到着時間は60分前未満なら60分に設定する\n    const arrivalTime = (()=>{\n      // ピーチの場合には空港到着最小時間を別に設定する\n      if(targetAirline === 'APJ') {\n        return Math.max(arrivalTimeToAirport, PEACH_CODE_SHARE_ARRIVAL_MIN_TIME);\n      }\n      // 春秋航空の場合には空港到着最小時間を別に設定する\n      else if(targetAirline === 'SJO') {\n        return Math.max(arrivalTimeToAirport, SPRING_ARRIVAL_MIN_TIME);\n      }\n      else {\n        return Math.max(arrivalTimeToAirport, ARRIVAL_MIN_TIME);\n      }\n    })();\n\n    /**\n     * 空港を発着しなければいけない時刻\n     * 出発案内の場合にはこの時刻前には到着しなければいけない\n     * 到着案内の場合にはこの時刻に空港を出発する\n     */\n    const airportTime: Date = flightStatus.getSearchTime(isDepartureGuide, arrivalTime);\n    // 空港発着時間:到着案内では空港出発時間、出発案内では空港到着時間\n    const airportTimeUnixTime: number = Math.floor(airportTime.getTime()/1000);\n    // タクシーAPIに投げるリクエストパラメーターを整備する\n    let taxiAPIParams: GetDirectionAndFareSamplesParams = {\n      // 空港コード\n      airportLetter: flightStatus.getFixTerminalCode(isDepartureGuide),\n      // to空港 or From空港\n      operation: isDepartureGuide? GetDirectionAndFareOperation.pickup: GetDirectionAndFareOperation.dropOff,\n      // 出発時刻\n      datetimeAtAirport: airportTimeUnixTime,\n      // 国内か国際か\n      flightType: flightStatus.isDomestic? FlightType.domestic: FlightType.international,\n      // Googleのポリラインを追加で返すか\n      needPolyline: true,\n      // 言語情報\n      language: lang\n    }\n    // ターミナル情報\n    const setTerminal = flightStatus.getTerminal(isDepartureGuide).toString();\n    if(setTerminal && setTerminal !== '') {\n      taxiAPIParams = {\n        ...taxiAPIParams,\n        terminal: setTerminal\n      }\n    }\n    // ゲート情報\n    const setGate = flightStatus.bordingGate;\n    if(setGate && setGate !== '') {\n      taxiAPIParams = {\n        ...taxiAPIParams,\n        gate: setGate\n      }\n    }\n    // 発着地点を入れる\n    taxiAPIParams = {\n      ...taxiAPIParams,\n      pointInfo: {\n        latLng: pointCode,\n        // 英語版の場合英語版の地名ラベルを入れる\n        label: place.getFullAddress(lang),\n        latLngForPriceCalc: pointCode,\n        labelForPriceCalc: place.getFullAddress()\n      }\n    }\n    // APIに問い合わせる\n    const result: GetDirectionAndFareSamplesResponse = await getDirectionAndFareSamplesAPI(taxiAPIParams);\n    return result;\n  } catch(e) {\n    // dev環境のみエラーログを出力\n    if(Environment.isDev(process.env['REACT_APP_STAGE_ENV'] || 'dev')) {\n      console.error(e);\n    }\n    return null;\n  }\n}\n","import { addDays } from \"date-fns\";\nimport { getClosedStationDetail } from \"../services/ekispert/api\";\nimport { getClosedGeocode } from \"../services/google/api\";\nimport Place from \"../services/google/Place\";\nimport { PointType } from \"../states/common\";\n\ninterface PlaceData {\n  [key: string]: {\n    limit: number,\n    place: Place\n  }\n}\n\nclass PlaceInfoFactory {\n  // LocalStorageに格納するKey\n  static localStorageKey = 'ana_airport_access_navi_place_info';\n  // LocalStorageに保存するPlace情報の保持期限(1日)\n  static dataLimitDay = 1;\n\n  // LocalStorageに保存した全てのPlaceデータを取得する\n  static getAllPlaceData = () => {\n    const getData = window.localStorage.getItem(PlaceInfoFactory.localStorageKey);\n    if(getData) {\n      return JSON.parse(getData);\n    }\n    // 見つからない場合には空オブジェクトを返す\n    return {};\n  }\n\n  // データの有効期限が過ぎていないかチェックする\n  static checkLimitData = (data: PlaceData) => {\n    const now = new Date().getTime();\n    Object.keys(data).forEach((key: string)=>{\n      // 有効期限が過ぎたPlace情報は削除します\n      if(data[key].limit < now) {\n        delete data[key];\n      }\n    });\n    return data;\n  }\n\n  static setPlaceData = (key: string, place: Place) => {\n    let allData: PlaceData = PlaceInfoFactory.getAllPlaceData();\n    // 有効期限が切れたPlace情報を削除する\n    allData = PlaceInfoFactory.checkLimitData(allData);\n    const limit = addDays(new Date(), PlaceInfoFactory.dataLimitDay).getTime()\n    allData[key] = {\n      limit: limit,\n      place: place\n    }\n    window.localStorage.setItem(PlaceInfoFactory.localStorageKey, JSON.stringify(allData));\n  }\n\n  static getPlaceData = async (pointCode: string, pointType: string | null) => {\n    const allData: PlaceData = PlaceInfoFactory.getAllPlaceData();\n    const getPlaceObject = allData[pointCode];\n    try {\n      if(getPlaceObject) {\n        return new Place(getPlaceObject.place);\n      }\n      // webStorageにPlace情報が保管されていない場合にはGoogoeGeoCodeAPIよりPlace情報を取得する\n      else if(pointType) {\n        // GoogleGeocodeAPIにアクセスするためのkey\n        let latlng;\n        switch(pointType) {\n          // 駅すぱあと駅コードの場合には駅詳細情報を取得して緯度経度を取得する\n          case PointType.STATION:\n            const stationDetail = await getClosedStationDetail(pointCode);\n            latlng = stationDetail.GeoPoint.lati_d+','+stationDetail.GeoPoint.longi_d;\n            break;\n          // 地点情報だったらそのまま緯度経度となる\n          case PointType.COORDINATE:\n          // CURRENT_POSITION/ADDRESSが来ることは無いが、pointCodeに緯度経度が入るのは同じなので同様に処理する\n          // eslint-disable-next-line\n          case PointType.ADDRESS:\n          // eslint-disable-next-line\n          case PointType.CURRENT_POSITION:\n            latlng = pointCode;\n            break;\n        }\n        if(latlng !== undefined) {\n          // 地点の場合keyには緯度経度情報が入っているのでそのままPlace情報を取得する\n          const places = await getClosedGeocode(latlng);\n          if(places.length > 0) {\n            const place = places[0];\n            // 取得できた地点情報を保存する\n            PlaceInfoFactory.setPlaceData(pointCode, place);\n            return new Place(place);\n          }\n          // 取得した地点情報がない場合にはdev環境だけエラーを出す\n          else if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n            console.error(\"選択した座標では地点詳細情報が取得できませんでした:\"+ latlng);\n            console.error(places);\n          }\n        }\n        return null;\n      }\n      // pointType も保管されていない場合には何もしない\n      // pointType がない場合は想定していないため処理しない\n      return null;\n    }\n    catch(error) {\n      if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n        console.debug(error);\n      }\n      return null;\n    }\n  }\n}\n\nexport default PlaceInfoFactory;\n","/** 各空港の駅コードとスリーコードの対応表 */\n/** TODO: バックエンドに移行させる */\nexport const AirportsStationCodeMap: { [key: string]: string } = {\n\t\"20013\": \"AKJ\",\n\t\"20106\": \"OBO\",\n\t\"20107\": \"MBE\",\n\t\"20178\": \"KUH\",\n\t\"20428\": \"SHB\",\n\t\"20443\": \"HKD\",\n\t\"20570\": \"MMB\",\n\t\"20613\": \"WKJ\",\n\t\"20620\": \"AOJ\",\n\t\"21045\": \"SDJ\",\n\t\"21138\": \"AXT\",\n\t\"21335\": \"SYO\",\n\t\"21552\": \"FKS\",\n\t\"22827\": \"HND\",\n\t\"23691\": \"KMQ\",\n\t\"24034\": \"KIJ\",\n\t\"24723\": \"TOY\",\n\t\"25856\": \"ITM\",\n\t\"25892\": \"KIX\",\n\t\"26881\": \"TTJ\",\n\t\"26938\": \"IWJ\",\n\t\"27033\": \"YGJ\",\n\t\"27053\": \"OKJ\",\n\t\"27367\": \"HIJ\",\n\t\"27584\": \"UBJ\",\n\t\"27649\": \"TKS\",\n\t\"27725\": \"TAK\",\n\t\"27893\": \"MYJ\",\n\t\"27970\": \"KCZ\",\n\t\"28133\": \"KKJ\",\n\t\"28535\": \"NGS\",\n\t\"28628\": \"KMJ\",\n\t\"28743\": \"OIT\",\n\t\"28935\": \"KOJ\",\n\t\"29110\": \"NRT\",\n\t\"29113\": \"HAC\",\n\t\"29115\": \"MMY\",\n\t\"29116\": \"ISG\",\n\t\"29118\": \"FUJ\",\n\t\"29119\": \"TSJ\",\n\t\"29120\": \"IKI\",\n\t\"29129\": \"RIS\",\n\t\"29147\": \"ONJ\",\n\t\"29148\": \"FSZ\",\n\t\"29150\": \"UKB\",\n\t\"29152\": \"HSG\",\n\t\"29153\": \"NTQ\",\n\t\"29411\": \"NGO\",\n\t\"29654\": \"CTS\",\n\t\"29655\": \"FUK\",\n\t\"29656\": \"KMI\",\n\t\"29657\": \"OKA\",\n\t\"29706\": \"IWK\",\n\t\"29313\": \"AXJ\",\n\t\"29121\": \"TNE\",\n\t\"29122\": \"KUM\",\n\t\"29125\": \"RNJ\",\n\t\"29128\": \"KKX\",\n\t\"29124\": \"OKE\",\n\t\"29114\": \"ASJ\",\n\t\"29123\": \"TKN\"\n}\n","import Airlines, { AirlineList } from \"../../utils/Airlines\";\nimport FlightInfo from \"../ana/models/flightInfo\";\nimport { getAverageRail, getPlaneTimeTbile } from \"./api\";\nimport { AirportsStationCodeMap } from \"./data/airportsStationCodeMap\";\nimport { PlaneTimeTable } from \"./models/planeTimetable\";\n\n/**\n * 航空路線時刻表から抽出した時刻表情報より、マッチする空路情報を抽出する\n * @param timetables 航空路線時刻表から抽出した時刻表情報よ\n * @param flightNumber 目的のフライトナンバー\n * @param airline 目的の航空会社\n */\nconst filterTimeTable = (timetables: PlaneTimeTable, flightNumber: string, airline: AirlineList) => {\n  /** ソラシド(SNJ)は駅すぱあと上はSNAなので修正する */\n  const fixAirline = airline === 'SNJ'? 'SNA': airline;\n  /** 便番号の数字部分だけを抽出する */\n  const flightNumberPart = Number(flightNumber.replace(/[^0-9]/g,''));\n  if(!timetables.Line) {\n    return undefined;\n  }\n  const lines = Array.isArray(timetables.Line)? timetables.Line: [timetables.Line];\n  return lines.find((line) => {\n    /** 航空会社が一致するか */\n    const isMatchAirLine = fixAirline === line.Name.abbreviation;\n    /** 便番号が一致するか */\n    /** 先頭に0がつくかどうかで表記ゆれしそうなので、すべて数値型に変換させて比較する */\n    const isMatchNumber = flightNumberPart === Number(line.Number);\n    return isMatchAirLine && isMatchNumber;\n  })\n}\n\n/**\n * 駅すぱあとより空路情報を構築する\n * @param depAirportCode 出発空港(スリーコード)\n * @param arrAirportCode 到着空港(スリーコード)\n * @param depDate 出発日\n * @param flightNumber フライトナンバー\n * @param airline 航空会社\n * @returns flightInfo型の駅すぱあと情報から構築した空路情報\n */\nexport const getPlaneTimetabile = async (depAirportCode: string, arrAirportCode: string, depDate: Date, flightNumber: string, airline: AirlineList) => {\n  /**\n   * 1. 発着レターコードを駅すぱあと駅コードに変換\n   * 2. 平均路線検索にてtype:planeにした上で平均路線名を取得\n   * 3. 航空路線時刻表で該当路線の全時刻表を取得\n   * 4. 連携した航空会社と便番号よりマッチするフライトを探索\n   * 5. マッチしたフライトの発着時刻を取得する\n   */\n  const fligt = new FlightInfo();\n  /** 特定の航空会社の場合にはこちらの処理は行わない */\n  if(Airlines.isNotGetTimeTablePlane(airline)) {\n    return fligt;\n  }\n  /** 1. 発着レターコードを駅すぱあと駅コードに変換 */\n  const depAirportStationCode = Object.keys(AirportsStationCodeMap).find((statingCode: string) => {\n    return AirportsStationCodeMap[statingCode] === depAirportCode;\n  });\n  const arrAirportStationCode = Object.keys(AirportsStationCodeMap).find((statingCode: string) => {\n    return AirportsStationCodeMap[statingCode] === arrAirportCode;\n  });\n  try {\n    if(!depAirportStationCode || !arrAirportStationCode) {\n      throw new Error('空路情報EWS取得: 発着空港がリストにありません');\n    }\n    /** 2. 平均路線検索にてtype:planeにした上で平均路線名を取得 */\n    const averageRail = await getAverageRail(depAirportStationCode, arrAirportStationCode);\n    /** 平均路線名を取得する */\n    const lineName = averageRail?.Line?.Name;\n    if(!lineName) {\n      throw new Error(\"空路情報EWS取得: 平均路線名が取得出来ませんでした\")\n    }\n    /** 3. 航空路線時刻表で該当路線の全時刻表を取得 */\n    /** 上りの時刻表を取得する */\n    /** TODO: この時点で対象の区間が上り・下りかを判別する */\n    const upPlaneTimeTabile = await getPlaneTimeTbile(lineName, depDate, true);\n    let targetLine = undefined;\n    if(upPlaneTimeTabile.TimeTable) {\n      targetLine = filterTimeTable(upPlaneTimeTabile.TimeTable, flightNumber, airline);\n    }\n    /** 上りで見つからない場合には下りを取得する */\n    if(!targetLine) {\n      const downPlaneTimeTabile = await getPlaneTimeTbile(lineName, depDate, false);\n      if(downPlaneTimeTabile.TimeTable) {\n        targetLine = filterTimeTable(downPlaneTimeTabile.TimeTable, flightNumber, airline);\n      }\n    }\n    if(!targetLine) {\n      const errorMessage = \"空路情報EWS取得: マッチする路線が時刻表から見つかりませんでした\\n\" +\n        `便名: ${flightNumber}\\n` +\n        `出発空港: ${depAirportCode}\\n` +\n        `到着空港: ${arrAirportCode}\\n` +\n        `航空会社: ${airline}`;\n      throw new Error(errorMessage);\n    }\n    fligt.updateTimeTableLine(depDate, targetLine);\n    return fligt;\n  }\n  catch(e) {\n    // dev環境のみエラーログを出力\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n      console.error(e);\n    }\n    return new FlightInfo();\n  }\n}","/** referrerパラメーターに関する処理をまとめたクラス。 */\nexport default class ReferrerParam {\n  /** ANAアプリ国内の場合のリファラー。 */\n  static readonly APP_DOM = 'appdms';\n  /** ANAアプリ国際の場合のリファラー。 */\n  static readonly APP_INT = 'appint';\n  /** ANAアプリ国内の場合のリファラー。(その2) */\n  static readonly APP_DOM_1 = 'appdms1';\n  /** ANAアプリ国際の場合のリファラー。(その2) */\n  static readonly APP_INT_1 = 'appint1';\n  /** 広島空港からの遷移で使うリファラー */\n  static readonly HIROSHIMA_AIRPORT = 'hijapo';\n  /** 福島空港からの遷移で使うリファラー */\n  static readonly FUKUSHIMA_AIRPORT = 'fksapo';\n  /** 松山空港からの遷移で使うリファラー */\n  static readonly MATSUYAMA_AIRPORT = 'myjapo';\n  /** 熊本空港からの遷移で使うreferrer */\n  static readonly KUMAMOTO_AIRPORT = 'kmjapo';\n\n  /** ANAアプリとして扱うreferrerパラメーターのSet型オブジェクト。 */\n  static readonly APP = new Set([\n    ReferrerParam.APP_DOM,\n    ReferrerParam.APP_DOM_1,\n    ReferrerParam.APP_INT,\n    ReferrerParam.APP_INT_1\n  ]);\n\n  /** 特定空港からの遷移として扱うreferrerパラメーターのSet型オブジェクト。 */\n  static readonly AIRPORTSITE = new Set([\n    ReferrerParam.HIROSHIMA_AIRPORT,\n    ReferrerParam.FUKUSHIMA_AIRPORT,\n    ReferrerParam.MATSUYAMA_AIRPORT,\n    ReferrerParam.KUMAMOTO_AIRPORT\n  ]);\n\n  /**\n   * referrerパラメーターの値を元に、ANAアプリからのアクセスであるかを判別する。\n   * @param referrer 連携されたreferrerパラメーターの値。\n   */\n  static isApp(referrer: string) {\n    return this.APP.has(referrer);\n  }\n\n  /**\n   * referrerパラメーターの値を元に、空港サイトからのアクセスであるかを判別する。\n   * @param referrer 連携されたreferrerパラメーターの値。\n   */\n  static isAirportSite(referrer: string) {\n    return this.AIRPORTSITE.has(referrer);\n  }\n\n  /**\n   * referrerパラメーターの値を元に、広島空港からのアクセスであるかを判別する。\n   * @param referrer 連携されたreferrerパラメーターの値。\n   */\n  static isHiroshimaAirport(referrer: string) {\n    return this.HIROSHIMA_AIRPORT === referrer;\n  }\n\n  /**\n   * referrerパラメーターの値を元に、福島空港からのアクセスであるかを判別する。\n   * @param referrer 連携されたreferrerパラメーターの値。\n   */\n  static isFukushimaAirport(referrer: string) {\n    return this.FUKUSHIMA_AIRPORT === referrer;\n  }\n\n  /**\n   * referrerパラメーターの値を元に、松山空港からのアクセスであるかを判別する。\n   * @param referrer 連携されたreferrerパラメーターの値。\n   */\n  static isMatsuyamaAirport(referrer: string) {\n    return this.MATSUYAMA_AIRPORT === referrer;\n  }\n\n  /**\n   * referrerパラメーターの値を元に、熊本空港からのアクセスであるかを判別する。\n   * @param referrer 連携されたreferrerパラメーターの値。\n   */\n  static isKumamotoAirport(referrer: string) {\n    return this.KUMAMOTO_AIRPORT === referrer;\n  }\n}\n","import JRKyushuReserveLinkData from \"../jrkyushu/JRKyushuReserveLinkData\";\nimport { AswInCourseInfoList } from \"../public/models/aswLinkageInfo\";\nimport { ResTokyoLimousineBusFormat } from \"../tokyolimousinebus/api\";\nimport { WalkPointResponse } from \"../universalMaas/util\";\n\n/**\n * えきねっと該当区間の会社タイプ\n * 富士回遊(JR東日本・富士急行)みたいに1区間で複数の会社を跨ぐ列車が対象になったらここは見直す必要が出てくる\n **/\nexport enum EkinetCompanyType {\n  /** JR東日本 */\n  'JRE' = 'JRE',\n  /** JR北海道 */\n  'JRH' = 'JRH'\n}\n\n/**\n * 駅すぱあとWebサービスの「/v1/json/search/course/extreme」パスのレスポンスの型を定義したファイル。\n */\nexport interface Extreme {\n  ResultSet: ResultSet;\n}\n\nexport interface ResultSet {\n  apiVersion:    string;\n  engineVersion: string;\n  Course:        Course[];\n}\n\n// 拡張したCourseの要素\n// TODO: 拡張とわかるようにextends要素に持たせる\nexport interface Course extends BaseCourse {\n  feeLabel:      string;\n  /** JR九州予約情報 */\n  JRKyushuReserveLinkData?: JRKyushuReserveLinkData;\n  /** 最小乗換回数経路か */\n  isLeastTransferCount: boolean;\n  /** 最速経路か */\n  isFast:        boolean;\n  /** 最安経路か */\n  isLowPrice:    boolean;\n  /** 合計運賃 */\n  sumPrice:      number;\n  /** 空港連絡バスを使用する経路化 */\n  hasAirportBus: boolean;\n  /** 高速バスを使用した経路か */\n  hasByHighwaySection: boolean;\n  OperationLinePattern: any;\n  /** 東京メトロ・都営地下鉄の区間が経路中に存在するか */\n  hasTokyoSubwaySection?: boolean;\n  /** 京急&Subwayチケットを表示する区間が経路中に存在するか */\n  hasKeikyuAndSubwayTicketSection?: boolean;\n  isTaxi?:        boolean;\n  /** 混雑情報を加味したリアルタイム情報か(タクシー経路の場合) */\n  isRealTime?:    boolean;\n  displayIndex:   string;\n  /** ASWよりスクレイピングした最安空路運賃情報 */\n  AswInfo?:       AswInCourseInfoList;\n  /** UniversalMaaS用: 一括サポート手配ボタンを表示するか */\n  bulkSupportArrangementFlag?: boolean\n}\n\n// ekispert/extreme/Courseと同じCourse型\ninterface BaseCourse {\n  searchType:    string;\n  dataType:      string;\n  SerializeData: string;\n  Price:         Price[];\n  Route:         Route;\n  fares:         { [key: string]: Fare; };\n  charges:       { [key: string]: Charge; };\n}\n\nexport interface Price {\n  kind:                string;\n  Oneway:              string | PriceOneway;\n  Round:               string;\n  fareRevisionStatus?: string;\n  toLineIndex?:        string;\n  fromLineIndex?:      string;\n  index:              string;\n  selected?:           string;\n  Name?:               string;\n  Type?:               string;\n  RevisionStatus?:     string;\n  Rate?:               Rate;\n}\n\nexport interface PriceOneway {\n  text: string;\n  remark: string;\n  fullRemark: string;\n}\n\nexport interface Rate {\n  text: string;\n  area: string;\n}\n\nexport interface Route {\n  timeOther:                string;\n  timeOnBoard:              string;\n  exhaustCO2:               string;\n  exhaustCO2atPassengerCar: string;\n  distance:                 string;\n  timeWalk:                 string;\n  transferCount:            string;\n  Line:                     Line[];\n  Point:                    Point[];\n  allTime:                  number;\n}\n\n// 拡張したLineの要素\n// TODO: 拡張とわかるようにextends要素に持たせる\nexport interface Line extends BaseLine {\n  isShowViaTerminal?:        boolean;\n  isShowJRHokkaidoFreePass?: boolean;\n  isShowJRKyushuLink?:       boolean;\n  // 区間が東京地下鉄・都営地下鉄で完結する\n  hasOnlyTokyoSubwaySeciton?: boolean;\n  // 区間中に京急・東京地下鉄・都営地下鉄の区間が含まれる\n  hasTargetKeikyuSection?: boolean;\n  isShowTokyoLimousineBus?:  boolean;\n  isShowOsakaLimousineBus?:  boolean;\n  viaTerminalName?:          string;\n  viaTerminalCode?:          string;\n  Comment?:                  Comment;\n  TypicalName?:              string;\n  koboBusLink?:              KoboLink;\n  PreCautionalComment?:      string;\n  tokyoLimousineBusLink?:    ResTokyoLimousineBusFormat;\n  // UniversalMaasの徒歩経路URL\n  universalMaaSWalk?:        WalkPointResponse;\n  // UniversalMaaS用置換前SectionIndexデータ\n  rawSectionIndex?:          number;\n  // えきねっと連携リンク\n  ekinetLink?:               EkinetLink;\n}\n\nexport interface EkinetLink {\n  url: string,\n  type: EkinetCompanyType[]\n}\n\n// ekispert/extreme/LIneと同じLine型\ninterface BaseLine {\n  stopStationCount:         string;\n  chargeIndex?:             string;\n  timeOnBoard:              string;\n  track:                    string;\n  exhaustCO2:               string;\n  fareIndex:                string;\n  exhaustCO2atPassengerCar: string;\n  distance:                 string;\n  trainID?:                  string;\n  Name:                     string;\n  Type:                     string | TypeClass;\n  ArrivalState:             State;\n  Destination:              string;\n  Number?:                  string;\n  TimeReliability:          string;\n  DepartureState:           State;\n  Color:                    string;\n  LineSymbol?:              LineSymbol;\n  InsideInformation?:       InsideInformation;\n}\n\nexport interface KoboLink {\n  onelineQuery: string;\n  host: string,\n  query: {\n    [key: string]: string | undefined\n  }\n}\n\nexport interface InsideInformation {\n  navigatorTransportation: string;\n  Section:                 Section;\n  Stop:                    Stop[];\n}\n\nexport interface Section {\n  Name:     string;\n  NickName: string;\n  Previous: Next;\n  Next?:    Next;\n}\n\nexport interface Next {\n  Station: LineSymbol;\n}\n\nexport interface Stop {\n  ArrivalState?:   StopArrivalState;\n  Point:           StopPoint;\n  DepartureState?: StopArrivalState;\n}\n\nexport interface StopArrivalState {\n  Datetime: Datetime;\n}\n\nexport interface StopPoint {\n  getOff:     string;\n  getOn:      string;\n  Station:    LineSymbol;\n  Prefecture: LineSymbol;\n}\n\nexport interface State {\n  no:       string;\n  Type:     string;\n  Datetime: Datetime;\n}\n\nexport interface Datetime {\n  text:      string;\n  operation: string;\n}\n\n\nexport interface LineSymbol {\n  code: string;\n  Name: string;\n}\n\nexport interface TypeClass {\n  text:   string;\n  detail: string;\n}\n\nexport interface Point {\n  Station:    Station;\n  Prefecture: LineSymbol;\n  GeoPoint:   GeoPoint;\n  Name?: string;\n  // PublicModeで使用する再検索で必要なランドマーク情報\n  landmarkSerializeData?: string;\n  // Public用\n  Type?: string;\n  Location?: {\n    latlng: string\n  }\n}\n\nexport interface GeoPoint {\n  longi:   string;\n  lati:    string;\n  longi_d: string;\n  gcs:     string;\n  lati_d:  string;\n}\n\nexport interface Station {\n  code: string;\n  Name: string;\n  Type: string;\n  Yomi: string;\n  letter?: string;\n}\n\nexport interface ConditionDetail {\n  ResultSet: CondtionResultSet;\n}\n\nexport interface CondtionResultSet {\n  apiVersion:    string;\n  engineVersion: string;\n  Condition:     string;\n}\n\nexport interface Traininfo {\n  provider:           string;\n  status:             string;\n  Line: {\n    corporationIndex: string;\n    code:             string;\n    Name:             string;\n  };\n  Title:              string;\n  Comment:            Comment[];\n  Datetime:           Date;\n}\n\ninterface Comment {\n  text:   string;\n  status: string;\n}\n\nexport interface TraininfoList {\n  [key: string]: Traininfo;\n}\n\n// Converts JSON strings to/from your types\nexport class Convert {\n  public static toExtreme(json: string): Extreme {\n      return JSON.parse(json);\n  }\n\n  /**\n   * 駅すぱあとWebサービスの探索結果のレスポンスをCourse型の配列に整形する。\n   * @param json 駅すぱあとWebサービスから返却された探索結果のJSON\n   */\n  public static toCourses(json: string): Course[] {\n    const extreme: Extreme = JSON.parse(json);\n    let courses: Course[] = [];\n\n    // ResultSet要素・Course要素が存在する場合のみ以下の処理をする。\n    if (extreme.ResultSet && extreme.ResultSet.Course) {\n      // Course要素が配列の場合はそのまま格納する。\n      if (Array.isArray(extreme.ResultSet.Course)) {\n        courses = extreme.ResultSet.Course;\n      // Course要素が配列以外(オブジェクト)の場合は、配列に追加する。\n      } else {\n        courses.push(extreme.ResultSet.Course);\n      }\n\n      // 各経路をループさせる。\n      courses.forEach(course => {\n        let fares: { [key: string]: Fare; } = {};\n        let charges: { [key: string]: Charge; } = {};\n        // 運賃・料金情報の整形をする。\n        course.Price.forEach(p => {\n          switch (p.kind) {\n            // 種別がFare(運賃)の場合。\n            case 'Fare':\n              fares[p.index] = new Fare(p);\n              break;\n            // 種別がCharge(料金)の場合。\n            case 'Charge':\n              charges[p.index] = new Charge(p);\n              break;\n            default:\n              break;\n          }\n        });\n\n        // 路線情報の整形をする。\n        // (路線が1つの場合、配列ではなくオブジェクトで返る場合があるため。)\n        let lines: Line[] = [];\n        if (Array.isArray(course.Route.Line)) {\n          lines = course.Route.Line;\n        } else {\n          lines.push(course.Route.Line);\n        }\n\n        course.fares = fares;\n        course.charges = charges;\n        course.Route.Line = lines;\n      })\n    }\n    return courses;\n  }\n\n  public static extremeToJson(value: Extreme): string {\n      return JSON.stringify(value);\n  }\n}\n\nexport class Fare {\n  fareRevisionStatus?: string;\n  toLineIndex?: string;\n  fromLineIndex?: string;\n  index?: string;\n  selected?: string;\n  oneway?: string;\n  revisionStatus?: string;\n  round?: string;\n\n  constructor(price: Price) {\n    this.fareRevisionStatus = price.fareRevisionStatus;\n    this.toLineIndex = price.toLineIndex;\n    this.fromLineIndex = price.fromLineIndex;\n    this.index = price.index;\n    this.oneway = price.index;\n    this.revisionStatus = price.RevisionStatus;\n    this.round = price.Round;\n    this.selected = price.selected;\n  }\n}\n\nexport class Charge extends Fare{\n  constructor(price: Price) {\n    super(price);\n  }\n}\n","import { EkinetCompanyType, Line } from \"../ekispert/models\";\nimport JRELineList from \"./data/jre_line_list.json\";\nimport JRHLineList from \"./data/jrh_line_list.json\";\n\n/** JREの路線一覧 */\nconst JRELineListArray: string[] = JRELineList.map((x) => {\n  return x.code;\n})\n/** JRHの路線一覧 */\nconst JRHLineListArray: string[] = JRHLineList.map((x) => {\n  return x.code;\n})\n\n// 各Line要素にえきねっとに関する情報を拡張\nexport class EkinetInfoLine {\n  /** えきねっと対象区間か */\n  isEkinetSection: boolean;\n  /** 該当区間の会社タイプ */\n  companies: EkinetCompanyType[];\n  /** 対象区間の最も安い特急料金 */\n  mostCheapChage: number;\n  /** えきねっと連携対象区間か */\n  isShowEkinetLink: boolean;\n  /** 該当区間のLine要素 */\n  line: Line\n\n  constructor(line: Line) {\n    this.isEkinetSection = false;\n    this.mostCheapChage = 0;\n    this.companies = [];\n    this.isShowEkinetLink = false;\n    this.line = line;\n  }\n\n  /**\n   * OperationLineList からどの会社を使用するかの一覧を取得する\n   * @param olpList OperationLineList\n   */\n  static getCompanies(olpList: string[]): EkinetCompanyType[] {\n    const companies: Set<EkinetCompanyType> = new Set();\n    olpList.forEach((x) => {\n      /** JR東日本の路線が含まれるか */\n      if(JRELineListArray.includes(x)) {\n        companies.add(EkinetCompanyType.JRE);\n      }\n      /** JR北海道の路線が含まれるか */\n      if(JRHLineListArray.includes(x)) {\n        companies.add(EkinetCompanyType.JRH);\n      }\n    })\n    return Array.from(companies);\n  }\n\n  /**\n   * 該当区間にえきねっとのリンクを表示するか判定する\n   */\n  setIsShowLink() {\n    if(!this.isEkinetSection) {\n      this.isShowEkinetLink = false;\n    }\n    /** 現状では複数の会社にまたがる場合を考慮していない */\n    /** 対象区間がJREの場合、料金が0円の区間ではボタンを非表示にする */\n    else if(this.companies.includes(EkinetCompanyType.JRE)) {\n      this.isShowEkinetLink = this.mostCheapChage !== 0;\n    }\n    /** 対象区間がJRHの場合、該当Lineの列車名に「快速エアポート」「特別快速エアポート」が含まれていなければ非表示にする */\n    else if(this.companies.includes(EkinetCompanyType.JRH)) {\n      const acceptTrainNameList = ['快速エアポート', '特別快速エアポート'];\n      this.isShowEkinetLink = acceptTrainNameList.some((x)=>{ return this.line.Name.includes(x) });\n    }\n  }\n}\n\n","import { Lang } from \"../../states/query\";\nimport DateTime from \"../../utils/dateTime\";\nimport { Course, EkinetCompanyType } from \"../ekispert/models\";\nimport EkinetStationObj from \"./data/ekinet_station_list.json\";\nimport JRELineList from \"./data/jre_line_list.json\";\nimport JRHLineList from \"./data/jrh_line_list.json\";\nimport { EkinetInfoLine } from \"./ekinetInfoLine\";\n\nexport interface EkinetStation {\n  ekinetName: string,\n  ewsName: string\n}\n\n// えきねっとで取り扱いできる駅リスト\nconst EkinetStationList: { [key: string]: EkinetStation } = EkinetStationObj;\n/** JREの路線一覧 */\nconst JRELineListArray: string[] = JRELineList.map((x) => {\n  return x.code;\n})\n/** JRHの路線一覧 */\nconst JRHLineListArray: string[] = JRHLineList.map((x) => {\n  return x.code;\n})\n/** えきねっと対象路線一覧 */\nconst EkinetLineListArray: string[] = JRELineListArray.concat(JRHLineListArray);\n\n// 実際に遷移する際のクエリ情報\ninterface JREEkinetParams {\n  /** 発駅リスト */\n  from_ticketing_stop_time_id: string,\n  /** 着駅リスト */\n  to_ticketing_stop_time_id: string,\n  /** 発時刻リスト */\n  boarding_time: string,\n  /** 人数(おとな) */\n  num_adult: string,\n  /** 人数(こども) */\n  num_child: string,\n  /** トラッキングコード: utm_source */\n  utm_source: string,\n  /** トラッキングコード: utm_medium */\n  utm_medium: string,\n  /** トラッキングコード: utm_campaign */\n  utm_campaign: string,\n  /** トラッキングコード: utm_content */\n  utm_content: string\n}\n\n// 遷移用のクエリを生成するための元情報\ninterface JREEkinetBaseParams {\n  /** 発着経由駅コードリスト */\n  stationCodeList: string[],\n  /** 出発時刻リスト */\n  depTimeList: string[],\n  /** 対象となるLine要素リスト */\n  lineIdxList: number[],\n  /** 該当区間の会社タイプ */\n  companies: EkinetCompanyType[];\n}\n\n/** えきねっと連携に関するClass */\nexport default class JREEkinet {\n  /** 基本となるURL */\n  static BASE_URL: string = 'https://www.eki-net.com/Personal/reserve/wb/RouteSearchConditionInput/ExternalTransitionProcNe';\n  /** 基本となるおとな人数 */\n  static ADULT_NUM: string = \"1\";\n  /** 基本となるこども人数 */\n  static CHILD_NUM: string = \"0\";\n  /** トラッキングコード: utm_source */\n  static UTM_SOURCE = 'an';\n  /** トラッキングコード: utm_medium */\n  static UTM_MEDIUM = 'sea';\n  /** トラッキングコード: utm_campaign */\n  static UTM_CAMPAIGN = 'transit';\n  /** トラッキングコード: utm_content */\n  static UTM_CONTENT = 'airport_access';\n\n  /** リンク元となるデータ一覧 */\n  linkDatas: JREEkinetBaseParams[];\n  /** えきねっとのリンクを表示するかLineごとの情報を入れる */\n  ekinetInfoLines: EkinetInfoLine[];\n  /** 参照用の経路情報 */\n  course: Course;\n\n  constructor(course: Course) {\n    this.linkDatas = [];\n    this.ekinetInfoLines = [];\n    this.course = course;\n  }\n\n  /**\n   * 各区間がえきねっと予約対象区間かを判定する\n   **/\n  setIsShowLinkSections() {\n    // えきねっとのリンクを表示するかLineごとの情報を入れる\n    this.ekinetInfoLines = this.course.Route.Line.map((line) => {\n      return new EkinetInfoLine(line);\n    });\n    const operationLinePatterns = this.course.OperationLinePattern.length? this.course.OperationLinePattern: [this.course.OperationLinePattern];\n    operationLinePatterns.forEach((olp: any) => {\n      /** 1始まりのIndex値 */\n      const routeLineIndex = Number(olp.routeLineIndex);\n      /** 挿入対象の拡張Line要素 */\n      const targetExtendLineLine = this.ekinetInfoLines[routeLineIndex-1];\n      /** Operation Line Pattern Lines */\n      const olpLines = olp.Line.length? olp.Line: [olp.Line];\n      /** 1区間に跨る線区の一覧 */\n      const olpLineList: string[] = olpLines.map((line: any)=>{ return line.code; });\n      /** 該当区間全てJREの区間かを判定する */\n      let isEkinetTargetLine = olpLineList.every((line: string) => {\n        return EkinetLineListArray.includes(line);\n      })\n      /** 発着駅の駅コードを求め、出発駅・到着駅ともにリストに含まれているかを確認する */\n      const depStationCode = this.course.Route.Point[routeLineIndex-1].Station.code;\n      const arrStationCode = this.course.Route.Point[routeLineIndex].Station.code;\n      isEkinetTargetLine = isEkinetTargetLine && EkinetStationList[depStationCode] !== undefined && EkinetStationList[arrStationCode] !== undefined;\n      // 該当区間が特急区間化を判定する\n      /** 対象区間の取得可能な特急券一覧を取得する */\n      const priceList = this.course.Price.filter((p) => {\n        return p.kind === 'Charge' &&\n          Number(p.fromLineIndex || -1) >= routeLineIndex &&\n          Number(p.toLineIndex || Infinity) <= routeLineIndex\n      });\n      /** 最安特急料金を取得する */\n      let mostCheapChage = Math.min(...priceList.map((p) => {\n        return Number(p.Oneway);\n      }))\n      // priceList が空のときには Infinity になるので処理をする\n      mostCheapChage = mostCheapChage === Infinity? 0: mostCheapChage;\n      targetExtendLineLine.isEkinetSection = isEkinetTargetLine;\n      targetExtendLineLine.mostCheapChage = mostCheapChage;\n      targetExtendLineLine.companies = EkinetInfoLine.getCompanies(olpLineList);\n      targetExtendLineLine.setIsShowLink();\n    })\n  }\n\n  /**\n   * えきねっと予約リンクの元データを生成する\n   */\n  generateReserveParams() {\n    /** 初期化用のパラメータ */\n    const initJREEkinetBaseParams: JREEkinetBaseParams = {\n      stationCodeList: [],\n      depTimeList: [],\n      lineIdxList: [],\n      companies: []\n    }\n    /** 現在参照中のパラメータ */\n    let currentJREEkinetBaseParams: JREEkinetBaseParams = JSON.parse(JSON.stringify(initJREEkinetBaseParams));\n    this.ekinetInfoLines.forEach((info, idx) => {\n      const isEmpty = currentJREEkinetBaseParams.stationCodeList.length === 0;\n      if(info.isShowEkinetLink) {\n        // データが空の場合には出発駅情報を始めに入れる\n        if(isEmpty) {\n          const depPoint = this.course.Route.Point[idx].Station.code;\n          currentJREEkinetBaseParams.stationCodeList.push(depPoint);\n        }\n        // 到着駅情報を入れる\n        const arrPoint = this.course.Route.Point[idx+1].Station.code;\n        currentJREEkinetBaseParams.stationCodeList.push(arrPoint);\n        // 出発時刻を入れる\n        const depDate = this.course.Route.Line[idx].DepartureState.Datetime.text;\n        currentJREEkinetBaseParams.depTimeList.push(depDate);\n        // 参照LineIndexを入れる\n        currentJREEkinetBaseParams.lineIdxList.push(idx);\n        // 重複を排除した状態で会社情報を入れる\n        const tmpComSet = new Set(currentJREEkinetBaseParams.companies.concat(info.companies));\n        currentJREEkinetBaseParams.companies =  Array.from(tmpComSet);\n      }\n      /** 予約不可区間の場合、リンクを区切る */\n      else if(!isEmpty) {\n        this.linkDatas.push(JSON.parse(JSON.stringify(currentJREEkinetBaseParams)));\n        currentJREEkinetBaseParams = JSON.parse(JSON.stringify(initJREEkinetBaseParams));\n      }\n    })\n    /** 最後の区間で予約可能な場合には、最後の区間のリンクを入れる */\n    const isEmpty = currentJREEkinetBaseParams.stationCodeList.length === 0;\n    if(!isEmpty) {\n      this.linkDatas.push(JSON.parse(JSON.stringify(currentJREEkinetBaseParams)));\n    }\n  }\n\n  /**\n   * generateReserveParams() で生成したデータを元に Course/Route/Line 要素にえきねっと予約リンクを入れる\n   * @params {Course} 挿入対象の経路データ\n   */\n  insertEkinetLinkInLine(course: Course) {\n    /** 第一区間の出発時刻文字列 */\n    const firstDepSectionTimeStr = this.linkDatas[0]?.depTimeList[0] || \"\";\n    /** 第一区間の出発時刻 */\n    const firstDepSectionTime = new Date(firstDepSectionTimeStr);\n    /** はじめの予約区間が1ヶ月前かつ10分前以降である場合には全ての予約リンクを非表示にする */\n    if(DateTime.isAbleDisplayEkinetLink(firstDepSectionTime)) {\n      this.linkDatas.forEach((linkData: JREEkinetBaseParams) => {\n        // リンクを生成する\n        const ekinetLinkURL = JREEkinet.generateEkinetURL(linkData);\n        // Line要素にリンクを埋め込む\n        linkData.lineIdxList.forEach((idx) => {\n          course.Route.Line[idx].ekinetLink = {\n            url: ekinetLinkURL,\n            type: linkData.companies\n          }\n        })\n      });\n    }\n  }\n\n  /**\n   * えきねっと予約リンクを生成する\n   * @param linkData えきねっと予約リンクを生成するための情報源\n   */\n  static generateEkinetURL(linkData: JREEkinetBaseParams) {\n    const stationNameList = linkData.stationCodeList.map((stationCode: string) => {\n      return EkinetStationList[stationCode].ekinetName;\n    })\n    const depStationList = stationNameList.slice(0, stationNameList.length - 1);\n    const arrStationList = stationNameList.slice(1);\n    const ekinetParams: JREEkinetParams = {\n      from_ticketing_stop_time_id: JSON.stringify(depStationList),\n      to_ticketing_stop_time_id: JSON.stringify(arrStationList),\n      boarding_time: JSON.stringify(linkData.depTimeList),\n      num_adult: JREEkinet.ADULT_NUM,\n      num_child: JREEkinet.CHILD_NUM,\n      utm_source: JREEkinet.UTM_SOURCE,\n      utm_medium: JREEkinet.UTM_MEDIUM,\n      utm_campaign: JREEkinet.UTM_CAMPAIGN,\n      utm_content: JREEkinet.UTM_CONTENT\n    }\n    return `${JREEkinet.BASE_URL}?${new URLSearchParams({...ekinetParams}).toString()}`\n  }\n\n  /**\n   * EWSのCourse中にえきねっとへのリンクを挿入する\n   * @param courses 挿入対象の経路\n   */\n  static insertJREEkinetURLInCourse(course: Course, lang: Lang) {\n    // OperationLinePattern がない時や、言語が日本語ではない場合には出さない\n    if(!course.OperationLinePattern || lang !== Lang.ja) {\n      return;\n    }\n    const jreEkinet = new JREEkinet(course);\n    /** 各区間がえきねっと予約対象区間かを判定する */\n    jreEkinet.setIsShowLinkSections();\n    /** 各区間の予約リンクを入れ込む */\n    jreEkinet.generateReserveParams();\n    /** 駅ネット予約リンクを入れる */\n    jreEkinet.insertEkinetLinkInLine(course);\n  }\n}","import { push } from 'connected-react-router';\nimport { all, call, fork, put, select, takeLatest } from 'redux-saga/effects';\nimport { format, isSameDay, subDays, addHours, differenceInCalendarDays } from 'date-fns';\n\nimport { ConditionActionType, getFlight, getExtreme, getCondition, getRouteType, switchAirportModalShow, switchConsentAirportArrivalTime, switchIsNoSetTerminalHND, updateSearchedAt, updateDirections, updateTaxiFareSummaries, updateCourse } from '../actions/conditionAction';\nimport { updateErrorMessage, updateTraininfo, switchisLoading, switchIsFailInGetCourses, updateTaxiCompanyConfigurations, randomTmpAdRoatationValue } from '../actions/generalAction';\nimport { getFlightFactory } from '../services/ana/api';\nimport { escapeString, getEkispertAPIFactory } from '../services/ekispert/api';\nimport { getDatalakeFactory, datalakeBusFormat, getDatalakeAllowBusListFactory } from '../services/datalake/api';\nimport { State } from '../reducers';\nimport { ExitToStations } from '../services/ekispert/data/exitToStations';\nimport { Course, TraininfoList, Traininfo, KoboLink, TypeClass, Line } from '../services/ekispert/models';\nimport { Point as PassPoint } from '../services/ekispert/models/passStation';\nimport { AirportsAndStations } from '../services/ekispert/data/airportsAndStations';\nimport { PointType } from '../states/common';\nimport { APIPath, Gcs } from '../ekispert/extreme';\nimport { Lang } from '../states/query';\nimport Ekispert from '../utils/ekispert';\nimport FlightInfo from '../services/ana/models/flightInfo';\nimport { isDisplayJRHokkaidoNorthFreePass } from '../components/ad/common';\nimport ShowJRHookaidoNorthFreePass from '../services/ekispert/data/showJRHokkaidoNorthFreePassList';\nimport JRKyushuReserveLinkData from '../services/jrkyushu/JRKyushuReserveLinkData';\nimport { isMobileOnly } from 'react-device-detect';\nimport { excludedKeikyuStationList, keikyuLineList, tokyoMetroLineList } from '../services/ekispert/data/showTokyoMetroFreePassList';\nimport { isShowTokyoMetroFreePass } from '../services/linktivity/TokyoMetro';\nimport Cookies from 'js-cookie';\nimport Path from '../utils/path';\nimport UseTaxiCourse from '../services/ekispert/models/UseTaxiCourse';\nimport { getLimousineBusDataFactory, ReqTokyoLumousineBusFormat, ResTokyoLimousineBusFormat } from '../services/tokyolimousinebus/api';\nimport Environment from '../utils/environment';\nimport { setIsFast, setIsLeastTransferCount, setIsLowPrice } from '../utils/formatCourse';\nimport { SetUniversalMaaSWalkLinkArgs, setUniversalMaaSWalkLinkFactory } from '../services/universalMaas/util';\nimport { saveDirection } from '../utils/carRoute';\nimport PlaceInfoFactory from '../utils/placeInfoFactory';\nimport { GetDirectionAndFareSamplesResponse } from '../services/taxi/GetDirectionAndFare/models/getFareSamplesParams';\nimport { isArray } from 'underscore';\nimport { getTaxiCompanyConfiguration } from '../services/taxi/GetTaxiMetaInfo';\nimport i18n from '../i18n';\nimport Airlines, { AirlineList } from '../utils/Airlines';\nimport { getPlaneTimetabile } from '../services/ekispert/planeTimetable';\nimport AccessRestriction from '../utils/accessRestrictions';\nimport ReferrerParam from '../utils/referrerParam';\nimport JREEkinet from '../services/jreEkinet';\nimport { ConditionState } from '../states/conditionState';\nimport DateTime from '../utils/dateTime';\n\ninterface selectPointsTyps {\n  train: string[],\n  bus: string[],\n  connection: string[],\n  highway: string[],\n  other: string[],\n  [key: string]: string[]\n}\n\n// 羽田発着国際線でターミナル未決定時にAirportPointを返す\nfunction setHNDIntAirportPoint(isShowViaSection: boolean, hasPriorityAirportBus: boolean, lang: Lang) {\n  // isShowViaSectionフラグが無効の際には当面は第3ターミナルを返す\n  if(!isShowViaSection) {\n    return AirportsAndStations[lang].HND_3\n  }\n  // 空港バス優先の場合は第3ターミナル、そうでなければ第2ターミナルからの経路探索をする。\n  return hasPriorityAirportBus? AirportsAndStations[lang].HND_3: AirportsAndStations[lang].HND_2;\n}\n\n// 羽田発着国際線でターミナル未決定時にAirportTerminalを返す\nfunction setHNDIntAirportTerminal(isShowViaSection: boolean, hasPriorityAirportBus: boolean) {\n  if(!isShowViaSection) {\n    return 'HND_3';\n  }\n  // 空港バス優先の場合は第3ターミナル、そうでなければ第2ターミナルからの経路探索をする。\n  return hasPriorityAirportBus? 'HND_3': 'HND_2';\n}\n\nfunction makeViaList(dep:string, arr:string, userVia:string = \"\"){\n  let point = dep + ':';\n  if(userVia !== \"\"){\n    point += userVia + ':';\n  }\n  point += arr;\n  return point;\n}\n\n/**\n * course中の何番目に空港ターミナルを経由するか該当するかを返す\n * @param course \n * @param isDepartureGuide \n */\nexport function getTargetIdx(course: Course, isDepartureGuide: boolean) {\n  // 途中駅を探索する区間の判別\n  // 徒歩区間以外を使う区間インデックス番号のリストを取得する\n  let nowalk_indexes = course.Route.Line.map((line, index)=>{\n    return (line.Type && line.Type !== 'walk')? index: null;\n  })\n  .filter((line)=>{ return line !== null });\n  // 出発案内では徒歩以外で空港に着く最後の区間、到着案内では最初の区間の途中通過駅を取得する\n  return (isDepartureGuide? nowalk_indexes.slice(-1): nowalk_indexes)[0];\n}\n\n/**\n * 住所情報・位置情報よりランドマークを生成する\n * EWSに直接投げると最寄りにバス停が5件以上ある場合鉄道駅が取れないため\n * マニュアルでランドマークを生成する\n * @param \n */\nfunction* generateLandmark(pointType: string, pointCode: string, pointName: string) {\n  const api = getEkispertAPIFactory();\n  let points;\n  switch(pointType){\n    // 緯度経度の場合\n    case PointType.COORDINATE:\n    case PointType.CURRENT_POSITION:\n      points = yield call(api, {\n        geoPoint: `${pointCode},2000`,\n        gcs: Gcs.Wgs\n      }, APIPath.GeoStation);\n      break;\n    // 住所の場合\n    case PointType.ADDRESS:\n      points = yield call(api, {\n        address: `${pointCode},2000`,\n        gcs: Gcs.Wgs\n      }, APIPath.AddressStation);\n      break;\n    default:\n      return pointCode;\n  }\n  if(!points) {\n    throw new Error('指定した地点の周囲にバス停・駅がありません!')\n  }\n\n  let selectPoints: selectPointsTyps = {\n    train: [],\n    bus: [],\n    connection: [],\n    highway: [],\n    other: []\n  };\n\n  if(!isArray(points)) {\n    points = [points];\n  }\n\n  for(const point of points){\n    let select = false;\n    const type = (typeof point.Station.Type === 'object')? point.Station.Type.text: point.Station.Type;\n    switch(type){\n      case 'train':\n        if(selectPoints.train.length < 2){\n          selectPoints.train.push(point);\n          select = true;\n        }\n        break;\n      case 'bus':\n        if(point.Station.Type.detail.includes('connection') && selectPoints.connection.length < 3) {\n          selectPoints.connection.push(point);\n          select = true;\n        }\n        else if(point.Station.Type.detail.includes('highway') && selectPoints.highway.length < 3) {\n          selectPoints.highway.push(point);\n          select = true;\n        }\n        else if(selectPoints.bus.length < 1){\n          selectPoints.bus.push(point);\n          select = true;\n        }\n        break;\n    }\n    if(!select){\n      selectPoints.other.push(point);\n    }\n  }\n  const searchPoint = Object.keys(selectPoints).reduce((acumlate, key)=>{\n    Array.prototype.push.apply(acumlate, selectPoints[key]);\n    return acumlate;\n  }, []).slice(0, 10);\n  // 地点名に半角ハイフンがあるとランドマーク生成ができなくなるので置換する\n  pointName = pointName.replace(/-/g, 'ー');\n  // 地点生成を行う\n  let pointData = `P-${pointName}-`;\n  // 駅コードを追加する\n  pointData += searchPoint.map((point: any)=>{ return point.Station.code; })+'-';\n  // 所要時間を追加する\n  pointData += searchPoint.map((point: any) => { return Ekispert.getWalkTime(point.Distance); }) + '--';\n  // 交通手段を追加する\n  pointData += searchPoint.map(()=>{ return '徒歩'; })+'--0----';\n  return pointData;\n}\n\n/**\n * 取得した経路から羽田空港第3ターミナルを経由する経路のみを絞り込む。\n * @param courses 取得した経路。\n * @param isDepartureGuide 出発案内であるかを表すフラグ。\n * @param stationList 絞り込む駅のリスト\n * @param lang 取得する言語\n */\nfunction* filterViaStations(courses: Course[], isDepartureGuide: boolean, filterStationList: string[], lang: Lang){\n  const api = getEkispertAPIFactory();\n  const filterCourses: Course[] = [];\n  for(const course of courses){\n    const target_idx = getTargetIdx(course, isDepartureGuide);\n    // 徒歩しかない経路の場合は除外する\n    if(target_idx === null){\n      return;\n    }\n    // 通過駅一覧を取得\n    const params = {\n      serializeData: course.SerializeData,\n      sectionIndex: target_idx+1\n    };\n    const result = yield call(api, params, APIPath.PassStation);\n    // 駅コードの配列に整形\n    const stationList = result.map((point: PassPoint) => { return point.Station.code });\n    // 通過駅に特定の駅を含むか判定\n    for(let station of filterStationList){\n      if(stationList.includes(station)){\n        // 該当する区間に対し、ターミナル経由ありとフラグを立てる\n        course.Route.Line[target_idx].isShowViaTerminal = true;\n        // 経由するターミナルの駅名を取得する\n        const viaStation = result.find((point: PassPoint) => { return point.Station.code === station });\n        // PassStationでは日本語しか取れないので、英語版では英語の駅名を取得する\n        if(lang === Lang.en){\n          const stationLight = yield call(api, {\n            code: viaStation.Station.code,\n            language: 'en'\n          }, APIPath.LightStation);\n          course.Route.Line[target_idx].viaTerminalName = stationLight.Name;\n        } else {\n          course.Route.Line[target_idx].viaTerminalName = viaStation.Station.Name;\n        }\n        course.Route.Line[target_idx].viaTerminalCode = viaStation.Station.code;\n        filterCourses.push(course);\n        break;\n      }\n    }\n  }\n  return filterCourses;\n}\n\n/**\n * 路線の種別(国内線か国際線)を取得する。\n */\nfunction* runGetRouteType(action: ReturnType<typeof getRouteType.start>) {\n  const { flightNumber } = action.payload;\n  // StoreからStateを取得する。\n  const state: State = yield select();\n  /** 航空会社コード。 */\n  const airlineCode = state.condition.targetAirLine;\n  try {\n    yield put(switchisLoading(true));\n    // ANA APIから運行情報を取得する。\n    const api = getFlightFactory();\n    /** 運航情報を取得する際のオプション。 */\n    // (インクリメンタルサーチモードでリクエストする。)\n    const flightOptionsInIncremental = {\n      isIncrementalSearch: true,\n      language: state.condition.query.lang,\n      airline: airlineCode,\n    }\n    const flight = yield call(api, flightNumber, state.condition.date, flightOptionsInIncremental, state.condition.targetAirLine);\n\n    yield put(getRouteType.succeed({ flightNumber }, flight));\n  } catch (error) {\n    yield put(getRouteType.fail({ flightNumber }, error));\n    yield put(switchisLoading(false));\n  }\n}\n\n// ANA→駅すぱあとの順でAPIを叩く。\nfunction* runGetFlight(action: ReturnType<typeof getFlight.start>) {\n  const { flightNumber } = action.payload;\n  // StoreからStateを取得する。\n  const state: State = yield select();\n\n  try {\n    yield put(switchisLoading(true));\n    // ANA APIから運行情報を取得する。\n    const api = getFlightFactory();\n    // クエリとユーザー入力の登場便が同一でないならばクエリは使用しない\n    // クエリとユーザ入力の日付が同一でなければクエリは使用しない\n    const query = state.condition.query;\n    const queryDate = state.condition.isDepartureGuide? query.std: query.sta;\n    const isReferenceQuery = (state.condition.flight === query.flightNumber) &&\n                             (queryDate && isSameDay(state.condition.date, queryDate));\n    // クエリで指定された定刻の出発日時を参照する。(クエリがない場合はフォーム上で指定された日付を参照する。)\n    const std = state.condition.query.std ? state.condition.query.std : state.condition.date;\n    // クエリで指定された定刻の到着日時を参照する。(クエリがない場合はフォーム上で指定された日付を参照する。)\n    const sta = state.condition.query.sta ? state.condition.query.sta : state.condition.date;\n    // フォーム上で指定した日付。\n    const date = state.condition.date;\n    /** 言語設定。 */\n    const lang = state.condition.query.lang;\n    /** 対象となるエアライン */\n    const targetAirline = state.condition.targetAirLine;\n    let isAbleFlightInfo = Airlines.isAbleToGetFlightInfo(targetAirline);\n    // ANA APIにリクエストする搭乗日を設定する。\n    // クエリを参照可能な場合、かつ、クエリの定刻の出発日付と到着日付を比較し、異なる日付の場合は出発日時の日付を指定する。\n    // (ANA APIの日付の基準は搭乗便の出発日であるため。)\n    // (※バグ対応のために急いで直した部分のため、あとで見直す。2020/03/27現在。)\n    const boardingDate = (isReferenceQuery && !isSameDay(std, sta)) ? std : date;\n    /** 航空会社コード。 */\n    const airlineCode = Airlines.getAirlineCode(targetAirline);\n    /** 運航情報を取得する際のオプション。 */\n    const flightOptions = {\n      language: lang,\n      airline: airlineCode,\n    }\n    /** 遷移元リファラー */\n    const referrer = state.condition.query.referrer;\n    /** 空港HPから遷移してきたか */\n    const isFromAirportSite = ReferrerParam.isAirportSite(referrer);\n    // 運行情報APIに対応している事業者(ANA)の場合には運行情報APIにアクセスする\n    // TODO: let flight: FlightInfo で型を定義するとエラーになるので対応したい\n    let flight = isAbleFlightInfo?\n      yield call(api, state.condition.flightNumber, boardingDate, flightOptions, state.condition.targetAirLine):\n      yield call(getPlaneTimetabile, state.condition.query.fromAirportCode, state.condition.query.toAirportCode, boardingDate, state.condition.query.flightNumber, state.condition.targetAirLine);\n    // 運行情報APIから情報が取れず、かつ空港HPから遷移の場合には結果を表示しない\n    if(flight.errorMessage !== '' && isFromAirportSite) {\n      isAbleFlightInfo = false;\n      flight = yield call(getPlaneTimetabile, state.condition.query.fromAirportCode, state.condition.query.toAirportCode, boardingDate, state.condition.query.flightNumber, state.condition.targetAirLine);\n    }\n    // 空港HPから遷移してきた場合\n    if(isFromAirportSite) {\n      // 設定した日付が一昨日以前の場合には経路検索を出来ないようにする\n      const now = new Date();\n      const diffDay = differenceInCalendarDays(date, now);\n      if(diffDay < -1) {\n        throw new Error('一昨日以前の日付がセットされた場合には検索が出来ないように制御をしています。(AM-684)');\n      }\n    }\n    // 到着案内かつクエリで定刻の日時が指定されていない場合、フォーム上で指定された日付とANA APIレスポンスの定刻の到着日付が一致しているかをチェックする。\n    if (!state.condition.isDepartureGuide && !isAbleFlightInfo) {\n      // 到着日付が一致しているかを表すフラグを更新する。\n      flight.setIsDifferentArrivalDate(date);\n      // 日付が一致していない場合は1日前にして再リクエストする。\n      if (flight.isDifferentArrivalDate && !isReferenceQuery) {\n        // 日付を1日前にする。\n        const reRequestDate = subDays(date, 1);\n        // ANA APIに再リクエストする。\n        flight = yield call(api, state.condition.flightNumber, reRequestDate, flightOptions);\n        // フォーム上で指定された日付とANA APIレスポンスの定刻の到着日付が一致しているかをチェックする。\n        flight.setIsDifferentArrivalDate(date);\n        // 1日前の運航情報を取得しても到着日の日付がフォーム上の日付と一致しなかった場合、空の運航情報を返す。\n        if (flight.isDifferentArrivalDate) { flight = new FlightInfo(); }\n      }\n    }\n\n    // ANAか特定航空会社の場合にはクエリより情報を取得する\n    if(isAbleFlightInfo || Airlines.isNotGetTimeTablePlane(targetAirline)) {\n      if(Airlines.isNotGetTimeTablePlane(targetAirline)) {\n        // 特定航空会社の場合には国内線判定に固定します\n        flight.isDomestic = true;\n      }\n      if(isReferenceQuery) {\n        // 日付が変更されていない場合、クエリより情報を更新する\n        flight.updateByQuery(query);\n      }\n    }\n    // 運行情報を取得できない航空会社の場合、日付を変えた場合でも発着空港だけは変更する\n    // ANA・IBEX便でも広島空港HPから遷移した際には発着空港だけクエリから更新する\n    else {\n      flight.updatePartialQuery(query, state.condition.flight)\n    }\n    flight.updateHNDTerminalBySFJ();\n    flight.statusCheck();\n    if(flight.errorMessage !== '') {\n      // 現在アプリケーション上で開いているパスの文字列を取得する。\n      const pathName = state.router.location.pathname;\n      /** 国内・国際判定を行う */\n      const isDomestic = isDomesticFlight(state.condition, pathName);\n      flight.setIsDomestic(isDomestic);\n    }\n    // 注意モーダルを出す大規模ターミナルリスト\n    const hugeAirportCode = ['HND', 'NRT', 'ITM', 'KIX', 'NGO', 'CTS', 'FUK', 'OKA', 'TYO', 'SPK'];\n    // 空港到着時間の同意モーダルを出すか判定する\n    const isShowAirportModal = () => {\n      // 結果画面またはサマリーリスト画面でのリロードの場合は同意モーダルを表示するフラグをオンにしない。\n      if((!Path.isResult(state.router.location.pathname) && !Path.isSummary(state.router.location.pathname)) &&\n        !state.condition.consentAirportArrivalTime) {\n        // 以下の条件を満たす場合\n        // 1. 出発案内である\n        // 2. 空港到着時間を30分に固定させている\n        // 3. 利用者が空港到着画面モーダルに同意していない\n        // 4. 搭乗便が大規模ターミナルを有する空港を出発空港に指定している\n        if(state.condition.isDepartureGuide &&\n          state.condition.arrivalTimeToAirport === 30 &&\n          !state.condition.consentAirportArrivalTime &&\n          hugeAirportCode.includes(flight.depAirportCode)\n        ) {\n          return true;\n        }\n        // ピーチコードシェア便を選択している場合\n        else if(Airlines.isShowSearchNoticeModal(targetAirline)) {\n          return true;\n        }\n        // 春秋航空を利用する場合\n        else if(targetAirline === 'SJO') {\n          return true;\n        }\n      }\n      return false;\n    }\n    // 空港到着時間で同意が必要か\n    if( isShowAirportModal() ) {\n      yield put(switchAirportModalShow(true));\n      return;\n    } else {\n      yield put(switchAirportModalShow(false));\n    }\n    yield put(getFlight.succeed({ flightNumber }, flight));\n  } catch (error) {\n    // dev環境のみエラーログを出力\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n      // エラー発生時はdebugレベルでのみログを出力する\n      console.debug(error)\n    }\n    yield put(updateErrorMessage('no_get_flight'));\n    // エラー発生時は承諾フラグをリセットする\n    yield put(switchConsentAirportArrivalTime(false));\n    yield put(getFlight.fail({ flightNumber }, error));\n    yield put(switchisLoading(false));\n  }\n}\n\n/**\n * 探索条件詳細を取得する。\n * @param action \n */\nfunction* runGetCondition() {\n  // StoreからStateを取得する。\n  const state: State = yield select();\n  const options = {\n    shinkansen: state.condition.isEnabledShinkansen ? 'normal' : 'never',\n    limitedExpress: state.condition.isEnabledLimitedExpress ? 'normal' : 'never',\n    ticketSystemType: state.condition.isEnabledIc ? 'ic' : 'normal',\n    preferredTicketOrder: state.condition.isEnabledIc ? 'ic' : 'none',\n    // 空路は常に利用しない。\n    plane: 'never',\n  }\n\n  try {\n    const api = getEkispertAPIFactory();\n    const condtions = yield call(api, options, APIPath.Condition);\n\n    yield put(getCondition.succeed({},  condtions));\n  } catch (error) {\n    yield put(getCondition.fail({}, error));\n    yield put(switchisLoading(false));\n  }\n}\n\n/**\n * タクシーメタデータを取得する\n */\nfunction* runGetTaxiCompanyConfigurations() {\n  const params = {\n    key: 'company_configuration',\n    language: i18n.language\n  }\n  try {\n    const response = yield call(getTaxiCompanyConfiguration, params);\n    if(response.body) {\n      yield put(updateTaxiCompanyConfigurations(response.body))\n    }\n    else {\n      throw new Error('company_configuration response.body is undefined')\n    }\n  }\n  catch(e) {\n    const env: string = process.env['REACT_APP_STAGE_ENV'] || '';\n    if(Environment.isDev(env)) {\n      console.error(e);\n    }\n  }\n}\n\n/**\n * レスキューナウより運行情報を取得する\n */\nfunction* runGetTrainInfo() {\n  const api = getEkispertAPIFactory();\n  const response = yield call(api, {}, APIPath.TrainInfo);\n  // 検索処理を実行中であるかを表すフラグをtrueにする。\n  yield put(switchisLoading(true));\n  try {\n    // 扱いやすい形式に変換する\n    let traininfoList:TraininfoList = {};\n    const informations: Traininfo[] = response.Information;\n    for(const info of informations) {\n      traininfoList[info.Line.code] = info;\n    }\n    yield put(updateTraininfo(traininfoList));\n  }\n  catch(e) {\n    const env: string = process.env['REACT_APP_STAGE_ENV'] || '';\n    if(Environment.isDev(env)) {\n      console.error(e);\n    }\n  } finally {\n    // 最後にかならず検索処理を実行中であるかを表すフラグをtrueにする。\n    yield put(switchisLoading(false));\n  }\n}\n\n/**\n * 駅すぱあとAPIから経路を取得する。\n */\nfunction * runGetExtreme() {\n  // StoreからStateを取得する。\n  const state: State = yield select();\n  // 探索条件を取得する。\n  const condition = state.condition;\n  const general = state.general;\n  // 最大表示経路数\n  const SHOW_LIMIT_COURSE_NUM = 5;\n  // 羽田国際線使用時にターミナル未決定時には第3ターミナルを固定で使用するかのフラグ\n  const isShowViaSection: boolean = process.env['REACT_APP_IS_SHOW_VIA_SECTION'] === 'true';\n  // 検索処理を実行中であるかを表すフラグをtrueにする。\n  // (実行完了時は「getExtreme.succeed」または「getExtreme.fail」の部分でフラグが更新されるため、\n  //   経路取得のこの関数内では完了時のフラグ更新はしない。)\n  yield put(switchisLoading(true));\n  // 経路取得に失敗したフラグを初期化する\n  yield put(switchIsFailInGetCourses(false));\n  // 経路検索開始前に前回のキャッシュを削除する\n  // 経路情報を削除する\n  yield put(updateDirections(null));\n  // タクシー料金情報を削除する\n  yield put(updateTaxiFareSummaries([]));\n  // 経路情報を削除する\n  yield put(updateCourse([]));\n\n  try {\n    // 駅コード・緯度経度・住所のいずれかが取得できなかった場合、エラーとする。\n    if (condition.pointCode === '') { throw Error('no_get_place'); }\n    const api = getEkispertAPIFactory();\n\n    const isDepartureGuide = condition.isDepartureGuide;\n    // 空港到着時間\n    const arrivalTimeToAirport = condition.arrivalTimeToAirport;\n    const place = state.condition.place;\n\n    // 取得した航空便の時刻を元に検索日時を取得する。\n    // (出発案内の場合は、ユーザーが指定した空港到着時間を加味した時刻を取得する。2020/01/22現在。)\n    const searchDate = isDepartureGuide ? condition.flightStatus.getSearchTime(state.condition.isDepartureGuide, condition.arrivalTimeToAirport) : condition.flightStatus.getSearchTime(state.condition.isDepartureGuide);\n    // 国内線であるかを判別するフラグ。\n    const isDomestic = state.condition.flightStatus.isDomestic;\n    const flight = state.condition.flightStatus;\n    const lang = state.condition.query.lang;\n    // 空港バス優先のフラグ。\n    const hasPriorityAirportBus = state.condition.hasPriorityAirportBus;\n    /** 対象となるエアライン */\n    const targetAirline = state.condition.targetAirLine;\n\n    const airportCode = isDepartureGuide ? flight.depAirportCode : flight.arrAirportCode;\n    const airportName = isDepartureGuide ? flight.depAirportName : flight.arrAirportName;\n    let airportPoint = '';\n    /** ターミナルが未設定であることを表すフラグ。\n     * (現状、羽田空港の国際線でのみ利用する。2020/03/04現在。)\n     */\n    let isNotSetTerminal = false;\n    // 欠航の場合はエラーを出す\n    if(flight.isCanceled()){\n      throw new Error(\"欠航の恐れがあります。\");\n    }\n\n    let airportPointAndTerminal = getAirportPointAndTerminal(isDomestic, flight, lang, hasPriorityAirportBus, isDepartureGuide);\n    airportPoint = airportPointAndTerminal.airportPoint;\n    isNotSetTerminal = airportPointAndTerminal.isNotSetTerminal;\n    // 出発案内の場合。\n    if (isDepartureGuide) {\n      switch (airportCode) {\n        case 'SPK':\n        case 'CTS':\n          // 国内線・国際線とバス停が異なるため分ける。\n          airportPoint = isDomestic ? AirportsAndStations[lang].CTS_DOM : AirportsAndStations[lang].CTS_INT;\n          break;\n        // 羽田の場合は国際線であるかとターミナル名を見る。\n        case 'HND':\n          // 使用ターミナルを名称等から確定させる\n          const HNDTerminal = flight.getHNDTerminal(isDepartureGuide);\n          switch(HNDTerminal) {\n            // 第一ターミナルの場合\n            case 1:\n              airportPoint = AirportsAndStations[lang].HND_1;\n              break;\n            // 第二ターミナルの場合\n            case 2:\n              airportPoint = AirportsAndStations[lang].HND_2;\n              break;\n            // 第三ターミナルの場合\n            case 3:\n              airportPoint = AirportsAndStations[lang].HND_3;\n              break;\n            // 第二ターミナル・第三ターミナル未確定の場合\n            case \"2_3\":\n              // 出発ターミナルが未確定の場合\n              // AWS経由の場合に出発ターミナルが未確定の場合にはクエリに「2/3」と渡される\n              // 空港バス優先の場合は第3ターミナル、そうでなければ第2ターミナルからの経路探索をする。\n              airportPoint = setHNDIntAirportPoint(isShowViaSection, hasPriorityAirportBus, lang);\n              // ターミナルが未確定であるフラグを立てる。\n              isNotSetTerminal = true;\n              break;\n          }\n          break;\n        // 成田空港の場合\n        case 'NRT':\n          // 成田空港の場合、第三ターミナルの場合を想定する\n          if(flight.getNRTTerminal(isDepartureGuide) === 3 && Airlines.isUseNRTThirdTerminal(targetAirline)) {\n            airportPoint = AirportsAndStations[lang].NRT_3;\n          }\n          else {\n            airportPoint = AirportsAndStations[lang].NRT;\n          }\n        // 東京エリア(羽田・成田共用)の空港コードの場合。\n        case 'TYO':\n          if (airportName.includes('Haneda')) {\n            // 出発ターミナル名が第1ターミナルの場合。\n            if (flight.depTerminal.includes('第1ターミナル') || flight.depTerminal.includes('Terminal 1') || flight.depTerminal === '1') {\n              // 搭乗口情報が存在し、第1ターミナルの文字列が含まれていた場合のみ、第1ターミナルの地点を取得する。\n              airportPoint = AirportsAndStations[lang].HND_1;\n            } else {\n              airportPoint = AirportsAndStations[lang].HND_2;\n            }\n          } else if (airportName.includes('Narita')) {\n            // 成田空港の場合、第三ターミナルの場合を想定する\n            if(flight.getNRTTerminal(isDepartureGuide) === 3) {\n              airportPoint = AirportsAndStations[lang].NRT_3;\n            }\n            else {\n              airportPoint = AirportsAndStations[lang].NRT;\n            }\n          }\n          break;\n        // 福岡空港の場合、国際線・国内線(北・南)で地点を分ける。\n        case 'FUK':\n          // 国内線の場合。\n          if (isDomestic) {\n            // ターミナル情報がANA APIから取得できる日付ではない場合。\n            if (!flight.isAvalableOperationInfo(isDepartureGuide)) {\n              airportPoint = AirportsAndStations[lang].FUK_DOM;\n            // ANA APIの保安検査場名に北が含まれる場合。\n            } else if (flight.securtyCheckPoint.includes('北') || flight.securtyCheckPoint.includes('North')) {\n              airportPoint = AirportsAndStations[lang].FUK_DOM_NORTH;\n            // ANA APIの保安検査場に南が含まれる場合。\n            } else if (flight.securtyCheckPoint.includes('南') || flight.securtyCheckPoint.includes('South')) {\n              airportPoint = AirportsAndStations[lang].FUK_DOM_SOUTH;\n            // 未設定の場合。\n            } else {\n              airportPoint = AirportsAndStations[lang].FUK_DOM;\n            }\n          // 国際線の場合。\n          } else {\n            airportPoint = AirportsAndStations[lang].FUK_INT;\n          }\n          break;\n        // 那覇空港の場合、国際線・国内線で分ける\n        case 'OKA':\n          // 国内線の場合。\n          if (isDomestic) {\n            airportPoint = AirportsAndStations[lang].OKA_DOM;\n          } else {\n            airportPoint = AirportsAndStations[lang].OKA_INT;\n          }\n          break;\n        default:\n          // その他の空港はデフォルトの地点情報で探索する。\n          airportPoint = AirportsAndStations[lang][airportCode];\n          break;\n      }\n    // 到着案内の場合。\n    } else {\n      switch (airportCode) {\n        case 'SPK':\n        case 'CTS':\n          // 新千歳空港の場合、国内線・国際線とバス停が異なるため分ける。\n          airportPoint = isDomestic ? ExitToStations[lang].CTS_DOM : ExitToStations[lang].CTS_INT;\n          break;\n        // 羽田の場合は国際線であるかとターミナル名を見る。\n        case 'HND':\n          // 使用ターミナルを名称等から確定させる\n          const HNDTerminal = flight.getHNDTerminal(isDepartureGuide);\n          switch(HNDTerminal) {\n            // 第一ターミナルの場合\n            case 1:\n              airportPoint = AirportsAndStations[lang].HND_1;\n              break;\n            // 第二ターミナルの場合\n            case 2:\n              airportPoint = AirportsAndStations[lang].HND_2;\n              break;\n            // 第三ターミナルの場合\n            case 3:\n              airportPoint = AirportsAndStations[lang].HND_3;\n            // 第二ターミナル・第三ターミナル未確定の場合\n            case \"2_3\":\n              // 出発ターミナルが未確定の場合\n              // AWS経由の場合に出発ターミナルが未確定の場合にはクエリに「2/3」と渡される\n\n              // 空港バス優先の場合は第3ターミナル、そうでなければ第2ターミナルからの経路探索をする。\n              airportPoint = setHNDIntAirportPoint(isShowViaSection, hasPriorityAirportBus, lang);\n              // ターミナルが未確定であるフラグを立てる。\n              isNotSetTerminal = true;\n              break;\n          }\n          break;\n        // 成田空港の場合\n        case 'NRT':\n          // 成田空港の場合、第三ターミナルの場合を想定する\n          if(flight.getNRTTerminal(isDepartureGuide) === 3) {\n            airportPoint = ExitToStations[lang].NRT_3;\n          }\n          else {\n            airportPoint = ExitToStations[lang].NRT;\n          }\n        // 東京エリア(羽田・成田共用)の空港コードの場合。(英語版のみ返ってくることがある。)\n        case 'TYO':\n          // 空港名に「Haneda」が含まれる場合。\n          if (airportName.includes('Haneda')) {\n            // 国内線の場合は第1・第2ターミナルかで分ける。\n            if (isDomestic) {\n              // ターミナル名は搭乗口情報に第1ターミナルの場合のみ含まれる。\n              if (flight.arrTerminal.includes('第1ターミナル') || flight.arrTerminal.includes('Terminal 1') || flight.arrTerminal === '1') {\n                // 搭乗口情報が存在し、第1ターミナルの文字列が含まれていた場合のみ、第1ターミナルの地点を取得する。\n                airportPoint = ExitToStations[lang].HND_1;\n              } else {\n                // 第2ターミナルの地点を取得する。\n                airportPoint = ExitToStations[lang].HND_2;\n              }\n            // 国際線の場合は保安検査場までの案内とする。\n            } else {\n              airportPoint = ExitToStations[lang].HND_3;\n            }\n          // 空港名に「Narita」が含まれる場合。\n          } else if (airportName.includes('Narita')) {\n            // 成田空港の場合、第三ターミナルの場合を想定する\n            if(flight.getNRTTerminal(isDepartureGuide) === 3) {\n              airportPoint = ExitToStations[lang].NRT_3;\n            }\n            else {\n              airportPoint = ExitToStations[lang].NRT;\n            }\n          }\n          break;\n        // 福岡空港の場合、国内線の南北ターミナル、国際線ターミナルに振り分ける。\n        case 'FUK':\n          // 国内線の場合。\n          if (isDomestic) {\n            // ターミナル情報がANA APIから取得できる日付ではない場合。\n            if (!flight.isAvalableOperationInfo(isDepartureGuide)) {\n              airportPoint = ExitToStations[lang].FUK_DOM;\n            // ANA APIの到着ターミナル名に北が含まれる場合。\n            } else if (flight.arrTerminal.includes('北') || flight.arrTerminal.includes('North')) {\n              airportPoint = ExitToStations[lang].FUK_DOM_NORTH;\n            // ANA APIの到着ターミナル名に南が含まれる場合。\n            } else if (flight.arrTerminal.includes('南') || flight.arrTerminal.includes('South')) {\n              airportPoint = ExitToStations[lang].FUK_DOM_SOUTH;\n            // ANA APIの到着ターミナル名に北・南いずれも含まれない場合。\n            } else {\n              airportPoint = ExitToStations[lang].FUK_DOM;\n            }\n          // 国際線の場合。\n          } else {\n            airportPoint = ExitToStations[lang].FUK_INT;\n          }\n          break;\n      // 那覇空港の場合、国際線・国内線で分ける\n      case 'OKA':\n        // 国内線の場合。\n        if (isDomestic) {\n          airportPoint = AirportsAndStations[lang].OKA_DOM;\n        } else {\n          airportPoint = AirportsAndStations[lang].OKA_INT;\n        }\n        break;\n        default:\n          // その他の空港はデフォルトの地点情報で探索する。\n          airportPoint = ExitToStations[lang][airportCode];\n          break;\n      }\n    }\n\n    let courses = [];\n    let point: string = '';\n    try {\n      let setPointCode = condition.pointCode;\n      // Typeが駅以外の時はマニュアルでランドマークを作成\n      if(condition.pointType !== PointType.STATION) {\n        // 「レクー沖縄北谷スパ&リゾート」のように半角の「&」が入っているとエラーになるのでエスケープ処理をする\n        const setPointName = escapeString(condition.point);\n        setPointCode = yield generateLandmark(condition.pointType, condition.pointCode, setPointName);\n      }\n      // 出発案内か到着案内かで地点を切り替える。\n      // 経由がある場合は追加する。\n      point = isDepartureGuide ?\n      makeViaList(setPointCode, airportPoint, condition.viaCode):\n      makeViaList(airportPoint, setPointCode, condition.viaCode);\n      // 羽田国際線発着でターミナルが未確定の場合は経路を8件取得する。\n      const answerCount = isNotSetTerminal ? 8 : SHOW_LIMIT_COURSE_NUM;\n      const interruptTransferStations = state.general.interruptTransfer.outbound.interruptTransferStations;\n      // 乗換回避の駅が指定されている場合の経路取得の処理。\n      if (interruptTransferStations.length > 0) {\n        /** 乗換回避の駅情報から駅コードのみの配列にしたもの。 */\n        const interruptTransferStationCodes = interruptTransferStations.map((i) => i.code);\n        const params = {\n          viaList: point,\n          date: DateTime.JSTFormat(searchDate, 'yyyyMMdd'),\n          time: DateTime.JSTFormat(searchDate, 'HHmm'),\n          searchType: isDepartureGuide ? 'arrival' : 'departure',\n          conditionDetail: state.condition.conditionDetail,\n          gcs: 'wgs84',\n          // クエリに応じて取得する経路の言語(英語・日本語)を切り替える。\n          language: state.condition.query.lang === 'en' ? 'en' : 'ja',\n          answerCount: answerCount,\n          addStopStation: true,\n          interruptTransferStationCodeList: interruptTransferStationCodes.join(':'),\n        }\n        courses = yield call(api, params, APIPath.Extreme);\n      // 乗換回避の駅が指定されていない場合の経路取得の処理。\n      } else {\n        const params = {\n          viaList: point,\n          date: DateTime.JSTFormat(searchDate, 'yyyyMMdd'),\n          time: DateTime.JSTFormat(searchDate, 'HHmm'),\n          searchType: isDepartureGuide ? 'arrival' : 'departure',\n          conditionDetail: state.condition.conditionDetail,\n          gcs: 'wgs84',\n          // クエリに応じて取得する経路の言語(英語・日本語)を切り替える。\n          language: state.condition.query.lang === 'en' ? 'en' : 'ja',\n          answerCount: answerCount,\n          addStopStation: true\n        };\n        courses = yield call(api, params, APIPath.Extreme);\n      }\n    }\n    catch(e) {\n      // dev環境のみエラーログを出力\n      if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n        console.debug(e);\n      }\n    }\n\n    // 取得したレスポンスがundefinedではない場合に、レスポンスの値を代入する。\n    if (typeof courses !== undefined) {\n      const airportCode = isDepartureGuide? state.condition.flightStatus.depAirportCode: state.condition.flightStatus.arrAirportCode;\n      const arrDate = state.condition.flightStatus.getFlightTimeDate(false);\n      // 取得した経路が配列の場合はそのまま、オブジェクトの場合は配列にはめる。\n      courses = (courses instanceof Array) ? courses : [courses];\n\n      // 空港バス優先モードのフラグ。\n      const hasPriorityAirportBus = state.condition.hasPriorityAirportBus;\n      // 羽田空港国際線を利用した着検索の時は、第2ターミナル・第3ターミナル両方が経由に含まれているか確かめる。\n      if(isNotSetTerminal) {\n        // 羽田国際線発着でターミナルが未確定のフラグをReduxに格納する\n        yield put(switchIsNoSetTerminalHND(true));\n        let filterStationList = [];\n        // ターミナルが未確定で、空港バス優先モードの場合は第2ターミナルを経由する経路のみに絞り込む。\n        if(hasPriorityAirportBus){\n          filterStationList = ['29510', '22911', '29512', '52106'];\n        } else {\n          // ターミナルが未確定で、空港バス優先モードではない場合は第3ターミナルを経由する経路のみに絞り込む。\n          filterStationList = ['29672', '305577', '51650', '29671'];\n        }\n        courses = yield filterViaStations(courses, isDepartureGuide, filterStationList, condition.query.lang);\n      } else {\n        yield put(switchIsNoSetTerminalHND(false));\n      }\n\n      // 取得した発着地の名称が空になっている場合は、Redux上で保持している発着地名称を配列に追加する。\n      // (発着地に英語の地点名を選択した場合、駅すぱあとの経路探索を実行すると発着地の名称が空になってしまうため。)\n      courses.map((course: any) => {\n        if(Object.keys(course.Route.Point[0]).length === 0 ){\n          course.Route.Point[0] = {\n            Name: condition.point\n          };\n        }\n        if(Object.keys(course.Route.Point.slice(-1)[0]).length === 0 ) {\n          const idx = course.Route.Point.length;\n          course.Route.Point[idx] = {\n            Name: condition.point\n          };\n        }\n        return null;\n      });\n\n      try {\n        if(!place) {\n          throw new Error('Place情報が見つかりませんでした。');\n        }\n        // タクシーを使用した場合の出発・目的地から空港までの道のりを GoogleDirectionsAPI で求める\n        // TODO: 駅すぱあとの検索とは関係ないため、この部分だけ別の関数に切り分ける\n        const taxiDirectionAndFare: GetDirectionAndFareSamplesResponse = yield saveDirection(isDepartureGuide, arrivalTimeToAirport, place, flight, lang, targetAirline);\n        // GoogleDirectionAPIのResponseだけを抽出する\n        const texiDirection = taxiDirectionAndFare.directionsApiResponse;\n        // タクシー連携をするか\n        const hasTaxiCourse = texiDirection.status === 'OK';\n        if(hasTaxiCourse) {\n          yield put(updateDirections(texiDirection));\n          // タクシーの料金情報がある場合にはReduxに入れ込む\n          if(taxiDirectionAndFare.existMatchedCompany && taxiDirectionAndFare.fareSummaries?.length > 0) {\n            yield put(updateTaxiFareSummaries(taxiDirectionAndFare.fareSummaries));\n          }\n        }\n        const filterCourseNum = SHOW_LIMIT_COURSE_NUM;\n\n        // 5件以上残った場合、先頭5件のみを表示する\n        // タクシー連携をする場合には先頭5件に追加してタクシー経路が1件入る\n        courses = courses.slice(0, filterCourseNum);\n\n        // 空港バス優先モードが設定されている場合、経路を並び替える。\n        if (state.condition.hasPriorityAirportBus) {\n          courses = sortByAirportBus(courses);\n        }\n        // タクシー連携をする際にはCourseの先頭か末尾にタクシー経路を入れ込む\n        if(texiDirection && condition.place && hasTaxiCourse) {\n          const hasPriorityCar = state.condition.hasPriorityCar;\n          /** 対象となるエアライン */\n          const targetAirline = state.condition.targetAirLine;\n          const arrivalTimeToAirport = UseTaxiCourse.getArrivalTimeToAirport(state.condition.arrivalTimeToAirport, state.condition.isDomestic, targetAirline);\n          const taxiCourse = new UseTaxiCourse(\n            texiDirection,\n            state.condition.flightStatus,\n            isDepartureGuide,\n            arrivalTimeToAirport,\n            condition.point,\n            lang,\n            taxiDirectionAndFare.routeInfo\n          );\n          // タクシー優先の場合には1番目の経路に入れる\n          if(hasPriorityCar) {\n            courses.unshift(taxiCourse);\n          }\n          else {\n            courses.push(taxiCourse);\n          }\n        }\n      } catch(e) {\n        // 情報が取れない場合にはタクシー料金情報を削除する\n        yield put(updateTaxiFareSummaries([]));\n        // dev環境のみエラーログを出力\n        if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n          console.error(e);\n        }\n      }\n\n      // 結果が0件の場合にはエラーを表示する\n      if(courses.length === 0){\n        throw new Error('経路が見つかりませんでした。');\n      }\n\n      // 各コースで表示される番号ラベルをセットする\n      let idx = 0;\n      courses = courses.map((course: Course)=>{\n        course.displayIndex = course.isTaxi? 'taxi': String(++idx);\n        return course;\n      })\n\n      // 各コースの「早・安・楽」フラグをつける\n      courses = setFlags(courses);\n\n      /** 遷移元リファラー */\n      const referrer = state.condition.query.referrer;\n      /** 各種空港HPから遷移してきたか */\n      const isAirportSiteTransit = ReferrerParam.isAirportSite(referrer);\n      // 日本語版のみDatalake関連のAPIにアクセスする\n      if(state.condition.query.lang === Lang.ja) {\n        try {\n          // 許可しているバス路線の一覧を取得する\n          const datalakeAllowBusListAPI = getDatalakeAllowBusListFactory();\n          const AllowBusLineCode = yield call(datalakeAllowBusListAPI);\n\n          // Datalakeに投げるためのバス情報を抽出する\n          // TODO: 取得した結果をReduxに格納する\n          const throwDatalakeBusData = extractionDatalakeBusData(AllowBusLineCode, courses);\n\n          if(throwDatalakeBusData.length > 0) {\n            // Datalakeからバス情報を取得する\n            const datalakeApi = getDatalakeFactory();\n            const responseDatalakeData = yield call(datalakeApi, throwDatalakeBusData);\n            const datalakeData = responseDatalakeData.data.body;\n            // Datalakeの結果情報を元に、連携先のURLをcoursesに埋め込む\n            courses = setKoboLink(courses, datalakeData);\n          }\n        } catch(e) {\n          // dev環境のみエラーログを出力\n          if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n            console.error(e);\n          }\n        }\n        try {\n          // UniversalMaaS徒歩リンク作成\n          const universalMaasAPI = setUniversalMaaSWalkLinkFactory();\n          // Redux-sagaのcallは引数を1つしか指定できないため、3つの引数を1つのオブジェクトにまとめて渡している\n          const setUniversalMaaSWalkLinkArgs: SetUniversalMaaSWalkLinkArgs = {\n            courses: courses,\n            isDepartureGuide: isDepartureGuide,\n            place: place\n          };\n          courses = yield call(universalMaasAPI, setUniversalMaaSWalkLinkArgs);\n        }\n        catch(e) {\n          // dev環境のみエラーログを出力\n          if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n            console.error(e);\n          }\n        }\n      }\n      // 東京リムジンバスの運行情報と対応表より停留所コード・エリアコードを取得する\n      try {\n        // リムジンバスAPIに問い合わせるリクエストデータを抽出する\n        const throwTokyoLimousineBusData = extractionTokyoLimousineBusDataCourses(courses);\n        // バックエンドに問い合わせる件数が1件以上の場合のみ問い合わせをする\n        if(throwTokyoLimousineBusData.length > 0) {\n          const limousineBusDataAPI = getLimousineBusDataFactory();\n          // リムジンバスAPIに運行情報と対応するバス停コード・エリアコードを問い合わせる\n          const limousineBusData: ResTokyoLimousineBusFormat[] = yield call(limousineBusDataAPI, throwTokyoLimousineBusData);\n          courses = setTokyoLimousineBusLink(courses, limousineBusData);\n        }\n        // 大阪リムジンバス の判定を行う\n        setOsakaLimousineBusFlag(courses);\n      } catch(e) {\n        // dev環境のみエラーログを出力\n        if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n          console.error(e);\n        }\n      }\n      // ANAきた北海道周遊パス連携を表示するかのフラグを追加する\n      if(isDisplayJRHokkaidoNorthFreePass(isDepartureGuide, airportCode, state.condition.date, state.condition.query.lang)) {\n        courses.forEach((course: Course)=>{\n          course = setShowJRHokkaidoNorthFreePassFlag(course);\n        })\n      }\n      if(isShowTokyoMetroFreePass(isDepartureGuide, airportCode, arrDate, isAirportSiteTransit)) {\n        // 東京メトロフリーパス連携を表示するかのフラグを追加する\n        courses = setShowTokyoMetroFreePass(courses);\n      }\n      // 九州内の空港を発着する場合のみJR九州のリンクを表示する\n      if(JRKyushuReserveLinkData.isShowLink(airportCode)) {\n        // JR九州列車連携リンクのフラグを追加し、リンク用パラメーターを構築する\n        courses.forEach((course: Course)=>{\n          course.JRKyushuReserveLinkData = new JRKyushuReserveLinkData(isMobileOnly, lang);\n          // JR九州予約リンク可能区間を探索する\n          course.JRKyushuReserveLinkData.setAll(course);\n        });\n      }\n\n      // えきねっと遷移URLを埋め込む\n      courses.forEach((course: Course) => {\n        JREEkinet.insertJREEkinetURLInCourse(course, lang);\n      });\n\n      // 遅延情報を取得する\n      yield runGetTrainInfo();\n      if(!general.taxiCompanyConfigurations) {\n        // タクシーメタデータを取得する\n        yield runGetTaxiCompanyConfigurations();\n      }\n    }\n\n    // 探索日時を取得・設定する。\n    yield put(updateSearchedAt(new Date()));\n\n    yield put(getExtreme.succeed({viaList: point, gcs: 'wgs84'},  courses));\n  } catch (error) {\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n      console.error(error);\n    }\n    // エラー発生時は承諾フラグをリセットする\n    yield put(switchConsentAirportArrivalTime(false));\n    // 乗換しない駅が設定されていない場合のみ、経路が取得できなかったエラーを検索画面で表示する。\n    // (結果画面で乗換回避の駅を複数選択した際に、経路が存在しなくなり、ブラウザバックで検索画面で戻った時に「経路が見つからなかった」警告を表示させないため。)\n    if(general.interruptTransfer.outbound.interruptTransferStations.length === 0) { yield put(updateErrorMessage('no_get_route')); }\n    yield put(getExtreme.fail({viaList: '', gcs: 'wgs84'}, error));\n    // 経路取得に失敗したフラグをtrueにする。\n    yield put(switchIsFailInGetCourses(true));\n  } finally {\n    // 最後にかならず検索処理を実行中であるかを表すフラグを false にする。\n    yield put(switchisLoading(false));\n  }\n}\n\n/**\n * airportPointとairportTerminalを取得する\n * \n * @return {airportPoint: string, airportTerminal: string , isNotSetTerminal: boolean}\n */\nexport function getAirportPointAndTerminal(isDomestic: boolean, flight: FlightInfo, lang: Lang, hasPriorityAirportBus: boolean, isDepartureGuide: boolean) {\n  const airportCode = isDepartureGuide ? flight.depAirportCode : flight.arrAirportCode;\n  const airportName = isDepartureGuide ? flight.depAirportName : flight.arrAirportName;\n  // 羽田国際線使用時にターミナル未決定時には第3ターミナルを固定で使用するかのフラグ\n  const isShowViaSection: boolean = process.env['REACT_APP_IS_SHOW_VIA_SECTION'] === 'true';\n\n  let airportPoint = '';\n  let airportTerminal = '';\n  let isNotSetTerminal = false;\n\n  // 出発案内の場合。\n  if (isDepartureGuide) {\n    switch (airportCode) {\n      case 'SPK':\n      case 'CTS':\n        // 国内線・国際線とバス停が異なるため分ける。\n        airportPoint = isDomestic ? AirportsAndStations[lang].CTS_DOM : AirportsAndStations[lang].CTS_INT;\n        airportTerminal = isDomestic? 'CTS_DOM': 'CTS_INT';\n        break;\n      // 羽田の場合は国際線であるかとターミナル名を見る。\n      case 'HND':\n        // 使用ターミナルを名称等から確定させる\n        const HNDTerminal = flight.getHNDTerminal(isDepartureGuide);\n        switch(HNDTerminal) {\n          // 第一ターミナルの場合\n          case 1:\n            airportPoint = AirportsAndStations[lang].HND_1;\n            airportTerminal = 'HND_1';\n            break;\n          // 第二ターミナルの場合\n          case 2:\n            airportPoint = AirportsAndStations[lang].HND_2;\n            airportTerminal = 'HND_2';\n            break;\n          // 第三ターミナルの場合\n          case 3:\n            airportPoint = AirportsAndStations[lang].HND_3;\n            airportTerminal = 'HND_3';\n            break;\n          // 第二ターミナル・第三ターミナル未確定の場合\n          case \"2_3\":\n            // 出発ターミナルが未確定の場合\n            // AWS経由の場合に出発ターミナルが未確定の場合にはクエリに「2/3」と渡される\n            // 空港バス優先の場合は第3ターミナル、そうでなければ第2ターミナルからの経路探索をする。\n\n            // 空港バス優先の場合は第3ターミナル、そうでなければ第2ターミナルからの経路探索をする。\n            airportPoint = setHNDIntAirportPoint(isShowViaSection, hasPriorityAirportBus, lang);\n            // 常時第3ターミナル表示フラグか、空港バスを使用する際にはターミナルを第3ターミナルとする\n            airportTerminal = setHNDIntAirportTerminal(isShowViaSection, hasPriorityAirportBus);\n            // ターミナルが未確定であるフラグを立てる。\n            isNotSetTerminal = true;\n            break;\n        }\n        break;\n      // 成田空港の場合\n      case 'NRT':\n        // 成田空港の場合、第三ターミナルの場合を想定する\n        if(flight.getNRTTerminal(isDepartureGuide) === 3) {\n          airportPoint = AirportsAndStations[lang].NRT_3;\n          airportTerminal = 'NRT_3';\n        }\n        else {\n          airportPoint = AirportsAndStations[lang].NRT;\n          airportTerminal = 'NRT';\n        }\n      // 東京エリア(羽田・成田共用)の空港コードの場合。\n      case 'TYO':\n        if (airportName.includes('Haneda')) {\n          // 出発ターミナル名が第1ターミナルの場合。\n          if (flight.depTerminal.includes('第1ターミナル') || flight.depTerminal.includes('Terminal 1') || flight.depTerminal === '1') {\n            // 搭乗口情報が存在し、第1ターミナルの文字列が含まれていた場合のみ、第1ターミナルの地点を取得する。\n            airportPoint = AirportsAndStations[lang].HND_1;\n            airportTerminal = 'HND_1';\n          } else {\n            airportPoint = AirportsAndStations[lang].HND_2;\n            airportTerminal = 'HND_2';\n          }\n        } else if (airportName.includes('Narita')) {\n          // 成田空港の場合、第三ターミナルの場合を想定する\n          if(flight.getNRTTerminal(isDepartureGuide) === 3) {\n            airportPoint = AirportsAndStations[lang].NRT_3;\n            airportTerminal = 'NRT_3';\n          }\n          else {\n            airportPoint = AirportsAndStations[lang].NRT;\n            airportTerminal = 'NRT';\n          }\n        }\n        break;\n      // 福岡空港の場合、国際線・国内線(北・南)で地点を分ける。\n      case 'FUK':\n        // 国内線の場合。\n        if (isDomestic) {\n          // ターミナル情報がANA APIから取得できる日付ではない場合。\n          if (!flight.isAvalableOperationInfo(isDepartureGuide)) {\n            airportPoint = AirportsAndStations[lang].FUK_DOM;\n            airportTerminal = 'FUK_DOM';\n          // ANA APIの保安検査場名に北が含まれる場合。\n          } else if (flight.securtyCheckPoint.includes('北') || flight.securtyCheckPoint.includes('North')) {\n            airportPoint = AirportsAndStations[lang].FUK_DOM_NORTH;\n            airportTerminal = 'FUK_DOM_NORTH';\n          // ANA APIの保安検査場に南が含まれる場合。\n          } else if (flight.securtyCheckPoint.includes('南') || flight.securtyCheckPoint.includes('South')) {\n            airportPoint = AirportsAndStations[lang].FUK_DOM_SOUTH;\n            airportTerminal = 'FUK_DOM_SOUTH';\n          // 未設定の場合。\n          } else {\n            airportPoint = AirportsAndStations[lang].FUK_DOM;\n            airportTerminal = 'FUK_DOM';\n          }\n        // 国際線の場合。\n        } else {\n          airportPoint = AirportsAndStations[lang].FUK_INT;\n          airportTerminal = 'FUK_INT';\n        }\n        break;\n      // 那覇空港の場合、国際線・国内線で分ける\n      case 'OKA':\n        // 国内線の場合。\n        if (isDomestic) {\n          airportPoint = AirportsAndStations[lang].OKA_DOM;\n          airportTerminal = 'OKA_DOM';\n        } else {\n          airportPoint = AirportsAndStations[lang].OKA_INT;\n          airportTerminal = 'OKA_INT';\n        }\n        break;\n      default:\n        // その他の空港はデフォルトの地点情報で探索する。\n        airportPoint = AirportsAndStations[lang][airportCode];\n        airportTerminal = airportCode;\n        break;\n    }\n  // 到着案内の場合。\n  } else {\n    switch (airportCode) {\n      case 'SPK':\n      case 'CTS':\n        // 新千歳空港の場合、国内線・国際線とバス停が異なるため分ける。\n        airportPoint = isDomestic ? ExitToStations[lang].CTS_DOM : ExitToStations[lang].CTS_INT;\n        airportTerminal = isDomestic? 'CTS_DOM': 'CTS_INT';\n        break;\n      // 羽田の場合は国際線であるかとターミナル名を見る。\n      case 'HND':\n        // 使用ターミナルを名称等から確定させる\n        const HNDTerminal = flight.getHNDTerminal(isDepartureGuide);\n        switch(HNDTerminal) {\n          // 第一ターミナルの場合\n          case 1:\n            airportPoint = AirportsAndStations[lang].HND_1;\n            airportTerminal = 'HND_1';\n            break;\n          // 第二ターミナルの場合\n          case 2:\n            airportPoint = AirportsAndStations[lang].HND_2;\n            airportTerminal = 'HND_2';\n            break;\n          // 第三ターミナルの場合\n          case 3:\n            airportPoint = AirportsAndStations[lang].HND_3;\n            airportTerminal = 'HND_3';\n            break;\n          // 第二ターミナル・第三ターミナル未確定の場合\n          case \"2_3\":\n            // 出発ターミナルが未確定の場合\n            // AWS経由の場合に出発ターミナルが未確定の場合にはクエリに「2/3」と渡される\n            // 空港バス優先の場合は第3ターミナル、そうでなければ第2ターミナルからの経路探索をする。\n            airportPoint = setHNDIntAirportPoint(isShowViaSection, hasPriorityAirportBus, lang);\n            // 常時第3ターミナル表示フラグか、空港バスを使用する際にはターミナルを第3ターミナルとする\n            airportTerminal = setHNDIntAirportTerminal(isShowViaSection, hasPriorityAirportBus);\n            // ターミナルが未確定であるフラグを立てる。\n            isNotSetTerminal = true;\n            break;\n        }\n        break;\n      // 成田空港の場合\n      case 'NRT':\n        // 成田空港の場合、第三ターミナルの場合を想定する\n        if(flight.getNRTTerminal(isDepartureGuide) === 3) {\n          airportPoint = ExitToStations[lang].NRT_3;\n          airportTerminal = 'NRT_3';\n        }\n        else {\n          airportPoint = ExitToStations[lang].NRT;\n          airportTerminal = 'NRT';\n        }\n      // 東京エリア(羽田・成田共用)の空港コードの場合。(英語版のみ返ってくることがある。)\n      case 'TYO':\n        // 空港名に「Haneda」が含まれる場合。\n        if (airportName.includes('Haneda')) {\n          // 国内線の場合は第1・第2ターミナルかで分ける。\n          if (isDomestic) {\n            // ターミナル名は搭乗口情報に第1ターミナルの場合のみ含まれる。\n            if (flight.arrTerminal.includes('第1ターミナル') || flight.arrTerminal.includes('Terminal 1') || flight.arrTerminal === '1') {\n              // 搭乗口情報が存在し、第1ターミナルの文字列が含まれていた場合のみ、第1ターミナルの地点を取得する。\n              airportPoint = ExitToStations[lang].HND_1;\n              airportTerminal = 'HND_1';\n            } else {\n              // 第2ターミナルの地点を取得する。\n              airportPoint = ExitToStations[lang].HND_2;\n              airportTerminal = 'HND_2';\n            }\n          // 国際線の場合は保安検査場までの案内とする。\n          } else {\n            airportPoint = ExitToStations[lang].HND_3;\n            airportTerminal = 'HND_3';\n          }\n        // 空港名に「Narita」が含まれる場合。\n        } else if (airportName.includes('Narita')) {\n          // 成田空港の場合、第三ターミナルの場合を想定する\n          if(flight.getNRTTerminal(isDepartureGuide) === 3) {\n            airportPoint = ExitToStations[lang].NRT_3;\n            airportTerminal = 'NRT_3';\n          }\n          else {\n            airportPoint = ExitToStations[lang].NRT;\n            airportTerminal = 'NRT';\n          }\n        }\n        break;\n      // 福岡空港の場合、国内線の南北ターミナル、国際線ターミナルに振り分ける。\n      case 'FUK':\n        // 国内線の場合。\n        if (isDomestic) {\n          // ターミナル情報がANA APIから取得できる日付ではない場合。\n          if (!flight.isAvalableOperationInfo(isDepartureGuide)) {\n            airportPoint = ExitToStations[lang].FUK_DOM;\n            airportTerminal = 'FUK_DOM';\n          // ANA APIの到着ターミナル名に北が含まれる場合。\n          } else if (flight.arrTerminal.includes('北') || flight.arrTerminal.includes('North')) {\n            airportPoint = ExitToStations[lang].FUK_DOM_NORTH;\n            airportTerminal = 'FUK_DOM_NORTH';\n          // ANA APIの到着ターミナル名に南が含まれる場合。\n          } else if (flight.arrTerminal.includes('南') || flight.arrTerminal.includes('South')) {\n            airportPoint = ExitToStations[lang].FUK_DOM_SOUTH;\n            airportTerminal = 'FUK_DOM_SOUTH';\n          // ANA APIの到着ターミナル名に北・南いずれも含まれない場合。\n          } else {\n            airportPoint = ExitToStations[lang].FUK_DOM;\n            airportTerminal = 'FUK_DOM';\n          }\n        // 国際線の場合。\n        } else {\n          airportPoint = ExitToStations[lang].FUK_INT;\n          airportTerminal = 'FUK_INT';\n        }\n        break;\n    // 那覇空港の場合、国際線・国内線で分ける\n    case 'OKA':\n      // 国内線の場合。\n      if (isDomestic) {\n        airportPoint = AirportsAndStations[lang].OKA_DOM;\n        airportTerminal = 'OKA_DOM';\n      } else {\n        airportPoint = AirportsAndStations[lang].OKA_INT;\n        airportTerminal = 'OKA_INT';\n      }\n      break;\n      default:\n        // その他の空港はデフォルトの地点情報で探索する。\n        airportPoint = ExitToStations[lang][airportCode];\n        airportTerminal = airportCode;\n        break;\n    }\n  }\n\n  return {\n    airportPoint: airportPoint,\n    airportTerminal: airportTerminal,\n    isNotSetTerminal: isNotSetTerminal,\n  }\n}\n\nexport function setFlags(courses: Course[]): Course[] {\n  // 早・安・楽のフラグを設定する\n  // 経路に「早」フラグをセットする。\n  courses = setIsFast(courses);\n\n  // 経路に「安」フラグをセットする。\n  courses = setIsLowPrice(courses);\n\n  // 経路に「楽」フラグをセットする。\n  courses = setIsLeastTransferCount(courses);\n  return courses;\n}\n\n/**\n * 東京リムジンバスAPIから取得した情報をもとに、Coursesにリムジンバス 連携リンクを埋め込む\n * @param course \n * @param limousineBusData \n */\nexport function setTokyoLimousineBusLink(courses: Course[], limousineBusData: ResTokyoLimousineBusFormat[]) {\n  limousineBusData.forEach((busData)=>{\n    const route = courses[busData.courseIndex].Route;\n    const line = route.Line[busData.lineIndex];\n    line.tokyoLimousineBusLink = busData;\n    line.isShowTokyoLimousineBus = !busData.isError;\n  })\n  return courses;\n}\n\n/**\n * 大阪リムジンバス を使用するかのフラグを埋め込む\n * @param courses\n */\nexport function setOsakaLimousineBusFlag(courses: Course[]) {\n  return courses.forEach((course) => {\n    const lines = Array.isArray(course.Route.Line)? course.Route.Line: [course.Route.Line];\n    lines.forEach((line, iine_idx)=>{\n      line.isShowOsakaLimousineBus = false;\n      // 1. 連絡バス出ない場合には表示しない\n      if(typeof line.Type === 'string' || line.Type?.text !== 'bus' || line.Type?.detail !== 'connection' ) {\n        return;\n      }\n      // 2. 路線名に 大阪空港交通 / 阪神バス / 阪急観光バス が含まれる場合のみ表示する\n      const osakaLimousineBusList = ['大阪空港交通', 'Osaka-Airport-Kotsu', '阪神バス', 'Hanshin-Bus', '阪急観光バス', 'Hankyu-Kotsu-Bus'];\n      const isTargetOsakaLimousineBus = osakaLimousineBusList.some((busName)=>{\n        return line.Name.includes(busName);\n      })\n      if(!isTargetOsakaLimousineBus) {\n        return;\n      }\n      /**\n       * 3. 到着バス停が「梅田」「難波駅前」「あべの橋駅」「上本町駅」の場合\n       * 梅田:ホテル阪神/ハービス大阪/新阪急ホテル/大阪マルビル\n       */\n      const targetBusStops = [\"308626\", \"304069\", \"308622\", \"307201\", \"304048\", \"304780\", \"305932\"];\n      const points = Array.isArray(course.Route.Point)? course.Route.Point: [course.Route.Point];\n      const arrPoint = points[iine_idx+1];\n      line.isShowOsakaLimousineBus = targetBusStops.includes(arrPoint?.Station?.code);\n    })\n    return course;\n  });\n}\n\n/**\n * Datalakeから取得した情報を元にCoursesに工房連携リンクを埋め込む\n * @param courses \n * @param datalakeData\n */\nexport function setKoboLink(courses: Course[], datalakeData: datalakeBusFormat[]) {\n  datalakeData.map((busData)=>{\n    const route = courses[busData.course_index].Route;\n    const line = route.Line[busData.line_index];\n    // 出発地・到着地情報を追加する\n    const depStationCode = route.Point[busData.line_index].Station.code;\n    const arrStationCode = route.Point[busData.line_index+1].Station.code;\n    line.koboBusLink = genarateKoboLink(busData, depStationCode, arrStationCode);\n    return null;\n  });\n  return courses;\n}\n\n/**\n * JR北海道『ANAきた北海道周遊パス』のアフィリエイトリンクを表示するかフラグを各区間に入れる\n */\nexport function setShowJRHokkaidoNorthFreePassFlag(course: Course) {\n  try {\n    if(course.OperationLinePattern) {\n      const sections = course.OperationLinePattern.length? course.OperationLinePattern: [course.OperationLinePattern];\n      sections.map((section: any, idx: number)=>{\n        const routeLine = course.Route.Line[section.routeLineIndex-1];\n        const lines = section.Line.length? section.Line: [section.Line];\n        // 1区間に跨る線区の一覧\n        const lineList = lines.map((line: any)=>{ return line.code; });\n        // 対象区間の線区が範囲内かをチェック\n        let showSectionLink = lineList.reduce((x: boolean, a: number) => {\n          return x && (ShowJRHookaidoNorthFreePass.showLineList.includes(Number(a)))\n        }, true);\n        if(showSectionLink) {\n          // 停車駅一覧を取得\n          const stopStationList = routeLine.InsideInformation?.Stop.map((x)=>{\n            return Number(x.Point.Station.code);\n          });\n          // 停車駅にフリーパス区間外の駅が含まれていないかチェック\n          showSectionLink = stopStationList?.reduce((x, a)=>{\n            return x && !ShowJRHookaidoNorthFreePass.outOfFreePassStationList.includes(a);\n          }, true);\n        }\n        routeLine.isShowJRHokkaidoFreePass = showSectionLink;\n        return null;\n      });\n      // 乗り換え駅の駅コードListを取得します\n      const sectionPointList = course.Route.Point.map((x)=>{\n        return x.Station? x.Station.code: null;\n      });\n      // どの区間までを表示対象とするかを求める\n      // arrStationList に乗っている駅リストにマッチする最後の駅までを表示対象とする\n      let endIdx: number = Infinity;\n      sectionPointList.forEach((x, idx)=>{\n        endIdx = (x && ShowJRHookaidoNorthFreePass.arrStationList.includes(Number(x)))? idx: endIdx;\n      });\n      // 最終地点より先は連携リンクを非表示とする\n      for(let i=endIdx; i<course.Route.Line.length; i++){\n        course.Route.Line[i].isShowJRHokkaidoFreePass = false;\n      }\n    }\n  } catch(e) {\n    // dev環境のみエラーログを出力\n    if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n      console.error(e);\n    }\n  }\n  return course;\n}\n\n/**\n * 東京メトロフリーパス連携を表示するかのフラグを各区間に入れる\n * @param courses フラグを入れる経路リスト\n */\nexport function setShowTokyoMetroFreePass(courses: Course[]) {\n  return courses.map((course)=>{\n    try {\n      if(course.OperationLinePattern) {\n        const sections = course.OperationLinePattern.length? course.OperationLinePattern: [course.OperationLinePattern];\n        // 東京メトロ・都営地下鉄・京急を含む路線リスト\n        const tokyoSubwayAndKeikyuLineList: number[] = tokyoMetroLineList.concat(keikyuLineList);\n        // 京急本線のうち対象外の駅リスト\n        const excludedKeikyuStationArray: number[] = excludedKeikyuStationList.map((station)=>{\n          return station.code;\n        });\n        const courseLineList = sections.reduce((courseLineList: number[], section: any)=>{\n          const routeLine = course.Route.Line[section.routeLineIndex-1];\n          const lines = section.Line.length? section.Line: [section.Line];\n          // 1区間に跨る線区の一覧\n          const lineList = lines.map((line: any)=>{ return Number(line.code); });\n          // 対象区間の線区が全てが範囲内(東京メトロ・都営地下鉄)かをチェック\n          routeLine.hasOnlyTokyoSubwaySeciton = lineList.reduce((x: boolean, a: number) => {\n            return x && (tokyoMetroLineList.includes(a))\n          }, true);\n          // 京急の区間を含むか\n          const hasKeikyuSection = lineList.reduce((x: boolean, a: number) => {\n            return x || (keikyuLineList.includes(a))\n          }, false);\n          // 京急・東京地下鉄で完結するか\n          const hasOnlyKeikyuOrTokyoSubway = lineList.reduce((x: boolean, a: number) => {\n            return x && (tokyoSubwayAndKeikyuLineList.includes(a))\n          }, true);\n          // 対象区間が京急もしくは東京地下鉄で完結するかをチェック\n          // 京急リンクは国内線利用と気にしか表示しないため制御を入れる\n          routeLine.hasTargetKeikyuSection = hasKeikyuSection && hasOnlyKeikyuOrTokyoSubway;\n          if(routeLine.hasTargetKeikyuSection) {\n            // 停車駅の一覧を取得する\n            const stopList = routeLine.InsideInformation?.Stop.map((stop)=>{\n              return Number(stop.Point.Station.code);\n            });\n            if(Array.isArray(stopList)) {\n              // チケットの有効範囲外の駅を含まないか\n              const isNotIncludeTicketexcludedKeikyuArea: boolean = stopList.reduce((x: boolean, station: number)=>{\n                return x && !excludedKeikyuStationArray.includes(station);\n              }, true);\n              routeLine.hasTargetKeikyuSection = isNotIncludeTicketexcludedKeikyuArea;\n            }\n          }\n          return courseLineList.concat(lineList)\n        }, []);\n        // 1経路中に東京メトロ・都営地下鉄を使用する区間があるかを判定する\n        course.hasTokyoSubwaySection = courseLineList.reduce((x: boolean, a: number)=>{\n          return x || tokyoMetroLineList.includes(a);\n        }, false);\n        // 1経路中に京急&TokyoSuwayTicketのボタンを表示する区間が含まれる\n        course.hasKeikyuAndSubwayTicketSection = course.Route.Line.reduce((result: boolean, line: Line)=>{\n          return result || (line.hasTargetKeikyuSection || false );\n        }, false);\n      }\n    } catch (e) {\n      // dev環境のみエラーログを出力\n      if(process.env['REACT_APP_STAGE_ENV'] === 'dev') {\n        console.error(e);\n      }\n    }\n    return course;\n  });\n}\n\n/**\n * 工房連携のリンクパラメータを生成する\n * @param busData 中間層から取得したバスデータ\n * @param depStaCode 区間出発地の駅コード(駅すぱあと)\n * @param arrStaCode 区間到着地の駅コード(駅すぱあと)\n */\nfunction genarateKoboLink(busData: datalakeBusFormat, depStaCode: string, arrStaCode: string) {\n  const baseURL = 'https://secure.j-bus.co.jp/hon/BusService?';\n  const query: KoboLink = {\n    host: baseURL,\n    query: {\n      wayflg: '0',\n      gpcd: busData.gpcd,\n      rocd: ('000'+busData.rocd).slice(-4),\n      \"dtym[0]\": busData.dtym,\n      \"dtdd[0]\": ('0'+busData.dtdd).slice(-2),\n      \"bncd[0]\": ('000'+busData.bncd).slice(-4),\n      \"bscd[0]\": ('0'+busData.bscd).slice(-2),\n      \"dscd[0]\": \"00\",\n      \"affiliateid\": \"JbDpuWc\"\n    },\n    onelineQuery: ''\n  };\n  const stationTable: ({ [key: string]: string; } | null) = busData.stationTable || null;\n  if(stationTable) {\n    const bfcd: string = stationTable[depStaCode];\n    const isDevEnv = process.env['REACT_APP_STAGE_ENV'] === 'dev';\n    if(bfcd) {\n      query.query[\"bfcd[0]\"] = bfcd;\n    } else if(isDevEnv) {\n      console.error(\"発車オーライネット連携:出発駅情報が取得できません\");\n      console.error(\"bfcd[0]: \"+bfcd);\n    }\n    const btcd: string = stationTable[arrStaCode];\n    if(btcd) {\n      query.query[\"btcd[0]\"] = btcd;\n    } else if(isDevEnv) {\n      console.error(\"発車オーライネット連携:到着駅情報が取得できません\");\n      console.error(\"btcd[0]: \"+btcd);\n    }\n  }\n  // 遷移リンクのクエリ部分を生成\n  // TODO: new URLSearchParams() を使って書き直す\n  query.onelineQuery = Object.keys(query.query).reduce((x, a)=>{\n    return `${x}&${a}=${query.query[a]}`;\n  }, \"\").slice(1);\n  return query;\n}\n\n/**\n * Datalakeに投げるためのバス情報を抽出する\n * @param AllowBusLineCode 許可するバス路線コードの一覧\n * @param courses 現在の経路一覧\n */\nexport function extractionDatalakeBusData(AllowBusLineCode:string[] ,courses: Course[]) {\n  let datalakeBusList: datalakeBusFormat[] = [];\n  courses.map((course, c_idx)=>{\n    const lines = Array.isArray(course.Route.Line)? course.Route.Line: [course.Route.Line];\n    lines.map((line, i)=>{\n      if(line.Type) {\n        const lineType = (typeof line.Type === 'string') ? line.Type : line.Type.text;\n        if( lineType === 'bus' && line.InsideInformation ) {\n          const navigatorTransportation = new URLSearchParams(line.InsideInformation.navigatorTransportation);\n          let setLineCode = navigatorTransportation.get('LINE') || \"\";\n          // line_codeは3桁の場合があるので穴埋めする\n          setLineCode = setLineCode.padStart(4, '0');\n          // 許可しているバス路線のみAPI側に問い合わせる\n          if(AllowBusLineCode.includes(setLineCode)) {\n            datalakeBusList.push({\n              input_date: format(new Date(line.DepartureState.Datetime.text), 'yyyyMMdd'),\n              input_line_code: setLineCode,\n              input_station_code: course.Route.Point[i].Station.code,\n              course_index: c_idx,\n              line_index: i,\n              input_time: Number( format(new Date(line.DepartureState.Datetime.text), 'HHmm') ).toString()\n            });\n          }\n        }\n      }\n      return null;\n    });\n    return null;\n  });\n  return datalakeBusList;\n}\n\n/**\n * 指定した便が東京リムジンバスかを判定する\n * @param depCode 出発地駅コード\n * @param arrCode 到着地駅コード\n */\nfunction isTokyoLimousineBus(depCode: string, arrCode: string) {\n  // depCodeかarrCodeがnullならfalseを返す\n  if(!depCode || !arrCode){\n    return false;\n  }\n  // 羽田・成田空港の最寄りのバス停リスト\n  const airportBusStopTable: any = {\n    narita: ['29574', '304034', '29573'],\n    haneda: ['29511', '305577', '29512']\n  }\n  const airpotBusStopList: string[] = Object.keys(airportBusStopTable).reduce((x, a)=>{ return x.concat(airportBusStopTable[a]) }, []);\n  return airpotBusStopList.includes(depCode) || airpotBusStopList.includes(arrCode);\n}\n\n/**\n * 対象区間が高速バス・連絡バスかを判定する\n * @param lineType 駅すぱあと上の経路の路線種別。\n */\nconst isHighWayAirportBus = (lineType: string | TypeClass) => {\n  if(typeof lineType === 'string') {\n    return false;\n  }\n  else {\n    // バスでかつ、路線バス以外ならtrueを返す\n    return lineType.text === 'bus' && lineType.detail !== 'local';\n  }\n}\n\n/**\n * extractionTokyoLimousineBusData を全ての経路に対して行う\n * @param courses 現在の経路一覧 \n */\nfunction extractionTokyoLimousineBusDataCourses(courses: Course[]) {\n  let limousineBusList: ReqTokyoLumousineBusFormat[] = [];\n  courses.forEach((course, course_index)=>{\n    limousineBusList = limousineBusList.concat(extractionTokyoLimousineBusData(course, course_index));\n  });\n  return limousineBusList;\n};\n\n/**\n * 取得した経路の内、東京リムジンバスの区間を抽出し、運行情報を問い合わせる土台を作る \n * @param course 検索するコース\n * @param course_index 対象のコースのidx\n */\nexport function extractionTokyoLimousineBusData(course: Course, course_index: number){\n  let limousineBusList: ReqTokyoLumousineBusFormat[] = [];\n  const lines = Array.isArray(course.Route.Line)? course.Route.Line: [course.Route.Line];\n  lines.forEach((line, line_index)=>{\n    // 高速バスの場合のみ対象とする\n    if(line.Type && isHighWayAirportBus(line.Type)) {\n      const depPoint = course.Route.Point[line_index];\n      const arrPoint = course.Route.Point[line_index+1];\n      const depCode = depPoint.Station?.code;\n      const arrCode = arrPoint.Station?.code;\n      // 羽田・成田発着で、路線以外のバスだったらバックエンドに投げる\n      if(isTokyoLimousineBus(depCode, arrCode)) {\n        const depTime = new Date(line.DepartureState.Datetime.text);\n        limousineBusList.push({\n          courseIndex: course_index,\n          lineIndex: line_index,\n          depCode: depCode,\n          arrCode: arrCode,\n          depTime: String(depTime.getTime()/1000)\n        })\n      }\n    }\n  });\n  return limousineBusList;\n}\n\n/**\n * 経路に空港連絡バスが含まれる順に並び替える。\n * @param courses 経路の配列。\n */\nfunction sortByAirportBus(courses: Course[]) {\n  // 取得した経路に空港連絡バスがあるかのフラグをセットする。\n  courses.forEach((course) => {\n    course.hasAirportBus = false;\n    course.Route.Line.forEach((l) => {\n      // 交通種別がない場合や文字列の場合は何もしない。\n      if (!l.Type || typeof l.Type === 'string') { return }\n      // 交通種別の詳細が「連絡バス」の場合のみフラグをtrueにする。\n      if (l.Type.detail === 'connection') { course.hasAirportBus = true; }\n    })\n  })\n  // 空港連絡バスが含まれている経路が前の方(配列のインデックスが若い順)になるようにソートする。\n  courses.sort((course1, course2) => {\n    let result = 0;\n    // 前後の経路がどちらも空港連絡バスを含む場合は順序を変えない。\n    if (course1.hasAirportBus && course2.hasAirportBus) result = 0;\n    // 前後の経路がどちらも空港連絡バスを含まない場合は順序を変えない。\n    if (!course1.hasAirportBus && !course2.hasAirportBus) result = 0;\n    // 直前の経路に空港連絡バスを含み、直後の経路に空港連絡バスがない場合、直前の経路が前にくるようにソートする。\n    if (course1.hasAirportBus && !course2.hasAirportBus) result = -1;\n    // 直前の経路に空港連絡バスがなく、直後の経路に空港連絡バスを含む場合、直後の経路が前にくるようソートする。\n    if (!course1.hasAirportBus && course2.hasAirportBus) result = 1;\n    return result;\n  })\n  return courses;\n}\n\n/** 搭乗便の無い再判定を行う */\nconst isDomesticFlight = (condition: ConditionState, pathName: string) =>{\n  /** 指定日付のフライト情報がある場合にはそちらを利用する */\n  if(condition.flightStatusUserSetDateForSearchAd.getIsAbleUse()) {\n    return condition.flightStatusUserSetDateForSearchAd.isDomestic;\n  }\n  if(condition.flightStatusForSeachAd.getIsAbleUse()) {\n    return condition.flightStatusForSeachAd.isDomestic;\n  }\n  if(condition.flightStatus.getIsAbleUse()) {\n    return condition.flightStatus.isDomestic;\n  }\n  /** フライト情報が全部使えない場合には、pathによって参照先を返る */\n  if(Path.isSearch(pathName)) {\n    /** 検索画面の場合、isDomestic値から参照する */\n    return condition.isDomestic;\n  }\n  else {\n    /** それ以外の場合には クエリパラメータより判断する */\n    return condition.query.isDomestic;\n  }\n}\n\n/**\n * 結果ページに遷移する際のクエリ文字列を作成する。\n * @param condition Reduxで管理している状態の値。\n */\nfunction makeResultQueryString(state: State) {\n  const condition = state.condition;\n  const general = state.general;\n  // 定刻の出発時刻。(nullの場合は空文字を設定する。)\n  const std = condition.query.std ? DateTime.JSTFormat(condition.query.std, 'yyyyMMddHHmm') : '';\n  // 定刻の到着時刻。(nullの場合は空文字を設定する。)\n  const sta = condition.query.sta ? DateTime.JSTFormat(condition.query.sta, 'yyyyMMddHHmm') : '';\n  // フォーム上で設定された日付。(yyyyMMdd形式の値をDate型にする。)\n  const date = condition.date ? DateTime.JSTFormat(condition.date, 'yyyyMMdd') : '';\n  // 中身のあるUniversalMaaSクエリだけをサマリー画面に連携する\n  const universalMaasQuery: any = general.universalMaaSQuery;\n  Object.keys(universalMaasQuery).forEach((key: string) => {\n    if(!universalMaasQuery[key]) {\n      delete universalMaasQuery[key];\n    }\n  })\n  // 現在アプリケーション上で開いているパスの文字列を取得する。\n  const pathName = state.router.location.pathname;\n  const isDomestic = isDomesticFlight(condition, pathName);\n  return new URLSearchParams({\n    point: condition.point,\n    pointCode: condition.pointCode,\n    pointType: condition.pointType,\n    flight: condition.flight,\n    flightNumber: condition.flightNumber,\n    date: date,\n    hasVia: condition.hasVia.toString(),\n    via: condition.via,\n    viaCode: condition.viaCode,\n    isDepartureGuide: condition.isDepartureGuide.toString(),\n    // クエリで渡ってきた到着案内であるかのフラグ。\n    // (ANA APIで期間外の場合に適切にクエリの発着時刻を選択するため。)\n    // TODO: isDepartureGuideと今後統合できないか検討。(2020/03/28現在)\n    isArrivalGuide: (!condition.isDepartureGuide).toString(),\n    isEnabledShinkansen: condition.isEnabledShinkansen.toString(),\n    isEnabledLimitedExpress: condition.isEnabledLimitedExpress.toString(),\n    isEnabledIc: condition.isEnabledIc.toString(),\n    hasPriorityAirportBus: condition.hasPriorityAirportBus.toString(),\n    hasPriorityCar: condition.hasPriorityCar.toString(),\n    isShowBarrierFreeInfo: general.mode.isShowBarrierFreeInfo.toString(),\n    arrivalTimeToAirport: condition.arrivalTimeToAirport.toString(),\n    // 以降はASWまたはANAアプリから送られるパラメーターの値。\n    // ※便名のキーはフォーム上で設定した値と重複するため、他の部分での変数名と異なった名称にしている。\n    reservedFlight: condition.query.flightNumber,\n    arrAirport: condition.query.arrAirport,\n    depAirport: condition.query.depAirport,\n    fromAirportCode: condition.query.fromAirportCode,\n    toAirportCode: condition.query.toAirportCode,\n    fromTerminal: condition.query.fromTerminal,\n    toTerminal: condition.query.toTerminal,\n    targetAirLine: condition.targetAirLine.toString(),\n    lang: condition.query.lang,\n    referrer: condition.query.referrer,\n    cityName: condition.cityName,\n    std: std,\n    sta: sta,\n    isDomestic: isDomestic,\n    ...universalMaasQuery\n  }).toString();\n}\n\n/** 結果ページを表示する。*/\nfunction* runDisplayResult() {\n  // Reduxで管理している値を取得する。\n  const state: State = yield select();\n  // Cookieに関する情報を格納する\n  const cookieStatus = {\n    // リンクティビティから遷移してきた際に経路を復元するための各種クエリを保存する\n    query: {\n      name: \"ana_airport_access_navi_resultquery\",\n      // リンクティビティから遷移してきた際の有効期限は1時間と設定する\n      limit: addHours(new Date(), 1)\n    }\n  }\n  // クエリ文字列を作成する。\n  const queryString = makeResultQueryString(state);\n  // 結果ページを表示するパスの文字列を定義する。\n  const path = '/summary?' + queryString;\n  // リンクティビティから戻った際に復元するURLをCookieに保存します\n  Cookies.set(cookieStatus.query.name, queryString, { expires: cookieStatus.query.limit });\n  if(state.condition.place !== null) {\n    // 取得した地点のPlace情報をwebStorageに保存する\n    PlaceInfoFactory.setPlaceData(state.condition.pointCode, state.condition.place);\n  }\n\n  // 現在アプリケーション上で開いているパスの文字列を取得する。\n  const pathName = state.router.location.pathname;\n  // 検索画面からの遷移の場合のみ、/summaryパスへ遷移させる。\n  if (hasDisplayedSearch(pathName)) yield put(push(path));\n  // 探索日時を取得する。\n  const searchDate = state.condition.flightStatus.getSearchTime(state.condition.isDepartureGuide);\n  // 開発環境の場合(環境変数で開発環境と設定している場合)のみ、探索日時に1970年が設定されている際はアラートを出す。\n  if (process.env['REACT_APP_STAGE_ENV'] === 'dev' && searchDate.getFullYear() === 1970) {\n    window.alert('検索日時に1970年が設定されています。');\n  }\n  // 広告ローテーションを進ませる\n  yield put(randomTmpAdRoatationValue());\n}\n\n/** 経路検索処理の終了後にアクセスログを送信する。 */\nfunction* sendAccessLogAfterSeach() {\n  // Reduxで管理している値を取得する。\n  const state: State = yield select();\n  /** 現在のパス。 */\n  let pathName = state.router.location.pathname;\n  // 現在のパスが検索画面(「/」または「/search」)の場合、「/summary」に置き換える。\n  // (原則、検索条件画面では経路検索処理を実行しないため。)\n  if (Path.isSearch(pathName)) {\n    pathName = Path.SUMMARY;\n  }\n}\n\n/**\n * 検索画面を開いているかをパスから。判別する。\n * @param path 現在開いているパス。\n */\nfunction hasDisplayedSearch(path: string) {\n  // 開いているページが「/result」「/summary」ではない場合のみ、trueを返す。\n  return (!Path.isResult(path) && !Path.isSummary(path));\n}\n\nexport function* watchGetRouteType() {\n  yield takeLatest(ConditionActionType.ANA_GET_ROUTE_TYPE_START, runGetRouteType);\n}\n\nexport function* watchGetMembers() {\n  yield takeLatest(ConditionActionType.ANA_GET_FLIGHT_START, runGetFlight);\n}\n\nexport function* watchGetFlightSuccess() {\n  // ANA APIへのアクセスが完了した後に、探索条件詳細を取得する。\n  yield takeLatest(ConditionActionType.ANA_GET_FLIGHT_SUCCEED, runGetCondition);\n}\n\nexport function* watchGetConditionSuccess() {\n  // 探索条件詳細を取得した後に、経路探索を実行する。\n  yield takeLatest(ConditionActionType.EKISPERT_GET_CONDITION_SUCCEED, runGetExtreme);\n}\n\nexport function* watchGetCourses() {\n  // 経路を取得できた後に、結果ページへ遷移する。\n  yield takeLatest(ConditionActionType.EKISPERT_GET_EXTREME_SUCCEED, runDisplayResult);\n}\n\nexport function* watchSetFlight(){\n  yield takeLatest(ConditionActionType.EKISPERT_GET_EXTREME_SUCCEED, sendAccessLogAfterSeach);\n}\n\nexport default function* rootSaga() {\n  yield all([\n    fork(watchGetMembers),\n    fork(watchGetFlightSuccess),\n    fork(watchGetConditionSuccess),\n    fork(watchGetCourses),\n    fork(watchGetRouteType),\n  ]);\n  yield fork(watchSetFlight);\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Provider } from 'react-redux';\nimport configureStore, { sagaMiddleware, history } from './store';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\nimport './index.css';\nimport './i18n';\nimport rootSaga from './sagas';\nimport 'react-app-polyfill/stable';\nimport { CookiesProvider } from 'react-cookie';\n\nconst store = configureStore();\n\nReactDOM.render(\n  <Provider store={store}>\n    <CookiesProvider>\n      <App history={history} />\n    </CookiesProvider>\n  </Provider>,\n  document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\nsagaMiddleware.run(rootSaga);\n"],"sourceRoot":""}