HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //var/www/ai-notam/docs/types.ts
export type SoftEqualString = string; // тип для свободных строк, когда мы не требуем точного совпадение строки
export type CdrValue = (1 | 2 | 3);
// Latitude не может быть E/W, а Longitude N/S
export type CoordinateValueLatitude = `^(00|0?[1-9]|0?[1-9][0-9]|0?1[0-7][0-9]|180)[0-5][0-9]([0-5])?([0-9])?(?:\\.[0-9]+)?(N|S)$`
export type CoordinateValueLongitude = `^(00|0?[1-9]|0?[1-9][0-9]|0?1[0-7][0-9]|180)[0-5][0-9]([0-5])?([0-9])?(?:\\.[0-9]+)?(E|W)$`
export type CustomCoordinate = `^(ARP|THLD)([0-9]{0,2})(R|L|V)?$`
export type DecimalCoordinate = `^[0-9][0-9]*[\.][0-9][0-9]*(N|S|E|W)$`
export type IcaoCode = `^[A-Z]{4}$`
export type LettersAndNumbers = `^[0-9A-Za-z\/]*$`
export type ID = `^[0-9A-Za-z\-\/\ ]*$`
export type WptName = `^[0-9A-Za-z]{1,5}$`
export type NumberRange = `^[0-9]*-[0-9]*$`
export type NumberType = `^[0-9]*$`
export type WeekDayName = `(MON|TUE|WED|THU|FRI|SAT|SUN)`
export type DaysRange = `[0-9]{1,2}-?([0-9]{1,2})?`
export type MonthName = `^(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)$`
export type DateType = `^[0-9]{4}-[0-9]{2}-[0-9]{2}`
export type Time = `^(?:[01][0-9]|2[0-3]):[0-5][0-9](?: *\\(\\+1\\))?$`
export type SunTime = `^(SS|SR)(\ *[-+]\ *([0-9]{2}))?$`

export type Avalability = {
  AVLB: boolean,
  From?: SoftEqualString,
  To?: SoftEqualString,
  Other?: SoftEqualString
}

export type Period = {
  startDate?: DateType,
  startTime: Time | SunTime,
  endDate?: DateType | null | 'PERM',
  endTime: Time | SunTime
}

export type Day = {
  day: NumberType[] | WeekDayName[] | DaysRange[] | ["daily"]
  month?: MonthName,
  periods: Period[],
}

export type AcftTypes = `^(A124|A140|A148|A158|A19N|A20N|A21N|A21NX|A21NY|A210|A225|A306|A30B|A310|A310|A318|A318|A319|A319|A320|A320|A20F|A321|A321|A21F|A332|A333|A332|A333|A337|A338|A339|A342|A343|A345|A346|A359|A35K|A388|A3ST|A400|A5|A748|AC68|AC90|AJ27|AN12|AN2|AN24|AN26|AN28|AN30|AN32|AN72|AP22|AS32|AS50|AT43|AT45|AT46|AT72|AT73|AT75|AT76|ATL|ATP|B06|B06T|B105|B190|B212|B37M|B38M|B39M|B3XM|B412|B429|B461|B462|B463|B703|B712|B720|B721|B722|B732|B733|B734|B735|B736|B738|B739|B73C|B73E|B73F|B737|B73H|B73J|B73K|B73P|B73U|B73W|B73Y|B741|B741|B742|B742|B742|B743|B743|B744|B744|B744|B748|B748|B74D|B74R|B74R|B74S|B752|B752|B753|B762|B763|B764|B76W|B76X|B76Y|B772|B773|B778|B779|B77L|B77L|B77W|B788|B789|B78X|BA11|BCS1|BCS3|BE40|BE55|BE58|BE99|BELF|BER2|BL8|BLCF|BN2P|C130|C140|C152|C162|C172|C177|C182|C82R|C206|C208|C210|T210|C212|C25A|C25B|C25C|C30J|C310|C46|C500|C510|C525|C550|C560|C56X|C650|C680|C72R|C750|C77R|C919|CH7A|CH7B|CL2T|CL30|CL60|CN35|CONC|CONI|CRJ1|CRJ2|CRJ7|CRJ9|CRJX|CVLP|CVLT|D228|D328|DA40|DA42|DA62|DC10|DC10|DC10|DC10|DC10|DC3|DC6|DC85|DC86|DC87|DC91|DC92|DC93|DC94|DC95|DH2T|DH62|DH64|DH8A|DH8B|DH8C|DH8D|DHC2|DHC3|DHC4|DHC5|DHC6|DHC7|DOVE|E110|E120|E135|E135|E145|E170|E190|E195|E290|E295|E35L|E50P|E545|E550|E55P|E75L|E75S|EA30|EA31|EA32|EA33|EA34|EA50|EC20|EC25|EC30|EC35|EC45|EC55|EC75|ECHO|EV97|EVSS|EXPL|F100|F27|F28|F2TH|F406|F50|F70|F900|FA24|FA50|FA7X|G159|G21|G280|G73T|GA8|GL5T|GLEX|GLF4|GLF5|GLF6|GOLF|H25B|H25C|HDJT|HERN|I114|IL18|IL62|IL76|IL86|IL96|J328|JS31|JS32|JS41|JU52|K35R|L101|L188|L410|LJ35|LJ60|MD11|MD11|MD11|MD81|MD82|MD83|MD87|MD88|MD90|MI24|MI8|MU2|N262|NOMA|P06T|P8|P180|P208|P212|P28A|P28B|P68|PA31|PA44|PA46|PC12|PC6T|PC24|PIPA|PISI|PITA|PIVI|R200|RJ1H|RJ70|RJ85|RV4|S210|S58T|S601|S61|S65C|S76|S92|SB20|SC7|SF34|SF50|SH33|SH36|SIRA|SPIT|SR22|SU95|SW4|T134|T144|T154|T204|TB20|TL20|TRF1|TRIS|TWEN|V22|WW24|Y12|YK40|YK42|YS11|HEL)$`

