nextrec 0.3.2__py3-none-any.whl → 0.3.4__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.
Files changed (40) hide show
  1. nextrec/__version__.py +1 -1
  2. nextrec/basic/features.py +10 -23
  3. nextrec/basic/layers.py +18 -61
  4. nextrec/basic/loggers.py +71 -8
  5. nextrec/basic/metrics.py +55 -33
  6. nextrec/basic/model.py +287 -397
  7. nextrec/data/__init__.py +2 -2
  8. nextrec/data/data_utils.py +80 -4
  9. nextrec/data/dataloader.py +38 -59
  10. nextrec/data/preprocessor.py +38 -73
  11. nextrec/models/generative/hstu.py +1 -1
  12. nextrec/models/match/dssm.py +2 -2
  13. nextrec/models/match/dssm_v2.py +2 -2
  14. nextrec/models/match/mind.py +2 -2
  15. nextrec/models/match/sdm.py +2 -2
  16. nextrec/models/match/youtube_dnn.py +2 -2
  17. nextrec/models/multi_task/esmm.py +1 -1
  18. nextrec/models/multi_task/mmoe.py +1 -1
  19. nextrec/models/multi_task/ple.py +1 -1
  20. nextrec/models/multi_task/poso.py +1 -1
  21. nextrec/models/multi_task/share_bottom.py +1 -1
  22. nextrec/models/ranking/afm.py +1 -1
  23. nextrec/models/ranking/autoint.py +1 -1
  24. nextrec/models/ranking/dcn.py +1 -1
  25. nextrec/models/ranking/deepfm.py +1 -1
  26. nextrec/models/ranking/dien.py +1 -1
  27. nextrec/models/ranking/din.py +1 -1
  28. nextrec/models/ranking/fibinet.py +1 -1
  29. nextrec/models/ranking/fm.py +1 -1
  30. nextrec/models/ranking/masknet.py +2 -2
  31. nextrec/models/ranking/pnn.py +1 -1
  32. nextrec/models/ranking/widedeep.py +1 -1
  33. nextrec/models/ranking/xdeepfm.py +1 -1
  34. nextrec/utils/__init__.py +2 -1
  35. nextrec/utils/common.py +21 -2
  36. {nextrec-0.3.2.dist-info → nextrec-0.3.4.dist-info}/METADATA +3 -3
  37. nextrec-0.3.4.dist-info/RECORD +57 -0
  38. nextrec-0.3.2.dist-info/RECORD +0 -57
  39. {nextrec-0.3.2.dist-info → nextrec-0.3.4.dist-info}/WHEEL +0 -0
  40. {nextrec-0.3.2.dist-info → nextrec-0.3.4.dist-info}/licenses/LICENSE +0 -0
nextrec/utils/common.py CHANGED
@@ -1,7 +1,6 @@
1
1
  import torch
2
2
  import platform
3
3
  from collections import OrderedDict
4
- from typing import Sequence, Union, TYPE_CHECKING
5
4
 
6
5
 
7
6
  def resolve_device() -> str:
@@ -19,6 +18,14 @@ def resolve_device() -> str:
19
18
  return "cpu"
20
19
 
21
20
 
21
+ def normalize_to_list(value: str | list[str] | None) -> list[str]:
22
+ if value is None:
23
+ return []
24
+ if isinstance(value, str):
25
+ return [value]
26
+ return list(value)
27
+
28
+
22
29
  def merge_features(primary, secondary) -> list:
23
30
  """
24
31
  Merge two feature lists while preserving order and deduplicating by feature name.
@@ -29,7 +36,6 @@ def merge_features(primary, secondary) -> list:
29
36
  merged.setdefault(feat.name, feat)
30
37
  return list(merged.values())
31
38
 
32
-
33
39
  def get_mlp_output_dim(params: dict, fallback: int) -> int:
34
40
  """
35
41
  Get the output dimension of an MLP-like config.
@@ -39,3 +45,16 @@ def get_mlp_output_dim(params: dict, fallback: int) -> int:
39
45
  if dims:
40
46
  return dims[-1]
41
47
  return fallback
