@airframes/acars-decoder 1.8.7 → 1.8.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../index.ts","../lib/IcaoDecoder.ts","../lib/DecoderPlugin.ts","../lib/utils/coordinate_utils.ts","../lib/DateTimeUtils.ts","../lib/utils/route_utils.ts","../lib/utils/result_formatter.ts","../lib/plugins/CBand.ts","../lib/plugins/Label_5Z_Slash.ts","../lib/plugins/Label_10_LDR.ts","../lib/plugins/Label_10_POS.ts","../lib/plugins/Label_10_Slash.ts","../lib/plugins/Label_12_N_Space.ts","../lib/plugins/Label_12_POS.ts","../lib/plugins/Label_13Through18_Slash.ts","../lib/plugins/Label_15.ts","../lib/plugins/Label_15_FST.ts","../lib/plugins/Label_16_Honeywell.ts","../lib/plugins/Label_16_N_Space.ts","../lib/plugins/Label_16_POSA1.ts","../lib/plugins/Label_16_TOD.ts","../lib/utils/flight_plan_utils.ts","../lib/utils/h1_helper.ts","../lib/plugins/Label_1J_2J_FTX.ts","../lib/plugins/Label_1M_Slash.ts","../lib/plugins/Label_1L_3-line.ts","../lib/plugins/Label_1L_070.ts","../lib/plugins/Label_1L_660.ts","../lib/plugins/Label_1L_Slash.ts","../lib/plugins/Label_20_POS.ts","../lib/plugins/Label_21_POS.ts","../lib/plugins/Label_22_OFF.ts","../lib/plugins/Label_22_POS.ts","../lib/plugins/Label_2P_FM3.ts","../lib/plugins/Label_2P_FM4.ts","../lib/plugins/Label_2P_FM5.ts","../lib/plugins/Label_2P_POS.ts","../lib/plugins/Label_24_Slash.ts","../lib/plugins/Label_30_Slash_EA.ts","../lib/plugins/Label_44_ETA.ts","../lib/plugins/Label_44_IN.ts","../lib/plugins/Label_44_OFF.ts","../lib/plugins/Label_44_ON.ts","../lib/plugins/Label_44_POS.ts","../lib/plugins/Label_44_Slash.ts","../lib/plugins/Label_4A.ts","../lib/plugins/Label_4A_01.ts","../lib/plugins/Label_4A_DIS.ts","../lib/plugins/Label_4A_DOOR.ts","../lib/plugins/Label_4A_Slash_01.ts","../lib/plugins/Label_4J_POS.ts","../lib/plugins/Label_4N.ts","../lib/plugins/Label_4T_AGFSR.ts","../lib/plugins/Label_58.ts","../lib/plugins/Label_4T_ETA.ts","../lib/plugins/Label_80.ts","../lib/plugins/Label_83.ts","../lib/plugins/Label_8E.ts","../lib/plugins/Label_B6.ts","../lib/plugins/Label_ColonComma.ts","../lib/plugins/Label_H1.ts","../lib/plugins/Label_H2_02E.ts","../lib/plugins/Label_H1_FLR.ts","../lib/plugins/Label_H1_OHMA.ts","../lib/plugins/Label_H1_StarPOS.ts","../lib/plugins/Label_H1_WRN.ts","../lib/plugins/Label_HX.ts","../lib/utils/miam.ts","../lib/plugins/Label_MA.ts","../lib/plugins/Label_SQ.ts","../lib/plugins/Label_QR.ts","../lib/plugins/Label_QP.ts","../lib/plugins/Label_QS.ts","../lib/plugins/Label_QQ.ts","../lib/MessageDecoder.ts"],"sourcesContent":["export * from './lib/IcaoDecoder';\nexport * from './lib/MessageDecoder';\n","export class IcaoDecoder {\n name: string;\n icao: string;\n\n // Military ICAO address ranges (as [start, end] tuples, inclusive)\n private static readonly MILITARY_RANGES: Array<[number, number]> = [\n [0x010070, 0x01008f], // Egypt\n [0x0a4000, 0x0a4fff], // Algeria\n [0x33ff00, 0x33ffff], // Italy\n [0x350000, 0x37ffff], // Spain\n [0x3aa000, 0x3affff], // France 1\n [0x3b7000, 0x3bffff], // France 2\n [0x3ea000, 0x3ebfff], // Germany 1\n [0x3f4000, 0x3fbfff], // Germany 2\n [0x400000, 0x40003f], // UK 1\n [0x43c000, 0x43cfff], // UK 2\n [0x444000, 0x446fff], // Austria\n [0x44f000, 0x44ffff], // Belgium\n [0x457000, 0x457fff], // Bulgaria\n [0x45f400, 0x45f4ff], // Denmark\n [0x468000, 0x4683ff], // Greece\n [0x473c00, 0x473c0f], // Hungary\n [0x478100, 0x4781ff], // Norway\n [0x480000, 0x480fff], // Netherlands\n [0x48d800, 0x48d87f], // Poland\n [0x497c00, 0x497cff], // Portugal\n [0x498420, 0x49842f], // Czech\n [0x4b7000, 0x4b7fff], // Switzerland\n [0x4b8200, 0x4b82ff], // Turkey\n [0x70c070, 0x70c07f], // Oman\n [0x710258, 0x71028f], // Saudi 1\n [0x710380, 0x71039f], // Saudi 2\n [0x738a00, 0x738aff], // Israel\n [0x7cf800, 0x7cfaff], // Australia\n [0x800200, 0x8002ff], // India\n [0xadf7c8, 0xafffff], // USA\n [0xc20000, 0xc3ffff], // Canada\n [0xe40000, 0xe41fff], // Brazil\n ];\n\n constructor(icao: string) {\n this.name = 'icao-decoder-typescript';\n this.icao = icao;\n }\n\n isMilitary(): boolean {\n const i = this.icao;\n const n = parseInt(i, 16);\n for (const [start, end] of IcaoDecoder.MILITARY_RANGES) {\n if (start <= n && n <= end) {\n return true;\n }\n }\n return false;\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n Qualifiers,\n} from './DecoderPluginInterface';\nimport { MessageDecoder } from './MessageDecoder';\n\nexport abstract class DecoderPlugin implements DecoderPluginInterface {\n decoder!: MessageDecoder;\n\n name: string = 'unknown';\n\n defaultResult(): DecodeResult {\n return {\n decoded: false,\n decoder: {\n name: 'unknown',\n type: 'pattern-match',\n decodeLevel: 'none',\n },\n formatted: {\n description: 'Unknown',\n items: [],\n },\n raw: {},\n remaining: {},\n };\n }\n\n options: object;\n\n constructor(decoder: MessageDecoder, options: Options = {}) {\n this.decoder = decoder;\n this.options = options;\n }\n\n id(): string {\n console.log(\n 'DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!',\n );\n return 'abstract_decoder_plugin';\n }\n\n meetsStateRequirements(): boolean {\n return true;\n }\n\n // onRegister(store: Store<any>) {\n // this.store = store;\n // }\n\n qualifiers(): Qualifiers {\n const labels: Array<string> = [];\n\n return {\n labels,\n };\n }\n\n decode(message: Message): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.remaining.text = message.text;\n return decodeResult;\n }\n}\n","export class CoordinateUtils {\n /**\n * Decode a string of coordinates into an object with latitude and longitude in millidegrees\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinates(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.substring(0, 1);\n let middleChar = stringCoords.substring(6, 7);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar == ' ') {\n middleChar = stringCoords.substring(7, 8);\n longitudeChars = stringCoords.substring(8, 14);\n }\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n return {\n latitude:\n (Number(stringCoords.substring(1, 6)) / 1000) *\n CoordinateUtils.getDirection(firstChar),\n longitude:\n (Number(longitudeChars) / 1000) *\n CoordinateUtils.getDirection(middleChar),\n };\n }\n\n return undefined;\n }\n\n /**\n * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinatesDecimalMinutes(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.substring(0, 1);\n let middleChar = stringCoords.substring(6, 7);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar == ' ') {\n middleChar = stringCoords.substring(7, 8);\n longitudeChars = stringCoords.substring(8, 14);\n }\n const latDeg = Math.trunc(Number(stringCoords.substring(1, 6)) / 1000);\n const latMin = (Number(stringCoords.substring(1, 6)) % 1000) / 10;\n const lonDeg = Math.trunc(Number(longitudeChars) / 1000);\n const lonMin = (Number(longitudeChars) % 1000) / 10;\n\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n return {\n latitude:\n (latDeg + latMin / 60) * CoordinateUtils.getDirection(firstChar),\n longitude:\n (lonDeg + lonMin / 60) * CoordinateUtils.getDirection(middleChar),\n };\n }\n return undefined;\n }\n public static coordinateString(coords: {\n latitude: number;\n longitude: number;\n }): string {\n const latDir = coords.latitude > 0 ? 'N' : 'S';\n const lonDir = coords.longitude > 0 ? 'E' : 'W';\n return `${Math.abs(coords.latitude).toFixed(3)} ${latDir}, ${Math.abs(coords.longitude).toFixed(3)} ${lonDir}`;\n }\n\n public static getDirection(coord: string): number {\n if (coord.startsWith('N') || coord.startsWith('E')) {\n return 1;\n } else if (coord.startsWith('S') || coord.startsWith('W')) {\n return -1;\n }\n return NaN;\n }\n\n public static dmsToDecimalDegrees(\n degrees: number,\n minutes: number,\n seconds: number,\n ): number {\n return degrees + minutes / 60 + seconds / 3600;\n }\n}\n","export class DateTimeUtils {\n // Expects a four digit UTC time string (HHMM)\n public static UTCToString(UTCString: string) {\n let utcDate = new Date();\n utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);\n return utcDate.toTimeString();\n }\n\n // Expects a six digit date string and a four digit UTC time string\n // (DDMMYY) (HHMM)\n public static UTCDateTimeToString(dateString: string, timeString: string) {\n let utcDate = new Date();\n utcDate.setUTCDate(+dateString.substr(0, 2));\n utcDate.setUTCMonth(+dateString.substr(2, 2));\n if (dateString.length === 6) {\n utcDate.setUTCFullYear(2000 + +dateString.substr(4, 2));\n }\n if (timeString.length === 6) {\n utcDate.setUTCHours(\n +timeString.substr(0, 2),\n +timeString.substr(2, 2),\n +timeString.substr(4, 2),\n );\n } else {\n utcDate.setUTCHours(\n +timeString.substr(0, 2),\n +timeString.substr(2, 2),\n 0,\n );\n }\n return utcDate.toUTCString();\n }\n\n /**\n *\n * @param time HHMMSS or HHMM\n * @returns seconds since midnight\n */\n public static convertHHMMSSToTod(time: string): number {\n if (time.length === 4) {\n time += '00';\n }\n const h = Number(time.substring(0, 2));\n const m = Number(time.substring(2, 4));\n const s = Number(time.substring(4, 6));\n const tod = h * 3600 + m * 60 + s;\n return tod;\n }\n\n /**\n *\n * @param time HHMMSS\n * @param date MMDDYY or MMDDYYYY\n * @returns seconds since epoch\n */\n public static convertDateTimeToEpoch(time: string, date: string): number {\n //YYYY-MM-DDTHH:mm:ss.sssZ\n if (date.length === 6) {\n date = date.substring(0, 4) + `20${date.substring(4, 6)}`;\n }\n const timestamp = `${date.substring(4, 8)}-${date.substring(0, 2)}-${date.substring(2, 4)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;\n const millis = Date.parse(timestamp);\n return millis / 1000;\n }\n\n /**\n * Converts a timestamp to a string\n *\n * ISO-8601 format for 'epoch'\n * HH:MM:SS for 'tod'\n * @param time\n * @param format\n * @returns\n */\n public static timestampToString(\n time: number,\n format: 'tod' | 'epoch',\n ): string {\n const date = new Date(time * 1000);\n if (format == 'tod') {\n return date.toISOString().slice(11, 19);\n }\n //strip off millis\n return date.toISOString().slice(0, -5) + 'Z';\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { Route } from '../types/route';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from './coordinate_utils';\n\nexport class RouteUtils {\n public static formatFlightState(state: string): string {\n switch (state) {\n case 'TO':\n return 'Takeoff';\n case 'IC':\n return 'Initial Climb';\n case 'CL':\n return 'Climb';\n case 'ER':\n return 'En Route';\n case 'DC':\n return 'Descent';\n case 'AP':\n return 'Approach';\n default:\n return `Unknown ${state}`;\n }\n }\n\n public static routeToString(route: Route): string {\n let str = '';\n if (route.name) {\n str += route.name;\n }\n if (route.runway) {\n str += `(${route.runway})`;\n }\n if (str.length !== 0 && route.waypoints && route.waypoints.length === 1) {\n str += ' starting at ';\n } else if (str.length !== 0 && route.waypoints) {\n str += ': ';\n }\n\n if (route.waypoints) {\n str += RouteUtils.waypointsToString(route.waypoints);\n }\n\n return str;\n }\n\n public static waypointToString(waypoint: Waypoint): string {\n let s = waypoint.name;\n if (waypoint.latitude && waypoint.longitude) {\n s += `(${CoordinateUtils.coordinateString({ latitude: waypoint.latitude, longitude: waypoint.longitude })})`;\n }\n if (waypoint.offset) {\n s += `[${waypoint.offset.bearing}° ${waypoint.offset.distance}nm]`;\n }\n if (waypoint.time && waypoint.timeFormat) {\n s += `@${DateTimeUtils.timestampToString(waypoint.time, waypoint.timeFormat)}`;\n }\n return s;\n }\n\n public static getWaypoint(leg: string): Waypoint {\n const regex = leg.match(/^([A-Z]+)(\\d{3})-(\\d{4})$/); // {name}{bearing}-{distance}\n if (regex?.length == 4) {\n return {\n name: regex[1],\n offset: {\n bearing: parseInt(regex[2]),\n distance: parseInt(regex[3]) / 10,\n },\n };\n }\n\n const waypoint = leg.split(',');\n if (waypoint.length == 2) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n waypoint[1],\n );\n if (position) {\n return {\n name: waypoint[0],\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n if (leg.length == 13 || leg.length == 14) {\n //looks like coordinates\n const position =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);\n const name = waypoint.length == 2 ? waypoint[0] : '';\n if (position) {\n return {\n name: name,\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n return { name: leg };\n }\n\n private static waypointsToString(waypoints: Waypoint[]): string {\n let str = waypoints\n .map((x) => RouteUtils.waypointToString(x))\n .join(' > ')\n .replaceAll('> >', '>>');\n if (str.startsWith(' > ')) {\n str = '>>' + str.slice(2);\n }\n return str;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { RouteUtils } from './route_utils';\nimport { Route } from '../types/route';\nimport { Wind } from '../types/wind';\n\n/**\n * Class to format the results of common fields\n */\nexport class ResultFormatter {\n static route(decodeResult: DecodeResult, route: Route) {\n decodeResult.raw.route = route;\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(route),\n });\n }\n\n static state_change(decodeResult: DecodeResult, from: string, to: string) {\n decodeResult.raw.state_change = {\n from: from,\n to: to,\n };\n from = RouteUtils.formatFlightState(from);\n to = RouteUtils.formatFlightState(to);\n decodeResult.formatted.items.push({\n type: 'state_change',\n code: 'STATE_CHANGE',\n label: 'State Change',\n value: `${from} -> ${to}`,\n });\n }\n\n static freetext(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.freetext = value;\n decodeResult.formatted.items.push({\n type: 'freetext',\n code: 'FREE_TEXT',\n label: 'Free Text',\n value: value,\n });\n }\n\n static door_event(decodeResult: DecodeResult, name: string, state: string) {\n decodeResult.raw.door_event = {\n door: name,\n state: state,\n };\n\n decodeResult.formatted.items.push({\n type: 'door_event',\n code: 'DOOR',\n label: 'Door Event',\n value: `${name} ${state}`,\n });\n }\n\n static position(\n decodeResult: DecodeResult,\n value: { latitude: number; longitude: number } | undefined,\n ) {\n if (!value || isNaN(value.latitude) || isNaN(value.longitude)) {\n return;\n }\n decodeResult.raw.position = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(value),\n });\n }\n\n static altitude(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.altitude = value;\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: 'Altitude',\n value: `${decodeResult.raw.altitude} feet`,\n });\n }\n\n static flightNumber(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.flight_number = value;\n decodeResult.formatted.items.push({\n type: 'flight_number',\n code: 'FLIGHT',\n label: 'Flight Number',\n value: decodeResult.raw.flight_number,\n });\n }\n\n static callsign(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.callsign = value;\n decodeResult.formatted.items.push({\n type: 'callsign',\n code: 'CALLSIGN',\n label: 'Callsign',\n value: decodeResult.raw.callsign,\n });\n }\n\n static departureAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.departure_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n } else {\n decodeResult.raw.departure_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n }\n }\n\n static departureRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.departure_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'DEPRWY',\n label: 'Departure Runway',\n value: decodeResult.raw.departure_runway,\n });\n }\n\n static arrivalAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n } else {\n decodeResult.raw.arrival_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n }\n }\n\n static alternateAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ALT_DST',\n label: 'Alternate Destination',\n value: decodeResult.raw.alternate_icao,\n });\n }\n\n static eta(\n decodeResult: DecodeResult,\n time: number,\n type: 'tod' | 'epoch' = 'tod',\n ) {\n if (type === 'tod') {\n decodeResult.raw.eta_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n } else {\n decodeResult.raw.eta_date = time;\n decodeResult.formatted.items.push({\n type: 'epoch',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time, 'epoch'),\n });\n }\n }\n\n static arrivalRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ARWY',\n label: 'Arrival Runway',\n value: decodeResult.raw.arrival_runway,\n });\n }\n\n static alternateRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ALT_ARWY',\n label: 'Alternate Runway',\n value: decodeResult.raw.alternate_runway,\n });\n }\n\n static currentFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_on_board = value;\n decodeResult.formatted.items.push({\n type: 'fuel_on_board',\n code: 'FOB',\n label: 'Fuel On Board',\n value: decodeResult.raw.fuel_on_board.toString(),\n });\n }\n\n static burnedFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_burned = value;\n decodeResult.formatted.items.push({\n type: 'fuel_burned',\n code: 'FB',\n label: 'Fuel Burned',\n value: decodeResult.raw.fuel_burned.toString(),\n });\n }\n\n static remainingFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_remaining = value;\n decodeResult.formatted.items.push({\n type: 'fuel_remaining',\n code: 'FUEL',\n label: 'Fuel Remaining',\n value: decodeResult.raw.fuel_remaining.toString(),\n });\n }\n\n static checksum(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.checksum = Number('0x' + value);\n decodeResult.formatted.items.push({\n type: 'message_checksum',\n code: 'CHECKSUM',\n label: 'Message Checksum',\n value: '0x' + ('0000' + decodeResult.raw.checksum.toString(16)).slice(-4),\n });\n }\n\n static groundspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.groundspeed = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_groundspeed',\n code: 'GSPD',\n label: 'Aircraft Groundspeed',\n value: `${decodeResult.raw.groundspeed} knots`,\n });\n }\n\n static airspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.airspeed = value;\n decodeResult.formatted.items.push({\n type: 'airspeed',\n code: 'ASPD',\n label: 'True Airspeed',\n value: `${decodeResult.raw.airspeed} knots`,\n });\n }\n\n static mach(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.mach = value;\n decodeResult.formatted.items.push({\n type: 'mach',\n code: 'MACH',\n label: 'Mach Number',\n value: `${decodeResult.raw.mach} mach`,\n });\n }\n\n static temperature(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.outside_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'outside_air_temperature',\n code: 'OATEMP',\n label: 'Outside Air Temperature (C)',\n value: `${decodeResult.raw.outside_air_temperature} degrees`,\n });\n }\n\n static heading(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.heading = value;\n decodeResult.formatted.items.push({\n type: 'heading',\n code: 'HDG',\n label: 'Heading',\n value: `${decodeResult.raw.heading}`,\n });\n }\n\n static tail(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.tail = value;\n decodeResult.formatted.items.push({\n type: 'tail',\n code: 'TAIL',\n label: 'Tail',\n value: decodeResult.raw.tail,\n });\n }\n\n static out(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.out_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'OUT',\n label: 'Out of Gate Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static off(\n decodeResult: DecodeResult,\n time: number,\n type: 'tod' | 'epoch' = 'tod',\n ) {\n if (type === 'tod') {\n decodeResult.raw.off_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n } else {\n decodeResult.raw.off_date = time;\n decodeResult.formatted.items.push({\n type: 'epoch',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time, 'epoch'),\n });\n }\n }\n\n static on(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.on_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'ON',\n label: 'Landing Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static in(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.in_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'IN',\n label: 'In Gate Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static time_of_day(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.time_of_day = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'MSG_TOD',\n label: 'Message Timestamp',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static day(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'MSG_DAY',\n label: 'Day of Month',\n value: `${day}`,\n });\n }\n\n static month(decodeResult: DecodeResult, month: number) {\n decodeResult.raw.month = month;\n decodeResult.formatted.items.push({\n type: 'month',\n code: 'MSG_MON',\n label: 'Month of Year',\n value: `${month}`,\n });\n }\n\n static departureDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.departure_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'DEP_DAY',\n label: 'Departure Day',\n value: `${day}`,\n });\n }\n\n static arrivalDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.arrival_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'ARR_DAY',\n label: 'Arrival Day',\n value: `${day}`,\n });\n }\n\n static text(decodeResult: DecodeResult, text: string) {\n decodeResult.raw.text = text;\n decodeResult.formatted.items.push({\n type: 'text',\n code: 'TEXT',\n label: 'Text Message',\n value: text,\n });\n }\n\n static mac(decodeResult: DecodeResult, mac: number) {\n decodeResult.raw.mac = mac;\n decodeResult.formatted.items.push({\n type: 'mac',\n code: 'MAC',\n label: 'Mean Aerodynamic Chord',\n value: `${mac} %`,\n });\n }\n\n static trim(decodeResult: DecodeResult, trim: number) {\n decodeResult.raw.trim = trim;\n decodeResult.formatted.items.push({\n type: 'trim',\n code: 'TRIM',\n label: 'Trim',\n value: `${trim} units`,\n });\n }\n\n static windData(decodeResult: DecodeResult, windData: Wind[]) {\n decodeResult.raw.wind_data = windData;\n for (const wind of windData) {\n let text = `${RouteUtils.waypointToString(wind.waypoint)} at FL${wind.flightLevel}: ${wind.windDirection}° at ${wind.windSpeed}kt`;\n if (wind.temperature) {\n text += `, ${wind.temperature.degreesC}°C at FL${wind.temperature.flightLevel}`;\n }\n decodeResult.formatted.items.push({\n type: 'wind_data',\n code: 'WIND',\n label: 'Wind Data',\n value: text,\n });\n }\n }\n\n static cg(\n decodeResult: DecodeResult,\n value: number,\n type: 'center' | 'lower' | 'upper' = 'center',\n ) {\n switch (type) {\n case 'center':\n decodeResult.raw.center_of_gravity = value;\n decodeResult.formatted.items.push({\n type: 'center_of_gravity',\n code: 'CG',\n label: 'Center of Gravity',\n value: `${decodeResult.raw.center_of_gravity} %`,\n });\n break;\n case 'lower':\n decodeResult.raw.cg_lower_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_lower_limit',\n code: 'CG_LOWER',\n label: 'Center of Gravity Lower Limit',\n value: `${decodeResult.raw.cg_lower_limit} %`,\n });\n break;\n case 'upper':\n decodeResult.raw.cg_upper_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_upper_limit',\n code: 'CG_UPPER',\n label: 'Center of Gravity Upper Limit',\n value: `${decodeResult.raw.cg_upper_limit} %`,\n });\n break;\n }\n }\n\n static version(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.version = value;\n decodeResult.formatted.items.push({\n type: 'version',\n code: 'VERSION',\n label: 'Message Version',\n value: `v${decodeResult.raw.version.toFixed(1)}`,\n });\n }\n\n static label(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.label = value;\n decodeResult.formatted.items.push({\n type: 'label',\n code: 'LABEL',\n label: 'Message Label',\n value: `${decodeResult.raw.label}`,\n });\n }\n\n static sublabel(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.sublabel = value;\n decodeResult.formatted.items.push({\n type: 'sublabel',\n code: 'SUBLABEL',\n label: 'Message Sublabel',\n value: `${decodeResult.raw.sublabel}`,\n });\n }\n\n static requestedAltitudes(decodeResult: DecodeResult, values: number[]) {\n decodeResult.raw.requested_alts = values;\n decodeResult.formatted.items.push({\n type: 'requested_altitudes',\n code: 'REQ_ALTS',\n label: 'Requested Altitudes',\n value: `${decodeResult.raw.requested_alts.join(', ')}`,\n });\n }\n\n static desiredAltitude(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.desired_alt = value;\n decodeResult.formatted.items.push({\n type: 'desired_altitude',\n code: 'DES_ALT',\n label: 'Desired Altitude',\n value: `${decodeResult.raw.desired_alt}`,\n });\n }\n\n static startPoint(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.start_point = value;\n decodeResult.formatted.items.push({\n type: 'start_point',\n code: 'START',\n label: 'Start Point',\n value: `${decodeResult.raw.start_point}`,\n });\n }\n\n static routeNumber(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.route_number = value;\n decodeResult.formatted.items.push({\n type: 'route_number',\n code: 'RTE_NUM',\n label: 'Route Number',\n value: `${decodeResult.raw.route_number}`,\n });\n }\n\n static flightPlan(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.flight_plan = value;\n decodeResult.formatted.items.push({\n type: 'flight_plan',\n code: 'FPN',\n label: 'Flight Plan',\n value: `${decodeResult.raw.flight_plan}`,\n });\n }\n\n static groundAddress(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.ground_address = value;\n decodeResult.formatted.items.push({\n type: 'ground_address',\n code: 'GND_ADDR',\n label: 'Ground Address',\n value: `${decodeResult.raw.ground_address}`,\n });\n }\n\n static unknown(decodeResult: DecodeResult, value: string, sep: string = ',') {\n if (!decodeResult.remaining.text) decodeResult.remaining.text = value;\n else decodeResult.remaining.text += sep + value;\n }\n\n static unknownArr(\n decodeResult: DecodeResult,\n value: string[],\n sep: string = ',',\n ) {\n this.unknown(decodeResult, value.join(sep), sep);\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class CBand extends DecoderPlugin {\n name = 'c-band';\n qualifiers() {\n return {\n labels: ['*'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n // C-Band puts a 10 char header in front of some message types\n // First 4 chars are some kind of message number\n // Last 6 chars are the flight number\n let cband = message.text.match(\n /^(?<msgno>[A-Z]\\d{2}[A-Z])(?<airline>[A-Z0-9]{2})(?<number>[0-9]{4})/,\n );\n if (cband?.groups) {\n const messageText = message.text.substring(10);\n const decoded = this.decoder.decode(\n {\n label: message.label,\n sublabel: message.sublabel,\n text: messageText,\n },\n options,\n );\n if (decoded.decoded) {\n ResultFormatter.flightNumber(\n decodeResult,\n cband.groups.airline + Number(cband.groups.number),\n );\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.decoder.name = this.name + '-' + decoded.decoder.name;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.description = decoded.formatted.description;\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n }\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_5Z_Slash extends DecoderPlugin {\n name = 'label-5z-slash';\n\n descriptions: Record<string, string> = {\n B1: 'Request Weight and Balance',\n B3: 'Request Departure Clearance',\n CD: 'Weight and Balance',\n CG: 'Request Pre-departure clearance, PDC',\n CM: 'Crew Scheduling',\n C3: 'Off Message',\n C4: 'Flight Dispatch',\n C5: 'Maintenance Message',\n C6: 'Customer Service',\n 10: 'PIREP',\n C11: 'International PIREP',\n DS: 'Late Message',\n D3: 'Holding Pattern Message',\n D6: 'From-To + Date',\n D7: 'From-To + Alternate + Time',\n EO: 'In Range',\n ET: 'Expected Time',\n PW: 'Position Weather',\n RL: 'Request Release',\n R3: 'Request HOWGOZIT Message',\n R4: 'Request the Latest POSBD',\n TC: 'From-To Fuel',\n WB: 'From-To',\n W1: 'Request Weather for City',\n };\n\n qualifiers() {\n return {\n labels: ['5Z'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Designated Downlink';\n\n const lines = message.text.split('\\r\\n');\n if (lines[0] === '/TXT') {\n // not UA, but starts with `/`\n ResultFormatter.text(decodeResult, lines.slice(1).join('\\r\\n'));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n const data = lines[0].split('/');\n const header = data[1].split(' '); //data[0] is blank\n const type = header[0];\n const typeDescription = this.descriptions[type];\n\n if (typeDescription) {\n decodeResult.raw.airline = 'United Airlines';\n decodeResult.formatted.items.push({\n type: 'airline',\n code: 'AIRLINE',\n label: 'Airline',\n value: 'United Airlines',\n });\n decodeResult.raw.message_type = type;\n decodeResult.formatted.items.push({\n type: 'message_type',\n code: 'MSG_TYPE',\n label: 'Message Type',\n value: `${typeDescription} (${type})`,\n });\n\n if (type === 'B3' && data[1] === 'B3 TO DATA REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));\n ResultFormatter.unknownArr(decodeResult, data.slice(3), '/');\n } else if (type === 'B3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n decodeResult.raw.day = Number(header[2]);\n ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));\n if (header.length > 4) {\n ResultFormatter.unknownArr(decodeResult, header.slice(4), '/');\n }\n } else if (type === 'C3' && data[1] === 'C3 GATE REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.unknownArr(decodeResult, info.slice(5), ' ');\n } else if (type === 'C3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n } else if (type === 'ET') {\n const airports = data[2].split(' ');\n // aiports[0] is blank\n ResultFormatter.departureAirport(decodeResult, airports[1]);\n ResultFormatter.arrivalAirport(decodeResult, airports[2]);\n decodeResult.raw.day = Number(airports[3]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(airports[4]),\n );\n\n const estimates = data[3].split(' ');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(estimates[1]),\n );\n ResultFormatter.unknown(decodeResult, estimates[2]);\n } else {\n if (options.debug) {\n console.log(`Decoder: Unkown 5Z RDC format: ${message.text}`);\n }\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 5Z message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_LDR extends DecoderPlugin {\n name = 'label-10-ldr';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['LDR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[5];\n const lon = parts[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim()),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim()),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.departureAirport(decodeResult, parts[9]);\n ResultFormatter.arrivalAirport(decodeResult, parts[10]);\n ResultFormatter.alternateAirport(decodeResult, parts[11]);\n ResultFormatter.arrivalRunway(decodeResult, parts[12].split('/')[0]); // TODO: find out if anything comes after `/` sometimes\n const altRwy = [parts[13].split('/')[0], parts[14].split('/')[0]]\n .filter((r) => r != '')\n .join(',');\n if (altRwy != '') {\n ResultFormatter.alternateRunway(decodeResult, altRwy); // TODO: find out if anything comes after `/` sometimes\n }\n ResultFormatter.unknownArr(decodeResult, [\n ...parts.slice(0, 5),\n ...parts.slice(15),\n ]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_POS extends DecoderPlugin {\n name = 'label-10-pos';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length !== 12) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n //const time = parts[0].substring(3); //DDHHMM\n const lat = parts[1].trim();\n const lon = parts[2].trim();\n const position = {\n latitude:\n ((lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim())) / 100,\n longitude:\n ((lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim())) / 100,\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.unknownArr(decodeResult, [\n parts[0],\n ...parts.slice(3, 7),\n ...parts.slice(8),\n ]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_Slash extends DecoderPlugin {\n name = 'label-10-slash';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[1];\n const lon = parts[2];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.heading(decodeResult, Number(parts[5]));\n ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));\n ResultFormatter.arrivalAirport(decodeResult, parts[7]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[8]),\n );\n const waypoints: Waypoint[] = [\n {\n name: parts[11],\n },\n {\n name: parts[12],\n time: DateTimeUtils.convertHHMMSSToTod(parts[13]),\n timeFormat: 'tod',\n },\n {\n name: parts[14],\n time: DateTimeUtils.convertHHMMSSToTod(parts[15]),\n timeFormat: 'tod',\n },\n ];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n\n if (parts[16]) {\n ResultFormatter.departureAirport(decodeResult, parts[16]);\n }\n\n ResultFormatter.unknownArr(\n decodeResult,\n [parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)],\n '/',\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_12_N_Space extends DecoderPlugin {\n name = 'label-12-n-space';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*),.(?<airframe>.*),(?<unkwn3>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 12 N : results');\n console.log(results);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n });\n\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n results.groups.unkwn3,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_12_POS extends DecoderPlugin {\n name = 'label-12-pos';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split(',');\n if (!message.text.startsWith('POS') || data.length !== 12) {\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = data[0].substring(0, 8);\n const lon = data[0].substring(8);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lat.substring(1, 4)),\n Number(lat.substring(4, 6)),\n Number(lat.substring(6, 8)),\n ),\n longitude:\n CoordinateUtils.getDirection(lon[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lon.substring(1, 4)),\n Number(lon.substring(4, 6)),\n Number(lon.substring(6, 8)),\n ),\n });\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));\n ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));\n ResultFormatter.currentFuel(\n decodeResult,\n Number(data[7].substring(3).trim()),\n ); // strip FOB\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()),\n ); // strip ETA\n ResultFormatter.departureAirport(decodeResult, data[9]);\n ResultFormatter.arrivalAirport(decodeResult, data[10]);\n ResultFormatter.unknown(decodeResult, data[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_13Through18_Slash extends DecoderPlugin {\n name = 'label-13-18-slash';\n\n qualifiers() {\n return {\n labels: ['13', '14', '15', '16', '17', '18'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n const parts = lines[0].split('/');\n const labelNumber = Number(parts[1].substring(0, 2));\n decodeResult.formatted.description = getMsgType(labelNumber);\n\n // labels 13-17 have 4 parts, label 18 has 7 parts\n if (\n (labelNumber !== 18 && parts.length !== 4) ||\n (labelNumber === 18 && parts.length !== 7)\n ) {\n if (options?.debug) {\n console.log(`Decoder: Unknown OOOI message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // parts[0] === ''\n const data = parts[2].split(' ');\n ResultFormatter.departureAirport(decodeResult, data[1]);\n ResultFormatter.arrivalAirport(decodeResult, data[2]);\n decodeResult.raw.day = Number(data[3]);\n const time = DateTimeUtils.convertHHMMSSToTod(data[4]);\n if (labelNumber === 13) {\n ResultFormatter.out(decodeResult, time);\n } else if (labelNumber === 14) {\n ResultFormatter.off(decodeResult, time);\n } else if (labelNumber === 15) {\n ResultFormatter.on(decodeResult, time);\n } else if (labelNumber === 16) {\n ResultFormatter.in(decodeResult, time);\n }\n\n if (parts.length === 7) {\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), '/');\n }\n\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].startsWith('/LOC')) {\n const location = lines[i].substring(5).split(','); // strip off '/LOC'\n let position;\n if (location[0].startsWith('+') || location[0].startsWith('-')) {\n position = {\n latitude: Number(location[0]),\n longitude: Number(location[1]),\n };\n } else {\n position = {\n latitude:\n CoordinateUtils.getDirection(location[0][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[0].substring(1, 3)),\n Number(location[0].substring(3, 5)),\n Number(location[0].substring(5, 7)),\n ),\n longitude:\n CoordinateUtils.getDirection(location[1][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[1].substring(1, 4)),\n Number(location[1].substring(4, 6)),\n Number(location[1].substring(6, 8)),\n ),\n };\n }\n ResultFormatter.position(decodeResult, position);\n } else {\n ResultFormatter.unknown(decodeResult, lines[i], '\\r\\n');\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n return decodeResult;\n }\n}\n\nfunction getMsgType(labelNumber: number): string {\n if (labelNumber === 13) {\n return 'Out of Gate Report';\n }\n if (labelNumber === 14) {\n return 'Takeoff Report';\n }\n if (labelNumber === 15) {\n return 'On Ground Report';\n }\n if (labelNumber === 16) {\n return 'In Gate Report';\n }\n if (labelNumber === 17) {\n return 'Post Report';\n }\n if (labelNumber === 18) {\n return 'Post Times Report';\n }\n\n return 'Unknown';\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_15 extends DecoderPlugin {\n name = 'label-15';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (message.text.startsWith('(2') && message.text.endsWith('(Z')) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(0, 13),\n ),\n );\n if (between.length === 25) {\n // short variant\n ResultFormatter.unknown(decodeResult, between.substring(13, 19));\n const alt = between.substring(19, 22);\n if (alt != '---') {\n ResultFormatter.altitude(decodeResult, 100 * Number(alt));\n }\n ResultFormatter.temperature(\n decodeResult,\n between.substring(22).replaceAll(' ', '0'),\n );\n } else if (between.substring(13, 16) === 'OFF') {\n // off variant\n const ddmmyy = between.substring(16, 22);\n const hhmm = between.substring(22, 26);\n if (ddmmyy != '------') {\n const mmddyy =\n ddmmyy.substring(2, 4) +\n ddmmyy.substring(0, 2) +\n ddmmyy.substring(4);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(hhmm + '00', mmddyy),\n 'epoch',\n );\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmm),\n 'tod',\n );\n }\n ResultFormatter.unknown(decodeResult, between.substring(26));\n } else {\n ResultFormatter.unknown(decodeResult, between.substring(26));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 15 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_15_FST extends DecoderPlugin {\n name = 'label-15-fst';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['FST01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(' ');\n // FST01KMCOEGKKN505552W00118021\n const header = parts[0];\n\n const stringCoords = header.substring(13);\n // Don't use decodeStringCoordinates here, because of different pos format\n\n const firstChar = stringCoords.substring(0, 1);\n const middleChar = stringCoords.substring(7, 8);\n decodeResult.raw.position = {};\n\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n const lat =\n (Number(stringCoords.substring(1, 7)) / 10000) *\n (firstChar === 'S' ? -1 : 1);\n const lon =\n (Number(stringCoords.substring(8, 15)) / 10000) *\n (middleChar === 'W' ? -1 : 1);\n ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });\n ResultFormatter.altitude(\n decodeResult,\n Number(stringCoords.substring(15)) * 100,\n );\n } else {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), ' ');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Honeywell Label 16 Position Report\nexport class Label_16_Honeywell extends DecoderPlugin {\n name = 'label-16-honeywell';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (\n message.text.startsWith('(2') &&\n message.text.endsWith('(Z') &&\n message.text.length >= 29\n ) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.unknown(decodeResult, between.substring(0, 4), ''); // Session ID\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(4, 17),\n ),\n );\n if (between.charAt(17) === '-') {\n // Waypoint mode\n const waypoint1 = between.substring(18, 23).trim();\n const waypoint2 = between.substring(23, 28).trim();\n if (waypoint2) {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }, { name: waypoint2 }],\n });\n } else {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }],\n });\n }\n } else {\n // Route mode\n ResultFormatter.departureAirport(\n decodeResult,\n between.substring(17, 21),\n );\n ResultFormatter.arrivalAirport(decodeResult, between.substring(21, 25));\n //ignore the rest (should just be '-')\n }\n /*\n const phases: { [key: string]: string } = {\n '/O': 'En Route',\n '/A': 'Arrival',\n '/D': 'Departure',\n '/P': 'Preflight',\n '/C': 'Climb',\n };\n */\n ResultFormatter.unknown(\n decodeResult,\n between.substring(between.length - 2),\n '',\n );\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 Honeywell message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_N_Space extends DecoderPlugin {\n name = 'label-16-n-space';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: N 44.203,W 86.546,31965,6, 290\n let variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*)$/;\n\n // Style: N 28.177/W 96.055\n let variant2Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*)\\/(?<long>[EW])\\s*(?<long_coord>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n\n ResultFormatter.position(decodeResult, pos);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n\n results = message.text.match(variant2Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n\n ResultFormatter.position(decodeResult, pos);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_POSA1 extends DecoderPlugin {\n name = 'label-16-posa1';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['POSA1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n if (fields.length !== 11 || !fields[0].startsWith('POSA1')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(5)),\n ); // strip 'POSA1'\n const waypoint = fields[1].trim();\n const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]) * 100);\n const nextWaypoint = fields[4].trim();\n const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(6), ',');\n ResultFormatter.route(decodeResult, {\n waypoints: [\n { name: waypoint, time: time, timeFormat: 'tod' },\n { name: nextWaypoint, time: nextTime, timeFormat: 'tod' },\n ],\n });\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_TOD extends DecoderPlugin {\n name = 'label-16-tod';\n\n qualifiers() {\n return {\n labels: ['16'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n const time = DateTimeUtils.convertHHMMSSToTod(fields[0]);\n if (fields.length !== 5 || Number.isNaN(time)) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.time_of_day(decodeResult, time);\n if (fields[1] !== '') {\n ResultFormatter.altitude(decodeResult, Number(fields[1]));\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n const temp = fields[4].split('/');\n const posFields = temp[0].split(' ');\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(posFields[0]) * Number(posFields[1]),\n longitude:\n CoordinateUtils.getDirection(posFields[2]) * Number(posFields[3]),\n });\n\n if (temp.length > 1) {\n ResultFormatter.flightNumber(decodeResult, temp[1]);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\nexport class FlightPlanUtils {\n /**\n * Processes flight plan data\n *\n * Expected format is [header, key1, val1, ... keyN, valN]\n *\n * @param decodeResult - results\n * @param data - original message split by ':'\n * @returns whether all fields were processed or not\n */\n public static processFlightPlan(\n decodeResult: DecodeResult,\n data: string[],\n ): boolean {\n let allKnownFields = FlightPlanUtils.parseHeader(decodeResult, data[0]);\n for (let i = 1; i < data.length; i += 2) {\n const key = data[i];\n const value = data[i + 1];\n // TODO: discuss how store commented out bits as both raw and formatted\n switch (key) {\n case 'A': // Arrival Procedure (?)\n FlightPlanUtils.addProcedure(decodeResult, value, 'arrival');\n break;\n case 'AA':\n addArrivalAirport(decodeResult, value);\n break;\n case 'AP':\n FlightPlanUtils.addProcedure(decodeResult, value, 'approach');\n break;\n case 'CR':\n addCompanyRoute(decodeResult, value);\n break;\n case 'D': // Departure Procedure\n FlightPlanUtils.addProcedure(decodeResult, value, 'departure');\n break;\n case 'DA':\n addDepartureAirport(decodeResult, value);\n break;\n case 'F': // First Waypoint\n addRoute(decodeResult, value);\n break;\n case 'FP':\n ResultFormatter.flightPlan(decodeResult, value.trim());\n break;\n case 'R':\n addRunway(decodeResult, value);\n break;\n // case 'WS': // something about routes, has altitude, so current parsing won't work\n // break;\n default:\n if (allKnownFields) {\n decodeResult.remaining.text = '';\n allKnownFields = false;\n }\n decodeResult.remaining.text += `:${key}:${value}`;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return allKnownFields;\n }\n public static parseHeader(\n decodeResult: DecodeResult,\n header: string,\n ): boolean {\n let allKnownFields = true;\n if (header.startsWith('RF')) {\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Filed',\n });\n decodeResult.raw.route_status = 'RF';\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RP')) {\n decodeResult.raw.route_status = 'RP';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Planned',\n });\n decodeResult.raw.route_status = header;\n } else if (header.startsWith('RI')) {\n decodeResult.raw.route_status = 'RI';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Inactive',\n });\n } else if (header.startsWith('RM')) {\n decodeResult.raw.route_status = 'RM';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Mapped',\n });\n } else if (header.startsWith('RS')) {\n decodeResult.raw.route_status = 'RS';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Saved',\n });\n } else {\n decodeResult.remaining.text += header;\n allKnownFields = false;\n }\n return allKnownFields;\n }\n\n public static addProcedure(\n decodeResult: DecodeResult,\n value: string,\n type: string,\n ) {\n if (decodeResult.raw.procedures === undefined) {\n decodeResult.raw.procedures = [];\n }\n const data = value.split('.');\n let waypoints;\n if (data.length > 1) {\n waypoints = data.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n const route = { name: data[0], waypoints: waypoints };\n decodeResult.raw.procedures.push({ type: type, route: route });\n const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);\n decodeResult.formatted.items.push({\n type: 'procedure',\n code: 'proc',\n label: `${procedureName} Procedure`,\n value: RouteUtils.routeToString(route),\n });\n }\n}\n\nfunction addArrivalAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.arrivalAirport(decodeResult, value);\n}\n\nfunction addDepartureAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.departureAirport(decodeResult, value);\n}\n\nfunction addRunway(decodeResult: DecodeResult, value: string) {\n // xxx(yyy) where xxx is the departure runway and yyy is the arrival runway\n if (value.length === 8) {\n ResultFormatter.arrivalRunway(decodeResult, value.substring(4, 7));\n }\n\n ResultFormatter.departureRunway(decodeResult, value.substring(0, 3));\n}\n\nfunction addRoute(decodeResult: DecodeResult, value: string) {\n const route = value.split('.');\n ResultFormatter.route(decodeResult, {\n waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)),\n });\n}\n\nfunction addCompanyRoute(decodeResult: DecodeResult, value: string) {\n const segments = value.split('.');\n const parens_idx = segments[0].indexOf('(');\n let name;\n let runway;\n if (parens_idx === -1) {\n name = segments[0];\n } else {\n name = segments[0].slice(0, parens_idx);\n runway = segments[0].slice(parens_idx + 1, segments[0].indexOf(')'));\n }\n let waypoints;\n if (segments.length > 1) {\n waypoints = segments.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n decodeResult.raw.company_route = {\n name: name,\n runway: runway,\n waypoints: waypoints,\n };\n decodeResult.formatted.items.push({\n type: 'company_route',\n code: 'CR',\n label: 'Company Route',\n value: RouteUtils.routeToString(decodeResult.raw.company_route),\n });\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { FlightPlanUtils } from './flight_plan_utils';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\nexport class H1Helper {\n public static decodeH1Message(decodeResult: DecodeResult, message: string) {\n const checksum = message.slice(-4);\n const data = message.slice(0, message.length - 4);\n if (calculateChecksum(data) !== checksum) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return false;\n }\n const fields = data.split('/');\n const canDecode = parseMessageType(decodeResult, fields[0]);\n if (!canDecode) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n\n for (let i = 1; i < fields.length; ++i) {\n const key = fields[i].substring(0, 2);\n const data = fields[i].substring(2);\n switch (key) {\n case 'AF':\n processAirField(decodeResult, data.split(','));\n break;\n case 'AK':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processAK(decodeResult, data.split(','));\n break;\n case 'CG':\n processCenterOfGravity(decodeResult, data.split(','));\n break;\n case 'DC':\n processDateCode(decodeResult, data.split(','));\n break;\n case 'DI':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processDI(decodeResult, data.split(','));\n break;\n case 'DT': //processDestination?\n processDT(decodeResult, data.split(','));\n break;\n case 'DQ':\n ResultFormatter.desiredAltitude(\n decodeResult,\n parseInt(data, 10) * 100,\n );\n // processDQ(decodeResult, data.split(','));\n break;\n case 'ET':\n processETA(data, decodeResult, fields, i);\n break;\n case 'FB':\n ResultFormatter.currentFuel(decodeResult, parseInt(data, 10));\n break;\n case 'FN':\n decodeResult.raw.flight_number = data;\n break;\n case 'FX':\n ResultFormatter.freetext(decodeResult, data);\n break;\n case 'GA':\n ResultFormatter.groundAddress(decodeResult, data);\n break;\n case 'ID':\n processIdentification(decodeResult, data.split(','));\n break;\n case 'LR':\n processLandingReport(decodeResult, data.split(','));\n break;\n case 'PR':\n // TODO: decode /PR fields\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n break;\n case 'PS': // Position\n H1Helper.processPS(decodeResult, data.split(','));\n break;\n case 'RF':\n case 'RI':\n case 'RM':\n case 'RP':\n case 'RS':\n // TODO - use key/data instead of whole message\n FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(':'));\n break;\n case 'RN':\n ResultFormatter.routeNumber(decodeResult, data);\n break;\n case 'SN':\n decodeResult.raw.serial_number = data;\n break;\n case 'SP':\n ResultFormatter.startPoint(decodeResult, data);\n break;\n case 'TD':\n processTimeOfDeparture(decodeResult, data.split(','));\n break;\n case 'TS':\n H1Helper.processTimeStamp(decodeResult, data.split(','));\n break;\n case 'VR':\n ResultFormatter.version(decodeResult, parseInt(data, 10) / 10);\n break;\n case 'WD':\n processWindData(decodeResult, data);\n break;\n case 'WQ':\n processWeatherQuery(decodeResult, data.split(':'));\n break;\n default:\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n }\n\n ResultFormatter.checksum(decodeResult, checksum);\n\n return true;\n }\n\n public static processPS(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length === 9) {\n // variant 7\n processRoute(decodeResult, data[3], data[1], data[5], data[4], undefined);\n ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);\n ResultFormatter.temperature(decodeResult, data[6]);\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n }\n if (data.length === 14) {\n // variant 2\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n }\n\n public static processPosition(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length >= 10) {\n // variant 1, short\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n ResultFormatter.unknown(decodeResult, data[9]);\n }\n if (data.length >= 14) {\n // variant 2,long\n ResultFormatter.unknownArr(decodeResult, data.slice(10));\n }\n }\n\n public static processTimeStamp(decodeResult: DecodeResult, data: string[]) {\n if (data.length > 2) {\n const positionData = data.slice(1);\n positionData[0] = positionData[0].substring(6); // strip time from position field\n this.processPosition(decodeResult, positionData);\n }\n let time = DateTimeUtils.convertDateTimeToEpoch(\n data[0],\n data[1].substring(0, 6),\n );\n\n if (Number.isNaN(time)) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[1].substring(2, 4) +\n data[1].substring(0, 2) +\n data[1].substring(4, 6);\n time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);\n }\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processETA(\n data: string,\n decodeResult: DecodeResult,\n fields: string[],\n i: number,\n) {\n if (data.length === 5) {\n // 1 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(1)),\n );\n } else if (data.length === 6) {\n // 2 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(2)),\n );\n } else {\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n}\n\nfunction processAirField(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n ResultFormatter.departureAirport(decodeResult, data[0]);\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), 'AF/');\n }\n}\nfunction processTimeOfDeparture(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n decodeResult.raw.plannedDepartureTime = data[0]; //DDHHMM\n decodeResult.formatted.items.push({\n type: 'ptd',\n code: 'ptd',\n label: 'Planned Departure Time',\n value: `YYYY-MM-${data[0].substring(0, 2)}T${data[0].substring(2, 4)}:${data[0].substring(4)}:00Z`,\n });\n\n decodeResult.raw.plannedDepartureTime = data[1]; //HHMM\n decodeResult.formatted.items.push({\n type: 'etd',\n code: 'etd',\n label: 'Estimated Departure Time',\n value: `${data[1].substring(0, 2)}:${data[1].substring(2)}`,\n });\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), '/TD');\n }\n}\n\nfunction processIdentification(decodeResult: DecodeResult, data: string[]) {\n ResultFormatter.tail(decodeResult, data[0]);\n if (data.length > 1) {\n ResultFormatter.flightNumber(decodeResult, data[1]);\n }\n if (data.length > 2) {\n //TODO: figure out what this is\n decodeResult.raw.mission_number = data[2];\n }\n}\n\nfunction processDT(decodeResult: DecodeResult, data: string[]) {\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[0]);\n } else if (decodeResult.raw.arrival_icao != data[0]) {\n ResultFormatter.unknownArr(decodeResult, data);\n } // else duplicate - don't do anything\n\n if (data.length > 1) {\n ResultFormatter.arrivalRunway(decodeResult, data[1]);\n }\n if (data.length > 2) {\n ResultFormatter.currentFuel(decodeResult, Number(data[2]));\n }\n if (data.length > 3) {\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[3]),\n );\n }\n if (data.length > 4) {\n ResultFormatter.remainingFuel(decodeResult, Number(data[4]));\n }\n if (data.length > 5) {\n //TODO: figure out what this is\n ResultFormatter.unknownArr(decodeResult, data);\n }\n}\n\nfunction processLandingReport(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 19) {\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.arrivalRunway(decodeResult, data[5]);\n ResultFormatter.unknown(decodeResult, data.slice(6, 19).join(','));\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\nfunction processCenterOfGravity(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10);\n }\n } else if (data.length === 3) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10, 'center');\n }\n if (data[1] !== undefined && data[1] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[1], 10) / 10, 'lower');\n }\n if (data[2] !== undefined && data[2] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[2], 10) / 10, 'upper');\n }\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\nfunction parseMessageType(\n decodeResult: DecodeResult,\n messagePart: string,\n): boolean {\n const messageParts = messagePart.split(',');\n const messageType = messageParts[0];\n if (messageType.startsWith('POS')) {\n H1Helper.processPosition(decodeResult, messagePart.substring(3).split(','));\n return processMessageType(decodeResult, 'POS');\n } else if (messageType.length === 6) {\n const part1 = processMessageType(decodeResult, messageType.substring(0, 3));\n const description = decodeResult.formatted.description;\n const part2 = processMessageType(decodeResult, messageType.substring(3, 6));\n decodeResult.formatted.description =\n description + ' for ' + decodeResult.formatted.description;\n if (messageParts.length > 1) {\n // TODO handle REJPWI/REJPOS\n ResultFormatter.unknown(\n decodeResult,\n messageParts.slice(1).join(','),\n '/',\n );\n }\n return part1 && part2;\n }\n\n if (messageParts.length > 1) {\n // TODO handle\n ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(','), '/');\n }\n\n return processMessageType(decodeResult, messageType);\n}\n\nfunction processMessageType(decodeResult: DecodeResult, type: string): boolean {\n if (type === 'FPN') {\n decodeResult.formatted.description = 'Flight Plan';\n } else if (type === 'FTX') {\n decodeResult.formatted.description = 'Free Text';\n } else if (type === 'INI') {\n decodeResult.formatted.description = 'Flight Plan Initial Report';\n } else if (type === 'PER') {\n decodeResult.formatted.description = 'Performance Report';\n } else if (type === 'POS') {\n decodeResult.formatted.description = 'Position Report';\n } else if (type === 'PRG') {\n decodeResult.formatted.description = 'Progress Report';\n } else if (type === 'PWI') {\n decodeResult.formatted.description = 'Pilot Weather Information';\n } else if (type === 'REJ') {\n decodeResult.formatted.description = 'Reject';\n } else if (type === 'REQ') {\n decodeResult.formatted.description = 'Request';\n } else if (type === 'RES') {\n decodeResult.formatted.description = 'Response';\n } else {\n decodeResult.formatted.description = 'Unknown H1 Message';\n return false;\n }\n return true;\n}\n\nfunction processDateCode(decodeResult: DecodeResult, data: string[]) {\n decodeResult.raw.message_date = data[0]; // DDMMYYYY;\n\n if (data.length === 1) {\n // noop?\n } else if (data.length === 2) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[0].substring(2, 4) +\n data[0].substring(0, 2) +\n data[0].substring(4, 6);\n const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS\n\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processWeatherQuery(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 2) {\n ResultFormatter.unknown(decodeResult, data.join(':'), 'WQ/');\n return;\n }\n\n const alts = data[0].split('.');\n const route = data[1].split('.');\n\n ResultFormatter.requestedAltitudes(\n decodeResult,\n alts.map((a) => parseInt(a, 10) * 100),\n );\n\n const waypoints = route.map((wp) => {\n return { name: wp };\n });\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processRoute(\n decodeResult: DecodeResult,\n last: string,\n time: string,\n next: string,\n eta: string,\n then?: string,\n date?: string,\n) {\n const lastTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(time, date)\n : DateTimeUtils.convertHHMMSSToTod(time);\n const nextTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(eta, date)\n : DateTimeUtils.convertHHMMSSToTod(eta);\n const timeFormat = date ? 'epoch' : 'tod';\n\n const lastWaypoint = RouteUtils.getWaypoint(last);\n lastWaypoint.time = lastTime;\n lastWaypoint.timeFormat = timeFormat;\n\n const nextWaypoint = RouteUtils.getWaypoint(next);\n nextWaypoint.time = nextTime;\n nextWaypoint.timeFormat = timeFormat;\n\n const thenWaypoint = RouteUtils.getWaypoint(then || '?');\n\n const waypoints: Waypoint[] = [lastWaypoint, nextWaypoint, thenWaypoint];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processWindData(decodeResult: DecodeResult, message: string) {\n const wind = [] as Wind[];\n\n const flightLevel = Number(message.slice(0, 3));\n const fields = message.slice(4).split('.'); // strip off altitude and comma\n fields.forEach((field) => {\n const data = field.split(',');\n const waypoint = { name: data[0] };\n const windData = data[1];\n const windDirection = Number(windData.slice(0, 3));\n const windSpeed = Number(windData.slice(3));\n\n if (data.length === 3) {\n const tempData = data[2];\n const tempFlightLevel = Number(tempData.slice(0, 3));\n const tempString = tempData.slice(3);\n const tempDegrees =\n Number(tempString.substring(1)) *\n (tempString.charAt(0) === 'M' ? -1 : 1);\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: tempFlightLevel,\n degreesC: tempDegrees,\n },\n });\n } else {\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n });\n }\n });\n\n ResultFormatter.windData(decodeResult, wind);\n}\n\n// CRC-16/IBM-SDLC but nibbles are reversed\nfunction calculateChecksum(data: string): string {\n let crc = 0xffff;\n const bytes = Buffer.from(data, 'ascii');\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x0001) !== 0) {\n crc = (crc >>> 1) ^ 0x8408;\n } else {\n crc = crc >>> 1;\n }\n }\n }\n crc = (crc ^ 0xffff) & 0xffff;\n\n const nibble1 = (crc >> 12) & 0xf;\n const nibble2 = (crc >> 8) & 0xf;\n const nibble3 = (crc >> 4) & 0xf;\n const nibble4 = crc & 0xf;\n\n return `${nibble4.toString(16)}${nibble3.toString(16)}${nibble2.toString(16)}${nibble1.toString(16)}`.toUpperCase();\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1J_2J_FTX extends DecoderPlugin {\n name = 'label-1j-2j-ftx';\n qualifiers() {\n return {\n labels: ['1J', '2J'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, '');\n const parts = msg.split('/');\n let decoded = false;\n if (parts[0].length > 3) {\n decoded = H1Helper.decodeH1Message(\n decodeResult,\n msg.slice(parts[0].length - 3),\n );\n // flight number is already decoded in other fields\n decodeResult.remaining.text =\n parts[0].slice(0, 3) + '/' + decodeResult.remaining.text;\n } else {\n decoded = H1Helper.decodeH1Message(decodeResult, msg);\n }\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1J/2J message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1M_Slash extends DecoderPlugin {\n name = 'label-1m-slash';\n\n qualifiers() {\n return {\n labels: ['1M'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0(NEW LINE)1940/EGLL27L/10\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 1M ETA: results');\n console.log(results);\n }\n\n decodeResult.raw.flight_number = results[0];\n // results[1]: ETA01 (???)\n // results[2]: 230822 - UTC date of eta\n ResultFormatter.departureAirport(decodeResult, results[3]);\n ResultFormatter.arrivalAirport(decodeResult, results[4]);\n ResultFormatter.alternateAirport(decodeResult, results[5]);\n // results[6]: 2JK0 (???)\n // results[7] 1940 - UTC eta\n ResultFormatter.arrivalRunway(\n decodeResult,\n results[8].replace(results[4], ''),\n ); // results[8] EGLL27L\n // results[9]: 10(space) (???)\n\n const yymmdd = results[2];\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(\n results[7] + '00',\n yymmdd.substring(2, 4) +\n yymmdd.substring(4, 6) +\n yymmdd.substring(0, 2),\n ),\n 'epoch',\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_3Line extends DecoderPlugin {\n name = 'label-1l-3-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n if (lines.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n const parts = message.text.replaceAll('\\r\\n', '/').split('/');\n const data = new Map<string, string>();\n data.set('', parts[0]);\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const dep = data.get('DEP');\n if (dep) {\n ResultFormatter.departureAirport(decodeResult, dep);\n data.delete('DEP');\n }\n const des = data.get('DES');\n if (des) {\n ResultFormatter.arrivalAirport(decodeResult, des);\n data.delete('DES');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fn = data.get('FN');\n if (fn) {\n ResultFormatter.flightNumber(decodeResult, fn);\n data.delete('FN');\n }\n const day = data.get('DAY');\n const utc = data.get('UTC');\n if (day && utc) {\n decodeResult.raw.message_timestamp =\n Date.parse(day + ' GMT+0000') / 1000 +\n DateTimeUtils.convertHHMMSSToTod(utc);\n data.delete('DAY');\n data.delete('UTC');\n }\n\n const lat = data.get('LAT');\n const lon = data.get('LON');\n if (lat && lon) {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n data.delete('LAT');\n data.delete('LON');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n if (key === '') {\n remaining += value;\n } else {\n remaining += `/${key} ${value}`;\n }\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_070 extends DecoderPlugin {\n name = 'label-1l-070';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000070'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000070')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, parts[0]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(parts[4][0]) *\n Number(parts[4].substring(1)),\n longitude:\n CoordinateUtils.getDirection(parts[5][0]) *\n Number(parts[5].substring(1)),\n });\n\n decodeResult.remaining.text = parts[6];\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_660 extends DecoderPlugin {\n name = 'label-1l-660';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000660'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000660')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 5) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n parts[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n const hhmmss = parts[1].substring(0, 6);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmmss),\n );\n const fl = parts[1].substring(6, 9);\n ResultFormatter.altitude(decodeResult, Number(fl) * 100);\n const next = parts[1].substring(9);\n ResultFormatter.route(decodeResult, { waypoints: [{ name: next.trim() }] });\n\n decodeResult.remaining.text = parts.slice(2).join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_Slash extends DecoderPlugin {\n name = 'label-1l-1-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['+', '-'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const data = new Map<string, string>();\n data.set('LAT', parts[0].replaceAll(' ', ''));\n data.set('LON', parts[1].replaceAll(' ', ''));\n for (let i = 2; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const position = {\n latitude: Number(data.get('LAT')),\n longitude: Number(data.get('LON')),\n };\n data.delete('LAT');\n data.delete('LON');\n\n ResultFormatter.position(decodeResult, position);\n const utc = data.get('UTC');\n if (utc) {\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(utc),\n );\n data.delete('UTC');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fob = data.get('FOB');\n if (fob) {\n ResultFormatter.currentFuel(decodeResult, Number(fob));\n data.delete('FOB');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n remaining += `/${key} ${value}`;\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_20_POS extends DecoderPlugin {\n name = 'label-20-pos';\n\n qualifiers() {\n return {\n labels: ['20'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 11) {\n // N38160W077075,,211733,360,OTT,212041,,N42,19689,40,544\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Variation 1 detected`);\n }\n // Field 1: Coordinates\n const rawCoords = fields[0];\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(rawCoords),\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else if (fields.length == 5) {\n // N38160W077075,,211733,360,OTT\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Variation 2 detected`);\n }\n // Field 1: Coordinates\n const position = CoordinateUtils.decodeStringCoordinates(fields[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_21_POS extends DecoderPlugin {\n name = 'label-21-pos';\n\n qualifiers() {\n return {\n labels: ['21'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 9) {\n // POSN 37.550W 76.436, 98,110800,23961,25820, 65,-23,114212,KRDU\n processPosition(decodeResult, fields[0].trim());\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[7]),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[8]);\n\n ResultFormatter.unknownArr(decodeResult, [\n fields[1],\n fields[4],\n fields[5],\n ]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\nfunction processPosition(decodeResult: DecodeResult, value: string) {\n // N 39.841W 75.790\n if (\n value.length !== 16 &&\n value[0] !== 'N' &&\n value[0] !== 'S' &&\n value[8] !== 'W' &&\n value[8] !== 'E'\n ) {\n return;\n }\n const latDir = value[0] === 'N' ? 1 : -1;\n const lonDir = value[8] === 'E' ? 1 : -1;\n const position = {\n latitude: latDir * Number(value.substring(1, 7)),\n longitude: lonDir * Number(value.substring(9, 15)),\n };\n\n ResultFormatter.position(decodeResult, position);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_OFF extends DecoderPlugin {\n name = 'label-22-off';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['OFF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Takeoff Report';\n decodeResult.message = message;\n\n if (message.text.startsWith('OFF01')) {\n // variant 1\n const fields = message.text.substring(5).split('/');\n\n if (fields.length != 2) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n ResultFormatter.departureDay(\n decodeResult,\n Number(fields[1].substring(0, 2)),\n ); // departure day\n ResultFormatter.arrivalDay(\n decodeResult,\n Number(fields[1].substring(2, 4)),\n ); // arrival day\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(8, 12),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(22));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else if (message.text.startsWith('OFF02\\r\\n')) {\n // varaint 3\n const fields = message.text.substring(7).split(',');\n if (fields.length != 4) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else if (message.text.startsWith('OFF02')) {\n // varaint 2\n const fields = message.text.substring(5).split('/');\n if (fields.length != 2) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n fields[1].substring(0, 14),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(20, 24),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40)),\n );\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation.`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_POS extends DecoderPlugin {\n name = 'label-22-pos';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['N', 'S'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n\n if (fields.length !== 11) {\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${fields.join(',')}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const latStr = fields[0].substring(1, 8);\n const lonStr = fields[0].substring(9);\n const lat = Number(latStr) / 10000;\n const lon = Number(lonStr) / 10000;\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,\n longitude: CoordinateUtils.getDirection(fields[0][8]) * lon,\n });\n\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n\n ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM3 extends DecoderPlugin {\n name = 'label-2p-fm3';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 7) {\n const header = parts[0].split('FM3 ');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n\n if (header[1].length === 4) {\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n } else {\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[1]),\n );\n const lat = parts[2].replaceAll(' ', '');\n const lon = parts[3].replaceAll(' ', '');\n if (lat[0] === 'N' || lat[0] === 'S') {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n } else {\n ResultFormatter.position(decodeResult, {\n latitude: Number(lat),\n longitude: Number(lon),\n });\n }\n ResultFormatter.altitude(decodeResult, Number(parts[4]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[5]);\n ResultFormatter.unknown(decodeResult, parts[6]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM4 extends DecoderPlugin {\n name = 'label-2p-fm4';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 10) {\n const header = parts[0].split('FM4');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n ResultFormatter.heading(decodeResult, Number(parts[7]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM5 extends DecoderPlugin {\n name = 'label-2p-fm5';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 12) {\n const header = parts[0].split('FM5 ');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[7]);\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n ResultFormatter.flightNumber(decodeResult, parts[10].trim());\n ResultFormatter.unknown(decodeResult, parts[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_POS extends DecoderPlugin {\n name = 'label-2p-pos';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, '');\n const parts = msg.split('/');\n let decoded = false;\n if (parts[0].length > 3) {\n decoded = H1Helper.decodeH1Message(\n decodeResult,\n msg.slice(parts[0].length - 3),\n );\n // flight number is already decoded in other fields\n decodeResult.remaining.text =\n parts[0].slice(0, 3) + '/' + decodeResult.remaining.text;\n } else {\n decoded = H1Helper.decodeH1Message(decodeResult, msg);\n }\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_24_Slash extends DecoderPlugin {\n name = 'label-24-slash';\n\n qualifiers() {\n return {\n labels: ['24'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n\n if (fields.length == 10 && fields[0] == '' && fields[9] == '') {\n // begin and ends with `/`\n const mmddyy =\n fields[1].substring(4, 6) +\n fields[1].substring(2, 4) +\n fields[1].substring(0, 2); // YYDDMM\n const hhmmss = fields[2] + '00';\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n hhmmss,\n mmddyy,\n );\n ResultFormatter.flightNumber(decodeResult, fields[3]);\n ResultFormatter.altitude(decodeResult, Number(fields[4]));\n const lat = fields[5];\n const lon = fields[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[8]),\n );\n ResultFormatter.unknown(decodeResult, fields[7]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_30_Slash_EA extends DecoderPlugin {\n name = 'label-30-slash-ea';\n\n qualifiers() {\n return {\n labels: ['30'],\n preambles: ['/EA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /EA1830/DSKSFO/SK24\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 30 EA: results');\n console.log(results);\n }\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)),\n );\n\n if (results[1].substring(0, 2) === 'DS') {\n ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));\n ResultFormatter.unknown(decodeResult, '/'.concat(results[2]));\n } else {\n ResultFormatter.unknown(\n decodeResult,\n '/'.concat(results[1], '/', results[2]),\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// In Air Report\nexport class Label_44_ETA extends DecoderPlugin {\n name = 'label-44-eta';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ETA01', '00ETA02', '00ETA03', 'ETA01', 'ETA02', 'ETA03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 9) {\n if (options.debug) {\n console.log('Label 44 ETA Report: groups');\n console.log(data);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n\n ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[6]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[7]),\n );\n const fuel = Number(data[8]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 9) {\n ResultFormatter.unknownArr(decodeResult, data.slice(9));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// In Air Report\nexport class Label_44_IN extends DecoderPlugin {\n name = 'label-44-in';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00IN01', '00IN02', '00IN03', 'IN01', 'IN02', 'IN03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'In Air Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 7) {\n if (options.debug) {\n console.log('Label 44 In Air Report: groups');\n console.log(data);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.in(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n const fuel = Number(data[6]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 7) {\n ResultFormatter.unknownArr(decodeResult, data.slice(7));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Off Runway Report\nexport class Label_44_OFF extends DecoderPlugin {\n name = 'label-44-off';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00OFF01', '00OFF02', '00OFF03', 'OFF01', 'OFF02', 'OFF03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Off Runway Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 8) {\n if (options.debug) {\n console.log('Label 44 Off Runway Report: groups');\n console.log(data);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[6]),\n );\n const fuel = Number(data[7]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 8) {\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// On Runway Report\nexport class Label_44_ON extends DecoderPlugin {\n name = 'label-44-on';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ON01', '00ON02', '00ON03', 'ON01', 'ON02', 'ON03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'On Runway Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 7) {\n if (options.debug) {\n console.log('Label 44 On Runway Report: groups');\n console.log(data);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.on(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n const fuel = Number(data[6]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 7) {\n ResultFormatter.unknownArr(decodeResult, data.slice(7));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_44_POS extends DecoderPlugin {\n name = 'label-44-pos';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00POS01', '00POS02', '00POS03', 'POS01', 'POS02', 'POS03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: POS02,N38338W121179,GRD,KMHR,KPDX,0807,0003,0112,005.1\n // Match: POS02,coords,flight_level_or_ground,departure_icao,arrival_icao,current_date,current_time,eta_time,unknown\n const regex =\n /^.*,(?<unsplit_coords>.*),(?<flight_level_or_ground>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 44 Position Report: groups');\n console.log(results.groups);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n results.groups.unsplit_coords,\n ),\n );\n const flight_level =\n results.groups.flight_level_or_ground == 'GRD' ||\n results.groups.flight_level_or_ground == '***'\n ? 0\n : Number(results.groups.flight_level_or_ground);\n\n ResultFormatter.month(\n decodeResult,\n Number(results.groups.current_date.substring(0, 2)),\n );\n ResultFormatter.day(\n decodeResult,\n Number(results.groups.current_date.substring(2, 4)),\n );\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + '00'),\n );\n\n // TODO: ETA month and Day\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + '00'),\n );\n\n if (\n results.groups.fuel_in_tons != '***' &&\n results.groups.fuel_in_tons != '****'\n ) {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n ResultFormatter.departureAirport(\n decodeResult,\n results.groups.departure_icao,\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n ResultFormatter.altitude(decodeResult, flight_level * 100);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { FlightPlanUtils } from '../utils/flight_plan_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Flight Briefing Report\nexport class Label_44_Slash extends DecoderPlugin {\n name = 'label-44-slash';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: [' /FB'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Briefing';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n if (fields.length !== 4) {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n ResultFormatter.unknownArr(decodeResult, fields.slice(0, 2), '/'); // 0 is a space\n // 1 is the briefing id\n // 2 is arrival airport, but repeated later\n const data = fields[3].split(',');\n if (data.length >= 6) {\n if (options.debug) {\n console.log('Label 44 Slash: groups');\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n (data[0].charAt(0) === 'S' ? -1 : 1) *\n parseFloat(data[0].slice(1).trim()),\n longitude:\n (data[1].charAt(0) === 'W' ? -1 : 1) *\n parseFloat(data[1].slice(1).trim()),\n });\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.unknown(decodeResult, data[3]); // Status - need more info to decode\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n if (data.length === 18) {\n ResultFormatter.unknownArr(decodeResult, data.slice(6, 8), ','); // 6 is repeated arrival airport\n ResultFormatter.remainingFuel(decodeResult, parseFloat(data[8]));\n ResultFormatter.unknownArr(decodeResult, data.slice(9, 11), ',');\n ResultFormatter.arrivalRunway(decodeResult, data[11]);\n FlightPlanUtils.addProcedure(decodeResult, data[12], 'arrival');\n ResultFormatter.unknownArr(decodeResult, data.slice(13, 18), ',');\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Waypoint } from '../types/waypoint';\n\nexport class Label_4A extends DecoderPlugin {\n name = 'label-4a';\n\n qualifiers() {\n return {\n labels: ['4A'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n const fields = message.text.split(',');\n if (fields.length === 11) {\n // variant 1\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.tail(decodeResult, fields[2].replace('.', ''));\n if (fields[3]) ResultFormatter.callsign(decodeResult, fields[3]);\n ResultFormatter.departureAirport(decodeResult, fields[4]);\n ResultFormatter.arrivalAirport(decodeResult, fields[5]);\n // ResultFormatter.altitude(decodeResult, Number(alt) * 100);\n ResultFormatter.unknownArr(decodeResult, fields.slice(8));\n } else if (fields.length === 6) {\n if (fields[0].match(/^[NS]/)) {\n // variant 2\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)),\n );\n let wp1: Waypoint = {\n name: fields[0].substring(13).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),\n timeFormat: 'tod',\n };\n ResultFormatter.altitude(\n decodeResult,\n Number(fields[1].substring(6, 9)) * 100,\n );\n let wp2: Waypoint = {\n name: fields[1].substring(9).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[2]),\n timeFormat: 'tod',\n };\n ResultFormatter.route(decodeResult, { waypoints: [wp1, wp2] });\n ResultFormatter.temperature(decodeResult, fields[3]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(4));\n } else {\n // variant 3\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1]),\n );\n ResultFormatter.unknown(decodeResult, fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(\n (fields[4] + fields[5]).replace(/[ \\.]/g, ''),\n ),\n );\n }\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_01 extends DecoderPlugin {\n name = 'label-4a-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n let rgx = message.text.match(\n /^01([A-Z]{2})([A-Z]{2})\\s*(\\w+)\\/(\\d{6})([A-Z]{4})([A-Z]{4})\\r\\n([+-]\\s*\\d+)(\\d{3}\\.\\d)([+-]\\s*\\d+\\.\\d)/,\n );\n if (rgx) {\n ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);\n ResultFormatter.callsign(decodeResult, rgx[3]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(rgx[4] + '00'),\n );\n ResultFormatter.departureAirport(decodeResult, rgx[5]);\n ResultFormatter.arrivalAirport(decodeResult, rgx[6]);\n ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, '')));\n ResultFormatter.unknown(decodeResult, rgx[8]);\n ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, ''));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DIS extends DecoderPlugin {\n name = 'label-4a-dis';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DIS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n const fields = message.text.split(',');\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + '00'),\n );\n ResultFormatter.callsign(decodeResult, fields[2]);\n ResultFormatter.freetext(decodeResult, fields.slice(3).join(''));\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DOOR extends DecoderPlugin {\n name = 'label-4a-door';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DOOR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n const fields = message.text.split(' ');\n if (fields.length === 3) {\n ResultFormatter.door_event(\n decodeResult,\n fields[0].split('/')[1],\n fields[1],\n );\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2] + '00'),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_Slash_01 extends DecoderPlugin {\n name = 'label-4a-slash-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['/01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n if (message.text.length === 5 && message.text.substring(0, 4) === '/01-') {\n ResultFormatter.unknown(decodeResult, message.text.substring(4));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4J_POS extends DecoderPlugin {\n name = 'label-4j-pos';\n qualifiers() {\n return {\n labels: ['4J'],\n preambles: ['POS/'],\n };\n }\n\n // copied from Label_H1.ts since i don't really want to have to have\n // something named like that decode more than 1 type\n // if we figure out a good name, i'll combine them\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, '');\n const decoded = H1Helper.decodeH1Message(decodeResult, msg);\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4N extends DecoderPlugin {\n name = 'label-4n';\n\n qualifiers() {\n return {\n labels: ['4N'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n const fields = text.split(',');\n if (text.length === 51) {\n // variant 1\n decodeResult.raw.day = text.substring(0, 2);\n ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));\n ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(30, 45).replace(/^(.)0/, '$1'),\n ),\n );\n ResultFormatter.altitude(\n decodeResult,\n Number(text.substring(48, 51)) * 100,\n );\n ResultFormatter.unknownArr(\n decodeResult,\n [text.substring(2, 4), text.substring(19, 29)],\n ' ',\n );\n } else if (fields.length === 33) {\n // variant 2\n decodeResult.raw.date = fields[3];\n if (fields[1] === 'B') {\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[4]),\n longitude: Number(fields[5]),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[6]));\n }\n ResultFormatter.departureAirport(decodeResult, fields[8]);\n ResultFormatter.arrivalAirport(decodeResult, fields[9]);\n ResultFormatter.alternateAirport(decodeResult, fields[10]);\n ResultFormatter.arrivalRunway(decodeResult, fields[11].split('/')[0]);\n if (fields[12].length > 1) {\n ResultFormatter.alternateRunway(decodeResult, fields[12].split('/')[0]);\n }\n ResultFormatter.checksum(decodeResult, fields[32]);\n ResultFormatter.unknownArr(\n decodeResult,\n [...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(\n (f) => f != '',\n ),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_AGFSR extends DecoderPlugin {\n name = 'label-4t-agfsr';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['AGFSR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(5).split('/');\n\n if (!message.text.startsWith('AGFSR') || data.length !== 20) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n ResultFormatter.arrivalDay(decodeResult, Number(data[2]));\n ResultFormatter.departureAirport(\n decodeResult,\n data[3].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), 'IATA');\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)),\n ); // HHMMZ\n ResultFormatter.unknown(decodeResult, data[5], '/');\n const lat = data[6].substring(0, 7);\n const lon = data[6].substring(7, 15);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) +\n Number(lat.substring(2, 6)) / 60,\n longitude:\n CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) +\n Number(lon.substring(3, 7)) / 60,\n });\n ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));\n // 8 - phase of flight?\n // 11 - temperature?\n ResultFormatter.unknownArr(decodeResult, data.slice(8), '/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_58 extends DecoderPlugin {\n name = 'label-58';\n\n qualifiers() {\n return {\n labels: ['58'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.split('/');\n if (data.length === 8) {\n ResultFormatter.flightNumber(decodeResult, data[0]);\n ResultFormatter.day(decodeResult, Number(data[1]));\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n const lat = data[3];\n const lon = data[4];\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n ResultFormatter.altitude(decodeResult, Number(data[5]));\n ResultFormatter.unknown(decodeResult, data[6], '/');\n ResultFormatter.unknown(decodeResult, data[7], '/');\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 58 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_ETA extends DecoderPlugin {\n name = 'label-4t-eta';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['ETA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split('/');\n\n if (!message.text.startsWith('ETA') || data.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n const etaData = data[2].split(' ');\n ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));\n ResultFormatter.arrivalAirport(decodeResult, etaData[1], 'IATA');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)),\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Airline Defined\n// 3N01 POSRPT\nexport class Label_80 extends DecoderPlugin {\n name = 'label-80';\n\n qualifiers() {\n return {\n labels: ['80'],\n preambles: [],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Defined Position Report';\n\n const lines = message.text.split(/\\r?\\n/);\n if (lines.length === 1 && lines[0].includes(',')) {\n this.parseCsvFormat(lines[0], decodeResult);\n } else {\n const header = lines[0].trim();\n const headerParts = header.split(',');\n for (let i = 0; i < headerParts.length - 1; i++) {\n const moreFields = headerParts[i].split('/');\n for (const more of moreFields) {\n this.parseTags(more.trim(), decodeResult);\n }\n }\n\n this.parseHeader(\n headerParts[headerParts.length - 1].trim(),\n decodeResult,\n );\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n const parts = line.split('/');\n for (const part of parts) {\n this.parseTags(part.trim(), decodeResult);\n }\n }\n }\n\n if (decodeResult.formatted.items.length > 0) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel =\n decodeResult.remaining.text === undefined ? 'full' : 'partial';\n }\n\n return decodeResult;\n }\n\n private parseHeader(header: string, results: DecodeResult) {\n //3N01 POSRPT 0581/27 KIAD/MSLP .N962AV/04H 11:02\n const fields = header.split('/');\n if (fields.length < 3) {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n const msgInfo = fields[0].split(/\\s+/);\n if (msgInfo.length === 3) {\n ResultFormatter.unknownArr(results, msgInfo.slice(0, 2), ' ');\n ResultFormatter.flightNumber(results, msgInfo[2]);\n } else {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n\n const otherInfo1 = fields[1].split(/\\s+/);\n if (otherInfo1.length === 2) {\n ResultFormatter.day(results, parseInt(otherInfo1[0], 10));\n ResultFormatter.departureAirport(results, otherInfo1[1]);\n } else {\n ResultFormatter.unknownArr(results, otherInfo1, ' ');\n }\n\n const otherInfo2 = fields[2].split(/\\s+/);\n if (otherInfo2.length === 2) {\n ResultFormatter.arrivalAirport(results, otherInfo2[0]);\n ResultFormatter.tail(results, otherInfo2[1].replace('.', ''));\n } else {\n ResultFormatter.unknownArr(results, otherInfo2, ' ');\n }\n\n if (fields.length > 3) {\n ResultFormatter.unknownArr(results, fields.slice(3), '/');\n }\n }\n\n private parseTags(part: string, results: DecodeResult) {\n const kvPair = part.split(/\\s+/);\n if (kvPair.length < 2) {\n ResultFormatter.unknown(results, part, '/');\n return;\n }\n const tag = kvPair[0];\n const val = kvPair.slice(1).join(' ');\n\n switch (tag) {\n case 'POS':\n // don't use decodeStringCoordinates because of different position format\n const posRegex = /^(?<latd>[NS])(?<lat>.+)(?<lngd>[EW])(?<lng>.+)/;\n const posResult = val.match(posRegex);\n const lat =\n Number(posResult?.groups?.lat) *\n (posResult?.groups?.latd === 'S' ? -1 : 1);\n const lon =\n Number(posResult?.groups?.lng) *\n (posResult?.groups?.lngd === 'W' ? -1 : 1);\n const position = {\n latitude: Number.isInteger(lat) ? lat / 1000 : lat / 100,\n longitude: Number.isInteger(lon) ? lon / 1000 : lon / 100,\n };\n ResultFormatter.position(results, position);\n break;\n case 'ALT':\n ResultFormatter.altitude(results, parseInt(val.replace('+', ''), 10));\n break;\n case 'FL': // Handle \"FL 360\"\n ResultFormatter.altitude(results, parseInt(val, 10) * 100);\n break;\n case 'MCH':\n ResultFormatter.mach(results, parseInt(val, 10) / 1000);\n break;\n case 'SPD':\n ResultFormatter.groundspeed(results, parseInt(val, 10));\n break;\n case 'TAS':\n ResultFormatter.airspeed(results, parseInt(val, 10));\n break;\n case 'SAT':\n ResultFormatter.temperature(results, val);\n break;\n case 'FB':\n // ignoring, assuming FOB and avoiding duplicates.\n break;\n case 'FOB':\n // Strip non-numeric like 'N' in 'N009414'\n ResultFormatter.currentFuel(\n results,\n parseInt(val.replace(/\\D/g, ''), 10),\n );\n break;\n case 'UTC':\n ResultFormatter.time_of_day(\n results,\n DateTimeUtils.convertHHMMSSToTod(val),\n );\n break;\n case 'ETA':\n const hhmm = val.split('.')[0].replace(':', '');\n ResultFormatter.eta(results, DateTimeUtils.convertHHMMSSToTod(hhmm));\n break;\n case 'HDG':\n ResultFormatter.heading(results, parseInt(val, 10));\n break;\n case 'NWYP':\n results.raw.next_waypoint = val;\n break;\n case 'SWN':\n // wind speed, do nothing for\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'DWN':\n // wind direction, do nothing for now\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'AD':\n // do nothing, as it shows in the header\n break;\n default:\n ResultFormatter.unknown(results, part, '/');\n }\n }\n private parseCsvFormat(text: string, results: DecodeResult) {\n const csvParts = text.split(',');\n const header = csvParts[0].trim().split(/\\s+/);\n ResultFormatter.unknown(results, header[0], ' ');\n ResultFormatter.unknown(results, header[1], ' ');\n ResultFormatter.position(\n results,\n CoordinateUtils.decodeStringCoordinates(header[2]),\n );\n ResultFormatter.unknown(results, csvParts[1]);\n ResultFormatter.time_of_day(\n results,\n DateTimeUtils.convertHHMMSSToTod(csvParts[2]),\n );\n ResultFormatter.unknownArr(results, csvParts.slice(4, 6), ',');\n ResultFormatter.temperature(\n results,\n (\n (csvParts[6].charAt(0) === 'M' ? -1 : 1) *\n parseInt(csvParts[6].slice(1), 10)\n ).toString(),\n );\n ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));\n ResultFormatter.currentFuel(results, parseInt(csvParts[8], 10));\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_83 extends DecoderPlugin {\n name = 'label-83';\n\n qualifiers() {\n return {\n labels: ['83'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n if (text.substring(0, 10) === '4DH3 ETAT2') {\n // variant 2\n const fields = text.split(/\\s+/);\n if (fields[2].length > 5) {\n decodeResult.raw.day = fields[2].substring(5);\n }\n ResultFormatter.unknown(decodeResult, fields[2].substring(0, 4));\n const subfields = fields[3].split('/');\n ResultFormatter.departureAirport(decodeResult, subfields[0]);\n ResultFormatter.arrivalAirport(decodeResult, subfields[1]);\n ResultFormatter.tail(decodeResult, fields[4].replace(/\\./g, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[6] + '00'),\n );\n } else if (text.substring(0, 5) === '001PR') {\n // variant 3\n decodeResult.raw.day = text.substring(5, 7);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(13, 28).replace(/\\./g, ''),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.altitude(decodeResult, Number(text.substring(28, 33)));\n ResultFormatter.unknown(decodeResult, text.substring(33));\n } else {\n const fields = text.replace(/\\s/g, '').split(',');\n if (fields.length === 9) {\n // variant 1\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n decodeResult.raw.day = fields[2].substring(0, 2);\n decodeResult.raw.time = fields[2].substring(2);\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[3].replace(/\\s/g, '')),\n longitude: Number(fields[4].replace(/\\s/g, '')),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[5]));\n ResultFormatter.groundspeed(decodeResult, Number(fields[6]));\n ResultFormatter.heading(decodeResult, Number(fields[7]));\n ResultFormatter.unknown(decodeResult, fields[8]);\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA\nexport class Label_8E extends DecoderPlugin {\n name = 'label-8e';\n\n qualifiers() {\n return {\n labels: ['8E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: EGSS,1618\n // Match: arrival_icao,arrival_eta\n const regex = /^(?<arrival_icao>\\w{4}),(?<arrival_eta>\\d{4})$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 8E ETA: groups');\n console.log(results.groups);\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta),\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\n// CPDLC\nexport class Label_B6_Forwardslash extends DecoderPlugin {\n name = 'label-b6-forwardslash';\n\n qualifiers() {\n return {\n labels: ['B6'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'CPDLC Message';\n decodeResult.message = message;\n\n if (options.debug) {\n console.log('CPDLC: ' + message);\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_ColonComma extends DecoderPlugin {\n name = 'label-colon-comma';\n\n qualifiers() {\n return {\n labels: [':;'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.frequency = Number(message.text) / 1000;\n\n decodeResult.formatted.description =\n 'Aircraft Transceiver Frequency Change';\n decodeResult.formatted.items.push({\n type: 'frequency',\n label: 'Frequency',\n value: `${decodeResult.raw.frequency} MHz`,\n code: 'FREQ',\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1 extends DecoderPlugin {\n name = 'label-h1';\n qualifiers() {\n return {\n labels: ['H1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, '');\n const parts = msg.split('#');\n let decoded = false;\n if (msg.startsWith('/')) {\n const headerData = msg.split('.');\n const decoded = H1Helper.decodeH1Message(\n decodeResult,\n headerData.slice(1).join('.'),\n ); // skip up to # and then a little more\n if (decoded) {\n decodeResult.remaining.text =\n headerData[0] + '.' + decodeResult.remaining.text;\n decodeResult.decoded = decoded;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n\n return decodeResult;\n } else if (parts.length === 1) {\n decoded = H1Helper.decodeH1Message(decodeResult, msg);\n } else if (parts.length == 2) {\n const offset = isNaN(parseInt(parts[1][1])) ? 3 : 4;\n decoded = H1Helper.decodeH1Message(\n decodeResult,\n msg.slice(parts[0].length + offset),\n ); // skip up to # and then a little more\n if (decoded && parts[0].length > 0) {\n // ResultFormatter.unknown(decodeResult, parts[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, parts[0].substring(4));\n //ResultFormatter.unknown(decodeResult, parts[1].length == 5 ? parts[1].substring(0, 2) : parts[1].substring(0, 3), '#');\n // hack of the highest degree as we've parsed the rest of the message already but we want the remaining text to be in order\n decodeResult.remaining.text =\n parts[0].substring(0, 4) +\n '#' +\n parts[1].substring(0, offset - 1) +\n '/' +\n decodeResult.remaining.text;\n }\n }\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H2_02E extends DecoderPlugin {\n name = 'label-h2-02e';\n\n qualifiers() {\n return {\n labels: ['H2'],\n preambles: ['02E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Weather Report';\n decodeResult.message = message;\n\n const parts = message.text.split(' ');\n\n if (parts[parts.length - 1] !== 'Q') {\n // not a valid message\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const windData: Wind[] = [];\n decodeResult.remaining.text = '';\n\n const header = parts[0];\n if (header.length === 45) {\n // header.substring(0,3) is '02E'\n ResultFormatter.day(decodeResult, parseInt(header.substring(3, 5), 10));\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n const firstWind = this.parseWeatherReport(header.substring(13));\n if (firstWind) {\n windData.push(firstWind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + header.substring(13);\n }\n }\n\n for (let i = 1; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part[0] !== 'Q') {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n continue;\n }\n const wind = this.parseWeatherReport(part.substring(1));\n if (wind) {\n windData.push(wind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n }\n }\n\n ResultFormatter.windData(decodeResult, windData);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel =\n decodeResult.remaining.text.length === 0 ? 'full' : 'partial';\n return decodeResult;\n }\n\n private parseWeatherReport(text: string): Wind | null {\n const posString = text.substring(0, 13);\n const pos =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(posString);\n if (text.length !== 32 || !pos) {\n return null;\n }\n const tod = DateTimeUtils.convertHHMMSSToTod(text.substring(13, 17));\n const flightLevel = parseInt(text.substring(17, 20), 10);\n // const altitude = parseInt(text.substring(17,21), 10) * 10; // use FL instead\n const tempSign = text[21] === 'M' ? -1 : 1;\n const tempDegreesRaw = parseInt(text.substring(22, 25), 10);\n const tempDegrees = tempSign * (tempDegreesRaw / 10);\n const windDirection = parseInt(text.substring(25, 28), 10);\n const windSpeed = parseInt(text.substring(28, 31), 10);\n // G?\n if (text[31] !== 'G') {\n return null;\n }\n return {\n waypoint: {\n name: posString,\n latitude: pos.latitude,\n longitude: pos.longitude,\n time: tod,\n timeFormat: 'tod',\n },\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: flightLevel,\n degreesC: tempDegrees,\n },\n };\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_FLR extends DecoderPlugin {\n name = 'label-h1-flr';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['FLR', '#CFBFLR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Fault Log Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/FR');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n for (let i = 1; i < fields.length; i++) {\n const field = fields[i];\n ResultFormatter.unknown(decodeResult, field, '/');\n }\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.fault_message = msg;\n decodeResult.formatted.items.push({\n type: 'fault',\n code: 'FR',\n label: 'Fault Report',\n value: decodeResult.raw.fault_message,\n });\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nimport * as zlib from 'minizlib';\nimport { Buffer } from 'node:buffer';\n\nexport class Label_H1_OHMA extends DecoderPlugin {\n name = 'label-h1-ohma';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['OHMA', '/RTNBOCR.OHMA', '#T1B/RTNBOCR.OHMA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OHMA Message';\n decodeResult.message = message;\n\n const data = message.text.split('OHMA')[1]; // throw out '/RTNOCR.' - even though it means something\n try {\n const compressedBuffer = Buffer.from(data, 'base64');\n const decompress = new zlib.Inflate({});\n decompress.write(compressedBuffer);\n decompress.flush(zlib.constants.Z_SYNC_FLUSH);\n const result = decompress.read();\n const jsonText = result?.toString() || '';\n\n let formattedMsg;\n let jsonMessage;\n try {\n jsonMessage = JSON.parse(jsonText).message;\n } catch {\n jsonMessage = jsonText;\n }\n\n try {\n const ohmaMsg = JSON.parse(jsonMessage);\n formattedMsg = JSON.stringify(ohmaMsg, null, 2);\n } catch {\n formattedMsg = jsonMessage;\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n decodeResult.raw.ohma = jsonText;\n decodeResult.formatted.items.push({\n type: 'ohma',\n code: 'OHMA',\n label: 'OHMA Downlink',\n value: formattedMsg,\n });\n } catch (e) {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 OHMA message: ${message.text}`, e);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_StarPOS extends DecoderPlugin {\n name = 'label-h1-star-pos';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['*POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const msg = message.text;\n // assuming fixed length until other variants found\n if (msg.length !== 43 || !msg.startsWith('*POS')) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${msg}`);\n }\n ResultFormatter.unknown(decodeResult, msg);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));\n ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)),\n );\n ResultFormatter.position(decodeResult, {\n // Deg Min, no sec\n latitude:\n CoordinateUtils.getDirection(msg.substring(12, 13)) *\n (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),\n longitude:\n CoordinateUtils.getDirection(msg.substring(17, 18)) *\n (Number(msg.substring(18, 21)) + Number(msg.substring(21, 23)) / 60),\n });\n ResultFormatter.altitude(decodeResult, Number(msg.substring(23, 28)));\n ResultFormatter.unknown(decodeResult, msg.substring(28));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_WRN extends DecoderPlugin {\n name = 'label-h1-wrn';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['WRN', '#CFBWRN'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Warning Message';\n decodeResult.message = message;\n\n const parts = message.text.split('/WN');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n ResultFormatter.unknownArr(decodeResult, fields.slice(1), '/');\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.warning_message = msg;\n decodeResult.formatted.items.push({\n type: 'warning',\n code: 'WRN',\n label: 'Warning Message',\n value: decodeResult.raw.warning_message,\n });\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_HX extends DecoderPlugin {\n name = 'label-hx';\n\n qualifiers() {\n return {\n labels: ['HX'],\n preambles: ['RA FMT LOCATION', 'RA FMT 43'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Undelivered Uplink Report';\n\n const parts = message.text.split(' ');\n\n decodeResult.decoded = true;\n if (parts[2] === 'LOCATION') {\n let latdir = parts[3].substring(0, 1);\n let latdeg = Number(parts[3].substring(1, 3));\n let latmin = Number(parts[3].substring(3, 7));\n let londir = parts[4].substring(0, 1);\n let londeg = Number(parts[4].substring(1, 4));\n let lonmin = Number(parts[4].substring(4, 8));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknownArr(decodeResult, parts.slice(5), ' ');\n ResultFormatter.position(decodeResult, pos);\n } else if (parts[2] === '43') {\n ResultFormatter.departureAirport(decodeResult, parts[3]);\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), ' ');\n } else {\n decodeResult.decoded = false;\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import * as Base85 from 'base85';\nimport * as zlib from 'minizlib';\nimport { Buffer } from 'node:buffer';\n\nenum MIAMVersion {\n V1 = 1,\n V2 = 2,\n}\n\nenum MIAMFid {\n SingleTransfer = 'T',\n FileTransferRequest = 'F',\n FileTransferAccept = 'K',\n FileSegment = 'S',\n FileTransferAbort = 'A',\n XOFFIndication = 'Y',\n XONIndication = 'X',\n}\n\nenum MIAMCorePdu {\n Data = 0,\n Ack = 1,\n Aloha = 2,\n AlohaReply = 3,\n}\n\nenum MIAMCoreApp {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nexport enum MIAMCoreV1Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nexport enum MIAMCoreV2Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nconst MIAMCoreV1CRCLength = 4;\nconst MIAMCoreV2CRCLength = 2;\n\ninterface PduACARSData {\n tail?: string;\n label: string;\n sublabel?: string;\n mfi?: string;\n text?: string;\n}\n\ninterface PduNonACARSData {\n appId?: string;\n text?: string;\n}\n\ninterface Pdu {\n version: MIAMVersion;\n crc: number;\n crcOk: boolean;\n complete: boolean;\n compression: number;\n encoding: number;\n msgNum: number;\n ackOptions: number;\n acars?: PduACARSData;\n non_acars?: PduNonACARSData;\n}\nconst isMIAMVersion = (x: number): x is MIAMVersion =>\n Object.values(MIAMVersion).includes(x as MIAMVersion);\nconst isMIAMFid = (x: string): x is MIAMFid =>\n Object.values(MIAMFid).includes(x as MIAMFid);\nconst isMIAMCoreApp = (x: number): x is MIAMCoreApp =>\n Object.values(MIAMCoreApp).includes(x as MIAMCoreApp);\nconst isMIAMCorePdu = (x: number): x is MIAMCorePdu =>\n Object.values(MIAMCorePdu).includes(x as MIAMCorePdu);\n\ninterface PduDecodingSuccess {\n decoded: true;\n message: {\n data: Pdu;\n };\n}\n\ninterface PduDecodingFailure {\n decoded: false;\n error: string;\n}\n\ntype PduDecodingResult = PduDecodingSuccess | PduDecodingFailure;\n\nexport class MIAMCoreUtils {\n static AppTypeToAppIdLenTable: Record<\n MIAMVersion,\n Record<MIAMCoreApp, number>\n > = {\n [MIAMVersion.V1]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n [MIAMVersion.V2]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n };\n\n static FidHandlerTable: Record<MIAMFid, (txt: string) => PduDecodingResult> =\n {\n [MIAMFid.SingleTransfer]: (txt: string) => {\n if (txt.length < 3) {\n return {\n decoded: false,\n error: 'Raw MIAM message too short (' + txt.length + ' < 3) ',\n };\n }\n\n let bpad = txt[0];\n\n if ('0123-.'.indexOf(bpad) === -1) {\n return {\n decoded: false,\n error: \"Invalid body padding value: '\" + bpad + \"'\",\n };\n }\n\n if ('0123'.indexOf(txt[1]) === -1) {\n return {\n decoded: false,\n error: \"Invalid header padding value: '\" + txt[1] + \"'\",\n };\n }\n\n const hpad = parseInt(txt[1]);\n\n const delimIdx = txt.indexOf('|');\n if (delimIdx === -1) {\n return {\n decoded: false,\n error: 'Raw MIAM message missing header-body delimiter',\n };\n }\n\n const rawHdr = txt.substring(2, delimIdx);\n if (rawHdr.length === 0) {\n return {\n decoded: false,\n error: 'Empty MIAM message header',\n };\n }\n\n let hdr = Base85.decode('<~' + rawHdr + '~>', 'ascii85');\n if (!hdr || hdr.length < hpad) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message header',\n };\n }\n\n let body: Buffer | undefined = undefined;\n\n const rawBody = txt.substring(delimIdx + 1);\n if (rawBody.length > 0) {\n if ('0123'.indexOf(bpad) >= 0) {\n const bpadValue = parseInt(bpad);\n\n body = Base85.decode('<~' + rawBody + '~>', 'ascii85') || undefined;\n if (body && body.length >= bpadValue) {\n body = body.subarray(0, body.length - bpadValue);\n }\n } else if (bpad === '-') {\n body = Buffer.from(rawBody);\n }\n }\n\n hdr = hdr.subarray(0, hdr.length - hpad);\n\n const version = hdr.readUInt8(0) & 0xf;\n const pduType = (hdr.readUInt8(0) >> 4) & 0xf;\n\n if (isMIAMVersion(version) && isMIAMCorePdu(pduType)) {\n const versionPduHandler =\n this.VersionPduHandlerTable[version][pduType];\n return versionPduHandler(hdr, body);\n } else {\n return {\n decoded: false,\n error:\n 'Invalid version and PDU type combination: v=' +\n version +\n ', pdu=' +\n pduType,\n };\n }\n },\n [MIAMFid.FileTransferRequest]: () => {\n return {\n decoded: false,\n error: 'File Transfer Request not implemented',\n };\n },\n [MIAMFid.FileTransferAccept]: () => {\n return {\n decoded: false,\n error: 'File Transfer Accept not implemented',\n };\n },\n [MIAMFid.FileSegment]: () => {\n return { decoded: false, error: 'File Segment not implemented' };\n },\n [MIAMFid.FileTransferAbort]: () => {\n return { decoded: false, error: 'File Transfer Abort not implemented' };\n },\n [MIAMFid.XOFFIndication]: () => {\n return { decoded: false, error: 'XOFF Indication not implemented' };\n },\n [MIAMFid.XONIndication]: () => {\n return { decoded: false, error: 'XON Indication not implemented' };\n },\n };\n\n private static arincCrc16(buf: Buffer, seed?: number) {\n const crctable = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,\n 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,\n 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,\n 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,\n 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,\n 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,\n 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,\n 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,\n 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,\n 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,\n 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,\n 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,\n 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,\n 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,\n 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\n ];\n\n let crc = (seed || 0) & 0xffff;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^\n crctable[(((crc >>> 8) ^ buf.readUInt8(i)) >>> 0) & 0xff]) >>>\n 0;\n }\n\n return crc & 0xffff;\n }\n\n private static arinc665Crc32(buf: Buffer, seed?: number) {\n const crctable = [\n 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,\n 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,\n 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,\n 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,\n 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,\n 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,\n 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,\n 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,\n 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,\n 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,\n 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,\n 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,\n 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,\n 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,\n 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,\n 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,\n 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,\n 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,\n 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,\n 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,\n 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,\n 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,\n 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,\n 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,\n 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,\n 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,\n 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,\n 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,\n 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,\n 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,\n 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,\n 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,\n 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,\n 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,\n 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,\n 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,\n 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,\n 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,\n 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,\n 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,\n 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,\n 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,\n 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4,\n ];\n\n let crc = seed || 0;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^\n crctable[((crc >>> 24) ^ buf.readUInt8(i)) >>> 0]) >>>\n 0;\n }\n\n return crc;\n }\n\n public static parse(txt: string): PduDecodingResult {\n const fidType = txt[0];\n\n if (isMIAMFid(fidType)) {\n const handler = this.FidHandlerTable[fidType];\n return handler(txt.substring(1));\n } else {\n return {\n decoded: false,\n error: 'Unsupported FID type: ' + fidType,\n };\n }\n }\n\n private static corePduDataHandler(\n version: MIAMVersion,\n minHdrSize: number,\n crcLen: number,\n hdr: Buffer,\n body?: Buffer,\n ): PduDecodingResult {\n if (hdr.length < minHdrSize) {\n return {\n decoded: false,\n error:\n 'v' +\n version +\n ' header size too short; expected >= ' +\n minHdrSize +\n ', got ' +\n hdr.length,\n };\n }\n\n let pduSize: number | undefined = undefined;\n let pduCompression: number = 0;\n let pduEncoding: number = 0;\n let pduAppType: number = 0;\n let pduAppId: string = '';\n let pduCrc: number = 0;\n let pduData: Buffer | null = null;\n let pduCrcIsOk: boolean = false;\n let pduIsComplete: boolean = true;\n\n let pduErrors: string[] = [];\n\n let tail: string | undefined = undefined;\n let msgNum: number = 0;\n let ackOptions: number = 0;\n\n if (version === MIAMVersion.V1) {\n pduSize =\n (hdr.readUInt8(1) << 16) | (hdr.readUInt8(2) << 8) | hdr.readUInt8(3);\n\n const msgSize = hdr.length + (body === undefined ? 0 : body.length);\n if (pduSize > msgSize) {\n pduIsComplete = false;\n pduErrors.push(\n 'v1 PDU truncated: expecting ' + pduSize + ', got ' + msgSize,\n );\n }\n hdr = hdr.subarray(4);\n\n tail = hdr.subarray(0, 7).toString('ascii');\n hdr = hdr.subarray(7);\n } else if (version === MIAMVersion.V2) {\n hdr = hdr.subarray(1);\n }\n\n msgNum = (hdr.readUInt8(0) >> 1) & 0x7f;\n ackOptions = hdr.readUInt8(0) & 1;\n hdr = hdr.subarray(1);\n\n pduCompression =\n ((hdr.readUInt8(0) << 2) | ((hdr.readUInt8(1) >> 6) & 0x3)) & 0x7;\n pduEncoding = (hdr.readUInt8(1) >> 4) & 0x3;\n pduAppType = hdr.readUInt8(1) & 0xf;\n hdr = hdr.subarray(2);\n\n let appIdLen;\n if (isMIAMCoreApp(pduAppType)) {\n appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];\n } else {\n if (\n version === MIAMVersion.V2 &&\n (pduAppType & 0x8) !== 0 &&\n pduAppType !== 0xd\n ) {\n appIdLen = (pduAppType & 0x7) + 1;\n } else {\n return {\n decoded: false,\n error: 'Invalid v' + version + ' appType: ' + pduAppType,\n };\n }\n }\n\n const pduIsACARS =\n [\n MIAMCoreApp.ACARS2Char,\n MIAMCoreApp.ACARS4Char,\n MIAMCoreApp.ACARS6Char,\n ].indexOf(pduAppType) >= 0;\n\n if (hdr.length < appIdLen + crcLen) {\n return {\n decoded: false,\n error: 'Header too short for v' + version + ' appType: ' + pduAppType,\n };\n }\n\n pduAppId = hdr.subarray(0, appIdLen).toString('ascii');\n hdr = hdr.subarray(appIdLen);\n\n if (crcLen === 4) {\n pduCrc =\n (hdr.readUInt8(0) << 24) |\n (hdr.readUInt8(1) << 16) |\n (hdr.readUInt8(2) << 8) |\n hdr.readUInt8(3); // crc\n } else if (crcLen === 2) {\n pduCrc = (hdr.readUInt8(0) << 8) | hdr.readUInt8(1); // crc\n }\n hdr = hdr.subarray(crcLen);\n\n if (body !== undefined && body.length > 0) {\n if (\n [MIAMCoreV1Compression.Deflate, MIAMCoreV2Compression.Deflate].indexOf(\n pduCompression,\n ) >= 0\n ) {\n try {\n const decompress = new zlib.InflateRaw({});\n decompress.write(body);\n decompress.flush(zlib.constants.Z_SYNC_FLUSH);\n pduData = decompress.read();\n } catch (e) {\n pduErrors.push('Inflation failed for body: ' + e);\n }\n } else if (\n [MIAMCoreV1Compression.None, MIAMCoreV2Compression.None].indexOf(\n pduCompression,\n ) >= 0\n ) {\n pduData = body;\n } else {\n pduErrors.push(\n 'Unsupported v' + version + ' compression type: ' + pduCompression,\n );\n }\n\n if (pduData !== null) {\n const crcAlgoHandlerByVersion: Record<\n MIAMVersion,\n (buf: Buffer, seed?: number) => number\n > = {\n [MIAMVersion.V1]: (buf: Buffer, seed?: number) => {\n return ~this.arinc665Crc32(buf, seed);\n },\n [MIAMVersion.V2]: this.arincCrc16,\n };\n\n const crcAlgoHandler = crcAlgoHandlerByVersion[version];\n if (crcAlgoHandler === undefined) {\n return {\n decoded: false,\n error: 'No CRC handler for v' + version,\n };\n }\n\n const crcCheck = crcAlgoHandler(pduData, 0xffffffff);\n if (crcCheck === pduCrc) {\n pduCrcIsOk = true;\n } else {\n pduErrors.push(\n 'Body failed CRC check: provided=' +\n pduCrc +\n ', generated=' +\n crcCheck,\n );\n }\n }\n } else {\n // No PDU body means we can't verify CRC checksum; however, the message should still be valid...\n pduCrcIsOk = true;\n }\n\n let pdu: Pdu = {\n version,\n crc: pduCrc,\n crcOk: pduCrcIsOk,\n complete: pduIsComplete,\n compression: pduCompression,\n encoding: pduEncoding,\n msgNum,\n ackOptions,\n };\n\n if (pduIsACARS) {\n const label = pduAppId.substring(0, 2);\n const sublabel = appIdLen >= 4 ? pduAppId.substring(2, 4) : undefined;\n const mfi = appIdLen >= 6 ? pduAppId.substring(4, 6) : undefined;\n\n pdu.acars = {\n ...(tail ? { tail } : {}),\n label,\n ...(sublabel ? { sublabel } : {}),\n ...(mfi ? { mfi } : {}),\n ...(pduData ? { text: pduData.toString('ascii') } : {}),\n };\n } else {\n pdu.non_acars = {\n appId: pduAppId,\n ...(pduData ? { text: pduData.toString('ascii') } : {}),\n };\n }\n\n return {\n decoded: true,\n message: {\n data: pdu,\n },\n };\n }\n\n static VersionPduHandlerTable: Record<\n MIAMVersion,\n Record<MIAMCorePdu, (hdr: Buffer, body?: Buffer) => PduDecodingResult>\n > = {\n [MIAMVersion.V1]: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => {\n return this.corePduDataHandler(\n MIAMVersion.V1,\n 20,\n MIAMCoreV1CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v1 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v1 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v1 AlohaReply PDU not implemented' };\n },\n },\n [MIAMVersion.V2]: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => {\n return this.corePduDataHandler(\n MIAMVersion.V2,\n 7,\n MIAMCoreV2CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v2 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v2 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v2 Aloha reply PDU not implemented' };\n },\n },\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_MA extends DecoderPlugin {\n name = 'label-ma';\n qualifiers() {\n return {\n labels: ['MA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const miamResult = MIAMCoreUtils.parse(message.text);\n if (\n miamResult.decoded &&\n miamResult.message.data &&\n miamResult.message.data.acars\n ) {\n decodeResult.decoded = true;\n ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);\n if (miamResult.message.data.acars.sublabel) {\n ResultFormatter.sublabel(\n decodeResult,\n miamResult.message.data.acars.sublabel,\n );\n }\n if (miamResult.message.data.acars.tail) {\n ResultFormatter.tail(\n decodeResult,\n miamResult.message.data.acars.tail.replace('.', ''),\n );\n }\n\n const messageText = miamResult.message.data.acars.text;\n // Only transplant message text if the MIAM core decoded message passed CRC and is complete\n if (\n miamResult.message.data.crcOk &&\n miamResult.message.data.complete &&\n messageText\n ) {\n decodeResult.decoder.decodeLevel = 'full';\n const decoded = this.decoder.decode(\n {\n label: miamResult.message.data.acars.label,\n sublabel: miamResult.message.data.acars.sublabel,\n text: messageText,\n },\n options,\n );\n\n if (decoded.decoded) {\n // decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n } else {\n ResultFormatter.text(decodeResult, messageText);\n decodeResult.remaining = { text: messageText };\n }\n } else if (messageText) {\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.remaining = { text: messageText };\n } else {\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_SQ extends DecoderPlugin {\n name = 'label-sq';\n\n qualifiers() {\n return {\n labels: ['SQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.preamble = message.text.substring(0, 4);\n decodeResult.raw.version = message.text.substring(1, 2);\n decodeResult.raw.network = message.text.substring(3, 4);\n\n if (decodeResult.raw.version === '2') {\n const regex =\n /0(\\d)X(?<org>\\w)(?<iata>\\w\\w\\w)(?<icao>\\w\\w\\w\\w)(?<station>\\d)(?<lat>\\d+)(?<latd>[NS])(?<lng>\\d+)(?<lngd>[EW])V(?<vfreq>\\d+)\\/.*/;\n const result = message.text.match(regex);\n\n if (result?.groups && result.length >= 8) {\n decodeResult.raw.groundStation = {\n number: result.groups.station,\n iataCode: result.groups.iata,\n icaoCode: result.groups.icao,\n coordinates: {\n latitude:\n (Number(result.groups.lat) / 100) *\n (result.groups.latd === 'S' ? -1 : 1),\n longitude:\n (Number(result.groups.lng) / 100) *\n (result.groups.lngd === 'W' ? -1 : 1),\n },\n };\n decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1000.0;\n }\n }\n\n decodeResult.formatted.description = 'Ground Station Squitter';\n\n var formattedNetwork = 'Unknown';\n if (decodeResult.raw.network == 'A') {\n formattedNetwork = 'ARINC';\n } else if (decodeResult.raw.network == 'S') {\n formattedNetwork = 'SITA';\n }\n decodeResult.formatted.items = [\n {\n type: 'network',\n code: 'NETT',\n label: 'Network',\n value: formattedNetwork,\n },\n {\n type: 'version',\n code: 'VER',\n label: 'Version',\n value: decodeResult.raw.version,\n },\n ];\n\n if (decodeResult.raw.groundStation) {\n if (\n decodeResult.raw.groundStation.icaoCode &&\n decodeResult.raw.groundStation.number\n ) {\n decodeResult.formatted.items.push({\n type: 'ground_station',\n code: 'GNDSTN',\n label: 'Ground Station',\n value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`,\n });\n }\n if (decodeResult.raw.groundStation.iataCode) {\n decodeResult.formatted.items.push({\n type: 'iataCode',\n code: 'IATA',\n label: 'IATA',\n value: decodeResult.raw.groundStation.iataCode,\n });\n }\n if (decodeResult.raw.groundStation.icaoCode) {\n decodeResult.formatted.items.push({\n type: 'icaoCode',\n code: 'ICAO',\n label: 'ICAO',\n value: decodeResult.raw.groundStation.icaoCode,\n });\n }\n if (decodeResult.raw.groundStation.coordinates.latitude) {\n decodeResult.formatted.items.push({\n type: 'coordinates',\n code: 'COORD',\n label: 'Ground Station Location',\n value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`,\n });\n }\n if (decodeResult.raw.groundStation.airport) {\n decodeResult.formatted.items.push({\n type: 'airport',\n code: 'APT',\n label: 'Airport',\n value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`,\n });\n }\n }\n\n if (decodeResult.raw.vdlFrequency) {\n decodeResult.formatted.items.push({\n type: 'vdlFrequency',\n code: 'VDLFRQ',\n label: 'VDL Frequency',\n value: `${decodeResult.raw.vdlFrequency} MHz`,\n });\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QR extends DecoderPlugin {\n name = 'label-qr';\n\n qualifiers() {\n return {\n labels: ['QR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ON Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.on(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QP extends DecoderPlugin {\n name = 'label-qp';\n\n qualifiers() {\n return {\n labels: ['QP'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OUT Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.out(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QS extends DecoderPlugin {\n name = 'label-qs';\n\n qualifiers() {\n return {\n labels: ['QS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'IN Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.in(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_QQ extends DecoderPlugin {\n name = 'label-qq';\n\n qualifiers() {\n return {\n labels: ['QQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'OFF Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n\n if (message.text.substring(12, 19) === '\\r\\n001FE') {\n decodeResult.raw.day = message.text.substring(19, 21);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)),\n );\n let latdir = message.text.substring(27, 28);\n let latdeg = Number(message.text.substring(28, 30));\n let latmin = Number(message.text.substring(30, 34));\n let londir = message.text.substring(34, 35);\n let londeg = Number(message.text.substring(35, 38));\n let lonmin = Number(message.text.substring(38, 42));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));\n ResultFormatter.position(decodeResult, pos);\n\n if (decodeResult.remaining.text !== '---') {\n ResultFormatter.groundspeed(\n decodeResult,\n Number(message.text.substring(45, 48)),\n );\n } else {\n ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));\n }\n ResultFormatter.unknown(decodeResult, message.text.substring(48));\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + '00'),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n }\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n} from './DecoderPluginInterface';\n\nimport * as Plugins from './plugins/official';\nexport class MessageDecoder {\n name: string;\n plugins: Array<DecoderPluginInterface>;\n debug: boolean;\n\n constructor() {\n this.name = 'acars-decoder-typescript';\n this.plugins = [];\n this.debug = false;\n\n this.registerPlugin(new Plugins.CBand(this)); // first, for now, so it can wrap other plugins\n this.registerPlugin(new Plugins.Label_ColonComma(this));\n this.registerPlugin(new Plugins.Label_5Z_Slash(this));\n this.registerPlugin(new Plugins.Label_10_LDR(this));\n this.registerPlugin(new Plugins.Label_10_POS(this));\n this.registerPlugin(new Plugins.Label_10_Slash(this));\n this.registerPlugin(new Plugins.Label_12_N_Space(this));\n this.registerPlugin(new Plugins.Label_12_POS(this));\n this.registerPlugin(new Plugins.Label_13Through18_Slash(this));\n this.registerPlugin(new Plugins.Label_15(this));\n this.registerPlugin(new Plugins.Label_15_FST(this));\n this.registerPlugin(new Plugins.Label_16_Honeywell(this));\n this.registerPlugin(new Plugins.Label_16_N_Space(this));\n this.registerPlugin(new Plugins.Label_16_POSA1(this));\n this.registerPlugin(new Plugins.Label_16_TOD(this));\n this.registerPlugin(new Plugins.Label_1J_2J_FTX(this));\n this.registerPlugin(new Plugins.Label_1L_3Line(this));\n this.registerPlugin(new Plugins.Label_1L_070(this));\n this.registerPlugin(new Plugins.Label_1L_660(this));\n this.registerPlugin(new Plugins.Label_1L_Slash(this));\n this.registerPlugin(new Plugins.Label_20_POS(this));\n this.registerPlugin(new Plugins.Label_21_POS(this));\n this.registerPlugin(new Plugins.Label_22_OFF(this));\n this.registerPlugin(new Plugins.Label_22_POS(this));\n this.registerPlugin(new Plugins.Label_24_Slash(this));\n this.registerPlugin(new Plugins.Label_2P_FM3(this));\n this.registerPlugin(new Plugins.Label_2P_FM4(this));\n this.registerPlugin(new Plugins.Label_2P_FM5(this));\n this.registerPlugin(new Plugins.Label_2P_POS(this));\n this.registerPlugin(new Plugins.Label_30_Slash_EA(this));\n this.registerPlugin(new Plugins.Label_44_ETA(this));\n this.registerPlugin(new Plugins.Label_44_IN(this));\n this.registerPlugin(new Plugins.Label_44_OFF(this));\n this.registerPlugin(new Plugins.Label_44_ON(this));\n this.registerPlugin(new Plugins.Label_44_POS(this));\n this.registerPlugin(new Plugins.Label_44_Slash(this));\n this.registerPlugin(new Plugins.Label_4A(this));\n this.registerPlugin(new Plugins.Label_4A_01(this));\n this.registerPlugin(new Plugins.Label_4A_DIS(this));\n this.registerPlugin(new Plugins.Label_4A_DOOR(this));\n this.registerPlugin(new Plugins.Label_4A_Slash_01(this));\n this.registerPlugin(new Plugins.Label_4J_POS(this));\n this.registerPlugin(new Plugins.Label_4N(this));\n this.registerPlugin(new Plugins.Label_4T_AGFSR(this));\n this.registerPlugin(new Plugins.Label_4T_ETA(this));\n this.registerPlugin(new Plugins.Label_B6_Forwardslash(this));\n this.registerPlugin(new Plugins.Label_H2_02E(this));\n this.registerPlugin(new Plugins.Label_H1_FLR(this));\n this.registerPlugin(new Plugins.Label_H1_OHMA(this));\n this.registerPlugin(new Plugins.Label_H1_WRN(this));\n this.registerPlugin(new Plugins.Label_H1(this));\n this.registerPlugin(new Plugins.Label_H1_StarPOS(this));\n this.registerPlugin(new Plugins.Label_HX(this));\n this.registerPlugin(new Plugins.Label_58(this));\n this.registerPlugin(new Plugins.Label_80(this));\n this.registerPlugin(new Plugins.Label_83(this));\n this.registerPlugin(new Plugins.Label_8E(this));\n this.registerPlugin(new Plugins.Label_1M_Slash(this));\n this.registerPlugin(new Plugins.Label_MA(this));\n this.registerPlugin(new Plugins.Label_SQ(this));\n this.registerPlugin(new Plugins.Label_QP(this));\n this.registerPlugin(new Plugins.Label_QQ(this));\n this.registerPlugin(new Plugins.Label_QR(this));\n this.registerPlugin(new Plugins.Label_QS(this));\n }\n\n registerPlugin(plugin: DecoderPluginInterface): boolean {\n // plugin.onRegister(this.store);\n this.plugins.push(plugin);\n return true;\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const usablePlugins = this.plugins.filter((plugin) => {\n const qualifiers = plugin.qualifiers();\n\n if (\n qualifiers.labels.includes(message.label) ||\n (qualifiers.labels.length === 1 && qualifiers.labels[0] === '*')\n ) {\n if (qualifiers.preambles && qualifiers.preambles.length > 0) {\n const matching = qualifiers.preambles.filter((preamble: string) => {\n // console.log(message.text.substring(0, preamble.length));\n // console.log(preamble);\n return message.text.substring(0, preamble.length) === preamble;\n });\n return matching.length >= 1;\n } else {\n return true;\n }\n }\n\n return false;\n });\n\n if (options.debug) {\n console.log('Usable plugins');\n console.log(usablePlugins);\n }\n\n let result: DecodeResult = {\n decoded: false,\n error: 'No known decoder plugin for this message',\n decoder: {\n name: 'none',\n type: 'none',\n decodeLevel: 'none',\n },\n message: message,\n remaining: {\n text: message.text,\n },\n raw: {},\n formatted: {\n description: 'Not Decoded',\n items: [],\n },\n };\n\n // for-in is not happy. doing it the old way\n for (let i = 0; i < usablePlugins.length; i++) {\n const plugin = usablePlugins[i];\n result = plugin.decode(message);\n if (result.decoded) {\n break;\n }\n }\n\n if (options.debug) {\n console.log('Result');\n console.log(result);\n }\n\n return result;\n }\n}\n"],"mappings":"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;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,IAC1B;AAEA,QAAI,OAAO,QAAQ,KAAK;AAExB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aACK,OAAO,MAAO,IACf,UAAY,QAAQ,IAAK,IAAI,UAAU,CAAC,OAAO,IAAK,GAAI,OAC1D;AAAA,IACJ;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,OAAe,cAAc,KAAa,MAAe;AACvD,UAAM,WAAW;AAAA,MACf;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAA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","names":["data","decoded","zlib","import_node_buffer","MIAMVersion","MIAMFid","MIAMCorePdu","MIAMCoreApp"]}
1
+ {"version":3,"sources":["../index.ts","../lib/IcaoDecoder.ts","../lib/DecoderPlugin.ts","../lib/utils/coordinate_utils.ts","../lib/DateTimeUtils.ts","../lib/utils/route_utils.ts","../lib/utils/result_formatter.ts","../lib/plugins/CBand.ts","../lib/plugins/Label_5Z_Slash.ts","../lib/plugins/Label_10_LDR.ts","../lib/plugins/Label_10_POS.ts","../lib/plugins/Label_10_Slash.ts","../lib/plugins/Label_12_N_Space.ts","../lib/plugins/Label_12_POS.ts","../lib/plugins/Label_13Through18_Slash.ts","../lib/plugins/Label_15.ts","../lib/plugins/Label_15_FST.ts","../lib/plugins/Label_16_Honeywell.ts","../lib/plugins/Label_16_N_Space.ts","../lib/plugins/Label_16_POSA1.ts","../lib/plugins/Label_16_TOD.ts","../lib/utils/flight_plan_utils.ts","../lib/utils/h1_helper.ts","../lib/plugins/Label_1J_2J_FTX.ts","../lib/plugins/Label_1M_Slash.ts","../lib/plugins/Label_1L_3-line.ts","../lib/plugins/Label_1L_070.ts","../lib/plugins/Label_1L_660.ts","../lib/plugins/Label_1L_Slash.ts","../lib/plugins/Label_20_POS.ts","../lib/plugins/Label_21_POS.ts","../lib/plugins/Label_22_OFF.ts","../lib/plugins/Label_22_POS.ts","../lib/plugins/Label_2P_FM3.ts","../lib/plugins/Label_2P_FM4.ts","../lib/plugins/Label_2P_FM5.ts","../lib/plugins/Label_2P_POS.ts","../lib/plugins/Label_24_Slash.ts","../lib/plugins/Label_30_Slash_EA.ts","../lib/plugins/Label_44_ETA.ts","../lib/plugins/Label_44_IN.ts","../lib/plugins/Label_44_OFF.ts","../lib/plugins/Label_44_ON.ts","../lib/plugins/Label_44_POS.ts","../lib/plugins/Label_44_Slash.ts","../lib/plugins/Label_4A.ts","../lib/plugins/Label_4A_01.ts","../lib/plugins/Label_4A_DIS.ts","../lib/plugins/Label_4A_DOOR.ts","../lib/plugins/Label_4A_Slash_01.ts","../lib/plugins/Label_4J_POS.ts","../lib/plugins/Label_4N.ts","../lib/plugins/Label_4T_AGFSR.ts","../lib/plugins/Label_58.ts","../lib/plugins/Label_4T_ETA.ts","../lib/plugins/Label_80.ts","../lib/plugins/Label_83.ts","../lib/plugins/Label_8E.ts","../lib/plugins/Label_B6.ts","../lib/plugins/Label_ColonComma.ts","../lib/plugins/Label_H1.ts","../lib/plugins/Label_H2_02E.ts","../lib/plugins/Label_H1_FLR.ts","../lib/plugins/Label_H1_OHMA.ts","../lib/plugins/Label_H1_Paren.ts","../lib/plugins/Label_H1_StarPOS.ts","../lib/plugins/Label_H1_WRN.ts","../lib/plugins/Label_HX.ts","../lib/utils/miam.ts","../lib/plugins/Label_MA.ts","../lib/plugins/Label_SQ.ts","../lib/plugins/Label_QR.ts","../lib/plugins/Label_QP.ts","../lib/plugins/Label_QS.ts","../lib/plugins/Label_QQ.ts","../lib/MessageDecoder.ts"],"sourcesContent":["export * from './lib/IcaoDecoder';\nexport * from './lib/MessageDecoder';\n","export class IcaoDecoder {\n name: string;\n icao: string;\n\n // Military ICAO address ranges (as [start, end] tuples, inclusive)\n private static readonly MILITARY_RANGES: Array<[number, number]> = [\n [0x010070, 0x01008f], // Egypt\n [0x0a4000, 0x0a4fff], // Algeria\n [0x33ff00, 0x33ffff], // Italy\n [0x350000, 0x37ffff], // Spain\n [0x3aa000, 0x3affff], // France 1\n [0x3b7000, 0x3bffff], // France 2\n [0x3ea000, 0x3ebfff], // Germany 1\n [0x3f4000, 0x3fbfff], // Germany 2\n [0x400000, 0x40003f], // UK 1\n [0x43c000, 0x43cfff], // UK 2\n [0x444000, 0x446fff], // Austria\n [0x44f000, 0x44ffff], // Belgium\n [0x457000, 0x457fff], // Bulgaria\n [0x45f400, 0x45f4ff], // Denmark\n [0x468000, 0x4683ff], // Greece\n [0x473c00, 0x473c0f], // Hungary\n [0x478100, 0x4781ff], // Norway\n [0x480000, 0x480fff], // Netherlands\n [0x48d800, 0x48d87f], // Poland\n [0x497c00, 0x497cff], // Portugal\n [0x498420, 0x49842f], // Czech\n [0x4b7000, 0x4b7fff], // Switzerland\n [0x4b8200, 0x4b82ff], // Turkey\n [0x70c070, 0x70c07f], // Oman\n [0x710258, 0x71028f], // Saudi 1\n [0x710380, 0x71039f], // Saudi 2\n [0x738a00, 0x738aff], // Israel\n [0x7cf800, 0x7cfaff], // Australia\n [0x800200, 0x8002ff], // India\n [0xadf7c8, 0xafffff], // USA\n [0xc20000, 0xc3ffff], // Canada\n [0xe40000, 0xe41fff], // Brazil\n ];\n\n constructor(icao: string) {\n this.name = 'icao-decoder-typescript';\n this.icao = icao;\n }\n\n isMilitary(): boolean {\n const i = this.icao;\n const n = parseInt(i, 16);\n for (const [start, end] of IcaoDecoder.MILITARY_RANGES) {\n if (start <= n && n <= end) {\n return true;\n }\n }\n return false;\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n Qualifiers,\n} from './DecoderPluginInterface';\nimport { MessageDecoder } from './MessageDecoder';\n\nexport abstract class DecoderPlugin implements DecoderPluginInterface {\n decoder!: MessageDecoder;\n\n name: string = 'unknown';\n\n defaultResult(): DecodeResult {\n return {\n decoded: false,\n decoder: {\n name: 'unknown',\n type: 'pattern-match',\n decodeLevel: 'none',\n },\n formatted: {\n description: 'Unknown',\n items: [],\n },\n raw: {},\n remaining: {},\n };\n }\n\n options: object;\n\n constructor(decoder: MessageDecoder, options: Options = {}) {\n this.decoder = decoder;\n this.options = options;\n }\n\n id(): string {\n console.log(\n 'DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!',\n );\n return 'abstract_decoder_plugin';\n }\n\n meetsStateRequirements(): boolean {\n return true;\n }\n\n // onRegister(store: Store<any>) {\n // this.store = store;\n // }\n\n qualifiers(): Qualifiers {\n const labels: Array<string> = [];\n\n return {\n labels,\n };\n }\n\n decode(message: Message): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.remaining.text = message.text;\n return decodeResult;\n }\n}\n","export class CoordinateUtils {\n /**\n * Decode a string of coordinates into an object with latitude and longitude in millidegrees\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinates(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.substring(0, 1);\n let middleChar = stringCoords.substring(6, 7);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar == ' ') {\n middleChar = stringCoords.substring(7, 8);\n longitudeChars = stringCoords.substring(8, 14);\n }\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n return {\n latitude:\n (Number(stringCoords.substring(1, 6)) / 1000) *\n CoordinateUtils.getDirection(firstChar),\n longitude:\n (Number(longitudeChars) / 1000) *\n CoordinateUtils.getDirection(middleChar),\n };\n }\n\n return undefined;\n }\n\n /**\n * Decode a string of coordinates into an object with latitude and longitude in degrees and decimal minutes\n * @param stringCoords - The string of coordinates to decode\n *\n * @returns An object with latitude and longitude properties\n */\n public static decodeStringCoordinatesDecimalMinutes(\n stringCoords: string,\n ): { latitude: number; longitude: number } | undefined {\n // format: N12345W123456 or N12345 W123456\n const firstChar = stringCoords.substring(0, 1);\n let middleChar = stringCoords.substring(6, 7);\n let longitudeChars = stringCoords.substring(7, 13);\n if (middleChar == ' ') {\n middleChar = stringCoords.substring(7, 8);\n longitudeChars = stringCoords.substring(8, 14);\n }\n const latDeg = Math.trunc(Number(stringCoords.substring(1, 6)) / 1000);\n const latMin = (Number(stringCoords.substring(1, 6)) % 1000) / 10;\n const lonDeg = Math.trunc(Number(longitudeChars) / 1000);\n const lonMin = (Number(longitudeChars) % 1000) / 10;\n\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n return {\n latitude:\n (latDeg + latMin / 60) * CoordinateUtils.getDirection(firstChar),\n longitude:\n (lonDeg + lonMin / 60) * CoordinateUtils.getDirection(middleChar),\n };\n }\n return undefined;\n }\n public static coordinateString(coords: {\n latitude: number;\n longitude: number;\n }): string {\n const latDir = coords.latitude > 0 ? 'N' : 'S';\n const lonDir = coords.longitude > 0 ? 'E' : 'W';\n return `${Math.abs(coords.latitude).toFixed(3)} ${latDir}, ${Math.abs(coords.longitude).toFixed(3)} ${lonDir}`;\n }\n\n public static getDirection(coord: string): number {\n if (coord.startsWith('N') || coord.startsWith('E')) {\n return 1;\n } else if (coord.startsWith('S') || coord.startsWith('W')) {\n return -1;\n }\n return NaN;\n }\n\n public static dmsToDecimalDegrees(\n degrees: number,\n minutes: number,\n seconds: number,\n ): number {\n return degrees + minutes / 60 + seconds / 3600;\n }\n}\n","export class DateTimeUtils {\n // Expects a four digit UTC time string (HHMM)\n public static UTCToString(UTCString: string) {\n let utcDate = new Date();\n utcDate.setUTCHours(+UTCString.substr(0, 2), +UTCString.substr(2, 2), 0);\n return utcDate.toTimeString();\n }\n\n // Expects a six digit date string and a four digit UTC time string\n // (DDMMYY) (HHMM)\n public static UTCDateTimeToString(dateString: string, timeString: string) {\n let utcDate = new Date();\n utcDate.setUTCDate(+dateString.substr(0, 2));\n utcDate.setUTCMonth(+dateString.substr(2, 2));\n if (dateString.length === 6) {\n utcDate.setUTCFullYear(2000 + +dateString.substr(4, 2));\n }\n if (timeString.length === 6) {\n utcDate.setUTCHours(\n +timeString.substr(0, 2),\n +timeString.substr(2, 2),\n +timeString.substr(4, 2),\n );\n } else {\n utcDate.setUTCHours(\n +timeString.substr(0, 2),\n +timeString.substr(2, 2),\n 0,\n );\n }\n return utcDate.toUTCString();\n }\n\n /**\n *\n * @param time HHMMSS or HHMM\n * @returns seconds since midnight\n */\n public static convertHHMMSSToTod(time: string): number {\n if (time.length === 4) {\n time += '00';\n }\n const h = Number(time.substring(0, 2));\n const m = Number(time.substring(2, 4));\n const s = Number(time.substring(4, 6));\n const tod = h * 3600 + m * 60 + s;\n return tod;\n }\n\n /**\n *\n * @param time HHMMSS\n * @param date DDMMYY or DDMMYYYY\n * @returns seconds since epoch\n */\n public static convertDateTimeToEpoch(time: string, date: string): number {\n //YYYY-MM-DDTHH:mm:ss.sssZ\n if (date.length === 6) {\n date = date.substring(0, 4) + `20${date.substring(4, 6)}`;\n }\n const timestamp = `${date.substring(4, 8)}-${date.substring(2, 4)}-${date.substring(0, 2)}T${time.substring(0, 2)}:${time.substring(2, 4)}:${time.substring(4, 6)}.000Z`;\n const millis = Date.parse(timestamp);\n return millis / 1000;\n }\n\n /**\n * Converts a timestamp to a string\n *\n * ISO-8601 format for 'epoch'\n * HH:MM:SS for 'tod'\n * @param time\n * @param format\n * @returns\n */\n public static timestampToString(\n time: number,\n format: 'tod' | 'epoch',\n ): string {\n const date = new Date(time * 1000);\n if (format == 'tod') {\n return date.toISOString().slice(11, 19);\n }\n //strip off millis\n return date.toISOString().slice(0, -5) + 'Z';\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { Route } from '../types/route';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from './coordinate_utils';\n\nexport class RouteUtils {\n public static formatFlightState(state: string): string {\n switch (state) {\n case 'TO':\n return 'Takeoff';\n case 'IC':\n return 'Initial Climb';\n case 'CL':\n return 'Climb';\n case 'ER':\n return 'En Route';\n case 'DC':\n return 'Descent';\n case 'AP':\n return 'Approach';\n default:\n return `Unknown ${state}`;\n }\n }\n\n public static routeToString(route: Route): string {\n let str = '';\n if (route.name) {\n str += route.name;\n }\n if (route.runway) {\n str += `(${route.runway})`;\n }\n if (str.length !== 0 && route.waypoints && route.waypoints.length === 1) {\n str += ' starting at ';\n } else if (str.length !== 0 && route.waypoints) {\n str += ': ';\n }\n\n if (route.waypoints) {\n str += RouteUtils.waypointsToString(route.waypoints);\n }\n\n return str;\n }\n\n public static waypointToString(waypoint: Waypoint): string {\n let s = waypoint.name;\n if (waypoint.latitude && waypoint.longitude) {\n s += `(${CoordinateUtils.coordinateString({ latitude: waypoint.latitude, longitude: waypoint.longitude })})`;\n }\n if (waypoint.offset) {\n s += `[${waypoint.offset.bearing}° ${waypoint.offset.distance}nm]`;\n }\n if (waypoint.time && waypoint.timeFormat) {\n s += `@${DateTimeUtils.timestampToString(waypoint.time, waypoint.timeFormat)}`;\n }\n return s;\n }\n\n public static getWaypoint(leg: string): Waypoint {\n const regex = leg.match(/^([A-Z]+)(\\d{3})-(\\d{4})$/); // {name}{bearing}-{distance}\n if (regex?.length == 4) {\n return {\n name: regex[1],\n offset: {\n bearing: parseInt(regex[2]),\n distance: parseInt(regex[3]) / 10,\n },\n };\n }\n\n const waypoint = leg.split(',');\n if (waypoint.length == 2) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n waypoint[1],\n );\n if (position) {\n return {\n name: waypoint[0],\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n if (leg.length == 13 || leg.length == 14) {\n //looks like coordinates\n const position =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);\n const name = waypoint.length == 2 ? waypoint[0] : '';\n if (position) {\n return {\n name: name,\n latitude: position.latitude,\n longitude: position.longitude,\n };\n }\n }\n return { name: leg };\n }\n\n private static waypointsToString(waypoints: Waypoint[]): string {\n let str = waypoints\n .map((x) => RouteUtils.waypointToString(x))\n .join(' > ')\n .replaceAll('> >', '>>');\n if (str.startsWith(' > ')) {\n str = '>>' + str.slice(2);\n }\n return str;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { RouteUtils } from './route_utils';\nimport { Route } from '../types/route';\nimport { Wind } from '../types/wind';\n\n/**\n * Class to format the results of common fields\n */\nexport class ResultFormatter {\n static route(decodeResult: DecodeResult, route: Route) {\n decodeResult.raw.route = route;\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(route),\n });\n }\n\n static state_change(decodeResult: DecodeResult, from: string, to: string) {\n decodeResult.raw.state_change = {\n from: from,\n to: to,\n };\n from = RouteUtils.formatFlightState(from);\n to = RouteUtils.formatFlightState(to);\n decodeResult.formatted.items.push({\n type: 'state_change',\n code: 'STATE_CHANGE',\n label: 'State Change',\n value: `${from} -> ${to}`,\n });\n }\n\n static freetext(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.freetext = value;\n decodeResult.formatted.items.push({\n type: 'freetext',\n code: 'FREE_TEXT',\n label: 'Free Text',\n value: value,\n });\n }\n\n static door_event(decodeResult: DecodeResult, name: string, state: string) {\n decodeResult.raw.door_event = {\n door: name,\n state: state,\n };\n\n decodeResult.formatted.items.push({\n type: 'door_event',\n code: 'DOOR',\n label: 'Door Event',\n value: `${name} ${state}`,\n });\n }\n\n static position(\n decodeResult: DecodeResult,\n value: { latitude: number; longitude: number } | undefined,\n ) {\n if (!value || isNaN(value.latitude) || isNaN(value.longitude)) {\n return;\n }\n decodeResult.raw.position = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(value),\n });\n }\n\n static altitude(decodeResult: DecodeResult, value: number) {\n if (isNaN(value)) {\n return;\n }\n decodeResult.raw.altitude = value;\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: 'Altitude',\n value: `${decodeResult.raw.altitude} feet`,\n });\n }\n\n static flightNumber(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.flight_number = value;\n decodeResult.formatted.items.push({\n type: 'flight_number',\n code: 'FLIGHT',\n label: 'Flight Number',\n value: decodeResult.raw.flight_number,\n });\n }\n\n static callsign(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.callsign = value;\n decodeResult.formatted.items.push({\n type: 'callsign',\n code: 'CALLSIGN',\n label: 'Callsign',\n value: decodeResult.raw.callsign,\n });\n }\n\n static departureAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.departure_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n } else {\n decodeResult.raw.departure_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'ORG',\n label: 'Origin',\n value: value,\n });\n }\n }\n\n static departureRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.departure_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'DEPRWY',\n label: 'Departure Runway',\n value: decodeResult.raw.departure_runway,\n });\n }\n\n static arrivalAirport(\n decodeResult: DecodeResult,\n value: string,\n type: 'IATA' | 'ICAO' = 'ICAO',\n ) {\n if (type === 'ICAO') {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n } else {\n decodeResult.raw.arrival_iata = value;\n decodeResult.formatted.items.push({\n type: 'iata',\n code: 'DST',\n label: 'Destination',\n value: value,\n });\n }\n }\n\n static alternateAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_icao = value;\n decodeResult.formatted.items.push({\n type: 'icao',\n code: 'ALT_DST',\n label: 'Alternate Destination',\n value: decodeResult.raw.alternate_icao,\n });\n }\n\n static eta(\n decodeResult: DecodeResult,\n time: number,\n type: 'tod' | 'epoch' = 'tod',\n ) {\n if (type === 'tod') {\n decodeResult.raw.eta_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n } else {\n decodeResult.raw.eta_date = time;\n decodeResult.formatted.items.push({\n type: 'epoch',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.timestampToString(time, 'epoch'),\n });\n }\n }\n\n static arrivalRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ARWY',\n label: 'Arrival Runway',\n value: decodeResult.raw.arrival_runway,\n });\n }\n\n static alternateRunway(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n code: 'ALT_ARWY',\n label: 'Alternate Runway',\n value: decodeResult.raw.alternate_runway,\n });\n }\n\n static currentFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_on_board = value;\n decodeResult.formatted.items.push({\n type: 'fuel_on_board',\n code: 'FOB',\n label: 'Fuel On Board',\n value: decodeResult.raw.fuel_on_board.toString(),\n });\n }\n\n static burnedFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_burned = value;\n decodeResult.formatted.items.push({\n type: 'fuel_burned',\n code: 'FB',\n label: 'Fuel Burned',\n value: decodeResult.raw.fuel_burned.toString(),\n });\n }\n\n static remainingFuel(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.fuel_remaining = value;\n decodeResult.formatted.items.push({\n type: 'fuel_remaining',\n code: 'FUEL',\n label: 'Fuel Remaining',\n value: decodeResult.raw.fuel_remaining.toString(),\n });\n }\n\n static checksumAlgorithm(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.checksum_algorithm = value;\n // decodeResult.formatted.items.push({\n // type: 'message_checksum_algorithm',\n // code: 'CHECKSUM_ALGO',\n // label: 'Checksum Algorithm',\n // value: decodeResult.raw.checksum_algorithm,\n // });\n }\n\n static checksum(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.checksum = value;\n decodeResult.formatted.items.push({\n type: 'message_checksum',\n code: 'CHECKSUM',\n label: 'Message Checksum',\n value: '0x' + ('0000' + decodeResult.raw.checksum.toString(16)).slice(-4),\n });\n }\n\n static groundspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.groundspeed = value;\n decodeResult.formatted.items.push({\n type: 'aircraft_groundspeed',\n code: 'GSPD',\n label: 'Aircraft Groundspeed',\n value: `${decodeResult.raw.groundspeed} knots`,\n });\n }\n\n static airspeed(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.airspeed = value;\n decodeResult.formatted.items.push({\n type: 'airspeed',\n code: 'ASPD',\n label: 'True Airspeed',\n value: `${decodeResult.raw.airspeed} knots`,\n });\n }\n\n static mach(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.mach = value;\n decodeResult.formatted.items.push({\n type: 'mach',\n code: 'MACH',\n label: 'Mach Number',\n value: `${decodeResult.raw.mach} mach`,\n });\n }\n\n static temperature(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.outside_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'outside_air_temperature',\n code: 'OATEMP',\n label: 'Outside Air Temperature (C)',\n value: `${decodeResult.raw.outside_air_temperature} degrees`,\n });\n }\n\n static totalAirTemp(decodeResult: DecodeResult, value: string) {\n if (value.length === 0) {\n return;\n }\n decodeResult.raw.total_air_temperature = Number(\n value.replace('M', '-').replace('P', '+'),\n );\n decodeResult.formatted.items.push({\n type: 'temperature',\n code: 'TATEMP',\n label: 'Total Air Temperature (C)',\n value: `${decodeResult.raw.total_air_temperature} degrees`,\n });\n }\n\n static heading(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.heading = value;\n decodeResult.formatted.items.push({\n type: 'heading',\n code: 'HDG',\n label: 'Heading',\n value: `${decodeResult.raw.heading}`,\n });\n }\n\n static tail(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.tail = value;\n decodeResult.formatted.items.push({\n type: 'tail',\n code: 'TAIL',\n label: 'Tail',\n value: decodeResult.raw.tail,\n });\n }\n\n static out(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.out_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'OUT',\n label: 'Out of Gate Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static off(\n decodeResult: DecodeResult,\n time: number,\n type: 'tod' | 'epoch' = 'tod',\n ) {\n if (type === 'tod') {\n decodeResult.raw.off_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n } else {\n decodeResult.raw.off_date = time;\n decodeResult.formatted.items.push({\n type: 'epoch',\n code: 'OFF',\n label: 'Takeoff Time',\n value: DateTimeUtils.timestampToString(time, 'epoch'),\n });\n }\n }\n\n static on(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.on_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'ON',\n label: 'Landing Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static in(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.in_time = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'IN',\n label: 'In Gate Time',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static time_of_day(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.time_of_day = time;\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'MSG_TOD',\n label: 'Message Timestamp',\n value: DateTimeUtils.timestampToString(time, 'tod'),\n });\n }\n\n static day(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'MSG_DAY',\n label: 'Day of Month',\n value: `${day}`,\n });\n }\n\n static month(decodeResult: DecodeResult, month: number) {\n decodeResult.raw.month = month;\n decodeResult.formatted.items.push({\n type: 'month',\n code: 'MSG_MON',\n label: 'Month of Year',\n value: `${month}`,\n });\n }\n\n static departureDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.departure_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'DEP_DAY',\n label: 'Departure Day',\n value: `${day}`,\n });\n }\n\n static arrivalDay(decodeResult: DecodeResult, day: number) {\n decodeResult.raw.arrival_day = day;\n decodeResult.formatted.items.push({\n type: 'day',\n code: 'ARR_DAY',\n label: 'Arrival Day',\n value: `${day}`,\n });\n }\n\n static text(decodeResult: DecodeResult, text: string) {\n decodeResult.raw.text = text;\n decodeResult.formatted.items.push({\n type: 'text',\n code: 'TEXT',\n label: 'Text Message',\n value: text,\n });\n }\n\n static mac(decodeResult: DecodeResult, mac: number) {\n decodeResult.raw.mac = mac;\n decodeResult.formatted.items.push({\n type: 'mac',\n code: 'MAC',\n label: 'Mean Aerodynamic Chord',\n value: `${mac} %`,\n });\n }\n\n static trim(decodeResult: DecodeResult, trim: number) {\n decodeResult.raw.trim = trim;\n decodeResult.formatted.items.push({\n type: 'trim',\n code: 'TRIM',\n label: 'Trim',\n value: `${trim} units`,\n });\n }\n\n static windData(decodeResult: DecodeResult, windData: Wind[]) {\n decodeResult.raw.wind_data = windData;\n for (const wind of windData) {\n let text = `${RouteUtils.waypointToString(wind.waypoint)} at FL${wind.flightLevel}: ${wind.windDirection}° at ${wind.windSpeed}kt`;\n if (wind.temperature) {\n text += `, ${wind.temperature.degreesC}°C at FL${wind.temperature.flightLevel}`;\n }\n decodeResult.formatted.items.push({\n type: 'wind_data',\n code: 'WIND',\n label: 'Wind Data',\n value: text,\n });\n }\n }\n\n static cg(\n decodeResult: DecodeResult,\n value: number,\n type: 'center' | 'lower' | 'upper' = 'center',\n ) {\n switch (type) {\n case 'center':\n decodeResult.raw.center_of_gravity = value;\n decodeResult.formatted.items.push({\n type: 'center_of_gravity',\n code: 'CG',\n label: 'Center of Gravity',\n value: `${decodeResult.raw.center_of_gravity} %`,\n });\n break;\n case 'lower':\n decodeResult.raw.cg_lower_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_lower_limit',\n code: 'CG_LOWER',\n label: 'Center of Gravity Lower Limit',\n value: `${decodeResult.raw.cg_lower_limit} %`,\n });\n break;\n case 'upper':\n decodeResult.raw.cg_upper_limit = value;\n decodeResult.formatted.items.push({\n type: 'cg_upper_limit',\n code: 'CG_UPPER',\n label: 'Center of Gravity Upper Limit',\n value: `${decodeResult.raw.cg_upper_limit} %`,\n });\n break;\n }\n }\n\n static version(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.version = value;\n decodeResult.formatted.items.push({\n type: 'version',\n code: 'VERSION',\n label: 'Message Version',\n value: `v${decodeResult.raw.version.toFixed(1)}`,\n });\n }\n\n static label(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.label = value;\n decodeResult.formatted.items.push({\n type: 'label',\n code: 'LABEL',\n label: 'Message Label',\n value: `${decodeResult.raw.label}`,\n });\n }\n\n static sublabel(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.sublabel = value;\n decodeResult.formatted.items.push({\n type: 'sublabel',\n code: 'SUBLABEL',\n label: 'Message Sublabel',\n value: `${decodeResult.raw.sublabel}`,\n });\n }\n\n static requestedAltitudes(decodeResult: DecodeResult, values: number[]) {\n decodeResult.raw.requested_alts = values;\n decodeResult.formatted.items.push({\n type: 'requested_altitudes',\n code: 'REQ_ALTS',\n label: 'Requested Altitudes',\n value: `${decodeResult.raw.requested_alts.join(', ')}`,\n });\n }\n\n static desiredAltitude(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.desired_alt = value;\n decodeResult.formatted.items.push({\n type: 'desired_altitude',\n code: 'DES_ALT',\n label: 'Desired Altitude',\n value: `${decodeResult.raw.desired_alt}`,\n });\n }\n\n static startPoint(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.start_point = value;\n decodeResult.formatted.items.push({\n type: 'start_point',\n code: 'START',\n label: 'Start Point',\n value: `${decodeResult.raw.start_point}`,\n });\n }\n\n static routeNumber(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.route_number = value;\n decodeResult.formatted.items.push({\n type: 'route_number',\n code: 'RTE_NUM',\n label: 'Route Number',\n value: `${decodeResult.raw.route_number}`,\n });\n }\n\n static flightPlan(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.flight_plan = value;\n decodeResult.formatted.items.push({\n type: 'flight_plan',\n code: 'FPN',\n label: 'Flight Plan',\n value: `${decodeResult.raw.flight_plan}`,\n });\n }\n\n static groundAddress(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.ground_address = value;\n decodeResult.formatted.items.push({\n type: 'ground_address',\n code: 'GND_ADDR',\n label: 'Ground Address',\n value: `${decodeResult.raw.ground_address}`,\n });\n }\n\n static timestamp(decodeResult: DecodeResult, value: number) {\n decodeResult.raw.message_timestamp = value;\n decodeResult.formatted.items.push({\n type: 'epoch',\n code: 'TIMESTAMP',\n label: 'Message Timestamp',\n value: DateTimeUtils.timestampToString(value, 'epoch'),\n });\n }\n\n static unknown(decodeResult: DecodeResult, value: string, sep: string = ',') {\n if (!decodeResult.remaining.text) decodeResult.remaining.text = value;\n else decodeResult.remaining.text += sep + value;\n }\n\n static unknownArr(\n decodeResult: DecodeResult,\n value: string[],\n sep: string = ',',\n ) {\n this.unknown(decodeResult, value.join(sep), sep);\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class CBand extends DecoderPlugin {\n name = 'c-band';\n qualifiers() {\n return {\n labels: ['*'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n // C-Band puts a 10 char header in front of some message types\n // First 4 chars are some kind of message number\n // Last 6 chars are the flight number\n let cband = message.text.match(\n /^(?<msgno>[A-Z]\\d{2}[A-Z])(?<airline>[A-Z0-9]{2})(?<number>[0-9]{4})/,\n );\n if (cband?.groups) {\n const messageText = message.text.substring(10);\n const decoded = this.decoder.decode(\n {\n label: message.label,\n sublabel: message.sublabel,\n text: messageText,\n },\n options,\n );\n if (decoded.decoded) {\n ResultFormatter.flightNumber(\n decodeResult,\n cband.groups.airline + Number(cband.groups.number),\n );\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.decoder.name = this.name + '-' + decoded.decoder.name;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.description = decoded.formatted.description;\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n }\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_5Z_Slash extends DecoderPlugin {\n name = 'label-5z-slash';\n\n descriptions: Record<string, string> = {\n B1: 'Request Weight and Balance',\n B3: 'Request Departure Clearance',\n CD: 'Weight and Balance',\n CG: 'Request Pre-departure clearance, PDC',\n CM: 'Crew Scheduling',\n C3: 'Off Message',\n C4: 'Flight Dispatch',\n C5: 'Maintenance Message',\n C6: 'Customer Service',\n 10: 'PIREP',\n C11: 'International PIREP',\n DS: 'Late Message',\n D3: 'Holding Pattern Message',\n D6: 'From-To + Date',\n D7: 'From-To + Alternate + Time',\n EO: 'In Range',\n ET: 'Expected Time',\n PW: 'Position Weather',\n RL: 'Request Release',\n R3: 'Request HOWGOZIT Message',\n R4: 'Request the Latest POSBD',\n TC: 'From-To Fuel',\n WB: 'From-To',\n W1: 'Request Weather for City',\n };\n\n qualifiers() {\n return {\n labels: ['5Z'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Designated Downlink';\n\n const lines = message.text.split('\\r\\n');\n if (lines[0] === '/TXT') {\n // not UA, but starts with `/`\n ResultFormatter.text(decodeResult, lines.slice(1).join('\\r\\n'));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n const data = lines[0].split('/');\n const header = data[1].split(' '); //data[0] is blank\n const type = header[0];\n const typeDescription = this.descriptions[type];\n\n if (typeDescription) {\n decodeResult.raw.airline = 'United Airlines';\n decodeResult.formatted.items.push({\n type: 'airline',\n code: 'AIRLINE',\n label: 'Airline',\n value: 'United Airlines',\n });\n decodeResult.raw.message_type = type;\n decodeResult.formatted.items.push({\n type: 'message_type',\n code: 'MSG_TYPE',\n label: 'Message Type',\n value: `${typeDescription} (${type})`,\n });\n\n if (type === 'B3' && data[1] === 'B3 TO DATA REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.arrivalRunway(decodeResult, info[5].slice(1));\n ResultFormatter.unknownArr(decodeResult, data.slice(3), '/');\n } else if (type === 'B3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n decodeResult.raw.day = Number(header[2]);\n ResultFormatter.arrivalRunway(decodeResult, header[3].slice(1));\n if (header.length > 4) {\n ResultFormatter.unknownArr(decodeResult, header.slice(4), '/');\n }\n } else if (type === 'C3' && data[1] === 'C3 GATE REQ ') {\n const info = data[2].split(' ');\n //info[0] is blank\n ResultFormatter.departureAirport(decodeResult, info[1]);\n ResultFormatter.arrivalAirport(decodeResult, info[2]);\n decodeResult.raw.day = Number(info[3]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(info[4]),\n );\n ResultFormatter.unknownArr(decodeResult, info.slice(5), ' ');\n } else if (type === 'C3') {\n ResultFormatter.departureAirport(\n decodeResult,\n header[1].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(\n decodeResult,\n header[1].substring(3),\n 'IATA',\n );\n } else if (type === 'ET') {\n const airports = data[2].split(' ');\n // aiports[0] is blank\n ResultFormatter.departureAirport(decodeResult, airports[1]);\n ResultFormatter.arrivalAirport(decodeResult, airports[2]);\n decodeResult.raw.day = Number(airports[3]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(airports[4]),\n );\n\n const estimates = data[3].split(' ');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(estimates[1]),\n );\n ResultFormatter.unknown(decodeResult, estimates[2]);\n } else {\n if (options.debug) {\n console.log(`Decoder: Unkown 5Z RDC format: ${message.text}`);\n }\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 5Z message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_LDR extends DecoderPlugin {\n name = 'label-10-ldr';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['LDR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[5];\n const lon = parts[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim()),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim()),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.departureAirport(decodeResult, parts[9]);\n ResultFormatter.arrivalAirport(decodeResult, parts[10]);\n ResultFormatter.alternateAirport(decodeResult, parts[11]);\n ResultFormatter.arrivalRunway(decodeResult, parts[12].split('/')[0]); // TODO: find out if anything comes after `/` sometimes\n const altRwy = [parts[13].split('/')[0], parts[14].split('/')[0]]\n .filter((r) => r != '')\n .join(',');\n if (altRwy != '') {\n ResultFormatter.alternateRunway(decodeResult, altRwy); // TODO: find out if anything comes after `/` sometimes\n }\n ResultFormatter.unknownArr(decodeResult, [\n ...parts.slice(0, 5),\n ...parts.slice(15),\n ]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_POS extends DecoderPlugin {\n name = 'label-10-pos';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n if (parts.length !== 12) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n //const time = parts[0].substring(3); //DDHHMM\n const lat = parts[1].trim();\n const lon = parts[2].trim();\n const position = {\n latitude:\n ((lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim())) / 100,\n longitude:\n ((lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1).trim())) / 100,\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.altitude(decodeResult, Number(parts[7]));\n ResultFormatter.unknownArr(decodeResult, [\n parts[0],\n ...parts.slice(3, 7),\n ...parts.slice(8),\n ]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_10_Slash extends DecoderPlugin {\n name = 'label-10-slash';\n\n qualifiers() {\n return {\n labels: ['10'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n if (parts.length < 17) {\n if (options.debug) {\n console.log(`Decoder: Unknown 10 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = parts[1];\n const lon = parts[2];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.heading(decodeResult, Number(parts[5]));\n ResultFormatter.altitude(decodeResult, 100 * Number(parts[6]));\n ResultFormatter.arrivalAirport(decodeResult, parts[7]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[8]),\n );\n const waypoints: Waypoint[] = [\n {\n name: parts[11],\n },\n {\n name: parts[12],\n time: DateTimeUtils.convertHHMMSSToTod(parts[13]),\n timeFormat: 'tod',\n },\n {\n name: parts[14],\n time: DateTimeUtils.convertHHMMSSToTod(parts[15]),\n timeFormat: 'tod',\n },\n ];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n\n if (parts[16]) {\n ResultFormatter.departureAirport(decodeResult, parts[16]);\n }\n\n ResultFormatter.unknownArr(\n decodeResult,\n [parts[3], parts[4], ...parts.slice(9, 11), ...parts.slice(17)],\n '/',\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_12_N_Space extends DecoderPlugin {\n name = 'label-12-n-space';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*),.(?<airframe>.*),(?<unkwn3>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 12 N : results');\n console.log(results);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n });\n\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n results.groups.unkwn3,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_12_POS extends DecoderPlugin {\n name = 'label-12-pos';\n\n qualifiers() {\n return {\n labels: ['12'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split(',');\n if (!message.text.startsWith('POS') || data.length !== 12) {\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const lat = data[0].substring(0, 8);\n const lon = data[0].substring(8);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lat.substring(1, 4)),\n Number(lat.substring(4, 6)),\n Number(lat.substring(6, 8)),\n ),\n longitude:\n CoordinateUtils.getDirection(lon[0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(lon.substring(1, 4)),\n Number(lon.substring(4, 6)),\n Number(lon.substring(6, 8)),\n ),\n });\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n ResultFormatter.altitude(decodeResult, 10 * Number(data[3]));\n ResultFormatter.unknownArr(decodeResult, data.slice(4, 7));\n ResultFormatter.currentFuel(\n decodeResult,\n Number(data[7].substring(3).trim()),\n ); // strip FOB\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[8].substring(3).trim()),\n ); // strip ETA\n ResultFormatter.departureAirport(decodeResult, data[9]);\n ResultFormatter.arrivalAirport(decodeResult, data[10]);\n ResultFormatter.unknown(decodeResult, data[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_13Through18_Slash extends DecoderPlugin {\n name = 'label-13-18-slash';\n\n qualifiers() {\n return {\n labels: ['13', '14', '15', '16', '17', '18'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n const parts = lines[0].split('/');\n const labelNumber = Number(parts[1].substring(0, 2));\n decodeResult.formatted.description = getMsgType(labelNumber);\n\n // labels 13-17 have 4 parts, label 18 has 7 parts\n if (\n (labelNumber !== 18 && parts.length !== 4) ||\n (labelNumber === 18 && parts.length !== 7)\n ) {\n if (options?.debug) {\n console.log(`Decoder: Unknown OOOI message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n // parts[0] === ''\n const data = parts[2].split(' ');\n ResultFormatter.departureAirport(decodeResult, data[1]);\n ResultFormatter.arrivalAirport(decodeResult, data[2]);\n decodeResult.raw.day = Number(data[3]);\n const time = DateTimeUtils.convertHHMMSSToTod(data[4]);\n if (labelNumber === 13) {\n ResultFormatter.out(decodeResult, time);\n } else if (labelNumber === 14) {\n ResultFormatter.off(decodeResult, time);\n } else if (labelNumber === 15) {\n ResultFormatter.on(decodeResult, time);\n } else if (labelNumber === 16) {\n ResultFormatter.in(decodeResult, time);\n }\n\n if (parts.length === 7) {\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), '/');\n }\n\n for (let i = 1; i < lines.length; i++) {\n if (lines[i].startsWith('/LOC')) {\n const location = lines[i].substring(5).split(','); // strip off '/LOC'\n let position;\n if (location[0].startsWith('+') || location[0].startsWith('-')) {\n position = {\n latitude: Number(location[0]),\n longitude: Number(location[1]),\n };\n } else {\n position = {\n latitude:\n CoordinateUtils.getDirection(location[0][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[0].substring(1, 3)),\n Number(location[0].substring(3, 5)),\n Number(location[0].substring(5, 7)),\n ),\n longitude:\n CoordinateUtils.getDirection(location[1][0]) *\n CoordinateUtils.dmsToDecimalDegrees(\n Number(location[1].substring(1, 4)),\n Number(location[1].substring(4, 6)),\n Number(location[1].substring(6, 8)),\n ),\n };\n }\n ResultFormatter.position(decodeResult, position);\n } else {\n ResultFormatter.unknown(decodeResult, lines[i], '\\r\\n');\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text\n ? 'partial'\n : 'full';\n return decodeResult;\n }\n}\n\nfunction getMsgType(labelNumber: number): string {\n if (labelNumber === 13) {\n return 'Out of Gate Report';\n }\n if (labelNumber === 14) {\n return 'Takeoff Report';\n }\n if (labelNumber === 15) {\n return 'On Ground Report';\n }\n if (labelNumber === 16) {\n return 'In Gate Report';\n }\n if (labelNumber === 17) {\n return 'Post Report';\n }\n if (labelNumber === 18) {\n return 'Post Times Report';\n }\n\n return 'Unknown';\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_15 extends DecoderPlugin {\n name = 'label-15';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (message.text.startsWith('(2') && message.text.endsWith('(Z')) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(0, 13),\n ),\n );\n if (between.length === 25) {\n // short variant\n ResultFormatter.unknown(decodeResult, between.substring(13, 19));\n const alt = between.substring(19, 22);\n if (alt != '---') {\n ResultFormatter.altitude(decodeResult, 100 * Number(alt));\n }\n ResultFormatter.temperature(\n decodeResult,\n between.substring(22).replaceAll(' ', '0'),\n );\n } else if (between.substring(13, 16) === 'OFF') {\n // off variant\n const ddmmyy = between.substring(16, 22);\n const hhmm = between.substring(22, 26);\n if (ddmmyy != '------') {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(hhmm + '00', ddmmyy),\n 'epoch',\n );\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmm),\n 'tod',\n );\n }\n ResultFormatter.unknown(decodeResult, between.substring(26));\n } else {\n ResultFormatter.unknown(decodeResult, between.substring(26));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 15 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_15_FST extends DecoderPlugin {\n name = 'label-15-fst';\n\n qualifiers() {\n return {\n labels: ['15'],\n preambles: ['FST01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split(' ');\n // FST01KMCOEGKKN505552W00118021\n const header = parts[0];\n\n const stringCoords = header.substring(13);\n // Don't use decodeStringCoordinates here, because of different pos format\n\n const firstChar = stringCoords.substring(0, 1);\n const middleChar = stringCoords.substring(7, 8);\n decodeResult.raw.position = {};\n\n if (\n (firstChar === 'N' || firstChar === 'S') &&\n (middleChar === 'W' || middleChar === 'E')\n ) {\n const lat =\n (Number(stringCoords.substring(1, 7)) / 10000) *\n (firstChar === 'S' ? -1 : 1);\n const lon =\n (Number(stringCoords.substring(8, 15)) / 10000) *\n (middleChar === 'W' ? -1 : 1);\n ResultFormatter.position(decodeResult, { latitude: lat, longitude: lon });\n ResultFormatter.altitude(\n decodeResult,\n Number(stringCoords.substring(15)) * 100,\n );\n } else {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), ' ');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Honeywell Label 16 Position Report\nexport class Label_16_Honeywell extends DecoderPlugin {\n name = 'label-16-honeywell';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (\n message.text.startsWith('(2') &&\n message.text.endsWith('(Z') &&\n message.text.length >= 29\n ) {\n const between = message.text.substring(2, message.text.length - 2);\n ResultFormatter.unknown(decodeResult, between.substring(0, 4), ''); // Session ID\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n between.substring(4, 17),\n ),\n );\n if (between.charAt(17) === '-') {\n // Waypoint mode\n const waypoint1 = between.substring(18, 23).trim();\n const waypoint2 = between.substring(23, 28).trim();\n if (waypoint2) {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }, { name: waypoint2 }],\n });\n } else {\n ResultFormatter.route(decodeResult, {\n waypoints: [{ name: waypoint1 }],\n });\n }\n } else {\n // Route mode\n ResultFormatter.departureAirport(\n decodeResult,\n between.substring(17, 21),\n );\n ResultFormatter.arrivalAirport(decodeResult, between.substring(21, 25));\n //ignore the rest (should just be '-')\n }\n /*\n const phases: { [key: string]: string } = {\n '/O': 'En Route',\n '/A': 'Arrival',\n '/D': 'Departure',\n '/P': 'Preflight',\n '/C': 'Climb',\n };\n */\n ResultFormatter.unknown(\n decodeResult,\n between.substring(between.length - 2),\n '',\n );\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 Honeywell message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_N_Space extends DecoderPlugin {\n name = 'label-16-n-space';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['N ', 'S '],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: N 44.203,W 86.546,31965,6, 290\n let variant1Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*)$/;\n\n // Style: N 28.177/W 96.055\n let variant2Regex =\n /^(?<lat>[NS])\\s(?<lat_coord>.*)\\/(?<long>[EW])\\s*(?<long_coord>.*)$/;\n\n let results = message.text.match(variant1Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n const altitude =\n results.groups.alt == 'GRD' || results.groups.alt == '***'\n ? 0\n : Number(results.groups.alt);\n\n ResultFormatter.position(decodeResult, pos);\n ResultFormatter.altitude(decodeResult, altitude);\n\n ResultFormatter.unknownArr(decodeResult, [\n results.groups.unkwn1,\n results.groups.unkwn2,\n ]);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n\n results = message.text.match(variant2Regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 16 N : results');\n console.log(results);\n }\n\n let pos = {\n latitude:\n Number(results.groups.lat_coord) *\n (results.groups.lat == 'N' ? 1 : -1),\n longitude:\n Number(results.groups.long_coord) *\n (results.groups.long == 'E' ? 1 : -1),\n };\n\n ResultFormatter.position(decodeResult, pos);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_POSA1 extends DecoderPlugin {\n name = 'label-16-posa1';\n\n qualifiers() {\n return {\n labels: ['16'],\n preambles: ['POSA1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n if (fields.length !== 11 || !fields[0].startsWith('POSA1')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(5)),\n ); // strip 'POSA1'\n const waypoint = fields[1].trim();\n const time = DateTimeUtils.convertHHMMSSToTod(fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]) * 100);\n const nextWaypoint = fields[4].trim();\n const nextTime = DateTimeUtils.convertHHMMSSToTod(fields[5]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(6), ',');\n ResultFormatter.route(decodeResult, {\n waypoints: [\n { name: waypoint, time: time, timeFormat: 'tod' },\n { name: nextWaypoint, time: nextTime, timeFormat: 'tod' },\n ],\n });\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_16_TOD extends DecoderPlugin {\n name = 'label-16-tod';\n\n qualifiers() {\n return {\n labels: ['16'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n const time = DateTimeUtils.convertHHMMSSToTod(fields[0]);\n if (fields.length !== 5 || Number.isNaN(time)) {\n if (options.debug) {\n console.log(`Decoder: Unknown 16 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.time_of_day(decodeResult, time);\n if (fields[1] !== '') {\n ResultFormatter.altitude(decodeResult, Number(fields[1]));\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n const temp = fields[4].split('/');\n const posFields = temp[0].split(' ');\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(posFields[0]) * Number(posFields[1]),\n longitude:\n CoordinateUtils.getDirection(posFields[2]) * Number(posFields[3]),\n });\n\n if (temp.length > 1) {\n ResultFormatter.flightNumber(decodeResult, temp[1]);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecodeResult } from '../DecoderPluginInterface';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\nexport class FlightPlanUtils {\n /**\n * Processes flight plan data\n *\n * Expected format is [header, key1, val1, ... keyN, valN]\n *\n * @param decodeResult - results\n * @param data - original message split by ':'\n * @returns whether all fields were processed or not\n */\n public static processFlightPlan(\n decodeResult: DecodeResult,\n data: string[],\n ): boolean {\n let allKnownFields = FlightPlanUtils.parseHeader(decodeResult, data[0]);\n for (let i = 1; i < data.length; i += 2) {\n const key = data[i];\n const value = data[i + 1];\n // TODO: discuss how store commented out bits as both raw and formatted\n switch (key) {\n case 'A': // Arrival Procedure (?)\n FlightPlanUtils.addProcedure(decodeResult, value, 'arrival');\n break;\n case 'AA':\n addArrivalAirport(decodeResult, value);\n break;\n case 'AP':\n FlightPlanUtils.addProcedure(decodeResult, value, 'approach');\n break;\n case 'CR':\n addCompanyRoute(decodeResult, value);\n break;\n case 'D': // Departure Procedure\n FlightPlanUtils.addProcedure(decodeResult, value, 'departure');\n break;\n case 'DA':\n addDepartureAirport(decodeResult, value);\n break;\n case 'F': // First Waypoint\n addRoute(decodeResult, value);\n break;\n case 'FP':\n ResultFormatter.flightPlan(decodeResult, value.trim());\n break;\n case 'R':\n addRunway(decodeResult, value);\n break;\n // case 'WS': // something about routes, has altitude, so current parsing won't work\n // break;\n default:\n if (allKnownFields) {\n decodeResult.remaining.text = '';\n allKnownFields = false;\n }\n decodeResult.remaining.text += `:${key}:${value}`;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return allKnownFields;\n }\n public static parseHeader(\n decodeResult: DecodeResult,\n header: string,\n ): boolean {\n let allKnownFields = true;\n if (header.startsWith('RF')) {\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Filed',\n });\n decodeResult.raw.route_status = 'RF';\n if (header.length > 2) {\n addRoute(decodeResult, header.substring(2));\n }\n } else if (header.startsWith('RP')) {\n decodeResult.raw.route_status = 'RP';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Planned',\n });\n decodeResult.raw.route_status = header;\n } else if (header.startsWith('RI')) {\n decodeResult.raw.route_status = 'RI';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Inactive',\n });\n } else if (header.startsWith('RM')) {\n decodeResult.raw.route_status = 'RM';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Mapped',\n });\n } else if (header.startsWith('RS')) {\n decodeResult.raw.route_status = 'RS';\n decodeResult.formatted.items.push({\n type: 'status',\n code: 'ROUTE_STATUS',\n label: 'Route Status',\n value: 'Route Saved',\n });\n } else {\n decodeResult.remaining.text += header;\n allKnownFields = false;\n }\n return allKnownFields;\n }\n\n public static addProcedure(\n decodeResult: DecodeResult,\n value: string,\n type: string,\n ) {\n if (decodeResult.raw.procedures === undefined) {\n decodeResult.raw.procedures = [];\n }\n const data = value.split('.');\n let waypoints;\n if (data.length > 1) {\n waypoints = data.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n const route = { name: data[0], waypoints: waypoints };\n decodeResult.raw.procedures.push({ type: type, route: route });\n const procedureName = type.substring(0, 1).toUpperCase() + type.slice(1);\n decodeResult.formatted.items.push({\n type: 'procedure',\n code: 'proc',\n label: `${procedureName} Procedure`,\n value: RouteUtils.routeToString(route),\n });\n }\n}\n\nfunction addArrivalAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.arrivalAirport(decodeResult, value);\n}\n\nfunction addDepartureAirport(decodeResult: DecodeResult, value: string) {\n ResultFormatter.departureAirport(decodeResult, value);\n}\n\nfunction addRunway(decodeResult: DecodeResult, value: string) {\n // xxx(yyy) where xxx is the departure runway and yyy is the arrival runway\n if (value.length === 8) {\n ResultFormatter.arrivalRunway(decodeResult, value.substring(4, 7));\n }\n\n ResultFormatter.departureRunway(decodeResult, value.substring(0, 3));\n}\n\nfunction addRoute(decodeResult: DecodeResult, value: string) {\n const route = value.split('.');\n ResultFormatter.route(decodeResult, {\n waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)),\n });\n}\n\nfunction addCompanyRoute(decodeResult: DecodeResult, value: string) {\n const segments = value.split('.');\n const parens_idx = segments[0].indexOf('(');\n let name;\n let runway;\n if (parens_idx === -1) {\n name = segments[0];\n } else {\n name = segments[0].slice(0, parens_idx);\n runway = segments[0].slice(parens_idx + 1, segments[0].indexOf(')'));\n }\n let waypoints;\n if (segments.length > 1) {\n waypoints = segments.slice(1).map((leg) => RouteUtils.getWaypoint(leg));\n }\n decodeResult.raw.company_route = {\n name: name,\n runway: runway,\n waypoints: waypoints,\n };\n decodeResult.formatted.items.push({\n type: 'company_route',\n code: 'CR',\n label: 'Company Route',\n value: RouteUtils.routeToString(decodeResult.raw.company_route),\n });\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecodeResult } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from './coordinate_utils';\nimport { FlightPlanUtils } from './flight_plan_utils';\nimport { ResultFormatter } from './result_formatter';\nimport { RouteUtils } from './route_utils';\n\nexport class H1Helper {\n public static decodeH1Message(decodeResult: DecodeResult, message: string) {\n const checksum = parseInt(message.slice(-4), 16);\n const data = message.slice(0, message.length - 4);\n let checksumAlgorithmUsed = '';\n if (crc16IbmSdlcRev(data) === checksum) {\n // ACARS/VDL2/HFDL/Iridium\n checksumAlgorithmUsed = 'IBM-SDLC reversed';\n } else if (crc16Genibus(data) === checksum) {\n // inmarsat\n checksumAlgorithmUsed = 'GENIBUS';\n } else {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n const fields = data.split('/');\n const canDecode = parseMessageType(decodeResult, fields[0]);\n if (!canDecode) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return false;\n }\n for (let i = 1; i < fields.length; ++i) {\n const key = fields[i].substring(0, 2);\n const data = fields[i].substring(2);\n switch (key) {\n case 'AF':\n processAirField(decodeResult, data.split(','));\n break;\n case 'AK':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processAK(decodeResult, data.split(','));\n break;\n case 'CG':\n processCenterOfGravity(decodeResult, data.split(','));\n break;\n case 'DC':\n processDateCode(decodeResult, data.split(','));\n break;\n case 'DI':\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n // processDI(decodeResult, data.split(','));\n break;\n case 'DT': //processDestination?\n processDT(decodeResult, data.split(','));\n break;\n case 'DQ':\n ResultFormatter.desiredAltitude(\n decodeResult,\n parseInt(data, 10) * 100,\n );\n // processDQ(decodeResult, data.split(','));\n break;\n case 'ET':\n processETA(data, decodeResult, fields, i);\n break;\n case 'FB':\n ResultFormatter.currentFuel(decodeResult, parseInt(data, 10));\n break;\n case 'FN':\n decodeResult.raw.flight_number = data;\n break;\n case 'FX':\n ResultFormatter.freetext(decodeResult, data);\n break;\n case 'GA':\n ResultFormatter.groundAddress(decodeResult, data);\n break;\n case 'ID':\n processIdentification(decodeResult, data.split(','));\n break;\n case 'LR':\n processLandingReport(decodeResult, data.split(','));\n break;\n case 'PR':\n // TODO: decode /PR fields\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n break;\n case 'PS': // Position\n H1Helper.processPS(decodeResult, data.split(','));\n break;\n case 'RF':\n case 'RI':\n case 'RM':\n case 'RP':\n case 'RS':\n // TODO - use key/data instead of whole message\n FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(':'));\n break;\n case 'RN':\n ResultFormatter.routeNumber(decodeResult, data);\n break;\n case 'RW':\n processRunway(decodeResult, data.split(':'));\n break;\n case 'SN':\n decodeResult.raw.serial_number = data;\n break;\n case 'SP':\n ResultFormatter.startPoint(decodeResult, data);\n break;\n case 'TD':\n processTimeOfDeparture(decodeResult, data.split(','));\n break;\n case 'TS':\n H1Helper.processTimeStamp(decodeResult, data.split(','));\n break;\n case 'VR':\n ResultFormatter.version(decodeResult, parseInt(data, 10) / 10);\n break;\n case 'WD':\n processWindData(decodeResult, data);\n break;\n case 'WQ':\n processWeatherQuery(decodeResult, data.split(':'));\n break;\n default:\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n }\n\n ResultFormatter.checksumAlgorithm(decodeResult, checksumAlgorithmUsed);\n ResultFormatter.checksum(decodeResult, checksum);\n\n return true;\n }\n\n public static processPS(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length === 9) {\n // variant 7\n processRoute(decodeResult, data[3], data[1], data[5], data[4], undefined);\n ResultFormatter.altitude(decodeResult, Number(data[2]) * 100);\n ResultFormatter.temperature(decodeResult, data[6]);\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n }\n if (data.length === 14) {\n // variant 2\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n }\n\n public static processPosition(decodeResult: DecodeResult, data: string[]) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n data[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n if (data.length >= 10) {\n // variant 1, short\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[1], data[2], data[4], data[5], data[6]);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n ResultFormatter.unknown(decodeResult, data[9]);\n }\n if (data.length >= 14) {\n // variant 2,long\n ResultFormatter.unknownArr(decodeResult, data.slice(10));\n }\n }\n\n public static processTimeStamp(decodeResult: DecodeResult, data: string[]) {\n if (data.length > 2) {\n const positionData = data.slice(1);\n positionData[0] = positionData[0].substring(6); // strip time from position field\n this.processPosition(decodeResult, positionData);\n }\n let time = DateTimeUtils.convertDateTimeToEpoch(\n data[0],\n data[1].substring(0, 6),\n );\n\n if (Number.isNaN(time)) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[1].substring(2, 4) +\n data[1].substring(0, 2) +\n data[1].substring(4, 6);\n time = DateTimeUtils.convertDateTimeToEpoch(data[0], date);\n }\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processETA(\n data: string,\n decodeResult: DecodeResult,\n fields: string[],\n i: number,\n) {\n if (data.length === 5) {\n // 1 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 1)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(1)),\n );\n } else if (data.length === 6) {\n // 2 digit day\n ResultFormatter.day(decodeResult, Number(data.substring(0, 2)));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data.substring(2)),\n );\n } else {\n ResultFormatter.unknown(decodeResult, fields[i], '/');\n }\n}\n\nfunction processAirField(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n ResultFormatter.departureAirport(decodeResult, data[0]);\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), 'AF/');\n }\n}\nfunction processTimeOfDeparture(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 2) {\n decodeResult.raw.plannedDepartureTime = data[0]; //DDHHMM\n decodeResult.formatted.items.push({\n type: 'ptd',\n code: 'ptd',\n label: 'Planned Departure Time',\n value: `YYYY-MM-${data[0].substring(0, 2)}T${data[0].substring(2, 4)}:${data[0].substring(4)}:00Z`,\n });\n\n decodeResult.raw.plannedDepartureTime = data[1]; //HHMM\n decodeResult.formatted.items.push({\n type: 'etd',\n code: 'etd',\n label: 'Estimated Departure Time',\n value: `${data[1].substring(0, 2)}:${data[1].substring(2)}`,\n });\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','), '/TD');\n }\n}\n\nfunction processIdentification(decodeResult: DecodeResult, data: string[]) {\n ResultFormatter.tail(decodeResult, data[0]);\n if (data.length > 1) {\n ResultFormatter.flightNumber(decodeResult, data[1]);\n }\n if (data.length > 2) {\n //TODO: figure out what this is\n decodeResult.raw.mission_number = data[2];\n }\n}\n\nfunction processDT(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 9) {\n ResultFormatter.unknown(decodeResult, data[0]);\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[1]);\n }\n ResultFormatter.arrivalRunway(decodeResult, data[2]);\n ResultFormatter.currentFuel(decodeResult, parseInt(data[3], 10));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4]),\n );\n ResultFormatter.unknown(decodeResult, data[5]);\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(data[6]),\n );\n ResultFormatter.unknown(decodeResult, data[7]);\n ResultFormatter.unknown(decodeResult, data[8]);\n return;\n }\n if (data.length === 4 || data.length === 5) {\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[0]);\n }\n ResultFormatter.arrivalRunway(decodeResult, data[1]);\n ResultFormatter.currentFuel(decodeResult, parseInt(data[2], 10));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[3]),\n );\n if (data.length > 4) {\n ResultFormatter.remainingFuel(decodeResult, Number(data[4]));\n }\n return;\n }\n ResultFormatter.unknownArr(decodeResult, data, ',');\n}\n\nfunction processLandingReport(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 19) {\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.arrivalRunway(decodeResult, data[5]);\n ResultFormatter.unknown(decodeResult, data.slice(6, 19).join(','));\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\nfunction processCenterOfGravity(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10);\n }\n } else if (data.length === 3) {\n if (data[0] !== undefined && data[0] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[0], 10) / 10, 'center');\n }\n if (data[1] !== undefined && data[1] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[1], 10) / 10, 'lower');\n }\n if (data[2] !== undefined && data[2] !== '') {\n ResultFormatter.cg(decodeResult, parseInt(data[2], 10) / 10, 'upper');\n }\n } else {\n ResultFormatter.unknown(decodeResult, data.join(','));\n }\n}\n\nfunction parseMessageType(\n decodeResult: DecodeResult,\n messagePart: string,\n): boolean {\n const messageParts = messagePart.split(',');\n const messageType = messageParts[0];\n if (messageType.startsWith('POS')) {\n H1Helper.processPosition(decodeResult, messagePart.substring(3).split(','));\n return processMessageType(decodeResult, 'POS');\n } else if (messageType.length === 6) {\n const part1 = processMessageType(decodeResult, messageType.substring(0, 3));\n const description = decodeResult.formatted.description;\n const part2 = processMessageType(decodeResult, messageType.substring(3, 6));\n decodeResult.formatted.description =\n description + ' for ' + decodeResult.formatted.description;\n if (messageParts.length > 1) {\n // TODO handle REJPWI/REJPOS\n ResultFormatter.unknown(\n decodeResult,\n messageParts.slice(1).join(','),\n '/',\n );\n }\n return part1 && part2;\n }\n\n if (messageParts.length > 1) {\n // TODO handle\n ResultFormatter.unknown(decodeResult, messageParts.slice(1).join(','), '/');\n }\n\n return processMessageType(decodeResult, messageType);\n}\n\nfunction processMessageType(decodeResult: DecodeResult, type: string): boolean {\n if (type === 'FPN') {\n decodeResult.formatted.description = 'Flight Plan';\n } else if (type === 'FTX') {\n decodeResult.formatted.description = 'Free Text';\n } else if (type === 'INI') {\n decodeResult.formatted.description = 'Initial Report';\n } else if (type === 'INR') {\n decodeResult.formatted.description = 'In-Range Report';\n } else if (type === 'LDI') {\n decodeResult.formatted.description = 'Load Distribution Information';\n } else if (type === 'PER') {\n decodeResult.formatted.description = 'Performance Report';\n } else if (type === 'POS') {\n decodeResult.formatted.description = 'Position Report';\n } else if (type === 'PRG') {\n decodeResult.formatted.description = 'Progress Report';\n } else if (type === 'PWI') {\n decodeResult.formatted.description = 'Pilot Weather Information';\n } else if (type === 'WXR') {\n decodeResult.formatted.description = 'Weather Report';\n } else if (type === 'REJ') {\n decodeResult.formatted.description = 'Reject';\n } else if (type === 'REQ') {\n decodeResult.formatted.description = 'Request';\n } else if (type === 'RES') {\n decodeResult.formatted.description = 'Response';\n } else {\n decodeResult.formatted.description = 'Unknown H1 Message';\n return false;\n }\n return true;\n}\n\nfunction processDateCode(decodeResult: DecodeResult, data: string[]) {\n if (data.length === 1) {\n // noop?\n } else if (data.length === 2) {\n // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date =\n data[0].substring(2, 4) +\n data[0].substring(0, 2) +\n data[0].substring(4, 6);\n const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS\n\n decodeResult.raw.message_timestamp = time;\n }\n}\n\nfunction processWeatherQuery(decodeResult: DecodeResult, data: string[]) {\n if (data.length !== 2) {\n ResultFormatter.unknown(decodeResult, data.join(':'), 'WQ/');\n return;\n }\n\n const alts = data[0].split('.');\n const route = data[1].split('.');\n\n ResultFormatter.requestedAltitudes(\n decodeResult,\n alts.map((a) => parseInt(a, 10) * 100),\n );\n\n const waypoints = route.map((wp) => {\n return { name: wp };\n });\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processRoute(\n decodeResult: DecodeResult,\n last: string,\n time: string,\n next: string,\n eta: string,\n then?: string,\n date?: string,\n) {\n const lastTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(time, date)\n : DateTimeUtils.convertHHMMSSToTod(time);\n const nextTime = date\n ? DateTimeUtils.convertDateTimeToEpoch(eta, date)\n : DateTimeUtils.convertHHMMSSToTod(eta);\n const timeFormat = date ? 'epoch' : 'tod';\n\n const lastWaypoint = RouteUtils.getWaypoint(last);\n lastWaypoint.time = lastTime;\n lastWaypoint.timeFormat = timeFormat;\n\n const nextWaypoint = RouteUtils.getWaypoint(next);\n nextWaypoint.time = nextTime;\n nextWaypoint.timeFormat = timeFormat;\n\n const thenWaypoint = RouteUtils.getWaypoint(then || '?');\n\n const waypoints: Waypoint[] = [lastWaypoint, nextWaypoint, thenWaypoint];\n ResultFormatter.route(decodeResult, { waypoints: waypoints });\n}\n\nfunction processWindData(decodeResult: DecodeResult, message: string) {\n const wind = [] as Wind[];\n\n const flightLevel = Number(message.slice(0, 3));\n const fields = message.slice(4).split('.'); // strip off altitude and comma\n fields.forEach((field) => {\n if (field.length < 4) {\n // probably need a more robust check to determine to skip\n return;\n }\n const data = field.split(',');\n const waypoint = { name: data[0] };\n const windData = data[1];\n const windDirection = parseInt(windData.slice(0, 3), 10);\n const windSpeed = parseInt(windData.slice(3), 10);\n\n if (data.length === 3) {\n const tempData = data[2];\n const tempFlightLevel = Number(tempData.slice(0, 3));\n const tempString = tempData.slice(3);\n const tempDegrees =\n Number(tempString.substring(1)) *\n (tempString.charAt(0) === 'M' ? -1 : 1);\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: tempFlightLevel,\n degreesC: tempDegrees,\n },\n });\n } else {\n wind.push({\n waypoint: waypoint,\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n });\n }\n });\n\n ResultFormatter.windData(decodeResult, wind);\n}\n\nfunction processRunway(decodeResult: DecodeResult, data: string[]) {\n //FIXME - figure out names\n const parts = data[0].split('.');\n const more = parts[0].split(',');\n\n ResultFormatter.departureRunway(decodeResult, more[0]);\n ResultFormatter.unknownArr(decodeResult, more.slice(1), ',');\n ResultFormatter.unknownArr(decodeResult, parts.slice(1), '.');\n ResultFormatter.departureAirport(decodeResult, data[1].split(',')[0]);\n ResultFormatter.unknownArr(decodeResult, data[1].split(',').slice(1), ',');\n //ResultFormatter.unknownArr(decodeResult, data.slice(2), ':');\n}\n\n// CRC-16/IBM-SDLC but nibbles are reversed\nfunction crc16IbmSdlcRev(data: string): number {\n let crc = 0xffff;\n const bytes = Buffer.from(data, 'ascii');\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x0001) !== 0) {\n crc = (crc >>> 1) ^ 0x8408;\n } else {\n crc = crc >>> 1;\n }\n }\n }\n crc = (crc ^ 0xffff) & 0xffff;\n\n const nibble1 = (crc >> 12) & 0xf;\n const nibble2 = (crc >> 8) & 0xf;\n const nibble3 = (crc >> 4) & 0xf;\n const nibble4 = crc & 0xf;\n\n return (nibble4 << 12) | (nibble3 << 8) | (nibble2 << 4) | nibble1;\n}\n\n/**\n * Calculates the CRC-16/GENIBUS checksum for a given Uint8Array.\n * @param data The input data as a byte array.\n * @returns The 16-bit checksum as a number.\n */\nfunction crc16Genibus(data: string): number {\n let crc = 0xffff;\n const polynomial = 0x1021;\n\n const bytes = Buffer.from(data, 'ascii');\n\n for (const byte of bytes) {\n crc ^= byte << 8;\n\n for (let i = 0; i < 8; i++) {\n if ((crc & 0x8000) !== 0) {\n crc = ((crc << 1) ^ polynomial) & 0xffff;\n } else {\n crc = (crc << 1) & 0xffff;\n }\n }\n }\n\n return (crc ^ 0xffff) & 0xffff;\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1J_2J_FTX extends DecoderPlugin {\n name = 'label-1j-2j-ftx';\n qualifiers() {\n return {\n labels: ['1J', '2J'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, '');\n const parts = msg.split('/');\n let decoded = false;\n if (parts[0].length > 3) {\n decoded = H1Helper.decodeH1Message(\n decodeResult,\n msg.slice(parts[0].length - 3),\n );\n // flight number is already decoded in other fields\n decodeResult.remaining.text =\n parts[0].slice(0, 3) + '/' + decodeResult.remaining.text;\n } else {\n decoded = H1Helper.decodeH1Message(decodeResult, msg);\n }\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1J/2J message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1M_Slash extends DecoderPlugin {\n name = 'label-1m-slash';\n\n qualifiers() {\n return {\n labels: ['1M'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /BA0843/ETA01/230822/LDSP/EGLL/EGSS/2JK0(NEW LINE)1940/EGLL27L/10\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 1M ETA: results');\n console.log(results);\n }\n\n decodeResult.raw.flight_number = results[0];\n // results[1]: ETA01 (???)\n // results[2]: 230822 - UTC date of eta\n ResultFormatter.departureAirport(decodeResult, results[3]);\n ResultFormatter.arrivalAirport(decodeResult, results[4]);\n ResultFormatter.alternateAirport(decodeResult, results[5]);\n // results[6]: 2JK0 (???)\n // results[7] 1940 - UTC eta\n ResultFormatter.arrivalRunway(\n decodeResult,\n results[8].replace(results[4], ''),\n ); // results[8] EGLL27L\n // results[9]: 10(space) (???)\n\n const yymmdd = results[2];\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertDateTimeToEpoch(\n results[7] + '00',\n yymmdd.substring(4, 6) +\n yymmdd.substring(2, 4) +\n yymmdd.substring(0, 2),\n ),\n 'epoch',\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_3Line extends DecoderPlugin {\n name = 'label-1l-3-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const lines = message.text.split('\\r\\n');\n if (lines.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n const parts = message.text.replaceAll('\\r\\n', '/').split('/');\n const data = new Map<string, string>();\n data.set('', parts[0]);\n for (let i = 1; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const dep = data.get('DEP');\n if (dep) {\n ResultFormatter.departureAirport(decodeResult, dep);\n data.delete('DEP');\n }\n const des = data.get('DES');\n if (des) {\n ResultFormatter.arrivalAirport(decodeResult, des);\n data.delete('DES');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fn = data.get('FN');\n if (fn) {\n ResultFormatter.flightNumber(decodeResult, fn);\n data.delete('FN');\n }\n const day = data.get('DAY');\n const utc = data.get('UTC');\n if (day && utc) {\n decodeResult.raw.message_timestamp =\n Date.parse(day + ' GMT+0000') / 1000 +\n DateTimeUtils.convertHHMMSSToTod(utc);\n data.delete('DAY');\n data.delete('UTC');\n }\n\n const lat = data.get('LAT');\n const lon = data.get('LON');\n if (lat && lon) {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n data.delete('LAT');\n data.delete('LON');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n if (key === '') {\n remaining += value;\n } else {\n remaining += `/${key} ${value}`;\n }\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_070 extends DecoderPlugin {\n name = 'label-1l-070';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000070'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000070')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, parts[0]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(parts[4][0]) *\n Number(parts[4].substring(1)),\n longitude:\n CoordinateUtils.getDirection(parts[5][0]) *\n Number(parts[5].substring(1)),\n });\n\n decodeResult.remaining.text = parts[6];\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_660 extends DecoderPlugin {\n name = 'label-1l-660';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['000000660'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n if (!message.text.startsWith('000000660')) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const parts = message.text.substring(9).split(',');\n\n if (parts.length !== 5) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n parts[0],\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n const hhmmss = parts[1].substring(0, 6);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(hhmmss),\n );\n const fl = parts[1].substring(6, 9);\n ResultFormatter.altitude(decodeResult, Number(fl) * 100);\n const next = parts[1].substring(9);\n ResultFormatter.route(decodeResult, { waypoints: [{ name: next.trim() }] });\n\n decodeResult.remaining.text = parts.slice(2).join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_1L_Slash extends DecoderPlugin {\n name = 'label-1l-1-line';\n\n qualifiers() {\n return {\n labels: ['1L'],\n preambles: ['+', '-'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/');\n\n if (parts.length !== 7) {\n if (options.debug) {\n console.log(`Decoder: Unknown 1L message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const data = new Map<string, string>();\n data.set('LAT', parts[0].replaceAll(' ', ''));\n data.set('LON', parts[1].replaceAll(' ', ''));\n for (let i = 2; i < parts.length; i++) {\n const part = parts[i].split(' ');\n data.set(part[0], part.slice(1).join(' '));\n }\n\n const position = {\n latitude: Number(data.get('LAT')),\n longitude: Number(data.get('LON')),\n };\n data.delete('LAT');\n data.delete('LON');\n\n ResultFormatter.position(decodeResult, position);\n const utc = data.get('UTC');\n if (utc) {\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(utc),\n );\n data.delete('UTC');\n }\n const alt = data.get('ALT');\n if (alt) {\n ResultFormatter.altitude(decodeResult, Number(alt));\n data.delete('ALT');\n }\n const fob = data.get('FOB');\n if (fob) {\n ResultFormatter.currentFuel(decodeResult, Number(fob));\n data.delete('FOB');\n }\n const eta = data.get('ETA');\n if (eta) {\n ResultFormatter.eta(decodeResult, DateTimeUtils.convertHHMMSSToTod(eta));\n data.delete('ETA');\n }\n\n let remaining = '';\n for (const [key, value] of data.entries()) {\n remaining += `/${key} ${value}`;\n }\n decodeResult.remaining.text = remaining;\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_20_POS extends DecoderPlugin {\n name = 'label-20-pos';\n\n qualifiers() {\n return {\n labels: ['20'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 11) {\n // N38160W077075,,211733,360,OTT,212041,,N42,19689,40,544\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Variation 1 detected`);\n }\n // Field 1: Coordinates\n const rawCoords = fields[0];\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(rawCoords),\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else if (fields.length == 5) {\n // N38160W077075,,211733,360,OTT\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Variation 2 detected`);\n }\n // Field 1: Coordinates\n const position = CoordinateUtils.decodeStringCoordinates(fields[0]);\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_21_POS extends DecoderPlugin {\n name = 'label-21-pos';\n\n qualifiers() {\n return {\n labels: ['21'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n decodeResult.raw.preamble = message.text.substring(0, 3);\n\n const content = message.text.substring(3);\n const fields = content.split(',');\n\n if (fields.length == 9) {\n // POSN 37.550W 76.436, 98,110800,23961,25820, 65,-23,114212,KRDU\n processPosition(decodeResult, fields[0].trim());\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.temperature(decodeResult, fields[6].replace(/ /g, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[7]),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[8]);\n\n ResultFormatter.unknownArr(decodeResult, [\n fields[1],\n fields[4],\n fields[5],\n ]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\nfunction processPosition(decodeResult: DecodeResult, value: string) {\n // N 39.841W 75.790\n if (\n value.length !== 16 &&\n value[0] !== 'N' &&\n value[0] !== 'S' &&\n value[8] !== 'W' &&\n value[8] !== 'E'\n ) {\n return;\n }\n const latDir = value[0] === 'N' ? 1 : -1;\n const lonDir = value[8] === 'E' ? 1 : -1;\n const position = {\n latitude: latDir * Number(value.substring(1, 7)),\n longitude: lonDir * Number(value.substring(9, 15)),\n };\n\n ResultFormatter.position(decodeResult, position);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_OFF extends DecoderPlugin {\n name = 'label-22-off';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['OFF'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Takeoff Report';\n decodeResult.message = message;\n\n if (message.text.startsWith('OFF01')) {\n // variant 1\n const fields = message.text.substring(5).split('/');\n\n if (fields.length != 2) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n ResultFormatter.departureDay(\n decodeResult,\n Number(fields[1].substring(0, 2)),\n ); // departure day\n ResultFormatter.arrivalDay(\n decodeResult,\n Number(fields[1].substring(2, 4)),\n ); // arrival day\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(4, 8)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(8, 12),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(12, 16));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 22)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(22));\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else if (message.text.startsWith('OFF02\\r\\n')) {\n // varaint 3\n const fields = message.text.substring(7).split(',');\n if (fields.length != 4) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.unknown(decodeResult, fields[3]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else if (message.text.startsWith('OFF02')) {\n // varaint 2\n const fields = message.text.substring(5).split('/');\n if (fields.length != 2) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, fields[0]);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n fields[1].substring(0, 14),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.day(decodeResult, Number(fields[1].substring(14, 16)));\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(16, 20)),\n );\n ResultFormatter.departureAirport(\n decodeResult,\n fields[1].substring(20, 24),\n );\n ResultFormatter.arrivalAirport(decodeResult, fields[1].substring(24, 28));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(28, 32)),\n );\n ResultFormatter.unknown(decodeResult, fields[1].substring(32, 36));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(36, 40)),\n );\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n if (options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation.`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_22_POS extends DecoderPlugin {\n name = 'label-22-pos';\n\n qualifiers() {\n return {\n labels: ['22'],\n preambles: ['N', 'S'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split(',');\n\n if (fields.length !== 11) {\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${fields.join(',')}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const latStr = fields[0].substring(1, 8);\n const lonStr = fields[0].substring(9);\n const lat = Number(latStr) / 10000;\n const lon = Number(lonStr) / 10000;\n ResultFormatter.position(decodeResult, {\n latitude: CoordinateUtils.getDirection(fields[0][0]) * lat,\n longitude: CoordinateUtils.getDirection(fields[0][8]) * lon,\n });\n\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2]),\n );\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n\n ResultFormatter.unknownArr(decodeResult, [fields[1], ...fields.slice(4)]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM3 extends DecoderPlugin {\n name = 'label-2p-fm3';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 7) {\n const header = parts[0].split('FM3 ');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n\n if (header[1].length === 4) {\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n } else {\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(header[1]),\n );\n }\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[1]),\n );\n const lat = parts[2].replaceAll(' ', '');\n const lon = parts[3].replaceAll(' ', '');\n if (lat[0] === 'N' || lat[0] === 'S') {\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n } else {\n ResultFormatter.position(decodeResult, {\n latitude: Number(lat),\n longitude: Number(lon),\n });\n }\n ResultFormatter.altitude(decodeResult, Number(parts[4]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[5]);\n ResultFormatter.unknown(decodeResult, parts[6]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM4 extends DecoderPlugin {\n name = 'label-2p-fm4';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 10) {\n const header = parts[0].split('FM4');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n if (header[0].length > 0) {\n ResultFormatter.unknown(decodeResult, header[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, header[0].substring(4));\n }\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.day(decodeResult, Number(parts[2].substring(0, 2)));\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2].substring(2)),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n ResultFormatter.heading(decodeResult, Number(parts[7]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_FM5 extends DecoderPlugin {\n name = 'label-2p-fm5';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Report';\n decodeResult.message = message;\n\n const parts = message.text.split(',');\n\n if (parts.length === 12) {\n const header = parts[0].split('FM5 ');\n if (header.length == 0) {\n // can't use preambles, as there can be info before `FM4`\n // so let's check if we want to decode it here\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.departureAirport(decodeResult, header[1]);\n ResultFormatter.arrivalAirport(decodeResult, parts[1]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[2]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(parts[3]),\n );\n ResultFormatter.position(decodeResult, {\n latitude: Number(parts[4].replaceAll(' ', '')),\n longitude: Number(parts[5].replaceAll(' ', '')),\n });\n ResultFormatter.altitude(decodeResult, Number(parts[6]));\n // TODO: decode further\n ResultFormatter.unknown(decodeResult, parts[7]);\n ResultFormatter.unknown(decodeResult, parts[8]);\n ResultFormatter.unknown(decodeResult, parts[9]);\n ResultFormatter.flightNumber(decodeResult, parts[10].trim());\n ResultFormatter.unknown(decodeResult, parts[11]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_2P_POS extends DecoderPlugin {\n name = 'label-2p-pos';\n\n qualifiers() {\n return {\n labels: ['2P'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, '');\n const parts = msg.split('/');\n let decoded = false;\n if (parts[0].length > 3) {\n decoded = H1Helper.decodeH1Message(\n decodeResult,\n msg.slice(parts[0].length - 3),\n );\n // flight number is already decoded in other fields\n decodeResult.remaining.text =\n parts[0].slice(0, 3) + '/' + decodeResult.remaining.text;\n } else {\n decoded = H1Helper.decodeH1Message(decodeResult, msg);\n }\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Position Report\nexport class Label_24_Slash extends DecoderPlugin {\n name = 'label-24-slash';\n\n qualifiers() {\n return {\n labels: ['24'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n\n if (fields.length == 10 && fields[0] == '' && fields[9] == '') {\n // begin and ends with `/`\n const ddmmyy =\n fields[1].substring(2, 4) +\n fields[1].substring(4, 6) +\n fields[1].substring(0, 2); // YYDDMM\n const hhmmss = fields[2] + '00';\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n hhmmss,\n ddmmyy,\n );\n ResultFormatter.flightNumber(decodeResult, fields[3]);\n ResultFormatter.altitude(decodeResult, Number(fields[4]));\n const lat = fields[5];\n const lon = fields[6];\n const position = {\n latitude: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1)),\n longitude: (lon[0] === 'E' ? 1 : -1) * Number(lon.substring(1)),\n };\n ResultFormatter.position(decodeResult, position);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[8]),\n );\n ResultFormatter.unknown(decodeResult, fields[7]);\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if (options.debug) {\n console.log(\n `DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}. Message: ${message.text}`,\n );\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_30_Slash_EA extends DecoderPlugin {\n name = 'label-30-slash-ea';\n\n qualifiers() {\n return {\n labels: ['30'],\n preambles: ['/EA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: /EA1830/DSKSFO/SK24\n const results = message.text.split(/\\n|\\//).slice(1); // Split by / and new line\n\n if (results) {\n if (options.debug) {\n console.log('Label 30 EA: results');\n console.log(results);\n }\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results[0].substr(2, 4)),\n );\n\n if (results[1].substring(0, 2) === 'DS') {\n ResultFormatter.arrivalAirport(decodeResult, results[1].substring(2, 6));\n ResultFormatter.unknown(decodeResult, '/'.concat(results[2]));\n } else {\n ResultFormatter.unknown(\n decodeResult,\n '/'.concat(results[1], '/', results[2]),\n );\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// In Air Report\nexport class Label_44_ETA extends DecoderPlugin {\n name = 'label-44-eta';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ETA01', '00ETA02', '00ETA03', 'ETA01', 'ETA02', 'ETA03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 9) {\n if (options.debug) {\n console.log('Label 44 ETA Report: groups');\n console.log(data);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.altitude(decodeResult, 100 * Number(data[2]));\n ResultFormatter.departureAirport(decodeResult, data[3]);\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n\n ResultFormatter.month(decodeResult, Number(data[5].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[5].substring(2, 4)));\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[6]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[7]),\n );\n const fuel = Number(data[8]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 9) {\n ResultFormatter.unknownArr(decodeResult, data.slice(9));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// In Air Report\nexport class Label_44_IN extends DecoderPlugin {\n name = 'label-44-in';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00IN01', '00IN02', '00IN03', 'IN01', 'IN02', 'IN03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'In Air Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 7) {\n if (options.debug) {\n console.log('Label 44 In Air Report: groups');\n console.log(data);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.in(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n const fuel = Number(data[6]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 7) {\n ResultFormatter.unknownArr(decodeResult, data.slice(7));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Off Runway Report\nexport class Label_44_OFF extends DecoderPlugin {\n name = 'label-44-off';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00OFF01', '00OFF02', '00OFF03', 'OFF01', 'OFF02', 'OFF03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Off Runway Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 8) {\n if (options.debug) {\n console.log('Label 44 Off Runway Report: groups');\n console.log(data);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[6]),\n );\n const fuel = Number(data[7]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 8) {\n ResultFormatter.unknownArr(decodeResult, data.slice(8));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// On Runway Report\nexport class Label_44_ON extends DecoderPlugin {\n name = 'label-44-on';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00ON01', '00ON02', '00ON03', 'ON01', 'ON02', 'ON03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'On Runway Report';\n decodeResult.message = message;\n\n const data = message.text.split(',');\n if (data.length >= 7) {\n if (options.debug) {\n console.log('Label 44 On Runway Report: groups');\n console.log(data);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[1]),\n );\n ResultFormatter.departureAirport(decodeResult, data[2]);\n ResultFormatter.arrivalAirport(decodeResult, data[3]);\n ResultFormatter.month(decodeResult, Number(data[4].substring(0, 2)));\n ResultFormatter.day(decodeResult, Number(data[4].substring(2, 4)));\n ResultFormatter.on(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n const fuel = Number(data[6]);\n if (!isNaN(fuel)) {\n ResultFormatter.remainingFuel(decodeResult, Number(fuel));\n }\n\n if (data.length > 7) {\n ResultFormatter.unknownArr(decodeResult, data.slice(7));\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_44_POS extends DecoderPlugin {\n name = 'label-44-pos';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: ['00POS01', '00POS02', '00POS03', 'POS01', 'POS02', 'POS03'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // Style: POS02,N38338W121179,GRD,KMHR,KPDX,0807,0003,0112,005.1\n // Match: POS02,coords,flight_level_or_ground,departure_icao,arrival_icao,current_date,current_time,eta_time,unknown\n const regex =\n /^.*,(?<unsplit_coords>.*),(?<flight_level_or_ground>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 44 Position Report: groups');\n console.log(results.groups);\n }\n\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n results.groups.unsplit_coords,\n ),\n );\n const flight_level =\n results.groups.flight_level_or_ground == 'GRD' ||\n results.groups.flight_level_or_ground == '***'\n ? 0\n : Number(results.groups.flight_level_or_ground);\n\n ResultFormatter.month(\n decodeResult,\n Number(results.groups.current_date.substring(0, 2)),\n );\n ResultFormatter.day(\n decodeResult,\n Number(results.groups.current_date.substring(2, 4)),\n );\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.current_time + '00'),\n );\n\n // TODO: ETA month and Day\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.eta_time + '00'),\n );\n\n if (\n results.groups.fuel_in_tons != '***' &&\n results.groups.fuel_in_tons != '****'\n ) {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n ResultFormatter.departureAirport(\n decodeResult,\n results.groups.departure_icao,\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n ResultFormatter.altitude(decodeResult, flight_level * 100);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { FlightPlanUtils } from '../utils/flight_plan_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Flight Briefing Report\nexport class Label_44_Slash extends DecoderPlugin {\n name = 'label-44-slash';\n\n qualifiers() {\n return {\n labels: ['44'],\n preambles: [' /FB'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Briefing';\n decodeResult.message = message;\n\n const fields = message.text.split('/');\n if (fields.length !== 4) {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n ResultFormatter.unknownArr(decodeResult, fields.slice(0, 2), '/'); // 0 is a space\n // 1 is the briefing id\n // 2 is arrival airport, but repeated later\n const data = fields[3].split(',');\n if (data.length >= 6) {\n if (options.debug) {\n console.log('Label 44 Slash: groups');\n console.log(data);\n }\n\n ResultFormatter.position(decodeResult, {\n latitude:\n (data[0].charAt(0) === 'S' ? -1 : 1) *\n parseFloat(data[0].slice(1).trim()),\n longitude:\n (data[1].charAt(0) === 'W' ? -1 : 1) *\n parseFloat(data[1].slice(1).trim()),\n });\n ResultFormatter.flightNumber(decodeResult, data[2]);\n ResultFormatter.unknown(decodeResult, data[3]); // Status - need more info to decode\n ResultFormatter.arrivalAirport(decodeResult, data[4]);\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[5]),\n );\n if (data.length === 18) {\n ResultFormatter.unknownArr(decodeResult, data.slice(6, 8), ','); // 6 is repeated arrival airport\n ResultFormatter.remainingFuel(decodeResult, parseFloat(data[8]));\n ResultFormatter.unknownArr(decodeResult, data.slice(9, 11), ',');\n ResultFormatter.arrivalRunway(decodeResult, data[11]);\n FlightPlanUtils.addProcedure(decodeResult, data[12], 'arrival');\n ResultFormatter.unknownArr(decodeResult, data.slice(13, 18), ',');\n }\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 44 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { Waypoint } from '../types/waypoint';\n\nexport class Label_4A extends DecoderPlugin {\n name = 'label-4a';\n\n qualifiers() {\n return {\n labels: ['4A'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n const fields = message.text.split(',');\n if (fields.length === 11) {\n // variant 1\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.tail(decodeResult, fields[2].replace('.', ''));\n if (fields[3]) ResultFormatter.callsign(decodeResult, fields[3]);\n ResultFormatter.departureAirport(decodeResult, fields[4]);\n ResultFormatter.arrivalAirport(decodeResult, fields[5]);\n // ResultFormatter.altitude(decodeResult, Number(alt) * 100);\n ResultFormatter.unknownArr(decodeResult, fields.slice(8));\n } else if (fields.length === 6) {\n if (fields[0].match(/^[NS]/)) {\n // variant 2\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(fields[0].substring(0, 13)),\n );\n let wp1: Waypoint = {\n name: fields[0].substring(13).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[1].substring(0, 6)),\n timeFormat: 'tod',\n };\n ResultFormatter.altitude(\n decodeResult,\n Number(fields[1].substring(6, 9)) * 100,\n );\n let wp2: Waypoint = {\n name: fields[1].substring(9).trim(),\n time: DateTimeUtils.convertHHMMSSToTod(fields[2]),\n timeFormat: 'tod',\n };\n ResultFormatter.route(decodeResult, { waypoints: [wp1, wp2] });\n ResultFormatter.temperature(decodeResult, fields[3]);\n ResultFormatter.unknownArr(decodeResult, fields.slice(4));\n } else {\n // variant 3\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[0]),\n );\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1]),\n );\n ResultFormatter.unknown(decodeResult, fields[2]);\n ResultFormatter.altitude(decodeResult, Number(fields[3]));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinates(\n (fields[4] + fields[5]).replace(/[ \\.]/g, ''),\n ),\n );\n }\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_01 extends DecoderPlugin {\n name = 'label-4a-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n let rgx = message.text.match(\n /^01([A-Z]{2})([A-Z]{2})\\s*(\\w+)\\/(\\d{6})([A-Z]{4})([A-Z]{4})\\r\\n([+-]\\s*\\d+)(\\d{3}\\.\\d)([+-]\\s*\\d+\\.\\d)/,\n );\n if (rgx) {\n ResultFormatter.state_change(decodeResult, rgx[1], rgx[2]);\n ResultFormatter.callsign(decodeResult, rgx[3]);\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(rgx[4] + '00'),\n );\n ResultFormatter.departureAirport(decodeResult, rgx[5]);\n ResultFormatter.arrivalAirport(decodeResult, rgx[6]);\n ResultFormatter.altitude(decodeResult, Number(rgx[7].replace(/ /g, '')));\n ResultFormatter.unknown(decodeResult, rgx[8]);\n ResultFormatter.temperature(decodeResult, rgx[9].replace(/ /g, ''));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DIS extends DecoderPlugin {\n name = 'label-4a-dis';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DIS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n const fields = message.text.split(',');\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[1].substring(2) + '00'),\n );\n ResultFormatter.callsign(decodeResult, fields[2]);\n ResultFormatter.freetext(decodeResult, fields.slice(3).join(''));\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { DateTimeUtils } from '../DateTimeUtils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_DOOR extends DecoderPlugin {\n name = 'label-4a-door';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['DOOR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n const fields = message.text.split(' ');\n if (fields.length === 3) {\n ResultFormatter.door_event(\n decodeResult,\n fields[0].split('/')[1],\n fields[1],\n );\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[2] + '00'),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4A_Slash_01 extends DecoderPlugin {\n name = 'label-4a-slash-01';\n\n qualifiers() {\n return {\n labels: ['4A'],\n preambles: ['/01'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Latest New Format';\n\n decodeResult.decoded = true;\n if (message.text.length === 5 && message.text.substring(0, 4) === '/01-') {\n ResultFormatter.unknown(decodeResult, message.text.substring(4));\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, message.text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4J_POS extends DecoderPlugin {\n name = 'label-4j-pos';\n qualifiers() {\n return {\n labels: ['4J'],\n preambles: ['POS/'],\n };\n }\n\n // copied from Label_H1.ts since i don't really want to have to have\n // something named like that decode more than 1 type\n // if we figure out a good name, i'll combine them\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, '');\n const decoded = H1Helper.decodeH1Message(decodeResult, msg);\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_4N extends DecoderPlugin {\n name = 'label-4n';\n\n qualifiers() {\n return {\n labels: ['4N'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n const fields = text.split(',');\n if (text.length === 51) {\n // variant 1\n decodeResult.raw.day = text.substring(0, 2);\n ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));\n ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));\n ResultFormatter.position(\n decodeResult,\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(30, 45).replace(/^(.)0/, '$1'),\n ),\n );\n ResultFormatter.altitude(\n decodeResult,\n Number(text.substring(48, 51)) * 100,\n );\n ResultFormatter.unknownArr(\n decodeResult,\n [text.substring(2, 4), text.substring(19, 29)],\n ' ',\n );\n } else if (fields.length === 33) {\n // variant 2\n decodeResult.raw.date = fields[3];\n if (fields[1] === 'B') {\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[4]),\n longitude: Number(fields[5]),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[6]));\n }\n ResultFormatter.departureAirport(decodeResult, fields[8]);\n ResultFormatter.arrivalAirport(decodeResult, fields[9]);\n ResultFormatter.alternateAirport(decodeResult, fields[10]);\n ResultFormatter.arrivalRunway(decodeResult, fields[11].split('/')[0]);\n if (fields[12].length > 1) {\n ResultFormatter.alternateRunway(decodeResult, fields[12].split('/')[0]);\n }\n ResultFormatter.checksum(decodeResult, parseInt(fields[32], 16));\n ResultFormatter.unknownArr(\n decodeResult,\n [...fields.slice(1, 3), fields[7], ...fields.slice(13, 32)].filter(\n (f) => f != '',\n ),\n );\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_AGFSR extends DecoderPlugin {\n name = 'label-4t-agfsr';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['AGFSR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.substring(5).split('/');\n\n if (!message.text.startsWith('AGFSR') || data.length !== 20) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n ResultFormatter.arrivalDay(decodeResult, Number(data[2]));\n ResultFormatter.departureAirport(\n decodeResult,\n data[3].substring(0, 3),\n 'IATA',\n );\n ResultFormatter.arrivalAirport(decodeResult, data[3].substring(3), 'IATA');\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[4].substring(0, 4)),\n ); // HHMMZ\n ResultFormatter.unknown(decodeResult, data[5], '/');\n const lat = data[6].substring(0, 7);\n const lon = data[6].substring(7, 15);\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[6]) * Number(lat.substring(0, 2)) +\n Number(lat.substring(2, 6)) / 60,\n longitude:\n CoordinateUtils.getDirection(lon[7]) * Number(lon.substring(0, 3)) +\n Number(lon.substring(3, 7)) / 60,\n });\n ResultFormatter.altitude(decodeResult, 100 * Number(data[7]));\n // 8 - phase of flight?\n // 11 - temperature?\n ResultFormatter.unknownArr(decodeResult, data.slice(8), '/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_58 extends DecoderPlugin {\n name = 'label-58';\n\n qualifiers() {\n return {\n labels: ['58'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const data = message.text.split('/');\n if (data.length === 8) {\n ResultFormatter.flightNumber(decodeResult, data[0]);\n ResultFormatter.day(decodeResult, Number(data[1]));\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(data[2]),\n );\n const lat = data[3];\n const lon = data[4];\n ResultFormatter.position(decodeResult, {\n latitude:\n CoordinateUtils.getDirection(lat[0]) * Number(lat.substring(1)),\n longitude:\n CoordinateUtils.getDirection(lon[0]) * Number(lon.substring(1)),\n });\n ResultFormatter.altitude(decodeResult, Number(data[5]));\n ResultFormatter.unknown(decodeResult, data[6], '/');\n ResultFormatter.unknown(decodeResult, data[7], '/');\n } else {\n if (options.debug) {\n console.log(`Decoder: Unknown 58 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// General Aviation Position Report\nexport class Label_4T_ETA extends DecoderPlugin {\n name = 'label-4t-eta';\n\n qualifiers() {\n return {\n labels: ['4T'],\n preambles: ['ETA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n const data = message.text.substring(3).split('/');\n\n if (!message.text.startsWith('ETA') || data.length !== 3) {\n if (options.debug) {\n console.log(`Decoder: Unknown 4T message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.flightNumber(decodeResult, data[0].trim());\n ResultFormatter.departureDay(decodeResult, Number(data[1]));\n const etaData = data[2].split(' ');\n ResultFormatter.arrivalDay(decodeResult, Number(etaData[0]));\n ResultFormatter.arrivalAirport(decodeResult, etaData[1], 'IATA');\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(etaData[2].substring(0, 4)),\n );\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// Airline Defined\n// 3N01 POSRPT\nexport class Label_80 extends DecoderPlugin {\n name = 'label-80';\n\n qualifiers() {\n return {\n labels: ['80'],\n preambles: [],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Defined Position Report';\n\n const lines = message.text.split(/\\r?\\n/);\n if (lines.length === 1 && lines[0].includes(',')) {\n this.parseCsvFormat(lines[0], decodeResult);\n } else {\n const header = lines[0].trim();\n const headerParts = header.split(',');\n for (let i = 0; i < headerParts.length - 1; i++) {\n const moreFields = headerParts[i].split('/');\n for (const more of moreFields) {\n this.parseTags(more.trim(), decodeResult);\n }\n }\n\n this.parseHeader(\n headerParts[headerParts.length - 1].trim(),\n decodeResult,\n );\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n const parts = line.split('/');\n for (const part of parts) {\n this.parseTags(part.trim(), decodeResult);\n }\n }\n }\n\n if (decodeResult.formatted.items.length > 0) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel =\n decodeResult.remaining.text === undefined ? 'full' : 'partial';\n }\n\n return decodeResult;\n }\n\n private parseHeader(header: string, results: DecodeResult) {\n //3N01 POSRPT 0581/27 KIAD/MSLP .N962AV/04H 11:02\n const fields = header.split('/');\n if (fields.length < 3) {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n const msgInfo = fields[0].split(/\\s+/);\n if (msgInfo.length === 3) {\n ResultFormatter.unknownArr(results, msgInfo.slice(0, 2), ' ');\n ResultFormatter.flightNumber(results, msgInfo[2]);\n } else {\n ResultFormatter.unknown(results, header, '/');\n return;\n }\n\n const otherInfo1 = fields[1].split(/\\s+/);\n if (otherInfo1.length === 2) {\n ResultFormatter.day(results, parseInt(otherInfo1[0], 10));\n ResultFormatter.departureAirport(results, otherInfo1[1]);\n } else {\n ResultFormatter.unknownArr(results, otherInfo1, ' ');\n }\n\n const otherInfo2 = fields[2].split(/\\s+/);\n if (otherInfo2.length === 2) {\n ResultFormatter.arrivalAirport(results, otherInfo2[0]);\n ResultFormatter.tail(results, otherInfo2[1].replace('.', ''));\n } else {\n ResultFormatter.unknownArr(results, otherInfo2, ' ');\n }\n\n if (fields.length > 3) {\n ResultFormatter.unknownArr(results, fields.slice(3), '/');\n }\n }\n\n private parseTags(part: string, results: DecodeResult) {\n const kvPair = part.split(/\\s+/);\n if (kvPair.length < 2) {\n ResultFormatter.unknown(results, part, '/');\n return;\n }\n const tag = kvPair[0];\n const val = kvPair.slice(1).join(' ');\n\n switch (tag) {\n case 'POS':\n // don't use decodeStringCoordinates because of different position format\n const posRegex = /^(?<latd>[NS])(?<lat>.+)(?<lngd>[EW])(?<lng>.+)/;\n const posResult = val.match(posRegex);\n const lat =\n Number(posResult?.groups?.lat) *\n (posResult?.groups?.latd === 'S' ? -1 : 1);\n const lon =\n Number(posResult?.groups?.lng) *\n (posResult?.groups?.lngd === 'W' ? -1 : 1);\n const position = {\n latitude: Number.isInteger(lat) ? lat / 1000 : lat / 100,\n longitude: Number.isInteger(lon) ? lon / 1000 : lon / 100,\n };\n ResultFormatter.position(results, position);\n break;\n case 'ALT':\n ResultFormatter.altitude(results, parseInt(val.replace('+', ''), 10));\n break;\n case 'FL': // Handle \"FL 360\"\n ResultFormatter.altitude(results, parseInt(val, 10) * 100);\n break;\n case 'MCH':\n ResultFormatter.mach(results, parseInt(val, 10) / 1000);\n break;\n case 'SPD':\n ResultFormatter.groundspeed(results, parseInt(val, 10));\n break;\n case 'TAS':\n ResultFormatter.airspeed(results, parseInt(val, 10));\n break;\n case 'SAT':\n ResultFormatter.temperature(results, val);\n break;\n case 'FB':\n // ignoring, assuming FOB and avoiding duplicates.\n break;\n case 'FOB':\n // Strip non-numeric like 'N' in 'N009414'\n ResultFormatter.currentFuel(\n results,\n parseInt(val.replace(/\\D/g, ''), 10),\n );\n break;\n case 'UTC':\n ResultFormatter.time_of_day(\n results,\n DateTimeUtils.convertHHMMSSToTod(val),\n );\n break;\n case 'ETA':\n const hhmm = val.split('.')[0].replace(':', '');\n ResultFormatter.eta(results, DateTimeUtils.convertHHMMSSToTod(hhmm));\n break;\n case 'HDG':\n ResultFormatter.heading(results, parseInt(val, 10));\n break;\n case 'NWYP':\n results.raw.next_waypoint = val;\n break;\n case 'SWN':\n // wind speed, do nothing for\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'DWN':\n // wind direction, do nothing for now\n ResultFormatter.unknown(results, part, '/');\n break;\n case 'AD':\n // do nothing, as it shows in the header\n break;\n default:\n ResultFormatter.unknown(results, part, '/');\n }\n }\n private parseCsvFormat(text: string, results: DecodeResult) {\n const csvParts = text.split(',');\n const header = csvParts[0].trim().split(/\\s+/);\n ResultFormatter.unknown(results, header[0], ' ');\n ResultFormatter.unknown(results, header[1], ' ');\n ResultFormatter.position(\n results,\n CoordinateUtils.decodeStringCoordinates(header[2]),\n );\n ResultFormatter.unknown(results, csvParts[1]);\n ResultFormatter.time_of_day(\n results,\n DateTimeUtils.convertHHMMSSToTod(csvParts[2]),\n );\n ResultFormatter.unknownArr(results, csvParts.slice(4, 6), ',');\n ResultFormatter.temperature(\n results,\n (\n (csvParts[6].charAt(0) === 'M' ? -1 : 1) *\n parseInt(csvParts[6].slice(1), 10)\n ).toString(),\n );\n ResultFormatter.airspeed(results, parseInt(csvParts[7], 10));\n ResultFormatter.currentFuel(results, parseInt(csvParts[8], 10));\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_83 extends DecoderPlugin {\n name = 'label-83';\n\n qualifiers() {\n return {\n labels: ['83'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Airline Defined';\n\n decodeResult.decoded = true;\n const text = message.text;\n if (text.substring(0, 10) === '4DH3 ETAT2') {\n // variant 2\n const fields = text.split(/\\s+/);\n if (fields[2].length > 5) {\n decodeResult.raw.day = fields[2].substring(5);\n }\n ResultFormatter.unknown(decodeResult, fields[2].substring(0, 4));\n const subfields = fields[3].split('/');\n ResultFormatter.departureAirport(decodeResult, subfields[0]);\n ResultFormatter.arrivalAirport(decodeResult, subfields[1]);\n ResultFormatter.tail(decodeResult, fields[4].replace(/\\./g, ''));\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(fields[6] + '00'),\n );\n } else if (text.substring(0, 5) === '001PR') {\n // variant 3\n decodeResult.raw.day = text.substring(5, 7);\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(\n text.substring(13, 28).replace(/\\./g, ''),\n );\n if (position) {\n ResultFormatter.position(decodeResult, position);\n }\n ResultFormatter.altitude(decodeResult, Number(text.substring(28, 33)));\n ResultFormatter.unknown(decodeResult, text.substring(33));\n } else {\n const fields = text.replace(/\\s/g, '').split(',');\n if (fields.length === 9) {\n // variant 1\n ResultFormatter.departureAirport(decodeResult, fields[0]);\n ResultFormatter.arrivalAirport(decodeResult, fields[1]);\n decodeResult.raw.day = fields[2].substring(0, 2);\n decodeResult.raw.time = fields[2].substring(2);\n ResultFormatter.position(decodeResult, {\n latitude: Number(fields[3].replace(/\\s/g, '')),\n longitude: Number(fields[4].replace(/\\s/g, '')),\n });\n ResultFormatter.altitude(decodeResult, Number(fields[5]));\n ResultFormatter.groundspeed(decodeResult, Number(fields[6]));\n ResultFormatter.heading(decodeResult, Number(fields[7]));\n ResultFormatter.unknown(decodeResult, fields[8]);\n } else {\n decodeResult.decoded = false;\n ResultFormatter.unknown(decodeResult, text);\n }\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\n// ETA\nexport class Label_8E extends DecoderPlugin {\n name = 'label-8e';\n\n qualifiers() {\n return {\n labels: ['8E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: EGSS,1618\n // Match: arrival_icao,arrival_eta\n const regex = /^(?<arrival_icao>\\w{4}),(?<arrival_eta>\\d{4})$/;\n const results = message.text.match(regex);\n if (results?.groups) {\n if (options.debug) {\n console.log('Label 8E ETA: groups');\n console.log(results.groups);\n }\n\n ResultFormatter.eta(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(results.groups.arrival_eta),\n );\n ResultFormatter.arrivalAirport(decodeResult, results.groups.arrival_icao);\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\n// CPDLC\nexport class Label_B6_Forwardslash extends DecoderPlugin {\n name = 'label-b6-forwardslash';\n\n qualifiers() {\n return {\n labels: ['B6'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'CPDLC Message';\n decodeResult.message = message;\n\n if (options.debug) {\n console.log('CPDLC: ' + message);\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_ColonComma extends DecoderPlugin {\n name = 'label-colon-comma';\n\n qualifiers() {\n return {\n labels: [':;'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.frequency = Number(message.text) / 1000;\n\n decodeResult.formatted.description =\n 'Aircraft Transceiver Frequency Change';\n decodeResult.formatted.items.push({\n type: 'frequency',\n label: 'Frequency',\n value: `${decodeResult.raw.frequency} MHz`,\n code: 'FREQ',\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1 extends DecoderPlugin {\n name = 'label-h1';\n qualifiers() {\n return {\n labels: ['H1'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const msg = message.text.replace(/\\n|\\r/g, '');\n const parts = msg.split('#');\n let decoded = false;\n if (msg.startsWith('/')) {\n const headerData = msg.split('.');\n const decoded = H1Helper.decodeH1Message(\n decodeResult,\n headerData.slice(1).join('.'),\n ); // skip up to # and then a little more\n if (decoded) {\n decodeResult.remaining.text =\n headerData[0] + '.' + decodeResult.remaining.text;\n decodeResult.decoded = decoded;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n\n return decodeResult;\n } else if (parts.length === 1) {\n decoded = H1Helper.decodeH1Message(decodeResult, msg);\n } else if (parts.length == 2) {\n // need a better way to figure this out\n const offset = parts[0] === '- ' || isNaN(parseInt(parts[1][1])) ? 3 : 4;\n decoded = H1Helper.decodeH1Message(\n decodeResult,\n msg.slice(parts[0].length + offset),\n ); // skip up to # and then a little more\n if (decoded && parts[0].length > 0) {\n // ResultFormatter.unknown(decodeResult, parts[0].substring(0, 4));\n ResultFormatter.flightNumber(decodeResult, parts[0].substring(4));\n //ResultFormatter.unknown(decodeResult, parts[1].length == 5 ? parts[1].substring(0, 2) : parts[1].substring(0, 3), '#');\n // hack of the highest degree as we've parsed the rest of the message already but we want the remaining text to be in order\n decodeResult.remaining.text =\n parts[0].substring(0, 4) +\n '#' +\n parts[1].substring(0, offset - 1) +\n '/' +\n decodeResult.remaining.text;\n }\n }\n decodeResult.decoded = decoded;\n\n decodeResult.decoder.decodeLevel = !decodeResult.remaining.text\n ? 'full'\n : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Wind } from '../types/wind';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H2_02E extends DecoderPlugin {\n name = 'label-h2-02e';\n\n qualifiers() {\n return {\n labels: ['H2'],\n preambles: ['02E'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Weather Report';\n decodeResult.message = message;\n\n const parts = message.text.split(' ');\n\n if (parts[parts.length - 1] !== 'Q') {\n // not a valid message\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n const windData: Wind[] = [];\n decodeResult.remaining.text = '';\n\n const header = parts[0];\n if (header.length === 45) {\n // header.substring(0,3) is '02E'\n ResultFormatter.day(decodeResult, parseInt(header.substring(3, 5), 10));\n ResultFormatter.departureAirport(decodeResult, header.substring(5, 9));\n ResultFormatter.arrivalAirport(decodeResult, header.substring(9, 13));\n const firstWind = this.parseWeatherReport(header.substring(13));\n if (firstWind) {\n windData.push(firstWind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + header.substring(13);\n }\n }\n\n for (let i = 1; i < parts.length - 1; i++) {\n const part = parts[i];\n if (part[0] !== 'Q') {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n continue;\n }\n const wind = this.parseWeatherReport(part.substring(1));\n if (wind) {\n windData.push(wind);\n } else {\n decodeResult.remaining.text +=\n (decodeResult.remaining.text ? ' ' : '') + part;\n }\n }\n\n ResultFormatter.windData(decodeResult, windData);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel =\n decodeResult.remaining.text.length === 0 ? 'full' : 'partial';\n return decodeResult;\n }\n\n private parseWeatherReport(text: string): Wind | null {\n const posString = text.substring(0, 13);\n const pos =\n CoordinateUtils.decodeStringCoordinatesDecimalMinutes(posString);\n if (text.length !== 32 || !pos) {\n return null;\n }\n const tod = DateTimeUtils.convertHHMMSSToTod(text.substring(13, 17));\n const flightLevel = parseInt(text.substring(17, 20), 10);\n // const altitude = parseInt(text.substring(17,21), 10) * 10; // use FL instead\n const tempSign = text[21] === 'M' ? -1 : 1;\n const tempDegreesRaw = parseInt(text.substring(22, 25), 10);\n const tempDegrees = tempSign * (tempDegreesRaw / 10);\n const windDirection = parseInt(text.substring(25, 28), 10);\n const windSpeed = parseInt(text.substring(28, 31), 10);\n // G?\n if (text[31] !== 'G') {\n return null;\n }\n return {\n waypoint: {\n name: posString,\n latitude: pos.latitude,\n longitude: pos.longitude,\n time: tod,\n timeFormat: 'tod',\n },\n flightLevel: flightLevel,\n windDirection: windDirection,\n windSpeed: windSpeed,\n temperature: {\n flightLevel: flightLevel,\n degreesC: tempDegrees,\n },\n };\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_FLR extends DecoderPlugin {\n name = 'label-h1-flr';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['FLR', '#CFBFLR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Fault Log Report';\n decodeResult.message = message;\n\n const parts = message.text.split('/FR');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n for (let i = 1; i < fields.length; i++) {\n const field = fields[i];\n ResultFormatter.unknown(decodeResult, field, '/');\n }\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.fault_message = msg;\n decodeResult.formatted.items.push({\n type: 'fault',\n code: 'FR',\n label: 'Fault Report',\n value: decodeResult.raw.fault_message,\n });\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nimport * as zlib from 'minizlib';\nimport { Buffer } from 'node:buffer';\n\nexport class Label_H1_OHMA extends DecoderPlugin {\n name = 'label-h1-ohma';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['OHMA', '/RTNBOCR.OHMA', '#T1B/RTNBOCR.OHMA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OHMA Message';\n decodeResult.message = message;\n\n const data = message.text.split('OHMA')[1]; // throw out '/RTNOCR.' - even though it means something\n try {\n const compressedBuffer = Buffer.from(data, 'base64');\n const decompress = new zlib.Inflate({});\n decompress.write(compressedBuffer);\n decompress.flush(zlib.constants.Z_SYNC_FLUSH);\n const result = decompress.read();\n const jsonText = result?.toString() || '';\n\n let formattedMsg;\n let jsonMessage;\n try {\n jsonMessage = JSON.parse(jsonText).message;\n } catch {\n jsonMessage = jsonText;\n }\n\n try {\n const ohmaMsg = JSON.parse(jsonMessage);\n formattedMsg = JSON.stringify(ohmaMsg, null, 2);\n } catch {\n formattedMsg = jsonMessage;\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n decodeResult.raw.ohma = jsonText;\n decodeResult.formatted.items.push({\n type: 'ohma',\n code: 'OHMA',\n label: 'OHMA Downlink',\n value: formattedMsg,\n });\n } catch (e) {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 OHMA message: ${message.text}`, e);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_Paren extends DecoderPlugin {\n name = 'label-h1-paren';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['('],\n };\n }\n\n decode(message: Message): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n if (!message.text || !message.text.startsWith('(')) {\n decodeResult.decoded = false;\n return decodeResult;\n }\n\n const regex =\n /^\\(POS-(?<flight>\\w+)\\s+(?<lat>-?\\d{4,5}[NS])(?<lon>\\d{5}[EW])\\/(?<timestamp>\\d{6})\\s+F(?<alt>\\d{3})\\r?\\nRMK\\/FUEL\\s+(?<fuel>\\d{2,3}\\.\\d)\\s+M(?<mach>\\d\\.\\d{2})\\)/;\n\n const match = message.text.match(regex);\n if (match && match.groups) {\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.formatted.description = 'Position Report';\n\n\n ResultFormatter.flightNumber(decodeResult, match.groups.flight);\n ResultFormatter.position(decodeResult, {\n latitude: parseLat(match.groups.lat),\n longitude: parseLon(match.groups.lon),\n });\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(match.groups.timestamp),\n );\n ResultFormatter.altitude(\n decodeResult,\n parseInt(match.groups.alt, 10) * 100,\n );\n ResultFormatter.currentFuel(decodeResult, parseFloat(match.groups.fuel));\n ResultFormatter.mach(decodeResult, parseFloat(match.groups.mach));\n ResultFormatter.unknown(decodeResult, 'RMK');\n }\n return decodeResult;\n }\n}\n\nfunction parseLat(latStr: string): number {\n const match = latStr.match(/(-?)(\\d{2})(\\d{2})([NS])/);\n if (!match) return NaN;\n let deg = parseInt(match[2]);\n let min = parseInt(match[3]);\n let sign = match[4] === 'S' ? -1 : 1;\n return sign * (deg + min / 60);\n}\n\nfunction parseLon(lonStr: string): number {\n const match = lonStr.match(/(\\d{3})(\\d{2})([EW])/);\n if (!match) return NaN;\n let deg = parseInt(match[1]);\n let min = parseInt(match[2]);\n let sign = match[3] === 'W' ? -1 : 1;\n return sign * (deg + min / 60);\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_StarPOS extends DecoderPlugin {\n name = 'label-h1-star-pos';\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['*POS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const msg = message.text;\n // assuming fixed length until other variants found\n if (msg.length !== 43 || !msg.startsWith('*POS')) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${msg}`);\n }\n ResultFormatter.unknown(decodeResult, msg);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n ResultFormatter.month(decodeResult, Number(msg.substring(4, 6)));\n ResultFormatter.day(decodeResult, Number(msg.substring(6, 8)));\n ResultFormatter.time_of_day(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(msg.substring(8, 12)),\n );\n ResultFormatter.position(decodeResult, {\n // Deg Min, no sec\n latitude:\n CoordinateUtils.getDirection(msg.substring(12, 13)) *\n (Number(msg.substring(13, 15)) + Number(msg.substring(15, 17)) / 60),\n longitude:\n CoordinateUtils.getDirection(msg.substring(17, 18)) *\n (Number(msg.substring(18, 21)) + Number(msg.substring(21, 23)) / 60),\n });\n ResultFormatter.altitude(decodeResult, Number(msg.substring(23, 28)));\n ResultFormatter.unknown(decodeResult, msg.substring(28));\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_H1_WRN extends DecoderPlugin {\n name = 'label-h1-wrn';\n\n qualifiers() {\n return {\n labels: ['H1'],\n preambles: ['WRN', '#CFBWRN'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Warning Message';\n decodeResult.message = message;\n\n const parts = message.text.split('/WN');\n\n if (parts.length > 1) {\n //decode header\n // can go away, here because i want to decode it\n const fields = parts[0].split('/');\n // 0 is the msg type\n ResultFormatter.unknownArr(decodeResult, fields.slice(1), '/');\n\n const data = parts[1].substring(0, 20);\n const msg = parts[1].substring(20);\n const datetime = data.substring(0, 12); // YYMMDDHHMMSS (SS might be next 2 chars)\n const date =\n datetime.substring(4, 6) +\n datetime.substring(2, 4) +\n datetime.substring(0, 2);\n\n ResultFormatter.unknown(decodeResult, data.substring(12), '/');\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(\n datetime.substring(6),\n date,\n );\n // TODO: decode further\n decodeResult.raw.warning_message = msg;\n decodeResult.formatted.items.push({\n type: 'warning',\n code: 'WRN',\n label: 'Warning Message',\n value: decodeResult.raw.warning_message,\n });\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n ResultFormatter.unknown(decodeResult, message.text);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_HX extends DecoderPlugin {\n name = 'label-hx';\n\n qualifiers() {\n return {\n labels: ['HX'],\n preambles: ['RA FMT LOCATION', 'RA FMT 43'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'Undelivered Uplink Report';\n\n const parts = message.text.split(' ');\n\n decodeResult.decoded = true;\n if (parts[2] === 'LOCATION') {\n let latdir = parts[3].substring(0, 1);\n let latdeg = Number(parts[3].substring(1, 3));\n let latmin = Number(parts[3].substring(3, 7));\n let londir = parts[4].substring(0, 1);\n let londeg = Number(parts[4].substring(1, 4));\n let lonmin = Number(parts[4].substring(4, 8));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknownArr(decodeResult, parts.slice(5), ' ');\n ResultFormatter.position(decodeResult, pos);\n } else if (parts[2] === '43') {\n ResultFormatter.departureAirport(decodeResult, parts[3]);\n ResultFormatter.unknownArr(decodeResult, parts.slice(4), ' ');\n } else {\n decodeResult.decoded = false;\n }\n\n if (decodeResult.decoded) {\n if (!decodeResult.remaining.text)\n decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n","import * as Base85 from 'base85';\nimport * as zlib from 'minizlib';\nimport { Buffer } from 'node:buffer';\n\nenum MIAMVersion {\n V1 = 1,\n V2 = 2,\n}\n\nenum MIAMFid {\n SingleTransfer = 'T',\n FileTransferRequest = 'F',\n FileTransferAccept = 'K',\n FileSegment = 'S',\n FileTransferAbort = 'A',\n XOFFIndication = 'Y',\n XONIndication = 'X',\n}\n\nenum MIAMCorePdu {\n Data = 0,\n Ack = 1,\n Aloha = 2,\n AlohaReply = 3,\n}\n\nenum MIAMCoreApp {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nexport enum MIAMCoreV1Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nexport enum MIAMCoreV2Compression {\n None = 0x0,\n Deflate = 0x1,\n}\n\nconst MIAMCoreV1CRCLength = 4;\nconst MIAMCoreV2CRCLength = 2;\n\ninterface PduACARSData {\n tail?: string;\n label: string;\n sublabel?: string;\n mfi?: string;\n text?: string;\n}\n\ninterface PduNonACARSData {\n appId?: string;\n text?: string;\n}\n\ninterface Pdu {\n version: MIAMVersion;\n crc: number;\n crcOk: boolean;\n complete: boolean;\n compression: number;\n encoding: number;\n msgNum: number;\n ackOptions: number;\n acars?: PduACARSData;\n non_acars?: PduNonACARSData;\n}\nconst isMIAMVersion = (x: number): x is MIAMVersion =>\n Object.values(MIAMVersion).includes(x as MIAMVersion);\nconst isMIAMFid = (x: string): x is MIAMFid =>\n Object.values(MIAMFid).includes(x as MIAMFid);\nconst isMIAMCoreApp = (x: number): x is MIAMCoreApp =>\n Object.values(MIAMCoreApp).includes(x as MIAMCoreApp);\nconst isMIAMCorePdu = (x: number): x is MIAMCorePdu =>\n Object.values(MIAMCorePdu).includes(x as MIAMCorePdu);\n\ninterface PduDecodingSuccess {\n decoded: true;\n message: {\n data: Pdu;\n };\n}\n\ninterface PduDecodingFailure {\n decoded: false;\n error: string;\n}\n\ntype PduDecodingResult = PduDecodingSuccess | PduDecodingFailure;\n\nexport class MIAMCoreUtils {\n static AppTypeToAppIdLenTable: Record<\n MIAMVersion,\n Record<MIAMCoreApp, number>\n > = {\n [MIAMVersion.V1]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n [MIAMVersion.V2]: {\n [MIAMCoreApp.ACARS2Char]: 2,\n [MIAMCoreApp.ACARS4Char]: 4,\n [MIAMCoreApp.ACARS6Char]: 6,\n [MIAMCoreApp.NonACARS6Char]: 6,\n },\n };\n\n static FidHandlerTable: Record<MIAMFid, (txt: string) => PduDecodingResult> =\n {\n [MIAMFid.SingleTransfer]: (txt: string) => {\n if (txt.length < 3) {\n return {\n decoded: false,\n error: 'Raw MIAM message too short (' + txt.length + ' < 3) ',\n };\n }\n\n let bpad = txt[0];\n\n if ('0123-.'.indexOf(bpad) === -1) {\n return {\n decoded: false,\n error: \"Invalid body padding value: '\" + bpad + \"'\",\n };\n }\n\n if ('0123'.indexOf(txt[1]) === -1) {\n return {\n decoded: false,\n error: \"Invalid header padding value: '\" + txt[1] + \"'\",\n };\n }\n\n const hpad = parseInt(txt[1]);\n\n const delimIdx = txt.indexOf('|');\n if (delimIdx === -1) {\n return {\n decoded: false,\n error: 'Raw MIAM message missing header-body delimiter',\n };\n }\n\n const rawHdr = txt.substring(2, delimIdx);\n if (rawHdr.length === 0) {\n return {\n decoded: false,\n error: 'Empty MIAM message header',\n };\n }\n\n let hdr = Base85.decode('<~' + rawHdr + '~>', 'ascii85');\n if (!hdr || hdr.length < hpad) {\n return {\n decoded: false,\n error: 'Ascii85 decode failed for MIAM message header',\n };\n }\n\n let body: Buffer | undefined = undefined;\n\n const rawBody = txt.substring(delimIdx + 1);\n if (rawBody.length > 0) {\n if ('0123'.indexOf(bpad) >= 0) {\n const bpadValue = parseInt(bpad);\n\n body = Base85.decode('<~' + rawBody + '~>', 'ascii85') || undefined;\n if (body && body.length >= bpadValue) {\n body = body.subarray(0, body.length - bpadValue);\n }\n } else if (bpad === '-') {\n body = Buffer.from(rawBody);\n }\n }\n\n hdr = hdr.subarray(0, hdr.length - hpad);\n\n const version = hdr.readUInt8(0) & 0xf;\n const pduType = (hdr.readUInt8(0) >> 4) & 0xf;\n\n if (isMIAMVersion(version) && isMIAMCorePdu(pduType)) {\n const versionPduHandler =\n this.VersionPduHandlerTable[version][pduType];\n return versionPduHandler(hdr, body);\n } else {\n return {\n decoded: false,\n error:\n 'Invalid version and PDU type combination: v=' +\n version +\n ', pdu=' +\n pduType,\n };\n }\n },\n [MIAMFid.FileTransferRequest]: () => {\n return {\n decoded: false,\n error: 'File Transfer Request not implemented',\n };\n },\n [MIAMFid.FileTransferAccept]: () => {\n return {\n decoded: false,\n error: 'File Transfer Accept not implemented',\n };\n },\n [MIAMFid.FileSegment]: () => {\n return { decoded: false, error: 'File Segment not implemented' };\n },\n [MIAMFid.FileTransferAbort]: () => {\n return { decoded: false, error: 'File Transfer Abort not implemented' };\n },\n [MIAMFid.XOFFIndication]: () => {\n return { decoded: false, error: 'XOFF Indication not implemented' };\n },\n [MIAMFid.XONIndication]: () => {\n return { decoded: false, error: 'XON Indication not implemented' };\n },\n };\n\n private static arincCrc16(buf: Buffer, seed?: number) {\n const crctable = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,\n 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,\n 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,\n 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,\n 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,\n 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,\n 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,\n 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,\n 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,\n 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,\n 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,\n 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,\n 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,\n 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,\n 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,\n 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,\n 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,\n 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,\n 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,\n 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,\n 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,\n 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,\n 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,\n 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,\n 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,\n 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\n ];\n\n let crc = (seed || 0) & 0xffff;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^\n crctable[(((crc >>> 8) ^ buf.readUInt8(i)) >>> 0) & 0xff]) >>>\n 0;\n }\n\n return crc & 0xffff;\n }\n\n private static arinc665Crc32(buf: Buffer, seed?: number) {\n const crctable = [\n 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,\n 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,\n 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,\n 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,\n 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,\n 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,\n 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,\n 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,\n 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,\n 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,\n 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,\n 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,\n 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,\n 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,\n 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,\n 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,\n 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,\n 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,\n 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,\n 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,\n 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,\n 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,\n 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,\n 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,\n 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,\n 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,\n 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,\n 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,\n 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,\n 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,\n 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,\n 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,\n 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,\n 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,\n 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,\n 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,\n 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,\n 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,\n 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,\n 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,\n 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,\n 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,\n 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4,\n ];\n\n let crc = seed || 0;\n\n for (let i = 0; i < buf.length; i++) {\n crc =\n (((crc << 8) >>> 0) ^\n crctable[((crc >>> 24) ^ buf.readUInt8(i)) >>> 0]) >>>\n 0;\n }\n\n return crc;\n }\n\n public static parse(txt: string): PduDecodingResult {\n const fidType = txt[0];\n\n if (isMIAMFid(fidType)) {\n const handler = this.FidHandlerTable[fidType];\n return handler(txt.substring(1));\n } else {\n return {\n decoded: false,\n error: 'Unsupported FID type: ' + fidType,\n };\n }\n }\n\n private static corePduDataHandler(\n version: MIAMVersion,\n minHdrSize: number,\n crcLen: number,\n hdr: Buffer,\n body?: Buffer,\n ): PduDecodingResult {\n if (hdr.length < minHdrSize) {\n return {\n decoded: false,\n error:\n 'v' +\n version +\n ' header size too short; expected >= ' +\n minHdrSize +\n ', got ' +\n hdr.length,\n };\n }\n\n let pduSize: number | undefined = undefined;\n let pduCompression: number = 0;\n let pduEncoding: number = 0;\n let pduAppType: number = 0;\n let pduAppId: string = '';\n let pduCrc: number = 0;\n let pduData: Buffer | null = null;\n let pduCrcIsOk: boolean = false;\n let pduIsComplete: boolean = true;\n\n let pduErrors: string[] = [];\n\n let tail: string | undefined = undefined;\n let msgNum: number = 0;\n let ackOptions: number = 0;\n\n if (version === MIAMVersion.V1) {\n pduSize =\n (hdr.readUInt8(1) << 16) | (hdr.readUInt8(2) << 8) | hdr.readUInt8(3);\n\n const msgSize = hdr.length + (body === undefined ? 0 : body.length);\n if (pduSize > msgSize) {\n pduIsComplete = false;\n pduErrors.push(\n 'v1 PDU truncated: expecting ' + pduSize + ', got ' + msgSize,\n );\n }\n hdr = hdr.subarray(4);\n\n tail = hdr.subarray(0, 7).toString('ascii');\n hdr = hdr.subarray(7);\n } else if (version === MIAMVersion.V2) {\n hdr = hdr.subarray(1);\n }\n\n msgNum = (hdr.readUInt8(0) >> 1) & 0x7f;\n ackOptions = hdr.readUInt8(0) & 1;\n hdr = hdr.subarray(1);\n\n pduCompression =\n ((hdr.readUInt8(0) << 2) | ((hdr.readUInt8(1) >> 6) & 0x3)) & 0x7;\n pduEncoding = (hdr.readUInt8(1) >> 4) & 0x3;\n pduAppType = hdr.readUInt8(1) & 0xf;\n hdr = hdr.subarray(2);\n\n let appIdLen;\n if (isMIAMCoreApp(pduAppType)) {\n appIdLen = this.AppTypeToAppIdLenTable[version][pduAppType];\n } else {\n if (\n version === MIAMVersion.V2 &&\n (pduAppType & 0x8) !== 0 &&\n pduAppType !== 0xd\n ) {\n appIdLen = (pduAppType & 0x7) + 1;\n } else {\n return {\n decoded: false,\n error: 'Invalid v' + version + ' appType: ' + pduAppType,\n };\n }\n }\n\n const pduIsACARS =\n [\n MIAMCoreApp.ACARS2Char,\n MIAMCoreApp.ACARS4Char,\n MIAMCoreApp.ACARS6Char,\n ].indexOf(pduAppType) >= 0;\n\n if (hdr.length < appIdLen + crcLen) {\n return {\n decoded: false,\n error: 'Header too short for v' + version + ' appType: ' + pduAppType,\n };\n }\n\n pduAppId = hdr.subarray(0, appIdLen).toString('ascii');\n hdr = hdr.subarray(appIdLen);\n\n if (crcLen === 4) {\n pduCrc =\n (hdr.readUInt8(0) << 24) |\n (hdr.readUInt8(1) << 16) |\n (hdr.readUInt8(2) << 8) |\n hdr.readUInt8(3); // crc\n } else if (crcLen === 2) {\n pduCrc = (hdr.readUInt8(0) << 8) | hdr.readUInt8(1); // crc\n }\n hdr = hdr.subarray(crcLen);\n\n if (body !== undefined && body.length > 0) {\n if (\n [MIAMCoreV1Compression.Deflate, MIAMCoreV2Compression.Deflate].indexOf(\n pduCompression,\n ) >= 0\n ) {\n try {\n const decompress = new zlib.InflateRaw({});\n decompress.write(body);\n decompress.flush(zlib.constants.Z_SYNC_FLUSH);\n pduData = decompress.read();\n } catch (e) {\n pduErrors.push('Inflation failed for body: ' + e);\n }\n } else if (\n [MIAMCoreV1Compression.None, MIAMCoreV2Compression.None].indexOf(\n pduCompression,\n ) >= 0\n ) {\n pduData = body;\n } else {\n pduErrors.push(\n 'Unsupported v' + version + ' compression type: ' + pduCompression,\n );\n }\n\n if (pduData !== null) {\n const crcAlgoHandlerByVersion: Record<\n MIAMVersion,\n (buf: Buffer, seed?: number) => number\n > = {\n [MIAMVersion.V1]: (buf: Buffer, seed?: number) => {\n return ~this.arinc665Crc32(buf, seed);\n },\n [MIAMVersion.V2]: this.arincCrc16,\n };\n\n const crcAlgoHandler = crcAlgoHandlerByVersion[version];\n if (crcAlgoHandler === undefined) {\n return {\n decoded: false,\n error: 'No CRC handler for v' + version,\n };\n }\n\n const crcCheck = crcAlgoHandler(pduData, 0xffffffff);\n if (crcCheck === pduCrc) {\n pduCrcIsOk = true;\n } else {\n pduErrors.push(\n 'Body failed CRC check: provided=' +\n pduCrc +\n ', generated=' +\n crcCheck,\n );\n }\n }\n } else {\n // No PDU body means we can't verify CRC checksum; however, the message should still be valid...\n pduCrcIsOk = true;\n }\n\n let pdu: Pdu = {\n version,\n crc: pduCrc,\n crcOk: pduCrcIsOk,\n complete: pduIsComplete,\n compression: pduCompression,\n encoding: pduEncoding,\n msgNum,\n ackOptions,\n };\n\n if (pduIsACARS) {\n const label = pduAppId.substring(0, 2);\n const sublabel = appIdLen >= 4 ? pduAppId.substring(2, 4) : undefined;\n const mfi = appIdLen >= 6 ? pduAppId.substring(4, 6) : undefined;\n\n pdu.acars = {\n ...(tail ? { tail } : {}),\n label,\n ...(sublabel ? { sublabel } : {}),\n ...(mfi ? { mfi } : {}),\n ...(pduData ? { text: pduData.toString('ascii') } : {}),\n };\n } else {\n pdu.non_acars = {\n appId: pduAppId,\n ...(pduData ? { text: pduData.toString('ascii') } : {}),\n };\n }\n\n return {\n decoded: true,\n message: {\n data: pdu,\n },\n };\n }\n\n static VersionPduHandlerTable: Record<\n MIAMVersion,\n Record<MIAMCorePdu, (hdr: Buffer, body?: Buffer) => PduDecodingResult>\n > = {\n [MIAMVersion.V1]: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => {\n return this.corePduDataHandler(\n MIAMVersion.V1,\n 20,\n MIAMCoreV1CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v1 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v1 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v1 AlohaReply PDU not implemented' };\n },\n },\n [MIAMVersion.V2]: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => {\n return this.corePduDataHandler(\n MIAMVersion.V2,\n 7,\n MIAMCoreV2CRCLength,\n hdr,\n body,\n );\n },\n [MIAMCorePdu.Ack]: () => {\n return { decoded: false, error: 'v2 Ack PDU not implemented' };\n },\n [MIAMCorePdu.Aloha]: () => {\n return { decoded: false, error: 'v2 Aloha PDU not implemented' };\n },\n [MIAMCorePdu.AlohaReply]: () => {\n return { decoded: false, error: 'v2 Aloha reply PDU not implemented' };\n },\n },\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { MIAMCoreUtils } from '../utils/miam';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_MA extends DecoderPlugin {\n name = 'label-ma';\n qualifiers() {\n return {\n labels: ['MA'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n\n const miamResult = MIAMCoreUtils.parse(message.text);\n if (\n miamResult.decoded &&\n miamResult.message.data &&\n miamResult.message.data.acars\n ) {\n decodeResult.decoded = true;\n ResultFormatter.label(decodeResult, miamResult.message.data.acars.label);\n if (miamResult.message.data.acars.sublabel) {\n ResultFormatter.sublabel(\n decodeResult,\n miamResult.message.data.acars.sublabel,\n );\n }\n if (miamResult.message.data.acars.tail) {\n ResultFormatter.tail(\n decodeResult,\n miamResult.message.data.acars.tail.replace('.', ''),\n );\n }\n\n const messageText = miamResult.message.data.acars.text;\n // Only transplant message text if the MIAM core decoded message passed CRC and is complete\n if (\n miamResult.message.data.crcOk &&\n miamResult.message.data.complete &&\n messageText\n ) {\n decodeResult.decoder.decodeLevel = 'full';\n const decoded = this.decoder.decode(\n {\n label: miamResult.message.data.acars.label,\n sublabel: miamResult.message.data.acars.sublabel,\n text: messageText,\n },\n options,\n );\n\n if (decoded.decoded) {\n // decodeResult.decoder.decodeLevel = decoded.decoder.decodeLevel;\n decodeResult.raw = { ...decodeResult.raw, ...decoded.raw };\n decodeResult.formatted.items.push(...decoded.formatted.items);\n decodeResult.remaining = decoded.remaining;\n } else {\n ResultFormatter.text(decodeResult, messageText);\n decodeResult.remaining = { text: messageText };\n }\n } else if (messageText) {\n decodeResult.decoder.decodeLevel = 'partial';\n decodeResult.remaining = { text: messageText };\n } else {\n decodeResult.decoder.decodeLevel = 'partial';\n }\n }\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_SQ extends DecoderPlugin {\n name = 'label-sq';\n\n qualifiers() {\n return {\n labels: ['SQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.preamble = message.text.substring(0, 4);\n decodeResult.raw.version = message.text.substring(1, 2);\n decodeResult.raw.network = message.text.substring(3, 4);\n\n if (decodeResult.raw.version === '2') {\n const regex =\n /0(\\d)X(?<org>\\w)(?<iata>\\w\\w\\w)(?<icao>\\w\\w\\w\\w)(?<station>\\d)(?<lat>\\d+)(?<latd>[NS])(?<lng>\\d+)(?<lngd>[EW])V(?<vfreq>\\d+)\\/.*/;\n const result = message.text.match(regex);\n\n if (result?.groups && result.length >= 8) {\n decodeResult.raw.groundStation = {\n number: result.groups.station,\n iataCode: result.groups.iata,\n icaoCode: result.groups.icao,\n coordinates: {\n latitude:\n (Number(result.groups.lat) / 100) *\n (result.groups.latd === 'S' ? -1 : 1),\n longitude:\n (Number(result.groups.lng) / 100) *\n (result.groups.lngd === 'W' ? -1 : 1),\n },\n };\n decodeResult.raw.vdlFrequency = Number(result.groups.vfreq) / 1000.0;\n }\n }\n\n decodeResult.formatted.description = 'Ground Station Squitter';\n\n var formattedNetwork = 'Unknown';\n if (decodeResult.raw.network == 'A') {\n formattedNetwork = 'ARINC';\n } else if (decodeResult.raw.network == 'S') {\n formattedNetwork = 'SITA';\n }\n decodeResult.formatted.items = [\n {\n type: 'network',\n code: 'NETT',\n label: 'Network',\n value: formattedNetwork,\n },\n {\n type: 'version',\n code: 'VER',\n label: 'Version',\n value: decodeResult.raw.version,\n },\n ];\n\n if (decodeResult.raw.groundStation) {\n if (\n decodeResult.raw.groundStation.icaoCode &&\n decodeResult.raw.groundStation.number\n ) {\n decodeResult.formatted.items.push({\n type: 'ground_station',\n code: 'GNDSTN',\n label: 'Ground Station',\n value: `${decodeResult.raw.groundStation.icaoCode}${decodeResult.raw.groundStation.number}`,\n });\n }\n if (decodeResult.raw.groundStation.iataCode) {\n decodeResult.formatted.items.push({\n type: 'iataCode',\n code: 'IATA',\n label: 'IATA',\n value: decodeResult.raw.groundStation.iataCode,\n });\n }\n if (decodeResult.raw.groundStation.icaoCode) {\n decodeResult.formatted.items.push({\n type: 'icaoCode',\n code: 'ICAO',\n label: 'ICAO',\n value: decodeResult.raw.groundStation.icaoCode,\n });\n }\n if (decodeResult.raw.groundStation.coordinates.latitude) {\n decodeResult.formatted.items.push({\n type: 'coordinates',\n code: 'COORD',\n label: 'Ground Station Location',\n value: `${decodeResult.raw.groundStation.coordinates.latitude}, ${decodeResult.raw.groundStation.coordinates.longitude}`,\n });\n }\n if (decodeResult.raw.groundStation.airport) {\n decodeResult.formatted.items.push({\n type: 'airport',\n code: 'APT',\n label: 'Airport',\n value: `${decodeResult.raw.groundStation.airport.name} (${decodeResult.raw.groundStation.airport.icao}) in ${decodeResult.raw.groundStation.airport.location}`,\n });\n }\n }\n\n if (decodeResult.raw.vdlFrequency) {\n decodeResult.formatted.items.push({\n type: 'vdlFrequency',\n code: 'VDLFRQ',\n label: 'VDL Frequency',\n value: `${decodeResult.raw.vdlFrequency} MHz`,\n });\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QR extends DecoderPlugin {\n name = 'label-qr';\n\n qualifiers() {\n return {\n labels: ['QR'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ON Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.on(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QP extends DecoderPlugin {\n name = 'label-qp';\n\n qualifiers() {\n return {\n labels: ['QP'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OUT Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.out(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_QS extends DecoderPlugin {\n name = 'label-qs';\n\n qualifiers() {\n return {\n labels: ['QS'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'IN Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n ResultFormatter.in(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12)),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { DateTimeUtils } from '../DateTimeUtils';\n\nexport class Label_QQ extends DecoderPlugin {\n name = 'label-qq';\n\n qualifiers() {\n return {\n labels: ['QQ'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.message = message;\n decodeResult.formatted.description = 'OFF Report';\n\n ResultFormatter.departureAirport(\n decodeResult,\n message.text.substring(0, 4),\n );\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n\n if (message.text.substring(12, 19) === '\\r\\n001FE') {\n decodeResult.raw.day = message.text.substring(19, 21);\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(21, 27)),\n );\n let latdir = message.text.substring(27, 28);\n let latdeg = Number(message.text.substring(28, 30));\n let latmin = Number(message.text.substring(30, 34));\n let londir = message.text.substring(34, 35);\n let londeg = Number(message.text.substring(35, 38));\n let lonmin = Number(message.text.substring(38, 42));\n let pos = {\n latitude: (latdeg + latmin / 60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin / 60) * (londir === 'E' ? 1 : -1),\n };\n ResultFormatter.unknown(decodeResult, message.text.substring(42, 45));\n ResultFormatter.position(decodeResult, pos);\n\n if (decodeResult.remaining.text !== '---') {\n ResultFormatter.groundspeed(\n decodeResult,\n Number(message.text.substring(45, 48)),\n );\n } else {\n ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));\n }\n ResultFormatter.unknown(decodeResult, message.text.substring(48));\n } else {\n ResultFormatter.off(\n decodeResult,\n DateTimeUtils.convertHHMMSSToTod(message.text.substring(8, 12) + '00'),\n );\n ResultFormatter.unknown(decodeResult, message.text.substring(12));\n }\n\n decodeResult.decoded = true;\n if (!decodeResult.remaining.text) decodeResult.decoder.decodeLevel = 'full';\n else decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n","import {\n DecodeResult,\n DecoderPluginInterface,\n Message,\n Options,\n} from './DecoderPluginInterface';\n\nimport * as Plugins from './plugins/official';\nexport class MessageDecoder {\n name: string;\n plugins: Array<DecoderPluginInterface>;\n debug: boolean;\n\n constructor() {\n this.name = 'acars-decoder-typescript';\n this.plugins = [];\n this.debug = false;\n\n this.registerPlugin(new Plugins.CBand(this)); // first, for now, so it can wrap other plugins\n this.registerPlugin(new Plugins.Label_ColonComma(this));\n this.registerPlugin(new Plugins.Label_5Z_Slash(this));\n this.registerPlugin(new Plugins.Label_10_LDR(this));\n this.registerPlugin(new Plugins.Label_10_POS(this));\n this.registerPlugin(new Plugins.Label_10_Slash(this));\n this.registerPlugin(new Plugins.Label_12_N_Space(this));\n this.registerPlugin(new Plugins.Label_12_POS(this));\n this.registerPlugin(new Plugins.Label_13Through18_Slash(this));\n this.registerPlugin(new Plugins.Label_15(this));\n this.registerPlugin(new Plugins.Label_15_FST(this));\n this.registerPlugin(new Plugins.Label_16_Honeywell(this));\n this.registerPlugin(new Plugins.Label_16_N_Space(this));\n this.registerPlugin(new Plugins.Label_16_POSA1(this));\n this.registerPlugin(new Plugins.Label_16_TOD(this));\n this.registerPlugin(new Plugins.Label_1J_2J_FTX(this));\n this.registerPlugin(new Plugins.Label_1L_3Line(this));\n this.registerPlugin(new Plugins.Label_1L_070(this));\n this.registerPlugin(new Plugins.Label_1L_660(this));\n this.registerPlugin(new Plugins.Label_1L_Slash(this));\n this.registerPlugin(new Plugins.Label_20_POS(this));\n this.registerPlugin(new Plugins.Label_21_POS(this));\n this.registerPlugin(new Plugins.Label_22_OFF(this));\n this.registerPlugin(new Plugins.Label_22_POS(this));\n this.registerPlugin(new Plugins.Label_24_Slash(this));\n this.registerPlugin(new Plugins.Label_2P_FM3(this));\n this.registerPlugin(new Plugins.Label_2P_FM4(this));\n this.registerPlugin(new Plugins.Label_2P_FM5(this));\n this.registerPlugin(new Plugins.Label_2P_POS(this));\n this.registerPlugin(new Plugins.Label_30_Slash_EA(this));\n this.registerPlugin(new Plugins.Label_44_ETA(this));\n this.registerPlugin(new Plugins.Label_44_IN(this));\n this.registerPlugin(new Plugins.Label_44_OFF(this));\n this.registerPlugin(new Plugins.Label_44_ON(this));\n this.registerPlugin(new Plugins.Label_44_POS(this));\n this.registerPlugin(new Plugins.Label_44_Slash(this));\n this.registerPlugin(new Plugins.Label_4A(this));\n this.registerPlugin(new Plugins.Label_4A_01(this));\n this.registerPlugin(new Plugins.Label_4A_DIS(this));\n this.registerPlugin(new Plugins.Label_4A_DOOR(this));\n this.registerPlugin(new Plugins.Label_4A_Slash_01(this));\n this.registerPlugin(new Plugins.Label_4J_POS(this));\n this.registerPlugin(new Plugins.Label_4N(this));\n this.registerPlugin(new Plugins.Label_4T_AGFSR(this));\n this.registerPlugin(new Plugins.Label_4T_ETA(this));\n this.registerPlugin(new Plugins.Label_B6_Forwardslash(this));\n this.registerPlugin(new Plugins.Label_H2_02E(this));\n this.registerPlugin(new Plugins.Label_H1_FLR(this));\n this.registerPlugin(new Plugins.Label_H1_OHMA(this));\n this.registerPlugin(new Plugins.Label_H1_Paren(this));\n this.registerPlugin(new Plugins.Label_H1_WRN(this));\n this.registerPlugin(new Plugins.Label_H1(this));\n this.registerPlugin(new Plugins.Label_H1_StarPOS(this));\n this.registerPlugin(new Plugins.Label_HX(this));\n this.registerPlugin(new Plugins.Label_58(this));\n this.registerPlugin(new Plugins.Label_80(this));\n this.registerPlugin(new Plugins.Label_83(this));\n this.registerPlugin(new Plugins.Label_8E(this));\n this.registerPlugin(new Plugins.Label_1M_Slash(this));\n this.registerPlugin(new Plugins.Label_MA(this));\n this.registerPlugin(new Plugins.Label_SQ(this));\n this.registerPlugin(new Plugins.Label_QP(this));\n this.registerPlugin(new Plugins.Label_QQ(this));\n this.registerPlugin(new Plugins.Label_QR(this));\n this.registerPlugin(new Plugins.Label_QS(this));\n }\n\n registerPlugin(plugin: DecoderPluginInterface): boolean {\n // plugin.onRegister(this.store);\n this.plugins.push(plugin);\n return true;\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const usablePlugins = this.plugins.filter((plugin) => {\n const qualifiers = plugin.qualifiers();\n\n if (\n qualifiers.labels.includes(message.label) ||\n (qualifiers.labels.length === 1 && qualifiers.labels[0] === '*')\n ) {\n if (qualifiers.preambles && qualifiers.preambles.length > 0) {\n const matching = qualifiers.preambles.filter((preamble: string) => {\n // console.log(message.text.substring(0, preamble.length));\n // console.log(preamble);\n return message.text.substring(0, preamble.length) === preamble;\n });\n return matching.length >= 1;\n } else {\n return true;\n }\n }\n\n return false;\n });\n\n if (options.debug) {\n console.log('Usable plugins');\n console.log(usablePlugins);\n }\n\n let result: DecodeResult = {\n decoded: false,\n error: 'No known decoder plugin for this message',\n decoder: {\n name: 'none',\n type: 'none',\n decodeLevel: 'none',\n },\n message: message,\n remaining: {\n text: message.text,\n },\n raw: {},\n formatted: {\n description: 'Not Decoded',\n items: [],\n },\n };\n\n // for-in is not happy. doing it the old way\n for (let i = 0; i < usablePlugins.length; i++) {\n const plugin = usablePlugins[i];\n result = plugin.decode(message);\n if (result.decoded) {\n break;\n }\n }\n\n if (options.debug) {\n console.log('Result');\n console.log(result);\n }\n\n return result;\n }\n}\n"],"mappings":"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AA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAChE;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,IAC1B;AAEA,QAAI,OAAO,QAAQ,KAAK;AAExB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aACK,OAAO,MAAO,IACf,UAAY,QAAQ,IAAK,IAAI,UAAU,CAAC,OAAO,IAAK,GAAI,OAC1D;AAAA,IACJ;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,OAAe,cAAc,KAAa,MAAe;AACvD,UAAM,WAAW;AAAA,MACf;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MAC5D;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA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","names":["data","decoded","zlib","import_node_buffer","MIAMVersion","MIAMFid","MIAMCorePdu","MIAMCoreApp"]}