export type AcftCategory = `^(A|B|C|D|E|F|I|II|III|IV|V|VI|1|2|3|4|5|6|7|8|9|0|10)$`

export type AcftLandCategory = `^(A|B|C|D)$`

export type Direction = `^(full|clock|unticlock)$`

export type ConditionalRoutingDirection =  `^(S|N|W|E|NE|NW|SE|SW)$`

export type Direction_awy = `^(both|direct|backward)$`

export type FlLvls =  `^(odd|even)$`

export type FLevel_struct = {
  FL?: FlLvls, //четные/нечетные эшелоны  может быть EVEN/ODD
  Range?: NumberRange[] //диапазон высот, числовое значение (135-540)
}

export type RTE_Segment = {
  From: WptName, //имя начальной точки
  AWY?: SoftEqualString, //имя трассы между точкам
  TO: WptName, //имя конечной точки
  Direction?: Direction_awy|Direction_awy[]|ConditionalRoutingDirection[], //направленность участка ВТ
  FLevel?: FLevel_struct[] //эшелонирование на участке
  AVLB: boolean //Используется или нет
}

export type AWY_Segment = { //Участок воздушной трассы
  From?: {
      WptName?: WptName,//Идентификатор начальной точки участка воздушной трассы,
      Coordinate_System?: SoftEqualString,//отображать поле, только если в НОТАМ идет речь о coordinate system, например (КООРДИНАТЫ ПОРОГА (ПЗ-90.11): N592505.41 Е1430329.45),
      Coordinates?: {
          Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate,//Широта,
          Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //Долгота
      }
  },
  To?: {
      WptName?: WptName,//Идентификатор начальной точки участка воздушной трассы,
      Coordinate_System?: SoftEqualString,//отображать поле, только если в НОТАМ идет речь о coordinate system, например (КООРДИНАТЫ ПОРОГА (ПЗ-90.11): N592505.41 Е1430329.45),
      Coordinates?: {
          Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate,//Широта,
          Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //Долгота
      }
  },
  Direction?: Direction_awy, //Направление движения (обратное, прямое, двухстороннее),
  Width?: ValuePlusUnits, //Ширина участка (число с единицей измерения),
  Min_ALT_direct?: ValuePlusUnits | VerticalLimits, //Минимальная высота (прямое направление) (число с единицей измерения),
  Min_ALT_backward?: ValuePlusUnits | VerticalLimits, //Минимальная высота (обратное направление) (число с единицей измерения),
  Max_ALT?: ValuePlusUnits | VerticalLimits, //Максимальная высота (число с единицей измерения),
  Direct_course?: FullDegrees, //Прямой (исходящий) путевой угол участка трассы  (число с единицей измерения),
  Backward_course?: FullDegrees, //Обратный путевой угол участка трассы (число с единицей измерения),
  Times?: Day[], //Повторяет структуру раздела D
  AVLB: boolean, //Используется или нет,
  Dist?: ValuePlusUnits, //Длина участка воздушной трассы (число с единицей измерения),
  new_route?: SoftEqualString[] //предложенный маршрут взамен закрытого участка трассы – массив из трасса-точка-трасс,
  Cond_RTE?: boolean,//Conditional route да или нет,
  ATC_only?: boolean,//Участок трассы доступен только по согласованию с диспетчером, true/false,
  RNAV?: LettersAndNumbers, //Значение RNAV (число с единицей измерения)
  cdr_value?: CdrValue[]|[null],
  Other?: SoftEqualString//другая информация по трассе, для которой нет полей
}

export type AreaType = "Unknown" | "Restricted" | "Prohibited" | "Military" | "Alert" | "Caution" | "Danger" | "Nat_secur" | "Training" | "TSA" | "TRA" | "closed" | "uav"

