mirror of
https://github.com/infiniteCable2/opendbc.git
synced 2026-06-08 10:54:51 +08:00
Merge branch 'upstream/master' into sync-20260602
# Conflicts: # docs/CARS.md # opendbc/car/honda/values.py # opendbc/safety/modes/nissan.h # opendbc/safety/tests/libsafety/libsafety_py.py # opendbc/safety/tests/libsafety/safety.c # opendbc/safety/tests/test_gm.py # opendbc/safety/tests/test_tesla.py
This commit is contained in:
@@ -59,7 +59,7 @@ cd opendbc
|
|||||||
# here are the individual commands it runs
|
# here are the individual commands it runs
|
||||||
pip3 install -e .[testing,docs] # install dependencies
|
pip3 install -e .[testing,docs] # install dependencies
|
||||||
scons -j8 # build with 8 cores
|
scons -j8 # build with 8 cores
|
||||||
pytest . # run the tests
|
unittest-parallel # run the tests
|
||||||
lefthook run lint # run the linter
|
lefthook run lint # run the linter
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
12
docs/CARS.md
12
docs/CARS.md
@@ -1,6 +1,6 @@
|
|||||||
<!--- AUTOGENERATED FROM selfdrive/car/CARS_template.md, DO NOT EDIT. --->
|
<!--- AUTOGENERATED FROM selfdrive/car/CARS_template.md, DO NOT EDIT. --->
|
||||||
|
|
||||||
# Support Information for 417 Known Cars
|
# Support Information for 419 Known Cars
|
||||||
|
|
||||||
|Make|Model|Package|Support Level|
|
|Make|Model|Package|Support Level|
|
||||||
|---|---|---|:---:|
|
|---|---|---|:---:|
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
|Acura|RDX 2016-18|AcuraWatch Plus or Advance Package|[Upstream](#upstream)|
|
|Acura|RDX 2016-18|AcuraWatch Plus or Advance Package|[Upstream](#upstream)|
|
||||||
|Acura|RDX 2019-21|All|[Upstream](#upstream)|
|
|Acura|RDX 2019-21|All|[Upstream](#upstream)|
|
||||||
|Acura|RDX 2022-24|All|[Dashcam mode](#dashcam)|
|
|Acura|RDX 2022-24|All|[Dashcam mode](#dashcam)|
|
||||||
|Acura|RDX 2025|All|[Community](#community)|
|
|Acura|RDX 2025-26|All|[Community](#community)|
|
||||||
|Acura|RLX 2017|Advance Package or Technology Package|[Community](#community)|
|
|Acura|RLX 2017|Advance Package or Technology Package|[Community](#community)|
|
||||||
|Acura|TLX 2015-17|Advance Package|[Community](#community)|
|
|Acura|TLX 2015-17|Advance Package|[Community](#community)|
|
||||||
|Acura|TLX 2018-20|All|[Community](#community)|
|
|Acura|TLX 2018-20|All|[Community](#community)|
|
||||||
@@ -69,8 +69,8 @@
|
|||||||
|Ford|Explorer Hybrid 2020-24|Co-Pilot360 Assist+|[Upstream](#upstream)|
|
|Ford|Explorer Hybrid 2020-24|Co-Pilot360 Assist+|[Upstream](#upstream)|
|
||||||
|Ford|F-150 2021-23|Co-Pilot360 Assist 2.0|[Upstream](#upstream)|
|
|Ford|F-150 2021-23|Co-Pilot360 Assist 2.0|[Upstream](#upstream)|
|
||||||
|Ford|F-150 Hybrid 2021-23|Co-Pilot360 Assist 2.0|[Upstream](#upstream)|
|
|Ford|F-150 Hybrid 2021-23|Co-Pilot360 Assist 2.0|[Upstream](#upstream)|
|
||||||
|Ford|Focus 2018|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)|
|
|Ford|Focus 2018-22|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)|
|
||||||
|Ford|Focus Hybrid 2018|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)|
|
|Ford|Focus Hybrid 2018-22|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)|
|
||||||
|Ford|Kuga 2020-23|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)|
|
|Ford|Kuga 2020-23|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)|
|
||||||
|Ford|Kuga Hybrid 2020-23|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)|
|
|Ford|Kuga Hybrid 2020-23|Adaptive Cruise Control with Lane Centering|[Upstream](#upstream)|
|
||||||
|Ford|Kuga Hybrid 2024|All|[Upstream](#upstream)|
|
|Ford|Kuga Hybrid 2024|All|[Upstream](#upstream)|
|
||||||
@@ -138,6 +138,7 @@
|
|||||||
|Honda|Passport 2026|All|[Upstream](#upstream)|
|
|Honda|Passport 2026|All|[Upstream](#upstream)|
|
||||||
|Honda|Pilot 2016-22|Honda Sensing|[Upstream](#upstream)|
|
|Honda|Pilot 2016-22|Honda Sensing|[Upstream](#upstream)|
|
||||||
|Honda|Pilot 2023-25|All|[Upstream](#upstream)|
|
|Honda|Pilot 2023-25|All|[Upstream](#upstream)|
|
||||||
|
|Honda|Pilot 2026|All|[Community](#community)|
|
||||||
|Honda|Prologue 2024-25|All|[Not compatible](#can-bus-security)|
|
|Honda|Prologue 2024-25|All|[Not compatible](#can-bus-security)|
|
||||||
|Honda|Ridgeline 2017-25|Honda Sensing|[Upstream](#upstream)|
|
|Honda|Ridgeline 2017-25|Honda Sensing|[Upstream](#upstream)|
|
||||||
|Hyundai|Azera 2022|All|[Upstream](#upstream)|
|
|Hyundai|Azera 2022|All|[Upstream](#upstream)|
|
||||||
@@ -157,6 +158,7 @@
|
|||||||
|Hyundai|Ioniq 5 (with HDA II) 2022-24|Highway Driving Assist II|[Upstream](#upstream)|
|
|Hyundai|Ioniq 5 (with HDA II) 2022-24|Highway Driving Assist II|[Upstream](#upstream)|
|
||||||
|Hyundai|Ioniq 5 (without HDA II) 2022-24|Highway Driving Assist|[Upstream](#upstream)|
|
|Hyundai|Ioniq 5 (without HDA II) 2022-24|Highway Driving Assist|[Upstream](#upstream)|
|
||||||
|Hyundai|Ioniq 6 (with HDA II) 2023-24|Highway Driving Assist II|[Upstream](#upstream)|
|
|Hyundai|Ioniq 6 (with HDA II) 2023-24|Highway Driving Assist II|[Upstream](#upstream)|
|
||||||
|
|Hyundai|Ioniq 6 (without HDA II) 2023-24|Highway Driving Assist|[Upstream](#upstream)|
|
||||||
|Hyundai|Ioniq Electric 2019|Smart Cruise Control (SCC)|[Upstream](#upstream)|
|
|Hyundai|Ioniq Electric 2019|Smart Cruise Control (SCC)|[Upstream](#upstream)|
|
||||||
|Hyundai|Ioniq Electric 2020|All|[Upstream](#upstream)|
|
|Hyundai|Ioniq Electric 2020|All|[Upstream](#upstream)|
|
||||||
|Hyundai|Ioniq Hybrid 2017-19|Smart Cruise Control (SCC)|[Upstream](#upstream)|
|
|Hyundai|Ioniq Hybrid 2017-19|Smart Cruise Control (SCC)|[Upstream](#upstream)|
|
||||||
@@ -273,7 +275,7 @@
|
|||||||
|Mazda|CX-5 2022-25|All|[Upstream](#upstream)|
|
|Mazda|CX-5 2022-25|All|[Upstream](#upstream)|
|
||||||
|Mazda|CX-9 2016-20|All|[Dashcam mode](#dashcam)|
|
|Mazda|CX-9 2016-20|All|[Dashcam mode](#dashcam)|
|
||||||
|Mazda|CX-9 2021-23|All|[Upstream](#upstream)|
|
|Mazda|CX-9 2021-23|All|[Upstream](#upstream)|
|
||||||
|Nissan|Altima 2019-20, 2024|ProPILOT Assist|[Upstream](#upstream)|
|
|Nissan|Altima 2019-24|ProPILOT Assist|[Upstream](#upstream)|
|
||||||
|Nissan|Leaf 2018-23|ProPILOT Assist|[Upstream](#upstream)|
|
|Nissan|Leaf 2018-23|ProPILOT Assist|[Upstream](#upstream)|
|
||||||
|Nissan|Rogue 2018-20|ProPILOT Assist|[Upstream](#upstream)|
|
|Nissan|Rogue 2018-20|ProPILOT Assist|[Upstream](#upstream)|
|
||||||
|Nissan|X-Trail 2017|ProPILOT Assist|[Upstream](#upstream)|
|
|Nissan|X-Trail 2017|ProPILOT Assist|[Upstream](#upstream)|
|
||||||
|
|||||||
@@ -176,8 +176,6 @@ struct CarState {
|
|||||||
|
|
||||||
gasPressed @4 :Bool; # this is user pedal only
|
gasPressed @4 :Bool; # this is user pedal only
|
||||||
|
|
||||||
# brake pedal, 0.0-1.0
|
|
||||||
brake @5 :Float32; # this is user pedal only
|
|
||||||
brakePressed @6 :Bool; # this is user pedal only
|
brakePressed @6 :Bool; # this is user pedal only
|
||||||
regenBraking @45 :Bool; # this is user pedal only
|
regenBraking @45 :Bool; # this is user pedal only
|
||||||
parkingBrake @39 :Bool;
|
parkingBrake @39 :Bool;
|
||||||
@@ -285,7 +283,8 @@ struct CarState {
|
|||||||
|
|
||||||
# deprecated
|
# deprecated
|
||||||
errorsDEPRECATED @0 :List(OnroadEventDEPRECATED.EventName);
|
errorsDEPRECATED @0 :List(OnroadEventDEPRECATED.EventName);
|
||||||
gasDEPRECATED @3 :Float32; # this is user pedal only
|
gasDEPRECATED @3 :Float32;
|
||||||
|
brakeDEPRECATED @5 :Float32;
|
||||||
brakeLightsDEPRECATED @19 :Bool;
|
brakeLightsDEPRECATED @19 :Bool;
|
||||||
steeringRateLimitedDEPRECATED @29 :Bool;
|
steeringRateLimitedDEPRECATED @29 :Bool;
|
||||||
canMonoTimesDEPRECATED @12: List(UInt64);
|
canMonoTimesDEPRECATED @12: List(UInt64);
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ class CarState(CarStateBase, MadsCarState, CarStateExt):
|
|||||||
ret.seatbeltUnlatched = cp.vl["ORC_1"]["SEATBELT_DRIVER_UNLATCHED"] == 1
|
ret.seatbeltUnlatched = cp.vl["ORC_1"]["SEATBELT_DRIVER_UNLATCHED"] == 1
|
||||||
|
|
||||||
# brake pedal
|
# brake pedal
|
||||||
ret.brake = 0
|
|
||||||
ret.brakePressed = cp.vl["ESP_1"]['Brake_Pedal_State'] == 1 # Physical brake pedal switch
|
ret.brakePressed = cp.vl["ESP_1"]['Brake_Pedal_State'] == 1 # Physical brake pedal switch
|
||||||
|
|
||||||
# gas pedal
|
# gas pedal
|
||||||
@@ -126,7 +125,6 @@ class CarState(CarStateBase, MadsCarState, CarStateExt):
|
|||||||
ret.seatbeltUnlatched = bool(cp.vl["SEATBELT_STATUS"]["SEATBELT_DRIVER_UNLATCHED"])
|
ret.seatbeltUnlatched = bool(cp.vl["SEATBELT_STATUS"]["SEATBELT_DRIVER_UNLATCHED"])
|
||||||
|
|
||||||
ret.brakePressed = bool(cp.vl["BRAKE_3"]["DRIVER_BRAKE_SWITCH"])
|
ret.brakePressed = bool(cp.vl["BRAKE_3"]["DRIVER_BRAKE_SWITCH"])
|
||||||
ret.brake = cp.vl["BRAKE_1"]["DRIVER_BRAKE_PRESSURE"]
|
|
||||||
ret.gasPressed = cp.vl["ACCEL_GAS"]["GAS_HUMAN"] > 0
|
ret.gasPressed = cp.vl["ACCEL_GAS"]["GAS_HUMAN"] > 0
|
||||||
|
|
||||||
ret.espDisabled = bool(cp.vl["TRACTION_BUTTON"]["TRACTION_OFF"])
|
ret.espDisabled = bool(cp.vl["TRACTION_BUTTON"]["TRACTION_OFF"])
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class CAR(Platforms):
|
|||||||
CommunityCarDocs("Acura MDX 2015-16", "Advance Package"),
|
CommunityCarDocs("Acura MDX 2015-16", "Advance Package"),
|
||||||
CommunityCarDocs("Acura MDX 2017-20"),
|
CommunityCarDocs("Acura MDX 2017-20"),
|
||||||
CommunityCarDocs("Acura MDX Hybrid 2017-20"),
|
CommunityCarDocs("Acura MDX Hybrid 2017-20"),
|
||||||
CommunityCarDocs("Acura RDX 2025"),
|
CommunityCarDocs("Acura RDX 2025-26"),
|
||||||
CommunityCarDocs("Acura RLX 2017", "Advance Package or Technology Package"),
|
CommunityCarDocs("Acura RLX 2017", "Advance Package or Technology Package"),
|
||||||
CommunityCarDocs("Acura TLX 2015-17", "Advance Package"),
|
CommunityCarDocs("Acura TLX 2015-17", "Advance Package"),
|
||||||
CommunityCarDocs("Acura TLX 2018-20"),
|
CommunityCarDocs("Acura TLX 2018-20"),
|
||||||
@@ -51,6 +51,7 @@ class CAR(Platforms):
|
|||||||
CommunityCarDocs("Honda Accord 2016-17", "Honda Sensing"),
|
CommunityCarDocs("Honda Accord 2016-17", "Honda Sensing"),
|
||||||
CommunityCarDocs("Honda Accord Hybrid 2017"),
|
CommunityCarDocs("Honda Accord Hybrid 2017"),
|
||||||
CommunityCarDocs("Honda Clarity 2018-21"),
|
CommunityCarDocs("Honda Clarity 2018-21"),
|
||||||
|
CommunityCarDocs("Honda Pilot 2026"),
|
||||||
GMSecurityCarDocs("Honda Prologue 2024-25"),
|
GMSecurityCarDocs("Honda Prologue 2024-25"),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import math
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
from opendbc.can import CANPacker
|
from opendbc.can import CANPacker
|
||||||
from opendbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, DT_CTRL, apply_hysteresis, structs
|
from opendbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, DT_CTRL, apply_hysteresis, structs
|
||||||
from opendbc.car.lateral import ISO_LATERAL_ACCEL, apply_std_steer_angle_limits
|
from opendbc.car.lateral import AVERAGE_ROAD_ROLL, ISO_LATERAL_ACCEL, apply_std_steer_angle_limits
|
||||||
from opendbc.car.ford import fordcan
|
from opendbc.car.ford import fordcan
|
||||||
from opendbc.car.ford.values import CarControllerParams, FordFlags, CAR
|
from opendbc.car.ford.values import CarControllerParams, FordFlags, CAR
|
||||||
from opendbc.car.interfaces import CarControllerBase, V_CRUISE_MAX
|
from opendbc.car.interfaces import CarControllerBase, V_CRUISE_MAX
|
||||||
@@ -11,8 +11,7 @@ LongCtrlState = structs.CarControl.Actuators.LongControlState
|
|||||||
VisualAlert = structs.CarControl.HUDControl.VisualAlert
|
VisualAlert = structs.CarControl.HUDControl.VisualAlert
|
||||||
|
|
||||||
# CAN FD limits:
|
# CAN FD limits:
|
||||||
# Limit to average banked road since safety doesn't have the roll
|
# Limit to average banked road since safety doesn't have the roll, higher actual roll lowers lateral acceleration
|
||||||
AVERAGE_ROAD_ROLL = 0.06 # ~3.4 degrees, 6% superelevation. higher actual roll raises lateral acceleration
|
|
||||||
MAX_LATERAL_ACCEL = ISO_LATERAL_ACCEL - (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL) # ~2.4 m/s^2
|
MAX_LATERAL_ACCEL = ISO_LATERAL_ACCEL - (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL) # ~2.4 m/s^2
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,6 @@ class CarState(CarStateBase, MadsCarState):
|
|||||||
ret.gasPressed = cp.vl["EngVehicleSpThrottle"]["ApedPos_Pc_ActlArb"] / 100. > 1e-6
|
ret.gasPressed = cp.vl["EngVehicleSpThrottle"]["ApedPos_Pc_ActlArb"] / 100. > 1e-6
|
||||||
|
|
||||||
# brake pedal
|
# brake pedal
|
||||||
ret.brake = cp.vl["BrakeSnData_4"]["BrkTot_Tq_Actl"] / 32756. # torque in Nm
|
|
||||||
ret.brakePressed = cp.vl["EngBrakeData"]["BpedDrvAppl_D_Actl"] == 2
|
ret.brakePressed = cp.vl["EngBrakeData"]["BpedDrvAppl_D_Actl"] == 2
|
||||||
ret.parkingBrake = cp.vl["DesiredTorqBrk"]["PrkBrkStatus"] in (1, 2)
|
ret.parkingBrake = cp.vl["DesiredTorqBrk"]["PrkBrkStatus"] in (1, 2)
|
||||||
|
|
||||||
|
|||||||
@@ -174,15 +174,19 @@ FW_VERSIONS = {
|
|||||||
CAR.FORD_FOCUS_MK4: {
|
CAR.FORD_FOCUS_MK4: {
|
||||||
(Ecu.eps, 0x730, None): [
|
(Ecu.eps, 0x730, None): [
|
||||||
b'JX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'JX6C-14D003-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
|
b'NX6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
],
|
],
|
||||||
(Ecu.abs, 0x760, None): [
|
(Ecu.abs, 0x760, None): [
|
||||||
b'JX61-2D053-CJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'JX61-2D053-CJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
|
b'LX61-2D053-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
],
|
],
|
||||||
(Ecu.fwdRadar, 0x764, None): [
|
(Ecu.fwdRadar, 0x764, None): [
|
||||||
b'JX7T-14D049-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'JX7T-14D049-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
|
b'JX7T-14D049-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
],
|
],
|
||||||
(Ecu.fwdCamera, 0x706, None): [
|
(Ecu.fwdCamera, 0x706, None): [
|
||||||
b'JX7T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'JX7T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
|
b'N1BT-14F397-AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
CAR.FORD_MAVERICK_MK1: {
|
CAR.FORD_MAVERICK_MK1: {
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ class CAR(Platforms):
|
|||||||
CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9),
|
CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9),
|
||||||
)
|
)
|
||||||
FORD_FOCUS_MK4 = FordPlatformConfig(
|
FORD_FOCUS_MK4 = FordPlatformConfig(
|
||||||
[FordCarDocs("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS], hybrid=True)], # mHEV only
|
[FordCarDocs("Ford Focus 2018-22", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS], hybrid=True)], # mHEV only
|
||||||
CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0),
|
CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0),
|
||||||
)
|
)
|
||||||
FORD_MAVERICK_MK1 = FordPlatformConfig(
|
FORD_MAVERICK_MK1 = FordPlatformConfig(
|
||||||
|
|||||||
@@ -87,7 +87,6 @@ class CarState(CarStateBase, CarStateExt):
|
|||||||
else:
|
else:
|
||||||
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["ECMPRDNL2"]["PRNDL2"], None))
|
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(pt_cp.vl["ECMPRDNL2"]["PRNDL2"], None))
|
||||||
|
|
||||||
ret.brake = pt_cp.vl["ECMAcceleratorPos"]["BrakePedalPos"]
|
|
||||||
if self.CP.networkLocation == NetworkLocation.fwdCamera:
|
if self.CP.networkLocation == NetworkLocation.fwdCamera:
|
||||||
ret.brakePressed = pt_cp.vl["ECMEngineStatus"]["BrakePressed"] != 0
|
ret.brakePressed = pt_cp.vl["ECMEngineStatus"]["BrakePressed"] != 0
|
||||||
else:
|
else:
|
||||||
@@ -95,7 +94,7 @@ class CarState(CarStateBase, CarStateExt):
|
|||||||
# that the brake is being intermittently pressed without user interaction.
|
# that the brake is being intermittently pressed without user interaction.
|
||||||
# To avoid a cruise fault we need to use a conservative brake position threshold
|
# To avoid a cruise fault we need to use a conservative brake position threshold
|
||||||
# https://static.nhtsa.gov/odi/tsbs/2017/MC-10137629-9999.pdf
|
# https://static.nhtsa.gov/odi/tsbs/2017/MC-10137629-9999.pdf
|
||||||
ret.brakePressed = ret.brake >= 8
|
ret.brakePressed = pt_cp.vl["ECMAcceleratorPos"]["BrakePedalPos"] >= 8
|
||||||
|
|
||||||
# Regen braking is braking
|
# Regen braking is braking
|
||||||
if self.CP.transmissionType == TransmissionType.direct:
|
if self.CP.transmissionType == TransmissionType.direct:
|
||||||
|
|||||||
@@ -198,15 +198,9 @@ class CarState(CarStateBase, CarStateExt):
|
|||||||
self.brake_switch_prev = brake_switch
|
self.brake_switch_prev = brake_switch
|
||||||
ret.brakePressed = (cp.vl["POWERTRAIN_DATA"]["BRAKE_PRESSED"] != 0) or self.brake_switch_active
|
ret.brakePressed = (cp.vl["POWERTRAIN_DATA"]["BRAKE_PRESSED"] != 0) or self.brake_switch_active
|
||||||
|
|
||||||
ret.brake = cp.vl["VSA_STATUS"]["USER_BRAKE"]
|
|
||||||
ret.cruiseState.enabled = cp.vl["POWERTRAIN_DATA"]["ACC_STATUS"] != 0
|
ret.cruiseState.enabled = cp.vl["POWERTRAIN_DATA"]["ACC_STATUS"] != 0
|
||||||
ret.cruiseState.available = bool(cp.vl[self.car_state_scm_msg]["MAIN_ON"])
|
ret.cruiseState.available = bool(cp.vl[self.car_state_scm_msg]["MAIN_ON"])
|
||||||
|
|
||||||
# Gets rid of Pedal Grinding noise when brake is pressed at slow speeds for some models
|
|
||||||
if self.CP.carFingerprint in (CAR.HONDA_PILOT, CAR.HONDA_RIDGELINE):
|
|
||||||
if ret.brake > 0.1:
|
|
||||||
ret.brakePressed = True
|
|
||||||
|
|
||||||
if self.CP.carFingerprint in HONDA_BOSCH:
|
if self.CP.carFingerprint in HONDA_BOSCH:
|
||||||
# TODO: find the radarless AEB_STATUS bit and make sure ACCEL_COMMAND is correct to enable AEB alerts
|
# TODO: find the radarless AEB_STATUS bit and make sure ACCEL_COMMAND is correct to enable AEB alerts
|
||||||
if self.CP.carFingerprint not in HONDA_BOSCH_RADARLESS:
|
if self.CP.carFingerprint not in HONDA_BOSCH_RADARLESS:
|
||||||
|
|||||||
@@ -111,6 +111,9 @@ class HondaCarDocs(CarDocs):
|
|||||||
|
|
||||||
self.car_parts = CarParts.common([harness])
|
self.car_parts = CarParts.common([harness])
|
||||||
|
|
||||||
|
if CP.alphaLongitudinalAvailable:
|
||||||
|
self.footnotes.append(Footnote.HONDA_ALPHALONG)
|
||||||
|
|
||||||
if CP.carFingerprint in (CAR.HONDA_CLARITY,):
|
if CP.carFingerprint in (CAR.HONDA_CLARITY,):
|
||||||
self.car_parts = CarParts.common([CarHarness.honda_clarity])
|
self.car_parts = CarParts.common([CarHarness.honda_clarity])
|
||||||
self.car_parts.custom_parts_url = "https://shop.retropilot.org/product/honda-clarity-proxy-board-kit"
|
self.car_parts.custom_parts_url = "https://shop.retropilot.org/product/honda-clarity-proxy-board-kit"
|
||||||
@@ -122,6 +125,9 @@ class Footnote(Enum):
|
|||||||
CIVIC_DIESEL = CarFootnote(
|
CIVIC_DIESEL = CarFootnote(
|
||||||
"2019 Honda Civic 1.6L Diesel Sedan does not have ALC below 12mph.",
|
"2019 Honda Civic 1.6L Diesel Sedan does not have ALC below 12mph.",
|
||||||
Column.FSR_STEERING)
|
Column.FSR_STEERING)
|
||||||
|
HONDA_ALPHALONG = CarFootnote(
|
||||||
|
"Enabling longitudinal control (alpha) will disable all CMBS functionality, including AEB and FCW.",
|
||||||
|
Column.LONGITUDINAL)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|||||||
@@ -139,8 +139,6 @@ class CarState(CarStateBase, EsccCarStateBase, MadsCarState, CarStateExt):
|
|||||||
ret.cruiseState.nonAdaptive = cp_cruise.vl["SCC11"]["SCCInfoDisplay"] == 2. # Shows 'Cruise Control' on dash
|
ret.cruiseState.nonAdaptive = cp_cruise.vl["SCC11"]["SCCInfoDisplay"] == 2. # Shows 'Cruise Control' on dash
|
||||||
ret.cruiseState.speed = cp_cruise.vl["SCC11"]["VSetDis"] * speed_conv
|
ret.cruiseState.speed = cp_cruise.vl["SCC11"]["VSetDis"] * speed_conv
|
||||||
|
|
||||||
# TODO: Find brake pressure
|
|
||||||
ret.brake = 0
|
|
||||||
ret.brakePressed = cp.vl["TCS13"]["DriverOverride"] == 2 # 2 includes regen braking by user on HEV/EV
|
ret.brakePressed = cp.vl["TCS13"]["DriverOverride"] == 2 # 2 includes regen braking by user on HEV/EV
|
||||||
ret.brakeHoldActive = cp.vl["TCS15"]["AVH_LAMP"] == 2 # 0 OFF, 1 ERROR, 2 ACTIVE, 3 READY
|
ret.brakeHoldActive = cp.vl["TCS15"]["AVH_LAMP"] == 2 # 0 OFF, 1 ERROR, 2 ACTIVE, 3 READY
|
||||||
ret.parkingBrake = cp.vl["TCS13"]["PBRAKE_ACT"] == 1
|
ret.parkingBrake = cp.vl["TCS13"]["PBRAKE_ACT"] == 1
|
||||||
|
|||||||
@@ -769,6 +769,7 @@ FW_VERSIONS = {
|
|||||||
b'\xf1\x00SG2EMFC AT USA LHD 1.00 1.00 99211-AT100 230216',
|
b'\xf1\x00SG2EMFC AT USA LHD 1.00 1.00 99211-AT100 230216',
|
||||||
b'\xf1\x00SG2EMFC AT USA LHD 1.00 1.00 99211-AT200 240401',
|
b'\xf1\x00SG2EMFC AT USA LHD 1.00 1.00 99211-AT200 240401',
|
||||||
b'\xf1\x00SG2EMFC AT USA LHD 1.01 1.09 99211-AT000 220801',
|
b'\xf1\x00SG2EMFC AT USA LHD 1.01 1.09 99211-AT000 220801',
|
||||||
|
b'\xf1\x00SG2EMFC AT EUR LHD 1.01 1.10 99211-AT000 230417',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
CAR.KIA_NIRO_PHEV: {
|
CAR.KIA_NIRO_PHEV: {
|
||||||
@@ -1079,6 +1080,7 @@ FW_VERSIONS = {
|
|||||||
b'\xf1\x00CE MFC AT EUR LHD 1.00 1.04 99211-KL000 221213',
|
b'\xf1\x00CE MFC AT EUR LHD 1.00 1.04 99211-KL000 221213',
|
||||||
b'\xf1\x00CE MFC AT USA LHD 1.00 1.04 99211-KL000 221213',
|
b'\xf1\x00CE MFC AT USA LHD 1.00 1.04 99211-KL000 221213',
|
||||||
b'\xf1\x00CE MFC AT USA LHD 1.00 1.06 99211-KL000 230915',
|
b'\xf1\x00CE MFC AT USA LHD 1.00 1.06 99211-KL000 230915',
|
||||||
|
b'\xf1\x00CE MFC AT CAN LHD 1.00 1.06 99211-KL000 230915',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
CAR.HYUNDAI_TUCSON_4TH_GEN: {
|
CAR.HYUNDAI_TUCSON_4TH_GEN: {
|
||||||
|
|||||||
@@ -164,11 +164,11 @@ class HyundaiNonSccCarDocs(CarDocs):
|
|||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class HyundaiPlatformConfig(PlatformConfig):
|
class HyundaiPlatformConfig(PlatformConfig):
|
||||||
dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_kia_generic"})
|
dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_can_generated"})
|
||||||
|
|
||||||
def init(self):
|
def init(self):
|
||||||
if self.flags & HyundaiFlags.MANDO_RADAR:
|
if self.flags & HyundaiFlags.MANDO_RADAR:
|
||||||
self.dbc_dict = {Bus.pt: "hyundai_kia_generic", Bus.radar: 'hyundai_kia_mando_front_radar_generated'}
|
self.dbc_dict = {Bus.pt: "hyundai_can_generated", Bus.radar: 'hyundai_kia_mando_front_radar_generated'}
|
||||||
|
|
||||||
if self.flags & HyundaiFlags.MIN_STEER_32_MPH:
|
if self.flags & HyundaiFlags.MIN_STEER_32_MPH:
|
||||||
self.specs = self.specs.override(minSteerSpeed=32 * CV.MPH_TO_MS)
|
self.specs = self.specs.override(minSteerSpeed=32 * CV.MPH_TO_MS)
|
||||||
@@ -176,7 +176,7 @@ class HyundaiPlatformConfig(PlatformConfig):
|
|||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class HyundaiNonSccPlatformConfig(PlatformConfig):
|
class HyundaiNonSccPlatformConfig(PlatformConfig):
|
||||||
dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_kia_generic"})
|
dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: "hyundai_can_generated"})
|
||||||
|
|
||||||
def init(self):
|
def init(self):
|
||||||
self.sp_flags |= HyundaiFlagsSP.NON_SCC
|
self.sp_flags |= HyundaiFlagsSP.NON_SCC
|
||||||
@@ -384,7 +384,10 @@ class CAR(Platforms):
|
|||||||
flags=HyundaiFlags.EV,
|
flags=HyundaiFlags.EV,
|
||||||
)
|
)
|
||||||
HYUNDAI_IONIQ_6 = HyundaiCanFDPlatformConfig(
|
HYUNDAI_IONIQ_6 = HyundaiCanFDPlatformConfig(
|
||||||
[HyundaiCarDocs("Hyundai Ioniq 6 (with HDA II) 2023-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p]))],
|
[
|
||||||
|
HyundaiCarDocs("Hyundai Ioniq 6 (without HDA II) 2023-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])),
|
||||||
|
HyundaiCarDocs("Hyundai Ioniq 6 (with HDA II) 2023-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p])),
|
||||||
|
],
|
||||||
HYUNDAI_IONIQ_5.specs,
|
HYUNDAI_IONIQ_5.specs,
|
||||||
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE,
|
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,26 +1,39 @@
|
|||||||
import math
|
import math
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from opendbc.car import structs, rate_limit, DT_CTRL
|
from opendbc.car import structs, rate_limit, DT_CTRL, ACCELERATION_DUE_TO_GRAVITY
|
||||||
from opendbc.car.vehicle_model import VehicleModel
|
from opendbc.car.vehicle_model import VehicleModel
|
||||||
|
|
||||||
FRICTION_THRESHOLD = 0.2
|
FRICTION_THRESHOLD = 0.2
|
||||||
|
|
||||||
# ISO 11270
|
# - ISO 11270
|
||||||
ISO_LATERAL_ACCEL = 3.0 # m/s^2
|
ISO_LATERAL_ACCEL = 3.0 # m/s^2
|
||||||
ISO_LATERAL_JERK = 5.0 # m/s^3
|
ISO_LATERAL_JERK = 5.0 # m/s^3
|
||||||
|
|
||||||
|
# - Common angle safety limits
|
||||||
|
AVERAGE_ROAD_ROLL = 0.06 # ~3.4 degrees, 6% superelevation. higher actual roll lowers lateral acceleration
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: deprecate in favor of vehicle-model-based limiting
|
||||||
|
# (need to solve cars having different steering ratios, etc.)
|
||||||
@dataclass
|
@dataclass
|
||||||
class AngleSteeringLimits:
|
class AngleSteeringLimits:
|
||||||
# v1 limits (using apply_std_steer_angle_limits)
|
# uses apply_std_steer_angle_limits
|
||||||
STEER_ANGLE_MAX: float
|
STEER_ANGLE_MAX: float
|
||||||
ANGLE_RATE_LIMIT_UP: tuple[list[float], list[float]]
|
ANGLE_RATE_LIMIT_UP: tuple[list[float], list[float]]
|
||||||
ANGLE_RATE_LIMIT_DOWN: tuple[list[float], list[float]]
|
ANGLE_RATE_LIMIT_DOWN: tuple[list[float], list[float]]
|
||||||
|
|
||||||
# v2 vehicle model limits (using apply_steer_angle_limits_vm)
|
|
||||||
MAX_LATERAL_ACCEL: float = 0
|
@dataclass
|
||||||
MAX_LATERAL_JERK: float = 0
|
class AngleSteeringLimitsVM:
|
||||||
|
# uses apply_steer_angle_limits_vm
|
||||||
|
# Max accepted by the EPS
|
||||||
|
STEER_ANGLE_MAX: float
|
||||||
|
# Add extra tolerance for average banked road since safety doesn't have the roll
|
||||||
|
MAX_LATERAL_ACCEL: float = ISO_LATERAL_ACCEL + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL) # ~3.6 m/s^2
|
||||||
|
# Lower than ISO 11270 lateral jerk limit (5.0 m/s^3) with bank tolerance, matches safety MAX_LATERAL_JERK
|
||||||
|
MAX_LATERAL_JERK: float = 3.0 + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL) # ~3.6 m/s^3
|
||||||
|
# Used for comfort or to prevent faults at low speed
|
||||||
MAX_ANGLE_RATE: float = math.inf
|
MAX_ANGLE_RATE: float = math.inf
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -56,9 +56,7 @@ class CarState(CarStateBase):
|
|||||||
ret.steeringTorqueEps = cp.vl["STEER_TORQUE"]["STEER_TORQUE_MOTOR"]
|
ret.steeringTorqueEps = cp.vl["STEER_TORQUE"]["STEER_TORQUE_MOTOR"]
|
||||||
ret.steeringRateDeg = cp.vl["STEER_RATE"]["STEER_ANGLE_RATE"]
|
ret.steeringRateDeg = cp.vl["STEER_RATE"]["STEER_ANGLE_RATE"]
|
||||||
|
|
||||||
# TODO: this should be from 0 - 1.
|
|
||||||
ret.brakePressed = cp.vl["PEDALS"]["BRAKE_ON"] == 1
|
ret.brakePressed = cp.vl["PEDALS"]["BRAKE_ON"] == 1
|
||||||
ret.brake = cp.vl["BRAKE"]["BRAKE_PRESSURE"]
|
|
||||||
|
|
||||||
ret.seatbeltUnlatched = cp.vl["SEATBELT"]["DRIVER_SEATBELT"] == 0
|
ret.seatbeltUnlatched = cp.vl["SEATBELT"]["DRIVER_SEATBELT"] == 0
|
||||||
ret.doorOpen = any([cp.vl["DOORS"]["FL"], cp.vl["DOORS"]["FR"],
|
ret.doorOpen = any([cp.vl["DOORS"]["FL"], cp.vl["DOORS"]["FR"],
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ FW_VERSIONS = {
|
|||||||
],
|
],
|
||||||
(Ecu.engine, 0x7e0, None): [
|
(Ecu.engine, 0x7e0, None): [
|
||||||
b'PEW5-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'PEW5-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
|
b'PF10-188K2-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
b'PGK4-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'PGK4-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
b'PW67-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'PW67-188K2-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
b'PW67-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'PW67-188K2-E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
@@ -46,6 +47,7 @@ FW_VERSIONS = {
|
|||||||
(Ecu.transmission, 0x7e1, None): [
|
(Ecu.transmission, 0x7e1, None): [
|
||||||
b'PG69-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'PG69-21PS1-A\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
b'PG69-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'PG69-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
|
b'PGG4-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
b'PW66-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'PW66-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
b'PW66-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'PW66-21PS1-C\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
b'PXDL-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
b'PXDL-21PS1-B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
|
import numpy as np
|
||||||
from opendbc.can import CANPacker
|
from opendbc.can import CANPacker
|
||||||
from opendbc.car import Bus, structs
|
from opendbc.car import Bus, DT_CTRL, structs
|
||||||
from opendbc.car.lateral import apply_std_steer_angle_limits
|
from opendbc.car.lateral import apply_std_steer_angle_limits
|
||||||
from opendbc.car.interfaces import CarControllerBase
|
from opendbc.car.interfaces import CarControllerBase
|
||||||
from opendbc.car.nissan import nissancan
|
from opendbc.car.nissan import nissancan
|
||||||
from opendbc.car.nissan.values import CAR, CarControllerParams
|
from opendbc.car.nissan.values import CAR, CarControllerParams
|
||||||
|
from opendbc.car.common.filter_simple import FirstOrderFilter
|
||||||
|
|
||||||
VisualAlert = structs.CarControl.HUDControl.VisualAlert
|
VisualAlert = structs.CarControl.HUDControl.VisualAlert
|
||||||
|
|
||||||
@@ -13,6 +15,8 @@ class CarController(CarControllerBase):
|
|||||||
super().__init__(dbc_names, CP, CP_SP)
|
super().__init__(dbc_names, CP, CP_SP)
|
||||||
self.car_fingerprint = CP.carFingerprint
|
self.car_fingerprint = CP.carFingerprint
|
||||||
|
|
||||||
|
self.angle_filter = FirstOrderFilter(0.0, 0.1, DT_CTRL)
|
||||||
|
|
||||||
self.apply_angle_last = 0
|
self.apply_angle_last = 0
|
||||||
|
|
||||||
self.packer = CANPacker(dbc_names[Bus.pt])
|
self.packer = CANPacker(dbc_names[Bus.pt])
|
||||||
@@ -27,8 +31,15 @@ class CarController(CarControllerBase):
|
|||||||
### STEER ###
|
### STEER ###
|
||||||
steer_hud_alert = 1 if hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw) else 0
|
steer_hud_alert = 1 if hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw) else 0
|
||||||
|
|
||||||
|
# At low speeds and at high steering angles, EPS is sensitive to jitter in angle request. Smooth to fix uncomfortable response.
|
||||||
|
if CC.latActive:
|
||||||
|
self.angle_filter.update_alpha(float(np.interp(CS.out.vEgo, [5, 10, 20], [0.2, 0.1, 0.0])))
|
||||||
|
self.angle_filter.update(actuators.steeringAngleDeg)
|
||||||
|
else:
|
||||||
|
self.angle_filter.x = actuators.steeringAngleDeg
|
||||||
|
|
||||||
# windup slower
|
# windup slower
|
||||||
self.apply_angle_last = apply_std_steer_angle_limits(actuators.steeringAngleDeg, self.apply_angle_last, CS.out.vEgoRaw,
|
self.apply_angle_last = apply_std_steer_angle_limits(self.angle_filter.x, self.apply_angle_last, CS.out.vEgoRaw,
|
||||||
CS.out.steeringAngleDeg, CC.latActive, CarControllerParams.ANGLE_LIMITS)
|
CS.out.steeringAngleDeg, CC.latActive, CarControllerParams.ANGLE_LIMITS)
|
||||||
|
|
||||||
lkas_max_torque = 0
|
lkas_max_torque = 0
|
||||||
@@ -37,12 +48,11 @@ class CarController(CarControllerBase):
|
|||||||
if not bool(CS.out.steeringPressed):
|
if not bool(CS.out.steeringPressed):
|
||||||
lkas_max_torque = CarControllerParams.LKAS_MAX_TORQUE
|
lkas_max_torque = CarControllerParams.LKAS_MAX_TORQUE
|
||||||
else:
|
else:
|
||||||
# Scale max torque based on how much torque the driver is applying to the wheel
|
# Scale max torque based on how much torque the driver is applying to the wheel.
|
||||||
|
# Start scaling torque at STEER_THRESHOLD down to 0.2. If we don't scale this low, EPS will temp fault from high driver and LKAS torque
|
||||||
lkas_max_torque = max(
|
lkas_max_torque = max(
|
||||||
# Scale max torque down to half LKAX_MAX_TORQUE as a minimum
|
CarControllerParams.LKAS_MIN_TORQUE,
|
||||||
CarControllerParams.LKAS_MAX_TORQUE * 0.5,
|
CarControllerParams.LKAS_MAX_TORQUE - 0.6 * max(0, abs(CS.out.steeringTorque) - CarControllerParams.STEER_THRESHOLD),
|
||||||
# Start scaling torque at STEER_THRESHOLD
|
|
||||||
CarControllerParams.LKAS_MAX_TORQUE - 0.6 * max(0, abs(CS.out.steeringTorque) - CarControllerParams.STEER_THRESHOLD)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA) and pcm_cancel_cmd:
|
if self.CP.carFingerprint in (CAR.NISSAN_ROGUE, CAR.NISSAN_XTRAIL, CAR.NISSAN_ALTIMA) and pcm_cancel_cmd:
|
||||||
|
|||||||
@@ -89,17 +89,21 @@ class CarState(CarStateBase, CarStateExt):
|
|||||||
ret.cruiseState.speed = speed * conversion
|
ret.cruiseState.speed = speed * conversion
|
||||||
ret.cruiseState.speedCluster = (speed - 1) * conversion # Speed on HUD is always 1 lower than actually sent on can bus
|
ret.cruiseState.speedCluster = (speed - 1) * conversion # Speed on HUD is always 1 lower than actually sent on can bus
|
||||||
|
|
||||||
|
# Altima EPS faults when user overrides above a certain torque.
|
||||||
|
# It also faults on sharp curves, although the threshold is unknown at this time
|
||||||
if self.CP.carFingerprint == CAR.NISSAN_ALTIMA:
|
if self.CP.carFingerprint == CAR.NISSAN_ALTIMA:
|
||||||
ret.steeringTorque = cp_cam.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"]
|
ret.steeringTorque = cp_cam.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"]
|
||||||
|
ret.steerFaultTemporary = cp_cam.vl["STEER_TORQUE_SENSOR"]["LKAS_STATUS"] == 9
|
||||||
|
ret.steeringAngleDeg = cp_cam.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]
|
||||||
else:
|
else:
|
||||||
ret.steeringTorque = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"]
|
ret.steeringTorque = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"]
|
||||||
|
ret.steerFaultTemporary = cp.vl["STEER_TORQUE_SENSOR"]["LKAS_STATUS"] == 9
|
||||||
|
ret.steeringAngleDeg = cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]
|
||||||
|
|
||||||
self.steeringTorqueSamples.append(ret.steeringTorque)
|
self.steeringTorqueSamples.append(ret.steeringTorque)
|
||||||
# Filtering driver torque to prevent steeringPressed false positives
|
# Filtering driver torque to prevent steeringPressed false positives
|
||||||
ret.steeringPressed = bool(abs(sum(self.steeringTorqueSamples) / TORQUE_SAMPLES) > CarControllerParams.STEER_THRESHOLD)
|
ret.steeringPressed = bool(abs(sum(self.steeringTorqueSamples) / TORQUE_SAMPLES) > CarControllerParams.STEER_THRESHOLD)
|
||||||
|
|
||||||
ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"]
|
|
||||||
|
|
||||||
ret.leftBlinker = bool(cp.vl["LIGHTS"]["LEFT_BLINKER"])
|
ret.leftBlinker = bool(cp.vl["LIGHTS"]["LEFT_BLINKER"])
|
||||||
ret.rightBlinker = bool(cp.vl["LIGHTS"]["RIGHT_BLINKER"])
|
ret.rightBlinker = bool(cp.vl["LIGHTS"]["RIGHT_BLINKER"])
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ FW_VERSIONS = {
|
|||||||
(Ecu.engine, 0x7e0, None): [
|
(Ecu.engine, 0x7e0, None): [
|
||||||
b'237106GU3B',
|
b'237106GU3B',
|
||||||
b'237109HE2B',
|
b'237109HE2B',
|
||||||
|
b'237106GV3A',
|
||||||
],
|
],
|
||||||
(Ecu.gateway, 0x18dad0f1, None): [
|
(Ecu.gateway, 0x18dad0f1, None): [
|
||||||
b'284U29HE0A',
|
b'284U29HE0A',
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class CarInterface(CarInterfaceBase):
|
|||||||
CarState = CarState
|
CarState = CarState
|
||||||
CarController = CarController
|
CarController = CarController
|
||||||
|
|
||||||
DRIVABLE_GEARS = (structs.CarState.GearShifter.brake,)
|
DRIVABLE_GEARS = (structs.CarState.GearShifter.brake, structs.CarState.GearShifter.low)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
|
def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ class CarControllerParams:
|
|||||||
([0., 5., 15.], [5., 3.5, 0.4]),
|
([0., 5., 15.], [5., 3.5, 0.4]),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
LKAS_MIN_TORQUE = 0.2 # Adequate torque when overriding without faulting
|
||||||
LKAS_MAX_TORQUE = 1 # A value of 1 is easy to overpower
|
LKAS_MAX_TORQUE = 1 # A value of 1 is easy to overpower
|
||||||
STEER_THRESHOLD = 1.0
|
STEER_THRESHOLD = 1.0
|
||||||
|
|
||||||
@@ -72,7 +73,7 @@ class CAR(Platforms):
|
|||||||
NissanCarSpecs(mass=1610, wheelbase=2.705)
|
NissanCarSpecs(mass=1610, wheelbase=2.705)
|
||||||
)
|
)
|
||||||
NISSAN_ALTIMA = NissanPlatformConfig(
|
NISSAN_ALTIMA = NissanPlatformConfig(
|
||||||
[NissanCarDocs("Nissan Altima 2019-20, 2024", car_parts=CarParts.common([CarHarness.nissan_b]))],
|
[NissanCarDocs("Nissan Altima 2019-24", car_parts=CarParts.common([CarHarness.nissan_b]))],
|
||||||
NissanCarSpecs(mass=1492, wheelbase=2.824)
|
NissanCarSpecs(mass=1492, wheelbase=2.824)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -92,34 +93,47 @@ NISSAN_VERSION_RESPONSE_KWP = b'\x61\x83'
|
|||||||
|
|
||||||
NISSAN_RX_OFFSET = 0x20
|
NISSAN_RX_OFFSET = 0x20
|
||||||
|
|
||||||
|
# TODO: once we gather enough Altima data on PT bus (1), we can remove OBD queries to speed up fingerprinting
|
||||||
FW_QUERY_CONFIG = FwQueryConfig(
|
FW_QUERY_CONFIG = FwQueryConfig(
|
||||||
requests=[request for bus, logging in ((0, False), (1, True)) for request in [
|
requests=[request for bus, obd_multiplexing in ((0, False), (1, False), (1, True)) for request in [
|
||||||
Request(
|
Request(
|
||||||
[NISSAN_DIAGNOSTIC_REQUEST_KWP, NISSAN_VERSION_REQUEST_KWP],
|
[NISSAN_DIAGNOSTIC_REQUEST_KWP, NISSAN_VERSION_REQUEST_KWP],
|
||||||
[NISSAN_DIAGNOSTIC_RESPONSE_KWP, NISSAN_VERSION_RESPONSE_KWP],
|
[NISSAN_DIAGNOSTIC_RESPONSE_KWP, NISSAN_VERSION_RESPONSE_KWP],
|
||||||
bus=bus,
|
bus=bus,
|
||||||
logging=logging,
|
logging=obd_multiplexing,
|
||||||
|
obd_multiplexing=obd_multiplexing,
|
||||||
),
|
),
|
||||||
Request(
|
Request(
|
||||||
[NISSAN_DIAGNOSTIC_REQUEST_KWP, NISSAN_VERSION_REQUEST_KWP],
|
[NISSAN_DIAGNOSTIC_REQUEST_KWP, NISSAN_VERSION_REQUEST_KWP],
|
||||||
[NISSAN_DIAGNOSTIC_RESPONSE_KWP, NISSAN_VERSION_RESPONSE_KWP],
|
[NISSAN_DIAGNOSTIC_RESPONSE_KWP, NISSAN_VERSION_RESPONSE_KWP],
|
||||||
rx_offset=NISSAN_RX_OFFSET,
|
rx_offset=NISSAN_RX_OFFSET,
|
||||||
bus=bus,
|
bus=bus,
|
||||||
logging=logging,
|
logging=obd_multiplexing,
|
||||||
|
obd_multiplexing=obd_multiplexing,
|
||||||
),
|
),
|
||||||
# Rogue's engine solely responds to this
|
# Rogue's engine solely responds to this
|
||||||
Request(
|
Request(
|
||||||
[NISSAN_DIAGNOSTIC_REQUEST_KWP_2, NISSAN_VERSION_REQUEST_KWP],
|
[NISSAN_DIAGNOSTIC_REQUEST_KWP_2, NISSAN_VERSION_REQUEST_KWP],
|
||||||
[NISSAN_DIAGNOSTIC_RESPONSE_KWP_2, NISSAN_VERSION_RESPONSE_KWP],
|
[NISSAN_DIAGNOSTIC_RESPONSE_KWP_2, NISSAN_VERSION_RESPONSE_KWP],
|
||||||
bus=bus,
|
bus=bus,
|
||||||
logging=logging,
|
logging=obd_multiplexing,
|
||||||
|
obd_multiplexing=obd_multiplexing,
|
||||||
),
|
),
|
||||||
Request(
|
Request(
|
||||||
[StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST],
|
[StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST],
|
||||||
[StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE],
|
[StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE],
|
||||||
rx_offset=NISSAN_RX_OFFSET,
|
rx_offset=NISSAN_RX_OFFSET,
|
||||||
bus=bus,
|
bus=bus,
|
||||||
logging=logging,
|
logging=obd_multiplexing,
|
||||||
|
obd_multiplexing=obd_multiplexing,
|
||||||
|
),
|
||||||
|
# Some newer Altima engines respond at normal rx offset
|
||||||
|
Request(
|
||||||
|
[StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST],
|
||||||
|
[StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE],
|
||||||
|
bus=bus,
|
||||||
|
logging=obd_multiplexing,
|
||||||
|
obd_multiplexing=obd_multiplexing,
|
||||||
),
|
),
|
||||||
]],
|
]],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ class CarState(CarStateBase, CarStateExt):
|
|||||||
ret.gasPressed = cp.vl["VDM_PropStatus"]["VDM_AcceleratorPedalPosition"] > 0
|
ret.gasPressed = cp.vl["VDM_PropStatus"]["VDM_AcceleratorPedalPosition"] > 0
|
||||||
|
|
||||||
# Brake pedal
|
# Brake pedal
|
||||||
ret.brake = cp.vl["ESPiB3"]["ESPiB3_pMC1"] / 250.0 # pressure in Bar
|
|
||||||
ret.brakePressed = cp.vl["iBESP2"]["iBESP2_BrakePedalApplied"] == 1
|
ret.brakePressed = cp.vl["iBESP2"]["iBESP2_BrakePedalApplied"] == 1
|
||||||
|
|
||||||
# Steering wheel
|
# Steering wheel
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ class CarState(CarStateBase, CarStateExt):
|
|||||||
ret.gasPressed = cp_party.vl["DI_systemStatus"]["DI_accelPedalPos"] > 0
|
ret.gasPressed = cp_party.vl["DI_systemStatus"]["DI_accelPedalPos"] > 0
|
||||||
|
|
||||||
# Brake pedal
|
# Brake pedal
|
||||||
ret.brake = 0
|
|
||||||
ret.brakePressed = cp_party.vl["ESP_status"]["ESP_driverBrakeApply"] == 2
|
ret.brakePressed = cp_party.vl["ESP_status"]["ESP_driverBrakeApply"] == 2
|
||||||
|
|
||||||
# Steering wheel
|
# Steering wheel
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from enum import Enum, IntFlag
|
from enum import Enum, IntFlag
|
||||||
from opendbc.car import ACCELERATION_DUE_TO_GRAVITY, Bus, CarSpecs, DbcDict, PlatformConfig, Platforms
|
from opendbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms
|
||||||
from opendbc.car.lateral import AngleSteeringLimits, ISO_LATERAL_ACCEL
|
from opendbc.car.lateral import AngleSteeringLimitsVM
|
||||||
from opendbc.car.structs import CarParams, CarState
|
from opendbc.car.structs import CarParams, CarState
|
||||||
from opendbc.car.docs_definitions import CarDocs, CarFootnote, CarHarness, CarParts, Column, SupportType
|
from opendbc.car.docs_definitions import CarDocs, CarFootnote, CarHarness, CarParts, Column, SupportType
|
||||||
from opendbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
|
from opendbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
|
||||||
@@ -111,23 +111,10 @@ GEAR_MAP = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
# Add extra tolerance for average banked road since safety doesn't have the roll
|
|
||||||
AVERAGE_ROAD_ROLL = 0.06 # ~3.4 degrees, 6% superelevation. higher actual roll lowers lateral acceleration
|
|
||||||
|
|
||||||
|
|
||||||
class CarControllerParams:
|
class CarControllerParams:
|
||||||
ANGLE_LIMITS: AngleSteeringLimits = AngleSteeringLimits(
|
ANGLE_LIMITS: AngleSteeringLimitsVM = AngleSteeringLimitsVM(
|
||||||
# EPAS faults above this angle
|
# EPAS faults above this angle
|
||||||
360, # deg
|
360, # deg
|
||||||
# Tesla uses a vehicle model instead, check carcontroller.py for details
|
|
||||||
([], []),
|
|
||||||
([], []),
|
|
||||||
|
|
||||||
# Vehicle model angle limits
|
|
||||||
# Add extra tolerance for average banked road since safety doesn't have the roll
|
|
||||||
MAX_LATERAL_ACCEL=ISO_LATERAL_ACCEL + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), # ~3.6 m/s^2
|
|
||||||
MAX_LATERAL_JERK=3.0 + (ACCELERATION_DUE_TO_GRAVITY * AVERAGE_ROAD_ROLL), # ~3.6 m/s^3
|
|
||||||
|
|
||||||
# limit angle rate to both prevent a fault and for low speed comfort (~12 mph rate down to 0 mph)
|
# limit angle rate to both prevent a fault and for low speed comfort (~12 mph rate down to 0 mph)
|
||||||
MAX_ANGLE_RATE=5, # deg/20ms frame, EPS faults at 12 at a standstill
|
MAX_ANGLE_RATE=5, # deg/20ms frame, EPS faults at 12 at a standstill
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -294,8 +294,11 @@ def main(platform: str | None = None, segments_per_platform: int = 10, update_re
|
|||||||
icon = "⚠️" if with_diffs else "✅"
|
icon = "⚠️" if with_diffs else "✅"
|
||||||
print(f"\n{icon} {len(with_diffs)} changed, {n_passed} passed, {len(errors)} errors")
|
print(f"\n{icon} {len(with_diffs)} changed, {n_passed} passed, {len(errors)} errors")
|
||||||
|
|
||||||
for plat, seg, err in errors:
|
if errors:
|
||||||
print(f"\nERROR {plat} - {seg}: {err}")
|
print("<details><summary><b>Show errors</b></summary>\n\n```")
|
||||||
|
for err in dict.fromkeys(err for _, _, err in errors):
|
||||||
|
print(f"\n{err}")
|
||||||
|
print("```\n</details>")
|
||||||
|
|
||||||
if with_diffs:
|
if with_diffs:
|
||||||
print("<details><summary><b>Show changes</b></summary>\n\n```")
|
print("<details><summary><b>Show changes</b></summary>\n\n```")
|
||||||
|
|||||||
@@ -232,7 +232,7 @@ class TestFwFingerprintTiming(unittest.TestCase):
|
|||||||
return self.total_time / self.N
|
return self.total_time / self.N
|
||||||
|
|
||||||
def _assert_timing(self, avg_time, ref_time):
|
def _assert_timing(self, avg_time, ref_time):
|
||||||
assert avg_time < ref_time + self.TOL
|
assert avg_time < ref_time + self.TOL, avg_time
|
||||||
assert avg_time > ref_time - self.TOL, "Performance seems to have improved, update test refs."
|
assert avg_time > ref_time - self.TOL, "Performance seems to have improved, update test refs."
|
||||||
|
|
||||||
def test_startup_timing(self):
|
def test_startup_timing(self):
|
||||||
@@ -262,7 +262,7 @@ class TestFwFingerprintTiming(unittest.TestCase):
|
|||||||
print(f'get_vin {name} case, query time={self.total_time / self.N} seconds')
|
print(f'get_vin {name} case, query time={self.total_time / self.N} seconds')
|
||||||
|
|
||||||
def test_fw_query_timing(self):
|
def test_fw_query_timing(self):
|
||||||
total_ref_time = 7.4
|
total_ref_time = 8.2
|
||||||
brand_ref_times = {
|
brand_ref_times = {
|
||||||
'gm': 1.0,
|
'gm': 1.0,
|
||||||
'body': 0.1,
|
'body': 0.1,
|
||||||
@@ -271,7 +271,7 @@ class TestFwFingerprintTiming(unittest.TestCase):
|
|||||||
'honda': 0.45,
|
'honda': 0.45,
|
||||||
'hyundai': 0.65,
|
'hyundai': 0.65,
|
||||||
'mazda': 0.1,
|
'mazda': 0.1,
|
||||||
'nissan': 0.8,
|
'nissan': 1.6,
|
||||||
'subaru': 0.65,
|
'subaru': 0.65,
|
||||||
'tesla': 0.1,
|
'tesla': 0.1,
|
||||||
'toyota': 0.7,
|
'toyota': 0.7,
|
||||||
|
|||||||
@@ -95,6 +95,9 @@ class CarState(CarStateBase, CarStateExt):
|
|||||||
|
|
||||||
ret.standstill = abs(ret.vEgoRaw) < 1e-3
|
ret.standstill = abs(ret.vEgoRaw) < 1e-3
|
||||||
|
|
||||||
|
ret.vehicleSensorsInvalid = any(cp.vl["WHEEL_SPEEDS"][f"WHEEL_SPEED_{whl}_FAULT"]
|
||||||
|
for whl in ("FL", "FR", "RL", "RR"))
|
||||||
|
|
||||||
ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"] + cp.vl["STEER_ANGLE_SENSOR"]["STEER_FRACTION"]
|
ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_ANGLE"] + cp.vl["STEER_ANGLE_SENSOR"]["STEER_FRACTION"]
|
||||||
ret.steeringRateDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_RATE"]
|
ret.steeringRateDeg = cp.vl["STEER_ANGLE_SENSOR"]["STEER_RATE"]
|
||||||
torque_sensor_angle_deg = cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]
|
torque_sensor_angle_deg = cp.vl["STEER_TORQUE_SENSOR"]["STEER_ANGLE"]
|
||||||
@@ -131,7 +134,8 @@ class CarState(CarStateBase, CarStateExt):
|
|||||||
|
|
||||||
# Lane Tracing Assist control is unavailable (EPS_STATUS->LTA_STATE=0) until
|
# Lane Tracing Assist control is unavailable (EPS_STATUS->LTA_STATE=0) until
|
||||||
# the more accurate angle sensor signal is initialized
|
# the more accurate angle sensor signal is initialized
|
||||||
ret.vehicleSensorsInvalid = not self.accurate_steer_angle_seen
|
if not self.accurate_steer_angle_seen:
|
||||||
|
ret.vehicleSensorsInvalid = True
|
||||||
|
|
||||||
if self.CP.carFingerprint in UNSUPPORTED_DSU_CAR:
|
if self.CP.carFingerprint in UNSUPPORTED_DSU_CAR:
|
||||||
# TODO: find the bit likely in DSU_CRUISE that describes an ACC fault. one may also exist in CLUTCH
|
# TODO: find the bit likely in DSU_CRUISE that describes an ACC fault. one may also exist in CLUTCH
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ def get_vin(can_recv, can_send, buses, timeout=0.1, retry=2):
|
|||||||
if vin.startswith(b'\x11'):
|
if vin.startswith(b'\x11'):
|
||||||
vin = vin[1:18]
|
vin = vin[1:18]
|
||||||
|
|
||||||
carlog.error(f"got vin with {request=}")
|
carlog.error(f"got vin with {request=}, {bus=}")
|
||||||
return uds.get_rx_addr_for_tx_addr(addr, rx_offset=rx_offset), bus, vin.decode()
|
return uds.get_rx_addr_for_tx_addr(addr, rx_offset=rx_offset), bus, vin.decode()
|
||||||
except Exception:
|
except Exception:
|
||||||
carlog.exception("VIN query exception")
|
carlog.exception("VIN query exception")
|
||||||
|
|||||||
@@ -81,7 +81,6 @@ class CarState(CarStateBase):
|
|||||||
if self.CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT:
|
if self.CP.flags & VolkswagenFlags.STOCK_HCA_PRESENT:
|
||||||
ret.carFaultedNonCritical = bool(cam_cp.vl["HCA_01"]["EA_Ruckfreigabe"]) or cam_cp.vl["HCA_01"]["EA_ACC_Sollstatus"] > 0 # EA
|
ret.carFaultedNonCritical = bool(cam_cp.vl["HCA_01"]["EA_Ruckfreigabe"]) or cam_cp.vl["HCA_01"]["EA_ACC_Sollstatus"] > 0 # EA
|
||||||
|
|
||||||
ret.brake = pt_cp.vl["ESP_05"]["ESP_Bremsdruck"] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects
|
|
||||||
brake_pedal_pressed = bool(pt_cp.vl["Motor_14"]["MO_Fahrer_bremst"])
|
brake_pedal_pressed = bool(pt_cp.vl["Motor_14"]["MO_Fahrer_bremst"])
|
||||||
brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"])
|
brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"])
|
||||||
ret.brakePressed = brake_pedal_pressed or brake_pressure_detected
|
ret.brakePressed = brake_pedal_pressed or brake_pressure_detected
|
||||||
@@ -160,7 +159,6 @@ class CarState(CarStateBase):
|
|||||||
|
|
||||||
# Update gas, brakes, and gearshift.
|
# Update gas, brakes, and gearshift.
|
||||||
ret.gasPressed = pt_cp.vl["Motor_3"]["MO3_Pedalwert"] > 0
|
ret.gasPressed = pt_cp.vl["Motor_3"]["MO3_Pedalwert"] > 0
|
||||||
ret.brake = pt_cp.vl["Bremse_5"]["BR5_Bremsdruck"] / 250.0 # FIXME: this is pressure in Bar, not sure what OP expects
|
|
||||||
ret.brakePressed = bool(pt_cp.vl["Motor_2"]["MO2_BLS"])
|
ret.brakePressed = bool(pt_cp.vl["Motor_2"]["MO2_BLS"])
|
||||||
ret.parkingBrake = bool(pt_cp.vl["Kombi_1"]["Bremsinfo"])
|
ret.parkingBrake = bool(pt_cp.vl["Kombi_1"]["Bremsinfo"])
|
||||||
|
|
||||||
@@ -256,7 +254,6 @@ class CarState(CarStateBase):
|
|||||||
|
|
||||||
self.parse_mlb_mqb_steering_state(ret, pt_cp)
|
self.parse_mlb_mqb_steering_state(ret, pt_cp)
|
||||||
|
|
||||||
ret.brake = pt_cp.vl["ESP_05"]["ESP_Bremsdruck"] / 250.0
|
|
||||||
brake_pedal_pressed = bool(pt_cp.vl["Motor_03"]["MO_Fahrer_bremst"])
|
brake_pedal_pressed = bool(pt_cp.vl["Motor_03"]["MO_Fahrer_bremst"])
|
||||||
brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"])
|
brake_pressure_detected = bool(pt_cp.vl["ESP_05"]["ESP_Fahrer_bremst"])
|
||||||
ret.brakePressed = brake_pedal_pressed or brake_pressure_detected
|
ret.brakePressed = brake_pedal_pressed or brake_pressure_detected
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ BO_ 361 LKAS: 8 XXX
|
|||||||
|
|
||||||
BO_ 389 STEER_TORQUE_SENSOR: 8 XXX
|
BO_ 389 STEER_TORQUE_SENSOR: 8 XXX
|
||||||
SG_ LKAS_ACTIVE : 37|1@0+ (1,0) [0|3] "" XXX
|
SG_ LKAS_ACTIVE : 37|1@0+ (1,0) [0|3] "" XXX
|
||||||
|
SG_ LKAS_STATUS : 55|4@0+ (1,0) [0|15] "" XXX
|
||||||
SG_ STEER_TORQUE_LKAS : 47|8@0+ (1,0) [0|255] "" XXX
|
SG_ STEER_TORQUE_LKAS : 47|8@0+ (1,0) [0|255] "" XXX
|
||||||
SG_ STEER_ANGLE : 23|18@0+ (-0.01,1310) [0|262143] "" XXX
|
SG_ STEER_ANGLE : 23|18@0+ (-0.01,1310) [0|262143] "" XXX
|
||||||
SG_ STEER_TORQUE_DRIVER : 7|12@0+ (-0.01,20.47) [0|4095] "Nm" XXX
|
SG_ STEER_TORQUE_DRIVER : 7|12@0+ (-0.01,20.47) [0|4095] "Nm" XXX
|
||||||
@@ -25,6 +26,9 @@ BO_ 645 WHEEL_SPEEDS_REAR: 8 XXX
|
|||||||
SG_ WHEEL_SPEED_RR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX
|
SG_ WHEEL_SPEED_RR : 7|16@0+ (0.005,0) [0|65535] "KPH" XXX
|
||||||
SG_ WHEEL_SPEED_RL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX
|
SG_ WHEEL_SPEED_RL : 23|16@0+ (0.005,0) [0|65535] "KPH" XXX
|
||||||
|
|
||||||
|
BO_ 658 ACCEL: 8 XXX
|
||||||
|
SG_ ROUGH_ACCEL : 7|16@0+ (0.0005,-16.5) [-16.5|16.27] "m/s^2" XXX
|
||||||
|
|
||||||
BO_ 689 PROPILOT_HUD: 8 XXX
|
BO_ 689 PROPILOT_HUD: 8 XXX
|
||||||
SG_ LARGE_WARNING_FLASHING : 9|1@0+ (1,0) [0|1] "" XXX
|
SG_ LARGE_WARNING_FLASHING : 9|1@0+ (1,0) [0|1] "" XXX
|
||||||
SG_ SIDE_RADAR_ERROR_FLASHING1 : 10|1@0+ (1,0) [0|1] "" XXX
|
SG_ SIDE_RADAR_ERROR_FLASHING1 : 10|1@0+ (1,0) [0|1] "" XXX
|
||||||
@@ -109,6 +113,8 @@ BO_ 1228 PROPILOT_HUD_INFO_MSG: 8 XXX
|
|||||||
BO_ 1227 LKAS_SETTINGS: 8 XXX
|
BO_ 1227 LKAS_SETTINGS: 8 XXX
|
||||||
SG_ LKAS_ENABLED : 51|1@0+ (1,0) [0|1] "" XXX
|
SG_ LKAS_ENABLED : 51|1@0+ (1,0) [0|1] "" XXX
|
||||||
|
|
||||||
|
CM_ SG_ 389 LKAS_STATUS "EPS LKAS state. Encoded as two redundant 2-bit halves (each always 0b01 or 0b10).";
|
||||||
|
VAL_ 389 LKAS_STATUS 5 "INACTIVE" 6 "ACTIVE" 9 "FAULT" ;
|
||||||
VAL_ 1228 PROPILOT_NA_MSGS 0 "NO_MSG" 1 "NA_FRONT_CAMERA_IMPARED" 2 "STEERING_ASSIST_ON_STANDBY" 3 "NA_PARKING_ASSIST_ENABLED" 4 "STEER_ASSIST_CURRENTLY_NA" 5 "NA_BAD_WEATHER" 6 "NA_PARK_BRAKE_ON" 7 "NA_SEATBELT_NOT_FASTENED" ;
|
VAL_ 1228 PROPILOT_NA_MSGS 0 "NO_MSG" 1 "NA_FRONT_CAMERA_IMPARED" 2 "STEERING_ASSIST_ON_STANDBY" 3 "NA_PARKING_ASSIST_ENABLED" 4 "STEER_ASSIST_CURRENTLY_NA" 5 "NA_BAD_WEATHER" 6 "NA_PARK_BRAKE_ON" 7 "NA_SEATBELT_NOT_FASTENED" ;
|
||||||
VAL_ 1228 BOTTOM_MSG 0 "OK_STEER_ASSIST_SETTINGS" 1 "NO_MSG" 2 "PRESS_SET_TO_SET_SPEED" 3 "PRESS_RES_SET_TO_CHANGE_SPEED" 4 "PRESS_RES_TO_RESTART" 5 "NO_MSG" 6 "CRUISE_NOT_AVAIL" 7 "NO_MSG" ;
|
VAL_ 1228 BOTTOM_MSG 0 "OK_STEER_ASSIST_SETTINGS" 1 "NO_MSG" 2 "PRESS_SET_TO_SET_SPEED" 3 "PRESS_RES_SET_TO_CHANGE_SPEED" 4 "PRESS_RES_TO_RESTART" 5 "NO_MSG" 6 "CRUISE_NOT_AVAIL" 7 "NO_MSG" ;
|
||||||
VAL_ 689 FOLLOW_DISTANCE 0 "NO_FOLLOW_DISTANCE" 1 "FOLLOW_DISTANCE_1" 2 "FOLLOW_DISTANCE_2" 3 "FOLLOW_DISTANCE_3" ;
|
VAL_ 689 FOLLOW_DISTANCE 0 "NO_FOLLOW_DISTANCE" 1 "FOLLOW_DISTANCE_1" 2 "FOLLOW_DISTANCE_2" 3 "FOLLOW_DISTANCE_3" ;
|
||||||
|
|||||||
@@ -65,10 +65,14 @@ BO_ 166 BRAKE: 8 XXX
|
|||||||
SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX
|
SG_ BRAKE_FORCE : 23|8@0+ (40,0) [0|10200] "N" XXX
|
||||||
|
|
||||||
BO_ 170 WHEEL_SPEEDS: 8 XXX
|
BO_ 170 WHEEL_SPEEDS: 8 XXX
|
||||||
SG_ WHEEL_SPEED_FR : 7|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
|
SG_ WHEEL_SPEED_FR_FAULT : 7|1@0+ (1,0) [0|0] "" AFS,FCM,MAV
|
||||||
SG_ WHEEL_SPEED_FL : 23|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
|
SG_ WHEEL_SPEED_FR : 6|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS
|
||||||
SG_ WHEEL_SPEED_RR : 39|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
|
SG_ WHEEL_SPEED_FL_FAULT : 23|1@0+ (1,0) [0|0] "" AFS,FCM,MAV
|
||||||
SG_ WHEEL_SPEED_RL : 55|16@0+ (0.01,-67.67) [0|250] "km/h" XXX
|
SG_ WHEEL_SPEED_FL : 22|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS
|
||||||
|
SG_ WHEEL_SPEED_RR_FAULT : 39|1@0+ (1,0) [0|0] "" AFS,FCM,MAV
|
||||||
|
SG_ WHEEL_SPEED_RR : 38|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS
|
||||||
|
SG_ WHEEL_SPEED_RL_FAULT : 55|1@0+ (1,0) [0|0] "" AFS,FCM,MAV
|
||||||
|
SG_ WHEEL_SPEED_RL : 54|15@0+ (0.01,-67.67) [0|0] "km/h" AFS,BSR,DS1,FCM,KSS,MAV,SCS
|
||||||
|
|
||||||
BO_ 180 SPEED: 8 XXX
|
BO_ 180 SPEED: 8 XXX
|
||||||
SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
|
SG_ ENCODER : 39|8@0+ (1,0) [0|255] "" XXX
|
||||||
@@ -84,6 +88,21 @@ BO_ 295 GEAR_PACKET_HYBRID: 8 XXX
|
|||||||
BO_ 353 DSU_SPEED: 7 XXX
|
BO_ 353 DSU_SPEED: 7 XXX
|
||||||
SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX
|
SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "km/h" XXX
|
||||||
|
|
||||||
|
BO_ 426 VSC1F02: 6 CGW
|
||||||
|
SG_ VXFRF : 7|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV
|
||||||
|
SG_ VXFRIGS : 6|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV
|
||||||
|
SG_ VXFRHDS : 5|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS
|
||||||
|
SG_ VXFLF : 2|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV
|
||||||
|
SG_ VXFLIGS : 1|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV
|
||||||
|
SG_ VXFLHDS : 0|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS
|
||||||
|
SG_ VXRRF : 13|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV
|
||||||
|
SG_ VXRRIGS : 12|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV
|
||||||
|
SG_ VXRRHDS : 11|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS
|
||||||
|
SG_ VXRLF : 8|1@0+ (1,0) [0|0] "" AFS,BSR,FCM,MAV
|
||||||
|
SG_ VXRLIGS : 23|1@0+ (1,0) [0|0] "" BSR,DS1,FCM,MAV
|
||||||
|
SG_ VXRLHDS : 22|1@0+ (1,0) [0|0] "" FCM,KSS,MAV,SCS
|
||||||
|
SG_ VSCF02SM : 47|8@0+ (1,0) [0|0] "" AFS,DS1,FCM,MAV
|
||||||
|
|
||||||
BO_ 452 ENGINE_RPM: 8 CGW
|
BO_ 452 ENGINE_RPM: 8 CGW
|
||||||
SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
|
SG_ RPM : 7|16@0- (0.78125,0) [0|0] "rpm" SCS
|
||||||
SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX
|
SG_ ENGINE_RUNNING : 27|1@0+ (1,0) [0|1] "" XXX
|
||||||
|
|||||||
77
opendbc/safety/ignition.h
Normal file
77
opendbc/safety/ignition.h
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include "opendbc/safety/can.h"
|
||||||
|
|
||||||
|
bool ignition_can = false;
|
||||||
|
uint32_t ignition_can_cnt = 0U;
|
||||||
|
|
||||||
|
void ignition_can_hook(const CANPacket_t *msg) {
|
||||||
|
if (msg->bus == 0U) {
|
||||||
|
int len = GET_LEN(msg);
|
||||||
|
|
||||||
|
// GM exception
|
||||||
|
if ((msg->addr == 0x1F1U) && (len == 8)) {
|
||||||
|
// SystemPowerMode (2=Run, 3=Crank Request)
|
||||||
|
ignition_can = (msg->data[0] & 0x2U) != 0U;
|
||||||
|
ignition_can_cnt = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rivian R1S/T GEN1 exception
|
||||||
|
if ((msg->addr == 0x152U) && (len == 8)) {
|
||||||
|
// 0x152 overlaps with Subaru pre-global which has this bit as the high beam
|
||||||
|
int counter = msg->data[1] & 0xFU; // max is only 14
|
||||||
|
|
||||||
|
static int prev_counter_rivian = -1;
|
||||||
|
if ((counter == ((prev_counter_rivian + 1) % 15)) && (prev_counter_rivian != -1)) {
|
||||||
|
// VDM_OutputSignals->VDM_EpasPowerMode
|
||||||
|
ignition_can = ((msg->data[7] >> 4U) & 0x3U) == 1U; // VDM_EpasPowerMode_Drive_On=1
|
||||||
|
ignition_can_cnt = 0U;
|
||||||
|
}
|
||||||
|
prev_counter_rivian = counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tesla Model 3/Y exception
|
||||||
|
if ((msg->addr == 0x221U) && (len == 8)) {
|
||||||
|
// 0x221 overlaps with Rivian which has random data on byte 0
|
||||||
|
int counter = msg->data[6] >> 4;
|
||||||
|
|
||||||
|
static int prev_counter_tesla = -1;
|
||||||
|
if ((counter == ((prev_counter_tesla + 1) % 16)) && (prev_counter_tesla != -1)) {
|
||||||
|
// VCFRONT_LVPowerState->VCFRONT_vehiclePowerState
|
||||||
|
int power_state = (msg->data[0] >> 5U) & 0x3U;
|
||||||
|
ignition_can = power_state == 0x3; // VEHICLE_POWER_STATE_DRIVE=3
|
||||||
|
ignition_can_cnt = 0U;
|
||||||
|
}
|
||||||
|
prev_counter_tesla = counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mazda exception
|
||||||
|
if ((msg->addr == 0x9EU) && (len == 8)) {
|
||||||
|
ignition_can = (msg->data[0] >> 5) == 0x6U;
|
||||||
|
ignition_can_cnt = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Volkswagen MEB exception
|
||||||
|
if ((msg->addr == 0x3C0U) && (len == 4)) {
|
||||||
|
int counter = msg->data[1] & 0xFU;
|
||||||
|
|
||||||
|
static int prev_counter_vw_meb = -1;
|
||||||
|
if ((counter == ((prev_counter_vw_meb + 1) % 16)) && (prev_counter_vw_meb != -1)) {
|
||||||
|
// Klemmen_Status_01->ZAS_Kl_15
|
||||||
|
ignition_can = ((msg->data[2] >> 1) & 1U) != 0U;
|
||||||
|
ignition_can_cnt = 0U;
|
||||||
|
}
|
||||||
|
prev_counter_vw_meb = counter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: this is too loose, Teslas have 0x222
|
||||||
|
// body v2 exception
|
||||||
|
// if (((msg->bus == 0U) || (msg->bus == 2U)) && (msg->addr == 0x222U)) {
|
||||||
|
// ignition_can = true;
|
||||||
|
// ignition_can_cnt = 0U;
|
||||||
|
// }
|
||||||
|
}
|
||||||
@@ -2,39 +2,53 @@
|
|||||||
|
|
||||||
#include "opendbc/safety/declarations.h"
|
#include "opendbc/safety/declarations.h"
|
||||||
|
|
||||||
#define NISSAN_COMMON_RX_CHECKS \
|
#define NISSAN_COMMON_RX_CHECKS \
|
||||||
{.msg = {{0x2, 0, 5, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
{.msg = {{0x185, 0, 8, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, /* STEER_TORQUE_SENSOR */ \
|
||||||
{0x2, 1, 5, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }}}, /* STEER_ANGLE_SENSOR */ \
|
{.msg = {{0x285, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
||||||
{.msg = {{0x285, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
{0x285, 1, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }}}, /* WHEEL_SPEEDS_REAR */ \
|
||||||
{0x285, 1, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }}}, /* WHEEL_SPEEDS_REAR */ \
|
{.msg = {{0x30f, 2, 3, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
||||||
{.msg = {{0x30f, 2, 3, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
{0x30f, 1, 3, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }}}, /* CRUISE_STATE */ \
|
||||||
{0x30f, 1, 3, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }}}, /* CRUISE_STATE */ \
|
{.msg = {{0x15c, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
||||||
{.msg = {{0x15c, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
{0x15c, 1, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
||||||
{0x15c, 1, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
{0x239, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}}}, /* GAS_PEDAL */ \
|
||||||
{0x239, 0, 8, 50U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}}}, /* GAS_PEDAL */ \
|
{.msg = {{0x454, 0, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
||||||
{.msg = {{0x454, 0, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
{0x454, 1, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
||||||
{0x454, 1, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, \
|
{0x1cc, 0, 4, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}}}, /* DOORS_LIGHTS / BRAKE */ \
|
||||||
{0x1cc, 0, 4, 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}}}, /* DOORS_LIGHTS / BRAKE */ \
|
|
||||||
|
|
||||||
#define NISSAN_PRO_PILOT_RX_CHECKS(alt_eps_bus) \
|
#define NISSAN_PRO_PILOT_RX_CHECKS(alt_eps_bus) \
|
||||||
{.msg = {{0x1B6, alt_eps_bus, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
|
{.msg = {{0x1B6, alt_eps_bus, 8, 10U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
|
||||||
|
|
||||||
static bool nissan_alt_eps = false;
|
static bool nissan_alt_eps = false;
|
||||||
|
|
||||||
|
static const AngleSteeringLimits NISSAN_STEERING_LIMITS = {
|
||||||
|
.max_angle = 60000, // 600 deg, reasonable limit
|
||||||
|
.angle_deg_to_can = 100,
|
||||||
|
.angle_rate_up_lookup = {
|
||||||
|
{0., 5., 15.},
|
||||||
|
{5., .8, .15}
|
||||||
|
},
|
||||||
|
.angle_rate_down_lookup = {
|
||||||
|
{0., 5., 15.},
|
||||||
|
{5., 3.5, .4}
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static void nissan_rx_hook(const CANPacket_t *msg) {
|
static void nissan_rx_hook(const CANPacket_t *msg) {
|
||||||
|
|
||||||
if (msg->bus == (nissan_alt_eps ? 1U : 0U)) {
|
// Altima: on camera bus, others: on pt bus
|
||||||
if (msg->addr == 0x2U) {
|
if (msg->bus == 0U) {
|
||||||
|
if (msg->addr == 0x185U) {
|
||||||
// Current steering angle
|
// Current steering angle
|
||||||
// Factor -0.1, little endian
|
int angle_meas_new = (msg->data[2] << 10) | (msg->data[3] << 2) | (msg->data[4] >> 6);
|
||||||
int angle_meas_new = (GET_BYTES(msg, 0, 4) & 0xFFFFU);
|
// Factor is -0.01, offset is 1310. Flip to correct sign, but keep units in CAN scale
|
||||||
// Multiply by -10 to match scale of LKAS angle
|
angle_meas_new = -angle_meas_new + (1310.0f * NISSAN_STEERING_LIMITS.angle_deg_to_can);
|
||||||
angle_meas_new = to_signed(angle_meas_new, 16) * -10;
|
|
||||||
|
|
||||||
// update array of samples
|
// update array of samples
|
||||||
update_sample(&angle_meas, angle_meas_new);
|
update_sample(&angle_meas, angle_meas_new);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (msg->bus == (nissan_alt_eps ? 1U : 0U)) {
|
||||||
if (msg->addr == 0x285U) {
|
if (msg->addr == 0x285U) {
|
||||||
// Get current speed and standstill
|
// Get current speed and standstill
|
||||||
uint16_t right_rear = (msg->data[0] << 8) | (msg->data[1]);
|
uint16_t right_rear = (msg->data[0] << 8) | (msg->data[1]);
|
||||||
@@ -79,19 +93,6 @@ static void nissan_rx_hook(const CANPacket_t *msg) {
|
|||||||
|
|
||||||
|
|
||||||
static bool nissan_tx_hook(const CANPacket_t *msg) {
|
static bool nissan_tx_hook(const CANPacket_t *msg) {
|
||||||
const AngleSteeringLimits NISSAN_STEERING_LIMITS = {
|
|
||||||
.max_angle = 60000, // 600 deg, reasonable limit
|
|
||||||
.angle_deg_to_can = 100,
|
|
||||||
.angle_rate_up_lookup = {
|
|
||||||
{0., 5., 15.},
|
|
||||||
{5., .8, .15}
|
|
||||||
},
|
|
||||||
.angle_rate_down_lookup = {
|
|
||||||
{0., 5., 15.},
|
|
||||||
{5., 3.5, .4}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
bool tx = true;
|
bool tx = true;
|
||||||
bool violation = false;
|
bool violation = false;
|
||||||
|
|
||||||
|
|||||||
@@ -37,8 +37,8 @@
|
|||||||
{0x183, 0, 8, .check_relay = true}, /* ACC_CONTROL_2 */ \
|
{0x183, 0, 8, .check_relay = true}, /* ACC_CONTROL_2 */ \
|
||||||
|
|
||||||
#define TOYOTA_COMMON_RX_CHECKS(lta) \
|
#define TOYOTA_COMMON_RX_CHECKS(lta) \
|
||||||
{.msg = {{ 0xaa, 0, 8, 83U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
|
{.msg = {{ 0xaa, 0, 8, 83U, .ignore_checksum = true, .ignore_counter = true}, { 0 }, { 0 }}}, \
|
||||||
{.msg = {{0x260, 0, 8, 50U, .ignore_counter = true, .ignore_quality_flag=!(lta)}, { 0 }, { 0 }}}, \
|
{.msg = {{0x260, 0, 8, 50U, .ignore_counter = true, .ignore_quality_flag=!(lta)}, { 0 }, { 0 }}}, \
|
||||||
|
|
||||||
#define TOYOTA_RX_CHECKS(lta) \
|
#define TOYOTA_RX_CHECKS(lta) \
|
||||||
TOYOTA_COMMON_RX_CHECKS(lta) \
|
TOYOTA_COMMON_RX_CHECKS(lta) \
|
||||||
@@ -86,7 +86,21 @@ static uint32_t toyota_get_checksum(const CANPacket_t *msg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool toyota_get_quality_flag_valid(const CANPacket_t *msg) {
|
static bool toyota_get_quality_flag_valid(const CANPacket_t *msg) {
|
||||||
return !GET_BIT(msg, 3U); // STEER_ANGLE_INITIALIZING
|
bool valid = false;
|
||||||
|
if (msg->addr == 0x260U) {
|
||||||
|
valid = !GET_BIT(msg, 3U); // STEER_TORQUE_SENSOR.STEER_ANGLE_INITIALIZING
|
||||||
|
} else if (msg->addr == 0xaaU) { // WHEEL_SPEEDS
|
||||||
|
// each wheel speed is 1-bit fault + 15-bit speed
|
||||||
|
valid = true;
|
||||||
|
for (uint8_t i = 0U; i < 4U; i += 1U) {
|
||||||
|
if (GET_BIT(msg, (i * 16U) + 7U)) { // WHEEL_SPEED_xx_FAULT
|
||||||
|
valid = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int TOYOTA_GET_INTERCEPTOR(const CANPacket_t *msg) {
|
static int TOYOTA_GET_INTERCEPTOR(const CANPacket_t *msg) {
|
||||||
@@ -166,7 +180,7 @@ static void toyota_rx_hook(const CANPacket_t *msg) {
|
|||||||
int speed = 0;
|
int speed = 0;
|
||||||
// sum 4 wheel speeds. conversion: raw * 0.01 - 67.67
|
// sum 4 wheel speeds. conversion: raw * 0.01 - 67.67
|
||||||
for (uint8_t i = 0U; i < 8U; i += 2U) {
|
for (uint8_t i = 0U; i < 8U; i += 2U) {
|
||||||
int wheel_speed = (msg->data[i] << 8U) | msg->data[(i + 1U)];
|
int wheel_speed = ((msg->data[i] & 0x7FU) << 8U) | msg->data[(i + 1U)];
|
||||||
speed += wheel_speed - 6767;
|
speed += wheel_speed - 6767;
|
||||||
}
|
}
|
||||||
// check that all wheel speeds are at zero value
|
// check that all wheel speeds are at zero value
|
||||||
|
|||||||
@@ -322,7 +322,8 @@ void safety_tick(const safety_config *cfg) {
|
|||||||
// lag threshold is max of: 1s and MAX_MISSED_MSGS * expected timestep.
|
// lag threshold is max of: 1s and MAX_MISSED_MSGS * expected timestep.
|
||||||
// Quite conservative to not risk false triggers.
|
// Quite conservative to not risk false triggers.
|
||||||
// 2s of lag is worse case, since the function is called at 1Hz
|
// 2s of lag is worse case, since the function is called at 1Hz
|
||||||
uint32_t timestep = 1e6 / cfg->rx_checks[i].msg[cfg->rx_checks[i].status.index].frequency;
|
uint32_t frequency = cfg->rx_checks[i].msg[cfg->rx_checks[i].status.index].frequency;
|
||||||
|
uint32_t timestep = 1e6 / frequency;
|
||||||
bool lagging = elapsed_time > SAFETY_MAX(timestep * MAX_MISSED_MSGS, 1e6);
|
bool lagging = elapsed_time > SAFETY_MAX(timestep * MAX_MISSED_MSGS, 1e6);
|
||||||
cfg->rx_checks[i].status.lagging = lagging;
|
cfg->rx_checks[i].status.lagging = lagging;
|
||||||
if (lagging) {
|
if (lagging) {
|
||||||
@@ -330,8 +331,11 @@ void safety_tick(const safety_config *cfg) {
|
|||||||
mads_exit_controls(MADS_DISENGAGE_REASON_LAG);
|
mads_exit_controls(MADS_DISENGAGE_REASON_LAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lagging || !is_msg_valid(cfg->rx_checks, i)) {
|
// enforce minimum frequency for safety-relevant messages
|
||||||
|
bool frequency_invalid = frequency < 10U;
|
||||||
|
if (lagging || frequency_invalid || !is_msg_valid(cfg->rx_checks, i)) {
|
||||||
rx_checks_invalid = true;
|
rx_checks_invalid = true;
|
||||||
|
controls_allowed = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,6 +111,10 @@ int get_honda_hw(void);
|
|||||||
void mutation_set_active_mutant(int id);
|
void mutation_set_active_mutant(int id);
|
||||||
int mutation_get_active_mutant(void);
|
int mutation_get_active_mutant(void);
|
||||||
|
|
||||||
|
void ignition_can_hook(const CANPacket_t *msg);
|
||||||
|
bool get_ignition_can(void);
|
||||||
|
void set_ignition_can(bool c);
|
||||||
|
|
||||||
bool get_controls_allowed_lateral(void);
|
bool get_controls_allowed_lateral(void);
|
||||||
bool get_controls_requested_lateral(void);
|
bool get_controls_requested_lateral(void);
|
||||||
void set_current_safety_param_sp(uint16_t param);
|
void set_current_safety_param_sp(uint16_t param);
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ uint32_t microsecond_timer_get(void) {
|
|||||||
|
|
||||||
#include "opendbc/safety/can.h"
|
#include "opendbc/safety/can.h"
|
||||||
#include "opendbc/safety/safety.h"
|
#include "opendbc/safety/safety.h"
|
||||||
|
#include "opendbc/safety/ignition.h"
|
||||||
|
|
||||||
void safety_tick_current_safety_config() {
|
void safety_tick_current_safety_config() {
|
||||||
safety_tick(¤t_safety_config);
|
safety_tick(¤t_safety_config);
|
||||||
@@ -53,10 +54,18 @@ void set_relay_malfunction(bool c){
|
|||||||
relay_malfunction = c;
|
relay_malfunction = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_ignition_can(bool c){
|
||||||
|
ignition_can = c;
|
||||||
|
}
|
||||||
|
|
||||||
bool get_controls_allowed(void){
|
bool get_controls_allowed(void){
|
||||||
return controls_allowed;
|
return controls_allowed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get_ignition_can(void){
|
||||||
|
return ignition_can;
|
||||||
|
}
|
||||||
|
|
||||||
int get_alternative_experience(void){
|
int get_alternative_experience(void){
|
||||||
return alternative_experience;
|
return alternative_experience;
|
||||||
}
|
}
|
||||||
@@ -303,6 +312,9 @@ void init_tests(void){
|
|||||||
// assumes autopark on safety mode init to avoid a fault. get rid of that for testing
|
// assumes autopark on safety mode init to avoid a fault. get rid of that for testing
|
||||||
tesla_autopark = false;
|
tesla_autopark = false;
|
||||||
|
|
||||||
|
ignition_can = false;
|
||||||
|
ignition_can_cnt = 0U;
|
||||||
|
|
||||||
// reset MADS state to prevent leaking between tests
|
// reset MADS state to prevent leaking between tests
|
||||||
mads_set_system_state(false, false, false);
|
mads_set_system_state(false, false, false);
|
||||||
mads_button_press = MADS_BUTTON_UNAVAILABLE;
|
mads_button_press = MADS_BUTTON_UNAVAILABLE;
|
||||||
|
|||||||
@@ -249,5 +249,28 @@ class TestGmCameraEVNonACCSafety(TestGmCameraNonACCSafety, TestGmEVSafetyBase):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class TestGmIgnition(unittest.TestCase):
|
||||||
|
TX_MSGS: list = []
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.safety = libsafety_py.libsafety
|
||||||
|
self.safety.init_tests()
|
||||||
|
self.packer = CANPackerSafety("gm_global_a_powertrain_generated")
|
||||||
|
|
||||||
|
def _msg(self, mode):
|
||||||
|
return self.packer.make_can_msg_safety("BCMGeneralPlatformStatus", 0, {"SystemPowerMode": mode})
|
||||||
|
|
||||||
|
# SystemPowerMode 2=Run, 3=Crank Request
|
||||||
|
def test_ignition_on(self):
|
||||||
|
self.safety.ignition_can_hook(self._msg(2))
|
||||||
|
self.assertTrue(self.safety.get_ignition_can())
|
||||||
|
|
||||||
|
def test_ignition_off(self):
|
||||||
|
self.safety.ignition_can_hook(self._msg(2))
|
||||||
|
self.assertTrue(self.safety.get_ignition_can())
|
||||||
|
self.safety.ignition_can_hook(self._msg(0))
|
||||||
|
self.assertFalse(self.safety.get_ignition_can())
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ class TestHyundaiSafety(HyundaiButtonBase, common.CarSafetyTest, common.DriverTo
|
|||||||
raise unittest.SkipTest
|
raise unittest.SkipTest
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, 0)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, 0)
|
||||||
@@ -239,7 +239,7 @@ class TestHyundaiSafetyAltLimits(TestHyundaiSafety):
|
|||||||
raise unittest.SkipTest
|
raise unittest.SkipTest
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.ALT_LIMITS)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.ALT_LIMITS)
|
||||||
@@ -259,7 +259,7 @@ class TestHyundaiSafetyAltLimits2(TestHyundaiSafety):
|
|||||||
raise unittest.SkipTest
|
raise unittest.SkipTest
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.ALT_LIMITS_2)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.ALT_LIMITS_2)
|
||||||
@@ -278,7 +278,7 @@ class TestHyundaiSafetyCameraSCC(TestHyundaiSafety):
|
|||||||
raise unittest.SkipTest
|
raise unittest.SkipTest
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.CAMERA_SCC)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.CAMERA_SCC)
|
||||||
@@ -305,7 +305,7 @@ class TestHyundaiSafetyFCEV(TestHyundaiSafety):
|
|||||||
raise unittest.SkipTest
|
raise unittest.SkipTest
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.FCEV_GAS)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.FCEV_GAS)
|
||||||
@@ -318,7 +318,7 @@ class TestHyundaiSafetyFCEV(TestHyundaiSafety):
|
|||||||
|
|
||||||
class TestHyundaiLegacySafety(TestHyundaiSafety):
|
class TestHyundaiLegacySafety(TestHyundaiSafety):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiLegacy, 0)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiLegacy, 0)
|
||||||
self.safety.init_tests()
|
self.safety.init_tests()
|
||||||
@@ -326,7 +326,7 @@ class TestHyundaiLegacySafety(TestHyundaiSafety):
|
|||||||
|
|
||||||
class TestHyundaiLegacySafetyEV(TestHyundaiSafety):
|
class TestHyundaiLegacySafetyEV(TestHyundaiSafety):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiLegacy, HyundaiSafetyFlags.EV_GAS)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiLegacy, HyundaiSafetyFlags.EV_GAS)
|
||||||
self.safety.init_tests()
|
self.safety.init_tests()
|
||||||
@@ -338,7 +338,7 @@ class TestHyundaiLegacySafetyEV(TestHyundaiSafety):
|
|||||||
|
|
||||||
class TestHyundaiLegacySafetyHEV(TestHyundaiSafety):
|
class TestHyundaiLegacySafetyHEV(TestHyundaiSafety):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiLegacy, HyundaiSafetyFlags.HYBRID_GAS)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiLegacy, HyundaiSafetyFlags.HYBRID_GAS)
|
||||||
self.safety.init_tests()
|
self.safety.init_tests()
|
||||||
@@ -366,7 +366,7 @@ class TestHyundaiLongitudinalSafety(HyundaiLongitudinalBase, TestHyundaiSafety):
|
|||||||
raise unittest.SkipTest
|
raise unittest.SkipTest
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG)
|
||||||
@@ -414,7 +414,7 @@ class TestHyundaiLongitudinalSafetyCameraSCC(HyundaiLongitudinalBase, TestHyunda
|
|||||||
RELAY_MALFUNCTION_ADDRS = {0: (0x340, 0x485, 0x421, 0x420, 0x50A, 0x389)} # LKAS11, LFAHDA_MFC, SCC12, SCC11, SCC13, SCC14
|
RELAY_MALFUNCTION_ADDRS = {0: (0x340, 0x485, 0x421, 0x420, 0x50A, 0x389)} # LKAS11, LFAHDA_MFC, SCC12, SCC11, SCC13, SCC14
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(HyundaiSafetyFlagsSP.HAS_LDA_BUTTON)
|
self.safety.set_current_safety_param_sp(HyundaiSafetyFlagsSP.HAS_LDA_BUTTON)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG | HyundaiSafetyFlags.CAMERA_SCC)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG | HyundaiSafetyFlags.CAMERA_SCC)
|
||||||
@@ -454,7 +454,7 @@ class TestHyundaiSafetyFCEVLong(TestHyundaiLongitudinalSafety, TestHyundaiSafety
|
|||||||
raise unittest.SkipTest
|
raise unittest.SkipTest
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
self.safety.set_current_safety_param_sp(self.SAFETY_PARAM_SP)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.FCEV_GAS | HyundaiSafetyFlags.LONG)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.FCEV_GAS | HyundaiSafetyFlags.LONG)
|
||||||
@@ -475,7 +475,7 @@ class TestHyundaiLongitudinalESCCSafety(HyundaiLongitudinalBase, TestHyundaiSafe
|
|||||||
raise unittest.SkipTest
|
raise unittest.SkipTest
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(HyundaiSafetyFlagsSP.ESCC | self.SAFETY_PARAM_SP)
|
self.safety.set_current_safety_param_sp(HyundaiSafetyFlagsSP.ESCC | self.SAFETY_PARAM_SP)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, HyundaiSafetyFlags.LONG)
|
||||||
@@ -509,7 +509,7 @@ class TestHyundaiNonSCCSafety(TestHyundaiSafety):
|
|||||||
raise unittest.SkipTest
|
raise unittest.SkipTest
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(HyundaiSafetyFlagsSP.NON_SCC | self.SAFETY_PARAM_SP)
|
self.safety.set_current_safety_param_sp(HyundaiSafetyFlagsSP.NON_SCC | self.SAFETY_PARAM_SP)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, 0)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, 0)
|
||||||
@@ -565,7 +565,7 @@ class TestHyundaiNonSCCSafety_HEV_EV(TestHyundaiSafety):
|
|||||||
raise unittest.SkipTest
|
raise unittest.SkipTest
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.packer = CANPackerSafety("hyundai_kia_generic")
|
self.packer = CANPackerSafety("hyundai_can_generated")
|
||||||
self.safety = libsafety_py.libsafety
|
self.safety = libsafety_py.libsafety
|
||||||
self.safety.set_current_safety_param_sp(HyundaiSafetyFlagsSP.NON_SCC | self.SAFETY_PARAM_SP)
|
self.safety.set_current_safety_param_sp(HyundaiSafetyFlagsSP.NON_SCC | self.SAFETY_PARAM_SP)
|
||||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, self.SAFETY_PARAM)
|
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundai, self.SAFETY_PARAM)
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import unittest
|
|||||||
from opendbc.car.structs import CarParams
|
from opendbc.car.structs import CarParams
|
||||||
from opendbc.safety.tests.libsafety import libsafety_py
|
from opendbc.safety.tests.libsafety import libsafety_py
|
||||||
import opendbc.safety.tests.common as common
|
import opendbc.safety.tests.common as common
|
||||||
from opendbc.safety.tests.common import CANPackerSafety
|
from opendbc.safety.tests.common import CANPackerSafety, make_msg
|
||||||
|
|
||||||
|
|
||||||
class TestMazdaSafety(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest):
|
class TestMazdaSafety(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest):
|
||||||
@@ -81,5 +81,27 @@ class TestMazdaSafety(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTes
|
|||||||
self.assertTrue(self._tx(self._button_msg(resume=True)))
|
self.assertTrue(self._tx(self._button_msg(resume=True)))
|
||||||
|
|
||||||
|
|
||||||
|
class TestMazdaIgnition(unittest.TestCase):
|
||||||
|
TX_MSGS: list = []
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.safety = libsafety_py.libsafety
|
||||||
|
self.safety.init_tests()
|
||||||
|
|
||||||
|
def _msg(self, byte0):
|
||||||
|
return make_msg(0, 0x9E, dat=bytes([byte0]) + b"\x00" * 7)
|
||||||
|
|
||||||
|
# 0x9E byte 0 high 3 bits == 6 (0xC0)
|
||||||
|
def test_ignition_on(self):
|
||||||
|
self.safety.ignition_can_hook(self._msg(0xC0))
|
||||||
|
self.assertTrue(self.safety.get_ignition_can())
|
||||||
|
|
||||||
|
def test_ignition_off(self):
|
||||||
|
self.safety.ignition_can_hook(self._msg(0xC0))
|
||||||
|
self.assertTrue(self.safety.get_ignition_can())
|
||||||
|
self.safety.ignition_can_hook(self._msg(0x20))
|
||||||
|
self.assertFalse(self.safety.get_ignition_can())
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ class TestNissanSafety(common.CarSafetyTest, common.AngleSteeringSafetyTest):
|
|||||||
|
|
||||||
def _angle_meas_msg(self, angle: float):
|
def _angle_meas_msg(self, angle: float):
|
||||||
values = {"STEER_ANGLE": angle}
|
values = {"STEER_ANGLE": angle}
|
||||||
return self.packer.make_can_msg_safety("STEER_ANGLE_SENSOR", self.EPS_BUS, values)
|
return self.packer.make_can_msg_safety("STEER_TORQUE_SENSOR", 0, values)
|
||||||
|
|
||||||
def _pcm_status_msg(self, enable):
|
def _pcm_status_msg(self, enable):
|
||||||
values = {"CRUISE_ENABLED": enable}
|
values = {"CRUISE_ENABLED": enable}
|
||||||
|
|||||||
@@ -142,5 +142,36 @@ class TestRivianLongitudinalSafety(TestRivianSafetyBase):
|
|||||||
self.safety.init_tests()
|
self.safety.init_tests()
|
||||||
|
|
||||||
|
|
||||||
|
class TestRivianIgnition(unittest.TestCase):
|
||||||
|
TX_MSGS: list = []
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.safety = libsafety_py.libsafety
|
||||||
|
self.safety.init_tests()
|
||||||
|
self.packer = CANPackerSafety("rivian_primary_actuator")
|
||||||
|
|
||||||
|
def _msg(self, counter, mode):
|
||||||
|
return self.packer.make_can_msg_safety("VDM_OutputSignals", 0,
|
||||||
|
{"VDM_OutputSigs_Counter": counter,
|
||||||
|
"VDM_EpasPowerMode": mode})
|
||||||
|
|
||||||
|
# VDM_EpasPowerMode_Drive_On=1
|
||||||
|
def test_ignition_on(self):
|
||||||
|
for i in range(15):
|
||||||
|
self.safety.init_tests()
|
||||||
|
self.safety.ignition_can_hook(self._msg(i, 1))
|
||||||
|
self.assertFalse(self.safety.get_ignition_can())
|
||||||
|
self.safety.ignition_can_hook(self._msg((i + 1) % 15, 1))
|
||||||
|
self.assertTrue(self.safety.get_ignition_can())
|
||||||
|
|
||||||
|
def test_ignition_off(self):
|
||||||
|
self.safety.ignition_can_hook(self._msg(0, 1))
|
||||||
|
self.safety.ignition_can_hook(self._msg(1, 1))
|
||||||
|
self.assertTrue(self.safety.get_ignition_can())
|
||||||
|
self.safety.ignition_can_hook(self._msg(2, 0))
|
||||||
|
self.safety.ignition_can_hook(self._msg(3, 0))
|
||||||
|
self.assertFalse(self.safety.get_ignition_can())
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|||||||
@@ -459,6 +459,37 @@ class TestTeslaFSD14LongitudinalSafety(TestTeslaLongitudinalSafety):
|
|||||||
SAFETY_PARAM = TeslaSafetyFlags.LONG_CONTROL | TeslaSafetyFlags.FSD_14
|
SAFETY_PARAM = TeslaSafetyFlags.LONG_CONTROL | TeslaSafetyFlags.FSD_14
|
||||||
|
|
||||||
|
|
||||||
|
class TestTeslaIgnition(unittest.TestCase):
|
||||||
|
TX_MSGS: list = []
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.safety = libsafety_py.libsafety
|
||||||
|
self.safety.init_tests()
|
||||||
|
self.packer = CANPackerSafety("tesla_model3_party")
|
||||||
|
|
||||||
|
def _msg(self, counter, state):
|
||||||
|
return self.packer.make_can_msg_safety("VCFRONT_LVPowerState", 0,
|
||||||
|
{"VCFRONT_LVPowerStateCounter": counter,
|
||||||
|
"VCFRONT_vehiclePowerState": state})
|
||||||
|
|
||||||
|
# VEHICLE_POWER_STATE_DRIVE=3 (counter-gated)
|
||||||
|
def test_ignition_on(self):
|
||||||
|
for i in range(16):
|
||||||
|
self.safety.init_tests()
|
||||||
|
self.safety.ignition_can_hook(self._msg(i, 3))
|
||||||
|
self.assertFalse(self.safety.get_ignition_can())
|
||||||
|
self.safety.ignition_can_hook(self._msg((i + 1) % 16, 3))
|
||||||
|
self.assertTrue(self.safety.get_ignition_can())
|
||||||
|
|
||||||
|
def test_ignition_off(self):
|
||||||
|
self.safety.ignition_can_hook(self._msg(0, 3))
|
||||||
|
self.safety.ignition_can_hook(self._msg(1, 3))
|
||||||
|
self.assertTrue(self.safety.get_ignition_can())
|
||||||
|
self.safety.ignition_can_hook(self._msg(2, 2))
|
||||||
|
self.safety.ignition_can_hook(self._msg(3, 2))
|
||||||
|
self.assertFalse(self.safety.get_ignition_can())
|
||||||
|
|
||||||
|
|
||||||
class TestTeslaVehicleBusSafety(TestTeslaSafetyBase):
|
class TestTeslaVehicleBusSafety(TestTeslaSafetyBase):
|
||||||
|
|
||||||
LONGITUDINAL = False
|
LONGITUDINAL = False
|
||||||
|
|||||||
@@ -70,8 +70,10 @@ class TestToyotaSafetyBase(common.CarSafetyTest, common.LongitudinalAccelSafetyT
|
|||||||
def _accel_msg(self, accel, cancel_req=0):
|
def _accel_msg(self, accel, cancel_req=0):
|
||||||
return self._accel_msg_343(accel, cancel_req)
|
return self._accel_msg_343(accel, cancel_req)
|
||||||
|
|
||||||
def _speed_msg(self, speed):
|
def _speed_msg(self, speed, quality_flag=True):
|
||||||
values = {("WHEEL_SPEED_%s" % n): speed * 3.6 for n in ["FR", "FL", "RR", "RL"]}
|
values = {("WHEEL_SPEED_%s" % n): speed * 3.6 for n in ["FR", "FL", "RR", "RL"]}
|
||||||
|
if not quality_flag:
|
||||||
|
values |= {"WHEEL_SPEED_%s_FAULT" % n: 1.0 for n in ["FR", "FL", "RR", "RL"]}
|
||||||
return self.packer.make_can_msg_safety("WHEEL_SPEEDS", 0, values)
|
return self.packer.make_can_msg_safety("WHEEL_SPEEDS", 0, values)
|
||||||
|
|
||||||
def _user_brake_msg(self, brake):
|
def _user_brake_msg(self, brake):
|
||||||
@@ -138,6 +140,18 @@ class TestToyotaSafetyBase(common.CarSafetyTest, common.LongitudinalAccelSafetyT
|
|||||||
self.assertFalse(self._rx(msg))
|
self.assertFalse(self._rx(msg))
|
||||||
self.assertFalse(self.safety.get_controls_allowed())
|
self.assertFalse(self.safety.get_controls_allowed())
|
||||||
|
|
||||||
|
# quality flag tests
|
||||||
|
msg = self._speed_msg(0)
|
||||||
|
self.assertTrue(self._rx(msg))
|
||||||
|
|
||||||
|
msg = self._speed_msg(0, quality_flag=False)
|
||||||
|
self.assertFalse(self._rx(msg))
|
||||||
|
|
||||||
|
def test_vehicle_speed_measurements(self):
|
||||||
|
# OVERRIDDEN: 72.22_ is the max speed in m/s
|
||||||
|
self._common_measurement_test(self._speed_msg, 0, 259 / 3.6, 1,
|
||||||
|
self.safety.get_vehicle_speed_min, self.safety.get_vehicle_speed_max)
|
||||||
|
|
||||||
|
|
||||||
class TestToyotaSafetyGasInterceptorBase(GasInterceptorSafetyTest, TestToyotaSafetyBase):
|
class TestToyotaSafetyGasInterceptorBase(GasInterceptorSafetyTest, TestToyotaSafetyBase):
|
||||||
|
|
||||||
|
|||||||
40
opendbc/safety/tests/test_volkswagen_meb.py
Normal file
40
opendbc/safety/tests/test_volkswagen_meb.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from opendbc.safety.tests.libsafety import libsafety_py
|
||||||
|
from opendbc.safety.tests.common import CANPackerSafety
|
||||||
|
|
||||||
|
|
||||||
|
class TestVolkswagenMebIgnition(unittest.TestCase):
|
||||||
|
TX_MSGS: list = []
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.safety = libsafety_py.libsafety
|
||||||
|
self.safety.init_tests()
|
||||||
|
self.packer = CANPackerSafety("vw_meb")
|
||||||
|
|
||||||
|
def _msg(self, counter, ign):
|
||||||
|
return self.packer.make_can_msg_safety("Klemmen_Status_01", 0,
|
||||||
|
{"Klemmen_Status_01_BZ": counter,
|
||||||
|
"ZAS_Kl_15": ign})
|
||||||
|
|
||||||
|
# ZAS_Kl_15=1
|
||||||
|
def test_ignition_on(self):
|
||||||
|
for i in range(16):
|
||||||
|
self.safety.init_tests()
|
||||||
|
self.safety.ignition_can_hook(self._msg(i, 1))
|
||||||
|
self.assertFalse(self.safety.get_ignition_can())
|
||||||
|
self.safety.ignition_can_hook(self._msg((i + 1) % 16, 1))
|
||||||
|
self.assertTrue(self.safety.get_ignition_can())
|
||||||
|
|
||||||
|
def test_ignition_off(self):
|
||||||
|
self.safety.ignition_can_hook(self._msg(0, 1))
|
||||||
|
self.safety.ignition_can_hook(self._msg(1, 1))
|
||||||
|
self.assertTrue(self.safety.get_ignition_can())
|
||||||
|
self.safety.ignition_can_hook(self._msg(2, 0))
|
||||||
|
self.safety.ignition_can_hook(self._msg(3, 0))
|
||||||
|
self.assertFalse(self.safety.get_ignition_can())
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
@@ -656,23 +656,31 @@
|
|||||||
],
|
],
|
||||||
"package": "Co-Pilot360 Assist 2.0"
|
"package": "Co-Pilot360 Assist 2.0"
|
||||||
},
|
},
|
||||||
"Ford Focus 2018": {
|
"Ford Focus 2018-22": {
|
||||||
"platform": "FORD_FOCUS_MK4",
|
"platform": "FORD_FOCUS_MK4",
|
||||||
"make": "Ford",
|
"make": "Ford",
|
||||||
"brand": "ford",
|
"brand": "ford",
|
||||||
"model": "Focus",
|
"model": "Focus",
|
||||||
"year": [
|
"year": [
|
||||||
"2018"
|
"2018",
|
||||||
|
"2019",
|
||||||
|
"2020",
|
||||||
|
"2021",
|
||||||
|
"2022"
|
||||||
],
|
],
|
||||||
"package": "Adaptive Cruise Control with Lane Centering"
|
"package": "Adaptive Cruise Control with Lane Centering"
|
||||||
},
|
},
|
||||||
"Ford Focus Hybrid 2018": {
|
"Ford Focus Hybrid 2018-22": {
|
||||||
"platform": "FORD_FOCUS_MK4",
|
"platform": "FORD_FOCUS_MK4",
|
||||||
"make": "Ford",
|
"make": "Ford",
|
||||||
"brand": "ford",
|
"brand": "ford",
|
||||||
"model": "Focus Hybrid",
|
"model": "Focus Hybrid",
|
||||||
"year": [
|
"year": [
|
||||||
"2018"
|
"2018",
|
||||||
|
"2019",
|
||||||
|
"2020",
|
||||||
|
"2021",
|
||||||
|
"2022"
|
||||||
],
|
],
|
||||||
"package": "Adaptive Cruise Control with Lane Centering"
|
"package": "Adaptive Cruise Control with Lane Centering"
|
||||||
},
|
},
|
||||||
@@ -1606,6 +1614,17 @@
|
|||||||
],
|
],
|
||||||
"package": "Highway Driving Assist II"
|
"package": "Highway Driving Assist II"
|
||||||
},
|
},
|
||||||
|
"Hyundai Ioniq 6 (without HDA II) 2023-24": {
|
||||||
|
"platform": "HYUNDAI_IONIQ_6",
|
||||||
|
"make": "Hyundai",
|
||||||
|
"brand": "hyundai",
|
||||||
|
"model": "Ioniq 6 (without HDA II)",
|
||||||
|
"year": [
|
||||||
|
"2023",
|
||||||
|
"2024"
|
||||||
|
],
|
||||||
|
"package": "Highway Driving Assist"
|
||||||
|
},
|
||||||
"Hyundai Ioniq Electric 2019": {
|
"Hyundai Ioniq Electric 2019": {
|
||||||
"platform": "HYUNDAI_IONIQ_EV_LTD",
|
"platform": "HYUNDAI_IONIQ_EV_LTD",
|
||||||
"make": "Hyundai",
|
"make": "Hyundai",
|
||||||
@@ -2789,7 +2808,7 @@
|
|||||||
],
|
],
|
||||||
"package": "All"
|
"package": "All"
|
||||||
},
|
},
|
||||||
"Nissan Altima 2019-20, 2024": {
|
"Nissan Altima 2019-24": {
|
||||||
"platform": "NISSAN_ALTIMA",
|
"platform": "NISSAN_ALTIMA",
|
||||||
"make": "Nissan",
|
"make": "Nissan",
|
||||||
"brand": "nissan",
|
"brand": "nissan",
|
||||||
@@ -2797,6 +2816,9 @@
|
|||||||
"year": [
|
"year": [
|
||||||
"2019",
|
"2019",
|
||||||
"2020",
|
"2020",
|
||||||
|
"2021",
|
||||||
|
"2022",
|
||||||
|
"2023",
|
||||||
"2024"
|
"2024"
|
||||||
],
|
],
|
||||||
"package": "ProPILOT Assist"
|
"package": "ProPILOT Assist"
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ urls = { "homepage" = "https://github.com/commaai/opendbc" }
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"numpy",
|
"numpy",
|
||||||
"tqdm",
|
"tqdm",
|
||||||
"pycapnp==2.1.0",
|
"pycapnp",
|
||||||
"pycryptodome",
|
"pycryptodome",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
410
uv.lock
generated
410
uv.lock
generated
@@ -13,11 +13,11 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "certifi"
|
name = "certifi"
|
||||||
version = "2026.2.25"
|
version = "2026.4.22"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" },
|
{ url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -143,47 +143,47 @@ requires-dist = [{ name = "requests" }]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "coverage"
|
name = "coverage"
|
||||||
version = "7.13.5"
|
version = "7.14.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/9d/e0/70553e3000e345daff267cec284ce4cbf3fc141b6da229ac52775b5428f1/coverage-7.13.5.tar.gz", hash = "sha256:c81f6515c4c40141f83f502b07bbfa5c240ba25bbe73da7b33f1e5b6120ff179", size = 915967, upload-time = "2026-03-17T10:33:18.341Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/23/7f/d0720730a397a999ffc0fd3f5bebef347338e3a47b727da66fbb228e2ff2/coverage-7.14.0.tar.gz", hash = "sha256:057a6af2f160a85384cde4ab36f0d2777bae1057bae255f95413cdd382aa5c74", size = 919489, upload-time = "2026-05-10T18:02:31.397Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/4b/37/d24c8f8220ff07b839b2c043ea4903a33b0f455abe673ae3c03bbdb7f212/coverage-7.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66a80c616f80181f4d643b0f9e709d97bcea413ecd9631e1dedc7401c8e6695d", size = 219381, upload-time = "2026-03-17T10:30:14.68Z" },
|
{ url = "https://files.pythonhosted.org/packages/fc/e4/649c8d4f7f1709b6dbfc474358aa1bba02f67bcd52e2fec291a5014006cd/coverage-7.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a78e2a9d9c5e3b8d4ab9b9d28c985ea66fced0a7d7c2aec1f216e03a2011480", size = 219795, upload-time = "2026-05-10T17:59:48.198Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/35/8b/cd129b0ca4afe886a6ce9d183c44d8301acbd4ef248622e7c49a23145605/coverage-7.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:145ede53ccbafb297c1c9287f788d1bc3efd6c900da23bf6931b09eafc931587", size = 219880, upload-time = "2026-03-17T10:30:16.231Z" },
|
{ url = "https://files.pythonhosted.org/packages/7f/8d/46692d24b3f395d4cbf17bfcc57136b4f2f9c0c0df864b0bddfc1d71a014/coverage-7.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1816c505187592dcd1c5a5f226601a549f70365fbd00930ac88b0c225b76bb4", size = 220299, upload-time = "2026-05-10T17:59:49.683Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/55/2f/e0e5b237bffdb5d6c530ce87cc1d413a5b7d7dfd60fb067ad6d254c35c76/coverage-7.13.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0672854dc733c342fa3e957e0605256d2bf5934feeac328da9e0b5449634a642", size = 250303, upload-time = "2026-03-17T10:30:17.748Z" },
|
{ url = "https://files.pythonhosted.org/packages/12/c2/a40f5cb295bbcbb697a76947a56081c494c61950366294ee426ffe261099/coverage-7.14.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d8e1762f0e9cbc26ec315471e7b47855218e833cd5a032d706fbf43845d878c7", size = 250721, upload-time = "2026-05-10T17:59:51.494Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/92/be/b1afb692be85b947f3401375851484496134c5554e67e822c35f28bf2fbc/coverage-7.13.5-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ec10e2a42b41c923c2209b846126c6582db5e43a33157e9870ba9fb70dc7854b", size = 252218, upload-time = "2026-03-17T10:30:19.804Z" },
|
{ url = "https://files.pythonhosted.org/packages/fd/35/202235eb5c3c14c212462cd91d61b7386bf8fc44bc7a77f4742d2a69174b/coverage-7.14.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9336e23e8bb3a3925398261385e2a1533957d3e760e91070dcb0e98bfa514eed", size = 252633, upload-time = "2026-05-10T17:59:53.244Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/da/69/2f47bb6fa1b8d1e3e5d0c4be8ccb4313c63d742476a619418f85740d597b/coverage-7.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be3d4bbad9d4b037791794ddeedd7d64a56f5933a2c1373e18e9e568b9141686", size = 254326, upload-time = "2026-03-17T10:30:21.321Z" },
|
{ url = "https://files.pythonhosted.org/packages/bb/80/5f596e8995785124ee191c42535664c5e62c65995b66f4ca21e28ae04c81/coverage-7.14.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cd1169b2230f9cbe9c638ba38022ed7a2b1e641cc07f7cea0365e4be2a74980", size = 254743, upload-time = "2026-05-10T17:59:55.021Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d5/d0/79db81da58965bd29dabc8f4ad2a2af70611a57cba9d1ec006f072f30a54/coverage-7.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d2afbc5cc54d286bfb54541aa50b64cdb07a718227168c87b9e2fb8f25e1743", size = 256267, upload-time = "2026-03-17T10:30:23.094Z" },
|
{ url = "https://files.pythonhosted.org/packages/1e/6d/0d178825be2350f0adb27984d0aa7cf84bbdab201f6fb926b535d23a8f5f/coverage-7.14.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d1bb3543b58fea74d2cd1abc4054cc927e4724687cb4560cd2ed88d2c7d820c0", size = 256700, upload-time = "2026-05-10T17:59:56.511Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e5/32/d0d7cc8168f91ddab44c0ce4806b969df5f5fdfdbb568eaca2dbc2a04936/coverage-7.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3ad050321264c49c2fa67bb599100456fc51d004b82534f379d16445da40fb75", size = 250430, upload-time = "2026-03-17T10:30:25.311Z" },
|
{ url = "https://files.pythonhosted.org/packages/19/5b/9e549c2f6e9dfea472adadba06c294e64735dabc2dd19015fac082095013/coverage-7.14.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a93bac2cb577ef60074999ed56d8a1535894398e2ed920d4185c3ec0c8864742", size = 250854, upload-time = "2026-05-10T17:59:57.94Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4d/06/a055311d891ddbe231cd69fdd20ea4be6e3603ffebddf8704b8ca8e10a3c/coverage-7.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7300c8a6d13335b29bb76d7651c66af6bd8658517c43499f110ddc6717bfc209", size = 252017, upload-time = "2026-03-17T10:30:27.284Z" },
|
{ url = "https://files.pythonhosted.org/packages/3d/1c/b94f9f5f36396021ee2f62c5834b12e6a3d31f0bed5d6fc6d1c3caec087c/coverage-7.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5904abf7e18cddc463219b17552229650c6b79e061d31a1059283051169cf7d5", size = 252433, upload-time = "2026-05-10T17:59:59.688Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d6/f6/d0fd2d21e29a657b5f77a2fe7082e1568158340dceb941954f776dce1b7b/coverage-7.13.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:eb07647a5738b89baab047f14edd18ded523de60f3b30e75c2acc826f79c839a", size = 250080, upload-time = "2026-03-17T10:30:29.481Z" },
|
{ url = "https://files.pythonhosted.org/packages/b5/cb/d192cd8e1345eccabc32016f2d39072ecd10cb4f4b983ed8d0ebdeaf00dc/coverage-7.14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:741f57cddc9004a8c81b084660215f33a6b597dbe62c31386b983ee26310e327", size = 250494, upload-time = "2026-05-10T18:00:01.953Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4e/ab/0d7fb2efc2e9a5eb7ddcc6e722f834a69b454b7e6e5888c3a8567ecffb31/coverage-7.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9adb6688e3b53adffefd4a52d72cbd8b02602bfb8f74dcd862337182fd4d1a4e", size = 253843, upload-time = "2026-03-17T10:30:31.301Z" },
|
{ url = "https://files.pythonhosted.org/packages/53/c5/aac9f460a41d835dbddef1d377f105f6ac2311d0f3c1588e9f51046d8813/coverage-7.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:664123feb0929d7affc135717dbd70d61d98688a08ab1e5ba464739620c6252d", size = 254261, upload-time = "2026-05-10T18:00:03.779Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ba/6f/7467b917bbf5408610178f62a49c0ed4377bb16c1657f689cc61470da8ce/coverage-7.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7c8d4bc913dd70b93488d6c496c77f3aff5ea99a07e36a18f865bca55adef8bd", size = 249802, upload-time = "2026-03-17T10:30:33.358Z" },
|
{ url = "https://files.pythonhosted.org/packages/23/aa/7af7c0081980a9cb3d289c5a435a4b7657dcecbd128e25c580e6a50389b5/coverage-7.14.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c83d2399a51bbec8429266905d33616f04bc5726b1138c35844d5fcd896b2e20", size = 250216, upload-time = "2026-05-10T18:00:05.262Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/75/2c/1172fb689df92135f5bfbbd69fc83017a76d24ea2e2f3a1154007e2fb9f8/coverage-7.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0e3c426ffc4cd952f54ee9ffbdd10345709ecc78a3ecfd796a57236bfad0b9b8", size = 250707, upload-time = "2026-03-17T10:30:35.2Z" },
|
{ url = "https://files.pythonhosted.org/packages/35/60/a4257538ce2f6b978aeb51870d6c4208c510928a03db7e0339bb625dccb7/coverage-7.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb2e855b87321259a037429288ae85216d191c74de3e79bf57cd2bc0761992c", size = 251125, upload-time = "2026-05-10T18:00:06.858Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/67/21/9ac389377380a07884e3b48ba7a620fcd9dbfaf1d40565facdc6b36ec9ef/coverage-7.13.5-cp311-cp311-win32.whl", hash = "sha256:259b69bb83ad9894c4b25be2528139eecba9a82646ebdda2d9db1ba28424a6bf", size = 221880, upload-time = "2026-03-17T10:30:36.775Z" },
|
{ url = "https://files.pythonhosted.org/packages/a1/ab/f91af47642ec1aa53490e835a95847168d9c77fc39aa58527604c051e145/coverage-7.14.0-cp311-cp311-win32.whl", hash = "sha256:731dc15b385ac52289743d476245b61e1a2927e803bef655b52bc3b2a75a21f3", size = 222300, upload-time = "2026-05-10T18:00:08.608Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/af/7f/4cd8a92531253f9d7c1bbecd9fa1b472907fb54446ca768c59b531248dc5/coverage-7.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:258354455f4e86e3e9d0d17571d522e13b4e1e19bf0f8596bcf9476d61e7d8a9", size = 222816, upload-time = "2026-03-17T10:30:38.891Z" },
|
{ url = "https://files.pythonhosted.org/packages/f0/f0/a71ddbd874431e7a7cd96071f0c331cfbbad07704833c765d24ffbab8a67/coverage-7.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:bfb0ed8ec5d25e93face268115d7964db9df8b9aae8edcde9ec6b16c726a7cc1", size = 223241, upload-time = "2026-05-10T18:00:10.746Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/12/a6/1d3f6155fb0010ca68eba7fe48ca6c9da7385058b77a95848710ecf189b1/coverage-7.13.5-cp311-cp311-win_arm64.whl", hash = "sha256:bff95879c33ec8da99fc9b6fe345ddb5be6414b41d6d1ad1c8f188d26f36e028", size = 221483, upload-time = "2026-03-17T10:30:40.463Z" },
|
{ url = "https://files.pythonhosted.org/packages/d8/6e/d9d312a5151a96cd110efee32efc3fc97b01ebd86203fe618ccb29cf4c92/coverage-7.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:7ebb1c6df9f78046a1b1e0a89674cd4bf73b7c648914eebcf976a57fd99a5627", size = 221908, upload-time = "2026-05-10T18:00:12.242Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a0/c3/a396306ba7db865bf96fc1fb3b7fd29bcbf3d829df642e77b13555163cd6/coverage-7.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:460cf0114c5016fa841214ff5564aa4864f11948da9440bc97e21ad1f4ba1e01", size = 219554, upload-time = "2026-03-17T10:30:42.208Z" },
|
{ url = "https://files.pythonhosted.org/packages/09/1e/2f996b2c8415cbb6f54b0f5ec1ee850c96d7911961afb4fc05f4a89d8c58/coverage-7.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7ffd19fc8aed057fd686a17a4935eef5f9859d69208f96310e893e64b9b6ccf5", size = 219967, upload-time = "2026-05-10T18:00:13.756Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a6/16/a68a19e5384e93f811dccc51034b1fd0b865841c390e3c931dcc4699e035/coverage-7.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e223ce4b4ed47f065bfb123687686512e37629be25cc63728557ae7db261422", size = 219908, upload-time = "2026-03-17T10:30:43.906Z" },
|
{ url = "https://files.pythonhosted.org/packages/34/23/35c7aea1274aef7525bdd2dc92f710bdde6d11652239d71d1ec450067939/coverage-7.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:829994cfe1aeb773ca27bf246d4badc1e764893e3bfb98fff820fcecd1ca4662", size = 220329, upload-time = "2026-05-10T18:00:15.264Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/29/72/20b917c6793af3a5ceb7fb9c50033f3ec7865f2911a1416b34a7cfa0813b/coverage-7.13.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e3370441f4513c6252bf042b9c36d22491142385049243253c7e48398a15a9f", size = 251419, upload-time = "2026-03-17T10:30:45.545Z" },
|
{ url = "https://files.pythonhosted.org/packages/75/cf/a8f4b43a16e194b0261257ad28ded5853ec052570afef4a84e1d81189f3b/coverage-7.14.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b4f07cf7edcb7ec39431a5074d7ea83b29a9f71fcfc494f0f40af4e65180420f", size = 251839, upload-time = "2026-05-10T18:00:17.16Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8c/49/cd14b789536ac6a4778c453c6a2338bc0a2fb60c5a5a41b4008328b9acc1/coverage-7.13.5-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:03ccc709a17a1de074fb1d11f217342fb0d2b1582ed544f554fc9fc3f07e95f5", size = 254159, upload-time = "2026-03-17T10:30:47.204Z" },
|
{ url = "https://files.pythonhosted.org/packages/69/ff/6699e7b71e60d3049eb2bdcbc95ee3f35707b2b0e48f32e9e63d3ce30c08/coverage-7.14.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca3d9cf2c32b521bd9518385608787fa86f38daf993695307531822c3430ed67", size = 254576, upload-time = "2026-05-10T18:00:18.829Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9d/00/7b0edcfe64e2ed4c0340dac14a52ad0f4c9bd0b8b5e531af7d55b703db7c/coverage-7.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3f4818d065964db3c1c66dc0fbdac5ac692ecbc875555e13374fdbe7eedb4376", size = 255270, upload-time = "2026-03-17T10:30:48.812Z" },
|
{ url = "https://files.pythonhosted.org/packages/22/ec/c936d495fcd67f48f03a9c4ad3297ff80d1f222a5df3980f15b34c186c21/coverage-7.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92af52828e7f29d827346b0294e5a0853fa206db77db0395b282918d41e28db9", size = 255690, upload-time = "2026-05-10T18:00:20.648Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/93/89/7ffc4ba0f5d0a55c1e84ea7cee39c9fc06af7b170513d83fbf3bbefce280/coverage-7.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256", size = 257538, upload-time = "2026-03-17T10:30:50.77Z" },
|
{ url = "https://files.pythonhosted.org/packages/5c/42/5af63f636cc62a4a2b1b3ba9146f6ee6f53a35a50d5cefc54d5670f60999/coverage-7.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7b2bb6c9d7e769360d0f20a0f219603fd64f0c8f97de17ab25853261602be0fb", size = 257949, upload-time = "2026-05-10T18:00:22.28Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/81/bd/73ddf85f93f7e6fa83e77ccecb6162d9415c79007b4bc124008a4995e4a7/coverage-7.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8dd02af98971bdb956363e4827d34425cb3df19ee550ef92855b0acb9c7ce51c", size = 251821, upload-time = "2026-03-17T10:30:52.5Z" },
|
{ url = "https://files.pythonhosted.org/packages/26/d3/a225317bd2012132a27e1176d51660b826f99bb975876463c44ea0d7ee5a/coverage-7.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c9ed6ef99f88fb8c14aa8e2bf8eb0fe55fa2edfea68f8675d78741df1a5ac0e", size = 252242, upload-time = "2026-05-10T18:00:24.076Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a0/81/278aff4e8dec4926a0bcb9486320752811f543a3ce5b602cc7a29978d073/coverage-7.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f08fd75c50a760c7eb068ae823777268daaf16a80b918fa58eea888f8e3919f5", size = 253191, upload-time = "2026-03-17T10:30:54.543Z" },
|
{ url = "https://files.pythonhosted.org/packages/f1/7f/9e65495298c3ea414742998539c37d048b5e81cc818fb1828cc6b51d10bf/coverage-7.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8231ade007f37959fbf58acc677f26b922c02eda6f0428ea307da0fd39681bf3", size = 253608, upload-time = "2026-05-10T18:00:25.588Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/70/ee/fe1621488e2e0a58d7e94c4800f0d96f79671553488d401a612bebae324b/coverage-7.13.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:843ea8643cf967d1ac7e8ecd4bb00c99135adf4816c0c0593fdcc47b597fcf09", size = 251337, upload-time = "2026-03-17T10:30:56.663Z" },
|
{ url = "https://files.pythonhosted.org/packages/94/46/1522b524a35bdad22b2b8c4f9d32d0a104b524726ec380b2db68db1746f5/coverage-7.14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d8b013632cc1ce1d09dbe4f32667b4d320ec2f54fc326ebeffcd0b0bcc2bb6c4", size = 251753, upload-time = "2026-05-10T18:00:27.104Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/37/a6/f79fb37aa104b562207cc23cb5711ab6793608e246cae1e93f26b2236ed9/coverage-7.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:9d44d7aa963820b1b971dbecd90bfe5fe8f81cff79787eb6cca15750bd2f79b9", size = 255404, upload-time = "2026-03-17T10:30:58.427Z" },
|
{ url = "https://files.pythonhosted.org/packages/f3/e9/cdf00d38817742c541ade405e115a3f7bf36e6f2a8b99d4f209861b85a2d/coverage-7.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1733198802d71ec4c524f322e2867ee05c62e9e75df86bdca545407a221827d1", size = 255823, upload-time = "2026-05-10T18:00:29.038Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/75/f0/ed15262a58ec81ce457ceb717b7f78752a1713556b19081b76e90896e8d4/coverage-7.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7132bed4bd7b836200c591410ae7d97bf7ae8be6fc87d160b2bd881df929e7bf", size = 250903, upload-time = "2026-03-17T10:31:00.093Z" },
|
{ url = "https://files.pythonhosted.org/packages/38/fc/5e7877cf5f902d08a17ff1c532511476d87e1bea355bd5028cb97f902e79/coverage-7.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:72a305291fa8ee01332f1aaf38b348ca34097f6aa0b0ef627eef2837e57bbba5", size = 251323, upload-time = "2026-05-10T18:00:30.647Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0f/e9/9129958f20e7e9d4d56d51d42ccf708d15cac355ff4ac6e736e97a9393d2/coverage-7.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a698e363641b98843c517817db75373c83254781426e94ada3197cabbc2c919c", size = 252780, upload-time = "2026-03-17T10:31:01.916Z" },
|
{ url = "https://files.pythonhosted.org/packages/18/9d/50f05a72dff8487464fdd4178dda5daed642a060e60afb644e3d45123559/coverage-7.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fcaba850dd317c65423a9d63d88f9573c53b00354d6dd95724576cc98a131595", size = 253197, upload-time = "2026-05-10T18:00:32.211Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a4/d7/0ad9b15812d81272db94379fe4c6df8fd17781cc7671fdfa30c76ba5ff7b/coverage-7.13.5-cp312-cp312-win32.whl", hash = "sha256:bdba0a6b8812e8c7df002d908a9a2ea3c36e92611b5708633c50869e6d922fdf", size = 222093, upload-time = "2026-03-17T10:31:03.642Z" },
|
{ url = "https://files.pythonhosted.org/packages/00/3f/6f61ffe6439df266c3cf60f5c99cfaa21103d0210d706a42fc6c30683ff8/coverage-7.14.0-cp312-cp312-win32.whl", hash = "sha256:5ac83957a80d0701310e96d8bec68cdcf4f90a7674b7d13f15a344315b41ab27", size = 222515, upload-time = "2026-05-10T18:00:33.717Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/29/3d/821a9a5799fac2556bcf0bd37a70d1d11fa9e49784b6d22e92e8b2f85f18/coverage-7.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:d2c87e0c473a10bffe991502eac389220533024c8082ec1ce849f4218dded810", size = 222900, upload-time = "2026-03-17T10:31:05.651Z" },
|
{ url = "https://files.pythonhosted.org/packages/85/19/93853133df2cb371083285ef6a93982a0173e7a233b0f61373ba9fd30eb2/coverage-7.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:70390b0da32cb90b501953716302906e8bcce087cb283e70d8c97729f22e92b2", size = 223324, upload-time = "2026-05-10T18:00:35.172Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d4/fa/2238c2ad08e35cf4f020ea721f717e09ec3152aea75d191a7faf3ef009a8/coverage-7.13.5-cp312-cp312-win_arm64.whl", hash = "sha256:bf69236a9a81bdca3bff53796237aab096cdbf8d78a66ad61e992d9dac7eb2de", size = 221515, upload-time = "2026-03-17T10:31:07.293Z" },
|
{ url = "https://files.pythonhosted.org/packages/74/18/9f7fe62f659f24b7a82a0be56bf94c1bd0a89e0ae7ab4c668f6e82404294/coverage-7.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:91b993743d959b8be85b4abf9d5478216a69329c321efe5be0433c1a841d691d", size = 221944, upload-time = "2026-05-10T18:00:37.014Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" },
|
{ url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cppcheck"
|
name = "cppcheck"
|
||||||
version = "2.16.0"
|
version = "2.16.0"
|
||||||
source = { git = "https://github.com/commaai/dependencies.git?subdirectory=cppcheck&rev=release-cppcheck#b631125c6c762b2ff19df670401b462dd75fb19f" }
|
source = { git = "https://github.com/commaai/dependencies.git?subdirectory=cppcheck&rev=release-cppcheck#d7f7aeedd5b9b3eddb4945ae81434ac0fd4fe549" }
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cpplint"
|
name = "cpplint"
|
||||||
@@ -224,11 +224,11 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "idna"
|
name = "idna"
|
||||||
version = "3.11"
|
version = "3.15"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
|
{ url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -254,63 +254,63 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lefthook"
|
name = "lefthook"
|
||||||
version = "2.1.4"
|
version = "2.1.6"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/3c/c1/0e76e13ff1cc52e6dcf295d6b1d9ea18eb7b48bda54075cbdcc0aa6df20c/lefthook-2.1.4-py3-none-macosx_10_15_x86_64.whl", hash = "sha256:f1dc03042222ee7f1ee7dbbae7ee3046beb9a12ebdfae09bca1107c19c1be988", size = 5432992, upload-time = "2026-03-12T07:25:17.326Z" },
|
{ url = "https://files.pythonhosted.org/packages/5a/1c/95addeea6b681f02cd44e40d8ce970973783f7b48081af88d3831c4f6da6/lefthook-2.1.6-py3-none-macosx_10_15_x86_64.whl", hash = "sha256:6d4608d0bb9dbcf10d333132973941c21bc7cde31a328658611e2066eec26d7e", size = 5439518, upload-time = "2026-04-16T07:34:18.136Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/53/73/93f1a67afac0fa97c38004c43eb14df97414b6d3b4b0069b6d2b96b9de10/lefthook-2.1.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8db48e35307394cf0277d199b3b5a541324308642a16c3b3a9de688d64e165d", size = 4957289, upload-time = "2026-03-12T07:25:26.561Z" },
|
{ url = "https://files.pythonhosted.org/packages/cd/d4/2c645051bed898f1ad377e7c2e611e0f857502ca76d052db0f8333bb668d/lefthook-2.1.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fa6395917dc510c2622f31b6d3992c5506ff2a7569cd9d321712ec29689229b3", size = 4964898, upload-time = "2026-04-16T07:34:13.497Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/03/70/2b5641a32f4ae7f31f38d67e987c4943d1f0ec401395e779c03dbca2484b/lefthook-2.1.4-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:31300ac6bde3512a62252da4c6e0685b5c5d0adefb5dfa1f7f5e1f0aea63ba8b", size = 4785792, upload-time = "2026-03-12T07:25:21.731Z" },
|
{ url = "https://files.pythonhosted.org/packages/19/ea/15b0384c1227ad172af0c18f21f7e00c570ccce086af471ac32edc2cb507/lefthook-2.1.6-py3-none-manylinux_2_17_aarch64.whl", hash = "sha256:016295036dd1d94af7ea6604247f0c47102559fb12f97ffcfe7880e8d1ce7a1f", size = 4791370, upload-time = "2026-04-16T07:34:15.04Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8d/58/b6253c7ba669ecb21300c03ba0342e30392d2a22d3d54a7dfa398beb5bcd/lefthook-2.1.4-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:9b4e34d5771bb4484e10df644ad0bb3e348ac026d8c2305b9a151e932fc3e2b8", size = 5359026, upload-time = "2026-03-12T07:25:23.372Z" },
|
{ url = "https://files.pythonhosted.org/packages/aa/c0/3d43c9e1a08fa79d53f0c6eb808fb0ae9becf29bc7bd89cd757470af040e/lefthook-2.1.6-py3-none-manylinux_2_17_x86_64.whl", hash = "sha256:6c00cd91d553e064a2f71c35d2497b4350d1efdf18dd8f2c7ce2b1d6e8e2e147", size = 5367784, upload-time = "2026-04-16T07:34:10.414Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a0/d2/a9ae9afe0b728b4eae171c5f95b1f57d213154533fbfb0cbb9281c3c60e9/lefthook-2.1.4-py3-none-win_amd64.whl", hash = "sha256:d8ae5640d4393e460d00f9b53cc60c9f8112b6194c1d85efd9cad9682e1e91ac", size = 5509363, upload-time = "2026-03-12T07:25:24.961Z" },
|
{ url = "https://files.pythonhosted.org/packages/e6/99/cad1e694989964a8a79b34fdd18e6642bc631e280c06a9341565b5861e3b/lefthook-2.1.6-py3-none-win_amd64.whl", hash = "sha256:e571c48a227f51e5b8aec117c550c6d2ad1f74034e87afd5b0c98cbef319ad3e", size = 5516604, upload-time = "2026-04-16T07:34:12.061Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2a/44/ab9d096f758f8de7e45a80eb5b49a60dbb5b12de20df308489cc4738ed50/lefthook-2.1.4-py3-none-win_arm64.whl", hash = "sha256:8c7ae0094d8d946cab0fd7977a9cd935a4c2d302401a561ab64bb175c6b5eb9d", size = 4862370, upload-time = "2026-03-12T07:25:19.554Z" },
|
{ url = "https://files.pythonhosted.org/packages/85/e9/286657a2c7efbb8701380c4c8a08c54d7f58938a4610d660c463fa074ee3/lefthook-2.1.6-py3-none-win_arm64.whl", hash = "sha256:985b88d908067a6d48a0e89cbc20c18b6a68a3fc4d44387f8ac1c39b85f0f18b", size = 4867769, upload-time = "2026-04-16T07:34:16.757Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lxml"
|
name = "lxml"
|
||||||
version = "6.0.4"
|
version = "6.1.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/ce/08/1217ca4043f55c3c92993b283a7dbfa456a2058d8b57bbb416cc96b6efff/lxml-6.0.4.tar.gz", hash = "sha256:4137516be2a90775f99d8ef80ec0283f8d78b5d8bd4630ff20163b72e7e9abf2", size = 4237780, upload-time = "2026-04-12T16:28:24.182Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/28/30/9abc9e34c657c33834eaf6cd02124c61bdf5944d802aa48e69be8da3585d/lxml-6.1.0.tar.gz", hash = "sha256:bfd57d8008c4965709a919c3e9a98f76c2c7cb319086b3d26858250620023b13", size = 4197006, upload-time = "2026-04-18T04:32:51.613Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/15/93/5145f2c9210bf99c01f2f54d364be805f556f2cb13af21d3c2d80e0780bb/lxml-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3602d57fdb6f744f4c5d0bd49513fe5abbced08af85bba345fc354336667cd47", size = 8525003, upload-time = "2026-04-12T16:23:34.045Z" },
|
{ url = "https://files.pythonhosted.org/packages/5e/5d/3bccad330292946f97962df9d5f2d3ae129cce6e212732a781e856b91e07/lxml-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cec05be8c876f92a5aa07b01d60bbb4d11cfbdd654cad0561c0d7b5c043a61b9", size = 8526232, upload-time = "2026-04-18T04:27:40.389Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/93/19/9d61560a53ac1b26aec1a83ae51fadbe0cc0b6534e2c753ad5af854f231b/lxml-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8c7976c384dcab4bca42f371449fb711e20f1bfce99c135c9b25614aed80e55", size = 4594697, upload-time = "2026-04-12T16:23:36.403Z" },
|
{ url = "https://files.pythonhosted.org/packages/a7/51/adc8826570a112f83bb4ddb3a2ab510bbc2ccd62c1b9fe1f34fae2d90b57/lxml-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c03e048b6ce8e77b09c734e931584894ecd58d08296804ca2d0b184c933ce50", size = 4595448, upload-time = "2026-04-18T04:27:44.208Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/93/1a/0db40884f959c94ede238507ea0967dd47527ab11d130c5a571088637e78/lxml-6.0.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:579e20c120c3d231e53f0376058e4e1926b71ca4f7b77a7a75f82aea7a9b501e", size = 4922365, upload-time = "2026-04-12T16:23:38.709Z" },
|
{ url = "https://files.pythonhosted.org/packages/54/84/5a9ec07cbe1d2334a6465f863b949a520d2699a755738986dcd3b6b89e3f/lxml-6.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:942454ff253da14218f972b23dc72fa4edf6c943f37edd19cd697618b626fac5", size = 4923771, upload-time = "2026-04-18T04:32:17.402Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/04/db/4136fab3201087bd5a4db433b9a36e50808d8af759045e7d7af757b46178/lxml-6.0.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f32a27be5fb286febd16c0d13d4a3aee474d34417bd172e64d76c6a28e2dc14", size = 5066748, upload-time = "2026-04-12T16:23:41.048Z" },
|
{ url = "https://files.pythonhosted.org/packages/a7/23/851cfa33b6b38adb628e45ad51fb27105fa34b2b3ba9d1d4aa7a9428dfe0/lxml-6.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d036ee7b99d5148072ac7c9b847193decdfeac633db350363f7bce4fff108f0e", size = 5068101, upload-time = "2026-04-18T04:32:21.437Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/03/d9/aad543afc57e6268200332ebe695be0320fdd2219b175d34a52027aa1bad/lxml-6.0.4-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d53b7cdaa961a4343312964f6c5a150d075a55e95e1338078d413bf38eba8c0", size = 5000464, upload-time = "2026-04-12T16:23:42.946Z" },
|
{ url = "https://files.pythonhosted.org/packages/b0/38/41bf99c2023c6b79916ba057d83e9db21d642f473cac210201222882d38b/lxml-6.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ae5d8d5427f3cc317e7950f2da7ad276df0cfa37b8de2f5658959e618ea8512", size = 5002573, upload-time = "2026-04-18T04:32:25.373Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ab/92/14cc575b97dedf02eb8de96af8d977f06b9f2500213805165606ff06c011/lxml-6.0.4-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d4cc697347f6c61764b58767109e270d0b4a92aba4a8053a967ed9de23a5ea9", size = 5201395, upload-time = "2026-04-12T16:23:45.227Z" },
|
{ url = "https://files.pythonhosted.org/packages/c2/20/053aa10bdc39747e1e923ce2d45413075e84f70a136045bb09e5eaca41d3/lxml-6.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:363e47283bde87051b821826e71dde47f107e08614e1aa312ba0c5711e77738c", size = 5202816, upload-time = "2026-04-18T04:32:29.393Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a7/72/0ff17f32a737a9c2840f781aee4bbd5cec947b966ff0c74c5dec56098beb/lxml-6.0.4-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:108b8d6da624133eaa1a6a5bbcb1f116b878ea9fd050a1724792d979251706fb", size = 5329108, upload-time = "2026-04-12T16:23:48.094Z" },
|
{ url = "https://files.pythonhosted.org/packages/9a/da/bc710fad8bf04b93baee752c192eaa2210cd3a84f969d0be7830fea55802/lxml-6.1.0-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:f504d861d9f2a8f94020130adac88d66de93841707a23a86244263d1e54682f5", size = 5329999, upload-time = "2026-04-18T04:32:34.019Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f7/f7/3b1f43e0db54462b5f1ebd96ee43b240388e3b9bf372546694175bec2d41/lxml-6.0.4-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:c087d643746489df06fe3ac03460d235b4b3ae705e25838257510c79f834e50f", size = 4658132, upload-time = "2026-04-12T16:23:50.279Z" },
|
{ url = "https://files.pythonhosted.org/packages/b3/cb/bf035dedbdf7fab49411aa52e4236f3445e98d38647d85419e6c0d2806b9/lxml-6.1.0-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:23a5dc68e08ed13331d61815c08f260f46b4a60fdd1640bbeb82cf89a9d90289", size = 4659643, upload-time = "2026-04-18T04:32:37.932Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/94/cb/90513445e4f08c500f953543aadf18501e5438b31bc816d0ce9a5e09cc5c/lxml-6.0.4-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2063c486f80c32a576112201c93269a09ebeca5b663092112c5fb39b32556340", size = 5264665, upload-time = "2026-04-12T16:23:52.397Z" },
|
{ url = "https://files.pythonhosted.org/packages/5c/4f/22be31f33727a5e4c7b01b0a874503026e50329b259d3587e0b923cf964b/lxml-6.1.0-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f15401d8d3dbf239e23c818afc10c7207f7b95f9a307e092122b6f86dd43209a", size = 5265963, upload-time = "2026-04-18T04:32:41.881Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/17/d2/c1fa939ea0fa75190dd452d9246f97c16372e2d593fe9f4684cae5c37dda/lxml-6.0.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ff016e86ec14ae96253a3834302e0e89981956b73e4e74617eeba4a6a81da08b", size = 5043801, upload-time = "2026-04-12T16:23:55.634Z" },
|
{ url = "https://files.pythonhosted.org/packages/c8/2b/d44d0e5c79226017f4ab8c87a802ebe4f89f97e6585a8e4166dffcdd7b6e/lxml-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fcf3da95e93349e0647d48d4b36a12783105bcc74cb0c416952f9988410846a3", size = 5045444, upload-time = "2026-04-18T04:32:44.512Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/22/d4/01cdd3c367045526a376cc1eadacf647f193630db3f902b8842a76b3eb2e/lxml-6.0.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:0e9ba5bcd75efb8cb4613463e6cfb55b5a76d4143e4cfa06ea027bc6cc696a3e", size = 4711416, upload-time = "2026-04-12T16:23:57.647Z" },
|
{ url = "https://files.pythonhosted.org/packages/d3/c3/3f034fec1594c331a6dbf9491238fdcc9d66f68cc529e109ec75b97197e1/lxml-6.1.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:0d082495c5fcf426e425a6e28daaba1fcb6d8f854a4ff01effb1f1f381203eb9", size = 4712703, upload-time = "2026-04-18T04:32:47.16Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8d/77/f6af805c6e23b9a12970c8c38891b087ffd884c2d4df6069e63ff1623fd6/lxml-6.0.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:9a69668bef9268f54a92f2254917df530ca4630a621027437f0e948eb1937e7b", size = 5251326, upload-time = "2026-04-12T16:23:59.901Z" },
|
{ url = "https://files.pythonhosted.org/packages/12/16/0b83fccc158218aca75a7aa33e97441df737950734246b9fffa39301603d/lxml-6.1.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:e3c4f84b24a1fcba435157d111c4b755099c6ff00a3daee1ad281817de75ed11", size = 5252745, upload-time = "2026-04-18T04:32:50.427Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2b/bb/bcd429655f6d12845d91f17e3977d63de22cde5fa77f7d4eef7669a80e8c/lxml-6.0.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:280f8e7398bdc48c7366ad375a5586692cd73b269d9e82e6898f9ada70dc0bcb", size = 5224752, upload-time = "2026-04-12T16:24:02.002Z" },
|
{ url = "https://files.pythonhosted.org/packages/dd/ee/12e6c1b39a77666c02eaa77f94a870aaf63c4ac3a497b2d52319448b01c6/lxml-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:976a6b39b1b13e8c354ad8d3f261f3a4ac6609518af91bdb5094760a08f132c4", size = 5226822, upload-time = "2026-04-18T04:32:53.437Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/69/cd/0342c5a3663115560899a0529789969a72bc5209c8f0084e5b0598cda94d/lxml-6.0.4-cp311-cp311-win32.whl", hash = "sha256:a8eddf3c705e00738db695a9a77830f8d57f7d21a54954fbef23a1b8806384ed", size = 3592977, upload-time = "2026-04-12T16:24:03.847Z" },
|
{ url = "https://files.pythonhosted.org/packages/34/20/c7852904858b4723af01d2fc14b5d38ff57cb92f01934a127ebd9a9e51aa/lxml-6.1.0-cp311-cp311-win32.whl", hash = "sha256:857efde87d365706590847b916baff69c0bc9252dc5af030e378c9800c0b10e3", size = 3594026, upload-time = "2026-04-18T04:27:31.903Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/92/c1/386ee2e8a8008cccc4903435f19aaffd16d9286186106752d08be2bd7ccb/lxml-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:b74d5b391fc49fc3cc213c930f87a7dedf2b4b0755aae4638e91e4501e278430", size = 4023718, upload-time = "2026-04-12T16:24:06.135Z" },
|
{ url = "https://files.pythonhosted.org/packages/02/05/d60c732b56da5085175c07c74b2df4e6d181b0c9a61e1691474f06ef4b39/lxml-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:183bfb45a493081943be7ea2b5adfc2b611e1cf377cefa8b8a8be404f45ef9a7", size = 4025114, upload-time = "2026-04-18T04:27:34.077Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a7/a0/19f5072fdc7c73d44004506172dba4b7e3d179d9b3a387efce9c30365afd/lxml-6.0.4-cp311-cp311-win_arm64.whl", hash = "sha256:2f0cf04bafc14b0eebfbc3b5b73b296dd76b5d7640d098c02e75884bb0a70f2b", size = 3666955, upload-time = "2026-04-12T16:24:08.438Z" },
|
{ url = "https://files.pythonhosted.org/packages/c2/df/c84dcc175fd690823436d15b41cb920cd5ba5e14cd8bfb00949d5903b320/lxml-6.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:19f4164243fc206d12ed3d866e80e74f5bc3627966520da1a5f97e42c32a3f39", size = 3667742, upload-time = "2026-04-18T04:27:38.45Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/3d/18/4732abab49bbb041b1ded9dd913ca89735a0dcca038eacec64c44ba02163/lxml-6.0.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:af0b8459c4e21a8417db967b2e453d1855022dac79c79b61fb8214f3da50f17e", size = 8570033, upload-time = "2026-04-12T16:24:10.728Z" },
|
{ url = "https://files.pythonhosted.org/packages/d2/d4/9326838b59dc36dfae42eec9656b97520f9997eee1de47b8316aaeed169c/lxml-6.1.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d2f17a16cd8751e8eb233a7e41aecdf8e511712e00088bf9be455f604cd0d28d", size = 8570663, upload-time = "2026-04-18T04:27:48.253Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/72/7e/38523ec7178ca35376551911455d1b2766bc9d98bcc18f606a167fa9ecbb/lxml-6.0.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e0cdcea2affa53fa17dc4bf5cefc0edf72583eac987d669493a019998a623fa3", size = 4623270, upload-time = "2026-04-12T16:24:13.2Z" },
|
{ url = "https://files.pythonhosted.org/packages/d8/a4/053745ce1f8303ccbb788b86c0db3a91b973675cefc42566a188637b7c40/lxml-6.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0cea5b1d3e6e77d71bd2b9972eb2446221a69dc52bb0b9c3c6f6e5700592d93", size = 4624024, upload-time = "2026-04-18T04:27:52.594Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f1/cf/f9b6c9bf9d8c63d923ef893915141767cea4cea71774f20c36d0c14e1585/lxml-6.0.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8da4d4840c1bc07da6fcd647784f7fbaf538eeb7a57ce6b2487acc54c5e33330", size = 4929471, upload-time = "2026-04-12T16:24:15.453Z" },
|
{ url = "https://files.pythonhosted.org/packages/90/97/a517944b20f8fd0932ad2109482bee4e29fe721416387a363306667941f6/lxml-6.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc46da94826188ed45cb53bd8e3fc076ae22675aea2087843d4735627f867c6d", size = 4930895, upload-time = "2026-04-18T04:32:56.29Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e5/53/3117f988c9e20be4156d2b8e1bda82ae06878d11aeb820dea111a7cfa4e3/lxml-6.0.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb04a997588c3980894ded9172c10c5a3e45d3f1c5410472733626d268683806", size = 5092355, upload-time = "2026-04-12T16:24:17.876Z" },
|
{ url = "https://files.pythonhosted.org/packages/94/7c/e08a970727d556caa040a44773c7b7e3ad0f0d73dedc863543e9a8b931f2/lxml-6.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9147d8e386ec3b82c3b15d88927f734f565b0aaadef7def562b853adca45784a", size = 5093820, upload-time = "2026-04-18T04:32:58.94Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4e/ca/05c6ac773a2bd3edb48fa8a5c5101e927ce044c4a8aed1a85ff00fab20a5/lxml-6.0.4-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca449642a08a6ceddf6e6775b874b6aee1b6242ed80aea84124497aba28e5384", size = 5004520, upload-time = "2026-04-12T16:24:20.184Z" },
|
{ url = "https://files.pythonhosted.org/packages/88/ee/2a5c2aa2c32016a226ca25d3e1056a8102ea6e1fe308bf50213586635400/lxml-6.1.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5715e0e28736a070f3f34a7ccc09e2fdcba0e3060abbcf61a1a5718ff6d6b105", size = 5005790, upload-time = "2026-04-18T04:33:01.272Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f1/db/d8aa5aa3a51d0aa6706ef85f85027f7c972cd840fe69ba058ecaf32d093d/lxml-6.0.4-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:35b3ccdd137e62033662787dd4d2b8be900c686325d6b91e3b1ff6213d05ba11", size = 5629961, upload-time = "2026-04-12T16:24:22.242Z" },
|
{ url = "https://files.pythonhosted.org/packages/e3/38/a0db9be8f38ad6043ab9429487c128dd1d30f07956ef43040402f8da49e8/lxml-6.1.0-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4937460dc5df0cdd2f06a86c285c28afda06aefa3af949f9477d3e8df430c485", size = 5630827, upload-time = "2026-04-18T04:33:04.036Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9d/75/8fff4444e0493aeb15ab0f4a55c767b5baed9074cf67a1835dc1161f3a1f/lxml-6.0.4-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45dc690c54b1341fec01743caed02e5f1ea49d7cfb81e3ba48903e5e844ed68a", size = 5237561, upload-time = "2026-04-12T16:24:24.572Z" },
|
{ url = "https://files.pythonhosted.org/packages/31/ba/3c13d3fc24b7cacf675f808a3a1baabf43a30d0cd24c98f94548e9aa58eb/lxml-6.1.0-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc783ee3147e60a25aa0445ea82b3e8aabb83b240f2b95d32cb75587ff781814", size = 5240445, upload-time = "2026-04-18T04:33:06.87Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2a/9f/6d6cd73014f2dbf47a8aa7accd9712726f46ef4891e1c126bc285cfb94e4/lxml-6.0.4-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:15ae922e8f74b05798a0e88cee46c0244aaec6a66b5e00be7d18648fed8c432e", size = 5349197, upload-time = "2026-04-12T16:24:26.805Z" },
|
{ url = "https://files.pythonhosted.org/packages/55/ba/eeef4ccba09b2212fe239f46c1692a98db1878e0872ae320756488878a94/lxml-6.1.0-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:40d9189f80075f2e1f88db21ef815a2b17b28adf8e50aaf5c789bfe737027f32", size = 5350121, upload-time = "2026-04-18T04:33:09.365Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2d/43/e3e9a126e166234d1659d1dd9004dc1dd50cdc3c68575b071b0a1524b4de/lxml-6.0.4-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:ebd816653707fbf10c65e3dee3bc24dac6b691654c21533b1ae49287433f4db0", size = 4693123, upload-time = "2026-04-12T16:24:28.812Z" },
|
{ url = "https://files.pythonhosted.org/packages/7e/01/1da87c7b587c38d0cbe77a01aae3b9c1c49ed47d76918ef3db8fc151b1ca/lxml-6.1.0-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:05b9b8787e35bec69e68daf4952b2e6dfcfb0db7ecf1a06f8cdfbbac4eb71aad", size = 4694949, upload-time = "2026-04-18T04:33:11.628Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6c/98/b146dd123a4a7b69b571ff23ea8e8c68de8d8c1b03e23d01c6374d4fd835/lxml-6.0.4-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:21284cf36b95dd8be774eb06c304b440cf49ee811800a30080ce6d93700f0383", size = 5242967, upload-time = "2026-04-12T16:24:30.811Z" },
|
{ url = "https://files.pythonhosted.org/packages/a1/88/7db0fe66d5aaf128443ee1623dec3db1576f3e4c17751ec0ef5866468590/lxml-6.1.0-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0f08beb0182e3e9a86fae124b3c47a7b41b7b69b225e1377db983802404e54", size = 5243901, upload-time = "2026-04-18T04:33:13.95Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7e/60/8c275584452b55a902c883e8ab63d755c5ef35d7ad1f06f9e6559095521d/lxml-6.0.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c08a2a9d0c4028ef5fc5a513b2e1e51af069a83c5b4206139edd08b3b8c2926", size = 5046810, upload-time = "2026-04-12T16:24:33.289Z" },
|
{ url = "https://files.pythonhosted.org/packages/00/a8/1346726af7d1f6fca1f11223ba34001462b0a3660416986d37641708d57c/lxml-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73becf6d8c81d4c76b1014dbd3584cb26d904492dcf73ca85dc8bff08dcd6d2d", size = 5048054, upload-time = "2026-04-18T04:33:16.965Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/19/aa/19ec216147e1105e5403fe73657c693a6e91bde855a13242dd6031e829e5/lxml-6.0.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1bc2f0f417112cf1a428599dd58125ab74d8e1c66893efd9b907cbb4a5db6e44", size = 4776383, upload-time = "2026-04-12T16:24:36.008Z" },
|
{ url = "https://files.pythonhosted.org/packages/2e/b7/85057012f035d1a0c87e02f8c723ca3c3e6e0728bcf4cb62080b21b1c1e3/lxml-6.1.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1ae225f66e5938f4fa29d37e009a3bb3b13032ac57eb4eb42afa44f6e4054e69", size = 4777324, upload-time = "2026-04-18T04:33:19.832Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/41/c8/90afdb838705a736268fcffd2698c05e9a129144ce215d5e14db3bdfc295/lxml-6.0.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c0d86e328405529bc93913add9ff377e8b8ea9be878e611f19dbac7766a84483", size = 5643497, upload-time = "2026-04-12T16:24:38.276Z" },
|
{ url = "https://files.pythonhosted.org/packages/75/6c/ad2f94a91073ef570f33718040e8e160d5fb93331cf1ab3ca1323f939e2d/lxml-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:690022c7fae793b0489aa68a658822cea83e0d5933781811cabbf5ea3bcfe73d", size = 5645702, upload-time = "2026-04-18T04:33:22.436Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/32/ec/1135261ec9822dafb90be0ff6fb0ec79cee0b7fe878833dfe5f2b8c393bd/lxml-6.0.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3cce9420fe8f91eae5d457582599d282195c958cb670aa4bea313a79103ba33f", size = 5232185, upload-time = "2026-04-12T16:24:40.516Z" },
|
{ url = "https://files.pythonhosted.org/packages/3b/89/0bb6c0bd549c19004c60eea9dc554dd78fd647b72314ef25d460e0d208c6/lxml-6.1.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:63aeafc26aac0be8aff14af7871249e87ea1319be92090bfd632ec68e03b16a5", size = 5232901, upload-time = "2026-04-18T04:33:26.21Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/13/f2/7380b11cae6943720f525e5a28ad9dbead96ac710417e556b7c03f3a8af3/lxml-6.0.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:96214985ec194ce97b9028414e179cfb21230cba4e2413aee7e249461bb84f4d", size = 5259968, upload-time = "2026-04-12T16:24:42.917Z" },
|
{ url = "https://files.pythonhosted.org/packages/a1/d9/d609a11fb567da9399f525193e2b49847b5a409cdebe737f06a8b7126bdc/lxml-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:264c605ab9c0e4aa1a679636f4582c4d3313700009fac3ec9c3412ed0d8f3e1d", size = 5261333, upload-time = "2026-04-18T04:33:28.984Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/65/8f/141734f2c456f2253fed4237d8d4b241e3d701129cf6f0b135ccf241a75a/lxml-6.0.4-cp312-cp312-win32.whl", hash = "sha256:b2209b310e7ed1d4cd1c00d405ec9c49722fce731c7036abc1d876bf8df78139", size = 3594958, upload-time = "2026-04-12T16:24:45.039Z" },
|
{ url = "https://files.pythonhosted.org/packages/a6/3a/ac3f99ec8ac93089e7dd556f279e0d14c24de0a74a507e143a2e4b496e7c/lxml-6.1.0-cp312-cp312-win32.whl", hash = "sha256:56971379bc5ee8037c5a0f09fa88f66cdb7d37c3e38af3e45cf539f41131ac1f", size = 3596289, upload-time = "2026-04-18T04:27:42.819Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b7/a9/c6d3531c6d8814af0919fbdb9bda43c9e8b5deffcb70c8534017db233512/lxml-6.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:03affcacfba4671ebc305813b02bfaf34d80b6a7c5b23eafc5d6da14a1a6e623", size = 3995897, upload-time = "2026-04-12T16:24:46.98Z" },
|
{ url = "https://files.pythonhosted.org/packages/f2/a7/0a915557538593cb1bbeedcd40e13c7a261822c26fecbbdb71dad0c2f540/lxml-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:bba078de0031c219e5dd06cf3e6bf8fb8e6e64a77819b358f53bb132e3e03366", size = 3997059, upload-time = "2026-04-18T04:27:46.764Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/03/5d/1dabeddf762e5a315a31775b2bca39811d7e7a15fc3e677d044b9da973fe/lxml-6.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:af9678e3a2a047465515d95a61690109af7a4c9486f708249119adcef7861049", size = 3658607, upload-time = "2026-04-12T16:24:49.19Z" },
|
{ url = "https://files.pythonhosted.org/packages/92/96/a5dc078cf0126fbfbc35611d77ecd5da80054b5893e28fb213a5613b9e1d/lxml-6.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:c3592631e652afa34999a088f98ba7dfc7d6aff0d535c410bea77a71743f3819", size = 3659552, upload-time = "2026-04-18T04:27:51.133Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/41/25/260b86340ec5aadda5e18ed39df0eea61ef8781fb0fcc16c847cdb9dfdff/lxml-6.0.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b29bcca95e82cd201d16c2101085faa2669838f4697fd914b7124a6c77032f80", size = 3929209, upload-time = "2026-04-12T16:28:07.628Z" },
|
{ url = "https://files.pythonhosted.org/packages/f2/88/55143966481409b1740a3ac669e611055f49efd68087a5ce41582325db3e/lxml-6.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:546b66c0dd1bb8d9fa89d7123e5fa19a8aff3a1f2141eb22df96112afb17b842", size = 3930134, upload-time = "2026-04-18T04:32:35.008Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8a/cc/b2157461584525fb0ceb7f4c3b6c1b276f6c7dd34858d78075ae8973bf3d/lxml-6.0.4-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a95e29710ecdf99b446990144598f6117271cb2ec19fd45634aa087892087077", size = 4209535, upload-time = "2026-04-12T16:28:10.071Z" },
|
{ url = "https://files.pythonhosted.org/packages/b5/97/28b985c2983938d3cb696dd5501423afb90a8c3e869ef5d3c62569282c0f/lxml-6.1.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5cfa1a34df366d9dc0d5eaf420f4cf2bb1e1bebe1066d1c2fc28c179f8a4004c", size = 4210749, upload-time = "2026-04-18T04:36:03.626Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1d/fa/7fdcd1eb31ec0d5871a4a0b1587e78a331f59941ff3af59bed064175499e/lxml-6.0.4-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13085e0174e9c9fa4eb5a6bdfb81646d1f7be07e5895c958e89838afb77630c6", size = 4316979, upload-time = "2026-04-12T16:28:12.42Z" },
|
{ url = "https://files.pythonhosted.org/packages/29/67/dfab2b7d58214921935ccea7ce9b3df9b7d46f305d12f0f532ac7cf6b804/lxml-6.1.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db88156fcf544cdbf0d95588051515cfdfd4c876fc66444eb98bceb5d6db76de", size = 4318463, upload-time = "2026-04-18T04:36:06.309Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/53/0c/dab9f5855e7d2e51c8eb461713ada38a7d4eb3ab07fec8d13c46ed353ad6/lxml-6.0.4-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e205c4869a28ec4447375333072978356cd0eeadd0412c643543238e638b89a3", size = 4249929, upload-time = "2026-04-12T16:28:15.739Z" },
|
{ url = "https://files.pythonhosted.org/packages/32/a2/4ac7eb32a4d997dd352c32c32399aae27b3f268d440e6f9cfa405b575d2f/lxml-6.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:07f98f5496f96bf724b1e3c933c107f0cbf2745db18c03d2e13a291c3afd2635", size = 4251124, upload-time = "2026-04-18T04:36:09.056Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a4/88/39e8e4ca7ee1bc9e7cd2f6b311279624afa70a375eef8727f0bb83db2936/lxml-6.0.4-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aec26080306a66ad5c62fad0053dd2170899b465137caca7eac4b72bda3588bf", size = 4399464, upload-time = "2026-04-12T16:28:18.397Z" },
|
{ url = "https://files.pythonhosted.org/packages/33/ef/d6abd850bb4822f9b720cfe36b547a558e694881010ff7d012191e8769c6/lxml-6.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4642e04449a1e164b5ff71ffd901ddb772dfabf5c9adf1b7be5dffe1212bc037", size = 4401758, upload-time = "2026-04-18T04:36:11.803Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/66/54/14c518cc9ce5151fcd1fa95a1c2396799a505dca2c4f0acdf85fb23fe293/lxml-6.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3912221f41d96283b10a7232344351c8511e31f18734c752ed4798c12586ea35", size = 3507404, upload-time = "2026-04-12T16:28:21.188Z" },
|
{ url = "https://files.pythonhosted.org/packages/40/44/3ee09a5b60cb44c4f2fbc1c9015cfd6ff5afc08f991cab295d3024dcbf2d/lxml-6.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:7da13bb6fbadfafb474e0226a30570a3445cfd47c86296f2446dafbd77079ace", size = 3508860, upload-time = "2026-04-18T04:32:48.619Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -345,39 +345,39 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "numpy"
|
name = "numpy"
|
||||||
version = "2.4.4"
|
version = "2.4.5"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/50/8e/b8041bc719f056afd864478029d52214789341ac6583437b0ee5031e9530/numpy-2.4.5.tar.gz", hash = "sha256:ca670567a5683b7c1670ec03e0ddd5862e10934e92a70751d68d7b7b74ca7f9f", size = 20735669, upload-time = "2026-05-15T20:25:19.492Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/ef/c6/4218570d8c8ecc9704b5157a3348e486e84ef4be0ed3e38218ab473c83d2/numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db", size = 16976799, upload-time = "2026-03-29T13:18:15.438Z" },
|
{ url = "https://files.pythonhosted.org/packages/e1/44/1383ee4d1e916a9e610e46c876b5c83ea023526117d23cd911983929ec34/numpy-2.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3176dc8ff71dbb593606f91a69ad0c3cd3303c7eb546af477370ab9edf760288", size = 16969261, upload-time = "2026-05-15T20:22:23.036Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/dd/92/b4d922c4a5f5dab9ed44e6153908a5c665b71acf183a83b93b690996e39b/numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0", size = 14971552, upload-time = "2026-03-29T13:18:18.606Z" },
|
{ url = "https://files.pythonhosted.org/packages/3d/61/54bacfbec7550bc398e6b6d9a861db35d64f75844e1d7920f5722c3cd5e7/numpy-2.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1811150e5148f5a01a7cc282cb2f489b4a3050a773e173adb480e507bad3a3d7", size = 14964009, upload-time = "2026-05-15T20:22:25.819Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015", size = 5476566, upload-time = "2026-03-29T13:18:21.532Z" },
|
{ url = "https://files.pythonhosted.org/packages/7a/55/fe86c64561761f185339c26001164a2687bd4787af681e961431abd2d534/numpy-2.4.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0d63a780070871210853ba01e90b88f9b85cf2abf63a7f143d5127189265ddf6", size = 5469106, upload-time = "2026-05-15T20:22:28.13Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40", size = 6806482, upload-time = "2026-03-29T13:18:23.634Z" },
|
{ url = "https://files.pythonhosted.org/packages/2f/74/cf29b8317627f0e3aa2c9fb332d386bd734308cecd9e07da9f407d9ce0c3/numpy-2.4.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:0c6919cefafb3b76cd46a89dbb203bf1dd95529d2a6d09fef2d325d95d6a79d8", size = 6798945, upload-time = "2026-05-15T20:22:30.061Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/68/62/63417c13aa35d57bee1337c67446761dc25ea6543130cf868eace6e8157b/numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d", size = 15973376, upload-time = "2026-03-29T13:18:26.677Z" },
|
{ url = "https://files.pythonhosted.org/packages/80/a9/b61730a17fa87d5abb13ce560a1b4ce3485d37a13e03eb7b414e598e72f8/numpy-2.4.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d51efede1e58e8b11877536a5518f60e318d8ff69b89ad7b38ee5e431b24d772", size = 15967025, upload-time = "2026-05-15T20:22:32.328Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502", size = 16925137, upload-time = "2026-03-29T13:18:30.14Z" },
|
{ url = "https://files.pythonhosted.org/packages/03/39/70bcd187eb4d223c21fde02c2bdfbffbffef3288cbb3947c04c74ae39a08/numpy-2.4.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:07ce7e74da92d7c71b5df157b9758bcdd53d7fea10602154de3afd2b3ddc34dd", size = 16918685, upload-time = "2026-05-15T20:22:34.759Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7e/43/80020edacb3f84b9efdd1591120a4296462c23fd8db0dde1666f6ef66f13/numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd", size = 17329414, upload-time = "2026-03-29T13:18:33.733Z" },
|
{ url = "https://files.pythonhosted.org/packages/ab/31/400fd1315bbe228af3937cf8a74e32023df6217af36077919d00adc382e4/numpy-2.4.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d7828234a13185effb34979e146f9921f2a65dfbbe215e6dbb57d6478fc8e059", size = 17322963, upload-time = "2026-05-15T20:22:37.557Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/fd/06/af0658593b18a5f73532d377188b964f239eb0894e664a6c12f484472f97/numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5", size = 18658397, upload-time = "2026-03-29T13:18:37.511Z" },
|
{ url = "https://files.pythonhosted.org/packages/18/6a/bbbafb657e6f6ee826b4ecdb8722a2e0aae4a981888eaf59eae6a535cc13/numpy-2.4.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f96083adc3dfc1bbf778f2c79654d88115fa07074c97cb724fe9508f12d91c55", size = 18651594, upload-time = "2026-05-15T20:22:40.449Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e6/ce/13a09ed65f5d0ce5c7dd0669250374c6e379910f97af2c08c57b0608eee4/numpy-2.4.4-cp311-cp311-win32.whl", hash = "sha256:30caa73029a225b2d40d9fae193e008e24b2026b7ee1a867b7ee8d96ca1a448e", size = 6239499, upload-time = "2026-03-29T13:18:40.372Z" },
|
{ url = "https://files.pythonhosted.org/packages/de/0c/857a515154a2a18b0dfae04089600d166d352d473ec17a0680d879582d06/numpy-2.4.5-cp311-cp311-win32.whl", hash = "sha256:4ed78c904a638b6e5d7cd4db90c06fca5fc6ec2f28d258305368f454a50e79cf", size = 6233849, upload-time = "2026-05-15T20:22:43.139Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e", size = 12614257, upload-time = "2026-03-29T13:18:42.95Z" },
|
{ url = "https://files.pythonhosted.org/packages/f0/66/d215f3fb93541617adb5d58b3b9508e8a6413e499711e0adc0b80bcb445d/numpy-2.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:079b0fad6f2899b23c5da89792b5409d2d83fc83e8bd5c2299cc9c397a264864", size = 12608238, upload-time = "2026-05-15T20:22:45.229Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/87/c5/8168052f080c26fa984c413305012be54741c9d0d74abd7fbeeccae3889f/numpy-2.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:fcfe2045fd2e8f3cb0ce9d4ba6dba6333b8fa05bb8a4939c908cd43322d14c7e", size = 10486775, upload-time = "2026-03-29T13:18:45.835Z" },
|
{ url = "https://files.pythonhosted.org/packages/cb/c4/611d66d3fcfa931954d37a19ce5575f3283d023e89ff0df6ad43b334ae9c/numpy-2.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:d6c78e260b53affe9b395a9d54fc61f101f9521c4d9452c7e9e3718b19e2215b", size = 10479452, upload-time = "2026-05-15T20:22:47.962Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" },
|
{ url = "https://files.pythonhosted.org/packages/6c/18/3275231e98620002681c922e792db04d72c356e9d8073c387344fc0e4ff1/numpy-2.4.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:654fb8674b61b1c4bd568f944d13a908566fdcb0d797303521d4149d16da05ef", size = 16689166, upload-time = "2026-05-15T20:22:50.761Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" },
|
{ url = "https://files.pythonhosted.org/packages/db/23/000aab6a16bdec53307f0f72546b57a3ac9266a62d8c257bee97d85fd078/numpy-2.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4cd9f6fa7ce10dc4627f2bb81dd9075dab67e94632e04c2b638e12575ddaa862", size = 14699514, upload-time = "2026-05-15T20:22:53.678Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" },
|
{ url = "https://files.pythonhosted.org/packages/47/cc/ddaf3af9c46966fef5be879256f213d85a0c56c75d07a3b7defec7cf6b4c/numpy-2.4.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:4f5bc96d35d94e4ceab8b38a92241b4611e95dc44e63b9f1fa2a331858ee3507", size = 5204601, upload-time = "2026-05-15T20:22:56.257Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" },
|
{ url = "https://files.pythonhosted.org/packages/07/ea/627fadd11959b3c7759008f34c92a35af8ff942dd8284a66ced648bbe516/numpy-2.4.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:4bb33e900ee81730ad77a258965134aa8ceac805124f7e5229347beda4b8d0aa", size = 6551360, upload-time = "2026-05-15T20:22:58.334Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" },
|
{ url = "https://files.pythonhosted.org/packages/a1/47/0728b986b8682d742ff68c16baa5af9d185484abfc635c5cc700f44e62be/numpy-2.4.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32f8f852273ef32b291201ac2a2c97629c4a1ee8632bb670e3443eaa09fc2e72", size = 15671157, upload-time = "2026-05-15T20:23:01.081Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" },
|
{ url = "https://files.pythonhosted.org/packages/d1/0b/b905ae82d9419dc38123523862db64978ca2954b69609c3ae8fdaca1084c/numpy-2.4.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:685681e956fc8dcb75adc6ff26694e1dfd738b24bd8d4696c51ca0110157f912", size = 16645703, upload-time = "2026-05-15T20:23:04.358Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" },
|
{ url = "https://files.pythonhosted.org/packages/5f/24/e27fc3f5236b4118ed9eed67111675f5c61a07ea333acec87c869c3b359d/numpy-2.4.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6f64dd84b277a737eb59513f6b9bb6195bf41ab11941ef15b2562dbab43fa8ef", size = 17021018, upload-time = "2026-05-15T20:23:07.021Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" },
|
{ url = "https://files.pythonhosted.org/packages/d3/a7/9041af38d527ab80a06a93570a77e29425b41507ad41f6acf5da78cfb4a4/numpy-2.4.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b42d9496f79e3a728192f05a42d86e36163217b7cdecb3813d0028a0aa6b72d7", size = 18368768, upload-time = "2026-05-15T20:23:09.44Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" },
|
{ url = "https://files.pythonhosted.org/packages/49/82/326a014442f32c2663434fd424d9298791f47f8a0f17585ad60519a5606e/numpy-2.4.5-cp312-cp312-win32.whl", hash = "sha256:86d980970f5110595ca14855768073b08585fc1acc36895de303e039e7dee4a5", size = 5962819, upload-time = "2026-05-15T20:23:11.631Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" },
|
{ url = "https://files.pythonhosted.org/packages/3c/f0/cbf5d391b0b3a5e8cad264603e2fae256b0bde8ce43566b13b78faedc659/numpy-2.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:3333dba6a4e611d666f69e177ba8fe4140366ff681a5feb2374d3fd4fff3acb6", size = 12321621, upload-time = "2026-05-15T20:23:14.305Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" },
|
{ url = "https://files.pythonhosted.org/packages/3c/d0/0f18909d9bc37a5f3f969fc737d2bb5df9f2ff295f71b467e6f52a0d6c4e/numpy-2.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:4593d197270b894efeb538dcbe227e4bcf1c77f88c4c6bf933ead812cfaa4453", size = 10221430, upload-time = "2026-05-15T20:23:16.887Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6b/33/8fae8f964a4f63ed528264ddf25d2b683d0b663e3cba26961eb838a7c1bd/numpy-2.4.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:58c8b5929fcb8287cbd6f0a3fae19c6e03a5c48402ae792962ac465224a629a4", size = 16854491, upload-time = "2026-03-29T13:21:38.03Z" },
|
{ url = "https://files.pythonhosted.org/packages/fc/5d/9a644cfb841bc76b584afc3af1708b3bf6c5cb51fc84a7008246cd93b7b7/numpy-2.4.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6bf0bfc1c2e1db972e30b6cd3d4861f477f3af908b27799b239dc3cbe3eb4b95", size = 16847544, upload-time = "2026-05-15T20:24:59.746Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/bc/d0/1aabee441380b981cf8cdda3ae7a46aa827d1b5a8cce84d14598bc94d6d9/numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e", size = 14895830, upload-time = "2026-03-29T13:21:41.509Z" },
|
{ url = "https://files.pythonhosted.org/packages/56/8f/4fe5e3ba76d858dae1fe79078818c0520447335be0082c0dedf82719cc08/numpy-2.4.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:73d664413fb97229149c4711ef56531a6fe8c15c1c2626b0bbe497b84c287e70", size = 14889039, upload-time = "2026-05-15T20:25:03.179Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a5/b8/aafb0d1065416894fccf4df6b49ef22b8db045187949545bced89c034b8e/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c", size = 5400927, upload-time = "2026-03-29T13:21:44.747Z" },
|
{ url = "https://files.pythonhosted.org/packages/8e/6f/79f195abf922ecc43e7d0eb6cc969462a71b524a35bcd1fa26b4a1d7406a/numpy-2.4.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:b35bee5ef99e8d227a07829bee2e864fcb65f7c157646fcd8ec8b4b45dd8b88f", size = 5394106, upload-time = "2026-05-15T20:25:05.659Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d6/77/063baa20b08b431038c7f9ff5435540c7b7265c78cf56012a483019ca72d/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:28a650663f7314afc3e6ec620f44f333c386aad9f6fc472030865dc0ebb26ee3", size = 6715557, upload-time = "2026-03-29T13:21:47.406Z" },
|
{ url = "https://files.pythonhosted.org/packages/58/6f/79cd6247205802bcbd10b40ea087e20ded526e10e9be224d34de832b216e/numpy-2.4.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:02981d0fc9f9ce147643d552966d47f329a02f7ecb3b113e84207242f20dfa83", size = 6708718, upload-time = "2026-05-15T20:25:08.071Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c7/a8/379542d45a14f149444c5c4c4e7714707239ce9cc1de8c2803958889da14/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7", size = 15804253, upload-time = "2026-03-29T13:21:50.753Z" },
|
{ url = "https://files.pythonhosted.org/packages/d7/22/5f378a9d4633c98f28c4709d4144b1a4630c5c09e109d2e781e2d26c8fe1/numpy-2.4.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0e63caf31a1df06338ae63d999f7a33a675ced62eea9c9b02db4b1c1f45cff38", size = 15798292, upload-time = "2026-05-15T20:25:10.689Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a2/c8/f0a45426d6d21e7ea3310a15cf90c43a14d9232c31a837702dba437f3373/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f", size = 16753552, upload-time = "2026-03-29T13:21:54.344Z" },
|
{ url = "https://files.pythonhosted.org/packages/63/1c/cec582febef798c99888892d92dc1d28dfe29cb427c41f44d13d0dec208f/numpy-2.4.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8fc52b85a7b45e474be53eddf08e006d22e381a4e41bcde8e4aa08da0e7d198", size = 16747406, upload-time = "2026-05-15T20:25:13.879Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/04/74/f4c001f4714c3ad9ce037e18cf2b9c64871a84951eaa0baf683a9ca9301c/numpy-2.4.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2cf083b324a467e1ab358c105f6cad5ea950f50524668a80c486ff1db24e119", size = 12509075, upload-time = "2026-03-29T13:21:57.644Z" },
|
{ url = "https://files.pythonhosted.org/packages/b1/dc/d358a16a6fec86cf736b8fbe67386044b3fa2aded1a80cff90e836799301/numpy-2.4.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:40c71d50a4da1a7c317af419461052d3911a5770bfc5fd55baf52cc45e7a2c20", size = 12504085, upload-time = "2026-05-15T20:25:16.667Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -430,7 +430,7 @@ requires-dist = [
|
|||||||
{ name = "jinja2", marker = "extra == 'docs'" },
|
{ name = "jinja2", marker = "extra == 'docs'" },
|
||||||
{ name = "lefthook", marker = "extra == 'testing'" },
|
{ name = "lefthook", marker = "extra == 'testing'" },
|
||||||
{ name = "numpy" },
|
{ name = "numpy" },
|
||||||
{ name = "pycapnp", specifier = "==2.1.0" },
|
{ name = "pycapnp" },
|
||||||
{ name = "pycryptodome" },
|
{ name = "pycryptodome" },
|
||||||
{ name = "ruff", marker = "extra == 'testing'" },
|
{ name = "ruff", marker = "extra == 'testing'" },
|
||||||
{ name = "tqdm" },
|
{ name = "tqdm" },
|
||||||
@@ -450,34 +450,38 @@ testing = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pycapnp"
|
name = "pycapnp"
|
||||||
version = "2.1.0"
|
version = "2.2.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/15/86/a57e3c92acd3e1d2fc3dcad683ada191f722e4ac927e1a384b228ec2780a/pycapnp-2.1.0.tar.gz", hash = "sha256:69cc3d861fee1c9b26c73ad2e8a5d51e76ad87e4ff9be33a4fd2fc72f5846aec", size = 689734, upload-time = "2025-09-05T03:50:40.851Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/85/7b/b2f356bc24220068beffc03e94062e8059a1383addb837303794398aec36/pycapnp-2.2.2.tar.gz", hash = "sha256:7f6c23c2283173a3cb6f1a5086dd0114779d508a7cd1b138d25a6357857d02b6", size = 730142, upload-time = "2026-01-21T01:22:13.73Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/68/7c/934750a0ca77431a22e68e11521dcc6b801bea3ff37331d6a519e5ad142e/pycapnp-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:efacc439ec287d9e8a0ebf01a515404eff795659401e65ba6f1819c7b24f4380", size = 1628855, upload-time = "2025-09-05T03:48:32.317Z" },
|
{ url = "https://files.pythonhosted.org/packages/ce/2c/65e0efb7d3d3f8bff7e55fb32ce74da008b7f5c2700b8f50e5ee69fc228d/pycapnp-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b49906285d5fdd91b352329eaa33ec54162053a0fae5467389f3762a6c27e09", size = 1614876, upload-time = "2026-01-21T01:20:04.32Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2e/a2/fd2c10b3f2e5010c747aa946b27fe09f665d65d5dc2afdd31838a3ef2f5d/pycapnp-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f3d8af535a8b44dfd71731a191386c6b821b8a4915806948893d18c79f547a8e", size = 1496942, upload-time = "2025-09-05T03:48:34.905Z" },
|
{ url = "https://files.pythonhosted.org/packages/2e/4d/87e7b0050317c9152a6ed4162f6159377d683163432acdbaa39d90e5081b/pycapnp-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a603298b27356cb1766b4c965964a90a1af98b97c7513a369ed483bb267dfd83", size = 1489709, upload-time = "2026-01-21T01:20:05.574Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/0b/8a/42bd0e4c094ef534ac6890d34adae580cbbf5b0497fc0a6340bea833a617/pycapnp-2.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:117d1d5ebfc08cc189aca4f771b34fedc1291a3f9417167bd2d9b2a4e607e640", size = 5200170, upload-time = "2025-09-05T03:48:36.502Z" },
|
{ url = "https://files.pythonhosted.org/packages/30/22/09477810aee36e435717994a8788c0b11430159a0f5ada8de1cb4f4c3cda/pycapnp-2.2.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c858cd32f9b940bd5412e8a992f5b3983010611ad03f2a548f39b50aa5c60e76", size = 5259323, upload-time = "2026-01-21T01:20:07.533Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/af/30/2e92268383135082191c3dea4a9ad184d20b7fb2dda1477fd6ee520fd88e/pycapnp-2.1.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:d881ccc69e381863a88c7b6c7092a6baecb6dfc8c5558d66bc967c7f778fe7bc", size = 5684026, upload-time = "2025-09-05T03:48:38.063Z" },
|
{ url = "https://files.pythonhosted.org/packages/fd/d5/aae7616c24c7a36e740ca8f1c7b0751cf048ff6a27b2391e0a768141451d/pycapnp-2.2.2-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:7fc395295229817b7436702cd3aaaf50a8587a9842b0616d683504f81166c3b0", size = 5318216, upload-time = "2026-01-21T01:20:09.194Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/46/9c/bca1cbd7711c9c0f0f62ca95a49835369a61c4f6527a6900c8982045bf2f/pycapnp-2.1.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:8a4ea330e38ba83f6f03fbdc1f58642eb53e6f6f66734a426fa592dc988d70e9", size = 5709307, upload-time = "2025-09-05T03:48:40.127Z" },
|
{ url = "https://files.pythonhosted.org/packages/7a/ca/0e115255dbf177bb7a6a5c2388c8b5888b590149c79dd34a96c0f1eeac3c/pycapnp-2.2.2-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:3c64660d72dda255d597151024105318f931404c1f5d8e38d32bd03a5a1cbc5b", size = 5731883, upload-time = "2026-01-21T01:20:11.315Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2d/29/cd14676d992c7b166baa7e022b369c15240d408b202410d105b23b25f737/pycapnp-2.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:fb2563de4619d359820de9d47b4704e4f7eda193ffc4a56e39cdcd2c8301c336", size = 5386505, upload-time = "2025-09-05T03:48:41.785Z" },
|
{ url = "https://files.pythonhosted.org/packages/42/00/19273a09dc4d63c3001035b449f3eb3e3f06331f3839a1e39c85cc68f080/pycapnp-2.2.2-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:0023a873567d1cb2c11de599a3d3a49810bfbbe1eacc66001ff61140a0b57040", size = 5751518, upload-time = "2026-01-21T01:20:12.913Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ae/dd/2fc57cebe9be7e4cd3d6aec0b9c8a0db9772c1b17c37cfe4f04c050422cf/pycapnp-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5265d1ae34f9c089fa6983f6c1be404ce480c82b927017290bd703328fa3f5df", size = 6095180, upload-time = "2025-09-05T03:48:43.795Z" },
|
{ url = "https://files.pythonhosted.org/packages/f2/93/6db5789b57dadfd1dc621d7db1c062c456d6a6817b19efa91af54715f845/pycapnp-2.2.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2905d571800c8871b14bba31effc80383d321eaced37506ce050521c5962eb61", size = 5436583, upload-time = "2026-01-21T01:20:14.961Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5a/16/da8c1ada7770a532c859df475533eec5a1b2f5e81a269466a2fe670c5747/pycapnp-2.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b0a56370a868f752375a785bfb7e06b55cbe71605972615d1220c380bc452380", size = 6603414, upload-time = "2025-09-05T03:48:45.457Z" },
|
{ url = "https://files.pythonhosted.org/packages/f2/74/02872a27f1ebc410c78a93023349d76200919db60e2397d460021f79fe6a/pycapnp-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f731680b232235038f4d7390c2e6d6f1dc03d42d0e2c12f72e99e666cefdff01", size = 6146136, upload-time = "2026-01-21T01:20:16.685Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f0/e6/a36eacaf2da6a5ac9c6565600e559edf95115ff990aa3379aee8dd7ba4fe/pycapnp-2.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5d7403c25275cf4badf6f9d0c07b1cb94fcdd599df81aba9b621c32b3dcefae9", size = 6621440, upload-time = "2025-09-05T03:48:47.706Z" },
|
{ url = "https://files.pythonhosted.org/packages/16/35/7df523707e5080cf3f28a39e029ce7d41feaa0097fb16ba58ec229aadce2/pycapnp-2.2.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6eed184d6e7e8d2ed7ef3ffd35fc2a6616835342ca99457845945dbe088b8874", size = 6459689, upload-time = "2026-01-21T01:20:18.492Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/81/54/9150c03638cf4ecdf1664867382d0049146c658d6de30f189817c502df1a/pycapnp-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dea5d0d250fe4851b42cd380a207d773ebae76a990e542a888a5f1442f4c247e", size = 6354219, upload-time = "2025-09-05T03:48:49.336Z" },
|
{ url = "https://files.pythonhosted.org/packages/c7/4e/26b6c9c5fa210748288338a53feaaa4e1cf466f38b0f28b0385289036179/pycapnp-2.2.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:2e7b6b2339e394cd7aed712d01303313a5e50259d68003ed63b50bf73ba382d5", size = 6659002, upload-time = "2026-01-21T01:20:20.371Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/66/3e/e49ba2d74456d53b570c8d30a660c3b29ecfea075d5dd663132ff9049f19/pycapnp-2.1.0-cp311-cp311-win32.whl", hash = "sha256:593844c3cd92937eb5e7cd47ea3a62cde2d49a1fc05dba644f513c68f60f1318", size = 1053647, upload-time = "2025-09-05T03:48:51.108Z" },
|
{ url = "https://files.pythonhosted.org/packages/da/33/c1f6415db40cb997d0b501ea0e9b98c8cca67d20dee75024514454714fdd/pycapnp-2.2.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:19a58b202a306c8a5b1ceb939bd1b6521061d161cf7c19fde3fcedc4db6e20dd", size = 6673137, upload-time = "2026-01-21T01:20:22.047Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/53/de/2b61908dc6abf25b17fed6b5a3b42a2226ec09467a3944f1d845ac29ef9b/pycapnp-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac13dd30062bb9985ae9ec4feca106af2b4fdac6468a09c7b74ad754f3921a06", size = 1208911, upload-time = "2025-09-05T03:48:53.219Z" },
|
{ url = "https://files.pythonhosted.org/packages/8d/37/abb9037f22df289bcf1a7c25db36fb28ad82df3a7ddbaef5140953218bc6/pycapnp-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:973d132853433054739646958719301bb925621c2649e8dbcee0d7e9aaffa926", size = 6405879, upload-time = "2026-01-21T01:20:23.676Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/74/0e/66b41ba600e5f2523e900b7cc0d2e8496b397a1f2d6a5b7b323ab83418b7/pycapnp-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d2ec561bc948d11f64f43bf9601bede5d6a603d105ae311bd5583c7130624a4", size = 1619223, upload-time = "2025-09-05T03:48:54.64Z" },
|
{ url = "https://files.pythonhosted.org/packages/04/b7/e256add75663db169170257717943edc4beb3627a51d0b8ae6619a4f2f18/pycapnp-2.2.2-cp311-cp311-win32.whl", hash = "sha256:b2df0674a4edcbf89829e3537815c760b95fae2e37ec0a14af37dda05d62d062", size = 1061803, upload-time = "2026-01-21T01:20:25.134Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/40/6e/9bcb30180bd40cb0534124ff7f8ba8746a735018d593f608bf40c97821c0/pycapnp-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:132cd97f57f6b6636323ca9b68d389dd90b96e87af38cde31e2b5c5a064f277e", size = 1484321, upload-time = "2025-09-05T03:48:55.85Z" },
|
{ url = "https://files.pythonhosted.org/packages/1c/64/f7c31fbead4a05340deabf8d4a5f541e8c3f00f63dbe79b31525bc108e40/pycapnp-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:a662c8bcc27f00ab86a78d377d01e42a61b510d0e33399267fef7639d020c71f", size = 1217362, upload-time = "2026-01-21T01:20:28.205Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/14/0a/9ee1c9ecaff499e4fd1df2f0335bc20f666ec6ce5cd80f8ab055007f3c9b/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:568e79268ba7c02a71fe558a8aec1ae3c0f0e6aff809ff618a46afe4964957d2", size = 5143502, upload-time = "2025-09-05T03:48:57.733Z" },
|
{ url = "https://files.pythonhosted.org/packages/8a/76/f8f81d32ddf950e934ec144facbc112e5acbef31a63ba5be0c5f34a00fd5/pycapnp-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b86cb8ea5b8011b562c4e022325a826a62f91196ceb5aa33a766c0bea0b8fd3", size = 1605194, upload-time = "2026-01-21T01:20:29.604Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4d/50/65837e1416f7a8861ca1e8fe4582a5aef37192d7ef5e2ecfe46880bfdf9c/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:bcbf6f882d78d368c8e4bb792295392f5c4d71ddffa13a48da27e7bd47b99e37", size = 5508134, upload-time = "2025-09-05T03:48:59.383Z" },
|
{ url = "https://files.pythonhosted.org/packages/50/dd/a31be782d56a8648fef899f39aeeab867cf544a6b170871e3f4cbfc58af6/pycapnp-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2353531cfa669e3eeb99be9f993573341650276abec46676d687cc12b3e6b6d9", size = 1486613, upload-time = "2026-01-21T01:20:31.415Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a1/59/46df6db800e77dbc3cc940723fb3fd7bc837327c858edf464a0f904bf547/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:dc25b96e393410dde25c61c1df3ce644700ef94826c829426d58c2c6b3e2d2f5", size = 5631794, upload-time = "2025-09-05T03:49:03.511Z" },
|
{ url = "https://files.pythonhosted.org/packages/aa/bf/8da830dda94eb7327c6508d6c26fbd964897d742f8c1c0ec48623f0c515b/pycapnp-2.2.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:ee27bdc78c7ccd8eaa0fe31e09f0ec4ef31deda3f475fc9373bb4b0de8083053", size = 5186701, upload-time = "2026-01-21T01:20:32.836Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/63/9d/18e978500d5f6bd8d152f4d6919e3cfb83ead8a71c14613bbb54322df8b9/pycapnp-2.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:48938e0436ab1be615fc0a41434119a2065490a6212b9a5e56949e89b0588b76", size = 5369378, upload-time = "2025-09-05T03:49:05.539Z" },
|
{ url = "https://files.pythonhosted.org/packages/8d/a1/13d0baa2f337f4f6fe8c2142646ba437a26b9c433f5d7ce016a912bad052/pycapnp-2.2.2-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:a8ded808911d1d7a9a2197626c09eea6e269e74dc1276760789538b1efcf6cd5", size = 5239464, upload-time = "2026-01-21T01:20:34.793Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/96/dc/726f1917e9996dc29f9fd1cf30674a14546cdbdfa0777e1982b6bd1ad628/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c20de0f6e0b3fa9fa1df3864cf46051db3511b63bc29514d1092af65f2b82a0", size = 5999140, upload-time = "2025-09-05T03:49:07.341Z" },
|
{ url = "https://files.pythonhosted.org/packages/82/76/0451c64b5f0132e4b75a0afe8cec957c8bf8fa981264a7c0b264cb94663e/pycapnp-2.2.2-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:59e92e1db40041d82a95eab0bd8de2676ce50c6b97c1457e2edde4d134b6d046", size = 5542887, upload-time = "2026-01-21T01:20:36.463Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/fd/3a/3bbc4c5776fc32fbf8a59df5c7c5810efd292b933cd6545eb4b16d896268/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:18caca6527862475167c10ea0809531130585aa8a86cc76cd1629eb87ee30637", size = 6454308, upload-time = "2025-09-05T03:49:08.998Z" },
|
{ url = "https://files.pythonhosted.org/packages/04/00/d025d68d9a5330d55cbe2d018091cacfef0835c3ad422eb6778c4525041f/pycapnp-2.2.2-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:ee1e9ac2f0b80fa892b922b60e36efc925d072ecf1204ba3e59d8d9ac7c3dc83", size = 5659696, upload-time = "2026-01-21T01:20:38.069Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/bf/dd/17e2d7808424f10ffddc47329b980488ed83ec716c504791787e593a7a93/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9dcc11237697007b66e3bfc500d2ad892bd79672c9b50d61fbf728c6aaf936de", size = 6544212, upload-time = "2025-09-05T03:49:10.675Z" },
|
{ url = "https://files.pythonhosted.org/packages/58/b7/28f7c539a5f4cbaa12e55ec27d081d11473464230f2e801e4714606d3453/pycapnp-2.2.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:53273b385be78ed8ac997ff8697f2a4c760e93c190b509822a937de5531f4861", size = 5413827, upload-time = "2026-01-21T01:20:39.781Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6a/5b/68090013128d7853f34c43828dd4dc80a7c8516fd1b56057b134e1e4c2c0/pycapnp-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c151edf78155b6416e7cb31e2e333d302d742ba52bb37d4dbdf71e75cc999d46", size = 6295279, upload-time = "2025-09-05T03:49:12.712Z" },
|
{ url = "https://files.pythonhosted.org/packages/3c/a7/83bc13d90675f0cee8a38d4ad8401bb2f8662c543b3a6622aeffb7b56b1e/pycapnp-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:812cbdd002bc542b63f969b85c6b9041dfdaf4185613635a6d4feea84c9092fa", size = 6046815, upload-time = "2026-01-21T01:20:42.172Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5b/52/7d85212b4fcf127588888f71d3dbf5558ee7dc302eba760b12b1b325f9a3/pycapnp-2.1.0-cp312-cp312-win32.whl", hash = "sha256:c09b28419321dafafc644d60c57ff8ccaf3c3e686801b6060c612a7a3c580944", size = 1038995, upload-time = "2025-09-05T03:49:14.165Z" },
|
{ url = "https://files.pythonhosted.org/packages/0d/8a/80f46baa1684bbcc4754ce22c5a44693a1209a64de6df2b256b85b8b8a97/pycapnp-2.2.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9c330218a44bd649b96f565dbf5326d183fdd20f9887bdedfeabd73f0366c2e1", size = 6367625, upload-time = "2026-01-21T01:20:44.004Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f2/12/25d283ebf5c28717364647672e7494dc46196ca7a662f5420e4866f45687/pycapnp-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:560cb69cc02b0347e85b0629e4c2f0a316240900aa905392f9df6bab0a359989", size = 1176620, upload-time = "2025-09-05T03:49:15.545Z" },
|
{ url = "https://files.pythonhosted.org/packages/02/00/60e82eaf6b4e78d887157bf9f18234c852771cc575355e63d1114c4a5d79/pycapnp-2.2.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:796aa0ba18bcd4e6b2815471bbed059ad7ee8a815a30e81ac8a9aa030ec7818d", size = 6487265, upload-time = "2026-01-21T01:20:46.137Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/57/6e/2dedd8f95dc22357c50a775ee2b8711b3d711f30344d244141e0e1962c3e/pycapnp-2.2.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:251a6abdd64b9b11d2a8e16fc365b922ef6ba6c968959b72a3a3d9d8ec8cc8d7", size = 6576699, upload-time = "2026-01-21T01:20:47.987Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/2f/53/f7f69ed1d11ea30ea4f0f6d8319fbc18bc8781c480c118005e0a394492a7/pycapnp-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6aab811e0fcc27ae8bf5f04dedaa7e0af47e0d4db51d9c85ab0d2dad26a46bd7", size = 6344114, upload-time = "2026-01-21T01:20:50.367Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/ab/78/ab78ee42797ff44c7e1fc0d1aa9396c6742cb05ff01a7cdf9c8f19e0defe/pycapnp-2.2.2-cp312-cp312-win32.whl", hash = "sha256:5061c85dd8f843b2656720ca6976d2a9b418845580c6f6d9602f7119fc2208d5", size = 1047207, upload-time = "2026-01-21T01:20:51.842Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/4c/fb/6edf56d5144c476270fa8b2e6a660ef5a188fb0097193e342618fbcb0210/pycapnp-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:700eb8c77405222903af3fb5a371c0d766f86139c3d51f4bff41ccd6403b51f9", size = 1185178, upload-time = "2026-01-21T01:20:53.429Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -519,7 +523,7 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "requests"
|
name = "requests"
|
||||||
version = "2.33.1"
|
version = "2.34.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "certifi" },
|
{ name = "certifi" },
|
||||||
@@ -527,34 +531,34 @@ dependencies = [
|
|||||||
{ name = "idna" },
|
{ name = "idna" },
|
||||||
{ name = "urllib3" },
|
{ name = "urllib3" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" },
|
{ url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruff"
|
name = "ruff"
|
||||||
version = "0.15.10"
|
version = "0.15.13"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/e7/d9/aa3f7d59a10ef6b14fe3431706f854dbf03c5976be614a9796d36326810c/ruff-0.15.10.tar.gz", hash = "sha256:d1f86e67ebfdef88e00faefa1552b5e510e1d35f3be7d423dc7e84e63788c94e", size = 4631728, upload-time = "2026-04-09T14:06:09.884Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/24/21/a7d5c126d5b557715ef81098f3db2fe20f622a039ff2e626af28d674ab80/ruff-0.15.13.tar.gz", hash = "sha256:f9d89f17f7ba7fb2ed42921f0df75da797a9a5d71bc39049e2c687cf2baf44b7", size = 4678180, upload-time = "2026-05-14T13:44:37.869Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/eb/00/a1c2fdc9939b2c03691edbda290afcd297f1f389196172826b03d6b6a595/ruff-0.15.10-py3-none-linux_armv6l.whl", hash = "sha256:0744e31482f8f7d0d10a11fcbf897af272fefdfcb10f5af907b18c2813ff4d5f", size = 10563362, upload-time = "2026-04-09T14:06:21.189Z" },
|
{ url = "https://files.pythonhosted.org/packages/c6/61/11d458dc6ac22504fd8e237b29dfd40504c7fbbcc8930402cfe51a8e63ed/ruff-0.15.13-py3-none-linux_armv6l.whl", hash = "sha256:444b580fc72fd6887e650acd3e575e18cdc79dbcf42fb4030b491057921f61f8", size = 10738279, upload-time = "2026-05-14T13:44:18.7Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5c/15/006990029aea0bebe9d33c73c3e28c80c391ebdba408d1b08496f00d422d/ruff-0.15.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b1e7c16ea0ff5a53b7c2df52d947e685973049be1cdfe2b59a9c43601897b22e", size = 10951122, upload-time = "2026-04-09T14:06:02.236Z" },
|
{ url = "https://files.pythonhosted.org/packages/86/ca/caa871ee7be718c45256fada4e16a218ee3e33f0c4a46b729a60a24912e6/ruff-0.15.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6590d009e7cb7ebf36f83dbdd44a3fa48a0994ff6f1cdc1b08006abe58f98dc7", size = 11124798, upload-time = "2026-05-14T13:44:06.427Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/f2/c0/4ac978fe874d0618c7da647862afe697b281c2806f13ce904ad652fa87e4/ruff-0.15.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:93cc06a19e5155b4441dd72808fdf84290d84ad8a39ca3b0f994363ade4cebb1", size = 10314005, upload-time = "2026-04-09T14:06:00.026Z" },
|
{ url = "https://files.pythonhosted.org/packages/d3/19/43f5f2e568dddde567fc41f8471f9432c09563e19d3e617a48cfa52f8f0a/ruff-0.15.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1c26d2f66163deeb6e08d8b39fbbe983ce3c71cea06a6d7591cfd1421793c629", size = 10460761, upload-time = "2026-05-14T13:44:04.375Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/da/73/c209138a5c98c0d321266372fc4e33ad43d506d7e5dd817dd89b60a8548f/ruff-0.15.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83e1dd04312997c99ea6965df66a14fb4f03ba978564574ffc68b0d61fd3989e", size = 10643450, upload-time = "2026-04-09T14:05:42.137Z" },
|
{ url = "https://files.pythonhosted.org/packages/99/df/cf938cd6de3003178f03ad7c1ea2a6c099468c03a35037985070b37e76be/ruff-0.15.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbd6f94b434f896308e4d57fb7bfde0d02b99f7a64b3bdab0fdfa6a864203a5", size = 10804451, upload-time = "2026-05-14T13:44:25.221Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ec/76/0deec355d8ec10709653635b1f90856735302cb8e149acfdf6f82a5feb70/ruff-0.15.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8154d43684e4333360fedd11aaa40b1b08a4e37d8ffa9d95fee6fa5b37b6fab1", size = 10379597, upload-time = "2026-04-09T14:05:49.984Z" },
|
{ url = "https://files.pythonhosted.org/packages/c7/7d/5d0973129b154ded2225729169d7068f26b467760b146493fde138415f23/ruff-0.15.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3259f3be4d181bda591da5db2571aed6853c6a048157756448020bc6c5cd22", size = 10534285, upload-time = "2026-05-14T13:44:08.888Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/dc/be/86bba8fc8798c081e28a4b3bb6d143ccad3fd5f6f024f02002b8f08a9fa3/ruff-0.15.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ab88715f3a6deb6bde6c227f3a123410bec7b855c3ae331b4c006189e895cef", size = 11146645, upload-time = "2026-04-09T14:06:12.246Z" },
|
{ url = "https://files.pythonhosted.org/packages/1f/e3/6b999bbc66cd51e5f073842bc2a3995e99c5e0e72e16b15e7261f7abf57a/ruff-0.15.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae9c17e5eb4430c154e76abc25d79a318190f5a997f38fb6b114416c5319ffc9", size = 11312063, upload-time = "2026-05-14T13:44:11.274Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a8/89/140025e65911b281c57be1d385ba1d932c2366ca88ae6663685aed8d4881/ruff-0.15.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a768ff5969b4f44c349d48edf4ab4f91eddb27fd9d77799598e130fb628aa158", size = 12030289, upload-time = "2026-04-09T14:06:04.776Z" },
|
{ url = "https://files.pythonhosted.org/packages/af/5a/642639e9f5db04f1e97fbd6e091c6fd20725bdf072fb114d00eefb9e6eb8/ruff-0.15.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e2e39bff6c341f4b577a21b801326fab0b11847f48fcaa83f00a113c9b3cb55", size = 12183079, upload-time = "2026-05-14T13:44:01.634Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/88/de/ddacca9545a5e01332567db01d44bd8cf725f2db3b3d61a80550b48308ea/ruff-0.15.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ee3ef42dab7078bda5ff6a1bcba8539e9857deb447132ad5566a038674540d0", size = 11496266, upload-time = "2026-04-09T14:05:55.485Z" },
|
{ url = "https://files.pythonhosted.org/packages/19/4c/7585735f6b53b0f12de13618b2f7d250a844f018822efc899df2e7b8295f/ruff-0.15.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8d9a8e08013542e94d3220bc5b62cc3e5ef87c5f74bff367d3fac14fab013e6", size = 11440833, upload-time = "2026-05-14T13:43:59.043Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/bc/bb/7ddb00a83760ff4a83c4e2fc231fd63937cc7317c10c82f583302e0f6586/ruff-0.15.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51cb8cc943e891ba99989dd92d61e29b1d231e14811db9be6440ecf25d5c1609", size = 11256418, upload-time = "2026-04-09T14:05:57.69Z" },
|
{ url = "https://files.pythonhosted.org/packages/e8/31/bf1a0803d077e679cfeee5f2f67290a0fa79c7385b5d9a8c17b9db2c48f0/ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc411dfebe5eebe55ce041c6ae080eb7668955e866daa2fbb16692a784f1c4ca", size = 11434486, upload-time = "2026-05-14T13:44:27.761Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/dc/8d/55de0d35aacf6cd50b6ee91ee0f291672080021896543776f4170fc5c454/ruff-0.15.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:e59c9bdc056a320fb9ea1700a8d591718b8faf78af065484e801258d3a76bc3f", size = 11288416, upload-time = "2026-04-09T14:05:44.695Z" },
|
{ url = "https://files.pythonhosted.org/packages/e1/4e/62c9b999875d4f14db80f277c030578f5e249c9852d65b7ac7ad0b43c041/ruff-0.15.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:768494eb08b9cee54e2fd27969966f74db5a57f6eaa7a90fcb3306af34dfc4bd", size = 11385189, upload-time = "2026-05-14T13:44:13.704Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/68/cf/9438b1a27426ec46a80e0a718093c7f958ef72f43eb3111862949ead3cc1/ruff-0.15.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:136c00ca2f47b0018b073f28cb5c1506642a830ea941a60354b0e8bc8076b151", size = 10621053, upload-time = "2026-04-09T14:05:52.782Z" },
|
{ url = "https://files.pythonhosted.org/packages/fc/89/7e959047a104df3eb12863447c110140191fc5b6c4f379ea2e803fcdb0e4/ruff-0.15.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb75f9a3a7e42ffe117d734494e6c5e5cb3565d66e12612cb63d0e572a41a5b6", size = 10781380, upload-time = "2026-05-14T13:43:56.734Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/4c/50/e29be6e2c135e9cd4cb15fbade49d6a2717e009dff3766dd080fcb82e251/ruff-0.15.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8b80a2f3c9c8a950d6237f2ca12b206bccff626139be9fa005f14feb881a1ae8", size = 10378302, upload-time = "2026-04-09T14:06:14.361Z" },
|
{ url = "https://files.pythonhosted.org/packages/ff/52/5fd18f3b88cab63e88aa11516b3b4e1e5f720e5c330f8dbe5c26210f41f8/ruff-0.15.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8cb74dd33bb2f6613faf7fc03b660053b5ac4f80e706d5788c6335e2a8048d51", size = 10540605, upload-time = "2026-05-14T13:44:20.748Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/18/2f/e0b36a6f99c51bb89f3a30239bc7bf97e87a37ae80aa2d6542d6e5150364/ruff-0.15.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e3e53c588164dc025b671c9df2462429d60357ea91af7e92e9d56c565a9f1b07", size = 10850074, upload-time = "2026-04-09T14:06:16.581Z" },
|
{ url = "https://files.pythonhosted.org/packages/e8/e0/9e35f338990d3e41a82875ff7053ffe97541dae81c9d02143177f381d572/ruff-0.15.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7ef823f817fcd191dc934e984be9cf4094f808effa16f2542ad8e821ba02bbf2", size = 11036554, upload-time = "2026-05-14T13:44:16.256Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/11/08/874da392558ce087a0f9b709dc6ec0d60cbc694c1c772dab8d5f31efe8cb/ruff-0.15.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b0c52744cf9f143a393e284125d2576140b68264a93c6716464e129a3e9adb48", size = 11358051, upload-time = "2026-04-09T14:06:18.948Z" },
|
{ url = "https://files.pythonhosted.org/packages/c2/13/070fb048c24080fba188f66371e2a92785be257ad02242066dc7255ac6e9/ruff-0.15.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f345a13937bd7f09f6f5d19fa0721b0c103e00e7f62bc67089a8e5e037719e0b", size = 11528133, upload-time = "2026-05-14T13:44:22.808Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/e4/46/602938f030adfa043e67112b73821024dc79f3ab4df5474c25fa4c1d2d14/ruff-0.15.10-py3-none-win32.whl", hash = "sha256:d4272e87e801e9a27a2e8df7b21011c909d9ddd82f4f3281d269b6ba19789ca5", size = 10588964, upload-time = "2026-04-09T14:06:07.14Z" },
|
{ url = "https://files.pythonhosted.org/packages/6b/8c/b1e1666aef7fc6555094d73ae6cd981701781ae85b97ceefc0eebd0b4668/ruff-0.15.13-py3-none-win32.whl", hash = "sha256:4044f94208b3b05ba0fc4a4abd0558cf4d6459bd18325eead7fd8cc66f909b41", size = 10721455, upload-time = "2026-05-14T13:44:35.697Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/25/b6/261225b875d7a13b33a6d02508c39c28450b2041bb01d0f7f1a83d569512/ruff-0.15.10-py3-none-win_amd64.whl", hash = "sha256:28cb32d53203242d403d819fd6983152489b12e4a3ae44993543d6fe62ab42ed", size = 11745044, upload-time = "2026-04-09T14:05:39.473Z" },
|
{ url = "https://files.pythonhosted.org/packages/ab/a6/870a3e8a50590bb92be184ad928c2922f088b00d9dc5c5ec7b924ee08c22/ruff-0.15.13-py3-none-win_amd64.whl", hash = "sha256:7064884d442b7d477b4e7473d12da7f08851d2b1982763c5d3f388a19468a1a4", size = 11900409, upload-time = "2026-05-14T13:44:30.389Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/58/ed/dea90a65b7d9e69888890fb14c90d7f51bf0c1e82ad800aeb0160e4bacfd/ruff-0.15.10-py3-none-win_arm64.whl", hash = "sha256:601d1610a9e1f1c2165a4f561eeaa2e2ea1e97f3287c5aa258d3dab8b57c6188", size = 11035607, upload-time = "2026-04-09T14:05:47.593Z" },
|
{ url = "https://files.pythonhosted.org/packages/9b/36/9c015cd052fca743dae8cb2aeb16b551444787467db42ceab0fc968865af/ruff-0.15.13-py3-none-win_arm64.whl", hash = "sha256:2471da9bd1068c8c064b5fd9c0c4b6dddffd6369cb1cd68b29993b1709ff1b21", size = 11179336, upload-time = "2026-05-14T13:44:33.026Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -602,62 +606,64 @@ wheels = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tree-sitter-c"
|
name = "tree-sitter-c"
|
||||||
version = "0.24.1"
|
version = "0.24.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/f1/f5/ba8cd08d717277551ade8537d3aa2a94b907c6c6e0fbcf4e4d8b1c747fa3/tree_sitter_c-0.24.1.tar.gz", hash = "sha256:7d2d0cda0b8dda428c81440c1e94367f9f13548eedca3f49768bde66b1422ad6", size = 228014, upload-time = "2025-05-24T17:32:58.384Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/a6/c9/3834f3d9278251aea7312274971bc4c45b17aec2490fd4b884d93bd7019a/tree_sitter_c-0.24.2.tar.gz", hash = "sha256:1628584df0299b5a340aa63f8e67b6c97c91517f52fa7e7a4c557e40adb330a9", size = 228397, upload-time = "2026-04-22T08:06:14.491Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/15/c7/c817be36306e457c2d36cc324789046390d9d8c555c38772429ffdb7d361/tree_sitter_c-0.24.1-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9c06ac26a1efdcc8b26a8a6970fbc6997c4071857359e5837d4c42892d45fe1e", size = 80940, upload-time = "2025-05-24T17:32:49.967Z" },
|
{ url = "https://files.pythonhosted.org/packages/28/c1/26ed17730ec2c17bedc1b673349e5e0a466c578e3eb0327c3b73cf52bf97/tree_sitter_c-0.24.2-cp310-abi3-macosx_10_9_x86_64.whl", hash = "sha256:4d4579a8b54f0a442f903d88d3304cab77cd5c2031d4015baa4f2f8e15d6dcb7", size = 81016, upload-time = "2026-04-22T08:06:07.208Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/7a/42/283909467290b24fdbc29bb32ee20e409a19a55002b43175d66d091ca1a4/tree_sitter_c-0.24.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:942bcd7cbecd810dcf7ca6f8f834391ebf0771a89479646d891ba4ca2fdfdc88", size = 86304, upload-time = "2025-05-24T17:32:51.271Z" },
|
{ url = "https://files.pythonhosted.org/packages/c1/1c/1140db75e7e375cda3c68792a33826c4fd40b5b98c3259d93c75f6c8368f/tree_sitter_c-0.24.2-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:97bc80a224d48215d4e6e6376bf30d114f4c317b8145ff1b02afe785d4ba7bdd", size = 86213, upload-time = "2026-04-22T08:06:08.136Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/94/53/fb4f61d4e5f15ec3da85774a4df8e58d3b5b73036cf167f0203b4dd9d158/tree_sitter_c-0.24.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a74cfd7a11ca5a961fafd4d751892ee65acae667d2818968a6f079397d8d28c", size = 109996, upload-time = "2025-05-24T17:32:52.119Z" },
|
{ url = "https://files.pythonhosted.org/packages/e9/8c/0dfb88d726f8821d1c4c36042f092be974a800afd734307a595b8604190c/tree_sitter_c-0.24.2-cp310-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5041ef67eb68ce6bc8bb0b1f8ef3a5585ce523dae0c7eec109ab0627dd75aede", size = 94264, upload-time = "2026-04-22T08:06:08.918Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/5e/e8/fc541d34ee81c386c5453c2596c1763e8e9cd7cb0725f39d7dfa2276afa4/tree_sitter_c-0.24.1-cp310-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6a807705a3978911dc7ee26a7ad36dcfacb6adfc13c190d496660ec9bd66707", size = 98137, upload-time = "2025-05-24T17:32:53.361Z" },
|
{ url = "https://files.pythonhosted.org/packages/87/78/47dc570e7aee6b0a1ecc2520b30639cc2b06003154c9ab0672d86bf720d5/tree_sitter_c-0.24.2-cp310-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c098bedcd5ac86ff93fa734d51d1dd86aed40fd5ed7d634c7af11380a0469969", size = 94560, upload-time = "2026-04-22T08:06:09.852Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/32/c6/d0563319cae0d5b5780a92e2806074b24afea2a07aa4c10599b899bda3ec/tree_sitter_c-0.24.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:789781afcb710df34144f7e2a20cd80e325114b9119e3956c6bd1dd2d365df98", size = 94148, upload-time = "2025-05-24T17:32:54.855Z" },
|
{ url = "https://files.pythonhosted.org/packages/29/37/75d59d3f74f4cfc00f04472917e933d8a9c9fdc6eff980ef9552e010e6aa/tree_sitter_c-0.24.2-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:82842c5a5f2acd93f4de10038c33ac179c8979defc39376f990348d6289e933b", size = 94023, upload-time = "2026-04-22T08:06:10.682Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/50/5a/6361df7f3fa2310c53a0d26b4702a261c332da16fa9d801e381e3a86e25f/tree_sitter_c-0.24.1-cp310-abi3-win_amd64.whl", hash = "sha256:290bff0f9c79c966496ebae45042f77543e6e4aea725f40587a8611d566231a8", size = 84703, upload-time = "2025-05-24T17:32:56.084Z" },
|
{ url = "https://files.pythonhosted.org/packages/64/57/8fc655d5a446a70a637e92b98bd2fdaab88bf5bb5b36076ac4add544808d/tree_sitter_c-0.24.2-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2b42e8e22202c251f8629306f9321233542e07a6e01611b5fe83489272143eb", size = 94160, upload-time = "2026-04-22T08:06:11.497Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/22/6a/210a302e8025ac492cbaea58d3720d66b7d8034c5d747ac5e4d2d235aa25/tree_sitter_c-0.24.1-cp310-abi3-win_arm64.whl", hash = "sha256:d46bbda06f838c2dcb91daf767813671fd366b49ad84ff37db702129267b46e1", size = 82715, upload-time = "2025-05-24T17:32:57.248Z" },
|
{ url = "https://files.pythonhosted.org/packages/c1/f7/72a1d6b42dd31fd37e03ff67e7dc5ee572301499e6b216002b8dd42a1714/tree_sitter_c-0.24.2-cp310-abi3-win_amd64.whl", hash = "sha256:abb549225091f7b25df2dd3a0143ece6e208f7055d8bcb4700b41ee79b9ef1e1", size = 84669, upload-time = "2026-04-22T08:06:12.347Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/e2/9d/7475d9ae8ef679aa36c7dfe6c903ab78e573651c68b6ef9862d6a3f994db/tree_sitter_c-0.24.2-cp310-abi3-win_arm64.whl", hash = "sha256:4a2f4371cd816cc3153458f69062135ebb2ea5f275ddd90494e5c823d778204a", size = 82956, upload-time = "2026-04-22T08:06:13.364Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ty"
|
name = "ty"
|
||||||
version = "0.0.29"
|
version = "0.0.37"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/47/d5/853561de49fae38c519e905b2d8da9c531219608f1fccc47a0fc2c896980/ty-0.0.29.tar.gz", hash = "sha256:e7936cca2f691eeda631876c92809688dbbab68687c3473f526cd83b6a9228d8", size = 5469221, upload-time = "2026-04-05T15:01:21.328Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/c7/c3/60bc4829e0c1a8ff80b592067e1185a7b5ea64608acb0c676c44d5137d52/ty-0.0.37.tar.gz", hash = "sha256:f873f69627bd7f4ef8d57f716c63e5c63d7d1b7327ab3de185c7287a75223011", size = 5655422, upload-time = "2026-05-16T05:57:21.315Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/03/b7/911f9962115acfa24e3b2ec9d4992dd994c38e8769e1b1d7680bb4d28a51/ty-0.0.29-py3-none-linux_armv6l.whl", hash = "sha256:b8a40955f7660d3eaceb0d964affc81b790c0765e7052921a5f861ff8a471c30", size = 10568206, upload-time = "2026-04-05T15:01:19.165Z" },
|
{ url = "https://files.pythonhosted.org/packages/b8/fe/180dd6914f9db33ad0200fbeaa429dd1fb0a4e6d98320dc1775f100a91af/ty-0.0.37-py3-none-linux_armv6l.whl", hash = "sha256:66cf7310189856e15f690559ddf37735476d2644db917d92f7cef13e5c834adf", size = 11246028, upload-time = "2026-05-16T05:57:41.744Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/fe/c3/fcae2167d4c77a97269f92f11d1b43b03617f81de1283d5d05b43432110c/ty-0.0.29-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6b6849adae15b00bbe2d3c5b078967dcb62eba37d38936b8eeb4c81a82d2e3b8", size = 10442530, upload-time = "2026-04-05T15:01:28.471Z" },
|
{ url = "https://files.pythonhosted.org/packages/ef/a2/fa0cfd31467ad99b2db8c81ee9e2b4574589974a3eb9723be825e15b300c/ty-0.0.37-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2048f3c44ee6c7dde6e0ca064f99c6cada8f6de8ccdcfad2d856a429f8a4ac82", size = 11001460, upload-time = "2026-05-16T05:57:35.27Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/97/33/5a6bfa240cfcb9c36046ae2459fa9ea23238d20130d8656ff5ac4d6c012a/ty-0.0.29-py3-none-macosx_11_0_arm64.whl", hash = "sha256:dcdd9b17209788152f7b7ea815eda07989152325052fe690013537cc7904ce49", size = 9915735, upload-time = "2026-04-05T15:01:10.365Z" },
|
{ url = "https://files.pythonhosted.org/packages/10/3f/db60ba9be8b95a464ece0ba103e534047c34b49fee12f5e101f83f8d66db/ty-0.0.37-py3-none-macosx_11_0_arm64.whl", hash = "sha256:32c7b9b5b626aacdec334b44a2698e5f7b80df55bf7338267084d00d4b9546b3", size = 10446549, upload-time = "2026-05-16T05:57:37.252Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/b3/1e/318f45fae232118e81a6306c30f50de42c509c412128d5bd231eab699ffb/ty-0.0.29-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d8ed4789bae78ffaf94462c0d25589a734cab0366b86f2bbcb1bb90e1a7a169", size = 10419748, upload-time = "2026-04-05T15:01:32.375Z" },
|
{ url = "https://files.pythonhosted.org/packages/56/6f/11dd7174b20ebcb37a3d3b68f60b3940e37e4356e0accd03e2d7f9f70690/ty-0.0.37-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9fba1bebccf1e656bc5e3787acc5a191c491041ee4d12fe8fe2eff64e7b190d", size = 10961016, upload-time = "2026-05-16T05:57:16.394Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/a9/a8/5687872e2ab5a0f7dd4fd8456eac31e9381ad4dc74961f6f29965ad4dd91/ty-0.0.29-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:91ec374b8565e0ad0900011c24641ebbef2da51adbd4fb69ff3280c8a7eceb02", size = 10394738, upload-time = "2026-04-05T15:01:06.473Z" },
|
{ url = "https://files.pythonhosted.org/packages/65/dd/3c17ce2860c525817c42c82d7075391b1f5615d36c03aa2d26647a224e8a/ty-0.0.37-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f987c5fb59aa5017ee8e8c5b57a07390f584e58e572255acd0fa44b3e0b238df", size = 11022093, upload-time = "2026-05-16T05:57:32.741Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/de/68/015d118097eeb95e6a44c4abce4c0a28b7b9dfb3085b7f0ee48e4f099633/ty-0.0.29-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:298a8d5faa2502d3810bbbb47a030b9455495b9921594206043c785dd61548cf", size = 10910613, upload-time = "2026-04-05T15:01:17.17Z" },
|
{ url = "https://files.pythonhosted.org/packages/d0/a8/e7a40b0b57660921dd3482d219add963973b52ae8507abd88f48439704b5/ty-0.0.37-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4168f53146e7a3f52560ff433f238352591c9b1a9ed09397fbb776ddef4f89c", size = 11486333, upload-time = "2026-05-16T05:57:18.839Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/1c/01/47ce3c6c53e0670eadbe80756b167bf80ed6681d1ba57cfde2e8065a13d1/ty-0.0.29-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c8fba1a3524c6109d1e020d92301c79d41bf442fa8d335b9fa366239339cb70", size = 11475750, upload-time = "2026-04-05T15:01:30.461Z" },
|
{ url = "https://files.pythonhosted.org/packages/da/5f/2c406b98244bc1ad42afdd35f466bcef88664210957dcbb5172254ff2462/ty-0.0.37-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e487eafdb80a48223ce68a01f9287528216ffe0126d1629ff11e4f7c1dd3cf", size = 12093526, upload-time = "2026-05-16T05:57:04.456Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c4/cf/e361845b1081c9264ad5b7c963231bab03f2666865a9f2a115c4233f2137/ty-0.0.29-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c48adf88a70d264128c39ee922ed14a947817fced1e93c08c1a89c9244edcde", size = 11190055, upload-time = "2026-04-05T15:01:12.369Z" },
|
{ url = "https://files.pythonhosted.org/packages/d3/3c/5c492a38e1b21a26370727dd4b77a53f05262e53e3be232047f22e7fa1b3/ty-0.0.37-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b49f388d063668676daaa7eef57385089d1b844279c0185bd84d4dbc3bcede6", size = 11725957, upload-time = "2026-05-16T05:57:23.356Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/79/12/0fb0857e9a62cb11586e9a712103877bbf717f5fb570d16634408cfdefee/ty-0.0.29-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ce0a7a0e96bc7b42518cd3a1a6a6298ef64ff40ca4614355c1aa807059b5c6f", size = 11020539, upload-time = "2026-04-05T15:01:37.022Z" },
|
{ url = "https://files.pythonhosted.org/packages/b2/00/8a3d9ba265cd0582342c14e4980cc0351aaaa45c6305712d398c9e2446c7/ty-0.0.37-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b96bfc1cc725d9d859abef4e3aa32a6da0f7472eaaafae2d9a6cffd729c7c61", size = 11610336, upload-time = "2026-05-16T05:57:27.888Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/20/36/5a26753802083f80cd125db6c4348ad42b3c982ec36e718e0bf4c18f75e5/ty-0.0.29-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a6ac86a05b4a3731d45365ab97780acc7b8146fa62fccb3cbe94fe6546c67a97", size = 10396399, upload-time = "2026-04-05T15:01:26.167Z" },
|
{ url = "https://files.pythonhosted.org/packages/91/4b/6ee172935cb842f5c1553b0d37215b45e9dde05a4c74fdb47fd271907122/ty-0.0.37-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:c55f39b519107cf234b794718793e11793c055e89028a282a309f690def48117", size = 11797856, upload-time = "2026-05-16T05:57:11.109Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/00/e6/b4e75b5752239ab3ab400f19faef4dbef81d05aab5d3419fda0c062a3765/ty-0.0.29-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:6bbbf53141af0f3150bf288d716263f1a3550054e4b3551ca866d38192ba9891", size = 10421461, upload-time = "2026-04-05T15:01:08.367Z" },
|
{ url = "https://files.pythonhosted.org/packages/34/ef/75a7425bf9fe74483404ff11a8cbe3aa307354e0801697d6063384157776/ty-0.0.37-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c79204350de060a077bff7f027a1d53e216cad147d826ec9862be0af2f9c3c1e", size = 10941848, upload-time = "2026-05-16T05:57:30.653Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/c0/21/1084b5b609f9abed62070ec0b31c283a403832a6310c8bbc208bd45ee1e6/ty-0.0.29-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1c9e06b770c1d0ff5efc51e34312390db31d53fcf3088163f413030b42b74f84", size = 10599187, upload-time = "2026-04-05T15:01:23.52Z" },
|
{ url = "https://files.pythonhosted.org/packages/e0/2c/7ea9dccd55961375067f99ed00fb8eabb491f6a06d0e5f09c797d2b900a6/ty-0.0.37-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:49a21b4dcb2cd94cd0298c96dfb71a2dd25f08bf7e6eefd0c33c519d058908c6", size = 11058248, upload-time = "2026-05-16T05:57:01.785Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/ab/a1/ce19a2ca717bbcc1ee11378aba52ef70b6ce5b87245162a729d9fdc2360f/ty-0.0.29-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0307fe37e3f000ef1a4ae230bbaf511508a78d24a5e51b40902a21b09d5e6037", size = 11121198, upload-time = "2026-04-05T15:01:15.22Z" },
|
{ url = "https://files.pythonhosted.org/packages/98/d7/848fde96c6610b2b1fd75823d44d8977a4525c4397f27332f054ccd6cf9c/ty-0.0.37-py3-none-musllinux_1_2_i686.whl", hash = "sha256:119332095c5974fe1dabfe4fd00c6759eeec5b99f7d7a80b2833feee5a58abdb", size = 11168423, upload-time = "2026-05-16T05:57:39.297Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/6b/6b/f1430b279af704321566ce7ec2725d3d8258c2f815ebd93e474c64cd4543/ty-0.0.29-py3-none-win32.whl", hash = "sha256:7a2a898217960a825f8bc0087e1fdbaf379606175e98f9807187221d53a4a8ed", size = 9995331, upload-time = "2026-04-05T15:01:01.32Z" },
|
{ url = "https://files.pythonhosted.org/packages/29/11/c1613ac4b64357b9067df68bac97bcb458cc426cd468a2782847238c539b/ty-0.0.37-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ac5dc593675414f68862c2f71cc04912b0e5ec5520a9c49fc71ed79205b95c33", size = 11698565, upload-time = "2026-05-16T05:57:14.206Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/d2/ef/3ef01c17785ff9a69378465c7d0faccd48a07b163554db0995e5d65a5a23/ty-0.0.29-py3-none-win_amd64.whl", hash = "sha256:fc1294200226b91615acbf34e0a9ad81caf98c081e9c6a912a31b0a7b603bc3f", size = 11023644, upload-time = "2026-04-05T15:01:04.432Z" },
|
{ url = "https://files.pythonhosted.org/packages/5f/ac/961205863903881996adb5a6f9cfe570c132882922ac226540346f15df20/ty-0.0.37-py3-none-win32.whl", hash = "sha256:33b57e4095179f06c2ae01c334833645cad94bf7d7467e073cdc3aaabea565d3", size = 10518308, upload-time = "2026-05-16T05:57:25.824Z" },
|
||||||
{ url = "https://files.pythonhosted.org/packages/2c/55/87280a994d6a2d2647c65e12abbc997ed49835794366153c04c4d9304d76/ty-0.0.29-py3-none-win_arm64.whl", hash = "sha256:f9794bbd1bb3ce13f78c191d0c89ae4c63f52c12b6daa0c6fe220b90d019d12c", size = 10428165, upload-time = "2026-04-05T15:01:34.665Z" },
|
{ url = "https://files.pythonhosted.org/packages/39/cd/f308edd0cd86e402fe3a1b5c54e0a0dfa0177d80c1557c4849510bb2a147/ty-0.0.37-py3-none-win_amd64.whl", hash = "sha256:3b159351e99cf6eed7aacfb69ae8437725d15599ac4f21c8b2e909b300498b6c", size = 11607159, upload-time = "2026-05-16T05:57:06.76Z" },
|
||||||
|
{ url = "https://files.pythonhosted.org/packages/1a/ed/5ec4b501479bc5dad55467e2fe72e797cb9c178468c0d1a514536872ebc5/ty-0.0.37-py3-none-win_arm64.whl", hash = "sha256:6c3c2b997f68c71e14242b96d48cba3c086439556af02bb4613aa458950d5c23", size = 10958817, upload-time = "2026-05-16T05:57:08.907Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unittest-parallel"
|
name = "unittest-parallel"
|
||||||
version = "1.7.6"
|
version = "1.8.2"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
dependencies = [
|
dependencies = [
|
||||||
{ name = "coverage" },
|
{ name = "coverage" },
|
||||||
]
|
]
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/08/26/b15a0337182988748210c2bcee60a780fe10057ceb23da2547ec29a1d443/unittest_parallel-1.7.6.tar.gz", hash = "sha256:b16bf52bec7b900b8fc7945de97c45f87d50025ac06c1a64e35e91c278756dfc", size = 9834, upload-time = "2025-12-01T19:17:36.599Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/4c/a8/ef232e095e36b131891f12442063c24da81e455ca8db9304494993d6bb24/unittest_parallel-1.8.2.tar.gz", hash = "sha256:42238ad1f93ef5cc88600b6bb6b8052512c591c9ba2bd57b7cdcf57ce196c01b", size = 10392, upload-time = "2026-05-01T17:30:19.738Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/e3/9f/3a7d6077488e977a6da79bf51d182dd0ea441d0bb542f443d13d1806dc95/unittest_parallel-1.7.6-py3-none-any.whl", hash = "sha256:c55eff2d1f5806ec272a0f7c7ed5309197ae4550ee37cd28d3d0864a32981bfe", size = 9260, upload-time = "2025-12-01T19:17:34.849Z" },
|
{ url = "https://files.pythonhosted.org/packages/7c/e6/ce66604ea5de192913ce8d4825565cf5ba1d97439f49b39ddecd4ec373c8/unittest_parallel-1.8.2-py3-none-any.whl", hash = "sha256:b86bb180d509f2b280cc96a5332fda6324c8cbd59de28be88dea78db3329743d", size = 9571, upload-time = "2026-05-01T17:30:18.4Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "urllib3"
|
name = "urllib3"
|
||||||
version = "2.6.3"
|
version = "2.7.0"
|
||||||
source = { registry = "https://pypi.org/simple" }
|
source = { registry = "https://pypi.org/simple" }
|
||||||
sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" }
|
sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" }
|
||||||
wheels = [
|
wheels = [
|
||||||
{ url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" },
|
{ url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|||||||
Reference in New Issue
Block a user