48
+
49
+ def to_tensor(value, dtype: torch.dtype, device: torch.device | str | None = None) -> torch.Tensor:
50
+ """Convert any value to a tensor with the desired dtype/device."""
51
+ if value is None:
52
+ raise ValueError("[Tensor Utils Error] Cannot convert None to tensor.")
53
+ tensor = value if isinstance(value, torch.Tensor) else torch.as_tensor(value)
54
+ if tensor.dtype != dtype:
55
+ tensor = tensor.to(dtype=dtype)
56
+ if device is not None:
57
+ target_device = device if isinstance(device, torch.device) else torch.device(device)
58
+ if tensor.device != target_device:
59
+ tensor = tensor.to(target_device)
60
+ return tensor
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nextrec
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: A comprehensive recommendation library with match, ranking, and multi-task learning models
5
5
  Project-URL: Homepage, https://github.com/zerolovesea/NextRec
6
6
  Project-URL: Repository, https://github.com/zerolovesea/NextRec
@@ -63,7 +63,7 @@ Description-Content-Type: text/markdown
63
63
  ![Python](https://img.shields.io/badge/Python-3.10+-blue.svg)
64
64
  ![PyTorch](https://img.shields.io/badge/PyTorch-1.10+-ee4c2c.svg)
65
65
  ![License](https://img.shields.io/badge/License-Apache%202.0-green.svg)
66
- ![Version](https://img.shields.io/badge/Version-0.3.2-orange.svg)
66
+ ![Version](https://img.shields.io/badge/Version-0.3.4-orange.svg)
67
67
 
68
68
  English | [中文文档](README_zh.md)
69
69
 
@@ -110,7 +110,7 @@ To dive deeper, Jupyter notebooks are available:
110
110
  - [Hands on the NextRec framework](/tutorials/notebooks/en/Hands%20on%20nextrec.ipynb)
111
111
  - [Using the data processor for preprocessing](/tutorials/notebooks/en/Hands%20on%20dataprocessor.ipynb)
112
112
 
113
- > Current version [0.3.2]: the matching module is not fully polished yet and may have compatibility issues or unexpected errors. Please raise an issue if you run into problems.
113
+ > Current version [0.3.4]: the matching module is not fully polished yet and may have compatibility issues or unexpected errors. Please raise an issue if you run into problems.
114
114
 
115
115
  ## 5-Minute Quick Start
116
116
 
@@ -0,0 +1,57 @@
1
+ nextrec/__init__.py,sha256=CvocnY2uBp0cjNkhrT6ogw0q2bN9s1GNp754FLO-7lo,1117
2
+ nextrec/__version__.py,sha256=oYLGMpySamd16KLiaBTfRyrAS7_oyp-TOEHmzmeumwg,22
3
+ nextrec/basic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ nextrec/basic/activation.py,sha256=1qs9pq4hT3BUxIiYdYs57axMCm4-JyOBFQ6x7xkHTwM,2849
5
+ nextrec/basic/callback.py,sha256=wwh0I2kKYyywCB-sG9eQXShlpXFJIo75qApJmnI5p6c,1036
6
+ nextrec/basic/features.py,sha256=-RRRbEPU-SFI-GtppflW6O0bKShUsV-Hg_lTGpo3AIE,4262
7
+ nextrec/basic/layers.py,sha256=zzEseKYVnMVs1Tg5EGrFimugId15jI6HumgzjFyRqgw,23127
8
+ nextrec/basic/loggers.py,sha256=hh9tRMmaCTaJ_sfRHIlbcqd6BcpK63vpZ_21TFCiKLI,6148
9
+ nextrec/basic/metrics.py,sha256=8-hMZJXU5L4F8GnToxMZey5dlBrtFyRtTuI_zoQCtIo,21579
10
+ nextrec/basic/model.py,sha256=afnvicyxXMgWdvhrIUaoNnZ7S-QYRYr7fTY5bdM1u_s,68829
11
+ nextrec/basic/session.py,sha256=oaATn-nzbJ9A6SGbMut9xLV_NSh9_1KmVDeNauS06Ps,4767
12
+ nextrec/data/__init__.py,sha256=6WgXZafzzXcv5kuxKNi67O8BJZVl_P_HM2IZCDIIhPA,1052
13
+ nextrec/data/data_utils.py,sha256=aOyja3Yu7O2c8eIeL3P8MyUlUR5EerOUT9UeF4ATq8o,10574
14
+ nextrec/data/dataloader.py,sha256=2MLe69y0E1cTZyzMNgyLUCxa6lllGd1ntvwpXzxdX10,14199
15
+ nextrec/data/preprocessor.py,sha256=lhigpjvkEqsjTRfbBBOjgGOxoPyOifwq2LoswgyIVqc,40488
16
+ nextrec/loss/__init__.py,sha256=mO5t417BneZ8Ysa51GyjDaffjWyjzFgPXIQrrggasaQ,827
17
+ nextrec/loss/listwise.py,sha256=gxDbO1td5IeS28jKzdE35o1KAYBRdCYoMzyZzfNLhc0,5689
18
+ nextrec/loss/loss_utils.py,sha256=uZ4m9ChLr-UgIc5Yxm1LjwXDDepApQ-Fas8njweZ9qg,2641
19
+ nextrec/loss/pairwise.py,sha256=MN_3Pk6Nj8KCkmUqGT5cmyx1_nQa3TIx_kxXT_HB58c,3396
20
+ nextrec/loss/pointwise.py,sha256=shgdRJwTV7vAnVxHSffOJU4TPQeKyrwudQ8y-R10nYM,7144
21
+ nextrec/models/generative/__init__.py,sha256=vo8-DloD74cKc1moSH-4GYG99w8Yi8YPGPxh8XDJPoc,50
22
+ nextrec/models/generative/hstu.py,sha256=CLu8Ee_L4fdnb7_DKocz0g7SZlPI1g_6o8HtyzRkI9s,16368
23
+ nextrec/models/generative/tiger.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ nextrec/models/match/__init__.py,sha256=ASZB5abqKPhDbk8NErNNNa0DHuWpsVxvUtyEn5XMx6Y,215
25
+ nextrec/models/match/dssm.py,sha256=1cj1Fb3yFTKxA1kRaomh_Q8y66vBZc85ywAIXWosyL0,8230
26
+ nextrec/models/match/dssm_v2.py,sha256=BY6m9651NlzMLjRa9oeez0dab_3NjNFVgYQ7Q39Ug74,7187
27
+ nextrec/models/match/mind.py,sha256=0cggXKE1-XsTZ6IX4UH81a5KycdGF-_ix2Nw-eKTLpg,14886
28
+ nextrec/models/match/sdm.py,sha256=wVRj6PWLF6hMIqqlJDUuKqxJAvCGPe-HfD3EVgd16Sw,10918
29
+ nextrec/models/match/youtube_dnn.py,sha256=Wa5JWrlIpMuBoyXpnBrdnm1nQ8ZO_XcR517zfINh-xA,7544
30
+ nextrec/models/multi_task/esmm.py,sha256=Ho5UN2H9H9-ZYML6eqpBYTVdTO4Ja9AoYP5SSgsgQaw,6442
31
+ nextrec/models/multi_task/mmoe.py,sha256=zfBAUoQijHCuat962dZI0MCAy8C6PZqZ-zOd16JznF8,7803
32
+ nextrec/models/multi_task/ple.py,sha256=zNBea0sfJska36RVH1N9O92m7rPmbaWYqoPbnGoy1RE,11949
33
+ nextrec/models/multi_task/poso.py,sha256=_yLiCkD3NhOZEOWx-jP4MJxSEdNCu3mqeo_XRt8CWts,16652
34
+ nextrec/models/multi_task/share_bottom.py,sha256=kvrkXQSTDPEwwmBvXw3xryBm3gT8Uq4_Hb3TenwRj9w,5920
35
+ nextrec/models/ranking/__init__.py,sha256=AY806x-2BtltQdlR4wu23-keL9YUe3An92OJshS4t9Y,472
36
+ nextrec/models/ranking/afm.py,sha256=uFSUIv9d6NQkCiM2epmSdMy4kxjFuCRVbrZOv3nebGE,4539
37
+ nextrec/models/ranking/autoint.py,sha256=MN6Dv6EMK0ODsCEeX4iXBSDoxK9a_DxIdEduGAUIVEQ,7771
38
+ nextrec/models/ranking/dcn.py,sha256=sy0v_kMQ1OfVCFuRD8FDrroQHm-RnTx4lVacfXfs2N8,4896
39
+ nextrec/models/ranking/dcn_v2.py,sha256=ivHwLRxi4VcNzh9DWQQ227Gw5dhyRZ5LezuqkAdD89o,3630
40
+ nextrec/models/ranking/deepfm.py,sha256=Dr4KoLGEWONKixzTRKk8kHXNYRZ-yoo2rVVRGZ5xrAU,4990
41
+ nextrec/models/ranking/dien.py,sha256=cybZk1mZMxYD1lgOSN6JovrQPjHmdQFSvWWv99NbLrk,12741
42
+ nextrec/models/ranking/din.py,sha256=72lRtQVLQAh7yeSqoS2nZ8b9jEiaQ4OsgJQkrK3fL4s,7195
43
+ nextrec/models/ranking/fibinet.py,sha256=9jHR0LrhtraBR2KNjNFEDNJLOChnKdyxAXx3JIRYXDg,4852
44
+ nextrec/models/ranking/fm.py,sha256=ickjW6cogKKxbAXt_wqVOG6xSkokP0zG4k9ZnK3t6YE,2960
45
+ nextrec/models/ranking/masknet.py,sha256=9K6XKcr8f8PcVhLfgFd8l4tq78lcclAQAXZKlVEjfiY,11504
46
+ nextrec/models/ranking/pnn.py,sha256=eEyBnALuzaNx27iGJ0ZqNcf0u7dKN8SiO03lkcv1hiE,4956
47
+ nextrec/models/ranking/widedeep.py,sha256=AJPkoThUTSBGPNBjD-aiWsMH2hSiSnGLjIPy_2neNhc,5034
48
+ nextrec/models/ranking/xdeepfm.py,sha256=wn6YnX78EyBzil7IRBcqyDqsnysERVJ5-lWGuRMCpxE,5681
49
+ nextrec/utils/__init__.py,sha256=ciw6B9SXffjSb4cwco-WXpKSE7M9D6ILpLZ2oftwj6A,457
50
+ nextrec/utils/common.py,sha256=NYXnBVtUCtm8epT2ZxJHn_m1SIBBI_PEjZ5VpL465ls,2009
51
+ nextrec/utils/embedding.py,sha256=yxYSdFx0cJITh3Gf-K4SdhwRtKGcI0jOsyBgZ0NLa_c,465
52
+ nextrec/utils/initializer.py,sha256=ffYOs5QuIns_d_-5e40iNtg6s1ftgREJN-ueq_NbDQE,1647
53
+ nextrec/utils/optimizer.py,sha256=EUjAGFPeyou_Cv-_2HRvjzut8y_qpAQudc8L2T0k8zw,2706
54
+ nextrec-0.3.4.dist-info/METADATA,sha256=X5fo5gymQdPXLgM1N03E58uFSQyuQOmdbUp8vXvKl0g,16319
55
+ nextrec-0.3.4.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
56
+ nextrec-0.3.4.dist-info/licenses/LICENSE,sha256=2fQfVKeafywkni7MYHyClC6RGGC3laLTXCNBx-ubtp0,1064
57
+ nextrec-0.3.4.dist-info/RECORD,,
@@ -1,57 +0,0 @@
1
- nextrec/__init__.py,sha256=CvocnY2uBp0cjNkhrT6ogw0q2bN9s1GNp754FLO-7lo,1117
2
- nextrec/__version__.py,sha256=vNiWJ14r_cw5t_7UDqDQIVZvladKFGyHH2avsLpN7Vg,22
3
- nextrec/basic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
- nextrec/basic/activation.py,sha256=1qs9pq4hT3BUxIiYdYs57axMCm4-JyOBFQ6x7xkHTwM,2849
5
- nextrec/basic/callback.py,sha256=wwh0I2kKYyywCB-sG9eQXShlpXFJIo75qApJmnI5p6c,1036
6
- nextrec/basic/features.py,sha256=JtB63jqOIL7zZ5zoTgvEM4fEoqexMz0SMTmowTURk1I,4626
7
- nextrec/basic/layers.py,sha256=zIa8QsPkOOovjrMAUC94SfhSVTS4R_CXySBr5KAk6i4,24686
8
- nextrec/basic/loggers.py,sha256=VNed0LagpoPSUl2itW8hHT-BSqJHTlQY5pVxIVmm6AE,3733
9
- nextrec/basic/metrics.py,sha256=YFOaUexHJncc6sPbw2LF2sBnFp-3PLMrjR3aQbBDpGs,20891
10
- nextrec/basic/model.py,sha256=Doq5KOYrUHavpSa8RkHbT98ZhbFGRpRsA_9K1A5gU9c,73453
11
- nextrec/basic/session.py,sha256=oaATn-nzbJ9A6SGbMut9xLV_NSh9_1KmVDeNauS06Ps,4767
12
- nextrec/data/__init__.py,sha256=COaTyiARV7hEQTT3e74uyCBGmHFQ9rhe6g6Shc-Ualw,1064
13
- nextrec/data/data_utils.py,sha256=H-isIrs2FPyLSTe7IiFUkn6SQKfO0BkGKmj43C9yLGY,7602
14
- nextrec/data/dataloader.py,sha256=ySNTts03P8I1vq53HwsP0cg9QdkA0SGyazNJnEA5vfs,14668
15
- nextrec/data/preprocessor.py,sha256=MhQofbOcZLQCwsi335NTwDWsjQ0QbPIuzbzC0-ijAn4,41731
16
- nextrec/loss/__init__.py,sha256=mO5t417BneZ8Ysa51GyjDaffjWyjzFgPXIQrrggasaQ,827
17
- nextrec/loss/listwise.py,sha256=gxDbO1td5IeS28jKzdE35o1KAYBRdCYoMzyZzfNLhc0,5689
18
- nextrec/loss/loss_utils.py,sha256=uZ4m9ChLr-UgIc5Yxm1LjwXDDepApQ-Fas8njweZ9qg,2641
19
- nextrec/loss/pairwise.py,sha256=MN_3Pk6Nj8KCkmUqGT5cmyx1_nQa3TIx_kxXT_HB58c,3396
20
- nextrec/loss/pointwise.py,sha256=shgdRJwTV7vAnVxHSffOJU4TPQeKyrwudQ8y-R10nYM,7144
21
- nextrec/models/generative/__init__.py,sha256=vo8-DloD74cKc1moSH-4GYG99w8Yi8YPGPxh8XDJPoc,50
22
- nextrec/models/generative/hstu.py,sha256=qTS05XQBjgC5K34A07DSgIITMs1-ADZ8KVb-HEyNh9w,16369
23
- nextrec/models/generative/tiger.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- nextrec/models/match/__init__.py,sha256=ASZB5abqKPhDbk8NErNNNa0DHuWpsVxvUtyEn5XMx6Y,215
25
- nextrec/models/match/dssm.py,sha256=e0hUqNLJVwTRVz4F4EiO8KLOOprKRBDtI4ID6Y1Tc60,8232
26
- nextrec/models/match/dssm_v2.py,sha256=ywtqTy3YN9ke_7kzcDp7Fhtldw9RJz6yfewxALJb6Z0,7189
27
- nextrec/models/match/mind.py,sha256=nDzy1owhXtci1_3yWddbnXIc4X5hsg2333uRt1jExZE,14888
28
- nextrec/models/match/sdm.py,sha256=96yfMQ6arP6JRhAkDTGEjlBiTteznMykrDV_3jqvvVk,10920
29
- nextrec/models/match/youtube_dnn.py,sha256=pnrz9LYu65Fj4neOriFF45B5k2-yYiiREtQICxxYXZ0,7546
30
- nextrec/models/multi_task/esmm.py,sha256=27eKtcDV7u-_89_h6aoEmTGhzGwpux3JVeHHbv8aQWE,6443
31
- nextrec/models/multi_task/mmoe.py,sha256=RDbwr66kO1vlgfREdRhUgsBYkblzJ2a_-p2oayqxRkE,7804
32
- nextrec/models/multi_task/ple.py,sha256=TCJOlgfetpueJa8LosEttOf43JPXXTsZh8t9PBoP4ek,11950
33
- nextrec/models/multi_task/poso.py,sha256=FIdbKRfNJJRlUMkSnrIjQkOLvNOT_x03oeUyPWbVh8I,16653
34
- nextrec/models/multi_task/share_bottom.py,sha256=3oJCQxVL2iIfba4pRiERaxmOp4d4cICtkOxLeoMqfgw,5921
35
- nextrec/models/ranking/__init__.py,sha256=AY806x-2BtltQdlR4wu23-keL9YUe3An92OJshS4t9Y,472
36
- nextrec/models/ranking/afm.py,sha256=r9m1nEnc0m5d4pMtOxRMqOaXaBNCEkjJBFB-5wSHeFA,4540
37
- nextrec/models/ranking/autoint.py,sha256=xKX-w7lkGHkTYgbAB4r-pqOfkOAUia7av4gvT38X6Lk,7772
38
- nextrec/models/ranking/dcn.py,sha256=30qvToJftZG7UCoS84Lf8GCqipjFmpZWMQgMWSx9cwQ,4897
39
- nextrec/models/ranking/dcn_v2.py,sha256=ivHwLRxi4VcNzh9DWQQ227Gw5dhyRZ5LezuqkAdD89o,3630
40
- nextrec/models/ranking/deepfm.py,sha256=oBifQnbwz2OhVG6XWX5k_PyOA-lbFhYdqDEm0XyuEds,4991
41
- nextrec/models/ranking/dien.py,sha256=mn_po2D1O3zdyvesQo0PXX6s2-TxhlVCxGtYX3jEq8g,12742
42
- nextrec/models/ranking/din.py,sha256=j5tkT5k91CbsMlMr5vJOySrcY2_rFGxmEgJJ0McW7-Q,7196
43
- nextrec/models/ranking/fibinet.py,sha256=X6CbQbritvq5jql_Tvs4bn_tRla2zpWPplftZv8k6f0,4853
44
- nextrec/models/ranking/fm.py,sha256=3Qx_Fgowegr6UPQtEeTmHtOrbWzkvqH94ZTjOqRLu-E,2961
45
- nextrec/models/ranking/masknet.py,sha256=IE8WZIl7gy282p66qSxaFaWXurPjPaqJh7hCNeOKCoQ,11506
46
- nextrec/models/ranking/pnn.py,sha256=5RxIKdxD0XcGq-b_QDdwGRwk6b_5BQjyMvCw3Ibv2Kk,4957
47
- nextrec/models/ranking/widedeep.py,sha256=6lZUDScOGnUJe3j4X0JPh1LSLTBERL54hZrQDysu_oU,5035
48
- nextrec/models/ranking/xdeepfm.py,sha256=inrJUfmvQAT-EubH9vY_inCirBggB18Kj-Pp8lHB2CA,5682
49
- nextrec/utils/__init__.py,sha256=A3mH6M-DmDBWQ1stIIaTsNzvUy_AKaUWtRmrzU5R3FE,429
50
- nextrec/utils/common.py,sha256=YTlJkFCvIH5ExiOvg5pNPdRLUQ-h60BX4xTliaXKDsE,1217
51
- nextrec/utils/embedding.py,sha256=yxYSdFx0cJITh3Gf-K4SdhwRtKGcI0jOsyBgZ0NLa_c,465
52
- nextrec/utils/initializer.py,sha256=ffYOs5QuIns_d_-5e40iNtg6s1ftgREJN-ueq_NbDQE,1647
53
- nextrec/utils/optimizer.py,sha256=EUjAGFPeyou_Cv-_2HRvjzut8y_qpAQudc8L2T0k8zw,2706
54
- nextrec-0.3.2.dist-info/METADATA,sha256=4RFzGjoOmLQUS1wIyJ6edrJgJNZkH9wcxOrQxSLln4w,16319
55
- nextrec-0.3.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
56
- nextrec-0.3.2.dist-info/licenses/LICENSE,sha256=2fQfVKeafywkni7MYHyClC6RGGC3laLTXCNBx-ubtp0,1064
57
- nextrec-0.3.2.dist-info/RECORD,,