sima-cli 0.0.17__py3-none-any.whl → 0.0.19__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.
@@ -4,7 +4,9 @@ import re
4
4
  import time
5
5
  import tempfile
6
6
  import tarfile
7
+ import gzip
7
8
  import subprocess
9
+ import shutil
8
10
  from InquirerPy import inquirer
9
11
  from urllib.parse import urlparse
10
12
  from typing import List
@@ -12,8 +14,17 @@ from sima_cli.utils.env import get_environment_type
12
14
  from sima_cli.download import download_file_from_url
13
15
  from sima_cli.utils.config_loader import load_resource_config
14
16
  from sima_cli.update.remote import push_and_update_remote_board, get_remote_board_info, reboot_remote_board
15
- from sima_cli.update.local import get_local_board_info, push_and_update_local_board
16
17
  from sima_cli.update.query import list_available_firmware_versions
18
+ from sima_cli.utils.env import is_sima_board
19
+
20
+ if is_sima_board():
21
+ from sima_cli.update import local
22
+ get_local_board_info = local.get_local_board_info
23
+ push_and_update_local_board = local.push_and_update_local_board
24
+ else:
25
+ get_local_board_info = None
26
+ push_and_update_local_board = None
27
+
17
28
 
18
29
  def _resolve_firmware_url(version_or_url: str, board: str, internal: bool = False) -> str:
19
30
  """
@@ -54,33 +65,37 @@ def _pick_from_available_versions(board: str, version_or_url: str, internal: boo
54
65
  if "http" in version_or_url:
55
66
  return version_or_url
56
67
 
57
- available_versions = list_available_firmware_versions(board, version_or_url, internal=True)
68
+ available_versions = list_available_firmware_versions(board, version_or_url, internal)
58
69
 
59
- if len(available_versions) > 1:
60
- click.echo("Multiple firmware versions found matching your input:")
70
+ try:
71
+ if len(available_versions) > 1:
72
+ click.echo("Multiple firmware versions found matching your input:")
61
73
 
62
- selected_version = inquirer.fuzzy(
63
- message="Select a version:",
64
- choices=available_versions,
65
- max_height="70%", # scrollable
66
- instruction="(Use ↑↓ to navigate, / to search, Enter to select)"
67
- ).execute()
74
+ selected_version = inquirer.fuzzy(
75
+ message="Select a version:",
76
+ choices=available_versions,
77
+ max_height="70%", # scrollable
78
+ instruction="(Use ↑↓ to navigate, / to search, Enter to select)"
79
+ ).execute()
68
80
 
69
- if not selected_version:
70
- click.echo("No selection made. Exiting.", err=True)
71
- raise SystemExit(1)
81
+ if not selected_version:
82
+ click.echo("No selection made. Exiting.", err=True)
83
+ raise SystemExit(1)
72
84
 
73
- return selected_version
85
+ return selected_version
74
86
 
75
- elif len(available_versions) == 1:
76
- return available_versions[0]
87
+ elif len(available_versions) == 1:
88
+ return available_versions[0]
77
89
 
78
- else:
79
- click.echo(
80
- f"No firmware versions found matching keyword '{version_or_url}' for board '{board}'.",
81
- err=True
82
- )
83
- raise SystemExit(1)
90
+ else:
91
+ click.echo(
92
+ f"No firmware versions found matching keyword '{version_or_url}' for board '{board}'.",
93
+ err=True
94
+ )
95
+ raise SystemExit(1)
96
+ except:
97
+ click.echo("Unable to determine available versions")
98
+ exit(0)
84
99
 
85
100
  def _sanitize_url_to_filename(url: str) -> str:
86
101
  """
@@ -98,22 +113,23 @@ def _sanitize_url_to_filename(url: str) -> str:
98
113
  return safe_name
99
114
 
100
115
 
101
- def _extract_required_files(tar_path: str, board: str) -> list:
116
+ def _extract_required_files(tar_path: str, board: str, update_type: str = 'standard') -> list:
102
117
  """
103
118
  Extract required files from a .tar.gz or .tar archive into the same folder
104
119
  and return the full paths to the extracted files (with subfolder if present).
105
- Skips files that already exist.
120
+ Skips files that already exist. If a .wic.gz file is extracted, it will be decompressed,
121
+ unless the decompressed .wic file already exists.
106
122
 
107
123
  Args:
108
124
  tar_path (str): Path to the downloaded or provided firmware archive.
109
125
  board (str): Board type ('davinci' or 'modalix').
126
+ update_type (str): Update type ('standard' or 'bootimg').
110
127
 
111
128
  Returns:
112
129
  list: List of full paths to extracted files.
113
130
  """
114
131
  extract_dir = os.path.dirname(tar_path)
115
132
 
116
- # Define required filenames (not full paths)
117
133
  target_filenames = {
118
134
  "troot-upgrade-simaai-ev.swu",
119
135
  f"simaai-image-palette-upgrade-{board}.swu"
@@ -123,6 +139,12 @@ def _extract_required_files(tar_path: str, board: str) -> list:
123
139
  if env_type == "host" and _os == "linux":
124
140
  target_filenames.add("sima_pcie_host_pkg.sh")
125
141
 
142
+ if update_type == 'bootimg':
143
+ target_filenames = {
144
+ f"simaai-image-palette-{board}.wic.gz",
145
+ f"simaai-image-palette-{board}.wic.bmap"
146
+ }
147
+
126
148
  extracted_paths = []
127
149
 
128
150
  try:
@@ -140,14 +162,29 @@ def _extract_required_files(tar_path: str, board: str) -> list:
140
162
  if os.path.exists(full_dest_path):
141
163
  click.echo(f"⚠️ Skipping existing file: {full_dest_path}")
142
164
  extracted_paths.append(full_dest_path)
143
- continue
165
+ else:
166
+ os.makedirs(os.path.dirname(full_dest_path), exist_ok=True)
167
+ tar.extract(member, path=extract_dir)
168
+ click.echo(f"✅ Extracted: {full_dest_path}")
169
+ extracted_paths.append(full_dest_path)
144
170
 
145
- # Ensure directory structure exists
146
- os.makedirs(os.path.dirname(full_dest_path), exist_ok=True)
171
+ # If it's a .wic.gz file, decompress it now
172
+ if full_dest_path.endswith(".wic.gz"):
173
+ uncompressed_path = full_dest_path[:-3] # remove .gz
147
174
 
148
- tar.extract(member, path=extract_dir)
149
- extracted_paths.append(full_dest_path)
150
- click.echo(f"✅ Extracted: {full_dest_path}")
175
+ if os.path.exists(uncompressed_path):
176
+ click.echo(f"⚠️ Skipping decompression: {uncompressed_path} already exists")
177
+ extracted_paths.append(uncompressed_path)
178
+ continue
179
+
180
+ try:
181
+ with gzip.open(full_dest_path, 'rb') as f_in:
182
+ with open(uncompressed_path, 'wb') as f_out:
183
+ shutil.copyfileobj(f_in, f_out)
184
+ click.echo(f"📦 Decompressed: {uncompressed_path}")
185
+ extracted_paths.append(uncompressed_path)
186
+ except Exception as decomp_err:
187
+ click.echo(f"❌ Failed to decompress {full_dest_path}: {decomp_err}")
151
188
 
152
189
  if not extracted_paths:
153
190
  click.echo("⚠️ No matching files were found or extracted.")
@@ -158,7 +195,8 @@ def _extract_required_files(tar_path: str, board: str) -> list:
158
195
  click.echo(f"❌ Failed to extract files from archive: {e}")
159
196
  return []
160
197
 
161
- def _download_image(version_or_url: str, board: str, internal: bool = False):
198
+
199
+ def _download_image(version_or_url: str, board: str, internal: bool = False, update_type: str = 'standard'):
162
200
  """
163
201
  Download or use a firmware image for the specified board and version or file path.
164
202
 
@@ -176,7 +214,7 @@ def _download_image(version_or_url: str, board: str, internal: bool = False):
176
214
  # Case 1: Local file provided
177
215
  if os.path.exists(version_or_url) and os.path.isfile(version_or_url):
178
216
  click.echo(f"📁 Using local firmware file: {version_or_url}")
179
- return _extract_required_files(version_or_url, board)
217
+ return _extract_required_files(version_or_url, board, update_type)
180
218
 
181
219
  # Case 2: Treat as custom full URL
182
220
  if version_or_url.startswith("http://") or version_or_url.startswith("https://"):
@@ -198,10 +236,11 @@ def _download_image(version_or_url: str, board: str, internal: bool = False):
198
236
  firmware_path = download_file_from_url(image_url, dest_path, internal=internal)
199
237
 
200
238
  click.echo(f"📦 Firmware downloaded to: {firmware_path}")
201
- return _extract_required_files(firmware_path, board)
239
+ return _extract_required_files(firmware_path, board, update_type)
202
240
 
203
241
  except Exception as e:
204
242
  click.echo(f"❌ Host update failed: {e}")
243
+ exit(0)
205
244
 
206
245
  def _update_host(script_path: str, board: str, boardip: str, passwd: str):
207
246
  """
@@ -252,6 +291,7 @@ def _update_host(script_path: str, board: str, boardip: str, passwd: str):
252
291
 
253
292
  except Exception as e:
254
293
  click.echo(f"❌ Host update failed: {e}")
294
+ exit(0)
255
295
 
256
296
 
257
297
  def _update_sdk(version_or_url: str, board: str):
@@ -326,6 +366,27 @@ def _update_remote(extracted_paths: List[str], ip: str, board: str, passwd: str,
326
366
 
327
367
  return script_path
328
368
 
369
+ def download_image(version_or_url: str, board: str, swtype: str, internal: bool = False, update_type: str = 'standard'):
370
+ """
371
+ Download and extract a firmware image for a specified board.
372
+
373
+ Args:
374
+ version_or_url (str): Either a version string (e.g., "1.6.0") or a direct URL or local file path to the image.
375
+ board (str): The board type (e.g., "mlsoc", "modalix").
376
+ swtype (str): The software type (default to 'davinci', possible values: `davinci`, `modalix`): not supported for now
377
+ internal (bool): Whether to use internal download paths (e.g., Artifactory).
378
+ update_type (str): Whether this is standard update or writing boot image.
379
+
380
+ Returns:
381
+ List[str]: Paths to the extracted image files.
382
+ """
383
+
384
+ if 'http' not in version_or_url and not os.path.exists(version_or_url):
385
+ version_or_url = _pick_from_available_versions(board, version_or_url, internal)
386
+
387
+ extracted_paths = _download_image(version_or_url, board, internal, update_type)
388
+ return extracted_paths
389
+
329
390
  def perform_update(version_or_url: str, ip: str = None, internal: bool = False, passwd: str = "edgeai", auto_confirm: bool = False):
330
391
  r"""
331
392
  Update the system based on environment and input.
@@ -356,7 +417,7 @@ def perform_update(version_or_url: str, ip: str = None, internal: bool = False,
356
417
  if board in ['davinci', 'modalix']:
357
418
  click.echo(f"🔧 Target board: {board}, board currently running: {version}")
358
419
 
359
- if 'http' not in version_or_url:
420
+ if 'http' not in version_or_url and not os.path.exists(version_or_url):
360
421
  version_or_url = _pick_from_available_versions(board, version_or_url, internal)
361
422
 
362
423
  extracted_paths = _download_image(version_or_url, board, internal)
sima_cli/utils/env.py CHANGED
@@ -11,58 +11,62 @@ def is_sima_board() -> bool:
11
11
  """
12
12
  Detect if running on a SiMa board.
13
13
 
14
- This is done by checking for the existence of a known build info file
15
- located at /etc/build and looking for specific identifiers like
14
+ This is done by checking for the existence of known build info files
15
+ (/etc/build or /etc/buildinfo) and looking for specific identifiers like
16
16
  SIMA_BUILD_VERSION and MACHINE.
17
17
 
18
18
  Returns:
19
19
  bool: True if running on a SiMa board, False otherwise.
20
20
  """
21
- build_file_path = "/etc/build"
22
- if not os.path.exists(build_file_path):
23
- return False
21
+ build_file_paths = ["/etc/build", "/etc/buildinfo"]
24
22
 
25
- try:
26
- with open(build_file_path, "r") as f:
27
- content = f.read()
28
- return "SIMA_BUILD_VERSION" in content and "MACHINE" in content
29
- except Exception:
30
- return False
23
+ for path in build_file_paths:
24
+ if os.path.exists(path):
25
+ try:
26
+ with open(path, "r") as f:
27
+ content = f.read()
28
+ if "SIMA_BUILD_VERSION" in content and "MACHINE" in content:
29
+ return True
30
+ except Exception:
31
+ continue
32
+
33
+ return False
31
34
 
32
35
  def is_pcie_host() -> bool:
33
36
  """
34
37
  Detect if running from a PCIe host (typically a Linux or macOS dev machine).
35
38
 
36
- This assumes a PCIe host is not a SiMa board and is running on a standard
37
- Unix-based OS like Linux or macOS (Darwin).
39
+ This assumes a PCIe host is not a SiMa board and is running on a standard Linux platform.
38
40
 
39
41
  Returns:
40
42
  bool: True if likely a PCIe host, False otherwise.
41
43
  """
42
44
  import platform
43
- return not is_sima_board() and platform.system() in ["Linux", "Darwin"]
45
+ return not is_sima_board() and platform.system() in ["Linux"]
44
46
 
45
47
  def get_sima_board_type() -> str:
46
48
  """
47
- If running on a SiMa board, extract the board type from the MACHINE field in /etc/build.
49
+ If running on a SiMa board, extract the board type from the MACHINE field
50
+ in /etc/build or /etc/buildinfo.
48
51
 
49
52
  Returns:
50
53
  str: The board type (e.g., "modalix", "davinci"), or an empty string if not found or not a SiMa board.
51
54
  """
52
- build_file_path = "/etc/build"
53
- if not os.path.exists(build_file_path):
54
- return ""
55
-
56
- try:
57
- with open(build_file_path, "r") as f:
58
- for line in f:
59
- if line.startswith("MACHINE"):
60
- # Format: MACHINE = modalix
61
- parts = line.split("=")
62
- if len(parts) == 2:
63
- return parts[1].strip()
64
- except Exception:
65
- pass
55
+ build_file_paths = ["/etc/build", "/etc/buildinfo"]
56
+
57
+ for path in build_file_paths:
58
+ if os.path.exists(path):
59
+ try:
60
+ with open(path, "r") as f:
61
+ for line in f:
62
+ line = line.strip()
63
+ if line.startswith("MACHINE"):
64
+ # Format: MACHINE = modalix
65
+ parts = line.split("=", 1)
66
+ if len(parts) == 2:
67
+ return parts[1].strip()
68
+ except Exception:
69
+ continue
66
70
 
67
71
  return ""
68
72
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sima-cli
3
- Version: 0.0.17
3
+ Version: 0.0.19
4
4
  Summary: CLI tool for SiMa Developer Portal to download models, firmware, and apps.
5
5
  Home-page: https://developer.sima.ai/
6
6
  Author: SiMa.ai
@@ -1,33 +1,39 @@
1
1
  sima_cli/__init__.py,sha256=Nb2jSg9-CX1XvSc1c21U9qQ3atINxphuNkNfmR-9P3o,332
2
2
  sima_cli/__main__.py,sha256=ehzD6AZ7zGytC2gLSvaJatxeD0jJdaEvNJvwYeGsWOg,69
3
- sima_cli/__version__.py,sha256=G3g_P43Qcy0TawgeYyi8kSrDK1EYHEk1Yis6srHT0Kg,49
4
- sima_cli/cli.py,sha256=Kk8mjLGntxEBz8uTwy-Uocwzt_8JaNPKB1np6_rk5iU,8365
3
+ sima_cli/__version__.py,sha256=2xNp40YbbA9TjpFNNqUbe-Cjo-Xe8LvBbe2706ROs3k,49
4
+ sima_cli/cli.py,sha256=k4w4NB6yfqjTrNBEv338yQTBWIMZ-ul7W-0vo7y01dc,11326
5
5
  sima_cli/app_zoo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  sima_cli/app_zoo/app.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  sima_cli/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  sima_cli/auth/basic_auth.py,sha256=pcocI6v496vC7v5MLYPZq3AEgD-2DdkzNFZiKsbx3eQ,4290
9
- sima_cli/auth/login.py,sha256=e9wBEeo_60qplODHBeK84R7zusT3K07kdFoZC1mkSrQ,3778
9
+ sima_cli/auth/login.py,sha256=yCYXWgrfbP4jSTZ3hITfxlgHkdVQVzsd8hQKpqaqCKs,3780
10
10
  sima_cli/data/resources_internal.yaml,sha256=zlQD4cSnZK86bLtTWuvEudZTARKiuIKmB--Jv4ajL8o,200
11
- sima_cli/data/resources_public.yaml,sha256=ZT1CzPrGMfSLVWiRJfW2-jb-ilmh7yNlkqyO5Fvqk58,178
11
+ sima_cli/data/resources_public.yaml,sha256=U7hmUomGeQ2ULdo1BU2OQHr0PyKBamIdK9qrutDlX8o,201
12
12
  sima_cli/download/__init__.py,sha256=6y4O2FOCYFR2jdnQoVi3hRtEoZ0Gw6rydlTy1SGJ5FE,218
13
- sima_cli/download/downloader.py,sha256=5-Dhr4wFpK6CudinCQeQVBShToUxijsVN2pv6NoL9sM,5156
13
+ sima_cli/download/downloader.py,sha256=pHfqcg_ujBQjds_EkcRV85M2mRYGrysoZaiR-FIrpf4,5161
14
+ sima_cli/install/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ sima_cli/install/hostdriver.py,sha256=kAWDLebs60mbWIyTbUxmNrChcKW1uD5r7FtWNSUVUE4,5852
16
+ sima_cli/install/optiview.py,sha256=VT8C1_EX-DW-n7DuxI9d0vPb87JBX-Rg9Bw9JHh1aeo,3108
17
+ sima_cli/install/palette.py,sha256=uRznoHa4Mv9ZXHp6AoqknfC3RxpYNKi9Ins756Cyifk,3930
14
18
  sima_cli/mla/meminfo.py,sha256=ndc8kQJmWGEIdvNh6iIhATGdrkqM2pbddr_eHxaPNfg,1466
15
19
  sima_cli/model_zoo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
20
  sima_cli/model_zoo/model.py,sha256=q91Nrg62j1TqwPO8HiX4nlEFCCmzNEFcyFTBVMbJm8w,9836
17
21
  sima_cli/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
22
  sima_cli/sdk/syscheck.py,sha256=h9zCULW67y4i2hqiGc-hc1ucBDShA5FAe9NxwBGq-fM,4575
19
23
  sima_cli/update/__init__.py,sha256=0P-z-rSaev40IhfJXytK3AFWv2_sdQU4Ry6ei2sEus0,66
20
- sima_cli/update/local.py,sha256=jiGrwuU2Z1HV_RT1_dYuI_Ish-f818AvCEk7sAM3l94,3032
21
- sima_cli/update/query.py,sha256=eOTC2ZAWbFFf_0h8D-MO1HrIsQYRc7fu5OyeFNEAv48,2168
22
- sima_cli/update/remote.py,sha256=ePlnvlGHrASMMjYGM9w-6hMeDMgGiJu_BlHLamU1YtI,8420
23
- sima_cli/update/updater.py,sha256=8NcXl_bWcjOo3ucl7WgShSLTbTga8cWpxJeUR5tnj2E,15546
24
+ sima_cli/update/bmaptool.py,sha256=KrhUGShBwY4Wzz50QiuMYAxxPgEy1nz5C68G-0a4qF4,4988
25
+ sima_cli/update/bootimg.py,sha256=iMe8b42JK0KF-udSB6Kl044XUJtNgMUmBNxyuWneAkU,13387
26
+ sima_cli/update/local.py,sha256=CyUFLs5Lz5w4VyM6ip4wndKBBLz3_KZ-3scEvSiOrcg,3299
27
+ sima_cli/update/query.py,sha256=cVkUMLZkONJ2XMEwqEC-JqLVB38hOqfWM2hB2ehBK6Y,3272
28
+ sima_cli/update/remote.py,sha256=DvcvUX1ydpyF4DwUsVXagb7My6H2MNoGiCQfGfO06iI,8939
29
+ sima_cli/update/updater.py,sha256=SprOcvSzRSwViGd2dYTtyTQfiwdLQcqZoS3KBQpxz4s,18466
24
30
  sima_cli/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
31
  sima_cli/utils/artifactory.py,sha256=6YyVpzVm8ATy7NEwT9nkWx-wptkXrvG7Wl_zDT6jmLs,2390
26
32
  sima_cli/utils/config.py,sha256=wE-cPQqY_gOqaP8t01xsRHD9tBUGk9MgBUm2GYYxI3E,1616
27
33
  sima_cli/utils/config_loader.py,sha256=7I5we1yiCai18j9R9jvhfUzAmT3OjAqVK35XSLuUw8c,2005
28
- sima_cli/utils/env.py,sha256=LJy2eO8cfEYsLuC7p3BT_FAoaZc9emtq6NYhHRBpiBE,5512
34
+ sima_cli/utils/env.py,sha256=Jrb062EnpMBr1jGMotBlI2j9LEH6W1Z5Tgt6LHY7yYQ,5753
29
35
  sima_cli/utils/network.py,sha256=UvqxbqbWUczGFyO-t1SybG7Q-x9kjUVRNIn_D6APzy8,1252
30
- sima_cli-0.0.17.dist-info/licenses/LICENSE,sha256=a260OFuV4SsMZ6sQCkoYbtws_4o2deFtbnT9kg7Rfd4,1082
36
+ sima_cli-0.0.19.dist-info/licenses/LICENSE,sha256=a260OFuV4SsMZ6sQCkoYbtws_4o2deFtbnT9kg7Rfd4,1082
31
37
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
38
  tests/test_app_zoo.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
39
  tests/test_auth.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -36,8 +42,8 @@ tests/test_download.py,sha256=t87DwxlHs26_ws9rpcHGwr_OrcRPd3hz6Zmm0vRee2U,4465
36
42
  tests/test_firmware.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
43
  tests/test_model_zoo.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
44
  tests/test_utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- sima_cli-0.0.17.dist-info/METADATA,sha256=6GVfk37R0BxeQCaWxfPK_VUfElAJfLWeAtbtPkakV1I,3631
40
- sima_cli-0.0.17.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
41
- sima_cli-0.0.17.dist-info/entry_points.txt,sha256=xRYrDq1nCs6R8wEdB3c1kKuimxEjWJkHuCzArQPT0Xk,47
42
- sima_cli-0.0.17.dist-info/top_level.txt,sha256=FtrbAUdHNohtEPteOblArxQNwoX9_t8qJQd59fagDlc,15
43
- sima_cli-0.0.17.dist-info/RECORD,,
45
+ sima_cli-0.0.19.dist-info/METADATA,sha256=7_B7RJl70GRcQOHvMQRrxhjvQhuQD9pqX3FUQvKRr1M,3631
46
+ sima_cli-0.0.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
47
+ sima_cli-0.0.19.dist-info/entry_points.txt,sha256=xRYrDq1nCs6R8wEdB3c1kKuimxEjWJkHuCzArQPT0Xk,47
48
+ sima_cli-0.0.19.dist-info/top_level.txt,sha256=FtrbAUdHNohtEPteOblArxQNwoX9_t8qJQd59fagDlc,15
49
+ sima_cli-0.0.19.dist-info/RECORD,,