Kittinun Yenyueak commited on
Commit
70c2d54
·
1 Parent(s): 60cc3d3

first commit

Browse files
.DS_Store ADDED
Binary file (8.2 kB). View file
 
Dockerfile CHANGED
@@ -1,20 +1,31 @@
1
- FROM python:3.13.5-slim
2
 
3
  WORKDIR /app
4
 
 
5
  RUN apt-get update && apt-get install -y \
6
  build-essential \
7
  curl \
8
  git \
 
9
  && rm -rf /var/lib/apt/lists/*
10
 
11
- COPY requirements.txt ./
12
- COPY src/ ./src/
 
 
 
 
13
 
14
- RUN pip3 install -r requirements.txt
 
 
 
 
15
 
16
  EXPOSE 8501
17
 
18
  HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
19
 
20
- ENTRYPOINT ["streamlit", "run", "src/streamlit_app.py", "--server.port=8501", "--server.address=0.0.0.0"]
 
 
1
+ FROM python:3.11.13
2
 
3
  WORKDIR /app
4
 
5
+ # System deps (add ffmpeg for moviepy)
6
  RUN apt-get update && apt-get install -y \
7
  build-essential \
8
  curl \
9
  git \
10
+ ffmpeg \
11
  && rm -rf /var/lib/apt/lists/*
12
 
13
+ # Install PDM and use pyproject/pdm.lock for deps
14
+ RUN pip3 install --no-cache-dir -U pip setuptools wheel pdm
15
+
16
+ # Copy only dependency files first for better layer caching
17
+ COPY pyproject.toml ./
18
+ COPY pdm.lock ./
19
 
20
+ # Install project dependencies (prod only)
21
+ RUN pdm install --prod --frozen
22
+
23
+ # Copy application source
24
+ COPY src/ ./src/
25
 
26
  EXPOSE 8501
27
 
28
  HEALTHCHECK CMD curl --fail http://localhost:8501/_stcore/health
29
 
30
+ # Run via PDM so PEP 582 (__pypackages__) is on sys.path
31
+ ENTRYPOINT ["pdm", "run", "streamlit", "run", "src/app.py", "--server.port=8501", "--server.address=0.0.0.0"]
annotated_image.png ADDED

Git LFS Details

  • SHA256: 8b98d6a114e6b758698757a903c43eafdac1e5d79148c2dff8b4c5371016b251
  • Pointer size: 132 Bytes
  • Size of remote file: 2.36 MB
models/modelYOLOv8n_datasetDIOR_epochs36_batch16_reduced_classes.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:6008f5763536d0717ffd7ad570c6e498e343bcbb9941a28253de3ff2d4737c6f
3
+ size 36692962
models/modelYOLOv8n_datasetDIOR_epochs50_batch16.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9597e22b648e83f4ad5972819ae596f8b212642dd9efbfc893c6016b725826f1
3
+ size 6285939
models/modelYOLOv8n_datasetDOTAv2_epochs5_batch1.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:97961c4ceb4f3b699a047c8acdce3ccce6c14d027d6247a8c5f585ece1d6de8e
3
+ size 36639398
pdm.lock ADDED
@@ -0,0 +1,1311 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file is @generated by PDM.
2
+ # It is not intended for manual editing.
3
+
4
+ [metadata]
5
+ groups = ["default"]
6
+ strategy = ["inherit_metadata"]
7
+ lock_version = "4.5.0"
8
+ content_hash = "sha256:cc7de9193244e722206a0121273ce6b74ce665eca276df645eab08af60d057d7"
9
+
10
+ [[metadata.targets]]
11
+ requires_python = "==3.11.*"
12
+
13
+ [[package]]
14
+ name = "altair"
15
+ version = "5.5.0"
16
+ requires_python = ">=3.9"
17
+ summary = "Vega-Altair: A declarative statistical visualization library for Python."
18
+ groups = ["default"]
19
+ dependencies = [
20
+ "jinja2",
21
+ "jsonschema>=3.0",
22
+ "narwhals>=1.14.2",
23
+ "packaging",
24
+ "typing-extensions>=4.10.0; python_version < \"3.14\"",
25
+ ]
26
+ files = [
27
+ {file = "altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c"},
28
+ {file = "altair-5.5.0.tar.gz", hash = "sha256:d960ebe6178c56de3855a68c47b516be38640b73fb3b5111c2a9ca90546dd73d"},
29
+ ]
30
+
31
+ [[package]]
32
+ name = "attrs"
33
+ version = "25.3.0"
34
+ requires_python = ">=3.8"
35
+ summary = "Classes Without Boilerplate"
36
+ groups = ["default"]
37
+ files = [
38
+ {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"},
39
+ {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"},
40
+ ]
41
+
42
+ [[package]]
43
+ name = "blinker"
44
+ version = "1.9.0"
45
+ requires_python = ">=3.9"
46
+ summary = "Fast, simple object-to-object and broadcast signaling"
47
+ groups = ["default"]
48
+ files = [
49
+ {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"},
50
+ {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"},
51
+ ]
52
+
53
+ [[package]]
54
+ name = "cachetools"
55
+ version = "6.2.0"
56
+ requires_python = ">=3.9"
57
+ summary = "Extensible memoizing collections and decorators"
58
+ groups = ["default"]
59
+ files = [
60
+ {file = "cachetools-6.2.0-py3-none-any.whl", hash = "sha256:1c76a8960c0041fcc21097e357f882197c79da0dbff766e7317890a65d7d8ba6"},
61
+ {file = "cachetools-6.2.0.tar.gz", hash = "sha256:38b328c0889450f05f5e120f56ab68c8abaf424e1275522b138ffc93253f7e32"},
62
+ ]
63
+
64
+ [[package]]
65
+ name = "certifi"
66
+ version = "2025.8.3"
67
+ requires_python = ">=3.7"
68
+ summary = "Python package for providing Mozilla's CA Bundle."
69
+ groups = ["default"]
70
+ files = [
71
+ {file = "certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5"},
72
+ {file = "certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407"},
73
+ ]
74
+
75
+ [[package]]
76
+ name = "charset-normalizer"
77
+ version = "3.4.3"
78
+ requires_python = ">=3.7"
79
+ summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
80
+ groups = ["default"]
81
+ files = [
82
+ {file = "charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b"},
83
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64"},
84
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91"},
85
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f"},
86
+ {file = "charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07"},
87
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30"},
88
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14"},
89
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c"},
90
+ {file = "charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae"},
91
+ {file = "charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849"},
92
+ {file = "charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c"},
93
+ {file = "charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a"},
94
+ {file = "charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14"},
95
+ ]
96
+
97
+ [[package]]
98
+ name = "click"
99
+ version = "8.2.1"
100
+ requires_python = ">=3.10"
101
+ summary = "Composable command line interface toolkit"
102
+ groups = ["default"]
103
+ dependencies = [
104
+ "colorama; platform_system == \"Windows\"",
105
+ ]
106
+ files = [
107
+ {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"},
108
+ {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"},
109
+ ]
110
+
111
+ [[package]]
112
+ name = "colorama"
113
+ version = "0.4.6"
114
+ requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
115
+ summary = "Cross-platform colored terminal text."
116
+ groups = ["default"]
117
+ marker = "platform_system == \"Windows\""
118
+ files = [
119
+ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
120
+ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
121
+ ]
122
+
123
+ [[package]]
124
+ name = "contourpy"
125
+ version = "1.3.3"
126
+ requires_python = ">=3.11"
127
+ summary = "Python library for calculating contours of 2D quadrilateral grids"
128
+ groups = ["default"]
129
+ dependencies = [
130
+ "numpy>=1.25",
131
+ ]
132
+ files = [
133
+ {file = "contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1"},
134
+ {file = "contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381"},
135
+ {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7"},
136
+ {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1"},
137
+ {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a"},
138
+ {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db"},
139
+ {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620"},
140
+ {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f"},
141
+ {file = "contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff"},
142
+ {file = "contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42"},
143
+ {file = "contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470"},
144
+ {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497"},
145
+ {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8"},
146
+ {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e"},
147
+ {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989"},
148
+ {file = "contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77"},
149
+ {file = "contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880"},
150
+ ]
151
+
152
+ [[package]]
153
+ name = "cycler"
154
+ version = "0.12.1"
155
+ requires_python = ">=3.8"
156
+ summary = "Composable style cycles"
157
+ groups = ["default"]
158
+ files = [
159
+ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"},
160
+ {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"},
161
+ ]
162
+
163
+ [[package]]
164
+ name = "decorator"
165
+ version = "5.2.1"
166
+ requires_python = ">=3.8"
167
+ summary = "Decorators for Humans"
168
+ groups = ["default"]
169
+ files = [
170
+ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"},
171
+ {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"},
172
+ ]
173
+
174
+ [[package]]
175
+ name = "filelock"
176
+ version = "3.19.1"
177
+ requires_python = ">=3.9"
178
+ summary = "A platform independent file lock."
179
+ groups = ["default"]
180
+ files = [
181
+ {file = "filelock-3.19.1-py3-none-any.whl", hash = "sha256:d38e30481def20772f5baf097c122c3babc4fcdb7e14e57049eb9d88c6dc017d"},
182
+ {file = "filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58"},
183
+ ]
184
+
185
+ [[package]]
186
+ name = "fonttools"
187
+ version = "4.59.2"
188
+ requires_python = ">=3.9"
189
+ summary = "Tools to manipulate font files"
190
+ groups = ["default"]
191
+ files = [
192
+ {file = "fonttools-4.59.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:511946e8d7ea5c0d6c7a53c4cb3ee48eda9ab9797cd9bf5d95829a398400354f"},
193
+ {file = "fonttools-4.59.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5e2682cf7be766d84f462ba8828d01e00c8751a8e8e7ce12d7784ccb69a30d"},
194
+ {file = "fonttools-4.59.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5729e12a982dba3eeae650de48b06f3b9ddb51e9aee2fcaf195b7d09a96250e2"},
195
+ {file = "fonttools-4.59.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c52694eae5d652361d59ecdb5a2246bff7cff13b6367a12da8499e9df56d148d"},
196
+ {file = "fonttools-4.59.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f1bbc23ba1312bd8959896f46f667753b90216852d2a8cfa2d07e0cb234144"},
197
+ {file = "fonttools-4.59.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1a1bfe5378962825dabe741720885e8b9ae9745ec7ecc4a5ec1f1ce59a6062bf"},
198
+ {file = "fonttools-4.59.2-cp311-cp311-win32.whl", hash = "sha256:e937790f3c2c18a1cbc7da101550a84319eb48023a715914477d2e7faeaba570"},
199
+ {file = "fonttools-4.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:9836394e2f4ce5f9c0a7690ee93bd90aa1adc6b054f1a57b562c5d242c903104"},
200
+ {file = "fonttools-4.59.2-py3-none-any.whl", hash = "sha256:8bd0f759020e87bb5d323e6283914d9bf4ae35a7307dafb2cbd1e379e720ad37"},
201
+ {file = "fonttools-4.59.2.tar.gz", hash = "sha256:e72c0749b06113f50bcb80332364c6be83a9582d6e3db3fe0b280f996dc2ef22"},
202
+ ]
203
+
204
+ [[package]]
205
+ name = "fsspec"
206
+ version = "2025.9.0"
207
+ requires_python = ">=3.9"
208
+ summary = "File-system specification"
209
+ groups = ["default"]
210
+ files = [
211
+ {file = "fsspec-2025.9.0-py3-none-any.whl", hash = "sha256:530dc2a2af60a414a832059574df4a6e10cce927f6f4a78209390fe38955cfb7"},
212
+ {file = "fsspec-2025.9.0.tar.gz", hash = "sha256:19fd429483d25d28b65ec68f9f4adc16c17ea2c7c7bf54ec61360d478fb19c19"},
213
+ ]
214
+
215
+ [[package]]
216
+ name = "gitdb"
217
+ version = "4.0.12"
218
+ requires_python = ">=3.7"
219
+ summary = "Git Object Database"
220
+ groups = ["default"]
221
+ dependencies = [
222
+ "smmap<6,>=3.0.1",
223
+ ]
224
+ files = [
225
+ {file = "gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf"},
226
+ {file = "gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571"},
227
+ ]
228
+
229
+ [[package]]
230
+ name = "gitpython"
231
+ version = "3.1.45"
232
+ requires_python = ">=3.7"
233
+ summary = "GitPython is a Python library used to interact with Git repositories"
234
+ groups = ["default"]
235
+ dependencies = [
236
+ "gitdb<5,>=4.0.1",
237
+ "typing-extensions>=3.10.0.2; python_version < \"3.10\"",
238
+ ]
239
+ files = [
240
+ {file = "gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77"},
241
+ {file = "gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c"},
242
+ ]
243
+
244
+ [[package]]
245
+ name = "idna"
246
+ version = "3.10"
247
+ requires_python = ">=3.6"
248
+ summary = "Internationalized Domain Names in Applications (IDNA)"
249
+ groups = ["default"]
250
+ files = [
251
+ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
252
+ {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
253
+ ]
254
+
255
+ [[package]]
256
+ name = "imageio"
257
+ version = "2.37.0"
258
+ requires_python = ">=3.9"
259
+ summary = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats."
260
+ groups = ["default"]
261
+ dependencies = [
262
+ "numpy",
263
+ "pillow>=8.3.2",
264
+ ]
265
+ files = [
266
+ {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"},
267
+ {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"},
268
+ ]
269
+
270
+ [[package]]
271
+ name = "imageio-ffmpeg"
272
+ version = "0.6.0"
273
+ requires_python = ">=3.9"
274
+ summary = "FFMPEG wrapper for Python"
275
+ groups = ["default"]
276
+ files = [
277
+ {file = "imageio_ffmpeg-0.6.0-py3-none-macosx_10_9_intel.macosx_10_9_x86_64.whl", hash = "sha256:9d2baaf867088508d4a3458e61eeb30e945c4ad8016025545f66c4b5aaef0a61"},
278
+ {file = "imageio_ffmpeg-0.6.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b1ae3173414b5fc5f538a726c4e48ea97edc0d2cdc11f103afee655c463fa742"},
279
+ {file = "imageio_ffmpeg-0.6.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:1d47bebd83d2c5fc770720d211855f208af8a596c82d17730aa51e815cdee6dc"},
280
+ {file = "imageio_ffmpeg-0.6.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:c7e46fcec401dd990405049d2e2f475e2b397779df2519b544b8aab515195282"},
281
+ {file = "imageio_ffmpeg-0.6.0-py3-none-win32.whl", hash = "sha256:196faa79366b4a82f95c0f4053191d2013f4714a715780f0ad2a68ff37483cc2"},
282
+ {file = "imageio_ffmpeg-0.6.0-py3-none-win_amd64.whl", hash = "sha256:02fa47c83703c37df6bfe4896aab339013f62bf02c5ebf2dce6da56af04ffc0a"},
283
+ {file = "imageio_ffmpeg-0.6.0.tar.gz", hash = "sha256:e2556bed8e005564a9f925bb7afa4002d82770d6b08825078b7697ab88ba1755"},
284
+ ]
285
+
286
+ [[package]]
287
+ name = "jinja2"
288
+ version = "3.1.6"
289
+ requires_python = ">=3.7"
290
+ summary = "A very fast and expressive template engine."
291
+ groups = ["default"]
292
+ dependencies = [
293
+ "MarkupSafe>=2.0",
294
+ ]
295
+ files = [
296
+ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"},
297
+ {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"},
298
+ ]
299
+
300
+ [[package]]
301
+ name = "jsonschema"
302
+ version = "4.25.1"
303
+ requires_python = ">=3.9"
304
+ summary = "An implementation of JSON Schema validation for Python"
305
+ groups = ["default"]
306
+ dependencies = [
307
+ "attrs>=22.2.0",
308
+ "jsonschema-specifications>=2023.03.6",
309
+ "referencing>=0.28.4",
310
+ "rpds-py>=0.7.1",
311
+ ]
312
+ files = [
313
+ {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"},
314
+ {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"},
315
+ ]
316
+
317
+ [[package]]
318
+ name = "jsonschema-specifications"
319
+ version = "2025.9.1"
320
+ requires_python = ">=3.9"
321
+ summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry"
322
+ groups = ["default"]
323
+ dependencies = [
324
+ "referencing>=0.31.0",
325
+ ]
326
+ files = [
327
+ {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"},
328
+ {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"},
329
+ ]
330
+
331
+ [[package]]
332
+ name = "kiwisolver"
333
+ version = "1.4.9"
334
+ requires_python = ">=3.10"
335
+ summary = "A fast implementation of the Cassowary constraint solver"
336
+ groups = ["default"]
337
+ files = [
338
+ {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16"},
339
+ {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089"},
340
+ {file = "kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543"},
341
+ {file = "kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61"},
342
+ {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1"},
343
+ {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872"},
344
+ {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26"},
345
+ {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028"},
346
+ {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771"},
347
+ {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a"},
348
+ {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464"},
349
+ {file = "kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2"},
350
+ {file = "kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7"},
351
+ {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5"},
352
+ {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa"},
353
+ {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2"},
354
+ {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f"},
355
+ {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1"},
356
+ {file = "kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d"},
357
+ ]
358
+
359
+ [[package]]
360
+ name = "markupsafe"
361
+ version = "3.0.2"
362
+ requires_python = ">=3.9"
363
+ summary = "Safely add untrusted strings to HTML/XML markup."
364
+ groups = ["default"]
365
+ files = [
366
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
367
+ {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
368
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
369
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
370
+ {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
371
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
372
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
373
+ {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
374
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
375
+ {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
376
+ {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
377
+ ]
378
+
379
+ [[package]]
380
+ name = "matplotlib"
381
+ version = "3.10.6"
382
+ requires_python = ">=3.10"
383
+ summary = "Python plotting package"
384
+ groups = ["default"]
385
+ dependencies = [
386
+ "contourpy>=1.0.1",
387
+ "cycler>=0.10",
388
+ "fonttools>=4.22.0",
389
+ "kiwisolver>=1.3.1",
390
+ "numpy>=1.23",
391
+ "packaging>=20.0",
392
+ "pillow>=8",
393
+ "pyparsing>=2.3.1",
394
+ "python-dateutil>=2.7",
395
+ ]
396
+ files = [
397
+ {file = "matplotlib-3.10.6-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:905b60d1cb0ee604ce65b297b61cf8be9f4e6cfecf95a3fe1c388b5266bc8f4f"},
398
+ {file = "matplotlib-3.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7bac38d816637343e53d7185d0c66677ff30ffb131044a81898b5792c956ba76"},
399
+ {file = "matplotlib-3.10.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:942a8de2b5bfff1de31d95722f702e2966b8a7e31f4e68f7cd963c7cd8861cf6"},
400
+ {file = "matplotlib-3.10.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3276c85370bc0dfca051ec65c5817d1e0f8f5ce1b7787528ec8ed2d524bbc2f"},
401
+ {file = "matplotlib-3.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9df5851b219225731f564e4b9e7f2ac1e13c9e6481f941b5631a0f8e2d9387ce"},
402
+ {file = "matplotlib-3.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:abb5d9478625dd9c9eb51a06d39aae71eda749ae9b3138afb23eb38824026c7e"},
403
+ {file = "matplotlib-3.10.6-cp311-cp311-win_arm64.whl", hash = "sha256:886f989ccfae63659183173bb3fced7fd65e9eb793c3cc21c273add368536951"},
404
+ {file = "matplotlib-3.10.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f2d684c3204fa62421bbf770ddfebc6b50130f9cad65531eeba19236d73bb488"},
405
+ {file = "matplotlib-3.10.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:6f4a69196e663a41d12a728fab8751177215357906436804217d6d9cf0d4d6cf"},
406
+ {file = "matplotlib-3.10.6-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d6ca6ef03dfd269f4ead566ec6f3fb9becf8dab146fb999022ed85ee9f6b3eb"},
407
+ {file = "matplotlib-3.10.6.tar.gz", hash = "sha256:ec01b645840dd1996df21ee37f208cd8ba57644779fa20464010638013d3203c"},
408
+ ]
409
+
410
+ [[package]]
411
+ name = "moviepy"
412
+ version = "2.2.1"
413
+ summary = "Video editing with Python"
414
+ groups = ["default"]
415
+ dependencies = [
416
+ "decorator<6.0,>=4.0.2",
417
+ "imageio-ffmpeg>=0.2.0",
418
+ "imageio<3.0,>=2.5",
419
+ "numpy>=1.25.0",
420
+ "pillow<12.0,>=9.2.0",
421
+ "proglog<=1.0.0",
422
+ "python-dotenv>=0.10",
423
+ ]
424
+ files = [
425
+ {file = "moviepy-2.2.1-py3-none-any.whl", hash = "sha256:6b56803fec2ac54b557404126ac1160e65448e03798fa282bd23e8fab3795060"},
426
+ {file = "moviepy-2.2.1.tar.gz", hash = "sha256:c80cb56815ece94e5e3e2d361aa40070eeb30a09d23a24c4e684d03e16deacb1"},
427
+ ]
428
+
429
+ [[package]]
430
+ name = "mpmath"
431
+ version = "1.3.0"
432
+ summary = "Python library for arbitrary-precision floating-point arithmetic"
433
+ groups = ["default"]
434
+ files = [
435
+ {file = "mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c"},
436
+ {file = "mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f"},
437
+ ]
438
+
439
+ [[package]]
440
+ name = "narwhals"
441
+ version = "2.4.0"
442
+ requires_python = ">=3.9"
443
+ summary = "Extremely lightweight compatibility layer between dataframe libraries"
444
+ groups = ["default"]
445
+ files = [
446
+ {file = "narwhals-2.4.0-py3-none-any.whl", hash = "sha256:06d958b03e3e3725ae16feee6737b4970991bb52e8465ef75f388c574732ac59"},
447
+ {file = "narwhals-2.4.0.tar.gz", hash = "sha256:a71931f7fb3c8e082cbe18ef0740644d87d60eba841ddfa9ba9394de1d43062f"},
448
+ ]
449
+
450
+ [[package]]
451
+ name = "networkx"
452
+ version = "3.5"
453
+ requires_python = ">=3.11"
454
+ summary = "Python package for creating and manipulating graphs and networks"
455
+ groups = ["default"]
456
+ files = [
457
+ {file = "networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec"},
458
+ {file = "networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037"},
459
+ ]
460
+
461
+ [[package]]
462
+ name = "numpy"
463
+ version = "2.2.6"
464
+ requires_python = ">=3.10"
465
+ summary = "Fundamental package for array computing in Python"
466
+ groups = ["default"]
467
+ files = [
468
+ {file = "numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae"},
469
+ {file = "numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a"},
470
+ {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42"},
471
+ {file = "numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491"},
472
+ {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a"},
473
+ {file = "numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf"},
474
+ {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1"},
475
+ {file = "numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab"},
476
+ {file = "numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47"},
477
+ {file = "numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303"},
478
+ {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"},
479
+ ]
480
+
481
+ [[package]]
482
+ name = "nvidia-cublas-cu12"
483
+ version = "12.8.4.1"
484
+ requires_python = ">=3"
485
+ summary = "CUBLAS native runtime libraries"
486
+ groups = ["default"]
487
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
488
+ files = [
489
+ {file = "nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:b86f6dd8935884615a0683b663891d43781b819ac4f2ba2b0c9604676af346d0"},
490
+ {file = "nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142"},
491
+ {file = "nvidia_cublas_cu12-12.8.4.1-py3-none-win_amd64.whl", hash = "sha256:47e9b82132fa8d2b4944e708049229601448aaad7e6f296f630f2d1a32de35af"},
492
+ ]
493
+
494
+ [[package]]
495
+ name = "nvidia-cuda-cupti-cu12"
496
+ version = "12.8.90"
497
+ requires_python = ">=3"
498
+ summary = "CUDA profiling tools runtime libs."
499
+ groups = ["default"]
500
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
501
+ files = [
502
+ {file = "nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4412396548808ddfed3f17a467b104ba7751e6b58678a4b840675c56d21cf7ed"},
503
+ {file = "nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182"},
504
+ {file = "nvidia_cuda_cupti_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:bb479dcdf7e6d4f8b0b01b115260399bf34154a1a2e9fe11c85c517d87efd98e"},
505
+ ]
506
+
507
+ [[package]]
508
+ name = "nvidia-cuda-nvrtc-cu12"
509
+ version = "12.8.93"
510
+ requires_python = ">=3"
511
+ summary = "NVRTC native runtime libraries"
512
+ groups = ["default"]
513
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
514
+ files = [
515
+ {file = "nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994"},
516
+ {file = "nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fc1fec1e1637854b4c0a65fb9a8346b51dd9ee69e61ebaccc82058441f15bce8"},
517
+ {file = "nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-win_amd64.whl", hash = "sha256:7a4b6b2904850fe78e0bd179c4b655c404d4bb799ef03ddc60804247099ae909"},
518
+ ]
519
+
520
+ [[package]]
521
+ name = "nvidia-cuda-runtime-cu12"
522
+ version = "12.8.90"
523
+ requires_python = ">=3"
524
+ summary = "CUDA Runtime native Libraries"
525
+ groups = ["default"]
526
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
527
+ files = [
528
+ {file = "nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:52bf7bbee900262ffefe5e9d5a2a69a30d97e2bc5bb6cc866688caa976966e3d"},
529
+ {file = "nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90"},
530
+ {file = "nvidia_cuda_runtime_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:c0c6027f01505bfed6c3b21ec546f69c687689aad5f1a377554bc6ca4aa993a8"},
531
+ ]
532
+
533
+ [[package]]
534
+ name = "nvidia-cudnn-cu12"
535
+ version = "9.10.2.21"
536
+ requires_python = ">=3"
537
+ summary = "cuDNN runtime libraries"
538
+ groups = ["default"]
539
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
540
+ dependencies = [
541
+ "nvidia-cublas-cu12",
542
+ ]
543
+ files = [
544
+ {file = "nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c9132cc3f8958447b4910a1720036d9eff5928cc3179b0a51fb6d167c6cc87d8"},
545
+ {file = "nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8"},
546
+ {file = "nvidia_cudnn_cu12-9.10.2.21-py3-none-win_amd64.whl", hash = "sha256:c6288de7d63e6cf62988f0923f96dc339cea362decb1bf5b3141883392a7d65e"},
547
+ ]
548
+
549
+ [[package]]
550
+ name = "nvidia-cufft-cu12"
551
+ version = "11.3.3.83"
552
+ requires_python = ">=3"
553
+ summary = "CUFFT native runtime libraries"
554
+ groups = ["default"]
555
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
556
+ dependencies = [
557
+ "nvidia-nvjitlink-cu12",
558
+ ]
559
+ files = [
560
+ {file = "nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:848ef7224d6305cdb2a4df928759dca7b1201874787083b6e7550dd6765ce69a"},
561
+ {file = "nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74"},
562
+ {file = "nvidia_cufft_cu12-11.3.3.83-py3-none-win_amd64.whl", hash = "sha256:7a64a98ef2a7c47f905aaf8931b69a3a43f27c55530c698bb2ed7c75c0b42cb7"},
563
+ ]
564
+
565
+ [[package]]
566
+ name = "nvidia-cufile-cu12"
567
+ version = "1.13.1.3"
568
+ requires_python = ">=3"
569
+ summary = "cuFile GPUDirect libraries"
570
+ groups = ["default"]
571
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
572
+ files = [
573
+ {file = "nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc"},
574
+ {file = "nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:4beb6d4cce47c1a0f1013d72e02b0994730359e17801d395bdcbf20cfb3bb00a"},
575
+ ]
576
+
577
+ [[package]]
578
+ name = "nvidia-curand-cu12"
579
+ version = "10.3.9.90"
580
+ requires_python = ">=3"
581
+ summary = "CURAND native runtime libraries"
582
+ groups = ["default"]
583
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
584
+ files = [
585
+ {file = "nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:dfab99248034673b779bc6decafdc3404a8a6f502462201f2f31f11354204acd"},
586
+ {file = "nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9"},
587
+ {file = "nvidia_curand_cu12-10.3.9.90-py3-none-win_amd64.whl", hash = "sha256:f149a8ca457277da854f89cf282d6ef43176861926c7ac85b2a0fbd237c587ec"},
588
+ ]
589
+
590
+ [[package]]
591
+ name = "nvidia-cusolver-cu12"
592
+ version = "11.7.3.90"
593
+ requires_python = ">=3"
594
+ summary = "CUDA solver native runtime libraries"
595
+ groups = ["default"]
596
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
597
+ dependencies = [
598
+ "nvidia-cublas-cu12",
599
+ "nvidia-cusparse-cu12",
600
+ "nvidia-nvjitlink-cu12",
601
+ ]
602
+ files = [
603
+ {file = "nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:db9ed69dbef9715071232caa9b69c52ac7de3a95773c2db65bdba85916e4e5c0"},
604
+ {file = "nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450"},
605
+ {file = "nvidia_cusolver_cu12-11.7.3.90-py3-none-win_amd64.whl", hash = "sha256:4a550db115fcabc4d495eb7d39ac8b58d4ab5d8e63274d3754df1c0ad6a22d34"},
606
+ ]
607
+
608
+ [[package]]
609
+ name = "nvidia-cusparse-cu12"
610
+ version = "12.5.8.93"
611
+ requires_python = ">=3"
612
+ summary = "CUSPARSE native runtime libraries"
613
+ groups = ["default"]
614
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
615
+ dependencies = [
616
+ "nvidia-nvjitlink-cu12",
617
+ ]
618
+ files = [
619
+ {file = "nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9b6c161cb130be1a07a27ea6923df8141f3c295852f4b260c65f18f3e0a091dc"},
620
+ {file = "nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b"},
621
+ {file = "nvidia_cusparse_cu12-12.5.8.93-py3-none-win_amd64.whl", hash = "sha256:9a33604331cb2cac199f2e7f5104dfbb8a5a898c367a53dfda9ff2acb6b6b4dd"},
622
+ ]
623
+
624
+ [[package]]
625
+ name = "nvidia-cusparselt-cu12"
626
+ version = "0.7.1"
627
+ summary = "NVIDIA cuSPARSELt"
628
+ groups = ["default"]
629
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
630
+ files = [
631
+ {file = "nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8878dce784d0fac90131b6817b607e803c36e629ba34dc5b433471382196b6a5"},
632
+ {file = "nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623"},
633
+ {file = "nvidia_cusparselt_cu12-0.7.1-py3-none-win_amd64.whl", hash = "sha256:f67fbb5831940ec829c9117b7f33807db9f9678dc2a617fbe781cac17b4e1075"},
634
+ ]
635
+
636
+ [[package]]
637
+ name = "nvidia-nccl-cu12"
638
+ version = "2.27.3"
639
+ requires_python = ">=3"
640
+ summary = "NVIDIA Collective Communication Library (NCCL) Runtime"
641
+ groups = ["default"]
642
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
643
+ files = [
644
+ {file = "nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9ddf1a245abc36c550870f26d537a9b6087fb2e2e3d6e0ef03374c6fd19d984f"},
645
+ {file = "nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adf27ccf4238253e0b826bce3ff5fa532d65fc42322c8bfdfaf28024c0fbe039"},
646
+ ]
647
+
648
+ [[package]]
649
+ name = "nvidia-nvjitlink-cu12"
650
+ version = "12.8.93"
651
+ requires_python = ">=3"
652
+ summary = "Nvidia JIT LTO Library"
653
+ groups = ["default"]
654
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
655
+ files = [
656
+ {file = "nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88"},
657
+ {file = "nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:adccd7161ace7261e01bb91e44e88da350895c270d23f744f0820c818b7229e7"},
658
+ {file = "nvidia_nvjitlink_cu12-12.8.93-py3-none-win_amd64.whl", hash = "sha256:bd93fbeeee850917903583587f4fc3a4eafa022e34572251368238ab5e6bd67f"},
659
+ ]
660
+
661
+ [[package]]
662
+ name = "nvidia-nvtx-cu12"
663
+ version = "12.8.90"
664
+ requires_python = ">=3"
665
+ summary = "NVIDIA Tools Extension"
666
+ groups = ["default"]
667
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
668
+ files = [
669
+ {file = "nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d7ad891da111ebafbf7e015d34879f7112832fc239ff0d7d776b6cb685274615"},
670
+ {file = "nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f"},
671
+ {file = "nvidia_nvtx_cu12-12.8.90-py3-none-win_amd64.whl", hash = "sha256:619c8304aedc69f02ea82dd244541a83c3d9d40993381b3b590f1adaed3db41e"},
672
+ ]
673
+
674
+ [[package]]
675
+ name = "opencv-python"
676
+ version = "4.12.0.88"
677
+ requires_python = ">=3.6"
678
+ summary = "Wrapper package for OpenCV python bindings."
679
+ groups = ["default"]
680
+ dependencies = [
681
+ "numpy<2.0; python_version < \"3.9\"",
682
+ "numpy<2.3.0,>=2; python_version >= \"3.9\"",
683
+ ]
684
+ files = [
685
+ {file = "opencv-python-4.12.0.88.tar.gz", hash = "sha256:8b738389cede219405f6f3880b851efa3415ccd674752219377353f017d2994d"},
686
+ {file = "opencv_python-4.12.0.88-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:f9a1f08883257b95a5764bf517a32d75aec325319c8ed0f89739a57fae9e92a5"},
687
+ {file = "opencv_python-4.12.0.88-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:812eb116ad2b4de43ee116fcd8991c3a687f099ada0b04e68f64899c09448e81"},
688
+ {file = "opencv_python-4.12.0.88-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:51fd981c7df6af3e8f70b1556696b05224c4e6b6777bdd2a46b3d4fb09de1a92"},
689
+ {file = "opencv_python-4.12.0.88-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:092c16da4c5a163a818f120c22c5e4a2f96e0db4f24e659c701f1fe629a690f9"},
690
+ {file = "opencv_python-4.12.0.88-cp37-abi3-win32.whl", hash = "sha256:ff554d3f725b39878ac6a2e1fa232ec509c36130927afc18a1719ebf4fbf4357"},
691
+ {file = "opencv_python-4.12.0.88-cp37-abi3-win_amd64.whl", hash = "sha256:d98edb20aa932fd8ebd276a72627dad9dc097695b3d435a4257557bbb49a79d2"},
692
+ ]
693
+
694
+ [[package]]
695
+ name = "packaging"
696
+ version = "25.0"
697
+ requires_python = ">=3.8"
698
+ summary = "Core utilities for Python packages"
699
+ groups = ["default"]
700
+ files = [
701
+ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"},
702
+ {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"},
703
+ ]
704
+
705
+ [[package]]
706
+ name = "pandas"
707
+ version = "2.3.2"
708
+ requires_python = ">=3.9"
709
+ summary = "Powerful data structures for data analysis, time series, and statistics"
710
+ groups = ["default"]
711
+ dependencies = [
712
+ "numpy>=1.22.4; python_version < \"3.11\"",
713
+ "numpy>=1.23.2; python_version == \"3.11\"",
714
+ "numpy>=1.26.0; python_version >= \"3.12\"",
715
+ "python-dateutil>=2.8.2",
716
+ "pytz>=2020.1",
717
+ "tzdata>=2022.7",
718
+ ]
719
+ files = [
720
+ {file = "pandas-2.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1333e9c299adcbb68ee89a9bb568fc3f20f9cbb419f1dd5225071e6cddb2a743"},
721
+ {file = "pandas-2.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76972bcbd7de8e91ad5f0ca884a9f2c477a2125354af624e022c49e5bd0dfff4"},
722
+ {file = "pandas-2.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b98bdd7c456a05eef7cd21fd6b29e3ca243591fe531c62be94a2cc987efb5ac2"},
723
+ {file = "pandas-2.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d81573b3f7db40d020983f78721e9bfc425f411e616ef019a10ebf597aedb2e"},
724
+ {file = "pandas-2.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e190b738675a73b581736cc8ec71ae113d6c3768d0bd18bffa5b9a0927b0b6ea"},
725
+ {file = "pandas-2.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c253828cb08f47488d60f43c5fc95114c771bbfff085da54bfc79cb4f9e3a372"},
726
+ {file = "pandas-2.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:9467697b8083f9667b212633ad6aa4ab32436dcbaf4cd57325debb0ddef2012f"},
727
+ {file = "pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb"},
728
+ ]
729
+
730
+ [[package]]
731
+ name = "pillow"
732
+ version = "11.3.0"
733
+ requires_python = ">=3.9"
734
+ summary = "Python Imaging Library (Fork)"
735
+ groups = ["default"]
736
+ files = [
737
+ {file = "pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722"},
738
+ {file = "pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288"},
739
+ {file = "pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d"},
740
+ {file = "pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494"},
741
+ {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58"},
742
+ {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f"},
743
+ {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e"},
744
+ {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94"},
745
+ {file = "pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0"},
746
+ {file = "pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac"},
747
+ {file = "pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd"},
748
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6"},
749
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438"},
750
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3"},
751
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c"},
752
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361"},
753
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7"},
754
+ {file = "pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8"},
755
+ {file = "pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523"},
756
+ ]
757
+
758
+ [[package]]
759
+ name = "polars"
760
+ version = "1.33.1"
761
+ requires_python = ">=3.9"
762
+ summary = "Blazingly fast DataFrame library"
763
+ groups = ["default"]
764
+ files = [
765
+ {file = "polars-1.33.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:3881c444b0f14778ba94232f077a709d435977879c1b7d7bd566b55bd1830bb5"},
766
+ {file = "polars-1.33.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:29200b89c9a461e6f06fc1660bc9c848407640ee30fe0e5ef4947cfd49d55337"},
767
+ {file = "polars-1.33.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:444940646e76342abaa47f126c70e3e40b56e8e02a9e89e5c5d1c24b086db58a"},
768
+ {file = "polars-1.33.1-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:094a37d06789286649f654f229ec4efb9376630645ba8963b70cb9c0b008b3e1"},
769
+ {file = "polars-1.33.1-cp39-abi3-win_amd64.whl", hash = "sha256:c9781c704432a2276a185ee25898aa427f39a904fbe8fde4ae779596cdbd7a9e"},
770
+ {file = "polars-1.33.1-cp39-abi3-win_arm64.whl", hash = "sha256:c3cfddb3b78eae01a218222bdba8048529fef7e14889a71e33a5198644427642"},
771
+ {file = "polars-1.33.1.tar.gz", hash = "sha256:fa3fdc34eab52a71498264d6ff9b0aa6955eb4b0ae8add5d3cb43e4b84644007"},
772
+ ]
773
+
774
+ [[package]]
775
+ name = "proglog"
776
+ version = "0.1.12"
777
+ summary = "Log and progress bar manager for console, notebooks, web..."
778
+ groups = ["default"]
779
+ dependencies = [
780
+ "tqdm",
781
+ ]
782
+ files = [
783
+ {file = "proglog-0.1.12-py3-none-any.whl", hash = "sha256:ccaafce51e80a81c65dc907a460c07ccb8ec1f78dc660cfd8f9ec3a22f01b84c"},
784
+ {file = "proglog-0.1.12.tar.gz", hash = "sha256:361ee074721c277b89b75c061336cb8c5f287c92b043efa562ccf7866cda931c"},
785
+ ]
786
+
787
+ [[package]]
788
+ name = "protobuf"
789
+ version = "6.32.0"
790
+ requires_python = ">=3.9"
791
+ summary = ""
792
+ groups = ["default"]
793
+ files = [
794
+ {file = "protobuf-6.32.0-cp310-abi3-win32.whl", hash = "sha256:84f9e3c1ff6fb0308dbacb0950d8aa90694b0d0ee68e75719cb044b7078fe741"},
795
+ {file = "protobuf-6.32.0-cp310-abi3-win_amd64.whl", hash = "sha256:a8bdbb2f009cfc22a36d031f22a625a38b615b5e19e558a7b756b3279723e68e"},
796
+ {file = "protobuf-6.32.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d52691e5bee6c860fff9a1c86ad26a13afbeb4b168cd4445c922b7e2cf85aaf0"},
797
+ {file = "protobuf-6.32.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:501fe6372fd1c8ea2a30b4d9be8f87955a64d6be9c88a973996cef5ef6f0abf1"},
798
+ {file = "protobuf-6.32.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:75a2aab2bd1aeb1f5dc7c5f33bcb11d82ea8c055c9becbb41c26a8c43fd7092c"},
799
+ {file = "protobuf-6.32.0-py3-none-any.whl", hash = "sha256:ba377e5b67b908c8f3072a57b63e2c6a4cbd18aea4ed98d2584350dbf46f2783"},
800
+ {file = "protobuf-6.32.0.tar.gz", hash = "sha256:a81439049127067fc49ec1d36e25c6ee1d1a2b7be930675f919258d03c04e7d2"},
801
+ ]
802
+
803
+ [[package]]
804
+ name = "psutil"
805
+ version = "7.0.0"
806
+ requires_python = ">=3.6"
807
+ summary = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7."
808
+ groups = ["default"]
809
+ files = [
810
+ {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"},
811
+ {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"},
812
+ {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"},
813
+ {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"},
814
+ {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"},
815
+ {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"},
816
+ {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"},
817
+ {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"},
818
+ ]
819
+
820
+ [[package]]
821
+ name = "pyarrow"
822
+ version = "21.0.0"
823
+ requires_python = ">=3.9"
824
+ summary = "Python library for Apache Arrow"
825
+ groups = ["default"]
826
+ files = [
827
+ {file = "pyarrow-21.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:c077f48aab61738c237802836fc3844f85409a46015635198761b0d6a688f87b"},
828
+ {file = "pyarrow-21.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:689f448066781856237eca8d1975b98cace19b8dd2ab6145bf49475478bcaa10"},
829
+ {file = "pyarrow-21.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:479ee41399fcddc46159a551705b89c05f11e8b8cb8e968f7fec64f62d91985e"},
830
+ {file = "pyarrow-21.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:40ebfcb54a4f11bcde86bc586cbd0272bac0d516cfa539c799c2453768477569"},
831
+ {file = "pyarrow-21.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8d58d8497814274d3d20214fbb24abcad2f7e351474357d552a8d53bce70c70e"},
832
+ {file = "pyarrow-21.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:585e7224f21124dd57836b1530ac8f2df2afc43c861d7bf3d58a4870c42ae36c"},
833
+ {file = "pyarrow-21.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:555ca6935b2cbca2c0e932bedd853e9bc523098c39636de9ad4693b5b1df86d6"},
834
+ {file = "pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc"},
835
+ ]
836
+
837
+ [[package]]
838
+ name = "pydeck"
839
+ version = "0.9.1"
840
+ requires_python = ">=3.8"
841
+ summary = "Widget for deck.gl maps"
842
+ groups = ["default"]
843
+ dependencies = [
844
+ "jinja2>=2.10.1",
845
+ "numpy>=1.16.4",
846
+ ]
847
+ files = [
848
+ {file = "pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038"},
849
+ {file = "pydeck-0.9.1.tar.gz", hash = "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605"},
850
+ ]
851
+
852
+ [[package]]
853
+ name = "pyparsing"
854
+ version = "3.2.3"
855
+ requires_python = ">=3.9"
856
+ summary = "pyparsing module - Classes and methods to define and execute parsing grammars"
857
+ groups = ["default"]
858
+ files = [
859
+ {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"},
860
+ {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"},
861
+ ]
862
+
863
+ [[package]]
864
+ name = "python-dateutil"
865
+ version = "2.9.0.post0"
866
+ requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
867
+ summary = "Extensions to the standard Python datetime module"
868
+ groups = ["default"]
869
+ dependencies = [
870
+ "six>=1.5",
871
+ ]
872
+ files = [
873
+ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
874
+ {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
875
+ ]
876
+
877
+ [[package]]
878
+ name = "python-dotenv"
879
+ version = "1.1.1"
880
+ requires_python = ">=3.9"
881
+ summary = "Read key-value pairs from a .env file and set them as environment variables"
882
+ groups = ["default"]
883
+ files = [
884
+ {file = "python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc"},
885
+ {file = "python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab"},
886
+ ]
887
+
888
+ [[package]]
889
+ name = "pytz"
890
+ version = "2025.2"
891
+ summary = "World timezone definitions, modern and historical"
892
+ groups = ["default"]
893
+ files = [
894
+ {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"},
895
+ {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"},
896
+ ]
897
+
898
+ [[package]]
899
+ name = "pyyaml"
900
+ version = "6.0.2"
901
+ requires_python = ">=3.8"
902
+ summary = "YAML parser and emitter for Python"
903
+ groups = ["default"]
904
+ files = [
905
+ {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"},
906
+ {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"},
907
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"},
908
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"},
909
+ {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"},
910
+ {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"},
911
+ {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"},
912
+ {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"},
913
+ {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"},
914
+ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"},
915
+ ]
916
+
917
+ [[package]]
918
+ name = "referencing"
919
+ version = "0.36.2"
920
+ requires_python = ">=3.9"
921
+ summary = "JSON Referencing + Python"
922
+ groups = ["default"]
923
+ dependencies = [
924
+ "attrs>=22.2.0",
925
+ "rpds-py>=0.7.0",
926
+ "typing-extensions>=4.4.0; python_version < \"3.13\"",
927
+ ]
928
+ files = [
929
+ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"},
930
+ {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"},
931
+ ]
932
+
933
+ [[package]]
934
+ name = "requests"
935
+ version = "2.32.5"
936
+ requires_python = ">=3.9"
937
+ summary = "Python HTTP for Humans."
938
+ groups = ["default"]
939
+ dependencies = [
940
+ "certifi>=2017.4.17",
941
+ "charset-normalizer<4,>=2",
942
+ "idna<4,>=2.5",
943
+ "urllib3<3,>=1.21.1",
944
+ ]
945
+ files = [
946
+ {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"},
947
+ {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"},
948
+ ]
949
+
950
+ [[package]]
951
+ name = "rpds-py"
952
+ version = "0.27.1"
953
+ requires_python = ">=3.9"
954
+ summary = "Python bindings to Rust's persistent data structures (rpds)"
955
+ groups = ["default"]
956
+ files = [
957
+ {file = "rpds_py-0.27.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:be898f271f851f68b318872ce6ebebbc62f303b654e43bf72683dbdc25b7c881"},
958
+ {file = "rpds_py-0.27.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:62ac3d4e3e07b58ee0ddecd71d6ce3b1637de2d373501412df395a0ec5f9beb5"},
959
+ {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4708c5c0ceb2d034f9991623631d3d23cb16e65c83736ea020cdbe28d57c0a0e"},
960
+ {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:abfa1171a9952d2e0002aba2ad3780820b00cc3d9c98c6630f2e93271501f66c"},
961
+ {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b507d19f817ebaca79574b16eb2ae412e5c0835542c93fe9983f1e432aca195"},
962
+ {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:168b025f8fd8d8d10957405f3fdcef3dc20f5982d398f90851f4abc58c566c52"},
963
+ {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb56c6210ef77caa58e16e8c17d35c63fe3f5b60fd9ba9d424470c3400bcf9ed"},
964
+ {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:d252f2d8ca0195faa707f8eb9368955760880b2b42a8ee16d382bf5dd807f89a"},
965
+ {file = "rpds_py-0.27.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6e5e54da1e74b91dbc7996b56640f79b195d5925c2b78efaa8c5d53e1d88edde"},
966
+ {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ffce0481cc6e95e5b3f0a47ee17ffbd234399e6d532f394c8dce320c3b089c21"},
967
+ {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a205fdfe55c90c2cd8e540ca9ceba65cbe6629b443bc05db1f590a3db8189ff9"},
968
+ {file = "rpds_py-0.27.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:689fb5200a749db0415b092972e8eba85847c23885c8543a8b0f5c009b1a5948"},
969
+ {file = "rpds_py-0.27.1-cp311-cp311-win32.whl", hash = "sha256:3182af66048c00a075010bc7f4860f33913528a4b6fc09094a6e7598e462fe39"},
970
+ {file = "rpds_py-0.27.1-cp311-cp311-win_amd64.whl", hash = "sha256:b4938466c6b257b2f5c4ff98acd8128ec36b5059e5c8f8372d79316b1c36bb15"},
971
+ {file = "rpds_py-0.27.1-cp311-cp311-win_arm64.whl", hash = "sha256:2f57af9b4d0793e53266ee4325535a31ba48e2f875da81a9177c9926dfa60746"},
972
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cdfe4bb2f9fe7458b7453ad3c33e726d6d1c7c0a72960bcc23800d77384e42df"},
973
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8fabb8fd848a5f75a2324e4a84501ee3a5e3c78d8603f83475441866e60b94a3"},
974
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eda8719d598f2f7f3e0f885cba8646644b55a187762bec091fa14a2b819746a9"},
975
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c64d07e95606ec402a0a1c511fe003873fa6af630bda59bac77fac8b4318ebc"},
976
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93a2ed40de81bcff59aabebb626562d48332f3d028ca2036f1d23cbb52750be4"},
977
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:387ce8c44ae94e0ec50532d9cb0edce17311024c9794eb196b90e1058aadeb66"},
978
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf94f812c95b5e60ebaf8bfb1898a7d7cb9c1af5744d4a67fa47796e0465d4e"},
979
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:4848ca84d6ded9b58e474dfdbad4b8bfb450344c0551ddc8d958bf4b36aa837c"},
980
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2bde09cbcf2248b73c7c323be49b280180ff39fadcfe04e7b6f54a678d02a7cf"},
981
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:94c44ee01fd21c9058f124d2d4f0c9dc7634bec93cd4b38eefc385dabe71acbf"},
982
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:df8b74962e35c9249425d90144e721eed198e6555a0e22a563d29fe4486b51f6"},
983
+ {file = "rpds_py-0.27.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:dc23e6820e3b40847e2f4a7726462ba0cf53089512abe9ee16318c366494c17a"},
984
+ {file = "rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8"},
985
+ ]
986
+
987
+ [[package]]
988
+ name = "scipy"
989
+ version = "1.16.1"
990
+ requires_python = ">=3.11"
991
+ summary = "Fundamental algorithms for scientific computing in Python"
992
+ groups = ["default"]
993
+ dependencies = [
994
+ "numpy<2.6,>=1.25.2",
995
+ ]
996
+ files = [
997
+ {file = "scipy-1.16.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:c033fa32bab91dc98ca59d0cf23bb876454e2bb02cbe592d5023138778f70030"},
998
+ {file = "scipy-1.16.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6e5c2f74e5df33479b5cd4e97a9104c511518fbd979aa9b8f6aec18b2e9ecae7"},
999
+ {file = "scipy-1.16.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:0a55ffe0ba0f59666e90951971a884d1ff6f4ec3275a48f472cfb64175570f77"},
1000
+ {file = "scipy-1.16.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:f8a5d6cd147acecc2603fbd382fed6c46f474cccfcf69ea32582e033fb54dcfe"},
1001
+ {file = "scipy-1.16.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb18899127278058bcc09e7b9966d41a5a43740b5bb8dcba401bd983f82e885b"},
1002
+ {file = "scipy-1.16.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adccd93a2fa937a27aae826d33e3bfa5edf9aa672376a4852d23a7cd67a2e5b7"},
1003
+ {file = "scipy-1.16.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:18aca1646a29ee9a0625a1be5637fa798d4d81fdf426481f06d69af828f16958"},
1004
+ {file = "scipy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d85495cef541729a70cdddbbf3e6b903421bc1af3e8e3a9a72a06751f33b7c39"},
1005
+ {file = "scipy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:226652fca853008119c03a8ce71ffe1b3f6d2844cc1686e8f9806edafae68596"},
1006
+ {file = "scipy-1.16.1.tar.gz", hash = "sha256:44c76f9e8b6e8e488a586190ab38016e4ed2f8a038af7cd3defa903c0a2238b3"},
1007
+ ]
1008
+
1009
+ [[package]]
1010
+ name = "setuptools"
1011
+ version = "80.9.0"
1012
+ requires_python = ">=3.9"
1013
+ summary = "Easily download, build, install, upgrade, and uninstall Python packages"
1014
+ groups = ["default"]
1015
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
1016
+ files = [
1017
+ {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"},
1018
+ {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"},
1019
+ ]
1020
+
1021
+ [[package]]
1022
+ name = "six"
1023
+ version = "1.17.0"
1024
+ requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
1025
+ summary = "Python 2 and 3 compatibility utilities"
1026
+ groups = ["default"]
1027
+ files = [
1028
+ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"},
1029
+ {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"},
1030
+ ]
1031
+
1032
+ [[package]]
1033
+ name = "smmap"
1034
+ version = "5.0.2"
1035
+ requires_python = ">=3.7"
1036
+ summary = "A pure Python implementation of a sliding window memory map manager"
1037
+ groups = ["default"]
1038
+ files = [
1039
+ {file = "smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e"},
1040
+ {file = "smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5"},
1041
+ ]
1042
+
1043
+ [[package]]
1044
+ name = "streamlit"
1045
+ version = "1.49.1"
1046
+ requires_python = "!=3.9.7,>=3.9"
1047
+ summary = "A faster way to build and share data apps"
1048
+ groups = ["default"]
1049
+ dependencies = [
1050
+ "altair!=5.4.0,!=5.4.1,<6,>=4.0",
1051
+ "blinker<2,>=1.5.0",
1052
+ "cachetools<7,>=4.0",
1053
+ "click<9,>=7.0",
1054
+ "gitpython!=3.1.19,<4,>=3.0.7",
1055
+ "numpy<3,>=1.23",
1056
+ "packaging<26,>=20",
1057
+ "pandas<3,>=1.4.0",
1058
+ "pillow<12,>=7.1.0",
1059
+ "protobuf<7,>=3.20",
1060
+ "pyarrow>=7.0",
1061
+ "pydeck<1,>=0.8.0b4",
1062
+ "requests<3,>=2.27",
1063
+ "tenacity<10,>=8.1.0",
1064
+ "toml<2,>=0.10.1",
1065
+ "tornado!=6.5.0,<7,>=6.0.3",
1066
+ "typing-extensions<5,>=4.4.0",
1067
+ "watchdog<7,>=2.1.5; platform_system != \"Darwin\"",
1068
+ ]
1069
+ files = [
1070
+ {file = "streamlit-1.49.1-py3-none-any.whl", hash = "sha256:ad7b6d0dc35db168587acf96f80378249467fc057ed739a41c511f6bf5aa173b"},
1071
+ {file = "streamlit-1.49.1.tar.gz", hash = "sha256:6f213f1e43f035143a56f58ad50068d8a09482f0a2dad1050d7e7e99a9689818"},
1072
+ ]
1073
+
1074
+ [[package]]
1075
+ name = "sympy"
1076
+ version = "1.14.0"
1077
+ requires_python = ">=3.9"
1078
+ summary = "Computer algebra system (CAS) in Python"
1079
+ groups = ["default"]
1080
+ dependencies = [
1081
+ "mpmath<1.4,>=1.1.0",
1082
+ ]
1083
+ files = [
1084
+ {file = "sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5"},
1085
+ {file = "sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517"},
1086
+ ]
1087
+
1088
+ [[package]]
1089
+ name = "tenacity"
1090
+ version = "9.1.2"
1091
+ requires_python = ">=3.9"
1092
+ summary = "Retry code until it succeeds"
1093
+ groups = ["default"]
1094
+ files = [
1095
+ {file = "tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138"},
1096
+ {file = "tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb"},
1097
+ ]
1098
+
1099
+ [[package]]
1100
+ name = "toml"
1101
+ version = "0.10.2"
1102
+ requires_python = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*"
1103
+ summary = "Python Library for Tom's Obvious, Minimal Language"
1104
+ groups = ["default"]
1105
+ files = [
1106
+ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"},
1107
+ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"},
1108
+ ]
1109
+
1110
+ [[package]]
1111
+ name = "torch"
1112
+ version = "2.8.0"
1113
+ requires_python = ">=3.9.0"
1114
+ summary = "Tensors and Dynamic neural networks in Python with strong GPU acceleration"
1115
+ groups = ["default"]
1116
+ dependencies = [
1117
+ "filelock",
1118
+ "fsspec",
1119
+ "jinja2",
1120
+ "networkx",
1121
+ "nvidia-cublas-cu12==12.8.4.1; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1122
+ "nvidia-cuda-cupti-cu12==12.8.90; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1123
+ "nvidia-cuda-nvrtc-cu12==12.8.93; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1124
+ "nvidia-cuda-runtime-cu12==12.8.90; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1125
+ "nvidia-cudnn-cu12==9.10.2.21; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1126
+ "nvidia-cufft-cu12==11.3.3.83; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1127
+ "nvidia-cufile-cu12==1.13.1.3; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1128
+ "nvidia-curand-cu12==10.3.9.90; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1129
+ "nvidia-cusolver-cu12==11.7.3.90; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1130
+ "nvidia-cusparse-cu12==12.5.8.93; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1131
+ "nvidia-cusparselt-cu12==0.7.1; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1132
+ "nvidia-nccl-cu12==2.27.3; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1133
+ "nvidia-nvjitlink-cu12==12.8.93; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1134
+ "nvidia-nvtx-cu12==12.8.90; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1135
+ "setuptools; python_version >= \"3.12\"",
1136
+ "sympy>=1.13.3",
1137
+ "triton==3.4.0; platform_system == \"Linux\" and platform_machine == \"x86_64\"",
1138
+ "typing-extensions>=4.10.0",
1139
+ ]
1140
+ files = [
1141
+ {file = "torch-2.8.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:220a06fd7af8b653c35d359dfe1aaf32f65aa85befa342629f716acb134b9710"},
1142
+ {file = "torch-2.8.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c12fa219f51a933d5f80eeb3a7a5d0cbe9168c0a14bbb4055f1979431660879b"},
1143
+ {file = "torch-2.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c7ef765e27551b2fbfc0f41bcf270e1292d9bf79f8e0724848b1682be6e80aa"},
1144
+ {file = "torch-2.8.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:5ae0524688fb6707c57a530c2325e13bb0090b745ba7b4a2cd6a3ce262572916"},
1145
+ ]
1146
+
1147
+ [[package]]
1148
+ name = "torchvision"
1149
+ version = "0.23.0"
1150
+ requires_python = ">=3.9"
1151
+ summary = "image and video datasets and models for torch deep learning"
1152
+ groups = ["default"]
1153
+ dependencies = [
1154
+ "numpy",
1155
+ "pillow!=8.3.*,>=5.3.0",
1156
+ "torch==2.8.0",
1157
+ ]
1158
+ files = [
1159
+ {file = "torchvision-0.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49aa20e21f0c2bd458c71d7b449776cbd5f16693dd5807195a820612b8a229b7"},
1160
+ {file = "torchvision-0.23.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:01dc33ee24c79148aee7cdbcf34ae8a3c9da1674a591e781577b716d233b1fa6"},
1161
+ {file = "torchvision-0.23.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:35c27941831b653f5101edfe62c03d196c13f32139310519e8228f35eae0e96a"},
1162
+ {file = "torchvision-0.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:09bfde260e7963a15b80c9e442faa9f021c7e7f877ac0a36ca6561b367185013"},
1163
+ ]
1164
+
1165
+ [[package]]
1166
+ name = "tornado"
1167
+ version = "6.5.2"
1168
+ requires_python = ">=3.9"
1169
+ summary = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
1170
+ groups = ["default"]
1171
+ files = [
1172
+ {file = "tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6"},
1173
+ {file = "tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef"},
1174
+ {file = "tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e"},
1175
+ {file = "tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882"},
1176
+ {file = "tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108"},
1177
+ {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c"},
1178
+ {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4"},
1179
+ {file = "tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04"},
1180
+ {file = "tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0"},
1181
+ {file = "tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f"},
1182
+ {file = "tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af"},
1183
+ {file = "tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0"},
1184
+ ]
1185
+
1186
+ [[package]]
1187
+ name = "tqdm"
1188
+ version = "4.67.1"
1189
+ requires_python = ">=3.7"
1190
+ summary = "Fast, Extensible Progress Meter"
1191
+ groups = ["default"]
1192
+ dependencies = [
1193
+ "colorama; platform_system == \"Windows\"",
1194
+ ]
1195
+ files = [
1196
+ {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"},
1197
+ {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"},
1198
+ ]
1199
+
1200
+ [[package]]
1201
+ name = "triton"
1202
+ version = "3.4.0"
1203
+ requires_python = "<3.14,>=3.9"
1204
+ summary = "A language and compiler for custom Deep Learning operations"
1205
+ groups = ["default"]
1206
+ marker = "platform_system == \"Linux\" and platform_machine == \"x86_64\""
1207
+ dependencies = [
1208
+ "importlib-metadata; python_version < \"3.10\"",
1209
+ "setuptools>=40.8.0",
1210
+ ]
1211
+ files = [
1212
+ {file = "triton-3.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b70f5e6a41e52e48cfc087436c8a28c17ff98db369447bcaff3b887a3ab4467"},
1213
+ ]
1214
+
1215
+ [[package]]
1216
+ name = "typing-extensions"
1217
+ version = "4.15.0"
1218
+ requires_python = ">=3.9"
1219
+ summary = "Backported and Experimental Type Hints for Python 3.9+"
1220
+ groups = ["default"]
1221
+ files = [
1222
+ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"},
1223
+ {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"},
1224
+ ]
1225
+
1226
+ [[package]]
1227
+ name = "tzdata"
1228
+ version = "2025.2"
1229
+ requires_python = ">=2"
1230
+ summary = "Provider of IANA time zone data"
1231
+ groups = ["default"]
1232
+ files = [
1233
+ {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"},
1234
+ {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"},
1235
+ ]
1236
+
1237
+ [[package]]
1238
+ name = "ultralytics"
1239
+ version = "8.3.197"
1240
+ requires_python = ">=3.8"
1241
+ summary = "Ultralytics YOLO 🚀 for SOTA object detection, multi-object tracking, instance segmentation, pose estimation and image classification."
1242
+ groups = ["default"]
1243
+ dependencies = [
1244
+ "matplotlib>=3.3.0",
1245
+ "numpy>=1.23.0",
1246
+ "opencv-python>=4.6.0",
1247
+ "pillow>=7.1.2",
1248
+ "polars",
1249
+ "psutil",
1250
+ "pyyaml>=5.3.1",
1251
+ "requests>=2.23.0",
1252
+ "scipy>=1.4.1",
1253
+ "torch!=2.4.0,>=1.8.0; sys_platform == \"win32\"",
1254
+ "torch>=1.8.0",
1255
+ "torchvision>=0.9.0",
1256
+ "ultralytics-thop>=2.0.0",
1257
+ ]
1258
+ files = [
1259
+ {file = "ultralytics-8.3.197-py3-none-any.whl", hash = "sha256:5ee4c3608787b9fe95c39bd80bc5689bcee00ff9530e62c9b58535672e6bd65a"},
1260
+ {file = "ultralytics-8.3.197.tar.gz", hash = "sha256:6fdf8554d609d485463353b060470a56a0ef736c7591c57fb8b648642e4b1b48"},
1261
+ ]
1262
+
1263
+ [[package]]
1264
+ name = "ultralytics-thop"
1265
+ version = "2.0.17"
1266
+ requires_python = ">=3.8"
1267
+ summary = "Ultralytics THOP package for fast computation of PyTorch model FLOPs and parameters."
1268
+ groups = ["default"]
1269
+ dependencies = [
1270
+ "numpy",
1271
+ "torch",
1272
+ ]
1273
+ files = [
1274
+ {file = "ultralytics_thop-2.0.17-py3-none-any.whl", hash = "sha256:36ba7bd297b26cfd193531f4b8f42075ecf2059d9c0f04907521fee1db94e8c7"},
1275
+ {file = "ultralytics_thop-2.0.17.tar.gz", hash = "sha256:f4572aeb7236939f35c72f966e4e0c3d42fd433ae2974d816865d43e29dc981b"},
1276
+ ]
1277
+
1278
+ [[package]]
1279
+ name = "urllib3"
1280
+ version = "2.5.0"
1281
+ requires_python = ">=3.9"
1282
+ summary = "HTTP library with thread-safe connection pooling, file post, and more."
1283
+ groups = ["default"]
1284
+ files = [
1285
+ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"},
1286
+ {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"},
1287
+ ]
1288
+
1289
+ [[package]]
1290
+ name = "watchdog"
1291
+ version = "6.0.0"
1292
+ requires_python = ">=3.9"
1293
+ summary = "Filesystem events monitoring"
1294
+ groups = ["default"]
1295
+ marker = "platform_system != \"Darwin\""
1296
+ files = [
1297
+ {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"},
1298
+ {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"},
1299
+ {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"},
1300
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"},
1301
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"},
1302
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"},
1303
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"},
1304
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"},
1305
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"},
1306
+ {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"},
1307
+ {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"},
1308
+ {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"},
1309
+ {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"},
1310
+ {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"},
1311
+ ]
pyproject.toml ADDED
@@ -0,0 +1,140 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "object_detection_project"
3
+ version = "0.1.0"
4
+ description = "Default template for PDM package"
5
+ authors = [
6
+ {name = "", email = ""},
7
+ ]
8
+ dependencies = [
9
+ "streamlit>=1.49.1",
10
+ "moviepy>=2.2.1",
11
+ "pillow>=10.0.0",
12
+ "ultralytics>=8.3.0",
13
+ ]
14
+ requires-python = "==3.11.*"
15
+ readme = "README.md"
16
+ license = {text = "MIT"}
17
+
18
+
19
+ [tool.pdm]
20
+ distribution = false
21
+
22
+
23
+
24
+ [tool.ruff]
25
+ ignore = [
26
+
27
+ # (missing public docstrings) These work off of the Python sense of "public", rather than our
28
+ # bespoke definition based off of `@public`. When ruff supports custom plugins then we can write
29
+ # appropriate rules to require docstrings for `@public`.
30
+ "D100",
31
+ "D101",
32
+ "D102",
33
+ "D103",
34
+ "D104",
35
+ "D105",
36
+ "D106",
37
+ "D107",
38
+
39
+ # (docstring imperative mood) Overly restrictive.
40
+ "D401",
41
+
42
+ # (module level import not at top) There are several places where we use e.g.
43
+ # warnings.filterwarings calls before imports.
44
+ "E402",
45
+
46
+ # (line too long): This fires for comments, which black won't wrap.
47
+ # Disabling until there is an autoformat solution available for comments.
48
+ "E501",
49
+
50
+ # Pandas sometime need `==` for comparison instead of `is`
51
+ # Comparision to `None` should be done with `is` rather than `==`.
52
+ "E712",
53
+
54
+ # (no type comparison): There are a few places where we use `== type(None)` which are more clear
55
+ # than the equivalent `isinstance` check.
56
+ 'E721',
57
+
58
+ # (bare exception): There are many places where we want to catch a maximally generic exception.
59
+ 'E722',
60
+
61
+ # (no assign lambda): existing code assigns lambdas in a few places. With black formatting
62
+ # requiring extra empty lines between defs, disallowing lambda assignment can make code less
63
+ # readable.
64
+ "E731",
65
+
66
+ # (try-except-in-loop) we use this pattern in many places and the performance impact is negligible
67
+ "PERF203",
68
+
69
+ # (no concatenation) Existing codebase has many concatentations, no reason to disallow them.
70
+ "RUF005",
71
+
72
+ # (use ClassVar for attr declarations with defaults) This is a good rule for vanilla Python, but
73
+ # triggers false positives for many libs that have DSLs that make use of attr defaults.
74
+ "RUF012",
75
+
76
+
77
+ ##### TEMPORARY DISABLES
78
+
79
+ # (assorted docstring rules) There are too many violations of these to enable
80
+ # right now, but we should enable after fixing the violations.
81
+ "D200", # (one-line docstring should fit)
82
+ "D205", # (blank line after summary)
83
+ "D417", # (missing arg in docstring)
84
+ # (assorted perf rules) We have a lot of violations, enable when autofix is available
85
+ "PERF401", # (manual-list-comprehension)
86
+ "PERF402", # (manual-list-copy)
87
+ ]
88
+ # By default, ruff only uses all "E" (pycodestyle) and "F" (pyflakes) rules.
89
+ # Here we append to the defaults.
90
+ select = [
91
+ # (flake8-builtins) detect shadowing of python builtin symbols by variables and arguments.
92
+ # Attributes are OK (which is why A003) is not included here.
93
+ "A001",
94
+ "A002",
95
+
96
+ # (useless expression): Expressions that aren't assigned to anything are typically bugs.
97
+ "B018",
98
+
99
+ # (pydocstyle) Docstring-related rules. A large subset of these are ignored by the
100
+ # "convention=google" setting, we set under tool.ruff.pydocstyle.
101
+ "D",
102
+
103
+ # (pycodestyle) pycodestyle rules
104
+ "E",
105
+
106
+ # (pyflakes) pyflakes rules
107
+ "F",
108
+
109
+ # (isort) detect improperly sorted imports
110
+ "I001",
111
+
112
+ # (performance) perflint rules
113
+ "PERF",
114
+
115
+ # (pylint) use all pylint rules from categories "Convention", "Error", and "Warning" (ruff
116
+ # currently implements only a subset of pylint's rules)
117
+ "PLE",
118
+ "PLW",
119
+
120
+ # (no commented out code) keep commented out code blocks out of the codebase
121
+ # "ERA001",
122
+
123
+ # (ruff-specific) Enable all ruff-specific checks (i.e. not ports of
124
+ # functionality from an existing linter).
125
+ "RUF",
126
+
127
+ # (private member access) Flag access to `_`-prefixed symbols. By default the various special
128
+ # methods on `NamedTuple` are ignored (e.g. `_replace`).
129
+ "SLF001",
130
+
131
+ # (flake8-type-checking) Auto-sort imports into TYPE_CHECKING blocks depending on whether
132
+ # they are runtime or type-only imports.
133
+ "TCH",
134
+
135
+ # (f-strings) use f-strings instead of .format()
136
+ "UP032",
137
+
138
+ # (invalid escape sequence) flag errant backslashes
139
+ "W605",
140
+ ]
requirements.txt DELETED
@@ -1,3 +0,0 @@
1
- altair
2
- pandas
3
- streamlit
 
 
 
 
src/.DS_Store ADDED
Binary file (6.15 kB). View file
 
src/__pycache__/model.cpython-311.pyc ADDED
Binary file (4.1 kB). View file
 
src/app.py ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import tempfile
3
+ import time
4
+ from pathlib import Path
5
+ from shutil import which
6
+
7
+ import streamlit as st
8
+ from PIL import Image
9
+
10
+ from model import *
11
+
12
+
13
+ def main():
14
+ model = YOLOModelv2()
15
+ minimum_confidence_threshold = 0.5
16
+
17
+ st.set_page_config(page_title="SatSense Demo")
18
+ st.title(":satellite: SatSense Demo")
19
+ st.markdown(
20
+ """
21
+ The SatSense demo app simplifies annotating images and videos taken by satellites.
22
+ It employs cutting-edge object detection models to automatically analyze and recognize
23
+ various objects in satellite imagery, including vehicles and ships.
24
+
25
+ #### How to get started
26
+
27
+ 1. **Upload Satellite Imagery:** Use the sidebar to upload your satellite imagery media
28
+ files for analysis.
29
+ 2. **Review Identified Objects:** Explore the annotated objects marked by the model.
30
+
31
+ #### Tips for usage
32
+
33
+ 1. Please clear any existing uploads in the sidebar before uploading a new file.
34
+ 2. For optimal results, please upload clear and high-resolution satellite media files.
35
+ 3. [Location SA Map Viewer](https://location.sa.gov.au/viewer/) provides satellite imagery that can be used as image input.
36
+
37
+ SatSense simplifies the process of annotating satellite imagery and allows you to
38
+ export the annotated media files. Start annotating and discovering objects of interest
39
+ effortlessly!
40
+
41
+ ***Note:** In its current MVP stage, the SatSense demo offers a glimpse into the
42
+ world of automatic object detection in satellite imagery. Your feedback can help shape
43
+ its future improvements!*
44
+ """
45
+ )
46
+
47
+ # Sidebar to set minimum confidence threshold
48
+ st.sidebar.header("Parameters")
49
+ minimum_confidence_threshold = st.sidebar.slider(
50
+ "Minimum confidence threshold",
51
+ min_value=0.0,
52
+ max_value=1.0,
53
+ step=0.1,
54
+ value=minimum_confidence_threshold,
55
+ format="%.1f",
56
+ )
57
+ st.sidebar.markdown("---")
58
+
59
+ # Sidebar for image detection
60
+ st.sidebar.header("Image Detection")
61
+ uploaded_image = st.sidebar.file_uploader(
62
+ "Upload an image", type=["jpg", "jpeg", "png"]
63
+ )
64
+
65
+ st.sidebar.markdown("---")
66
+
67
+ # Sidebar for video detection
68
+ st.sidebar.header("Video Detection")
69
+ uploaded_video = st.sidebar.file_uploader(
70
+ "Upload a video", type=["mp4", "avi", "mov"]
71
+ )
72
+
73
+ if uploaded_image:
74
+ st.markdown("---")
75
+ st.write("")
76
+
77
+ st.markdown("#### Uploaded image")
78
+ image = Image.open(uploaded_image)
79
+ st.image(image, use_column_width=True)
80
+
81
+ st.write("")
82
+ st.write("")
83
+
84
+ with st.spinner("Processing..."):
85
+ annotated_image = model.predict_image(
86
+ image, min_confidence=minimum_confidence_threshold
87
+ )
88
+
89
+ st.markdown("#### Annotated image")
90
+ st.image(annotated_image, use_column_width=True)
91
+
92
+ if uploaded_video:
93
+ st.markdown("---")
94
+ st.write("")
95
+
96
+ temp_dir = tempfile.mkdtemp()
97
+ # Preserve uploaded extension to maximize compatibility with OpenCV/YOLO
98
+ uploaded_ext = Path(uploaded_video.name).suffix.lower() or ".mp4"
99
+ temp_video_path = os.path.join(temp_dir, f"temp_video{uploaded_ext}")
100
+ annotated_dir = "./annotated_video"
101
+ os.makedirs(annotated_dir, exist_ok=True)
102
+ annotated_video_path_input_ext = os.path.join(
103
+ annotated_dir, f"temp_video{uploaded_ext}"
104
+ )
105
+ annotated_video_path_mp4 = os.path.join(annotated_dir, "temp_video.mp4")
106
+
107
+ st.markdown("#### Uploaded video")
108
+ uploaded_video_bytes = uploaded_video.getvalue()
109
+ st.video(uploaded_video_bytes)
110
+
111
+ st.write("")
112
+ st.write("")
113
+
114
+ progress_bar = st.progress(0.3, text="Performing object detection...")
115
+
116
+ with open(temp_video_path, "wb") as video_file:
117
+ video_file.write(uploaded_video.getvalue())
118
+
119
+ model.predict_video(
120
+ temp_video_path,
121
+ min_confidence=minimum_confidence_threshold,
122
+ target_dir_name="annotated_video",
123
+ )
124
+
125
+ final_video_path = annotated_video_path_input_ext
126
+
127
+ # If the annotated output isn't mp4, try converting with ffmpeg if available
128
+ if uploaded_ext != ".mp4":
129
+ progress_bar.progress(0.67, text="Converting video format...")
130
+ if which("ffmpeg"):
131
+ import subprocess
132
+
133
+ try:
134
+ subprocess.run(
135
+ [
136
+ "ffmpeg",
137
+ "-y",
138
+ "-i",
139
+ annotated_video_path_input_ext,
140
+ "-c:v",
141
+ "libx264",
142
+ "-pix_fmt",
143
+ "yuv420p",
144
+ "-crf",
145
+ "23",
146
+ "-preset",
147
+ "veryfast",
148
+ "-an",
149
+ annotated_video_path_mp4,
150
+ ],
151
+ check=True,
152
+ stdout=subprocess.DEVNULL,
153
+ stderr=subprocess.STDOUT,
154
+ )
155
+ final_video_path = annotated_video_path_mp4
156
+ except Exception:
157
+ st.warning(
158
+ "ffmpeg failed to convert the video. Attempting to display original format."
159
+ )
160
+ else:
161
+ st.info(
162
+ "Install ffmpeg to enable conversion to mp4 (e.g. `brew install ffmpeg` on macOS) or use the provided Dockerfile."
163
+ )
164
+
165
+ progress_bar.progress(1.0, text="Done!")
166
+ time.sleep(1)
167
+ progress_bar.empty()
168
+
169
+ st.markdown("#### Annotated video")
170
+ annotated_video_file = open(final_video_path, "rb")
171
+ annotated_video_bytes = annotated_video_file.read()
172
+ # Let Streamlit infer format from the file when possible
173
+ st.video(annotated_video_bytes)
174
+
175
+ st.markdown("---")
176
+ st.markdown("Demo built by [Lucid Insights Pty Ltd](https://lucidinsights.com.au).")
177
+
178
+
179
+ if __name__ == "__main__":
180
+ main()
src/model.py ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from abc import ABC, abstractmethod
2
+
3
+ from PIL import Image
4
+ from ultralytics import YOLO
5
+
6
+
7
+ class BaseModel(ABC):
8
+ @abstractmethod
9
+ def __init__(self):
10
+ pass
11
+
12
+ @abstractmethod
13
+ def predict_image(self, image):
14
+ pass
15
+
16
+ @abstractmethod
17
+ def predict_video(self, video):
18
+ pass
19
+
20
+
21
+ class YOLOModelv1(BaseModel):
22
+ """Model: modelYOLOv8n_datasetDOTAv2_epochs5_batch1.pt"""
23
+
24
+ def __init__(self):
25
+ self.model = YOLO(
26
+ "./models/modelYOLOv8n_datasetDOTAv2_epochs5_batch1.pt", task="detect"
27
+ )
28
+
29
+ def predict_image(self, image, min_confidence):
30
+ results = self.model.predict(image, save=False, imgsz=640, conf=min_confidence)
31
+ annotated_image_filename = "annotated_image.png"
32
+ for result in results:
33
+ im_array = result.plot()
34
+ im = Image.fromarray(im_array[..., ::-1]) # RGB PIL image
35
+ im.save(annotated_image_filename)
36
+ return annotated_image_filename
37
+
38
+ def predict_video(self, video, min_confidence, target_dir_name="annotated_video"):
39
+ self.model.predict(
40
+ video,
41
+ save=True,
42
+ project=".",
43
+ name=target_dir_name,
44
+ exist_ok=True,
45
+ imgsz=640,
46
+ conf=min_confidence,
47
+ )
48
+
49
+
50
+ class YOLOModelv2(BaseModel):
51
+ """Model: modelYOLOv8n_datasetDIOR_epochs50_batch16.pt"""
52
+
53
+ def __init__(self):
54
+ self.model = YOLO(
55
+ "./models/modelYOLOv8n_datasetDIOR_epochs50_batch16.pt", task="detect"
56
+ )
57
+
58
+ def predict_image(self, image, min_confidence, classes=None):
59
+ results = self.model.predict(
60
+ image, save=False, imgsz=800, conf=min_confidence, classes=classes
61
+ )
62
+ annotated_image_filename = "annotated_image.png"
63
+ for result in results:
64
+ im_array = result.plot()
65
+ im = Image.fromarray(im_array[..., ::-1]) # RGB PIL image
66
+ im.save(annotated_image_filename)
67
+ return annotated_image_filename
68
+
69
+ def predict_video(self, video, min_confidence, target_dir_name="annotated_video", classes=None):
70
+ self.model.predict(
71
+ video,
72
+ save=True,
73
+ project=".",
74
+ name=target_dir_name,
75
+ exist_ok=True,
76
+ imgsz=800,
77
+ conf=min_confidence,
78
+ classes=classes,
79
+ )
src/streamlit_app.py DELETED
@@ -1,40 +0,0 @@
1
- import altair as alt
2
- import numpy as np
3
- import pandas as pd
4
- import streamlit as st
5
-
6
- """
7
- # Welcome to Streamlit!
8
-
9
- Edit `/streamlit_app.py` to customize this app to your heart's desire :heart:.
10
- If you have any questions, checkout our [documentation](https://docs.streamlit.io) and [community
11
- forums](https://discuss.streamlit.io).
12
-
13
- In the meantime, below is an example of what you can do with just a few lines of code:
14
- """
15
-
16
- num_points = st.slider("Number of points in spiral", 1, 10000, 1100)
17
- num_turns = st.slider("Number of turns in spiral", 1, 300, 31)
18
-
19
- indices = np.linspace(0, 1, num_points)
20
- theta = 2 * np.pi * num_turns * indices
21
- radius = indices
22
-
23
- x = radius * np.cos(theta)
24
- y = radius * np.sin(theta)
25
-
26
- df = pd.DataFrame({
27
- "x": x,
28
- "y": y,
29
- "idx": indices,
30
- "rand": np.random.randn(num_points),
31
- })
32
-
33
- st.altair_chart(alt.Chart(df, height=700, width=700)
34
- .mark_point(filled=True)
35
- .encode(
36
- x=alt.X("x", axis=None),
37
- y=alt.Y("y", axis=None),
38
- color=alt.Color("idx", legend=None, scale=alt.Scale()),
39
- size=alt.Size("rand", legend=None, scale=alt.Scale(range=[1, 150])),
40
- ))