idscrub 0.2.0__tar.gz → 0.2.1__tar.gz

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 (36) hide show
  1. {idscrub-0.2.0 → idscrub-0.2.1}/PKG-INFO +2 -1
  2. {idscrub-0.2.0 → idscrub-0.2.1}/idscrub/scrub.py +2 -5
  3. {idscrub-0.2.0 → idscrub-0.2.1}/idscrub.egg-info/PKG-INFO +2 -1
  4. {idscrub-0.2.0 → idscrub-0.2.1}/idscrub.egg-info/requires.txt +1 -0
  5. {idscrub-0.2.0 → idscrub-0.2.1}/notebooks/basic_usage.ipynb +32 -32
  6. {idscrub-0.2.0 → idscrub-0.2.1}/pyproject.toml +1 -0
  7. {idscrub-0.2.0 → idscrub-0.2.1}/uv.lock +36 -0
  8. {idscrub-0.2.0 → idscrub-0.2.1}/.github/pull_request_template.md +0 -0
  9. {idscrub-0.2.0 → idscrub-0.2.1}/.github/workflows/cd.yml +0 -0
  10. {idscrub-0.2.0 → idscrub-0.2.1}/.github/workflows/ci.yml +0 -0
  11. {idscrub-0.2.0 → idscrub-0.2.1}/.gitignore +0 -0
  12. {idscrub-0.2.0 → idscrub-0.2.1}/.pre-commit-config.yaml +0 -0
  13. {idscrub-0.2.0 → idscrub-0.2.1}/CODEOWNERS +0 -0
  14. {idscrub-0.2.0 → idscrub-0.2.1}/LICENSE +0 -0
  15. {idscrub-0.2.0 → idscrub-0.2.1}/Makefile +0 -0
  16. {idscrub-0.2.0 → idscrub-0.2.1}/README.md +0 -0
  17. {idscrub-0.2.0 → idscrub-0.2.1}/SECURITY.md +0 -0
  18. {idscrub-0.2.0 → idscrub-0.2.1}/SECURITY_CHECKLIST.md +0 -0
  19. {idscrub-0.2.0 → idscrub-0.2.1}/idscrub/__init__.py +0 -0
  20. {idscrub-0.2.0 → idscrub-0.2.1}/idscrub/locations.py +0 -0
  21. {idscrub-0.2.0 → idscrub-0.2.1}/idscrub.egg-info/SOURCES.txt +0 -0
  22. {idscrub-0.2.0 → idscrub-0.2.1}/idscrub.egg-info/dependency_links.txt +0 -0
  23. {idscrub-0.2.0 → idscrub-0.2.1}/idscrub.egg-info/top_level.txt +0 -0
  24. {idscrub-0.2.0 → idscrub-0.2.1}/setup.cfg +0 -0
  25. {idscrub-0.2.0 → idscrub-0.2.1}/test/conftest.py +0 -0
  26. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_all.py +0 -0
  27. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_chain.py +0 -0
  28. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_dataframe.py +0 -0
  29. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_huggingface.py +0 -0
  30. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_id.py +0 -0
  31. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_log.py +0 -0
  32. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_persidio.py +0 -0
  33. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_phonenumbers.py +0 -0
  34. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_regex.py +0 -0
  35. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_scrub.py +0 -0
  36. {idscrub-0.2.0 → idscrub-0.2.1}/test/test_spacy.py +0 -0
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: idscrub
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Author: Department for Business and Trade
5
5
  Requires-Python: >=3.12
6
6
  Description-Content-Type: text/markdown
7
7
  License-File: LICENSE
8
8
  Requires-Dist: ipykernel>=7.1.0
9
+ Requires-Dist: ipywidgets
9
10
  Requires-Dist: numpy>=2.3.4
10
11
  Requires-Dist: pandas>=2.3.3
11
12
  Requires-Dist: phonenumbers>=9.0.18
@@ -906,11 +906,8 @@ class IDScrub:
906
906
 