export type MoreOrLessVal = {
  value: ValuePlusUnits,
  more_less: string
}

export type AcftTypeObject = {
   AC_type: AcftTypes[],
   Code_more_less?: string
}
export type MoreOrLessObject = {
   limited_to: boolean,
   types: MoreOrLessVal
}

export type ValuePlusUnits =  (number | string)[]
export type VerticalLimits = (string)[] // `^(SFC|GND|UNL|AGL|AMSL)$`

export type Slope = `^([0-9]*(\.?)[0-9])*(%){1}$`

export type FullDegrees = `^([0-9]{1,3})(\.?)[0-9]{0,2}°$`

export type MagVar = `^([0-9]{4})(E|W|e|w)$`

export type DegreesMin = `^([0-8][0-9]|90)°([0-4][0-9]|59)'$`

export type Pcn = `^[0-9]*\/[A-Z]\/[A-Z]\/[A-Z]\/[A-Z]$`

export type AppCat = "I" | "II" | "IIIA" | "IIIB" | "IIIC" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "0" | "10"

export type Coordinate =
{
  Latitude: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //Широта,
  Longitude: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //Долгота
}

export type CoordinateWithType =
    ({
      type: 'point', //тип соединяющего участка,
      Latitude: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //Широта,
      Longitude: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //Долгота
    } |
        {
          type: 'line', //тип соединяющего участка,
          Latitude: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //Широта,
          Longitude: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //Долгота
        } |
        {
          type: 'arc', //тип соединяющего участка,
          direction?: Direction, //направление участка между точками,
          Latitude_cntr: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //Широта центра,
          Longitude_cntr: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate, // Долгота центра,
          radius: ValuePlusUnits, // Радиус,
          Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, // Широта,
          Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate // Долгота
        } |
        {
          type: 'state_border', // тип соединяющего участка,
          direction?: Direction, //направление участка между точками,
          state?: SoftEqualString, //Страна1/Страна2,
          Latitude: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //Широта,
          Longitude: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //Долгота
        } |
        {
          type: 'FIR_border', // тип соединяющего участка,
          direction?: Direction, //направление участка между точками,
          FIR?: IcaoCode, //ICAO код FIR,
          Latitude: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //Широта,
          Longitude: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //Долгота
        } |
        {
          type: 'polar_point', // тип соединяющего участка
          From?: LettersAndNumbers, //опорная точка,
          Coordinate_System?: SoftEqualString, //отображать поле, только если в НОТАМ идет речь о coordinate system, например (КООРДИНАТЫ ПОРОГА (ПЗ-90.11): N592505.41 Е1430329.45),
          Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, // Широта,
          Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate, // Долгота,
          DIST?: ValuePlusUnits, // Дальность,
          RAD?: FullDegrees//радиал (число в градусах),
        })

export type ACFT = {
  limited_to: boolean, //означает, что по смыслу НОТАМ на АП допущены ТОЛЬКО такие типы ВС (если true) и, например, с 01.10.2024 аэропорт принимает еще и ВС типа МС-21 (если false).
  types?: AcftTypeObject | AcftTypes[], //перечень типов ВС предоставлялся в виде списка excel в чате 02.08.2024
  cat?: AcftCategory[], //текстовое или числовое значение (A, B, C, D, E или I, II, III, IV, V, VI)
  wing_span?: MoreOrLessVal, //числовое значение (с сохранением единиц измерения) (31,7M, 198,0FT,  15,0M)
  Other?: SoftEqualString,
  fuselage_width?: MoreOrLessVal,
}

export type RFFS = {
    RFFS_CAT?: NumberType,
    Times?: Day[]
}

export type Aerodrome = {
  Name?: SoftEqualString, //WALSINGHAM / CEILIDH
  Code: IcaoCode, //ICAO код аэродрома
  Day_only?: boolean,
  UTC?: SoftEqualString, //UTC+/-N,
  AVLB: boolean, //открыт или нет
  AVLB_AS_ALT?: boolean, //доступность аэродрома в качестве запасного
  RFFS?: RFFS[], // цифровое значение, поэтому тип может быть Number. целые значения от 1 до 10 (5, 8, 10)
  ACFT_allow?: ACFT[], //перечень типов ВС предоставлялся в виде списка excel в чате 02.08.2024
  ACFT_proh?: ACFT[], //перечень типов ВС предоставлялся в виде списка excel в чате 02.08.2024
  Transition_FL?: ValuePlusUnits|null, //цифровое значение поэтому оставляем строку, можно использовать  регулярное выражение,(с сохранением единиц измерения) (null 19000ft 19000fl  1200m  "byATC")
  Transition_ALT?: ValuePlusUnits|null, //цифровое значение (с сохранением единиц измерения), (null 19000ft  QNE, 1200m  QNH, "byATC")
  Elevation?: ValuePlusUnits|null, //цифровое значение(с сохранением единиц измерения), (815ft)
  Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //все варианты были указаны отдельно в чате 30.09.2024
  Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate, //все варианты были указаны отдельно в чате 30.09.2024
  MagVar?: MagVar, //в пояснении указано, что в градусах числовое значение EAST/WEST +/-, (4°54’E)
  Times?: Day[], //Повторяет структуру раздела D
  Fuel?: SoftEqualString, //Информация по топливу в АП
  Other?: SoftEqualString //текстовое и/или числовое поле в свободном формате
}

