dfindexeddb 20240519__py3-none-any.whl → 20241105__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.
@@ -41,7 +41,10 @@ class InternalKey:
41
41
 
42
42
  @classmethod
43
43
  def FromDecoder(
44
- cls, decoder: utils.LevelDBDecoder, base_offset: int = 0) -> InternalKey:
44
+ cls,
45
+ decoder: utils.LevelDBDecoder,
46
+ base_offset: int = 0
47
+ ) -> InternalKey:
45
48
  """Decodes an InternalKey from the current position of a LevelDBDecoder.
46
49
 
47
50
  Args:
@@ -91,7 +94,10 @@ class NewFile(utils.FromDecoderMixin):
91
94
 
92
95
  @classmethod
93
96
  def FromDecoder(
94
- cls, decoder: utils.LevelDBDecoder, base_offset: int = 0) -> NewFile:
97
+ cls,
98
+ decoder: utils.LevelDBDecoder,
99
+ base_offset: int = 0
100
+ ) -> NewFile:
95
101
  """Decodes a NewFile from the current position of a LevelDBDecoder.
96
102
 
97
103
  Args:
@@ -131,7 +137,9 @@ class CompactPointer(utils.FromDecoderMixin):
131
137
 
132
138
  @classmethod
133
139
  def FromDecoder(
134
- cls, decoder: utils.LevelDBDecoder, base_offset: int = 0
140
+ cls,
141
+ decoder: utils.LevelDBDecoder,
142
+ base_offset: int = 0
135
143
  ) -> CompactPointer:
136
144
  """Decodes a CompactPointer from the current position of a LevelDBDecoder.
137
145
 
@@ -162,7 +170,10 @@ class DeletedFile(utils.FromDecoderMixin):
162
170
 
163
171
  @classmethod
164
172
  def FromDecoder(
165
- cls, decoder: utils.LevelDBDecoder, base_offset: int = 0) -> DeletedFile:
173
+ cls,
174
+ decoder: utils.LevelDBDecoder,
175
+ base_offset: int = 0
176
+ ) -> DeletedFile:
166
177
  """Decodes a DeletedFile from the current position of a LevelDBDecoder.
167
178
 
168
179
  Args:
@@ -204,7 +215,10 @@ class VersionEdit(utils.FromDecoderMixin):
204
215
 
205
216
  @classmethod
206
217
  def FromDecoder(
207
- cls, decoder: utils.LevelDBDecoder, base_offset: int = 0) -> VersionEdit:
218
+ cls,
219
+ decoder: utils.LevelDBDecoder,
220
+ base_offset: int = 0
221
+ ) -> VersionEdit:
208
222
  """Decodes a VersionEdit from the current position of a LevelDBDecoder.
209
223
 
210
224
  Args:
@@ -332,6 +346,7 @@ class FileReader:
332
346
  VersionEdit
333
347
  """
334
348
  buffer = bytearray()
349
+ offset = None
335
350
  for physical_record in self.GetPhysicalRecords():
336
351
  if (physical_record.record_type ==
337
352
  definitions.LogFilePhysicalRecordType.FULL):
@@ -382,7 +397,9 @@ class FileReader:
382
397
  version_edit_offset=version_edit.offset,
383
398
  last_sequence=version_edit.last_sequence)
384
399
 
385
- def GetLatestVersion(self) -> LevelDBVersion:
400
+ def GetLatestVersion(self) -> Optional[LevelDBVersion]:
386
401
  """Returns the latest LevelDBVersion instance."""
387
- *_, latest = self.GetVersions()
402
+ latest = None
403
+ for version in self.GetVersions():
404
+ latest = version
388
405
  return latest
@@ -46,7 +46,10 @@ class KeyValueRecord:
46
46
 
47
47
  @classmethod
48
48
  def FromDecoder(
49
- cls, decoder: utils.LevelDBDecoder, block_offset: int, shared_key: bytes
49
+ cls,
50
+ decoder: utils.LevelDBDecoder,
51
+ block_offset: int,
52
+ shared_key: bytes
50
53
  ) -> Tuple[KeyValueRecord, bytes]:
