frogml 1.2.24__py3-none-any.whl → 1.2.28__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.
frogml/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
1
  __author__ = "jfrog"
2
- __version__ = "1.2.24"
2
+ __version__ = "1.2.28"
3
3
 
4
4
  from frogml.sdk.model.decorators.api import api_decorator as api
5
5
  from frogml.sdk.model_loggers.model_logger import load_model, log_model
@@ -19,7 +19,10 @@ class ModelRepositorySpec(google.protobuf.message.Message):
19
19
  MODEL_ID_FIELD_NUMBER: builtins.int
20
20
  MODEL_NAME_FIELD_NUMBER: builtins.int
21
21
  project_key: builtins.str
22
- """JFrog project key"""
22
+ """JFrog project key
23
+ This is not used in the request of `CreateModelVersion`. The project key used there is
24
+ derived from the repository. The request value is being ignored in this endpoint.
25
+ """
23
26
  repository_key: builtins.str
24
27
  model_id: builtins.str
25
28
  model_name: builtins.str
@@ -6,18 +6,8 @@ from dependency_injector.wiring import Provide
6
6
  from grpc import RpcError
7
7
  from typing_extensions import Self
8
8
 
9
- from frogml.core.clients.model_version_manager.build_model_version_dto import (
10
- BuildConfigDTO,
11
- )
12
- from frogml.core.clients.model_version_manager.build_model_version_request_mapper import (
13
- map_build_conf_to_build_spec,
14
- )
15
- from frogml.core.exceptions import FrogmlException
16
- from frogml.core.inner.di_configuration import FrogmlContainer
17
- from frogml.core.inner.tool.grpc.grpc_try_wrapping import grpc_try_catch_wrapper
18
- from frogml.core.utils.model_utils import get_model_id_from_model_name
19
- from frogml.core.utils.proto_utils import ProtoUtils
20
9
  from frogml._proto.jfml.model_version.v1.artifact_pb2 import Artifact as ArtifactProto
10
+ from frogml._proto.jfml.model_version.v1.build_spec_pb2 import BuildSpec
21
11
  from frogml._proto.jfml.model_version.v1.model_repository_spec_pb2 import (
22
12
  ModelRepositorySpec,
23
13
  )
@@ -39,10 +29,19 @@ from frogml._proto.jfml.model_version.v1.model_version_pb2 import (
39
29
  ParameterValue,
40
30
  MetricValue,
41
31
  )
42
- from frogml._proto.jfml.model_version.v1.build_spec_pb2 import BuildSpec
32
+ from frogml.core.clients.model_version_manager.build_model_version_dto import (
33
+ BuildConfigDTO,
34
+ )
35
+ from frogml.core.clients.model_version_manager.build_model_version_request_mapper import (
36
+ map_build_conf_to_build_spec,
37
+ )
38
+ from frogml.core.exceptions import FrogmlException
39
+ from frogml.core.inner.di_configuration import FrogmlContainer
40
+ from frogml.core.inner.tool.grpc.grpc_try_wrapping import grpc_try_catch_wrapper
41
+ from frogml.core.utils.model_utils import get_model_id_from_model_name
42
+ from frogml.core.utils.proto_utils import ProtoUtils
43
43
  from frogml.storage.models.entity_manifest import Artifact
44
44
 
45
-
46
45
  logger = logging.getLogger(__name__)
47
46
 
48
47
 
@@ -87,7 +86,6 @@ class ModelVersionManagerClient:
87
86
 