export type Helipad = {
    Name?: SoftEqualString[], //Название вертолетной площадки
    Code: IcaoCode[], //ICAO код вертолетной площадки
    AVLB: boolean,
    Coordinates?: Coordinate[],//Координаты вертолетной площадки (от 1ой до 4х)
    Elevation?: ValuePlusUnits, //Превышение вертолетной площадки
    PCN?: Pcn, //Прочность PCN вертолетной площадки
    PCR?: Pcn, //Прочность PCR вертолетной площадки
    ACFT_allow?: ACFT[], //Допущенные ВС
    ACFT_proh?: ACFT[], //Запрещенные ВС
    RFFS?: RFFS[], // цифровое значение, поэтому тип может быть Number. целые значения от 1 до 10 (5, 8, 10)
    Day_only?: boolean,
    UTC?: SoftEqualString, //UTC+/-N,
    Transition_FL?: ValuePlusUnits|null, //цифровое значение поэтому оставляем строку, можно использовать  регулярное выражение,(с сохранением единиц измерения) (null 19000ft 19000fl  1200m  "byATC")
    Transition_ALT?: ValuePlusUnits|null, //цифровое значение (с сохранением единиц измерения), (null 19000ft  QNE, 1200m  QNH, "byATC")
    Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //все варианты были указаны отдельно в чате 30.09.2024
    Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate, //все варианты были указаны отдельно в чате 30.09.2024
    MagVar?: MagVar, //в пояснении указано, что в градусах числовое значение EAST/WEST +/-, (4°54’E)
    Times?: Day[], //Повторяет структуру раздела D
    Fuel?: SoftEqualString, //Информация по топливу в АП
    Other?: SoftEqualString //Прочая информация по площадке
}

export type Stand = {
  Stand_Number: SoftEqualString[], //Массив из ID стендов, объединенных одним статусом
  AVLB: boolean, //доступно или нет
  Coordinates?: {
    Coordinate_system?: SoftEqualString, //отображать поле, только если в НОТАМ идет речь о coordinate system, например (КООРДИНАТЫ ПОРОГА (ПЗ-90.11): N592505.41 Е1430329.45)
    Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //все варианты были указаны отдельно в чате 30.09.2024
    Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //все варианты были указаны отдельно в чате 30.09.2024
  },
  PCN?: Pcn, //XXX/Y/Y/Y/Y. где X числа, Y буквы латинского алфавита("51/F/B/X/T")
  PCR?: Pcn,
  ACFT_allow?: ACFT[], //перечень типов ВС предоставлялся в виде списка excel в чате 02.08.2024
  ACFT_proh?: ACFT[], //перечень типов ВС предоставлялся в виде списка excel в чате 02.08.2024
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //текстовое и/или числовое поле в свободном формате
}

export type Runway = {
  RWY: SoftEqualString[], //Массив из ID RWY, объединенных одним статусом
  AVLB: boolean,
  LDG?: Avalability,
  TAX?: Avalability,
  TKOF?: Avalability,
  From?: SoftEqualString, //От точки
  To?: SoftEqualString, //До точки
  Dimensions?: { //размер взлётно-посадочной полосы
    Length?: ValuePlusUnits, //Длина (числовое значение с единицей измерения)
    Width?: ValuePlusUnits, //Ширина (числовое значение с единицей измерения)
  },
  STRP_Dimensions?: { //размеры лётного поля
    Length?: ValuePlusUnits //Длина (числовое значение с единицей измерения),
    Width?: ValuePlusUnits // Ширина (числовое значение с единицей измерения)
  },
  Threshold?: Threshold[],
  PCN?: Pcn, //XXX/Y/Y/Y/Y. где X числа, Y буквы латинского алфавита("51/F/B/X/T")
  PCR?: Pcn,
  ACFT_allow?: ACFT[], //перечень типов ВС предоставлялся в виде списка excel в чате 02.08.2024
  ACFT_proh?: ACFT[], //перечень типов ВС предоставлялся в виде списка excel в чате 02.08.2024
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //текстовое и/или числовое поле в свободном формате
}

