From 14b50eb3e600d99a2d8ad1b3c5445178ee2baf2b Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Fri, 20 Dec 2024 13:16:48 +0100 Subject: [PATCH 01/23] #Working on 43. Changed several files to break link to maritime schema. --- .../traffic_situation_01.json | 26 +- .../traffic_situation_02.json | 26 +- .../traffic_situation_03.json | 26 +- .../traffic_situation_04.json | 26 +- .../traffic_situation_05.json | 26 +- .../traffic_situation_06.json | 38 +- .../traffic_situation_07.json | 38 +- .../traffic_situation_08.json | 38 +- .../traffic_situation_09.json | 38 +- .../traffic_situation_10.json | 38 +- .../traffic_situation_11.json | 38 +- .../traffic_situation_12.json | 38 +- .../traffic_situation_13.json | 26 +- .../traffic_situation_14.json | 38 +- .../traffic_situation_15.json | 38 +- .../traffic_situation_16.json | 38 +- .../traffic_situation_17.json | 38 +- .../traffic_situation_18.json | 14 +- .../traffic_situation_19.json | 26 +- .../traffic_situation_20.json | 38 +- .../traffic_situation_21.json | 50 +- .../traffic_situation_22.json | 50 +- .../traffic_situation_23.json | 50 +- .../traffic_situation_24.json | 38 +- .../traffic_situation_25.json | 50 +- .../traffic_situation_26.json | 50 +- .../traffic_situation_27.json | 50 +- .../traffic_situation_28.json | 50 +- .../traffic_situation_29.json | 50 +- .../traffic_situation_30.json | 50 +- .../traffic_situation_31.json | 50 +- .../traffic_situation_32.json | 38 +- .../traffic_situation_33.json | 26 +- .../traffic_situation_34.json | 50 +- .../traffic_situation_35.json | 50 +- .../traffic_situation_36.json | 50 +- .../traffic_situation_37.json | 50 +- .../traffic_situation_38.json | 50 +- .../traffic_situation_39.json | 50 +- .../traffic_situation_40.json | 50 +- .../traffic_situation_41.json | 50 +- .../traffic_situation_42.json | 50 +- .../traffic_situation_43.json | 26 +- .../traffic_situation_44.json | 38 +- .../traffic_situation_45.json | 50 +- .../traffic_situation_46.json | 50 +- .../traffic_situation_47.json | 50 +- .../traffic_situation_48.json | 38 +- .../traffic_situation_49.json | 26 +- .../traffic_situation_50.json | 38 +- .../traffic_situation_51.json | 50 +- .../traffic_situation_52.json | 14 +- .../traffic_situation_53.json | 26 +- .../traffic_situation_54.json | 38 +- .../traffic_situation_55.json | 50 +- .../baseline_situation_01_1_ts.json | 4 +- .../baseline_situation_02_1_ts.json | 4 +- .../baseline_situation_03_1_ts.json | 4 +- .../baseline_situation_04_1_ts.json | 4 +- .../baseline_situation_05_1_ts.json | 4 +- .../baseline_situation_06_2_ts.json | 4 +- .../baseline_situation_07_2_ts.json | 4 +- .../baseline_situation_08_2_ts.json | 4 +- .../baseline_situation_09_2_ts.json | 4 +- .../baseline_situation_10_2_ts.json | 4 +- .../baseline_situation_11_2_ts.json | 4 +- .../baseline_situation_12_2_ts.json | 4 +- .../baseline_situation_13_2_ts.json | 4 +- .../baseline_situation_14_2_ts.json | 4 +- .../baseline_situation_15_2_ts.json | 4 +- .../baseline_situation_16_2_ts.json | 4 +- .../baseline_situation_17_2_ts.json | 4 +- .../baseline_situation_18_2_ts.json | 4 +- .../baseline_situation_19_2_ts.json | 4 +- .../baseline_situation_20_2_ts.json | 4 +- .../baseline_situation_21_3_ts.json | 4 +- .../baseline_situation_22_3_ts.json | 4 +- .../baseline_situation_23_3_ts.json | 4 +- .../baseline_situation_24_3_ts.json | 4 +- .../baseline_situation_25_3_ts.json | 4 +- .../baseline_situation_26_3_ts.json | 4 +- .../baseline_situation_27_3_ts.json | 4 +- .../baseline_situation_28_3_ts.json | 4 +- .../baseline_situation_29_3_ts.json | 4 +- .../baseline_situation_30_3_ts.json | 4 +- .../baseline_situation_31_3_ts.json | 4 +- .../baseline_situation_32_3_ts.json | 4 +- .../baseline_situation_33_3_ts.json | 4 +- .../baseline_situation_34_3_ts.json | 4 +- .../baseline_situation_35_3_ts.json | 4 +- .../baseline_situation_36_3_ts.json | 4 +- .../baseline_situation_37_3_ts.json | 4 +- .../baseline_situation_38_3_ts.json | 4 +- .../baseline_situation_39_3_ts.json | 4 +- .../baseline_situation_40_3_ts.json | 4 +- .../baseline_situation_41_3_ts.json | 4 +- .../baseline_situation_42_3_ts.json | 4 +- .../baseline_situation_43_3_ts.json | 4 +- .../baseline_situation_44_3_ts.json | 4 +- .../baseline_situation_45_3_ts.json | 4 +- .../baseline_situation_46_3_ts.json | 4 +- .../baseline_situation_47_3_ts.json | 4 +- .../baseline_situation_48_3_ts.json | 4 +- .../baseline_situation_49_3_ts.json | 4 +- .../baseline_situation_50_3_ts.json | 4 +- .../baseline_situation_51_3_ts.json | 4 +- .../baseline_situation_52_3_ts.json | 4 +- .../baseline_situation_53_3_ts.json | 4 +- .../baseline_situation_54_3_ts.json | 4 +- .../baseline_situation_55_3_ts.json | 4 +- .../example_several_situations_01_1_ts.json | 6 +- .../example_several_situations_02_2_ts.json | 6 +- .../example_situation_01_1_ts.json | 6 +- .../example_situation_02_1_ts.json | 6 +- .../example_situation_03_1_ts.json | 6 +- .../example_situation_04_1_ts.json | 6 +- data/own_ship/own_ship.json | 10 +- data/target_ships/target_ship_1.json | 10 +- data/target_ships/target_ship_2.json | 10 +- data/target_ships/target_ship_3.json | 10 +- docs/input_files.rst | 16 +- pyproject.toml | 4 +- src/trafficgen/check_land_crossing.py | 14 +- src/trafficgen/encounter.py | 157 +++-- src/trafficgen/marine_system_simulator.py | 28 +- src/trafficgen/plot_traffic_situation.py | 72 +-- src/trafficgen/read_files.py | 43 +- src/trafficgen/ship_traffic_generator.py | 29 +- src/trafficgen/types.py | 602 +++++++++++++++++- src/trafficgen/utils.py | 62 +- .../write_traffic_situation_to_file.py | 42 +- tests/data/test_01/test_01_1.json | 6 +- tests/data/test_01/test_01_2.json | 6 +- tests/data/test_01/test_01_3.json | 6 +- tests/data/test_01/test_01_4.json | 6 +- tests/data/test_01/test_01_5.json | 6 +- tests/data/test_02/test_02_1.json | 6 +- tests/data/test_02/test_02_2.json | 6 +- tests/data/test_03/test_03_1.json | 6 +- tests/data/test_03/test_03_2.json | 6 +- tests/data/test_04/test_04_1.json | 6 +- tests/data/test_05/test_05_1.json | 6 +- tests/data/test_05/test_05_2.json | 6 +- tests/data/test_05/test_05_3.json | 6 +- tests/data/test_06/test_06_1.json | 6 +- tests/data/test_06/test_06_2.json | 6 +- tests/data/test_07/test_07_1.json | 6 +- tests/data/test_07/test_07_2.json | 6 +- tests/data/test_07/test_07_3.json | 6 +- tests/data/test_07/test_07_4.json | 6 +- tests/data/test_07/test_07_5.json | 6 +- tests/data/test_08/test_08_1.json | 4 +- tests/test_read_files.py | 29 +- tests/test_trafficgen.py | 6 +- tests/test_write_files.py | 7 +- 155 files changed, 2143 insertions(+), 1586 deletions(-) diff --git a/data/baseline_situations_generated/traffic_situation_01.json b/data/baseline_situations_generated/traffic_situation_01.json index 260018f..9ac227c 100644 --- a/data/baseline_situations_generated/traffic_situation_01.json +++ b/data/baseline_situations_generated/traffic_situation_01.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.84117519, - "longitude": 10.49587268 + "lat": 58.84117519, + "lon": 10.49587268 }, "sog": 12.1, "cog": 183.12, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.84117519, - "longitude": 10.49587268 + "lat": 58.84117519, + "lon": 10.49587268 } }, { "position": { - "latitude": 58.80782874, - "longitude": 10.49237693 + "lat": 58.80782874, + "lon": 10.49237693 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_02.json b/data/baseline_situations_generated/traffic_situation_02.json index 8faf4dd..52f4088 100644 --- a/data/baseline_situations_generated/traffic_situation_02.json +++ b/data/baseline_situations_generated/traffic_situation_02.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.81117278, - "longitude": 10.52409158 + "lat": 58.81117278, + "lon": 10.52409158 }, "sog": 8.0, "cog": 220.93, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.81117278, - "longitude": 10.52409158 + "lat": 58.81117278, + "lon": 10.52409158 } }, { "position": { - "latitude": 58.79448844, - "longitude": 10.49624045 + "lat": 58.79448844, + "lon": 10.49624045 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_03.json b/data/baseline_situations_generated/traffic_situation_03.json index 42d3667..62e94a9 100644 --- a/data/baseline_situations_generated/traffic_situation_03.json +++ b/data/baseline_situations_generated/traffic_situation_03.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.80568759, - "longitude": 10.44372042 + "lat": 58.80568759, + "lon": 10.44372042 }, "sog": 6.0, "cog": 120.78, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.80568759, - "longitude": 10.44372042 + "lat": 58.80568759, + "lon": 10.44372042 } }, { "position": { - "latitude": 58.79714267, - "longitude": 10.47133461 + "lat": 58.79714267, + "lon": 10.47133461 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_04.json b/data/baseline_situations_generated/traffic_situation_04.json index 2959c80..a581694 100644 --- a/data/baseline_situations_generated/traffic_situation_04.json +++ b/data/baseline_situations_generated/traffic_situation_04.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.77167228, - "longitude": 10.49490498 + "lat": 58.77167228, + "lon": 10.49490498 }, "sog": 5.1, "cog": 353.51, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.77167228, - "longitude": 10.49490498 + "lat": 58.77167228, + "lon": 10.49490498 } }, { "position": { - "latitude": 58.78558739, - "longitude": 10.4918603 + "lat": 58.78558739, + "lon": 10.4918603 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_05.json b/data/baseline_situations_generated/traffic_situation_05.json index f576339..26224eb 100644 --- a/data/baseline_situations_generated/traffic_situation_05.json +++ b/data/baseline_situations_generated/traffic_situation_05.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.70853434, - "longitude": 10.46233142 + "lat": 58.70853434, + "lon": 10.46233142 }, "sog": 15.9, "cog": 10.08, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.70853434, - "longitude": 10.46233142 + "lat": 58.70853434, + "lon": 10.46233142 } }, { "position": { - "latitude": 58.75202075, - "longitude": 10.47721773 + "lat": 58.75202075, + "lon": 10.47721773 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_06.json b/data/baseline_situations_generated/traffic_situation_06.json index b8762a5..ee1a45d 100644 --- a/data/baseline_situations_generated/traffic_situation_06.json +++ b/data/baseline_situations_generated/traffic_situation_06.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.81839957, - "longitude": 10.488805 + "lat": 58.81839957, + "lon": 10.488805 }, "sog": 8.9, "cog": 177.96, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.81839957, - "longitude": 10.488805 + "lat": 58.81839957, + "lon": 10.488805 } }, { "position": { - "latitude": 58.79363768, - "longitude": 10.49050219 + "lat": 58.79363768, + "lon": 10.49050219 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.83385863, - "longitude": 10.50012366 + "lat": 58.83385863, + "lon": 10.50012366 }, "sog": 11.1, "cog": 186.56, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.83385863, - "longitude": 10.50012366 + "lat": 58.83385863, + "lon": 10.50012366 } }, { "position": { - "latitude": 58.80335669, - "longitude": 10.49337704 + "lat": 58.80335669, + "lon": 10.49337704 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_07.json b/data/baseline_situations_generated/traffic_situation_07.json index 21e431e..3970d19 100644 --- a/data/baseline_situations_generated/traffic_situation_07.json +++ b/data/baseline_situations_generated/traffic_situation_07.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.86837667, - "longitude": 10.47653591 + "lat": 58.86837667, + "lon": 10.47653591 }, "sog": 14.0, "cog": 174.58, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.86837667, - "longitude": 10.47653591 + "lat": 58.86837667, + "lon": 10.47653591 } }, { "position": { - "latitude": 58.82976775, - "longitude": 10.48358685 + "lat": 58.82976775, + "lon": 10.48358685 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.79364892, - "longitude": 10.53288731 + "lat": 58.79364892, + "lon": 10.53288731 }, "sog": 8.0, "cog": 263.5, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.79364892, - "longitude": 10.53288731 + "lat": 58.79364892, + "lon": 10.53288731 } }, { "position": { - "latitude": 58.79115016, - "longitude": 10.4906505 + "lat": 58.79115016, + "lon": 10.4906505 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_08.json b/data/baseline_situations_generated/traffic_situation_08.json index 5065cf4..4522456 100644 --- a/data/baseline_situations_generated/traffic_situation_08.json +++ b/data/baseline_situations_generated/traffic_situation_08.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.86111396, - "longitude": 10.50380439 + "lat": 58.86111396, + "lon": 10.50380439 }, "sog": 16.9, "cog": 185.58, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.86111396, - "longitude": 10.50380439 + "lat": 58.86111396, + "lon": 10.50380439 } }, { "position": { - "latitude": 58.81447416, - "longitude": 10.49503177 + "lat": 58.81447416, + "lon": 10.49503177 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.80071412, - "longitude": 10.4385363 + "lat": 58.80071412, + "lon": 10.4385363 }, "sog": 8.0, "cog": 109.43, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.80071412, - "longitude": 10.4385363 + "lat": 58.80071412, + "lon": 10.4385363 } }, { "position": { - "latitude": 58.79336585, - "longitude": 10.47862388 + "lat": 58.79336585, + "lon": 10.47862388 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_09.json b/data/baseline_situations_generated/traffic_situation_09.json index 96903e7..318aa6c 100644 --- a/data/baseline_situations_generated/traffic_situation_09.json +++ b/data/baseline_situations_generated/traffic_situation_09.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.83100382, - "longitude": 10.48610925 + "lat": 58.83100382, + "lon": 10.48610925 }, "sog": 11.1, "cog": 176.59, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.83100382, - "longitude": 10.48610925 + "lat": 58.83100382, + "lon": 10.48610925 } }, { "position": { - "latitude": 58.80035566, - "longitude": 10.48962903 + "lat": 58.80035566, + "lon": 10.48962903 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.76877259, - "longitude": 10.49245116 + "lat": 58.76877259, + "lon": 10.49245116 }, "sog": 5.1, "cog": 357.58, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.76877259, - "longitude": 10.49245116 + "lat": 58.76877259, + "lon": 10.49245116 } }, { "position": { - "latitude": 58.78276485, - "longitude": 10.49131429 + "lat": 58.78276485, + "lon": 10.49131429 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_10.json b/data/baseline_situations_generated/traffic_situation_10.json index 4e128eb..fb60e5f 100644 --- a/data/baseline_situations_generated/traffic_situation_10.json +++ b/data/baseline_situations_generated/traffic_situation_10.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.83785356, - "longitude": 10.490654 + "lat": 58.83785356, + "lon": 10.490654 }, "sog": 9.9, "cog": 180.02, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.83785356, - "longitude": 10.490654 + "lat": 58.83785356, + "lon": 10.490654 } }, { "position": { - "latitude": 58.81038277, - "longitude": 10.49063246 + "lat": 58.81038277, + "lon": 10.49063246 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.71205347, - "longitude": 10.49756616 + "lat": 58.71205347, + "lon": 10.49756616 }, "sog": 19.1, "cog": 357.41, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.71205347, - "longitude": 10.49756616 + "lat": 58.71205347, + "lon": 10.49756616 } }, { "position": { - "latitude": 58.76478662, - "longitude": 10.4929765 + "lat": 58.76478662, + "lon": 10.4929765 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_11.json b/data/baseline_situations_generated/traffic_situation_11.json index 7e35f42..daf6eb3 100644 --- a/data/baseline_situations_generated/traffic_situation_11.json +++ b/data/baseline_situations_generated/traffic_situation_11.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.85321387, - "longitude": 10.54679803 + "lat": 58.85321387, + "lon": 10.54679803 }, "sog": 13.0, "cog": 205.18, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.85321387, - "longitude": 10.54679803 + "lat": 58.85321387, + "lon": 10.54679803 } }, { "position": { - "latitude": 58.8205531, - "longitude": 10.51724645 + "lat": 58.8205531, + "lon": 10.51724645 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.75394195, - "longitude": 10.57672769 + "lat": 58.75394195, + "lon": 10.57672769 }, "sog": 14.0, "cog": 309.74, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.75394195, - "longitude": 10.57672769 + "lat": 58.75394195, + "lon": 10.57672769 } }, { "position": { - "latitude": 58.77873617, - "longitude": 10.5193251 + "lat": 58.77873617, + "lon": 10.5193251 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_12.json b/data/baseline_situations_generated/traffic_situation_12.json index a023b62..224bef7 100644 --- a/data/baseline_situations_generated/traffic_situation_12.json +++ b/data/baseline_situations_generated/traffic_situation_12.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.81997959, - "longitude": 10.5994687 + "lat": 58.81997959, + "lon": 10.5994687 }, "sog": 12.1, "cog": 242.99, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.81997959, - "longitude": 10.5994687 + "lat": 58.81997959, + "lon": 10.5994687 } }, { "position": { - "latitude": 58.80481372, - "longitude": 10.54219642 + "lat": 58.80481372, + "lon": 10.54219642 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.75617732, - "longitude": 10.40223017 + "lat": 58.75617732, + "lon": 10.40223017 }, "sog": 13.0, "cog": 52.71, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.75617732, - "longitude": 10.40223017 + "lat": 58.75617732, + "lon": 10.40223017 } }, { "position": { - "latitude": 58.77804081, - "longitude": 10.45749841 + "lat": 58.77804081, + "lon": 10.45749841 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_13.json b/data/baseline_situations_generated/traffic_situation_13.json index 1d211c7..7589a52 100644 --- a/data/baseline_situations_generated/traffic_situation_13.json +++ b/data/baseline_situations_generated/traffic_situation_13.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.8057235, - "longitude": 10.63159297 + "lat": 58.8057235, + "lon": 10.63159297 }, "sog": 15.0, "cog": 258.75, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.8057235, - "longitude": 10.63159297 + "lat": 58.8057235, + "lon": 10.63159297 } }, { "position": { - "latitude": 58.79763043, - "longitude": 10.55329214 + "lat": 58.79763043, + "lon": 10.55329214 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_14.json b/data/baseline_situations_generated/traffic_situation_14.json index 4edaafb..288166a 100644 --- a/data/baseline_situations_generated/traffic_situation_14.json +++ b/data/baseline_situations_generated/traffic_situation_14.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.76938305, - "longitude": 10.55540367 + "lat": 58.76938305, + "lon": 10.55540367 }, "sog": 12.1, "cog": 302.92, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.76938305, - "longitude": 10.55540367 + "lat": 58.76938305, + "lon": 10.55540367 } }, { "position": { - "latitude": 58.78753398, - "longitude": 10.50144419 + "lat": 58.78753398, + "lon": 10.50144419 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.72454999, - "longitude": 10.44741843 + "lat": 58.72454999, + "lon": 10.44741843 }, "sog": 16.9, "cog": 18.62, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.72454999, - "longitude": 10.44741843 + "lat": 58.72454999, + "lon": 10.44741843 } }, { "position": { - "latitude": 58.76895875, - "longitude": 10.47622127 + "lat": 58.76895875, + "lon": 10.47622127 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_15.json b/data/baseline_situations_generated/traffic_situation_15.json index aefbb08..6e6669d 100644 --- a/data/baseline_situations_generated/traffic_situation_15.json +++ b/data/baseline_situations_generated/traffic_situation_15.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.76931123, - "longitude": 10.36160394 + "lat": 58.76931123, + "lon": 10.36160394 }, "sog": 15.0, "cog": 71.96, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.76931123, - "longitude": 10.36160394 + "lat": 58.76931123, + "lon": 10.36160394 } }, { "position": { - "latitude": 58.782153, - "longitude": 10.43751625 + "lat": 58.782153, + "lon": 10.43751625 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.75379831, - "longitude": 10.38532994 + "lat": 58.75379831, + "lon": 10.38532994 }, "sog": 15.9, "cog": 55.69, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.75379831, - "longitude": 10.38532994 + "lat": 58.75379831, + "lon": 10.38532994 } }, { "position": { - "latitude": 58.77869396, - "longitude": 10.45555736 + "lat": 58.77869396, + "lon": 10.45555736 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_16.json b/data/baseline_situations_generated/traffic_situation_16.json index 8c80897..0d14999 100644 --- a/data/baseline_situations_generated/traffic_situation_16.json +++ b/data/baseline_situations_generated/traffic_situation_16.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.75206568, - "longitude": 10.40884857 + "lat": 58.75206568, + "lon": 10.40884857 }, "sog": 13.0, "cog": 47.38, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.75206568, - "longitude": 10.40884857 + "lat": 58.75206568, + "lon": 10.40884857 } }, { "position": { - "latitude": 58.77650111, - "longitude": 10.45996974 + "lat": 58.77650111, + "lon": 10.45996974 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.72568114, - "longitude": 10.47117898 + "lat": 58.72568114, + "lon": 10.47117898 }, "sog": 15.9, "cog": 8.77, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.72568114, - "longitude": 10.47117898 + "lat": 58.72568114, + "lon": 10.47117898 } }, { "position": { - "latitude": 58.76933391, - "longitude": 10.48413629 + "lat": 58.76933391, + "lon": 10.48413629 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_17.json b/data/baseline_situations_generated/traffic_situation_17.json index 0537374..a1403f4 100644 --- a/data/baseline_situations_generated/traffic_situation_17.json +++ b/data/baseline_situations_generated/traffic_situation_17.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.75645562, - "longitude": 10.44043715 + "lat": 58.75645562, + "lon": 10.44043715 }, "sog": 12.1, "cog": 36.96, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.75645562, - "longitude": 10.44043715 + "lat": 58.75645562, + "lon": 10.44043715 } }, { "position": { - "latitude": 58.78314225, - "longitude": 10.47908405 + "lat": 58.78314225, + "lon": 10.47908405 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.76933816, - "longitude": 10.49720327 + "lat": 58.76933816, + "lon": 10.49720327 }, "sog": 8.0, "cog": 351.11, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.76933816, - "longitude": 10.49720327 + "lat": 58.76933816, + "lon": 10.49720327 } }, { "position": { - "latitude": 58.79115714, - "longitude": 10.49063282 + "lat": 58.79115714, + "lon": 10.49063282 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_18.json b/data/baseline_situations_generated/traffic_situation_18.json index 60cfb99..04f65fa 100644 --- a/data/baseline_situations_generated/traffic_situation_18.json +++ b/data/baseline_situations_generated/traffic_situation_18.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,17 +25,17 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] }, "targetShips": [] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_19.json b/data/baseline_situations_generated/traffic_situation_19.json index 9ddb160..13551c7 100644 --- a/data/baseline_situations_generated/traffic_situation_19.json +++ b/data/baseline_situations_generated/traffic_situation_19.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.7293888, - "longitude": 10.49639109 + "lat": 58.7293888, + "lon": 10.49639109 }, "sog": 15.9, "cog": 357.24, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.7293888, - "longitude": 10.49639109 + "lat": 58.7293888, + "lon": 10.49639109 } }, { "position": { - "latitude": 58.77350627, - "longitude": 10.49229598 + "lat": 58.77350627, + "lon": 10.49229598 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_20.json b/data/baseline_situations_generated/traffic_situation_20.json index 10dc730..0f035dd 100644 --- a/data/baseline_situations_generated/traffic_situation_20.json +++ b/data/baseline_situations_generated/traffic_situation_20.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.71787082, - "longitude": 10.52258819 + "lat": 58.71787082, + "lon": 10.52258819 }, "sog": 18.1, "cog": 347.27, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.71787082, - "longitude": 10.52258819 + "lat": 58.71787082, + "lon": 10.52258819 } }, { "position": { - "latitude": 58.76673323, - "longitude": 10.50133988 + "lat": 58.76673323, + "lon": 10.50133988 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.73743254, - "longitude": 10.49948429 + "lat": 58.73743254, + "lon": 10.49948429 }, "sog": 15.0, "cog": 355.12, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.73743254, - "longitude": 10.49948429 + "lat": 58.73743254, + "lon": 10.49948429 } }, { "position": { - "latitude": 58.77875766, - "longitude": 10.4926917 + "lat": 58.77875766, + "lon": 10.4926917 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_21.json b/data/baseline_situations_generated/traffic_situation_21.json index c4c6378..7c0ab21 100644 --- a/data/baseline_situations_generated/traffic_situation_21.json +++ b/data/baseline_situations_generated/traffic_situation_21.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.85453354, - "longitude": 10.48453674 + "lat": 58.85453354, + "lon": 10.48453674 }, "sog": 12.1, "cog": 177.1, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.85453354, - "longitude": 10.48453674 + "lat": 58.85453354, + "lon": 10.48453674 } }, { "position": { - "latitude": 58.8211804, - "longitude": 10.4877876 + "lat": 58.8211804, + "lon": 10.4877876 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.83510648, - "longitude": 10.490654 + "lat": 58.83510648, + "lon": 10.490654 }, "sog": 9.9, "cog": 180.02, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.83510648, - "longitude": 10.490654 + "lat": 58.83510648, + "lon": 10.490654 } }, { "position": { - "latitude": 58.80763569, - "longitude": 10.49063246 + "lat": 58.80763569, + "lon": 10.49063246 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.8489137, - "longitude": 10.50216275 + "lat": 58.8489137, + "lon": 10.50216275 }, "sog": 15.0, "cog": 185.92, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.8489137, - "longitude": 10.50216275 + "lat": 58.8489137, + "lon": 10.50216275 } }, { "position": { - "latitude": 58.80765974, - "longitude": 10.49392188 + "lat": 58.80765974, + "lon": 10.49392188 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_22.json b/data/baseline_situations_generated/traffic_situation_22.json index a940725..fb225dd 100644 --- a/data/baseline_situations_generated/traffic_situation_22.json +++ b/data/baseline_situations_generated/traffic_situation_22.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.86465105, - "longitude": 10.48044128 + "lat": 58.86465105, + "lon": 10.48044128 }, "sog": 14.0, "cog": 175.9, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.86465105, - "longitude": 10.48044128 + "lat": 58.86465105, + "lon": 10.48044128 } }, { "position": { - "latitude": 58.8259681, - "longitude": 10.4857812 + "lat": 58.8259681, + "lon": 10.4857812 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.84602298, - "longitude": 10.49620101 + "lat": 58.84602298, + "lon": 10.49620101 }, "sog": 9.9, "cog": 183.0, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.84602298, - "longitude": 10.49620101 + "lat": 58.84602298, + "lon": 10.49620101 } }, { "position": { - "latitude": 58.8185899, - "longitude": 10.49343108 + "lat": 58.8185899, + "lon": 10.49343108 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.80894638, - "longitude": 10.5590844 + "lat": 58.80894638, + "lon": 10.5590844 }, "sog": 8.0, "cog": 243.39, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.80894638, - "longitude": 10.5590844 + "lat": 58.80894638, + "lon": 10.5590844 } }, { "position": { - "latitude": 58.79905531, - "longitude": 10.52107659 + "lat": 58.79905531, + "lon": 10.52107659 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_23.json b/data/baseline_situations_generated/traffic_situation_23.json index 5027872..fd17968 100644 --- a/data/baseline_situations_generated/traffic_situation_23.json +++ b/data/baseline_situations_generated/traffic_situation_23.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.8570113, - "longitude": 10.50641373 + "lat": 58.8570113, + "lon": 10.50641373 }, "sog": 15.0, "cog": 187.07, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.8570113, - "longitude": 10.50641373 + "lat": 58.8570113, + "lon": 10.50641373 } }, { "position": { - "latitude": 58.81585121, - "longitude": 10.49658643 + "lat": 58.81585121, + "lon": 10.49658643 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.86120374, - "longitude": 10.49722055 + "lat": 58.86120374, + "lon": 10.49722055 }, "sog": 18.1, "cog": 182.77, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.86120374, - "longitude": 10.49722055 + "lat": 58.86120374, + "lon": 10.49722055 } }, { "position": { - "latitude": 58.81116861, - "longitude": 10.49255471 + "lat": 58.81116861, + "lon": 10.49255471 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.80382927, - "longitude": 10.43207343 + "lat": 58.80382927, + "lon": 10.43207343 }, "sog": 7.0, "cog": 112.59, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.80382927, - "longitude": 10.43207343 + "lat": 58.80382927, + "lon": 10.43207343 } }, { "position": { - "latitude": 58.79638166, - "longitude": 10.46653633 + "lat": 58.79638166, + "lon": 10.46653633 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_24.json b/data/baseline_situations_generated/traffic_situation_24.json index fee9129..093d2a5 100644 --- a/data/baseline_situations_generated/traffic_situation_24.json +++ b/data/baseline_situations_generated/traffic_situation_24.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.84442501, - "longitude": 10.48248037 + "lat": 58.84442501, + "lon": 10.48248037 }, "sog": 12.1, "cog": 175.44, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.84442501, - "longitude": 10.48248037 + "lat": 58.84442501, + "lon": 10.48248037 } }, { "position": { - "latitude": 58.81113486, - "longitude": 10.48759143 + "lat": 58.81113486, + "lon": 10.48759143 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.86120374, - "longitude": 10.49722055 + "lat": 58.86120374, + "lon": 10.49722055 }, "sog": 18.1, "cog": 182.77, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.86120374, - "longitude": 10.49722055 + "lat": 58.86120374, + "lon": 10.49722055 } }, { "position": { - "latitude": 58.81116861, - "longitude": 10.49255471 + "lat": 58.81116861, + "lon": 10.49255471 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_25.json b/data/baseline_situations_generated/traffic_situation_25.json index a61d739..163d021 100644 --- a/data/baseline_situations_generated/traffic_situation_25.json +++ b/data/baseline_situations_generated/traffic_situation_25.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.8704684, - "longitude": 10.47624214 + "lat": 58.8704684, + "lon": 10.47624214 }, "sog": 16.9, "cog": 174.58, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.8704684, - "longitude": 10.47624214 + "lat": 58.8704684, + "lon": 10.47624214 } }, { "position": { - "latitude": 58.82381595, - "longitude": 10.48476203 + "lat": 58.82381595, + "lon": 10.48476203 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.84528684, - "longitude": 10.490654 + "lat": 58.84528684, + "lon": 10.490654 }, "sog": 13.0, "cog": 180.02, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.84528684, - "longitude": 10.490654 + "lat": 58.84528684, + "lon": 10.490654 } }, { "position": { - "latitude": 58.80919775, - "longitude": 10.4906257 + "lat": 58.80919775, + "lon": 10.4906257 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.72882323, - "longitude": 10.51230635 + "lat": 58.72882323, + "lon": 10.51230635 }, "sog": 19.1, "cog": 349.79, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.72882323, - "longitude": 10.51230635 + "lat": 58.72882323, + "lon": 10.51230635 } }, { "position": { - "latitude": 58.78077447, - "longitude": 10.49429681 + "lat": 58.78077447, + "lon": 10.49429681 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_26.json b/data/baseline_situations_generated/traffic_situation_26.json index e9a0cd4..2ae659b 100644 --- a/data/baseline_situations_generated/traffic_situation_26.json +++ b/data/baseline_situations_generated/traffic_situation_26.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.87390674, - "longitude": 10.50179986 + "lat": 58.87390674, + "lon": 10.50179986 }, "sog": 15.0, "cog": 183.98, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.87390674, - "longitude": 10.50179986 + "lat": 58.87390674, + "lon": 10.50179986 } }, { "position": { - "latitude": 58.83253108, - "longitude": 10.49626314 + "lat": 58.83253108, + "lon": 10.49626314 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.84922791, - "longitude": 10.55075524 + "lat": 58.84922791, + "lon": 10.55075524 }, "sog": 14.0, "cog": 208.27, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.84922791, - "longitude": 10.55075524 + "lat": 58.84922791, + "lon": 10.55075524 } }, { "position": { - "latitude": 58.8150714, - "longitude": 10.51539816 + "lat": 58.8150714, + "lon": 10.51539816 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.75759575, - "longitude": 10.54367028 + "lat": 58.75759575, + "lon": 10.54367028 }, "sog": 12.1, "cog": 320.63, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.75759575, - "longitude": 10.54367028 + "lat": 58.75759575, + "lon": 10.54367028 } }, { "position": { - "latitude": 58.78341191, - "longitude": 10.5028914 + "lat": 58.78341191, + "lon": 10.5028914 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_27.json b/data/baseline_situations_generated/traffic_situation_27.json index 0326387..c30d765 100644 --- a/data/baseline_situations_generated/traffic_situation_27.json +++ b/data/baseline_situations_generated/traffic_situation_27.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.86863701, - "longitude": 10.48358631 + "lat": 58.86863701, + "lon": 10.48358631 }, "sog": 14.0, "cog": 177.27, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.86863701, - "longitude": 10.48358631 + "lat": 58.86863701, + "lon": 10.48358631 } }, { "position": { - "latitude": 58.82989863, - "longitude": 10.48713783 + "lat": 58.82989863, + "lon": 10.48713783 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.81497919, - "longitude": 10.58984352 + "lat": 58.81497919, + "lon": 10.58984352 }, "sog": 12.1, "cog": 245.17, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.81497919, - "longitude": 10.58984352 + "lat": 58.81497919, + "lon": 10.58984352 } }, { "position": { - "latitude": 58.80095463, - "longitude": 10.53150353 + "lat": 58.80095463, + "lon": 10.53150353 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.75609652, - "longitude": 10.40129703 + "lat": 58.75609652, + "lon": 10.40129703 }, "sog": 14.0, "cog": 52.94, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.75609652, - "longitude": 10.40129703 + "lat": 58.75609652, + "lon": 10.40129703 } }, { "position": { - "latitude": 58.77946801, - "longitude": 10.46087019 + "lat": 58.77946801, + "lon": 10.46087019 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_28.json b/data/baseline_situations_generated/traffic_situation_28.json index f160d8a..5476a8c 100644 --- a/data/baseline_situations_generated/traffic_situation_28.json +++ b/data/baseline_situations_generated/traffic_situation_28.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.8577654, - "longitude": 10.4811325 + "lat": 58.8577654, + "lon": 10.4811325 }, "sog": 12.1, "cog": 175.73, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.8577654, - "longitude": 10.4811325 + "lat": 58.8577654, + "lon": 10.4811325 } }, { "position": { - "latitude": 58.8244624, - "longitude": 10.4859231 + "lat": 58.8244624, + "lon": 10.4859231 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.8080666, - "longitude": 10.61331031 + "lat": 58.8080666, + "lon": 10.61331031 }, "sog": 14.0, "cog": 255.14, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.8080666, - "longitude": 10.61331031 + "lat": 58.8080666, + "lon": 10.61331031 } }, { "position": { - "latitude": 58.79811933, - "longitude": 10.54115628 + "lat": 58.79811933, + "lon": 10.54115628 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.76616017, - "longitude": 10.49366079 + "lat": 58.76616017, + "lon": 10.49366079 }, "sog": 6.0, "cog": 356.44, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.76616017, - "longitude": 10.49366079 + "lat": 58.76616017, + "lon": 10.49366079 } }, { "position": { - "latitude": 58.78282583, - "longitude": 10.49166335 + "lat": 58.78282583, + "lon": 10.49166335 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_29.json b/data/baseline_situations_generated/traffic_situation_29.json index 8ea6a04..b23b8a4 100644 --- a/data/baseline_situations_generated/traffic_situation_29.json +++ b/data/baseline_situations_generated/traffic_situation_29.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.8357349, - "longitude": 10.48821746 + "lat": 58.8357349, + "lon": 10.48821746 }, "sog": 8.9, "cog": 178.36, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.8357349, - "longitude": 10.48821746 + "lat": 58.8357349, + "lon": 10.48821746 } }, { "position": { - "latitude": 58.81096745, - "longitude": 10.48958097 + "lat": 58.81096745, + "lon": 10.48958097 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.77486823, - "longitude": 10.61533211 + "lat": 58.77486823, + "lon": 10.61533211 }, "sog": 12.1, "cog": 284.13, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.77486823, - "longitude": 10.61533211 + "lat": 58.77486823, + "lon": 10.61533211 } }, { "position": { - "latitude": 58.7830208, - "longitude": 10.55299388 + "lat": 58.7830208, + "lon": 10.55299388 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.72454999, - "longitude": 10.44741843 + "lat": 58.72454999, + "lon": 10.44741843 }, "sog": 16.9, "cog": 18.62, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.72454999, - "longitude": 10.44741843 + "lat": 58.72454999, + "lon": 10.44741843 } }, { "position": { - "latitude": 58.76895875, - "longitude": 10.47622127 + "lat": 58.76895875, + "lon": 10.47622127 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_30.json b/data/baseline_situations_generated/traffic_situation_30.json index d85e609..db2ee03 100644 --- a/data/baseline_situations_generated/traffic_situation_30.json +++ b/data/baseline_situations_generated/traffic_situation_30.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.82867867, - "longitude": 10.49284861 + "lat": 58.82867867, + "lon": 10.49284861 }, "sog": 8.0, "cog": 181.74, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.82867867, - "longitude": 10.49284861 + "lat": 58.82867867, + "lon": 10.49284861 } }, { "position": { - "latitude": 58.80660452, - "longitude": 10.4915562 + "lat": 58.80660452, + "lon": 10.4915562 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.76852122, - "longitude": 10.37910899 + "lat": 58.76852122, + "lon": 10.37910899 }, "sog": 15.0, "cog": 68.64, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.76852122, - "longitude": 10.37910899 + "lat": 58.76852122, + "lon": 10.37910899 } }, { "position": { - "latitude": 58.78362748, - "longitude": 10.45346076 + "lat": 58.78362748, + "lon": 10.45346076 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.74969565, - "longitude": 10.34050457 + "lat": 58.74969565, + "lon": 10.34050457 }, "sog": 15.9, "cog": 61.99, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.74969565, - "longitude": 10.34050457 + "lat": 58.74969565, + "lon": 10.34050457 } }, { "position": { - "latitude": 58.77043567, - "longitude": 10.41556825 + "lat": 58.77043567, + "lon": 10.41556825 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_31.json b/data/baseline_situations_generated/traffic_situation_31.json index d9147df..64ea186 100644 --- a/data/baseline_situations_generated/traffic_situation_31.json +++ b/data/baseline_situations_generated/traffic_situation_31.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.82454908, - "longitude": 10.490654 + "lat": 58.82454908, + "lon": 10.490654 }, "sog": 6.0, "cog": 180.02, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.82454908, - "longitude": 10.490654 + "lat": 58.82454908, + "lon": 10.490654 } }, { "position": { - "latitude": 58.80785114, - "longitude": 10.49064091 + "lat": 58.80785114, + "lon": 10.49064091 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.75563868, - "longitude": 10.40539249 + "lat": 58.75563868, + "lon": 10.40539249 }, "sog": 12.1, "cog": 51.28, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.75563868, - "longitude": 10.40539249 + "lat": 58.75563868, + "lon": 10.40539249 } }, { "position": { - "latitude": 58.77652842, - "longitude": 10.45554675 + "lat": 58.77652842, + "lon": 10.45554675 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.72339191, - "longitude": 10.45469348 + "lat": 58.72339191, + "lon": 10.45469348 }, "sog": 16.9, "cog": 15.41, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.72339191, - "longitude": 10.45469348 + "lat": 58.72339191, + "lon": 10.45469348 } }, { "position": { - "latitude": 58.76856857, - "longitude": 10.4786667 + "lat": 58.76856857, + "lon": 10.4786667 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_32.json b/data/baseline_situations_generated/traffic_situation_32.json index 5939a09..b88c287 100644 --- a/data/baseline_situations_generated/traffic_situation_32.json +++ b/data/baseline_situations_generated/traffic_situation_32.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.81915367, - "longitude": 10.48878772 + "lat": 58.81915367, + "lon": 10.48878772 }, "sog": 5.1, "cog": 178.02, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.81915367, - "longitude": 10.48878772 + "lat": 58.81915367, + "lon": 10.48878772 } }, { "position": { - "latitude": 58.80515733, - "longitude": 10.48972006 + "lat": 58.80515733, + "lon": 10.48972006 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.75045872, - "longitude": 10.42194711 + "lat": 58.75045872, + "lon": 10.42194711 }, "sog": 13.0, "cog": 41.25, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.75045872, - "longitude": 10.42194711 + "lat": 58.75045872, + "lon": 10.42194711 } }, { "position": { - "latitude": 58.77759071, - "longitude": 10.46775274 + "lat": 58.77759071, + "lon": 10.46775274 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_33.json b/data/baseline_situations_generated/traffic_situation_33.json index 4f8baae..0313405 100644 --- a/data/baseline_situations_generated/traffic_situation_33.json +++ b/data/baseline_situations_generated/traffic_situation_33.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.84318613, - "longitude": 10.49868939 + "lat": 58.84318613, + "lon": 10.49868939 }, "sog": 11.1, "cog": 184.61, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.84318613, - "longitude": 10.49868939 + "lat": 58.84318613, + "lon": 10.49868939 } }, { "position": { - "latitude": 58.81258267, - "longitude": 10.49394251 + "lat": 58.81258267, + "lon": 10.49394251 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_34.json b/data/baseline_situations_generated/traffic_situation_34.json index bd30cc3..08ff7b9 100644 --- a/data/baseline_situations_generated/traffic_situation_34.json +++ b/data/baseline_situations_generated/traffic_situation_34.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.85233408, - "longitude": 10.48168547 + "lat": 58.85233408, + "lon": 10.48168547 }, "sog": 13.0, "cog": 175.67, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.85233408, - "longitude": 10.48168547 + "lat": 58.85233408, + "lon": 10.48168547 } }, { "position": { - "latitude": 58.81634806, - "longitude": 10.48693168 + "lat": 58.81634806, + "lon": 10.48693168 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.76444549, - "longitude": 10.49134522 + "lat": 58.76444549, + "lon": 10.49134522 }, "sog": 6.0, "cog": 359.24, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.76444549, - "longitude": 10.49134522 + "lat": 58.76444549, + "lon": 10.49134522 } }, { "position": { - "latitude": 58.78114197, - "longitude": 10.49092143 + "lat": 58.78114197, + "lon": 10.49092143 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.7293888, - "longitude": 10.49639109 + "lat": 58.7293888, + "lon": 10.49639109 }, "sog": 15.9, "cog": 357.24, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.7293888, - "longitude": 10.49639109 + "lat": 58.7293888, + "lon": 10.49639109 } }, { "position": { - "latitude": 58.77350627, - "longitude": 10.49229598 + "lat": 58.77350627, + "lon": 10.49229598 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_35.json b/data/baseline_situations_generated/traffic_situation_35.json index 879cf26..abeb67e 100644 --- a/data/baseline_situations_generated/traffic_situation_35.json +++ b/data/baseline_situations_generated/traffic_situation_35.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.84160611, - "longitude": 10.49590724 + "lat": 58.84160611, + "lon": 10.49590724 }, "sog": 13.0, "cog": 183.12, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.84160611, - "longitude": 10.49590724 + "lat": 58.84160611, + "lon": 10.49590724 } }, { "position": { - "latitude": 58.80557042, - "longitude": 10.49212958 + "lat": 58.80557042, + "lon": 10.49212958 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.71040164, - "longitude": 10.53826151 + "lat": 58.71040164, + "lon": 10.53826151 }, "sog": 19.1, "cog": 342.97, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.71040164, - "longitude": 10.53826151 + "lat": 58.71040164, + "lon": 10.53826151 } }, { "position": { - "latitude": 58.76087471, - "longitude": 10.50850741 + "lat": 58.76087471, + "lon": 10.50850741 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.71695513, - "longitude": 10.50643101 + "lat": 58.71695513, + "lon": 10.50643101 }, "sog": 15.0, "cog": 353.69, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.71695513, - "longitude": 10.50643101 + "lat": 58.71695513, + "lon": 10.50643101 } }, { "position": { - "latitude": 58.75817912, - "longitude": 10.4976521 + "lat": 58.75817912, + "lon": 10.4976521 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_36.json b/data/baseline_situations_generated/traffic_situation_36.json index 08d4bf2..4704a04 100644 --- a/data/baseline_situations_generated/traffic_situation_36.json +++ b/data/baseline_situations_generated/traffic_situation_36.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.84495467, - "longitude": 10.53269722 + "lat": 58.84495467, + "lon": 10.53269722 }, "sog": 15.0, "cog": 202.08, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.84495467, - "longitude": 10.53269722 + "lat": 58.84495467, + "lon": 10.53269722 } }, { "position": { - "latitude": 58.80652158, - "longitude": 10.50268415 + "lat": 58.80652158, + "lon": 10.50268415 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.83445113, - "longitude": 10.58635288 + "lat": 58.83445113, + "lon": 10.58635288 }, "sog": 14.0, "cog": 228.95, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.83445113, - "longitude": 10.58635288 + "lat": 58.83445113, + "lon": 10.58635288 } }, { "position": { - "latitude": 58.80898413, - "longitude": 10.53005219 + "lat": 58.80898413, + "lon": 10.53005219 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.75851144, - "longitude": 10.53539297 + "lat": 58.75851144, + "lon": 10.53539297 }, "sog": 12.1, "cog": 324.52, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.75851144, - "longitude": 10.53539297 + "lat": 58.75851144, + "lon": 10.53539297 } }, { "position": { - "latitude": 58.78570742, - "longitude": 10.49808486 + "lat": 58.78570742, + "lon": 10.49808486 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_37.json b/data/baseline_situations_generated/traffic_situation_37.json index 7923189..dbffc50 100644 --- a/data/baseline_situations_generated/traffic_situation_37.json +++ b/data/baseline_situations_generated/traffic_situation_37.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.76932919, - "longitude": 10.62003238 + "lat": 58.76932919, + "lon": 10.62003238 }, "sog": 15.9, "cog": 287.97, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.76932919, - "longitude": 10.62003238 + "lat": 58.76932919, + "lon": 10.62003238 } }, { "position": { - "latitude": 58.78295504, - "longitude": 10.53915956 + "lat": 58.78295504, + "lon": 10.53915956 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.81748388, - "longitude": 10.59466475 + "lat": 58.81748388, + "lon": 10.59466475 }, "sog": 12.1, "cog": 244.02, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.81748388, - "longitude": 10.59466475 + "lat": 58.81748388, + "lon": 10.59466475 } }, { "position": { - "latitude": 58.802856, - "longitude": 10.53687631 + "lat": 58.802856, + "lon": 10.53687631 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.75193999, - "longitude": 10.40794999 + "lat": 58.75193999, + "lon": 10.40794999 }, "sog": 14.0, "cog": 47.61, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.75193999, - "longitude": 10.40794999 + "lat": 58.75193999, + "lon": 10.40794999 } }, { "position": { - "latitude": 58.7780846, - "longitude": 10.46308791 + "lat": 58.7780846, + "lon": 10.46308791 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_38.json b/data/baseline_situations_generated/traffic_situation_38.json index 17848a8..58e2665 100644 --- a/data/baseline_situations_generated/traffic_situation_38.json +++ b/data/baseline_situations_generated/traffic_situation_38.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.85631106, - "longitude": 10.5189593 + "lat": 58.85631106, + "lon": 10.5189593 }, "sog": 12.1, "cog": 192.74, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.85631106, - "longitude": 10.5189593 + "lat": 58.85631106, + "lon": 10.5189593 } }, { "position": { - "latitude": 58.82373776, - "longitude": 10.50477984 + "lat": 58.82373776, + "lon": 10.50477984 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.82181995, - "longitude": 10.60301119 + "lat": 58.82181995, + "lon": 10.60301119 }, "sog": 14.0, "cog": 242.3, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.82181995, - "longitude": 10.60301119 + "lat": 58.82181995, + "lon": 10.60301119 } }, { "position": { - "latitude": 58.80379462, - "longitude": 10.53691303 + "lat": 58.80379462, + "lon": 10.53691303 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.77098103, - "longitude": 10.49592452 + "lat": 58.77098103, + "lon": 10.49592452 }, "sog": 4.1, "cog": 352.25, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.77098103, - "longitude": 10.49592452 + "lat": 58.77098103, + "lon": 10.49592452 } }, { "position": { - "latitude": 58.78218933, - "longitude": 10.49299005 + "lat": 58.78218933, + "lon": 10.49299005 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_39.json b/data/baseline_situations_generated/traffic_situation_39.json index d1d314a..96bca6a 100644 --- a/data/baseline_situations_generated/traffic_situation_39.json +++ b/data/baseline_situations_generated/traffic_situation_39.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.87899691, - "longitude": 10.52986324 + "lat": 58.87899691, + "lon": 10.52986324 }, "sog": 18.1, "cog": 193.03, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.87899691, - "longitude": 10.52986324 + "lat": 58.87899691, + "lon": 10.52986324 } }, { "position": { - "latitude": 58.83019281, - "longitude": 10.50812407 + "lat": 58.83019281, + "lon": 10.50812407 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.77486823, - "longitude": 10.61533211 + "lat": 58.77486823, + "lon": 10.61533211 }, "sog": 12.1, "cog": 284.13, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.77486823, - "longitude": 10.61533211 + "lat": 58.77486823, + "lon": 10.61533211 } }, { "position": { - "latitude": 58.7830208, - "longitude": 10.55299388 + "lat": 58.7830208, + "lon": 10.55299388 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.71663194, - "longitude": 10.47475603 + "lat": 58.71663194, + "lon": 10.47475603 }, "sog": 16.9, "cog": 6.3, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.71663194, - "longitude": 10.47475603 + "lat": 58.71663194, + "lon": 10.47475603 } }, { "position": { - "latitude": 58.76321066, - "longitude": 10.48465844 + "lat": 58.76321066, + "lon": 10.48465844 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_40.json b/data/baseline_situations_generated/traffic_situation_40.json index 13d92e7..4661e8a 100644 --- a/data/baseline_situations_generated/traffic_situation_40.json +++ b/data/baseline_situations_generated/traffic_situation_40.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.82287031, - "longitude": 10.51082023 + "lat": 58.82287031, + "lon": 10.51082023 }, "sog": 6.0, "cog": 198.3, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.82287031, - "longitude": 10.51082023 + "lat": 58.82287031, + "lon": 10.51082023 } }, { "position": { - "latitude": 58.80701693, - "longitude": 10.50072766 + "lat": 58.80701693, + "lon": 10.50072766 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.7798417, - "longitude": 10.37290533 + "lat": 58.7798417, + "lon": 10.37290533 }, "sog": 15.0, "cog": 79.53, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.7798417, - "longitude": 10.37290533 + "lat": 58.7798417, + "lon": 10.37290533 } }, { "position": { - "latitude": 58.78738112, - "longitude": 10.45141067 + "lat": 58.78738112, + "lon": 10.45141067 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.74116713, - "longitude": 10.24739775 + "lat": 58.74116713, + "lon": 10.24739775 }, "sog": 16.9, "cog": 68.41, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.74116713, - "longitude": 10.24739775 + "lat": 58.74116713, + "lon": 10.24739775 } }, { "position": { - "latitude": 58.75840968, - "longitude": 10.33127351 + "lat": 58.75840968, + "lon": 10.33127351 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_41.json b/data/baseline_situations_generated/traffic_situation_41.json index 18caeb1..a5cd0bb 100644 --- a/data/baseline_situations_generated/traffic_situation_41.json +++ b/data/baseline_situations_generated/traffic_situation_41.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.79163799, - "longitude": 10.69314577 + "lat": 58.79163799, + "lon": 10.69314577 }, "sog": 18.1, "cog": 269.75, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.79163799, - "longitude": 10.69314577 + "lat": 58.79163799, + "lon": 10.69314577 } }, { "position": { - "latitude": 58.79141813, - "longitude": 10.59672205 + "lat": 58.79141813, + "lon": 10.59672205 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.83445113, - "longitude": 10.39495512 + "lat": 58.83445113, + "lon": 10.39495512 }, "sog": 14.0, "cog": 131.04, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.83445113, - "longitude": 10.39495512 + "lat": 58.83445113, + "lon": 10.39495512 } }, { "position": { - "latitude": 58.80898955, - "longitude": 10.4512649 + "lat": 58.80898955, + "lon": 10.4512649 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.72339191, - "longitude": 10.45469348 + "lat": 58.72339191, + "lon": 10.45469348 }, "sog": 16.9, "cog": 15.41, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.72339191, - "longitude": 10.45469348 + "lat": 58.72339191, + "lon": 10.45469348 } }, { "position": { - "latitude": 58.76856857, - "longitude": 10.4786667 + "lat": 58.76856857, + "lon": 10.4786667 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_42.json b/data/baseline_situations_generated/traffic_situation_42.json index 7c2fb18..cac3095 100644 --- a/data/baseline_situations_generated/traffic_situation_42.json +++ b/data/baseline_situations_generated/traffic_situation_42.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.80563373, - "longitude": 10.57185462 + "lat": 58.80563373, + "lon": 10.57185462 }, "sog": 8.9, "cog": 251.07, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.80563373, - "longitude": 10.57185462 + "lat": 58.80563373, + "lon": 10.57185462 } }, { "position": { - "latitude": 58.79759561, - "longitude": 10.52674017 + "lat": 58.79759561, + "lon": 10.52674017 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.818229, - "longitude": 10.3649909 + "lat": 58.818229, + "lon": 10.3649909 }, "sog": 15.9, "cog": 112.53, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.818229, - "longitude": 10.3649909 + "lat": 58.818229, + "lon": 10.3649909 } }, { "position": { - "latitude": 58.80130577, - "longitude": 10.44352233 + "lat": 58.80130577, + "lon": 10.44352233 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.7729381, - "longitude": 10.5034415 + "lat": 58.7729381, + "lon": 10.5034415 }, "sog": 7.0, "cog": 339.99, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.7729381, - "longitude": 10.5034415 + "lat": 58.7729381, + "lon": 10.5034415 } }, { "position": { - "latitude": 58.79115902, - "longitude": 10.49067118 + "lat": 58.79115902, + "lon": 10.49067118 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_43.json b/data/baseline_situations_generated/traffic_situation_43.json index af321b4..8a4f3a3 100644 --- a/data/baseline_situations_generated/traffic_situation_43.json +++ b/data/baseline_situations_generated/traffic_situation_43.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.83964904, - "longitude": 10.55904984 + "lat": 58.83964904, + "lon": 10.55904984 }, "sog": 12.1, "cog": 216.23, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.83964904, - "longitude": 10.55904984 + "lat": 58.83964904, + "lon": 10.55904984 } }, { "position": { - "latitude": 58.8127117, - "longitude": 10.52105285 + "lat": 58.8127117, + "lon": 10.52105285 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_44.json b/data/baseline_situations_generated/traffic_situation_44.json index 6feac13..31ce397 100644 --- a/data/baseline_situations_generated/traffic_situation_44.json +++ b/data/baseline_situations_generated/traffic_situation_44.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.81472782, - "longitude": 10.70233895 + "lat": 58.81472782, + "lon": 10.70233895 }, "sog": 14.0, "cog": 257.89, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.81472782, - "longitude": 10.70233895 + "lat": 58.81472782, + "lon": 10.70233895 } }, { "position": { - "latitude": 58.80659059, - "longitude": 10.62934931 + "lat": 58.80659059, + "lon": 10.62934931 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.7293888, - "longitude": 10.49639109 + "lat": 58.7293888, + "lon": 10.49639109 }, "sog": 15.9, "cog": 357.24, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.7293888, - "longitude": 10.49639109 + "lat": 58.7293888, + "lon": 10.49639109 } }, { "position": { - "latitude": 58.77350627, - "longitude": 10.49229598 + "lat": 58.77350627, + "lon": 10.49229598 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_45.json b/data/baseline_situations_generated/traffic_situation_45.json index 0d7fe81..8b077ae 100644 --- a/data/baseline_situations_generated/traffic_situation_45.json +++ b/data/baseline_situations_generated/traffic_situation_45.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.83655184, - "longitude": 10.55626769 + "lat": 58.83655184, + "lon": 10.55626769 }, "sog": 12.1, "cog": 216.92, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.83655184, - "longitude": 10.55626769 + "lat": 58.83655184, + "lon": 10.55626769 } }, { "position": { - "latitude": 58.80985331, - "longitude": 10.51765124 + "lat": 58.80985331, + "lon": 10.51765124 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.71893913, - "longitude": 10.53060629 + "lat": 58.71893913, + "lon": 10.53060629 }, "sog": 18.1, "cog": 343.95, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.71893913, - "longitude": 10.53060629 + "lat": 58.71893913, + "lon": 10.53060629 } }, { "position": { - "latitude": 58.76707949, - "longitude": 10.50394162 + "lat": 58.76707949, + "lon": 10.50394162 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.70876775, - "longitude": 10.47209485 + "lat": 58.70876775, + "lon": 10.47209485 }, "sog": 15.0, "cog": 6.65, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.70876775, - "longitude": 10.47209485 + "lat": 58.70876775, + "lon": 10.47209485 } }, { "position": { - "latitude": 58.74996453, - "longitude": 10.48133501 + "lat": 58.74996453, + "lon": 10.48133501 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_46.json b/data/baseline_situations_generated/traffic_situation_46.json index 1e72d42..c09a910 100644 --- a/data/baseline_situations_generated/traffic_situation_46.json +++ b/data/baseline_situations_generated/traffic_situation_46.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.82287031, - "longitude": 10.47048777 + "lat": 58.82287031, + "lon": 10.47048777 }, "sog": 6.0, "cog": 161.75, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.82287031, - "longitude": 10.47048777 + "lat": 58.82287031, + "lon": 10.47048777 } }, { "position": { - "latitude": 58.80701266, - "longitude": 10.48055548 + "lat": 58.80701266, + "lon": 10.48055548 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.7798417, - "longitude": 10.37290533 + "lat": 58.7798417, + "lon": 10.37290533 }, "sog": 15.0, "cog": 79.53, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.7798417, - "longitude": 10.37290533 + "lat": 58.7798417, + "lon": 10.37290533 } }, { "position": { - "latitude": 58.78738112, - "longitude": 10.45141067 + "lat": 58.78738112, + "lon": 10.45141067 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.86039577, - "longitude": 10.38291068 + "lat": 58.86039577, + "lon": 10.38291068 }, "sog": 16.9, "cog": 141.06, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.86039577, - "longitude": 10.38291068 + "lat": 58.86039577, + "lon": 10.38291068 } }, { "position": { - "latitude": 58.8239452, - "longitude": 10.43960157 + "lat": 58.8239452, + "lon": 10.43960157 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_47.json b/data/baseline_situations_generated/traffic_situation_47.json index 87b7c37..488cd72 100644 --- a/data/baseline_situations_generated/traffic_situation_47.json +++ b/data/baseline_situations_generated/traffic_situation_47.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.8721741, - "longitude": 10.41448198 + "lat": 58.8721741, + "lon": 10.41448198 }, "sog": 18.1, "cog": 153.95, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.8721741, - "longitude": 10.41448198 + "lat": 58.8721741, + "lon": 10.41448198 } }, { "position": { - "latitude": 58.82716783, - "longitude": 10.4568217 + "lat": 58.82716783, + "lon": 10.4568217 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.81237574, - "longitude": 10.37841778 + "lat": 58.81237574, + "lon": 10.37841778 }, "sog": 14.0, "cog": 110.01, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.81237574, - "longitude": 10.37841778 + "lat": 58.81237574, + "lon": 10.37841778 } }, { "position": { - "latitude": 58.79910639, - "longitude": 10.44856358 + "lat": 58.79910639, + "lon": 10.44856358 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.67733793, - "longitude": 10.44624336 + "lat": 58.67733793, + "lon": 10.44624336 }, "sog": 19.1, "cog": 11.46, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.67733793, - "longitude": 10.44624336 + "lat": 58.67733793, + "lon": 10.44624336 } }, { "position": { - "latitude": 58.72907272, - "longitude": 10.46642991 + "lat": 58.72907272, + "lon": 10.46642991 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_48.json b/data/baseline_situations_generated/traffic_situation_48.json index 24286d5..5ed038e 100644 --- a/data/baseline_situations_generated/traffic_situation_48.json +++ b/data/baseline_situations_generated/traffic_situation_48.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.80948503, - "longitude": 10.40204009 + "lat": 58.80948503, + "lon": 10.40204009 }, "sog": 8.9, "cog": 111.73, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.80948503, - "longitude": 10.40204009 + "lat": 58.80948503, + "lon": 10.40204009 } }, { "position": { - "latitude": 58.80031284, - "longitude": 10.44634581 + "lat": 58.80031284, + "lon": 10.44634581 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.80361382, - "longitude": 10.35674815 + "lat": 58.80361382, + "lon": 10.35674815 }, "sog": 15.9, "cog": 100.15, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.80361382, - "longitude": 10.35674815 + "lat": 58.80361382, + "lon": 10.35674815 } }, { "position": { - "latitude": 58.79582785, - "longitude": 10.44043637 + "lat": 58.79582785, + "lon": 10.44043637 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_49.json b/data/baseline_situations_generated/traffic_situation_49.json index 618a9a8..55e2b68 100644 --- a/data/baseline_situations_generated/traffic_situation_49.json +++ b/data/baseline_situations_generated/traffic_situation_49.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.84858154, - "longitude": 10.41424005 + "lat": 58.84858154, + "lon": 10.41424005 }, "sog": 14.0, "cog": 145.36, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.84858154, - "longitude": 10.41424005 + "lat": 58.84858154, + "lon": 10.41424005 } }, { "position": { - "latitude": 58.81667403, - "longitude": 10.45667389 + "lat": 58.81667403, + "lon": 10.45667389 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_50.json b/data/baseline_situations_generated/traffic_situation_50.json index 7eba51c..04424de 100644 --- a/data/baseline_situations_generated/traffic_situation_50.json +++ b/data/baseline_situations_generated/traffic_situation_50.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.79416063, - "longitude": 10.36388496 + "lat": 58.79416063, + "lon": 10.36388496 }, "sog": 14.0, "cog": 92.59, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.79416063, - "longitude": 10.36388496 + "lat": 58.79416063, + "lon": 10.36388496 } }, { "position": { - "latitude": 58.79240813, - "longitude": 10.43846004 + "lat": 58.79240813, + "lon": 10.43846004 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.70297734, - "longitude": 10.50083216 + "lat": 58.70297734, + "lon": 10.50083216 }, "sog": 15.9, "cog": 356.55, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.70297734, - "longitude": 10.50083216 + "lat": 58.70297734, + "lon": 10.50083216 } }, { "position": { - "latitude": 58.7470661, - "longitude": 10.49571832 + "lat": 58.7470661, + "lon": 10.49571832 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_51.json b/data/baseline_situations_generated/traffic_situation_51.json index 815c5a9..2277838 100644 --- a/data/baseline_situations_generated/traffic_situation_51.json +++ b/data/baseline_situations_generated/traffic_situation_51.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.83744958, - "longitude": 10.42422813 + "lat": 58.83744958, + "lon": 10.42422813 }, "sog": 13.0, "cog": 143.3, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.83744958, - "longitude": 10.42422813 + "lat": 58.83744958, + "lon": 10.42422813 } }, { "position": { - "latitude": 58.80851546, - "longitude": 10.46574665 + "lat": 58.80851546, + "lon": 10.46574665 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.73740561, - "longitude": 10.51403439 + "lat": 58.73740561, + "lon": 10.51403439 }, "sog": 18.1, "cog": 347.27, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.73740561, - "longitude": 10.51403439 + "lat": 58.73740561, + "lon": 10.51403439 } }, { "position": { - "latitude": 58.78626802, - "longitude": 10.49278608 + "lat": 58.78626802, + "lon": 10.49278608 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.70538328, - "longitude": 10.44997593 + "lat": 58.70538328, + "lon": 10.44997593 }, "sog": 15.9, "cog": 13.87, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.70538328, - "longitude": 10.44997593 + "lat": 58.70538328, + "lon": 10.44997593 } }, { "position": { - "latitude": 58.74826496, - "longitude": 10.47035043 + "lat": 58.74826496, + "lon": 10.47035043 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_52.json b/data/baseline_situations_generated/traffic_situation_52.json index 94ffda9..3b0b6a2 100644 --- a/data/baseline_situations_generated/traffic_situation_52.json +++ b/data/baseline_situations_generated/traffic_situation_52.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,17 +25,17 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] }, "targetShips": [] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_53.json b/data/baseline_situations_generated/traffic_situation_53.json index 179506e..d71f81d 100644 --- a/data/baseline_situations_generated/traffic_situation_53.json +++ b/data/baseline_situations_generated/traffic_situation_53.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.69760886, - "longitude": 10.47955998 + "lat": 58.69760886, + "lon": 10.47955998 }, "sog": 16.9, "cog": 3.55, @@ -61,17 +61,17 @@ "waypoints": [ { "position": { - "latitude": 58.69760886, - "longitude": 10.47955998 + "lat": 58.69760886, + "lon": 10.47955998 } }, { "position": { - "latitude": 58.74438077, - "longitude": 10.48514903 + "lat": 58.74438077, + "lon": 10.48514903 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_54.json b/data/baseline_situations_generated/traffic_situation_54.json index 17f26e2..7bb92d8 100644 --- a/data/baseline_situations_generated/traffic_situation_54.json +++ b/data/baseline_situations_generated/traffic_situation_54.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.71434271, - "longitude": 10.53471903 + "lat": 58.71434271, + "lon": 10.53471903 }, "sog": 18.1, "cog": 343.43, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.71434271, - "longitude": 10.53471903 + "lat": 58.71434271, + "lon": 10.53471903 } }, { "position": { - "latitude": 58.76235644, - "longitude": 10.50722147 + "lat": 58.76235644, + "lon": 10.50722147 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.70365064, - "longitude": 10.4487663 + "lat": 58.70365064, + "lon": 10.4487663 }, "sog": 18.1, "cog": 13.98, @@ -96,17 +96,17 @@ "waypoints": [ { "position": { - "latitude": 58.70365064, - "longitude": 10.4487663 + "lat": 58.70365064, + "lon": 10.4487663 } }, { "position": { - "latitude": 58.75226064, - "longitude": 10.47206115 + "lat": 58.75226064, + "lon": 10.47206115 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_generated/traffic_situation_55.json b/data/baseline_situations_generated/traffic_situation_55.json index 1cf8c59..8b02da8 100644 --- a/data/baseline_situations_generated/traffic_situation_55.json +++ b/data/baseline_situations_generated/traffic_situation_55.json @@ -14,8 +14,8 @@ }, "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -25,14 +25,14 @@ "waypoints": [ { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, { "position": { - "latitude": 58.7911568, - "longitude": 10.490654 + "lat": 58.7911568, + "lon": 10.490654 } } ] @@ -50,8 +50,8 @@ }, "initial": { "position": { - "latitude": 58.70727751, - "longitude": 10.50971429 + "lat": 58.70727751, + "lon": 10.50971429 }, "sog": 19.1, "cog": 353.29, @@ -61,14 +61,14 @@ "waypoints": [ { "position": { - "latitude": 58.70727751, - "longitude": 10.50971429 + "lat": 58.70727751, + "lon": 10.50971429 } }, { "position": { - "latitude": 58.75970249, - "longitude": 10.49783446 + "lat": 58.75970249, + "lon": 10.49783446 } } ] @@ -85,8 +85,8 @@ }, "initial": { "position": { - "latitude": 58.70976424, - "longitude": 10.53884905 + "lat": 58.70976424, + "lon": 10.53884905 }, "sog": 18.1, "cog": 342.92, @@ -96,14 +96,14 @@ "waypoints": [ { "position": { - "latitude": 58.70976424, - "longitude": 10.53884905 + "lat": 58.70976424, + "lon": 10.53884905 } }, { "position": { - "latitude": 58.75764747, - "longitude": 10.51052083 + "lat": 58.75764747, + "lon": 10.51052083 } } ] @@ -120,8 +120,8 @@ }, "initial": { "position": { - "latitude": 58.7002931, - "longitude": 10.44641617 + "lat": 58.7002931, + "lon": 10.44641617 }, "sog": 16.9, "cog": 14.21, @@ -131,17 +131,17 @@ "waypoints": [ { "position": { - "latitude": 58.7002931, - "longitude": 10.44641617 + "lat": 58.7002931, + "lon": 10.44641617 } }, { "position": { - "latitude": 58.74572132, - "longitude": 10.46855808 + "lat": 58.74572132, + "lon": 10.46855808 } } ] } ] -} \ No newline at end of file +} diff --git a/data/baseline_situations_input/baseline_situation_01_1_ts.json b/data/baseline_situations_input/baseline_situation_01_1_ts.json index aedb77f..ce339cd 100644 --- a/data/baseline_situations_input/baseline_situation_01_1_ts.json +++ b/data/baseline_situations_input/baseline_situation_01_1_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_02_1_ts.json b/data/baseline_situations_input/baseline_situation_02_1_ts.json index 20f061b..00fb1f5 100644 --- a/data/baseline_situations_input/baseline_situation_02_1_ts.json +++ b/data/baseline_situations_input/baseline_situation_02_1_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_03_1_ts.json b/data/baseline_situations_input/baseline_situation_03_1_ts.json index c8863de..5d4fd1b 100644 --- a/data/baseline_situations_input/baseline_situation_03_1_ts.json +++ b/data/baseline_situations_input/baseline_situation_03_1_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_04_1_ts.json b/data/baseline_situations_input/baseline_situation_04_1_ts.json index 987ea46..6cd8700 100644 --- a/data/baseline_situations_input/baseline_situation_04_1_ts.json +++ b/data/baseline_situations_input/baseline_situation_04_1_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_05_1_ts.json b/data/baseline_situations_input/baseline_situation_05_1_ts.json index d85a6f1..2d594bc 100644 --- a/data/baseline_situations_input/baseline_situation_05_1_ts.json +++ b/data/baseline_situations_input/baseline_situation_05_1_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_06_2_ts.json b/data/baseline_situations_input/baseline_situation_06_2_ts.json index d35546e..caeb0fb 100644 --- a/data/baseline_situations_input/baseline_situation_06_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_06_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_07_2_ts.json b/data/baseline_situations_input/baseline_situation_07_2_ts.json index a0383d4..e7e2bf0 100644 --- a/data/baseline_situations_input/baseline_situation_07_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_07_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_08_2_ts.json b/data/baseline_situations_input/baseline_situation_08_2_ts.json index a2b29b0..60c0082 100644 --- a/data/baseline_situations_input/baseline_situation_08_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_08_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_09_2_ts.json b/data/baseline_situations_input/baseline_situation_09_2_ts.json index d73b69c..e545d0b 100644 --- a/data/baseline_situations_input/baseline_situation_09_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_09_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_10_2_ts.json b/data/baseline_situations_input/baseline_situation_10_2_ts.json index efb22c7..1c229a3 100644 --- a/data/baseline_situations_input/baseline_situation_10_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_10_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_11_2_ts.json b/data/baseline_situations_input/baseline_situation_11_2_ts.json index c3a73f3..5ad0bb4 100644 --- a/data/baseline_situations_input/baseline_situation_11_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_11_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_12_2_ts.json b/data/baseline_situations_input/baseline_situation_12_2_ts.json index e7150df..36fe6c8 100644 --- a/data/baseline_situations_input/baseline_situation_12_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_12_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_13_2_ts.json b/data/baseline_situations_input/baseline_situation_13_2_ts.json index 14eca11..3088432 100644 --- a/data/baseline_situations_input/baseline_situation_13_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_13_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_14_2_ts.json b/data/baseline_situations_input/baseline_situation_14_2_ts.json index 6c11eb7..343c883 100644 --- a/data/baseline_situations_input/baseline_situation_14_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_14_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_15_2_ts.json b/data/baseline_situations_input/baseline_situation_15_2_ts.json index ac07975..eae255a 100644 --- a/data/baseline_situations_input/baseline_situation_15_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_15_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_16_2_ts.json b/data/baseline_situations_input/baseline_situation_16_2_ts.json index 786fb31..15aca52 100644 --- a/data/baseline_situations_input/baseline_situation_16_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_16_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_17_2_ts.json b/data/baseline_situations_input/baseline_situation_17_2_ts.json index 077438c..702b712 100644 --- a/data/baseline_situations_input/baseline_situation_17_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_17_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_18_2_ts.json b/data/baseline_situations_input/baseline_situation_18_2_ts.json index ea4c3e1..81c0cbb 100644 --- a/data/baseline_situations_input/baseline_situation_18_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_18_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_19_2_ts.json b/data/baseline_situations_input/baseline_situation_19_2_ts.json index 2c11539..19f94d7 100644 --- a/data/baseline_situations_input/baseline_situation_19_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_19_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_20_2_ts.json b/data/baseline_situations_input/baseline_situation_20_2_ts.json index f908edc..1b71cf3 100644 --- a/data/baseline_situations_input/baseline_situation_20_2_ts.json +++ b/data/baseline_situations_input/baseline_situation_20_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_21_3_ts.json b/data/baseline_situations_input/baseline_situation_21_3_ts.json index 0d0cd7b..180ae8d 100644 --- a/data/baseline_situations_input/baseline_situation_21_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_21_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_22_3_ts.json b/data/baseline_situations_input/baseline_situation_22_3_ts.json index 5377893..1b34fd6 100644 --- a/data/baseline_situations_input/baseline_situation_22_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_22_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_23_3_ts.json b/data/baseline_situations_input/baseline_situation_23_3_ts.json index 54c9b93..59050ef 100644 --- a/data/baseline_situations_input/baseline_situation_23_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_23_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_24_3_ts.json b/data/baseline_situations_input/baseline_situation_24_3_ts.json index 35f041e..40d7dd0 100644 --- a/data/baseline_situations_input/baseline_situation_24_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_24_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_25_3_ts.json b/data/baseline_situations_input/baseline_situation_25_3_ts.json index d921884..e23478e 100644 --- a/data/baseline_situations_input/baseline_situation_25_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_25_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_26_3_ts.json b/data/baseline_situations_input/baseline_situation_26_3_ts.json index 99dec7e..47e40af 100644 --- a/data/baseline_situations_input/baseline_situation_26_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_26_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_27_3_ts.json b/data/baseline_situations_input/baseline_situation_27_3_ts.json index c88b8ab..71876d5 100644 --- a/data/baseline_situations_input/baseline_situation_27_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_27_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_28_3_ts.json b/data/baseline_situations_input/baseline_situation_28_3_ts.json index d3dd2ac..26f51f3 100644 --- a/data/baseline_situations_input/baseline_situation_28_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_28_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_29_3_ts.json b/data/baseline_situations_input/baseline_situation_29_3_ts.json index 569ff81..e985255 100644 --- a/data/baseline_situations_input/baseline_situation_29_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_29_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_30_3_ts.json b/data/baseline_situations_input/baseline_situation_30_3_ts.json index 7ad7abd..ce640df 100644 --- a/data/baseline_situations_input/baseline_situation_30_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_30_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_31_3_ts.json b/data/baseline_situations_input/baseline_situation_31_3_ts.json index 3f62120..3f72548 100644 --- a/data/baseline_situations_input/baseline_situation_31_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_31_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_32_3_ts.json b/data/baseline_situations_input/baseline_situation_32_3_ts.json index d594ab9..8010f5a 100644 --- a/data/baseline_situations_input/baseline_situation_32_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_32_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_33_3_ts.json b/data/baseline_situations_input/baseline_situation_33_3_ts.json index a6d171f..cc67ade 100644 --- a/data/baseline_situations_input/baseline_situation_33_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_33_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_34_3_ts.json b/data/baseline_situations_input/baseline_situation_34_3_ts.json index 07f8487..1161b17 100644 --- a/data/baseline_situations_input/baseline_situation_34_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_34_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_35_3_ts.json b/data/baseline_situations_input/baseline_situation_35_3_ts.json index cd25e45..435e635 100644 --- a/data/baseline_situations_input/baseline_situation_35_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_35_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_36_3_ts.json b/data/baseline_situations_input/baseline_situation_36_3_ts.json index 771f5c0..d3637cf 100644 --- a/data/baseline_situations_input/baseline_situation_36_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_36_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_37_3_ts.json b/data/baseline_situations_input/baseline_situation_37_3_ts.json index 39c340a..6fe9e25 100644 --- a/data/baseline_situations_input/baseline_situation_37_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_37_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_38_3_ts.json b/data/baseline_situations_input/baseline_situation_38_3_ts.json index 99be6e2..7c8e83b 100644 --- a/data/baseline_situations_input/baseline_situation_38_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_38_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_39_3_ts.json b/data/baseline_situations_input/baseline_situation_39_3_ts.json index d43828b..3de4172 100644 --- a/data/baseline_situations_input/baseline_situation_39_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_39_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_40_3_ts.json b/data/baseline_situations_input/baseline_situation_40_3_ts.json index fe392d7..7ca23ae 100644 --- a/data/baseline_situations_input/baseline_situation_40_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_40_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_41_3_ts.json b/data/baseline_situations_input/baseline_situation_41_3_ts.json index c2a8ad0..0d2b41e 100644 --- a/data/baseline_situations_input/baseline_situation_41_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_41_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_42_3_ts.json b/data/baseline_situations_input/baseline_situation_42_3_ts.json index af10dea..0fc4234 100644 --- a/data/baseline_situations_input/baseline_situation_42_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_42_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_43_3_ts.json b/data/baseline_situations_input/baseline_situation_43_3_ts.json index f244b21..de9b4c6 100644 --- a/data/baseline_situations_input/baseline_situation_43_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_43_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_44_3_ts.json b/data/baseline_situations_input/baseline_situation_44_3_ts.json index 2c35e46..d2f6780 100644 --- a/data/baseline_situations_input/baseline_situation_44_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_44_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_45_3_ts.json b/data/baseline_situations_input/baseline_situation_45_3_ts.json index eb3914b..9b48094 100644 --- a/data/baseline_situations_input/baseline_situation_45_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_45_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_46_3_ts.json b/data/baseline_situations_input/baseline_situation_46_3_ts.json index db88394..d03f60e 100644 --- a/data/baseline_situations_input/baseline_situation_46_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_46_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_47_3_ts.json b/data/baseline_situations_input/baseline_situation_47_3_ts.json index 501dd01..9016279 100644 --- a/data/baseline_situations_input/baseline_situation_47_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_47_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_48_3_ts.json b/data/baseline_situations_input/baseline_situation_48_3_ts.json index c8538b9..beab07d 100644 --- a/data/baseline_situations_input/baseline_situation_48_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_48_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_49_3_ts.json b/data/baseline_situations_input/baseline_situation_49_3_ts.json index ce20887..6b3101b 100644 --- a/data/baseline_situations_input/baseline_situation_49_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_49_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_50_3_ts.json b/data/baseline_situations_input/baseline_situation_50_3_ts.json index 5c24d2a..a57b956 100644 --- a/data/baseline_situations_input/baseline_situation_50_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_50_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_51_3_ts.json b/data/baseline_situations_input/baseline_situation_51_3_ts.json index b6bf664..8e158cb 100644 --- a/data/baseline_situations_input/baseline_situation_51_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_51_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_52_3_ts.json b/data/baseline_situations_input/baseline_situation_52_3_ts.json index 2652ccb..10be327 100644 --- a/data/baseline_situations_input/baseline_situation_52_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_52_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_53_3_ts.json b/data/baseline_situations_input/baseline_situation_53_3_ts.json index 31c5cf2..89ea1e2 100644 --- a/data/baseline_situations_input/baseline_situation_53_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_53_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_54_3_ts.json b/data/baseline_situations_input/baseline_situation_54_3_ts.json index dabc18d..e96deac 100644 --- a/data/baseline_situations_input/baseline_situation_54_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_54_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/baseline_situations_input/baseline_situation_55_3_ts.json b/data/baseline_situations_input/baseline_situation_55_3_ts.json index 88eb0b0..56e4424 100644 --- a/data/baseline_situations_input/baseline_situation_55_3_ts.json +++ b/data/baseline_situations_input/baseline_situation_55_3_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, diff --git a/data/example_situations_input/example_several_situations_01_1_ts.json b/data/example_situations_input/example_several_situations_01_1_ts.json index 12056bc..5057f9a 100644 --- a/data/example_situations_input/example_several_situations_01_1_ts.json +++ b/data/example_situations_input/example_several_situations_01_1_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 7.0, "cog": 0.0, @@ -18,4 +18,4 @@ "desiredEncounterType": "overtaking-give-ay" } ] -} \ No newline at end of file +} diff --git a/data/example_situations_input/example_several_situations_02_2_ts.json b/data/example_situations_input/example_several_situations_02_2_ts.json index 11d1e89..71180d9 100644 --- a/data/example_situations_input/example_several_situations_02_2_ts.json +++ b/data/example_situations_input/example_several_situations_02_2_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 7.0, "cog": 0.0, @@ -21,4 +21,4 @@ "desiredEncounterType": "crossing-give-way" } ] -} \ No newline at end of file +} diff --git a/data/example_situations_input/example_situation_01_1_ts.json b/data/example_situations_input/example_situation_01_1_ts.json index fcf0e4e..4cd151b 100644 --- a/data/example_situations_input/example_situation_01_1_ts.json +++ b/data/example_situations_input/example_situation_01_1_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 270.0, @@ -19,4 +19,4 @@ "vectorTime": 20.0 } ] -} \ No newline at end of file +} diff --git a/data/example_situations_input/example_situation_02_1_ts.json b/data/example_situations_input/example_situation_02_1_ts.json index c7c827e..5bd37d1 100644 --- a/data/example_situations_input/example_situation_02_1_ts.json +++ b/data/example_situations_input/example_situation_02_1_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -17,4 +17,4 @@ "desiredEncounterType": "crossing-give-way" } ] -} \ No newline at end of file +} diff --git a/data/example_situations_input/example_situation_03_1_ts.json b/data/example_situations_input/example_situation_03_1_ts.json index 35785f5..0f9c3d1 100644 --- a/data/example_situations_input/example_situation_03_1_ts.json +++ b/data/example_situations_input/example_situation_03_1_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -17,4 +17,4 @@ "desiredEncounterType": "crossing-stand-on" } ] -} \ No newline at end of file +} diff --git a/data/example_situations_input/example_situation_04_1_ts.json b/data/example_situations_input/example_situation_04_1_ts.json index 091ee0f..17dc69f 100644 --- a/data/example_situations_input/example_situation_04_1_ts.json +++ b/data/example_situations_input/example_situation_04_1_ts.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 7.0, "cog": 0.0, @@ -17,4 +17,4 @@ "desiredEncounterType": "overtaking-give-way" } ] -} \ No newline at end of file +} diff --git a/data/own_ship/own_ship.json b/data/own_ship/own_ship.json index cbab8f4..d2a120a 100644 --- a/data/own_ship/own_ship.json +++ b/data/own_ship/own_ship.json @@ -1,8 +1,10 @@ { - "length": 122, - "width": 20, - "height": 8, - "speedMax": 17, + "dimensions": { + "length": 122, + "width": 20, + "height": 8 + }, + "sogMax": 17, "mmsi": 257847600, "name": "BASTO VI", "shipType": "Passenger" diff --git a/data/target_ships/target_ship_1.json b/data/target_ships/target_ship_1.json index e4dc5bb..341b373 100644 --- a/data/target_ships/target_ship_1.json +++ b/data/target_ships/target_ship_1.json @@ -1,7 +1,9 @@ { - "length": 122, - "width": 20, - "height": 8, - "speedMax": 17, + "dimensions": { + "length": 122, + "width": 20, + "height": 8 + }, + "sogMax": 17, "shipType": "Passenger" } diff --git a/data/target_ships/target_ship_2.json b/data/target_ships/target_ship_2.json index d4ea8b3..fca848a 100644 --- a/data/target_ships/target_ship_2.json +++ b/data/target_ships/target_ship_2.json @@ -1,7 +1,9 @@ { - "length": 50, - "width": 10, - "height": 8, - "speedMax": 15, + "dimensions": { + "length": 50, + "width": 10, + "height": 8 + }, + "sogMax": 15, "shipType": "Cargo" } diff --git a/data/target_ships/target_ship_3.json b/data/target_ships/target_ship_3.json index 41d8619..106cc7b 100644 --- a/data/target_ships/target_ship_3.json +++ b/data/target_ships/target_ship_3.json @@ -1,7 +1,9 @@ { - "length": 178, - "width": 30, - "height": 30, - "speedMax": 21, + "dimensions": { + "length": 178, + "width": 30, + "height": 30 + }, + "sogMax": 21, "shipType": "Passenger" } diff --git a/docs/input_files.rst b/docs/input_files.rst index 8d6383c..335aa5b 100644 --- a/docs/input_files.rst +++ b/docs/input_files.rst @@ -10,8 +10,8 @@ Example 1: Complete specified situation:: "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -61,8 +61,8 @@ Example 2: Minimum specified situation:: "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -89,8 +89,8 @@ Example 3: Generate multiple situations using `numSituations`:: "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 0.0, @@ -116,8 +116,8 @@ Example 4: Assign range for `beta`:: "speed": 7.0, "course": 0.0, "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 } }, "encounter": [ diff --git a/pyproject.toml b/pyproject.toml index e9b178c..68511c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "trafficgen" -version = "0.5.0" +version = "0.7.0" description = "Automatic generation of ship traffic situations from a set of predefined situations" authors = ["Tom Arne Pedersen "] license = "MIT License" @@ -17,7 +17,7 @@ basemap-data-hires = "^1.3.2" global-land-mask = "^1.0.0" folium = "^0.14.0" pydantic = "^2.5" -maritime-schema = "^0.0.6" + [tool.poetry.group.dev] optional = true diff --git a/src/trafficgen/check_land_crossing.py b/src/trafficgen/check_land_crossing.py index 133db1c..d0912fa 100644 --- a/src/trafficgen/check_land_crossing.py +++ b/src/trafficgen/check_land_crossing.py @@ -1,23 +1,23 @@ """Module with helper functions to determine if a generated path is crossing land.""" from global_land_mask import globe -from maritime_schema.types.caga import Position +from trafficgen.types import GeoPosition from trafficgen.utils import calculate_position_at_certain_time, rad_2_deg def path_crosses_land( - position_1: Position, + position_1: GeoPosition, speed: float, course: float, - lat_lon0: Position, + lat_lon0: GeoPosition, time_interval: float = 300.0, ) -> bool: """ Find if path is crossing land. Params: - position_1: Ship position in latitude/longitude [rad]. + position_1: Ship position in lat/lon [rad]. speed: Ship speed [m/s]. course: Ship course [rad]. lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad]. @@ -31,15 +31,15 @@ def path_crosses_land( num_checks = 10 for i in range(int(time_interval / num_checks)): position_2 = calculate_position_at_certain_time( - Position(latitude=position_1.latitude, longitude=position_1.longitude), + GeoPosition(lat=position_1.lat, lon=position_1.lon), lat_lon0, speed, course, i * time_interval / num_checks, ) - lat = rad_2_deg(position_2.latitude) - lon = rad_2_deg(position_2.longitude) + lat = rad_2_deg(position_2.lat) + lon = rad_2_deg(position_2.lon) if globe.is_land(lat, lon): # type: ignore (The package is unfortunately not typed.) return True return False diff --git a/src/trafficgen/encounter.py b/src/trafficgen/encounter.py index e1da0bd..c4b85fd 100644 --- a/src/trafficgen/encounter.py +++ b/src/trafficgen/encounter.py @@ -6,26 +6,23 @@ import random from typing import List, Optional, Tuple, Union -from uuid import uuid4 import numpy as np -from maritime_schema.types.caga import ( - AISNavStatus, - Initial, - OwnShip, - Position, - ShipStatic, - TargetShip, - Waypoint, -) from trafficgen.check_land_crossing import path_crosses_land from trafficgen.marine_system_simulator import flat2llh, llh2flat from trafficgen.types import ( + AisNavStatus, EncounterRelativeSpeed, EncounterSettings, EncounterType, + GeoPosition, + Initial, + OwnShip, + ShipStatic, SituationInput, + TargetShip, + Waypoint, ) from trafficgen.utils import ( calculate_bearing_between_waypoints, @@ -67,18 +64,19 @@ def generate_encounter( * encounter_found: True=encounter found, False=encounter not found """ encounter_found: bool = False + target_ship_id: int = 10 # Id of first target ship outer_counter: int = 0 # Initiating some variables which later will be set if an encounter is found assert own_ship.initial is not None - target_ship_initial_position: Position = own_ship.initial.position + target_ship_initial_position: GeoPosition = own_ship.initial.position target_ship_sog: float = 0 target_ship_cog: float = 0 # Initial posision of own ship used as reference point for lat_lon0 - lat_lon0: Position = Position( - latitude=own_ship.initial.position.latitude, - longitude=own_ship.initial.position.longitude, + lat_lon0: GeoPosition = GeoPosition( + lat=own_ship.initial.position.lat, + lon=own_ship.initial.position.lon, ) target_ship_static: ShipStatic = decide_target_ship(target_ships_static) @@ -117,7 +115,7 @@ def generate_encounter( ) # Target ship - target_ship_position_future: Position = assign_future_position_to_target_ship( + target_ship_position_future: GeoPosition = assign_future_position_to_target_ship( own_ship_position_future, lat_lon0, settings.max_meeting_distance ) @@ -145,8 +143,8 @@ def generate_encounter( else: target_ship_sog: float = relative_sog * own_ship.initial.sog - assert target_ship_static.speed_max is not None - target_ship_sog = round(np.minimum(target_ship_sog, target_ship_static.speed_max), 1) + assert target_ship_static.sog_max is not None + target_ship_sog = round(np.minimum(target_ship_sog, target_ship_static.sog_max), 1) target_ship_vector_length = target_ship_sog * vector_time start_position_target_ship, position_found = find_start_position_target_ship( @@ -161,7 +159,7 @@ def generate_encounter( ) if position_found: - target_ship_initial_position: Position = start_position_target_ship + target_ship_initial_position: GeoPosition = start_position_target_ship target_ship_cog: float = calculate_ship_cog( target_ship_initial_position, target_ship_position_future, lat_lon0 ) @@ -191,17 +189,18 @@ def generate_encounter( encounter_found = encounter_ok if encounter_found: - target_ship_static.id = uuid4() + target_ship_static.id = target_ship_id + target_ship_id += 1 target_ship_static.name = f"target_ship_{encounter_number}" target_ship_initial: Initial = Initial( position=target_ship_initial_position, sog=target_ship_sog, cog=target_ship_cog, heading=target_ship_cog, - nav_status=AISNavStatus.UNDER_WAY_USING_ENGINE, + nav_status=AisNavStatus.UNDER_WAY_USING_ENGINE, ) target_ship_waypoint0 = Waypoint( - position=target_ship_initial_position.model_copy(deep=True), turn_radius=None, data=None + position=target_ship_initial_position.model_copy(deep=True), turn_radius=None, leg=None ) future_position_target_ship = calculate_position_at_certain_time( @@ -213,7 +212,7 @@ def generate_encounter( ) target_ship_waypoint1 = Waypoint( - position=future_position_target_ship, turn_radius=None, data=None + position=future_position_target_ship, turn_radius=None, leg=None ) waypoints = [target_ship_waypoint0, target_ship_waypoint1] @@ -229,11 +228,11 @@ def generate_encounter( def check_encounter_evolvement( own_ship: OwnShip, own_ship_cog: float, - own_ship_position_future: Position, - lat_lon0: Position, + own_ship_position_future: GeoPosition, + lat_lon0: GeoPosition, target_ship_sog: float, target_ship_cog: float, - target_ship_position_future: Position, + target_ship_position_future: GeoPosition, desired_encounter_type: EncounterType, settings: EncounterSettings, ) -> bool: @@ -298,7 +297,7 @@ def define_own_ship( desired_traffic_situation: SituationInput, own_ship_static: ShipStatic, encounter_settings: EncounterSettings, - lat_lon0: Position, + lat_lon0: GeoPosition, ) -> OwnShip: """ Define own ship based on information in desired traffic situation. @@ -318,7 +317,7 @@ def define_own_ship( # If waypoints are not given, let initial position be the first waypoint, # then calculate second waypoint some time in the future own_ship_waypoint0 = Waypoint( - position=own_ship_initial.position.model_copy(deep=True), turn_radius=None, data=None + position=own_ship_initial.position.model_copy(deep=True), turn_radius=None, leg=None ) ship_position_future = calculate_position_at_certain_time( own_ship_initial.position, @@ -327,12 +326,12 @@ def define_own_ship( own_ship_initial.cog, encounter_settings.situation_length, ) - own_ship_waypoint1 = Waypoint(position=ship_position_future, turn_radius=None, data=None) + own_ship_waypoint1 = Waypoint(position=ship_position_future, turn_radius=None, leg=None) own_ship_waypoints: List[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] elif len(desired_traffic_situation.own_ship.waypoints) == 1: # If one waypoint is given, use initial position as first waypoint own_ship_waypoint0 = Waypoint( - position=own_ship_initial.position.model_copy(deep=True), turn_radius=None, data=None + position=own_ship_initial.position.model_copy(deep=True), turn_radius=None, leg=None ) own_ship_waypoint1 = desired_traffic_situation.own_ship.waypoints[0] own_ship_waypoints: List[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] @@ -349,11 +348,11 @@ def define_own_ship( def calculate_min_vector_length_target_ship( - own_ship_position: Position, + own_ship_position: GeoPosition, own_ship_cog: float, - target_ship_position_future: Position, + target_ship_position_future: GeoPosition, desired_beta: float, - lat_lon0: Position, + lat_lon0: GeoPosition, ) -> float: """ Calculate minimum vector length (target ship sog x vector). This will @@ -373,13 +372,13 @@ def calculate_min_vector_length_target_ship( psi: float = own_ship_cog + desired_beta own_ship_position_north, own_ship_position_east, _ = llh2flat( - own_ship_position.latitude, own_ship_position.longitude, lat_lon0.latitude, lat_lon0.longitude + own_ship_position.lat, own_ship_position.lon, lat_lon0.lat, lat_lon0.lon ) target_ship_position_future_north, target_ship_position_future_east, _ = llh2flat( - target_ship_position_future.latitude, - target_ship_position_future.longitude, - lat_lon0.latitude, - lat_lon0.longitude, + target_ship_position_future.lat, + target_ship_position_future.lon, + lat_lon0.lat, + lat_lon0.lon, ) p_1 = np.array([own_ship_position_north, own_ship_position_east]) @@ -392,15 +391,15 @@ def calculate_min_vector_length_target_ship( def find_start_position_target_ship( - own_ship_position: Position, - lat_lon0: Position, + own_ship_position: GeoPosition, + lat_lon0: GeoPosition, own_ship_cog: float, - target_ship_position_future: Position, + target_ship_position_future: GeoPosition, target_ship_vector_length: float, desired_beta: float, desired_encounter_type: EncounterType, settings: EncounterSettings, -) -> Tuple[Position, bool]: +) -> Tuple[GeoPosition, bool]: """ Find start position of target ship using desired beta and vector length. @@ -423,14 +422,12 @@ def find_start_position_target_ship( theta15_criteria: float = settings.classification.theta15_criteria theta15: List[float] = settings.classification.theta15 - n_1, e_1, _ = llh2flat( - own_ship_position.latitude, own_ship_position.longitude, lat_lon0.latitude, lat_lon0.longitude - ) + n_1, e_1, _ = llh2flat(own_ship_position.lat, own_ship_position.lon, lat_lon0.lat, lat_lon0.lon) n_2, e_2, _ = llh2flat( - target_ship_position_future.latitude, - target_ship_position_future.longitude, - lat_lon0.latitude, - lat_lon0.longitude, + target_ship_position_future.lat, + target_ship_position_future.lon, + lat_lon0.lat, + lat_lon0.lon, ) v_r: float = target_ship_vector_length psi: float = own_ship_cog + desired_beta @@ -466,16 +463,16 @@ def find_start_position_target_ship( e_32 = round(e_1 + s_2 * (e_4 - e_1), 0) n_32 = round(n_1 + s_2 * (n_4 - n_1), 0) - lat31, lon31, _ = flat2llh(n_31, e_31, lat_lon0.latitude, lat_lon0.longitude) + lat31, lon31, _ = flat2llh(n_31, e_31, lat_lon0.lat, lat_lon0.lon) target_ship_cog_1: float = calculate_ship_cog( - pos_0=Position(latitude=lat31, longitude=lon31), + pos_0=GeoPosition(lat=lat31, lon=lon31), pos_1=target_ship_position_future, lat_lon0=lat_lon0, ) beta1, alpha1 = calculate_relative_bearing( position_own_ship=own_ship_position, heading_own_ship=own_ship_cog, - position_target_ship=Position(latitude=lat31, longitude=lon31), + position_target_ship=GeoPosition(lat=lat31, lon=lon31), heading_target_ship=target_ship_cog_1, lat_lon0=lat_lon0, ) @@ -483,16 +480,16 @@ def find_start_position_target_ship( alpha1, beta1, theta13_criteria, theta14_criteria, theta15_criteria, theta15 ) - lat32, lon32, _ = flat2llh(n_32, e_32, lat_lon0.latitude, lat_lon0.longitude) + lat32, lon32, _ = flat2llh(n_32, e_32, lat_lon0.lat, lat_lon0.lon) target_ship_cog_2 = calculate_ship_cog( - pos_0=Position(latitude=lat32, longitude=lon32), + pos_0=GeoPosition(lat=lat32, lon=lon32), pos_1=target_ship_position_future, lat_lon0=lat_lon0, ) beta2, alpha2 = calculate_relative_bearing( position_own_ship=own_ship_position, heading_own_ship=own_ship_cog, - position_target_ship=Position(latitude=lat32, longitude=lon32), + position_target_ship=GeoPosition(lat=lat32, lon=lon32), heading_target_ship=target_ship_cog_2, lat_lon0=lat_lon0, ) @@ -504,23 +501,23 @@ def find_start_position_target_ship( desired_encounter_type is colreg_state1 and np.abs(convert_angle_0_to_2_pi_to_minus_pi_to_pi(np.abs(beta1 - desired_beta))) < 0.01 ): - start_position_target_ship = Position(latitude=lat31, longitude=lon31) + start_position_target_ship = GeoPosition(lat=lat31, lon=lon31) start_position_found = True elif ( desired_encounter_type is colreg_state2 and np.abs(convert_angle_0_to_2_pi_to_minus_pi_to_pi(np.abs(beta2 - desired_beta))) < 0.01 ): - start_position_target_ship = Position(latitude=lat32, longitude=lon32) + start_position_target_ship = GeoPosition(lat=lat32, lon=lon32) start_position_found = True return start_position_target_ship, start_position_found def assign_future_position_to_target_ship( - own_ship_position_future: Position, - lat_lon0: Position, + own_ship_position_future: GeoPosition, + lat_lon0: GeoPosition, max_meeting_distance: float, -) -> Position: +) -> GeoPosition: """ Randomly assign future position of target ship. If drawing a circle with radius max_meeting_distance around future position of own ship, future position of @@ -541,15 +538,15 @@ def assign_future_position_to_target_ship( random_distance = random.uniform(0, 1) * max_meeting_distance own_ship_position_future_north, own_ship_position_future_east, _ = llh2flat( - own_ship_position_future.latitude, - own_ship_position_future.longitude, - lat_lon0.latitude, - lat_lon0.longitude, + own_ship_position_future.lat, + own_ship_position_future.lon, + lat_lon0.lat, + lat_lon0.lon, ) north: float = own_ship_position_future_north + random_distance * np.cos(random_angle) east: float = own_ship_position_future_east + random_distance * np.sin(random_angle) - latitude, longitude, _ = flat2llh(north, east, lat_lon0.latitude, lat_lon0.longitude) - return Position(latitude=latitude, longitude=longitude) + lat, lon, _ = flat2llh(north, east, lat_lon0.lat, lat_lon0.lon) + return GeoPosition(lat=lat, lon=lon) def determine_colreg( @@ -607,20 +604,20 @@ def determine_colreg( def calculate_relative_bearing( - position_own_ship: Position, + position_own_ship: GeoPosition, heading_own_ship: float, - position_target_ship: Position, + position_target_ship: GeoPosition, heading_target_ship: float, - lat_lon0: Position, + lat_lon0: GeoPosition, ) -> Tuple[float, float]: """ Calculate relative bearing between own ship and target ship, both seen from own ship and seen from target ship. Params: - * position_own_ship: Own ship position {latitude, longitude} [rad] + * position_own_ship: Own ship position {lat, lon} [rad] * heading_own_ship: Own ship heading [rad] - * position_target_ship: Target ship position {latitude, longitude} [rad] + * position_target_ship: Target ship position {lat, lon} [rad] * heading_target_ship: Target ship heading [rad] * lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad] @@ -631,13 +628,13 @@ def calculate_relative_bearing( """ # POSE combination of relative bearing and contact angle n_own_ship, e_own_ship, _ = llh2flat( - position_own_ship.latitude, position_own_ship.longitude, lat_lon0.latitude, lat_lon0.longitude + position_own_ship.lat, position_own_ship.lon, lat_lon0.lat, lat_lon0.lon ) n_target_ship, e_target_ship, _ = llh2flat( - position_target_ship.latitude, - position_target_ship.longitude, - lat_lon0.latitude, - lat_lon0.longitude, + position_target_ship.lat, + position_target_ship.lon, + lat_lon0.lat, + lat_lon0.lon, ) # Absolute bearing of target ship relative to own ship @@ -687,20 +684,20 @@ def calculate_relative_bearing( return beta, alpha -def calculate_ship_cog(pos_0: Position, pos_1: Position, lat_lon0: Position) -> float: +def calculate_ship_cog(pos_0: GeoPosition, pos_1: GeoPosition, lat_lon0: GeoPosition) -> float: """ Calculate ship cog between two waypoints. Params: - * waypoint_0: Dict, waypoint {latitude, longitude} [rad] - * waypoint_1: Dict, waypoint {latitude, longitude} [rad] + * waypoint_0: Dict, waypoint {lat, lon} [rad] + * waypoint_1: Dict, waypoint {lat, lon} [rad] Returns ------- * cog: Ship cog [rad] """ - n_0, e_0, _ = llh2flat(pos_0.latitude, pos_0.longitude, lat_lon0.latitude, lat_lon0.longitude) - n_1, e_1, _ = llh2flat(pos_1.latitude, pos_1.longitude, lat_lon0.latitude, lat_lon0.longitude) + n_0, e_0, _ = llh2flat(pos_0.lat, pos_0.lon, lat_lon0.lat, lat_lon0.lon) + n_1, e_1, _ = llh2flat(pos_1.lat, pos_1.lon, lat_lon0.lat, lat_lon0.lon) cog: float = np.arctan2(e_1 - e_0, n_1 - n_0) if cog < 0.0: diff --git a/src/trafficgen/marine_system_simulator.py b/src/trafficgen/marine_system_simulator.py index 91438fd..136ef56 100644 --- a/src/trafficgen/marine_system_simulator.py +++ b/src/trafficgen/marine_system_simulator.py @@ -25,20 +25,20 @@ def flat2llh( height_ref: float = 0.0, ) -> Tuple[float, float, float]: """ - Compute longitude lon (rad), latitude lat (rad) and height h (m) for the + Compute lon lon (rad), lat lat (rad) and height h (m) for the NED coordinates (xn,yn,zn). Method taken from the MSS (Marine System Simulator) toolbox which is a Matlab/Simulink library for marine systems. - The method computes longitude lon (rad), latitude lat (rad) and height h (m) for the + The method computes lon lon (rad), lat lat (rad) and height h (m) for the NED coordinates (xn,yn,zn) using a flat Earth coordinate system defined by the WGS-84 ellipsoid. The flat Earth coordinate origin is located at (lon_0, lat_0) with reference height h_ref in meters above the surface of the ellipsoid. Both height and h_ref are positive upwards, while zn is positive downwards (NED). Author: Thor I. Fossen Date: 20 July 2018 - Revisions: 2023-02-04 updates the formulas for latitude and longitude + Revisions: 2023-02-04 updates the formulas for lat and lon Params: * xn: Ship position, north [m] @@ -50,8 +50,8 @@ def flat2llh( Returns ------- - * lat: Latitude [rad] - * lon: Longitude [rad] + * lat: lat [rad] + * lon: lon [rad] * h: Height [m] """ @@ -63,8 +63,8 @@ def flat2llh( r_n = a_radius / np.sqrt(1 - e_eccentricity**2 * np.sin(lat_0) ** 2) r_m = r_n * ((1 - e_eccentricity**2) / (1 - e_eccentricity**2 * np.sin(lat_0) ** 2)) - d_lat = x_n / (r_m + height_ref) # delta latitude dmu = mu - mu0 - d_lon = y_n / ((r_n + height_ref) * np.cos(lat_0)) # delta longitude dl = l - l0 + d_lat = x_n / (r_m + height_ref) # delta lat dmu = mu - mu0 + d_lon = y_n / ((r_n + height_ref) * np.cos(lat_0)) # delta lon dl = l - l0 lat = ssa(lat_0 + d_lat) lon = ssa(lon_0 + d_lon) @@ -82,22 +82,22 @@ def llh2flat( height_ref: float = 0.0, ) -> Tuple[float, float, float]: """ - Compute (north, east) for a flat Earth coordinate system from longitude - lon (rad) and latitude lat (rad). + Compute (north, east) for a flat Earth coordinate system from lon + lon (rad) and lat lat (rad). Method taken from the MSS (Marine System Simulator) toolbox which is a Matlab/Simulink library for marine systems. - The method computes (north, east) for a flat Earth coordinate system from longitude - lon (rad) and latitude lat (rad) of the WGS-84 elipsoid. The flat Earth coordinate + The method computes (north, east) for a flat Earth coordinate system from lon + lon (rad) and lat lat (rad) of the WGS-84 elipsoid. The flat Earth coordinate origin is located at (lon_0, lat_0). Author: Thor I. Fossen Date: 20 July 2018 - Revisions: 2023-02-04 updates the formulas for latitude and longitude + Revisions: 2023-02-04 updates the formulas for lat and lon Params: - * lat: Ship position in latitude [rad] - * lon: Ship position in longitude [rad] + * lat: Ship position in lat [rad] + * lon: Ship position in lon [rad] * h=0.0: Ship height in meters above the surface of the ellipsoid * lat_0, lon_0: Flat earth coordinate located at (lon_0, lat_0) * h_ref=0.0: Flat earth coordinate with reference h_ref in meters above diff --git a/src/trafficgen/plot_traffic_situation.py b/src/trafficgen/plot_traffic_situation.py index db45ccd..e8fc2c3 100644 --- a/src/trafficgen/plot_traffic_situation.py +++ b/src/trafficgen/plot_traffic_situation.py @@ -1,32 +1,32 @@ # The matplotlib package is unfortunately not fully typed. Hence the following pyright exemption. # pyright: reportUnknownMemberType=false """Functions to prepare and plot traffic situations.""" + import math from typing import List, Optional, Tuple, Union import matplotlib.pyplot as plt import numpy as np from folium import Map, Polygon -from maritime_schema.types.caga import Position, Ship, TargetShip, TrafficSituation from matplotlib.axes import Axes as Axes from matplotlib.patches import Circle from trafficgen.marine_system_simulator import flat2llh, llh2flat -from trafficgen.types import EncounterSettings +from trafficgen.types import EncounterSettings, GeoPosition, Ship, TargetShip, TrafficSituation from trafficgen.utils import m_2_nm, rad_2_deg def calculate_vector_arrow( - position: Position, + position: GeoPosition, direction: float, vector_length: float, - lat_lon0: Position, + lat_lon0: GeoPosition, ) -> List[Tuple[float, float]]: """ Calculate the arrow with length vector pointing in the direction of ship course. Params: - * position: {latitude}, {longitude} position of the ship [rad] + * position: {lat}, {lon} position of the ship [rad] * direction: direction the arrow is pointing [rad] * vector_length: length of vector [m] * lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad] @@ -35,9 +35,7 @@ def calculate_vector_arrow( ------- * arrow_points: Polygon points to draw the arrow [deg] """ - north_start, east_start, _ = llh2flat( - position.latitude, position.longitude, lat_lon0.latitude, lat_lon0.longitude - ) + north_start, east_start, _ = llh2flat(position.lat, position.lon, lat_lon0.lat, lat_lon0.lon) side_length = vector_length / 10 sides_angle = 25 @@ -50,13 +48,13 @@ def calculate_vector_arrow( north_arrow_side_2 = north_end + side_length * np.cos(direction + np.pi + sides_angle) east_arrow_side_2 = east_end + side_length * np.sin(direction + np.pi + sides_angle) - lat_start, lon_start, _ = flat2llh(north_start, east_start, lat_lon0.latitude, lat_lon0.longitude) - lat_end, lon_end, _ = flat2llh(north_end, east_end, lat_lon0.latitude, lat_lon0.longitude) + lat_start, lon_start, _ = flat2llh(north_start, east_start, lat_lon0.lat, lat_lon0.lon) + lat_end, lon_end, _ = flat2llh(north_end, east_end, lat_lon0.lat, lat_lon0.lon) lat_arrow_side_1, lon_arrow_side_1, _ = flat2llh( - north_arrow_side_1, east_arrow_side_1, lat_lon0.latitude, lat_lon0.longitude + north_arrow_side_1, east_arrow_side_1, lat_lon0.lat, lat_lon0.lon ) lat_arrow_side_2, lon_arrow_side_2, _ = flat2llh( - north_arrow_side_2, east_arrow_side_2, lat_lon0.latitude, lat_lon0.longitude + north_arrow_side_2, east_arrow_side_2, lat_lon0.lat, lat_lon0.lon ) point_1 = (rad_2_deg(lat_start), rad_2_deg(lon_start)) @@ -68,9 +66,9 @@ def calculate_vector_arrow( def calculate_ship_outline( - position: Position, + position: GeoPosition, course: float, - lat_lon0: Position, + lat_lon0: GeoPosition, ship_length: float = 100.0, ship_width: float = 15.0, ) -> List[Tuple[float, float]]: @@ -78,7 +76,7 @@ def calculate_ship_outline( Calculate the outline of the ship pointing in the direction of ship course. Params: - * position: {latitude}, {longitude} position of the ship [rad] + * position: {lat}, {lon} position of the ship [rad] * course: course of the ship [rad] * lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad] * ship_length: Ship length. If not given, ship length is set to 100 @@ -88,9 +86,7 @@ def calculate_ship_outline( ------- * ship_outline_points: Polygon points to draw the ship [deg] """ - north_start, east_start, _ = llh2flat( - position.latitude, position.longitude, lat_lon0.latitude, lat_lon0.longitude - ) + north_start, east_start, _ = llh2flat(position.lat, position.lon, lat_lon0.lat, lat_lon0.lon) # increase size for visualizing ship_length *= 10 @@ -98,7 +94,7 @@ def calculate_ship_outline( north_pos1 = north_start + np.cos(course) * (-ship_length / 2) - np.sin(course) * ship_width / 2 east_pos1 = east_start + np.sin(course) * (-ship_length / 2) + np.cos(course) * ship_width / 2 - lat_pos1, lon_pos1, _ = flat2llh(north_pos1, east_pos1, lat_lon0.latitude, lat_lon0.longitude) + lat_pos1, lon_pos1, _ = flat2llh(north_pos1, east_pos1, lat_lon0.lat, lat_lon0.lon) north_pos2 = ( north_start @@ -110,11 +106,11 @@ def calculate_ship_outline( + np.sin(course) * (ship_length / 2 - ship_length * 0.1) + np.cos(course) * ship_width / 2 ) - lat_pos2, lon_pos2, _ = flat2llh(north_pos2, east_pos2, lat_lon0.latitude, lat_lon0.longitude) + lat_pos2, lon_pos2, _ = flat2llh(north_pos2, east_pos2, lat_lon0.lat, lat_lon0.lon) north_pos3 = north_start + np.cos(course) * (ship_length / 2) east_pos3 = east_start + np.sin(course) * (ship_length / 2) - lat_pos3, lon_pos3, _ = flat2llh(north_pos3, east_pos3, lat_lon0.latitude, lat_lon0.longitude) + lat_pos3, lon_pos3, _ = flat2llh(north_pos3, east_pos3, lat_lon0.lat, lat_lon0.lon) north_pos4 = ( north_start @@ -126,11 +122,11 @@ def calculate_ship_outline( + np.sin(course) * (ship_length / 2 - ship_length * 0.1) + np.cos(course) * (-ship_width / 2) ) - lat_pos4, lon_pos4, _ = flat2llh(north_pos4, east_pos4, lat_lon0.latitude, lat_lon0.longitude) + lat_pos4, lon_pos4, _ = flat2llh(north_pos4, east_pos4, lat_lon0.lat, lat_lon0.lon) north_pos5 = north_start + np.cos(course) * (-ship_length / 2) - np.sin(course) * (-ship_width / 2) east_pos5 = east_start + np.sin(course) * (-ship_length / 2) + np.cos(course) * (-ship_width / 2) - lat_pos5, lon_pos5, _ = flat2llh(north_pos5, east_pos5, lat_lon0.latitude, lat_lon0.longitude) + lat_pos5, lon_pos5, _ = flat2llh(north_pos5, east_pos5, lat_lon0.lat, lat_lon0.lon) point_1 = (rad_2_deg(lat_pos1), rad_2_deg(lon_pos1)) point_2 = (rad_2_deg(lat_pos2), rad_2_deg(lon_pos2)) @@ -168,7 +164,7 @@ def plot_specific_traffic_situation( lat_lon0 = situation.own_ship.initial.position - map_plot = Map(location=(rad_2_deg(lat_lon0.latitude), rad_2_deg(lat_lon0.longitude)), zoom_start=10) + map_plot = Map(location=(rad_2_deg(lat_lon0.lat), rad_2_deg(lat_lon0.lon)), zoom_start=10) map_plot = add_ship_to_map( situation.own_ship, encounter_settings.common_vector, @@ -193,7 +189,7 @@ def plot_specific_traffic_situation( def add_ship_to_map( ship: Ship, vector_time: float, - lat_lon0: Position, + lat_lon0: GeoPosition, map_plot: Optional[Map], color: str = "black", ) -> Map: @@ -212,9 +208,7 @@ def add_ship_to_map( * m: Updated instance of Map. """ if map_plot is None: - map_plot = Map( - location=(rad_2_deg(lat_lon0.latitude), rad_2_deg(lat_lon0.longitude)), zoom_start=10 - ) + map_plot = Map(location=(rad_2_deg(lat_lon0.lat), rad_2_deg(lat_lon0.lon)), zoom_start=10) assert ship.initial is not None vector_length = vector_time * ship.initial.sog @@ -289,7 +283,7 @@ def plot_traffic_situations( xlabel="[nm]", ylabel="[nm]", ) - _ = axes.set_title(situation.title) + _ = axes.set_title(str(situation.title)) assert situation.own_ship is not None assert situation.own_ship.initial assert encounter_settings.common_vector is not None @@ -322,7 +316,7 @@ def plot_traffic_situations( def find_max_value_for_plot( ship: Ship, max_value: float, - lat_lon0: Position, + lat_lon0: GeoPosition, ) -> float: """ Find the maximum deviation from the Reference point in north and east direction. @@ -339,10 +333,10 @@ def find_max_value_for_plot( assert ship.initial is not None north, east, _ = llh2flat( - ship.initial.position.latitude, - ship.initial.position.longitude, - lat_lon0.latitude, - lat_lon0.longitude, + ship.initial.position.lat, + ship.initial.position.lon, + lat_lon0.lat, + lat_lon0.lon, ) max_value = np.max( [ @@ -357,7 +351,7 @@ def find_max_value_for_plot( def add_ship_to_plot( ship: Ship, vector_time: float, - lat_lon0: Position, + lat_lon0: GeoPosition, axes: Optional[Axes], color: str = "black", ): @@ -376,10 +370,10 @@ def add_ship_to_plot( assert ship.initial is not None pos_0_north, pos_0_east, _ = llh2flat( - ship.initial.position.latitude, - ship.initial.position.longitude, - lat_lon0.latitude, - lat_lon0.longitude, + ship.initial.position.lat, + ship.initial.position.lon, + lat_lon0.lat, + lat_lon0.lon, ) pos_0_north = m_2_nm(pos_0_north) pos_0_east = m_2_nm(pos_0_east) diff --git a/src/trafficgen/read_files.py b/src/trafficgen/read_files.py index 29a90cb..9035a63 100644 --- a/src/trafficgen/read_files.py +++ b/src/trafficgen/read_files.py @@ -6,12 +6,7 @@ from typing import Any, Dict, List, Union, cast from uuid import UUID, uuid4 -from maritime_schema.types.caga import ( - ShipStatic, - TrafficSituation, -) - -from trafficgen.types import EncounterSettings, SituationInput +from trafficgen.types import EncounterSettings, ShipStatic, SituationInput, TrafficSituation from trafficgen.utils import deg_2_rad, knot_2_m_pr_s, min_2_s, nm_2_m @@ -81,24 +76,32 @@ def convert_situation_data_from_maritime_to_si_units(situation: SituationInput) """ assert situation.own_ship is not None assert situation.own_ship.initial is not None - situation.own_ship.initial.position.longitude = deg_2_rad( - situation.own_ship.initial.position.longitude - ) - situation.own_ship.initial.position.latitude = deg_2_rad( - situation.own_ship.initial.position.latitude - ) + assert situation.own_ship.initial.heading is not None + situation.own_ship.initial.position.lon = deg_2_rad(situation.own_ship.initial.position.lon) + situation.own_ship.initial.position.lat = deg_2_rad(situation.own_ship.initial.position.lat) situation.own_ship.initial.cog = deg_2_rad(situation.own_ship.initial.cog) situation.own_ship.initial.heading = deg_2_rad(situation.own_ship.initial.heading) situation.own_ship.initial.sog = knot_2_m_pr_s(situation.own_ship.initial.sog) if situation.own_ship.waypoints is not None: for waypoint in situation.own_ship.waypoints: - waypoint.position.latitude = deg_2_rad(waypoint.position.latitude) - waypoint.position.longitude = deg_2_rad(waypoint.position.longitude) - if waypoint.data is not None: - assert waypoint.data.model_extra - if waypoint.data.model_extra.get("sog") is not None: - waypoint.data.model_extra["sog"]["value"] = knot_2_m_pr_s(waypoint.data.model_extra["sog"]["value"]) # type: ignore + waypoint.position.lat = deg_2_rad(waypoint.position.lat) + waypoint.position.lon = deg_2_rad(waypoint.position.lon) + if waypoint.turn_radius is not None: + waypoint.turn_radius = nm_2_m(waypoint.turn_radius) + if waypoint.leg is not None: + if waypoint.leg.starboard_xtd is not None: + waypoint.leg.starboard_xtd = nm_2_m(waypoint.leg.starboard_xtd) + if waypoint.leg.portside_xtd is not None: + waypoint.leg.portside_xtd = nm_2_m(waypoint.leg.portside_xtd) + if waypoint.leg.data is not None: + if waypoint.leg.data.sog is not None: + assert waypoint.leg.data.sog.value is not None + assert waypoint.leg.data.sog.interp_start is not None + assert waypoint.leg.data.sog.interp_end is not None + waypoint.leg.data.sog.value = knot_2_m_pr_s(waypoint.leg.data.sog.value) + waypoint.leg.data.sog.interp_start = nm_2_m(waypoint.leg.data.sog.interp_start) + waypoint.leg.data.sog.interp_end = nm_2_m(waypoint.leg.data.sog.interp_end) assert situation.encounters is not None for encounter in situation.encounters: @@ -133,7 +136,7 @@ def read_own_ship_static_file(own_ship_static_file: Path) -> ShipStatic: data = convert_keys_to_snake_case(data) if "id" not in data: - ship_id: UUID = uuid4() + ship_id: int = 0 data.update({"id": ship_id}) ship_static: ShipStatic = ShipStatic(**data) @@ -162,7 +165,7 @@ def read_target_ship_static_files(target_ship_folder: Path) -> List[ShipStatic]: data = convert_keys_to_snake_case(data) if "id" not in data: - ship_id: UUID = uuid4() + ship_id: int = 10 + i data.update({"id": ship_id}) target_ship_static: ShipStatic = ShipStatic(**data) diff --git a/src/trafficgen/ship_traffic_generator.py b/src/trafficgen/ship_traffic_generator.py index e4bcaf4..1032559 100644 --- a/src/trafficgen/ship_traffic_generator.py +++ b/src/trafficgen/ship_traffic_generator.py @@ -1,16 +1,9 @@ """Functions to generate traffic situations.""" +from importlib.metadata import PackageNotFoundError, version from pathlib import Path from typing import List, Union -from maritime_schema.types.caga import ( - OwnShip, - Position, - ShipStatic, - TargetShip, - TrafficSituation, -) - from trafficgen.encounter import ( define_own_ship, generate_encounter, @@ -21,7 +14,21 @@ read_situation_files, read_target_ship_static_files, ) -from trafficgen.types import EncounterSettings, EncounterType, SituationInput +from trafficgen.types import ( + EncounterSettings, + EncounterType, + GeoPosition, + OwnShip, + ShipStatic, + SituationInput, + TargetShip, + TrafficSituation, +) + +try: + project_version = version("trafficgen") +except PackageNotFoundError: + project_version = "Not found" def generate_traffic_situations( @@ -59,7 +66,7 @@ def generate_traffic_situations( assert desired_traffic_situation.own_ship is not None assert desired_traffic_situation.encounters is not None - lat_lon0: Position = desired_traffic_situation.own_ship.initial.position + lat_lon0: GeoPosition = desired_traffic_situation.own_ship.initial.position own_ship: OwnShip = define_own_ship( desired_traffic_situation, own_ship_static, encounter_settings, lat_lon0 @@ -86,12 +93,12 @@ def generate_traffic_situations( target_ships.append(target_ship.model_copy(deep=True)) traffic_situation: TrafficSituation = TrafficSituation( + version=project_version, title=desired_traffic_situation.title, description=desired_traffic_situation.description, own_ship=own_ship.model_copy(deep=True), target_ships=target_ships, start_time=None, - environment=None, ) traffic_situations.append(traffic_situation) return traffic_situations diff --git a/src/trafficgen/types.py b/src/trafficgen/types.py index 97d00d3..4706810 100644 --- a/src/trafficgen/types.py +++ b/src/trafficgen/types.py @@ -1,11 +1,18 @@ """Domain specific data types used in trafficgen.""" +from datetime import datetime from enum import Enum -from typing import List, Optional, Union +from importlib.metadata import PackageNotFoundError, version +from typing import Annotated, Any, List, Optional, Type, Union -from maritime_schema.types.caga import Initial, Waypoint -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict from pydantic.fields import Field +from pyproj import Geod + +try: + project_version = version("trafficgen") +except PackageNotFoundError: + project_version = None def to_camel(string: str) -> str: @@ -15,6 +22,553 @@ def to_camel(string: str) -> str: return words[0] + "".join(word.capitalize() for word in words[1:]) +class BaseModelConfig(BaseModel): + """Enables the alias_generator for all cases.""" + + model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True) + + +class StringIntEnumMixin(str, Enum): + """ + A mixin class for Enums that allows both integers and strings to specify a type. + + This class supports the following input formats: + - Integer: 1 + - Integer in string form: "1" + - Case-insensitive string value: "underway using engine" + - String value with underscores: "underway_using_engine" + """ + + def __new__(cls: Type["StringIntEnumMixin"], str_value: str, num_value: int) -> "StringIntEnumMixin": + obj = str.__new__(cls, str_value) + obj._value_ = str_value # Assign the string value + obj.num_value = num_value # type: ignore + return obj + + @classmethod + def _missing_(cls: Type["StringIntEnumMixin"], value: object) -> Optional["StringIntEnumMixin"]: + # Handle case-insensitive string matching and underscores + if isinstance(value, str): + value_str = value.replace("_", " ").lower() + for member in cls: + if member.value.lower() == value_str: + return member + # Handle numeric values disguised as strings + if value.isdigit(): + value = int(value) + # Handle numeric values + if isinstance(value, int): + for member in cls: + if member.num_value == value: # type: ignore + return member + return None + + +class AisShipType(StringIntEnumMixin): + """ + AIS Ship Type (not including cargo type). + Source: https://www.itu.int/dms_pubrec/itu-r/rec/m/R-REC-M.1371-5-201402-I!!PDF-E.pdf#page=116. + """ + + NOT_AVAILABLE = ("Not available", 0) + WING_IN_GROUND = ("Wing in ground", 20) + FISHING = ("Fishing", 30) + TOWING = ("Towing", 31) + TOWING_LARGE = ("Towing large", 32) # exceeds 200m length or 25m breadth + DREDGING_OR_UNDERWATER_OPS = ("Dredging or underwater operations", 33) + DIVING_OPS = ("Diving operations", 34) + MILITARY_OPS = ("Military operations", 35) + SAILING = ("Sailing", 36) + PLEASURE_CRAFT = ("Pleasure craft", 37) + HIGH_SPEED_CRAFT = ("High speed craft", 40) + PILOT_VESSEL = ("Pilot vessel", 50) + SEARCH_AND_RESCUE_VESSEL = ("Search and rescue vessel", 51) + TUG = ("Tug", 52) + PORT_TENDER = ("Port tender", 53) + ANTI_POLLUTION_EQUIPMENT = ("Anti-pollution equipment", 54) + LAW_ENFORCEMENT = ("Law enforcement", 55) + MEDICAL_TRANSPORT = ("Medical transport", 58) + NONCOMBATANT = ("Noncombatant", 59) + PASSENGER = ("Passenger", 60) + CARGO = ("Cargo", 70) + TANKER = ("Tanker", 80) + OTHER = ("Other", 90) + + +class AisNavStatus(StringIntEnumMixin): + """ + AIS Navigational Status. + Source: https://www.itu.int/dms_pubrec/itu-r/rec/m/R-REC-M.1371-5-201402-I!!PDF-E.pdf#page=113. + """ + + UNDER_WAY_USING_ENGINE = ("Under way using engine", 0) + AT_ANCHOR = ("At anchor", 1) + NOT_UNDER_COMMAND = ("Not under command", 2) + RESTRICTED_MANEUVERABILITY = ("Restricted maneuverability", 3) + CONSTRAINED_BY_HER_DRAUGHT = ("Constrained by her draught", 4) + MOORED = ("Moored", 5) + AGROUND = ("Aground", 6) + ENGAGED_IN_FISHING = ("Engaged in fishing", 7) + UNDER_WAY_SAILING = ("Under way sailing", 8) + RESERVED_FOR_FUTURE_AMENDMENT_DG_HS_MP_C_HSC = ( + "Reserved for future amendment DG, HS, MP, C, HSC", + 9, + ) + RESERVED_FOR_FUTURE_AMENDMENT_DG_HS_MP_A_WIG = ( + "Reserved for future amendment DG, HS, MP, A, WIG", + 10, + ) + POWER_DRIVEN_VESSEL_TOWING_ASTERN = ("Power-driven vessel towing astern", 11) + POWER_DRIVEN_VESSEL_PUSHING_AHEAD_OR_TOWING_ALONGSIDE = ( + "Power-driven vessel pushing ahead or towing alongside", + 12, + ) + RESERVED_FOR_FUTURE_USE = ("Reserved for future use", 13) + AIS_SART_ACTIVE = ("AIS-SART (active)", 14) + UNDEFINED = ("Undefined (default)", 15) + + +class PathType(str, Enum): + """Specifies the control-point model used to define the path for the ship to follow.""" + + RTZ = "rtz" + BEZIER = "bezier" + LINEAR = "linear" + + +class InterpolationMethod(str, Enum): + """Specifies the interpolation method used to interpolate between two values.""" + + LINEAR = "linear" + COSINE = "cosine" + SMOOTHSTEP = "smoothstep" + ACCELERATE = "accelerate" + DECELERATE = "decelerate" + ORDINAL = "ordinal" + + +class Dimensions(BaseModelConfig): + """ + Key Ship Dimensions. + + Bow + (a) + ^ + /┆\ + / ┆ \ + / ┆ \ + / ┆ \ + / ┆ \ + │ ┆ │ + │ ┆ │ + │ ┆ │ + │ ┆ │ + Port (c) │╌╌╌╌╌♦╌╌╌╌╌│ (d) Starboard + │ ┆ │ + │ ┆ │ + │ ┆ │ + └─────┴─────┘ + (b) + Stern + + ♦ = CCRP + + """ + + length: Optional[ + Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[130.0])] + ] = None + width: Optional[ + Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[30.0])] + ] = None + height: Optional[ + Annotated[float, Field(gt=0, description="Height of the ship in meters", examples=[15.0])] + ] = None + draught: Optional[ + Annotated[float, Field(gt=0, description="Draught of the ship in meters", examples=[15.0])] + ] = None + + a: Optional[ + Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Bow", examples=[80])] + ] = None + b: Optional[ + Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Stern", examples=[20])] + ] = None + c: Optional[ + Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Port", examples=[20])] + ] = None + d: Optional[ + Annotated[ + float, Field(gt=0, description="Distance in meters from CCRP to Starboard", examples=[20]) + ] + ] = None + + def __init__(self, **data: Any): + super().__init__(**data) + """If length and width are given, and not a, b, c, d, calculate them, and vice-versa""" + if self.length and self.width: + if not self.a and not self.b and not self.c and not self.d: + self.a = self.length / 2 + self.b = self.length / 2 + self.c = self.width / 2 + self.d = self.width / 2 + if self.a and self.b and self.c and self.d: + self.length = self.a + self.b + self.width = self.c + self.d + + +class ShipStatic(BaseModelConfig): + """Static ship data that will not change during the scenario.""" + + id: Annotated[int, Field(ge=0, le=2**32, description="Ship Identifier", examples=[1])] + mmsi: Optional[ + Annotated[ + int, + Field( + ge=100000000, + le=999999999, + description="Maritime Mobile Service Identity (MMSI)", + examples=[123456789], + ), + ] + ] = None + imo: Optional[ + Annotated[int, Field(ge=1000000, le=9999999, description="IMO Number", examples=[1234567])] + ] = None + name: Optional[Annotated[str, Field(description="Ship name", examples=["RMS Titanic"])]] = None + + dimensions: Optional[Annotated[Dimensions, Field(description="Key ship dimensions")]] = None + + ship_type: Optional[Annotated[AisShipType, Field(description="General ship type, based on AIS")]] = ( + None + ) + + path_type: Optional[ + Annotated[ + PathType, + Field( + default=PathType.RTZ, + description="Specifies the control-point model (e.g., Bezier, RTZ) used to define the path for the ship to follow.", + ), + ] + ] = None + + sog_min: Optional[ + Annotated[ + float, Field(ge=0, description="Minimum ship speed over ground in knots", examples=[5.0]) + ] + ] = None + sog_max: Optional[ + Annotated[ + float, Field(ge=0, description="Maximum ship speed over ground in knots", examples=[15.0]) + ] + ] = None + + model_config = ConfigDict(extra="allow") + + +class GeoPosition(BaseModelConfig): + """Data type for a geographical position.""" + + lon: Annotated[float, Field(ge=-180, le=180, description="WGS-84 lon", examples=[51.2131])] + lat: Annotated[float, Field(ge=-90, le=90, description="WGS-84 lat", examples=[51.2131])] + model_config = ConfigDict(extra="allow") + + +class Position(BaseModelConfig): + """Data type for ship position.""" + + x: Annotated[float, Field(description="x-coordinate. East is positive", examples=[1123])] + y: Annotated[float, Field(description="y-coordinate. Noth is positive", examples=[231])] + + +def create_position_example(): + """Create a position class.""" + return GeoPosition(lon=57.2343, lat=10.3432) + + +class Initial(BaseModelConfig): + """Data type for initial data for a ship .""" + + position: Annotated[ + GeoPosition, + Field( + description="Initial lon and lat of the ship.", + examples=[create_position_example()], + ), + ] + sog: Annotated[ + float, Field(ge=0, description="Initial ship (SOG) ground in knots", examples=[10.0]) + ] + cog: Annotated[ + float, + Field( + ge=0, le=360, description="Initial ship course over ground (COG) in degrees", examples=[45.0] + ), + ] + heading: Optional[ + Annotated[ + float, Field(ge=0, le=360, description="Initial ship heading in degrees", examples=[45.2]) + ] + ] = None + nav_status: Optional[Annotated[AisNavStatus, Field(description="AIS Navigational Status")]] = None + + +class DataPoint(BaseModelConfig): + """Data type for storing data which is numerical and continuos.""" + + value: Optional[ + Annotated[ + float, Field(description="the value of the data at the current waypoint", examples=[12.3]) + ] + ] = None + interp_start: Optional[ + Annotated[ + float, + Field( + description="distance before start of the next leg (NM), to start interpolating to the next leg's value", + examples=[10], + ), + ] + ] = None + interp_end: Optional[ + Annotated[ + float, + Field( + description="distance after the start of the next leg (NM), to finish interpolating to the next leg's value", + examples=[10], + ), + ] + ] = None + interp_method: Optional[ + Annotated[InterpolationMethod | str, Field(description="Method used for interpolation")] + ] = None + + +data_description = """The `data` field can be used to store data, which is numerical and continuous. One such example is the vessels speed over ground (SOG). Every `data` object, can have the 4 following attributes: +\n`value`: This is the value of the data over the current leg. +\n`interpStart`: This is the distance (in NM) before the leg change, where the value will start changing (via interpolation) to the new value in the next leg. +\n`interpEnd`: This is the distance (in NM) after the leg change, where the value will finish changing (via interpolation) to the new value in the next leg. +\n`interpMethod`: This sets the interpolation (linear, cosine, smoothstep, etc.) that will be used to perform the interpolation.""" + + +class RouteData(BaseModelConfig): + """Data type for data along a route.""" + + sog: Optional[Annotated[DataPoint, Field(description=data_description)]] = None + + +class Leg(BaseModelConfig): + """Data type for a leg.""" + + starboard_xtd: Optional[ + Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")] + ] = None + portside_xtd: Optional[ + Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")] + ] = None + data: Optional[Annotated[RouteData, Field(description=data_description)]] = None + + +class Waypoint(BaseModelConfig): + """Data type for a waypoint.""" + + position: Annotated[ + GeoPosition, + Field( + description="A geographical coordinate.", examples=[GeoPosition(lon=11.2313, lat=51.2123)] + ), + ] + turn_radius: Optional[ + Annotated[ + float, + Field( + description="Orthodrome turn radius in nautical miles as defined in RTZ.", examples=[200] + ), + ] + ] = None + leg: Optional[Annotated[Leg, Field(description="Current Leg information.")]] = None + + +def create_ship_static_example(): + """Create a ShipStatic class.""" + return ShipStatic( + id=1, + dimensions=Dimensions(a=50, b=50, c=10, d=10), + sog_max=20.0, + mmsi=123456789, + name="RMS Titanic", + ship_type=AisShipType.FISHING, + imo=1000001, + ) + + +def create_initial_example(): + """Create a (Ship) Initial class.""" + return Initial( + position=create_position_example(), + sog=12.3, + cog=284.2, + heading=283.1, + nav_status=AisNavStatus.UNDER_WAY_USING_ENGINE, + ) + + +def create_data_point_example(): + """Create a DataPoint class.""" + return DataPoint( + value=12.3, interp_start=100, interp_end=100, interp_method=InterpolationMethod.LINEAR + ) + + +def create_waypoint_example(): + """Create a Waypoint class.""" + return Waypoint( + position=create_position_example(), + turn_radius=1.0, + data=RouteData(sog=create_data_point_example()), # type:ignore + ) + + +static_description = "Static ship information which does not change during a scenario." +initial_description = "Initial pose of the ship. If `waypoints` are provided, then these should correspond to the pose of the ship at the starting waypoint" +waypoints_description = "An array of `Waypoint` objects. Each waypoint object must have a `position` property. If no turn radius is provided, it will be assumed to be `0`. Additional data can be added to each waypoint leg." + + +class Ship(BaseModelConfig): + """Data type for a ship.""" + + initial: Optional[ + Annotated[Initial, Field(description=initial_description, examples=[create_initial_example()])] + ] = None + waypoints: Optional[ + Annotated[ + List[Waypoint], + Field(description=waypoints_description, examples=[create_waypoint_example()]), + ] + ] = None + + def __init__(self, **data: Any): + super().__init__(**data) + if not self.waypoints: + self.waypoints = self._generate_waypoints() + + def _generate_waypoints(self) -> Union[List[Waypoint], None]: + """Generate waypoints if they don't exist.""" + waypoints = [] + + if self.initial: + # Create waypoints from initial position + g = Geod(ellps="WGS84") + lon, lat, _ = g.fwd( + self.initial.position.lon, + self.initial.position.lat, + self.initial.cog, + self.initial.sog * 0.51444 * 3600 * 3, + ) + position1 = GeoPosition(lat=lat, lon=lon) + waypoint1 = Waypoint(position=position1) + + position0 = GeoPosition( + lat=self.initial.position.lat, + lon=self.initial.position.lon, + ) + waypoint0 = Waypoint(position=position0) + + waypoints = [waypoint0, waypoint1] + return waypoints + + else: + return None + + +class OwnShip(Ship): + """Data type for the own ship.""" + + static: Annotated[ + ShipStatic, Field(description=static_description, examples=[create_ship_static_example()]) + ] + + def __init__(self, **data: Any): + super().__init__(**data) + if not self.static.name: + self.static.name = "OS" + + +class TargetShip(Ship): + """Data type for the target ship.""" + + static: Annotated[ + ShipStatic, Field(description=static_description, examples=[create_ship_static_example()]) + ] + + def __init__(self, **data: Any): + super().__init__(**data) + if not self.static.name: + self.static.name = f"TGT {self.static.id}" + + +def create_ship_example(): + """Create a Ship class.""" + return Ship( + static=create_ship_static_example(), + initial=create_initial_example(), + waypoints=[create_waypoint_example()], + ) + + +def create_own_ship_example(): + """Create a OwnShip class.""" + return OwnShip(static=create_ship_static_example(), initial=create_initial_example(), waypoints=None) + + +def create_target_example(): + """Create a TargetShip class.""" + return TargetShip( + static=create_ship_static_example(), initial=create_initial_example(), waypoints=None + ) + + +class TrafficSituation(BaseModelConfig): + """Data type for a traffic situation.""" + + version: Annotated[ + str, Field(description="Ship traffic generator version number", examples=[project_version]) + ] + title: Optional[ + Annotated[ + str, Field(description="The title of the traffic situation", examples=["overtaking_18"]) + ] + ] = None + description: Optional[ + Annotated[ + str, + Field( + description="A description of the traffic situation", + examples=["Crossing situation with 3 target vessels in the Oslo fjord"], + ), + ] + ] = None + start_time: Optional[ + Annotated[ + datetime, + Field( + description="Starting time of the situation in `ISO 8601` format `YYYY-MM-DDThh:mm:ssZ`", + examples=[datetime(2025, 1, 1, 0, 0, 0)], + ), + ] + ] = None + own_ship: Annotated[ + OwnShip, Field(description="Own Ship (OS) data", examples=[create_ship_example()]) + ] + target_ships: Optional[ + Annotated[ + List[TargetShip], + Field(description="Target Ship (TGT) data", examples=[[create_ship_example()]]), + ] + ] = None + + class EncounterType(Enum): """Enumeration of encounter types.""" @@ -26,7 +580,7 @@ class EncounterType(Enum): NO_RISK_COLLISION = "noRiskCollision" -class Encounter(BaseModel): +class Encounter(BaseModelConfig): """Data type for an encounter.""" desired_encounter_type: EncounterType @@ -34,14 +588,10 @@ class Encounter(BaseModel): relative_speed: Union[float, None] = None vector_time: Union[float, None] = None - class Config: - """For converting parameters written to file from snake to camel case.""" - - alias_generator = to_camel - populate_by_name = True + model_config = ConfigDict(extra="allow") -class EncounterClassification(BaseModel): +class EncounterClassification(BaseModelConfig): """Data type for the encounter classification.""" theta13_criteria: float @@ -49,14 +599,10 @@ class EncounterClassification(BaseModel): theta15_criteria: float theta15: List[float] - class Config: - """For converting parameters written to file from snake to camel case.""" + model_config = ConfigDict(extra="allow") - alias_generator = to_camel - populate_by_name = True - -class EncounterRelativeSpeed(BaseModel): +class EncounterRelativeSpeed(BaseModelConfig): """Data type for relative speed between two ships in an encounter.""" overtaking_stand_on: List[float] @@ -65,14 +611,10 @@ class EncounterRelativeSpeed(BaseModel): crossing_give_way: List[float] crossing_stand_on: List[float] - class Config: - """For converting parameters written to file from snake to camel case.""" - - alias_generator = to_camel - populate_by_name = True + model_config = ConfigDict(extra="allow") -class EncounterSettings(BaseModel): +class EncounterSettings(BaseModelConfig): """Data type for encounter settings.""" classification: EncounterClassification @@ -84,21 +626,17 @@ class EncounterSettings(BaseModel): evolve_time: float disable_land_check: bool - class Config: - """For converting parameters written to file from snake to camel case.""" + model_config = ConfigDict(extra="allow") - alias_generator = to_camel - populate_by_name = True - -class OwnShipInitial(BaseModel): +class OwnShipInitial(BaseModelConfig): """Data type for initial data for the own ship used for generating a situation.""" initial: Initial waypoints: Optional[List[Waypoint]] = Field(None, description="An array of `Waypoint` objects.") -class SituationInput(BaseModel): +class SituationInput(BaseModelConfig): """Data type for inputs needed for generating a situations.""" title: str @@ -107,8 +645,4 @@ class SituationInput(BaseModel): own_ship: OwnShipInitial encounters: List[Encounter] - class Config: - """For converting parameters written to file from snake to camel case.""" - - alias_generator = to_camel - populate_by_name = True + model_config = ConfigDict(extra="allow") diff --git a/src/trafficgen/utils.py b/src/trafficgen/utils.py index 08710eb..aa2a9bb 100644 --- a/src/trafficgen/utils.py +++ b/src/trafficgen/utils.py @@ -3,9 +3,9 @@ from typing import List import numpy as np -from maritime_schema.types.caga import Position, Waypoint from trafficgen.marine_system_simulator import flat2llh, llh2flat +from trafficgen.types import GeoPosition, Waypoint def knot_2_m_pr_s(speed_in_knot: float) -> float: @@ -154,50 +154,48 @@ def convert_angle_0_to_2_pi_to_minus_pi_to_pi(angle_2_pi: float) -> float: def calculate_position_at_certain_time( - position: Position, - lat_lon0: Position, + position: GeoPosition, + lat_lon0: GeoPosition, speed: float, course: float, delta_time: float, -) -> Position: +) -> GeoPosition: """ Calculate the position of the ship at a given time based on initial position and delta time, and constant speed and course. Params: - * position{latitude, longitude}: Initial ship position [rad] + * position{lat, lon}: Initial ship position [rad] * speed: Ship speed [m/s] * course: Ship course [rad] * delta_time: Delta time from now to the time new position is being calculated [minutes] Returns ------- - * position{latitude, longitude}: Estimated ship position in delta time minutes [rad] + * position{lat, lon}: Estimated ship position in delta time minutes [rad] """ - north, east, _ = llh2flat( - position.latitude, position.longitude, lat_lon0.latitude, lat_lon0.longitude - ) + north, east, _ = llh2flat(position.lat, position.lon, lat_lon0.lat, lat_lon0.lon) north = north + speed * delta_time * np.cos(course) east = east + speed * delta_time * np.sin(course) - lat_future, lon_future, _ = flat2llh(north, east, lat_lon0.latitude, lat_lon0.longitude) + lat_future, lon_future, _ = flat2llh(north, east, lat_lon0.lat, lat_lon0.lon) - position_future: Position = Position( - latitude=lat_future, - longitude=lon_future, + position_future: GeoPosition = GeoPosition( + lat=lat_future, + lon=lon_future, ) return position_future -def calculate_distance(position_prev: Position, position_next: Position) -> float: +def calculate_distance(position_prev: GeoPosition, position_next: GeoPosition) -> float: """ Calculate the distance in meter between two waypoints. Params: - * position_prev{latitude, longitude}: Previous waypoint [rad] - * position_next{latitude, longitude}: Next waypoint [rad] + * position_prev{lat, lon}: Previous waypoint [rad] + * position_next{lat, lon}: Next waypoint [rad] Returns ------- @@ -205,7 +203,7 @@ def calculate_distance(position_prev: Position, position_next: Position) -> floa """ # Using position of previous waypoint as reference point north_next, east_next, _ = llh2flat( - position_next.latitude, position_next.longitude, position_prev.latitude, position_prev.longitude + position_next.lat, position_next.lon, position_prev.lat, position_prev.lon ) distance: float = np.sqrt(north_next**2 + east_next**2) @@ -217,27 +215,27 @@ def calculate_position_along_track_using_waypoints( waypoints: List[Waypoint], inital_speed: float, vector_time: float, -) -> Position: +) -> GeoPosition: """ Calculate the position of the ship at a given time based on initial position and delta time, and constant speed and course. Params: - * position{latitude, longitude}: Initial ship position [rad] + * position{lat, lon}: Initial ship position [rad] * speed: Ship speed [m/s] * course: Ship course [rad] * delta_time: Delta time from now to the time new position is being calculated [sec] Returns ------- - * position{latitude, longitude}: Estimated ship position in delta time minutes [rad] + * position{lat, lon}: Estimated ship position in delta time minutes [rad] """ time_in_transit: float = 0 for i in range(1, len(waypoints)): ship_speed: float = inital_speed - if waypoints[i].data is not None and waypoints[i].data.model_extra["sog"] is not None: # type: ignore - ship_speed = waypoints[i].data.model_extra["sog"]["value"] # type: ignore + if waypoints[i].leg is not None and waypoints[i].leg.data.sog is not None: # type: ignore + ship_speed = waypoints[i].leg.data.sog # type: ignore dist_between_waypoints = calculate_distance(waypoints[i - 1].position, waypoints[i].position) @@ -259,13 +257,13 @@ def calculate_position_along_track_using_waypoints( return waypoints[-1].position -def calculate_bearing_between_waypoints(position_prev: Position, position_next: Position) -> float: +def calculate_bearing_between_waypoints(position_prev: GeoPosition, position_next: GeoPosition) -> float: """ Calculate the bearing in rad between two waypoints. Params: - * position_prev{latitude, longitude}: Previous waypoint [rad] - * position_next{latitude, longitude}: Next waypoint [rad] + * position_prev{lat, lon}: Previous waypoint [rad] + * position_next{lat, lon}: Next waypoint [rad] Returns ------- @@ -273,7 +271,7 @@ def calculate_bearing_between_waypoints(position_prev: Position, position_next: """ # Using position of previous waypoint as reference point north_next, east_next, _ = llh2flat( - position_next.latitude, position_next.longitude, position_prev.latitude, position_prev.longitude + position_next.lat, position_next.lon, position_prev.lat, position_prev.lon ) bearing: float = convert_angle_minus_pi_to_pi_to_0_to_2_pi(np.arctan2(east_next, north_next)) @@ -282,24 +280,24 @@ def calculate_bearing_between_waypoints(position_prev: Position, position_next: def calculate_destination_along_track( - position_prev: Position, distance: float, bearing: float -) -> Position: + position_prev: GeoPosition, distance: float, bearing: float +) -> GeoPosition: """ Calculate the destination along the track between two waypoints when distance along the track is given. Params: - * position_prev{latitude, longitude}: Previous waypoint [rad] + * position_prev{lat, lon}: Previous waypoint [rad] * distance: Distance to travel [m] * bearing: Bearing from previous waypoint to next waypoint [rad] Returns ------- - * destination{latitude, longitude}: Destination along the track [rad] + * destination{lat, lon}: Destination along the track [rad] """ north = distance * np.cos(bearing) east = distance * np.sin(bearing) - lat, lon, _ = flat2llh(north, east, position_prev.latitude, position_prev.longitude) - destination = Position(latitude=lat, longitude=lon) + lat, lon, _ = flat2llh(north, east, position_prev.lat, position_prev.lon) + destination = GeoPosition(lat=lat, lon=lon) return destination diff --git a/src/trafficgen/write_traffic_situation_to_file.py b/src/trafficgen/write_traffic_situation_to_file.py index 8201875..66fedd0 100644 --- a/src/trafficgen/write_traffic_situation_to_file.py +++ b/src/trafficgen/write_traffic_situation_to_file.py @@ -3,9 +3,8 @@ from pathlib import Path from typing import List, TypeVar -from maritime_schema.types.caga import OwnShip, Ship, TargetShip, TrafficSituation - -from trafficgen.utils import m_pr_s_2_knot, rad_2_deg +from trafficgen.types import OwnShip, Ship, TargetShip, TrafficSituation +from trafficgen.utils import m_2_nm, m_pr_s_2_knot, rad_2_deg T_ship = TypeVar("T_ship", Ship, OwnShip, TargetShip) @@ -64,22 +63,37 @@ def convert_ship_data_from_si_units_to_maritime(ship: T_ship) -> T_ship: * ship: Converted ship data """ assert ship.initial is not None - ship.initial.position.longitude = round(rad_2_deg(ship.initial.position.longitude), 8) - ship.initial.position.latitude = round(rad_2_deg(ship.initial.position.latitude), 8) + assert ship.initial.heading is not None + ship.initial.position.lon = round(rad_2_deg(ship.initial.position.lon), 8) + ship.initial.position.lat = round(rad_2_deg(ship.initial.position.lat), 8) ship.initial.cog = round(rad_2_deg(ship.initial.cog), 2) ship.initial.sog = round(m_pr_s_2_knot(ship.initial.sog), 1) ship.initial.heading = round(rad_2_deg(ship.initial.heading), 2) if ship.waypoints is not None: for waypoint in ship.waypoints: - waypoint.position.latitude = round(rad_2_deg(waypoint.position.latitude), 8) - waypoint.position.longitude = round(rad_2_deg(waypoint.position.longitude), 8) - if not waypoint.data: - continue - assert waypoint.data.model_extra - if waypoint.data.model_extra.get("sog") is not None: - waypoint.data.model_extra["sog"]["value"] = round(m_pr_s_2_knot(waypoint.data.model_extra["sog"]["value"]), 1) # type: ignore - if waypoint.data.model_extra.get("heading") is not None: - waypoint.data.model_extra["heading"]["value"] = round(m_pr_s_2_knot(waypoint.data.model_extra["heading"]["value"]), 2) # type: ignore + waypoint.position.lat = round(rad_2_deg(waypoint.position.lat), 8) + waypoint.position.lon = round(rad_2_deg(waypoint.position.lon), 8) + if waypoint.turn_radius is not None: + waypoint.turn_radius = round(m_2_nm(waypoint.turn_radius), 2) + if waypoint.leg is not None: + if waypoint.leg.starboard_xtd is not None: + waypoint.leg.starboard_xtd = round(m_2_nm(waypoint.leg.starboard_xtd), 2) + if waypoint.leg.portside_xtd is not None: + waypoint.leg.portside_xtd = round(m_2_nm(waypoint.leg.portside_xtd), 2) + if waypoint.leg.data is not None: + if waypoint.leg.data.sog is not None: + assert waypoint.leg.data.sog.value is not None + assert waypoint.leg.data.sog.interp_start is not None + assert waypoint.leg.data.sog.interp_end is not None + waypoint.leg.data.sog.value = round( + m_pr_s_2_knot(waypoint.leg.data.sog.value), 2 + ) + waypoint.leg.data.sog.interp_start = round( + m_2_nm(waypoint.leg.data.sog.interp_start), 2 + ) + waypoint.leg.data.sog.interp_end = round( + m_2_nm(waypoint.leg.data.sog.interp_end), 2 + ) return ship diff --git a/tests/data/test_01/test_01_1.json b/tests/data/test_01/test_01_1.json index 7e76eb4..c795629 100644 --- a/tests/data/test_01/test_01_1.json +++ b/tests/data/test_01/test_01_1.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 270.0, @@ -20,4 +20,4 @@ "vectorTime": 20.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_01/test_01_2.json b/tests/data/test_01/test_01_2.json index 9cd1eff..385d5a0 100644 --- a/tests/data/test_01/test_01_2.json +++ b/tests/data/test_01/test_01_2.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 12.0, "cog": 0.0, @@ -20,4 +20,4 @@ "vectorTime": 25.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_01/test_01_3.json b/tests/data/test_01/test_01_3.json index 47540a5..5a0423b 100644 --- a/tests/data/test_01/test_01_3.json +++ b/tests/data/test_01/test_01_3.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 110.0, @@ -20,4 +20,4 @@ "vectorTime": 20.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_01/test_01_4.json b/tests/data/test_01/test_01_4.json index 1126787..c283d30 100644 --- a/tests/data/test_01/test_01_4.json +++ b/tests/data/test_01/test_01_4.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, @@ -20,4 +20,4 @@ "vectorTime": 20.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_01/test_01_5.json b/tests/data/test_01/test_01_5.json index 929e2cd..be62724 100644 --- a/tests/data/test_01/test_01_5.json +++ b/tests/data/test_01/test_01_5.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 11.0, "cog": 45.0, @@ -20,4 +20,4 @@ "vectorTime": 20.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_02/test_02_1.json b/tests/data/test_02/test_02_1.json index 6730018..283f702 100644 --- a/tests/data/test_02/test_02_1.json +++ b/tests/data/test_02/test_02_1.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 270.0, @@ -19,4 +19,4 @@ "vectorTime": 15.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_02/test_02_2.json b/tests/data/test_02/test_02_2.json index b44a6e5..5168cad 100644 --- a/tests/data/test_02/test_02_2.json +++ b/tests/data/test_02/test_02_2.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, @@ -19,4 +19,4 @@ "relativeSpeed": 0.6 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_03/test_03_1.json b/tests/data/test_03/test_03_1.json index 4d10903..31765e1 100644 --- a/tests/data/test_03/test_03_1.json +++ b/tests/data/test_03/test_03_1.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, @@ -18,4 +18,4 @@ "desiredEncounterType": "overtaking-give-way" } ] -} \ No newline at end of file +} diff --git a/tests/data/test_03/test_03_2.json b/tests/data/test_03/test_03_2.json index 286ad87..2bef70d 100644 --- a/tests/data/test_03/test_03_2.json +++ b/tests/data/test_03/test_03_2.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 12.0, "cog": 230.0, @@ -18,4 +18,4 @@ "desiredEncounterType": "crossing-stand-on" } ] -} \ No newline at end of file +} diff --git a/tests/data/test_04/test_04_1.json b/tests/data/test_04/test_04_1.json index 1390687..fb264c0 100644 --- a/tests/data/test_04/test_04_1.json +++ b/tests/data/test_04/test_04_1.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, @@ -22,4 +22,4 @@ "desiredEncounterType": "head-on" } ] -} \ No newline at end of file +} diff --git a/tests/data/test_05/test_05_1.json b/tests/data/test_05/test_05_1.json index fb6788e..c773518 100644 --- a/tests/data/test_05/test_05_1.json +++ b/tests/data/test_05/test_05_1.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, @@ -19,4 +19,4 @@ "desiredEncounterType": "crossing-give-way" } ] -} \ No newline at end of file +} diff --git a/tests/data/test_05/test_05_2.json b/tests/data/test_05/test_05_2.json index b141aa8..26948fd 100644 --- a/tests/data/test_05/test_05_2.json +++ b/tests/data/test_05/test_05_2.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, @@ -22,4 +22,4 @@ "desiredEncounterType": "overtaking-give-way" } ] -} \ No newline at end of file +} diff --git a/tests/data/test_05/test_05_3.json b/tests/data/test_05/test_05_3.json index c6752e4..8f6004c 100644 --- a/tests/data/test_05/test_05_3.json +++ b/tests/data/test_05/test_05_3.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 270.0, @@ -24,4 +24,4 @@ "desiredEncounterType": "head-on" } ] -} \ No newline at end of file +} diff --git a/tests/data/test_06/test_06_1.json b/tests/data/test_06/test_06_1.json index 6fb6bde..7e0d30c 100644 --- a/tests/data/test_06/test_06_1.json +++ b/tests/data/test_06/test_06_1.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, @@ -26,4 +26,4 @@ "vectorTime": 15.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_06/test_06_2.json b/tests/data/test_06/test_06_2.json index 9df0882..505dbe8 100644 --- a/tests/data/test_06/test_06_2.json +++ b/tests/data/test_06/test_06_2.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, @@ -20,4 +20,4 @@ "vectorTime": 20.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_07/test_07_1.json b/tests/data/test_07/test_07_1.json index f60c8ed..f7207a6 100644 --- a/tests/data/test_07/test_07_1.json +++ b/tests/data/test_07/test_07_1.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 10.0, "cog": 270.0, @@ -19,4 +19,4 @@ "beta": 7.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_07/test_07_2.json b/tests/data/test_07/test_07_2.json index 54959ce..089e374 100644 --- a/tests/data/test_07/test_07_2.json +++ b/tests/data/test_07/test_07_2.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, @@ -19,4 +19,4 @@ "beta": 90.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_07/test_07_3.json b/tests/data/test_07/test_07_3.json index fe3c978..7109263 100644 --- a/tests/data/test_07/test_07_3.json +++ b/tests/data/test_07/test_07_3.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 110.0, @@ -19,4 +19,4 @@ "beta": -12.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_07/test_07_4.json b/tests/data/test_07/test_07_4.json index a40c518..ab79c35 100644 --- a/tests/data/test_07/test_07_4.json +++ b/tests/data/test_07/test_07_4.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, @@ -19,4 +19,4 @@ "beta": 320.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_07/test_07_5.json b/tests/data/test_07/test_07_5.json index f0ecbf3..119f15d 100644 --- a/tests/data/test_07/test_07_5.json +++ b/tests/data/test_07/test_07_5.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 11.0, "cog": 45.0, @@ -19,4 +19,4 @@ "beta": 15.0 } ] -} \ No newline at end of file +} diff --git a/tests/data/test_08/test_08_1.json b/tests/data/test_08/test_08_1.json index 50b6e73..4f520af 100644 --- a/tests/data/test_08/test_08_1.json +++ b/tests/data/test_08/test_08_1.json @@ -4,8 +4,8 @@ "ownShip": { "initial": { "position": { - "latitude": 58.763449, - "longitude": 10.490654 + "lat": 58.763449, + "lon": 10.490654 }, "sog": 8.0, "cog": 0.0, diff --git a/tests/test_read_files.py b/tests/test_read_files.py index b4ddb93..330a22b 100644 --- a/tests/test_read_files.py +++ b/tests/test_read_files.py @@ -3,18 +3,19 @@ from pathlib import Path from typing import List, Set -from maritime_schema.types.caga import ( - GeneralShipType, - ShipStatic, -) - from trafficgen.read_files import ( read_encounter_settings_file, read_own_ship_static_file, read_situation_files, read_target_ship_static_files, ) -from trafficgen.types import EncounterSettings, EncounterType, SituationInput +from trafficgen.types import ( + AisShipType, + EncounterSettings, + EncounterType, + ShipStatic, + SituationInput, +) def test_read_situations_1_ts_full_spec(situations_folder_test_01: Path): @@ -152,11 +153,12 @@ def test_read_own_ship(own_ship_file: Path): Test reading own ship file. """ own_ship_static: ShipStatic = read_own_ship_static_file(own_ship_file) - assert own_ship_static.length is not None - assert own_ship_static.width is not None - assert own_ship_static.speed_max is not None + assert own_ship_static.dimensions is not None + assert own_ship_static.dimensions.length is not None + assert own_ship_static.dimensions.width is not None + assert own_ship_static.sog_max is not None assert own_ship_static.mmsi is not None - assert own_ship_static.ship_type is GeneralShipType.PASSENGER + assert own_ship_static.ship_type is AisShipType.PASSENGER def test_read_target_ships(target_ships_folder: Path): @@ -167,9 +169,10 @@ def test_read_target_ships(target_ships_folder: Path): # sourcery skip: no-loop-in-tests for target_ship_static in target_ships_static: - assert target_ship_static.length is not None - assert target_ship_static.width is not None - assert target_ship_static.speed_max is not None + assert target_ship_static.dimensions is not None + assert target_ship_static.dimensions.length is not None + assert target_ship_static.dimensions.width is not None + assert target_ship_static.sog_max is not None def test_read_encounter_settings_file(settings_file: Path): diff --git a/tests/test_trafficgen.py b/tests/test_trafficgen.py index 18da62a..d887476 100644 --- a/tests/test_trafficgen.py +++ b/tests/test_trafficgen.py @@ -5,15 +5,15 @@ import pytest from click.testing import CliRunner -from maritime_schema.types.caga import ( - TrafficSituation, -) from trafficgen import cli from trafficgen.read_files import ( read_generated_situation_files, ) from trafficgen.ship_traffic_generator import generate_traffic_situations +from trafficgen.types import ( + TrafficSituation, +) @pytest.fixture diff --git a/tests/test_write_files.py b/tests/test_write_files.py index c992355..a5d5195 100644 --- a/tests/test_write_files.py +++ b/tests/test_write_files.py @@ -3,14 +3,13 @@ from pathlib import Path from typing import List -from maritime_schema.types.caga import ( - TrafficSituation, -) - from trafficgen.read_files import ( read_generated_situation_files, ) from trafficgen.ship_traffic_generator import generate_traffic_situations +from trafficgen.types import ( + TrafficSituation, +) from trafficgen.write_traffic_situation_to_file import write_traffic_situations_to_json_file From e5e8f8a29e659ad301a16b0d3b6f99f0d7a0b0f9 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Fri, 20 Dec 2024 13:36:19 +0100 Subject: [PATCH 02/23] Fixed missing conversion for own ship and target ship --- src/trafficgen/read_files.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/trafficgen/read_files.py b/src/trafficgen/read_files.py index 9035a63..387efcc 100644 --- a/src/trafficgen/read_files.py +++ b/src/trafficgen/read_files.py @@ -6,7 +6,14 @@ from typing import Any, Dict, List, Union, cast from uuid import UUID, uuid4 -from trafficgen.types import EncounterSettings, ShipStatic, SituationInput, TrafficSituation +from trafficgen.types import ( + EncounterSettings, + OwnShip, + ShipStatic, + SituationInput, + TargetShip, + TrafficSituation, +) from trafficgen.utils import deg_2_rad, knot_2_m_pr_s, min_2_s, nm_2_m @@ -140,6 +147,7 @@ def read_own_ship_static_file(own_ship_static_file: Path) -> ShipStatic: data.update({"id": ship_id}) ship_static: ShipStatic = ShipStatic(**data) + ship_static = convert_ship_data_from_maritime_to_si_units(ship_static) return ship_static @@ -169,10 +177,27 @@ def read_target_ship_static_files(target_ship_folder: Path) -> List[ShipStatic]: data.update({"id": ship_id}) target_ship_static: ShipStatic = ShipStatic(**data) + target_ship_static = convert_ship_data_from_maritime_to_si_units(target_ship_static) target_ships_static.append(target_ship_static) return target_ships_static +def convert_ship_data_from_maritime_to_si_units(ship: ShipStatic) -> ShipStatic: + """ + Convert ship static data which is given in maritime units to SI units. + + Returns + ------- + * ShipStatic + """ + if ship.sog_max is not None: + ship.sog_max = knot_2_m_pr_s(ship.sog_max) + if ship.sog_min is not None: + ship.sog_min = knot_2_m_pr_s(ship.sog_min) + + return ship + + def read_encounter_settings_file(settings_file: Path) -> EncounterSettings: """ Read encounter settings file. From 1c2a27755643c9034915e3eec5bc9b80552851fc Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Wed, 8 Jan 2025 07:53:00 +0100 Subject: [PATCH 03/23] Working on #43. Also updating project to support UV instead of poetry. --- .coveragerc | 13 + .editorconfig | 1 - .pre-commit-config.yaml | 20 + .sourcery.yaml | 29 +- AUTHORS.rst | 19 - HISTORY.rst => CHANGELOG.md | 50 +- CITATION.cff | 39 + CONTRIBUTING.rst | 137 - LICENSE | 2 +- README.md | 61 +- STYLEGUIDE.md | 423 +++ condaenv.yml | 5 - docs/api.rst | 7 - docs/authors.rst | 1 - docs/conf.py | 164 - docs/contributing.rst | 1 - docs/history.rst | 1 - docs/index.rst | 28 - docs/source/CHANGELOG.md | 2 + docs/source/LICENSE.md | 3 + docs/source/README.md | 2 + docs/source/STYLEGUIDE.md | 2 + docs/source/_static/DNV_logo_RGB.jpg | Bin 0 -> 202826 bytes docs/source/_static/my_package.svg | 1 + docs/source/_templates/custom-class.rst | 30 + docs/source/_templates/custom-module.rst | 67 + docs/source/cli.__main__.rst | 3 + docs/source/cli.rst | 7 + docs/source/conf.py | 85 + docs/source/index.rst | 26 + docs/source/my_package.rst | 25 + docs/trafficgen.check_land_crossing.rst | 7 - docs/trafficgen.cli.rst | 7 - docs/trafficgen.encounter.rst | 7 - docs/trafficgen.marine_system_simulator.rst | 7 - docs/trafficgen.plot_traffic_situation.rst | 7 - docs/trafficgen.read_files.rst | 7 - docs/trafficgen.rst | 24 - docs/trafficgen.ship_traffic_generator.rst | 7 - docs/trafficgen.types.rst | 7 - docs/trafficgen.utils.rst | 7 - ...ficgen.write_traffic_situation_to_file.rst | 7 - pyproject.toml | 241 +- pytest.ini | 5 + ruff.toml | 153 + src/trafficgen/check_land_crossing.py | 1 - src/trafficgen/cli.py | 15 +- src/trafficgen/encounter.py | 118 +- src/trafficgen/marine_system_simulator.py | 14 +- src/trafficgen/plot_traffic_situation.py | 58 +- src/trafficgen/read_files.py | 67 +- src/trafficgen/ship_traffic_generator.py | 23 +- src/trafficgen/types.py | 144 +- src/trafficgen/utils.py | 50 +- .../write_traffic_situation_to_file.py | 19 +- tests/conftest.py | 2 +- tests/test_read_files.py | 19 +- tests/test_trafficgen.py | 19 +- tests/test_write_files.py | 14 +- uv.lock | 2911 +++++++++++++++++ 60 files changed, 4245 insertions(+), 976 deletions(-) create mode 100644 .coveragerc create mode 100644 .pre-commit-config.yaml delete mode 100644 AUTHORS.rst rename HISTORY.rst => CHANGELOG.md (53%) create mode 100644 CITATION.cff delete mode 100644 CONTRIBUTING.rst create mode 100644 STYLEGUIDE.md delete mode 100644 condaenv.yml delete mode 100644 docs/api.rst delete mode 100644 docs/authors.rst delete mode 100644 docs/conf.py delete mode 100644 docs/contributing.rst delete mode 100644 docs/history.rst delete mode 100644 docs/index.rst create mode 100644 docs/source/CHANGELOG.md create mode 100644 docs/source/LICENSE.md create mode 100644 docs/source/README.md create mode 100644 docs/source/STYLEGUIDE.md create mode 100644 docs/source/_static/DNV_logo_RGB.jpg create mode 100644 docs/source/_static/my_package.svg create mode 100644 docs/source/_templates/custom-class.rst create mode 100644 docs/source/_templates/custom-module.rst create mode 100644 docs/source/cli.__main__.rst create mode 100644 docs/source/cli.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst create mode 100644 docs/source/my_package.rst delete mode 100644 docs/trafficgen.check_land_crossing.rst delete mode 100644 docs/trafficgen.cli.rst delete mode 100644 docs/trafficgen.encounter.rst delete mode 100644 docs/trafficgen.marine_system_simulator.rst delete mode 100644 docs/trafficgen.plot_traffic_situation.rst delete mode 100644 docs/trafficgen.read_files.rst delete mode 100644 docs/trafficgen.rst delete mode 100644 docs/trafficgen.ship_traffic_generator.rst delete mode 100644 docs/trafficgen.types.rst delete mode 100644 docs/trafficgen.utils.rst delete mode 100644 docs/trafficgen.write_traffic_situation_to_file.rst create mode 100644 pytest.ini create mode 100644 ruff.toml create mode 100644 uv.lock diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..85101ea --- /dev/null +++ b/.coveragerc @@ -0,0 +1,13 @@ +[paths] +source = + src/trafficgen + */site-packages/trafficgen + +[run] +source = trafficgen +branch = True + +[report] +fail_under = 10.0 +show_missing = True +skip_covered = True diff --git a/.editorconfig b/.editorconfig index b46c31e..6dda6af 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,7 +6,6 @@ root = true [*] indent_style = space indent_size = 4 -end_of_line = crlf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..5e8d030 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,20 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: mixed-line-ending + args: [--fix=auto] + - id: trailing-whitespace + - id: check-yaml + - id: check-toml + - id: check-merge-conflict + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.8.3 + hooks: + - id: ruff-format + - id: ruff + # - repo: https://github.com/pre-commit/mirrors-mypy + # rev: v1.13.0 + # hooks: + # - id: mypy +exclude: '(.venv|.*_cache)/.*' diff --git a/.sourcery.yaml b/.sourcery.yaml index d611d79..032322b 100644 --- a/.sourcery.yaml +++ b/.sourcery.yaml @@ -9,27 +9,26 @@ # This file was auto-generated by Sourcery on 2023-02-22 at 11:42. -version: '1' # The schema version of this config file +version: '1' # The schema version of this config file ignore: # A list of paths or files which Sourcery will ignore. -- .git -- .venv -- .tox -- build -- dist -- __pycache__ - + - .git + - .venv + - .tox + - dist + - __pycache__ + - docs/build rule_settings: enable: - - default - disable: # A list of rule IDs Sourcery will never suggest. - - inline-immediately-returned-variable + - default + disable: # A list of rule IDs Sourcery will never suggest. + - inline-immediately-returned-variable rule_types: - - refactoring - - suggestion - - comment - python_version: '3.9' # A string specifying the lowest Python version your project supports. Sourcery will not suggest refactorings requiring a higher Python version. + - refactoring + - suggestion + - comment + python_version: '3.10' # A string specifying the lowest Python version your project supports. Sourcery will not suggest refactorings requiring a higher Python version. # rules: # A list of custom rules Sourcery will include in its analysis. # - id: no-print-statements diff --git a/AUTHORS.rst b/AUTHORS.rst deleted file mode 100644 index e4eec4e..0000000 --- a/AUTHORS.rst +++ /dev/null @@ -1,19 +0,0 @@ -======= -Authors -======= - -Primary author ---------------- -Tom Arne Pedersen -Tom.Arne.Pedersen@dnv.com - -Claas Rostock -claas.rostock@dnv.com - -Minos Hemrich -Minos.Hemrich@dnv.com - -Testers ---------------- -* Grunde Løvoll -* Stephanie Kemna diff --git a/HISTORY.rst b/CHANGELOG.md similarity index 53% rename from HISTORY.rst rename to CHANGELOG.md index d9a9e19..9bcc011 100644 --- a/HISTORY.rst +++ b/CHANGELOG.md @@ -1,27 +1,31 @@ -======= -History -======= +# Changelog +All notable changes to the trafficgen project will be documented in this file.
+The changelog format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -0.6.0 (2024-11-11) ------------------- +## [Unreleased] -Changed +-/- + + +## [0.6.0] - 2024-11-11 + +### Changed * Updated to download-artifact@v4 (from download-artifact@v3) -0.5.0 (2024-04-26) ------------------- -Changed +## [0.5.0] - 2024-04-26 + +### Changed * removed specific names for target ships. Files generated with target ship 1, 2 etc. * changed tests. Still need to figure out why some tests "fail" using CLI. -0.4.0 (2024-04-19) ------------------- -Changed +## [0.4.0] - 2024-04-19 + +### Changed * possible to have several aypoints for own ship * fixing pyright error @@ -30,20 +34,18 @@ Changed * situation length is used when checking if target ship is passing land -0.3.0 (2024-04-10) ------------------- +## [0.3.0] - 2024-04-10 -Changed +### Changed * using types from maritime schema * lat/lon used instead of north/east * the generated output files are using "maritime" units: knots and degrees -0.2.0 (2024-01-11) ------------------- +## [0.2.0] - 2024-01-11 -Changed +### Changed * add-basic-code-quality-settings-black-ruff-pyright, * first-small-round-of-code-improvement @@ -56,7 +58,15 @@ Changed * length of encounter may be specified by user -0.1.0 (2023-11-08) ------------------- +## [0.1.0] - 2023-11-08 * First release on PyPI. + + + +[0.6.0]: https://github.com/dnv-opensource/ship-traffic-generator/releases/tag/v0.6.0 +[0.5.0]: https://github.com/dnv-opensource/ship-traffic-generator/compare/v0.4.0...v0.5.0 +[0.4.0]: https://github.com/dnv-opensource/ship-traffic-generator/compare/v0.3.0...v0.4.0 +[0.3.0]: https://github.com/dnv-opensource/ship-traffic-generator/compare/v0.2.0...v0.3.0 +[0.2.0]: https://github.com/dnv-opensource/ship-traffic-generator/releases/tag/v0.2.0 +[trafficgen]: https://github.com/dnv-opensource/ship-traffic-generator diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..3d16201 --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,39 @@ +cff-version: 1.2.0 +title: trafficgen +message: Ship Traffic Generator. +type: software +authors: + - name: DNV + address: 'Veritasveien 1, 1363 Høvik' + city: Oslo + website: 'https://www.dnv.com/' + - given-names: Tom Arne + family-names: Pedersen + email: Tom.Arne.Pedersen@dnv.com + affiliation: DNV + - given-names: Claas + family-names: Rostock + email: claas.rostock@dnv.com + affiliation: DNV + - given-names: Minos + family-names: Hemrich + email: Minos.Hemrich@dnv.com + affiliation: DNV +testers: + - given-names: Grunde + family-names: Løvoll + affiliation: DNV + - given-names: Stephanie + family-names: Kemna + affiliation: DNV +abstract: >- + The tool trafficgen generates unlimited set of encounters (based on input parameters) + to allow a systematic assessment of the vessel's ability to act according to COLREG + using simulation-based testing. +keywords: + - Traffic Generator + - Simulation-based testing + - Systematic assessment +license: MIT +url: 'https://github.com/dnv-opensource/ship-traffic-generator' +version: 0.6.0 diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst deleted file mode 100644 index fb60dd3..0000000 --- a/CONTRIBUTING.rst +++ /dev/null @@ -1,137 +0,0 @@ -.. highlight:: shell - -============ -Contributing -============ - -Contributions are welcome, and they are greatly appreciated! Every little bit -helps, and credit will always be given. - -You can contribute in many ways: - -Types of Contributions ----------------------- - -Report Bugs -~~~~~~~~~~~ - -Report bugs at https://github.com/dnv-opensource/ship-traffic-generator/issues. - -If you are reporting a bug, please include: - -* Your operating system name and version. -* The version of Python (and Conda) that you are using. -* Any additional details about your local setup that might be helpful in troubleshooting. -* Detailed steps to reproduce the bug. - -Fix Bugs -~~~~~~~~ - -Look through the GitHub issues for bugs. Anything tagged with "bug" and "help -wanted" is open to whoever wants to implement it. - -Implement Features -~~~~~~~~~~~~~~~~~~ - -Look through the GitHub issues for features. Anything tagged with "enhancement" -and "help wanted" is open to whoever wants to implement it. - -Write Documentation -~~~~~~~~~~~~~~~~~~~ - -Traffic Generator could always use more documentation, whether as part of the -official Traffic Generator docs, in docstrings, or even on the web in blog posts, -articles, and such. - -Submit Feedback -~~~~~~~~~~~~~~~ - -The best way to send feedback is to file an issue at https://github.com/dnv-opensource/ship-traffic-generator/issues. - -If you are proposing a feature: - -* Explain in detail how it would work. -* Keep the scope as narrow as possible, to make it easier to implement. -* Remember that this is a volunteer-driven project, and that contributions - are welcome :) - -Get Started! ------------- - -Ready to contribute? Here's how to set up `trafficgen` for local development. - -1. Clone the `trafficgen` repo on GitHub. -2. Install your local copy into a pyenv or conda environment. -3. Create a branch for local development:: - - $ git checkout -b name-of-your-bugfix-or-feature - - Now you can make your changes locally. - -4. When you're done making changes, check that your changes pass flake8 and the - tests, including testing other Python versions with tox:: - - $ flake8 --config tox.ini ./src/trafficgen ./tests - $ pytest ./tests - $ tox - - If you installed the package with `poetry` - - $ poetry install --with dev,docs - - flake8, pytest and tox should already be installed in your Python environment. - Note that the tox config assumes Python 3.10 and Python 3.11, you would have - to have them both available to tox for all tests to run. - If you only have one of these available tox will skip the non supported - environment (and in most cases that is OK). - If you are managing your Python enhancements with `pyenv` you will have to - install the necessary versions and then run `pyenv rehash` to make them - available to tox (or set multiple local envs with `pyenv local py310 py311`). - If you are using `conda` you will have to create a new environment with - the necessary Python version, install `virtualenv` in the environments - and then run `conda activate ` to make it available to tox (to run all - the environments in one go do `conda activate` inside activated environments). - - You can also run the python tests from VSCode via the "Testing" view, - "Configure Python Tests", with `pytest`` and select the folder `tests`. - -5. Commit your changes and push your branch to the source repo:: - - $ git add . - $ git commit -m "Your detailed description of your changes." - $ git push origin name-of-your-bugfix-or-feature - -6. Submit a pull request through https://github.com/dnv-opensource/ship-traffic-generator/pulls. - - -Pull Request Guidelines ------------------------ - -Before you submit a pull request, check that it meets these guidelines: - -1. The pull request should include tests. -2. If the pull request adds functionality, the docs should be updated. Put - your new functionality into a function with a docstring, and add the - feature to the list in README.md. -3. The pull request should work for Python 3.10. - - -Tips ----- - -To run a subset of tests:: - -$ pytest tests.test_trafficgen - - - -Deploying ---------- - -A reminder for the maintainers on how to deploy. -Make sure all your changes are committed (including an entry in HISTORY.rst). -Then run:: - -$ bump2version patch # possible: major / minor / patch -$ git push -$ git push --tags diff --git a/LICENSE b/LICENSE index 59ccfc7..90b0cc3 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 DNV open source +Copyright (c) 2024 [DNV](https://www.dnv.com) [open source](https://github.com/dnv-opensource) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index ae5094b..189b695 100644 --- a/README.md +++ b/README.md @@ -6,45 +6,72 @@ the tool will generate a set of traffic situations. The traffic situations may b A paper is written describing the background for the tool and how it works [paper] -## Quickstart -After you clone this repository, `trafficgen` can then be installed with the following steps: +## UV +This project uses `uv` as package manager. +If you haven't already, install [uv](https://docs.astral.sh/uv), preferably using it's ["Standalone installer"](https://docs.astral.sh/uv/getting-started/installation/#__tabbed_1_2) method:
+..on Windows: ```sh -$ cd ship_traffic_generator +powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" +``` +..on MacOS and Linux: +```sh +curl -LsSf https://astral.sh/uv/install.sh | sh ``` +(see [docs.astral.sh/uv](https://docs.astral.sh/uv/getting-started/installation/) for all / alternative installation methods.) + +Once installed, you can update `uv` to its latest version, anytime, by running: +```sh +uv self update +``` + +## Python +The traffic generator requires Python 3.10 or later.
-It is recommended to install the `trafficgen` package and it's dependencies in a separate -Python environment (Anaconda, pyenv, or virtualenv). `trafficgen` requires Python 3.10 or higher. +If you don't already have a compatible version installed on your machine, you way install Python through `uv`: +```sh +uv python install +``` +This will install the latest stable version of Python into the uv Python directory, i.e. as a uv-managed version of Python. -In Anaconda this can be done with: +Alternatively, and if you want a standalone version of Python on your machine, you can install Python either via `winget`: ```sh -$ conda create --name myenv python=3.10 -$ conda activate myenv +winget install --id Python.Python ``` +or you can download and install Python from the [python.org](https://www.python.org/downloads/) website. -In Powershell terminal with venv (also from VSCode), this can be done with: +## Clone the repository +Clone the traffig generator repository into your local development directory: +```sh +git clone https://github.com/dnv-opensource/ship-traffic-generator path/to/your/dir/ship-traffic-generator +``` +Change into the project directory after cloning: ```sh -$ python -m venv .venv -$ .venv\Scripts\Activate.ps1 +cd ship-traffic-generator ``` -Then update pip/setuptools, and install the dependencies for this repo: +## Install dependencies +Run `uv sync` to create a virtual environment and install all project dependencies into it: ```sh -$ python -m pip install --upgrade pip setuptools -$ pip install -e . +uv sync ``` +> **Note**: Using `--no-dev` will omit installing development dependencies. + +> **Note**: `uv` will create a new virtual environment called `.venv` in the project root directory when running +> `uv sync` the first time. Optionally, you can create your own virtual environment using e.g. `uv venv`, before running +> `uv sync`. -This will install the `trafficgen` Python package and command line tool (cli). You can check your installation by running: ```sh -$ trafficgen --help +uv run trafficgen --help ``` For more information on usage, run: ```sh -$ trafficgen gen-situation --help +trafficgen gen-situation --help ``` or build the documentation (see below). +TODO: FORTSETT HER, HVORDAN BYGGE DOKUMENTASJON ## Development & Documentation For development (dependency management, documentation and testing) it is recommended to use [Poetry](https://python-poetry.org/docs/). See Poetry's documentation for information of how to install and set up. diff --git a/STYLEGUIDE.md b/STYLEGUIDE.md new file mode 100644 index 0000000..d4ab3f8 --- /dev/null +++ b/STYLEGUIDE.md @@ -0,0 +1,423 @@ + +# Style Guide + +All code shall be [Ruff](https://docs.astral.sh/ruff) formatted. + +References, details as well as examples of bad/good styles and their respective reasoning can be found below. + +## References + +* [PEP-8](https://www.python.org/dev/peps/pep-0008/) (see also [pep8.org](https://pep8.org/)) +* [PEP-257](https://www.python.org/dev/peps/pep-0257/) +* Python style guide by [theluminousmen.com](https://luminousmen.com/post/the-ultimate-python-style-guidelines) +* [Documenting Python Code: A Complete Guide](https://realpython.com/documenting-python-code) +* [Jupyter](https://jupyter.readthedocs.io/en/latest/contributing/ipython-dev-guide/coding_style.html) style guide +* Python style guide on [learnpython.com](https://learnpython.com/blog/python-coding-best-practices-and-style-guidelines/) +* [Ruff](https://docs.astral.sh/ruff) + +## Code Layout + +* Use 4 spaces instead of tabs +* Maximum line length is 120 characters (not 79 as proposed in [PEP-8](https://www.python.org/dev/peps/pep-0008/)) +* 2 blank lines between classes and functions +* 1 blank line within class, between class methods +* Use blank lines for logic separation of functionality within functions/methods wherever it is justified +* No whitespace adjacent to parentheses, brackets, or braces + +```py + # Bad + spam( items[ 1 ], { key1 : arg1, key2 : arg2 }, ) + + # Good + spam(items[1], {key1: arg1, key2: arg2}, []) +``` + +* Surround operators with single whitespace on either side. + +```py + # Bad + x<1 + + # Good + x == 1 +``` + +* Never end your lines with a semicolon, and do not use a semicolon to put two statements on the same line +* When branching, always start a new block on a new line + +```py + # Bad + if flag: return None + + # Good + if flag: + return None +``` + +* Similarly to branching, do not write methods on one line in any case: + +```py + # Bad + def do_something(self): print("Something") + + # Good + def do_something(self): + print("Something") +``` + +* Place a class's `__init__` function (the constructor) always at the beginning of the class + +## Line Breaks + +* If function arguments do not fit into the specified line length, move them to a new line with indentation + +```py + # Bad + def long_function_name(var_one, var_two, var_three, + var_four): + print(var_one) + + # Bad + def long_function_name(var_one, var_two, var_three, + var_four): + print(var_one) + + # Better (but not preferred) + def long_function_name(var_one, + var_two, + var_three, + var_four): + print(var_one) + + # Good (and preferred) + def long_function_name( + var_one, + var_two, + var_three, + var_four, + ): + print(var_one) +``` + +* Move concatenated logical conditions to new lines if the line does not fit the maximum line size. This will help you understand the condition by looking from top to bottom. Poor formatting makes it difficult to read and understand complex predicates. + +```py + # Good + if ( + this_is_one_thing + and that_is_another_thing + or that_is_third_thing + or that_is_yet_another_thing + and one_more_thing + ): + do_something() +``` + +* Where binary operations stretch multiple lines, break lines before the binary operators, not thereafter + +```py + # Bad + GDP = ( + private_consumption + + gross_investment + + government_investment + + government_spending + + (exports - imports) + ) + + # Good + GDP = ( + private_consumption + + gross_investment + + government_investment + + government_spending + + (exports - imports) + ) +``` + +* Chaining methods should be broken up on multiple lines for better readability + +```py + ( + df.write.format("jdbc") + .option("url", "jdbc:postgresql:dbserver") + .option("dbtable", "schema.tablename") + .option("user", "username") + .option("password", "password") + .save() + ) +``` + +* Add a trailing comma to sequences of items when the closing container token ], ), or } does not appear on the same line as the final element + +```py + # Bad + y = [ + 0, + 1, + 4, + 6 + ] + z = { + 'a': 1, + 'b': 2 + } + + # Good + x = [1, 2, 3] + + # Good + y = [ + 0, + 1, + 4, + 6, <- note the trailing comma + ] + z = { + 'a': 1, + 'b': 2, <- note the trailing comma + } +``` + +## String Formatting + +* When quoting string literals, use double-quoted strings. When the string itself contains single or double quote characters, however, use the respective other one to avoid backslashes in the string. It improves readability. +* Use f-strings to format strings: + +```py + # Bad + print("Hello, %s. You are %s years old. You are a %s." % (name, age, profession)) + + # Good + print(f"Hello, {name}. You are {age} years old. You are a {profession}.") +``` + +* Use multiline strings, not \ , since it gets much more readable. + +```py + raise AttributeError( + "Here is a multiline error message with a very long first line " + "and a shorter second line." + ) +``` + +## Naming Conventions + +* For module names: `lowercase` . +Long module names can have words separated by underscores (`really_long_module_name.py`), but this is not required. Try to use the convention of nearby files. +* For class names: `CamelCase` +* For methods, functions, variables and attributes: `lowercase_with_underscores` +* For constants: `UPPERCASE` or `UPPERCASE_WITH_UNDERSCORES` +(Python does not differentiate between variables and constants. Using UPPERCASE for constants is just a convention, but helps a lot to quickly identify variables meant to serve as constants.) +* Implementation-specific private methods and variables will use `_single_underscore_prefix` +* Don't include the type of a variable in its name. + E.g. use `senders` instead of `sender_list` +* Names shall be clear about what a variable, class, or function contains or does. If you struggle to come up with a clear name, rethink your architecture: Often, the difficulty in finding a crisp name for something is a hint that separation of responsibilities can be improved. The solution then is less to agree on a name, but to start a round of refactoring: The name you're seeking often comes naturally then with refactoring to an improved architecture with clear responsibilities. +(see [SRP](https://en.wikipedia.org/wiki/Single-responsibility_principle), Single-Responsibilty Principle by Robert C. Martin) + +## Named Arguments + +* Use named arguments to improve readability and avoid mistakes introduced with future code maintenance + +```py + # Bad + urlget("[http://google.com](http://google.com/)", 20) + + # Good + urlget("[http://google.com](http://google.com/)", timeout=20) +``` + +* Never use mutable objects as default arguments in Python. If an attribute in a class or a named parameter in a function is of a mutable data type (e.g. a list or dict), never set its default value in the declaration of an object but always set it to None first, and then only later assign the default value in the class's constructor, or the functions body, respectively. Sounds complicated? If you prefer the shortcut, the examples below are your friend. +If you are interested in the long story including the why‘s, read these discussions on [Reddit](https://old.reddit.com/r/Python/comments/opb7hm/do_not_use_mutable_objects_as_default_arguments/) and [Twitter](https://twitter.com/willmcgugan/status/1419616480971399171). + +```py + # Bad + class Foo: + items = [] + + # Good + class Foo: + items = None + def __init__(self): + self.items = [] + + + # Bad + class Foo: + def __init__(self, items=[]): + self.items = items + + # Good + class Foo: + def __init__(self, items=None): + self.items = items or [] + + + # Bad + def some_function(x, y, items=[]): + ... + + # Good + def some_function(x, y, items=None): + items = items or [] + ... +``` + +## Commenting + +* First of all, if the code needs comments to clarify its work, you should think about refactoring it. The best comment to code is the code itself. +* Describe complex, possibly incomprehensible points and side effects in the comments +* Separate `#` and the comment with one whitespace + +```py + #bad comment + # good comment +``` + +* Use inline comments sparsely +* Where used, inline comments shall have 2 whitespaces before the `#` and one whitespace thereafter + +```py + x = y + z # inline comment + str1 = str2 + str3 # another inline comment +``` + +* If a piece of code is poorly understood, mark the piece with a `@TODO:` tag and your name to support future refactoring: + +```py + def get_ancestors_ids(self): + # @TODO: Do a cache reset while saving the category tree. CLAROS, YYYY-MM-DD + cache_name = f"{self._meta.model_name}_ancestors_{self.pk}" + cached_ids = cache.get(cache_name) + if cached_ids: + return cached_ids + + ids = [c.pk for c in self.get_ancestors(include_self=True)] + cache.set(cache_name, ids, timeout=3600) + + return ids +``` + +## Type hints + +* Use type hints in function signatures and module-scope variables. This is good documentation and can be used with linters for type checking and error checking. Use them whenever possible. +* Use pyi files to type annotate third-party or extension modules. + +## Docstrings + +* All Docstrings should be written in [Numpy](https://numpydoc.readthedocs.io/en/latest/format.html) format. For a good tutorial on Docstrings, see [Documenting Python Code: A Complete Guide](https://realpython.com/documenting-python-code) +* In a Docstring, summarize function/method behavior and document its arguments, return value(s), side effects, exceptions raised, and restrictions +* Wrap Docstrings with triple double quotes (""") +* The description of the arguments must be indented + +```py + def some_method(name, print=False): + """This function does something + + Parameters + ---------- + name : str + The name to use + print: bool, optional + A flag used to print the name to the console, by default False + + Raises + ------ + KeyError + If name is not found + + Returns + ------- + int + The return code + """ + ... + return 0 +``` + +## Exceptions + +* Raise specific exceptions and catch specific exceptions, such as KeyError, ValueError, etc. +* Do not raise or catch just Exception, except in rare cases where this is unavoidable, such as a try/except block on the top-level loop of some long-running process. For a good tutorial on why this matters, see [The Most Diabolical Python Antipattern](https://realpython.com/the-most-diabolical-python-antipattern/). +* Minimize the amount of code in a try/except block. The larger the body of the try, + the more likely that an exception will be raised by a line of code that you didn’t expect to raise an exception. + +## Imports + +* Avoid creating circular imports by importing modules more specialized than the one you are editing +* Relative imports are forbidden ([PEP-8](https://www.python.org/dev/peps/pep-0008/) only “highly discourages” them). Where absolutely needed, the `from future import absolute_import` syntax should be used (see [PEP-328](https://www.python.org/dev/peps/pep-0328/)) +* Never use wildcard imports (`from import *`). Always be explicit about what you're importing. Namespaces make code easier to read, so use them. +* Break long imports using parentheses and indent by 4 spaces. Include the trailing comma after the last import and place the closing bracket on a separate line + +```py + from my_pkg.utils import ( + some_utility_method_1, + some_utility_method_2, + some_utility_method_3, + some_utility_method_4, + some_utility_method_5, + ) +``` + +* Imports should be written in the following order, separated by a blank line: + 1. build-in modules + 2. third-party modules + 3. local application/library specific imports + +```py + import logging + import os + import typing as T + + import pandas as pd + import numpy as np + + import my_package + import my_package.my_module + from my_package.my_module import my_function, MyClass +``` + +* Even if a Python file is intended to be used as executable / script file only, it shall still be importable as a module, and its import should not have any side effects. Its main functionality shall hence be in a `main()` function, so that the code can be imported as a module for testing or being reused in the future: + +```py + def main(): + ... + + if __name__ == "__main__": + main() +``` + +## Unit-tests + +* Use pytest as the preferred testing framework. +* The name of a test shall clearly express what is being tested. +* Each test should preferably check only one specific aspect. + +```py + # Bad + def test_smth(): + result = f() + assert isinstance(result, list) + assert result[0] == 1 + assert result[1] == 2 + assert result[2] == 3 + assert result[3] == 4 + + # Good + def test_smth_type(): + result = f() + assert isinstance(result, list), "Result should be list" + + def test_smth_values(): + result = f() + assert set(result) == set(expected), f"Result should be {set(expected)}" +``` + +## And finally: It is a bad idea to use + +* global variables. +* iterators where they can be replaced by vectorized operations. +* lambda where it is not required. +* map and lambda where it can be replaced by a simple list comprehension. +* multiple nested maps and lambdas. +* nested functions. They are hard to test and debug. diff --git a/condaenv.yml b/condaenv.yml deleted file mode 100644 index 5cf20f8..0000000 --- a/condaenv.yml +++ /dev/null @@ -1,5 +0,0 @@ -name: testenv -channels: -- defaults -dependencies: -- pip \ No newline at end of file diff --git a/docs/api.rst b/docs/api.rst deleted file mode 100644 index 3e977b3..0000000 --- a/docs/api.rst +++ /dev/null @@ -1,7 +0,0 @@ -API Documentation -================= - -.. toctree:: - :maxdepth: 4 - - trafficgen diff --git a/docs/authors.rst b/docs/authors.rst deleted file mode 100644 index e122f91..0000000 --- a/docs/authors.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../AUTHORS.rst diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index a671795..0000000 --- a/docs/conf.py +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env python -# -# trafficgen documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another -# directory, add these directories to sys.path here. If the directory is -# relative to the documentation root, use os.path.abspath to make it -# absolute, like shown here. -# -import os -import sys - -try: - import tomli as tomli # pyright: ignore -except ImportError: - # for Python >= 3.11 - import tomllib as tomli # pyright: ignore - -with open("../pyproject.toml", "rb") as f: - toml = tomli.load(f) -pyproject = toml["tool"]["poetry"] - -sys.path.insert(0, os.path.abspath("..")) -sys.path.insert(0, os.path.abspath("../src")) - - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ["sphinx.ext.viewcode", "sphinx.ext.napoleon"] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = ".rst" - -# The master toctree document. -master_doc = "index" - -# General information about the project. -project = "Traffic Generator" -copyright = "2024, DNV, Tom Arne Pedersen" -author = "Tom Arne Pedersen" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -release = pyproject["version"] -version = release.split(".")[0] + "." + release.split(".")[2] - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = "en" - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = "sphinx" - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -# html_theme = 'alabaster' -html_theme = "sphinx_rtd_theme" - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = [] - - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = "trafficgendoc" - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - (master_doc, "trafficgen.tex", "Traffic Generator Documentation", "Tom Arne Pedersen", "manual"), -] - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, "trafficgen", "Traffic Generator Documentation", [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - "trafficgen", - "Traffic Generator Documentation", - author, - "trafficgen", - "One line description of project.", - "Miscellaneous", - ), -] diff --git a/docs/contributing.rst b/docs/contributing.rst deleted file mode 100644 index e582053..0000000 --- a/docs/contributing.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../CONTRIBUTING.rst diff --git a/docs/history.rst b/docs/history.rst deleted file mode 100644 index 2506499..0000000 --- a/docs/history.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../HISTORY.rst diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index c67c64e..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,28 +0,0 @@ -Welcome to Traffic Generator's documentation! -============================================= - -The tool generates a structured set of encounters for verifying automatic collision and -grounding avoidance systems. Based on input parameters such as desired situation, relative speed, -relative bearing etc, the tool will generate a set of traffic situations. The traffic situations -may be written to files and/or inspected using plots. - -A :download:`paper<../docs/ICMASS23_verfying_caga_systems.pdf>` is written describing the background for -the tool and how it works. - -.. toctree:: - :maxdepth: 4 - :caption: Contents: - - installation - usage - input_files - contributing - authors - history - api - -Indices and tables -================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/source/CHANGELOG.md b/docs/source/CHANGELOG.md new file mode 100644 index 0000000..ff772da --- /dev/null +++ b/docs/source/CHANGELOG.md @@ -0,0 +1,2 @@ +```{include} ../../CHANGELOG.md +``` \ No newline at end of file diff --git a/docs/source/LICENSE.md b/docs/source/LICENSE.md new file mode 100644 index 0000000..947acdb --- /dev/null +++ b/docs/source/LICENSE.md @@ -0,0 +1,3 @@ +# LICENSE +```{include} ../../LICENSE +``` \ No newline at end of file diff --git a/docs/source/README.md b/docs/source/README.md new file mode 100644 index 0000000..060259b --- /dev/null +++ b/docs/source/README.md @@ -0,0 +1,2 @@ +```{include} ../../README.md +``` \ No newline at end of file diff --git a/docs/source/STYLEGUIDE.md b/docs/source/STYLEGUIDE.md new file mode 100644 index 0000000..8648352 --- /dev/null +++ b/docs/source/STYLEGUIDE.md @@ -0,0 +1,2 @@ +```{include} ../../STYLEGUIDE.md +``` \ No newline at end of file diff --git a/docs/source/_static/DNV_logo_RGB.jpg b/docs/source/_static/DNV_logo_RGB.jpg new file mode 100644 index 0000000000000000000000000000000000000000..136fe620f88821ed5b5455cc64326fae3a52a047 GIT binary patch literal 202826 zcmeFa2V7Iv`#+AO)~Z#j)`?rOHo(mu$oPbige(FfWPqdD37KRk4mwoo0t*TXidEc- z3zXt)rAm<^B5pxz6-31ef{4KXCOFVyzisvR`G5O;-Mj>E?z!iEp67j@^PJ~A=OnaU zX#35hKb=COcy#I7rHgkLZx4^QyB^-*O1)WcQtAz3P`+>vd@zmG?XHLG)!+4mM;8z9 z+4le2uKC-PX0yQ$0CXl_kyJ01`AYO!z%DWX2wynh;U8o-h$L#6d5l=5Q0W53-9K<- z+!&QKU>qOAg0l=HnNk(%G|D2KVO)t*Eg?w91qJrA4Ad`Wn(bDSRV-jjUR&}_#&`qI0o)L1_?(H00bO> zBYY5eKRC({fgSVwH7>9hc;#=D%KbPYl;_QX?*hg>*UM(J`PxvvdZPkB5C{YSjs%cM zAMgnulS5|~*?n}T@$Dcla6)7ziBV-RtMs}tE?kjVZ!rgq8|P~1<*QvUspMrl28&VS zZbd2qWEz=PrZbyB4iP|S^+0xBR_v7cw^X9iw2D8kr~p)2#oO9svHrZWR@-S!lbIuX zMQEq;nz#;w4B*I2dW%sa10NsXnFb~^*$OiGXBPK55ZMaS*eR4sqp_IGMv+->>>RMe z18!69OddlAJ9$klumG%t>XZ$z3^eD?ba0ilS92R>yRG<3C4O?fQ7bYBs-cW@-W0_jv|2xsQRd>DtJiA++ea?#RZomT zqJ80GK4Xa_DxJ#%P4)-gtkXf;mqoG=ky#dqgd^cT2&4}J&PAa8;AlT23I<2`!QmZ1 z+Mj#_gQb_MdJpxhYf==SOz9(uDn=#Qi#v*-^1oe06|`0N`vT%|=T)`?Ua(;NJ{ zNPnH)=a$jl8*U$C5E)G}*BA;I_hJyebV}_{Kd%Fl=5hjlHkH(@3`AnEZuL6cdL`A% zdajOhKcSSV6iRa-Xc(_*J-_#7)t;L#J)BH^Rqy%DKda}q_dtLU3!sU_h)8uboueQI z6BXoOCXs9+5<>u71kn^lRa&J~f>T5#*k~av3yVlZN2oPnL>QdtegzZ3=Up!{(QCY& zIE5JDstmp&h`|61O$<>})M6xEL!@%uw~2BT3aIzZ^!RErF1$>G|#7Eer0u6y5jZ_*$TC+*a$5@3Z4nnGvqGbXD zP9BPY$x&>wQYZ>l(XN!Lr4OE{N5*z`VON5Y20u4g!;#Nrx2_}&vSy5z46emncQ$*Vp(PW1kP%jR( zQCOiIbYvKb!lSDsRq?pb0`dMKsYSisia4$%`9#dCY+;@3i&*PSU^F@1PG2MS}WCy_y(hxim-^0 z|C9P|Kv;-|&gW||s%WjjBGE--S(0V4f*^RKt;7M4hRU2!+yKjEq~#a%SH0sjeCuM7K%CO6>gUG>+vdK*n{z!x3+ zcer{RP0v++yIsAFtGChA4)_Nvd}UW}2A$lZVho<#0Iit!Zra|{YhB!I!_U?T>W3c$vp0aqIgSg-~NmI5w8 z+%gcu+hwo=%xJ5PhYw-GNbM>EL;=Pi$Dwrq_RnMhT=i|iZ)+Z=b}#`qAd%6T40s}_ z2S6l)di+6!x6|MT?2L;)VEjcI+9m9S3*0}Xp&hWjJ737)=Hj2y;0FAwCh=Eja0C8T zllUt%xB*>e`BzNhuh8HIeBG+wZW4dR8r*=k7v1p>M#h^oxB=fbI{yI;LN{O-01pd> zfzu$&%m)1&hpYp50yYd#>nIpKz~u=Aq*(M1rTS9bxR1)*-WPZj|q23pUa9Tx@3X1%Nh!clnAs|j6<#l8Dq4| zLJaMI(gC0y&=&kkqs~zDq7b}8P9TV+fPr+lMdSa zB|6$w2K(o2oPZtix9D&Kx_tcGIQhGDxB>sEiF8JX8}Of+NN04o0bet;zhNSs(cuPs zF>L;>iF9TiZon7ArZZ0dE*);bm*eh#G!Y))8Zj^|IAX%V5n~Vn4zp{-(48&^LINF! z8_+fW3E=oA(nG<=qfBxP-=&Qj;~xJ4fXI4|Vk5?4z|}&WCKe!)UPA)wwu7{*td_ex z$sdty#6Oh>038~U=@P{SfQYmM8nGLYf-%ClF0W=IDFp!Nk8Htj(F#wDFaj?WdWG^5 z084QL%H6)v0(LT}5iE`$jyDQHm*|kVU7`^nvO(tyNZrmC4?16FD2!)vIW)G*q3L;G zP~~#2E`W9pX)u>_1sS#xUq`Z$o+DvEa`D7JBH@WIkY0%5mhg2HP$L`3C65c`jV{6y zL3zNA1_P!5#$DZZ7@DZ2{(qaMbf{YfN%r;{c4@ma2fzOo7tXOvI0>?Cunz(e5=cr zoGgG5Y8A;TU|<41;=0GcqX1VaXd`$%n3|w)!gPRBOTkE`Hm1{olSLQ=Qhl`E&>q`x zF)W%DfetZ*pbYq^a4ta8VXQJvINMGL<%nS#7zJZBm>pI8^h5WP!5%h z5hW9|SvGz&hVKvxV50Vg4@MIq*WfTxGeM*^Q4tie3LohtlOjnpg_T05J1`W`$%YZ4 z3|y;5%M7(^wJbvvISybL@q}=u9HZcJk&FnlL1yCc+#E`oBvAxATBry^sU*QNj(}hg z@j?X#xJF~6hFUmOArr1+@Wm#cOf1*pVA3!nOc3TYs98u&cpL{orwe#$Ejc^{uF|^! z^&&k%gvVR#LRom6O~=-XWKje;*BOF|hC2mhWtc^4;KQX3Q?OVYMOG;-bRm&vz?+O3 zYAlyVwb=xCq}*wg<1OY$Hz1gM#K5VMfSC!S8)!@f-A*=0sRlZg#}eb>NCqqcZw4D< zNsuf9+=0Sd0k%aalZG?QI*h^;MW8cvYLnT-4+#rt&tu0@1hGOzhyj5WtCS8aooEkZ z>9sZolSY@SjCMg3=nQmpnLSkJ+G@~S6b`I8oFJhn#VCe=VK*?D4iYOOoGVi)v2F8M6#o`AbBbk+!<@r5O{z_ zjOzcVv0HfQZwOFp2 zuVWCb0D}q6+o1k@02ggGgV$QSHcSK4o7L>dV1Vs(kiyxz_Us&kV4~4rvN$9NYS3!b zauEw25sov-@zGIqE=C<{R@yLZYNRt(C<_4_V>3f_Xlyt}ufrQqa2?5xFrsl0VJ5Ow zh;XZn6%)dF5fZsJE|z7CLgOd|Cr_oZacZ-BSJNda2P9+C$h#yNbwe%8xRd+a7mK55Ifj9#?Hnos8|FWkH@0mQlU6hBN7Q5 zp?oOU6kCX5KAIki z4q+K1hzo+E~!%u);`Whl5YBQ|$ziO>4w6*eHQg5FHAJkVpav z$yGW@LOmX7kuXppC?;ML?li#LQ}<4cL2nXc)MjfKMXv}$h{eIt2!YUPi?xO0A_0>Q zY0xsYHZ2{mMUru{XgMCE0yPSa#Dl?TIF*V6&^n3+sm4&08n=Wp6riC17%(g&8s!8N z5(!|!Vp(D)fg`3#w1Q~9Lrw*qYJ^~uEC5cOI-A3Q z#<4@VNWH`+QM1W#ls!y|x60c&v|PxEz}U5*vC^$rFrp_4#b9WQRid2HA{{mq zbQ~z8QEQfHxE667(ku+sS)!v93UDIQsD(6DteqJa5kd|YIK*IGj2n;%XzhAH8;3Pn znMeiKD8-5mrdTeDht=XGW*ZO9plJaSKP(bumy)<<6GImcN7C#lW-Nv-FcHAW+vqSz zWqi5A(VivN+O0w-MJ^!9@D{z6Lgg8iDr}q$$1=&uWEop%kqIa?vkBbR1H)x-RLNnH zNH_{Gn{0AIgxRUls$oVnO9GlM0CP(y;e)wWQWWU(oKyigW!h=NFfKtP5zw(_8DDCU zA=L;S7!OJKW?L-BX^Uh~IdEZA`v8fK2;mB09Jx~lFv9umL(kzvI6|EQOq5p3zYlt&JnZs_}fLf{s&1YQ$K$%WXTrc?%r#Oqbhs zh^a!V0INdTFf5D1thTjpA>nc1G#VZ&i!dT>idYQR7!6>f4bh><*f4Sk3>OMed88;< zbTBSjtaM0NS{51^>cGMHp%}YJhoRyvuxKewh0&NJ6il~-SUv}^s9U&LY#~vN5S<*fKEk`LxFY& z8?Myw;~ZiMlSv7UgMovIPe3yM%;CN&#fv$h@3nzJ9vLlTFyQSGtVBxXV~K3Q60EfY zESp4ba~MIQBg`laLhiHy1iB>zZx5D-sI8!vA%UBFPO&wb5{cKD^y(;FxJ1Bp5P4WQ ziB6NaRhBzhM5|JR)xr33fX$LAV0UZQu1)L>lVj1CRuBAu-0_OUFB2Jjf7EJDr-*U25?Xe>`3$qAR*M6ncUBpBRs zj95_wm!p#qU{P@xsX|M0m`p6Sm=p%kaE@rBTn#uvDd5>PCbiuk;x+a#22Ul4WZKm< z20&&}MM4e31`dsAK*J3S!72@e*f?HnxKMy63Bq&|z0jyaX^7FG9A$(;fsPRI@Mf9R z3X?>&8+I5ObW35FNEsCaj}#CvM2#~HD=~#}tzO=pTxWGyEI*D+CsnylAd)m9lPS<()a&Jb;Q2DQ z41X+tCCc;qY@-T1t|`)l=p`1{QAAoupv9t+`e89-EQ$cf;;|$O0s$WLz><+6cs!0o zCX#~DaNG<0PU`=mjSkqL(7sX-9wU(<mYm7ocT z7fp1i{s(B9&SVzpBr;HJ7qsecLU*YC2j~!)QDv1$DMr2aFP^;ecb|XsQ*|N}P9%|H z<#Hb^#-*;sxpBm4;>u}T=cmP(M8JQUcdXI06ZM& zD*wx;>)Z!a{X`Pi$O|-yKs#}DA9!f>#l2S|zdBvl{y-<@fkoiOVmWxEQG&!_e9#gR z!AB$_;Cyg$F&vJ@q2wYQ;RSw&>Thqu1}+1ipObW*gytgPei)1&2JzyYWV@kx@oefPSH~Gn|+=&v3TGzFzO`_!1>}6jde-1YW52;>Md*I`^0VJGu_@7ssB< zH2!|qAu(L=h$|Z7hkAL$73#X@qfVmNS!G5r%y?lw&+or!JuW+GCk-6kBJe{6GNUO_ z?(*s)gF&N`h+JbB09Tae_S5`h%=*_#tUBrQ4?J`@DgL6(4v=rQ`@h<1|I+l^&f4F# z+D;E14r}p_Wu|M!9 z<*!WXHI(N^>LV@U_EYsVj$W+Ny^i$8GaZn?pwJH#Kx&c5jL*G!IQT&rjY@13869H~ zpf?9k(7*Q7>$UAK&h+!Z5#*Zpkl-hOeB0~%q3n6pcFsC{P{uv|w%-Lmh68>A2zdDs zpg+vaFK5p8dGSi8_lf!j7SzZag#7tih^{~9=Z#W`t~Utz^S2OPf6mVvr4U_j5c215 zA-evYpEpYXjILgf&G-Sg<{{`jDW^hei6k=rhN%mqJ|{Fh%{U%k4$ zd_AuXeiRxk1%F-^{MC!LA3Z+l*`ut_yl!1S@#y+Vmu{bQY5UpZ3iyfXZs0%Hujj9i zdiC!4L5~l+cIytd>Cv^DtK}DE9z8zn{z1==x^?Z+AH3JSyT^xpyMEBSJ1Efy9^JZs z@L`v(J$go^4&kSLH2jkR15?V+EI-RTcYf%FVS{>&%@f!Oxu5PGY~6>$fBOp!G0uWT z+KA&t!D7^eiJyRQT|WS!`t+B(zRPk_YZn}a=M&5WGv#lGEU@~PX~WElo%n3 ziu-E!fN@CUo}&ZJn6*Czf1SK;yeVf88v8(u`lcX+{E#%^n&kJ1J+s;_dGrDG>iS8y zPdtJ=j{Nvi3+Mu30Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q z0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ac`Q0Ak?( zJ_8F5$N1*uVM<4Q_{)CA9)Uh`?QcmV5*ijPIV4kEOZcQ%cCMj1|N0kA1D}@-%Vlcs zz}S88i7)G|PA+h+?$_O3vJU(vnrOS|XX8c7q5K{83xOfEsUyzR*vB8&4jkb;QC`q@ zd}?v_-4fIBpB_z;?z*yx^wTJma>eCyyv(6-p8KZhb?QuPzwf3@od4KwRL_SQA;+)m z$$e1pZPlJTGfh(;?wYmWqBm~KsRz`>m%Ol#mv5TyN%cvKxtxA;$u~E`ibRLP62A7A zmm%`DXZyo{CusIxsW|Vi89mO*`1rQj|C8%jNGYhNAoGL96yzu%mk!NS(Bun66i}Fy z1O>EElnyODp!F2ANPM0KfR^)6jsi-&K-nZH?*}C_p$sjQc7}54zd?&cXe$TWpMo~s zpq<1Qd&STq5n3evA6_IbsM+(P{)C# zhQdRoDOkMt_`YjX1E`V>>ywMfA62bOhbM;KqYO9>f0VQ1wd2uahw2?)EW0^nO6a>BFX=vEf7#71-UZ=bSGON-V|)WEsLdl|Lp<gq4w1>s*;*Z<1OHjj(wHjh@_ z@@I#;^?lI#^_oW1vkUuhL08Vr$c=c`6p5{}egB_#QEcqQb4gR)1>oOT*Kr8d=CMcB z=JBi&)-<>gntdMC~1rbYYLz7xW~t#X&@ z`qI{-O>G`^=ABg!hT0P92eov}vSu=Tb>2j2g@9h3Aigg_@OmA-$15moeUD_mf`Y=XPcz>5r*!ups?0^J?tsTgCf0t0$`u@1=fCPoD9msfp zmr&UH{XgcyHHG*!te6><9#ftsU8TZ`V-R`rfGQ z2n2<#9ocwq*HGB{-l*&d1cj{~*?3>qP}usun0yTf3R_>J<9)q>!q)f2WkqCh14imDSrF7cbYcN@;vA)t){dZ9UEB++5?`knpAA&=f&kPTqx#%;X)+a_P{4 zQR{bXC=C?e?dMVIwC=vC(C@|tOq{xM<1cWpZM12O%vm{?Ms>-ozbiR;@~T+pr01hp zOTS?8lJ}?iHz{)cy9M03RJeNe;h!t&mmB37V}4A}o@nuPJStV%d(14~n>1z0>;?I^ zKEF|dC4Pm8rr(}gSCx6{L7&D=>QPo}^FY(-sG@X8EvUC3BZS5lAx{W-LdX+Bo)GeckSByZA>;`mPY8KJ z$P@lkPZ-cLAR{jKQ6#54xt>swG9abD{0sTpb?^kjff#@ofEa)nfEa)nfEa)nfEa)nfEf5c!@#VYsUv77m*-zUyz+5I z%y}GTuRJ@2u>H=qjF=o=(JEtsif}s5-&P)&<5yjCZu{9iijfwR+8TQil_=0o^5fl1 ze5yF7m|8jfZ2CUt^&LC3x{?^LxZ;o3-=tSOyvls~>z$0OXcv;@Y)SUTZPJqjQSPc+ zF_}|ttr4y^nbkZO(*FFt2QZqIh2Ged)i6`xY}6gp4&9Pi7t(n?HV>2tUp4=ntREhvVB!eeMr1FhGfr6{z@h7t%++6T&LLCHEO4+*7M zU#7;P@E8h@q3{?AkD>4w3Xh@i7z&S}@E8h@|IdWSgyt_Qw?!d_4?1|LB(Lmx;ezBo zJ^NcSS1lTjR_5<2>O1H&$LGSFpBD@a)WD0=`XCBD!Ki8liG zFmE=*RM(^{89rM}hGls!ojX}tJhU~X#%GcAT@K51^UGTWpuT(;h<{z(*@H{lJQnc| zw0Z0{vl~-aT%3A!mN2lKTvw&J$3CoC6T7bIQEory(0cp3sMf=x$4^(h3&Ovz?o%J| zPh$_xwzYYPYu4QNLF~yt{AADUjf-xcxLC1f*2TcHAjis4^@y4W@1k3u+gA(+PreJn zzpieV`k0_rpXmFo$I61PL`!6**$<`7tRbb#bMgb5_RQW2GJGnaMpE|MyJ$A-?7?e} zRqulEudCawW?%fX=)G547Ojgvn0x$0b@T5<4e7udn8G-_PTCv=GW`9_Q-xVSzKdq4 zZH}XL_;*40*VX;7Ow;D^WUu;2^N^4>4~J^W@{-15DRX+}Ln}Sz2uiEe~2>-ge{nlM<^LQA0KEALTJxfi|qg0*+mWwo?y%j|D{ON`pTkM&6d{bFIS>4{Uq zXBT5fe%)lfbP+B8=>hfg${4S2nGWGZFUMpGrGGm`|KWN(koGgyK09N?>kqNh3)q>fp_~N zntBnY@SN<#-z7GBztAG%!=F62Sv2Y6YnSIF4m#v%{k}O>Gv$LvclYj5mOu(ZJqVd7 zGzK9j19?$snt&#HD3XCfH7FK^f^BFu0WFuH1uwLshf)?$P6kRkL0L5@Z3rcPq0Bav zx`*~AUhWe?n=h_CGH7=R+8=~AK%pI8XbT(KqlXS5{EJRmWJ=f;N_YWK7;2<;_&PY(tutP|~vi zsBPTylXr1k+&i7tfht1`Kny?(Kn(n!WT5MwfNi>+edT#;%Bqr{F0=r1=RCq(PTqg^ z)R~hNyE1p$&z`FPX0P__wO`NGJ@wz+<`F@C`9w*+C}8@-ZEJ6R7<+kJ!OHBL^$tnv zx}=^hH`I9(E!);+7>_y+UFVZd_dT1(Pe8?#);ua~A&>f``IqxL`W-$ATQ&Fb%;P%} z){pEcg8%r&?{-uyKeuDPw)msljZ3EW3!TENobFko56UVY{dka_dVl=1d|39hK9^Gm zp1nVO|EQ(b?EMD`=~v>ZsX@0tdysU6a=^%s-ajnQd(yTm7<0gwyD=8K33ISD$vgf` z#I?}}msoG?*lR}V1Z@7n*cvDC(!Sdds@0B`QGzy)%~?l-9K-JxO^dCOLj*t;01W}i z2S82`ngyU~5Q+n!KnRKip->oF3qXq@Xf+5ehoO7`ln{Y3LQqN!$_YYAQ79`6rNyCr zffrjR(8dU~GX!moL3@MH<|wo~3~i4?=L4Vv63__|=!gt-MhH421)UQ6|M8ey!|Z`g z>l(W4#AJSV>dYeI!O5}va?aF$Jejd#i?X**kJVkXHgDatY{6&c4>#Dl5m3G8gMO`^ zT4o}BGuTUDmn2SIx%-~1aByXt$I}g0MqU+f%qx%42~M4gVAIeOH|8Ek%uPP7JUUFX zbpF((6~#kIKx)6e8HW$TVsj%dZmw;dJ9+Y?RDmox!AqFcljKXc-_zZ@N0!=)PH)ye^B!Urt#4+dE>nDnDUUxoz&S$Jq zUagl81{ScNO};!L>%JPe^jYhy?73GE2cEr)W2?--v#1dSGSpRxy|F(fO%~m z_ZCfSd9oI5&uG>?X#P0p!6uC^>CpBg%B-eG`v%&N-+!m?Mu%K2we zn>q5tzH^MMDZT;Gs{-;*F3U|T7jeVLFp#(iYd#r+tVo4sm{IlnWoi~ zRlxj73$N5Q9oV`qB}^0fp)q@Ja?Q!&B;KZeI@1Q9i4T5$7;_~aXW?>GC6LNcFGGe6 zjb+GvK^_~Lq}pQwXkLaw5h(hC0!}E#hL#o3N(x#$LhEHHD*`2gpxhUf?t?O%P*NAl zV}siUP>KLb5kM&dC`ACJ2%r=Jlp=sq1W<|qN)bRQ0w_fQr3n6CrwDL+l=q7(|~+4-?+W*dQsAZ@Kk!RdzJVyP~J{Quol)Ka|j=N4=Q&k0cqB zY<*Coq+61h_%;vaffIQbZf!@`+Z1QYBUn@{y;mspN~yOjF|@^Oq)xEm#x)C@(~n}+ zA*tzv>@`BFe-6oKLO!y1C}mi@;!tYu-ucHg@A32-1O+hwF#s_DF#s_DF#s_DF#s_D zF#s_DF#s_DF#s_DF#s_DF#s_DG4S7Dples>!>8ADY;NO;HjhdBY^2J}83c8!tu_C= z`pk^#z6`>IR(-3sRa&&>VbIBgS=0wtz;EYDxVFc3!tGZ+Cw&di?9 zp4pQM9BFJaR@KccJ$ib^knD*UAJ2Id%DUgu@J!NYWx)O6U8jg*l3NmM<45hi{~fC# z%67+mH48?&w2g|H)Fp!iRUJ zHw~2W=j5@TB3EzCHE|3--<_vpG)&q3%z6HB$i=9u+2wNj8SuL zf0otnD_#00^<}|9kBH6lVHuA$k4>p+^Jv*UJBQI47emA??ssQLp>Nol;`HvG<@j4O z%Qj->!#A1~33Kh?$g{bl5{`B#XEOtJoc`4QZF=&MrDKaNpe{)#Gl@%O`B8`d)XON7bw&+iN+i9;o62c8b^9aZiW59)60_SJg>XI~Scyu1!r;O`LnB6>&9@Rl6#-zTs%z#O9F~S_9Nq$F0_Ey?^f3 z5eje7US48s*wEFxvWw;vT7#0J8-L08{J`V=`m$wrqq5Rd=1upBa zm1+EvPp|hZEA2^BC8QJ$bzG};i0*FM(o6ScC*9=XVH#Y2|LhF)OnSxi>z@tkW!;i3 zoI=XJ#{$B5UUKOzOa9%-A?aI-%N5l(b{*GE=jkRK9)`M^kPx5NXXX!cQjgc{W;mv& z&g@=C5l-GBOGeCpHWqD^eKYDjYXl}Wxy&1RoHpJw^XEZ3JIp0yU2S{+aH;`-!*jrkj`NP{hHsaR_j`R>3D(5dePh`;;n2Er_BJ|ikYkDAx^J}r^$#pbG zB#Z2yT>O!&IDcrIxX+h6}xN7_a9El{HibdOog*=*6NL|zJoP~`+n+&{`sWlqOrL8-Y@Wyv*N=$ zX}Zf=?=wL{@7XtGbH}IJbI!_>VWE!b<`ZXG;yuU9N#2thch474OKw)wQ77eY zx!PeMz@|J81F{1C1#tk+>vqJQMc>`wpK5gW*mde@?3w8Yh?`XrpYINFAeB-($gX%aJ zZpjj9Sv`Z{nIj$*dR5nphB_K&l{_wU9(|OopWTzenqXU7omg)-Ry7>FRY;2Id}w{z zbSLM|!FgvzkvW5_D=r_JWCtexnzCK}dF#rvpWa?QYIT-2JJ6es8Ml}4thAqhJ$?R; zGp9Cw@r$VP!Sr4!gv43!!k=ske9(u51BzM7Tn>vY&00KhuBayk#U6Q~z*gjqlr@Fd z=h_ZEJi9wNF;T!~VDE(%I!Cv8Ag(lw`zo7dCYgZ;eSieckJ@&Y4IyA+h>1~ zaX5F%jMFh8Ia~)zEnF0Se*fVZzB<1GJu#RP{Es$S5qGr>n@NS+?ERqlKCC|{F$54iXB#-c|5zAKmJJ5#gPnIvg_ z@{NiWrz{t5?^v{|w4c}XMla>*VRh2tM7*r952CP-WpMHQs)NWj4}$FbOl6Z~!dTp` z;Qkp8_S9$_E(bkD=M?wD3U2(Cc=I=w?n)4*RIqyIqVeNr)>o!ilyn{Pb#Zvcj$5;Q ztcTN!`eDQF4R9u2zQ!us6F08l{;raA-<9cwhwsS?@+%7al#PhD+CJXoeU7kYdtDQf zdbRkcKw;KXgSG~NIh6KdeQ&o~6FZyW0*6+)&A1m;@DBady6`3-SOHZ8M=!q&0BYlPF=ZPr5G7$xy{TZ^a zD{ZG+So;?y&rd7y-<<~RPMb4og$}n2T|aoi?3V72N`ZBR87gt$k8k$ghVwUvw|RWr zFtR1@$dOanY@IElg`9UIVrI@d!Oj-H(aUl99}GC}Hx#Vbt-|N=Pv-}(nW~CeuC+v& zNO$h`o4V;XYy7s{%HROs{7rY3{m>+r#&R#-(p(((V^UXNcALkl{72Ulr(Texc^V3< z*hEt7+VoOos<38KDm-0K;61+Q{iEUZgEbr=dQ*6OMv~~`Q57z68244 zmXnsKOIX{uW^K)!A>pbg)4QgT4srda_JL>oka{oD(-{0!)K|SH&D#-v&1MR%E<~T% zF;%*|G&wSJ_xyev3+l`EUL1>V45`ym=b+<~Zj{vAD5<)Vc(3If)71gf2h5K0rD=@? zR?nTxAW#3yzs|W`H#+-(Zu^w-=FHNDHEaFY^Nws=-*WZzH^EVZ zSGk@9U)|0;uAYB7Z3^km2>p(lWM@iZL_>{>i6l!wJ_? zX={g4MtysKPxm{0E}qZ`f;1o-L%AI>}!PVm$Te%KicyLWr-LFJ=hRPlqgMVTW~7mzy77i*oVCI=Nk0T%5+v)T8lKNUe0H(*e zbJaO9z3;Qr9+V;3mweQOvB31r)yuw`kJu#7WrcAV;U|biSE`dRw1f{mFGv@y=_6UO zwQ63o@$`kNxj`#aN3|vfs;Y{UN3ZU)r?BLsJxwDiw-mGc`Y0F zaRxrZ(1!V~MjClptj#BiOUrK$7}#HaLvcg?+l>{=R;6U5l@92BX8W0*D@_FpQm~qp zkK_fOpg%Gk`*k2=m}HoIt_VFo8J_f=A{f3HS>R}4Uw`WEwl{tSD5CH9pme#q>>vD2 z?}Tltx6Uia+?8#El{Y=}Tr!Y(YazE%cZk1g!Th1ulX)48?-mXB3Meg0@d7q{{OQC1 z@7zJ~#bGn6JK?c?@Ysod90uPW*n=n$CDC8$Z=hE<$06!(>H7%Z3MU!{~J z21LY7L-Qw|CD|fwES9ESqb~Qi$ulk|PR&$G6TahJzH5rnnl5==NuRQ`E_lSL-=6vU zXfJ#LYKjhewrxt68#qmLmh;ln1y5p@?+>dQTsa3j= zzI2ii5bVpmAWuNCHgM#k>ic3z<+>>+js&ebDBJ(p_|#H)<(iV=f`S@Ge$C=?;*Zu3YCdOW-Jd|E#<_=gEb*T(;v z@cWUcZ60gt2YoX&^etarAMof>B_l&_u}ql}4NJ(*p7XxB+zkD|$rtE1dHGg=Y zSw;qL^T0iy_6*NCo>r8BWsbA0d{~rV>oYTH-ntUS-ZIM9XQ>k>_OVr^_fP+%AuF|C z{D&eZPhQK zjxJd|yFOsc9#Zns3lDvEBuv=1A~=;DSYH9JNXqM{HI^hi{;@W4JC;HT{$<+A=#i(B zU{4m#`!@dxt!7*P*i27PNlDeFaQUR_Tj`g0^uZ&asSX89;Vu6v4LbwOgv^R7n#Z0k zin;y!V)?!Z3RZJqS@NvO<7*4OgtHf{^_JYA*YdL$R`ywjlCHl|Xw>xs_Aa0F%XRS^ z=JGdYIgfsZyz?JUjh-F1K^L|6Y*b0Vow)(VHCxb$JIXCR>-Sf$*}=J9weq_yk%|pD z(nVeUd*%nV8gCXS5=^4Rsc{9Pmj`_C@z(k3fOSH}_nCsDDoLMRi^m`7`BQV&`pkuP zPQ-C!skiYc{1N)_?T|YMPPIt=MsZF~C+r`UaAi)y+9%V9o37b=P3!wO{FVWJRQG#K zJ~OVU*9W}r-kF2*N%Ja8#%FkzbMoVo3j=9k&f`M^Gy0WN&P(T(R}L)6ANi#0cu)#1 zD+QP4oN}Pyc&I4#fa>W;^zA0GYHmS64uyS=;|=<^uw@i&Une20yV zykq(3+x%TcK!UOK-sxwpoT~vP?9msZ0|#X;q=^pnD@`31uoCo{Ws4c2rj#lm|)h%0LG7(T64xTHy5DgU`jBj2}Ewz;xp&9A5LuD?S2;mOUdQMDEI z+wJF^2L>J~Y4f-{kFqK9Ci<$$Yv}d9pZ4lu|DmyNs3aq^xgg)U=joDt^QWf9Oc%EF zU!U-FX~XrQ?547!gS!lm^O`b-oGBfBsZ2LVf1~i>OvdOjA3t%m{pM>cP`&YL!%H-vTE)Q-1J#G zm3Hfr6zInK{?=+7b9q*{GWQ9-x@7UN;nRHSgL(>Q{?NGV+O-5rF*-MQS$$4qIR(Wj zMa$C>R~Jh>cQ2leNW5K^DwL)Up!G=(9yYcgdhEdlTuG<1@|*1cZ+p+_UAL^wqj2=o z!)+ew;)MP2E&UpTs!0!Lw8WP_?M2)%!T&81cWL3E%FpEAaz!?=t2vukjMB*415lrA zn6zH8VZ8KtWYgDw`0zOt#)lEPnOI=(8y-A(7E*#?owIm0jj6b$gqv=b zWU?d3$L9pj8e5gXOP!Z8)NyA!v9j{ABUnv7n_R5DTGVsS3FT8+!p{xTiUco2=#FP( zRnCp9y|N8!>sq-1M}WKow`MSu2hLm$d+MXvaOJYkskId>MA9|co%&m|n$}~i^Rt;h z9uM@>PgfBt#`1Fa8b?iC*<6v*f7d)rze)3#FBmlg8+vgI<8;kIUo}&cx5V>|IWzQr zG1~u8$su&WlDjoG5`S08_FlZZEIvj72FGBgs%)rZ-0k^$lV4-D*R(ltJ0DyXUA;WB zxusj|xto^JXJY1%haB*mxUkKmd~H+Y%%u@NrnO(XYW???L0E7ZRFfMdBxf(%mqy=0 zI-OCP#|;Em;kA$h6pf~YG_LhI^%_U*Z^mb3UwtzD{?$go!5I}#Q{v|x`Jr}(Dy!+#7t`0+B3p0k zTij*#u|2>0)bn{Uq9hyvOD>2cCv2>FdguK5wJT zZD$=x#aO-e@shmrW?BGk9i}yHXU(A*o3;`V3&u_@AD)?pA@4Y?K!TI(#SL2r6m)6h&= z&gG940poj_!jFBGa`?FS>~7PRC+{Q`cuf@_D-J8|=8KmltvN9KSl$HSa%yVv1mval zPt5VY0;;KQZR!j?@LkS+?U7$D%Qh^ImyP}gw|g|OcjQ&o_S)@da%*!B)-L<`qkO^- z{Wos#suCBhNKH>&k&x>B(E|H}9L2oh-Ic-zB`JYZ!96iwyktK9+M*R%J&zK`=MVM1 zK=rM~tvS@$U%;^ku(v3O1FYDQlC8HN`NcC-ej{Tzx1%421qx%e1HKAgx?(FY_VGun z+B_N|ei)uL7PwV15UX)!^qV$dY8v_DtG?{*sZ(=~j}lf_rU$OB z{3SlM|JT_EwQ+edlX9uQgU#2Zj#zpS1v_EQNiGdvl!6_$_SbS1cjXGlfeR}d zm5Gmbmfi%0=@#~^%DI@QsH3F9pANX^9FIN~_MkH1wx(=vX}?Pxy>nuMr)~DPMD+%F z@|VxY#J}plf4uYowe%aIiOH_$Te9QO;QG6Vt8b5x?A)BcDL9O!uo{y6JSO+bAkw{F(3gL|mo1#K!B zd28*h;tvwcU|2bC^uaX~_T_^SebC0yiKEye|IcE~e>DHDetzH|`!l>*zQ#(*_< zgM!U#dV|wl^N|fb=5F;Nylf?^UmfRhyzKA@aru-BdG+2oLjd)~Bk8^rz4rv#%3seF2v|qg%uDNoEJ)oL^?A-GDBG@G_k^o2U0qXj1vPC@U3}Bs zDSKpB=1mw|UsX|me85k`e@-2}BPaO$gdi35$gNcWh{}fXgYAsU?k)*>tU8i&pnm!op|ct`_;AKS(!om z);&Sg7d(>ulwbRkDCELws3ued)+ z$s12+(L&C`e}CeAfs$Gh2Ya|d`JlNLF%QR_7d0>G)=$z#tueUL$#O;(_+%ERTzRVU zy3#UKmQgl(<{x%!A`3*63flt^`+{|9$Yzz!Y z47hMHT0@*!R`LI__a0D9W?kDbIx~t$5k;gkNN5^*0D%B1(xeF}hCVU$P7p#9MkyJj zNsu4`LT^%}W2hrhFow`Vhk!`$y%+zRd7hc)egE(K*Z;n2{j~?{`>!Wng*nTe}8NxGTZ|ClIqsMkWl|A>w6_usUAE}~WMCA1dKeBYryj7k5B zgrfAC543CJq3Dv+^K4Y$;qWY0x@?-P!lN+vosJ@jH-suo?W?hSA;(`;*;ZHxV$uW5 z2-d%Sr%R#jpq76x>N#ER{(1Z)(R^!Q&!cR0x$*eqd9{moUEG3r^YtiN+T~9n^Ib=U zjh{uags$KJ@%MbkE)r>ug7n-z<6qggf4C3heb~iFz*dsiT;!tBYTQQu24TNq?;b5zp{F4F7Yq3iT zHgz}5?{jGzcWcV@=mLoqE;pZ>KD{HQl{bAD#zsY}RL(S5ol!^gThEEI%8-mDRIclS z#r$@a27iAOg$Fx7bOdrYk8&PX+y})zY$PUTYk0UMcr$ zCTt4>0ml%p!6vHKX2$Q0sw?@&y&pgjKdFRAG@8B$K(epb*s zh%l=ij^pT>n8L=XaD~b;n`ejd9k4Z;n>yPt29|j%rLc@`p{A+oek9D5P6?d}meZ7q zIuKQ1ftH5_y{%iT(1%xdI>dbnLkZ4emAfamrah_17C_K55;Sd#wYV}M)?;20VqIdF zJ5--8%g}CPS?SIBwI{cVy}ID@-Ne4l^eoUV#gehYq*ukWF=5c|^7uqt5-HYF*!x=) zf*X5nx=r^E;7$N@-AQY9x2Hwz{N^-SvXVpV^RVU4_*6*`uogGcU$fs4oZiXCsJ5Dx zDSF#=CP@S(SIm;qB{(Y_$g!LiGvpNJmD3lNMwAEAeKaDE+QQ7EH%GtzIVOL#es7nN zF?phiX}Se(F%W&V{K7{J)4tUv$>AdUIYxyt@%alr_rs=whJOC?`LmAhY!th2kS7_# zr{|4`<@n`T2eg&Y5*y1Jy{Y+!*U*N%gwB(kLR^4z=Eds3&uLgWD}O8A4)^d~U%3JG zU#jCn7Dc?QWHVd3-qM+0JQf=xCy(-_u+WaMKAgJoT^|&9my%xtiPS9#KJ!nq|J6_Iu%JV^69T`S6(w?_9#P4}>HF7D-(78zX-93!hQIc*3= zPGeQ|l4aa$b}r)j{JL84FPv}bTxeWvi3Z;OFu^ITD(cyeh7w6}dFZ^3!t8uW&M=mL z#w|TlE7yL9TCfcXnm> zq$M>dK84EK^Tr!g7zFy>>CxXmaFNeN@25D-8Op>0iy6Y#WGPZNTJag;*%iT%(4TYyQ$E?NQ|;YzF!>(}XY z|E#3btfp_@TlSq!*7cY{MQkXLn50gWhYztWf@W)Nc|qgpd6mwvkmQ=+aK6_|jT7X| zi4>`&mp&NpkqTyvM<>;+8m!hnqINg#zVE-Y#0Y9$v)F*yRzv$odh>i|*|LnbC&ug&LBXS(!lh^Uh3sCW7s%TGXyv z?tZ&vzrNWW{My?_p_f0AT!M`W>wwTM*vq*~2?zZMh8!q}h`1 zba$p=xQZ&7%pPOIaU%Zw8kXD&?<(8xlK6kOi#eyRX=y(FSOWHbSJsYn*_y{y1~G0= zN@A2=aTWFIxSBtT9RLfSI5`O&$?DJtvqN`z7ln@*5iIxY;t1E6ElbcI$PV>5X&>Kk zLR5&Lcv5quX`ip^RQKE)Vhf+Nw??Q{3e|INQ>wz29QO>*6SR+#21ktA>F31Ax3wp<6_t^M=c5j@B``K2vXR-6mm(B1&^nx6UjUgtR|{hIg0 zWj04?_#_r2T9#!8Seqd)BG3B?8gZ*RK1`4?eoUbj-qfwOvAs<@nsBPqY_HWV%&?=e zhf$N^Bl`YksjI@M^I1=)BJ?UR-SGB~-*hOn78ln~YE@C^kwr*b=Br0OSoLmAD$r;} zx53oj777MhReYyAk@s)n0p6Vjob-l&!A$HF6w~%~RTCzX#JhepT2^6>_)a&E<&K}e z%YUEG2C5LWXk7I0&+z7{Ova0wF(DC$%qJt`<8$1mwaNu2StA>wjYHkw$0unlUs6V2 zM7pFg{!{$(&F18MFV~n)-Mh{`iwrZr61dJ1#0s{8%cu$dId8Y_H(*_Z*giH`&-fW- zXojalIV1gsuIuXS-itg3x%Daw(DQ^-rP(spf2pQW2;T`M2m{Lp^xhb-cCKd{Sb2%X zL}1vejH0VBZD7H3_(ok7B>Q4AeM16fSeFSw9i^ThU8Z_ueyV+Q1T*$906yCeCdN{Zt zvZ>DkLghs)DZn}IeyZ~@S8k0OqhQzz;cJ;dxVd|FQ)}2jhHLbng8!?bpIbzoT&v$b z?w7o_tC}-D;jyB8ZP@YTDaW;Z8UQG%OBuCQTF|fr&Nw@q{`$(%@(N=2@tb3}5g+(i z`shwb)$xU%An{`>k(HCzT$c-~rvAG2Pevhf^1u5dN7$3bYMy5W-+Z)Mhtg_r6rXywLNU@b^qzB;%5}a_diF38no8({~(<~Q4FBW%IlURn0RuAmr*nqg+C;ZvnJEwO)Q*dpXI=xS3&Sqkpitx^Euzh-z2;Y72zVZUsAVr=Idg%*-=djJ39>;E|l|2wt+CH&`^tnq2K6K+)P z?l?iMz^%H#daL=pXmFdzx|m73)i zjtvUCm~QO?7@fkAz!xp0{trt3`R<%y?v<#*;8#$v3mV? zZ?DEE<5Bf-NXQPRj#F+FuVaavjNr_jFE8|0)8v?Lleh&S2Wviz$qQE4hC_ROU#e}A z>9vM&hJi%>pk9-Sk-8M$*egbq6WEHUmgLvZr7MfgV*NYfkgDwvSClYq1s{47YcFpl z#}8JPdn(&PN?}}s>vUJ^yO(6%NUpfOTGp9z&?e3$9P}Q}Y{TOXPr5)G8guJ*js`V2 z&V#9K4`%4=$BA!M4!C9D_3Hd^Y~Q(mzvs~!ntbe@#CVi$Rv zBG`6rn29+erm>Eid>@e>THU<8!MGQ=PPINNP=K?a%@~KNNdNhCGM-sh;%&G~W>(b$${jqQGjIjo~9-ATraq4?0+9vFw=*GRH>FSR9@;Y$O?Z_e-4zrw6w}bF8)rnE+8y z^$QSeW4UhKZQu2;7muy(Xwqh)iP&7TyL)i1ucTu^t)S-UrKImuT_DPpufCDD`*W80 ztoom4oTnC3X6m^8>$oJg%$_-!*VZbH_2(`g=$dv3OFdW9OMf2WXC&|ueGO!GKSm~7 zj2%?9^t%04k9Ut(7PG>Dc9k!IQRSF~r31j?4=ObaK zg=fmI(ubGRC?zW40txEfnwnvtNtTqxfjBVU2|I|~TpJLU zeV*fE5ZeFRj8`YSx+b+`p4Tkj*|R}TzA?{7NX9wFI;;2Ri4+Ox9Ou`B!LsYqD-+}D zk+Hl3J;3_r1=c(O(4CoZSWheWTC^aR6`jXQ3%19aO-CmX!SNB=#7_Fv3g*S@05WEf zePh*h$Ysz_->51gJMvM@@XJ6EZ`F6zTq%q$@`px~Ts%-r_iXk9dpP-_XXyCdq@w#2 z-HA9~W(O1aA+V~dbM)YpxeFvzpaT1{M5JRNCkj4`m5NJzY|XAyEKgWk-zx(W!W(S? z(BRZkE_c{%K#Rhm1*ni@U#8~z5Sza0)G9K6;0Ad}c>wROda3Yr0AGIL7esFL)|g{* z`SY9D@kI{fgai|n6~D5%p@mDCCvWz$ZuL(s)?@rdGqFSJhxgT>2>Kwg5GBj9Fh%Pf zRn4*K+7KZ(tgMz0<9E7q9v%Uzy&>mJizJ-Qe*Whe{?(i)#c1A*H^dh`5)mrg`eK>d zrr?^YZ&Sn{*pP;FJ#gTH|d-@#R;!`V;K@n=0wu39^`g$Eug(%hoEc z;NCug_5}o-yEU^W$50gn6j16B0@E}iB%IuD;$9Ll{Oz{8z44np`s8(P^yMpv^frN5b}e?mNON!-5S(oBQNei>w!l zt~+i+N8P#6s$uo`-zbnP4GQps6o{KQap!f)SR}lScl^mE^LewJjK4Jb@6`FP#$g~9 zM_K7a_nni&U6F03n(B*VNxMI>3{IU0-S7`TSxw*V-megcmSArG--PGqXsY)q=T7aS z){J=iCfu=RVpYb<-|CW^NzH$pq1~<-9?j$YP$&7lV*b{)GqYY`nZwj|vcYXi1ZUG>0B|dr7(0aS7U``HMd1x%GmGc?v1^{TE4h!l`l>3P(%djXPYc{nBu%7OjBo%vX zWK5i6@}1jucb;3XR3~u-%MY%Ugn+cmy@*h~{hSh?!D7vD^c*@G`bum#Pgt?MjXwUm zX?YvZE7QggW9~4r{m07(s&(2y`vQ9ikvV@O-C)k~ochWA1g+7Ob**r{i%G8TLbw5? z*dePJ*0LIdmXBq|aC(+9&jv<9PDZ`@b9&pD~33%1LNI1(gW%U13D{ZyYI zwYRGw2a`pCDBtgNo=P5an)zAYZRi|HYjk{61cwV**CH*U&BPe4`zbjwG14aIgzKt7 z%w@3NtBFUp8Gd?Rp*VTH10F4}u5TAh1DS-iO@f>ivw^Qvfa*sSP;U!HOn>gIccapF z3Z16+QmE>kl1U>Q#Gd{!nx#0WZxwS?9sA+~lWpr4?*pvS#ar&Vxf*M|2P?SV*Fyo- zT!mukJTkLuCYUQ`vb%&ba=P#>pdre0OrRyHT_$Euvz6vT(N$aCnr4~2dzyf4^DJIa zoXW)j6(0aBCk)OHy}qkJI{a(uoY8&PA$P*PqSBeVcvKqNR+AWX6qm5#o^ zq%ZIT$7L^xXJu$bJ}^y7^P&B>sTQOm&w9S-mG}yByM5$2Q0mmU(zkXICn7ezIGe2F z)1&p(a5~KY%6=XiqfAxz}{pA%;P1&dDny-IK|IhaC zLS_M%e{^lr#PxiVc)8QFMMo}?Z>6UFhgB9)dtxCM)NINEvI-N{uShrW!4hOG-z+MQ zCeoY9OkjDc<%>*{BU2jDXk`0J|IvxTI&LmMR#zq8*AOBGXUUhC&66Sj=yDkrTt~TR z`RX{A4=8knt!tqMqs_ibKD~4*7uV|(>*alovE9dGzrE_0`|RT~R5OS%Rh>idIY68n zty9$V)mw*LUdF;2hu)OS8AOINSU+(W_DjxpVXF(%^F{>{kek6u1SR|t-dPL@TjsAy zpwPFfF~fqAYvC-Q@Yd_e1DMX4gQ}J3X-i@+t9px@ZtWuMoXUS%)$*c22BP-`p_nNQ>rvq(0jv^TU%shJ z-}aeOzm#B6f;5|0NAM2r=SCd)H7auL%`FS&xt+xK46|r-+ddtO?N&lY<~+rx<=tI_ z3^ONFpOVbw&P5r9#<~uEh|ler%Df$(R38_}%*TPUtkl)jG1Qe)fgt3-o0?A9ynC(E zWR5l}$4UvO9aaYpdPM>WU@ifbCY^|&@r?hV>3^T@8Ewf9lkapqAq$7c?@n8m9dApDeBM~R$00Z8{T_0sY36CZuGyWvPr9!=n)U;K%e~~J z#3OrG0o%R+b?B(&ex73@PdDfroE@aiLDolLoOxb+{aB0T%ReB4#tu3;j+7LeKtq-O zc@eAWU#r zD^ZhFxORK=Sm7K33QlAI9k~KEqLfn76j9>p4M>NpNMX0^belY@&^NMP+gu>}lGWY| z(h=pQYXTAJFSwo)hm+bMQXmR~OD$62fgbhC*PcoCQPsb;1vq+W@&x<&v!0Ae-3HWf zCMe`fc)t)gY|hG~ZwR?)mi^c*r`mkMZNWWTVO%4%cKb#u&j2&+3;Y_rA0kD2!5MGf z8x1C8wMB`W;#c69A0sTKasw&v;Trlv#}4SPJ zQ!y_vY7ACG&*H!;1uKVMn-aE#nBV^zi2sgfh_YK)*lxx;IMut2wSN*h=&Oxs>sl~! zI_M7-lf_?c>VKVPR#;W_?7}-Z>dALHNarK9BD0x!?>93?LYn7-x;7BlCyb7YPiu5{ zh%Sxd*Pw!{ZaaQNaQRUo0xZ1Svp>N|5MSqYx7U!)LHfPZGAd+~>Bed7t z{YQmqQoo)m?|*?s?3FF7FWDK~PB;5arrPNx-%FZLUG|rW0C8xQUQd}wrfn3nCNHH{ zW-~$dN}|dct2dD>^j$|FCmh?6D`=*ik^oH|T~&P2E)E#P_KL&#l`q;S9U;V3Ab!kz zA+w$ZEP$|joXb0@UXNil*^?vz3*b zlaY(X1FHz2E)!A?Ec586!{GB_D4XP5tUm$-;FRGQsm&JUrO>+1H8zDcKQ+|%)tK*G zp+0mIDERisttJak8tp7v*32VvQJQ-FTG1?^D*w4&&Ns+Do}YKSau<3kjrS0=(B$61 z;N9$I2^@E;-YdL6(vUt_Z*3IE*J?HBKOGI=ln25wE=;9?&|t720l-R*#qsCgj7Y(r z+T9CH3qOqSevUnP`gpsk_Gk#9z;ZNh_wM|+JSfwRxT9TTH0k*F)YVP9r02)l{j8b6 z!Y*p4wJo!SxWEJN%)znA#Uf0|+XxG{bLN0cid3J_-S1fiSYCwOC6rMcrh|cdQ<*t? zvcaNf{Jsm9P~@ zOO()6jNe`M!pzlqRm+jJqe0t*O=J=G@W|12O#n=5=fR%L;ibt~*r8*U4p$c-2^as# zqqJW)xNF3X8r`1VI}-mw6G29~H*-sVotrzg~6_!e?F+c9m66 z&g&_ZmD)s=ORseEPTQn+Sj*7ZSji5R?wvC+VEC5M=$58aM%qL@OYcy&3!c9!XKYKC z`PRzer56MDDMJ5Qga0=F`!5y2oQn#1ZL;S!Ha;Fab&^@rpBdP5@-_32C;eltp;R+% z^W;EHUL!xTLi>Ldd%AJTb)#+d?FSc?1{<364-cG}Om5=kZWNv4;Rr~&voPfE^yVRN zV3u>dz`ahbK677ahwIuCc!Z@dVLxBQ6jTSd5J)np4 z2Ci-1!)^8!dF6*`U4yfc7F9|sNd+@b1X*~Ja2A!dEJ~+;_&!2ju>ys`)oVR;C@cr? zb^xwNxSRrHWcQIXM5{nr@8iZ1eUwSieKSGECSYq5g&7JE8n+!1mmLz9F$axfU7OmW zWjhn^2l2y}Dk3Pi{ugz_422AY%oXcsD%YWw=`V;Rjz?CKMROJAFG3%n#~dP)7%QLF zg^8xM%OXZs>(d6rhDF6(Ya*9=*8nUt6i}=qnI|62$ezm!s;WZvka#Ne>4BIv>X%)I zPyccg|LY0WGll8KpNeW9Hy3O=?_iea7WkTL4o>43`Bt6%{+o}O0Lu;7OelNO5?+y~Oku6Z2vW!i1?)eJL{-hOHs95ox{ zw4d3saz?DnCNImi;DJK0?UvrBByGhk6Nhiaq;Si45)K4z;do(WPsC;WbdwSwdmOb_KefVK< z=khVFvD~WhO3;#hP0`3=y2snKA}$x>?r+mAAkjB=lyk^5ql6eNIOa(xEI#V8Y4BZV z9y6VJ?ed>n(RjX~A+L|MFrdB)8+f%w+t{p704RwE46-2o%Bg#d`sJX@q-UrQuCLBP z)&ZjgPoQ`|x$_Ibi_fdl9I*);MxHqq%UvT2_wroY9AqdnEj*5X_Mt*CZM7T*t&u9Q zTA#?dWSLn~3e>EQXVkL7JGpWKZ|sgrT{pd24JSXwVpekEmgZH%PP7f_15MO@`Cz)h zTA<|Wq{bAs8?4IK9LpEy9iXb+YTGT}`=37ne;>#Y$T}A^<5GTs65OJ6S1oRLt6fFb z)Y7s>Z9eGk=^Pw~_FdIW|1CM@>&C}q+*F%c$5g>x0FqHQU07{i)viZdf+}Mjd~0Vn zP|*V#P^1}v7x&N9rGKV~Qjx~O1YsEBcE6+f6na^7_gJRwrE=59C!J>kGk!glug|c+ zCPb=sw(Mr$qu%YHgn^omwwMY9JR6MQ{m@y?N>VqGl)XLm5jr>>!!6w0-5id4^JZ1% zPN!M8QRqeHsV0>U=hj+~yY2?Y{FZGwHMl2^La(XDU_(g(3ositMx**4k=;&wiD3J< zWx!GgT6FJB>>=}#S>67)|LHUQas1??Cew8CWSQkj0@hpOQ6+ViZ_Rt4#Et=+W7(Bo z;9II`psO;~Tb5+KAwU86H?1Ut<+*7-u7Byo3WX>)CxcLu+fLdRh!rH@z`kOW8 z%vXA<+-wRa`rHk&;z_j59C6KLA_L_^ub*Zl3$*IO9E8&m)4L>yD$Bb;HLlp3q{SrW zeZ1Dl+xC=dEjtyxp^MSh+Q^TcD%+7+X`_Gz`32=yEA-u~Ne<{w(I~_WmV5o%)|AU+ zc2#V0?SYoAqsldncxr(1z4etE_laJgrZKskffrbcZvUEX{ZI+7 zX@Pw!pJRa1HxhX|zjL}Xg+rzr02!;rYR7{zr&|rfrI{r78in$s5!_dWb)4)r$zQ@0 zjXj8+j1?yj&B^_%*tLq*H~?p2HH4Vo3}hXPV~Kw)kxw-b)mYG1&#rdk%FdTFO(=a- z)t^W0i`4G98o->9Y1nSO2yrfsZncb`dJCz0U98PI;Xq_u`!+>M;*n}&w35}*(bCrv z7iWXZvGo9Wb^sQm$qDBO5d6srQmF&6#c>J)5l2494-@>gr-+qv@#%@7sN~hw-xs-q zdwpCt4<;Rlzeyw{qNTa%H~mY*KT?eQYG$55VDa91lNinFA0G7BO-v@xdxD&d*Ea0i z7?np~pZ8a=*?2r9-s?$HcTN}&4oVhEUke<{o{jD{T%#2&E=gzL)Rv&t9eM6x z-5xugt|9(7&L-KUx*RDCqISkkzSG?vt|rj5w%NzyHC8$zpEPgH1wR~{V$-#p`vv%G zCd<0#YGKTz?{wu{v)iA%QafYS>PpfjY$iTetQgkK1?vSrHTLpf`cyh9SK5!Y-g2xH zZ>dpWh?2hDS9iZzGTNWvbyyHm1AUoC+iXIg`u6Gk`v)_&`F2@%QsYxYnV(pLZgp)q zka;T1m*u(ju=Swz?5gfI@Tny}@{HYr^8&~`LB^OE@vFQlJdTC%3k5R~+AUyWz;pnv zG|rT%yUl36{pRC~P6`aw(&zeU+C6((=~R>TwKzr0pyknqr@(!a>NF)|_8{9?DbhKE zW|8xdk4-SI%nqF|Pff3U!n$hNAJpl+M&O8&B{;LCMO|5IxfJ`R>g%Z{501l{Q68?3J?@PwbC$f_IhY+;Xt>de>#g!5ct$b^ zb9&!N&3|Y+X%{63%jgF^`Iwmg3WsJl4lo7-)myXZba_iJ@qTXcNjv-}Hw+urS=%;R zaD_;wZ&5A-rV;O;Y8Bg7jWf*T0RUYGNO-=}#fjjV?i{4oeRUHt7s_d6vlL@Ld@6qs zFNRwmYOnM!1J*U186|T84xuFC5VKn3H!P0pOz;D4F5%j9|t_ognGyC`DhD7Wr1g@3Ro zh~rQ#f!|pf|M5w$RmaWK>g9hO{H0*n1A%)nT%cQ0zYsgw!7#!GF`R)7`hGU@GDvT4 zA_)Xd_5^anZ9Gy$MyBJ>9?@wBOQ_9j#e%^}^3zTWRrkY_YNch(4w)EuEQfN0#dqQg z3~ghIg)%2%Vg6Z`Zu+t+7UU}sXac9L{j^;cDugM4K=r#jwQv&?+o{8dtuq`p_CMb0 zLVq~=Y@0;EvPLWPrLDT11dPam%8#R)&)GcTvvF5$YBiJrVIqowM?Z)DPM7HL3p8Rm z>Y;~)jgi_#WUbC<*2ue7@}AYhrS+yBzqzg6$=_R8rPfdILj!{e!&lJ8^qn{J|RqlMgeZ(ccg=Yyo?%6xd0H6Ej^ zN8$R(+JRnCKv(x;9hZz2XX%XP``I|-?1%OU`&LjZ?+CSCcXPk~$6Yz-kkis(h23}z z526vs)QV(X(WUqJc@Rt7ez;a+MEq*(uD_Al#zLfjYgyU-D=-x7@<;D1k|Pmy?Q^De z`9_qRIVdgnZJ(mF=Uk9m50`Kq&qZ*PjyF<+4+-ficR~G$soD48Nj!mbiS5Wq^zooQ z`OGTc%856Nz7v+y$+Z{LIlo)JcSU`0?*UFtsF{e3D{K(Z;*Zh+!MnepQoo^t9~m^L|ga5w*MZCH4|7 z*3mZldb>jD&xmoqbNQU_z%c=3xZzhX}cXo=LWy@7I zqvi@Yv>JFbzOr51@buQxoknx)z@cXLAALQFa!6VMM#KryRJ0<}e>x7!z0rnL zP8Q@^*{O4qSTKABa4A-5Ayqx@JyTs}6ri7vGB{Ny%ez6{UEiHgzFYd6<+$N@9;MHk zidu@DN_4fNlIUM$!IL1IUwkwTfM)Q8n)xOi@i)0I0tEA?8BQS;%4P9#@_Vyxg`$vo@yV9XoIO4N=W}XBy zc*rZRJ?C>tl{Vl2+*^mnShJP=N&cdo&F^$r50D5tiNxU!SasO0)vShJ*K~xoxe&S~ zX`R^3|DlnsA&Zjn*DL}$eNiyOSfTWRj__eX?HXs#0P)k-}4?qcAhhzb84nWKY zut*Mh+qKmLk*PtH^eIyX%Cn8-;0M!_Z2c3v#WRB%b^Ye}N^EXm2_H<}d4DR7pFUCS z*do`d$Iqy`z29;VaD~M`_QcyRcx6u{fEb;VXEW4SPWTnPlh+g5dQmhXCLS5se2A0Q zOjxCsuT6UjSjOXUJdk6xxE>FLdS9BYCnzOdBBp(kwznJ2{NcKWD)9gjCR`8>!H z9lmD@mseiBv(FuC9Goc}YGeva4H9@Hro;s)ZVDt7|2z@l=rwUSzMHydl&N>869X;L zY!>4Kn03EVMpJ*`PAYjva+?nh)zQ08MXC0wLt@9PVD zSMRfD+rs z6GR9>Undh(7c=*z_q+9!M2COf51*}MulMY)H#ZCH&YG)b7#zI;{`78TsW ztm`Cp9stVZ5UyZQNX?s2PsXHSBhMin4g=}(52Vcg2-sH+H()w?CpCRQ05-16lVZ8e{Z4l{!!s? z@}&!!NiEP5TzXuXe>=8ib~fQTgK=8%e9x=ONfE^eZ5f~aTZ(x?8^jo9q=89R86I5u zL|LJ)$2PlBbYg94Lz9O9-Do2-?IQ@h?eQ_FKr2X+k4RGzxZfP4)na`RAc zUBl0M)17CX&jkT#ijy}J;eJ*-x;-S72pUMFvJ=S3g!~BS2mJ#~{j7NBrHeR3Y))|1 zN$5Krr{HW@P?@uApIHBZeL#0{=jJE={rWpA{CB81@UeQa%YhsT51k6$Oaaw=PfeYQ z_c|VzR0nwTO*OQt90j-r?dfzNCZLQ?c&|?!)&mjC!5cx9gCfzvr3pX{`@a3AAq!X` zn`zJ=evxmfVa|h#r)&?hapV*<_QrqW)PmPuUw-q?DRkQWtte{X`u~4OSYJFJY(YC} z8LByU>>n}j%cK@Jtq633cgmuGD25mV(}xq!IDCf-$GYq!hDQ`xhb!cZk_KE=%*KY? z-llY5Gnzd5V)8Jdq*QxY6pkIRBkM@wWu}gE8ZL!(ZM4d?TpIUqzv!`n9W?3$yyGK| z1HpaiiP4>5AHop)*V9q_^Z26nPBugub=aH|UkssHgN|QUNed1|@iVYl4i#?J8S3=r z%b0FgH9)1w3?N-}(e;jp6Pj(p+Iv)4((Nc(tA(U@o|GG@7bV1d6(nOJ7UHBcyGvC^ z+E4(edI;Idz0kj31Mu3o;hYeMoT`jX9~CB-+faj_(Y7Upz(btL{7yG*Hpl{SO!jg2 z5A+)T!7(XXv$$Sy@=uOQwTYQu_VmjB$uYUWinJ&G!7-U2%c2l?g>RX4?9o2JF)7}C zhX>%8Tsrv&$7JU{d)$RF?y_TjoIGIy;Fw%JrI=hTrx$-(-1Fd1@&Dc0zunKJlX_XM$gJ)%AKWx!yZdr#9>h*H^Es2yVZ5GQ@v9myL_?cd2&xTeZEso%HMOVjM= z7oMCYf>aNn6q7rxo#}kDsAftWipT5t*2WIFB19-s{Pm?#^nj*gAX~DSz@D)AHGRne zt6m7+#-Bbo?!%Fetd_-}s5Qzap31wf(E!-aayw!D!^&>fD$HFxE0B*i$1t5b7 z*hJp8FSv-8-5Ok6j(43E0jSaX9%rD>@7rot9YytoFc_?Fg?XTq$=X9awZT7EX7Vzd z9f7WA1EV6B+{bKf;vdD$@cWO21ng52$O$|NNQ@PCxYwg3)}f%+s6-xs^l58q zqgA_Y1gjjsq3OJ^U03M7U|B|%!#N&tHnTlbT{(i5g~{i}XrHQ5b-HHx^O#%CnA_D5 zFkf}SoN`jef}%sgb|lZ>y~MP{Nc4-suA5t*8;6v3lHch};>?5ZI!O3kc_0haW%F;f zG2U!ht+2-GEXmIcsNns8F!7!s{XPI4)8sCTT6U-cK-rmwclZN!B=<=CP=HCt2w!MW zQ!m>eV;_PS1ps}+ES?9D5Up zVz$M=oBzUBgx+SXXvoT@#w~U_Lj%0>#B!6uUO$Wh@;0_dKkm##T zI38He$skTWTzlf_Qu*{pkg+~~jO(+Hm`5{TnfUYJsQkhkU2hel?%wTmSk1FUOh>8k zeVg;w5#?}B9&H>Yltp<~HS{SpUg06g+#$(5h&juTqQ6CmyEfXW^{i*8U;;x@BWCYk z@mG^qwA&G&-#2yZ27;xZ#KGOi#j1>B?a-!C8Lbgr8L6RP|1}i!pre+NlYO2+`QpsE zh4D?h&C%7(YHW3L_?tC3b0PL@ePW{SbCEH7wDkFd!tB}R^Wt*nRbdrAZz)O=yrVKR z`cmR;0}7*+Jw)-B6bvQ=f}lUT5TfL07Y(f-L%3WvXh&%;r7&tWIeRiEw+`wZja zQ>qJ91p^xwLdwSDuH_5b@bcz7r8M^_S=^bc1IMOx4~rNWL1GiARiCZTrQD$^xhLP$ z%;*VAlHgBJw7j2)5ccefNr-YUWjspa5UpBac z1O{O^L18j?`5e{#mpoFo{-x%BuO7plU}X9pK;Zd!eA(Y~7uew=^Q7(Qb1=YF_--Fy zsnC}Dh(4V|-5wh+LzwDE4p&Fhd*z3FB?D|m+0+mTd#?*;t{paojBCw&uG*;4`JYMu z)5Ydnaxo;WMvFV6VXsRKW}0g1RwxS>-dtKIea$Ng&Uw|(%V(-N^UN!T`3%O_L0kLQ#wPwVQ#S?H5D zZLx3OxCrV=KuoOMjHme~u zm+cG~4YlAUq3qG^?EZe4{W+Y*hnj2W;xES)LTFF;T;ZS4v99Gg3y}HGikXH$GR$f2 z!Ay?G^pm?O@hRb_AExWJzr(s&S%KrRIv2ZCNU@SHW3OXnwTnmL%r76Kbn&ZMGvVlGVzMb0 z3Z$jlQp)AIswc>D}6@JiONIPF5TA`Gn<>IDj(W6vp&^zJh>=vlEaNo9% zt5E~s2A8))X!nVEm;a(crV*RaS9p})RS-V?&hz;r==UG_ zOdxPX7ksC}r!XY>518{efZ#Xm9|XS_*-y;VzS9L|dEoDoT>{3xf@@YolHFol))V-c zQ}S0nHuQFaxboFPQs_NHxM79uPJ8>!OQbNRF<7@Zs)7*sN@C4jwTh7Kk{MxPl>}bf zY&9e&y||RJiBx~qMBG`Oc1t&bh9GnaOZxlLN7mz+c?i7erGJeg-IwuqBf(}UYX3#g z{Hnx2IcpM3ue>-M-)gSPDkdkUFRRAS>s>PC8J@yvR$Mn=Ig=VCu9(DpVjm-E2<%`w z1%7Wgug8k?5pUBH2NT2r6k%1)CK0U4SiUbaMP>nYr*xF8)_ZJX=Np%hU8FU;om#+M zT(iB4w5FcEK>(BEM)A`5SG02Hm_?TbkqLLxdF9s@K6^tU=hbeP1y~oRuWd>N3B$Z) z8uDEf!Q1ozdKAY)kx$e~MyE7J#`*rXdgJH>xsIL7h_z5j@eP4EAy_gcX0v4Ve_Ul6 z49=r)Tdp1F3h!pYyZ|>fjJ?j(N%TJ`;NPqJUt>9DV*gGjn!h&E*xYnXI#zcpxx1Tt z{6T$3Q7!U59v)IZd%P9w8fAFX_SOGP`bU$S_QQJt%|%hSEk!R6c|UaHn}Ns~KxcnN zUk35Y6+exw@7`9lVM>ACs_4qwX1W`fF0UAPBy0aXNkUQ0fO7+OJUATu_B$Q^h4dbz z#y@kJ45?IKyX(&8eZ}bT@W(2=nV7%_U{9zOO|PQ$v%n*q2}~z-7Eg9sFzr~hcVC|r z&)r^*?Dxz>M1-8ds5VdsTnVM1)@B=+NPNI3{V;JmT`O z>%$YXoSdXB1SlBi6fQ#6(AS#5!PZ)&j&w6_+&lF}|2Y0X&wB!R&ok?XyKr&7*%H2* z@}$mtJrYc1?;*dvex{SRcxe;C42F8!#fTW?8{DBV1jJZp8{S3B38>w?%r+W5Dhhym z0qzRRK|5GUO;KH+P|YW(<1)mHOivsI?7%-fMDF;Y!UD$3%xL6T|h*Cy9P4|_*#PU~VA0UAe5X3SW*gs29&L@EOu+~QcW{0Cd zf*HqO0`bydKG&;6}xl*iish?!>K`9=i+_RxJ{ zG)A=-*&-dfYF|Y)69e2tp4YFARDau_V9z;z^voHnUc&HMy&oq5DvfD4kT*>i2?VE3 ztAjqd-0RPiK``?=M_m@agjl#3SRnWz5|?a3W??z7PkKXUaAwo?^9~jwnzk#t9^hOn zhyD>Wo$A`uqCid|3-OQU2C+Cmr2Y_z{)+ z%>MJ?XBYhf7$WzIva7z+ef&;mrS_BLc;~{!^98f;5LkmkC{Wu|s=v+dC-Suu+LI|@ z$G?5AQ;JP^EXS_R=N8ro?UfeLAA5KV5BsQk)TtNWd?Jt8>F6YD)j>E_b>CHmfrq4` z1W^#Z*J0JZxtFc^QQ+d5+FXi`Gbap&NTHYMbN#>Ad+(s8wzYqp4-q+y;pw=&pr1$znSkJ@16O2 z-uupb)*xY=%-(s{+SzMA&+{px*aT&zVl+obQ8=|HqJ_HYc8l3#vRu4NJuq6LZZkwh+pTqq{zvgr-`21c~#ge^2E`FhGwu=l2ItH6gHPE&JeptIn> zte}<#F-Gx_Hu#>)uCGmKr{s?7v2rW3FY~Yl*u-`wmw*SgP52zUD>(JvNZ>zL;6Ls4 zzbqYXU$ZAC9X`5rw6m-+Pw(PL-N3g@#$48ZsI0Sb;b>fXC2Pal$k&+dAODvKPl4^0 z|4S6c7+n5WG}svM9J4ycro~g4Q;D6TRQil8{w`I1S@dk&Wsi4KJi4cHGag39+?_Z} zZn6e&1Pv?hNspDy3tIIQ_c)@~j}sYIVH2Nv$IJZ>3X$M`d-)scvW?E1E=aIQPEDpG z+L};iKSy>_?T(mDdc>nvETH>^AA7(Z-@hIpaw0{-GMU}4JB#{rGvi=P^GdLeo*Z*>!7 zfMC|efnazum9eR7gVv6J;r7mFt(nKVp6KDKBg+D&)-eg2)kv}&H5{6IMDqL_s}2>F zb}d)eS9#w2DX`GHf?JCGYiS5vsD#!1#5r=Fh{bm?*p-ZUl@>+WgQ3~1N~9CmBFwT{P6SPnHSbxqxK37V9GM2XT>AcElF8&wJ} zQW#A1yNR$f2H91Ri<6A^!OqVK0G5&toMAq^Is02sjJ=F<^?0Ssf|+?9JFDvlkD#%hj67uC-iqFh{`nZ_pP^gCQX z?+grJR26#*2%0xq+u^f-VtE&6W$G`-#QV`HIoM~>I&uz+hd$G>L9@P@h}fU% zOomoKVtYh$vxWDJ>%a{VA$P`}mG=U@Q~hLEjf<83q44W5CS}`@u6U>u8!g$H*{n%% zre1xPU7xh6yC|fkmz&zhuyed78`{DS+<;?>)aRhlAN_6;`~HpF%q(ck&6nGx66o$8 z`uH2NNM~Nbeu=dhc3bc7nx26#7I;fWypKCkeegx;)NVZnr~l``g=~x9&Rd`} z1;0x*Iqwv2IA;+*?9i?xjlL8mb-F2)8`{RCl#3!G9@PYkxkQyKY(s+2GIdQW48y;L zUQ$LuUV{(txA*6t%kW=%{VNhg`56;orZXOe<3aJ-f@`)GABNfS#Wt{WH1F(i%o+}R z(GTtj#PGXgq@O3Ca;+n;0^Gf;7!U*w9v)TX&t5}ZG03{u1snonCt@_(zK)gRya*Ve zUE8_Kk{G9w-{%7Yy%# z&uRQOd=lttJx>LbG9rGESPFM7yqpwEX9)H*mNIF=#Mz9bdv+ftAI|17{sG4OZME~$ zQr+j}q0bA(=Yk=+;%3HbzUrN<`q>&bZ4A8$y%GWJLXRBwUr9|(pVNM1$Bz?Yk>*Kd z^R?gO?@VIepNMf8_c2m7Uhk)V|rCoE*O+on$Z!uLoHwsQYHK_$2NOZy!X_2a~(F1CQUaj>IKMLDJR zEacQXKouq)sjb-_YHr9g!-AMz#3|GL%&MPC_3dc-Z(I0pdVQ-tD7LM1`G~JDAcj%% z(h_gg#Y76AsW;kU`!<6wkez+qWAywqH;cMbE0$u#gWJF`LsbUgx6Vv^4XpSxY|}rD zML+lPe*%wpu$lsrfCrj5(l*Kl6hX~8H%#(0R7-YsAAo0!(zlGa(1vCeB~657y%1C! zLEl)Vqi4>$qf;ThMbc};aW0wmplll2)^e@W?!o-69(;WELlvbIr3W`J2B_m zhASJ;c@TGvMx!r-4A+Y8o@y!rx0?%_R+$xqNjkCx~NcnjS(oPqh`1uYLRJ z+zXHR>*s0T(XJ~bzCxfv;@NJc2w9{9UC|TY>gGL^p&e3CgH&D-!)C!a+akUi`G-Y{ zH|yDVfm*|JxxoC+v3q;~0rh>u-5^cx??0!NECW02@_|@azRE4=ipmC_XC|TO!ldNH zw~8My3}a{0^`0RZ+`E!QJ(9{KJB3>VdIq2hdjXC6F;aeFjeHd=-ZoJI>#cU9$WO+_ zP#}l1?e<4@xG2Xqd+@KtVkvs-6lBhlW}YOZJqPyl4W7mKwKok_SW$X>{(7;!sA_pT z-t7KzCJGM22u0L6xfXQ3O6N}Px8@=XRx%Fe?gDBboGd3s3HaZZ-36`zu_?byFTx0jfvmOgBRs% zkK9e{geKw3MRvHPT_|@wV!4hP!JKvtlNp`=^U%AtQ(mLC-Y&MDB_U0y+i7oka^L6K z#ufE&mQPYRDmyYsT}jD@9H}!yp&&!H+*?>hbOn_oiOqt!{11I1o1$1Xx$!o4E9nw}o08o+e{%L_h3C zO#N_MeSX)&@}xHmF_)&D1WQ-Dgj405Ov-Ed5wAy3mhhyd|V*Kg4Zyh31_ckKm7 z8N=4(5LXN(4^!A`+DQX#m`qnTK&~dGxYBY0ei81R^XwU|tYuxz=h&?Xy0w=@iD{yI zsF-un;3VXG{&oi+8i#2chg6=V`uCMRZL1+%c27dbCAUEOll$u|9U-KNC6sS&l}_R? zZyoM!iUlMqJc|j4d)(SiW^2TK{@o?kmak?tx-a+2)GTULR`P8pkbh=tKy@k#6w5f; zopQ^xWzf&T7JS-*2+ulntKy%>EJ&0|+Iex9O%E%*FtVJQd!aM$GF!fNJBqeM!$nx4 zmtl9R3n4|zo~d7{=EqiPpWyiUt{98DOgs9TNi63LHRTV)MFkkoJFnrxhO7xgB988! zqAb)Wh$~}HYflu^H$$zgM!!a1oRr;4@K1={?b)+n;)4X!DdUMBPC^IcGQNN1kk5PN zpxBIWIZ&yoWqibouM&Sa%g?7#4@}uTMc;k$?0xwTy!A|#^exW4;SuceTY>%I>Um6q zbnPN=@!7wcy=%N*r!jhT3&O7H@agAq|MhFtFJ0}Ca4xF%p15ugo99_%U&6g=KtZK@ zMP30J8a-9dBA`;-bNkBR50b@X;Buau`5+R(j0Y+ZPq4>tM;X~RA@Myw9iw~6U(F#Egj_B+b3=ymsRc>u$N7hXz{rOrbBWYw%8W18P3z zuBlxyb^<`y*OG34UdXfa7YW$tKjFpFu2;9+s5=KU+g zrLuU%7xY*JUdtXo~*rk*pJO zk^)G%8Uzi>9x54l!$&uNkkqCVTj6&K`%Z3x7u11Z;CCheVCV(J{@$=rH4qF8f-S`d zQzWth!9X94gXF_GI^J74tA9rLEBb2S*#8ar)H!1}ovqRNnugWNK37X8lK~Z&uwGhO zO$c}8-MfxtHqsI_6?H25I2DUfGT|1&CC=scHlLsh2QxIm2G2J>Et)`55$DI3fyIeuX!H*0i6~r&>w@$ogGO<#Fy5(0i z7t5@awJ_v}Se8&T6HOg=mL1i%7SNp&zB7mUwr_R*arAc;%CCbKj`7Tu znd6%{#$(du16so#zU&i6opT8p`giVG)+qGWc@;=L?4|Q7(s=WzNT)ry-1D}aEkg8c zP>K%lp6rZ=WN(HpHY)xUtm*!4eWGFW=}?%_%eS7n1^m|irq@LaunayLPu0 z+Jzfow9r7eGaKM!F${P?>zaGEMt(I&4tw9}4Gm>woZNB{C#RQYD6e`$^IiRsu)KEe$@`{9FT-L)bI*9Y$ z_tr>iDf_saA0tv3)^0wGNN4b{>q-~7I~nuyCo*?}JT-PqPvZmlz<(!VC(HI9IexVs z{7KNiePpy9$G8>K@7x#-o~Jh#rSU#^j@j;D{;rI9AGDHp^!W#g2)D1PUf~DuZX<61 zB)y_Cd=P7r{`JdHUyYyn@TRmgV)tnQ2lYWq@CbHB5$`UO_Yd&ilkxvrtwx*TrO4}_ zMB<^E8lZXOLp^LII;`Y+)y=P(H@Sb`l2>q}M~Frq zMWFktswV&JN>#>ID;0yUkLMDn8H^7>x+>5GzzVf2syMl4qNh%lYAmzj%j6^qOT zZjp}&Vu97kIxqzb1m^6aR-{vdJWu;?+iQ0#u&sWJlE7~UM{gHM8cA9s#fvd+36V`s zcGLMoW6?Y+IcAZvV$u{=+D2*a0-RAwFP-~orjnxddOYoW*1mTyh_T2%(@ub;k`F%a zY)(x;65q?hmXiHO>DhB>?X8dykEs!~xpbzztN)xg@P}t5ZELSz+7t~t&1GN132RHj zar?Z-uOEm#j^hY>^~ajW#MA^&_%{WQTCN3q%&Q$!9Z!}8=E7$lJo5`2)i@|D!4jIs0);)?L?r@e{-P^*0* zOjisI@XkEQ%0`FB8yVdK4l%Z&7AI=;C)Ac?xx=4@KsEC6Hdq)vBYfUP?&iEU~#O`lk)Tnprnd}drt3StD$ zv3h|3VAHygT5wEE>}cp^5CB7%ERul ziSU_xf307D|5Ok>2$7UJjA|B z?k#Mpag!7ITs^(yH*K)Z51-{td<2s9yv}?3tn~{?h0BUY1vc$YRn}-JA0=RTO+nh` zX6uZW^MAq9)M;!b#|Fh~2GICRCo(a1IhdVZ$^akWZxY_0*Y|(*^)E=k+=|yF&byYN zOAQd0Gw#Dut?TojB}v$)uvm98IkqjN7#iHQ?TRsZ*P4B0|6l({K={rJ)17-7`T16*|?J(ZKb*RMWw)_AZY%cDkH#!&W)_qj2 zG0~HqY`$_H6c(A&Smj#D(0@+GFM@V}!~dSPqh001^8SFO*z4dO596KU5@LBG1~hug z+Ifr#iM7sg!6{qe@M51^Wt+z(gthOJRO(PFnjP`l3AuJEGj4kUq2=L@!KcP-H3oK3 z3F`_&fUDC<$z8UN83yS1%KOPlKcg$lsOn@Q_YJr`eWuJDd9p)6@mR0Ru(o(NwjL~SDmkId%U_P7)f2ao z3`d^;Jb)$+5ZVR1)W+F7M&m$hBz191%O}%=2hzys!r4J%7sD{$m%DM`}!vJjqCg33w zjXu6vlpRSymp4Gc(mC=>19q8hkgpv3krH$tc@IGEQ``17 z-u*}nsp0i?W?l5vS6v`-T4GM!NoL>{^h$~{mmf(w##VY1h@>iDIZ);Sbd0j`Z-7yp zn09mj{s$16Z-YRA(>|Y;!;)3b?Ty}x+Sv;UX)3t@M!1(#sH1#D7GzeSP(&a?gU9(K z)$%(q(HEqc^Vn3AtzbvYFO|i(@`;%_Cx~5xpGg~lld#T4F&EgPlrkjB+9ALYY_s_- zR*$#|`2rAH4mRFGGHvpD6-ApwW!(-!x!6H1B-|bS8;=;_35kl&1 zqW)Bt2w~7>XZ$p1Quc!PrAo|pZhan(mMxV#4nD2KIB2yvH3CNgr#-ox$5lAjawYqu zApTJp%H9nF^T)@HbPDnRTs%1qlP^a$bq!w3PnV~ea!zS2FVHX`27FZqGbV-5GYew0 zvs!-P*T|2yFF&@YyH>pA$3eS3Nyh8wrAS+bq1h8JH(`g$A2sF|S73OM8Zf1G_9#*5 zdt&U{>w9#=L&Fy?z66%eMa&_570i59O-q87C{#*X%89Z%TvSYy=?`Uf#8n|}q02)5 zR90WJQi!IO`l+lgR$+Uh<5o8}Aaf~P(N%`5O(4n&DZbKkqJlv&JwFPp)5e$A7vBup z-_=mYR|RFkbZhUuRN(ZMimjrvBflehPIH2eO=7*9^L4jPriylH^jJ%Bk(x4Y67D6U zmwL%;)0>f?=F=4~)XuBK!rXxtkH-w)PAGX%0a3$^?ZS0m+0h^i9)+U}+^~^^xVJGe zK!1OHj*;i}rYV(z+U(NRyjv&*rMV$%zTeee&!vf~CT2aduiU*$?2MwNGv!sjMr!E) zZl`o&0_KT>R8}TzR%jFCg|xaLwkUz|C@Y4ts6c_3c|6k48hJ&DJYI&Dg%ZN@ep|G2 z|K|$*&;0e*ATNdLri-3Hevs$}9dZ&`h>;XhBUMXRc};59WwE6DNEMD(i4o&=KS*jA zN^Ko$0Xg{?_(P3gHYcA0u20l1vXxsn!m7D`7j-ZswY`)J#8wILi4kkpd3G}}?WYFE z6X@j4IQB$2wL0%0BzkjuZ(rfJbBBcsuusp627Ogk?U;%lS)OVay^?f6%DG|uVC`8F z5K_u9*vX^W5=NWU$5qL$DoN96gaP!`Vm3T!zA=IBdVco5oPd8(*%W+ukH&eg5^K?P zYvGu2?=x9Bo{8`Kwcgo8UJwyuFY<%d@Wk_NNR{HZ;Ag0$();RyBup&ZzsO(!`(EN! z?M+;3^jVI;VP9k3Nb8?a6f^*1z>tO+z@;9L#M)_O_`-5KWt}pj&qxU3v8#R-#3)+l ztwK-TvE!oQ@vCwRiXKKCpPjf0L#Gi9@lOxed)3??BD+Er6O4NA`m{aETc%2XM#p57 zCInFpUO-x!Lktao#!e57)0KfWM)*QLRLSWNEDGqbP)d}6CxIBnW)m}g7vWL070%HN zcx!6c?1`I8GgSnu(aD#DqIytjo3Fo_uRnQ&YTQ%GQ6wkJwnbLcVertF0}}SJ=jzo< zta=cU+N@?cUzo9mZfOz@KHEuQt8UA{RbWtR`?@(Ap&wwfeP_K@IDC}X=q`{K-|bO5 zVI{CqkOEy-Qb0?%jdji|CA5In9Y^?~L>vqy1wVe=J6Ysb9N)5)Y+!hy$)0l^Uu8)gh_3kXecRirdySUn5~>bW+$>W`Z6&#d1Gv^m`Qnx^3Zpz8N)eiA@DSjtWt{4M zmbrRj!Py!4&IV`%04K*)yQD5kh{c}PN{f^afTYAduIV09^6}?&<8T&~+@sbe&U8bT?#b=(ED;9~pnH@L-&ZNpIX2iD0rL zeH6f95ACUSRS(ORkBbKEr_9ef4v-WdL;u<29Vg!PWkqA&Ik%TI!Ta392;WHsNKhyq zHycWj=Mtf-K2pmR5d&GH+JGMij6s_GM)%Ugy!$81_dB?eeI_)mphj2ZhL^)jjzu~b zclL}{s4FA16=V{#5vKBRM5ART3(ha zt_9?)+;A1sw`^m{nwamh!#LU_eiW^D;xS82u#oe91na?Vo-SLr4tQ0=lERmg@(&6h zzz47o-qZ8?{gdlJmHbxK*45RTJ5SR(chx$jQaFUnjny#q-&iTr=+`1M)i4cx{Jrx*A53U;1q9baV=J93k>eJaUEioPIX zP*$k__P*}z*wyx{QmTU+lex1M1Jf(~oj|mZziVU#IvI17`!`uSXI)$PR6Chc){@jXv+Lpt z4b(35>{K@=-AK0j_Dyw?QlWMAQQ46|`L60f&t%^#FU3&3_~ z?`s1`GK~nzUy7V?sCYCqYxO{byj)>b0o<4$cWe}I6j2;_TADkg+Ig^N&ilI+eD8JC zGuza5z~?+|#SyNQm0P6qIw#Mhz#jDX(s=M&^xNZE?IJm;r4(Z~un71aVdm^rB5RqY zIQ0fqaEN^p8`rH##zEHIY4}v<^jM4{@F{cg8SVY*3AD{z@t{UJ6(xPmVjA{czFg+( zKfuKPUQ(^m5V=*VvXv`(re;(F6g0hdH55sf{X!j-ck^RF9%Xe5%ZiM=zH@=J?U4iCzOyrd~z4lYrs*F_l!rGAxCWtGmVsDP$mAnfY7moQ#Uhdka zv>re^4J=me*K=@4gJn1CDCg8Ob>XY8!-TJS2j2#+H$?b%c;Z+zD+EOU%NvIOUD>C< zS;$wqHv}7pdjv&CIz9mOV;*q|CGwy%VrjR@LoC~!+eDq|dx!#44FzG>i` zVvh-8kbXAgBFlZUc6M8JD=`X1E0)x#17)3Q>o+D_cZA=Sl_O|xe14ce#^}Z+&YF{J zp`_4>BtN{!&U4naN%Wk^U5hL72zns#0@M@RWW(Ork0Gi^ zy4a-cw&Uxi?_9~inPWfHq=_jUNt0tm)Tb*NMGJ*rPYuamjlROr@y22g3nJpW-j-=T|4bm5?d^MT7$9OV$tR#^^}*AcNw=vjXK45QAX07 z7=(yUw$6R}idAr66mr{)L3aD`MzZE^dPNWt)L64OmjtPw<#s>)lA5cG&xaTVFnHLu zkw^0;v6G$VZW!?&c(RJAn?@NKDf<}~%w^FQ*r9~fXja+;Vhq}(lChrlIPP+l^K9Wt zEab5;)TJ?hdg2jSum7>*FHw!rkQO!V!>Tz$n~jtVU-fL%Xg~$)oDlEgKMa8%t+Ckj8g;}mGYkYprF@&lFdrLmk1aTl8wL=DvM593?AjOQeRJA(*-@ll zZsqJ$i`~j-66X9C%DOvw*7wff8L$k$1yZ&TXEdcQBDde@KVJ?uc1_Fb9;0tq_EFb> zAWPov^8O%M6FXQr(-G`l`^{oU{0GUgyLiLmJ?#cZw?OBz!99p}=f1WImR>Zh)L|?uC2uFNa!KQp(Sm?*7%|?D3PpOFB^-?QL=0Y^3 zQN$@r_H%lVELH8=P6r6uh0#&@loR-~Iuziic-!V1Txx`?jXlAJt;Tm6^fDn5BGtT z4T)2XM<33wHYHrxvT*uA5{^c$>NL1z-j1`iw6D*|{H}_DYvJoUQctl-fBf`$SL)cv zj?-UMJrx&kX)dK$%a3K0+ky_bEs*!$ac(*nWSFs*oeKJz8+#K!&A^f@s|f>K6B-W~ z$GK0kROw0gf^q#k1JjU&o25@v$E|OVgHs-|a}bAbSB_MwIXDVuD>+-KIy5Npog)p7 zh)Y>@zu7Y%n=zeG*kQ98d+@22^~1Bynx$4(%=YZSQtYnyx&~z=C=~kztd55U(z4Ru z#JIk$=>`_n;*AF2p$R4ZQcB;evbg)N*rO@W6>RqXZsbq`d~r-~Dm-#c{772{kT1XF7cit8%?di5$(hbmOOa=2;ZY2s{|ZzfWCT#3=mzI zpaG;xO4XakYA13r9N~smKrSYe8+PwYwVL_-!B`G)*hQIP(}hRoja7k*q@O?eV8wi- zT#-;~p}lgW(A{ZVJk(D;Emc?~E1iRpXjCQT$i#fer~-3~;KOBxuO@N!tMP(5JKOs5 zPxB3F9L?>8Hte6)8#wNOb*%qOsbskiCBvt|)pDjT_%_wi~4G#EeJUs3eMr6Dw7u6~ebcSOQ$SbdIPb@!p{X9nfzs(No8$p*~t;-D$o5#K6o+69hOahyDPEY^`p z4C@u;!VKLTK4QiG4Zn@{Vf(%+7!YLH3%>%^>VyJi1m%~}bOI?Z$(Q7#-U^W?7}w4` zsOjo225am#Hb$qp*2rd{r0akd~VtJB-0Q@WlhC9NYMRoP_;9b#R^8>j<8NADIVNO=Cu- zk6{PQ8!WqTkDF$W&fNHVg$cyjg%1LZ(j?y0bdG6G#p$(?wiK+r#{9_o@dYGq%jb>Gt$_*pdZANr zVVR0|b{GHxE4QLxXf23Dkh54InP|(2M~uf}YglxBd*x9O2P!h>k1z; zjZICG!0$`TS$#ay^kBx5eMFOMYg9w3in#-#I-EVIQ?5tbhTuc(A_4I{X)g%3bF8#C(OOW?h zW&cF*yZ~7m3ysxKaivHH4WLwT$4!I=tOBy$q&w2va7K@Dd;Vi1LF5ZjMXq;yT)Q>D zx42<8myo4A7nzjHZe@*;G8q);5~2tx$>%3N#uVc-<-4fVc?05DX5gGmdXCbH6Q30< zKYH;IxqpzH#q%m^X|{=%E3Dy|+f#833~`|rWMgaf1)xt_ls%dS%Cqe>LANkC%8$|3 zVQ)_+_?-Qsc#!BuQOofozP_-x$8>(i&01THFAC*SA~Ki5BO`<;Bvs@WZab64{vf%^ zD)jAO&*4?t;^;j$UZseDy_-`Q22bifoJCWykU>fLA>*FyKii~TGvS*SwTx}1FNZZA z=K-RicR=Y${`i9=x-BozEX~4;viN0lk6U1DQ4l!kYC>wNb0GnW7tYD=k7F;37RcRV zd(Xgf%pq^r48+n3Wnf6HBCezs*_E49@KfhR#%r$EQx0cYRm*-`X$Ojp>w6P(8-RMS z2{O~ji*?V(ACNiHEbm!>+PMAktv%DBo{IZ_L0(F78?%=y^83c`mHSkyo7bU61o@d=DeExAYzyGb;Z95zq?H0EKd zv(|1~6<`kGvS`?UvMZI`V!-MH%pbQ6jIx3GW6hBuHuyQPGSYh*IrlqQ#^08aV-pJ( zl%715B-B*ZmI%M)X)7Vr&B!~_GCXNR`|&6v?H$SdSwVam9HF!@^w56u!n5r9!@UilHI(NW&Ff`!TCri-H^L+~ zYv-K>^|?Fd`ldXce%hv$^<`P<{Z-XqW!701J> zs78ctpiDheZ~-_Ix*vvJhdG%p3tk^a$)x z-0PVzrdrKsqc{{h2SRvka@?DKQP@KxX#AQUsm*>ec3exINmcAFKXa!fkikH_>r z88~|kN%L_i1qvzn$4I@9i_`V0HSFE0Ys=}?Rhl1r-79Pq2CX+L_}u!cKzBjd;T>V? zUXBb@%6Tn!CU3@8s5SDc)Lml4RVlGD&>Qt+h*wfzyEQvO3dpjcNxI2$@skYGi`#R# zQ3QF1ETlb_+l*&F7%bf1u-B8j(0}Uq3n+-pg%UnjN?Fy^+AUw8E-T{v1j9???S4eL$U=i<6YV5QN?H%U!ulL6jZ#g%*7#V^ z&CCAv?GF-7j_)m9d{-sQdeFZ=92x;tRGW76X&O0WD7k~GCzF6AZ zQw?WZDo@Lql?iLy^9TS>kVXQ!-eFmL^)BpEhZSlJ=#Qc-yDaA})sUZn6X*`Mv<;&U zg678uU5ZkW5$rlyE(iC&R$WUln+awway`Sxj_JQ*SOyxpq7%aEg|A?vfYuvswty56 ze!I7D{M8|Ru`CaDX-^P4hTCO--cxTMl-VpR$GEEmFy!7=yOyyW(f@>5l92ooNz{K` zY+@lk;!u?Vl~dSv~$HF=Ns_o{kf;1ouhkXIwRqz+BzwQ zfD{P`1FMhywNCT}<0hl- zCR@OS&AoZ5Cu-Czs%5?C%RBdka8oFA?8RLL=$+fGE*T)zMTbj$2IYoM=C%69C9e$R zuQkK^<6`=YRBtT$)5|)(>Z7+;C`O1ZI;{2)x6!5!woX+P$84rbcEX{C1xMG#(QZ-( z!C$VEaVToeCf?eETDM<$tDL$bIDsI4lZny)oV3&>=N7KBfc?5N7 zs`HGwufe26wZ?-z`t^OAn4Pnmf&4EejEN^PUI-7;Uiv`-_4g4z{@{Ait=U2R>+V6C zwKSu^7>?lDmYQXKT<_o@eLl6J{m8Go@)e?VeFr*)6S|M(P<_{$imli6PIW&Dj8|EI z&Rmtz&d!;ui2a7$u#M5Mbc0+e7INK5s4%dDH>Z16=1B-s{&vFm6Ouc?)etIP5wsKgT-V~D1^paXlH0PUQEHEi54h#%hC&NsA%FV5B+ z>v-?7)Gkizwp(TW1H}Ee)XmB2|2yNaV2j9b63NE08B;x7M~f@(VK+ScMjn#Z2UI_q z&XR#?K8vZ#`y%u1Uc5Qwc_dVi=~eZrqfc{MND@O&m0<*f_+mYhE12Vum?)>{s$vvlIt(DX<>~;nCU;nl3jHKaDxHCPDBVa1dDKGZ4 zd~uER5{C|dd_}reZbpxDtK>0aYjhsGslD0hq@{Sjuc~-(f{3GLBcn(ZVyr^lMcD)JiT;SJ3;BhyK2eQMCOe4 zvJ(K?xG{a#(D9!u_X`;?KTkoSIQFHz7!SL=-GpJW)Dn9YDvIGPD*aAX~5oU~9Rb)+$Lp@{`mk>ezm zH(&j7xhI>0eKW8hzrI1sGNGMobycG6TAGqli{-W3opjuwRo0%I61*IJhfd4YF1z&j zMwuo3H6A^Kshn^{4K}M);IjwVAbUb?AZZ2dUUwhU&98x?eOk-y%#ot;{F57)_C@QL zlE(c%;}@?fA{6r;d%BKysI8P=cLU|&<0}Xcmqa61Tc*gmeO`ty0=bZ}?4*!T4UC40 zkLsF(r=p>dT2JnVk7D2<_u4mw9+1+)E*V&Xl$Nb~G~Oq`fnx)MKS`tK+G%VDTzYo` zCAjjfYNuf*!r;3=+Qhqbbk9Jl^x)k6COxXA-4xpNGb;W2Hw&nYm@2FGdl)M3Zt>6; z7nI(7cnI0730;}ag?jfS(y9(}uy4$SrISA)4$n{5n25|3>kUHHE)LqlTG8eJ;@mkC ze#lzO*cWG6-EBO}0_xRW+!Cdrcs%Jj#3Rf7>$|&v5xPQ*1dPz|E{EZ_-A^@IN238) z@2;LF^S7LXy(8Jj3wRq~E)b7@Pi0a|^p(tSM)vYow03=)Dkv=+n8J-?k3>Yhsb}=Z z%Idi$<8hAdq`ny{l#%<7aD2H^JD+2|i&Jh;X%MYpOZGKZCwe>d$8CD<7q)%_tNGjJ z1&yb|If&Zr?bTt_dn1a5s{Jmtg-&LJkeHx-fL$}HEU`^w;!sVQm}D|O-!Ab^E-dD* zP4oqZK_PD_5qqws&o-mluz(x+!hfDjiIuy1qs87ja!yW3^5Va8>BZ(!;^!Kr4DW)f z1)kakZ#09Xq}QfNn4cvg^o!xUePbP!nMkGnI^G~D)mp*U{Mk`+jkH{au5cRbh%5RG zd*Zc1HdrQ|hBre_nd`YHDiFPyXnq`6xe8f41SIQ=B`WN>DyAqEIp$UrZQzSNizNkj zLW#$XbEiDh+-#rq?UWaF*4|D~q8Z8!lf|kTIg)RSd06*Rd+S+8s&pqr*_3rANlZnh zDTp|xDR8LzA6B9QdR3)&MU%Z|(1#7Pu6xiU9fA#-e_e@p5x)&}l|96VkgZj#Sd?qn z!`ngyRVXF!W0UYqAlFy0#S?7gs3u$NX=>)zROo2~Eh+Hi@yla|bSl@Fzv=p{d*`}e z=$GIFB4?p4ZGK$l40dw{@I`@Ea#6vp*{O^yi?kb%wfI~2_0L=Wf8^^gM`w}OHu1v@Dszu&8gw#^J61NT$Eyja-a5Ki zf6Q(ZD4@%22vgwjPl0BOr)}OU6*l!tKc%cLAu)hKW#Ol?Y%t`OGs~M^XWm&sO;*up zAo(V*G_%n{D|I?<5Af)K&<5dw$$0gyu?u=TM$G=!4$B-IDK!#&`o^=(zMPYrhyB}* zh-%UuyI@qk`*ksL{L{w1B^SLQd4CA`+T)g5?;x|h*H0_a0Rxjr3RV15dAeLHUT6Qq zK}+SS6(}%{S=VPIn(>#9#2c`~mv|thp%%x=5(u^Zv2~^)g>dI_W0z=&ARdOMaF^@7RwZYqC4_3G5pjivWO3d1PsG?FFXO+b)!xx)`Ium%ZBpmNUH~ZU$|rbiB6D7x`toe2qsL82H0{?6M8+N{JF` z<;lvE=3XDiz4)Wr*^<@vEj+9tJ5(Yeepzi%MjRo-kn*}{Cg*^H`r-Fd)HwsUii*5zY$P}90xw_j9KVajfNXxn34y}9|b6LnP zB9*rY|MZjai%aF+vFsb&b{;zdk)knodq-zXVsk3+NS8a(pw|+j>l}6rd8!ay{?|ZoJTX2^>zYyUvZfYMEqj>xU?j@Cy)q1hZRzR25mh}b* z{qKDF|qIc@X=L__hI?oQSyrHFg)cI-SPeVU}k>HvzyKx z+%zrqbe>)EFW^eacBNWyB8ZOF?7r}^NlWbBIxptPo|9vh&ga4F7w{!I&*n`thC%!= z?#>!`y56)%;=8vK;@7hF@oKjwmgfx0ya?72zPPp>xEZ)YY__yG;9LJ1z=>k6%z-z; z%l4#0yoU{h&$|6NS^23yxEI@prk$Lx?ci*Wob-uvc`e#eoeQ#oFTTqUv zWZ~x=GYX*axzRvs3OgDCotu_Qa|`E0Ue0?C zpUS#y?v&g)ZQu87QpZ$2tE_Ww!!I!}xCP3FS>o+oL4Ow@pC@KFFn;`-Q&B?BBJ=)@ z=xee4{)5E%Y{Cd*Xm4y`C0Xw+=)Ek}&ejlw?r@+3-yJ@t z+SgkpLLAPP+C{xS2wHbsYHif}%{M;U(Aw`E*br)IVRLH9>Pb*tu2G5iacz-CNHhXP zcjV=XP-u%7D`~U!z|vEZAyS}9!Cf{ELtfrcAOJhdslfmLUYX)!d=S&Rjgn3~*YW>q zul(;#h_{SseXEG0ZyC!Pt6Pcy^q5DanlQAXtnq{7KPjVdFR50(5Evid>JV;3W(ZQ^O?g^TNw8}N#Ek~pJLFXm zRMZq05TFmtM6d|VT()|!LhqvIo-ZG0VkPl1Z zme>lUFSO3%^6;6)yl=DBmJ;)?1rG<;vh9ISGrTu8RPekm+D`K4bP} zZ}|{gmElyS=Aq$4(!d60C}xsqYB~Ioka}@2XJe$#i(QIGUuN!nyOXbMJ`ww2zP>2` z$+2|}ogIWmQ&3F-k?&YA7_hP1yppLxU{U?-Ej}PthT)i~E8r^{3SUO>HK2pTXo6H@ zN6}KfwNRV!7)4+6JAsA9*W>*k4zFXNOg>mYfVYmND(xFWeRCYuek+{g=&$9(=#szS zSFh)I`;|GR7RXqXv{A)hopebDERskGeahL325TPP{41FcvDDglP0emil?SqzwZA3nScBR)Lc^Mg=Y)T zD%1465TuVvvrQPgN9Z1oIf>Z`sS(>4Xncs#>|xk(K3^1b&084N%k%b8cvbyuH zwUhBs#i=L3?r7v_IY3LZ9V!QD4Gf_m&^W}ic+lDhU47M*Cm3?^WHHN=?=A$*UveeA8kr> zV)37o28icFQ=>tXA=T{9lGL7?CStE{;O5mt1?XwgPr%tJEV^9o9>mlfHR7tf_^#nM z1$dA5^#hBKR5Zri?m(4;GhUib={-ih5886Qp$?dDN~#UKZ~oJE0_sX7W*3&lv*( zA)&0~2aT(_^>dBYkzR_24gqm6W|WkM6*t|bWq*GW>fkg*fBXqiTI8gEvShUS$&p7~ zI_iC6X^l~fxooF=vAv6jLI{%;oq9(0q(Blg9>rEURjH`0RR+!}fHUKC&HLd33%ffal1RbNM)d?n-{;zsT|@Gxx_h_wr5m z><~J_kYMyOiPe~}AD;LqZR$ z``E4GI3AjNSe&=pJ{8*QVI?iiO^x(7kK9~@ZU~xme}OZm{}dI|ejc@uM?B7HgfNn_ zn^CPzOPZG(32k?|H+xhXK~&KIl=_{MxEWpo4K_2rvm;Ij0a}_hm z`8@;;iW8wMnz%5FbA~} zEJJs%xSsSVcW4p`c9yTyh}hIPx=x13+gojj19!I|SQe18LagzkMF)Mvges?zLvWP* zkq9^Y7|u(6%=LQ3384p9+f0f7Jdol4?dLCdiWxX(w=FY5X`X+uHs&by%$D$Xzm4Hp z{V`qdc|6ges6-h@%UqB@{E#(ON?3F?yf|IUoWN%)%gx0HwJMi@-;TuqVp9q^Ffi{z z!Fp&3=>xs4X=PM^xOoDKYc#-5Fn?6Ve+kC1p)#+r6-1zJ?k>w|y#%hGb zUFCsS0*+n8n@w-t!_~CoAzU$}%rvRK5|YV)DJjV^s?s|%?fuPWr`3}_k>e{RgO>|E zttBr-Iug!slg2AL-s?__6^s$2RNK2*Z)uhx$U~wHf%BYufi;Wh$wD%kWD)ASrZv$@ zaFS1=eKOPFvV7K19#h!xNsYFrb>542$zgt*g)zy1_`~0xfxogu`nQ9~RQegy0JHB5Omyl!3NWNMv%upnYdBOr2WYOO_Jq&s(^TGA*s>4 z>9m{-thC%d(-m)r?tKu))7*zO{JLN;UhgJJ>)bjzj=PmZUGI)x0w2uX%y?c6n|6D~m~KK>+lxmNXtb92`}r)ph^@ z1W~1MX^>De{ZqA(!l#EU71|+vvYG8`UJDb%oIQ7qX)WH2%Xe0~Zcj1%+5)Q!ezo$> zDBSb4k}~HtK64yAk>5AL=z;Zpxnm`>`Mu*wsYOKUHeJ0sRJgq$s1^zz@o6EVtn5{~ zL5KT{P3vj`bOaZ!c9|Ef3=^4E7V$(Th(ya`X3FD=rAcTjHG4Uc z7*ffmxaW{HCI41qeR(VB?WbhYK9w0S&O@-=xpB$+_7kC3Fw2m{x5PUz{d^*(He$=h zZcgN5ZZ+HuaEs9$sB_B-XfCFeB(#~P?|dxBJ2$Q|!Nf))ZBL6Gp-s?zLwYwf>kHG= zK{oIA)1AjR`ecjlSDN|HD&67b{9+`FRQPmV&k4?B)k-ID_u6}BnYJtEQOoC}1SC(j zm(cM{iPtdkLCaZw$#aGWnQY|Sc3wZ-Kv07fD+(PGj6&PXscr&VjPwu}4~)8|h@laDA9 zAxZ>O@_g$H(2aa&80L)lP`KR~Gc4HoL~GMcCB#b<`6jKmq6!Z$niGi#QdR5;;KHh_ zO(OYH6Rufe!E|*peC9rOTOM2@1tWFvkp1WWFg)HFm0twm54Al@LvxAyREoP1n~^*B zz%#$R_c-$5Q(AED-z5)@GVHOrm#z<%%fGTMeszDPw(OE0fq(Jxoko#$pM9#D2yzs1 z)CTq6FZ9{$f-8B|e}>Z_SE~|}9GhtuBgJ6yL)WwtR{gW-rR8qX`GPxBE8Qn27&uNd z@|kTHjJNBb(u8b^&fy7iHcq2t-txSdP2UE3s1;lY3qYwmEMN@8j29e?J&El_%);^& zL{k&!QbtIX(hRa?Z&mCHL>ir|!sbYyW>axbxvY)7UXQ#;*G9@7yZ-_hatETB&iq{e zB-bvqDw_{?D*pDPK^SYa(i1II(-A38WYy}K7qCRO5ZcddY2%?KAwY+;L7G8dNx7r> zz!MdhM>>1A8xHd4S81z6woMC#IGAQ$agPMJ!)FMKiu~yURVRlP4n^Qo%;3rt&h6Bx z?BR^>V0ayFT580;((hR&tN1-jhMH#u`{ft0MYDyG8E=R|=ZcS!UaO78%sVMP5jzrf zBuVGypLN-Zq(rNO_P~>Qq0Xtm6Qj|IT6!E&*jTE2YK z|EIs*<-d-w_4N=ZnCwZg651@ex1VN&wqE*yDx$g$N#)YiI&^ThkY7=-(D`H1P^+Hj z9**)fvO+^Qh_N=iE2+wNq&z)CV}~pWXQbAJR_)4cTYGKpm}A+%{0WrR0&90184Qu! z*s?TipMer1)>9sKp4_9LqzkyZv+}RkZB>hm8_e!xLQfB>?P!KJeVOX~FxHCTgH2TC zCJ!|Z9XHcMmjBZA?$D1#Je8plk|^0PU@!gT>0n*c5r`kEEVuXU4|#Rna6t4ZheQF= z6<~UhIVSLJ=yTb#ovdKpTT-&QZ%GBLdoS!bEXk-s$t=1qm7Z+i(wUt4 zzH?* z+|qPPU8aE^tl!cB?-)%N01nGX1@HwRuq=pBmJ6=0X50!prmK4irG^Xqg;t)|b67hY z4bt-gAU>(kt3k4T?^#@fleDv}f>+>Kb}wFKd1qn67;DW>-of5MXK{bdw#?#00#>d* zww9H;OAGcdzUlJ4;y%@f!aPnzxBA!8*}1P01Ivw5=5E`58b<7}?;d$O>6PY>Z+yED z3v2wa6rVLx*#6@PImpUcvPYlKg41q|Pqv47?`q+)xU9m4QU@%-qZFN^_ z95)m3<-FQh-ot;h?g{3NId(qzUB}f5165D|)AWMcb21?RXPO*jzXcBxtdxD+ZxgP; zOCu!cPvmLy=~7xsNq-5NG6PTEH8{2Rt2fp1FXUevfzjx3ch~1PVvGV&QXULfgi?zG zo0?=li;<({R9Uf)ZZ*C9!IDgWMwA#pesCfHFU3-@?gR_B;c?TXc{&@HSE!}JpMVl4 zM)!pJt{=^Rn2}2=2=+tMtB?h`x$rbib%8Vuehymn{Kx$;Mb#-&>N^8I`2}}Y(>|}7 z-q3viL5bK$Iwk4tY|m|ttf(roaU^h#uVUi?2~l)zsGl6pf>=8{HHl-^@-j+Ab3(0B zL*ZM_=EN;JYa!+|RXeB^j(Kw|T<7hXnwblrEc<>0G-2VT{)E@OLW`z2DWBg!E8n1>HeBjmT(SMhzGN4^QuQ&X++CnrM4@e^%yi}Q zHJkE0GAGV7M+bIR@H&9Rw|CvPw3f&hU2rOJ`0*CGA1~s}exq&>Q7Pzxo;GhjSmre( z^aWfT4TYCedp_8PPF%LV+uE#)7vgE@1C~Ngg91~d?IR@|#@qK=j6F)bGz_lfi4SMw zknuZ=YS&{L%U7YEJ{3>ykVk-{>rI*l;?XIE=quooTJOfHc|e!z!vYLjJR{DTp?|&U zsbins7wx6ygHofJ@Roz(MzLbyBjO5-wu3NS9yIBuN+ri8Zae}l|BN%(S2FZ(tFTm5 ze|bkn#co?XP>YK?|m7yPjv%Wp_TcH2IE> z0WL=(yJ&A;X-CCSsfKO77T8PG67&PLvY^1zUebMtqsuN|s6^nj?@<76E*}9qoy+(g zyMpY&k9d*Ndv2dsg`U(%s^)$9pcI>7MdQhPnUxV$QNaWmL3+uRv^qnV8-lS$PV5kI zGI8uF)*|*=fEqMZ^eHXpym}v||Jhz1$u6JZbR$}0Q%`FYZC?-iF}G7ay${mz?le5c za=!D4R&1hOEc=4)5Bkx8;OkHM=@7q#nNB%0B)yJU{U=_Jc`YGYbP4rVC?K)}iQxCEM=OkRV ztJ}!tCRqG+*Sb0^r`p6*&J*A-;4!B`3m2a8X{{4mlCaz6>6|t}d-xa<+~kn3T22vd z<(lg^R43#7Q(Q`(w75Vyq;W;sza}F&_|uV*RWwph(p>t*4Z?0Fw|yRtlM*#Yx|Cni zy@;3_9>50&aeNYNJ=i%R>u52PH6SfmD}tX`s8fU3O2dszWheq=sKz6%Mr|GdX%1TM z8kC;+c8mUpzJ8}F@)0DFf>vvLH&>W*a-V8NzH6TT zA$ff!XRuSq;?p|qt69EBxznscwV9J2lz(m3e~Rpf=_gO_-q6h+kL|dwU8zgtv zE{FxAqzq*cXi_+fC`h!k>Cqsa?JKQ@2uX(>Eh<_fo`f+sSott3iv>vY1xSyD`j*&Y z7fZT%!Z@&?n_(U$qS&@0m+IuKu4~M%cJ6N5JPhZC4h9SPKM>7H=bzNGEVw?mI*xlQ zLbtv(?YCQUl|Yv@kB`o0zIP{jB}3w4WwqzTg2p@Fy^6tF+c3v>4{t1t%qU-IAK4Yq zT+W%l?*%!($mO3?I^PR7ab*3tbL|FQpzAex^=Qa+<)?&*qg5({)7jf=U7y&M3v176 zzk``->$IjcQ4ad&<%Q^*<%VQ`EEhuQxqE+-I&;Z!sS(knn$#OFFA=I4`2~*`_Ut+S zEbXJxqj1Br;ZVUAvA{Sf7H2qyz1wLxcutcka3tK&aAIi-4)N_y-c#PH<}PPNmR+QE zqD4<>mvI)^>Ic{ec(3;DX%YyvXk-P<0oQGTB z%Y%S5;f$zx%aDn*(xQ!l)!e3ez~GH5<5#CWwQ60}`O(0Qd})Gt2gM z1CV%SxDANBstgAo){#K)|F5r&3#~(G=eCJym}9DKc5!Pl*)g}c-YGF{B|NIlWn)!+ z>}8HV_b56lt<4-!Fdo7Q@c?+$J@FAz(6vIaz9mKgq&-<0bkIYkWTg2^lwkuB#~vAQ zv6i`h8;46kd)#iRlhBcLQaHC%G&UtSW!vftT?>(_Do5Ql)v7YiR*E4xyWTBQGpd*C zZFVM*Wv?J-cki6Ec~O^6f`>B4Om?vpBC_s&Mi9;{^75Kj4!AYQ6kyKv)TA{rlU!O< zK5JC743n^&ewy5iu*pyZjwTn9dyDs$W>m2jP1j};F?e{H&_c~0cFOMC1%vDU%Qtnw zF;1Lx4P5mylqZk`>=Cj>W*tUxhT4sl1awG!O3`zRRfmLR?(7f;q75JO>FT-dg zrG276h7m-b9g>wVJ)Aea*)imQWsPxH_i(;#jpa6O9nyT);;yLlF81k>xU3>ub%@L% z;>vfVvBYo9E?yb~scO)Sa)JlR@;VI~ux;UmO6sNG4uF+yB;SD*ZVxOov*q;}to2@y zeVhP*V*OxR%@x4z6q|ljbIf*> z^VJT6V{96e9MV_N5B!p(xulpa!Z;^)cH5N&HPS@?=*5hUfpAxxv_2U@Bh-)sBaFp6=MHBdEN3>zS)+G zynwyaDc&3xQSe`m=a~MKSa$;WkGsO0x4x8pv?Or#8#G}=7Dk}%{QWNSeDc>X2P?7Z z{_f*{`}P03=Ix)Yy#R6vY;Pv7eZPFMu*YqBg@b<49c~4%0r4uorEYdzUxE5hj}+M- z!w7pO=va#)iq8lxI&WMPun{P^CceJ7Po)*sU%%P0o@MvJW2B&`K!MXr@1Uw)oHQ9x zz06$}j^C+|-i*DtZ6wqMZ~}l&wNI5F^Q*${p$nXXzWKX{_do3qf3}kUAD?&BKrUyd zQ1@!g!yT;MyNSk?UT@V`_~&KPO@=?krx}sIKTYkB#>YE0eU0~vQoB*6WRZtw>csQL z=&RHRoB~#9BgB9Mp7IO%okmUb=12HY)nbt4U6? zc?{l~AqsmJ_b91I7&-xc@Kf^pdU7<^vD1(d&+ZoT@Rge2OQC_&be| zNKgg#0bp+*3*X_MAW;t)XGtEo2ig?ffqNi-8NZ1CK%)1%ake)8KGV{nV_~7Kb>ORG zp;3#;Mbbp=#W%;oZzIV=$AZOVo2N5yED)LaWZdBSo4z>LkMs-w+`aK+McUrDoe|TGO$8mMLZ_VK?&0)PxmE8@x}KETbbgDCN<_VAIwc6%fMXz#jZwlGhx#p)=frp* zFFX9?C@8`Jz`39qKqcjRUq`PXP6pYEXP#BGyWN0Jtq#l%_hxy}cNan8@6kN8xN@hf zJ|t1MyBf}F?XRRYe2uLm2`xu}K;t=@i7gm|hjim_s(?lCQD_(K#mWaA zY@MIlb?W-ETiq{}OfMGfo%MV4^Gfv{`Ju6&H#GCc5T4qdPS7bjCkwpfHLR^bv;?iR zH$CSp-GKh)&gigE%T4wYZ>gC*tJVfC1=FTm7TA*mYn);z(qK}xQ+^R8D_$>bI5P9E%vE)X)eE9Syj2MpZ^HW zBjfm*-T}G5ZJyT3vltSDjP3rl8Nmzg)F2}tNF|Fq^U$<}`18xKv|csd3rD5Lu%ZF7 zVf`DMNnoPLWyH$*@YVt@2`!<+#d9&n>0@@{hv)!itlx|)YRcnwWnaPSWvyIefjOJz zg(fUJb1Y8|xiv+J806FJJQjj_fJyx_MvRj(bQJF_L@b~-+Pj`qHRfSS!J{j_E(@C| zl?7%0=A~4OA1e`sUWgb|oK#s<40N7G+Sqnrn|qwPjeO}+XUWyA3_H)OC2*1mMn#>; z9-eTM%`an5E^4H`!Nde&A@58U;g<7`Pg$jW7JmejeL0)1c65l6Y!3FJ(reF*%j4mO zWJx$PpqSSS;&8ZR6oZRyK#{{hfbGj)xctrj^&E8%SRRWCIBffNY@gV9aB|{Pp|-?}KcJj5QF*D0Y|) zk)POB@l5gLw`>RxNnhurOuCmEzhy%#!?v982iXve2G$HLuf$%COkPRYI7lZ1$kBop zf|Kai#`7?p5MBG!vWLv=CXY9VMa=j^R-6e_`NAmAOwf_RG{B zxm-4}O&a?05;Q$$pruf!WA(V&Nt*|EU3mlB=~DAP=|zdZB?hQvb?&7eH`Y}kGf9b# zOdjGn!aaaLqG9gK&eV3NGy>8sSdtYPWICaz_}_+)XvTx#qX_=1{b>kuXn&%ZgZ}W1 z`A>ZFr^{LX{^Y;w?Y%wKKX`U6oi}MV*N%zxvo4No5gnHMMQ;iD&{QYvw3G>7l1^X0 zF>7$rXYz*;^59quNjAY*3V;nAoX6%61Rc*Wr?KM!UUe-hDsnm@7{SFg9*p3?fMx<3 zft@cg<_5MG92V)b-8>ZjrL&TM2X{9^ust4D8#jq9WD-U~yGo4h^Wj9j#d*hIiJigM zIUmzf-e!DM00eEsI4_dH6S66WmlE&L?1H2DF2pYmgtm~BoODNmuW8iI)TyfQr_o`p zwh(GI9{0}?WlMZ&M=^_Ju6kzEuf{M472zy2E#TOO-{r9R8^Czo&_%I_l+$a<%QcUwHbo zyp`}ykdag-4w3k}hpk#Y67!;CE&X1j#z=6WdR(aH(nd#7hcSzXZlle@!%;rsnNU4_#k<;gRNzLcq9Z zO5nUtT|gLUAkH7;&ZQsVs2UD)=YGRc@qNvmqx*)V`kFg;fTKFhodY;3U5l3uPoh(D zyuZ}@8K#yRT98yY-q#(}l7Qe_9@yK1*ic|~F<2vUfCN~u^ayHAa3BG8Va0!uiKis= za7^^CG_i}T*81Yr>KV<`E}PejSqpW3P1T>&X91-YTk+yJq4U~)iL#fuggxl>oD1>` z@qmnA;$%sTV=o&DXRg&FOGYbrax?236nxZDgQ{77Zfd~u?GJ!*x)#kCrFV?iXjK24 z^g$a@dgsC!;R}(k$-|8N%k_z!&Jxksdwlec`3r^1Sc3;gJC1wF$siUwPHFmVz=AZp zy{i?2L}KlGvCsO^T#e?SjAB_&<1pJr^5PiwRNYFxGTsIo4A@M5X3=1HI*(+#{QW_0 zBgKUC$1mZZefQ5!!nad1de%mBtE|omq6g+(2cJq{`3%`(jjEk}Okz2- z8CCT*9SD*pn}skGC)hUuIX*!$dD+r2gAam?5wbLl+9pe+xdz(m3)mK|y)gD=@AD0E zBj+pO{=)pmvNLtsPL}pXB$1!u$rxev-K9@G#wzgd*`3Yn_=hEZ`P}dHWkB+rEb&q@ z?~+FGQXGBa?%jC=VY)awIXojIFA#!E4@QB};Z_Tge_HCU^s#ZRN|uW}HJ&(XKbo$+ zqn~W&m%J76kU$OBxVokUuHD3sSP^?KenG*Fz3>^GHzvIiSSge0#z7qI$rQ)Ap)JQb z|CV#5?wK6jb|k)elr^-vo2SWkLNrTyRNy%6e2Zk~H-qcl&X*^X0 zBn>1s{2AEv+LrNVL2TR(E|fGT$&%fn1A!S7R3B>h_V<~3~M!t z6-v2Ct;i#t*!nk|-`}2|zZm)R?KnqduM@AA%!oh(0~3pw{1k=Q^jiv=I&5hMQdKn? zt+(%Fj`1!j)}?AS@Ok=J_gH6#R$bD^N*d;kzIJL}8V<6O&_(c#mX`USGj>=lVXWi< ziQ0!`0SVF=$O{Ezfgu3fV^%pn`18xEOLDIUyvuC{_+i{fC0tmue&tH08SxTf?wk70Zu_e7k-o2dQW!o zL9L)(Z)+Hv2sh-N7@U7ScZR6W@O-vvW);z`f z8f69gcM{vakw z7Erle#$JM5dg&$CD;xITefHm{g52Mys@T57p@u-x$7E z=vU)?ulpg_HI1z*6?1y?+MJH9C!4z}7G9W#Tu32sJ&k9vE#blpe0MP?-`{JD^F z>}+>xu6j#PkH@3)m!H>WzH_@NrLnC!mq_T*2|nIFA9kO-wKV#I zq9^5m6iL^y(xWU>Ls1P1SMM*)i@!JA;G~)+~22Ct(20)PV#BAEMwdCS~s8qa@7PF#r_?Kw)OsK9zDl zYUjWHLF-9(uQRYi!osV4!ocm3hn>>LQm4)bxmnW;mpVVm#Sl3&xr~UD-Iq7?{il@^ za`6oeDYDY1ndMGU8?HaFoX;l*JD2m~UnG1AN>5E7s;H>3T4_*kgQTPKd8ZK~N_4rn zG^|_EQ-i0dP)m>}6rjvUiQ@r2@BL;T+hEpW`{g5w63?E`&KP8^j$2*s$srkTelY9! za^r_M-rY2Jo#9!2{1a>UhFptXpXGv1IVa4jNBDa_qCYaeZDU();d4*?VrF-(8Dyq7 z;@8yO``iU53(R^fUH0T!ePpE4eXQ5)KQ-MDf{$PJzxT`U4@vX&h#&vN0nt+3;hmCx z#1bNMt^B3y+0+g%g_c%<6))kWj?E0uVqW!QmUr*D-t{Qfv?|&%m0-?GztVDXWI=CX zVF4<>?m&=sXa8BcdQ`*bzGP_(1PnVhn3Y8_!m8#0ynQ5Q0&(1a28|R%d)l-ri=hnd z3I6^f!!Fw<@BhK=0wq~*s$ucQ+ji4e3L|ZW_NkKFc`dE3o_Q#>G(O4RKFJnln@Q)a zG5U(ocEKx5F8y*stl4ukNklJQ>&=U(_+T`rPxC@7CMM#0cSp1JAkN}_s;jV2aji4a zYEmE@9TE#758OcQKG+%Q3Wc#>aedt6aoblPA`Po%w#Rp^`Q+W?|9!WD{noFvuKg!= zEGWCI1YCB_s!4ymuY2}|-YWOwr4F_O-u8FWOgymsvI6QciF(b&auTgF$gnFn7?^Bs;F6?mn46d#BH#$Uo5k%O%Lqi2iUJD3Z11P^8ZvGk)h6jeaW)VI%4RbeH zVX_r$FS?^6X@TLJ(~&dd`2o9fv-BU{KdKWEnR*#9Q~KJ$#_7b4R~=ZNQGs0bSAdzA z-aZ+_Vuf;E*_>3}bbf=4j*kgTU^nz!8jhCJ?D}o<3XM#`f@SJD50Irtv!Tq^@??`) z!OA>*=Ev8r?n_T+?q?Wh-JOhk)Hj!q)^1&Va?1CJvR}8>`{t3fv0+X1+aqJIjgHvi zB(7*aq8DU#}j!*>L!Wa1F+N5{%r3& zDi+^8ceyK-VKp&fH5NLsrsIo}P-YP)2*N9=5dpF>P!ymjKv96A07U_c0u%)( z3Q!cFC_qtwq5wq!iUJe`C<;&%peR65fT93J0g3_?1t> aP!ymjKv96A07U_c0u%-Qw<)mS{eJ-a*w+F8 literal 0 HcmV?d00001 diff --git a/docs/source/_static/my_package.svg b/docs/source/_static/my_package.svg new file mode 100644 index 0000000..1e02cbe --- /dev/null +++ b/docs/source/_static/my_package.svg @@ -0,0 +1 @@ +mypackagelogo svg1224 x 1223 \ No newline at end of file diff --git a/docs/source/_templates/custom-class.rst b/docs/source/_templates/custom-class.rst new file mode 100644 index 0000000..a58baba --- /dev/null +++ b/docs/source/_templates/custom-class.rst @@ -0,0 +1,30 @@ +{{ name | escape | underline}} + +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} + :members: + :show-inheritance: + + + {% block methods %} + .. automethod:: __init__ + {% if methods %} + .. rubric:: {{ _('Methods') }} + .. autosummary:: + {% for item in methods %} + ~{{ name }}.{{ item }} + {%- endfor %} + {% endif %} + {% endblock %} + + + {% block attributes %} + {% if attributes %} + .. rubric:: {{ _('Attributes') }} + .. autosummary:: + {% for item in attributes %} + ~{{ name }}.{{ item }} + {%- endfor %} + {% endif %} + {% endblock %} diff --git a/docs/source/_templates/custom-module.rst b/docs/source/_templates/custom-module.rst new file mode 100644 index 0000000..1640853 --- /dev/null +++ b/docs/source/_templates/custom-module.rst @@ -0,0 +1,67 @@ +{{ fullname | escape | underline}} + +.. automodule:: {{ fullname }} + :members: + {%- if classes %} + :exclude-members: {% for item in classes %}{{ item }}{{','}}{%- endfor %} + {% endif %} + + + {% block attributes %} + {%- if attributes %} + .. rubric:: {{ _('Module Attributes') }} + .. autosummary:: + {% for item in attributes %} + {{ item }} + {%- endfor %} + {% endif %} + {%- endblock %} + + + {%- block functions %} + {%- if functions %} + .. rubric:: {{ _('Functions') }} + .. autosummary:: + {% for item in functions %} + {{ item }} + {%- endfor %} + {% endif %} + {%- endblock %} + + + {%- block classes %} + {%- if classes %} + .. rubric:: {{ _('Classes') }} + .. autosummary:: + :toctree: + :template: custom-class.rst + {% for item in classes %} + {{ item }} + {%- endfor %} + {% endif %} + {%- endblock %} + + + {%- block exceptions %} + {%- if exceptions %} + .. rubric:: {{ _('Exceptions') }} + .. autosummary:: + {% for item in exceptions %} + {{ item }} + {%- endfor %} + {% endif %} + {%- endblock %} + + +{%- block modules %} +{%- if modules %} +.. rubric:: Modules +.. autosummary:: + :toctree: + :template: custom-module.rst + :recursive: +{% for item in modules %} + {{ item }} +{%- endfor %} +{% endif %} +{%- endblock %} diff --git a/docs/source/cli.__main__.rst b/docs/source/cli.__main__.rst new file mode 100644 index 0000000..446b831 --- /dev/null +++ b/docs/source/cli.__main__.rst @@ -0,0 +1,3 @@ +.. sphinx_argparse_cli:: + :module: trafficgen.cli.__main__ + :func: _argparser diff --git a/docs/source/cli.rst b/docs/source/cli.rst new file mode 100644 index 0000000..77a0a33 --- /dev/null +++ b/docs/source/cli.rst @@ -0,0 +1,7 @@ +CLI Documentation +================= + +.. toctree:: + :maxdepth: 3 + + cli.__main__ diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..ce1d8ef --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,85 @@ +# ruff: noqa +# mypy: ignore-errors + +# Configuration file for the Sphinx documentation builder. +# +# For the full list of built-in configuration values, see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import sys +from pathlib import Path + +sys.path.insert(0, str(Path("../../src").absolute())) + + +# -- Project information ----------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information + +project = "my-package" +copyright = "2024, DNV AS. All rights reserved." +author = "Author One, Author Two, Author Three" + +# The full version, including alpha/beta/rc tags +release = "0.1.0" + +# -- General configuration --------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration + +extensions = [ + "myst_parser", + "sphinx.ext.autodoc", + "sphinx.ext.napoleon", + "sphinx_argparse_cli", + "sphinx.ext.mathjax", + "sphinx.ext.autosummary", + "sphinx.ext.todo", + "sphinxcontrib.mermaid", +] + +# Extenstion for myst_parser +myst_enable_extensions = [ + "dollarmath", + "attrs_inline", +] + +# The file extensions of source files. +source_suffix = { + ".rst": "restructuredtext", + ".md": "markdown", +} + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- +# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output + +html_title = f"my-package {release}" +html_theme = "furo" +html_static_path = ["_static"] +html_logo = "_static/my_package.svg" +autodoc_default_options = { + "member-order": "groupwise", + "undoc-members": True, + "exclude-members": "__weakref__", +} +autodoc_preserve_defaults = True + +myst_heading_anchors = 3 + +todo_include_todos = False + +# add markdown mermaid support +myst_fence_as_directive = ["mermaid"] diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..b70c128 --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,26 @@ +.. my-package documentation master file, created by + sphinx-quickstart on Wed Jul 6 21:16:21 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +my-package Documentation +======================== + +.. toctree:: + :maxdepth: 4 + :caption: Contents: + + README + api + cli + CHANGELOG + STYLEGUIDE + LICENSE + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/source/my_package.rst b/docs/source/my_package.rst new file mode 100644 index 0000000..e1e72de --- /dev/null +++ b/docs/source/my_package.rst @@ -0,0 +1,25 @@ +my-package package +================== + +Subpackages +----------- + +.. autosummary:: + :toctree: _autosummary + :template: custom-module.rst + :recursive: + + my_package.subpackage1 + my_package.subpackage2 + my_package.utils + + +Modules +------- + +.. autosummary:: + :toctree: _autosummary + :template: custom-module.rst + :recursive: + + my_package.api diff --git a/docs/trafficgen.check_land_crossing.rst b/docs/trafficgen.check_land_crossing.rst deleted file mode 100644 index 19ca198..0000000 --- a/docs/trafficgen.check_land_crossing.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.check\_land\_crossing module -======================================= - -.. automodule:: trafficgen.check_land_crossing - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.cli.rst b/docs/trafficgen.cli.rst deleted file mode 100644 index 27bb6be..0000000 --- a/docs/trafficgen.cli.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.cli module -===================== - -.. automodule:: trafficgen.cli - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.encounter.rst b/docs/trafficgen.encounter.rst deleted file mode 100644 index adfccef..0000000 --- a/docs/trafficgen.encounter.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.encounter module -=========================== - -.. automodule:: trafficgen.encounter - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.marine_system_simulator.rst b/docs/trafficgen.marine_system_simulator.rst deleted file mode 100644 index 3b9290d..0000000 --- a/docs/trafficgen.marine_system_simulator.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.marine\_system\_simulator module -=========================================== - -.. automodule:: trafficgen.marine_system_simulator - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.plot_traffic_situation.rst b/docs/trafficgen.plot_traffic_situation.rst deleted file mode 100644 index 39206b2..0000000 --- a/docs/trafficgen.plot_traffic_situation.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.plot\_traffic\_situation module -========================================== - -.. automodule:: trafficgen.plot_traffic_situation - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.read_files.rst b/docs/trafficgen.read_files.rst deleted file mode 100644 index 4409f70..0000000 --- a/docs/trafficgen.read_files.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.read\_files module -============================= - -.. automodule:: trafficgen.read_files - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.rst b/docs/trafficgen.rst deleted file mode 100644 index 1530ec7..0000000 --- a/docs/trafficgen.rst +++ /dev/null @@ -1,24 +0,0 @@ -trafficgen package -================== - -.. automodule:: trafficgen - :members: - :undoc-members: - :show-inheritance: - -Submodules ----------- - -.. toctree:: - :maxdepth: 4 - - trafficgen.check_land_crossing - trafficgen.cli - trafficgen.encounter - trafficgen.marine_system_simulator - trafficgen.plot_traffic_situation - trafficgen.read_files - trafficgen.ship_traffic_generator - trafficgen.types - trafficgen.utils - trafficgen.write_traffic_situation_to_file diff --git a/docs/trafficgen.ship_traffic_generator.rst b/docs/trafficgen.ship_traffic_generator.rst deleted file mode 100644 index acca72c..0000000 --- a/docs/trafficgen.ship_traffic_generator.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.ship\_traffic\_generator module -========================================== - -.. automodule:: trafficgen.ship_traffic_generator - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.types.rst b/docs/trafficgen.types.rst deleted file mode 100644 index e736371..0000000 --- a/docs/trafficgen.types.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.types module -======================= - -.. automodule:: trafficgen.types - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.utils.rst b/docs/trafficgen.utils.rst deleted file mode 100644 index 6335e60..0000000 --- a/docs/trafficgen.utils.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.utils module -======================= - -.. automodule:: trafficgen.utils - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/trafficgen.write_traffic_situation_to_file.rst b/docs/trafficgen.write_traffic_situation_to_file.rst deleted file mode 100644 index e70ec29..0000000 --- a/docs/trafficgen.write_traffic_situation_to_file.rst +++ /dev/null @@ -1,7 +0,0 @@ -trafficgen.write\_traffic\_situation\_to\_file module -===================================================== - -.. automodule:: trafficgen.write_traffic_situation_to_file - :members: - :undoc-members: - :show-inheritance: diff --git a/pyproject.toml b/pyproject.toml index 68511c8..5afc45d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,135 +1,145 @@ -[tool.poetry] +[build-system] +requires = [ + "hatchling", +] +build-backend = "hatchling.build" + +[tool.hatch.build.targets.sdist] +only-include = [ + "src/my_package", + "tests", + ".coveragerc", + ".editorconfig", + ".pre-commit-config.yaml", + "manage.py", + "pyproject.toml", + "pytest.ini", + "ruff.toml", + "uv.lock", +] + +[tool.hatch.build.targets.wheel] +packages = [ + "src/trafficgen", +] + +[project] name = "trafficgen" -version = "0.7.0" +version = "0.6.0" description = "Automatic generation of ship traffic situations from a set of predefined situations" -authors = ["Tom Arne Pedersen "] -license = "MIT License" readme = "README.md" +requires-python = ">= 3.10" +license = { file = "LICENSE" } +authors = [ + { name = "Tom Arne Pedersen", email = "Tom.Arne.Pedersen@dnv.com" }, + { name = "Claas Rostock", email = "Claas.Rostock@dnv.com" }, + { name = "Minos Hemrich", email = "Minos.Hemrich@dnv.com" }, +] +testers = [ + { name = "Grunde Løvoll", email = "Grunde.Lovoll@dnv.com" }, + { name = "Stephanie Kemna", email = "Stephanie.Kemna@dnv.com" }, +] +keywords = [ + "traffic generator", + "simulation", + "testing", +] +classifiers = [ + "Development Status :: 3 - Alpha", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Operating System :: Microsoft :: Windows", + "Operating System :: POSIX :: Linux", + # "Operating System :: MacOS", + "Environment :: Console", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering", + "Topic :: Software Development :: Libraries :: Python Modules", +] +dependencies = [ + "dictIO>=0.4.0", + "numpy>=1.25,<2.0", + "matplotlib>=3.7.2", + "basemap>=1.3.8", + "basemap-data-hires>=1.3.2", + "global-land-mask>=1.0.0", + "folium>=0.14.0", +] -[tool.poetry.dependencies] -python = ">=3.9, <3.13" -click = "^8.1" -click-log = "^0.4.0" -numpy = "^1.25.2" -matplotlib = "^3.7.2" -basemap = "^1.3.8" -basemap-data-hires = "^1.3.2" -global-land-mask = "^1.0.0" -folium = "^0.14.0" -pydantic = "^2.5" - - -[tool.poetry.group.dev] -optional = true - -[tool.poetry.group.dev.dependencies] -black = { version = "^23.12", extras = ["jupyter"] } -ruff = "^0.1.8" # linter -pyright = "^1.1.338" -tox = "^4.11.1" -pytest = "^7.4.1" -pytest-cov = "^4.1" -sourcery = "^1.14" - -[tool.poetry.group.docs] -optional = true - -[tool.poetry.group.docs.dependencies] -sphinx = "^7.2.5" -sphinx-rtd-theme = "^1.3.0" +[project.optional-dependencies] + + +[project.urls] +Homepage = "https://github.com/dnv-opensource/ship-traffic-generator" +# Documentation = "https://dnv-innersource.github.io/my-package/README.html" +Repository = "https://github.com/dnv-opensource/ship-traffic-generator.git" +Issues = "https://github.com/dnv-opensource/ship-traffic-generator/issues" +Changelog = "https://github.com/dnv-innersource/ship-traffic-generator/blob/main/CHANGELOG.md" + +[dependency-groups] +dev = [ + "pytest>=8.3", + "pytest-cov>=6.0", + "ruff>=0.8.3", + "pyright>=1.1.390", + "mypy>=1.13", + "sourcery>=1.27", + "pre-commit>=4.0", + "Sphinx>=8.1", + "sphinx-argparse-cli>=1.19", + "sphinx-autodoc-typehints>=2.5", + "sphinxcontrib-mermaid>=1.0.0", + "myst-parser>=4.0", + "furo>=2024.8", + "jupyter>=1.1", + "pandas-stubs>=2.2", + "pydantic>=2.5", + "click>=8.1", + "click-log>=0.4.0", +] -# Add command line interface here like: -[tool.poetry.scripts] +[project.scripts] trafficgen = "trafficgen.cli:main" -[build-system] -requires = ["poetry-core"] -build-backend = "poetry.core.masonry.api" - -[tool.pytest.ini_options] -testpaths = "tests" -addopts = "--strict-markers" -xfail_strict = true - -[tool.black] -line-length = 105 -target-version = ["py39", "py310", "py311", "py312"] - -[tool.ruff] -exclude = [ - ".git", - ".venv", - ".tox", - "build", - "dist", - "__pycache__", - "./docs/conf.py", +[tool.mypy] +plugins = [ + "numpy.typing.mypy_plugin", ] -src = ["src"] -ignore = [ - "E501", # Line length too long - # "D100", # Missing docstring in public module - # "D101", # Missing docstring in public class - # "D102", # Missing docstring in public method - # "D103", # Missing docstring in public function - # "D104", # Missing docstring in public package - "D105", # Missing docstring in magic method - "D107", # Missing docstring in __init__ - "D202", # No blank lines allowed after function docstring - "D203", # 1 blank line required before class docstring - "D205", # 1 blank line required between summary line and description - "D212", # Multi-line docstring summary should start at the first line - "D213", # Multi-line docstring summary should start at the second line - # "N802", # Function name should be lowercase (uncomment if you want to allow Uppercase function names) - # "N803", # Argument name should be lowercase (uncomment if you want to allow Uppercase argument names) - "N806", # Variable in function should be lowercase (uncomment if you want to allow Uppercase variable names in functions) - # "N815", # Variable in class scope should not be mixedCase (uncomment if you want to allow mixedCase variable names in class scope) - # "N816", # Variable in global scope should not be mixedCase (uncomment if you want to allow mixedCase variable names in global scope) - ] -line-length = 105 -select = [ - "E", - "D", - "F", - "N", - "W", - "I", - "B", +mypy_path = "stubs" +files = [ + "src", + "tests", + "data", ] -target-version = "py39" - -[tool.ruff.pep8-naming] -ignore-names = [ - "test_*", - "setUp", - "tearDown", +exclude = [ + "^src/folder_to_be_excluded/", +] +check_untyped_defs = true +disable_error_code = [ + "misc", + "import-untyped", ] -[tool.ruff.pydocstyle] -convention = "numpy" - -[tool.ruff.per-file-ignores] -"__init__.py" = ["I001"] -"./tests/*" = ["D"] [tool.pyright] +stubPath = "stubs" +include = [ + "src", + "tests", + "demos", +] exclude = [ - ".git", - ".venv", - ".tox", - "build", - "dist", - "**/__pycache__", - "./docs/conf.py", - "./venv", + "src/folder_to_be_excluded", ] -extraPaths = ["./src"] + typeCheckingMode = "basic" useLibraryCodeForTypes = true -# Activate the following rules step by step to (step by step..) improve code quality reportMissingParameterType = "error" reportUnknownParameterType = "warning" -reportUnknownMemberType = "warning" +reportUnknownMemberType = "warning" # consider to set to `false` if you work a lot with matplotlib and pandas, which are both not properly typed and known to trigger this warning reportMissingTypeArgument = "error" reportPropertyTypeMismatch = "error" reportFunctionMemberAccess = "warning" @@ -150,12 +160,13 @@ reportUnusedExpression = "warning" reportMatchNotExhaustive = "warning" reportShadowedImports = "warning" reportUntypedFunctionDecorator = "warning" +reportUntypedClassDecorator = "warning" reportUntypedBaseClass = "error" reportUntypedNamedTuple = "warning" - +reportUnnecessaryTypeIgnoreComment = "information" # Activate the following rules only locally and temporary, i.e. for a QA session. # (For server side CI they are considered too strict.) +# reportMissingTypeStubs = true # reportConstantRedefinition = "warning" -# reportUnnecessaryTypeIgnoreComment = "information" # reportImportCycles = "warning" # reportImplicitStringConcatenation = "warning" diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..c382b54 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,5 @@ +[pytest] +testpaths = + tests +addopts = --strict-markers --verbose --durations=10 +xfail_strict = True diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000..9e92dd8 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,153 @@ +exclude = [ + ".git", + ".venv", + "dist", + "*cache", + "**/__pycache__", + "src/folder_to_be_excluded", +] +src = [ + "src", +] +line-length = 120 +target-version = "py310" + +[lint] +# Settings for Ruff linter (invoked with `uv run ruff check`). +# Start by including _all_ Ruff lint rules, then ignore selected rules as needed +# https://docs.astral.sh/ruff/rules/ +select = [ + "ALL", +] +ignore = [ + # Ruff lint rules temporarily ignored, but which should be reactivated and resolved in the future. + + # Ruff lint rules considered as too strict and hence ignored + "FIX002", # Line contains TODO, consider resolving the issue + "TD003", # Missing issue link on the line following a TODO + "S101", # Use of assert detected + "RET504", # Unnecessary assignment to `result` before `return` statement + "EM101", # Exception must not use a string literal, assign to variable first + "EM102", # Exception must not use an f-string literal, assign to variable first + "TRY003", # Avoid specifying long messages outside the exception class + "PLR1711", # Useless `return` statement at end of function + "G00", # Logging statement uses string formatting ('G00' covers all rules flagging string formatting in logging, e.g. G001, G002, etc.) + "S311", # Standard pseudo-random generators are not suitable for cryptographic purposes + "PLW0603", # Using the global statement to update {name} is discouraged + "PYI041", # Use `float` instead of `int | float` + + # Ruff lint rules recommended to keep enabled, + # but which are typical candidates you might have a need to ignore, + # especially in the beginning or when refactoring an existing codebase, + # to avoid too many Ruff errors at once. + # -> Listed here for easy access and reference. + # (uncomment to ignore) + # "N803", # Argument name should be lowercase (NOTE: ignore to allow capital arguments (e.g X) in scientific code) + # "N806", # Variable in function should be lowercase (NOTE: ignore to allow capital variables (e.g X) in scientific code) + # "TC002", # Move third-party import into a type-checking block + # "TC003", # Move standard library import into a type-checking block + + # Ruff lint rules known to be in conflict with Ruff formatter. + # https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules + "W191", # Tab-indentation (in conflict with Ruff formatter) + "E111", # Indentation with invalid multiple (in conflict with Ruff formatter) + "E114", # Indentation with invalid multiple comment (in conflict with Ruff formatter) + "E117", # Over-indented (in conflict with Ruff formatter) + "D206", # Indent with spaces (in conflict with Ruff formatter) + "D300", # Triple single quotes (in conflict with Ruff formatter) + "Q000", # Bad quotes in inline string (in conflict with Ruff formatter) + "Q001", # Bad quotes in multi-line string (in conflict with Ruff formatter) + "Q002", # Bad quotes in DocString (in conflict with Ruff formatter) + "Q003", # Avoidable escaped quote (in conflict with Ruff formatter) + "COM812", # Missing trailing comma (in conflict with Ruff formatter) + "COM819", # Prohibited trailing comma (in conflict with Ruff formatter) + "ISC001", # Single-line implicit string concatenation (in conflict with Ruff formatter) + "ISC002", # Multi-line implicit string concatenation (in conflict with Ruff formatter) +] +# File patterns to be excluded from Ruff lint +# (only needed for file patterns not already listed in the common `exclude` setting +# at top of this file, i.e. list here _additional_ excludes specific to Ruff lint.) +exclude = [ +] +allowed-confusables = [ + "×", # used as dim multiplication sign in comments, such as `19×16×15×16×8×6×3 = 10,506,240 possible combinations of parameters`. +] + +[lint.pep8-naming] +ignore-names = [ + "test_*", +] + +[lint.pylint] +max-args = 7 + +[lint.flake8-pytest-style] +raises-require-match-for = [ + "BaseException", + "Exception", + "OSError", + "IOError", + "EnvironmentError", + "socket.error", +] + +[lint.per-file-ignores] +# `__init__.py` specific ignores +"__init__.py" = [ + "F401", # {name} imported but unused (NOTE: ignored as imports in `__init__.py` files are almost never used inside the module, but are intended for namespaces) + "I001", # Import block is un-sorted or un-formatted + "PLC0414", # Import alias does not rename original package +] +# `tests` specific ignores +"tests/**/*" = [ + "D", # Missing docstrings + "ERA001", # Found commented-out code + "PT006", # Wrong type passed to first argument of `@pytest.mark.parametrize` (NOTE: ignored to allow parameters args as "args_1,arg_2,arg_3,..." + "S101", # Use of assert detected + "PLR2004", # Magic value used in comparison + "ANN201", # Missing return type annotation for public function + "ANN202", # Missing return type annotation for private function + "ARG001", # Unused function argument: {name} + "ARG002", # Unused method argument: {name} + "INP001", # File is part of an implicit namespace package. Add an `__init__.py`. (NOTE: tests are not intended to be a module, __init__.py hence not required.) + "SLF001", # Private member accessed + "TRY004", # Prefer `TypeError` exception for invalid type +] +# `stubs` specific ignores +"stubs/**/*" = [ + "D", # Missing docstrings + "ERA001", # Found commented-out code + "SLF001", # Private member accessed + "F405", # {name} may be undefined, or defined from star imports: {module} + "F403", # from {name} import * used; unable to detect undefined names + "ANN", # Missing type annotation + "N", # Naming violations + "A001", # Variable {name} is shadowing a Python builtin + "A002", # Argument {name} is shadowing a Python builtin + "FBT001", # Boolean-typed positional argument in function definition + "PYI042", # Type alias {name} should be CamelCase + "PYI002", # complex if statement in stub + "PLR0913", # Too many arguments in function definition +] +# Jupyter notebook specific ignores +"**/*.ipynb" = [ + "D103", # Missing docstring in public function + "T201", # `print` found + "PGH003", # Use specific rule codes when ignoring type issues + "TCH002", # Move third-party import into a type-checking block +] +# `demos` specific ignores +"demos/**/*" = [ + "D", # Missing docstrings + "S101", # Use of assert detected + "PLR2004", # Magic value used in comparison + "INP001", # File is part of an implicit namespace package. Add an `__init__.py`. (NOTE: tutorials are not intended to be a module, __init__.py hence not required.) + "T201", # `print` found + "E402", # Module level import not at top of cell +] + +[lint.pydocstyle] +convention = "numpy" + +[format] +docstring-code-format = true diff --git a/src/trafficgen/check_land_crossing.py b/src/trafficgen/check_land_crossing.py index d0912fa..e9f84c0 100644 --- a/src/trafficgen/check_land_crossing.py +++ b/src/trafficgen/check_land_crossing.py @@ -27,7 +27,6 @@ def path_crosses_land( ------- is_on_land: True if parts of the path crosses land. """ - num_checks = 10 for i in range(int(time_interval / num_checks)): position_2 = calculate_position_at_certain_time( diff --git a/src/trafficgen/cli.py b/src/trafficgen/cli.py index ab53dec..f87250b 100644 --- a/src/trafficgen/cli.py +++ b/src/trafficgen/cli.py @@ -8,6 +8,7 @@ import logging import sys from pathlib import Path +from typing import TYPE_CHECKING import click import click_log @@ -15,9 +16,11 @@ from trafficgen.plot_traffic_situation import plot_specific_traffic_situation, plot_traffic_situations from trafficgen.read_files import read_encounter_settings_file from trafficgen.ship_traffic_generator import generate_traffic_situations -from trafficgen.types import EncounterSettings from trafficgen.write_traffic_situation_to_file import write_traffic_situations_to_json_file +if TYPE_CHECKING: + from trafficgen.types import EncounterSettings + logger = logging.getLogger(__name__) _ = click_log.basic_config(logger) @@ -124,7 +127,7 @@ def gen_situation( Example: \n trafficgen gen-situation -s ./data/example_situations_input -o ./data/test_output_1. - """ + """ # noqa: D205 click.echo("Generating traffic situations") generated_traffic_situations = generate_traffic_situations( situation_folder=Path(situations), @@ -149,13 +152,9 @@ def gen_situation( with contextlib.suppress(TypeError): if visualize_situation > 0: click.echo("Plotting a specific traffic situation") - plot_specific_traffic_situation( - generated_traffic_situations, visualize_situation, encounter_settings - ) + plot_specific_traffic_situation(generated_traffic_situations, visualize_situation, encounter_settings) else: - click.echo( - "Invalid traffic situation number specified, not creating map plot. See --help for more info." - ) + click.echo("Invalid traffic situation number specified, not creating map plot. See --help for more info.") if output is not None: click.echo("Writing traffic situations to files") write_traffic_situations_to_json_file(generated_traffic_situations, write_folder=Path(output)) diff --git a/src/trafficgen/encounter.py b/src/trafficgen/encounter.py index c4b85fd..53f9422 100644 --- a/src/trafficgen/encounter.py +++ b/src/trafficgen/encounter.py @@ -1,11 +1,12 @@ """ -Functions to generate encounters consisting of one own ship and one to many target ships. +Functions to generate encounters. + +The encounters consist of one own ship and one to many target ships. The generated encounters may be of type head-on, overtaking give-way and stand-on and crossing give-way and stand-on. """ import random -from typing import List, Optional, Tuple, Union import numpy as np @@ -36,13 +37,13 @@ def generate_encounter( desired_encounter_type: EncounterType, own_ship: OwnShip, - target_ships_static: List[ShipStatic], + target_ships_static: list[ShipStatic], encounter_number: int, - beta_default: Optional[Union[List[float], float]], - relative_sog_default: Optional[float], - vector_time_default: Optional[float], + beta_default: list[float] | float | None, + relative_sog_default: float | None, + vector_time_default: float | None, settings: EncounterSettings, -) -> Tuple[TargetShip, bool]: +) -> tuple[TargetShip, bool]: """ Generate an encounter. @@ -90,13 +91,13 @@ def generate_encounter( # resetting vector_time, beta and relative_sog to default values before # new search for situation is done - vector_time: Union[float, None] = vector_time_default + vector_time: float | None = vector_time_default if vector_time is None: vector_time = random.uniform(settings.vector_range[0], settings.vector_range[1]) if beta_default is None: beta: float = assign_beta(desired_encounter_type, settings) - elif isinstance(beta_default, List): + elif isinstance(beta_default, list): beta: float = assign_beta_from_list(beta_default) else: beta: float = beta_default @@ -211,14 +212,10 @@ def generate_encounter( settings.situation_length, ) - target_ship_waypoint1 = Waypoint( - position=future_position_target_ship, turn_radius=None, leg=None - ) + target_ship_waypoint1 = Waypoint(position=future_position_target_ship, turn_radius=None, leg=None) waypoints = [target_ship_waypoint0, target_ship_waypoint1] - target_ship = TargetShip( - static=target_ship_static, initial=target_ship_initial, waypoints=waypoints - ) + target_ship = TargetShip(static=target_ship_static, initial=target_ship_initial, waypoints=waypoints) else: # Since encounter is not found, using initial values from own ship. Will not be taken into use. target_ship = TargetShip(static=target_ship_static, initial=own_ship.initial, waypoints=None) @@ -237,7 +234,9 @@ def check_encounter_evolvement( settings: EncounterSettings, ) -> bool: """ - Check encounter evolvement. The generated encounter should be the same type of + Check encounter evolvement. + + The generated encounter should be the same type of encounter (head-on, crossing, give-way) also some time before the encounter is started. Params: @@ -253,7 +252,7 @@ def check_encounter_evolvement( theta13_criteria: float = settings.classification.theta13_criteria theta14_criteria: float = settings.classification.theta14_criteria theta15_criteria: float = settings.classification.theta15_criteria - theta15: List[float] = settings.classification.theta15 + theta15: list[float] = settings.classification.theta15 assert own_ship.initial is not None @@ -327,16 +326,16 @@ def define_own_ship( encounter_settings.situation_length, ) own_ship_waypoint1 = Waypoint(position=ship_position_future, turn_radius=None, leg=None) - own_ship_waypoints: List[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] + own_ship_waypoints: list[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] elif len(desired_traffic_situation.own_ship.waypoints) == 1: # If one waypoint is given, use initial position as first waypoint own_ship_waypoint0 = Waypoint( position=own_ship_initial.position.model_copy(deep=True), turn_radius=None, leg=None ) own_ship_waypoint1 = desired_traffic_situation.own_ship.waypoints[0] - own_ship_waypoints: List[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] + own_ship_waypoints: list[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] else: - own_ship_waypoints: List[Waypoint] = desired_traffic_situation.own_ship.waypoints + own_ship_waypoints: list[Waypoint] = desired_traffic_situation.own_ship.waypoints own_ship = OwnShip( static=own_ship_static, @@ -355,8 +354,9 @@ def calculate_min_vector_length_target_ship( lat_lon0: GeoPosition, ) -> float: """ - Calculate minimum vector length (target ship sog x vector). This will - ensure that ship sog is high enough to find proper situation. + Calculate minimum vector length (target ship sog x vector). + + This is done to ensure that ship sog is high enough to find proper situation. Params: * own_ship_position: Own ship initial position, latitudinal [rad] and longitudinal [rad] @@ -399,7 +399,7 @@ def find_start_position_target_ship( desired_beta: float, desired_encounter_type: EncounterType, settings: EncounterSettings, -) -> Tuple[GeoPosition, bool]: +) -> tuple[GeoPosition, bool]: """ Find start position of target ship using desired beta and vector length. @@ -420,7 +420,7 @@ def find_start_position_target_ship( theta13_criteria: float = settings.classification.theta13_criteria theta14_criteria: float = settings.classification.theta14_criteria theta15_criteria: float = settings.classification.theta15_criteria - theta15: List[float] = settings.classification.theta15 + theta15: list[float] = settings.classification.theta15 n_1, e_1, _ = llh2flat(own_ship_position.lat, own_ship_position.lon, lat_lon0.lat, lat_lon0.lon) n_2, e_2, _ = llh2flat( @@ -436,12 +436,7 @@ def find_start_position_target_ship( e_4: float = e_1 + np.sin(psi) b: float = ( - -2 * e_2 * e_4 - - 2 * n_2 * n_4 - + 2 * e_1 * e_2 - + 2 * n_1 * n_2 - + 2 * e_1 * (e_4 - e_1) - + 2 * n_1 * (n_4 - n_1) + -2 * e_2 * e_4 - 2 * n_2 * n_4 + 2 * e_1 * e_2 + 2 * n_1 * n_2 + 2 * e_1 * (e_4 - e_1) + 2 * n_1 * (n_4 - n_1) ) a: float = (e_4 - e_1) ** 2 + (n_4 - n_1) ** 2 c: float = e_2**2 + n_2**2 - 2 * e_1 * e_2 - 2 * n_1 * n_2 - v_r**2 + e_1**2 + n_1**2 @@ -519,9 +514,10 @@ def assign_future_position_to_target_ship( max_meeting_distance: float, ) -> GeoPosition: """ - Randomly assign future position of target ship. If drawing a circle with radius - max_meeting_distance around future position of own ship, future position of - target ship shall be somewhere inside this circle. + Randomly assign future position of target ship. + + If drawing a circle with radius max_meeting_distance around future position of own ship, + future position of target ship shall be somewhere inside this circle. Params: * own_ship_position_future: Dict, own ship position at a given time in the @@ -555,10 +551,12 @@ def determine_colreg( theta13_criteria: float, theta14_criteria: float, theta15_criteria: float, - theta15: List[float], + theta15: list[float], ) -> EncounterType: """ - Determine the colreg type based on alpha, relative bearing between target ship and own + Determine the colreg type. + + Colreg type is based on alpha, relative bearing between target ship and own ship seen from target ship, and beta, relative bearing between own ship and target ship seen from own ship. @@ -583,22 +581,13 @@ def determine_colreg( # Find appropriate rule set if (beta > theta15[0]) & (beta < theta15[1]) & (abs(alpha) - theta13_criteria <= 0.001): return EncounterType.OVERTAKING_STAND_ON - if ( - (alpha_2_pi > theta15[0]) - & (alpha_2_pi < theta15[1]) - & (abs(beta_pi) - theta13_criteria <= 0.001) - ): + if (alpha_2_pi > theta15[0]) & (alpha_2_pi < theta15[1]) & (abs(beta_pi) - theta13_criteria <= 0.001): return EncounterType.OVERTAKING_GIVE_WAY if (abs(beta_pi) - theta14_criteria <= 0.001) & (abs(alpha) - theta14_criteria <= 0.001): return EncounterType.HEAD_ON if (beta > 0) & (beta < theta15[0]) & (alpha > -theta15[0]) & (alpha - theta15_criteria <= 0.001): return EncounterType.CROSSING_GIVE_WAY - if ( - (alpha_2_pi > 0) - & (alpha_2_pi < theta15[0]) - & (beta_pi > -theta15[0]) - & (beta_pi - theta15_criteria <= 0.001) - ): + if (alpha_2_pi > 0) & (alpha_2_pi < theta15[0]) & (beta_pi > -theta15[0]) & (beta_pi - theta15_criteria <= 0.001): return EncounterType.CROSSING_STAND_ON return EncounterType.NO_RISK_COLLISION @@ -609,10 +598,9 @@ def calculate_relative_bearing( position_target_ship: GeoPosition, heading_target_ship: float, lat_lon0: GeoPosition, -) -> Tuple[float, float]: +) -> tuple[float, float]: """ - Calculate relative bearing between own ship and target ship, both seen from - own ship and seen from target ship. + Calculate relative bearing between own ship and target ship. Params: * position_own_ship: Own ship position {lat, lon} [rad] @@ -627,9 +615,7 @@ def calculate_relative_bearing( * alpha: relative bearing between target ship and own ship seen from target ship [rad] """ # POSE combination of relative bearing and contact angle - n_own_ship, e_own_ship, _ = llh2flat( - position_own_ship.lat, position_own_ship.lon, lat_lon0.lat, lat_lon0.lon - ) + n_own_ship, e_own_ship, _ = llh2flat(position_own_ship.lat, position_own_ship.lon, lat_lon0.lat, lat_lon0.lon) n_target_ship, e_target_ship, _ = llh2flat( position_target_ship.lat, position_target_ship.lon, @@ -705,7 +691,7 @@ def calculate_ship_cog(pos_0: GeoPosition, pos_1: GeoPosition, lat_lon0: GeoPosi return round(cog, 3) -def assign_vector_time(vector_time_range: List[float]): +def assign_vector_time(vector_time_range: list[float]) -> float: """ Assign random (uniform) vector time. @@ -716,9 +702,7 @@ def assign_vector_time(vector_time_range: List[float]): ------- * vector_time: Vector time [min] """ - vector_time: float = vector_time_range[0] + random.uniform(0, 1) * ( - vector_time_range[1] - vector_time_range[0] - ) + vector_time: float = vector_time_range[0] + random.uniform(0, 1) * (vector_time_range[1] - vector_time_range[0]) return vector_time @@ -727,7 +711,7 @@ def assign_sog_to_target_ship( own_ship_sog: float, min_target_ship_sog: float, relative_sog_setting: EncounterRelativeSpeed, -): +) -> float: """ Assign random (uniform) sog to target ship depending on type of encounter. @@ -755,10 +739,7 @@ def assign_sog_to_target_ship( relative_sog = [0.0, 0.0] # Check that minimum target ship sog is in the relative sog range - if ( - min_target_ship_sog / own_ship_sog > relative_sog[0] - and min_target_ship_sog / own_ship_sog < relative_sog[1] - ): + if min_target_ship_sog / own_ship_sog > relative_sog[0] and min_target_ship_sog / own_ship_sog < relative_sog[1]: relative_sog[0] = min_target_ship_sog / own_ship_sog target_ship_sog: float = ( @@ -768,10 +749,12 @@ def assign_sog_to_target_ship( return target_ship_sog -def assign_beta_from_list(beta_limit: List[float]) -> float: +def assign_beta_from_list(beta_limit: list[float]) -> float: """ - Assign random (uniform) relative bearing beta between own ship - and target ship depending between the limits given by beta_limit. + Assign random (uniform) relative bearing. + + The beta between own ship + and target ship depending is somewhere between the limits given by beta_limit. Params: * beta_limit: Limits for beta @@ -787,8 +770,7 @@ def assign_beta_from_list(beta_limit: List[float]) -> float: def assign_beta(encounter_type: EncounterType, settings: EncounterSettings) -> float: """ - Assign random (uniform) relative bearing beta between own ship - and target ship depending on type of encounter. + Assign random (uniform) relative bearing. Params: * encounter_type: Type of encounter @@ -801,7 +783,7 @@ def assign_beta(encounter_type: EncounterType, settings: EncounterSettings) -> f theta13_crit: float = settings.classification.theta13_criteria theta14_crit: float = settings.classification.theta14_criteria theta15_crit: float = settings.classification.theta15_criteria - theta15: List[float] = settings.classification.theta15 + theta15: list[float] = settings.classification.theta15 if encounter_type is EncounterType.OVERTAKING_STAND_ON: return theta15[0] + random.uniform(0, 1) * (theta15[1] - theta15[0]) @@ -818,7 +800,7 @@ def assign_beta(encounter_type: EncounterType, settings: EncounterSettings) -> f return 0.0 -def decide_target_ship(target_ships_static: List[ShipStatic]) -> ShipStatic: +def decide_target_ship(target_ships_static: list[ShipStatic]) -> ShipStatic: """ Randomly pick a target ship from a list of target ships. diff --git a/src/trafficgen/marine_system_simulator.py b/src/trafficgen/marine_system_simulator.py index 136ef56..70b9fbf 100644 --- a/src/trafficgen/marine_system_simulator.py +++ b/src/trafficgen/marine_system_simulator.py @@ -11,8 +11,6 @@ Parts of the library have been re-implemented in Python and are found below. """ -from typing import Tuple - import numpy as np @@ -23,10 +21,9 @@ def flat2llh( lon_0: float, z_n: float = 0.0, height_ref: float = 0.0, -) -> Tuple[float, float, float]: +) -> tuple[float, float, float]: """ - Compute lon lon (rad), lat lat (rad) and height h (m) for the - NED coordinates (xn,yn,zn). + Compute lon lon (rad), lat lat (rad) and height h (m) for the NED coordinates (xn,yn,zn). Method taken from the MSS (Marine System Simulator) toolbox which is a Matlab/Simulink library for marine systems. @@ -80,10 +77,9 @@ def llh2flat( lon_0: float, height: float = 0.0, height_ref: float = 0.0, -) -> Tuple[float, float, float]: +) -> tuple[float, float, float]: """ - Compute (north, east) for a flat Earth coordinate system from lon - lon (rad) and lat lat (rad). + Compute (north, east) for a flat Earth coordinate system from lon lon (rad) and lat lat (rad). Method taken from the MSS (Marine System Simulator) toolbox which is a Matlab/Simulink library for marine systems. @@ -109,7 +105,6 @@ def llh2flat( * y_n: Ship position, east [m] * z_n: Ship position, down [m] """ - # WGS-84 parameters a_radius = 6378137 # Semi-major axis (equitorial radius) f_factor = 1 / 298.257223563 # Flattening @@ -149,5 +144,4 @@ def ssa(angle: float) -> float: ------- * smallest_angle: "smallest signed angle" or the smallest difference between two angles """ - return np.mod(angle + np.pi, 2 * np.pi) - np.pi diff --git a/src/trafficgen/plot_traffic_situation.py b/src/trafficgen/plot_traffic_situation.py index e8fc2c3..dccb3ec 100644 --- a/src/trafficgen/plot_traffic_situation.py +++ b/src/trafficgen/plot_traffic_situation.py @@ -3,12 +3,11 @@ """Functions to prepare and plot traffic situations.""" import math -from typing import List, Optional, Tuple, Union import matplotlib.pyplot as plt import numpy as np from folium import Map, Polygon -from matplotlib.axes import Axes as Axes +from matplotlib.axes import Axes from matplotlib.patches import Circle from trafficgen.marine_system_simulator import flat2llh, llh2flat @@ -21,7 +20,7 @@ def calculate_vector_arrow( direction: float, vector_length: float, lat_lon0: GeoPosition, -) -> List[Tuple[float, float]]: +) -> list[tuple[float, float]]: """ Calculate the arrow with length vector pointing in the direction of ship course. @@ -50,12 +49,8 @@ def calculate_vector_arrow( lat_start, lon_start, _ = flat2llh(north_start, east_start, lat_lon0.lat, lat_lon0.lon) lat_end, lon_end, _ = flat2llh(north_end, east_end, lat_lon0.lat, lat_lon0.lon) - lat_arrow_side_1, lon_arrow_side_1, _ = flat2llh( - north_arrow_side_1, east_arrow_side_1, lat_lon0.lat, lat_lon0.lon - ) - lat_arrow_side_2, lon_arrow_side_2, _ = flat2llh( - north_arrow_side_2, east_arrow_side_2, lat_lon0.lat, lat_lon0.lon - ) + lat_arrow_side_1, lon_arrow_side_1, _ = flat2llh(north_arrow_side_1, east_arrow_side_1, lat_lon0.lat, lat_lon0.lon) + lat_arrow_side_2, lon_arrow_side_2, _ = flat2llh(north_arrow_side_2, east_arrow_side_2, lat_lon0.lat, lat_lon0.lon) point_1 = (rad_2_deg(lat_start), rad_2_deg(lon_start)) point_2 = (rad_2_deg(lat_end), rad_2_deg(lon_end)) @@ -71,7 +66,7 @@ def calculate_ship_outline( lat_lon0: GeoPosition, ship_length: float = 100.0, ship_width: float = 15.0, -) -> List[Tuple[float, float]]: +) -> list[tuple[float, float]]: """ Calculate the outline of the ship pointing in the direction of ship course. @@ -96,16 +91,8 @@ def calculate_ship_outline( east_pos1 = east_start + np.sin(course) * (-ship_length / 2) + np.cos(course) * ship_width / 2 lat_pos1, lon_pos1, _ = flat2llh(north_pos1, east_pos1, lat_lon0.lat, lat_lon0.lon) - north_pos2 = ( - north_start - + np.cos(course) * (ship_length / 2 - ship_length * 0.1) - - np.sin(course) * ship_width / 2 - ) - east_pos2 = ( - east_start - + np.sin(course) * (ship_length / 2 - ship_length * 0.1) - + np.cos(course) * ship_width / 2 - ) + north_pos2 = north_start + np.cos(course) * (ship_length / 2 - ship_length * 0.1) - np.sin(course) * ship_width / 2 + east_pos2 = east_start + np.sin(course) * (ship_length / 2 - ship_length * 0.1) + np.cos(course) * ship_width / 2 lat_pos2, lon_pos2, _ = flat2llh(north_pos2, east_pos2, lat_lon0.lat, lat_lon0.lon) north_pos3 = north_start + np.cos(course) * (ship_length / 2) @@ -113,15 +100,9 @@ def calculate_ship_outline( lat_pos3, lon_pos3, _ = flat2llh(north_pos3, east_pos3, lat_lon0.lat, lat_lon0.lon) north_pos4 = ( - north_start - + np.cos(course) * (ship_length / 2 - ship_length * 0.1) - - np.sin(course) * (-ship_width / 2) - ) - east_pos4 = ( - east_start - + np.sin(course) * (ship_length / 2 - ship_length * 0.1) - + np.cos(course) * (-ship_width / 2) + north_start + np.cos(course) * (ship_length / 2 - ship_length * 0.1) - np.sin(course) * (-ship_width / 2) ) + east_pos4 = east_start + np.sin(course) * (ship_length / 2 - ship_length * 0.1) + np.cos(course) * (-ship_width / 2) lat_pos4, lon_pos4, _ = flat2llh(north_pos4, east_pos4, lat_lon0.lat, lat_lon0.lon) north_pos5 = north_start + np.cos(course) * (-ship_length / 2) - np.sin(course) * (-ship_width / 2) @@ -138,10 +119,10 @@ def calculate_ship_outline( def plot_specific_traffic_situation( - traffic_situations: List[TrafficSituation], + traffic_situations: list[TrafficSituation], situation_number: int, encounter_settings: EncounterSettings, -): +) -> None: """ Plot a specific situation in map. @@ -149,11 +130,10 @@ def plot_specific_traffic_situation( * traffic_situations: Generated traffic situations * situation_number: The specific situation to be plotted """ - num_situations = len(traffic_situations) if situation_number > num_situations: print( - f"Situation_number specified higher than number of situations available, plotting last situation: {num_situations}" + f"Situation_number specified higher than number of situations available, plotting last situation: {num_situations}" # noqa: E501 ) situation_number = num_situations @@ -173,7 +153,7 @@ def plot_specific_traffic_situation( "black", ) - target_ships: Union[List[TargetShip], None] = situation.target_ships + target_ships: list[TargetShip] | None = situation.target_ships assert target_ships is not None for target_ship in target_ships: map_plot = add_ship_to_map( @@ -190,7 +170,7 @@ def add_ship_to_map( ship: Ship, vector_time: float, lat_lon0: GeoPosition, - map_plot: Optional[Map], + map_plot: Map | None, color: str = "black", ) -> Map: """ @@ -232,11 +212,11 @@ def add_ship_to_map( def plot_traffic_situations( - traffic_situations: List[TrafficSituation], + traffic_situations: list[TrafficSituation], col: int, row: int, encounter_settings: EncounterSettings, -): +) -> None: """ Plot the traffic situations in one more figures. @@ -352,9 +332,9 @@ def add_ship_to_plot( ship: Ship, vector_time: float, lat_lon0: GeoPosition, - axes: Optional[Axes], + axes: Axes | None, color: str = "black", -): +) -> Axes: """ Add the ship to the plot. @@ -396,7 +376,7 @@ def add_ship_to_plot( ) circle = Circle( xy=(pos_0_east, pos_0_north), - radius=vector_time / 3000.0, # type: ignore + radius=vector_time / 3000.0, color=color, ) _ = axes.add_patch(circle) diff --git a/src/trafficgen/read_files.py b/src/trafficgen/read_files.py index 387efcc..977df4a 100644 --- a/src/trafficgen/read_files.py +++ b/src/trafficgen/read_files.py @@ -3,21 +3,18 @@ import json import os from pathlib import Path -from typing import Any, Dict, List, Union, cast -from uuid import UUID, uuid4 +from typing import Any, cast from trafficgen.types import ( EncounterSettings, - OwnShip, ShipStatic, SituationInput, - TargetShip, TrafficSituation, ) from trafficgen.utils import deg_2_rad, knot_2_m_pr_s, min_2_s, nm_2_m -def read_situation_files(situation_folder: Path) -> List[SituationInput]: +def read_situation_files(situation_folder: Path) -> list[SituationInput]: """ Read traffic situation files. @@ -29,10 +26,10 @@ def read_situation_files(situation_folder: Path) -> List[SituationInput]: ------- * situations: List of desired traffic situations """ - situations: List[SituationInput] = [] + situations: list[SituationInput] = [] for file_name in sorted([file for file in os.listdir(situation_folder) if file.endswith(".json")]): - file_path = os.path.join(situation_folder, file_name) - with open(file_path, encoding="utf-8") as f: + file_path = situation_folder / file_name + with Path.open(file_path, encoding="utf-8") as f: data = json.load(f) data = convert_keys_to_snake_case(data) @@ -47,7 +44,7 @@ def read_situation_files(situation_folder: Path) -> List[SituationInput]: return situations -def read_generated_situation_files(situation_folder: Path) -> List[TrafficSituation]: +def read_generated_situation_files(situation_folder: Path) -> list[TrafficSituation]: """ Read the generated traffic situation files. Used for testing the trafficgen algorithm. @@ -58,10 +55,10 @@ def read_generated_situation_files(situation_folder: Path) -> List[TrafficSituat ------- * situations: List of desired traffic situations """ - situations: List[TrafficSituation] = [] + situations: list[TrafficSituation] = [] for file_name in sorted([file for file in os.listdir(situation_folder) if file.endswith(".json")]): - file_path = os.path.join(situation_folder, file_name) - with open(file_path, encoding="utf-8") as f: + file_path = situation_folder / file_name + with Path.open(file_path, encoding="utf-8") as f: data = json.load(f) data = convert_keys_to_snake_case(data) @@ -112,10 +109,10 @@ def convert_situation_data_from_maritime_to_si_units(situation: SituationInput) assert situation.encounters is not None for encounter in situation.encounters: - beta: Union[List[float], float, None] = encounter.beta - vector_time: Union[float, None] = encounter.vector_time + beta: list[float] | float | None = encounter.beta + vector_time: float | None = encounter.vector_time if beta is not None: - if isinstance(beta, List): + if isinstance(beta, list): assert len(beta) == 2 for i in range(len(beta)): beta[i] = deg_2_rad(beta[i]) @@ -138,7 +135,7 @@ def read_own_ship_static_file(own_ship_static_file: Path) -> ShipStatic: ------- * own_ship static information """ - with open(own_ship_static_file, encoding="utf-8") as f: + with Path.open(own_ship_static_file, encoding="utf-8") as f: data = json.load(f) data = convert_keys_to_snake_case(data) @@ -152,7 +149,7 @@ def read_own_ship_static_file(own_ship_static_file: Path) -> ShipStatic: return ship_static -def read_target_ship_static_files(target_ship_folder: Path) -> List[ShipStatic]: +def read_target_ship_static_files(target_ship_folder: Path) -> list[ShipStatic]: """ Read target ship static data files. @@ -163,12 +160,12 @@ def read_target_ship_static_files(target_ship_folder: Path) -> List[ShipStatic]: ------- * target_ships_static: List of different target ships with static information """ - target_ships_static: List[ShipStatic] = [] + target_ships_static: list[ShipStatic] = [] i = 0 for file_name in sorted([file for file in os.listdir(target_ship_folder) if file.endswith(".json")]): i = i + 1 - file_path = os.path.join(target_ship_folder, file_name) - with open(file_path, encoding="utf-8") as f: + file_path = target_ship_folder / file_name + with Path.open(file_path, encoding="utf-8") as f: data = json.load(f) data = convert_keys_to_snake_case(data) @@ -209,7 +206,7 @@ def read_encounter_settings_file(settings_file: Path) -> EncounterSettings: ------- * encounter_settings: Settings for the encounter """ - with open(settings_file, encoding="utf-8") as f: + with Path.open(settings_file, encoding="utf-8") as f: data = json.load(f) data = check_input_units(data) encounter_settings: EncounterSettings = EncounterSettings(**data) @@ -249,9 +246,8 @@ def convert_settings_data_from_maritime_to_si_units(settings: EncounterSettings) return settings -def check_input_units(data: Dict[str, Any]) -> Dict[str, Any]: +def check_input_units(data: dict[str, Any]) -> dict[str, Any]: """Check if input unit is specified, if not specified it is set to SI.""" - if "input_units" not in data: data["input_units"] = "si" @@ -263,33 +259,26 @@ def camel_to_snake(string: str) -> str: return "".join([f"_{c.lower()}" if c.isupper() else c for c in string]).lstrip("_") -def convert_keys_to_snake_case(data: Dict[str, Any]) -> Dict[str, Any]: +def convert_keys_to_snake_case(data: dict[str, Any]) -> dict[str, Any]: """Convert keys in a nested dictionary from camel case to snake case.""" - return cast(Dict[str, Any], _convert_keys_to_snake_case(data)) + return cast(dict[str, Any], _convert_keys_to_snake_case(data)) def _convert_keys_to_snake_case( - data: Union[Dict[str, Any], List[Any]], -) -> Union[Dict[str, Any], List[Any]]: + data: dict[str, Any] | list[Any], +) -> dict[str, Any] | list[Any]: """Convert keys in a nested dictionary from camel case to snake case.""" - - if isinstance(data, Dict): # Dict - converted_dict: Dict[str, Any] = {} + if isinstance(data, dict): # Dict + converted_dict: dict[str, Any] = {} for key, value in data.items(): converted_key = camel_to_snake(key) - if isinstance(value, (Dict, List)): - converted_value = _convert_keys_to_snake_case(value) - else: - converted_value = value + converted_value = _convert_keys_to_snake_case(value) if isinstance(value, dict | list) else value converted_dict[converted_key] = converted_value return converted_dict # List - converted_list: List[Any] = [] + converted_list: list[Any] = [] for value in data: - if isinstance(value, (Dict, List)): - converted_value = _convert_keys_to_snake_case(value) - else: - converted_value = value + converted_value = _convert_keys_to_snake_case(value) if isinstance(value, dict | list) else value converted_list.append(value) return converted_list diff --git a/src/trafficgen/ship_traffic_generator.py b/src/trafficgen/ship_traffic_generator.py index 1032559..3504139 100644 --- a/src/trafficgen/ship_traffic_generator.py +++ b/src/trafficgen/ship_traffic_generator.py @@ -2,7 +2,6 @@ from importlib.metadata import PackageNotFoundError, version from pathlib import Path -from typing import List, Union from trafficgen.encounter import ( define_own_ship, @@ -36,9 +35,10 @@ def generate_traffic_situations( own_ship_file: Path, target_ship_folder: Path, settings_file: Path, -) -> List[TrafficSituation]: +) -> list[TrafficSituation]: """ Generate a set of traffic situations using input files. + This is the main function for generating a set of traffic situations using input files specifying number and type of encounter, type of target ships etc. @@ -53,12 +53,11 @@ def generate_traffic_situations( * traffic_situations: List of generated traffic situations. * One situation may consist of one or more encounters. """ - own_ship_static: ShipStatic = read_own_ship_static_file(own_ship_file) - target_ships_static: List[ShipStatic] = read_target_ship_static_files(target_ship_folder) + target_ships_static: list[ShipStatic] = read_target_ship_static_files(target_ship_folder) encounter_settings: EncounterSettings = read_encounter_settings_file(settings_file) - desired_traffic_situations: List[SituationInput] = read_situation_files(situation_folder) - traffic_situations: List[TrafficSituation] = [] + desired_traffic_situations: list[SituationInput] = read_situation_files(situation_folder) + traffic_situations: list[TrafficSituation] = [] for desired_traffic_situation in desired_traffic_situations: num_situations: int = desired_traffic_situation.num_situations @@ -68,16 +67,14 @@ def generate_traffic_situations( lat_lon0: GeoPosition = desired_traffic_situation.own_ship.initial.position - own_ship: OwnShip = define_own_ship( - desired_traffic_situation, own_ship_static, encounter_settings, lat_lon0 - ) + own_ship: OwnShip = define_own_ship(desired_traffic_situation, own_ship_static, encounter_settings, lat_lon0) for _ in range(num_situations): - target_ships: List[TargetShip] = [] + target_ships: list[TargetShip] = [] for i, encounter in enumerate(desired_traffic_situation.encounters): desired_encounter_type = EncounterType(encounter.desired_encounter_type) - beta: Union[List[float], float, None] = encounter.beta - relative_speed: Union[float, None] = encounter.relative_speed - vector_time: Union[float, None] = encounter.vector_time + beta: list[float] | float | None = encounter.beta + relative_speed: float | None = encounter.relative_speed + vector_time: float | None = encounter.vector_time target_ship, encounter_found = generate_encounter( desired_encounter_type, diff --git a/src/trafficgen/types.py b/src/trafficgen/types.py index 4706810..08d2ca4 100644 --- a/src/trafficgen/types.py +++ b/src/trafficgen/types.py @@ -3,7 +3,7 @@ from datetime import datetime from enum import Enum from importlib.metadata import PackageNotFoundError, version -from typing import Annotated, Any, List, Optional, Type, Union +from typing import Annotated, Any, Optional, Type from pydantic import BaseModel, ConfigDict from pydantic.fields import Field @@ -175,32 +175,20 @@ class Dimensions(BaseModelConfig): """ - length: Optional[ - Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[130.0])] - ] = None - width: Optional[ - Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[30.0])] - ] = None - height: Optional[ - Annotated[float, Field(gt=0, description="Height of the ship in meters", examples=[15.0])] - ] = None - draught: Optional[ - Annotated[float, Field(gt=0, description="Draught of the ship in meters", examples=[15.0])] - ] = None + length: Optional[Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[130.0])]] = None + width: Optional[Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[30.0])]] = None + height: Optional[Annotated[float, Field(gt=0, description="Height of the ship in meters", examples=[15.0])]] = None + draught: Optional[Annotated[float, Field(gt=0, description="Draught of the ship in meters", examples=[15.0])]] = ( + None + ) - a: Optional[ - Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Bow", examples=[80])] - ] = None - b: Optional[ - Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Stern", examples=[20])] - ] = None - c: Optional[ - Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Port", examples=[20])] - ] = None + a: Optional[Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Bow", examples=[80])]] = None + b: Optional[Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Stern", examples=[20])]] = ( + None + ) + c: Optional[Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Port", examples=[20])]] = None d: Optional[ - Annotated[ - float, Field(gt=0, description="Distance in meters from CCRP to Starboard", examples=[20]) - ] + Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Starboard", examples=[20])] ] = None def __init__(self, **data: Any): @@ -232,16 +220,12 @@ class ShipStatic(BaseModelConfig): ), ] ] = None - imo: Optional[ - Annotated[int, Field(ge=1000000, le=9999999, description="IMO Number", examples=[1234567])] - ] = None + imo: Optional[Annotated[int, Field(ge=1000000, le=9999999, description="IMO Number", examples=[1234567])]] = None name: Optional[Annotated[str, Field(description="Ship name", examples=["RMS Titanic"])]] = None dimensions: Optional[Annotated[Dimensions, Field(description="Key ship dimensions")]] = None - ship_type: Optional[Annotated[AisShipType, Field(description="General ship type, based on AIS")]] = ( - None - ) + ship_type: Optional[Annotated[AisShipType, Field(description="General ship type, based on AIS")]] = None path_type: Optional[ Annotated[ @@ -254,14 +238,10 @@ class ShipStatic(BaseModelConfig): ] = None sog_min: Optional[ - Annotated[ - float, Field(ge=0, description="Minimum ship speed over ground in knots", examples=[5.0]) - ] + Annotated[float, Field(ge=0, description="Minimum ship speed over ground in knots", examples=[5.0])] ] = None sog_max: Optional[ - Annotated[ - float, Field(ge=0, description="Maximum ship speed over ground in knots", examples=[15.0]) - ] + Annotated[float, Field(ge=0, description="Maximum ship speed over ground in knots", examples=[15.0])] ] = None model_config = ConfigDict(extra="allow") @@ -297,19 +277,13 @@ class Initial(BaseModelConfig): examples=[create_position_example()], ), ] - sog: Annotated[ - float, Field(ge=0, description="Initial ship (SOG) ground in knots", examples=[10.0]) - ] + sog: Annotated[float, Field(ge=0, description="Initial ship (SOG) ground in knots", examples=[10.0])] cog: Annotated[ float, - Field( - ge=0, le=360, description="Initial ship course over ground (COG) in degrees", examples=[45.0] - ), + Field(ge=0, le=360, description="Initial ship course over ground (COG) in degrees", examples=[45.0]), ] heading: Optional[ - Annotated[ - float, Field(ge=0, le=360, description="Initial ship heading in degrees", examples=[45.2]) - ] + Annotated[float, Field(ge=0, le=360, description="Initial ship heading in degrees", examples=[45.2])] ] = None nav_status: Optional[Annotated[AisNavStatus, Field(description="AIS Navigational Status")]] = None @@ -318,9 +292,7 @@ class DataPoint(BaseModelConfig): """Data type for storing data which is numerical and continuos.""" value: Optional[ - Annotated[ - float, Field(description="the value of the data at the current waypoint", examples=[12.3]) - ] + Annotated[float, Field(description="the value of the data at the current waypoint", examples=[12.3])] ] = None interp_start: Optional[ Annotated[ @@ -361,12 +333,8 @@ class RouteData(BaseModelConfig): class Leg(BaseModelConfig): """Data type for a leg.""" - starboard_xtd: Optional[ - Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")] - ] = None - portside_xtd: Optional[ - Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")] - ] = None + starboard_xtd: Optional[Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")]] = None + portside_xtd: Optional[Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")]] = None data: Optional[Annotated[RouteData, Field(description=data_description)]] = None @@ -375,16 +343,12 @@ class Waypoint(BaseModelConfig): position: Annotated[ GeoPosition, - Field( - description="A geographical coordinate.", examples=[GeoPosition(lon=11.2313, lat=51.2123)] - ), + Field(description="A geographical coordinate.", examples=[GeoPosition(lon=11.2313, lat=51.2123)]), ] turn_radius: Optional[ Annotated[ float, - Field( - description="Orthodrome turn radius in nautical miles as defined in RTZ.", examples=[200] - ), + Field(description="Orthodrome turn radius in nautical miles as defined in RTZ.", examples=[200]), ] ] = None leg: Optional[Annotated[Leg, Field(description="Current Leg information.")]] = None @@ -416,9 +380,7 @@ def create_initial_example(): def create_data_point_example(): """Create a DataPoint class.""" - return DataPoint( - value=12.3, interp_start=100, interp_end=100, interp_method=InterpolationMethod.LINEAR - ) + return DataPoint(value=12.3, interp_start=100, interp_end=100, interp_method=InterpolationMethod.LINEAR) def create_waypoint_example(): @@ -443,7 +405,7 @@ class Ship(BaseModelConfig): ] = None waypoints: Optional[ Annotated[ - List[Waypoint], + list[Waypoint], Field(description=waypoints_description, examples=[create_waypoint_example()]), ] ] = None @@ -453,7 +415,7 @@ def __init__(self, **data: Any): if not self.waypoints: self.waypoints = self._generate_waypoints() - def _generate_waypoints(self) -> Union[List[Waypoint], None]: + def _generate_waypoints(self) -> list[Waypoint] | None: """Generate waypoints if they don't exist.""" waypoints = [] @@ -485,9 +447,7 @@ def _generate_waypoints(self) -> Union[List[Waypoint], None]: class OwnShip(Ship): """Data type for the own ship.""" - static: Annotated[ - ShipStatic, Field(description=static_description, examples=[create_ship_static_example()]) - ] + static: Annotated[ShipStatic, Field(description=static_description, examples=[create_ship_static_example()])] def __init__(self, **data: Any): super().__init__(**data) @@ -498,9 +458,7 @@ def __init__(self, **data: Any): class TargetShip(Ship): """Data type for the target ship.""" - static: Annotated[ - ShipStatic, Field(description=static_description, examples=[create_ship_static_example()]) - ] + static: Annotated[ShipStatic, Field(description=static_description, examples=[create_ship_static_example()])] def __init__(self, **data: Any): super().__init__(**data) @@ -524,21 +482,15 @@ def create_own_ship_example(): def create_target_example(): """Create a TargetShip class.""" - return TargetShip( - static=create_ship_static_example(), initial=create_initial_example(), waypoints=None - ) + return TargetShip(static=create_ship_static_example(), initial=create_initial_example(), waypoints=None) class TrafficSituation(BaseModelConfig): """Data type for a traffic situation.""" - version: Annotated[ - str, Field(description="Ship traffic generator version number", examples=[project_version]) - ] + version: Annotated[str, Field(description="Ship traffic generator version number", examples=[project_version])] title: Optional[ - Annotated[ - str, Field(description="The title of the traffic situation", examples=["overtaking_18"]) - ] + Annotated[str, Field(description="The title of the traffic situation", examples=["overtaking_18"])] ] = None description: Optional[ Annotated[ @@ -558,12 +510,10 @@ class TrafficSituation(BaseModelConfig): ), ] ] = None - own_ship: Annotated[ - OwnShip, Field(description="Own Ship (OS) data", examples=[create_ship_example()]) - ] + own_ship: Annotated[OwnShip, Field(description="Own Ship (OS) data", examples=[create_ship_example()])] target_ships: Optional[ Annotated[ - List[TargetShip], + list[TargetShip], Field(description="Target Ship (TGT) data", examples=[[create_ship_example()]]), ] ] = None @@ -584,9 +534,9 @@ class Encounter(BaseModelConfig): """Data type for an encounter.""" desired_encounter_type: EncounterType - beta: Union[List[float], float, None] = None - relative_speed: Union[float, None] = None - vector_time: Union[float, None] = None + beta: list[float] | float | None = None + relative_speed: float | None = None + vector_time: float | None = None model_config = ConfigDict(extra="allow") @@ -597,7 +547,7 @@ class EncounterClassification(BaseModelConfig): theta13_criteria: float theta14_criteria: float theta15_criteria: float - theta15: List[float] + theta15: list[float] model_config = ConfigDict(extra="allow") @@ -605,11 +555,11 @@ class EncounterClassification(BaseModelConfig): class EncounterRelativeSpeed(BaseModelConfig): """Data type for relative speed between two ships in an encounter.""" - overtaking_stand_on: List[float] - overtaking_give_way: List[float] - head_on: List[float] - crossing_give_way: List[float] - crossing_stand_on: List[float] + overtaking_stand_on: list[float] + overtaking_give_way: list[float] + head_on: list[float] + crossing_give_way: list[float] + crossing_stand_on: list[float] model_config = ConfigDict(extra="allow") @@ -619,7 +569,7 @@ class EncounterSettings(BaseModelConfig): classification: EncounterClassification relative_speed: EncounterRelativeSpeed - vector_range: List[float] + vector_range: list[float] common_vector: float situation_length: float max_meeting_distance: float @@ -633,7 +583,7 @@ class OwnShipInitial(BaseModelConfig): """Data type for initial data for the own ship used for generating a situation.""" initial: Initial - waypoints: Optional[List[Waypoint]] = Field(None, description="An array of `Waypoint` objects.") + waypoints: Optional[list[Waypoint]] = Field(None, description="An array of `Waypoint` objects.") class SituationInput(BaseModelConfig): @@ -643,6 +593,6 @@ class SituationInput(BaseModelConfig): description: str num_situations: int own_ship: OwnShipInitial - encounters: List[Encounter] + encounters: list[Encounter] model_config = ConfigDict(extra="allow") diff --git a/src/trafficgen/utils.py b/src/trafficgen/utils.py index aa2a9bb..69c8360 100644 --- a/src/trafficgen/utils.py +++ b/src/trafficgen/utils.py @@ -1,7 +1,5 @@ """Utility functions that are used by several other functions.""" -from typing import List - import numpy as np from trafficgen.marine_system_simulator import flat2llh, llh2flat @@ -19,7 +17,6 @@ def knot_2_m_pr_s(speed_in_knot: float) -> float: ------- * speed_in_m_pr_s: Ship speed in meters pr second """ - knot_2_m_pr_sec: float = 0.5144 return speed_in_knot * knot_2_m_pr_sec @@ -35,7 +32,6 @@ def m_pr_s_2_knot(speed_in_m_pr_s: float) -> float: ------- * speed_in_knot: Ship speed in knots """ - knot_2_m_pr_sec: float = 0.5144 return speed_in_m_pr_s / knot_2_m_pr_sec @@ -51,7 +47,6 @@ def min_2_s(time_in_min: float) -> float: ------- * time_in_s: Time in seconds """ - min_2_s_coeff: float = 60.0 return time_in_min * min_2_s_coeff @@ -67,7 +62,6 @@ def m_2_nm(length_in_m: float) -> float: ------- * length_in_nm: Length given in nautical miles """ - m_2_nm_coeff: float = 1.0 / 1852.0 return m_2_nm_coeff * length_in_m @@ -83,7 +77,6 @@ def nm_2_m(length_in_nm: float) -> float: ------- * length_in_m: Length given in meters """ - nm_2_m_factor: float = 1852.0 return length_in_nm * nm_2_m_factor @@ -99,7 +92,6 @@ def deg_2_rad(angle_in_degrees: float) -> float: ------- * angle given in radians: Angle given in radians """ - return angle_in_degrees * np.pi / 180.0 @@ -115,7 +107,6 @@ def rad_2_deg(angle_in_radians: float) -> float: * angle given in radians: Angle given in radians """ - return angle_in_radians * 180.0 / np.pi @@ -132,7 +123,6 @@ def convert_angle_minus_pi_to_pi_to_0_to_2_pi(angle_pi: float) -> float: * angle_2_pi: Angle given in the region 0 to 2pi radians """ - return angle_pi if angle_pi >= 0.0 else angle_pi + 2 * np.pi @@ -149,7 +139,6 @@ def convert_angle_0_to_2_pi_to_minus_pi_to_pi(angle_2_pi: float) -> float: * angle_pi: Angle given in the region -pi to pi radians """ - return angle_2_pi if (angle_2_pi >= 0.0) & (angle_2_pi <= np.pi) else angle_2_pi - 2 * np.pi @@ -161,8 +150,9 @@ def calculate_position_at_certain_time( delta_time: float, ) -> GeoPosition: """ - Calculate the position of the ship at a given time based on initial position - and delta time, and constant speed and course. + Calculate the position of the ship at a given time. + + The calculated position is based on initial position and delta time, in addition to constant speed and course. Params: * position{lat, lon}: Initial ship position [rad] @@ -174,7 +164,6 @@ def calculate_position_at_certain_time( ------- * position{lat, lon}: Estimated ship position in delta time minutes [rad] """ - north, east, _ = llh2flat(position.lat, position.lon, lat_lon0.lat, lat_lon0.lon) north = north + speed * delta_time * np.cos(course) @@ -202,9 +191,7 @@ def calculate_distance(position_prev: GeoPosition, position_next: GeoPosition) - * distance: Distance between waypoints [m] """ # Using position of previous waypoint as reference point - north_next, east_next, _ = llh2flat( - position_next.lat, position_next.lon, position_prev.lat, position_prev.lon - ) + north_next, east_next, _ = llh2flat(position_next.lat, position_next.lon, position_prev.lat, position_prev.lon) distance: float = np.sqrt(north_next**2 + east_next**2) @@ -212,12 +199,14 @@ def calculate_distance(position_prev: GeoPosition, position_next: GeoPosition) - def calculate_position_along_track_using_waypoints( - waypoints: List[Waypoint], + waypoints: list[Waypoint], inital_speed: float, vector_time: float, ) -> GeoPosition: """ - Calculate the position of the ship at a given time based on initial position + Calculate the position along the track using waypoints. + + The position along the track is calculated based on initial position and delta time, and constant speed and course. Params: @@ -234,8 +223,8 @@ def calculate_position_along_track_using_waypoints( for i in range(1, len(waypoints)): ship_speed: float = inital_speed - if waypoints[i].leg is not None and waypoints[i].leg.data.sog is not None: # type: ignore - ship_speed = waypoints[i].leg.data.sog # type: ignore + if waypoints[i].leg is not None and waypoints[i].leg.data.sog is not None: # type: ignore[attr-defined] + ship_speed = waypoints[i].leg.data.sog # type: ignore[attr-defined] dist_between_waypoints = calculate_distance(waypoints[i - 1].position, waypoints[i].position) @@ -245,12 +234,8 @@ def calculate_position_along_track_using_waypoints( if dist_travel > dist_between_waypoints: time_in_transit = time_in_transit + dist_between_waypoints / ship_speed else: - bearing = calculate_bearing_between_waypoints( - waypoints[i - 1].position, waypoints[i].position - ) - position_along_track = calculate_destination_along_track( - waypoints[i - 1].position, dist_travel, bearing - ) + bearing = calculate_bearing_between_waypoints(waypoints[i - 1].position, waypoints[i].position) + position_along_track = calculate_destination_along_track(waypoints[i - 1].position, dist_travel, bearing) return position_along_track # if ship reach last waypoint in less time than vector_time, last waypoint is used @@ -258,8 +243,7 @@ def calculate_position_along_track_using_waypoints( def calculate_bearing_between_waypoints(position_prev: GeoPosition, position_next: GeoPosition) -> float: - """ - Calculate the bearing in rad between two waypoints. + """Calculate the bearing in rad between two waypoints. Params: * position_prev{lat, lon}: Previous waypoint [rad] @@ -270,18 +254,14 @@ def calculate_bearing_between_waypoints(position_prev: GeoPosition, position_nex * bearing: Bearing between waypoints [m] """ # Using position of previous waypoint as reference point - north_next, east_next, _ = llh2flat( - position_next.lat, position_next.lon, position_prev.lat, position_prev.lon - ) + north_next, east_next, _ = llh2flat(position_next.lat, position_next.lon, position_prev.lat, position_prev.lon) bearing: float = convert_angle_minus_pi_to_pi_to_0_to_2_pi(np.arctan2(east_next, north_next)) return bearing -def calculate_destination_along_track( - position_prev: GeoPosition, distance: float, bearing: float -) -> GeoPosition: +def calculate_destination_along_track(position_prev: GeoPosition, distance: float, bearing: float) -> GeoPosition: """ Calculate the destination along the track between two waypoints when distance along the track is given. diff --git a/src/trafficgen/write_traffic_situation_to_file.py b/src/trafficgen/write_traffic_situation_to_file.py index 66fedd0..ea16570 100644 --- a/src/trafficgen/write_traffic_situation_to_file.py +++ b/src/trafficgen/write_traffic_situation_to_file.py @@ -1,7 +1,7 @@ """Functions to clean traffic situations data before writing it to a json file.""" from pathlib import Path -from typing import List, TypeVar +from typing import TypeVar from trafficgen.types import OwnShip, Ship, TargetShip, TrafficSituation from trafficgen.utils import m_2_nm, m_pr_s_2_knot, rad_2_deg @@ -9,7 +9,7 @@ T_ship = TypeVar("T_ship", Ship, OwnShip, TargetShip) -def write_traffic_situations_to_json_file(situations: List[TrafficSituation], write_folder: Path): +def write_traffic_situations_to_json_file(situations: list[TrafficSituation], write_folder: Path) -> None: """ Write traffic situations to json file. @@ -17,7 +17,6 @@ def write_traffic_situations_to_json_file(situations: List[TrafficSituation], wr * traffic_situations: Traffic situations to be written to file * write_folder: Folder where the json files is to be written """ - Path(write_folder).mkdir(parents=True, exist_ok=True) for i, situation in enumerate(situations): file_number: int = i + 1 @@ -26,7 +25,7 @@ def write_traffic_situations_to_json_file(situations: List[TrafficSituation], wr data: str = situation.model_dump_json( by_alias=True, indent=4, exclude_unset=True, exclude_defaults=False, exclude_none=True ) - with open(output_file_path, "w", encoding="utf-8") as outfile: + with Path.open(output_file_path, "w", encoding="utf-8") as outfile: _ = outfile.write(data) @@ -86,14 +85,8 @@ def convert_ship_data_from_si_units_to_maritime(ship: T_ship) -> T_ship: assert waypoint.leg.data.sog.value is not None assert waypoint.leg.data.sog.interp_start is not None assert waypoint.leg.data.sog.interp_end is not None - waypoint.leg.data.sog.value = round( - m_pr_s_2_knot(waypoint.leg.data.sog.value), 2 - ) - waypoint.leg.data.sog.interp_start = round( - m_2_nm(waypoint.leg.data.sog.interp_start), 2 - ) - waypoint.leg.data.sog.interp_end = round( - m_2_nm(waypoint.leg.data.sog.interp_end), 2 - ) + waypoint.leg.data.sog.value = round(m_pr_s_2_knot(waypoint.leg.data.sog.value), 2) + waypoint.leg.data.sog.interp_start = round(m_2_nm(waypoint.leg.data.sog.interp_start), 2) + waypoint.leg.data.sog.interp_end = round(m_2_nm(waypoint.leg.data.sog.interp_end), 2) return ship diff --git a/tests/conftest.py b/tests/conftest.py index 88031e3..8e3a02e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,5 +1,5 @@ -# -*- coding: utf-8 -*- """Root level fixtures for `trafficgen`""" + from pathlib import Path import pytest diff --git a/tests/test_read_files.py b/tests/test_read_files.py index 330a22b..33afa39 100644 --- a/tests/test_read_files.py +++ b/tests/test_read_files.py @@ -1,7 +1,6 @@ """Tests reading files.""" from pathlib import Path -from typing import List, Set from trafficgen.read_files import ( read_encounter_settings_file, @@ -23,7 +22,7 @@ def test_read_situations_1_ts_full_spec(situations_folder_test_01: Path): Test reading traffic situations with full specification, meaning all parameters are specified. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_01) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_01) assert len(desired_traffic_situations) == 5 # sourcery skip: no-loop-in-tests @@ -45,7 +44,7 @@ def test_read_situations_1_ts_partly_spec(situations_folder_test_02: Path): Test reading traffic situations using partly specification, meaning some of the parameters are specified. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_02) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_02) assert len(desired_traffic_situations) == 2 # sourcery skip: no-loop-in-tests @@ -62,7 +61,7 @@ def test_read_situations_1_ts_minimum_spec(situations_folder_test_03: Path): Test reading traffic situations using using minimum specification, meaning only type of situation is specified. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_03) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_03) assert len(desired_traffic_situations) == 2 # sourcery skip: no-loop-in-tests @@ -80,7 +79,7 @@ def test_read_situations_2_ts_one_to_many_situations(situations_folder_test_04: """ Test reading a traffic situation file num_situations=5 and 2 encounter specifications. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_04) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_04) assert len(desired_traffic_situations) == 1 # sourcery skip: no-loop-in-tests @@ -100,11 +99,11 @@ def test_read_situations_one_to_many_situations(situations_folder_test_05: Path) """ Test reading three traffic situation files 1, 2 and 3 encounter specifications. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_05) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_05) assert len(desired_traffic_situations) == 3 # sourcery skip: no-loop-in-tests - num_situations_values_found: Set[int] = set() + num_situations_values_found: set[int] = set() for situation in desired_traffic_situations: assert situation.own_ship is not None assert situation.encounters is not None @@ -123,11 +122,11 @@ def test_read_situations_with_different_encounter_types(situations_folder_test_0 """ Test reading 5 traffic situation files with different encounter types. """ - desired_traffic_situations: List[SituationInput] = read_situation_files(situations_folder_test_07) + desired_traffic_situations: list[SituationInput] = read_situation_files(situations_folder_test_07) assert len(desired_traffic_situations) == 5 # sourcery skip: no-loop-in-tests - desired_encounter_types_found: Set[EncounterType] = set() + desired_encounter_types_found: set[EncounterType] = set() for situation in desired_traffic_situations: assert situation.own_ship is not None assert situation.encounters is not None @@ -165,7 +164,7 @@ def test_read_target_ships(target_ships_folder: Path): """ Test reading target ship files. """ - target_ships_static: List[ShipStatic] = read_target_ship_static_files(target_ships_folder) + target_ships_static: list[ShipStatic] = read_target_ship_static_files(target_ships_folder) # sourcery skip: no-loop-in-tests for target_ship_static in target_ships_static: diff --git a/tests/test_trafficgen.py b/tests/test_trafficgen.py index d887476..7571d16 100644 --- a/tests/test_trafficgen.py +++ b/tests/test_trafficgen.py @@ -1,7 +1,6 @@ """Tests for `trafficgen` package.""" from pathlib import Path -from typing import List import pytest from click.testing import CliRunner @@ -79,7 +78,7 @@ def test_gen_situations( settings_file: Path, ): """Test generating traffic situations.""" - situations: List[TrafficSituation] = generate_traffic_situations( + situations: list[TrafficSituation] = generate_traffic_situations( situation_folder=situations_folder, own_ship_file=own_ship_file, target_ship_folder=target_ships_folder, @@ -121,7 +120,7 @@ def test_gen_situations_1_ts_full_spec_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 5 # sourcery skip: no-loop-in-tests @@ -163,7 +162,7 @@ def test_gen_situations_1_ts_partly_spec_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 2 # sourcery skip: no-loop-in-tests @@ -216,7 +215,7 @@ def test_gen_situations_1_ts_minimum_spec_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 2 # sourcery skip: no-loop-in-tests @@ -257,7 +256,7 @@ def test_gen_situations_2_ts_one_to_many_situations_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 5 # sourcery skip: no-loop-in-tests @@ -298,7 +297,7 @@ def test_gen_situations_one_to_many_situations_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 10 # sourcery skip: no-loop-in-tests @@ -340,7 +339,7 @@ def test_gen_situations_ot_gw_target_ship_speed_too_high_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 3 # sourcery skip: no-loop-in-tests @@ -382,7 +381,7 @@ def test_gen_situations_illegal_beta_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) # sourcery skip: no-loop-in-tests for situation in situations: @@ -421,7 +420,7 @@ def test_gen_situation_beta_limited_cli( assert result.exit_code == 0 assert "Generating traffic situations" in result.output - situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == 1 # sourcery skip: no-loop-in-tests diff --git a/tests/test_write_files.py b/tests/test_write_files.py index a5d5195..b68fcca 100644 --- a/tests/test_write_files.py +++ b/tests/test_write_files.py @@ -1,17 +1,19 @@ """Tests writing files.""" from pathlib import Path -from typing import List +from typing import TYPE_CHECKING from trafficgen.read_files import ( read_generated_situation_files, ) from trafficgen.ship_traffic_generator import generate_traffic_situations -from trafficgen.types import ( - TrafficSituation, -) from trafficgen.write_traffic_situation_to_file import write_traffic_situations_to_json_file +if TYPE_CHECKING: + from trafficgen.types import ( + TrafficSituation, + ) + def test_write_situations_multiple( situations_folder: Path, @@ -22,14 +24,14 @@ def test_write_situations_multiple( ): """Test writing multiple traffic situations in one call.""" - situations: List[TrafficSituation] = generate_traffic_situations( + situations: list[TrafficSituation] = generate_traffic_situations( situation_folder=situations_folder, own_ship_file=own_ship_file, target_ship_folder=target_ships_folder, settings_file=settings_file, ) write_traffic_situations_to_json_file(situations, output_folder) - reread_situations: List[TrafficSituation] = read_generated_situation_files(output_folder) + reread_situations: list[TrafficSituation] = read_generated_situation_files(output_folder) assert len(situations) == len(reread_situations) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..f743b53 --- /dev/null +++ b/uv.lock @@ -0,0 +1,2911 @@ +version = 1 +requires-python = ">=3.10" + +[[package]] +name = "alabaster" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929 }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, +] + +[[package]] +name = "anyio" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, +] + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argon2-cffi-bindings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/31/fa/57ec2c6d16ecd2ba0cf15f3c7d1c3c2e7b5fcb83555ff56d7ab10888ec8f/argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", size = 42798 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea", size = 15124 }, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658 }, + { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583 }, + { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168 }, + { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709 }, + { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613 }, + { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583 }, + { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475 }, + { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698 }, + { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817 }, + { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104 }, +] + +[[package]] +name = "arrow" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, + { name = "types-python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/00/0f6e8fcdb23ea632c866620cc872729ff43ed91d284c866b515c6342b173/arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85", size = 131960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419 }, +] + +[[package]] +name = "asttokens" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, +] + +[[package]] +name = "async-lru" +version = "2.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/e2/2b4651eff771f6fd900d233e175ddc5e2be502c7eb62c0c42f975c6d36cd/async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627", size = 10019 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/9f/3c3503693386c4b0f245eaf5ca6198e3b28879ca0a40bde6b0e319793453/async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224", size = 6111 }, +] + +[[package]] +name = "attrs" +version = "24.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/48/c8/6260f8ccc11f0917360fc0da435c5c9c7504e3db174d5a12a1494887b045/attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", size = 805984 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/aa/ab0f7891a01eeb2d2e338ae8fecbe57fcebea1a24dbb64d45801bfab481d/attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308", size = 63397 }, +] + +[[package]] +name = "babel" +version = "2.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/74/f1bc80f23eeba13393b7222b11d95ca3af2c1e28edca18af487137eefed9/babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316", size = 9348104 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", size = 9587599 }, +] + +[[package]] +name = "basemap" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "basemap-data" }, + { name = "matplotlib" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyproj" }, + { name = "pyshp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/63/f3a5e74a8a31c20ea785ebd0fc1a9e680a9f1c5ac9ab4888f349ef9a3165/basemap-1.4.1.zip", hash = "sha256:6822d3d08c11cdc443e3ed01d61d512e7cf62d4b40bbc1d235f0a898f2c54a7a", size = 167398 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/dd/11376f7c1437b91612f389a4fa33cab636e02d16a256dd6ecb74ac5261b2/basemap-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8786f23e3f456ab402b8160efb7b8b1c3780d6b84154dfcfdcd3f0401ef3285", size = 623524 }, + { url = "https://files.pythonhosted.org/packages/db/46/ea479f53a880f99d8758f6e4e72ce0c020f00211a70ff16dc5bfe77494dc/basemap-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:22793cf731d6cc06e11cf2760fd2875cd18b2980ce1c5ba15f6ebd9e224b1a1d", size = 569011 }, + { url = "https://files.pythonhosted.org/packages/48/dc/75a162c27053e7470474be827c02d5ea8c25b9f9ca2e1b823b4480d5ce84/basemap-1.4.1-cp310-cp310-manylinux1_i686.whl", hash = "sha256:8818fbb5e1133f0955a62ea159a3792124fc06f9b37ea4427612f6def923b711", size = 922385 }, + { url = "https://files.pythonhosted.org/packages/31/c0/640b7a056671d51453b4685cf4c10f2bbe7326c3c9d301a2358b8889887b/basemap-1.4.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:650e9b2170579193cb89bea2c328740fc13c0327b8ea55173490f760d0f04f8c", size = 935998 }, + { url = "https://files.pythonhosted.org/packages/b3/73/38a2be36571f61d9bb3e9a25c4be119c1a314bc06be31f2492aed0de9dc5/basemap-1.4.1-cp310-cp310-win32.whl", hash = "sha256:2e198e442bae7ad0d25f529788fcb5802192d844d856fa966f6018a46648a375", size = 402690 }, + { url = "https://files.pythonhosted.org/packages/c9/a8/ed7ca0f4ef0aa4872b2b705c25c25f13fe9e70a41aea773ac34888cf8c62/basemap-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:91d03458343d73f6a5e4d42e79df59cf57eba699094b71ce7c57ec40c8de9f59", size = 507061 }, + { url = "https://files.pythonhosted.org/packages/58/ab/a93ccacdde434d00d2f9e08c8ecf62df0c50cf0ce3c1b819f3ca3fea6c2f/basemap-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:509bb451ce26f1f7651cc19d27ef049935304c7795a141cfbe05582802554226", size = 623678 }, + { url = "https://files.pythonhosted.org/packages/73/92/f0bf706ef07c503d20a7cc0863b66e5db418680fdaca94dc2cac537423cd/basemap-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6860ab68a461cd36b6eda5d3973bfa1e3a4fdeaf608e8dd4b324b08e8561eed", size = 569118 }, + { url = "https://files.pythonhosted.org/packages/e6/e2/0932c15c6bae2100a262506830358a1dfb3c2c82671e4094cc8f2b6d5104/basemap-1.4.1-cp311-cp311-manylinux1_i686.whl", hash = "sha256:500a3d314166057d0b3c065e63147042c996ead1af5d59e319f813b83d4ea220", size = 936489 }, + { url = "https://files.pythonhosted.org/packages/0c/d3/72c1ed71fb5fd283f96696efb5d8d100f1a3c434e0d5e53c5d9b3ed9793e/basemap-1.4.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:6e0a13ba17ca011c55db44fab9210363154bc67482776d3b149a3ef1b4b01bad", size = 942421 }, + { url = "https://files.pythonhosted.org/packages/c0/dd/90a5817723353b45d7a82cce5d9ba15f5024afb4c437c59133230f5bebd5/basemap-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e6b8430a4f73485fcdb766cd2acb9e766cdacc67adca7757e7a2915b685d8461", size = 402504 }, + { url = "https://files.pythonhosted.org/packages/36/91/c3bf3ef6eacdb7cae204f3b440b7810ecbb30a4067457310d2544c6a5b14/basemap-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:c4d80330f00728acfd88be78e0485fd688984db873853f9c75647ec78e653203", size = 507324 }, + { url = "https://files.pythonhosted.org/packages/90/05/a58c9ee0e6335671417843c2421a0f8940a2a1456157b1cd91ebd7e8da79/basemap-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51a5e8f2183e7505f4dfbb965048348c2f1e501283b13ad9950409c3da9655f6", size = 624979 }, + { url = "https://files.pythonhosted.org/packages/a8/26/04d6fe6208ad022745347d7b66a26a6671e9a054ce558465c6b96fe60feb/basemap-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f99f3da41fc3e6bfb726f0fbd3302939a3b03e353ccd2be5ebd7bc09b84c386", size = 569896 }, + { url = "https://files.pythonhosted.org/packages/1c/ff/cbd7431d4a97b48445808f5ffd21f80f69e01edfb701affab4d7f72a4214/basemap-1.4.1-cp312-cp312-manylinux1_i686.whl", hash = "sha256:20644986a63d57c9d94afb8aba180d5362c1bd08d61d4537aa6221a70e3df762", size = 943278 }, + { url = "https://files.pythonhosted.org/packages/d7/ee/5908870dab84ea5c3f3f29b665a6042d8a461cfd315c701c02d10d607ef0/basemap-1.4.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:b64f000374a41bf19ac8f8b39cbd2a3b244c79673cd686c9eb507c19daef9e78", size = 950333 }, + { url = "https://files.pythonhosted.org/packages/31/46/c083b25568bcb119080602a4422f5f3eec663dbd8dd627f0c5be3d0e3fa8/basemap-1.4.1-cp312-cp312-win32.whl", hash = "sha256:84918a6e030adc9aedee92fe622adde8b54cc81051a6ce6723c04987081d92f4", size = 403000 }, + { url = "https://files.pythonhosted.org/packages/7f/ab/caf597d36e4ab9e5b3302d9fdeea4d652b002e314c617cb3a36bcf070f97/basemap-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff588f63f35d0b58607c9642cc2cf68967b464ee7aa27a6d87db2ec8edc910e2", size = 507602 }, +] + +[[package]] +name = "basemap-data" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/45/f6/efc358bb1ed930cb06a45934ac128c6869cdcb9c1c57679d1d9ac9f99241/basemap_data-1.3.2.zip", hash = "sha256:0072efd6f12c76e9f35e8fd718360d634b849ba988e74acccaf1ec536275f70b", size = 30540081 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/c3/63fdb885308c999206c7a497d79a50891581626da7dc491d432d2732bb46/basemap_data-1.3.2-py2.py3-none-any.whl", hash = "sha256:26e794556c496b26f7714658cdbea5c68cb47d6a8a9fb0e674844fa89c56fc59", size = 30535486 }, +] + +[[package]] +name = "basemap-data-hires" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/aa/092b3efff3f425c33edb64dbb604bb0958fff8724d634e551b402ace6cce/basemap_data_hires-1.3.2.zip", hash = "sha256:0982eb95b2066ccbe10b6580bcd9c597e3a4e25016bf25afb65e1a96f6e3e97d", size = 91064505 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/3a/4a975fc74b63e2d494e236ba70fe765151bf0adad758ad40e4cf4ecf2310/basemap_data_hires-1.3.2-py2.py3-none-any.whl", hash = "sha256:39c14c865f8b89c4254d68165a36f1d34dece9366b6cd344692ec02001df956e", size = 91059959 }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 }, +] + +[[package]] +name = "bleach" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406 }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + +[[package]] +name = "branca" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e8/1d/bec5cb6669b7bf98b632b20bbbb25200bdc44298e7a39d588b0028a78300/branca-0.8.1.tar.gz", hash = "sha256:ac397c2d79bd13af0d04193b26d5ed17031d27609a7f1fab50c438b8ae712390", size = 27743 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/9d/91cddd38bd00170aad1a4b198c47b4ed716be45c234e09b835af41f4e717/branca-0.8.1-py3-none-any.whl", hash = "sha256:d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425", size = 26071 }, +] + +[[package]] +name = "certifi" +version = "2024.12.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, +] + +[[package]] +name = "cffi" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, + { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, + { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, + { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, + { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, + { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, + { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, + { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, + { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, + { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, + { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, + { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +] + +[[package]] +name = "cfgv" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/58/5580c1716040bc89206c77d8f74418caf82ce519aae06450393ca73475d1/charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", size = 198013 }, + { url = "https://files.pythonhosted.org/packages/d0/11/00341177ae71c6f5159a08168bcb98c6e6d196d372c94511f9f6c9afe0c6/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", size = 141285 }, + { url = "https://files.pythonhosted.org/packages/01/09/11d684ea5819e5a8f5100fb0b38cf8d02b514746607934134d31233e02c8/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", size = 151449 }, + { url = "https://files.pythonhosted.org/packages/08/06/9f5a12939db324d905dc1f70591ae7d7898d030d7662f0d426e2286f68c9/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", size = 143892 }, + { url = "https://files.pythonhosted.org/packages/93/62/5e89cdfe04584cb7f4d36003ffa2936681b03ecc0754f8e969c2becb7e24/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", size = 146123 }, + { url = "https://files.pythonhosted.org/packages/a9/ac/ab729a15c516da2ab70a05f8722ecfccc3f04ed7a18e45c75bbbaa347d61/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", size = 147943 }, + { url = "https://files.pythonhosted.org/packages/03/d2/3f392f23f042615689456e9a274640c1d2e5dd1d52de36ab8f7955f8f050/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", size = 142063 }, + { url = "https://files.pythonhosted.org/packages/f2/e3/e20aae5e1039a2cd9b08d9205f52142329f887f8cf70da3650326670bddf/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", size = 150578 }, + { url = "https://files.pythonhosted.org/packages/8d/af/779ad72a4da0aed925e1139d458adc486e61076d7ecdcc09e610ea8678db/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", size = 153629 }, + { url = "https://files.pythonhosted.org/packages/c2/b6/7aa450b278e7aa92cf7732140bfd8be21f5f29d5bf334ae987c945276639/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", size = 150778 }, + { url = "https://files.pythonhosted.org/packages/39/f4/d9f4f712d0951dcbfd42920d3db81b00dd23b6ab520419626f4023334056/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", size = 146453 }, + { url = "https://files.pythonhosted.org/packages/49/2b/999d0314e4ee0cff3cb83e6bc9aeddd397eeed693edb4facb901eb8fbb69/charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", size = 95479 }, + { url = "https://files.pythonhosted.org/packages/2d/ce/3cbed41cff67e455a386fb5e5dd8906cdda2ed92fbc6297921f2e4419309/charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", size = 102790 }, + { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, + { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, + { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, + { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, + { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, + { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, + { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, + { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, + { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, + { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, + { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, + { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, + { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, + { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, + { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, + { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, + { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, + { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, + { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, + { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, + { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, + { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, + { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, + { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, + { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, + { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +] + +[[package]] +name = "click" +version = "8.1.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, +] + +[[package]] +name = "click-log" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/32/228be4f971e4bd556c33d52a22682bfe318ffe57a1ddb7a546f347a90260/click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975", size = 9985 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756", size = 4273 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "comm" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, +] + +[[package]] +name = "contourpy" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/c2/fc7193cc5383637ff390a712e88e4ded0452c9fbcf84abe3de5ea3df1866/contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", size = 13465753 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/80937fe3efe0edacf67c9a20b955139a1a622730042c1ea991956f2704ad/contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab", size = 268466 }, + { url = "https://files.pythonhosted.org/packages/82/1d/e3eaebb4aa2d7311528c048350ca8e99cdacfafd99da87bc0a5f8d81f2c2/contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124", size = 253314 }, + { url = "https://files.pythonhosted.org/packages/de/f3/d796b22d1a2b587acc8100ba8c07fb7b5e17fde265a7bb05ab967f4c935a/contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1", size = 312003 }, + { url = "https://files.pythonhosted.org/packages/bf/f5/0e67902bc4394daee8daa39c81d4f00b50e063ee1a46cb3938cc65585d36/contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b", size = 351896 }, + { url = "https://files.pythonhosted.org/packages/1f/d6/e766395723f6256d45d6e67c13bb638dd1fa9dc10ef912dc7dd3dcfc19de/contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453", size = 320814 }, + { url = "https://files.pythonhosted.org/packages/a9/57/86c500d63b3e26e5b73a28b8291a67c5608d4aa87ebd17bd15bb33c178bc/contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3", size = 324969 }, + { url = "https://files.pythonhosted.org/packages/b8/62/bb146d1289d6b3450bccc4642e7f4413b92ebffd9bf2e91b0404323704a7/contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277", size = 1265162 }, + { url = "https://files.pythonhosted.org/packages/18/04/9f7d132ce49a212c8e767042cc80ae390f728060d2eea47058f55b9eff1c/contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595", size = 1324328 }, + { url = "https://files.pythonhosted.org/packages/46/23/196813901be3f97c83ababdab1382e13e0edc0bb4e7b49a7bff15fcf754e/contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697", size = 173861 }, + { url = "https://files.pythonhosted.org/packages/e0/82/c372be3fc000a3b2005061ca623a0d1ecd2eaafb10d9e883a2fc8566e951/contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e", size = 218566 }, + { url = "https://files.pythonhosted.org/packages/12/bb/11250d2906ee2e8b466b5f93e6b19d525f3e0254ac8b445b56e618527718/contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b", size = 269555 }, + { url = "https://files.pythonhosted.org/packages/67/71/1e6e95aee21a500415f5d2dbf037bf4567529b6a4e986594d7026ec5ae90/contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc", size = 254549 }, + { url = "https://files.pythonhosted.org/packages/31/2c/b88986e8d79ac45efe9d8801ae341525f38e087449b6c2f2e6050468a42c/contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86", size = 313000 }, + { url = "https://files.pythonhosted.org/packages/c4/18/65280989b151fcf33a8352f992eff71e61b968bef7432fbfde3a364f0730/contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6", size = 352925 }, + { url = "https://files.pythonhosted.org/packages/f5/c7/5fd0146c93220dbfe1a2e0f98969293b86ca9bc041d6c90c0e065f4619ad/contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85", size = 323693 }, + { url = "https://files.pythonhosted.org/packages/85/fc/7fa5d17daf77306840a4e84668a48ddff09e6bc09ba4e37e85ffc8e4faa3/contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c", size = 326184 }, + { url = "https://files.pythonhosted.org/packages/ef/e7/104065c8270c7397c9571620d3ab880558957216f2b5ebb7e040f85eeb22/contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291", size = 1268031 }, + { url = "https://files.pythonhosted.org/packages/e2/4a/c788d0bdbf32c8113c2354493ed291f924d4793c4a2e85b69e737a21a658/contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f", size = 1325995 }, + { url = "https://files.pythonhosted.org/packages/a6/e6/a2f351a90d955f8b0564caf1ebe4b1451a3f01f83e5e3a414055a5b8bccb/contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375", size = 174396 }, + { url = "https://files.pythonhosted.org/packages/a8/7e/cd93cab453720a5d6cb75588cc17dcdc08fc3484b9de98b885924ff61900/contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9", size = 219787 }, + { url = "https://files.pythonhosted.org/packages/37/6b/175f60227d3e7f5f1549fcb374592be311293132207e451c3d7c654c25fb/contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509", size = 271494 }, + { url = "https://files.pythonhosted.org/packages/6b/6a/7833cfae2c1e63d1d8875a50fd23371394f540ce809d7383550681a1fa64/contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc", size = 255444 }, + { url = "https://files.pythonhosted.org/packages/7f/b3/7859efce66eaca5c14ba7619791b084ed02d868d76b928ff56890d2d059d/contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454", size = 307628 }, + { url = "https://files.pythonhosted.org/packages/48/b2/011415f5e3f0a50b1e285a0bf78eb5d92a4df000553570f0851b6e309076/contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80", size = 347271 }, + { url = "https://files.pythonhosted.org/packages/84/7d/ef19b1db0f45b151ac78c65127235239a8cf21a59d1ce8507ce03e89a30b/contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec", size = 318906 }, + { url = "https://files.pythonhosted.org/packages/ba/99/6794142b90b853a9155316c8f470d2e4821fe6f086b03e372aca848227dd/contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9", size = 323622 }, + { url = "https://files.pythonhosted.org/packages/3c/0f/37d2c84a900cd8eb54e105f4fa9aebd275e14e266736778bb5dccbf3bbbb/contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b", size = 1266699 }, + { url = "https://files.pythonhosted.org/packages/3a/8a/deb5e11dc7d9cc8f0f9c8b29d4f062203f3af230ba83c30a6b161a6effc9/contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d", size = 1326395 }, + { url = "https://files.pythonhosted.org/packages/1a/35/7e267ae7c13aaf12322ccc493531f1e7f2eb8fba2927b9d7a05ff615df7a/contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e", size = 175354 }, + { url = "https://files.pythonhosted.org/packages/a1/35/c2de8823211d07e8a79ab018ef03960716c5dff6f4d5bff5af87fd682992/contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d", size = 220971 }, + { url = "https://files.pythonhosted.org/packages/9a/e7/de62050dce687c5e96f946a93546910bc67e483fe05324439e329ff36105/contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2", size = 271548 }, + { url = "https://files.pythonhosted.org/packages/78/4d/c2a09ae014ae984c6bdd29c11e74d3121b25eaa117eca0bb76340efd7e1c/contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5", size = 255576 }, + { url = "https://files.pythonhosted.org/packages/ab/8a/915380ee96a5638bda80cd061ccb8e666bfdccea38d5741cb69e6dbd61fc/contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81", size = 306635 }, + { url = "https://files.pythonhosted.org/packages/29/5c/c83ce09375428298acd4e6582aeb68b1e0d1447f877fa993d9bf6cd3b0a0/contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2", size = 345925 }, + { url = "https://files.pythonhosted.org/packages/29/63/5b52f4a15e80c66c8078a641a3bfacd6e07106835682454647aca1afc852/contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7", size = 318000 }, + { url = "https://files.pythonhosted.org/packages/9a/e2/30ca086c692691129849198659bf0556d72a757fe2769eb9620a27169296/contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c", size = 322689 }, + { url = "https://files.pythonhosted.org/packages/6b/77/f37812ef700f1f185d348394debf33f22d531e714cf6a35d13d68a7003c7/contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3", size = 1268413 }, + { url = "https://files.pythonhosted.org/packages/3f/6d/ce84e79cdd128542ebeb268f84abb4b093af78e7f8ec504676673d2675bc/contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1", size = 1326530 }, + { url = "https://files.pythonhosted.org/packages/72/22/8282f4eae20c73c89bee7a82a19c4e27af9b57bb602ecaa00713d5bdb54d/contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82", size = 175315 }, + { url = "https://files.pythonhosted.org/packages/e3/d5/28bca491f65312b438fbf076589dcde7f6f966b196d900777f5811b9c4e2/contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd", size = 220987 }, + { url = "https://files.pythonhosted.org/packages/2f/24/a4b285d6adaaf9746e4700932f579f1a7b6f9681109f694cfa233ae75c4e/contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30", size = 285001 }, + { url = "https://files.pythonhosted.org/packages/48/1d/fb49a401b5ca4f06ccf467cd6c4f1fd65767e63c21322b29b04ec40b40b9/contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751", size = 268553 }, + { url = "https://files.pythonhosted.org/packages/79/1e/4aef9470d13fd029087388fae750dccb49a50c012a6c8d1d634295caa644/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342", size = 310386 }, + { url = "https://files.pythonhosted.org/packages/b0/34/910dc706ed70153b60392b5305c708c9810d425bde12499c9184a1100888/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c", size = 349806 }, + { url = "https://files.pythonhosted.org/packages/31/3c/faee6a40d66d7f2a87f7102236bf4780c57990dd7f98e5ff29881b1b1344/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f", size = 321108 }, + { url = "https://files.pythonhosted.org/packages/17/69/390dc9b20dd4bb20585651d7316cc3054b7d4a7b4f8b710b2b698e08968d/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda", size = 327291 }, + { url = "https://files.pythonhosted.org/packages/ef/74/7030b67c4e941fe1e5424a3d988080e83568030ce0355f7c9fc556455b01/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242", size = 1263752 }, + { url = "https://files.pythonhosted.org/packages/f0/ed/92d86f183a8615f13f6b9cbfc5d4298a509d6ce433432e21da838b4b63f4/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1", size = 1318403 }, + { url = "https://files.pythonhosted.org/packages/b3/0e/c8e4950c77dcfc897c71d61e56690a0a9df39543d2164040301b5df8e67b/contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1", size = 185117 }, + { url = "https://files.pythonhosted.org/packages/c1/31/1ae946f11dfbd229222e6d6ad8e7bd1891d3d48bde5fbf7a0beb9491f8e3/contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546", size = 236668 }, + { url = "https://files.pythonhosted.org/packages/3e/4f/e56862e64b52b55b5ddcff4090085521fc228ceb09a88390a2b103dccd1b/contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6", size = 265605 }, + { url = "https://files.pythonhosted.org/packages/b0/2e/52bfeeaa4541889f23d8eadc6386b442ee2470bd3cff9baa67deb2dd5c57/contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750", size = 315040 }, + { url = "https://files.pythonhosted.org/packages/52/94/86bfae441707205634d80392e873295652fc313dfd93c233c52c4dc07874/contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53", size = 218221 }, +] + +[[package]] +name = "coverage" +version = "7.6.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/12/2a2a923edf4ddabdffed7ad6da50d96a5c126dae7b80a33df7310e329a1e/coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", size = 207982 }, + { url = "https://files.pythonhosted.org/packages/ca/49/6985dbca9c7be3f3cb62a2e6e492a0c88b65bf40579e16c71ae9c33c6b23/coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", size = 208414 }, + { url = "https://files.pythonhosted.org/packages/35/93/287e8f1d1ed2646f4e0b2605d14616c9a8a2697d0d1b453815eb5c6cebdb/coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", size = 236860 }, + { url = "https://files.pythonhosted.org/packages/de/e1/cfdb5627a03567a10031acc629b75d45a4ca1616e54f7133ca1fa366050a/coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", size = 234758 }, + { url = "https://files.pythonhosted.org/packages/6d/85/fc0de2bcda3f97c2ee9fe8568f7d48f7279e91068958e5b2cc19e0e5f600/coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", size = 235920 }, + { url = "https://files.pythonhosted.org/packages/79/73/ef4ea0105531506a6f4cf4ba571a214b14a884630b567ed65b3d9c1975e1/coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", size = 234986 }, + { url = "https://files.pythonhosted.org/packages/c6/4d/75afcfe4432e2ad0405c6f27adeb109ff8976c5e636af8604f94f29fa3fc/coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", size = 233446 }, + { url = "https://files.pythonhosted.org/packages/86/5b/efee56a89c16171288cafff022e8af44f8f94075c2d8da563c3935212871/coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", size = 234566 }, + { url = "https://files.pythonhosted.org/packages/f2/db/67770cceb4a64d3198bf2aa49946f411b85ec6b0a9b489e61c8467a4253b/coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", size = 210675 }, + { url = "https://files.pythonhosted.org/packages/8d/27/e8bfc43f5345ec2c27bc8a1fa77cdc5ce9dcf954445e11f14bb70b889d14/coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", size = 211518 }, + { url = "https://files.pythonhosted.org/packages/85/d2/5e175fcf6766cf7501a8541d81778fd2f52f4870100e791f5327fd23270b/coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", size = 208088 }, + { url = "https://files.pythonhosted.org/packages/4b/6f/06db4dc8fca33c13b673986e20e466fd936235a6ec1f0045c3853ac1b593/coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", size = 208536 }, + { url = "https://files.pythonhosted.org/packages/0d/62/c6a0cf80318c1c1af376d52df444da3608eafc913b82c84a4600d8349472/coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", size = 240474 }, + { url = "https://files.pythonhosted.org/packages/a3/59/750adafc2e57786d2e8739a46b680d4fb0fbc2d57fbcb161290a9f1ecf23/coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", size = 237880 }, + { url = "https://files.pythonhosted.org/packages/2c/f8/ef009b3b98e9f7033c19deb40d629354aab1d8b2d7f9cfec284dbedf5096/coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", size = 239750 }, + { url = "https://files.pythonhosted.org/packages/a6/e2/6622f3b70f5f5b59f705e680dae6db64421af05a5d1e389afd24dae62e5b/coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", size = 238642 }, + { url = "https://files.pythonhosted.org/packages/2d/10/57ac3f191a3c95c67844099514ff44e6e19b2915cd1c22269fb27f9b17b6/coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", size = 237266 }, + { url = "https://files.pythonhosted.org/packages/ee/2d/7016f4ad9d553cabcb7333ed78ff9d27248ec4eba8dd21fa488254dff894/coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", size = 238045 }, + { url = "https://files.pythonhosted.org/packages/a7/fe/45af5c82389a71e0cae4546413266d2195c3744849669b0bab4b5f2c75da/coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", size = 210647 }, + { url = "https://files.pythonhosted.org/packages/db/11/3f8e803a43b79bc534c6a506674da9d614e990e37118b4506faf70d46ed6/coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", size = 211508 }, + { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 }, + { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 }, + { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 }, + { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 }, + { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 }, + { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 }, + { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 }, + { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 }, + { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 }, + { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 }, + { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 }, + { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 }, + { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 }, + { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 }, + { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 }, + { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 }, + { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 }, + { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 }, + { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 }, + { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 }, + { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 }, + { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 }, + { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 }, + { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 }, + { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 }, + { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 }, + { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 }, + { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, + { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, + { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, + { url = "https://files.pythonhosted.org/packages/a1/70/de81bfec9ed38a64fc44a77c7665e20ca507fc3265597c28b0d989e4082e/coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f", size = 200223 }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, +] + +[[package]] +name = "debugpy" +version = "1.8.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/e7/666f4c9b0e24796af50aadc28d36d21c2e01e831a934535f956e09b3650c/debugpy-1.8.11.tar.gz", hash = "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57", size = 1640124 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/e6/4cf7422eaa591b4c7d6a9fde224095dac25283fdd99d90164f28714242b0/debugpy-1.8.11-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:2b26fefc4e31ff85593d68b9022e35e8925714a10ab4858fb1b577a8a48cb8cd", size = 2075100 }, + { url = "https://files.pythonhosted.org/packages/83/3a/e163de1df5995d95760a4d748b02fbefb1c1bf19e915b664017c40435dbf/debugpy-1.8.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61bc8b3b265e6949855300e84dc93d02d7a3a637f2aec6d382afd4ceb9120c9f", size = 3559724 }, + { url = "https://files.pythonhosted.org/packages/27/6c/327e19fd1bf428a1efe1a6f97b306689c54c2cebcf871b66674ead718756/debugpy-1.8.11-cp310-cp310-win32.whl", hash = "sha256:c928bbf47f65288574b78518449edaa46c82572d340e2750889bbf8cd92f3737", size = 5178068 }, + { url = "https://files.pythonhosted.org/packages/49/80/359ff8aa388f0bd4a48f0fa9ce3606396d576657ac149c6fba3cc7de8adb/debugpy-1.8.11-cp310-cp310-win_amd64.whl", hash = "sha256:8da1db4ca4f22583e834dcabdc7832e56fe16275253ee53ba66627b86e304da1", size = 5210109 }, + { url = "https://files.pythonhosted.org/packages/7c/58/8e3f7ec86c1b7985a232667b5df8f3b1b1c8401028d8f4d75e025c9556cd/debugpy-1.8.11-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:85de8474ad53ad546ff1c7c7c89230db215b9b8a02754d41cb5a76f70d0be296", size = 2173656 }, + { url = "https://files.pythonhosted.org/packages/d2/03/95738a68ade2358e5a4d63a2fd8e7ed9ad911001cfabbbb33a7f81343945/debugpy-1.8.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ffc382e4afa4aee367bf413f55ed17bd91b191dcaf979890af239dda435f2a1", size = 3132464 }, + { url = "https://files.pythonhosted.org/packages/ca/f4/18204891ab67300950615a6ad09b9de236203a9138f52b3b596fa17628ca/debugpy-1.8.11-cp311-cp311-win32.whl", hash = "sha256:40499a9979c55f72f4eb2fc38695419546b62594f8af194b879d2a18439c97a9", size = 5103637 }, + { url = "https://files.pythonhosted.org/packages/3b/90/3775e301cfa573b51eb8a108285681f43f5441dc4c3916feed9f386ef861/debugpy-1.8.11-cp311-cp311-win_amd64.whl", hash = "sha256:987bce16e86efa86f747d5151c54e91b3c1e36acc03ce1ddb50f9d09d16ded0e", size = 5127862 }, + { url = "https://files.pythonhosted.org/packages/c6/ae/2cf26f3111e9d94384d9c01e9d6170188b0aeda15b60a4ac6457f7c8a26f/debugpy-1.8.11-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308", size = 2498756 }, + { url = "https://files.pythonhosted.org/packages/b0/16/ec551789d547541a46831a19aa15c147741133da188e7e6acf77510545a7/debugpy-1.8.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768", size = 4219136 }, + { url = "https://files.pythonhosted.org/packages/72/6f/b2b3ce673c55f882d27a6eb04a5f0c68bcad6b742ac08a86d8392ae58030/debugpy-1.8.11-cp312-cp312-win32.whl", hash = "sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b", size = 5224440 }, + { url = "https://files.pythonhosted.org/packages/77/09/b1f05be802c1caef5b3efc042fc6a7cadd13d8118b072afd04a9b9e91e06/debugpy-1.8.11-cp312-cp312-win_amd64.whl", hash = "sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1", size = 5264578 }, + { url = "https://files.pythonhosted.org/packages/2e/66/931dc2479aa8fbf362dc6dcee707d895a84b0b2d7b64020135f20b8db1ed/debugpy-1.8.11-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3", size = 2483651 }, + { url = "https://files.pythonhosted.org/packages/10/07/6c171d0fe6b8d237e35598b742f20ba062511b3a4631938cc78eefbbf847/debugpy-1.8.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e", size = 4213770 }, + { url = "https://files.pythonhosted.org/packages/89/f1/0711da6ac250d4fe3bf7b3e9b14b4a86e82a98b7825075c07e19bab8da3d/debugpy-1.8.11-cp313-cp313-win32.whl", hash = "sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28", size = 5223911 }, + { url = "https://files.pythonhosted.org/packages/56/98/5e27fa39050749ed460025bcd0034a0a5e78a580a14079b164cc3abdeb98/debugpy-1.8.11-cp313-cp313-win_amd64.whl", hash = "sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1", size = 5264166 }, + { url = "https://files.pythonhosted.org/packages/77/0a/d29a5aacf47b4383ed569b8478c02d59ee3a01ad91224d2cff8562410e43/debugpy-1.8.11-py2.py3-none-any.whl", hash = "sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920", size = 5226874 }, +] + +[[package]] +name = "decorator" +version = "5.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, +] + +[[package]] +name = "dictio" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema" }, + { name = "lxml" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/d6/afa4be318fdd3ea287dd4300145d505646732ea712717ed3a342d3af06cf/dictio-0.4.0.tar.gz", hash = "sha256:c637ed257923c8f3991b8fccb7c103d9240512ccb60322b5f43a76203f450487", size = 95732 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/59/9921cc5fd537572bbd88ac6ab2a0b6bac0ea8f3fd200934f7a310dcecf0c/dictio-0.4.0-py3-none-any.whl", hash = "sha256:460a0b03f19a0eb68d4455407e416c457a5068f1b06f8c522c44a4fe7a207145", size = 59421 }, +] + +[[package]] +name = "distlib" +version = "0.3.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, +] + +[[package]] +name = "docutils" +version = "0.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, +] + +[[package]] +name = "executing" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/e3/7d45f492c2c4a0e8e0fad57d081a7c8a0286cdd86372b070cca1ec0caa1e/executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab", size = 977485 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", size = 25805 }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924 }, +] + +[[package]] +name = "filelock" +version = "3.16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, +] + +[[package]] +name = "folium" +version = "0.19.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "branca" }, + { name = "jinja2" }, + { name = "numpy" }, + { name = "requests" }, + { name = "xyzservices" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/09/469cbe217cddc0cb11542fa38f50014e548b2dda010f67185b0579885cd6/folium-0.19.4.tar.gz", hash = "sha256:431a655b52a9bf3efda336f2be022103f0106504a0599e7c349efbfd30bafda6", size = 105936 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/ab/d1f47c48a14e17cd487c8b467b573291fae75477b067241407e7889a3692/folium-0.19.4-py2.py3-none-any.whl", hash = "sha256:bea5246b6a6aa61b96d1c51399dd63254bacbd6ba8a826eeb491f45242032dfd", size = 110511 }, +] + +[[package]] +name = "fonttools" +version = "4.55.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/61/a300d1574dc381393424047c0396a0e213db212e28361123af9830d71a8d/fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45", size = 3498155 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/f3/9ac8c6705e4a0ff3c29e524df1caeee6f2987b02fb630129f21cc99a8212/fonttools-4.55.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1dcc07934a2165ccdc3a5a608db56fb3c24b609658a5b340aee4ecf3ba679dc0", size = 2769857 }, + { url = "https://files.pythonhosted.org/packages/d8/24/e8b8edd280bdb7d0ecc88a5d952b1dec2ee2335be71cc5a33c64871cdfe8/fonttools-4.55.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f7d66c15ba875432a2d2fb419523f5d3d347f91f48f57b8b08a2dfc3c39b8a3f", size = 2299705 }, + { url = "https://files.pythonhosted.org/packages/f8/9e/e1ba20bd3b71870207fd45ca3b90208a7edd8ae3b001081dc31c45adb017/fonttools-4.55.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e4ae3592e62eba83cd2c4ccd9462dcfa603ff78e09110680a5444c6925d841", size = 4576104 }, + { url = "https://files.pythonhosted.org/packages/34/db/d423bc646e6703fe3e6aea0edd22a2df47b9d188c5f7f1b49070be4d2205/fonttools-4.55.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d65a3022c35e404d19ca14f291c89cc5890032ff04f6c17af0bd1927299674", size = 4618282 }, + { url = "https://files.pythonhosted.org/packages/75/a0/e5062ac960a385b984ba74e7b55132e7f2c65e449e8330ab0f595407a3de/fonttools-4.55.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d342e88764fb201286d185093781bf6628bbe380a913c24adf772d901baa8276", size = 4570539 }, + { url = "https://files.pythonhosted.org/packages/1f/33/0d744ff518ebe50020b63e5018b8b278efd6a930c1d2eedda7defc42153b/fonttools-4.55.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dd68c87a2bfe37c5b33bcda0fba39b65a353876d3b9006fde3adae31f97b3ef5", size = 4742411 }, + { url = "https://files.pythonhosted.org/packages/7e/6c/2f768652dba6b801f1567fc5d1829cda369bcd6e95e315a91e628f91c702/fonttools-4.55.3-cp310-cp310-win32.whl", hash = "sha256:1bc7ad24ff98846282eef1cbeac05d013c2154f977a79886bb943015d2b1b261", size = 2175132 }, + { url = "https://files.pythonhosted.org/packages/19/d1/4dcd865360fb2c499749a913fe80e41c26e8ae18629d87dfffa3de27e831/fonttools-4.55.3-cp310-cp310-win_amd64.whl", hash = "sha256:b54baf65c52952db65df39fcd4820668d0ef4766c0ccdf32879b77f7c804d5c5", size = 2219430 }, + { url = "https://files.pythonhosted.org/packages/4b/18/14be25545600bd100e5b74a3ac39089b7c1cb403dc513b7ca348be3381bf/fonttools-4.55.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c4491699bad88efe95772543cd49870cf756b019ad56294f6498982408ab03e", size = 2771005 }, + { url = "https://files.pythonhosted.org/packages/b2/51/2e1a5d3871cd7c2ae2054b54e92604e7d6abc3fd3656e9583c399648fe1c/fonttools-4.55.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5323a22eabddf4b24f66d26894f1229261021dacd9d29e89f7872dd8c63f0b8b", size = 2300654 }, + { url = "https://files.pythonhosted.org/packages/73/1a/50109bb2703bc6f774b52ea081db21edf2a9fa4b6d7485faadf9d1b997e9/fonttools-4.55.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5480673f599ad410695ca2ddef2dfefe9df779a9a5cda89503881e503c9c7d90", size = 4877541 }, + { url = "https://files.pythonhosted.org/packages/5d/52/c0b9857fa075da1b8806c5dc2d8342918a8cc2065fd14fbddb3303282693/fonttools-4.55.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da9da6d65cd7aa6b0f806556f4985bcbf603bf0c5c590e61b43aa3e5a0f822d0", size = 4906304 }, + { url = "https://files.pythonhosted.org/packages/0b/1b/55f85c7e962d295e456d5209581c919620ee3e877b95cd86245187a5050f/fonttools-4.55.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e894b5bd60d9f473bed7a8f506515549cc194de08064d829464088d23097331b", size = 4888087 }, + { url = "https://files.pythonhosted.org/packages/83/13/6f2809c612ea2ac51391f92468ff861c63473601530fca96458b453212bf/fonttools-4.55.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aee3b57643827e237ff6ec6d28d9ff9766bd8b21e08cd13bff479e13d4b14765", size = 5056958 }, + { url = "https://files.pythonhosted.org/packages/c1/28/d0ea9e872fa4208b9dfca686e1dd9ca22f6c9ef33ecff2f0ebc2dbe7c29b/fonttools-4.55.3-cp311-cp311-win32.whl", hash = "sha256:eb6ca911c4c17eb51853143624d8dc87cdcdf12a711fc38bf5bd21521e79715f", size = 2173939 }, + { url = "https://files.pythonhosted.org/packages/be/36/d74ae1020bc41a1dff3e6f5a99f646563beecb97e386d27abdac3ba07650/fonttools-4.55.3-cp311-cp311-win_amd64.whl", hash = "sha256:6314bf82c54c53c71805318fcf6786d986461622dd926d92a465199ff54b1b72", size = 2220363 }, + { url = "https://files.pythonhosted.org/packages/89/58/fbcf5dff7e3ea844bb00c4d806ca1e339e1f2dce5529633bf4842c0c9a1f/fonttools-4.55.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9e736f60f4911061235603a6119e72053073a12c6d7904011df2d8fad2c0e35", size = 2765380 }, + { url = "https://files.pythonhosted.org/packages/81/dd/da6e329e51919b4f421c8738f3497e2ab08c168e76aaef7b6d5351862bdf/fonttools-4.55.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a8aa2c5e5b8b3bcb2e4538d929f6589a5c6bdb84fd16e2ed92649fb5454f11c", size = 2297940 }, + { url = "https://files.pythonhosted.org/packages/00/44/f5ee560858425c99ef07e04919e736db09d6416408e5a8d3bbfb4a6623fd/fonttools-4.55.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07f8288aacf0a38d174445fc78377a97fb0b83cfe352a90c9d9c1400571963c7", size = 4793327 }, + { url = "https://files.pythonhosted.org/packages/24/da/0a001926d791c55e29ac3c52964957a20dbc1963615446b568b7432891c3/fonttools-4.55.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8d5e8916c0970fbc0f6f1bece0063363bb5857a7f170121a4493e31c3db3314", size = 4865624 }, + { url = "https://files.pythonhosted.org/packages/3d/d8/1edd8b13a427a9fb6418373437caa586c0caa57f260af8e0548f4d11e340/fonttools-4.55.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae3b6600565b2d80b7c05acb8e24d2b26ac407b27a3f2e078229721ba5698427", size = 4774166 }, + { url = "https://files.pythonhosted.org/packages/9c/ec/ade054097976c3d6debc9032e09a351505a0196aa5493edf021be376f75e/fonttools-4.55.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:54153c49913f45065c8d9e6d0c101396725c5621c8aee744719300f79771d75a", size = 5001832 }, + { url = "https://files.pythonhosted.org/packages/e2/cd/233f0e31ad799bb91fc78099c8b4e5ec43b85a131688519640d6bae46f6a/fonttools-4.55.3-cp312-cp312-win32.whl", hash = "sha256:827e95fdbbd3e51f8b459af5ea10ecb4e30af50221ca103bea68218e9615de07", size = 2162228 }, + { url = "https://files.pythonhosted.org/packages/46/45/a498b5291f6c0d91b2394b1ed7447442a57d1c9b9cf8f439aee3c316a56e/fonttools-4.55.3-cp312-cp312-win_amd64.whl", hash = "sha256:e6e8766eeeb2de759e862004aa11a9ea3d6f6d5ec710551a88b476192b64fd54", size = 2209118 }, + { url = "https://files.pythonhosted.org/packages/9c/9f/00142a19bad96eeeb1aed93f567adc19b7f2c1af6f5bc0a1c3de90b4b1ac/fonttools-4.55.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a430178ad3e650e695167cb53242dae3477b35c95bef6525b074d87493c4bf29", size = 2752812 }, + { url = "https://files.pythonhosted.org/packages/b0/20/14b8250d63ba65e162091fb0dda07730f90c303bbf5257e9ddacec7230d9/fonttools-4.55.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:529cef2ce91dc44f8e407cc567fae6e49a1786f2fefefa73a294704c415322a4", size = 2291521 }, + { url = "https://files.pythonhosted.org/packages/34/47/a681cfd10245eb74f65e491a934053ec75c4af639655446558f29818e45e/fonttools-4.55.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e75f12c82127486fac2d8bfbf5bf058202f54bf4f158d367e41647b972342ca", size = 4770980 }, + { url = "https://files.pythonhosted.org/packages/d2/6c/a7066afc19db0705a12efd812e19c32cde2b9514eb714659522f2ebd60b6/fonttools-4.55.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:859c358ebf41db18fb72342d3080bce67c02b39e86b9fbcf1610cca14984841b", size = 4845534 }, + { url = "https://files.pythonhosted.org/packages/0c/a2/3c204fbabbfd845d9bdcab9ae35279d41e9a4bf5c80a0a2708f9c5a195d6/fonttools-4.55.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:546565028e244a701f73df6d8dd6be489d01617863ec0c6a42fa25bf45d43048", size = 4753910 }, + { url = "https://files.pythonhosted.org/packages/6e/8c/b4cb3592880340b89e4ef6601b531780bba73862332a6451d78fe135d6cb/fonttools-4.55.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:aca318b77f23523309eec4475d1fbbb00a6b133eb766a8bdc401faba91261abe", size = 4976411 }, + { url = "https://files.pythonhosted.org/packages/fc/a8/4bf98840ff89fcc188470b59daec57322178bf36d2f4f756cd19a42a826b/fonttools-4.55.3-cp313-cp313-win32.whl", hash = "sha256:8c5ec45428edaa7022f1c949a632a6f298edc7b481312fc7dc258921e9399628", size = 2160178 }, + { url = "https://files.pythonhosted.org/packages/e6/57/4cc35004605416df3225ff362f3455cf09765db00df578ae9e46d0fefd23/fonttools-4.55.3-cp313-cp313-win_amd64.whl", hash = "sha256:11e5de1ee0d95af4ae23c1a138b184b7f06e0b6abacabf1d0db41c90b03d834b", size = 2206102 }, + { url = "https://files.pythonhosted.org/packages/99/3b/406d17b1f63e04a82aa621936e6e1c53a8c05458abd66300ac85ea7f9ae9/fonttools-4.55.3-py3-none-any.whl", hash = "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977", size = 1111638 }, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121 }, +] + +[[package]] +name = "furo" +version = "2024.8.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "pygments" }, + { name = "sphinx" }, + { name = "sphinx-basic-ng" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333 }, +] + +[[package]] +name = "global-land-mask" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6e/cd/d06fe252cbe41b85c7a1a54e4d4214c79b770eb5d6c6fa3b03e56371a6da/global-land-mask-1.0.0.tar.gz", hash = "sha256:956bf02e8b05bfc9f3a29cbc6e97d5ba4151c0732504acc73c2db9ea325ecff3", size = 1825546 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/e9/eaac67e39b68f64828a164f8dbfcf13baccd7382704ea120152af475f520/global_land_mask-1.0.0-py3-none-any.whl", hash = "sha256:07751fbb4e3834ee508a84ea64d9bd5340fbd0a8c951e24b43c323fcc670bb62", size = 1836944 }, +] + +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + +[[package]] +name = "httpcore" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, +] + +[[package]] +name = "identify" +version = "2.6.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/92/69934b9ef3c31ca2470980423fda3d00f0460ddefdf30a67adf7f17e2e00/identify-2.6.5.tar.gz", hash = "sha256:c10b33f250e5bba374fae86fb57f3adcebf1161bce7cdf92031915fd480c13bc", size = 99213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/fa/dce098f4cdf7621aa8f7b4f919ce545891f489482f0bfa5102f3eca8608b/identify-2.6.5-py2.py3-none-any.whl", hash = "sha256:14181a47091eb75b337af4c23078c9d09225cd4c48929f521f3bf16b09d02566", size = 99078 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, +] + +[[package]] +name = "ipykernel" +version = "6.29.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, +] + +[[package]] +name = "ipython" +version = "8.31.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/35/6f90fdddff7a08b7b715fccbd2427b5212c9525cd043d26fdc45bee0708d/ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b", size = 5501011 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6", size = 821583 }, +] + +[[package]] +name = "ipywidgets" +version = "8.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "comm" }, + { name = "ipython" }, + { name = "jupyterlab-widgets" }, + { name = "traitlets" }, + { name = "widgetsnbextension" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/4c/dab2a281b07596a5fc220d49827fe6c794c66f1493d7a74f1df0640f2cc5/ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17", size = 116723 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245", size = 139767 }, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "arrow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321 }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, +] + +[[package]] +name = "jinja2" +version = "3.1.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, +] + +[[package]] +name = "json5" +version = "0.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/3d/bbe62f3d0c05a689c711cff57b2e3ac3d3e526380adb7c781989f075115c/json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559", size = 48202 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa", size = 34049 }, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, +] + +[package.optional-dependencies] +format-nongpl = [ + { name = "fqdn" }, + { name = "idna" }, + { name = "isoduration" }, + { name = "jsonpointer" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "uri-template" }, + { name = "webcolors" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2024.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 }, +] + +[[package]] +name = "jupyter" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipywidgets" }, + { name = "jupyter-console" }, + { name = "jupyterlab" }, + { name = "nbconvert" }, + { name = "notebook" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657 }, +] + +[[package]] +name = "jupyter-client" +version = "8.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ipykernel" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "pyzmq" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510 }, +] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, +] + +[[package]] +name = "jupyter-events" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonschema", extra = ["format-nongpl"] }, + { name = "python-json-logger" }, + { name = "pyyaml" }, + { name = "referencing" }, + { name = "rfc3339-validator" }, + { name = "rfc3986-validator" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/65/5791c8a979b5646ca29ea50e42b6708908b789f7ff389d1a03c1b93a1c54/jupyter_events-0.11.0.tar.gz", hash = "sha256:c0bc56a37aac29c1fbc3bcfbddb8c8c49533f9cf11f1c4e6adadba936574ab90", size = 62039 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/8c/9b65cb2cd4ea32d885993d5542244641590530836802a2e8c7449a4c61c9/jupyter_events-0.11.0-py3-none-any.whl", hash = "sha256:36399b41ce1ca45fe8b8271067d6a140ffa54cec4028e95491c93b78a855cacf", size = 19423 }, +] + +[[package]] +name = "jupyter-lsp" +version = "2.2.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/b4/3200b0b09c12bc3b72d943d923323c398eff382d1dcc7c0dbc8b74630e40/jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001", size = 48741 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da", size = 69146 }, +] + +[[package]] +name = "jupyter-server" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "argon2-cffi" }, + { name = "jinja2" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "jupyter-events" }, + { name = "jupyter-server-terminals" }, + { name = "nbconvert" }, + { name = "nbformat" }, + { name = "overrides" }, + { name = "packaging" }, + { name = "prometheus-client" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "pyzmq" }, + { name = "send2trash" }, + { name = "terminado" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "websocket-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/8c/df09d4ab646141f130f9977b32b206ba8615d1969b2eba6a2e84b7f89137/jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084", size = 725227 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3", size = 385826 }, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "terminado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656 }, +] + +[[package]] +name = "jupyterlab" +version = "4.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-lru" }, + { name = "httpx" }, + { name = "ipykernel" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyter-lsp" }, + { name = "jupyter-server" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "packaging" }, + { name = "setuptools" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/45/1052f842e066902b1d78126df7e2269b1b9408991e1344e167b2e429f9e1/jupyterlab-4.3.4.tar.gz", hash = "sha256:f0bb9b09a04766e3423cccc2fc23169aa2ffedcdf8713e9e0fb33cac0b6859d0", size = 21797583 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/48/af57263e53cfc220e522de047aa0993f53bab734fe812af1e03e33ac6d7c/jupyterlab-4.3.4-py3-none-any.whl", hash = "sha256:b754c2601c5be6adf87cb5a1d8495d653ffb945f021939f77776acaa94dae952", size = 11665373 }, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884 }, +] + +[[package]] +name = "jupyterlab-server" +version = "2.27.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "jinja2" }, + { name = "json5" }, + { name = "jsonschema" }, + { name = "jupyter-server" }, + { name = "packaging" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0a/c9/a883ce65eb27905ce77ace410d83587c82ea64dc85a48d1f7ed52bcfa68d/jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4", size = 76173 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", size = 59700 }, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/73/fa26bbb747a9ea4fca6b01453aa22990d52ab62dd61384f1ac0dc9d4e7ba/jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed", size = 203556 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54", size = 214392 }, +] + +[[package]] +name = "kiwisolver" +version = "1.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/5f/4d8e9e852d98ecd26cdf8eaf7ed8bc33174033bba5e07001b289f07308fd/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", size = 124623 }, + { url = "https://files.pythonhosted.org/packages/1d/70/7f5af2a18a76fe92ea14675f8bd88ce53ee79e37900fa5f1a1d8e0b42998/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", size = 66720 }, + { url = "https://files.pythonhosted.org/packages/c6/13/e15f804a142353aefd089fadc8f1d985561a15358c97aca27b0979cb0785/kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/ce/6d/67d36c4d2054e83fb875c6b59d0809d5c530de8148846b1370475eeeece9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", size = 1650826 }, + { url = "https://files.pythonhosted.org/packages/de/c6/7b9bb8044e150d4d1558423a1568e4f227193662a02231064e3824f37e0a/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", size = 1628231 }, + { url = "https://files.pythonhosted.org/packages/b6/38/ad10d437563063eaaedbe2c3540a71101fc7fb07a7e71f855e93ea4de605/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", size = 1408938 }, + { url = "https://files.pythonhosted.org/packages/52/ce/c0106b3bd7f9e665c5f5bc1e07cc95b5dabd4e08e3dad42dbe2faad467e7/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", size = 1422799 }, + { url = "https://files.pythonhosted.org/packages/d0/87/efb704b1d75dc9758087ba374c0f23d3254505edaedd09cf9d247f7878b9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", size = 1354362 }, + { url = "https://files.pythonhosted.org/packages/eb/b3/fd760dc214ec9a8f208b99e42e8f0130ff4b384eca8b29dd0efc62052176/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", size = 2222695 }, + { url = "https://files.pythonhosted.org/packages/a2/09/a27fb36cca3fc01700687cc45dae7a6a5f8eeb5f657b9f710f788748e10d/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", size = 2370802 }, + { url = "https://files.pythonhosted.org/packages/3d/c3/ba0a0346db35fe4dc1f2f2cf8b99362fbb922d7562e5f911f7ce7a7b60fa/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", size = 2334646 }, + { url = "https://files.pythonhosted.org/packages/41/52/942cf69e562f5ed253ac67d5c92a693745f0bed3c81f49fc0cbebe4d6b00/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", size = 2467260 }, + { url = "https://files.pythonhosted.org/packages/32/26/2d9668f30d8a494b0411d4d7d4ea1345ba12deb6a75274d58dd6ea01e951/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", size = 2288633 }, + { url = "https://files.pythonhosted.org/packages/98/99/0dd05071654aa44fe5d5e350729961e7bb535372935a45ac89a8924316e6/kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", size = 71885 }, + { url = "https://files.pythonhosted.org/packages/6c/fc/822e532262a97442989335394d441cd1d0448c2e46d26d3e04efca84df22/kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", size = 65175 }, + { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635 }, + { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717 }, + { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413 }, + { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994 }, + { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804 }, + { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690 }, + { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839 }, + { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109 }, + { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269 }, + { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468 }, + { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394 }, + { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901 }, + { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306 }, + { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966 }, + { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311 }, + { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152 }, + { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067 }, + { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443 }, + { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728 }, + { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388 }, + { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849 }, + { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533 }, + { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898 }, + { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605 }, + { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801 }, + { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077 }, + { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410 }, + { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853 }, + { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424 }, + { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, + { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, + { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, + { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, + { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, + { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, + { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, + { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, + { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, + { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, + { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, + { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, + { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, + { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, + { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, + { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, + { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, + { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, + { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, + { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, + { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, + { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, + { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, + { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, + { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, + { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, + { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, + { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, + { url = "https://files.pythonhosted.org/packages/1f/f9/ae81c47a43e33b93b0a9819cac6723257f5da2a5a60daf46aa5c7226ea85/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", size = 60403 }, + { url = "https://files.pythonhosted.org/packages/58/ca/f92b5cb6f4ce0c1ebfcfe3e2e42b96917e16f7090e45b21102941924f18f/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", size = 58657 }, + { url = "https://files.pythonhosted.org/packages/80/28/ae0240f732f0484d3a4dc885d055653c47144bdf59b670aae0ec3c65a7c8/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", size = 84948 }, + { url = "https://files.pythonhosted.org/packages/5d/eb/78d50346c51db22c7203c1611f9b513075f35c4e0e4877c5dde378d66043/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", size = 81186 }, + { url = "https://files.pythonhosted.org/packages/43/f8/7259f18c77adca88d5f64f9a522792e178b2691f3748817a8750c2d216ef/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", size = 80279 }, + { url = "https://files.pythonhosted.org/packages/3a/1d/50ad811d1c5dae091e4cf046beba925bcae0a610e79ae4c538f996f63ed5/kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", size = 71762 }, +] + +[[package]] +name = "lxml" +version = "5.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/6b/20c3a4b24751377aaa6307eb230b66701024012c29dd374999cc92983269/lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f", size = 3679318 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a1/ce/2789e39eddf2b13fac29878bfa465f0910eb6b0096e29090e5176bc8cf43/lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656", size = 8124570 }, + { url = "https://files.pythonhosted.org/packages/24/a8/f4010166a25d41715527129af2675981a50d3bbf7df09c5d9ab8ca24fbf9/lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d", size = 4413042 }, + { url = "https://files.pythonhosted.org/packages/41/a4/7e45756cecdd7577ddf67a68b69c1db0f5ddbf0c9f65021ee769165ffc5a/lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a", size = 5139213 }, + { url = "https://files.pythonhosted.org/packages/02/e2/ecf845b12323c92748077e1818b64e8b4dba509a4cb12920b3762ebe7552/lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8", size = 4838814 }, + { url = "https://files.pythonhosted.org/packages/12/91/619f9fb72cf75e9ceb8700706f7276f23995f6ad757e6d400fbe35ca4990/lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330", size = 5425084 }, + { url = "https://files.pythonhosted.org/packages/25/3b/162a85a8f0fd2a3032ec3f936636911c6e9523a8e263fffcfd581ce98b54/lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965", size = 4875993 }, + { url = "https://files.pythonhosted.org/packages/43/af/dd3f58cc7d946da6ae42909629a2b1d5dd2d1b583334d4af9396697d6863/lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22", size = 5012462 }, + { url = "https://files.pythonhosted.org/packages/69/c1/5ea46b2d4c98f5bf5c83fffab8a0ad293c9bc74df9ecfbafef10f77f7201/lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b", size = 4815288 }, + { url = "https://files.pythonhosted.org/packages/1d/51/a0acca077ad35da458f4d3f729ef98effd2b90f003440d35fc36323f8ae6/lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7", size = 5472435 }, + { url = "https://files.pythonhosted.org/packages/4d/6b/0989c9368986961a6b0f55b46c80404c4b758417acdb6d87bfc3bd5f4967/lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8", size = 4976354 }, + { url = "https://files.pythonhosted.org/packages/05/9e/87492d03ff604fbf656ed2bf3e2e8d28f5d58ea1f00ff27ac27b06509079/lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32", size = 5029973 }, + { url = "https://files.pythonhosted.org/packages/f9/cc/9ae1baf5472af88e19e2c454b3710c1be9ecafb20eb474eeabcd88a055d2/lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86", size = 4888837 }, + { url = "https://files.pythonhosted.org/packages/d2/10/5594ffaec8c120d75b17e3ad23439b740a51549a9b5fd7484b2179adfe8f/lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5", size = 5530555 }, + { url = "https://files.pythonhosted.org/packages/ea/9b/de17f05377c8833343b629905571fb06cff2028f15a6f58ae2267662e341/lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03", size = 5405314 }, + { url = "https://files.pythonhosted.org/packages/8a/b4/227be0f1f3cca8255925985164c3838b8b36e441ff0cc10c1d3c6bdba031/lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7", size = 5079303 }, + { url = "https://files.pythonhosted.org/packages/5c/ee/19abcebb7fc40319bb71cd6adefa1ad94d09b5660228715854d6cc420713/lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80", size = 3475126 }, + { url = "https://files.pythonhosted.org/packages/a1/35/183d32551447e280032b2331738cd850da435a42f850b71ebeaab42c1313/lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3", size = 3805065 }, + { url = "https://files.pythonhosted.org/packages/5c/a8/449faa2a3cbe6a99f8d38dcd51a3ee8844c17862841a6f769ea7c2a9cd0f/lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b", size = 8141056 }, + { url = "https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18", size = 4425238 }, + { url = "https://files.pythonhosted.org/packages/f8/fb/128dddb7f9086236bce0eeae2bfb316d138b49b159f50bc681d56c1bdd19/lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442", size = 5095197 }, + { url = "https://files.pythonhosted.org/packages/b4/f9/a181a8ef106e41e3086629c8bdb2d21a942f14c84a0e77452c22d6b22091/lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4", size = 4809809 }, + { url = "https://files.pythonhosted.org/packages/25/2f/b20565e808f7f6868aacea48ddcdd7e9e9fb4c799287f21f1a6c7c2e8b71/lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f", size = 5407593 }, + { url = "https://files.pythonhosted.org/packages/23/0e/caac672ec246d3189a16c4d364ed4f7d6bf856c080215382c06764058c08/lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e", size = 4866657 }, + { url = "https://files.pythonhosted.org/packages/67/a4/1f5fbd3f58d4069000522196b0b776a014f3feec1796da03e495cf23532d/lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c", size = 4967017 }, + { url = "https://files.pythonhosted.org/packages/ee/73/623ecea6ca3c530dd0a4ed0d00d9702e0e85cd5624e2d5b93b005fe00abd/lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16", size = 4810730 }, + { url = "https://files.pythonhosted.org/packages/1d/ce/fb84fb8e3c298f3a245ae3ea6221c2426f1bbaa82d10a88787412a498145/lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79", size = 5455154 }, + { url = "https://files.pythonhosted.org/packages/b1/72/4d1ad363748a72c7c0411c28be2b0dc7150d91e823eadad3b91a4514cbea/lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080", size = 4969416 }, + { url = "https://files.pythonhosted.org/packages/42/07/b29571a58a3a80681722ea8ed0ba569211d9bb8531ad49b5cacf6d409185/lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654", size = 5013672 }, + { url = "https://files.pythonhosted.org/packages/b9/93/bde740d5a58cf04cbd38e3dd93ad1e36c2f95553bbf7d57807bc6815d926/lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d", size = 4878644 }, + { url = "https://files.pythonhosted.org/packages/56/b5/645c8c02721d49927c93181de4017164ec0e141413577687c3df8ff0800f/lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763", size = 5511531 }, + { url = "https://files.pythonhosted.org/packages/85/3f/6a99a12d9438316f4fc86ef88c5d4c8fb674247b17f3173ecadd8346b671/lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec", size = 5402065 }, + { url = "https://files.pythonhosted.org/packages/80/8a/df47bff6ad5ac57335bf552babfb2408f9eb680c074ec1ba412a1a6af2c5/lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be", size = 5069775 }, + { url = "https://files.pythonhosted.org/packages/08/ae/e7ad0f0fbe4b6368c5ee1e3ef0c3365098d806d42379c46c1ba2802a52f7/lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9", size = 3474226 }, + { url = "https://files.pythonhosted.org/packages/c3/b5/91c2249bfac02ee514ab135e9304b89d55967be7e53e94a879b74eec7a5c/lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1", size = 3814971 }, + { url = "https://files.pythonhosted.org/packages/eb/6d/d1f1c5e40c64bf62afd7a3f9b34ce18a586a1cccbf71e783cd0a6d8e8971/lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859", size = 8171753 }, + { url = "https://files.pythonhosted.org/packages/bd/83/26b1864921869784355459f374896dcf8b44d4af3b15d7697e9156cb2de9/lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e", size = 4441955 }, + { url = "https://files.pythonhosted.org/packages/e0/d2/e9bff9fb359226c25cda3538f664f54f2804f4b37b0d7c944639e1a51f69/lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f", size = 5050778 }, + { url = "https://files.pythonhosted.org/packages/88/69/6972bfafa8cd3ddc8562b126dd607011e218e17be313a8b1b9cc5a0ee876/lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e", size = 4748628 }, + { url = "https://files.pythonhosted.org/packages/5d/ea/a6523c7c7f6dc755a6eed3d2f6d6646617cad4d3d6d8ce4ed71bfd2362c8/lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179", size = 5322215 }, + { url = "https://files.pythonhosted.org/packages/99/37/396fbd24a70f62b31d988e4500f2068c7f3fd399d2fd45257d13eab51a6f/lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a", size = 4813963 }, + { url = "https://files.pythonhosted.org/packages/09/91/e6136f17459a11ce1757df864b213efbeab7adcb2efa63efb1b846ab6723/lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3", size = 4923353 }, + { url = "https://files.pythonhosted.org/packages/1d/7c/2eeecf87c9a1fca4f84f991067c693e67340f2b7127fc3eca8fa29d75ee3/lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1", size = 4740541 }, + { url = "https://files.pythonhosted.org/packages/3b/ed/4c38ba58defca84f5f0d0ac2480fdcd99fc7ae4b28fc417c93640a6949ae/lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d", size = 5346504 }, + { url = "https://files.pythonhosted.org/packages/a5/22/bbd3995437e5745cb4c2b5d89088d70ab19d4feabf8a27a24cecb9745464/lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c", size = 4898077 }, + { url = "https://files.pythonhosted.org/packages/0a/6e/94537acfb5b8f18235d13186d247bca478fea5e87d224644e0fe907df976/lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99", size = 4946543 }, + { url = "https://files.pythonhosted.org/packages/8d/e8/4b15df533fe8e8d53363b23a41df9be907330e1fa28c7ca36893fad338ee/lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff", size = 4816841 }, + { url = "https://files.pythonhosted.org/packages/1a/e7/03f390ea37d1acda50bc538feb5b2bda6745b25731e4e76ab48fae7106bf/lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a", size = 5417341 }, + { url = "https://files.pythonhosted.org/packages/ea/99/d1133ab4c250da85a883c3b60249d3d3e7c64f24faff494cf0fd23f91e80/lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8", size = 5327539 }, + { url = "https://files.pythonhosted.org/packages/7d/ed/e6276c8d9668028213df01f598f385b05b55a4e1b4662ee12ef05dab35aa/lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d", size = 5012542 }, + { url = "https://files.pythonhosted.org/packages/36/88/684d4e800f5aa28df2a991a6a622783fb73cf0e46235cfa690f9776f032e/lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30", size = 3486454 }, + { url = "https://files.pythonhosted.org/packages/fc/82/ace5a5676051e60355bd8fb945df7b1ba4f4fb8447f2010fb816bfd57724/lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f", size = 3816857 }, + { url = "https://files.pythonhosted.org/packages/94/6a/42141e4d373903bfea6f8e94b2f554d05506dfda522ada5343c651410dc8/lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a", size = 8156284 }, + { url = "https://files.pythonhosted.org/packages/91/5e/fa097f0f7d8b3d113fb7312c6308af702f2667f22644441715be961f2c7e/lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd", size = 4432407 }, + { url = "https://files.pythonhosted.org/packages/2d/a1/b901988aa6d4ff937f2e5cfc114e4ec561901ff00660c3e56713642728da/lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51", size = 5048331 }, + { url = "https://files.pythonhosted.org/packages/30/0f/b2a54f48e52de578b71bbe2a2f8160672a8a5e103df3a78da53907e8c7ed/lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b", size = 4744835 }, + { url = "https://files.pythonhosted.org/packages/82/9d/b000c15538b60934589e83826ecbc437a1586488d7c13f8ee5ff1f79a9b8/lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002", size = 5316649 }, + { url = "https://files.pythonhosted.org/packages/e3/ee/ffbb9eaff5e541922611d2c56b175c45893d1c0b8b11e5a497708a6a3b3b/lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4", size = 4812046 }, + { url = "https://files.pythonhosted.org/packages/15/ff/7ff89d567485c7b943cdac316087f16b2399a8b997007ed352a1248397e5/lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492", size = 4918597 }, + { url = "https://files.pythonhosted.org/packages/c6/a3/535b6ed8c048412ff51268bdf4bf1cf052a37aa7e31d2e6518038a883b29/lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3", size = 4738071 }, + { url = "https://files.pythonhosted.org/packages/7a/8f/cbbfa59cb4d4fd677fe183725a76d8c956495d7a3c7f111ab8f5e13d2e83/lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4", size = 5342213 }, + { url = "https://files.pythonhosted.org/packages/5c/fb/db4c10dd9958d4b52e34d1d1f7c1f434422aeaf6ae2bbaaff2264351d944/lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367", size = 4893749 }, + { url = "https://files.pythonhosted.org/packages/f2/38/bb4581c143957c47740de18a3281a0cab7722390a77cc6e610e8ebf2d736/lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832", size = 4945901 }, + { url = "https://files.pythonhosted.org/packages/fc/d5/18b7de4960c731e98037bd48fa9f8e6e8f2558e6fbca4303d9b14d21ef3b/lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff", size = 4815447 }, + { url = "https://files.pythonhosted.org/packages/97/a8/cd51ceaad6eb849246559a8ef60ae55065a3df550fc5fcd27014361c1bab/lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd", size = 5411186 }, + { url = "https://files.pythonhosted.org/packages/89/c3/1e3dabab519481ed7b1fdcba21dcfb8832f57000733ef0e71cf6d09a5e03/lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb", size = 5324481 }, + { url = "https://files.pythonhosted.org/packages/b6/17/71e9984cf0570cd202ac0a1c9ed5c1b8889b0fc8dc736f5ef0ffb181c284/lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b", size = 5011053 }, + { url = "https://files.pythonhosted.org/packages/69/68/9f7e6d3312a91e30829368c2b3217e750adef12a6f8eb10498249f4e8d72/lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957", size = 3485634 }, + { url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", size = 3814417 }, + { url = "https://files.pythonhosted.org/packages/99/f7/b73a431c8500565aa500e99e60b448d305eaf7c0b4c893c7c5a8a69cc595/lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c", size = 3925431 }, + { url = "https://files.pythonhosted.org/packages/db/48/4a206623c0d093d0e3b15f415ffb4345b0bdf661a3d0b15a112948c033c7/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a", size = 4216683 }, + { url = "https://files.pythonhosted.org/packages/54/47/577820c45dd954523ae8453b632d91e76da94ca6d9ee40d8c98dd86f916b/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005", size = 4326732 }, + { url = "https://files.pythonhosted.org/packages/68/de/96cb6d3269bc994b4f5ede8ca7bf0840f5de0a278bc6e50cb317ff71cafa/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce", size = 4218377 }, + { url = "https://files.pythonhosted.org/packages/a5/43/19b1ef6cbffa4244a217f95cc5f41a6cb4720fed33510a49670b03c5f1a0/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83", size = 4351237 }, + { url = "https://files.pythonhosted.org/packages/ba/b2/6a22fb5c0885da3b00e116aee81f0b829ec9ac8f736cd414b4a09413fc7d/lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba", size = 3487557 }, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, + { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, + { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, + { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, + { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, + { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, + { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, + { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, + { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, + { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +] + +[[package]] +name = "matplotlib" +version = "3.8.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/4f/8487737a74d8be4ab5fbe6019b0fae305c1604cf7209500969b879b5f462/matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea", size = 35934425 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/c0/1f88491656d21a2fecd90fbfae999b2f87bc44d439ef301ec8e0e4a937a0/matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014", size = 7603557 }, + { url = "https://files.pythonhosted.org/packages/86/9c/aa059a4fb8154d5875a5ddd33f8d0a42d77c0225fe4325e9b9358f39b0bf/matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106", size = 7497421 }, + { url = "https://files.pythonhosted.org/packages/0b/67/ded5217d42de1532193cd87db925c67997d23c68b20c3eaa9e4c6a0adb67/matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10", size = 11377985 }, + { url = "https://files.pythonhosted.org/packages/d6/07/061f97211f942101070a46fecd813a6b1bd83590ed7b07c473cabd707fe7/matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0", size = 11608003 }, + { url = "https://files.pythonhosted.org/packages/9a/d3/5d0bb1d905e219543fdfd7ab04e9d641a766367c83a5ffbcea60d2b2cf2d/matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef", size = 9535368 }, + { url = "https://files.pythonhosted.org/packages/62/5a/a5108ae3db37f35f8a2be8a57d62da327af239214c9661464ce09ee32d7d/matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338", size = 7656037 }, + { url = "https://files.pythonhosted.org/packages/36/11/62250ea25780d4b59c2c6044ec161235c47cc05a18d0ec0a05657de75b7d/matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661", size = 7606117 }, + { url = "https://files.pythonhosted.org/packages/14/60/12d4f27b859a74359306662da69c2d08826a2b05cfe7f96e66b490f41573/matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c", size = 7500108 }, + { url = "https://files.pythonhosted.org/packages/4e/ba/9e4f7f34dccf2d2768504410410db8d551c940457a2bec658dc4fa3b5aa2/matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa", size = 11382998 }, + { url = "https://files.pythonhosted.org/packages/80/3b/e363612ac1a514abfb5505aa209dd5b724b3232a6de98710d7759559706a/matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71", size = 11613309 }, + { url = "https://files.pythonhosted.org/packages/32/4c/63164901acadb3ada55c5e0fd6b7f29c9033d7e131302884cd735611b77a/matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b", size = 9546019 }, + { url = "https://files.pythonhosted.org/packages/2d/d5/6227732ecab9165586966ccb54301e3164f61b470c954c4cf6940654fbe1/matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae", size = 7658174 }, + { url = "https://files.pythonhosted.org/packages/91/eb/65f3bd78ce757dadd455c220273349428384b162485cd8aa380b61a867ed/matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616", size = 7604083 }, + { url = "https://files.pythonhosted.org/packages/da/2b/2bb6073ca8d336da07ace7d98bf7bb9da8233f55876bb3db6a5ee924f3e9/matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732", size = 7496013 }, + { url = "https://files.pythonhosted.org/packages/61/cd/976d3a9c10328da1d2fe183f7c92c45f1e125536226a6eb3a820c4753cd1/matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb", size = 11376749 }, + { url = "https://files.pythonhosted.org/packages/cd/ba/412149958e951876096198609b958b90a8a2c9bc07a96eeeaa9e2c480f30/matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30", size = 11600837 }, + { url = "https://files.pythonhosted.org/packages/dc/4f/e5b56ca109d8ab6bae37f519f15b891fc18809ddb8bc1aa26e0bfca83e25/matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25", size = 9538883 }, + { url = "https://files.pythonhosted.org/packages/7d/ca/e7bd1876a341ed8c456095962a582696cac1691cb6e55bd5ead15a755c5d/matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a", size = 7659712 }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, +] + +[[package]] +name = "mistune" +version = "3.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/6e/96fc7cb3288666c5de2c396eb0e338dc95f7a8e4920e43e38783a22d0084/mistune-3.1.0.tar.gz", hash = "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667", size = 94401 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/b3/743ffc3f59da380da504d84ccd1faf9a857a1445991ff19bf2ec754163c2/mistune-3.1.0-py3-none-any.whl", hash = "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1", size = 53694 }, +] + +[[package]] +name = "mypy" +version = "1.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mypy-extensions" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/eb/2c92d8ea1e684440f54fa49ac5d9a5f19967b7b472a281f419e69a8d228e/mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", size = 3216051 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/7a/87ae2adb31d68402da6da1e5f30c07ea6063e9f09b5e7cfc9dfa44075e74/mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb", size = 11211002 }, + { url = "https://files.pythonhosted.org/packages/e1/23/eada4c38608b444618a132be0d199b280049ded278b24cbb9d3fc59658e4/mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0", size = 10358400 }, + { url = "https://files.pythonhosted.org/packages/43/c9/d6785c6f66241c62fd2992b05057f404237deaad1566545e9f144ced07f5/mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d", size = 12095172 }, + { url = "https://files.pythonhosted.org/packages/c3/62/daa7e787770c83c52ce2aaf1a111eae5893de9e004743f51bfcad9e487ec/mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b", size = 12828732 }, + { url = "https://files.pythonhosted.org/packages/1b/a2/5fb18318a3637f29f16f4e41340b795da14f4751ef4f51c99ff39ab62e52/mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427", size = 13012197 }, + { url = "https://files.pythonhosted.org/packages/28/99/e153ce39105d164b5f02c06c35c7ba958aaff50a2babba7d080988b03fe7/mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f", size = 9780836 }, + { url = "https://files.pythonhosted.org/packages/da/11/a9422850fd506edbcdc7f6090682ecceaf1f87b9dd847f9df79942da8506/mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c", size = 11120432 }, + { url = "https://files.pythonhosted.org/packages/b6/9e/47e450fd39078d9c02d620545b2cb37993a8a8bdf7db3652ace2f80521ca/mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1", size = 10279515 }, + { url = "https://files.pythonhosted.org/packages/01/b5/6c8d33bd0f851a7692a8bfe4ee75eb82b6983a3cf39e5e32a5d2a723f0c1/mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8", size = 12025791 }, + { url = "https://files.pythonhosted.org/packages/f0/4c/e10e2c46ea37cab5c471d0ddaaa9a434dc1d28650078ac1b56c2d7b9b2e4/mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f", size = 12749203 }, + { url = "https://files.pythonhosted.org/packages/88/55/beacb0c69beab2153a0f57671ec07861d27d735a0faff135a494cd4f5020/mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1", size = 12885900 }, + { url = "https://files.pythonhosted.org/packages/a2/75/8c93ff7f315c4d086a2dfcde02f713004357d70a163eddb6c56a6a5eff40/mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae", size = 9777869 }, + { url = "https://files.pythonhosted.org/packages/43/1b/b38c079609bb4627905b74fc6a49849835acf68547ac33d8ceb707de5f52/mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14", size = 11266668 }, + { url = "https://files.pythonhosted.org/packages/6b/75/2ed0d2964c1ffc9971c729f7a544e9cd34b2cdabbe2d11afd148d7838aa2/mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9", size = 10254060 }, + { url = "https://files.pythonhosted.org/packages/a1/5f/7b8051552d4da3c51bbe8fcafffd76a6823779101a2b198d80886cd8f08e/mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11", size = 11933167 }, + { url = "https://files.pythonhosted.org/packages/04/90/f53971d3ac39d8b68bbaab9a4c6c58c8caa4d5fd3d587d16f5927eeeabe1/mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e", size = 12864341 }, + { url = "https://files.pythonhosted.org/packages/03/d2/8bc0aeaaf2e88c977db41583559319f1821c069e943ada2701e86d0430b7/mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89", size = 12972991 }, + { url = "https://files.pythonhosted.org/packages/6f/17/07815114b903b49b0f2cf7499f1c130e5aa459411596668267535fe9243c/mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b", size = 9879016 }, + { url = "https://files.pythonhosted.org/packages/9e/15/bb6a686901f59222275ab228453de741185f9d54fecbaacec041679496c6/mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255", size = 11252097 }, + { url = "https://files.pythonhosted.org/packages/f8/b3/8b0f74dfd072c802b7fa368829defdf3ee1566ba74c32a2cb2403f68024c/mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34", size = 10239728 }, + { url = "https://files.pythonhosted.org/packages/c5/9b/4fd95ab20c52bb5b8c03cc49169be5905d931de17edfe4d9d2986800b52e/mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a", size = 11924965 }, + { url = "https://files.pythonhosted.org/packages/56/9d/4a236b9c57f5d8f08ed346914b3f091a62dd7e19336b2b2a0d85485f82ff/mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9", size = 12867660 }, + { url = "https://files.pythonhosted.org/packages/40/88/a61a5497e2f68d9027de2bb139c7bb9abaeb1be1584649fa9d807f80a338/mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd", size = 12969198 }, + { url = "https://files.pythonhosted.org/packages/54/da/3d6fc5d92d324701b0c23fb413c853892bfe0e1dbe06c9138037d459756b/mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107", size = 9885276 }, + { url = "https://files.pythonhosted.org/packages/a0/b5/32dd67b69a16d088e533962e5044e51004176a9952419de0370cdaead0f8/mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1", size = 2752905 }, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, +] + +[[package]] +name = "myst-parser" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, + { name = "jinja2" }, + { name = "markdown-it-py" }, + { name = "mdit-py-plugins" }, + { name = "pyyaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/55/6d1741a1780e5e65038b74bce6689da15f620261c490c3511eb4c12bac4b/myst_parser-4.0.0.tar.gz", hash = "sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531", size = 93858 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/b4/b036f8fdb667587bb37df29dc6644681dd78b7a2a6321a34684b79412b28/myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d", size = 84563 }, +] + +[[package]] +name = "nbclient" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 }, +] + +[[package]] +name = "nbconvert" +version = "7.16.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/2c/d026c0367f2be2463d4c2f5b538e28add2bc67bc13730abb7f364ae4eb8b/nbconvert-7.16.5.tar.gz", hash = "sha256:c83467bb5777fdfaac5ebbb8e864f300b277f68692ecc04d6dab72f2d8442344", size = 856367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8f/9e/2dcc9fe00cf55d95a8deae69384e9cea61816126e345754f6c75494d32ec/nbconvert-7.16.5-py3-none-any.whl", hash = "sha256:e12eac052d6fd03040af4166c563d76e7aeead2e9aadf5356db552a1784bd547", size = 258061 }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, +] + +[[package]] +name = "nodeenv" +version = "1.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, +] + +[[package]] +name = "notebook" +version = "7.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, + { name = "jupyterlab" }, + { name = "jupyterlab-server" }, + { name = "notebook-shim" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/04/ac488379d5afef43402b3fb4be2857db1a09804fecf98b9b714c741b225b/notebook-7.3.2.tar.gz", hash = "sha256:705e83a1785f45b383bf3ee13cb76680b92d24f56fb0c7d2136fe1d850cd3ca8", size = 12781804 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/9b/76e50ee18f183ea5fe1784a9eeaa50f2c71802e4740d6e959592b0993298/notebook-7.3.2-py3-none-any.whl", hash = "sha256:e5f85fc59b69d3618d73cf27544418193ff8e8058d5bf61d315ce4f473556288", size = 13163630 }, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-server" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307 }, +] + +[[package]] +name = "numpy" +version = "1.26.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468 }, + { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411 }, + { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016 }, + { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889 }, + { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746 }, + { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620 }, + { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659 }, + { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905 }, + { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554 }, + { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127 }, + { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994 }, + { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005 }, + { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297 }, + { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567 }, + { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812 }, + { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913 }, + { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901 }, + { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868 }, + { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109 }, + { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613 }, + { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172 }, + { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643 }, + { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803 }, + { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754 }, +] + +[[package]] +name = "overrides" +version = "7.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832 }, +] + +[[package]] +name = "packaging" +version = "23.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", size = 146714 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", size = 53011 }, +] + +[[package]] +name = "pandas-stubs" +version = "2.2.3.241126" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "types-pytz" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/90/86/93c545d149c3e1fe1c4c55478cc3a69859d0ea3467e1d9892e9eb28cb1e7/pandas_stubs-2.2.3.241126.tar.gz", hash = "sha256:cf819383c6d9ae7d4dabf34cd47e1e45525bb2f312e6ad2939c2c204cb708acd", size = 104204 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/ab/ed42acf15bab2e86e5c49fad4aa038315233c4c2d22f41b49faa4d837516/pandas_stubs-2.2.3.241126-py3-none-any.whl", hash = "sha256:74aa79c167af374fe97068acc90776c0ebec5266a6e5c69fe11e9c2cf51f2267", size = 158280 }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663 }, +] + +[[package]] +name = "parso" +version = "0.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, +] + +[[package]] +name = "pillow" +version = "11.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/1c/2dcea34ac3d7bc96a1fd1bd0a6e06a57c67167fec2cff8d95d88229a8817/pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8", size = 3229983 }, + { url = "https://files.pythonhosted.org/packages/14/ca/6bec3df25e4c88432681de94a3531cc738bd85dea6c7aa6ab6f81ad8bd11/pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192", size = 3101831 }, + { url = "https://files.pythonhosted.org/packages/d4/2c/668e18e5521e46eb9667b09e501d8e07049eb5bfe39d56be0724a43117e6/pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2", size = 4314074 }, + { url = "https://files.pythonhosted.org/packages/02/80/79f99b714f0fc25f6a8499ecfd1f810df12aec170ea1e32a4f75746051ce/pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26", size = 4394933 }, + { url = "https://files.pythonhosted.org/packages/81/aa/8d4ad25dc11fd10a2001d5b8a80fdc0e564ac33b293bdfe04ed387e0fd95/pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07", size = 4353349 }, + { url = "https://files.pythonhosted.org/packages/84/7a/cd0c3eaf4a28cb2a74bdd19129f7726277a7f30c4f8424cd27a62987d864/pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482", size = 4476532 }, + { url = "https://files.pythonhosted.org/packages/8f/8b/a907fdd3ae8f01c7670dfb1499c53c28e217c338b47a813af8d815e7ce97/pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e", size = 4279789 }, + { url = "https://files.pythonhosted.org/packages/6f/9a/9f139d9e8cccd661c3efbf6898967a9a337eb2e9be2b454ba0a09533100d/pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269", size = 4413131 }, + { url = "https://files.pythonhosted.org/packages/a8/68/0d8d461f42a3f37432203c8e6df94da10ac8081b6d35af1c203bf3111088/pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49", size = 2291213 }, + { url = "https://files.pythonhosted.org/packages/14/81/d0dff759a74ba87715509af9f6cb21fa21d93b02b3316ed43bda83664db9/pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a", size = 2625725 }, + { url = "https://files.pythonhosted.org/packages/ce/1f/8d50c096a1d58ef0584ddc37e6f602828515219e9d2428e14ce50f5ecad1/pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65", size = 2375213 }, + { url = "https://files.pythonhosted.org/packages/dd/d6/2000bfd8d5414fb70cbbe52c8332f2283ff30ed66a9cde42716c8ecbe22c/pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457", size = 3229968 }, + { url = "https://files.pythonhosted.org/packages/d9/45/3fe487010dd9ce0a06adf9b8ff4f273cc0a44536e234b0fad3532a42c15b/pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35", size = 3101806 }, + { url = "https://files.pythonhosted.org/packages/e3/72/776b3629c47d9d5f1c160113158a7a7ad177688d3a1159cd3b62ded5a33a/pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2", size = 4322283 }, + { url = "https://files.pythonhosted.org/packages/e4/c2/e25199e7e4e71d64eeb869f5b72c7ddec70e0a87926398785ab944d92375/pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070", size = 4402945 }, + { url = "https://files.pythonhosted.org/packages/c1/ed/51d6136c9d5911f78632b1b86c45241c712c5a80ed7fa7f9120a5dff1eba/pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6", size = 4361228 }, + { url = "https://files.pythonhosted.org/packages/48/a4/fbfe9d5581d7b111b28f1d8c2762dee92e9821bb209af9fa83c940e507a0/pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1", size = 4484021 }, + { url = "https://files.pythonhosted.org/packages/39/db/0b3c1a5018117f3c1d4df671fb8e47d08937f27519e8614bbe86153b65a5/pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2", size = 4287449 }, + { url = "https://files.pythonhosted.org/packages/d9/58/bc128da7fea8c89fc85e09f773c4901e95b5936000e6f303222490c052f3/pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96", size = 4419972 }, + { url = "https://files.pythonhosted.org/packages/5f/bb/58f34379bde9fe197f51841c5bbe8830c28bbb6d3801f16a83b8f2ad37df/pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f", size = 2291201 }, + { url = "https://files.pythonhosted.org/packages/3a/c6/fce9255272bcf0c39e15abd2f8fd8429a954cf344469eaceb9d0d1366913/pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761", size = 2625686 }, + { url = "https://files.pythonhosted.org/packages/c8/52/8ba066d569d932365509054859f74f2a9abee273edcef5cd75e4bc3e831e/pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71", size = 2375194 }, + { url = "https://files.pythonhosted.org/packages/95/20/9ce6ed62c91c073fcaa23d216e68289e19d95fb8188b9fb7a63d36771db8/pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", size = 3226818 }, + { url = "https://files.pythonhosted.org/packages/b9/d8/f6004d98579a2596c098d1e30d10b248798cceff82d2b77aa914875bfea1/pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", size = 3101662 }, + { url = "https://files.pythonhosted.org/packages/08/d9/892e705f90051c7a2574d9f24579c9e100c828700d78a63239676f960b74/pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", size = 4329317 }, + { url = "https://files.pythonhosted.org/packages/8c/aa/7f29711f26680eab0bcd3ecdd6d23ed6bce180d82e3f6380fb7ae35fcf3b/pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", size = 4412999 }, + { url = "https://files.pythonhosted.org/packages/c8/c4/8f0fe3b9e0f7196f6d0bbb151f9fba323d72a41da068610c4c960b16632a/pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", size = 4368819 }, + { url = "https://files.pythonhosted.org/packages/38/0d/84200ed6a871ce386ddc82904bfadc0c6b28b0c0ec78176871a4679e40b3/pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", size = 4496081 }, + { url = "https://files.pythonhosted.org/packages/84/9c/9bcd66f714d7e25b64118e3952d52841a4babc6d97b6d28e2261c52045d4/pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", size = 4296513 }, + { url = "https://files.pythonhosted.org/packages/db/61/ada2a226e22da011b45f7104c95ebda1b63dcbb0c378ad0f7c2a710f8fd2/pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", size = 4431298 }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fc6e86750523f367923522014b821c11ebc5ad402e659d8c9d09b3c9d70c/pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", size = 2291630 }, + { url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", size = 2626369 }, + { url = "https://files.pythonhosted.org/packages/37/f3/9b18362206b244167c958984b57c7f70a0289bfb59a530dd8af5f699b910/pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", size = 2375240 }, + { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 }, + { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 }, + { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 }, + { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 }, + { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 }, + { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 }, + { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 }, + { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 }, + { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 }, + { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 }, + { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 }, + { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 }, + { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 }, + { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 }, + { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 }, + { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 }, + { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 }, + { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 }, + { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 }, + { url = "https://files.pythonhosted.org/packages/fa/c5/389961578fb677b8b3244fcd934f720ed25a148b9a5cc81c91bdf59d8588/pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90", size = 3198345 }, + { url = "https://files.pythonhosted.org/packages/c4/fa/803c0e50ffee74d4b965229e816af55276eac1d5806712de86f9371858fd/pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb", size = 3072938 }, + { url = "https://files.pythonhosted.org/packages/dc/67/2a3a5f8012b5d8c63fe53958ba906c1b1d0482ebed5618057ef4d22f8076/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442", size = 3400049 }, + { url = "https://files.pythonhosted.org/packages/e5/a0/514f0d317446c98c478d1872497eb92e7cde67003fed74f696441e647446/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83", size = 3422431 }, + { url = "https://files.pythonhosted.org/packages/cd/00/20f40a935514037b7d3f87adfc87d2c538430ea625b63b3af8c3f5578e72/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f", size = 3446208 }, + { url = "https://files.pythonhosted.org/packages/28/3c/7de681727963043e093c72e6c3348411b0185eab3263100d4490234ba2f6/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73", size = 3509746 }, + { url = "https://files.pythonhosted.org/packages/41/67/936f9814bdd74b2dfd4822f1f7725ab5d8ff4103919a1664eb4874c58b2f/pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0", size = 2626353 }, +] + +[[package]] +name = "platformdirs" +version = "4.3.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, +] + +[[package]] +name = "pre-commit" +version = "4.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cfgv" }, + { name = "identify" }, + { name = "nodeenv" }, + { name = "pyyaml" }, + { name = "virtualenv" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, +] + +[[package]] +name = "prometheus-client" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682 }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.48" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/4f/feb5e137aff82f7c7f3248267b97451da3644f6cdc218edfe549fb354127/prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90", size = 424684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e", size = 386595 }, +] + +[[package]] +name = "psutil" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 }, + { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 }, + { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 }, + { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 }, + { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 }, + { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 }, + { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, +] + +[[package]] +name = "pycparser" +version = "2.22" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, +] + +[[package]] +name = "pydantic" +version = "2.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/7e/fb60e6fee04d0ef8f15e4e01ff187a196fa976eb0f0ab524af4599e5754c/pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06", size = 762094 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/26/3e1bbe954fde7ee22a6e7d31582c642aad9e84ffe4b5fb61e63b87cd326f/pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", size = 431765 }, +] + +[[package]] +name = "pydantic-core" +version = "2.27.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/bc/fed5f74b5d802cf9a03e83f60f18864e90e3aed7223adaca5ffb7a8d8d64/pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", size = 1895938 }, + { url = "https://files.pythonhosted.org/packages/71/2a/185aff24ce844e39abb8dd680f4e959f0006944f4a8a0ea372d9f9ae2e53/pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", size = 1815684 }, + { url = "https://files.pythonhosted.org/packages/c3/43/fafabd3d94d159d4f1ed62e383e264f146a17dd4d48453319fd782e7979e/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", size = 1829169 }, + { url = "https://files.pythonhosted.org/packages/a2/d1/f2dfe1a2a637ce6800b799aa086d079998959f6f1215eb4497966efd2274/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", size = 1867227 }, + { url = "https://files.pythonhosted.org/packages/7d/39/e06fcbcc1c785daa3160ccf6c1c38fea31f5754b756e34b65f74e99780b5/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", size = 2037695 }, + { url = "https://files.pythonhosted.org/packages/7a/67/61291ee98e07f0650eb756d44998214231f50751ba7e13f4f325d95249ab/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", size = 2741662 }, + { url = "https://files.pythonhosted.org/packages/32/90/3b15e31b88ca39e9e626630b4c4a1f5a0dfd09076366f4219429e6786076/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", size = 1993370 }, + { url = "https://files.pythonhosted.org/packages/ff/83/c06d333ee3a67e2e13e07794995c1535565132940715931c1c43bfc85b11/pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", size = 1996813 }, + { url = "https://files.pythonhosted.org/packages/7c/f7/89be1c8deb6e22618a74f0ca0d933fdcb8baa254753b26b25ad3acff8f74/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", size = 2005287 }, + { url = "https://files.pythonhosted.org/packages/b7/7d/8eb3e23206c00ef7feee17b83a4ffa0a623eb1a9d382e56e4aa46fd15ff2/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", size = 2128414 }, + { url = "https://files.pythonhosted.org/packages/4e/99/fe80f3ff8dd71a3ea15763878d464476e6cb0a2db95ff1c5c554133b6b83/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", size = 2155301 }, + { url = "https://files.pythonhosted.org/packages/2b/a3/e50460b9a5789ca1451b70d4f52546fa9e2b420ba3bfa6100105c0559238/pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", size = 1816685 }, + { url = "https://files.pythonhosted.org/packages/57/4c/a8838731cb0f2c2a39d3535376466de6049034d7b239c0202a64aaa05533/pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", size = 1982876 }, + { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, + { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, + { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, + { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, + { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, + { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, + { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, + { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, + { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, + { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, + { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, + { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, + { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, + { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, + { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, + { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, + { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, + { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, + { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, + { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, + { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, + { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, + { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, + { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, + { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, + { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, + { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, + { url = "https://files.pythonhosted.org/packages/46/72/af70981a341500419e67d5cb45abe552a7c74b66326ac8877588488da1ac/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", size = 1891159 }, + { url = "https://files.pythonhosted.org/packages/ad/3d/c5913cccdef93e0a6a95c2d057d2c2cba347815c845cda79ddd3c0f5e17d/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", size = 1768331 }, + { url = "https://files.pythonhosted.org/packages/f6/f0/a3ae8fbee269e4934f14e2e0e00928f9346c5943174f2811193113e58252/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", size = 1822467 }, + { url = "https://files.pythonhosted.org/packages/d7/7a/7bbf241a04e9f9ea24cd5874354a83526d639b02674648af3f350554276c/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", size = 1979797 }, + { url = "https://files.pythonhosted.org/packages/4f/5f/4784c6107731f89e0005a92ecb8a2efeafdb55eb992b8e9d0a2be5199335/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", size = 1987839 }, + { url = "https://files.pythonhosted.org/packages/6d/a7/61246562b651dff00de86a5f01b6e4befb518df314c54dec187a78d81c84/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", size = 1998861 }, + { url = "https://files.pythonhosted.org/packages/86/aa/837821ecf0c022bbb74ca132e117c358321e72e7f9702d1b6a03758545e2/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", size = 2116582 }, + { url = "https://files.pythonhosted.org/packages/81/b0/5e74656e95623cbaa0a6278d16cf15e10a51f6002e3ec126541e95c29ea3/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", size = 2151985 }, + { url = "https://files.pythonhosted.org/packages/63/37/3e32eeb2a451fddaa3898e2163746b0cffbbdbb4740d38372db0490d67f3/pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", size = 2004715 }, +] + +[[package]] +name = "pygments" +version = "2.19.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, +] + +[[package]] +name = "pyparsing" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2/pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a", size = 1067694 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", size = 107716 }, +] + +[[package]] +name = "pyproj" +version = "3.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/84/2b39bbf888c753ea48b40d47511548c77aa03445465c35cc4c4e9649b643/pyproj-3.6.1.tar.gz", hash = "sha256:44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf", size = 225131 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/32/63cf474f4a8d4804b3bdf7c16b8589f38142e8e2f8319dcea27e0bc21a87/pyproj-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab7aa4d9ff3c3acf60d4b285ccec134167a948df02347585fdd934ebad8811b4", size = 6142763 }, + { url = "https://files.pythonhosted.org/packages/18/86/2e7cb9de40492f1bafbf11f4c9072edc394509a40b5e4c52f8139546f039/pyproj-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4bc0472302919e59114aa140fd7213c2370d848a7249d09704f10f5b062031fe", size = 4877123 }, + { url = "https://files.pythonhosted.org/packages/5e/c5/928d5a26995dbefbebd7507d982141cd9153bc7e4392b334fff722c4af12/pyproj-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5279586013b8d6582e22b6f9e30c49796966770389a9d5b85e25a4223286cd3f", size = 6190576 }, + { url = "https://files.pythonhosted.org/packages/f6/2b/b60cf73b0720abca313bfffef34e34f7f7dae23852b2853cf0368d49426b/pyproj-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fafd1f3eb421694857f254a9bdbacd1eb22fc6c24ca74b136679f376f97d35", size = 8328075 }, + { url = "https://files.pythonhosted.org/packages/d9/a8/7193f46032636be917bc775506ae987aad72c931b1f691b775ca812a2917/pyproj-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c41e80ddee130450dcb8829af7118f1ab69eaf8169c4bf0ee8d52b72f098dc2f", size = 5635713 }, + { url = "https://files.pythonhosted.org/packages/89/8f/27350c8fba71a37cd0d316f100fbd96bf139cc2b5ff1ab0dcbc7ac64010a/pyproj-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:db3aedd458e7f7f21d8176f0a1d924f1ae06d725228302b872885a1c34f3119e", size = 6087932 }, + { url = "https://files.pythonhosted.org/packages/84/a6/a300c1b14b2112e966e9f90b18f9c13b586bdcf417207cee913ae9005da3/pyproj-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ebfbdbd0936e178091309f6cd4fcb4decd9eab12aa513cdd9add89efa3ec2882", size = 6147442 }, + { url = "https://files.pythonhosted.org/packages/30/bd/b9bd3761f08754e8dbb34c5a647db2099b348ab5da338e90980caf280e37/pyproj-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:447db19c7efad70ff161e5e46a54ab9cc2399acebb656b6ccf63e4bc4a04b97a", size = 4880331 }, + { url = "https://files.pythonhosted.org/packages/f4/0a/d82aeeb605b5d6870bc72307c3b5e044e632eb7720df8885e144f51a8eac/pyproj-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7e13c40183884ec7f94eb8e0f622f08f1d5716150b8d7a134de48c6110fee85", size = 6192425 }, + { url = "https://files.pythonhosted.org/packages/64/90/dfe5c00de1ca4dbb82606e79790659d4ed7f0ed8d372bccb3baca2a5abe0/pyproj-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65ad699e0c830e2b8565afe42bd58cc972b47d829b2e0e48ad9638386d994915", size = 8571478 }, + { url = "https://files.pythonhosted.org/packages/14/6d/ae373629a1723f0db80d7b8c93598b00d9ecb930ed9ebf4f35826a33e97c/pyproj-3.6.1-cp311-cp311-win32.whl", hash = "sha256:8b8acc31fb8702c54625f4d5a2a6543557bec3c28a0ef638778b7ab1d1772132", size = 5634575 }, + { url = "https://files.pythonhosted.org/packages/79/95/eb68113c5b5737c342bde1bab92705dabe69c16299c5a122616e50f1fbd6/pyproj-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:38a3361941eb72b82bd9a18f60c78b0df8408416f9340521df442cebfc4306e2", size = 6088494 }, + { url = "https://files.pythonhosted.org/packages/0b/64/93232511a7906a492b1b7dfdfc17f4e95982d76a24ef4f86d18cfe7ae2c9/pyproj-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1e9fbaf920f0f9b4ee62aab832be3ae3968f33f24e2e3f7fbb8c6728ef1d9746", size = 6135280 }, + { url = "https://files.pythonhosted.org/packages/10/f2/b550b1f65cc7e51c9116b220b50aade60c439103432a3fd5b12efbc77e15/pyproj-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d227a865356f225591b6732430b1d1781e946893789a609bb34f59d09b8b0f8", size = 4880030 }, + { url = "https://files.pythonhosted.org/packages/fe/4b/2f8f6f94643b9fe2083338eff294feda84d916409b5840b7a402d2be93f8/pyproj-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83039e5ae04e5afc974f7d25ee0870a80a6bd6b7957c3aca5613ccbe0d3e72bf", size = 6184439 }, + { url = "https://files.pythonhosted.org/packages/19/9b/c57569132174786aa3f72275ac306956859a639dad0ce8d95c8411ce8209/pyproj-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb059ba3bced6f6725961ba758649261d85ed6ce670d3e3b0a26e81cf1aa8d", size = 8660747 }, + { url = "https://files.pythonhosted.org/packages/0e/ab/1c2159ec757677c5a6b8803f6be45c2b550dc42c84ec4a228dc219849bbb/pyproj-3.6.1-cp312-cp312-win32.whl", hash = "sha256:2d6ff73cc6dbbce3766b6c0bce70ce070193105d8de17aa2470009463682a8eb", size = 5626805 }, + { url = "https://files.pythonhosted.org/packages/c7/f3/2f32fe143cd7ba1d4d68f1b6dce9ca402d909cbd5a5830e3a8fa3d1acbbf/pyproj-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:7a27151ddad8e1439ba70c9b4b2b617b290c39395fa9ddb7411ebb0eb86d6fb0", size = 6079779 }, +] + +[[package]] +name = "pyright" +version = "1.1.391" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nodeenv" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/05/4ea52a8a45cc28897edb485b4102d37cbfd5fce8445d679cdeb62bfad221/pyright-1.1.391.tar.gz", hash = "sha256:66b2d42cdf5c3cbab05f2f4b76e8bec8aa78e679bfa0b6ad7b923d9e027cadb2", size = 21965 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/89/66f49552fbeb21944c8077d11834b2201514a56fd1b7747ffff9630f1bd9/pyright-1.1.391-py3-none-any.whl", hash = "sha256:54fa186f8b3e8a55a44ebfa842636635688670c6896dcf6cf4a7fc75062f4d15", size = 18579 }, +] + +[[package]] +name = "pyshp" +version = "2.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/63/9f/0dd21250c60375a532c35e89fad8d5e8a3f1a2e3f7c389ccc5a60b05263e/pyshp-2.3.1.tar.gz", hash = "sha256:4caec82fd8dd096feba8217858068bacb2a3b5950f43c048c6dc32a3489d5af1", size = 1731544 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/2f/68116db5b36b895c0450e3072b8cb6c2fac0359279b182ea97014d3c8ac0/pyshp-2.3.1-py2.py3-none-any.whl", hash = "sha256:67024c0ccdc352ba5db777c4e968483782dfa78f8e200672a90d2d30fd8b7b49", size = 46537 }, +] + +[[package]] +name = "pytest" +version = "8.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, +] + +[[package]] +name = "pytest-cov" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "python-json-logger" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/c4/358cd13daa1d912ef795010897a483ab2f0b41c9ea1b35235a8b2f7d15a7/python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008", size = 16287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/72/2f30cf26664fcfa0bd8ec5ee62ec90c03bd485e4a294d92aabc76c5203a5/python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090", size = 14924 }, +] + +[[package]] +name = "pywin32" +version = "308" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/a6/3e9f2c474895c1bb61b11fa9640be00067b5c5b363c501ee9c3fa53aec01/pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e", size = 5927028 }, + { url = "https://files.pythonhosted.org/packages/d9/b4/84e2463422f869b4b718f79eb7530a4c1693e96b8a4e5e968de38be4d2ba/pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e", size = 6558484 }, + { url = "https://files.pythonhosted.org/packages/9f/8f/fb84ab789713f7c6feacaa08dad3ec8105b88ade8d1c4f0f0dfcaaa017d6/pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c", size = 7971454 }, + { url = "https://files.pythonhosted.org/packages/eb/e2/02652007469263fe1466e98439831d65d4ca80ea1a2df29abecedf7e47b7/pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a", size = 5928156 }, + { url = "https://files.pythonhosted.org/packages/48/ef/f4fb45e2196bc7ffe09cad0542d9aff66b0e33f6c0954b43e49c33cad7bd/pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b", size = 6559559 }, + { url = "https://files.pythonhosted.org/packages/79/ef/68bb6aa865c5c9b11a35771329e95917b5559845bd75b65549407f9fc6b4/pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6", size = 7972495 }, + { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 }, + { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 }, + { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 }, + { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 }, + { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 }, + { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 }, +] + +[[package]] +name = "pywinpty" +version = "2.0.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/82/90f8750423cba4b9b6c842df227609fb60704482d7abf6dd47e2babc055a/pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e", size = 27769 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/09/56376af256eab8cc5f8982a3b138d387136eca27fa1a8a68660e8ed59e4b/pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f", size = 1397115 }, + { url = "https://files.pythonhosted.org/packages/be/e2/af1a99c0432e4e58c9ac8e334ee191790ec9793d33559189b9d2069bdc1d/pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7", size = 1397223 }, + { url = "https://files.pythonhosted.org/packages/ad/79/759ae767a3b78d340446efd54dd1fe4f7dafa4fc7be96ed757e44bcdba54/pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737", size = 1397207 }, + { url = "https://files.pythonhosted.org/packages/7d/34/b77b3c209bf2eaa6455390c8d5449241637f5957f41636a2204065d52bfa/pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819", size = 1396698 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, + { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, + { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, + { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, + { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, + { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, + { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, + { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, + { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +] + +[[package]] +name = "pyzmq" +version = "26.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/05/bed626b9f7bb2322cdbbf7b4bd8f54b1b617b0d2ab2d3547d6e39428a48e/pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", size = 271975 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/a8/9837c39aba390eb7d01924ace49d761c8dbe7bc2d6082346d00c8332e431/pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629", size = 1340058 }, + { url = "https://files.pythonhosted.org/packages/a2/1f/a006f2e8e4f7d41d464272012695da17fb95f33b54342612a6890da96ff6/pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b", size = 1008818 }, + { url = "https://files.pythonhosted.org/packages/b6/09/b51b6683fde5ca04593a57bbe81788b6b43114d8f8ee4e80afc991e14760/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764", size = 673199 }, + { url = "https://files.pythonhosted.org/packages/c9/78/486f3e2e824f3a645238332bf5a4c4b4477c3063033a27c1e4052358dee2/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c", size = 911762 }, + { url = "https://files.pythonhosted.org/packages/5e/3b/2eb1667c9b866f53e76ee8b0c301b0469745a23bd5a87b7ee3d5dd9eb6e5/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a", size = 868773 }, + { url = "https://files.pythonhosted.org/packages/16/29/ca99b4598a9dc7e468b5417eda91f372b595be1e3eec9b7cbe8e5d3584e8/pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88", size = 868834 }, + { url = "https://files.pythonhosted.org/packages/ad/e5/9efaeb1d2f4f8c50da04144f639b042bc52869d3a206d6bf672ab3522163/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f", size = 1202861 }, + { url = "https://files.pythonhosted.org/packages/c3/62/c721b5608a8ac0a69bb83cbb7d07a56f3ff00b3991a138e44198a16f94c7/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282", size = 1515304 }, + { url = "https://files.pythonhosted.org/packages/87/84/e8bd321aa99b72f48d4606fc5a0a920154125bd0a4608c67eab742dab087/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea", size = 1414712 }, + { url = "https://files.pythonhosted.org/packages/cd/cd/420e3fd1ac6977b008b72e7ad2dae6350cc84d4c5027fc390b024e61738f/pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2", size = 578113 }, + { url = "https://files.pythonhosted.org/packages/5c/57/73930d56ed45ae0cb4946f383f985c855c9b3d4063f26416998f07523c0e/pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971", size = 641631 }, + { url = "https://files.pythonhosted.org/packages/61/d2/ae6ac5c397f1ccad59031c64beaafce7a0d6182e0452cc48f1c9c87d2dd0/pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa", size = 543528 }, + { url = "https://files.pythonhosted.org/packages/12/20/de7442172f77f7c96299a0ac70e7d4fb78cd51eca67aa2cf552b66c14196/pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218", size = 1340639 }, + { url = "https://files.pythonhosted.org/packages/98/4d/5000468bd64c7910190ed0a6c76a1ca59a68189ec1f007c451dc181a22f4/pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4", size = 1008710 }, + { url = "https://files.pythonhosted.org/packages/e1/bf/c67fd638c2f9fbbab8090a3ee779370b97c82b84cc12d0c498b285d7b2c0/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef", size = 673129 }, + { url = "https://files.pythonhosted.org/packages/86/94/99085a3f492aa538161cbf27246e8886ff850e113e0c294a5b8245f13b52/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317", size = 910107 }, + { url = "https://files.pythonhosted.org/packages/31/1d/346809e8a9b999646d03f21096428453465b1bca5cd5c64ecd048d9ecb01/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf", size = 867960 }, + { url = "https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e", size = 869204 }, + { url = "https://files.pythonhosted.org/packages/0f/f9/18417771dee223ccf0f48e29adf8b4e25ba6d0e8285e33bcbce078070bc3/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37", size = 1203351 }, + { url = "https://files.pythonhosted.org/packages/e0/46/f13e67fe0d4f8a2315782cbad50493de6203ea0d744610faf4d5f5b16e90/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3", size = 1514204 }, + { url = "https://files.pythonhosted.org/packages/50/11/ddcf7343b7b7a226e0fc7b68cbf5a5bb56291fac07f5c3023bb4c319ebb4/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6", size = 1414339 }, + { url = "https://files.pythonhosted.org/packages/01/14/1c18d7d5b7be2708f513f37c61bfadfa62161c10624f8733f1c8451b3509/pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4", size = 576928 }, + { url = "https://files.pythonhosted.org/packages/3b/1b/0a540edd75a41df14ec416a9a500b9fec66e554aac920d4c58fbd5756776/pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5", size = 642317 }, + { url = "https://files.pythonhosted.org/packages/98/77/1cbfec0358078a4c5add529d8a70892db1be900980cdb5dd0898b3d6ab9d/pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003", size = 543834 }, + { url = "https://files.pythonhosted.org/packages/28/2f/78a766c8913ad62b28581777ac4ede50c6d9f249d39c2963e279524a1bbe/pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9", size = 1343105 }, + { url = "https://files.pythonhosted.org/packages/b7/9c/4b1e2d3d4065be715e007fe063ec7885978fad285f87eae1436e6c3201f4/pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52", size = 1008365 }, + { url = "https://files.pythonhosted.org/packages/4f/ef/5a23ec689ff36d7625b38d121ef15abfc3631a9aecb417baf7a4245e4124/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08", size = 665923 }, + { url = "https://files.pythonhosted.org/packages/ae/61/d436461a47437d63c6302c90724cf0981883ec57ceb6073873f32172d676/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5", size = 903400 }, + { url = "https://files.pythonhosted.org/packages/47/42/fc6d35ecefe1739a819afaf6f8e686f7f02a4dd241c78972d316f403474c/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae", size = 860034 }, + { url = "https://files.pythonhosted.org/packages/07/3b/44ea6266a6761e9eefaa37d98fabefa112328808ac41aa87b4bbb668af30/pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711", size = 860579 }, + { url = "https://files.pythonhosted.org/packages/38/6f/4df2014ab553a6052b0e551b37da55166991510f9e1002c89cab7ce3b3f2/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6", size = 1196246 }, + { url = "https://files.pythonhosted.org/packages/38/9d/ee240fc0c9fe9817f0c9127a43238a3e28048795483c403cc10720ddef22/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3", size = 1507441 }, + { url = "https://files.pythonhosted.org/packages/85/4f/01711edaa58d535eac4a26c294c617c9a01f09857c0ce191fd574d06f359/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b", size = 1406498 }, + { url = "https://files.pythonhosted.org/packages/07/18/907134c85c7152f679ed744e73e645b365f3ad571f38bdb62e36f347699a/pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", size = 575533 }, + { url = "https://files.pythonhosted.org/packages/ce/2c/a6f4a20202a4d3c582ad93f95ee78d79bbdc26803495aec2912b17dbbb6c/pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", size = 637768 }, + { url = "https://files.pythonhosted.org/packages/5f/0e/eb16ff731632d30554bf5af4dbba3ffcd04518219d82028aea4ae1b02ca5/pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", size = 540675 }, + { url = "https://files.pythonhosted.org/packages/04/a7/0f7e2f6c126fe6e62dbae0bc93b1bd3f1099cf7fea47a5468defebe3f39d/pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", size = 1006564 }, + { url = "https://files.pythonhosted.org/packages/31/b6/a187165c852c5d49f826a690857684333a6a4a065af0a6015572d2284f6a/pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", size = 1340447 }, + { url = "https://files.pythonhosted.org/packages/68/ba/f4280c58ff71f321602a6e24fd19879b7e79793fb8ab14027027c0fb58ef/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", size = 665485 }, + { url = "https://files.pythonhosted.org/packages/77/b5/c987a5c53c7d8704216f29fc3d810b32f156bcea488a940e330e1bcbb88d/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", size = 903484 }, + { url = "https://files.pythonhosted.org/packages/29/c9/07da157d2db18c72a7eccef8e684cefc155b712a88e3d479d930aa9eceba/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", size = 859981 }, + { url = "https://files.pythonhosted.org/packages/43/09/e12501bd0b8394b7d02c41efd35c537a1988da67fc9c745cae9c6c776d31/pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", size = 860334 }, + { url = "https://files.pythonhosted.org/packages/eb/ff/f5ec1d455f8f7385cc0a8b2acd8c807d7fade875c14c44b85c1bddabae21/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", size = 1196179 }, + { url = "https://files.pythonhosted.org/packages/ec/8a/bb2ac43295b1950fe436a81fc5b298be0b96ac76fb029b514d3ed58f7b27/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", size = 1507668 }, + { url = "https://files.pythonhosted.org/packages/a9/49/dbc284ebcfd2dca23f6349227ff1616a7ee2c4a35fe0a5d6c3deff2b4fed/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", size = 1406539 }, + { url = "https://files.pythonhosted.org/packages/00/68/093cdce3fe31e30a341d8e52a1ad86392e13c57970d722c1f62a1d1a54b6/pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", size = 575567 }, + { url = "https://files.pythonhosted.org/packages/92/ae/6cc4657148143412b5819b05e362ae7dd09fb9fe76e2a539dcff3d0386bc/pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", size = 637551 }, + { url = "https://files.pythonhosted.org/packages/6c/67/fbff102e201688f97c8092e4c3445d1c1068c2f27bbd45a578df97ed5f94/pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", size = 540378 }, + { url = "https://files.pythonhosted.org/packages/3f/fe/2d998380b6e0122c6c4bdf9b6caf490831e5f5e2d08a203b5adff060c226/pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", size = 1007378 }, + { url = "https://files.pythonhosted.org/packages/4a/f4/30d6e7157f12b3a0390bde94d6a8567cdb88846ed068a6e17238a4ccf600/pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", size = 1329532 }, + { url = "https://files.pythonhosted.org/packages/82/86/3fe917870e15ee1c3ad48229a2a64458e36036e64b4afa9659045d82bfa8/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", size = 653242 }, + { url = "https://files.pythonhosted.org/packages/50/2d/242e7e6ef6c8c19e6cb52d095834508cd581ffb925699fd3c640cdc758f1/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", size = 888404 }, + { url = "https://files.pythonhosted.org/packages/ac/11/7270566e1f31e4ea73c81ec821a4b1688fd551009a3d2bab11ec66cb1e8f/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", size = 845858 }, + { url = "https://files.pythonhosted.org/packages/91/d5/72b38fbc69867795c8711bdd735312f9fef1e3d9204e2f63ab57085434b9/pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", size = 847375 }, + { url = "https://files.pythonhosted.org/packages/dd/9a/10ed3c7f72b4c24e719c59359fbadd1a27556a28b36cdf1cd9e4fb7845d5/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", size = 1183489 }, + { url = "https://files.pythonhosted.org/packages/72/2d/8660892543fabf1fe41861efa222455811adac9f3c0818d6c3170a1153e3/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", size = 1492932 }, + { url = "https://files.pythonhosted.org/packages/7b/d6/32fd69744afb53995619bc5effa2a405ae0d343cd3e747d0fbc43fe894ee/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", size = 1392485 }, + { url = "https://files.pythonhosted.org/packages/53/fb/36b2b2548286e9444e52fcd198760af99fd89102b5be50f0660fcfe902df/pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072", size = 906955 }, + { url = "https://files.pythonhosted.org/packages/77/8f/6ce54f8979a01656e894946db6299e2273fcee21c8e5fa57c6295ef11f57/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1", size = 565701 }, + { url = "https://files.pythonhosted.org/packages/ee/1c/bf8cd66730a866b16db8483286078892b7f6536f8c389fb46e4beba0a970/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d", size = 794312 }, + { url = "https://files.pythonhosted.org/packages/71/43/91fa4ff25bbfdc914ab6bafa0f03241d69370ef31a761d16bb859f346582/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca", size = 752775 }, + { url = "https://files.pythonhosted.org/packages/ec/d2/3b2ab40f455a256cb6672186bea95cd97b459ce4594050132d71e76f0d6f/pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c", size = 550762 }, +] + +[[package]] +name = "referencing" +version = "0.35.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/73ca1f8e72fff6fa52119dbd185f73a907b1989428917b24cff660129b6d/referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", size = 62991 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de", size = 26684 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490 }, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242 }, +] + +[[package]] +name = "rpds-py" +version = "0.22.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/80/cce854d0921ff2f0a9fa831ba3ad3c65cee3a46711addf39a2af52df2cfd/rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", size = 26771 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/2a/ead1d09e57449b99dcc190d8d2323e3a167421d8f8fdf0f217c6f6befe47/rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967", size = 359514 }, + { url = "https://files.pythonhosted.org/packages/8f/7e/1254f406b7793b586c68e217a6a24ec79040f85e030fff7e9049069284f4/rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37", size = 349031 }, + { url = "https://files.pythonhosted.org/packages/aa/da/17c6a2c73730d426df53675ff9cc6653ac7a60b6438d03c18e1c822a576a/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24", size = 381485 }, + { url = "https://files.pythonhosted.org/packages/aa/13/2dbacd820466aa2a3c4b747afb18d71209523d353cf865bf8f4796c969ea/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff", size = 386794 }, + { url = "https://files.pythonhosted.org/packages/6d/62/96905d0a35ad4e4bc3c098b2f34b2e7266e211d08635baa690643d2227be/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c", size = 423523 }, + { url = "https://files.pythonhosted.org/packages/eb/1b/d12770f2b6a9fc2c3ec0d810d7d440f6d465ccd8b7f16ae5385952c28b89/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e", size = 446695 }, + { url = "https://files.pythonhosted.org/packages/4d/cf/96f1fd75512a017f8e07408b6d5dbeb492d9ed46bfe0555544294f3681b3/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec", size = 381959 }, + { url = "https://files.pythonhosted.org/packages/ab/f0/d1c5b501c8aea85aeb938b555bfdf7612110a2f8cdc21ae0482c93dd0c24/rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c", size = 410420 }, + { url = "https://files.pythonhosted.org/packages/33/3b/45b6c58fb6aad5a569ae40fb890fc494c6b02203505a5008ee6dc68e65f7/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09", size = 557620 }, + { url = "https://files.pythonhosted.org/packages/83/62/3fdd2d3d47bf0bb9b931c4c73036b4ab3ec77b25e016ae26fab0f02be2af/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00", size = 584202 }, + { url = "https://files.pythonhosted.org/packages/04/f2/5dced98b64874b84ca824292f9cee2e3f30f3bcf231d15a903126684f74d/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf", size = 552787 }, + { url = "https://files.pythonhosted.org/packages/67/13/2273dea1204eda0aea0ef55145da96a9aa28b3f88bb5c70e994f69eda7c3/rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652", size = 220088 }, + { url = "https://files.pythonhosted.org/packages/4e/80/8c8176b67ad7f4a894967a7a4014ba039626d96f1d4874d53e409b58d69f/rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8", size = 231737 }, + { url = "https://files.pythonhosted.org/packages/15/ad/8d1ddf78f2805a71253fcd388017e7b4a0615c22c762b6d35301fef20106/rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", size = 359773 }, + { url = "https://files.pythonhosted.org/packages/c8/75/68c15732293a8485d79fe4ebe9045525502a067865fa4278f178851b2d87/rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", size = 349214 }, + { url = "https://files.pythonhosted.org/packages/3c/4c/7ce50f3070083c2e1b2bbd0fb7046f3da55f510d19e283222f8f33d7d5f4/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", size = 380477 }, + { url = "https://files.pythonhosted.org/packages/9a/e9/835196a69cb229d5c31c13b8ae603bd2da9a6695f35fe4270d398e1db44c/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", size = 386171 }, + { url = "https://files.pythonhosted.org/packages/f9/8e/33fc4eba6683db71e91e6d594a2cf3a8fbceb5316629f0477f7ece5e3f75/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", size = 422676 }, + { url = "https://files.pythonhosted.org/packages/37/47/2e82d58f8046a98bb9497a8319604c92b827b94d558df30877c4b3c6ccb3/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", size = 446152 }, + { url = "https://files.pythonhosted.org/packages/e1/78/79c128c3e71abbc8e9739ac27af11dc0f91840a86fce67ff83c65d1ba195/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", size = 381300 }, + { url = "https://files.pythonhosted.org/packages/c9/5b/2e193be0e8b228c1207f31fa3ea79de64dadb4f6a4833111af8145a6bc33/rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", size = 409636 }, + { url = "https://files.pythonhosted.org/packages/c2/3f/687c7100b762d62186a1c1100ffdf99825f6fa5ea94556844bbbd2d0f3a9/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", size = 556708 }, + { url = "https://files.pythonhosted.org/packages/8c/a2/c00cbc4b857e8b3d5e7f7fc4c81e23afd8c138b930f4f3ccf9a41a23e9e4/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", size = 583554 }, + { url = "https://files.pythonhosted.org/packages/d0/08/696c9872cf56effdad9ed617ac072f6774a898d46b8b8964eab39ec562d2/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", size = 552105 }, + { url = "https://files.pythonhosted.org/packages/18/1f/4df560be1e994f5adf56cabd6c117e02de7c88ee238bb4ce03ed50da9d56/rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", size = 220199 }, + { url = "https://files.pythonhosted.org/packages/b8/1b/c29b570bc5db8237553002788dc734d6bd71443a2ceac2a58202ec06ef12/rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", size = 231775 }, + { url = "https://files.pythonhosted.org/packages/75/47/3383ee3bd787a2a5e65a9b9edc37ccf8505c0a00170e3a5e6ea5fbcd97f7/rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", size = 352334 }, + { url = "https://files.pythonhosted.org/packages/40/14/aa6400fa8158b90a5a250a77f2077c0d0cd8a76fce31d9f2b289f04c6dec/rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", size = 342111 }, + { url = "https://files.pythonhosted.org/packages/7d/06/395a13bfaa8a28b302fb433fb285a67ce0ea2004959a027aea8f9c52bad4/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", size = 384286 }, + { url = "https://files.pythonhosted.org/packages/43/52/d8eeaffab047e6b7b7ef7f00d5ead074a07973968ffa2d5820fa131d7852/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e", size = 391739 }, + { url = "https://files.pythonhosted.org/packages/83/31/52dc4bde85c60b63719610ed6f6d61877effdb5113a72007679b786377b8/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", size = 427306 }, + { url = "https://files.pythonhosted.org/packages/70/d5/1bab8e389c2261dba1764e9e793ed6830a63f830fdbec581a242c7c46bda/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", size = 442717 }, + { url = "https://files.pythonhosted.org/packages/82/a1/a45f3e30835b553379b3a56ea6c4eb622cf11e72008229af840e4596a8ea/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", size = 385721 }, + { url = "https://files.pythonhosted.org/packages/a6/27/780c942de3120bdd4d0e69583f9c96e179dfff082f6ecbb46b8d6488841f/rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", size = 415824 }, + { url = "https://files.pythonhosted.org/packages/94/0b/aa0542ca88ad20ea719b06520f925bae348ea5c1fdf201b7e7202d20871d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", size = 561227 }, + { url = "https://files.pythonhosted.org/packages/0d/92/3ed77d215f82c8f844d7f98929d56cc321bb0bcfaf8f166559b8ec56e5f1/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", size = 587424 }, + { url = "https://files.pythonhosted.org/packages/09/42/cacaeb047a22cab6241f107644f230e2935d4efecf6488859a7dd82fc47d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", size = 555953 }, + { url = "https://files.pythonhosted.org/packages/e6/52/c921dc6d5f5d45b212a456c1f5b17df1a471127e8037eb0972379e39dff4/rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", size = 221339 }, + { url = "https://files.pythonhosted.org/packages/f2/c7/f82b5be1e8456600395366f86104d1bd8d0faed3802ad511ef6d60c30d98/rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", size = 235786 }, + { url = "https://files.pythonhosted.org/packages/d0/bf/36d5cc1f2c609ae6e8bf0fc35949355ca9d8790eceb66e6385680c951e60/rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", size = 351657 }, + { url = "https://files.pythonhosted.org/packages/24/2a/f1e0fa124e300c26ea9382e59b2d582cba71cedd340f32d1447f4f29fa4e/rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", size = 341829 }, + { url = "https://files.pythonhosted.org/packages/cf/c2/0da1231dd16953845bed60d1a586fcd6b15ceaeb965f4d35cdc71f70f606/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", size = 384220 }, + { url = "https://files.pythonhosted.org/packages/c7/73/a4407f4e3a00a9d4b68c532bf2d873d6b562854a8eaff8faa6133b3588ec/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", size = 391009 }, + { url = "https://files.pythonhosted.org/packages/a9/c3/04b7353477ab360fe2563f5f0b176d2105982f97cd9ae80a9c5a18f1ae0f/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", size = 426989 }, + { url = "https://files.pythonhosted.org/packages/8d/e6/e4b85b722bcf11398e17d59c0f6049d19cd606d35363221951e6d625fcb0/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", size = 441544 }, + { url = "https://files.pythonhosted.org/packages/27/fc/403e65e56f65fff25f2973216974976d3f0a5c3f30e53758589b6dc9b79b/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", size = 385179 }, + { url = "https://files.pythonhosted.org/packages/57/9b/2be9ff9700d664d51fd96b33d6595791c496d2778cb0b2a634f048437a55/rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", size = 415103 }, + { url = "https://files.pythonhosted.org/packages/bb/a5/03c2ad8ca10994fcf22dd2150dd1d653bc974fa82d9a590494c84c10c641/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", size = 560916 }, + { url = "https://files.pythonhosted.org/packages/ba/2e/be4fdfc8b5b576e588782b56978c5b702c5a2307024120d8aeec1ab818f0/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", size = 587062 }, + { url = "https://files.pythonhosted.org/packages/67/e0/2034c221937709bf9c542603d25ad43a68b4b0a9a0c0b06a742f2756eb66/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", size = 555734 }, + { url = "https://files.pythonhosted.org/packages/ea/ce/240bae07b5401a22482b58e18cfbabaa392409b2797da60223cca10d7367/rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", size = 220663 }, + { url = "https://files.pythonhosted.org/packages/cb/f0/d330d08f51126330467edae2fa4efa5cec8923c87551a79299380fdea30d/rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", size = 235503 }, + { url = "https://files.pythonhosted.org/packages/f7/c4/dbe1cc03df013bf2feb5ad00615038050e7859f381e96fb5b7b4572cd814/rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", size = 347698 }, + { url = "https://files.pythonhosted.org/packages/a4/3a/684f66dd6b0f37499cad24cd1c0e523541fd768576fa5ce2d0a8799c3cba/rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", size = 337330 }, + { url = "https://files.pythonhosted.org/packages/82/eb/e022c08c2ce2e8f7683baa313476492c0e2c1ca97227fe8a75d9f0181e95/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", size = 380022 }, + { url = "https://files.pythonhosted.org/packages/e4/21/5a80e653e4c86aeb28eb4fea4add1f72e1787a3299687a9187105c3ee966/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", size = 390754 }, + { url = "https://files.pythonhosted.org/packages/37/a4/d320a04ae90f72d080b3d74597074e62be0a8ecad7d7321312dfe2dc5a6a/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", size = 423840 }, + { url = "https://files.pythonhosted.org/packages/87/70/674dc47d93db30a6624279284e5631be4c3a12a0340e8e4f349153546728/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", size = 438970 }, + { url = "https://files.pythonhosted.org/packages/3f/64/9500f4d66601d55cadd21e90784cfd5d5f4560e129d72e4339823129171c/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", size = 383146 }, + { url = "https://files.pythonhosted.org/packages/4d/45/630327addb1d17173adcf4af01336fd0ee030c04798027dfcb50106001e0/rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", size = 408294 }, + { url = "https://files.pythonhosted.org/packages/5f/ef/8efb3373cee54ea9d9980b772e5690a0c9e9214045a4e7fa35046e399fee/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", size = 556345 }, + { url = "https://files.pythonhosted.org/packages/54/01/151d3b9ef4925fc8f15bfb131086c12ec3c3d6dd4a4f7589c335bf8e85ba/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", size = 582292 }, + { url = "https://files.pythonhosted.org/packages/30/89/35fc7a6cdf3477d441c7aca5e9bbf5a14e0f25152aed7f63f4e0b141045d/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", size = 553855 }, + { url = "https://files.pythonhosted.org/packages/8f/e0/830c02b2457c4bd20a8c5bb394d31d81f57fbefce2dbdd2e31feff4f7003/rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", size = 219100 }, + { url = "https://files.pythonhosted.org/packages/f8/30/7ac943f69855c2db77407ae363484b915d861702dbba1aa82d68d57f42be/rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", size = 233794 }, + { url = "https://files.pythonhosted.org/packages/8b/63/e29f8ee14fcf383574f73b6bbdcbec0fbc2e5fc36b4de44d1ac389b1de62/rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d", size = 360786 }, + { url = "https://files.pythonhosted.org/packages/d3/e0/771ee28b02a24e81c8c0e645796a371350a2bb6672753144f36ae2d2afc9/rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd", size = 350589 }, + { url = "https://files.pythonhosted.org/packages/cf/49/abad4c4a1e6f3adf04785a99c247bfabe55ed868133e2d1881200aa5d381/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493", size = 381848 }, + { url = "https://files.pythonhosted.org/packages/3a/7d/f4bc6d6fbe6af7a0d2b5f2ee77079efef7c8528712745659ec0026888998/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96", size = 387879 }, + { url = "https://files.pythonhosted.org/packages/13/b0/575c797377fdcd26cedbb00a3324232e4cb2c5d121f6e4b0dbf8468b12ef/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123", size = 423916 }, + { url = "https://files.pythonhosted.org/packages/54/78/87157fa39d58f32a68d3326f8a81ad8fb99f49fe2aa7ad9a1b7d544f9478/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad", size = 448410 }, + { url = "https://files.pythonhosted.org/packages/59/69/860f89996065a88be1b6ff2d60e96a02b920a262d8aadab99e7903986597/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9", size = 382841 }, + { url = "https://files.pythonhosted.org/packages/bd/d7/bc144e10d27e3cb350f98df2492a319edd3caaf52ddfe1293f37a9afbfd7/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e", size = 409662 }, + { url = "https://files.pythonhosted.org/packages/14/2a/6bed0b05233c291a94c7e89bc76ffa1c619d4e1979fbfe5d96024020c1fb/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338", size = 558221 }, + { url = "https://files.pythonhosted.org/packages/11/23/cd8f566de444a137bc1ee5795e47069a947e60810ba4152886fe5308e1b7/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566", size = 583780 }, + { url = "https://files.pythonhosted.org/packages/8d/63/79c3602afd14d501f751e615a74a59040328da5ef29ed5754ae80d236b84/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe", size = 553619 }, + { url = "https://files.pythonhosted.org/packages/9f/2e/c5c1689e80298d4e94c75b70faada4c25445739d91b94c211244a3ed7ed1/rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d", size = 233338 }, +] + +[[package]] +name = "ruff" +version = "0.8.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/00/089db7890ea3be5709e3ece6e46408d6f1e876026ec3fd081ee585fef209/ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5", size = 3473116 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/28/aa07903694637c2fa394a9f4fe93cf861ad8b09f1282fa650ef07ff9fe97/ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3", size = 10628735 }, + { url = "https://files.pythonhosted.org/packages/2b/43/827bb1448f1fcb0fb42e9c6edf8fb067ca8244923bf0ddf12b7bf949065c/ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1", size = 10386758 }, + { url = "https://files.pythonhosted.org/packages/df/93/fc852a81c3cd315b14676db3b8327d2bb2d7508649ad60bfdb966d60738d/ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807", size = 10007808 }, + { url = "https://files.pythonhosted.org/packages/94/e9/e0ed4af1794335fb280c4fac180f2bf40f6a3b859cae93a5a3ada27325ae/ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25", size = 10861031 }, + { url = "https://files.pythonhosted.org/packages/82/68/da0db02f5ecb2ce912c2bef2aa9fcb8915c31e9bc363969cfaaddbc4c1c2/ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d", size = 10388246 }, + { url = "https://files.pythonhosted.org/packages/ac/1d/b85383db181639019b50eb277c2ee48f9f5168f4f7c287376f2b6e2a6dc2/ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75", size = 11424693 }, + { url = "https://files.pythonhosted.org/packages/ac/b7/30bc78a37648d31bfc7ba7105b108cb9091cd925f249aa533038ebc5a96f/ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315", size = 12141921 }, + { url = "https://files.pythonhosted.org/packages/60/b3/ee0a14cf6a1fbd6965b601c88d5625d250b97caf0534181e151504498f86/ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188", size = 11692419 }, + { url = "https://files.pythonhosted.org/packages/ef/d6/c597062b2931ba3e3861e80bd2b147ca12b3370afc3889af46f29209037f/ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf", size = 12981648 }, + { url = "https://files.pythonhosted.org/packages/68/84/21f578c2a4144917985f1f4011171aeff94ab18dfa5303ac632da2f9af36/ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117", size = 11251801 }, + { url = "https://files.pythonhosted.org/packages/6c/aa/1ac02537c8edeb13e0955b5db86b5c050a1dcba54f6d49ab567decaa59c1/ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe", size = 10849857 }, + { url = "https://files.pythonhosted.org/packages/eb/00/020cb222252d833956cb3b07e0e40c9d4b984fbb2dc3923075c8f944497d/ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d", size = 10470852 }, + { url = "https://files.pythonhosted.org/packages/00/56/e6d6578202a0141cd52299fe5acb38b2d873565f4670c7a5373b637cf58d/ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a", size = 10972997 }, + { url = "https://files.pythonhosted.org/packages/be/31/dd0db1f4796bda30dea7592f106f3a67a8f00bcd3a50df889fbac58e2786/ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76", size = 11317760 }, + { url = "https://files.pythonhosted.org/packages/d4/70/cfcb693dc294e034c6fed837fa2ec98b27cc97a26db5d049345364f504bf/ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764", size = 8799729 }, + { url = "https://files.pythonhosted.org/packages/60/22/ae6bcaa0edc83af42751bd193138bfb7598b2990939d3e40494d6c00698c/ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905", size = 9673857 }, + { url = "https://files.pythonhosted.org/packages/91/f8/3765e053acd07baa055c96b2065c7fab91f911b3c076dfea71006666f5b0/ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162", size = 9149556 }, +] + +[[package]] +name = "send2trash" +version = "1.8.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf", size = 17394 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072 }, +] + +[[package]] +name = "setuptools" +version = "75.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/57/e6f0bde5a2c333a32fbcce201f906c1fd0b3a7144138712a5e9d9598c5ec/setuptools-75.7.0.tar.gz", hash = "sha256:886ff7b16cd342f1d1defc16fc98c9ce3fde69e087a4e1983d7ab634e5f41f4f", size = 1338616 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/6e/abdfaaf5c294c553e7a81cf5d801fbb4f53f5c5b6646de651f92a2667547/setuptools-75.7.0-py3-none-any.whl", hash = "sha256:84fb203f278ebcf5cd08f97d3fb96d3fbed4b629d500b29ad60d11e00769b183", size = 1224467 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, +] + +[[package]] +name = "soupsieve" +version = "2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, +] + +[[package]] +name = "sourcery" +version = "1.28.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4f/ec/ca54e440acabd4737a5b0b5ea51bbebb2f226801e43c79ad2ebb305a22e4/sourcery-1.28.0-py2.py3-none-macosx_10_9_universal2.whl", hash = "sha256:ede0daff5ef75fc0a584f5c044c9bfa591905fa4ea6b7ec86210cdea149c6821", size = 90850628 }, + { url = "https://files.pythonhosted.org/packages/ff/3e/2156d7b3a9b82fec1f6b30a850a5c70f4448c7edd1b037f8d21a4d57f9b7/sourcery-1.28.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:b4a3c8d60ce1b912565082c33a1427a04b347d32bfeac0d706319cfff30706dd", size = 116086476 }, + { url = "https://files.pythonhosted.org/packages/21/b7/90afde2a62768e56cd46d3a884a5beecb1edc9a3b7da1117cb7ee2932b06/sourcery-1.28.0-py2.py3-none-win_amd64.whl", hash = "sha256:a1f22a15d1731f14c283ec24f66d1efb143fe26ecc78e22a98d4ce76c463a969", size = 89178129 }, +] + +[[package]] +name = "sphinx" +version = "8.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alabaster" }, + { name = "babel" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "docutils" }, + { name = "imagesize" }, + { name = "jinja2" }, + { name = "packaging" }, + { name = "pygments" }, + { name = "requests" }, + { name = "snowballstemmer" }, + { name = "sphinxcontrib-applehelp" }, + { name = "sphinxcontrib-devhelp" }, + { name = "sphinxcontrib-htmlhelp" }, + { name = "sphinxcontrib-jsmath" }, + { name = "sphinxcontrib-qthelp" }, + { name = "sphinxcontrib-serializinghtml" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125 }, +] + +[[package]] +name = "sphinx-argparse-cli" +version = "1.19.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/32/5f/ae6043738a48408ce1371303958fa02943d29619dd5d202e147b1dc8552d/sphinx_argparse_cli-1.19.0.tar.gz", hash = "sha256:0374b23560fd4246234c0ef2d8bb97703088c8ae721bf63a84b9fd0d32f87a78", size = 12667 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/1f/7d40169591a70fb1a8ba57345e22c3f6dca5b06ee6efddafe5ccee91336c/sphinx_argparse_cli-1.19.0-py3-none-any.whl", hash = "sha256:c0e069deed1db44d289f90469c04320f1c2249b3dcbd3c3e093bf9a66e4bd8e4", size = 9941 }, +] + +[[package]] +name = "sphinx-autodoc-typehints" +version = "3.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2f/37/725d06f80cbe85b8538021df4515b7408af231cbe8b201a3bb2cf773a83d/sphinx_autodoc_typehints-3.0.0.tar.gz", hash = "sha256:d5cdab471efb10fcff4ffe81a2ef713398bc891af9d942a4b763f5ed1d9bf550", size = 35943 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/36/110d38a8b481b915d77461ca68764ebacf7aeba84be7cbe2dc965a65ae80/sphinx_autodoc_typehints-3.0.0-py3-none-any.whl", hash = "sha256:b82bf83e23ae3d5dc25881004a6d6614be6291ff8ff165b2d1e18799f0f6bd74", size = 20041 }, +] + +[[package]] +name = "sphinx-basic-ng" +version = "1.0.0b2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, +] + +[[package]] +name = "sphinxcontrib-mermaid" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/69/bf039237ad260073e8c02f820b3e00dc34f3a2de20aff7861e6b19d2f8c5/sphinxcontrib_mermaid-1.0.0.tar.gz", hash = "sha256:2e8ab67d3e1e2816663f9347d026a8dee4a858acdd4ad32dd1c808893db88146", size = 15153 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/c8/784b9ac6ea08aa594c1a4becbd0dbe77186785362e31fd633b8c6ae0197a/sphinxcontrib_mermaid-1.0.0-py3-none-any.whl", hash = "sha256:60b72710ea02087f212028feb09711225fbc2e343a10d34822fe787510e1caa3", size = 9597 }, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, +] + +[[package]] +name = "terminado" +version = "0.18.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess", marker = "os_name != 'nt'" }, + { name = "pywinpty", marker = "os_name == 'nt'" }, + { name = "tornado" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154 }, +] + +[[package]] +name = "tinycss2" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, +] + +[[package]] +name = "tomli" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, +] + +[[package]] +name = "tornado" +version = "6.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, + { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, + { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, + { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, + { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, + { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, + { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, + { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, + { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, + { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, +] + +[[package]] +name = "trafficgen" +version = "0.6.0" +source = { editable = "." } +dependencies = [ + { name = "basemap" }, + { name = "basemap-data-hires" }, + { name = "dictio" }, + { name = "folium" }, + { name = "global-land-mask" }, + { name = "matplotlib" }, + { name = "numpy" }, +] + +[package.dev-dependencies] +dev = [ + { name = "click" }, + { name = "click-log" }, + { name = "furo" }, + { name = "jupyter" }, + { name = "mypy" }, + { name = "myst-parser" }, + { name = "pandas-stubs" }, + { name = "pre-commit" }, + { name = "pydantic" }, + { name = "pyright" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "ruff" }, + { name = "sourcery" }, + { name = "sphinx" }, + { name = "sphinx-argparse-cli" }, + { name = "sphinx-autodoc-typehints" }, + { name = "sphinxcontrib-mermaid" }, +] + +[package.metadata] +requires-dist = [ + { name = "basemap", specifier = ">=1.3.8" }, + { name = "basemap-data-hires", specifier = ">=1.3.2" }, + { name = "dictio", specifier = ">=0.4.0" }, + { name = "folium", specifier = ">=0.14.0" }, + { name = "global-land-mask", specifier = ">=1.0.0" }, + { name = "matplotlib", specifier = ">=3.7.2" }, + { name = "numpy", specifier = ">=1.25,<2.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "click", specifier = ">=8.1" }, + { name = "click-log", specifier = ">=0.4.0" }, + { name = "furo", specifier = ">=2024.8" }, + { name = "jupyter", specifier = ">=1.1" }, + { name = "mypy", specifier = ">=1.13" }, + { name = "myst-parser", specifier = ">=4.0" }, + { name = "pandas-stubs", specifier = ">=2.2" }, + { name = "pre-commit", specifier = ">=4.0" }, + { name = "pydantic", specifier = ">=2.5" }, + { name = "pyright", specifier = ">=1.1.390" }, + { name = "pytest", specifier = ">=8.3" }, + { name = "pytest-cov", specifier = ">=6.0" }, + { name = "ruff", specifier = ">=0.8.3" }, + { name = "sourcery", specifier = ">=1.27" }, + { name = "sphinx", specifier = ">=8.1" }, + { name = "sphinx-argparse-cli", specifier = ">=1.19" }, + { name = "sphinx-autodoc-typehints", specifier = ">=2.5" }, + { name = "sphinxcontrib-mermaid", specifier = ">=1.0.0" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, +] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20241206" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/60/47d92293d9bc521cd2301e423a358abfac0ad409b3a1606d8fbae1321961/types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb", size = 13802 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/b3/ca41df24db5eb99b00d97f89d7674a90cb6b3134c52fb8121b6d8d30f15c/types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53", size = 14384 }, +] + +[[package]] +name = "types-pytz" +version = "2024.2.0.20241221" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/26/516311b02b5a215e721155fb65db8a965d061372e388d6125ebce8d674b0/types_pytz-2024.2.0.20241221.tar.gz", hash = "sha256:06d7cde9613e9f7504766a0554a270c369434b50e00975b3a4a0f6eed0f2c1a9", size = 10213 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/db/c92ca6920cccd9c2998b013601542e2ac5e59bc805bcff94c94ad254b7df/types_pytz-2024.2.0.20241221-py3-none-any.whl", hash = "sha256:8fc03195329c43637ed4f593663df721fef919b60a969066e22606edf0b53ad5", size = 10008 }, +] + +[[package]] +name = "typing-extensions" +version = "4.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140 }, +] + +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +] + +[[package]] +name = "virtualenv" +version = "20.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/39/689abee4adc85aad2af8174bb195a819d0be064bf55fcc73b49d2b28ae77/virtualenv-20.28.1.tar.gz", hash = "sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329", size = 7650532 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/8f/dfb257ca6b4e27cb990f1631142361e4712badab8e3ca8dc134d96111515/virtualenv-20.28.1-py3-none-any.whl", hash = "sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb", size = 4276719 }, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, +] + +[[package]] +name = "webcolors" +version = "24.11.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934 }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826 }, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.13" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/fc/238c424fd7f4ebb25f8b1da9a934a3ad7c848286732ae04263661eb0fc03/widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6", size = 1164730 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71", size = 2335872 }, +] + +[[package]] +name = "xyzservices" +version = "2024.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a0/16/ae87cbd2d6bfc40a419077521c35aadf5121725b7bee3d7c51b56f50958b/xyzservices-2024.9.0.tar.gz", hash = "sha256:68fb8353c9dbba4f1ff6c0f2e5e4e596bb9e1db7f94f4f7dfbcb26e25aa66fde", size = 1131900 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/d3/e07ce413d16ef64e885bea37551eac4c5ca3ddd440933f9c94594273d0d9/xyzservices-2024.9.0-py3-none-any.whl", hash = "sha256:776ae82b78d6e5ca63dd6a94abb054df8130887a4a308473b54a6bd364de8644", size = 85130 }, +] From 92a355fee6bda8d60c816e623c14c83d9383f3c5 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Wed, 8 Jan 2025 11:03:58 +0100 Subject: [PATCH 04/23] Updating workflows --- .../_build_and_publish_documentation.yml | 27 +++--- .github/workflows/_build_package.yml | 49 +++------- .github/workflows/_code_quality.yml | 97 ++++++++++++------- .github/workflows/_merge_into_release.yml | 8 +- .github/workflows/_requirements_files.yml | 34 ------- .github/workflows/_test.yml | 24 ++--- .github/workflows/_test_future.yml | 28 +++--- .github/workflows/nightly_build.yml | 6 -- .github/workflows/publish_release.yml | 40 ++++---- .github/workflows/pull_request_to_main.yml | 4 - .github/workflows/push.yml | 4 - .github/workflows/push_to_main.yml | 7 +- .github/workflows/push_to_release.yml | 3 - 13 files changed, 139 insertions(+), 192 deletions(-) delete mode 100644 .github/workflows/_requirements_files.yml diff --git a/.github/workflows/_build_and_publish_documentation.yml b/.github/workflows/_build_and_publish_documentation.yml index d4ba53f..2fed60c 100644 --- a/.github/workflows/_build_and_publish_documentation.yml +++ b/.github/workflows/_build_and_publish_documentation.yml @@ -15,19 +15,18 @@ jobs: - name: Checkout active branch uses: actions/checkout@v4 with: - fetch-depth: 1 lfs: true - - name: Install Python - uses: actions/setup-python@v5 + - name: Install uv + uses: astral-sh/setup-uv@v2 with: - python-version: '3.11' - cache: 'pip' # cache pip dependencies - - uses: actions/download-artifact@v4 + enable-cache: true + cache-dependency-glob: "uv.lock" + - name: Set up Python + uses: actions/setup-python@v5 with: - name: requirements-files - - name: Install dependencies - run: | - pip install -r requirements-docs.txt + python-version-file: "pyproject.toml" + - name: Install the project + run: uv sync --upgrade - name: Print debugging information run: | echo "github.ref:" ${{github.ref}} @@ -39,17 +38,15 @@ jobs: git branch git branch -a git remote -v - python -V - pip list --not-required - pip list + uv run python -V + uv pip list # Build documentation - uses: sphinx-doc/github-problem-matcher@master - name: Build documentation run: | cd docs - sphinx-apidoc -f -e -M -o . ../src/trafficgen - make html + uv run make html - name: Clone and cleanup gh-pages branch run: | diff --git a/.github/workflows/_build_package.yml b/.github/workflows/_build_package.yml index f6fe883..362d3aa 100644 --- a/.github/workflows/_build_package.yml +++ b/.github/workflows/_build_package.yml @@ -9,46 +9,21 @@ jobs: steps: - uses: actions/checkout@v4 with: - fetch-depth: 1 lfs: true + - name: Install uv + uses: astral-sh/setup-uv@v2 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" - uses: actions/setup-python@v5 with: - python-version: '3.11' - cache: 'pip' # cache pip dependencies - - name: Install build and twine - run: pip install build twine - - name: Run build - run: python -m build + python-version-file: "pyproject.toml" + - name: Build source distribution and wheel + run: uv build - name: Run twine check - run: twine check --strict dist/* + run: uvx twine check --strict dist/* - uses: actions/upload-artifact@v4 with: - path: ./dist/*.tar.gz - - # build_wheels: - # name: Build wheels for ${{ matrix.platform }} - # needs: - # - black - # - ruff - # - pyright - # - test - # runs-on: ${{ matrix.platform }} - # strategy: - # matrix: - # platform: [ubuntu-latest, macos-latest, windows-latest] - # steps: - # - uses: actions/checkout@v4 - # with: - # fetch-depth: 1 - # lfs: true - # - uses: actions/setup-python@v5 - # with: - # python-version: '3.11' - # cache: 'pip' # cache pip dependencies - # - name: Install cibuildwheel - # run: python -m pip install cibuildwheel==2.16 - # - name: Build wheels - # run: python -m cibuildwheel --output-dir wheels - # - uses: actions/upload-artifact@v4 - # with: - # path: ./wheels/*.whl + path: | + dist/*.tar.gz + dist/*.whl diff --git a/.github/workflows/_code_quality.yml b/.github/workflows/_code_quality.yml index 60f44f0..d3e65a7 100644 --- a/.github/workflows/_code_quality.yml +++ b/.github/workflows/_code_quality.yml @@ -3,55 +3,78 @@ name: Code Quality on: workflow_call jobs: - black: - name: black + ruff_format: runs-on: ubuntu-latest + name: ruff format steps: - uses: actions/checkout@v4 - - uses: psf/black@stable + - name: Install uv + uses: astral-sh/setup-uv@v2 with: - options: '--check --diff' - src: '.' - jupyter: true - version: '==23.12' + enable-cache: true + cache-dependency-glob: "uv.lock" + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + - name: Install the project + run: uv sync --upgrade + - name: Run ruff format + run: uv run ruff format --diff - ruff: + ruff_check: runs-on: ubuntu-latest - name: ruff + name: ruff check steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' # cache pip dependencies - - uses: actions/download-artifact@v4 - with: - name: requirements-files - - name: Install dependencies - run: | - pip install -r requirements.txt - - name: Install ruff - run: pip install ruff==0.1.8 - - name: Run ruff - run: ruff . + - name: Install uv + uses: astral-sh/setup-uv@v2 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + - name: Install the project + run: uv sync --upgrade + - name: Run ruff check + run: uv run ruff check --diff pyright: runs-on: ubuntu-latest name: pyright steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' # cache pip dependencies - - uses: actions/download-artifact@v4 - with: - name: requirements-files - - name: Install dependencies - run: | - pip install -r requirements.txt - pip install pytest - - name: Install pyright - run: pip install pyright==1.1.338 + - name: Install uv + uses: astral-sh/setup-uv@v2 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + - name: Install the project + run: uv sync --upgrade - name: Run pyright - run: pyright . + run: uv run pyright + + mypy: + runs-on: ubuntu-latest + name: mypy + steps: + - uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v2 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + - name: Install the project + run: uv sync --upgrade + - name: Run mypy + run: uv run mypy diff --git a/.github/workflows/_merge_into_release.yml b/.github/workflows/_merge_into_release.yml index cec3964..3396509 100644 --- a/.github/workflows/_merge_into_release.yml +++ b/.github/workflows/_merge_into_release.yml @@ -22,4 +22,10 @@ jobs: with: type: now target_branch: release - github_token: ${{ secrets.RELEASE_TOKEN }} + # @TODO: A dedicated RELEASE_TOKEN should be created in the repo settings + # and used for this task when in production. + # It is set here to the default GITHUB_TOKEN only + # for demonstration purposes, enabling the workflow in the repo template + # to run without additional configuration. + # github_token: ${{ secrets.RELEASE_TOKEN }} + github_token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/_requirements_files.yml b/.github/workflows/_requirements_files.yml deleted file mode 100644 index 7e3b34d..0000000 --- a/.github/workflows/_requirements_files.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Requirements Files - -on: workflow_call - -jobs: - requirements: - name: Create requirements files from poetry - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: '3.11' - cache: 'pip' # cache pip dependencies - - name: Create requirements files from poetry.lock file - run: | - pip install poetry - pip install poetry-plugin-export - poetry lock - poetry export -o requirements.txt --without-hashes --format requirements.txt - poetry export -o requirements-dev.txt --without-hashes --format requirements.txt --with dev - poetry export -o requirements-docs.txt --without-hashes --format requirements.txt --with docs - - name: Upload requirements files as artifact - uses: actions/upload-artifact@v4 - with: - name: requirements-files - path: | - poetry.lock - requirements.txt - requirements-dev.txt - requirements-docs.txt - - name: Delete poetry.lock file - run: | - rm -f poetry.lock diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml index 504c4a7..15ce426 100644 --- a/.github/workflows/_test.yml +++ b/.github/workflows/_test.yml @@ -4,32 +4,32 @@ on: workflow_call jobs: test: - name: Test on ${{matrix.python.toxenv}}-${{matrix.platform.toxenv}} + name: Test on ${{matrix.python.version}}-${{matrix.platform.runner}} runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-latest - toxenv: linux - runner: windows-latest - toxenv: windows + # - runner: macos-latest python: - - version: '3.9' - toxenv: 'py39' - version: '3.10' - toxenv: 'py310' - version: '3.11' - toxenv: 'py311' - version: '3.12' - toxenv: 'py312' steps: - uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v2 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" - name: Install Python ${{ matrix.python.version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python.version }} - cache: 'pip' # cache pip dependencies - - name: Install tox - run: python -m pip install tox + - name: Install the project + run: uv sync -p ${{ matrix.python.version }} -U --no-dev - name: Run pytest - run: tox -e ${{matrix.python.toxenv}}-${{matrix.platform.toxenv}} + run: > + uv run --with pytest --with pytest-cov + pytest --cov diff --git a/.github/workflows/_test_future.yml b/.github/workflows/_test_future.yml index aed952a..71de688 100644 --- a/.github/workflows/_test_future.yml +++ b/.github/workflows/_test_future.yml @@ -1,31 +1,35 @@ -name: Unit Tests (py312) -# Test also with Python 3.12 (experimental; workflow will not fail on error.) +name: Unit Tests (py313) +# Test also with Python 3.13 (experimental; workflow will not fail on error.) on: workflow_call jobs: - test312: - name: Test on ${{matrix.python.toxenv}}-${{matrix.platform.toxenv}} (experimental) + test313: + name: Test on ${{matrix.python.version}}-${{matrix.platform.runner}} (experimental) continue-on-error: true runs-on: ${{ matrix.platform.runner }} strategy: matrix: platform: - runner: ubuntu-latest - toxenv: linux - runner: windows-latest - toxenv: windows python: - - version: '3.13.0a2' - toxenv: 'py313' + - version: '3.13.0-alpha - 3.13.0' + uvpy: '3.13' steps: - uses: actions/checkout@v4 + - name: Install uv + uses: astral-sh/setup-uv@v2 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" - name: Install Python ${{ matrix.python.version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python.version }} - cache: 'pip' # cache pip dependencies - - name: Install tox - run: python -m pip install tox + - name: Install the project + run: uv sync -p ${{ matrix.python.uvpy }} -U --no-dev - name: Run pytest - run: tox -e ${{matrix.python.toxenv}}-${{matrix.platform.toxenv}} + run: > + uv run --with pytest --with pytest-cov + pytest --cov diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index d5b14c7..28f6868 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -6,20 +6,14 @@ on: - cron: '30 5 * * *' jobs: - requirements_files: - uses: ./.github/workflows/_requirements_files.yml code_quality: - needs: requirements_files uses: ./.github/workflows/_code_quality.yml test: - needs: requirements_files uses: ./.github/workflows/_test.yml test_future: - needs: requirements_files uses: ./.github/workflows/_test_future.yml build_package: needs: - - code_quality - test uses: ./.github/workflows/_build_package.yml build_and_publish_documentation: diff --git a/.github/workflows/publish_release.yml b/.github/workflows/publish_release.yml index 2275117..faff098 100644 --- a/.github/workflows/publish_release.yml +++ b/.github/workflows/publish_release.yml @@ -7,28 +7,24 @@ on: - v* jobs: - # requirements_files: - # uses: ./.github/workflows/_requirements_files.yml - # build_package: - # needs: - # - requirements_files - # uses: ./.github/workflows/_build_package.yml - # publish_package: - # name: Publish package - # needs: - # - build_package - # runs-on: ubuntu-latest - # environment: release - # permissions: - # id-token: write - # steps: - # - uses: actions/download-artifact@v4 - # with: - # name: artifact - # path: dist - # - uses: pypa/gh-action-pypi-publish@release/v1 - # # with: # Uncomment this line to publish to testpypi - # # repository-url: https://test.pypi.org/legacy/ # Uncomment this line to publish to testpypi + build_package: + uses: ./.github/workflows/_build_package.yml + publish_package: + name: Publish package + needs: + - build_package + runs-on: ubuntu-latest + environment: release + permissions: + id-token: write + steps: + - uses: actions/download-artifact@v4 + with: + name: artifact + path: dist + - uses: pypa/gh-action-pypi-publish@release/v1 + # with: # Uncomment this line to publish to testpypi + # repository-url: https://test.pypi.org/legacy/ # Uncomment this line to publish to testpypi merge_into_release: uses: ./.github/workflows/_merge_into_release.yml secrets: diff --git a/.github/workflows/pull_request_to_main.yml b/.github/workflows/pull_request_to_main.yml index 97d2742..2bff438 100644 --- a/.github/workflows/pull_request_to_main.yml +++ b/.github/workflows/pull_request_to_main.yml @@ -17,13 +17,9 @@ concurrency: cancel-in-progress: true jobs: - requirements_files: - uses: ./.github/workflows/_requirements_files.yml code_quality: - needs: requirements_files uses: ./.github/workflows/_code_quality.yml test: - needs: requirements_files uses: ./.github/workflows/_test.yml # build_package: # needs: diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml index 5cc0fbf..08debf2 100644 --- a/.github/workflows/push.yml +++ b/.github/workflows/push.yml @@ -12,11 +12,7 @@ concurrency: cancel-in-progress: true jobs: - requirements_files: - uses: ./.github/workflows/_requirements_files.yml code_quality: - needs: requirements_files uses: ./.github/workflows/_code_quality.yml test: - needs: requirements_files uses: ./.github/workflows/_test.yml diff --git a/.github/workflows/push_to_main.yml b/.github/workflows/push_to_main.yml index 1e5257e..735f70b 100644 --- a/.github/workflows/push_to_main.yml +++ b/.github/workflows/push_to_main.yml @@ -11,13 +11,9 @@ concurrency: cancel-in-progress: true jobs: - requirements_files: - uses: ./.github/workflows/_requirements_files.yml code_quality: - needs: requirements_files uses: ./.github/workflows/_code_quality.yml test: - needs: requirements_files uses: ./.github/workflows/_test.yml build_package: needs: @@ -25,5 +21,6 @@ jobs: - test uses: ./.github/workflows/_build_package.yml build_and_publish_documentation: - needs: build_package + needs: + - build_package uses: ./.github/workflows/_build_and_publish_documentation.yml diff --git a/.github/workflows/push_to_release.yml b/.github/workflows/push_to_release.yml index 083caaf..8880838 100644 --- a/.github/workflows/push_to_release.yml +++ b/.github/workflows/push_to_release.yml @@ -11,8 +11,5 @@ concurrency: cancel-in-progress: true jobs: - requirements_files: - uses: ./.github/workflows/_requirements_files.yml build_and_publish_documentation: - needs: requirements_files uses: ./.github/workflows/_build_and_publish_documentation.yml From 8045f40af1d7004bc5b1818645c08ca57bffa7a9 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Thu, 16 Jan 2025 09:08:27 +0100 Subject: [PATCH 05/23] Working on #43 and support for UV --- docs/make.bat | 6 +- ruff.toml | 4 +- src/trafficgen/cli.py | 22 +- src/trafficgen/encounter.py | 60 ++--- src/trafficgen/plot_traffic_situation.py | 10 +- src/trafficgen/read_files.py | 114 ++++++-- src/trafficgen/types.py | 245 +++++++++--------- src/trafficgen/utils.py | 4 + .../write_traffic_situation_to_file.py | 19 +- tests/conftest.py | 7 +- tests/test_trafficgen.py | 14 +- 11 files changed, 295 insertions(+), 210 deletions(-) diff --git a/docs/make.bat b/docs/make.bat index ba64b82..7ecca52 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -7,11 +7,9 @@ REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) -set SOURCEDIR=. +set SOURCEDIR=source set BUILDDIR=build -if "%1" == "" goto help - %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. @@ -25,6 +23,8 @@ if errorlevel 9009 ( exit /b 1 ) +if "%1" == "" goto help + %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -a -E goto end diff --git a/ruff.toml b/ruff.toml index 9e92dd8..b768d04 100644 --- a/ruff.toml +++ b/ruff.toml @@ -79,7 +79,9 @@ ignore-names = [ ] [lint.pylint] -max-args = 7 +max-args = 10 +max-statements = 75 +max-branches = 15 [lint.flake8-pytest-style] raises-require-match-for = [ diff --git a/src/trafficgen/cli.py b/src/trafficgen/cli.py index f87250b..fc8fa63 100644 --- a/src/trafficgen/cli.py +++ b/src/trafficgen/cli.py @@ -37,7 +37,7 @@ @click.group() @click_log.simple_verbosity_option(logger) -def main(args=None): +def main(args=None): # noqa: ANN001, ANN201, ARG001 """Entry point for console script as configured in pyproject.toml. Runs the command line interface and parses arguments and options entered on the console. @@ -113,16 +113,16 @@ def main(args=None): help="Plot individual traffic situation, specify an INTEGER value larger than 0.", ) def gen_situation( - situations, - own_ship, - targets, - settings, - visualize, - col, - row, - visualize_situation, - output, -): + situations: str, + own_ship: str, + targets: str, + settings: str, + col: int, + row: int, + visualize_situation: int, + output: str, + visualize: bool, # noqa: FBT001 +) -> None: r"""Console script for trafficgen. Example: \n trafficgen gen-situation -s ./data/example_situations_input diff --git a/src/trafficgen/encounter.py b/src/trafficgen/encounter.py index 53f9422..1f934e7 100644 --- a/src/trafficgen/encounter.py +++ b/src/trafficgen/encounter.py @@ -85,7 +85,8 @@ def generate_encounter( # Searching for encounter. Two loops used. Only vector time is locked in the # first loop. In the second loop, beta and sog are assigned. - while not encounter_found and outer_counter < 5: + maximum_loops = 5 + while not encounter_found and outer_counter < maximum_loops: outer_counter += 1 inner_counter: int = 0 @@ -120,7 +121,7 @@ def generate_encounter( own_ship_position_future, lat_lon0, settings.max_meeting_distance ) - while not encounter_found and inner_counter < 5: + while not encounter_found and inner_counter < maximum_loops: inner_counter += 1 relative_sog = relative_sog_default if relative_sog is None: @@ -492,15 +493,16 @@ def find_start_position_target_ship( alpha2, beta2, theta13_criteria, theta14_criteria, theta15_criteria, theta15 ) + limit: float = 0.01 if ( desired_encounter_type is colreg_state1 - and np.abs(convert_angle_0_to_2_pi_to_minus_pi_to_pi(np.abs(beta1 - desired_beta))) < 0.01 + and np.abs(convert_angle_0_to_2_pi_to_minus_pi_to_pi(np.abs(beta1 - desired_beta))) < limit ): start_position_target_ship = GeoPosition(lat=lat31, lon=lon31) start_position_found = True elif ( desired_encounter_type is colreg_state2 - and np.abs(convert_angle_0_to_2_pi_to_minus_pi_to_pi(np.abs(beta2 - desired_beta))) < 0.01 + and np.abs(convert_angle_0_to_2_pi_to_minus_pi_to_pi(np.abs(beta2 - desired_beta))) < limit ): start_position_target_ship = GeoPosition(lat=lat32, lon=lon32) start_position_found = True @@ -578,16 +580,18 @@ def determine_colreg( alpha_2_pi: float = alpha if alpha >= 0.0 else alpha + 2 * np.pi beta_pi: float = beta if (beta >= 0.0) & (beta <= np.pi) else beta - 2 * np.pi + limit: float = 0.001 + # Find appropriate rule set - if (beta > theta15[0]) & (beta < theta15[1]) & (abs(alpha) - theta13_criteria <= 0.001): + if (beta > theta15[0]) & (beta < theta15[1]) & (abs(alpha) - theta13_criteria <= limit): return EncounterType.OVERTAKING_STAND_ON - if (alpha_2_pi > theta15[0]) & (alpha_2_pi < theta15[1]) & (abs(beta_pi) - theta13_criteria <= 0.001): + if (alpha_2_pi > theta15[0]) & (alpha_2_pi < theta15[1]) & (abs(beta_pi) - theta13_criteria <= limit): return EncounterType.OVERTAKING_GIVE_WAY - if (abs(beta_pi) - theta14_criteria <= 0.001) & (abs(alpha) - theta14_criteria <= 0.001): + if (abs(beta_pi) - theta14_criteria <= limit) & (abs(alpha) - theta14_criteria <= limit): return EncounterType.HEAD_ON - if (beta > 0) & (beta < theta15[0]) & (alpha > -theta15[0]) & (alpha - theta15_criteria <= 0.001): + if (beta > 0) & (beta < theta15[0]) & (alpha > -theta15[0]) & (alpha - theta15_criteria <= limit): return EncounterType.CROSSING_GIVE_WAY - if (alpha_2_pi > 0) & (alpha_2_pi < theta15[0]) & (beta_pi > -theta15[0]) & (beta_pi - theta15_criteria <= 0.001): + if (alpha_2_pi > 0) & (alpha_2_pi < theta15[0]) & (beta_pi > -theta15[0]) & (beta_pi - theta15_criteria <= limit): return EncounterType.CROSSING_STAND_ON return EncounterType.NO_RISK_COLLISION @@ -626,29 +630,24 @@ def calculate_relative_bearing( # Absolute bearing of target ship relative to own ship bng_own_ship_target_ship: float = 0.0 if e_own_ship == e_target_ship: + bng_own_ship_target_ship = 0.0 if n_own_ship <= n_target_ship else np.pi + elif e_own_ship < e_target_ship: if n_own_ship <= n_target_ship: - bng_own_ship_target_ship = 0.0 + bng_own_ship_target_ship = 1 / 2 * np.pi - np.arctan( + abs(n_target_ship - n_own_ship) / abs(e_target_ship - e_own_ship) + ) else: - bng_own_ship_target_ship = np.pi + bng_own_ship_target_ship = 1 / 2 * np.pi + np.arctan( + abs(n_target_ship - n_own_ship) / abs(e_target_ship - e_own_ship) + ) + elif n_own_ship <= n_target_ship: + bng_own_ship_target_ship = 3 / 2 * np.pi + np.arctan( + abs(n_target_ship - n_own_ship) / abs(e_target_ship - e_own_ship) + ) else: - if e_own_ship < e_target_ship: - if n_own_ship <= n_target_ship: - bng_own_ship_target_ship = 1 / 2 * np.pi - np.arctan( - abs(n_target_ship - n_own_ship) / abs(e_target_ship - e_own_ship) - ) - else: - bng_own_ship_target_ship = 1 / 2 * np.pi + np.arctan( - abs(n_target_ship - n_own_ship) / abs(e_target_ship - e_own_ship) - ) - else: - if n_own_ship <= n_target_ship: - bng_own_ship_target_ship = 3 / 2 * np.pi + np.arctan( - abs(n_target_ship - n_own_ship) / abs(e_target_ship - e_own_ship) - ) - else: - bng_own_ship_target_ship = 3 / 2 * np.pi - np.arctan( - abs(n_target_ship - n_own_ship) / abs(e_target_ship - e_own_ship) - ) + bng_own_ship_target_ship = 3 / 2 * np.pi - np.arctan( + abs(n_target_ship - n_own_ship) / abs(e_target_ship - e_own_ship) + ) # Bearing of own ship from the perspective of the contact bng_target_ship_own_ship: float = bng_own_ship_target_ship + np.pi @@ -763,7 +762,8 @@ def assign_beta_from_list(beta_limit: list[float]) -> float: ------- * Relative bearing between own ship and target ship seen from own ship [rad] """ - assert len(beta_limit) == 2 + beta_limit_length = 2 + assert len(beta_limit) == beta_limit_length beta: float = beta_limit[0] + random.uniform(0, 1) * (beta_limit[1] - beta_limit[0]) return beta diff --git a/src/trafficgen/plot_traffic_situation.py b/src/trafficgen/plot_traffic_situation.py index dccb3ec..3756a99 100644 --- a/src/trafficgen/plot_traffic_situation.py +++ b/src/trafficgen/plot_traffic_situation.py @@ -2,6 +2,7 @@ # pyright: reportUnknownMemberType=false """Functions to prepare and plot traffic situations.""" +import logging import math import matplotlib.pyplot as plt @@ -132,8 +133,13 @@ def plot_specific_traffic_situation( """ num_situations = len(traffic_situations) if situation_number > num_situations: - print( - f"Situation_number specified higher than number of situations available, plotting last situation: {num_situations}" # noqa: E501 + # Configure logging + logging.basicConfig(level=logging.INFO) + + # Replace print with logging + logging.info( + f"Situation_number specified higher than number of situations available, " + f"plotting last situation: {num_situations}" ) situation_number = num_situations diff --git a/src/trafficgen/read_files.py b/src/trafficgen/read_files.py index 977df4a..1756ab7 100644 --- a/src/trafficgen/read_files.py +++ b/src/trafficgen/read_files.py @@ -6,10 +6,13 @@ from typing import Any, cast from trafficgen.types import ( + Encounter, EncounterSettings, + Initial, ShipStatic, SituationInput, TrafficSituation, + Waypoint, ) from trafficgen.utils import deg_2_rad, knot_2_m_pr_s, min_2_s, nm_2_m @@ -72,48 +75,103 @@ def convert_situation_data_from_maritime_to_si_units(situation: SituationInput) Convert situation data which is given in maritime units to SI units. Params: - * own_ship_file: Path to the own_ship_file file + * situation: Situation data to be converted Returns ------- - * own_ship information + * situation: Converted situation data """ assert situation.own_ship is not None assert situation.own_ship.initial is not None assert situation.own_ship.initial.heading is not None - situation.own_ship.initial.position.lon = deg_2_rad(situation.own_ship.initial.position.lon) - situation.own_ship.initial.position.lat = deg_2_rad(situation.own_ship.initial.position.lat) - situation.own_ship.initial.cog = deg_2_rad(situation.own_ship.initial.cog) - situation.own_ship.initial.heading = deg_2_rad(situation.own_ship.initial.heading) - situation.own_ship.initial.sog = knot_2_m_pr_s(situation.own_ship.initial.sog) + situation.own_ship.initial = convert_own_ship_initial_data(situation.own_ship.initial) if situation.own_ship.waypoints is not None: - for waypoint in situation.own_ship.waypoints: - waypoint.position.lat = deg_2_rad(waypoint.position.lat) - waypoint.position.lon = deg_2_rad(waypoint.position.lon) - if waypoint.turn_radius is not None: - waypoint.turn_radius = nm_2_m(waypoint.turn_radius) - if waypoint.leg is not None: - if waypoint.leg.starboard_xtd is not None: - waypoint.leg.starboard_xtd = nm_2_m(waypoint.leg.starboard_xtd) - if waypoint.leg.portside_xtd is not None: - waypoint.leg.portside_xtd = nm_2_m(waypoint.leg.portside_xtd) - if waypoint.leg.data is not None: - if waypoint.leg.data.sog is not None: - assert waypoint.leg.data.sog.value is not None - assert waypoint.leg.data.sog.interp_start is not None - assert waypoint.leg.data.sog.interp_end is not None - waypoint.leg.data.sog.value = knot_2_m_pr_s(waypoint.leg.data.sog.value) - waypoint.leg.data.sog.interp_start = nm_2_m(waypoint.leg.data.sog.interp_start) - waypoint.leg.data.sog.interp_end = nm_2_m(waypoint.leg.data.sog.interp_end) + situation.own_ship.waypoints = convert_own_ship_waypoints(situation.own_ship.waypoints) assert situation.encounters is not None - for encounter in situation.encounters: + situation.encounters = convert_encounters(situation.encounters) + + return situation + + +def convert_own_ship_initial_data(initial: Initial) -> Initial: + """ + Convert own ship initial data which is given in maritime units to SI units. + + Params: + * initial: Own ship initial data to be converted + + Returns + ------- + * initial: Converted own ship initial data + """ + initial.position.lon = deg_2_rad(initial.position.lon) + initial.position.lat = deg_2_rad(initial.position.lat) + initial.cog = deg_2_rad(initial.cog) + assert initial.heading is not None + initial.heading = deg_2_rad(initial.heading) + initial.sog = knot_2_m_pr_s(initial.sog) + return initial + + +def convert_own_ship_waypoints(waypoints: list[Waypoint]) -> list[Waypoint]: + """ + Convert own ship waypoint data which is given in maritime units to SI units. + + Parameters + ---------- + waypoints : list[Waypoint] + Waypoint data to be converted + + Returns + ------- + list[Waypoint] + Converted waypoint data + """ + for waypoint in waypoints: + waypoint.position.lat = deg_2_rad(waypoint.position.lat) + waypoint.position.lon = deg_2_rad(waypoint.position.lon) + if waypoint.turn_radius is not None: + waypoint.turn_radius = nm_2_m(waypoint.turn_radius) + if waypoint.leg is not None: + if waypoint.leg.starboard_xtd is not None: + waypoint.leg.starboard_xtd = nm_2_m(waypoint.leg.starboard_xtd) + if waypoint.leg.portside_xtd is not None: + waypoint.leg.portside_xtd = nm_2_m(waypoint.leg.portside_xtd) + if waypoint.leg.data is not None and waypoint.leg.data.sog is not None: + assert waypoint.leg.data.sog.value is not None + assert waypoint.leg.data.sog.interp_start is not None + assert waypoint.leg.data.sog.interp_end is not None + waypoint.leg.data.sog.value = knot_2_m_pr_s(waypoint.leg.data.sog.value) + waypoint.leg.data.sog.interp_start = nm_2_m(waypoint.leg.data.sog.interp_start) + waypoint.leg.data.sog.interp_end = nm_2_m(waypoint.leg.data.sog.interp_end) + return waypoints + + +def convert_encounters(encounters: list[Encounter]) -> list[Encounter]: + """ + Convert encounter data which is given in maritime units to SI units. + + Parameters + ---------- + encounters : list[Encounter] + Encounter data to be converted + + Returns + ------- + list[Encounter] + Converted encounter data + """ + assert encounters is not None + beta_list_length = 2 + + for encounter in encounters: beta: list[float] | float | None = encounter.beta vector_time: float | None = encounter.vector_time if beta is not None: if isinstance(beta, list): - assert len(beta) == 2 + assert len(beta) == beta_list_length for i in range(len(beta)): beta[i] = deg_2_rad(beta[i]) encounter.beta = beta @@ -121,7 +179,7 @@ def convert_situation_data_from_maritime_to_si_units(situation: SituationInput) encounter.beta = deg_2_rad(beta) if vector_time is not None: encounter.vector_time = min_2_s(vector_time) - return situation + return encounters def read_own_ship_static_file(own_ship_static_file: Path) -> ShipStatic: diff --git a/src/trafficgen/types.py b/src/trafficgen/types.py index 08d2ca4..dcd1563 100644 --- a/src/trafficgen/types.py +++ b/src/trafficgen/types.py @@ -1,9 +1,9 @@ """Domain specific data types used in trafficgen.""" -from datetime import datetime +import datetime from enum import Enum from importlib.metadata import PackageNotFoundError, version -from typing import Annotated, Any, Optional, Type +from typing import Annotated, Any, Optional from pydantic import BaseModel, ConfigDict from pydantic.fields import Field @@ -17,7 +17,6 @@ def to_camel(string: str) -> str: """Return a camel case formated string from snake case string.""" - words = string.split("_") return words[0] + "".join(word.capitalize() for word in words[1:]) @@ -39,14 +38,14 @@ class StringIntEnumMixin(str, Enum): - String value with underscores: "underway_using_engine" """ - def __new__(cls: Type["StringIntEnumMixin"], str_value: str, num_value: int) -> "StringIntEnumMixin": + def __new__(cls: type["StringIntEnumMixin"], str_value: str, num_value: int) -> "StringIntEnumMixin": # noqa: D102 obj = str.__new__(cls, str_value) obj._value_ = str_value # Assign the string value - obj.num_value = num_value # type: ignore + obj.num_value = num_value # type: ignore[PGH003] return obj @classmethod - def _missing_(cls: Type["StringIntEnumMixin"], value: object) -> Optional["StringIntEnumMixin"]: + def _missing_(cls: type["StringIntEnumMixin"], value: object) -> Optional["StringIntEnumMixin"]: # Handle case-insensitive string matching and underscores if isinstance(value, str): value_str = value.replace("_", " ").lower() @@ -59,7 +58,7 @@ def _missing_(cls: Type["StringIntEnumMixin"], value: object) -> Optional["Strin # Handle numeric values if isinstance(value, int): for member in cls: - if member.num_value == value: # type: ignore + if member.num_value == value: # type: ignore[PGH003] return member return None @@ -67,6 +66,7 @@ def _missing_(cls: Type["StringIntEnumMixin"], value: object) -> Optional["Strin class AisShipType(StringIntEnumMixin): """ AIS Ship Type (not including cargo type). + Source: https://www.itu.int/dms_pubrec/itu-r/rec/m/R-REC-M.1371-5-201402-I!!PDF-E.pdf#page=116. """ @@ -98,6 +98,7 @@ class AisShipType(StringIntEnumMixin): class AisNavStatus(StringIntEnumMixin): """ AIS Navigational Status. + Source: https://www.itu.int/dms_pubrec/itu-r/rec/m/R-REC-M.1371-5-201402-I!!PDF-E.pdf#page=113. """ @@ -175,31 +176,26 @@ class Dimensions(BaseModelConfig): """ - length: Optional[Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[130.0])]] = None - width: Optional[Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[30.0])]] = None - height: Optional[Annotated[float, Field(gt=0, description="Height of the ship in meters", examples=[15.0])]] = None - draught: Optional[Annotated[float, Field(gt=0, description="Draught of the ship in meters", examples=[15.0])]] = ( - None - ) + length: Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[130.0])] | None = None + width: Annotated[float, Field(gt=0, description="Width of the ship in meters", examples=[30.0])] | None = None + height: Annotated[float, Field(gt=0, description="Height of the ship in meters", examples=[15.0])] | None = None + draught: Annotated[float, Field(gt=0, description="Draught of the ship in meters", examples=[15.0])] | None = None - a: Optional[Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Bow", examples=[80])]] = None - b: Optional[Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Stern", examples=[20])]] = ( + a: Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Bow", examples=[80])] | None = None + b: Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Stern", examples=[20])] | None = None + c: Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Port", examples=[20])] | None = None + d: Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Starboard", examples=[20])] | None = ( None ) - c: Optional[Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Port", examples=[20])]] = None - d: Optional[ - Annotated[float, Field(gt=0, description="Distance in meters from CCRP to Starboard", examples=[20])] - ] = None - def __init__(self, **data: Any): + def __init__(self, **data: Any) -> None: # noqa: ANN401 super().__init__(**data) """If length and width are given, and not a, b, c, d, calculate them, and vice-versa""" - if self.length and self.width: - if not self.a and not self.b and not self.c and not self.d: - self.a = self.length / 2 - self.b = self.length / 2 - self.c = self.width / 2 - self.d = self.width / 2 + if self.length and self.width and not self.a and not self.b and not self.c and not self.d: + self.a = self.length / 2 + self.b = self.length / 2 + self.c = self.width / 2 + self.d = self.width / 2 if self.a and self.b and self.c and self.d: self.length = self.a + self.b self.width = self.c + self.d @@ -209,40 +205,42 @@ class ShipStatic(BaseModelConfig): """Static ship data that will not change during the scenario.""" id: Annotated[int, Field(ge=0, le=2**32, description="Ship Identifier", examples=[1])] - mmsi: Optional[ + mmsi: ( Annotated[ int, Field( - ge=100000000, - le=999999999, - description="Maritime Mobile Service Identity (MMSI)", - examples=[123456789], + ge=100000000, le=999999999, description="Maritime Mobile Service Identity (MMSI)", examples=[123456789] ), ] - ] = None - imo: Optional[Annotated[int, Field(ge=1000000, le=9999999, description="IMO Number", examples=[1234567])]] = None - name: Optional[Annotated[str, Field(description="Ship name", examples=["RMS Titanic"])]] = None + | None + ) = None + imo: Annotated[int, Field(ge=1000000, le=9999999, description="IMO Number", examples=[1234567])] | None = None + name: Annotated[str, Field(description="Ship name", examples=["RMS Titanic"])] | None = None - dimensions: Optional[Annotated[Dimensions, Field(description="Key ship dimensions")]] = None + dimensions: Annotated[Dimensions, Field(description="Key ship dimensions")] | None = None - ship_type: Optional[Annotated[AisShipType, Field(description="General ship type, based on AIS")]] = None + ship_type: Annotated[AisShipType, Field(description="General ship type, based on AIS")] | None = None - path_type: Optional[ + path_type: ( Annotated[ PathType, Field( default=PathType.RTZ, - description="Specifies the control-point model (e.g., Bezier, RTZ) used to define the path for the ship to follow.", + description=( + "Specifies the control-point model (e.g., Bezier, RTZ) " + "used to define the path for the ship to follow." + ), ), ] - ] = None + | None + ) = None - sog_min: Optional[ - Annotated[float, Field(ge=0, description="Minimum ship speed over ground in knots", examples=[5.0])] - ] = None - sog_max: Optional[ - Annotated[float, Field(ge=0, description="Maximum ship speed over ground in knots", examples=[15.0])] - ] = None + sog_min: ( + Annotated[float, Field(ge=0, description="Minimum ship speed over ground in knots", examples=[5.0])] | None + ) = None + sog_max: ( + Annotated[float, Field(ge=0, description="Maximum ship speed over ground in knots", examples=[15.0])] | None + ) = None model_config = ConfigDict(extra="allow") @@ -262,7 +260,7 @@ class Position(BaseModelConfig): y: Annotated[float, Field(description="y-coordinate. Noth is positive", examples=[231])] -def create_position_example(): +def create_position_example() -> GeoPosition: """Create a position class.""" return GeoPosition(lon=57.2343, lat=10.3432) @@ -282,60 +280,72 @@ class Initial(BaseModelConfig): float, Field(ge=0, le=360, description="Initial ship course over ground (COG) in degrees", examples=[45.0]), ] - heading: Optional[ - Annotated[float, Field(ge=0, le=360, description="Initial ship heading in degrees", examples=[45.2])] - ] = None - nav_status: Optional[Annotated[AisNavStatus, Field(description="AIS Navigational Status")]] = None + heading: ( + Annotated[float, Field(ge=0, le=360, description="Initial ship heading in degrees", examples=[45.2])] | None + ) = None + nav_status: Annotated[AisNavStatus, Field(description="AIS Navigational Status")] | None = None class DataPoint(BaseModelConfig): """Data type for storing data which is numerical and continuos.""" - value: Optional[ - Annotated[float, Field(description="the value of the data at the current waypoint", examples=[12.3])] - ] = None - interp_start: Optional[ + value: ( + Annotated[float, Field(description="the value of the data at the current waypoint", examples=[12.3])] | None + ) = None + interp_start: ( Annotated[ float, Field( - description="distance before start of the next leg (NM), to start interpolating to the next leg's value", + description=( + "distance before start of the next leg (NM), to start interpolating to the next leg's value" + ), examples=[10], ), ] - ] = None - interp_end: Optional[ + | None + ) = None + interp_end: ( Annotated[ float, Field( - description="distance after the start of the next leg (NM), to finish interpolating to the next leg's value", + description=( + "distance after the start of the next leg (NM) to finish interpolating to the next leg's value" + ), examples=[10], ), ] - ] = None - interp_method: Optional[ - Annotated[InterpolationMethod | str, Field(description="Method used for interpolation")] - ] = None + | None + ) = None + interp_method: Annotated[InterpolationMethod | str, Field(description="Method used for interpolation")] | None = ( + None + ) -data_description = """The `data` field can be used to store data, which is numerical and continuous. One such example is the vessels speed over ground (SOG). Every `data` object, can have the 4 following attributes: -\n`value`: This is the value of the data over the current leg. -\n`interpStart`: This is the distance (in NM) before the leg change, where the value will start changing (via interpolation) to the new value in the next leg. -\n`interpEnd`: This is the distance (in NM) after the leg change, where the value will finish changing (via interpolation) to the new value in the next leg. -\n`interpMethod`: This sets the interpolation (linear, cosine, smoothstep, etc.) that will be used to perform the interpolation.""" +data_description = ( + "The `data` field can be used to store data, which is numerical and continuous." + "One such example is the vessels speed over ground (SOG). Every `data` object, can have the 4 following attributes:" + "\n`value`: This is the value of the data over the current leg." + "\n`interpStart`: This is the distance (in NM) before the leg change, where the value will start changing" + "(via interpolation) to the new value in the next leg." + "\n`interpEnd`: This is the distance (in NM) after the leg change, where the value will finish changing" + "(via interpolation) to the new value in the next leg." + "\n`interpMethod`: This sets the interpolation (linear, cosine, smoothstep, etc.) " + "that will be used to perform the interpolation." +) class RouteData(BaseModelConfig): """Data type for data along a route.""" - sog: Optional[Annotated[DataPoint, Field(description=data_description)]] = None + sog: Annotated[DataPoint, Field(description=data_description)] | None = None class Leg(BaseModelConfig): """Data type for a leg.""" - starboard_xtd: Optional[Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")]] = None - portside_xtd: Optional[Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")]] = None - data: Optional[Annotated[RouteData, Field(description=data_description)]] = None + starboard_xtd: Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")] | None = None + portside_xtd: Annotated[float, Field(description="Starboard XTD in NM as defined in RTZ.")] | None = None + data: Annotated[RouteData, Field(description=data_description)] | None = None class Waypoint(BaseModelConfig): @@ -345,16 +355,16 @@ class Waypoint(BaseModelConfig): GeoPosition, Field(description="A geographical coordinate.", examples=[GeoPosition(lon=11.2313, lat=51.2123)]), ] - turn_radius: Optional[ + turn_radius: ( Annotated[ - float, - Field(description="Orthodrome turn radius in nautical miles as defined in RTZ.", examples=[200]), + float, Field(description="Orthodrome turn radius in nautical miles as defined in RTZ.", examples=[200]) ] - ] = None - leg: Optional[Annotated[Leg, Field(description="Current Leg information.")]] = None + | None + ) = None + leg: Annotated[Leg, Field(description="Current Leg information.")] | None = None -def create_ship_static_example(): +def create_ship_static_example() -> ShipStatic: """Create a ShipStatic class.""" return ShipStatic( id=1, @@ -367,7 +377,7 @@ def create_ship_static_example(): ) -def create_initial_example(): +def create_initial_example() -> Initial: """Create a (Ship) Initial class.""" return Initial( position=create_position_example(), @@ -378,39 +388,43 @@ def create_initial_example(): ) -def create_data_point_example(): +def create_data_point_example() -> DataPoint: """Create a DataPoint class.""" return DataPoint(value=12.3, interp_start=100, interp_end=100, interp_method=InterpolationMethod.LINEAR) -def create_waypoint_example(): +def create_waypoint_example() -> Waypoint: """Create a Waypoint class.""" return Waypoint( position=create_position_example(), turn_radius=1.0, - data=RouteData(sog=create_data_point_example()), # type:ignore + leg=Leg(data=RouteData(sog=create_data_point_example())), ) static_description = "Static ship information which does not change during a scenario." -initial_description = "Initial pose of the ship. If `waypoints` are provided, then these should correspond to the pose of the ship at the starting waypoint" -waypoints_description = "An array of `Waypoint` objects. Each waypoint object must have a `position` property. If no turn radius is provided, it will be assumed to be `0`. Additional data can be added to each waypoint leg." +initial_description = ( + "Initial pose of the ship. If `waypoints` are provided," + "then these should correspond to the pose of the ship at the starting waypoint" +) +waypoints_description = ( + "An array of `Waypoint` objects. Each waypoint object must have a `position` property." + "If no turn radius is provided, it will be assumed to be `0`." + "Additional data can be added to each waypoint leg." +) class Ship(BaseModelConfig): """Data type for a ship.""" - initial: Optional[ - Annotated[Initial, Field(description=initial_description, examples=[create_initial_example()])] - ] = None - waypoints: Optional[ - Annotated[ - list[Waypoint], - Field(description=waypoints_description, examples=[create_waypoint_example()]), - ] - ] = None + initial: Annotated[Initial, Field(description=initial_description, examples=[create_initial_example()])] | None = ( + None + ) + waypoints: ( + Annotated[list[Waypoint], Field(description=waypoints_description, examples=[create_waypoint_example()])] | None + ) = None - def __init__(self, **data: Any): + def __init__(self, **data: Any) -> None: # noqa: ANN401 super().__init__(**data) if not self.waypoints: self.waypoints = self._generate_waypoints() @@ -440,8 +454,7 @@ def _generate_waypoints(self) -> list[Waypoint] | None: waypoints = [waypoint0, waypoint1] return waypoints - else: - return None + return None class OwnShip(Ship): @@ -449,7 +462,7 @@ class OwnShip(Ship): static: Annotated[ShipStatic, Field(description=static_description, examples=[create_ship_static_example()])] - def __init__(self, **data: Any): + def __init__(self, **data: Any) -> None: # noqa: ANN401 super().__init__(**data) if not self.static.name: self.static.name = "OS" @@ -460,13 +473,13 @@ class TargetShip(Ship): static: Annotated[ShipStatic, Field(description=static_description, examples=[create_ship_static_example()])] - def __init__(self, **data: Any): + def __init__(self, **data: Any) -> None: # noqa: ANN401 super().__init__(**data) if not self.static.name: self.static.name = f"TGT {self.static.id}" -def create_ship_example(): +def create_ship_example() -> Ship: """Create a Ship class.""" return Ship( static=create_ship_static_example(), @@ -475,12 +488,12 @@ def create_ship_example(): ) -def create_own_ship_example(): +def create_own_ship_example() -> OwnShip: """Create a OwnShip class.""" return OwnShip(static=create_ship_static_example(), initial=create_initial_example(), waypoints=None) -def create_target_example(): +def create_target_example() -> TargetShip: """Create a TargetShip class.""" return TargetShip(static=create_ship_static_example(), initial=create_initial_example(), waypoints=None) @@ -489,10 +502,10 @@ class TrafficSituation(BaseModelConfig): """Data type for a traffic situation.""" version: Annotated[str, Field(description="Ship traffic generator version number", examples=[project_version])] - title: Optional[ - Annotated[str, Field(description="The title of the traffic situation", examples=["overtaking_18"])] - ] = None - description: Optional[ + title: ( + Annotated[str, Field(description="The title of the traffic situation", examples=["overtaking_18"])] | None + ) = None + description: ( Annotated[ str, Field( @@ -500,23 +513,23 @@ class TrafficSituation(BaseModelConfig): examples=["Crossing situation with 3 target vessels in the Oslo fjord"], ), ] - ] = None - start_time: Optional[ + | None + ) = None + start_time: ( Annotated[ - datetime, + datetime.datetime, Field( description="Starting time of the situation in `ISO 8601` format `YYYY-MM-DDThh:mm:ssZ`", - examples=[datetime(2025, 1, 1, 0, 0, 0)], + examples=[datetime.datetime(2025, 1, 1, 0, 0, 0, tzinfo=datetime.UTC)], ), ] - ] = None + | None + ) = None own_ship: Annotated[OwnShip, Field(description="Own Ship (OS) data", examples=[create_ship_example()])] - target_ships: Optional[ - Annotated[ - list[TargetShip], - Field(description="Target Ship (TGT) data", examples=[[create_ship_example()]]), - ] - ] = None + target_ships: ( + Annotated[list[TargetShip], Field(description="Target Ship (TGT) data", examples=[[create_ship_example()]])] + | None + ) = None class EncounterType(Enum): @@ -583,7 +596,7 @@ class OwnShipInitial(BaseModelConfig): """Data type for initial data for the own ship used for generating a situation.""" initial: Initial - waypoints: Optional[list[Waypoint]] = Field(None, description="An array of `Waypoint` objects.") + waypoints: list[Waypoint] | None = Field(None, description="An array of `Waypoint` objects.") class SituationInput(BaseModelConfig): diff --git a/src/trafficgen/utils.py b/src/trafficgen/utils.py index 69c8360..c4d6ebb 100644 --- a/src/trafficgen/utils.py +++ b/src/trafficgen/utils.py @@ -112,6 +112,8 @@ def rad_2_deg(angle_in_radians: float) -> float: def convert_angle_minus_pi_to_pi_to_0_to_2_pi(angle_pi: float) -> float: """ + Angle conversion functions. + Convert an angle given in the region -pi to pi degrees to an angle given in the region 0 to 2pi radians. @@ -128,6 +130,8 @@ def convert_angle_minus_pi_to_pi_to_0_to_2_pi(angle_pi: float) -> float: def convert_angle_0_to_2_pi_to_minus_pi_to_pi(angle_2_pi: float) -> float: """ + Angle conversion functions. + Convert an angle given in the region 0 to 2*pi degrees to an angle given in the region -pi to pi degrees. diff --git a/src/trafficgen/write_traffic_situation_to_file.py b/src/trafficgen/write_traffic_situation_to_file.py index ea16570..96fd826 100644 --- a/src/trafficgen/write_traffic_situation_to_file.py +++ b/src/trafficgen/write_traffic_situation_to_file.py @@ -21,7 +21,7 @@ def write_traffic_situations_to_json_file(situations: list[TrafficSituation], wr for i, situation in enumerate(situations): file_number: int = i + 1 output_file_path: Path = write_folder / f"traffic_situation_{file_number:02d}.json" - situation = convert_situation_data_from_si_units_to__maritime(situation) + situation = convert_situation_data_from_si_units_to__maritime(situation) # noqa: PLW2901 data: str = situation.model_dump_json( by_alias=True, indent=4, exclude_unset=True, exclude_defaults=False, exclude_none=True ) @@ -45,7 +45,7 @@ def convert_situation_data_from_si_units_to__maritime(situation: TrafficSituatio assert situation.target_ships is not None for target_ship in situation.target_ships: - target_ship = convert_ship_data_from_si_units_to_maritime(target_ship) + target_ship = convert_ship_data_from_si_units_to_maritime(target_ship) # noqa: PLW2901 return situation @@ -80,13 +80,12 @@ def convert_ship_data_from_si_units_to_maritime(ship: T_ship) -> T_ship: waypoint.leg.starboard_xtd = round(m_2_nm(waypoint.leg.starboard_xtd), 2) if waypoint.leg.portside_xtd is not None: waypoint.leg.portside_xtd = round(m_2_nm(waypoint.leg.portside_xtd), 2) - if waypoint.leg.data is not None: - if waypoint.leg.data.sog is not None: - assert waypoint.leg.data.sog.value is not None - assert waypoint.leg.data.sog.interp_start is not None - assert waypoint.leg.data.sog.interp_end is not None - waypoint.leg.data.sog.value = round(m_pr_s_2_knot(waypoint.leg.data.sog.value), 2) - waypoint.leg.data.sog.interp_start = round(m_2_nm(waypoint.leg.data.sog.interp_start), 2) - waypoint.leg.data.sog.interp_end = round(m_2_nm(waypoint.leg.data.sog.interp_end), 2) + if waypoint.leg.data is not None and waypoint.leg.data.sog is not None: + assert waypoint.leg.data.sog.value is not None + assert waypoint.leg.data.sog.interp_start is not None + assert waypoint.leg.data.sog.interp_end is not None + waypoint.leg.data.sog.value = round(m_pr_s_2_knot(waypoint.leg.data.sog.value), 2) + waypoint.leg.data.sog.interp_start = round(m_2_nm(waypoint.leg.data.sog.interp_start), 2) + waypoint.leg.data.sog.interp_end = round(m_2_nm(waypoint.leg.data.sog.interp_end), 2) return ship diff --git a/tests/conftest.py b/tests/conftest.py index 8e3a02e..e5a21bf 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,7 +3,6 @@ from pathlib import Path import pytest -from pytest import TempPathFactory @pytest.fixture @@ -12,7 +11,7 @@ def your_fixture(): See more at: http://doc.pytest.org/en/latest/fixture.html """ - return None + return @pytest.fixture(scope="session") @@ -99,7 +98,7 @@ def own_ship_file(proj_data_folder: Path) -> Path: return Path(proj_data_folder) / "own_ship" / "own_ship.json" -@pytest.fixture(scope="function") -def output_folder(tmp_path_factory: TempPathFactory) -> Path: +@pytest.fixture +def output_folder(tmp_path_factory: pytest.TempPathFactory) -> Path: """Path to temporary data folder used to write output files to in a test""" return tmp_path_factory.mktemp("output_", numbered=True) diff --git a/tests/test_trafficgen.py b/tests/test_trafficgen.py index 7571d16..c3bc85c 100644 --- a/tests/test_trafficgen.py +++ b/tests/test_trafficgen.py @@ -1,6 +1,7 @@ """Tests for `trafficgen` package.""" from pathlib import Path +from typing import TYPE_CHECKING import pytest from click.testing import CliRunner @@ -10,9 +11,11 @@ read_generated_situation_files, ) from trafficgen.ship_traffic_generator import generate_traffic_situations -from trafficgen.types import ( - TrafficSituation, -) + +if TYPE_CHECKING: + from trafficgen.types import ( + TrafficSituation, + ) @pytest.fixture @@ -21,7 +24,7 @@ def response(): See more at: http://doc.pytest.org/en/latest/fixture.html """ - return None + return def test_content(response: None): @@ -37,7 +40,8 @@ def test_basic_cli(): assert "Usage:" in result.output help_result = runner.invoke(cli.main, ["--help"]) assert help_result.exit_code == 0 - assert "--help" in help_result.output and "Show this message and exit" in help_result.output + assert "--help" in help_result.output + assert "Show this message and exit" in help_result.output def test_gen_situations_cli( From c8fddd8a3f5c31512a06cbc5199f4264d6f46215 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Thu, 16 Jan 2025 09:26:44 +0100 Subject: [PATCH 06/23] #43 fixing pyproject.toml file --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 5afc45d..cd0efa9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -112,7 +112,6 @@ mypy_path = "stubs" files = [ "src", "tests", - "data", ] exclude = [ "^src/folder_to_be_excluded/", From 94056d00d95bc127da0930bdbf39fd39e1fe3f27 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Thu, 16 Jan 2025 11:00:26 +0100 Subject: [PATCH 07/23] #43 Fixing mypy code quality stuff --- src/trafficgen/check_land_crossing.py | 2 +- src/trafficgen/encounter.py | 23 +++++++++++++---------- src/trafficgen/utils.py | 3 ++- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/trafficgen/check_land_crossing.py b/src/trafficgen/check_land_crossing.py index e9f84c0..1cd9781 100644 --- a/src/trafficgen/check_land_crossing.py +++ b/src/trafficgen/check_land_crossing.py @@ -39,6 +39,6 @@ def path_crosses_land( lat = rad_2_deg(position_2.lat) lon = rad_2_deg(position_2.lon) - if globe.is_land(lat, lon): # type: ignore (The package is unfortunately not typed.) + if globe.is_land(lat, lon): # type: ignore # noqa: PGH003 return True return False diff --git a/src/trafficgen/encounter.py b/src/trafficgen/encounter.py index 1f934e7..bf40fc0 100644 --- a/src/trafficgen/encounter.py +++ b/src/trafficgen/encounter.py @@ -96,12 +96,14 @@ def generate_encounter( if vector_time is None: vector_time = random.uniform(settings.vector_range[0], settings.vector_range[1]) + + beta: float = 0.0 if beta_default is None: - beta: float = assign_beta(desired_encounter_type, settings) + beta = assign_beta(desired_encounter_type, settings) elif isinstance(beta_default, list): - beta: float = assign_beta_from_list(beta_default) + beta = assign_beta_from_list(beta_default) else: - beta: float = beta_default + beta = beta_default # Own ship assert own_ship.initial is not None @@ -136,14 +138,14 @@ def generate_encounter( / vector_time ) - target_ship_sog: float = assign_sog_to_target_ship( + target_ship_sog = assign_sog_to_target_ship( desired_encounter_type, own_ship.initial.sog, min_target_ship_sog, settings.relative_speed, ) else: - target_ship_sog: float = relative_sog * own_ship.initial.sog + target_ship_sog = relative_sog * own_ship.initial.sog assert target_ship_static.sog_max is not None target_ship_sog = round(np.minimum(target_ship_sog, target_ship_static.sog_max), 1) @@ -161,8 +163,8 @@ def generate_encounter( ) if position_found: - target_ship_initial_position: GeoPosition = start_position_target_ship - target_ship_cog: float = calculate_ship_cog( + target_ship_initial_position = start_position_target_ship + target_ship_cog = calculate_ship_cog( target_ship_initial_position, target_ship_position_future, lat_lon0 ) encounter_ok: bool = check_encounter_evolvement( @@ -313,6 +315,7 @@ def define_own_ship( * own_ship: Own ship """ own_ship_initial: Initial = desired_traffic_situation.own_ship.initial + own_ship_waypoints: list[Waypoint] = [] if desired_traffic_situation.own_ship.waypoints is None: # If waypoints are not given, let initial position be the first waypoint, # then calculate second waypoint some time in the future @@ -327,16 +330,16 @@ def define_own_ship( encounter_settings.situation_length, ) own_ship_waypoint1 = Waypoint(position=ship_position_future, turn_radius=None, leg=None) - own_ship_waypoints: list[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] + own_ship_waypoints = [own_ship_waypoint0, own_ship_waypoint1] elif len(desired_traffic_situation.own_ship.waypoints) == 1: # If one waypoint is given, use initial position as first waypoint own_ship_waypoint0 = Waypoint( position=own_ship_initial.position.model_copy(deep=True), turn_radius=None, leg=None ) own_ship_waypoint1 = desired_traffic_situation.own_ship.waypoints[0] - own_ship_waypoints: list[Waypoint] = [own_ship_waypoint0, own_ship_waypoint1] + own_ship_waypoints = [own_ship_waypoint0, own_ship_waypoint1] else: - own_ship_waypoints: list[Waypoint] = desired_traffic_situation.own_ship.waypoints + own_ship_waypoints = desired_traffic_situation.own_ship.waypoints own_ship = OwnShip( static=own_ship_static, diff --git a/src/trafficgen/utils.py b/src/trafficgen/utils.py index c4d6ebb..7a44fbd 100644 --- a/src/trafficgen/utils.py +++ b/src/trafficgen/utils.py @@ -228,7 +228,8 @@ def calculate_position_along_track_using_waypoints( for i in range(1, len(waypoints)): ship_speed: float = inital_speed if waypoints[i].leg is not None and waypoints[i].leg.data.sog is not None: # type: ignore[attr-defined] - ship_speed = waypoints[i].leg.data.sog # type: ignore[attr-defined] + assert waypoints[i].leg.data.sog.value is not None # type: ignore # noqa: PGH003 + ship_speed = waypoints[i].leg.data.sog.value # type: ignore # noqa: PGH003 dist_between_waypoints = calculate_distance(waypoints[i - 1].position, waypoints[i].position) From 3e61d534ca6c422960b763001cc80c2b8000f7e4 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Thu, 16 Jan 2025 11:01:08 +0100 Subject: [PATCH 08/23] #43 Updating documentation --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 189b695..40d35a8 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,11 @@ the tool will generate a set of traffic situations. The traffic situations may b A paper is written describing the background for the tool and how it works [paper] +## Installation +To install Ship Traffic Generator, run this command in your terminal: +```sh +pip install trafficgen +``` ## UV This project uses `uv` as package manager. From 482614a34a803abec21f00d08ce5e0fe22bda980 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Thu, 16 Jan 2025 15:19:07 +0100 Subject: [PATCH 09/23] #43 Updating documentation --- .../_autosummary/trafficgen.read_files.rst | 26 +++++++++ docs/source/api.rst | 7 +++ docs/source/trafficgen.rst | 23 ++++++++ docs/source/usage.rst | 58 +++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 docs/source/_autosummary/trafficgen.read_files.rst create mode 100644 docs/source/api.rst create mode 100644 docs/source/trafficgen.rst create mode 100644 docs/source/usage.rst diff --git a/docs/source/_autosummary/trafficgen.read_files.rst b/docs/source/_autosummary/trafficgen.read_files.rst new file mode 100644 index 0000000..696df7f --- /dev/null +++ b/docs/source/_autosummary/trafficgen.read_files.rst @@ -0,0 +1,26 @@ +trafficgen.read\_files +====================== + +.. automodule:: trafficgen.read_files + :members: + + + + .. rubric:: Functions + .. autosummary:: + + camel_to_snake + check_input_units + convert_encounters + convert_keys_to_snake_case + convert_own_ship_initial_data + convert_own_ship_waypoints + convert_settings_data_from_maritime_to_si_units + convert_ship_data_from_maritime_to_si_units + convert_situation_data_from_maritime_to_si_units + read_encounter_settings_file + read_generated_situation_files + read_own_ship_static_file + read_situation_files + read_target_ship_static_files + \ No newline at end of file diff --git a/docs/source/api.rst b/docs/source/api.rst new file mode 100644 index 0000000..dd4b477 --- /dev/null +++ b/docs/source/api.rst @@ -0,0 +1,7 @@ +API Reference +============= + +.. toctree:: + :maxdepth: 4 + + trafficgen diff --git a/docs/source/trafficgen.rst b/docs/source/trafficgen.rst new file mode 100644 index 0000000..6792e15 --- /dev/null +++ b/docs/source/trafficgen.rst @@ -0,0 +1,23 @@ +trafficgen package +================== + +Subpackages +----------- + +.. autosummary:: + :toctree: _autosummary + :template: custom-module.rst + :recursive: + + + +Modules +------- + +.. autosummary:: + :toctree: _autosummary + :template: custom-module.rst + :recursive: + + trafficgen.ship_traffic_generator + trafficgen.read_files diff --git a/docs/source/usage.rst b/docs/source/usage.rst new file mode 100644 index 0000000..b9cb17a --- /dev/null +++ b/docs/source/usage.rst @@ -0,0 +1,58 @@ +===== +Usage +===== + +To use Traffic Generator in a project:: + + import trafficgen + +To use Traffic Generator as a command line tool for generating traffic situations, write:: + + trafficgen gen-situation + +The command line tool takes different input options:: + + -s, --situations PATH Folders with situations (default=./baseline_situations_input/) + -t, --targets PATH Folder with target configurations (default=./target_ships/) + -c, --settings PATH Path to settings file (default=./settings/encounter_settings.json) + --visualize Plot visualization + --col INTEGER Number of columns for plot, may be used with visualize (default=10) + --row INTEGER Number of rows for plot, may be used with visualize (default=6) + --visualize-situation INTEGER Plot individual traffic situation, specify INTEGER value + -o, --output PATH Output folder (default=None) + --help Show this message and exit. + +Example:: + + trafficgen gen-situation -s ./data/example_situations_input -o ./data/test_output_1 + +Situations +~~~~~~~~~~ +When generating situations without specifying where the desired situations (``--situation``) are found, the +default path, which is ``default=./baseline_situations_input/``, will be used. + +Baseline situations +~~~~~~~~~~~~~~~~~~~ +The baseline situations are a set of generic traffic situations covering head-on, overtaking stand-on/give-way +and crossing stand-on/give-way encounters. To cover the combination of encounters for 1, 2 and 3 target ships, +there are in total 55 baseline situations. The input files for generating these situations are found in +``./baseline_situations_input/`` + +Plotting +~~~~~~~~ +Plotting all generated traffic situations +----------------------------------------- +All the generated situations are displayed if using ``--visualize``. This will pop up one or more plot windows, +which show all the traffic situations. The number of colums and rows for the plots (per figure) can be specified by +using ``--col`` and ``--row``, respectively. + +Individual plots with map background +------------------------------------ +A specific encounter is visualized by using ``--visualize-situation INTEGER``, e.g.:: + + trafficgen gen-situation -s ./data/example_situations_input -o ./data/test_output_1 --visualize-situation 2 + +This will open a browser window/tab with an OpenStreetMap background and the traffic situation +radar plot as an overlay. +Note that the integer needs to be within the range of the number of generated situations, +for example 1 - 12 if you generated 12 situations. From 3ea2a0ad7ea71db0b4ad7052dc125ded7bc58910 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Thu, 16 Jan 2025 15:19:48 +0100 Subject: [PATCH 10/23] #43 Documentation --- .gitignore | 3 +- LICENSE | 2 +- README.md | 80 ++--- docs/input_files.rst | 129 -------- docs/installation.rst | 45 --- .../ICMASS23_verfying_caga_systems.pdf | Bin .../trafficgen.ship_traffic_generator.rst | 13 + docs/source/cli.__main__.rst | 3 - docs/source/cli.rst | 7 - docs/source/conf.py | 13 +- docs/source/index.rst | 3 +- docs/source/my_package.rst | 25 -- docs/usage.rst | 58 ---- pyproject.toml | 4 +- src/trafficgen/types.py | 16 +- src/trafficgen/utils.py | 7 +- uv.lock | 282 ++---------------- 17 files changed, 87 insertions(+), 603 deletions(-) delete mode 100644 docs/input_files.rst delete mode 100644 docs/installation.rst rename docs/{ => source}/ICMASS23_verfying_caga_systems.pdf (100%) create mode 100644 docs/source/_autosummary/trafficgen.ship_traffic_generator.rst delete mode 100644 docs/source/cli.__main__.rst delete mode 100644 docs/source/cli.rst delete mode 100644 docs/source/my_package.rst delete mode 100644 docs/usage.rst diff --git a/.gitignore b/.gitignore index 688bef7..0ed84c3 100644 --- a/.gitignore +++ b/.gitignore @@ -111,4 +111,5 @@ ENV/ !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json -!.vscode/*.code-snippets \ No newline at end of file +!.vscode/*.code-snippets +docs/source/input_files.rst diff --git a/LICENSE b/LICENSE index 90b0cc3..5fb9fa4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 [DNV](https://www.dnv.com) [open source](https://github.com/dnv-opensource) +Copyright (c) 2025 [DNV](https://www.dnv.com) [open source](https://github.com/dnv-opensource) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 40d35a8..4e17035 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,18 @@ To install Ship Traffic Generator, run this command in your terminal: ```sh pip install trafficgen ``` +This is the preferred method to install Traffic Generator, as it will always install the most recent stable release. -## UV +You can check your installation by running: +```sh +uv run trafficgen --help +``` + +See documentation for usage of the Ship Traffic Generator. + +## Development Setup + +### Install UV This project uses `uv` as package manager. If you haven't already, install [uv](https://docs.astral.sh/uv), preferably using it's ["Standalone installer"](https://docs.astral.sh/uv/getting-started/installation/#__tabbed_1_2) method:
..on Windows: @@ -29,8 +39,8 @@ Once installed, you can update `uv` to its latest version, anytime, by running: uv self update ``` -## Python -The traffic generator requires Python 3.10 or later.
+### Install Python +The traffic generator requires Python 3.11 or later.
If you don't already have a compatible version installed on your machine, you way install Python through `uv`: ```sh @@ -44,7 +54,7 @@ winget install --id Python.Python ``` or you can download and install Python from the [python.org](https://www.python.org/downloads/) website. -## Clone the repository +### Clone the repository Clone the traffig generator repository into your local development directory: ```sh git clone https://github.com/dnv-opensource/ship-traffic-generator path/to/your/dir/ship-traffic-generator @@ -54,7 +64,7 @@ Change into the project directory after cloning: cd ship-traffic-generator ``` -## Install dependencies +### Install dependencies Run `uv sync` to create a virtual environment and install all project dependencies into it: ```sh uv sync @@ -65,60 +75,28 @@ uv sync > `uv sync` the first time. Optionally, you can create your own virtual environment using e.g. `uv venv`, before running > `uv sync`. -You can check your installation by running: -```sh -uv run trafficgen --help -``` - -For more information on usage, run: +### (Optional) Activate the virtual environment +When using `uv`, there is in almost all cases no longer a need to manually activate the virtual environment.
+`uv` will find the `.venv` virtual environment in the working directory or any parent directory, and activate it on the fly whenever you run a command via `uv` inside your project folder structure: ```sh -trafficgen gen-situation --help +uv run ``` -or build the documentation (see below). - -TODO: FORTSETT HER, HVORDAN BYGGE DOKUMENTASJON -## Development & Documentation -For development (dependency management, documentation and testing) it is recommended to use [Poetry](https://python-poetry.org/docs/). -See Poetry's documentation for information of how to install and set up. -See above notes about creating and using a virtual environment. -To install the package, including dev and doc dependencies: -```sh -$ cd ship_traffic_generator -$ poetry install -$ poetry install --with dev,docs -``` -which will install the package, the cli and all development and documentation dependencies. - - -You can check your installation with: -```sh -$ trafficgen --help -``` -or +However, you still _can_ manually activate the virtual environment if needed. +When developing in an IDE, for instance, this can in some cases be necessary depending on your IDE settings. +To manually activate the virtual environment, run one of the "known" legacy commands:
+..on Windows: ```sh -$ trafficgen gen-situation --help +.venv\Scripts\activate.bat ``` -Note: You may have to restart your terminal (or update the path) for the command line command to work, or use the Poetry shell (`poetry shell`) to correct the search path. - -Testing in the project is done using [pytest](https://docs.pytest.org/) and -the format of the code is checked with [flake8](https://flake8.pycqa.org/en/latest/). -You can run the tests and check formating with [`tox`](https://tox.wiki/): +..on Linux: ```sh -$ tox run +source .venv/bin/activate ``` -To generate documentation do: +### Documentation +To generate documentation use: ```sh -$ cd docs -$ sphinx-build -M html . build +uv run docs/make.bat html ``` The html documentation will then be available in `docs/build/html/index.html` - - - - -## Credits -This package was created with Cookiecutter and the `audreyr/cookiecutter-pypackage` project template. -* [Cookiecutter](https://github.com/audreyr/cookiecutter) -* [`audreyr/cookiecutter-pypackage`](https://github.com/audreyr/cookiecutter-pypackage) diff --git a/docs/input_files.rst b/docs/input_files.rst deleted file mode 100644 index 335aa5b..0000000 --- a/docs/input_files.rst +++ /dev/null @@ -1,129 +0,0 @@ -=========== -Input files -=========== - -Example 1: Complete specified situation:: - - { - "title": "HO", - "description": "A head on situation with one target ship.", - "ownShip": { - "initial": { - "position": { - "lat": 58.763449, - "lon": 10.490654 - }, - "sog": 10.0, - "cog": 0.0, - "heading": 0.0, - "navStatus": "Under way using engine" - } - }, - "encounters": [ - { - "desiredEncounterType": "head-on", - "beta": 2.0, - "relativeSpeed": 1.2, - "vectorTime": 15.0 - } - ] - } - -The values may be given in either maritime units or SI units, and which unit is used shall be specified in the `src/trafficgen/settings/encounter_settings.json` file. -The `common_vector` is given in minutes (maritime) or seconds (SI). For radar plotting (plotting vessel positions and relative motions), -the `common_vector` and `vector_time` are used together with ship speed to display where the ship will be in e.g. 10 minutes -(Common vector is the common time vector used on a radar plot, e.g 10, 15, 20 minutes. The length of the arrow in the plot -will then be the speed times this time vector). -Speed and course of the own ship, which is the ship to be tested, are given in knots and degrees (maritime) or m/s and radians (SI), respectively. -The own ship position is given both in latitudinal and longitudinal (degree/radians) together with north/east in meters from the reference point. -The reference point is the initial position of own ship. - -An encounter may be fully described as shown above, but the user may also deside to input less data, -as demonstrated in Example 2. Desired encounter type is mandatory, -while the `beta`, `relative_speed` and `vector_time` parameters are optional: - - * `desired_encounter_type` is either head-on, overtaking-give-way, overtaking-stand-on, crossing-give-way, and crossing-stand-on. - * `beta` is the relative bearing between the own ship and the target ship as seen from the own shop, given in degrees/radians. - * `relative_speed` is relative speed between the own ship and the target ship as seen from the own ship, such that a relative speed of 1.2 means that the target ship's speed is 20% higher than the speed of the own ship. - -An encounter is built using a maximum meeting distance [nm], see the paper linked in the introduction for more info. -At some time in the future, given by the `vector_time`, the target ship will be located somewhere inside a circle -with a radius given by `max_meeting_distance` and a center point given by the own ship position. This is not necessarily the -closest point of approach. - -The `max_meeting_distance` parameter is common for all encounters and is specified in `src/trafficgen/settings/encounter_settings.json`. - -Example 2: Minimum specified situation:: - - { - "title": "HO", - "description": "A head on situation with one target ship.", - "ownShip": { - "initial": { - "position": { - "lat": 58.763449, - "lon": 10.490654 - }, - "sog": 10.0, - "cog": 0.0, - "heading": 0.0, - "navStatus": "Under way using engine" - } - }, - "encounters": [ - { - "desiredEncounterType": "head-on", - } - ] - } - - -You can also request the generation of several traffic situations of the same encounter type by specifying `num_situations`: - -Example 3: Generate multiple situations using `numSituations`:: - - { - "title": "HO", - "description": "A head on situation with one target ship.", - "numSituations": 5 - "ownShip": { - "initial": { - "position": { - "lat": 58.763449, - "lon": 10.490654 - }, - "sog": 10.0, - "cog": 0.0, - "heading": 0.0, - "navStatus": "Under way using engine" - } - }, - "encounters": [ - { - "desiredEncounterType": "head-on", - } - ] - } - -The next example show how it is possible to give a range for the relative bearing between own ship and target ship - -Example 4: Assign range for `beta`:: - - { - "title": "CR_GW", - "common_vector": 10.0, - "own_ship": { - "speed": 7.0, - "course": 0.0, - "position": { - "lat": 58.763449, - "lon": 10.490654 - } - }, - "encounter": [ - { - "desired_encounter_type": "crossing-give-way", - "beta": [45.0,120.0] - } - ] - } diff --git a/docs/installation.rst b/docs/installation.rst deleted file mode 100644 index 13058cb..0000000 --- a/docs/installation.rst +++ /dev/null @@ -1,45 +0,0 @@ -.. highlight:: shell - -============ -Installation -============ - - -Stable release --------------- - -To install Traffic Generator, run this command in your terminal: - -.. code-block:: console - - $ pip install trafficgen - -This is the preferred method to install Traffic Generator, as it will always install the most recent stable release. - -If you don't have `pip`_ installed, this `Python installation guide`_ can guide -you through the process. - -.. _pip: https://pip.pypa.io -.. _Python installation guide: http://docs.python-guide.org/en/latest/starting/installation/ - - -From sources ------------- - -The sources for Traffic Generator can be downloaded from the https://github.com/dnv-opensource/ship-traffic-generator. - -You can either clone the public repository: - -.. code-block:: console - - $ git clone https://github.com/dnv-opensource/ship-traffic-generator - - -Once you have a copy of the source, you can install it with: - -.. code-block:: console - - $ python setup.py install - - -.. _Git repo: git clone https://github.com/dnv-opensource/ship-traffic-generator diff --git a/docs/ICMASS23_verfying_caga_systems.pdf b/docs/source/ICMASS23_verfying_caga_systems.pdf similarity index 100% rename from docs/ICMASS23_verfying_caga_systems.pdf rename to docs/source/ICMASS23_verfying_caga_systems.pdf diff --git a/docs/source/_autosummary/trafficgen.ship_traffic_generator.rst b/docs/source/_autosummary/trafficgen.ship_traffic_generator.rst new file mode 100644 index 0000000..e59d482 --- /dev/null +++ b/docs/source/_autosummary/trafficgen.ship_traffic_generator.rst @@ -0,0 +1,13 @@ +trafficgen.ship\_traffic\_generator +=================================== + +.. automodule:: trafficgen.ship_traffic_generator + :members: + + + + .. rubric:: Functions + .. autosummary:: + + generate_traffic_situations + \ No newline at end of file diff --git a/docs/source/cli.__main__.rst b/docs/source/cli.__main__.rst deleted file mode 100644 index 446b831..0000000 --- a/docs/source/cli.__main__.rst +++ /dev/null @@ -1,3 +0,0 @@ -.. sphinx_argparse_cli:: - :module: trafficgen.cli.__main__ - :func: _argparser diff --git a/docs/source/cli.rst b/docs/source/cli.rst deleted file mode 100644 index 77a0a33..0000000 --- a/docs/source/cli.rst +++ /dev/null @@ -1,7 +0,0 @@ -CLI Documentation -================= - -.. toctree:: - :maxdepth: 3 - - cli.__main__ diff --git a/docs/source/conf.py b/docs/source/conf.py index ce1d8ef..8848dc1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -21,12 +21,12 @@ # -- Project information ----------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information -project = "my-package" -copyright = "2024, DNV AS. All rights reserved." -author = "Author One, Author Two, Author Three" +project = "trafficgen" +copyright = "2025, DNV AS. All rights reserved." +author = "Tom Arne Pedersen, Claas Rostock, Minos Hemrich" # The full version, including alpha/beta/rc tags -release = "0.1.0" +release = "0.6.0" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration @@ -40,6 +40,7 @@ "sphinx.ext.autosummary", "sphinx.ext.todo", "sphinxcontrib.mermaid", + "sphinx_click" ] # Extenstion for myst_parser @@ -66,10 +67,10 @@ # -- Options for HTML output ------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output -html_title = f"my-package {release}" +html_title = f"trafficgen {release}" html_theme = "furo" html_static_path = ["_static"] -html_logo = "_static/my_package.svg" +html_logo = "_static/DNV_logo.png" autodoc_default_options = { "member-order": "groupwise", "undoc-members": True, diff --git a/docs/source/index.rst b/docs/source/index.rst index b70c128..474cd5a 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,7 +3,7 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -my-package Documentation +Trafficgen Documentation ======================== .. toctree:: @@ -12,7 +12,6 @@ my-package Documentation README api - cli CHANGELOG STYLEGUIDE LICENSE diff --git a/docs/source/my_package.rst b/docs/source/my_package.rst deleted file mode 100644 index e1e72de..0000000 --- a/docs/source/my_package.rst +++ /dev/null @@ -1,25 +0,0 @@ -my-package package -================== - -Subpackages ------------ - -.. autosummary:: - :toctree: _autosummary - :template: custom-module.rst - :recursive: - - my_package.subpackage1 - my_package.subpackage2 - my_package.utils - - -Modules -------- - -.. autosummary:: - :toctree: _autosummary - :template: custom-module.rst - :recursive: - - my_package.api diff --git a/docs/usage.rst b/docs/usage.rst deleted file mode 100644 index b9cb17a..0000000 --- a/docs/usage.rst +++ /dev/null @@ -1,58 +0,0 @@ -===== -Usage -===== - -To use Traffic Generator in a project:: - - import trafficgen - -To use Traffic Generator as a command line tool for generating traffic situations, write:: - - trafficgen gen-situation - -The command line tool takes different input options:: - - -s, --situations PATH Folders with situations (default=./baseline_situations_input/) - -t, --targets PATH Folder with target configurations (default=./target_ships/) - -c, --settings PATH Path to settings file (default=./settings/encounter_settings.json) - --visualize Plot visualization - --col INTEGER Number of columns for plot, may be used with visualize (default=10) - --row INTEGER Number of rows for plot, may be used with visualize (default=6) - --visualize-situation INTEGER Plot individual traffic situation, specify INTEGER value - -o, --output PATH Output folder (default=None) - --help Show this message and exit. - -Example:: - - trafficgen gen-situation -s ./data/example_situations_input -o ./data/test_output_1 - -Situations -~~~~~~~~~~ -When generating situations without specifying where the desired situations (``--situation``) are found, the -default path, which is ``default=./baseline_situations_input/``, will be used. - -Baseline situations -~~~~~~~~~~~~~~~~~~~ -The baseline situations are a set of generic traffic situations covering head-on, overtaking stand-on/give-way -and crossing stand-on/give-way encounters. To cover the combination of encounters for 1, 2 and 3 target ships, -there are in total 55 baseline situations. The input files for generating these situations are found in -``./baseline_situations_input/`` - -Plotting -~~~~~~~~ -Plotting all generated traffic situations ------------------------------------------ -All the generated situations are displayed if using ``--visualize``. This will pop up one or more plot windows, -which show all the traffic situations. The number of colums and rows for the plots (per figure) can be specified by -using ``--col`` and ``--row``, respectively. - -Individual plots with map background ------------------------------------- -A specific encounter is visualized by using ``--visualize-situation INTEGER``, e.g.:: - - trafficgen gen-situation -s ./data/example_situations_input -o ./data/test_output_1 --visualize-situation 2 - -This will open a browser window/tab with an OpenStreetMap background and the traffic situation -radar plot as an overlay. -Note that the integer needs to be within the range of the number of generated situations, -for example 1 - 12 if you generated 12 situations. diff --git a/pyproject.toml b/pyproject.toml index cd0efa9..5b82c45 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ name = "trafficgen" version = "0.6.0" description = "Automatic generation of ship traffic situations from a set of predefined situations" readme = "README.md" -requires-python = ">= 3.10" +requires-python = ">= 3.11" license = { file = "LICENSE" } authors = [ { name = "Tom Arne Pedersen", email = "Tom.Arne.Pedersen@dnv.com" }, @@ -47,7 +47,6 @@ keywords = [ classifiers = [ "Development Status :: 3 - Alpha", "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Operating System :: Microsoft :: Windows", @@ -92,6 +91,7 @@ dev = [ "sphinx-argparse-cli>=1.19", "sphinx-autodoc-typehints>=2.5", "sphinxcontrib-mermaid>=1.0.0", + "sphinx-click>=6.0.0", "myst-parser>=4.0", "furo>=2024.8", "jupyter>=1.1", diff --git a/src/trafficgen/types.py b/src/trafficgen/types.py index dcd1563..8fe3ea3 100644 --- a/src/trafficgen/types.py +++ b/src/trafficgen/types.py @@ -1,9 +1,11 @@ """Domain specific data types used in trafficgen.""" +from __future__ import annotations + import datetime from enum import Enum from importlib.metadata import PackageNotFoundError, version -from typing import Annotated, Any, Optional +from typing import Annotated, Any, Optional, Self from pydantic import BaseModel, ConfigDict from pydantic.fields import Field @@ -12,7 +14,7 @@ try: project_version = version("trafficgen") except PackageNotFoundError: - project_version = None + project_version = "-.-" def to_camel(string: str) -> str: @@ -38,14 +40,18 @@ class StringIntEnumMixin(str, Enum): - String value with underscores: "underway_using_engine" """ - def __new__(cls: type["StringIntEnumMixin"], str_value: str, num_value: int) -> "StringIntEnumMixin": # noqa: D102 + def __init__(self, str_value: str, num_value: int) -> None: + self._value_ = str_value + self.num_value = num_value + + def __new__(cls: type[Self], str_value: str, num_value: int) -> Self: # noqa: D102 obj = str.__new__(cls, str_value) obj._value_ = str_value # Assign the string value - obj.num_value = num_value # type: ignore[PGH003] + obj.num_value = num_value return obj @classmethod - def _missing_(cls: type["StringIntEnumMixin"], value: object) -> Optional["StringIntEnumMixin"]: + def _missing_(cls: type[Self], value: object) -> Self | None: # Handle case-insensitive string matching and underscores if isinstance(value, str): value_str = value.replace("_", " ").lower() diff --git a/src/trafficgen/utils.py b/src/trafficgen/utils.py index 7a44fbd..0f5245e 100644 --- a/src/trafficgen/utils.py +++ b/src/trafficgen/utils.py @@ -227,9 +227,10 @@ def calculate_position_along_track_using_waypoints( for i in range(1, len(waypoints)): ship_speed: float = inital_speed - if waypoints[i].leg is not None and waypoints[i].leg.data.sog is not None: # type: ignore[attr-defined] - assert waypoints[i].leg.data.sog.value is not None # type: ignore # noqa: PGH003 - ship_speed = waypoints[i].leg.data.sog.value # type: ignore # noqa: PGH003 + waypoint: Waypoint = waypoints[i] + if waypoint.leg is not None and waypoint.leg.data is not None and waypoint.leg.data.sog is not None: + assert waypoint.leg.data.sog.value is not None + ship_speed = waypoint.leg.data.sog.value dist_between_waypoints = calculate_distance(waypoints[i - 1].position, waypoints[i].position) diff --git a/uv.lock b/uv.lock index f743b53..9806427 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -requires-python = ">=3.10" +requires-python = ">=3.11" [[package]] name = "alabaster" @@ -24,7 +24,6 @@ name = "anyio" version = "4.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "sniffio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, @@ -102,9 +101,6 @@ wheels = [ name = "async-lru" version = "2.0.4" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/80/e2/2b4651eff771f6fd900d233e175ddc5e2be502c7eb62c0c42f975c6d36cd/async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627", size = 10019 } wheels = [ { url = "https://files.pythonhosted.org/packages/fa/9f/3c3503693386c4b0f245eaf5ca6198e3b28879ca0a40bde6b0e319793453/async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224", size = 6111 }, @@ -142,12 +138,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/00/63/f3a5e74a8a31c20ea785ebd0fc1a9e680a9f1c5ac9ab4888f349ef9a3165/basemap-1.4.1.zip", hash = "sha256:6822d3d08c11cdc443e3ed01d61d512e7cf62d4b40bbc1d235f0a898f2c54a7a", size = 167398 } wheels = [ - { url = "https://files.pythonhosted.org/packages/48/dd/11376f7c1437b91612f389a4fa33cab636e02d16a256dd6ecb74ac5261b2/basemap-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8786f23e3f456ab402b8160efb7b8b1c3780d6b84154dfcfdcd3f0401ef3285", size = 623524 }, - { url = "https://files.pythonhosted.org/packages/db/46/ea479f53a880f99d8758f6e4e72ce0c020f00211a70ff16dc5bfe77494dc/basemap-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:22793cf731d6cc06e11cf2760fd2875cd18b2980ce1c5ba15f6ebd9e224b1a1d", size = 569011 }, - { url = "https://files.pythonhosted.org/packages/48/dc/75a162c27053e7470474be827c02d5ea8c25b9f9ca2e1b823b4480d5ce84/basemap-1.4.1-cp310-cp310-manylinux1_i686.whl", hash = "sha256:8818fbb5e1133f0955a62ea159a3792124fc06f9b37ea4427612f6def923b711", size = 922385 }, - { url = "https://files.pythonhosted.org/packages/31/c0/640b7a056671d51453b4685cf4c10f2bbe7326c3c9d301a2358b8889887b/basemap-1.4.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:650e9b2170579193cb89bea2c328740fc13c0327b8ea55173490f760d0f04f8c", size = 935998 }, - { url = "https://files.pythonhosted.org/packages/b3/73/38a2be36571f61d9bb3e9a25c4be119c1a314bc06be31f2492aed0de9dc5/basemap-1.4.1-cp310-cp310-win32.whl", hash = "sha256:2e198e442bae7ad0d25f529788fcb5802192d844d856fa966f6018a46648a375", size = 402690 }, - { url = "https://files.pythonhosted.org/packages/c9/a8/ed7ca0f4ef0aa4872b2b705c25c25f13fe9e70a41aea773ac34888cf8c62/basemap-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:91d03458343d73f6a5e4d42e79df59cf57eba699094b71ce7c57ec40c8de9f59", size = 507061 }, { url = "https://files.pythonhosted.org/packages/58/ab/a93ccacdde434d00d2f9e08c8ecf62df0c50cf0ce3c1b819f3ca3fea6c2f/basemap-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:509bb451ce26f1f7651cc19d27ef049935304c7795a141cfbe05582802554226", size = 623678 }, { url = "https://files.pythonhosted.org/packages/73/92/f0bf706ef07c503d20a7cc0863b66e5db418680fdaca94dc2cac537423cd/basemap-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6860ab68a461cd36b6eda5d3973bfa1e3a4fdeaf608e8dd4b324b08e8561eed", size = 569118 }, { url = "https://files.pythonhosted.org/packages/e6/e2/0932c15c6bae2100a262506830358a1dfb3c2c82671e4094cc8f2b6d5104/basemap-1.4.1-cp311-cp311-manylinux1_i686.whl", hash = "sha256:500a3d314166057d0b3c065e63147042c996ead1af5d59e319f813b83d4ea220", size = 936489 }, @@ -239,18 +229,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191 }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592 }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024 }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188 }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571 }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687 }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211 }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325 }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784 }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564 }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804 }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299 }, { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, @@ -302,19 +280,6 @@ version = "3.4.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/58/5580c1716040bc89206c77d8f74418caf82ce519aae06450393ca73475d1/charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", size = 198013 }, - { url = "https://files.pythonhosted.org/packages/d0/11/00341177ae71c6f5159a08168bcb98c6e6d196d372c94511f9f6c9afe0c6/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", size = 141285 }, - { url = "https://files.pythonhosted.org/packages/01/09/11d684ea5819e5a8f5100fb0b38cf8d02b514746607934134d31233e02c8/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", size = 151449 }, - { url = "https://files.pythonhosted.org/packages/08/06/9f5a12939db324d905dc1f70591ae7d7898d030d7662f0d426e2286f68c9/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", size = 143892 }, - { url = "https://files.pythonhosted.org/packages/93/62/5e89cdfe04584cb7f4d36003ffa2936681b03ecc0754f8e969c2becb7e24/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", size = 146123 }, - { url = "https://files.pythonhosted.org/packages/a9/ac/ab729a15c516da2ab70a05f8722ecfccc3f04ed7a18e45c75bbbaa347d61/charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", size = 147943 }, - { url = "https://files.pythonhosted.org/packages/03/d2/3f392f23f042615689456e9a274640c1d2e5dd1d52de36ab8f7955f8f050/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", size = 142063 }, - { url = "https://files.pythonhosted.org/packages/f2/e3/e20aae5e1039a2cd9b08d9205f52142329f887f8cf70da3650326670bddf/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", size = 150578 }, - { url = "https://files.pythonhosted.org/packages/8d/af/779ad72a4da0aed925e1139d458adc486e61076d7ecdcc09e610ea8678db/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", size = 153629 }, - { url = "https://files.pythonhosted.org/packages/c2/b6/7aa450b278e7aa92cf7732140bfd8be21f5f29d5bf334ae987c945276639/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", size = 150778 }, - { url = "https://files.pythonhosted.org/packages/39/f4/d9f4f712d0951dcbfd42920d3db81b00dd23b6ab520419626f4023334056/charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", size = 146453 }, - { url = "https://files.pythonhosted.org/packages/49/2b/999d0314e4ee0cff3cb83e6bc9aeddd397eeed693edb4facb901eb8fbb69/charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", size = 95479 }, - { url = "https://files.pythonhosted.org/packages/2d/ce/3cbed41cff67e455a386fb5e5dd8906cdda2ed92fbc6297921f2e4419309/charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", size = 102790 }, { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, @@ -411,16 +376,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/25/c2/fc7193cc5383637ff390a712e88e4ded0452c9fbcf84abe3de5ea3df1866/contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", size = 13465753 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/a3/80937fe3efe0edacf67c9a20b955139a1a622730042c1ea991956f2704ad/contourpy-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab", size = 268466 }, - { url = "https://files.pythonhosted.org/packages/82/1d/e3eaebb4aa2d7311528c048350ca8e99cdacfafd99da87bc0a5f8d81f2c2/contourpy-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124", size = 253314 }, - { url = "https://files.pythonhosted.org/packages/de/f3/d796b22d1a2b587acc8100ba8c07fb7b5e17fde265a7bb05ab967f4c935a/contourpy-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1", size = 312003 }, - { url = "https://files.pythonhosted.org/packages/bf/f5/0e67902bc4394daee8daa39c81d4f00b50e063ee1a46cb3938cc65585d36/contourpy-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b", size = 351896 }, - { url = "https://files.pythonhosted.org/packages/1f/d6/e766395723f6256d45d6e67c13bb638dd1fa9dc10ef912dc7dd3dcfc19de/contourpy-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453", size = 320814 }, - { url = "https://files.pythonhosted.org/packages/a9/57/86c500d63b3e26e5b73a28b8291a67c5608d4aa87ebd17bd15bb33c178bc/contourpy-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3", size = 324969 }, - { url = "https://files.pythonhosted.org/packages/b8/62/bb146d1289d6b3450bccc4642e7f4413b92ebffd9bf2e91b0404323704a7/contourpy-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277", size = 1265162 }, - { url = "https://files.pythonhosted.org/packages/18/04/9f7d132ce49a212c8e767042cc80ae390f728060d2eea47058f55b9eff1c/contourpy-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595", size = 1324328 }, - { url = "https://files.pythonhosted.org/packages/46/23/196813901be3f97c83ababdab1382e13e0edc0bb4e7b49a7bff15fcf754e/contourpy-1.3.1-cp310-cp310-win32.whl", hash = "sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697", size = 173861 }, - { url = "https://files.pythonhosted.org/packages/e0/82/c372be3fc000a3b2005061ca623a0d1ecd2eaafb10d9e883a2fc8566e951/contourpy-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e", size = 218566 }, { url = "https://files.pythonhosted.org/packages/12/bb/11250d2906ee2e8b466b5f93e6b19d525f3e0254ac8b445b56e618527718/contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b", size = 269555 }, { url = "https://files.pythonhosted.org/packages/67/71/1e6e95aee21a500415f5d2dbf037bf4567529b6a4e986594d7026ec5ae90/contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc", size = 254549 }, { url = "https://files.pythonhosted.org/packages/31/2c/b88986e8d79ac45efe9d8801ae341525f38e087449b6c2f2e6050468a42c/contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86", size = 313000 }, @@ -461,9 +416,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f0/ed/92d86f183a8615f13f6b9cbfc5d4298a509d6ce433432e21da838b4b63f4/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1", size = 1318403 }, { url = "https://files.pythonhosted.org/packages/b3/0e/c8e4950c77dcfc897c71d61e56690a0a9df39543d2164040301b5df8e67b/contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1", size = 185117 }, { url = "https://files.pythonhosted.org/packages/c1/31/1ae946f11dfbd229222e6d6ad8e7bd1891d3d48bde5fbf7a0beb9491f8e3/contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546", size = 236668 }, - { url = "https://files.pythonhosted.org/packages/3e/4f/e56862e64b52b55b5ddcff4090085521fc228ceb09a88390a2b103dccd1b/contourpy-1.3.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6", size = 265605 }, - { url = "https://files.pythonhosted.org/packages/b0/2e/52bfeeaa4541889f23d8eadc6386b442ee2470bd3cff9baa67deb2dd5c57/contourpy-1.3.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750", size = 315040 }, - { url = "https://files.pythonhosted.org/packages/52/94/86bfae441707205634d80392e873295652fc313dfd93c233c52c4dc07874/contourpy-1.3.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53", size = 218221 }, ] [[package]] @@ -472,16 +424,6 @@ version = "7.6.10" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/12/2a2a923edf4ddabdffed7ad6da50d96a5c126dae7b80a33df7310e329a1e/coverage-7.6.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5c912978f7fbf47ef99cec50c4401340436d200d41d714c7a4766f377c5b7b78", size = 207982 }, - { url = "https://files.pythonhosted.org/packages/ca/49/6985dbca9c7be3f3cb62a2e6e492a0c88b65bf40579e16c71ae9c33c6b23/coverage-7.6.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a01ec4af7dfeb96ff0078ad9a48810bb0cc8abcb0115180c6013a6b26237626c", size = 208414 }, - { url = "https://files.pythonhosted.org/packages/35/93/287e8f1d1ed2646f4e0b2605d14616c9a8a2697d0d1b453815eb5c6cebdb/coverage-7.6.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3b204c11e2b2d883946fe1d97f89403aa1811df28ce0447439178cc7463448a", size = 236860 }, - { url = "https://files.pythonhosted.org/packages/de/e1/cfdb5627a03567a10031acc629b75d45a4ca1616e54f7133ca1fa366050a/coverage-7.6.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32ee6d8491fcfc82652a37109f69dee9a830e9379166cb73c16d8dc5c2915165", size = 234758 }, - { url = "https://files.pythonhosted.org/packages/6d/85/fc0de2bcda3f97c2ee9fe8568f7d48f7279e91068958e5b2cc19e0e5f600/coverage-7.6.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675cefc4c06e3b4c876b85bfb7c59c5e2218167bbd4da5075cbe3b5790a28988", size = 235920 }, - { url = "https://files.pythonhosted.org/packages/79/73/ef4ea0105531506a6f4cf4ba571a214b14a884630b567ed65b3d9c1975e1/coverage-7.6.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f4f620668dbc6f5e909a0946a877310fb3d57aea8198bde792aae369ee1c23b5", size = 234986 }, - { url = "https://files.pythonhosted.org/packages/c6/4d/75afcfe4432e2ad0405c6f27adeb109ff8976c5e636af8604f94f29fa3fc/coverage-7.6.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4eea95ef275de7abaef630c9b2c002ffbc01918b726a39f5a4353916ec72d2f3", size = 233446 }, - { url = "https://files.pythonhosted.org/packages/86/5b/efee56a89c16171288cafff022e8af44f8f94075c2d8da563c3935212871/coverage-7.6.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e2f0280519e42b0a17550072861e0bc8a80a0870de260f9796157d3fca2733c5", size = 234566 }, - { url = "https://files.pythonhosted.org/packages/f2/db/67770cceb4a64d3198bf2aa49946f411b85ec6b0a9b489e61c8467a4253b/coverage-7.6.10-cp310-cp310-win32.whl", hash = "sha256:bc67deb76bc3717f22e765ab3e07ee9c7a5e26b9019ca19a3b063d9f4b874244", size = 210675 }, - { url = "https://files.pythonhosted.org/packages/8d/27/e8bfc43f5345ec2c27bc8a1fa77cdc5ce9dcf954445e11f14bb70b889d14/coverage-7.6.10-cp310-cp310-win_amd64.whl", hash = "sha256:0f460286cb94036455e703c66988851d970fdfd8acc2a1122ab7f4f904e4029e", size = 211518 }, { url = "https://files.pythonhosted.org/packages/85/d2/5e175fcf6766cf7501a8541d81778fd2f52f4870100e791f5327fd23270b/coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", size = 208088 }, { url = "https://files.pythonhosted.org/packages/4b/6f/06db4dc8fca33c13b673986e20e466fd936235a6ec1f0045c3853ac1b593/coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", size = 208536 }, { url = "https://files.pythonhosted.org/packages/0d/62/c6a0cf80318c1c1af376d52df444da3608eafc913b82c84a4600d8349472/coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", size = 240474 }, @@ -522,7 +464,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, - { url = "https://files.pythonhosted.org/packages/a1/70/de81bfec9ed38a64fc44a77c7665e20ca507fc3265597c28b0d989e4082e/coverage-7.6.10-pp39.pp310-none-any.whl", hash = "sha256:fd34e7b3405f0cc7ab03d54a334c17a9e802897580d964bd8c2001f4b9fd488f", size = 200223 }, ] [package.optional-dependencies] @@ -545,10 +486,6 @@ version = "1.8.11" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/bc/e7/666f4c9b0e24796af50aadc28d36d21c2e01e831a934535f956e09b3650c/debugpy-1.8.11.tar.gz", hash = "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57", size = 1640124 } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/e6/4cf7422eaa591b4c7d6a9fde224095dac25283fdd99d90164f28714242b0/debugpy-1.8.11-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:2b26fefc4e31ff85593d68b9022e35e8925714a10ab4858fb1b577a8a48cb8cd", size = 2075100 }, - { url = "https://files.pythonhosted.org/packages/83/3a/e163de1df5995d95760a4d748b02fbefb1c1bf19e915b664017c40435dbf/debugpy-1.8.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61bc8b3b265e6949855300e84dc93d02d7a3a637f2aec6d382afd4ceb9120c9f", size = 3559724 }, - { url = "https://files.pythonhosted.org/packages/27/6c/327e19fd1bf428a1efe1a6f97b306689c54c2cebcf871b66674ead718756/debugpy-1.8.11-cp310-cp310-win32.whl", hash = "sha256:c928bbf47f65288574b78518449edaa46c82572d340e2750889bbf8cd92f3737", size = 5178068 }, - { url = "https://files.pythonhosted.org/packages/49/80/359ff8aa388f0bd4a48f0fa9ce3606396d576657ac149c6fba3cc7de8adb/debugpy-1.8.11-cp310-cp310-win_amd64.whl", hash = "sha256:8da1db4ca4f22583e834dcabdc7832e56fe16275253ee53ba66627b86e304da1", size = 5210109 }, { url = "https://files.pythonhosted.org/packages/7c/58/8e3f7ec86c1b7985a232667b5df8f3b1b1c8401028d8f4d75e025c9556cd/debugpy-1.8.11-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:85de8474ad53ad546ff1c7c7c89230db215b9b8a02754d41cb5a76f70d0be296", size = 2173656 }, { url = "https://files.pythonhosted.org/packages/d2/03/95738a68ade2358e5a4d63a2fd8e7ed9ad911001cfabbbb33a7f81343945/debugpy-1.8.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ffc382e4afa4aee367bf413f55ed17bd91b191dcaf979890af239dda435f2a1", size = 3132464 }, { url = "https://files.pythonhosted.org/packages/ca/f4/18204891ab67300950615a6ad09b9de236203a9138f52b3b596fa17628ca/debugpy-1.8.11-cp311-cp311-win32.whl", hash = "sha256:40499a9979c55f72f4eb2fc38695419546b62594f8af194b879d2a18439c97a9", size = 5103637 }, @@ -614,15 +551,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, ] -[[package]] -name = "exceptiongroup" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, -] - [[package]] name = "executing" version = "2.1.0" @@ -672,14 +600,6 @@ version = "4.55.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/76/61/a300d1574dc381393424047c0396a0e213db212e28361123af9830d71a8d/fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45", size = 3498155 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/f3/9ac8c6705e4a0ff3c29e524df1caeee6f2987b02fb630129f21cc99a8212/fonttools-4.55.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1dcc07934a2165ccdc3a5a608db56fb3c24b609658a5b340aee4ecf3ba679dc0", size = 2769857 }, - { url = "https://files.pythonhosted.org/packages/d8/24/e8b8edd280bdb7d0ecc88a5d952b1dec2ee2335be71cc5a33c64871cdfe8/fonttools-4.55.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f7d66c15ba875432a2d2fb419523f5d3d347f91f48f57b8b08a2dfc3c39b8a3f", size = 2299705 }, - { url = "https://files.pythonhosted.org/packages/f8/9e/e1ba20bd3b71870207fd45ca3b90208a7edd8ae3b001081dc31c45adb017/fonttools-4.55.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e4ae3592e62eba83cd2c4ccd9462dcfa603ff78e09110680a5444c6925d841", size = 4576104 }, - { url = "https://files.pythonhosted.org/packages/34/db/d423bc646e6703fe3e6aea0edd22a2df47b9d188c5f7f1b49070be4d2205/fonttools-4.55.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d65a3022c35e404d19ca14f291c89cc5890032ff04f6c17af0bd1927299674", size = 4618282 }, - { url = "https://files.pythonhosted.org/packages/75/a0/e5062ac960a385b984ba74e7b55132e7f2c65e449e8330ab0f595407a3de/fonttools-4.55.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d342e88764fb201286d185093781bf6628bbe380a913c24adf772d901baa8276", size = 4570539 }, - { url = "https://files.pythonhosted.org/packages/1f/33/0d744ff518ebe50020b63e5018b8b278efd6a930c1d2eedda7defc42153b/fonttools-4.55.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dd68c87a2bfe37c5b33bcda0fba39b65a353876d3b9006fde3adae31f97b3ef5", size = 4742411 }, - { url = "https://files.pythonhosted.org/packages/7e/6c/2f768652dba6b801f1567fc5d1829cda369bcd6e95e315a91e628f91c702/fonttools-4.55.3-cp310-cp310-win32.whl", hash = "sha256:1bc7ad24ff98846282eef1cbeac05d013c2154f977a79886bb943015d2b1b261", size = 2175132 }, - { url = "https://files.pythonhosted.org/packages/19/d1/4dcd865360fb2c499749a913fe80e41c26e8ae18629d87dfffa3de27e831/fonttools-4.55.3-cp310-cp310-win_amd64.whl", hash = "sha256:b54baf65c52952db65df39fcd4820668d0ef4766c0ccdf32879b77f7c804d5c5", size = 2219430 }, { url = "https://files.pythonhosted.org/packages/4b/18/14be25545600bd100e5b74a3ac39089b7c1cb403dc513b7ca348be3381bf/fonttools-4.55.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c4491699bad88efe95772543cd49870cf756b019ad56294f6498982408ab03e", size = 2771005 }, { url = "https://files.pythonhosted.org/packages/b2/51/2e1a5d3871cd7c2ae2054b54e92604e7d6abc3fd3656e9583c399648fe1c/fonttools-4.55.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5323a22eabddf4b24f66d26894f1229261021dacd9d29e89f7872dd8c63f0b8b", size = 2300654 }, { url = "https://files.pythonhosted.org/packages/73/1a/50109bb2703bc6f774b52ea081db21edf2a9fa4b6d7485faadf9d1b997e9/fonttools-4.55.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5480673f599ad410695ca2ddef2dfefe9df779a9a5cda89503881e503c9c7d90", size = 4877541 }, @@ -844,7 +764,6 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "decorator" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "jedi" }, { name = "matplotlib-inline" }, { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, @@ -1123,7 +1042,6 @@ dependencies = [ { name = "notebook-shim" }, { name = "packaging" }, { name = "setuptools" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "tornado" }, { name = "traitlets" }, ] @@ -1174,21 +1092,6 @@ version = "1.4.8" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/5f/4d8e9e852d98ecd26cdf8eaf7ed8bc33174033bba5e07001b289f07308fd/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db", size = 124623 }, - { url = "https://files.pythonhosted.org/packages/1d/70/7f5af2a18a76fe92ea14675f8bd88ce53ee79e37900fa5f1a1d8e0b42998/kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b", size = 66720 }, - { url = "https://files.pythonhosted.org/packages/c6/13/e15f804a142353aefd089fadc8f1d985561a15358c97aca27b0979cb0785/kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d", size = 65413 }, - { url = "https://files.pythonhosted.org/packages/ce/6d/67d36c4d2054e83fb875c6b59d0809d5c530de8148846b1370475eeeece9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d", size = 1650826 }, - { url = "https://files.pythonhosted.org/packages/de/c6/7b9bb8044e150d4d1558423a1568e4f227193662a02231064e3824f37e0a/kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c", size = 1628231 }, - { url = "https://files.pythonhosted.org/packages/b6/38/ad10d437563063eaaedbe2c3540a71101fc7fb07a7e71f855e93ea4de605/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3", size = 1408938 }, - { url = "https://files.pythonhosted.org/packages/52/ce/c0106b3bd7f9e665c5f5bc1e07cc95b5dabd4e08e3dad42dbe2faad467e7/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed", size = 1422799 }, - { url = "https://files.pythonhosted.org/packages/d0/87/efb704b1d75dc9758087ba374c0f23d3254505edaedd09cf9d247f7878b9/kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f", size = 1354362 }, - { url = "https://files.pythonhosted.org/packages/eb/b3/fd760dc214ec9a8f208b99e42e8f0130ff4b384eca8b29dd0efc62052176/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff", size = 2222695 }, - { url = "https://files.pythonhosted.org/packages/a2/09/a27fb36cca3fc01700687cc45dae7a6a5f8eeb5f657b9f710f788748e10d/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d", size = 2370802 }, - { url = "https://files.pythonhosted.org/packages/3d/c3/ba0a0346db35fe4dc1f2f2cf8b99362fbb922d7562e5f911f7ce7a7b60fa/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c", size = 2334646 }, - { url = "https://files.pythonhosted.org/packages/41/52/942cf69e562f5ed253ac67d5c92a693745f0bed3c81f49fc0cbebe4d6b00/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605", size = 2467260 }, - { url = "https://files.pythonhosted.org/packages/32/26/2d9668f30d8a494b0411d4d7d4ea1345ba12deb6a75274d58dd6ea01e951/kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e", size = 2288633 }, - { url = "https://files.pythonhosted.org/packages/98/99/0dd05071654aa44fe5d5e350729961e7bb535372935a45ac89a8924316e6/kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751", size = 71885 }, - { url = "https://files.pythonhosted.org/packages/6c/fc/822e532262a97442989335394d441cd1d0448c2e46d26d3e04efca84df22/kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271", size = 65175 }, { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635 }, { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717 }, { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413 }, @@ -1247,12 +1150,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, - { url = "https://files.pythonhosted.org/packages/1f/f9/ae81c47a43e33b93b0a9819cac6723257f5da2a5a60daf46aa5c7226ea85/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a", size = 60403 }, - { url = "https://files.pythonhosted.org/packages/58/ca/f92b5cb6f4ce0c1ebfcfe3e2e42b96917e16f7090e45b21102941924f18f/kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8", size = 58657 }, - { url = "https://files.pythonhosted.org/packages/80/28/ae0240f732f0484d3a4dc885d055653c47144bdf59b670aae0ec3c65a7c8/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0", size = 84948 }, - { url = "https://files.pythonhosted.org/packages/5d/eb/78d50346c51db22c7203c1611f9b513075f35c4e0e4877c5dde378d66043/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c", size = 81186 }, - { url = "https://files.pythonhosted.org/packages/43/f8/7259f18c77adca88d5f64f9a522792e178b2691f3748817a8750c2d216ef/kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b", size = 80279 }, - { url = "https://files.pythonhosted.org/packages/3a/1d/50ad811d1c5dae091e4cf046beba925bcae0a610e79ae4c538f996f63ed5/kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b", size = 71762 }, ] [[package]] @@ -1261,23 +1158,6 @@ version = "5.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e7/6b/20c3a4b24751377aaa6307eb230b66701024012c29dd374999cc92983269/lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f", size = 3679318 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/ce/2789e39eddf2b13fac29878bfa465f0910eb6b0096e29090e5176bc8cf43/lxml-5.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd36439be765e2dde7660212b5275641edbc813e7b24668831a5c8ac91180656", size = 8124570 }, - { url = "https://files.pythonhosted.org/packages/24/a8/f4010166a25d41715527129af2675981a50d3bbf7df09c5d9ab8ca24fbf9/lxml-5.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ae5fe5c4b525aa82b8076c1a59d642c17b6e8739ecf852522c6321852178119d", size = 4413042 }, - { url = "https://files.pythonhosted.org/packages/41/a4/7e45756cecdd7577ddf67a68b69c1db0f5ddbf0c9f65021ee769165ffc5a/lxml-5.3.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:501d0d7e26b4d261fca8132854d845e4988097611ba2531408ec91cf3fd9d20a", size = 5139213 }, - { url = "https://files.pythonhosted.org/packages/02/e2/ecf845b12323c92748077e1818b64e8b4dba509a4cb12920b3762ebe7552/lxml-5.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8", size = 4838814 }, - { url = "https://files.pythonhosted.org/packages/12/91/619f9fb72cf75e9ceb8700706f7276f23995f6ad757e6d400fbe35ca4990/lxml-5.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e41506fec7a7f9405b14aa2d5c8abbb4dbbd09d88f9496958b6d00cb4d45330", size = 5425084 }, - { url = "https://files.pythonhosted.org/packages/25/3b/162a85a8f0fd2a3032ec3f936636911c6e9523a8e263fffcfd581ce98b54/lxml-5.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7d4a670107d75dfe5ad080bed6c341d18c4442f9378c9f58e5851e86eb79965", size = 4875993 }, - { url = "https://files.pythonhosted.org/packages/43/af/dd3f58cc7d946da6ae42909629a2b1d5dd2d1b583334d4af9396697d6863/lxml-5.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41ce1f1e2c7755abfc7e759dc34d7d05fd221723ff822947132dc934d122fe22", size = 5012462 }, - { url = "https://files.pythonhosted.org/packages/69/c1/5ea46b2d4c98f5bf5c83fffab8a0ad293c9bc74df9ecfbafef10f77f7201/lxml-5.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:44264ecae91b30e5633013fb66f6ddd05c006d3e0e884f75ce0b4755b3e3847b", size = 4815288 }, - { url = "https://files.pythonhosted.org/packages/1d/51/a0acca077ad35da458f4d3f729ef98effd2b90f003440d35fc36323f8ae6/lxml-5.3.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:3c174dc350d3ec52deb77f2faf05c439331d6ed5e702fc247ccb4e6b62d884b7", size = 5472435 }, - { url = "https://files.pythonhosted.org/packages/4d/6b/0989c9368986961a6b0f55b46c80404c4b758417acdb6d87bfc3bd5f4967/lxml-5.3.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:2dfab5fa6a28a0b60a20638dc48e6343c02ea9933e3279ccb132f555a62323d8", size = 4976354 }, - { url = "https://files.pythonhosted.org/packages/05/9e/87492d03ff604fbf656ed2bf3e2e8d28f5d58ea1f00ff27ac27b06509079/lxml-5.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b1c8c20847b9f34e98080da785bb2336ea982e7f913eed5809e5a3c872900f32", size = 5029973 }, - { url = "https://files.pythonhosted.org/packages/f9/cc/9ae1baf5472af88e19e2c454b3710c1be9ecafb20eb474eeabcd88a055d2/lxml-5.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c86bf781b12ba417f64f3422cfc302523ac9cd1d8ae8c0f92a1c66e56ef2e86", size = 4888837 }, - { url = "https://files.pythonhosted.org/packages/d2/10/5594ffaec8c120d75b17e3ad23439b740a51549a9b5fd7484b2179adfe8f/lxml-5.3.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:c162b216070f280fa7da844531169be0baf9ccb17263cf5a8bf876fcd3117fa5", size = 5530555 }, - { url = "https://files.pythonhosted.org/packages/ea/9b/de17f05377c8833343b629905571fb06cff2028f15a6f58ae2267662e341/lxml-5.3.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:36aef61a1678cb778097b4a6eeae96a69875d51d1e8f4d4b491ab3cfb54b5a03", size = 5405314 }, - { url = "https://files.pythonhosted.org/packages/8a/b4/227be0f1f3cca8255925985164c3838b8b36e441ff0cc10c1d3c6bdba031/lxml-5.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f65e5120863c2b266dbcc927b306c5b78e502c71edf3295dfcb9501ec96e5fc7", size = 5079303 }, - { url = "https://files.pythonhosted.org/packages/5c/ee/19abcebb7fc40319bb71cd6adefa1ad94d09b5660228715854d6cc420713/lxml-5.3.0-cp310-cp310-win32.whl", hash = "sha256:ef0c1fe22171dd7c7c27147f2e9c3e86f8bdf473fed75f16b0c2e84a5030ce80", size = 3475126 }, - { url = "https://files.pythonhosted.org/packages/a1/35/183d32551447e280032b2331738cd850da435a42f850b71ebeaab42c1313/lxml-5.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:052d99051e77a4f3e8482c65014cf6372e61b0a6f4fe9edb98503bb5364cfee3", size = 3805065 }, { url = "https://files.pythonhosted.org/packages/5c/a8/449faa2a3cbe6a99f8d38dcd51a3ee8844c17862841a6f769ea7c2a9cd0f/lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b", size = 8141056 }, { url = "https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18", size = 4425238 }, { url = "https://files.pythonhosted.org/packages/f8/fb/128dddb7f9086236bce0eeae2bfb316d138b49b159f50bc681d56c1bdd19/lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442", size = 5095197 }, @@ -1329,12 +1209,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b6/17/71e9984cf0570cd202ac0a1c9ed5c1b8889b0fc8dc736f5ef0ffb181c284/lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b", size = 5011053 }, { url = "https://files.pythonhosted.org/packages/69/68/9f7e6d3312a91e30829368c2b3217e750adef12a6f8eb10498249f4e8d72/lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957", size = 3485634 }, { url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", size = 3814417 }, - { url = "https://files.pythonhosted.org/packages/99/f7/b73a431c8500565aa500e99e60b448d305eaf7c0b4c893c7c5a8a69cc595/lxml-5.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7b1cd427cb0d5f7393c31b7496419da594fe600e6fdc4b105a54f82405e6626c", size = 3925431 }, - { url = "https://files.pythonhosted.org/packages/db/48/4a206623c0d093d0e3b15f415ffb4345b0bdf661a3d0b15a112948c033c7/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51806cfe0279e06ed8500ce19479d757db42a30fd509940b1701be9c86a5ff9a", size = 4216683 }, - { url = "https://files.pythonhosted.org/packages/54/47/577820c45dd954523ae8453b632d91e76da94ca6d9ee40d8c98dd86f916b/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee70d08fd60c9565ba8190f41a46a54096afa0eeb8f76bd66f2c25d3b1b83005", size = 4326732 }, - { url = "https://files.pythonhosted.org/packages/68/de/96cb6d3269bc994b4f5ede8ca7bf0840f5de0a278bc6e50cb317ff71cafa/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8dc2c0395bea8254d8daebc76dcf8eb3a95ec2a46fa6fae5eaccee366bfe02ce", size = 4218377 }, - { url = "https://files.pythonhosted.org/packages/a5/43/19b1ef6cbffa4244a217f95cc5f41a6cb4720fed33510a49670b03c5f1a0/lxml-5.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6ba0d3dcac281aad8a0e5b14c7ed6f9fa89c8612b47939fc94f80b16e2e9bc83", size = 4351237 }, - { url = "https://files.pythonhosted.org/packages/ba/b2/6a22fb5c0885da3b00e116aee81f0b829ec9ac8f736cd414b4a09413fc7d/lxml-5.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:6e91cf736959057f7aac7adfc83481e03615a8e8dd5758aa1d95ea69e8931dba", size = 3487557 }, ] [[package]] @@ -1355,16 +1229,6 @@ version = "3.0.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/90/d08277ce111dd22f77149fd1a5d4653eeb3b3eaacbdfcbae5afb2600eebd/MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", size = 14357 }, - { url = "https://files.pythonhosted.org/packages/04/e1/6e2194baeae0bca1fae6629dc0cbbb968d4d941469cbab11a3872edff374/MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", size = 12393 }, - { url = "https://files.pythonhosted.org/packages/1d/69/35fa85a8ece0a437493dc61ce0bb6d459dcba482c34197e3efc829aa357f/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", size = 21732 }, - { url = "https://files.pythonhosted.org/packages/22/35/137da042dfb4720b638d2937c38a9c2df83fe32d20e8c8f3185dbfef05f7/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", size = 20866 }, - { url = "https://files.pythonhosted.org/packages/29/28/6d029a903727a1b62edb51863232152fd335d602def598dade38996887f0/MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", size = 20964 }, - { url = "https://files.pythonhosted.org/packages/cc/cd/07438f95f83e8bc028279909d9c9bd39e24149b0d60053a97b2bc4f8aa51/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", size = 21977 }, - { url = "https://files.pythonhosted.org/packages/29/01/84b57395b4cc062f9c4c55ce0df7d3108ca32397299d9df00fedd9117d3d/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", size = 21366 }, - { url = "https://files.pythonhosted.org/packages/bd/6e/61ebf08d8940553afff20d1fb1ba7294b6f8d279df9fd0c0db911b4bbcfd/MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", size = 21091 }, - { url = "https://files.pythonhosted.org/packages/11/23/ffbf53694e8c94ebd1e7e491de185124277964344733c45481f32ede2499/MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50", size = 15065 }, - { url = "https://files.pythonhosted.org/packages/44/06/e7175d06dd6e9172d4a69a72592cb3f7a996a9c396eee29082826449bbc3/MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", size = 15514 }, { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, @@ -1424,12 +1288,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/38/4f/8487737a74d8be4ab5fbe6019b0fae305c1604cf7209500969b879b5f462/matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea", size = 35934425 } wheels = [ - { url = "https://files.pythonhosted.org/packages/67/c0/1f88491656d21a2fecd90fbfae999b2f87bc44d439ef301ec8e0e4a937a0/matplotlib-3.8.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014", size = 7603557 }, - { url = "https://files.pythonhosted.org/packages/86/9c/aa059a4fb8154d5875a5ddd33f8d0a42d77c0225fe4325e9b9358f39b0bf/matplotlib-3.8.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106", size = 7497421 }, - { url = "https://files.pythonhosted.org/packages/0b/67/ded5217d42de1532193cd87db925c67997d23c68b20c3eaa9e4c6a0adb67/matplotlib-3.8.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10", size = 11377985 }, - { url = "https://files.pythonhosted.org/packages/d6/07/061f97211f942101070a46fecd813a6b1bd83590ed7b07c473cabd707fe7/matplotlib-3.8.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0", size = 11608003 }, - { url = "https://files.pythonhosted.org/packages/9a/d3/5d0bb1d905e219543fdfd7ab04e9d641a766367c83a5ffbcea60d2b2cf2d/matplotlib-3.8.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef", size = 9535368 }, - { url = "https://files.pythonhosted.org/packages/62/5a/a5108ae3db37f35f8a2be8a57d62da327af239214c9661464ce09ee32d7d/matplotlib-3.8.4-cp310-cp310-win_amd64.whl", hash = "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338", size = 7656037 }, { url = "https://files.pythonhosted.org/packages/36/11/62250ea25780d4b59c2c6044ec161235c47cc05a18d0ec0a05657de75b7d/matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661", size = 7606117 }, { url = "https://files.pythonhosted.org/packages/14/60/12d4f27b859a74359306662da69c2d08826a2b05cfe7f96e66b490f41573/matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c", size = 7500108 }, { url = "https://files.pythonhosted.org/packages/4e/ba/9e4f7f34dccf2d2768504410410db8d551c940457a2bec658dc4fa3b5aa2/matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa", size = 11382998 }, @@ -1481,9 +1339,6 @@ wheels = [ name = "mistune" version = "3.1.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] sdist = { url = "https://files.pythonhosted.org/packages/79/6e/96fc7cb3288666c5de2c396eb0e338dc95f7a8e4920e43e38783a22d0084/mistune-3.1.0.tar.gz", hash = "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667", size = 94401 } wheels = [ { url = "https://files.pythonhosted.org/packages/b4/b3/743ffc3f59da380da504d84ccd1faf9a857a1445991ff19bf2ec754163c2/mistune-3.1.0-py3-none-any.whl", hash = "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1", size = 53694 }, @@ -1495,17 +1350,10 @@ version = "1.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/eb/2c92d8ea1e684440f54fa49ac5d9a5f19967b7b472a281f419e69a8d228e/mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", size = 3216051 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/7a/87ae2adb31d68402da6da1e5f30c07ea6063e9f09b5e7cfc9dfa44075e74/mypy-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52686e37cf13d559f668aa398dd7ddf1f92c5d613e4f8cb262be2fb4fedb0fcb", size = 11211002 }, - { url = "https://files.pythonhosted.org/packages/e1/23/eada4c38608b444618a132be0d199b280049ded278b24cbb9d3fc59658e4/mypy-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1fb545ca340537d4b45d3eecdb3def05e913299ca72c290326be19b3804b39c0", size = 10358400 }, - { url = "https://files.pythonhosted.org/packages/43/c9/d6785c6f66241c62fd2992b05057f404237deaad1566545e9f144ced07f5/mypy-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:90716d8b2d1f4cd503309788e51366f07c56635a3309b0f6a32547eaaa36a64d", size = 12095172 }, - { url = "https://files.pythonhosted.org/packages/c3/62/daa7e787770c83c52ce2aaf1a111eae5893de9e004743f51bfcad9e487ec/mypy-1.14.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ae753f5c9fef278bcf12e1a564351764f2a6da579d4a81347e1d5a15819997b", size = 12828732 }, - { url = "https://files.pythonhosted.org/packages/1b/a2/5fb18318a3637f29f16f4e41340b795da14f4751ef4f51c99ff39ab62e52/mypy-1.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0fe0f5feaafcb04505bcf439e991c6d8f1bf8b15f12b05feeed96e9e7bf1427", size = 13012197 }, - { url = "https://files.pythonhosted.org/packages/28/99/e153ce39105d164b5f02c06c35c7ba958aaff50a2babba7d080988b03fe7/mypy-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d54bd85b925e501c555a3227f3ec0cfc54ee8b6930bd6141ec872d1c572f81f", size = 9780836 }, { url = "https://files.pythonhosted.org/packages/da/11/a9422850fd506edbcdc7f6090682ecceaf1f87b9dd847f9df79942da8506/mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c", size = 11120432 }, { url = "https://files.pythonhosted.org/packages/b6/9e/47e450fd39078d9c02d620545b2cb37993a8a8bdf7db3652ace2f80521ca/mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1", size = 10279515 }, { url = "https://files.pythonhosted.org/packages/01/b5/6c8d33bd0f851a7692a8bfe4ee75eb82b6983a3cf39e5e32a5d2a723f0c1/mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8", size = 12025791 }, @@ -1660,14 +1508,6 @@ version = "1.26.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/94/ace0fdea5241a27d13543ee117cbc65868e82213fb31a8eb7fe9ff23f313/numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", size = 20631468 }, - { url = "https://files.pythonhosted.org/packages/20/f7/b24208eba89f9d1b58c1668bc6c8c4fd472b20c45573cb767f59d49fb0f6/numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", size = 13966411 }, - { url = "https://files.pythonhosted.org/packages/fc/a5/4beee6488160798683eed5bdb7eead455892c3b4e1f78d79d8d3f3b084ac/numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", size = 14219016 }, - { url = "https://files.pythonhosted.org/packages/4b/d7/ecf66c1cd12dc28b4040b15ab4d17b773b87fa9d29ca16125de01adb36cd/numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f", size = 18240889 }, - { url = "https://files.pythonhosted.org/packages/24/03/6f229fe3187546435c4f6f89f6d26c129d4f5bed40552899fcf1f0bf9e50/numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", size = 13876746 }, - { url = "https://files.pythonhosted.org/packages/39/fe/39ada9b094f01f5a35486577c848fe274e374bbf8d8f472e1423a0bbd26d/numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", size = 18078620 }, - { url = "https://files.pythonhosted.org/packages/d5/ef/6ad11d51197aad206a9ad2286dc1aac6a378059e06e8cf22cd08ed4f20dc/numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", size = 5972659 }, - { url = "https://files.pythonhosted.org/packages/19/77/538f202862b9183f54108557bfda67e17603fc560c384559e769321c9d92/numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", size = 15808905 }, { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554 }, { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127 }, { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994 }, @@ -1753,17 +1593,6 @@ version = "11.1.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/1c/2dcea34ac3d7bc96a1fd1bd0a6e06a57c67167fec2cff8d95d88229a8817/pillow-11.1.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:e1abe69aca89514737465752b4bcaf8016de61b3be1397a8fc260ba33321b3a8", size = 3229983 }, - { url = "https://files.pythonhosted.org/packages/14/ca/6bec3df25e4c88432681de94a3531cc738bd85dea6c7aa6ab6f81ad8bd11/pillow-11.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c640e5a06869c75994624551f45e5506e4256562ead981cce820d5ab39ae2192", size = 3101831 }, - { url = "https://files.pythonhosted.org/packages/d4/2c/668e18e5521e46eb9667b09e501d8e07049eb5bfe39d56be0724a43117e6/pillow-11.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a07dba04c5e22824816b2615ad7a7484432d7f540e6fa86af60d2de57b0fcee2", size = 4314074 }, - { url = "https://files.pythonhosted.org/packages/02/80/79f99b714f0fc25f6a8499ecfd1f810df12aec170ea1e32a4f75746051ce/pillow-11.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e267b0ed063341f3e60acd25c05200df4193e15a4a5807075cd71225a2386e26", size = 4394933 }, - { url = "https://files.pythonhosted.org/packages/81/aa/8d4ad25dc11fd10a2001d5b8a80fdc0e564ac33b293bdfe04ed387e0fd95/pillow-11.1.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:bd165131fd51697e22421d0e467997ad31621b74bfc0b75956608cb2906dda07", size = 4353349 }, - { url = "https://files.pythonhosted.org/packages/84/7a/cd0c3eaf4a28cb2a74bdd19129f7726277a7f30c4f8424cd27a62987d864/pillow-11.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:abc56501c3fd148d60659aae0af6ddc149660469082859fa7b066a298bde9482", size = 4476532 }, - { url = "https://files.pythonhosted.org/packages/8f/8b/a907fdd3ae8f01c7670dfb1499c53c28e217c338b47a813af8d815e7ce97/pillow-11.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:54ce1c9a16a9561b6d6d8cb30089ab1e5eb66918cb47d457bd996ef34182922e", size = 4279789 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/9f139d9e8cccd661c3efbf6898967a9a337eb2e9be2b454ba0a09533100d/pillow-11.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73ddde795ee9b06257dac5ad42fcb07f3b9b813f8c1f7f870f402f4dc54b5269", size = 4413131 }, - { url = "https://files.pythonhosted.org/packages/a8/68/0d8d461f42a3f37432203c8e6df94da10ac8081b6d35af1c203bf3111088/pillow-11.1.0-cp310-cp310-win32.whl", hash = "sha256:3a5fe20a7b66e8135d7fd617b13272626a28278d0e578c98720d9ba4b2439d49", size = 2291213 }, - { url = "https://files.pythonhosted.org/packages/14/81/d0dff759a74ba87715509af9f6cb21fa21d93b02b3316ed43bda83664db9/pillow-11.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:b6123aa4a59d75f06e9dd3dac5bf8bc9aa383121bb3dd9a7a612e05eabc9961a", size = 2625725 }, - { url = "https://files.pythonhosted.org/packages/ce/1f/8d50c096a1d58ef0584ddc37e6f602828515219e9d2428e14ce50f5ecad1/pillow-11.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:a76da0a31da6fcae4210aa94fd779c65c75786bc9af06289cd1c184451ef7a65", size = 2375213 }, { url = "https://files.pythonhosted.org/packages/dd/d6/2000bfd8d5414fb70cbbe52c8332f2283ff30ed66a9cde42716c8ecbe22c/pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457", size = 3229968 }, { url = "https://files.pythonhosted.org/packages/d9/45/3fe487010dd9ce0a06adf9b8ff4f273cc0a44536e234b0fad3532a42c15b/pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35", size = 3101806 }, { url = "https://files.pythonhosted.org/packages/e3/72/776b3629c47d9d5f1c160113158a7a7ad177688d3a1159cd3b62ded5a33a/pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2", size = 4322283 }, @@ -1805,13 +1634,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 }, { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 }, { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 }, - { url = "https://files.pythonhosted.org/packages/fa/c5/389961578fb677b8b3244fcd934f720ed25a148b9a5cc81c91bdf59d8588/pillow-11.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c730dc3a83e5ac137fbc92dfcfe1511ce3b2b5d7578315b63dbbb76f7f51d90", size = 3198345 }, - { url = "https://files.pythonhosted.org/packages/c4/fa/803c0e50ffee74d4b965229e816af55276eac1d5806712de86f9371858fd/pillow-11.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:7d33d2fae0e8b170b6a6c57400e077412240f6f5bb2a342cf1ee512a787942bb", size = 3072938 }, - { url = "https://files.pythonhosted.org/packages/dc/67/2a3a5f8012b5d8c63fe53958ba906c1b1d0482ebed5618057ef4d22f8076/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8d65b38173085f24bc07f8b6c505cbb7418009fa1a1fcb111b1f4961814a442", size = 3400049 }, - { url = "https://files.pythonhosted.org/packages/e5/a0/514f0d317446c98c478d1872497eb92e7cde67003fed74f696441e647446/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:015c6e863faa4779251436db398ae75051469f7c903b043a48f078e437656f83", size = 3422431 }, - { url = "https://files.pythonhosted.org/packages/cd/00/20f40a935514037b7d3f87adfc87d2c538430ea625b63b3af8c3f5578e72/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d44ff19eea13ae4acdaaab0179fa68c0c6f2f45d66a4d8ec1eda7d6cecbcc15f", size = 3446208 }, - { url = "https://files.pythonhosted.org/packages/28/3c/7de681727963043e093c72e6c3348411b0185eab3263100d4490234ba2f6/pillow-11.1.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3d8da4a631471dfaf94c10c85f5277b1f8e42ac42bade1ac67da4b4a7359b73", size = 3509746 }, - { url = "https://files.pythonhosted.org/packages/41/67/936f9814bdd74b2dfd4822f1f7725ab5d8ff4103919a1664eb4874c58b2f/pillow-11.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4637b88343166249fe8aa94e7c4a62a180c4b3898283bb5d3d2fd5fe10d8e4e0", size = 2626353 }, ] [[package]] @@ -1934,19 +1756,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/bc/fed5f74b5d802cf9a03e83f60f18864e90e3aed7223adaca5ffb7a8d8d64/pydantic_core-2.27.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", size = 1895938 }, - { url = "https://files.pythonhosted.org/packages/71/2a/185aff24ce844e39abb8dd680f4e959f0006944f4a8a0ea372d9f9ae2e53/pydantic_core-2.27.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", size = 1815684 }, - { url = "https://files.pythonhosted.org/packages/c3/43/fafabd3d94d159d4f1ed62e383e264f146a17dd4d48453319fd782e7979e/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", size = 1829169 }, - { url = "https://files.pythonhosted.org/packages/a2/d1/f2dfe1a2a637ce6800b799aa086d079998959f6f1215eb4497966efd2274/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", size = 1867227 }, - { url = "https://files.pythonhosted.org/packages/7d/39/e06fcbcc1c785daa3160ccf6c1c38fea31f5754b756e34b65f74e99780b5/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", size = 2037695 }, - { url = "https://files.pythonhosted.org/packages/7a/67/61291ee98e07f0650eb756d44998214231f50751ba7e13f4f325d95249ab/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", size = 2741662 }, - { url = "https://files.pythonhosted.org/packages/32/90/3b15e31b88ca39e9e626630b4c4a1f5a0dfd09076366f4219429e6786076/pydantic_core-2.27.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", size = 1993370 }, - { url = "https://files.pythonhosted.org/packages/ff/83/c06d333ee3a67e2e13e07794995c1535565132940715931c1c43bfc85b11/pydantic_core-2.27.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", size = 1996813 }, - { url = "https://files.pythonhosted.org/packages/7c/f7/89be1c8deb6e22618a74f0ca0d933fdcb8baa254753b26b25ad3acff8f74/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", size = 2005287 }, - { url = "https://files.pythonhosted.org/packages/b7/7d/8eb3e23206c00ef7feee17b83a4ffa0a623eb1a9d382e56e4aa46fd15ff2/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", size = 2128414 }, - { url = "https://files.pythonhosted.org/packages/4e/99/fe80f3ff8dd71a3ea15763878d464476e6cb0a2db95ff1c5c554133b6b83/pydantic_core-2.27.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", size = 2155301 }, - { url = "https://files.pythonhosted.org/packages/2b/a3/e50460b9a5789ca1451b70d4f52546fa9e2b420ba3bfa6100105c0559238/pydantic_core-2.27.2-cp310-cp310-win32.whl", hash = "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", size = 1816685 }, - { url = "https://files.pythonhosted.org/packages/57/4c/a8838731cb0f2c2a39d3535376466de6049034d7b239c0202a64aaa05533/pydantic_core-2.27.2-cp310-cp310-win_amd64.whl", hash = "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", size = 1982876 }, { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, @@ -1989,15 +1798,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, - { url = "https://files.pythonhosted.org/packages/46/72/af70981a341500419e67d5cb45abe552a7c74b66326ac8877588488da1ac/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", size = 1891159 }, - { url = "https://files.pythonhosted.org/packages/ad/3d/c5913cccdef93e0a6a95c2d057d2c2cba347815c845cda79ddd3c0f5e17d/pydantic_core-2.27.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", size = 1768331 }, - { url = "https://files.pythonhosted.org/packages/f6/f0/a3ae8fbee269e4934f14e2e0e00928f9346c5943174f2811193113e58252/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", size = 1822467 }, - { url = "https://files.pythonhosted.org/packages/d7/7a/7bbf241a04e9f9ea24cd5874354a83526d639b02674648af3f350554276c/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", size = 1979797 }, - { url = "https://files.pythonhosted.org/packages/4f/5f/4784c6107731f89e0005a92ecb8a2efeafdb55eb992b8e9d0a2be5199335/pydantic_core-2.27.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", size = 1987839 }, - { url = "https://files.pythonhosted.org/packages/6d/a7/61246562b651dff00de86a5f01b6e4befb518df314c54dec187a78d81c84/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", size = 1998861 }, - { url = "https://files.pythonhosted.org/packages/86/aa/837821ecf0c022bbb74ca132e117c358321e72e7f9702d1b6a03758545e2/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", size = 2116582 }, - { url = "https://files.pythonhosted.org/packages/81/b0/5e74656e95623cbaa0a6278d16cf15e10a51f6002e3ec126541e95c29ea3/pydantic_core-2.27.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", size = 2151985 }, - { url = "https://files.pythonhosted.org/packages/63/37/3e32eeb2a451fddaa3898e2163746b0cffbbdbb4740d38372db0490d67f3/pydantic_core-2.27.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", size = 2004715 }, ] [[package]] @@ -2027,12 +1827,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/7d/84/2b39bbf888c753ea48b40d47511548c77aa03445465c35cc4c4e9649b643/pyproj-3.6.1.tar.gz", hash = "sha256:44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf", size = 225131 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/32/63cf474f4a8d4804b3bdf7c16b8589f38142e8e2f8319dcea27e0bc21a87/pyproj-3.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab7aa4d9ff3c3acf60d4b285ccec134167a948df02347585fdd934ebad8811b4", size = 6142763 }, - { url = "https://files.pythonhosted.org/packages/18/86/2e7cb9de40492f1bafbf11f4c9072edc394509a40b5e4c52f8139546f039/pyproj-3.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4bc0472302919e59114aa140fd7213c2370d848a7249d09704f10f5b062031fe", size = 4877123 }, - { url = "https://files.pythonhosted.org/packages/5e/c5/928d5a26995dbefbebd7507d982141cd9153bc7e4392b334fff722c4af12/pyproj-3.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5279586013b8d6582e22b6f9e30c49796966770389a9d5b85e25a4223286cd3f", size = 6190576 }, - { url = "https://files.pythonhosted.org/packages/f6/2b/b60cf73b0720abca313bfffef34e34f7f7dae23852b2853cf0368d49426b/pyproj-3.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80fafd1f3eb421694857f254a9bdbacd1eb22fc6c24ca74b136679f376f97d35", size = 8328075 }, - { url = "https://files.pythonhosted.org/packages/d9/a8/7193f46032636be917bc775506ae987aad72c931b1f691b775ca812a2917/pyproj-3.6.1-cp310-cp310-win32.whl", hash = "sha256:c41e80ddee130450dcb8829af7118f1ab69eaf8169c4bf0ee8d52b72f098dc2f", size = 5635713 }, - { url = "https://files.pythonhosted.org/packages/89/8f/27350c8fba71a37cd0d316f100fbd96bf139cc2b5ff1ab0dcbc7ac64010a/pyproj-3.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:db3aedd458e7f7f21d8176f0a1d924f1ae06d725228302b872885a1c34f3119e", size = 6087932 }, { url = "https://files.pythonhosted.org/packages/84/a6/a300c1b14b2112e966e9f90b18f9c13b586bdcf417207cee913ae9005da3/pyproj-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ebfbdbd0936e178091309f6cd4fcb4decd9eab12aa513cdd9add89efa3ec2882", size = 6147442 }, { url = "https://files.pythonhosted.org/packages/30/bd/b9bd3761f08754e8dbb34c5a647db2099b348ab5da338e90980caf280e37/pyproj-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:447db19c7efad70ff161e5e46a54ab9cc2399acebb656b6ccf63e4bc4a04b97a", size = 4880331 }, { url = "https://files.pythonhosted.org/packages/f4/0a/d82aeeb605b5d6870bc72307c3b5e044e632eb7720df8885e144f51a8eac/pyproj-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7e13c40183884ec7f94eb8e0f622f08f1d5716150b8d7a134de48c6110fee85", size = 6192425 }, @@ -2075,11 +1869,9 @@ version = "8.3.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } wheels = [ @@ -2125,9 +1917,6 @@ name = "pywin32" version = "308" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/a6/3e9f2c474895c1bb61b11fa9640be00067b5c5b363c501ee9c3fa53aec01/pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e", size = 5927028 }, - { url = "https://files.pythonhosted.org/packages/d9/b4/84e2463422f869b4b718f79eb7530a4c1693e96b8a4e5e968de38be4d2ba/pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e", size = 6558484 }, - { url = "https://files.pythonhosted.org/packages/9f/8f/fb84ab789713f7c6feacaa08dad3ec8105b88ade8d1c4f0f0dfcaaa017d6/pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c", size = 7971454 }, { url = "https://files.pythonhosted.org/packages/eb/e2/02652007469263fe1466e98439831d65d4ca80ea1a2df29abecedf7e47b7/pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a", size = 5928156 }, { url = "https://files.pythonhosted.org/packages/48/ef/f4fb45e2196bc7ffe09cad0542d9aff66b0e33f6c0954b43e49c33cad7bd/pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b", size = 6559559 }, { url = "https://files.pythonhosted.org/packages/79/ef/68bb6aa865c5c9b11a35771329e95917b5559845bd75b65549407f9fc6b4/pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6", size = 7972495 }, @@ -2145,7 +1934,6 @@ version = "2.0.14" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f1/82/90f8750423cba4b9b6c842df227609fb60704482d7abf6dd47e2babc055a/pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e", size = 27769 } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/09/56376af256eab8cc5f8982a3b138d387136eca27fa1a8a68660e8ed59e4b/pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f", size = 1397115 }, { url = "https://files.pythonhosted.org/packages/be/e2/af1a99c0432e4e58c9ac8e334ee191790ec9793d33559189b9d2069bdc1d/pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7", size = 1397223 }, { url = "https://files.pythonhosted.org/packages/ad/79/759ae767a3b78d340446efd54dd1fe4f7dafa4fc7be96ed757e44bcdba54/pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737", size = 1397207 }, { url = "https://files.pythonhosted.org/packages/7d/34/b77b3c209bf2eaa6455390c8d5449241637f5957f41636a2204065d52bfa/pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819", size = 1396698 }, @@ -2157,15 +1945,6 @@ version = "6.0.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/95/a3fac87cb7158e231b5a6012e438c647e1a87f09f8e0d123acec8ab8bf71/PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", size = 184199 }, - { url = "https://files.pythonhosted.org/packages/c7/7a/68bd47624dab8fd4afbfd3c48e3b79efe09098ae941de5b58abcbadff5cb/PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", size = 171758 }, - { url = "https://files.pythonhosted.org/packages/49/ee/14c54df452143b9ee9f0f29074d7ca5516a36edb0b4cc40c3f280131656f/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", size = 718463 }, - { url = "https://files.pythonhosted.org/packages/4d/61/de363a97476e766574650d742205be468921a7b532aa2499fcd886b62530/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", size = 719280 }, - { url = "https://files.pythonhosted.org/packages/6b/4e/1523cb902fd98355e2e9ea5e5eb237cbc5f3ad5f3075fa65087aa0ecb669/PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", size = 751239 }, - { url = "https://files.pythonhosted.org/packages/b7/33/5504b3a9a4464893c32f118a9cc045190a91637b119a9c881da1cf6b7a72/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", size = 695802 }, - { url = "https://files.pythonhosted.org/packages/5c/20/8347dcabd41ef3a3cdc4f7b7a2aff3d06598c8779faa189cdbf878b626a4/PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", size = 720527 }, - { url = "https://files.pythonhosted.org/packages/be/aa/5afe99233fb360d0ff37377145a949ae258aaab831bde4792b32650a4378/PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", size = 144052 }, - { url = "https://files.pythonhosted.org/packages/b5/84/0fa4b06f6d6c958d207620fc60005e241ecedceee58931bb20138e1e5776/PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", size = 161774 }, { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, @@ -2204,18 +1983,6 @@ dependencies = [ ] sdist = { url = "https://files.pythonhosted.org/packages/fd/05/bed626b9f7bb2322cdbbf7b4bd8f54b1b617b0d2ab2d3547d6e39428a48e/pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", size = 271975 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/a8/9837c39aba390eb7d01924ace49d761c8dbe7bc2d6082346d00c8332e431/pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629", size = 1340058 }, - { url = "https://files.pythonhosted.org/packages/a2/1f/a006f2e8e4f7d41d464272012695da17fb95f33b54342612a6890da96ff6/pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b", size = 1008818 }, - { url = "https://files.pythonhosted.org/packages/b6/09/b51b6683fde5ca04593a57bbe81788b6b43114d8f8ee4e80afc991e14760/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764", size = 673199 }, - { url = "https://files.pythonhosted.org/packages/c9/78/486f3e2e824f3a645238332bf5a4c4b4477c3063033a27c1e4052358dee2/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c", size = 911762 }, - { url = "https://files.pythonhosted.org/packages/5e/3b/2eb1667c9b866f53e76ee8b0c301b0469745a23bd5a87b7ee3d5dd9eb6e5/pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a", size = 868773 }, - { url = "https://files.pythonhosted.org/packages/16/29/ca99b4598a9dc7e468b5417eda91f372b595be1e3eec9b7cbe8e5d3584e8/pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88", size = 868834 }, - { url = "https://files.pythonhosted.org/packages/ad/e5/9efaeb1d2f4f8c50da04144f639b042bc52869d3a206d6bf672ab3522163/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f", size = 1202861 }, - { url = "https://files.pythonhosted.org/packages/c3/62/c721b5608a8ac0a69bb83cbb7d07a56f3ff00b3991a138e44198a16f94c7/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282", size = 1515304 }, - { url = "https://files.pythonhosted.org/packages/87/84/e8bd321aa99b72f48d4606fc5a0a920154125bd0a4608c67eab742dab087/pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea", size = 1414712 }, - { url = "https://files.pythonhosted.org/packages/cd/cd/420e3fd1ac6977b008b72e7ad2dae6350cc84d4c5027fc390b024e61738f/pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2", size = 578113 }, - { url = "https://files.pythonhosted.org/packages/5c/57/73930d56ed45ae0cb4946f383f985c855c9b3d4063f26416998f07523c0e/pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971", size = 641631 }, - { url = "https://files.pythonhosted.org/packages/61/d2/ae6ac5c397f1ccad59031c64beaafce7a0d6182e0452cc48f1c9c87d2dd0/pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa", size = 543528 }, { url = "https://files.pythonhosted.org/packages/12/20/de7442172f77f7c96299a0ac70e7d4fb78cd51eca67aa2cf552b66c14196/pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218", size = 1340639 }, { url = "https://files.pythonhosted.org/packages/98/4d/5000468bd64c7910190ed0a6c76a1ca59a68189ec1f007c451dc181a22f4/pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4", size = 1008710 }, { url = "https://files.pythonhosted.org/packages/e1/bf/c67fd638c2f9fbbab8090a3ee779370b97c82b84cc12d0c498b285d7b2c0/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef", size = 673129 }, @@ -2261,11 +2028,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dd/9a/10ed3c7f72b4c24e719c59359fbadd1a27556a28b36cdf1cd9e4fb7845d5/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", size = 1183489 }, { url = "https://files.pythonhosted.org/packages/72/2d/8660892543fabf1fe41861efa222455811adac9f3c0818d6c3170a1153e3/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", size = 1492932 }, { url = "https://files.pythonhosted.org/packages/7b/d6/32fd69744afb53995619bc5effa2a405ae0d343cd3e747d0fbc43fe894ee/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", size = 1392485 }, - { url = "https://files.pythonhosted.org/packages/53/fb/36b2b2548286e9444e52fcd198760af99fd89102b5be50f0660fcfe902df/pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072", size = 906955 }, - { url = "https://files.pythonhosted.org/packages/77/8f/6ce54f8979a01656e894946db6299e2273fcee21c8e5fa57c6295ef11f57/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1", size = 565701 }, - { url = "https://files.pythonhosted.org/packages/ee/1c/bf8cd66730a866b16db8483286078892b7f6536f8c389fb46e4beba0a970/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d", size = 794312 }, - { url = "https://files.pythonhosted.org/packages/71/43/91fa4ff25bbfdc914ab6bafa0f03241d69370ef31a761d16bb859f346582/pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca", size = 752775 }, - { url = "https://files.pythonhosted.org/packages/ec/d2/3b2ab40f455a256cb6672186bea95cd97b459ce4594050132d71e76f0d6f/pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c", size = 550762 }, ] [[package]] @@ -2323,19 +2085,6 @@ version = "0.22.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/01/80/cce854d0921ff2f0a9fa831ba3ad3c65cee3a46711addf39a2af52df2cfd/rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", size = 26771 } wheels = [ - { url = "https://files.pythonhosted.org/packages/42/2a/ead1d09e57449b99dcc190d8d2323e3a167421d8f8fdf0f217c6f6befe47/rpds_py-0.22.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967", size = 359514 }, - { url = "https://files.pythonhosted.org/packages/8f/7e/1254f406b7793b586c68e217a6a24ec79040f85e030fff7e9049069284f4/rpds_py-0.22.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37", size = 349031 }, - { url = "https://files.pythonhosted.org/packages/aa/da/17c6a2c73730d426df53675ff9cc6653ac7a60b6438d03c18e1c822a576a/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24", size = 381485 }, - { url = "https://files.pythonhosted.org/packages/aa/13/2dbacd820466aa2a3c4b747afb18d71209523d353cf865bf8f4796c969ea/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff", size = 386794 }, - { url = "https://files.pythonhosted.org/packages/6d/62/96905d0a35ad4e4bc3c098b2f34b2e7266e211d08635baa690643d2227be/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c", size = 423523 }, - { url = "https://files.pythonhosted.org/packages/eb/1b/d12770f2b6a9fc2c3ec0d810d7d440f6d465ccd8b7f16ae5385952c28b89/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e", size = 446695 }, - { url = "https://files.pythonhosted.org/packages/4d/cf/96f1fd75512a017f8e07408b6d5dbeb492d9ed46bfe0555544294f3681b3/rpds_py-0.22.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec", size = 381959 }, - { url = "https://files.pythonhosted.org/packages/ab/f0/d1c5b501c8aea85aeb938b555bfdf7612110a2f8cdc21ae0482c93dd0c24/rpds_py-0.22.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c", size = 410420 }, - { url = "https://files.pythonhosted.org/packages/33/3b/45b6c58fb6aad5a569ae40fb890fc494c6b02203505a5008ee6dc68e65f7/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09", size = 557620 }, - { url = "https://files.pythonhosted.org/packages/83/62/3fdd2d3d47bf0bb9b931c4c73036b4ab3ec77b25e016ae26fab0f02be2af/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00", size = 584202 }, - { url = "https://files.pythonhosted.org/packages/04/f2/5dced98b64874b84ca824292f9cee2e3f30f3bcf231d15a903126684f74d/rpds_py-0.22.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf", size = 552787 }, - { url = "https://files.pythonhosted.org/packages/67/13/2273dea1204eda0aea0ef55145da96a9aa28b3f88bb5c70e994f69eda7c3/rpds_py-0.22.3-cp310-cp310-win32.whl", hash = "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652", size = 220088 }, - { url = "https://files.pythonhosted.org/packages/4e/80/8c8176b67ad7f4a894967a7a4014ba039626d96f1d4874d53e409b58d69f/rpds_py-0.22.3-cp310-cp310-win_amd64.whl", hash = "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8", size = 231737 }, { url = "https://files.pythonhosted.org/packages/15/ad/8d1ddf78f2805a71253fcd388017e7b4a0615c22c762b6d35301fef20106/rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", size = 359773 }, { url = "https://files.pythonhosted.org/packages/c8/75/68c15732293a8485d79fe4ebe9045525502a067865fa4278f178851b2d87/rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", size = 349214 }, { url = "https://files.pythonhosted.org/packages/3c/4c/7ce50f3070083c2e1b2bbd0fb7046f3da55f510d19e283222f8f33d7d5f4/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", size = 380477 }, @@ -2388,18 +2137,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/30/89/35fc7a6cdf3477d441c7aca5e9bbf5a14e0f25152aed7f63f4e0b141045d/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", size = 553855 }, { url = "https://files.pythonhosted.org/packages/8f/e0/830c02b2457c4bd20a8c5bb394d31d81f57fbefce2dbdd2e31feff4f7003/rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", size = 219100 }, { url = "https://files.pythonhosted.org/packages/f8/30/7ac943f69855c2db77407ae363484b915d861702dbba1aa82d68d57f42be/rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", size = 233794 }, - { url = "https://files.pythonhosted.org/packages/8b/63/e29f8ee14fcf383574f73b6bbdcbec0fbc2e5fc36b4de44d1ac389b1de62/rpds_py-0.22.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d", size = 360786 }, - { url = "https://files.pythonhosted.org/packages/d3/e0/771ee28b02a24e81c8c0e645796a371350a2bb6672753144f36ae2d2afc9/rpds_py-0.22.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd", size = 350589 }, - { url = "https://files.pythonhosted.org/packages/cf/49/abad4c4a1e6f3adf04785a99c247bfabe55ed868133e2d1881200aa5d381/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493", size = 381848 }, - { url = "https://files.pythonhosted.org/packages/3a/7d/f4bc6d6fbe6af7a0d2b5f2ee77079efef7c8528712745659ec0026888998/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96", size = 387879 }, - { url = "https://files.pythonhosted.org/packages/13/b0/575c797377fdcd26cedbb00a3324232e4cb2c5d121f6e4b0dbf8468b12ef/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123", size = 423916 }, - { url = "https://files.pythonhosted.org/packages/54/78/87157fa39d58f32a68d3326f8a81ad8fb99f49fe2aa7ad9a1b7d544f9478/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad", size = 448410 }, - { url = "https://files.pythonhosted.org/packages/59/69/860f89996065a88be1b6ff2d60e96a02b920a262d8aadab99e7903986597/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9", size = 382841 }, - { url = "https://files.pythonhosted.org/packages/bd/d7/bc144e10d27e3cb350f98df2492a319edd3caaf52ddfe1293f37a9afbfd7/rpds_py-0.22.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e", size = 409662 }, - { url = "https://files.pythonhosted.org/packages/14/2a/6bed0b05233c291a94c7e89bc76ffa1c619d4e1979fbfe5d96024020c1fb/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338", size = 558221 }, - { url = "https://files.pythonhosted.org/packages/11/23/cd8f566de444a137bc1ee5795e47069a947e60810ba4152886fe5308e1b7/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566", size = 583780 }, - { url = "https://files.pythonhosted.org/packages/8d/63/79c3602afd14d501f751e615a74a59040328da5ef29ed5754ae80d236b84/rpds_py-0.22.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe", size = 553619 }, - { url = "https://files.pythonhosted.org/packages/9f/2e/c5c1689e80298d4e94c75b70faada4c25445739d91b94c211244a3ed7ed1/rpds_py-0.22.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d", size = 233338 }, ] [[package]] @@ -2512,7 +2249,6 @@ dependencies = [ { name = "sphinxcontrib-jsmath" }, { name = "sphinxcontrib-qthelp" }, { name = "sphinxcontrib-serializinghtml" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611 } wheels = [ @@ -2555,6 +2291,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, ] +[[package]] +name = "sphinx-click" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "docutils" }, + { name = "sphinx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/0a/5b1e8d0579dbb4ca8114e456ca4a68020bfe8e15c7001f3856be4929ab83/sphinx_click-6.0.0.tar.gz", hash = "sha256:f5d664321dc0c6622ff019f1e1c84e58ce0cecfddeb510e004cf60c2a3ab465b", size = 29574 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d0/d7/8621c4726ad3f788a1db4c0c409044b16edc563f5c9542807b3724037555/sphinx_click-6.0.0-py3-none-any.whl", hash = "sha256:1e0a3c83bcb7c55497751b19d07ebe56b5d7b85eb76dd399cf9061b497adc317", size = 9922 }, +] + [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" @@ -2752,6 +2502,7 @@ dev = [ { name = "sphinx" }, { name = "sphinx-argparse-cli" }, { name = "sphinx-autodoc-typehints" }, + { name = "sphinx-click" }, { name = "sphinxcontrib-mermaid" }, ] @@ -2785,6 +2536,7 @@ dev = [ { name = "sphinx", specifier = ">=8.1" }, { name = "sphinx-argparse-cli", specifier = ">=1.19" }, { name = "sphinx-autodoc-typehints", specifier = ">=2.5" }, + { name = "sphinx-click", specifier = ">=6.0.0" }, { name = "sphinxcontrib-mermaid", specifier = ">=1.0.0" }, ] From 7aa6f9ff54b2880e117b7061840f3ed86737118b Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Thu, 16 Jan 2025 15:32:07 +0100 Subject: [PATCH 11/23] #43 Working on documentation --- .../trafficgen.check_land_crossing.rst | 13 ++++++++++ .../_autosummary/trafficgen.encounter.rst | 26 +++++++++++++++++++ .../trafficgen.marine_system_simulator.rst | 15 +++++++++++ .../trafficgen.plot_traffic_situation.rst | 19 ++++++++++++++ docs/source/_autosummary/trafficgen.utils.rst | 26 +++++++++++++++++++ ...ficgen.write_traffic_situation_to_file.rst | 15 +++++++++++ docs/source/conf.py | 4 +-- docs/source/index.rst | 7 ++--- docs/source/trafficgen.rst | 16 +++++------- 9 files changed, 126 insertions(+), 15 deletions(-) create mode 100644 docs/source/_autosummary/trafficgen.check_land_crossing.rst create mode 100644 docs/source/_autosummary/trafficgen.encounter.rst create mode 100644 docs/source/_autosummary/trafficgen.marine_system_simulator.rst create mode 100644 docs/source/_autosummary/trafficgen.plot_traffic_situation.rst create mode 100644 docs/source/_autosummary/trafficgen.utils.rst create mode 100644 docs/source/_autosummary/trafficgen.write_traffic_situation_to_file.rst diff --git a/docs/source/_autosummary/trafficgen.check_land_crossing.rst b/docs/source/_autosummary/trafficgen.check_land_crossing.rst new file mode 100644 index 0000000..19b8c99 --- /dev/null +++ b/docs/source/_autosummary/trafficgen.check_land_crossing.rst @@ -0,0 +1,13 @@ +trafficgen.check\_land\_crossing +================================ + +.. automodule:: trafficgen.check_land_crossing + :members: + + + + .. rubric:: Functions + .. autosummary:: + + path_crosses_land + \ No newline at end of file diff --git a/docs/source/_autosummary/trafficgen.encounter.rst b/docs/source/_autosummary/trafficgen.encounter.rst new file mode 100644 index 0000000..7ab14ef --- /dev/null +++ b/docs/source/_autosummary/trafficgen.encounter.rst @@ -0,0 +1,26 @@ +trafficgen.encounter +==================== + +.. automodule:: trafficgen.encounter + :members: + + + + .. rubric:: Functions + .. autosummary:: + + assign_beta + assign_beta_from_list + assign_future_position_to_target_ship + assign_sog_to_target_ship + assign_vector_time + calculate_min_vector_length_target_ship + calculate_relative_bearing + calculate_ship_cog + check_encounter_evolvement + decide_target_ship + define_own_ship + determine_colreg + find_start_position_target_ship + generate_encounter + \ No newline at end of file diff --git a/docs/source/_autosummary/trafficgen.marine_system_simulator.rst b/docs/source/_autosummary/trafficgen.marine_system_simulator.rst new file mode 100644 index 0000000..2cc4f23 --- /dev/null +++ b/docs/source/_autosummary/trafficgen.marine_system_simulator.rst @@ -0,0 +1,15 @@ +trafficgen.marine\_system\_simulator +==================================== + +.. automodule:: trafficgen.marine_system_simulator + :members: + + + + .. rubric:: Functions + .. autosummary:: + + flat2llh + llh2flat + ssa + \ No newline at end of file diff --git a/docs/source/_autosummary/trafficgen.plot_traffic_situation.rst b/docs/source/_autosummary/trafficgen.plot_traffic_situation.rst new file mode 100644 index 0000000..c022e45 --- /dev/null +++ b/docs/source/_autosummary/trafficgen.plot_traffic_situation.rst @@ -0,0 +1,19 @@ +trafficgen.plot\_traffic\_situation +=================================== + +.. automodule:: trafficgen.plot_traffic_situation + :members: + + + + .. rubric:: Functions + .. autosummary:: + + add_ship_to_map + add_ship_to_plot + calculate_ship_outline + calculate_vector_arrow + find_max_value_for_plot + plot_specific_traffic_situation + plot_traffic_situations + \ No newline at end of file diff --git a/docs/source/_autosummary/trafficgen.utils.rst b/docs/source/_autosummary/trafficgen.utils.rst new file mode 100644 index 0000000..ff2f0d3 --- /dev/null +++ b/docs/source/_autosummary/trafficgen.utils.rst @@ -0,0 +1,26 @@ +trafficgen.utils +================ + +.. automodule:: trafficgen.utils + :members: + + + + .. rubric:: Functions + .. autosummary:: + + calculate_bearing_between_waypoints + calculate_destination_along_track + calculate_distance + calculate_position_along_track_using_waypoints + calculate_position_at_certain_time + convert_angle_0_to_2_pi_to_minus_pi_to_pi + convert_angle_minus_pi_to_pi_to_0_to_2_pi + deg_2_rad + knot_2_m_pr_s + m_2_nm + m_pr_s_2_knot + min_2_s + nm_2_m + rad_2_deg + \ No newline at end of file diff --git a/docs/source/_autosummary/trafficgen.write_traffic_situation_to_file.rst b/docs/source/_autosummary/trafficgen.write_traffic_situation_to_file.rst new file mode 100644 index 0000000..54e7af0 --- /dev/null +++ b/docs/source/_autosummary/trafficgen.write_traffic_situation_to_file.rst @@ -0,0 +1,15 @@ +trafficgen.write\_traffic\_situation\_to\_file +============================================== + +.. automodule:: trafficgen.write_traffic_situation_to_file + :members: + + + + .. rubric:: Functions + .. autosummary:: + + convert_ship_data_from_si_units_to_maritime + convert_situation_data_from_si_units_to__maritime + write_traffic_situations_to_json_file + \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index 8848dc1..e7bb7ff 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -40,7 +40,7 @@ "sphinx.ext.autosummary", "sphinx.ext.todo", "sphinxcontrib.mermaid", - "sphinx_click" + "sphinx_click", ] # Extenstion for myst_parser @@ -70,7 +70,7 @@ html_title = f"trafficgen {release}" html_theme = "furo" html_static_path = ["_static"] -html_logo = "_static/DNV_logo.png" +html_logo = "_static/DNV_logo_RGB.jpg" autodoc_default_options = { "member-order": "groupwise", "undoc-members": True, diff --git a/docs/source/index.rst b/docs/source/index.rst index 474cd5a..2590a13 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,14 +3,16 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Trafficgen Documentation -======================== +Ship Traffic Generator Documentation +==================================== .. toctree:: :maxdepth: 4 :caption: Contents: README + usage + input_files api CHANGELOG STYLEGUIDE @@ -22,4 +24,3 @@ Indices and tables * :ref:`genindex` * :ref:`modindex` -* :ref:`search` diff --git a/docs/source/trafficgen.rst b/docs/source/trafficgen.rst index 6792e15..3426c91 100644 --- a/docs/source/trafficgen.rst +++ b/docs/source/trafficgen.rst @@ -1,16 +1,6 @@ trafficgen package ================== -Subpackages ------------ - -.. autosummary:: - :toctree: _autosummary - :template: custom-module.rst - :recursive: - - - Modules ------- @@ -21,3 +11,9 @@ Modules trafficgen.ship_traffic_generator trafficgen.read_files + trafficgen.encounter + trafficgen.check_land_crossing + trafficgen.marine_system_simulator + trafficgen.plot_traffic_situation + trafficgen.write_traffic_situation_to_file + trafficgen.utils From 29e13f3365622db0eb1260a2785cc17f34d500c3 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Thu, 16 Jan 2025 15:33:27 +0100 Subject: [PATCH 12/23] #43 Fixed ruff error --- src/trafficgen/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trafficgen/types.py b/src/trafficgen/types.py index 8fe3ea3..11fc3a0 100644 --- a/src/trafficgen/types.py +++ b/src/trafficgen/types.py @@ -5,7 +5,7 @@ import datetime from enum import Enum from importlib.metadata import PackageNotFoundError, version -from typing import Annotated, Any, Optional, Self +from typing import Annotated, Any, Self from pydantic import BaseModel, ConfigDict from pydantic.fields import Field From 69d451b81df44ea527d3d94414a9bab75fbf6bf9 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Thu, 16 Jan 2025 15:37:13 +0100 Subject: [PATCH 13/23] #43, updating python version --- .github/workflows/_test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml index 15ce426..5f635a0 100644 --- a/.github/workflows/_test.yml +++ b/.github/workflows/_test.yml @@ -13,7 +13,6 @@ jobs: - runner: windows-latest # - runner: macos-latest python: - - version: '3.10' - version: '3.11' - version: '3.12' steps: From 2e74372f8274b090fdc9f718cae0bd82e9f8a13f Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Fri, 17 Jan 2025 12:58:17 +0100 Subject: [PATCH 14/23] #43 Updating the documentation in the code --- src/trafficgen/check_land_crossing.py | 25 +- src/trafficgen/encounter.py | 305 ++++++++++++------ src/trafficgen/marine_system_simulator.py | 66 ++-- src/trafficgen/plot_traffic_situation.py | 135 +++++--- src/trafficgen/read_files.py | 122 ++++--- src/trafficgen/ship_traffic_generator.py | 25 +- src/trafficgen/utils.py | 165 ++++++---- .../write_traffic_situation_to_file.py | 27 +- 8 files changed, 554 insertions(+), 316 deletions(-) diff --git a/src/trafficgen/check_land_crossing.py b/src/trafficgen/check_land_crossing.py index 1cd9781..0e8795b 100644 --- a/src/trafficgen/check_land_crossing.py +++ b/src/trafficgen/check_land_crossing.py @@ -9,23 +9,30 @@ def path_crosses_land( position_1: GeoPosition, speed: float, - course: float, + cog: float, lat_lon0: GeoPosition, time_interval: float = 300.0, ) -> bool: """ Find if path is crossing land. - Params: - position_1: Ship position in lat/lon [rad]. - speed: Ship speed [m/s]. - course: Ship course [rad]. - lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad]. - time_interval: The time interval the vessel should travel without crossing land [sec] + Parameters + ---------- + position_1 : GeoPosition + Ship position, latitudinal [rad] and longitudinal [rad]. + speed : float + Ship speed [m/s]. + cog : float + Ship course over ground [rad]. + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad]. + time_interval : float + The time interval the vessel should travel without crossing land [sec]. Default is 300.0. Returns ------- - is_on_land: True if parts of the path crosses land. + is_on_land : bool + True if parts of the path crosses land. """ num_checks = 10 for i in range(int(time_interval / num_checks)): @@ -33,7 +40,7 @@ def path_crosses_land( GeoPosition(lat=position_1.lat, lon=position_1.lon), lat_lon0, speed, - course, + cog, i * time_interval / num_checks, ) diff --git a/src/trafficgen/encounter.py b/src/trafficgen/encounter.py index bf40fc0..2ad2763 100644 --- a/src/trafficgen/encounter.py +++ b/src/trafficgen/encounter.py @@ -47,22 +47,31 @@ def generate_encounter( """ Generate an encounter. - Params: - * desired_encounter_type: Desired encounter to be generated - * own_ship: Dict, information about own ship that will encounter a target ship - * target_ships_static: List of target ships including static information that - may be used in an encounter - * encounter_number: Integer, used to naming the target ships. target_ship_1,2 etc. - * beta_default: User defined beta. If not set, this is None. - * relative_sog_default: User defined relative sog between own ship and - target ship. If not set, this is None. - * vector_time_default: User defined vector time. If not set, this is None. - * settings: Encounter settings + Parameters + ---------- + desired_encounter_type : EncounterType + Desired encounter to be generated. + own_ship : OwnShip + Information about own ship that will encounter a target ship. + target_ships_static : list[ShipStatic] + List of target ships including static information that may be used in an encounter. + encounter_number : Int + Integer identifying the encounter. + beta_default : list[float] | float | None + User defined beta. If not set, this is None [rad]. + relative_sog_default : float | None + User defined relative sog between own ship and target ship. If not set, this is None [m/s]. + vector_time_default : float | None + User defined vector time. If not set, this is None [min]. + settings : EncounterSettings + Encounter settings Returns ------- - * target_ship: target ship information, such as initial position, sog and cog - * encounter_found: True=encounter found, False=encounter not found + target_ship : TargetShip + target ship information, such as initial position, sog and cog + encounter_found : bool + True=encounter found, False=encounter not found """ encounter_found: bool = False target_ship_id: int = 10 # Id of first target ship @@ -234,7 +243,7 @@ def check_encounter_evolvement( target_ship_cog: float, target_ship_position_future: GeoPosition, desired_encounter_type: EncounterType, - settings: EncounterSettings, + encounter_settings: EncounterSettings, ) -> bool: """ Check encounter evolvement. @@ -242,25 +251,41 @@ def check_encounter_evolvement( The generated encounter should be the same type of encounter (head-on, crossing, give-way) also some time before the encounter is started. - Params: - * own_ship: Own ship information such as initial position, sog and cog - * target_ship: Target ship information such as initial position, sog and cog - * desired_encounter_type: Desired type of encounter to be generated - * settings: Encounter settings + Parameters + ---------- + own_ship : OwnShip + Own ship information such as initial position, sog and cog + own_ship_cog : float + Own ship cog [rad] + own_ship_position_future : GeoPosition + Own ship future position {lat, lon} [rad]. + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] + target_ship_sog : float + Target ship speed over ground [m/s] + target_ship_cog : float + Target ship course over ground [rad] + target_ship_position_future : GeoPosition + Target ship future position {lat, lon} [rad] + desired_encounter_type : EncounterType + Desired type of encounter to be generated + encounter_settings : EncounterSettings + Encounter settings Returns ------- - * returns True if encounter ok, False if encounter not ok + encounterOK : bool + Returns True if encounter ok, False if encounter not ok """ - theta13_criteria: float = settings.classification.theta13_criteria - theta14_criteria: float = settings.classification.theta14_criteria - theta15_criteria: float = settings.classification.theta15_criteria - theta15: list[float] = settings.classification.theta15 + theta13_criteria: float = encounter_settings.classification.theta13_criteria + theta14_criteria: float = encounter_settings.classification.theta14_criteria + theta15_criteria: float = encounter_settings.classification.theta15_criteria + theta15: list[float] = encounter_settings.classification.theta15 assert own_ship.initial is not None own_ship_sog: float = own_ship.initial.sog - evolve_time: float = settings.evolve_time + evolve_time: float = encounter_settings.evolve_time # Calculating position back in time to ensure that the encounter do not change from one type # to another before the encounter is started @@ -304,15 +329,21 @@ def define_own_ship( """ Define own ship based on information in desired traffic situation. - Params: - * desired_traffic_situation: Information about type of traffic situation to generate - * own_ship_static: Static information of own ship. - * encounter_settings: Necessary setting for the encounter - * lat_lon0: Reference position [deg] + Parameters + ---------- + desired_traffic_situation : SituationInput + Information about type of traffic situation to generate + own_ship_static : ShipStatic + Static information of own ship. + encounter_settings : EncounterSettings + Necessary setting for the encounter + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] Returns ------- - * own_ship: Own ship + own_ship : OwnShip + Own ship including static, initial and waypoints. """ own_ship_initial: Initial = desired_traffic_situation.own_ship.initial own_ship_waypoints: list[Waypoint] = [] @@ -362,16 +393,23 @@ def calculate_min_vector_length_target_ship( This is done to ensure that ship sog is high enough to find proper situation. - Params: - * own_ship_position: Own ship initial position, latitudinal [rad] and longitudinal [rad] - * own_ship_cog: Own ship initial cog - * target_ship_position_future: Target ship future position - * desired_beta: Desired relative bearing between - * lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad] + Parameters + ---------- + own_ship_position : GeoPosition + Own ship initial position, latitudinal [rad] and longitudinal [rad] + own_ship_cog : float + Own ship initial cog [rad] + target_ship_position_future : GeoPosition + Target ship future position, latitudinal [rad] and longitudinal [rad] + desired_beta : float + Desired relative bearing between own ship and target ship seen from own ship [rad] + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] Returns ------- - * min_vector_length: Minimum vector length (target ship sog x vector) + min_vector_length : float + Minimum vector length (target ship sog x vector) """ psi: float = own_ship_cog + desired_beta @@ -402,29 +440,41 @@ def find_start_position_target_ship( target_ship_vector_length: float, desired_beta: float, desired_encounter_type: EncounterType, - settings: EncounterSettings, + encounter_settings: EncounterSettings, ) -> tuple[GeoPosition, bool]: """ Find start position of target ship using desired beta and vector length. - Params: - * own_ship_position: Own ship initial position, sog and cog - * own_ship_cog: Own ship initial cog - * target_ship_position_future: Target ship future position - * target_ship_vector_length: vector length (target ship sog x vector) - * desired_beta: Desired bearing between own ship and target ship seen from own ship - * desired_encounter_type: Desired type of encounter to be generated - * settings: Encounter settings + Parameters + ---------- + own_ship_position : GeoPosition + Own ship position {lat, lon} [rad] + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] + own_ship_cog : float + Own ship course over ground [rad] + target_ship_position_future : GeoPosition + Target ship future position {lat, lon} [rad] + target_ship_vector_length : float + vector length (target ship sog x vector) + desired_beta : float + Desired bearing between own ship and target ship seen from own ship [rad] + desired_encounter_type : EncounterType + Desired type of encounter to be generated + encounter_settings : EncounterSettings + Encounter settings Returns ------- - * start_position_target_ship: Dict, initial position of target ship {north, east} [m] - * start_position_found: 0=position not found, 1=position found + start_position_target_ship : GeoPosition + Initial position of target ship {lat, lon} [rad] + start_position_found : bool + False if position not found, True if position found """ - theta13_criteria: float = settings.classification.theta13_criteria - theta14_criteria: float = settings.classification.theta14_criteria - theta15_criteria: float = settings.classification.theta15_criteria - theta15: list[float] = settings.classification.theta15 + theta13_criteria: float = encounter_settings.classification.theta13_criteria + theta14_criteria: float = encounter_settings.classification.theta14_criteria + theta15_criteria: float = encounter_settings.classification.theta15_criteria + theta15: list[float] = encounter_settings.classification.theta15 n_1, e_1, _ = llh2flat(own_ship_position.lat, own_ship_position.lon, lat_lon0.lat, lat_lon0.lon) n_2, e_2, _ = llh2flat( @@ -524,16 +574,19 @@ def assign_future_position_to_target_ship( If drawing a circle with radius max_meeting_distance around future position of own ship, future position of target ship shall be somewhere inside this circle. - Params: - * own_ship_position_future: Dict, own ship position at a given time in the - future, {north, east} - * lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad] - * max_meeting_distance: Maximum distance between own ship and target ship at - a given time in the future [m] + Parameters + ---------- + own_ship_position_future : GeoPosition + Own ship position at a given time in the future {lat, lon} [rad] + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] + max_meeting_distance : float + Maximum distance between own ship and target ship at a given time in the future [m] Returns ------- - future_position_target_ship: Future position of target ship {north, east} [m] + future_position_target_ship : GeoPosition + Future position of target ship {lat, lon} [rad] """ random_angle = random.uniform(0, 1) * 2 * np.pi random_distance = random.uniform(0, 1) * max_meeting_distance @@ -565,19 +618,25 @@ def determine_colreg( ship seen from target ship, and beta, relative bearing between own ship and target ship seen from own ship. - Params: - * alpha: relative bearing between target ship and own ship seen from target ship - * beta: relative bearing between own ship and target ship seen from own ship - * theta13_criteria: Tolerance for "coming up with" relative bearing - * theta14_criteria: Tolerance for "reciprocal or nearly reciprocal cogs", - "when in any doubt... assume... [head-on]" - * theta15_criteria: Crossing aspect limit, used for classifying a crossing encounter - * theta15: 22.5 deg aft of the beam, used for classifying a crossing and an overtaking - encounter + Parameters + ---------- + alpha : float + Relative bearing between target ship and own ship seen from target ship [rad] + beta : float + Relative bearing between own ship and target ship seen from own ship [rad] + theta13_criteria : float + Tolerance for "coming up with" relative bearing + theta14_criteria : float + Tolerance for "reciprocal or nearly reciprocal cogs", "when in any doubt... assume... [head-on]" + theta15_criteria : float + Crossing aspect limit, used for classifying a crossing encounter + theta15 : list[float] + 22.5 deg aft of the beam, used for classifying a crossing and an overtaking encounter [rad, rad] Returns ------- - * encounter classification + encounter_classification : EncounterType + Classification of the encounter """ # Mapping alpha_2_pi: float = alpha if alpha >= 0.0 else alpha + 2 * np.pi @@ -609,17 +668,25 @@ def calculate_relative_bearing( """ Calculate relative bearing between own ship and target ship. - Params: - * position_own_ship: Own ship position {lat, lon} [rad] - * heading_own_ship: Own ship heading [rad] - * position_target_ship: Target ship position {lat, lon} [rad] - * heading_target_ship: Target ship heading [rad] - * lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad] + Parameters + ---------- + position_own_ship : GeoPosition + Own ship position {lat, lon} [rad] + heading_own_ship : float + Own ship heading [rad] + position_target_ship : GeoPosition + Target ship position {lat, lon} [rad] + heading_target_ship : float + Target ship heading [rad] + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] Returns ------- - * beta: relative bearing between own ship and target ship seen from own ship [rad] - * alpha: relative bearing between target ship and own ship seen from target ship [rad] + beta : float + Relative bearing between own ship and target ship seen from own ship [rad] + alpha : float + Relative bearing between target ship and own ship seen from target ship [rad] """ # POSE combination of relative bearing and contact angle n_own_ship, e_own_ship, _ = llh2flat(position_own_ship.lat, position_own_ship.lon, lat_lon0.lat, lat_lon0.lon) @@ -676,13 +743,19 @@ def calculate_ship_cog(pos_0: GeoPosition, pos_1: GeoPosition, lat_lon0: GeoPosi """ Calculate ship cog between two waypoints. - Params: - * waypoint_0: Dict, waypoint {lat, lon} [rad] - * waypoint_1: Dict, waypoint {lat, lon} [rad] + Parameters + ---------- + pos_0 : GeoPosition + First waypoint {lat, lon} [rad] + pos_1: GeoPosition + Second waypoint {lat, lon} [rad] + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] Returns ------- - * cog: Ship cog [rad] + cog : float + Ship coourse over ground [rad] """ n_0, e_0, _ = llh2flat(pos_0.lat, pos_0.lon, lat_lon0.lat, lat_lon0.lon) n_1, e_1, _ = llh2flat(pos_1.lat, pos_1.lon, lat_lon0.lat, lat_lon0.lon) @@ -697,12 +770,15 @@ def assign_vector_time(vector_time_range: list[float]) -> float: """ Assign random (uniform) vector time. - Params: - * vector_range: Minimum and maximum value for vector time + Parameters + ---------- + vector_time_range : list[float] + Minimum and maximum value for vector time [min] Returns ------- - * vector_time: Vector time [min] + vector_time : float + Vector time [min] """ vector_time: float = vector_time_range[0] + random.uniform(0, 1) * (vector_time_range[1] - vector_time_range[0]) return vector_time @@ -717,15 +793,21 @@ def assign_sog_to_target_ship( """ Assign random (uniform) sog to target ship depending on type of encounter. - Params: - * encounter_type: Type of encounter - * own_ship_sog: Own ship sog [m/s] - * min_target_ship_sog: Minimum target ship sog [m/s] - * relative_sog_setting: Relative sog setting dependent on encounter [-] + Parameters + ---------- + encounter_type : EncounterType + Type of encounter + own_ship_sog : float + Own ship speed over ground [m/s] + min_target_ship_sog : float + Minimum target ship speed over ground [m/s] + relative_sog_setting : EncounterRelativeSpeed + Relative speed over ground setting dependent on encounter [-] Returns ------- - * target_ship_sog: Target ship sog [m/s] + target_ship_sog : float + Target ship speed over ground [m/s] """ if encounter_type is EncounterType.OVERTAKING_STAND_ON: relative_sog = relative_sog_setting.overtaking_stand_on @@ -755,15 +837,17 @@ def assign_beta_from_list(beta_limit: list[float]) -> float: """ Assign random (uniform) relative bearing. - The beta between own ship - and target ship depending is somewhere between the limits given by beta_limit. + The beta between own ship and target ship depending is somewhere between + the limits given by beta_limit. Params: - * beta_limit: Limits for beta + beta_limit : list[float] + Limits for beta {min, max} [rad] Returns ------- - * Relative bearing between own ship and target ship seen from own ship [rad] + relative_bearing : float + Relative bearing between own ship and target ship seen from own ship [rad] """ beta_limit_length = 2 assert len(beta_limit) == beta_limit_length @@ -771,22 +855,26 @@ def assign_beta_from_list(beta_limit: list[float]) -> float: return beta -def assign_beta(encounter_type: EncounterType, settings: EncounterSettings) -> float: +def assign_beta(encounter_type: EncounterType, encounter_settings: EncounterSettings) -> float: """ Assign random (uniform) relative bearing. - Params: - * encounter_type: Type of encounter - * settings: Encounter settings + Parameters + ---------- + encounter_type : EncounterType + Type of encounter + encounter_settings : EncounterSettings + Encounter settings Returns ------- - * Relative bearing between own ship and target ship seen from own ship [rad] + relative_bearing : float + Relative bearing between own ship and target ship seen from own ship [rad] """ - theta13_crit: float = settings.classification.theta13_criteria - theta14_crit: float = settings.classification.theta14_criteria - theta15_crit: float = settings.classification.theta15_criteria - theta15: list[float] = settings.classification.theta15 + theta13_crit: float = encounter_settings.classification.theta13_criteria + theta14_crit: float = encounter_settings.classification.theta14_criteria + theta15_crit: float = encounter_settings.classification.theta15_criteria + theta15: list[float] = encounter_settings.classification.theta15 if encounter_type is EncounterType.OVERTAKING_STAND_ON: return theta15[0] + random.uniform(0, 1) * (theta15[1] - theta15[0]) @@ -807,12 +895,15 @@ def decide_target_ship(target_ships_static: list[ShipStatic]) -> ShipStatic: """ Randomly pick a target ship from a list of target ships. - Params: - * target_ships: list of target ships with static information + Parameters + ---------- + target_ships : list[ShipStatic] + List of target ships with static information Returns ------- - * The target ship, info of type, size etc. + target_ship : ShipStatic + The target ship, info of type, size etc. """ num_target_ships: int = len(target_ships_static) target_ship_to_use: int = random.randint(1, num_target_ships) diff --git a/src/trafficgen/marine_system_simulator.py b/src/trafficgen/marine_system_simulator.py index 70b9fbf..60001a9 100644 --- a/src/trafficgen/marine_system_simulator.py +++ b/src/trafficgen/marine_system_simulator.py @@ -37,20 +37,29 @@ def flat2llh( Date: 20 July 2018 Revisions: 2023-02-04 updates the formulas for lat and lon - Params: - * xn: Ship position, north [m] - * yn: Ship position, east [m] - * zn=0.0: Ship position, down [m] - * lat_0, lon_0: Flat earth coordinate located at (lon_0, lat_0) + Parameters + ---------- + x_n : float + Ship position, north [m] + y_n : float + Ship position, east [m] + lat_0 : float + Flat earth coordinate located at (lon_0, lat_0) + lon_0 : float + Flat earth coordinate located at (lon_0, lat_0) + z_n : float + Ship position, down [m], default is 0.0 * h_ref=0.0: Flat earth coordinate with reference h_ref in meters above the surface of the ellipsoid Returns ------- - * lat: lat [rad] - * lon: lon [rad] - * h: Height [m] - + lat : float + Ship position in lat [rad] + lon : float + Ship position in lon [rad] + h : float + Ship height in meters above the surface of the ellipsoid [m] """ # WGS-84 parameters a_radius = 6378137 # Semi-major axis @@ -91,19 +100,29 @@ def llh2flat( Date: 20 July 2018 Revisions: 2023-02-04 updates the formulas for lat and lon - Params: - * lat: Ship position in lat [rad] - * lon: Ship position in lon [rad] - * h=0.0: Ship height in meters above the surface of the ellipsoid - * lat_0, lon_0: Flat earth coordinate located at (lon_0, lat_0) - * h_ref=0.0: Flat earth coordinate with reference h_ref in meters above - the surface of the ellipsoid + Parameters + ---------- + lat : float + Ship position in lat [rad] + lon : float + Ship position in lon [rad] + lat_0 : float + Flat earth coordinate located at (lon_0, lat_0) + lon_0 : float + Flat earth coordinate located at (lon_0, lat_0) + h : float + Ship height in meters above the surface of the ellipsoid, default is 0.0 + h_ref : float + Flat earth coordinate with reference h_ref in meters above the surface of the ellipsoid Returns ------- - * x_n: Ship position, north [m] - * y_n: Ship position, east [m] - * z_n: Ship position, down [m] + x_n : float + Ship position, north [m] + y_n : float + Ship position, east [m] + z_n : float + Ship position, down [m] """ # WGS-84 parameters a_radius = 6378137 # Semi-major axis (equitorial radius) @@ -137,11 +156,14 @@ def ssa(angle: float) -> float: Author: Thor I. Fossen Date: 2018-09-21 - Param: - * angle: angle given in radius + Parameters + ---------- + angle : float + Angle given in radius Returns ------- - * smallest_angle: "smallest signed angle" or the smallest difference between two angles + smallest_angle : float + "smallest signed angle" or the smallest difference between two angles """ return np.mod(angle + np.pi, 2 * np.pi) - np.pi diff --git a/src/trafficgen/plot_traffic_situation.py b/src/trafficgen/plot_traffic_situation.py index 3756a99..d7b55df 100644 --- a/src/trafficgen/plot_traffic_situation.py +++ b/src/trafficgen/plot_traffic_situation.py @@ -25,15 +25,21 @@ def calculate_vector_arrow( """ Calculate the arrow with length vector pointing in the direction of ship course. - Params: - * position: {lat}, {lon} position of the ship [rad] - * direction: direction the arrow is pointing [rad] - * vector_length: length of vector [m] - * lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad] + Parameters + ---------- + position : GeoPosition + {lat}, {lon} position of the ship [rad] + direction : float + Direction the arrow is pointing [rad] + vector_length :float + Length of vector [m] + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] Returns ------- - * arrow_points: Polygon points to draw the arrow [deg] + arrow_points : list[tuple[float, float]] + Polygon points to draw the arrow [deg] """ north_start, east_start, _ = llh2flat(position.lat, position.lon, lat_lon0.lat, lat_lon0.lon) @@ -63,7 +69,7 @@ def calculate_vector_arrow( def calculate_ship_outline( position: GeoPosition, - course: float, + cog: float, lat_lon0: GeoPosition, ship_length: float = 100.0, ship_width: float = 15.0, @@ -71,16 +77,23 @@ def calculate_ship_outline( """ Calculate the outline of the ship pointing in the direction of ship course. - Params: - * position: {lat}, {lon} position of the ship [rad] - * course: course of the ship [rad] - * lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad] - * ship_length: Ship length. If not given, ship length is set to 100 - * ship_width: Ship width. If not given, ship width is set to 15 + Parameters + ---------- + position : GeoPosition + {lat}, {lon} position of the ship [rad] + cog : float + Course over ground of the ship [rad] + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] + ship_length : float + Ship length. If not given, ship length is set to 100 + ship_width : float + Ship width. If not given, ship width is set to 15 Returns ------- - * ship_outline_points: Polygon points to draw the ship [deg] + ship_outline_points : list[tuple[float, float]] + Polygon points to draw the ship [deg] """ north_start, east_start, _ = llh2flat(position.lat, position.lon, lat_lon0.lat, lat_lon0.lon) @@ -88,26 +101,24 @@ def calculate_ship_outline( ship_length *= 10 ship_width *= 10 - north_pos1 = north_start + np.cos(course) * (-ship_length / 2) - np.sin(course) * ship_width / 2 - east_pos1 = east_start + np.sin(course) * (-ship_length / 2) + np.cos(course) * ship_width / 2 + north_pos1 = north_start + np.cos(cog) * (-ship_length / 2) - np.sin(cog) * ship_width / 2 + east_pos1 = east_start + np.sin(cog) * (-ship_length / 2) + np.cos(cog) * ship_width / 2 lat_pos1, lon_pos1, _ = flat2llh(north_pos1, east_pos1, lat_lon0.lat, lat_lon0.lon) - north_pos2 = north_start + np.cos(course) * (ship_length / 2 - ship_length * 0.1) - np.sin(course) * ship_width / 2 - east_pos2 = east_start + np.sin(course) * (ship_length / 2 - ship_length * 0.1) + np.cos(course) * ship_width / 2 + north_pos2 = north_start + np.cos(cog) * (ship_length / 2 - ship_length * 0.1) - np.sin(cog) * ship_width / 2 + east_pos2 = east_start + np.sin(cog) * (ship_length / 2 - ship_length * 0.1) + np.cos(cog) * ship_width / 2 lat_pos2, lon_pos2, _ = flat2llh(north_pos2, east_pos2, lat_lon0.lat, lat_lon0.lon) - north_pos3 = north_start + np.cos(course) * (ship_length / 2) - east_pos3 = east_start + np.sin(course) * (ship_length / 2) + north_pos3 = north_start + np.cos(cog) * (ship_length / 2) + east_pos3 = east_start + np.sin(cog) * (ship_length / 2) lat_pos3, lon_pos3, _ = flat2llh(north_pos3, east_pos3, lat_lon0.lat, lat_lon0.lon) - north_pos4 = ( - north_start + np.cos(course) * (ship_length / 2 - ship_length * 0.1) - np.sin(course) * (-ship_width / 2) - ) - east_pos4 = east_start + np.sin(course) * (ship_length / 2 - ship_length * 0.1) + np.cos(course) * (-ship_width / 2) + north_pos4 = north_start + np.cos(cog) * (ship_length / 2 - ship_length * 0.1) - np.sin(cog) * (-ship_width / 2) + east_pos4 = east_start + np.sin(cog) * (ship_length / 2 - ship_length * 0.1) + np.cos(cog) * (-ship_width / 2) lat_pos4, lon_pos4, _ = flat2llh(north_pos4, east_pos4, lat_lon0.lat, lat_lon0.lon) - north_pos5 = north_start + np.cos(course) * (-ship_length / 2) - np.sin(course) * (-ship_width / 2) - east_pos5 = east_start + np.sin(course) * (-ship_length / 2) + np.cos(course) * (-ship_width / 2) + north_pos5 = north_start + np.cos(cog) * (-ship_length / 2) - np.sin(cog) * (-ship_width / 2) + east_pos5 = east_start + np.sin(cog) * (-ship_length / 2) + np.cos(cog) * (-ship_width / 2) lat_pos5, lon_pos5, _ = flat2llh(north_pos5, east_pos5, lat_lon0.lat, lat_lon0.lon) point_1 = (rad_2_deg(lat_pos1), rad_2_deg(lon_pos1)) @@ -127,9 +138,14 @@ def plot_specific_traffic_situation( """ Plot a specific situation in map. - Params: - * traffic_situations: Generated traffic situations - * situation_number: The specific situation to be plotted + Parameters + ---------- + traffic_situations : list[TrafficSituation] + List of traffic situations that are generated + situation_number : int + The specific situation to be plotted + encounter_settings : EncounterSettings + Encounter settings """ num_situations = len(traffic_situations) if situation_number > num_situations: @@ -182,16 +198,23 @@ def add_ship_to_map( """ Add the ship to the map. - Params: - * ship: Ship information - * vector_time: Vector time [sec] - * lat_lon0=Reference point, latitudinal [rad] and longitudinal [rad] - * map_plot: Instance of Map. If not set, instance is set to None - * color: Color of the ship. If not set, color is 'black' + Parameters + ---------- + ship : Ship + Ship information + vector_time : float + Vector time [sec] + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] + map_plot : Map | None + Instance of Map. If not set, instance is set to None + color : str + Color of the ship. If not set, color is 'black' Returns ------- - * m: Updated instance of Map. + map_plot : Map + Updated instance of Map. """ if map_plot is None: map_plot = Map(location=(rad_2_deg(lat_lon0.lat), rad_2_deg(lat_lon0.lon)), zoom_start=10) @@ -226,10 +249,16 @@ def plot_traffic_situations( """ Plot the traffic situations in one more figures. - Params: - * traffic_situations: Traffic situations to be plotted - * col: Number of columns in each figure - * row: Number of rows in each figure + Parameters + ---------- + traffic_situations : list[TrafficSituation] + List of traffic situations to be plotted + col : int + Number of columns in each figure + row : int + Number of rows in each figure + encounter_settings : EncounterSettings + Encounter settings """ max_columns = col max_rows = row @@ -308,13 +337,16 @@ def find_max_value_for_plot( Find the maximum deviation from the Reference point in north and east direction. Params: - * ship: Ship information - * max_value: maximum deviation in north, east direction - * lat_lon0: Reference point, latitudinal [rad] and longitudinal [rad] + ship : Ship + Ship information + max_value : float + Maximum deviation in north, east direction [m] + lat_lon0 : GeoPosition + Reference point, latitudinal [rad] and longitudinal [rad] Returns ------- - * max_value: updated maximum deviation in north, east direction + * max_value: updated maximum deviation in north, east direction [m] """ assert ship.initial is not None @@ -344,11 +376,16 @@ def add_ship_to_plot( """ Add the ship to the plot. - Params: - * ship: Ship information - * vector_time: Vector time [sec] - * axes: Instance of figure axis. If not set, instance is set to None - * color: Color of the ship. If not set, color is 'black' + Parameters + ---------- + ship : Ship + Ship information + vector_time : float + Vector time [sec] + axes : Axes | None + Instance of figure axis. If not set, instance is set to None + color : str + Color of the ship. If not set, color is 'black' """ if axes is None: axes = plt.gca() diff --git a/src/trafficgen/read_files.py b/src/trafficgen/read_files.py index 1756ab7..2679e58 100644 --- a/src/trafficgen/read_files.py +++ b/src/trafficgen/read_files.py @@ -21,13 +21,15 @@ def read_situation_files(situation_folder: Path) -> list[SituationInput]: """ Read traffic situation files. - Params: - * situation_folder: Path to the folder where situation files are found - * input_units: Specify if the inputs are given in si or maritime units + Parameters + ---------- + situation_folder : Path + Path to the folder where situation files are found Returns ------- - * situations: List of desired traffic situations + situations : list[SituationInput] + List of desired traffic situations """ situations: list[SituationInput] = [] for file_name in sorted([file for file in os.listdir(situation_folder) if file.endswith(".json")]): @@ -51,12 +53,15 @@ def read_generated_situation_files(situation_folder: Path) -> list[TrafficSituat """ Read the generated traffic situation files. Used for testing the trafficgen algorithm. - Params: - * situation_folder: Path to the folder where situation files are found + Parameters + ---------- + situation_folder : Path + Path to the folder where situation files are found Returns ------- - * situations: List of desired traffic situations + situations : list[TrafficSituation] + List of desired traffic situations """ situations: list[TrafficSituation] = [] for file_name in sorted([file for file in os.listdir(situation_folder) if file.endswith(".json")]): @@ -74,12 +79,15 @@ def convert_situation_data_from_maritime_to_si_units(situation: SituationInput) """ Convert situation data which is given in maritime units to SI units. - Params: - * situation: Situation data to be converted + Parameters + ---------- + situation : SituationInput + Situation data to be converted Returns ------- - * situation: Converted situation data + situation : SituationInput + Converted situation data """ assert situation.own_ship is not None assert situation.own_ship.initial is not None @@ -99,12 +107,15 @@ def convert_own_ship_initial_data(initial: Initial) -> Initial: """ Convert own ship initial data which is given in maritime units to SI units. - Params: - * initial: Own ship initial data to be converted + Parameters + ---------- + initial : Initial + Own ship initial data to be converted Returns ------- - * initial: Converted own ship initial data + initial : Initial + Converted own ship initial data """ initial.position.lon = deg_2_rad(initial.position.lon) initial.position.lat = deg_2_rad(initial.position.lat) @@ -126,7 +137,7 @@ def convert_own_ship_waypoints(waypoints: list[Waypoint]) -> list[Waypoint]: Returns ------- - list[Waypoint] + waypoints : list[Waypoint] Converted waypoint data """ for waypoint in waypoints: @@ -160,7 +171,7 @@ def convert_encounters(encounters: list[Encounter]) -> list[Encounter]: Returns ------- - list[Encounter] + encounters : list[Encounter] Converted encounter data """ assert encounters is not None @@ -186,12 +197,15 @@ def read_own_ship_static_file(own_ship_static_file: Path) -> ShipStatic: """ Read own ship static data from file. - Params: - * own_ship_file: Path to the own_ship_static_file file + Parameters + ---------- + own_ship_file : Path + Path to the own_ship_static_file file Returns ------- - * own_ship static information + own_ship : ShipStatic + Own_ship static information """ with Path.open(own_ship_static_file, encoding="utf-8") as f: data = json.load(f) @@ -211,12 +225,15 @@ def read_target_ship_static_files(target_ship_folder: Path) -> list[ShipStatic]: """ Read target ship static data files. - Params: - * target_ship_folder: Path to the folder where target ships are found + Parameters + ---------- + target_ship_folder : Path + Path to the folder where target ships are found Returns ------- - * target_ships_static: List of different target ships with static information + target_ships_static : list[ShipStatic] + List of different target ships with static information """ target_ships_static: list[ShipStatic] = [] i = 0 @@ -241,9 +258,15 @@ def convert_ship_data_from_maritime_to_si_units(ship: ShipStatic) -> ShipStatic: """ Convert ship static data which is given in maritime units to SI units. + Parameters + ---------- + ship : ShipStatic + Ship data to be converted + Returns ------- - * ShipStatic + ship : ShipStatic + Converted ship data """ if ship.sog_max is not None: ship.sog_max = knot_2_m_pr_s(ship.sog_max) @@ -257,16 +280,18 @@ def read_encounter_settings_file(settings_file: Path) -> EncounterSettings: """ Read encounter settings file. - Params: - * settings_file: Path to the encounter setting file + Parameters + ---------- + settings_file : Path + Path to the encounter setting file Returns ------- - * encounter_settings: Settings for the encounter + encounter_settings : EncounterSettings + Settings for the encounter """ with Path.open(settings_file, encoding="utf-8") as f: data = json.load(f) - data = check_input_units(data) encounter_settings: EncounterSettings = EncounterSettings(**data) encounter_settings = convert_settings_data_from_maritime_to_si_units(encounter_settings) @@ -274,42 +299,37 @@ def read_encounter_settings_file(settings_file: Path) -> EncounterSettings: return encounter_settings -def convert_settings_data_from_maritime_to_si_units(settings: EncounterSettings) -> EncounterSettings: +def convert_settings_data_from_maritime_to_si_units(encounter_settings: EncounterSettings) -> EncounterSettings: """ Convert situation data which is given in maritime units to SI units. - Params: - * own_ship_file: Path to the own_ship_file file + Parameters + ---------- + encounter_settings : EncounterSettings + Encounter settings data to be converted Returns ------- - * own_ship information + encounter_settings : EncounterSettings + Converted encounter settings data """ - assert settings.classification is not None - - settings.classification.theta13_criteria = deg_2_rad(settings.classification.theta13_criteria) - settings.classification.theta14_criteria = deg_2_rad(settings.classification.theta14_criteria) - settings.classification.theta15_criteria = deg_2_rad(settings.classification.theta15_criteria) - settings.classification.theta15[0] = deg_2_rad(settings.classification.theta15[0]) - settings.classification.theta15[1] = deg_2_rad(settings.classification.theta15[1]) + assert encounter_settings.classification is not None - settings.vector_range[0] = min_2_s(settings.vector_range[0]) - settings.vector_range[1] = min_2_s(settings.vector_range[1]) + encounter_settings.classification.theta13_criteria = deg_2_rad(encounter_settings.classification.theta13_criteria) + encounter_settings.classification.theta14_criteria = deg_2_rad(encounter_settings.classification.theta14_criteria) + encounter_settings.classification.theta15_criteria = deg_2_rad(encounter_settings.classification.theta15_criteria) + encounter_settings.classification.theta15[0] = deg_2_rad(encounter_settings.classification.theta15[0]) + encounter_settings.classification.theta15[1] = deg_2_rad(encounter_settings.classification.theta15[1]) - settings.situation_length = min_2_s(settings.situation_length) - settings.max_meeting_distance = nm_2_m(settings.max_meeting_distance) - settings.evolve_time = min_2_s(settings.evolve_time) - settings.common_vector = min_2_s(settings.common_vector) + encounter_settings.vector_range[0] = min_2_s(encounter_settings.vector_range[0]) + encounter_settings.vector_range[1] = min_2_s(encounter_settings.vector_range[1]) - return settings + encounter_settings.situation_length = min_2_s(encounter_settings.situation_length) + encounter_settings.max_meeting_distance = nm_2_m(encounter_settings.max_meeting_distance) + encounter_settings.evolve_time = min_2_s(encounter_settings.evolve_time) + encounter_settings.common_vector = min_2_s(encounter_settings.common_vector) - -def check_input_units(data: dict[str, Any]) -> dict[str, Any]: - """Check if input unit is specified, if not specified it is set to SI.""" - if "input_units" not in data: - data["input_units"] = "si" - - return data + return encounter_settings def camel_to_snake(string: str) -> str: diff --git a/src/trafficgen/ship_traffic_generator.py b/src/trafficgen/ship_traffic_generator.py index 3504139..01d7e6c 100644 --- a/src/trafficgen/ship_traffic_generator.py +++ b/src/trafficgen/ship_traffic_generator.py @@ -36,22 +36,23 @@ def generate_traffic_situations( target_ship_folder: Path, settings_file: Path, ) -> list[TrafficSituation]: - """ - Generate a set of traffic situations using input files. - - This is the main function for generating a set of traffic situations using input files - specifying number and type of encounter, type of target ships etc. + """Generate traffic situations based on the provided input files. - Params: - * situation_folder: Path to situation folder, files describing the desired situations - * own_ship_file: Path to where own ships is found - * target_ship_folder: Path to where different type of target ships is found - * settings_file: Path to settings file + Parameters + ---------- + situation_folder : Path + Path to the folder containing situation files. + own_ship_file : Path + Path to the file containing own ship static data. + target_ship_folder : Path + Path to the folder containing target ship static files. + settings_file : Path + Path to the file containing encounter settings. Returns ------- - * traffic_situations: List of generated traffic situations. - * One situation may consist of one or more encounters. + list[TrafficSituation] + A list of generated traffic situations. """ own_ship_static: ShipStatic = read_own_ship_static_file(own_ship_file) target_ships_static: list[ShipStatic] = read_target_ship_static_files(target_ship_folder) diff --git a/src/trafficgen/utils.py b/src/trafficgen/utils.py index 0f5245e..14d46a9 100644 --- a/src/trafficgen/utils.py +++ b/src/trafficgen/utils.py @@ -10,12 +10,15 @@ def knot_2_m_pr_s(speed_in_knot: float) -> float: """ Convert ship speed in knots to meters pr second. - Params: - * speed_in_knot: Ship speed given in knots + Parameters + ---------- + speed_in_knot : float + Ship speed given in knots Returns ------- - * speed_in_m_pr_s: Ship speed in meters pr second + speed_in_m_pr_s : float + Ship speed in meters pr second """ knot_2_m_pr_sec: float = 0.5144 return speed_in_knot * knot_2_m_pr_sec @@ -25,12 +28,15 @@ def m_pr_s_2_knot(speed_in_m_pr_s: float) -> float: """ Convert ship speed in knots to meters pr second. - Params: - * speed_in_m_pr_s: Ship speed given in meters pr second + Parameters + ---------- + speed_in_m_pr_s : float + Ship speed given in meters pr second Returns ------- - * speed_in_knot: Ship speed in knots + speed_in_knot : float + Ship speed in knots """ knot_2_m_pr_sec: float = 0.5144 return speed_in_m_pr_s / knot_2_m_pr_sec @@ -40,12 +46,15 @@ def min_2_s(time_in_min: float) -> float: """ Convert time given in minutes to time given in seconds. - Params: - * time_in_min: Time given in minutes + Parameters + ---------- + time_in_min : float + Time given in minutes Returns ------- - * time_in_s: Time in seconds + time_in_s : float + Time in seconds """ min_2_s_coeff: float = 60.0 return time_in_min * min_2_s_coeff @@ -55,12 +64,15 @@ def m_2_nm(length_in_m: float) -> float: """ Convert length given in meters to length given in nautical miles. - Params: - * length_in_m: Length given in meters + Parameters + ---------- + length_in_m : float + Length given in meters Returns ------- - * length_in_nm: Length given in nautical miles + length_in_nm : float + Length given in nautical miles """ m_2_nm_coeff: float = 1.0 / 1852.0 return m_2_nm_coeff * length_in_m @@ -70,12 +82,15 @@ def nm_2_m(length_in_nm: float) -> float: """ Convert length given in nautical miles to length given in meters. - Params: - * length_in_nm: Length given in nautical miles + Parameters + ---------- + length_in_nm : float + Length given in nautical miles Returns ------- - * length_in_m: Length given in meters + length_in_m : float + Length given in meters """ nm_2_m_factor: float = 1852.0 return length_in_nm * nm_2_m_factor @@ -85,12 +100,15 @@ def deg_2_rad(angle_in_degrees: float) -> float: """ Convert angle given in degrees to angle give in radians. - Params: - * angle_in_degrees: Angle given in degrees + Parameters + ---------- + angle_in_degrees : float + Angle given in degrees Returns ------- - * angle given in radians: Angle given in radians + angle_in_radians : float + Angle given in radians """ return angle_in_degrees * np.pi / 180.0 @@ -99,13 +117,15 @@ def rad_2_deg(angle_in_radians: float) -> float: """ Convert angle given in radians to angle give in degrees. - Params: - * angle_in_degrees: Angle given in degrees + Parameters + ---------- + angle_in_degrees : float + Angle given in degrees Returns ------- - * angle given in radians: Angle given in radians - + angle_in_radians : float + Angle given in radians """ return angle_in_radians * 180.0 / np.pi @@ -117,12 +137,15 @@ def convert_angle_minus_pi_to_pi_to_0_to_2_pi(angle_pi: float) -> float: Convert an angle given in the region -pi to pi degrees to an angle given in the region 0 to 2pi radians. - Params: - * angle_pi: Angle given in the region -pi to pi radians + Parameters + ---------- + angle_pi : float + Angle given in the region -pi to pi radians Returns ------- - * angle_2_pi: Angle given in the region 0 to 2pi radians + angle_2_pi : float + Angle given in the region 0 to 2pi radians """ return angle_pi if angle_pi >= 0.0 else angle_pi + 2 * np.pi @@ -135,12 +158,15 @@ def convert_angle_0_to_2_pi_to_minus_pi_to_pi(angle_2_pi: float) -> float: Convert an angle given in the region 0 to 2*pi degrees to an angle given in the region -pi to pi degrees. - Params: - * angle_2_pi: Angle given in the region 0 to 2pi radians + Parameters + ---------- + angle_2_pi : float + Angle given in the region 0 to 2pi radians Returns ------- - * angle_pi: Angle given in the region -pi to pi radians + angle_pi : float + Angle given in the region -pi to pi radians """ return angle_2_pi if (angle_2_pi >= 0.0) & (angle_2_pi <= np.pi) else angle_2_pi - 2 * np.pi @@ -149,8 +175,8 @@ def convert_angle_0_to_2_pi_to_minus_pi_to_pi(angle_2_pi: float) -> float: def calculate_position_at_certain_time( position: GeoPosition, lat_lon0: GeoPosition, - speed: float, - course: float, + sog: float, + cog: float, delta_time: float, ) -> GeoPosition: """ @@ -158,20 +184,28 @@ def calculate_position_at_certain_time( The calculated position is based on initial position and delta time, in addition to constant speed and course. - Params: - * position{lat, lon}: Initial ship position [rad] - * speed: Ship speed [m/s] - * course: Ship course [rad] - * delta_time: Delta time from now to the time new position is being calculated [minutes] + Parameters + ---------- + position : GeoPosition + Initial ship position {lat, lon} [rad] + lat_lon0 : GeoPosition + Reference position {lat, lon} [rad] + sog : float + Ship speed over ground[m/s] + cog : float + Ship course over ground [rad] + delta_time : float + Delta time from now to the time new position is being calculated [minutes] Returns ------- - * position{lat, lon}: Estimated ship position in delta time minutes [rad] + position : GeoPosition + Estimated ship position in delta time minutes {lat, lon} [rad] """ north, east, _ = llh2flat(position.lat, position.lon, lat_lon0.lat, lat_lon0.lon) - north = north + speed * delta_time * np.cos(course) - east = east + speed * delta_time * np.sin(course) + north = north + sog * delta_time * np.cos(cog) + east = east + sog * delta_time * np.sin(cog) lat_future, lon_future, _ = flat2llh(north, east, lat_lon0.lat, lat_lon0.lon) @@ -186,13 +220,17 @@ def calculate_distance(position_prev: GeoPosition, position_next: GeoPosition) - """ Calculate the distance in meter between two waypoints. - Params: - * position_prev{lat, lon}: Previous waypoint [rad] - * position_next{lat, lon}: Next waypoint [rad] + Parameters + ---------- + position_prev : GeoPosition + Previous waypoint {lat, lon}[rad] + position_next : GeoPosition + Next waypoint {lat, lon}[rad] Returns ------- - * distance: Distance between waypoints [m] + distance : float + Distance between waypoints [m] """ # Using position of previous waypoint as reference point north_next, east_next, _ = llh2flat(position_next.lat, position_next.lon, position_prev.lat, position_prev.lon) @@ -213,15 +251,19 @@ def calculate_position_along_track_using_waypoints( The position along the track is calculated based on initial position and delta time, and constant speed and course. - Params: - * position{lat, lon}: Initial ship position [rad] - * speed: Ship speed [m/s] - * course: Ship course [rad] - * delta_time: Delta time from now to the time new position is being calculated [sec] + Parameters + ---------- + waypoints: list[Waypoint] + List of ship waypoints Initial ship position {lat, lon}[rad] + inital_speed : float + Initial ship speed [m/s] + vector_time : float + Delta time from now to the time new position is being calculated [sec] Returns ------- - * position{lat, lon}: Estimated ship position in delta time minutes [rad] + position : GeoPosition + Estimated ship position in delta time seconds {lat, lon}[rad] """ time_in_transit: float = 0 @@ -251,13 +293,17 @@ def calculate_position_along_track_using_waypoints( def calculate_bearing_between_waypoints(position_prev: GeoPosition, position_next: GeoPosition) -> float: """Calculate the bearing in rad between two waypoints. - Params: - * position_prev{lat, lon}: Previous waypoint [rad] - * position_next{lat, lon}: Next waypoint [rad] + Parameters + ---------- + position_prev : GeoPosition + Previous waypoint {lat, lon}[rad] + position_next : GeoPosition + Next waypoint {lat, lon}[rad] Returns ------- - * bearing: Bearing between waypoints [m] + bearing : float + Bearing between waypoints [rad] """ # Using position of previous waypoint as reference point north_next, east_next, _ = llh2flat(position_next.lat, position_next.lon, position_prev.lat, position_prev.lon) @@ -271,14 +317,19 @@ def calculate_destination_along_track(position_prev: GeoPosition, distance: floa """ Calculate the destination along the track between two waypoints when distance along the track is given. - Params: - * position_prev{lat, lon}: Previous waypoint [rad] - * distance: Distance to travel [m] - * bearing: Bearing from previous waypoint to next waypoint [rad] + Parameters + ---------- + position_prev : GeoPosition + Previous waypoint {lat, lon}[rad] + distance : float + Distance to travel [m] + bearing : float + Bearing from previous waypoint to next waypoint [rad] Returns ------- - * destination{lat, lon}: Destination along the track [rad] + destination : GeoPosition + Destination along the track {lat, lon}[rad] """ north = distance * np.cos(bearing) east = distance * np.sin(bearing) diff --git a/src/trafficgen/write_traffic_situation_to_file.py b/src/trafficgen/write_traffic_situation_to_file.py index 96fd826..efd61e0 100644 --- a/src/trafficgen/write_traffic_situation_to_file.py +++ b/src/trafficgen/write_traffic_situation_to_file.py @@ -13,9 +13,12 @@ def write_traffic_situations_to_json_file(situations: list[TrafficSituation], wr """ Write traffic situations to json file. - Params: - * traffic_situations: Traffic situations to be written to file - * write_folder: Folder where the json files is to be written + Parameters + ---------- + traffic_situations : list[TrafficSituation] + List of traffic situations to be written to file + write_folder : Path + Path to the folder where the json files is to be written """ Path(write_folder).mkdir(parents=True, exist_ok=True) for i, situation in enumerate(situations): @@ -33,12 +36,15 @@ def convert_situation_data_from_si_units_to__maritime(situation: TrafficSituatio """ Convert situation data which is given in SI units to maritime units. - Params: - * situation: Traffic situation data + Parameters + ---------- + situation : TrafficSituation + Traffic situation data Returns ------- - * situation: Converted traffic situation data + situation : TrafficSituation + Converted traffic situation data """ assert situation.own_ship is not None situation.own_ship = convert_ship_data_from_si_units_to_maritime(situation.own_ship) @@ -54,12 +60,15 @@ def convert_ship_data_from_si_units_to_maritime(ship: T_ship) -> T_ship: """ Convert ship data which is given in SI units to maritime units. - Params: - * ship: Ship data + Parameters + ---------- + ship : T_ship + Ship data Returns ------- - * ship: Converted ship data + ship : T_ship + Converted ship data """ assert ship.initial is not None assert ship.initial.heading is not None From d8babdda7ec53b39e712cc921f4bc0dee67f264c Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Fri, 17 Jan 2025 13:06:30 +0100 Subject: [PATCH 15/23] #43 Updating documentation --- docs/source/_autosummary/trafficgen.read_files.rst | 1 - src/trafficgen/encounter.py | 3 ++- src/trafficgen/marine_system_simulator.py | 4 ++-- src/trafficgen/plot_traffic_situation.py | 3 ++- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/source/_autosummary/trafficgen.read_files.rst b/docs/source/_autosummary/trafficgen.read_files.rst index 696df7f..eb08b2c 100644 --- a/docs/source/_autosummary/trafficgen.read_files.rst +++ b/docs/source/_autosummary/trafficgen.read_files.rst @@ -10,7 +10,6 @@ .. autosummary:: camel_to_snake - check_input_units convert_encounters convert_keys_to_snake_case convert_own_ship_initial_data diff --git a/src/trafficgen/encounter.py b/src/trafficgen/encounter.py index 2ad2763..ca0fd02 100644 --- a/src/trafficgen/encounter.py +++ b/src/trafficgen/encounter.py @@ -840,7 +840,8 @@ def assign_beta_from_list(beta_limit: list[float]) -> float: The beta between own ship and target ship depending is somewhere between the limits given by beta_limit. - Params: + Parameters + ---------- beta_limit : list[float] Limits for beta {min, max} [rad] diff --git a/src/trafficgen/marine_system_simulator.py b/src/trafficgen/marine_system_simulator.py index 60001a9..552e52b 100644 --- a/src/trafficgen/marine_system_simulator.py +++ b/src/trafficgen/marine_system_simulator.py @@ -49,8 +49,8 @@ def flat2llh( Flat earth coordinate located at (lon_0, lat_0) z_n : float Ship position, down [m], default is 0.0 - * h_ref=0.0: Flat earth coordinate with reference h_ref in meters above the surface - of the ellipsoid + h_ref : float + Flat earth coordinate with reference h_ref in meters above the surface of the ellipsoid, default is 0.0 Returns ------- diff --git a/src/trafficgen/plot_traffic_situation.py b/src/trafficgen/plot_traffic_situation.py index d7b55df..da03068 100644 --- a/src/trafficgen/plot_traffic_situation.py +++ b/src/trafficgen/plot_traffic_situation.py @@ -336,7 +336,8 @@ def find_max_value_for_plot( """ Find the maximum deviation from the Reference point in north and east direction. - Params: + Parameters + ---------- ship : Ship Ship information max_value : float From 3e3523243be7a97725380ebc3cbed28b0bbb3346 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Fri, 17 Jan 2025 15:03:45 +0100 Subject: [PATCH 16/23] Removed the max speed output, updated the generated traffic situation files. #36 --- .../traffic_situation_01.json | 83 +++++---- .../traffic_situation_02.json | 81 +++++---- .../traffic_situation_03.json | 83 +++++---- .../traffic_situation_04.json | 81 +++++---- .../traffic_situation_05.json | 83 +++++---- .../traffic_situation_06.json | 124 +++++++------ .../traffic_situation_07.json | 120 +++++++------ .../traffic_situation_08.json | 126 +++++++------ .../traffic_situation_09.json | 124 +++++++------ .../traffic_situation_10.json | 122 +++++++------ .../traffic_situation_11.json | 122 +++++++------ .../traffic_situation_12.json | 124 +++++++------ .../traffic_situation_13.json | 119 ++++++++---- .../traffic_situation_14.json | 124 +++++++------ .../traffic_situation_15.json | 124 +++++++------ .../traffic_situation_16.json | 122 +++++++------ .../traffic_situation_17.json | 120 +++++++------ .../traffic_situation_18.json | 125 +++++++++++-- .../traffic_situation_19.json | 121 +++++++++---- .../traffic_situation_20.json | 122 +++++++------ .../traffic_situation_21.json | 159 +++++++++------- .../traffic_situation_22.json | 165 +++++++++-------- .../traffic_situation_23.json | 165 +++++++++-------- .../traffic_situation_24.json | 160 +++++++++++------ .../traffic_situation_25.json | 161 +++++++++-------- .../traffic_situation_26.json | 165 +++++++++-------- .../traffic_situation_27.json | 165 +++++++++-------- .../traffic_situation_28.json | 165 +++++++++-------- .../traffic_situation_29.json | 167 +++++++++-------- .../traffic_situation_30.json | 165 +++++++++-------- .../traffic_situation_31.json | 161 +++++++++-------- .../traffic_situation_32.json | 162 +++++++++++------ .../traffic_situation_33.json | 159 ++++++++++++---- .../traffic_situation_34.json | 167 +++++++++-------- .../traffic_situation_35.json | 167 +++++++++-------- .../traffic_situation_36.json | 165 +++++++++-------- .../traffic_situation_37.json | 167 +++++++++-------- .../traffic_situation_38.json | 163 +++++++++-------- .../traffic_situation_39.json | 167 +++++++++-------- .../traffic_situation_40.json | 167 +++++++++-------- .../traffic_situation_41.json | 167 +++++++++-------- .../traffic_situation_42.json | 159 +++++++++------- .../traffic_situation_43.json | 157 ++++++++++++---- .../traffic_situation_44.json | 160 +++++++++++------ .../traffic_situation_45.json | 167 +++++++++-------- .../traffic_situation_46.json | 165 +++++++++-------- .../traffic_situation_47.json | 169 ++++++++++-------- .../traffic_situation_48.json | 162 +++++++++++------ .../traffic_situation_49.json | 157 ++++++++++++---- .../traffic_situation_50.json | 160 +++++++++++------ .../traffic_situation_51.json | 165 +++++++++-------- .../traffic_situation_52.json | 165 +++++++++++++++-- .../traffic_situation_53.json | 159 ++++++++++++---- .../traffic_situation_54.json | 162 +++++++++++------ .../traffic_situation_55.json | 169 ++++++++++-------- .../settings/encounter_settings.json | 4 +- .../write_traffic_situation_to_file.py | 20 ++- 57 files changed, 4889 insertions(+), 3110 deletions(-) diff --git a/data/baseline_situations_generated/traffic_situation_01.json b/data/baseline_situations_generated/traffic_situation_01.json index 9ac227c..b814c7e 100644 --- a/data/baseline_situations_generated/traffic_situation_01.json +++ b/data/baseline_situations_generated/traffic_situation_01.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO", "description": "A head on situation with one target ship.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,73 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "831e1ab2-8600-42cf-a91b-512230d49af7", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.84117519, - "lon": 10.49587268 + "lon": 10.49680582, + "lat": 58.85500037 }, "sog": 12.1, - "cog": 183.12, - "heading": 183.12, + "cog": 183.63, + "heading": 183.63, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.84117519, - "lon": 10.49587268 + "lon": 10.49680582, + "lat": 58.85500037 } }, { "position": { - "lat": 58.80782874, - "lon": 10.49237693 + "lon": 10.48458595, + "lat": 58.75501409 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_02.json b/data/baseline_situations_generated/traffic_situation_02.json index 52f4088..2041cc0 100644 --- a/data/baseline_situations_generated/traffic_situation_02.json +++ b/data/baseline_situations_generated/traffic_situation_02.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW", "description": "A crossing situation with one target ship. Own ship is give-way.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,73 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "0482dfbe-fe16-46db-8dfc-eab8cd6bca1f", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.81117278, - "lon": 10.52409158 + "lon": 10.52697741, + "lat": 58.81530237 }, "sog": 8.0, - "cog": 220.93, - "heading": 220.93, + "cog": 225.4, + "heading": 225.4, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.81117278, - "lon": 10.52409158 + "lon": 10.52697741, + "lat": 58.81530237 } }, { "position": { - "lat": 58.79448844, - "lon": 10.49624045 + "lon": 10.43617067, + "lat": 58.76878387 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_03.json b/data/baseline_situations_generated/traffic_situation_03.json index 62e94a9..ea479b9 100644 --- a/data/baseline_situations_generated/traffic_situation_03.json +++ b/data/baseline_situations_generated/traffic_situation_03.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-SO", "description": "A crossing situation with one target ship. Own ship is stand-on.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,73 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "8a650f7e-fb26-426d-8549-dd11fc370fb1", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.80568759, - "lon": 10.44372042 + "lon": 10.43613433, + "lat": 58.81250143 }, "sog": 6.0, - "cog": 120.78, - "heading": 120.78, + "cog": 93.97, + "heading": 93.97, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.80568759, - "lon": 10.44372042 + "lon": 10.43613433, + "lat": 58.81250143 } }, { "position": { - "lat": 58.79714267, - "lon": 10.47133461 + "lon": 10.53232818, + "lat": 58.80903752 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_04.json b/data/baseline_situations_generated/traffic_situation_04.json index a581694..48c522f 100644 --- a/data/baseline_situations_generated/traffic_situation_04.json +++ b/data/baseline_situations_generated/traffic_situation_04.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "OT-GW", "description": "A overting situation with one target ship. Own ship is give-way.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,73 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "c100dcad-206c-4ec2-83c6-86de7ca39221", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.77167228, - "lon": 10.49490498 + "lon": 10.50093584, + "lat": 58.78336982 }, "sog": 5.1, - "cog": 353.51, - "heading": 353.51, + "cog": 344.18, + "heading": 344.18, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.77167228, - "lon": 10.49490498 + "lon": 10.50093584, + "lat": 58.78336982 } }, { "position": { - "lat": 58.78558739, - "lon": 10.4918603 + "lon": 10.47888298, + "lat": 58.82379175 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_05.json b/data/baseline_situations_generated/traffic_situation_05.json index 26224eb..92b9fc5 100644 --- a/data/baseline_situations_generated/traffic_situation_05.json +++ b/data/baseline_situations_generated/traffic_situation_05.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "OT-SO", "description": "A overtaking situation with one target ship. Own ship is stand-on.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,73 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "42f738ce-1f6d-4bcb-96ec-8fbc0795741a", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.70853434, - "lon": 10.46233142 + "lon": 10.47731353, + "lat": 58.73759413 }, - "sog": 15.9, - "cog": 10.08, - "heading": 10.08, + "sog": 15.0, + "cog": 5.04, + "heading": 5.04, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.70853434, - "lon": 10.46233142 + "lon": 10.47731353, + "lat": 58.73759413 } }, { "position": { - "lat": 58.75202075, - "lon": 10.47721773 + "lon": 10.4983629, + "lat": 58.86153921 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_06.json b/data/baseline_situations_generated/traffic_situation_06.json index ee1a45d..46f35a3 100644 --- a/data/baseline_situations_generated/traffic_situation_06.json +++ b/data/baseline_situations_generated/traffic_situation_06.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, HO", "description": "Head-on situations with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "d97b0f47-c470-44be-916b-f2e46429bff3", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.81839957, - "lon": 10.488805 + "lon": 10.48871859, + "lat": 58.8211646 }, "sog": 8.9, - "cog": 177.96, - "heading": 177.96, + "cog": 177.9, + "heading": 177.9, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.81839957, - "lon": 10.488805 + "lon": 10.48871859, + "lat": 58.8211646 } }, { "position": { - "lat": 58.79363768, - "lon": 10.49050219 + "lon": 10.49395317, + "lat": 58.74688162 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "0c8db8b3-7e6b-4a4c-93f3-f01994278ae1", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_2", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.83385863, - "lon": 10.50012366 + "lon": 10.50160978, + "lat": 58.84484694 }, "sog": 11.1, - "cog": 186.56, - "heading": 186.56, + "cog": 187.59, + "heading": 187.59, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.83385863, - "lon": 10.50012366 + "lon": 10.50160978, + "lat": 58.84484694 } }, { "position": { - "lat": 58.80335669, - "lon": 10.49337704 + "lon": 10.47820289, + "lat": 58.75354521 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_07.json b/data/baseline_situations_generated/traffic_situation_07.json index 3970d19..53b8936 100644 --- a/data/baseline_situations_generated/traffic_situation_07.json +++ b/data/baseline_situations_generated/traffic_situation_07.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, CR-GW", "description": "A head-on and crossing give-way situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,68 +16,79 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "3fab281a-7da8-4412-844c-5bc4a21c063f", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.86837667, - "lon": 10.47653591 + "lon": 10.4728379, + "lat": 58.8958744 }, "sog": 14.0, - "cog": 174.58, - "heading": 174.58, + "cog": 173.15, + "heading": 173.15, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.86837667, - "lon": 10.47653591 + "lon": 10.4728379, + "lat": 58.8958744 } }, { "position": { - "lat": 58.82976775, - "lon": 10.48358685 + "lon": 10.49955736, + "lat": 58.78035852 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, { - "static": { - "id": "35f3c17a-93ae-41a7-8806-96b6a6f1d3f6", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.79364892, - "lon": 10.53288731 + "lon": 10.53288731, + "lat": 58.79364892 }, "sog": 8.0, "cog": 263.5, @@ -96,17 +98,31 @@ "waypoints": [ { "position": { - "lat": 58.79364892, - "lon": 10.53288731 + "lon": 10.53288731, + "lat": 58.79364892 } }, { "position": { - "lat": 58.79115016, - "lon": 10.4906505 + "lon": 10.40617688, + "lat": 58.78615264 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_08.json b/data/baseline_situations_generated/traffic_situation_08.json index 4522456..7d4faf8 100644 --- a/data/baseline_situations_generated/traffic_situation_08.json +++ b/data/baseline_situations_generated/traffic_situation_08.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, CR-SO", "description": "A head-on and crossing stand-on situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "960f3b94-44a3-4626-bc20-3c0f613e2d75", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.86111396, - "lon": 10.50380439 + "lon": 10.50456473, + "lat": 58.86680563 }, - "sog": 16.9, - "cog": 185.58, - "heading": 185.58, + "sog": 15.0, + "cog": 186.67, + "heading": 186.67, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.86111396, - "lon": 10.50380439 + "lon": 10.50456473, + "lat": 58.86680563 } }, { "position": { - "lat": 58.81447416, - "lon": 10.49503177 + "lon": 10.47674734, + "lat": 58.74322116 } } - ] - }, - { + ], "static": { - "id": "238c3a83-f3bb-4540-a720-5c4f5d500736", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, "shipType": "Cargo" - }, + } + }, + { "initial": { "position": { - "lat": 58.80071412, - "lon": 10.4385363 + "lon": 10.43573688, + "lat": 58.80271608 }, "sog": 8.0, - "cog": 109.43, - "heading": 109.43, + "cog": 96.49, + "heading": 96.49, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.80071412, - "lon": 10.4385363 + "lon": 10.43573688, + "lat": 58.80271608 } }, { "position": { - "lat": 58.79336585, - "lon": 10.47862388 + "lon": 10.56244998, + "lat": 58.79523199 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_09.json b/data/baseline_situations_generated/traffic_situation_09.json index 318aa6c..0a7c761 100644 --- a/data/baseline_situations_generated/traffic_situation_09.json +++ b/data/baseline_situations_generated/traffic_situation_09.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, OT-GW", "description": "A head-on and overtaking give-way situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "86c0c0b8-886d-4f0d-90ea-ab8f8367375a", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.83100382, - "lon": 10.48610925 + "lon": 10.48555628, + "lat": 58.83929892 }, "sog": 11.1, - "cog": 176.59, - "heading": 176.59, + "cog": 176.18, + "heading": 176.18, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.83100382, - "lon": 10.48610925 + "lon": 10.48555628, + "lat": 58.83929892 } }, { "position": { - "lat": 58.80035566, - "lon": 10.48962903 + "lon": 10.49735423, + "lat": 58.74739511 } } - ] - }, - { + ], "static": { - "id": "15b167ea-e6b0-4327-b510-12b57861f131", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.76877259, - "lon": 10.49245116 + "lon": 10.49820554, + "lat": 58.78572189 }, "sog": 5.1, - "cog": 357.58, - "heading": 357.58, + "cog": 349.91, + "heading": 349.91, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.76877259, - "lon": 10.49245116 + "lon": 10.49820554, + "lat": 58.78572189 } }, { "position": { - "lat": 58.78276485, - "lon": 10.49131429 + "lon": 10.48403063, + "lat": 58.82708565 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_10.json b/data/baseline_situations_generated/traffic_situation_10.json index fb60e5f..2c46bbe 100644 --- a/data/baseline_situations_generated/traffic_situation_10.json +++ b/data/baseline_situations_generated/traffic_situation_10.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, OT-SO", "description": "A head-on and overtaking stand-on situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,33 +16,39 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "74b2d8bc-bd2f-43e6-b9c3-b78480b593ba", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.83785356, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.85725369 }, "sog": 9.9, "cog": 180.02, @@ -61,52 +58,71 @@ "waypoints": [ { "position": { - "lat": 58.83785356, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.85725369 } }, { "position": { - "lat": 58.81038277, - "lon": 10.49063246 + "lon": 10.49058938, + "lat": 58.77484131 } } - ] - }, - { + ], "static": { - "id": "618785ce-4350-4752-aeaa-416caa2f26ff", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.71205347, - "lon": 10.49756616 + "lon": 10.49452481, + "lat": 58.7347483 }, - "sog": 19.1, - "cog": 357.41, - "heading": 357.41, + "sog": 16.9, + "cog": 358.39, + "heading": 358.39, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.71205347, - "lon": 10.49756616 + "lon": 10.49452481, + "lat": 58.7347483 } }, { "position": { - "lat": 58.76478662, - "lon": 10.4929765 + "lon": 10.48689856, + "lat": 58.8752783 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_11.json b/data/baseline_situations_generated/traffic_situation_11.json index daf6eb3..c9c3bd1 100644 --- a/data/baseline_situations_generated/traffic_situation_11.json +++ b/data/baseline_situations_generated/traffic_situation_11.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, CR-GW", "description": "Two crossing give-way situations with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "584396d0-b857-464a-be74-3de88c809064", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.85321387, - "lon": 10.54679803 + "lon": 10.5600521, + "lat": 58.87441845 }, "sog": 13.0, - "cog": 205.18, - "heading": 205.18, + "cog": 211.71, + "heading": 211.71, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.85321387, - "lon": 10.54679803 + "lon": 10.5600521, + "lat": 58.87441845 } }, { "position": { - "lat": 58.8205531, - "lon": 10.51724645 + "lon": 10.45051847, + "lat": 58.78231131 } } - ] - }, - { + ], "static": { - "id": "f44400d1-df41-42d7-9015-de6fed6212a3", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.75394195, - "lon": 10.57672769 + "lon": 10.55272521, + "lat": 58.75659028 }, "sog": 14.0, - "cog": 309.74, - "heading": 309.74, + "cog": 326.36, + "heading": 326.36, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75394195, - "lon": 10.57672769 + "lon": 10.55272521, + "lat": 58.75659028 } }, { "position": { - "lat": 58.77873617, - "lon": 10.5193251 + "lon": 10.4286502, + "lat": 58.85344947 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_12.json b/data/baseline_situations_generated/traffic_situation_12.json index 224bef7..2b7047f 100644 --- a/data/baseline_situations_generated/traffic_situation_12.json +++ b/data/baseline_situations_generated/traffic_situation_12.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, CR-SO", "description": "A crossing give-way and crossing stand-on situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "a6668e31-c0a0-4f1b-9105-b553ebfd179f", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.81997959, - "lon": 10.5994687 + "lon": 10.61125394, + "lat": 58.82610217 }, "sog": 12.1, - "cog": 242.99, - "heading": 242.99, + "cog": 260.92, + "heading": 260.92, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.81997959, - "lon": 10.5994687 + "lon": 10.61125394, + "lat": 58.82610217 } }, { "position": { - "lat": 58.80481372, - "lon": 10.54219642 + "lon": 10.42081859, + "lat": 58.81029982 } } - ] - }, - { + ], "static": { - "id": "8025dec0-96fa-4dfe-9a9f-6faef3c89b39", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.75617732, - "lon": 10.40223017 + "lon": 10.4322808, + "lat": 58.7586461 }, "sog": 13.0, - "cog": 52.71, - "heading": 52.71, + "cog": 31.68, + "heading": 31.68, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75617732, - "lon": 10.40223017 + "lon": 10.4322808, + "lat": 58.7586461 } }, { "position": { - "lat": 58.77804081, - "lon": 10.45749841 + "lon": 10.5417422, + "lat": 58.8507764 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_13.json b/data/baseline_situations_generated/traffic_situation_13.json index 7589a52..63c00e5 100644 --- a/data/baseline_situations_generated/traffic_situation_13.json +++ b/data/baseline_situations_generated/traffic_situation_13.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, OT-GW", "description": "A crossing give-way and overtaking give-way situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { + "initial": { + "position": { + "lon": 10.63373574, + "lat": 58.8063609 + }, + "sog": 15.0, + "cog": 275.36, + "heading": 275.36, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.63373574, + "lat": 58.8063609 + } + }, + { + "position": { + "lon": 10.39527798, + "lat": 58.81799159 + } + } + ], "static": { - "id": "54f7a3b1-781a-4ef9-b1e6-14ee3ea54e37", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, + "id": 10, "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, "shipType": "Cargo" - }, + } + }, + { "initial": { "position": { - "lat": 58.8057235, - "lon": 10.63159297 + "lon": 10.50983525, + "lat": 58.77768713 }, - "sog": 15.0, - "cog": 258.75, - "heading": 258.75, + "sog": 7.0, + "cog": 339.94, + "heading": 339.94, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.8057235, - "lon": 10.63159297 + "lon": 10.50983525, + "lat": 58.77768713 } }, { "position": { - "lat": 58.79763043, - "lon": 10.55329214 + "lon": 10.47141908, + "lat": 58.83232999 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_14.json b/data/baseline_situations_generated/traffic_situation_14.json index 288166a..d65bedd 100644 --- a/data/baseline_situations_generated/traffic_situation_14.json +++ b/data/baseline_situations_generated/traffic_situation_14.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, OT-SO", "description": "A crossing give-way and overtaking stand-on situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "0730c9b8-bf79-4697-98b9-b8701156e32c", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.76938305, - "lon": 10.55540367 + "lon": 10.54539832, + "lat": 58.76846736 }, "sog": 12.1, - "cog": 302.92, - "heading": 302.92, + "cog": 314.78, + "heading": 314.78, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.76938305, - "lon": 10.55540367 + "lon": 10.54539832, + "lat": 58.76846736 } }, { "position": { - "lat": 58.78753398, - "lon": 10.50144419 + "lon": 10.40851781, + "lat": 58.83904189 } } - ] - }, - { + ], "static": { - "id": "0ce05829-8d8c-485d-b269-548613d4acb9", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.72454999, - "lon": 10.44741843 + "lon": 10.4606725, + "lat": 58.73646298 }, "sog": 16.9, - "cog": 18.62, - "heading": 18.62, + "cog": 12.78, + "heading": 12.78, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.72454999, - "lon": 10.44741843 + "lon": 10.4606725, + "lat": 58.73646298 } }, { "position": { - "lat": 58.76895875, - "lon": 10.47622127 + "lon": 10.52051986, + "lat": 58.87356769 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_15.json b/data/baseline_situations_generated/traffic_situation_15.json index 6e6669d..fbc7518 100644 --- a/data/baseline_situations_generated/traffic_situation_15.json +++ b/data/baseline_situations_generated/traffic_situation_15.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-SO, CR-SO", "description": "Two crossing stand-on situations with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "2115262c-7370-4b46-8451-d7ce8a8ad67c", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.76931123, - "lon": 10.36160394 + "lon": 10.38187386, + "lat": 58.76839554 }, "sog": 15.0, - "cog": 71.96, - "heading": 71.96, + "cog": 53.29, + "heading": 53.29, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.76931123, - "lon": 10.36160394 + "lon": 10.38187386, + "lat": 58.76839554 } }, { "position": { - "lat": 58.782153, - "lon": 10.43751625 + "lon": 10.57386696, + "lat": 58.84278196 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "7168451e-d929-4f7e-a004-4655c112c734", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.75379831, - "lon": 10.38532994 + "lon": 10.4155188, + "lat": 58.75656335 }, - "sog": 15.9, - "cog": 55.69, - "heading": 55.69, + "sog": 15.0, + "cog": 38.85, + "heading": 38.85, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75379831, - "lon": 10.38532994 + "lon": 10.4155188, + "lat": 58.75656335 } }, { "position": { - "lat": 58.77869396, - "lon": 10.45555736 + "lon": 10.56574599, + "lat": 58.85347032 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_16.json b/data/baseline_situations_generated/traffic_situation_16.json index 0d14999..6cc20d6 100644 --- a/data/baseline_situations_generated/traffic_situation_16.json +++ b/data/baseline_situations_generated/traffic_situation_16.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-SO, OT-SO", "description": "A crossing stand-on and overtaking stand-on situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "d58f83cd-3f39-47e6-90a8-079f11ff3a15", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.75206568, - "lon": 10.40884857 + "lon": 10.43997058, + "lat": 58.75639278 }, "sog": 13.0, - "cog": 47.38, - "heading": 47.38, + "cog": 27.16, + "heading": 27.16, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75206568, - "lon": 10.40884857 + "lon": 10.43997058, + "lat": 58.75639278 } }, { "position": { - "lat": 58.77650111, - "lon": 10.45996974 + "lon": 10.53509529, + "lat": 58.85272352 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } }, { - "static": { - "id": "9617c19a-450b-44ba-90ba-bcac297fd9e8", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.72568114, - "lon": 10.47117898 + "lon": 10.47809115, + "lat": 58.73908438 }, "sog": 15.9, - "cog": 8.77, - "heading": 8.77, + "cog": 5.67, + "heading": 5.67, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.72568114, - "lon": 10.47117898 + "lon": 10.47809115, + "lat": 58.73908438 } }, { "position": { - "lat": 58.76933391, - "lon": 10.48413629 + "lon": 10.50330074, + "lat": 58.87094176 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_17.json b/data/baseline_situations_generated/traffic_situation_17.json index a1403f4..2df09fb 100644 --- a/data/baseline_situations_generated/traffic_situation_17.json +++ b/data/baseline_situations_generated/traffic_situation_17.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-SO, OT-GW", "description": "A crossing stand-on and overtaking give-way situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,68 +16,79 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "d41038e9-3ffb-4c66-b858-cee2aa9066e5", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.75645562, - "lon": 10.44043715 + "lon": 10.4597048, + "lat": 58.75913986 }, "sog": 12.1, - "cog": 36.96, - "heading": 36.96, + "cog": 21.72, + "heading": 21.72, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75645562, - "lon": 10.44043715 + "lon": 10.4597048, + "lat": 58.75913986 } }, { "position": { - "lat": 58.78314225, - "lon": 10.47908405 + "lon": 10.53105742, + "lat": 58.85221766 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } }, { - "static": { - "id": "6bcfa700-9a3a-4126-9ce3-5b4a25f6daa8", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.76933816, - "lon": 10.49720327 + "lon": 10.49720327, + "lat": 58.76933816 }, "sog": 8.0, "cog": 351.11, @@ -96,17 +98,31 @@ "waypoints": [ { "position": { - "lat": 58.76933816, - "lon": 10.49720327 + "lon": 10.49720327, + "lat": 58.76933816 } }, { "position": { - "lat": 58.79115714, - "lon": 10.49063282 + "lon": 10.47749193, + "lat": 58.83479509 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_18.json b/data/baseline_situations_generated/traffic_situation_18.json index 04f65fa..557831f 100644 --- a/data/baseline_situations_generated/traffic_situation_18.json +++ b/data/baseline_situations_generated/traffic_situation_18.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "OT-GW, OT-GW", "description": "A overtaking give-way and overtaking give-way situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,17 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, - "targetShips": [] -} + "targetShips": [ + { + "initial": { + "position": { + "lon": 10.49718599, + "lat": 58.77612507 + }, + "sog": 7.0, + "cog": 353.29, + "heading": 353.29, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.49718599, + "lat": 58.77612507 + } + }, + { + "position": { + "lon": 10.48409394, + "lat": 58.83389954 + } + } + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } + }, + { + "initial": { + "position": { + "lon": 10.51106216, + "lat": 58.78618871 + }, + "sog": 6.0, + "cog": 340.45, + "heading": 340.45, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.51106216, + "lat": 58.78618871 + } + }, + { + "position": { + "lon": 10.47879805, + "lat": 58.83339505 + } + } + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } + } + ] +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_19.json b/data/baseline_situations_generated/traffic_situation_19.json index 13551c7..4dc0071 100644 --- a/data/baseline_situations_generated/traffic_situation_19.json +++ b/data/baseline_situations_generated/traffic_situation_19.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "OT-GW, OT-SO", "description": "A overtaking give-way and overtaking stand-on situation with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "ad6892d7-4529-47c9-95a2-486683723021", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", - "shipType": "Cargo" + "initial": { + "position": { + "lon": 10.50682846, + "lat": 58.78654781 + }, + "sog": 6.0, + "cog": 345.44, + "heading": 345.44, + "navStatus": "Under way using engine" }, + "waypoints": [ + { + "position": { + "lon": 10.50682846, + "lat": 58.78654781 + } + }, + { + "position": { + "lon": 10.48258181, + "lat": 58.83503202 + } + } + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } + }, + { "initial": { "position": { - "lat": 58.7293888, - "lon": 10.49639109 + "lon": 10.49452481, + "lat": 58.74043996 }, "sog": 15.9, - "cog": 357.24, - "heading": 357.24, + "cog": 358.16, + "heading": 358.16, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.7293888, - "lon": 10.49639109 + "lon": 10.49452481, + "lat": 58.74043996 } }, { "position": { - "lat": 58.77350627, - "lon": 10.49229598 + "lon": 10.48631708, + "lat": 58.87287753 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_20.json b/data/baseline_situations_generated/traffic_situation_20.json index 0f035dd..a13059c 100644 --- a/data/baseline_situations_generated/traffic_situation_20.json +++ b/data/baseline_situations_generated/traffic_situation_20.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "OT-SO, OT-SO", "description": "Two overtaking stand-on situations with two target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,113 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "539f6ee2-8f63-4451-8c8d-af739a74d363", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.71787082, - "lon": 10.52258819 + "lon": 10.51351597, + "lat": 58.73081621 }, "sog": 18.1, - "cog": 347.27, - "heading": 347.27, + "cog": 350.88, + "heading": 350.88, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.71787082, - "lon": 10.52258819 + "lon": 10.51351597, + "lat": 58.73081621 } }, { "position": { - "lat": 58.76673323, - "lon": 10.50133988 + "lon": 10.46766204, + "lat": 58.87919758 } } - ] - }, - { + ], "static": { - "id": "177085c1-df1a-4457-b187-807e368383b0", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.73743254, - "lon": 10.49948429 + "lon": 10.49670214, + "lat": 58.74564685 }, "sog": 15.0, - "cog": 355.12, - "heading": 355.12, + "cog": 356.67, + "heading": 356.67, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.73743254, - "lon": 10.49948429 + "lon": 10.49670214, + "lat": 58.74564685 } }, { "position": { - "lat": 58.77875766, - "lon": 10.4926917 + "lon": 10.48277425, + "lat": 58.86986283 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_21.json b/data/baseline_situations_generated/traffic_situation_21.json index 7c0ab21..8759444 100644 --- a/data/baseline_situations_generated/traffic_situation_21.json +++ b/data/baseline_situations_generated/traffic_situation_21.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, HO, HO", "description": "Three head-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,68 +16,79 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "2476955c-9f81-4c26-ab26-1b23004c940f", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.85453354, - "lon": 10.48453674 + "lon": 10.48286054, + "lat": 58.87941885 }, "sog": 12.1, - "cog": 177.1, - "heading": 177.1, + "cog": 176.36, + "heading": 176.36, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.85453354, - "lon": 10.48453674 + "lon": 10.48286054, + "lat": 58.87941885 } }, { "position": { - "lat": 58.8211804, - "lon": 10.4877876 + "lon": 10.49511607, + "lat": 58.77943375 } } - ] - }, - { + ], "static": { - "id": "71f6c9e8-3da9-42de-b811-c8bc7e2c42a6", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.83510648, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8517326 }, "sog": 9.9, "cog": 180.02, @@ -96,52 +98,71 @@ "waypoints": [ { "position": { - "lat": 58.83510648, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8517326 } }, { "position": { - "lat": 58.80763569, - "lon": 10.49063246 + "lon": 10.49058938, + "lat": 58.76932022 } } - ] - }, - { + ], "static": { - "id": "b866fd23-6db8-4d45-90ab-9a95dabe348c", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.8489137, - "lon": 10.50216275 + "lon": 10.50363158, + "lat": 58.85991099 }, "sog": 15.0, - "cog": 185.92, - "heading": 185.92, + "cog": 186.67, + "heading": 186.67, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.8489137, - "lon": 10.50216275 + "lon": 10.50363158, + "lat": 58.85991099 } }, { "position": { - "lat": 58.80765974, - "lon": 10.49392188 + "lon": 10.4758142, + "lat": 58.73632653 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_22.json b/data/baseline_situations_generated/traffic_situation_22.json index fb225dd..89f611e 100644 --- a/data/baseline_situations_generated/traffic_situation_22.json +++ b/data/baseline_situations_generated/traffic_situation_22.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, HO, CR-GW", "description": "Two head-on situations and one grossing give-way situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "b0173d41-3df2-42f2-bf27-065526ec1de3", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.86465105, - "lon": 10.48044128 + "lon": 10.47793562, + "lat": 58.8894825 }, "sog": 14.0, - "cog": 175.9, - "heading": 175.9, + "cog": 174.87, + "heading": 174.87, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.86465105, - "lon": 10.48044128 + "lon": 10.47793562, + "lat": 58.8894825 } }, { "position": { - "lat": 58.8259681, - "lon": 10.4857812 + "lon": 10.49797343, + "lat": 58.77360223 } } - ] - }, - { + ], "static": { - "id": "e1805a47-bc89-4a56-9e90-3b7a99525162", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.84602298, - "lon": 10.49620101 + "lon": 10.49806729, + "lat": 58.87367333 }, "sog": 9.9, - "cog": 183.0, - "heading": 183.0, + "cog": 184.03, + "heading": 184.03, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.84602298, - "lon": 10.49620101 + "lon": 10.49806729, + "lat": 58.87367333 } }, { "position": { - "lat": 58.8185899, - "lon": 10.49343108 + "lon": 10.48690751, + "lat": 58.79146512 } } - ] - }, - { + ], "static": { - "id": "4f043257-85bc-459d-a83b-5792e66cd5f5", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.80894638, - "lon": 10.5590844 + "lon": 10.56715435, + "lat": 58.81431486 }, "sog": 8.0, - "cog": 243.39, - "heading": 243.39, + "cog": 268.55, + "heading": 268.55, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.80894638, - "lon": 10.5590844 + "lon": 10.56715435, + "lat": 58.81431486 } }, { "position": { - "lat": 58.79905531, - "lon": 10.52107659 + "lon": 10.43966607, + "lat": 58.81263294 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_23.json b/data/baseline_situations_generated/traffic_situation_23.json index fd17968..1cf183d 100644 --- a/data/baseline_situations_generated/traffic_situation_23.json +++ b/data/baseline_situations_generated/traffic_situation_23.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, HO, CR-SO", "description": "Two head-on situations and one grossing stand-on situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "04d3643f-f8f5-4c59-ba7a-920dd5456ba8", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.8570113, - "lon": 10.50641373 + "lon": 10.50917859, + "lat": 58.87343991 }, "sog": 15.0, - "cog": 187.07, - "heading": 187.07, + "cog": 188.33, + "heading": 188.33, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.8570113, - "lon": 10.50641373 + "lon": 10.50917859, + "lat": 58.87343991 } }, { "position": { - "lat": 58.81585121, - "lon": 10.49658643 + "lon": 10.4744752, + "lat": 58.75032644 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } }, { - "static": { - "id": "45d1235f-1400-41d3-9647-4becc5eecd9d", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.86120374, - "lon": 10.49722055 + "lon": 10.49766984, + "lat": 58.86774825 }, - "sog": 18.1, - "cog": 182.77, - "heading": 182.77, + "sog": 16.9, + "cog": 183.17, + "heading": 183.17, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.86120374, - "lon": 10.49722055 + "lon": 10.49766984, + "lat": 58.86774825 } }, { "position": { - "lat": 58.81116861, - "lon": 10.49255471 + "lon": 10.48268367, + "lat": 58.72737815 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, { - "static": { - "id": "255db573-6ffa-4cdd-abc4-3224113581ef", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_3", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.80382927, - "lon": 10.43207343 + "lon": 10.42758053, + "lat": 58.80692647 }, "sog": 7.0, - "cog": 112.59, - "heading": 112.59, + "cog": 83.71, + "heading": 83.71, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.80382927, - "lon": 10.43207343 + "lon": 10.42758053, + "lat": 58.80692647 } }, { "position": { - "lat": 58.79638166, - "lon": 10.46653633 + "lon": 10.53888327, + "lat": 58.81330088 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_24.json b/data/baseline_situations_generated/traffic_situation_24.json index 093d2a5..5231132 100644 --- a/data/baseline_situations_generated/traffic_situation_24.json +++ b/data/baseline_situations_generated/traffic_situation_24.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, HO, OT-GW", "description": "Two head-on situations and one overtaking give-way situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "0f826cad-825d-4867-974a-f567c33f120c", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.84442501, - "lon": 10.48248037 + "lon": 10.48082145, + "lat": 58.86097033 }, "sog": 12.1, - "cog": 175.44, - "heading": 175.44, + "cog": 174.52, + "heading": 174.52, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.84442501, - "lon": 10.48248037 + "lon": 10.48082145, + "lat": 58.86097033 } }, { "position": { - "lat": 58.81113486, - "lon": 10.48759143 + "lon": 10.49922836, + "lat": 58.76124012 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { + "initial": { + "position": { + "lon": 10.49715143, + "lat": 58.86020725 + }, + "sog": 15.0, + "cog": 183.35, + "heading": 183.35, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.49715143, + "lat": 58.86020725 + } + }, + { + "position": { + "lon": 10.48317045, + "lat": 58.73599288 + } + } + ], "static": { - "id": "a4401792-fd27-4b8d-8243-125b7be5a811", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, + "id": 10, "name": "target_ship_2", - "shipType": "Passenger" - }, + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } + }, + { "initial": { "position": { - "lat": 58.86120374, - "lon": 10.49722055 + "lon": 10.49813641, + "lat": 58.79112628 }, - "sog": 18.1, - "cog": 182.77, - "heading": 182.77, + "sog": 5.1, + "cog": 352.03, + "heading": 352.03, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.86120374, - "lon": 10.49722055 + "lon": 10.49813641, + "lat": 58.79112628 } }, { "position": { - "lat": 58.81116861, - "lon": 10.49255471 + "lon": 10.48691649, + "lat": 58.83273413 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_25.json b/data/baseline_situations_generated/traffic_situation_25.json index 163d021..2595f7a 100644 --- a/data/baseline_situations_generated/traffic_situation_25.json +++ b/data/baseline_situations_generated/traffic_situation_25.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, HO, OT-SO", "description": "Two head-on situations and one overtaking stand-on situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,68 +16,79 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "d5cb10ba-1303-42ff-b8a9-ee1009e8d858", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.8704684, - "lon": 10.47624214 + "lon": 10.47365008, + "lat": 58.88972489 }, "sog": 16.9, - "cog": 174.58, - "heading": 174.58, + "cog": 173.61, + "heading": 173.61, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.8704684, - "lon": 10.47624214 + "lon": 10.47365008, + "lat": 58.88972489 } }, { "position": { - "lat": 58.82381595, - "lon": 10.48476203 + "lon": 10.50378566, + "lat": 58.75001349 } } - ] - }, - { + ], "static": { - "id": "6b037b0a-96bc-4a08-966f-42c4d2456d77", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.84528684, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.85914792 }, "sog": 13.0, "cog": 180.02, @@ -96,52 +98,71 @@ "waypoints": [ { "position": { - "lat": 58.84528684, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.85914792 } }, { "position": { - "lat": 58.80919775, - "lon": 10.4906257 + "lon": 10.49056911, + "lat": 58.75088067 } } - ] - }, - { + ], "static": { - "id": "1567f3cd-9ee4-43ef-9511-9f80e6e726cc", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.72882323, - "lon": 10.51230635 + "lon": 10.50473753, + "lat": 58.7409427 }, - "sog": 19.1, - "cog": 349.79, - "heading": 349.79, + "sog": 16.9, + "cog": 352.54, + "heading": 352.54, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.72882323, - "lon": 10.51230635 + "lon": 10.50473753, + "lat": 58.7409427 } }, { "position": { - "lat": 58.78077447, - "lon": 10.49429681 + "lon": 10.46960737, + "lat": 58.88033888 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_26.json b/data/baseline_situations_generated/traffic_situation_26.json index 2ae659b..56ce0fa 100644 --- a/data/baseline_situations_generated/traffic_situation_26.json +++ b/data/baseline_situations_generated/traffic_situation_26.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, CR-GW, CR-GW", "description": "Head-on situation and two grossing give-way situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "ef4fb9a9-90b4-444c-af6c-1dc2d9c79fcc", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.87390674, - "lon": 10.50179986 + "lon": 10.50458201, + "lat": 58.90150322 }, "sog": 15.0, - "cog": 183.98, - "heading": 183.98, + "cog": 185.01, + "heading": 185.01, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.87390674, - "lon": 10.50179986 + "lon": 10.50458201, + "lat": 58.90150322 } }, { "position": { - "lat": 58.83253108, - "lon": 10.49626314 + "lon": 10.48367403, + "lat": 58.77755168 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "84b31640-140b-4241-9fca-3b2305416104", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.84922791, - "lon": 10.55075524 + "lon": 10.56188382, + "lat": 58.86511788 }, "sog": 14.0, - "cog": 208.27, - "heading": 208.27, + "cog": 214.17, + "heading": 214.17, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.84922791, - "lon": 10.55075524 + "lon": 10.56188382, + "lat": 58.86511788 } }, { "position": { - "lat": 58.8150714, - "lon": 10.51539816 + "lon": 10.43609474, + "lat": 58.76885724 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "802e3beb-a8ed-43d8-853d-d83a3fc2eb53", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.75759575, - "lon": 10.54367028 + "lon": 10.52431623, + "lat": 58.75973236 }, "sog": 12.1, - "cog": 320.63, - "heading": 320.63, + "cog": 336.27, + "heading": 336.27, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75759575, - "lon": 10.54367028 + "lon": 10.52431623, + "lat": 58.75973236 } }, { "position": { - "lat": 58.78341191, - "lon": 10.5028914 + "lon": 10.44670513, + "lat": 58.85144856 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_27.json b/data/baseline_situations_generated/traffic_situation_27.json index c30d765..1e31d62 100644 --- a/data/baseline_situations_generated/traffic_situation_27.json +++ b/data/baseline_situations_generated/traffic_situation_27.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, CR-GW, CR-SO", "description": "Head-on, crossing give-way and crossing stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "998c5fc4-a825-44de-9986-11f0a73b317a", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.86863701, - "lon": 10.48358631 + "lon": 10.48172003, + "lat": 58.89628736 }, "sog": 14.0, - "cog": 177.27, - "heading": 177.27, + "cog": 176.59, + "heading": 176.59, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.86863701, - "lon": 10.48358631 + "lon": 10.48172003, + "lat": 58.89628736 } }, { "position": { - "lat": 58.82989863, - "lon": 10.48713783 + "lon": 10.49505815, + "lat": 58.78014698 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, { - "static": { - "id": "fc185b8f-ea19-42b9-bd97-ea94e5b5c0a0", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.81497919, - "lon": 10.58984352 + "lon": 10.59857012, + "lat": 58.81951277 }, "sog": 12.1, - "cog": 245.17, - "heading": 245.17, + "cog": 260.92, + "heading": 260.92, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.81497919, - "lon": 10.58984352 + "lon": 10.59857012, + "lat": 58.81951277 } }, { "position": { - "lat": 58.80095463, - "lon": 10.53150353 + "lon": 10.40813477, + "lat": 58.80371042 } } - ] - }, - { + ], "static": { - "id": "d9f16645-c474-4b7d-9e75-e10114034e75", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.75609652, - "lon": 10.40129703 + "lon": 10.42464286, + "lat": 58.75801768 }, "sog": 14.0, - "cog": 52.94, - "heading": 52.94, + "cog": 36.1, + "heading": 36.1, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75609652, - "lon": 10.40129703 + "lon": 10.42464286, + "lat": 58.75801768 } }, { "position": { - "lat": 58.77946801, - "lon": 10.46087019 + "lon": 10.5565842, + "lat": 58.85202918 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_28.json b/data/baseline_situations_generated/traffic_situation_28.json index 5476a8c..24ac0ec 100644 --- a/data/baseline_situations_generated/traffic_situation_28.json +++ b/data/baseline_situations_generated/traffic_situation_28.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, CR-GW, OT-GW", "description": "Head-on, crossing give-way and overtaking give-way situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "c0b0771c-7ee1-41c1-b3c8-4658a9da6564", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.8577654, - "lon": 10.4811325 + "lon": 10.47835035, + "lat": 58.8853529 }, "sog": 12.1, - "cog": 175.73, - "heading": 175.73, + "cog": 174.52, + "heading": 174.52, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.8577654, - "lon": 10.4811325 + "lon": 10.47835035, + "lat": 58.8853529 } }, { "position": { - "lat": 58.8244624, - "lon": 10.4859231 + "lon": 10.49675727, + "lat": 58.7856227 } } - ] - }, - { + ], "static": { - "id": "cf24a238-7713-4257-90af-b225944261d2", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.8080666, - "lon": 10.61331031 + "lon": 10.61754401, + "lat": 58.80961071 }, "sog": 14.0, - "cog": 255.14, - "heading": 255.14, + "cog": 270.84, + "heading": 270.84, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.8080666, - "lon": 10.61331031 + "lon": 10.61754401, + "lat": 58.80961071 } }, { "position": { - "lat": 58.79811933, - "lon": 10.54115628 + "lon": 10.39361388, + "lat": 58.8113106 } } - ] - }, - { + ], "static": { - "id": "e49e0040-72fa-482e-bda5-06aa7db0b932", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.76616017, - "lon": 10.49366079 + "lon": 10.51183978, + "lat": 58.78250799 }, "sog": 6.0, - "cog": 356.44, - "heading": 356.44, + "cog": 333.92, + "heading": 333.92, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.76616017, - "lon": 10.49366079 + "lon": 10.51183978, + "lat": 58.78250799 } }, { "position": { - "lat": 58.78282583, - "lon": 10.49166335 + "lon": 10.46944872, + "lat": 58.82750122 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_29.json b/data/baseline_situations_generated/traffic_situation_29.json index b23b8a4..8dff346 100644 --- a/data/baseline_situations_generated/traffic_situation_29.json +++ b/data/baseline_situations_generated/traffic_situation_29.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, CR-GW, OT-SO", "description": "Head-on, crossing give-way and overtaking stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "27e1dfe2-84c0-40ef-8eec-00c51292cf5b", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.8357349, - "lon": 10.48821746 + "lon": 10.48747441, + "lat": 58.85789108 }, "sog": 8.9, - "cog": 178.36, - "heading": 178.36, + "cog": 177.9, + "heading": 177.9, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.8357349, - "lon": 10.48821746 + "lon": 10.48747441, + "lat": 58.85789108 } }, { "position": { - "lat": 58.81096745, - "lon": 10.48958097 + "lon": 10.49270898, + "lat": 58.7836081 } } - ] - }, - { + ], "static": { - "id": "11fe718f-33ff-4730-a1e6-07fdf11fbaba", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.77486823, - "lon": 10.61533211 + "lon": 10.58189453, + "lat": 58.77180694 }, "sog": 12.1, - "cog": 284.13, - "heading": 284.13, + "cog": 314.78, + "heading": 314.78, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.77486823, - "lon": 10.61533211 + "lon": 10.58189453, + "lat": 58.77180694 } }, { "position": { - "lat": 58.7830208, - "lon": 10.55299388 + "lon": 10.44501402, + "lat": 58.84238148 } } - ] - }, - { + ], "static": { - "id": "8e13b629-9bf1-41de-8998-260cd09d5df9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.72454999, - "lon": 10.44741843 + "lon": 10.46886341, + "lat": 58.74383342 }, - "sog": 16.9, - "cog": 18.62, - "heading": 18.62, + "sog": 15.0, + "cog": 10.49, + "heading": 10.49, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.72454999, - "lon": 10.44741843 + "lon": 10.46886341, + "lat": 58.74383342 } }, { "position": { - "lat": 58.76895875, - "lon": 10.47622127 + "lon": 10.51244886, + "lat": 58.86618231 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_30.json b/data/baseline_situations_generated/traffic_situation_30.json index db2ee03..05599fd 100644 --- a/data/baseline_situations_generated/traffic_situation_30.json +++ b/data/baseline_situations_generated/traffic_situation_30.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, CR-SO, CR-SO", "description": "Head-on and two crossing stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "8520e779-44a3-4190-9e8b-63c75f889eef", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.82867867, - "lon": 10.49284861 + "lon": 10.49350527, + "lat": 58.84806982 }, "sog": 8.0, - "cog": 181.74, - "heading": 181.74, + "cog": 182.26, + "heading": 182.26, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.82867867, - "lon": 10.49284861 + "lon": 10.49350527, + "lat": 58.84806982 } }, { "position": { - "lat": 58.80660452, - "lon": 10.4915562 + "lon": 10.48848097, + "lat": 58.78186817 } } - ] - }, - { + ], "static": { - "id": "240454f8-9218-46e1-b80f-987c3229eaf0", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.76852122, - "lon": 10.37910899 + "lon": 10.39466136, + "lat": 58.76781201 }, "sog": 15.0, - "cog": 68.64, - "heading": 68.64, + "cog": 53.29, + "heading": 53.29, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.76852122, - "lon": 10.37910899 + "lon": 10.39466136, + "lat": 58.76781201 } }, { "position": { - "lat": 58.78362748, - "lon": 10.45346076 + "lon": 10.58665446, + "lat": 58.84219843 } } - ] - }, - { + ], "static": { - "id": "9a70b67e-fd41-464e-823b-fb6477bd4cf1", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.74969565, - "lon": 10.34050457 + "lon": 10.37722543, + "lat": 58.75306217 }, "sog": 15.9, - "cog": 61.99, - "heading": 61.99, + "cog": 41.83, + "heading": 41.83, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.74969565, - "lon": 10.34050457 + "lon": 10.37722543, + "lat": 58.75306217 } }, { "position": { - "lat": 58.77043567, - "lon": 10.41556825 + "lon": 10.54731637, + "lat": 58.85180239 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_31.json b/data/baseline_situations_generated/traffic_situation_31.json index 64ea186..0a120a5 100644 --- a/data/baseline_situations_generated/traffic_situation_31.json +++ b/data/baseline_situations_generated/traffic_situation_31.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, CR-SO, OT-SO", "description": "Head-on, crossing stand-on and overtaking stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,33 +16,39 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "ed95fb1e-dae4-4e28-aec8-c93add0a84d9", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.82454908, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.85226226 }, "sog": 6.0, "cog": 180.02, @@ -61,87 +58,111 @@ "waypoints": [ { "position": { - "lat": 58.82454908, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.85226226 } }, { "position": { - "lat": 58.80785114, - "lon": 10.49064091 + "lon": 10.49061472, + "lat": 58.80216846 } } - ] - }, - { + ], "static": { - "id": "d88a524d-737c-47ad-9689-cc095699577d", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.75563868, - "lon": 10.40539249 + "lon": 10.44411787, + "lat": 58.75918474 }, "sog": 12.1, - "cog": 51.28, - "heading": 51.28, + "cog": 25.21, + "heading": 25.21, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75563868, - "lon": 10.40539249 + "lon": 10.44411787, + "lat": 58.75918474 } }, { "position": { - "lat": 58.77652842, - "lon": 10.45554675 + "lon": 10.52626, + "lat": 58.84982965 } } - ] - }, - { + ], "static": { - "id": "bc51aa50-f656-4849-92de-911011317e96", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.72339191, - "lon": 10.45469348 + "lon": 10.46592574, + "lat": 58.73589741 }, "sog": 16.9, - "cog": 15.41, - "heading": 15.41, + "cog": 10.54, + "heading": 10.54, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.72339191, - "lon": 10.45469348 + "lon": 10.46592574, + "lat": 58.73589741 } }, { "position": { - "lat": 58.76856857, - "lon": 10.4786667 + "lon": 10.5154377, + "lat": 58.87411012 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_32.json b/data/baseline_situations_generated/traffic_situation_32.json index b88c287..b8a0ec4 100644 --- a/data/baseline_situations_generated/traffic_situation_32.json +++ b/data/baseline_situations_generated/traffic_situation_32.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, CR-SO, OT-GW", "description": "Head-on, crossing stand-on and overtaking give-way situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "1e2e1ff0-b0f3-4d05-bdba-d57d1f368315", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.81915367, - "lon": 10.48878772 + "lon": 10.48785457, + "lat": 58.84683992 }, "sog": 5.1, - "cog": 178.02, - "heading": 178.02, + "cog": 177.04, + "heading": 177.04, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.81915367, - "lon": 10.48878772 + "lon": 10.48785457, + "lat": 58.84683992 } }, { "position": { - "lat": 58.80515733, - "lon": 10.48972006 + "lon": 10.49202514, + "lat": 58.80488167 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { + "initial": { + "position": { + "lon": 10.44855894, + "lat": 58.75548606 + }, + "sog": 13.0, + "cog": 23.84, + "heading": 23.84, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.44855894, + "lat": 58.75548606 + } + }, + { + "position": { + "lon": 10.53277506, + "lat": 58.85451949 + } + } + ], "static": { - "id": "2d63203e-8e3c-45de-adb1-bdaae9a15b76", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, + "id": 10, "name": "target_ship_2", - "shipType": "Passenger" - }, + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } + }, + { "initial": { "position": { - "lat": 58.75045872, - "lon": 10.42194711 + "lon": 10.50447832, + "lat": 58.77370117 }, - "sog": 13.0, - "cog": 41.25, - "heading": 41.25, + "sog": 8.0, + "cog": 348.99, + "heading": 348.99, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75045872, - "lon": 10.42194711 + "lon": 10.50447832, + "lat": 58.77370117 } }, { "position": { - "lat": 58.77759071, - "lon": 10.46775274 + "lon": 10.48011965, + "lat": 58.8387345 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_33.json b/data/baseline_situations_generated/traffic_situation_33.json index 0313405..3790e4a 100644 --- a/data/baseline_situations_generated/traffic_situation_33.json +++ b/data/baseline_situations_generated/traffic_situation_33.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, OT-GW, OT-GW", "description": "Head-on and two overtaking give-way situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { + "initial": { + "position": { + "lon": 10.50064207, + "lat": 58.8624875 + }, + "sog": 11.1, + "cog": 185.7, + "heading": 185.7, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.50064207, + "lat": 58.8624875 + } + }, + { + "position": { + "lon": 10.48304647, + "lat": 58.77083426 + } + } + ], "static": { - "id": "81ced22a-66b2-4ce9-9a8b-1789c344db58", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, + "id": 10, "name": "target_ship_1", - "shipType": "Cargo" + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } + }, + { + "initial": { + "position": { + "lon": 10.51135592, + "lat": 58.79300255 + }, + "sog": 5.1, + "cog": 337.41, + "heading": 337.41, + "navStatus": "Under way using engine" }, + "waypoints": [ + { + "position": { + "lon": 10.51135592, + "lat": 58.79300255 + } + }, + { + "position": { + "lon": 10.48029643, + "lat": 58.83179463 + } + } + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } + }, + { "initial": { "position": { - "lat": 58.84318613, - "lon": 10.49868939 + "lon": 10.50478937, + "lat": 58.77920431 }, - "sog": 11.1, - "cog": 184.61, - "heading": 184.61, + "sog": 7.0, + "cog": 347.84, + "heading": 347.84, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.84318613, - "lon": 10.49868939 + "lon": 10.50478937, + "lat": 58.77920431 } }, { "position": { - "lat": 58.81258267, - "lon": 10.49394251 + "lon": 10.48120738, + "lat": 58.83607311 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_34.json b/data/baseline_situations_generated/traffic_situation_34.json index 08ff7b9..3aea438 100644 --- a/data/baseline_situations_generated/traffic_situation_34.json +++ b/data/baseline_situations_generated/traffic_situation_34.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, OT-GW, OT-SO", "description": "Head-on, overtaking give-way and overtaking stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "5ea95fa3-78dc-4564-b2b9-68faf45e3239", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.85233408, - "lon": 10.48168547 + "lon": 10.47973278, + "lat": 58.87164444 }, "sog": 13.0, - "cog": 175.67, - "heading": 175.67, + "cog": 174.69, + "heading": 174.69, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.85233408, - "lon": 10.48168547 + "lon": 10.47973278, + "lat": 58.87164444 } }, { "position": { - "lat": 58.81634806, - "lon": 10.48693168 + "lon": 10.49900169, + "lat": 58.76384096 } } - ] - }, - { + ], "static": { - "id": "fce4c5d5-6917-4bc1-80ae-6ca68899b04c", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, "shipType": "Cargo" - }, + } + }, + { "initial": { "position": { - "lat": 58.76444549, - "lon": 10.49134522 + "lon": 10.50359702, + "lat": 58.78192446 }, "sog": 6.0, - "cog": 359.24, - "heading": 359.24, + "cog": 345.44, + "heading": 345.44, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.76444549, - "lon": 10.49134522 + "lon": 10.50359702, + "lat": 58.78192446 } }, { "position": { - "lat": 58.78114197, - "lon": 10.49092143 + "lon": 10.47935037, + "lat": 58.83040867 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "38e96e64-0cd3-411b-a88a-cfcbdce86336", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.7293888, - "lon": 10.49639109 + "lon": 10.49390272, + "lat": 58.74420149 }, - "sog": 15.9, - "cog": 357.24, - "heading": 357.24, + "sog": 15.0, + "cog": 358.33, + "heading": 358.33, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.7293888, - "lon": 10.49639109 + "lon": 10.49390272, + "lat": 58.74420149 } }, { "position": { - "lat": 58.77350627, - "lon": 10.49229598 + "lon": 10.48691364, + "lat": 58.86857505 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_35.json b/data/baseline_situations_generated/traffic_situation_35.json index abeb67e..2ce2465 100644 --- a/data/baseline_situations_generated/traffic_situation_35.json +++ b/data/baseline_situations_generated/traffic_situation_35.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "HO, OT-SO, OT-SO", "description": "Head-on and two overtaking stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "1077425c-1cc8-4b98-9524-56c14fe438fd", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.84160611, - "lon": 10.49590724 + "lon": 10.4966503, + "lat": 58.85266625 }, "sog": 13.0, - "cog": 183.12, - "heading": 183.12, + "cog": 183.52, + "heading": 183.52, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.84160611, - "lon": 10.49590724 + "lon": 10.4966503, + "lat": 58.85266625 } }, { "position": { - "lat": 58.80557042, - "lon": 10.49212958 + "lon": 10.48386095, + "lat": 58.74460306 } } - ] - }, - { + ], "static": { - "id": "2c9124e8-7f4e-4252-b6da-75add867bf49", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, "shipType": "Cargo" - }, + } + }, + { "initial": { "position": { - "lat": 58.71040164, - "lon": 10.53826151 + "lon": 10.5170239, + "lat": 58.73406602 }, - "sog": 19.1, - "cog": 342.97, - "heading": 342.97, + "sog": 16.9, + "cog": 349.45, + "heading": 349.45, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.71040164, - "lon": 10.53826151 + "lon": 10.5170239, + "lat": 58.73406602 } }, { "position": { - "lat": 58.76087471, - "lon": 10.50850741 + "lon": 10.46746264, + "lat": 58.87227396 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, { - "static": { - "id": "c87e4c51-62d1-49d5-acbd-4e38288c502c", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_3", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.71695513, - "lon": 10.50643101 + "lon": 10.49901772, + "lat": 58.7387971 }, "sog": 15.0, - "cog": 353.69, - "heading": 353.69, + "cog": 356.67, + "heading": 356.67, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.71695513, - "lon": 10.50643101 + "lon": 10.49901772, + "lat": 58.7387971 } }, { "position": { - "lat": 58.75817912, - "lon": 10.4976521 + "lon": 10.48508982, + "lat": 58.86301308 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_36.json b/data/baseline_situations_generated/traffic_situation_36.json index 4704a04..9a8b72c 100644 --- a/data/baseline_situations_generated/traffic_situation_36.json +++ b/data/baseline_situations_generated/traffic_situation_36.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, CR-GW, CR-GW", "description": "Three crossing give-way situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "eadae5c5-0658-44a0-bf78-6ff4ad48dd3a", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.84495467, - "lon": 10.53269722 + "lon": 10.53781222, + "lat": 58.85488366 }, "sog": 15.0, - "cog": 202.08, - "heading": 202.08, + "cog": 204.95, + "heading": 204.95, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.84495467, - "lon": 10.53269722 + "lon": 10.53781222, + "lat": 58.85488366 } }, { "position": { - "lat": 58.80652158, - "lon": 10.50268415 + "lon": 10.43679327, + "lat": 58.74206632 } } - ] - }, - { + ], "static": { - "id": "0d33a880-a4ed-4542-ac7b-c1820d0354af", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, "shipType": "Cargo" - }, + } + }, + { "initial": { "position": { - "lat": 58.83445113, - "lon": 10.58635288 + "lon": 10.59965879, + "lat": 58.84431728 }, "sog": 14.0, - "cog": 228.95, - "heading": 228.95, + "cog": 239.21, + "heading": 239.21, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.83445113, - "lon": 10.58635288 + "lon": 10.59965879, + "lat": 58.84431728 } }, { "position": { - "lat": 58.80898413, - "lon": 10.53005219 + "lon": 10.40727148, + "lat": 58.78475991 } } - ] - }, - { + ], "static": { - "id": "b3afe993-0cb1-4d15-90f5-e57f6d0b3723", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.75851144, - "lon": 10.53539297 + "lon": 10.52172417, + "lat": 58.76001964 }, "sog": 12.1, - "cog": 324.52, - "heading": 324.52, + "cog": 336.27, + "heading": 336.27, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75851144, - "lon": 10.53539297 + "lon": 10.52172417, + "lat": 58.76001964 } }, { "position": { - "lat": 58.78570742, - "lon": 10.49808486 + "lon": 10.44411307, + "lat": 58.85173583 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_37.json b/data/baseline_situations_generated/traffic_situation_37.json index dbffc50..a9e94cb 100644 --- a/data/baseline_situations_generated/traffic_situation_37.json +++ b/data/baseline_situations_generated/traffic_situation_37.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, CR-GW, CR-SO", "description": "Two crossing give-waysituations and one crossing give-way situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "920192ea-f1fe-4be2-af92-e9ccacd60797", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.76932919, - "lon": 10.62003238 + "lon": 10.59304039, + "lat": 58.76809929 }, - "sog": 15.9, - "cog": 287.97, - "heading": 287.97, + "sog": 15.0, + "cog": 306.7, + "heading": 306.7, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.76932919, - "lon": 10.62003238 + "lon": 10.59304039, + "lat": 58.76809929 } }, { "position": { - "lat": 58.78295504, - "lon": 10.53915956 + "lon": 10.40102076, + "lat": 58.84246722 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "4c8d2478-9b8c-4aa6-b67d-138b774698ce", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_2", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.81748388, - "lon": 10.59466475 + "lon": 10.60491203, + "lat": 58.82280747 }, "sog": 12.1, - "cog": 244.02, - "heading": 244.02, + "cog": 260.92, + "heading": 260.92, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.81748388, - "lon": 10.59466475 + "lon": 10.60491203, + "lat": 58.82280747 } }, { "position": { - "lat": 58.802856, - "lon": 10.53687631 + "lon": 10.41447668, + "lat": 58.80700512 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "8e02d550-8acc-4622-acc8-ef330ee9593e", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.75193999, - "lon": 10.40794999 + "lon": 10.43238448, + "lat": 58.75533344 }, "sog": 14.0, - "cog": 47.61, - "heading": 47.61, + "cog": 31.34, + "heading": 31.34, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.75193999, - "lon": 10.40794999 + "lon": 10.43238448, + "lat": 58.75533344 } }, { "position": { - "lat": 58.7780846, - "lon": 10.46308791 + "lon": 10.54886909, + "lat": 58.85470402 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_38.json b/data/baseline_situations_generated/traffic_situation_38.json index 58e2665..3fb32dd 100644 --- a/data/baseline_situations_generated/traffic_situation_38.json +++ b/data/baseline_situations_generated/traffic_situation_38.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, CR-GW, OT-GW", "description": "Two crossing give-waysituations and one overtaking give-way situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "0f1edcd0-c5a7-40b5-ac23-18036cd001d8", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.85631106, - "lon": 10.5189593 + "lon": 10.52708109, + "lat": 58.88292003 }, "sog": 12.1, - "cog": 192.74, - "heading": 192.74, + "cog": 196.47, + "heading": 196.47, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.85631106, - "lon": 10.5189593 + "lon": 10.52708109, + "lat": 58.88292003 } }, { "position": { - "lat": 58.82373776, - "lon": 10.50477984 + "lon": 10.4724147, + "lat": 58.78684191 } } - ] - }, - { + ], "static": { - "id": "a16a6a0e-7afc-4d98-ba84-00778780a143", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.82181995, - "lon": 10.60301119 + "lon": 10.61343127, + "lat": 58.82723332 }, "sog": 14.0, - "cog": 242.3, - "heading": 242.3, + "cog": 255.37, + "heading": 255.37, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.82181995, - "lon": 10.60301119 + "lon": 10.61343127, + "lat": 58.82723332 } }, { "position": { - "lat": 58.80379462, - "lon": 10.53691303 + "lon": 10.39674116, + "lat": 58.79784155 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, { - "static": { - "id": "cf1ee3ce-adb2-4626-8a9c-998626f22f44", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_3", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.77098103, - "lon": 10.49592452 + "lon": 10.51418991, + "lat": 58.79704237 }, "sog": 4.1, - "cog": 352.25, - "heading": 352.25, + "cog": 323.09, + "heading": 323.09, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.77098103, - "lon": 10.49592452 + "lon": 10.51418991, + "lat": 58.79704237 } }, { "position": { - "lat": 58.78218933, - "lon": 10.49299005 + "lon": 10.47496221, + "lat": 58.82417605 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_39.json b/data/baseline_situations_generated/traffic_situation_39.json index 96bca6a..12d1b44 100644 --- a/data/baseline_situations_generated/traffic_situation_39.json +++ b/data/baseline_situations_generated/traffic_situation_39.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, CR-GW, OT-SO", "description": "Two crossing give-waysituations and one overtaking stand-on situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "a80e778a-6544-4676-89d6-f5aed89cd25d", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.87899691, - "lon": 10.52986324 + "lon": 10.53511648, + "lat": 58.89444699 }, - "sog": 18.1, - "cog": 193.03, - "heading": 193.03, + "sog": 16.9, + "cog": 195.89, + "heading": 195.89, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.87899691, - "lon": 10.52986324 + "lon": 10.53511648, + "lat": 58.89444699 } }, { "position": { - "lat": 58.83019281, - "lon": 10.50812407 + "lon": 10.46100609, + "lat": 58.75923593 } } - ] - }, - { + ], "static": { - "id": "1345fe0c-5885-4cb9-ae57-5c349fe9be11", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.77486823, - "lon": 10.61533211 + "lon": 10.58189453, + "lat": 58.77180694 }, "sog": 12.1, - "cog": 284.13, - "heading": 284.13, + "cog": 314.78, + "heading": 314.78, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.77486823, - "lon": 10.61533211 + "lon": 10.58189453, + "lat": 58.77180694 } }, { "position": { - "lat": 58.7830208, - "lon": 10.55299388 + "lon": 10.44501402, + "lat": 58.84238148 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "454cb381-b56f-40cc-aa9c-78f9b3574edf", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_3", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.71663194, - "lon": 10.47475603 + "lon": 10.48032032, + "lat": 58.73299771 }, "sog": 16.9, - "cog": 6.3, - "heading": 6.3, + "cog": 4.13, + "heading": 4.13, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.71663194, - "lon": 10.47475603 + "lon": 10.48032032, + "lat": 58.73299771 } }, { "position": { - "lat": 58.76321066, - "lon": 10.48465844 + "lon": 10.49978749, + "lat": 58.87321931 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_40.json b/data/baseline_situations_generated/traffic_situation_40.json index 4661e8a..3d962f5 100644 --- a/data/baseline_situations_generated/traffic_situation_40.json +++ b/data/baseline_situations_generated/traffic_situation_40.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, CR-SO, CR-SO", "description": "One crossing give way and two crossing stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "21f9af18-98f6-482f-870b-d99f4f144427", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.82287031, - "lon": 10.51082023 + "lon": 10.5195814, + "lat": 58.84868926 }, "sog": 6.0, - "cog": 198.3, - "heading": 198.3, + "cog": 206.72, + "heading": 206.72, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.82287031, - "lon": 10.51082023 + "lon": 10.5195814, + "lat": 58.84868926 } }, { "position": { - "lat": 58.80701693, - "lon": 10.50072766 + "lon": 10.47622113, + "lat": 58.803946 } } - ] - }, - { + ], "static": { - "id": "7ad158eb-ceab-4d30-aaa9-17084ecbbff4", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.7798417, - "lon": 10.37290533 + "lon": 10.38228859, + "lat": 58.77853101 }, "sog": 15.0, - "cog": 79.53, - "heading": 79.53, + "cog": 64.8, + "heading": 64.8, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.7798417, - "lon": 10.37290533 + "lon": 10.38228859, + "lat": 58.77853101 } }, { "position": { - "lat": 58.78738112, - "lon": 10.45141067 + "lon": 10.59900317, + "lat": 58.83150625 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "df6b438d-f1c6-46aa-86ca-811ad4a42720", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_3", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.74116713, - "lon": 10.24739775 + "lon": 10.34539493, + "lat": 58.75014452 }, - "sog": 16.9, - "cog": 68.41, - "heading": 68.41, + "sog": 15.0, + "cog": 38.85, + "heading": 38.85, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.74116713, - "lon": 10.24739775 + "lon": 10.34539493, + "lat": 58.75014452 } }, { "position": { - "lat": 58.75840968, - "lon": 10.33127351 + "lon": 10.49562211, + "lat": 58.84705149 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_41.json b/data/baseline_situations_generated/traffic_situation_41.json index a5cd0bb..c1df6f1 100644 --- a/data/baseline_situations_generated/traffic_situation_41.json +++ b/data/baseline_situations_generated/traffic_situation_41.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, CR-SO, OT-SO", "description": "Crossing give way, crossing stand-on and overtaking stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "90ad61e9-0bde-404c-8de7-717fbebdec37", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.79163799, - "lon": 10.69314577 + "lon": 10.64237595, + "lat": 58.78456381 }, - "sog": 18.1, - "cog": 269.75, - "heading": 269.75, + "sog": 15.0, + "cog": 295.19, + "heading": 295.19, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.79163799, - "lon": 10.69314577 + "lon": 10.64237595, + "lat": 58.78456381 } }, { "position": { - "lat": 58.79141813, - "lon": 10.59672205 + "lon": 10.42564247, + "lat": 58.83751819 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "c356120c-0dd7-400a-88f8-a657e8dda6c5", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.83445113, - "lon": 10.39495512 + "lon": 10.38164921, + "lat": 58.84431728 }, "sog": 14.0, - "cog": 131.04, - "heading": 131.04, + "cog": 120.78, + "heading": 120.78, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.83445113, - "lon": 10.39495512 + "lon": 10.38164921, + "lat": 58.84431728 } }, { "position": { - "lat": 58.80898955, - "lon": 10.4512649 + "lon": 10.57405776, + "lat": 58.78477843 } } - ] - }, - { + ], "static": { - "id": "e873f7d1-1ec4-47b3-b5a3-626c428b46e7", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, "shipType": "Cargo" - }, + } + }, + { "initial": { "position": { - "lat": 58.72339191, - "lon": 10.45469348 + "lon": 10.46592574, + "lat": 58.73589741 }, "sog": 16.9, - "cog": 15.41, - "heading": 15.41, + "cog": 10.54, + "heading": 10.54, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.72339191, - "lon": 10.45469348 + "lon": 10.46592574, + "lat": 58.73589741 } }, { "position": { - "lat": 58.76856857, - "lon": 10.4786667 + "lon": 10.5154377, + "lat": 58.87411012 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_42.json b/data/baseline_situations_generated/traffic_situation_42.json index cac3095..16548c1 100644 --- a/data/baseline_situations_generated/traffic_situation_42.json +++ b/data/baseline_situations_generated/traffic_situation_42.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, CR-SO, OT-GW", "description": "Crossing give way, crossing stand-on and overtaking give-way situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,103 +16,119 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "4fe4ef8c-3048-440c-bde9-e2ae099fc8d9", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_1", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.80563373, - "lon": 10.57185462 + "lon": 10.57581183, + "lat": 58.80768955 }, "sog": 8.9, - "cog": 251.07, - "heading": 251.07, + "cog": 277.25, + "heading": 277.25, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.80563373, - "lon": 10.57185462 + "lon": 10.57581183, + "lat": 58.80768955 } }, { "position": { - "lat": 58.79759561, - "lon": 10.52674017 + "lon": 10.43387538, + "lat": 58.81707577 } } - ] - }, - { + ], "static": { - "id": "3b208654-1cb8-4f44-b8ef-573049a1c296", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.818229, - "lon": 10.3649909 + "lon": 10.35724928, + "lat": 58.8216045 }, "sog": 15.9, - "cog": 112.53, - "heading": 112.53, + "cog": 101.3, + "heading": 101.3, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.818229, - "lon": 10.3649909 + "lon": 10.35724928, + "lat": 58.8216045 } }, { "position": { - "lat": 58.80130577, - "lon": 10.44352233 + "lon": 10.60736457, + "lat": 58.79564283 } } - ] - }, - { + ], "static": { - "id": "29d13c09-719c-463f-81d1-306de57352af", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.7729381, - "lon": 10.5034415 + "lon": 10.5034415, + "lat": 58.7729381 }, "sog": 7.0, "cog": 339.99, @@ -131,17 +138,31 @@ "waypoints": [ { "position": { - "lat": 58.7729381, - "lon": 10.5034415 + "lon": 10.5034415, + "lat": 58.7729381 } }, { "position": { - "lat": 58.79115902, - "lon": 10.49067118 + "lon": 10.46513053, + "lat": 58.82760088 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_43.json b/data/baseline_situations_generated/traffic_situation_43.json index 8a4f3a3..16914c8 100644 --- a/data/baseline_situations_generated/traffic_situation_43.json +++ b/data/baseline_situations_generated/traffic_situation_43.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, OT-GW, OT-GW", "description": "Crossing give way, overtaking stand-on and overtaking give-way situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { + "initial": { + "position": { + "lon": 10.57321977, + "lat": 58.85544026 + }, + "sog": 12.1, + "cog": 225.52, + "heading": 225.52, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.57321977, + "lat": 58.85544026 + } + }, + { + "position": { + "lon": 10.43563173, + "lat": 58.78523803 + } + } + ], "static": { - "id": "e5780700-ac63-4233-a076-22872a892cfd", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, + "id": 10, "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" + } + }, + { + "initial": { + "position": { + "lon": 10.50534234, + "lat": 58.79191629 + }, + "sog": 5.1, + "cog": 344.18, + "heading": 344.18, + "navStatus": "Under way using engine" }, + "waypoints": [ + { + "position": { + "lon": 10.50534234, + "lat": 58.79191629 + } + }, + { + "position": { + "lon": 10.48328948, + "lat": 58.83233822 + } + } + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } + }, + { "initial": { "position": { - "lat": 58.83964904, - "lon": 10.55904984 + "lon": 10.47102346, + "lat": 58.78532689 }, - "sog": 12.1, - "cog": 216.23, - "heading": 216.23, + "sog": 7.0, + "cog": 12.15, + "heading": 12.15, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.83964904, - "lon": 10.55904984 + "lon": 10.47102346, + "lat": 58.78532689 } }, { "position": { - "lat": 58.8127117, - "lon": 10.52105285 + "lon": 10.49458517, + "lat": 58.84219795 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_44.json b/data/baseline_situations_generated/traffic_situation_44.json index 31ce397..5b9fe8d 100644 --- a/data/baseline_situations_generated/traffic_situation_44.json +++ b/data/baseline_situations_generated/traffic_situation_44.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, OT-GW, OT-SO", "description": "Crossing give way, overtaking give-way and overtaking stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "4aaa9de2-6ec0-4541-8fa9-612a4db5c754", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.81472782, - "lon": 10.70233895 + "lon": 10.69941856, + "lat": 58.81401861 }, "sog": 14.0, - "cog": 257.89, - "heading": 257.89, + "cog": 285.33, + "heading": 285.33, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.81472782, - "lon": 10.70233895 + "lon": 10.69941856, + "lat": 58.81401861 } }, { "position": { - "lat": 58.80659059, - "lon": 10.62934931 + "lon": 10.48343609, + "lat": 58.84478401 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } }, { + "initial": { + "position": { + "lon": 10.51135592, + "lat": 58.79300255 + }, + "sog": 5.1, + "cog": 337.41, + "heading": 337.41, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.51135592, + "lat": 58.79300255 + } + }, + { + "position": { + "lon": 10.48029643, + "lat": 58.83179463 + } + } + ], "static": { - "id": "ea1fe2b6-9c64-4dbb-8d79-16b56ebc51b4", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.7293888, - "lon": 10.49639109 + "lon": 10.49452481, + "lat": 58.74043996 }, "sog": 15.9, - "cog": 357.24, - "heading": 357.24, + "cog": 358.16, + "heading": 358.16, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.7293888, - "lon": 10.49639109 + "lon": 10.49452481, + "lat": 58.74043996 } }, { "position": { - "lat": 58.77350627, - "lon": 10.49229598 + "lon": 10.48631708, + "lat": 58.87287753 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_45.json b/data/baseline_situations_generated/traffic_situation_45.json index 8b077ae..04b0d07 100644 --- a/data/baseline_situations_generated/traffic_situation_45.json +++ b/data/baseline_situations_generated/traffic_situation_45.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-GW, OT-SO, OT-SO", "description": "Crossing give way and two overtaking stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "25b22987-1a9c-4a75-a0d5-af47fb364d35", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.83655184, - "lon": 10.55626769 + "lon": 10.56864046, + "lat": 58.85032315 }, "sog": 12.1, - "cog": 216.92, - "heading": 216.92, + "cog": 225.52, + "heading": 225.52, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.83655184, - "lon": 10.55626769 + "lon": 10.56864046, + "lat": 58.85032315 } }, { "position": { - "lat": 58.80985331, - "lon": 10.51765124 + "lon": 10.43105242, + "lat": 58.78012092 } } - ] - }, - { + ], "static": { - "id": "074bd7ee-78e6-4b82-a608-50d977d98103", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.71893913, - "lon": 10.53060629 + "lon": 10.5085565, + "lat": 58.74350125 }, - "sog": 18.1, - "cog": 343.95, - "heading": 343.95, + "sog": 15.0, + "cog": 351.4, + "heading": 351.4, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.71893913, - "lon": 10.53060629 + "lon": 10.5085565, + "lat": 58.74350125 } }, { "position": { - "lat": 58.76707949, - "lon": 10.50394162 + "lon": 10.47272123, + "lat": 58.86652718 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "70961523-ef61-481d-92be-c92d838ce207", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_3", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.70876775, - "lon": 10.47209485 + "lon": 10.48135714, + "lat": 58.73605002 }, "sog": 15.0, - "cog": 6.65, - "heading": 6.65, + "cog": 3.32, + "heading": 3.32, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.70876775, - "lon": 10.47209485 + "lon": 10.48135714, + "lat": 58.73605002 } }, { "position": { - "lat": 58.74996453, - "lon": 10.48133501 + "lon": 10.49524073, + "lat": 58.86026734 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_46.json b/data/baseline_situations_generated/traffic_situation_46.json index c09a910..185e305 100644 --- a/data/baseline_situations_generated/traffic_situation_46.json +++ b/data/baseline_situations_generated/traffic_situation_46.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-SO, CR-SO, CR-SO", "description": "Two crossing stand-on and one crossing stand-on situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "3bb6aa8d-dc26-4d2d-8c61-827f5ff5710e", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.82287031, - "lon": 10.47048777 + "lon": 10.4617266, + "lat": 58.84868926 }, "sog": 6.0, - "cog": 161.75, - "heading": 161.75, + "cog": 153.27, + "heading": 153.27, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.82287031, - "lon": 10.47048777 + "lon": 10.4617266, + "lat": 58.84868926 } }, { "position": { - "lat": 58.80701266, - "lon": 10.48055548 + "lon": 10.50510283, + "lat": 58.80395017 } } - ] - }, - { + ], "static": { - "id": "570237ed-04ce-4df7-b172-233c2857a272", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, "shipType": "Cargo" - }, + } + }, + { "initial": { "position": { - "lat": 58.7798417, - "lon": 10.37290533 + "lon": 10.38228859, + "lat": 58.77853101 }, "sog": 15.0, - "cog": 79.53, - "heading": 79.53, + "cog": 64.8, + "heading": 64.8, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.7798417, - "lon": 10.37290533 + "lon": 10.38228859, + "lat": 58.77853101 } }, { "position": { - "lat": 58.78738112, - "lon": 10.45141067 + "lon": 10.59900317, + "lat": 58.83150625 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "9f1111dd-e8ca-4754-ac17-cabdddf5286f", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_3", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.86039577, - "lon": 10.38291068 + "lon": 10.3649045, + "lat": 58.87659098 }, "sog": 16.9, - "cog": 141.06, - "heading": 141.06, + "cog": 132.81, + "heading": 132.81, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.86039577, - "lon": 10.38291068 + "lon": 10.3649045, + "lat": 58.87659098 } }, { "position": { - "lat": 58.8239452, - "lon": 10.43960157 + "lon": 10.56342268, + "lat": 58.78105024 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_47.json b/data/baseline_situations_generated/traffic_situation_47.json index 488cd72..3db0a44 100644 --- a/data/baseline_situations_generated/traffic_situation_47.json +++ b/data/baseline_situations_generated/traffic_situation_47.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-SO, CR-SO, OT-SO", "description": "Two crossing stand-on situations and one overtaking stand-on situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "cdfa9a22-bd10-438e-9d67-a90abb9dda39", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.8721741, - "lon": 10.41448198 + "lon": 10.41194176, + "lat": 58.87578301 }, - "sog": 18.1, - "cog": 153.95, - "heading": 153.95, + "sog": 15.0, + "cog": 146.79, + "heading": 146.79, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.8721741, - "lon": 10.41448198 + "lon": 10.41194176, + "lat": 58.87578301 } }, { "position": { - "lat": 58.82716783, - "lon": 10.4568217 + "lon": 10.54311538, + "lat": 58.77167708 } } - ] - }, - { + ], "static": { - "id": "31e9db13-0494-4437-8fca-eff4ed5ba1a4", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, "shipType": "Cargo" - }, + } + }, + { "initial": { "position": { - "lat": 58.81237574, - "lon": 10.37841778 + "lon": 10.37205859, + "lat": 58.81514976 }, "sog": 14.0, - "cog": 110.01, - "heading": 110.01, + "cog": 96.83, + "heading": 96.83, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.81237574, - "lon": 10.37841778 + "lon": 10.37205859, + "lat": 58.81514976 } }, { "position": { - "lat": 58.79910639, - "lon": 10.44856358 + "lon": 10.59442337, + "lat": 58.8013136 } } - ] - }, - { + ], "static": { - "id": "ffd3df9f-82a1-444a-a784-48895f9093f6", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.67733793, - "lon": 10.44624336 + "lon": 10.4752226, + "lat": 58.73350942 }, - "sog": 19.1, - "cog": 11.46, - "heading": 11.46, + "sog": 15.0, + "cog": 5.04, + "heading": 5.04, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.67733793, - "lon": 10.44624336 + "lon": 10.4752226, + "lat": 58.73350942 } }, { "position": { - "lat": 58.72907272, - "lon": 10.46642991 + "lon": 10.49627197, + "lat": 58.8574545 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_48.json b/data/baseline_situations_generated/traffic_situation_48.json index 5ed038e..a9a562a 100644 --- a/data/baseline_situations_generated/traffic_situation_48.json +++ b/data/baseline_situations_generated/traffic_situation_48.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-SO, CR-SO, OT-GW", "description": "Two crossing stand-on situations and one overtaking give-way situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "502a1289-c97f-443e-99cb-4c40b4513f85", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.80948503, - "lon": 10.40204009 + "lon": 10.39602651, + "lat": 58.81260916 }, "sog": 8.9, - "cog": 111.73, - "heading": 111.73, + "cog": 82.74, + "heading": 82.74, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.80948503, - "lon": 10.40204009 + "lon": 10.39602651, + "lat": 58.81260916 } }, { "position": { - "lat": 58.80031284, - "lon": 10.44634581 + "lon": 10.53795961, + "lat": 58.82200904 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { + "initial": { + "position": { + "lon": 10.35479546, + "lat": 58.80419735 + }, + "sog": 15.9, + "cog": 87.09, + "heading": 87.09, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.35479546, + "lat": 58.80419735 + } + }, + { + "position": { + "lon": 10.60952524, + "lat": 58.81092528 + } + } + ], "static": { - "id": "3331dd8b-ee9c-4b22-a41e-3eee6feeb9ec", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, + "id": 10, "name": "target_ship_2", - "shipType": "Cargo" - }, + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } + }, + { "initial": { "position": { - "lat": 58.80361382, - "lon": 10.35674815 + "lon": 10.5136715, + "lat": 58.78053296 }, - "sog": 15.9, - "cog": 100.15, - "heading": 100.15, + "sog": 7.0, + "cog": 339.94, + "heading": 339.94, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.80361382, - "lon": 10.35674815 + "lon": 10.5136715, + "lat": 58.78053296 } }, { "position": { - "lat": 58.79582785, - "lon": 10.44043637 + "lon": 10.47525533, + "lat": 58.83517582 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_49.json b/data/baseline_situations_generated/traffic_situation_49.json index 55e2b68..e09a73d 100644 --- a/data/baseline_situations_generated/traffic_situation_49.json +++ b/data/baseline_situations_generated/traffic_situation_49.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-SO, OT-GW, OT-GW", "description": "One crossing stand-on situation and two overtaking give-way situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { + "initial": { + "position": { + "lon": 10.3997418, + "lat": 58.86473185 + }, + "sog": 14.0, + "cog": 137.45, + "heading": 137.45, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.3997418, + "lat": 58.86473185 + } + }, + { + "position": { + "lon": 10.55117957, + "lat": 58.77901701 + } + } + ], "static": { - "id": "cd3fcce3-90d1-42d4-a80b-c73345fabadd", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, + "id": 10, "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, "shipType": "Passenger" + } + }, + { + "initial": { + "position": { + "lon": 10.50230099, + "lat": 58.78601814 + }, + "sog": 6.0, + "cog": 349.56, + "heading": 349.56, + "navStatus": "Under way using engine" }, + "waypoints": [ + { + "position": { + "lon": 10.50230099, + "lat": 58.78601814 + } + }, + { + "position": { + "lon": 10.48483086, + "lat": 58.8352829 + } + } + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } + }, + { "initial": { "position": { - "lat": 58.84858154, - "lon": 10.41424005 + "lon": 10.47102346, + "lat": 58.78532689 }, - "sog": 14.0, - "cog": 145.36, - "heading": 145.36, + "sog": 7.0, + "cog": 12.15, + "heading": 12.15, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.84858154, - "lon": 10.41424005 + "lon": 10.47102346, + "lat": 58.78532689 } }, { "position": { - "lat": 58.81667403, - "lon": 10.45667389 + "lon": 10.49458517, + "lat": 58.84219795 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_50.json b/data/baseline_situations_generated/traffic_situation_50.json index 04424de..27b2a38 100644 --- a/data/baseline_situations_generated/traffic_situation_50.json +++ b/data/baseline_situations_generated/traffic_situation_50.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-SO, OT-GW, OT-SO", "description": "Crossing stand-on, overtaking give-way situation and overtaking stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "c683531e-652a-4af2-a0c7-5f6471adf0ab", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.79416063, - "lon": 10.36388496 + "lon": 10.36827418, + "lat": 58.79309232 }, "sog": 14.0, - "cog": 92.59, - "heading": 92.59, + "cog": 74.66, + "heading": 74.66, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.79416063, - "lon": 10.36388496 + "lon": 10.36827418, + "lat": 58.79309232 } }, { "position": { - "lat": 58.79240813, - "lon": 10.43846004 + "lon": 10.58424567, + "lat": 58.82387852 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { + "initial": { + "position": { + "lon": 10.51310124, + "lat": 58.8069534 + }, + "sog": 4.1, + "cog": 335.64, + "heading": 335.64, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.51310124, + "lat": 58.8069534 + } + }, + { + "position": { + "lon": 10.48615745, + "lat": 58.83786647 + } + } + ], "static": { - "id": "365e58d2-499f-4071-970c-ea5d21f3ac3b", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, "shipType": "Cargo" - }, + } + }, + { "initial": { "position": { - "lat": 58.70297734, - "lon": 10.50083216 + "lon": 10.49618373, + "lat": 58.73057382 }, "sog": 15.9, - "cog": 356.55, - "heading": 356.55, + "cog": 358.16, + "heading": 358.16, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.70297734, - "lon": 10.50083216 + "lon": 10.49618373, + "lat": 58.73057382 } }, { "position": { - "lat": 58.7470661, - "lon": 10.49571832 + "lon": 10.487976, + "lat": 58.86301139 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_51.json b/data/baseline_situations_generated/traffic_situation_51.json index 2277838..c02042d 100644 --- a/data/baseline_situations_generated/traffic_situation_51.json +++ b/data/baseline_situations_generated/traffic_situation_51.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "CR-SO, OT-SO, OT-SO", "description": "One crossing stand-on situation and two overtaking stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "db9e7d6c-5fbf-44d9-8fa7-c84757bb3e60", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_1", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.83744958, - "lon": 10.42422813 + "lon": 10.41353156, + "lat": 58.84936257 }, "sog": 13.0, - "cog": 143.3, - "heading": 143.3, + "cog": 136.08, + "heading": 136.08, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.83744958, - "lon": 10.42422813 + "lon": 10.41353156, + "lat": 58.84936257 } }, { "position": { - "lat": 58.80851546, - "lon": 10.46574665 + "lon": 10.55809668, + "lat": 58.77138 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "586a4d94-8d3c-44cd-b073-0311b9c55fa0", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.73740561, - "lon": 10.51403439 + "lon": 10.51177065, + "lat": 58.73992825 }, "sog": 18.1, - "cog": 347.27, - "heading": 347.27, + "cog": 348.53, + "heading": 348.53, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.73740561, - "lon": 10.51403439 + "lon": 10.51177065, + "lat": 58.73992825 } }, { "position": { - "lat": 58.78626802, - "lon": 10.49278608 + "lon": 10.45424825, + "lat": 58.88720851 } } - ] - }, - { + ], "static": { - "id": "fae8ac8b-ee70-42d4-9227-930e0a061fe9", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.70538328, - "lon": 10.44997593 + "lon": 10.46813763, + "lat": 58.73130099 }, "sog": 15.9, - "cog": 13.87, - "heading": 13.87, + "cog": 7.62, + "heading": 7.62, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.70538328, - "lon": 10.44997593 + "lon": 10.46813763, + "lat": 58.73130099 } }, { "position": { - "lat": 58.74826496, - "lon": 10.47035043 + "lon": 10.50196053, + "lat": 58.86263696 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_52.json b/data/baseline_situations_generated/traffic_situation_52.json index 3b0b6a2..cae4fc7 100644 --- a/data/baseline_situations_generated/traffic_situation_52.json +++ b/data/baseline_situations_generated/traffic_situation_52.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "OT-GW, OT-GW, OT-GW", "description": "Three overtaking give-way situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,17 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, - "targetShips": [] -} + "targetShips": [ + { + "initial": { + "position": { + "lon": 10.4828087, + "lat": 58.77865669 + }, + "sog": 7.0, + "cog": 6.7, + "heading": 6.7, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.4828087, + "lat": 58.77865669 + } + }, + { + "position": { + "lon": 10.49588014, + "lat": 58.83643243 + } + } + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } + }, + { + "initial": { + "position": { + "lon": 10.50230099, + "lat": 58.78601814 + }, + "sog": 6.0, + "cog": 349.56, + "heading": 349.56, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.50230099, + "lat": 58.78601814 + } + }, + { + "position": { + "lon": 10.48483086, + "lat": 58.8352829 + } + } + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } + }, + { + "initial": { + "position": { + "lon": 10.45804588, + "lat": 58.79978047 + }, + "sog": 5.1, + "cog": 31.74, + "heading": 31.74, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.45804588, + "lat": 58.79978047 + } + }, + { + "position": { + "lon": 10.50059223, + "lat": 58.83551045 + } + } + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } + } + ] +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_53.json b/data/baseline_situations_generated/traffic_situation_53.json index d71f81d..d3c1cda 100644 --- a/data/baseline_situations_generated/traffic_situation_53.json +++ b/data/baseline_situations_generated/traffic_situation_53.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "OT-GW, OT-GW, OT-SO", "description": "Two overtaking give-way situations and one overtaking stand-on situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,53 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { + "initial": { + "position": { + "lon": 10.490654, + "lat": 58.77758838 + }, + "sog": 7.0, + "cog": 0.0, + "heading": 0.0, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.490654, + "lat": 58.77758838 + } + }, + { + "position": { + "lon": 10.490654, + "lat": 58.83576183 + } + } + ], "static": { - "id": "2db3c199-dc28-4f00-b1ce-7ecaed62f27e", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", - "shipType": "Passenger" + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } + }, + { + "initial": { + "position": { + "lon": 10.50774432, + "lat": 58.8138211 + }, + "sog": 4.1, + "cog": 344.81, + "heading": 344.81, + "navStatus": "Under way using engine" }, + "waypoints": [ + { + "position": { + "lon": 10.50774432, + "lat": 58.8138211 + } + }, + { + "position": { + "lon": 10.49062474, + "lat": 58.8465694 + } + } + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } + }, + { "initial": { "position": { - "lat": 58.69760886, - "lon": 10.47955998 + "lon": 10.48420841, + "lat": 58.72519637 }, "sog": 16.9, - "cog": 3.55, - "heading": 3.55, + "cog": 2.06, + "heading": 2.06, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.69760886, - "lon": 10.47955998 + "lon": 10.48420841, + "lat": 58.72519637 } }, { "position": { - "lat": 58.74438077, - "lon": 10.48514903 + "lon": 10.49394831, + "lat": 58.86569111 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_54.json b/data/baseline_situations_generated/traffic_situation_54.json index 7bb92d8..0e877bb 100644 --- a/data/baseline_situations_generated/traffic_situation_54.json +++ b/data/baseline_situations_generated/traffic_situation_54.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "OT-GW, OT-SO, OT-SO", "description": "One overtaking give-way situation and two overtaking stand-on situations with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,88 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] - }, - "targetShips": [ - { - "static": { - "id": "a6261754-ef85-4613-9662-76319cc0e66c", + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { "length": 122.0, "width": 20.0, "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_2", - "shipType": "Passenger" + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 }, + "shipType": "Passenger" + } + }, + "targetShips": [ + { "initial": { "position": { - "lat": 58.71434271, - "lon": 10.53471903 + "lon": 10.47057417, + "lat": 58.7815115 }, - "sog": 18.1, - "cog": 343.43, - "heading": 343.43, + "sog": 7.0, + "cog": 15.58, + "heading": 15.58, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.71434271, - "lon": 10.53471903 + "lon": 10.47057417, + "lat": 58.7815115 } }, { "position": { - "lat": 58.76235644, - "lon": 10.50722147 + "lon": 10.50065774, + "lat": 58.83754623 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } }, { + "initial": { + "position": { + "lon": 10.52136128, + "lat": 58.72923619 + }, + "sog": 18.1, + "cog": 348.53, + "heading": 348.53, + "navStatus": "Under way using engine" + }, + "waypoints": [ + { + "position": { + "lon": 10.52136128, + "lat": 58.72923619 + } + }, + { + "position": { + "lon": 10.46383888, + "lat": 58.87651644 + } + } + ], "static": { - "id": "7c640290-36c5-4af7-9df1-0dada3165355", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, "shipType": "Passenger" - }, + } + }, + { "initial": { "position": { - "lat": 58.70365064, - "lon": 10.4487663 + "lon": 10.47366736, + "lat": 58.73919211 }, - "sog": 18.1, - "cog": 13.98, - "heading": 13.98, + "sog": 15.0, + "cog": 6.76, + "heading": 6.76, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.70365064, - "lon": 10.4487663 + "lon": 10.47366736, + "lat": 58.73919211 } }, { "position": { - "lat": 58.75226064, - "lon": 10.47206115 + "lon": 10.50186358, + "lat": 58.8627534 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } } ] -} +} \ No newline at end of file diff --git a/data/baseline_situations_generated/traffic_situation_55.json b/data/baseline_situations_generated/traffic_situation_55.json index 8b02da8..ccf96e8 100644 --- a/data/baseline_situations_generated/traffic_situation_55.json +++ b/data/baseline_situations_generated/traffic_situation_55.json @@ -1,21 +1,12 @@ { + "version": "0.6.0", "title": "OT-SO, OT-SO, OT-SO", "description": "Three overtaking stand-on situation with three target ships.", "ownShip": { - "static": { - "id": "27b8e920-d131-49d1-be47-284c99a128d9", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 }, "sog": 10.0, "cog": 0.0, @@ -25,123 +16,153 @@ "waypoints": [ { "position": { - "lat": 58.763449, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.763449 } }, { "position": { - "lat": 58.7911568, - "lon": 10.490654 + "lon": 10.490654, + "lat": 58.8465724 } } - ] + ], + "static": { + "id": 0, + "mmsi": 257847600, + "name": "BASTO VI", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, "targetShips": [ { - "static": { - "id": "5f8224e3-e17f-4512-84d3-507031fa4827", - "length": 178.0, - "width": 30.0, - "height": 30.0, - "speedMax": 21.0, - "name": "target_ship_1", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.70727751, - "lon": 10.50971429 + "lon": 10.50098768, + "lat": 58.73299771 }, - "sog": 19.1, - "cog": 353.29, - "heading": 353.29, + "sog": 16.9, + "cog": 355.92, + "heading": 355.92, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.70727751, - "lon": 10.50971429 + "lon": 10.50098768, + "lat": 58.73299771 } }, { "position": { - "lat": 58.75970249, - "lon": 10.49783446 + "lon": 10.48174041, + "lat": 58.8732275 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_1", + "dimensions": { + "length": 122.0, + "width": 20.0, + "height": 8.0, + "a": 61.0, + "b": 61.0, + "c": 10.0, + "d": 10.0 + }, + "shipType": "Passenger" + } }, { - "static": { - "id": "ea1f5e8c-7471-4d99-a22e-99507c7565ef", - "length": 50.0, - "width": 10.0, - "height": 8.0, - "speedMax": 15.0, - "name": "target_ship_2", - "shipType": "Cargo" - }, "initial": { "position": { - "lat": 58.70976424, - "lon": 10.53884905 + "lon": 10.51095847, + "lat": 58.74083497 }, - "sog": 18.1, - "cog": 342.92, - "heading": 342.92, + "sog": 15.0, + "cog": 351.4, + "heading": 351.4, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.70976424, - "lon": 10.53884905 + "lon": 10.51095847, + "lat": 58.74083497 } }, { "position": { - "lat": 58.75764747, - "lon": 10.51052083 + "lon": 10.4751232, + "lat": 58.86386089 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_2", + "dimensions": { + "length": 50.0, + "width": 10.0, + "height": 8.0, + "a": 25.0, + "b": 25.0, + "c": 5.0, + "d": 5.0 + }, + "shipType": "Cargo" + } }, { - "static": { - "id": "9f9f3674-bd0f-4213-963d-5d944f35eec2", - "length": 122.0, - "width": 20.0, - "height": 8.0, - "speedMax": 17.0, - "name": "target_ship_3", - "shipType": "Passenger" - }, "initial": { "position": { - "lat": 58.7002931, - "lon": 10.44641617 + "lon": 10.46450875, + "lat": 58.72613001 }, "sog": 16.9, - "cog": 14.21, - "heading": 14.21, + "cog": 8.31, + "heading": 8.31, "navStatus": "Under way using engine" }, "waypoints": [ { "position": { - "lat": 58.7002931, - "lon": 10.44641617 + "lon": 10.46450875, + "lat": 58.72613001 } }, { "position": { - "lat": 58.74572132, - "lon": 10.46855808 + "lon": 10.50361001, + "lat": 58.86524053 } } - ] + ], + "static": { + "id": 10, + "name": "target_ship_3", + "dimensions": { + "length": 178.0, + "width": 30.0, + "height": 30.0, + "a": 89.0, + "b": 89.0, + "c": 15.0, + "d": 15.0 + }, + "shipType": "Passenger" + } } ] -} +} \ No newline at end of file diff --git a/src/trafficgen/settings/encounter_settings.json b/src/trafficgen/settings/encounter_settings.json index 424ddbb..122d14d 100644 --- a/src/trafficgen/settings/encounter_settings.json +++ b/src/trafficgen/settings/encounter_settings.json @@ -34,9 +34,9 @@ 10.0, 30.0 ], - "situation_length": 10.0, + "situation_length": 30.0, "max_meeting_distance": 0.0, "common_vector": 5.0, "evolve_time": 120.0, - "disable_land_check": false + "disable_land_check": true } diff --git a/src/trafficgen/write_traffic_situation_to_file.py b/src/trafficgen/write_traffic_situation_to_file.py index efd61e0..5f666e0 100644 --- a/src/trafficgen/write_traffic_situation_to_file.py +++ b/src/trafficgen/write_traffic_situation_to_file.py @@ -1,7 +1,8 @@ """Functions to clean traffic situations data before writing it to a json file.""" +import json from pathlib import Path -from typing import TypeVar +from typing import Any, TypeVar from trafficgen.types import OwnShip, Ship, TargetShip, TrafficSituation from trafficgen.utils import m_2_nm, m_pr_s_2_knot, rad_2_deg @@ -25,11 +26,22 @@ def write_traffic_situations_to_json_file(situations: list[TrafficSituation], wr file_number: int = i + 1 output_file_path: Path = write_folder / f"traffic_situation_{file_number:02d}.json" situation = convert_situation_data_from_si_units_to__maritime(situation) # noqa: PLW2901 - data: str = situation.model_dump_json( - by_alias=True, indent=4, exclude_unset=True, exclude_defaults=False, exclude_none=True + data: dict[str, Any] = situation.model_dump( + by_alias=True, exclude_unset=True, exclude_defaults=False, exclude_none=True ) + + # Remove the 'sogMax' field from the 'static' dictionary in ownShip + if "static" in data.get("ownShip", {}): + data["ownShip"]["static"].pop("sogMax", None) + + # Remove the 'sogMax' field from the 'static' dictionary in each targetShip + for target_ship in data.get("targetShips", []): + if "static" in target_ship: + target_ship["static"].pop("sogMax", None) + + json_data: str = json.dumps(data, indent=4) with Path.open(output_file_path, "w", encoding="utf-8") as outfile: - _ = outfile.write(data) + _ = outfile.write(json_data) def convert_situation_data_from_si_units_to__maritime(situation: TrafficSituation) -> TrafficSituation: From 42921bd0101b9a0eff46535428b996c5ba23b125 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Sun, 19 Jan 2025 09:55:42 +0100 Subject: [PATCH 17/23] #43 adding file for documentation --- docs/input_files.rst | 228 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 docs/input_files.rst diff --git a/docs/input_files.rst b/docs/input_files.rst new file mode 100644 index 0000000..3ec3995 --- /dev/null +++ b/docs/input_files.rst @@ -0,0 +1,228 @@ +=========== +Input files +=========== + +Situation files +~~~~~~~~~~~~~~~ +The situation files specify the traffic situations to be generated. The files are written in JSON format +and a predefined set of situation files with number of encounters in a situation ranging from 1 to 3 are located in the +`src/trafficgen/data/baseline_situations_input` directory. + +Below are some examples given on how to specify a situation: + +Example 1: Complete specified situation:: + + { + "title": "HO", + "description": "A head on situation with one target ship.", + "ownShip": { + "initial": { + "position": { + "lat": 58.763449, + "lon": 10.490654 + }, + "sog": 10.0, + "cog": 0.0, + "heading": 0.0, + "navStatus": "Under way using engine" + } + }, + "encounters": [ + { + "desiredEncounterType": "head-on", + "beta": 2.0, + "relativeSpeed": 1.2, + "vectorTime": 15.0 + } + ] + } + +The values are giben in maritime units. The `common_vector` is given in minutes. For radar plotting (plotting vessel positions and relative motions), +the `common_vector` and `vector_time` are used together with ship speed to display where the ship will be in e.g. 10 minutes +(Common vector is the common time vector used on a radar plot, e.g 10, 15, 20 minutes. The length of the arrow in the plot +will then be the speed times this time vector). +Speed and course of the own ship, which is the ship to be tested, are given in knots and degrees, respectively. +The own ship position is given in latitudinal and longitudinal (degree). +The reference point is the initial position of own ship. + +An encounter may be fully described as shown above, but the user may also deside to input less data, +as demonstrated in Example 2. Desired encounter type is mandatory, +while the `beta`, `relative_speed` and `vector_time` parameters are optional: + + * `desired_encounter_type` is either head-on, overtaking-give-way, overtaking-stand-on, crossing-give-way, and crossing-stand-on. + * `beta` is the relative bearing between the own ship and the target ship as seen from the own shop, given in degrees. + * `relative_speed` is relative speed between the own ship and the target ship as seen from the own ship, such that a relative speed of 1.2 means that the target ship's speed is 20% higher than the speed of the own ship. + +An encounter is built using a maximum meeting distance [nm], see the paper linked in the introduction for more info. +At some time in the future, given by the `vector_time`, the target ship will be located somewhere inside a circle +with a radius given by `max_meeting_distance` and a center point given by the own ship position. This is not necessarily the +closest point of approach. + +The `max_meeting_distance` parameter is common for all encounters and is specified in `src/trafficgen/settings/encounter_settings.json`. + +Example 2: Minimum specified situation:: + + { + "title": "HO", + "description": "A head on situation with one target ship.", + "ownShip": { + "initial": { + "position": { + "lat": 58.763449, + "lon": 10.490654 + }, + "sog": 10.0, + "cog": 0.0, + "heading": 0.0, + "navStatus": "Under way using engine" + } + }, + "encounters": [ + { + "desiredEncounterType": "head-on", + } + ] + } + + +You can also request the generation of several traffic situations of the same encounter type by specifying `num_situations`: + +Example 3: Generate multiple situations using `numSituations`:: + + { + "title": "HO", + "description": "A head on situation with one target ship.", + "numSituations": 5 + "ownShip": { + "initial": { + "position": { + "lat": 58.763449, + "lon": 10.490654 + }, + "sog": 10.0, + "cog": 0.0, + "heading": 0.0, + "navStatus": "Under way using engine" + } + }, + "encounters": [ + { + "desiredEncounterType": "head-on", + } + ] + } + +The next example show how it is possible to give a range for the relative bearing between own ship and target ship + +Example 4: Assign range for `beta`:: + + { + "title": "CR_GW", + "common_vector": 10.0, + "own_ship": { + "speed": 7.0, + "course": 0.0, + "position": { + "lat": 58.763449, + "lon": 10.490654 + } + }, + "encounter": [ + { + "desired_encounter_type": "crossing-give-way", + "beta": [45.0,120.0] + } + ] + } + +Own ship file +~~~~~~~~~~~~~~~ +The own ship file specify the own ship which is the ship to be controlled by the control system under test. +The file is written in JSON format and located in the `src/trafficgen/data/own_ship`:: + + { + "dimensions": { + "length": 122, + "width": 20, + "height": 8 + }, + "sogMax": 17, + "mmsi": 257847600, + "name": "BASTO VI", + "shipType": "Passenger" + } + +The values are given in maritime units. sogMax is the maximum speed over ground in knots, and the dimensions are given in meters. + +Target ship files +~~~~~~~~~~~~~~~~~ +The directory `src/trafficgen/data/target_ships` contains a set of target ships that can be used in the traffic generation. +The file is written in JSON format and is on the following structure:: + + { + "dimensions": { + "length": 122, + "width": 20, + "height": 8 + }, + "sogMax": 17, + "shipType": "Passenger" + } + +Encounter settings +~~~~~~~~~~~~~~~~~~ +The encounter setting file spesified parameters that are common from +all encounters. The file is written in JSON format and located in the `src/trafficgen/settings/encounter_settings.json`:: + + { + "classification": { + "theta13_criteria": 67.5, + "theta14_criteria": 5.0, + "theta15_criteria": 5.0, + "theta15": [ + 112.5, + 247.5 + ] + }, + "relative_speed": { + "overtaking_stand_on": [ + 1.5, + 2 + ], + "overtaking_give_way": [ + 0.25, + 0.75 + ], + "head_on": [ + 0.5, + 1.5 + ], + "crossing_give_way": [ + 0.5, + 1.5 + ], + "crossing_stand_on": [ + 0.5, + 1.5 + ] + }, + "vector_range": [ + 10.0, + 30.0 + ], + "situation_length": 30.0, + "max_meeting_distance": 0.0, + "common_vector": 5.0, + "evolve_time": 120.0, + "disable_land_check": true + } + +The values are given in maritime units. The `theta13_criteria`, `theta14_criteria` and `theta15_criteria` are the criteria for the classification of the encounters. +The `theta15` is the range for the relative bearing between own ship and target ship. +The `relative_speed` is the range for the relative speed between own ship and target ship. +The `vector_range` is the range for the vector time. +The `situation_length` is the length of the situation in minutes. +The `max_meeting_distance` is the maximum meeting distance in nautical miles. +The `common_vector` is the common time vector used on a radar plot. +The `evolve_time` is the time in minutes for the situation to evolve. +The `disable_land_check` is a boolean value that determines if the land check should be disabled or not. From 05e399bfc7b15bca5590b1062b0c0183600bc1ed Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Sun, 19 Jan 2025 09:56:38 +0100 Subject: [PATCH 18/23] Cleaning up --- docs/input_files.rst | 228 ------------------------------------------- 1 file changed, 228 deletions(-) delete mode 100644 docs/input_files.rst diff --git a/docs/input_files.rst b/docs/input_files.rst deleted file mode 100644 index 3ec3995..0000000 --- a/docs/input_files.rst +++ /dev/null @@ -1,228 +0,0 @@ -=========== -Input files -=========== - -Situation files -~~~~~~~~~~~~~~~ -The situation files specify the traffic situations to be generated. The files are written in JSON format -and a predefined set of situation files with number of encounters in a situation ranging from 1 to 3 are located in the -`src/trafficgen/data/baseline_situations_input` directory. - -Below are some examples given on how to specify a situation: - -Example 1: Complete specified situation:: - - { - "title": "HO", - "description": "A head on situation with one target ship.", - "ownShip": { - "initial": { - "position": { - "lat": 58.763449, - "lon": 10.490654 - }, - "sog": 10.0, - "cog": 0.0, - "heading": 0.0, - "navStatus": "Under way using engine" - } - }, - "encounters": [ - { - "desiredEncounterType": "head-on", - "beta": 2.0, - "relativeSpeed": 1.2, - "vectorTime": 15.0 - } - ] - } - -The values are giben in maritime units. The `common_vector` is given in minutes. For radar plotting (plotting vessel positions and relative motions), -the `common_vector` and `vector_time` are used together with ship speed to display where the ship will be in e.g. 10 minutes -(Common vector is the common time vector used on a radar plot, e.g 10, 15, 20 minutes. The length of the arrow in the plot -will then be the speed times this time vector). -Speed and course of the own ship, which is the ship to be tested, are given in knots and degrees, respectively. -The own ship position is given in latitudinal and longitudinal (degree). -The reference point is the initial position of own ship. - -An encounter may be fully described as shown above, but the user may also deside to input less data, -as demonstrated in Example 2. Desired encounter type is mandatory, -while the `beta`, `relative_speed` and `vector_time` parameters are optional: - - * `desired_encounter_type` is either head-on, overtaking-give-way, overtaking-stand-on, crossing-give-way, and crossing-stand-on. - * `beta` is the relative bearing between the own ship and the target ship as seen from the own shop, given in degrees. - * `relative_speed` is relative speed between the own ship and the target ship as seen from the own ship, such that a relative speed of 1.2 means that the target ship's speed is 20% higher than the speed of the own ship. - -An encounter is built using a maximum meeting distance [nm], see the paper linked in the introduction for more info. -At some time in the future, given by the `vector_time`, the target ship will be located somewhere inside a circle -with a radius given by `max_meeting_distance` and a center point given by the own ship position. This is not necessarily the -closest point of approach. - -The `max_meeting_distance` parameter is common for all encounters and is specified in `src/trafficgen/settings/encounter_settings.json`. - -Example 2: Minimum specified situation:: - - { - "title": "HO", - "description": "A head on situation with one target ship.", - "ownShip": { - "initial": { - "position": { - "lat": 58.763449, - "lon": 10.490654 - }, - "sog": 10.0, - "cog": 0.0, - "heading": 0.0, - "navStatus": "Under way using engine" - } - }, - "encounters": [ - { - "desiredEncounterType": "head-on", - } - ] - } - - -You can also request the generation of several traffic situations of the same encounter type by specifying `num_situations`: - -Example 3: Generate multiple situations using `numSituations`:: - - { - "title": "HO", - "description": "A head on situation with one target ship.", - "numSituations": 5 - "ownShip": { - "initial": { - "position": { - "lat": 58.763449, - "lon": 10.490654 - }, - "sog": 10.0, - "cog": 0.0, - "heading": 0.0, - "navStatus": "Under way using engine" - } - }, - "encounters": [ - { - "desiredEncounterType": "head-on", - } - ] - } - -The next example show how it is possible to give a range for the relative bearing between own ship and target ship - -Example 4: Assign range for `beta`:: - - { - "title": "CR_GW", - "common_vector": 10.0, - "own_ship": { - "speed": 7.0, - "course": 0.0, - "position": { - "lat": 58.763449, - "lon": 10.490654 - } - }, - "encounter": [ - { - "desired_encounter_type": "crossing-give-way", - "beta": [45.0,120.0] - } - ] - } - -Own ship file -~~~~~~~~~~~~~~~ -The own ship file specify the own ship which is the ship to be controlled by the control system under test. -The file is written in JSON format and located in the `src/trafficgen/data/own_ship`:: - - { - "dimensions": { - "length": 122, - "width": 20, - "height": 8 - }, - "sogMax": 17, - "mmsi": 257847600, - "name": "BASTO VI", - "shipType": "Passenger" - } - -The values are given in maritime units. sogMax is the maximum speed over ground in knots, and the dimensions are given in meters. - -Target ship files -~~~~~~~~~~~~~~~~~ -The directory `src/trafficgen/data/target_ships` contains a set of target ships that can be used in the traffic generation. -The file is written in JSON format and is on the following structure:: - - { - "dimensions": { - "length": 122, - "width": 20, - "height": 8 - }, - "sogMax": 17, - "shipType": "Passenger" - } - -Encounter settings -~~~~~~~~~~~~~~~~~~ -The encounter setting file spesified parameters that are common from -all encounters. The file is written in JSON format and located in the `src/trafficgen/settings/encounter_settings.json`:: - - { - "classification": { - "theta13_criteria": 67.5, - "theta14_criteria": 5.0, - "theta15_criteria": 5.0, - "theta15": [ - 112.5, - 247.5 - ] - }, - "relative_speed": { - "overtaking_stand_on": [ - 1.5, - 2 - ], - "overtaking_give_way": [ - 0.25, - 0.75 - ], - "head_on": [ - 0.5, - 1.5 - ], - "crossing_give_way": [ - 0.5, - 1.5 - ], - "crossing_stand_on": [ - 0.5, - 1.5 - ] - }, - "vector_range": [ - 10.0, - 30.0 - ], - "situation_length": 30.0, - "max_meeting_distance": 0.0, - "common_vector": 5.0, - "evolve_time": 120.0, - "disable_land_check": true - } - -The values are given in maritime units. The `theta13_criteria`, `theta14_criteria` and `theta15_criteria` are the criteria for the classification of the encounters. -The `theta15` is the range for the relative bearing between own ship and target ship. -The `relative_speed` is the range for the relative speed between own ship and target ship. -The `vector_range` is the range for the vector time. -The `situation_length` is the length of the situation in minutes. -The `max_meeting_distance` is the maximum meeting distance in nautical miles. -The `common_vector` is the common time vector used on a radar plot. -The `evolve_time` is the time in minutes for the situation to evolve. -The `disable_land_check` is a boolean value that determines if the land check should be disabled or not. From 28e2e17864e8a8837950d1d91756e1f0aed99cbd Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Sun, 19 Jan 2025 10:03:59 +0100 Subject: [PATCH 19/23] #43 trying once more to include the input_files.rst --- docs/source/input_files.rst | 228 ++++++++++++++++++++++++++++++++++++ 1 file changed, 228 insertions(+) create mode 100644 docs/source/input_files.rst diff --git a/docs/source/input_files.rst b/docs/source/input_files.rst new file mode 100644 index 0000000..3ec3995 --- /dev/null +++ b/docs/source/input_files.rst @@ -0,0 +1,228 @@ +=========== +Input files +=========== + +Situation files +~~~~~~~~~~~~~~~ +The situation files specify the traffic situations to be generated. The files are written in JSON format +and a predefined set of situation files with number of encounters in a situation ranging from 1 to 3 are located in the +`src/trafficgen/data/baseline_situations_input` directory. + +Below are some examples given on how to specify a situation: + +Example 1: Complete specified situation:: + + { + "title": "HO", + "description": "A head on situation with one target ship.", + "ownShip": { + "initial": { + "position": { + "lat": 58.763449, + "lon": 10.490654 + }, + "sog": 10.0, + "cog": 0.0, + "heading": 0.0, + "navStatus": "Under way using engine" + } + }, + "encounters": [ + { + "desiredEncounterType": "head-on", + "beta": 2.0, + "relativeSpeed": 1.2, + "vectorTime": 15.0 + } + ] + } + +The values are giben in maritime units. The `common_vector` is given in minutes. For radar plotting (plotting vessel positions and relative motions), +the `common_vector` and `vector_time` are used together with ship speed to display where the ship will be in e.g. 10 minutes +(Common vector is the common time vector used on a radar plot, e.g 10, 15, 20 minutes. The length of the arrow in the plot +will then be the speed times this time vector). +Speed and course of the own ship, which is the ship to be tested, are given in knots and degrees, respectively. +The own ship position is given in latitudinal and longitudinal (degree). +The reference point is the initial position of own ship. + +An encounter may be fully described as shown above, but the user may also deside to input less data, +as demonstrated in Example 2. Desired encounter type is mandatory, +while the `beta`, `relative_speed` and `vector_time` parameters are optional: + + * `desired_encounter_type` is either head-on, overtaking-give-way, overtaking-stand-on, crossing-give-way, and crossing-stand-on. + * `beta` is the relative bearing between the own ship and the target ship as seen from the own shop, given in degrees. + * `relative_speed` is relative speed between the own ship and the target ship as seen from the own ship, such that a relative speed of 1.2 means that the target ship's speed is 20% higher than the speed of the own ship. + +An encounter is built using a maximum meeting distance [nm], see the paper linked in the introduction for more info. +At some time in the future, given by the `vector_time`, the target ship will be located somewhere inside a circle +with a radius given by `max_meeting_distance` and a center point given by the own ship position. This is not necessarily the +closest point of approach. + +The `max_meeting_distance` parameter is common for all encounters and is specified in `src/trafficgen/settings/encounter_settings.json`. + +Example 2: Minimum specified situation:: + + { + "title": "HO", + "description": "A head on situation with one target ship.", + "ownShip": { + "initial": { + "position": { + "lat": 58.763449, + "lon": 10.490654 + }, + "sog": 10.0, + "cog": 0.0, + "heading": 0.0, + "navStatus": "Under way using engine" + } + }, + "encounters": [ + { + "desiredEncounterType": "head-on", + } + ] + } + + +You can also request the generation of several traffic situations of the same encounter type by specifying `num_situations`: + +Example 3: Generate multiple situations using `numSituations`:: + + { + "title": "HO", + "description": "A head on situation with one target ship.", + "numSituations": 5 + "ownShip": { + "initial": { + "position": { + "lat": 58.763449, + "lon": 10.490654 + }, + "sog": 10.0, + "cog": 0.0, + "heading": 0.0, + "navStatus": "Under way using engine" + } + }, + "encounters": [ + { + "desiredEncounterType": "head-on", + } + ] + } + +The next example show how it is possible to give a range for the relative bearing between own ship and target ship + +Example 4: Assign range for `beta`:: + + { + "title": "CR_GW", + "common_vector": 10.0, + "own_ship": { + "speed": 7.0, + "course": 0.0, + "position": { + "lat": 58.763449, + "lon": 10.490654 + } + }, + "encounter": [ + { + "desired_encounter_type": "crossing-give-way", + "beta": [45.0,120.0] + } + ] + } + +Own ship file +~~~~~~~~~~~~~~~ +The own ship file specify the own ship which is the ship to be controlled by the control system under test. +The file is written in JSON format and located in the `src/trafficgen/data/own_ship`:: + + { + "dimensions": { + "length": 122, + "width": 20, + "height": 8 + }, + "sogMax": 17, + "mmsi": 257847600, + "name": "BASTO VI", + "shipType": "Passenger" + } + +The values are given in maritime units. sogMax is the maximum speed over ground in knots, and the dimensions are given in meters. + +Target ship files +~~~~~~~~~~~~~~~~~ +The directory `src/trafficgen/data/target_ships` contains a set of target ships that can be used in the traffic generation. +The file is written in JSON format and is on the following structure:: + + { + "dimensions": { + "length": 122, + "width": 20, + "height": 8 + }, + "sogMax": 17, + "shipType": "Passenger" + } + +Encounter settings +~~~~~~~~~~~~~~~~~~ +The encounter setting file spesified parameters that are common from +all encounters. The file is written in JSON format and located in the `src/trafficgen/settings/encounter_settings.json`:: + + { + "classification": { + "theta13_criteria": 67.5, + "theta14_criteria": 5.0, + "theta15_criteria": 5.0, + "theta15": [ + 112.5, + 247.5 + ] + }, + "relative_speed": { + "overtaking_stand_on": [ + 1.5, + 2 + ], + "overtaking_give_way": [ + 0.25, + 0.75 + ], + "head_on": [ + 0.5, + 1.5 + ], + "crossing_give_way": [ + 0.5, + 1.5 + ], + "crossing_stand_on": [ + 0.5, + 1.5 + ] + }, + "vector_range": [ + 10.0, + 30.0 + ], + "situation_length": 30.0, + "max_meeting_distance": 0.0, + "common_vector": 5.0, + "evolve_time": 120.0, + "disable_land_check": true + } + +The values are given in maritime units. The `theta13_criteria`, `theta14_criteria` and `theta15_criteria` are the criteria for the classification of the encounters. +The `theta15` is the range for the relative bearing between own ship and target ship. +The `relative_speed` is the range for the relative speed between own ship and target ship. +The `vector_range` is the range for the vector time. +The `situation_length` is the length of the situation in minutes. +The `max_meeting_distance` is the maximum meeting distance in nautical miles. +The `common_vector` is the common time vector used on a radar plot. +The `evolve_time` is the time in minutes for the situation to evolve. +The `disable_land_check` is a boolean value that determines if the land check should be disabled or not. From 0bad08e987e1f7c5c22a8d2cfa3270d5b8a983cb Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Sun, 19 Jan 2025 10:05:45 +0100 Subject: [PATCH 20/23] Updating gitignore file --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0ed84c3..d5ac00e 100644 --- a/.gitignore +++ b/.gitignore @@ -112,4 +112,3 @@ ENV/ !.vscode/launch.json !.vscode/extensions.json !.vscode/*.code-snippets -docs/source/input_files.rst From b52e097a8c122e36a8b9e07de32c784fe5f33503 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Mon, 20 Jan 2025 13:09:15 +0100 Subject: [PATCH 21/23] Making last changes to #43 --- CHANGELOG.md | 10 ++++++++++ pyproject.toml | 2 +- ruff.toml | 2 +- tox.ini | 27 --------------------------- 4 files changed, 12 insertions(+), 29 deletions(-) delete mode 100644 tox.ini diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bcc011..cbd177f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,16 @@ The changelog format is based on [Keep a Changelog](https://keepachangelog.com/e -/- +## [0.7.0] - 2025-01-22 + +### Changed + +* The python package Maritime Schema is no longer open source, necessary types have been included here to remove the link +* Project updated to use uv package installer +* Documentation has been updated +* Updating workflows +* Removed maxSpeed from the output files generated using the tool + ## [0.6.0] - 2024-11-11 diff --git a/pyproject.toml b/pyproject.toml index 5b82c45..54e0dca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ packages = [ [project] name = "trafficgen" -version = "0.6.0" +version = "0.7.0" description = "Automatic generation of ship traffic situations from a set of predefined situations" readme = "README.md" requires-python = ">= 3.11" diff --git a/ruff.toml b/ruff.toml index b768d04..2ab2a49 100644 --- a/ruff.toml +++ b/ruff.toml @@ -10,7 +10,7 @@ src = [ "src", ] line-length = 120 -target-version = "py310" +target-version = "py311" [lint] # Settings for Ruff linter (invoked with `uv run ruff check`). diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 7b2670f..0000000 --- a/tox.ini +++ /dev/null @@ -1,27 +0,0 @@ -[tox] -isolated_build = True -envlist = py{39,310,311}-{linux,macos,windows} - - -[testenv] -system_site_packages = True -deps = - pytest>=7.4 - pytest-cov>=4.1 -commands = - pytest --cov --cov-config tox.ini {tty:--color=yes} {posargs} - - -[coverage:run] -source = trafficgen -branch = True - -[coverage:report] -fail_under = 10.0 -show_missing = True -skip_covered = True - -[coverage:paths] -source = - src/trafficgen - */site-packages/trafficgen From 02ab6844ecf674473ef1831a1078c530a9f800a1 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Mon, 20 Jan 2025 13:10:34 +0100 Subject: [PATCH 22/23] removing uv.lock --- uv.lock | 2663 ------------------------------------------------------- 1 file changed, 2663 deletions(-) delete mode 100644 uv.lock diff --git a/uv.lock b/uv.lock deleted file mode 100644 index 9806427..0000000 --- a/uv.lock +++ /dev/null @@ -1,2663 +0,0 @@ -version = 1 -requires-python = ">=3.11" - -[[package]] -name = "alabaster" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929 }, -] - -[[package]] -name = "annotated-types" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, -] - -[[package]] -name = "anyio" -version = "4.8.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/46/eb/e7f063ad1fec6b3178a3cd82d1a3c4de82cccf283fc42746168188e1cdd5/anyio-4.8.0-py3-none-any.whl", hash = "sha256:b5011f270ab5eb0abf13385f851315585cc37ef330dd88e27ec3d34d651fd47a", size = 96041 }, -] - -[[package]] -name = "appnope" -version = "0.1.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, -] - -[[package]] -name = "argon2-cffi" -version = "23.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "argon2-cffi-bindings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/31/fa/57ec2c6d16ecd2ba0cf15f3c7d1c3c2e7b5fcb83555ff56d7ab10888ec8f/argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", size = 42798 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/6a/e8a041599e78b6b3752da48000b14c8d1e8a04ded09c88c714ba047f34f5/argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea", size = 15124 }, -] - -[[package]] -name = "argon2-cffi-bindings" -version = "21.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/e9/184b8ccce6683b0aa2fbb7ba5683ea4b9c5763f1356347f1312c32e3c66e/argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3", size = 1779911 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/13/838ce2620025e9666aa8f686431f67a29052241692a3dd1ae9d3692a89d3/argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367", size = 29658 }, - { url = "https://files.pythonhosted.org/packages/b3/02/f7f7bb6b6af6031edb11037639c697b912e1dea2db94d436e681aea2f495/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d", size = 80583 }, - { url = "https://files.pythonhosted.org/packages/ec/f7/378254e6dd7ae6f31fe40c8649eea7d4832a42243acaf0f1fff9083b2bed/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae", size = 86168 }, - { url = "https://files.pythonhosted.org/packages/74/f6/4a34a37a98311ed73bb80efe422fed95f2ac25a4cacc5ae1d7ae6a144505/argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c", size = 82709 }, - { url = "https://files.pythonhosted.org/packages/74/2b/73d767bfdaab25484f7e7901379d5f8793cccbb86c6e0cbc4c1b96f63896/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86", size = 83613 }, - { url = "https://files.pythonhosted.org/packages/4f/fd/37f86deef67ff57c76f137a67181949c2d408077e2e3dd70c6c42912c9bf/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f", size = 84583 }, - { url = "https://files.pythonhosted.org/packages/6f/52/5a60085a3dae8fded8327a4f564223029f5f54b0cb0455a31131b5363a01/argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e", size = 88475 }, - { url = "https://files.pythonhosted.org/packages/8b/95/143cd64feb24a15fa4b189a3e1e7efbaeeb00f39a51e99b26fc62fbacabd/argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082", size = 27698 }, - { url = "https://files.pythonhosted.org/packages/37/2c/e34e47c7dee97ba6f01a6203e0383e15b60fb85d78ac9a15cd066f6fe28b/argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f", size = 30817 }, - { url = "https://files.pythonhosted.org/packages/5a/e4/bf8034d25edaa495da3c8a3405627d2e35758e44ff6eaa7948092646fdcc/argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93", size = 53104 }, -] - -[[package]] -name = "arrow" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "python-dateutil" }, - { name = "types-python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2e/00/0f6e8fcdb23ea632c866620cc872729ff43ed91d284c866b515c6342b173/arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85", size = 131960 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/ed/e97229a566617f2ae958a6b13e7cc0f585470eac730a73e9e82c32a3cdd2/arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", size = 66419 }, -] - -[[package]] -name = "asttokens" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, -] - -[[package]] -name = "async-lru" -version = "2.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/80/e2/2b4651eff771f6fd900d233e175ddc5e2be502c7eb62c0c42f975c6d36cd/async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627", size = 10019 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/9f/3c3503693386c4b0f245eaf5ca6198e3b28879ca0a40bde6b0e319793453/async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224", size = 6111 }, -] - -[[package]] -name = "attrs" -version = "24.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/48/c8/6260f8ccc11f0917360fc0da435c5c9c7504e3db174d5a12a1494887b045/attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff", size = 805984 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/89/aa/ab0f7891a01eeb2d2e338ae8fecbe57fcebea1a24dbb64d45801bfab481d/attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308", size = 63397 }, -] - -[[package]] -name = "babel" -version = "2.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/74/f1bc80f23eeba13393b7222b11d95ca3af2c1e28edca18af487137eefed9/babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316", size = 9348104 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/20/bc79bc575ba2e2a7f70e8a1155618bb1301eaa5132a8271373a6903f73f8/babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", size = 9587599 }, -] - -[[package]] -name = "basemap" -version = "1.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "basemap-data" }, - { name = "matplotlib" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pyproj" }, - { name = "pyshp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/00/63/f3a5e74a8a31c20ea785ebd0fc1a9e680a9f1c5ac9ab4888f349ef9a3165/basemap-1.4.1.zip", hash = "sha256:6822d3d08c11cdc443e3ed01d61d512e7cf62d4b40bbc1d235f0a898f2c54a7a", size = 167398 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/ab/a93ccacdde434d00d2f9e08c8ecf62df0c50cf0ce3c1b819f3ca3fea6c2f/basemap-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:509bb451ce26f1f7651cc19d27ef049935304c7795a141cfbe05582802554226", size = 623678 }, - { url = "https://files.pythonhosted.org/packages/73/92/f0bf706ef07c503d20a7cc0863b66e5db418680fdaca94dc2cac537423cd/basemap-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a6860ab68a461cd36b6eda5d3973bfa1e3a4fdeaf608e8dd4b324b08e8561eed", size = 569118 }, - { url = "https://files.pythonhosted.org/packages/e6/e2/0932c15c6bae2100a262506830358a1dfb3c2c82671e4094cc8f2b6d5104/basemap-1.4.1-cp311-cp311-manylinux1_i686.whl", hash = "sha256:500a3d314166057d0b3c065e63147042c996ead1af5d59e319f813b83d4ea220", size = 936489 }, - { url = "https://files.pythonhosted.org/packages/0c/d3/72c1ed71fb5fd283f96696efb5d8d100f1a3c434e0d5e53c5d9b3ed9793e/basemap-1.4.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:6e0a13ba17ca011c55db44fab9210363154bc67482776d3b149a3ef1b4b01bad", size = 942421 }, - { url = "https://files.pythonhosted.org/packages/c0/dd/90a5817723353b45d7a82cce5d9ba15f5024afb4c437c59133230f5bebd5/basemap-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e6b8430a4f73485fcdb766cd2acb9e766cdacc67adca7757e7a2915b685d8461", size = 402504 }, - { url = "https://files.pythonhosted.org/packages/36/91/c3bf3ef6eacdb7cae204f3b440b7810ecbb30a4067457310d2544c6a5b14/basemap-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:c4d80330f00728acfd88be78e0485fd688984db873853f9c75647ec78e653203", size = 507324 }, - { url = "https://files.pythonhosted.org/packages/90/05/a58c9ee0e6335671417843c2421a0f8940a2a1456157b1cd91ebd7e8da79/basemap-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51a5e8f2183e7505f4dfbb965048348c2f1e501283b13ad9950409c3da9655f6", size = 624979 }, - { url = "https://files.pythonhosted.org/packages/a8/26/04d6fe6208ad022745347d7b66a26a6671e9a054ce558465c6b96fe60feb/basemap-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f99f3da41fc3e6bfb726f0fbd3302939a3b03e353ccd2be5ebd7bc09b84c386", size = 569896 }, - { url = "https://files.pythonhosted.org/packages/1c/ff/cbd7431d4a97b48445808f5ffd21f80f69e01edfb701affab4d7f72a4214/basemap-1.4.1-cp312-cp312-manylinux1_i686.whl", hash = "sha256:20644986a63d57c9d94afb8aba180d5362c1bd08d61d4537aa6221a70e3df762", size = 943278 }, - { url = "https://files.pythonhosted.org/packages/d7/ee/5908870dab84ea5c3f3f29b665a6042d8a461cfd315c701c02d10d607ef0/basemap-1.4.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:b64f000374a41bf19ac8f8b39cbd2a3b244c79673cd686c9eb507c19daef9e78", size = 950333 }, - { url = "https://files.pythonhosted.org/packages/31/46/c083b25568bcb119080602a4422f5f3eec663dbd8dd627f0c5be3d0e3fa8/basemap-1.4.1-cp312-cp312-win32.whl", hash = "sha256:84918a6e030adc9aedee92fe622adde8b54cc81051a6ce6723c04987081d92f4", size = 403000 }, - { url = "https://files.pythonhosted.org/packages/7f/ab/caf597d36e4ab9e5b3302d9fdeea4d652b002e314c617cb3a36bcf070f97/basemap-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff588f63f35d0b58607c9642cc2cf68967b464ee7aa27a6d87db2ec8edc910e2", size = 507602 }, -] - -[[package]] -name = "basemap-data" -version = "1.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/45/f6/efc358bb1ed930cb06a45934ac128c6869cdcb9c1c57679d1d9ac9f99241/basemap_data-1.3.2.zip", hash = "sha256:0072efd6f12c76e9f35e8fd718360d634b849ba988e74acccaf1ec536275f70b", size = 30540081 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/c3/63fdb885308c999206c7a497d79a50891581626da7dc491d432d2732bb46/basemap_data-1.3.2-py2.py3-none-any.whl", hash = "sha256:26e794556c496b26f7714658cdbea5c68cb47d6a8a9fb0e674844fa89c56fc59", size = 30535486 }, -] - -[[package]] -name = "basemap-data-hires" -version = "1.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/78/aa/092b3efff3f425c33edb64dbb604bb0958fff8724d634e551b402ace6cce/basemap_data_hires-1.3.2.zip", hash = "sha256:0982eb95b2066ccbe10b6580bcd9c597e3a4e25016bf25afb65e1a96f6e3e97d", size = 91064505 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/3a/4a975fc74b63e2d494e236ba70fe765151bf0adad758ad40e4cf4ecf2310/basemap_data_hires-1.3.2-py2.py3-none-any.whl", hash = "sha256:39c14c865f8b89c4254d68165a36f1d34dece9366b6cd344692ec02001df956e", size = 91059959 }, -] - -[[package]] -name = "beautifulsoup4" -version = "4.12.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "soupsieve" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/ca/824b1195773ce6166d388573fc106ce56d4a805bd7427b624e063596ec58/beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", size = 581181 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/fe/e8c672695b37eecc5cbf43e1d0638d88d66ba3a44c4d321c796f4e59167f/beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed", size = 147925 }, -] - -[[package]] -name = "bleach" -version = "6.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/76/9a/0e33f5054c54d349ea62c277191c020c2d6ef1d65ab2cb1993f91ec846d1/bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f", size = 203083 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/55/96142937f66150805c25c4d0f31ee4132fd33497753400734f9dfdcbdc66/bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e", size = 163406 }, -] - -[package.optional-dependencies] -css = [ - { name = "tinycss2" }, -] - -[[package]] -name = "branca" -version = "0.8.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jinja2" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e8/1d/bec5cb6669b7bf98b632b20bbbb25200bdc44298e7a39d588b0028a78300/branca-0.8.1.tar.gz", hash = "sha256:ac397c2d79bd13af0d04193b26d5ed17031d27609a7f1fab50c438b8ae712390", size = 27743 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/9d/91cddd38bd00170aad1a4b198c47b4ed716be45c234e09b835af41f4e717/branca-0.8.1-py3-none-any.whl", hash = "sha256:d29c5fab31f7c21a92e34bf3f854234e29fecdcf5d2df306b616f20d816be425", size = 26071 }, -] - -[[package]] -name = "certifi" -version = "2024.12.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/bd/1d41ee578ce09523c81a15426705dd20969f5abf006d1afe8aeff0dd776a/certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db", size = 166010 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/32/8f6669fc4798494966bf446c8c4a162e0b5d893dff088afddf76414f70e1/certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", size = 164927 }, -] - -[[package]] -name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, -] - -[[package]] -name = "cfgv" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, -] - -[[package]] -name = "charset-normalizer" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, - { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, - { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, - { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, - { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, - { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, - { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, - { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, - { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, - { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, - { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, - { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, - { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, -] - -[[package]] -name = "click" -version = "8.1.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, -] - -[[package]] -name = "click-log" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/32/32/228be4f971e4bd556c33d52a22682bfe318ffe57a1ddb7a546f347a90260/click-log-0.4.0.tar.gz", hash = "sha256:3970f8570ac54491237bcdb3d8ab5e3eef6c057df29f8c3d1151a51a9c23b975", size = 9985 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756", size = 4273 }, -] - -[[package]] -name = "colorama" -version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, -] - -[[package]] -name = "comm" -version = "0.2.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, -] - -[[package]] -name = "contourpy" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/25/c2/fc7193cc5383637ff390a712e88e4ded0452c9fbcf84abe3de5ea3df1866/contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", size = 13465753 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/bb/11250d2906ee2e8b466b5f93e6b19d525f3e0254ac8b445b56e618527718/contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b", size = 269555 }, - { url = "https://files.pythonhosted.org/packages/67/71/1e6e95aee21a500415f5d2dbf037bf4567529b6a4e986594d7026ec5ae90/contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc", size = 254549 }, - { url = "https://files.pythonhosted.org/packages/31/2c/b88986e8d79ac45efe9d8801ae341525f38e087449b6c2f2e6050468a42c/contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86", size = 313000 }, - { url = "https://files.pythonhosted.org/packages/c4/18/65280989b151fcf33a8352f992eff71e61b968bef7432fbfde3a364f0730/contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6", size = 352925 }, - { url = "https://files.pythonhosted.org/packages/f5/c7/5fd0146c93220dbfe1a2e0f98969293b86ca9bc041d6c90c0e065f4619ad/contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85", size = 323693 }, - { url = "https://files.pythonhosted.org/packages/85/fc/7fa5d17daf77306840a4e84668a48ddff09e6bc09ba4e37e85ffc8e4faa3/contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c", size = 326184 }, - { url = "https://files.pythonhosted.org/packages/ef/e7/104065c8270c7397c9571620d3ab880558957216f2b5ebb7e040f85eeb22/contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291", size = 1268031 }, - { url = "https://files.pythonhosted.org/packages/e2/4a/c788d0bdbf32c8113c2354493ed291f924d4793c4a2e85b69e737a21a658/contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f", size = 1325995 }, - { url = "https://files.pythonhosted.org/packages/a6/e6/a2f351a90d955f8b0564caf1ebe4b1451a3f01f83e5e3a414055a5b8bccb/contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375", size = 174396 }, - { url = "https://files.pythonhosted.org/packages/a8/7e/cd93cab453720a5d6cb75588cc17dcdc08fc3484b9de98b885924ff61900/contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9", size = 219787 }, - { url = "https://files.pythonhosted.org/packages/37/6b/175f60227d3e7f5f1549fcb374592be311293132207e451c3d7c654c25fb/contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509", size = 271494 }, - { url = "https://files.pythonhosted.org/packages/6b/6a/7833cfae2c1e63d1d8875a50fd23371394f540ce809d7383550681a1fa64/contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc", size = 255444 }, - { url = "https://files.pythonhosted.org/packages/7f/b3/7859efce66eaca5c14ba7619791b084ed02d868d76b928ff56890d2d059d/contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454", size = 307628 }, - { url = "https://files.pythonhosted.org/packages/48/b2/011415f5e3f0a50b1e285a0bf78eb5d92a4df000553570f0851b6e309076/contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80", size = 347271 }, - { url = "https://files.pythonhosted.org/packages/84/7d/ef19b1db0f45b151ac78c65127235239a8cf21a59d1ce8507ce03e89a30b/contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec", size = 318906 }, - { url = "https://files.pythonhosted.org/packages/ba/99/6794142b90b853a9155316c8f470d2e4821fe6f086b03e372aca848227dd/contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9", size = 323622 }, - { url = "https://files.pythonhosted.org/packages/3c/0f/37d2c84a900cd8eb54e105f4fa9aebd275e14e266736778bb5dccbf3bbbb/contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b", size = 1266699 }, - { url = "https://files.pythonhosted.org/packages/3a/8a/deb5e11dc7d9cc8f0f9c8b29d4f062203f3af230ba83c30a6b161a6effc9/contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d", size = 1326395 }, - { url = "https://files.pythonhosted.org/packages/1a/35/7e267ae7c13aaf12322ccc493531f1e7f2eb8fba2927b9d7a05ff615df7a/contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e", size = 175354 }, - { url = "https://files.pythonhosted.org/packages/a1/35/c2de8823211d07e8a79ab018ef03960716c5dff6f4d5bff5af87fd682992/contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d", size = 220971 }, - { url = "https://files.pythonhosted.org/packages/9a/e7/de62050dce687c5e96f946a93546910bc67e483fe05324439e329ff36105/contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2", size = 271548 }, - { url = "https://files.pythonhosted.org/packages/78/4d/c2a09ae014ae984c6bdd29c11e74d3121b25eaa117eca0bb76340efd7e1c/contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5", size = 255576 }, - { url = "https://files.pythonhosted.org/packages/ab/8a/915380ee96a5638bda80cd061ccb8e666bfdccea38d5741cb69e6dbd61fc/contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81", size = 306635 }, - { url = "https://files.pythonhosted.org/packages/29/5c/c83ce09375428298acd4e6582aeb68b1e0d1447f877fa993d9bf6cd3b0a0/contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2", size = 345925 }, - { url = "https://files.pythonhosted.org/packages/29/63/5b52f4a15e80c66c8078a641a3bfacd6e07106835682454647aca1afc852/contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7", size = 318000 }, - { url = "https://files.pythonhosted.org/packages/9a/e2/30ca086c692691129849198659bf0556d72a757fe2769eb9620a27169296/contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c", size = 322689 }, - { url = "https://files.pythonhosted.org/packages/6b/77/f37812ef700f1f185d348394debf33f22d531e714cf6a35d13d68a7003c7/contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3", size = 1268413 }, - { url = "https://files.pythonhosted.org/packages/3f/6d/ce84e79cdd128542ebeb268f84abb4b093af78e7f8ec504676673d2675bc/contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1", size = 1326530 }, - { url = "https://files.pythonhosted.org/packages/72/22/8282f4eae20c73c89bee7a82a19c4e27af9b57bb602ecaa00713d5bdb54d/contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82", size = 175315 }, - { url = "https://files.pythonhosted.org/packages/e3/d5/28bca491f65312b438fbf076589dcde7f6f966b196d900777f5811b9c4e2/contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd", size = 220987 }, - { url = "https://files.pythonhosted.org/packages/2f/24/a4b285d6adaaf9746e4700932f579f1a7b6f9681109f694cfa233ae75c4e/contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30", size = 285001 }, - { url = "https://files.pythonhosted.org/packages/48/1d/fb49a401b5ca4f06ccf467cd6c4f1fd65767e63c21322b29b04ec40b40b9/contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751", size = 268553 }, - { url = "https://files.pythonhosted.org/packages/79/1e/4aef9470d13fd029087388fae750dccb49a50c012a6c8d1d634295caa644/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342", size = 310386 }, - { url = "https://files.pythonhosted.org/packages/b0/34/910dc706ed70153b60392b5305c708c9810d425bde12499c9184a1100888/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c", size = 349806 }, - { url = "https://files.pythonhosted.org/packages/31/3c/faee6a40d66d7f2a87f7102236bf4780c57990dd7f98e5ff29881b1b1344/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f", size = 321108 }, - { url = "https://files.pythonhosted.org/packages/17/69/390dc9b20dd4bb20585651d7316cc3054b7d4a7b4f8b710b2b698e08968d/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda", size = 327291 }, - { url = "https://files.pythonhosted.org/packages/ef/74/7030b67c4e941fe1e5424a3d988080e83568030ce0355f7c9fc556455b01/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242", size = 1263752 }, - { url = "https://files.pythonhosted.org/packages/f0/ed/92d86f183a8615f13f6b9cbfc5d4298a509d6ce433432e21da838b4b63f4/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1", size = 1318403 }, - { url = "https://files.pythonhosted.org/packages/b3/0e/c8e4950c77dcfc897c71d61e56690a0a9df39543d2164040301b5df8e67b/contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1", size = 185117 }, - { url = "https://files.pythonhosted.org/packages/c1/31/1ae946f11dfbd229222e6d6ad8e7bd1891d3d48bde5fbf7a0beb9491f8e3/contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546", size = 236668 }, -] - -[[package]] -name = "coverage" -version = "7.6.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/84/ba/ac14d281f80aab516275012e8875991bb06203957aa1e19950139238d658/coverage-7.6.10.tar.gz", hash = "sha256:7fb105327c8f8f0682e29843e2ff96af9dcbe5bab8eeb4b398c6a33a16d80a23", size = 803868 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/85/d2/5e175fcf6766cf7501a8541d81778fd2f52f4870100e791f5327fd23270b/coverage-7.6.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ea3c8f04b3e4af80e17bab607c386a830ffc2fb88a5484e1df756478cf70d1d3", size = 208088 }, - { url = "https://files.pythonhosted.org/packages/4b/6f/06db4dc8fca33c13b673986e20e466fd936235a6ec1f0045c3853ac1b593/coverage-7.6.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:507a20fc863cae1d5720797761b42d2d87a04b3e5aeb682ef3b7332e90598f43", size = 208536 }, - { url = "https://files.pythonhosted.org/packages/0d/62/c6a0cf80318c1c1af376d52df444da3608eafc913b82c84a4600d8349472/coverage-7.6.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d37a84878285b903c0fe21ac8794c6dab58150e9359f1aaebbeddd6412d53132", size = 240474 }, - { url = "https://files.pythonhosted.org/packages/a3/59/750adafc2e57786d2e8739a46b680d4fb0fbc2d57fbcb161290a9f1ecf23/coverage-7.6.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a534738b47b0de1995f85f582d983d94031dffb48ab86c95bdf88dc62212142f", size = 237880 }, - { url = "https://files.pythonhosted.org/packages/2c/f8/ef009b3b98e9f7033c19deb40d629354aab1d8b2d7f9cfec284dbedf5096/coverage-7.6.10-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d7a2bf79378d8fb8afaa994f91bfd8215134f8631d27eba3e0e2c13546ce994", size = 239750 }, - { url = "https://files.pythonhosted.org/packages/a6/e2/6622f3b70f5f5b59f705e680dae6db64421af05a5d1e389afd24dae62e5b/coverage-7.6.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6713ba4b4ebc330f3def51df1d5d38fad60b66720948112f114968feb52d3f99", size = 238642 }, - { url = "https://files.pythonhosted.org/packages/2d/10/57ac3f191a3c95c67844099514ff44e6e19b2915cd1c22269fb27f9b17b6/coverage-7.6.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab32947f481f7e8c763fa2c92fd9f44eeb143e7610c4ca9ecd6a36adab4081bd", size = 237266 }, - { url = "https://files.pythonhosted.org/packages/ee/2d/7016f4ad9d553cabcb7333ed78ff9d27248ec4eba8dd21fa488254dff894/coverage-7.6.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7bbd8c8f1b115b892e34ba66a097b915d3871db7ce0e6b9901f462ff3a975377", size = 238045 }, - { url = "https://files.pythonhosted.org/packages/a7/fe/45af5c82389a71e0cae4546413266d2195c3744849669b0bab4b5f2c75da/coverage-7.6.10-cp311-cp311-win32.whl", hash = "sha256:299e91b274c5c9cdb64cbdf1b3e4a8fe538a7a86acdd08fae52301b28ba297f8", size = 210647 }, - { url = "https://files.pythonhosted.org/packages/db/11/3f8e803a43b79bc534c6a506674da9d614e990e37118b4506faf70d46ed6/coverage-7.6.10-cp311-cp311-win_amd64.whl", hash = "sha256:489a01f94aa581dbd961f306e37d75d4ba16104bbfa2b0edb21d29b73be83609", size = 211508 }, - { url = "https://files.pythonhosted.org/packages/86/77/19d09ea06f92fdf0487499283b1b7af06bc422ea94534c8fe3a4cd023641/coverage-7.6.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27c6e64726b307782fa5cbe531e7647aee385a29b2107cd87ba7c0105a5d3853", size = 208281 }, - { url = "https://files.pythonhosted.org/packages/b6/67/5479b9f2f99fcfb49c0d5cf61912a5255ef80b6e80a3cddba39c38146cf4/coverage-7.6.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c56e097019e72c373bae32d946ecf9858fda841e48d82df7e81c63ac25554078", size = 208514 }, - { url = "https://files.pythonhosted.org/packages/15/d1/febf59030ce1c83b7331c3546d7317e5120c5966471727aa7ac157729c4b/coverage-7.6.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7827a5bc7bdb197b9e066cdf650b2887597ad124dd99777332776f7b7c7d0d0", size = 241537 }, - { url = "https://files.pythonhosted.org/packages/4b/7e/5ac4c90192130e7cf8b63153fe620c8bfd9068f89a6d9b5f26f1550f7a26/coverage-7.6.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204a8238afe787323a8b47d8be4df89772d5c1e4651b9ffa808552bdf20e1d50", size = 238572 }, - { url = "https://files.pythonhosted.org/packages/dc/03/0334a79b26ecf59958f2fe9dd1f5ab3e2f88db876f5071933de39af09647/coverage-7.6.10-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67926f51821b8e9deb6426ff3164870976fe414d033ad90ea75e7ed0c2e5022", size = 240639 }, - { url = "https://files.pythonhosted.org/packages/d7/45/8a707f23c202208d7b286d78ad6233f50dcf929319b664b6cc18a03c1aae/coverage-7.6.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e78b270eadb5702938c3dbe9367f878249b5ef9a2fcc5360ac7bff694310d17b", size = 240072 }, - { url = "https://files.pythonhosted.org/packages/66/02/603ce0ac2d02bc7b393279ef618940b4a0535b0868ee791140bda9ecfa40/coverage-7.6.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:714f942b9c15c3a7a5fe6876ce30af831c2ad4ce902410b7466b662358c852c0", size = 238386 }, - { url = "https://files.pythonhosted.org/packages/04/62/4e6887e9be060f5d18f1dd58c2838b2d9646faf353232dec4e2d4b1c8644/coverage-7.6.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:abb02e2f5a3187b2ac4cd46b8ced85a0858230b577ccb2c62c81482ca7d18852", size = 240054 }, - { url = "https://files.pythonhosted.org/packages/5c/74/83ae4151c170d8bd071924f212add22a0e62a7fe2b149edf016aeecad17c/coverage-7.6.10-cp312-cp312-win32.whl", hash = "sha256:55b201b97286cf61f5e76063f9e2a1d8d2972fc2fcfd2c1272530172fd28c359", size = 210904 }, - { url = "https://files.pythonhosted.org/packages/c3/54/de0893186a221478f5880283119fc40483bc460b27c4c71d1b8bba3474b9/coverage-7.6.10-cp312-cp312-win_amd64.whl", hash = "sha256:e4ae5ac5e0d1e4edfc9b4b57b4cbecd5bc266a6915c500f358817a8496739247", size = 211692 }, - { url = "https://files.pythonhosted.org/packages/25/6d/31883d78865529257bf847df5789e2ae80e99de8a460c3453dbfbe0db069/coverage-7.6.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05fca8ba6a87aabdd2d30d0b6c838b50510b56cdcfc604d40760dae7153b73d9", size = 208308 }, - { url = "https://files.pythonhosted.org/packages/70/22/3f2b129cc08de00c83b0ad6252e034320946abfc3e4235c009e57cfeee05/coverage-7.6.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9e80eba8801c386f72e0712a0453431259c45c3249f0009aff537a517b52942b", size = 208565 }, - { url = "https://files.pythonhosted.org/packages/97/0a/d89bc2d1cc61d3a8dfe9e9d75217b2be85f6c73ebf1b9e3c2f4e797f4531/coverage-7.6.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a372c89c939d57abe09e08c0578c1d212e7a678135d53aa16eec4430adc5e690", size = 241083 }, - { url = "https://files.pythonhosted.org/packages/4c/81/6d64b88a00c7a7aaed3a657b8eaa0931f37a6395fcef61e53ff742b49c97/coverage-7.6.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec22b5e7fe7a0fa8509181c4aac1db48f3dd4d3a566131b313d1efc102892c18", size = 238235 }, - { url = "https://files.pythonhosted.org/packages/9a/0b/7797d4193f5adb4b837207ed87fecf5fc38f7cc612b369a8e8e12d9fa114/coverage-7.6.10-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26bcf5c4df41cad1b19c84af71c22cbc9ea9a547fc973f1f2cc9a290002c8b3c", size = 240220 }, - { url = "https://files.pythonhosted.org/packages/65/4d/6f83ca1bddcf8e51bf8ff71572f39a1c73c34cf50e752a952c34f24d0a60/coverage-7.6.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e4630c26b6084c9b3cb53b15bd488f30ceb50b73c35c5ad7871b869cb7365fd", size = 239847 }, - { url = "https://files.pythonhosted.org/packages/30/9d/2470df6aa146aff4c65fee0f87f58d2164a67533c771c9cc12ffcdb865d5/coverage-7.6.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2396e8116db77789f819d2bc8a7e200232b7a282c66e0ae2d2cd84581a89757e", size = 237922 }, - { url = "https://files.pythonhosted.org/packages/08/dd/723fef5d901e6a89f2507094db66c091449c8ba03272861eaefa773ad95c/coverage-7.6.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79109c70cc0882e4d2d002fe69a24aa504dec0cc17169b3c7f41a1d341a73694", size = 239783 }, - { url = "https://files.pythonhosted.org/packages/3d/f7/64d3298b2baf261cb35466000628706ce20a82d42faf9b771af447cd2b76/coverage-7.6.10-cp313-cp313-win32.whl", hash = "sha256:9e1747bab246d6ff2c4f28b4d186b205adced9f7bd9dc362051cc37c4a0c7bd6", size = 210965 }, - { url = "https://files.pythonhosted.org/packages/d5/58/ec43499a7fc681212fe7742fe90b2bc361cdb72e3181ace1604247a5b24d/coverage-7.6.10-cp313-cp313-win_amd64.whl", hash = "sha256:254f1a3b1eef5f7ed23ef265eaa89c65c8c5b6b257327c149db1ca9d4a35f25e", size = 211719 }, - { url = "https://files.pythonhosted.org/packages/ab/c9/f2857a135bcff4330c1e90e7d03446b036b2363d4ad37eb5e3a47bbac8a6/coverage-7.6.10-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2ccf240eb719789cedbb9fd1338055de2761088202a9a0b73032857e53f612fe", size = 209050 }, - { url = "https://files.pythonhosted.org/packages/aa/b3/f840e5bd777d8433caa9e4a1eb20503495709f697341ac1a8ee6a3c906ad/coverage-7.6.10-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c807ca74d5a5e64427c8805de15b9ca140bba13572d6d74e262f46f50b13273", size = 209321 }, - { url = "https://files.pythonhosted.org/packages/85/7d/125a5362180fcc1c03d91850fc020f3831d5cda09319522bcfa6b2b70be7/coverage-7.6.10-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bcfa46d7709b5a7ffe089075799b902020b62e7ee56ebaed2f4bdac04c508d8", size = 252039 }, - { url = "https://files.pythonhosted.org/packages/a9/9c/4358bf3c74baf1f9bddd2baf3756b54c07f2cfd2535f0a47f1e7757e54b3/coverage-7.6.10-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e0de1e902669dccbf80b0415fb6b43d27edca2fbd48c74da378923b05316098", size = 247758 }, - { url = "https://files.pythonhosted.org/packages/cf/c7/de3eb6fc5263b26fab5cda3de7a0f80e317597a4bad4781859f72885f300/coverage-7.6.10-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7b444c42bbc533aaae6b5a2166fd1a797cdb5eb58ee51a92bee1eb94a1e1cb", size = 250119 }, - { url = "https://files.pythonhosted.org/packages/3e/e6/43de91f8ba2ec9140c6a4af1102141712949903dc732cf739167cfa7a3bc/coverage-7.6.10-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b330368cb99ef72fcd2dc3ed260adf67b31499584dc8a20225e85bfe6f6cfed0", size = 249597 }, - { url = "https://files.pythonhosted.org/packages/08/40/61158b5499aa2adf9e37bc6d0117e8f6788625b283d51e7e0c53cf340530/coverage-7.6.10-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9a7cfb50515f87f7ed30bc882f68812fd98bc2852957df69f3003d22a2aa0abf", size = 247473 }, - { url = "https://files.pythonhosted.org/packages/50/69/b3f2416725621e9f112e74e8470793d5b5995f146f596f133678a633b77e/coverage-7.6.10-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f93531882a5f68c28090f901b1d135de61b56331bba82028489bc51bdd818d2", size = 248737 }, - { url = "https://files.pythonhosted.org/packages/3c/6e/fe899fb937657db6df31cc3e61c6968cb56d36d7326361847440a430152e/coverage-7.6.10-cp313-cp313t-win32.whl", hash = "sha256:89d76815a26197c858f53c7f6a656686ec392b25991f9e409bcef020cd532312", size = 211611 }, - { url = "https://files.pythonhosted.org/packages/1c/55/52f5e66142a9d7bc93a15192eba7a78513d2abf6b3558d77b4ca32f5f424/coverage-7.6.10-cp313-cp313t-win_amd64.whl", hash = "sha256:54a5f0f43950a36312155dae55c505a76cd7f2b12d26abeebbe7a0b36dbc868d", size = 212781 }, -] - -[package.optional-dependencies] -toml = [ - { name = "tomli", marker = "python_full_version <= '3.11'" }, -] - -[[package]] -name = "cycler" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321 }, -] - -[[package]] -name = "debugpy" -version = "1.8.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/e7/666f4c9b0e24796af50aadc28d36d21c2e01e831a934535f956e09b3650c/debugpy-1.8.11.tar.gz", hash = "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57", size = 1640124 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/58/8e3f7ec86c1b7985a232667b5df8f3b1b1c8401028d8f4d75e025c9556cd/debugpy-1.8.11-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:85de8474ad53ad546ff1c7c7c89230db215b9b8a02754d41cb5a76f70d0be296", size = 2173656 }, - { url = "https://files.pythonhosted.org/packages/d2/03/95738a68ade2358e5a4d63a2fd8e7ed9ad911001cfabbbb33a7f81343945/debugpy-1.8.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ffc382e4afa4aee367bf413f55ed17bd91b191dcaf979890af239dda435f2a1", size = 3132464 }, - { url = "https://files.pythonhosted.org/packages/ca/f4/18204891ab67300950615a6ad09b9de236203a9138f52b3b596fa17628ca/debugpy-1.8.11-cp311-cp311-win32.whl", hash = "sha256:40499a9979c55f72f4eb2fc38695419546b62594f8af194b879d2a18439c97a9", size = 5103637 }, - { url = "https://files.pythonhosted.org/packages/3b/90/3775e301cfa573b51eb8a108285681f43f5441dc4c3916feed9f386ef861/debugpy-1.8.11-cp311-cp311-win_amd64.whl", hash = "sha256:987bce16e86efa86f747d5151c54e91b3c1e36acc03ce1ddb50f9d09d16ded0e", size = 5127862 }, - { url = "https://files.pythonhosted.org/packages/c6/ae/2cf26f3111e9d94384d9c01e9d6170188b0aeda15b60a4ac6457f7c8a26f/debugpy-1.8.11-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308", size = 2498756 }, - { url = "https://files.pythonhosted.org/packages/b0/16/ec551789d547541a46831a19aa15c147741133da188e7e6acf77510545a7/debugpy-1.8.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768", size = 4219136 }, - { url = "https://files.pythonhosted.org/packages/72/6f/b2b3ce673c55f882d27a6eb04a5f0c68bcad6b742ac08a86d8392ae58030/debugpy-1.8.11-cp312-cp312-win32.whl", hash = "sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b", size = 5224440 }, - { url = "https://files.pythonhosted.org/packages/77/09/b1f05be802c1caef5b3efc042fc6a7cadd13d8118b072afd04a9b9e91e06/debugpy-1.8.11-cp312-cp312-win_amd64.whl", hash = "sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1", size = 5264578 }, - { url = "https://files.pythonhosted.org/packages/2e/66/931dc2479aa8fbf362dc6dcee707d895a84b0b2d7b64020135f20b8db1ed/debugpy-1.8.11-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3", size = 2483651 }, - { url = "https://files.pythonhosted.org/packages/10/07/6c171d0fe6b8d237e35598b742f20ba062511b3a4631938cc78eefbbf847/debugpy-1.8.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e", size = 4213770 }, - { url = "https://files.pythonhosted.org/packages/89/f1/0711da6ac250d4fe3bf7b3e9b14b4a86e82a98b7825075c07e19bab8da3d/debugpy-1.8.11-cp313-cp313-win32.whl", hash = "sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28", size = 5223911 }, - { url = "https://files.pythonhosted.org/packages/56/98/5e27fa39050749ed460025bcd0034a0a5e78a580a14079b164cc3abdeb98/debugpy-1.8.11-cp313-cp313-win_amd64.whl", hash = "sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1", size = 5264166 }, - { url = "https://files.pythonhosted.org/packages/77/0a/d29a5aacf47b4383ed569b8478c02d59ee3a01ad91224d2cff8562410e43/debugpy-1.8.11-py2.py3-none-any.whl", hash = "sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920", size = 5226874 }, -] - -[[package]] -name = "decorator" -version = "5.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/0c/8d907af351aa16b42caae42f9d6aa37b900c67308052d10fdce809f8d952/decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", size = 35016 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/50/83c593b07763e1161326b3b8c6686f0f4b0f24d5526546bee538c89837d6/decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186", size = 9073 }, -] - -[[package]] -name = "defusedxml" -version = "0.7.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604 }, -] - -[[package]] -name = "dictio" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonschema" }, - { name = "lxml" }, - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7c/d6/afa4be318fdd3ea287dd4300145d505646732ea712717ed3a342d3af06cf/dictio-0.4.0.tar.gz", hash = "sha256:c637ed257923c8f3991b8fccb7c103d9240512ccb60322b5f43a76203f450487", size = 95732 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/59/9921cc5fd537572bbd88ac6ab2a0b6bac0ea8f3fd200934f7a310dcecf0c/dictio-0.4.0-py3-none-any.whl", hash = "sha256:460a0b03f19a0eb68d4455407e416c457a5068f1b06f8c522c44a4fe7a207145", size = 59421 }, -] - -[[package]] -name = "distlib" -version = "0.3.9" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0d/dd/1bec4c5ddb504ca60fc29472f3d27e8d4da1257a854e1d96742f15c1d02d/distlib-0.3.9.tar.gz", hash = "sha256:a60f20dea646b8a33f3e7772f74dc0b2d0772d2837ee1342a00645c81edf9403", size = 613923 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/a1/cf2472db20f7ce4a6be1253a81cfdf85ad9c7885ffbed7047fb72c24cf87/distlib-0.3.9-py2.py3-none-any.whl", hash = "sha256:47f8c22fd27c27e25a65601af709b38e4f0a45ea4fc2e710f65755fa8caaaf87", size = 468973 }, -] - -[[package]] -name = "docutils" -version = "0.21.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, -] - -[[package]] -name = "executing" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/e3/7d45f492c2c4a0e8e0fad57d081a7c8a0286cdd86372b070cca1ec0caa1e/executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab", size = 977485 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/fd/afcd0496feca3276f509df3dbd5dae726fcc756f1a08d9e25abe1733f962/executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", size = 25805 }, -] - -[[package]] -name = "fastjsonschema" -version = "2.21.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924 }, -] - -[[package]] -name = "filelock" -version = "3.16.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, -] - -[[package]] -name = "folium" -version = "0.19.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "branca" }, - { name = "jinja2" }, - { name = "numpy" }, - { name = "requests" }, - { name = "xyzservices" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ca/09/469cbe217cddc0cb11542fa38f50014e548b2dda010f67185b0579885cd6/folium-0.19.4.tar.gz", hash = "sha256:431a655b52a9bf3efda336f2be022103f0106504a0599e7c349efbfd30bafda6", size = 105936 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/ab/d1f47c48a14e17cd487c8b467b573291fae75477b067241407e7889a3692/folium-0.19.4-py2.py3-none-any.whl", hash = "sha256:bea5246b6a6aa61b96d1c51399dd63254bacbd6ba8a826eeb491f45242032dfd", size = 110511 }, -] - -[[package]] -name = "fonttools" -version = "4.55.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/61/a300d1574dc381393424047c0396a0e213db212e28361123af9830d71a8d/fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45", size = 3498155 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/18/14be25545600bd100e5b74a3ac39089b7c1cb403dc513b7ca348be3381bf/fonttools-4.55.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c4491699bad88efe95772543cd49870cf756b019ad56294f6498982408ab03e", size = 2771005 }, - { url = "https://files.pythonhosted.org/packages/b2/51/2e1a5d3871cd7c2ae2054b54e92604e7d6abc3fd3656e9583c399648fe1c/fonttools-4.55.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5323a22eabddf4b24f66d26894f1229261021dacd9d29e89f7872dd8c63f0b8b", size = 2300654 }, - { url = "https://files.pythonhosted.org/packages/73/1a/50109bb2703bc6f774b52ea081db21edf2a9fa4b6d7485faadf9d1b997e9/fonttools-4.55.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5480673f599ad410695ca2ddef2dfefe9df779a9a5cda89503881e503c9c7d90", size = 4877541 }, - { url = "https://files.pythonhosted.org/packages/5d/52/c0b9857fa075da1b8806c5dc2d8342918a8cc2065fd14fbddb3303282693/fonttools-4.55.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da9da6d65cd7aa6b0f806556f4985bcbf603bf0c5c590e61b43aa3e5a0f822d0", size = 4906304 }, - { url = "https://files.pythonhosted.org/packages/0b/1b/55f85c7e962d295e456d5209581c919620ee3e877b95cd86245187a5050f/fonttools-4.55.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e894b5bd60d9f473bed7a8f506515549cc194de08064d829464088d23097331b", size = 4888087 }, - { url = "https://files.pythonhosted.org/packages/83/13/6f2809c612ea2ac51391f92468ff861c63473601530fca96458b453212bf/fonttools-4.55.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aee3b57643827e237ff6ec6d28d9ff9766bd8b21e08cd13bff479e13d4b14765", size = 5056958 }, - { url = "https://files.pythonhosted.org/packages/c1/28/d0ea9e872fa4208b9dfca686e1dd9ca22f6c9ef33ecff2f0ebc2dbe7c29b/fonttools-4.55.3-cp311-cp311-win32.whl", hash = "sha256:eb6ca911c4c17eb51853143624d8dc87cdcdf12a711fc38bf5bd21521e79715f", size = 2173939 }, - { url = "https://files.pythonhosted.org/packages/be/36/d74ae1020bc41a1dff3e6f5a99f646563beecb97e386d27abdac3ba07650/fonttools-4.55.3-cp311-cp311-win_amd64.whl", hash = "sha256:6314bf82c54c53c71805318fcf6786d986461622dd926d92a465199ff54b1b72", size = 2220363 }, - { url = "https://files.pythonhosted.org/packages/89/58/fbcf5dff7e3ea844bb00c4d806ca1e339e1f2dce5529633bf4842c0c9a1f/fonttools-4.55.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9e736f60f4911061235603a6119e72053073a12c6d7904011df2d8fad2c0e35", size = 2765380 }, - { url = "https://files.pythonhosted.org/packages/81/dd/da6e329e51919b4f421c8738f3497e2ab08c168e76aaef7b6d5351862bdf/fonttools-4.55.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a8aa2c5e5b8b3bcb2e4538d929f6589a5c6bdb84fd16e2ed92649fb5454f11c", size = 2297940 }, - { url = "https://files.pythonhosted.org/packages/00/44/f5ee560858425c99ef07e04919e736db09d6416408e5a8d3bbfb4a6623fd/fonttools-4.55.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07f8288aacf0a38d174445fc78377a97fb0b83cfe352a90c9d9c1400571963c7", size = 4793327 }, - { url = "https://files.pythonhosted.org/packages/24/da/0a001926d791c55e29ac3c52964957a20dbc1963615446b568b7432891c3/fonttools-4.55.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8d5e8916c0970fbc0f6f1bece0063363bb5857a7f170121a4493e31c3db3314", size = 4865624 }, - { url = "https://files.pythonhosted.org/packages/3d/d8/1edd8b13a427a9fb6418373437caa586c0caa57f260af8e0548f4d11e340/fonttools-4.55.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae3b6600565b2d80b7c05acb8e24d2b26ac407b27a3f2e078229721ba5698427", size = 4774166 }, - { url = "https://files.pythonhosted.org/packages/9c/ec/ade054097976c3d6debc9032e09a351505a0196aa5493edf021be376f75e/fonttools-4.55.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:54153c49913f45065c8d9e6d0c101396725c5621c8aee744719300f79771d75a", size = 5001832 }, - { url = "https://files.pythonhosted.org/packages/e2/cd/233f0e31ad799bb91fc78099c8b4e5ec43b85a131688519640d6bae46f6a/fonttools-4.55.3-cp312-cp312-win32.whl", hash = "sha256:827e95fdbbd3e51f8b459af5ea10ecb4e30af50221ca103bea68218e9615de07", size = 2162228 }, - { url = "https://files.pythonhosted.org/packages/46/45/a498b5291f6c0d91b2394b1ed7447442a57d1c9b9cf8f439aee3c316a56e/fonttools-4.55.3-cp312-cp312-win_amd64.whl", hash = "sha256:e6e8766eeeb2de759e862004aa11a9ea3d6f6d5ec710551a88b476192b64fd54", size = 2209118 }, - { url = "https://files.pythonhosted.org/packages/9c/9f/00142a19bad96eeeb1aed93f567adc19b7f2c1af6f5bc0a1c3de90b4b1ac/fonttools-4.55.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a430178ad3e650e695167cb53242dae3477b35c95bef6525b074d87493c4bf29", size = 2752812 }, - { url = "https://files.pythonhosted.org/packages/b0/20/14b8250d63ba65e162091fb0dda07730f90c303bbf5257e9ddacec7230d9/fonttools-4.55.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:529cef2ce91dc44f8e407cc567fae6e49a1786f2fefefa73a294704c415322a4", size = 2291521 }, - { url = "https://files.pythonhosted.org/packages/34/47/a681cfd10245eb74f65e491a934053ec75c4af639655446558f29818e45e/fonttools-4.55.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e75f12c82127486fac2d8bfbf5bf058202f54bf4f158d367e41647b972342ca", size = 4770980 }, - { url = "https://files.pythonhosted.org/packages/d2/6c/a7066afc19db0705a12efd812e19c32cde2b9514eb714659522f2ebd60b6/fonttools-4.55.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:859c358ebf41db18fb72342d3080bce67c02b39e86b9fbcf1610cca14984841b", size = 4845534 }, - { url = "https://files.pythonhosted.org/packages/0c/a2/3c204fbabbfd845d9bdcab9ae35279d41e9a4bf5c80a0a2708f9c5a195d6/fonttools-4.55.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:546565028e244a701f73df6d8dd6be489d01617863ec0c6a42fa25bf45d43048", size = 4753910 }, - { url = "https://files.pythonhosted.org/packages/6e/8c/b4cb3592880340b89e4ef6601b531780bba73862332a6451d78fe135d6cb/fonttools-4.55.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:aca318b77f23523309eec4475d1fbbb00a6b133eb766a8bdc401faba91261abe", size = 4976411 }, - { url = "https://files.pythonhosted.org/packages/fc/a8/4bf98840ff89fcc188470b59daec57322178bf36d2f4f756cd19a42a826b/fonttools-4.55.3-cp313-cp313-win32.whl", hash = "sha256:8c5ec45428edaa7022f1c949a632a6f298edc7b481312fc7dc258921e9399628", size = 2160178 }, - { url = "https://files.pythonhosted.org/packages/e6/57/4cc35004605416df3225ff362f3455cf09765db00df578ae9e46d0fefd23/fonttools-4.55.3-cp313-cp313-win_amd64.whl", hash = "sha256:11e5de1ee0d95af4ae23c1a138b184b7f06e0b6abacabf1d0db41c90b03d834b", size = 2206102 }, - { url = "https://files.pythonhosted.org/packages/99/3b/406d17b1f63e04a82aa621936e6e1c53a8c05458abd66300ac85ea7f9ae9/fonttools-4.55.3-py3-none-any.whl", hash = "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977", size = 1111638 }, -] - -[[package]] -name = "fqdn" -version = "1.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f", size = 6015 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014", size = 9121 }, -] - -[[package]] -name = "furo" -version = "2024.8.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, - { name = "pygments" }, - { name = "sphinx" }, - { name = "sphinx-basic-ng" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333 }, -] - -[[package]] -name = "global-land-mask" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6e/cd/d06fe252cbe41b85c7a1a54e4d4214c79b770eb5d6c6fa3b03e56371a6da/global-land-mask-1.0.0.tar.gz", hash = "sha256:956bf02e8b05bfc9f3a29cbc6e97d5ba4151c0732504acc73c2db9ea325ecff3", size = 1825546 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/e9/eaac67e39b68f64828a164f8dbfcf13baccd7382704ea120152af475f520/global_land_mask-1.0.0-py3-none-any.whl", hash = "sha256:07751fbb4e3834ee508a84ea64d9bd5340fbd0a8c951e24b43c323fcc670bb62", size = 1836944 }, -] - -[[package]] -name = "h11" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, -] - -[[package]] -name = "httpcore" -version = "1.0.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, -] - -[[package]] -name = "identify" -version = "2.6.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cf/92/69934b9ef3c31ca2470980423fda3d00f0460ddefdf30a67adf7f17e2e00/identify-2.6.5.tar.gz", hash = "sha256:c10b33f250e5bba374fae86fb57f3adcebf1161bce7cdf92031915fd480c13bc", size = 99213 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/fa/dce098f4cdf7621aa8f7b4f919ce545891f489482f0bfa5102f3eca8608b/identify-2.6.5-py2.py3-none-any.whl", hash = "sha256:14181a47091eb75b337af4c23078c9d09225cd4c48929f521f3bf16b09d02566", size = 99078 }, -] - -[[package]] -name = "idna" -version = "3.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, -] - -[[package]] -name = "imagesize" -version = "1.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", size = 4646 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", size = 5892 }, -] - -[[package]] -name = "ipykernel" -version = "6.29.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "appnope", marker = "sys_platform == 'darwin'" }, - { name = "comm" }, - { name = "debugpy" }, - { name = "ipython" }, - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "matplotlib-inline" }, - { name = "nest-asyncio" }, - { name = "packaging" }, - { name = "psutil" }, - { name = "pyzmq" }, - { name = "tornado" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, -] - -[[package]] -name = "ipython" -version = "8.31.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "decorator" }, - { name = "jedi" }, - { name = "matplotlib-inline" }, - { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit" }, - { name = "pygments" }, - { name = "stack-data" }, - { name = "traitlets" }, - { name = "typing-extensions", marker = "python_full_version < '3.12'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/01/35/6f90fdddff7a08b7b715fccbd2427b5212c9525cd043d26fdc45bee0708d/ipython-8.31.0.tar.gz", hash = "sha256:b6a2274606bec6166405ff05e54932ed6e5cfecaca1fc05f2cacde7bb074d70b", size = 5501011 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/04/60/d0feb6b6d9fe4ab89fe8fe5b47cbf6cd936bfd9f1e7ffa9d0015425aeed6/ipython-8.31.0-py3-none-any.whl", hash = "sha256:46ec58f8d3d076a61d128fe517a51eb730e3aaf0c184ea8c17d16e366660c6a6", size = 821583 }, -] - -[[package]] -name = "ipywidgets" -version = "8.1.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "comm" }, - { name = "ipython" }, - { name = "jupyterlab-widgets" }, - { name = "traitlets" }, - { name = "widgetsnbextension" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c7/4c/dab2a281b07596a5fc220d49827fe6c794c66f1493d7a74f1df0640f2cc5/ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17", size = 116723 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/2d/9c0b76f2f9cc0ebede1b9371b6f317243028ed60b90705863d493bae622e/ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245", size = 139767 }, -] - -[[package]] -name = "isoduration" -version = "20.11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "arrow" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9", size = 11649 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042", size = 11321 }, -] - -[[package]] -name = "jedi" -version = "0.19.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "parso" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, -] - -[[package]] -name = "jinja2" -version = "3.1.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", size = 244674 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", size = 134596 }, -] - -[[package]] -name = "json5" -version = "0.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/3d/bbe62f3d0c05a689c711cff57b2e3ac3d3e526380adb7c781989f075115c/json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559", size = 48202 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/aa/42/797895b952b682c3dafe23b1834507ee7f02f4d6299b65aaa61425763278/json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa", size = 34049 }, -] - -[[package]] -name = "jsonpointer" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef", size = 9114 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", size = 7595 }, -] - -[[package]] -name = "jsonschema" -version = "4.23.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing" }, - { name = "rpds-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, -] - -[package.optional-dependencies] -format-nongpl = [ - { name = "fqdn" }, - { name = "idna" }, - { name = "isoduration" }, - { name = "jsonpointer" }, - { name = "rfc3339-validator" }, - { name = "rfc3986-validator" }, - { name = "uri-template" }, - { name = "webcolors" }, -] - -[[package]] -name = "jsonschema-specifications" -version = "2024.10.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz", hash = "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", size = 15561 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl", hash = "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", size = 18459 }, -] - -[[package]] -name = "jupyter" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ipykernel" }, - { name = "ipywidgets" }, - { name = "jupyter-console" }, - { name = "jupyterlab" }, - { name = "nbconvert" }, - { name = "notebook" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/58/f3/af28ea964ab8bc1e472dba2e82627d36d470c51f5cd38c37502eeffaa25e/jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a", size = 5714959 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/64/285f20a31679bf547b75602702f7800e74dbabae36ef324f716c02804753/jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83", size = 2657 }, -] - -[[package]] -name = "jupyter-client" -version = "8.6.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-core" }, - { name = "python-dateutil" }, - { name = "pyzmq" }, - { name = "tornado" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, -] - -[[package]] -name = "jupyter-console" -version = "6.6.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ipykernel" }, - { name = "ipython" }, - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "prompt-toolkit" }, - { name = "pygments" }, - { name = "pyzmq" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bd/2d/e2fd31e2fc41c14e2bcb6c976ab732597e907523f6b2420305f9fc7fdbdb/jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539", size = 34363 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/77/71d78d58f15c22db16328a476426f7ac4a60d3a5a7ba3b9627ee2f7903d4/jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485", size = 24510 }, -] - -[[package]] -name = "jupyter-core" -version = "5.7.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "platformdirs" }, - { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, -] - -[[package]] -name = "jupyter-events" -version = "0.11.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jsonschema", extra = ["format-nongpl"] }, - { name = "python-json-logger" }, - { name = "pyyaml" }, - { name = "referencing" }, - { name = "rfc3339-validator" }, - { name = "rfc3986-validator" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f4/65/5791c8a979b5646ca29ea50e42b6708908b789f7ff389d1a03c1b93a1c54/jupyter_events-0.11.0.tar.gz", hash = "sha256:c0bc56a37aac29c1fbc3bcfbddb8c8c49533f9cf11f1c4e6adadba936574ab90", size = 62039 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/8c/9b65cb2cd4ea32d885993d5542244641590530836802a2e8c7449a4c61c9/jupyter_events-0.11.0-py3-none-any.whl", hash = "sha256:36399b41ce1ca45fe8b8271067d6a140ffa54cec4028e95491c93b78a855cacf", size = 19423 }, -] - -[[package]] -name = "jupyter-lsp" -version = "2.2.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-server" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/85/b4/3200b0b09c12bc3b72d943d923323c398eff382d1dcc7c0dbc8b74630e40/jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001", size = 48741 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/e0/7bd7cff65594fd9936e2f9385701e44574fc7d721331ff676ce440b14100/jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da", size = 69146 }, -] - -[[package]] -name = "jupyter-server" -version = "2.15.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "argon2-cffi" }, - { name = "jinja2" }, - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "jupyter-events" }, - { name = "jupyter-server-terminals" }, - { name = "nbconvert" }, - { name = "nbformat" }, - { name = "overrides" }, - { name = "packaging" }, - { name = "prometheus-client" }, - { name = "pywinpty", marker = "os_name == 'nt'" }, - { name = "pyzmq" }, - { name = "send2trash" }, - { name = "terminado" }, - { name = "tornado" }, - { name = "traitlets" }, - { name = "websocket-client" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/61/8c/df09d4ab646141f130f9977b32b206ba8615d1969b2eba6a2e84b7f89137/jupyter_server-2.15.0.tar.gz", hash = "sha256:9d446b8697b4f7337a1b7cdcac40778babdd93ba614b6d68ab1c0c918f1c4084", size = 725227 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/a2/89eeaf0bb954a123a909859fa507fa86f96eb61b62dc30667b60dbd5fdaf/jupyter_server-2.15.0-py3-none-any.whl", hash = "sha256:872d989becf83517012ee669f09604aa4a28097c0bd90b2f424310156c2cdae3", size = 385826 }, -] - -[[package]] -name = "jupyter-server-terminals" -version = "0.5.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pywinpty", marker = "os_name == 'nt'" }, - { name = "terminado" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269", size = 31430 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa", size = 13656 }, -] - -[[package]] -name = "jupyterlab" -version = "4.3.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "async-lru" }, - { name = "httpx" }, - { name = "ipykernel" }, - { name = "jinja2" }, - { name = "jupyter-core" }, - { name = "jupyter-lsp" }, - { name = "jupyter-server" }, - { name = "jupyterlab-server" }, - { name = "notebook-shim" }, - { name = "packaging" }, - { name = "setuptools" }, - { name = "tornado" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a7/45/1052f842e066902b1d78126df7e2269b1b9408991e1344e167b2e429f9e1/jupyterlab-4.3.4.tar.gz", hash = "sha256:f0bb9b09a04766e3423cccc2fc23169aa2ffedcdf8713e9e0fb33cac0b6859d0", size = 21797583 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/48/af57263e53cfc220e522de047aa0993f53bab734fe812af1e03e33ac6d7c/jupyterlab-4.3.4-py3-none-any.whl", hash = "sha256:b754c2601c5be6adf87cb5a1d8495d653ffb945f021939f77776acaa94dae952", size = 11665373 }, -] - -[[package]] -name = "jupyterlab-pygments" -version = "0.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884 }, -] - -[[package]] -name = "jupyterlab-server" -version = "2.27.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "babel" }, - { name = "jinja2" }, - { name = "json5" }, - { name = "jsonschema" }, - { name = "jupyter-server" }, - { name = "packaging" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0a/c9/a883ce65eb27905ce77ace410d83587c82ea64dc85a48d1f7ed52bcfa68d/jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4", size = 76173 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/09/2032e7d15c544a0e3cd831c51d77a8ca57f7555b2e1b2922142eddb02a84/jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", size = 59700 }, -] - -[[package]] -name = "jupyterlab-widgets" -version = "3.0.13" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/59/73/fa26bbb747a9ea4fca6b01453aa22990d52ab62dd61384f1ac0dc9d4e7ba/jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed", size = 203556 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/93/858e87edc634d628e5d752ba944c2833133a28fa87bb093e6832ced36a3e/jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54", size = 214392 }, -] - -[[package]] -name = "kiwisolver" -version = "1.4.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", size = 97538 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", size = 124635 }, - { url = "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", size = 66717 }, - { url = "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", size = 65413 }, - { url = "https://files.pythonhosted.org/packages/a9/98/1df4089b1ed23d83d410adfdc5947245c753bddfbe06541c4aae330e9e70/kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03", size = 1343994 }, - { url = "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", size = 1434804 }, - { url = "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", size = 1450690 }, - { url = "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", size = 1376839 }, - { url = "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", size = 1435109 }, - { url = "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", size = 2245269 }, - { url = "https://files.pythonhosted.org/packages/76/15/e59e45829d7f41c776d138245cabae6515cb4eb44b418f6d4109c478b481/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc", size = 2393468 }, - { url = "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", size = 2355394 }, - { url = "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", size = 2490901 }, - { url = "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", size = 2312306 }, - { url = "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", size = 71966 }, - { url = "https://files.pythonhosted.org/packages/4a/c9/9642ea855604aeb2968a8e145fc662edf61db7632ad2e4fb92424be6b6c0/kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2", size = 65311 }, - { url = "https://files.pythonhosted.org/packages/fc/aa/cea685c4ab647f349c3bc92d2daf7ae34c8e8cf405a6dcd3a497f58a2ac3/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502", size = 124152 }, - { url = "https://files.pythonhosted.org/packages/c5/0b/8db6d2e2452d60d5ebc4ce4b204feeb16176a851fd42462f66ade6808084/kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31", size = 66555 }, - { url = "https://files.pythonhosted.org/packages/60/26/d6a0db6785dd35d3ba5bf2b2df0aedc5af089962c6eb2cbf67a15b81369e/kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb", size = 65067 }, - { url = "https://files.pythonhosted.org/packages/c9/ed/1d97f7e3561e09757a196231edccc1bcf59d55ddccefa2afc9c615abd8e0/kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f", size = 1378443 }, - { url = "https://files.pythonhosted.org/packages/29/61/39d30b99954e6b46f760e6289c12fede2ab96a254c443639052d1b573fbc/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc", size = 1472728 }, - { url = "https://files.pythonhosted.org/packages/0c/3e/804163b932f7603ef256e4a715e5843a9600802bb23a68b4e08c8c0ff61d/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a", size = 1478388 }, - { url = "https://files.pythonhosted.org/packages/8a/9e/60eaa75169a154700be74f875a4d9961b11ba048bef315fbe89cb6999056/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a", size = 1413849 }, - { url = "https://files.pythonhosted.org/packages/bc/b3/9458adb9472e61a998c8c4d95cfdfec91c73c53a375b30b1428310f923e4/kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a", size = 1475533 }, - { url = "https://files.pythonhosted.org/packages/e4/7a/0a42d9571e35798de80aef4bb43a9b672aa7f8e58643d7bd1950398ffb0a/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3", size = 2268898 }, - { url = "https://files.pythonhosted.org/packages/d9/07/1255dc8d80271400126ed8db35a1795b1a2c098ac3a72645075d06fe5c5d/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b", size = 2425605 }, - { url = "https://files.pythonhosted.org/packages/84/df/5a3b4cf13780ef6f6942df67b138b03b7e79e9f1f08f57c49957d5867f6e/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4", size = 2375801 }, - { url = "https://files.pythonhosted.org/packages/8f/10/2348d068e8b0f635c8c86892788dac7a6b5c0cb12356620ab575775aad89/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d", size = 2520077 }, - { url = "https://files.pythonhosted.org/packages/32/d8/014b89fee5d4dce157d814303b0fce4d31385a2af4c41fed194b173b81ac/kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8", size = 2338410 }, - { url = "https://files.pythonhosted.org/packages/bd/72/dfff0cc97f2a0776e1c9eb5bef1ddfd45f46246c6533b0191887a427bca5/kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50", size = 71853 }, - { url = "https://files.pythonhosted.org/packages/dc/85/220d13d914485c0948a00f0b9eb419efaf6da81b7d72e88ce2391f7aed8d/kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476", size = 65424 }, - { url = "https://files.pythonhosted.org/packages/79/b3/e62464a652f4f8cd9006e13d07abad844a47df1e6537f73ddfbf1bc997ec/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09", size = 124156 }, - { url = "https://files.pythonhosted.org/packages/8d/2d/f13d06998b546a2ad4f48607a146e045bbe48030774de29f90bdc573df15/kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1", size = 66555 }, - { url = "https://files.pythonhosted.org/packages/59/e3/b8bd14b0a54998a9fd1e8da591c60998dc003618cb19a3f94cb233ec1511/kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c", size = 65071 }, - { url = "https://files.pythonhosted.org/packages/f0/1c/6c86f6d85ffe4d0ce04228d976f00674f1df5dc893bf2dd4f1928748f187/kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b", size = 1378053 }, - { url = "https://files.pythonhosted.org/packages/4e/b9/1c6e9f6dcb103ac5cf87cb695845f5fa71379021500153566d8a8a9fc291/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47", size = 1472278 }, - { url = "https://files.pythonhosted.org/packages/ee/81/aca1eb176de671f8bda479b11acdc42c132b61a2ac861c883907dde6debb/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16", size = 1478139 }, - { url = "https://files.pythonhosted.org/packages/49/f4/e081522473671c97b2687d380e9e4c26f748a86363ce5af48b4a28e48d06/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc", size = 1413517 }, - { url = "https://files.pythonhosted.org/packages/8f/e9/6a7d025d8da8c4931522922cd706105aa32b3291d1add8c5427cdcd66e63/kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246", size = 1474952 }, - { url = "https://files.pythonhosted.org/packages/82/13/13fa685ae167bee5d94b415991c4fc7bb0a1b6ebea6e753a87044b209678/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794", size = 2269132 }, - { url = "https://files.pythonhosted.org/packages/ef/92/bb7c9395489b99a6cb41d502d3686bac692586db2045adc19e45ee64ed23/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b", size = 2425997 }, - { url = "https://files.pythonhosted.org/packages/ed/12/87f0e9271e2b63d35d0d8524954145837dd1a6c15b62a2d8c1ebe0f182b4/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3", size = 2376060 }, - { url = "https://files.pythonhosted.org/packages/02/6e/c8af39288edbce8bf0fa35dee427b082758a4b71e9c91ef18fa667782138/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957", size = 2520471 }, - { url = "https://files.pythonhosted.org/packages/13/78/df381bc7b26e535c91469f77f16adcd073beb3e2dd25042efd064af82323/kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb", size = 2338793 }, - { url = "https://files.pythonhosted.org/packages/d0/dc/c1abe38c37c071d0fc71c9a474fd0b9ede05d42f5a458d584619cfd2371a/kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2", size = 71855 }, - { url = "https://files.pythonhosted.org/packages/a0/b6/21529d595b126ac298fdd90b705d87d4c5693de60023e0efcb4f387ed99e/kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30", size = 65430 }, - { url = "https://files.pythonhosted.org/packages/34/bd/b89380b7298e3af9b39f49334e3e2a4af0e04819789f04b43d560516c0c8/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c", size = 126294 }, - { url = "https://files.pythonhosted.org/packages/83/41/5857dc72e5e4148eaac5aa76e0703e594e4465f8ab7ec0fc60e3a9bb8fea/kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc", size = 67736 }, - { url = "https://files.pythonhosted.org/packages/e1/d1/be059b8db56ac270489fb0b3297fd1e53d195ba76e9bbb30e5401fa6b759/kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712", size = 66194 }, - { url = "https://files.pythonhosted.org/packages/e1/83/4b73975f149819eb7dcf9299ed467eba068ecb16439a98990dcb12e63fdd/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e", size = 1465942 }, - { url = "https://files.pythonhosted.org/packages/c7/2c/30a5cdde5102958e602c07466bce058b9d7cb48734aa7a4327261ac8e002/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880", size = 1595341 }, - { url = "https://files.pythonhosted.org/packages/ff/9b/1e71db1c000385aa069704f5990574b8244cce854ecd83119c19e83c9586/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062", size = 1598455 }, - { url = "https://files.pythonhosted.org/packages/85/92/c8fec52ddf06231b31cbb779af77e99b8253cd96bd135250b9498144c78b/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7", size = 1522138 }, - { url = "https://files.pythonhosted.org/packages/0b/51/9eb7e2cd07a15d8bdd976f6190c0164f92ce1904e5c0c79198c4972926b7/kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed", size = 1582857 }, - { url = "https://files.pythonhosted.org/packages/0f/95/c5a00387a5405e68ba32cc64af65ce881a39b98d73cc394b24143bebc5b8/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d", size = 2293129 }, - { url = "https://files.pythonhosted.org/packages/44/83/eeb7af7d706b8347548313fa3a3a15931f404533cc54fe01f39e830dd231/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165", size = 2421538 }, - { url = "https://files.pythonhosted.org/packages/05/f9/27e94c1b3eb29e6933b6986ffc5fa1177d2cd1f0c8efc5f02c91c9ac61de/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6", size = 2390661 }, - { url = "https://files.pythonhosted.org/packages/d9/d4/3c9735faa36ac591a4afcc2980d2691000506050b7a7e80bcfe44048daa7/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90", size = 2546710 }, - { url = "https://files.pythonhosted.org/packages/4c/fa/be89a49c640930180657482a74970cdcf6f7072c8d2471e1babe17a222dc/kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85", size = 2349213 }, -] - -[[package]] -name = "lxml" -version = "5.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/6b/20c3a4b24751377aaa6307eb230b66701024012c29dd374999cc92983269/lxml-5.3.0.tar.gz", hash = "sha256:4e109ca30d1edec1ac60cdbe341905dc3b8f55b16855e03a54aaf59e51ec8c6f", size = 3679318 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/a8/449faa2a3cbe6a99f8d38dcd51a3ee8844c17862841a6f769ea7c2a9cd0f/lxml-5.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74bcb423462233bc5d6066e4e98b0264e7c1bed7541fff2f4e34fe6b21563c8b", size = 8141056 }, - { url = "https://files.pythonhosted.org/packages/ac/8a/ae6325e994e2052de92f894363b038351c50ee38749d30cc6b6d96aaf90f/lxml-5.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d819eb6f9b8677f57f9664265d0a10dd6551d227afb4af2b9cd7bdc2ccbf18", size = 4425238 }, - { url = "https://files.pythonhosted.org/packages/f8/fb/128dddb7f9086236bce0eeae2bfb316d138b49b159f50bc681d56c1bdd19/lxml-5.3.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b8f5db71b28b8c404956ddf79575ea77aa8b1538e8b2ef9ec877945b3f46442", size = 5095197 }, - { url = "https://files.pythonhosted.org/packages/b4/f9/a181a8ef106e41e3086629c8bdb2d21a942f14c84a0e77452c22d6b22091/lxml-5.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3406b63232fc7e9b8783ab0b765d7c59e7c59ff96759d8ef9632fca27c7ee4", size = 4809809 }, - { url = "https://files.pythonhosted.org/packages/25/2f/b20565e808f7f6868aacea48ddcdd7e9e9fb4c799287f21f1a6c7c2e8b71/lxml-5.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ecdd78ab768f844c7a1d4a03595038c166b609f6395e25af9b0f3f26ae1230f", size = 5407593 }, - { url = "https://files.pythonhosted.org/packages/23/0e/caac672ec246d3189a16c4d364ed4f7d6bf856c080215382c06764058c08/lxml-5.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168f2dfcfdedf611eb285efac1516c8454c8c99caf271dccda8943576b67552e", size = 4866657 }, - { url = "https://files.pythonhosted.org/packages/67/a4/1f5fbd3f58d4069000522196b0b776a014f3feec1796da03e495cf23532d/lxml-5.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa617107a410245b8660028a7483b68e7914304a6d4882b5ff3d2d3eb5948d8c", size = 4967017 }, - { url = "https://files.pythonhosted.org/packages/ee/73/623ecea6ca3c530dd0a4ed0d00d9702e0e85cd5624e2d5b93b005fe00abd/lxml-5.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:69959bd3167b993e6e710b99051265654133a98f20cec1d9b493b931942e9c16", size = 4810730 }, - { url = "https://files.pythonhosted.org/packages/1d/ce/fb84fb8e3c298f3a245ae3ea6221c2426f1bbaa82d10a88787412a498145/lxml-5.3.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:bd96517ef76c8654446fc3db9242d019a1bb5fe8b751ba414765d59f99210b79", size = 5455154 }, - { url = "https://files.pythonhosted.org/packages/b1/72/4d1ad363748a72c7c0411c28be2b0dc7150d91e823eadad3b91a4514cbea/lxml-5.3.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ab6dd83b970dc97c2d10bc71aa925b84788c7c05de30241b9e96f9b6d9ea3080", size = 4969416 }, - { url = "https://files.pythonhosted.org/packages/42/07/b29571a58a3a80681722ea8ed0ba569211d9bb8531ad49b5cacf6d409185/lxml-5.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:eec1bb8cdbba2925bedc887bc0609a80e599c75b12d87ae42ac23fd199445654", size = 5013672 }, - { url = "https://files.pythonhosted.org/packages/b9/93/bde740d5a58cf04cbd38e3dd93ad1e36c2f95553bbf7d57807bc6815d926/lxml-5.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a7095eeec6f89111d03dabfe5883a1fd54da319c94e0fb104ee8f23616b572d", size = 4878644 }, - { url = "https://files.pythonhosted.org/packages/56/b5/645c8c02721d49927c93181de4017164ec0e141413577687c3df8ff0800f/lxml-5.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f651ebd0b21ec65dfca93aa629610a0dbc13dbc13554f19b0113da2e61a4763", size = 5511531 }, - { url = "https://files.pythonhosted.org/packages/85/3f/6a99a12d9438316f4fc86ef88c5d4c8fb674247b17f3173ecadd8346b671/lxml-5.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:f422a209d2455c56849442ae42f25dbaaba1c6c3f501d58761c619c7836642ec", size = 5402065 }, - { url = "https://files.pythonhosted.org/packages/80/8a/df47bff6ad5ac57335bf552babfb2408f9eb680c074ec1ba412a1a6af2c5/lxml-5.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:62f7fdb0d1ed2065451f086519865b4c90aa19aed51081979ecd05a21eb4d1be", size = 5069775 }, - { url = "https://files.pythonhosted.org/packages/08/ae/e7ad0f0fbe4b6368c5ee1e3ef0c3365098d806d42379c46c1ba2802a52f7/lxml-5.3.0-cp311-cp311-win32.whl", hash = "sha256:c6379f35350b655fd817cd0d6cbeef7f265f3ae5fedb1caae2eb442bbeae9ab9", size = 3474226 }, - { url = "https://files.pythonhosted.org/packages/c3/b5/91c2249bfac02ee514ab135e9304b89d55967be7e53e94a879b74eec7a5c/lxml-5.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c52100e2c2dbb0649b90467935c4b0de5528833c76a35ea1a2691ec9f1ee7a1", size = 3814971 }, - { url = "https://files.pythonhosted.org/packages/eb/6d/d1f1c5e40c64bf62afd7a3f9b34ce18a586a1cccbf71e783cd0a6d8e8971/lxml-5.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e99f5507401436fdcc85036a2e7dc2e28d962550afe1cbfc07c40e454256a859", size = 8171753 }, - { url = "https://files.pythonhosted.org/packages/bd/83/26b1864921869784355459f374896dcf8b44d4af3b15d7697e9156cb2de9/lxml-5.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:384aacddf2e5813a36495233b64cb96b1949da72bef933918ba5c84e06af8f0e", size = 4441955 }, - { url = "https://files.pythonhosted.org/packages/e0/d2/e9bff9fb359226c25cda3538f664f54f2804f4b37b0d7c944639e1a51f69/lxml-5.3.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:874a216bf6afaf97c263b56371434e47e2c652d215788396f60477540298218f", size = 5050778 }, - { url = "https://files.pythonhosted.org/packages/88/69/6972bfafa8cd3ddc8562b126dd607011e218e17be313a8b1b9cc5a0ee876/lxml-5.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:65ab5685d56914b9a2a34d67dd5488b83213d680b0c5d10b47f81da5a16b0b0e", size = 4748628 }, - { url = "https://files.pythonhosted.org/packages/5d/ea/a6523c7c7f6dc755a6eed3d2f6d6646617cad4d3d6d8ce4ed71bfd2362c8/lxml-5.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aac0bbd3e8dd2d9c45ceb82249e8bdd3ac99131a32b4d35c8af3cc9db1657179", size = 5322215 }, - { url = "https://files.pythonhosted.org/packages/99/37/396fbd24a70f62b31d988e4500f2068c7f3fd399d2fd45257d13eab51a6f/lxml-5.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b369d3db3c22ed14c75ccd5af429086f166a19627e84a8fdade3f8f31426e52a", size = 4813963 }, - { url = "https://files.pythonhosted.org/packages/09/91/e6136f17459a11ce1757df864b213efbeab7adcb2efa63efb1b846ab6723/lxml-5.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24037349665434f375645fa9d1f5304800cec574d0310f618490c871fd902b3", size = 4923353 }, - { url = "https://files.pythonhosted.org/packages/1d/7c/2eeecf87c9a1fca4f84f991067c693e67340f2b7127fc3eca8fa29d75ee3/lxml-5.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:62d172f358f33a26d6b41b28c170c63886742f5b6772a42b59b4f0fa10526cb1", size = 4740541 }, - { url = "https://files.pythonhosted.org/packages/3b/ed/4c38ba58defca84f5f0d0ac2480fdcd99fc7ae4b28fc417c93640a6949ae/lxml-5.3.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:c1f794c02903c2824fccce5b20c339a1a14b114e83b306ff11b597c5f71a1c8d", size = 5346504 }, - { url = "https://files.pythonhosted.org/packages/a5/22/bbd3995437e5745cb4c2b5d89088d70ab19d4feabf8a27a24cecb9745464/lxml-5.3.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:5d6a6972b93c426ace71e0be9a6f4b2cfae9b1baed2eed2006076a746692288c", size = 4898077 }, - { url = "https://files.pythonhosted.org/packages/0a/6e/94537acfb5b8f18235d13186d247bca478fea5e87d224644e0fe907df976/lxml-5.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:3879cc6ce938ff4eb4900d901ed63555c778731a96365e53fadb36437a131a99", size = 4946543 }, - { url = "https://files.pythonhosted.org/packages/8d/e8/4b15df533fe8e8d53363b23a41df9be907330e1fa28c7ca36893fad338ee/lxml-5.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:74068c601baff6ff021c70f0935b0c7bc528baa8ea210c202e03757c68c5a4ff", size = 4816841 }, - { url = "https://files.pythonhosted.org/packages/1a/e7/03f390ea37d1acda50bc538feb5b2bda6745b25731e4e76ab48fae7106bf/lxml-5.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ecd4ad8453ac17bc7ba3868371bffb46f628161ad0eefbd0a855d2c8c32dd81a", size = 5417341 }, - { url = "https://files.pythonhosted.org/packages/ea/99/d1133ab4c250da85a883c3b60249d3d3e7c64f24faff494cf0fd23f91e80/lxml-5.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7e2f58095acc211eb9d8b5771bf04df9ff37d6b87618d1cbf85f92399c98dae8", size = 5327539 }, - { url = "https://files.pythonhosted.org/packages/7d/ed/e6276c8d9668028213df01f598f385b05b55a4e1b4662ee12ef05dab35aa/lxml-5.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e63601ad5cd8f860aa99d109889b5ac34de571c7ee902d6812d5d9ddcc77fa7d", size = 5012542 }, - { url = "https://files.pythonhosted.org/packages/36/88/684d4e800f5aa28df2a991a6a622783fb73cf0e46235cfa690f9776f032e/lxml-5.3.0-cp312-cp312-win32.whl", hash = "sha256:17e8d968d04a37c50ad9c456a286b525d78c4a1c15dd53aa46c1d8e06bf6fa30", size = 3486454 }, - { url = "https://files.pythonhosted.org/packages/fc/82/ace5a5676051e60355bd8fb945df7b1ba4f4fb8447f2010fb816bfd57724/lxml-5.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:c1a69e58a6bb2de65902051d57fde951febad631a20a64572677a1052690482f", size = 3816857 }, - { url = "https://files.pythonhosted.org/packages/94/6a/42141e4d373903bfea6f8e94b2f554d05506dfda522ada5343c651410dc8/lxml-5.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c72e9563347c7395910de6a3100a4840a75a6f60e05af5e58566868d5eb2d6a", size = 8156284 }, - { url = "https://files.pythonhosted.org/packages/91/5e/fa097f0f7d8b3d113fb7312c6308af702f2667f22644441715be961f2c7e/lxml-5.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e92ce66cd919d18d14b3856906a61d3f6b6a8500e0794142338da644260595cd", size = 4432407 }, - { url = "https://files.pythonhosted.org/packages/2d/a1/b901988aa6d4ff937f2e5cfc114e4ec561901ff00660c3e56713642728da/lxml-5.3.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d04f064bebdfef9240478f7a779e8c5dc32b8b7b0b2fc6a62e39b928d428e51", size = 5048331 }, - { url = "https://files.pythonhosted.org/packages/30/0f/b2a54f48e52de578b71bbe2a2f8160672a8a5e103df3a78da53907e8c7ed/lxml-5.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c2fb570d7823c2bbaf8b419ba6e5662137f8166e364a8b2b91051a1fb40ab8b", size = 4744835 }, - { url = "https://files.pythonhosted.org/packages/82/9d/b000c15538b60934589e83826ecbc437a1586488d7c13f8ee5ff1f79a9b8/lxml-5.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c120f43553ec759f8de1fee2f4794452b0946773299d44c36bfe18e83caf002", size = 5316649 }, - { url = "https://files.pythonhosted.org/packages/e3/ee/ffbb9eaff5e541922611d2c56b175c45893d1c0b8b11e5a497708a6a3b3b/lxml-5.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:562e7494778a69086f0312ec9689f6b6ac1c6b65670ed7d0267e49f57ffa08c4", size = 4812046 }, - { url = "https://files.pythonhosted.org/packages/15/ff/7ff89d567485c7b943cdac316087f16b2399a8b997007ed352a1248397e5/lxml-5.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:423b121f7e6fa514ba0c7918e56955a1d4470ed35faa03e3d9f0e3baa4c7e492", size = 4918597 }, - { url = "https://files.pythonhosted.org/packages/c6/a3/535b6ed8c048412ff51268bdf4bf1cf052a37aa7e31d2e6518038a883b29/lxml-5.3.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:c00f323cc00576df6165cc9d21a4c21285fa6b9989c5c39830c3903dc4303ef3", size = 4738071 }, - { url = "https://files.pythonhosted.org/packages/7a/8f/cbbfa59cb4d4fd677fe183725a76d8c956495d7a3c7f111ab8f5e13d2e83/lxml-5.3.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:1fdc9fae8dd4c763e8a31e7630afef517eab9f5d5d31a278df087f307bf601f4", size = 5342213 }, - { url = "https://files.pythonhosted.org/packages/5c/fb/db4c10dd9958d4b52e34d1d1f7c1f434422aeaf6ae2bbaaff2264351d944/lxml-5.3.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:658f2aa69d31e09699705949b5fc4719cbecbd4a97f9656a232e7d6c7be1a367", size = 4893749 }, - { url = "https://files.pythonhosted.org/packages/f2/38/bb4581c143957c47740de18a3281a0cab7722390a77cc6e610e8ebf2d736/lxml-5.3.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1473427aff3d66a3fa2199004c3e601e6c4500ab86696edffdbc84954c72d832", size = 4945901 }, - { url = "https://files.pythonhosted.org/packages/fc/d5/18b7de4960c731e98037bd48fa9f8e6e8f2558e6fbca4303d9b14d21ef3b/lxml-5.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a87de7dd873bf9a792bf1e58b1c3887b9264036629a5bf2d2e6579fe8e73edff", size = 4815447 }, - { url = "https://files.pythonhosted.org/packages/97/a8/cd51ceaad6eb849246559a8ef60ae55065a3df550fc5fcd27014361c1bab/lxml-5.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0d7b36afa46c97875303a94e8f3ad932bf78bace9e18e603f2085b652422edcd", size = 5411186 }, - { url = "https://files.pythonhosted.org/packages/89/c3/1e3dabab519481ed7b1fdcba21dcfb8832f57000733ef0e71cf6d09a5e03/lxml-5.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cf120cce539453ae086eacc0130a324e7026113510efa83ab42ef3fcfccac7fb", size = 5324481 }, - { url = "https://files.pythonhosted.org/packages/b6/17/71e9984cf0570cd202ac0a1c9ed5c1b8889b0fc8dc736f5ef0ffb181c284/lxml-5.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:df5c7333167b9674aa8ae1d4008fa4bc17a313cc490b2cca27838bbdcc6bb15b", size = 5011053 }, - { url = "https://files.pythonhosted.org/packages/69/68/9f7e6d3312a91e30829368c2b3217e750adef12a6f8eb10498249f4e8d72/lxml-5.3.0-cp313-cp313-win32.whl", hash = "sha256:c802e1c2ed9f0c06a65bc4ed0189d000ada8049312cfeab6ca635e39c9608957", size = 3485634 }, - { url = "https://files.pythonhosted.org/packages/7d/db/214290d58ad68c587bd5d6af3d34e56830438733d0d0856c0275fde43652/lxml-5.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:406246b96d552e0503e17a1006fd27edac678b3fcc9f1be71a2f94b4ff61528d", size = 3814417 }, -] - -[[package]] -name = "markdown-it-py" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mdurl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, -] - -[[package]] -name = "markupsafe" -version = "3.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, -] - -[[package]] -name = "matplotlib" -version = "3.8.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "contourpy" }, - { name = "cycler" }, - { name = "fonttools" }, - { name = "kiwisolver" }, - { name = "numpy" }, - { name = "packaging" }, - { name = "pillow" }, - { name = "pyparsing" }, - { name = "python-dateutil" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/4f/8487737a74d8be4ab5fbe6019b0fae305c1604cf7209500969b879b5f462/matplotlib-3.8.4.tar.gz", hash = "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea", size = 35934425 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/11/62250ea25780d4b59c2c6044ec161235c47cc05a18d0ec0a05657de75b7d/matplotlib-3.8.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661", size = 7606117 }, - { url = "https://files.pythonhosted.org/packages/14/60/12d4f27b859a74359306662da69c2d08826a2b05cfe7f96e66b490f41573/matplotlib-3.8.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c", size = 7500108 }, - { url = "https://files.pythonhosted.org/packages/4e/ba/9e4f7f34dccf2d2768504410410db8d551c940457a2bec658dc4fa3b5aa2/matplotlib-3.8.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa", size = 11382998 }, - { url = "https://files.pythonhosted.org/packages/80/3b/e363612ac1a514abfb5505aa209dd5b724b3232a6de98710d7759559706a/matplotlib-3.8.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71", size = 11613309 }, - { url = "https://files.pythonhosted.org/packages/32/4c/63164901acadb3ada55c5e0fd6b7f29c9033d7e131302884cd735611b77a/matplotlib-3.8.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b", size = 9546019 }, - { url = "https://files.pythonhosted.org/packages/2d/d5/6227732ecab9165586966ccb54301e3164f61b470c954c4cf6940654fbe1/matplotlib-3.8.4-cp311-cp311-win_amd64.whl", hash = "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae", size = 7658174 }, - { url = "https://files.pythonhosted.org/packages/91/eb/65f3bd78ce757dadd455c220273349428384b162485cd8aa380b61a867ed/matplotlib-3.8.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616", size = 7604083 }, - { url = "https://files.pythonhosted.org/packages/da/2b/2bb6073ca8d336da07ace7d98bf7bb9da8233f55876bb3db6a5ee924f3e9/matplotlib-3.8.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732", size = 7496013 }, - { url = "https://files.pythonhosted.org/packages/61/cd/976d3a9c10328da1d2fe183f7c92c45f1e125536226a6eb3a820c4753cd1/matplotlib-3.8.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb", size = 11376749 }, - { url = "https://files.pythonhosted.org/packages/cd/ba/412149958e951876096198609b958b90a8a2c9bc07a96eeeaa9e2c480f30/matplotlib-3.8.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30", size = 11600837 }, - { url = "https://files.pythonhosted.org/packages/dc/4f/e5b56ca109d8ab6bae37f519f15b891fc18809ddb8bc1aa26e0bfca83e25/matplotlib-3.8.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25", size = 9538883 }, - { url = "https://files.pythonhosted.org/packages/7d/ca/e7bd1876a341ed8c456095962a582696cac1691cb6e55bd5ead15a755c5d/matplotlib-3.8.4-cp312-cp312-win_amd64.whl", hash = "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a", size = 7659712 }, -] - -[[package]] -name = "matplotlib-inline" -version = "0.1.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, -] - -[[package]] -name = "mdit-py-plugins" -version = "0.4.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markdown-it-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 }, -] - -[[package]] -name = "mdurl" -version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, -] - -[[package]] -name = "mistune" -version = "3.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/6e/96fc7cb3288666c5de2c396eb0e338dc95f7a8e4920e43e38783a22d0084/mistune-3.1.0.tar.gz", hash = "sha256:dbcac2f78292b9dc066cd03b7a3a26b62d85f8159f2ea5fd28e55df79908d667", size = 94401 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/b3/743ffc3f59da380da504d84ccd1faf9a857a1445991ff19bf2ec754163c2/mistune-3.1.0-py3-none-any.whl", hash = "sha256:b05198cf6d671b3deba6c87ec6cf0d4eb7b72c524636eddb6dbf13823b52cee1", size = 53694 }, -] - -[[package]] -name = "mypy" -version = "1.14.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mypy-extensions" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b9/eb/2c92d8ea1e684440f54fa49ac5d9a5f19967b7b472a281f419e69a8d228e/mypy-1.14.1.tar.gz", hash = "sha256:7ec88144fe9b510e8475ec2f5f251992690fcf89ccb4500b214b4226abcd32d6", size = 3216051 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/da/11/a9422850fd506edbcdc7f6090682ecceaf1f87b9dd847f9df79942da8506/mypy-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f995e511de847791c3b11ed90084a7a0aafdc074ab88c5a9711622fe4751138c", size = 11120432 }, - { url = "https://files.pythonhosted.org/packages/b6/9e/47e450fd39078d9c02d620545b2cb37993a8a8bdf7db3652ace2f80521ca/mypy-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d64169ec3b8461311f8ce2fd2eb5d33e2d0f2c7b49116259c51d0d96edee48d1", size = 10279515 }, - { url = "https://files.pythonhosted.org/packages/01/b5/6c8d33bd0f851a7692a8bfe4ee75eb82b6983a3cf39e5e32a5d2a723f0c1/mypy-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ba24549de7b89b6381b91fbc068d798192b1b5201987070319889e93038967a8", size = 12025791 }, - { url = "https://files.pythonhosted.org/packages/f0/4c/e10e2c46ea37cab5c471d0ddaaa9a434dc1d28650078ac1b56c2d7b9b2e4/mypy-1.14.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:183cf0a45457d28ff9d758730cd0210419ac27d4d3f285beda038c9083363b1f", size = 12749203 }, - { url = "https://files.pythonhosted.org/packages/88/55/beacb0c69beab2153a0f57671ec07861d27d735a0faff135a494cd4f5020/mypy-1.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f2a0ecc86378f45347f586e4163d1769dd81c5a223d577fe351f26b179e148b1", size = 12885900 }, - { url = "https://files.pythonhosted.org/packages/a2/75/8c93ff7f315c4d086a2dfcde02f713004357d70a163eddb6c56a6a5eff40/mypy-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ad3301ebebec9e8ee7135d8e3109ca76c23752bac1e717bc84cd3836b4bf3eae", size = 9777869 }, - { url = "https://files.pythonhosted.org/packages/43/1b/b38c079609bb4627905b74fc6a49849835acf68547ac33d8ceb707de5f52/mypy-1.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:30ff5ef8519bbc2e18b3b54521ec319513a26f1bba19a7582e7b1f58a6e69f14", size = 11266668 }, - { url = "https://files.pythonhosted.org/packages/6b/75/2ed0d2964c1ffc9971c729f7a544e9cd34b2cdabbe2d11afd148d7838aa2/mypy-1.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb9f255c18052343c70234907e2e532bc7e55a62565d64536dbc7706a20b78b9", size = 10254060 }, - { url = "https://files.pythonhosted.org/packages/a1/5f/7b8051552d4da3c51bbe8fcafffd76a6823779101a2b198d80886cd8f08e/mypy-1.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b4e3413e0bddea671012b063e27591b953d653209e7a4fa5e48759cda77ca11", size = 11933167 }, - { url = "https://files.pythonhosted.org/packages/04/90/f53971d3ac39d8b68bbaab9a4c6c58c8caa4d5fd3d587d16f5927eeeabe1/mypy-1.14.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:553c293b1fbdebb6c3c4030589dab9fafb6dfa768995a453d8a5d3b23784af2e", size = 12864341 }, - { url = "https://files.pythonhosted.org/packages/03/d2/8bc0aeaaf2e88c977db41583559319f1821c069e943ada2701e86d0430b7/mypy-1.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fad79bfe3b65fe6a1efaed97b445c3d37f7be9fdc348bdb2d7cac75579607c89", size = 12972991 }, - { url = "https://files.pythonhosted.org/packages/6f/17/07815114b903b49b0f2cf7499f1c130e5aa459411596668267535fe9243c/mypy-1.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:8fa2220e54d2946e94ab6dbb3ba0a992795bd68b16dc852db33028df2b00191b", size = 9879016 }, - { url = "https://files.pythonhosted.org/packages/9e/15/bb6a686901f59222275ab228453de741185f9d54fecbaacec041679496c6/mypy-1.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:92c3ed5afb06c3a8e188cb5da4984cab9ec9a77ba956ee419c68a388b4595255", size = 11252097 }, - { url = "https://files.pythonhosted.org/packages/f8/b3/8b0f74dfd072c802b7fa368829defdf3ee1566ba74c32a2cb2403f68024c/mypy-1.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dbec574648b3e25f43d23577309b16534431db4ddc09fda50841f1e34e64ed34", size = 10239728 }, - { url = "https://files.pythonhosted.org/packages/c5/9b/4fd95ab20c52bb5b8c03cc49169be5905d931de17edfe4d9d2986800b52e/mypy-1.14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c6d94b16d62eb3e947281aa7347d78236688e21081f11de976376cf010eb31a", size = 11924965 }, - { url = "https://files.pythonhosted.org/packages/56/9d/4a236b9c57f5d8f08ed346914b3f091a62dd7e19336b2b2a0d85485f82ff/mypy-1.14.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d4b19b03fdf54f3c5b2fa474c56b4c13c9dbfb9a2db4370ede7ec11a2c5927d9", size = 12867660 }, - { url = "https://files.pythonhosted.org/packages/40/88/a61a5497e2f68d9027de2bb139c7bb9abaeb1be1584649fa9d807f80a338/mypy-1.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0c911fde686394753fff899c409fd4e16e9b294c24bfd5e1ea4675deae1ac6fd", size = 12969198 }, - { url = "https://files.pythonhosted.org/packages/54/da/3d6fc5d92d324701b0c23fb413c853892bfe0e1dbe06c9138037d459756b/mypy-1.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8b21525cb51671219f5307be85f7e646a153e5acc656e5cebf64bfa076c50107", size = 9885276 }, - { url = "https://files.pythonhosted.org/packages/a0/b5/32dd67b69a16d088e533962e5044e51004176a9952419de0370cdaead0f8/mypy-1.14.1-py3-none-any.whl", hash = "sha256:b66a60cc4073aeb8ae00057f9c1f64d49e90f918fbcef9a977eb121da8b8f1d1", size = 2752905 }, -] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, -] - -[[package]] -name = "myst-parser" -version = "4.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "docutils" }, - { name = "jinja2" }, - { name = "markdown-it-py" }, - { name = "mdit-py-plugins" }, - { name = "pyyaml" }, - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/85/55/6d1741a1780e5e65038b74bce6689da15f620261c490c3511eb4c12bac4b/myst_parser-4.0.0.tar.gz", hash = "sha256:851c9dfb44e36e56d15d05e72f02b80da21a9e0d07cba96baf5e2d476bb91531", size = 93858 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/b4/b036f8fdb667587bb37df29dc6644681dd78b7a2a6321a34684b79412b28/myst_parser-4.0.0-py3-none-any.whl", hash = "sha256:b9317997552424448c6096c2558872fdb6f81d3ecb3a40ce84a7518798f3f28d", size = 84563 }, -] - -[[package]] -name = "nbclient" -version = "0.10.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-client" }, - { name = "jupyter-core" }, - { name = "nbformat" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 }, -] - -[[package]] -name = "nbconvert" -version = "7.16.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "beautifulsoup4" }, - { name = "bleach", extra = ["css"] }, - { name = "defusedxml" }, - { name = "jinja2" }, - { name = "jupyter-core" }, - { name = "jupyterlab-pygments" }, - { name = "markupsafe" }, - { name = "mistune" }, - { name = "nbclient" }, - { name = "nbformat" }, - { name = "packaging" }, - { name = "pandocfilters" }, - { name = "pygments" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/46/2c/d026c0367f2be2463d4c2f5b538e28add2bc67bc13730abb7f364ae4eb8b/nbconvert-7.16.5.tar.gz", hash = "sha256:c83467bb5777fdfaac5ebbb8e864f300b277f68692ecc04d6dab72f2d8442344", size = 856367 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/9e/2dcc9fe00cf55d95a8deae69384e9cea61816126e345754f6c75494d32ec/nbconvert-7.16.5-py3-none-any.whl", hash = "sha256:e12eac052d6fd03040af4166c563d76e7aeead2e9aadf5356db552a1784bd547", size = 258061 }, -] - -[[package]] -name = "nbformat" -version = "5.10.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "fastjsonschema" }, - { name = "jsonschema" }, - { name = "jupyter-core" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 }, -] - -[[package]] -name = "nest-asyncio" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, -] - -[[package]] -name = "nodeenv" -version = "1.9.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, -] - -[[package]] -name = "notebook" -version = "7.3.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-server" }, - { name = "jupyterlab" }, - { name = "jupyterlab-server" }, - { name = "notebook-shim" }, - { name = "tornado" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ea/04/ac488379d5afef43402b3fb4be2857db1a09804fecf98b9b714c741b225b/notebook-7.3.2.tar.gz", hash = "sha256:705e83a1785f45b383bf3ee13cb76680b92d24f56fb0c7d2136fe1d850cd3ca8", size = 12781804 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/9b/76e50ee18f183ea5fe1784a9eeaa50f2c71802e4740d6e959592b0993298/notebook-7.3.2-py3-none-any.whl", hash = "sha256:e5f85fc59b69d3618d73cf27544418193ff8e8058d5bf61d315ce4f473556288", size = 13163630 }, -] - -[[package]] -name = "notebook-shim" -version = "0.2.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jupyter-server" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb", size = 13167 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef", size = 13307 }, -] - -[[package]] -name = "numpy" -version = "1.26.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", size = 15786129 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/57/baae43d14fe163fa0e4c47f307b6b2511ab8d7d30177c491960504252053/numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", size = 20630554 }, - { url = "https://files.pythonhosted.org/packages/1a/2e/151484f49fd03944c4a3ad9c418ed193cfd02724e138ac8a9505d056c582/numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", size = 13997127 }, - { url = "https://files.pythonhosted.org/packages/79/ae/7e5b85136806f9dadf4878bf73cf223fe5c2636818ba3ab1c585d0403164/numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", size = 14222994 }, - { url = "https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", size = 18252005 }, - { url = "https://files.pythonhosted.org/packages/09/bf/2b1aaf8f525f2923ff6cfcf134ae5e750e279ac65ebf386c75a0cf6da06a/numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", size = 13885297 }, - { url = "https://files.pythonhosted.org/packages/df/a0/4e0f14d847cfc2a633a1c8621d00724f3206cfeddeb66d35698c4e2cf3d2/numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", size = 18093567 }, - { url = "https://files.pythonhosted.org/packages/d2/b7/a734c733286e10a7f1a8ad1ae8c90f2d33bf604a96548e0a4a3a6739b468/numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", size = 5968812 }, - { url = "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", size = 15811913 }, - { url = "https://files.pythonhosted.org/packages/95/12/8f2020a8e8b8383ac0177dc9570aad031a3beb12e38847f7129bacd96228/numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", size = 20335901 }, - { url = "https://files.pythonhosted.org/packages/75/5b/ca6c8bd14007e5ca171c7c03102d17b4f4e0ceb53957e8c44343a9546dcc/numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", size = 13685868 }, - { url = "https://files.pythonhosted.org/packages/79/f8/97f10e6755e2a7d027ca783f63044d5b1bc1ae7acb12afe6a9b4286eac17/numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", size = 13925109 }, - { url = "https://files.pythonhosted.org/packages/0f/50/de23fde84e45f5c4fda2488c759b69990fd4512387a8632860f3ac9cd225/numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", size = 17950613 }, - { url = "https://files.pythonhosted.org/packages/4c/0c/9c603826b6465e82591e05ca230dfc13376da512b25ccd0894709b054ed0/numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", size = 13572172 }, - { url = "https://files.pythonhosted.org/packages/76/8c/2ba3902e1a0fc1c74962ea9bb33a534bb05984ad7ff9515bf8d07527cadd/numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", size = 17786643 }, - { url = "https://files.pythonhosted.org/packages/28/4a/46d9e65106879492374999e76eb85f87b15328e06bd1550668f79f7b18c6/numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", size = 5677803 }, - { url = "https://files.pythonhosted.org/packages/16/2e/86f24451c2d530c88daf997cb8d6ac622c1d40d19f5a031ed68a4b73a374/numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", size = 15517754 }, -] - -[[package]] -name = "overrides" -version = "7.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/86/b585f53236dec60aba864e050778b25045f857e17f6e5ea0ae95fe80edd2/overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a", size = 22812 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832 }, -] - -[[package]] -name = "packaging" -version = "23.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fb/2b/9b9c33ffed44ee921d0967086d653047286054117d584f1b1a7c22ceaf7b/packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", size = 146714 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/1a/610693ac4ee14fcdf2d9bf3c493370e4f2ef7ae2e19217d7a237ff42367d/packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7", size = 53011 }, -] - -[[package]] -name = "pandas-stubs" -version = "2.2.3.241126" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "types-pytz" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/90/86/93c545d149c3e1fe1c4c55478cc3a69859d0ea3467e1d9892e9eb28cb1e7/pandas_stubs-2.2.3.241126.tar.gz", hash = "sha256:cf819383c6d9ae7d4dabf34cd47e1e45525bb2f312e6ad2939c2c204cb708acd", size = 104204 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/ab/ed42acf15bab2e86e5c49fad4aa038315233c4c2d22f41b49faa4d837516/pandas_stubs-2.2.3.241126-py3-none-any.whl", hash = "sha256:74aa79c167af374fe97068acc90776c0ebec5266a6e5c69fe11e9c2cf51f2267", size = 158280 }, -] - -[[package]] -name = "pandocfilters" -version = "1.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663 }, -] - -[[package]] -name = "parso" -version = "0.8.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, -] - -[[package]] -name = "pexpect" -version = "4.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ptyprocess" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, -] - -[[package]] -name = "pillow" -version = "11.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/af/c097e544e7bd278333db77933e535098c259609c4eb3b85381109602fb5b/pillow-11.1.0.tar.gz", hash = "sha256:368da70808b36d73b4b390a8ffac11069f8a5c85f29eff1f1b01bcf3ef5b2a20", size = 46742715 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/d6/2000bfd8d5414fb70cbbe52c8332f2283ff30ed66a9cde42716c8ecbe22c/pillow-11.1.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e06695e0326d05b06833b40b7ef477e475d0b1ba3a6d27da1bb48c23209bf457", size = 3229968 }, - { url = "https://files.pythonhosted.org/packages/d9/45/3fe487010dd9ce0a06adf9b8ff4f273cc0a44536e234b0fad3532a42c15b/pillow-11.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96f82000e12f23e4f29346e42702b6ed9a2f2fea34a740dd5ffffcc8c539eb35", size = 3101806 }, - { url = "https://files.pythonhosted.org/packages/e3/72/776b3629c47d9d5f1c160113158a7a7ad177688d3a1159cd3b62ded5a33a/pillow-11.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3cd561ded2cf2bbae44d4605837221b987c216cff94f49dfeed63488bb228d2", size = 4322283 }, - { url = "https://files.pythonhosted.org/packages/e4/c2/e25199e7e4e71d64eeb869f5b72c7ddec70e0a87926398785ab944d92375/pillow-11.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f189805c8be5ca5add39e6f899e6ce2ed824e65fb45f3c28cb2841911da19070", size = 4402945 }, - { url = "https://files.pythonhosted.org/packages/c1/ed/51d6136c9d5911f78632b1b86c45241c712c5a80ed7fa7f9120a5dff1eba/pillow-11.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dd0052e9db3474df30433f83a71b9b23bd9e4ef1de13d92df21a52c0303b8ab6", size = 4361228 }, - { url = "https://files.pythonhosted.org/packages/48/a4/fbfe9d5581d7b111b28f1d8c2762dee92e9821bb209af9fa83c940e507a0/pillow-11.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:837060a8599b8f5d402e97197d4924f05a2e0d68756998345c829c33186217b1", size = 4484021 }, - { url = "https://files.pythonhosted.org/packages/39/db/0b3c1a5018117f3c1d4df671fb8e47d08937f27519e8614bbe86153b65a5/pillow-11.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:aa8dd43daa836b9a8128dbe7d923423e5ad86f50a7a14dc688194b7be5c0dea2", size = 4287449 }, - { url = "https://files.pythonhosted.org/packages/d9/58/bc128da7fea8c89fc85e09f773c4901e95b5936000e6f303222490c052f3/pillow-11.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f91f8a8b367e7a57c6e91cd25af510168091fb89ec5146003e424e1558a96", size = 4419972 }, - { url = "https://files.pythonhosted.org/packages/5f/bb/58f34379bde9fe197f51841c5bbe8830c28bbb6d3801f16a83b8f2ad37df/pillow-11.1.0-cp311-cp311-win32.whl", hash = "sha256:c12fc111ef090845de2bb15009372175d76ac99969bdf31e2ce9b42e4b8cd88f", size = 2291201 }, - { url = "https://files.pythonhosted.org/packages/3a/c6/fce9255272bcf0c39e15abd2f8fd8429a954cf344469eaceb9d0d1366913/pillow-11.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbd43429d0d7ed6533b25fc993861b8fd512c42d04514a0dd6337fb3ccf22761", size = 2625686 }, - { url = "https://files.pythonhosted.org/packages/c8/52/8ba066d569d932365509054859f74f2a9abee273edcef5cd75e4bc3e831e/pillow-11.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f7955ecf5609dee9442cbface754f2c6e541d9e6eda87fad7f7a989b0bdb9d71", size = 2375194 }, - { url = "https://files.pythonhosted.org/packages/95/20/9ce6ed62c91c073fcaa23d216e68289e19d95fb8188b9fb7a63d36771db8/pillow-11.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2062ffb1d36544d42fcaa277b069c88b01bb7298f4efa06731a7fd6cc290b81a", size = 3226818 }, - { url = "https://files.pythonhosted.org/packages/b9/d8/f6004d98579a2596c098d1e30d10b248798cceff82d2b77aa914875bfea1/pillow-11.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a85b653980faad27e88b141348707ceeef8a1186f75ecc600c395dcac19f385b", size = 3101662 }, - { url = "https://files.pythonhosted.org/packages/08/d9/892e705f90051c7a2574d9f24579c9e100c828700d78a63239676f960b74/pillow-11.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9409c080586d1f683df3f184f20e36fb647f2e0bc3988094d4fd8c9f4eb1b3b3", size = 4329317 }, - { url = "https://files.pythonhosted.org/packages/8c/aa/7f29711f26680eab0bcd3ecdd6d23ed6bce180d82e3f6380fb7ae35fcf3b/pillow-11.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fdadc077553621911f27ce206ffcbec7d3f8d7b50e0da39f10997e8e2bb7f6a", size = 4412999 }, - { url = "https://files.pythonhosted.org/packages/c8/c4/8f0fe3b9e0f7196f6d0bbb151f9fba323d72a41da068610c4c960b16632a/pillow-11.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:93a18841d09bcdd774dcdc308e4537e1f867b3dec059c131fde0327899734aa1", size = 4368819 }, - { url = "https://files.pythonhosted.org/packages/38/0d/84200ed6a871ce386ddc82904bfadc0c6b28b0c0ec78176871a4679e40b3/pillow-11.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9aa9aeddeed452b2f616ff5507459e7bab436916ccb10961c4a382cd3e03f47f", size = 4496081 }, - { url = "https://files.pythonhosted.org/packages/84/9c/9bcd66f714d7e25b64118e3952d52841a4babc6d97b6d28e2261c52045d4/pillow-11.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3cdcdb0b896e981678eee140d882b70092dac83ac1cdf6b3a60e2216a73f2b91", size = 4296513 }, - { url = "https://files.pythonhosted.org/packages/db/61/ada2a226e22da011b45f7104c95ebda1b63dcbb0c378ad0f7c2a710f8fd2/pillow-11.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:36ba10b9cb413e7c7dfa3e189aba252deee0602c86c309799da5a74009ac7a1c", size = 4431298 }, - { url = "https://files.pythonhosted.org/packages/e7/c4/fc6e86750523f367923522014b821c11ebc5ad402e659d8c9d09b3c9d70c/pillow-11.1.0-cp312-cp312-win32.whl", hash = "sha256:cfd5cd998c2e36a862d0e27b2df63237e67273f2fc78f47445b14e73a810e7e6", size = 2291630 }, - { url = "https://files.pythonhosted.org/packages/08/5c/2104299949b9d504baf3f4d35f73dbd14ef31bbd1ddc2c1b66a5b7dfda44/pillow-11.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:a697cd8ba0383bba3d2d3ada02b34ed268cb548b369943cd349007730c92bddf", size = 2626369 }, - { url = "https://files.pythonhosted.org/packages/37/f3/9b18362206b244167c958984b57c7f70a0289bfb59a530dd8af5f699b910/pillow-11.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:4dd43a78897793f60766563969442020e90eb7847463eca901e41ba186a7d4a5", size = 2375240 }, - { url = "https://files.pythonhosted.org/packages/b3/31/9ca79cafdce364fd5c980cd3416c20ce1bebd235b470d262f9d24d810184/pillow-11.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae98e14432d458fc3de11a77ccb3ae65ddce70f730e7c76140653048c71bfcbc", size = 3226640 }, - { url = "https://files.pythonhosted.org/packages/ac/0f/ff07ad45a1f172a497aa393b13a9d81a32e1477ef0e869d030e3c1532521/pillow-11.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cc1331b6d5a6e144aeb5e626f4375f5b7ae9934ba620c0ac6b3e43d5e683a0f0", size = 3101437 }, - { url = "https://files.pythonhosted.org/packages/08/2f/9906fca87a68d29ec4530be1f893149e0cb64a86d1f9f70a7cfcdfe8ae44/pillow-11.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:758e9d4ef15d3560214cddbc97b8ef3ef86ce04d62ddac17ad39ba87e89bd3b1", size = 4326605 }, - { url = "https://files.pythonhosted.org/packages/b0/0f/f3547ee15b145bc5c8b336401b2d4c9d9da67da9dcb572d7c0d4103d2c69/pillow-11.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b523466b1a31d0dcef7c5be1f20b942919b62fd6e9a9be199d035509cbefc0ec", size = 4411173 }, - { url = "https://files.pythonhosted.org/packages/b1/df/bf8176aa5db515c5de584c5e00df9bab0713548fd780c82a86cba2c2fedb/pillow-11.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:9044b5e4f7083f209c4e35aa5dd54b1dd5b112b108648f5c902ad586d4f945c5", size = 4369145 }, - { url = "https://files.pythonhosted.org/packages/de/7c/7433122d1cfadc740f577cb55526fdc39129a648ac65ce64db2eb7209277/pillow-11.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:3764d53e09cdedd91bee65c2527815d315c6b90d7b8b79759cc48d7bf5d4f114", size = 4496340 }, - { url = "https://files.pythonhosted.org/packages/25/46/dd94b93ca6bd555588835f2504bd90c00d5438fe131cf01cfa0c5131a19d/pillow-11.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:31eba6bbdd27dde97b0174ddf0297d7a9c3a507a8a1480e1e60ef914fe23d352", size = 4296906 }, - { url = "https://files.pythonhosted.org/packages/a8/28/2f9d32014dfc7753e586db9add35b8a41b7a3b46540e965cb6d6bc607bd2/pillow-11.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b5d658fbd9f0d6eea113aea286b21d3cd4d3fd978157cbf2447a6035916506d3", size = 4431759 }, - { url = "https://files.pythonhosted.org/packages/33/48/19c2cbe7403870fbe8b7737d19eb013f46299cdfe4501573367f6396c775/pillow-11.1.0-cp313-cp313-win32.whl", hash = "sha256:f86d3a7a9af5d826744fabf4afd15b9dfef44fe69a98541f666f66fbb8d3fef9", size = 2291657 }, - { url = "https://files.pythonhosted.org/packages/3b/ad/285c556747d34c399f332ba7c1a595ba245796ef3e22eae190f5364bb62b/pillow-11.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:593c5fd6be85da83656b93ffcccc2312d2d149d251e98588b14fbc288fd8909c", size = 2626304 }, - { url = "https://files.pythonhosted.org/packages/e5/7b/ef35a71163bf36db06e9c8729608f78dedf032fc8313d19bd4be5c2588f3/pillow-11.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:11633d58b6ee5733bde153a8dafd25e505ea3d32e261accd388827ee987baf65", size = 2375117 }, - { url = "https://files.pythonhosted.org/packages/79/30/77f54228401e84d6791354888549b45824ab0ffde659bafa67956303a09f/pillow-11.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:70ca5ef3b3b1c4a0812b5c63c57c23b63e53bc38e758b37a951e5bc466449861", size = 3230060 }, - { url = "https://files.pythonhosted.org/packages/ce/b1/56723b74b07dd64c1010fee011951ea9c35a43d8020acd03111f14298225/pillow-11.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8000376f139d4d38d6851eb149b321a52bb8893a88dae8ee7d95840431977081", size = 3106192 }, - { url = "https://files.pythonhosted.org/packages/e1/cd/7bf7180e08f80a4dcc6b4c3a0aa9e0b0ae57168562726a05dc8aa8fa66b0/pillow-11.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ee85f0696a17dd28fbcfceb59f9510aa71934b483d1f5601d1030c3c8304f3c", size = 4446805 }, - { url = "https://files.pythonhosted.org/packages/97/42/87c856ea30c8ed97e8efbe672b58c8304dee0573f8c7cab62ae9e31db6ae/pillow-11.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:dd0e081319328928531df7a0e63621caf67652c8464303fd102141b785ef9547", size = 4530623 }, - { url = "https://files.pythonhosted.org/packages/ff/41/026879e90c84a88e33fb00cc6bd915ac2743c67e87a18f80270dfe3c2041/pillow-11.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e63e4e5081de46517099dc30abe418122f54531a6ae2ebc8680bcd7096860eab", size = 4465191 }, - { url = "https://files.pythonhosted.org/packages/e5/fb/a7960e838bc5df57a2ce23183bfd2290d97c33028b96bde332a9057834d3/pillow-11.1.0-cp313-cp313t-win32.whl", hash = "sha256:dda60aa465b861324e65a78c9f5cf0f4bc713e4309f83bc387be158b077963d9", size = 2295494 }, - { url = "https://files.pythonhosted.org/packages/d7/6c/6ec83ee2f6f0fda8d4cf89045c6be4b0373ebfc363ba8538f8c999f63fcd/pillow-11.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ad5db5781c774ab9a9b2c4302bbf0c1014960a0a7be63278d13ae6fdf88126fe", size = 2631595 }, - { url = "https://files.pythonhosted.org/packages/cf/6c/41c21c6c8af92b9fea313aa47c75de49e2f9a467964ee33eb0135d47eb64/pillow-11.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:67cd427c68926108778a9005f2a04adbd5e67c442ed21d95389fe1d595458756", size = 2377651 }, -] - -[[package]] -name = "platformdirs" -version = "4.3.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/fc/128cc9cb8f03208bdbf93d3aa862e16d376844a14f9a0ce5cf4507372de4/platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", size = 21302 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, -] - -[[package]] -name = "pluggy" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, -] - -[[package]] -name = "pre-commit" -version = "4.0.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cfgv" }, - { name = "identify" }, - { name = "nodeenv" }, - { name = "pyyaml" }, - { name = "virtualenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2e/c8/e22c292035f1bac8b9f5237a2622305bc0304e776080b246f3df57c4ff9f/pre_commit-4.0.1.tar.gz", hash = "sha256:80905ac375958c0444c65e9cebebd948b3cdb518f335a091a670a89d652139d2", size = 191678 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/8f/496e10d51edd6671ebe0432e33ff800aa86775d2d147ce7d43389324a525/pre_commit-4.0.1-py2.py3-none-any.whl", hash = "sha256:efde913840816312445dc98787724647c65473daefe420785f885e8ed9a06878", size = 218713 }, -] - -[[package]] -name = "prometheus-client" -version = "0.21.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/62/14/7d0f567991f3a9af8d1cd4f619040c93b68f09a02b6d0b6ab1b2d1ded5fe/prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", size = 78551 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/c2/ab7d37426c179ceb9aeb109a85cda8948bb269b7561a0be870cc656eefe4/prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301", size = 54682 }, -] - -[[package]] -name = "prompt-toolkit" -version = "3.0.48" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "wcwidth" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2d/4f/feb5e137aff82f7c7f3248267b97451da3644f6cdc218edfe549fb354127/prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90", size = 424684 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/6a/fd08d94654f7e67c52ca30523a178b3f8ccc4237fce4be90d39c938a831a/prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e", size = 386595 }, -] - -[[package]] -name = "psutil" -version = "6.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 }, - { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 }, - { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 }, - { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 }, - { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 }, - { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 }, - { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 }, -] - -[[package]] -name = "ptyprocess" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, -] - -[[package]] -name = "pure-eval" -version = "0.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, -] - -[[package]] -name = "pycparser" -version = "2.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, -] - -[[package]] -name = "pydantic" -version = "2.10.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "annotated-types" }, - { name = "pydantic-core" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/70/7e/fb60e6fee04d0ef8f15e4e01ff187a196fa976eb0f0ab524af4599e5754c/pydantic-2.10.4.tar.gz", hash = "sha256:82f12e9723da6de4fe2ba888b5971157b3be7ad914267dea8f05f82b28254f06", size = 762094 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/26/3e1bbe954fde7ee22a6e7d31582c642aad9e84ffe4b5fb61e63b87cd326f/pydantic-2.10.4-py3-none-any.whl", hash = "sha256:597e135ea68be3a37552fb524bc7d0d66dcf93d395acd93a00682f1efcb8ee3d", size = 431765 }, -] - -[[package]] -name = "pydantic-core" -version = "2.27.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/89/f3450af9d09d44eea1f2c369f49e8f181d742f28220f88cc4dfaae91ea6e/pydantic_core-2.27.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", size = 1893421 }, - { url = "https://files.pythonhosted.org/packages/9e/e3/71fe85af2021f3f386da42d291412e5baf6ce7716bd7101ea49c810eda90/pydantic_core-2.27.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", size = 1814998 }, - { url = "https://files.pythonhosted.org/packages/a6/3c/724039e0d848fd69dbf5806894e26479577316c6f0f112bacaf67aa889ac/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", size = 1826167 }, - { url = "https://files.pythonhosted.org/packages/2b/5b/1b29e8c1fb5f3199a9a57c1452004ff39f494bbe9bdbe9a81e18172e40d3/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", size = 1865071 }, - { url = "https://files.pythonhosted.org/packages/89/6c/3985203863d76bb7d7266e36970d7e3b6385148c18a68cc8915fd8c84d57/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", size = 2036244 }, - { url = "https://files.pythonhosted.org/packages/0e/41/f15316858a246b5d723f7d7f599f79e37493b2e84bfc789e58d88c209f8a/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", size = 2737470 }, - { url = "https://files.pythonhosted.org/packages/a8/7c/b860618c25678bbd6d1d99dbdfdf0510ccb50790099b963ff78a124b754f/pydantic_core-2.27.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", size = 1992291 }, - { url = "https://files.pythonhosted.org/packages/bf/73/42c3742a391eccbeab39f15213ecda3104ae8682ba3c0c28069fbcb8c10d/pydantic_core-2.27.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", size = 1994613 }, - { url = "https://files.pythonhosted.org/packages/94/7a/941e89096d1175d56f59340f3a8ebaf20762fef222c298ea96d36a6328c5/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", size = 2002355 }, - { url = "https://files.pythonhosted.org/packages/6e/95/2359937a73d49e336a5a19848713555605d4d8d6940c3ec6c6c0ca4dcf25/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", size = 2126661 }, - { url = "https://files.pythonhosted.org/packages/2b/4c/ca02b7bdb6012a1adef21a50625b14f43ed4d11f1fc237f9d7490aa5078c/pydantic_core-2.27.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", size = 2153261 }, - { url = "https://files.pythonhosted.org/packages/72/9d/a241db83f973049a1092a079272ffe2e3e82e98561ef6214ab53fe53b1c7/pydantic_core-2.27.2-cp311-cp311-win32.whl", hash = "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", size = 1812361 }, - { url = "https://files.pythonhosted.org/packages/e8/ef/013f07248041b74abd48a385e2110aa3a9bbfef0fbd97d4e6d07d2f5b89a/pydantic_core-2.27.2-cp311-cp311-win_amd64.whl", hash = "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", size = 1982484 }, - { url = "https://files.pythonhosted.org/packages/10/1c/16b3a3e3398fd29dca77cea0a1d998d6bde3902fa2706985191e2313cc76/pydantic_core-2.27.2-cp311-cp311-win_arm64.whl", hash = "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", size = 1867102 }, - { url = "https://files.pythonhosted.org/packages/d6/74/51c8a5482ca447871c93e142d9d4a92ead74de6c8dc5e66733e22c9bba89/pydantic_core-2.27.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", size = 1893127 }, - { url = "https://files.pythonhosted.org/packages/d3/f3/c97e80721735868313c58b89d2de85fa80fe8dfeeed84dc51598b92a135e/pydantic_core-2.27.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", size = 1811340 }, - { url = "https://files.pythonhosted.org/packages/9e/91/840ec1375e686dbae1bd80a9e46c26a1e0083e1186abc610efa3d9a36180/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", size = 1822900 }, - { url = "https://files.pythonhosted.org/packages/f6/31/4240bc96025035500c18adc149aa6ffdf1a0062a4b525c932065ceb4d868/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", size = 1869177 }, - { url = "https://files.pythonhosted.org/packages/fa/20/02fbaadb7808be578317015c462655c317a77a7c8f0ef274bc016a784c54/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", size = 2038046 }, - { url = "https://files.pythonhosted.org/packages/06/86/7f306b904e6c9eccf0668248b3f272090e49c275bc488a7b88b0823444a4/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", size = 2685386 }, - { url = "https://files.pythonhosted.org/packages/8d/f0/49129b27c43396581a635d8710dae54a791b17dfc50c70164866bbf865e3/pydantic_core-2.27.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", size = 1997060 }, - { url = "https://files.pythonhosted.org/packages/0d/0f/943b4af7cd416c477fd40b187036c4f89b416a33d3cc0ab7b82708a667aa/pydantic_core-2.27.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", size = 2004870 }, - { url = "https://files.pythonhosted.org/packages/35/40/aea70b5b1a63911c53a4c8117c0a828d6790483f858041f47bab0b779f44/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", size = 1999822 }, - { url = "https://files.pythonhosted.org/packages/f2/b3/807b94fd337d58effc5498fd1a7a4d9d59af4133e83e32ae39a96fddec9d/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", size = 2130364 }, - { url = "https://files.pythonhosted.org/packages/fc/df/791c827cd4ee6efd59248dca9369fb35e80a9484462c33c6649a8d02b565/pydantic_core-2.27.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", size = 2158303 }, - { url = "https://files.pythonhosted.org/packages/9b/67/4e197c300976af185b7cef4c02203e175fb127e414125916bf1128b639a9/pydantic_core-2.27.2-cp312-cp312-win32.whl", hash = "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", size = 1834064 }, - { url = "https://files.pythonhosted.org/packages/1f/ea/cd7209a889163b8dcca139fe32b9687dd05249161a3edda62860430457a5/pydantic_core-2.27.2-cp312-cp312-win_amd64.whl", hash = "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", size = 1989046 }, - { url = "https://files.pythonhosted.org/packages/bc/49/c54baab2f4658c26ac633d798dab66b4c3a9bbf47cff5284e9c182f4137a/pydantic_core-2.27.2-cp312-cp312-win_arm64.whl", hash = "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", size = 1885092 }, - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, -] - -[[package]] -name = "pygments" -version = "2.19.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, -] - -[[package]] -name = "pyparsing" -version = "3.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2/pyparsing-3.2.1.tar.gz", hash = "sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a", size = 1067694 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl", hash = "sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", size = 107716 }, -] - -[[package]] -name = "pyproj" -version = "3.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7d/84/2b39bbf888c753ea48b40d47511548c77aa03445465c35cc4c4e9649b643/pyproj-3.6.1.tar.gz", hash = "sha256:44aa7c704c2b7d8fb3d483bbf75af6cb2350d30a63b144279a09b75fead501bf", size = 225131 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/a6/a300c1b14b2112e966e9f90b18f9c13b586bdcf417207cee913ae9005da3/pyproj-3.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ebfbdbd0936e178091309f6cd4fcb4decd9eab12aa513cdd9add89efa3ec2882", size = 6147442 }, - { url = "https://files.pythonhosted.org/packages/30/bd/b9bd3761f08754e8dbb34c5a647db2099b348ab5da338e90980caf280e37/pyproj-3.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:447db19c7efad70ff161e5e46a54ab9cc2399acebb656b6ccf63e4bc4a04b97a", size = 4880331 }, - { url = "https://files.pythonhosted.org/packages/f4/0a/d82aeeb605b5d6870bc72307c3b5e044e632eb7720df8885e144f51a8eac/pyproj-3.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7e13c40183884ec7f94eb8e0f622f08f1d5716150b8d7a134de48c6110fee85", size = 6192425 }, - { url = "https://files.pythonhosted.org/packages/64/90/dfe5c00de1ca4dbb82606e79790659d4ed7f0ed8d372bccb3baca2a5abe0/pyproj-3.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65ad699e0c830e2b8565afe42bd58cc972b47d829b2e0e48ad9638386d994915", size = 8571478 }, - { url = "https://files.pythonhosted.org/packages/14/6d/ae373629a1723f0db80d7b8c93598b00d9ecb930ed9ebf4f35826a33e97c/pyproj-3.6.1-cp311-cp311-win32.whl", hash = "sha256:8b8acc31fb8702c54625f4d5a2a6543557bec3c28a0ef638778b7ab1d1772132", size = 5634575 }, - { url = "https://files.pythonhosted.org/packages/79/95/eb68113c5b5737c342bde1bab92705dabe69c16299c5a122616e50f1fbd6/pyproj-3.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:38a3361941eb72b82bd9a18f60c78b0df8408416f9340521df442cebfc4306e2", size = 6088494 }, - { url = "https://files.pythonhosted.org/packages/0b/64/93232511a7906a492b1b7dfdfc17f4e95982d76a24ef4f86d18cfe7ae2c9/pyproj-3.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1e9fbaf920f0f9b4ee62aab832be3ae3968f33f24e2e3f7fbb8c6728ef1d9746", size = 6135280 }, - { url = "https://files.pythonhosted.org/packages/10/f2/b550b1f65cc7e51c9116b220b50aade60c439103432a3fd5b12efbc77e15/pyproj-3.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d227a865356f225591b6732430b1d1781e946893789a609bb34f59d09b8b0f8", size = 4880030 }, - { url = "https://files.pythonhosted.org/packages/fe/4b/2f8f6f94643b9fe2083338eff294feda84d916409b5840b7a402d2be93f8/pyproj-3.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83039e5ae04e5afc974f7d25ee0870a80a6bd6b7957c3aca5613ccbe0d3e72bf", size = 6184439 }, - { url = "https://files.pythonhosted.org/packages/19/9b/c57569132174786aa3f72275ac306956859a639dad0ce8d95c8411ce8209/pyproj-3.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb059ba3bced6f6725961ba758649261d85ed6ce670d3e3b0a26e81cf1aa8d", size = 8660747 }, - { url = "https://files.pythonhosted.org/packages/0e/ab/1c2159ec757677c5a6b8803f6be45c2b550dc42c84ec4a228dc219849bbb/pyproj-3.6.1-cp312-cp312-win32.whl", hash = "sha256:2d6ff73cc6dbbce3766b6c0bce70ce070193105d8de17aa2470009463682a8eb", size = 5626805 }, - { url = "https://files.pythonhosted.org/packages/c7/f3/2f32fe143cd7ba1d4d68f1b6dce9ca402d909cbd5a5830e3a8fa3d1acbbf/pyproj-3.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:7a27151ddad8e1439ba70c9b4b2b617b290c39395fa9ddb7411ebb0eb86d6fb0", size = 6079779 }, -] - -[[package]] -name = "pyright" -version = "1.1.391" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "nodeenv" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/11/05/4ea52a8a45cc28897edb485b4102d37cbfd5fce8445d679cdeb62bfad221/pyright-1.1.391.tar.gz", hash = "sha256:66b2d42cdf5c3cbab05f2f4b76e8bec8aa78e679bfa0b6ad7b923d9e027cadb2", size = 21965 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/89/66f49552fbeb21944c8077d11834b2201514a56fd1b7747ffff9630f1bd9/pyright-1.1.391-py3-none-any.whl", hash = "sha256:54fa186f8b3e8a55a44ebfa842636635688670c6896dcf6cf4a7fc75062f4d15", size = 18579 }, -] - -[[package]] -name = "pyshp" -version = "2.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/63/9f/0dd21250c60375a532c35e89fad8d5e8a3f1a2e3f7c389ccc5a60b05263e/pyshp-2.3.1.tar.gz", hash = "sha256:4caec82fd8dd096feba8217858068bacb2a3b5950f43c048c6dc32a3489d5af1", size = 1731544 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/2f/68116db5b36b895c0450e3072b8cb6c2fac0359279b182ea97014d3c8ac0/pyshp-2.3.1-py2.py3-none-any.whl", hash = "sha256:67024c0ccdc352ba5db777c4e968483782dfa78f8e200672a90d2d30fd8b7b49", size = 46537 }, -] - -[[package]] -name = "pytest" -version = "8.3.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "iniconfig" }, - { name = "packaging" }, - { name = "pluggy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/05/35/30e0d83068951d90a01852cb1cef56e5d8a09d20c7f511634cc2f7e0372a/pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761", size = 1445919 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/11/92/76a1c94d3afee238333bc0a42b82935dd8f9cf8ce9e336ff87ee14d9e1cf/pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6", size = 343083 }, -] - -[[package]] -name = "pytest-cov" -version = "6.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "coverage", extra = ["toml"] }, - { name = "pytest" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/be/45/9b538de8cef30e17c7b45ef42f538a94889ed6a16f2387a6c89e73220651/pytest-cov-6.0.0.tar.gz", hash = "sha256:fde0b595ca248bb8e2d76f020b465f3b107c9632e6a1d1705f17834c89dcadc0", size = 66945 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/3b/48e79f2cd6a61dbbd4807b4ed46cb564b4fd50a76166b1c4ea5c1d9e2371/pytest_cov-6.0.0-py3-none-any.whl", hash = "sha256:eee6f1b9e61008bd34975a4d5bab25801eb31898b032dd55addc93e96fcaaa35", size = 22949 }, -] - -[[package]] -name = "python-dateutil" -version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, -] - -[[package]] -name = "python-json-logger" -version = "3.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/c4/358cd13daa1d912ef795010897a483ab2f0b41c9ea1b35235a8b2f7d15a7/python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008", size = 16287 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/72/2f30cf26664fcfa0bd8ec5ee62ec90c03bd485e4a294d92aabc76c5203a5/python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090", size = 14924 }, -] - -[[package]] -name = "pywin32" -version = "308" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/e2/02652007469263fe1466e98439831d65d4ca80ea1a2df29abecedf7e47b7/pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a", size = 5928156 }, - { url = "https://files.pythonhosted.org/packages/48/ef/f4fb45e2196bc7ffe09cad0542d9aff66b0e33f6c0954b43e49c33cad7bd/pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b", size = 6559559 }, - { url = "https://files.pythonhosted.org/packages/79/ef/68bb6aa865c5c9b11a35771329e95917b5559845bd75b65549407f9fc6b4/pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6", size = 7972495 }, - { url = "https://files.pythonhosted.org/packages/00/7c/d00d6bdd96de4344e06c4afbf218bc86b54436a94c01c71a8701f613aa56/pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897", size = 5939729 }, - { url = "https://files.pythonhosted.org/packages/21/27/0c8811fbc3ca188f93b5354e7c286eb91f80a53afa4e11007ef661afa746/pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47", size = 6543015 }, - { url = "https://files.pythonhosted.org/packages/9d/0f/d40f8373608caed2255781a3ad9a51d03a594a1248cd632d6a298daca693/pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091", size = 7976033 }, - { url = "https://files.pythonhosted.org/packages/a9/a4/aa562d8935e3df5e49c161b427a3a2efad2ed4e9cf81c3de636f1fdddfd0/pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed", size = 5938579 }, - { url = "https://files.pythonhosted.org/packages/c7/50/b0efb8bb66210da67a53ab95fd7a98826a97ee21f1d22949863e6d588b22/pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4", size = 6542056 }, - { url = "https://files.pythonhosted.org/packages/26/df/2b63e3e4f2df0224f8aaf6d131f54fe4e8c96400eb9df563e2aae2e1a1f9/pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd", size = 7974986 }, -] - -[[package]] -name = "pywinpty" -version = "2.0.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/82/90f8750423cba4b9b6c842df227609fb60704482d7abf6dd47e2babc055a/pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e", size = 27769 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/e2/af1a99c0432e4e58c9ac8e334ee191790ec9793d33559189b9d2069bdc1d/pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7", size = 1397223 }, - { url = "https://files.pythonhosted.org/packages/ad/79/759ae767a3b78d340446efd54dd1fe4f7dafa4fc7be96ed757e44bcdba54/pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737", size = 1397207 }, - { url = "https://files.pythonhosted.org/packages/7d/34/b77b3c209bf2eaa6455390c8d5449241637f5957f41636a2204065d52bfa/pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819", size = 1396698 }, -] - -[[package]] -name = "pyyaml" -version = "6.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, -] - -[[package]] -name = "pyzmq" -version = "26.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "implementation_name == 'pypy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fd/05/bed626b9f7bb2322cdbbf7b4bd8f54b1b617b0d2ab2d3547d6e39428a48e/pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", size = 271975 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/20/de7442172f77f7c96299a0ac70e7d4fb78cd51eca67aa2cf552b66c14196/pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218", size = 1340639 }, - { url = "https://files.pythonhosted.org/packages/98/4d/5000468bd64c7910190ed0a6c76a1ca59a68189ec1f007c451dc181a22f4/pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4", size = 1008710 }, - { url = "https://files.pythonhosted.org/packages/e1/bf/c67fd638c2f9fbbab8090a3ee779370b97c82b84cc12d0c498b285d7b2c0/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef", size = 673129 }, - { url = "https://files.pythonhosted.org/packages/86/94/99085a3f492aa538161cbf27246e8886ff850e113e0c294a5b8245f13b52/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317", size = 910107 }, - { url = "https://files.pythonhosted.org/packages/31/1d/346809e8a9b999646d03f21096428453465b1bca5cd5c64ecd048d9ecb01/pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf", size = 867960 }, - { url = "https://files.pythonhosted.org/packages/ab/68/6fb6ae5551846ad5beca295b7bca32bf0a7ce19f135cb30e55fa2314e6b6/pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e", size = 869204 }, - { url = "https://files.pythonhosted.org/packages/0f/f9/18417771dee223ccf0f48e29adf8b4e25ba6d0e8285e33bcbce078070bc3/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37", size = 1203351 }, - { url = "https://files.pythonhosted.org/packages/e0/46/f13e67fe0d4f8a2315782cbad50493de6203ea0d744610faf4d5f5b16e90/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3", size = 1514204 }, - { url = "https://files.pythonhosted.org/packages/50/11/ddcf7343b7b7a226e0fc7b68cbf5a5bb56291fac07f5c3023bb4c319ebb4/pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6", size = 1414339 }, - { url = "https://files.pythonhosted.org/packages/01/14/1c18d7d5b7be2708f513f37c61bfadfa62161c10624f8733f1c8451b3509/pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4", size = 576928 }, - { url = "https://files.pythonhosted.org/packages/3b/1b/0a540edd75a41df14ec416a9a500b9fec66e554aac920d4c58fbd5756776/pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5", size = 642317 }, - { url = "https://files.pythonhosted.org/packages/98/77/1cbfec0358078a4c5add529d8a70892db1be900980cdb5dd0898b3d6ab9d/pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003", size = 543834 }, - { url = "https://files.pythonhosted.org/packages/28/2f/78a766c8913ad62b28581777ac4ede50c6d9f249d39c2963e279524a1bbe/pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9", size = 1343105 }, - { url = "https://files.pythonhosted.org/packages/b7/9c/4b1e2d3d4065be715e007fe063ec7885978fad285f87eae1436e6c3201f4/pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52", size = 1008365 }, - { url = "https://files.pythonhosted.org/packages/4f/ef/5a23ec689ff36d7625b38d121ef15abfc3631a9aecb417baf7a4245e4124/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08", size = 665923 }, - { url = "https://files.pythonhosted.org/packages/ae/61/d436461a47437d63c6302c90724cf0981883ec57ceb6073873f32172d676/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5", size = 903400 }, - { url = "https://files.pythonhosted.org/packages/47/42/fc6d35ecefe1739a819afaf6f8e686f7f02a4dd241c78972d316f403474c/pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae", size = 860034 }, - { url = "https://files.pythonhosted.org/packages/07/3b/44ea6266a6761e9eefaa37d98fabefa112328808ac41aa87b4bbb668af30/pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711", size = 860579 }, - { url = "https://files.pythonhosted.org/packages/38/6f/4df2014ab553a6052b0e551b37da55166991510f9e1002c89cab7ce3b3f2/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6", size = 1196246 }, - { url = "https://files.pythonhosted.org/packages/38/9d/ee240fc0c9fe9817f0c9127a43238a3e28048795483c403cc10720ddef22/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3", size = 1507441 }, - { url = "https://files.pythonhosted.org/packages/85/4f/01711edaa58d535eac4a26c294c617c9a01f09857c0ce191fd574d06f359/pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b", size = 1406498 }, - { url = "https://files.pythonhosted.org/packages/07/18/907134c85c7152f679ed744e73e645b365f3ad571f38bdb62e36f347699a/pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", size = 575533 }, - { url = "https://files.pythonhosted.org/packages/ce/2c/a6f4a20202a4d3c582ad93f95ee78d79bbdc26803495aec2912b17dbbb6c/pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", size = 637768 }, - { url = "https://files.pythonhosted.org/packages/5f/0e/eb16ff731632d30554bf5af4dbba3ffcd04518219d82028aea4ae1b02ca5/pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", size = 540675 }, - { url = "https://files.pythonhosted.org/packages/04/a7/0f7e2f6c126fe6e62dbae0bc93b1bd3f1099cf7fea47a5468defebe3f39d/pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", size = 1006564 }, - { url = "https://files.pythonhosted.org/packages/31/b6/a187165c852c5d49f826a690857684333a6a4a065af0a6015572d2284f6a/pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", size = 1340447 }, - { url = "https://files.pythonhosted.org/packages/68/ba/f4280c58ff71f321602a6e24fd19879b7e79793fb8ab14027027c0fb58ef/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", size = 665485 }, - { url = "https://files.pythonhosted.org/packages/77/b5/c987a5c53c7d8704216f29fc3d810b32f156bcea488a940e330e1bcbb88d/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", size = 903484 }, - { url = "https://files.pythonhosted.org/packages/29/c9/07da157d2db18c72a7eccef8e684cefc155b712a88e3d479d930aa9eceba/pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", size = 859981 }, - { url = "https://files.pythonhosted.org/packages/43/09/e12501bd0b8394b7d02c41efd35c537a1988da67fc9c745cae9c6c776d31/pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", size = 860334 }, - { url = "https://files.pythonhosted.org/packages/eb/ff/f5ec1d455f8f7385cc0a8b2acd8c807d7fade875c14c44b85c1bddabae21/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", size = 1196179 }, - { url = "https://files.pythonhosted.org/packages/ec/8a/bb2ac43295b1950fe436a81fc5b298be0b96ac76fb029b514d3ed58f7b27/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", size = 1507668 }, - { url = "https://files.pythonhosted.org/packages/a9/49/dbc284ebcfd2dca23f6349227ff1616a7ee2c4a35fe0a5d6c3deff2b4fed/pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", size = 1406539 }, - { url = "https://files.pythonhosted.org/packages/00/68/093cdce3fe31e30a341d8e52a1ad86392e13c57970d722c1f62a1d1a54b6/pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", size = 575567 }, - { url = "https://files.pythonhosted.org/packages/92/ae/6cc4657148143412b5819b05e362ae7dd09fb9fe76e2a539dcff3d0386bc/pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", size = 637551 }, - { url = "https://files.pythonhosted.org/packages/6c/67/fbff102e201688f97c8092e4c3445d1c1068c2f27bbd45a578df97ed5f94/pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", size = 540378 }, - { url = "https://files.pythonhosted.org/packages/3f/fe/2d998380b6e0122c6c4bdf9b6caf490831e5f5e2d08a203b5adff060c226/pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", size = 1007378 }, - { url = "https://files.pythonhosted.org/packages/4a/f4/30d6e7157f12b3a0390bde94d6a8567cdb88846ed068a6e17238a4ccf600/pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", size = 1329532 }, - { url = "https://files.pythonhosted.org/packages/82/86/3fe917870e15ee1c3ad48229a2a64458e36036e64b4afa9659045d82bfa8/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", size = 653242 }, - { url = "https://files.pythonhosted.org/packages/50/2d/242e7e6ef6c8c19e6cb52d095834508cd581ffb925699fd3c640cdc758f1/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", size = 888404 }, - { url = "https://files.pythonhosted.org/packages/ac/11/7270566e1f31e4ea73c81ec821a4b1688fd551009a3d2bab11ec66cb1e8f/pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", size = 845858 }, - { url = "https://files.pythonhosted.org/packages/91/d5/72b38fbc69867795c8711bdd735312f9fef1e3d9204e2f63ab57085434b9/pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", size = 847375 }, - { url = "https://files.pythonhosted.org/packages/dd/9a/10ed3c7f72b4c24e719c59359fbadd1a27556a28b36cdf1cd9e4fb7845d5/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", size = 1183489 }, - { url = "https://files.pythonhosted.org/packages/72/2d/8660892543fabf1fe41861efa222455811adac9f3c0818d6c3170a1153e3/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", size = 1492932 }, - { url = "https://files.pythonhosted.org/packages/7b/d6/32fd69744afb53995619bc5effa2a405ae0d343cd3e747d0fbc43fe894ee/pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", size = 1392485 }, -] - -[[package]] -name = "referencing" -version = "0.35.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/73ca1f8e72fff6fa52119dbd185f73a907b1989428917b24cff660129b6d/referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", size = 62991 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/59/2056f61236782a2c86b33906c025d4f4a0b17be0161b63b70fd9e8775d36/referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de", size = 26684 }, -] - -[[package]] -name = "requests" -version = "2.32.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "charset-normalizer" }, - { name = "idna" }, - { name = "urllib3" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, -] - -[[package]] -name = "rfc3339-validator" -version = "0.1.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "six" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b", size = 5513 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa", size = 3490 }, -] - -[[package]] -name = "rfc3986-validator" -version = "0.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055", size = 6760 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9", size = 4242 }, -] - -[[package]] -name = "rpds-py" -version = "0.22.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/80/cce854d0921ff2f0a9fa831ba3ad3c65cee3a46711addf39a2af52df2cfd/rpds_py-0.22.3.tar.gz", hash = "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d", size = 26771 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/15/ad/8d1ddf78f2805a71253fcd388017e7b4a0615c22c762b6d35301fef20106/rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f", size = 359773 }, - { url = "https://files.pythonhosted.org/packages/c8/75/68c15732293a8485d79fe4ebe9045525502a067865fa4278f178851b2d87/rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a", size = 349214 }, - { url = "https://files.pythonhosted.org/packages/3c/4c/7ce50f3070083c2e1b2bbd0fb7046f3da55f510d19e283222f8f33d7d5f4/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5", size = 380477 }, - { url = "https://files.pythonhosted.org/packages/9a/e9/835196a69cb229d5c31c13b8ae603bd2da9a6695f35fe4270d398e1db44c/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb", size = 386171 }, - { url = "https://files.pythonhosted.org/packages/f9/8e/33fc4eba6683db71e91e6d594a2cf3a8fbceb5316629f0477f7ece5e3f75/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2", size = 422676 }, - { url = "https://files.pythonhosted.org/packages/37/47/2e82d58f8046a98bb9497a8319604c92b827b94d558df30877c4b3c6ccb3/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0", size = 446152 }, - { url = "https://files.pythonhosted.org/packages/e1/78/79c128c3e71abbc8e9739ac27af11dc0f91840a86fce67ff83c65d1ba195/rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1", size = 381300 }, - { url = "https://files.pythonhosted.org/packages/c9/5b/2e193be0e8b228c1207f31fa3ea79de64dadb4f6a4833111af8145a6bc33/rpds_py-0.22.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d", size = 409636 }, - { url = "https://files.pythonhosted.org/packages/c2/3f/687c7100b762d62186a1c1100ffdf99825f6fa5ea94556844bbbd2d0f3a9/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648", size = 556708 }, - { url = "https://files.pythonhosted.org/packages/8c/a2/c00cbc4b857e8b3d5e7f7fc4c81e23afd8c138b930f4f3ccf9a41a23e9e4/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74", size = 583554 }, - { url = "https://files.pythonhosted.org/packages/d0/08/696c9872cf56effdad9ed617ac072f6774a898d46b8b8964eab39ec562d2/rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a", size = 552105 }, - { url = "https://files.pythonhosted.org/packages/18/1f/4df560be1e994f5adf56cabd6c117e02de7c88ee238bb4ce03ed50da9d56/rpds_py-0.22.3-cp311-cp311-win32.whl", hash = "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64", size = 220199 }, - { url = "https://files.pythonhosted.org/packages/b8/1b/c29b570bc5db8237553002788dc734d6bd71443a2ceac2a58202ec06ef12/rpds_py-0.22.3-cp311-cp311-win_amd64.whl", hash = "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c", size = 231775 }, - { url = "https://files.pythonhosted.org/packages/75/47/3383ee3bd787a2a5e65a9b9edc37ccf8505c0a00170e3a5e6ea5fbcd97f7/rpds_py-0.22.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e", size = 352334 }, - { url = "https://files.pythonhosted.org/packages/40/14/aa6400fa8158b90a5a250a77f2077c0d0cd8a76fce31d9f2b289f04c6dec/rpds_py-0.22.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56", size = 342111 }, - { url = "https://files.pythonhosted.org/packages/7d/06/395a13bfaa8a28b302fb433fb285a67ce0ea2004959a027aea8f9c52bad4/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45", size = 384286 }, - { url = "https://files.pythonhosted.org/packages/43/52/d8eeaffab047e6b7b7ef7f00d5ead074a07973968ffa2d5820fa131d7852/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e", size = 391739 }, - { url = "https://files.pythonhosted.org/packages/83/31/52dc4bde85c60b63719610ed6f6d61877effdb5113a72007679b786377b8/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d", size = 427306 }, - { url = "https://files.pythonhosted.org/packages/70/d5/1bab8e389c2261dba1764e9e793ed6830a63f830fdbec581a242c7c46bda/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38", size = 442717 }, - { url = "https://files.pythonhosted.org/packages/82/a1/a45f3e30835b553379b3a56ea6c4eb622cf11e72008229af840e4596a8ea/rpds_py-0.22.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15", size = 385721 }, - { url = "https://files.pythonhosted.org/packages/a6/27/780c942de3120bdd4d0e69583f9c96e179dfff082f6ecbb46b8d6488841f/rpds_py-0.22.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059", size = 415824 }, - { url = "https://files.pythonhosted.org/packages/94/0b/aa0542ca88ad20ea719b06520f925bae348ea5c1fdf201b7e7202d20871d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e", size = 561227 }, - { url = "https://files.pythonhosted.org/packages/0d/92/3ed77d215f82c8f844d7f98929d56cc321bb0bcfaf8f166559b8ec56e5f1/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61", size = 587424 }, - { url = "https://files.pythonhosted.org/packages/09/42/cacaeb047a22cab6241f107644f230e2935d4efecf6488859a7dd82fc47d/rpds_py-0.22.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7", size = 555953 }, - { url = "https://files.pythonhosted.org/packages/e6/52/c921dc6d5f5d45b212a456c1f5b17df1a471127e8037eb0972379e39dff4/rpds_py-0.22.3-cp312-cp312-win32.whl", hash = "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627", size = 221339 }, - { url = "https://files.pythonhosted.org/packages/f2/c7/f82b5be1e8456600395366f86104d1bd8d0faed3802ad511ef6d60c30d98/rpds_py-0.22.3-cp312-cp312-win_amd64.whl", hash = "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4", size = 235786 }, - { url = "https://files.pythonhosted.org/packages/d0/bf/36d5cc1f2c609ae6e8bf0fc35949355ca9d8790eceb66e6385680c951e60/rpds_py-0.22.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84", size = 351657 }, - { url = "https://files.pythonhosted.org/packages/24/2a/f1e0fa124e300c26ea9382e59b2d582cba71cedd340f32d1447f4f29fa4e/rpds_py-0.22.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25", size = 341829 }, - { url = "https://files.pythonhosted.org/packages/cf/c2/0da1231dd16953845bed60d1a586fcd6b15ceaeb965f4d35cdc71f70f606/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4", size = 384220 }, - { url = "https://files.pythonhosted.org/packages/c7/73/a4407f4e3a00a9d4b68c532bf2d873d6b562854a8eaff8faa6133b3588ec/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5", size = 391009 }, - { url = "https://files.pythonhosted.org/packages/a9/c3/04b7353477ab360fe2563f5f0b176d2105982f97cd9ae80a9c5a18f1ae0f/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc", size = 426989 }, - { url = "https://files.pythonhosted.org/packages/8d/e6/e4b85b722bcf11398e17d59c0f6049d19cd606d35363221951e6d625fcb0/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b", size = 441544 }, - { url = "https://files.pythonhosted.org/packages/27/fc/403e65e56f65fff25f2973216974976d3f0a5c3f30e53758589b6dc9b79b/rpds_py-0.22.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518", size = 385179 }, - { url = "https://files.pythonhosted.org/packages/57/9b/2be9ff9700d664d51fd96b33d6595791c496d2778cb0b2a634f048437a55/rpds_py-0.22.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd", size = 415103 }, - { url = "https://files.pythonhosted.org/packages/bb/a5/03c2ad8ca10994fcf22dd2150dd1d653bc974fa82d9a590494c84c10c641/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2", size = 560916 }, - { url = "https://files.pythonhosted.org/packages/ba/2e/be4fdfc8b5b576e588782b56978c5b702c5a2307024120d8aeec1ab818f0/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16", size = 587062 }, - { url = "https://files.pythonhosted.org/packages/67/e0/2034c221937709bf9c542603d25ad43a68b4b0a9a0c0b06a742f2756eb66/rpds_py-0.22.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f", size = 555734 }, - { url = "https://files.pythonhosted.org/packages/ea/ce/240bae07b5401a22482b58e18cfbabaa392409b2797da60223cca10d7367/rpds_py-0.22.3-cp313-cp313-win32.whl", hash = "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de", size = 220663 }, - { url = "https://files.pythonhosted.org/packages/cb/f0/d330d08f51126330467edae2fa4efa5cec8923c87551a79299380fdea30d/rpds_py-0.22.3-cp313-cp313-win_amd64.whl", hash = "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9", size = 235503 }, - { url = "https://files.pythonhosted.org/packages/f7/c4/dbe1cc03df013bf2feb5ad00615038050e7859f381e96fb5b7b4572cd814/rpds_py-0.22.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b", size = 347698 }, - { url = "https://files.pythonhosted.org/packages/a4/3a/684f66dd6b0f37499cad24cd1c0e523541fd768576fa5ce2d0a8799c3cba/rpds_py-0.22.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b", size = 337330 }, - { url = "https://files.pythonhosted.org/packages/82/eb/e022c08c2ce2e8f7683baa313476492c0e2c1ca97227fe8a75d9f0181e95/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1", size = 380022 }, - { url = "https://files.pythonhosted.org/packages/e4/21/5a80e653e4c86aeb28eb4fea4add1f72e1787a3299687a9187105c3ee966/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83", size = 390754 }, - { url = "https://files.pythonhosted.org/packages/37/a4/d320a04ae90f72d080b3d74597074e62be0a8ecad7d7321312dfe2dc5a6a/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd", size = 423840 }, - { url = "https://files.pythonhosted.org/packages/87/70/674dc47d93db30a6624279284e5631be4c3a12a0340e8e4f349153546728/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1", size = 438970 }, - { url = "https://files.pythonhosted.org/packages/3f/64/9500f4d66601d55cadd21e90784cfd5d5f4560e129d72e4339823129171c/rpds_py-0.22.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3", size = 383146 }, - { url = "https://files.pythonhosted.org/packages/4d/45/630327addb1d17173adcf4af01336fd0ee030c04798027dfcb50106001e0/rpds_py-0.22.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130", size = 408294 }, - { url = "https://files.pythonhosted.org/packages/5f/ef/8efb3373cee54ea9d9980b772e5690a0c9e9214045a4e7fa35046e399fee/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c", size = 556345 }, - { url = "https://files.pythonhosted.org/packages/54/01/151d3b9ef4925fc8f15bfb131086c12ec3c3d6dd4a4f7589c335bf8e85ba/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b", size = 582292 }, - { url = "https://files.pythonhosted.org/packages/30/89/35fc7a6cdf3477d441c7aca5e9bbf5a14e0f25152aed7f63f4e0b141045d/rpds_py-0.22.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333", size = 553855 }, - { url = "https://files.pythonhosted.org/packages/8f/e0/830c02b2457c4bd20a8c5bb394d31d81f57fbefce2dbdd2e31feff4f7003/rpds_py-0.22.3-cp313-cp313t-win32.whl", hash = "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730", size = 219100 }, - { url = "https://files.pythonhosted.org/packages/f8/30/7ac943f69855c2db77407ae363484b915d861702dbba1aa82d68d57f42be/rpds_py-0.22.3-cp313-cp313t-win_amd64.whl", hash = "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf", size = 233794 }, -] - -[[package]] -name = "ruff" -version = "0.8.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/da/00/089db7890ea3be5709e3ece6e46408d6f1e876026ec3fd081ee585fef209/ruff-0.8.6.tar.gz", hash = "sha256:dcad24b81b62650b0eb8814f576fc65cfee8674772a6e24c9b747911801eeaa5", size = 3473116 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d7/28/aa07903694637c2fa394a9f4fe93cf861ad8b09f1282fa650ef07ff9fe97/ruff-0.8.6-py3-none-linux_armv6l.whl", hash = "sha256:defed167955d42c68b407e8f2e6f56ba52520e790aba4ca707a9c88619e580e3", size = 10628735 }, - { url = "https://files.pythonhosted.org/packages/2b/43/827bb1448f1fcb0fb42e9c6edf8fb067ca8244923bf0ddf12b7bf949065c/ruff-0.8.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:54799ca3d67ae5e0b7a7ac234baa657a9c1784b48ec954a094da7c206e0365b1", size = 10386758 }, - { url = "https://files.pythonhosted.org/packages/df/93/fc852a81c3cd315b14676db3b8327d2bb2d7508649ad60bfdb966d60738d/ruff-0.8.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e88b8f6d901477c41559ba540beeb5a671e14cd29ebd5683903572f4b40a9807", size = 10007808 }, - { url = "https://files.pythonhosted.org/packages/94/e9/e0ed4af1794335fb280c4fac180f2bf40f6a3b859cae93a5a3ada27325ae/ruff-0.8.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0509e8da430228236a18a677fcdb0c1f102dd26d5520f71f79b094963322ed25", size = 10861031 }, - { url = "https://files.pythonhosted.org/packages/82/68/da0db02f5ecb2ce912c2bef2aa9fcb8915c31e9bc363969cfaaddbc4c1c2/ruff-0.8.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91a7ddb221779871cf226100e677b5ea38c2d54e9e2c8ed847450ebbdf99b32d", size = 10388246 }, - { url = "https://files.pythonhosted.org/packages/ac/1d/b85383db181639019b50eb277c2ee48f9f5168f4f7c287376f2b6e2a6dc2/ruff-0.8.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:248b1fb3f739d01d528cc50b35ee9c4812aa58cc5935998e776bf8ed5b251e75", size = 11424693 }, - { url = "https://files.pythonhosted.org/packages/ac/b7/30bc78a37648d31bfc7ba7105b108cb9091cd925f249aa533038ebc5a96f/ruff-0.8.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:bc3c083c50390cf69e7e1b5a5a7303898966be973664ec0c4a4acea82c1d4315", size = 12141921 }, - { url = "https://files.pythonhosted.org/packages/60/b3/ee0a14cf6a1fbd6965b601c88d5625d250b97caf0534181e151504498f86/ruff-0.8.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52d587092ab8df308635762386f45f4638badb0866355b2b86760f6d3c076188", size = 11692419 }, - { url = "https://files.pythonhosted.org/packages/ef/d6/c597062b2931ba3e3861e80bd2b147ca12b3370afc3889af46f29209037f/ruff-0.8.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:61323159cf21bc3897674e5adb27cd9e7700bab6b84de40d7be28c3d46dc67cf", size = 12981648 }, - { url = "https://files.pythonhosted.org/packages/68/84/21f578c2a4144917985f1f4011171aeff94ab18dfa5303ac632da2f9af36/ruff-0.8.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ae4478b1471fc0c44ed52a6fb787e641a2ac58b1c1f91763bafbc2faddc5117", size = 11251801 }, - { url = "https://files.pythonhosted.org/packages/6c/aa/1ac02537c8edeb13e0955b5db86b5c050a1dcba54f6d49ab567decaa59c1/ruff-0.8.6-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:0c000a471d519b3e6cfc9c6680025d923b4ca140ce3e4612d1a2ef58e11f11fe", size = 10849857 }, - { url = "https://files.pythonhosted.org/packages/eb/00/020cb222252d833956cb3b07e0e40c9d4b984fbb2dc3923075c8f944497d/ruff-0.8.6-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:9257aa841e9e8d9b727423086f0fa9a86b6b420fbf4bf9e1465d1250ce8e4d8d", size = 10470852 }, - { url = "https://files.pythonhosted.org/packages/00/56/e6d6578202a0141cd52299fe5acb38b2d873565f4670c7a5373b637cf58d/ruff-0.8.6-py3-none-musllinux_1_2_i686.whl", hash = "sha256:45a56f61b24682f6f6709636949ae8cc82ae229d8d773b4c76c09ec83964a95a", size = 10972997 }, - { url = "https://files.pythonhosted.org/packages/be/31/dd0db1f4796bda30dea7592f106f3a67a8f00bcd3a50df889fbac58e2786/ruff-0.8.6-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:496dd38a53aa173481a7d8866bcd6451bd934d06976a2505028a50583e001b76", size = 11317760 }, - { url = "https://files.pythonhosted.org/packages/d4/70/cfcb693dc294e034c6fed837fa2ec98b27cc97a26db5d049345364f504bf/ruff-0.8.6-py3-none-win32.whl", hash = "sha256:e169ea1b9eae61c99b257dc83b9ee6c76f89042752cb2d83486a7d6e48e8f764", size = 8799729 }, - { url = "https://files.pythonhosted.org/packages/60/22/ae6bcaa0edc83af42751bd193138bfb7598b2990939d3e40494d6c00698c/ruff-0.8.6-py3-none-win_amd64.whl", hash = "sha256:f1d70bef3d16fdc897ee290d7d20da3cbe4e26349f62e8a0274e7a3f4ce7a905", size = 9673857 }, - { url = "https://files.pythonhosted.org/packages/91/f8/3765e053acd07baa055c96b2065c7fab91f911b3c076dfea71006666f5b0/ruff-0.8.6-py3-none-win_arm64.whl", hash = "sha256:7d7fc2377a04b6e04ffe588caad613d0c460eb2ecba4c0ccbbfe2bc973cbc162", size = 9149556 }, -] - -[[package]] -name = "send2trash" -version = "1.8.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf", size = 17394 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9", size = 18072 }, -] - -[[package]] -name = "setuptools" -version = "75.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ac/57/e6f0bde5a2c333a32fbcce201f906c1fd0b3a7144138712a5e9d9598c5ec/setuptools-75.7.0.tar.gz", hash = "sha256:886ff7b16cd342f1d1defc16fc98c9ce3fde69e087a4e1983d7ab634e5f41f4f", size = 1338616 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/6e/abdfaaf5c294c553e7a81cf5d801fbb4f53f5c5b6646de651f92a2667547/setuptools-75.7.0-py3-none-any.whl", hash = "sha256:84fb203f278ebcf5cd08f97d3fb96d3fbed4b629d500b29ad60d11e00769b183", size = 1224467 }, -] - -[[package]] -name = "six" -version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, -] - -[[package]] -name = "snowballstemmer" -version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, -] - -[[package]] -name = "soupsieve" -version = "2.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, -] - -[[package]] -name = "sourcery" -version = "1.28.0" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/ec/ca54e440acabd4737a5b0b5ea51bbebb2f226801e43c79ad2ebb305a22e4/sourcery-1.28.0-py2.py3-none-macosx_10_9_universal2.whl", hash = "sha256:ede0daff5ef75fc0a584f5c044c9bfa591905fa4ea6b7ec86210cdea149c6821", size = 90850628 }, - { url = "https://files.pythonhosted.org/packages/ff/3e/2156d7b3a9b82fec1f6b30a850a5c70f4448c7edd1b037f8d21a4d57f9b7/sourcery-1.28.0-py2.py3-none-manylinux1_x86_64.whl", hash = "sha256:b4a3c8d60ce1b912565082c33a1427a04b347d32bfeac0d706319cfff30706dd", size = 116086476 }, - { url = "https://files.pythonhosted.org/packages/21/b7/90afde2a62768e56cd46d3a884a5beecb1edc9a3b7da1117cb7ee2932b06/sourcery-1.28.0-py2.py3-none-win_amd64.whl", hash = "sha256:a1f22a15d1731f14c283ec24f66d1efb143fe26ecc78e22a98d4ce76c463a969", size = 89178129 }, -] - -[[package]] -name = "sphinx" -version = "8.1.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "alabaster" }, - { name = "babel" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "docutils" }, - { name = "imagesize" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pygments" }, - { name = "requests" }, - { name = "snowballstemmer" }, - { name = "sphinxcontrib-applehelp" }, - { name = "sphinxcontrib-devhelp" }, - { name = "sphinxcontrib-htmlhelp" }, - { name = "sphinxcontrib-jsmath" }, - { name = "sphinxcontrib-qthelp" }, - { name = "sphinxcontrib-serializinghtml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125 }, -] - -[[package]] -name = "sphinx-argparse-cli" -version = "1.19.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/32/5f/ae6043738a48408ce1371303958fa02943d29619dd5d202e147b1dc8552d/sphinx_argparse_cli-1.19.0.tar.gz", hash = "sha256:0374b23560fd4246234c0ef2d8bb97703088c8ae721bf63a84b9fd0d32f87a78", size = 12667 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/1f/7d40169591a70fb1a8ba57345e22c3f6dca5b06ee6efddafe5ccee91336c/sphinx_argparse_cli-1.19.0-py3-none-any.whl", hash = "sha256:c0e069deed1db44d289f90469c04320f1c2249b3dcbd3c3e093bf9a66e4bd8e4", size = 9941 }, -] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2f/37/725d06f80cbe85b8538021df4515b7408af231cbe8b201a3bb2cf773a83d/sphinx_autodoc_typehints-3.0.0.tar.gz", hash = "sha256:d5cdab471efb10fcff4ffe81a2ef713398bc891af9d942a4b763f5ed1d9bf550", size = 35943 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/36/110d38a8b481b915d77461ca68764ebacf7aeba84be7cbe2dc965a65ae80/sphinx_autodoc_typehints-3.0.0-py3-none-any.whl", hash = "sha256:b82bf83e23ae3d5dc25881004a6d6614be6291ff8ff165b2d1e18799f0f6bd74", size = 20041 }, -] - -[[package]] -name = "sphinx-basic-ng" -version = "1.0.0b2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, -] - -[[package]] -name = "sphinx-click" -version = "6.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "docutils" }, - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/db/0a/5b1e8d0579dbb4ca8114e456ca4a68020bfe8e15c7001f3856be4929ab83/sphinx_click-6.0.0.tar.gz", hash = "sha256:f5d664321dc0c6622ff019f1e1c84e58ce0cecfddeb510e004cf60c2a3ab465b", size = 29574 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/d7/8621c4726ad3f788a1db4c0c409044b16edc563f5c9542807b3724037555/sphinx_click-6.0.0-py3-none-any.whl", hash = "sha256:1e0a3c83bcb7c55497751b19d07ebe56b5d7b85eb76dd399cf9061b497adc317", size = 9922 }, -] - -[[package]] -name = "sphinxcontrib-applehelp" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, -] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, -] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, -] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, -] - -[[package]] -name = "sphinxcontrib-mermaid" -version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pyyaml" }, - { name = "sphinx" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/97/69/bf039237ad260073e8c02f820b3e00dc34f3a2de20aff7861e6b19d2f8c5/sphinxcontrib_mermaid-1.0.0.tar.gz", hash = "sha256:2e8ab67d3e1e2816663f9347d026a8dee4a858acdd4ad32dd1c808893db88146", size = 15153 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cd/c8/784b9ac6ea08aa594c1a4becbd0dbe77186785362e31fd633b8c6ae0197a/sphinxcontrib_mermaid-1.0.0-py3-none-any.whl", hash = "sha256:60b72710ea02087f212028feb09711225fbc2e343a10d34822fe787510e1caa3", size = 9597 }, -] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, -] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "2.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, -] - -[[package]] -name = "stack-data" -version = "0.6.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "asttokens" }, - { name = "executing" }, - { name = "pure-eval" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, -] - -[[package]] -name = "terminado" -version = "0.18.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ptyprocess", marker = "os_name != 'nt'" }, - { name = "pywinpty", marker = "os_name == 'nt'" }, - { name = "tornado" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e", size = 32701 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0", size = 14154 }, -] - -[[package]] -name = "tinycss2" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "webencodings" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7", size = 87085 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610 }, -] - -[[package]] -name = "tomli" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, - { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, - { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, - { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, - { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, - { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, - { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, - { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, - { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, - { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, - { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, - { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, - { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, - { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, - { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, - { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, - { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, - { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, - { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, - { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, - { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, - { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, -] - -[[package]] -name = "tornado" -version = "6.4.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, - { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, - { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, - { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, - { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, - { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, - { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, - { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, - { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, - { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, -] - -[[package]] -name = "trafficgen" -version = "0.6.0" -source = { editable = "." } -dependencies = [ - { name = "basemap" }, - { name = "basemap-data-hires" }, - { name = "dictio" }, - { name = "folium" }, - { name = "global-land-mask" }, - { name = "matplotlib" }, - { name = "numpy" }, -] - -[package.dev-dependencies] -dev = [ - { name = "click" }, - { name = "click-log" }, - { name = "furo" }, - { name = "jupyter" }, - { name = "mypy" }, - { name = "myst-parser" }, - { name = "pandas-stubs" }, - { name = "pre-commit" }, - { name = "pydantic" }, - { name = "pyright" }, - { name = "pytest" }, - { name = "pytest-cov" }, - { name = "ruff" }, - { name = "sourcery" }, - { name = "sphinx" }, - { name = "sphinx-argparse-cli" }, - { name = "sphinx-autodoc-typehints" }, - { name = "sphinx-click" }, - { name = "sphinxcontrib-mermaid" }, -] - -[package.metadata] -requires-dist = [ - { name = "basemap", specifier = ">=1.3.8" }, - { name = "basemap-data-hires", specifier = ">=1.3.2" }, - { name = "dictio", specifier = ">=0.4.0" }, - { name = "folium", specifier = ">=0.14.0" }, - { name = "global-land-mask", specifier = ">=1.0.0" }, - { name = "matplotlib", specifier = ">=3.7.2" }, - { name = "numpy", specifier = ">=1.25,<2.0" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "click", specifier = ">=8.1" }, - { name = "click-log", specifier = ">=0.4.0" }, - { name = "furo", specifier = ">=2024.8" }, - { name = "jupyter", specifier = ">=1.1" }, - { name = "mypy", specifier = ">=1.13" }, - { name = "myst-parser", specifier = ">=4.0" }, - { name = "pandas-stubs", specifier = ">=2.2" }, - { name = "pre-commit", specifier = ">=4.0" }, - { name = "pydantic", specifier = ">=2.5" }, - { name = "pyright", specifier = ">=1.1.390" }, - { name = "pytest", specifier = ">=8.3" }, - { name = "pytest-cov", specifier = ">=6.0" }, - { name = "ruff", specifier = ">=0.8.3" }, - { name = "sourcery", specifier = ">=1.27" }, - { name = "sphinx", specifier = ">=8.1" }, - { name = "sphinx-argparse-cli", specifier = ">=1.19" }, - { name = "sphinx-autodoc-typehints", specifier = ">=2.5" }, - { name = "sphinx-click", specifier = ">=6.0.0" }, - { name = "sphinxcontrib-mermaid", specifier = ">=1.0.0" }, -] - -[[package]] -name = "traitlets" -version = "5.14.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, -] - -[[package]] -name = "types-python-dateutil" -version = "2.9.0.20241206" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/60/47d92293d9bc521cd2301e423a358abfac0ad409b3a1606d8fbae1321961/types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb", size = 13802 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/b3/ca41df24db5eb99b00d97f89d7674a90cb6b3134c52fb8121b6d8d30f15c/types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53", size = 14384 }, -] - -[[package]] -name = "types-pytz" -version = "2024.2.0.20241221" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/26/516311b02b5a215e721155fb65db8a965d061372e388d6125ebce8d674b0/types_pytz-2024.2.0.20241221.tar.gz", hash = "sha256:06d7cde9613e9f7504766a0554a270c369434b50e00975b3a4a0f6eed0f2c1a9", size = 10213 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/74/db/c92ca6920cccd9c2998b013601542e2ac5e59bc805bcff94c94ad254b7df/types_pytz-2024.2.0.20241221-py3-none-any.whl", hash = "sha256:8fc03195329c43637ed4f593663df721fef919b60a969066e22606edf0b53ad5", size = 10008 }, -] - -[[package]] -name = "typing-extensions" -version = "4.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, -] - -[[package]] -name = "uri-template" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7", size = 21678 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363", size = 11140 }, -] - -[[package]] -name = "urllib3" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, -] - -[[package]] -name = "virtualenv" -version = "20.28.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "distlib" }, - { name = "filelock" }, - { name = "platformdirs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/50/39/689abee4adc85aad2af8174bb195a819d0be064bf55fcc73b49d2b28ae77/virtualenv-20.28.1.tar.gz", hash = "sha256:5d34ab240fdb5d21549b76f9e8ff3af28252f5499fb6d6f031adac4e5a8c5329", size = 7650532 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/8f/dfb257ca6b4e27cb990f1631142361e4712badab8e3ca8dc134d96111515/virtualenv-20.28.1-py3-none-any.whl", hash = "sha256:412773c85d4dab0409b83ec36f7a6499e72eaf08c80e81e9576bca61831c71cb", size = 4276719 }, -] - -[[package]] -name = "wcwidth" -version = "0.2.13" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, -] - -[[package]] -name = "webcolors" -version = "24.11.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7b/29/061ec845fb58521848f3739e466efd8250b4b7b98c1b6c5bf4d40b419b7e/webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6", size = 45064 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/e8/c0e05e4684d13459f93d312077a9a2efbe04d59c393bc2b8802248c908d4/webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9", size = 14934 }, -] - -[[package]] -name = "webencodings" -version = "0.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774 }, -] - -[[package]] -name = "websocket-client" -version = "1.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e6/30/fba0d96b4b5fbf5948ed3f4681f7da2f9f64512e1d303f94b4cc174c24a5/websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da", size = 54648 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826 }, -] - -[[package]] -name = "widgetsnbextension" -version = "4.0.13" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/56/fc/238c424fd7f4ebb25f8b1da9a934a3ad7c848286732ae04263661eb0fc03/widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6", size = 1164730 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/21/02/88b65cc394961a60c43c70517066b6b679738caf78506a5da7b88ffcb643/widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71", size = 2335872 }, -] - -[[package]] -name = "xyzservices" -version = "2024.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a0/16/ae87cbd2d6bfc40a419077521c35aadf5121725b7bee3d7c51b56f50958b/xyzservices-2024.9.0.tar.gz", hash = "sha256:68fb8353c9dbba4f1ff6c0f2e5e4e596bb9e1db7f94f4f7dfbcb26e25aa66fde", size = 1131900 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/d3/e07ce413d16ef64e885bea37551eac4c5ca3ddd440933f9c94594273d0d9/xyzservices-2024.9.0-py3-none-any.whl", hash = "sha256:776ae82b78d6e5ca63dd6a94abb054df8130887a4a308473b54a6bd364de8644", size = 85130 }, -] From c4e6d7666eca9c86422bd9899f8b4b7a73b281c3 Mon Sep 17 00:00:00 2001 From: Tom Arne Pedersen Date: Mon, 20 Jan 2025 13:32:05 +0100 Subject: [PATCH 23/23] Updating version number --- CITATION.cff | 2 +- docs/source/conf.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 3d16201..fa9e5fb 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -36,4 +36,4 @@ keywords: - Systematic assessment license: MIT url: 'https://github.com/dnv-opensource/ship-traffic-generator' -version: 0.6.0 +version: 0.7.0 diff --git a/docs/source/conf.py b/docs/source/conf.py index e7bb7ff..3cbf68d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -26,7 +26,7 @@ author = "Tom Arne Pedersen, Claas Rostock, Minos Hemrich" # The full version, including alpha/beta/rc tags -release = "0.6.0" +release = "0.7.0" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration