dexcontrol 0.2.3__py3-none-any.whl → 0.2.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dexcontrol might be problematic. Click here for more details.

@@ -36,8 +36,8 @@ class LidarSubscriber(BaseZenohSubscriber):
36
36
  """Zenoh subscriber for LIDAR scan data.
37
37
 
38
38
  This subscriber handles LIDAR scan data encoded using the dexsensor
39
- lidar serialization format with compression.
40
- Uses lazy decoding - data is only decoded when requested.
39
+ lidar serialization format. Uses lazy decoding - data is only decoded
40
+ when requested.
41
41
  """
42
42
 
43
43
  def __init__(
@@ -89,16 +89,9 @@ class LidarSubscriber(BaseZenohSubscriber):
89
89
  Returns:
90
90
  Latest scan data dictionary if available, None otherwise.
91
91
  Dictionary contains:
92
- - ranges: Array of range measurements
93
- - angles: Array of corresponding angles
94
- - intensities: Array of intensity values (if available)
95
- - angle_min: Minimum angle of the scan
96
- - angle_max: Maximum angle of the scan
97
- - angle_increment: Angular distance between measurements
98
- - scan_time: Time for a complete scan
99
- - time_increment: Time between measurements
100
- - range_min: Minimum range value
101
- - range_max: Maximum range value
92
+ - ranges: Array of range measurements in meters
93
+ - angles: Array of corresponding angles in radians
94
+ - qualities: Array of quality values (0-255) if available, None otherwise
102
95
  """
103
96
  with self._data_lock:
104
97
  if self._latest_raw_data is None:
@@ -136,7 +129,7 @@ class LidarSubscriber(BaseZenohSubscriber):
136
129
  """Get the latest range measurements.
137
130
 
138
131
  Returns:
139
- Array of range measurements if available, None otherwise.
132
+ Array of range measurements in meters if available, None otherwise.
140
133
  """
141
134
  scan_data = self.get_latest_data()
142
135
  if scan_data is not None:
@@ -147,54 +140,32 @@ class LidarSubscriber(BaseZenohSubscriber):
147
140
  """Get the latest angle measurements.
148
141
 
149
142
  Returns:
150
- Array of angle measurements if available, None otherwise.
143
+ Array of angle measurements in radians if available, None otherwise.
151
144
  """
152
145
  scan_data = self.get_latest_data()
153
146
  if scan_data is not None:
154
147
  return scan_data["angles"]
155
148
  return None
156
149
 
157
- def get_intensities(self) -> np.ndarray | None:
158
- """Get the latest intensity measurements.
150
+ def get_qualities(self) -> np.ndarray | None:
151
+ """Get the latest quality measurements.
159
152
 
160
153
  Returns:
161
- Array of intensity measurements if available, None otherwise.
162
- """
163
- scan_data = self.get_latest_data()
164
- if scan_data is not None and "intensities" in scan_data:
165
- intensities = scan_data["intensities"]
166
- return intensities if intensities is not None else None
167
- return None
168
-
169
- def get_scan_info(self) -> dict[str, float] | None:
170
- """Get scan metadata information.
171
-
172
- Returns:
173
- Dictionary with scan metadata if available, None otherwise.
174
- Contains: angle_min, angle_max, angle_increment, scan_time,
175
- time_increment, range_min, range_max
154
+ Array of quality values (0-255) if available, None otherwise.
176
155
  """
177
156
  scan_data = self.get_latest_data()
178
157
  if scan_data is not None:
179
- return {
180
- "angle_min": scan_data["angle_min"],
181
- "angle_max": scan_data["angle_max"],
182
- "angle_increment": scan_data["angle_increment"],
183
- "scan_time": scan_data["scan_time"],
184
- "time_increment": scan_data["time_increment"],
185
- "range_min": scan_data["range_min"],
186
- "range_max": scan_data["range_max"],
187
- }
158
+ return scan_data.get("qualities")
188
159
  return None
189
160
 
190
- def has_intensities(self) -> bool:
191
- """Check if the latest scan data includes intensity information.
161
+ def has_qualities(self) -> bool:
162
+ """Check if the latest scan data includes quality information.
192
163
 
193
164
  Returns:
194
- True if intensity data is available, False otherwise.
165
+ True if quality data is available, False otherwise.
195
166
  """
196
167
  scan_data = self.get_latest_data()
197
168
  if scan_data is not None:
198
- intensities = scan_data.get("intensities")
199
- return intensities is not None and len(intensities) > 0
169
+ qualities = scan_data.get("qualities")
170
+ return qualities is not None and len(qualities) > 0
200
171
  return False
@@ -155,7 +155,8 @@ class RTCSubscriber:
155
155
  async with websockets.connect(self._url) as websocket:
156
156
  self._websocket = websocket
157
157
 
158
- # Create an offer
158
+ # Create an offer. The server's assertive codec control makes
159
+ # client-side preferences redundant and potentially conflicting.
159
160
  self._pc.addTransceiver("video", direction="recvonly")
160
161
  offer = await self._pc.createOffer()
161
162
  await self._pc.setLocalDescription(offer)
@@ -10,15 +10,13 @@
10
10
 
11
11
  """Utility functions for displaying information in a Rich table format."""
12
12
 
13
- from typing import Literal
14
-
15
13
  from rich.console import Console
16
14
  from rich.table import Table
17
15
 
18
- TYPE_VERSION = dict[Literal["hardware_version", "software_version", "main_hash"], str]
16
+ from dexcontrol.utils.pb_utils import TYPE_SOFTWARE_VERSION
19
17
 
20
18
 
21
- def show_software_version(version_info: dict[str, TYPE_VERSION]) -> None:
19
+ def show_software_version(version_info: dict[str, TYPE_SOFTWARE_VERSION]) -> None:
22
20
  """Create a Rich table for displaying firmware version information.
23
21
 
24
22
  Args:
@@ -29,6 +27,7 @@ def show_software_version(version_info: dict[str, TYPE_VERSION]) -> None:
29
27
  table.add_column("Hardware Version")
30
28
  table.add_column("Software Version")
31
29
  table.add_column("Main Hash")
30
+ table.add_column("Compile Time")
32
31
 
33
32
  for component, version in sorted(version_info.items()):
34
33
  table.add_row(
@@ -36,6 +35,7 @@ def show_software_version(version_info: dict[str, TYPE_VERSION]) -> None:
36
35
  str(version["hardware_version"]),
37
36
  str(version["software_version"]),
38
37
  str(version["main_hash"]),
38
+ str(version["compile_time"]),
39
39
  )
40
40
 
41
41
  console = Console()
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dexcontrol
3
- Version: 0.2.3
4
- Summary: A Python library of Robot Motion Control
3
+ Version: 0.2.7
4
+ Summary: A Python library of Sensing and Control for Dexmate's Robot
5
5
  Project-URL: Repository, https://github.com/dexmate-ai/dexcontrol
6
- Author-email: Dexmate <contact@dexmate.com>
6
+ Author-email: Dexmate <contact@dexmate.ai>
7
7
  License: GNU AFFERO GENERAL PUBLIC LICENSE
8
8
 
9
9
  Version 3, 19 November 2007
@@ -198,6 +198,7 @@ Classifier: Programming Language :: Python :: 3
198
198
  Classifier: Programming Language :: Python :: 3.10
199
199
  Classifier: Programming Language :: Python :: 3.11
200
200
  Classifier: Programming Language :: Python :: 3.12
201
+ Classifier: Programming Language :: Python :: 3.13
201
202
  Classifier: Typing :: Typed
202
203
  Requires-Python: <3.13,>=3.10
203
204
  Requires-Dist: eclipse-zenoh>=1.2.0
@@ -233,10 +234,12 @@ Requires-Dist: tyro; extra == 'example'
233
234
  Description-Content-Type: text/markdown
234
235
 
235
236
  <div align="center">
236
- <h1>Dexmate Robot Control and Sensing API</h1>
237
+ <h1>🤖 Dexmate Robot Control and Sensing API</h1>
237
238
  </div>
238
239
 
239
- ## Installation
240
+ ![Python](https://img.shields.io/badge/python-3.10%20%7C%203.11%20%7C%203.12%20%7C%203.13-blue)
241
+
242
+ ## 📦 Installation
240
243
 
241
244
  ```shell
242
245
  pip install dexcontrol
@@ -248,18 +251,40 @@ To run the examples in this repo, you can try:
248
251
  pip install dexcontrol[example]
249
252
  ```
250
253
 
251
- ## Licensing
254
+ ## 📄 Licensing
252
255
 
253
- This project is dual-licensed:
256
+ This project is **dual-licensed**:
254
257
 
255
- ### Open Source License
256
- This software is available under the GNU Affero General Public License v3.0 (AGPL-3.0).
258
+ ### 🔓 Open Source License
259
+ This software is available under the **GNU Affero General Public License v3.0 (AGPL-3.0)**.
257
260
  See the [LICENSE](./LICENSE) file for details.
258
261
 
259
- ### Commercial License
260
- For businesses that want to use this software in proprietary applications without the AGPL requirements, commercial licenses are available. Contact us for commercial licensing: contact@dexmate.ai
262
+ ### 💼 Commercial License
263
+ For businesses that want to use this software in proprietary applications without the AGPL requirements, commercial licenses are available.
264
+
265
+ **📧 Contact us for commercial licensing:** contact@dexmate.ai
266
+
267
+ **Commercial licenses provide:**
268
+ - ✅ Right to use in closed-source applications
269
+ - ✅ No source code disclosure requirements
270
+ - ✅ Priority support options
271
+
272
+
273
+ ## 📚 Examples
261
274
 
262
- Commercial licenses provide:
263
- - Right to use in closed-source applications
264
- - No source code disclosure requirements
265
- - Priority support options
275
+ Explore our comprehensive examples in the `examples/` directory:
276
+
277
+ - 🎮 **Basic Control** - Simple movement and sensor reading
278
+ - 🎯 **Advanced Control** - Complex manipulation tasks
279
+ - 📺 **Teleoperation** - Remote control interfaces
280
+ - 🔧 **Troubleshooting** - Diagnostic and maintenance tools
281
+
282
+ ---
283
+
284
+ <div align="center">
285
+ <h3>🤝 Ready to build amazing robots?</h3>
286
+ <p>
287
+ <a href="mailto:contact@dexmate.ai">📧 Contact Us</a> •
288
+ <a href="./examples/">📚 View Examples</a> •
289
+ </p>
290
+ </div>
@@ -1,8 +1,8 @@
1
1
  dexcontrol/__init__.py,sha256=1UGkcmMHphLJM7MYIfSuWfSameV1XLBDVjEazl5hb1I,1656
2
- dexcontrol/robot.py,sha256=pVm-97SAHYxVRMhb3I616i197qwr47kekq1mrzSyVew,42016
2
+ dexcontrol/robot.py,sha256=Kyp8VXcDM6PORlvWBQqH4JR-4Uu6ttn652gNX7t5fg8,41686
3
3
  dexcontrol/apps/dualsense_teleop_base.py,sha256=Dw1z-2HA5D7DPKutZxlOdXsN9vpk4gS6XzJsL5ZQLM0,12702
4
4
  dexcontrol/config/__init__.py,sha256=UVLNpzGD14e8g68rUZFXTh0B7FRx6uS0Eg_MecjinYM,520
5
- dexcontrol/config/vega.py,sha256=mEcOJZQ_6vasdxxjAxH0YFmx45Cy4eOv9uS2FK08ZFk,6993
5
+ dexcontrol/config/vega.py,sha256=4RrP0V5bmH0OUM3V0gND6cpRuMqoziLTQdKiRey1_ag,7192
6
6
  dexcontrol/config/core/__init__.py,sha256=Ym2R1hr1iMKQuXcg16BpZfQtTb0hQ5Q7smUIMlwKfho,637
7
7
  dexcontrol/config/core/arm.py,sha256=bRemtNO_eQVUgcojw1ItwWiqOZVOaaIq72G5-QqFu-I,1183
8
8
  dexcontrol/config/core/chassis.py,sha256=163hO4lVVaW7r9dvNleH0cdDds_GfO15EepnjloeT9U,868
@@ -11,10 +11,10 @@ dexcontrol/config/core/head.py,sha256=1eqsDPGBG8r8MocJwUMnDAQnOD152sl7P2k6Lg_ZKO
11
11
  dexcontrol/config/core/misc.py,sha256=KQstrVKFL-vdoaHVdj-VGwMrrhzm4pVz2g4A2etnav4,1169
12
12
  dexcontrol/config/core/torso.py,sha256=6B_-8LhT4rJ4K_oF9sjroOwIIj_JwlNS2JC8LmCCrSA,1456
13
13
  dexcontrol/config/sensors/__init__.py,sha256=bYPMLxbbn5QeuPyA6OPGDS2JTYpnVvaZJT8PeILFjQY,252
14
- dexcontrol/config/sensors/vega_sensors.py,sha256=HJ3Kp6Bkrvng17xWH879IILKTp1Q2PY2_MGAcZlwk8Y,2532
15
- dexcontrol/config/sensors/cameras/__init__.py,sha256=5E93VOonbI1P6kWJdc9IQayuBcp_ppSTH4mEjKgW5C8,333
16
- dexcontrol/config/sensors/cameras/rgb_camera.py,sha256=T0ckKeoTJEnt0TyM-Rc9qU_iJbDT-QeA_ZJep5JQfO0,728
17
- dexcontrol/config/sensors/cameras/zed_camera.py,sha256=t6qvC8p-FlrsT1GKOro4iYD61G2cthmq3JmAppXHVWM,982
14
+ dexcontrol/config/sensors/vega_sensors.py,sha256=oQrJcder-kcGujON5mwmThSgnBeIclq7OVWQ5lbwj1E,2581
15
+ dexcontrol/config/sensors/cameras/__init__.py,sha256=GmwRW9ovZ_JcpD2QmzTO_in_LRBoRDorjMVGY6XgGI8,383
16
+ dexcontrol/config/sensors/cameras/rgb_camera.py,sha256=20sniWVjo-Lj8SEfsXfwN07pm3MYOOaT1WP0G6Vrfxs,1465
17
+ dexcontrol/config/sensors/cameras/zed_camera.py,sha256=7wgY-jBePtAWC6PWYKb3S0XSxD0Eg3UlPzoy5p0Y1lw,1852
18
18
  dexcontrol/config/sensors/imu/__init__.py,sha256=fW-DlevCvf_W8HV_fvLe9yIe-XL5op2mggoTKh-6fGQ,328
19
19
  dexcontrol/config/sensors/imu/chassis_imu.py,sha256=3OlTTBH6k1QGM5c5bcg8NL3XUXzYA8gCLM8lpCq2KFM,559
20
20
  dexcontrol/config/sensors/imu/zed_imu.py,sha256=y-dPI-XS6Kyq0WOf0wwuc2BgVnMN2hwCMxb0Vmwt4O4,550
@@ -32,41 +32,41 @@ dexcontrol/core/misc.py,sha256=m7WtziXGyhM7z27MjxiIQfTMu0_z30ReLkUCHzaRk9E,22547
32
32
  dexcontrol/core/torso.py,sha256=N5XE_lY-i78iMFEjIxMJ9I6KWK4YgHv6VqVUKEWLrcg,7402
33
33
  dexcontrol/proto/dexcontrol_msg_pb2.py,sha256=iRvfKLjV7eRxb9jOB_KrCsd77GbgzByThW_JIKd_ibM,5691
34
34
  dexcontrol/proto/dexcontrol_msg_pb2.pyi,sha256=_vzo6hozKpC5jzdKUOTH81VXCNYO1awcgTFhVNo91N0,9371
35
- dexcontrol/proto/dexcontrol_query_pb2.py,sha256=SHUEOmrwdijro3dRp9zhuXfyTg9HeTacIeVwg0mO9zE,5234
36
- dexcontrol/proto/dexcontrol_query_pb2.pyi,sha256=dlGbOy_qEQSzPDgxmd-E12ZLB9kGKpNZilxiBzW-b7k,5615
35
+ dexcontrol/proto/dexcontrol_query_pb2.py,sha256=Aa98bPmOuImBheN6fv4Ysy1Bmk5oX2tGatqcykDUz0E,5328
36
+ dexcontrol/proto/dexcontrol_query_pb2.pyi,sha256=iZXySZ_GJkB23ALpLpf2r5bpiGEtsf1zQt0wALz9aKU,5839
37
37
  dexcontrol/sensors/__init__.py,sha256=Dp06cuO_3xC6i4u5rHqfK5NqlIC5kaCue_bAtTC6JEE,960
38
38
  dexcontrol/sensors/manager.py,sha256=pBseqoAcrYdbBbSpFGChh_ROQlxnKDcolcKzKCEjpwM,6853
39
39
  dexcontrol/sensors/ultrasonic.py,sha256=WAHvHh64iQ0HfqVf-Oo0Rg8R32Cdk5d8k8kDSwa3Xrc,3258
40
40
  dexcontrol/sensors/camera/__init__.py,sha256=Vwe98I4Lvdv3F2UslOzKkeUkt5Rl2jSqbKlU6gIBeF0,609
41
- dexcontrol/sensors/camera/rgb_camera.py,sha256=WxycPiVOrWiFfNSduS98OTjY9aq3gHBw4LebbGp4yeQ,3154
42
- dexcontrol/sensors/camera/zed_camera.py,sha256=t3tkk1mIuFfCW-WaOT2F548nZQn5_7SelGwLtGl6XYo,13878
41
+ dexcontrol/sensors/camera/rgb_camera.py,sha256=ZyWS2FkEF7MYg5rlG_YXd8VpbBu--Y-1Rlb6uzYHNNo,5045
42
+ dexcontrol/sensors/camera/zed_camera.py,sha256=7gVoRhwynCUjyTOtUBZCiNZS3MhXoQYBDrr_fGlho4g,14007
43
43
  dexcontrol/sensors/imu/__init__.py,sha256=bBC7_NSLJ5qLMvUYu2-9yXKO2bRpQLC0HyywBwnbM0A,768
44
44
  dexcontrol/sensors/imu/chassis_imu.py,sha256=9gziCrtFKfWmeiDdbgD4aIkkdtjJahbckayYj_Lv5r4,4858
45
45
  dexcontrol/sensors/imu/zed_imu.py,sha256=VB0TfQYIqKNEPGPCbdAO9YtshWs4nE7y0y9FnWU-Mko,5148
46
46
  dexcontrol/sensors/lidar/__init__.py,sha256=frF16HmeQnfbvH0dVJ4pPjD4TySF13wCk-O9L3Memeg,317
47
- dexcontrol/sensors/lidar/rplidar.py,sha256=9TlQlxfHOdvf62sjA9c2S_McI5GI2Ef_b2TTk_o5VyY,5167
47
+ dexcontrol/sensors/lidar/rplidar.py,sha256=xi3y0imYJwfKTzRX66okrxwbo-ZWZmreUnXIK-RZfoU,4439
48
48
  dexcontrol/utils/__init__.py,sha256=ayMZ6xNlA9xKfS_XRr8bWcoXW4-8Jg_25XSbMd5Jx58,468
49
49
  dexcontrol/utils/constants.py,sha256=qTaMgMPexSOgn9eGkKNZBAmvac_QCfU2g_fCTaMjb78,661
50
50
  dexcontrol/utils/io_utils.py,sha256=4TYV33ufECo8fuQivrZR9vtSdwWYUiPvpAUSneEzOOs,850
51
51
  dexcontrol/utils/motion_utils.py,sha256=p4kXQm_YorISDC2crrpY0gwCVw_yQCPv-acxPUSfh8w,7172
52
52
  dexcontrol/utils/os_utils.py,sha256=CC2st_Pb0C5cWfCg-i1P5bgBx3ZBX4LWVUiBq63dNeo,1852
53
- dexcontrol/utils/pb_utils.py,sha256=iTYoC9LQoSVAHn8KTcdIB8G1_sKjmjNfm8xdRUQL6fQ,3061
53
+ dexcontrol/utils/pb_utils.py,sha256=_6nFLKwAtq56vYXMZ6YmHnMfL5SarD96MVEA-9cxXns,3178
54
54
  dexcontrol/utils/rate_limiter.py,sha256=wFNaJ1fh-GO6zItuksKd_DSxLA1esE71WAiNDLpGsU0,6176
55
55
  dexcontrol/utils/rtc_utils.py,sha256=o2F9puC7CdAPnqiVq2vzomFZ7hMHljwtAbp9UiLhxJY,4426
56
56
  dexcontrol/utils/timer.py,sha256=1sOYYEapbZ5aBqJwknClsxgjDx0FDRQuGEdcTGnYTCI,3948
57
57
  dexcontrol/utils/trajectory_utils.py,sha256=gEi-hYSkySUO8rZPFig8t14vMxJPBY7hK-UldsXY1uA,1420
58
- dexcontrol/utils/viz_utils.py,sha256=UQPXIk2g4jlmbOeeSRk2hp5a3jGIdjUdBTg25Cs8CIE,2737
58
+ dexcontrol/utils/viz_utils.py,sha256=UZZ-IX9yz7T9e8Rb-xN1wtD4H_vDBZxf-BSc7VGEMZo,2770
59
59
  dexcontrol/utils/zenoh_utils.py,sha256=JlfhNwg4agPSRb6_Gkqi3ymuw_b13bnnTWClchWpGn8,2809
60
60
  dexcontrol/utils/subscribers/__init__.py,sha256=Sqa-PPElwdUKxdh9BbU5MSqnf_i7BFqANrzVUXYUNuQ,1380
61
61
  dexcontrol/utils/subscribers/base.py,sha256=t4zcps_kjFG1wj6WSrZ4HJg0Bxcdnu-C8NkVVupmNVg,9769
62
- dexcontrol/utils/subscribers/camera.py,sha256=5XFLTpZxztyZfPHqtoET0E0svVeX87DiUC3bJYxa8xk,11171
62
+ dexcontrol/utils/subscribers/camera.py,sha256=0kaeoKjKCxRQ5iaKK3r_94xEaVxNDBAMd2ZHL6X1kWU,11201
63
63
  dexcontrol/utils/subscribers/decoders.py,sha256=X39NY7zNEUlOaG0b1Eooc1T7U5SCQ3rZ2ddaz12fi0o,2134
64
64
  dexcontrol/utils/subscribers/generic.py,sha256=EKRutiu2zJBfzNIHCfYEfkcGE6QQTJmkOEMRRvEXJXA,3704
65
65
  dexcontrol/utils/subscribers/imu.py,sha256=Us4ZWzLfqujg16jvrNIoHcvUyxbRCv6mZlaAizvX6uo,5925
66
- dexcontrol/utils/subscribers/lidar.py,sha256=EmLIpjS2wVqXrkgaJZJTaIGijgFtOaOWE25A2kPTDmg,6961
66
+ dexcontrol/utils/subscribers/lidar.py,sha256=ZIUpzfb-n5zLnCfZBDxJMMI4FKmlwdOYHQzpVlfIGQw,5631
67
67
  dexcontrol/utils/subscribers/protobuf.py,sha256=gtE2b9ZtR2UXftKA5nX7bvTLkj8AeXDYZMqe4B3t5BQ,3696
68
- dexcontrol/utils/subscribers/rtc.py,sha256=JA_GjRw-mI8D34bxGgx6ZFr3FIS6BTbd_vK6Ckaw98U,11225
69
- dexcontrol-0.2.3.dist-info/METADATA,sha256=4iPfeeBB_mRTBouvLaTeLAw7hMk0mOXpVLkRftPgGrM,36034
70
- dexcontrol-0.2.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
71
- dexcontrol-0.2.3.dist-info/licenses/LICENSE,sha256=0J2KCMNNnW5WZPK5x8xUiCxApBf7h83693ggSJYiue0,31745
72
- dexcontrol-0.2.3.dist-info/RECORD,,
68
+ dexcontrol/utils/subscribers/rtc.py,sha256=mxD-IIeQwluvq0_D63lQJJEXrJsIc6yxX7uD0PDh08k,11350
69
+ dexcontrol-0.2.7.dist-info/METADATA,sha256=9V7o2gUcFDBux04BFEqFSmYs0MCA8Pxqbvara3g9Fe8,36790
70
+ dexcontrol-0.2.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
71
+ dexcontrol-0.2.7.dist-info/licenses/LICENSE,sha256=0J2KCMNNnW5WZPK5x8xUiCxApBf7h83693ggSJYiue0,31745
72
+ dexcontrol-0.2.7.dist-info/RECORD,,