export type Threshold = {
  Thld: SoftEqualString[], //Массив из ID THR, объединенных одним статусом
  Displaced?: boolean, //Является смещенным
  Displaced_by?: ValuePlusUnits, //Величина смещения порога ВПП (цифровое значение с единицей измерения)
  AVLB: boolean, //Допустимо ли использование порога
  LDG?: Avalability,
  TAX?: Avalability,
  TKOF?: Avalability,
  PCN?: Pcn,
  PCR?: Pcn,
  Day_Marking?: boolean //Присутствует ли разметка?
  Mag_Azimuth?: FullDegrees, //Магнитный азимут (магнитное направление ВПП). Числовое значение,
  Rwy_Slope?: Slope, //Уклон ВПП (числовое значение %),
  RWY_centerline_mark?: boolean, //Присутствует ли маркировка осевой линии ВПП, true/false,
  RWY_App_light?: boolean, //Присутствуют ли огни приближения, true/false,
  RWY_Thld_light?: boolean, //Присутствуют ли огни порога, true/false,
  RWY_End_light?: boolean, //Присутствуют ли ограничительные огни ВПП, true/false,
  RWY_Edge_light?: boolean, //Присутствуют ли посадочные огни ВПП, true/false,
  SWY_Light?: boolean, //Присутствуют ли огни концевой полосы торможения, true/false,
  PAPI_light?: boolean, //Присутствуют ли система визуальной индикации глиссады, true/false,
  Obstacle_Lights?: boolean, //Присутствуют ли огни препятствий, true/false,
  Thld_Coord?: { //Координаты порога
    Coordinate_System?: SoftEqualString, //отображать поле, только если в НОТАМ идет речь о coordinate system, например (КООРДИНАТЫ ПОРОГА (ПЗ-90.11): N592505.41 Е1430329.45),
    Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //Широта, все варианты были указаны отдельно в чате 30.09.2024
    Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //Долгота, все варианты были указаны отдельно в чате 30.09.2024
  },
  Thld_Elevation?: ValuePlusUnits | VerticalLimits, //Высота порога относительно уровня моря,
  RWY_end_coordinates?: { //Координаты конца ВПП
    Coordinate_System?: SoftEqualString, //отображать поле, только если в НОТАМ идет речь о coordinate system, например (КООРДИНАТЫ ПОРОГА (ПЗ-90.11): N592505.41 Е1430329.45),
    Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //Широта, все варианты были указаны отдельно в чате 30.09.2024
    Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //Долгота, все варианты были указаны отдельно в чате 30.09.2024
  },
  RWY_end_elevation?: ValuePlusUnits | VerticalLimits, //Высота конца порога относительно уровня моря,
  Taxiing?: SoftEqualString, //информация о рулении,
  Declared_Distances?: { //Объявленные дистанции для операции взлёта и посадки
    TODA?: ValuePlusUnits, //располагаемая дистанция взлёта (цифровое значение с единицей измерения),
    TORA?: ValuePlusUnits, //располагаемая дистанция разбега (цифровое значение с единицей измерения),
    SWY?: ValuePlusUnits, //располагаемая дистанция прерванного взлёта (цифровое значение с единицей измерения),
    ASDA?: ValuePlusUnits, //располагаемая дистанция прерванного взлёта (цифровое значение с единицей измерения),
    LDA?: ValuePlusUnits, //располагаемая посадочная дистанция (цифровое значение с единицей измерения),
    CW_Length?: ValuePlusUnits, //Длина свободной зоны (в конце ВПП (цифровое значение с единицей измерения)),
    CW_Width?: ValuePlusUnits, //Ширина свободной зоны (в конце ВПП (цифровое значение с единицей измерения))
  },
  Other?: SoftEqualString //Другая информация по порогу ВПП, для которой нет полей
}

export type ILS = { // Точная система захода на посадку
  Thld: SoftEqualString[], //Массив из ID THR, объединенных одним статусом
  AVLB: boolean, //Работает или нет,
  CALL_SIGN?: LettersAndNumbers, //Позывной (Латинские буквы),
  FREQ_GS?: ValuePlusUnits, //частота глиссадного радио-маяк (Числовое значение с единицей измерения),
  FREQ_CS?: ValuePlusUnits, //частота курсового радио-маяк (Числовое значение с единицей измерения),
  MagVar?: MagVar, //установленное магнитное склонение (числовое значение (EAST/WEST +/-)),
  Course?: FullDegrees, //Курс захода на посадку,
  Back_course?: boolean, //Применимость обратного курса, true/false,
  G_slope?: FullDegrees, //Угол наклона глиссады (Числовое значение double),
  CAT?: AppCat, //Категория инструментальной системы захода на посадку (берётся из NOTAM)
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString, //Другая информация по точной системе захода на посадку, для которой нет полей
}

