@airframes/acars-decoder 1.6.9 → 1.6.11
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 +926 -459
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +926 -459
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../lib/IcaoDecoder.ts","../lib/DecoderPlugin.ts","../lib/plugins/Label_5Z.ts","../lib/utils/coordinate_utils.ts","../lib/plugins/Label_12_N_Space.ts","../lib/plugins/Label_15.ts","../lib/plugins/Label_15_FST.ts","../lib/plugins/Label_16_N_Space.ts","../lib/DateTimeUtils.ts","../lib/plugins/Label_1M_Slash.ts","../lib/plugins/Label_20_POS.ts","../lib/plugins/Label_21_POS.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_80.ts","../lib/plugins/Label_8E.ts","../lib/plugins/Label_B6.ts","../lib/plugins/Label_ColonComma.ts","../lib/plugins/Label_H1_FLR.ts","../lib/utils/result_formatter.ts","../lib/utils/route_utils.ts","../lib/utils/flight_plan_utils.ts","../lib/utils/h1_helper.ts","../lib/plugins/Label_H1_FPN.ts","../lib/plugins/Label_H1_FTX.ts","../lib/plugins/Label_H1_INI.ts","../lib/plugins/Label_H1_OHMA.ts","../lib/plugins/Label_H1_POS.ts","../lib/plugins/Label_H1_WRN.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/utils/miam.ts","../lib/MessageDecoder.ts"],"sourcesContent":["export class IcaoDecoder {\n name : string;\n icao : string;\n\n constructor(icao: string) {\n this.name = 'icao-decoder-typescript';\n this.icao = icao;\n }\n\n isMilitary() {\n let i = this.icao;\n return (\n false\n // us military\n //adf7c8-adf7cf = united states mil_5(uf)\n //adf7d0-adf7df = united states mil_4(uf)\n //adf7e0-adf7ff = united states mil_3(uf)\n //adf800-adffff = united states mil_2(uf)\n || i.match(/^adf[7-9]/)\n || i.match(/^adf[a-f]/)\n //ae0000-afffff = united states mil_1(uf)\n || i.match(/^a(e|f)/)\n\n //010070-01008f = egypt_mil\n || i.match(/^0100(7|8)/)\n\n //0a4000-0a4fff = algeria mil(ap)\n || i.match(/^0a4/)\n\n //33ff00-33ffff = italy mil(iy)\n || i.match(/^33ff/)\n\n //350000-37ffff = spain mil(sp)\n || (i >= '350000' && i <= '37ffff')\n\n //3a8000-3affff = france mil_1(fs)\n || i.match(/^3a(8|9|[a-f])/)\n //3b0000-3bffff = france mil_2(fs)\n || i.match(/^3b/)\n\n //3e8000-3ebfff = germany mil_1(df)\n // remove 8 and 9 from mil arnge\n || i.match(/^3e(a|b)/)\n //3f4000-3f7fff = germany mil_2(df)\n //3f8000-3fbfff = germany mil_3(df)\n || i.match(/^3f([4-9]|[a-b])/)\n\n //400000-40003f = united kingdom mil_1(ra)\n || i.match(/^4000[0-3]/)\n //43c000-43cfff = united kingdom mil(ra)\n || i.match(/^43c/)\n\n //444000-447fff = austria mil(aq)\n || (i.match(/^44[4-7]/) && i != '447ac7')\n\n //44f000-44ffff = belgium mil(bc)\n || i.match(/^44f/)\n\n //457000-457fff = bulgaria mil(bu)\n || i.match(/^457/)\n\n //45f400-45f4ff = denmark mil(dg)\n || i.match(/^45f4/)\n\n //468000-4683ff = greece mil(gc)\n || i.match(/^468[0-3]/)\n\n //473c00-473c0f = hungary mil(hm)\n || i.match(/^473c0/)\n\n //478100-4781ff = norway mil(nn)\n || i.match(/^4781/)\n //480000-480fff = netherlands mil(nm)\n || i.match(/^480/)\n //48d800-48d87f = poland mil(po)\n || i.match(/^48d8[0-7]/)\n //497c00-497cff = portugal mil(pu)\n || i.match(/^497c/)\n //498420-49842f = czech republic mil(ct)\n || i.match(/^49842/)\n\n //4b7000-4b7fff = switzerland mil(su)\n || i.match(/^4b7/)\n //4b8200-4b82ff = turkey mil(tq)\n || i.match(/^4b82/)\n\n //506f00-506fff = slovenia mil(sj)\n || i.match(/^506f/)\n\n //70c070-70c07f = oman mil(on)\n || i.match(/^70c07/)\n\n //710258-71025f = saudi arabia mil_1(sx)\n //710260-71027f = saudi arabia mil_2(sx)\n //710280-71028f = saudi arabia mil_3(sx)\n //710380-71039f = saudi arabia mil_4(sx)\n || i.match(/^7102[5-8]/)\n || i.match(/^7103[8-9]/)\n\n //738a00-738aff = israel mil(iz)\n || i.match(/^738a/)\n\n //7c822e-7c822f = australia mil_1(av)\n //7c8230-7c823f = australia mil_2(av)\n //7c8240-7c827f = australia mil_3(av)\n //7c8280-7c82ff = australia mil_4(av)\n //7c8300-7c83ff = australia mil_5(av)\n //7c8400-7c87ff = australia mil_6(av)\n //7c8800-7c8fff = australia mil_7(av)\n || i.match(/^7c8([2-4]|8)/)\n //7c9000-7c9fff = australia mil_8(av)\n //7ca000-7cbfff = australia mil_9(av)\n || (i >= '7c9000' && i <= '7cbfff')\n //7cc000-7cffff = australia mil_10(av) 7cc409 not mil, remove this range\n //7d0000-7dffff = australia mil_11(av)\n //7e0000-7fffff = australia mil_12(av)\n || i.match(/^7[d-f]/)\n\n //800200-8002ff = india mil(im)\n || i.match(/^8002/)\n\n //c20000-c3ffff = canada mil(cb)\n || i.match(/^c[2-3]/)\n\n //e40000-e41fff = brazil mil(bq)\n || i.match(/^e4[0-1]/)\n\n //e80600-e806ff = chile mil(cq)\n || i.match(/^e806/)\n );\n }\n\n}\n\nexport default {\n};\n","import { DecodeResult, DecoderPluginInterface, Message, Options } from './DecoderPluginInterface';\n\nexport abstract class DecoderPlugin implements DecoderPluginInterface {\n decoder!: any;\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 : any, options : Options = {}) {\n this.decoder = decoder;\n this.options = options;\n }\n\n id() : string { // eslint-disable-line class-methods-use-this\n console.log('DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!');\n return 'abstract_decoder_plugin';\n }\n\n meetsStateRequirements() : boolean { // eslint-disable-line class-methods-use-this\n return true;\n }\n\n // onRegister(store: Store<any>) {\n // this.store = store;\n // }\n\n qualifiers() : any { // eslint-disable-line class-methods-use-this\n const labels : Array<string> = [];\n\n return {\n labels,\n };\n }\n\n decode(message: Message) : DecodeResult { // eslint-disable-line class-methods-use-this\n const decodeResult: any = this.defaultResult();\n decodeResult.remaining.text = message.text;\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_5Z extends DecoderPlugin {\n name = 'label-5z';\n\n descriptions: any = {\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 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() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['5Z'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Designated Downlink';\n\n const uaRegex = /^\\/(?<type>\\w+) (?<remainder>.+)/;\n let results = message.text.match(uaRegex);\n\n if (results && results.length >= 2) {\n // Successful match: United Airlines 5Z message\n const type : string = results.groups.type.split('/')[0];\n const { remainder } = results.groups;\n // console.log(results);\n // console.log(`DECODER: Matched 'United Airlines 5Z': type = ${type}, remainder = ${remainder}`);\n\n const typeDescription: string = this.descriptions[type] ? this.descriptions[type] : 'Unknown';\n decodeResult.raw.airline = 'United Airlines';\n decodeResult.formatted.items.push({\n type: '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 label: 'Message Type',\n value: `${typeDescription} (${type})`,\n });\n\n if (type === 'B3') {\n const rdcRegex = /^(?<from>\\w\\w\\w)(?<to>\\w\\w\\w) (?<unknown1>\\d\\d) R(?<runway>.+) G(?<unknown2>.+)$/; // eslint-disable-line max-len\n results = remainder.match(rdcRegex);\n\n if (results) {\n decodeResult.raw.origin = results.groups.from;\n decodeResult.formatted.items.push({\n type: 'origin',\n label: 'Origin',\n value: `${results.groups.from}`,\n });\n decodeResult.raw.destination = results.groups.to;\n decodeResult.formatted.items.push({\n type: 'destination',\n label: 'Destination',\n value: `${results.groups.to}`,\n });\n decodeResult.formatted.items.push({\n type: 'unknown1',\n label: 'Unknown Field 1',\n value: `${results.groups.unknown1}`,\n });\n decodeResult.raw.runway = results.groups.runway;\n decodeResult.formatted.items.push({\n type: 'runway',\n label: 'Runway',\n value: `${results.groups.runway}`,\n });\n decodeResult.formatted.items.push({\n type: 'unknown2',\n label: 'Unknown Field 2',\n value: `${results.groups.unknown2}`,\n });\n } else {\n if (options.debug) {\n console.log(`Decoder: Unkown 5Z RDC format: ${remainder}`);\n }\n }\n } else {\n decodeResult.remaining.text = remainder;\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 5Z message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\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(stringCoords: string) : {latitude: number, longitude: number} | undefined{ // eslint-disable-line class-methods-use-this\n var results : any = {};\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 ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n results.latitude = (Number(stringCoords.substring(1, 6)) / 1000) * (firstChar === 'S' ? -1 : 1);\n results.longitude = (Number(longitudeChars) / 1000) * (middleChar === 'W' ? -1 : 1);\n } else {\n return;\n }\n\n return results;\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(stringCoords: string) : {latitude: number, longitude: number} | undefined{ // eslint-disable-line class-methods-use-this\n var results : any = {};\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 ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n results.latitude = (latDeg + (latMin / 60)) * (firstChar === 'S' ? -1 : 1);\n results.longitude = (lonDeg + (lonMin / 60)) * (middleChar === 'W' ? -1 : 1);\n } else {\n return;\n }\n\n return results;\n }\n public static coordinateString(coords: {latitude: number, longitude: number}) : 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}","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\nexport class Label_12_N_Space extends DecoderPlugin {\n name = 'label-12-n-space';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"12\"],\n preambles: ['N '],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n const variant1Regex = /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*),.(?<airframe>.*),(?<unkwn3>.*)$/;\n\n let results;\n if (results = message.text.match(variant1Regex)) {\n if (options.debug) {\n console.log(`Label 12 N : results`);\n console.log(results);\n }\n\n decodeResult.raw.position = {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1)\n };\n decodeResult.raw.flight_level = results.groups.alt == 'GRD' || results.groups.alt == '***' ? '0' : Number(results.groups.alt);\n\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n\n decodeResult.formatted.items.push({\n type: 'flight_level',\n code: 'FL',\n label: 'Flight Level',\n value: decodeResult.raw.flight_level,\n });\n\n decodeResult.remaining.text = `,${results.groups.unkwn1} ,${results.groups.unkwn2}, ${results.groups.unkwn3}`;\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// General Aviation Position Report\nexport class Label_15 extends DecoderPlugin {\n name = 'label-5z';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['15'],\n preambles: ['(2'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n\n const twoZeeRegex = /^\\(2(?<between>.+)\\(Z$/;\n const results = message.text.match(twoZeeRegex);\n if (results) {\n // Style: (2N38111W 82211266 76400-64(Z\n // console.log(`Label 15 Position Report: between = ${results.groups.between}`);\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(results.groups.between.substr(0,13));\n if(decodeResult.raw.position) {\n\tdecodeResult.formatted.items.push({\n type: 'position',\n\tcode: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// Position Report\nexport class Label_15_FST extends DecoderPlugin {\n name = 'label-15-fst';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['15'],\n preambles: ['FST01'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n\n // FST01KMCOEGKKN505552W00118021\n\n decodeResult.raw.departure_icao=message.text.substring(5,9);\n decodeResult.raw.arrival_icao=message.text.substring(9,13);\n\n const stringCoords = message.text.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 ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n decodeResult.raw.position.latitude = (Number(stringCoords.substring(1, 7)) / 10000) * (firstChar === 'S' ? -1 : 1);\n decodeResult.raw.position.longitude = (Number(stringCoords.substring(8, 26)) / 100000) * (middleChar === 'W' ? -1 : 1);\n } else {\n \tdecodeResult.decoded = false;\n \tdecodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.formatted.items.push({\n type: 'position',\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position)\n });\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\nexport class Label_16_N_Space extends DecoderPlugin {\n name = 'label-16-n-space';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"16\"],\n preambles: ['N '],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = 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 = /^(?<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 = /^(?<lat>[NS])\\s(?<lat_coord>.*)\\/(?<long>[EW])\\s*(?<long_coord>.*)$/;\n\n let results;\n if (results = message.text.match(variant1Regex)) {\n if (options.debug) {\n console.log(`Label 16 N : results`);\n console.log(results);\n }\n\n decodeResult.raw.position = {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1),\n };\n decodeResult.raw.flight_level = results.groups.alt == 'GRD' || results.groups.alt == '***' ? '0' : Number(results.groups.alt);\n\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n\n decodeResult.formatted.items.push({\n type: 'flight_level',\n code: 'FL',\n label: 'Flight Level',\n value: decodeResult.raw.flight_level,\n });\n\n decodeResult.remaining.text = `,${results.groups.unkwn1} ,${results.groups.unkwn2}`;\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n } else if (results = message.text.match(variant2Regex)) {\n if (options.debug) {\n console.log(`Label 16 N : results`);\n console.log(results);\n }\n\n decodeResult.raw.position = {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1)\n };\n \n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n } else {\n // Unknown\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 }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","export class DateTimeUtils {\n\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(+timeString.substr(0, 2), +timeString.substr(2, 2), +timeString.substr(4, 2));\n } else {\n utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);\n }\n return utcDate.toUTCString();\n }\n\n /**\n * \n * @param time HHMMSS\n * @returns seconds since midnight\n */\n public static convertHHMMSSToTod(time: string): number{\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\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_1M_Slash extends DecoderPlugin {\n name = 'label-1m-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"1M\"],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = 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 decodeResult.raw.departure_icao = results[3];\n decodeResult.raw.arrival_icao = results[4];\n decodeResult.raw.alternate_icao = results[5];\n // results[6]: 2JK0 (???)\n // results[7] 1940 - UTC eta\n decodeResult.raw.arrival_runway = results[8].replace(decodeResult.raw.arrival_icao, \"\"); // results[8] EGLL27L\n // results[9]: 10(space) (???)\n\n decodeResult.formatted.items.push({\n type: 'eta',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.UTCDateTimeToString(results[2], results[7]),\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// Position Report\nexport class Label_20_POS extends DecoderPlugin {\n name = 'label-20-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['20'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = 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 console.log('Content: ' + content);\n\n const fields = content.split(',');\n console.log('Field Count: ' + fields.length);\n\n if (fields.length == 11) {\n // N38160W077075,,211733,360,OTT,212041,,N42,19689,40,544\n console.log(`DEBUG: ${this.name}: Variation 1 detected`);\n\n // Field 1: Coordinates\n const rawCoords = fields[0];\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(rawCoords);\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else if (fields.length == 5) {\n // N38160W077075,,211733,360,OTT\n console.log(`DEBUG: ${this.name}: Variation 2 detected`);\n\n // Field 1: Coordinates\n const rawCoords = fields[0];\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(rawCoords);\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else {\n // Unknown!\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// Position Report\nexport class Label_21_POS extends DecoderPlugin {\n name = 'label-21-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['21'],\n preambles: ['POS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = 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 console.log('Content: ' + content);\n\n const fields = content.split(',');\n console.log('Field Count: ' + fields.length);\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 processAlt( decodeResult, fields[3]);\n processTemp(decodeResult, fields[6]);\n processArrvApt(decodeResult, fields[8]);\n\n decodeResult.raw.remaining = [\n fields[1],\n fields[2],\n fields[4],\n fields[5],\n fields[7],\n ].join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\nfunction processPosition(decodeResult: any, value: string): boolean {\n // N 39.841W 75.790\n if(value.length !== 16 && value[0] !== 'N' && value[0] !== 'S' && value[8] !== 'W' && value[8] !== 'E') {\n return false;\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 if (position) {\n decodeResult.raw.position = position\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(position),\n });\n }\n return !!position;\n}\n\nfunction processAlt(decodeResult: any, value: string) {\n decodeResult.raw.altitude = Number(value);\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: 'Altitude',\n value: `${decodeResult.raw.altitude} feet`,\n });\n}\nfunction processTemp(decodeResult: any, value: string) {\n decodeResult.raw.outside_air_temperature = Number(value.substring(1)) * (value.charAt(0) === 'M' ? -1 : 1);\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}`,\n });\n}\nfunction processArrvApt(decodeResult: any, value: string) {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n};\n\nexport default {};\n\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_30_Slash_EA extends DecoderPlugin {\n name = 'label-30-slash-ea';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"30\"],\n preambles: ['/EA'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = 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 decodeResult.formatted.items.push({\n type: 'eta',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.UTCToString(results[0].substr(2, 4)),\n });\n\n if (results[1].substr(0, 2) === \"DS\") {\n decodeResult.raw.arrival_icao = results[1].substr(2, 4);\n\tdecodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n // We don't know what the /SK section means. We have seen various numbers\n // after the /SK.\n decodeResult.remaining.text = \"/\".concat(results[2]);\n } else {\n decodeResult.remaining.text = \"/\".concat(results[1], \"/\", results[2])\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// In Air Report\nexport class Label_44_ETA extends DecoderPlugin {\n name = 'label-44-eta';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'ETA Report';\n decodeResult.message = message;\n\n // Style: IN02,N38338W121179,KMHR,KPDX,0806,2355,005.1\n // Match: IN02,coords,departure_icao,arrival_icao,current_date,current_time,fuel_in_tons\n const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results) {\n if (options.debug) {\n console.log(`Label 44 ETA Report: groups`);\n console.log(results.groups);\n }\n\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords);\n\n decodeResult.raw.departure_icao = results.groups.departure_icao;\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.raw.current_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.current_time.substr(0, 2) + \":\" +\n results.groups.current_time.substr(2, 2) + \":00Z\"\n );\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// In Air Report\nexport class Label_44_IN extends DecoderPlugin {\n name = 'label-44-in';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'In Air Report';\n decodeResult.message = message;\n\n // Style: IN02,N38338W121179,KMHR,KPDX,0806,2355,005.1\n // Match: IN02,coords,departure_icao,arrival_icao,current_date,current_time,fuel_in_tons\n const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results) {\n if (options.debug) {\n console.log(`Label 44 In Air Report: groups`);\n console.log(results.groups);\n }\n\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords);\n\n decodeResult.raw.departure_icao = results.groups.departure_icao;\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.raw.current_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.current_time.substr(0, 2) + \":\" +\n results.groups.current_time.substr(2, 2) + \":00Z\"\n );\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// Off Runway Report\nexport class Label_44_OFF extends DecoderPlugin {\n name = 'label-44-off';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Off Runway Report';\n decodeResult.message = message;\n\n // Style: OFF02,N38334W121176,KMHR,KPDX,0807,0014,0123,004.9\n // Match: OFF02,coords,departure_icao,arrival_icao,current_date,current_time,eta_time,fuel_in_tons\n const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results) {\n if (options.debug) {\n console.log(`Label 44 Off Runway Report: groups`);\n console.log(results.groups);\n }\n\n decodeResult.raw.departure_icao = results.groups.departure_icao;\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.raw.current_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.current_time.substr(0, 2) + \":\" +\n results.groups.current_time.substr(2, 2) + \":00Z\"\n );\n decodeResult.raw.eta_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.eta_time.substr(0, 2) + \":\" +\n results.groups.eta_time.substr(2, 2) + \":00Z\"\n );\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords);\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// On Runway Report\nexport class Label_44_ON extends DecoderPlugin {\n name = 'label-44-on';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'On Runway Report';\n decodeResult.message = message;\n\n // Style: ON02,N38333W121178,KRNO,KMHR,0806,2350,005.2\n // Match: ON02,coords,departure_icao,arrival_icao,current_date,current_time,fuel_in_tons\n const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results) {\n if (options.debug) {\n console.log(`Label 44 On Runway Report: groups`);\n console.log(results.groups);\n }\n\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords);\n\n decodeResult.raw.departure_icao = results.groups.departure_icao;\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.raw.current_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.current_time.substr(0, 2) + \":\" +\n results.groups.current_time.substr(2, 2) + \":00Z\"\n );\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// General Aviation Position Report\nexport class Label_44_POS extends DecoderPlugin {\n name = 'label-44-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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: any = 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 = /^.*,(?<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) {\n if (options.debug) {\n console.log(`Label 44 Position Report: groups`);\n console.log(results.groups);\n }\n\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords);\n decodeResult.raw.flight_level = results.groups.flight_level_or_ground == 'GRD' || results.groups.flight_level_or_ground == '***' ? '0' : Number(results.groups.flight_level_or_ground);\n decodeResult.raw.departure_icao = results.groups.departure_icao;\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.raw.current_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.current_time.substr(0, 2) + \":\" +\n results.groups.current_time.substr(2, 2) + \":00Z\"\n );\n decodeResult.raw.eta_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.eta_time.substr(0, 2) + \":\" +\n results.groups.eta_time.substr(2, 2) + \":00Z\"\n );\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS' ,\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'flight_level',\n code: 'FL',\n label: 'Flight Level',\n value: decodeResult.raw.flight_level,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// Airline Defined\n// 3N01 POSRPT\nexport class Label_80 extends DecoderPlugin {\n name = 'label-80';\n\n descriptions: any = {\n ALT: 'Altitude',\n DWND: 'Wind Direction',\n ETA: 'Estimated Time of Arrival',\n FOB: 'Fuel on Board',\n FL: 'Flight Level',\n HDG: 'Heading',\n MCH: 'Aircraft Speed',\n NWYP: 'Next Waypoint',\n POS: 'Aircraft Position',\n SAT: 'Static Air Temperature',\n SWND: 'Wind Speed',\n TAS: 'True Airspeed',\n WYP: 'Waypoint',\n }\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['80'],\n preambles: ['3N01 POSRPT'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.formatted.description = 'Airline Defined Position Report';\n\n const parts = message.text.split('\\n');\n\n let posRptRegex = /^3N01 POSRPT \\d\\d\\d\\d\\/\\d\\d (?<orig>\\w+)\\/(?<dest>\\w+) \\.(?<tail>[\\w-]+)(\\/(?<agate>.+) (?<sta>\\w+:\\w+))*/; // eslint-disable-line max-len\n let results = parts[0].match(posRptRegex);\n if (results && results.length > 0) {\n decodeResult.raw.origin = results.groups.orig;\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: `${results.groups.orig}`,\n });\n\n decodeResult.raw.destination = results.groups.dest;\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: `${results.groups.dest}`,\n });\n\n decodeResult.raw.tail = results.groups.tail;\n decodeResult.formatted.items.push({\n type: 'tail',\n label: 'Tail',\n value: `${results.groups.tail}`,\n });\n\n if (results.groups.agate) {\n decodeResult.raw.arrival_gate = results.groups.agate;\n decodeResult.formatted.items.push({\n type: 'arrival_gate',\n code: 'ARG',\n label: 'Arrival Gate',\n value: `${results.groups.agate}`,\n });\n\n decodeResult.raw.scheduled_time_of_arrival = results.groups.sta\n decodeResult.formatted.items.push({\n type: 'scheduled_time_of_arrival',\n code: 'STA',\n label: 'Scheduled Time of Arrival',\n value: `${results.groups.sta}`,\n });\n }\n\n posRptRegex = /\\/(?<field>\\w+)\\s(?<value>[\\w\\+\\-:\\.]+)\\s*/gi; // eslint-disable-line no-useless-escape\n // console.log('Regex:', posRptRegex);\n const remainingParts = parts.slice(1);\n // console.log(\"Remaining Parts:\", remainingParts);\n\n for (const part of remainingParts) { // eslint-disable-line no-restricted-syntax\n // console.log('Part:', part);\n const matches = part.matchAll(posRptRegex);\n // console.log('Matches:', matches);\n for (const match of matches) { // eslint-disable-line no-restricted-syntax\n // console.log('Match:', match);\n switch (match.groups.field) {\n case 'ALT': {\n decodeResult.raw.altitude = match.groups.value;\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: this.descriptions[match.groups.field],\n value: `${decodeResult.raw.altitude} feet`,\n });\n break;\n }\n case 'DWND': {\n decodeResult.raw.wind_direction = Number(match.groups.value);\n decodeResult.formatted.items.push({\n type: 'wind_direction',\n code: 'DWND',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.wind_direction,\n });\n break;\n }\n case 'FL': {\n decodeResult.raw.flight_level = match.groups.value;\n decodeResult.formatted.items.push({\n type: 'flight_level',\n code: 'FL',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.flight_level,\n });\n break;\n }\n case 'FOB': {\n decodeResult.raw.fuel_on_board = match.groups.value;\n decodeResult.formatted.items.push({\n type: 'fuel_on_board',\n code: 'FOB',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.fuel_on_board,\n });\n break;\n }\n case 'HDG': {\n decodeResult.raw.heading = Number(match.groups.value);\n decodeResult.formatted.items.push({\n type: 'heading',\n code: 'HDG',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.heading,\n });\n break;\n }\n case 'MCH': {\n decodeResult.raw.mach = match.groups.value / 1000;\n decodeResult.formatted.items.push({\n type: 'mach',\n code: 'MCH',\n label: this.descriptions[match.groups.field],\n value: `${decodeResult.raw.mach} Mach`,\n });\n break;\n }\n case 'NWYP': {\n decodeResult.raw.next_waypoint = match.groups.value;\n decodeResult.formatted.items.push({\n type: 'next_waypoint',\n code: 'NWYP',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.next_waypoint,\n });\n break;\n }\n case 'POS': {\n\t // don't use decodeStringCoordinates because of different position format\n\t const posRegex = /^(?<latd>[NS])(?<lat>.+)(?<lngd>[EW])(?<lng>.+)/;\n const posResult = match.groups.value.match(posRegex);\n const lat = Number(posResult.groups.lat) * (posResult.groups.lngd === 'S' ? -1 : 1);\n const lon = Number(posResult.groups.lng) * (posResult.groups.lngd === 'W' ? -1 : 1);\n const latitude = Number.isInteger(lat) ? lat/1000 : lat/100;\n const longitude = Number.isInteger(lon) ? lon/1000 : lon/100;\n decodeResult.raw.position = {\n latitude: latitude,\n longitude: longitude,\n };\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n break;\n }\n case 'SWND': {\n decodeResult.raw.wind_speed = Number(match.groups.value);\n decodeResult.formatted.items.push({\n type: 'wind_speed',\n code: 'SWND',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.wind_speed,\n });\n break;\n }\n default: {\n if (match.groups.field != undefined) {\n const description = this.descriptions[match.groups.field] ? this.descriptions[match.groups.field] : 'Unknown';\n decodeResult.formatted.items.push({\n type: match.groups.field,\n code: match.groups.field,\n label: description || `Unknown (${match.groups.field})`,\n value: `${match.groups.value}`,\n });\n }\n }\n }\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decodeLevel = 'partial';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\n// ETA\nexport class Label_8E extends DecoderPlugin {\n name = 'label-8e';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"8E\"],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = 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) {\n if (options.debug) {\n console.log(`Label 8E ETA: groups`);\n console.log(results.groups);\n }\n\n decodeResult.formatted.items.push({\n type: 'eta',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.UTCToString(results.groups.arrival_eta),\n });\n\n\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\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() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['B6'],\n preambles: ['/'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = 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\nexport default {};\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() { // eslint-disable-line class-methods-use-this\n return {\n labels: [':;'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n\n decodeResult.raw.frequency = Number(message.text) / 1000;\n\n decodeResult.formatted.description = 'Aircraft Transceiver Frequency Change';\n decodeResult.formatted.items.push({\n type: 'frequency',\n label: 'Frequency',\n value: `${decodeResult.raw.frequency} MHz`,\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_H1_FLR extends DecoderPlugin {\n name = 'label-h1-flr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['FLR', '#CFBFLR'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult: any = 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 decodeResult.remaining.text = '';\n\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 if(field.startsWith('PN')) {\n processUnknown(decodeResult, '/' + field);\n } else {\n processUnknown(decodeResult, '/' + field);\n }\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 = datetime.substring(4,6) + datetime.substring(2,4)+ datetime.substring(0,2);\n\n processUnknown(decodeResult, data.substring(12));\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);\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 decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n\t return decodeResult;\n }\n}\n\nexport default {};\n\nfunction processUnknown(decodeResult: any, value: string) {\n decodeResult.remaining.text += value;\n}\n","import { DecodeResult } from \"../DecoderPluginInterface\";\n\n/**\n * Class to format the results of common fields\n */\nexport class ResultFormatter {\n\n static altitude(decodeResult: DecodeResult, value: number) {\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 public static flightNumber(decodeResult: any, value: string) {\n decodeResult.raw.flight_number = value;\n };\n\n public static departureAirport(decodeResult: any, value: string) {\n decodeResult.raw.departure_icao = value;\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\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 public static arrivalAirport(decodeResult: any, value: string) {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n };\n\n public static eta(decodeResult: DecodeResult, value: string) {\n decodeResult.formatted.items.push({\n type: 'eta',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: value.substring(0, 2) + ':' + value.substring(2, 4) + ':' + value.substring(4, 6),\n });\n }\n\n public static arrivalRunway(decodeResult: any, value: string) {\n decodeResult.raw.arrival_runway = value;\n decodeResult.formatted.items.push({\n type: 'runway',\n label: 'Arrival Runway',\n value: decodeResult.raw.arrival_runway,\n });\n };\n\n\n public static currentFuel(decodeResult: any, 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 public static remainingFuel(decodeResult: any, value: number) {\n decodeResult.raw.fuel_remaining = value;\n decodeResult.formatted.items.push({\n type: 'fuel_remaining',\n label: 'Fuel Remaining',\n value: decodeResult.raw.fuel_remaining.toString(),\n });\n };\n\n\n public 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 public static groundspeed(decodeResult: any, 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}`\n });\n }\n\n\n public static temperature(decodeResult: any, value: string) {\n decodeResult.raw.outside_air_temperature = Number(value.substring(1)) * (value.charAt(0) === 'M' ? -1 : 1);\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}`,\n });\n }\n public static unknown(decodeResult: any, value: string) {\n decodeResult.remaining.text += ',' + value;\n };\n}","import { Route } from \"../types/route\";\nimport { Waypoint } from \"../types/waypoint\";\nimport { CoordinateUtils } from \"./coordinate_utils\";\n\nexport class RouteUtils {\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 }\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 +=`@${RouteUtils.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 {name: regex[1], offset: {bearing: parseInt(regex[2]), distance: parseInt(regex[3])/10}};\n }\n\n const waypoint = leg.split(',');\n if(waypoint.length ==2) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(waypoint[1]);\n if(position) {\n return {name: waypoint[0], latitude: position.latitude, longitude: position.longitude};\n }\n }\n if(leg.length == 13 || leg.length == 14) { //looks like coordinates\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);\n const name = waypoint.length == 2 ? waypoint[0] : '';\n if(position) {\n return {name: name, latitude: position.latitude, longitude: position.longitude};\n }\n }\n return {name: leg};\n }\n\n // move out if we want public\n private static timestampToString(time: number, format: 'tod' | 'epoch'): string {\n const date = new Date(time * 1000); 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 private static waypointsToString(waypoints: Waypoint[]): string {\n let str = waypoints.map((x) => RouteUtils.waypointToString(x)).join( ' > ').replaceAll('> >', '>>');\n if(str.startsWith(' > ')) {\n str = '>>' + str.slice(2);\n }\n return str;\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(decodeResult: DecodeResult, data: string[]): 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 addProcedure(decodeResult, value, 'arrival');\n break;\n case 'AA':\n addArrivalAirport(decodeResult, value);\n break;\n case 'AP':\n addProcedure(decodeResult, value, 'approach');\n break;\n case 'CR':\n addCompanyRoute(decodeResult, value);\n break;\n case 'D': // Departure Procedure\n 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 '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(decodeResult: DecodeResult, header: string): 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 {\n decodeResult.remaining.text += header;\n allKnownFields = false\n }\n return allKnownFields;\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};\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 decodeResult.raw.route = { waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)) };\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(decodeResult.raw.route),\n });\n};\n\nfunction addProcedure(decodeResult: DecodeResult, value: string, type: string) {\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 let procedureValue = route.name;\n decodeResult.formatted.items.push({\n type: `procedure`,\n code: 'proc',\n label: `${procedureName} Procedure`,\n value: RouteUtils.routeToString(route),\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};","import { DateTimeUtils } from \"../DateTimeUtils\";\nimport { DecodeResult } from \"../DecoderPluginInterface\";\nimport { Waypoint } from \"../types/waypoint\";\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 let allKnownFields = true;\n const checksum = message.slice(-4);\n const data = message.slice(0, message.length - 4);\n\n const fields = data.split('/');\n allKnownFields = allKnownFields && parseMessageType(decodeResult, fields[0]);\n for (let i = 1; i < fields.length; ++i) {\n if (fields[i].startsWith('FN')) {\n decodeResult.raw.flight_number = fields[i].substring(2); // Strip off 'FN'\n } else if (fields[i].startsWith('SN')) {\n decodeResult.raw.serial_number = fields[i].substring(2); // Strip off 'SN'\n } else if (fields[i].startsWith('DC')) {\n processDC(decodeResult, fields[i].substring(2).split(',')); // Strip off 'DC'\n } else if (fields[i].startsWith('TS')) {\n const ts = fields[i].substring(2).split(','); // Strip off PS\n let time = DateTimeUtils.convertDateTimeToEpoch(ts[0], ts[1]);\n\n if (Number.isNaN(time)) { // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date = ts[1].substring(2, 4) + ts[1].substring(0, 2) + ts[1].substring(4, 6);\n time = DateTimeUtils.convertDateTimeToEpoch(ts[0], date);\n }\n decodeResult.raw.message_date = ts[1];\n decodeResult.raw.message_timestamp = time;\n } else if (fields[i].startsWith('PS')) {\n const pos = processPS(decodeResult, fields[i].substring(2).split(',')); // Strip off PS\n allKnownFields == allKnownFields && pos;\n } else if (fields[i].startsWith('DT')) {\n const data = fields[i].substring(2).split(','); // Strip off DT\n const dt = processDT(decodeResult, data);\n allKnownFields = allKnownFields && dt;\n } else if (fields[i].startsWith('ID')) {\n processIdentification(decodeResult, fields[i].substring(2).split(',')); // Strip off ID\n } else if (fields[i].startsWith('LR')) {\n const data = fields[i].substring(2).split(','); // Strip off LR\n const lr = processLR(decodeResult, data);\n allKnownFields = allKnownFields && lr;\n } else if (fields[i].startsWith('RI') || fields[i].startsWith('RF') || fields[i].startsWith('RP')) {\n const fp = FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(':'));\n allKnownFields = allKnownFields && fp;\n } else if (fields[i].startsWith('PR')) {\n // process PR data\n // data[8] is temperature\n allKnownFields = false\n decodeResult.remaining.text += '/' + fields[i];\n\n } else if (fields[i].startsWith('PS')) {\n // process position data\n allKnownFields = false\n decodeResult.remaining.text += fields[i];\n } else if (fields[i].startsWith('AF')) {\n const af = processAirField(decodeResult, fields[i].substring(2).split(',')); // Strip off AF\n allKnownFields = allKnownFields && af;\n } else if (fields[i].startsWith('TD')) {\n const td = processTimeOfDeparture(decodeResult, fields[i].substring(2).split(',')); // Strip off TD\n allKnownFields = allKnownFields && td;\n } else if (fields[i].startsWith('FX')) {\n decodeResult.raw.free_text = fields[i].substring(2); // Strip off 'FX'\n decodeResult.formatted.items.push({\n type: 'text',\n code: \"TEXT\",\n label: 'Free Text',\n value: decodeResult.raw.free_text,\n });\n } else {\n decodeResult.remaining.text += '/' + fields[i];\n allKnownFields = false\n }\n }\n if (decodeResult.formatted.items.length > 0) {\n ResultFormatter.checksum(decodeResult, checksum);\n }\n return allKnownFields;\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 return true;\n }\n decodeResult.remaining.text += 'AF/' + data.join(',');\n return false;\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 return true;\n }\n decodeResult.remaining.text += '/TD' + data.join(',');\n return false;\n}\n\nfunction processIdentification(decodeResult: DecodeResult, data: string[]) {\n decodeResult.raw.tail = data[0];\n decodeResult.formatted.items.push({\n type: 'tail',\n code: \"TAIL\",\n label: 'Tail',\n value: decodeResult.raw.tail,\n });\n if (data.length > 1) {\n decodeResult.raw.flight_number = data[1];\n }\n if (data.length > 2) { //TODO: figure out what this is\n decodeResult.raw.mission_number = data[2];\n }\n}\n\nfunction processDT(decodeResult: DecodeResult, data: string[]): boolean {\n let allKnownFields = true;\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[0]);\n } else if (decodeResult.raw.arrival_icao != data[0]) {\n decodeResult.remaining.text += '/' + data;\n } // else duplicate - don't do anything\n\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(decodeResult, data[3]);\n }\n if (data.length > 4) {\n ResultFormatter.remainingFuel(decodeResult, Number(data[4]));\n }\n if (data.length > 5) {//TODO: figure out what this is\n allKnownFields = false\n decodeResult.remaining.text += ',' + data.slice(5).join(',');\n }\n\n\n return allKnownFields;\n};\n\nfunction processLR(decodeResult: DecodeResult, data: string[]): boolean {\n let allKnownFields = true;\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 allKnownFields = false;\n } else {\n allKnownFields = false;\n }\n\n return allKnownFields;\n};\n\n\nfunction parseMessageType(decodeResult: DecodeResult, messageType: string): boolean {\n let decoded = true;\n const parts = messageType.split('#');\n if (parts.length == 1) {\n if (parts[0].startsWith('POS') && parts[0].length !== 3 && !(parts[0].startsWith('POS/'))) {\n decoded = processPosition(decodeResult, parts[0].substring(3).split(','));\n }\n return decoded;\n } else if (parts.length == 2) {\n if (parts[0].length > 0) {\n decodeResult.remaining.text += parts[0].substring(0, 3);\n decodeResult.raw.flight_number = parts[0].substring(3);\n decodeResult.remaining.text += '#' + parts[1].substring(0, 3);\n }\n if (parts[1].substring(3, 6) === 'POS' && parts[1].length !== 6 && parts[1].substring(3, 7) !== 'POS/') {\n decoded = processPosition(decodeResult, parts[1].substring(6).split(','));\n }\n\n decodeResult.raw.message_type = messageType;\n return decoded;\n }\n\n decodeResult.remaining.text += messageType;\n return false;\n}\nfunction processDC(decodeResult: DecodeResult, data: string[]): boolean {\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 = data[0].substring(2, 4) + data[0].substring(0, 2) + data[0].substring(4, 6);\n const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS\n\n decodeResult.raw.message_timestamp = time;\n } else {\n return false\n }\n return true;\n}\n\nfunction processPS(decodeResult: DecodeResult, data: string[]): boolean {\n let allKnownFields = true;\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);\n if (position) {\n decodeResult.raw.position = position\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(position),\n });\n } else {\n allKnownFields = false;\n }\n console.log('PS data.length: ', data.length);\n console.log('PS data: ', data);\n if (data.length === 9) { // 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) { // variant 2\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[4], data[2], data[6], data[5], undefined);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.groundspeed(decodeResult, Number(data[10]));\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.unknown(decodeResult, data[8]);\n ResultFormatter.unknown(decodeResult, data[9]);\n ResultFormatter.unknown(decodeResult, data.slice(11).join(','));\n }\n allKnownFields = false;\n return allKnownFields;\n}\nfunction processPosition(decodeResult: DecodeResult, data: string[]): boolean {\n let allKnownFields = true;\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);\n if (position) {\n decodeResult.raw.position = position\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(position),\n });\n } else {\n allKnownFields = false;\n }\n console.log('data.length: ', data.length);\n console.log('data: ', data);\n if (data.length >= 10) { // 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) { // variant 2,long\n ResultFormatter.groundspeed(decodeResult, Number(data[10]));\n ResultFormatter.unknown(decodeResult, data[11]);\n ResultFormatter.unknown(decodeResult, data[12]);\n ResultFormatter.unknown(decodeResult, data[13]);\n }\n allKnownFields = false;\n return allKnownFields;\n}\n\n\nfunction processRoute(decodeResult: any, last: string, time: string, next: string, eta: string, then?: string, date?: string) {\n const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);\n const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : 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 decodeResult.raw.route = { waypoints: waypoints };\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(decodeResult.raw.route),\n });\n}","import { DecoderPlugin } from '../DecoderPlugin';\nimport { Message } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\n\nexport class Label_H1_FPN extends DecoderPlugin {\n name = 'label-h1-fpn';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['FPN', '#M1BFPN'],\n };\n }\n\n decode(message: Message, options: any = {}): any {\n let decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Plan';\n decodeResult.message = message;\n decodeResult.remaining.text = '';\n\n const msg = message.text.replace(/\\n|\\r/g, \"\");\n const fulllyDecoded = H1Helper.decodeH1Message(decodeResult, msg);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = fulllyDecoded ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options?.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { Message } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\n\nexport class Label_H1_FTX extends DecoderPlugin {\n name = 'label-h1-ftx';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['FTX', '- #MDFTX'],\n };\n }\n\n decode(message: Message, options: any = {}): any {\n let decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Free Text';\n decodeResult.message = message;\n decodeResult.remaining.text = '';\n\n const fulllyDecoded = H1Helper.decodeH1Message(decodeResult, message.text);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = fulllyDecoded ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options?.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\n\nexport class Label_H1_INI extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-h1-ini';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['H1'],\n preambles: ['INI', '- #MDINI'],\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Plan Initial Report';\n decodeResult.message = message;\n decodeResult.remaining.text = '';\n\n const fulllyDecoded = H1Helper.decodeH1Message(decodeResult, message.text);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = fulllyDecoded ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options?.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nimport * as zlib from \"minizlib\";\n\nexport class Label_H1_OHMA extends DecoderPlugin {\n name = 'label-h1-ohma';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'OHMA Message';\n decodeResult.message = message;\n decodeResult.remaining.text = '';\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({windowBits: 15});\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 decodeResult.remaining.text += message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n\t return decodeResult;\n }\n}\n\nexport default {};\n\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { FlightPlanUtils } from '../utils/flight_plan_utils';\nimport { H1Helper } from '../utils/h1_helper';\nimport { RouteUtils } from '../utils/route_utils';\n\nexport class Label_H1_POS extends DecoderPlugin {\n name = 'label-h1-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\", '4J'],\n preambles: ['POS', '#M1BPOS', '/.POS'], //TODO - support data before #\n };\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n let decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Position Report';\n decodeResult.message = message;\n decodeResult.remaining.text = '';\n\n const fulllyDecoded = H1Helper.decodeH1Message(decodeResult, message.text);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = fulllyDecoded ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options?.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_H1_WRN extends DecoderPlugin {\n name = 'label-h1-wrn';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['WRN', '#CFBWRN'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n let decodeResult: any = 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 decodeResult.remaining.text = '';\n\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 if(field.startsWith('PN')) {\n processUnknown(decodeResult, '/' + field);\n } else {\n processUnknown(decodeResult, '/' + field);\n }\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 = datetime.substring(4,6) + datetime.substring(2,4)+ datetime.substring(0,2);\n\n processUnknown(decodeResult, data.substring(12));\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);\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 decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n\t return decodeResult;\n }\n}\n\nexport default {};\n\nfunction processUnknown(decodeResult: any, value: string) {\n decodeResult.remaining.text += value;\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() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['SQ'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = 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 = /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 && 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: (Number(result.groups.lat) / 100) * (result.groups.latd === 'S' ? -1 : 1),\n longitude: (Number(result.groups.lng) / 100) * (result.groups.lngd === 'W' ? -1 : 1)\n }\n }\n decodeResult.raw.vdlFrequency = 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 label: 'Network',\n value: formattedNetwork,\n },\n {\n type: 'version',\n label: 'Version',\n value: decodeResult.raw.version,\n }\n ];\n\n if (decodeResult.raw.groundStation) {\n if (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {\n decodeResult.formatted.items.push({\n type: 'ground_station',\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 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 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 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 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 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\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_QR extends DecoderPlugin {\n name = 'label-qr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QR'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n \n decodeResult.raw.origin = message.text.substring(0, 4);\n decodeResult.raw.destination = message.text.substring(4, 8);\n decodeResult.raw.wheels_on = message.text.substring(8, 12);\n decodeResult.remaining.text = message.text.substring(12);\n\n decodeResult.formatted.description = 'ON Report';\n\n decodeResult.formatted.items = [\n {\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.origin,\n },\n {\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.destination,\n },\n {\n type: 'wheels_on',\n code: 'WON',\n label: 'Wheels ON',\n value: decodeResult.raw.wheels_on,\n }\n ];\n\n decodeResult.decoded = true;\n if(decodeResult.remaining.text === \"\") \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_QP extends DecoderPlugin {\n name = 'label-qp';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QP'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n \n decodeResult.raw.origin = message.text.substring(0, 4);\n decodeResult.raw.destination = message.text.substring(4, 8);\n decodeResult.raw.gate_out = message.text.substring(8, 12);\n decodeResult.remaining.text = message.text.substring(12);\n\n decodeResult.formatted.description = 'OUT Report';\n\n decodeResult.formatted.items = [\n {\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.origin,\n },\n {\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.destination,\n },\n {\n type: 'gate_out',\n code: 'GOUT',\n label: 'Gate OUT',\n value: decodeResult.raw.gate_out,\n }\n ];\n\n decodeResult.decoded = true;\n if(decodeResult.remaining.text === \"\") \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_QS extends DecoderPlugin {\n name = 'label-qs';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QS'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n \n decodeResult.raw.origin = message.text.substring(0, 4);\n decodeResult.raw.destination = message.text.substring(4, 8);\n decodeResult.raw.gate_in = message.text.substring(8, 12);\n decodeResult.remaining.text = message.text.substring(12);\n\n decodeResult.formatted.description = 'IN Report';\n\n decodeResult.formatted.items = [\n {\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.origin,\n },\n {\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.destination,\n },\n {\n type: 'gate_in',\n code: 'GIN',\n label: 'Gate IN',\n value: decodeResult.raw.gate_in,\n }\n ];\n\n decodeResult.decoded = true;\n if(decodeResult.remaining.text === \"\") \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_QQ extends DecoderPlugin {\n name = 'label-qq';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['QQ'],\n };\n }\n\n decode(message: Message, options: Options = {}) : DecodeResult {\n const decodeResult: any = this.defaultResult();\n decodeResult.decoder.name = this.name;\n \n decodeResult.raw.origin = message.text.substring(0, 4);\n decodeResult.raw.destination = message.text.substring(4, 8);\n decodeResult.raw.wheels_off = message.text.substring(8, 12);\n decodeResult.remaining.text = message.text.substring(12);\n\n decodeResult.formatted.description = 'OFF Report';\n\n decodeResult.formatted.items = [\n {\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.origin,\n },\n {\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.destination,\n },\n {\n type: 'wheels_off',\n code: 'WOFF',\n label: 'Wheels OFF',\n value: decodeResult.raw.wheels_off,\n }\n ];\n\n decodeResult.decoded = true;\n if(decodeResult.remaining.text === \"\") \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import * as Base85 from 'base85';\nimport * as zlib from \"minizlib\";\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 MIAMCoreV1App {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nenum MIAMCoreV2App {\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: number,\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}\n\nexport class MIAMCoreUtils {\n static AppTypeToAppIdLenTable: any = {\n 1: {\n [MIAMCoreV1App.ACARS2Char]: 2,\n [MIAMCoreV1App.ACARS4Char]: 4,\n [MIAMCoreV1App.ACARS6Char]: 6,\n [MIAMCoreV1App.NonACARS6Char]: 6,\n },\n 2: {\n [MIAMCoreV2App.ACARS2Char]: 2,\n [MIAMCoreV2App.ACARS4Char]: 4,\n [MIAMCoreV2App.ACARS6Char]: 6,\n [MIAMCoreV2App.NonACARS6Char]: 6,\n },\n }\n\n static FidHandlerTable: any = {\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 const versionPduHandler = this.VersionPduHandlerTable[version][pduType];\n if (versionPduHandler === undefined) {\n return {\n decoded: false,\n error: 'Invalid version and PDU type combination: v=' + version + ', pdu=' + pduType,\n };\n }\n\n return versionPduHandler(hdr, body);\n },\n [MIAMFid.FileTransferRequest]: undefined,\n [MIAMFid.FileTransferAccept]: undefined,\n [MIAMFid.FileSegment]: undefined,\n [MIAMFid.FileTransferAbort]: undefined,\n [MIAMFid.XOFFIndication]: undefined,\n [MIAMFid.XONIndication]: undefined,\n }\n\n private static arincCrc16(buf: Buffer, seed?: number) {\n const crctable = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,\n 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,\n 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,\n 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,\n 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,\n 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,\n 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,\n 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,\n 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,\n 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,\n 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,\n 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,\n 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,\n 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,\n 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,\n 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,\n 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,\n 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,\n 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,\n 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,\n 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,\n 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,\n 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,\n 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0\n ];\n\n let crc = (seed || 0) & 0xffff;\n\n for (let i = 0; i < buf.length; i++) {\n crc = (((crc << 8) >>> 0) ^ crctable[(((crc >>> 8) ^ buf.readUInt8(i)) >>> 0) & 0xff]) >>> 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,\n 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,\n 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,\n 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD,\n 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9,\n 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75,\n 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011,\n 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD,\n 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039,\n 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5,\n 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81,\n 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,\n 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49,\n 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95,\n 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1,\n 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D,\n 0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE,\n 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072,\n 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16,\n 0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA,\n 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE,\n 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02,\n 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066,\n 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,\n 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E,\n 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692,\n 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6,\n 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A,\n 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E,\n 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2,\n 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686,\n 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A,\n 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637,\n 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB,\n 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F,\n 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,\n 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47,\n 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B,\n 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF,\n 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623,\n 0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7,\n 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B,\n 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F,\n 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3,\n 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7,\n 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B,\n 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F,\n 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,\n 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640,\n 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C,\n 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8,\n 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24,\n 0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30,\n 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,\n 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088,\n 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654,\n 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0,\n 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C,\n 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18,\n 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,\n 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0,\n 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C,\n 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 = (((crc << 8) >>> 0) ^ crctable[((crc >>> 24) ^ buf.readUInt8(i)) >>> 0]) >>> 0;\n }\n\n return crc;\n }\n\n public static parse(txt: string) {\n const fidType = txt[0];\n\n const handler = this.FidHandlerTable[fidType];\n if (handler === undefined) {\n return {\n decoded: false,\n error: 'Unsupported FID type: ' + fidType,\n };\n }\n\n return handler(txt.substring(1));\n }\n\n private static corePduDataHandler(version: number, minHdrSize: number, crcLen: number, hdr: Buffer, body?: Buffer) {\n if (hdr.length < minHdrSize) {\n return {\n decoded: false,\n error: 'v' + version + ' header size too short; expected >= ' + minHdrSize + ', got ' + 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 | undefined = undefined;\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 === 1) {\n pduSize = (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('v1 PDU truncated: expecting ' + pduSize + ', got ' + msgSize);\n }\n hdr = hdr.subarray(4);\n\n tail = hdr.subarray(0, 7).toString('ascii');\n hdr = hdr.subarray(7);\n } else if (version === 2) {\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 = ((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 = this.AppTypeToAppIdLenTable[version][pduAppType];\n if (appIdLen === undefined) {\n if (version === 2 && (pduAppType & 0x8) !== 0 && pduAppType !== 0xd) {\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 MIAMCoreV1App.ACARS2Char, MIAMCoreV1App.ACARS4Char, MIAMCoreV1App.ACARS6Char,\n MIAMCoreV2App.ACARS2Char, MIAMCoreV2App.ACARS4Char, MIAMCoreV2App.ACARS6Char].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 = (hdr.readUInt8(0) << 24) | (hdr.readUInt8(1) << 16) | (hdr.readUInt8(2) << 8) | 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 ([MIAMCoreV1Compression.Deflate, MIAMCoreV2Compression.Deflate].indexOf(pduCompression) >= 0) {\n try {\n const decompress = new zlib.InflateRaw({windowBits: 15});\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 ([MIAMCoreV1Compression.None, MIAMCoreV2Compression.None].indexOf(pduCompression) >= 0) {\n pduData = body;\n } else {\n pduErrors.push('Unsupported v' + version + ' compression type: ' + pduCompression)\n }\n\n if (pduData !== undefined) {\n const crcAlgoHandlerByVersion: any = {\n 1: (buf: Buffer, seed?: number) => { return ~this.arinc665Crc32(buf, seed); },\n 2: this.arincCrc16,\n };\n\n const crcAlgoHandler = crcAlgoHandlerByVersion[version];\n if (crcAlgoHandler === undefined) {\n return {\n decoded: false,\n errors: '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('Body failed CRC check: provided=' + pduCrc + ', generated=' + crcCheck);\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: any = {\n 1: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => { return this.corePduDataHandler(1, 20, MIAMCoreV1CRCLength, hdr, body); },\n [MIAMCorePdu.Ack]: undefined,\n [MIAMCorePdu.Aloha]: undefined,\n [MIAMCorePdu.AlohaReply]: undefined,\n },\n 2: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => { return this.corePduDataHandler(2, 7, MIAMCoreV2CRCLength, hdr, body); },\n [MIAMCorePdu.Ack]: undefined,\n [MIAMCorePdu.Aloha]: undefined,\n [MIAMCorePdu.AlohaReply]: undefined,\n }\n }\n}\n\nexport default {};\n","import { DecodeResult, DecoderPluginInterface, Message, Options } from './DecoderPluginInterface'; // eslint-disable-line import/no-cycle\n\nimport * as Plugins from './plugins/official';\nimport { MIAMCoreUtils } from './utils/miam';\n\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.Label_ColonComma(this));\n this.registerPlugin(new Plugins.Label_5Z(this));\n this.registerPlugin(new Plugins.Label_12_N_Space(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_N_Space(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_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_B6_Forwardslash(this));\n this.registerPlugin(new Plugins.Label_H1_FPN(this));\n this.registerPlugin(new Plugins.Label_H1_FLR(this));\n this.registerPlugin(new Plugins.Label_H1_FTX(this));\n this.registerPlugin(new Plugins.Label_H1_INI(this));\n this.registerPlugin(new Plugins.Label_H1_OHMA(this));\n this.registerPlugin(new Plugins.Label_H1_POS(this));\n this.registerPlugin(new Plugins.Label_H1_WRN(this));\n this.registerPlugin(new Plugins.Label_80(this));\n this.registerPlugin(new Plugins.Label_8E(this));\n this.registerPlugin(new Plugins.Label_1M_Slash(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 const pluginInstance = plugin;\n // plugin.onRegister(this.store);\n this.plugins.push(plugin);\n return true;\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n if (message.label === 'MA') {\n const decodeResult = MIAMCoreUtils.parse(message.text);\n\n // Only transplant message text if the MIAM core decoded message passed CRC and is complete\n if (decodeResult.decoded &&\n decodeResult.message.data !== undefined &&\n decodeResult.message.data.crcOk &&\n decodeResult.message.data.complete &&\n decodeResult.message.data.acars !== undefined) {\n message = {\n ...message,\n label: decodeResult.message.data.acars.label,\n ...(decodeResult.message.data.acars.sublabel ? { sublabel: decodeResult.message.data.acars.sublabel } : {}),\n ...(decodeResult.message.data.acars.mfi ? { mfi: decodeResult.message.data.acars.mfi } : {}),\n ...(decodeResult.message.data.acars.text ? { text: decodeResult.message.data.acars.text } : {}),\n }\n }\n }\n\n // console.log('All plugins');\n // console.log(this.plugins);\n const usablePlugins = this.plugins.filter((plugin) => {\n const qualifiers: any = plugin.qualifiers();\n\n if (qualifiers.labels.includes(message.label)) {\n if (qualifiers.preambles && qualifiers.preambles.length > 0) {\n const matching = qualifiers.preambles.filter((preamble: string) => { // eslint-disable-line arrow-body-style,max-len\n // console.log(message.text.substring(0, preamble.length));\n // console.log(preamble);\n return message.text.substring(0, preamble.length) === preamble;\n });\n // console.log(matching);\n return matching.length >= 1;\n } else { // eslint-disable-line no-else-return\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 if (usablePlugins.length > 0) {\n const plugin: DecoderPluginInterface = usablePlugins[0];\n result = plugin.decode(message);\n } else {\n result = {\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\n if (options.debug) {\n console.log('Result');\n console.log(result);\n }\n\n return result;\n }\n\n lookupAirportByIata(iata: string): any {\n const airportsArray: Array<any> = []; // = this.store.state.acarsData.airports;\n // console.log(airportsArray);\n const airport = airportsArray.filter((e: any) => e.iata === iata);\n\n return airport;\n }\n}\n\nexport default {\n};\n"],"mappings":"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AAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,IAC1D;AAEA,QAAI,OAAO,QAAQ,KAAK;AAExB,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,aAAS,OAAO,MAAO,IAAK,UAAY,QAAQ,IAAK,IAAI,UAAU,CAAC,OAAO,IAAK,GAAI,OAAO;AAAA,IAC7F;AAEA,WAAO,MAAM;AAAA,EACf;AAAA,EAEA,OAAe,cAAc,KAAa,MAAe;AACvD,UAAM,WAAW;AAAA,MACf;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;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","names":["data","processPosition","processUnknown","processUnknown","zlib"]}
|
|
1
|
+
{"version":3,"sources":["../lib/IcaoDecoder.ts","../lib/DecoderPlugin.ts","../lib/utils/coordinate_utils.ts","../lib/utils/result_formatter.ts","../lib/plugins/Label_5Z.ts","../lib/plugins/Label_10_LDR.ts","../lib/plugins/Label_10_POS.ts","../lib/DateTimeUtils.ts","../lib/utils/route_utils.ts","../lib/plugins/Label_10_Slash.ts","../lib/plugins/Label_12_N_Space.ts","../lib/plugins/Label_13Through18_Slash.ts","../lib/plugins/Label_15.ts","../lib/plugins/Label_15_FST.ts","../lib/plugins/Label_16_N_Space.ts","../lib/plugins/Label_1M_Slash.ts","../lib/plugins/Label_20_POS.ts","../lib/plugins/Label_21_POS.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_4N.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_FLR.ts","../lib/utils/flight_plan_utils.ts","../lib/utils/h1_helper.ts","../lib/plugins/Label_H1_FPN.ts","../lib/plugins/Label_H1_FTX.ts","../lib/plugins/Label_H1_INI.ts","../lib/plugins/Label_H1_OHMA.ts","../lib/plugins/Label_H1_POS.ts","../lib/plugins/Label_H1_WRN.ts","../lib/plugins/Label_HX.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/utils/miam.ts","../lib/MessageDecoder.ts"],"sourcesContent":["export class IcaoDecoder {\n name : string;\n icao : string;\n\n constructor(icao: string) {\n this.name = 'icao-decoder-typescript';\n this.icao = icao;\n }\n\n isMilitary() {\n let i = this.icao;\n return (\n false\n // us military\n //adf7c8-adf7cf = united states mil_5(uf)\n //adf7d0-adf7df = united states mil_4(uf)\n //adf7e0-adf7ff = united states mil_3(uf)\n //adf800-adffff = united states mil_2(uf)\n || i.match(/^adf[7-9]/)\n || i.match(/^adf[a-f]/)\n //ae0000-afffff = united states mil_1(uf)\n || i.match(/^a(e|f)/)\n\n //010070-01008f = egypt_mil\n || i.match(/^0100(7|8)/)\n\n //0a4000-0a4fff = algeria mil(ap)\n || i.match(/^0a4/)\n\n //33ff00-33ffff = italy mil(iy)\n || i.match(/^33ff/)\n\n //350000-37ffff = spain mil(sp)\n || (i >= '350000' && i <= '37ffff')\n\n //3a8000-3affff = france mil_1(fs)\n || i.match(/^3a(8|9|[a-f])/)\n //3b0000-3bffff = france mil_2(fs)\n || i.match(/^3b/)\n\n //3e8000-3ebfff = germany mil_1(df)\n // remove 8 and 9 from mil arnge\n || i.match(/^3e(a|b)/)\n //3f4000-3f7fff = germany mil_2(df)\n //3f8000-3fbfff = germany mil_3(df)\n || i.match(/^3f([4-9]|[a-b])/)\n\n //400000-40003f = united kingdom mil_1(ra)\n || i.match(/^4000[0-3]/)\n //43c000-43cfff = united kingdom mil(ra)\n || i.match(/^43c/)\n\n //444000-447fff = austria mil(aq)\n || (i.match(/^44[4-7]/) && i != '447ac7')\n\n //44f000-44ffff = belgium mil(bc)\n || i.match(/^44f/)\n\n //457000-457fff = bulgaria mil(bu)\n || i.match(/^457/)\n\n //45f400-45f4ff = denmark mil(dg)\n || i.match(/^45f4/)\n\n //468000-4683ff = greece mil(gc)\n || i.match(/^468[0-3]/)\n\n //473c00-473c0f = hungary mil(hm)\n || i.match(/^473c0/)\n\n //478100-4781ff = norway mil(nn)\n || i.match(/^4781/)\n //480000-480fff = netherlands mil(nm)\n || i.match(/^480/)\n //48d800-48d87f = poland mil(po)\n || i.match(/^48d8[0-7]/)\n //497c00-497cff = portugal mil(pu)\n || i.match(/^497c/)\n //498420-49842f = czech republic mil(ct)\n || i.match(/^49842/)\n\n //4b7000-4b7fff = switzerland mil(su)\n || i.match(/^4b7/)\n //4b8200-4b82ff = turkey mil(tq)\n || i.match(/^4b82/)\n\n //506f00-506fff = slovenia mil(sj)\n || i.match(/^506f/)\n\n //70c070-70c07f = oman mil(on)\n || i.match(/^70c07/)\n\n //710258-71025f = saudi arabia mil_1(sx)\n //710260-71027f = saudi arabia mil_2(sx)\n //710280-71028f = saudi arabia mil_3(sx)\n //710380-71039f = saudi arabia mil_4(sx)\n || i.match(/^7102[5-8]/)\n || i.match(/^7103[8-9]/)\n\n //738a00-738aff = israel mil(iz)\n || i.match(/^738a/)\n\n //7c822e-7c822f = australia mil_1(av)\n //7c8230-7c823f = australia mil_2(av)\n //7c8240-7c827f = australia mil_3(av)\n //7c8280-7c82ff = australia mil_4(av)\n //7c8300-7c83ff = australia mil_5(av)\n //7c8400-7c87ff = australia mil_6(av)\n //7c8800-7c8fff = australia mil_7(av)\n || i.match(/^7c8([2-4]|8)/)\n //7c9000-7c9fff = australia mil_8(av)\n //7ca000-7cbfff = australia mil_9(av)\n || (i >= '7c9000' && i <= '7cbfff')\n //7cc000-7cffff = australia mil_10(av) 7cc409 not mil, remove this range\n //7d0000-7dffff = australia mil_11(av)\n //7e0000-7fffff = australia mil_12(av)\n || i.match(/^7[d-f]/)\n\n //800200-8002ff = india mil(im)\n || i.match(/^8002/)\n\n //c20000-c3ffff = canada mil(cb)\n || i.match(/^c[2-3]/)\n\n //e40000-e41fff = brazil mil(bq)\n || i.match(/^e4[0-1]/)\n\n //e80600-e806ff = chile mil(cq)\n || i.match(/^e806/)\n );\n }\n\n}\n\nexport default {\n};\n","import { DecodeResult, DecoderPluginInterface, Message, Options } from './DecoderPluginInterface';\n\nexport abstract class DecoderPlugin implements DecoderPluginInterface {\n decoder!: any;\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 : any, options : Options = {}) {\n this.decoder = decoder;\n this.options = options;\n }\n\n id() : string { // eslint-disable-line class-methods-use-this\n console.log('DecoderPlugin subclass has not overriden id() to provide a unique ID for this plugin!');\n return 'abstract_decoder_plugin';\n }\n\n meetsStateRequirements() : boolean { // eslint-disable-line class-methods-use-this\n return true;\n }\n\n // onRegister(store: Store<any>) {\n // this.store = store;\n // }\n\n qualifiers() : any { // eslint-disable-line class-methods-use-this\n const labels : Array<string> = [];\n\n return {\n labels,\n };\n }\n\n decode(message: Message) : DecodeResult { // eslint-disable-line class-methods-use-this\n const decodeResult = this.defaultResult();\n decodeResult.remaining.text = message.text;\n return decodeResult;\n }\n}\n\nexport default {};\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(stringCoords: string) : {latitude: number, longitude: number} | undefined{ // eslint-disable-line class-methods-use-this\n var results : any = {};\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 ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n results.latitude = (Number(stringCoords.substring(1, 6)) / 1000) * (firstChar === 'S' ? -1 : 1);\n results.longitude = (Number(longitudeChars) / 1000) * (middleChar === 'W' ? -1 : 1);\n } else {\n return;\n }\n\n return results;\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(stringCoords: string) : {latitude: number, longitude: number} | undefined{ // eslint-disable-line class-methods-use-this\n var results : any = {};\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 ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n results.latitude = (latDeg + (latMin / 60)) * (firstChar === 'S' ? -1 : 1);\n results.longitude = (lonDeg + (lonMin / 60)) * (middleChar === 'W' ? -1 : 1);\n } else {\n return;\n }\n\n return results;\n }\n public static coordinateString(coords: {latitude: number, longitude: number}) : 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(degrees: number, minutes: number, seconds: number ) : number {\n return degrees + minutes / 60 + seconds / 3600;\n }\n}","import { DecodeResult } from \"../DecoderPluginInterface\";\nimport { CoordinateUtils } from \"./coordinate_utils\";\n\n/**\n * Class to format the results of common fields\n */\nexport class ResultFormatter {\n\n static position(decodeResult: DecodeResult, value: { latitude: number, longitude: number }) {\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 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 decodeResult.raw.flight_number = value;\n };\n\n static departureAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.departure_icao = value;\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\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(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n };\n\n static alternateAirport(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.alternate_icao = value;\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'ALT_DST',\n label: 'Alternate Destination',\n value: decodeResult.raw.alternate_icao,\n });\n };\n\n // FIXME - make seconds since midnight for time of day\n static eta(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.eta_time = value;\n decodeResult.formatted.items.push({\n type: 'eta',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: value.substring(0, 2) + ':' + value.substring(2, 4) + ':' + value.substring(4, 6),\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 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\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 temperature(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.outside_air_temperature = Number(value.substring(1)) * (value.charAt(0) === 'M' ? -1 : 1);\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}`,\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 const date = new Date(time * 1000);\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'OUT',\n label: 'Out of Gate Time',\n value: date.toISOString().slice(11, 19),\n });\n }\n\n static off(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.off_time = time;\n const date = new Date(time * 1000);\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'OFF',\n label: 'Takeoff Time',\n value: date.toISOString().slice(11, 19),\n });\n }\n\n static on(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.on_time = time;\n const date = new Date(time * 1000);\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'ON',\n label: 'Landing Time',\n value: date.toISOString().slice(11, 19),\n });\n }\n\n static in(decodeResult: DecodeResult, time: number) {\n decodeResult.raw.in_time = time;\n const date = new Date(time * 1000);\n decodeResult.formatted.items.push({\n type: 'time_of_day',\n code: 'IN',\n label: 'In Gate Time',\n value: date.toISOString().slice(11, 19),\n });\n }\n\n static unknown(decodeResult: DecodeResult, value: string) {\n decodeResult.remaining.text += ',' + value;\n };\n}\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { ResultFormatter } from '../utils/result_formatter';\n\nexport class Label_5Z extends DecoderPlugin {\n name = 'label-5z';\n\n descriptions: any = {\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 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() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['5Z'],\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 uaRegex = /^\\/(?<type>\\w+) (?<remainder>.+)/;\n let results = message.text.match(uaRegex);\n\n if (results && results.length >= 2) {\n // Successful match: United Airlines 5Z message\n const type : string = results.groups.type.split('/')[0];\n const { remainder } = results.groups;\n // console.log(results);\n // console.log(`DECODER: Matched 'United Airlines 5Z': type = ${type}, remainder = ${remainder}`);\n\n const typeDescription: string = this.descriptions[type] ? this.descriptions[type] : 'Unknown';\n decodeResult.raw.airline = 'United Airlines';\n decodeResult.formatted.items.push({\n type: '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 label: 'Message Type',\n value: `${typeDescription} (${type})`,\n });\n\n if (type === 'B3') {\n const rdcRegex = /^(?<from>\\w\\w\\w)(?<to>\\w\\w\\w) (?<unknown1>\\d\\d) R(?<runway>.+) G(?<unknown2>.+)$/; // eslint-disable-line max-len\n results = remainder.match(rdcRegex);\n\n if (results) {\n ResultFormatter.departureAirport(decodeResult, results.groups.from);\n ResultFormatter.arrivalAirport(decodeResult, results.groups.to);\n ResultFormatter.arrivalRunway(decodeResult, results.groups.runway);\n \n } else {\n if (options.debug) {\n console.log(`Decoder: Unkown 5Z RDC format: ${remainder}`);\n }\n }\n } else {\n decodeResult.remaining.text = remainder;\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 5Z message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\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 { // eslint-disable-line camelcase\n name = 'label-10-ldr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.remaining.text = 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]].filter((r) => r != \"\").join(\",\");\n if (altRwy != \"\") {\n ResultFormatter.alternateRunway(decodeResult, altRwy); // TODO: find out if anything comes after `/` sometimes\n }\n decodeResult.remaining.text = [...parts.slice(0,5), ...parts.slice(15)].join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\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 { // eslint-disable-line camelcase\n name = 'label-10-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.remaining.text = 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: (lat[0] === 'N' ? 1 : -1) * Number(lat.substring(1).trim())/100,\n longitude: (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 decodeResult.remaining.text = [parts[0], ...parts.slice(3,7), ...parts.slice(8)].join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};","export class DateTimeUtils {\n\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(+timeString.substr(0, 2), +timeString.substr(2, 2), +timeString.substr(4, 2));\n } else {\n utcDate.setUTCHours(+timeString.substr(0, 2), +timeString.substr(2, 2), 0);\n }\n return utcDate.toUTCString();\n }\n\n /**\n * \n * @param time HHMMSS\n * @returns seconds since midnight\n */\n public static convertHHMMSSToTod(time: string): number{\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\nexport default {};\n","import { Route } from \"../types/route\";\nimport { Waypoint } from \"../types/waypoint\";\nimport { CoordinateUtils } from \"./coordinate_utils\";\n\nexport class RouteUtils {\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 }\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 +=`@${RouteUtils.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 {name: regex[1], offset: {bearing: parseInt(regex[2]), distance: parseInt(regex[3])/10}};\n }\n\n const waypoint = leg.split(',');\n if(waypoint.length ==2) {\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(waypoint[1]);\n if(position) {\n return {name: waypoint[0], latitude: position.latitude, longitude: position.longitude};\n }\n }\n if(leg.length == 13 || leg.length == 14) { //looks like coordinates\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(leg);\n const name = waypoint.length == 2 ? waypoint[0] : '';\n if(position) {\n return {name: name, latitude: position.latitude, longitude: position.longitude};\n }\n }\n return {name: leg};\n }\n\n // move out if we want public\n private static timestampToString(time: number, format: 'tod' | 'epoch'): string {\n const date = new Date(time * 1000); 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 private static waypointsToString(waypoints: Waypoint[]): string {\n let str = waypoints.map((x) => RouteUtils.waypointToString(x)).join( ' > ').replaceAll('> >', '>>');\n if(str.startsWith(' > ')) {\n str = '>>' + str.slice(2);\n }\n return str;\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';\nimport { RouteUtils } from '../utils/route_utils';\n\nexport class Label_10_Slash extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-10-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.remaining.text = 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(decodeResult, parts[8]+'00');\n const waypoints: Waypoint[] = [{\n name: parts[11],\n },{\n name: parts[12],\n time: DateTimeUtils.convertHHMMSSToTod(parts[13]+'00'),\n timeFormat: 'tod',\n },{\n name: parts[14],\n time: DateTimeUtils.convertHHMMSSToTod(parts[15]+'00'),\n timeFormat: 'tod',\n },];\n decodeResult.raw.route = { waypoints: waypoints };\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(decodeResult.raw.route),\n });\n\n if(parts[16]) {\n ResultFormatter.departureAirport(decodeResult, parts[16]);\n }\n\n decodeResult.remaining.text = [parts[3], parts[4], ...parts.slice(9,11), ...parts.slice(17)].join('/');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};","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_12_N_Space extends DecoderPlugin {\n name = 'label-12-n-space';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"12\"],\n preambles: ['N '],\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 = /^(?<lat>[NS])\\s(?<lat_coord>.*),(?<long>[EW])\\s*(?<long_coord>.*),(?<alt>.*),(?<unkwn1>.*),\\s*(?<unkwn2>.*),.(?<airframe>.*),(?<unkwn3>.*)$/;\n\n let results;\n if (results = message.text.match(variant1Regex)) {\n if (options.debug) {\n console.log(`Label 12 N : results`);\n console.log(results);\n }\n\n decodeResult.raw.position = {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1)\n };\n const altitude = results.groups.alt == 'GRD' || results.groups.alt == '***' ? 0 : Number(results.groups.alt);\n\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n\n ResultFormatter.altitude(decodeResult, altitude);\n\n decodeResult.remaining.text = `,${results.groups.unkwn1} ,${results.groups.unkwn2}, ${results.groups.unkwn3}`;\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n } else {\n // Unknown\n if (options.debug) {\n console.log(`Decoder: Unknown 12 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { ResultFormatter } from '../utils/result_formatter';\nimport { RouteUtils } from '../utils/route_utils';\n\nexport class Label_13Through18_Slash extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-13-18-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 ((labelNumber !== 18 && parts.length !== 4) || (labelNumber === 18 && parts.length !== 7)) {\n if (options?.debug) {\n console.log(`Decoder: Unknown OOOI 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 decodeResult.remaining.text = '';\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_of_month = 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 decodeResult.remaining.text += parts.slice(4).join('/');\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 = { latitude: Number(location[0]), longitude: Number(location[1]) };\n } else {\n position = {\n latitude: CoordinateUtils.getDirection(location[0][0]) * CoordinateUtils.dmsToDecimalDegrees(Number(location[0].substring(1, 3)), Number(location[0].substring(3, 5)), Number(location[0].substring(5, 7))),\n longitude:CoordinateUtils.getDirection(location[1][0]) * CoordinateUtils.dmsToDecimalDegrees(Number(location[1].substring(1, 4)), Number(location[1].substring(4, 6)), Number(location[1].substring(6, 8))),\n }\n }\n if(!isNaN(position.latitude) && !isNaN(position.longitude)) {\n ResultFormatter.position(decodeResult, position);\n }\n } else {\n decodeResult.remaining.text += '\\r\\n' + lines[i];\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = decodeResult.remaining.text ? 'partial' : 'full';\n return decodeResult;\n }\n}\n\nexport default {};\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 { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// General Aviation Position Report\nexport class Label_15 extends DecoderPlugin {\n name = 'label-5z';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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\n const twoZeeRegex = /^\\(2(?<between>.+)\\(Z$/;\n const results = message.text.match(twoZeeRegex);\n if (results) {\n // Style: (2N38111W 82211266 76400-64(Z\n // console.log(`Label 15 Position Report: between = ${results.groups.between}`);\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(results.groups.between.substr(0,13));\n if(decodeResult.raw.position) {\n\tdecodeResult.formatted.items.push({\n type: 'position',\n\tcode: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\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_15_FST extends DecoderPlugin {\n name = 'label-15-fst';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.raw.departure_icao=header.substring(5,9);\n decodeResult.raw.arrival_icao=header.substring(9,13);\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 ((firstChar === 'N' || firstChar === 'S') && (middleChar === 'W' || middleChar === 'E')) {\n decodeResult.raw.position.latitude = (Number(stringCoords.substring(1, 7)) / 10000) * (firstChar === 'S' ? -1 : 1);\n decodeResult.raw.position.longitude = (Number(stringCoords.substring(8, 15)) / 10000) * (middleChar === 'W' ? -1 : 1);\n decodeResult.raw.altitude = Number(stringCoords.substring(15)) * 100;\n } else {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position)\n });\n\n ResultFormatter.altitude(decodeResult, decodeResult.raw.altitude);\n ResultFormatter.departureAirport(decodeResult, decodeResult.raw.departure_icao);\n ResultFormatter.arrivalAirport(decodeResult, decodeResult.raw.arrival_icao);\n decodeResult.remaining.text = parts.slice(1).join(' ');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n return decodeResult;\n }\n}\n\nexport default {};\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_16_N_Space extends DecoderPlugin {\n name = 'label-16-n-space';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"16\"],\n preambles: ['N '],\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 = /^(?<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 = /^(?<lat>[NS])\\s(?<lat_coord>.*)\\/(?<long>[EW])\\s*(?<long_coord>.*)$/;\n\n let results;\n if (results = message.text.match(variant1Regex)) {\n if (options.debug) {\n console.log(`Label 16 N : results`);\n console.log(results);\n }\n\n decodeResult.raw.position = {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1),\n };\n const altitude = results.groups.alt == 'GRD' || results.groups.alt == '***' ? 0 : Number(results.groups.alt);\n\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n\n ResultFormatter.altitude(decodeResult, altitude)\n\n decodeResult.remaining.text = `,${results.groups.unkwn1} ,${results.groups.unkwn2}`;\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n } else if (results = message.text.match(variant2Regex)) {\n if (options.debug) {\n console.log(`Label 16 N : results`);\n console.log(results);\n }\n\n decodeResult.raw.position = {\n latitude: Number(results.groups.lat_coord) * (results.groups.lat == 'N' ? 1 : -1),\n longitude: Number(results.groups.long_coord) * (results.groups.long == 'E' ? 1 : -1)\n };\n \n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n } else {\n // Unknown\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 }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_1M_Slash extends DecoderPlugin {\n name = 'label-1m-slash';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.raw.departure_icao = results[3];\n decodeResult.raw.arrival_icao = results[4];\n decodeResult.raw.alternate_icao = results[5];\n // results[6]: 2JK0 (???)\n // results[7] 1940 - UTC eta\n decodeResult.raw.arrival_runway = results[8].replace(decodeResult.raw.arrival_icao, \"\"); // results[8] EGLL27L\n // results[9]: 10(space) (???)\n\n decodeResult.formatted.items.push({\n type: 'eta',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.UTCDateTimeToString(results[2], results[7]),\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// Position Report\nexport class Label_20_POS extends DecoderPlugin {\n name = 'label-20-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(rawCoords);\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS',\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\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 rawCoords = fields[0];\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(rawCoords);\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS',\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n } else {\n // Unknown!\n if(options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// Position Report\nexport class Label_21_POS extends DecoderPlugin {\n name = 'label-21-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 processAlt( decodeResult, fields[3]);\n processTemp(decodeResult, fields[6]);\n processArrvApt(decodeResult, fields[8]);\n\n decodeResult.remaining.text = [\n fields[1],\n fields[2],\n fields[4],\n fields[5],\n fields[7],\n ].join(',');\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n // Unknown!\n if(options.debug) {\n console.log(`DEBUG: ${this.name}: Unknown variation. Field count: ${fields.length}, content: ${content}`);\n }\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\nfunction processPosition(decodeResult: DecodeResult, value: string): boolean {\n // N 39.841W 75.790\n if(value.length !== 16 && value[0] !== 'N' && value[0] !== 'S' && value[8] !== 'W' && value[8] !== 'E') {\n return false;\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 if (position) {\n decodeResult.raw.position = position\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(position),\n });\n }\n return !!position;\n}\n\nfunction processAlt(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.altitude = Number(value);\n decodeResult.formatted.items.push({\n type: 'altitude',\n code: 'ALT',\n label: 'Altitude',\n value: `${decodeResult.raw.altitude} feet`,\n });\n}\nfunction processTemp(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.outside_air_temperature = Number(value.substring(1)) * (value.charAt(0) === 'M' ? -1 : 1);\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}`,\n });\n}\nfunction processArrvApt(decodeResult: DecodeResult, value: string) {\n decodeResult.raw.arrival_icao = value;\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n};\n\nexport default {};\n\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_30_Slash_EA extends DecoderPlugin {\n name = 'label-30-slash-ea';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.formatted.items.push({\n type: 'eta',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.UTCToString(results[0].substr(2, 4)),\n });\n\n if (results[1].substr(0, 2) === \"DS\") {\n decodeResult.raw.arrival_icao = results[1].substr(2, 4);\n\tdecodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n // We don't know what the /SK section means. We have seen various numbers\n // after the /SK.\n decodeResult.remaining.text = \"/\".concat(results[2]);\n } else {\n decodeResult.remaining.text = \"/\".concat(results[1], \"/\", results[2])\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// In Air Report\nexport class Label_44_ETA extends DecoderPlugin {\n name = 'label-44-eta';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 // Style: IN02,N38338W121179,KMHR,KPDX,0806,2355,005.1\n // Match: IN02,coords,departure_icao,arrival_icao,current_date,current_time,fuel_in_tons\n const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results) {\n if (options.debug) {\n console.log(`Label 44 ETA Report: groups`);\n console.log(results.groups);\n }\n\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords);\n\n decodeResult.raw.departure_icao = results.groups.departure_icao;\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.raw.current_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.current_time.substr(0, 2) + \":\" +\n results.groups.current_time.substr(2, 2) + \":00Z\"\n );\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// In Air Report\nexport class Label_44_IN extends DecoderPlugin {\n name = 'label-44-in';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 // Style: IN02,N38338W121179,KMHR,KPDX,0806,2355,005.1\n // Match: IN02,coords,departure_icao,arrival_icao,current_date,current_time,fuel_in_tons\n const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results) {\n if (options.debug) {\n console.log(`Label 44 In Air Report: groups`);\n console.log(results.groups);\n }\n\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords);\n\n decodeResult.raw.departure_icao = results.groups.departure_icao;\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.raw.current_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.current_time.substr(0, 2) + \":\" +\n results.groups.current_time.substr(2, 2) + \":00Z\"\n );\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// Off Runway Report\nexport class Label_44_OFF extends DecoderPlugin {\n name = 'label-44-off';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 // Style: OFF02,N38334W121176,KMHR,KPDX,0807,0014,0123,004.9\n // Match: OFF02,coords,departure_icao,arrival_icao,current_date,current_time,eta_time,fuel_in_tons\n const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<eta_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results) {\n if (options.debug) {\n console.log(`Label 44 Off Runway Report: groups`);\n console.log(results.groups);\n }\n\n decodeResult.raw.departure_icao = results.groups.departure_icao;\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.raw.current_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.current_time.substr(0, 2) + \":\" +\n results.groups.current_time.substr(2, 2) + \":00Z\"\n );\n decodeResult.raw.eta_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.eta_time.substr(0, 2) + \":\" +\n results.groups.eta_time.substr(2, 2) + \":00Z\"\n );\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords);\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\n\n// On Runway Report\nexport class Label_44_ON extends DecoderPlugin {\n name = 'label-44-on';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 // Style: ON02,N38333W121178,KRNO,KMHR,0806,2350,005.2\n // Match: ON02,coords,departure_icao,arrival_icao,current_date,current_time,fuel_in_tons\n const regex = /^.*,(?<unsplit_coords>.*),(?<departure_icao>.*),(?<arrival_icao>.*),(?<current_date>.*),(?<current_time>.*),(?<fuel_in_tons>.*)$/;\n const results = message.text.match(regex);\n if (results) {\n if (options.debug) {\n console.log(`Label 44 On Runway Report: groups`);\n console.log(results.groups);\n }\n\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinates(results.groups.unsplit_coords);\n\n decodeResult.raw.departure_icao = results.groups.departure_icao;\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.raw.current_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.current_time.substr(0, 2) + \":\" +\n results.groups.current_time.substr(2, 2) + \":00Z\"\n );\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'position',\n code: 'POS' ,\n label: 'Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.formatted.items.push({\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.departure_icao,\n });\n\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\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// General Aviation Position Report\nexport class Label_44_POS extends DecoderPlugin {\n name = 'label-44-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 = /^.*,(?<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) {\n if (options.debug) {\n console.log(`Label 44 Position Report: groups`);\n console.log(results.groups);\n }\n\n decodeResult.raw.position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(results.groups.unsplit_coords);\n const flight_level = results.groups.flight_level_or_ground == 'GRD' || results.groups.flight_level_or_ground == '***' ? 0 : Number(results.groups.flight_level_or_ground);\n decodeResult.raw.current_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.current_time.substr(0, 2) + \":\" +\n results.groups.current_time.substr(2, 2) + \":00Z\"\n );\n decodeResult.raw.eta_time = Date.parse(\n new Date().getFullYear() + \"-\" +\n results.groups.current_date.substr(0, 2) + \"-\" +\n results.groups.current_date.substr(2, 2) + \"T\" +\n results.groups.eta_time.substr(0, 2) + \":\" +\n results.groups.eta_time.substr(2, 2) + \":00Z\"\n );\n\n if (results.groups.fuel_in_tons != '***' && results.groups.fuel_in_tons != '****') {\n decodeResult.raw.fuel_in_tons = Number(results.groups.fuel_in_tons);\n }\n\n if(decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS' ,\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n ResultFormatter.departureAirport(decodeResult, results.groups.departure_icao);\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\nexport default {};\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() { // eslint-disable-line class-methods-use-this\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 // Inmarsat C-band seems to prefix normal messages with a message number and flight number\n let text = message.text;\n if (text.match(/^M\\d{2}A\\w{6}/)) {\n ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, \"$1\"));\n text = text.substring(10);\n }\n\n decodeResult.decoded = true;\n const fields = text.split(\",\");\n if (text.length === 51) {\n // variant 1\n decodeResult.raw.day_of_month = text.substring(0, 2);\n ResultFormatter.departureAirport(decodeResult, text.substring(8, 11));\n ResultFormatter.arrivalAirport(decodeResult, text.substring(13, 16));\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(30, 45).replace(/^(.)0/, \"$1\")));\n ResultFormatter.altitude(decodeResult, text.substring(48, 51) * 100);\n decodeResult.remaining.text = [text.substring(2, 4), text.substring(19, 29)].join(\" \");\n } else if (fields.length === 33) {\n // variant 2\n decodeResult.raw.date = fields[3];\n if (fields[1] === \"B\") {\n ResultFormatter.position(decodeResult, {latitude: Number(fields[4]), longitude: Number(fields[5])});\n ResultFormatter.altitude(decodeResult, 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 decodeResult.remaining.text = [...fields.slice(1,3), fields[7], ...fields.slice(13, 32)].filter((f) => f != \"\").join(\",\");\n } else {\n decodeResult.decoded = false;\n decodeResult.remaining.text = text;\n }\n\n if (decodeResult.decoded) {\n if(decodeResult.remaining.text === \"\")\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\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// Airline Defined\n// 3N01 POSRPT\nexport class Label_80 extends DecoderPlugin {\n name = 'label-80';\n\n descriptions: any = {\n ALT: 'Altitude',\n DWND: 'Wind Direction',\n ETA: 'Estimated Time of Arrival',\n FOB: 'Fuel on Board',\n FL: 'Flight Level',\n HDG: 'Heading',\n MCH: 'Aircraft Speed',\n NWYP: 'Next Waypoint',\n POS: 'Aircraft Position',\n SAT: 'Static Air Temperature',\n SWND: 'Wind Speed',\n TAS: 'True Airspeed',\n WYP: 'Waypoint',\n }\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['80'],\n preambles: ['3N01 POSRPT'],\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 parts = message.text.split('\\n');\n\n let posRptRegex = /^3N01 POSRPT \\d\\d\\d\\d\\/\\d\\d (?<orig>\\w+)\\/(?<dest>\\w+) \\.(?<tail>[\\w-]+)(\\/(?<agate>.+) (?<sta>\\w+:\\w+))*/; // eslint-disable-line max-len\n let results = parts[0].match(posRptRegex);\n\n if(!results?.groups) {\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n return decodeResult;\n }\n if (results && results.length > 0) {\n ResultFormatter.departureAirport(decodeResult, results.groups.orig);\n ResultFormatter.arrivalAirport(decodeResult, results.groups.dest);\n ResultFormatter.tail(decodeResult, results.groups.tail);\n\n if (results.groups.agate) {\n decodeResult.raw.arrival_gate = results.groups.agate;\n decodeResult.formatted.items.push({\n type: 'arrival_gate',\n code: 'ARG',\n label: 'Arrival Gate',\n value: `${results.groups.agate}`,\n });\n\n decodeResult.raw.scheduled_time_of_arrival = results.groups.sta\n decodeResult.formatted.items.push({\n type: 'scheduled_time_of_arrival',\n code: 'STA',\n label: 'Scheduled Time of Arrival',\n value: `${results.groups.sta}`,\n });\n }\n\n posRptRegex = /\\/(?<field>\\w+)\\s(?<value>[\\w\\+\\-:\\.]+)\\s*/gi; // eslint-disable-line no-useless-escape\n // console.log('Regex:', posRptRegex);\n const remainingParts = parts.slice(1);\n // console.log(\"Remaining Parts:\", remainingParts);\n\n for (const part of remainingParts) { // eslint-disable-line no-restricted-syntax\n // console.log('Part:', part);\n const matches = part.matchAll(posRptRegex);\n // console.log('Matches:', matches);\n for (const match of matches) { // eslint-disable-line no-restricted-syntax\n // console.log('Match:', match);\n switch (match.groups?.field) {\n case 'ALT': {\n ResultFormatter.altitude(decodeResult, Number(match.groups.value));\n break;\n }\n case 'DWND': {\n decodeResult.raw.wind_direction = Number(match.groups.value);\n decodeResult.formatted.items.push({\n type: 'wind_direction',\n code: 'DWND',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.wind_direction,\n });\n break;\n }\n case 'FL': {\n const flight_level = Number(match.groups.value);\n ResultFormatter.altitude(decodeResult, flight_level * 100);\n break;\n }\n case 'FOB': {\n decodeResult.raw.fuel_on_board = match.groups.value;\n decodeResult.formatted.items.push({\n type: 'fuel_on_board',\n code: 'FOB',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.fuel_on_board,\n });\n break;\n }\n case 'HDG': {\n decodeResult.raw.heading = Number(match.groups.value);\n decodeResult.formatted.items.push({\n type: 'heading',\n code: 'HDG',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.heading,\n });\n break;\n }\n case 'MCH': {\n decodeResult.raw.mach = Number(match.groups.value) / 1000;\n decodeResult.formatted.items.push({\n type: 'mach',\n code: 'MCH',\n label: this.descriptions[match.groups.field],\n value: `${decodeResult.raw.mach} Mach`,\n });\n break;\n }\n case 'NWYP': {\n decodeResult.raw.next_waypoint = match.groups.value;\n decodeResult.formatted.items.push({\n type: 'next_waypoint',\n code: 'NWYP',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.next_waypoint,\n });\n break;\n }\n case 'POS': {\n\t // don't use decodeStringCoordinates because of different position format\n\t const posRegex = /^(?<latd>[NS])(?<lat>.+)(?<lngd>[EW])(?<lng>.+)/;\n const posResult = match.groups.value.match(posRegex);\n const lat = Number(posResult?.groups?.lat) * (posResult?.groups?.lngd === 'S' ? -1 : 1);\n const lon = Number(posResult?.groups?.lng) * (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(decodeResult, position);\n break;\n }\n case 'SWND': {\n decodeResult.raw.wind_speed = Number(match.groups.value);\n decodeResult.formatted.items.push({\n type: 'wind_speed',\n code: 'SWND',\n label: this.descriptions[match.groups.field],\n value: decodeResult.raw.wind_speed,\n });\n break;\n }\n default: {\n if (match.groups?.field != undefined) {\n const description = this.descriptions[match.groups.field] ? this.descriptions[match.groups.field] : 'Unknown';\n decodeResult.formatted.items.push({\n type: match.groups.field,\n code: match.groups.field,\n label: description || `Unknown (${match.groups.field})`,\n value: `${match.groups.value}`,\n });\n }\n }\n }\n }\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'partial';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\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_83 extends DecoderPlugin {\n name = 'label-83';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 // Inmarsat C-band seems to prefix normal messages with a message number and flight number\n let text = message.text;\n if (text.match(/^M\\d{2}A\\w{6}/)) {\n ResultFormatter.flightNumber(decodeResult, message.text.substring(4, 10).replace(/^([A-Z]+)0*/g, \"$1\"));\n text = text.substring(10);\n }\n\n decodeResult.decoded = true;\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_of_month = fields[2].substring(5);\n }\n decodeResult.remaining.text = 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(decodeResult, fields[6] + \"00\");\n } else if (text.substring(0, 5) === \"001PR\") {\n // variant 3\n decodeResult.raw.day_of_month = text.substring(5, 7);\n ResultFormatter.position(decodeResult, CoordinateUtils.decodeStringCoordinatesDecimalMinutes(text.substring(13, 28).replace(/\\./g, \"\")));\n ResultFormatter.altitude(decodeResult, Number(text.substring(28, 33)));\n decodeResult.remaining.text = 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_of_month = fields[2].substring(0,2);\n decodeResult.raw.time = fields[2].substring(2);\n ResultFormatter.position(decodeResult,\n {\n latitude: Number(fields[3].replace(/\\s/g, \"\")),\n longitude: Number(fields[4].replace(/\\s/g, \"\")),\n });\n ResultFormatter.altitude(decodeResult, fields[5]);\n ResultFormatter.groundspeed(decodeResult, fields[6]);\n ResultFormatter.heading(decodeResult, fields[7]);\n decodeResult.remaining.text = fields[8];\n } else {\n decodeResult.decoded = false;\n decodeResult.remaining.text = message.text;\n }\n }\n\n if (decodeResult.decoded) {\n if(decodeResult.remaining.text === \"\")\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\n// ETA\nexport class Label_8E extends DecoderPlugin {\n name = 'label-8e';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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) {\n if (options.debug) {\n console.log(`Label 8E ETA: groups`);\n console.log(results.groups);\n }\n\n decodeResult.formatted.items.push({\n type: 'eta',\n code: 'ETA',\n label: 'Estimated Time of Arrival',\n value: DateTimeUtils.UTCToString(results.groups.arrival_eta),\n });\n\n\n decodeResult.raw.arrival_icao = results.groups.arrival_icao;\n decodeResult.formatted.items.push({\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.arrival_icao,\n });\n\n }\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\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() { // eslint-disable-line class-methods-use-this\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\nexport default {};\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() { // eslint-disable-line class-methods-use-this\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 = 'Aircraft Transceiver Frequency Change';\n decodeResult.formatted.items.push({\n type: 'frequency',\n label: 'Frequency',\n value: `${decodeResult.raw.frequency} MHz`,\n });\n\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = 'full';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_H1_FLR extends DecoderPlugin {\n name = 'label-h1-flr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.remaining.text = '';\n\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 if(field.startsWith('PN')) {\n processUnknown(decodeResult, '/' + field);\n } else {\n processUnknown(decodeResult, '/' + field);\n }\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 = datetime.substring(4,6) + datetime.substring(2,4)+ datetime.substring(0,2);\n\n processUnknown(decodeResult, data.substring(12));\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);\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 decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n\t return decodeResult;\n }\n}\n\nexport default {};\n\nfunction processUnknown(decodeResult, value: string) {\n decodeResult.remaining.text += value;\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(decodeResult: DecodeResult, data: string[]): 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 addProcedure(decodeResult, value, 'arrival');\n break;\n case 'AA':\n addArrivalAirport(decodeResult, value);\n break;\n case 'AP':\n addProcedure(decodeResult, value, 'approach');\n break;\n case 'CR':\n addCompanyRoute(decodeResult, value);\n break;\n case 'D': // Departure Procedure\n 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 '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(decodeResult: DecodeResult, header: string): 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 {\n decodeResult.remaining.text += header;\n allKnownFields = false\n }\n return allKnownFields;\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};\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 decodeResult.raw.route = { waypoints: route.map((leg) => RouteUtils.getWaypoint(leg)) };\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(decodeResult.raw.route),\n });\n};\n\nfunction addProcedure(decodeResult: DecodeResult, value: string, type: string) {\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 let procedureValue = route.name;\n decodeResult.formatted.items.push({\n type: `procedure`,\n code: 'proc',\n label: `${procedureName} Procedure`,\n value: RouteUtils.routeToString(route),\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};","import { DateTimeUtils } from \"../DateTimeUtils\";\nimport { DecodeResult } from \"../DecoderPluginInterface\";\nimport { Waypoint } from \"../types/waypoint\";\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 let allKnownFields = true;\n const checksum = message.slice(-4);\n const data = message.slice(0, message.length - 4);\n\n const fields = data.split('/');\n allKnownFields = allKnownFields && parseMessageType(decodeResult, fields[0]);\n for (let i = 1; i < fields.length; ++i) {\n if (fields[i].startsWith('FN')) {\n decodeResult.raw.flight_number = fields[i].substring(2); // Strip off 'FN'\n } else if (fields[i].startsWith('SN')) {\n decodeResult.raw.serial_number = fields[i].substring(2); // Strip off 'SN'\n } else if (fields[i].startsWith('DC')) {\n processDC(decodeResult, fields[i].substring(2).split(',')); // Strip off 'DC'\n } else if (fields[i].startsWith('TS')) {\n const ts = fields[i].substring(2).split(','); // Strip off PS\n let time = DateTimeUtils.convertDateTimeToEpoch(ts[0], ts[1]);\n\n if (Number.isNaN(time)) { // convert DDMMYY to MMDDYY - TODO figure out a better way to determine\n const date = ts[1].substring(2, 4) + ts[1].substring(0, 2) + ts[1].substring(4, 6);\n time = DateTimeUtils.convertDateTimeToEpoch(ts[0], date);\n }\n decodeResult.raw.message_date = ts[1];\n decodeResult.raw.message_timestamp = time;\n } else if (fields[i].startsWith('PS')) {\n const pos = processPS(decodeResult, fields[i].substring(2).split(',')); // Strip off PS\n allKnownFields == allKnownFields && pos;\n } else if (fields[i].startsWith('DT')) {\n const data = fields[i].substring(2).split(','); // Strip off DT\n const dt = processDT(decodeResult, data);\n allKnownFields = allKnownFields && dt;\n } else if (fields[i].startsWith('ID')) {\n processIdentification(decodeResult, fields[i].substring(2).split(',')); // Strip off ID\n } else if (fields[i].startsWith('LR')) {\n const data = fields[i].substring(2).split(','); // Strip off LR\n const lr = processLR(decodeResult, data);\n allKnownFields = allKnownFields && lr;\n } else if (fields[i].startsWith('RI') || fields[i].startsWith('RF') || fields[i].startsWith('RP')) {\n const fp = FlightPlanUtils.processFlightPlan(decodeResult, fields[i].split(':'));\n allKnownFields = allKnownFields && fp;\n } else if (fields[i].startsWith('PR')) {\n // process PR data\n // data[8] is temperature\n allKnownFields = false\n decodeResult.remaining.text += '/' + fields[i];\n\n } else if (fields[i].startsWith('PS')) {\n // process position data\n allKnownFields = false\n decodeResult.remaining.text += fields[i];\n } else if (fields[i].startsWith('AF')) {\n const af = processAirField(decodeResult, fields[i].substring(2).split(',')); // Strip off AF\n allKnownFields = allKnownFields && af;\n } else if (fields[i].startsWith('TD')) {\n const td = processTimeOfDeparture(decodeResult, fields[i].substring(2).split(',')); // Strip off TD\n allKnownFields = allKnownFields && td;\n } else if (fields[i].startsWith('FX')) {\n decodeResult.raw.free_text = fields[i].substring(2); // Strip off 'FX'\n decodeResult.formatted.items.push({\n type: 'text',\n code: \"TEXT\",\n label: 'Free Text',\n value: decodeResult.raw.free_text,\n });\n } else {\n decodeResult.remaining.text += '/' + fields[i];\n allKnownFields = false\n }\n }\n if (decodeResult.formatted.items.length > 0) {\n ResultFormatter.checksum(decodeResult, checksum);\n }\n return allKnownFields;\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 return true;\n }\n decodeResult.remaining.text += 'AF/' + data.join(',');\n return false;\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 return true;\n }\n decodeResult.remaining.text += '/TD' + data.join(',');\n return false;\n}\n\nfunction processIdentification(decodeResult: DecodeResult, data: string[]) {\n ResultFormatter.tail(decodeResult, data[0])\n if (data.length > 1) {\n decodeResult.raw.flight_number = data[1];\n }\n if (data.length > 2) { //TODO: figure out what this is\n decodeResult.raw.mission_number = data[2];\n }\n}\n\nfunction processDT(decodeResult: DecodeResult, data: string[]): boolean {\n let allKnownFields = true;\n if (!decodeResult.raw.arrival_icao) {\n ResultFormatter.arrivalAirport(decodeResult, data[0]);\n } else if (decodeResult.raw.arrival_icao != data[0]) {\n decodeResult.remaining.text += '/' + data;\n } // else duplicate - don't do anything\n\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(decodeResult, data[3]);\n }\n if (data.length > 4) {\n ResultFormatter.remainingFuel(decodeResult, Number(data[4]));\n }\n if (data.length > 5) {//TODO: figure out what this is\n allKnownFields = false\n decodeResult.remaining.text += ',' + data.slice(5).join(',');\n }\n\n\n return allKnownFields;\n};\n\nfunction processLR(decodeResult: DecodeResult, data: string[]): boolean {\n let allKnownFields = true;\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 allKnownFields = false;\n } else {\n allKnownFields = false;\n }\n\n return allKnownFields;\n};\n\n\nfunction parseMessageType(decodeResult: DecodeResult, messageType: string): boolean {\n let decoded = true;\n const parts = messageType.split('#');\n if (parts.length == 1) {\n if (parts[0].startsWith('POS') && parts[0].length !== 3 && !(parts[0].startsWith('POS/'))) {\n decoded = processPosition(decodeResult, parts[0].substring(3).split(','));\n }\n return decoded;\n } else if (parts.length == 2) {\n if (parts[0].length > 0) {\n decodeResult.remaining.text += parts[0].substring(0, 3);\n decodeResult.raw.flight_number = parts[0].substring(3);\n decodeResult.remaining.text += '#' + parts[1].substring(0, 3);\n }\n if (parts[1].substring(3, 6) === 'POS' && parts[1].length !== 6 && parts[1].substring(3, 7) !== 'POS/') {\n decoded = processPosition(decodeResult, parts[1].substring(6).split(','));\n }\n\n decodeResult.raw.message_type = messageType;\n return decoded;\n }\n\n decodeResult.remaining.text += messageType;\n return false;\n}\nfunction processDC(decodeResult: DecodeResult, data: string[]): boolean {\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 = data[0].substring(2, 4) + data[0].substring(0, 2) + data[0].substring(4, 6);\n const time = DateTimeUtils.convertDateTimeToEpoch(data[1], data[0]); // HHMMSS\n\n decodeResult.raw.message_timestamp = time;\n } else {\n return false\n }\n return true;\n}\n\nfunction processPS(decodeResult: DecodeResult, data: string[]): boolean {\n let allKnownFields = true;\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);\n if (position) {\n decodeResult.raw.position = position\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(position),\n });\n } else {\n allKnownFields = false;\n }\n if (data.length === 9) { // 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) { // variant 2\n ResultFormatter.altitude(decodeResult, Number(data[3]) * 100);\n processRoute(decodeResult, data[4], data[2], data[6], data[5], undefined);\n ResultFormatter.temperature(decodeResult, data[7]);\n ResultFormatter.groundspeed(decodeResult, Number(data[10]));\n ResultFormatter.unknown(decodeResult, data[1]);\n ResultFormatter.unknown(decodeResult, data[8]);\n ResultFormatter.unknown(decodeResult, data[9]);\n ResultFormatter.unknown(decodeResult, data.slice(11).join(','));\n }\n allKnownFields = false;\n return allKnownFields;\n}\nfunction processPosition(decodeResult: DecodeResult, data: string[]): boolean {\n let allKnownFields = true;\n const position = CoordinateUtils.decodeStringCoordinatesDecimalMinutes(data[0]);\n if (position) {\n decodeResult.raw.position = position\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(position),\n });\n } else {\n allKnownFields = false;\n }\n if (data.length >= 10) { // 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) { // variant 2,long\n ResultFormatter.groundspeed(decodeResult, Number(data[10]));\n ResultFormatter.unknown(decodeResult, data[11]);\n ResultFormatter.unknown(decodeResult, data[12]);\n ResultFormatter.unknown(decodeResult, data[13]);\n }\n allKnownFields = false;\n return allKnownFields;\n}\n\n\nfunction processRoute(decodeResult: DecodeResult, last: string, time: string, next: string, eta: string, then?: string, date?: string) {\n const lastTime = date ? DateTimeUtils.convertDateTimeToEpoch(time, date) : DateTimeUtils.convertHHMMSSToTod(time);\n const nextTime = date ? DateTimeUtils.convertDateTimeToEpoch(eta, date) : 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 decodeResult.raw.route = { waypoints: waypoints };\n decodeResult.formatted.items.push({\n type: 'aircraft_route',\n code: 'ROUTE',\n label: 'Aircraft Route',\n value: RouteUtils.routeToString(decodeResult.raw.route),\n });\n}","import { DecoderPlugin } from '../DecoderPlugin';\nimport { Message } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\n\nexport class Label_H1_FPN extends DecoderPlugin {\n name = 'label-h1-fpn';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['FPN', '#M1BFPN'],\n };\n }\n\n decode(message: Message, options: any = {}): any {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Flight Plan';\n decodeResult.message = message;\n decodeResult.remaining.text = '';\n\n const msg = message.text.replace(/\\n|\\r/g, \"\");\n const fulllyDecoded = H1Helper.decodeH1Message(decodeResult, msg);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = fulllyDecoded ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { Message } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\n\nexport class Label_H1_FTX extends DecoderPlugin {\n name = 'label-h1-ftx';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\"],\n preambles: ['FTX', '- #MDFTX'],\n };\n }\n\n decode(message: Message, options: any = {}): any {\n let decodeResult = this.defaultResult();\n decodeResult.decoder.name = this.name;\n decodeResult.formatted.description = 'Free Text';\n decodeResult.message = message;\n decodeResult.remaining.text = '';\n\n const fulllyDecoded = H1Helper.decodeH1Message(decodeResult, message.text);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = fulllyDecoded ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { H1Helper } from '../utils/h1_helper';\n\nexport class Label_H1_INI extends DecoderPlugin { // eslint-disable-line camelcase\n name = 'label-h1-ini';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: ['H1'],\n preambles: ['INI', '- #MDINI'],\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 Plan Initial Report';\n decodeResult.message = message;\n decodeResult.remaining.text = '';\n\n const fulllyDecoded = H1Helper.decodeH1Message(decodeResult, message.text);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = fulllyDecoded ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nimport * as zlib from \"minizlib\";\n\nexport class Label_H1_OHMA extends DecoderPlugin {\n name = 'label-h1-ohma';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.remaining.text = '';\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({windowBits: 15});\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 decodeResult.remaining.text += message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n\t return decodeResult;\n }\n}\n\nexport default {};\n\n","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\nimport { Waypoint } from '../types/waypoint';\nimport { CoordinateUtils } from '../utils/coordinate_utils';\nimport { FlightPlanUtils } from '../utils/flight_plan_utils';\nimport { H1Helper } from '../utils/h1_helper';\nimport { RouteUtils } from '../utils/route_utils';\n\nexport class Label_H1_POS extends DecoderPlugin {\n name = 'label-h1-pos';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\n return {\n labels: [\"H1\", '4J'],\n preambles: ['POS', '#M1BPOS', '/.POS'], //TODO - support data before #\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 decodeResult.remaining.text = '';\n\n const fulllyDecoded = H1Helper.decodeH1Message(decodeResult, message.text);\n decodeResult.decoded = true;\n decodeResult.decoder.decodeLevel = fulllyDecoded ? 'full' : 'partial';\n if (decodeResult.formatted.items.length === 0) {\n if (options.debug) {\n console.log(`Decoder: Unknown H1 message: ${message.text}`);\n }\n decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n return decodeResult;\n }\n}\n\nexport default {};","import { DateTimeUtils } from '../DateTimeUtils';\nimport { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_H1_WRN extends DecoderPlugin {\n name = 'label-h1-wrn';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.remaining.text = '';\n\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 if(field.startsWith('PN')) {\n processUnknown(decodeResult, '/' + field);\n } else {\n processUnknown(decodeResult, '/' + field);\n }\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 = datetime.substring(4,6) + datetime.substring(2,4)+ datetime.substring(0,2);\n\n processUnknown(decodeResult, data.substring(12));\n decodeResult.raw.message_timestamp = DateTimeUtils.convertDateTimeToEpoch(datetime.substring(6), date);\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 decodeResult.remaining.text = message.text;\n decodeResult.decoded = false;\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n\t return decodeResult;\n }\n}\n\nexport default {};\n\nfunction processUnknown(decodeResult, value: string) {\n decodeResult.remaining.text += value;\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_HX extends DecoderPlugin {\n name = 'label-hx';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 decodeResult.raw.position = {\n latitude: (latdeg + latmin/60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin/60) * (londir === 'E' ? 1 : -1),\n };\n decodeResult.remaining.text = parts.slice(5).join(' ');\n } else if (parts[2] === \"43\") {\n ResultFormatter.departureAirport(decodeResult, parts[3]);\n decodeResult.remaining.text = parts.slice(4).join(' ');\n } else {\n decodeResult.decoded = false;\n }\n\n if (decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n if (decodeResult.decoded) {\n if(decodeResult.remaining.text === \"\")\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n } else {\n decodeResult.decoder.decodeLevel = 'none';\n }\n\n return decodeResult;\n }\n}\n\nexport default {};\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() { // eslint-disable-line class-methods-use-this\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 = /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 && 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: (Number(result.groups.lat) / 100) * (result.groups.latd === 'S' ? -1 : 1),\n longitude: (Number(result.groups.lng) / 100) * (result.groups.lngd === 'W' ? -1 : 1)\n }\n }\n decodeResult.raw.vdlFrequency = 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 (decodeResult.raw.groundStation.icaoCode && decodeResult.raw.groundStation.number) {\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\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_QR extends DecoderPlugin {\n name = 'label-qr';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 \n decodeResult.raw.origin = message.text.substring(0, 4);\n decodeResult.raw.destination = message.text.substring(4, 8);\n decodeResult.raw.wheels_on = message.text.substring(8, 12);\n decodeResult.remaining.text = message.text.substring(12);\n\n decodeResult.formatted.description = 'ON Report';\n\n decodeResult.formatted.items = [\n {\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.origin,\n },\n {\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.destination,\n },\n {\n type: 'wheels_on',\n code: 'WON',\n label: 'Wheels ON',\n value: decodeResult.raw.wheels_on,\n }\n ];\n\n decodeResult.decoded = true;\n if(decodeResult.remaining.text === \"\") \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_QP extends DecoderPlugin {\n name = 'label-qp';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 \n decodeResult.raw.origin = message.text.substring(0, 4);\n decodeResult.raw.destination = message.text.substring(4, 8);\n decodeResult.raw.gate_out = message.text.substring(8, 12);\n decodeResult.remaining.text = message.text.substring(12);\n\n decodeResult.formatted.description = 'OUT Report';\n\n decodeResult.formatted.items = [\n {\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.origin,\n },\n {\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.destination,\n },\n {\n type: 'gate_out',\n code: 'GOUT',\n label: 'Gate OUT',\n value: decodeResult.raw.gate_out,\n }\n ];\n\n decodeResult.decoded = true;\n if(decodeResult.remaining.text === \"\") \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import { DecoderPlugin } from '../DecoderPlugin';\nimport { DecodeResult, Message, Options } from '../DecoderPluginInterface';\n\nexport class Label_QS extends DecoderPlugin {\n name = 'label-qs';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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 \n decodeResult.raw.origin = message.text.substring(0, 4);\n decodeResult.raw.destination = message.text.substring(4, 8);\n decodeResult.raw.gate_in = message.text.substring(8, 12);\n decodeResult.remaining.text = message.text.substring(12);\n\n decodeResult.formatted.description = 'IN Report';\n\n decodeResult.formatted.items = [\n {\n type: 'origin',\n code: 'ORG',\n label: 'Origin',\n value: decodeResult.raw.origin,\n },\n {\n type: 'destination',\n code: 'DST',\n label: 'Destination',\n value: decodeResult.raw.destination,\n },\n {\n type: 'gate_in',\n code: 'GIN',\n label: 'Gate IN',\n value: decodeResult.raw.gate_in,\n }\n ];\n\n decodeResult.decoded = true;\n if(decodeResult.remaining.text === \"\") \n\tdecodeResult.decoder.decodeLevel = 'full';\n else\n\tdecodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\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_QQ extends DecoderPlugin {\n name = 'label-qq';\n\n qualifiers() { // eslint-disable-line class-methods-use-this\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(decodeResult, message.text.substring(0, 4));\n ResultFormatter.arrivalAirport(decodeResult, message.text.substring(4, 8));\n\n decodeResult.raw.wheels_off = message.text.substring(8, 12);\n\n if (message.text.substring(12, 19) === \"\\r\\n001FE\") {\n decodeResult.raw.day_of_month = message.text.substring(19, 21);\n decodeResult.raw.wheels_off = message.text.substring(21, 27);\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 decodeResult.raw.position = {\n latitude: (latdeg + latmin/60) * (latdir === 'N' ? 1 : -1),\n longitude: (londeg + lonmin/60) * (londir === 'E' ? 1 : -1),\n };\n decodeResult.remaining.text = message.text.substring(42, 45);\n if (decodeResult.remaining.text !== \"---\") {\n ResultFormatter.groundspeed(decodeResult, message.text.substring(45, 48));\n } else {\n ResultFormatter.unknown(decodeResult, message.text.substring(45, 48));\n }\n ResultFormatter.unknown(decodeResult, message.text.substring(48));\n } else {\n decodeResult.remaining.text = message.text.substring(12);\n }\n\n decodeResult.formatted.items.push({\n type: 'wheels_off',\n code: 'WOFF',\n label: 'Wheels OFF',\n value: decodeResult.raw.wheels_off,\n });\n\n if (decodeResult.raw.position) {\n decodeResult.formatted.items.push({\n type: 'aircraft_position',\n code: 'POS',\n label: 'Aircraft Position',\n value: CoordinateUtils.coordinateString(decodeResult.raw.position),\n });\n }\n\n decodeResult.decoded = true;\n if(decodeResult.remaining.text === \"\")\n decodeResult.decoder.decodeLevel = 'full';\n else\n decodeResult.decoder.decodeLevel = 'partial';\n\n return decodeResult;\n }\n}\n\nexport default {};\n","import * as Base85 from 'base85';\nimport * as zlib from \"minizlib\";\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 MIAMCoreV1App {\n ACARS2Char = 0x0,\n ACARS4Char = 0x1,\n ACARS6Char = 0x2,\n NonACARS6Char = 0x3,\n}\n\nenum MIAMCoreV2App {\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: number,\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}\n\nexport class MIAMCoreUtils {\n static AppTypeToAppIdLenTable: any = {\n 1: {\n [MIAMCoreV1App.ACARS2Char]: 2,\n [MIAMCoreV1App.ACARS4Char]: 4,\n [MIAMCoreV1App.ACARS6Char]: 6,\n [MIAMCoreV1App.NonACARS6Char]: 6,\n },\n 2: {\n [MIAMCoreV2App.ACARS2Char]: 2,\n [MIAMCoreV2App.ACARS4Char]: 4,\n [MIAMCoreV2App.ACARS6Char]: 6,\n [MIAMCoreV2App.NonACARS6Char]: 6,\n },\n }\n\n static FidHandlerTable: any = {\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 const versionPduHandler = this.VersionPduHandlerTable[version][pduType];\n if (versionPduHandler === undefined) {\n return {\n decoded: false,\n error: 'Invalid version and PDU type combination: v=' + version + ', pdu=' + pduType,\n };\n }\n\n return versionPduHandler(hdr, body);\n },\n [MIAMFid.FileTransferRequest]: undefined,\n [MIAMFid.FileTransferAccept]: undefined,\n [MIAMFid.FileSegment]: undefined,\n [MIAMFid.FileTransferAbort]: undefined,\n [MIAMFid.XOFFIndication]: undefined,\n [MIAMFid.XONIndication]: undefined,\n }\n\n private static arincCrc16(buf: Buffer, seed?: number) {\n const crctable = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,\n 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,\n 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,\n 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,\n 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,\n 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,\n 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,\n 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,\n 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,\n 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,\n 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,\n 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,\n 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,\n 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,\n 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,\n 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,\n 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,\n 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,\n 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,\n 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,\n 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,\n 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,\n 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,\n 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0\n ];\n\n let crc = (seed || 0) & 0xffff;\n\n for (let i = 0; i < buf.length; i++) {\n crc = (((crc << 8) >>> 0) ^ crctable[(((crc >>> 8) ^ buf.readUInt8(i)) >>> 0) & 0xff]) >>> 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,\n 0x130476DC, 0x17C56B6B, 0x1A864DB2, 0x1E475005,\n 0x2608EDB8, 0x22C9F00F, 0x2F8AD6D6, 0x2B4BCB61,\n 0x350C9B64, 0x31CD86D3, 0x3C8EA00A, 0x384FBDBD,\n 0x4C11DB70, 0x48D0C6C7, 0x4593E01E, 0x4152FDA9,\n 0x5F15ADAC, 0x5BD4B01B, 0x569796C2, 0x52568B75,\n 0x6A1936C8, 0x6ED82B7F, 0x639B0DA6, 0x675A1011,\n 0x791D4014, 0x7DDC5DA3, 0x709F7B7A, 0x745E66CD,\n 0x9823B6E0, 0x9CE2AB57, 0x91A18D8E, 0x95609039,\n 0x8B27C03C, 0x8FE6DD8B, 0x82A5FB52, 0x8664E6E5,\n 0xBE2B5B58, 0xBAEA46EF, 0xB7A96036, 0xB3687D81,\n 0xAD2F2D84, 0xA9EE3033, 0xA4AD16EA, 0xA06C0B5D,\n 0xD4326D90, 0xD0F37027, 0xDDB056FE, 0xD9714B49,\n 0xC7361B4C, 0xC3F706FB, 0xCEB42022, 0xCA753D95,\n 0xF23A8028, 0xF6FB9D9F, 0xFBB8BB46, 0xFF79A6F1,\n 0xE13EF6F4, 0xE5FFEB43, 0xE8BCCD9A, 0xEC7DD02D,\n 0x34867077, 0x30476DC0, 0x3D044B19, 0x39C556AE,\n 0x278206AB, 0x23431B1C, 0x2E003DC5, 0x2AC12072,\n 0x128E9DCF, 0x164F8078, 0x1B0CA6A1, 0x1FCDBB16,\n 0x018AEB13, 0x054BF6A4, 0x0808D07D, 0x0CC9CDCA,\n 0x7897AB07, 0x7C56B6B0, 0x71159069, 0x75D48DDE,\n 0x6B93DDDB, 0x6F52C06C, 0x6211E6B5, 0x66D0FB02,\n 0x5E9F46BF, 0x5A5E5B08, 0x571D7DD1, 0x53DC6066,\n 0x4D9B3063, 0x495A2DD4, 0x44190B0D, 0x40D816BA,\n 0xACA5C697, 0xA864DB20, 0xA527FDF9, 0xA1E6E04E,\n 0xBFA1B04B, 0xBB60ADFC, 0xB6238B25, 0xB2E29692,\n 0x8AAD2B2F, 0x8E6C3698, 0x832F1041, 0x87EE0DF6,\n 0x99A95DF3, 0x9D684044, 0x902B669D, 0x94EA7B2A,\n 0xE0B41DE7, 0xE4750050, 0xE9362689, 0xEDF73B3E,\n 0xF3B06B3B, 0xF771768C, 0xFA325055, 0xFEF34DE2,\n 0xC6BCF05F, 0xC27DEDE8, 0xCF3ECB31, 0xCBFFD686,\n 0xD5B88683, 0xD1799B34, 0xDC3ABDED, 0xD8FBA05A,\n 0x690CE0EE, 0x6DCDFD59, 0x608EDB80, 0x644FC637,\n 0x7A089632, 0x7EC98B85, 0x738AAD5C, 0x774BB0EB,\n 0x4F040D56, 0x4BC510E1, 0x46863638, 0x42472B8F,\n 0x5C007B8A, 0x58C1663D, 0x558240E4, 0x51435D53,\n 0x251D3B9E, 0x21DC2629, 0x2C9F00F0, 0x285E1D47,\n 0x36194D42, 0x32D850F5, 0x3F9B762C, 0x3B5A6B9B,\n 0x0315D626, 0x07D4CB91, 0x0A97ED48, 0x0E56F0FF,\n 0x1011A0FA, 0x14D0BD4D, 0x19939B94, 0x1D528623,\n 0xF12F560E, 0xF5EE4BB9, 0xF8AD6D60, 0xFC6C70D7,\n 0xE22B20D2, 0xE6EA3D65, 0xEBA91BBC, 0xEF68060B,\n 0xD727BBB6, 0xD3E6A601, 0xDEA580D8, 0xDA649D6F,\n 0xC423CD6A, 0xC0E2D0DD, 0xCDA1F604, 0xC960EBB3,\n 0xBD3E8D7E, 0xB9FF90C9, 0xB4BCB610, 0xB07DABA7,\n 0xAE3AFBA2, 0xAAFBE615, 0xA7B8C0CC, 0xA379DD7B,\n 0x9B3660C6, 0x9FF77D71, 0x92B45BA8, 0x9675461F,\n 0x8832161A, 0x8CF30BAD, 0x81B02D74, 0x857130C3,\n 0x5D8A9099, 0x594B8D2E, 0x5408ABF7, 0x50C9B640,\n 0x4E8EE645, 0x4A4FFBF2, 0x470CDD2B, 0x43CDC09C,\n 0x7B827D21, 0x7F436096, 0x7200464F, 0x76C15BF8,\n 0x68860BFD, 0x6C47164A, 0x61043093, 0x65C52D24,\n 0x119B4BE9, 0x155A565E, 0x18197087, 0x1CD86D30,\n 0x029F3D35, 0x065E2082, 0x0B1D065B, 0x0FDC1BEC,\n 0x3793A651, 0x3352BBE6, 0x3E119D3F, 0x3AD08088,\n 0x2497D08D, 0x2056CD3A, 0x2D15EBE3, 0x29D4F654,\n 0xC5A92679, 0xC1683BCE, 0xCC2B1D17, 0xC8EA00A0,\n 0xD6AD50A5, 0xD26C4D12, 0xDF2F6BCB, 0xDBEE767C,\n 0xE3A1CBC1, 0xE760D676, 0xEA23F0AF, 0xEEE2ED18,\n 0xF0A5BD1D, 0xF464A0AA, 0xF9278673, 0xFDE69BC4,\n 0x89B8FD09, 0x8D79E0BE, 0x803AC667, 0x84FBDBD0,\n 0x9ABC8BD5, 0x9E7D9662, 0x933EB0BB, 0x97FFAD0C,\n 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 = (((crc << 8) >>> 0) ^ crctable[((crc >>> 24) ^ buf.readUInt8(i)) >>> 0]) >>> 0;\n }\n\n return crc;\n }\n\n public static parse(txt: string) {\n const fidType = txt[0];\n\n const handler = this.FidHandlerTable[fidType];\n if (handler === undefined) {\n return {\n decoded: false,\n error: 'Unsupported FID type: ' + fidType,\n };\n }\n\n return handler(txt.substring(1));\n }\n\n private static corePduDataHandler(version: number, minHdrSize: number, crcLen: number, hdr: Buffer, body?: Buffer) {\n if (hdr.length < minHdrSize) {\n return {\n decoded: false,\n error: 'v' + version + ' header size too short; expected >= ' + minHdrSize + ', got ' + 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 | undefined = undefined;\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 === 1) {\n pduSize = (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('v1 PDU truncated: expecting ' + pduSize + ', got ' + msgSize);\n }\n hdr = hdr.subarray(4);\n\n tail = hdr.subarray(0, 7).toString('ascii');\n hdr = hdr.subarray(7);\n } else if (version === 2) {\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 = ((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 = this.AppTypeToAppIdLenTable[version][pduAppType];\n if (appIdLen === undefined) {\n if (version === 2 && (pduAppType & 0x8) !== 0 && pduAppType !== 0xd) {\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 MIAMCoreV1App.ACARS2Char, MIAMCoreV1App.ACARS4Char, MIAMCoreV1App.ACARS6Char,\n MIAMCoreV2App.ACARS2Char, MIAMCoreV2App.ACARS4Char, MIAMCoreV2App.ACARS6Char].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 = (hdr.readUInt8(0) << 24) | (hdr.readUInt8(1) << 16) | (hdr.readUInt8(2) << 8) | 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 ([MIAMCoreV1Compression.Deflate, MIAMCoreV2Compression.Deflate].indexOf(pduCompression) >= 0) {\n try {\n const decompress = new zlib.InflateRaw({windowBits: 15});\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 ([MIAMCoreV1Compression.None, MIAMCoreV2Compression.None].indexOf(pduCompression) >= 0) {\n pduData = body;\n } else {\n pduErrors.push('Unsupported v' + version + ' compression type: ' + pduCompression)\n }\n\n if (pduData !== undefined) {\n const crcAlgoHandlerByVersion: any = {\n 1: (buf: Buffer, seed?: number) => { return ~this.arinc665Crc32(buf, seed); },\n 2: this.arincCrc16,\n };\n\n const crcAlgoHandler = crcAlgoHandlerByVersion[version];\n if (crcAlgoHandler === undefined) {\n return {\n decoded: false,\n errors: '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('Body failed CRC check: provided=' + pduCrc + ', generated=' + crcCheck);\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: any = {\n 1: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => { return this.corePduDataHandler(1, 20, MIAMCoreV1CRCLength, hdr, body); },\n [MIAMCorePdu.Ack]: undefined,\n [MIAMCorePdu.Aloha]: undefined,\n [MIAMCorePdu.AlohaReply]: undefined,\n },\n 2: {\n [MIAMCorePdu.Data]: (hdr: Buffer, body?: Buffer) => { return this.corePduDataHandler(2, 7, MIAMCoreV2CRCLength, hdr, body); },\n [MIAMCorePdu.Ack]: undefined,\n [MIAMCorePdu.Aloha]: undefined,\n [MIAMCorePdu.AlohaReply]: undefined,\n }\n }\n}\n\nexport default {};\n","import { DecodeResult, DecoderPluginInterface, Message, Options } from './DecoderPluginInterface'; // eslint-disable-line import/no-cycle\n\nimport * as Plugins from './plugins/official';\nimport { MIAMCoreUtils } from './utils/miam';\n\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.Label_ColonComma(this));\n this.registerPlugin(new Plugins.Label_5Z(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_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_N_Space(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_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_4N(this));\n this.registerPlugin(new Plugins.Label_B6_Forwardslash(this));\n this.registerPlugin(new Plugins.Label_H1_FPN(this));\n this.registerPlugin(new Plugins.Label_H1_FLR(this));\n this.registerPlugin(new Plugins.Label_H1_FTX(this));\n this.registerPlugin(new Plugins.Label_H1_INI(this));\n this.registerPlugin(new Plugins.Label_H1_OHMA(this));\n this.registerPlugin(new Plugins.Label_H1_POS(this));\n this.registerPlugin(new Plugins.Label_H1_WRN(this));\n this.registerPlugin(new Plugins.Label_HX(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_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 const pluginInstance = plugin;\n // plugin.onRegister(this.store);\n this.plugins.push(plugin);\n return true;\n }\n\n decode(message: Message, options: Options = {}): DecodeResult {\n if (message.label === 'MA') {\n const decodeResult = MIAMCoreUtils.parse(message.text);\n\n // Only transplant message text if the MIAM core decoded message passed CRC and is complete\n if (decodeResult.decoded &&\n decodeResult.message.data !== undefined &&\n decodeResult.message.data.crcOk &&\n decodeResult.message.data.complete &&\n decodeResult.message.data.acars !== undefined) {\n message = {\n ...message,\n label: decodeResult.message.data.acars.label,\n ...(decodeResult.message.data.acars.sublabel ? { sublabel: decodeResult.message.data.acars.sublabel } : {}),\n ...(decodeResult.message.data.acars.mfi ? { mfi: decodeResult.message.data.acars.mfi } : {}),\n ...(decodeResult.message.data.acars.text ? { text: decodeResult.message.data.acars.text } : {}),\n }\n }\n }\n\n // console.log('All plugins');\n // console.log(this.plugins);\n const usablePlugins = this.plugins.filter((plugin) => {\n const qualifiers: any = plugin.qualifiers();\n\n if (qualifiers.labels.includes(message.label)) {\n if (qualifiers.preambles && qualifiers.preambles.length > 0) {\n const matching = qualifiers.preambles.filter((preamble: string) => { // eslint-disable-line arrow-body-style,max-len\n // console.log(message.text.substring(0, preamble.length));\n // console.log(preamble);\n return message.text.substring(0, preamble.length) === preamble;\n });\n // console.log(matching);\n return matching.length >= 1;\n } else { // eslint-disable-line no-else-return\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 if (usablePlugins.length > 0) {\n const plugin: DecoderPluginInterface = usablePlugins[0];\n result = plugin.decode(message);\n } else {\n result = {\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\n if (options.debug) {\n console.log('Result');\n console.log(result);\n }\n\n return result;\n }\n\n lookupAirportByIata(iata: string): any {\n const airportsArray: Array<any> = []; // = this.store.state.acarsData.airports;\n // console.log(airportsArray);\n const airport = airportsArray.filter((e: any) => e.iata === iata);\n\n return airport;\n }\n}\n\nexport default {\n};\n"],"mappings":"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Q;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAA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;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;AAAA,MAAY;AAAA,MACpC;AAAA,MAAY;AAAA,MAAY;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","names":["data","processPosition","processUnknown","processUnknown","zlib"]}
|