51
54
  """Decodes a ldb key value record.
52
55
 
@@ -259,4 +262,4 @@ class FileReader:
259
262
  A tuple of key and value as bytes.
260
263
  """
261
264
  for record in self.GetKeyValueRecords():
262
- yield (record.key, record.value)
265
+ yield record.key, record.value
@@ -98,7 +98,9 @@ class WriteBatch(utils.FromDecoderMixin):
98
98
 
99
99
  @classmethod
100
100
  def FromDecoder(
101
- cls, decoder: utils.LevelDBDecoder, base_offset: int = 0
101
+ cls,
102
+ decoder: utils.LevelDBDecoder,
103
+ base_offset: int = 0
102
104
  ) -> WriteBatch:
103
105
  """Parses a WriteBatch from a binary stream.
104
106
 
@@ -132,10 +134,11 @@ class PhysicalRecord(utils.FromDecoderMixin):
132
134
  """A physical record from a leveldb log file.
133
135
 
134
136
  Attributes:
135
- offset: the record offset.
137
+ base_offset: the base offset.
136
138
  checksum: the record checksum.
137
139
  length: the length of the record in bytes.
138
- type: the record type.
140
+ offset: the record offset.
141
+ record_type: the record type.
139
142
  contents: the record contents.
140
143
  contents_offset: the offset of where the record contents are stored.
141
144
  """
@@ -151,7 +154,9 @@ class PhysicalRecord(utils.FromDecoderMixin):
151
154
 
152
155
  @classmethod
153
156
  def FromDecoder(
154
- cls, decoder: utils.LevelDBDecoder, base_offset: int = 0
157
+ cls,
158
+ decoder: utils.LevelDBDecoder,
159
+ base_offset: int = 0
155
160
  ) -> Optional[PhysicalRecord]:
156
161
  """Decodes a PhysicalRecord from the current position of a LevelDBDecoder.
157
162
 
@@ -237,7 +242,7 @@ class FileReader:
237
242
  A Log FileReader provides read-only sequential iteration of serialized
238
243
  structures in a leveldb logfile. These structures include:
239
244
  * blocks (Block)
240
- * phyiscal records (PhysicalRecord)
245
+ * physical records (PhysicalRecord)
241
246
  * batches (WriteBatch) and
242
247
  * key/value records (ParsedInternalKey).
243
248
 
@@ -288,6 +293,7 @@ class FileReader:
288
293
  WriteBatch
289
294
  """
290
295
  buffer = bytearray()
296
+ offset = None
291
297
  for physical_record in self.GetPhysicalRecords():
292
298
  if (physical_record.record_type ==
293
299
  definitions.LogFilePhysicalRecordType.FULL):
@@ -49,8 +49,8 @@ class LeveldbPluginManager:
49
49
  """
50
50
  try:
51
51
  return cls._class_registry[plugin_name]
52
- except KeyError:
53
- raise KeyError(f'Plugin not found: {plugin_name}')
52
+ except KeyError as exc:
53
+ raise KeyError(f'Plugin not found: {plugin_name}') from exc
54
54
 
55
55
  @classmethod
56
56
  def RegisterPlugin(cls, plugin_class: Type[interface.LeveldbPlugin]):
dfindexeddb/utils.py CHANGED
@@ -213,7 +213,7 @@ T = TypeVar('T')
213
213
 
214
214
 
215
215
  class FromDecoderMixin:
216
- """A mixin for parsing dataclass attributes using a LevelDBDecoder."""
216
+ """A mixin for parsing dataclass attributes using a StreamDecoder."""
217
217
 
218
218
  @classmethod