export type GLS = { // Точная система захода на посадку по спутнику
  Thld: SoftEqualString[], //Массив из ID THR, объединенных одним статусом
  AVLB: boolean, //Работает или нет,
  CALL_SIGN?: LettersAndNumbers, //Позывной (латинские буквы с цифрами),
  CANAL?: LettersAndNumbers, //Номер канала для настройки бортового оборудования (числовое значение),
  CAT?: AppCat, //Категория системы захода на посадку по спутнику (берётся из NOTAM),
  MagVar?: MagVar, //Магнитное склонение (числовое значение (EAST/WEST +/-)),
  G_slope?: FullDegrees, //Угол наклона глиссады (Числовое значение double)
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString, //Другая информация по точной системе захода на посадку по спутнику, для которой нет полей
}

export type Departure = { //Вылеты
  RWY?: SoftEqualString[], //Порог взлёта (берётся из NOTAM),
  ID?: SoftEqualString[], //Идентификатор процедуры (берётся из NOTAM),
  AVLB: boolean, //Используется или нет,
  Other?: SoftEqualString //другая информация по вылету, для которой нет полей
}

export type Arrival = { //Прибытие
  RWY?: SoftEqualString[],  //Порог прибытия (берётся из NOTAM),
  ID?: SoftEqualString[], //Идентификатор процедуры (берётся из NOTAM),
  AVLB: boolean, //Используется или нет,
  Other?: SoftEqualString //другая информация по прибытию, для которой нет полей
}

export type Approach = { //Заход на посадку
  RWY?: SoftEqualString[], //Порог захода на посадку (берётся из NOTAM),
  ID?: SoftEqualString[], //Идентификатор процедуры (берётся из NOTAM),
  "OCA(A)"?: ValuePlusUnits,// высота пролета препятствий абсолютная для САТ А,
  "OCH(A)"?: ValuePlusUnits,// высота пролета препятствий относительная для САТ А,
  "OCA(B)"?: ValuePlusUnits,// высота пролета препятствий абсолютная для САТ B,
  "OCH(B)"?: ValuePlusUnits,// высота пролета препятствий относительная для СBТ В,
  "OCA(C)"?: ValuePlusUnits,// высота пролета препятствий абсолютная для САТ С,
  "OCH(C)"?: ValuePlusUnits,// высота пролета препятствий относительная для САТ С,
  "OCA(D)"?: ValuePlusUnits,// высота пролета препятствий абсолютная для САТ D,
  "OCH(D)"?: ValuePlusUnits,// высота пролета препятствий относительная для САТ D,
  "OCA(DL)"?: ValuePlusUnits,// высота пролета препятствий абсолютная для САТ DL,
  "OCH(DL)"?: ValuePlusUnits // высота пролета препятствий относительная для CAT DL
  "OCA(H)"?: ValuePlusUnits,// высота пролета препятствий абсолютная для САТ H,
  "OCH(H)"?: ValuePlusUnits,// высота пролета препятствий относительная для САТ H
  AVLB: boolean, //Используется или нет,
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //другая информация по заходу на посадку, для которой нет полей
}

export type Procedures = { //Процедуры вылет/прилёт. Установленные маршруты следования воздушных судов
  Departures?: Departure[],
  Arrivals?: Arrival[],
  Approach?: Approach[],
  Times?: Day[], //Повторяет структуру раздела D
}

export type Apron = { //Перрон (все стоянки)
  AVLB: boolean, //Открыт или нет,
  ID: SoftEqualString[], //Идентификатор перрона (берётся из NOTAM),
  From?: SoftEqualString, //От точки
  To?: SoftEqualString, //До точки
  Elevation?: ValuePlusUnits | VerticalLimits, //Превышение над уровнем моря (числовое значение с единицей измерения),
  PCN?: Pcn, //XXX/Y/Y/Y/Y. где X числа, Y буквы латинского алфавита("51/F/B/X/T")
  PCR?: Pcn,
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //другая информация по перрону, для которой нет полей
}

export type Taxiway = {
  TWY: SoftEqualString[], // Массив из ID стендов, объединенных одним статусом
  AVLB: boolean, //доступна или нет
  From?: SoftEqualString, //От точки
  To?: SoftEqualString, //До точки
  Width?: ValuePlusUnits, // Ширина рулёжной дорожки (число + единица измерения)
  ACFT_allow?: ACFT[], //перечень типов ВС предоставлялся в виде списка excel в чате 02.08.2024
  ACFT_proh?: ACFT[], //перечень типов ВС предоставлялся в виде списка excel в чате 02.08.2024
  PCN?: Pcn, //XXX/Y/Y/Y/Y. где X числа, Y буквы латинского алфавита("51/F/B/X/T")
  PCR?: Pcn,
  Declared_Distances?: { // Объявленные дистанции после выруливания с дорожки (не от начала ВПП)
    Thld: SoftEqualString,//Порог,
    TODA?: ValuePlusUnits, //располагаемая дистанция взлёта (цифровое значение с единицей измерения),
    TORA?: ValuePlusUnits, //располагаемая дистанция разбега (цифровое значение с единицей измерения),
    SWY?: ValuePlusUnits, //располагаемая дистанция прерванного взлёта (цифровое значение с единицей измерения),
    ASDA?: ValuePlusUnits, //располагаемая дистанция прерванного взлёта (цифровое значение с единицей измерения),
    LDA?: ValuePlusUnits, //располагаемая посадочная дистанция (цифровое значение с единицей измерения)
  },
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //текстовое и/или числовое поле в свободном формате
}