907
907
  """
908
908
 
909
- for i, scrub_method in enumerate(scrub_methods):
910
- if i == len(scrub_methods) - 1:
911
- self.call_scrub_method(scrub_method)
912
- else:
913
- self.call_scrub_method(scrub_method)
909
+ for scrub_method in scrub_methods:
910
+ self.call_scrub_method(scrub_method)
914
911
 
915
912
  return self.cleaned_texts
916
913
 
@@ -1,11 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: idscrub
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Author: Department for Business and Trade
5
5
  Requires-Python: >=3.12
6
6
  Description-Content-Type: text/markdown
7
7
  License-File: LICENSE
8
8
  Requires-Dist: ipykernel>=7.1.0
9
+ Requires-Dist: ipywidgets
9
10
  Requires-Dist: numpy>=2.3.4
10
11
  Requires-Dist: pandas>=2.3.3
11
12
  Requires-Dist: phonenumbers>=9.0.18
@@ -1,4 +1,5 @@
1
1
  ipykernel>=7.1.0
2
+ ipywidgets
2
3
  numpy>=2.3.4
3
4
  pandas>=2.3.3
4
5
  phonenumbers>=9.0.18
@@ -9,7 +9,7 @@
9
9
  },
10
10
  {
11
11
  "cell_type": "code",
12
- "execution_count": 12,
12
+ "execution_count": 1,
13
13
  "metadata": {},
14
14
  "outputs": [
15
15
  {
@@ -18,7 +18,7 @@
18
18
  "text": [
19
19
  "INFO: Texts loaded.\n",
20
20
  "INFO: Scrubbing names using SpaCy model `en_core_web_trf`...\n",
21
- "100%|██████████| 2/2 [00:00<00:00, 44.29it/s]\n",
21
+ "100%|██████████| 2/2 [00:00<00:00, 28.72it/s]\n",
22
22
  "INFO: 3 spacy person scrubbed.\n",
23
23
  "INFO: Scrubbing phone numbers using regex...\n",
24
24
  "INFO: 1 uk phone numbers scrubbed.\n",
@@ -51,7 +51,7 @@
51
51
  },
52
52
  {
53
53
  "cell_type": "code",
54
- "execution_count": 13,
54
+ "execution_count": 2,
55
55
  "metadata": {},
56
56
  "outputs": [
57
57
  {
@@ -110,7 +110,7 @@
110
110
  "1 [+441111111111] [AA11 1AA] "
111
111
  ]
112
112
  },
113
- "execution_count": 13,
113
+ "execution_count": 2,
114
114
  "metadata": {},
115
115
  "output_type": "execute_result"
116
116
  }
@@ -128,7 +128,7 @@
128
128
  },
129
129
  {
130
130
  "cell_type": "code",
131
- "execution_count": 14,
131
+ "execution_count": 3,
132
132
  "metadata": {},
133
133
  "outputs": [
134
134
  {
@@ -137,11 +137,11 @@
137
137
  "text": [
138
138
  "INFO: Texts loaded.\n",
139
139
  "INFO: Scrubbing using Presidio...\n",
140
- "100%|██████████| 2/2 [00:00<00:00, 25.19it/s]\n",
140
+ "100%|██████████| 2/2 [00:00<00:00, 14.92it/s]\n",
141
141
  "INFO: 3 presidio person scrubbed.\n",
142
142
  "INFO: 1 presidio location scrubbed.\n",
143
143
  "INFO: Scrubbing names using SpaCy model `en_core_web_trf`...\n",
144
- "100%|██████████| 2/2 [00:00<00:00, 48.66it/s]\n",
144
+ "100%|██████████| 2/2 [00:00<00:00, 49.69it/s]\n",
145
145
  "INFO: 0 spacy person scrubbed.\n",
146
146
  "INFO: Scrubbing GB phone numbers using Google's `phonenumbers`...\n",
147
147
  "INFO: 0 gb phone numbers scrubbed.\n",
@@ -184,7 +184,7 @@
184
184
  },
185
185
  {
186
186
  "cell_type": "code",
187
- "execution_count": 15,
187
+ "execution_count": 4,
188
188
  "metadata": {},
189
189
  "outputs": [
190
190
  {
@@ -246,7 +246,7 @@
246
246
  "1 [Lapland] [+441111111111] [AA11 1AA] "
247
247
  ]
248
248
  },
249
- "execution_count": 15,
249
+ "execution_count": 4,
250
250
  "metadata": {},
251
251
  "output_type": "execute_result"
252
252
  }
@@ -264,7 +264,7 @@
264
264
  },
265
265
  {
266
266
  "cell_type": "code",
267
- "execution_count": 16,
267
+ "execution_count": 5,
268
268
  "metadata": {},
269
269
  "outputs": [
270
270
  {
@@ -273,7 +273,7 @@
273
273
  "text": [
274
274
  "INFO: Texts loaded.\n",
275
275
  "INFO: Scrubbing using Presidio...\n",
276
- "100%|██████████| 2/2 [00:00<00:00, 23.03it/s]\n",
276
+ "100%|██████████| 2/2 [00:00<00:00, 29.00it/s]\n",
277
277
  "INFO: 3 presidio person scrubbed.\n",
278
278
  "INFO: Scrubbing GB phone numbers using Google's `phonenumbers`...\n",
279
279
  "INFO: 0 gb phone numbers scrubbed.\n",
@@ -324,7 +324,7 @@
324
324
  },
325
325
  {
326
326
  "cell_type": "code",
327
- "execution_count": 17,
327
+ "execution_count": 6,
328
328
  "metadata": {},
329
329
  "outputs": [
330
330
  {
@@ -389,7 +389,7 @@
389
389
  "1 [ACHILLES] [+441111111111] [AA11 1AA] "
390
390
  ]
391
391
  },
392
- "execution_count": 17,
392
+ "execution_count": 6,
393
393
  "metadata": {},
394
394
  "output_type": "execute_result"
395
395
  }
@@ -408,7 +408,7 @@
408
408
  },
409
409
  {
410
410
  "cell_type": "code",
411
- "execution_count": 18,
411
+ "execution_count": 7,
412
412
  "metadata": {},
413
413
  "outputs": [
414
414
  {
@@ -417,7 +417,7 @@
417
417
  "text": [
418
418
  "INFO: Texts loaded.\n",
419
419
  "INFO: Scrubbing using Presidio...\n",
420
- "100%|██████████| 2/2 [00:00<00:00, 23.38it/s]\n",
420
+ "100%|██████████| 2/2 [00:00<00:00, 24.48it/s]\n",
421
421
  "INFO: 3 presidio person scrubbed.\n",
422
422
  "INFO: 1 presidio iban code scrubbed.\n"
423
423
  ]
@@ -443,7 +443,7 @@
443
443
  },
444
444
  {
445
445
  "cell_type": "code",
446
- "execution_count": 19,
446
+ "execution_count": 8,
447
447
  "metadata": {},
448
448
  "outputs": [
449
449
  {
@@ -499,7 +499,7 @@
499
499
  "1 [GB91BKEN10000041610008] "
500
500
  ]
501
501
  },
502
- "execution_count": 19,
502
+ "execution_count": 8,
503
503
  "metadata": {},
504
504
  "output_type": "execute_result"
505
505
  }
@@ -517,7 +517,7 @@
517
517
  },
518
518
  {
519
519
  "cell_type": "code",
520
- "execution_count": 20,
520
+ "execution_count": 9,
521
521
  "metadata": {},
522
522
  "outputs": [
523
523
  {
@@ -623,7 +623,7 @@
623
623
  "4 They did not expected a reply from otis.reddin... "
624
624
  ]
625
625
  },
626
- "execution_count": 20,
626
+ "execution_count": 9,
627
627
  "metadata": {},
628
628
  "output_type": "execute_result"
629
629
  }
@@ -669,7 +669,7 @@
669
669
  },
670
670
  {
671
671
  "cell_type": "code",
672
- "execution_count": 21,
672
+ "execution_count": 10,
673
673
  "metadata": {},
674
674
  "outputs": [
675
675
  {
@@ -678,12 +678,12 @@
678
678
  "text": [
679
679
  " 0%| | 0/3 [00:00<?, ?it/s]INFO: Texts loaded.\n",
680
680
  "INFO: Scrubbing using Presidio...\n",
681
- "100%|██████████| 5/5 [00:00<00:00, 18.99it/s]\n",
681
+ "100%|██████████| 5/5 [00:00<00:00, 31.94it/s]\n",
682
682
  "INFO: 4 presidio person scrubbed.\n",
683
683
  "INFO: 4 presidio person scrubbed.\n",
684
684
  "INFO: 4 presidio person scrubbed.\n",
685
685
  "INFO: Scrubbing names using SpaCy model `en_core_web_trf`...\n",
686
- "100%|██████████| 5/5 [00:00<00:00, 67.00it/s]\n",
686
+ "100%|██████████| 5/5 [00:00<00:00, 71.88it/s]\n",
687
687
  "INFO: 0 spacy person scrubbed.\n",
688
688
  "INFO: Scrubbing GB phone numbers using Google's `phonenumbers`...\n",
689
689
  "INFO: 0 gb phone numbers scrubbed.\n",
@@ -699,13 +699,13 @@
699
699
  "INFO: 0 uk postcodes scrubbed.\n",
700
700
  "INFO: Scrubbing titles using regex...\n",
701
701
  "INFO: 2 titles scrubbed.\n",
702
- " 33%|███▎ | 1/3 [00:03<00:06, 3.24s/it]INFO: Texts loaded.\n",
702
+ " 33%|███▎ | 1/3 [00:02<00:05, 2.55s/it]INFO: Texts loaded.\n",
703
703
  "INFO: Scrubbing using Presidio...\n",
704
- "100%|██████████| 5/5 [00:00<00:00, 21.83it/s]\n",
704
+ "100%|██████████| 5/5 [00:00<00:00, 24.67it/s]\n",
705
705
  "INFO: 2 presidio person scrubbed.\n",
706
706
  "INFO: 2 presidio person scrubbed.\n",
707
707
  "INFO: Scrubbing names using SpaCy model `en_core_web_trf`...\n",
708
- "100%|██████████| 5/5 [00:00<00:00, 84.69it/s]\n",
708
+ "100%|██████████| 5/5 [00:00<00:00, 86.96it/s]\n",
709
709
  "INFO: 0 spacy person scrubbed.\n",
710
710
  "INFO: Scrubbing GB phone numbers using Google's `phonenumbers`...\n",
711
711
  "INFO: 0 gb phone numbers scrubbed.\n",
@@ -721,15 +721,15 @@
721
721
  "INFO: 0 uk postcodes scrubbed.\n",
722
722
  "INFO: Scrubbing titles using regex...\n",
723
723
  "INFO: 0 titles scrubbed.\n",
724
- " 67%|██████▋ | 2/3 [00:06<00:03, 3.24s/it]INFO: Texts loaded.\n",
724
+ " 67%|██████▋ | 2/3 [00:04<00:02, 2.39s/it]INFO: Texts loaded.\n",
725
725
  "INFO: Scrubbing using Presidio...\n",
726
- "100%|██████████| 5/5 [00:00<00:00, 29.32it/s]\n",
726
+ "100%|██████████| 5/5 [00:00<00:00, 15.41it/s]\n",
727
727
  "INFO: 5 presidio url scrubbed.\n",
728
728
  "INFO: 2 presidio person scrubbed.\n",
729
729
  "INFO: 3 presidio email address scrubbed.\n",
730
730
  "INFO: 3 presidio email address scrubbed.\n",
731
731
  "INFO: Scrubbing names using SpaCy model `en_core_web_trf`...\n",
732
- "100%|██████████| 5/5 [00:00<00:00, 66.37it/s]\n",
732
+ "100%|██████████| 5/5 [00:00<00:00, 64.25it/s]\n",
733
733
  "INFO: 0 spacy person scrubbed.\n",
734
734
  "INFO: Scrubbing GB phone numbers using Google's `phonenumbers`...\n",
735
735
  "INFO: 0 gb phone numbers scrubbed.\n",
@@ -745,7 +745,7 @@
745
745
  "INFO: 4 uk postcodes scrubbed.\n",
746
746
  "INFO: Scrubbing titles using regex...\n",
747
747
  "INFO: 0 titles scrubbed.\n",
748
- "100%|██████████| 3/3 [00:08<00:00, 2.94s/it]\n"
748
+ "100%|██████████| 3/3 [00:07<00:00, 2.43s/it]\n"
749
749
  ]
750
750
  },
751
751
  {
@@ -851,7 +851,7 @@
851
851
  "4 They did not expected a reply from [EMAIL_ADDR... "
852
852
  ]
853
853
  },
854
- "execution_count": 21,
854
+ "execution_count": 10,
855
855
  "metadata": {},
856
856
  "output_type": "execute_result"
857
857
  }
@@ -866,7 +866,7 @@
866
866
  },
867
867
  {
868
868
  "cell_type": "code",
869
- "execution_count": 22,
869
+ "execution_count": 11,
870
870
  "metadata": {},
871
871
  "outputs": [
872
872
  {
@@ -1050,7 +1050,7 @@
1050
1050
  "8 [EH8 8DX] "
1051
1051
  ]
1052
1052
  },
1053
- "execution_count": 22,
1053
+ "execution_count": 11,
1054
1054
  "metadata": {},
1055
1055
  "output_type": "execute_result"
1056
1056
  }
@@ -7,6 +7,7 @@ readme = "README.md"
7
7
  requires-python = ">=3.12"
8
8
  dependencies = [
9
9
  "ipykernel>=7.1.0",
10
+ "ipywidgets",
10
11
  "numpy>=2.3.4",
11
12
  "pandas>=2.3.3",
12
13
  "phonenumbers>=9.0.18",
@@ -561,6 +561,7 @@ name = "idscrub"
561
561
  source = { editable = "." }
562
562
  dependencies = [
563
563
  { name = "ipykernel" },
564
+ { name = "ipywidgets" },
564
565
  { name = "numpy" },
565
566
  { name = "pandas" },
566
567
  { name = "phonenumbers" },
@@ -588,6 +589,7 @@ dev = [
588
589
  requires-dist = [
589
590
  { name = "en-core-web-trf", marker = "extra == 'trf'", url = "https://github.com/explosion/spacy-models/releases/download/en_core_web_trf-3.8.0/en_core_web_trf-3.8.0-py3-none-any.whl" },
590
591
  { name = "ipykernel", specifier = ">=7.1.0" },
592
+ { name = "ipywidgets" },
591
593
  { name = "numpy", specifier = ">=2.3.4" },
592
594
  { name = "pandas", specifier = ">=2.3.3" },
593
595
  { name = "phonenumbers", specifier = ">=9.0.18" },
@@ -673,6 +675,22 @@ wheels = [
673
675
  { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" },
674
676
  ]
675
677
 
678
+ [[package]]
679
+ name = "ipywidgets"
680
+ version = "8.1.8"
681
+ source = { registry = "https://pypi.org/simple" }
682
+ dependencies = [
683
+ { name = "comm" },
684
+ { name = "ipython" },
685
+ { name = "jupyterlab-widgets" },
686
+ { name = "traitlets" },
687
+ { name = "widgetsnbextension" },
688
+ ]
689
+ sdist = { url = "https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz", hash = "sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668", size = 116739, upload-time = "2025-11-01T21:18:12.393Z" }
690
+ wheels = [
691
+ { url = "https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl", hash = "sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e", size = 139808, upload-time = "2025-11-01T21:18:10.956Z" },
692
+ ]
693
+
676
694
  [[package]]
677
695
  name = "jedi"
678
696
  version = "0.19.2"
@@ -726,6 +744,15 @@ wheels = [
726
744
  { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" },
727
745
  ]
728
746
 
747
+ [[package]]
748
+ name = "jupyterlab-widgets"
749
+ version = "3.0.16"
750
+ source = { registry = "https://pypi.org/simple" }
751
+ sdist = { url = "https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz", hash = "sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0", size = 897423, upload-time = "2025-11-01T21:11:29.724Z" }
752
+ wheels = [
753
+ { url = "https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl", hash = "sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8", size = 914926, upload-time = "2025-11-01T21:11:28.008Z" },
754
+ ]
755
+
729
756
  [[package]]
730
757
  name = "markupsafe"
731
758
  version = "3.0.3"
@@ -2205,6 +2232,15 @@ wheels = [
2205
2232
  { url = "https://files.pythonhosted.org/packages/24/6d/ea548150e8bd3727dbe9e39bec5b25e8cd40d984af8bb0a662cdef572ea2/weasel-0.4.2-py3-none-any.whl", hash = "sha256:47372460ff42ee89f59d8b6bc8ea07994600f7e88822a342b9771c72961f965e", size = 50752, upload-time = "2025-11-06T00:37:40.882Z" },
2206
2233
  ]
2207
2234
 
2235
+ [[package]]
2236
+ name = "widgetsnbextension"
2237
+ version = "4.0.15"
2238
+ source = { registry = "https://pypi.org/simple" }
2239
+ sdist = { url = "https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz", hash = "sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9", size = 1097402, upload-time = "2025-11-01T21:15:55.178Z" }
2240
+ wheels = [
2241
+ { url = "https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl", hash = "sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366", size = 2196503, upload-time = "2025-11-01T21:15:53.565Z" },
2242
+ ]
2243
+
2208
2244
  [[package]]
2209
2245
  name = "wrapt"
2210
2246
  version = "2.0.1"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes