= ({
+ data,
+ label = "Debug Data",
+ collapsed = true,
+}) => {
+ const [isCollapsed, setIsCollapsed] = useState(collapsed);
+
+ // Only render in development
+ if (process.env.NODE_ENV !== "development") {
+ return null;
+ }
+
+ return (
+
+
setIsCollapsed(!isCollapsed)}
+ >
+ {label}
+ {isCollapsed ? "▶" : "▼"}
+
+
+ {!isCollapsed && (
+
+
+ {JSON.stringify(data, null, 2)}
+
+
+ )}
+
+ );
+};
+
+// Hook for easy debugging
+export const useDebugLog = (value: any, label?: string) => {
+ React.useEffect(() => {
+ if (process.env.NODE_ENV === "development") {
+ console.group(`🐛 Debug: ${label || "Value"}`);
+ console.log(value);
+ console.groupEnd();
+ }
+ }, [value, label]);
+};
+
+// Component wrapper for debugging props
+export const withDebug = (
+ Component: React.ComponentType
,
+ debugLabel?: string,
+) => {
+ const WrappedComponent = React.forwardRef((props, ref) => {
+ useDebugLog(props, debugLabel || Component.displayName || Component.name);
+ return (
+
+ );
+ });
+
+ WrappedComponent.displayName = `withDebug(${Component.displayName || Component.name})`;
+ return WrappedComponent;
+};
diff --git a/src/components/flight/ItineraryComponent.tsx b/src/components/flight/ItineraryComponent.tsx
new file mode 100644
index 00000000..bf00d88b
--- /dev/null
+++ b/src/components/flight/ItineraryComponent.tsx
@@ -0,0 +1,456 @@
+"use client";
+
+import React from "react";
+import { FlightSearchCriteria } from "@/types/flightSearchCriteria";
+import { Clock, Calendar, Plane, Users, Luggage, MapPin, ArrowRight } from "lucide-react";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { Badge } from "@/components/ui/badge";
+import { Separator } from "@/components/ui/separator";
+import { useItineraryWidget } from "@/providers/ItineraryWidgetContext";
+
+interface ItineraryComponentProps {
+ flightSearchCriteria?: FlightSearchCriteria;
+ streamData?: any;
+}
+
+export const ItineraryView: React.FC = ({
+ flightSearchCriteria,
+ streamData
+}) => {
+ const { widgets } = useItineraryWidget();
+ const formatDate = (dateString: string | null) => {
+ if (!dateString) return "Not specified";
+ return new Date(dateString).toLocaleDateString("en-US", {
+ weekday: "long",
+ year: "numeric",
+ month: "long",
+ day: "numeric",
+ });
+ };
+
+ const formatShortDate = (dateString: string | null) => {
+ if (!dateString) return "TBD";
+ return new Date(dateString).toLocaleDateString("en-US", {
+ month: "short",
+ day: "numeric",
+ year: "numeric",
+ });
+ };
+
+ const formatTime = (dateString: string | null) => {
+ if (!dateString) return "TBD";
+ return new Date(dateString).toLocaleTimeString("en-US", {
+ hour: "2-digit",
+ minute: "2-digit",
+ });
+ };
+
+ const getPassengerList = () => {
+ if (!flightSearchCriteria) return "No passengers";
+ const passengers = [];
+ if (flightSearchCriteria.adults > 0) {
+ passengers.push(`${flightSearchCriteria.adults} Adult${flightSearchCriteria.adults > 1 ? 's' : ''}`);
+ }
+ if (flightSearchCriteria.children > 0) {
+ passengers.push(`${flightSearchCriteria.children} Child${flightSearchCriteria.children > 1 ? 'ren' : ''}`);
+ }
+ if (flightSearchCriteria.infants > 0) {
+ passengers.push(`${flightSearchCriteria.infants} Infant${flightSearchCriteria.infants > 1 ? 's' : ''}`);
+ }
+ return passengers.join(', ') || "No passengers";
+ };
+
+ const getDaysBetween = (startDate: string | null, endDate: string | null) => {
+ if (!startDate || !endDate) return 0;
+ const start = new Date(startDate);
+ const end = new Date(endDate);
+ const diffTime = Math.abs(end.getTime() - start.getTime());
+ return Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+ };
+
+ // Process stream data for flight details (this can be expanded based on your stream structure)
+ const processFlightData = () => {
+ if (!streamData) return null;
+
+ // Extract flight information from stream data
+ // This is a placeholder - adjust based on your actual stream data structure
+ const flights = streamData.flights || [];
+ const bookingStatus = streamData.bookingStatus || "searching";
+
+ return { flights, bookingStatus };
+ };
+
+ const flightData = processFlightData();
+
+ if (!flightSearchCriteria) {
+ return (
+
+ {/* Dynamic Widgets Section - Show even when no flight criteria */}
+ {widgets.length > 0 && (
+
+
+
+
+
+ Interactive Components
+
+
+
+
+ {widgets.map((widget) => (
+
+ {widget.component}
+
+ ))}
+
+
+
+
+ )}
+
+ );
+ }
+
+ const tripDuration = flightSearchCriteria.isRoundTrip
+ ? getDaysBetween(flightSearchCriteria.departureDate, flightSearchCriteria.returnDate)
+ : null;
+
+ return (
+
+ {/* Dynamic Widgets Section */}
+ {widgets.length > 0 && (
+
+
+
+
+
+ Interactive Components
+
+
+
+
+ {widgets.map((widget) => (
+
+ {widget.component}
+
+ ))}
+
+
+
+
+ )}
+
+ {/* Trip Overview */}
+
+
+
+
+ Travel Itinerary Overview
+
+
+
+
+ {/* Route Summary */}
+
+
+
+
+ {flightSearchCriteria.originAirport}
+
+
Origin
+
+
+
+
+ {flightSearchCriteria.isRoundTrip && (
+
+ )}
+
+
+
+
+ {flightSearchCriteria.destinationAirport}
+
+
Destination
+
+
+
+
+ {/* Trip Info */}
+
+
+
+ {getPassengerList()}
+
+
+
+
+ {flightSearchCriteria.class || "Economy"}
+
+
+ {tripDuration && (
+
+
+ {tripDuration} days
+
+ )}
+
+
+
+
+
+ {/* Outbound Journey */}
+
+
+
+
+
+ Outbound Journey
+
+
+ {formatShortDate(flightSearchCriteria.departureDate)}
+
+
+
+
+
+ {/* Flight Route */}
+
+
+
+
+
+ {flightSearchCriteria.originAirport} → {flightSearchCriteria.destinationAirport}
+
+
+ {formatDate(flightSearchCriteria.departureDate)}
+
+
+
+
+
+ {flightData?.bookingStatus === "confirmed" ? "Confirmed" : "Searching..."}
+
+
+
+
+ {/* Flight Details */}
+
+
+
+
+ Departure:
+ TBD
+
+
+
+ From:
+ {flightSearchCriteria.originAirport}
+
+
+
+
+
+ Arrival:
+ TBD
+
+
+
+ To:
+ {flightSearchCriteria.destinationAirport}
+
+
+
+
+
+
+
+ {/* Return Journey (if round trip) */}
+ {flightSearchCriteria.isRoundTrip && (
+
+
+
+
+
+ Return Journey
+
+
+ {formatShortDate(flightSearchCriteria.returnDate)}
+
+
+
+
+
+ {/* Flight Route */}
+
+
+
+
+
+ {flightSearchCriteria.destinationAirport} → {flightSearchCriteria.originAirport}
+
+
+ {formatDate(flightSearchCriteria.returnDate)}
+
+
+
+
+
+ {flightData?.bookingStatus === "confirmed" ? "Confirmed" : "Searching..."}
+
+
+
+
+ {/* Flight Details */}
+
+
+
+
+ Departure:
+ TBD
+
+
+
+ From:
+ {flightSearchCriteria.destinationAirport}
+
+
+
+
+
+ Arrival:
+ TBD
+
+
+
+ To:
+ {flightSearchCriteria.originAirport}
+
+
+
+
+
+
+ )}
+
+ {/* Passenger Information */}
+
+
+
+
+ Passenger Information
+
+
+
+
+ {/* Passenger Summary */}
+
+
+
+ {flightSearchCriteria.adults || 0}
+
+
Adults
+
+
+
+ {flightSearchCriteria.children || 0}
+
+
Children
+
+
+
+ {flightSearchCriteria.infants || 0}
+
+
Infants
+
+
+
+ {/* Individual Passengers */}
+ {flightSearchCriteria.passengers && flightSearchCriteria.passengers.length > 0 && (
+
+
+
Passenger Details
+
+ {flightSearchCriteria.passengers.map((passenger, index) => (
+
+
+
+
+
+
+
+ {passenger.firstName && passenger.lastName
+ ? `${passenger.firstName} ${passenger.lastName}`
+ : `Passenger ${index + 1}`
+ }
+
+ {passenger.dateOfBirth && (
+
+ DOB: {new Date(passenger.dateOfBirth).toLocaleDateString()}
+
+ )}
+
+
+
+
Adult
+ {passenger.nationality && (
+
+ {passenger.nationality}
+
+ )}
+
+
+ ))}
+
+
+ )}
+
+
+
+
+ {/* Travel Essentials */}
+
+
+
+
+ Travel Essentials
+
+
+
+
+
+
Baggage Allowance
+
+
+ Cabin Baggage:
+ 7 kg
+
+
+ Check-in Baggage:
+ 15-25 kg
+
+
+ * Varies by airline and class
+
+
+
+
+
+
Important Notes
+
+
• Check-in opens 2 hours before departure
+
• Arrive at airport 3 hours early for international flights
+
• Valid passport/ID required
+
• Visa requirements may apply
+
+
+
+
+
+
+ );
+};
diff --git a/src/components/flight/MapComponent.tsx b/src/components/flight/MapComponent.tsx
new file mode 100644
index 00000000..f28dc540
--- /dev/null
+++ b/src/components/flight/MapComponent.tsx
@@ -0,0 +1,404 @@
+"use client";
+
+import React, { useEffect, useRef, useState } from "react";
+import mapboxgl from "mapbox-gl";
+import { FlightSearchCriteria } from "@/types/flightSearchCriteria";
+import { MapPin, Plane, Calendar, Users, Clock } from "lucide-react";
+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
+import { Badge } from "@/components/ui/badge";
+
+// Import MapBox CSS
+import "mapbox-gl/dist/mapbox-gl.css";
+
+interface MapComponentProps {
+ flightSearchCriteria?: FlightSearchCriteria;
+ streamData?: any;
+}
+
+// Airport coordinates database (you can expand this)
+const AIRPORT_COORDINATES: { [key: string]: [number, number] } = {
+ // Major Indian airports
+ DEL: [77.1025, 28.5562], // Delhi
+ BOM: [72.8777, 19.0896], // Mumbai
+ BLR: [77.7064, 12.9716], // Bangalore
+ MAA: [80.1693, 13.0827], // Chennai
+ CCU: [88.4467, 22.6547], // Kolkata
+ HYD: [78.4298, 17.2403], // Hyderabad
+ AMD: [72.6369, 23.0726], // Ahmedabad
+ COK: [76.4019, 10.1520], // Kochi
+ GOI: [73.8314, 15.3808], // Goa
+ PNQ: [73.9197, 18.5822], // Pune
+
+ // Major international airports
+ JFK: [-73.7781, 40.6413], // New York JFK
+ LAX: [-118.4085, 33.9425], // Los Angeles
+ LHR: [-0.4614, 51.4700], // London Heathrow
+ CDG: [2.5479, 49.0097], // Paris Charles de Gaulle
+ DXB: [55.3644, 25.2532], // Dubai
+ SIN: [103.9915, 1.3644], // Singapore
+ NRT: [140.3929, 35.7720], // Tokyo Narita
+ ICN: [126.7975, 37.4691], // Seoul Incheon
+ HKG: [113.9148, 22.3080], // Hong Kong
+ SYD: [151.1772, -33.9399], // Sydney
+
+ // Add more airports as needed
+};
+
+export const MapView: React.FC = ({
+ flightSearchCriteria,
+ streamData
+}) => {
+ const mapContainer = useRef(null);
+ const map = useRef(null);
+ const [mapLoaded, setMapLoaded] = useState(false);
+
+ // Get MapBox token from environment
+ const mapboxToken = process.env.NEXT_PUBLIC_MAPBOX_TOKEN ||
+ process.env.NEXT_PUBLIC_MAP_BOX ||
+ "pk.your_mapbox_token";
+
+ useEffect(() => {
+ if (!mapContainer.current || map.current) return;
+
+ // Set MapBox access token
+ mapboxgl.accessToken = mapboxToken;
+
+ // Initialize map
+ map.current = new mapboxgl.Map({
+ container: mapContainer.current,
+ style: "mapbox://styles/mapbox/light-v11",
+ center: [77.1025, 28.5562], // Default to Delhi
+ zoom: 2,
+ projection: "globe" as any,
+ });
+
+ map.current.on("load", () => {
+ setMapLoaded(true);
+
+ // Add atmosphere for 3D globe effect
+ if (map.current) {
+ map.current.setFog({
+ color: "rgb(186, 210, 235)",
+ "high-color": "rgb(36, 92, 223)",
+ "horizon-blend": 0.02,
+ "space-color": "rgb(11, 11, 25)",
+ "star-intensity": 0.6,
+ });
+ }
+ });
+
+ return () => {
+ if (map.current) {
+ map.current.remove();
+ map.current = null;
+ }
+ };
+ }, [mapboxToken]);
+
+ useEffect(() => {
+ if (!map.current || !mapLoaded || !flightSearchCriteria) return;
+
+ const { originAirport, destinationAirport } = flightSearchCriteria;
+
+ if (!originAirport || !destinationAirport) return;
+
+ const originCoords = AIRPORT_COORDINATES[originAirport];
+ const destCoords = AIRPORT_COORDINATES[destinationAirport];
+
+ if (!originCoords || !destCoords) {
+ console.warn(`Coordinates not found for airports: ${originAirport}, ${destinationAirport}`);
+ return;
+ }
+
+ // Clear existing layers and sources
+ if (map.current.getSource("route")) {
+ map.current.removeLayer("route");
+ map.current.removeSource("route");
+ }
+ if (map.current.getSource("airports")) {
+ map.current.removeLayer("airports");
+ map.current.removeSource("airports");
+ }
+
+ // Add flight route line
+ map.current.addSource("route", {
+ type: "geojson",
+ data: {
+ type: "Feature",
+ properties: {},
+ geometry: {
+ type: "LineString",
+ coordinates: [originCoords, destCoords],
+ },
+ },
+ });
+
+ map.current.addLayer({
+ id: "route",
+ type: "line",
+ source: "route",
+ layout: {
+ "line-join": "round",
+ "line-cap": "round",
+ },
+ paint: {
+ "line-color": "#3b82f6",
+ "line-width": 3,
+ "line-dasharray": [2, 2],
+ },
+ });
+
+ // Add airport markers
+ map.current.addSource("airports", {
+ type: "geojson",
+ data: {
+ type: "FeatureCollection",
+ features: [
+ {
+ type: "Feature",
+ properties: {
+ title: originAirport,
+ type: "origin",
+ },
+ geometry: {
+ type: "Point",
+ coordinates: originCoords,
+ },
+ },
+ {
+ type: "Feature",
+ properties: {
+ title: destinationAirport,
+ type: "destination",
+ },
+ geometry: {
+ type: "Point",
+ coordinates: destCoords,
+ },
+ },
+ ],
+ },
+ });
+
+ map.current.addLayer({
+ id: "airports",
+ type: "circle",
+ source: "airports",
+ paint: {
+ "circle-radius": 8,
+ "circle-color": [
+ "case",
+ ["==", ["get", "type"], "origin"],
+ "#10b981", // Green for origin
+ "#ef4444", // Red for destination
+ ],
+ "circle-stroke-width": 2,
+ "circle-stroke-color": "#ffffff",
+ },
+ });
+
+ // Add labels for airports
+ map.current.addLayer({
+ id: "airport-labels",
+ type: "symbol",
+ source: "airports",
+ layout: {
+ "text-field": ["get", "title"],
+ "text-font": ["Open Sans Semibold", "Arial Unicode MS Bold"],
+ "text-offset": [0, 1.25],
+ "text-anchor": "top",
+ "text-size": 12,
+ },
+ paint: {
+ "text-color": "#374151",
+ "text-halo-color": "#ffffff",
+ "text-halo-width": 1,
+ },
+ });
+
+ // Fit map to show both airports
+ const bounds = new mapboxgl.LngLatBounds()
+ .extend(originCoords)
+ .extend(destCoords);
+
+ map.current.fitBounds(bounds, {
+ padding: 100,
+ maxZoom: 8,
+ });
+
+ // Add popup on click
+ map.current.on("click", "airports", (e) => {
+ const feature = e.features![0];
+ const geometry = feature.geometry as any;
+ const coordinates = geometry.coordinates?.slice() || [0, 0];
+ const title = feature.properties!.title;
+ const type = feature.properties!.type;
+
+ new mapboxgl.Popup()
+ .setLngLat(coordinates as [number, number])
+ .setHTML(`
+
+
${title}
+
${type === "origin" ? "Origin" : "Destination"}
+
+ `)
+ .addTo(map.current!);
+ });
+
+ // Change cursor on hover
+ map.current.on("mouseenter", "airports", () => {
+ if (map.current) map.current.getCanvas().style.cursor = "pointer";
+ });
+
+ map.current.on("mouseleave", "airports", () => {
+ if (map.current) map.current.getCanvas().style.cursor = "";
+ });
+
+ }, [mapLoaded, flightSearchCriteria]);
+
+ const formatDate = (dateString: string | null) => {
+ if (!dateString) return "Not specified";
+ return new Date(dateString).toLocaleDateString("en-US", {
+ weekday: "short",
+ year: "numeric",
+ month: "short",
+ day: "numeric",
+ });
+ };
+
+ const getTotalPassengers = () => {
+ if (!flightSearchCriteria) return 0;
+ return (flightSearchCriteria.adults || 0) +
+ (flightSearchCriteria.children || 0) +
+ (flightSearchCriteria.infants || 0);
+ };
+
+ return (
+
+
+
+
+
+ Flight Route Map
+
+
+
+ {/* Map Container */}
+
+
+ {/* Flight Information Below Map */}
+ {flightSearchCriteria && (
+
+ {/* Route Summary */}
+
+
+
+ {flightSearchCriteria.originAirport || "---"}
+
+
Origin
+
+
+
+
+
+
+
+ {flightSearchCriteria.isRoundTrip && (
+ <>
+
+
+ >
+ )}
+
+
+
+
+
+ {flightSearchCriteria.destinationAirport || "---"}
+
+
Destination
+
+
+
+ {/* Flight Details Grid */}
+
+
+
+
+ Departure:
+ {formatDate(flightSearchCriteria.departureDate)}
+
+
+ {flightSearchCriteria.isRoundTrip && (
+
+
+ Return:
+ {formatDate(flightSearchCriteria.returnDate)}
+
+ )}
+
+
+
+ Passengers:
+ {getTotalPassengers()}
+
+
+
+
+
+ Class:
+
+ {flightSearchCriteria.class || "Economy"}
+
+
+
+
+ Trip Type:
+
+ {flightSearchCriteria.isRoundTrip ? "Round Trip" : "One Way"}
+
+
+
+
+
+ {/* Passenger Breakdown */}
+ {getTotalPassengers() > 0 && (
+
+
Passenger Details:
+
+ {flightSearchCriteria.adults > 0 && (
+ Adults: {flightSearchCriteria.adults}
+ )}
+ {flightSearchCriteria.children > 0 && (
+ Children: {flightSearchCriteria.children}
+ )}
+ {flightSearchCriteria.infants > 0 && (
+ Infants: {flightSearchCriteria.infants}
+ )}
+
+
+ )}
+
+ )}
+
+ {/* No Data State */}
+ {!flightSearchCriteria && (
+
+
+
+ No Flight Route to Display
+
+
+ Flight search criteria will appear here once available from the conversation.
+
+
+ )}
+
+
+
+ );
+};
diff --git a/src/components/icons/langgraph.tsx b/src/components/icons/langgraph.tsx
index 4bac592f..8c959111 100644
--- a/src/components/icons/langgraph.tsx
+++ b/src/components/icons/langgraph.tsx
@@ -1,4 +1,4 @@
-export function LangGraphLogoSVG({
+export function FlyoLogoSVG({
className,
width,
height,
@@ -11,16 +11,18 @@ export function LangGraphLogoSVG({
+
);
diff --git a/src/components/thread/MultimodalPreview.tsx b/src/components/thread/MultimodalPreview.tsx
index 0f55573a..329cf191 100644
--- a/src/components/thread/MultimodalPreview.tsx
+++ b/src/components/thread/MultimodalPreview.tsx
@@ -26,17 +26,17 @@ export const MultimodalPreview: React.FC = ({
block.mime_type.startsWith("image/")
) {
const url = `data:${block.mime_type};base64,${block.data}`;
- let imgClass: string = "rounded-md object-cover h-16 w-16 text-lg";
- if (size === "sm") imgClass = "rounded-md object-cover h-10 w-10 text-base";
- if (size === "lg") imgClass = "rounded-md object-cover h-24 w-24 text-xl";
+ let imgClass: string = "rounded-full object-cover w-12 h-12 max-w-12 max-h-12 text-lg";
+ if (size === "sm") imgClass = "rounded-full object-cover w-8 h-8 max-w-8 max-h-8 text-base";
+ if (size === "lg") imgClass = "rounded-full object-cover w-16 h-16 max-w-16 max-h-16 text-xl";
return (
-
+
{removable && (
{
+ openWidget(widgetData);
+ };
+
+ return (
+
+
+
+
+
+
+ {/* Hover tooltip */}
+
+
+
+
Complete your booking
+
+
+ Trip ID: {widgetData.tripId}
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/src/components/thread/TabsLayout.tsx b/src/components/thread/TabsLayout.tsx
new file mode 100644
index 00000000..c5fe9e5e
--- /dev/null
+++ b/src/components/thread/TabsLayout.tsx
@@ -0,0 +1,64 @@
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@radix-ui/react-tabs";
+import React from "react";
+import { MapView } from "@/components/flight/MapComponent";
+import { ItineraryView } from "@/components/flight/ItineraryComponent";
+import { Thread } from "@/components/thread/chat";
+import { useQueryState } from "nuqs";
+import { useTabContext } from "@/providers/TabContext";
+
+const tabs = [
+ {
+ name: "Chat",
+ component: ,
+ },
+ {
+ name: "Map",
+ component: ,
+ },
+ {
+ name: "Itinerary",
+ component: ,
+ },
+];
+
+export const TabsLayout = () => {
+ const [threadId, _setThreadId] = useQueryState("threadId");
+ const { activeTab, setActiveTab } = useTabContext();
+
+ const handleTabChange = (value: string) => {
+ setActiveTab(value as "Chat" | "Map" | "Itinerary");
+ };
+
+ return (
+
+
+ {threadId &&
+ tabs.map((tab, index) => (
+
+ {tab.name}
+
+ ))}
+
+ {/* Content area */}
+
+ {tabs.map((tab, index) => (
+
+ {tab.component}
+
+ ))}
+
+
+ );
+};
diff --git a/src/components/thread/agent-inbox/hooks/use-interrupted-actions.tsx b/src/components/thread/agent-inbox/hooks/use-interrupted-actions.tsx
index 3cab16a9..8399e1cb 100644
--- a/src/components/thread/agent-inbox/hooks/use-interrupted-actions.tsx
+++ b/src/components/thread/agent-inbox/hooks/use-interrupted-actions.tsx
@@ -13,6 +13,7 @@ import { toast } from "sonner";
import { HumanInterrupt, HumanResponse } from "@langchain/langgraph/prebuilt";
import { END } from "@langchain/langgraph/web";
import { useStreamContext } from "@/providers/Stream";
+import { getJwtToken, GetUserId } from "@/services/authService";
interface UseInterruptedActionsInput {
interrupt: HumanInterrupt;
@@ -82,9 +83,20 @@ export default function useInterruptedActions({
const resumeRun = (response: HumanResponse[]): boolean => {
try {
+ // Get user ID from JWT token
+ const jwtToken = getJwtToken();
+ const userId = jwtToken ? GetUserId(jwtToken) : null;
+
+ // Include userId in the submission data
+ const submissionData: any = {};
+ if (userId) {
+ submissionData.userId = userId;
+ }
+
thread.submit(
- {},
+ submissionData,
{
+ streamSubgraphs: true,
command: {
resume: response,
},
@@ -256,6 +268,7 @@ export default function useInterruptedActions({
thread.submit(
{},
{
+ streamSubgraphs: true,
command: {
goto: END,
},
diff --git a/src/components/thread/chat.tsx b/src/components/thread/chat.tsx
new file mode 100644
index 00000000..4bbd062d
--- /dev/null
+++ b/src/components/thread/chat.tsx
@@ -0,0 +1,595 @@
+import { v4 as uuidv4 } from "uuid";
+import { FormEvent, useEffect, useRef, useState } from "react";
+import { motion } from "framer-motion";
+import { cn } from "@/lib/utils";
+import { useStreamContext } from "@/providers/Stream";
+import { Button } from "../ui/button";
+import { Checkpoint, Message } from "@langchain/langgraph-sdk";
+import { AssistantMessage, AssistantMessageLoading } from "./messages/ai";
+import { HumanMessage } from "./messages/human";
+import {
+ DO_NOT_RENDER_ID_PREFIX,
+ ensureToolCallsHaveResponses,
+} from "@/lib/ensure-tool-responses";
+import { FlyoLogoSVG } from "../icons/langgraph";
+import { TooltipIconButton } from "./tooltip-icon-button";
+import {
+ LoaderCircle,
+ PanelRightClose,
+ PanelRightOpen,
+ Plus,
+ SquarePen,
+ XIcon,
+} from "lucide-react";
+import { parseAsBoolean, useQueryState } from "nuqs";
+
+import ThreadHistory from "./history";
+import { toast } from "sonner";
+import { useMediaQuery } from "@/hooks/useMediaQuery";
+import { Label } from "../ui/label";
+import { useFileUpload } from "@/hooks/use-file-upload";
+import { ContentBlocksPreview } from "./ContentBlocksPreview";
+import {
+ ArtifactContent,
+ ArtifactTitle,
+ useArtifactContext,
+ useArtifactOpen,
+} from "./artifact";
+import { LogoutButton } from "@/components/auth";
+import { getJwtToken, GetUserId } from "@/services/authService";
+import { updateThreadWithMessage } from "@/utils/thread-storage";
+import { InterruptManager } from "./messages/interrupt-manager";
+import { PersistentInterruptList } from "./messages/persistent-interrupt";
+import { useInterruptPersistenceContext } from "@/providers/InterruptPersistenceContext";
+import {
+ GenericInterruptView,
+ UIWidgetPreserver,
+} from "./messages/generic-interrupt";
+import { NonAgentFlowReopenButton } from "./NonAgentFlowReopenButton";
+
+// Add this utility function to filter out tool call messages with empty content
+function isDisplayableMessage(m: Message) {
+ if (m.id?.startsWith(DO_NOT_RENDER_ID_PREFIX)) return false;
+ // Hide tool call messages with empty content
+ if (
+ (m.type === "ai" &&
+ (!m.content ||
+ (Array.isArray(m.content) && m.content.length === 0) ||
+ m.content === "") &&
+ m.tool_calls &&
+ m.tool_calls.length > 0) ||
+ m.type === "tool"
+ ) {
+ return false;
+ }
+
+ return true;
+}
+
+export function Thread() {
+ const [artifactContext, setArtifactContext] = useArtifactContext();
+ const interruptPersistence = useInterruptPersistenceContext();
+ const [artifactOpen, closeArtifact] = useArtifactOpen();
+
+ const [threadId, _setThreadId] = useQueryState("threadId");
+ const [assistantId] = useQueryState("assistantId");
+ const [chatHistoryOpen, setChatHistoryOpen] = useQueryState(
+ "chatHistoryOpen",
+ parseAsBoolean.withDefault(false),
+ );
+ const [hideToolCalls, setHideToolCalls] = useQueryState(
+ "hideToolCalls",
+ parseAsBoolean.withDefault(false),
+ );
+ const [input, setInput] = useState("");
+ const {
+ contentBlocks,
+ setContentBlocks,
+ handleFileUpload,
+ dropRef,
+ removeBlock,
+ resetBlocks,
+ dragOver,
+ handlePaste,
+ } = useFileUpload();
+ const [firstTokenReceived, setFirstTokenReceived] = useState(false); //TODO: remove if not needed
+ const isLargeScreen = useMediaQuery("(min-width: 1024px)");
+
+ const stream = useStreamContext();
+ const messages = stream.messages;
+ const isLoading = stream.isLoading;
+
+ // Track the last threadId to reset displayMessages on thread switch
+ const lastThreadId = useRef(threadId);
+ useEffect(() => {
+ lastThreadId.current = threadId;
+ }, [threadId, messages]);
+
+ // Optionally clear input and contentBlocks when threadId changes
+ useEffect(() => {
+ setInput("");
+ setContentBlocks([]);
+ if (threadId === null) {
+ // setDisplayMessages([]); // Remove this line //TODO: come back here
+ }
+ }, [threadId, setContentBlocks]);
+
+ const lastError = useRef(undefined);
+
+ const setThreadId = (id: string | null) => {
+ _setThreadId(id);
+
+ // close artifact and reset artifact context
+ closeArtifact();
+ setArtifactContext({});
+ };
+
+ useEffect(() => {
+ if (!stream.error) {
+ lastError.current = undefined;
+ return;
+ }
+ try {
+ const message = (stream.error as any).message;
+ if (!message || lastError.current === message) {
+ // Message has already been logged. do not modify ref, return early.
+ return;
+ }
+
+ // Message is defined, and it has not been logged yet. Save it, and send the error
+ lastError.current = message;
+ toast.error("An error occurred. Please try again.", {
+ description: (
+
+ Error: {message}
+
+ ),
+ richColors: true,
+ closeButton: true,
+ });
+ } catch {
+ // no-op
+ }
+ }, [stream.error]);
+
+ // TODO: this should be part of the useStream hook
+ const prevMessageLength = useRef(0);
+ useEffect(() => {
+ if (
+ messages.length !== prevMessageLength.current &&
+ messages?.length &&
+ messages[messages.length - 1].type === "ai"
+ ) {
+ setFirstTokenReceived(true);
+ }
+
+ prevMessageLength.current = messages.length;
+ }, [messages]);
+
+ const handleSubmit = (e: FormEvent) => {
+ e.preventDefault();
+ if ((input.trim().length === 0 && contentBlocks.length === 0) || isLoading)
+ return;
+ setFirstTokenReceived(false);
+
+ // Get user ID from JWT token
+ const jwtToken = getJwtToken();
+ const userId = jwtToken ? GetUserId(jwtToken) : null;
+
+ const newHumanMessage: Message = {
+ id: uuidv4(),
+ type: "human",
+ content: [
+ ...(input.trim().length > 0 ? [{ type: "text", text: input }] : []),
+ ...contentBlocks,
+ ] as Message["content"],
+ };
+
+ const toolMessages = ensureToolCallsHaveResponses(stream.messages);
+
+ const context =
+ Object.keys(artifactContext).length > 0 ? artifactContext : undefined;
+
+ // Include userId in the submission
+ const submissionData: any = {
+ messages: [...toolMessages, newHumanMessage],
+ context,
+ };
+
+ if (userId) {
+ submissionData.userId = userId;
+ }
+
+ // Add metadata to ensure thread is properly saved and searchable
+ const submitOptions: any = {
+ streamMode: ["updates"],
+ streamSubgraphs: true,
+ optimisticValues: (prev: any) => ({
+ ...prev,
+ context,
+ messages: [...(prev.messages ?? []), ...toolMessages, newHumanMessage],
+ ui: prev.ui ?? [], // Preserve UI state
+ }),
+ };
+
+ // Add metadata for thread creation/updating
+ if (!threadId) {
+ // For new threads, add metadata to ensure they're searchable
+ submitOptions.metadata = {
+ assistant_id: assistantId,
+ graph_id: assistantId,
+ created_at: new Date().toISOString(),
+ user_id: userId || "anonymous",
+ };
+ }
+
+ console.log("Submitting with options:", submitOptions);
+
+ // Store thread information locally for fallback
+ const messageText =
+ typeof newHumanMessage.content === "string"
+ ? newHumanMessage.content
+ : Array.isArray(newHumanMessage.content)
+ ? newHumanMessage.content.find((c) => c.type === "text")?.text || ""
+ : "";
+
+ if (messageText && assistantId) {
+ // Update local storage with thread info
+ if (threadId) {
+ updateThreadWithMessage(
+ threadId,
+ messageText,
+ assistantId,
+ userId ? String(userId) : undefined,
+ );
+ } else {
+ // For new threads, we'll update after getting the thread ID from onThreadId callback
+ console.log("Will update local storage after thread ID is assigned");
+ }
+ }
+
+ stream.submit(submissionData, submitOptions);
+
+ setInput("");
+ setContentBlocks([]);
+ };
+
+ const handleRegenerate = (
+ parentCheckpoint: Checkpoint | null | undefined,
+ ) => {
+ // Do this so the loading state is correct
+ prevMessageLength.current = prevMessageLength.current - 1;
+ setFirstTokenReceived(false);
+ stream.submit(undefined, {
+ checkpoint: parentCheckpoint,
+ streamMode: ["updates"],
+ streamSubgraphs: true,
+ optimisticValues: (prev: any) => ({
+ ...prev,
+ ui: prev.ui ?? [], // Preserve UI state
+ }),
+ });
+ };
+
+ const chatStarted = !!threadId || !!messages.length;
+ const hasNoAIOrToolMessages = !messages.find(
+ (m: any) => m.type === "ai" || m.type === "tool",
+ );
+
+ return (
+
+
+
+
+
+
+
+
+ {!chatStarted ? (
+ // New thread layout - centered content
+
+ {/* Centered Logo */}
+
+
+
+
+ {/* Centered Chat Input */}
+
+
+ ) : (
+ // Chat started layout - messages at top, input at bottom
+ <>
+ {/* Messages Area */}
+
+
+ {messages
+ .filter(isDisplayableMessage)
+ .flatMap((message: any, index: number) => {
+ const messageElement =
+ message.type === "human" ? (
+
+ ) : (
+
+ );
+
+ // Check if there are any persisted interrupts associated with this message
+ const messageInterrupts = message.id
+ ? interruptPersistence.getInterruptsForMessage(
+ message.id,
+ )
+ : [];
+
+ // Return array of elements: message + persistent interrupts
+ const elements = [messageElement];
+
+ if (messageInterrupts.length > 0) {
+ elements.push(
+
,
+ );
+ }
+
+ return elements;
+ })}
+ {/* Special rendering case where there are no AI/tool messages, but there is an interrupt. */}
+ {hasNoAIOrToolMessages && !!stream.interrupt && (
+
+ )}
+ {(() => {
+ console.log(
+ "🔍 Stream interrupt 2:",
+ JSON.stringify(stream.values.ui),
+ );
+ return null;
+ })()}
+ {isLoading &&
}
+ {/* Always render the interrupt widget at the end if present */}
+ {stream.interrupt && (
+
+ )}
+
+
+
+ {/* Chat Input Area - Bottom */}
+
+
+
+
+ setInput(e.target.value)}
+ onPaste={handlePaste}
+ onKeyDown={(e) => {
+ if (
+ e.key === "Enter" &&
+ !e.shiftKey &&
+ !e.metaKey &&
+ !e.nativeEvent.isComposing
+ ) {
+ e.preventDefault();
+ const el = e.target as HTMLElement | undefined;
+ const form = el?.closest("form");
+ form?.requestSubmit();
+ }
+ }}
+ placeholder="Type your message..."
+ className="field-sizing-content resize-none border-none bg-transparent p-2 pb-0 shadow-none ring-0 outline-none focus:ring-0 focus:outline-none"
+ />
+
+
+
+ {stream.isLoading ? (
+ stream.stop()}
+ className="ml-auto"
+ >
+
+ Cancel
+
+ ) : (
+
+ Send
+
+ )}
+
+
+
+
+ >
+ )}
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/thread/history/index.tsx b/src/components/thread/history/index.tsx
index c2e00838..fc9a5793 100644
--- a/src/components/thread/history/index.tsx
+++ b/src/components/thread/history/index.tsx
@@ -4,16 +4,19 @@ import { Thread } from "@langchain/langgraph-sdk";
import { useEffect } from "react";
import { getContentString } from "../utils";
-import { useQueryState, parseAsBoolean } from "nuqs";
+import { parseAsBoolean, useQueryState } from "nuqs";
import {
Sheet,
SheetContent,
+ SheetFooter,
SheetHeader,
SheetTitle,
} from "@/components/ui/sheet";
import { Skeleton } from "@/components/ui/skeleton";
-import { PanelRightOpen, PanelRightClose } from "lucide-react";
+import { PanelRightClose, PanelRightOpen, SquarePen } from "lucide-react";
import { useMediaQuery } from "@/hooks/useMediaQuery";
+import LogoutButton from "@/components/auth/LogoutButton";
+import { useRouter, useSearchParams } from "next/navigation";
function ThreadList({
threads,
@@ -82,6 +85,10 @@ export default function ThreadHistory() {
parseAsBoolean.withDefault(false),
);
+ const [threadId, _setThreadId] = useQueryState("threadId");
+
+ const router = useRouter();
+
const { getThreads, threads, setThreads, threadsLoading, setThreadsLoading } =
useThreads();
@@ -92,12 +99,14 @@ export default function ThreadHistory() {
.then(setThreads)
.catch(console.error)
.finally(() => setThreadsLoading(false));
- }, []);
+ }, [getThreads, setThreads, setThreadsLoading]);
+
+ const searchParams = useSearchParams();
return (
<>
-
+
)}
-
- Thread History
-
+ Chat History
+
+
+
+ {
+ // Clone the current params and remove threadId
+ const params = new URLSearchParams(searchParams.toString());
+ params.delete('threadId');
+
+ // Update URL without reloading
+ router.replace(`${window.location.pathname}?${params.toString()}`);
+ // Close history panel
+ setChatHistoryOpen(false);
+ _setThreadId(null);
+ }}
+ className="text-foreground h-11 w-full justify-start gap-3 font-medium"
+ variant="outline"
+ >
+ New Chat
+
+
+
+ {/* Thread List - Now takes remaining space */}
+
+ {threadsLoading ? (
+
+ ) : (
+
+ )}
+
+
+ {/* Logout Button at Bottom */}
+
+
- {threadsLoading ? (
-
- ) : (
-
- )}
-
- Thread History
+
+ Chats
- setChatHistoryOpen((o) => !o)}
- />
+
+ {/* New Chat Button */}
+ {
+ // Clone the current params and remove threadId
+ const params = new URLSearchParams(searchParams.toString());
+ params.delete('threadId');
+
+ // Update URL without reloading
+ router.replace(`${window.location.pathname}?${params.toString()}`);
+ // Close history panel
+ setChatHistoryOpen(false);
+ _setThreadId(null);
+
+ }}
+ >
+
+ New chat
+
+
+ {/* Thread List - Takes remaining space */}
+
+ setChatHistoryOpen((o) => !o)}
+ />
+
+
+ {/* Logout Button at Bottom */}
+
+
+
diff --git a/src/components/thread/index.tsx b/src/components/thread/index.tsx
index d52a1594..7d6652ce 100644
--- a/src/components/thread/index.tsx
+++ b/src/components/thread/index.tsx
@@ -1,9 +1,8 @@
import { v4 as uuidv4 } from "uuid";
-import { ReactNode, useEffect, useRef } from "react";
+import { FormEvent, ReactNode, useEffect, useRef, useState } from "react";
import { motion } from "framer-motion";
import { cn } from "@/lib/utils";
import { useStreamContext } from "@/providers/Stream";
-import { useState, FormEvent } from "react";
import { Button } from "../ui/button";
import { Checkpoint, Message } from "@langchain/langgraph-sdk";
import { AssistantMessage, AssistantMessageLoading } from "./messages/ai";
@@ -12,40 +11,38 @@ import {
DO_NOT_RENDER_ID_PREFIX,
ensureToolCallsHaveResponses,
} from "@/lib/ensure-tool-responses";
-import { LangGraphLogoSVG } from "../icons/langgraph";
+import { FlyoLogoSVG } from "../icons/langgraph";
import { TooltipIconButton } from "./tooltip-icon-button";
import {
ArrowDown,
LoaderCircle,
- PanelRightOpen,
PanelRightClose,
+ PanelRightOpen,
+ Plus,
SquarePen,
XIcon,
- Plus,
- CircleX,
} from "lucide-react";
-import { useQueryState, parseAsBoolean } from "nuqs";
+import { parseAsBoolean, useQueryState } from "nuqs";
import { StickToBottom, useStickToBottomContext } from "use-stick-to-bottom";
import ThreadHistory from "./history";
import { toast } from "sonner";
import { useMediaQuery } from "@/hooks/useMediaQuery";
import { Label } from "../ui/label";
-import { Switch } from "../ui/switch";
-import { GitHubSVG } from "../icons/github";
-import {
- Tooltip,
- TooltipContent,
- TooltipProvider,
- TooltipTrigger,
-} from "../ui/tooltip";
import { useFileUpload } from "@/hooks/use-file-upload";
import { ContentBlocksPreview } from "./ContentBlocksPreview";
import {
- useArtifactOpen,
ArtifactContent,
ArtifactTitle,
useArtifactContext,
+ useArtifactOpen,
} from "./artifact";
+import { getJwtToken, GetUserId } from "@/services/authService";
+import { updateThreadWithMessage } from "@/utils/thread-storage";
+import { InterruptManager } from "./messages/interrupt-manager";
+import { PersistentInterruptList } from "./messages/persistent-interrupt";
+import { useInterruptPersistenceContext } from "@/providers/InterruptPersistenceContext";
+import { GenericInterruptView } from "./messages/generic-interrupt";
+import { NonAgentFlowReopenButton } from "./NonAgentFlowReopenButton";
function StickyToBottomContent(props: {
content: ReactNode;
@@ -88,35 +85,32 @@ function ScrollToBottom(props: { className?: string }) {
);
}
-function OpenGitHubRepo() {
- return (
-
-
-
-
-
-
-
-
- Open GitHub repo
-
-
-
- );
+// Add this utility function to filter out tool call messages with empty content
+function isDisplayableMessage(m: Message) {
+ if (m.id?.startsWith(DO_NOT_RENDER_ID_PREFIX)) return false;
+ // Hide tool call messages with empty content
+ if (
+ (m.type === "ai" &&
+ (!m.content ||
+ (Array.isArray(m.content) && m.content.length === 0) ||
+ m.content === "") &&
+ m.tool_calls &&
+ m.tool_calls.length > 0) ||
+ m.type === "tool"
+ ) {
+ return false;
+ }
+
+ return true;
}
export function Thread() {
const [artifactContext, setArtifactContext] = useArtifactContext();
+ const interruptPersistence = useInterruptPersistenceContext();
const [artifactOpen, closeArtifact] = useArtifactOpen();
const [threadId, _setThreadId] = useQueryState("threadId");
+ const [assistantId] = useQueryState("assistantId");
const [chatHistoryOpen, setChatHistoryOpen] = useQueryState(
"chatHistoryOpen",
parseAsBoolean.withDefault(false),
@@ -136,13 +130,28 @@ export function Thread() {
dragOver,
handlePaste,
} = useFileUpload();
- const [firstTokenReceived, setFirstTokenReceived] = useState(false);
+ const [firstTokenReceived, setFirstTokenReceived] = useState(false); //TODO: remove if not needed
const isLargeScreen = useMediaQuery("(min-width: 1024px)");
const stream = useStreamContext();
const messages = stream.messages;
const isLoading = stream.isLoading;
+ // Track the last threadId to reset displayMessages on thread switch
+ const lastThreadId = useRef
(threadId);
+ useEffect(() => {
+ lastThreadId.current = threadId;
+ }, [threadId, messages]);
+
+ // Optionally clear input and contentBlocks when threadId changes
+ useEffect(() => {
+ setInput("");
+ setContentBlocks([]);
+ if (threadId === null) {
+ // setDisplayMessages([]); // Remove this line //TODO: come back here
+ }
+ }, [threadId, setContentBlocks]);
+
const lastError = useRef(undefined);
const setThreadId = (id: string | null) => {
@@ -201,6 +210,10 @@ export function Thread() {
return;
setFirstTokenReceived(false);
+ // Get user ID from JWT token
+ const jwtToken = getJwtToken();
+ const userId = jwtToken ? GetUserId(jwtToken) : null;
+
const newHumanMessage: Message = {
id: uuidv4(),
type: "human",
@@ -215,21 +228,64 @@ export function Thread() {
const context =
Object.keys(artifactContext).length > 0 ? artifactContext : undefined;
- stream.submit(
- { messages: [...toolMessages, newHumanMessage], context },
- {
- streamMode: ["values"],
- optimisticValues: (prev) => ({
- ...prev,
- context,
- messages: [
- ...(prev.messages ?? []),
- ...toolMessages,
- newHumanMessage,
- ],
- }),
- },
- );
+ // Include userId in the submission
+ const submissionData: any = {
+ messages: [...toolMessages, newHumanMessage],
+ context,
+ };
+
+ if (userId) {
+ submissionData.userId = userId;
+ }
+
+ // Add metadata to ensure thread is properly saved and searchable
+ const submitOptions: any = {
+ streamMode: ["updates"],
+ streamSubgraphs: true,
+ optimisticValues: (prev: any) => ({
+ ...prev,
+ context,
+ messages: [...(prev.messages ?? []), ...toolMessages, newHumanMessage],
+ }),
+ };
+
+ // Add metadata for thread creation/updating
+ if (!threadId) {
+ // For new threads, add metadata to ensure they're searchable
+ submitOptions.metadata = {
+ assistant_id: assistantId,
+ graph_id: assistantId,
+ created_at: new Date().toISOString(),
+ user_id: userId || "anonymous",
+ };
+ }
+
+ console.log("Submitting with options:", submitOptions);
+
+ // Store thread information locally for fallback
+ const messageText =
+ typeof newHumanMessage.content === "string"
+ ? newHumanMessage.content
+ : Array.isArray(newHumanMessage.content)
+ ? newHumanMessage.content.find((c) => c.type === "text")?.text || ""
+ : "";
+
+ if (messageText && assistantId) {
+ // Update local storage with thread info
+ if (threadId) {
+ updateThreadWithMessage(
+ threadId,
+ messageText,
+ assistantId,
+ userId ? String(userId) : undefined,
+ );
+ } else {
+ // For new threads, we'll update after getting the thread ID from onThreadId callback
+ console.log("Will update local storage after thread ID is assigned");
+ }
+ }
+
+ stream.submit(submissionData, submitOptions);
setInput("");
setContentBlocks([]);
@@ -242,95 +298,74 @@ export function Thread() {
prevMessageLength.current = prevMessageLength.current - 1;
setFirstTokenReceived(false);
stream.submit(undefined, {
+ streamSubgraphs: true,
checkpoint: parentCheckpoint,
- streamMode: ["values"],
+ streamMode: ["updates"],
});
};
const chatStarted = !!threadId || !!messages.length;
const hasNoAIOrToolMessages = !messages.find(
- (m) => m.type === "ai" || m.type === "tool",
+ (m: any) => m.type === "ai" || m.type === "tool",
);
return (
-
-
-
-
-
-
- {!chatStarted && (
-
-
- {(!chatHistoryOpen || !isLargeScreen) && (
-
setChatHistoryOpen((p) => !p)}
- >
- {chatHistoryOpen ? (
-
- ) : (
-
- )}
-
- )}
-
-
-
-
-
- )}
- {chatStarted && (
-
-
-
+
+ {!chatStarted && (
+
+
{(!chatHistoryOpen || !isLargeScreen) && (
)}
-
setThreadId(null)}
- animate={{
- marginLeft: !chatHistoryOpen ? 48 : 0,
- }}
- transition={{
- type: "spring",
- stiffness: 300,
- damping: 30,
- }}
- >
-
-
- Agent Chat
-
-
+ )}
+ {chatStarted && (
+
+
+
+ {(!chatHistoryOpen || !isLargeScreen) && (
+
setChatHistoryOpen((p) => !p)}
+ >
+ {chatHistoryOpen ? (
+
+ ) : (
+
+ )}
+
+ )}
+
+
-
-
-
+
+ setThreadId(null)}
+ >
+
+
-
setThreadId(null)}
- >
-
-
-
-
-
- )}
+
+
+ )}
-
-
- {messages
- .filter((m) => !m.id?.startsWith(DO_NOT_RENDER_ID_PREFIX))
- .map((message, index) =>
- message.type === "human" ? (
-
- ) : (
-
- ),
- )}
- {/* Special rendering case where there are no AI/tool messages, but there is an interrupt.
- We need to render it outside of the messages list, since there are no messages to render */}
- {hasNoAIOrToolMessages && !!stream.interrupt && (
-
+
+ {messages
+ .filter(isDisplayableMessage)
+ .flatMap((message: any, index: number) => {
+ const messageElement =
+ message.type === "human" ? (
+
+ ) : (
+
- )}
- {isLoading && !firstTokenReceived && (
-
- )}
- >
- }
- footer={
-
- {!chatStarted && (
-
-
-
- Agent Chat
-
-
- )}
+ />
+ );
-
+ // Check if there are any persisted interrupts associated with this message
+ const messageInterrupts = message.id
+ ? interruptPersistence.getInterruptsForMessage(
+ message.id,
+ )
+ : [];
-
-
- 0) {
+ elements.push(
+ ,
+ );
+ }
+
+ return elements;
+ })}
+ {/* Special rendering case where there are no AI/tool messages, but there is an interrupt. */}
+ {hasNoAIOrToolMessages && !!stream.interrupt && (
+
- setInput(e.target.value)}
- onPaste={handlePaste}
- onKeyDown={(e) => {
- if (
- e.key === "Enter" &&
- !e.shiftKey &&
- !e.metaKey &&
- !e.nativeEvent.isComposing
- ) {
- e.preventDefault();
- const el = e.target as HTMLElement | undefined;
- const form = el?.closest("form");
- form?.requestSubmit();
- }
- }}
- placeholder="Type your message..."
- className="field-sizing-content resize-none border-none bg-transparent p-3.5 pb-0 shadow-none ring-0 outline-none focus:ring-0 focus:outline-none"
+ )}
+ {isLoading && }
+ {/* Always render the interrupt widget at the end if present */}
+ {console.log("🔍 Stream interrupt 1:", JSON.stringify(stream.values.ui))}
+ {stream.interrupt && (
+
+ )}
+ >
+ }
+ footer={
+
+ {!chatStarted && (
+
+
+
+ )}
-
-
+
+
+
+
+
+ setInput(e.target.value)}
+ onPaste={handlePaste}
+ onKeyDown={(e) => {
+ if (
+ e.key === "Enter" &&
+ !e.shiftKey &&
+ !e.metaKey &&
+ !e.nativeEvent.isComposing
+ ) {
+ e.preventDefault();
+ const el = e.target as HTMLElement | undefined;
+ const form = el?.closest("form");
+ form?.requestSubmit();
+ }
+ }}
+ placeholder="Type your message..."
+ className="field-sizing-content resize-none border-none bg-transparent p-3.5 pb-0 shadow-none ring-0 outline-none focus:ring-0 focus:outline-none"
+ />
+
+
+ {/*
-
-
-
- Upload PDF or Image
-
-
-
- {stream.isLoading ? (
-
stream.stop()}
- className="ml-auto"
+ */}
+
-
- Cancel
-
- ) : (
-
- Send
-
- )}
-
-
+
+
+ Upload PDF, Image, or Video
+
+
+
+ {stream.isLoading ? (
+
stream.stop()}
+ className="ml-auto"
+ >
+
+ Cancel
+
+ ) : (
+
+ Send
+
+ )}
+
+
+
-
- }
- />
-
-
-
+
);
}
diff --git a/src/components/thread/markdown-styles.css b/src/components/thread/markdown-styles.css
index 759182d3..8d1ec8db 100644
--- a/src/components/thread/markdown-styles.css
+++ b/src/components/thread/markdown-styles.css
@@ -43,3 +43,73 @@
.markdown-content tr:nth-child(even) {
background-color: #f9f9f9;
}
+
+/* Image styling - small circular icons */
+.markdown-content img {
+ max-width: 48px;
+ width: 48px;
+ height: 48px;
+ max-height: 48px;
+ border-radius: 50%;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ margin: 0.5rem;
+ display: inline-block;
+ object-fit: cover;
+}
+
+/* Responsive image sizing for smaller screens */
+@media (max-width: 768px) {
+ .markdown-content img {
+ max-width: 40px;
+ width: 40px;
+ height: 40px;
+ max-height: 40px;
+ }
+}
+
+@media (max-width: 480px) {
+ .markdown-content img {
+ max-width: 32px;
+ width: 32px;
+ height: 32px;
+ max-height: 32px;
+ }
+}
+
+/* Additional image controls for any missed cases */
+.markdown-content [data-image],
+.markdown-content picture,
+.markdown-content figure img {
+ max-width: 48px;
+ width: 48px;
+ height: 48px;
+ max-height: 48px;
+ object-fit: cover;
+ border-radius: 50%;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ margin: 0.5rem;
+ display: inline-block;
+}
+
+/* Responsive sizing for additional image elements */
+@media (max-width: 768px) {
+ .markdown-content [data-image],
+ .markdown-content picture,
+ .markdown-content figure img {
+ max-width: 40px;
+ width: 40px;
+ height: 40px;
+ max-height: 40px;
+ }
+}
+
+@media (max-width: 480px) {
+ .markdown-content [data-image],
+ .markdown-content picture,
+ .markdown-content figure img {
+ max-width: 32px;
+ width: 32px;
+ height: 32px;
+ max-height: 32px;
+ }
+}
diff --git a/src/components/thread/markdown-text.tsx b/src/components/thread/markdown-text.tsx
index d93fa65b..152eef6a 100644
--- a/src/components/thread/markdown-text.tsx
+++ b/src/components/thread/markdown-text.tsx
@@ -202,6 +202,16 @@ const defaultComponents: any = {
{...props}
/>
),
+ img: ({ className, alt, ...props }: { className?: string; alt?: string }) => (
+
+ ),
code: ({
className,
children,
diff --git a/src/components/thread/messages/ai.tsx b/src/components/thread/messages/ai.tsx
index af5eac2c..d08bc0d4 100644
--- a/src/components/thread/messages/ai.tsx
+++ b/src/components/thread/messages/ai.tsx
@@ -8,11 +8,11 @@ import { LoadExternalComponent } from "@langchain/langgraph-sdk/react-ui";
import { cn } from "@/lib/utils";
import { ToolCalls, ToolResult } from "./tool-calls";
import { MessageContentComplex } from "@langchain/core/messages";
-import { Fragment } from "react/jsx-runtime";
+import { Fragment } from "react";
import { isAgentInboxInterruptSchema } from "@/lib/agent-inbox-interrupt";
import { ThreadView } from "../agent-inbox";
import { useQueryState, parseAsBoolean } from "nuqs";
-import { GenericInterruptView } from "./generic-interrupt";
+// import { GenericInterruptView } from "./generic-interrupt";
import { useArtifact } from "../artifact";
function CustomComponent({
@@ -25,16 +25,16 @@ function CustomComponent({
const artifact = useArtifact();
const { values } = useStreamContext();
const customComponents = values.ui?.filter(
- (ui) => ui.metadata?.message_id === message.id,
+ (ui: any) => ui.metadata?.message_id === message.id,
);
if (!customComponents?.length) return null;
return (
- {customComponents.map((customComponent) => (
+ {customComponents.map((customComponent: any) => (
@@ -84,11 +84,12 @@ function Interrupt({
(isLastMessage || hasNoAIOrToolMessages) && (
)}
- {interruptValue &&
+ {/* Todo: @Shubham removed this to avoid duplicate rendering of Interrupt */}
+ {/* {interruptValue &&
!isAgentInboxInterruptSchema(interruptValue) &&
isLastMessage ? (
- ) : null}
+ ) : null} */}
>
);
}
@@ -110,10 +111,12 @@ export function AssistantMessage({
);
const thread = useStreamContext();
+
const isLastMessage =
- thread.messages[thread.messages.length - 1].id === message?.id;
+ thread.messages.length > 0 &&
+ thread.messages[thread.messages.length - 1]?.id === message?.id;
const hasNoAIOrToolMessages = !thread.messages.find(
- (m) => m.type === "ai" || m.type === "tool",
+ (m: any) => m.type === "ai" || m.type === "tool",
);
const meta = message ? thread.getMessagesMetadata(message) : undefined;
const threadInterrupt = thread.interrupt;
@@ -180,11 +183,6 @@ export function AssistantMessage({
thread={thread}
/>
)}
-
-
-
-
-
+
+ {/* Loader Bubble */}
+
+
+ {/*
Agent is thinking... */}
+
+
+
+
+
+
+ {/*
+ Agent is thinking...
+ */}
);
diff --git a/src/components/thread/messages/generic-interrupt.tsx b/src/components/thread/messages/generic-interrupt.tsx
index 7eb83ebd..aa375b23 100644
--- a/src/components/thread/messages/generic-interrupt.tsx
+++ b/src/components/thread/messages/generic-interrupt.tsx
@@ -1,6 +1,266 @@
-import { useState } from "react";
+import { useState, useEffect } from "react";
import { motion, AnimatePresence } from "framer-motion";
import { ChevronDown, ChevronUp } from "lucide-react";
+import { componentMap, ComponentType } from "@/components/widgets";
+import { DebugPanel } from "@/components/debug/DebugPanel";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet";
+import { useStreamContext } from "@/providers/Stream";
+import { LoadExternalComponent } from "@langchain/langgraph-sdk/react-ui";
+import { useArtifact } from "../artifact";
+import { useTabContext } from "@/providers/TabContext";
+import { useItineraryWidget } from "@/providers/ItineraryWidgetContext";
+
+// Debug utility function
+const debugLog = (message: string, data?: any) => {
+ if (process.env.NODE_ENV === "development") {
+ console.group(`🐛 Interrupt Debug: ${message}`);
+ if (data !== undefined) {
+ console.log(data);
+ }
+ console.trace();
+ console.groupEnd();
+ }
+};
+
+interface DynamicRendererProps {
+ interruptType: string;
+ interrupt: Record
;
+}
+
+// State to preserve UI widgets during interrupt processing
+const preservedUIWidgets = new Map();
+
+// Component to monitor and preserve UI widgets
+export const UIWidgetPreserver: React.FC = () => {
+ const stream = useStreamContext();
+
+ useEffect(() => {
+ if (stream.values.ui) {
+ stream.values.ui.forEach((uiWidget: any) => {
+ // Preserve by both id and message_id
+ if (uiWidget.id) {
+ preservedUIWidgets.set(uiWidget.id, uiWidget);
+ }
+ if (uiWidget.metadata?.message_id) {
+ preservedUIWidgets.set(uiWidget.metadata.message_id, uiWidget);
+ }
+ console.log(
+ "🔍 Preserved UI widget:",
+ uiWidget.id,
+ uiWidget.metadata?.message_id,
+ );
+ });
+ }
+ }, [stream.values.ui]);
+
+ return null; // This component doesn't render anything
+};
+
+// Wrapper component for TravelerDetailsWidget with bottom sheet
+const TravelerDetailsBottomSheet: React.FC<{ apiData: any; args: any }> = ({
+ apiData,
+ args,
+}) => {
+ console.log('args:', JSON.stringify(args.bookingRequirements,null,2));
+ const [isOpen, setIsOpen] = useState(true);
+
+ // Get the actual ReviewWidget component
+ const ReviewWidget = componentMap.TravelerDetailsWidget;
+
+ // Function to close the bottom sheet
+ const handleClose = () => {
+ setIsOpen(false);
+ };
+
+ return (
+
+ );
+};
+
+// Wrapper component for NonAgentFlowWidget with bottom sheet
+const NonAgentFlowBottomSheet: React.FC<{ apiData: any; args: any }> = ({
+ apiData,
+ args,
+}) => {
+ // Get the actual NonAgentFlowWidget component
+ const NonAgentFlowWidget = componentMap.NonAgentFlowWidget;
+
+ return (
+
+ );
+};
+
+console.log("DynamicRendererProps interface defined - checking props:", {
+ interruptType: "will be logged in component",
+ interrupt: "will be logged in component",
+});
+
+export const DynamicRenderer: React.FC = ({
+ interruptType,
+ interrupt,
+}) => {
+ // Always call hooks at the top level
+ const stream = useStreamContext();
+ const artifact = useArtifact();
+ const { switchToItinerary } = useTabContext();
+ const { addWidget } = useItineraryWidget();
+
+ console.log("🔄 STREAMING DATA - DynamicRenderer received:", {
+ interruptType,
+ interrupt,
+ timestamp: new Date().toISOString(),
+ });
+ debugLog("DynamicRenderer called", { interruptType, interrupt });
+
+ // Additional debugging for widget type checking
+ console.log("🔍 Widget type check:", {
+ interruptType,
+ widgetType: interrupt.value?.widget?.type,
+ attachmentId: interrupt.value?.metadata?.attachmentId,
+ availableWidgets: Object.keys(componentMap),
+ isWidgetTypeInMap: interrupt.value?.widget?.type in componentMap,
+ });
+
+ // Handle widgetFromBE interrupt type
+ if (interruptType === "widgetFromBE") {
+ const attachmentId = interrupt.value?.metadata?.attachmentId;
+
+ if (attachmentId) {
+
+ // First try to find in current UI widgets
+ let matchingUIWidget = stream.values.ui?.find(
+ (ui: any) =>
+ ui.id === attachmentId || ui.metadata?.message_id === attachmentId,
+ );
+
+ // If not found in current UI widgets, try preserved widgets
+ if (!matchingUIWidget) {
+ matchingUIWidget = preservedUIWidgets.get(attachmentId);
+ console.log("🔍 Checking preserved widgets for:", attachmentId);
+ console.log("🔍 Found in preserved widgets:", matchingUIWidget);
+ }
+
+ console.log("🔍 All UI widgets:", JSON.stringify(stream.values.ui));
+ console.log(
+ "🔍 Preserved widgets:",
+ Array.from(preservedUIWidgets.keys()),
+ );
+ console.log("🔍 Looking for attachmentId:", attachmentId);
+ console.log("🔍 Matching widget found:", matchingUIWidget);
+
+ if (matchingUIWidget) {
+ debugLog("WidgetFromBE UI widget found", {
+ attachmentId,
+ uiWidget: matchingUIWidget,
+ });
+
+ return (
+
+ );
+ }
+
+ debugLog("No widgetFromBE UI widget found", { attachmentId, interrupt });
+ console.log(
+ `No widgetFromBE UI widget found for attachmentId: ${attachmentId} and interrupt: ${JSON.stringify(interrupt)}`,
+ );
+ return null;
+ }
+
+ debugLog("No attachmentId found in widgetFromBE interrupt", { interrupt });
+ console.log(
+ `No attachmentId found in widgetFromBE interrupt: ${JSON.stringify(interrupt)}`,
+ );
+ return null;
+ }
+
+ // Check if the type exists in componentMap (existing logic for "widget" type)
+ if (
+ interruptType === "widget" &&
+ interrupt.value.widget.type in componentMap
+ ) {
+ const Component =
+ componentMap[interrupt.value.widget.type as ComponentType];
+ debugLog("Widget component found", {
+ componentType: interrupt.value.widget.type,
+ args: interrupt.value.widget.args,
+ });
+
+ // Check for renderingWindow to determine where to render the widget
+ const renderingWindow = interrupt.value.widget.args?.renderingWindow || "chat";
+
+ // Create the widget component
+ let widgetComponent: React.ReactNode;
+
+ // For TravelerDetailsWidget, render in bottom sheet
+ if (interrupt.value.widget.type === "TravelerDetailsWidget") {
+ console.log('interrupt: ',JSON.stringify(interrupt.value.widget.args, null, 2));
+ widgetComponent = (
+
+ );
+ } else if (interrupt.value.widget.type === "SeatPaymentWidget") {
+ widgetComponent = ;
+ } else if (interrupt.value.widget.type === "AddBaggageWidget") {
+ widgetComponent = ;
+ } else if (interrupt.value.widget.type === "NonAgentFlowWidget") {
+ // For NonAgentFlowWidget, render in bottom sheet
+ widgetComponent = (
+
+ );
+ } else if (["SeatPreferenceWidget", "SeatSelectionWidget", "SeatMapWidget", "SeatCombinedWidget"].includes(interrupt.value.widget.type)) {
+ // For seat-related widgets, render directly without bottom sheet
+ widgetComponent = ;
+ } else {
+ // For other widgets, pass the args object directly to the component
+ widgetComponent = ;
+ }
+
+ // Handle rendering based on renderingWindow
+ if (renderingWindow === "itinerary") {
+ // Add widget to itinerary section and switch to itinerary tab
+ // Use interrupt_id if available, otherwise create a stable ID based on widget type and args
+ const interruptId = interrupt.value?.interrupt_id || interrupt.value?.widget?.args?.interrupt_id;
+ const argsHash = JSON.stringify(interrupt.value.widget.args || {});
+ const widgetId = interruptId || `${interrupt.value.widget.type}-${btoa(argsHash).slice(0, 8)}`;
+
+ addWidget(widgetId, widgetComponent);
+ switchToItinerary();
+
+ // Return null for chat section since widget is rendered in itinerary
+ return null;
+ }
+
+ // Default: render in chat section
+ return widgetComponent;
+ }
+
+ debugLog("No widget found", { interruptType, interrupt });
+ console.log(
+ `No widget found for interruptType: ${interruptType} and interrupt: ${JSON.stringify(interrupt)}`,
+ );
+ return null;
+};
function isComplexValue(value: any): boolean {
return Array.isArray(value) || (typeof value === "object" && value !== null);
@@ -11,12 +271,43 @@ export function GenericInterruptView({
}: {
interrupt: Record | Record[];
}) {
+ console.log("🔄 STREAMING DATA - GenericInterruptView received:", {
+ interrupt,
+ isArray: Array.isArray(interrupt),
+ timestamp: new Date().toISOString(),
+ });
+ debugLog("GenericInterruptView rendered", { interrupt });
+
const [isExpanded, setIsExpanded] = useState(false);
const contentStr = JSON.stringify(interrupt, null, 2);
const contentLines = contentStr.split("\n");
const shouldTruncate = contentLines.length > 4 || contentStr.length > 500;
+ // Extract interrupt object and type
+ const interruptObj = Array.isArray(interrupt) ? interrupt[0] : interrupt;
+ const interruptType = interruptObj.type || interruptObj.value?.type;
+
+ debugLog("Interrupt processing", {
+ interruptObj,
+ interruptType,
+ shouldTruncate,
+ contentLines: contentLines.length,
+ });
+
+ // Try to render dynamic widget first
+ const dynamicWidget = interruptType ? (
+
+ ) : null;
+
+ // If dynamic widget exists, render it instead of generic view
+ if (dynamicWidget) {
+ return dynamicWidget;
+ }
+
// Function to truncate long string values
const truncateValue = (value: any): any => {
if (typeof value === "string" && value.length > 100) {
@@ -55,75 +346,81 @@ export function GenericInterruptView({
const displayEntries = processEntries();
return (
-
-
-
-
Human Interrupt
+ <>
+
+
-
-
-
-
+
+
-
-
- {displayEntries.map((item, argIdx) => {
- const [key, value] = Array.isArray(interrupt)
- ? [argIdx.toString(), item]
- : (item as [string, any]);
- return (
-
-
- {key}
-
-
- {isComplexValue(value) ? (
-
- {JSON.stringify(value, null, 2)}
-
- ) : (
- String(value)
- )}
-
-
- );
- })}
-
-
-
-
-
- {(shouldTruncate ||
- (Array.isArray(interrupt) && interrupt.length > 5)) && (
- setIsExpanded(!isExpanded)}
- className="flex w-full cursor-pointer items-center justify-center border-t-[1px] border-gray-200 py-2 text-gray-500 transition-all duration-200 ease-in-out hover:bg-gray-50 hover:text-gray-600"
- initial={{ scale: 1 }}
- whileHover={{ scale: 1.02 }}
- whileTap={{ scale: 0.98 }}
- >
- {isExpanded ? : }
-
- )}
-
-
+
+
+
+ {displayEntries.map((item, argIdx) => {
+ const [key, value] = Array.isArray(interrupt)
+ ? [argIdx.toString(), item]
+ : (item as [string, any]);
+ return (
+
+
+ {key}
+
+
+ {isComplexValue(value) ? (
+
+ {JSON.stringify(value, null, 2)}
+
+ ) : (
+ String(value)
+ )}
+
+
+ );
+ })}
+
+
+
+
+
+ {(shouldTruncate ||
+ (Array.isArray(interrupt) && interrupt.length > 5)) && (
+
setIsExpanded(!isExpanded)}
+ className="flex w-full cursor-pointer items-center justify-center border-t-[1px] border-gray-200 py-2 text-gray-500 transition-all duration-200 ease-in-out hover:bg-gray-50 hover:text-gray-600"
+ initial={{ scale: 1 }}
+ whileHover={{ scale: 1.02 }}
+ whileTap={{ scale: 0.98 }}
+ >
+ {isExpanded ? : }
+
+ )}
+
+
+ >
);
}
diff --git a/src/components/thread/messages/human.tsx b/src/components/thread/messages/human.tsx
index f5168468..fba57f4c 100644
--- a/src/components/thread/messages/human.tsx
+++ b/src/components/thread/messages/human.tsx
@@ -7,6 +7,7 @@ import { Textarea } from "@/components/ui/textarea";
import { BranchSwitcher, CommandBar } from "./shared";
import { MultimodalPreview } from "@/components/thread/MultimodalPreview";
import { isBase64ContentBlock } from "@/lib/multimodal-utils";
+import { getJwtToken, GetUserId } from "@/services/authService";
function EditableContent({
value,
@@ -52,19 +53,32 @@ export function HumanMessage({
const handleSubmitEdit = () => {
setIsEditing(false);
+ // Get user ID from JWT token
+ const jwtToken = getJwtToken();
+ const userId = jwtToken ? GetUserId(jwtToken) : null;
+
const newMessage: Message = { type: "human", content: value };
+
+ // Include userId in the submission
+ const submissionData: any = { messages: [newMessage] };
+ if (userId) {
+ submissionData.userId = userId;
+ }
+
thread.submit(
- { messages: [newMessage] },
+ submissionData,
{
checkpoint: parentCheckpoint,
- streamMode: ["values"],
- optimisticValues: (prev) => {
+ streamMode: ["updates"],
+ streamSubgraphs: true,
+ optimisticValues: (prev: any) => {
const values = meta?.firstSeenState?.values;
if (!values) return prev;
return {
...values,
messages: [...(values.messages ?? []), newMessage],
+ ui: prev.ui ?? [], // Preserve UI state
};
},
},
@@ -108,11 +122,9 @@ export function HumanMessage({
)}
{/* Render text if present, otherwise fallback to file/image name */}
- {contentString ? (
-
- {contentString}
-
- ) : null}
+
+ {contentString}
+
)}
diff --git a/src/components/thread/messages/interrupt-manager.tsx b/src/components/thread/messages/interrupt-manager.tsx
new file mode 100644
index 00000000..3c4e248f
--- /dev/null
+++ b/src/components/thread/messages/interrupt-manager.tsx
@@ -0,0 +1,90 @@
+import React, { useRef, useCallback, useEffect } from "react";
+import { useStreamContext } from "@/providers/Stream";
+import { useInterruptPersistenceContext } from "@/providers/InterruptPersistenceContext";
+
+interface InterruptManagerProps {
+ children: React.ReactNode;
+}
+
+export function InterruptManager({ children }: InterruptManagerProps) {
+ const stream = useStreamContext();
+ const interruptPersistence = useInterruptPersistenceContext();
+ const activeInterruptIdRef = useRef
(null);
+ const lastInterruptRef = useRef(null);
+
+ // Handle new interrupts
+ useEffect(() => {
+ if (stream.interrupt && stream.interrupt !== lastInterruptRef.current) {
+ // New interrupt detected
+ const currentMessageId =
+ stream.messages.length > 0
+ ? stream.messages[stream.messages.length - 1].id
+ : undefined;
+
+ const interruptId = interruptPersistence.addInterrupt(
+ stream.interrupt.value || stream.interrupt,
+ currentMessageId,
+ );
+
+ activeInterruptIdRef.current = interruptId;
+ lastInterruptRef.current = stream.interrupt;
+
+ console.log("📌 Persisted new interrupt:", interruptId);
+ }
+ }, [stream.interrupt, interruptPersistence]);
+
+ // Handle interrupt completion (when stream.interrupt becomes null)
+ useEffect(() => {
+ if (
+ !stream.interrupt &&
+ activeInterruptIdRef.current &&
+ lastInterruptRef.current
+ ) {
+ // Interrupt was cleared, mark as completed
+ const responseMessageId =
+ stream.messages.length > 0
+ ? stream.messages[stream.messages.length - 1].id
+ : undefined;
+
+ interruptPersistence.markAsCompleted(
+ activeInterruptIdRef.current,
+ responseMessageId,
+ );
+
+ console.log(
+ "✅ Marked interrupt as completed:",
+ activeInterruptIdRef.current,
+ );
+
+ activeInterruptIdRef.current = null;
+ lastInterruptRef.current = null;
+ }
+ }, [stream.interrupt, stream.messages, interruptPersistence]);
+
+ return <>{children}>;
+}
+
+// Hook to get interrupt submission handlers with persistence
+export function useInterruptSubmission() {
+ const interruptPersistence = useInterruptPersistenceContext();
+
+ const createSubmissionHandlers = useCallback(
+ (interruptId?: string) => ({
+ onSubmitStart: () => {
+ console.log("🔄 Interrupt submission started");
+ },
+ onSubmitComplete: () => {
+ if (interruptId) {
+ interruptPersistence.markAsCompleted(interruptId);
+ console.log("✅ Interrupt submission completed and persisted");
+ }
+ },
+ onSubmitError: (error: any) => {
+ console.error("❌ Interrupt submission failed:", error);
+ },
+ }),
+ [interruptPersistence],
+ );
+
+ return { createSubmissionHandlers };
+}
diff --git a/src/components/thread/messages/persistent-interrupt.tsx b/src/components/thread/messages/persistent-interrupt.tsx
new file mode 100644
index 00000000..b5439bc7
--- /dev/null
+++ b/src/components/thread/messages/persistent-interrupt.tsx
@@ -0,0 +1,136 @@
+import React from "react";
+import { motion } from "framer-motion";
+import { CheckCircle2, Clock } from "lucide-react";
+import { cn } from "@/lib/utils";
+import { PersistedInterrupt } from "@/hooks/use-interrupt-persistence";
+import { DynamicRenderer } from "./generic-interrupt";
+import { useStreamContext } from "@/providers/Stream";
+
+interface PersistentInterruptWidgetProps {
+ persistedInterrupt: PersistedInterrupt;
+ className?: string;
+}
+
+export function PersistentInterruptWidget({
+ persistedInterrupt,
+ className,
+}: PersistentInterruptWidgetProps) {
+ const { interrupt, isCompleted, timestamp } = persistedInterrupt;
+ const stream = useStreamContext();
+
+ // Don't render if this interrupt is currently active (to avoid duplicates)
+ const isCurrentlyActive =
+ stream.interrupt &&
+ JSON.stringify(stream.interrupt.value || stream.interrupt) ===
+ JSON.stringify(interrupt);
+
+ if (isCurrentlyActive) {
+ return null;
+ }
+
+ // Extract interrupt object and type
+ const interruptObj = Array.isArray(interrupt) ? interrupt[0] : interrupt;
+ const interruptType = interruptObj.type || interruptObj.value?.type;
+
+ // Create a modified interrupt object for read-only rendering
+ const readOnlyInterrupt = {
+ ...interruptObj,
+ _readOnly: true, // Flag to indicate this is a persistent/read-only widget
+ _isCompleted: isCompleted,
+ _timestamp: timestamp,
+ };
+
+ // Try to render dynamic widget
+ const dynamicWidget = interruptType ? (
+
+ ) : null;
+
+ return (
+
+ {/* Status indicator - icon only */}
+
+
+ {isCompleted ? (
+
+ ) : (
+
+ )}
+
+
+
+ {/* Widget content with overlay for completed state */}
+
+ {/* Subtle overlay for completed widgets */}
+ {isCompleted && (
+
+ )}
+
+ {/* Widget content */}
+
+ {dynamicWidget || (
+
+
+ Interrupt Widget: {interruptType || "Unknown"}
+
+
+ {JSON.stringify(interrupt, null, 2)}
+
+
+ )}
+
+
+
+ {/* Timestamp */}
+
+ {new Date(timestamp).toLocaleTimeString()}
+
+
+ );
+}
+
+interface PersistentInterruptListProps {
+ interrupts: PersistedInterrupt[];
+ className?: string;
+}
+
+export function PersistentInterruptList({
+ interrupts,
+ className,
+}: PersistentInterruptListProps) {
+ if (interrupts.length === 0) {
+ return null;
+ }
+
+ return (
+
+ {interrupts.map((persistedInterrupt) => (
+
+ ))}
+
+ );
+}
diff --git a/src/components/ui/Navbar.tsx b/src/components/ui/Navbar.tsx
new file mode 100644
index 00000000..09bb8dc9
--- /dev/null
+++ b/src/components/ui/Navbar.tsx
@@ -0,0 +1,76 @@
+"use client";
+
+import { useRouter } from "next/navigation";
+import { LogoutButton } from "../auth";
+import { PanelRightClose, PanelRightOpen, SquarePen } from "lucide-react";
+import { TooltipIconButton } from "../thread/tooltip-icon-button";
+import { parseAsBoolean, useQueryState } from "nuqs";
+import { useMediaQuery } from "@/hooks/useMediaQuery";
+import { Button } from "@/components/ui/button";
+import { FlyoLogoSVG } from "@/components/icons/langgraph";
+import { motion } from "framer-motion";
+
+export const Navbar = () => {
+ const router = useRouter();
+
+ const [chatHistoryOpen, setChatHistoryOpen] = useQueryState(
+ "chatHistoryOpen",
+ parseAsBoolean.withDefault(false),
+ );
+ const isLargeScreen = useMediaQuery("(min-width: 1024px)");
+
+ return (
+
+
+
+ {(!chatHistoryOpen || !isLargeScreen) && (
+
setChatHistoryOpen((p) => !p)}
+ >
+ {chatHistoryOpen ? (
+
+ ) : (
+
+ )}
+
+ )}
+
+
+
+
+
+
+
+ router.push("/")}
+ >
+
+
+
+
+
+ );
+};
diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx
new file mode 100644
index 00000000..f000e3ef
--- /dev/null
+++ b/src/components/ui/badge.tsx
@@ -0,0 +1,36 @@
+import * as React from "react"
+import { cva, type VariantProps } from "class-variance-authority"
+
+import { cn } from "@/lib/utils"
+
+const badgeVariants = cva(
+ "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2",
+ {
+ variants: {
+ variant: {
+ default:
+ "border-transparent bg-primary text-primary-foreground hover:bg-primary/80",
+ secondary:
+ "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80",
+ destructive:
+ "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80",
+ outline: "text-foreground",
+ },
+ },
+ defaultVariants: {
+ variant: "default",
+ },
+ }
+)
+
+export interface BadgeProps
+ extends React.HTMLAttributes,
+ VariantProps {}
+
+function Badge({ className, variant, ...props }: BadgeProps) {
+ return (
+
+ )
+}
+
+export { Badge, badgeVariants }
diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx
index 333e432b..8cfedbe5 100644
--- a/src/components/ui/button.tsx
+++ b/src/components/ui/button.tsx
@@ -1,25 +1,26 @@
-import * as React from "react";
-import { Slot } from "@radix-ui/react-slot";
-import { cva, type VariantProps } from "class-variance-authority";
+import * as React from "react"
+import { Slot } from "@radix-ui/react-slot"
+import { cva, type VariantProps } from "class-variance-authority"
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/utils"
const buttonVariants = cva(
- "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-[color,box-shadow] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{
variants: {
variant: {
default:
"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
destructive:
- "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40",
+ "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
outline:
- "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground",
+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
secondary:
"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
- ghost: "hover:bg-accent hover:text-accent-foreground",
+ ghost:
+ "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
link: "text-primary underline-offset-4 hover:underline",
- brand: "bg-[#2F6868] hover:bg-[#2F6868]/90 border-[#2F6868] text-white",
+ brand: "bg-blue-600 text-white shadow-xs hover:bg-blue-700 focus-visible:ring-blue-600/20 dark:focus-visible:ring-blue-600/40",
},
size: {
default: "h-9 px-4 py-2 has-[>svg]:px-3",
@@ -32,13 +33,14 @@ const buttonVariants = cva(
variant: "default",
size: "default",
},
- },
-);
+ }
+)
-type ButtonProps = React.ComponentProps<"button"> &
- VariantProps & {
- asChild?: boolean;
- };
+export interface ButtonProps
+ extends React.ComponentProps<"button">,
+ VariantProps {
+ asChild?: boolean
+}
function Button({
className,
@@ -47,7 +49,7 @@ function Button({
asChild = false,
...props
}: ButtonProps) {
- const Comp = asChild ? Slot : "button";
+ const Comp = asChild ? Slot : "button"
return (
- );
+ )
}
-export { Button, buttonVariants, type ButtonProps };
+export { Button, buttonVariants }
diff --git a/src/components/ui/calendar.tsx b/src/components/ui/calendar.tsx
new file mode 100644
index 00000000..5f62ae94
--- /dev/null
+++ b/src/components/ui/calendar.tsx
@@ -0,0 +1,211 @@
+import * as React from "react"
+import {
+ ChevronDownIcon,
+ ChevronLeftIcon,
+ ChevronRightIcon,
+} from "lucide-react"
+import { DayButton, DayPicker, getDefaultClassNames } from "react-day-picker"
+
+import { cn } from "@/lib/utils"
+import { Button, buttonVariants } from "@/components/ui/button"
+
+function Calendar({
+ className,
+ classNames,
+ showOutsideDays = true,
+ captionLayout = "label",
+ buttonVariant = "ghost",
+ formatters,
+ components,
+ ...props
+}: React.ComponentProps & {
+ buttonVariant?: React.ComponentProps["variant"]
+}) {
+ const defaultClassNames = getDefaultClassNames()
+
+ return (
+ svg]:rotate-180`,
+ String.raw`rtl:**:[.rdp-button\_previous>svg]:rotate-180`,
+ className
+ )}
+ captionLayout={captionLayout}
+ formatters={{
+ formatMonthDropdown: (date) =>
+ date.toLocaleString("default", { month: "short" }),
+ ...formatters,
+ }}
+ classNames={{
+ root: cn("w-fit", defaultClassNames.root),
+ months: cn(
+ "flex gap-4 flex-col md:flex-row relative",
+ defaultClassNames.months
+ ),
+ month: cn("flex flex-col w-full gap-4", defaultClassNames.month),
+ nav: cn(
+ "flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between",
+ defaultClassNames.nav
+ ),
+ button_previous: cn(
+ buttonVariants({ variant: buttonVariant }),
+ "size-(--cell-size) aria-disabled:opacity-50 p-0 select-none",
+ defaultClassNames.button_previous
+ ),
+ button_next: cn(
+ buttonVariants({ variant: buttonVariant }),
+ "size-(--cell-size) aria-disabled:opacity-50 p-0 select-none",
+ defaultClassNames.button_next
+ ),
+ month_caption: cn(
+ "flex items-center justify-center h-(--cell-size) w-full px-(--cell-size)",
+ defaultClassNames.month_caption
+ ),
+ dropdowns: cn(
+ "w-full flex items-center text-sm font-medium justify-center h-(--cell-size) gap-1.5",
+ defaultClassNames.dropdowns
+ ),
+ dropdown_root: cn(
+ "relative has-focus:border-ring border border-input shadow-xs has-focus:ring-ring/50 has-focus:ring-[3px] rounded-md",
+ defaultClassNames.dropdown_root
+ ),
+ dropdown: cn(
+ "absolute bg-popover inset-0 opacity-0",
+ defaultClassNames.dropdown
+ ),
+ caption_label: cn(
+ "select-none font-medium",
+ captionLayout === "label"
+ ? "text-sm"
+ : "rounded-md pl-2 pr-1 flex items-center gap-1 text-sm h-8 [&>svg]:text-muted-foreground [&>svg]:size-3.5",
+ defaultClassNames.caption_label
+ ),
+ table: "w-full border-collapse",
+ weekdays: cn("flex", defaultClassNames.weekdays),
+ weekday: cn(
+ "text-muted-foreground rounded-md flex-1 font-normal text-[0.8rem] select-none",
+ defaultClassNames.weekday
+ ),
+ week: cn("flex w-full mt-2", defaultClassNames.week),
+ week_number_header: cn(
+ "select-none w-(--cell-size)",
+ defaultClassNames.week_number_header
+ ),
+ week_number: cn(
+ "text-[0.8rem] select-none text-muted-foreground",
+ defaultClassNames.week_number
+ ),
+ day: cn(
+ "relative w-full h-full p-0 text-center [&:first-child[data-selected=true]_button]:rounded-l-md [&:last-child[data-selected=true]_button]:rounded-r-md group/day aspect-square select-none",
+ defaultClassNames.day
+ ),
+ range_start: cn(
+ "rounded-l-md bg-accent",
+ defaultClassNames.range_start
+ ),
+ range_middle: cn("rounded-none", defaultClassNames.range_middle),
+ range_end: cn("rounded-r-md bg-accent", defaultClassNames.range_end),
+ today: cn(
+ "bg-accent text-accent-foreground rounded-md data-[selected=true]:rounded-none",
+ defaultClassNames.today
+ ),
+ outside: cn(
+ "text-muted-foreground aria-selected:text-muted-foreground",
+ defaultClassNames.outside
+ ),
+ disabled: cn(
+ "text-muted-foreground opacity-50",
+ defaultClassNames.disabled
+ ),
+ hidden: cn("invisible", defaultClassNames.hidden),
+ ...classNames,
+ }}
+ components={{
+ Root: ({ className, rootRef, ...props }) => {
+ return (
+
+ )
+ },
+ Chevron: ({ className, orientation, ...props }) => {
+ if (orientation === "left") {
+ return (
+
+ )
+ }
+
+ if (orientation === "right") {
+ return (
+
+ )
+ }
+
+ return (
+
+ )
+ },
+ DayButton: CalendarDayButton,
+ WeekNumber: ({ children, ...props }) => {
+ return (
+
+
+ {children}
+
+
+ )
+ },
+ ...components,
+ }}
+ {...props}
+ />
+ )
+}
+
+function CalendarDayButton({
+ className,
+ day,
+ modifiers,
+ ...props
+}: React.ComponentProps) {
+ const defaultClassNames = getDefaultClassNames()
+
+ const ref = React.useRef(null)
+ React.useEffect(() => {
+ if (modifiers.focused) ref.current?.focus()
+ }, [modifiers.focused])
+
+ return (
+ span]:text-xs [&>span]:opacity-70",
+ defaultClassNames.day,
+ className
+ )}
+ {...props}
+ />
+ )
+}
+
+export { Calendar, CalendarDayButton }
diff --git a/src/components/ui/command.tsx b/src/components/ui/command.tsx
new file mode 100644
index 00000000..e5bd56bb
--- /dev/null
+++ b/src/components/ui/command.tsx
@@ -0,0 +1,182 @@
+import * as React from "react"
+import { Command as CommandPrimitive } from "cmdk"
+import { SearchIcon } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+import {
+ Dialog,
+ DialogContent,
+ DialogDescription,
+ DialogHeader,
+ DialogTitle,
+} from "@/components/ui/dialog"
+
+function Command({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function CommandDialog({
+ title = "Command Palette",
+ description = "Search for a command to run...",
+ children,
+ className,
+ showCloseButton = true,
+ ...props
+}: React.ComponentProps & {
+ title?: string
+ description?: string
+ className?: string
+ showCloseButton?: boolean
+}) {
+ return (
+
+
+ {title}
+ {description}
+
+
+
+ {children}
+
+
+
+ )
+}
+
+function CommandInput({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+
+
+
+ )
+}
+
+function CommandList({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function CommandEmpty({
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function CommandGroup({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function CommandSeparator({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function CommandItem({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function CommandShortcut({
+ className,
+ ...props
+}: React.ComponentProps<"span">) {
+ return (
+
+ )
+}
+
+export {
+ Command,
+ CommandDialog,
+ CommandInput,
+ CommandList,
+ CommandEmpty,
+ CommandGroup,
+ CommandItem,
+ CommandShortcut,
+ CommandSeparator,
+}
diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx
new file mode 100644
index 00000000..d9ccec91
--- /dev/null
+++ b/src/components/ui/dialog.tsx
@@ -0,0 +1,143 @@
+"use client"
+
+import * as React from "react"
+import * as DialogPrimitive from "@radix-ui/react-dialog"
+import { XIcon } from "lucide-react"
+
+import { cn } from "@/lib/utils"
+
+function Dialog({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DialogTrigger({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DialogPortal({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DialogClose({
+ ...props
+}: React.ComponentProps) {
+ return
+}
+
+function DialogOverlay({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DialogContent({
+ className,
+ children,
+ showCloseButton = true,
+ ...props
+}: React.ComponentProps & {
+ showCloseButton?: boolean
+}) {
+ return (
+
+
+
+ {children}
+ {showCloseButton && (
+
+
+ Close
+
+ )}
+
+
+ )
+}
+
+function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function DialogFooter({ className, ...props }: React.ComponentProps<"div">) {
+ return (
+
+ )
+}
+
+function DialogTitle({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+function DialogDescription({
+ className,
+ ...props
+}: React.ComponentProps) {
+ return (
+
+ )
+}
+
+export {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogOverlay,
+ DialogPortal,
+ DialogTitle,
+ DialogTrigger,
+}
diff --git a/src/components/ui/popover.tsx b/src/components/ui/popover.tsx
new file mode 100644
index 00000000..a0ec48be
--- /dev/null
+++ b/src/components/ui/popover.tsx
@@ -0,0 +1,31 @@
+"use client"
+
+import * as React from "react"
+import * as PopoverPrimitive from "@radix-ui/react-popover"
+
+import { cn } from "@/lib/utils"
+
+const Popover = PopoverPrimitive.Root
+
+const PopoverTrigger = PopoverPrimitive.Trigger
+
+const PopoverContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, align = "center", sideOffset = 4, ...props }, ref) => (
+
+
+
+))
+PopoverContent.displayName = PopoverPrimitive.Content.displayName
+
+export { Popover, PopoverTrigger, PopoverContent }
diff --git a/src/components/ui/separator.tsx b/src/components/ui/separator.tsx
index ccb63c04..6d7f1226 100644
--- a/src/components/ui/separator.tsx
+++ b/src/components/ui/separator.tsx
@@ -1,26 +1,29 @@
-import * as React from "react";
-import * as SeparatorPrimitive from "@radix-ui/react-separator";
+import * as React from "react"
+import * as SeparatorPrimitive from "@radix-ui/react-separator"
-import { cn } from "@/lib/utils";
+import { cn } from "@/lib/utils"
-function Separator({
- className,
- orientation = "horizontal",
- decorative = true,
- ...props
-}: React.ComponentProps) {
- return (
+const Separator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(
+ (
+ { className, orientation = "horizontal", decorative = true, ...props },
+ ref
+ ) => (
- );
-}
+ )
+)
+Separator.displayName = SeparatorPrimitive.Root.displayName
-export { Separator };
+export { Separator }
diff --git a/src/components/ui/tabs.tsx b/src/components/ui/tabs.tsx
new file mode 100644
index 00000000..f57fffdb
--- /dev/null
+++ b/src/components/ui/tabs.tsx
@@ -0,0 +1,53 @@
+import * as React from "react"
+import * as TabsPrimitive from "@radix-ui/react-tabs"
+
+import { cn } from "@/lib/utils"
+
+const Tabs = TabsPrimitive.Root
+
+const TabsList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+TabsList.displayName = TabsPrimitive.List.displayName
+
+const TabsTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+TabsTrigger.displayName = TabsPrimitive.Trigger.displayName
+
+const TabsContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+))
+TabsContent.displayName = TabsPrimitive.Content.displayName
+
+export { Tabs, TabsList, TabsTrigger, TabsContent }
diff --git a/src/components/widgets/README.md b/src/components/widgets/README.md
new file mode 100644
index 00000000..67827d80
--- /dev/null
+++ b/src/components/widgets/README.md
@@ -0,0 +1,214 @@
+# Review Widget
+
+The ReviewWidget component has been updated to handle streamed API response data and conditionally display components based on available data.
+
+## Features
+
+### 1. API Data Integration
+- Accepts streamed response data via the `apiData` prop
+- Automatically transforms API data to component format
+- Pre-fills form fields when data is available
+- Falls back to mock data when no API data is provided
+
+### 2. Bottom Sheet Mode
+- Automatically renders as a bottom sheet when triggered via interrupt system
+- Includes close button (X) in the top-right corner
+- Optimized layout for mobile and desktop
+- Sticky action buttons at the bottom of the sheet
+
+### 3. Conditional Component Display
+- **Seat Allocation**: Only shown when `seatAllocation` prop is provided
+- **Travel Documents**: Only shown when `travelerRequirements` is not null in API data
+- If components are not needed, they are hidden entirely
+- Payment calculation adjusts automatically based on available components
+
+### 3. Data Transformation
+The component includes utility functions to transform API data:
+- `transformApiDataToFlightDetails()` - Converts flight offer data to display format
+- `transformApiDataToPassengerDetails()` - Extracts user details for form pre-filling
+- `transformApiDataToContactInfo()` - Formats contact information
+- `transformApiDataToTravelDocument()` - Processes document information
+- `transformApiDataToPaymentSummary()` - Calculates payment breakdown
+- `transformApiDataToSavedPassengers()` - Formats saved traveller list
+
+## Usage
+
+### Via Interrupt System (Automatic Bottom Sheet)
+When triggered through the interrupt system, the widget automatically renders as a bottom sheet:
+
+```typescript
+// Server-side interrupt
+const result = interrupt({
+ value: {
+ type: "widget",
+ widget: {
+ type: "TravelerDetailsWidget",
+ args: {
+ flightItinerary: { /* ... */ },
+ bookingRequirements: { /* ... */ }
+ }
+ }
+ }
+});
+```
+
+The widget will automatically:
+- Render as a bottom sheet overlay
+- Include a close button (X)
+- Pre-fill data from the API response
+- Show sticky action buttons
+
+### Manual Usage (Regular Mode)
+```tsx
+import ReviewWidget from './review.widget';
+
+const apiResponse = {
+ value: {
+ type: "widget",
+ widget: {
+ type: "TravelerDetailsWidget",
+ args: {
+ flightItinerary: { /* ... */ },
+ bookingRequirements: { /* ... */ }
+ }
+ }
+ }
+};
+
+ console.log('Booking data:', data)}
+/>
+```
+
+### Without API Data (Mock Data)
+```tsx
+ console.log('Booking data:', data)}
+/>
+```
+
+### With Custom Props (Legacy Support)
+```tsx
+ console.log('Booking data:', data)}
+/>
+```
+
+## API Data Structure
+
+The component expects the following API response structure:
+
+```typescript
+interface ApiResponse {
+ value: {
+ type: string;
+ widget: {
+ type: string;
+ args: {
+ flightItinerary: {
+ userContext: {
+ userDetails: {
+ travellerId: number;
+ firstName: string;
+ lastName: string;
+ dateOfBirth: string;
+ gender: string;
+ nationality: string;
+ email: string;
+ phone: Array<{
+ countryCode: string;
+ number: string;
+ }>;
+ documents: Array<{
+ documentType: string;
+ documentNumber: string;
+ nationality: string;
+ expiryDate: string;
+ issuingCountry: string;
+ }>;
+ };
+ savedTravellers: Array* same structure as userDetails */>;
+ };
+ selectionContext: {
+ selectedFlightOffers: Array<{
+ flightOfferId: string;
+ currency: string;
+ totalAmount: number;
+ duration: string;
+ departure: {
+ date: string;
+ airportIata: string;
+ cityCode: string;
+ };
+ arrival: {
+ date: string;
+ airportIata: string;
+ cityCode: string;
+ };
+ segments: Array<{
+ airlineIata: string;
+ flightNumber: string;
+ airlineName: string;
+ }>;
+ }>;
+ };
+ };
+ bookingRequirements: {
+ emailAddressRequired: boolean;
+ mobilePhoneNumberRequired: boolean;
+ // ... other requirements
+ };
+ };
+ };
+ };
+}
+```
+
+## Conditional Component Display
+
+### Travel Documents Section
+The travel documents section is conditionally displayed based on the API data:
+
+```typescript
+// Hide travel documents when travelerRequirements is null
+{
+ "bookingRequirements": {
+ "travelerRequirements": null // This will hide the travel documents section
+ }
+}
+
+// Show travel documents when travelerRequirements has a value
+{
+ "bookingRequirements": {
+ "travelerRequirements": {
+ "documentRequired": true,
+ "passportRequired": true
+ } // This will show the travel documents section
+ }
+}
+```
+
+### Seat Allocation Section
+The seat allocation section is only shown when `seatAllocation` prop is provided.
+
+## Key Changes
+
+1. **Bottom Sheet Integration**: Automatically renders as a bottom sheet when triggered via interrupt system
+2. **Conditional Component Display**: Travel documents and seat sections are conditionally rendered
+3. **Currency Support**: Proper handling of INR (₹) and USD ($) currencies
+4. **Data Pre-filling**: Form fields are automatically populated from API data
+5. **Saved Passengers**: Dynamic list from API data with fallback to mock data
+6. **Payment Calculation**: Adjusts based on available components
+7. **Responsive Design**: Optimized layouts for both bottom sheet and regular modes
+8. **Backward Compatibility**: Still supports legacy prop-based usage
+
+## Demo
+
+See `review-widget-demo.tsx` for examples of how to use the component with and without API data.
diff --git a/src/components/widgets/addBaggage.widget.tsx b/src/components/widgets/addBaggage.widget.tsx
new file mode 100644
index 00000000..006ba91f
--- /dev/null
+++ b/src/components/widgets/addBaggage.widget.tsx
@@ -0,0 +1,160 @@
+"use client";
+
+import React, { useState } from "react";
+import { Button } from "@/components/common/ui/button";
+import { useStreamContext } from "@/providers/Stream";
+import { submitInterruptResponse } from "./util";
+import { Luggage, Check } from "lucide-react";
+
+interface AddBaggageWidgetProps {
+ [key: string]: any;
+}
+
+interface BaggageOption {
+ weight: number;
+ price: number;
+ description: string;
+}
+
+const AddBaggageWidget: React.FC = (args) => {
+ const thread = useStreamContext();
+ const [selectedBaggage, setSelectedBaggage] = useState(null);
+ const [isLoading, setIsLoading] = useState(false);
+
+ const baggageOptions: BaggageOption[] = [
+ {
+ weight: 10,
+ price: 1200,
+ description: "Perfect for short trips"
+ },
+ {
+ weight: 20,
+ price: 2000,
+ description: "Ideal for week-long vacations"
+ },
+ {
+ weight: 30,
+ price: 2800,
+ description: "Great for extended stays"
+ }
+ ];
+
+ const handleBaggageSelect = (baggage: BaggageOption) => {
+ setSelectedBaggage(baggage);
+ };
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+ if (!selectedBaggage) return;
+
+ setIsLoading(true);
+
+ const responseData = {
+ baggageWeight: selectedBaggage.weight,
+ baggagePrice: selectedBaggage.price,
+ baggageDescription: selectedBaggage.description,
+ action: "baggage_selected"
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ } catch (error: any) {
+ console.error("Error submitting baggage selection:", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ return (
+
+
+
+
+
+
Add Baggage
+
+ Select your preferred baggage allowance
+
+
+
+
+
+ {baggageOptions.map((option) => (
+
handleBaggageSelect(option)}
+ className={`relative cursor-pointer rounded-xl border-2 p-4 transition-all duration-200 hover:shadow-md ${
+ selectedBaggage?.weight === option.weight
+ ? "border-black bg-gray-50"
+ : "border-gray-200 bg-white hover:border-gray-300"
+ }`}
+ >
+
+
+
+
+ {option.weight}
+
+
+
+ {option.weight}kg Baggage
+
+
{option.description}
+
+
+
+
+
+
₹{option.price}
+
per bag
+
+
+ {selectedBaggage?.weight === option.weight && (
+
+ )}
+
+
+
+
+ ))}
+
+
+
+ {selectedBaggage && (
+
+
+ Selected:
+
+ {selectedBaggage.weight}kg - ₹{selectedBaggage.price}
+
+
+
+ )}
+
+
+ {isLoading ? (
+
+ ) : (
+ "Add Selected Baggage"
+ )}
+
+
+
+
+ );
+};
+
+export default AddBaggageWidget;
diff --git a/src/components/widgets/flightOptions.widget.tsx b/src/components/widgets/flightOptions.widget.tsx
new file mode 100644
index 00000000..c793614d
--- /dev/null
+++ b/src/components/widgets/flightOptions.widget.tsx
@@ -0,0 +1,1549 @@
+"use client";
+
+import React, { useState, useRef, useEffect } from "react";
+import { Button } from "@/components/common/ui/button";
+import {
+ Clock,
+ Star,
+ DollarSign,
+ Zap,
+ ChevronLeft,
+ ChevronRight,
+ Loader2,
+ Luggage,
+ Briefcase,
+ X,
+} from "lucide-react";
+import { cn } from "@/lib/utils";
+import { useStreamContext } from "@/providers/Stream";
+import { submitInterruptResponse } from "./util";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet";
+import { Skeleton } from "@/components/ui/skeleton";
+import Image from "next/image";
+
+interface FlightOption {
+ flightOfferId: string;
+ totalEmission: number;
+ totalEmissionUnit: string;
+ currency: string;
+ totalAmount: number;
+ duration: string;
+ departure: FlightEndpoint;
+ arrival: FlightEndpoint;
+ segments: FlightSegment[];
+ offerRules: FlightOfferRules;
+ rankingScore: number;
+ pros: string[];
+ cons: string[];
+ tags: string[];
+}
+
+interface FlightEndpoint {
+ date: string;
+ airportIata: string;
+ airportName: string;
+ cityCode: string;
+ countryCode: string;
+}
+
+interface FlightSegment {
+ id: string;
+ airlineIata: string;
+ flightNumber: string;
+ aircraftType: string;
+ airlineName: string;
+ duration: string;
+ departure: FlightEndpoint;
+ arrival: FlightEndpoint;
+}
+
+interface FlightOfferRules {
+ isRefundable: boolean
+}
+
+interface BaggageInfo {
+ checkedBaggage?: {
+ included: boolean;
+ weight?: string;
+ pieces?: number;
+ };
+ carryOnBaggage?: {
+ included: boolean;
+ weight?: string;
+ dimensions?: string;
+ };
+}
+
+const getCurrencySymbol = (currencyCode: string): string => {
+ const currencyMap: Record = {
+ 'USD': '$',
+ 'EUR': '€',
+ 'GBP': '£',
+ 'INR': '₹',
+ 'JPY': '¥',
+ 'CAD': 'C$',
+ 'AUD': 'A$',
+ 'CHF': 'CHF',
+ 'CNY': '¥',
+ 'SEK': 'kr',
+ 'NOK': 'kr',
+ 'MXN': '$',
+ 'NZD': 'NZ$',
+ 'SGD': 'S$',
+ 'HKD': 'HK$',
+ 'ZAR': 'R',
+ 'THB': '฿',
+ 'AED': 'د.إ',
+ 'SAR': '﷼',
+ 'KRW': '₩',
+ 'BRL': 'R$',
+ 'RUB': '₽',
+ 'TRY': '₺',
+ 'PLN': 'zł',
+ 'CZK': 'Kč',
+ 'HUF': 'Ft',
+ 'ILS': '₪',
+ 'CLP': '$',
+ 'COP': '$',
+ 'PEN': 'S/',
+ 'ARS': '$',
+ 'UYU': '$U',
+ 'BOB': 'Bs',
+ 'PYG': '₲',
+ 'VES': 'Bs.S',
+ 'DKK': 'kr',
+ 'ISK': 'kr',
+ 'RON': 'lei',
+ 'BGN': 'лв',
+ 'HRK': 'kn',
+ 'RSD': 'дин',
+ 'UAH': '₴',
+ 'BYN': 'Br',
+ 'MDL': 'L',
+ 'GEL': '₾',
+ 'AMD': '֏',
+ 'AZN': '₼',
+ 'KZT': '₸',
+ 'UZS': 'soʻm',
+ 'KGS': 'с',
+ 'TJS': 'ЅМ',
+ 'TMT': 'T',
+ 'MNT': '₮',
+ 'LAK': '₭',
+ 'KHR': '៛',
+ 'MMK': 'K',
+ 'VND': '₫',
+ 'IDR': 'Rp',
+ 'MYR': 'RM',
+ 'PHP': '₱',
+ 'TWD': 'NT$',
+ 'PKR': '₨',
+ 'LKR': '₨',
+ 'BDT': '৳',
+ 'NPR': '₨',
+ 'BTN': 'Nu.',
+ 'MVR': '.ރ',
+ 'AFN': '؋',
+ 'IRR': '﷼',
+ 'IQD': 'ع.د',
+ 'JOD': 'د.ا',
+ 'KWD': 'د.ك',
+ 'LBP': 'ل.ل',
+ 'OMR': 'ر.ع.',
+ 'QAR': 'ر.ق',
+ 'SYP': '£',
+ 'YER': '﷼',
+ 'BHD': '.د.ب',
+ 'EGP': '£',
+ 'LYD': 'ل.د',
+ 'MAD': 'د.م.',
+ 'TND': 'د.ت',
+ 'DZD': 'د.ج',
+ 'AOA': 'Kz',
+ 'BWP': 'P',
+ 'BIF': 'Fr',
+ 'XOF': 'Fr',
+ 'XAF': 'Fr',
+ 'KMF': 'Fr',
+ 'DJF': 'Fr',
+ 'ERN': 'Nfk',
+ 'ETB': 'Br',
+ 'GMD': 'D',
+ 'GHS': '₵',
+ 'GNF': 'Fr',
+ 'KES': 'Sh',
+ 'LSL': 'L',
+ 'LRD': '$',
+ 'MGA': 'Ar',
+ 'MWK': 'MK',
+ 'MUR': '₨',
+ 'MZN': 'MT',
+ 'NAD': '$',
+ 'NGN': '₦',
+ 'RWF': 'Fr',
+ 'SCR': '₨',
+ 'SLL': 'Le',
+ 'SOS': 'Sh',
+ 'STN': 'Db',
+ 'SZL': 'L',
+ 'TZS': 'Sh',
+ 'UGX': 'Sh',
+ 'XPF': 'Fr',
+ 'ZMW': 'ZK',
+ 'ZWL': '$',
+ };
+
+ return currencyMap[currencyCode.toUpperCase()] || currencyCode;
+};
+
+// Helper function to get airline logo path
+const getAirlineLogoPath = (airlineIata: string): string => {
+ if (!airlineIata) return '';
+ // The airlines folder is in the root directory, so we need to go up from src
+ return `/airlines/${airlineIata.toUpperCase()}.png`;
+};
+
+// Airline Logo Component
+const AirlineLogo = ({
+ airlineIata,
+ airlineName,
+ size = 'md'
+}: {
+ airlineIata: string;
+ airlineName: string;
+ size?: 'sm' | 'md' | 'lg'
+}) => {
+ const logoPath = getAirlineLogoPath(airlineIata);
+
+ // Size configurations
+ const sizeConfig = {
+ sm: { container: 'w-5 h-5', fallback: 'w-3 h-3' },
+ md: { container: 'w-6 h-6', fallback: 'w-4 h-4' },
+ lg: { container: 'w-8 h-8', fallback: 'w-6 h-6' }
+ };
+
+ const { container, fallback } = sizeConfig[size];
+
+ return (
+
+ {logoPath ? (
+
{
+ // Fallback to gray circle if image fails to load
+ const target = e.target as HTMLImageElement;
+ target.style.display = 'none';
+ const parent = target.parentElement;
+ if (parent) {
+ parent.innerHTML = `
`;
+ }
+ }}
+ />
+ ) : (
+
+ )}
+
+ );
+};
+
+const getBadgeConfigs = (tags: string[]) => {
+ // Priority order: recommended > cheapest > fastest
+ // Only show one badge per flight
+ if (tags.includes("recommended")) {
+ return [{
+ emoji: "⭐",
+ text: "Best",
+ color: "bg-white text-gray-800 border-gray-200",
+ }];
+ }
+ if (tags.includes("cheapest")) {
+ return [{
+ emoji: "💰",
+ text: "Cheapest",
+ color: "bg-white text-gray-800 border-gray-200",
+ }];
+ }
+ if (tags.includes("fastest")) {
+ return [{
+ emoji: "⚡",
+ text: "Fastest",
+ color: "bg-white text-gray-800 border-gray-200",
+ }];
+ }
+
+ return [];
+};
+
+// Generate mock baggage data for demonstration
+const getMockBaggageInfo = (flight: FlightOption): BaggageInfo => {
+ // Generate different baggage scenarios based on flight characteristics
+ const isLowCost = flight.tags?.includes('cheapest');
+ const isPremium = flight.tags?.includes('recommended');
+
+ // Mock scenarios
+ const scenarios = [
+ // Scenario 1: Full service airline
+ {
+ checkedBaggage: { included: true, weight: "23kg", pieces: 1 },
+ carryOnBaggage: { included: true, weight: "7kg", dimensions: "55x40x20cm" }
+ },
+ // Scenario 2: Low cost carrier
+ {
+ checkedBaggage: { included: false },
+ carryOnBaggage: { included: true, weight: "7kg", dimensions: "55x40x20cm" }
+ },
+ // Scenario 3: Premium service
+ {
+ checkedBaggage: { included: true, weight: "32kg", pieces: 2 },
+ carryOnBaggage: { included: true, weight: "10kg", dimensions: "55x40x20cm" }
+ },
+ // Scenario 4: Basic service
+ {
+ checkedBaggage: { included: true, weight: "20kg", pieces: 1 },
+ carryOnBaggage: { included: true, weight: "7kg", dimensions: "55x40x20cm" }
+ }
+ ];
+
+ // Select scenario based on flight type
+ if (isPremium) {
+ return scenarios[2]; // Premium service
+ } else if (isLowCost) {
+ return scenarios[1]; // Low cost carrier
+ } else {
+ // Randomly select between full service and basic service
+ return Math.random() > 0.5 ? scenarios[0] : scenarios[3];
+ }
+};
+
+// Baggage Display Component
+const BaggageDisplay = ({ flight }: { flight: FlightOption }) => {
+ const baggageInfo = getMockBaggageInfo(flight);
+
+ return (
+
+ {/* Checked Baggage */}
+
+
+
+
Check-in
+ {baggageInfo.checkedBaggage?.included ? (
+
+ {baggageInfo.checkedBaggage.weight}
+ {baggageInfo.checkedBaggage.pieces && baggageInfo.checkedBaggage.pieces > 1
+ ? ` (${baggageInfo.checkedBaggage.pieces} pcs)`
+ : ''}
+
+ ) : (
+
+
+
+ )}
+
+
+
+ {/* Divider */}
+
+
+ {/* Carry-on Baggage */}
+
+
+
+
Carry-on
+ {baggageInfo.carryOnBaggage?.included ? (
+
+ {baggageInfo.carryOnBaggage.weight}
+
+ ) : (
+
+
+
+ )}
+
+
+
+ );
+};
+
+const FlightCard = ({
+ flight,
+ onSelect,
+ isLoading,
+}: {
+ flight: FlightOption;
+ onSelect: (flightOfferId: string) => void;
+ isLoading?: boolean;
+}) => {
+ const badgeConfigs = flight.tags && flight.tags.length > 0 ? getBadgeConfigs(flight.tags) : [];
+
+ // Generate personalized flight highlights
+ const getFlightHighlights = (flight: FlightOption) => {
+ const highlights = [];
+
+ // Add tag-based highlights
+ if (flight.tags?.includes('recommended')) {
+ highlights.push("Your usual flight, travelled 12 times");
+ }
+ if (flight.tags?.includes('cheapest')) {
+ highlights.push("Cheapest option with short layover");
+ }
+ if (flight.tags?.includes('fastest')) {
+ highlights.push("Fastest route to your destination");
+ }
+
+ // Add additional contextual highlights
+ if (flight.segments.length === 1) {
+ highlights.push("Direct flight - no hassle with connections");
+ } else if (flight.segments.length === 2) {
+ highlights.push("Single layover - good balance of time and price");
+ }
+
+ // Add cancellation policy information
+ if (flight.offerRules?.isRefundable) {
+ highlights.push("Flexible booking with free cancellation");
+ } else {
+ highlights.push("Non-refundable - lock in this great price");
+ }
+
+ // Return max 3 highlights
+ return highlights.slice(0, 3);
+ };
+
+ //Todo: @Khalid, this is very critical and hacky, please verify the actual flight timings with what we are showing.
+ const formatTime = (isoString: string) => {
+ return new Date(isoString).toLocaleTimeString("en-US", {
+ hour: "2-digit",
+ minute: "2-digit",
+ hour12: false,
+ });
+ };
+
+ // Format duration from ISO duration string
+ const formatDuration = (duration: string) => {
+ const match = duration.match(/PT(\d+)H(\d+)?M?/);
+ if (match) {
+ const hours = match[1];
+ const minutes = match[2] || "0";
+ return `${hours}h ${minutes}m`;
+ }
+ return duration;
+ };
+
+ // Helper function to truncate airline name to 10 characters
+ const truncateAirlineName = (name: string) => {
+ if (name.length > 10) {
+ return name.substring(0, 10) + "...";
+ }
+ return name;
+ };
+
+ // Get airline IATA code from segments
+ const getAirlineIataFromFlightOption = (flight: FlightOption) => {
+ if (flight.segments && flight.segments.length > 0) {
+ return flight.segments[0].airlineIata || "";
+ }
+ return "";
+ };
+
+ // Get airline name from segments (truncated to 10 characters)
+ const getAirlineNameFromFlightOption = (flight: FlightOption) => {
+ if (flight.segments && flight.segments.length > 0) {
+ const airlineName = flight.segments[0].airlineName || flight.segments[0].airlineIata || "Unknown";
+ return truncateAirlineName(airlineName);
+ }
+ return "Unknown";
+ };
+
+
+
+ // Get flight number from segments
+ const getFlightNumberFromFlightOption = (flight: FlightOption) => {
+ if (flight.segments && flight.segments.length > 0) {
+ return flight.segments
+ .map(segment => segment.flightNumber)
+ .join(", ") || "Unknown";
+ }
+ return "Unknown";
+ };
+
+
+
+ const departureInfo = flight.departure;
+ const arrivalInfo = flight.arrival;
+ const duration = flight.duration
+ ? formatDuration(flight.duration)
+ : "Unknown";
+ const price = flight.totalAmount || 0;
+ const currency = flight.currency || "USD";
+ const currencySymbol = getCurrencySymbol(currency);
+
+ return (
+
+ {/* Content Area */}
+
+ {/* Top Row: Badges on left, Flight Info on right */}
+
+ {/* Badges */}
+
+ {badgeConfigs.length > 0 && badgeConfigs.map((badgeConfig, index) => (
+
+ {badgeConfig.emoji}
+ {badgeConfig.text}
+
+ ))}
+
+
+ {/* Airline and Flight Number - Top Right */}
+
+
+ {/* Airline Logo */}
+
+
+ {getAirlineNameFromFlightOption(flight)}
+
+
+ {/* Flight numbers - always show comma-separated */}
+
+ {getFlightNumberFromFlightOption(flight)}
+
+
+
+
+ {/* Flight Route */}
+
+
+
+ {formatTime(departureInfo.date)}
+
+
{departureInfo.airportIata}
+
+
+
+
+
+ {duration}
+
+
+ {/* Stop dots based on number of stops */}
+ {flight.segments.length === 2 && (
+ // One stop - light orange dot
+
+ )}
+ {flight.segments.length === 3 && (
+ // Two stops - light red dots
+ <>
+
+
+ >
+ )}
+ {flight.segments.length > 3 && (
+ // More than two stops - multiple light red dots
+ <>
+
+
+
+ >
+ )}
+ {/* Non-stop flights don't show any dots */}
+
+
+ {flight.segments.length == 1
+ ? "Non-stop"
+ : `${flight.segments.length - 1} stop${flight.segments.length - 1 > 1 ? "s" : ""}`}
+
+
+
+
+
+ {formatTime(arrivalInfo.date)}
+
+
{arrivalInfo.airportIata}
+
+
+
+ {/* Baggage Information */}
+
+
+ {/* Flight Highlights with Moving Gradient Border */}
+ {(() => {
+ const highlights = getFlightHighlights(flight);
+ return highlights.length > 0 && (
+
+
+ {/* Inner content with white background */}
+
+
+ {highlights.map((highlight, index) => (
+
+ •
+ {highlight}
+
+ ))}
+
+
+
+
+ {/* Add the CSS animation styles */}
+
+
+ );
+ })()}
+
+
+ {/* Minimal spacer for button alignment */}
+
+
+ {/* Select Button with Price - Pinned to bottom */}
+
onSelect(flight.flightOfferId)}
+ disabled={isLoading}
+ className="w-full bg-white border border-gray-300 py-3 text-gray-900 transition-colors duration-200 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 mt-1"
+ >
+
+ {isLoading ? "Selecting..." : "Select Flight"}
+ {currencySymbol}{price.toLocaleString()}
+
+
+
+ );
+};
+
+// Loading/Empty Flight Card Component
+const EmptyFlightCard = ({ isLoading = true }: { isLoading?: boolean }) => {
+ return (
+
+ {isLoading ? (
+ <>
+ {/* Content Area - Flexible */}
+
+ {/* Loading Badge */}
+
+
+
+
+ {/* Loading Airline and Flight Number */}
+
+
+
+
+
+
+ {/* Loading Flight Route */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Loading Cancellation Info */}
+
+
+
+
+
+ {/* Loading Button - Pinned to bottom */}
+
+ >
+ ) : (
+
+
+
Searching for flights...
+
This may take a few moments
+
+ )}
+
+ );
+};
+
+// Responsive Carousel Component
+const ResponsiveCarousel = ({
+ flights,
+ onSelect,
+ isLoading,
+}: {
+ flights: FlightOption[];
+ onSelect: (flightOfferId: string) => void;
+ isLoading: boolean;
+}) => {
+ const carouselRef = useRef(null);
+ const [currentIndex, setCurrentIndex] = useState(0);
+ const [canScrollLeft, setCanScrollLeft] = useState(false);
+ const [canScrollRight, setCanScrollRight] = useState(true);
+
+ // Get cards per view based on screen size - more conservative to prevent overflow
+ const getCardsPerView = () => {
+ if (typeof window === 'undefined') return 3;
+ const width = window.innerWidth;
+ if (width >= 1200) return 3; // Large desktop: 3 full cards
+ if (width >= 1024) return 2.8; // Desktop: 2 full + partial third
+ if (width >= 768) return 2; // Tablet: 2 full cards
+ if (width >= 640) return 1.8; // Small tablet: 1 full + partial second
+ if (width >= 480) return 1.3; // Large phone: 1 full + partial second
+ if (width >= 360) return 1.1; // Phone: 1 full + small glimpse of second
+ return 1; // Very small phone: 1 card only
+ };
+
+ const [cardsPerView, setCardsPerView] = useState(getCardsPerView());
+
+ useEffect(() => {
+ const handleResize = () => {
+ setCardsPerView(getCardsPerView());
+ };
+
+ window.addEventListener('resize', handleResize);
+ return () => window.removeEventListener('resize', handleResize);
+ }, []);
+
+ const updateScrollButtons = () => {
+ if (!carouselRef.current) return;
+
+ const { scrollLeft, scrollWidth, clientWidth } = carouselRef.current;
+ setCanScrollLeft(scrollLeft > 0);
+ setCanScrollRight(scrollLeft < scrollWidth - clientWidth - 1);
+ };
+
+ useEffect(() => {
+ updateScrollButtons();
+ }, [flights, cardsPerView]);
+
+ const scrollToIndex = (index: number) => {
+ if (!carouselRef.current) return;
+
+ const cardWidth = carouselRef.current.clientWidth / cardsPerView;
+ const scrollPosition = index * cardWidth;
+
+ carouselRef.current.scrollTo({
+ left: scrollPosition,
+ behavior: 'smooth'
+ });
+
+ setCurrentIndex(index);
+ };
+
+ const scrollLeft = () => {
+ const newIndex = Math.max(0, currentIndex - 1);
+ scrollToIndex(newIndex);
+ };
+
+ const scrollRight = () => {
+ const maxIndex = Math.max(0, flights.length - Math.floor(cardsPerView));
+ const newIndex = Math.min(maxIndex, currentIndex + 1);
+ scrollToIndex(newIndex);
+ };
+
+ const shouldShowNavigation = flights.length > Math.floor(cardsPerView);
+
+ // If no flights, show empty state with horizontal scroll on mobile
+ if (flights.length === 0) {
+ return (
+
+
+ {[...Array(3)].map((_, index) => (
+
+
+
+ ))}
+
+
+ );
+ }
+
+ return (
+
+ {/* Navigation Buttons - Only show on larger screens and positioned inside container */}
+ {shouldShowNavigation && cardsPerView >= 2 && (
+ <>
+
+
+
+
+
+
+
+ >
+ )}
+
+ {/* Carousel Container */}
+
= 2 ? '16px' : '12px', // Smaller gap on mobile
+ paddingLeft: shouldShowNavigation && cardsPerView >= 2 ? '40px' : '0px', // Space for nav buttons
+ paddingRight: shouldShowNavigation && cardsPerView >= 2 ? '40px' : '0px',
+ }}
+ onScroll={updateScrollButtons}
+ >
+ {flights.map((flight, index) => {
+ // Calculate card width more conservatively to prevent overflow
+ const gapSize = cardsPerView >= 2 ? 16 : 12;
+ const totalGaps = (cardsPerView - 1) * gapSize;
+ const availableWidth = 100; // percentage
+ const cardWidth = (availableWidth / cardsPerView) - (totalGaps / cardsPerView);
+
+ return (
+
+
+
+ );
+ })}
+
+
+ );
+};
+
+// Direct Flight Display Component - Shows exactly 3 distinct flights
+const DirectFlightDisplay = ({
+ flights,
+ onSelect,
+ isLoading,
+}: {
+ flights: FlightOption[];
+ onSelect: (flightOfferId: string) => void;
+ isLoading: boolean;
+}) => {
+ // Helper function to get flights sorted by different criteria
+ const getSortedFlights = (flights: FlightOption[], sortBy: 'price' | 'duration' | 'ranking') => {
+ const flightsCopy = [...flights];
+
+ switch (sortBy) {
+ case 'price':
+ return flightsCopy.sort((a, b) => (a.totalAmount || 0) - (b.totalAmount || 0));
+ case 'duration':
+ return flightsCopy.sort((a, b) => {
+ const getDurationMinutes = (duration: string) => {
+ const match = duration.match(/PT(\d+)H(\d+)?M?/);
+ if (match) {
+ const hours = parseInt(match[1]) || 0;
+ const minutes = parseInt(match[2]) || 0;
+ return hours * 60 + minutes;
+ }
+ return 0;
+ };
+ return getDurationMinutes(a.duration || '') - getDurationMinutes(b.duration || '');
+ });
+ case 'ranking':
+ return flightsCopy.sort((a, b) => (b.rankingScore || 0) - (a.rankingScore || 0));
+ default:
+ return flightsCopy;
+ }
+ };
+
+ // Get the three distinct flights to display
+ const getThreeDistinctFlights = () => {
+ if (flights.length === 0) return [];
+
+ const selectedFlights: FlightOption[] = [];
+ const usedFlightIds = new Set();
+
+ // 1. First priority: Best flight (highest ranking or recommended)
+ const recommendedFlight = flights.find(flight => flight.tags?.includes('recommended'));
+ const bestFlight = recommendedFlight || getSortedFlights(flights, 'ranking')[0];
+
+ if (bestFlight) {
+ // Ensure this flight has the "recommended" tag for display
+ const flightWithBestTag = {
+ ...bestFlight,
+ tags: [...(bestFlight.tags || []), 'recommended'].filter((tag, index, arr) => arr.indexOf(tag) === index)
+ };
+ selectedFlights.push(flightWithBestTag);
+ usedFlightIds.add(bestFlight.flightOfferId);
+ }
+
+ // 2. Second priority: Cheapest flight (not already selected)
+ const cheapestFlights = getSortedFlights(flights, 'price');
+ const cheapestFlight = cheapestFlights.find(flight => !usedFlightIds.has(flight.flightOfferId));
+
+ if (cheapestFlight) {
+ // Ensure this flight has the "cheapest" tag for display
+ const flightWithCheapestTag = {
+ ...cheapestFlight,
+ tags: [...(cheapestFlight.tags || []), 'cheapest'].filter((tag, index, arr) => arr.indexOf(tag) === index)
+ };
+ selectedFlights.push(flightWithCheapestTag);
+ usedFlightIds.add(cheapestFlight.flightOfferId);
+ }
+
+ // 3. Third priority: Fastest flight (not already selected)
+ const fastestFlights = getSortedFlights(flights, 'duration');
+ const fastestFlight = fastestFlights.find(flight => !usedFlightIds.has(flight.flightOfferId));
+
+ if (fastestFlight) {
+ // Ensure this flight has the "fastest" tag for display
+ const flightWithFastestTag = {
+ ...fastestFlight,
+ tags: [...(fastestFlight.tags || []), 'fastest'].filter((tag, index, arr) => arr.indexOf(tag) === index)
+ };
+ selectedFlights.push(flightWithFastestTag);
+ usedFlightIds.add(fastestFlight.flightOfferId);
+ }
+
+ // If we still don't have 3 flights, add more from the remaining flights
+ if (selectedFlights.length < 3) {
+ const remainingFlights = flights.filter(flight => !usedFlightIds.has(flight.flightOfferId));
+ const additionalFlights = remainingFlights.slice(0, 3 - selectedFlights.length);
+ selectedFlights.push(...additionalFlights);
+ }
+
+ return selectedFlights;
+ };
+
+ const flightsToShow = getThreeDistinctFlights();
+
+ console.log("DirectFlightDisplay - Flights to show:", flightsToShow.length);
+
+ // Always use ResponsiveCarousel for consistent display
+ return (
+
+ );
+};
+
+// Flight List Item Component for Bottom Sheet
+const FlightListItem = ({
+ flight,
+ onSelect,
+ isLoading,
+}: {
+ flight: FlightOption;
+ onSelect: (flightOfferId: string) => void;
+ isLoading?: boolean;
+}) => {
+ const formatTime = (isoString: string) => {
+ return new Date(isoString).toLocaleTimeString("en-US", {
+ hour: "2-digit",
+ minute: "2-digit",
+ hour12: false,
+ });
+ };
+
+ const formatDuration = (duration: string) => {
+ const match = duration.match(/PT(\d+)H(\d+)?M?/);
+ if (match) {
+ const hours = match[1];
+ const minutes = match[2] || "0";
+ return `${hours}h ${minutes}m`;
+ }
+ return duration;
+ };
+
+ const getAirlineInfo = (flight: FlightOption) => {
+ if (flight.segments && flight.segments.length > 0) {
+ const airlineName = flight.segments[0].airlineName || flight.segments[0].airlineIata || "Unknown";
+ const airlineIata = flight.segments[0].airlineIata || "";
+ // Truncate airline name to 10 characters
+ const airline = airlineName.length > 10 ? airlineName.substring(0, 10) + "..." : airlineName;
+
+ // If multiple flights, show individual flight numbers
+ if (flight.segments.length > 1) {
+ const flightNumbers = flight.segments.map(s => s.flightNumber).join(", ");
+ return {
+ airline,
+ airlineIata,
+ flightNumber: flightNumbers,
+ isMultiFlight: true
+ };
+ } else {
+ return {
+ airline,
+ airlineIata,
+ flightNumber: flight.segments[0].flightNumber,
+ isMultiFlight: false
+ };
+ }
+ }
+ return { airline: "Unknown", airlineIata: "", flightNumber: "Unknown", isMultiFlight: false };
+ };
+
+ const departureInfo = flight.departure;
+ const arrivalInfo = flight.arrival;
+ const duration = flight.duration ? formatDuration(flight.duration) : "Unknown";
+ const price = flight.totalAmount || 0;
+ const currency = flight.currency || "USD";
+ const currencySymbol = getCurrencySymbol(currency);
+ const { airline, airlineIata, flightNumber } = getAirlineInfo(flight);
+
+ return (
+ onSelect(flight.flightOfferId)}
+ >
+ {/* Mobile Layout */}
+
+ {/* Main Flight Row */}
+
+ {/* Left: Airline Info */}
+
+ {/* Airline Logo */}
+
+
+ {/* Airline Details */}
+
+
+ {airline.length > 12 ? airline.substring(0, 12) + '...' : airline}
+
+
+ {flightNumber}
+
+
+
+
+ {/* Center: Times and Duration */}
+
+ {/* Departure */}
+
+
+ {formatTime(departureInfo.date)}
+
+
+
+ {/* Duration & Stops */}
+
+
+ {duration}
+
+
+ {flight.segments.length === 1
+ ? "Non-stop"
+ : `${flight.segments.length - 1} stop${flight.segments.length - 1 > 1 ? "s" : ""}`}
+
+
+
+ {/* Arrival */}
+
+
+ {formatTime(arrivalInfo.date)}
+
+
+
+
+ {/* Right: Price */}
+
+
+ {currencySymbol}{price.toLocaleString()}
+
+
+
+
+
+
+
+ {/* Desktop Layout */}
+
+ {/* Left: Airline Info */}
+
+
+ {/* Airline Logo */}
+
+
{airline}
+
+
+ {flightNumber}
+
+
+
+ {/* Center-Left: Departure Time */}
+
+
+ {formatTime(departureInfo.date)}
+
+
{departureInfo.airportIata}
+
+
+ {/* Center: Duration & Stops */}
+
+
+ {duration}
+
+
+
+ {flight.segments.length > 1 && (
+
+ )}
+
+
+ {flight.segments.length === 1
+ ? "Non-stop"
+ : `${flight.segments.length - 1} stop${flight.segments.length - 1 > 1 ? "s" : ""}`}
+
+
+
+ {/* Center-Right: Arrival Time */}
+
+
+ {formatTime(arrivalInfo.date)}
+
+
{arrivalInfo.airportIata}
+
+
+ {/* Right: Price */}
+
+
+ {currencySymbol}{price.toLocaleString()}
+
+ {flight.offerRules?.isRefundable && (
+
Free Cancellation
+ )}
+
+
+
+ );
+};
+
+// Tab Component
+const FlightTabs = ({
+ flights,
+ onSelect,
+ isLoading,
+}: {
+ flights: FlightOption[];
+ onSelect: (flightOfferId: string) => void;
+ isLoading: boolean;
+}) => {
+ const [activeTab, setActiveTab] = useState<'recommended' | 'cheapest' | 'fastest'>('recommended');
+
+ // Organize flights by tags
+ const recommendedFlights = flights.filter(flight => flight.tags?.includes('recommended'));
+ const cheapestFlights = flights.filter(flight => flight.tags?.includes('cheapest'));
+ const fastestFlights = flights.filter(flight => flight.tags?.includes('fastest'));
+
+ // Debug logging
+ console.log("FlightTabs - Total flights:", flights.length);
+ console.log("FlightTabs - Recommended flights:", recommendedFlights.length);
+ console.log("FlightTabs - Cheapest flights:", cheapestFlights.length);
+ console.log("FlightTabs - Fastest flights:", fastestFlights.length);
+
+ // Fallback: If no flights have the expected tags, distribute them across tabs
+ let fallbackRecommended = recommendedFlights;
+ let fallbackCheapest = cheapestFlights;
+ let fallbackFastest = fastestFlights;
+
+ if (recommendedFlights.length === 0 && cheapestFlights.length === 0 && fastestFlights.length === 0 && flights.length > 0) {
+ console.log("No flights with expected tags found, using fallback distribution");
+ // Distribute flights across tabs as fallback
+ const flightsPerTab = Math.ceil(flights.length / 3);
+ fallbackRecommended = flights.slice(0, flightsPerTab);
+ fallbackCheapest = flights.slice(flightsPerTab, flightsPerTab * 2);
+ fallbackFastest = flights.slice(flightsPerTab * 2);
+ }
+
+ const tabs = [
+ {
+ id: 'recommended' as const,
+ label: 'Recommended',
+ icon: Star,
+ flights: fallbackRecommended,
+ color: 'text-blue-600 border-blue-600',
+ bgColor: 'bg-blue-50',
+ },
+ {
+ id: 'cheapest' as const,
+ label: 'Cheapest',
+ icon: DollarSign,
+ flights: fallbackCheapest,
+ color: 'text-green-600 border-green-600',
+ bgColor: 'bg-green-50',
+ },
+ {
+ id: 'fastest' as const,
+ label: 'Fastest',
+ icon: Zap,
+ flights: fallbackFastest,
+ color: 'text-orange-600 border-orange-600',
+ bgColor: 'bg-orange-50',
+ },
+ ];
+
+ const activeTabData = tabs.find(tab => tab.id === activeTab);
+
+ return (
+
+ {/* Tab Headers */}
+
+ {tabs.map((tab) => {
+ const Icon = tab.icon;
+ const isActive = activeTab === tab.id;
+
+ return (
+ setActiveTab(tab.id)}
+ className={cn(
+ "flex-1 flex items-center justify-center gap-2 py-3 px-4 text-sm font-medium border-b-2 transition-colors duration-200",
+ isActive
+ ? `${tab.color} ${tab.bgColor}`
+ : "text-gray-500 border-transparent hover:text-gray-700 hover:bg-gray-50"
+ )}
+ >
+
+ {tab.label}
+
+ {tab.flights.length}
+
+
+ );
+ })}
+
+
+ {/* Tab Content */}
+
+ {activeTabData && (
+ <>
+ {activeTabData.flights.length > 0 ? (
+
+ ) : (
+
+
+ {[...Array(3)].map((_, index) => (
+
+
+
+ ))}
+
+
+ )}
+ >
+ )}
+
+
+ );
+};
+
+const FlightOptionsWidget = (args: Record) => {
+ console.log("FlightOptionsWidget args:", args);
+ console.log("flightOffers:", args.flightOffers);
+
+ const thread = useStreamContext();
+ const [selectedFlight, setSelectedFlight] = useState(null);
+ const [isLoading, setIsLoading] = useState(false);
+ const [showAllFlights, setShowAllFlights] = useState(false);
+ const [bottomSheetFilter, setBottomSheetFilter] = useState<'cheapest' | 'fastest' | 'recommended'>('cheapest');
+
+ const allFlightTuples = args.flightOffers || [];
+
+ // Debug: Log flight tags
+ if (allFlightTuples.length > 0) {
+ console.log("Sample flight tags:", allFlightTuples[0]?.tags);
+ console.log("All flight tags:", allFlightTuples.map((f: any) => ({ id: f.flightOfferId, tags: f.tags })));
+ }
+
+ const handleSelectFlight = async (flightOfferId: string) => {
+ setSelectedFlight(flightOfferId);
+ setIsLoading(true);
+
+ const responseData = {
+ selectedFlightId: flightOfferId,
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ } catch (error) {
+ // Optional: already handled inside the utility
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const handleShowAllFlights = () => {
+ setShowAllFlights(true);
+ };
+
+ // Sort flights based on the selected filter
+ const getSortedFlights = (flights: FlightOption[], sortBy: 'cheapest' | 'fastest' | 'recommended') => {
+ const flightsCopy = [...flights];
+
+ switch (sortBy) {
+ case 'cheapest':
+ return flightsCopy.sort((a, b) => (a.totalAmount || 0) - (b.totalAmount || 0));
+ case 'fastest':
+ // Sort by duration (convert ISO duration to minutes for comparison)
+ return flightsCopy.sort((a, b) => {
+ const getDurationMinutes = (duration: string) => {
+ const match = duration.match(/PT(\d+)H(\d+)?M?/);
+ if (match) {
+ const hours = parseInt(match[1]) || 0;
+ const minutes = parseInt(match[2]) || 0;
+ return hours * 60 + minutes;
+ }
+ return 0;
+ };
+ return getDurationMinutes(a.duration || '') - getDurationMinutes(b.duration || '');
+ });
+ case 'recommended':
+ // Sort by ranking score (higher is better)
+ return flightsCopy.sort((a, b) => (b.rankingScore || 0) - (a.rankingScore || 0));
+ default:
+ return flightsCopy;
+ }
+ };
+
+ const sortedFlights = getSortedFlights(allFlightTuples, bottomSheetFilter);
+
+ // Check if we have any flights with the mandatory tags
+ const hasRecommended = allFlightTuples.some((flight: any) => flight.tags?.includes('recommended'));
+ const hasCheapest = allFlightTuples.some((flight: any) => flight.tags?.includes('cheapest'));
+ const hasFastest = allFlightTuples.some((flight: any) => flight.tags?.includes('fastest'));
+
+ // Show loading state if no mandatory tags are present (unless no flights at all)
+ const shouldShowLoading = allFlightTuples.length > 0 && (!hasRecommended || !hasCheapest || !hasFastest);
+
+ return (
+ <>
+
+
+
+ Available Flights
+
+
Choose from the best options
+
+
+ {/* Direct Flight Display - Only 3 Tagged Flights */}
+
+ {allFlightTuples.length > 0 ? (
+
+ ) : (
+ // Show loading state when no flights are available
+
+
+ {[...Array(3)].map((_, index) => (
+
+
+
+ ))}
+
+
+ )}
+
+
+ {/* Show All Flights Button */}
+ {allFlightTuples.length > 6 && (
+
+
+ Show all flights ({allFlightTuples.length} total)
+
+
+ )}
+
+ {/* Selection Feedback */}
+ {selectedFlight && (
+
+
+ Flight{" "}
+ {allFlightTuples.find((f: any) => f.flightOfferId === selectedFlight)
+ ?.segments?.[0]?.flightNumber || "Unknown"}{" "}
+ selected!
+
+
+ )}
+
+
+ {/* Bottom Sheet Modal for All Flights */}
+
+
+
+
+ All Available Flights ({allFlightTuples.length} flights)
+
+
+
+ {/* Filter Tabs */}
+
+
+ {[
+ { id: 'cheapest' as const, label: 'Cheapest', icon: DollarSign },
+ { id: 'fastest' as const, label: 'Fastest', icon: Zap },
+ { id: 'recommended' as const, label: 'Recommended', icon: Star },
+ ].map((tab) => {
+ const Icon = tab.icon;
+ const isActive = bottomSheetFilter === tab.id;
+
+ return (
+ setBottomSheetFilter(tab.id)}
+ className={cn(
+ "flex-1 flex items-center justify-center gap-2 py-3 px-4 text-sm font-medium border-b-2 transition-colors duration-200",
+ isActive
+ ? "text-blue-600 border-blue-600 bg-blue-50"
+ : "text-gray-500 border-transparent hover:text-gray-700 hover:bg-gray-50"
+ )}
+ >
+
+ {tab.label}
+
+ );
+ })}
+
+
+
+ {/* Flight List */}
+
+
+ {sortedFlights.map((flight: any, index: number) => (
+
+ ))}
+
+
+
+
+ >
+ );
+};
+
+export default FlightOptionsWidget;
diff --git a/src/components/widgets/flightStatus.wdiget.tsx b/src/components/widgets/flightStatus.wdiget.tsx
new file mode 100644
index 00000000..a5d44355
--- /dev/null
+++ b/src/components/widgets/flightStatus.wdiget.tsx
@@ -0,0 +1,238 @@
+'use client';
+
+import React from 'react';
+import Image from 'next/image';
+import { cn } from '@/lib/utils';
+
+interface FlightStatusData {
+ departureCode: string;
+ departureCity: string;
+ departureCountryCode: string;
+ departureTerminal: string;
+ departureGate: string;
+ arrivalCode: string;
+ arrivalCity: string;
+ arrivalCountryCode: string;
+ arrivalTerminal: string;
+ arrivalGate: string;
+ scheduledTime: string;
+ actualTime: string;
+ status: 'early' | 'on-time' | 'delayed';
+ statusText: string;
+ duration: string;
+ flightType: string;
+ airlineIata: string;
+ airlineName: string;
+ flightNumber: string;
+}
+
+// Mock flight status data matching the image
+const mockFlightStatus: FlightStatusData = {
+ departureCode: 'DEL',
+ departureCity: 'New delhi',
+ departureCountryCode: 'IN',
+ departureTerminal: 'Terminal 1',
+ departureGate: 'Gate 2',
+ arrivalCode: 'BOM',
+ arrivalCity: 'Mumbai',
+ arrivalCountryCode: 'IN',
+ arrivalTerminal: 'Terminal 1',
+ arrivalGate: 'Gate 2',
+ scheduledTime: '10:15',
+ actualTime: '08:15',
+ status: 'early',
+ statusText: '5m Early',
+ duration: '2h 5m',
+ flightType: 'Direct',
+ airlineIata: '6E',
+ airlineName: 'IndiGo',
+ flightNumber: '6E 123'
+};
+
+const getStatusColor = (status: 'early' | 'on-time' | 'delayed') => {
+ switch (status) {
+ case 'early':
+ return 'text-green-600';
+ case 'on-time':
+ return 'text-green-600';
+ case 'delayed':
+ return 'text-red-600';
+ default:
+ return 'text-black';
+ }
+};
+
+const getTimeColor = (status: 'early' | 'on-time' | 'delayed') => {
+ switch (status) {
+ case 'early':
+ return 'text-green-600';
+ case 'on-time':
+ return 'text-black';
+ case 'delayed':
+ return 'text-red-600';
+ default:
+ return 'text-black';
+ }
+};
+
+// Helper function to get airline logo path
+const getAirlineLogoPath = (airlineIata: string): string => {
+ if (!airlineIata) return '';
+ return `/airlines/${airlineIata.toUpperCase()}.png`;
+};
+
+// Helper function to convert country code to flag emoji
+const getCountryFlag = (countryCode: string): string => {
+ if (!countryCode || countryCode.length !== 2) return countryCode;
+
+ // Convert country code to flag emoji
+ const codePoints = countryCode
+ .toUpperCase()
+ .split('')
+ .map(char => 127397 + char.charCodeAt(0));
+
+ return String.fromCodePoint(...codePoints);
+};
+
+// Airline Logo Component
+const AirlineLogo = ({
+ airlineIata,
+ airlineName,
+ size = 'md'
+}: {
+ airlineIata: string;
+ airlineName: string;
+ size?: 'sm' | 'md' | 'lg'
+}) => {
+ const logoPath = getAirlineLogoPath(airlineIata);
+
+ // Size configurations
+ const sizeConfig = {
+ sm: { container: 'w-5 h-5', fallback: 'w-3 h-3' },
+ md: { container: 'w-6 h-6', fallback: 'w-4 h-4' },
+ lg: { container: 'w-8 h-8', fallback: 'w-6 h-6' }
+ };
+
+ const { container, fallback } = sizeConfig[size];
+
+ return (
+
+ {logoPath ? (
+
{
+ // Fallback to gray circle if image fails to load
+ const target = e.target as HTMLImageElement;
+ target.style.display = 'none';
+ const parent = target.parentElement;
+ if (parent) {
+ parent.innerHTML = `
`;
+ }
+ }}
+ />
+ ) : (
+
+ )}
+
+ );
+};
+
+const FlightStatusWidget = () => {
+ const flight = mockFlightStatus;
+
+ return (
+
+ {/* Airline Info Header */}
+
+
+
+
+ {flight.airlineName}
+
+
+ {flight.flightNumber}
+
+
+
+
+ {/* Departure Section */}
+
+
+
+
+ {flight.departureCode}
+
+
+ {getCountryFlag(flight.departureCountryCode)}
+
+ {flight.departureCity}
+
+
+
+ {flight.departureTerminal} . {flight.departureGate}
+
+
+
+
+ {flight.actualTime}
+
+
+ {flight.scheduledTime}
+
+ {flight.statusText}
+
+
+
+
+
+
+ {/* Flight Duration Info */}
+
+
+ {flight.duration} . {flight.flightType}
+
+
+
+ {/* Arrival Section */}
+
+
+
+
+ {flight.arrivalCode}
+
+
+ {getCountryFlag(flight.arrivalCountryCode)}
+
+ {flight.arrivalCity}
+
+
+
+ {flight.arrivalTerminal} . {flight.arrivalGate}
+
+
+
+
+ {flight.scheduledTime}
+
+
+ On time
+
+
+
+
+
+ );
+};
+
+export default FlightStatusWidget;
diff --git a/src/components/widgets/index.ts b/src/components/widgets/index.ts
new file mode 100644
index 00000000..78b9788a
--- /dev/null
+++ b/src/components/widgets/index.ts
@@ -0,0 +1,33 @@
+import FlightOptionsWidget from "./flightOptions.widget";
+import FlightStatusWidget from "./flightStatus.wdiget";
+import SearchCriteriaWidget from "./searchCriteria.widget";
+import LoungeWidget from "./lounge.widget";
+import weatherWidget from "./weather.widget";
+import ReviewWidget from "./review.widget";
+import PaymentWidget from "./payment.widget";
+import NonAgentFlowWidget from "./non-agent-flow.widget";
+import SeatPreferenceWidget from "./seatPreference.widget";
+import SeatSelectionWidget from "./seatSelection.widget";
+import SeatPaymentWidget from "./seatPayment.widget";
+import SeatCombinedWidget from "./seatCombined.widget";
+import AddBaggageWidget from "./addBaggage.widget";
+import WhosTravellingWidget from "./whosTravelling.widget";
+
+export const componentMap = {
+ SearchCriteriaWidget, // Add mapping for SearchCriteria type
+ FlightOptionsWidget,
+ FlightStatusWidget, /// simple widget needs to send from server
+ LoungeWidget, /// simple widget needs to send from server
+ weatherWidget, /// simple widget needs to send from server
+ TravelerDetailsWidget: WhosTravellingWidget, /// Flight booking review widget
+ PaymentWidget, /// Razorpay payment widget
+ NonAgentFlowWidget, /// Non-agent flow payment widget with bottom sheet
+ SeatPreferenceWidget, /// Seat preference selection widget
+ SeatSelectionWidget, /// Visual seat map selection widget
+ SeatPaymentWidget, /// Seat payment confirmation widget
+ SeatCombinedWidget, /// Combined seat selection widget with all options
+ AddBaggageWidget, /// Baggage selection widget with weight and price options
+ WhosTravellingWidget, /// Passenger selection widget for booking
+} as const;
+
+export type ComponentType = keyof typeof componentMap;
diff --git a/src/components/widgets/lounge.widget.tsx b/src/components/widgets/lounge.widget.tsx
new file mode 100644
index 00000000..cd37c60f
--- /dev/null
+++ b/src/components/widgets/lounge.widget.tsx
@@ -0,0 +1,245 @@
+'use client';
+
+import React, { useState, useRef } from 'react';
+import Image from 'next/image';
+import { Button } from '@/components/common/ui/button';
+import { MapPin, Check, CreditCard } from 'lucide-react';
+import { cn } from '@/lib/utils';
+
+interface Lounge {
+ id: string;
+ name: string;
+ location: string;
+ image: string;
+ accessType: 'free' | 'paid';
+ accessText: string;
+ terminal?: string;
+}
+
+// Mock lounge data matching the design
+const mockLoungeData: Lounge[] = [
+ {
+ id: '1',
+ name: 'Encalm Lounge',
+ location: 'International Departures',
+ image: '/api/placeholder/300/200',
+ accessType: 'free',
+ accessText: 'Free access',
+ terminal: 'Terminal 1'
+ },
+ {
+ id: '2',
+ name: 'Plaza Premium Lounge',
+ location: 'International Departures',
+ image: '/api/placeholder/300/200',
+ accessType: 'paid',
+ accessText: 'Check eligibility',
+ terminal: 'Terminal 1'
+ },
+ {
+ id: '3',
+ name: 'Business Lounge',
+ location: 'Domestic Departures',
+ image: '/api/placeholder/300/200',
+ accessType: 'free',
+ accessText: 'Free access',
+ terminal: 'Terminal 2'
+ },
+ {
+ id: '4',
+ name: 'Executive Lounge',
+ location: 'International Departures',
+ image: '/api/placeholder/300/200',
+ accessType: 'paid',
+ accessText: 'Check eligibility',
+ terminal: 'Terminal 2'
+ }
+];
+
+const terminals = ['Terminal 1', 'Terminal 2', 'Terminal 3'];
+
+const LoungCard = ({ lounge }: { lounge: Lounge }) => {
+ return (
+
+ {/* Lounge Image */}
+
+ {
+ // Fallback to a gradient background if image fails to load
+ const target = e.target as HTMLImageElement;
+ target.style.display = 'none';
+ target.parentElement!.style.background = 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)';
+ }}
+ />
+
+
+ {/* Lounge Info */}
+
+ {/* Lounge Name */}
+
+ {lounge.name}
+
+
+ {/* Location */}
+
+
+
+ {lounge.location}
+
+
+
+ {/* Access Info */}
+
+ {lounge.accessType === 'free' ? (
+ <>
+
+
+
+
+ {lounge.accessText}
+
+ >
+ ) : (
+ <>
+
+
+
+
+ {lounge.accessText}
+
+ >
+ )}
+
+
+
+ );
+};
+
+const LoungesWidget = () => {
+ const [activeTerminal, setActiveTerminal] = useState('Terminal 1');
+ const scrollContainerRef = useRef(null);
+ const [isDragging, setIsDragging] = useState(false);
+ const [startX, setStartX] = useState(0);
+ const [scrollLeft, setScrollLeft] = useState(0);
+
+ // Filter lounges by active terminal
+ const filteredLounges = mockLoungeData.filter(lounge => lounge.terminal === activeTerminal);
+
+ // Enhanced Touch/Mouse drag handlers for mobile-like carousel
+ const handleMouseDown = (e: React.MouseEvent) => {
+ if (window.innerWidth > 640) { // Only enable mouse drag on desktop
+ setIsDragging(true);
+ setStartX(e.pageX - (scrollContainerRef.current?.offsetLeft || 0));
+ setScrollLeft(scrollContainerRef.current?.scrollLeft || 0);
+ if (scrollContainerRef.current) {
+ scrollContainerRef.current.style.cursor = 'grabbing';
+ }
+ }
+ };
+
+ const handleMouseMove = (e: React.MouseEvent) => {
+ if (!isDragging || !scrollContainerRef.current || window.innerWidth <= 640) return;
+ e.preventDefault();
+ const x = e.pageX - (scrollContainerRef.current.offsetLeft || 0);
+ const walk = (x - startX) * 1.5;
+ scrollContainerRef.current.scrollLeft = scrollLeft - walk;
+ };
+
+ const handleMouseUp = () => {
+ setIsDragging(false);
+ if (scrollContainerRef.current) {
+ scrollContainerRef.current.style.cursor = 'grab';
+ }
+ };
+
+ const handleTouchStart = (e: React.TouchEvent) => {
+ setIsDragging(true);
+ setStartX(e.touches[0].pageX);
+ setScrollLeft(scrollContainerRef.current?.scrollLeft || 0);
+ };
+
+ const handleTouchMove = (e: React.TouchEvent) => {
+ if (!isDragging || !scrollContainerRef.current) return;
+ const x = e.touches[0].pageX;
+ const walk = (startX - x) * 1.2;
+ scrollContainerRef.current.scrollLeft = scrollLeft + walk;
+ };
+
+ const handleTouchEnd = () => {
+ setIsDragging(false);
+ };
+
+ return (
+
+ {/* Header */}
+
+
Lounges
+
+ See All
+
+
+
+ {/* Terminal Tabs - Pill Shaped, Left Aligned */}
+
+ {terminals.map((terminal) => (
+ setActiveTerminal(terminal)}
+ className={cn(
+ "px-3 sm:px-4 py-1.5 sm:py-2 text-xs sm:text-sm font-medium rounded-full transition-all duration-200 border",
+ activeTerminal === terminal
+ ? "bg-gray-900 text-white border-gray-900"
+ : "bg-white text-gray-600 border-gray-300 hover:border-gray-400 hover:text-gray-900"
+ )}
+ >
+ {terminal}
+
+ ))}
+
+
+ {/* Lounges Carousel */}
+
+
+ {filteredLounges.map((lounge) => (
+
+ ))}
+
+
+
+ );
+};
+
+export default LoungesWidget;
diff --git a/src/components/widgets/non-agent-flow.widget.tsx b/src/components/widgets/non-agent-flow.widget.tsx
new file mode 100644
index 00000000..12774a7a
--- /dev/null
+++ b/src/components/widgets/non-agent-flow.widget.tsx
@@ -0,0 +1,558 @@
+import React, { useEffect, useState, useCallback } from "react";
+import { Button } from "@/components/ui/button";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+import {
+ Loader2,
+ CreditCard,
+ CheckCircle,
+ XCircle,
+ Lock,
+ AlertCircle,
+ Plane,
+} from "lucide-react";
+import { toast } from "sonner";
+import { FlyoLogoSVG } from "@/components/icons/langgraph";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet";
+import {
+ executePrepayment,
+ verifyTransaction,
+ formatAmount,
+ getPaymentStatusDescription,
+ getBookingStatusDescription,
+ isPaymentAndBookingSuccessful,
+ type TransactionVerifyResponse,
+} from "@/services/paymentService";
+import { useNonAgentFlow } from "@/providers/NonAgentFlowContext";
+
+interface NonAgentFlowWidgetProps {
+ tripId: string;
+ flightItinerary?: {
+ userContext: {
+ userDetails: any;
+ userId: string;
+ };
+ selectionContext: {
+ selectedFlightOffers: any[];
+ };
+ };
+ itinId?: string;
+ apiData?: any;
+ onClose?: () => void;
+ onPaymentSuccess?: (response: TransactionVerifyResponse) => void;
+ onPaymentFailure?: (error: string) => void;
+}
+
+declare global {
+ interface Window {
+ Razorpay: any;
+ }
+}
+
+// Payment status types
+type PaymentStatus = "idle" | "loading" | "processing" | "success" | "failed";
+
+interface PaymentState {
+ status: PaymentStatus;
+ prepaymentData?: any;
+ verificationResponse?: TransactionVerifyResponse;
+ error?: string;
+}
+
+// Bottom sheet wrapper for NonAgentFlowWidget
+const NonAgentFlowBottomSheet: React.FC = (props) => {
+ const [isOpen, setIsOpen] = useState(true);
+
+ // Extract tripId from the interrupt data structure if available
+ const interruptData = props.apiData?.value?.widget?.args || props.apiData;
+ const extractedTripId = interruptData?.tripId || props.tripId;
+
+ const handleClose = () => {
+ setIsOpen(false);
+ props.onClose?.();
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ Complete Your Booking
+
+
+
+ ✕
+
+
+
+
+
+
+
+
+
+ );
+};
+
+const NonAgentFlowWidgetContent: React.FC<
+ NonAgentFlowWidgetProps & {
+ onClose: () => void;
+ setIsOpen: (isOpen: boolean) => void;
+ }
+> = ({ tripId, onClose, setIsOpen, onPaymentSuccess, onPaymentFailure }) => {
+ const { closeWidget } = useNonAgentFlow();
+ const [paymentState, setPaymentState] = useState({
+ status: "idle",
+ });
+ const [countdown, setCountdown] = useState(10);
+ const [isCountdownActive, setIsCountdownActive] = useState(false);
+ const [hasUserClicked, setHasUserClicked] = useState(false);
+
+ // Load Razorpay script
+ useEffect(() => {
+ const script = document.createElement("script");
+ script.src = "https://checkout.razorpay.com/v1/checkout.js";
+ script.async = true;
+ document.body.appendChild(script);
+
+ return () => {
+ document.body.removeChild(script);
+ };
+ }, []);
+
+ // Define handlePaymentClick early so it can be used in useEffect
+ const handlePaymentClick = useCallback(() => {
+ setHasUserClicked(true);
+ setIsCountdownActive(false);
+ // We'll call initiatePayment directly here to avoid dependency issues
+ setPaymentState({ status: "loading" });
+
+ // Trigger payment initiation
+ (async () => {
+ try {
+ // Validate tripId
+ if (!tripId) {
+ throw new Error("Trip ID is required but not provided");
+ }
+
+ // Step 1: Execute prepayment API
+ console.log("Initiating prepayment for tripId:", tripId);
+ const prepaymentResponse = await executePrepayment(tripId);
+
+ if (!prepaymentResponse.success) {
+ throw new Error(prepaymentResponse.message || "Prepayment failed");
+ }
+
+ setPaymentState({
+ status: "processing",
+ prepaymentData: prepaymentResponse.data,
+ });
+
+ // Step 2: Initialize Razorpay payment
+ const options = {
+ key: prepaymentResponse.data.transaction.key,
+ amount: prepaymentResponse.data.transaction.amount,
+ currency: prepaymentResponse.data.transaction.currency || "INR",
+ name: prepaymentResponse.data.transaction.name,
+ description: prepaymentResponse.data.transaction.description,
+ order_id: prepaymentResponse.data.transaction.razorpay_order_id,
+ handler: async function (response: any) {
+ try {
+ console.log("Razorpay payment successful:", response);
+
+ // Step 3: Verify transaction
+ const verificationResponse = await verifyTransaction({
+ tripId,
+ transaction_id:
+ prepaymentResponse.data.transaction.transaction_id,
+ razorpay_payment_id: response.razorpay_payment_id,
+ razorpay_signature: response.razorpay_signature,
+ razorpay_order_id: response.razorpay_order_id,
+ });
+
+ console.log("Verification response:", verificationResponse);
+ setPaymentState({
+ status: "success",
+ prepaymentData: prepaymentResponse.data,
+ verificationResponse,
+ });
+
+ onPaymentSuccess?.(verificationResponse);
+
+ // Show success message
+ if (isPaymentAndBookingSuccessful(verificationResponse)) {
+ toast.success("Payment and booking completed successfully!");
+ // Don't show reopen button on successful payment
+ closeWidget();
+ } else {
+ toast.warning(
+ "Payment completed but booking status needs attention",
+ );
+ }
+ } catch (error) {
+ console.error("Transaction verification failed:", error);
+ setPaymentState({
+ status: "failed",
+ prepaymentData: prepaymentResponse.data,
+ error:
+ error instanceof Error ? error.message : "Verification failed",
+ });
+ onPaymentFailure?.(
+ error instanceof Error ? error.message : "Verification failed",
+ );
+ toast.error("Payment verification failed");
+ }
+ },
+ prefill: {
+ name: "Customer Name",
+ email: "customer@example.com",
+ },
+ theme: {
+ color: "#3B82F6",
+ },
+ modal: {
+ ondismiss: function () {
+ setPaymentState({
+ status: "failed",
+ error: "Payment cancelled by user",
+ });
+ onPaymentFailure?.("Payment cancelled by user");
+ },
+ },
+ };
+
+ const razorpay = new window.Razorpay(options);
+ razorpay.open();
+ } catch (error) {
+ console.error("Payment initiation failed:", error);
+ setPaymentState({
+ status: "failed",
+ error:
+ error instanceof Error ? error.message : "Payment initiation failed",
+ });
+ onPaymentFailure?.(
+ error instanceof Error ? error.message : "Payment initiation failed",
+ );
+ toast.error("Failed to initiate payment");
+ }
+ })();
+ }, [tripId, onPaymentSuccess, onPaymentFailure, closeWidget]);
+
+ // Countdown effect
+ useEffect(() => {
+ if (isCountdownActive && countdown > 0 && !hasUserClicked) {
+ const timer = setTimeout(() => {
+ setCountdown(countdown - 1);
+ }, 1000);
+ return () => clearTimeout(timer);
+ } else if (isCountdownActive && countdown === 0 && !hasUserClicked) {
+ // Auto-trigger payment when countdown reaches 0
+ handlePaymentClick();
+ }
+ }, [countdown, isCountdownActive, hasUserClicked, handlePaymentClick]);
+
+ // Start countdown when component mounts
+ useEffect(() => {
+ if (paymentState.status === "idle") {
+ setIsCountdownActive(true);
+ }
+ }, [paymentState.status]);
+
+
+
+ // Remove auto-start payment flow - now controlled by user interaction or countdown
+
+ const retryPayment = useCallback(() => {
+ setPaymentState({ status: "idle" });
+ setCountdown(10);
+ setIsCountdownActive(true);
+ setHasUserClicked(false);
+ }, []);
+
+ const renderContent = () => {
+ switch (paymentState.status) {
+ case "loading":
+ return (
+
+
+
+
+ Preparing Payment
+
+
+ Setting up your payment gateway...
+
+
+
+ );
+
+ case "processing":
+ return (
+
+
+
+
+ Processing Payment
+
+
+
+ Please complete the payment in the popup window
+
+
+ );
+
+ case "success":
+ return (
+
+
+
+
+
+
+
+ Payment Successful!
+
+
+ Your payment has been processed successfully
+
+
+
+
+ {paymentState.verificationResponse && (
+
+
+
+ Booking Status
+
+
+
+
+
+ Payment Status:
+
+
+ {getPaymentStatusDescription(
+ paymentState.verificationResponse.data.paymentStatus,
+ )}
+
+
+
+
+ Booking Status:
+
+
+ {getBookingStatusDescription(
+ paymentState.verificationResponse.data.bookingStatus,
+ )}
+
+
+ {paymentState.verificationResponse.data.bookingError && (
+
+
+ Note:{" "}
+ {paymentState.verificationResponse.data.bookingError}
+
+
+ )}
+
+
+ )}
+
+ );
+
+ case "failed":
+ return (
+
+
+
+
+
+
+
+ Payment Failed
+
+
+ {paymentState.error || "Something went wrong"}
+
+
+
+
+
+
+
+ Retry Payment
+
+
+ Cancel
+
+
+
+ );
+
+ case "idle":
+ default:
+ return (
+
+
+
+
+ Complete Your Payment
+
+
+ Your booking is ready. Complete the payment to confirm your flight.
+
+
+
+
+
+
+ {/* Countdown animation background */}
+ {isCountdownActive && !hasUserClicked && (
+
+ )}
+
+
+ {isCountdownActive && !hasUserClicked
+ ? `Make Payment (${countdown}s)`
+ : "Make Payment"
+ }
+
+
+
+ Cancel
+
+
+
+ );
+ }
+ };
+
+ return (
+
+ {/* Flight Information Card */}
+ {paymentState.prepaymentData && (
+
+
+
+
+ Flight Details
+
+
+
+
+
+
+ Trip ID:
+
+ {tripId}
+
+
+
+ Amount:
+
+
+ {paymentState.prepaymentData.transaction.amount
+ ? formatAmount(
+ paymentState.prepaymentData.transaction.amount,
+ "INR",
+ )
+ : "₹0.00"}
+
+
+
+
+
+ )}
+
+ {/* Main Content */}
+ {renderContent()}
+
+ );
+};
+
+const NonAgentFlowWidget: React.FC = (props) => {
+ const { openWidget, closeWidget } = useNonAgentFlow();
+
+ // If called from interrupt handler, extract tripId from apiData
+ if (props.apiData) {
+ // Extract tripId from the interrupt data structure
+ const interruptData = props.apiData.value?.widget?.args || props.apiData;
+ const extractedTripId = interruptData.tripId || props.tripId;
+
+ // For interrupt-triggered widgets, don't use context - render directly
+ return (
+ {
+ // When closing from interrupt, initialize context for reopen button
+ openWidget({
+ tripId: extractedTripId,
+ flightItinerary: interruptData.flightItinerary,
+ itinId: interruptData.itinId,
+ });
+ closeWidget();
+ }}
+ setIsOpen={() => {}}
+ />
+ );
+ }
+ return ;
+};
+
+export default NonAgentFlowWidget;
diff --git a/src/components/widgets/payment.widget.tsx b/src/components/widgets/payment.widget.tsx
new file mode 100644
index 00000000..8c491a5c
--- /dev/null
+++ b/src/components/widgets/payment.widget.tsx
@@ -0,0 +1,401 @@
+import React, { useEffect, useState } from "react";
+import { Button } from "@/components/ui/button";
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from "@/components/ui/card";
+import { Loader2, CreditCard, CheckCircle, XCircle, Lock } from "lucide-react";
+import { toast } from "sonner";
+import { FlyoLogoSVG } from "@/components/icons/langgraph";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet";
+
+interface PaymentWidgetProps {
+ transaction_id: string;
+ reference_id: string;
+ razorpay_order_id: string;
+ amount: number;
+ currency: string;
+ razorpayKey: string;
+ name: string;
+ description: string;
+}
+
+declare global {
+ interface Window {
+ Razorpay: any;
+ }
+}
+
+// Bottom sheet wrapper for payment widget
+const PaymentBottomSheet: React.FC = (props) => {
+ const [isOpen, setIsOpen] = useState(true);
+
+ const handleClose = () => {
+ setIsOpen(false);
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+ Complete Payment
+
+
+
+ ✕
+
+
+
+
+
+
+
+ );
+};
+
+// Main payment widget content
+const PaymentWidgetContent: React.FC<
+ PaymentWidgetProps & {
+ onClose: () => void;
+ setIsOpen: (isOpen: boolean) => void;
+ }
+> = ({
+ transaction_id,
+ reference_id,
+ razorpay_order_id,
+ amount,
+ currency,
+ razorpayKey,
+ name,
+ description,
+ onClose,
+ setIsOpen,
+}) => {
+ const [isLoading, setIsLoading] = useState(false);
+ const [paymentStatus, setPaymentStatus] = useState<
+ "pending" | "success" | "failed"
+ >("pending");
+
+ useEffect(() => {
+ // Load Razorpay script
+ const script = document.createElement("script");
+ script.src = "https://checkout.razorpay.com/v1/checkout.js";
+ script.async = true;
+ script.onload = () => {
+ console.log("Razorpay script loaded successfully");
+ };
+ script.onerror = () => {
+ console.error("Failed to load Razorpay script");
+ toast.error("Failed to load payment gateway");
+ };
+ document.body.appendChild(script);
+
+ return () => {
+ document.body.removeChild(script);
+ };
+ }, []);
+
+ const handlePayment = async () => {
+ if (!window.Razorpay) {
+ toast.error("Payment gateway not loaded. Please refresh the page.");
+ return;
+ }
+
+ setIsLoading(true);
+
+ try {
+ const options = {
+ key: razorpayKey,
+ amount: amount * 100, // Razorpay expects amount in paise
+ currency: currency,
+ name: name,
+ description: description,
+ order_id: razorpay_order_id,
+ handler: async function (response: any) {
+ console.log("Payment successful:", response);
+ setIsOpen(true); // Reopen bottom sheet
+
+ try {
+ // Send payment verification to backend
+ const verificationResponse = await fetch("/api/payment/verify", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ transaction_id,
+ reference_id,
+ razorpay_payment_id: response.razorpay_payment_id,
+ razorpay_signature: response.razorpay_signature,
+ razorpay_order_id,
+ }),
+ });
+
+ if (verificationResponse.ok) {
+ setPaymentStatus("success");
+ toast.success("Payment completed and verified successfully!");
+ } else {
+ console.error("Payment verification failed");
+ setPaymentStatus("failed");
+ toast.error(
+ "Payment completed but verification failed. Please contact support.",
+ );
+ }
+ } catch (error) {
+ console.error("Payment verification error:", error);
+ setPaymentStatus("failed");
+ toast.error(
+ "Payment completed but verification failed. Please contact support.",
+ );
+ }
+ },
+ prefill: {
+ name: "Customer Name",
+ email: "customer@example.com",
+ contact: "+919999999999",
+ },
+ notes: {
+ transaction_id,
+ reference_id,
+ },
+ theme: {
+ color: "#286BF9", // Flyo blue color
+ },
+ modal: {
+ ondismiss: function () {
+ setIsLoading(false);
+ setIsOpen(true); // Reopen bottom sheet
+ toast.info("Payment cancelled");
+ },
+ },
+ };
+
+ setIsOpen(false); // Close bottom sheet before opening Razorpay
+ const razorpay = new window.Razorpay(options);
+ razorpay.open();
+ } catch (error) {
+ console.error("Payment initiation failed:", error);
+ setPaymentStatus("failed");
+ toast.error("Failed to initiate payment. Please try again.");
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const formatAmount = (amount: number, currency: string) => {
+ return new Intl.NumberFormat("en-IN", {
+ style: "currency",
+ currency: currency,
+ }).format(amount);
+ };
+
+ if (paymentStatus === "success") {
+ return (
+
+
+
+
+
+
+ Payment Successful!
+
+
+ Your payment has been processed successfully.
+
+
+
+
+
+
+
+
+ Transaction ID:{" "}
+ {transaction_id}
+
+
+ Amount:{" "}
+
+ {formatAmount(amount, currency)}
+
+
+
+
+
+ setPaymentStatus("pending")}
+ className="w-full"
+ >
+ Make Another Payment
+
+
+ Close
+
+
+
+ );
+ }
+
+ if (paymentStatus === "failed") {
+ return (
+
+
+
+
+
+
+ Payment Failed
+
+
+ There was an issue processing your payment.
+
+
+
+
+ setPaymentStatus("pending")}
+ className="w-full bg-gradient-to-r from-blue-600 to-indigo-600 hover:from-blue-700 hover:to-indigo-700"
+ >
+ Try Again
+
+
+ Close
+
+
+
+ );
+ }
+
+ return (
+
+ {/* Header with Flyo branding */}
+
+
+
+
+
+ Secure Payment
+
+
{description}
+
+
+ {/* Payment Details Card */}
+
+
+
+
+
+
+
Payment Details
+
+
+
+
+
+ Amount:
+
+ {formatAmount(amount, currency)}
+
+
+
+ Reference ID:
+
+ {reference_id}
+
+
+
+
+
+
+ {/* Payment Button */}
+
+
+ {isLoading ? (
+ <>
+
+ Processing...
+ >
+ ) : (
+ <>
+
+ Pay {formatAmount(amount, currency)}
+ >
+ )}
+
+
+
+ Cancel Payment
+
+
+
+ {/* Footer */}
+
+
+ Powered by Razorpay • Secured
+ by Flyo
+
+
+
+ );
+};
+
+// Export the bottom sheet version as the main component
+const PaymentWidget: React.FC = (props) => {
+ return ;
+};
+
+export default PaymentWidget;
diff --git a/src/components/widgets/review-widget-demo.tsx b/src/components/widgets/review-widget-demo.tsx
new file mode 100644
index 00000000..93d1ba08
--- /dev/null
+++ b/src/components/widgets/review-widget-demo.tsx
@@ -0,0 +1,276 @@
+"use client";
+
+import React, { useState } from "react";
+import ReviewWidget from "./review.widget";
+import { Button } from "@/components/common/ui/button";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet";
+
+// Example API response data
+const exampleApiData = {
+ "value": {
+ "type": "widget",
+ "widget": {
+ "type": "TravelerDetailsWidget",
+ "args": {
+ "flightItinerary": {
+ "userContext": {
+ "userDetails": {
+ "travellerId": 27912,
+ "firstName": "MITESH JAGDISH",
+ "lastName": "BALDHA",
+ "dateOfBirth": "1989-01-25",
+ "gender": "Male",
+ "nationality": "Indian",
+ "numberOfFlights": 57,
+ "email": "ceo@explerainc.com",
+ "phone": [
+ {
+ "countryCode": "",
+ "number": "+919737332299"
+ }
+ ],
+ "isPrimaryTraveller": true,
+ "documents": [
+ {
+ "documentId": 55,
+ "documentType": "passport",
+ "documentNumber": "Z6956116",
+ "nationality": "India",
+ "expiryDate": "2033-03-01",
+ "issuingDate": "2017-05-31",
+ "issuingCountry": "India",
+ "documentUrl": "https://hh-boarding-pass.s3.ap-south-1.amazonaws.com/user-documents/12118_1753255060955_4_PASSPORT___MITESH_BALDHA_2.jpg"
+ }
+ ]
+ },
+ "savedTravellers": [
+ {
+ "travellerId": 27912,
+ "firstName": "MITESH JAGDISH",
+ "lastName": "BALDHA",
+ "dateOfBirth": "1989-01-25",
+ "gender": "Male",
+ "nationality": "Indian",
+ "numberOfFlights": 57,
+ "email": "ceo@explerainc.com",
+ "phone": [
+ {
+ "countryCode": "",
+ "number": "+919737332299"
+ }
+ ],
+ "isPrimaryTraveller": true,
+ "documents": [
+ {
+ "documentId": 55,
+ "documentType": "passport",
+ "documentNumber": "Z6956116",
+ "nationality": "India",
+ "expiryDate": "2033-03-01",
+ "issuingDate": "2017-05-31",
+ "issuingCountry": "India",
+ "documentUrl": "https://hh-boarding-pass.s3.ap-south-1.amazonaws.com/user-documents/12118_1753255060955_4_PASSPORT___MITESH_BALDHA_2.jpg"
+ }
+ ]
+ },
+ {
+ "travellerId": 27896,
+ "firstName": "SANDEEP VITHALBHAI",
+ "lastName": "SOJITRA",
+ "dateOfBirth": "",
+ "gender": "Male",
+ "nationality": "Indian",
+ "numberOfFlights": 19,
+ "email": "explera.surat@gmail.com",
+ "phone": [
+ {
+ "countryCode": "",
+ "number": "+919624332299"
+ }
+ ],
+ "isPrimaryTraveller": false,
+ "documents": [
+ {
+ "documentId": 74,
+ "documentType": "passport",
+ "documentNumber": "Z3690598",
+ "nationality": "India",
+ "expiryDate": "2027-02-07",
+ "issuingDate": "2017-02-08",
+ "issuingCountry": "Surat, India",
+ "documentUrl": "https://hh-boarding-pass.s3.ap-south-1.amazonaws.com/user-documents/12118_1753603930881_Screenshot_2025_07_27_at_13.41.58.png"
+ }
+ ]
+ }
+ ]
+ },
+ "selectionContext": {
+ "selectedFlightOffers": [
+ {
+ "flightOfferId": "1",
+ "totalEmission": 0,
+ "totalEmissionUnit": "Kg",
+ "currency": "INR",
+ "totalAmount": 5015,
+ "duration": "PT2H55M",
+ "departure": {
+ "date": "2025-08-24T10:25:00",
+ "airportIata": "BLR",
+ "airportName": "",
+ "cityCode": "BLR",
+ "countryCode": "IN"
+ },
+ "arrival": {
+ "date": "2025-08-24T13:20:00",
+ "airportIata": "DEL",
+ "airportName": "",
+ "cityCode": "DEL",
+ "countryCode": "IN"
+ },
+ "segments": [
+ {
+ "id": "98",
+ "airlineIata": "AI",
+ "flightNumber": "9478",
+ "duration": "PT2H55M",
+ "aircraftType": "BOEING 737 ALL SERIES PASSENGER",
+ "airlineName": "",
+ "departure": {
+ "date": "2025-08-24T10:25:00",
+ "airportIata": "BLR",
+ "airportName": "",
+ "cityCode": "BLR",
+ "countryCode": "IN"
+ },
+ "arrival": {
+ "date": "2025-08-24T13:20:00",
+ "airportIata": "DEL",
+ "airportName": "",
+ "cityCode": "DEL",
+ "countryCode": "IN"
+ }
+ }
+ ],
+ "offerRules": {
+ "isRefundable": false
+ },
+ "rankingScore": 0,
+ "pros": [],
+ "cons": [],
+ "tags": [
+ "cheapest",
+ "recommended"
+ ]
+ }
+ ]
+ }
+ },
+ "bookingRequirements": {
+ "emailAddressRequired": true,
+ "invoiceAddressRequired": false,
+ "mailingAddressRequired": false,
+ "phoneCountryCodeRequired": false,
+ "mobilePhoneNumberRequired": true,
+ "phoneNumberRequired": false,
+ "postalCodeRequired": false,
+ "travelerRequirements": null
+ }
+ }
+ }
+ }
+};
+
+// Example with travelerRequirements not null (shows travel documents)
+const exampleApiDataWithTravelDocs = {
+ ...exampleApiData,
+ value: {
+ ...exampleApiData.value,
+ widget: {
+ ...exampleApiData.value.widget,
+ args: {
+ ...exampleApiData.value.widget.args,
+ bookingRequirements: {
+ ...exampleApiData.value.widget.args.bookingRequirements,
+ travelerRequirements: {
+ documentRequired: true,
+ passportRequired: true
+ }
+ }
+ }
+ }
+ }
+};
+
+const ReviewWidgetDemo: React.FC = () => {
+ const [showBottomSheet, setShowBottomSheet] = useState(false);
+
+ const handleSubmit = (data: any) => {
+ console.log("Booking data submitted:", data);
+ alert("Booking submitted successfully!");
+ };
+
+ return (
+
+
Review Widget Demo
+
+
+
Bottom Sheet Mode (No Travel Docs - travelerRequirements: null)
+
setShowBottomSheet(true)}>
+ Open Review Widget in Bottom Sheet
+
+
+
+
+
+
+ Review Your Booking
+
+
+
+
+ setShowBottomSheet(false)}
+ />
+
+
+
+
+
+
+
With Travel Documents (travelerRequirements: not null)
+
+
+
+
+
Without Travel Documents (travelerRequirements: null)
+
+
+
+
+
Regular Mode (Mock Data)
+
+
+
+ );
+};
+
+export default ReviewWidgetDemo;
diff --git a/src/components/widgets/review.widget.tsx b/src/components/widgets/review.widget.tsx
new file mode 100644
index 00000000..36f6f67a
--- /dev/null
+++ b/src/components/widgets/review.widget.tsx
@@ -0,0 +1,3238 @@
+"use client";
+
+import React, { useState, useMemo } from "react";
+import { Button } from "@/components/common/ui/button";
+import { Input } from "@/components/common/ui/input";
+import { Label } from "@/components/common/ui/label";
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/common/ui/select";
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/components/common/ui/popover";
+import { Calendar } from "@/components/ui/calendar";
+import {
+ Command,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+ CommandList,
+} from "@/components/ui/command";
+import {
+ ArrowRight,
+ Calendar as CalendarIcon,
+ Clock,
+ ChevronDown,
+ ChevronUp,
+ Plane,
+ MapPin,
+ Shield,
+ AlertTriangle,
+ Check,
+ ChevronsUpDown,
+} from "lucide-react";
+import { cn } from "@/lib/utils";
+import { submitInterruptResponse } from "./util";
+import { useStreamContext } from "@/providers/Stream";
+import Image from "next/image";
+
+// DateInput component using shadcn Calendar (same as searchCriteria.widget.tsx)
+interface DateInputProps {
+ date?: Date;
+ onDateChange?: (date: Date | undefined) => void;
+ placeholder?: string;
+ className?: string;
+ disablePast?: boolean;
+ disableFuture?: boolean;
+}
+
+const DateInput = ({
+ date,
+ onDateChange,
+ placeholder,
+ className,
+ disablePast = false,
+ disableFuture = false,
+}: DateInputProps) => {
+ const [isOpen, setIsOpen] = useState(false);
+
+ const formatDateDisplay = (date: Date | undefined) => {
+ if (!date) return placeholder || "Select date";
+ const options: Intl.DateTimeFormatOptions = {
+ weekday: "short",
+ day: "numeric",
+ month: "short",
+ year: "numeric",
+ };
+ return date.toLocaleDateString("en-US", options);
+ };
+
+ const today = new Date();
+ today.setHours(0, 0, 0, 0);
+
+ const getDisabledDates = (date: Date) => {
+ if (disablePast && date < today) return true;
+ if (disableFuture && date > today) return true;
+ return false;
+ };
+
+ return (
+
+
+
+
+ {formatDateDisplay(date)}
+
+
+
+ {
+ onDateChange?.(selectedDate);
+ setIsOpen(false);
+ }}
+ disabled={getDisabledDates}
+ initialFocus
+ />
+
+
+ );
+};
+
+// CountryCombobox component (similar pattern to AirportCombobox)
+interface Country {
+ code: string;
+ name: string;
+}
+
+const POPULAR_COUNTRIES: Country[] = [
+ { code: "US", name: "United States" },
+ { code: "IN", name: "India" },
+ { code: "GB", name: "United Kingdom" },
+ { code: "CA", name: "Canada" },
+ { code: "AU", name: "Australia" },
+ { code: "DE", name: "Germany" },
+ { code: "FR", name: "France" },
+ { code: "JP", name: "Japan" },
+ { code: "CN", name: "China" },
+ { code: "BR", name: "Brazil" },
+ { code: "MX", name: "Mexico" },
+ { code: "IT", name: "Italy" },
+ { code: "ES", name: "Spain" },
+ { code: "NL", name: "Netherlands" },
+ { code: "SG", name: "Singapore" },
+ { code: "AE", name: "United Arab Emirates" },
+ { code: "AF", name: "Afghanistan" },
+ { code: "AL", name: "Albania" },
+ { code: "DZ", name: "Algeria" },
+ { code: "AD", name: "Andorra" },
+ { code: "AO", name: "Angola" },
+ { code: "AG", name: "Antigua and Barbuda" },
+ { code: "AR", name: "Argentina" },
+ { code: "AM", name: "Armenia" },
+ { code: "AT", name: "Austria" },
+ { code: "AZ", name: "Azerbaijan" },
+ { code: "BH", name: "Bahrain" },
+ { code: "BD", name: "Bangladesh" },
+ { code: "BY", name: "Belarus" },
+ { code: "BE", name: "Belgium" },
+ { code: "BZ", name: "Belize" },
+ { code: "BJ", name: "Benin" },
+ { code: "BT", name: "Bhutan" },
+ { code: "BO", name: "Bolivia" },
+ { code: "BA", name: "Bosnia and Herzegovina" },
+ { code: "BW", name: "Botswana" },
+ { code: "BG", name: "Bulgaria" },
+ { code: "BF", name: "Burkina Faso" },
+ { code: "BI", name: "Burundi" },
+ { code: "KH", name: "Cambodia" },
+ { code: "CM", name: "Cameroon" },
+ { code: "CV", name: "Cape Verde" },
+ { code: "CF", name: "Central African Republic" },
+ { code: "TD", name: "Chad" },
+ { code: "CL", name: "Chile" },
+ { code: "CO", name: "Colombia" },
+ { code: "KM", name: "Comoros" },
+ { code: "CG", name: "Congo" },
+ { code: "CR", name: "Costa Rica" },
+ { code: "CI", name: "Côte d'Ivoire" },
+ { code: "HR", name: "Croatia" },
+ { code: "CU", name: "Cuba" },
+ { code: "CY", name: "Cyprus" },
+ { code: "CZ", name: "Czech Republic" },
+ { code: "DK", name: "Denmark" },
+ { code: "DJ", name: "Djibouti" },
+ { code: "DM", name: "Dominica" },
+ { code: "DO", name: "Dominican Republic" },
+ { code: "EC", name: "Ecuador" },
+ { code: "EG", name: "Egypt" },
+ { code: "SV", name: "El Salvador" },
+ { code: "GQ", name: "Equatorial Guinea" },
+ { code: "ER", name: "Eritrea" },
+ { code: "EE", name: "Estonia" },
+ { code: "SZ", name: "Eswatini" },
+ { code: "ET", name: "Ethiopia" },
+ { code: "FJ", name: "Fiji" },
+ { code: "FI", name: "Finland" },
+ { code: "GA", name: "Gabon" },
+ { code: "GM", name: "Gambia" },
+ { code: "GE", name: "Georgia" },
+ { code: "GH", name: "Ghana" },
+ { code: "GR", name: "Greece" },
+ { code: "GD", name: "Grenada" },
+ { code: "GT", name: "Guatemala" },
+ { code: "GN", name: "Guinea" },
+ { code: "GW", name: "Guinea-Bissau" },
+ { code: "GY", name: "Guyana" },
+ { code: "HT", name: "Haiti" },
+ { code: "HN", name: "Honduras" },
+ { code: "HU", name: "Hungary" },
+ { code: "IS", name: "Iceland" },
+ { code: "ID", name: "Indonesia" },
+ { code: "IR", name: "Iran" },
+ { code: "IQ", name: "Iraq" },
+ { code: "IE", name: "Ireland" },
+ { code: "IL", name: "Israel" },
+ { code: "JM", name: "Jamaica" },
+ { code: "JO", name: "Jordan" },
+ { code: "KZ", name: "Kazakhstan" },
+ { code: "KE", name: "Kenya" },
+ { code: "KI", name: "Kiribati" },
+ { code: "KP", name: "North Korea" },
+ { code: "KR", name: "South Korea" },
+ { code: "KW", name: "Kuwait" },
+ { code: "KG", name: "Kyrgyzstan" },
+ { code: "LA", name: "Laos" },
+ { code: "LV", name: "Latvia" },
+ { code: "LB", name: "Lebanon" },
+ { code: "LS", name: "Lesotho" },
+ { code: "LR", name: "Liberia" },
+ { code: "LY", name: "Libya" },
+ { code: "LI", name: "Liechtenstein" },
+ { code: "LT", name: "Lithuania" },
+ { code: "LU", name: "Luxembourg" },
+ { code: "MG", name: "Madagascar" },
+ { code: "MW", name: "Malawi" },
+ { code: "MY", name: "Malaysia" },
+ { code: "MV", name: "Maldives" },
+ { code: "ML", name: "Mali" },
+ { code: "MT", name: "Malta" },
+ { code: "MH", name: "Marshall Islands" },
+ { code: "MR", name: "Mauritania" },
+ { code: "MU", name: "Mauritius" },
+ { code: "FM", name: "Micronesia" },
+ { code: "MD", name: "Moldova" },
+ { code: "MC", name: "Monaco" },
+ { code: "MN", name: "Mongolia" },
+ { code: "ME", name: "Montenegro" },
+ { code: "MA", name: "Morocco" },
+ { code: "MZ", name: "Mozambique" },
+ { code: "MM", name: "Myanmar" },
+ { code: "NA", name: "Namibia" },
+ { code: "NR", name: "Nauru" },
+ { code: "NP", name: "Nepal" },
+ { code: "NZ", name: "New Zealand" },
+ { code: "NI", name: "Nicaragua" },
+ { code: "NE", name: "Niger" },
+ { code: "NG", name: "Nigeria" },
+ { code: "MK", name: "North Macedonia" },
+ { code: "NO", name: "Norway" },
+ { code: "OM", name: "Oman" },
+ { code: "PK", name: "Pakistan" },
+ { code: "PW", name: "Palau" },
+ { code: "PS", name: "Palestine" },
+ { code: "PA", name: "Panama" },
+ { code: "PG", name: "Papua New Guinea" },
+ { code: "PY", name: "Paraguay" },
+ { code: "PE", name: "Peru" },
+ { code: "PH", name: "Philippines" },
+ { code: "PL", name: "Poland" },
+ { code: "PT", name: "Portugal" },
+ { code: "QA", name: "Qatar" },
+ { code: "RO", name: "Romania" },
+ { code: "RU", name: "Russia" },
+ { code: "RW", name: "Rwanda" },
+ { code: "KN", name: "Saint Kitts and Nevis" },
+ { code: "LC", name: "Saint Lucia" },
+ { code: "VC", name: "Saint Vincent and the Grenadines" },
+ { code: "WS", name: "Samoa" },
+ { code: "SM", name: "San Marino" },
+ { code: "ST", name: "São Tomé and Príncipe" },
+ { code: "SA", name: "Saudi Arabia" },
+ { code: "SN", name: "Senegal" },
+ { code: "RS", name: "Serbia" },
+ { code: "SC", name: "Seychelles" },
+ { code: "SL", name: "Sierra Leone" },
+ { code: "SK", name: "Slovakia" },
+ { code: "SI", name: "Slovenia" },
+ { code: "SB", name: "Solomon Islands" },
+ { code: "SO", name: "Somalia" },
+ { code: "ZA", name: "South Africa" },
+ { code: "SS", name: "South Sudan" },
+ { code: "LK", name: "Sri Lanka" },
+ { code: "SD", name: "Sudan" },
+ { code: "SR", name: "Suriname" },
+ { code: "SE", name: "Sweden" },
+ { code: "CH", name: "Switzerland" },
+ { code: "SY", name: "Syria" },
+ { code: "TW", name: "Taiwan" },
+ { code: "TJ", name: "Tajikistan" },
+ { code: "TZ", name: "Tanzania" },
+ { code: "TH", name: "Thailand" },
+ { code: "TL", name: "Timor-Leste" },
+ { code: "TG", name: "Togo" },
+ { code: "TO", name: "Tonga" },
+ { code: "TT", name: "Trinidad and Tobago" },
+ { code: "TN", name: "Tunisia" },
+ { code: "TR", name: "Turkey" },
+ { code: "TM", name: "Turkmenistan" },
+ { code: "TV", name: "Tuvalu" },
+ { code: "UG", name: "Uganda" },
+ { code: "UA", name: "Ukraine" },
+ { code: "UY", name: "Uruguay" },
+ { code: "UZ", name: "Uzbekistan" },
+ { code: "VU", name: "Vanuatu" },
+ { code: "VA", name: "Vatican City" },
+ { code: "VE", name: "Venezuela" },
+ { code: "VN", name: "Vietnam" },
+ { code: "YE", name: "Yemen" },
+ { code: "ZM", name: "Zambia" },
+ { code: "ZW", name: "Zimbabwe" },
+ // Add some additional/alternative country names for better matching
+ { code: "US", name: "USA" },
+ { code: "GB", name: "UK" },
+ { code: "KR", name: "Korea" },
+ { code: "RU", name: "Russian Federation" },
+ { code: "IR", name: "Islamic Republic of Iran" },
+ { code: "VE", name: "Bolivarian Republic of Venezuela" },
+ { code: "BO", name: "Plurinational State of Bolivia" },
+ { code: "TZ", name: "United Republic of Tanzania" },
+ { code: "MD", name: "Republic of Moldova" },
+ { code: "MK", name: "Former Yugoslav Republic of Macedonia" },
+ // Add test/fictional countries for demo purposes
+ { code: "EO", name: "Eolian" },
+];
+
+// Utility functions for country code conversion
+const getCountryByNameOrCode = (input: string): Country | null => {
+ if (!input) return null;
+ return POPULAR_COUNTRIES.find(
+ (country) =>
+ country.name.toLowerCase() === input.toLowerCase() ||
+ country.code.toLowerCase() === input.toLowerCase()
+ ) || null;
+};
+
+const getCountryCode = (input: string): string => {
+ if (!input) return "";
+ const country = getCountryByNameOrCode(input);
+ if (country) {
+ return country.code;
+ }
+
+ // If not found, check if it's already a 2-letter code
+ if (input.length === 2 && /^[A-Z]{2}$/i.test(input)) {
+ return input.toUpperCase();
+ }
+
+ // For unknown countries, try to create a reasonable 2-letter code
+ // This is a fallback for test/fictional countries
+ const words = input.split(' ');
+ if (words.length >= 2) {
+ return (words[0].charAt(0) + words[1].charAt(0)).toUpperCase();
+ } else {
+ return input.substring(0, 2).toUpperCase();
+ }
+};
+
+const getCountryName = (input: string): string => {
+ if (!input) return "";
+ const country = getCountryByNameOrCode(input);
+ return country ? country.name : input; // Return original if not found (might already be a name)
+};
+
+// Test function to verify country code conversion (can be removed in production)
+const testCountryConversion = () => {
+ const testCases = [
+ "India",
+ "IN",
+ "United States",
+ "US",
+ "France",
+ "FR",
+ "Antigua and Barbuda",
+ "AG",
+ "Eolian",
+ "Unknown Country"
+ ];
+
+ console.log("=== Country Code Conversion Test ===");
+ testCases.forEach(testCase => {
+ console.log(`"${testCase}" -> "${getCountryCode(testCase)}"`);
+ });
+ console.log("=== End Test ===");
+};
+
+// Uncomment the line below to run the test
+// testCountryConversion();
+
+interface CountryComboboxProps {
+ value?: string;
+ onValueChange?: (value: string) => void;
+ placeholder?: string;
+ className?: string;
+}
+
+const CountryCombobox = ({
+ value,
+ onValueChange,
+ placeholder = "Select country...",
+ className,
+}: CountryComboboxProps) => {
+ const [open, setOpen] = useState(false);
+ const [searchQuery, setSearchQuery] = useState("");
+
+ const selectedCountry = React.useMemo(() => {
+ if (!value) return null;
+ // Use the utility function to get the country name for display
+ return getCountryName(value);
+ }, [value]);
+
+ const displayCountries = React.useMemo(() => {
+ let countries = POPULAR_COUNTRIES;
+
+ if (searchQuery && searchQuery.trim().length > 0) {
+ const query = searchQuery.toLowerCase();
+ countries = countries.filter(
+ (country) =>
+ country.name.toLowerCase().includes(query) ||
+ country.code.toLowerCase().includes(query),
+ );
+ }
+
+ return countries.map((country) => ({
+ value: country.name,
+ label: country.name,
+ code: country.code,
+ }));
+ }, [searchQuery]);
+
+ return (
+
+
+
+ {selectedCountry || placeholder}
+
+
+
+
+
+
+
+ No countries found.
+
+ {displayCountries.map((country) => (
+ {
+ // Check if this country is already selected (by name or code)
+ const isCurrentlySelected = value === currentValue ||
+ value === country.code ||
+ getCountryName(value || "") === currentValue;
+ onValueChange?.(isCurrentlySelected ? "" : currentValue);
+ setOpen(false);
+ setSearchQuery("");
+ }}
+ >
+
+
{country.label}
+
+ {country.code}
+
+
+
+
+ ))}
+
+
+
+
+
+ );
+};
+
+// TypeScript Interfaces for API Response
+interface ApiPhone {
+ countryCode: string;
+ number: string;
+}
+
+interface ApiDocument {
+ documentId: number;
+ documentType: string;
+ documentNumber: string;
+ nationality: string;
+ expiryDate: string;
+ issuingDate: string;
+ issuingCountry: string;
+ documentUrl: string;
+}
+
+interface ApiTraveller {
+ travellerId: number;
+ firstName: string;
+ lastName: string;
+ dateOfBirth: string;
+ gender: string;
+ nationality: string;
+ numberOfFlights: number;
+ email: string;
+ phone: ApiPhone[];
+ isPrimaryTraveller: boolean;
+ documents: ApiDocument[];
+}
+
+interface ApiFlightSegment {
+ id: string;
+ airlineIata: string;
+ flightNumber: string;
+ duration: string;
+ aircraftType: string;
+ airlineName: string;
+ departure: {
+ date: string;
+ airportIata: string;
+ airportName: string;
+ cityCode: string;
+ countryCode: string;
+ };
+ arrival: {
+ date: string;
+ airportIata: string;
+ airportName: string;
+ cityCode: string;
+ countryCode: string;
+ };
+}
+
+interface ApiFlightOffer {
+ flightOfferId: string;
+ totalEmission: number;
+ totalEmissionUnit: string;
+ currency: string;
+ totalAmount: number;
+ duration: string;
+ departure: {
+ date: string;
+ airportIata: string;
+ airportName: string;
+ cityCode: string;
+ countryCode: string;
+ };
+ arrival: {
+ date: string;
+ airportIata: string;
+ airportName: string;
+ cityCode: string;
+ countryCode: string;
+ };
+ segments: ApiFlightSegment[];
+ offerRules: {
+ isRefundable: boolean;
+ };
+ rankingScore: number;
+ pros: string[];
+ cons: string[];
+ tags: string[];
+}
+
+interface ApiBookingRequirements {
+ emailAddressRequired: boolean;
+ invoiceAddressRequired: boolean;
+ mailingAddressRequired: boolean;
+ phoneCountryCodeRequired: boolean;
+ mobilePhoneNumberRequired: boolean;
+ phoneNumberRequired: boolean;
+ postalCodeRequired: boolean;
+ travelerRequirements: any;
+}
+
+interface ApiWidgetArgs {
+ flightItinerary: {
+ userContext: {
+ userDetails: ApiTraveller;
+ savedTravellers: ApiTraveller[];
+ };
+ selectionContext: {
+ selectedFlightOffers: ApiFlightOffer[];
+ };
+ };
+ bookingRequirements: ApiBookingRequirements;
+}
+
+interface ApiResponse {
+ value: {
+ type: string;
+ widget: {
+ type: string;
+ args: ApiWidgetArgs;
+ };
+ };
+}
+
+// Component Interfaces
+interface FlightDetails {
+ departure: {
+ city: string;
+ airport: string;
+ code: string;
+ date: string;
+ time: string;
+ };
+ arrival: {
+ city: string;
+ airport: string;
+ code: string;
+ date: string;
+ time: string;
+ };
+ airline: {
+ name: string;
+ flightNumber: string;
+ cabinClass: string;
+ aircraftType?: string;
+ iataCode?: string;
+ };
+ duration: string;
+}
+
+interface PassengerDetails {
+ firstName: string;
+ lastName: string;
+ dateOfBirth: string;
+ gender: string;
+ title: string;
+}
+
+interface ContactInformation {
+ phone: string;
+ email: string;
+}
+
+interface TravelDocument {
+ type: string;
+ number: string;
+ issuingCountry: string;
+ expiryDate: string;
+ nationality: string;
+ issuanceDate?: string;
+}
+
+interface SeatAllocation {
+ isSelected: boolean;
+ seatNumber: string;
+ location: string;
+ price: number;
+}
+
+interface PaymentSummary {
+ baseFare: number;
+ taxes: number;
+ fees: number;
+ discount: number;
+ seatFare: number;
+ total: number;
+ currency: string;
+}
+
+interface ReviewWidgetProps {
+ // Legacy props for backward compatibility
+ flightDetails?: FlightDetails;
+ passengerDetails?: PassengerDetails;
+ contactInfo?: ContactInformation;
+ travelDocument?: TravelDocument;
+ seatAllocation?: SeatAllocation;
+ paymentSummary?: PaymentSummary;
+ onSubmit?: (data: any) => void;
+ // New API response prop
+ apiData?: ApiResponse;
+ // Bottom sheet mode
+ isInBottomSheet?: boolean;
+ // Function to close the bottom sheet
+ onClose?: () => void;
+ // Loading state management
+ isSubmitting?: boolean;
+ onSubmittingChange?: (isSubmitting: boolean) => void;
+}
+
+// Utility functions to transform API data
+const formatDateTime = (isoString: string) => {
+ const date = new Date(isoString);
+ const dateStr = date.toLocaleDateString("en-US", {
+ month: "short",
+ day: "numeric",
+ year: "numeric",
+ });
+ const timeStr = date.toLocaleTimeString("en-US", {
+ hour: "numeric",
+ minute: "2-digit",
+ hour12: true,
+ });
+ return { date: dateStr, time: timeStr };
+};
+
+const parseDuration = (duration: string) => {
+ // Parse ISO 8601 duration format (PT2H55M)
+ const match = duration.match(/PT(?:(\d+)H)?(?:(\d+)M)?/);
+ if (!match) return duration;
+
+ const hours = parseInt(match[1] || "0");
+ const minutes = parseInt(match[2] || "0");
+
+ if (hours > 0 && minutes > 0) {
+ return `${hours}h ${minutes}m`;
+ } else if (hours > 0) {
+ return `${hours}h`;
+ } else {
+ return `${minutes}m`;
+ }
+};
+
+// Helper function to get airline logo path
+const getAirlineLogoPath = (airlineIata: string): string => {
+ if (!airlineIata) return "";
+ return `/airlines/${airlineIata.toUpperCase()}.png`;
+};
+
+// Airline Logo Component
+const AirlineLogo = ({
+ airlineIata,
+ airlineName,
+ size = "md",
+}: {
+ airlineIata: string;
+ airlineName: string;
+ size?: "sm" | "md" | "lg";
+}) => {
+ const logoPath = getAirlineLogoPath(airlineIata);
+
+ // Size configurations
+ const sizeConfig = {
+ sm: { container: "w-6 h-6", fallback: "w-4 h-4" },
+ md: { container: "w-8 h-8", fallback: "w-6 h-6" },
+ lg: { container: "w-10 h-10", fallback: "w-8 h-8" },
+ };
+
+ const { container, fallback } = sizeConfig[size];
+
+ return (
+
+ {logoPath ? (
+
{
+ // Fallback to gray circle if image fails to load
+ const target = e.target as HTMLImageElement;
+ target.style.display = "none";
+ const parent = target.parentElement;
+ if (parent) {
+ parent.innerHTML = `
`;
+ }
+ }}
+ />
+ ) : (
+
+ )}
+
+ );
+};
+
+const transformApiDataToFlightDetails = (
+ apiData: ApiResponse,
+): FlightDetails | null => {
+ const flightOffer =
+ apiData.value.widget.args.flightItinerary.selectionContext
+ .selectedFlightOffers[0];
+ if (!flightOffer) return null;
+
+ const departure = formatDateTime(flightOffer.departure.date);
+ const arrival = formatDateTime(flightOffer.arrival.date);
+
+ // Get airline info from first segment
+ const firstSegment = flightOffer.segments[0];
+
+ return {
+ departure: {
+ city: flightOffer.departure.cityCode,
+ airport:
+ flightOffer.departure.airportName || flightOffer.departure.airportIata,
+ code: flightOffer.departure.airportIata,
+ date: departure.date,
+ time: departure.time,
+ },
+ arrival: {
+ city: flightOffer.arrival.cityCode,
+ airport:
+ flightOffer.arrival.airportName || flightOffer.arrival.airportIata,
+ code: flightOffer.arrival.airportIata,
+ date: arrival.date,
+ time: arrival.time,
+ },
+ airline: {
+ name: firstSegment.airlineName || firstSegment.airlineIata,
+ flightNumber: `${firstSegment.airlineIata} ${firstSegment.flightNumber}`,
+ cabinClass: "Economy", // Default as not provided in API
+ aircraftType: firstSegment.aircraftType,
+ iataCode: firstSegment.airlineIata,
+ },
+ duration: parseDuration(flightOffer.duration),
+ };
+};
+
+const transformApiDataToPassengerDetails = (
+ apiData: ApiResponse,
+): PassengerDetails | null => {
+ const userDetails =
+ apiData.value.widget.args.flightItinerary.userContext.userDetails;
+ if (!userDetails) return null;
+
+ return {
+ firstName: userDetails.firstName,
+ lastName: userDetails.lastName,
+ dateOfBirth: userDetails.dateOfBirth,
+ gender: userDetails.gender,
+ title:
+ userDetails.gender === "Male"
+ ? "Mr"
+ : userDetails.gender === "Female"
+ ? "Ms"
+ : "",
+ };
+};
+
+const transformApiDataToContactInfo = (
+ apiData: ApiResponse,
+): ContactInformation | null => {
+ const userDetails =
+ apiData.value.widget.args.flightItinerary.userContext.userDetails;
+ if (!userDetails) return null;
+
+ const phone =
+ userDetails.phone && userDetails.phone.length > 0
+ ? userDetails.phone[0].number
+ : "";
+
+ return {
+ phone: phone,
+ email: userDetails.email,
+ };
+};
+
+const transformApiDataToTravelDocument = (
+ apiData: ApiResponse,
+): TravelDocument | null => {
+ const userDetails =
+ apiData.value.widget.args.flightItinerary.userContext.userDetails;
+ if (
+ !userDetails ||
+ !userDetails.documents ||
+ userDetails.documents.length === 0
+ )
+ return null;
+
+ const document = userDetails.documents[0];
+
+ return {
+ type:
+ document.documentType.charAt(0).toUpperCase() +
+ document.documentType.slice(1),
+ number: document.documentNumber,
+ issuingCountry: document.issuingCountry,
+ expiryDate: document.expiryDate,
+ nationality: document.nationality,
+ };
+};
+
+const transformApiDataToPaymentSummary = (
+ apiData: ApiResponse,
+): PaymentSummary | null => {
+ const flightOffer =
+ apiData.value.widget.args.flightItinerary.selectionContext
+ .selectedFlightOffers[0];
+ if (!flightOffer) return null;
+
+ // Since detailed breakdown is not provided in API, we'll estimate
+ const total = flightOffer.totalAmount;
+ const baseFare = Math.round(total * 0.75); // Estimate 75% as base fare
+ const taxes = Math.round(total * 0.2); // Estimate 20% as taxes
+ const fees = Math.round(total * 0.05); // Estimate 5% as fees
+
+ return {
+ baseFare: baseFare,
+ taxes: taxes,
+ fees: fees,
+ discount: 0,
+ seatFare: 0,
+ total: total,
+ currency: flightOffer.currency,
+ };
+};
+
+const transformApiDataToSavedPassengers = (apiData: ApiResponse) => {
+ const savedTravellers =
+ apiData.value.widget.args.flightItinerary.userContext.savedTravellers;
+ if (!savedTravellers) return [];
+
+ return savedTravellers.map((traveller, index) => ({
+ id: traveller.travellerId.toString(),
+ firstName: traveller.firstName,
+ lastName: traveller.lastName,
+ gender: traveller.gender,
+ dateOfBirth: traveller.dateOfBirth,
+ }));
+};
+
+// Mock saved passengers data (fallback)
+const mockSavedPassengers = [
+ {
+ id: "1",
+ firstName: "John",
+ lastName: "Doe",
+ gender: "Male",
+ dateOfBirth: "1990-01-15",
+ },
+ {
+ id: "2",
+ firstName: "Jane",
+ lastName: "Smith",
+ gender: "Female",
+ dateOfBirth: "1985-03-22",
+ },
+ {
+ id: "3",
+ firstName: "Michael",
+ lastName: "Johnson",
+ gender: "Male",
+ dateOfBirth: "1992-07-08",
+ },
+ {
+ id: "4",
+ firstName: "Sarah",
+ lastName: "Williams",
+ gender: "Female",
+ dateOfBirth: "1988-11-30",
+ },
+];
+
+// Mock data for demonstration
+const mockData = {
+ flightDetails: {
+ departure: {
+ city: "New York",
+ airport: "John F. Kennedy International Airport",
+ code: "JFK",
+ date: "Dec 15, 2024",
+ time: "2:30 PM",
+ },
+ arrival: {
+ city: "San Francisco",
+ airport: "San Francisco International Airport",
+ code: "SFO",
+ date: "Dec 15, 2024",
+ time: "6:15 PM",
+ },
+ airline: {
+ name: "American Airlines",
+ flightNumber: "AA 1234",
+ cabinClass: "Economy",
+ aircraftType: "Boeing 737-800",
+ iataCode: "AA",
+ },
+ duration: "5h 45m",
+ },
+ passengerDetails: {
+ firstName: "John",
+ lastName: "Doe",
+ dateOfBirth: "1990-01-15",
+ gender: "Male",
+ title: "Mr",
+ },
+ contactInfo: {
+ phone: "+1 (555) 123-4567",
+ email: "john.doe@email.com",
+ },
+ travelDocument: {
+ type: "Passport",
+ number: "A12345678",
+ issuingCountry: "United States",
+ expiryDate: "2029-01-11",
+ nationality: "United States",
+ issuanceDate: "2015-04-14",
+ },
+ seatAllocation: {
+ isSelected: true,
+ seatNumber: "12A",
+ location: "Window seat, front of aircraft",
+ price: 25.0,
+ },
+ paymentSummary: {
+ baseFare: 249.0,
+ taxes: 35.5,
+ fees: 12.75,
+ discount: 20.0,
+ seatFare: 25.0,
+ total: 302.25,
+ currency: "USD",
+ },
+};
+
+const ReviewWidget: React.FC = ({
+ flightDetails,
+ passengerDetails,
+ contactInfo,
+ travelDocument,
+ seatAllocation,
+ paymentSummary,
+ onSubmit,
+ apiData,
+ isInBottomSheet = false,
+ onClose,
+ isSubmitting: externalIsSubmitting,
+ onSubmittingChange,
+}) => {
+ // Get thread context for interrupt responses
+ const thread = useStreamContext();
+
+ // Add loading state - use external state if provided, otherwise use internal state
+ const [internalIsSubmitting, setInternalIsSubmitting] = useState(false);
+ const isSubmitting =
+ externalIsSubmitting !== undefined
+ ? externalIsSubmitting
+ : internalIsSubmitting;
+
+ const setIsSubmitting = (value: boolean) => {
+ if (onSubmittingChange) {
+ onSubmittingChange(value);
+ } else {
+ setInternalIsSubmitting(value);
+ }
+ };
+
+ // Transform API data or use provided props/mock data
+ const transformedFlightDetails = apiData
+ ? transformApiDataToFlightDetails(apiData)
+ : null;
+ const transformedPassengerDetails = apiData
+ ? transformApiDataToPassengerDetails(apiData)
+ : null;
+ const transformedContactInfo = apiData
+ ? transformApiDataToContactInfo(apiData)
+ : null;
+ const transformedTravelDocument = apiData
+ ? transformApiDataToTravelDocument(apiData)
+ : null;
+ const transformedPaymentSummary = apiData
+ ? transformApiDataToPaymentSummary(apiData)
+ : null;
+ const savedPassengers = apiData
+ ? transformApiDataToSavedPassengers(apiData)
+ : mockSavedPassengers;
+
+ // Determine if travel documents component should be shown
+ // Hide if travelerRequirements is null in API data
+ const showTravelDocuments = apiData
+ ? apiData.value.widget.args.bookingRequirements.travelerRequirements !==
+ null
+ : true; // Show by default for non-API usage (legacy/demo mode)
+
+ // Use transformed data, provided props, or fallback to mock data
+ const finalFlightDetails =
+ transformedFlightDetails || flightDetails || mockData.flightDetails;
+ const finalPassengerDetails =
+ transformedPassengerDetails ||
+ passengerDetails ||
+ mockData.passengerDetails;
+ const finalContactInfo =
+ transformedContactInfo || contactInfo || mockData.contactInfo;
+ const finalTravelDocument =
+ transformedTravelDocument || travelDocument || mockData.travelDocument;
+ const finalPaymentSummary =
+ transformedPaymentSummary || paymentSummary || mockData.paymentSummary;
+ const finalSeatAllocation = seatAllocation || mockData.seatAllocation;
+
+ // Determine if seat component should be shown (only if seatAllocation is provided)
+ const showSeatComponent = !!seatAllocation;
+
+ // Hook to detect desktop screen size
+ const [isDesktop, setIsDesktop] = useState(false);
+
+ React.useEffect(() => {
+ const checkScreenSize = () => {
+ setIsDesktop(window.innerWidth >= 1024); // lg breakpoint
+ };
+
+ checkScreenSize();
+ window.addEventListener("resize", checkScreenSize);
+
+ return () => window.removeEventListener("resize", checkScreenSize);
+ }, []);
+
+ // Component state
+ const [isFlightExpanded, setIsFlightExpanded] = useState(false);
+ const [isContactExpanded, setIsContactExpanded] = useState(false);
+ const [isTravelDocsExpanded, setIsTravelDocsExpanded] = useState(false);
+ const [isPaymentExpanded, setIsPaymentExpanded] = useState(false);
+ const [isSeatSelected, setIsSeatSelected] = useState(
+ finalSeatAllocation?.isSelected || false,
+ );
+ const [isSavedPassengersExpanded, setIsSavedPassengersExpanded] =
+ useState(false);
+
+ // Update payment expanded state when screen size changes to desktop
+ React.useEffect(() => {
+ if (isDesktop && !isPaymentExpanded) {
+ setIsPaymentExpanded(true);
+ }
+ }, [isDesktop, isPaymentExpanded]);
+
+ // Form state - initialize with transformed/provided data
+ const [passenger, setPassenger] = useState(finalPassengerDetails);
+ const [contact, setContact] = useState(finalContactInfo);
+ const [document, setDocument] = useState(
+ showTravelDocuments
+ ? finalTravelDocument || {
+ type: "",
+ number: "",
+ issuingCountry: "",
+ expiryDate: "",
+ nationality: "",
+ }
+ : null,
+ );
+
+ // Validation state
+ const [validationErrors, setValidationErrors] = useState<{
+ [key: string]: boolean;
+ }>({});
+
+ // Data transformation function to format data according to backend requirements
+ const transformDataForBackend = () => {
+ // Extract phone number and country code from contact.phone
+ let phoneCountryCode = "91"; // Default to India
+ let phoneNumber = contact.phone;
+
+ // Try to parse phone number format like "+1 (555) 123-4567" or "+91 8448549215"
+ const phoneMatch = contact.phone.match(/\+(\d+)\s*[\(\)\s]*(\d+)/);
+ if (phoneMatch) {
+ phoneCountryCode = phoneMatch[1];
+ phoneNumber = phoneMatch[2].replace(/[\(\)\s]/g, "");
+ }
+
+ // Format gender to uppercase
+ const formattedGender = passenger.gender?.toUpperCase() || "MALE";
+
+ // Format document type to uppercase
+ const formattedDocumentType = document?.type?.toUpperCase() || "PASSPORT";
+
+ // Get country codes for issuing country and nationality using the utility function
+ const issuingCountryCode = getCountryCode(document?.issuingCountry || "");
+ const nationalityCode = getCountryCode(document?.nationality || "");
+
+ // Log the conversion for debugging (can be removed in production)
+ console.log("Country conversion:", {
+ originalIssuingCountry: document?.issuingCountry,
+ convertedIssuingCountry: issuingCountryCode,
+ originalNationality: document?.nationality,
+ convertedNationality: nationalityCode,
+ });
+
+ // Additional validation - ensure we always have 2-letter codes
+ if (issuingCountryCode.length !== 2) {
+ console.warn("Warning: Issuing country code is not 2 letters:", issuingCountryCode);
+ }
+ if (nationalityCode.length !== 2) {
+ console.warn("Warning: Nationality code is not 2 letters:", nationalityCode);
+ }
+
+ // Format date strings to YYYY-MM-DD
+ const formatDate = (dateString: string) => {
+ if (!dateString) return "";
+ const date = new Date(dateString);
+ return date.toISOString().split("T")[0];
+ };
+
+ const travellersDetail = [
+ {
+ id: "1",
+ dateOfBirth: formatDate(passenger.dateOfBirth),
+ gender: formattedGender,
+ name: {
+ firstName: passenger.firstName?.toUpperCase() || "",
+ lastName: passenger.lastName?.toUpperCase() || "",
+ },
+ documents: document
+ ? [
+ {
+ number: document.number || "",
+ issuanceDate: formatDate(document.issuanceDate || "2015-04-14"), // Default if not provided
+ expiryDate: formatDate(document.expiryDate),
+ issuanceCountry: issuingCountryCode,
+ issuanceLocation: document.issuingCountry || "",
+ nationality: nationalityCode,
+ birthPlace: document.issuingCountry || "", // Using issuing country as birth place if not provided
+ documentType: formattedDocumentType,
+ holder: true,
+ },
+ ]
+ : [],
+ contact: {
+ purpose: "STANDARD",
+ phones: [
+ {
+ deviceType: "MOBILE",
+ countryCallingCode: phoneCountryCode,
+ number: phoneNumber || "",
+ },
+ ],
+ emailAddress: contact.email || "",
+ },
+ },
+ ];
+
+ const contactInfo = {
+ email: contact.email || "",
+ phone: {
+ countryCode: phoneCountryCode,
+ number: phoneNumber || "",
+ },
+ };
+
+ return {
+ travellersDetail,
+ contactInfo,
+ };
+ };
+
+ // Validation functions
+ const validateField = (
+ value: string | undefined | null,
+ fieldName: string,
+ ): boolean => {
+ const isEmpty = !value || value.trim() === "";
+ setValidationErrors((prev) => ({
+ ...prev,
+ [fieldName]: isEmpty,
+ }));
+ return !isEmpty;
+ };
+
+ const validateEmail = (email: string | undefined | null): boolean => {
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+ const isValid = email && emailRegex.test(email);
+ setValidationErrors((prev) => ({
+ ...prev,
+ email: !isValid,
+ }));
+ return !!isValid;
+ };
+
+ const validateAllFields = (): boolean => {
+ let isValid = true;
+ const errors: { [key: string]: boolean } = {};
+
+ // Validate passenger details
+ if (!passenger.firstName?.trim()) {
+ errors.firstName = true;
+ isValid = false;
+ }
+ if (!passenger.lastName?.trim()) {
+ errors.lastName = true;
+ isValid = false;
+ }
+ if (!passenger.gender?.trim()) {
+ errors.gender = true;
+ isValid = false;
+ }
+ // Only validate Date of Birth if travel documents are shown and expanded
+ if (
+ showTravelDocuments &&
+ isTravelDocsExpanded &&
+ !passenger.dateOfBirth?.trim()
+ ) {
+ errors.dateOfBirth = true;
+ isValid = false;
+ }
+
+ // Validate contact information
+ if (!contact.email?.trim()) {
+ errors.email = true;
+ isValid = false;
+ } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(contact.email)) {
+ errors.email = true;
+ isValid = false;
+ }
+ if (!contact.phone?.trim()) {
+ errors.phone = true;
+ isValid = false;
+ }
+
+ // Validate travel documents (only if shown)
+ if (showTravelDocuments) {
+ if (!document || !document.type?.trim()) {
+ errors.documentType = true;
+ isValid = false;
+ }
+ if (!document || !document.number?.trim()) {
+ errors.documentNumber = true;
+ isValid = false;
+ }
+ if (!document || !document.issuingCountry?.trim()) {
+ errors.issuingCountry = true;
+ isValid = false;
+ }
+ if (!document || !document.expiryDate?.trim()) {
+ errors.expiryDate = true;
+ isValid = false;
+ }
+ if (!document || !document.nationality?.trim()) {
+ errors.nationality = true;
+ isValid = false;
+ }
+ }
+
+ setValidationErrors(errors);
+ return isValid;
+ };
+
+ // Check if form is valid for submit button (computed property)
+ const isFormValid = useMemo(() => {
+ // Check passenger details
+ if (
+ !passenger.firstName?.trim() ||
+ !passenger.lastName?.trim() ||
+ !passenger.gender?.trim()
+ ) {
+ return false;
+ }
+
+ // Only validate Date of Birth if travel documents are shown and expanded
+ if (
+ showTravelDocuments &&
+ isTravelDocsExpanded &&
+ !passenger.dateOfBirth?.trim()
+ ) {
+ return false;
+ }
+
+ // Check contact information
+ if (!contact.email?.trim() || !contact.phone?.trim()) {
+ return false;
+ }
+
+ // Validate email format
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+ if (!emailRegex.test(contact.email)) {
+ return false;
+ }
+
+ // Check travel documents (only if shown)
+ if (showTravelDocuments) {
+ if (
+ !document ||
+ !document.type?.trim() ||
+ !document.number?.trim() ||
+ !document.issuingCountry?.trim() ||
+ !document.expiryDate?.trim() ||
+ !document.nationality?.trim()
+ ) {
+ return false;
+ }
+ }
+
+ return true;
+ }, [passenger, contact, document, showTravelDocuments, isTravelDocsExpanded]);
+
+ // Calculate total with seat selection
+ const calculateTotal = () => {
+ if (!showSeatComponent) {
+ return finalPaymentSummary.total;
+ }
+ const seatFare =
+ isSeatSelected && finalSeatAllocation ? finalSeatAllocation.price : 0;
+ return (
+ finalPaymentSummary.baseFare +
+ finalPaymentSummary.taxes +
+ finalPaymentSummary.fees +
+ seatFare -
+ finalPaymentSummary.discount
+ );
+ };
+
+ // Handle selecting a saved passenger
+ const handleSelectSavedPassenger = (
+ savedPassenger: (typeof savedPassengers)[0],
+ ) => {
+ setPassenger({
+ firstName: savedPassenger.firstName,
+ lastName: savedPassenger.lastName,
+ gender: savedPassenger.gender,
+ dateOfBirth: savedPassenger.dateOfBirth,
+ title: passenger.title, // Keep existing title if any
+ });
+ setIsSavedPassengersExpanded(false); // Collapse the section after selection
+ };
+
+ const handleSubmit = async () => {
+ // Validate all fields before submission
+ if (!validateAllFields()) {
+ // Scroll to first error field
+ const firstErrorField = window.document.querySelector(".border-red-500");
+ if (firstErrorField) {
+ firstErrorField.scrollIntoView({ behavior: "smooth", block: "center" });
+ }
+ return;
+ }
+
+ // Set loading state
+ setIsSubmitting(true);
+
+ try {
+ // Transform data according to backend requirements
+ const formattedData = transformDataForBackend();
+ await submitInterruptResponse(thread, "response", formattedData);
+ } catch (error) {
+ console.error("Error submitting booking:", error);
+ } finally {
+ setIsSubmitting(false);
+ }
+ };
+
+ return (
+
+ {/* Loading Overlay */}
+ {isSubmitting && (
+
+
+
+
+ Submitting booking details...
+
+
+ Please wait while we process your request
+
+
+
+ )}
+
+ {/* Header - Only show if not in bottom sheet (title is in sheet header) */}
+ {!isInBottomSheet && (
+
+ Review Your Booking
+
+ )}
+
+ {/* Desktop Two-Column Layout */}
+
+ {/* Left Column - Flight Info and Forms */}
+
+ {/* Flight Details */}
+
+
setIsFlightExpanded(!isFlightExpanded)}
+ >
+ {/* Compact View */}
+
+
+
+
+
+
+ {finalFlightDetails.departure.code}
+
+
+ {finalFlightDetails.departure.time}
+
+
+
+
+
+ {finalFlightDetails.arrival.code}
+
+
+ {finalFlightDetails.arrival.time}
+
+
+
+
+
+
+
+
+ {finalFlightDetails.airline.name}
+
+
+ {finalFlightDetails.airline.cabinClass}
+
+
+
+
+
+
+
+ {/* Chevron Icon */}
+
+ {isFlightExpanded ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {/* Expanded View */}
+ {isFlightExpanded && (
+
+ {/* Airline Info */}
+
+
+
+
+
+ {finalFlightDetails.airline.name}
+
+
+
+
+ Aircraft:{" "}
+ {finalFlightDetails.airline.aircraftType ||
+ "Not specified"}
+
+
+
+
+
+ {/* Route Details */}
+
+ {/* Departure */}
+
+
+ Departure
+
+
+ {finalFlightDetails.departure.time}
+
+
+ {finalFlightDetails.departure.city}
+
+
+ {finalFlightDetails.departure.date}
+
+
+
+ {/* Duration Indicator */}
+
+
+ {finalFlightDetails.duration}
+
+
+
Non-stop
+
+
+ {/* Arrival */}
+
+
Arrival
+
+ {finalFlightDetails.arrival.time}
+
+
+ {finalFlightDetails.arrival.city}
+
+
+ {finalFlightDetails.arrival.date}
+
+
+
+
+ )}
+
+
+ {/* Passenger Details */}
+
+
Passenger Details
+
+
+ {/* First Name */}
+
+
+ First Name *
+
+
{
+ setPassenger({ ...passenger, firstName: e.target.value });
+ validateField(e.target.value, "firstName");
+ }}
+ className={cn(
+ "w-full rounded-md border px-2 py-1.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500",
+ validationErrors.firstName
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ placeholder="Enter first name"
+ />
+ {validationErrors.firstName && (
+
+ First name is required
+
+ )}
+
+
+ {/* Last Name */}
+
+
+ Last Name *
+
+
{
+ setPassenger({ ...passenger, lastName: e.target.value });
+ validateField(e.target.value, "lastName");
+ }}
+ className={cn(
+ "w-full rounded-md border px-2 py-1.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500",
+ validationErrors.lastName
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ placeholder="Enter last name"
+ />
+ {validationErrors.lastName && (
+
+ Last name is required
+
+ )}
+
+
+ {/* Gender */}
+
+
+ Gender *
+
+
{
+ setPassenger({ ...passenger, gender: value });
+ validateField(value, "gender");
+ }}
+ >
+
+
+
+
+ Male
+ Female
+
+
+ {validationErrors.gender && (
+
+ Gender is required
+
+ )}
+
+
+
+ {/* Footer Note */}
+
+
+ Please ensure all details match your travel documents exactly.
+
+
+
+ {/* Saved Passengers Button */}
+
+
+ setIsSavedPassengersExpanded(!isSavedPassengersExpanded)
+ }
+ className="flex w-full items-center justify-between text-sm"
+ >
+ Saved Passengers
+ {isSavedPassengersExpanded ? (
+
+ ) : (
+
+ )}
+
+
+ {/* Saved Passengers List */}
+ {isSavedPassengersExpanded && (
+
+
+
+ Select a saved passenger:
+
+
+ {savedPassengers.map((savedPassenger) => (
+
+ handleSelectSavedPassenger(savedPassenger)
+ }
+ className="w-full rounded-md border bg-white p-3 text-left transition-colors duration-200 hover:border-blue-200 hover:bg-blue-50"
+ >
+
+
+
+ {savedPassenger.firstName}{" "}
+ {savedPassenger.lastName}
+
+
+ {savedPassenger.gender} •{" "}
+ {savedPassenger.dateOfBirth
+ ? `Born ${savedPassenger.dateOfBirth}`
+ : "No DOB"}
+
+
+
+
+
+ ))}
+
+
+
+ )}
+
+
+
+ {/* Contact Information */}
+
+
setIsContactExpanded(!isContactExpanded)}
+ >
+
+
+
+ Contact Information
+
+ {!isContactExpanded && (
+
+ {contact.phone} • {contact.email}
+
+ )}
+
+
+ {isContactExpanded ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {isContactExpanded && (
+
+
+ {/* Phone Number */}
+
+
+ Phone Number *
+
+
{
+ setContact({ ...contact, phone: e.target.value });
+ validateField(e.target.value, "phone");
+ }}
+ className={cn(
+ "w-full rounded-md border px-2 py-1.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500",
+ validationErrors.phone
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ placeholder="+1 (555) 123-4567"
+ />
+ {validationErrors.phone && (
+
+ Phone number is required
+
+ )}
+
+
+ {/* Email Address */}
+
+
+ Email Address *
+
+
{
+ setContact({ ...contact, email: e.target.value });
+ validateEmail(e.target.value);
+ }}
+ className={cn(
+ "w-full rounded-md border px-2 py-1.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500",
+ validationErrors.email
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ placeholder="your.email@example.com"
+ />
+ {validationErrors.email && (
+
+ Valid email address is required
+
+ )}
+
+
+
+
+
+ We'll use this information to send you booking
+ confirmations and updates.
+
+
+
+ )}
+
+
+ {/* Travel Documents - Only show if travelerRequirements is not null */}
+ {showTravelDocuments && (
+
+
setIsTravelDocsExpanded(!isTravelDocsExpanded)}
+ >
+
+
+
+ Travel Documents
+
+ {!isTravelDocsExpanded &&
+ document &&
+ document.type &&
+ document.number && (
+
+ {document.type} • {document.number} • Expires{" "}
+ {document.expiryDate}
+
+ )}
+
+
+ {isTravelDocsExpanded ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {isTravelDocsExpanded && (
+
+
+ {/* Date of Birth */}
+
+
+ Date of Birth *
+
+
{
+ const dateString = date
+ ? date.toISOString().split("T")[0]
+ : "";
+ setPassenger({
+ ...passenger,
+ dateOfBirth: dateString,
+ });
+ validateField(dateString, "dateOfBirth");
+ }}
+ placeholder="Select date of birth"
+ disableFuture={true}
+ className={cn(
+ validationErrors.dateOfBirth
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ />
+ {validationErrors.dateOfBirth && (
+
+ Date of birth is required
+
+ )}
+
+
+ {/* Document Type */}
+
+
+ Document Type *
+
+
{
+ setDocument({
+ ...(document || {}),
+ type: value,
+ } as any);
+ validateField(value, "documentType");
+ }}
+ >
+
+
+
+
+ Passport
+
+ National ID
+
+
+ Driver's License
+
+
+
+ {validationErrors.documentType && (
+
+ Document type is required
+
+ )}
+
+
+ {/* Document Number */}
+
+
+ {document?.type || "Document"} Number *
+
+
{
+ setDocument({
+ ...(document || {}),
+ number: e.target.value,
+ } as any);
+ validateField(e.target.value, "documentNumber");
+ }}
+ className={cn(
+ "w-full rounded-md border px-2 py-1.5 font-mono text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500",
+ validationErrors.documentNumber
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ placeholder="Enter document number"
+ />
+ {validationErrors.documentNumber && (
+
+ Document number is required
+
+ )}
+
+
+ {/* Issuing Country */}
+
+
+ Issuing Country *
+
+
{
+ setDocument({
+ ...(document || {}),
+ issuingCountry: value,
+ } as any);
+ validateField(value, "issuingCountry");
+ }}
+ placeholder="Select issuing country"
+ className={cn(
+ validationErrors.issuingCountry
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ />
+ {validationErrors.issuingCountry && (
+
+ Issuing country is required
+
+ )}
+
+
+ {/* Nationality */}
+
+
+ Nationality *
+
+
{
+ setDocument({
+ ...(document || {}),
+ nationality: value,
+ } as any);
+ validateField(value, "nationality");
+ }}
+ placeholder="Select nationality"
+ className={cn(
+ validationErrors.nationality
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ />
+ {validationErrors.nationality && (
+
+ Nationality is required
+
+ )}
+
+
+ {/* Expiry Date */}
+
+
+ Expiry Date *
+
+
{
+ const dateString = date
+ ? date.toISOString().split("T")[0]
+ : "";
+ setDocument({
+ ...(document || {}),
+ expiryDate: dateString,
+ } as any);
+ validateField(dateString, "expiryDate");
+ }}
+ placeholder="Select expiry date"
+ disablePast={true}
+ className={cn(
+ validationErrors.expiryDate
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ />
+ {validationErrors.expiryDate && (
+
+ Expiry date is required
+
+ )}
+ {/* Expiry Warning */}
+ {(() => {
+ if (!document?.expiryDate) return null;
+ const expiryDate = new Date(document.expiryDate);
+ const today = new Date();
+ const daysUntilExpiry = Math.ceil(
+ (expiryDate.getTime() - today.getTime()) /
+ (1000 * 3600 * 24),
+ );
+
+ if (daysUntilExpiry < 180 && daysUntilExpiry > 0) {
+ return (
+
+ );
+ }
+ return null;
+ })()}
+
+
+
+ {/* Verification Status */}
+
+
+
+
+ Document verified
+
+
+
+
+ )}
+
+ )}
+
+
+ {/* Right Column - Payment Info and Actions */}
+
+ {/* Seat Allocation - Only show if seat data is available */}
+ {showSeatComponent && finalSeatAllocation && (
+
+
+
+
Seat Allocation
+ {isSeatSelected && (
+
+ {finalSeatAllocation.seatNumber}
+
+ )}
+
+
+ {/* Toggle Switch */}
+
+ Select seat
+ setIsSeatSelected(!isSeatSelected)}
+ className={cn(
+ "relative inline-flex h-6 w-11 items-center rounded-full transition-colors duration-200 focus:ring-2 focus:ring-green-500 focus:ring-offset-2 focus:outline-none",
+ isSeatSelected ? "bg-green-600" : "bg-gray-300",
+ )}
+ role="switch"
+ aria-checked={isSeatSelected}
+ aria-label="Toggle seat selection"
+ >
+
+
+
+
+ {/* Seat Card */}
+
+
+
+
+
+
+ {isSeatSelected
+ ? `Seat ${finalSeatAllocation.seatNumber}`
+ : "No seat selected"}
+
+
+ {isSeatSelected && (
+
+ {finalSeatAllocation.location}
+
+ )}
+
+
+
+
+ {isSeatSelected
+ ? `${finalPaymentSummary.currency === "INR" ? "₹" : "$"}${finalSeatAllocation.price.toFixed(2)}`
+ : `${finalPaymentSummary.currency === "INR" ? "₹" : "$"}0.00`}
+
+
+ {isSeatSelected ? "Seat fee" : "No fee"}
+
+
+
+
+
+ {!isSeatSelected && (
+
+
+ 💡 Select a seat to ensure you get your preferred location
+ on the aircraft.
+
+
+ )}
+
+ )}
+
+ {/* Payment Summary */}
+
+
setIsPaymentExpanded(!isPaymentExpanded)}
+ >
+
+
+
Payment Summary
+
+ Total:{" "}
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {calculateTotal().toFixed(2)}{" "}
+ {finalPaymentSummary.currency}
+
+
+
+ {isPaymentExpanded ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {isPaymentExpanded && (
+
+ {/* Base Fare */}
+
+ Base fare
+
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {finalPaymentSummary.baseFare.toFixed(2)}
+
+
+
+ {/* Taxes */}
+
+ Taxes & fees
+
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {finalPaymentSummary.taxes.toFixed(2)}
+
+
+
+ {/* Service Fees */}
+
+ Service fees
+
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {finalPaymentSummary.fees.toFixed(2)}
+
+
+
+ {/* Seat Selection - Only show if seat component is enabled */}
+ {showSeatComponent && finalSeatAllocation && (
+
+
+ Seat selection
+
+
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {isSeatSelected
+ ? finalSeatAllocation.price.toFixed(2)
+ : "0.00"}
+
+
+ )}
+
+ {/* Discount */}
+ {finalPaymentSummary.discount > 0 && (
+
+ Discount
+
+ -{finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {finalPaymentSummary.discount.toFixed(2)}
+
+
+ )}
+
+ {/* Total */}
+
+
+ Total
+
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {calculateTotal().toFixed(2)}{" "}
+ {finalPaymentSummary.currency}
+
+
+
+
+ )}
+
+
+ {/* Desktop Action Buttons */}
+
+
+ Back
+
+
+ {isSubmitting ? (
+
+ ) : (
+ "Confirm Booking"
+ )}
+
+
+
+
+
+ {/* Mobile/Tablet Single Column Layout */}
+
+ {/* Flight Details */}
+
+
setIsFlightExpanded(!isFlightExpanded)}
+ >
+ {/* Compact View */}
+
+
+ {/* Desktop Layout */}
+
+
+
+
+ {finalFlightDetails.departure.code}
+
+
+ {finalFlightDetails.departure.time}
+
+
+
+
+
+ {finalFlightDetails.arrival.code}
+
+
+ {finalFlightDetails.arrival.time}
+
+
+
+
+
+
+
+ {finalFlightDetails.airline.name}
+
+
+ {finalFlightDetails.airline.cabinClass}
+
+
+
+
+
+ {/* Mobile Layout */}
+
+
+
+
+ {finalFlightDetails.departure.code}
+
+
+ {finalFlightDetails.departure.time}
+
+
+
+
+
+ {finalFlightDetails.arrival.code}
+
+
+ {finalFlightDetails.arrival.time}
+
+
+
+
+
+
+
+ {finalFlightDetails.airline.name}
+
+
+ {finalFlightDetails.airline.cabinClass}
+
+
+
+
+
+
+ {/* Chevron Icon */}
+
+ {isFlightExpanded ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {/* Expanded View */}
+ {isFlightExpanded && (
+
+ {/* Airline Info */}
+
+
+
+
+
+ {finalFlightDetails.airline.name}
+
+
+
+
+ Aircraft:{" "}
+ {finalFlightDetails.airline.aircraftType ||
+ "Not specified"}
+
+
+
+
+
+ {/* Route Details */}
+
+ {/* Departure */}
+
+
Departure
+
+ {finalFlightDetails.departure.time}
+
+
+ {finalFlightDetails.departure.city}
+
+
+ {finalFlightDetails.departure.date}
+
+
+
+ {/* Duration Indicator */}
+
+
+ {finalFlightDetails.duration}
+
+
+
Non-stop
+
+
+ {/* Arrival */}
+
+
Arrival
+
+ {finalFlightDetails.arrival.time}
+
+
+ {finalFlightDetails.arrival.city}
+
+
+ {finalFlightDetails.arrival.date}
+
+
+
+
+ )}
+
+
+ {/* Passenger Details */}
+
+
Passenger Details
+
+
+ {/* First Name */}
+
+
+ First Name *
+
+
{
+ setPassenger({ ...passenger, firstName: e.target.value });
+ validateField(e.target.value, "firstName");
+ }}
+ className={cn(
+ "w-full rounded-md border px-2 py-1.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500",
+ validationErrors.firstName
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ placeholder="Enter first name"
+ />
+ {validationErrors.firstName && (
+
+ First name is required
+
+ )}
+
+
+ {/* Last Name */}
+
+
+ Last Name *
+
+
{
+ setPassenger({ ...passenger, lastName: e.target.value });
+ validateField(e.target.value, "lastName");
+ }}
+ className={cn(
+ "w-full rounded-md border px-2 py-1.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500",
+ validationErrors.lastName
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ placeholder="Enter last name"
+ />
+ {validationErrors.lastName && (
+
+ Last name is required
+
+ )}
+
+
+ {/* Gender */}
+
+
+ Gender *
+
+
{
+ setPassenger({ ...passenger, gender: value });
+ validateField(value, "gender");
+ }}
+ >
+
+
+
+
+ Male
+ Female
+
+
+ {validationErrors.gender && (
+
+ Gender is required
+
+ )}
+
+
+
+ {/* Footer Note */}
+
+
+ Please ensure all details match your travel documents exactly.
+
+
+
+ {/* Saved Passengers Button */}
+
+
+ setIsSavedPassengersExpanded(!isSavedPassengersExpanded)
+ }
+ className="flex w-full items-center justify-between text-sm"
+ >
+ Saved Passengers
+ {isSavedPassengersExpanded ? (
+
+ ) : (
+
+ )}
+
+
+ {/* Saved Passengers List */}
+ {isSavedPassengersExpanded && (
+
+
+
+ Select a saved passenger:
+
+
+ {savedPassengers.map((savedPassenger) => (
+
+ handleSelectSavedPassenger(savedPassenger)
+ }
+ className="w-full rounded-md border bg-white p-3 text-left transition-colors duration-200 hover:border-blue-200 hover:bg-blue-50"
+ >
+
+
+
+ {savedPassenger.firstName}{" "}
+ {savedPassenger.lastName}
+
+
+ {savedPassenger.gender} •{" "}
+ {savedPassenger.dateOfBirth
+ ? `Born ${savedPassenger.dateOfBirth}`
+ : "No DOB"}
+
+
+
+
+
+ ))}
+
+
+
+ )}
+
+
+
+ {/* Contact Information */}
+
+
setIsContactExpanded(!isContactExpanded)}
+ >
+
+
+
Contact Information
+ {!isContactExpanded && (
+
+ {contact.phone} • {contact.email}
+
+ )}
+
+
+ {isContactExpanded ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {isContactExpanded && (
+
+
+ {/* Phone Number */}
+
+
+ Phone Number *
+
+
{
+ setContact({ ...contact, phone: e.target.value });
+ validateField(e.target.value, "phone");
+ }}
+ className={cn(
+ "w-full rounded-md border px-2 py-1.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500",
+ validationErrors.phone
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ placeholder="+1 (555) 123-4567"
+ />
+ {validationErrors.phone && (
+
+ Phone number is required
+
+ )}
+
+
+ {/* Email Address */}
+
+
+ Email Address *
+
+
{
+ setContact({ ...contact, email: e.target.value });
+ validateEmail(e.target.value);
+ }}
+ className={cn(
+ "w-full rounded-md border px-2 py-1.5 text-sm focus:border-blue-500 focus:ring-2 focus:ring-blue-500",
+ validationErrors.email
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ placeholder="your.email@example.com"
+ />
+ {validationErrors.email && (
+
+ Valid email address is required
+
+ )}
+
+
+
+
+
+ We'll use this information to send you booking
+ confirmations and updates.
+
+
+
+ )}
+
+
+ {/* Travel Documents - Only show if travelerRequirements is not null */}
+ {showTravelDocuments && (
+
+
setIsTravelDocsExpanded(!isTravelDocsExpanded)}
+ >
+
+
+
Travel Documents
+ {!isTravelDocsExpanded &&
+ document &&
+ document.type &&
+ document.number && (
+
+ {document.type} • {document.number} • Expires{" "}
+ {document.expiryDate}
+
+ )}
+
+
+ {isTravelDocsExpanded ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {isTravelDocsExpanded && (
+
+
+ {/* Date of Birth */}
+
+
+ Date of Birth *
+
+
{
+ const dateString = date
+ ? date.toISOString().split("T")[0]
+ : "";
+ setPassenger({
+ ...passenger,
+ dateOfBirth: dateString,
+ });
+ validateField(dateString, "dateOfBirth");
+ }}
+ placeholder="Select date of birth"
+ disableFuture={true}
+ className={cn(
+ validationErrors.dateOfBirth
+ ? "border-red-500 focus:border-red-500 focus:ring-red-500"
+ : "",
+ )}
+ />
+ {validationErrors.dateOfBirth && (
+
+ Date of birth is required
+
+ )}
+
+
+ {/* Document Type */}
+
+
+ Document Type *
+
+
{
+ setDocument({
+ ...(document || {}),
+ type: value,
+ } as any);
+ validateField(value, "documentType");
+ }}
+ >
+
+
+
+
+ Passport
+
+ National ID
+
+
+ Driver's License
+
+
+
+ {validationErrors.documentType && (
+
+ Document type is required
+
+ )}
+
+
+
+ {/* Verification Status */}
+
+
+
+
+ Document verified
+
+
+
+
+ )}
+
+ )}
+
+ {/* Seat Allocation - Only show if seat data is available */}
+ {showSeatComponent && finalSeatAllocation && (
+
+
+
+
Seat Allocation
+ {isSeatSelected && (
+
+ {finalSeatAllocation.seatNumber}
+
+ )}
+
+
+ {/* Toggle Switch */}
+
+ Select seat
+ setIsSeatSelected(!isSeatSelected)}
+ className={cn(
+ "relative inline-flex h-6 w-11 items-center rounded-full transition-colors duration-200 focus:ring-2 focus:ring-green-500 focus:ring-offset-2 focus:outline-none",
+ isSeatSelected ? "bg-green-600" : "bg-gray-300",
+ )}
+ role="switch"
+ aria-checked={isSeatSelected}
+ aria-label="Toggle seat selection"
+ >
+
+
+
+
+
+ {/* Seat Card */}
+
+
+
+
+
+
+ {isSeatSelected
+ ? `Seat ${finalSeatAllocation.seatNumber}`
+ : "No seat selected"}
+
+
+ {isSeatSelected && (
+
+ {finalSeatAllocation.location}
+
+ )}
+
+
+
+
+ {isSeatSelected
+ ? `${finalPaymentSummary.currency === "INR" ? "₹" : "$"}${finalSeatAllocation.price.toFixed(2)}`
+ : `${finalPaymentSummary.currency === "INR" ? "₹" : "$"}0.00`}
+
+
+ {isSeatSelected ? "Seat fee" : "No fee"}
+
+
+
+
+
+ {!isSeatSelected && (
+
+
+ 💡 Select a seat to ensure you get your preferred location
+ on the aircraft.
+
+
+ )}
+
+ )}
+
+ {/* Payment Summary */}
+
+
setIsPaymentExpanded(!isPaymentExpanded)}
+ >
+
+
+
Payment Summary
+
+ Total: {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {calculateTotal().toFixed(2)} {finalPaymentSummary.currency}
+
+
+
+ {isPaymentExpanded ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ {isPaymentExpanded && (
+
+ {/* Base Fare */}
+
+ Base fare
+
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {finalPaymentSummary.baseFare.toFixed(2)}
+
+
+
+ {/* Taxes */}
+
+ Taxes & fees
+
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {finalPaymentSummary.taxes.toFixed(2)}
+
+
+
+ {/* Service Fees */}
+
+ Service fees
+
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {finalPaymentSummary.fees.toFixed(2)}
+
+
+
+ {/* Seat Selection - Only show if seat component is enabled */}
+ {showSeatComponent && finalSeatAllocation && (
+
+
+ Seat selection
+
+
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {isSeatSelected
+ ? finalSeatAllocation.price.toFixed(2)
+ : "0.00"}
+
+
+ )}
+
+ {/* Discount */}
+ {finalPaymentSummary.discount > 0 && (
+
+ Discount
+
+ -{finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {finalPaymentSummary.discount.toFixed(2)}
+
+
+ )}
+
+ {/* Total */}
+
+
+ Total
+
+ {finalPaymentSummary.currency === "INR" ? "₹" : "$"}
+ {calculateTotal().toFixed(2)}{" "}
+ {finalPaymentSummary.currency}
+
+
+
+
+ )}
+
+
+
+ {/* Action Buttons */}
+ {isInBottomSheet ? (
+ // Bottom sheet buttons - always sticky at bottom
+
+
+
+ Back
+
+
+ {isSubmitting ? (
+
+ ) : (
+ "Confirm Booking"
+ )}
+
+
+
+ ) : (
+ // Mobile/Tablet Sticky Button (Desktop buttons are in the right column)
+ // Only show on mobile/tablet, hidden on desktop (lg and above)
+
+
+ {isSubmitting ? (
+
+ ) : (
+ "Confirm Booking"
+ )}
+
+
+ )}
+
+
+ );
+};
+
+export default ReviewWidget;
diff --git a/src/components/widgets/searchCriteria.widget.tsx b/src/components/widgets/searchCriteria.widget.tsx
new file mode 100644
index 00000000..5923ba63
--- /dev/null
+++ b/src/components/widgets/searchCriteria.widget.tsx
@@ -0,0 +1,456 @@
+"use client";
+
+import React, { useState, useEffect } from "react";
+import { Button } from "@/components/common/ui/button";
+import { Plus, Minus, CalendarIcon } from "lucide-react";
+import { AirportCombobox } from "@/components/common/ui/airportCombobox";
+import { cn } from "@/lib/utils";
+import { useStreamContext } from "@/providers/Stream";
+import { useTabContext } from "@/providers/TabContext";
+import {submitInterruptResponse} from "./util";
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/components/common/ui/popover";
+import { Calendar } from "@/components/ui/calendar";
+import { getUserLocation, LocationResult } from "@/lib/utils";
+
+// DateInput component using shadcn Calendar
+interface DateInputProps {
+ date?: Date;
+ onDateChange?: (date: Date | undefined) => void;
+ placeholder?: string;
+ className?: string;
+}
+
+const DateInput = ({
+ date,
+ onDateChange,
+ placeholder,
+ className,
+}: DateInputProps) => {
+ const [isOpen, setIsOpen] = useState(false);
+
+ const formatDateDisplay = (date: Date | undefined) => {
+ if (!date) return placeholder || "Select date";
+ const options: Intl.DateTimeFormatOptions = {
+ weekday: 'short',
+ day: 'numeric',
+ month: 'short',
+ year: 'numeric'
+ };
+ return date.toLocaleDateString('en-US', options);
+ };
+
+ const today = new Date();
+ today.setHours(0, 0, 0, 0);
+
+ return (
+
+
+
+
+ {formatDateDisplay(date)}
+
+
+
+ {
+ onDateChange?.(selectedDate);
+ setIsOpen(false);
+ }}
+ disabled={(date: Date) => date < today}
+ initialFocus
+ />
+
+
+ );
+};
+
+const SearchCriteriaWidget = (args: Record) => {
+ const thread = useStreamContext();
+ const { switchToChat } = useTabContext();
+
+ // Extract data from args
+ const flightSearchCriteria = args.flightSearchCriteria || {};
+
+ // Initialize state from args
+ const [tripType, setTripType] = useState<"oneway" | "round">(
+ flightSearchCriteria.isRoundTrip ? "round" : "oneway",
+ );
+
+ // Separate traveller counts
+ const [adults, setAdults] = useState(flightSearchCriteria.adults || 1);
+ const [children, setChildren] = useState(flightSearchCriteria.children || 0);
+ const [infants, setInfants] = useState(flightSearchCriteria.infants || 0);
+
+ const [flightClass, setFlightClass] = useState(
+ flightSearchCriteria.class
+ ? flightSearchCriteria.class.charAt(0).toUpperCase() +
+ flightSearchCriteria.class.slice(1)
+ : "Economy",
+ );
+ const [fromAirport, setFromAirport] = useState(
+ flightSearchCriteria.originAirport || "",
+ );
+ const [toAirport, setToAirport] = useState(
+ flightSearchCriteria.destinationAirport || "",
+ );
+ const [departureDate, setDepartureDate] = useState(
+ flightSearchCriteria.departureDate
+ ? new Date(flightSearchCriteria.departureDate)
+ : undefined,
+ );
+ const [returnDate, setReturnDate] = useState(
+ flightSearchCriteria.returnDate ? new Date(flightSearchCriteria.returnDate) : undefined,
+ );
+ const [isLoading, setIsLoading] = useState(false);
+ const [showTravellerDropdown, setShowTravellerDropdown] = useState(false);
+
+ // Location-related state
+ const [locationResult, setLocationResult] = useState(null);
+ const [isGettingLocation, setIsGettingLocation] = useState(false);
+
+ // Request user location when component loads
+ useEffect(() => {
+ const requestLocation = async () => {
+ setIsGettingLocation(true);
+ try {
+ const result = await getUserLocation();
+ setLocationResult(result);
+
+ if (result.success) {
+ console.log("Location obtained successfully:", result.data);
+ // You can use the location data here if needed
+ // For example, to find nearby airports or set default location
+ } else {
+ console.log("Location request failed:", result.error);
+ }
+ } catch (error) {
+ console.error("Unexpected error getting location:", error);
+ setLocationResult({
+ success: false,
+ error: {
+ code: -1,
+ message: "Unexpected error occurred while getting location"
+ }
+ });
+ } finally {
+ setIsGettingLocation(false);
+ }
+ };
+
+ requestLocation();
+ }, [setLocationResult, setIsGettingLocation]); // Dependencies to avoid warnings
+
+ // Wrapper functions for date state setters to match DateInput component interface
+ const handleDepartureDateChange = (date: Date | undefined) => {
+ setDepartureDate(date);
+ };
+
+ const handleReturnDateChange = (date: Date | undefined) => {
+ setReturnDate(date);
+ };
+
+
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+ setIsLoading(true);
+
+ const responseData = {
+ flightSearchCriteria: {
+ adults,
+ children,
+ infants,
+ class: flightClass.toLowerCase(),
+ departureDate: departureDate?.toISOString().split("T")[0],
+ returnDate: returnDate?.toISOString().split("T")[0],
+ destinationAirport: toAirport,
+ originAirport: fromAirport,
+ isRoundTrip: tripType === "round",
+ passengers: [{ id: 1, type: "adult" }],
+ },
+ selectedTravellerIds: [],
+ allTravellers: [],
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ // Switch back to Chat tab after successful submission since response will appear there
+ switchToChat();
+ } catch (error: any) {
+ console.error("Error submitting interrupt response:", error);
+ // Optional: already handled inside the utility
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ // Helper functions for traveller counts
+ const getTotalTravellers = () => adults + children + infants;
+
+ const formatTravellerText = () => {
+ const total = getTotalTravellers();
+ if (total === 1 && adults === 1) {
+ return `1 Adult, ${flightClass}`;
+ }
+
+ const parts = [];
+ if (adults > 0) parts.push(`${adults} Adult${adults > 1 ? 's' : ''}`);
+ if (children > 0) parts.push(`${children} Child${children > 1 ? 'ren' : ''}`);
+ if (infants > 0) parts.push(`${infants} Infant${infants > 1 ? 's' : ''}`);
+
+ return `${parts.join(', ')}, ${flightClass}`;
+ };
+
+
+
+ return (
+ <>
+
+
+ {/* Trip Type - Horizontal tabs */}
+
+ setTripType("oneway")}
+ className={cn(
+ "rounded-full border px-4 py-2 text-sm font-medium transition-all duration-200",
+ tripType === "oneway"
+ ? "border-black bg-black text-white"
+ : "border-gray-300 bg-white text-gray-600 hover:border-gray-400 hover:text-gray-900",
+ )}
+ >
+ One way
+
+ setTripType("round")}
+ className={cn(
+ "rounded-full border px-4 py-2 text-sm font-medium transition-all duration-200",
+ tripType === "round"
+ ? "border-black bg-black text-white"
+ : "border-gray-300 bg-white text-gray-600 hover:border-gray-400 hover:text-gray-900",
+ )}
+ >
+ Round trip
+
+
+
+ {/* Flight Details - From/To */}
+
+
+ {/* Date Inputs */}
+
+ {/* Departure Date */}
+
+
+
+
+ {/* Return Date - Only show for round trip */}
+ {tripType === "round" && (
+
+
+
+ )}
+
+
+ {/* Travellers & Class - Dropdown */}
+
+
+
+
+ {formatTravellerText()}
+ ▼
+
+
+
+
+ {/* Select travellers */}
+
+
Select travellers
+
+ {/* Adults */}
+
+
+
+
setAdults(Math.max(1, adults - 1))}
+ disabled={adults <= 1}
+ >
+
+
+
{adults}
+
setAdults(adults + 1)}
+ >
+
+
+
+
+
+ {/* Children */}
+
+
+
Children
+
2 - 12 yrs
+
+
+
setChildren(Math.max(0, children - 1))}
+ disabled={children <= 0}
+ >
+
+
+
{children}
+
setChildren(children + 1)}
+ >
+
+
+
+
+
+ {/* Infants */}
+
+
+
+
setInfants(Math.max(0, infants - 1))}
+ disabled={infants <= 0}
+ >
+
+
+
{infants}
+
setInfants(infants + 1)}
+ >
+
+
+
+
+
+
+ {/* Select class */}
+
+
Select class
+
+ {['Economy', 'Business', 'Premium Economy'].map((classOption) => (
+
+ setFlightClass(e.target.value)}
+ className="w-4 h-4 text-black border-gray-300 focus:ring-black"
+ />
+ {classOption}
+
+ ))}
+
+
+
+
+
+
+
+ {/* Search Button */}
+
+
+ {isLoading ? "Searching..." : "Search flights"}
+
+
+
+
+
+
+ >
+ );
+};
+
+export default SearchCriteriaWidget;
diff --git a/src/components/widgets/seatCombined.widget.tsx b/src/components/widgets/seatCombined.widget.tsx
new file mode 100644
index 00000000..1cf10a2e
--- /dev/null
+++ b/src/components/widgets/seatCombined.widget.tsx
@@ -0,0 +1,506 @@
+"use client";
+
+import React, { useState, useMemo } from "react";
+import { Button } from "@/components/common/ui/button";
+import { useStreamContext } from "@/providers/Stream";
+import { submitInterruptResponse } from "./util";
+import { cn } from "@/lib/utils";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet";
+import { Shuffle, MapPin, Plane } from "lucide-react";
+
+interface SeatCombinedWidgetProps {
+ usualSeat?: string;
+ [key: string]: any;
+}
+
+// Generate seat map with static pricing and availability for demo
+const generateSeatMap = () => {
+ const rows = ['A', 'B', 'C', 'D', 'E', 'F'];
+ const seatNumbers = Array.from({ length: 30 }, (_, i) => i + 1);
+
+ // Hardcoded unavailable seats for demo
+ const unavailableSeats = [
+ '1C', '1D', '2A', '2F', '3B', '3E', '4C', '4D',
+ '5A', '5F', '7B', '7E', '8C', '8D', '10A', '10F',
+ '12B', '12E', '15C', '15D', '18A', '18F', '20B', '20E'
+ ];
+
+ // Static pricing based on seat position for consistent pricing
+ const getPriceForSeat = (seatId: string, row: number) => {
+ if (unavailableSeats.includes(seatId)) return 0;
+
+ // Window seats (A, F) are premium
+ if (seatId.endsWith('A') || seatId.endsWith('F')) {
+ return row <= 10 ? 500 : 400; // Front window seats more expensive
+ }
+
+ // Aisle seats (C, D) are mid-tier
+ if (seatId.endsWith('C') || seatId.endsWith('D')) {
+ return row <= 10 ? 400 : 350;
+ }
+
+ // Middle seats (B, E) - some free, some paid
+ if (row % 3 === 0) return 0; // Every 3rd row is free for middle seats
+ return row <= 15 ? 350 : 0; // Front middle seats paid, back ones free
+ };
+
+ const seats = [];
+ for (let num of seatNumbers) {
+ for (let row of rows) {
+ const seatId = `${num}${row}`;
+ const isUnavailable = unavailableSeats.includes(seatId);
+ const price = getPriceForSeat(seatId, num);
+
+ seats.push({
+ id: seatId,
+ row: num,
+ seat: row,
+ status: isUnavailable ? 'unavailable' : 'available',
+ price,
+ isAisle: row === 'C' || row === 'D',
+ isWindow: row === 'A' || row === 'F'
+ });
+ }
+ }
+
+ return seats;
+};
+
+const SeatCombinedWidget: React.FC = (args) => {
+ const thread = useStreamContext();
+ const [selectedSeat, setSelectedSeat] = useState("");
+ const [selectedPrice, setSelectedPrice] = useState(0);
+ const [selectedOption, setSelectedOption] = useState("");
+ const [isLoading, setIsLoading] = useState(false);
+ const [showSeatMap, setShowSeatMap] = useState(false);
+ const [hoveredSeat, setHoveredSeat] = useState("");
+
+ const usualSeat = args.usualSeat || "14F";
+ const seats = useMemo(() => generateSeatMap(), []); // Memoize to prevent regeneration
+ const seatRows = Array.from(new Set(seats.map(s => s.row))).sort((a, b) => a - b);
+
+ // Get a random free seat
+ const getRandomFreeSeat = () => {
+ const freeSeats = seats.filter(seat => seat.status === 'available' && seat.price === 0);
+ if (freeSeats.length > 0) {
+ const randomIndex = Math.floor(Math.random() * freeSeats.length);
+ return freeSeats[randomIndex];
+ }
+ return null;
+ };
+
+ const handleUsualSeatSelect = async () => {
+ setIsLoading(true);
+
+ const responseData = {
+ seatNumber: usualSeat,
+ price: 350,
+ type: "paid",
+ option: "usual_seat"
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ } catch (error: any) {
+ console.error("Error submitting usual seat selection:", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const handleRandomFreeSeat = async () => {
+ setIsLoading(true);
+
+ const randomSeat = getRandomFreeSeat();
+ if (!randomSeat) {
+ console.error("No free seats available");
+ setIsLoading(false);
+ return;
+ }
+
+ const responseData = {
+ seatNumber: randomSeat.id,
+ price: 0,
+ type: "free",
+ option: "random_free_seat"
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ } catch (error: any) {
+ console.error("Error submitting random free seat selection:", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const handleBrowseSeatMap = () => {
+ setSelectedOption("browse");
+ setShowSeatMap(true);
+ };
+
+ const handleSeatClick = (seat: any) => {
+ if (seat.status === 'available') {
+ setSelectedSeat(seat.id);
+ setSelectedPrice(seat.price);
+ }
+ };
+
+ const handleSeatMapSubmit = async () => {
+ if (!selectedSeat) return;
+
+ setIsLoading(true);
+
+ const responseData = {
+ seatNumber: selectedSeat,
+ price: selectedPrice,
+ type: selectedPrice === 0 ? "free" : "paid",
+ option: "browse_seat_map"
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ } catch (error: any) {
+ console.error("Error submitting seat selection:", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const getSeatColor = (seat: any) => {
+ if (seat.id === selectedSeat) {
+ return "bg-black text-white border-black";
+ }
+ if (seat.status === 'available') {
+ return "bg-white text-black border-gray-300 hover:bg-gray-50 hover:border-gray-400 cursor-pointer";
+ }
+ return "bg-gray-300 text-gray-500 border-gray-400 cursor-not-allowed";
+ };
+
+ return (
+ <>
+
+
+
+
Choose Your Seat
+
Select from the options below
+
+
+
+ {/* Option 1: Select Usual Seat */}
+
+ setSelectedOption(e.target.value)}
+ className="w-4 h-4 text-black border-gray-300 focus:ring-black"
+ />
+
+
+
Select Usual Seat
+
Seat {usualSeat}
+
+
+
+
+ {/* Option 2: Browse Seat Map */}
+
+ setSelectedOption(e.target.value)}
+ className="w-4 h-4 text-black border-gray-300 focus:ring-black"
+ />
+
+
+
+
+
Select Seat
+
Choose from available seats
+
+
+
+
+ {/* Option 3: Random Free Seat */}
+
+ setSelectedOption(e.target.value)}
+ className="w-4 h-4 text-black border-gray-300 focus:ring-black"
+ />
+
+
+
+
+
Auto Allocate Seat
+
Get best available free seat
+
+
+
+
+
+ {/* Action Button */}
+
+
{
+ if (selectedOption === "usual") {
+ handleUsualSeatSelect();
+ } else if (selectedOption === "browse") {
+ handleBrowseSeatMap();
+ } else if (selectedOption === "random") {
+ handleRandomFreeSeat();
+ }
+ }}
+ disabled={!selectedOption || isLoading}
+ className="w-full rounded-xl bg-black py-3 text-white transition-all duration-200 hover:bg-gray-800 disabled:bg-gray-300 disabled:text-gray-500"
+ >
+ {isLoading ? (
+
+ ) : selectedOption === "usual" ? `Choose Seat ${usualSeat}` :
+ selectedOption === "browse" ? "Browse Seats" :
+ selectedOption === "random" ? "Get Random Free Seat" :
+ "Select an Option"}
+
+
+
+
+ {/* Seat Map Bottom Sheet */}
+
+
+
+ Select Your Seat
+
+
+ {/* Scrollable content area */}
+
+ {/* Legend */}
+
+
+ {/* Seat Map */}
+
+
+ {/* Header with seat letters */}
+
+
+
+ {['A', 'B', 'C'].map(letter => (
+
+ {letter}
+
+ ))}
+
{/* Aisle space */}
+ {['D', 'E', 'F'].map(letter => (
+
+ {letter}
+
+ ))}
+
+
+
+ {/* Seat rows */}
+
+ {seatRows.map(rowNum => {
+ const rowSeats = seats.filter(s => s.row === rowNum);
+ const leftSeats = rowSeats.filter(s => ['A', 'B', 'C'].includes(s.seat));
+ const rightSeats = rowSeats.filter(s => ['D', 'E', 'F'].includes(s.seat));
+
+ return (
+
+
+ {/* Row number */}
+
+ {rowNum}
+
+
+ {/* Left side seats (A, B, C) */}
+ {leftSeats.map(seat => (
+
handleSeatClick(seat)}
+ onMouseEnter={() => setHoveredSeat(seat.id)}
+ onMouseLeave={() => setHoveredSeat("")}
+ disabled={seat.status === 'unavailable'}
+ className={cn(
+ "w-10 h-10 text-sm font-semibold border-2 rounded-lg transition-all duration-200 relative hover:shadow-md",
+ getSeatColor(seat)
+ )}
+ title={`Seat ${seat.id} - ${seat.price === 0 ? 'Free' : `₹${seat.price}`}`}
+ >
+ {seat.seat}
+ {seat.price > 0 && (
+
+ ₹
+
+ )}
+
+ ))}
+
+ {/* Aisle space */}
+
+
+ {/* Right side seats (D, E, F) */}
+ {rightSeats.map(seat => (
+
handleSeatClick(seat)}
+ onMouseEnter={() => setHoveredSeat(seat.id)}
+ onMouseLeave={() => setHoveredSeat("")}
+ disabled={seat.status === 'unavailable'}
+ className={cn(
+ "w-10 h-10 text-sm font-semibold border-2 rounded-lg transition-all duration-200 relative hover:shadow-md",
+ getSeatColor(seat)
+ )}
+ title={`Seat ${seat.id} - ${seat.price === 0 ? 'Free' : `₹${seat.price}`}`}
+ >
+ {seat.seat}
+ {seat.price > 0 && (
+
+ ₹
+
+ )}
+
+ ))}
+
+
+ );
+ })}
+
+
+
+
+
+ {/* Sticky Footer with selected seat info and buttons */}
+
+ {selectedSeat ? (
+
+ {/* Selected seat info */}
+
+
+
+
+ {selectedSeat}
+
+
+
Seat {selectedSeat}
+
+ {selectedPrice === 0 ? 'Free Seat' : `Premium Seat`}
+
+
+
+
+
+ {selectedPrice === 0 ? 'FREE' : `₹${selectedPrice}`}
+
+
+ {selectedPrice === 0 ? 'No charge' : 'Total amount'}
+
+
+
+
+
+ {/* Action buttons */}
+
+
+ {isLoading ? (
+
+ ) : (
+ "Confirm Seat Selection"
+ )}
+
+
+
setShowSeatMap(false)}
+ variant="outline"
+ className="w-full rounded-xl border-2 border-gray-300 text-black hover:bg-gray-50 hover:border-gray-400"
+ >
+ Close
+
+
+
+ ) : (
+
+ {/* No seat selected message */}
+
+
Select a seat from the map above
+
+
+ {/* Close button only */}
+
setShowSeatMap(false)}
+ variant="outline"
+ className="w-full rounded-xl border-2 border-gray-300 text-black hover:bg-gray-50 hover:border-gray-400"
+ >
+ Close
+
+
+ )}
+
+
+
+ >
+ );
+};
+
+export default SeatCombinedWidget;
diff --git a/src/components/widgets/seatPayment.widget.tsx b/src/components/widgets/seatPayment.widget.tsx
new file mode 100644
index 00000000..b901bf15
--- /dev/null
+++ b/src/components/widgets/seatPayment.widget.tsx
@@ -0,0 +1,191 @@
+"use client";
+
+import React, { useState } from "react";
+import { Button } from "@/components/common/ui/button";
+import { useStreamContext } from "@/providers/Stream";
+import { submitInterruptResponse } from "./util";
+import { CreditCard, X, CheckCircle, Plane } from "lucide-react";
+
+interface SeatPaymentWidgetProps {
+ seatNumber?: string;
+ amount?: number;
+ currency?: string;
+ [key: string]: any;
+}
+
+const SeatPaymentWidget: React.FC = (args) => {
+ const thread = useStreamContext();
+ const [isLoading, setIsLoading] = useState(false);
+ const [paymentStatus, setPaymentStatus] = useState<'idle' | 'processing' | 'success'>('idle');
+
+ const seatNumber = args.seatNumber || "14F";
+ const amount = args.amount || 350;
+ const currency = args.currency || "₹";
+
+ const handlePaymentConfirm = () => {
+ simulatePayment();
+ };
+
+ const handlePaymentCancel = async () => {
+ setIsLoading(true);
+
+ const responseData = {
+ seatNumber,
+ amount,
+ currency,
+ paymentSuccessful: false,
+ action: "cancelled"
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ } catch (error: any) {
+ console.error("Error submitting payment cancellation:", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const simulatePayment = async () => {
+ setPaymentStatus('processing');
+
+ // Simulate payment processing delay
+ await new Promise(resolve => setTimeout(resolve, 2000));
+
+ // Always succeed for demo purposes
+ setPaymentStatus('success');
+ // Wait a bit to show success message
+ setTimeout(() => {
+ submitPaymentResult(true);
+ }, 1500);
+ };
+
+ const submitPaymentResult = async (success: boolean) => {
+ setIsLoading(true);
+
+ const responseData = {
+ seatNumber,
+ amount,
+ currency,
+ paymentSuccessful: success,
+ action: success ? "payment_successful" : "payment_failed"
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ } catch (error: any) {
+ console.error("Error submitting payment result:", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ if (paymentStatus === 'processing') {
+ return (
+
+
+
+
+
+
Processing Payment
+
Please wait while we process your payment...
+
+
+
+ );
+ }
+
+ if (paymentStatus === 'success') {
+ return (
+
+
+
+
+
+
Payment Successful!
+
Your seat {seatNumber} has been reserved.
+
+
Amount Paid: {currency}{amount}
+
+
+
+ );
+ }
+
+ return (
+
+
+
+ {seatNumber}
+
+
+
Seat Payment
+
+ Complete your payment for seat {seatNumber}
+
+
+
+ {/* Seat Details Card */}
+
+
+
+
+
+
Seat {seatNumber}
+
Premium Selection
+
+
+
+
{currency} {amount}
+
Total Amount
+
+
+
+
+
+
+ {isLoading ? (
+
+ ) : (
+
+
+ Pay {currency} {amount} Now
+
+ )}
+
+
+
+ {isLoading ? (
+
+ ) : (
+
+
+ Skip Payment
+
+ )}
+
+
+
+ );
+};
+
+export default SeatPaymentWidget;
diff --git a/src/components/widgets/seatPreference.widget.tsx b/src/components/widgets/seatPreference.widget.tsx
new file mode 100644
index 00000000..76d9a41f
--- /dev/null
+++ b/src/components/widgets/seatPreference.widget.tsx
@@ -0,0 +1,90 @@
+"use client";
+
+import React, { useState } from "react";
+import { Button } from "@/components/common/ui/button";
+import { useStreamContext } from "@/providers/Stream";
+import { submitInterruptResponse } from "./util";
+
+interface SeatPreferenceWidgetProps {
+ [key: string]: any;
+}
+
+const SeatPreferenceWidget: React.FC = (args) => {
+ const thread = useStreamContext();
+ const [selectedPreference, setSelectedPreference] = useState("");
+ const [isLoading, setIsLoading] = useState(false);
+
+ const handleSubmit = async (e: React.FormEvent) => {
+ e.preventDefault();
+ if (!selectedPreference) return;
+
+ setIsLoading(true);
+
+ const responseData = {
+ seatPreference: selectedPreference,
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ } catch (error: any) {
+ console.error("Error submitting seat preference:", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ return (
+
+
+
Seat Preference
+
Choose your seat preference for this flight
+
+
+
+
+
+ setSelectedPreference(e.target.value)}
+ className="w-4 h-4 text-black border-gray-300 focus:ring-black"
+ />
+
+
Free Seat
+
Choose from available free seats
+
+
+
+
+ setSelectedPreference(e.target.value)}
+ className="w-4 h-4 text-black border-gray-300 focus:ring-black"
+ />
+
+
Buy Seat
+
Purchase premium seat with extra benefits
+
+
+
+
+
+
+ {isLoading ? "Processing..." : "Continue"}
+
+
+
+
+ );
+};
+
+export default SeatPreferenceWidget;
diff --git a/src/components/widgets/seatSelection.widget.tsx b/src/components/widgets/seatSelection.widget.tsx
new file mode 100644
index 00000000..76eda316
--- /dev/null
+++ b/src/components/widgets/seatSelection.widget.tsx
@@ -0,0 +1,319 @@
+"use client";
+
+import React, { useState } from "react";
+import { Button } from "@/components/common/ui/button";
+import { useStreamContext } from "@/providers/Stream";
+import { submitInterruptResponse } from "./util";
+import { cn } from "@/lib/utils";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet";
+
+interface SeatSelectionWidgetProps {
+ usualSeat?: string;
+ [key: string]: any;
+}
+
+// Generate seat map with random pricing and availability for demo
+const generateSeatMap = () => {
+ const rows = ['A', 'B', 'C', 'D', 'E', 'F'];
+ const seatNumbers = Array.from({ length: 30 }, (_, i) => i + 1);
+
+ // Hardcoded unavailable seats for demo
+ const unavailableSeats = [
+ '1C', '1D', '2A', '2F', '3B', '3E', '4C', '4D',
+ '5A', '5F', '7B', '7E', '8C', '8D', '10A', '10F',
+ '12B', '12E', '15C', '15D', '18A', '18F', '20B', '20E'
+ ];
+
+ const seats = [];
+ for (let num of seatNumbers) {
+ for (let row of rows) {
+ const seatId = `${num}${row}`;
+ const isUnavailable = unavailableSeats.includes(seatId);
+
+ let price = 0;
+ if (!isUnavailable) {
+ // Random pricing: some free, some between 350-500
+ const priceOptions = [0, 0, 350, 400, 450, 500]; // More free seats
+ price = priceOptions[Math.floor(Math.random() * priceOptions.length)];
+ }
+
+ seats.push({
+ id: seatId,
+ row: num,
+ seat: row,
+ status: isUnavailable ? 'unavailable' : 'available',
+ price,
+ isAisle: row === 'C' || row === 'D',
+ isWindow: row === 'A' || row === 'F'
+ });
+ }
+ }
+
+ return seats;
+};
+
+const SeatSelectionWidget: React.FC = (args) => {
+ const thread = useStreamContext();
+ const [selectedSeat, setSelectedSeat] = useState("");
+ const [selectedPrice, setSelectedPrice] = useState(0);
+ const [isLoading, setIsLoading] = useState(false);
+ const [showSeatMap, setShowSeatMap] = useState(false);
+ const [hoveredSeat, setHoveredSeat] = useState("");
+
+ const usualSeat = args.usualSeat || "14F";
+ const seats = generateSeatMap();
+ const seatRows = Array.from(new Set(seats.map(s => s.row))).sort((a, b) => a - b);
+
+ const handleUsualSeatSelect = async () => {
+ setIsLoading(true);
+
+ const responseData = {
+ selectedSeat: usualSeat,
+ price: 350, // Assuming usual seat is free
+ option: "usual_seat"
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ } catch (error: any) {
+ console.error("Error submitting usual seat selection:", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const handleBrowseSeatMap = () => {
+ setShowSeatMap(true);
+ };
+
+ const handleSeatClick = (seat: any) => {
+ if (seat.status === 'available') {
+ setSelectedSeat(seat.id);
+ setSelectedPrice(seat.price);
+ }
+ };
+
+ const handleSeatMapSubmit = async () => {
+ if (!selectedSeat) return;
+
+ setIsLoading(true);
+
+ const responseData = {
+ selectedSeat: selectedSeat,
+ price: selectedPrice,
+ option: "browse_seat_map"
+ };
+
+ try {
+ await submitInterruptResponse(thread, "response", responseData);
+ } catch (error: any) {
+ console.error("Error submitting seat selection:", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const getSeatColor = (seat: any) => {
+ if (seat.id === selectedSeat) {
+ return "bg-blue-500 text-white border-blue-500";
+ }
+ if (seat.status === 'available') {
+ return "bg-green-100 text-green-800 border-green-300 hover:bg-green-200 cursor-pointer";
+ }
+ return "bg-red-100 text-red-800 border-red-300 cursor-not-allowed";
+ };
+
+ const getSeatTooltip = (seat: any) => {
+ if (seat.status === 'unavailable') {
+ return "Not available";
+ }
+ if (seat.price === 0) {
+ return "Free seat";
+ }
+ return `₹${seat.price}`;
+ };
+
+ return (
+ <>
+ {/* Initial Options */}
+
+
+
Seat Selection
+
+ Shall I reserve your usual seat {usualSeat}, or would you like to browse the seat map first?
+
+
+
+
+
+ {isLoading ? "Processing..." : `Reserve usual seat ${usualSeat}`}
+
+
+
+ Browse seat map
+
+
+
+
+ {/* Seat Map Bottom Sheet */}
+
+
+
+
+ Select Your Seat
+
+
+
+
+
+
Choose an available seat from the seat map below
+
+ {/* Legend */}
+
+
+
+ {/* Seat Map */}
+
+
+ {/* Header with seat letters */}
+
+
+
+ {['A', 'B', 'C'].map(letter => (
+
+ {letter}
+
+ ))}
+
{/* Aisle space */}
+ {['D', 'E', 'F'].map(letter => (
+
+ {letter}
+
+ ))}
+
+
+
+ {/* Seat rows */}
+
+ {seatRows.map(rowNum => {
+ const rowSeats = seats.filter(s => s.row === rowNum);
+ const leftSeats = rowSeats.filter(s => ['A', 'B', 'C'].includes(s.seat));
+ const rightSeats = rowSeats.filter(s => ['D', 'E', 'F'].includes(s.seat));
+
+ return (
+
+
+
+ {rowNum}
+
+ {leftSeats.map(seat => (
+
+
handleSeatClick(seat)}
+ onMouseEnter={() => setHoveredSeat(seat.id)}
+ onMouseLeave={() => setHoveredSeat("")}
+ className={cn(
+ "w-8 h-8 text-xs font-medium border rounded transition-colors",
+ getSeatColor(seat)
+ )}
+ disabled={seat.status === 'unavailable'}
+ >
+ {seat.seat}
+
+ {hoveredSeat === seat.id && (
+
+ {getSeatTooltip(seat)}
+
+ )}
+
+ ))}
+
+ ||
+
+ {rightSeats.map(seat => (
+
+
handleSeatClick(seat)}
+ onMouseEnter={() => setHoveredSeat(seat.id)}
+ onMouseLeave={() => setHoveredSeat("")}
+ className={cn(
+ "w-8 h-8 text-xs font-medium border rounded transition-colors",
+ getSeatColor(seat)
+ )}
+ disabled={seat.status === 'unavailable'}
+ >
+ {seat.seat}
+
+ {hoveredSeat === seat.id && (
+
+ {getSeatTooltip(seat)}
+
+ )}
+
+ ))}
+
+
+ );
+ })}
+
+
+
+
+ {selectedSeat && (
+
+
+ Selected Seat: {selectedSeat}
+
+ {selectedPrice === 0 ? "Free" : `₹${selectedPrice}`}
+
+
+
+ )}
+
+
+ {isLoading ? "Processing..." : "Confirm Seat Selection"}
+
+
+
+
+ >
+ );
+};
+
+export default SeatSelectionWidget;
diff --git a/src/components/widgets/util.ts b/src/components/widgets/util.ts
new file mode 100644
index 00000000..254ebc5d
--- /dev/null
+++ b/src/components/widgets/util.ts
@@ -0,0 +1,59 @@
+// src/utils/submitInterruptResponse.ts
+
+import { toast } from "sonner";
+
+// Mock auth functions for development - replace with actual imports when authService is available
+const getJwtToken = (): string | null => {
+ try {
+ if (typeof window === "undefined") return null;
+ return window.localStorage.getItem("flyo:jwt:token");
+ } catch {
+ return null;
+ }
+};
+
+const GetUserId = (jwtToken: string): string | number => {
+ try {
+ // Simple mock implementation
+ return "mock-user-id";
+ } catch (err) {
+ console.error("Error getting user ID from JWT:", err);
+ return "";
+ }
+};
+
+export async function submitInterruptResponse(
+ thread: any, // Replace with proper type from your stream context
+ type: string,
+ data: Record,
+): Promise {
+ try {
+ // Get user ID from JWT token
+ const jwtToken = getJwtToken();
+ const userId = jwtToken ? GetUserId(jwtToken) : null;
+
+ await thread.submit(
+ { userId },
+ {
+ streamSubgraphs: true,
+ command: {
+ resume: [
+ {
+ type,
+ data,
+ },
+ ],
+ },
+ },
+ );
+ } catch (error) {
+ console.error("Error submitting response:", error);
+ toast.error("Error", {
+ description: "Failed to submit response.",
+ richColors: true,
+ closeButton: true,
+ duration: 5000,
+ });
+ throw error; // rethrow if the calling function needs to handle it
+ }
+}
diff --git a/src/components/widgets/weather.widget.tsx b/src/components/widgets/weather.widget.tsx
new file mode 100644
index 00000000..aba24e63
--- /dev/null
+++ b/src/components/widgets/weather.widget.tsx
@@ -0,0 +1,127 @@
+'use client';
+
+import React from 'react';
+import { Sun, Cloud, CloudRain, Sunset } from 'lucide-react';
+
+interface HourlyForecast {
+ time: string;
+ temperature: number;
+ icon: 'sun' | 'cloud-sun' | 'sunset' | 'cloud';
+}
+
+interface WeatherData {
+ city: string;
+ currentTemp: number;
+ warning?: string;
+ hourlyForecast: HourlyForecast[];
+}
+
+// Mock weather data matching the image
+const mockWeatherData: WeatherData = {
+ city: 'Asheville',
+ currentTemp: 47,
+ warning: 'Winter storm warning',
+ hourlyForecast: [
+ { time: '4PM', temperature: 46, icon: 'sun' },
+ { time: '5PM', temperature: 44, icon: 'sun' },
+ { time: '6PM', temperature: 41, icon: 'cloud-sun' },
+ { time: '6:14', temperature: 41, icon: 'sunset' },
+ { time: '7PM', temperature: 37, icon: 'cloud' },
+ { time: '8PM', temperature: 35, icon: 'cloud' },
+ ]
+};
+
+const WeatherIcon = ({ type, className }: { type: string; className?: string }) => {
+ switch (type) {
+ case 'sun':
+ return ;
+ case 'cloud-sun':
+ return (
+
+
+
+
+ );
+ case 'sunset':
+ return ;
+ case 'cloud':
+ return ;
+ default:
+ return ;
+ }
+};
+
+const WeatherWidget = () => {
+ const weather = mockWeatherData;
+
+ return (
+
+ {/* Background decorative elements */}
+
+
+ {/* Main content */}
+
+ {/* Header */}
+
+
+
+ {weather.city}
+
+
+ {weather.currentTemp}°
+
+
+
+
+
+
+
+ {/* Warning */}
+ {weather.warning && (
+
+
+ {weather.warning}
+
+
+ )}
+
+ {/* Hourly Forecast */}
+
+ {weather.hourlyForecast.map((hour, index) => (
+
+ {/* Time */}
+
+ {hour.time}
+
+
+ {/* Icon */}
+
+
+
+
+ {/* Temperature */}
+
+ {hour.temperature}°
+
+
+ ))}
+
+
+
+ );
+};
+
+export default WeatherWidget;
diff --git a/src/components/widgets/whosTravelling.widget.tsx b/src/components/widgets/whosTravelling.widget.tsx
new file mode 100644
index 00000000..007aad24
--- /dev/null
+++ b/src/components/widgets/whosTravelling.widget.tsx
@@ -0,0 +1,1481 @@
+"use client";
+
+import React, { useState, useEffect } from "react";
+import { Button } from "@/components/common/ui/button";
+import { Input } from "@/components/common/ui/input";
+import { useStreamContext } from "@/providers/Stream";
+import { submitInterruptResponse } from "./util";
+import { cn } from "@/lib/utils";
+import { ArrowLeft, Edit, AlertCircle } from "lucide-react";
+import {
+ Sheet,
+ SheetContent,
+ SheetHeader,
+ SheetTitle,
+} from "@/components/ui/sheet";
+import { ChevronDown } from "lucide-react";
+
+interface NumberOfTravellers {
+ adults: number;
+ children: number;
+ infants: number;
+}
+
+interface Document {
+ documentId: number;
+ documentType: string;
+ documentNumber: string;
+ nationality: string;
+ expiryDate: string;
+ issuingDate: string;
+ issuingCountry: string;
+ documentUrl: string;
+}
+
+interface Phone {
+ countryCode: string;
+ number: string;
+}
+
+interface SavedTraveller {
+ travellerId: number;
+ firstName: string;
+ lastName: string;
+ dateOfBirth: string;
+ gender: string;
+ nationality: string;
+ numberOfFlights: number;
+ email: string;
+ phone: Phone[];
+ isPrimaryTraveller: boolean;
+ documents: Document[];
+}
+
+interface UserDetails {
+ travellerId: number;
+ firstName: string;
+ lastName: string;
+ dateOfBirth: string;
+ gender: string;
+ nationality: string;
+ numberOfFlights: number;
+ email: string;
+ phone: Phone[];
+}
+
+interface SavedPassenger {
+ id: string;
+ firstName: string;
+ lastName: string;
+ gender: string;
+ dateOfBirth: string;
+ type?: 'adult' | 'child' | 'infant';
+ email?: string;
+ phone?: Phone[];
+ documents?: Document[];
+ nationality?: string;
+}
+
+interface NewPassenger {
+ title: string;
+ firstName: string;
+ lastName: string;
+ dateOfBirth?: string;
+ type: 'adult' | 'child' | 'infant';
+ passportNumber?: string;
+ passportExpiry?: string;
+ nationality?: string;
+ issuingCountry?: string;
+}
+
+interface TravelerRequirement {
+ travelerId: string;
+ genderRequired: boolean;
+ documentRequired: boolean;
+ documentIssuanceCityRequired: boolean;
+ dateOfBirthRequired: boolean;
+ redressRequiredIfAny: boolean;
+ airFranceDiscountRequired: boolean;
+ spanishResidentDiscountRequired: boolean;
+ residenceRequired: boolean;
+}
+
+interface BookingRequirements {
+ emailAddressRequired: boolean;
+ invoiceAddressRequired: boolean;
+ mailingAddressRequired: boolean;
+ phoneCountryCodeRequired: boolean;
+ mobilePhoneNumberRequired: boolean;
+ phoneNumberRequired: boolean;
+ postalCodeRequired: boolean;
+ travelerRequirements: TravelerRequirement[];
+}
+
+interface WhosTravellingWidgetProps {
+ numberOfTravellers?: NumberOfTravellers;
+ savedTravellers?: SavedTraveller[];
+ userDetails?: UserDetails;
+ totalAmount?: number;
+ currency?: string;
+ isInternational?: boolean;
+ bookingRequirements?: BookingRequirements;
+ flightItinerary?: {
+ userContext?: {
+ userDetails?: UserDetails;
+ savedTravellers?: SavedTraveller[];
+ };
+ selectionContext?: {
+ selectedFlightOffers?: Array<{
+ flightOfferId: string;
+ totalAmount: number;
+ currency: string;
+ [key: string]: any;
+ }>;
+ };
+ };
+ [key: string]: any;
+}
+
+// Country codes for phone numbers
+const countryCodes = [
+ { code: '+91', country: 'India', flag: '🇮🇳' },
+ { code: '+1', country: 'USA', flag: '🇺🇸' },
+ { code: '+44', country: 'UK', flag: '🇬🇧' },
+ { code: '+86', country: 'China', flag: '🇨🇳' },
+ { code: '+81', country: 'Japan', flag: '🇯🇵' },
+ { code: '+49', country: 'Germany', flag: '🇩🇪' },
+ { code: '+33', country: 'France', flag: '🇫🇷' },
+ { code: '+39', country: 'Italy', flag: '🇮🇹' },
+ { code: '+7', country: 'Russia', flag: '🇷🇺' },
+ { code: '+55', country: 'Brazil', flag: '🇧🇷' },
+ { code: '+61', country: 'Australia', flag: '🇦🇺' },
+ { code: '+65', country: 'Singapore', flag: '🇸🇬' },
+ { code: '+971', country: 'UAE', flag: '🇦🇪' },
+ { code: '+966', country: 'Saudi Arabia', flag: '🇸🇦' },
+ { code: '+60', country: 'Malaysia', flag: '🇲🇾' },
+];
+
+// Countries list for nationality and issuing country
+const countries = [
+ { code: 'IN', name: 'India' },
+ { code: 'US', name: 'United States' },
+ { code: 'GB', name: 'United Kingdom' },
+ { code: 'CN', name: 'China' },
+ { code: 'JP', name: 'Japan' },
+ { code: 'DE', name: 'Germany' },
+ { code: 'FR', name: 'France' },
+ { code: 'IT', name: 'Italy' },
+ { code: 'RU', name: 'Russia' },
+ { code: 'BR', name: 'Brazil' },
+ { code: 'AU', name: 'Australia' },
+ { code: 'SG', name: 'Singapore' },
+ { code: 'AE', name: 'United Arab Emirates' },
+ { code: 'SA', name: 'Saudi Arabia' },
+ { code: 'MY', name: 'Malaysia' },
+ { code: 'CA', name: 'Canada' },
+ { code: 'MX', name: 'Mexico' },
+ { code: 'AR', name: 'Argentina' },
+ { code: 'ZA', name: 'South Africa' },
+ { code: 'EG', name: 'Egypt' },
+ { code: 'NG', name: 'Nigeria' },
+ { code: 'KE', name: 'Kenya' },
+ { code: 'TH', name: 'Thailand' },
+ { code: 'VN', name: 'Vietnam' },
+ { code: 'ID', name: 'Indonesia' },
+ { code: 'PH', name: 'Philippines' },
+ { code: 'KR', name: 'South Korea' },
+ { code: 'TR', name: 'Turkey' },
+ { code: 'ES', name: 'Spain' },
+ { code: 'NL', name: 'Netherlands' },
+ { code: 'BE', name: 'Belgium' },
+ { code: 'CH', name: 'Switzerland' },
+ { code: 'AT', name: 'Austria' },
+ { code: 'SE', name: 'Sweden' },
+ { code: 'NO', name: 'Norway' },
+ { code: 'DK', name: 'Denmark' },
+ { code: 'FI', name: 'Finland' },
+ { code: 'PL', name: 'Poland' },
+ { code: 'CZ', name: 'Czech Republic' },
+ { code: 'HU', name: 'Hungary' },
+ { code: 'GR', name: 'Greece' },
+ { code: 'PT', name: 'Portugal' },
+ { code: 'IE', name: 'Ireland' },
+ { code: 'NZ', name: 'New Zealand' },
+ { code: 'IL', name: 'Israel' },
+ { code: 'JO', name: 'Jordan' },
+ { code: 'LB', name: 'Lebanon' },
+ { code: 'QA', name: 'Qatar' },
+ { code: 'KW', name: 'Kuwait' },
+ { code: 'BH', name: 'Bahrain' },
+ { code: 'OM', name: 'Oman' },
+];
+
+const WhosTravellingWidget: React.FC = (args) => {
+ const thread = useStreamContext();
+ const [selectedPassengers, setSelectedPassengers] = useState<{[key: string]: SavedPassenger}>({});
+ const [newPassengers, setNewPassengers] = useState<{[key: string]: NewPassenger}>({});
+ const [showAllPassengers, setShowAllPassengers] = useState(false);
+ const [newPassengerSequence, setNewPassengerSequence] = useState(1); // Sequence counter for new passengers
+
+ // Initialize contact info from userDetails
+ const [contactEmail, setContactEmail] = useState("");
+ const [contactPhoneNumber, setContactPhoneNumber] = useState("");
+
+ const [isLoading, setIsLoading] = useState(false);
+ const [showAddPassengerModal, setShowAddPassengerModal] = useState(false);
+ const [addPassengerType, setAddPassengerType] = useState<'adult' | 'child' | 'infant'>('adult');
+ const [showEditModal, setShowEditModal] = useState(false);
+ const [editingPassenger, setEditingPassenger] = useState(null);
+ const [newPassengerForm, setNewPassengerForm] = useState({
+ title: 'Mr.',
+ firstName: '',
+ lastName: '',
+ dateOfBirth: '',
+ type: 'adult',
+ passportNumber: '',
+ passportExpiry: '',
+ nationality: '',
+ issuingCountry: '',
+ });
+
+ const [selectedCountryCode, setSelectedCountryCode] = useState(countryCodes[0]); // Default to India
+ const [showCountryCodeSheet, setShowCountryCodeSheet] = useState(false);
+
+ // State for nationality and issuing country dropdowns
+ const [showNationalitySheet, setShowNationalitySheet] = useState(false);
+ const [showIssuingCountrySheet, setShowIssuingCountrySheet] = useState(false);
+ const [selectedNationality, setSelectedNationality] = useState(countries[0]);
+ const [selectedIssuingCountry, setSelectedIssuingCountry] = useState(countries[0]);
+
+ // State for edit modal nationality and issuing country dropdowns
+ const [showEditNationalitySheet, setShowEditNationalitySheet] = useState(false);
+ const [showEditIssuingCountrySheet, setShowEditIssuingCountrySheet] = useState(false);
+ const [editSelectedNationality, setEditSelectedNationality] = useState(countries[0]);
+ const [editSelectedIssuingCountry, setEditSelectedIssuingCountry] = useState(countries[0]);
+
+ const numberOfTravellers = args.numberOfTravellers || { adults: 4, children: 3, infants: 2 };
+ const isInternational = args.isInternational || false;
+
+ // Extract userDetails and savedTravellers from the correct nested structure
+ const userDetails = args.userDetails || args.flightItinerary?.userContext?.userDetails;
+ const savedTravellersData = args.savedTravellers || args.flightItinerary?.userContext?.savedTravellers || [];
+
+ // Convert savedTravellers to SavedPassenger format - all saved passengers are adults by default
+ const savedPassengers: SavedPassenger[] = savedTravellersData.map((traveller: SavedTraveller) => {
+ return {
+ id: traveller.travellerId.toString(),
+ firstName: traveller.firstName,
+ lastName: traveller.lastName,
+ gender: traveller.gender,
+ dateOfBirth: traveller.dateOfBirth,
+ type: 'adult', // All saved passengers are shown in adult section only
+ email: traveller.email,
+ phone: traveller.phone,
+ documents: traveller.documents,
+ nationality: traveller.nationality,
+ };
+ });
+
+ // Calculate total amount from flight offers
+ const getFlightOfferPrice = () => {
+ const selectedFlightOffers = args.flightItinerary?.selectionContext?.selectedFlightOffers;
+ if (selectedFlightOffers && selectedFlightOffers.length > 0) {
+ return {
+ amount: selectedFlightOffers[0].totalAmount,
+ currency: selectedFlightOffers[0].currency === 'INR' ? '₹' : selectedFlightOffers[0].currency
+ };
+ }
+ return {
+ amount: args.totalAmount || 51127,
+ currency: args.currency || "₹"
+ };
+ };
+
+ const flightPrice = getFlightOfferPrice();
+ const totalPassengers = numberOfTravellers.adults + numberOfTravellers.children + numberOfTravellers.infants;
+ const totalAmount = flightPrice.amount * totalPassengers;
+ const currency = flightPrice.currency;
+
+ // Date validation helpers
+ const getDateLimits = (passengerType: 'adult' | 'child' | 'infant') => {
+ const today = new Date();
+ const currentYear = today.getFullYear();
+ const currentMonth = today.getMonth();
+ const currentDate = today.getDate();
+
+ switch (passengerType) {
+ case 'adult':
+ // Adults: 18+ years old
+ const maxAdultDate = new Date(currentYear - 18, currentMonth, currentDate);
+ const minAdultDate = new Date(currentYear - 100, currentMonth, currentDate);
+ return {
+ min: minAdultDate.toISOString().split('T')[0],
+ max: maxAdultDate.toISOString().split('T')[0]
+ };
+ case 'child':
+ // Children: 2-12 years old
+ const maxChildDate = new Date(currentYear - 2, currentMonth, currentDate);
+ const minChildDate = new Date(currentYear - 12, currentMonth, currentDate);
+ return {
+ min: minChildDate.toISOString().split('T')[0],
+ max: maxChildDate.toISOString().split('T')[0]
+ };
+ case 'infant':
+ // Infants: 0-2 years old
+ const maxInfantDate = today.toISOString().split('T')[0];
+ const minInfantDate = new Date(currentYear - 2, currentMonth, currentDate);
+ return {
+ min: minInfantDate.toISOString().split('T')[0],
+ max: maxInfantDate
+ };
+ default:
+ return { min: '', max: '' };
+ }
+ };
+
+ // Helper function to format date for input
+ const formatDateForInput = (dateString: string | undefined) => {
+ if (!dateString) return '';
+ // If it's already in YYYY-MM-DD format, return as is
+ if (/^\d{4}-\d{2}-\d{2}$/.test(dateString)) {
+ return dateString;
+ }
+ // Try to parse and format the date
+ try {
+ const date = new Date(dateString);
+ if (!isNaN(date.getTime())) {
+ return date.toISOString().split('T')[0];
+ }
+ } catch (error) {
+ console.warn('Invalid date format:', dateString);
+ }
+ return '';
+ };
+
+ // Helper function to check if document is required for a passenger
+ const isDocumentRequired = (passengerSequence: number): boolean => {
+ if (!args.bookingRequirements?.travelerRequirements) return false;
+
+ const requirement = args.bookingRequirements.travelerRequirements.find(
+ req => req.travelerId === passengerSequence.toString()
+ );
+
+ return requirement?.documentRequired || false;
+ };
+
+ // Helper function to check if any document is required
+ const isAnyDocumentRequired = (): boolean => {
+ if (!args.bookingRequirements?.travelerRequirements) return false;
+
+ return args.bookingRequirements.travelerRequirements.some(req => req.documentRequired);
+ };
+
+ // Populate data when component mounts or args change
+ useEffect(() => {
+ if (userDetails) {
+ setContactEmail(userDetails.email || "");
+ setContactPhoneNumber(userDetails.phone?.[0]?.number || "");
+
+ // Set country code based on userDetails
+ const userCountryCode = countryCodes.find(
+ cc => cc.code === `+${userDetails.phone?.[0]?.countryCode}`
+ );
+ if (userCountryCode) {
+ setSelectedCountryCode(userCountryCode);
+ }
+ }
+ }, [userDetails]);
+
+ // Validation function to check if passenger has missing required fields
+ const hasIncompleteInfo = (passenger: SavedPassenger): boolean => {
+ const requiredFields = ['firstName', 'lastName', 'gender', 'dateOfBirth'];
+ const internationalFields = isInternational && passenger.documents?.length ? [] :
+ isInternational ? ['documents'] : [];
+ const allRequiredFields = [...requiredFields, ...internationalFields];
+
+ return allRequiredFields.some(field => {
+ if (field === 'documents') {
+ return !passenger.documents || passenger.documents.length === 0;
+ }
+ return !passenger[field as keyof SavedPassenger];
+ });
+ };
+
+ const getPassengersByType = (type: 'adult' | 'child' | 'infant') => {
+ return savedPassengers.filter((p: SavedPassenger) => p.type === type);
+ };
+
+ const getSelectedCount = (type: 'adult' | 'child' | 'infant') => {
+ return Object.values(selectedPassengers).filter((p: SavedPassenger) => p.type === type).length +
+ Object.values(newPassengers).filter((p: NewPassenger) => p.type === type).length;
+ };
+
+ const handlePassengerToggle = (passenger: SavedPassenger) => {
+ setSelectedPassengers(prev => {
+ const key = passenger.id;
+ if (prev[key]) {
+ // Remove passenger
+ const { [key]: removed, ...rest } = prev;
+ return rest;
+ } else {
+ // Check if we can add this passenger type
+ const currentCount = getSelectedCount(passenger.type || 'adult');
+ const maxCount = numberOfTravellers[passenger.type === 'adult' ? 'adults' :
+ passenger.type === 'child' ? 'children' : 'infants'];
+
+ if (currentCount >= maxCount) {
+ alert(`Maximum ${maxCount} ${passenger.type || 'adult'}${maxCount > 1 ? 's' : ''} allowed`);
+ return prev;
+ }
+
+ return { ...prev, [key]: passenger };
+ }
+ });
+ };
+
+ const isPassengerSelected = (passengerId: string) => {
+ return !!selectedPassengers[passengerId];
+ };
+
+ const handleAddPassenger = (type: 'adult' | 'child' | 'infant') => {
+ setAddPassengerType(type);
+ setNewPassengerForm({
+ title: type === 'child' || type === 'infant' ? 'Master' : 'Mr.',
+ firstName: '',
+ lastName: '',
+ dateOfBirth: '',
+ type,
+ passportNumber: '',
+ passportExpiry: '',
+ nationality: '',
+ issuingCountry: '',
+ });
+ setShowAddPassengerModal(true);
+ };
+
+ const handleEditPassenger = (passenger: SavedPassenger) => {
+ setEditingPassenger(passenger);
+
+ // Initialize nationality and issuing country from passenger's documents if available
+ if (passenger.documents && passenger.documents.length > 0) {
+ const doc = passenger.documents[0];
+ const nationality = countries.find(c => c.code === doc.nationality) || countries[0];
+ const issuingCountry = countries.find(c => c.code === doc.issuingCountry) || countries[0];
+ setEditSelectedNationality(nationality);
+ setEditSelectedIssuingCountry(issuingCountry);
+ } else {
+ // Reset to defaults if no documents
+ setEditSelectedNationality(countries[0]);
+ setEditSelectedIssuingCountry(countries[0]);
+ }
+
+ setShowEditModal(true);
+ };
+
+ const handleEditNewPassenger = (id: string, passenger: NewPassenger) => {
+ setNewPassengerForm(passenger);
+ setAddPassengerType(passenger.type);
+ setShowAddPassengerModal(true);
+
+ // Remove the passenger from newPassengers so it can be re-added with updated info
+ setNewPassengers(prev => {
+ const { [id]: removed, ...rest } = prev;
+ return rest;
+ });
+ };
+
+ const handleSaveNewPassenger = () => {
+ if (!newPassengerForm.firstName || !newPassengerForm.lastName) {
+ alert('Please fill in first name and last name');
+ return;
+ }
+
+ // Check if we've reached the limit for this passenger type
+ const currentCount = getSelectedCount(newPassengerForm.type);
+ const maxCount = numberOfTravellers[newPassengerForm.type === 'adult' ? 'adults' :
+ newPassengerForm.type === 'child' ? 'children' : 'infants'];
+
+ if (currentCount >= maxCount) {
+ alert(`Maximum ${maxCount} ${newPassengerForm.type}${maxCount > 1 ? 's' : ''} allowed`);
+ return;
+ }
+
+ // Use sequence number as ID for new passengers
+ const newId = newPassengerSequence.toString();
+ const newPassenger: NewPassenger = { ...newPassengerForm };
+
+ setNewPassengers(prev => ({ ...prev, [newId]: newPassenger }));
+ setNewPassengerSequence(prev => prev + 1); // Increment sequence for next new passenger
+ setShowAddPassengerModal(false);
+
+ // Reset form
+ setNewPassengerForm({
+ title: 'Mr.',
+ firstName: '',
+ lastName: '',
+ dateOfBirth: '',
+ type: 'adult',
+ passportNumber: '',
+ passportExpiry: '',
+ nationality: '',
+ issuingCountry: '',
+ });
+ };
+
+ const handleSaveEditedPassenger = () => {
+ if (!editingPassenger) return;
+
+ // Update nationality and issuing country in documents if they exist
+ if (editingPassenger.documents && editingPassenger.documents.length > 0) {
+ const updatedDocuments = editingPassenger.documents.map(doc => ({
+ ...doc,
+ nationality: editSelectedNationality.code,
+ issuingCountry: editSelectedIssuingCountry.code,
+ }));
+ editingPassenger.documents = updatedDocuments;
+ }
+
+ setSelectedPassengers(prev => ({
+ ...prev,
+ [editingPassenger.id]: editingPassenger
+ }));
+ setShowEditModal(false);
+ setEditingPassenger(null);
+ };
+
+ const handleSubmit = async () => {
+ // Validate that all required passengers are selected
+ const totalSelected = Object.keys(selectedPassengers).length + Object.keys(newPassengers).length;
+ const totalRequired = numberOfTravellers.adults + numberOfTravellers.children + numberOfTravellers.infants;
+
+ if (totalSelected < totalRequired) {
+ alert(`Please select ${totalRequired} passengers (${totalSelected} selected)`);
+ return;
+ }
+
+ // Check for incomplete passenger information
+ const incompletePassengers = Object.values(selectedPassengers).filter(hasIncompleteInfo);
+ if (incompletePassengers.length > 0) {
+ alert('Some selected passengers have incomplete information. Please edit them to continue.');
+ return;
+ }
+
+ setIsLoading(true);
+
+ // Format data according to the required response format
+ // Combine all passengers and assign sequential IDs (1, 2, 3, etc.)
+ const allPassengers = [
+ ...Object.values(selectedPassengers).map((passenger, index) => {
+ // Check if document is required for this passenger
+ const passengerSequence = index + 1;
+ const documentRequired = isDocumentRequired(passengerSequence);
+
+ // Build documents array - include documents if they exist or if required
+ let documents: any[] = [];
+ if (passenger.documents && passenger.documents.length > 0 && (documentRequired || isInternational)) {
+ // Use existing document data
+ documents = passenger.documents.map(doc => ({
+ documentType: doc.documentType,
+ documentNumber: doc.documentNumber,
+ nationality: doc.nationality,
+ expiryDate: doc.expiryDate,
+ issuingDate: doc.issuingDate,
+ issuingCountry: doc.issuingCountry,
+ }));
+ }
+
+ return {
+ dateOfBirth: passenger.dateOfBirth,
+ gender: passenger.gender.toUpperCase(),
+ name: {
+ firstName: passenger.firstName.toUpperCase(),
+ lastName: passenger.lastName.toUpperCase(),
+ },
+ documents: documents,
+ contact: {
+ purpose: "STANDARD",
+ phones: [{
+ deviceType: "MOBILE",
+ countryCallingCode: selectedCountryCode.code.replace('+', ''),
+ number: contactPhoneNumber,
+ }],
+ emailAddress: contactEmail,
+ },
+ };
+ }),
+ ...Object.entries(newPassengers).map(([, passenger], index) => {
+ // Check if document is required for this passenger
+ const passengerSequence = Object.values(selectedPassengers).length + index + 1;
+ const documentRequired = isDocumentRequired(passengerSequence);
+
+ // Build documents array for new passengers - include if passport info exists or if required
+ let documents: any[] = [];
+ if (passenger.passportNumber && (documentRequired || isInternational)) {
+ documents = [{
+ documentType: "passport",
+ documentNumber: passenger.passportNumber,
+ nationality: passenger.nationality || selectedNationality.code,
+ expiryDate: passenger.passportExpiry || "",
+ issuingDate: "", // Not collected in form
+ issuingCountry: passenger.issuingCountry || selectedIssuingCountry.code,
+ }];
+ }
+
+ return {
+ dateOfBirth: passenger.dateOfBirth || "",
+ gender: passenger.title === 'Ms.' || passenger.title === 'Mrs.' ? 'FEMALE' : 'MALE',
+ name: {
+ firstName: passenger.firstName.toUpperCase(),
+ lastName: passenger.lastName.toUpperCase(),
+ },
+ documents: documents,
+ contact: {
+ purpose: "STANDARD",
+ phones: [{
+ deviceType: "MOBILE",
+ countryCallingCode: selectedCountryCode.code.replace('+', ''),
+ number: contactPhoneNumber,
+ }],
+ emailAddress: contactEmail,
+ },
+ };
+ }),
+ ];
+
+ // Assign sequential IDs starting from 1
+ const travellersDetail = allPassengers.map((passenger, index) => ({
+ id: index + 1, // Sequential ID: 1, 2, 3, etc.
+ ...passenger,
+ }));
+
+ const responseData = [{
+ type: "response",
+ data: {
+ travellersDetail,
+ contactInfo: {
+ email: contactEmail,
+ phone: {
+ countryCode: selectedCountryCode.code.replace('+', ''),
+ number: contactPhoneNumber,
+ },
+ },
+ },
+ }];
+
+ try {
+ await submitInterruptResponse(thread, responseData[0].type, responseData[0].data);
+ } catch (error: any) {
+ console.error("Error submitting passenger selection:", error);
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ return (
+ <>
+
+ {/* Header */}
+
+
+ {/* Passenger Sections */}
+ {numberOfTravellers.adults > 0 && (
+
+
+
+
Adults
+ ({getSelectedCount('adult')}/{numberOfTravellers.adults} added)
+
+
handleAddPassenger('adult')}
+ variant="outline"
+ className="rounded-xl border-2 border-gray-300 text-black hover:bg-gray-50 hover:border-gray-400 px-3 py-1 text-sm"
+ >
+ Add adult
+
+
+
+
+ {getPassengersByType('adult').slice(0, showAllPassengers ? undefined : 2).map((passenger) => (
+
+
handlePassengerToggle(passenger)}
+ >
+
+ {isPassengerSelected(passenger.id) && (
+
+ )}
+
+
+
+ {passenger.firstName} {passenger.lastName}
+
+ {hasIncompleteInfo(passenger) && (
+
+ )}
+
+
+
handleEditPassenger(passenger)}
+ />
+
+ ))}
+
+ {/* Display new passengers */}
+ {Object.entries(newPassengers)
+ .filter(([_, passenger]) => passenger.type === 'adult')
+ .map(([id, passenger]) => (
+
+
+
+
+ {passenger.firstName} {passenger.lastName}
+
+
New
+
+
handleEditNewPassenger(id, passenger)}
+ />
+
+ ))}
+
+ {!showAllPassengers && getPassengersByType('adult').length > 2 && (
+
setShowAllPassengers(true)}
+ variant="ghost"
+ className="w-full text-blue-600 hover:text-blue-700 hover:bg-blue-50 text-sm py-2"
+ >
+ View all saved travellers
+
+ )}
+
+
+ )}
+
+ {/* Children Section */}
+ {numberOfTravellers.children > 0 && (
+
+
+
+
Children
+ ({getSelectedCount('child')}/{numberOfTravellers.children} added)
+
+
handleAddPassenger('child')}
+ variant="outline"
+ className="rounded-xl border-2 border-gray-300 text-black hover:bg-gray-50 hover:border-gray-400 px-3 py-1 text-sm"
+ >
+ Add child
+
+
+
+
+ {getPassengersByType('child').slice(0, showAllPassengers ? undefined : 2).map((passenger) => (
+
+
handlePassengerToggle(passenger)}
+ >
+
+ {isPassengerSelected(passenger.id) && (
+
+ )}
+
+
+
+ {passenger.firstName} {passenger.lastName}
+
+ {hasIncompleteInfo(passenger) && (
+
+ )}
+
+
+
handleEditPassenger(passenger)}
+ />
+
+ ))}
+
+ {/* Display new child passengers */}
+ {Object.entries(newPassengers)
+ .filter(([_, passenger]) => passenger.type === 'child')
+ .map(([id, passenger]) => (
+
+
+
+
+ {passenger.firstName} {passenger.lastName}
+
+
New
+
+
handleEditNewPassenger(id, passenger)}
+ />
+
+ ))}
+
+
+ )}
+
+ {/* Infants Section */}
+ {numberOfTravellers.infants > 0 && (
+
+
+
+
Infants
+ ({getSelectedCount('infant')}/{numberOfTravellers.infants} added)
+
+
handleAddPassenger('infant')}
+ variant="outline"
+ className="rounded-xl border-2 border-gray-300 text-black hover:bg-gray-50 hover:border-gray-400 px-3 py-1 text-sm"
+ >
+ Add infant
+
+
+
+
+ {getPassengersByType('infant').slice(0, showAllPassengers ? undefined : 2).map((passenger) => (
+
+
handlePassengerToggle(passenger)}
+ >
+
+ {isPassengerSelected(passenger.id) && (
+
+ )}
+
+
+
+ {passenger.firstName} {passenger.lastName}
+
+ {hasIncompleteInfo(passenger) && (
+
+ )}
+
+
+
handleEditPassenger(passenger)}
+ />
+
+ ))}
+
+ {/* Display new infant passengers */}
+ {Object.entries(newPassengers)
+ .filter(([_, passenger]) => passenger.type === 'infant')
+ .map(([id, passenger]) => (
+
+
+
+
+ {passenger.firstName} {passenger.lastName}
+
+
New
+
+
handleEditNewPassenger(id, passenger)}
+ />
+
+ ))}
+
+
+ )}
+
+ {/* Contact Information */}
+
+
Contact Information
+
Booking updates will be shared here
+
+
setContactEmail(e.target.value)}
+ className="w-full rounded-xl border-2 border-gray-200 px-3 py-2 text-sm focus:border-black focus:ring-black"
+ />
+
+
+
setShowCountryCodeSheet(true)}
+ >
+ {selectedCountryCode.flag}
+ {selectedCountryCode.code}
+
+
+
setContactPhoneNumber(e.target.value)}
+ className="w-full rounded-xl border-2 border-gray-200 pl-16 pr-3 py-2 text-sm focus:border-black focus:ring-black"
+ />
+
+
+
+
+ {/* Bottom Section */}
+
+
+
{currency}{totalAmount.toLocaleString()}
+
+
+
+ {isLoading ? (
+
+ ) : (
+ "Continue"
+ )}
+
+
+
+ {/* Add Passenger Bottom Sheet */}
+
+
+
+
+ Add new {addPassengerType}
+
+
+ {addPassengerType === 'adult' ? 'Above 12 years' :
+ addPassengerType === 'child' ? 'Between 2 - 12 years' :
+ 'Below 2 years'}
+
+
+
+
+
+ {/* Title Selection */}
+
+ {(addPassengerType === 'child' || addPassengerType === 'infant'
+ ? ['Master', 'Miss']
+ : ['Mr.', 'Ms.', 'Mrs.']
+ ).map((title) => (
+ setNewPassengerForm(prev => ({ ...prev, title }))}
+ variant={newPassengerForm.title === title ? "default" : "outline"}
+ className={cn(
+ "px-4 py-2 rounded-xl",
+ newPassengerForm.title === title
+ ? "bg-black text-white"
+ : "border-2 border-gray-300 text-black hover:bg-gray-50"
+ )}
+ >
+ {title}
+
+ ))}
+
+
+ {/* Name Fields */}
+
setNewPassengerForm(prev => ({ ...prev, firstName: e.target.value }))}
+ className="w-full rounded-xl border-2 border-gray-200 px-4 py-3 focus:border-black focus:ring-black"
+ />
+
+
setNewPassengerForm(prev => ({ ...prev, lastName: e.target.value }))}
+ className="w-full rounded-xl border-2 border-gray-200 px-4 py-3 focus:border-black focus:ring-black"
+ />
+
+ {/* Date of Birth (Optional) */}
+
setNewPassengerForm(prev => ({ ...prev, dateOfBirth: e.target.value }))}
+ min={getDateLimits(addPassengerType).min}
+ max={getDateLimits(addPassengerType).max}
+ className="w-full rounded-xl border-2 border-gray-200 px-4 py-3 focus:border-black focus:ring-black"
+ />
+
+ {/* Document Fields - Show when document is required or for international flights */}
+ {(isInternational || isAnyDocumentRequired()) && (
+ <>
+ {/* Nationality Dropdown */}
+
+
setShowNationalitySheet(true)}
+ >
+
+ {selectedNationality.name || "Nationality"}
+
+
+
+
+
+
setNewPassengerForm(prev => ({ ...prev, passportNumber: e.target.value }))}
+ className="w-full rounded-xl border-2 border-gray-200 px-4 py-3 focus:border-black focus:ring-black"
+ required={isAnyDocumentRequired()}
+ />
+
+ {/* Passport Issuing Country Dropdown */}
+
+
setShowIssuingCountrySheet(true)}
+ >
+
+ {selectedIssuingCountry.name || "Passport issuing country"}
+
+
+
+
+
+
setNewPassengerForm(prev => ({ ...prev, passportExpiry: e.target.value }))}
+ min={new Date().toISOString().split('T')[0]} // Block past dates
+ className="w-full rounded-xl border-2 border-gray-200 px-4 py-3 focus:border-black focus:ring-black"
+ required={isAnyDocumentRequired()}
+ />
+ >
+ )}
+
+
+ Save new {addPassengerType}
+
+
+
+
+
+
+ {/* Edit Passenger Bottom Sheet */}
+
+
+
+
+ Edit Passenger
+
+
+
+
+ {editingPassenger && (
+
+
setEditingPassenger(prev => prev ? { ...prev, firstName: e.target.value } : null)}
+ className="w-full rounded-xl border-2 border-gray-200 px-4 py-3 focus:border-black focus:ring-black"
+ />
+
+
setEditingPassenger(prev => prev ? { ...prev, lastName: e.target.value } : null)}
+ className="w-full rounded-xl border-2 border-gray-200 px-4 py-3 focus:border-black focus:ring-black"
+ />
+
+
setEditingPassenger(prev => prev ? { ...prev, dateOfBirth: e.target.value } : null)}
+ min={getDateLimits(editingPassenger.type || 'adult').min}
+ max={getDateLimits(editingPassenger.type || 'adult').max}
+ className="w-full rounded-xl border-2 border-gray-200 px-4 py-3 focus:border-black focus:ring-black"
+ />
+
+ {/* Passport Information - Editable Fields */}
+ {(isInternational || isAnyDocumentRequired()) && (
+
+
Passport Information
+
+ {/* Nationality Dropdown */}
+
+
setShowEditNationalitySheet(true)}
+ >
+
+ {editSelectedNationality.name || "Nationality"}
+
+
+
+
+
+
{
+ const newDocuments = editingPassenger.documents ? [...editingPassenger.documents] : [{
+ documentId: 0,
+ documentType: 'passport',
+ documentNumber: '',
+ nationality: editSelectedNationality.code,
+ expiryDate: '',
+ issuingDate: '',
+ issuingCountry: editSelectedIssuingCountry.code,
+ documentUrl: ''
+ }];
+ newDocuments[0] = { ...newDocuments[0], documentNumber: e.target.value };
+ setEditingPassenger(prev => prev ? { ...prev, documents: newDocuments } : null);
+ }}
+ className="w-full rounded-xl border-2 border-gray-200 px-4 py-3 focus:border-black focus:ring-black"
+ />
+
+ {/* Passport Issuing Country Dropdown */}
+
+
setShowEditIssuingCountrySheet(true)}
+ >
+
+ {editSelectedIssuingCountry.name || "Passport issuing country"}
+
+
+
+
+
+
{
+ const newDocuments = editingPassenger.documents ? [...editingPassenger.documents] : [{
+ documentId: 0,
+ documentType: 'passport',
+ documentNumber: '',
+ nationality: editSelectedNationality.code,
+ expiryDate: '',
+ issuingDate: '',
+ issuingCountry: editSelectedIssuingCountry.code,
+ documentUrl: ''
+ }];
+ newDocuments[0] = { ...newDocuments[0], expiryDate: e.target.value };
+ setEditingPassenger(prev => prev ? { ...prev, documents: newDocuments } : null);
+ }}
+ min={new Date().toISOString().split('T')[0]} // Block past dates
+ className="w-full rounded-xl border-2 border-gray-200 px-4 py-3 focus:border-black focus:ring-black"
+ />
+
+ )}
+
+
+ Save Changes
+
+
+ )}
+
+
+
+
+ {/* Country Code Selection Bottom Sheet */}
+
+
+
+
+ Select Country Code
+
+
+
+
+
+ {countryCodes.map((country) => (
+
{
+ setSelectedCountryCode(country);
+ setShowCountryCodeSheet(false);
+ }}
+ className={cn(
+ "flex items-center justify-between p-4 border-2 rounded-xl cursor-pointer transition-all duration-200 hover:shadow-md",
+ selectedCountryCode.code === country.code
+ ? "border-black bg-gray-50"
+ : "border-gray-200 hover:border-gray-300"
+ )}
+ >
+
+
{country.flag}
+
+ {country.country}
+ {country.code}
+
+
+ {selectedCountryCode.code === country.code && (
+
+ )}
+
+ ))}
+
+
+
+
+
+ {/* Nationality Selection Sheet */}
+
+
+
+ Select Nationality
+
+
+
+ {countries.map((country) => (
+
{
+ setSelectedNationality(country);
+ setNewPassengerForm(prev => ({ ...prev, nationality: country.code }));
+ setShowNationalitySheet(false);
+ }}
+ className={cn(
+ "flex items-center justify-between p-4 border-2 rounded-xl cursor-pointer transition-all duration-200 hover:shadow-md",
+ selectedNationality.code === country.code
+ ? "border-black bg-gray-50"
+ : "border-gray-200 hover:border-gray-300"
+ )}
+ >
+
+
+ {country.name}
+ {country.code}
+
+
+ {selectedNationality.code === country.code && (
+
+ )}
+
+ ))}
+
+
+
+
+
+ {/* Issuing Country Selection Sheet */}
+
+
+
+ Select Passport Issuing Country
+
+
+
+ {countries.map((country) => (
+
{
+ setSelectedIssuingCountry(country);
+ setNewPassengerForm(prev => ({ ...prev, issuingCountry: country.code }));
+ setShowIssuingCountrySheet(false);
+ }}
+ className={cn(
+ "flex items-center justify-between p-4 border-2 rounded-xl cursor-pointer transition-all duration-200 hover:shadow-md",
+ selectedIssuingCountry.code === country.code
+ ? "border-black bg-gray-50"
+ : "border-gray-200 hover:border-gray-300"
+ )}
+ >
+
+
+ {country.name}
+ {country.code}
+
+
+ {selectedIssuingCountry.code === country.code && (
+
+ )}
+
+ ))}
+
+
+
+
+
+ {/* Edit Modal - Nationality Selection Sheet */}
+
+
+
+ Select Nationality
+
+
+
+ {countries.map((country) => (
+
{
+ setEditSelectedNationality(country);
+ setShowEditNationalitySheet(false);
+ }}
+ className={cn(
+ "flex items-center justify-between p-4 border-2 rounded-xl cursor-pointer transition-all duration-200 hover:shadow-md",
+ editSelectedNationality.code === country.code
+ ? "border-black bg-gray-50"
+ : "border-gray-200 hover:border-gray-300"
+ )}
+ >
+
+
+ {country.name}
+ {country.code}
+
+
+ {editSelectedNationality.code === country.code && (
+
+ )}
+
+ ))}
+
+
+
+
+
+ {/* Edit Modal - Issuing Country Selection Sheet */}
+
+
+
+ Select Passport Issuing Country
+
+
+
+ {countries.map((country) => (
+
{
+ setEditSelectedIssuingCountry(country);
+ setShowEditIssuingCountrySheet(false);
+ }}
+ className={cn(
+ "flex items-center justify-between p-4 border-2 rounded-xl cursor-pointer transition-all duration-200 hover:shadow-md",
+ editSelectedIssuingCountry.code === country.code
+ ? "border-black bg-gray-50"
+ : "border-gray-200 hover:border-gray-300"
+ )}
+ >
+
+
+ {country.name}
+ {country.code}
+
+
+ {editSelectedIssuingCountry.code === country.code && (
+
+ )}
+
+ ))}
+
+
+
+
+
+ >
+ );
+};
+
+export default WhosTravellingWidget;
diff --git a/src/hooks/use-interrupt-persistence.tsx b/src/hooks/use-interrupt-persistence.tsx
new file mode 100644
index 00000000..c2e07837
--- /dev/null
+++ b/src/hooks/use-interrupt-persistence.tsx
@@ -0,0 +1,89 @@
+import { useState, useCallback, useRef } from "react";
+
+export interface PersistedInterrupt {
+ id: string;
+ interrupt: Record;
+ timestamp: number;
+ messageId?: string;
+ associatedResponseId?: string;
+ isCompleted: boolean;
+}
+
+export interface InterruptPersistenceContextType {
+ persistedInterrupts: PersistedInterrupt[];
+ addInterrupt: (interrupt: Record, messageId?: string) => string;
+ markAsCompleted: (interruptId: string, responseId?: string) => void;
+ getInterruptById: (id: string) => PersistedInterrupt | undefined;
+ getInterruptsForMessage: (messageId: string) => PersistedInterrupt[];
+ clearAllInterrupts: () => void;
+}
+
+export function useInterruptPersistence(): InterruptPersistenceContextType {
+ const [persistedInterrupts, setPersistedInterrupts] = useState<
+ PersistedInterrupt[]
+ >([]);
+ const interruptCounterRef = useRef(0);
+
+ const addInterrupt = useCallback(
+ (interrupt: Record, messageId?: string): string => {
+ const id = `interrupt-${Date.now()}-${++interruptCounterRef.current}`;
+ const newInterrupt: PersistedInterrupt = {
+ id,
+ interrupt,
+ timestamp: Date.now(),
+ messageId,
+ isCompleted: false,
+ };
+
+ setPersistedInterrupts((prev) => [...prev, newInterrupt]);
+ return id;
+ },
+ [],
+ );
+
+ const markAsCompleted = useCallback(
+ (interruptId: string, responseId?: string) => {
+ setPersistedInterrupts((prev) =>
+ prev.map((interrupt) =>
+ interrupt.id === interruptId
+ ? {
+ ...interrupt,
+ isCompleted: true,
+ associatedResponseId: responseId,
+ }
+ : interrupt,
+ ),
+ );
+ },
+ [],
+ );
+
+ const getInterruptById = useCallback(
+ (id: string): PersistedInterrupt | undefined => {
+ return persistedInterrupts.find((interrupt) => interrupt.id === id);
+ },
+ [persistedInterrupts],
+ );
+
+ const getInterruptsForMessage = useCallback(
+ (messageId: string): PersistedInterrupt[] => {
+ return persistedInterrupts.filter(
+ (interrupt) => interrupt.messageId === messageId,
+ );
+ },
+ [persistedInterrupts],
+ );
+
+ const clearAllInterrupts = useCallback(() => {
+ setPersistedInterrupts([]);
+ }, []);
+
+ return {
+ persistedInterrupts,
+ addInterrupt,
+ markAsCompleted,
+ getInterruptById,
+ getInterruptsForMessage,
+ clearAllInterrupts,
+ };
+}
diff --git a/src/lib/langgraph-index.js b/src/lib/langgraph-index.js
new file mode 100644
index 00000000..de82d68f
--- /dev/null
+++ b/src/lib/langgraph-index.js
@@ -0,0 +1 @@
+export { useStream } from './langgraph-stream.js';
\ No newline at end of file
diff --git a/src/lib/langgraph-stream.js b/src/lib/langgraph-stream.js
new file mode 100644
index 00000000..4deaf6f1
--- /dev/null
+++ b/src/lib/langgraph-stream.js
@@ -0,0 +1,740 @@
+/* __LC_ALLOW_ENTRYPOINT_SIDE_EFFECTS__ */
+/* eslint-disable */
+"use client";
+import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
+import { coerceMessageLikeToMessage, convertToChunk, isBaseMessageChunk, } from "@langchain/core/messages";
+import { Client } from "@langchain/langgraph-sdk";
+// import { getClientConfigHash } from "@langchain/langgraph-sdk/client";
+
+class StreamError extends Error {
+ constructor(data) {
+ super(data.message);
+ this.name = data.name ?? data.error ?? "StreamError";
+ }
+ static isStructuredError(error) {
+ return typeof error === "object" && error != null && "message" in error;
+ }
+}
+
+function tryConvertToChunk(message) {
+ try {
+ return convertToChunk(message);
+ }
+ catch {
+ return null;
+ }
+}
+
+class MessageTupleManager {
+ constructor() {
+ Object.defineProperty(this, "chunks", {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: {}
+ });
+ this.chunks = {};
+ }
+ add(serialized) {
+ // TODO: this is sometimes sent from the API
+ // figure out how to prevent this or move this to LC.js
+ if (serialized.type.endsWith("MessageChunk")) {
+ // eslint-disable-next-line no-param-reassign
+ serialized.type = serialized.type
+ .slice(0, -"MessageChunk".length)
+ .toLowerCase();
+ }
+ const message = coerceMessageLikeToMessage(serialized);
+ const chunk = tryConvertToChunk(message);
+ const { id } = chunk ?? message;
+ if (!id) {
+ console.warn("No message ID found for chunk, ignoring in state", serialized);
+ return null;
+ }
+ this.chunks[id] ??= {};
+ if (chunk) {
+ const prev = this.chunks[id].chunk;
+ this.chunks[id].chunk =
+ (isBaseMessageChunk(prev) ? prev : null)?.concat(chunk) ?? chunk;
+ }
+ else {
+ this.chunks[id].chunk = message;
+ }
+ return id;
+ }
+ clear() {
+ this.chunks = {};
+ }
+ get(id, defaultIndex) {
+ if (this.chunks[id] == null)
+ return null;
+ this.chunks[id].index ??= defaultIndex;
+ return this.chunks[id];
+ }
+}
+
+const toMessageDict = (chunk) => {
+ const { type, data } = chunk.toDict();
+ return { ...data, type };
+};
+
+function unique(array) {
+ return [...new Set(array)];
+}
+
+function findLastIndex(array, predicate) {
+ for (let i = array.length - 1; i >= 0; i -= 1) {
+ if (predicate(array[i]))
+ return i;
+ }
+ return -1;
+}
+
+function getBranchSequence(history) {
+ const childrenMap = {};
+ // Short circuit if there's only a singular one state
+ // TODO: I think we can make this more generalizable for all `fetchStateHistory` values.
+ if (history.length <= 1) {
+ return {
+ rootSequence: {
+ type: "sequence",
+ items: history.map((value) => ({ type: "node", value, path: [] })),
+ },
+ paths: [],
+ };
+ }
+ // First pass - collect nodes for each checkpoint
+ history.forEach((state) => {
+ const checkpointId = state.parent_checkpoint?.checkpoint_id ?? "$";
+ childrenMap[checkpointId] ??= [];
+ childrenMap[checkpointId].push(state);
+ });
+ const rootSequence = { type: "sequence", items: [] };
+ const queue = [{ id: "$", sequence: rootSequence, path: [] }];
+ const paths = [];
+ const visited = new Set();
+ while (queue.length > 0) {
+ const task = queue.shift();
+ if (visited.has(task.id))
+ continue;
+ visited.add(task.id);
+ const children = childrenMap[task.id];
+ if (children == null || children.length === 0)
+ continue;
+ // If we've encountered a fork (2+ children), push the fork
+ // to the sequence and add a new sequence for each child
+ let fork;
+ if (children.length > 1) {
+ fork = { type: "fork", items: [] };
+ task.sequence.items.push(fork);
+ }
+ for (const value of children) {
+ const id = value.checkpoint?.checkpoint_id;
+ if (id == null)
+ continue;
+ let { sequence } = task;
+ let { path } = task;
+ if (fork != null) {
+ sequence = { type: "sequence", items: [] };
+ fork.items.unshift(sequence);
+ path = path.slice();
+ path.push(id);
+ paths.push(path);
+ }
+ sequence.items.push({ type: "node", value, path });
+ queue.push({ id, sequence, path });
+ }
+ }
+ return { rootSequence, paths };
+}
+
+const PATH_SEP = ">";
+const ROOT_ID = "$";
+
+// Get flat view
+function getBranchView(sequence, paths, branch) {
+ const path = branch.split(PATH_SEP);
+ const pathMap = {};
+ for (const path of paths) {
+ const parent = path.at(-2) ?? ROOT_ID;
+ pathMap[parent] ??= [];
+ pathMap[parent].unshift(path);
+ }
+ const history = [];
+ const branchByCheckpoint = {};
+ const forkStack = path.slice();
+ const queue = [...sequence.items];
+ while (queue.length > 0) {
+ const item = queue.shift();
+ if (item.type === "node") {
+ history.push(item.value);
+ const checkpointId = item.value.checkpoint?.checkpoint_id;
+ if (checkpointId == null)
+ continue;
+ branchByCheckpoint[checkpointId] = {
+ branch: item.path.join(PATH_SEP),
+ branchOptions: (item.path.length > 0
+ ? pathMap[item.path.at(-2) ?? ROOT_ID] ?? []
+ : []).map((p) => p.join(PATH_SEP)),
+ };
+ }
+ if (item.type === "fork") {
+ const forkId = forkStack.shift();
+ const index = forkId != null
+ ? item.items.findIndex((value) => {
+ const firstItem = value.items.at(0);
+ if (!firstItem || firstItem.type !== "node")
+ return false;
+ return firstItem.value.checkpoint?.checkpoint_id === forkId;
+ })
+ : -1;
+ const nextItems = item.items.at(index)?.items ?? [];
+ queue.push(...nextItems);
+ }
+ }
+ return { history, branchByCheckpoint };
+}
+
+function fetchHistory(client, threadId, options) {
+ if (options?.limit === false) {
+ return client.threads.getState(threadId).then((state) => {
+ if (state.checkpoint == null)
+ return [];
+ return [state];
+ });
+ }
+ const limit = typeof options?.limit === "number" ? options.limit : 1000;
+ return client.threads.getHistory(threadId, { limit });
+}
+
+function useThreadHistory(threadId, client, limit, clearCallbackRef, submittingRef, onErrorRef) {
+ const [history, setHistory] = useState(undefined);
+ const [isLoading, setIsLoading] = useState(false);
+ const [error, setError] = useState(undefined);
+ const clientHash = JSON.stringify(client?.config || {});
+ const clientRef = useRef(client);
+ clientRef.current = client;
+ const fetcher = useCallback((threadId) => {
+ if (threadId != null) {
+ const client = clientRef.current;
+ setIsLoading(true);
+ return fetchHistory(client, threadId, {
+ limit,
+ })
+ .then((history) => {
+ setHistory(history);
+ return history;
+ }, (error) => {
+ setError(error);
+ onErrorRef.current?.(error);
+ return Promise.reject(error);
+ })
+ .finally(() => {
+ setIsLoading(false);
+ });
+ }
+ setHistory(undefined);
+ setError(undefined);
+ setIsLoading(false);
+ clearCallbackRef.current?.();
+ return Promise.resolve([]);
+ }, [clearCallbackRef, onErrorRef, limit]);
+ useEffect(() => {
+ if (submittingRef.current)
+ return;
+ void fetcher(threadId);
+ }, [fetcher, clientHash, limit, submittingRef, threadId]);
+ return {
+ data: history,
+ isLoading,
+ error,
+ mutate: (mutateId) => fetcher(mutateId ?? threadId),
+ };
+}
+
+const useControllableThreadId = (options) => {
+ const [localThreadId, _setLocalThreadId] = useState(options?.threadId ?? null);
+ const onThreadIdRef = useRef(options?.onThreadId);
+ onThreadIdRef.current = options?.onThreadId;
+ const onThreadId = useCallback((threadId) => {
+ _setLocalThreadId(threadId);
+ onThreadIdRef.current?.(threadId);
+ }, []);
+ if (!options || !("threadId" in options)) {
+ return [localThreadId, onThreadId];
+ }
+ return [options.threadId ?? null, onThreadId];
+};
+
+function useStreamValuesState() {
+ const [values, setValues] = useState(null);
+ const setStreamValues = useCallback((values, kind = "stream") => {
+ if (typeof values === "function") {
+ setValues((prevTuple) => {
+ const [prevValues, prevKind] = prevTuple ?? [null, "stream"];
+ const next = values(prevValues, prevKind);
+ if (next == null)
+ return null;
+ return [next, kind];
+ });
+ return;
+ }
+ if (values == null)
+ setValues(null);
+ setValues([values, kind]);
+ }, []);
+ const mutate = useCallback((kind, serverValues) => (update) => {
+ setStreamValues((clientValues) => {
+ const prev = { ...serverValues, ...clientValues };
+ const next = typeof update === "function" ? update(prev) : update;
+ return { ...prev, ...next };
+ }, kind);
+ }, [setStreamValues]);
+ return [values?.[0] ?? null, setStreamValues, mutate];
+}
+
+export function useStream(options) {
+ let { messagesKey } = options;
+ const { assistantId, fetchStateHistory } = options;
+ const { onCreated, onError, onFinish } = options;
+ const reconnectOnMountRef = useRef(options.reconnectOnMount);
+ const runMetadataStorage = useMemo(() => {
+ if (typeof window === "undefined")
+ return null;
+ const storage = reconnectOnMountRef.current;
+ if (storage === true)
+ return window.sessionStorage;
+ if (typeof storage === "function")
+ return storage();
+ return null;
+ }, []);
+ messagesKey ??= "messages";
+ const client = useMemo(() => options.client ??
+ new Client({
+ apiUrl: options.apiUrl,
+ apiKey: options.apiKey,
+ callerOptions: options.callerOptions,
+ defaultHeaders: options.defaultHeaders,
+ }), [
+ options.client,
+ options.apiKey,
+ options.apiUrl,
+ options.callerOptions,
+ options.defaultHeaders,
+ ]);
+ const [threadId, onThreadId] = useControllableThreadId(options);
+ const [branch, setBranch] = useState("");
+ const [isLoading, setIsLoading] = useState(false);
+ const [streamError, setStreamError] = useState(undefined);
+ const [streamValues, setStreamValues, getMutateFn] = useStreamValuesState();
+
+ // ENHANCED: Stream values cache for subgraph message persistence
+ const streamValuesCacheRef = useRef(null);
+
+ const messageManagerRef = useRef(new MessageTupleManager());
+ const submittingRef = useRef(false);
+ const abortRef = useRef(null);
+ const trackStreamModeRef = useRef([]);
+ const trackStreamMode = useCallback((...mode) => {
+ for (const m of mode) {
+ if (!trackStreamModeRef.current.includes(m)) {
+ trackStreamModeRef.current.push(m);
+ }
+ }
+ }, []);
+ const hasUpdateListener = options.onUpdateEvent != null;
+ const hasCustomListener = options.onCustomEvent != null;
+ const hasLangChainListener = options.onLangChainEvent != null;
+ const hasDebugListener = options.onDebugEvent != null;
+ const hasCheckpointListener = options.onCheckpointEvent != null;
+ const hasTaskListener = options.onTaskEvent != null;
+ const callbackStreamMode = useMemo(() => {
+ const modes = [];
+ if (hasUpdateListener)
+ modes.push("updates");
+ if (hasCustomListener)
+ modes.push("custom");
+ if (hasLangChainListener)
+ modes.push("events");
+ if (hasDebugListener)
+ modes.push("debug");
+ if (hasCheckpointListener)
+ modes.push("checkpoints");
+ if (hasTaskListener)
+ modes.push("tasks");
+ return modes;
+ }, [
+ hasUpdateListener,
+ hasCustomListener,
+ hasLangChainListener,
+ hasDebugListener,
+ hasCheckpointListener,
+ hasTaskListener,
+ ]);
+ const clearCallbackRef = useRef(null);
+ clearCallbackRef.current = () => {
+ setStreamError(undefined);
+ setStreamValues(null);
+ messageManagerRef.current.clear();
+ };
+ const onErrorRef = useRef(undefined);
+ onErrorRef.current = options.onError;
+ const historyLimit = typeof fetchStateHistory === "object" && fetchStateHistory != null
+ ? fetchStateHistory.limit ?? true
+ : fetchStateHistory ?? true;
+ const history = useThreadHistory(threadId, client, historyLimit, clearCallbackRef, submittingRef, onErrorRef);
+ const getMessages = useMemo(() => {
+ return (value) => Array.isArray(value[messagesKey])
+ ? value[messagesKey]
+ : [];
+ }, [messagesKey]);
+ const { rootSequence, paths } = getBranchSequence(history.data ?? []);
+ const { history: flatHistory, branchByCheckpoint } = getBranchView(rootSequence, paths, branch);
+ const threadHead = flatHistory.at(-1);
+ const historyValues = threadHead?.values ?? options.initialValues ?? {};
+ const historyValueError = (() => {
+ const error = threadHead?.tasks?.at(-1)?.error;
+ if (error == null)
+ return undefined;
+ try {
+ const parsed = JSON.parse(error);
+ if (StreamError.isStructuredError(parsed)) {
+ return new StreamError(parsed);
+ }
+ return parsed;
+ }
+ catch {
+ // do nothing
+ }
+ return error;
+ })();
+ const messageMetadata = (() => {
+ const alreadyShown = new Set();
+ return getMessages(historyValues).map((message, idx) => {
+ const messageId = message.id ?? idx;
+ const firstSeenIdx = findLastIndex(history.data ?? [], (state) => getMessages(state.values)
+ .map((m, idx) => m.id ?? idx)
+ .includes(messageId));
+ const firstSeen = history.data?.[firstSeenIdx];
+ const checkpointId = firstSeen?.checkpoint?.checkpoint_id;
+ let branch = firstSeen && checkpointId != null
+ ? branchByCheckpoint[checkpointId]
+ : undefined;
+ if (!branch?.branch?.length)
+ branch = undefined;
+ // serialize branches
+ const optionsShown = branch?.branchOptions?.flat(2).join(",");
+ if (optionsShown) {
+ if (alreadyShown.has(optionsShown))
+ branch = undefined;
+ alreadyShown.add(optionsShown);
+ }
+ return {
+ messageId: messageId.toString(),
+ firstSeenState: firstSeen,
+ branch: branch?.branch,
+ branchOptions: branch?.branchOptions,
+ };
+ });
+ })();
+ const stop = () => {
+ if (abortRef.current != null)
+ abortRef.current.abort();
+ abortRef.current = null;
+ if (runMetadataStorage && threadId) {
+ const runId = runMetadataStorage.getItem(`lg:stream:${threadId}`);
+ if (runId)
+ void client.runs.cancel(threadId, runId);
+ runMetadataStorage.removeItem(`lg:stream:${threadId}`);
+ }
+ options?.onStop?.({ mutate: getMutateFn("stop", historyValues) });
+ };
+ async function consumeStream(action) {
+ let getCallbackMeta;
+ try {
+ setIsLoading(true);
+ setStreamError(undefined);
+ submittingRef.current = true;
+ abortRef.current = new AbortController();
+ const run = await action(abortRef.current.signal);
+ getCallbackMeta = run.getCallbackMeta;
+ let streamError;
+ for await (const { event, data } of run.stream) {
+ if (event === "error") {
+ streamError = new StreamError(data);
+ break;
+ }
+ if (event === "updates")
+ options.onUpdateEvent?.(data);
+ if (event === "custom" ||
+ // if `streamSubgraphs: true`, then we also want
+ // to also receive custom events from subgraphs
+ event.startsWith("custom|"))
+ options.onCustomEvent?.(data, {
+ mutate: getMutateFn("stream", historyValues),
+ });
+ if (event === "metadata")
+ options.onMetadataEvent?.(data);
+ if (event === "events")
+ options.onLangChainEvent?.(data);
+ if (event === "debug")
+ options.onDebugEvent?.(data);
+ if (event === "checkpoints")
+ options.onCheckpointEvent?.(data);
+ if (event === "tasks")
+ options.onTaskEvent?.(data);
+ if (event === "values") {
+ // ENHANCED: Handle interrupt values events properly
+ if ("__interrupt__" in data) {
+ console.log("🔍 Interrupt values event detected - preserving values");
+ setStreamValues(data); // Now updates values even for interrupts
+ continue;
+ }
+ setStreamValues(data);
+ }
+ if (event === "messages" ||
+ // if `streamSubgraphs: true`, then we also want
+ // to also receive messages from subgraphs
+ event.startsWith("messages|")) {
+ const [serialized] = data;
+ const messageId = messageManagerRef.current.add(serialized);
+ if (!messageId) {
+ console.warn("Failed to add message to manager, no message ID found");
+ continue;
+ }
+ setStreamValues((streamValues) => {
+ const values = { ...historyValues, ...streamValues };
+ // Assumption: we're concatenating the message
+ const messages = getMessages(values).slice();
+ const { chunk, index } = messageManagerRef.current.get(messageId, messages.length) ?? {};
+ if (!chunk || index == null)
+ return values;
+ messages[index] = toMessageDict(chunk);
+ return { ...values, [messagesKey]: messages };
+ });
+ }
+ }
+ // TODO: stream created checkpoints to avoid an unnecessary network request
+ const result = await run.onSuccess();
+ setStreamValues((values, kind) => {
+ // ENHANCED: Preserve values instead of clearing them
+ if (kind === "stop")
+ return values;
+ console.log("🔍 Stream ended - preserving values instead of clearing");
+ return values; // Now preserves values
+ });
+ if (streamError != null)
+ throw streamError;
+ const lastHead = result.at(0);
+ if (lastHead)
+ onFinish?.(lastHead, getCallbackMeta?.());
+ }
+ catch (error) {
+ if (!(error instanceof Error && // eslint-disable-line no-instanceof/no-instanceof
+ (error.name === "AbortError" || error.name === "TimeoutError"))) {
+ console.error(error);
+ setStreamError(error);
+ onError?.(error, getCallbackMeta?.());
+ }
+ }
+ finally {
+ setIsLoading(false);
+ submittingRef.current = false;
+ abortRef.current = null;
+ }
+ }
+ const joinStream = async (runId, lastEventId, options) => {
+ // eslint-disable-next-line no-param-reassign
+ lastEventId ??= "-1";
+ if (!threadId)
+ return;
+ await consumeStream(async (signal) => {
+ const stream = client.runs.joinStream(threadId, runId, {
+ signal,
+ lastEventId,
+ streamMode: options?.streamMode,
+ });
+ return {
+ onSuccess: () => {
+ runMetadataStorage?.removeItem(`lg:stream:${threadId}`);
+ return history.mutate(threadId);
+ },
+ stream,
+ getCallbackMeta: () => ({ thread_id: threadId, run_id: runId }),
+ };
+ });
+ };
+ const submit = async (values, submitOptions) => {
+ await consumeStream(async (signal) => {
+ // Unbranch things
+ const newPath = submitOptions?.checkpoint?.checkpoint_id
+ ? branchByCheckpoint[submitOptions?.checkpoint?.checkpoint_id]?.branch
+ : undefined;
+ if (newPath != null)
+ setBranch(newPath ?? "");
+ setStreamValues(() => {
+ if (submitOptions?.optimisticValues != null) {
+ return {
+ ...historyValues,
+ ...(typeof submitOptions.optimisticValues === "function"
+ ? submitOptions.optimisticValues(historyValues)
+ : submitOptions.optimisticValues),
+ };
+ }
+ return { ...historyValues };
+ });
+ let usableThreadId = threadId;
+ if (!usableThreadId) {
+ const thread = await client.threads.create({
+ threadId: submitOptions?.threadId,
+ metadata: submitOptions?.metadata,
+ });
+ onThreadId(thread.thread_id);
+ usableThreadId = thread.thread_id;
+ }
+ if (!usableThreadId)
+ throw new Error("Failed to obtain valid thread ID.");
+ const streamMode = unique([
+ ...(submitOptions?.streamMode ?? []),
+ ...trackStreamModeRef.current,
+ ...callbackStreamMode,
+ ]);
+ const checkpoint = submitOptions?.checkpoint ?? threadHead?.checkpoint ?? undefined;
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-expect-error
+ if (checkpoint != null)
+ delete checkpoint.thread_id;
+ let rejoinKey;
+ let callbackMeta;
+ const streamResumable = submitOptions?.streamResumable ?? !!runMetadataStorage;
+ const stream = client.runs.stream(usableThreadId, assistantId, {
+ input: values,
+ config: submitOptions?.config,
+ context: submitOptions?.context,
+ command: submitOptions?.command,
+ interruptBefore: submitOptions?.interruptBefore,
+ interruptAfter: submitOptions?.interruptAfter,
+ metadata: submitOptions?.metadata,
+ multitaskStrategy: submitOptions?.multitaskStrategy,
+ onCompletion: submitOptions?.onCompletion,
+ onDisconnect: submitOptions?.onDisconnect ??
+ (streamResumable ? "continue" : "cancel"),
+ signal,
+ checkpoint,
+ streamMode,
+ streamSubgraphs: submitOptions?.streamSubgraphs,
+ streamResumable,
+ onRunCreated(params) {
+ callbackMeta = {
+ run_id: params.run_id,
+ thread_id: params.thread_id ?? usableThreadId,
+ };
+ if (runMetadataStorage) {
+ rejoinKey = `lg:stream:${callbackMeta.thread_id}`;
+ runMetadataStorage.setItem(rejoinKey, callbackMeta.run_id);
+ }
+ onCreated?.(callbackMeta);
+ },
+ });
+ return {
+ stream,
+ getCallbackMeta: () => callbackMeta,
+ onSuccess: () => {
+ if (rejoinKey)
+ runMetadataStorage?.removeItem(rejoinKey);
+ return history.mutate(usableThreadId);
+ },
+ };
+ });
+ };
+ const reconnectKey = useMemo(() => {
+ if (!runMetadataStorage || isLoading)
+ return undefined;
+ if (typeof window === "undefined")
+ return undefined;
+ const runId = runMetadataStorage?.getItem(`lg:stream:${threadId}`);
+ if (!runId)
+ return undefined;
+ return { runId, threadId };
+ }, [runMetadataStorage, isLoading, threadId]);
+ const shouldReconnect = !!runMetadataStorage;
+ const reconnectRef = useRef({ threadId, shouldReconnect });
+ const joinStreamRef = useRef(joinStream);
+ joinStreamRef.current = joinStream;
+ useEffect(() => {
+ // reset shouldReconnect when switching threads
+ if (reconnectRef.current.threadId !== threadId) {
+ reconnectRef.current = { threadId, shouldReconnect };
+ }
+ }, [threadId, shouldReconnect]);
+ useEffect(() => {
+ if (reconnectKey && reconnectRef.current.shouldReconnect) {
+ reconnectRef.current.shouldReconnect = false;
+ void joinStreamRef.current?.(reconnectKey.runId);
+ }
+ }, [reconnectKey]);
+ const error = streamError ?? historyValueError ?? history.error;
+
+ // ENHANCED: Cache stream values when they are available
+ useEffect(() => {
+ if (streamValues) {
+ streamValuesCacheRef.current = streamValues;
+ console.log("🔍 Cached stream values:", Object.keys(streamValues));
+ }
+ }, [streamValues]);
+
+ return {
+ get values() {
+ trackStreamMode("values");
+ // ENHANCED: If we have cached stream values and current stream values are null, use cached ones
+ const finalValues = streamValues ?? streamValuesCacheRef.current ?? historyValues;
+ return finalValues;
+ },
+ client,
+ assistantId,
+ error,
+ isLoading,
+ stop,
+ submit, // eslint-disable-line @typescript-eslint/no-misused-promises
+ joinStream,
+ branch,
+ setBranch,
+ history: flatHistory,
+ isThreadLoading: history.isLoading && history.data == null,
+ get experimental_branchTree() {
+ if (historyLimit === false) {
+ throw new Error("`experimental_branchTree` is not available when `fetchStateHistory` is set to `false`");
+ }
+ return rootSequence;
+ },
+ get interrupt() {
+ // Don't show the interrupt if the stream is loading
+ if (isLoading)
+ return undefined;
+ const interrupts = threadHead?.tasks?.at(-1)?.interrupts;
+ if (interrupts == null || interrupts.length === 0) {
+ // ENHANCED: Clear cache when no interrupt is active
+ if (streamValuesCacheRef.current) {
+ console.log("🔍 No interrupt active - clearing stream values cache");
+ streamValuesCacheRef.current = null;
+ }
+ // check if there's a next task present
+ const next = threadHead?.next ?? [];
+ if (!next.length || error != null)
+ return undefined;
+ return { when: "breakpoint" };
+ }
+ // Return only the current interrupt
+ return interrupts.at(-1);
+ },
+ get messages() {
+ trackStreamMode("messages-tuple", "values");
+ const finalValues = streamValues ?? streamValuesCacheRef.current ?? historyValues;
+ return getMessages(finalValues);
+ },
+ getMessagesMetadata(message, index) {
+ trackStreamMode("messages-tuple", "values");
+ return messageMetadata?.find((m) => m.messageId === (message.id ?? index));
+ },
+ };
+}
\ No newline at end of file
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
index a5ef1935..90a78293 100644
--- a/src/lib/utils.ts
+++ b/src/lib/utils.ts
@@ -4,3 +4,125 @@ import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
+
+// Location-related types
+export interface LocationData {
+ latitude: number;
+ longitude: number;
+ accuracy: number;
+ timestamp: number;
+}
+
+export interface LocationError {
+ code: number;
+ message: string;
+}
+
+export interface LocationResult {
+ success: boolean;
+ data?: LocationData;
+ error?: LocationError;
+}
+
+/**
+ * Reusable function to get user's current location
+ * Handles permission requests and location fetching
+ * @param options - Geolocation options (optional)
+ * @returns Promise - Location data or error
+ */
+export async function getUserLocation(
+ options: PositionOptions = {
+ enableHighAccuracy: true,
+ timeout: 10000,
+ maximumAge: 300000, // 5 minutes
+ },
+): Promise {
+ // Check if geolocation is supported
+ if (!navigator.geolocation) {
+ return {
+ success: false,
+ error: {
+ code: -1,
+ message: "Geolocation is not supported by this browser",
+ },
+ };
+ }
+
+ try {
+ // Check current permission status
+ const permission = await navigator.permissions.query({
+ name: "geolocation",
+ });
+
+ console.log(`Geolocation permission status: ${permission.state}`);
+
+ // If permission is denied, return error
+ if (permission.state === "denied") {
+ return {
+ success: false,
+ error: {
+ code: 1,
+ message:
+ "Location access denied. Please enable location permissions in your browser settings.",
+ },
+ };
+ }
+
+ // Get current position
+ const position = await new Promise(
+ (resolve, reject) => {
+ navigator.geolocation.getCurrentPosition(resolve, reject, options);
+ },
+ );
+
+ const locationData: LocationData = {
+ latitude: position.coords.latitude,
+ longitude: position.coords.longitude,
+ accuracy: position.coords.accuracy,
+ timestamp: position.timestamp,
+ };
+
+ console.log("User location obtained:", locationData);
+
+ return {
+ success: true,
+ data: locationData,
+ };
+ } catch (error: any) {
+ let errorMessage = "Failed to get location";
+ let errorCode = 0;
+
+ if (error.code) {
+ switch (error.code) {
+ case 1: // PERMISSION_DENIED
+ errorMessage = "Location access denied by user";
+ errorCode = 1;
+ break;
+ case 2: // POSITION_UNAVAILABLE
+ errorMessage = "Location information unavailable";
+ errorCode = 2;
+ break;
+ case 3: // TIMEOUT
+ errorMessage = "Location request timed out";
+ errorCode = 3;
+ break;
+ default:
+ errorMessage = error.message || "Unknown location error";
+ errorCode = error.code;
+ }
+ }
+
+ console.error("Location error:", {
+ code: errorCode,
+ message: errorMessage,
+ });
+
+ return {
+ success: false,
+ error: {
+ code: errorCode,
+ message: errorMessage,
+ },
+ };
+ }
+}
diff --git a/src/providers/InterruptPersistenceContext.tsx b/src/providers/InterruptPersistenceContext.tsx
new file mode 100644
index 00000000..340da5ee
--- /dev/null
+++ b/src/providers/InterruptPersistenceContext.tsx
@@ -0,0 +1,33 @@
+import React, { createContext, useContext, ReactNode } from "react";
+import {
+ useInterruptPersistence,
+ InterruptPersistenceContextType,
+} from "@/hooks/use-interrupt-persistence";
+
+const InterruptPersistenceContext = createContext<
+ InterruptPersistenceContextType | undefined
+>(undefined);
+
+export function InterruptPersistenceProvider({
+ children,
+}: {
+ children: ReactNode;
+}) {
+ const interruptPersistence = useInterruptPersistence();
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useInterruptPersistenceContext(): InterruptPersistenceContextType {
+ const context = useContext(InterruptPersistenceContext);
+ if (context === undefined) {
+ throw new Error(
+ "useInterruptPersistenceContext must be used within an InterruptPersistenceProvider",
+ );
+ }
+ return context;
+}
diff --git a/src/providers/ItineraryWidgetContext.tsx b/src/providers/ItineraryWidgetContext.tsx
new file mode 100644
index 00000000..d01e39e2
--- /dev/null
+++ b/src/providers/ItineraryWidgetContext.tsx
@@ -0,0 +1,60 @@
+"use client";
+
+import React, { createContext, useContext, useState, ReactNode } from "react";
+
+interface ItineraryWidget {
+ id: string;
+ component: React.ReactNode;
+ timestamp: number;
+}
+
+interface ItineraryWidgetContextType {
+ widgets: ItineraryWidget[];
+ addWidget: (id: string, component: React.ReactNode) => void;
+ removeWidget: (id: string) => void;
+ clearWidgets: () => void;
+}
+
+const ItineraryWidgetContext = createContext(undefined);
+
+export function ItineraryWidgetProvider({ children }: { children: ReactNode }) {
+ const [widgets, setWidgets] = useState([]);
+
+ const addWidget = (id: string, component: React.ReactNode) => {
+ setWidgets(prev => {
+ // Remove existing widget with same id if it exists
+ const filtered = prev.filter(widget => widget.id !== id);
+ // Add new widget
+ return [...filtered, { id, component, timestamp: Date.now() }];
+ });
+ };
+
+ const removeWidget = (id: string) => {
+ setWidgets(prev => prev.filter(widget => widget.id !== id));
+ };
+
+ const clearWidgets = () => {
+ setWidgets([]);
+ };
+
+ const value: ItineraryWidgetContextType = {
+ widgets,
+ addWidget,
+ removeWidget,
+ clearWidgets,
+ };
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useItineraryWidget() {
+ const context = useContext(ItineraryWidgetContext);
+ if (context === undefined) {
+ throw new Error("useItineraryWidget must be used within an ItineraryWidgetProvider");
+ }
+ return context;
+}
diff --git a/src/providers/NonAgentFlowContext.tsx b/src/providers/NonAgentFlowContext.tsx
new file mode 100644
index 00000000..e0e9db19
--- /dev/null
+++ b/src/providers/NonAgentFlowContext.tsx
@@ -0,0 +1,75 @@
+"use client";
+
+import React, { createContext, useContext, useState, ReactNode } from "react";
+
+interface NonAgentFlowData {
+ tripId: string;
+ flightItinerary?: {
+ userContext: {
+ userDetails: any;
+ userId: string;
+ };
+ selectionContext: {
+ selectedFlightOffers: any[];
+ };
+ };
+ itinId?: string;
+}
+
+interface NonAgentFlowContextType {
+ isWidgetOpen: boolean;
+ widgetData: NonAgentFlowData | null;
+ openWidget: (data: NonAgentFlowData) => void;
+ closeWidget: () => void;
+ shouldShowReopenButton: boolean;
+ setShouldShowReopenButton: (show: boolean) => void;
+}
+
+const NonAgentFlowContext = createContext(
+ undefined,
+);
+
+export function NonAgentFlowProvider({ children }: { children: ReactNode }) {
+ const [isWidgetOpen, setIsWidgetOpen] = useState(false);
+ const [widgetData, setWidgetData] = useState(null);
+ const [shouldShowReopenButton, setShouldShowReopenButton] = useState(false);
+
+ const openWidget = (data: NonAgentFlowData) => {
+ setWidgetData(data);
+ setIsWidgetOpen(true);
+ setShouldShowReopenButton(false);
+ };
+
+ const closeWidget = () => {
+ setIsWidgetOpen(false);
+ // Only show reopen button if we have widget data
+ if (widgetData) {
+ setShouldShowReopenButton(true);
+ }
+ };
+
+ const value: NonAgentFlowContextType = {
+ isWidgetOpen,
+ widgetData,
+ openWidget,
+ closeWidget,
+ shouldShowReopenButton,
+ setShouldShowReopenButton,
+ };
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useNonAgentFlow() {
+ const context = useContext(NonAgentFlowContext);
+ if (context === undefined) {
+ throw new Error(
+ "useNonAgentFlow must be used within a NonAgentFlowProvider",
+ );
+ }
+ return context;
+}
diff --git a/src/providers/Stream.tsx b/src/providers/Stream.tsx
index b6d0c091..d3b88722 100644
--- a/src/providers/Stream.tsx
+++ b/src/providers/Stream.tsx
@@ -4,40 +4,31 @@ import React, {
ReactNode,
useState,
useEffect,
+ useRef,
} from "react";
-import { useStream } from "@langchain/langgraph-sdk/react";
+import { useStream } from "@/lib/langgraph-index";
import { type Message } from "@langchain/langgraph-sdk";
-import {
- uiMessageReducer,
- isUIMessage,
- isRemoveUIMessage,
- type UIMessage,
- type RemoveUIMessage,
-} from "@langchain/langgraph-sdk/react-ui";
+
import { useQueryState } from "nuqs";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
-import { LangGraphLogoSVG } from "@/components/icons/langgraph";
+import { FlyoLogoSVG } from "@/components/icons/langgraph";
import { Label } from "@/components/ui/label";
import { ArrowRight } from "lucide-react";
import { PasswordInput } from "@/components/ui/password-input";
import { getApiKey } from "@/lib/api-key";
import { useThreads } from "./Thread";
import { toast } from "sonner";
+import { storeThread } from "@/utils/thread-storage";
+import { InterruptPersistenceProvider } from "./InterruptPersistenceContext";
-export type StateType = { messages: Message[]; ui?: UIMessage[] };
+export type StateType = {
+ messages: Message[];
+ ui?: any[];
+ itinerary: any;
+};
-const useTypedStream = useStream<
- StateType,
- {
- UpdateType: {
- messages?: Message[] | Message | string;
- ui?: (UIMessage | RemoveUIMessage)[] | UIMessage | RemoveUIMessage;
- context?: Record;
- };
- CustomEventType: UIMessage | RemoveUIMessage;
- }
->;
+const useTypedStream = useStream;
type StreamContextType = ReturnType;
const StreamContext = createContext(undefined);
@@ -79,24 +70,37 @@ const StreamSession = ({
}) => {
const [threadId, setThreadId] = useQueryState("threadId");
const { getThreads, setThreads } = useThreads();
+
const streamValue = useTypedStream({
apiUrl,
apiKey: apiKey ?? undefined,
assistantId,
threadId: threadId ?? null,
- onCustomEvent: (event, options) => {
- if (isUIMessage(event) || isRemoveUIMessage(event)) {
- options.mutate((prev) => {
- const ui = uiMessageReducer(prev.ui ?? [], event);
- return { ...prev, ui };
- });
- }
- },
- onThreadId: (id) => {
+ onThreadId: (id: string) => {
+ console.log("New thread ID created:", id);
setThreadId(id);
+
+ // Store new thread in local storage immediately
+ storeThread({
+ thread_id: id,
+ assistant_id: assistantId,
+ title: "New Chat",
+ messages_count: 0,
+ });
+
// Refetch threads list when thread ID changes.
// Wait for some seconds before fetching so we're able to get the new thread that was created.
- sleep().then(() => getThreads().then(setThreads).catch(console.error));
+ sleep().then(() => {
+ console.log("Refetching threads after new thread creation...");
+ getThreads()
+ .then((threads) => {
+ console.log(`Fetched ${threads.length} threads after creation`);
+ setThreads(threads);
+ })
+ .catch((error) => {
+ console.error("Failed to refetch threads:", error);
+ });
+ });
},
});
@@ -119,9 +123,11 @@ const StreamSession = ({
}, [apiKey, apiUrl]);
return (
-
- {children}
-
+
+
+ {children}
+
+
);
};
@@ -167,13 +173,10 @@ export const StreamProvider: React.FC<{ children: ReactNode }> = ({
-
-
- Agent Chat
-
+
- Welcome to Agent Chat! Before you get started, you need to enter
+ Welcome to Flyo Chat! Before you get started, you need to enter
the URL of the deployment and the assistant / graph ID.
@@ -234,9 +237,9 @@ export const StreamProvider: React.FC<{ children: ReactNode }> = ({
LangSmith API Key
This is NOT required if using a local LangGraph
- server. This value is stored in your browser's local storage and
- is only used to authenticate requests sent to your LangGraph
- server.
+ server. This value is stored in your browser's local
+ storage and is only used to authenticate requests sent to your
+ LangGraph server.
void;
+ switchToItinerary: () => void;
+ switchToChat: () => void;
+}
+
+const TabContext = createContext(undefined);
+
+export function TabProvider({ children }: { children: ReactNode }) {
+ const [activeTab, setActiveTab] = useState("Chat");
+
+ const switchToItinerary = () => setActiveTab("Itinerary");
+ const switchToChat = () => setActiveTab("Chat");
+
+ const value: TabContextType = {
+ activeTab,
+ setActiveTab,
+ switchToItinerary,
+ switchToChat,
+ };
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useTabContext() {
+ const context = useContext(TabContext);
+ if (context === undefined) {
+ throw new Error("useTabContext must be used within a TabProvider");
+ }
+ return context;
+}
diff --git a/src/providers/Thread.tsx b/src/providers/Thread.tsx
index 759853f4..2058bca9 100644
--- a/src/providers/Thread.tsx
+++ b/src/providers/Thread.tsx
@@ -12,6 +12,11 @@ import {
SetStateAction,
} from "react";
import { createClient } from "./client";
+import {
+ getStoredThreads,
+ convertStoredThreadsToThreads,
+ StoredThread
+} from "@/utils/thread-storage";
interface ThreadContextType {
getThreads: () => Promise;
@@ -41,16 +46,51 @@ export function ThreadProvider({ children }: { children: ReactNode }) {
const getThreads = useCallback(async (): Promise => {
if (!apiUrl || !assistantId) return [];
- const client = createClient(apiUrl, getApiKey() ?? undefined);
- const threads = await client.threads.search({
- metadata: {
- ...getThreadSearchMetadata(assistantId),
- },
- limit: 100,
- });
+ try {
+ const client = createClient(apiUrl, getApiKey() ?? undefined);
+
+ // Try multiple search strategies to find threads
+ let threads: Thread[] = [];
+
+ // Strategy 1: Search with metadata
+ try {
+ threads = await client.threads.search({
+ metadata: {
+ ...getThreadSearchMetadata(assistantId),
+ },
+ limit: 100,
+ });
+ console.log(`Found ${threads.length} threads with metadata search`);
+ } catch (error) {
+ console.warn("Metadata search failed:", error);
+ }
+
+ // Strategy 2: If no threads found, try without metadata (fallback)
+ if (threads.length === 0) {
+ try {
+ threads = await client.threads.search({
+ limit: 100,
+ });
+ console.log(`Found ${threads.length} threads with general search`);
+ } catch (error) {
+ console.warn("General search failed:", error);
+ }
+ }
+
+ // Strategy 3: If server search fails, use local storage as fallback
+ if (threads.length === 0) {
+ console.log("Using local storage fallback for threads");
+ const storedThreads = getStoredThreads();
+ threads = convertStoredThreadsToThreads(storedThreads);
+ console.log(`Found ${threads.length} threads from local storage`);
+ }
- return threads;
+ return threads;
+ } catch (error) {
+ console.error("Failed to fetch threads:", error);
+ return [];
+ }
}, [apiUrl, assistantId]);
const value = {
diff --git a/src/review.json b/src/review.json
new file mode 100644
index 00000000..96626e60
--- /dev/null
+++ b/src/review.json
@@ -0,0 +1,220 @@
+{
+ "value": {
+ "type": "widget",
+ "widget": {
+ "type": "TravelerDetailsWidget",
+ "args": {
+ "flightItinerary": {
+ "userContext": {
+ "userDetails": {
+ "travellerId": 27912,
+ "firstName": "MITESH JAGDISH",
+ "lastName": "BALDHA",
+ "dateOfBirth": "1989-01-25",
+ "gender": "Male",
+ "nationality": "Indian",
+ "numberOfFlights": 57,
+ "email": "ceo@explerainc.com",
+ "phone": [
+ {
+ "countryCode": "",
+ "number": "+919737332299"
+ }
+ ],
+ "isPrimaryTraveller": true,
+ "documents": [
+ {
+ "documentId": 55,
+ "documentType": "passport",
+ "documentNumber": "Z6956116",
+ "nationality": "India",
+ "expiryDate": "2033-03-01",
+ "issuingDate": "2017-05-31",
+ "issuingCountry": "India",
+ "documentUrl": "https://hh-boarding-pass.s3.ap-south-1.amazonaws.com/user-documents/12118_1753255060955_4_PASSPORT___MITESH_BALDHA_2.jpg"
+ }
+ ]
+ },
+ "savedTravellers": [
+ {
+ "travellerId": 27912,
+ "firstName": "MITESH JAGDISH",
+ "lastName": "BALDHA",
+ "dateOfBirth": "1989-01-25",
+ "gender": "Male",
+ "nationality": "Indian",
+ "numberOfFlights": 57,
+ "email": "ceo@explerainc.com",
+ "phone": [
+ {
+ "countryCode": "",
+ "number": "+919737332299"
+ }
+ ],
+ "isPrimaryTraveller": true,
+ "documents": [
+ {
+ "documentId": 55,
+ "documentType": "passport",
+ "documentNumber": "Z6956116",
+ "nationality": "India",
+ "expiryDate": "2033-03-01",
+ "issuingDate": "2017-05-31",
+ "issuingCountry": "India",
+ "documentUrl": "https://hh-boarding-pass.s3.ap-south-1.amazonaws.com/user-documents/12118_1753255060955_4_PASSPORT___MITESH_BALDHA_2.jpg"
+ }
+ ]
+ },
+ {
+ "travellerId": 27896,
+ "firstName": "SANDEEP VITHALBHAI",
+ "lastName": "SOJITRA",
+ "dateOfBirth": "",
+ "gender": "Male",
+ "nationality": "Indian",
+ "numberOfFlights": 19,
+ "email": "explera.surat@gmail.com",
+ "phone": [
+ {
+ "countryCode": "",
+ "number": "+919624332299"
+ }
+ ],
+ "isPrimaryTraveller": false,
+ "documents": [
+ {
+ "documentId": 74,
+ "documentType": "passport",
+ "documentNumber": "Z3690598",
+ "nationality": "India",
+ "expiryDate": "2027-02-07",
+ "issuingDate": "2017-02-08",
+ "issuingCountry": "Surat, India",
+ "documentUrl": "https://hh-boarding-pass.s3.ap-south-1.amazonaws.com/user-documents/12118_1753603930881_Screenshot_2025_07_27_at_13.41.58.png"
+ }
+ ]
+ },
+ {
+ "travellerId": 27937,
+ "firstName": "LABHUBEN MANUBHAI",
+ "lastName": "MANGUKIYA",
+ "dateOfBirth": "1956-04-20",
+ "gender": "Female",
+ "nationality": "Indian",
+ "numberOfFlights": 18,
+ "email": "explera.surat@gmail.com",
+ "phone": [
+ {
+ "countryCode": "",
+ "number": "+919624332299"
+ }
+ ],
+ "isPrimaryTraveller": false,
+ "documents": [
+ {
+ "documentId": 68,
+ "documentType": "passport",
+ "documentNumber": "Z4757908",
+ "nationality": "India",
+ "expiryDate": "2028-04-17",
+ "issuingDate": "2018-04-18",
+ "issuingCountry": "India",
+ "documentUrl": "https://hh-boarding-pass.s3.ap-south-1.amazonaws.com/user-documents/12118_1753266660047_LABHUBEN_MANGUKIYA_Passport_Fornt.jpg"
+ }
+ ]
+ },
+ {
+ "travellerId": 27902,
+ "firstName": "kedkanok",
+ "lastName": "saithongtae",
+ "dateOfBirth": "",
+ "gender": "",
+ "nationality": "N/A",
+ "numberOfFlights": 16,
+ "email": "jdhjks@gmail.comd",
+ "phone": [
+ {
+ "countryCode": "",
+ "number": ""
+ }
+ ],
+ "isPrimaryTraveller": false,
+ "documents": []
+ }
+ ]
+ },
+ "selectionContext": {
+ "selectedFlightOffers": [
+ {
+ "flightOfferId": "1",
+ "totalEmission": 0,
+ "totalEmissionUnit": "Kg",
+ "currency": "INR",
+ "totalAmount": 5015,
+ "duration": "PT2H55M",
+ "departure": {
+ "date": "2025-08-24T10:25:00",
+ "airportIata": "BLR",
+ "airportName": "",
+ "cityCode": "BLR",
+ "countryCode": "IN"
+ },
+ "arrival": {
+ "date": "2025-08-24T13:20:00",
+ "airportIata": "DEL",
+ "airportName": "",
+ "cityCode": "DEL",
+ "countryCode": "IN"
+ },
+ "segments": [
+ {
+ "id": "98",
+ "airlineIata": "AI",
+ "flightNumber": "9478",
+ "duration": "PT2H55M",
+ "aircraftType": "BOEING 737 ALL SERIES PASSENGER",
+ "airlineName": "",
+ "departure": {
+ "date": "2025-08-24T10:25:00",
+ "airportIata": "BLR",
+ "airportName": "",
+ "cityCode": "BLR",
+ "countryCode": "IN"
+ },
+ "arrival": {
+ "date": "2025-08-24T13:20:00",
+ "airportIata": "DEL",
+ "airportName": "",
+ "cityCode": "DEL",
+ "countryCode": "IN"
+ }
+ }
+ ],
+ "offerRules": {
+ "isRefundable": false
+ },
+ "rankingScore": 0,
+ "pros": [],
+ "cons": [],
+ "tags": [
+ "cheapest",
+ "recommended"
+ ]
+ }
+ ]
+ }
+ },
+ "bookingRequirements": {
+ "emailAddressRequired": true,
+ "invoiceAddressRequired": false,
+ "mailingAddressRequired": false,
+ "phoneCountryCodeRequired": false,
+ "mobilePhoneNumberRequired": true,
+ "phoneNumberRequired": false,
+ "postalCodeRequired": false,
+ "travelerRequirements": null
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/services/airportService.ts b/src/services/airportService.ts
new file mode 100644
index 00000000..5390939f
--- /dev/null
+++ b/src/services/airportService.ts
@@ -0,0 +1,45 @@
+interface AirportApiResponse {
+ k: string; // Airport code
+ v: string; // Full airport description
+}
+
+export async function searchAirports(
+ query: string,
+): Promise {
+ if (!query || query.trim().length === 0) {
+ return [];
+ }
+
+ const trimmedQuery = query.trim();
+
+ // First try direct API call
+ try {
+ const directUrl = `https://www.cleartrip.com/places/airports/search?string=${encodeURIComponent(trimmedQuery)}`;
+ const response = await fetch(directUrl);
+
+ if (response.ok) {
+ const data: AirportApiResponse[] = await response.json();
+ return Array.isArray(data) ? data : [];
+ }
+ } catch (directError) {
+ console.log("Direct API call failed, trying proxy:", directError);
+ }
+
+ // Fallback to proxy API if direct call fails (likely due to CORS)
+ try {
+ const proxyUrl = `/api/airports/search?string=${encodeURIComponent(trimmedQuery)}`;
+ const response = await fetch(proxyUrl);
+
+ if (!response.ok) {
+ throw new Error(
+ `Proxy API failed: ${response.status} ${response.statusText}`,
+ );
+ }
+
+ const data: AirportApiResponse[] = await response.json();
+ return Array.isArray(data) ? data : [];
+ } catch (proxyError) {
+ console.error("Both direct and proxy API calls failed:", proxyError);
+ return [];
+ }
+}
diff --git a/src/services/authService.ts b/src/services/authService.ts
new file mode 100644
index 00000000..53e97fcb
--- /dev/null
+++ b/src/services/authService.ts
@@ -0,0 +1,164 @@
+export interface AuthTokens {
+ accessToken: string;
+ refreshToken: string;
+ idToken: string;
+}
+
+export interface LoginResponse {
+ jwtToken: string;
+ userType: string;
+}
+
+/**
+ * Login with Google OAuth tokens
+ */
+export const loginWithGoogle = async (
+ tokens: AuthTokens,
+): Promise => {
+ try {
+ console.log("Login request tokens:", tokens);
+ console.log(
+ "Login request URL:",
+ `https://prod-api.flyo.ai/core/v2/websiteLogin`,
+ );
+
+ const response = await fetch(
+ `https://prod-api.flyo.ai/core/v2/websiteLogin`,
+ {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ accessToken: tokens.accessToken,
+ refreshToken: tokens.refreshToken,
+ idToken: tokens.idToken,
+ }),
+ },
+ );
+
+ if (!response.ok) {
+ const errorData = await response.json().catch(() => ({}));
+ throw new Error(
+ `Login failed: ${errorData.message || response.statusText}`,
+ );
+ }
+
+ const loginResponse: LoginResponse = await response.json();
+ return loginResponse;
+ } catch (error) {
+ console.error("Error in loginWithGoogle:", error);
+ throw error;
+ }
+};
+
+/**
+ * Check if user is authenticated by checking JWT token in localStorage
+ */
+export const isAuthenticated = (): boolean => {
+ try {
+ if (typeof window === "undefined") return false;
+ const token = window.localStorage.getItem("flyo:jwt:token");
+ return !!token;
+ } catch {
+ return false;
+ }
+};
+
+/**
+ * Store JWT token in localStorage with validation
+ */
+export const storeJwtTokenWithValidation = (
+ jwtToken: string,
+ userType: string,
+): void => {
+ try {
+ if (!jwtToken) {
+ throw new Error("JWT token is required");
+ }
+
+ // Store the JWT token
+ window.localStorage.setItem("flyo:jwt:token", jwtToken);
+ window.localStorage.setItem("flyo:user:type", userType);
+
+ console.log("JWT token stored successfully");
+ } catch (error) {
+ console.error("Error storing JWT token:", error);
+ throw error;
+ }
+};
+
+/**
+ * Get stored JWT token
+ */
+export const getJwtToken = (): string | null => {
+ try {
+ if (typeof window === "undefined") return null;
+ return window.localStorage.getItem("flyo:jwt:token");
+ } catch {
+ return null;
+ }
+};
+
+/**
+ * Clear authentication data
+ */
+export const clearAuthData = (): void => {
+ try {
+ if (typeof window === "undefined") return;
+ window.localStorage.removeItem("flyo:jwt:token");
+ window.localStorage.removeItem("flyo:user:type");
+ } catch (error) {
+ console.error("Error clearing auth data:", error);
+ }
+};
+
+/**
+ * Logout user and redirect to login page
+ */
+export const logout = (): void => {
+ clearAuthData();
+ if (typeof window !== "undefined") {
+ window.location.href = "/login";
+ }
+};
+
+export const decodeJwtPayload = (token: string): any => {
+ try {
+ // Split the token into parts
+ const parts = token.split(".");
+ if (parts.length !== 3) {
+ throw new Error("Invalid JWT token format");
+ }
+
+ // Decode the payload (second part)
+ const payload = parts[1];
+
+ // Add padding if needed for base64 decoding
+ const paddedPayload = payload + "=".repeat((4 - (payload.length % 4)) % 4);
+
+ // Decode base64url to string
+ const decodedPayload = atob(
+ paddedPayload.replace(/-/g, "+").replace(/_/g, "/"),
+ );
+
+ // Parse JSON
+ return JSON.parse(decodedPayload);
+ } catch (err) {
+ console.error("Error decoding JWT payload:", err);
+ return null;
+ }
+};
+
+export const GetUserId = (jwtToken: string): string | number => {
+ try {
+ const decoded = decodeJwtPayload(jwtToken);
+ if (decoded && decoded.userId) {
+ return decoded.userId;
+ }
+ return "";
+ } catch (err) {
+ console.error("Error getting user ID from JWT:", err);
+ return "";
+ }
+};
diff --git a/src/services/paymentService.ts b/src/services/paymentService.ts
new file mode 100644
index 00000000..6473c96b
--- /dev/null
+++ b/src/services/paymentService.ts
@@ -0,0 +1,264 @@
+import { getJwtToken } from "./authService";
+
+// Types for the payment APIs
+export interface PrepaymentRequest {
+ tripId: string;
+}
+
+export interface PrepaymentResponse {
+ success: boolean;
+ message: string;
+ data: {
+ transaction: {
+ transaction_id: string;
+ reference_id: string;
+ razorpay_order_id: string;
+ amount: number;
+ currency: string;
+ key: string;
+ name: string;
+ description: string;
+ };
+ };
+}
+
+export interface TransactionVerifyRequest {
+ tripId: string;
+ razorpay_payment_id: string;
+ razorpay_order_id: string;
+ razorpay_signature: string;
+ transaction_id: string;
+}
+
+export interface TransactionVerifyResponse {
+ success: boolean;
+ data: {
+ paymentStatus: "SUCCESS" | "FAILED" | "PENDING";
+ bookingStatus: "SUCCESS" | "FAILED" | "PENDING";
+ bookingError?: string;
+ };
+}
+
+export interface PaymentError {
+ message: string;
+ code?: string;
+ status?: number;
+}
+
+// Configuration
+const API_BASE_URL =
+ process.env.NEXT_PUBLIC_API_BASE_URL || "https://prod-api.flyo.ai";
+const API_VERSION = "v1";
+
+/**
+ * Get authorization header with JWT token
+ */
+const getAuthHeaders = (): HeadersInit => {
+ const token = getJwtToken();
+ if (!token) {
+ throw new Error("No authentication token found");
+ }
+
+ return {
+ Authorization: `Bearer ${token}`,
+ "Content-Type": "application/json",
+ };
+};
+
+/**
+ * Generic API request handler with error handling
+ */
+async function makeApiRequest(
+ endpoint: string,
+ options: RequestInit = {},
+): Promise {
+ try {
+ const url = `${API_BASE_URL}/core/${API_VERSION}${endpoint}`;
+ const headers = getAuthHeaders();
+
+ const response = await fetch(url, {
+ ...options,
+ headers: {
+ ...headers,
+ ...options.headers,
+ },
+ });
+
+ if (!response.ok) {
+ const errorData = await response.json().catch(() => ({}));
+ throw new Error(
+ errorData.message || `HTTP ${response.status}: ${response.statusText}`,
+ );
+ }
+
+ const data: T = await response.json();
+ return data;
+ } catch (error) {
+ console.error(`API request failed for ${endpoint}:`, error);
+ throw error;
+ }
+}
+
+/**
+ * Execute prepayment to get Razorpay payment data
+ * @param tripId - The trip ID for which payment is being initiated
+ * @returns Promise - Payment gateway configuration
+ */
+export const executePrepayment = async (
+ tripId: string,
+): Promise => {
+ if (!tripId) {
+ throw new Error("Trip ID is required");
+ }
+
+ try {
+ const response = await makeApiRequest(
+ `/prePayment/executePrepayment/${tripId}`,
+ {
+ method: "POST",
+ },
+ );
+
+ if (!response.success) {
+ throw new Error(response.message || "Prepayment execution failed");
+ }
+
+ return response;
+ } catch (error) {
+ console.error("Execute prepayment failed:", error);
+ throw new Error(
+ error instanceof Error ? error.message : "Failed to execute prepayment",
+ );
+ }
+};
+
+/**
+ * Verify transaction and execute booking
+ * @param request - Transaction verification request data
+ * @returns Promise - Payment and booking status
+ */
+export const verifyTransaction = async (
+ request: TransactionVerifyRequest,
+): Promise => {
+ const { tripId, ...verificationData } = request;
+
+ if (!tripId) {
+ throw new Error("Trip ID is required");
+ }
+
+ if (
+ !verificationData.razorpay_payment_id ||
+ !verificationData.razorpay_order_id ||
+ !verificationData.razorpay_signature ||
+ !verificationData.transaction_id
+ ) {
+ throw new Error("All payment verification parameters are required");
+ }
+
+ try {
+ const response = await makeApiRequest(
+ `/transactions/verify/${tripId}`,
+ {
+ method: "POST",
+ body: JSON.stringify(verificationData),
+ },
+ );
+
+ if (!response.success) {
+ throw new Error("Transaction verification failed");
+ }
+
+ return response;
+ } catch (error) {
+ console.error("Transaction verification failed:", error);
+ throw new Error(
+ error instanceof Error ? error.message : "Failed to verify transaction",
+ );
+ }
+};
+
+/**
+ * Complete payment flow: execute prepayment and handle verification
+ * @param tripId - The trip ID
+ * @param verificationData - Payment verification data from Razorpay
+ * @returns Promise - Final payment and booking status
+ */
+export const completePaymentFlow = async (
+ tripId: string,
+ verificationData: {
+ razorpay_payment_id: string;
+ razorpay_order_id: string;
+ razorpay_signature: string;
+ transaction_id: string;
+ },
+): Promise => {
+ try {
+ // First execute prepayment to get transaction data
+ const prepaymentResponse = await executePrepayment(tripId);
+
+ // Then verify the transaction
+ const verifyResponse = await verifyTransaction({
+ tripId,
+ ...verificationData,
+ });
+
+ return verifyResponse;
+ } catch (error) {
+ console.error("Complete payment flow failed:", error);
+ throw error;
+ }
+};
+
+/**
+ * Get payment status description
+ */
+export const getPaymentStatusDescription = (status: string): string => {
+ switch (status) {
+ case "SUCCESS":
+ return "Payment completed successfully";
+ case "FAILED":
+ return "Payment failed";
+ case "PENDING":
+ return "Payment is being processed";
+ default:
+ return "Unknown payment status";
+ }
+};
+
+/**
+ * Get booking status description
+ */
+export const getBookingStatusDescription = (status: string): string => {
+ switch (status) {
+ case "SUCCESS":
+ return "Booking confirmed successfully";
+ case "FAILED":
+ return "Booking failed";
+ case "PENDING":
+ return "Booking is being processed";
+ default:
+ return "Unknown booking status";
+ }
+};
+
+/**
+ * Check if payment and booking are both successful
+ */
+export const isPaymentAndBookingSuccessful = (
+ response: TransactionVerifyResponse,
+): boolean => {
+ return (
+ response.data.paymentStatus === "SUCCESS" &&
+ response.data.bookingStatus === "SUCCESS"
+ );
+};
+
+/**
+ * Format amount for display
+ */
+export const formatAmount = (amount: number, currency: string): string => {
+ return new Intl.NumberFormat("en-IN", {
+ style: "currency",
+ currency: currency,
+ }).format(amount);
+};
diff --git a/src/types/flightSearchCriteria.ts b/src/types/flightSearchCriteria.ts
new file mode 100644
index 00000000..a2cf2b3d
--- /dev/null
+++ b/src/types/flightSearchCriteria.ts
@@ -0,0 +1,79 @@
+import { z } from "zod";
+
+export const FlightSearchCriteriaObject = z.object({
+ departureDate: z
+ .string()
+ .nullable()
+ .describe("The departure date of the flight, in YYYY-MM-DD format"),
+ originAirport: z
+ .string()
+ .min(3)
+ .max(3)
+ .nullable()
+ .describe("The origin airport of the flight, in IATA code"),
+ destinationAirport: z
+ .string()
+ .min(3)
+ .max(3)
+ .nullable()
+ .describe("The destination airport of the flight, in IATA code"),
+ adults: z
+ .number()
+ .describe("The number of adult passengers, age greater than 18"),
+ children: z
+ .number()
+ .describe(
+ "The number of children passengers, age less than 18 but greater than 2",
+ ),
+ infants: z
+ .number()
+ .describe("The number of infants passengers, age less than 2"),
+ class: z
+ .enum(["economy", "business", "first"])
+ .describe("The class of the flight"),
+ returnDate: z
+ .string()
+ .nullable()
+ .describe("The return date of the flight, in YYYY-MM-DD format"),
+ isRoundTrip: z
+ .boolean()
+ .describe("Whether the flight search is a round trip"),
+ passengers: z
+ .array(
+ z.object({
+ firstName: z
+ .string()
+ .nullable()
+ .describe("The first name of the passenger"),
+ lastName: z
+ .string()
+ .nullable()
+ .describe("The last name of the passenger"),
+ dateOfBirth: z
+ .string()
+ .nullable()
+ .describe("The date of birth of the passenger, in YYYY-MM-DD format"),
+ gender: z
+ .enum(["male", "female"])
+ .nullable()
+ .describe("The gender of the passenger"),
+ nationality: z
+ .string()
+ .nullable()
+ .describe("The nationality of the passenger"),
+ passportNumber: z
+ .string()
+ .nullable()
+ .describe("The passport number of the passenger"),
+ passportExpiryDate: z
+ .string()
+ .nullable()
+ .describe(
+ "The passport expiry date of the passenger, in YYYY-MM-DD format",
+ ),
+ }),
+ )
+ .describe("The passengers mentioned by the user"),
+});
+
+export type FlightSearchCriteria = z.infer;
diff --git a/src/types/itineraryl.ts b/src/types/itineraryl.ts
new file mode 100644
index 00000000..e597361c
--- /dev/null
+++ b/src/types/itineraryl.ts
@@ -0,0 +1,112 @@
+import z from "zod";
+
+export const PriceContextObject = z.object({
+ totalPrice: z.number().describe('The total price amount of this itinerary item'),
+ currency: z.string().min(3).max(3).describe('The currency of the price'),
+});
+
+export const CoordinatesObject = z.object({
+ name: z.string().describe('The name of the coordinates'),
+ latitude: z.number().describe('The latitude of the coordinates'),
+ longitude: z.number().describe('The longitude of the coordinates'),
+});
+export type Coordinates = z.infer;
+export type FlightItineraryItem = z.infer;
+export type PriceContext = z.infer;
+const DocumentObject = z.object({
+ documentId: z.string().describe('The id of the document'),
+ documentType: z.enum(['passport', 'nationalId', 'driverLicense', 'visa', 'other']).describe('The type of document'),
+ documentNumber: z.string().describe('The number of the document'),
+ nationality: z.string().describe('The nationality of the traveller'),
+ expiryDate: z.string().describe('The expiry date of the document, in YYYY-MM-DD format'),
+ issuingDate: z.string().describe('The issuing date of the document, in YYYY-MM-DD format'),
+ issuingCountry: z.string().describe('The country of issuance of the document'),
+ documentUrl: z.string().describe('The url of the document'),
+});
+export const TravellerObject = z.object({
+ travellerId: z.number().describe('The traveller id'),
+ firstName: z.string().describe('The first name of the traveller'),
+ lastName: z.string().describe('The last name of the traveller'),
+ dateOfBirth: z.string().describe('The date of birth of the traveller, in YYYY-MM-DD format'),
+ gender: z.enum(['male', 'female']).describe('The gender of the traveller'),
+ nationality: z.string().describe('The nationality of the traveller'),
+ numberOfFlights: z.number().describe('The number of flights the traveller has taken'),
+ email: z.string().describe('The email of the traveller'),
+ phone: z.array(
+ z.object({
+ countryCode: z.string().describe('The country code of the traveller'),
+ number: z.string().describe('The phone number of the traveller'),
+ })
+ ),
+ isPrimaryTraveller: z.boolean().describe('Whether the traveller is the primary traveller'),
+ documents: z.array(DocumentObject).describe('The documents of the traveller'),
+});
+export type Traveller = z.infer;
+const FlightEndpointObject = z.object({
+ date: z.string().describe('The arrival date of the segment'),
+ airportIata: z.string().describe('The IATA code of the arrival airport'),
+ airportName: z.string().describe('The name of the arrival airport'),
+ cityCode: z.string().describe('The city of the arrival airport'),
+ countryCode: z.string().describe('The country code of the arrival airport'),
+});
+export const FlightOfferObject = z.object({
+ flightOfferId: z.string().describe('The ID of the flight'),
+ totalEmission: z.number().describe('The total emission of the flight'),
+ totalEmissionUnit: z.string().describe('The unit of the total emission'),
+ currency: z.string().describe('The currency of the flight price'),
+ totalAmount: z.number().describe('The total amount of the flight'),
+ duration: z.string().describe('The duration of the flight'),
+ departure: FlightEndpointObject,
+ arrival: FlightEndpointObject,
+ segments: z
+ .array(
+ z.object({
+ id: z.string().describe('The ID of the segment'),
+ airlineIata: z.string().describe('The IATA code of the airline'),
+ flightNumber: z.string().describe('The flight number of the segment'),
+ aircraftType: z.string().describe('The type of the aircraft'),
+ airlineName: z.string().describe('The name of the airline'),
+ duration: z.string().describe('The duration of the segment'),
+ departure: FlightEndpointObject,
+ arrival: FlightEndpointObject,
+ })
+ )
+ .describe('The segments of the flight'),
+ offerRules: z.object({
+ isRefundable: z.boolean().describe('Whether the flight is refundable'),
+ }),
+ rankingScore: z.number().describe('The ranking score of the flight'),
+ pros: z.array(z.string()).describe('The pros of the flight'),
+ cons: z.array(z.string()).describe('The cons of the flight'),
+ tags: z.array(z.string()).describe('The tags of the flight'),
+});
+export const FlightItineraryItemObject = z.object({
+ selectedFlightOffers: z.array(FlightOfferObject).describe('The selected flight offers'),
+ priceContext: PriceContextObject,
+ selectedTravellers: z.array(TravellerObject).optional().describe('The traveller selected for this flight'),
+ flightSearchId: z.string().describe('The id of the flight search'),
+ //Todo: @Shubham - Add booking requirements
+ flightStatus: z.enum(['SEARCHED', 'SELECTED', 'HOLDED', 'BOOKED']).default('SEARCHED').describe('The status of the flight'),
+ bookingData: z.object({
+ type: z.string(),
+ id: z.string(),
+ queuingOfficeId: z.string(),
+ associatedRecords: z.array(z.object({
+ reference: z.string(),
+ creationDate: z.string(),
+ originSystemCode: z.string(),
+ flightOfferId: z.string(),
+ })),
+ }).optional(),
+ mapItems: z.array(CoordinatesObject).optional().describe('The map item of the flight'),
+});
+export const ItineraryObject = z.object({
+ priceContext: PriceContextObject,
+ itineraryItems: z.array(
+ z.object({
+ type: z.enum(['flight', 'hotel', 'car', 'activity']).describe('The type of the itinerary item'),
+ data: FlightItineraryItemObject.describe('The data of the itinerary item'),
+ })
+ ),
+});
+export type Itinerary = z.infer;
\ No newline at end of file
diff --git a/src/utils/image-size-enforcer.ts b/src/utils/image-size-enforcer.ts
new file mode 100644
index 00000000..af0cfbb7
--- /dev/null
+++ b/src/utils/image-size-enforcer.ts
@@ -0,0 +1,100 @@
+/**
+ * Image Size Enforcer - JavaScript-based image size control
+ * This provides a fallback for any images that bypass CSS rules
+ */
+
+export function enforceImageSizes() {
+ // Function to resize an image element
+ const resizeImage = (img: HTMLImageElement) => {
+ const maxHeight = window.innerWidth <= 480 ? 160 : window.innerWidth <= 768 ? 224 : 288;
+
+ // Apply styles directly to the element
+ img.style.setProperty('max-width', '100%', 'important');
+ img.style.setProperty('width', 'auto', 'important');
+ img.style.setProperty('height', 'auto', 'important');
+ img.style.setProperty('max-height', `${maxHeight}px`, 'important');
+ img.style.setProperty('object-fit', 'contain', 'important');
+ img.style.setProperty('border-radius', '8px', 'important');
+ img.style.setProperty('box-shadow', '0 2px 8px rgba(0, 0, 0, 0.1)', 'important');
+ img.style.setProperty('display', 'block', 'important');
+ img.style.setProperty('margin', '1rem auto', 'important');
+ };
+
+ // Process all existing images
+ const processExistingImages = () => {
+ const images = document.querySelectorAll('img');
+ images.forEach(resizeImage);
+ };
+
+ // Set up mutation observer to catch dynamically added images
+ const setupMutationObserver = () => {
+ const observer = new MutationObserver((mutations) => {
+ mutations.forEach((mutation) => {
+ mutation.addedNodes.forEach((node) => {
+ if (node.nodeType === Node.ELEMENT_NODE) {
+ const element = node as Element;
+
+ // Check if the added node is an image
+ if (element.tagName === 'IMG') {
+ resizeImage(element as HTMLImageElement);
+ }
+
+ // Check for images within the added node
+ const images = element.querySelectorAll('img');
+ images.forEach(resizeImage);
+ }
+ });
+ });
+ });
+
+ observer.observe(document.body, {
+ childList: true,
+ subtree: true,
+ });
+
+ return observer;
+ };
+
+ // Set up resize listener for responsive behavior
+ const setupResizeListener = () => {
+ let resizeTimeout: NodeJS.Timeout;
+
+ const handleResize = () => {
+ clearTimeout(resizeTimeout);
+ resizeTimeout = setTimeout(() => {
+ processExistingImages();
+ }, 100);
+ };
+
+ window.addEventListener('resize', handleResize);
+
+ return () => window.removeEventListener('resize', handleResize);
+ };
+
+ // Initialize everything
+ const init = () => {
+ // Process images immediately
+ processExistingImages();
+
+ // Set up observers
+ const observer = setupMutationObserver();
+ const cleanupResize = setupResizeListener();
+
+ // Return cleanup function
+ return () => {
+ observer.disconnect();
+ cleanupResize();
+ };
+ };
+
+ return init();
+}
+
+// Auto-initialize when DOM is ready
+if (typeof window !== 'undefined') {
+ if (document.readyState === 'loading') {
+ document.addEventListener('DOMContentLoaded', enforceImageSizes);
+ } else {
+ enforceImageSizes();
+ }
+}
diff --git a/src/utils/thread-storage.ts b/src/utils/thread-storage.ts
new file mode 100644
index 00000000..9d4acfa3
--- /dev/null
+++ b/src/utils/thread-storage.ts
@@ -0,0 +1,165 @@
+/**
+ * Local storage utilities for thread persistence
+ * Provides fallback storage when server-side thread storage fails
+ */
+
+import { Thread } from "@langchain/langgraph-sdk";
+
+const STORAGE_KEY = "flyo:chat:threads";
+const MAX_STORED_THREADS = 50;
+
+export interface StoredThread {
+ thread_id: string;
+ created_at: string;
+ updated_at: string;
+ title: string;
+ assistant_id: string;
+ user_id?: string;
+ messages_count: number;
+ first_message?: string;
+}
+
+/**
+ * Get threads from local storage
+ */
+export function getStoredThreads(): StoredThread[] {
+ try {
+ if (typeof window === "undefined") return [];
+ const stored = localStorage.getItem(STORAGE_KEY);
+ if (!stored) return [];
+
+ const threads = JSON.parse(stored) as StoredThread[];
+ return threads.sort(
+ (a, b) =>
+ new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime(),
+ );
+ } catch (error) {
+ console.error("Failed to get stored threads:", error);
+ return [];
+ }
+}
+
+/**
+ * Store a thread in local storage
+ */
+export function storeThread(thread: Partial): void {
+ try {
+ if (typeof window === "undefined") return;
+
+ const threads = getStoredThreads();
+ const existingIndex = threads.findIndex(
+ (t) => t.thread_id === thread.thread_id,
+ );
+
+ const storedThread: StoredThread = {
+ thread_id: thread.thread_id || "",
+ created_at: thread.created_at || new Date().toISOString(),
+ updated_at: new Date().toISOString(),
+ title: thread.title || thread.first_message || "New Chat",
+ assistant_id: thread.assistant_id || "",
+ user_id: thread.user_id,
+ messages_count: thread.messages_count || 0,
+ first_message: thread.first_message,
+ };
+
+ if (existingIndex >= 0) {
+ threads[existingIndex] = storedThread;
+ } else {
+ threads.unshift(storedThread);
+ }
+
+ // Keep only the most recent threads
+ const trimmedThreads = threads.slice(0, MAX_STORED_THREADS);
+
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(trimmedThreads));
+ console.log("Thread stored locally:", storedThread.thread_id);
+ } catch (error) {
+ console.error("Failed to store thread:", error);
+ }
+}
+
+/**
+ * Update thread with message information
+ */
+export function updateThreadWithMessage(
+ threadId: string,
+ messageContent: string,
+ assistantId: string,
+ userId?: string,
+): void {
+ try {
+ const threads = getStoredThreads();
+ const existingThread = threads.find((t) => t.thread_id === threadId);
+
+ if (existingThread) {
+ existingThread.updated_at = new Date().toISOString();
+ existingThread.messages_count += 1;
+ if (!existingThread.first_message && messageContent) {
+ existingThread.first_message = messageContent.substring(0, 100);
+ existingThread.title =
+ messageContent.substring(0, 50) +
+ (messageContent.length > 50 ? "..." : "");
+ }
+ } else {
+ storeThread({
+ thread_id: threadId,
+ assistant_id: assistantId,
+ user_id: userId,
+ messages_count: 1,
+ first_message: messageContent.substring(0, 100),
+ title:
+ messageContent.substring(0, 50) +
+ (messageContent.length > 50 ? "..." : ""),
+ });
+ }
+
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(threads));
+ } catch (error) {
+ console.error("Failed to update thread:", error);
+ }
+}
+
+/**
+ * Convert stored threads to Thread format for compatibility
+ */
+export function convertStoredThreadsToThreads(
+ storedThreads: StoredThread[],
+): Thread[] {
+ return storedThreads.map((stored) => ({
+ thread_id: stored.thread_id,
+ created_at: stored.created_at,
+ updated_at: stored.updated_at,
+ metadata: {
+ assistant_id: stored.assistant_id,
+ user_id: stored.user_id,
+ title: stored.title,
+ },
+ values: {
+ messages: [], // We don't store full messages locally
+ },
+ status: "idle" as const,
+ interrupts: {}, // Required property for Thread type - Record[]>
+ }));
+}
+
+/**
+ * Clear all stored threads
+ */
+export function clearStoredThreads(): void {
+ try {
+ if (typeof window === "undefined") return;
+ localStorage.removeItem(STORAGE_KEY);
+ console.log("Stored threads cleared");
+ } catch (error) {
+ console.error("Failed to clear stored threads:", error);
+ }
+}
+
+/**
+ * Get thread title from stored threads
+ */
+export function getThreadTitle(threadId: string): string {
+ const threads = getStoredThreads();
+ const thread = threads.find((t) => t.thread_id === threadId);
+ return thread?.title || threadId;
+}
diff --git a/tsconfig.tsbuildinfo b/tsconfig.tsbuildinfo
new file mode 100644
index 00000000..4bd351df
--- /dev/null
+++ b/tsconfig.tsbuildinfo
@@ -0,0 +1 @@
+{"fileNames":["./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es5.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.object.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.string.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.array.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/.pnpm/@types+react@19.1.4/node_modules/@types/react/global.d.ts","./node_modules/.pnpm/csstype@3.1.3/node_modules/csstype/index.d.ts","./node_modules/.pnpm/@types+react@19.1.4/node_modules/@types/react/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/styled-jsx/types/css.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/styled-jsx/types/macro.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/styled-jsx/types/style.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/styled-jsx/types/global.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/styled-jsx/types/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/amp.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/amp.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/get-page-files.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/compatibility/index.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/globals.typedarray.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/buffer.buffer.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","./node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/globals.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/assert.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/assert/strict.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/async_hooks.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/buffer.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/child_process.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/cluster.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/console.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/constants.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/crypto.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/dgram.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/dns.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/dns/promises.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/domain.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/dom-events.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/events.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/fs.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/fs/promises.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/http.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/http2.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/https.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/inspector.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/module.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/net.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/os.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/path.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/perf_hooks.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/process.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/punycode.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/querystring.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/readline.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/readline/promises.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/repl.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/sea.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/sqlite.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/stream.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/stream/promises.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/stream/consumers.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/stream/web.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/string_decoder.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/test.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/timers.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/timers/promises.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/tls.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/trace_events.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/tty.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/url.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/util.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/v8.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/vm.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/wasi.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/worker_threads.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/zlib.d.ts","./node_modules/.pnpm/@types+node@22.15.18/node_modules/@types/node/index.d.ts","./node_modules/.pnpm/@types+react@19.1.4/node_modules/@types/react/canary.d.ts","./node_modules/.pnpm/@types+react@19.1.4/node_modules/@types/react/experimental.d.ts","./node_modules/.pnpm/@types+react-dom@19.1.5_@types+react@19.1.4/node_modules/@types/react-dom/index.d.ts","./node_modules/.pnpm/@types+react-dom@19.1.5_@types+react@19.1.4/node_modules/@types/react-dom/canary.d.ts","./node_modules/.pnpm/@types+react-dom@19.1.5_@types+react@19.1.4/node_modules/@types/react-dom/experimental.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/fallback.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/compiled/webpack/webpack.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/config.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/load-custom-routes.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/image-config.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/body-streams.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/cache-control.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/setup-exception-listeners.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/worker.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/constants.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/app-router-headers.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/rendering-mode.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/router-utils/build-prefetch-segment-data-route.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/require-hook.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/experimental/ppr.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/webpack/plugins/app-build-manifest-plugin.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/page-types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/segment-config/app/app-segment-config.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/segment-config/pages/pages-segment-config.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/analysis/get-page-static-info.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/node-polyfill-crypto.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/node-environment-baseline.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/node-environment-extensions/error-inspect.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/node-environment-extensions/random.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/node-environment-extensions/date.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/node-environment-extensions/web-crypto.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/node-environment-extensions/node-crypto.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/node-environment.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/page-extensions-type.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-kind.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-definitions/route-definition.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-modules/route-module.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/deep-readonly.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/load-components.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-definitions/app-page-route-definition.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/cache-handlers/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/response-cache/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/resume-data-cache/cache-store.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/resume-data-cache/resume-data-cache.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/render-result.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/flight-data-helpers.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-definitions/locale-route-definition.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-definitions/pages-route-definition.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/mitt.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/with-router.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/router.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/route-loader.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/page-loader.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/bloom-filter.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/router/router.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-modules/pages/vendored/contexts/entrypoints.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-modules/pages/module.compiled.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/templates/pages.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-modules/pages/module.d.ts","./node_modules/.pnpm/@types+react@19.1.4/node_modules/@types/react/jsx-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/react-dev-overlay/pages/pages-dev-overlay.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/render.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/response-cache/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-definitions/pages-api-route-definition.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-matches/pages-api-route-match.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/instrumentation/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-matchers/route-matcher.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-matcher-providers/route-matcher-provider.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/i18n-provider.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-matcher-managers/route-matcher-manager.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/normalizers/normalizer.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/normalizers/locale-route-normalizer.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/normalizers/request/pathname-normalizer.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/normalizers/request/suffix.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/normalizers/request/rsc.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/normalizers/request/prefetch-rsc.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/normalizers/request/next-data.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/after/builtin-request-context.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/normalizers/request/segment-prefix-rsc.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/base-server.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/next-url.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/cookies.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/request.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/response.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/segment-config/middleware/middleware-config.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/adapter.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/use-cache/cache-life.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/constants.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/webpack/loaders/next-app-loader/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/app-dir-module.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/cache-signal.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/dynamic-rendering.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/work-unit-async-storage-instance.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/request/fallback-params.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/lazy-result.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/implicit-tags.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/work-unit-async-storage.external.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/router/utils/parse-relative-url.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/clean-async-snapshot-instance.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/clean-async-snapshot.external.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/app-render.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/server-inserted-metadata.shared-runtime.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-modules/app-page/vendored/contexts/entrypoints.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/error-boundary.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/layout-router.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/render-from-template-context.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/action-async-storage-instance.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/action-async-storage.external.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/client-page.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/client-segment.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/request/search-params.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/hooks-server-context.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/http-access-fallback/error-boundary.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/types/extra-types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/types/resolvers.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/types/icons.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/resolve-metadata.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/metadata/metadata.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/metadata/metadata-boundary.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/rsc/preloads.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/rsc/postpone.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/rsc/taint.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/collect-segment-data.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/entry-base.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/templates/app-page.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-modules/app-page/module.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-modules/app-page/module.compiled.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-definitions/app-route-route-definition.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/async-storage/work-store.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/http.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-modules/app-route/shared-modules.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/redirect-status-code.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/redirect-error.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/templates/app-route.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-modules/app-route/module.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-modules/app-route/module.compiled.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/segment-config/app/app-segments.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/static-paths/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/utils.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/turborepo-access-trace/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/turborepo-access-trace/result.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/turborepo-access-trace/helpers.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/turborepo-access-trace/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/export/routes/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/export/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/export/worker.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/worker.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/incremental-cache/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/after/after.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/after/after-context.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/work-async-storage-instance.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/app-render/work-async-storage.external.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/request/params.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/route-matches/route-match.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/request-meta.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/cli/next-test.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/config-shared.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/base-http/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/api-utils/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/base-http/node.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/async-callback-set.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","./node_modules/.pnpm/sharp@0.34.1/node_modules/sharp/lib/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/image-optimizer.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/next-server.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/lib/coalesced-function.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/router-utils/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/trace/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/trace/trace.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/trace/shared.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/trace/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/load-jsconfig.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/webpack-config.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/swc/generated-native.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/build/swc/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/dev/parse-version-info.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/react-dev-overlay/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/dev/dev-indicator-server-state.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/dev/hot-reloader-types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/telemetry/storage.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/render-server.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/router-server.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/lru-cache.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/lib/dev-bundler-service.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/dev/static-paths-worker.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/dev/next-dev-server.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/next.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","./node_modules/.pnpm/@next+env@15.3.2/node_modules/@next/env/dist/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/utils.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/pages/_app.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/app.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/revalidate.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/use-cache/cache-tag.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/cache.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/runtime-config.external.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/config.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/pages/_document.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/document.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/dynamic.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dynamic.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/pages/_error.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/error.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/head.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/head.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/request/cookies.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/request/headers.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/request/draft-mode.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/headers.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/get-img-props.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/image-component.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/shared/lib/image-external.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/image.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/link.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/link.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/redirect.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/not-found.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/forbidden.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/unauthorized.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/unstable-rethrow.server.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/unstable-rethrow.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/navigation.react-server.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/components/navigation.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/navigation.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/router.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/client/script.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/script.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/web/spec-extension/image-response.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/compiled/@vercel/og/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/after/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/request/root-params.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/server/request/connection.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/server.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/types/global.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/types/compiled.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/image-types/global.d.ts","./next-env.d.ts","./node_modules/.pnpm/langgraph-nextjs-api-passth_7ba40a17a483433f109b468e37f3bc90/node_modules/langgraph-nextjs-api-passthrough/dist/index.d.ts","./src/app/api/[..._path]/route.ts","./src/app/api/airports/search/route.ts","./src/services/authservice.ts","./src/services/paymentservice.ts","./src/app/api/payment/prepayment/[tripid]/route.ts","./src/app/api/payment/verify/route.ts","./node_modules/.pnpm/@radix-ui+react-slot@1.2.2_@types+react@19.1.4_react@19.1.0/node_modules/@radix-ui/react-slot/dist/index.d.mts","./node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/clsx.d.mts","./node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/types.d.ts","./node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority/dist/index.d.ts","./node_modules/.pnpm/tailwind-merge@3.3.0/node_modules/tailwind-merge/dist/types.d.ts","./src/lib/utils.ts","./src/components/ui/button.tsx","./src/components/auth/login.tsx","./src/components/auth/protectedroute.tsx","./src/components/auth/logoutbutton.tsx","./src/components/auth/index.ts","./node_modules/.pnpm/@types+json-schema@7.0.15/node_modules/@types/json-schema/index.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/schema.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/types.messages.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/types.stream.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/types.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/utils/async_caller.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/client.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/singletons/fetch.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/index.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/index.d.ts","./src/components/thread/utils.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/load/map_keys.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/load/serializable.d.ts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/typealiases.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/util.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/zoderror.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/locales/en.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/errors.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/parseutil.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/enumutil.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/errorutil.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/helpers/partialutil.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/standard-schema.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/types.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/index.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/standard-schema.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/util.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/versions.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/schemas.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/checks.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/errors.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/core.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/parse.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/regexes.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ar.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/az.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/be.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ca.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/cs.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/de.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/en.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/eo.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/es.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fa.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fi.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fr.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/fr-ca.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/he.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/hu.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/id.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/it.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ja.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/kh.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ko.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/mk.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ms.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/nl.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/no.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ota.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ps.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/pl.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/pt.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ru.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/sl.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/sv.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ta.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/th.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/tr.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ua.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/ur.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/vi.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/zh-cn.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/zh-tw.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/locales/index.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/registries.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/doc.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/function.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/api.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/json-schema.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/to-json-schema.d.cts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/v4/core/index.d.cts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/types/zod.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/types/index.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/base.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/content_blocks.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/tool.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/ai.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/chat.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/function.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/human.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/system.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/utils.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/experimental/otel/types.d.ts","./node_modules/.pnpm/eventemitter3@4.0.7/node_modules/eventemitter3/index.d.ts","./node_modules/.pnpm/p-queue@6.6.2/node_modules/p-queue/dist/queue.d.ts","./node_modules/.pnpm/p-queue@6.6.2/node_modules/p-queue/dist/options.d.ts","./node_modules/.pnpm/p-queue@6.6.2/node_modules/p-queue/dist/priority-queue.d.ts","./node_modules/.pnpm/p-queue@6.6.2/node_modules/p-queue/dist/index.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/utils/async_caller.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/schemas.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/evaluation/evaluator.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/client.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/run_trees.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/singletons/constants.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/singletons/types.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/singletons/traceable.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/singletons/traceable.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/agents.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/outputs.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/documents/document.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/callbacks/base.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/singletons/fetch.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/utils/project.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/dist/index.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/index.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/run_trees.d.ts","./node_modules/.pnpm/langsmith@0.3.50_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/langsmith/schemas.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/tracers/base.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/tracers/tracer_langchain.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/callbacks/manager.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/types/_internal.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/runnables/types.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/fast-json-patch/src/helpers.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/fast-json-patch/src/core.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/fast-json-patch/src/duplex.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/fast-json-patch/index.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/stream.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/tracers/event_stream.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/tracers/log_stream.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/runnables/graph.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/runnables/base.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/documents/transformers.d.ts","./node_modules/.pnpm/js-tiktoken@1.0.20/node_modules/js-tiktoken/dist/core-cb1c5044.d.ts","./node_modules/.pnpm/js-tiktoken@1.0.20/node_modules/js-tiktoken/dist/lite.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/js-sha1/hash.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/js-sha256/hash.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/hash.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/caches/base.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/prompt_values.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/async_caller.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/runnables/config.d.ts","./node_modules/.pnpm/zod@3.25.76/node_modules/zod/index.d.cts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/any.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/errormessages.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/array.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/bigint.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/boolean.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/number.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/date.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/enum.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/intersection.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/literal.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/string.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/record.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/map.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/nativeenum.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/never.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/null.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/nullable.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/object.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/set.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/tuple.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/undefined.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/union.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/unknown.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsetypes.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/refs.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/options.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsedef.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/branded.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/catch.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/default.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/effects.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/optional.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/pipeline.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/promise.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/parsers/readonly.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/selectparser.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/zodtojsonschema.d.ts","./node_modules/.pnpm/zod-to-json-schema@3.24.5_zod@3.25.76/node_modules/zod-to-json-schema/dist/types/index.d.ts","./node_modules/.pnpm/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/deep-compare-strict.d.ts","./node_modules/.pnpm/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/types.d.ts","./node_modules/.pnpm/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/dereference.d.ts","./node_modules/.pnpm/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/format.d.ts","./node_modules/.pnpm/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/pointer.d.ts","./node_modules/.pnpm/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/ucs2-length.d.ts","./node_modules/.pnpm/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/validate.d.ts","./node_modules/.pnpm/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/validator.d.ts","./node_modules/.pnpm/@cfworker+json-schema@4.1.1/node_modules/@cfworker/json-schema/dist/esm/index.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/json_schema.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/language_models/base.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/modifier.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/transformers.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/messages/index.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/messages.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/agents.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/runnables/passthrough.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/runnables/router.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/runnables/branch.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/chat_history.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/runnables/history.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/runnables/index.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/runnables.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/tools/utils.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/tools/types.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/tools/index.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/tools.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/prebuilt/tool_executor.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/serde/base.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/types.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/serde/types.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/base.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/memory.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/id.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/embeddings.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/embeddings.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/store/base.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/store/batch.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/store/memory.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/store/index.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/dist/index.d.ts","./node_modules/.pnpm/@langchain+langgraph-checkp_f27eb7c50295b8a8f8dd86d83c5d4342/node_modules/@langchain/langgraph-checkpoint/index.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/channels/base.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/runnables/graph.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/callbacks/manager.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/utils.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/pregel/utils/index.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/pregel/read.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/utils/stream.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/tracers/log_stream.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/constants.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/pregel/write.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/managed/base.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/pregel/runnable_types.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/pregel/types.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/pregel/stream.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/pregel/algo.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/pregel/index.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/channels/binop.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/channels/last_value.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/graph/annotation.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/graph/graph.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/typealiases.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/util.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/zoderror.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/locales/en.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/errors.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/parseutil.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/enumutil.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/errorutil.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/helpers/partialutil.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/standard-schema.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/types.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/external.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/lib/index.d.ts","./node_modules/.pnpm/zod@3.24.4/node_modules/zod/index.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/graph/zod/state.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/graph/state.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/graph/message.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/graph/index.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/errors.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/channels/any_value.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/channels/dynamic_barrier_value.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/channels/named_barrier_value.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/channels/topic.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/channels/index.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/channels/ephemeral_value.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/managed/is_last_step.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/managed/shared_value.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/managed/index.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/func/types.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/func/index.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/graph/messages_annotation.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/web.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/prebuilt/agent_executor.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/prebuilt/chat_agent_executor.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/language_models/chat_models.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/language_models/chat_models.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/language_models/base.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/prebuilt/tool_node.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/prebuilt/react_agent_executor.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/prebuilt/interrupt.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/prebuilt/agentname.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/dist/prebuilt/index.d.ts","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/prebuilt.d.ts","./src/components/thread/agent-inbox/types.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constants.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/types.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/fp/types.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/types.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/add.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addbusinessdays.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/adddays.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addhours.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addisoweekyears.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addmilliseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addminutes.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addmonths.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addquarters.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addweeks.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addyears.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/areintervalsoverlapping.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/clamp.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/closestindexto.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/closestto.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/compareasc.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/comparedesc.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constructfrom.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constructnow.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/daystoweeks.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinbusinessdays.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendardays.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendarisoweekyears.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendarisoweeks.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendarmonths.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendarquarters.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendarweeks.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceincalendaryears.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceindays.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinhours.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinisoweekyears.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinmilliseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinminutes.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinmonths.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinquarters.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinweeks.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceinyears.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachdayofinterval.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachhourofinterval.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachminuteofinterval.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachmonthofinterval.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachquarterofinterval.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachweekofinterval.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachweekendofinterval.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachweekendofmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachweekendofyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachyearofinterval.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofdecade.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofhour.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofisoweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofisoweekyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofminute.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofquarter.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofsecond.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endoftoday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endoftomorrow.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endofyesterday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/formatters.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/longformatters.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/format.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatdistance.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatdistancestrict.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatdistancetonow.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatdistancetonowstrict.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatduration.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatiso.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatiso9075.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatisoduration.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatrfc3339.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatrfc7231.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/formatrelative.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/fromunixtime.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdate.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdayofyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdaysinmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdaysinyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdecade.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/defaultoptions.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getdefaultoptions.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/gethours.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getisoday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getisoweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getisoweekyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getisoweeksinyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getmilliseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getminutes.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getoverlappingdaysinintervals.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getquarter.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/gettime.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getunixtime.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getweekofmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getweekyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getweeksinmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/hourstomilliseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/hourstominutes.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/hourstoseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/interval.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/intervaltoduration.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/intlformat.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/intlformatdistance.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isafter.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isbefore.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isdate.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isequal.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isexists.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isfirstdayofmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isfriday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isfuture.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/islastdayofmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isleapyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/ismatch.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/ismonday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/ispast.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issamehour.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameisoweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameisoweekyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameminute.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issamemonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issamequarter.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issamesecond.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issameyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issaturday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/issunday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthishour.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthisisoweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthisminute.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthismonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthisquarter.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthissecond.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthisweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthisyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isthursday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/istoday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/istomorrow.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/istuesday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isvalid.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/iswednesday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isweekend.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/iswithininterval.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isyesterday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofdecade.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofisoweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofisoweekyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofquarter.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lastdayofyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/lightformatters.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/lightformat.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/max.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/milliseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/millisecondstohours.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/millisecondstominutes.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/millisecondstoseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/min.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/minutestohours.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/minutestomilliseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/minutestoseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/monthstoquarters.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/monthstoyears.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextfriday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextmonday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextsaturday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextsunday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextthursday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nexttuesday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/nextwednesday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/types.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/setter.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parser.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse/_lib/parsers.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parse.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parseiso.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/parsejson.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousfriday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousmonday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previoussaturday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previoussunday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previousthursday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previoustuesday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/previouswednesday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/quarterstomonths.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/quarterstoyears.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/roundtonearesthours.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/roundtonearestminutes.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/secondstohours.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/secondstomilliseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/secondstominutes.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/set.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setdate.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setdayofyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setdefaultoptions.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/sethours.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setisoday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setisoweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setisoweekyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setmilliseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setminutes.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setquarter.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setweekyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofdecade.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofhour.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofisoweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofisoweekyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofminute.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofmonth.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofquarter.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofsecond.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startoftoday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startoftomorrow.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofweek.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofweekyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofyear.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startofyesterday.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/sub.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subbusinessdays.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subdays.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subhours.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subisoweekyears.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/submilliseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subminutes.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/submonths.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subquarters.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subseconds.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subweeks.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/subyears.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/todate.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/transpose.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/weekstodays.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/yearstodays.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/yearstomonths.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/yearstoquarters.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/index.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/common.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/array.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/collection.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/date.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/function.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/lang.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/math.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/number.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/object.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/seq.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/string.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/common/util.d.ts","./node_modules/.pnpm/@types+lodash@4.17.16/node_modules/@types/lodash/index.d.ts","./src/components/thread/agent-inbox/utils.ts","./src/components/common/ui/button.tsx","./node_modules/.pnpm/lucide-react@0.476.0_react@19.1.0/node_modules/lucide-react/dist/lucide-react.d.ts","./src/lib/langgraph-stream.js","./src/lib/langgraph-index.js","./node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/index.d.ts","./node_modules/.pnpm/nuqs@2.4.3_next@15.3.2_@pla_6e1fa0398f9b282e4018bd342ea9775b/node_modules/nuqs/dist/_tsup-dts-rollup.d.ts","./node_modules/.pnpm/nuqs@2.4.3_next@15.3.2_@pla_6e1fa0398f9b282e4018bd342ea9775b/node_modules/nuqs/dist/index.d.ts","./src/components/ui/input.tsx","./src/components/icons/langgraph.tsx","./node_modules/.pnpm/@radix-ui+react-primitive@2_7b933c94c4e5e4ade0d694d5b36d9593/node_modules/@radix-ui/react-primitive/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-label@2.1.6_f5d76421f0b83349b902a67252a7f51f/node_modules/@radix-ui/react-label/dist/index.d.mts","./src/components/ui/label.tsx","./src/components/ui/password-input.tsx","./src/lib/api-key.tsx","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/types.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/max.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/nil.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/parse.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v1.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v1tov6.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v35.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v3.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v5.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v6.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v6tov1.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v7.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/validate.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/version.d.ts","./node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/index.d.ts","./src/providers/client.ts","./src/utils/thread-storage.ts","./src/providers/thread.tsx","./node_modules/.pnpm/sonner@2.0.3_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/sonner/dist/index.d.mts","./src/hooks/use-interrupt-persistence.tsx","./src/providers/interruptpersistencecontext.tsx","./src/providers/stream.tsx","./src/components/widgets/util.ts","./node_modules/.pnpm/@radix-ui+react-context@1.1_f1c66a21136a6a7eef779b85a6d8e78b/node_modules/@radix-ui/react-context/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-primitive@2_5995b29907b4034fd01e32785b01e59f/node_modules/@radix-ui/react-primitive/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-dismissable_422595167670725011b69572eff325ac/node_modules/@radix-ui/react-dismissable-layer/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-focus-scope_75117573eeab0ad96c1d6e544fdd311f/node_modules/@radix-ui/react-focus-scope/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-portal@1.1._9fef6ae75aba8aa40787e025c22cfd92/node_modules/@radix-ui/react-portal/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-dialog@1.1._051127bf0473685b150f8ac9f56f9806/node_modules/@radix-ui/react-dialog/dist/index.d.mts","./src/components/ui/sheet.tsx","./src/components/ui/skeleton.tsx","./src/components/widgets/flightoptions.widget.tsx","./src/components/widgets/flightstatus.wdiget.tsx","./node_modules/.pnpm/cmdk@1.1.1_@types+react-dom_e5b58a7de26f8f6b728af2ebdff41945/node_modules/cmdk/dist/index.d.ts","./src/components/ui/dialog.tsx","./src/components/ui/command.tsx","./node_modules/.pnpm/@radix-ui+react-arrow@1.1.7_ee0d9cb63f65cdc616342e3b08ce3711/node_modules/@radix-ui/react-arrow/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+rect@1.1.1/node_modules/@radix-ui/rect/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-popper@1.2._0cb242d0add104272a545734161c59b1/node_modules/@radix-ui/react-popper/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-popover@1.1_10c3dfa046227f09bc9781299892deda/node_modules/@radix-ui/react-popover/dist/index.d.mts","./src/components/common/ui/popover.tsx","./src/services/airportservice.ts","./src/components/common/ui/airportcombobox.tsx","./src/providers/tabcontext.tsx","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/ui.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/af.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ar.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ar-dz.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ar-eg.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ar-ma.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ar-sa.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ar-tn.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/az.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/be.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/be-tarask.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/bg.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/bn.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/bs.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ca.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ckb.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/cs.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/cy.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/da.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/de.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/de-at.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/el.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-au.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-ca.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-gb.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-ie.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-in.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-nz.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-us.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-za.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/eo.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/es.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/et.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/eu.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/fa-ir.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/fi.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/fr.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/fr-ca.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/fr-ch.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/fy.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/gd.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/gl.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/gu.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/he.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/hi.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/hr.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ht.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/hu.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/hy.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/id.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/is.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/it.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/it-ch.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ja.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ja-hira.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ka.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/kk.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/km.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/kn.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/lb.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/lt.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/lv.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/mk.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/mn.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ms.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/mt.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/nb.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/nl.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/nl-be.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/nn.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/oc.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/pl.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/pt.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/pt-br.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ro.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ru.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/se.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/sk.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/sl.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/sq.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/sr.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/sr-latn.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/sv.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ta.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/te.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/th.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/tr.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ug.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/uk.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/uz.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/uz-cyrl.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/vi.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/zh-cn.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/zh-hk.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/zh-tw.d.ts","./node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/button.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/captionlabel.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/chevron.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/day.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/daybutton.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/dropdown.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/dropdownnav.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/footer.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/classes/calendarweek.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/classes/calendarmonth.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/month.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/monthgrid.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/months.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/monthsdropdown.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/nav.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/nextmonthbutton.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/option.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/previousmonthbutton.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/root.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/select.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/week.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/weekday.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/weekdays.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/weeknumber.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/weeknumberheader.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/weeks.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/yearsdropdown.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/custom-components.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/formatters/formatcaption.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/formatters/formatday.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/formatters/formatmonthdropdown.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/formatters/formatweeknumber.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/formatters/formatweeknumberheader.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/formatters/formatweekdayname.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/formatters/formatyeardropdown.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/formatters/index.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labelgrid.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labelgridcell.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labeldaybutton.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labelnav.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labelmonthdropdown.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labelnext.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labelprevious.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labelweekday.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labelweeknumber.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labelweeknumberheader.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/labelyeardropdown.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/labels/index.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/types/shared.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/classes/datelib.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/classes/calendarday.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/classes/index.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/components/monthcaption.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/types/props.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/types/selection.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/usedaypicker.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/types/deprecated.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/types/index.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/daypicker.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/helpers/getdefaultclassnames.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/helpers/index.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/utils/addtorange.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/utils/datematchmodifiers.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/utils/rangecontainsdayofweek.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/utils/rangecontainsmodifiers.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/utils/rangeincludesdate.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/utils/rangeoverlaps.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/utils/typeguards.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/utils/index.d.ts","./node_modules/.pnpm/@date-fns+tz@1.2.0/node_modules/@date-fns/tz/constants/index.d.ts","./node_modules/.pnpm/@date-fns+tz@1.2.0/node_modules/@date-fns/tz/date/index.d.ts","./node_modules/.pnpm/@date-fns+tz@1.2.0/node_modules/@date-fns/tz/date/mini.d.ts","./node_modules/.pnpm/@date-fns+tz@1.2.0/node_modules/@date-fns/tz/tz/index.d.ts","./node_modules/.pnpm/@date-fns+tz@1.2.0/node_modules/@date-fns/tz/tzoffset/index.d.ts","./node_modules/.pnpm/@date-fns+tz@1.2.0/node_modules/@date-fns/tz/tzscan/index.d.ts","./node_modules/.pnpm/@date-fns+tz@1.2.0/node_modules/@date-fns/tz/index.d.ts","./node_modules/.pnpm/react-day-picker@9.8.1_react@19.1.0/node_modules/react-day-picker/dist/esm/index.d.ts","./src/components/ui/calendar.tsx","./src/components/widgets/searchcriteria.widget.tsx","./src/components/widgets/lounge.widget.tsx","./src/components/widgets/weather.widget.tsx","./src/components/common/ui/input.tsx","./src/components/common/ui/label.tsx","./node_modules/.pnpm/@radix-ui+react-select@2.2._ebc39761ef66d659aac957c2446b5f6c/node_modules/@radix-ui/react-select/dist/index.d.mts","./src/components/common/ui/select.tsx","./src/components/widgets/review.widget.tsx","./src/components/ui/card.tsx","./src/components/widgets/payment.widget.tsx","./src/providers/nonagentflowcontext.tsx","./src/components/widgets/non-agent-flow.widget.tsx","./src/components/widgets/seatpreference.widget.tsx","./src/components/widgets/seatselection.widget.tsx","./src/components/widgets/seatpayment.widget.tsx","./src/components/widgets/seatcombined.widget.tsx","./src/components/widgets/addbaggage.widget.tsx","./src/components/widgets/whostravelling.widget.tsx","./src/components/ui/badge.tsx","./src/components/widgets/itinerarytest.widget.tsx","./src/components/widgets/index.ts","./src/lib/agent-inbox-interrupt.ts","./src/lib/ensure-tool-responses.ts","./src/lib/multimodal-utils.ts","./src/types/flightsearchcriteria.ts","./src/types/itineraryl.ts","./src/utils/image-size-enforcer.ts","./src/app/error.tsx","./src/app/global-error.tsx","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/compiled/@next/font/dist/types.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","./node_modules/.pnpm/next@15.3.2_@playwright+tes_11ef3c70f816038b1e7819c982d20629/node_modules/next/font/google/index.d.ts","./node_modules/.pnpm/nuqs@2.4.3_next@15.3.2_@pla_6e1fa0398f9b282e4018bd342ea9775b/node_modules/nuqs/dist/adapters/next/app.d.ts","./src/app/layout.tsx","./src/app/loading.tsx","./src/app/not-found.tsx","./src/components/thread/artifact.tsx","./src/providers/itinerarywidgetcontext.tsx","./node_modules/.pnpm/next-themes@0.4.6_react-dom_e207e685aa9cc81adf4eaedb8666d505/node_modules/next-themes/dist/index.d.ts","./src/components/ui/sonner.tsx","./node_modules/.pnpm/@mapbox+point-geometry@1.1.0/node_modules/@mapbox/point-geometry/index.d.ts","./node_modules/.pnpm/@mapbox+tiny-sdf@2.0.7/node_modules/@mapbox/tiny-sdf/index.d.ts","./node_modules/.pnpm/@types+geojson@7946.0.16/node_modules/@types/geojson/index.d.ts","./node_modules/.pnpm/pbf@4.0.1/node_modules/pbf/index.d.ts","./node_modules/.pnpm/@mapbox+vector-tile@2.0.4/node_modules/@mapbox/vector-tile/index.d.ts","./node_modules/.pnpm/gl-matrix@3.4.3/node_modules/gl-matrix/index.d.ts","./node_modules/.pnpm/kdbush@4.0.2/node_modules/kdbush/index.d.ts","./node_modules/.pnpm/potpack@2.1.0/node_modules/potpack/index.d.ts","./node_modules/.pnpm/@mapbox+mapbox-gl-supported@3.0.0/node_modules/@mapbox/mapbox-gl-supported/index.d.ts","./node_modules/.pnpm/mapbox-gl@3.14.0/node_modules/mapbox-gl/dist/mapbox-gl.d.ts","./src/components/flight/mapcomponent.tsx","./node_modules/.pnpm/@radix-ui+react-separator@1_ea6ca972857b200b0dc98744323eeb42/node_modules/@radix-ui/react-separator/dist/index.d.mts","./src/components/ui/separator.tsx","./src/components/flight/itinerarycomponent.tsx","./node_modules/.pnpm/motion-utils@12.12.1/node_modules/motion-utils/dist/index.d.ts","./node_modules/.pnpm/motion-dom@12.12.1/node_modules/motion-dom/dist/index.d.ts","./node_modules/.pnpm/framer-motion@12.12.1_react_7aadfe4a1bae4b0cc35a8e6b5167ae46/node_modules/framer-motion/dist/types.d-ctupuryt.d.ts","./node_modules/.pnpm/framer-motion@12.12.1_react_7aadfe4a1bae4b0cc35a8e6b5167ae46/node_modules/framer-motion/dist/types/index.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/output_parsers/base.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/output_parsers/transform.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/output_parsers/bytes.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/output_parsers/list.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/output_parsers/string.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/output_parsers/structured.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/json_patch.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/utils/json.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/output_parsers/json.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/output_parsers/xml.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/dist/output_parsers/index.d.ts","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/output_parsers.d.ts","./node_modules/.pnpm/@radix-ui+react-dismissable_6fa579b84aec5e61a5b40d10bb671609/node_modules/@radix-ui/react-dismissable-layer/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-arrow@1.1.6_0f11206d0f33f095dc8c3b8879d50e63/node_modules/@radix-ui/react-arrow/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-popper@1.2._d5459adb46993a50615f22c9197e0a71/node_modules/@radix-ui/react-popper/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-portal@1.1._e792b184a2ca1dccf9b400aadd0fc7f8/node_modules/@radix-ui/react-portal/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-tooltip@1.2_77fd30315bd1adbf71ffcb3d3c7056c6/node_modules/@radix-ui/react-tooltip/dist/index.d.mts","./src/components/ui/tooltip.tsx","./src/components/thread/tooltip-icon-button.tsx","./src/components/thread/messages/shared.tsx","./node_modules/.pnpm/@types+unist@3.0.3/node_modules/@types/unist/index.d.ts","./node_modules/.pnpm/@types+hast@3.0.4/node_modules/@types/hast/index.d.ts","./node_modules/.pnpm/vfile-message@4.0.2/node_modules/vfile-message/lib/index.d.ts","./node_modules/.pnpm/vfile-message@4.0.2/node_modules/vfile-message/index.d.ts","./node_modules/.pnpm/vfile@6.0.3/node_modules/vfile/lib/index.d.ts","./node_modules/.pnpm/vfile@6.0.3/node_modules/vfile/index.d.ts","./node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/callable-instance.d.ts","./node_modules/.pnpm/trough@2.2.0/node_modules/trough/lib/index.d.ts","./node_modules/.pnpm/trough@2.2.0/node_modules/trough/index.d.ts","./node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.d.ts","./node_modules/.pnpm/unified@11.0.5/node_modules/unified/index.d.ts","./node_modules/.pnpm/@types+mdast@4.0.4/node_modules/@types/mdast/index.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/state.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/footer.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/blockquote.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/break.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/code.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/delete.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/emphasis.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/heading.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/html.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/image-reference.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/image.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/inline-code.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/link-reference.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/link.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/list-item.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/list.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/paragraph.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/root.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/strong.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/table.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/table-cell.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/table-row.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/text.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/thematic-break.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/handlers/index.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/lib/index.d.ts","./node_modules/.pnpm/mdast-util-to-hast@13.2.0/node_modules/mdast-util-to-hast/index.d.ts","./node_modules/.pnpm/remark-rehype@11.1.2/node_modules/remark-rehype/lib/index.d.ts","./node_modules/.pnpm/remark-rehype@11.1.2/node_modules/remark-rehype/index.d.ts","./node_modules/.pnpm/react-markdown@10.1.0_@types+react@19.1.4_react@19.1.0/node_modules/react-markdown/lib/index.d.ts","./node_modules/.pnpm/react-markdown@10.1.0_@types+react@19.1.4_react@19.1.0/node_modules/react-markdown/index.d.ts","./node_modules/.pnpm/micromark-util-types@2.0.2/node_modules/micromark-util-types/index.d.ts","./node_modules/.pnpm/micromark-extension-gfm-footnote@2.1.0/node_modules/micromark-extension-gfm-footnote/lib/html.d.ts","./node_modules/.pnpm/micromark-extension-gfm-footnote@2.1.0/node_modules/micromark-extension-gfm-footnote/lib/syntax.d.ts","./node_modules/.pnpm/micromark-extension-gfm-footnote@2.1.0/node_modules/micromark-extension-gfm-footnote/index.d.ts","./node_modules/.pnpm/micromark-extension-gfm-strikethrough@2.1.0/node_modules/micromark-extension-gfm-strikethrough/lib/html.d.ts","./node_modules/.pnpm/micromark-extension-gfm-strikethrough@2.1.0/node_modules/micromark-extension-gfm-strikethrough/lib/syntax.d.ts","./node_modules/.pnpm/micromark-extension-gfm-strikethrough@2.1.0/node_modules/micromark-extension-gfm-strikethrough/index.d.ts","./node_modules/.pnpm/micromark-extension-gfm@3.0.0/node_modules/micromark-extension-gfm/index.d.ts","./node_modules/.pnpm/mdast-util-from-markdown@2.0.2/node_modules/mdast-util-from-markdown/lib/types.d.ts","./node_modules/.pnpm/mdast-util-from-markdown@2.0.2/node_modules/mdast-util-from-markdown/lib/index.d.ts","./node_modules/.pnpm/mdast-util-from-markdown@2.0.2/node_modules/mdast-util-from-markdown/index.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/types.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/index.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/blockquote.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/break.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/code.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/definition.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/emphasis.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/heading.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/html.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/image.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/image-reference.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/inline-code.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/link.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/link-reference.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/list.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/list-item.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/paragraph.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/root.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/strong.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/text.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/thematic-break.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/lib/handle/index.d.ts","./node_modules/.pnpm/mdast-util-to-markdown@2.1.2/node_modules/mdast-util-to-markdown/index.d.ts","./node_modules/.pnpm/mdast-util-gfm-footnote@2.1.0/node_modules/mdast-util-gfm-footnote/lib/index.d.ts","./node_modules/.pnpm/mdast-util-gfm-footnote@2.1.0/node_modules/mdast-util-gfm-footnote/index.d.ts","./node_modules/.pnpm/markdown-table@3.0.4/node_modules/markdown-table/index.d.ts","./node_modules/.pnpm/mdast-util-gfm-table@2.0.0/node_modules/mdast-util-gfm-table/lib/index.d.ts","./node_modules/.pnpm/mdast-util-gfm-table@2.0.0/node_modules/mdast-util-gfm-table/index.d.ts","./node_modules/.pnpm/mdast-util-gfm@3.1.0/node_modules/mdast-util-gfm/lib/index.d.ts","./node_modules/.pnpm/mdast-util-gfm@3.1.0/node_modules/mdast-util-gfm/index.d.ts","./node_modules/.pnpm/remark-gfm@4.0.1/node_modules/remark-gfm/lib/index.d.ts","./node_modules/.pnpm/remark-gfm@4.0.1/node_modules/remark-gfm/index.d.ts","./node_modules/.pnpm/katex@0.16.22/node_modules/katex/types/katex.d.ts","./node_modules/.pnpm/rehype-katex@7.0.1/node_modules/rehype-katex/lib/index.d.ts","./node_modules/.pnpm/rehype-katex@7.0.1/node_modules/rehype-katex/index.d.ts","./node_modules/.pnpm/mdast-util-math@3.0.0/node_modules/mdast-util-math/lib/index.d.ts","./node_modules/.pnpm/mdast-util-math@3.0.0/node_modules/mdast-util-math/index.d.ts","./node_modules/.pnpm/remark-math@6.0.0/node_modules/remark-math/lib/index.d.ts","./node_modules/.pnpm/remark-math@6.0.0/node_modules/remark-math/index.d.ts","./node_modules/.pnpm/@types+react-syntax-highlighter@15.5.13/node_modules/@types/react-syntax-highlighter/index.d.ts","./src/components/thread/syntax-highlighter.tsx","./src/components/thread/markdown-text.tsx","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/react/stream.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/react/index.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/react-ui/types.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/react-ui/client.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/dist/react-ui/index.d.ts","./node_modules/.pnpm/@langchain+langgraph-sdk@0._5a37704c5a2529c5c31df419195982de/node_modules/@langchain/langgraph-sdk/react-ui.d.ts","./src/components/thread/messages/tool-calls.tsx","./node_modules/.pnpm/@langchain+core@0.3.66_openai@5.11.0_ws@8.18.2_zod@3.24.4_/node_modules/@langchain/core/messages/tool.d.ts","./src/components/thread/agent-inbox/components/tool-call-table.tsx","./src/components/thread/agent-inbox/components/state-view.tsx","./src/components/thread/agent-inbox/components/thread-id.tsx","./src/components/ui/textarea.tsx","./src/components/thread/agent-inbox/components/inbox-item-input.tsx","./node_modules/.pnpm/@langchain+langgraph@0.2.72_399db58ccc9c345a1d1543b547a36dbe/node_modules/@langchain/langgraph/web.d.ts","./src/components/thread/agent-inbox/hooks/use-interrupted-actions.tsx","./src/components/thread/agent-inbox/components/thread-actions-view.tsx","./src/components/thread/agent-inbox/index.tsx","./src/components/thread/messages/ai.tsx","./src/components/thread/multimodalpreview.tsx","./src/components/thread/messages/human.tsx","./src/hooks/usemediaquery.tsx","./src/components/thread/history/index.tsx","./src/hooks/use-file-upload.tsx","./src/components/thread/contentblockspreview.tsx","./src/components/thread/messages/interrupt-manager.tsx","./src/components/debug/debugpanel.tsx","./src/components/thread/messages/generic-interrupt.tsx","./src/components/thread/messages/persistent-interrupt.tsx","./src/components/thread/nonagentflowreopenbutton.tsx","./src/components/thread/chat.tsx","./src/components/thread/tabslayout.tsx","./src/components/ui/navbar.tsx","./src/app/page.tsx","./src/app/login/page.tsx","./src/app/widgets/page.tsx","./src/components/common/ui/airportsearch.tsx","./src/components/common/ui/calendar.tsx","./src/components/icons/github.tsx","./node_modules/.pnpm/use-stick-to-bottom@1.1.0_react@19.1.0/node_modules/use-stick-to-bottom/dist/usesticktobottom.d.ts","./node_modules/.pnpm/use-stick-to-bottom@1.1.0_react@19.1.0/node_modules/use-stick-to-bottom/dist/sticktobottom.d.ts","./node_modules/.pnpm/use-stick-to-bottom@1.1.0_react@19.1.0/node_modules/use-stick-to-bottom/dist/index.d.ts","./src/components/thread/index.tsx","./node_modules/.pnpm/@radix-ui+react-avatar@1.1._ae22d3c08f620c8af31b550306a6f8e0/node_modules/@radix-ui/react-avatar/dist/index.d.mts","./src/components/ui/avatar.tsx","./src/components/ui/popover.tsx","./node_modules/.pnpm/@radix-ui+react-switch@1.2._633ca8da003794aaf2f024c24b4e7c67/node_modules/@radix-ui/react-switch/dist/index.d.mts","./src/components/ui/switch.tsx","./node_modules/.pnpm/@radix-ui+react-roving-focu_66fa0b90dc2bb51df66f5e2d9edf4341/node_modules/@radix-ui/react-roving-focus/dist/index.d.mts","./node_modules/.pnpm/@radix-ui+react-tabs@1.1.12_eaa2dd63159aa781d3fb8bc38959659c/node_modules/@radix-ui/react-tabs/dist/index.d.mts","./src/components/ui/tabs.tsx","./src/components/widgets/review-widget-demo.tsx","./.next/types/cache-life.d.ts","./.next/types/app/layout.ts","./.next/types/app/page.ts","./node_modules/@types/d3-array/index.d.ts","./node_modules/@types/d3-color/index.d.ts","./node_modules/@types/d3-ease/index.d.ts","./node_modules/@types/d3-interpolate/index.d.ts","./node_modules/@types/d3-path/index.d.ts","./node_modules/@types/d3-time/index.d.ts","./node_modules/@types/d3-scale/index.d.ts","./node_modules/@types/d3-shape/index.d.ts","./node_modules/@types/d3-timer/index.d.ts","./node_modules/@types/ms/index.d.ts","./node_modules/@types/debug/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/estree-jsx/index.d.ts","./node_modules/@types/geojson/index.d.ts","./node_modules/@types/geojson-vt/index.d.ts","./node_modules/@types/hast/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/json5/index.d.ts","./node_modules/@types/katex/index.d.ts","./node_modules/.pnpm/@types+mapbox-gl@3.4.1/node_modules/@types/mapbox-gl/index.d.ts","./node_modules/@types/mapbox__point-geometry/index.d.ts","./node_modules/@types/mdast/index.d.ts","./node_modules/@types/pbf/index.d.ts","./node_modules/@types/prismjs/index.d.ts","./node_modules/@types/retry/index.d.ts","./node_modules/@types/supercluster/index.d.ts","./node_modules/@types/unist/index.d.ts","./node_modules/.pnpm/@types+uuid@10.0.0/node_modules/@types/uuid/index.d.ts"],"fileIdsList":[[95,137,334,1319],[95,137,334,1493],[95,137,421,422,423,424],[95,137,471,472],[95,137],[95,137,674],[95,137,673,674,675,676,677,678,679,680],[95,137,1277],[95,137,1278],[95,137,1277,1278,1279,1280,1281,1282],[95,137,600],[95,137,612],[95,137,576,578,579,580,581,582,583,601,629],[95,137,503,504,575,576,600,601,602],[95,137,504,575,576,600,601,602,603,611],[95,137,504,686],[95,137,602,612,623],[95,137,632],[95,137,517,573,574,576,601,612,623,626,630,631,632,633,682],[95,137,517,573,601,612,623,630,631,633,683,686,698],[95,137,503],[95,137,576,578],[95,137,504,575],[95,137,576],[95,137,576,577],[95,137,576,577,578,579,580,581,582,583,584,684,685],[95,137,576,578,579,580,581,582,583,623,624,683,684],[95,137,576,578,579,580,581,582,583],[95,137,601,612,631,633,686,694],[95,137,1345],[95,137,1344,1345,1346,1347,1348,1349,1352,1353],[95,137,601,1345,1350,1351],[95,137,686,1345],[95,137,504,517,574,1344],[95,137,576,601,612,1344],[95,137,601,1345,1350],[95,137,504,576,582],[95,137,504,574,578,599,610,612,614,619,620,621,622],[95,137,612,623,633],[95,137,612,614],[95,137,614],[95,137,610,623,633,686,692],[95,137,614,623,633,689,690,691,693],[95,137,623,633],[95,137,619,623,633],[95,137,504,574,612,613],[95,137,517,574,578,612,623,633,682,683,696,697],[95,137,517,574,576,578,612,623,633,682,683],[95,137,578],[95,137,504,575,576,600,601,602,603,608,609],[95,137,603,610,619],[95,137,603,610,618,619,620],[95,137,603,607,608,609,610],[95,137,615,616,617],[95,137,615],[95,137,616],[95,137,627,628],[95,137,618],[95,137,574,672,681],[95,137,613],[95,137,574],[95,137,517,573],[95,137,707],[95,137,683],[95,137,769],[95,137,686],[95,137,1354],[95,137,694],[95,137,622],[95,137,698],[95,137,621],[95,137,619],[95,137,695,701,702,703],[95,137,701,702,703,704,705,706,712],[95,137,695,701,702,703,704],[95,137,708],[95,137,709],[95,137,709,710,711],[95,137,713],[95,137,493,495,496,497],[95,137,493,494,495,496,498,499],[81,95,137,264,1461,1462,1463],[95,137,1463,1464],[95,137,1461],[95,137,493,494,495,496,498],[95,137,492],[95,137,493,495],[95,137,494],[95,137,500],[95,137,1465],[95,137,715],[95,137,714],[95,137,758],[95,137,715,731,732,754,755,756,757],[95,137,723],[95,137,714,719,720,723,730,732,759,763],[95,137,726],[95,137,695,715,725,731,732],[95,137,695,714,715,716,718,720,723,726,727,730,733],[95,137,733,734,750,751],[95,137,687,750],[95,137,687,733,751,766],[95,137,695,714,715,719,723,725,726,733,734,749],[95,137,715,748],[95,137,695],[95,137,725,760,761],[95,137,725],[95,137,695,714,725,726],[95,137,687,688,695,699,700,750,766],[95,137,687,771],[95,137,687,695,699,700,723,750],[95,137,700,767,768,772,773,774,775],[95,137,687,695,699,714,723,726,733,748,751,752,765,766,770,771,772],[95,137,695,699],[95,137,687,695,699,718,723,765],[95,137,695,714,715,717,720,725,727,728],[95,137,695,714,715,716,719,720,721,722,723,724,725,726,727,729],[95,137,695,718,719],[95,137,695,714],[95,137,721,727],[95,137,695,714,715,716,719,720,721,723,725,726],[95,137,695,718,723],[95,137,695,717],[95,137,714,719,720,723,726,727,730,752,753,758,759,762,764,765],[95,137,776],[95,137,766],[95,137,1326,1328,1329],[81,95,137,1060],[81,95,137,1091],[81,95,137,1060,1090],[81,95,137],[81,95,137,1090,1091,1092,1093,1094],[81,95,137,1090,1091,1092,1093,1094,1105],[81,95,137,1090,1091,1103,1104],[81,95,137,1060,1090,1104,1357],[81,95,137,1090,1091],[81,95,137,1090,1091,1508],[81,95,137,1060,1090,1356,1358,1359],[95,137,1364],[95,137,1037,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049],[95,137,1037,1038,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049],[95,137,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049],[95,137,1037,1038,1039,1041,1042,1043,1044,1045,1046,1047,1048,1049],[95,137,1037,1038,1039,1040,1042,1043,1044,1045,1046,1047,1048,1049],[95,137,1037,1038,1039,1040,1041,1043,1044,1045,1046,1047,1048,1049],[95,137,1037,1038,1039,1040,1041,1042,1044,1045,1046,1047,1048,1049],[95,137,1037,1038,1039,1040,1041,1042,1043,1045,1046,1047,1048,1049],[95,137,1037,1038,1039,1040,1041,1042,1043,1044,1046,1047,1048,1049],[95,137,1037,1038,1039,1040,1041,1042,1043,1044,1045,1047,1048,1049],[95,137,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1048,1049],[95,137,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1049],[95,137,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048],[95,137,1528],[95,134,137],[95,136,137],[137],[95,137,142,172],[95,137,138,143,149,150,157,169,180],[95,137,138,139,149,157],[90,91,92,95,137],[95,137,140,181],[95,137,141,142,150,158],[95,137,142,169,177],[95,137,143,145,149,157],[95,136,137,144],[95,137,145,146],[95,137,149],[95,137,147,149],[95,136,137,149],[95,137,149,150,151,169,180],[95,137,149,150,151,164,169,172],[95,132,137,185],[95,132,137,145,149,152,157,169,180],[95,137,149,150,152,153,157,169,177,180],[95,137,152,154,169,177,180],[93,94,95,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186],[95,137,149,155],[95,137,156,180],[95,137,145,149,157,169],[95,137,158],[95,137,159],[95,136,137,160],[95,134,135,136,137,138,139,140,141,142,143,144,145,146,147,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186],[95,137,162],[95,137,163],[95,137,149,164,165],[95,137,164,166,181,183],[95,137,149,169,170,172],[95,137,171,172],[95,137,169,170],[95,137,172],[95,137,173],[95,134,137,169],[95,137,149,175,176],[95,137,175,176],[95,137,142,157,169,177],[95,137,178],[95,137,157,179],[95,137,152,163,180],[95,137,142,181],[95,137,169,182],[95,137,156,183],[95,137,184],[95,137,142,149,151,160,169,180,183,185],[95,137,169,186],[81,95,137,190,192],[81,85,95,137,188,189,190,191,415,463],[81,95,137,1458],[81,85,95,137,189,192,415,463],[81,85,95,137,188,192,415,463],[79,80,95,137],[95,137,482,483],[95,137,482],[81,95,137,1095],[95,137,782],[95,137,780,782],[95,137,780],[95,137,782,846,847],[95,137,782,849],[95,137,782,850],[95,137,867],[95,137,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035],[95,137,782,943],[95,137,780,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206],[95,137,782,847,967],[95,137,780,964,965],[95,137,966],[95,137,782,964],[95,137,779,780,781],[81,95,137,264,1340,1341],[81,95,137,264,1340,1341,1342],[95,137,625],[95,137,467],[95,137,585,591,592,593],[95,137,592,595],[95,137,592,594,595,604,605],[95,137,592,594],[95,137,595,597],[95,137,595,596,598],[95,137,590],[95,137,606],[95,137,595],[95,137,592],[95,137,598],[95,137,1326,1327,1329,1330,1331,1332,1333,1334],[95,137,1408,1411,1414,1416,1417,1418],[95,137,1375,1403,1408,1411,1414,1416,1418,1455],[95,137,1375,1403,1408,1411,1414,1418,1455],[95,137,1441,1442,1446,1455],[95,137,1418,1441,1443,1446,1455],[95,137,1418,1441,1443,1445,1455],[95,137,1375,1403,1418,1441,1443,1444,1446,1455],[95,137,1443,1446,1447],[95,137,1418,1441,1443,1446,1448,1455],[95,137,1375,1403,1418,1441,1443,1446,1454,1455],[95,137,1365,1403,1418,1441,1443,1446,1455],[95,137,1365,1375,1376,1377,1401,1402,1403,1455],[95,137,1365,1376,1403],[95,137,1365,1375,1376,1403,1455],[95,137,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400],[95,137,1365,1369,1375,1377,1403,1455],[95,137,1419,1420,1440],[95,137,1375,1403,1441,1443,1446,1455],[95,137,1375,1403,1455],[95,137,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431,1432,1433,1434,1435,1436,1437,1438,1439],[95,137,1364,1375,1403,1455],[95,137,1408,1409,1410,1414,1418],[95,137,1408,1411,1414,1418],[95,137,1408,1411,1412,1413,1418],[95,137,1340],[87,95,137],[95,137,419],[95,137,426],[95,137,196,210,211,212,214,378],[95,137,196,200,202,203,204,205,206,367,378,380],[95,137,378],[95,137,211,230,347,356,374],[95,137,196],[95,137,193],[95,137,398],[95,137,378,380,397],[95,137,301,344,347,469],[95,137,311,326,356,373],[95,137,261],[95,137,361],[95,137,360,361,362],[95,137,360],[89,95,137,152,193,196,200,203,207,208,209,211,215,223,224,295,357,358,378,415],[95,137,196,213,250,298,378,394,395,469],[95,137,213,469],[95,137,224,298,299,378,469],[95,137,469],[95,137,196,213,214,469],[95,137,207,359,366],[95,137,163,264,374],[95,137,264,374],[81,95,137,264],[81,95,137,264,318],[95,137,241,259,374,452],[95,137,353,446,447,448,449,451],[95,137,264],[95,137,352],[95,137,352,353],[95,137,204,238,239,296],[95,137,240,241,296],[95,137,450],[95,137,241,296],[81,95,137,197,440],[81,95,137,180],[81,95,137,213,248],[81,95,137,213],[95,137,246,251],[81,95,137,247,418],[95,137,1315],[81,85,95,137,152,187,188,189,192,415,461,462],[95,137,152],[95,137,152,200,230,266,285,296,363,364,378,379,469],[95,137,223,365],[95,137,415],[95,137,195],[81,95,137,301,315,325,335,337,373],[95,137,163,301,315,334,335,336,373],[95,137,328,329,330,331,332,333],[95,137,330],[95,137,334],[81,95,137,247,264,418],[81,95,137,264,416,418],[81,95,137,264,418],[95,137,285,370],[95,137,370],[95,137,152,379,418],[95,137,322],[95,136,137,321],[95,137,225,229,236,267,296,308,310,311,312,314,346,373,376,379],[95,137,313],[95,137,225,241,296,308],[95,137,311,373],[95,137,311,318,319,320,322,323,324,325,326,327,338,339,340,341,342,343,373,374,469],[95,137,306],[95,137,152,163,225,229,230,235,237,241,271,285,294,295,346,369,378,379,380,415,469],[95,137,373],[95,136,137,211,229,295,308,309,369,371,372,379],[95,137,311],[95,136,137,235,267,288,302,303,304,305,306,307,310,373,374],[95,137,152,288,289,302,379,380],[95,137,211,285,295,296,308,369,373,379],[95,137,152,378,380],[95,137,152,169,376,379,380],[95,137,152,163,180,193,200,213,225,229,230,236,237,242,266,267,268,270,271,274,275,277,280,281,282,283,284,296,368,369,374,376,378,379,380],[95,137,152,169],[95,137,196,197,198,208,376,377,415,418,469],[95,137,152,169,180,227,396,398,399,400,401,469],[95,137,163,180,193,227,230,267,268,275,285,293,296,369,374,376,381,382,388,394,411,412],[95,137,207,208,223,295,358,369,378],[95,137,152,180,197,200,267,376,378,386],[95,137,300],[95,137,152,408,409,410],[95,137,376,378],[95,137,308,309],[95,137,229,267,368,418],[95,137,152,163,275,285,376,382,388,390,394,411,414],[95,137,152,207,223,394,404],[95,137,196,242,368,378,406],[95,137,152,213,242,378,389,390,402,403,405,407],[89,95,137,225,228,229,415,418],[95,137,152,163,180,200,207,215,223,230,236,237,267,268,270,271,283,285,293,296,368,369,374,375,376,381,382,383,385,387,418],[95,137,152,169,207,376,388,408,413],[95,137,218,219,220,221,222],[95,137,274,276],[95,137,278],[95,137,276],[95,137,278,279],[95,137,152,200,235,379],[95,137,152,163,195,197,225,229,230,236,237,263,265,376,380,415,418],[95,137,152,163,180,199,204,267,375,379],[95,137,302],[95,137,303],[95,137,304],[95,137,374],[95,137,226,233],[95,137,152,200,226,236],[95,137,232,233],[95,137,234],[95,137,226,227],[95,137,226,243],[95,137,226],[95,137,273,274,375],[95,137,272],[95,137,227,374,375],[95,137,269,375],[95,137,227,374],[95,137,346],[95,137,228,231,236,267,296,301,308,315,317,345,376,379],[95,137,241,252,255,256,257,258,259,316],[95,137,355],[95,137,211,228,229,289,296,311,322,326,348,349,350,351,353,354,357,368,373,378],[95,137,241],[95,137,263],[95,137,152,228,236,244,260,262,266,376,415,418],[95,137,241,252,253,254,255,256,257,258,259,416],[95,137,227],[95,137,289,290,293,369],[95,137,152,274,378],[95,137,288,311],[95,137,287],[95,137,283,289],[95,137,286,288,378],[95,137,152,199,289,290,291,292,378,379],[81,95,137,238,240,296],[95,137,297],[81,95,137,197],[81,95,137,374],[81,89,95,137,229,237,415,418],[95,137,197,440,441],[81,95,137,251],[81,95,137,163,180,195,245,247,249,250,418],[95,137,213,374,379],[95,137,374,384],[81,95,137,150,152,163,195,251,298,415,416,417],[81,95,137,188,189,192,415,463],[81,82,83,84,85,95,137],[95,137,142],[95,137,391,392,393],[95,137,391],[81,85,95,137,152,154,163,187,188,189,190,192,193,195,271,334,380,414,418,463],[95,137,428],[95,137,430],[95,137,432],[95,137,1316],[95,137,434],[95,137,436,437,438],[95,137,442],[86,88,95,137,420,425,427,429,431,433,435,439,443,445,454,455,457,467,468,469,470],[95,137,444],[95,137,453],[95,137,247],[95,137,456],[95,136,137,289,290,291,293,325,374,458,459,460,463,464,465,466],[95,137,187],[81,95,137,1055],[95,137,1056],[95,137,586,587,588,589],[95,137,587],[95,137,587,588],[95,137,1257],[95,137,1216],[95,137,1258],[95,137,1036,1139,1207,1256],[95,137,1216,1217,1257,1258],[95,137,1208,1209,1210,1211,1212,1213,1214,1215,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233,1234,1260],[81,95,137,1259,1265],[81,95,137,1265],[81,95,137,1217],[81,95,137,1259],[81,95,137,1213],[95,137,1236,1237,1238,1239,1240,1241,1242],[95,137,1265],[95,137,1267],[95,137,1111,1235,1243,1255,1259,1263,1265,1266,1268,1276,1283],[95,137,1244,1245,1246,1247,1248,1249,1250,1251,1252,1253,1254],[95,137,1257,1265],[95,137,1111,1228,1255,1256,1260,1261,1263],[95,137,1256,1261,1262,1264],[81,95,137,1111,1256,1257],[95,137,1256,1261],[81,95,137,1111,1235,1243,1255],[81,95,137,1217,1256,1258,1261,1262],[95,137,1269,1270,1271,1272,1273,1274,1275],[95,137,1406],[81,95,137,1365,1374,1403,1405],[95,137,1452],[95,137,1365,1369,1403,1451],[95,137,1415,1448,1449],[95,137,1450],[95,137,1456],[95,137,1374,1375,1403,1455],[95,137,1403,1404],[95,137,1365,1369,1374,1375,1403,1455],[95,137,169,187],[95,137,1371],[95,104,108,137,180],[95,104,137,169,180],[95,99,137],[95,101,104,137,177,180],[95,137,157,177],[95,99,137,187],[95,101,104,137,157,180],[95,96,97,100,103,137,149,169,180],[95,104,111,137],[95,96,102,137],[95,104,125,126,137],[95,100,104,137,172,180,187],[95,125,137,187],[95,98,99,137,187],[95,104,137],[95,98,99,100,101,102,103,104,105,106,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,137],[95,104,119,137],[95,104,111,112,137],[95,102,104,112,113,137],[95,103,137],[95,96,99,104,137],[95,104,108,112,113,137],[95,108,137],[95,102,104,107,137,180],[95,96,101,104,111,137],[95,137,169],[95,99,104,125,137,185,187],[95,137,1369,1373],[95,137,1364,1369,1370,1372,1374],[95,137,1499,1500],[81,95,137,264,1499],[95,137,1065,1066,1067,1068,1069,1070,1071,1073,1074,1075,1076,1077,1078,1079,1080],[95,137,1065],[95,137,1065,1072],[95,137,1366],[95,137,1367,1368],[95,137,1364,1367,1369],[95,137,658,659],[95,137,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671],[95,137,634,658,659],[95,137,634,636,658,659],[95,137,634,636,659],[95,137,634,636,640,659,660],[95,137,634],[95,137,634,659],[95,137,634,646,658,659],[95,137,659],[95,137,634,650,658,659],[95,137,634,643,658,659],[95,137,634,642,645,658,659],[95,137,635,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657],[95,137,634,658,660],[95,137,747],[95,137,737,738],[95,137,735,736,737,739,740,745],[95,137,736,737],[95,137,746],[95,137,737],[95,137,735,736,737,740,741,742,743,744],[95,137,735,736,747],[95,137,516],[95,137,507,508],[95,137,505,506,507,509,510,515],[95,137,506,507],[95,137,515],[95,137,507],[95,137,505,506,507,510,511,512,513,514],[95,137,505,506,517],[95,137,519,521,522,523,524],[95,137,519,521,523,524],[95,137,519,521,523],[95,137,519,521,522,524],[95,137,519,521,524],[95,137,519,520,521,522,523,524,525,526,566,567,568,569,570,571,572],[95,137,521,524],[95,137,518,519,520,522,523,524],[95,137,521,567,571],[95,137,521,522,523,524],[95,137,523],[95,137,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565],[95,137,1516],[95,137,1520],[95,137,1519],[95,137,1524],[95,137,1526,1527],[95,137,1328],[95,137,474],[95,137,467,478],[81,95,137,471,1317,1318],[81,95,137,491],[95,137,445],[81,95,137,491,1057,1084,1088,1110,1296,1322,1323,1325,1491,1492],[81,95,137,1084,1088,1098,1099,1286,1287,1288,1293,1303],[95,137,488,489,490],[81,95,137,477,487],[81,95,137,477,486,487],[81,95,137,477],[81,95,137,486,1051,1052,1102,1107,1108],[81,95,137,486,1051,1107,1108,1289],[81,95,137,481,484,486],[81,95,137,486,1051,1052,1284],[81,95,137,486],[81,95,137,484,486,1061],[81,95,137,486,1106],[81,95,137,486,1052,1291],[81,95,137,1052,1294,1304,1310,1323,1338],[81,95,137,1052,1294,1304,1310,1335],[81,95,137,487,777,778,1050,1052,1085,1338,1460,1472],[81,95,137,486,487,687,1050,1052,1343,1460,1468,1469],[95,137,486,487,777,1050,1057,1085,1471,1473,1475],[81,95,137,1052,1343,1361,1362],[95,137,1050,1468],[81,95,137,477,777,778,1050,1085,1088,1474],[81,95,137,777,1088,1470,1476],[95,137,501,687,777],[95,137,687,777,778,1036,1049],[81,95,137,477,486,487,491,501,1052,1057,1059,1062,1081,1083,1085,1087,1088,1308,1322,1343,1362,1478,1480,1481,1482,1483,1484,1485,1487,1488,1489],[81,95,137,486,687,1479],[81,95,137,454,487,490,501,502,1052,1057,1084,1096,1097,1481],[81,95,137,477,486,487,501,1052,1057,1059,1062,1081,1083,1085,1087,1088,1308,1322,1343,1362,1478,1480,1481,1482,1483,1484,1485,1487,1488,1489,1501],[81,95,137,486,1052,1362,1407,1450,1453,1457,1459],[81,95,137,486,501,502,687,1057,1088,1307,1322,1355,1363,1460,1466,1467,1477],[81,95,137,1052,1088,1096,1110,1306,1322,1323,1343,1466,1486],[81,95,137,477,486,501,502,1088,1309,1363,1472,1479],[81,95,137,1087,1088],[81,95,137,486,1052,1086,1088,1343,1487],[81,95,137,487,1052,1343,1362],[81,95,137,501,1052,1343],[81,95,137,443,486,687,1052],[81,95,137,486,487,1052,1296],[81,95,137,486,1057,1110,1336,1339,1490],[81,95,137,486,487,1361],[95,137,501],[81,95,137,486,1503],[81,95,137,484,486],[81,95,137,486,487,1052,1284],[81,95,137,486,1052,1100,1101],[81,95,137,486,1052,1095],[81,95,137,486,1061],[95,137,454,487,491,1052,1057,1059,1343,1362,1481],[81,95,137,486,487,1052,1058],[81,95,137,486,1337],[95,137,486],[95,137,1085,1324],[81,95,137,486,1506],[81,95,137,486,1509],[81,95,137,486,1360],[81,95,137,1051,1052,1088,1089],[81,95,137,443,486,1051,1052,1088,1089,1096,1097],[81,95,137,443,486],[95,137,1098,1099,1286,1287,1288,1293,1295,1297,1298,1299,1300,1301,1302,1303,1305],[81,95,137,1052,1294,1304],[81,95,137,443,486,1051,1052],[81,95,137,478,487,1052,1059,1085,1096,1294,1296],[81,95,137,487,1052,1059,1085,1096,1294],[81,95,137,1051,1096,1293],[81,95,137,443,486,1051,1052,1088,1089,1102,1107,1285,1289,1290,1292],[81,95,137,486,1051,1052,1088,1089,1107,1109,1110,1285],[81,95,137,486,1051,1052,1088,1089,1096],[81,95,137,1051,1088,1089],[81,95,137,486,1051,1088,1089,1096],[95,137,1085],[81,95,137,1052],[81,95,137,486,1051,1052,1088,1089,1096,1289],[81,95,137,687,1085,1309],[95,137,777],[95,137,501,1081],[95,137,1053],[81,95,137,501,687],[95,137,687,1085],[95,137,482,485],[81,95,137,1086],[81,95,137,487,501,1052,1054,1057,1058,1059,1062,1063,1064,1083,1084,1085,1087],[81,95,137,501,1057,1064,1081,1082,1083],[95,137,477],[95,137,748]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"e12a46ce14b817d4c9e6b2b478956452330bf00c9801b79de46f7a1815b5bd40","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"bab26767638ab3557de12c900f0b91f710c7dc40ee9793d5a27d32c04f0bf646","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d6a2092f48af66dbfb220e31eea8b10bc02b6932d6e529005fd2d7b3281290","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"742d4b7b02ffc3ba3c4258a3d196457da2b3fec0125872fd0776c50302a11b9d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"03566a51ebc848dec449a4ed69518e9f20caa6ac123fa32676aaaabe64adae8e","impliedFormat":1},{"version":"acd8fd5090ac73902278889c38336ff3f48af6ba03aa665eb34a75e7ba1dccc4","impliedFormat":1},{"version":"d6258883868fb2680d2ca96bc8b1352cab69874581493e6d52680c5ffecdb6cc","impliedFormat":1},{"version":"1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","impliedFormat":1},{"version":"f258e3960f324a956fc76a3d3d9e964fff2244ff5859dcc6ce5951e5413ca826","impliedFormat":1},{"version":"643f7232d07bf75e15bd8f658f664d6183a0efaca5eb84b48201c7671a266979","impliedFormat":1},{"version":"0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","impliedFormat":1},{"version":"05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","impliedFormat":1},{"version":"631eff75b0e35d1b1b31081d55209abc43e16b49426546ab5a9b40bdd40b1f60","impliedFormat":1},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"3b724a66c071d616203133f8d099a0cb881b0b43fd42e8621e611243c5f30cd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"a38efe83ff77c34e0f418a806a01ca3910c02ee7d64212a59d59bca6c2c38fa1","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"3fe4022ba1e738034e38ad9afacbf0f1f16b458ed516326f5bf9e4a31e9be1dc","impliedFormat":1},{"version":"a957197054b074bcdf5555d26286e8461680c7c878040d0f4e2d5509a7524944","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"e9b97d69510658d2f4199b7d384326b7c4053b9e6645f5c19e1c2a54ede427fc","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"f478f6f5902dc144c0d6d7bdc919c5177cac4d17a8ca8653c2daf6d7dc94317f","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"b200675fd112ffef97c166d0341fb33f6e29e9f27660adde7868e95c5bc98beb","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a0a1dda070290b92da5a50113b73ecc4dd6bcbffad66e3c86503d483eafbadcf","impliedFormat":1},{"version":"59dcad36c4549175a25998f6a8b33c1df8e18df9c12ebad1dfb25af13fd4b1ce","impliedFormat":1},{"version":"9ba5b6a30cb7961b68ad4fb18dca148db151c2c23b8d0a260fc18b83399d19d3","impliedFormat":1},{"version":"3f3edb8e44e3b9df3b7ca3219ab539710b6a7f4fe16bd884d441af207e03cd57","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"d71535813e39c23baa113bc4a29a0e187b87d1105ccc8c5a6ebaca38d9a9bff2","impliedFormat":1},{"version":"8cf7e92bdb2862c2d28ba4535c43dc599cfbc0025db5ed9973d9b708dcbe3d98","affectsGlobalScope":true,"impliedFormat":1},{"version":"278e70975bd456bba5874eaee17692355432e8d379b809a97f6af0eee2b702d8","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"636302a00dfd1f9fe6e8e91e4e9350c6518dcc8d51a474e4fc3a9ba07135100b","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"933921f0bb0ec12ef45d1062a1fc0f27635318f4d294e4d99de9a5493e618ca2","impliedFormat":1},{"version":"71a0f3ad612c123b57239a7749770017ecfe6b66411488000aba83e4546fde25","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"e1ce1d622f1e561f6cdf246372ead3bbc07ce0342024d0e9c7caf3136f712698","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"27e4532aaaa1665d0dd19023321e4dc12a35a741d6b8e1ca3517fcc2544e0efe","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"8c2ad42d5d1a2e8e6112625767f8794d9537f1247907378543106f7ba6c7df90","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"98ffdf93dfdd206516971d28e3e473f417a5cfd41172e46b4ce45008f640588e","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"12e8ce658dd17662d82fb0509d2057afc5e6ee30369a2e9e0957eff725b1f11d","affectsGlobalScope":true,"impliedFormat":1},{"version":"74736930d108365d7bbe740c7154706ccfb1b2a3855a897963ab3e5c07ecbf19","impliedFormat":1},{"version":"858f999b3e4a45a4e74766d43030941466460bf8768361d254234d5870480a53","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"3797dd6f4ea3dc15f356f8cdd3128bfa18122213b38a80d6c1f05d8e13cbdad8","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1},{"version":"865a2612f5ec073dd48d454307ccabb04c48f8b96fda9940c5ebfe6b4b451f51","impliedFormat":1},{"version":"70f79528d7e02028b3c12dd10764893b22df4c6e2a329e66456aa11bb304cabb","impliedFormat":1},{"version":"a0acca63c9e39580f32a10945df231815f0fe554c074da96ba6564010ffbd2d8","impliedFormat":1},{"version":"1be330b3a0b00590633f04c3b35db7fa618c9ee079258e2b24c137eb4ffcd728","impliedFormat":1},{"version":"0a5ab5c020557d3ccc84b92c0ca55ff790e886d92662aae668020d6320ab1867","impliedFormat":1},{"version":"413df52d4ea14472c2fa5bee62f7a40abd1eb49be0b9722ee01ee4e52e63beb2","impliedFormat":1},{"version":"db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","impliedFormat":1},{"version":"7bd32a723a12f78ed756747468f2030bdd55774c68f628de07598dba5b912b14","impliedFormat":1},{"version":"24f8562308dd8ba6013120557fa7b44950b619610b2c6cb8784c79f11e3c4f90","impliedFormat":1},{"version":"a1d3d6e9718cceaf1e4352845387af0620564d3d2dff02611a5c3276f73c26cb","impliedFormat":1},{"version":"a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","impliedFormat":1},{"version":"57d6ac03382e30e9213641ff4f18cf9402bb246b77c13c8e848c0b1ca2b7ef92","impliedFormat":1},{"version":"ce75b1aebb33d510ff28af960a9221410a3eaf7f18fc5f21f9404075fba77256","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"57e47d02e88abef89d214cdf52b478104dc17997015746e288cbb580beaef266","impliedFormat":1},{"version":"b1177acd771acfcc2648a03fc03ad3b3a1b1d2bdfa6769db0f669293b596ca13","impliedFormat":1},{"version":"3494c5bf00c1a40293ee5ff5128334b63d346abbf560c8987202c92dbc5bdc48","impliedFormat":1},{"version":"9e2739b32f741859263fdba0244c194ca8e96da49b430377930b8f721d77c000","impliedFormat":1},{"version":"99d62b942e98f691f508fc752637fec27661970aa3b0f5eb5a1e2775b995c273","impliedFormat":1},{"version":"a9af0e608929aaf9ce96bd7a7b99c9360636c31d73670e4af09a09950df97841","impliedFormat":1},{"version":"48d37b90a04e753a925228f50304d02c4f95d57bf682f8bb688621c3cd9d32ec","impliedFormat":1},{"version":"361e2b13c6765d7f85bb7600b48fde782b90c7c41105b7dab1f6e7871071ba20","impliedFormat":1},{"version":"c86fe861cf1b4c46a0fb7d74dffe596cf679a2e5e8b1456881313170f092e3fa","impliedFormat":1},{"version":"b6db56e4903e9c32e533b78ac85522de734b3d3a8541bf24d256058d464bf04b","impliedFormat":1},{"version":"24daa0366f837d22c94a5c0bad5bf1fd0f6b29e1fae92dc47c3072c3fdb2fbd5","impliedFormat":1},{"version":"b68c4ed987ef5693d3dccd85222d60769463aca404f2ffca1c4c42781dce388e","impliedFormat":1},{"version":"889c00f3d32091841268f0b994beba4dceaa5df7573be12c2c829d7c5fbc232c","impliedFormat":1},{"version":"65f43099ded6073336e697512d9b80f2d4fec3182b7b2316abf712e84104db00","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"12b8dfed70961bea1861e5d39e433580e71323abb5d33da6605182ec569db584","impliedFormat":1},{"version":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881","impliedFormat":1},{"version":"7e560f533aaf88cf9d3b427dcf6c112dd3f2ee26d610e2587583b6c354c753db","impliedFormat":1},{"version":"71e0082342008e4dfb43202df85ea0986ef8e003c921a1e49999d0234a3019da","impliedFormat":1},{"version":"27ab780875bcbb65e09da7496f2ca36288b0c541abaa75c311450a077d54ec15","impliedFormat":1},{"version":"b620391fe8060cf9bedc176a4d01366e6574d7a71e0ac0ab344a4e76576fcbb8","impliedFormat":1},{"version":"380647d8f3b7f852cca6d154a376dbf8ac620a2f12b936594504a8a852e71d2f","impliedFormat":1},{"version":"3e7efde639c6a6c3edb9847b3f61e308bf7a69685b92f665048c45132f51c218","impliedFormat":1},{"version":"df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","impliedFormat":1},{"version":"ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","impliedFormat":1},{"version":"9c82171d836c47486074e4ca8e059735bf97b205e70b196535b5efd40cbe1bc5","impliedFormat":1},{"version":"94fe3281392e1015b22f39535878610b4fa6f1388dc8d78746be3bc4e4bb8950","impliedFormat":1},{"version":"106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","impliedFormat":1},{"version":"ce41407ff95aad31e28897741dfffb236d966eb38894f7a791c3a575b53f9d02","impliedFormat":1},{"version":"fac1803c07fbc9574815fdb83afddd9d0d4a2ce13f56d4e4cbb4525f8c09ee0a","impliedFormat":1},{"version":"824c76aec8d8c7e65769688cbee102238c0ef421ed6686f41b2a7d8e7e78a931","impliedFormat":1},{"version":"5eef43ef86c9c3945780211c2ce25cb9b66143a102713e56a2bea85163c5c3c7","impliedFormat":1},{"version":"a2a1cdf7273ad6641938a487ecf2fdd38f60abce41907817e44ab39e482e8739","impliedFormat":1},{"version":"c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","impliedFormat":1},{"version":"ca921bf56756cb6fe957f6af693a35251b134fb932dc13f3dfff0bb7106f80b4","impliedFormat":1},{"version":"4548fac59ea69a3ffd6c0285a4c53e0d736d936937b74297e3b5c4dfcd902419","impliedFormat":1},{"version":"4da246ee3b860278888dd51913e6407a09ca43530db886e7bec2a592c9b9bde6","impliedFormat":1},{"version":"8c05ac9ead787bfc3e144b88bdc7d1ad8c0c7f1cd8412ab58cd3e1208d1990af","impliedFormat":1},{"version":"a23185bc5ef590c287c28a91baf280367b50ae4ea40327366ad01f6f4a8edbc5","impliedFormat":1},{"version":"65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","impliedFormat":1},{"version":"9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","impliedFormat":1},{"version":"de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","impliedFormat":1},{"version":"c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","impliedFormat":1},{"version":"1ee45496b5f8bdee6f7abc233355898e5bf9bd51255db65f5ff7ede617ca0027","impliedFormat":1},{"version":"0c7c947ff881c4274c0800deaa0086971e0bfe51f89a33bd3048eaa3792d4876","affectsGlobalScope":true,"impliedFormat":1},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true,"impliedFormat":1},{"version":"dba114fb6a32b355a9cfc26ca2276834d72fe0e94cd2c3494005547025015369","impliedFormat":1},{"version":"a8f8e6ab2fa07b45251f403548b78eaf2022f3c2254df3dc186cb2671fe4996d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","impliedFormat":1},{"version":"f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b","impliedFormat":1},{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true,"impliedFormat":1},{"version":"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","impliedFormat":1},{"version":"15b36126e0089bfef173ab61329e8286ce74af5e809d8a72edcafd0cc049057f","impliedFormat":1},{"version":"ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","impliedFormat":1},{"version":"13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","impliedFormat":1},{"version":"2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","impliedFormat":1},{"version":"d07cbc787a997d83f7bde3877fec5fb5b12ce8c1b7047eb792996ed9726b4dde","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"8bba776476c48b0e319d243f353190f24096057acede3c2f620fee17ff885dba","impliedFormat":1},{"version":"b83cb14474fa60c5f3ec660146b97d122f0735627f80d82dd03e8caa39b4388c","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"2b2f9dac86b659e6d5cd623bcc21519910a48114fc0cef52d8f86962c48d44e2","impliedFormat":1},{"version":"7e8b76334c75984d57a810a0652c61066ffacede59001dfc5c633565f791ee60","impliedFormat":1},{"version":"72ca9ca89ca15055cbb6ce767b6bf56615be5f1ea6a87ab432ee0603c8d19010","impliedFormat":1},{"version":"7274fbffbd7c9589d8d0ffba68157237afd5cecff1e99881ea3399127e60572f","impliedFormat":1},{"version":"b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","impliedFormat":1},{"version":"bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","impliedFormat":1},{"version":"208c9af9429dd3c76f5927b971263174aaa4bc7621ddec63f163640cbd3c473c","impliedFormat":1},{"version":"20865ac316b8893c1a0cc383ccfc1801443fbcc2a7255be166cf90d03fac88c9","impliedFormat":1},{"version":"c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","impliedFormat":1},{"version":"d682336018141807fb602709e2d95a192828fcb8d5ba06dda3833a8ea98f69e3","impliedFormat":1},{"version":"461d0ad8ae5f2ff981778af912ba71b37a8426a33301daa00f21c6ccb27f8156","impliedFormat":1},{"version":"e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","impliedFormat":1},{"version":"fcafff163ca5e66d3b87126e756e1b6dfa8c526aa9cd2a2b0a9da837d81bbd72","impliedFormat":1},{"version":"70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","impliedFormat":1},{"version":"f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","impliedFormat":1},{"version":"772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","impliedFormat":1},{"version":"45490817629431853543adcb91c0673c25af52a456479588b6486daba34f68bb","impliedFormat":1},{"version":"802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","impliedFormat":1},{"version":"b01bd582a6e41457bc56e6f0f9de4cb17f33f5f3843a7cf8210ac9c18472fb0f","impliedFormat":1},{"version":"8b4327413e5af38cd8cb97c59f48c3c866015d5d642f28518e3a891c469f240e","impliedFormat":1},{"version":"cecad464ddaf764e5490018d248a8df1733f3d63435fbddac72941c1f4005b66","impliedFormat":1},{"version":"6124e973eab8c52cabf3c07575204efc1784aca6b0a30c79eb85fe240a857efa","impliedFormat":1},{"version":"0d891735a21edc75df51f3eb995e18149e119d1ce22fd40db2b260c5960b914e","impliedFormat":1},{"version":"3b414b99a73171e1c4b7b7714e26b87d6c5cb03d200352da5342ab4088a54c85","impliedFormat":1},{"version":"51b1709e7ad186919a0e30237a8607100143a86d28771b3d3f046359aca1e65c","impliedFormat":1},{"version":"0a437ae178f999b46b6153d79095b60c42c996bc0458c04955f1c996dc68b971","impliedFormat":1},{"version":"74b2a5e5197bd0f2e0077a1ea7c07455bbea67b87b0869d9786d55104006784f","impliedFormat":1},{"version":"4a7baeb6325920044f66c0f8e5e6f1f52e06e6d87588d837bdf44feb6f35c664","impliedFormat":1},{"version":"6dcf60530c25194a9ee0962230e874ff29d34c59605d8e069a49928759a17e0a","impliedFormat":1},{"version":"56013416784a6b754f3855f8f2bf6ce132320679b8a435389aca0361bce4df6b","impliedFormat":1},{"version":"43e96a3d5d1411ab40ba2f61d6a3192e58177bcf3b133a80ad2a16591611726d","impliedFormat":1},{"version":"224e9eedb2ea67e27f28d699b19b1d966e9320e9ea8ac233b2a31dbd753b0dfe","impliedFormat":1},{"version":"002eae065e6960458bda3cf695e578b0d1e2785523476f8a9170b103c709cd4f","impliedFormat":1},{"version":"c51641ab4bfa31b7a50a0ca37edff67f56fab3149881024345b13f2b48b7d2de","impliedFormat":1},{"version":"a57b1802794433adec9ff3fed12aa79d671faed86c49b09e02e1ac41b4f1d33a","impliedFormat":1},{"version":"52abbd5035a97ebfb4240ec8ade2741229a7c26450c84eb73490dc5ea048b911","impliedFormat":1},{"version":"1042064ece5bb47d6aba91648fbe0635c17c600ebdf567588b4ca715602f0a9d","impliedFormat":1},{"version":"4360ad4de54de2d5c642c4375d5eab0e7fe94ebe8adca907e6c186bbef75a54d","impliedFormat":1},{"version":"4a889f2c763edb4d55cb624257272ac10d04a1cad2ed2948b10ed4a7fda2a428","impliedFormat":1},{"version":"7bb79aa2fead87d9d56294ef71e056487e848d7b550c9a367523ee5416c44cfa","impliedFormat":1},{"version":"9c9cae45dc94c2192c7d25f80649414fa13c425d0399a2c7cb2b979e4e50af42","impliedFormat":1},{"version":"6c87b6bcf4336b29c837ea49afbdde69cc15a91cbbfd9f20c0af8694927dec08","impliedFormat":1},{"version":"27ff4196654e6373c9af16b6165120e2dd2169f9ad6abb5c935af5abd8c7938c","impliedFormat":1},{"version":"6dd9bcf10678b889842d467706836a0ab42e6c58711e33918ed127073807ee65","impliedFormat":1},{"version":"8c030e515014c10a2b98f9f48408e3ba18023dfd3f56e3312c6c2f3ae1f55a16","impliedFormat":1},{"version":"dafc31e9e8751f437122eb8582b93d477e002839864410ff782504a12f2a550c","impliedFormat":1},{"version":"ef9efc827cdad89c4ee54142164c793f530aa4d844ca9121cc35368310d5fb9c","impliedFormat":1},{"version":"643672ce383e1c58ea665a92c5481f8441edbd3e91db36e535abccbc9035adeb","impliedFormat":1},{"version":"8fa022ea514ce0ea78ac9b7092a9f97f08ead20c839c779891019e110fce8307","impliedFormat":1},{"version":"c93235337600b786fd7d0ff9c71a00f37ca65c4d63e5d695fc75153be2690f09","impliedFormat":1},{"version":"fa45f48f2def181ab2fb107a032c91b6c043ad05a179f3fbaafb8e5411fd01e4","impliedFormat":1},{"version":"a8e493c0355aabdd495e141bf1c4ec93454a0698c8675df466724adc2fcfe630","impliedFormat":1},{"version":"99702c9058170ae70ea72acbf01be3111784f06152dbf478f52c9afe423528bd","impliedFormat":1},{"version":"cf32f58a7ad3498c69c909121772971ffdee176b882f39c78532d0e0ab41a30d","impliedFormat":1},{"version":"e2bbc579a2fda9473e06b2a68d693e56928900f73ccfc03dabea789fe144e8a5","impliedFormat":1},{"version":"ce0df82a9ae6f914ba08409d4d883983cc08e6d59eb2df02d8e4d68309e7848b","impliedFormat":1},{"version":"796273b2edc72e78a04e86d7c58ae94d370ab93a0ddf40b1aa85a37a1c29ecd7","impliedFormat":1},{"version":"5df15a69187d737d6d8d066e189ae4f97e41f4d53712a46b2710ff9f8563ec9f","impliedFormat":1},{"version":"e17cd049a1448de4944800399daa4a64c5db8657cc9be7ef46be66e2a2cd0e7c","impliedFormat":1},{"version":"d05fb434f4ba073aed74b6c62eff1723c835de2a963dbb091e000a2decb5a691","impliedFormat":1},{"version":"bff8c8bffbf5f302a30ccb1c0557dae477892d50a80eecfe393bd89bac7fb41d","impliedFormat":1},{"version":"43ba4f2fa8c698f5c304d21a3ef596741e8e85a810b7c1f9b692653791d8d97a","impliedFormat":1},{"version":"4d4927cbee21750904af7acf940c5e3c491b4d5ebc676530211e389dd375607a","impliedFormat":1},{"version":"72105519d0390262cf0abe84cf41c926ade0ff475d35eb21307b2f94de985778","impliedFormat":1},{"version":"8a97e578a9bc40eb4f1b0ca78f476f2e9154ecbbfd5567ee72943bab37fc156a","impliedFormat":1},{"version":"a58abf1f5c8feb335475097abeddd32fd71c4dc2065a3d28cf15cacabad9654a","impliedFormat":1},{"version":"ccf6dd45b708fb74ba9ed0f2478d4eb9195c9dfef0ff83a6092fa3cf2ff53b4f","impliedFormat":1},{"version":"2d7db1d73456e8c5075387d4240c29a2a900847f9c1bff106a2e490da8fbd457","impliedFormat":1},{"version":"2b15c805f48e4e970f8ec0b1915f22d13ca6212375e8987663e2ef5f0205e832","impliedFormat":1},{"version":"f22d05663d873ee7a600faf78abb67f3f719d32266803440cf11d5db7ac0cab2","impliedFormat":1},{"version":"f0f05149debcf31b3a717ce8dd16e0323a789905cb9e27239167b604153b8885","impliedFormat":1},{"version":"35069c2c417bd7443ae7c7cafd1de02f665bf015479fec998985ffbbf500628c","impliedFormat":1},{"version":"b4f4d239a6632b86b315a6e4cfe0fac4e4bf6c934263bc07dd2bf5c7dbb8e6a5","impliedFormat":1},{"version":"0d44227395ae4a117dd7c8c9a048e18ade1f1f631bc5b883f9d469126e3cedab","impliedFormat":1},{"version":"9e21f8e2c0cfea713a4a372f284b60089c0841eb90bf3610539d89dbcd12d65a","impliedFormat":1},{"version":"045b752f44bf9bbdcaffd882424ab0e15cb8d11fa94e1448942e338c8ef19fba","impliedFormat":1},{"version":"2894c56cad581928bb37607810af011764a2f511f575d28c9f4af0f2ef02d1ab","impliedFormat":1},{"version":"0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","impliedFormat":1},{"version":"a072c5f254d5cbb6522c0d4eeeb7cc4a6ce7f2f8ad84e2593d903bfe3aa44176","impliedFormat":1},{"version":"52b390f86821086a1be50100487faa9f7b23fc04343efb590f304382b4950e04","impliedFormat":1},{"version":"87122b31fe473758a5724388c93826caab566f62be2196aefc2ae8b04b814b52","impliedFormat":1},{"version":"063ab26d3488a665d2c3bc963b18ce220dad7351190629179165bc8c499c6cd9","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"2652448ac55a2010a1f71dd141f828b682298d39728f9871e1cdf8696ef443fd","impliedFormat":1},{"version":"fb400501bee56d86fa9b490e9d8b07d7df163d34d8235fcea27c3f9e8d064d1a","impliedFormat":1},{"version":"120599fd965257b1f4d0ff794bc696162832d9d8467224f4665f713a3119078b","impliedFormat":1},{"version":"5433f33b0a20300cca35d2f229a7fc20b0e8477c44be2affeb21cb464af60c76","impliedFormat":1},{"version":"db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","impliedFormat":1},{"version":"bd4131091b773973ca5d2326c60b789ab1f5e02d8843b3587effe6e1ea7c9d86","impliedFormat":1},{"version":"794998dc1c5a19ce77a75086fe829fb9c92f2fd07b5631c7d5e0d04fd9bc540c","impliedFormat":1},{"version":"409678793827cdf5814e027b1f9e52a0445acb1c322282311c1c4e0855a0918e","impliedFormat":1},{"version":"6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","impliedFormat":1},{"version":"0427df5c06fafc5fe126d14b9becd24160a288deff40e838bfbd92a35f8d0d00","impliedFormat":1},{"version":"3545dc8a9bdbd33db34462af7eed83f703083e4fee9135dadbba7edfe1e7db3c","impliedFormat":1},{"version":"7b5153a9b237898879441e5ddb576ded76ef3ab4c5baee4bb749ca5c72fc395d","impliedFormat":1},{"version":"49c346823ba6d4b12278c12c977fb3a31c06b9ca719015978cb145eb86da1c61","impliedFormat":1},{"version":"bfac6e50eaa7e73bb66b7e052c38fdc8ccfc8dbde2777648642af33cf349f7f1","impliedFormat":1},{"version":"92f7c1a4da7fbfd67a2228d1687d5c2e1faa0ba865a94d3550a3941d7527a45d","impliedFormat":1},{"version":"f53b120213a9289d9a26f5af90c4c686dd71d91487a0aa5451a38366c70dc64b","impliedFormat":1},{"version":"83fe880c090afe485a5c02262c0b7cdd76a299a50c48d9bde02be8e908fb4ae6","impliedFormat":1},{"version":"d5c2934185201f0768fb80d220f0e617cd05aa4c0c791ffcd508646c474b3c44","impliedFormat":1},{"version":"57d67b72e06059adc5e9454de26bbfe567d412b962a501d263c75c2db430f40e","impliedFormat":1},{"version":"6511e4503cf74c469c60aafd6589e4d14d5eb0a25f9bf043dcbecdf65f261972","impliedFormat":1},{"version":"e326c507507d6c6f3df4152e9e132a6189b30e14a262782796c2a627ba5d42cc","impliedFormat":1},{"version":"75efc43fb206f3825eb219c96b1e59fdabf2f2f042f424fa5f96335b99897540","impliedFormat":1},{"version":"a67b87d0281c97dfc1197ef28dfe397fc2c865ccd41f7e32b53f647184cc7307","impliedFormat":1},{"version":"771ffb773f1ddd562492a6b9aaca648192ac3f056f0e1d997678ff97dbb6bf9b","impliedFormat":1},{"version":"232f70c0cf2b432f3a6e56a8dc3417103eb162292a9fd376d51a3a9ea5fbbf6f","impliedFormat":1},{"version":"ca651584d8d718c1f0655ec4b0c340fbcd967ec1e1758807af3a3f43bc81f81e","impliedFormat":1},{"version":"cfb5f0ab72180f4e0b9ed1534847a63d5394b9a8ee685ae149d25fd53f1aec66","impliedFormat":1},{"version":"8a0e762ceb20c7e72504feef83d709468a70af4abccb304f32d6b9bac1129b2c","impliedFormat":1},{"version":"f613e4e752659ebd241be4d991c05200248b50e753fcecf50a249d30f4367794","impliedFormat":1},{"version":"9252d498a77517aab5d8d4b5eb9d71e4b225bbc7123df9713e08181de63180f6","impliedFormat":1},{"version":"de1ccef0cb3623291d55871e39eb7005cb79d8da519cb46959b0ba5e2422184f","impliedFormat":1},{"version":"35e6379c3f7cb27b111ad4c1aa69538fd8e788ab737b8ff7596a1b40e96f4f90","impliedFormat":1},{"version":"1fffe726740f9787f15b532e1dc870af3cd964dbe29e191e76121aa3dd8693f2","impliedFormat":1},{"version":"7cd657e359eac7829db5f02c856993e8945ffccc71999cdfb4ab3bf801a1bbc6","impliedFormat":1},{"version":"1a82deef4c1d39f6882f28d275cad4c01f907b9b39be9cbc472fcf2cf051e05b","impliedFormat":1},{"version":"4b20fcf10a5413680e39f5666464859fc56b1003e7dfe2405ced82371ebd49b6","impliedFormat":1},{"version":"f0f3f57e29b40e9cb0c4b155a96de2f61e51700d2c335dd547ef3c85e668c6a8","impliedFormat":1},{"version":"f7d628893c9fa52ba3ab01bcb5e79191636c4331ee5667ecc6373cbccff8ae12","impliedFormat":1},{"version":"0afb5274275ea76a4082a46597d1d23f7fede2887e591d8e02f9874934912c6f","impliedFormat":1},{"version":"6a76daf108400ca1333e325772f24f40ebdde2120ef68f8c87d7a1adf0257541","impliedFormat":1},{"version":"313698394e61f0343ebf11b64e5cde7e948110eaba98e8dbd7bdd67ee8df2639","impliedFormat":1},{"version":"6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","impliedFormat":1},{"version":"bb37588926aba35c9283fe8d46ebf4e79ffe976343105f5c6d45f282793352b2","impliedFormat":1},{"version":"05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","impliedFormat":1},{"version":"72179f9dd22a86deaad4cc3490eb0fe69ee084d503b686985965654013f1391b","impliedFormat":1},{"version":"2e6114a7dd6feeef85b2c80120fdbfb59a5529c0dcc5bfa8447b6996c97a69f5","impliedFormat":1},{"version":"7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","impliedFormat":1},{"version":"c8f004e6036aa1c764ad4ec543cf89a5c1893a9535c80ef3f2b653e370de45e6","impliedFormat":1},{"version":"91357dba2d5a7234ccfae834dc8363b5635e08f373bd18f548a9046b01864619","impliedFormat":1},{"version":"f31bbb122869d8903ff13c1036bdefc1e6a5bac9b2c3c35e42a9de84d43cd04a","impliedFormat":1},{"version":"c7fdbcfa0991e15215e2a5751676115cac943b39289791546c7197d7bb889c51","impliedFormat":1},{"version":"f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","impliedFormat":1},{"version":"50256e9c31318487f3752b7ac12ff365c8949953e04568009c8705db802776fb","impliedFormat":1},{"version":"7d73b24e7bf31dfb8a931ca6c4245f6bb0814dfae17e4b60c9e194a631fe5f7b","impliedFormat":1},{"version":"4eac446ac161245bfc6daa95f2cc64d2da4f7844e36a7a5641abfd4771ef0923","impliedFormat":1},{"version":"8de9fe97fa9e00ec00666fa77ab6e91b35d25af8ca75dabcb01e14ad3299b150","impliedFormat":1},{"version":"076527b1c2fd207de3101ba10e0c2b7d155aa8369cc7fe3eed723811e428223d","impliedFormat":1},{"version":"6c800b281b9e89e69165fd11536195488de3ff53004e55905e6c0059a2d8591e","impliedFormat":1},{"version":"7d4254b4c6c67a29d5e7f65e67d72540480ac2cfb041ca484847f5ae70480b62","impliedFormat":1},{"version":"397f568f996f8ffcf12d9156342552b0da42f6571eadba6bce61c99e1651977d","impliedFormat":1},{"version":"ff0c0d446569f8756be0882b520fd94429468de9f922ab6bf9eed4da55eb0187","impliedFormat":1},{"version":"d663134457d8d669ae0df34eabd57028bddc04fc444c4bc04bc5215afc91e1f4","impliedFormat":1},{"version":"a52674bc98da7979607e0f44d4c015c59c1b1d264c83fc50ec79ff2cfea06723","impliedFormat":1},{"version":"89b3d1b267c4380fbb8e5cadccbb284843b90066f16a2f6e8a5b3a030bb7dcfb","impliedFormat":1},{"version":"f58226e78464f9c85be6cf47c665a8e33b32121ab4cdb2670b66a06f1114a55c","impliedFormat":1},{"version":"9b06ce81ad598c9c6b011cb66182fa66575ad6bd1f8f655830a6a0223a197ab7","impliedFormat":1},{"version":"e108f38a04a607f9386d68a4c6f3fdae1b712960f11f6482c6f1769bab056c2e","impliedFormat":1},{"version":"a3128a84a9568762a2996df79717d92154d18dd894681fc0ab3a098fa7f8ee3b","affectsGlobalScope":true,"impliedFormat":1},{"version":"347791f3792f436950396dd6171d6450234358001ae7c94ca209f1406566ccbf","impliedFormat":1},{"version":"dd80b1e600d00f5c6a6ba23f455b84a7db121219e68f89f10552c54ba46e4dc9","impliedFormat":1},{"version":"2896c2e673a5d3bd9b4246811f79486a073cbb03950c3d252fba10003c57411a","impliedFormat":1},{"version":"616775f16134fa9d01fc677ad3f76e68c051a056c22ab552c64cc281a9686790","impliedFormat":1},{"version":"65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","impliedFormat":1},{"version":"f9fe6af238339a0e5f7563acee3178f51db37f32a2e7c09f85273098cee7ec49","impliedFormat":1},{"version":"51bf55bb6eb80f11b3aa59fb0a9571565a7ea304a19381f6da5630f4b2e206c4","impliedFormat":1},{"version":"77e71242e71ebf8528c5802993697878f0533db8f2299b4d36aa015bae08a79c","impliedFormat":1},{"version":"98a787be42bd92f8c2a37d7df5f13e5992da0d967fab794adbb7ee18370f9849","impliedFormat":1},{"version":"5c96bad5f78466785cdad664c056e9e2802d5482ca5f862ed19ba34ffbb7b3a4","impliedFormat":1},{"version":"b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","impliedFormat":1},{"version":"5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","impliedFormat":1},{"version":"bb0cd7862b72f5eba39909c9889d566e198fcaddf7207c16737d0c2246112678","impliedFormat":1},{"version":"4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","impliedFormat":1},{"version":"320f4091e33548b554d2214ce5fc31c96631b513dffa806e2e3a60766c8c49d9","impliedFormat":1},{"version":"a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","impliedFormat":1},{"version":"d90d5f524de38889d1e1dbc2aeef00060d779f8688c02766ddb9ca195e4a713d","impliedFormat":1},{"version":"a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","impliedFormat":1},{"version":"bad68fd0401eb90fe7da408565c8aee9c7a7021c2577aec92fa1382e8876071a","impliedFormat":1},{"version":"47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","impliedFormat":1},{"version":"fec01479923e169fb52bd4f668dbeef1d7a7ea6e6d491e15617b46f2cacfa37d","impliedFormat":1},{"version":"8a8fb3097ba52f0ae6530ec6ab34e43e316506eb1d9aa29420a4b1e92a81442d","impliedFormat":1},{"version":"44e09c831fefb6fe59b8e65ad8f68a7ecc0e708d152cfcbe7ba6d6080c31c61e","impliedFormat":1},{"version":"1c0a98de1323051010ce5b958ad47bc1c007f7921973123c999300e2b7b0ecc0","impliedFormat":1},{"version":"4655709c9cb3fd6db2b866cab7c418c40ed9533ce8ea4b66b5f17ec2feea46a9","impliedFormat":1},{"version":"87affad8e2243635d3a191fa72ef896842748d812e973b7510a55c6200b3c2a4","impliedFormat":1},{"version":"ad036a85efcd9e5b4f7dd5c1a7362c8478f9a3b6c3554654ca24a29aa850a9c5","impliedFormat":1},{"version":"fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","impliedFormat":1},{"version":"22b87e96a61c525464e115db0148593a861e77806fd37ab280e1903019a6e212","impliedFormat":1},{"version":"cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","impliedFormat":1},{"version":"330896c1a2b9693edd617be24fbf9e5895d6e18c7955d6c08f028f272b37314d","impliedFormat":1},{"version":"1d9c0a9a6df4e8f29dc84c25c5aa0bb1da5456ebede7a03e03df08bb8b27bae6","impliedFormat":1},{"version":"84380af21da938a567c65ef95aefb5354f676368ee1a1cbb4cae81604a4c7d17","impliedFormat":1},{"version":"1af3e1f2a5d1332e136f8b0b95c0e6c0a02aaabd5092b36b64f3042a03debf28","impliedFormat":1},{"version":"30d8da250766efa99490fc02801047c2c6d72dd0da1bba6581c7e80d1d8842a4","impliedFormat":1},{"version":"03566202f5553bd2d9de22dfab0c61aa163cabb64f0223c08431fb3fc8f70280","impliedFormat":1},{"version":"9a01f12466488eccd8d9eafc8fecb9926c175a4bf4a8f73a07c3bcf8b3363282","impliedFormat":1},{"version":"b80f624162276f24a4ec78b8e86fbee80ca255938e12f8b58e7a8f1a6937120b","impliedFormat":1},{"version":"1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","impliedFormat":1},{"version":"1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","impliedFormat":1},{"version":"5bf5c7a44e779790d1eb54c234b668b15e34affa95e78eada73e5757f61ed76a","impliedFormat":1},{"version":"5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","impliedFormat":1},{"version":"5c634644d45a1b6bc7b05e71e05e52ec04f3d73d9ac85d5927f647a5f965181a","impliedFormat":1},{"version":"4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","impliedFormat":1},{"version":"27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","impliedFormat":1},{"version":"b95a6f019095dd1d48fd04965b50dfd63e5743a6e75478343c46d2582a5132bf","impliedFormat":99},{"version":"c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","impliedFormat":99},{"version":"a61e739f0b2c0165086c77a28d7e4b58a2a8703c646cd1e1641788484afc6ff2","impliedFormat":99},{"version":"63a7595a5015e65262557f883463f934904959da563b4f788306f699411e9bac","impliedFormat":1},{"version":"9e40365afca304124bc53eb03412643abf074a1580e4dc279a7a16000d11f985","impliedFormat":1},{"version":"4ba137d6553965703b6b55fd2000b4e07ba365f8caeb0359162ad7247f9707a6","impliedFormat":1},{"version":"ceec3c81b2d81f5e3b855d9367c1d4c664ab5046dff8fd56552df015b7ccbe8f","affectsGlobalScope":true,"impliedFormat":1},{"version":"4e18cfe14fa8602c7ff80cbbddb91e31608e5ae20bd361fe7e6a607706cb033c","affectsGlobalScope":true,"impliedFormat":1},{"version":"a1219ee18b9282b4c6a31f1f0bcc9255b425e99363268ba6752a932cf76662f0","impliedFormat":1},{"version":"3dc14e1ab45e497e5d5e4295271d54ff689aeae00b4277979fdd10fa563540ae","impliedFormat":1},{"version":"1d63055b690a582006435ddd3aa9c03aac16a696fac77ce2ed808f3e5a06efab","impliedFormat":1},{"version":"b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","impliedFormat":1},"9a964c445118d72402f630b029a9f48cb1b5682c49df14ec08e66513096929ec",{"version":"79f6d5e4ba721ae31342781517ae91ad0170bdcde5fb541ed598948684b656e5","impliedFormat":99},{"version":"302209b02e712e4c9b0bf77853d182788b995fad4599e51c0f12bd47968544ae","signature":"9a2e94eeebde80a2034850148d27ac31d9c13371c12034d4e3bf28d9f31d4739"},{"version":"9c58383d80ea24e28ac016e4600a14f67e0873e0c8c03143da91fa30276ccbde","signature":"61f458cea07e8aead31c99a23941534367f74c7083a153de969058cec45360e1"},{"version":"32cc630dab5f100d0424624d9810b8e99f95714072f56261f5c77ddc49df88cf","signature":"c6566860697bdcbb1562b25d74e26a54691fac72a1ae403b1f75844cecf86e12"},{"version":"6925bee1c39a21af8911bb78092010e4e0ad04905fbaaf20c229a67b27892304","signature":"0e193b4984b086ab54abe4daec00f1e57d76098e2cca5c845db03a44c22a54db"},{"version":"836c71bdedee48406dcb502ec5b28ca6f009b36cdfed9f1fc56fa5c0962a69fe","signature":"606f98efb4eef0000ec4dbaa76e7c18475cc4319ffd06e370934ef5ac3d998aa"},{"version":"7a491af42c68ab9bbd44fc48a6fc2e191933e1fbf867712eda669d1a80f1faeb","signature":"5ae428d5518465a0c6ebb7b360291bc15dd92cca46d093e7782790038716813b"},{"version":"a80ec72f5e178862476deaeed532c305bdfcd3627014ae7ac2901356d794fc93","impliedFormat":99},{"version":"c57b441e0c0a9cbdfa7d850dae1f8a387d6f81cbffbc3cd0465d530084c2417d","impliedFormat":99},{"version":"2fbe402f0ee5aa8ab55367f88030f79d46211c0a0f342becaa9f648bf8534e9d","impliedFormat":1},{"version":"b94258ef37e67474ac5522e9c519489a55dcb3d4a8f645e335fc68ea2215fe88","impliedFormat":1},{"version":"8b15d05f236e8537d3ecbe4422ce46bf0de4e4cd40b2f909c91c5818af4ff17a","impliedFormat":1},{"version":"59701d26164cee86b8334af73eda40fb791e759840ec308e4fb37b943c04d979","signature":"3f3c78ff021eed31afacbc9215a251ad8e8edcd7928bc9d2a230e941f80ed72b"},{"version":"a1e4afff1d51d6359b86f2a0b261e6c796445edab6286d8ee515eca7689b047e","signature":"c72c5e0ae54a7675b294563f023d15d3f1bbd824ed1610dd40da077d587ee154"},{"version":"0edcc6263f4178a74f8af885ac789541529afff4dcb5c40d2fdc42863f451862","signature":"668cde7d52acf462f3db47292f324ab4fbd3ba8e7c715ff2c95e21995b2d6547"},{"version":"90e5b5545e7089bda0e4e8f745e17214146e2a1b153d30976befd015f29db62c","signature":"4c1887023d78b7d5d910c6c8775ef6fb704ff25160c70adfd033f8c05d902c6a"},{"version":"08e64310673cc6aec90e946d023fae6a01c103e246c147fce86a8d684fa1e77e","signature":"62f31d0bfe54782b023dc3f72a981018b390f93af40f7b401480111030d24be4"},{"version":"11ea6fdec6352074466756ccd8530adc9b930535b8796b7e71e3effa8c2ca0b0","signature":"5b6ea5efc16278df55a3d921efb06b168b6a2b2318ba602ccb3f380fccb0d124"},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"34e854192cccc958421e27007c5b4257497d83f1f3ef223ff887cf7b4437ebdf","impliedFormat":99},{"version":"37085b1ddaf5f0bb8927792fa323168899496f3e1f8f561b0a509f4e3c6f22ac","impliedFormat":99},{"version":"73c75faa70481d9e5da05e478f0e9b90510ac14b3e3941a7f2a55dbbaf4f7bd7","impliedFormat":99},{"version":"bcaa27ccdb568c4164457c1d6872bb6671d24e22a6c1d5c2be81961903320016","impliedFormat":99},{"version":"b5a50f4a7703426ae26461bf6cb20d52d47853bf714f22797c050c047a6edff2","impliedFormat":99},{"version":"343c099c21e10bfe9e28d28ddf3e22b480ae8e159f73fef82ff697e890f7ce9d","impliedFormat":99},{"version":"7c7a8b6ac82fd8866595df6879aa845496367fbc65fad7fb23a9795a4865bb5c","impliedFormat":99},{"version":"a2c3ec177382c64fe2645bb219dca2644a58f8f7310574420525c1da81b0ecd2","impliedFormat":99},{"version":"c98517664512e9f8bc990db01c296a4d667a53cef785bd5cbc4c4298dbded589","impliedFormat":99},{"version":"51122eb2a1f5c4d64f2359d8ebbffbdf400a135633eba91b268177b59b9d8523","signature":"e95f5bea53b4c1a780728edbcb7bc50fabc4248d7c1164480190006d72267428"},{"version":"e041c6f9649b1566f851a5dc822b58c599d18d3daf737c6b43850008a98e708e","impliedFormat":99},{"version":"4dc2ad909582f0f07b5308464940471a46dab85d41e713ed109e9502caa7dc49","impliedFormat":99},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"293eadad9dead44c6fd1db6de552663c33f215c55a1bfa2802a1bceed88ff0ec","impliedFormat":1},{"version":"08b2fae7b0f553ad9f79faec864b179fc58bc172e295a70943e8585dd85f600c","impliedFormat":1},{"version":"f12edf1672a94c578eca32216839604f1e1c16b40a1896198deabf99c882b340","impliedFormat":1},{"version":"e3498cf5e428e6c6b9e97bd88736f26d6cf147dedbfa5a8ad3ed8e05e059af8a","impliedFormat":1},{"version":"dba3f34531fd9b1b6e072928b6f885aa4d28dd6789cbd0e93563d43f4b62da53","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"e4b03ddcf8563b1c0aee782a185286ed85a255ce8a30df8453aade2188bbc904","impliedFormat":1},{"version":"2329d90062487e1eaca87b5e06abcbbeeecf80a82f65f949fd332cfcf824b87b","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"4fdb529707247a1a917a4626bfb6a293d52cd8ee57ccf03830ec91d39d606d6d","impliedFormat":1},{"version":"a9ebb67d6bbead6044b43714b50dcb77b8f7541ffe803046fdec1714c1eba206","impliedFormat":1},{"version":"833e92c058d033cde3f29a6c7603f517001d1ddd8020bc94d2067a3bc69b2a8e","impliedFormat":1},{"version":"309ebd217636d68cf8784cbc3272c16fb94fb8e969e18b6fe88c35200340aef1","impliedFormat":1},{"version":"91cf9887208be8641244827c18e620166edf7e1c53114930b54eaeaab588a5be","impliedFormat":1},{"version":"ef9b6279acc69002a779d0172916ef22e8be5de2d2469ff2f4bb019a21e89de2","impliedFormat":1},{"version":"71623b889c23a332292c85f9bf41469c3f2efa47f81f12c73e14edbcffa270d3","affectsGlobalScope":true,"impliedFormat":1},{"version":"88863d76039cc550f8b7688a213dd051ae80d94a883eb99389d6bc4ce21c8688","impliedFormat":1},{"version":"e9ce511dae7201b833936d13618dff01815a9db2e6c2cc28646e21520c452d6c","impliedFormat":1},{"version":"243649afb10d950e7e83ee4d53bd2fbd615bb579a74cf6c1ce10e64402cdf9bb","impliedFormat":1},{"version":"35575179030368798cbcd50da928a275234445c9a0df32d4a2c694b2b3d20439","impliedFormat":1},{"version":"c939cb12cb000b4ec9c3eca3fe7dee1fe373ccb801237631d9252bad10206d61","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"26384fb401f582cae1234213c3dc75fdc80e3d728a0a1c55b405be8a0c6dddbe","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"b42d3651103a532f7492e719a828647af97306b2356ae757ebb7f17f4a8c41e5","impliedFormat":1},{"version":"03268b4d02371bdf514f513797ed3c9eb0840b0724ff6778bda0ef74c35273be","impliedFormat":1},{"version":"3511847babb822e10715a18348d1cbb0dae73c4e4c0a1bcf7cbc12771b310d45","impliedFormat":1},{"version":"80e653fbbec818eecfe95d182dc65a1d107b343d970159a71922ac4491caa0af","impliedFormat":1},{"version":"53f00dc83ccceb8fad22eb3aade64e4bcdb082115f230c8ba3d40f79c835c30e","impliedFormat":1},{"version":"35475931e8b55c4d33bfe3abc79f5673924a0bd4224c7c6108a4e08f3521643c","impliedFormat":1},{"version":"9078205849121a5d37a642949d687565498da922508eacb0e5a0c3de427f0ae5","impliedFormat":1},{"version":"e8f8f095f137e96dc64b56e59556c02f3c31db4b354801d6ae3b90dceae60240","impliedFormat":1},{"version":"451abef2a26cebb6f54236e68de3c33691e3b47b548fd4c8fa05fd84ab2238ff","impliedFormat":1},{"version":"f91770fbae1e0f079ec92d44e033e20d119ba58ee5ffee96e9aceb9c445103c7","impliedFormat":99},{"version":"e0233b8bea5602dbd314604d457e33b72688740d2dc08ebcd42ac8f5ea7c8903","impliedFormat":99},{"version":"de2fac2990176a263775e64c4ac26bc7714f88094973e7276604dde2a92fef9f","impliedFormat":99},{"version":"2c43a4835bf2ccfb296ad5c271d9b807aac44e970e1c1ef09674aff8a2f3242c","impliedFormat":99},{"version":"34b47287db2fe4d80d04acc0fe2a12c0a405facb9c7abebff327cda5dc4e5b35","impliedFormat":99},{"version":"32fe263186cc25d5fd59d49a26a3b0f0b5d34d22b47cc73c21449301a958fd4b","impliedFormat":99},{"version":"ce47315e1bcc7dfa3b80a5f1ecbb72816f64f28d6b237f15614823c26d2103ab","impliedFormat":99},{"version":"abdf7d01383e687b4c44f07e7b357b1c13d25741a12db492e19f47177b584f45","impliedFormat":99},{"version":"198bea7a8143889fd135cb7978407151a49a6070c13854ff5068da8db6716361","impliedFormat":99},{"version":"88475ad865c443430bb2748f86694b45359ac4236e99145624668f5c929d64c2","impliedFormat":99},{"version":"23a19cc1c28361c60681d5f490f9cfa3587e7057c6961312a0738a13e31552c2","impliedFormat":99},{"version":"6c3ac0f95ba9a16fe2f8763830a8a5cc28b842eb6e34cef70619756da7c12ad6","impliedFormat":99},{"version":"b80c780c52524beb13488942543972c8b0e54400e8b59cee0169f38d0fabb968","impliedFormat":1},{"version":"a0a118c9a66853bb5ec086c878963b5d178ecb3eec72d75dc553d86adef67801","impliedFormat":1},{"version":"4bbf82fc081be97a72c494d1055e4f62ad743957cdc52b5a597b49d262ae5fd4","impliedFormat":1},{"version":"4583bf6ebd196f0c7e9aa26bfe5dfee09ea69eee63c2e97448518ea5ee17bc64","impliedFormat":1},{"version":"2b16288372f6367cdb13e77cbd0e667d5af3034a5b733a0daa98a111cfee227f","impliedFormat":1},{"version":"ad7d3197e540298c80697fdf6b6fbd33951d219fde607eaeab157bbd2b044b7e","impliedFormat":99},{"version":"d88567208bef244e981fd9ac1eafbd4e65f747287d80cdfd02438202472f40e7","impliedFormat":99},{"version":"835a8a06ee923c4c7651662ce13c3a6ed5c1eb782f150e8a845cedd123350423","impliedFormat":99},{"version":"55de726363738c016cf49727e1ee75076f1a858f1917ace125a757547ded0dcc","impliedFormat":99},{"version":"ae67d93deb11f62f18d9032c8377a6d72f3f567a86a258da885bf92640aaa3d0","impliedFormat":99},{"version":"b4bb54348002daa10071771f5ac7448a6e0d2df6d59f6176de8bbf5c5ce12ca5","impliedFormat":99},{"version":"d0a0a343fcc35d593ddb06f129d35a632913deaea4531f58056b336377b5dedc","impliedFormat":99},{"version":"e0a3dfc09ec4f5c202814a903e278746ec79675b43836eb21dcaca5484457066","impliedFormat":99},{"version":"dae6ed1e5e91a00ae399ac4e5355099d7b0e018ef079dc72c8dff8d05eee8b22","impliedFormat":99},{"version":"3d102dc8e1a7e7d49ae52a1b196f79d85f6091b6d2b88cddffec2c8bcf03eb27","impliedFormat":99},{"version":"224b3c29dbb675f0573d45773e0bae4723289a8a6a3145e4a93a1eb4d91d9cad","impliedFormat":99},{"version":"db94209891d71ac046f5e0e0c9917bce9f6453c81da47bf0704ca3709b58a3ca","impliedFormat":99},{"version":"294bf7fa82b71cefc04aca85f1b9499309c1242b991ff005f98867a66dc0e567","impliedFormat":99},{"version":"4f954a02b5fef179a6ffb4e4752620383213e617520a5e3bad2ce3c44054e7ae","impliedFormat":99},{"version":"180b1f419372dc3c0a719988c8b3cd4d27996bb68709f877d9efc57955908661","impliedFormat":99},{"version":"b096de109131fefe96b6a608323c0c6ed111a6fd5a3154f87ae8ce5b09c1aba8","impliedFormat":99},{"version":"c98517664512e9f8bc990db01c296a4d667a53cef785bd5cbc4c4298dbded589","impliedFormat":99},{"version":"d4185a496f5147371df1d690ad2962539e988c3c48e8652f58973b82b5dcedd9","impliedFormat":99},{"version":"f8771cd6b291f7bf465c4541459d70c8534bf1b02a7039fec04e8e28df005843","impliedFormat":99},{"version":"dfff66d662d4502bb3f3bb6a92d8787a38883ce63414e52e580312573380cbab","impliedFormat":99},{"version":"309f11d47288d33ad6ab086471f014aff3f78a790270eb1aa3283097ca693cc9","impliedFormat":99},{"version":"38e50b338c6bd54cd81e3d4854916c838a85db2a53b54593c8f91bac8c0df99f","impliedFormat":99},{"version":"2a88099323000d6f98c860a26af8480148e06fac5971d8019666538fc2817f4c","impliedFormat":99},{"version":"9e98d742d1869b46207f8c3d293d91c223a115a950b8451c00f98e24b5bafd7e","impliedFormat":99},{"version":"a63568515082ad88e397f1fea481630e36df8ca4455f7c553bd29941da78701b","impliedFormat":99},{"version":"70ae70978cc2f67a6600faf4b0a7958ec13436b2705848bfa3e53fd075663d1e","impliedFormat":99},{"version":"2baca6b964eb2a811cdd75dc2450b7ffc90f7275f080627ab7bd472d9d00726d","impliedFormat":99},{"version":"83367da177bdda20f8809efc0ceb54869a0daa875b48c2149b68a009e2c53beb","impliedFormat":99},{"version":"07b6c5fbe9598fdefb3337f02a9cb57e05f843bed50788babe9d70e6e652a366","impliedFormat":99},{"version":"83e5da1af0730da24bbe4b428db35f34e8d47cff2f85307b25d8e768c6abfddb","impliedFormat":99},{"version":"e75520a03123ade67d03ecb5b19f56b58f2b8d42d91ef152e7f1856fb4760d88","impliedFormat":99},{"version":"b920d52ab993cc4d41c4bc0f94a6b93e97fbe9b87cce7bba720d8abf81bb6fb7","impliedFormat":99},{"version":"aaab10f2856c707f44c494105b303f621162f4087bd1175083bc0605b621ecb9","impliedFormat":99},{"version":"fb91ab32d5c1da788315d07faac524eb1baef360dc2c73c70cae7032131917e8","impliedFormat":99},{"version":"fbed22e9d96b3e4e7c20e5834777086f9a9b3128796ac7fa5a03b5268ded74e9","impliedFormat":99},{"version":"0b69199ae81efb4f353a233952807aa5ffd9b6a2447f5b279ab4c60c720ed482","impliedFormat":99},{"version":"fe6cb067964876eacbf5adf4744d581ac37fd812e2d6f3f78cf487460a2aed0c","impliedFormat":99},{"version":"48f7e706f98ba54d0a2e6a982379d093293e3965c5d89b77dd9ec1b6dc16a5bb","impliedFormat":99},{"version":"b0577cc97124dfe697d2d26531f19e8253e3ba58c3ff1701aa15193a7a3d2f3a","impliedFormat":99},{"version":"61b2b27c6b9f9d557f07f56bb47f0a5a1ce989fcb03ddbf537328af9ccf4d79f","impliedFormat":99},{"version":"0c0dc1a78055cc982b0e8c1c75994c6a5da2cf55e5e50d2084128e77de3004d9","impliedFormat":99},{"version":"e9ba3970a46178df808e99fa11cc7c8a6bdd01c573a1edd894b7010f70b549c5","impliedFormat":99},{"version":"7d35c980e3b5fecacff7e784ff54d63238bf6a79539e1ff133f21cec05aa2ab1","impliedFormat":99},{"version":"5780b706cece027f0d4444fbb4e1af62dc51e19da7c3d3719f67b22b033859b9","impliedFormat":1},{"version":"ba739758560a9b3e696095df9b04ac5d9d76acb11e98e06e73b7a86cbffe4207","impliedFormat":1},{"version":"7c7401c91fab197c9364f4625daff28ede54f1acbae4a791dfc4ade2db71c59d","impliedFormat":1},{"version":"48ce8d49a17cdd6dbb687c406af1caf4bed54fbe40ff14c6c505ccca6176cd21","impliedFormat":1},{"version":"3cd6ca36b5729325dd2eb0359eb1e2aed4f8cc73c3b8341e1733dfeee99fbeeb","impliedFormat":1},{"version":"0e8edbe744dfc3ce65e9fa2283f1f0eb2c0aaaec4df19765f51c346e45452cda","impliedFormat":1},{"version":"e8f32bdfbcbddd21331a469193a5c63c7b5e0d80025e649d91f833869bf5b7aa","impliedFormat":1},{"version":"1bea3584ffe75ae8fa970d651b8bbd7c67a75d21df6bd1762dc2abea73012b66","impliedFormat":1},{"version":"bf0e009524b9b436156b4a326cc3e92f1fdcd16ce51d119c94e4addc910e645e","impliedFormat":1},{"version":"52e0c1007dea40e9a588f22425a80250020ef0cd9b4a9deb36f315e075d1ab40","impliedFormat":1},{"version":"2c6ecd1f21dc339d42cecf914e1b844cef3cb68e3ec6f0ed5a9c4f6a588beb92","impliedFormat":1},{"version":"653672db5220ac24c728958a680b0db84c8d0d0f7ade5d78dbac72035d9ea70b","impliedFormat":1},{"version":"3e689acc1789753818d875db16406686afb5b5e689dcc76d8106a960016f6352","impliedFormat":1},{"version":"d7a7229e7c12bf013834713f569d122a43056a5f34391b8388a582895b02c9e8","impliedFormat":1},{"version":"b811d082368e5b7f337d08f3e80be3d7e4c0c7f0249b00f8224acba9f77087e9","impliedFormat":1},{"version":"adb05565c81b408a97cee9201c8539dda075c30dffce0d4ec226e5050f36bfa4","impliedFormat":1},{"version":"75473b178a514d8768d6ead4a4da267aa6bedeeb792cd9437e45b46fa2dcf608","impliedFormat":1},{"version":"a75457a1e79e2bc885376b11f0a6c058e843dcac1f9d84c2293c75b13fa8803b","impliedFormat":1},{"version":"0e776b64bf664fffad4237b220b92dccd7cc1cf60b933a7ce01fb7a9b742b713","impliedFormat":1},{"version":"97fe820ad369ce125b96c8fadd590addae19e293d5f6dc3833b7fd3808fea329","impliedFormat":1},{"version":"4e8a7cea443cbce825d1de249990bd71988cf491f689f5f4ada378c1cb965067","impliedFormat":1},{"version":"3a56da695cfddd03aee7835adf8934e4f357cc9bac59ea534cd282aba668b566","impliedFormat":1},{"version":"47244c79b80aee467a62c420ef5c2a58837236d9bf0087e9d6b43e278a71a46f","impliedFormat":1},{"version":"ba3886b9e5b3bd32588d57421988aeeea94afe40227334edc5d45fb0c5367c9d","impliedFormat":1},{"version":"226b58896f4f01f4c669d908f32c657bcab1a83f3aebb2f3d711a4fe7ba2a2d6","impliedFormat":1},{"version":"c79b22aab6a36366a6cf274ba9a719bebcc6f40f0be4ff721e91473ec19a7da1","impliedFormat":1},{"version":"23175b7285c059764d436da99323fcfb75124b83b43bb32bf308742907bc8aab","impliedFormat":1},{"version":"95b74ccaa6228d938036d13a96a47645f9c3d3b707c0b6989a18d77fd62447cb","impliedFormat":1},{"version":"856b83248d7e9a1343e28e8f113b142bd49b0adece47c157ab7adf3393f82967","impliedFormat":1},{"version":"bd987883be09d8ebe7aafed2e79a591d12b5845ac4a8a0b5601bdb0367c124c0","impliedFormat":1},{"version":"75ceb3dc5530c9b0797d8d6f6cbb883bb2b1add64f630c3c6d6f847aae87482e","impliedFormat":1},{"version":"efb2b9333117561dd5fc803927c1a212a8bf1dd1a5bd4549cc3c049d4a78ec63","impliedFormat":1},{"version":"ef17d2b0d94e266d4ec8caa84010b8a7b71e476c9cfa17e3db366f873d28445e","impliedFormat":1},{"version":"604a4451df97c7bfc75846cd1ed702129db0bee0f753658e0964d67619eea825","impliedFormat":1},{"version":"b9dfc4e6c69b1d60c7c060fb7d18951ca50f01fcdb46cf4eed23ca7f16471350","impliedFormat":1},{"version":"6911b52e74e60b6f3b79fc36d22a5d9537a807e16ec2e03fd594008c83981ab5","impliedFormat":1},{"version":"2551daa9cd45fb05ee16cee6282892c14a92e49a2d592b29fc9ff6d4ceef7dc2","impliedFormat":1},{"version":"5ba862c2b8f6fc41d95b417b19ed28111a685554ba2bac5bcf30680a92a46f26","impliedFormat":1},{"version":"2e47f885c94dd1180bd90160a7ebbd950256ea1a5e1f6c5a89b84de92c705ec0","impliedFormat":1},{"version":"61d6c43861d171f1129a3179983d8af80995d3e86f90bdeaad9415756022d4b3","impliedFormat":99},{"version":"33bb7966e2c859326207e0bda17423fbf1bd81dbc8e6ba54fa143f950566e9da","impliedFormat":99},{"version":"4ae63b19255579a897918c94e928c4351c6bb6de552d50f14f41c6f175f4d282","impliedFormat":99},{"version":"6701d92fe59eaa51088a26816117828e532d7b443119534b3c287252e362b894","impliedFormat":99},{"version":"4276e358bf27203613ebe2f917706385875fa02481ed2829a96611eecc8c4255","impliedFormat":99},{"version":"c223c62757304681e71494f26e78e828c83f9612b76c1181b2e9a7cf6f853fec","impliedFormat":99},{"version":"d0f4d6c857e665d4163074039b1fbd996d67b8ef233117412adf4748b33689f5","impliedFormat":99},{"version":"e25f0e3f148d4fb60ad91dc4ac77886119d2ff74f408596477c62f7bda54cb9b","impliedFormat":99},{"version":"a204e4f8f148eacfce004a47fb7920ffce1e7744323c2018731d288bf805c590","impliedFormat":99},{"version":"347887ad5b67dcf4293eda7172cb03e649f5fb03ed2bc55651ef4aae6b51571d","impliedFormat":99},{"version":"e969c88b7f0115f52e140d8a476a4f4ddf51d23b1fca5eb8f1e99f15c101d9a3","impliedFormat":99},{"version":"d877145760dcb69e781b3b75c180e8bd0a313e512da94da1df4edbb2c9e80fc0","impliedFormat":99},{"version":"298008b26d30649b3d3e8bccec15496876eaa00d9a0c99aa61c2b9baf9076ee3","impliedFormat":99},{"version":"19bfe9081b7ff86e802cdf0cb2638cc86fe938e1c3706ce396e3db1fca4afa58","impliedFormat":99},{"version":"5174824580984ce594e422af8ece554d39cc883f587263584005d1ed9e8a4294","impliedFormat":99},{"version":"5d88c2f3bf77fe5ec107f01c6f4082b8b8fe6dbebc9e64768a29c892625bac6d","impliedFormat":99},{"version":"10fe4d3ae47ef73d8aecc0c9796e5db38d2ffcdfd460bec6826a468d0a1b30f9","impliedFormat":99},{"version":"37199f5ee67b9604e93dd15246acbd53c7edc52725059fd7c5adb69b05f7ae0e","impliedFormat":99},{"version":"7ebd648adb3609298469ec316135b05de2582c07289542322e25cc87fdf73067","impliedFormat":99},{"version":"7528ecab2633a7fe9249040bc7f2a2f7f904e94a6af9e6d780866b307288029a","impliedFormat":99},{"version":"e2fe78557c1ad18c12672660a3f1cfee7c675b2544ac5f7920e5b6366f99d36a","impliedFormat":99},{"version":"2b254456fc96b41a082b7c2c5380c1bb24ec13bc16237947352adcb637a78b44","impliedFormat":99},{"version":"426f37f0f4eb934278b203b6473ca9a5f7c20cec85f78867ac04b38ed7f2b76b","impliedFormat":99},{"version":"efbc1cda3658d91bec28606ea37318d75b6f7f8428369af4be1b91bc54381357","impliedFormat":99},{"version":"11b4b3bd396175fcab186b602b4a7d4a543f19d65eb2bf4e4cc3bcce7552696f","impliedFormat":99},{"version":"d1a440ac6e06354dd50033e77dd71adbdeb4d15702a57169690d44fc259ab345","impliedFormat":99},{"version":"84efb55fff9b3512aa1c37b0309897771e275d5dbd983655609cb62909566a59","impliedFormat":99},{"version":"65d21d2809f2945b1da76ea15da2e30faeb91cb469e14dca51b2707a39f2eb6a","impliedFormat":99},{"version":"828643d188769a3db529d48ab3378612c02e55aa527a7dd94ab099519e000cb3","impliedFormat":99},{"version":"6b7bca85b3a40597879fb3e405f7762af0f1cd72203f447d6d220c6426a6555e","impliedFormat":99},{"version":"95dabab27d8ba8e2d2bb7a8a8fafcfcbcdf866a488d9c86fddfb17bc63ec040c","impliedFormat":99},{"version":"6dd989c645aedabd5a9985ad507ae7aee5c3f7b6a326ec3ec7b32ffae1c199fd","impliedFormat":99},{"version":"6418f5624ca93c78b69c5c33c12b1b877d0835fe28b09b8910fa0c319ef585cb","impliedFormat":99},{"version":"bcf305ec5cbef99c3a5d895db92ffd90f1fcc0f89d27f6e1871ffe69268f69ce","impliedFormat":99},{"version":"2bde553812b19c094268941fd73b2ba75b58eb57b2faf2a07b507139b1839e81","impliedFormat":99},{"version":"71b0e26a6d0af2c069279436b984838210eb63d8d2966e4d6dba1f1ca11dc1a1","impliedFormat":99},{"version":"251f9bbc78c9cf9a85311aa7aa91ac4f82274ec2a375b4e4eacdc2a0d6831bb4","impliedFormat":99},{"version":"fe2f1f6453c033ccd21fc6919b68eaf5619ba168d3e8ecbf4b5bc5d28919ddc7","impliedFormat":99},{"version":"eaefb89fa8f5fb3800dd9925c47a2c4a5095c8e1784583ef3887812941cea8ad","impliedFormat":99},{"version":"38e5aedc0368900e6ac6ebb61c9184940e0ab3cdd5be1d9e0f27b8772b656d18","impliedFormat":99},{"version":"bde1168b34a7a8ebca1326c5f1fb9d94a2e683710d9adaefc3bc4a56c24535a0","impliedFormat":99},{"version":"c98517664512e9f8bc990db01c296a4d667a53cef785bd5cbc4c4298dbded589","impliedFormat":99},{"version":"34f1126dabf479f356c5057ac04f0d2e86252d17ab3b3840eafbc29e2b03e43b","impliedFormat":99},{"version":"2d04d6ef2a5ca2cd4fb21542ab585adf936aa122acb5624624372606afa7356e","impliedFormat":99},{"version":"629dd088a427d3d29d578578f95e9876e9c240a4ec367c8fe214fc93092cac36","impliedFormat":99},{"version":"3080a78b567d1bb72aaa165ce6233c99945f71eae0810862d1854edcaa9ed18f","impliedFormat":99},{"version":"1020149ef47af842ed8f0b4cbcccea7654ec75e77a84d7aa0fc415a2448270cb","impliedFormat":99},{"version":"f3835c2768dbe603ddc2c8353e59f7d9fb388f79eb2f292541a2edaa458a0d4b","impliedFormat":99},{"version":"9e70db32392b20c8a4c3a1611aef9d85e1747fff03e07f6eb610b4e3b7858949","impliedFormat":99},{"version":"2bbb4c88ed22cb62cced53dda2475bec4b3cfaa9d31e32d5e99c45d10f93daa2","impliedFormat":99},{"version":"2f2e927e8edfe2b426402705ee7b8b271582d4e14fb08a65ee0c2ee0f287a382","impliedFormat":99},{"version":"c9961345e88cca1c3ed7cbd9ed4d1da0a7edb3e37e70ffce903fbec5673e608e","impliedFormat":99},{"version":"c7db6d713ed3b1ce907b464cbb49db7da69086a6c2ac317172a55fc147d1490d","impliedFormat":99},{"version":"239307d4cae49820d3f769810f242fd0c44f842133f8b7c837d473d83495e3cc","impliedFormat":99},{"version":"f338468fe54079d209b32c00412a68a9c13d6e059b892b4cb7c0598f527b3428","impliedFormat":99},{"version":"166486ccecb7e3fa6067eb782f27bca452f87bdf759bb411a20dbb8734bc48fe","impliedFormat":99},{"version":"e84be3d3b1c90d834a95d10c2836d6cbb08b9eb3cf06ce597ccfd1f4e054dd47","impliedFormat":99},{"version":"41ca86a3722b2f03d489a1f31b55c95e274ef9b0b7e23c095dc48445f45259de","impliedFormat":99},{"version":"1326c9d6bed97c1190882451a12d6475fbf691baf98e2a104451baf614b04f7e","impliedFormat":99},{"version":"e94e8ea4ab8954a256cea5aeb1d6838b496ce50695abf5ffcf7b8624648664e9","impliedFormat":99},{"version":"d33fa6aa781e24ebea8d8d7b4f65a18a51c40167dc817004bbb92ce8f58b2a6f","impliedFormat":99},{"version":"deb2c54febbb0520fa6836b1652adacac73cb23fb78cc070cc636b6053f5c252","impliedFormat":99},{"version":"d3cfde44f8089768ebb08098c96d01ca260b88bccf238d55eee93f1c620ff5a5","impliedFormat":1},{"version":"950f2cd81e30d0ecdf70ab78fcfd85fc5bb28b45ebb08c860daff059feea412e","impliedFormat":1},{"version":"3a5af4fba7b27b815bb40f52715aedebaa4b371da3e5a664e7e0798c9b638825","impliedFormat":1},{"version":"8485b6da53ec35637d072e516631d25dae53984500de70a6989058f24354666f","impliedFormat":1},{"version":"ebe80346928736532e4a822154eb77f57ef3389dbe2b3ba4e571366a15448ef2","impliedFormat":1},{"version":"49c632082dc8a916353288d3d8b2dc82b3471794249a381d090d960c8ceac908","impliedFormat":1},{"version":"f672c876c1a04a223cf2023b3d91e8a52bb1544c576b81bf64a8fec82be9969c","impliedFormat":1},{"version":"71addb585c2db7b8e53dc1b0bcfa58c6c67c6e4fa2b968942046749d66f82e7e","impliedFormat":1},{"version":"c76b0c5727302341d0bdfa2cc2cee4b19ff185b554edb6e8543f0661d8487116","impliedFormat":1},{"version":"25b3f581e12ede11e5739f57a86e8668fbc0124f6649506def306cad2c59d262","impliedFormat":1},{"version":"e703cfacb9965c4d4155346c65a0091ecded90ea98874ed6b3f36286577c4dde","impliedFormat":1},{"version":"f5ef066942e4f0bd98200aa6a6694b831e73200c9b3ade77ad0aa2409e8fe1b1","impliedFormat":1},{"version":"b9e99cd94f4166a245f5158f7286c05406e2a4c694619bceb7a4f3519d1d768e","impliedFormat":1},{"version":"5568d7c32e5cf5f35e092649f4e5e168c3114c800b1d7545b7ae5e0415704802","impliedFormat":1},{"version":"04ccc9232708262f5f9f5ce41d17453e32f4b87ef868558da5988d7a53bc8a09","impliedFormat":99},{"version":"b8ee527d684a906482aa541563cb52eda5c9112b09545e1d2f92094c6cf75a94","impliedFormat":99},{"version":"107ebac4f583b5c17d13b357907c2fe21696c59bbc2a7f18351a6e738f60c4d7","impliedFormat":99},{"version":"2a433dc95991dd9ad68774798b249be0f703c987a03f43309c56db60e47bbacd","impliedFormat":99},{"version":"d3b86ab2e93e4d7391b5888683d76fb0fb34d15b8ea631dc6ea4741d550a0397","impliedFormat":99},{"version":"70a82959a0cc9929ad85460f0d6dc38c939d13a01a51e3ff4d5ee288426594a7","impliedFormat":99},{"version":"8b0d3c14e14ff80d94c33dc74805c0788731a902612d120ea0d010b924759ae8","impliedFormat":99},{"version":"a840ac85f23f8c0fdb1c9b87b7b43fb88fa271dd936a35794e9d98aab4b39f65","impliedFormat":99},{"version":"805e0af2746a67cb04a7e9ce9854c3e5a4cf55bef231eecc89de435366024caf","impliedFormat":99},{"version":"fc819b8353648951d5c762a2eb6e4cf4c3abc5ee4f2d56547192a6fa96b91207","impliedFormat":99},{"version":"46a2ee69fa603e0794edf02e09e3d613d403a627720e0bc795a3e2ecc64c1833","impliedFormat":99},{"version":"d9d1bd7c4a2c17717d37e70360163be84eaea4a24369c30b4f689338f3184e3e","impliedFormat":99},{"version":"bff953aa2451a7433910867851be0aeb7f4bf259a1826802e44849d30fdd3ce3","impliedFormat":99},{"version":"bccda97b9f2ed9a10b78cb647de9ccbb54e26be7a6fc29db438cdf2aa1109763","impliedFormat":99},{"version":"54a5595f6d6d7b9ca15cce574ca31d675af0af68e6e54f85b06217ddd4eb1a70","impliedFormat":99},{"version":"34ede2dfca10557d5f155c9cc0b242938c842de0f72e5bceda4de6b00339336c","impliedFormat":99},{"version":"377a664d691ef3094c6b4f7995bb373d9e8a43098e3e05b3fb9e0d1531a4d2da","impliedFormat":99},{"version":"8db11795402c8b2514fe53803066158ed8f09e7a79d05fb361c0662d5dad95b4","impliedFormat":99},{"version":"ddd6f539f0b896b0774fdce4afce28ffb3469acb3e4eb63e25a1b9f9c04eaef3","impliedFormat":99},{"version":"9e524a809f3ade6ebf02d34a0bd11fc0370308dca6dbe9c9469601d2eaf5fe36","impliedFormat":99},{"version":"c65b4d7e4177af3ff21b3034a8030dca1b2c2543bd13a9c5e961b70883498f2b","impliedFormat":99},{"version":"864f49da74709da6e77fed102c5aeb2bb64d98ee0ab87372c632e2e3a47c2f02","impliedFormat":99},{"version":"f90b582a9a18fd14dee9cbbf59a886829305009294ce589e543453423eda5d42","impliedFormat":99},{"version":"9f93d6164d92c1be6483ee2efdb93f75dd3a8960770de8afe44bfcd3c7ca9c6d","impliedFormat":99},{"version":"ca88f6061ee6280ddf17becfee2a1ccb45cd4f1c126335aa9603e58fca351592","impliedFormat":99},{"version":"45a0935f048b9d15ab04c579e464636d7d8d264f9846a764fd0fad9ac5529a98","impliedFormat":99},{"version":"4f0a356e46c6b4b2dc44a223ce0db07b1ec9e0927556923257edbb1dd070ffa5","impliedFormat":99},{"version":"6d05743fbd01eb2e796d428ffe82d7b0320a334a305043bb3867af53876ef589","impliedFormat":99},{"version":"64b239bddde122bcaf5f468b6f81b40bbb0b84970df9a146dee73cde781a1d49","impliedFormat":99},{"version":"edd73902e93cdca49083ed90fd106e8921430e43653424fcd8f92136d9d3fac7","signature":"d1d45c07822808bc8866df0d9030e0c542786b45d7dc54b705c2f70960af433d"},{"version":"2cef84bf00cbdb452fdc5d8ecfe7b8c0aa3fa788bdc4ad8961e2e636530dbb60","impliedFormat":99},{"version":"24104650185414f379d5cc35c0e2c19f06684a73de5b472bae79e0d855771ecf","impliedFormat":99},{"version":"799003c0ab928582fca04977f47b8d85b43a8de610f4eef0ad2d069fbb9f9399","impliedFormat":99},{"version":"b13dd41c344a23e085f81b2f5cd96792e6b35ae814f32b25e39d9841844ad240","impliedFormat":99},{"version":"17d8b4e6416e48b6e23b73d05fd2fde407e2af8fddbe9da2a98ede14949c3489","impliedFormat":99},{"version":"6d17b2b41f874ab4369b8e04bdbe660163ea5c8239785c850f767370604959e3","impliedFormat":99},{"version":"04b4c044c8fe6af77b6c196a16c41e0f7d76b285d036d79dcaa6d92e24b4982b","impliedFormat":99},{"version":"30bdeead5293c1ddfaea4097d3e9dd5a6b0bc59a1e07ff4714ea1bbe7c5b2318","impliedFormat":99},{"version":"e7df226dcc1b0ce76b32f160556f3d1550124c894aae2d5f73cefaaf28df7779","impliedFormat":99},{"version":"f2b7eef5c46c61e6e72fba9afd7cc612a08c0c48ed44c3c5518559d8508146a2","impliedFormat":99},{"version":"00f0ba57e829398d10168b7db1e16217f87933e61bd8612b53a894bd7d6371da","impliedFormat":99},{"version":"126b20947d9fa74a88bb4e9281462bda05e529f90e22d08ee9f116a224291e84","impliedFormat":99},{"version":"40d9e43acee39702745eb5c641993978ac40f227475eacc99a83ba893ad995db","impliedFormat":99},{"version":"8a66b69b21c8de9cb88b4b6d12f655d5b7636e692a014c5aa1bd81745c8c51d5","impliedFormat":99},{"version":"ebbb846bdd5a78fdacff59ae04cea7a097912aeb1a2b34f8d88f4ebb84643069","impliedFormat":99},{"version":"7321adb29ffd637acb33ee67ea035f1a97d0aa0b14173291cc2fd58e93296e04","impliedFormat":99},{"version":"320816f1a4211188f07a782bdb6c1a44555b3e716ce13018f528ad7387108d5f","impliedFormat":99},{"version":"b2cc8a474b7657f4a03c67baf6bff75e26635fd4b5850675e8cad524a09ddd0c","impliedFormat":99},{"version":"0d081e9dc251063cc69611041c17d25847e8bdbe18164baaa89b7f1f1633c0ab","impliedFormat":99},{"version":"a64c25d8f4ec16339db49867ea2324e77060782993432a875d6e5e8608b0de1e","impliedFormat":99},{"version":"0739310b6b777f3e2baaf908c0fbc622c71160e6310eb93e0d820d86a52e2e23","impliedFormat":99},{"version":"37b32e4eadd8cd3c263e7ac1681c58b2ac54f3f77bb34c5e4326cc78516d55a9","impliedFormat":99},{"version":"9b7a8974e028c4ed6f7f9abb969e3eb224c069fd7f226e26fcc3a5b0e2a1eba8","impliedFormat":99},{"version":"e8100b569926a5592146ed68a0418109d625a045a94ed878a8c5152b1379237c","impliedFormat":99},{"version":"594201c616c318b7f3149a912abd8d6bdf338d765b7bcbde86bca2e66b144606","impliedFormat":99},{"version":"03e380975e047c5c6ded532cf8589e6cc85abb7be3629e1e4b0c9e703f2fd36f","impliedFormat":99},{"version":"fae14b53b7f52a8eb3274c67c11f261a58530969885599efe3df0277b48909e1","impliedFormat":99},{"version":"c41206757c428186f2e0d1fd373915c823504c249336bdc9a9c9bbdf9da95fef","impliedFormat":99},{"version":"e961f853b7b0111c42b763a6aa46fc70d06a697db3d8ed69b38f7ba0ae42a62b","impliedFormat":99},{"version":"3db90f79e36bcb60b3f8de1bc60321026800979c150e5615047d598c787a64b7","impliedFormat":99},{"version":"639b6fb3afbb8f6067c1564af2bd284c3e883f0f1556d59bd5eb87cdbbdd8486","impliedFormat":99},{"version":"49795f5478cb607fd5965aa337135a8e7fd1c58bc40c0b6db726adf186dd403f","impliedFormat":99},{"version":"7d8890e6e2e4e215959e71d5b5bd49482cf7a23be68d48ea446601a4c99bd511","impliedFormat":99},{"version":"d56f72c4bb518de5702b8b6ae3d3c3045c99e0fd48b3d3b54c653693a8378017","impliedFormat":99},{"version":"4c9ac40163e4265b5750510d6d2933fb7b39023eed69f7b7c68b540ad960826e","impliedFormat":99},{"version":"8dfab17cf48e7be6e023c438a9cdf6d15a9b4d2fa976c26e223ba40c53eb8da8","impliedFormat":99},{"version":"38bdf7ccacfd8e418de3a7b1e3cecc29b5625f90abc2fa4ac7843a290f3bf555","impliedFormat":99},{"version":"9819e46a914735211fbc04b8dc6ba65152c62e3a329ca0601a46ba6e05b2c897","impliedFormat":99},{"version":"50f0dc9a42931fb5d65cdd64ba0f7b378aedd36e0cfca988aa4109aad5e714cb","impliedFormat":99},{"version":"894f23066f9fafccc6e2dd006ed5bd85f3b913de90f17cf1fe15a2eb677fd603","impliedFormat":99},{"version":"abdf39173867e6c2d6045f120a316de451bbb6351a6929546b8470ddf2e4b3b9","impliedFormat":99},{"version":"aa2cb4053f948fbd606228195bbe44d78733861b6f7204558bbee603202ee440","impliedFormat":99},{"version":"6911b41bfe9942ac59c2da1bbcbe5c3c1f4e510bf65cae89ed00f434cc588860","impliedFormat":99},{"version":"7b81bc4d4e2c764e85d869a8dd9fe3652b34b45c065482ac94ffaacc642b2507","impliedFormat":99},{"version":"895df4edb46ccdcbce2ec982f5eed292cf7ea3f7168f1efea738ee346feab273","impliedFormat":99},{"version":"8692bb1a4799eda7b2e3288a6646519d4cebb9a0bddf800085fc1bd8076997a0","impliedFormat":99},{"version":"239c9e98547fe99711b01a0293f8a1a776fc10330094aa261f3970aaba957c82","impliedFormat":99},{"version":"34833ec50360a32efdc12780ae624e9a710dd1fd7013b58c540abf856b54285a","impliedFormat":99},{"version":"647538e4007dcc351a8882067310a0835b5bb8559d1cfa5f378e929bceb2e64d","impliedFormat":99},{"version":"992d6b1abcc9b6092e5a574d51d441238566b6461ade5de53cb9718e4f27da46","impliedFormat":99},{"version":"938702305649bf1050bd79f3803cf5cc2904596fc1edd4e3b91033184eae5c54","impliedFormat":99},{"version":"1e931d3c367d4b96fe043e792196d9c2cf74f672ff9c0b894be54e000280a79d","impliedFormat":99},{"version":"05bec322ea9f6eb9efcd6458bb47087e55bd688afdd232b78379eb5d526816ed","impliedFormat":99},{"version":"4c449a874c2d2e5e5bc508e6aa98f3140218e78c585597a21a508a647acd780a","impliedFormat":99},{"version":"dae15e326140a633d7693e92b1af63274f7295ea94fb7c322d5cbe3f5e48be88","impliedFormat":99},{"version":"c2b0a869713bca307e58d81d1d1f4b99ebfc7ec8b8f17e80dde40739aa8a2bc6","impliedFormat":99},{"version":"6e4b4ff6c7c54fa9c6022e88f2f3e675eac3c6923143eb8b9139150f09074049","impliedFormat":99},{"version":"69559172a9a97bbe34a32bff8c24ef1d8c8063feb5f16a6d3407833b7ee504cf","impliedFormat":99},{"version":"86b94a2a3edcb78d9bfcdb3b382547d47cb017e71abe770c9ee8721e9c84857f","impliedFormat":99},{"version":"e3fafafda82853c45c0afc075fea1eaf0df373a06daf6e6c7f382f9f61b2deb3","impliedFormat":99},{"version":"a4ba4b31de9e9140bc49c0addddbfaf96b943a7956a46d45f894822e12bf5560","impliedFormat":99},{"version":"d8a7926fc75f2ed887f17bae732ee31a4064b8a95a406c87e430c58578ee1f67","impliedFormat":99},{"version":"9886ffbb134b0a0059fd82219eba2a75f8af341d98bc6331b6ef8a921e10ec68","impliedFormat":99},{"version":"c2ead057b70d0ae7b87a771461a6222ebdb187ba6f300c974768b0ae5966d10e","impliedFormat":99},{"version":"46687d985aed8485ab2c71085f82fafb11e69e82e8552cf5d3849c00e64a00a5","impliedFormat":99},{"version":"999ca66d4b5e2790b656e0a7ce42267737577fc7a52b891e97644ec418eff7ec","impliedFormat":99},{"version":"ec948ee7e92d0888f92d4a490fdd0afb27fbf6d7aabebe2347a3e8ac82c36db9","impliedFormat":99},{"version":"03ef2386c683707ce741a1c30cb126e8c51a908aa0acc01c3471fafb9baaacd5","impliedFormat":99},{"version":"66a372e03c41d2d5e920df5282dadcec2acae4c629cb51cab850825d2a144cea","impliedFormat":99},{"version":"ddf9b157bd4c06c2e4646c9f034f36267a0fbd028bd4738214709de7ea7c548b","impliedFormat":99},{"version":"3e795aac9be23d4ad9781c00b153e7603be580602e40e5228e2dafe8a8e3aba1","impliedFormat":99},{"version":"98c461ec5953dfb1b5d5bca5fee0833c8a932383b9e651ca6548e55f1e2c71c3","impliedFormat":99},{"version":"5c42107b46cb1d36b6f1dee268df125e930b81f9b47b5fa0b7a5f2a42d556c10","impliedFormat":99},{"version":"7e32f1251d1e986e9dd98b6ff25f62c06445301b94aeebdf1f4296dbd2b8652f","impliedFormat":99},{"version":"2f7e328dda700dcb2b72db0f58c652ae926913de27391bd11505fc5e9aae6c33","impliedFormat":99},{"version":"3de7190e4d37da0c316db53a8a60096dbcd06d1a50677ccf11d182fa26882080","impliedFormat":99},{"version":"a9d6f87e59b32b02c861aade3f4477d7277c30d43939462b93f48644fa548c58","impliedFormat":99},{"version":"2bce8fd2d16a9432110bbe0ba1e663fd02f7d8b8968cd10178ea7bc306c4a5df","impliedFormat":99},{"version":"798bedbf45a8f1e55594e6879cd46023e8767757ecce1d3feaa78d16ad728703","impliedFormat":99},{"version":"62723d5ac66f7ed6885a3931dd5cfa017797e73000d590492988a944832e8bc2","impliedFormat":99},{"version":"03db8e7df7514bf17fc729c87fff56ca99567b9aa50821f544587a666537c233","impliedFormat":99},{"version":"9b1f311ba4409968b68bf20b5d892dbd3c5b1d65c673d5841c7dbde351bc0d0b","impliedFormat":99},{"version":"2d1e8b5431502739fe335ceec0aaded030b0f918e758a5d76f61effa0965b189","impliedFormat":99},{"version":"e725839b8f884dab141b42e9d7ff5659212f6e1d7b4054caa23bc719a4629071","impliedFormat":99},{"version":"4fa38a0b8ae02507f966675d0a7d230ed67c92ab8b5736d99a16c5fbe2b42036","impliedFormat":99},{"version":"50ec1e8c23bad160ddedf8debeebc722becbddda127b8fdce06c23eacd3fe689","impliedFormat":99},{"version":"9a0aea3a113064fd607f41375ade308c035911d3c8af5ae9db89593b5ca9f1f9","impliedFormat":99},{"version":"8d643903b58a0bf739ce4e6a8b0e5fb3fbdfaacbae50581b90803934b27d5b89","impliedFormat":99},{"version":"19de2915ccebc0a1482c2337b34cb178d446def2493bf775c4018a4ea355adb8","impliedFormat":99},{"version":"9be8fc03c8b5392cd17d40fd61063d73f08d0ee3457ecf075dcb3768ae1427bd","impliedFormat":99},{"version":"a2d89a8dc5a993514ca79585039eea083a56822b1d9b9d9d85b14232e4782cbe","impliedFormat":99},{"version":"f526f20cae73f17e8f38905de4c3765287575c9c4d9ecacee41cfda8c887da5b","impliedFormat":99},{"version":"d9ec0978b7023612b9b83a71fee8972e290d02f8ff894e95cdd732cd0213b070","impliedFormat":99},{"version":"7ab10c473a058ec8ac4790b05cae6f3a86c56be9b0c0a897771d428a2a48a9f9","impliedFormat":99},{"version":"451d7a93f8249d2e1453b495b13805e58f47784ef2131061821b0e456a9fd0e1","impliedFormat":99},{"version":"21c56fe515d227ed4943f275a8b242d884046001722a4ba81f342a08dbe74ae2","impliedFormat":99},{"version":"d8311f0c39381aa1825081c921efde36e618c5cf46258c351633342a11601208","impliedFormat":99},{"version":"6b50c3bcc92dc417047740810596fcb2df2502aa3f280c9e7827e87896da168a","impliedFormat":99},{"version":"18a6b318d1e7b31e5749a52be0cf9bbce1b275f63190ef32e2c79db0579328ca","impliedFormat":99},{"version":"6a2d0af2c27b993aa85414f3759898502aa198301bc58b0d410948fe908b07b0","impliedFormat":99},{"version":"2da11b6f5c374300e5e66a6b01c3c78ec21b5d3fec0748a28cc28e00be73e006","impliedFormat":99},{"version":"0729691b39c24d222f0b854776b00530877217bfc30aac1dc7fa2f4b1795c536","impliedFormat":99},{"version":"ca45bb5c98c474d669f0e47615e4a5ae65d90a2e78531fda7862ee43e687a059","impliedFormat":99},{"version":"c1c058b91d5b9a24c95a51aea814b0ad4185f411c38ac1d5eef0bf3cebec17dc","impliedFormat":99},{"version":"3ab0ed4060b8e5b5e594138aab3e7f0262d68ad671d6678bcda51568d4fc4ccc","impliedFormat":99},{"version":"e2bf1faba4ff10a6020c41df276411f641d3fdce5c6bae1db0ec84a0bf042106","impliedFormat":99},{"version":"80b0a8fe14d47a71e23d7c3d4dcee9584d4282ef1d843b70cab1a42a4ea1588c","impliedFormat":99},{"version":"a0f02a73f6e3de48168d14abe33bf5970fdacdb52d7c574e908e75ad571e78f7","impliedFormat":99},{"version":"c728002a759d8ec6bccb10eed56184e86aeff0a762c1555b62b5d0fa9d1f7d64","impliedFormat":99},{"version":"586f94e07a295f3d02f847f9e0e47dbf14c16e04ccc172b011b3f4774a28aaea","impliedFormat":99},{"version":"cfe1a0f4ed2df36a2c65ea6bc235dbb8cf6e6c25feb6629989f1fa51210b32e7","impliedFormat":99},{"version":"8ba69c9bf6de79c177329451ffde48ddab7ec495410b86972ded226552f664df","impliedFormat":99},{"version":"15111cbe020f8802ad1d150524f974a5251f53d2fe10eb55675f9df1e82dbb62","impliedFormat":99},{"version":"782dc153c56a99c9ed07b2f6f497d8ad2747764966876dbfef32f3e27ce11421","impliedFormat":99},{"version":"cc2db30c3d8bb7feb53a9c9ff9b0b859dd5e04c83d678680930b5594b2bf99cb","impliedFormat":99},{"version":"46909b8c85a6fd52e0807d18045da0991e3bdc7373435794a6ba425bc23cc6be","impliedFormat":99},{"version":"e4e511ff63bb6bd69a2a51e472c6044298bca2c27835a34a20827bc3ef9b7d13","impliedFormat":99},{"version":"2c86f279d7db3c024de0f21cd9c8c2c972972f842357016bfbbd86955723b223","impliedFormat":99},{"version":"112c895cff9554cf754f928477c7d58a21191c8089bffbf6905c87fe2dc6054f","impliedFormat":99},{"version":"8cfc293b33082003cacbf7856b8b5e2d6dd3bde46abbd575b0c935dc83af4844","impliedFormat":99},{"version":"d2c5c53f85ce0474b3a876d76c4fc44ff7bb766b14ed1bf495f9abac181d7f5f","impliedFormat":99},{"version":"3c523f27926905fcbe20b8301a0cc2da317f3f9aea2273f8fc8d9ae88b524819","impliedFormat":99},{"version":"9ca0d706f6b039cc52552323aeccb4db72e600b67ddc7a54cebc095fc6f35539","impliedFormat":99},{"version":"a64909a9f75081342ddd061f8c6b49decf0d28051bc78e698d347bdcb9746577","impliedFormat":99},{"version":"7d8d55ae58766d0d52033eae73084c4db6a93c4630a3e17f419dd8a0b2a4dcd8","impliedFormat":99},{"version":"b8b5c8ba972d9ffff313b3c8a3321e7c14523fc58173862187e8d1cb814168ac","impliedFormat":99},{"version":"9c42c0fa76ee36cf9cc7cc34b1389fbb4bd49033ec124b93674ec635fabf7ffe","impliedFormat":99},{"version":"6184c8da9d8107e3e67c0b99dedb5d2dfe5ccf6dfea55c2a71d4037caf8ca196","impliedFormat":99},{"version":"4030ceea7bf41449c1b86478b786e3b7eadd13dfe5a4f8f5fe2eb359260e08b3","impliedFormat":99},{"version":"7bf516ec5dfc60e97a5bde32a6b73d772bd9de24a2e0ec91d83138d39ac83d04","impliedFormat":99},{"version":"e6a6fb3e6525f84edf42ba92e261240d4efead3093aca3d6eb1799d5942ba393","impliedFormat":99},{"version":"45df74648934f97d26800262e9b2af2f77ef7191d4a5c2eb1df0062f55e77891","impliedFormat":99},{"version":"3fe361e4e567f32a53af1f2c67ad62d958e3d264e974b0a8763d174102fe3b29","impliedFormat":99},{"version":"28b520acee4bc6911bfe458d1ad3ebc455fa23678463f59946ad97a327c9ab2b","impliedFormat":99},{"version":"121b39b1a9ad5d23ed1076b0db2fe326025150ef476dccb8bf87778fcc4f6dd7","impliedFormat":99},{"version":"f791f92a060b52aa043dde44eb60307938f18d4c7ac13df1b52c82a1e658953f","impliedFormat":99},{"version":"df09443e7743fd6adc7eb108e760084bacdf5914403b7aac5fbd4dc4e24e0c2c","impliedFormat":99},{"version":"eeb4ff4aa06956083eaa2aad59070361c20254b865d986bc997ee345dbd44cbb","impliedFormat":99},{"version":"ed84d5043444d51e1e5908f664addc4472c227b9da8401f13daa565f23624b6e","impliedFormat":99},{"version":"146bf888b703d8baa825f3f2fb1b7b31bda5dff803e15973d9636cdda33f4af3","impliedFormat":99},{"version":"b4ec8b7a8d23bdf7e1c31e43e5beac3209deb7571d2ccf2a9572865bf242da7c","impliedFormat":99},{"version":"3fba0d61d172091638e56fba651aa1f8a8500aac02147d29bd5a9cc0bc8f9ec2","impliedFormat":99},{"version":"a5a57deb0351b03041e0a1448d3a0cc5558c48e0ed9b79b69c99163cdca64ad8","impliedFormat":99},{"version":"9bcecf0cbc2bfc17e33199864c19549905309a0f9ecc37871146107aac6e05ae","impliedFormat":99},{"version":"d6a211db4b4a821e93c978add57e484f2a003142a6aef9dbfa1fe990c66f337b","impliedFormat":99},{"version":"bd4d10bd44ce3f630dd9ce44f102422cb2814ead5711955aa537a52c8d2cae14","impliedFormat":99},{"version":"08e4c39ab1e52eea1e528ee597170480405716bae92ebe7a7c529f490afff1e0","impliedFormat":99},{"version":"625bb2bc3867557ea7912bd4581288a9fca4f3423b8dffa1d9ed57fafc8610e3","impliedFormat":99},{"version":"d1992164ecc334257e0bef56b1fd7e3e1cea649c70c64ffc39999bb480c0ecdf","impliedFormat":99},{"version":"a53ff2c4037481eb357e33b85e0d78e8236e285b6428b93aa286ceea1db2f5dc","impliedFormat":99},{"version":"4fe608d524954b6857d78857efce623852fcb0c155f010710656f9db86e973a5","impliedFormat":99},{"version":"b53b62a9838d3f57b70cc456093662302abb9962e5555f5def046172a4fe0d4e","impliedFormat":99},{"version":"9866369eb72b6e77be2a92589c9df9be1232a1a66e96736170819e8a1297b61f","impliedFormat":99},{"version":"43abfbdf4e297868d780b8f4cfdd8b781b90ecd9f588b05e845192146a86df34","impliedFormat":99},{"version":"582419791241fb851403ae4a08d0712a63d4c94787524a7419c2bc8e0eb1b031","impliedFormat":99},{"version":"18437eeb932fe48590b15f404090db0ab3b32d58f831d5ffc157f63b04885ee5","impliedFormat":99},{"version":"0c5eaedf622d7a8150f5c2ec1f79ac3d51eea1966b0b3e61bfdea35e8ca213a7","impliedFormat":99},{"version":"fac39fc7a9367c0246de3543a6ee866a0cf2e4c3a8f64641461c9f2dac0d8aae","impliedFormat":99},{"version":"3b9f559d0200134f3c196168630997caedeadc6733523c8b6076a09615d5dec8","impliedFormat":99},{"version":"932af64286d9723da5ef7b77a0c4229829ce8e085e6bcc5f874cb0b83e8310d4","impliedFormat":99},{"version":"adeb9278f11f5561157feee565171c72fd48f5fe34ed06f71abf24e561fcaa1e","impliedFormat":99},{"version":"2269fef79b4900fc6b08c840260622ca33524771ff24fda5b9101ad98ea551f3","impliedFormat":99},{"version":"73d47498a1b73d5392d40fb42a3e7b009ae900c8423f4088c4faa663cc508886","impliedFormat":99},{"version":"7efc34cdc4da0968c3ba687bc780d5cacde561915577d8d1c1e46c7ac931d023","impliedFormat":99},{"version":"3c20a3bb0c50c819419f44aa55acc58476dad4754a16884cef06012d02b0722f","impliedFormat":99},{"version":"4569abf6bc7d51a455503670f3f1c0e9b4f8632a3b030e0794c61bfbba2d13be","impliedFormat":99},{"version":"98b2297b4dc1404078a54b61758d8643e4c1d7830af724f3ed2445d77a7a2d57","impliedFormat":99},{"version":"952ba89d75f1b589e07070fea2d8174332e3028752e76fd46e1c16cc51e6e2af","impliedFormat":99},{"version":"b6c9a2deefb6a57ff68d2a38d33c34407b9939487fc9ee9f32ba3ecf2987a88a","impliedFormat":99},{"version":"f6b371377bab3018dac2bca63e27502ecbd5d06f708ad7e312658d3b5315d948","impliedFormat":99},{"version":"31947dd8f1c8eeb7841e1f139a493a73bd520f90e59a6415375d0d8e6a031f01","impliedFormat":99},{"version":"95cd83b807e10b1af408e62caf5fea98562221e8ddca9d7ccc053d482283ddda","impliedFormat":99},{"version":"19287d6b76288c2814f1633bdd68d2b76748757ffd355e73e41151644e4773d6","impliedFormat":99},{"version":"fc4e6ec7dade5f9d422b153c5d8f6ad074bd9cc4e280415b7dc58fb5c52b5df1","impliedFormat":99},{"version":"3aea973106e1184db82d8880f0ca134388b6cbc420f7309d1c8947b842886349","impliedFormat":99},{"version":"765e278c464923da94dda7c2b281ece92f58981642421ae097862effe2bd30fa","impliedFormat":99},{"version":"de260bed7f7d25593f59e859bd7c7f8c6e6bb87e8686a0fcafa3774cb5ca02d8","impliedFormat":99},{"version":"b5c341ce978f5777fbe05bc86f65e9906a492fa6b327bda3c6aae900c22e76c6","impliedFormat":99},{"version":"686ddbfaf88f06b02c6324005042f85317187866ca0f8f4c9584dd9479653344","impliedFormat":99},{"version":"7f789c0c1db29dd3aab6e159d1ba82894a046bf8df595ac48385931ae6ad83e0","impliedFormat":99},{"version":"8eb3057d4fe9b59b2492921b73a795a2455ebe94ccb3d01027a7866612ead137","impliedFormat":99},{"version":"1e43c5d7aee1c5ec20611e28b5417f5840c75d048de9d7f1800d6808499236f8","impliedFormat":99},{"version":"d42610a5a2bee4b71769968a24878885c9910cd049569daa2d2ee94208b3a7a5","impliedFormat":99},{"version":"f6ed95506a6ed2d40ed5425747529befaa4c35fcbbc1e0d793813f6d725690fa","impliedFormat":99},{"version":"a6fcc1cd6583939506c906dff1276e7ebdc38fbe12d3e108ba38ad231bd18d97","impliedFormat":99},{"version":"ed13354f0d96fb6d5878655b1fead51722b54875e91d5e53ef16de5b71a0e278","impliedFormat":99},{"version":"1193b4872c1fb65769d8b164ca48124c7ebacc33eae03abf52087c2b29e8c46c","impliedFormat":99},{"version":"af682dfabe85688289b420d939020a10eb61f0120e393d53c127f1968b3e9f66","impliedFormat":99},{"version":"0dca04006bf13f72240c6a6a502df9c0b49c41c3cab2be75e81e9b592dcd4ea8","impliedFormat":99},{"version":"79d6ac4a2a229047259116688f9cd62fda25422dee3ad304f77d7e9af53a41ef","impliedFormat":99},{"version":"64534c17173990dc4c3d9388d16675a059aac407031cfce8f7fdffa4ee2de988","impliedFormat":99},{"version":"ba46d160a192639f3ca9e5b640b870b1263f24ac77b6895ab42960937b42dcbb","impliedFormat":99},{"version":"5e5ddd6fc5b590190dde881974ab969455e7fad61012e32423415ae3d085b037","impliedFormat":99},{"version":"1c16fd00c42b60b96fe0fa62113a953af58ddf0d93b0a49cb4919cf5644616f0","impliedFormat":99},{"version":"eb240c0e6b412c57f7d9a9f1c6cd933642a929837c807b179a818f6e8d3a4e44","impliedFormat":99},{"version":"4a7bde5a1155107fc7d9483b8830099f1a6072b6afda5b78d91eb5d6549b3956","impliedFormat":99},{"version":"3c1baaffa9a24cc7ef9eea6b64742394498e0616b127ca630aca0e11e3298006","impliedFormat":99},{"version":"87ca1c31a326c898fa3feb99ec10750d775e1c84dbb7c4b37252bcf3742c7b21","impliedFormat":99},{"version":"d7bd26af1f5457f037225602035c2d7e876b80d02663ab4ca644099ad3a55888","impliedFormat":99},{"version":"2ad0a6b93e84a56b64f92f36a07de7ebcb910822f9a72ad22df5f5d642aff6f3","impliedFormat":99},{"version":"523d1775135260f53f672264937ee0f3dc42a92a39de8bee6c48c7ea60b50b5a","impliedFormat":99},{"version":"e441b9eebbc1284e5d995d99b53ed520b76a87cab512286651c4612d86cd408e","impliedFormat":99},{"version":"76f853ee21425c339a79d28e0859d74f2e53dee2e4919edafff6883dd7b7a80f","impliedFormat":99},{"version":"00cf042cd6ba1915648c8d6d2aa00e63bbbc300ea54d28ed087185f0f662e080","impliedFormat":99},{"version":"f57e6707d035ab89a03797d34faef37deefd3dd90aa17d90de2f33dce46a2c56","impliedFormat":99},{"version":"cc8b559b2cf9380ca72922c64576a43f000275c72042b2af2415ce0fb88d7077","impliedFormat":99},{"version":"1a337ca294c428ba8f2eb01e887b28d080ee4a4307ae87e02e468b1d26af4a74","impliedFormat":99},{"version":"5a15362fc2e72765a908c0d4dd89e3ab3b763e8bc8c23f19234a709ecfd202fe","impliedFormat":99},{"version":"2dffdfe62ac8af0943853234519616db6fd8958fc7ff631149fd8364e663f361","impliedFormat":99},{"version":"5dbdb2b2229b5547d8177c34705272da5a10b8d0033c49efbc9f6efba5e617f2","impliedFormat":99},{"version":"6fc0498cd8823d139004baff830343c9a0d210c687b2402c1384fb40f0aa461c","impliedFormat":99},{"version":"8492306a4864a1dc6fc7e0cc0de0ae9279cbd37f3aae3e9dc1065afcdc83dddc","impliedFormat":99},{"version":"c011b378127497d6337a93f020a05f726db2c30d55dc56d20e6a5090f05919a6","impliedFormat":99},{"version":"f4556979e95a274687ae206bbab2bb9a71c3ad923b92df241d9ab88c184b3f40","impliedFormat":99},{"version":"50e82bb6e238db008b5beba16d733b77e8b2a933c9152d1019cf8096845171a4","impliedFormat":99},{"version":"d6011f8b8bbf5163ef1e73588e64a53e8bf1f13533c375ec53e631aad95f1375","impliedFormat":99},{"version":"693cd7936ac7acfa026d4bcb5801fce71cec49835ba45c67af1ef90dbfd30af7","impliedFormat":99},{"version":"195e2cf684ecddfc1f6420564535d7c469f9611ce7a380d6e191811f84556cd2","impliedFormat":99},{"version":"1dc6b6e7b2a7f2962f31c77f4713f3a5a132bbe14c00db75d557568fe82e4311","impliedFormat":99},{"version":"add93b1180e9aaac2dae4ef3b16f7655893e2ecbe62bd9e48366c305f0063d89","impliedFormat":99},{"version":"594bd896fe37c970aafb7a376ebeec4c0d636b62a5f611e2e27d30fb839ad8a5","impliedFormat":99},{"version":"b1c6a6faf60542ba4b4271db045d7faea56e143b326ef507d2797815250f3afc","impliedFormat":99},{"version":"8c8b165beb794260f462679329b131419e9f5f35212de11c4d53e6d4d9cbedf6","impliedFormat":99},{"version":"ee5a4cf57d49fcf977249ab73c690a59995997c4672bb73fcaaf2eed65dbd1b2","impliedFormat":99},{"version":"f9f36051f138ab1c40b76b230c2a12b3ce6e1271179f4508da06a959f8bee4c1","impliedFormat":99},{"version":"9dc2011a3573d271a45c12656326530c0930f92539accbec3531d65131a14a14","impliedFormat":99},{"version":"091521ce3ede6747f784ae6f68ad2ea86bbda76b59d2bf678bcad2f9d141f629","impliedFormat":99},{"version":"202c2be951f53bafe943fb2c8d1245e35ed0e4dfed89f48c9a948e4d186dd6d4","impliedFormat":99},{"version":"c618aead1d799dbf4f5b28df5a6b9ce13d72722000a0ec3fe90a8115b1ea9226","impliedFormat":99},{"version":"9b0bf59708549c3e77fddd36530b95b55419414f88bbe5893f7bc8b534617973","impliedFormat":99},{"version":"7e216f67c4886f1bde564fb4eebdd6b185f262fe85ad1d6128cad9b229b10354","impliedFormat":99},{"version":"cd51e60b96b4d43698df74a665aa7a16604488193de86aa60ec0c44d9f114951","impliedFormat":99},{"version":"b63341fb6c7ba6f2aeabd9fc46b43e6cc2d2b9eec06534cfd583d9709f310ec2","impliedFormat":99},{"version":"be2af50c81b15bcfe54ad60f53eb1c72dae681c72d0a9dce1967825e1b5830a3","impliedFormat":99},{"version":"be5366845dfb9726f05005331b9b9645f237f1ddc594c0def851208e8b7d297b","impliedFormat":99},{"version":"5ddd536aaeadd4bf0f020492b3788ed209a7050ce27abec4e01c7563ff65da81","impliedFormat":99},{"version":"e243b24da119c1ef0d79af2a45217e50682b139cb48e7607efd66cc01bd9dcda","impliedFormat":99},{"version":"5b1398c8257fd180d0bf62e999fe0a89751c641e87089a83b24392efda720476","impliedFormat":99},{"version":"1588b1359f8507a16dbef67cd2759965fc2e8d305e5b3eb71be5aa9506277dff","impliedFormat":99},{"version":"4c99f2524eee1ec81356e2b4f67047a4b7efaf145f1c4eb530cd358c36784423","impliedFormat":99},{"version":"b30c6b9f6f30c35d6ef84daed1c3781e367f4360171b90598c02468b0db2fc3d","impliedFormat":99},{"version":"79c0d32274ccfd45fae74ac61d17a2be27aea74c70806d22c43fc625b7e9f12a","impliedFormat":99},{"version":"1b7e3958f668063c9d24ac75279f3e610755b0f49b1c02bb3b1c232deb958f54","impliedFormat":99},{"version":"779d4022c3d0a4df070f94858a33d9ebf54af3664754536c4ce9fd37c6f4a8db","impliedFormat":99},{"version":"e662f063d46aa8c088edffdf1d96cb13d9a2cbf06bc38dc6fc62b4d125fb7b49","impliedFormat":99},{"version":"d1d612df1e41c90d9678b07740d13d4f8e6acec2f17390d4ff4be5c889a6d37d","impliedFormat":99},{"version":"c95933fe140918892d569186f17b70ef6b1162f851a0f13f6a89e8f4d599c5a1","impliedFormat":99},{"version":"1d8d30677f87c13c2786980a80750ac1e281bdb65aa013ea193766fe9f0edd74","impliedFormat":99},{"version":"4661673cbc984b8a6ee5e14875a71ed529b64e7f8e347e12c0db4cecc25ad67d","impliedFormat":99},{"version":"7f980a414274f0f23658baa9a16e21d828535f9eac538e2eab2bb965325841db","impliedFormat":99},{"version":"20fb747a339d3c1d4a032a31881d0c65695f8167575e01f222df98791a65da9b","impliedFormat":99},{"version":"dd4e7ebd3f205a11becf1157422f98db675a626243d2fbd123b8b93efe5fb505","impliedFormat":99},{"version":"43ec6b74c8d31e88bb6947bb256ad78e5c6c435cbbbad991c3ff39315b1a3dba","impliedFormat":99},{"version":"b27242dd3af2a5548d0c7231db7da63d6373636d6c4e72d9b616adaa2acef7e1","impliedFormat":99},{"version":"e0ee7ba0571b83c53a3d6ec761cf391e7128d8f8f590f8832c28661b73c21b68","impliedFormat":99},{"version":"072bfd97fc61c894ef260723f43a416d49ebd8b703696f647c8322671c598873","impliedFormat":99},{"version":"e70875232f5d5528f1650dd6f5c94a5bed344ecf04bdbb998f7f78a3c1317d02","impliedFormat":99},{"version":"8e495129cb6cd8008de6f4ff8ce34fe1302a9e0dcff8d13714bd5593be3f7898","impliedFormat":99},{"version":"7220461ab7f6d600b313ce621346c315c3a0ebc65b5c6f268488c5c55b68d319","impliedFormat":1},{"version":"f90d4c1ae3af9afb35920b984ba3e41bdd43f0dc7bae890b89fbd52b978f0cac","impliedFormat":1},{"version":"fcf79300e5257a23ed3bacaa6861d7c645139c6f7ece134d15e6669447e5e6db","impliedFormat":1},{"version":"187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","impliedFormat":1},{"version":"aa2c18a1b5a086bbcaae10a4efba409cc95ba7287d8cf8f2591b53704fea3dea","impliedFormat":1},{"version":"b88749bdb18fc1398370e33aa72bc4f88274118f4960e61ce26605f9b33c5ba2","impliedFormat":1},{"version":"0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","impliedFormat":1},{"version":"00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","impliedFormat":1},{"version":"a873c50d3e47c21aa09fbe1e2023d9a44efb07cc0cb8c72f418bf301b0771fd3","impliedFormat":1},{"version":"7c14ccd2eaa82619fffc1bfa877eb68a012e9fb723d07ee98db451fadb618906","impliedFormat":1},{"version":"49c36529ee09ea9ce19525af5bb84985ea8e782cb7ee8c493d9e36d027a3d019","impliedFormat":1},{"version":"df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","impliedFormat":1},{"version":"4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd","impliedFormat":1},{"version":"0f0023f87a7eaa88ddfe3431f2012d498367c05bd783954515be175fc2794a91","signature":"fced5bcbed8bbff676c1b45d5140bd05a8c21297d83280aec4c3a285ee76c7b7"},{"version":"bac3115e9507680db50f0119d3f1a2b9e5da3319d03bc78baf8bbaf88c9ba40e","signature":"a560976220ba2908a93f019ad525eac88cf22eea1c6570ee439ff546f02f47f2"},{"version":"480caef356371d9d93ae560d6c79fe3c5e3c1aa968808bdf7359ca6a1cdfa2ff","impliedFormat":1},{"version":"a2d7393ce2d6d9d91a2f115abefed648d797989f27f7319c631ab58b1aeec4ed","signature":"aaa935b20fd9e4d3cdc82607d12bedc2fd70e1fecf6e2abfec048963742e11d2"},{"version":"0f4d464ff4e8759589b8a3baabab0f76381d129f98b3373ceb10ac82cdb8f111","signature":"a6bd346285385be7ba333d98bf049635931b2353093f8fddf79086835864c4a4"},{"version":"980d84ab65a61d1979a22e5cd3322672e75fb148392b6903d08ccef59bbf530c","impliedFormat":1},{"version":"c1e20c728a5350a19a8ae8d09d403b4e557e0a9d1e616421952e4267c9203758","impliedFormat":99},{"version":"07302586dd599e587c2e75c9ff5980bafdf23ac96210d8fdeb873fd991e4ccbd","impliedFormat":99},{"version":"97be02f2e3b0c17486c18ac5d04feac3f5fbcff60a2e517827587396a64636e9","signature":"fe4ceb08d9067ccba5e917a320e68f5b6c3e371eeb6cfc352a1035b278585100"},{"version":"beeff8dc291a52e04420be47c9b7991e921d9df64034d3e3f1edd6f29bd5d22e","signature":"419902873b2a9b993fb33bad47d5620810d334e1ebb08cf300294f03d722f276"},{"version":"caf4af98bf464ad3e10c46cf7d340556f89197aab0f87f032c7b84eb8ddb24d9","impliedFormat":99},{"version":"71acd198e19fa38447a3cbc5c33f2f5a719d933fccf314aaff0e8b0593271324","impliedFormat":99},{"version":"3494dde244b63e8c531aaa6e5331d17b20312647114b3d3885d090541e9744ae","signature":"7711adec5eed0b4cb819cae62ea768204c4bd260fa3ee1aceb586358db5f6aa0"},{"version":"b5f1d5952ee6043ba28a68ed3f4fa6de4f2345f38bee23663588ff63acb03a82","signature":"f302b2e8d5854b21418c5b939e2a3408d6d2fc9c8f4cd86c3dda420ad1e92424"},{"version":"7469bcf89a587c78eec937aa3abcf80937096a1f1ec315448d9dee4df9e580a5","signature":"d138698076bd8f5d5aabe58af6184f369b6c5709d614f305f10052c8b777e029"},{"version":"cff399d99c68e4fafdd5835d443a980622267a39ac6f3f59b9e3d60d60c4f133","impliedFormat":99},{"version":"6ada175c0c585e89569e8feb8ff6fc9fc443d7f9ca6340b456e0f94cbef559bf","impliedFormat":99},{"version":"e56e4d95fad615c97eb0ae39c329a4cda9c0af178273a9173676cc9b14b58520","impliedFormat":99},{"version":"73e8dfd5e7d2abc18bdb5c5873e64dbdd1082408dd1921cad6ff7130d8339334","impliedFormat":99},{"version":"fc820b2f0c21501f51f79b58a21d3fa7ae5659fc1812784dbfbb72af147659ee","impliedFormat":99},{"version":"4f041ef66167b5f9c73101e5fd8468774b09429932067926f9b2960cc3e4f99d","impliedFormat":99},{"version":"31501b8fc4279e78f6a05ca35e365e73c0b0c57d06dbe8faecb10c7254ce7714","impliedFormat":99},{"version":"7bc76e7d4bbe3764abaf054aed3a622c5cdbac694e474050d71ce9d4ab93ea4b","impliedFormat":99},{"version":"ff4e9db3eb1e95d7ba4b5765e4dc7f512b90fb3b588adfd5ca9b0d9d7a56a1ae","impliedFormat":99},{"version":"f205fd03cd15ea054f7006b7ef8378ef29c315149da0726f4928d291e7dce7b9","impliedFormat":99},{"version":"d683908557d53abeb1b94747e764b3bd6b6226273514b96a942340e9ce4b7be7","impliedFormat":99},{"version":"7c6d5704e2f236fddaf8dbe9131d998a4f5132609ef795b78c3b63f46317f88a","impliedFormat":99},{"version":"d05bd4d28c12545827349b0ac3a79c50658d68147dad38d13e97e22353544496","impliedFormat":99},{"version":"b6436d90a5487d9b3c3916b939f68e43f7eaca4b0bb305d897d5124180a122b9","impliedFormat":99},{"version":"04ace6bedd6f59c30ea6df1f0f8d432c728c8bc5c5fd0c5c1c80242d3ab51977","impliedFormat":99},{"version":"57a8a7772769c35ba7b4b1ba125f0812deec5c7102a0d04d9e15b1d22880c9e8","impliedFormat":99},{"version":"badcc9d59770b91987e962f8e3ddfa1e06671b0e4c5e2738bbd002255cad3f38","impliedFormat":99},{"version":"4661f2b457284c8c7eb0c9538149f5e85ff7a7652e337d2905cbe6fb07bb2739","signature":"88c1575fad6a5fc4ac4ef5a82d79f7f10e2fb2acddb2b7748e18935ca0ee3e15"},{"version":"38478d5149d99fc5bdcad2b8b5666faad2b8c58a4e23a3f58bc1eff77ed25b58","signature":"0a3b8d5cdac08b18c555768f7ef736b6f39a22fbe54211492710a9e625473629"},{"version":"12c1e049cbe3b4cff3371f6b0f58bd06ab7f015514c506b73ed3f61853b13e49","signature":"f9c1060a55f91ee29aa0cf272ddedd4ba0dee59141a9a857008c3052ed8c654c"},{"version":"0bf39ac9eae0cd32a07f6dcb872955c4249f887f806dd7b325641ce87a176e42","impliedFormat":99},{"version":"1da3f308359fd73af9e60fd659291bb8ce2bc0a1117663744a644627f0d31807","signature":"4944adc22fce1b2c0c74742ee6ba0d22fe126d268a03ab7e400518686857b20f"},{"version":"65939ff6840753aa5d360f38f7f01be55f52f6187418acce7a1d0d5cdf0f70c5","signature":"80f1f2f5c9aaa65b36e64c20f0937bd2b7cfa7e655a11f4ad45edb90ed0bbb49"},{"version":"f63b979ff25ea070f77b8bdd465e29e8d18f355001186b301166125f47cddb4b","signature":"8b954497f25e31427e775ce392114800268c5a6e7c800a835f1a787239b75953"},{"version":"0e1cd01c53318a29a8df99fdbd02c0606f644ea5d2911a41cbff8ae009dcb22a","signature":"84676f996b355ccc032207073b56e813d1348c113a7c0340ffaa6f89f74036d5"},{"version":"a9373d52584b48809ffd61d74f5b3dfd127da846e3c4ee3c415560386df3994b","impliedFormat":99},{"version":"caf4af98bf464ad3e10c46cf7d340556f89197aab0f87f032c7b84eb8ddb24d9","impliedFormat":99},{"version":"7ec047b73f621c526468517fea779fec2007dd05baa880989def59126c98ef79","impliedFormat":99},{"version":"8dd450de6d756cee0761f277c6dc58b0b5a66b8c274b980949318b8cad26d712","impliedFormat":99},{"version":"904d6ad970b6bd825449480488a73d9b98432357ab38cf8d31ffd651ae376ff5","impliedFormat":99},{"version":"dfcf16e716338e9fe8cf790ac7756f61c85b83b699861df970661e97bf482692","impliedFormat":99},{"version":"51ee2064d2cef706e074ecc7ee291894394d0e4bc6d0139f9fc6fb55a1ab4299","signature":"b2c7cf7f304f6ebfea4dda1e9c526a79a591fc8d3bd003af083384025da649b1"},{"version":"3ba79cb84dbd2ea04159b22df4d2394b5fe7d0abdd1a4ae82526006db55564bd","signature":"0ac76f72a94a13f3081c41c43b58679492c219ccada653f40801a89fcd5e9d04"},{"version":"26e97164346582f80ca60138865aeade9a21ea5d999f70b1ab3a2f583c75c2f3","signature":"e3acea55bf6e605744892005d79553637088b9a4eddc37b9dbd6dbd6aba7ecdd"},{"version":"bd814f9ced7b0107e0c79b0e6edf5daf85abca564a11c59d0aecaa5e9ce3ad14","signature":"b80c7945e78816c3f067d6e8604995964c07d7662a04f892ced0d6f09a444a45"},{"version":"bb703864a1bc9ca5ac3589ffd83785f6dc86f7f6c485c97d7ffd53438777cb9e","impliedFormat":1},{"version":"9694e54f22b55c5046cb605c5212b88f963d2a0493dd3262d169d74f1bb861ab","signature":"90ada4c3ca530172af0d36a8da6ea9a1ea74d54da3bad6448982ad8674685abc"},{"version":"77cd0ed74a04592db2c79edce59fff95b8bbaa29dfaa3feb39b9f3597adca259","signature":"9030e3592c09abded6c91ddf71cdd3d05ba043ecc15ff9d3e2ec741930812372"},{"version":"6b5f886fe41e2e767168e491fe6048398ed6439d44e006d9f51cc31265f08978","impliedFormat":99},{"version":"56a87e37f91f5625eb7d5f8394904f3f1e2a90fb08f347161dc94f1ae586bdd0","impliedFormat":99},{"version":"6b863463764ae572b9ada405bf77aac37b5e5089a3ab420d0862e4471051393b","impliedFormat":99},{"version":"2535fc1a5fe64892783ff8f61321b181c24f824e688a4a05ae738da33466605b","impliedFormat":99},{"version":"fa3051cfd0196eaf41de55bb8b385c6cb32078edad8dbf59062d551347e80457","signature":"3aefc99917b9ccda912fdfd38a07a4479a8cd0e86a9ec90588479c5b3277ca75"},{"version":"4cf10a1082c0ffb84047fab60e04e0c7e4f9a06ff81857220eb0d83badae84cf","signature":"c3aaeb08e644523e47d172510eb27651a5c20ce4e721daca6e657cab9a34c0b5"},{"version":"684fc632f0b3aeed1f804b93c83b3f84472fc93cd7cecf933de0f749a6189d02","signature":"65c10af8da7ce7459160526e49fe02e635f2144bc1e20e22c3ddbd9ac38628ec"},{"version":"5a2b82440e7f1440ca2d971ee2eb20d2a2e444cf565de1f891cbe2cec128d01b","signature":"f3bce0fe20fbeb43e7f46b5ec88f795c53ce5723e6904a53a0ac8877c41131a6"},{"version":"979d4f8d0101f09db9d7397237663d856605221c70137411fadea6012e78894a","impliedFormat":99},{"version":"0345bc0b1067588c4ea4c48e34425d3284498c629bc6788ebc481c59949c9037","impliedFormat":99},{"version":"e30f5b5d77c891bc16bd65a2e46cd5384ea57ab3d216c377f482f535db48fc8f","impliedFormat":99},{"version":"f113afe92ee919df8fc29bca91cab6b2ffbdd12e4ac441d2bb56121eb5e7dbe3","impliedFormat":99},{"version":"49d567cc002efb337f437675717c04f207033f7067825b42bb59c9c269313d83","impliedFormat":99},{"version":"1d248f707d02dc76555298a934fba0f337f5028bb1163ce59cd7afb831c9070f","impliedFormat":99},{"version":"5d8debffc9e7b842dc0f17b111673fe0fc0cca65e67655a2b543db2150743385","impliedFormat":99},{"version":"5fccbedc3eb3b23bc6a3a1e44ceb110a1f1a70fa8e76941dce3ae25752caa7a9","impliedFormat":99},{"version":"f4031b95f3bab2b40e1616bd973880fb2f1a97c730bac5491d28d6484fac9560","impliedFormat":99},{"version":"dbe75b3c5ed547812656e7945628f023c4cd0bc1879db0db3f43a57fb8ec0e2b","impliedFormat":99},{"version":"b754718a546a1939399a6d2a99f9022d8a515f2db646bab09f7d2b5bff3cbb82","impliedFormat":99},{"version":"2eef10fb18ed0b4be450accf7a6d5bcce7b7f98e02cac4e6e793b7ad04fc0d79","impliedFormat":99},{"version":"c46f471e172c3be12c0d85d24876fedcc0c334b0dab48060cdb1f0f605f09fed","impliedFormat":99},{"version":"7d6ddeead1d208588586c58c26e4a23f0a826b7a143fb93de62ed094d0056a33","impliedFormat":99},{"version":"7c5782291ff6e7f2a3593295681b9a411c126e3736b83b37848032834832e6b9","impliedFormat":99},{"version":"3a3f09df6258a657dd909d06d4067ee360cd2dccc5f5d41533ae397944a11828","impliedFormat":99},{"version":"ea54615be964503fec7bce04336111a6fa455d3e8d93d44da37b02c863b93eb8","impliedFormat":99},{"version":"2a83694bc3541791b64b0e57766228ea23d92834df5bf0b0fcb93c5bb418069c","impliedFormat":99},{"version":"b5913641d6830e7de0c02366c08b1d26063b5758132d8464c938e78a45355979","impliedFormat":99},{"version":"46c095d39c1887979d9494a824eda7857ec13fb5c20a6d4f7d02c2975309bf45","impliedFormat":99},{"version":"f6e02ca076dc8e624aa38038e3488ebd0091e2faea419082ed764187ba8a6500","impliedFormat":99},{"version":"4d49e8a78aba1d4e0ad32289bf8727ae53bc2def9285dff56151a91e7d770c3e","impliedFormat":99},{"version":"63315cf08117cc728eab8f3eec8801a91d2cd86f91d0ae895d7fd928ab54596d","impliedFormat":99},{"version":"a14a6f3a5636bcaebfe9ec2ccfa9b07dc94deb1f6c30358e9d8ea800a1190d5e","impliedFormat":99},{"version":"21206e7e81876dabf2a7af7aa403f343af1c205bdcf7eff24d9d7f4eee6214c4","impliedFormat":99},{"version":"cd0a9f0ffec2486cad86b7ef1e4da42953ffeb0eb9f79f536e16ff933ec28698","impliedFormat":99},{"version":"f609a6ec6f1ab04dba769e14d6b55411262fd4627a099e333aa8876ea125b822","impliedFormat":99},{"version":"6d8052bb814be030c64cb22ca0e041fe036ad3fc8d66208170f4e90d0167d354","impliedFormat":99},{"version":"851f72a5d3e8a2bf7eeb84a3544da82628f74515c92bdf23c4a40af26dcc1d16","impliedFormat":99},{"version":"59692a7938aab65ea812a8339bbc63c160d64097fe5a457906ea734d6f36bcd4","impliedFormat":99},{"version":"8cb3b95e610c44a9986a7eab94d7b8f8462e5de457d5d10a0b9c6dd16bde563b","impliedFormat":99},{"version":"f571713abd9a676da6237fe1e624d2c6b88c0ca271c9f1acc1b4d8efeea60b66","impliedFormat":99},{"version":"16c5d3637d1517a3d17ed5ebcfbb0524f8a9997a7b60f6100f7c5309b3bb5ac8","impliedFormat":99},{"version":"ca1ec669726352c8e9d897f24899abf27ad15018a6b6bcf9168d5cd1242058ab","impliedFormat":99},{"version":"bffb1b39484facf6d0c5d5feefe6c0736d06b73540b9ce0cf0f12da2edfd8e1d","impliedFormat":99},{"version":"f1663c030754f6171b8bb429096c7d2743282de7733bccd6f67f84a4c588d96e","impliedFormat":99},{"version":"dd09693285e58504057413c3adc84943f52b07d2d2fd455917f50fa2a63c9d69","impliedFormat":99},{"version":"d94c94593d03d44a03810a85186ae6d61ebeb3a17a9b210a995d85f4b584f23d","impliedFormat":99},{"version":"c7c3bf625a8cb5a04b1c0a2fbe8066ecdbb1f383d574ca3ffdabe7571589a935","impliedFormat":99},{"version":"7a2f39a4467b819e873cd672c184f45f548511b18f6a408fe4e826136d0193bb","impliedFormat":99},{"version":"f8a0ae0d3d4993616196619da15da60a6ec5a7dfaf294fe877d274385eb07433","impliedFormat":99},{"version":"2cca80de38c80ef6c26deb4e403ca1ff4efbe3cf12451e26adae5e165421b58d","impliedFormat":99},{"version":"0070d3e17aa5ad697538bf865faaff94c41f064db9304b2b949eb8bcccb62d34","impliedFormat":99},{"version":"53df93f2db5b7eb8415e98242c1c60f6afcac2db44bce4a8830c8f21eee6b1dd","impliedFormat":99},{"version":"d67bf28dc9e6691d165357424c8729c5443290367344263146d99b2f02a72584","impliedFormat":99},{"version":"932557e93fbdf0c36cc29b9e35950f6875425b3ac917fa0d3c7c2a6b4f550078","impliedFormat":99},{"version":"e3dc7ec1597fb61de7959335fb7f8340c17bebf2feb1852ed8167a552d9a4a25","impliedFormat":99},{"version":"b64e15030511c5049542c2e0300f1fe096f926cf612662884f40227267f5cd9f","impliedFormat":99},{"version":"1932796f09c193783801972a05d8fb1bfef941bb46ac76fbe1abb0b3bfb674fa","impliedFormat":99},{"version":"d9575d5787311ee7d61ad503f5061ebcfaf76b531cfecce3dc12afb72bb2d105","impliedFormat":99},{"version":"5b41d96c9a4c2c2d83f1200949f795c3b6a4d2be432b357ad1ab687e0f0de07c","impliedFormat":99},{"version":"38ec829a548e869de4c5e51671245a909644c8fb8e7953259ebb028d36b4dd06","impliedFormat":99},{"version":"20c2c5e44d37dac953b516620b5dba60c9abd062235cdf2c3bfbf722d877a96b","impliedFormat":99},{"version":"875fe6f7103cf87c1b741a0895fda9240fed6353d5e7941c8c8cbfb686f072b4","impliedFormat":99},{"version":"c0ccccf8fbcf5d95f88ed151d0d8ce3015aa88cf98d4fd5e8f75e5f1534ee7ae","impliedFormat":99},{"version":"1b1f4aba21fd956269ced249b00b0e5bfdbd5ebd9e628a2877ab1a2cf493c919","impliedFormat":99},{"version":"939e3299952dff0869330e3324ba16efe42d2cf25456d7721d7f01a43c1b0b34","impliedFormat":99},{"version":"f0a9b52faec508ba22053dedfa4013a61c0425c8b96598cef3dea9e4a22637c6","impliedFormat":99},{"version":"d5b302f50db61181adc6e209af46ae1f27d7ef3d822de5ea808c9f44d7d219fd","impliedFormat":99},{"version":"19131632ba492c83e8eeadf91a481def0e0b39ffc3f155bc20a7f640e0570335","impliedFormat":99},{"version":"4581c03abea21396c3e1bb119e2fd785a4d91408756209cbeed0de7070f0ab5b","impliedFormat":99},{"version":"ebcd3b99e17329e9d542ef2ccdd64fddab7f39bc958ee99bbdb09056c02d6e64","impliedFormat":99},{"version":"4b148999deb1d95b8aedd1a810473a41d9794655af52b40e4894b51a8a4e6a6d","impliedFormat":99},{"version":"1781cc99a0f3b4f11668bb37cca7b8d71f136911e87269e032f15cf5baa339bf","impliedFormat":99},{"version":"33f1b7fa96117d690035a235b60ecd3cd979fb670f5f77b08206e4d8eb2eb521","impliedFormat":99},{"version":"01429b306b94ff0f1f5548ce5331344e4e0f5872b97a4776bd38fd2035ad4764","impliedFormat":99},{"version":"c1bc4f2136de7044943d784e7a18cb8411c558dbb7be4e4b4876d273cbd952af","impliedFormat":99},{"version":"5470f84a69b94643697f0d7ec2c8a54a4bea78838aaa9170189b9e0a6e75d2cf","impliedFormat":99},{"version":"36aaa44ee26b2508e9a6e93cd567e20ec700940b62595caf962249035e95b5e3","impliedFormat":99},{"version":"f8343562f283b7f701f86ad3732d0c7fd000c20fe5dc47fa4ed0073614202b4d","impliedFormat":99},{"version":"a53c572630a78cd99a25b529069c1e1370f8a5d8586d98e798875f9052ad7ad1","impliedFormat":99},{"version":"4ad3451d066711dde1430c544e30e123f39e23c744341b2dfd3859431c186c53","impliedFormat":99},{"version":"8069cbef9efa7445b2f09957ffbc27b5f8946fdbade4358fb68019e23df4c462","impliedFormat":99},{"version":"cd8b4e7ad04ba9d54eb5b28ac088315c07335b837ee6908765436a78d382b4c3","impliedFormat":99},{"version":"d533d8f8e5c80a30c51f0cbfe067b60b89b620f2321d3a581b5ba9ac8ffd7c3a","impliedFormat":99},{"version":"33f49f22fdda67e1ddbacdcba39e62924793937ea7f71f4948ed36e237555de3","impliedFormat":99},{"version":"710c31d7c30437e2b8795854d1aca43b540cb37cefd5900f09cfcd9e5b8540c4","impliedFormat":99},{"version":"b2c03a0e9628273bc26a1a58112c311ffbc7a0d39938f3878837ab14acf3bc41","impliedFormat":99},{"version":"a93beb0aa992c9b6408e355ea3f850c6f41e20328186a8e064173106375876c2","impliedFormat":99},{"version":"efdcba88fcd5421867898b5c0e8ea6331752492bd3547942dea96c7ebcb65194","impliedFormat":99},{"version":"a98e777e7a6c2c32336a017b011ba1419e327320c3556b9139413e48a8460b9a","impliedFormat":99},{"version":"ea44f7f8e1fe490516803c06636c1b33a6b82314366be1bd6ffa4ba89bc09f86","impliedFormat":99},{"version":"c25f22d78cc7f46226179c33bef0e4b29c54912bde47b62e5fdaf9312f22ffcb","impliedFormat":99},{"version":"d57579cfedc5a60fda79be303080e47dfe0c721185a5d95276523612228fcefc","impliedFormat":99},{"version":"a41630012afe0d4a9ff14707f96a7e26e1154266c008ddbd229e3f614e4d1cf7","impliedFormat":99},{"version":"298a858633dfa361bb8306bbd4cfd74f25ab7cc20631997dd9f57164bc2116d1","impliedFormat":99},{"version":"921782c45e09940feb232d8626a0b8edb881be2956520c42c44141d9b1ddb779","impliedFormat":99},{"version":"06117e4cc7399ce1c2b512aa070043464e0561f956bda39ef8971a2fcbcdbf2e","impliedFormat":99},{"version":"daccf332594b304566c7677c2732fed6e8d356da5faac8c5f09e38c2f607a4ab","impliedFormat":99},{"version":"4386051a0b6b072f35a2fc0695fecbe4a7a8a469a1d28c73be514548e95cd558","impliedFormat":99},{"version":"78e41de491fe25947a7fd8eeef7ebc8f1c28c1849a90705d6e33f34b1a083b90","impliedFormat":99},{"version":"3ccd198e0a693dd293ed22e527c8537c76b8fe188e1ebf20923589c7cfb2c270","impliedFormat":99},{"version":"2ebf2ee015d5c8008428493d4987e2af9815a76e4598025dd8c2f138edc1dcae","impliedFormat":99},{"version":"0dcc8f61382c9fcdafd48acc54b6ffda69ca4bb7e872f8ad12fb011672e8b20c","impliedFormat":99},{"version":"9db563287eb527ead0bcb9eb26fbec32f662f225869101af3cabcb6aee9259cf","impliedFormat":99},{"version":"068489bec523be43f12d8e4c5c337be4ff6a7efb4fe8658283673ae5aae14b85","impliedFormat":99},{"version":"838212d0dc5b97f7c5b5e29a89953de3906f72fce13c5ae3c5ade346f561d226","impliedFormat":99},{"version":"ddc78d29af824ad7587152ea523ed5d60f2bc0148d8741c5dacf9b5b44587b1b","impliedFormat":99},{"version":"019b522e3783e5519966927ceeb570eefcc64aba3f9545828a5fb4ae1fde53c6","impliedFormat":99},{"version":"b34623cc86497a5123de522afba770390009a56eebddba38d2aa5798b70b0a87","impliedFormat":99},{"version":"afb9b4c8bd38fb43d38a674de56e6f940698f91114fded0aa119de99c6cd049a","impliedFormat":99},{"version":"1d277860f19b8825d027947fca9928ee1f3bfaa0095e85a97dd7a681b0698dfc","impliedFormat":99},{"version":"6d32122bb1e7c0b38b6f126d166dff1f74c8020f8ba050248d182dcafc835d08","impliedFormat":99},{"version":"cfac5627d337b82d2fbeff5f0f638b48a370a8d72d653327529868a70c5bc0f8","impliedFormat":99},{"version":"8a826bc18afa4c5ed096ceb5d923e2791a5bae802219e588a999f535b1c80492","impliedFormat":99},{"version":"c860264bd6e0582515237f063a972018328d579ae3c0869cc2c4c9cf2f78cef0","impliedFormat":99},{"version":"d30a4b50cdf27ceaa58e72b9a4c6b57167e33a4a57a5fbd5c0b48cc541f21b07","impliedFormat":99},{"version":"73e94021c55ab908a1b8c53792e03bf7e0d195fee223bdc5567791b2ccbfcdec","impliedFormat":99},{"version":"5f73eb47b37f3a957fe2ac6fe654648d60185908cab930fc01c31832a5cb4b10","impliedFormat":99},{"version":"cb6372a2460010a342ba39e06e1dcfd722e696c9d63b4a71577f9a3c72d09e0a","impliedFormat":99},{"version":"6d6530e4c5f2a8d03d3e85c57030a3366c8f24198fbc7860beed9f5a35d0ad41","impliedFormat":99},{"version":"8220978de3ee01a62309bb4190fa664f34932549ff26249c92799dd58709a693","impliedFormat":99},{"version":"ac12a6010ff501e641f5a8334b8eaf521d0e0739a7e254451b6eea924c3035c7","impliedFormat":99},{"version":"97395d1e03af4928f3496cc3b118c0468b560765ab896ce811acb86f6b902b5c","impliedFormat":99},{"version":"7dcfbd6a9f1ce1ddf3050bd469aa680e5259973b4522694dc6291afe20a2ae28","impliedFormat":99},{"version":"433808ed82cf5ed8643559ea41427644e245934db5871e6b97ce49660790563e","impliedFormat":99},{"version":"efc225581aae9bb47d421a1b9f278db0238bc617b257ce6447943e59a2d1621e","impliedFormat":99},{"version":"14891c20f15be1d0d42ecbbd63de1c56a4d745e3ea2b4c56775a4d5d36855630","impliedFormat":99},{"version":"8833b88e26156b685bc6f3d6a014c2014a878ffbd240a01a8aee8a9091014e9c","impliedFormat":99},{"version":"7a2a42a1ac642a9c28646731bd77d9849cb1a05aa1b7a8e648f19ab7d72dd7dc","impliedFormat":99},{"version":"4d371c53067a3cc1a882ff16432b03291a016f4834875b77169a2d10bb1b023e","impliedFormat":99},{"version":"99b38f72e30976fd1946d7b4efe91aa227ecf0c9180e1dd6502c1d39f37445b4","impliedFormat":99},{"version":"df1bcf0b1c413e2945ce63a67a1c5a7b21dbbec156a97d55e9ea0eed90d2c604","impliedFormat":99},{"version":"6ea03bed678f170906ddf586aa742b3c122d550a8d48431796ab9081ae3b5c53","impliedFormat":99},{"version":"b4bfa90fac90c6e0d0185d2fe22f059fec67587cc34281f62294f9c4615a8082","impliedFormat":99},{"version":"b2d8bb61a776b0a150d987a01dd8411778c5ba701bb9962a0c6c3d356f590ee3","impliedFormat":99},{"version":"5ae6642588e4a72e5a62f6111cb750820034a7fbe56b5d8ec2bcb29df806ce52","impliedFormat":99},{"version":"6fca09e1abc83168caf36b751dec4ddda308b5714ec841c3ff0f3dc07b93c1b8","impliedFormat":99},{"version":"9a07957f75128ed0be5fc8a692a14da900878d5d5c21880f7c08f89688354aa4","impliedFormat":99},{"version":"8b6f3ae84eab35c50cf0f1b608c143fe95f1f765df6f753cd5855ae61b3efbe2","impliedFormat":99},{"version":"2f7268e6ac610c7122b6b416e34415ce42b51c56d080bef41786d2365f06772d","impliedFormat":99},{"version":"992491d83ff2d1e7f64a8b9117daee73724af13161f1b03171f0fa3ffe9b4e3e","impliedFormat":99},{"version":"7ca2d1a25dc4d0f1e0f1b640c0d6642087bef42c574b3fb08b172a1473776573","impliedFormat":99},{"version":"fc2266585e8f1f37e8c63d770c8e97312603006cada6c35967895500d86f8946","impliedFormat":99},{"version":"9409ac347c5779f339112000d7627f17ede6e39b0b6900679ce5454d3ad2e3c9","impliedFormat":99},{"version":"e55a1f6b198a39e38a3cea3ffe916aab6fde7965c827db3b8a1cacf144a67cd9","impliedFormat":99},{"version":"684a5c26ce2bb7956ef6b21e7f2d1c584172cd120709e5764bc8b89bac1a10eb","impliedFormat":99},{"version":"1bb71468bf39937ba312a4c028281d0c21cab9fcce9bb878bef3255cd4b7139a","impliedFormat":99},{"version":"ec9f43bbad5eca0a0397047c240e583bad29d538482824b31859baf652525869","impliedFormat":99},{"version":"9e9306805809074798cb780757190b896c347c733c101c1ef315111389dd37a0","impliedFormat":99},{"version":"66e486a9c9a86154dc9780f04325e61741f677713b7e78e515938bf54364fee2","impliedFormat":99},{"version":"33f3bdf398cc10f1c71ae14f574ad3f6d7517fe125e29608a092146b55cf1928","impliedFormat":99},{"version":"79741c2b730c696e7ae3a827081bf11da74dd079af2dbd8f7aa5af1ae80f0edd","impliedFormat":99},{"version":"2f372a4a84d0bc0709edca56f3c446697d60eadb601069b70625857a955b7a28","impliedFormat":99},{"version":"80b9fc3ad8d908bf1f97906538a90f6c55bd661c078423dfee2a46484baf252f","impliedFormat":99},{"version":"17ac6db33d189dce6d9bdb531bbdb74ad15a04991c5ecad23a642cb310055ebb","impliedFormat":99},{"version":"684bb74763606c640fe3dee0e7b9c34297b5af6aa6ceb3b265f360d39051df94","impliedFormat":99},{"version":"20c66936bdbdf6938b49053377bceea1009f491d89c2dff81efa36812a85f298","impliedFormat":99},{"version":"0c06897f7ab3830cef0701e0e083b2c684ed783ae820b306aedd501f32e9562d","impliedFormat":99},{"version":"d2a8cbeb0c0caaf531342062b4b5c227118862879f6a25033e31fad00797b7eb","impliedFormat":99},{"version":"ff786f7adefa284524a03652f2e9c2ba92e247ba6ac2f9ca81dd12f0dd4350a3","impliedFormat":99},{"version":"d128bdf00f8418209ebf75ee36d586bd7d66eb0075a8ac0f0ddf64ceb9d40a70","impliedFormat":99},{"version":"da572a1162f092f64641b8676fcfd735e4b6ca301572ec41361402842a416298","impliedFormat":99},{"version":"0d558d19c9cc65c1acfd2e209732a145aaef859082c0289ccd8a61d0cce6be46","impliedFormat":99},{"version":"c711ce68b0eabf9cfce8d871379d7c19460aa55b9d04c5e76a48623e01637697","impliedFormat":99},{"version":"56cc6eae48fd08fa709cf9163d01649f8d24d3fea5806f488d2b1b53d25e1d6c","impliedFormat":99},{"version":"57a925b13947b38c34277d93fb1e85d6f03f47be18ca5293b14082a1bd4a48f5","impliedFormat":99},{"version":"9d9d64c1fa76211dd529b6a24061b8d724e2110ee55d3829131bca47f3fe4838","impliedFormat":99},{"version":"c13042e244bb8cf65586e4131ef7aed9ca33bf1e029a43ed0ebab338b4465553","impliedFormat":99},{"version":"54be9b9c71a17cb2519b841fad294fa9dc6e0796ed86c8ac8dd9d8c0d1c3a631","impliedFormat":99},{"version":"10881be85efd595bef1d74dfa7b9a76a5ab1bfed9fb4a4ca7f73396b72d25b90","impliedFormat":99},{"version":"925e71eaa87021d9a1215b5cf5c5933f85fe2371ddc81c32d1191d7842565302","impliedFormat":99},{"version":"faed0b3f8979bfbfb54babcff9d91bd51fda90931c7716effa686b4f30a09575","impliedFormat":99},{"version":"53c72d68328780f711dbd39de7af674287d57e387ddc5a7d94f0ffd53d8d3564","impliedFormat":99},{"version":"51129924d359cdebdccbf20dbabc98c381b58bfebe2457a7defed57002a61316","impliedFormat":99},{"version":"7270a757071e3bc7b5e7a6175f1ac9a4ddf4de09f3664d80cb8805138f7d365b","impliedFormat":99},{"version":"57ae71d27ee71b7d1f2c6d867ddafbbfbaa629ad75565e63a508dbaa3ef9f859","impliedFormat":99},{"version":"954fa6635a9afb6d288cf722e25f9deeaaf04ad9ddb448882f08aaef92504174","impliedFormat":99},{"version":"82332b8c02e24a11c88edc93c414e31fd905d7ae45af7e1e8310748ba2881b17","impliedFormat":99},{"version":"c42d5cbf94816659c01f7c2298d0370247f1a981f8ca6370301b7a03b3ced950","impliedFormat":99},{"version":"18c18ab0341fd5fdfefb5d992c365be1696bfe000c7081c964582b315e33f8f2","impliedFormat":99},{"version":"dafbd4199902d904e3d4a233b5faf5dc4c98847fcd8c0ddd7617b2aed50e90d8","impliedFormat":99},{"version":"73e7e7ebaba033350965989e4201367c849d21f9591b11ab8b3da4891c9350c0","impliedFormat":99},{"version":"aa2bbf1de7e44753a03266534f185fdf880bd2a17b63b88972c5d14885d90944","impliedFormat":99},{"version":"4a0892445dc0cffabc6b7eb938cd7f9aae95196679836e8dd445c36f726d9c99","signature":"aa4187e274e4489476bb1bc46f161534f4f2da53313285c50dd47fa546f67799"},{"version":"83434cac28a7b021c3bd4fa9f0fbddca43cad828b35a7d77e13d37d6e0fb75e3","signature":"9aa1da3dde7136aaa5dac881878ecdee6ac6c41f4e93ddab5f8c7412a4ea7626"},{"version":"a4483ab88b0f216d545ffff431befdb346f41bc8f95b90913eb26015842ff47c","signature":"d928735613b4ebd46e542f5bceae610955b61d7fc8259bfef2f06ed5a8d2ad0d"},{"version":"6d74ef62423add075d45b9e9e082729eb71e1566c7a0c797fab4ab3808330171","signature":"fb96dbf9fc167804648a04c7b5879b57aee2cc9d741ec5a660a835ead2c57bf8"},{"version":"5ca7778e9eb9d6427ff5af8d1487c5e8ca430e14b9f05456ff54c729c3a5341a","signature":"4243305a408a9e024c8374a21903090b7c0ee637e02d411d1de2b1e97b4d9361"},{"version":"ece819598d95360af8aedf36d90be41a93af49797240a6d6a69181180b095a76","signature":"638e231c7398bc8eae56d65bed1484e1d4b0126fdfa21930a51e3c18dace3712"},{"version":"1179ef8174e0e4a09d35576199df04803b1db17c0fb35b9326442884bc0b0cce","impliedFormat":99},{"version":"8c3930799bbd080d6e2ebf8bcb3b26e48ef5602a46142e630eae53a54a6dd8c6","signature":"ecf00309316e77304248c7c9777a2e3f5ea561181d893ce9f9e1ffacfe6561e2"},{"version":"33860760789f4e22a57acec82a9ac08edf445828ee7497620a6849af47dda4b2","signature":"14a12eb591ac54a18e263d969550708e56b4124e1f677d7a81b73a9f675ec267"},{"version":"9b2186574515363d406a66e390eaee47d5473b23bb82fc7f74d4267ec91c845f","signature":"592a36923cef9949c343c6b499529187ea637da6466b9d69827658a6f4c80e24"},{"version":"6ecf043b1c97662e354b1a36626dd0d2cd38531486f66a260b2523b5138285e2","signature":"6950de32a7e049fb1093dab2733843389cc00e879471b4bcbe561334c7c642d6","affectsGlobalScope":true},{"version":"840c93df053e1f267c9aa13a4063eb753e8f3df4dee3bc70b7ba3d0c7a53d167","signature":"4a33f30d601912dffe553442f42f396729d260fc03a5f5ba941986a684b1b746"},{"version":"4889ad51a1b197e176a9905e802413170ef83f39157a27f2f9c19c169107263c","signature":"5a5ce8ebe8b1d5947d5dd00536e6b6d093f58a6a9db2d9b3a6ead01a2db99ec6","affectsGlobalScope":true},{"version":"0fb9c26acbbb50306cbb29b1cc2a0469e77e29a5ecc55540f6bdb71c9dc88a3d","signature":"b790c826cfd127b216a20ef9748f1b72d256fbc75922cdbc0875e3335114fe50"},{"version":"3281e575ee2b6131cea06e7ff7628c877afd417bbe469de1ab5b45ba6e9cabe1","signature":"3b86c8b68ee23a90b25891566a3ebd0cfc72c098a8a5496caccd34447dd48a10"},{"version":"cb0fc8a51283cdc20c2e14d8968c597228ff41f6bfb3a541626ee08c28f8aea8","signature":"7db8d9fa546db9444a99b0d57045094c1a2887d72675998c26a63235353a966b"},{"version":"a34fcce011b89b92a739bea1044b1c2081a3fdff6faaec00c61e46000cb7061c","signature":"70f625a167425caeb83470c4b8b8c6768cbfb0e49d64e5f5b372c8f33e8a0605"},{"version":"b2b7c6ba202c465bcf017d34e9e10da39a0f9fa1241a603524eccc00eb6dfd77","signature":"18a91e1b85e199d19db801d5e7d5d5d7a759bd648fe20a00bc83fbcd12579864"},{"version":"114f6f21af8c04b328e304a79e824f954b0fdb9fbd76d9884e2999355d5660f5","signature":"3bb59af1d0525d670b7f66e36142efa65ee8c7141acdd2dbf12b187649bac7c2"},{"version":"563824ae3f6b0a5de408c13e58fe2a195808ff57cb09698fcaf2e875434bfb98","signature":"04d9be0926c2fe8e191ca2ea604fad0ea05c1b0bfb4cdc4aae92a1458e4e2145"},{"version":"2df0c9a9b291c330f4826373d5a89584e84180f9044f2e728795b5a8166ee74a","signature":"70cb9dccf5ea6dfb8c2dae7bed722ed99b8aaac8276b85cc6198fe2ab37f189a"},{"version":"5503209f9733bcf3413a7c3c295c7786b1a3b283a05e5c5b646088d7634ca86f","signature":"29b4bf064f31a2f36d1c0dc986024ed9cfd3e8a45bd5ca481a994185ca407ed2"},{"version":"abadcfe5f1c209fec3c5c9f8df8e50790c842e5f4aca11151512989768e91cc0","signature":"96a8e9e10130c2434db4001c102a6472ad9a0610aa8d65a69a09fe9dc5b20b47"},{"version":"e9885046946474f3b51dd3ef8723ec123ada550f550501e38bbbfe92ce4605f3","signature":"b0d4a2fc0d47853488fdbab8eb1b630614e0aa92ad4d84b321a0260360656f74"},{"version":"191717d638dc86313925baf3e9352a87fa7034707e1b44e578c7a85b212681e4","signature":"e57b2ba63587504ee95cb29f5c1e834727bb3d77d1994bf5bd2c6c69a891ed0f"},{"version":"88a41e235c478a6e76f42de2e4ec602ef711eff31eae20c06c838c7db5b34a24","signature":"1ffcff31592ab3076178b9888c7ecbae971280a84b55de7fe8d39d298f0bd72b"},{"version":"25b49ca32a0069fdfe94f7c19b4a37f8d6cfe4d100f9c55b9f0b145f11ccf970","signature":"eb0b07b2649d5adb8305243d3341660a9f9af76c1edcda6bf39fd7c334ccd6ff"},{"version":"74dcba897fbe5a8069ebbd908760fa93a69343af5d5db597b6785310ff49b12b","signature":"72ad3d92fb518b2aeffa91e75c7663363a251cf300677e1dc036a4f077b5ced4"},{"version":"87e148419a1c1b678ef52f12c0955aad1bdd1596df0533f83d2cd5ec79dba429","signature":"61e0696065b325ed71e05401bd01a88916690d1664db0fbbc576e6a6528d8822"},{"version":"badaf2aa0f23b763c0869b87c3b5659267bce2a42246c6a0a3e7b77eb61b4c3c","signature":"122294695f84f88def1f4a13032a1ff1ca64fd2536d7ed3948ec04bde99de0f6"},{"version":"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","impliedFormat":1},{"version":"c60093e32612d44af7042c3eb457c616aec3deee748a5a1eb1a6188e3d837f5c","impliedFormat":1},{"version":"1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","impliedFormat":1},{"version":"d4eda49514708a11ce9c58dc59729374e59c457c6c89a8c30b38fb600c3cf51a","impliedFormat":99},{"version":"4db86e5c643018af069a2debc1b77183e2c2774ad383150a307240b00c364e6d","signature":"249377cdb0baff65adf1d328df4c7d1d5e980b54718f32952e3ef2f14cbd683c"},{"version":"7da4465898a4d1fc7c4c2d1a2be7f9a61ec754b4de5a5c8558dba5c83913eb6c","signature":"b41568086cbc802ee04927ceeb92f5d5567d49322e016891f11df778f4bdf603"},{"version":"7f780bb4f19956c9fb9235f2c0a6bf2bd004989ec5f09000113c495d50f83057","signature":"2ebc90be29c541cbe65fc76ab9642c7348e8f76f04a670930d705b67cc0df910"},{"version":"7bf14220d51b639b3e11bb95bb6dc0afbe5d7540e46369a9e19350bf731f9a2b","signature":"bf07668ed6fbecb513f405be73a6061e428a8261bc71480a5abcd1d9e8556b9e"},{"version":"7db81eafd57cea75793beba49722ee01d7425cc677cacb26ca8becb3fcd4b30a","signature":"81759a048a34f853a6c9bdc9ee2f2e6c0b78cad27820a6412b5366613ed413c4"},{"version":"6c05d0fcee91437571513c404e62396ee798ff37a2d8bef2104accdc79deb9c0","impliedFormat":1},{"version":"7eabcef9d50a1b6776d583e3fc4d0efd2309c57776f0e58ffba56404b61fc44f","signature":"8969487db9f4484b672e2d890ae89ce4404886cd9cd56f3b3ca11eca2389ec0a"},{"version":"59ffd1f821bf240bbd89c9a10fa2fdaec9716bc292e847864efb7ccecd976d5c","impliedFormat":99},{"version":"775da84ca8dc28ebbb6f94de3be89605d181ef4aaf1147edec853b72d2483476","impliedFormat":99},{"version":"d30e67059f5c545c5f8f0cc328a36d2e03b8c4a091b4301bc1d6afb2b1491a3a","impliedFormat":1},{"version":"b0de63f5dfd4c054ddcdc4e535fa4575addb1fb0ec0d4a9156d16e85679cad21","impliedFormat":99},{"version":"eac661e4e74a9a4e4d943b87b55e364ded530dce41b5daf623985c201820d297","impliedFormat":99},{"version":"6b729c3274f6d4738fe470109bcb08b09ef98a6b356c01da3ca8dc0996b4458b","impliedFormat":1},{"version":"4dbf094f9d643b74e516779a802d9c5debd2929fb875ccfbc608d61afba064e4","impliedFormat":99},{"version":"b8d91fed56c50865ffd379f7086e7ffeda50f819d6015318a4fd07c0a26ad910","impliedFormat":99},{"version":"b8f252ac95b1c652ef9cdad9e80822c932353d2ab91df6464725a6d50123fb5d","impliedFormat":1},{"version":"4af7cea9f921f43fc1bd1c041c24c8de42edb5cd534fcf1d9612ed4a7ba3ecbc","impliedFormat":1},{"version":"52ef246c5225c5ccef89ec3372e557010f9aab82d93be36ffd257bd71fb0e015","signature":"80714ac9ab64276d10499ceab6b777e48ca71c979b2866ccc184c3fbf0f5a8cb"},{"version":"9c580c6eae94f8c9a38373566e59d5c3282dc194aa266b23a50686fe10560159","impliedFormat":99},{"version":"1e2f9c2eab409bf25614f4e0b495b9a67646e92a0a7d1a033afaada64fdb1b78","signature":"9e2b7a970acb37795476eb2e0e6ef9397c03a82abbba1e0bce24e23879279d0e"},{"version":"29eec041666e2c79b91b639a0b119d23480a9c1d2f27cda00eea11c49c8c3cf4","signature":"8b9146c6c735b1c1a0e9f9de15958f6ae1f9ab34353e8d8099f28052b581f782"},{"version":"2920053ac2e193a0a4384d5268540ffd54dd27769e51b68f80802ec5bba88561","impliedFormat":1},{"version":"a45d8f5a37d98bb2bb1ae20e66b65528262c31d8a1d6e189aae80e5ee6e46560","affectsGlobalScope":true,"impliedFormat":1},{"version":"0eb3c64f822f6828da816709075180cca47f12a51694eec1072a9b17a46c8b07","affectsGlobalScope":true,"impliedFormat":1},{"version":"70c1c729a2b1312a6641715c003358edf975d74974c3a95ac6c85c85fda3dda9","impliedFormat":1},{"version":"c2ee65dcf08027f2a3ab3ae69b6c20165074bb0579b9f8c0637a669ae12e2e7f","impliedFormat":99},{"version":"46ad8032500b9412f066593d9fddb72ef042096899532b9ee655daaaf3d7e84e","impliedFormat":99},{"version":"6745ddfe473285729c6b3ed43e2db71d6b5d5e91add5fd27e2c8960c94e3252d","impliedFormat":99},{"version":"9e019d5277f97f6d4dc5c185b0390705eacd472ab0e6d0935e9c390c52a54d95","impliedFormat":99},{"version":"e8aec07822891f8ac99950f626a9a70f9162b32465f9678458891351d94eaa16","impliedFormat":99},{"version":"66bfd5457433fffa899858291081d4a5e958bb7d0fb33f128ef7e370c8385e61","impliedFormat":99},{"version":"5971bafc1bfc0280454b95320c85d0b3ffe16ff0bc214d57bff8d312065bb39b","impliedFormat":99},{"version":"8e4ccad5024d5fb41bafe995312ae4997eb66c069b44364b69b012e7fb63b917","impliedFormat":99},{"version":"b6c414ac934d50dcfb0058a9e217d12b244985b866b38c707fe061b37350bae9","impliedFormat":99},{"version":"0020704c95e93a60cc39f2b7f8df45da5e91f55a71948d9c920ad192c649bf54","impliedFormat":99},{"version":"76d9b9995b58a65fa9591c45a8b59b08ab6b162fbbd150e2b0bc8d6d344cf1db","impliedFormat":99},{"version":"7210fa3a9d837f289b6262f7225f84971e83589124865f58e7b5b956f0a22c5a","impliedFormat":99},{"version":"7ec047b73f621c526468517fea779fec2007dd05baa880989def59126c98ef79","impliedFormat":99},{"version":"6b5f886fe41e2e767168e491fe6048398ed6439d44e006d9f51cc31265f08978","impliedFormat":99},{"version":"6b863463764ae572b9ada405bf77aac37b5e5089a3ab420d0862e4471051393b","impliedFormat":99},{"version":"904d6ad970b6bd825449480488a73d9b98432357ab38cf8d31ffd651ae376ff5","impliedFormat":99},{"version":"233267a4a036c64aee95f66a0d31e3e0ef048cccc57dd66f9cf87582b38691e4","impliedFormat":99},{"version":"c101a90c5216db08141252c171dafc81e2f858a6d89e83ecc93832e0407b2325","signature":"a1e2bb9a93b57b910afd329b213900591aad5fb62a1f9372185bc7dc39d0a89e"},{"version":"430374cddc7cc9f49d8d012015789dc97d228d73cadcd172e1fc84597f72aa67","signature":"f9f0079f4525e7dda94b2e49e5c00ee8ab4b9bced0ed271c7869051b8028e35b"},{"version":"69e2860c57587d70c6d7e7f05eaa9992e27a23660a04cde3830a0147d5b4b9df","signature":"ec05ebb474aa3c7e19130a31d3c039c79082b021b912704c583a66b8d6e6b245"},{"version":"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","impliedFormat":1},{"version":"79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6","impliedFormat":1},{"version":"5c5d901a999dfe64746ef4244618ae0628ac8afdb07975e3d5ed66e33c767ed0","impliedFormat":99},{"version":"85d08536e6cd9787f82261674e7d566421a84d286679db1503432a6ccf9e9625","impliedFormat":99},{"version":"5702b3c2f5d248290ed99419d77ca1cc3e6c29db5847172377659c50e6303768","impliedFormat":99},{"version":"9764b2eb5b4fc0b8951468fb3dbd6cd922d7752343ef5fbf1a7cd3dfcd54a75e","impliedFormat":99},{"version":"1fc2d3fe8f31c52c802c4dee6c0157c5a1d1f6be44ece83c49174e316cf931ad","impliedFormat":99},{"version":"dc4aae103a0c812121d9db1f7a5ea98231801ed405bf577d1c9c46a893177e36","impliedFormat":99},{"version":"106d3f40907ba68d2ad8ce143a68358bad476e1cc4a5c710c11c7dbaac878308","impliedFormat":99},{"version":"42ad582d92b058b88570d5be95393cf0a6c09a29ba9aa44609465b41d39d2534","impliedFormat":99},{"version":"36e051a1e0d2f2a808dbb164d846be09b5d98e8b782b37922a3b75f57ee66698","impliedFormat":99},{"version":"d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8","impliedFormat":1},{"version":"a510938c29a2e04183c801a340f0bbb5a0ae091651bd659214a8587d710ddfbb","impliedFormat":99},{"version":"07bcf85b52f652572fc2a7ec58e6de5dd4fcaf9bbc6f4706b124378cedcbb95c","impliedFormat":99},{"version":"4368a800522ca3dd131d3bbc05f2c46a8b7d612eefca41d5c2e5ac0428a45582","impliedFormat":99},{"version":"720e56f06175c21512bcaeed59a4d4173cd635ea7b4df3739901791b83f835b9","impliedFormat":99},{"version":"349949a8894257122f278f418f4ee2d39752c67b1f06162bb59747d8d06bbc51","impliedFormat":99},{"version":"364832fbef8fb60e1fee868343c0b64647ab8a4e6b0421ca6dafb10dff9979ba","impliedFormat":99},{"version":"dfe4d1087854351e45109f87e322a4fb9d3d28d8bd92aa0460f3578320f024e9","impliedFormat":99},{"version":"886051ae2ccc4c5545bedb4f9af372d69c7c3844ae68833ed1fba8cae8d90ef8","impliedFormat":99},{"version":"3f4e5997cb760b0ef04a7110b4dd18407718e7502e4bf6cd8dd8aa97af8456ff","impliedFormat":99},{"version":"381b5f28b29f104bbdd130704f0a0df347f2fc6cb7bab89cfdc2ec637e613f78","impliedFormat":99},{"version":"a52baccd4bf285e633816caffe74e7928870ce064ebc2a702e54d5e908228777","impliedFormat":99},{"version":"c6120582914acd667ce268849283702a625fee9893e9cad5cd27baada5f89f50","impliedFormat":99},{"version":"da1c22fbbf43de3065d227f8acbc10b132dfa2f3c725db415adbe392f6d1359f","impliedFormat":99},{"version":"858880acbe7e15f7e4f06ac82fd8f394dfe2362687271d5860900d584856c205","impliedFormat":99},{"version":"8dfb1bf0a03e4db2371bafe9ac3c5fb2a4481c77e904d2a210f3fed7d2ad243a","impliedFormat":99},{"version":"bc840f0c5e7274e66f61212bb517fb4348d3e25ed57a27e7783fed58301591e0","impliedFormat":99},{"version":"26438d4d1fc8c9923aea60424369c6e9e13f7ce2672e31137aa3d89b7e1ba9af","impliedFormat":99},{"version":"1ace7207aa2566178c72693b145a566f1209677a2d5e9fb948c8be56a1a61ca9","impliedFormat":99},{"version":"a776df294180c0fdb62ba1c56a959b0bb1d2967d25b372abefdb13d6eba14caf","impliedFormat":99},{"version":"6c88ea4c3b86430dd03de268fd178803d22dc6aa85f954f41b1a27c6bb6227f2","impliedFormat":99},{"version":"11e17a3addf249ae2d884b35543d2b40fabf55ddcbc04f8ee3dcdae8a0ce61eb","impliedFormat":99},{"version":"4fd8aac8f684ee9b1a61807c65ee48f217bf12c77eb169a84a3ba8ddf7335a86","impliedFormat":99},{"version":"1d0736a4bfcb9f32de29d6b15ac2fa0049fd447980cf1159d219543aa5266426","impliedFormat":99},{"version":"11083c0a8f45d2ec174df1cb565c7ba9770878d6820bf01d76d4fedb86052a77","impliedFormat":99},{"version":"d8e37104ef452b01cefe43990821adc3c6987423a73a1252aa55fb1d9ebc7e6d","impliedFormat":99},{"version":"f5622423ee5642dcf2b92d71b37967b458e8df3cf90b468675ff9fddaa532a0f","impliedFormat":99},{"version":"21a942886d6b3e372db0504c5ee277285cbe4f517a27fc4763cf8c48bd0f4310","impliedFormat":99},{"version":"41a4b2454b2d3a13b4fc4ec57d6a0a639127369f87da8f28037943019705d619","impliedFormat":99},{"version":"e9b82ac7186490d18dffaafda695f5d975dfee549096c0bf883387a8b6c3ab5a","impliedFormat":99},{"version":"eed9b5f5a6998abe0b408db4b8847a46eb401c9924ddc5b24b1cede3ebf4ee8c","impliedFormat":99},{"version":"af85fde8986fdad68e96e871ae2d5278adaf2922d9879043b9313b18fae920b1","impliedFormat":99},{"version":"8a1f5d2f7cf4bf851cc9baae82056c3316d3c6d29561df28aff525556095554b","impliedFormat":99},{"version":"a5dbd4c9941b614526619bad31047ddd5f504ec4cdad88d6117b549faef34dd3","impliedFormat":99},{"version":"e87873f06fa094e76ac439c7756b264f3c76a41deb8bc7d39c1d30e0f03ef547","impliedFormat":99},{"version":"488861dc4f870c77c2f2f72c1f27a63fa2e81106f308e3fc345581938928f925","impliedFormat":99},{"version":"eff73acfacda1d3e62bb3cb5bc7200bb0257ea0c8857ce45b3fee5bfec38ad12","impliedFormat":99},{"version":"aff4ac6e11917a051b91edbb9a18735fe56bcfd8b1802ea9dbfb394ad8f6ce8e","impliedFormat":99},{"version":"1f68aed2648740ac69c6634c112fcaae4252fbae11379d6eabee09c0fbf00286","impliedFormat":99},{"version":"5e7c2eff249b4a86fb31e6b15e4353c3ddd5c8aefc253f4c3e4d9caeb4a739d4","impliedFormat":99},{"version":"14c8d1819e24a0ccb0aa64f85c61a6436c403eaf44c0e733cdaf1780fed5ec9f","impliedFormat":99},{"version":"011423c04bfafb915ceb4faec12ea882d60acbe482780a667fa5095796c320f8","impliedFormat":99},{"version":"f8eb2909590ec619643841ead2fc4b4b183fbd859848ef051295d35fef9d8469","impliedFormat":99},{"version":"fe784567dd721417e2c4c7c1d7306f4b8611a4f232f5b7ce734382cf34b417d2","impliedFormat":99},{"version":"45d1e8fb4fd3e265b15f5a77866a8e21870eae4c69c473c33289a4b971e93704","impliedFormat":99},{"version":"cd40919f70c875ca07ecc5431cc740e366c008bcbe08ba14b8c78353fb4680df","impliedFormat":99},{"version":"ddfd9196f1f83997873bbe958ce99123f11b062f8309fc09d9c9667b2c284391","impliedFormat":99},{"version":"2999ba314a310f6a333199848166d008d088c6e36d090cbdcc69db67d8ae3154","impliedFormat":99},{"version":"62c1e573cd595d3204dfc02b96eba623020b181d2aa3ce6a33e030bc83bebb41","impliedFormat":99},{"version":"ca1616999d6ded0160fea978088a57df492b6c3f8c457a5879837a7e68d69033","impliedFormat":99},{"version":"835e3d95251bbc48918bb874768c13b8986b87ea60471ad8eceb6e38ddd8845e","impliedFormat":99},{"version":"de54e18f04dbcc892a4b4241b9e4c233cfce9be02ac5f43a631bbc25f479cd84","impliedFormat":99},{"version":"453fb9934e71eb8b52347e581b36c01d7751121a75a5cd1a96e3237e3fd9fc7e","impliedFormat":99},{"version":"bc1a1d0eba489e3eb5c2a4aa8cd986c700692b07a76a60b73a3c31e52c7ef983","impliedFormat":99},{"version":"4098e612efd242b5e203c5c0b9afbf7473209905ab2830598be5c7b3942643d0","impliedFormat":99},{"version":"28410cfb9a798bd7d0327fbf0afd4c4038799b1d6a3f86116dc972e31156b6d2","impliedFormat":99},{"version":"514ae9be6724e2164eb38f2a903ef56cf1d0e6ddb62d0d40f155f32d1317c116","impliedFormat":99},{"version":"970e5e94a9071fd5b5c41e2710c0ef7d73e7f7732911681592669e3f7bd06308","impliedFormat":99},{"version":"491fb8b0e0aef777cec1339cb8f5a1a599ed4973ee22a2f02812dd0f48bd78c1","impliedFormat":99},{"version":"6acf0b3018881977d2cfe4382ac3e3db7e103904c4b634be908f1ade06eb302d","impliedFormat":99},{"version":"2dbb2e03b4b7f6524ad5683e7b5aa2e6aef9c83cab1678afd8467fde6d5a3a92","impliedFormat":99},{"version":"135b12824cd5e495ea0a8f7e29aba52e1adb4581bb1e279fb179304ba60c0a44","impliedFormat":99},{"version":"e4c784392051f4bbb80304d3a909da18c98bc58b093456a09b3e3a1b7b10937f","impliedFormat":99},{"version":"2e87c3480512f057f2e7f44f6498b7e3677196e84e0884618fc9e8b6d6228bed","impliedFormat":99},{"version":"66984309d771b6b085e3369227077da237b40e798570f0a2ddbfea383db39812","impliedFormat":99},{"version":"e41be8943835ad083a4f8a558bd2a89b7fe39619ed99f1880187c75e231d033e","impliedFormat":99},{"version":"260558fff7344e4985cfc78472ae58cbc2487e406d23c1ddaf4d484618ce4cfd","impliedFormat":99},{"version":"413d50bc66826f899c842524e5f50f42d45c8cb3b26fd478a62f26ac8da3d90e","impliedFormat":99},{"version":"d9083e10a491b6f8291c7265555ba0e9d599d1f76282812c399ab7639019f365","impliedFormat":99},{"version":"09de774ebab62974edad71cb3c7c6fa786a3fda2644e6473392bd4b600a9c79c","impliedFormat":99},{"version":"e8bcc823792be321f581fcdd8d0f2639d417894e67604d884c38b699284a1a2a","impliedFormat":99},{"version":"7c99839c518dcf5ab8a741a97c190f0703c0a71e30c6d44f0b7921b0deec9f67","impliedFormat":99},{"version":"44c14e4da99cd71f9fe4e415756585cec74b9e7dc47478a837d5bedfb7db1e04","impliedFormat":99},{"version":"1f46ee2b76d9ae1159deb43d14279d04bcebcb9b75de4012b14b1f7486e36f82","impliedFormat":99},{"version":"2838028b54b421306639f4419606306b940a5c5fcc5bc485954cbb0ab84d90f4","impliedFormat":99},{"version":"7116e0399952e03afe9749a77ceaca29b0e1950989375066a9ddc9cb0b7dd252","impliedFormat":99},{"version":"5bb37c8ed3d343ae525902e64be52edbc1ce0a5ad86ca2201118c0d8168078e5","impliedFormat":1},{"version":"61838b01af740887b4fe07d0602c2d62a66cd84cf309e4f7a5c21ec15d656510","impliedFormat":99},{"version":"15ec7a0b94628e74974c04379e20de119398638b3c70f0fa0c76ab92956be77c","impliedFormat":99},{"version":"347511f401eb79a6030b80f6a67d126ab41da1f663f0374c1d0a93312ae08e00","impliedFormat":99},{"version":"830c61b95e880bcd42f96d8a4181b0d84dec566ba5dd131b386dcb9608043832","impliedFormat":99},{"version":"f0eb42a134d7bb15f24aed89d8f3b5ffe6e326c74abdad75fff520c281239375","impliedFormat":99},{"version":"4e3ab6678655e507463a9bfa1aa39a4a5497fac4c75e5f7f7a16c0b7d001c34a","impliedFormat":99},{"version":"3cef134032da5e1bfabba59a03a58d91ed59f302235034279bb25a5a5b65ca62","affectsGlobalScope":true,"impliedFormat":1},{"version":"16494400e0b13ddfa20bc0518a9c460da457c050af55b0678ee07f6a9a24616e","signature":"f30adcbc95011241765dc48232da3f6db6636057c2d86b4538451dcace5f699c"},{"version":"e777897dd05819a8dca79b4f4619db6f16f73f97c753d816daa1572d7890322b","signature":"09272638ee563ab9bda2c94cf8499266a8bb90a45b7348b14cc88b6902a16470"},{"version":"9fa4a7ae22844bfc0640916f4fa15a95e830ed454580b2d7567af807eec3f539","impliedFormat":99},{"version":"ece6e8023eceec9f27b0a8739e48cbaed06caa53ac87135e4ad19b3c9853c5ef","impliedFormat":99},{"version":"21fadddf8e196a6aca1a893863b34f2d5d1b76845ac7880d74db0b27966cdeb3","impliedFormat":99},{"version":"aac9c1fea1d07e2007b46d6919dd47e32d5d6cf7afb7e8843235fa709b2d4183","affectsGlobalScope":true,"impliedFormat":99},{"version":"1c174a74628fdc0ef7a2dd46f4e22855310590a64a2ed8f1ab8237006d1dd288","impliedFormat":99},{"version":"b38e27f910eaacd348480ad51333c39f03087a3d96ccc30b1b18f2db49436b99","impliedFormat":99},{"version":"8eed0b740f776a7ec77d8f52f00eed82e8ad9b7ea12907b779978975cc5dbb46","signature":"bb714ae82427bf626c25986819dfa8867544095682d56d6727e1865ecbb481d4"},{"version":"7951a8641067c14e7f5a7f353cb9ca0e576476b9dde088cb29f36405bc3507e3","impliedFormat":99},{"version":"ad89046771974c89b491f9386ff6a0bb5887ed36bed38afbc0a0e37b8c889820","signature":"183026be39f73d1f3634a70e41dacb640b124150f8448c5c6b49226af808dbb6"},{"version":"8b16f17d15391a2c62d63daa0eecf5bb1ee60fd756368a3a0b35d6248a65e74c","signature":"461577fd4b3539cf62eaf77e7ba9a24c6b2235f00bea0dd9416b12556eea4988"},{"version":"4aa05669c65a0d8c33cf761e9a21f0ac632600e2632ff3811f2d03cc9ec6c8b9","signature":"5006aa81f0fa63e3d8080fb11a936a94bf1905a1bc8561756e7db40e80f37da4"},{"version":"be2835c98d6e2ce8cf0c04cde9bf86e275f981c04c7068840a486f1741a5478a","signature":"439593d167651f2e1c0c439482dc3d5d5eb248ea221ecd8feb5c62cd0d60cd86"},{"version":"df1c322851066d4adb4f04ef60777b543e89b667a792147007c51ad81f630ba6","signature":"31da19f4722f5e78bd6b8c644b587a7b24fd90bffd8a2a1daa8dd39f27004d7c"},{"version":"67302c2bcb46d9ffd10090cbbae31bba6148da374f47c8f770960b0e5531a435","impliedFormat":99},{"version":"6c0ea7b16980f04e069213ce65da758041eb7ae0d05cd89f4575d0e267f986d9","signature":"01e264b1c35c9acf0237be50f96bb1c2a02a9b25e80b816192ce6c5fd083df9b"},{"version":"f50d5d46307bb4552b1ae9d438ed7833bcabc0fd52937485c3ece256d348349e","signature":"31ccc337f8e861d8cc2f7d6d939c55b4f6baef9ea8b430a3b1e0a66ebb10602b"},{"version":"bcca7abf2c2ba1665ee2b971525c7f59bffbb92a676cc6de8805cb357707e057","signature":"4a5a07aa9b196e31f2d9830bbd92c2ed3d8f2e9a9a3b970f9579230a78a4a68b"},{"version":"d4acf3bee541a9a268f16bd2c31f76076bb9e9701c512b33e7f1e15145171528","signature":"688a7461a5c4ac13440796a5e3874d16edf3932ef7d3622df43755e636ae9123"},{"version":"352217d0bfbfc2f169d0f1b5e8f0f5599d1d88771941dab6628fd35d22a91bae","signature":"0cfafae10d5951f71daa538a5d3a67b924d55f45618acbf0e0f1269c844c14cc"},{"version":"7d2e940f0c7da3bd4b30d592f6326171bfbebec404517cf50494871b0d1c784c","signature":"4e616ba693071ebf3ddb2b642af57514b4070633f1216431f85d02dad847aeb0"},{"version":"c3036b361d9a1a19ecff28a461e1f2eb2bc5cc89fb95dbb552d18f64170811d6","signature":"fa94c82b3f10e2e7956af6fff9b7683a3c2a4216d334e849d2c8d21663ea4791"},{"version":"854f9c31fdc27d97a2b0d8b554d7c13282c1431d62a0bfdf9e9c9e169648c3fe","signature":"1f311c8fcd75afb3f5219aafda907612e3c83a9d44ec554f0912a33321cd098c"},{"version":"ec6e5e4a7cdc84753b8128e21abb1e50d16e66e6ec20cc201742af4ebd63a490","signature":"54209a63989acb1e26e44cba94dad358ac586706b54b147c899f050e85c70c91"},{"version":"671574ae34d4a84feca7363424dc0f19128242808bd1e2b0d936bf80e59b091a","signature":"df21e1de8ed8fbdc8cedbee27953ceed89fb74d2f3dee8e7ab20a09efb8709e8"},{"version":"bae5457b3ace52365d2173d50f81a9713408386eb6873000080485ae6b225cb0","signature":"bcf98d6bbf90e7dc38fde2fef832decc9a2b20b2858d9dfc25e786287e0416b6"},{"version":"be7650364f1421403a0ae0dbb2f804a8e4c8609040de5a75a46cbde8e99db2a0","signature":"87522697c003eb1217d1a6251b261a45da502815d6480c36752bf74a6c86c520"},{"version":"e0c67a40f6f9fbed0931d87d85d6af1709d8d0394f31adf0f6e70ed42db4b08c","signature":"cf99a7bc2e8297fc90465e3e120dd6646fda74c25ec1f3f7e2017c9c42ed90ac"},{"version":"55637d39681037525d426224594e8e2b8ca6ebeb424cfb4a739d68172998b6e6","signature":"f4f566c0d66f2e188e4b0e65c04aaef7c671a0dc4eb87ae753e52194a780eb9f"},{"version":"1da0751744bcfc2e83fabef4ab6dbb9f888b39c9163900fd0626d1519dbe0f97","signature":"528843d8a10504e2f1b2d9ea5981f6468eec1e98a8a525c7d9ab839dbb3eee7c"},{"version":"24d45517f1043bfc77248f05417186c98c1255956f1bda5559c70d4fa2f32672","signature":"9838e2b00135c7a310ebec82442ebd8f3fd4f51213b6b0dfa27e154f3f76414a"},{"version":"85575cd33d896f6a8fa1dfb98e11e462c95cd466434a2d39b210869c0b81390e","signature":"f2ad394918813268150a90fbb68d712a7cb0eb52d97a95e9d298bf77423aa819"},{"version":"0b27625bd8d6206d98c06b0be78ecd788576b9c51207710bfc6ed847c1b5f252","signature":"7e3b040a24584c80bd5993ffd3bec604ec0c60e2d9bd2f09c1f6e3f924c4f7c6"},{"version":"3782afb6d57c298122b6004daa7d6a1b5e558af9b0bc27cd6de4374eaf01d88a","signature":"fa2769aee7a1d7d86b5ad5fceb4c4dfb94d45c373d87caad8cfdaefdc2868b2b"},{"version":"949ac9ce002b05c3c54da81bc59a5a490df978bc6f79aff79c7588c218da8d58","signature":"bbd79e0fd33892bdc58f1202a3efa06fa5661a49893ade5479e7624b6b79366a"},{"version":"f19af46307b1bbf91e775e0646e948c75d5a8bb23beec4b26f8bac739f61a835","signature":"90176bcd57d22e9d923bfa2beb7ef83a259359af9c005ea0d590171f7c6886ce"},{"version":"e1a0e25972525310bd183059fd4715c3ddc31cbc4f9f3cf648c36eed305daf4c","signature":"8916ec39536d692fb53161458105baa2cba08157d22777937e4d3a5de2efcad7"},{"version":"c6b64d7376591a9d9b68cf068b0d12fad83cb72a747ecdc179cebb0252a48926","signature":"a2fe76b1299b38af1b803860cf54324e1881f30cd97efefc3a25457bd6dcf29d"},{"version":"035e088f0518e03f452b0e017b526092a7a58a7bfd35c2db81638ce68c215d0e","signature":"307ad019fa8153fa55e2ff6bdf739397e7f9e21c80c0d945743a8a2dc3c44b06"},{"version":"97863c5caf216badd8a85596beadbd1921476b0dbb47ee699abf80df42848386","impliedFormat":99},{"version":"5d4cae5c3cb5a513dd6fe2a3929c6c1253c628e4b125afbf127a2fcbf21b32b6","impliedFormat":99},{"version":"a8ea73651858588a66956c62bb992e855dd7ec9d4e37d22612c91d170d129360","impliedFormat":99},{"version":"b626ab9d47b7f60d7430fda640913245cf82c825c3e38eb1eb33d1808dde7a80","signature":"9838e2b00135c7a310ebec82442ebd8f3fd4f51213b6b0dfa27e154f3f76414a"},{"version":"8085954ba165e611c6230596078063627f3656fed3fb68ad1e36a414c4d7599a","impliedFormat":99},{"version":"bc5ba4cf9d38e27f3a64e43b4284d4ae9aa4c6e1f47b3b8461534180fd8a2c5c","signature":"81f5e6511bca40c26da0d6f8a693b9742ba0050387c234a2a65aa1a671adeda7"},{"version":"fa3051cfd0196eaf41de55bb8b385c6cb32078edad8dbf59062d551347e80457","signature":"3aefc99917b9ccda912fdfd38a07a4479a8cd0e86a9ec90588479c5b3277ca75"},{"version":"4a5aa16151dbec524bb043a5cbce2c3fec75957d175475c115a953aca53999a9","impliedFormat":99},{"version":"f7654a7edb2b377e54cab191bfa732e92ffcc4165376317df05baec0ca81f064","signature":"1913d3e9a871099126700f506a2c3b8fe9d47857253124e5787055b463b98b4c"},{"version":"68b6a7501a56babd7bcd840e0d638ee7ec582f1e70b3c36ebf32e5e5836913c8","impliedFormat":99},{"version":"7a14bf21ae8a29d64c42173c08f026928daf418bed1b97b37ac4bb2aa197b89b","impliedFormat":99},{"version":"cbcded04f856af28223e71674f1cf2c6b4e361a752d4d934f27117b3c990df96","signature":"eb7569396fa4507aa7a9c288ea9065bae3df13ff8f9022f3230ad2e6b1c631f9"},{"version":"1fa2de733cf857bae042088c569d4fe81006dd3d0eb28f9bbf1ffb24d28a0849","signature":"ad3eaace5da6082432e72c43e9ab1d2b1ece29214c26659e2a32012ded0cb2f0"},"c3085aa7c267e4a12c37d1330a7a4a29c38f8626db50456302ec5a79c215f656",{"version":"21f97833c7e4d86f58df9ee91218818fd22201d162d6a858ceea5238a1e408da","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"d8083f3e8ebbd19fb324bd112b53759d71463f48ad13b3e874e676d685d8a1c8","signature":"89b0f68f8f0b901f9dfff2b9e7255520283a783d6af7f2bc2953d771232317a2"},{"version":"e0c868a08451c879984ccf4d4e3c1240b3be15af8988d230214977a3a3dad4ce","impliedFormat":1},{"version":"6fc1a4f64372593767a9b7b774e9b3b92bf04e8785c3f9ea98973aa9f4bbe490","impliedFormat":1},{"version":"ff09b6fbdcf74d8af4e131b8866925c5e18d225540b9b19ce9485ca93e574d84","impliedFormat":1},{"version":"d5895252efa27a50f134a9b580aa61f7def5ab73d0a8071f9b5bf9a317c01c2d","impliedFormat":1},{"version":"2c378d9368abcd2eba8c29b294d40909845f68557bc0b38117e4f04fc56e5f9c","impliedFormat":1},{"version":"56208c500dcb5f42be7e18e8cb578f257a1a89b94b3280c506818fed06391805","impliedFormat":1},{"version":"0c94c2e497e1b9bcfda66aea239d5d36cd980d12a6d9d59e66f4be1fa3da5d5a","impliedFormat":1},{"version":"bb220eaac1677e2ad82ac4e7fd3e609a0c7b6f2d6d9c673a35068c97f9fcd5cd","affectsGlobalScope":true,"impliedFormat":1},{"version":"1f366bde16e0513fa7b64f87f86689c4d36efd85afce7eb24753e9c99b91c319","impliedFormat":1},{"version":"fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","impliedFormat":1},{"version":"3eb11dbf3489064a47a2e1cf9d261b1f100ef0b3b50ffca6c44dd99d6dd81ac1","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"5d08a179b846f5ee674624b349ebebe2121c455e3a265dc93da4e8d9e89722b4","impliedFormat":1},{"version":"d30e67059f5c545c5f8f0cc328a36d2e03b8c4a091b4301bc1d6afb2b1491a3a","impliedFormat":1},{"version":"37550007de426cbbb418582008deae1a508935eaebbd4d41e22805ad3b485ad4","impliedFormat":1},{"version":"79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","impliedFormat":1},{"version":"8cbbb12bfb321de8bd58ba74329f683d82e4e0abb56d998c7f1eef2e764a74c8","impliedFormat":1},{"version":"770410aa3825458fc7df98c6143e28ad8e88146b965e7fd74d9f3171bc1a788f","impliedFormat":1},{"version":"ae4cda96b058f20db053c1f57e51257d1cffff9c0880326d2b8129ade5363402","impliedFormat":1},{"version":"d4a22007b481fe2a2e6bfd3a42c00cd62d41edb36d30fc4697df2692e9891fc8","impliedFormat":1},{"version":"12115a2a03125cb3f600e80e7f43ef57f71a2951bb6e60695fb00ac8e12b27f3","impliedFormat":1},{"version":"e85d04f57b46201ddc8ba238a84322432a4803a5d65e0bbd8b3b4f05345edd51","impliedFormat":1},{"version":"199f9ead0daf25ae4c5632e3d1f42570af59685294a38123eef457407e13f365","impliedFormat":1},{"version":"e3913b35c221b4468658743d6496b83323c895f8e5b566c48d8844c01bf24738","impliedFormat":1},{"version":"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","impliedFormat":1},{"version":"f874ea4d0091b0a44362a5f74d26caab2e66dec306c2bf7e8965f5106e784c3b","impliedFormat":1}],"root":[473,[475,480],[486,491],502,778,1050,1051,1058,1059,[1062,1064],[1082,1084],[1086,1089],[1096,1099],1101,1102,[1107,1110],[1285,1290],[1292,1314],[1319,1323],1325,1336,1338,1339,[1361,1363],1459,1460,1467,[1469,1473],[1475,1498],1502,1504,1505,1507,[1510,1514]],"options":{"allowJs":true,"esModuleInterop":true,"jsx":1,"module":99,"skipLibCheck":true,"strict":true,"target":4},"referencedMap":[[1513,1],[1514,2],[1512,3],[473,4],[673,5],[675,6],[676,5],[681,7],[677,5],[674,5],[678,5],[679,6],[680,6],[1277,5],[1278,8],[1279,9],[1283,10],[1280,9],[1281,5],[1282,5],[688,11],[717,12],[600,5],[630,13],[603,14],[612,15],[692,16],[602,5],[624,17],[707,18],[683,19],[769,20],[503,5],[504,21],[579,22],[576,23],[580,24],[577,5],[581,24],[582,25],[686,26],[684,24],[583,25],[578,25],[685,27],[584,28],[1344,29],[1346,30],[1354,31],[1352,32],[1347,33],[1348,33],[1349,34],[1345,35],[1353,36],[601,24],[631,37],[623,38],[691,39],[633,40],[622,41],[693,42],[694,43],[689,44],[690,45],[614,46],[698,47],[697,48],[696,49],[610,50],[620,51],[621,52],[611,53],[613,5],[632,5],[618,54],[616,55],[617,56],[615,5],[629,57],[627,5],[628,5],[1351,5],[1350,58],[682,59],[619,60],[575,61],[574,62],[708,63],[771,64],[770,65],[687,66],[1468,49],[1355,67],[695,68],[716,69],[699,70],[722,71],[721,72],[704,73],[706,5],[713,74],[705,75],[701,5],[703,5],[709,76],[710,77],[712,78],[711,77],[702,5],[714,79],[498,80],[500,81],[1464,82],[1465,83],[1463,5],[1462,84],[1461,85],[493,86],[499,5],[496,87],[494,5],[495,88],[497,5],[501,89],[1466,90],[754,91],[715,92],[731,91],[755,91],[759,93],[758,94],[732,91],[756,91],[757,91],[723,92],[753,95],[764,96],[763,97],[733,98],[734,99],[752,100],[751,101],[765,102],[750,103],[749,104],[725,105],[762,106],[760,107],[761,108],[767,109],[775,110],[768,111],[776,112],[774,5],[773,113],[700,114],[772,115],[729,116],[730,117],[720,118],[726,119],[728,120],[727,121],[719,119],[724,122],[718,123],[766,124],[777,125],[1474,126],[1334,5],[1326,5],[1327,5],[1330,127],[417,5],[1357,128],[1103,129],[1503,130],[1090,131],[1095,132],[1092,129],[1356,128],[1093,129],[1061,128],[1106,133],[1105,134],[1358,135],[1094,129],[1359,128],[1091,131],[1060,131],[1508,136],[1291,133],[1337,129],[481,131],[1506,130],[1509,137],[1360,138],[1104,5],[1328,5],[1365,139],[492,5],[1038,140],[1039,141],[1037,142],[1040,143],[1041,144],[1042,145],[1043,146],[1044,147],[1045,148],[1046,149],[1047,150],[1048,151],[1049,152],[1534,153],[1375,139],[134,154],[135,154],[136,155],[95,156],[137,157],[138,158],[139,159],[90,5],[93,160],[91,5],[92,5],[140,161],[141,162],[142,163],[143,164],[144,165],[145,166],[146,166],[148,167],[147,168],[149,169],[150,170],[151,171],[133,172],[94,5],[152,173],[153,174],[154,175],[187,176],[155,177],[156,178],[157,179],[158,180],[159,181],[160,182],[161,183],[162,184],[163,185],[164,186],[165,186],[166,187],[167,5],[168,5],[169,188],[171,189],[170,190],[172,191],[173,192],[174,193],[175,194],[176,195],[177,196],[178,197],[179,198],[180,199],[181,200],[182,201],[183,202],[184,203],[185,204],[186,205],[191,206],[192,207],[190,131],[1458,208],[188,209],[189,210],[79,5],[81,211],[264,131],[1364,5],[1542,5],[484,212],[483,213],[482,5],[1100,214],[80,5],[867,215],[846,216],[943,5],[847,217],[783,215],[784,215],[785,215],[786,215],[787,215],[788,215],[789,215],[790,215],[791,215],[792,215],[793,215],[794,215],[795,215],[796,215],[797,215],[798,215],[799,215],[800,215],[779,5],[801,215],[802,215],[803,5],[804,215],[805,215],[807,215],[806,215],[808,215],[809,215],[810,215],[811,215],[812,215],[813,215],[814,215],[815,215],[816,215],[817,215],[818,215],[819,215],[820,215],[821,215],[822,215],[823,215],[824,215],[825,215],[826,215],[828,215],[829,215],[830,215],[827,215],[831,215],[832,215],[833,215],[834,215],[835,215],[836,215],[837,215],[838,215],[839,215],[840,215],[841,215],[842,215],[843,215],[844,215],[845,215],[848,218],[849,215],[850,215],[851,219],[852,220],[853,215],[854,215],[855,215],[856,215],[859,215],[857,215],[858,215],[781,5],[860,215],[861,215],[862,215],[863,215],[864,215],[865,215],[866,215],[868,221],[869,215],[870,215],[871,215],[873,215],[872,215],[874,215],[875,215],[876,215],[877,215],[878,215],[879,215],[880,215],[881,215],[882,215],[883,215],[885,215],[884,215],[886,215],[887,5],[888,5],[889,5],[1036,222],[890,215],[891,215],[892,215],[893,215],[894,215],[895,215],[896,5],[897,215],[898,5],[899,215],[900,215],[901,215],[902,215],[903,215],[904,215],[905,215],[906,215],[907,215],[908,215],[909,215],[910,215],[911,215],[912,215],[913,215],[914,215],[915,215],[916,215],[917,215],[918,215],[919,215],[920,215],[921,215],[922,215],[923,215],[924,215],[925,215],[926,215],[927,215],[928,215],[929,215],[930,215],[931,5],[932,215],[933,215],[934,215],[935,215],[936,215],[937,215],[938,215],[939,215],[940,215],[941,215],[942,215],[944,223],[1207,224],[1112,217],[1114,217],[1115,217],[1116,217],[1117,217],[1118,217],[1113,217],[1119,217],[1121,217],[1120,217],[1122,217],[1123,217],[1124,217],[1125,217],[1126,217],[1127,217],[1128,217],[1129,217],[1131,217],[1130,217],[1132,217],[1133,217],[1134,217],[1135,217],[1136,217],[1137,217],[1138,217],[1139,217],[1140,217],[1141,217],[1142,217],[1143,217],[1144,217],[1145,217],[1146,217],[1148,217],[1149,217],[1147,217],[1150,217],[1151,217],[1152,217],[1153,217],[1154,217],[1155,217],[1156,217],[1157,217],[1158,217],[1159,217],[1160,217],[1161,217],[1163,217],[1162,217],[1165,217],[1164,217],[1166,217],[1167,217],[1168,217],[1169,217],[1170,217],[1171,217],[1172,217],[1173,217],[1174,217],[1175,217],[1176,217],[1177,217],[1178,217],[1180,217],[1179,217],[1181,217],[1182,217],[1183,217],[1185,217],[1184,217],[1186,217],[1187,217],[1188,217],[1189,217],[1190,217],[1191,217],[1193,217],[1192,217],[1194,217],[1195,217],[1196,217],[1197,217],[1198,217],[780,215],[1199,217],[1200,217],[1202,217],[1201,217],[1203,217],[1204,217],[1205,217],[1206,217],[945,215],[946,215],[947,5],[948,5],[949,5],[950,215],[951,5],[952,5],[953,5],[954,5],[955,5],[956,215],[957,215],[958,215],[959,215],[960,215],[961,215],[962,215],[963,215],[968,225],[966,226],[967,227],[965,228],[964,215],[969,215],[970,215],[971,215],[972,215],[973,215],[974,215],[975,215],[976,215],[977,215],[978,215],[979,5],[980,5],[981,215],[982,215],[983,5],[984,5],[985,5],[986,215],[987,215],[988,215],[989,215],[990,221],[991,215],[992,215],[993,215],[994,215],[995,215],[996,215],[997,215],[998,215],[999,215],[1000,215],[1001,215],[1002,215],[1003,215],[1004,215],[1005,215],[1006,215],[1007,215],[1008,215],[1009,215],[1010,215],[1011,215],[1012,215],[1013,215],[1014,215],[1015,215],[1016,215],[1017,215],[1018,215],[1019,215],[1020,215],[1021,215],[1022,215],[1023,215],[1024,215],[1025,215],[1026,215],[1027,215],[1028,215],[1029,215],[1030,215],[1031,215],[782,229],[1032,5],[1033,5],[1034,5],[1035,5],[586,5],[1342,230],[1343,231],[1331,5],[625,5],[626,232],[1451,5],[1332,5],[474,233],[594,234],[593,235],[585,5],[606,236],[595,237],[592,5],[596,5],[604,5],[598,238],[597,239],[591,240],[605,5],[607,241],[608,242],[609,243],[599,244],[1052,131],[1335,245],[1444,5],[1418,246],[1417,247],[1416,248],[1443,249],[1442,250],[1446,251],[1445,252],[1448,253],[1447,254],[1455,255],[1454,256],[1403,257],[1377,258],[1378,259],[1379,259],[1380,259],[1381,259],[1382,259],[1383,259],[1384,259],[1385,259],[1386,259],[1387,259],[1401,260],[1388,259],[1389,259],[1390,259],[1391,259],[1392,259],[1393,259],[1394,259],[1395,259],[1397,259],[1398,259],[1396,259],[1399,259],[1400,259],[1402,259],[1376,261],[1441,262],[1421,263],[1422,263],[1423,263],[1424,263],[1425,263],[1426,263],[1427,264],[1429,263],[1428,263],[1440,265],[1430,263],[1432,263],[1431,263],[1434,263],[1433,263],[1435,263],[1436,263],[1437,263],[1438,263],[1439,263],[1420,263],[1419,266],[1411,267],[1409,268],[1410,268],[1414,269],[1412,268],[1413,268],[1415,268],[1408,5],[1055,5],[1341,270],[1340,5],[1324,131],[88,271],[420,272],[425,3],[427,273],[213,274],[368,275],[395,276],[224,5],[205,5],[211,5],[357,277],[292,278],[212,5],[358,279],[397,280],[398,281],[345,282],[354,283],[262,284],[362,285],[363,286],[361,287],[360,5],[359,288],[396,289],[214,290],[299,5],[300,291],[209,5],[225,292],[215,293],[237,292],[268,292],[198,292],[367,294],[377,5],[204,5],[323,295],[324,296],[318,297],[448,5],[326,5],[327,297],[319,298],[339,131],[453,299],[452,300],[447,5],[265,301],[400,5],[353,302],[352,5],[446,303],[320,131],[240,304],[238,305],[449,5],[451,306],[450,5],[239,307],[441,308],[444,309],[249,310],[248,311],[247,312],[456,131],[246,313],[287,5],[459,5],[1316,314],[1315,5],[462,5],[461,131],[463,315],[194,5],[364,316],[365,317],[366,318],[389,5],[203,319],[193,5],[196,320],[338,321],[337,322],[328,5],[329,5],[336,5],[331,5],[334,323],[330,5],[332,324],[335,325],[333,324],[210,5],[201,5],[202,292],[419,326],[428,327],[432,328],[371,329],[370,5],[283,5],[464,330],[380,331],[321,332],[322,333],[315,334],[305,5],[313,5],[314,335],[343,336],[306,337],[344,338],[341,339],[340,5],[342,5],[296,340],[372,341],[373,342],[307,343],[311,344],[303,345],[349,346],[379,347],[382,348],[285,349],[199,350],[378,351],[195,276],[401,5],[402,352],[413,353],[399,5],[412,354],[89,5],[387,355],[271,5],[301,356],[383,5],[200,5],[232,5],[411,357],[208,5],[274,358],[310,359],[369,360],[309,5],[410,5],[404,361],[405,362],[206,5],[407,363],[408,364],[390,5],[409,350],[230,365],[388,366],[414,367],[217,5],[220,5],[218,5],[222,5],[219,5],[221,5],[223,368],[216,5],[277,369],[276,5],[282,370],[278,371],[281,372],[280,372],[284,370],[279,371],[236,373],[266,374],[376,375],[466,5],[436,376],[438,377],[308,5],[437,378],[374,341],[465,379],[325,341],[207,5],[267,380],[233,381],[234,382],[235,383],[231,384],[348,384],[243,384],[269,385],[244,385],[227,386],[226,5],[275,387],[273,388],[272,389],[270,390],[375,391],[347,392],[346,393],[317,394],[356,395],[355,396],[351,397],[261,398],[263,399],[260,400],[228,401],[295,5],[424,5],[294,402],[350,5],[286,403],[304,316],[302,404],[288,405],[290,406],[460,5],[289,407],[291,407],[422,5],[421,5],[423,5],[458,5],[293,408],[258,131],[87,5],[241,409],[250,5],[298,410],[229,5],[430,131],[440,411],[257,131],[434,297],[256,412],[416,413],[255,411],[197,5],[442,414],[253,131],[254,131],[245,5],[297,5],[252,415],[251,416],[242,417],[312,185],[381,185],[406,5],[385,418],[384,5],[426,5],[259,131],[316,131],[418,419],[82,131],[85,420],[86,421],[83,131],[84,5],[403,422],[394,423],[393,5],[392,424],[391,5],[415,425],[429,426],[431,427],[433,428],[1317,429],[435,430],[439,431],[472,432],[443,432],[471,433],[445,434],[454,435],[455,436],[457,437],[467,438],[470,319],[469,5],[468,439],[1056,440],[1318,441],[1057,441],[590,442],[588,443],[589,444],[587,5],[1329,5],[1333,5],[1258,445],[1217,446],[1216,447],[1257,448],[1259,449],[1208,131],[1209,131],[1210,131],[1235,450],[1211,451],[1212,451],[1213,452],[1214,131],[1215,131],[1218,453],[1260,454],[1219,131],[1220,131],[1221,455],[1222,131],[1223,131],[1224,131],[1225,131],[1226,131],[1227,131],[1228,454],[1229,131],[1230,131],[1231,454],[1232,131],[1233,131],[1234,455],[1266,452],[1236,445],[1237,445],[1238,445],[1241,445],[1239,445],[1240,5],[1242,445],[1243,456],[1267,457],[1268,458],[1284,459],[1255,460],[1246,461],[1244,445],[1245,461],[1248,445],[1247,5],[1249,5],[1250,5],[1251,445],[1252,445],[1253,445],[1254,445],[1264,462],[1265,463],[1261,464],[1262,465],[1256,466],[1111,131],[1263,467],[1269,461],[1270,461],[1276,468],[1271,445],[1272,461],[1273,461],[1274,445],[1275,461],[1407,469],[1406,470],[1453,471],[1452,472],[1450,473],[1449,474],[1457,475],[1456,476],[1405,477],[1404,478],[386,479],[1085,131],[485,5],[1372,480],[1371,5],[77,5],[78,5],[13,5],[14,5],[16,5],[15,5],[2,5],[17,5],[18,5],[19,5],[20,5],[21,5],[22,5],[23,5],[24,5],[3,5],[25,5],[26,5],[4,5],[27,5],[31,5],[28,5],[29,5],[30,5],[32,5],[33,5],[34,5],[5,5],[35,5],[36,5],[37,5],[38,5],[6,5],[42,5],[39,5],[40,5],[41,5],[43,5],[7,5],[44,5],[49,5],[50,5],[45,5],[46,5],[47,5],[48,5],[8,5],[54,5],[51,5],[52,5],[53,5],[55,5],[9,5],[56,5],[57,5],[58,5],[60,5],[59,5],[61,5],[62,5],[10,5],[63,5],[64,5],[65,5],[11,5],[66,5],[67,5],[68,5],[69,5],[70,5],[1,5],[71,5],[72,5],[12,5],[75,5],[74,5],[73,5],[76,5],[111,481],[121,482],[110,481],[131,483],[102,484],[101,485],[130,439],[124,486],[129,487],[104,488],[118,489],[103,490],[127,491],[99,492],[98,439],[128,493],[100,494],[105,495],[106,5],[109,495],[96,5],[132,496],[122,497],[113,498],[114,499],[116,500],[112,501],[115,502],[125,439],[107,503],[108,504],[117,505],[97,506],[120,497],[119,495],[123,5],[126,507],[1374,508],[1370,5],[1373,509],[1501,510],[1500,511],[1499,131],[1081,512],[1066,5],[1067,5],[1068,5],[1069,5],[1065,5],[1070,513],[1071,5],[1073,514],[1072,513],[1074,513],[1075,514],[1076,513],[1077,5],[1078,513],[1079,5],[1080,5],[1367,515],[1366,139],[1369,516],[1368,517],[636,518],[672,519],[660,520],[661,520],[635,5],[637,521],[638,522],[639,5],[662,520],[663,520],[641,523],[664,520],[665,520],[642,524],[643,520],[644,525],[647,526],[648,524],[649,5],[650,527],[651,528],[640,522],[652,520],[666,520],[667,529],[668,520],[669,520],[646,530],[653,521],[645,522],[654,520],[655,5],[656,520],[657,5],[658,531],[659,532],[670,520],[671,532],[748,533],[739,534],[746,535],[741,5],[742,5],[740,536],[743,533],[735,5],[736,5],[747,537],[738,538],[744,5],[745,539],[737,540],[634,541],[509,542],[516,543],[511,5],[512,5],[510,544],[513,545],[505,5],[506,5],[517,541],[508,546],[514,5],[515,547],[507,548],[570,549],[522,550],[524,551],[568,5],[523,552],[569,553],[573,554],[571,5],[525,550],[526,5],[567,555],[521,556],[518,5],[572,557],[519,558],[520,5],[527,559],[528,559],[529,559],[530,559],[531,559],[532,559],[533,559],[534,559],[535,559],[536,559],[537,559],[539,559],[538,559],[540,559],[541,559],[542,559],[566,560],[543,559],[544,559],[545,559],[546,559],[547,559],[548,559],[549,559],[550,559],[551,559],[553,559],[552,559],[554,559],[555,559],[556,559],[557,559],[558,559],[559,559],[560,559],[561,559],[562,559],[563,559],[564,559],[565,559],[1515,5],[1516,5],[1517,5],[1518,561],[1519,5],[1521,562],[1522,563],[1520,5],[1523,5],[1525,564],[1527,565],[1526,5],[1529,566],[1528,5],[1530,139],[1531,5],[1532,5],[1533,5],[1535,5],[1536,139],[1524,5],[1537,5],[1538,5],[1539,5],[1540,566],[1541,5],[475,567],[476,233],[479,568],[480,568],[1313,131],[1314,131],[1319,569],[1320,5],[1494,570],[1321,571],[1493,572],[1495,573],[491,574],[488,575],[490,576],[489,577],[1109,578],[1496,579],[1051,580],[1497,581],[1289,582],[1290,583],[1107,584],[1292,585],[1486,131],[1339,586],[1336,587],[1498,5],[1059,5],[1473,588],[1470,589],[1476,590],[1471,591],[1469,592],[1475,593],[1477,594],[778,595],[1050,596],[1322,206],[1490,597],[1484,598],[1482,599],[1502,600],[1460,601],[1478,602],[1487,603],[1480,604],[1485,605],[1488,606],[1363,607],[1467,608],[1479,609],[1489,610],[1459,208],[1491,611],[1362,612],[502,613],[1504,614],[1304,615],[487,580],[1285,616],[1294,582],[1102,617],[1101,618],[1058,582],[1062,619],[1492,620],[1063,621],[1505,584],[1338,622],[1096,618],[1097,623],[1325,624],[1507,625],[1510,626],[1472,582],[1361,627],[1302,628],[1098,629],[1099,630],[1306,631],[1305,632],[1287,633],[1297,634],[1295,635],[1511,636],[1293,637],[1286,638],[1301,639],[1300,628],[1298,640],[1299,641],[1089,642],[1288,643],[1303,644],[1483,645],[1086,131],[1481,131],[1307,646],[1064,5],[1308,647],[1054,648],[1053,649],[1309,650],[486,651],[1082,613],[1087,652],[1323,131],[1296,131],[1088,653],[1110,131],[1084,654],[1108,5],[477,5],[478,655],[1310,656],[1311,656],[1312,5],[1083,613]],"affectedFilesPendingEmit":[1513,1514,475,476,479,480,1313,1314,1319,1320,1494,1321,1493,1495,491,488,490,489,1109,1496,1051,1497,1289,1290,1107,1292,1486,1339,1336,1498,1059,1473,1470,1476,1471,1469,1475,1477,778,1050,1322,1490,1484,1482,1502,1460,1478,1487,1480,1485,1488,1363,1467,1479,1489,1459,1491,1362,502,1504,1304,487,1285,1294,1102,1101,1058,1062,1492,1063,1505,1338,1096,1097,1325,1507,1510,1472,1361,1302,1098,1099,1306,1305,1287,1297,1295,1511,1293,1286,1301,1300,1298,1299,1089,1288,1303,1483,1086,1481,1307,1064,1308,1054,1053,1309,486,1082,1087,1323,1296,1088,1110,1084,1108,477,478,1310,1311,1312,1083],"version":"5.7.3"}
\ No newline at end of file