synapse-cdm 1.0.0__tar.gz

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.
Files changed (703) hide show
  1. synapse_cdm-1.0.0/LICENSE +201 -0
  2. synapse_cdm-1.0.0/NOTICE +64 -0
  3. synapse_cdm-1.0.0/PKG-INFO +387 -0
  4. synapse_cdm-1.0.0/pyproject.toml +179 -0
  5. synapse_cdm-1.0.0/setup.cfg +4 -0
  6. synapse_cdm-1.0.0/synapse_cdm/FORMAT_COVERAGE.md +10361 -0
  7. synapse_cdm-1.0.0/synapse_cdm/MIGRATIONS.md +973 -0
  8. synapse_cdm-1.0.0/synapse_cdm/README.md +351 -0
  9. synapse_cdm-1.0.0/synapse_cdm/__init__.py +85 -0
  10. synapse_cdm-1.0.0/synapse_cdm/adapter.py +234 -0
  11. synapse_cdm-1.0.0/synapse_cdm/adapters/__init__.py +7 -0
  12. synapse_cdm-1.0.0/synapse_cdm/adapters/adsb.py +2292 -0
  13. synapse_cdm-1.0.0/synapse_cdm/adapters/ais.py +1466 -0
  14. synapse_cdm-1.0.0/synapse_cdm/adapters/asterix_cat021.py +2503 -0
  15. synapse_cdm-1.0.0/synapse_cdm/adapters/asterix_cat034.py +1516 -0
  16. synapse_cdm-1.0.0/synapse_cdm/adapters/asterix_cat048.py +2427 -0
  17. synapse_cdm-1.0.0/synapse_cdm/adapters/cat034_codec.py +330 -0
  18. synapse_cdm-1.0.0/synapse_cdm/adapters/cat048_codec.py +577 -0
  19. synapse_cdm-1.0.0/synapse_cdm/adapters/gmtif.py +2256 -0
  20. synapse_cdm-1.0.0/synapse_cdm/adapters/gmtif_codec.py +430 -0
  21. synapse_cdm-1.0.0/synapse_cdm/adapters/legion.py +1144 -0
  22. synapse_cdm-1.0.0/synapse_cdm/adapters/pntmap.py +252 -0
  23. synapse_cdm-1.0.0/synapse_cdm/adapters/stanag4676.py +2387 -0
  24. synapse_cdm-1.0.0/synapse_cdm/adapters/tak.py +757 -0
  25. synapse_cdm-1.0.0/synapse_cdm/enums.py +86 -0
  26. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/README.md +119 -0
  27. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_baro_gulf_of_riga.adsb +1 -0
  28. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_baro_gulf_of_riga.parsed.json +21 -0
  29. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_gillham_above_50175.adsb +1 -0
  30. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_gillham_above_50175.parsed.json +20 -0
  31. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_gnss_height_odd.adsb +1 -0
  32. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_gnss_height_odd.parsed.json +20 -0
  33. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_no_position_information.adsb +1 -0
  34. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_no_position_information.parsed.json +20 -0
  35. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_permanent_alert.adsb +1 -0
  36. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_position_permanent_alert.parsed.json +20 -0
  37. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_airspeed_and_heading.adsb +1 -0
  38. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_airspeed_and_heading.parsed.json +27 -0
  39. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_all_unavailable.adsb +1 -0
  40. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_all_unavailable.parsed.json +27 -0
  41. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_ground_speed.adsb +1 -0
  42. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/airborne_velocity_ground_speed.parsed.json +27 -0
  43. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/aircraft_status_unlawful_interference.adsb +1 -0
  44. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/aircraft_status_unlawful_interference.parsed.json +17 -0
  45. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/entity_fused_elsewhere.json +28 -0
  46. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/entity_identification_no_position.json +27 -0
  47. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/golden/entity_fused_elsewhere.adsb +2 -0
  48. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/golden/entity_identification_no_position.adsb +1 -0
  49. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/golden/track_air_patrol_three_samples.adsb +3 -0
  50. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/egress/track_air_patrol_three_samples.json +39 -0
  51. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_baro_gulf_of_riga.cdm.json +98 -0
  52. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_baro_gulf_of_riga.parsed.cdm.json +98 -0
  53. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_gillham_above_50175.cdm.json +99 -0
  54. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_gillham_above_50175.parsed.cdm.json +99 -0
  55. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_gnss_height_odd.cdm.json +97 -0
  56. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_gnss_height_odd.parsed.cdm.json +97 -0
  57. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_no_position_information.cdm.json +99 -0
  58. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_no_position_information.parsed.cdm.json +99 -0
  59. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_permanent_alert.cdm.json +97 -0
  60. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_position_permanent_alert.parsed.cdm.json +97 -0
  61. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_airspeed_and_heading.cdm.json +105 -0
  62. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_airspeed_and_heading.parsed.cdm.json +105 -0
  63. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_all_unavailable.cdm.json +102 -0
  64. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_all_unavailable.parsed.cdm.json +102 -0
  65. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_ground_speed.cdm.json +102 -0
  66. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/airborne_velocity_ground_speed.parsed.cdm.json +102 -0
  67. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/aircraft_status_unlawful_interference.cdm.json +91 -0
  68. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/aircraft_status_unlawful_interference.parsed.cdm.json +91 -0
  69. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/identification_light_aircraft.cdm.json +88 -0
  70. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/identification_light_aircraft.parsed.cdm.json +88 -0
  71. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/identification_point_obstacle.cdm.json +88 -0
  72. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/identification_point_obstacle.parsed.cdm.json +88 -0
  73. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/nonicao_anonymous_address.cdm.json +98 -0
  74. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/nonicao_anonymous_address.parsed.cdm.json +98 -0
  75. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/operational_status_magnetic_heading.cdm.json +99 -0
  76. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/operational_status_magnetic_heading.parsed.cdm.json +99 -0
  77. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/surface_position_riga_taxiway.cdm.json +98 -0
  78. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/surface_position_riga_taxiway.parsed.cdm.json +98 -0
  79. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/surface_position_stopped_no_track.cdm.json +103 -0
  80. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/surface_position_stopped_no_track.parsed.cdm.json +103 -0
  81. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/tisb_fine_format_relayed_track.cdm.json +98 -0
  82. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/golden/tisb_fine_format_relayed_track.parsed.cdm.json +98 -0
  83. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/identification_light_aircraft.adsb +1 -0
  84. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/identification_light_aircraft.parsed.json +15 -0
  85. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/identification_point_obstacle.adsb +1 -0
  86. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/identification_point_obstacle.parsed.json +15 -0
  87. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/airborne_position_baro_gulf_of_riga.cdm.json +108 -0
  88. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/airborne_position_gillham_above_50175.cdm.json +109 -0
  89. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/airborne_position_gnss_height_odd.cdm.json +107 -0
  90. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/airborne_position_permanent_alert.cdm.json +107 -0
  91. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/nonicao_anonymous_address.cdm.json +108 -0
  92. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/surface_position_riga_taxiway.cdm.json +108 -0
  93. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/surface_position_stopped_no_track.cdm.json +113 -0
  94. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/local/tisb_fine_format_relayed_track.cdm.json +108 -0
  95. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/nonicao_anonymous_address.adsb +1 -0
  96. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/nonicao_anonymous_address.parsed.json +20 -0
  97. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/operational_status_magnetic_heading.adsb +1 -0
  98. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/operational_status_magnetic_heading.parsed.json +25 -0
  99. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/surface_position_riga_taxiway.adsb +1 -0
  100. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/surface_position_riga_taxiway.parsed.json +20 -0
  101. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/surface_position_stopped_no_track.adsb +1 -0
  102. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/surface_position_stopped_no_track.parsed.json +20 -0
  103. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/tisb_fine_format_relayed_track.adsb +1 -0
  104. synapse_cdm-1.0.0/synapse_cdm/fixtures/adsb/tisb_fine_format_relayed_track.parsed.json +20 -0
  105. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/README.md +83 -0
  106. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/aid_to_navigation_off_position.nmea +1 -0
  107. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/aid_to_navigation_off_position.parsed.json +36 -0
  108. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/aid_to_navigation_virtual.nmea +1 -0
  109. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/aid_to_navigation_virtual.parsed.json +37 -0
  110. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/base_station_liepaja.nmea +1 -0
  111. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/base_station_liepaja.parsed.json +32 -0
  112. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_assigned_schedule_moored.nmea +1 -0
  113. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_assigned_schedule_moored.parsed.json +32 -0
  114. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_sentinels_no_position.nmea +1 -0
  115. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_sentinels_no_position.parsed.json +32 -0
  116. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_underway_gulf_of_riga.nmea +1 -0
  117. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_a_underway_gulf_of_riga.parsed.json +36 -0
  118. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_b_extended_named.nmea +1 -0
  119. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_b_extended_named.parsed.json +39 -0
  120. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_b_own_station_ventspils.nmea +1 -0
  121. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/class_b_own_station_ventspils.parsed.json +36 -0
  122. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/entity_fused_elsewhere.json +34 -0
  123. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/entity_static_voyage_no_position.json +37 -0
  124. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/golden/entity_fused_elsewhere.ais.nmea +1 -0
  125. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/golden/entity_static_voyage_no_position.ais.nmea +2 -0
  126. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/golden/track_patrol_three_samples.ais.nmea +3 -0
  127. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/egress/track_patrol_three_samples.json +30 -0
  128. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/equator_zero_meridian.nmea +1 -0
  129. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/equator_zero_meridian.parsed.json +32 -0
  130. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/aid_to_navigation_off_position.cdm.json +117 -0
  131. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/aid_to_navigation_off_position.parsed.cdm.json +117 -0
  132. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/aid_to_navigation_virtual.cdm.json +117 -0
  133. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/aid_to_navigation_virtual.parsed.cdm.json +117 -0
  134. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/base_station_liepaja.cdm.json +112 -0
  135. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/base_station_liepaja.parsed.cdm.json +112 -0
  136. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_assigned_schedule_moored.cdm.json +112 -0
  137. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_assigned_schedule_moored.parsed.cdm.json +112 -0
  138. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_sentinels_no_position.cdm.json +109 -0
  139. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_sentinels_no_position.parsed.cdm.json +109 -0
  140. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_underway_gulf_of_riga.cdm.json +115 -0
  141. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_a_underway_gulf_of_riga.parsed.cdm.json +115 -0
  142. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_b_extended_named.cdm.json +121 -0
  143. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_b_extended_named.parsed.cdm.json +121 -0
  144. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_b_own_station_ventspils.cdm.json +115 -0
  145. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/class_b_own_station_ventspils.parsed.cdm.json +115 -0
  146. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/equator_zero_meridian.cdm.json +112 -0
  147. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/equator_zero_meridian.parsed.cdm.json +112 -0
  148. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/sart_active_distress.cdm.json +112 -0
  149. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/sart_active_distress.parsed.cdm.json +112 -0
  150. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/static_voyage_two_fragments.cdm.json +137 -0
  151. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/golden/static_voyage_two_fragments.parsed.cdm.json +137 -0
  152. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/sart_active_distress.nmea +1 -0
  153. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/sart_active_distress.parsed.json +32 -0
  154. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/static_voyage_two_fragments.nmea +2 -0
  155. synapse_cdm-1.0.0/synapse_cdm/fixtures/ais/static_voyage_two_fragments.parsed.json +51 -0
  156. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/README.md +95 -0
  157. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/airborne_position_coarse_and_high_resolution.cat021 +0 -0
  158. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/airborne_position_coarse_and_high_resolution.parsed.json +58 -0
  159. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/airborne_position_time_of_applicability.cat021 +0 -0
  160. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/airborne_position_time_of_applicability.parsed.json +88 -0
  161. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/duplicate_address.cat021 +0 -0
  162. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/duplicate_address.parsed.json +53 -0
  163. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/emergency_unlawful_interference.cat021 +0 -0
  164. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/emergency_unlawful_interference.parsed.json +79 -0
  165. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/airborne_position_coarse_and_high_resolution.cdm.json +151 -0
  166. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/airborne_position_coarse_and_high_resolution.parsed.cdm.json +151 -0
  167. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/airborne_position_time_of_applicability.cdm.json +196 -0
  168. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/airborne_position_time_of_applicability.parsed.cdm.json +196 -0
  169. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/duplicate_address.cdm.json +147 -0
  170. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/duplicate_address.parsed.cdm.json +147 -0
  171. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/emergency_unlawful_interference.cdm.json +184 -0
  172. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/emergency_unlawful_interference.parsed.cdm.json +184 -0
  173. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/icao24_shared_with_adsb.cdm.json +163 -0
  174. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/icao24_shared_with_adsb.parsed.cdm.json +163 -0
  175. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/midnight_rollover_after.cdm.json +146 -0
  176. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/midnight_rollover_after.parsed.cdm.json +146 -0
  177. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/midnight_rollover_before.cdm.json +146 -0
  178. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/midnight_rollover_before.parsed.cdm.json +146 -0
  179. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/mode_five_authenticated.cdm.json +185 -0
  180. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/mode_five_authenticated.parsed.cdm.json +185 -0
  181. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/obstacle_line.cdm.json +158 -0
  182. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/obstacle_line.parsed.cdm.json +158 -0
  183. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/position_time_of_message_reception_high_precision.cdm.json +151 -0
  184. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/position_time_of_message_reception_high_precision.parsed.cdm.json +151 -0
  185. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/quality_indicators_without_mops_version.cdm.json +145 -0
  186. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/quality_indicators_without_mops_version.parsed.cdm.json +145 -0
  187. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/range_check_failed_still_translated.cdm.json +161 -0
  188. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/range_check_failed_still_translated.parsed.cdm.json +161 -0
  189. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/reserved_full_second_indication.cdm.json +157 -0
  190. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/reserved_full_second_indication.parsed.cdm.json +157 -0
  191. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/spare_bits_nonzero.cdm.json +174 -0
  192. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/spare_bits_nonzero.parsed.cdm.json +174 -0
  193. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/special_purpose_field_opaque.cdm.json +151 -0
  194. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/special_purpose_field_opaque.parsed.cdm.json +151 -0
  195. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/surface_stopped_track_invalid.cdm.json +181 -0
  196. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/surface_stopped_track_invalid.parsed.cdm.json +181 -0
  197. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/surface_vehicle_with_ref_ground_vector.cdm.json +190 -0
  198. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/surface_vehicle_with_ref_ground_vector.parsed.cdm.json +190 -0
  199. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/trajectory_intent_two_points.cdm.json +181 -0
  200. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/trajectory_intent_two_points.parsed.cdm.json +181 -0
  201. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/two_records_one_block.cdm.json +314 -0
  202. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/two_records_one_block.parsed.cdm.json +314 -0
  203. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/version_three_emergency_in_ref.cdm.json +203 -0
  204. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/golden/version_three_emergency_in_ref.parsed.cdm.json +203 -0
  205. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/icao24_shared_with_adsb.cat021 +0 -0
  206. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/icao24_shared_with_adsb.parsed.json +65 -0
  207. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/midnight_rollover_after.cat021 +0 -0
  208. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/midnight_rollover_after.parsed.json +53 -0
  209. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/midnight_rollover_before.cat021 +0 -0
  210. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/midnight_rollover_before.parsed.json +53 -0
  211. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/mode_five_authenticated.cat021 +0 -0
  212. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/mode_five_authenticated.parsed.json +87 -0
  213. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/obstacle_line.cat021 +0 -0
  214. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/obstacle_line.parsed.json +61 -0
  215. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/position_time_of_message_reception_high_precision.cat021 +0 -0
  216. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/position_time_of_message_reception_high_precision.parsed.json +58 -0
  217. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/quality_indicators_without_mops_version.cat021 +0 -0
  218. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/quality_indicators_without_mops_version.parsed.json +54 -0
  219. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/range_check_failed_still_translated.cat021 +0 -0
  220. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/range_check_failed_still_translated.parsed.json +65 -0
  221. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/refusals/fspec_names_a_not_used_frn.cat021 +0 -0
  222. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/refusals/length_disagrees_with_buffer.cat021 +0 -0
  223. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/refusals/missing_mandatory_target_address.cat021 +0 -0
  224. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/refusals/time_beyond_one_day.cat021 +0 -0
  225. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/refusals/wrong_category.cat021 +0 -0
  226. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/reserved_full_second_indication.cat021 +0 -0
  227. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/reserved_full_second_indication.parsed.json +58 -0
  228. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/spare_bits_nonzero.cat021 +0 -0
  229. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/spare_bits_nonzero.parsed.json +78 -0
  230. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/spec/build_fixtures.py +691 -0
  231. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/spec/sac_pin.json +1331 -0
  232. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/special_purpose_field_opaque.cat021 +0 -0
  233. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/special_purpose_field_opaque.parsed.json +58 -0
  234. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/surface_stopped_track_invalid.cat021 +0 -0
  235. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/surface_stopped_track_invalid.parsed.json +77 -0
  236. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/surface_vehicle_with_ref_ground_vector.cat021 +0 -0
  237. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/surface_vehicle_with_ref_ground_vector.parsed.json +85 -0
  238. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/trajectory_intent_two_points.cat021 +0 -0
  239. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/trajectory_intent_two_points.parsed.json +88 -0
  240. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/two_records_one_block.cat021 +0 -0
  241. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/two_records_one_block.parsed.json +113 -0
  242. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/version_three_emergency_in_ref.cat021 +0 -0
  243. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat021/version_three_emergency_in_ref.parsed.json +95 -0
  244. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/README.md +199 -0
  245. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/geographical_filter_polar_window.cat034 +0 -0
  246. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/geographical_filter_polar_window.parsed.json +42 -0
  247. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/geographical_filter_polar_window.cdm.json +172 -0
  248. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/geographical_filter_polar_window.parsed.cdm.json +172 -0
  249. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/jamming_strobe_is_not_gnss.cdm.json +158 -0
  250. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/jamming_strobe_is_not_gnss.parsed.cdm.json +158 -0
  251. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/message_counts_twenty_one_types.cdm.json +373 -0
  252. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/message_counts_twenty_one_types.parsed.cdm.json +373 -0
  253. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/message_type_008.cdm.json +132 -0
  254. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/message_type_008.parsed.cdm.json +132 -0
  255. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/midnight_rollover_nearest.cdm.json +278 -0
  256. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/midnight_rollover_nearest.parsed.cdm.json +278 -0
  257. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/mode_s_jamming_strobe.cdm.json +158 -0
  258. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/mode_s_jamming_strobe.parsed.cdm.json +158 -0
  259. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/non_minimal_fspec.cdm.json +140 -0
  260. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/non_minimal_fspec.parsed.cdm.json +140 -0
  261. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/north_marker_minimal.cdm.json +140 -0
  262. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/north_marker_minimal.parsed.cdm.json +140 -0
  263. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/processing_mode_reduction_steps.cdm.json +216 -0
  264. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/processing_mode_reduction_steps.parsed.cdm.json +216 -0
  265. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/re_and_sp_carried.cdm.json +160 -0
  266. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/re_and_sp_carried.parsed.cdm.json +160 -0
  267. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/sector_crossing_with_rotation.cdm.json +163 -0
  268. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/sector_crossing_with_rotation.parsed.cdm.json +163 -0
  269. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/solar_storm_message.cdm.json +158 -0
  270. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/solar_storm_message.parsed.cdm.json +158 -0
  271. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/spare_bits_nonzero.cdm.json +321 -0
  272. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/spare_bits_nonzero.parsed.cdm.json +321 -0
  273. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/station_position_three_dimensional.cdm.json +163 -0
  274. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/station_position_three_dimensional.parsed.cdm.json +163 -0
  275. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/system_status_all_four_subfields.cdm.json +245 -0
  276. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/system_status_all_four_subfields.parsed.cdm.json +245 -0
  277. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/time_of_day_absent_where_optional.cdm.json +155 -0
  278. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/time_of_day_absent_where_optional.parsed.cdm.json +155 -0
  279. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/two_records_one_block.cdm.json +288 -0
  280. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/golden/two_records_one_block.parsed.cdm.json +288 -0
  281. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/jamming_strobe_is_not_gnss.cat034 +0 -0
  282. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/jamming_strobe_is_not_gnss.parsed.json +38 -0
  283. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/message_counts_twenty_one_types.cat034 +0 -0
  284. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/message_counts_twenty_one_types.parsed.json +125 -0
  285. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/message_type_008.cat034 +0 -0
  286. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/message_type_008.parsed.json +31 -0
  287. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/midnight_rollover_nearest.cat034 +0 -0
  288. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/midnight_rollover_nearest.parsed.json +53 -0
  289. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/mode_s_jamming_strobe.cat034 +0 -0
  290. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/mode_s_jamming_strobe.parsed.json +38 -0
  291. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/non_minimal_fspec.cat034 +0 -0
  292. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/non_minimal_fspec.parsed.json +31 -0
  293. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/north_marker_minimal.cat034 +0 -0
  294. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/north_marker_minimal.parsed.json +31 -0
  295. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/processing_mode_reduction_steps.cat034 +0 -0
  296. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/processing_mode_reduction_steps.parsed.json +65 -0
  297. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/re_and_sp_carried.cat034 +0 -0
  298. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/re_and_sp_carried.parsed.json +41 -0
  299. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/refusals/length_disagrees_with_buffer.cat034 +0 -0
  300. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/refusals/missing_mandatory_data_source.cat034 +0 -0
  301. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/refusals/wrong_category.cat034 +0 -0
  302. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/sector_crossing_with_rotation.cat034 +0 -0
  303. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/sector_crossing_with_rotation.parsed.json +39 -0
  304. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/solar_storm_message.cat034 +0 -0
  305. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/solar_storm_message.parsed.json +38 -0
  306. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/spare_bits_nonzero.cat034 +0 -0
  307. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/spare_bits_nonzero.parsed.json +113 -0
  308. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/spec/build_fixtures.py +421 -0
  309. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/spec/cat034_pin.json +414 -0
  310. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/station_position_three_dimensional.cat034 +0 -0
  311. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/station_position_three_dimensional.parsed.json +37 -0
  312. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/system_status_all_four_subfields.cat034 +0 -0
  313. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/system_status_all_four_subfields.parsed.json +79 -0
  314. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/time_of_day_absent_where_optional.cat034 +0 -0
  315. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/time_of_day_absent_where_optional.parsed.json +34 -0
  316. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/two_records_one_block.cat034 +0 -0
  317. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat034/two_records_one_block.parsed.json +57 -0
  318. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/README.md +154 -0
  319. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/acas_ra_active_undecoded.cat048 +0 -0
  320. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/acas_ra_active_undecoded.parsed.json +109 -0
  321. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/bds_registers_comm_b_broadcast.cat048 +0 -0
  322. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/bds_registers_comm_b_broadcast.parsed.json +75 -0
  323. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/derived_position_inverts_to_the_polar_values.cat048 +0 -0
  324. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/derived_position_inverts_to_the_polar_values.parsed.json +87 -0
  325. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/end_of_track_full_items.cat048 +0 -0
  326. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/end_of_track_full_items.parsed.json +96 -0
  327. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/end_of_track_items_omitted.cat048 +0 -0
  328. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/end_of_track_items_omitted.parsed.json +60 -0
  329. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/field_monitor_report.cat048 +0 -0
  330. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/field_monitor_report.parsed.json +67 -0
  331. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/flight_level_negative.cat048 +0 -0
  332. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/flight_level_negative.parsed.json +64 -0
  333. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/fspec_longer_than_necessary.cat048 +0 -0
  334. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/fspec_longer_than_necessary.parsed.json +38 -0
  335. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/ghost_target_still_translated.cat048 +0 -0
  336. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/ghost_target_still_translated.parsed.json +79 -0
  337. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/acas_ra_active_undecoded.cdm.json +324 -0
  338. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/acas_ra_active_undecoded.parsed.cdm.json +324 -0
  339. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/bds_registers_comm_b_broadcast.cdm.json +235 -0
  340. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/bds_registers_comm_b_broadcast.parsed.cdm.json +235 -0
  341. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/derived_position_inverts_to_the_polar_values.cdm.json +255 -0
  342. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/derived_position_inverts_to_the_polar_values.parsed.cdm.json +255 -0
  343. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/end_of_track_full_items.cdm.json +278 -0
  344. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/end_of_track_full_items.parsed.cdm.json +278 -0
  345. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/end_of_track_items_omitted.cdm.json +210 -0
  346. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/end_of_track_items_omitted.parsed.cdm.json +210 -0
  347. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/field_monitor_report.cdm.json +213 -0
  348. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/field_monitor_report.parsed.cdm.json +213 -0
  349. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/flight_level_negative.cdm.json +202 -0
  350. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/flight_level_negative.parsed.cdm.json +202 -0
  351. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/fspec_longer_than_necessary.cdm.json +150 -0
  352. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/fspec_longer_than_necessary.parsed.cdm.json +150 -0
  353. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/ghost_target_still_translated.cdm.json +242 -0
  354. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/ghost_target_still_translated.parsed.cdm.json +242 -0
  355. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/helicopter_classification_not_read_as_a_type.cdm.json +209 -0
  356. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/helicopter_classification_not_read_as_a_type.parsed.cdm.json +209 -0
  357. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/ic_conflict_codes.cdm.json +211 -0
  358. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/ic_conflict_codes.parsed.cdm.json +211 -0
  359. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/icao24_shared_with_cat021.cdm.json +220 -0
  360. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/icao24_shared_with_cat021.parsed.cdm.json +220 -0
  361. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_no_height_item.cdm.json +244 -0
  362. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_no_height_item.parsed.cdm.json +244 -0
  363. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_pressure_height_only.cdm.json +225 -0
  364. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_pressure_height_only.parsed.cdm.json +225 -0
  365. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_range_at_maximum.cdm.json +267 -0
  366. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/injected_site_range_at_maximum.parsed.cdm.json +267 -0
  367. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/midnight_rollover_after.cdm.json +186 -0
  368. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/midnight_rollover_after.parsed.cdm.json +186 -0
  369. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/midnight_rollover_before.cdm.json +186 -0
  370. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/midnight_rollover_before.parsed.cdm.json +186 -0
  371. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/military_emergency.cdm.json +211 -0
  372. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/military_emergency.parsed.cdm.json +211 -0
  373. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_1_and_mode_2_with_confidence.cdm.json +358 -0
  374. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_1_and_mode_2_with_confidence.parsed.cdm.json +358 -0
  375. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_4_result_in_ref.cdm.json +227 -0
  376. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_4_result_in_ref.parsed.cdm.json +227 -0
  377. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_s_alert_is_not_an_emergency.cdm.json +208 -0
  378. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_s_alert_is_not_an_emergency.parsed.cdm.json +208 -0
  379. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_s_roll_call_track.cdm.json +317 -0
  380. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/mode_s_roll_call_track.parsed.cdm.json +317 -0
  381. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/no_detection_track_only.cdm.json +251 -0
  382. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/no_detection_track_only.parsed.cdm.json +251 -0
  383. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/no_time_item_at_all.cdm.json +199 -0
  384. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/no_time_item_at_all.parsed.cdm.json +199 -0
  385. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/plot_and_track_one_block.cdm.json +428 -0
  386. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/plot_and_track_one_block.parsed.cdm.json +428 -0
  387. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/plot_characteristics_all_subfields.cdm.json +321 -0
  388. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/plot_characteristics_all_subfields.parsed.cdm.json +321 -0
  389. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_only_plot_no_identity.cdm.json +173 -0
  390. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_only_plot_no_identity.parsed.cdm.json +173 -0
  391. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_plot_with_track_number_only.cdm.json +223 -0
  392. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_plot_with_track_number_only.parsed.cdm.json +223 -0
  393. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_track_two_scans_same_track_number.cdm.json +444 -0
  394. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/psr_track_two_scans_same_track_number.parsed.cdm.json +444 -0
  395. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_ambiguity_rad_invalid.cdm.json +241 -0
  396. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_ambiguity_rad_invalid.parsed.cdm.json +241 -0
  397. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_doppler_both_subfields.cdm.json +233 -0
  398. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_doppler_both_subfields.parsed.cdm.json +233 -0
  399. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_doppler_calculated.cdm.json +213 -0
  400. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/radial_doppler_calculated.parsed.cdm.json +213 -0
  401. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/reserved_expansion_field_carried.cdm.json +210 -0
  402. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/reserved_expansion_field_carried.parsed.cdm.json +210 -0
  403. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/spare_bits_nonzero.cdm.json +252 -0
  404. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/spare_bits_nonzero.parsed.cdm.json +252 -0
  405. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/special_purpose_field_opaque.cdm.json +196 -0
  406. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/special_purpose_field_opaque.parsed.cdm.json +196 -0
  407. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/three_altitudes_disagreeing.cdm.json +321 -0
  408. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/three_altitudes_disagreeing.parsed.cdm.json +321 -0
  409. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/time_of_day_exactly_86400.cdm.json +187 -0
  410. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/time_of_day_exactly_86400.parsed.cdm.json +187 -0
  411. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/track_quality_vector.cdm.json +273 -0
  412. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/track_quality_vector.parsed.cdm.json +273 -0
  413. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/two_stations_one_block.cdm.json +416 -0
  414. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/two_stations_one_block.parsed.cdm.json +416 -0
  415. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/warning_error_code_37.cdm.json +222 -0
  416. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/warning_error_code_37.parsed.cdm.json +222 -0
  417. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/warning_error_code_series.cdm.json +248 -0
  418. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/golden/warning_error_code_series.parsed.cdm.json +248 -0
  419. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/helicopter_classification_not_read_as_a_type.cat048 +0 -0
  420. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/helicopter_classification_not_read_as_a_type.parsed.json +71 -0
  421. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/ic_conflict_codes.cat048 +0 -0
  422. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/ic_conflict_codes.parsed.json +70 -0
  423. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/icao24_shared_with_cat021.cat048 +0 -0
  424. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/icao24_shared_with_cat021.parsed.json +70 -0
  425. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_no_height_item.cat048 +0 -0
  426. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_no_height_item.parsed.json +81 -0
  427. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_pressure_height_only.cat048 +0 -0
  428. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_pressure_height_only.parsed.json +71 -0
  429. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_range_at_maximum.cat048 +0 -0
  430. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/injected_site_range_at_maximum.parsed.json +85 -0
  431. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/midnight_rollover_after.cat048 +0 -0
  432. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/midnight_rollover_after.parsed.json +57 -0
  433. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/midnight_rollover_before.cat048 +0 -0
  434. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/midnight_rollover_before.parsed.json +57 -0
  435. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/military_emergency.cat048 +0 -0
  436. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/military_emergency.parsed.json +67 -0
  437. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_1_and_mode_2_with_confidence.cat048 +0 -0
  438. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_1_and_mode_2_with_confidence.parsed.json +143 -0
  439. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_4_result_in_ref.cat048 +0 -0
  440. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_4_result_in_ref.parsed.json +72 -0
  441. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_s_alert_is_not_an_emergency.cat048 +0 -0
  442. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_s_alert_is_not_an_emergency.parsed.json +61 -0
  443. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_s_roll_call_track.cat048 +0 -0
  444. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/mode_s_roll_call_track.parsed.json +114 -0
  445. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/no_detection_track_only.cat048 +0 -0
  446. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/no_detection_track_only.parsed.json +80 -0
  447. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/no_time_item_at_all.cat048 +0 -0
  448. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/no_time_item_at_all.parsed.json +59 -0
  449. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/plot_and_track_one_block.cat048 +0 -0
  450. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/plot_and_track_one_block.parsed.json +122 -0
  451. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/plot_characteristics_all_subfields.cat048 +0 -0
  452. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/plot_characteristics_all_subfields.parsed.json +121 -0
  453. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_only_plot_no_identity.cat048 +0 -0
  454. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_only_plot_no_identity.parsed.json +45 -0
  455. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_plot_with_track_number_only.cat048 +0 -0
  456. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_plot_with_track_number_only.parsed.json +67 -0
  457. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_track_two_scans_same_track_number.cat048 +0 -0
  458. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/psr_track_two_scans_same_track_number.parsed.json +125 -0
  459. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_ambiguity_rad_invalid.cat048 +0 -0
  460. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_ambiguity_rad_invalid.parsed.json +79 -0
  461. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_doppler_both_subfields.cat048 +0 -0
  462. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_doppler_both_subfields.parsed.json +79 -0
  463. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_doppler_calculated.cat048 +0 -0
  464. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/radial_doppler_calculated.parsed.json +70 -0
  465. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/descriptor_sixth_extension.cat048 +0 -0
  466. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/length_disagrees_with_buffer.cat048 +0 -0
  467. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/missing_mandatory_data_source.cat048 +0 -0
  468. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/mode_s_target_missing_address.cat048 +0 -0
  469. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/plot_characteristics_second_primary_octet.cat048 +0 -0
  470. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/radial_doppler_spare_presence_bit.cat048 +0 -0
  471. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/records_do_not_tile_len.cat048 +0 -0
  472. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/time_of_day_one_lsb_past_86400.cat048 +0 -0
  473. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/track_status_second_extent.cat048 +0 -0
  474. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/trailing_fspec_fx_set.cat048 +0 -0
  475. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/refusals/wrong_category.cat048 +0 -0
  476. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/reserved_expansion_field_carried.cat048 +0 -0
  477. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/reserved_expansion_field_carried.parsed.json +67 -0
  478. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/spare_bits_nonzero.cat048 +0 -0
  479. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/spare_bits_nonzero.parsed.json +88 -0
  480. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/spec/build_fixtures.py +694 -0
  481. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/spec/cat048_pin.json +1478 -0
  482. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/special_purpose_field_opaque.cat048 +0 -0
  483. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/special_purpose_field_opaque.parsed.json +62 -0
  484. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/three_altitudes_disagreeing.cat048 +0 -0
  485. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/three_altitudes_disagreeing.parsed.json +112 -0
  486. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/time_of_day_exactly_86400.cat048 +0 -0
  487. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/time_of_day_exactly_86400.parsed.json +57 -0
  488. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/track_quality_vector.cat048 +0 -0
  489. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/track_quality_vector.parsed.json +97 -0
  490. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/two_stations_one_block.cat048 +0 -0
  491. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/two_stations_one_block.parsed.json +119 -0
  492. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/warning_error_code_37.cat048 +0 -0
  493. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/warning_error_code_37.parsed.json +71 -0
  494. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/warning_error_code_series.cat048 +0 -0
  495. synapse_cdm-1.0.0/synapse_cdm/fixtures/cat048/warning_error_code_series.parsed.json +86 -0
  496. synapse_cdm-1.0.0/synapse_cdm/fixtures/fft/README.md +138 -0
  497. synapse_cdm-1.0.0/synapse_cdm/fixtures/fft/spec/fft_pin.json +191 -0
  498. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/README.md +102 -0
  499. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/delta_targets_across_the_prime_meridian.gmti +0 -0
  500. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/delta_targets_across_the_prime_meridian.parsed.json +69 -0
  501. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/dwell_with_no_targets_and_target_bits_set.gmti +0 -0
  502. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/dwell_with_no_targets_and_target_bits_set.parsed.json +62 -0
  503. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/free_text_and_test_status.gmti +0 -0
  504. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/free_text_and_test_status.parsed.json +53 -0
  505. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/full_mask_every_optional_group.gmti +0 -0
  506. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/full_mask_every_optional_group.parsed.json +135 -0
  507. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/delta_targets_across_the_prime_meridian.cdm.json +567 -0
  508. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/delta_targets_across_the_prime_meridian.parsed.cdm.json +567 -0
  509. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/dwell_with_no_targets_and_target_bits_set.cdm.json +225 -0
  510. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/dwell_with_no_targets_and_target_bits_set.parsed.cdm.json +225 -0
  511. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/free_text_and_test_status.cdm.json +209 -0
  512. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/free_text_and_test_status.parsed.cdm.json +209 -0
  513. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/full_mask_every_optional_group.cdm.json +598 -0
  514. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/full_mask_every_optional_group.parsed.cdm.json +598 -0
  515. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/hrr_signature_parked_both_time_branches.cdm.json +478 -0
  516. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/hrr_signature_parked_both_time_branches.parsed.cdm.json +478 -0
  517. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/mission_dwell_hi_res_targets.cdm.json +663 -0
  518. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/mission_dwell_hi_res_targets.parsed.cdm.json +663 -0
  519. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/multi_day_dwell_time.cdm.json +296 -0
  520. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/multi_day_dwell_time.parsed.cdm.json +296 -0
  521. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/platform_location_mixed_time_basis.cdm.json +372 -0
  522. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/platform_location_mixed_time_basis.parsed.cdm.json +372 -0
  523. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/processing_history_chain.cdm.json +204 -0
  524. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/processing_history_chain.parsed.cdm.json +204 -0
  525. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/repeated_mission_segment.cdm.json +216 -0
  526. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/repeated_mission_segment.parsed.cdm.json +216 -0
  527. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/reserved_and_extension_segments_recorded.cdm.json +329 -0
  528. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/reserved_and_extension_segments_recorded.parsed.cdm.json +329 -0
  529. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/simulated_classifications_never_flip_synthetic.cdm.json +688 -0
  530. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/simulated_classifications_never_flip_synthetic.parsed.cdm.json +688 -0
  531. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/sparse_mask_minimum_dwell.cdm.json +296 -0
  532. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/sparse_mask_minimum_dwell.parsed.cdm.json +296 -0
  533. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/synthesized_data_parks_without_refusal.cdm.json +301 -0
  534. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/synthesized_data_parks_without_refusal.parsed.cdm.json +301 -0
  535. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/tagging_device_beside_simulated_targets.cdm.json +578 -0
  536. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/tagging_device_beside_simulated_targets.parsed.cdm.json +578 -0
  537. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/tasking_segments_parked_with_job_id_zero.cdm.json +210 -0
  538. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/golden/tasking_segments_parked_with_job_id_zero.parsed.cdm.json +210 -0
  539. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/hrr_signature_parked_both_time_branches.gmti +0 -0
  540. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/hrr_signature_parked_both_time_branches.parsed.json +113 -0
  541. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/mission_dwell_hi_res_targets.gmti +0 -0
  542. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/mission_dwell_hi_res_targets.parsed.json +120 -0
  543. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/multi_day_dwell_time.gmti +0 -0
  544. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/multi_day_dwell_time.parsed.json +56 -0
  545. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/platform_location_mixed_time_basis.gmti +0 -0
  546. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/platform_location_mixed_time_basis.parsed.json +85 -0
  547. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/processing_history_chain.gmti +0 -0
  548. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/processing_history_chain.parsed.json +60 -0
  549. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/repeated_mission_segment.gmti +0 -0
  550. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/repeated_mission_segment.parsed.json +72 -0
  551. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/reserved_and_extension_segments_recorded.gmti +0 -0
  552. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/reserved_and_extension_segments_recorded.parsed.json +70 -0
  553. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/simulated_classifications_never_flip_synthetic.gmti +0 -0
  554. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/simulated_classifications_never_flip_synthetic.parsed.json +72 -0
  555. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/sparse_mask_minimum_dwell.gmti +0 -0
  556. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/sparse_mask_minimum_dwell.parsed.json +56 -0
  557. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/spec/build_fixtures.py +508 -0
  558. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/synthesized_data_parks_without_refusal.gmti +0 -0
  559. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/synthesized_data_parks_without_refusal.parsed.json +57 -0
  560. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/tagging_device_beside_simulated_targets.gmti +0 -0
  561. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/tagging_device_beside_simulated_targets.parsed.json +73 -0
  562. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/tasking_segments_parked_with_job_id_zero.gmti +0 -0
  563. synapse_cdm-1.0.0/synapse_cdm/fixtures/gmti/tasking_segments_parked_with_job_id_zero.parsed.json +130 -0
  564. synapse_cdm-1.0.0/synapse_cdm/fixtures/klv/README.md +61 -0
  565. synapse_cdm-1.0.0/synapse_cdm/fixtures/klv/spec/klv_pin.json +303 -0
  566. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/README.md +112 -0
  567. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/entity_exercise_affiliation_and_nulls.json +18 -0
  568. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/entity_location_ecef_gulf_of_riga.json +32 -0
  569. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/entity_location_lla_ventspils.json +27 -0
  570. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/entity_sensor_mast_riga.json +36 -0
  571. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/event_gunshot_detection.json +15 -0
  572. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/entity_exercise_affiliation_and_nulls.cdm.json +64 -0
  573. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/entity_location_ecef_gulf_of_riga.cdm.json +168 -0
  574. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/entity_location_lla_ventspils.cdm.json +132 -0
  575. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/entity_sensor_mast_riga.cdm.json +163 -0
  576. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/event_gunshot_detection.cdm.json +54 -0
  577. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/golden/locations_list_patrol_three.cdm.json +177 -0
  578. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/locations_list_patrol_three.json +35 -0
  579. synapse_cdm-1.0.0/synapse_cdm/fixtures/legion/spec/openapi_pin.json +1098 -0
  580. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/README.md +75 -0
  581. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/amplification_zombie_beside_friend.nits.xml +98 -0
  582. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/amplification_zombie_beside_friend.parsed.json +130 -0
  583. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/cooperative_modality_is_a_gnss_fix.nits.xml +83 -0
  584. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/cooperative_modality_is_a_gnss_fix.parsed.json +118 -0
  585. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/datastream_unresolved_references.nits.xml +42 -0
  586. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/datastream_unresolved_references.parsed.json +62 -0
  587. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/detection_evidence_tree.nits.xml +194 -0
  588. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/detection_evidence_tree.parsed.json +310 -0
  589. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/ecef_track_with_velocity.nits.xml +111 -0
  590. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/ecef_track_with_velocity.parsed.json +169 -0
  591. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/exercise_faker_is_friendly.nits.xml +130 -0
  592. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/exercise_faker_is_friendly.parsed.json +171 -0
  593. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/fractional_increment_parks_raw_integers.nits.xml +101 -0
  594. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/fractional_increment_parks_raw_integers.parsed.json +138 -0
  595. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/amplification_zombie_beside_friend.nits.cdm.json +268 -0
  596. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/amplification_zombie_beside_friend.parsed.cdm.json +268 -0
  597. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/cooperative_modality_is_a_gnss_fix.nits.cdm.json +281 -0
  598. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/cooperative_modality_is_a_gnss_fix.parsed.cdm.json +281 -0
  599. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/datastream_unresolved_references.nits.cdm.json +167 -0
  600. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/datastream_unresolved_references.parsed.cdm.json +167 -0
  601. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/detection_evidence_tree.nits.cdm.json +588 -0
  602. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/detection_evidence_tree.parsed.cdm.json +588 -0
  603. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/ecef_track_with_velocity.nits.cdm.json +362 -0
  604. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/ecef_track_with_velocity.parsed.cdm.json +362 -0
  605. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/exercise_faker_is_friendly.nits.cdm.json +329 -0
  606. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/exercise_faker_is_friendly.parsed.cdm.json +329 -0
  607. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/fractional_increment_parks_raw_integers.nits.cdm.json +299 -0
  608. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/fractional_increment_parks_raw_integers.parsed.cdm.json +299 -0
  609. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/linkage_processed_track_carried.nits.cdm.json +824 -0
  610. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/linkage_processed_track_carried.parsed.cdm.json +824 -0
  611. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/local_cartesian_with_complete_cft.nits.cdm.json +403 -0
  612. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/local_cartesian_with_complete_cft.parsed.cdm.json +403 -0
  613. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/local_spherical_is_attributes_only.nits.cdm.json +329 -0
  614. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/local_spherical_is_attributes_only.parsed.cdm.json +329 -0
  615. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/motion_event_complex_polygon.nits.cdm.json +489 -0
  616. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/motion_event_complex_polygon.parsed.cdm.json +489 -0
  617. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/motion_event_tripwire.nits.cdm.json +429 -0
  618. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/motion_event_tripwire.parsed.cdm.json +429 -0
  619. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/segment_retraction_is_an_event.nits.cdm.json +439 -0
  620. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/segment_retraction_is_an_event.parsed.cdm.json +439 -0
  621. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/standalone_basic_track.nits.cdm.json +404 -0
  622. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/standalone_basic_track.parsed.cdm.json +404 -0
  623. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/three_contiguous_segments_one_track.nits.cdm.json +477 -0
  624. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/three_contiguous_segments_one_track.parsed.cdm.json +477 -0
  625. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/wgs84_velocity_with_height.nits.cdm.json +280 -0
  626. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/wgs84_velocity_with_height.parsed.cdm.json +280 -0
  627. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/wgs84_velocity_without_height.nits.cdm.json +272 -0
  628. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/golden/wgs84_velocity_without_height.parsed.cdm.json +272 -0
  629. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/linkage_processed_track_carried.nits.xml +131 -0
  630. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/linkage_processed_track_carried.parsed.json +184 -0
  631. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/local_cartesian_with_complete_cft.nits.xml +156 -0
  632. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/local_cartesian_with_complete_cft.parsed.json +249 -0
  633. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/local_spherical_is_attributes_only.nits.xml +113 -0
  634. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/local_spherical_is_attributes_only.parsed.json +170 -0
  635. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/motion_event_complex_polygon.nits.xml +111 -0
  636. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/motion_event_complex_polygon.parsed.json +167 -0
  637. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/motion_event_tripwire.nits.xml +104 -0
  638. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/motion_event_tripwire.parsed.json +143 -0
  639. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/segment_retraction_is_an_event.nits.xml +103 -0
  640. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/segment_retraction_is_an_event.parsed.json +135 -0
  641. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/spec/build_fixtures.py +451 -0
  642. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/standalone_basic_track.nits.xml +138 -0
  643. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/standalone_basic_track.parsed.json +207 -0
  644. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/three_contiguous_segments_one_track.nits.xml +146 -0
  645. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/three_contiguous_segments_one_track.parsed.json +204 -0
  646. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/wgs84_velocity_with_height.nits.xml +95 -0
  647. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/wgs84_velocity_with_height.parsed.json +132 -0
  648. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/wgs84_velocity_without_height.nits.xml +95 -0
  649. synapse_cdm-1.0.0/synapse_cdm/fixtures/nits/wgs84_velocity_without_height.parsed.json +130 -0
  650. synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/equator_emitter_l5.json +19 -0
  651. synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/golden/equator_emitter_l5.cdm.json +77 -0
  652. synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/golden/jamming_gulf_of_riga.cdm.json +110 -0
  653. synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/golden/spoofing_no_geolocation.cdm.json +74 -0
  654. synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/golden/unknown_type_vendor_fields.cdm.json +84 -0
  655. synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/jamming_gulf_of_riga.json +27 -0
  656. synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/spoofing_no_geolocation.json +17 -0
  657. synapse_cdm-1.0.0/synapse_cdm/fixtures/pntmap/unknown_type_vendor_fields.json +22 -0
  658. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/air_track_due_north.parsed.json +28 -0
  659. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/air_track_due_north.xml +16 -0
  660. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/bridge_installation.parsed.json +25 -0
  661. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/bridge_installation.xml +16 -0
  662. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/degraded_no_position.parsed.json +26 -0
  663. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/degraded_no_position.xml +15 -0
  664. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/README.md +14 -0
  665. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/annotation_point_unlabelled.json +19 -0
  666. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/coa_sketch_polygon.json +29 -0
  667. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/golden/annotation_point_unlabelled.cot.xml +8 -0
  668. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/golden/coa_sketch_polygon.cot.xml +17 -0
  669. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/golden/patrol_route_linestring.cot.xml +12 -0
  670. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/egress/patrol_route_linestring.json +28 -0
  671. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/equator_zero_meridian.parsed.json +24 -0
  672. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/equator_zero_meridian.xml +15 -0
  673. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/air_track_due_north.cdm.json +87 -0
  674. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/air_track_due_north.parsed.cdm.json +87 -0
  675. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/bridge_installation.cdm.json +86 -0
  676. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/bridge_installation.parsed.cdm.json +86 -0
  677. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/degraded_no_position.cdm.json +82 -0
  678. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/degraded_no_position.parsed.cdm.json +82 -0
  679. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/equator_zero_meridian.cdm.json +82 -0
  680. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/equator_zero_meridian.parsed.cdm.json +82 -0
  681. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/narva_patrol.cdm.json +102 -0
  682. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/narva_patrol.parsed.cdm.json +102 -0
  683. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/suspect_vessel_sentinels.cdm.json +83 -0
  684. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/golden/suspect_vessel_sentinels.parsed.cdm.json +83 -0
  685. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/narva_patrol.parsed.json +40 -0
  686. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/narva_patrol.xml +18 -0
  687. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/suspect_vessel_sentinels.parsed.json +26 -0
  688. synapse_cdm-1.0.0/synapse_cdm/fixtures/tak/suspect_vessel_sentinels.xml +16 -0
  689. synapse_cdm-1.0.0/synapse_cdm/geo.py +107 -0
  690. synapse_cdm-1.0.0/synapse_cdm/harness.py +518 -0
  691. synapse_cdm-1.0.0/synapse_cdm/ids.py +59 -0
  692. synapse_cdm-1.0.0/synapse_cdm/lossless.py +180 -0
  693. synapse_cdm-1.0.0/synapse_cdm/models.py +439 -0
  694. synapse_cdm-1.0.0/synapse_cdm/schemas.py +146 -0
  695. synapse_cdm-1.0.0/synapse_cdm/symbology.py +115 -0
  696. synapse_cdm-1.0.0/synapse_cdm/times.py +78 -0
  697. synapse_cdm-1.0.0/synapse_cdm/version.py +103 -0
  698. synapse_cdm-1.0.0/synapse_cdm.egg-info/PKG-INFO +387 -0
  699. synapse_cdm-1.0.0/synapse_cdm.egg-info/SOURCES.txt +701 -0
  700. synapse_cdm-1.0.0/synapse_cdm.egg-info/dependency_links.txt +1 -0
  701. synapse_cdm-1.0.0/synapse_cdm.egg-info/entry_points.txt +3 -0
  702. synapse_cdm-1.0.0/synapse_cdm.egg-info/requires.txt +5 -0
  703. synapse_cdm-1.0.0/synapse_cdm.egg-info/top_level.txt +1 -0
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
@@ -0,0 +1,64 @@
1
+ synapsecommand-public
2
+ Copyright 2026 Decent Cybersecurity s.r.o.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
5
+ this work except in compliance with the License. You may obtain a copy of the
6
+ License in the LICENSE file at the root of this repository, or at:
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ --------------------------------------------------------------------------------
11
+ WHY THIS FILE AND NOT THE APPENDIX IN LICENSE
12
+
13
+ Apache-2.0's APPENDIX is a TEMPLATE FOR PER-FILE HEADERS — "attach the following
14
+ boilerplate notice, with the fields enclosed by brackets replaced with your own
15
+ identifying information". This repository has no per-file headers: NO tracked
16
+ file carries an SPDX tag, and every copyright notice in the tree is in a LICENCE
17
+ FILE — LICENSE, this file, and DCO, whose notice is the Linux Foundation's and
18
+ not ours, together with the byte-identical copies of LICENSE and this file that
19
+ sit beside packages/cdm/pyproject.toml. Those two copies exist for one reason
20
+ and have no other: setuptools resolves `license-files` against the DISTRIBUTION
21
+ root, so without them the built wheel carries the SPDX expression Apache-2.0 and
22
+ not one byte of licence text — and section 4(d), below, makes carrying this file
23
+ a condition of redistributing the Work. A wheel on an index is a redistribution.
24
+ tests/test_cdm_packaging.py makes any drift from the originals a build failure,
25
+ which is the only reason a second copy is allowed to exist at all. The licence
26
+ policy is stated at the repository level instead, in README.md and
27
+ CONTRIBUTING.md. Filling in a
28
+ template for headers that will never exist is completing the wrong form.
29
+
30
+ That sentence used to read "none of its 769 tracked files", and by the day this
31
+ repository went public the tree held 770. A count of every file in the
32
+ repository is a number that goes stale on the next commit that adds one, so it
33
+ is a stale-count generator rather than a fact — and the count was never the
34
+ claim. The claim is the ABSENCE. So the absence is what is stated, and it is
35
+ what tests/test_cdm_publication.py enforces over every tracked file, in both
36
+ halves: no SPDX tag anywhere, and no copyright notice outside a licence file —
37
+ where the set of licence files is derived from this repository's own packaging
38
+ declaration rather than typed out, so a copy added for a second distribution
39
+ cannot be forgotten in one place and remembered in the other.
40
+
41
+ NOTICE is the file Apache-2.0 actually defines for this. Section 4(d) requires a
42
+ redistributor of a Work that includes a NOTICE file to carry its attribution
43
+ notices forward, which is precisely the effect wanted — and it is achieved
44
+ without editing LICENSE, whose text stays byte-identical to the canonical
45
+ Apache-2.0 so that GitHub's licence detection and any SPDX scanner keep
46
+ recognising it. A modified LICENSE is a licence tools stop being sure about.
47
+
48
+ WHY ONE YEAR AND NOT A RANGE
49
+
50
+ 2026 is the year of the first commit (d798601, 2026-08-22) and the current year.
51
+ A range asserts a span of authorship, and there is not yet a span to assert. When
52
+ this repository sees a second calendar year of work the convention is to extend
53
+ it then — a range written in advance is a claim about the future.
54
+
55
+ WHAT THIS FILE DOES NOT COVER
56
+
57
+ The specification documents this repository PINS are not part of the Work and are
58
+ not covered by this licence. None of their bytes is in this repository or in its
59
+ history: each is recorded by SHA-256, byte count, page count, edition and source
60
+ URL, and the documents themselves remain under their publishers' own terms —
61
+ EUROCONTROL's for the ASTERIX specifications, NATO's for the STANAGs and AEDPs,
62
+ MISB's for the Motion Imagery Standards Profile. See the pin records under
63
+ packages/cdm/synapse_cdm/fixtures/*/spec/ for each document's terms as its own
64
+ front matter states them.
@@ -0,0 +1,387 @@
1
+ Metadata-Version: 2.4
2
+ Name: synapse-cdm
3
+ Version: 1.0.0
4
+ Summary: SynapseCommand Canonical Data Model: the four canonical objects, the adapter SDK, and the validation harness
5
+ Author: Decent Cybersecurity s.r.o.
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/Decent-Cybersecurity/synapsecommand-public
8
+ Project-URL: Documentation, https://docs.synapsecommand.com/
9
+ Project-URL: Source, https://github.com/Decent-Cybersecurity/synapsecommand-public
10
+ Project-URL: Issues, https://github.com/Decent-Cybersecurity/synapsecommand-public/issues
11
+ Project-URL: Changelog, https://github.com/Decent-Cybersecurity/synapsecommand-public/blob/main/packages/cdm/synapse_cdm/MIGRATIONS.md
12
+ Keywords: canonical-data-model,adapter,adapter-sdk,json-schema,geospatial,cursor-on-target,asterix,stanag-4676,stanag-4607,ais,ads-b
13
+ Classifier: Development Status :: 5 - Production/Stable
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Information Technology
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
21
+ Classifier: Programming Language :: Python :: 3 :: Only
22
+ Classifier: Operating System :: OS Independent
23
+ Classifier: Topic :: Scientific/Engineering :: Information Analysis
24
+ Classifier: Topic :: Scientific/Engineering :: GIS
25
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
26
+ Classifier: Typing :: Typed
27
+ Requires-Python: >=3.11
28
+ Description-Content-Type: text/markdown
29
+ License-File: LICENSE
30
+ License-File: NOTICE
31
+ Requires-Dist: pydantic>=2.6
32
+ Requires-Dist: jsonschema>=4.0
33
+ Provides-Extra: test
34
+ Requires-Dist: pytest>=8.0; extra == "test"
35
+ Dynamic: license-file
36
+
37
+ # `synapse_cdm` — the Canonical Data Model and adapter framework
38
+
39
+ Ten integration adapters are shipped: PNTMAP GNSS alerts, TAK / Cursor-on-Target, AIS /
40
+ NMEA 0183 AIVDM, ADS-B 1090ES extended squitter, Picogrid Legion, ASTERIX category 021,
41
+ STANAG 4676 / AEDP-12 Edition B NITS tracks, STANAG 4607 / AEDP-4607 Edition A GMTI,
42
+ ASTERIX category 048 monoradar target reports, and ASTERIX category 034 monoradar service
43
+ messages. Without a canonical model in the middle, ten
44
+ adapters means forty-five translations and ten private notions of "a contact". With one, an
45
+ adapter is a thin translator and nothing else.
46
+
47
+ **Shipped so far:**
48
+
49
+ | Adapter | Direction | Reads / writes |
50
+ |---|---|---|
51
+ | [`pntmap`](adapters/pntmap.py) 1.0.0 | ingest | PNTMAP GNSS interference alerts (JSON) → `Entity` + `Event`. The reference adapter — read it first |
52
+ | [`tak`](adapters/tak.py) 1.0.0 | bidirectional | Cursor-on-Target atoms (XML) → `Entity` + `Event`; `PlanObject` → a `u-d-f` drawing, `Entity` → an atom |
53
+ | [`ais`](adapters/ais.py) 1.0.0 | bidirectional | AIS NMEA 0183 AIVDM/AIVDO sentences (types 1/2/3, 4, 5, 18/19, 21) → `Entity` + `Event`; `Entity` or `Track` → sentences. The sentinel-heaviest format so far, and the one with no extension point |
54
+ | [`adsb`](adapters/adsb.py) 1.0.0 | bidirectional | ADS-B 1090ES extended squitter frames, Mode S DF17/DF18 (type codes 1-4, 5-8, 0 and 9-18, 19, 20-22, 28, 31) → `Entity` + `Event`; `Entity` or `Track` → DF17 frames. A binary format with a CRC gate, two altitudes that are two different measurements, and no unambiguous position in a single frame |
55
+ | [`legion`](adapters/legion.py) 1.0.0 | ingest | Picogrid Legion Platform API v3 response documents (Entity, Track, Entity/Track Location, Locations list, Event) → `Entity` + `Event` + `Track`. The first REST upstream: transport stays with the caller, one page is one Track, and the coordinates default to geocentric metres |
56
+ | [`cat021`](adapters/asterix_cat021.py) 1.0.0 | bidirectional | ASTERIX category 021 ADS-B target reports, EUROCONTROL SPEC-0149-12 Ed 2.6 with the Reserved Expansion Field Ed 1.5 (all 42 data items, RE and SP) → `Entity` + `Event` **per record**; Entities or a `Track` → one data block. A time of day that carries no date, a quality vocabulary that needs another item to say what it means, and a ground station whose verdicts it carries without re-deciding |
57
+ | [`stanag4676`](adapters/stanag4676.py) 1.0.0 | bidirectional | STANAG 4676 / AEDP-12 **Edition B Version 2** NITS tracks — the full UML model, 48 classes and 273 attributes → an `Entity` + a `Track` per `TrackData` and an `Event` per detection, motion event, linkage and retraction; back to one STANDALONE `NITSRoot`. Six coordinate systems of which three cannot yield a position, a mandatory STANAG 4774 confidentiality label that is carried and never invented, and a format that models fusion without asking a translator to perform it. **The XML element binding is provisional** — the normative XSD is distributed through national representatives and is not pinned here |
58
+ | [`gmti`](adapters/gmtif.py) 1.0.0 | bidirectional | STANAG 4607 / AEDP-4607 **Edition A Version 1** GMTI packets — the packet header, the segment header and all ten defined segments, 212 fields → one `Entity` + `Track` for the **platform** and an `Entity` + `DETECTION` `Event` **per target report**; back to one packet, **byte for byte**. The first non-text wire format: seven numeric encodings on their own tested codec layer ([`gmtif_codec`](adapters/gmtif_codec.py)), existence masks that govern every subsequent field offset, and a format whose targets are detections rather than tracks — so **no target `Track` is ever emitted**, because associating reports across dwells is what a GMTI tracker does and the standard's own guide sends the reader to the sensor vendor for the rule |
59
+ | [`cat048`](adapters/asterix_cat048.py) 1.0.0 | bidirectional | ASTERIX category 048 monoradar target reports, EUROCONTROL SPEC-0149-4 **Edition 1.32** (all 28 UAP data items, SP and RE) → `Entity` + `Event` **per record**; Entities → one data block, **byte for byte**, on its own tested codec layer ([`cat048_codec`](adapters/cat048_codec.py)). The sensor-side complement of `cat021`, and the first adapter whose ordinary case is a `DETECTION` rather than a `TRACK_UPDATE` — a radar detects where AIS, ADS-B and CAT021 receive self-reports. **Position is derived only when the caller injects a `sensor_position`**: the format states slant range and azimuth from a station whose location it never carries, and the geodesy is not in the specification at all |
60
+ | [`cat034`](adapters/asterix_cat034.py) 1.0.0 | bidirectional | ASTERIX category 034 monoradar service messages, EUROCONTROL SPEC-0149-2b **Edition 1.29** (all 14 UAP FRNs, all 12 data items, RE and SP) → `Entity` + `Event` **per record**; Entities → one data block, **byte for byte**, on its own tested codec layer ([`cat034_codec`](adapters/cat034_codec.py)). **The first adapter whose primary object is the sensor itself** — every record describes the radar station, so `entity_type` is `SENSOR`, the SAC/SIC that `cat048` parks as a sensor identifier is a `SourceId` here, and no object carries `Kinematics` because the one bearing the category states is the antenna's. Table 2's M/O/X matrix is the encoding rule for eleven of the twelve items, and it is what rules out ever deriving a `Geometry` from the Generic Polar Window: the window and the station's own position are mutually exclusive across all seven message types |
61
+
62
+ external format ──▶ Adapter.to_cdm() ──▶ Entity | Event | Track | PlanObject ──▶ platform
63
+ platform ──▶ Adapter.from_cdm() ─▶ external format (egress, e.g. TAK)
64
+
65
+ ## Quick start
66
+
67
+ **Using it.** Nothing but the package, from any directory:
68
+
69
+ ```bash
70
+ pip install synapse-cdm
71
+
72
+ python -m synapse_cdm.harness --adapter pntmap # replays the fixtures that came with it
73
+ python -m synapse_cdm.schemas --out ./schemas # writes the six JSON Schemas, anywhere
74
+ ```
75
+
76
+ `--fixtures` is optional for an adapter this package ships: omitted, the harness asks the import
77
+ system where its own fixtures are and replays those, wherever the package is installed. Pass it
78
+ to replay your own set. Both commands also install as `cdm-harness` and `cdm-schemas`.
79
+
80
+ The wheel deliberately carries no copy of the published schemas — a third copy of a generated
81
+ artefact is a third thing that can go stale — so `python -m synapse_cdm.schemas --out <dir>`
82
+ produces them on demand instead, and they are identical to the ones the repository publishes.
83
+
84
+ **Working on it.** From a clone of the repository:
85
+
86
+ ```bash
87
+ pip install -e "packages/cdm[test]" # the package, its two deps, and pytest
88
+ pytest -q # the whole suite
89
+ python -m synapse_cdm.schemas --check --out schemas # fail if the published schemas are stale
90
+ python gates/wheel_install.py # and that the WHEEL is what was tested
91
+ ```
92
+
93
+ `pytest.ini` puts `packages/cdm` on the path, so the suite judges the working tree rather than
94
+ whatever wheel happens to be in the environment. That is deliberate and it has a cost — nothing
95
+ in the suite exercises the artefact a partner receives — which is what `gates/wheel_install.py`
96
+ is for: it builds the distribution, installs it into a clean environment and runs the harness and
97
+ half the suite against **that**.
98
+
99
+ ## The four canonical objects
100
+
101
+ | Object | Means | Key fields |
102
+ |---|---|---|
103
+ | `Entity` | something that **exists** | `entity_id`, `entity_type`, `affiliation`, `position`, `kinematics`, `valid_from/to`, `confidence`, `attributes` |
104
+ | `Event` | something that **happened** | `event_id`, `event_type`, `severity`, `related_entities`, `geometry`, `payload`, `observed_at`, `received_at` |
105
+ | `Track` | an entity's **position history** | `track_id`, `entity_id`, `samples[]`, `track_quality` |
106
+ | `PlanObject` | something we **push out** | `object_id`, `object_type`, `geometry`, `style`, `label`, `expires_at` |
107
+
108
+ Every one of them also carries, from `CDMBase`:
109
+
110
+ - `schema_version` — semver, in **every** serialised object (see [MIGRATIONS.md](MIGRATIONS.md));
111
+ - `source` — `{system, adapter, adapter_version, synthetic}`: which translator produced this;
112
+ - `source_ids[]` — the external identifiers the object is known by, **at least one**;
113
+ - `object_kind` — the discriminator, so a mixed stream can be validated without guessing;
114
+ - `integrity` — the PQC signature block: **designed, deliberately not implemented**.
115
+
116
+ One source payload legitimately becomes several objects. A PNTMAP alert is an
117
+ `INTERFERENCE_SOURCE` entity *and* a `GNSS_INTERFERENCE` event, so `to_cdm()` returns a list.
118
+
119
+ ## The rules, and where each one is enforced
120
+
121
+ **1. Adapters never drop data.** A field with no canonical home goes into `Entity.attributes`
122
+ or `Event.payload`, parked under `source_extras` by `lossless.residual()`. Enforced: the
123
+ harness compares every scalar in the source payload against the CDM output and **fails** the
124
+ adapter on a value that appears nowhere. Values that legitimately change (a unit conversion, a
125
+ re-rendered timestamp) are declared in the adapter's `TRANSFORMS` with a reason, and the
126
+ harness **prints every declaration on every run** — an exemption is a visible line in the
127
+ report, not a silent skip.
128
+
129
+ **2. Adapters are pure translation.** No filtering, no enrichment, no thresholds. Each of
130
+ those is a decision, and a decision made inside a translator is invisible to the audit trail
131
+ and unattributable. The reference adapter demonstrates the rule where it is most tempting: a
132
+ GNSS jamming emitter gets `affiliation: UNKNOWN` unless the payload states an attribution.
133
+
134
+ **3. An unknown position is `null`, never `(0, 0)`.** Structural, not conventional:
135
+ `Position` requires `lat` and `lon`, so "unknown" cannot be spelled as zeros — it is spelled
136
+ by the absence of a `Position`. Note the mirror-image defect: `0.0` **is** a real coordinate,
137
+ so `if not lat` is as wrong as null-to-zero. Both directions have a fixture and a test.
138
+
139
+ **4. An unknown scalar is `None`, never `0`.** 0 kt is measured stillness, 0° is due north,
140
+ confidence 0 is certainty-that-*not*. A source's "value not available" sentinel (AIS sends
141
+ 102.3 for unknown speed) is translated, never passed through.
142
+
143
+ **5. Every object states whether it is exercise data.** `source.synthetic` is required and has
144
+ **no default** — mislabelling exercise data as live can reach an operational picture, and
145
+ mislabelling live data as exercise hides it from an operator. Neither direction is safe to
146
+ guess, so the format makes someone state it.
147
+
148
+ **6. Identity is derived, never drawn.** `entity_id` is `uuid5(namespace, system|external_id)`
149
+ (`ids.py`), so the tenth report about one emitter updates one entity instead of creating a
150
+ tenth. It also makes golden-output tests possible at all. An adapter with no stable upstream
151
+ identifier must record what it keyed on (`attributes.entity_id_basis`).
152
+
153
+ **7. Time has one serialised form.** RFC 3339 UTC, exactly three decimals, always `Z` — the
154
+ same pattern the Track contract pins, because two timestamps meaning the same instant must
155
+ compare equal as *strings* in golden diffs and chain hashes. `received_at` comes from an
156
+ injected clock; adapter code never calls `datetime.now()`.
157
+
158
+ ## Writing the next adapter
159
+
160
+ Read `adapters/pntmap.py` first — every rule above appears in it at least once. Then read
161
+ `adapters/ais.py` if your format is binary, packs several fields into one wire value, or spells
162
+ "unknown" as an in-band number — it has ten such sentinels, one of which (draught 0.0) is also
163
+ a plausible reading, and it is the one adapter whose egress format has nowhere to park a field
164
+ it cannot map. Or read `adapters/tak.py`, which is where the awkward cases live: XML rather than JSON, a bidirectional
165
+ `from_cdm()`, a source sentinel that must become null, an enum collapse that has to stay
166
+ recoverable, and the two fixture forms an XML adapter needs in order to be checked at all.
167
+
168
+ Read `adapters/adsb.py` for the case where the format does not give you the value at all. Three
169
+ of its problems recur in any surveillance feed: a **frame with no timestamp**, so `observed_at`
170
+ is receipt time and has to say so; a **position that needs a second message** to resolve, which
171
+ is where the line between translation and fusion gets drawn and where a reference position
172
+ supplied as *configuration* is legitimate while a cache is not; and **two fields that look like
173
+ one** — a barometric and a GNSS altitude, which must not be collapsed into `alt_m` however
174
+ convenient it would be. It is also the adapter whose gate earned its keep most visibly: the
175
+ byte-exact round trip found two silent data losses that every other check passed.
176
+
177
+ Then:
178
+
179
+ **1. Declare the class.** The contract is checked at class-definition time, so a mistake here
180
+ fails at import rather than at 03:00 on the first outbound push.
181
+
182
+ ```python
183
+ class TakAdapter(Adapter):
184
+ name = "tak" # unique; how the harness and every SourceRef name you
185
+ version = "0.1.0" # semver; goes into source.adapter_version
186
+ direction = "bidirectional" # then you MUST override from_cdm()
187
+ system = "TAK"
188
+
189
+ TRANSFORMS = {"event.@time": "re-rendered into the CDM's fixed-millisecond form"}
190
+
191
+ def to_cdm(self, raw: bytes | dict) -> list[CDMBase]:
192
+ ...
193
+ ```
194
+
195
+ **2. Map the fields.** [FORMAT_COVERAGE.md](FORMAT_COVERAGE.md) already holds the CoT and
196
+ STANAG 4676 mappings, row by row, with the six known gaps named — that table is your
197
+ specification, and a test resolves every path in it against the models so it cannot go stale.
198
+
199
+ **3. Park everything else.** List the dotted paths you consumed, hand them to
200
+ `lossless.residual(raw, consumed)`, and put the result in `attributes["source_extras"]` /
201
+ `payload["source_extras"]`. Do not enumerate leftovers by hand: the block a source adds in its
202
+ next firmware release is exactly the one nobody remembers.
203
+
204
+ **4. Refuse what you cannot read.** A missing required field or an unmappable severity raises.
205
+ Do not default it — an alert that arrives labelled `INFO` because its severity was unreadable
206
+ is worse than one that fails loudly. An enum that *has* an `UNKNOWN` member is different: use
207
+ it, and keep the source's own word in `attributes`.
208
+
209
+ **5. Ship fixtures.** At least three synthetic payloads in this package's `fixtures/<name>/`,
210
+ including one that exercises the awkward path (a missing position, an unknown type, a vendor
211
+ block you have never seen). No real data, ever. If your adapter lives outside this package, put
212
+ them wherever you like and pass `--fixtures` — the harness is not fussy about where they are, only
213
+ about there being some.
214
+
215
+ **6. Record the golden output and read it.**
216
+
217
+ ```bash
218
+ python -m synapse_cdm.harness --adapter tak --update-golden
219
+ ```
220
+
221
+ Then **review the diff before committing it** — `--update-golden` is how a defect becomes the
222
+ expectation. Both defects found while building the reference adapter were caught by reading a
223
+ golden file, not by a failing test.
224
+
225
+ **7. Add the tests.** Copy the shape of `tests/test_cdm_pntmap_adapter.py`: one test per claim
226
+ in your adapter's docstring. If you are bidirectional, the harness already round-trips you —
227
+ declare `direction = "bidirectional"`, override `from_cdm()`, and the `roundtrip` column checks
228
+ that no source value goes missing on the way out. It compares values, not bytes: a byte-equal
229
+ round trip is neither achievable nor the point (key order changes, omitted optional fields come
230
+ back explicit, XML attribute order is arbitrary). An adapter emitting XML or USMTF gets `SKIP`
231
+ there and must ship its own round-trip test.
232
+
233
+ ## The harness
234
+
235
+ ```
236
+ python -m synapse_cdm.harness --adapter <name|module:Class> [--fixtures <dir>] [--json]
237
+ [--schemas <dir>] [--now <RFC3339>] [--update-golden]
238
+ [--synthetic true|false]
239
+ ```
240
+
241
+ Six checks per fixture, and an unrun check reports `SKIP` — never `PASS`:
242
+
243
+ | Check | Fails when |
244
+ |---|---|
245
+ | `translate` | `to_cdm()` raised. One bad fixture never stops the run; the rest are still judged. |
246
+ | `schema` | an object violates the **published** JSON Schema in `/schemas` (not the model — the schema is what other languages read). |
247
+ | `provenance` | `source.*` incomplete, `synthetic` unstated, `source_ids` empty, an event missing a timestamp. |
248
+ | `lossless` | a source value appears nowhere in the output and is not a declared transform. |
249
+ | `roundtrip` | for an `egress`/`bidirectional` adapter: a value present in the source payload is absent from what `from_cdm()` emits. `SKIP` for ingest-only adapters. |
250
+ | `golden` | the output differs from the recorded expectation, reported path by path. |
251
+
252
+ Nothing in the harness knows anything about any particular adapter — it resolves
253
+ `module:ClassName` as readily as a registered name, which is what makes it usable as the gate
254
+ for adapters the AI adapter factory generates and this repository has never seen.
255
+
256
+ **Exit codes: `0` every fixture passed, `1` fixtures ran and some failed, `2` the run could not
257
+ happen — no fixture matched, the `--schemas` directory held no schemas, or `--fixtures` was
258
+ omitted for an adapter this package does not ship.** The third one exists because `2` and `1` send a reader to different places — `1` says
259
+ debug the adapter, `2` says fix the path you passed — and because a run that matched nothing used
260
+ to exit `0` with `0 passed, 0 failed`. It does not any more: an absent directory, an empty one and
261
+ one whose only content is a `spec/` subdirectory are the same failure, and the message names the
262
+ adapter, the directory searched and the rule that selected nothing. `--json` prints nothing at all
263
+ in that case, because the shape of a report is itself a claim that fixtures were judged.
264
+
265
+ **The fixture directory is not always the adapter's name, and you no longer have to know that.**
266
+ `stanag4676` reads its fixtures from `fixtures/nits` — the adapter is named for a covering
267
+ document and the directory for the bytes it holds — and pointing `--fixtures` at
268
+ `fixtures/stanag4676` is the invocation that used to pass vacuously, because that directory holds
269
+ only pinned standards. Each adapter now DECLARES its directory (`Adapter.fixture_dir`) and the
270
+ harness resolves it through `importlib.resources`, so omitting `--fixtures` is always right for a
271
+ shipped adapter. `tests/test_cdm_harness.py` holds the same map written out by hand and requires
272
+ the two to agree, so a new adapter cannot join the roster without one.
273
+
274
+ **`--fixtures` is required for `module:ClassName`**, and refused rather than guessed at. This
275
+ package ships fixtures for the adapters IT ships; guessing at `fixtures/<your name>` would either
276
+ miss — a failure naming a directory you never mentioned — or HIT, because your adapter's name
277
+ collided with one of ours, and then your code is judged against our payloads and every check
278
+ passes or fails for reasons that have nothing to do with it.
279
+
280
+ ### Three things the harness cannot check for you
281
+
282
+ Adapter #11 mutation-checked its own assertions and each mutation found a hole that a green run
283
+ had been hiding. All three generalise, so they are here rather than in one adapter's notes.
284
+
285
+ **A fixture whose behaviour is invariant under the harness clock exercises nothing.** The harness
286
+ injects ONE frozen instant for a whole fixture directory. CAT048's two midnight-rollover fixtures
287
+ describe times of day that resolve to the receipt date at that instant — so they produced correct
288
+ golden files, passed every check, and tested no rollover in either direction. A fixture that
289
+ depends on the *relationship* between the payload's time and the clock has to inject its own clock
290
+ from `tests/`, and the fixture row should say so; the harness pass is about the golden file, not
291
+ about the behaviour. This will recur for every format that states a time of day without a date,
292
+ which is most of them.
293
+
294
+ **A round trip proves self-consistency, never correctness. Correctness needs an external anchor.**
295
+ `encode(decode(x)) == x` and `inverse(direct(x)) == x` both pass when the two halves share a wrong
296
+ constant, because the error cancels. Replacing WGS-84's semi-major axis with its semi-minor — a
297
+ 21 km error — passed every one of CAT048's geodesic inversion tests for exactly that reason. The
298
+ hole class is **any derive/invert pair whose shared constants encode a MODEL rather than a single
299
+ documented scale factor**: an LSB is one number a reviewer checks against the specification by
300
+ eye, an ellipsoid or a projection is not, and only the second kind can hide inside a round trip.
301
+ So audit the model separately, against something outside the implementation —
302
+
303
+ - `cat048_codec` pins WGS-84 by its published constants and by three geodesic distances computed
304
+ independently of it (one degree of longitude at the equator, one of latitude, the quarter
305
+ meridian).
306
+ - `gmtif_codec` already had the right shape and it is worth naming as the pattern: its strongest
307
+ tests are the worked examples the standard itself prints — `BA16 0101100100011100` = 125.31006°
308
+ and −34.876099° = `SA16 1100111001100110` — which are anchors the implementation cannot
309
+ influence.
310
+ - `asterix_cat021`'s scale factors are the safe kind: each is a single stated LSB, checkable
311
+ against the document without running anything.
312
+
313
+ **The roster sweep is a manual protocol act, and prose counts are what it is for.** When an
314
+ adapter joins the shipped roster, seven documents restate how many adapters there are and four of
315
+ them do the pair arithmetic as well — and nothing in the harness reads prose. The sweep is:
316
+
317
+ 1. **`grep` every spelled-out number within 120 characters of the word "adapter"**, across
318
+ `*.md`, `*.mdx` and `*.py`. The narrower form — grepping for the *previous* count word, "eight"
319
+ or "nine" — is what the adapter #11 sweep started with, and it missed
320
+ `synapse_cdm/__init__.py`, which still said "five adapters means ten translations" four
321
+ adapters later. A site that is stale by more than one release does not contain the previous
322
+ count word, so searching for it cannot find the sites that have drifted furthest.
323
+ 2. **Check the pair arithmetic at every site that states a number**, not just the count. Two
324
+ documents disagreed on whether it is `N×(N−1)` or `N(N−1)/2`, which for the nine adapters of
325
+ the day was 72 against 36; neither was wrong on its own page and together they were a
326
+ contradiction. At ten it is 90 against 45.
327
+ 3. **Read every sentence that states the count TWICE.** `symbology.py` and
328
+ `docs/docs/cdm/entity.mdx` both carry "so that ten adapters cannot grow ten slightly
329
+ different opinions", and commit 94c000a had to repair that sentence half-updated —
330
+ "seven adapters cannot grow six" — which reads as prose either way.
331
+ 4. **Read the gap list's own tallies.** `FORMAT_COVERAGE.md` gap 1 counts how many adapters park
332
+ a private name key, and it had been undercounting itself by one adapter since adapter #6. A
333
+ count that IS the argument decays exactly like any other.
334
+
335
+ **A structured-status counter is blind to all of this.** The adapter #11 flip counter walked every
336
+ `Status`-bearing table row, correctly reported zero rows left saying `not yet`, and did not see
337
+ the two prose sentences in the same section that still described the row set as unimplemented.
338
+ Anything that parses tables will report clean while the paragraphs around them contradict them.
339
+
340
+ `tests/test_cdm_prose_counts.py` now pins the seven sites the sweep has already had to fix, so a
341
+ half-edit at a KNOWN site fails a build. It is deliberately an allowlist and not a scanner — a
342
+ general prose-number check would flag "two altitudes that are two different measurements" and
343
+ need an exemption list larger than the sweep it replaced — so **finding a NEW site is still the
344
+ sweep's job**, and adding it to that allowlist is how the sweep's work stops being undone.
345
+
346
+ None of the three is something the six checks can produce, and that is the point of writing them
347
+ down here: a green harness run is a floor.
348
+
349
+ ## Layout
350
+
351
+ Repository root, then the package:
352
+
353
+ ```
354
+ packages/cdm/
355
+ pyproject.toml distribution metadata; version is READ FROM version.py, never restated
356
+ synapse_cdm/
357
+ models.py the four objects, Position, Kinematics, SourceRef, Integrity, payloads
358
+ enums.py closed vocabularies; UNKNOWN is a member, never a null
359
+ geo.py GeoJSON Point/LineString/Polygon, [lon, lat], ring closure enforced
360
+ times.py one timestamp form, one injectable clock
361
+ ids.py derived stable identity (uuid5) and the id basis
362
+ version.py SCHEMA_VERSION and the compatibility rule
363
+ symbology.py MIL-STD-2525D standard identity, CoT affiliation letters
364
+ lossless.py the never-drop rule as a computable check
365
+ adapter.py the Adapter ABC, its class-definition-time gates, the registry
366
+ schemas.py JSON Schema export (+ --check for CI)
367
+ harness.py the adapter-agnostic validation harness
368
+ adapters/ one module per external system (pntmap, tak, ais, adsb, …)
369
+ fixtures/ synthetic payloads + golden outputs
370
+ schemas/ published JSON Schema, generated — never hand-edited
371
+ tests/test_cdm_*.py
372
+ ```
373
+
374
+ `schemas/` sits at the repository root rather than inside the package because it is the
375
+ artefact for OTHER languages: a Go or TypeScript consumer clones this repository and reads
376
+ those files, and burying the one thing they need under a Python package layout would be a
377
+ Python assumption in a deliberately language-neutral contract. The generator writes both
378
+ copies from one source — `python -m synapse_cdm.schemas --check --out schemas` is the CI
379
+ form and fails on any drift.
380
+
381
+ `synapse_cdm` depends on nothing but `pydantic` and `jsonschema` — in particular nothing from
382
+ the SynapseCommand product repository (`agents/`, `core/`, `platform/`, `synapse-data/`,
383
+ `airtasking/`) — which is why it could be lifted out into this repository at all. It also
384
+ contains no crypto: the `integrity` field is designed and deliberately unpopulated, because a
385
+ signature computed inside a translator is held by nothing that audits it. Both properties are
386
+ enforced by AST over the package's own sources in `tests/test_cdm_boundary.py`, not by this
387
+ paragraph.