88
87
  def __build_create_model_version_request(
89
88
  self,
90
- project_key: str,
91
89
  repository_key: str,
92
90
  model_name: str,
93
91
  model_version_name: str,
@@ -107,7 +105,6 @@ class ModelVersionManagerClient:
107
105
  dry_run=dry_run,
108
106
  model_version=ModelVersionSpec(
109
107
  repository_spec=ModelRepositorySpec(
110
- project_key=project_key,
111
108
  repository_key=repository_key,
112
109
  model_id=get_model_id_from_model_name(model_name),
113
110
  model_name=model_name,
@@ -121,7 +118,6 @@ class ModelVersionManagerClient:
121
118
 
122
119
  def validate_create_model_version(
123
120
  self,
124
- project_key: str,
125
121
  repository_key: str,
126
122
  model_name: str,
127
123
  model_version_name: str,
@@ -142,7 +138,6 @@ class ModelVersionManagerClient:
142
138
  )
143
139
 
144
140
  create_model_request = self.__build_create_model_version_request(
145
- project_key=project_key,
146
141
  repository_key=repository_key,
147
142
  model_name=model_name,
148
143
  model_version_name=model_version_name,
@@ -165,7 +160,6 @@ class ModelVersionManagerClient:
165
160
 
166
161
  def create_model_version(
167
162
  self,
168
- project_key: str,
169
163
  repository_key: str,
170
164
  model_name: str,
171
165
  model_version_name: str,
@@ -186,7 +180,6 @@ class ModelVersionManagerClient:
186
180
  )
187
181
 
188
182
  create_model_request = self.__build_create_model_version_request(
189
- project_key=project_key,
190
183
  repository_key=repository_key,
191
184
  model_name=model_name,
192
185
  model_version_name=model_version_name,
@@ -3,23 +3,19 @@ import os
3
3
  import sys
4
4
  from typing import Optional, Dict, Any, TextIO, Union
5
5
 
6
- import requests
7
- from requests import Response
8
-
9
- from frogml.core.clients.administration.eco_system.client import EcosystemClient
10
- from frogml.storage.frog_ml import FrogMLStorage
11
- from frogml.storage.models.serialization_metadata import SerializationMetadata
12
- from frogml.storage.models.frogml_model_version import FrogMLModelVersion
13
-
14
6
  from typing_extensions import Self
15
7
 
16
8
  from frogml._proto.jfml.model_version.v1.model_version_framework_pb2 import (
17
9
  ModelVersionFramework,
18
10
  )
11
+ from frogml.core.clients.administration.eco_system.client import EcosystemClient
19
12
  from frogml.core.clients.model_version_manager import ModelVersionManagerClient
20
13
  from frogml.core.exceptions import FrogmlException
21
14
  from frogml.sdk.model_version.constants import FROGML_LOG_LEVEL_ENVAR_NAME
15
+ from frogml.storage.frog_ml import FrogMLStorage
16
+ from frogml.storage.models.frogml_model_version import FrogMLModelVersion
22
17
  from frogml.storage.models.model_manifest import ModelManifest
18
+ from frogml.storage.models.serialization_metadata import SerializationMetadata
23
19
 
24
20
 
25
21
  class JmlCustomerClient:
@@ -66,7 +62,6 @@ class JmlCustomerClient:
66
62
 
67
63
  def validate_model_version(
68
64
  self: Self,
69
- project_key: str,
70
65
  repository: str,
71
66
  model_name: str,
72
67
  model_version: str,
@@ -74,7 +69,6 @@ class JmlCustomerClient:
74
69
  ):
75
70
  try:
76
71
  self.__model_version_manager_client.validate_create_model_version(
77
- project_key=project_key,
78
72
  repository_key=repository,
79
73
  model_name=model_name,
80
74
  model_version_name=model_version,
@@ -84,29 +78,6 @@ class JmlCustomerClient:
84
78
  except Exception as e:
85
79
  raise ValueError(str(e)) from e
86
80
 
87
- def get_project_key(self: Self, repository_key: str) -> str:
88
- self.__logger.info("Getting project key for repository %s", repository_key)
89
- repo_configuration_response: Response = (
90
- self.__ml_storage.get_repository_configuration(
91
- repository_key=repository_key
92
- )
93
- )
94
- try:
95
- repo_configuration_response.raise_for_status()
96
- except requests.exceptions.HTTPError as err:
97
- # Attach the response body for better error logging
98
- raise FrogmlException(f"{err}\nResponse body: {err.response.text}") from err
99
-
100
- configuration_json: dict[str, object] = repo_configuration_response.json()
101
- project_key: Optional[str] = configuration_json.get("projectKey")
102
-
103
- if project_key is None:
104
- raise ValueError(
105
- f"Repository '{repository_key}' does not belong to any project"
106
- )
107
-
108
- return project_key
109
-
110
81
  def log_model_to_artifactory(
111
82
  self: Self,
112
83
  dependencies: Optional[list[str]],
@@ -131,7 +102,6 @@ class JmlCustomerClient:
131
102
 
132
103
  def register_model_version_in_jml(
133
104
  self: Self,
134
- project_key: str,
135
105
  repository: str,
136
106
  model_name: str,
137
107
  model_version_name: str,
@@ -143,7 +113,6 @@ class JmlCustomerClient:
143
113
  """Register a model version in JFrog ML."""
144
114
  try:
145
115
  self.__model_version_manager_client.create_model_version(
146
- project_key=project_key,
147
116
  repository_key=repository,
148
117
  model_name=model_name,
149
118
  model_version_name=model_version_name,
@@ -3,8 +3,23 @@ import os
3
3
  from platform import python_version
4
4
  from typing import Dict, Optional, Callable, cast, Any
5
5
 
6
+ from frogml._proto.jfml.model_version.v1.model_version_framework_pb2 import (
7
+ ModelVersionFramework,
8
+ CatboostFramework,
9
+ HuggingFaceFramework,
10
+ OnnxFramework,
11
+ PythonPickleFramework,
12
+ PytorchFramework,
13
+ ScikitLearnFramework,
14
+ )
6
15
  from frogml.core.exceptions import FrogmlException
7
16
  from frogml.sdk.model_version.constants import (
17
+ CATBOOST_SERIALIZED_TYPE,
18
+ HUGGINGFACE_FRAMEWORK_FORMAT,
19
+ ONNX_FRAMEWORK_FORMAT,
20
+ PYTHON_FRAMEWORK_FORMAT,
21
+ PYTORCH_FRAMEWORK_FORMAT,
22
+ SCIKIT_LEARN_FRAMEWORK_FORMAT,
8
23
  FROGML_LOG_LEVEL_ENVAR_NAME,
9
24
  ModelFramework,
10
25
  STORAGE_MODEL_ENTITY_TYPE,
@@ -28,23 +43,6 @@ from frogml.sdk.model_version.utils.validations import (
28
43
  from frogml.storage.frog_ml import SerializationMetadata, FrogMLStorage
29
44
  from frogml.storage.models.frogml_model_version import FrogMLModelVersion
30
45
  from frogml.storage.models.model_manifest import ModelManifest
31
- from frogml._proto.jfml.model_version.v1.model_version_framework_pb2 import (
32
- ModelVersionFramework,
33
- CatboostFramework,
34
- HuggingFaceFramework,
35
- OnnxFramework,
36
- PythonPickleFramework,
37
- PytorchFramework,
38
- ScikitLearnFramework,
39
- )
40
- from frogml.sdk.model_version.constants import (
41
- CATBOOST_SERIALIZED_TYPE,
42
- HUGGINGFACE_FRAMEWORK_FORMAT,
43
- ONNX_FRAMEWORK_FORMAT,
44
- PYTHON_FRAMEWORK_FORMAT,
45
- PYTORCH_FRAMEWORK_FORMAT,
46
- SCIKIT_LEARN_FRAMEWORK_FORMAT,
47
- )
48
46
 
49
47
  _PYTHON_RUNTIME = "python"
50
48
 
@@ -128,9 +126,7 @@ def _log_model(config: ModelLogConfig) -> None:
128
126
  )
129
127
 
130
128
  if is_customer_exists_in_jml:
131
- project_key: str = jml_customer_client.get_project_key(config.repository)
132
129
  jml_customer_client.validate_model_version(
133
- project_key,
134
130
  config.repository,
135
131
  config.model_name,
136
132
  config.version,
@@ -170,7 +166,6 @@ def _log_model(config: ModelLogConfig) -> None:
170
166
 
171
167
  if is_customer_exists_in_jml:
172
168
  jml_customer_client.register_model_version_in_jml(
173
- project_key,
174
169
  config.repository,
175
170
  config.model_name,
176
171
  config.version,
@@ -280,12 +280,6 @@ class ArtifactoryApi:
280
280
  url=join_url(self.uri, "/api/security/encryptedPassword")
281
281
  )
282
282
 
283
- def get_repository_configuration(self: Self, repository_key: str) -> Response:
284
- url: str = modify_url(
285
- self.uri, f"artifactory/api/v2/repositories/{repository_key}"
286
- )
287
- return self.http_client.get(url=url)
288
-
289
283
  def generate_access_token(self: Self) -> Response:
290
284
  """
291
285
  Generates an access token for authenticating with the JFrog Platform.
frogml/storage/frog_ml.py CHANGED
@@ -42,7 +42,6 @@ from frogml.storage.utils import (
42
42
  validate_not_folder_paths,
43
43
  validate_path_exists,
44
44
  )
45
- from typing_extensions import Self
46
45
 
47
46
 
48
47
  class FileType(Enum):
@@ -74,11 +73,6 @@ class FrogMLStorage(BaseStorage):
74
73
  max_workers=self.http_threads_count
75
74
  )
76
75
 
77
- def get_repository_configuration(self: Self, repository_key: str):
78
- return self.artifactory_api.get_repository_configuration(
79
- repository_key=repository_key
80
- )
81
-
82
76
  def upload_dataset_version(
83
77
  self,
84
78
  repository: str,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: frogml
3
- Version: 1.2.24
3
+ Version: 1.2.28
4
4
  Summary: frogml contains the necessary objects and communication tools for using the JFrog ml Platform
5
5
  License: Apache-2.0
6
6
  Keywords: mlops,ml,deployment,serving,model
@@ -1,4 +1,4 @@
1
- frogml/__init__.py,sha256=SYhABGZ4g5cE2oC884FNfK9iaaNnmOzfeua9kts4jlk,741
1
+ frogml/__init__.py,sha256=82ta2BQl2e3AbEOMtmrDec89eOL9uy9NwlWqaiqf6q0,741
2
2
  frogml/_proto/jfml/hosting_gateway/v1/build_upload_url_pb2.py,sha256=pY7-QarLJWbL9uNmZ69RfE7IPVzwpVIhtd3A0wztSNY,1942
3
3
  frogml/_proto/jfml/hosting_gateway/v1/build_upload_url_pb2.pyi,sha256=505I4uUrCmv2hsUw2H5eT-nlkNOCQOWodpvEkH2fHIo,3073
4
4
  frogml/_proto/jfml/hosting_gateway/v1/build_upload_url_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
@@ -12,7 +12,7 @@ frogml/_proto/jfml/model_version/v1/build_spec_pb2.py,sha256=S_pdnyFvTLnXNe_iRZ0
12
12
  frogml/_proto/jfml/model_version/v1/build_spec_pb2.pyi,sha256=P7We8OZGBi-_0g-s1p4hPwvqYE3ygaiZsqjYiBmJA2E,4821
13
13
  frogml/_proto/jfml/model_version/v1/build_spec_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
14
14
  frogml/_proto/jfml/model_version/v1/model_repository_spec_pb2.py,sha256=C41E30HmYwfYtAwPUM9lJW_oWg6JH7u9NAQWN3DnMWI,1503
15
- frogml/_proto/jfml/model_version/v1/model_repository_spec_pb2.pyi,sha256=Wtd9aR04T4JrU6CJDlyn8WCo8N8MtiHv87RvpzA4gRk,1478
15
+ frogml/_proto/jfml/model_version/v1/model_repository_spec_pb2.pyi,sha256=_Rr7sdDxsVjl0L4GReKMAaeUC_yZJ_OgvkNg81IrmWs,1660
16
16
  frogml/_proto/jfml/model_version/v1/model_repository_spec_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
17
17
  frogml/_proto/jfml/model_version/v1/model_version_framework_pb2.py,sha256=ACFTNdlRZ1yHF1mV0ZxjE_rR-gWZxS8HB2maPUw59J0,2765
18
18
  frogml/_proto/jfml/model_version/v1/model_version_framework_pb2.pyi,sha256=Ov8O3lWPtc-KmGjpm3-It15IINzCVt2QXAC6JXNrupY,3725
@@ -702,7 +702,7 @@ frogml/core/clients/model_management/client.py,sha256=L3rUPfxRNA2s4KV5294QXkPCmi
702
702
  frogml/core/clients/model_version_manager/__init__.py,sha256=4Pnfzj4Egps48__dProdbSKQl5pNip0hGJd75w67BfY,46
703
703
  frogml/core/clients/model_version_manager/build_model_version_dto.py,sha256=N-W84WyKDiwr-lmcpLss0gOV3QK4EAcpv2lqv1TROos,1984
704
704
  frogml/core/clients/model_version_manager/build_model_version_request_mapper.py,sha256=BYK_nmfLF0o9QWTKfcOfsP5j1hmdu5RQkmsQ0ypO6rI,4760
705
- frogml/core/clients/model_version_manager/client.py,sha256=VMgOoZW8EoSwx3BZCtknbxlhwOob1Y3GH9XSj7bBg6Y,11314
705
+ frogml/core/clients/model_version_manager/client.py,sha256=T3pJmjgkL8E0SPSGWZHXDVmEAs3Ow36p-nHAg-tjgxo,11108
706
706
  frogml/core/clients/model_version_manager/const.py,sha256=SBEi06KU-ntF6oxjTpSXbd9R72x_mm9cD9JhYQLXsMY,684
707
707
  frogml/core/clients/secret_service/__init__.py,sha256=TdQl1lgplXCKVHYSN4feRIAoonZ7XDz50zALjwVDcM4,40
708
708
  frogml/core/clients/secret_service/client.py,sha256=RDicLLGWIV1Ecm5A4F4TcQec5SHudTkdXG8eRilHJ8M,3657
@@ -1057,16 +1057,16 @@ frogml/sdk/model_version/transformers/initialize_model_transformer.py,sha256=7AT
1057
1057
  frogml/sdk/model_version/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1058
1058
  frogml/sdk/model_version/utils/dependencies_tools.py,sha256=Sdmbf3Nb_xlc8uY4fK8bvPOGwh7OtejdZd1m5POfsDU,6403
1059
1059
  frogml/sdk/model_version/utils/files_tools.py,sha256=9995FuZ5xMbN5Bm77BzDYU0cQ4nwCYYAl6goynJVvdI,11595
1060
- frogml/sdk/model_version/utils/jml/customer_client.py,sha256=YNSPpAGH3VIv-Ese-ru31dksbLvbLbGV_6IrM4z7mOE,6167
1060
+ frogml/sdk/model_version/utils/jml/customer_client.py,sha256=a5S2CaRFiFSXmFsuFCmd7OO_bpweha-KcAHzcyjz1fA,5034
1061
1061
  frogml/sdk/model_version/utils/log_model_helper.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1062
1062
  frogml/sdk/model_version/utils/model_log_config.py,sha256=6Geo68s02zJc9pqqmEoOe8za5DU2ttvWBdKf8eXhvVY,12267
1063
- frogml/sdk/model_version/utils/storage.py,sha256=BTAv5BrTLwWSIsEZTotA6TlS-opUgVICNma01kkfkJA,10438
1063
+ frogml/sdk/model_version/utils/storage.py,sha256=aVyixU-BygUTVFrxV4nMfA5AiSPCyuia8GL38YoJmiM,10255
1064
1064
  frogml/sdk/model_version/utils/storage_helper.py,sha256=fZLIjEAHVxhFXVk08z0pfFWFzOeJDZjLSVVnp3ZY9kw,374
1065
1065
  frogml/sdk/model_version/utils/validations.py,sha256=pGrhd5f5WeL5qit9CCG0Jlx21WY5M3V_psTD9tlcs7U,1203
1066
1066
  frogml/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1067
1067
  frogml/storage/_environment.py,sha256=zuzOJBtBwFaguwn_JkKjfhXStZoustgP30KzOP3mYv8,707
1068
1068
  frogml/storage/artifactory/__init__.py,sha256=C02rcm7kqsZBVA6c6Gztxamj96hn8Aj6BuzYWFRmWbQ,71
1069
- frogml/storage/artifactory/_artifactory_api.py,sha256=26ktPpiMoVFPvVF_jzc3Y_3Q7X6jdcEQzjD63Mbu38E,12766
1069
+ frogml/storage/artifactory/_artifactory_api.py,sha256=MkK6ZZ5tJcj7xTk6OqMcfY2MEnFv7zO40Vdndo4ocUQ,12522
1070
1070
  frogml/storage/authentication/login/__init__.py,sha256=ch8UhQwh3o5ddyoJykQ0Bnog5-8qKHmeDpwqny8xMzM,46
1071
1071
  frogml/storage/authentication/login/_login_cli.py,sha256=ZSTIGdoiH2vsOJCqaN0DVwgMgKnV--7SnMkySIWMiks,7798
1072
1072
  frogml/storage/authentication/login/_login_command.py,sha256=4ib9UVMC-CmsMuJATd_l3luvUhRvzbIs35fZw2bA0Ms,2845
@@ -1081,7 +1081,7 @@ frogml/storage/base_storage.py,sha256=k9CAj9wlnlydxuVZKcC-IcW9GP0KdVoDNKUevemeaY
1081
1081
  frogml/storage/constants.py,sha256=9MxTEogYeHYn-6jE5AGBxVcHVX8N8a5eOwfRDGHEvGY,2268
1082
1082
  frogml/storage/exceptions/checksum_verification_error.py,sha256=t1muLRYvqza7Q4jo1mYHck9ZoDwlGE7WxcheAFAnIQs,159
1083
1083
  frogml/storage/exceptions/validation_error.py,sha256=_twu_xcL-O7D26qkskuuR-_NcnPPTADIUO9HGY4g0x0,156
1084
- frogml/storage/frog_ml.py,sha256=hU5v9XrlDNNq_A203Pe6QLaiEP1srlSP_udQbWgXoE4,23750
1084
+ frogml/storage/frog_ml.py,sha256=s9rfedc3e2RYTflU2Vt59MnEIZvaPW4FwmD5R2PTHxs,23525
1085
1085
  frogml/storage/http/__init__.py,sha256=BOXGzjq1gJXlihldaZvMQNGJIdCy-UHWsk3u-bXEZnQ,36
1086
1086
  frogml/storage/http/http_client.py,sha256=tXegbonhMiyN0FzjTSqOeg5OBsFYBozkbMtRfZibTUM,2435
1087
1087
  frogml/storage/logging/__init__.py,sha256=JaBPWQQt3pjoLhUcZtgqPydGlKAWYpSvfPkt2z1Wi90,32
@@ -1150,6 +1150,6 @@ frogml_services_mock/mocks/utils/exception_handlers.py,sha256=k_8mez3cwjNjKE9yGQ
1150
1150
  frogml_services_mock/services_mock.py,sha256=y1_h189Ldu5MdVUW4nj-WMBtvUfkM_aKse7UfAb6Rxk,19419
1151
1151
  frogml_services_mock/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1152
1152
  frogml_services_mock/utils/service_utils.py,sha256=ZlB0CnB1J6oBn6_m7fQO2U8tKoboHdUa6ljjkRMYNXU,265
1153
- frogml-1.2.24.dist-info/METADATA,sha256=lor0gL06kcVaM0GVKtB0FIf2CQz1sRCiwu9s95pgyrI,5599
1154
- frogml-1.2.24.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
1155
- frogml-1.2.24.dist-info/RECORD,,
1153
+ frogml-1.2.28.dist-info/METADATA,sha256=WWtBNiKfWF8wRe_m94_O3KZhbM99DzKZiThZ5vQpt7w,5599
1154
+ frogml-1.2.28.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
1155
+ frogml-1.2.28.dist-info/RECORD,,