export type FIR = {//Район полётной информации
  FIR_code: IcaoCode[], //Идентификатор FIR (берётся из NOTAM),
  Name?: SoftEqualString[], //Наименование FIR (берётся из NOTAM),
  Flight_rules?: SoftEqualString, //Правила полетов (берётся из NOTAM),
  Min_alt?: ValuePlusUnits | VerticalLimits, //Нижняя граница (числовое значение значение с единицей измерения),
  Max_alt?: ValuePlusUnits | VerticalLimits, //Верхняя граница (числовое значение значение с единицей измерения),
  CPDLC?: boolean, //Система текстовой связи между диспетчером и пилотом
  CPDLC_Logon?: IcaoCode, //Адрес для логина в системе,
  ADSC?: boolean, //Присутствует ли автоматическое зависимое наблюдение,
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //текстовое и/или числовое поле в свободном формате
}

export type Radio = { // Система радио связи между диспетчером и пилотом,
  Call_Sign: ID[], //Позывной (текст),
  Freq?: ValuePlusUnits,//Частота передачи (число с единицей изменения),
  AVLB: boolean, //используется или нет,
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //другая информация
}

export type Area = {
  Area_name?: SoftEqualString[], //Наименование (берётся из NOTAM),
  Type?: AreaType, //Тип ограничения,
  Activated: boolean, //статус активности,
  No_Fly: boolean, //запрещен полет или нет,
  Coordinate_System?: SoftEqualString //отображать поле, только если в НОТАМ идет речь о coordinate system, например (КООРДИНАТЫ ПОРОГА (ПЗ-90.11): N592505.41 Е1430329.45),
  Coordinates?: CoordinateWithType[],
  Coordinates_excl?: CoordinateWithType[],
  Width?: ValuePlusUnits, //ширина зоны в обе стороны,
  Lower_limit?: ValuePlusUnits | VerticalLimits, //нижняя граница (число с единицей измерения),
  Upper_limit?: ValuePlusUnits | VerticalLimits, //верхняя граница (число с единицей измерения),
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //другая информация по зоне, для которой нет полей
}

export type  Airway = { // воздушная трасса
  Airway_ID: LettersAndNumbers[], //Идентификатор воздушной трассы (берётся из NOTAM),
  AVLB: boolean, //Используется или нет,
  Other?: SoftEqualString, //другая информация, для которой нет полей,
  Times?: Day[], //Повторяет структуру раздела D
  AWY_Segments?: AWY_Segment[]
}

export type Waypoint = { //Точка маршрута трассы
  Name: WptName[], //Наименование точки,
  AVLB: boolean, //Используется или нет,
  Coordinate_System?: SoftEqualString, //отображать поле, только если в НОТАМ идет речь о coordinate system, например (КООРДИНАТЫ ПОРОГА (ПЗ-90.11): N592505.41 Е1430329.45),
  Coordinates?: { //Координаты
    Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //широта,
    Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //долгота
  },
  MagVar?: MagVar, //в пояснении указано, что в градусах числовое значение EAST/WEST +/-, (4°54’E)
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //другая информация по трассе, для которой нет полей
}

export type Navaid = {
  Name: LettersAndNumbers[] //Наименование навигационного средства,
  Type?: LettersAndNumbers[] //Тип навигационного средства,
  Frequency?: ValuePlusUnits, //Частота настройки этого навигационного средства (число с единицей измерения),
  Channel?: LettersAndNumbers, //канал настройки этого навигационного средства (число с единицей измерения),
  AVLB: boolean, //Используется или нет
  Coordinate_System?: SoftEqualString, //отображать поле, только если в НОТАМ идет речь о coordinate system, например (КООРДИНАТЫ ПОРОГА (ПЗ-90.11): N592505.41 Е1430329.45),
  Coordinates?: {
    Latitude?: CoordinateValueLatitude | CustomCoordinate | DecimalCoordinate, //широта,
    Longitude?: CoordinateValueLongitude | CustomCoordinate | DecimalCoordinate //долгота
  },
  MagVar?: MagVar, //в пояснении указано, что в градусах числовое значение EAST/WEST +/-, (4°54’E)
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //другая информация по трассе, для которой нет полей
}
export type Route = {
    RTE_Segments?: RTE_Segment[]
}
export type Conditional_Routing = { //условная маршрутизация
  Condition_from?: { //начальное направление для условия
    Direction?: ConditionalRoutingDirection[],
    FIR?: IcaoCode[], //район полётной информации,
    AP?: IcaoCode[],//аэропорт вылета
    WPT?: WptName[] //начальная точка,
  }
  Condition_to?: {//конечное направление для условия
    Direction?: ConditionalRoutingDirection[],
    FIR?: IcaoCode[], //район полётной информации,
    AP?: IcaoCode[], //аэропорт вылета
    WPT?: WptName[] //начальная точка,
  }
  Routes?: Route[],
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString //другая информация по трассе, для которой нет полей
}