219
219
  def FromDecoder(
@@ -268,7 +268,7 @@ def asdict(obj, *, dict_factory=dict): # pylint: disable=invalid-name
268
268
  class name under the __type__ attribute name.
269
269
  """
270
270
  if not dataclasses.is_dataclass(obj):
271
- raise TypeError("asdict() should be called on dataclass instances")
271
+ raise TypeError('asdict() should be called on dataclass instances')
272
272
  return _asdict_inner(obj, dict_factory)
273
273
 
274
274
 
dfindexeddb/version.py CHANGED
@@ -15,7 +15,7 @@
15
15
  """Version information for dfIndexeddb."""
16
16
 
17
17
 
18
- __version__ = "20240519"
18
+ __version__ = "20241105"
19
19
 
20
20
 
21
21
  def GetVersion():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dfindexeddb
3
- Version: 20240519
3
+ Version: 20241105
4
4
  Summary: dfindexeddb is an experimental Python tool for performing digital forensic analysis of IndexedDB and leveldb files.
5
5
  Author-email: Syd Pleno <sydp@google.com>
6
6
  Maintainer-email: dfIndexeddb Developers <dfindexeddb-dev@googlegroups.com>
@@ -230,8 +230,7 @@ analysis of IndexedDB and LevelDB files.
230
230
 
231
231
  It parses LevelDB, IndexedDB and JavaScript structures from these files without
232
232
  requiring native libraries. (Note: only a subset of IndexedDB key types and
233
- JavaScript types for Safari and Chromium-based browsers are currently supported.
234
- Firefox is under development).
233
+ JavaScript types for Firefox, Safari and Chromium-based browsers are currently supported).
235
234
 
236
235
  The content of IndexedDB files is dependent on what a web application stores
237
236
  locally/offline using the web browser's
@@ -313,6 +312,13 @@ options:
313
312
 
314
313
  #### Examples:
315
314
 
315
+ To parse IndexedDB records from an sqlite file for Firefox and output the
316
+ results as JSON, use the following command:
317
+
318
+ ```
319
+ dfindexeddb db -s SOURCE --format firefox -o json
320
+ ```
321
+
316
322
  To parse IndexedDB records from an sqlite file for Safari and output the
317
323
  results as JSON-L, use the following command:
318
324
 
@@ -376,7 +382,7 @@ To parse records from a LevelDB folder, use the following command:
376
382
  dfleveldb db -s SOURCE
377
383
  ```
378
384
 
379
- To parse records from a LevelDB folder, and use the sequence number to
385
+ To parse records from a LevelDB folder, and use the sequence number to
380
386
  determine recovered records and output as JSON, use the
381
387
  following command:
382
388
 
@@ -409,8 +415,8 @@ $ dfleveldb descriptor -s SOURCE [-o {json,jsonl,repr}] [-t {blocks,physical_rec
409
415
 
410
416
  #### Plugins
411
417
 
412
- To apply a plugin parser for a leveldb file/folder, add the
413
- `--plugin [Plugin Name]` argument. Currently, there is support for the
418
+ To apply a plugin parser for a leveldb file/folder, add the
419
+ `--plugin [Plugin Name]` argument. Currently, there is support for the
414
420
  following artifacts:
415
421
 
416
422
  | Plugin Name | Artifact Name |
@@ -0,0 +1,41 @@
1
+ dfindexeddb/__init__.py,sha256=KPYL9__l8od6_OyDfGRTgaJ6iy_fqIgZ-dS2S-e3Rac,599
2
+ dfindexeddb/errors.py,sha256=PNpwyf_lrPc4TE77oAakX3mu5D_YcP3f80wq8Y1LkvY,749
3
+ dfindexeddb/utils.py,sha256=_Pee0qy3w6d-SWx59wVTq4PBUBZ1F-DlBkSquLNr3r4,9997
4
+ dfindexeddb/version.py,sha256=NO-YKjHh-Fvil-z8ILAhBuyQ0UHcdHiPVKJwuRbDvvE,751
5
+ dfindexeddb/indexeddb/__init__.py,sha256=kExXSVBCTKCD5BZJkdMfUMqGksH-DMJxP2_lI0gq-BE,575
6
+ dfindexeddb/indexeddb/cli.py,sha256=bjSQ0L-sQlYOk7v7_L8_XkrSBLXnPIcEhVfQWrxj6Ws,7533
7
+ dfindexeddb/indexeddb/types.py,sha256=Gx9b9TxDCPoz3Xc8J_NPfDxCLoyX5z_lLcSlO4W433k,1892
8
+ dfindexeddb/indexeddb/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ dfindexeddb/indexeddb/chromium/__init__.py,sha256=kExXSVBCTKCD5BZJkdMfUMqGksH-DMJxP2_lI0gq-BE,575
10
+ dfindexeddb/indexeddb/chromium/blink.py,sha256=kwhPfzcWOOxYyXUWfV6f4grQwXzS2ABFaNVMIVhol3c,32268
11
+ dfindexeddb/indexeddb/chromium/definitions.py,sha256=KruZLv3U_93Sc_qedhd6hd9vuRCy6nkovnUtqW6Kz4o,8842
12
+ dfindexeddb/indexeddb/chromium/record.py,sha256=5HAtTTyIgw1gTJBq419Zq0w1aImd3nUkwAZByVCMuaM,48362
13
+ dfindexeddb/indexeddb/chromium/v8.py,sha256=rxvrqhHVww-tLsaqk4P0FJtnLR9FI9lAkgXmigBJW2Y,21557
14
+ dfindexeddb/indexeddb/firefox/__init__.py,sha256=kExXSVBCTKCD5BZJkdMfUMqGksH-DMJxP2_lI0gq-BE,575
15
+ dfindexeddb/indexeddb/firefox/definitions.py,sha256=xkvlYaaFR2IDQBGJGnrhVIOUce6VuMq-kWXe2CLX3Aw,4306
16
+ dfindexeddb/indexeddb/firefox/gecko.py,sha256=sPPBYSq3Mnjv_somkrZJx1IRxTMwmgRbBVj7jwuBtXQ,19598
17
+ dfindexeddb/indexeddb/firefox/record.py,sha256=yB7dYiwzCx1c67Sf6ViMSX51SCrcgU8OBUaVYczqTik,5766
18
+ dfindexeddb/indexeddb/safari/__init__.py,sha256=kExXSVBCTKCD5BZJkdMfUMqGksH-DMJxP2_lI0gq-BE,575
19
+ dfindexeddb/indexeddb/safari/definitions.py,sha256=zCXF06ugcAmYTDPumL_VqNB-TgnrPfmAyUYz3wsBwmQ,2795
20
+ dfindexeddb/indexeddb/safari/record.py,sha256=bzoMSgpXs2SsEOKHjVh9tkJDZtzGkQByq3G5dK_Yd7Q,8010
21
+ dfindexeddb/indexeddb/safari/webkit.py,sha256=oTZNPVIIIVG7iGyR-aJhvwaenwb1bsFrDZRmFaZRYxs,20481
22
+ dfindexeddb/leveldb/__init__.py,sha256=KPYL9__l8od6_OyDfGRTgaJ6iy_fqIgZ-dS2S-e3Rac,599
23
+ dfindexeddb/leveldb/cli.py,sha256=cuMMJAC1bLR_dL1WT2rrKt7ayqArj_D1Q_7ockYi9wk,9970
24
+ dfindexeddb/leveldb/definitions.py,sha256=lPW_kjc47vyoGOoEWfgWvKcpGbN-0h7XXwCeMoFmYKk,1486
25
+ dfindexeddb/leveldb/descriptor.py,sha256=5P-dCLp0qDNHrRbCF9yvuUj1u0B_KhQEVAWfuRwe0Wo,12355
26
+ dfindexeddb/leveldb/ldb.py,sha256=R6wQN5r0h_BpdFvZ2mIsz6rRNWU_2JozeQdl4uRuOBk,8103
27
+ dfindexeddb/leveldb/log.py,sha256=YtXqwy_qrA2_PDG-119oHQkDykXNn6TG4Vr285dTWgo,9480
28
+ dfindexeddb/leveldb/record.py,sha256=j7ZnU6VDVcYVpJRGFRb5Sr2edhC3aGp3U0kPNcoZgng,11912
29
+ dfindexeddb/leveldb/utils.py,sha256=RgEEZ7Z35m3CcOUypAiViQSzKjBgSXZ3aeJhQjY3H9w,3748
30
+ dfindexeddb/leveldb/plugins/__init__.py,sha256=RoC6tRkq8FhqIaFs6jwu1fao_qaSvlSfIFxQVjWregI,690
31
+ dfindexeddb/leveldb/plugins/chrome_notifications.py,sha256=-dyb_AJbUPE2wPJg_Y1Ns5CMtg4udi9Fqo5WKh6f3Z4,5354
32
+ dfindexeddb/leveldb/plugins/interface.py,sha256=QlNEvVvU8K9ChE2kblM97cOvXwvmCh9NuSf2b6WwezQ,1257
33
+ dfindexeddb/leveldb/plugins/manager.py,sha256=Slcj3l3E4ObDdaZeylUv7NldgWgYv6AMgsNl8vanDTc,2155
34
+ dfindexeddb/leveldb/plugins/notification_database_data_pb2.py,sha256=DCPZHbyq2szLgrBprOKrJKycKJma8Z_SnAQM6Jx9bZg,4389
35
+ dfindexeddb-20241105.dist-info/AUTHORS,sha256=QbvjbAom57fpEkekkCVFUj0B9KUMGraR510aUMBC-PE,286
36
+ dfindexeddb-20241105.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
37
+ dfindexeddb-20241105.dist-info/METADATA,sha256=rMt3-NhkLi4FW2KOEBn6O5nfrKxVNmNV1nNIBPR5c2U,18972
38
+ dfindexeddb-20241105.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
39
+ dfindexeddb-20241105.dist-info/entry_points.txt,sha256=WG9YNLZ9lBx4Q9QF6wS4dZdZfADT3Zs4_-MV5TcA0ls,102
40
+ dfindexeddb-20241105.dist-info/top_level.txt,sha256=X9OTaub1c8S_JJ7g-f8JdkhhdiZ4x1j4eni1hdUCwE4,12
41
+ dfindexeddb-20241105.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (75.3.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,37 +0,0 @@
1
- dfindexeddb/__init__.py,sha256=KPYL9__l8od6_OyDfGRTgaJ6iy_fqIgZ-dS2S-e3Rac,599
2
- dfindexeddb/errors.py,sha256=PNpwyf_lrPc4TE77oAakX3mu5D_YcP3f80wq8Y1LkvY,749
3
- dfindexeddb/utils.py,sha256=NEqnBNgAmSrZ7iwhEZx8PYlDrT8c-NnTLbm86ZLsOsc,9998
4
- dfindexeddb/version.py,sha256=PzaqD9kWSx3q6RDQLgClQ7dmnrp2h8nqJcq5jprK2uY,751
5
- dfindexeddb/indexeddb/__init__.py,sha256=kExXSVBCTKCD5BZJkdMfUMqGksH-DMJxP2_lI0gq-BE,575
6
- dfindexeddb/indexeddb/cli.py,sha256=WeOaQXFZglkI9Mwc97rCnVsCX32Dw0CgMQX3RKutwIA,6339
7
- dfindexeddb/indexeddb/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- dfindexeddb/indexeddb/chromium/__init__.py,sha256=kExXSVBCTKCD5BZJkdMfUMqGksH-DMJxP2_lI0gq-BE,575
9
- dfindexeddb/indexeddb/chromium/blink.py,sha256=kwhPfzcWOOxYyXUWfV6f4grQwXzS2ABFaNVMIVhol3c,32268
10
- dfindexeddb/indexeddb/chromium/definitions.py,sha256=1a-AmHVZ95uDB6se_fdarwJR8q0tFMQNh2xrZ2-VxN8,8739
11
- dfindexeddb/indexeddb/chromium/record.py,sha256=LIuTwwQeQbn6CBXdo0AZZHounOWcnXRg6W082yxmNBo,47578
12
- dfindexeddb/indexeddb/chromium/v8.py,sha256=NsbMgA6nRcAfdLg6CFwWadwsDS6TJ95-4MrgphaTuLw,22102
13
- dfindexeddb/indexeddb/firefox/__init__.py,sha256=kExXSVBCTKCD5BZJkdMfUMqGksH-DMJxP2_lI0gq-BE,575
14
- dfindexeddb/indexeddb/safari/__init__.py,sha256=kExXSVBCTKCD5BZJkdMfUMqGksH-DMJxP2_lI0gq-BE,575
15
- dfindexeddb/indexeddb/safari/definitions.py,sha256=nW8MmYx9Ob86W4pxm4QD4Xvr5QjoV34-U7wDhm2GIr0,2779
16
- dfindexeddb/indexeddb/safari/record.py,sha256=bzoMSgpXs2SsEOKHjVh9tkJDZtzGkQByq3G5dK_Yd7Q,8010
17
- dfindexeddb/indexeddb/safari/webkit.py,sha256=SmmwuJKF8NfHCiAaz1Zc1LsVm6IF3bTkaEzi6M0-HdM,21969
18
- dfindexeddb/leveldb/__init__.py,sha256=KPYL9__l8od6_OyDfGRTgaJ6iy_fqIgZ-dS2S-e3Rac,599
19
- dfindexeddb/leveldb/cli.py,sha256=e2C94FSP28dh83FWQXD5N44ymUDwkfFeX0Tfk9YLCTo,9913
20
- dfindexeddb/leveldb/definitions.py,sha256=lPW_kjc47vyoGOoEWfgWvKcpGbN-0h7XXwCeMoFmYKk,1486
21
- dfindexeddb/leveldb/descriptor.py,sha256=WR3irG16oIE6VbaP9UPnzOD3KlHR8GYFnoeG6ySJUzU,12211
22
- dfindexeddb/leveldb/ldb.py,sha256=mN-M7PLtE_VLZCbCbzRgjkSezbMUhgDjgWgPgIxJ1jM,8087
23
- dfindexeddb/leveldb/log.py,sha256=ofw0r2f_3Ll5oHzssvp61nmjhIPdt3tmb9UeNiGLHXk,9401
24
- dfindexeddb/leveldb/record.py,sha256=j7ZnU6VDVcYVpJRGFRb5Sr2edhC3aGp3U0kPNcoZgng,11912
25
- dfindexeddb/leveldb/utils.py,sha256=RgEEZ7Z35m3CcOUypAiViQSzKjBgSXZ3aeJhQjY3H9w,3748
26
- dfindexeddb/leveldb/plugins/__init__.py,sha256=RoC6tRkq8FhqIaFs6jwu1fao_qaSvlSfIFxQVjWregI,690
27
- dfindexeddb/leveldb/plugins/chrome_notifications.py,sha256=-dyb_AJbUPE2wPJg_Y1Ns5CMtg4udi9Fqo5WKh6f3Z4,5354
28
- dfindexeddb/leveldb/plugins/interface.py,sha256=QlNEvVvU8K9ChE2kblM97cOvXwvmCh9NuSf2b6WwezQ,1257
29
- dfindexeddb/leveldb/plugins/manager.py,sha256=jisYyks3OQQQUVACoGcWN81UCGQEa537YvYL7v3CiFs,2139
30
- dfindexeddb/leveldb/plugins/notification_database_data_pb2.py,sha256=DCPZHbyq2szLgrBprOKrJKycKJma8Z_SnAQM6Jx9bZg,4389
31
- dfindexeddb-20240519.dist-info/AUTHORS,sha256=QbvjbAom57fpEkekkCVFUj0B9KUMGraR510aUMBC-PE,286
32
- dfindexeddb-20240519.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
33
- dfindexeddb-20240519.dist-info/METADATA,sha256=aDy87_6iqVwvkSI4teKm-Sq8DKb6GHpuydePrZXsydA,18818
34
- dfindexeddb-20240519.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
35
- dfindexeddb-20240519.dist-info/entry_points.txt,sha256=WG9YNLZ9lBx4Q9QF6wS4dZdZfADT3Zs4_-MV5TcA0ls,102
36
- dfindexeddb-20240519.dist-info/top_level.txt,sha256=X9OTaub1c8S_JJ7g-f8JdkhhdiZ4x1j4eni1hdUCwE4,12
37
- dfindexeddb-20240519.dist-info/RECORD,,