export type Obstacle = { //Препятствия
  Active?: boolean,
  ID?: ID, //Идентификатор препятствия,
  Name?: SoftEqualString, //Наименование (EN),
  Coordinate_System?: SoftEqualString, //Отображать поле, только если в НОТАМ идет речь о coordinate system, например (КООРДИНАТЫ ПОРОГА (ПЗ-90.11): N592505.41 Е1430329.45),
  Coordinates?: CoordinateWithType[], // Задаются координаты аналогично разделу Area, но в данном случае фигура может не замыкаться (например линия электропередач)
  Elevation?: ValuePlusUnits | VerticalLimits, //Превышение препятствия от уровня моря (число + единица измерения),
  Height?: ValuePlusUnits | VerticalLimits, //Высота над землей (число + единица измерения),
  Radius?: ValuePlusUnits, //Радиус препятствия + единицы измерения
  Marking?: boolean, //Наличие маркировки, true/false,
  Light_mark?: boolean, //Наличие светового ограждения (подсвечено препятствие или нет?)
  Times?: Day[], //Повторяет структуру раздела D
  Other?: SoftEqualString
}

export type FlightNumber = SoftEqualString;

export type ExemptionType = "ARR" | "DEP" | "FLT_NUMB" | "SCHEDULED_FLTS" | "CHARTER_FLTS" | "DOMESTIC_FLTS" | "VIP_FLTS" | "INTERNATIONAL_FLTS" | "TWO-WAY COMM"

export type ExemptionCondition = "ALL" | "VIA_ATS_ROUTES"

export type Exemption = {
  type: ExemptionType,
  condition?: ExemptionCondition,
  airports?: IcaoCode[],
  numbers?: FlightNumber[]
}

export type E_Line = {
  Aerodromes?: Aerodrome[],
  Helipads?: Helipad[],
  Stands?: Stand[],
  Taxiways?: Taxiway[],
  Obstacles?: Obstacle[],
  Runways?: Runway[],
  ILSs?: ILS[],
  GLSs?: GLS[],
  Procedures?: Procedures[],
  Aprons?: Apron[],
  FIRs?: FIR,
  Areas?: Area[],
  Radios?: Radio[],
  Airways?: Airway[],
  Waypoints?: Waypoint[],
  Navaids?: Navaid[],
  References?: SoftEqualString,
  Conditional_Routings?: Conditional_Routing[],
  exemptions?: Exemption[],
  Other?: SoftEqualString
}

export interface NotamObject {
  A_Line?: SoftEqualString|null,
  B_Line?: SoftEqualString,
  C_Line?: SoftEqualString,
  D_Line?: Day[]|null,
  E_Line?: E_Line|null,
  F_Line?: ValuePlusUnits | null,
  G_Line?: ValuePlusUnits | null,
  FIR?: SoftEqualString,
  FIRs?: SoftEqualString,
  N_STATUS?: SoftEqualString,
  N_status?: SoftEqualString,
  QCode?: SoftEqualString,
  REF_NOTAM?: SoftEqualString,
  altitudeMax?: SoftEqualString,
  altitudeMin?: SoftEqualString,
  area?: SoftEqualString,
  coordinatesLat?: SoftEqualString,
  coordinatesLon?: SoftEqualString,
  entity?: SoftEqualString,
  id?: SoftEqualString,
  radius?: SoftEqualString,
  siteIndexA?: SoftEqualString,
  status?: SoftEqualString,
  text?: SoftEqualString,
  title?: SoftEqualString,
  traffic?: SoftEqualString,
  type?: SoftEqualString,
  TYPE?: SoftEqualString,
  cycle?: NumberType,
  AltitudeMax?: SoftEqualString,
  AltitudeMin?: SoftEqualString,
  Area?: SoftEqualString,
  CoordinatesLat?: SoftEqualString,
  CoordinatesLon?: SoftEqualString,
  Entity?: SoftEqualString,
  Id?: SoftEqualString,
  ID?: SoftEqualString,
  Radius?: SoftEqualString,
  SiteIndexA?: SoftEqualString,
  Status?: SoftEqualString,
  Text?: SoftEqualString,
  Title?: SoftEqualString,
  Traffic?: SoftEqualString,
  Type?: SoftEqualString,
  Cycle?: NumberType,
  CheckNeeded: boolean
}