diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 81ec1b44..bf06b782 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -1502,7 +1502,7 @@ "bzlTransitiveDigest": "WyF2tLBpR8cyete55VmU+AwLC/mhDbnIlEdbVymbm04=", "usagesDigest": "DXk0VBJUK7HdLXJE59BVPG4lCTTPnHGNQg/SH9dTuVE=", "recordedFileInputs": { - "@@//deps/pip/requirements_3_11.txt": "25f80937bc0e6da6757b2896a8b78dc8e3c88776b24e0827bd3f0fb90eb6dc47", + "@@//deps/pip/requirements_3_11.txt": "01687dd0690641cecfe0cfa3a5a8ba2186f65112c34b4ab7b64caa55a416ae56", "@@//deps/pip/requirements_3_8.txt": "94c254d645dc1d0555f48e66fa499aa2efecfc5e547500cd4ed409aee28e8880", "@@rules_fuzzing+//fuzzing/requirements.txt": "ab04664be026b632a0d2a2446c4f65982b7654f5b6851d2f9d399a19b7242a5b", "@@rules_python+//tools/publish/requirements_darwin.txt": "095d4a4f3d639dce831cd493367631cd51b53665292ab20194bac2c0c6458fa8", @@ -2085,6 +2085,60 @@ ] } }, + "ncore_pip_deps_311_cachetools_py3_none_any_9876787e": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "cachetools-7.1.3-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "cachetools==7.1.3", + "sha256": "9876787e2346e20584d5cca236cb5d49d04e7193de91646f230725b2e1e8b804", + "urls": [ + "https://files.pythonhosted.org/packages/68/52/8ff5c1a3b2e821ced9b2998fba3ee29aa4525c0bf51e5ee55dd6f61a4ed5/cachetools-7.1.3-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_cachetools_sdist_135cfe94": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "cachetools-7.1.3.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "cachetools==7.1.3", + "sha256": "135cfe944bc3c1e805505f65dae0bef375a2f96261171ab66c79ef77d0bda39d", + "urls": [ + "https://files.pythonhosted.org/packages/8f/c1/67cfb86aa21144796ff51068326d467fbef8ee42f8d08a3a8a926106cf0c/cachetools-7.1.3.tar.gz" + ] + } + }, "ncore_pip_deps_311_cbor2_cp311_cp311_macosx_11_0_arm64_0485d337": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { @@ -2739,31 +2793,7 @@ ] } }, - "ncore_pip_deps_311_dataclasses_json_py3_none_any_0dbf33f2": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@ncore_pip_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "dataclasses_json-0.6.7-py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "ncore_pip_deps_311", - "requirement": "dataclasses-json==0.6.7", - "sha256": "0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", - "urls": [ - "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl" - ] - } - }, - "ncore_pip_deps_311_dataclasses_json_sdist_b6b3e528": { + "ncore_pip_deps_311_contourpy_cp311_cp311_macosx_10_9_x86_64_3e8b974d": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -2777,23 +2807,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "dataclasses_json-0.6.7.tar.gz", + "filename": "contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "dataclasses-json==0.6.7", - "sha256": "b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", + "requirement": "contourpy==1.3.1", + "sha256": "3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b", "urls": [ - "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz" + "https://files.pythonhosted.org/packages/12/bb/11250d2906ee2e8b466b5f93e6b19d525f3e0254ac8b445b56e618527718/contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl" ] } }, - "ncore_pip_deps_311_debugpy_cp311_cp311_macosx_14_0_universal2_36f48298": { + "ncore_pip_deps_311_contourpy_cp311_cp311_macosx_11_0_arm64_20914c8c": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -2807,17 +2831,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "debugpy-1.8.12-cp311-cp311-macosx_14_0_universal2.whl", + "filename": "contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "debugpy==1.8.12", - "sha256": "36f4829839ef0afdfdd208bb54f4c3d0eea86106d719811681a8627ae2e53dd5", + "requirement": "contourpy==1.3.1", + "sha256": "20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc", "urls": [ - "https://files.pythonhosted.org/packages/af/9f/5b8af282253615296264d4ef62d14a8686f0dcdebb31a669374e22fff0a4/debugpy-1.8.12-cp311-cp311-macosx_14_0_universal2.whl" + "https://files.pythonhosted.org/packages/67/71/1e6e95aee21a500415f5d2dbf037bf4567529b6a4e986594d7026ec5ae90/contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl" ] } }, - "ncore_pip_deps_311_debugpy_cp311_cp311_manylinux_2_5_x86_64_a28ed481": { + "ncore_pip_deps_311_contourpy_cp311_cp311_manylinux_2_17_aarch64_19d40d37": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -2831,17 +2855,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "debugpy-1.8.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "filename": "contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "debugpy==1.8.12", - "sha256": "a28ed481d530e3138553be60991d2d61103ce6da254e51547b79549675f539b7", + "requirement": "contourpy==1.3.1", + "sha256": "19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86", "urls": [ - "https://files.pythonhosted.org/packages/ef/31/f9274dcd3b0f9f7d1e60373c3fa4696a585c55acb30729d313bb9d3bcbd1/debugpy-1.8.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "https://files.pythonhosted.org/packages/31/2c/b88986e8d79ac45efe9d8801ae341525f38e087449b6c2f2e6050468a42c/contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" ] } }, - "ncore_pip_deps_311_debugpy_cp311_cp311_win_amd64_4703575b": { + "ncore_pip_deps_311_contourpy_cp311_cp311_manylinux_2_17_ppc64le_113231fe": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -2855,17 +2879,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "debugpy-1.8.12-cp311-cp311-win_amd64.whl", + "filename": "contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "debugpy==1.8.12", - "sha256": "4703575b78dd697b294f8c65588dc86874ed787b7348c65da70cfc885efdf1e1", + "requirement": "contourpy==1.3.1", + "sha256": "113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6", "urls": [ - "https://files.pythonhosted.org/packages/d5/1a/8ab508ab05ede8a4eae3b139bbc06ea3ca6234f9e8c02713a044f253be5e/debugpy-1.8.12-cp311-cp311-win_amd64.whl" + "https://files.pythonhosted.org/packages/c4/18/65280989b151fcf33a8352f992eff71e61b968bef7432fbfde3a364f0730/contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" ] } }, - "ncore_pip_deps_311_debugpy_py2_none_any_274b6a20": { + "ncore_pip_deps_311_contourpy_cp311_cp311_manylinux_2_17_s390x_4dbbc03a": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -2879,17 +2903,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "debugpy-1.8.12-py2.py3-none-any.whl", + "filename": "contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "debugpy==1.8.12", - "sha256": "274b6a2040349b5c9864e475284bce5bb062e63dce368a394b8cc865ae3b00c6", + "requirement": "contourpy==1.3.1", + "sha256": "4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85", "urls": [ - "https://files.pythonhosted.org/packages/38/c4/5120ad36405c3008f451f94b8f92ef1805b1e516f6ff870f331ccb3c4cc0/debugpy-1.8.12-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/f5/c7/5fd0146c93220dbfe1a2e0f98969293b86ca9bc041d6c90c0e065f4619ad/contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" ] } }, - "ncore_pip_deps_311_debugpy_sdist_646530b0": { + "ncore_pip_deps_311_contourpy_cp311_cp311_manylinux_2_17_x86_64_3a04ecd6": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -2903,23 +2927,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "debugpy-1.8.12.tar.gz", + "filename": "contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "debugpy==1.8.12", - "sha256": "646530b04f45c830ceae8e491ca1c9320a2d2f0efea3141487c82130aba70dce", + "requirement": "contourpy==1.3.1", + "sha256": "3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c", "urls": [ - "https://files.pythonhosted.org/packages/68/25/c74e337134edf55c4dfc9af579eccb45af2393c40960e2795a94351e8140/debugpy-1.8.12.tar.gz" + "https://files.pythonhosted.org/packages/85/fc/7fa5d17daf77306840a4e84668a48ddff09e6bc09ba4e37e85ffc8e4faa3/contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" ] } }, - "ncore_pip_deps_311_decorator_py3_none_any_d316bb41": { + "ncore_pip_deps_311_contourpy_cp311_cp311_musllinux_1_2_aarch64_c414fc1e": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -2933,17 +2951,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "decorator-5.2.1-py3-none-any.whl", + "filename": "contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "decorator==5.2.1", - "sha256": "d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", + "requirement": "contourpy==1.3.1", + "sha256": "c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291", "urls": [ - "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/ef/e7/104065c8270c7397c9571620d3ab880558957216f2b5ebb7e040f85eeb22/contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl" ] } }, - "ncore_pip_deps_311_decorator_sdist_65f26614": { + "ncore_pip_deps_311_contourpy_cp311_cp311_musllinux_1_2_x86_64_31c1b55c": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -2957,23 +2975,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "decorator-5.2.1.tar.gz", + "filename": "contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "decorator==5.2.1", - "sha256": "65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", + "requirement": "contourpy==1.3.1", + "sha256": "31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f", "urls": [ - "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz" + "https://files.pythonhosted.org/packages/e2/4a/c788d0bdbf32c8113c2354493ed291f924d4793c4a2e85b69e737a21a658/contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl" ] } }, - "ncore_pip_deps_311_defusedxml_py2_none_any_a352e7e4": { + "ncore_pip_deps_311_contourpy_cp311_cp311_win_amd64_b2bdca22": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -2987,17 +2999,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "defusedxml-0.7.1-py2.py3-none-any.whl", + "filename": "contourpy-1.3.1-cp311-cp311-win_amd64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "defusedxml==0.7.1", - "sha256": "a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", + "requirement": "contourpy==1.3.1", + "sha256": "b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9", "urls": [ - "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/a8/7e/cd93cab453720a5d6cb75588cc17dcdc08fc3484b9de98b885924ff61900/contourpy-1.3.1-cp311-cp311-win_amd64.whl" ] } }, - "ncore_pip_deps_311_defusedxml_sdist_1bb3032d": { + "ncore_pip_deps_311_contourpy_sdist_dfd97abd": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3017,17 +3029,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "defusedxml-0.7.1.tar.gz", + "filename": "contourpy-1.3.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "defusedxml==0.7.1", - "sha256": "1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", + "requirement": "contourpy==1.3.1", + "sha256": "dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", "urls": [ - "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz" + "https://files.pythonhosted.org/packages/25/c2/fc7193cc5383637ff390a712e88e4ded0452c9fbcf84abe3de5ea3df1866/contourpy-1.3.1.tar.gz" ] } }, - "ncore_pip_deps_311_deprecated_py2_none_any_bd501178": { + "ncore_pip_deps_311_cycler_py3_none_any_85cef7cf": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3041,17 +3053,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "Deprecated-1.2.18-py2.py3-none-any.whl", + "filename": "cycler-0.12.1-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "deprecated==1.2.18", - "sha256": "bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", + "requirement": "cycler==0.12.1", + "sha256": "85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", "urls": [ - "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_deprecated_sdist_422b6f6d": { + "ncore_pip_deps_311_cycler_sdist_88bb128f": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3071,17 +3083,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "deprecated-1.2.18.tar.gz", + "filename": "cycler-0.12.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "deprecated==1.2.18", - "sha256": "422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", + "requirement": "cycler==0.12.1", + "sha256": "88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", "urls": [ - "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz" + "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz" ] } }, - "ncore_pip_deps_311_docutils_py3_none_any_d0013f54": { + "ncore_pip_deps_311_dataclasses_json_py3_none_any_0dbf33f2": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3095,17 +3107,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "docutils-0.22.4-py3-none-any.whl", + "filename": "dataclasses_json-0.6.7-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "docutils==0.22.4", - "sha256": "d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", + "requirement": "dataclasses-json==0.6.7", + "sha256": "0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", "urls": [ - "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl" + "https://files.pythonhosted.org/packages/c3/be/d0d44e092656fe7a06b55e6103cbce807cdbdee17884a5367c68c9860853/dataclasses_json-0.6.7-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_docutils_sdist_4db53b1f": { + "ncore_pip_deps_311_dataclasses_json_sdist_b6b3e528": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3125,17 +3137,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "docutils-0.22.4.tar.gz", + "filename": "dataclasses_json-0.6.7.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "docutils==0.22.4", - "sha256": "4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", + "requirement": "dataclasses-json==0.6.7", + "sha256": "b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0", "urls": [ - "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz" + "https://files.pythonhosted.org/packages/64/a4/f71d9cf3a5ac257c993b5ca3f93df5f7fb395c725e7f1e6479d2514173c3/dataclasses_json-0.6.7.tar.gz" ] } }, - "ncore_pip_deps_311_dracopy_cp311_cp311_macosx_10_9_x86_64_c4131151": { + "ncore_pip_deps_311_debugpy_cp311_cp311_macosx_14_0_universal2_36f48298": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3149,17 +3161,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "dracopy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", + "filename": "debugpy-1.8.12-cp311-cp311-macosx_14_0_universal2.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "dracopy==2.0.0", - "sha256": "c41311512caee19e6c4ea1eded3895cfa557984a878aa3e4a96b8cf44e769325", + "requirement": "debugpy==1.8.12", + "sha256": "36f4829839ef0afdfdd208bb54f4c3d0eea86106d719811681a8627ae2e53dd5", "urls": [ - "https://files.pythonhosted.org/packages/a9/98/79ab63a4e4b4114e7dde47e52c12718952c0d5e06c6e2e63020902378f95/dracopy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl" + "https://files.pythonhosted.org/packages/af/9f/5b8af282253615296264d4ef62d14a8686f0dcdebb31a669374e22fff0a4/debugpy-1.8.12-cp311-cp311-macosx_14_0_universal2.whl" ] } }, - "ncore_pip_deps_311_dracopy_cp311_cp311_macosx_11_0_arm64_e16575ab": { + "ncore_pip_deps_311_debugpy_cp311_cp311_manylinux_2_5_x86_64_a28ed481": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3173,17 +3185,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "dracopy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", + "filename": "debugpy-1.8.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "dracopy==2.0.0", - "sha256": "e16575abfe1ba2d21c55641b425e6238ee87637256fe573021b4ba8fa450028f", + "requirement": "debugpy==1.8.12", + "sha256": "a28ed481d530e3138553be60991d2d61103ce6da254e51547b79549675f539b7", "urls": [ - "https://files.pythonhosted.org/packages/8e/29/cf35fcc673f8fd2cb094cf8f1368894818eaa80ead18b9fc1e526c8bee43/dracopy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl" + "https://files.pythonhosted.org/packages/ef/31/f9274dcd3b0f9f7d1e60373c3fa4696a585c55acb30729d313bb9d3bcbd1/debugpy-1.8.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" ] } }, - "ncore_pip_deps_311_dracopy_cp311_cp311_manylinux_2_24_aarch64_418964da": { + "ncore_pip_deps_311_debugpy_cp311_cp311_win_amd64_4703575b": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3197,17 +3209,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "dracopy-2.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", + "filename": "debugpy-1.8.12-cp311-cp311-win_amd64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "dracopy==2.0.0", - "sha256": "418964da7c21f6c3583a3c3113da8afe25efeb77dd80de441ab4efe4f7960d62", + "requirement": "debugpy==1.8.12", + "sha256": "4703575b78dd697b294f8c65588dc86874ed787b7348c65da70cfc885efdf1e1", "urls": [ - "https://files.pythonhosted.org/packages/46/8a/d24295229fd2ba12d3b08cc332d175d929fedca625a517a4f6e598429705/dracopy-2.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" + "https://files.pythonhosted.org/packages/d5/1a/8ab508ab05ede8a4eae3b139bbc06ea3ca6234f9e8c02713a044f253be5e/debugpy-1.8.12-cp311-cp311-win_amd64.whl" ] } }, - "ncore_pip_deps_311_dracopy_cp311_cp311_manylinux_2_24_x86_64_fa9a3215": { + "ncore_pip_deps_311_debugpy_py2_none_any_274b6a20": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3221,17 +3233,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "dracopy-2.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", + "filename": "debugpy-1.8.12-py2.py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "dracopy==2.0.0", - "sha256": "fa9a32159669f4291c5e37775b26beb36fac2164afce64d883d6a8f96a32e88e", + "requirement": "debugpy==1.8.12", + "sha256": "274b6a2040349b5c9864e475284bce5bb062e63dce368a394b8cc865ae3b00c6", "urls": [ - "https://files.pythonhosted.org/packages/d0/b7/e67c59d8a2e4f9362c5c07353818c85125821c0f32ab97f2536a7a1f5e98/dracopy-2.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" + "https://files.pythonhosted.org/packages/38/c4/5120ad36405c3008f451f94b8f92ef1805b1e516f6ff870f331ccb3c4cc0/debugpy-1.8.12-py2.py3-none-any.whl" ] } }, - "ncore_pip_deps_311_dracopy_cp311_cp311_win_amd64_106c968f": { + "ncore_pip_deps_311_debugpy_sdist_646530b0": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3245,17 +3257,23 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "dracopy-2.0.0-cp311-cp311-win_amd64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "debugpy-1.8.12.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "dracopy==2.0.0", - "sha256": "106c968fd20fd0d46eab5d3c624db55f5b1dade504c9ae31879459e350d7cf44", + "requirement": "debugpy==1.8.12", + "sha256": "646530b04f45c830ceae8e491ca1c9320a2d2f0efea3141487c82130aba70dce", "urls": [ - "https://files.pythonhosted.org/packages/9d/3f/baac5aa88aab4117f9f74b892366bb336c9d682588cda11e71b7abc0a930/dracopy-2.0.0-cp311-cp311-win_amd64.whl" + "https://files.pythonhosted.org/packages/68/25/c74e337134edf55c4dfc9af579eccb45af2393c40960e2795a94351e8140/debugpy-1.8.12.tar.gz" ] } }, - "ncore_pip_deps_311_embreex_cp311_cp311_macosx_10_9_x86_64_8154ab34": { + "ncore_pip_deps_311_decorator_py3_none_any_d316bb41": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3269,17 +3287,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "embreex-2.17.7.post7-cp311-cp311-macosx_10_9_x86_64.whl", + "filename": "decorator-5.2.1-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "embreex==2.17.7.post7", - "sha256": "8154ab34c7d6c3db01b988a83dbccb1feeb3f5d743c2ce0c34cfcc10d5472f22", + "requirement": "decorator==5.2.1", + "sha256": "d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", "urls": [ - "https://files.pythonhosted.org/packages/bd/f5/222bae96165a6bd8c855ba434124daeb8aa4f4b021266ee13f2b485cb873/embreex-2.17.7.post7-cp311-cp311-macosx_10_9_x86_64.whl" + "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_embreex_cp311_cp311_manylinux_2_12_x86_64_c4775a4d": { + "ncore_pip_deps_311_decorator_sdist_65f26614": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3293,17 +3311,23 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "embreex-2.17.7.post7-cp311-cp311-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "decorator-5.2.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "embreex==2.17.7.post7", - "sha256": "c4775a4d01f357c7a29ed7843ec811d59c778149f5fd4fdca2f3f42dc6ff45b6", + "requirement": "decorator==5.2.1", + "sha256": "65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", "urls": [ - "https://files.pythonhosted.org/packages/60/10/c66c023923ca038d3081bf62e6a92ddefbd780e5ce0b7d5383abf10dc30f/embreex-2.17.7.post7-cp311-cp311-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl" + "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz" ] } }, - "ncore_pip_deps_311_embreex_cp311_cp311_win_amd64_a1157976": { + "ncore_pip_deps_311_defusedxml_py2_none_any_a352e7e4": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3317,41 +3341,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "embreex-2.17.7.post7-cp311-cp311-win_amd64.whl", + "filename": "defusedxml-0.7.1-py2.py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "embreex==2.17.7.post7", - "sha256": "a1157976d410fd56162cda5e7e0569dbea958235a76a603170c96dba47e049bb", + "requirement": "defusedxml==0.7.1", + "sha256": "a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", "urls": [ - "https://files.pythonhosted.org/packages/20/65/479b6c4a795408484649c7d4e52557b13225f83c02d8adf91d810336a9fa/embreex-2.17.7.post7-cp311-cp311-win_amd64.whl" - ] - } - }, - "ncore_pip_deps_311_executing_py2_none_any_11387150": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@ncore_pip_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "executing-2.2.0-py2.py3-none-any.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "ncore_pip_deps_311", - "requirement": "executing==2.2.0", - "sha256": "11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", - "urls": [ - "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl" ] } }, - "ncore_pip_deps_311_executing_sdist_5d108c02": { + "ncore_pip_deps_311_defusedxml_sdist_1bb3032d": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3371,17 +3371,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "executing-2.2.0.tar.gz", + "filename": "defusedxml-0.7.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "executing==2.2.0", - "sha256": "5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", + "requirement": "defusedxml==0.7.1", + "sha256": "1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", "urls": [ - "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz" + "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz" ] } }, - "ncore_pip_deps_311_fasteners_py3_none_any_758819cb": { + "ncore_pip_deps_311_deprecated_py2_none_any_bd501178": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3395,17 +3395,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "fasteners-0.19-py3-none-any.whl", + "filename": "Deprecated-1.2.18-py2.py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "fasteners==0.19", - "sha256": "758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", + "requirement": "deprecated==1.2.18", + "sha256": "bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", "urls": [ - "https://files.pythonhosted.org/packages/61/bf/fd60001b3abc5222d8eaa4a204cd8c0ae78e75adc688f33ce4bf25b7fafa/fasteners-0.19-py3-none-any.whl" + "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl" ] } }, - "ncore_pip_deps_311_fasteners_sdist_b4f37c3a": { + "ncore_pip_deps_311_deprecated_sdist_422b6f6d": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3425,17 +3425,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "fasteners-0.19.tar.gz", + "filename": "deprecated-1.2.18.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "fasteners==0.19", - "sha256": "b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c", + "requirement": "deprecated==1.2.18", + "sha256": "422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", "urls": [ - "https://files.pythonhosted.org/packages/5f/d4/e834d929be54bfadb1f3e3b931c38e956aaa3b235a46a3c764c26c774902/fasteners-0.19.tar.gz" + "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz" ] } }, - "ncore_pip_deps_311_fastjsonschema_py3_none_any_c9e5b7e9": { + "ncore_pip_deps_311_descartes_py2_none_any_b7e412e7": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3449,17 +3449,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "fastjsonschema-2.21.1-py3-none-any.whl", + "filename": "descartes-1.1.0-py2-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "fastjsonschema==2.21.1", - "sha256": "c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", + "requirement": "descartes==1.1.0", + "sha256": "b7e412e7e6e294412f1d0f661f187babc970088c2456089e6801eebb043c2e1b", "urls": [ - "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/e7/29/b23b57c92a1cf58da25070c10cab90fb38de22523ef7bdc76acdad717645/descartes-1.1.0-py2-none-any.whl" ] } }, - "ncore_pip_deps_311_fastjsonschema_sdist_794d4f0a": { + "ncore_pip_deps_311_descartes_sdist_135a5021": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3479,17 +3479,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "fastjsonschema-2.21.1.tar.gz", + "filename": "descartes-1.1.0.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "fastjsonschema==2.21.1", - "sha256": "794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", + "requirement": "descartes==1.1.0", + "sha256": "135a502146af5ed6ff359975e2ebc5fa4b71b5432c355c2cafdc6dea1337035b", "urls": [ - "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz" + "https://files.pythonhosted.org/packages/1d/6f/81735a30432b74f41db6754dd13869021ccfed3088d1cf7a6cfc0af9ac49/descartes-1.1.0.tar.gz" ] } }, - "ncore_pip_deps_311_filelock_py3_none_any_96f5f634": { + "ncore_pip_deps_311_docutils_py3_none_any_d0013f54": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3503,17 +3503,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "filelock-3.29.0-py3-none-any.whl", + "filename": "docutils-0.22.4-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "filelock==3.29.0", - "sha256": "96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258", + "requirement": "docutils==0.22.4", + "sha256": "d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", "urls": [ - "https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_filelock_sdist_69974355": { + "ncore_pip_deps_311_docutils_sdist_4db53b1f": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3533,17 +3533,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "filelock-3.29.0.tar.gz", + "filename": "docutils-0.22.4.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "filelock==3.29.0", - "sha256": "69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90", + "requirement": "docutils==0.22.4", + "sha256": "4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", "urls": [ - "https://files.pythonhosted.org/packages/b5/fe/997687a931ab51049acce6fa1f23e8f01216374ea81374ddee763c493db5/filelock-3.29.0.tar.gz" + "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz" ] } }, - "ncore_pip_deps_311_flatbuffers_py2_none_any_7634f50c": { + "ncore_pip_deps_311_dracopy_cp311_cp311_macosx_10_9_x86_64_c4131151": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3557,17 +3557,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "flatbuffers-25.12.19-py2.py3-none-any.whl", + "filename": "dracopy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "flatbuffers==25.12.19", - "sha256": "7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", + "requirement": "dracopy==2.0.0", + "sha256": "c41311512caee19e6c4ea1eded3895cfa557984a878aa3e4a96b8cf44e769325", "urls": [ - "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/a9/98/79ab63a4e4b4114e7dde47e52c12718952c0d5e06c6e2e63020902378f95/dracopy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl" ] } }, - "ncore_pip_deps_311_fsspec_py3_none_any_7c771235": { + "ncore_pip_deps_311_dracopy_cp311_cp311_macosx_11_0_arm64_e16575ab": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3581,17 +3581,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "fsspec-2025.10.0-py3-none-any.whl", + "filename": "dracopy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "fsspec==2025.10.0", - "sha256": "7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d", + "requirement": "dracopy==2.0.0", + "sha256": "e16575abfe1ba2d21c55641b425e6238ee87637256fe573021b4ba8fa450028f", "urls": [ - "https://files.pythonhosted.org/packages/eb/02/a6b21098b1d5d6249b7c5ab69dde30108a71e4e819d4a9778f1de1d5b70d/fsspec-2025.10.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/8e/29/cf35fcc673f8fd2cb094cf8f1368894818eaa80ead18b9fc1e526c8bee43/dracopy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl" ] } }, - "ncore_pip_deps_311_fsspec_sdist_b6789427": { + "ncore_pip_deps_311_dracopy_cp311_cp311_manylinux_2_24_aarch64_418964da": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3605,23 +3605,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "fsspec-2025.10.0.tar.gz", + "filename": "dracopy-2.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "fsspec==2025.10.0", - "sha256": "b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59", + "requirement": "dracopy==2.0.0", + "sha256": "418964da7c21f6c3583a3c3113da8afe25efeb77dd80de441ab4efe4f7960d62", "urls": [ - "https://files.pythonhosted.org/packages/24/7f/2747c0d332b9acfa75dc84447a066fdf812b5a6b8d30472b74d309bfe8cb/fsspec-2025.10.0.tar.gz" + "https://files.pythonhosted.org/packages/46/8a/d24295229fd2ba12d3b08cc332d175d929fedca625a517a4f6e598429705/dracopy-2.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl" ] } }, - "ncore_pip_deps_311_gast_py3_none_any_52b18231": { + "ncore_pip_deps_311_dracopy_cp311_cp311_manylinux_2_24_x86_64_fa9a3215": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3635,17 +3629,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "gast-0.6.0-py3-none-any.whl", + "filename": "dracopy-2.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "gast==0.6.0", - "sha256": "52b182313f7330389f72b069ba00f174cfe2a06411099547288839c6cbafbd54", + "requirement": "dracopy==2.0.0", + "sha256": "fa9a32159669f4291c5e37775b26beb36fac2164afce64d883d6a8f96a32e88e", "urls": [ - "https://files.pythonhosted.org/packages/a3/61/8001b38461d751cd1a0c3a6ae84346796a5758123f3ed97a1b121dfbf4f3/gast-0.6.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/d0/b7/e67c59d8a2e4f9362c5c07353818c85125821c0f32ab97f2536a7a1f5e98/dracopy-2.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl" ] } }, - "ncore_pip_deps_311_gast_sdist_88fc5300": { + "ncore_pip_deps_311_dracopy_cp311_cp311_win_amd64_106c968f": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3659,23 +3653,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "gast-0.6.0.tar.gz", + "filename": "dracopy-2.0.0-cp311-cp311-win_amd64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "gast==0.6.0", - "sha256": "88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb", + "requirement": "dracopy==2.0.0", + "sha256": "106c968fd20fd0d46eab5d3c624db55f5b1dade504c9ae31879459e350d7cf44", "urls": [ - "https://files.pythonhosted.org/packages/3c/14/c566f5ca00c115db7725263408ff952b8ae6d6a4e792ef9c84e77d9af7a1/gast-0.6.0.tar.gz" + "https://files.pythonhosted.org/packages/9d/3f/baac5aa88aab4117f9f74b892366bb336c9d682588cda11e71b7abc0a930/dracopy-2.0.0-cp311-cp311-win_amd64.whl" ] } }, - "ncore_pip_deps_311_google_pasta_py3_none_any_b3248279": { + "ncore_pip_deps_311_embreex_cp311_cp311_macosx_10_9_x86_64_8154ab34": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3689,17 +3677,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "google_pasta-0.2.0-py3-none-any.whl", + "filename": "embreex-2.17.7.post7-cp311-cp311-macosx_10_9_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "google-pasta==0.2.0", - "sha256": "b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", + "requirement": "embreex==2.17.7.post7", + "sha256": "8154ab34c7d6c3db01b988a83dbccb1feeb3f5d743c2ce0c34cfcc10d5472f22", "urls": [ - "https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/bd/f5/222bae96165a6bd8c855ba434124daeb8aa4f4b021266ee13f2b485cb873/embreex-2.17.7.post7-cp311-cp311-macosx_10_9_x86_64.whl" ] } }, - "ncore_pip_deps_311_google_pasta_sdist_c9f2c8df": { + "ncore_pip_deps_311_embreex_cp311_cp311_manylinux_2_12_x86_64_c4775a4d": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3713,23 +3701,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "google-pasta-0.2.0.tar.gz", + "filename": "embreex-2.17.7.post7-cp311-cp311-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "google-pasta==0.2.0", - "sha256": "c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e", + "requirement": "embreex==2.17.7.post7", + "sha256": "c4775a4d01f357c7a29ed7843ec811d59c778149f5fd4fdca2f3f42dc6ff45b6", "urls": [ - "https://files.pythonhosted.org/packages/35/4a/0bd53b36ff0323d10d5f24ebd67af2de10a1117f5cf4d7add90df92756f1/google-pasta-0.2.0.tar.gz" + "https://files.pythonhosted.org/packages/60/10/c66c023923ca038d3081bf62e6a92ddefbd780e5ce0b7d5383abf10dc30f/embreex-2.17.7.post7-cp311-cp311-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl" ] } }, - "ncore_pip_deps_311_grpcio_cp311_cp311_linux_armv7l_17325b0b": { + "ncore_pip_deps_311_embreex_cp311_cp311_win_amd64_a1157976": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3743,17 +3725,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "grpcio-1.70.0-cp311-cp311-linux_armv7l.whl", + "filename": "embreex-2.17.7.post7-cp311-cp311-win_amd64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "grpcio==1.70.0", - "sha256": "17325b0be0c068f35770f944124e8839ea3185d6d54862800fc28cc2ffad205a", + "requirement": "embreex==2.17.7.post7", + "sha256": "a1157976d410fd56162cda5e7e0569dbea958235a76a603170c96dba47e049bb", "urls": [ - "https://files.pythonhosted.org/packages/65/c4/1f67d23d6bcadd2fd61fb460e5969c52b3390b4a4e254b5e04a6d1009e5e/grpcio-1.70.0-cp311-cp311-linux_armv7l.whl" + "https://files.pythonhosted.org/packages/20/65/479b6c4a795408484649c7d4e52557b13225f83c02d8adf91d810336a9fa/embreex-2.17.7.post7-cp311-cp311-win_amd64.whl" ] } }, - "ncore_pip_deps_311_grpcio_cp311_cp311_macosx_10_14_universal2_dbe41ad1": { + "ncore_pip_deps_311_executing_py2_none_any_11387150": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3767,17 +3749,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "grpcio-1.70.0-cp311-cp311-macosx_10_14_universal2.whl", + "filename": "executing-2.2.0-py2.py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "grpcio==1.70.0", - "sha256": "dbe41ad140df911e796d4463168e33ef80a24f5d21ef4d1e310553fcd2c4a386", + "requirement": "executing==2.2.0", + "sha256": "11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", "urls": [ - "https://files.pythonhosted.org/packages/e4/bd/cc36811c582d663a740fb45edf9f99ddbd99a10b6ba38267dc925e1e193a/grpcio-1.70.0-cp311-cp311-macosx_10_14_universal2.whl" + "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl" ] } }, - "ncore_pip_deps_311_grpcio_cp311_cp311_manylinux_2_17_aarch64_5ea67c72": { + "ncore_pip_deps_311_executing_sdist_5d108c02": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3791,17 +3773,23 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "grpcio-1.70.0-cp311-cp311-manylinux_2_17_aarch64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "executing-2.2.0.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "grpcio==1.70.0", - "sha256": "5ea67c72101d687d44d9c56068328da39c9ccba634cabb336075fae2eab0d04b", + "requirement": "executing==2.2.0", + "sha256": "5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", "urls": [ - "https://files.pythonhosted.org/packages/7e/32/8538bb2ace5cd72da7126d1c9804bf80b4fe3be70e53e2d55675c24961a8/grpcio-1.70.0-cp311-cp311-manylinux_2_17_aarch64.whl" + "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz" ] } }, - "ncore_pip_deps_311_grpcio_cp311_cp311_manylinux_2_17_x86_64_e7831a0f": { + "ncore_pip_deps_311_fasteners_py3_none_any_758819cb": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3815,17 +3803,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "grpcio-1.70.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "filename": "fasteners-0.19-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "grpcio==1.70.0", - "sha256": "e7831a0fc1beeeb7759f737f5acd9fdcda520e955049512d68fda03d91186eea", + "requirement": "fasteners==0.19", + "sha256": "758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", "urls": [ - "https://files.pythonhosted.org/packages/9f/e5/5316b239380b8b2ad30373eb5bb25d9fd36c0375e94a98a0a60ea357d254/grpcio-1.70.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "https://files.pythonhosted.org/packages/61/bf/fd60001b3abc5222d8eaa4a204cd8c0ae78e75adc688f33ce4bf25b7fafa/fasteners-0.19-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_grpcio_cp311_cp311_musllinux_1_1_x86_64_d6376496": { + "ncore_pip_deps_311_fasteners_sdist_b4f37c3a": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3839,17 +3827,23 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "grpcio-1.70.0-cp311-cp311-musllinux_1_1_x86_64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "fasteners-0.19.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "grpcio==1.70.0", - "sha256": "d63764963412e22f0491d0d32833d71087288f4e24cbcddbae82476bfa1d81fd", + "requirement": "fasteners==0.19", + "sha256": "b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c", "urls": [ - "https://files.pythonhosted.org/packages/4c/c4/684d877517e5bfd6232d79107e5a1151b835e9f99051faef51fed3359ec4/grpcio-1.70.0-cp311-cp311-musllinux_1_1_x86_64.whl" + "https://files.pythonhosted.org/packages/5f/d4/e834d929be54bfadb1f3e3b931c38e956aaa3b235a46a3c764c26c774902/fasteners-0.19.tar.gz" ] } }, - "ncore_pip_deps_311_grpcio_cp311_cp311_win_amd64_d24035d4": { + "ncore_pip_deps_311_fastjsonschema_py3_none_any_c9e5b7e9": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3863,17 +3857,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "grpcio-1.70.0-cp311-cp311-win_amd64.whl", + "filename": "fastjsonschema-2.21.1-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "grpcio==1.70.0", - "sha256": "d24035d49e026353eb042bf7b058fb831db3e06d52bee75c5f2f3ab453e71aca", + "requirement": "fastjsonschema==2.21.1", + "sha256": "c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", "urls": [ - "https://files.pythonhosted.org/packages/55/15/b6cf2c9515c028aff9da6984761a3ab484a472b0dc6435fcd07ced42127d/grpcio-1.70.0-cp311-cp311-win_amd64.whl" + "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_grpcio_sdist_8d1584a6": { + "ncore_pip_deps_311_fastjsonschema_sdist_794d4f0a": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3893,13 +3887,703 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "grpcio-1.70.0.tar.gz", + "filename": "fastjsonschema-2.21.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "grpcio==1.70.0", - "sha256": "8d1584a68d5922330025881e63a6c1b54cc8117291d382e4fa69339b6d914c56", + "requirement": "fastjsonschema==2.21.1", + "sha256": "794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", "urls": [ - "https://files.pythonhosted.org/packages/69/e1/4b21b5017c33f3600dcc32b802bb48fe44a4d36d6c066f52650c7c2690fa/grpcio-1.70.0.tar.gz" + "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz" + ] + } + }, + "ncore_pip_deps_311_filelock_py3_none_any_96f5f634": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "filelock-3.29.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "filelock==3.29.0", + "sha256": "96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258", + "urls": [ + "https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_filelock_sdist_69974355": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "filelock-3.29.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "filelock==3.29.0", + "sha256": "69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90", + "urls": [ + "https://files.pythonhosted.org/packages/b5/fe/997687a931ab51049acce6fa1f23e8f01216374ea81374ddee763c493db5/filelock-3.29.0.tar.gz" + ] + } + }, + "ncore_pip_deps_311_fire_py3_none_any_e43fd8a5": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "fire-0.7.1-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fire==0.7.1", + "sha256": "e43fd8a5033a9001e7e2973bab96070694b9f12f2e0ecf96d4683971b5ab1882", + "urls": [ + "https://files.pythonhosted.org/packages/e5/4c/93d0f85318da65923e4b91c1c2ff03d8a458cbefebe3bc612a6693c7906d/fire-0.7.1-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_fire_sdist_3b208f05": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "fire-0.7.1.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fire==0.7.1", + "sha256": "3b208f05c736de98fb343310d090dcc4d8c78b2a89ea4f32b837c586270a9cbf", + "urls": [ + "https://files.pythonhosted.org/packages/c0/00/f8d10588d2019d6d6452653def1ee807353b21983db48550318424b5ff18/fire-0.7.1.tar.gz" + ] + } + }, + "ncore_pip_deps_311_flatbuffers_py2_none_any_7634f50c": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "flatbuffers-25.12.19-py2.py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "flatbuffers==25.12.19", + "sha256": "7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4", + "urls": [ + "https://files.pythonhosted.org/packages/e8/2d/d2a548598be01649e2d46231d151a6c56d10b964d94043a335ae56ea2d92/flatbuffers-25.12.19-py2.py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_fonttools_cp311_cp311_macosx_10_9_universal2_7ef04bc7": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "fonttools-4.56.0-cp311-cp311-macosx_10_9_universal2.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fonttools==4.56.0", + "sha256": "7ef04bc7827adb7532be3d14462390dd71287644516af3f1e67f1e6ff9c6d6df", + "urls": [ + "https://files.pythonhosted.org/packages/35/56/a2f3e777d48fcae7ecd29de4d96352d84e5ea9871e5f3fc88241521572cf/fonttools-4.56.0-cp311-cp311-macosx_10_9_universal2.whl" + ] + } + }, + "ncore_pip_deps_311_fonttools_cp311_cp311_macosx_10_9_x86_64_ffda9b8c": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "fonttools-4.56.0-cp311-cp311-macosx_10_9_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fonttools==4.56.0", + "sha256": "ffda9b8cd9cb8b301cae2602ec62375b59e2e2108a117746f12215145e3f786c", + "urls": [ + "https://files.pythonhosted.org/packages/71/85/d483e9c4e5ed586b183bf037a353e8d766366b54fd15519b30e6178a6a6e/fonttools-4.56.0-cp311-cp311-macosx_10_9_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_fonttools_cp311_cp311_manylinux_2_17_aarch64_e2e993e8": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "fonttools-4.56.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fonttools==4.56.0", + "sha256": "e2e993e8db36306cc3f1734edc8ea67906c55f98683d6fd34c3fc5593fdbba4c", + "urls": [ + "https://files.pythonhosted.org/packages/09/67/060473b832b2fade03c127019794df6dc02d9bc66fa4210b8e0d8a99d1e5/fonttools-4.56.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "ncore_pip_deps_311_fonttools_cp311_cp311_manylinux_2_17_x86_64_003548ea": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "fonttools-4.56.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fonttools==4.56.0", + "sha256": "003548eadd674175510773f73fb2060bb46adb77c94854af3e0cc5bc70260049", + "urls": [ + "https://files.pythonhosted.org/packages/28/e9/47c02d5a7027e8ed841ab6a10ca00c93dadd5f16742f1af1fa3f9978adf4/fonttools-4.56.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_fonttools_cp311_cp311_musllinux_1_2_aarch64_bd982582": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "fonttools-4.56.0-cp311-cp311-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fonttools==4.56.0", + "sha256": "bd9825822e7bb243f285013e653f6741954d8147427aaa0324a862cdbf4cbf62", + "urls": [ + "https://files.pythonhosted.org/packages/bf/8a/221d456d1afb8ca043cfd078f59f187ee5d0a580f4b49351b9ce95121f57/fonttools-4.56.0-cp311-cp311-musllinux_1_2_aarch64.whl" + ] + } + }, + "ncore_pip_deps_311_fonttools_cp311_cp311_musllinux_1_2_x86_64_b23d30a2": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "fonttools-4.56.0-cp311-cp311-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fonttools==4.56.0", + "sha256": "b23d30a2c0b992fb1c4f8ac9bfde44b5586d23457759b6cf9a787f1a35179ee0", + "urls": [ + "https://files.pythonhosted.org/packages/a4/8c/e503863adf7a6aeff7b960e2f66fa44dd0c29a7a8b79765b2821950d7b05/fonttools-4.56.0-cp311-cp311-musllinux_1_2_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_fonttools_cp311_cp311_win_amd64_14a3e3e6": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "fonttools-4.56.0-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fonttools==4.56.0", + "sha256": "14a3e3e6b211660db54ca1ef7006401e4a694e53ffd4553ab9bc87ead01d0f05", + "urls": [ + "https://files.pythonhosted.org/packages/3b/90/4926e653041c4116ecd43e50e3c79f5daae6dcafc58ceb64bc4f71dd4924/fonttools-4.56.0-cp311-cp311-win_amd64.whl" + ] + } + }, + "ncore_pip_deps_311_fonttools_py3_none_any_1088182f": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "fonttools-4.56.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fonttools==4.56.0", + "sha256": "1088182f68c303b50ca4dc0c82d42083d176cba37af1937e1a976a31149d4d14", + "urls": [ + "https://files.pythonhosted.org/packages/bf/ff/44934a031ce5a39125415eb405b9efb76fe7f9586b75291d66ae5cbfc4e6/fonttools-4.56.0-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_fonttools_sdist_a114d156": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "fonttools-4.56.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fonttools==4.56.0", + "sha256": "a114d1567e1a1586b7e9e7fc2ff686ca542a82769a296cef131e4c4af51e58f4", + "urls": [ + "https://files.pythonhosted.org/packages/1c/8c/9ffa2a555af0e5e5d0e2ed7fdd8c9bef474ed676995bb4c57c9cd0014248/fonttools-4.56.0.tar.gz" + ] + } + }, + "ncore_pip_deps_311_fsspec_py3_none_any_7c771235": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "fsspec-2025.10.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fsspec==2025.10.0", + "sha256": "7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d", + "urls": [ + "https://files.pythonhosted.org/packages/eb/02/a6b21098b1d5d6249b7c5ab69dde30108a71e4e819d4a9778f1de1d5b70d/fsspec-2025.10.0-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_fsspec_sdist_b6789427": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "fsspec-2025.10.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "fsspec==2025.10.0", + "sha256": "b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59", + "urls": [ + "https://files.pythonhosted.org/packages/24/7f/2747c0d332b9acfa75dc84447a066fdf812b5a6b8d30472b74d309bfe8cb/fsspec-2025.10.0.tar.gz" + ] + } + }, + "ncore_pip_deps_311_gast_py3_none_any_52b18231": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "gast-0.6.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "gast==0.6.0", + "sha256": "52b182313f7330389f72b069ba00f174cfe2a06411099547288839c6cbafbd54", + "urls": [ + "https://files.pythonhosted.org/packages/a3/61/8001b38461d751cd1a0c3a6ae84346796a5758123f3ed97a1b121dfbf4f3/gast-0.6.0-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_gast_sdist_88fc5300": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "gast-0.6.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "gast==0.6.0", + "sha256": "88fc5300d32c7ac6ca7b515310862f71e6fdf2c029bbec7c66c0f5dd47b6b1fb", + "urls": [ + "https://files.pythonhosted.org/packages/3c/14/c566f5ca00c115db7725263408ff952b8ae6d6a4e792ef9c84e77d9af7a1/gast-0.6.0.tar.gz" + ] + } + }, + "ncore_pip_deps_311_google_pasta_py3_none_any_b3248279": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "google_pasta-0.2.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "google-pasta==0.2.0", + "sha256": "b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", + "urls": [ + "https://files.pythonhosted.org/packages/a3/de/c648ef6835192e6e2cc03f40b19eeda4382c49b5bafb43d88b931c4c74ac/google_pasta-0.2.0-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_google_pasta_sdist_c9f2c8df": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "google-pasta-0.2.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "google-pasta==0.2.0", + "sha256": "c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e", + "urls": [ + "https://files.pythonhosted.org/packages/35/4a/0bd53b36ff0323d10d5f24ebd67af2de10a1117f5cf4d7add90df92756f1/google-pasta-0.2.0.tar.gz" + ] + } + }, + "ncore_pip_deps_311_grpcio_cp311_cp311_linux_armv7l_17325b0b": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "grpcio-1.70.0-cp311-cp311-linux_armv7l.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "grpcio==1.70.0", + "sha256": "17325b0be0c068f35770f944124e8839ea3185d6d54862800fc28cc2ffad205a", + "urls": [ + "https://files.pythonhosted.org/packages/65/c4/1f67d23d6bcadd2fd61fb460e5969c52b3390b4a4e254b5e04a6d1009e5e/grpcio-1.70.0-cp311-cp311-linux_armv7l.whl" + ] + } + }, + "ncore_pip_deps_311_grpcio_cp311_cp311_macosx_10_14_universal2_dbe41ad1": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "grpcio-1.70.0-cp311-cp311-macosx_10_14_universal2.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "grpcio==1.70.0", + "sha256": "dbe41ad140df911e796d4463168e33ef80a24f5d21ef4d1e310553fcd2c4a386", + "urls": [ + "https://files.pythonhosted.org/packages/e4/bd/cc36811c582d663a740fb45edf9f99ddbd99a10b6ba38267dc925e1e193a/grpcio-1.70.0-cp311-cp311-macosx_10_14_universal2.whl" + ] + } + }, + "ncore_pip_deps_311_grpcio_cp311_cp311_manylinux_2_17_aarch64_5ea67c72": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "grpcio-1.70.0-cp311-cp311-manylinux_2_17_aarch64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "grpcio==1.70.0", + "sha256": "5ea67c72101d687d44d9c56068328da39c9ccba634cabb336075fae2eab0d04b", + "urls": [ + "https://files.pythonhosted.org/packages/7e/32/8538bb2ace5cd72da7126d1c9804bf80b4fe3be70e53e2d55675c24961a8/grpcio-1.70.0-cp311-cp311-manylinux_2_17_aarch64.whl" + ] + } + }, + "ncore_pip_deps_311_grpcio_cp311_cp311_manylinux_2_17_x86_64_e7831a0f": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "grpcio-1.70.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "grpcio==1.70.0", + "sha256": "e7831a0fc1beeeb7759f737f5acd9fdcda520e955049512d68fda03d91186eea", + "urls": [ + "https://files.pythonhosted.org/packages/9f/e5/5316b239380b8b2ad30373eb5bb25d9fd36c0375e94a98a0a60ea357d254/grpcio-1.70.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_grpcio_cp311_cp311_musllinux_1_1_x86_64_d6376496": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "grpcio-1.70.0-cp311-cp311-musllinux_1_1_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "grpcio==1.70.0", + "sha256": "d63764963412e22f0491d0d32833d71087288f4e24cbcddbae82476bfa1d81fd", + "urls": [ + "https://files.pythonhosted.org/packages/4c/c4/684d877517e5bfd6232d79107e5a1151b835e9f99051faef51fed3359ec4/grpcio-1.70.0-cp311-cp311-musllinux_1_1_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_grpcio_cp311_cp311_win_amd64_d24035d4": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "grpcio-1.70.0-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "grpcio==1.70.0", + "sha256": "d24035d49e026353eb042bf7b058fb831db3e06d52bee75c5f2f3ab453e71aca", + "urls": [ + "https://files.pythonhosted.org/packages/55/15/b6cf2c9515c028aff9da6984761a3ab484a472b0dc6435fcd07ced42127d/grpcio-1.70.0-cp311-cp311-win_amd64.whl" + ] + } + }, + "ncore_pip_deps_311_grpcio_sdist_8d1584a6": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "grpcio-1.70.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "grpcio==1.70.0", + "sha256": "8d1584a68d5922330025881e63a6c1b54cc8117291d382e4fa69339b6d914c56", + "urls": [ + "https://files.pythonhosted.org/packages/69/e1/4b21b5017c33f3600dcc32b802bb48fe44a4d36d6c066f52650c7c2690fa/grpcio-1.70.0.tar.gz" ] } }, @@ -3917,17 +4601,221 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "h11-0.16.0-py3-none-any.whl", + "filename": "h11-0.16.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "h11==0.16.0", + "sha256": "63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", + "urls": [ + "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_h11_sdist_4e35b956": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "h11-0.16.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "h11==0.16.0", + "sha256": "4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", + "urls": [ + "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz" + ] + } + }, + "ncore_pip_deps_311_h5py_cp311_cp311_macosx_10_9_x86_64_8a8e38ef": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "h5py==3.13.0", + "sha256": "8a8e38ef4ceb969f832cc230c0cf808c613cc47e31e768fd7b1106c55afa1cb8", + "urls": [ + "https://files.pythonhosted.org/packages/86/2b/50b15fdefb577d073b49699e6ea6a0a77a3a1016c2b67e2149fc50124a10/h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_h5py_cp311_cp311_macosx_11_0_arm64_f35640e8": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "h5py==3.13.0", + "sha256": "f35640e81b03c02a88b8bf99fb6a9d3023cc52f7c627694db2f379e0028f2868", + "urls": [ + "https://files.pythonhosted.org/packages/94/59/36d87a559cab9c59b59088d52e86008d27a9602ce3afc9d3b51823014bf3/h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl" + ] + } + }, + "ncore_pip_deps_311_h5py_cp311_cp311_manylinux_2_17_aarch64_337af114": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "h5py==3.13.0", + "sha256": "337af114616f3656da0c83b68fcf53ecd9ce9989a700b0883a6e7c483c3235d4", + "urls": [ + "https://files.pythonhosted.org/packages/37/ef/6f80b19682c0b0835bbee7b253bec9c16af9004f2fd6427b1dd858100273/h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "ncore_pip_deps_311_h5py_cp311_cp311_manylinux_2_17_x86_64_782ff0ac": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "h5py==3.13.0", + "sha256": "782ff0ac39f455f21fd1c8ebc007328f65f43d56718a89327eec76677ebf238a", + "urls": [ + "https://files.pythonhosted.org/packages/03/71/c99f662d4832c8835453cf3476f95daa28372023bda4aa1fca9e97c24f09/h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_h5py_cp311_cp311_win_amd64_22ffe2a2": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "h5py-3.13.0-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "h5py==3.13.0", + "sha256": "22ffe2a25770a2d67213a1b94f58006c14dce06933a42d2aaa0318c5868d1508", + "urls": [ + "https://files.pythonhosted.org/packages/56/89/e3ff23e07131ff73a72a349be9639e4de84e163af89c1c218b939459a98a/h5py-3.13.0-cp311-cp311-win_amd64.whl" + ] + } + }, + "ncore_pip_deps_311_h5py_sdist_1870e465": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "h5py-3.13.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "h5py==3.13.0", + "sha256": "1870e46518720023da85d0895a1960ff2ce398c5671eac3b1a41ec696b7105c3", + "urls": [ + "https://files.pythonhosted.org/packages/03/2e/a22d6a8bfa6f8be33e7febd985680fba531562795f0a9077ed1eb047bfb0/h5py-3.13.0.tar.gz" + ] + } + }, + "ncore_pip_deps_311_httpcore_py3_none_any_2d400746": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "httpcore-1.0.9-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "h11==0.16.0", - "sha256": "63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", + "requirement": "httpcore==1.0.9", + "sha256": "2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", "urls": [ - "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_h11_sdist_4e35b956": { + "ncore_pip_deps_311_httpcore_sdist_6e34463a": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3947,17 +4835,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "h11-0.16.0.tar.gz", + "filename": "httpcore-1.0.9.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "h11==0.16.0", - "sha256": "4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", + "requirement": "httpcore==1.0.9", + "sha256": "6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", "urls": [ - "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz" + "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz" ] } }, - "ncore_pip_deps_311_h5py_cp311_cp311_macosx_10_9_x86_64_8a8e38ef": { + "ncore_pip_deps_311_httpx_py3_none_any_d909fccc": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3971,17 +4859,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", + "filename": "httpx-0.28.1-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "h5py==3.13.0", - "sha256": "8a8e38ef4ceb969f832cc230c0cf808c613cc47e31e768fd7b1106c55afa1cb8", + "requirement": "httpx==0.28.1", + "sha256": "d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", "urls": [ - "https://files.pythonhosted.org/packages/86/2b/50b15fdefb577d073b49699e6ea6a0a77a3a1016c2b67e2149fc50124a10/h5py-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl" + "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_h5py_cp311_cp311_macosx_11_0_arm64_f35640e8": { + "ncore_pip_deps_311_httpx_sdist_75e98c5f": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -3995,17 +4883,23 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "httpx-0.28.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "h5py==3.13.0", - "sha256": "f35640e81b03c02a88b8bf99fb6a9d3023cc52f7c627694db2f379e0028f2868", + "requirement": "httpx==0.28.1", + "sha256": "75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", "urls": [ - "https://files.pythonhosted.org/packages/94/59/36d87a559cab9c59b59088d52e86008d27a9602ce3afc9d3b51823014bf3/h5py-3.13.0-cp311-cp311-macosx_11_0_arm64.whl" + "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz" ] } }, - "ncore_pip_deps_311_h5py_cp311_cp311_manylinux_2_17_aarch64_337af114": { + "ncore_pip_deps_311_idna_py3_none_any_946d195a": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4019,17 +4913,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "filename": "idna-3.10-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "h5py==3.13.0", - "sha256": "337af114616f3656da0c83b68fcf53ecd9ce9989a700b0883a6e7c483c3235d4", + "requirement": "idna==3.10", + "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", "urls": [ - "https://files.pythonhosted.org/packages/37/ef/6f80b19682c0b0835bbee7b253bec9c16af9004f2fd6427b1dd858100273/h5py-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_h5py_cp311_cp311_manylinux_2_17_x86_64_782ff0ac": { + "ncore_pip_deps_311_idna_sdist_12f65c9b": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4043,17 +4937,185 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "idna-3.10.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "h5py==3.13.0", - "sha256": "782ff0ac39f455f21fd1c8ebc007328f65f43d56718a89327eec76677ebf238a", + "requirement": "idna==3.10", + "sha256": "12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", "urls": [ - "https://files.pythonhosted.org/packages/03/71/c99f662d4832c8835453cf3476f95daa28372023bda4aa1fca9e97c24f09/h5py-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" + ] + } + }, + "ncore_pip_deps_311_imageio_py3_none_any_ad9adfb2": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "imageio-2.37.2-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "imageio==2.37.2", + "sha256": "ad9adfb20335d718c03de457358ed69f141021a333c40a53e57273d8a5bd0b9b", + "urls": [ + "https://files.pythonhosted.org/packages/fb/fe/301e0936b79bcab4cacc7548bf2853fc28dced0a578bab1f7ef53c9aa75b/imageio-2.37.2-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_imageio_sdist_0212ef27": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "imageio-2.37.2.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "imageio==2.37.2", + "sha256": "0212ef2727ac9caa5ca4b2c75ae89454312f440a756fcfc8ef1993e718f50f8a", + "urls": [ + "https://files.pythonhosted.org/packages/a3/6f/606be632e37bf8d05b253e8626c2291d74c691ddc7bcdf7d6aaf33b32f6a/imageio-2.37.2.tar.gz" + ] + } + }, + "ncore_pip_deps_311_imagesize_py2_none_any_0d8d18d0": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "imagesize-1.4.1-py2.py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "imagesize==1.4.1", + "sha256": "0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", + "urls": [ + "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_imagesize_sdist_69150444": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "imagesize-1.4.1.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "imagesize==1.4.1", + "sha256": "69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", + "urls": [ + "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz" + ] + } + }, + "ncore_pip_deps_311_iniconfig_py3_none_any_b6a85871": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "iniconfig-2.0.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "iniconfig==2.0.0", + "sha256": "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", + "urls": [ + "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_iniconfig_sdist_2d91e135": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "iniconfig-2.0.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "iniconfig==2.0.0", + "sha256": "2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "urls": [ + "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz" ] } }, - "ncore_pip_deps_311_h5py_cp311_cp311_win_amd64_22ffe2a2": { + "ncore_pip_deps_311_ipython_py3_none_any_c6ab68cc": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4067,17 +5129,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "h5py-3.13.0-cp311-cp311-win_amd64.whl", + "filename": "ipython-9.10.0-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "h5py==3.13.0", - "sha256": "22ffe2a25770a2d67213a1b94f58006c14dce06933a42d2aaa0318c5868d1508", + "requirement": "ipython==9.10.0", + "sha256": "c6ab68cc23bba8c7e18e9b932797014cc61ea7fd6f19de180ab9ba73e65ee58d", "urls": [ - "https://files.pythonhosted.org/packages/56/89/e3ff23e07131ff73a72a349be9639e4de84e163af89c1c218b939459a98a/h5py-3.13.0-cp311-cp311-win_amd64.whl" + "https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_h5py_sdist_1870e465": { + "ncore_pip_deps_311_ipython_pygments_lexers_py3_none_any_a9462224": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4091,23 +5153,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "h5py-3.13.0.tar.gz", + "filename": "ipython_pygments_lexers-1.1.1-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "h5py==3.13.0", - "sha256": "1870e46518720023da85d0895a1960ff2ce398c5671eac3b1a41ec696b7105c3", + "requirement": "ipython-pygments-lexers==1.1.1", + "sha256": "a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", "urls": [ - "https://files.pythonhosted.org/packages/03/2e/a22d6a8bfa6f8be33e7febd985680fba531562795f0a9077ed1eb047bfb0/h5py-3.13.0.tar.gz" + "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_httpcore_py3_none_any_2d400746": { + "ncore_pip_deps_311_ipython_pygments_lexers_sdist_09c01380": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4121,17 +5177,23 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "httpcore-1.0.9-py3-none-any.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "ipython_pygments_lexers-1.1.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "httpcore==1.0.9", - "sha256": "2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", + "requirement": "ipython-pygments-lexers==1.1.1", + "sha256": "09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", "urls": [ - "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl" + "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz" ] } }, - "ncore_pip_deps_311_httpcore_sdist_6e34463a": { + "ncore_pip_deps_311_ipython_sdist_cd9e656b": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4151,17 +5213,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "httpcore-1.0.9.tar.gz", + "filename": "ipython-9.10.0.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "httpcore==1.0.9", - "sha256": "6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", + "requirement": "ipython==9.10.0", + "sha256": "cd9e656be97618a0676d058134cd44e6dc7012c0e5cb36a9ce96a8c904adaf77", "urls": [ - "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz" + "https://files.pythonhosted.org/packages/a6/60/2111715ea11f39b1535bed6024b7dec7918b71e5e5d30855a5b503056b50/ipython-9.10.0.tar.gz" ] } }, - "ncore_pip_deps_311_httpx_py3_none_any_d909fccc": { + "ncore_pip_deps_311_jedi_py2_none_any_a8ef22bd": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4175,17 +5237,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "httpx-0.28.1-py3-none-any.whl", + "filename": "jedi-0.19.2-py2.py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "httpx==0.28.1", - "sha256": "d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", + "requirement": "jedi==0.19.2", + "sha256": "a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", "urls": [ - "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl" ] } }, - "ncore_pip_deps_311_httpx_sdist_75e98c5f": { + "ncore_pip_deps_311_jedi_sdist_4770dc3d": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4205,17 +5267,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "httpx-0.28.1.tar.gz", + "filename": "jedi-0.19.2.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "httpx==0.28.1", - "sha256": "75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", + "requirement": "jedi==0.19.2", + "sha256": "4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", "urls": [ - "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz" + "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz" ] } }, - "ncore_pip_deps_311_idna_py3_none_any_946d195a": { + "ncore_pip_deps_311_jinja2_py3_none_any_aba0f4dc": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4229,17 +5291,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "idna-3.10-py3-none-any.whl", + "filename": "jinja2-3.1.5-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "idna==3.10", - "sha256": "946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", + "requirement": "jinja2==3.1.5", + "sha256": "aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", "urls": [ - "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl" + "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_idna_sdist_12f65c9b": { + "ncore_pip_deps_311_jinja2_sdist_8fefff8d": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4259,17 +5321,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "idna-3.10.tar.gz", + "filename": "jinja2-3.1.5.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "idna==3.10", - "sha256": "12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "requirement": "jinja2==3.1.5", + "sha256": "8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", "urls": [ - "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz" + "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz" ] } }, - "ncore_pip_deps_311_imageio_py3_none_any_ad9adfb2": { + "ncore_pip_deps_311_joblib_py3_none_any_5fc3c503": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4283,17 +5345,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "imageio-2.37.2-py3-none-any.whl", + "filename": "joblib-1.5.3-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "imageio==2.37.2", - "sha256": "ad9adfb20335d718c03de457358ed69f141021a333c40a53e57273d8a5bd0b9b", + "requirement": "joblib==1.5.3", + "sha256": "5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", "urls": [ - "https://files.pythonhosted.org/packages/fb/fe/301e0936b79bcab4cacc7548bf2853fc28dced0a578bab1f7ef53c9aa75b/imageio-2.37.2-py3-none-any.whl" + "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_imageio_sdist_0212ef27": { + "ncore_pip_deps_311_joblib_sdist_8561a326": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4313,17 +5375,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "imageio-2.37.2.tar.gz", + "filename": "joblib-1.5.3.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "imageio==2.37.2", - "sha256": "0212ef2727ac9caa5ca4b2c75ae89454312f440a756fcfc8ef1993e718f50f8a", + "requirement": "joblib==1.5.3", + "sha256": "8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", "urls": [ - "https://files.pythonhosted.org/packages/a3/6f/606be632e37bf8d05b253e8626c2291d74c691ddc7bcdf7d6aaf33b32f6a/imageio-2.37.2.tar.gz" + "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz" ] } }, - "ncore_pip_deps_311_imagesize_py2_none_any_0d8d18d0": { + "ncore_pip_deps_311_jsonschema_py3_none_any_fbadb6f8": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4337,17 +5399,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "imagesize-1.4.1-py2.py3-none-any.whl", + "filename": "jsonschema-4.23.0-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "imagesize==1.4.1", - "sha256": "0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", + "requirement": "jsonschema==4.23.0", + "sha256": "fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", "urls": [ - "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_imagesize_sdist_69150444": { + "ncore_pip_deps_311_jsonschema_sdist_d71497fe": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4367,17 +5429,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "imagesize-1.4.1.tar.gz", + "filename": "jsonschema-4.23.0.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "imagesize==1.4.1", - "sha256": "69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", + "requirement": "jsonschema==4.23.0", + "sha256": "d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", "urls": [ - "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz" + "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz" ] } }, - "ncore_pip_deps_311_iniconfig_py3_none_any_b6a85871": { + "ncore_pip_deps_311_jsonschema_specifications_py3_none_any_a09a0680": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4391,17 +5453,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "iniconfig-2.0.0-py3-none-any.whl", + "filename": "jsonschema_specifications-2024.10.1-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "iniconfig==2.0.0", - "sha256": "b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374", + "requirement": "jsonschema-specifications==2024.10.1", + "sha256": "a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", "urls": [ - "https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_iniconfig_sdist_2d91e135": { + "ncore_pip_deps_311_jsonschema_specifications_sdist_0f38b836": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4421,17 +5483,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "iniconfig-2.0.0.tar.gz", + "filename": "jsonschema_specifications-2024.10.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "iniconfig==2.0.0", - "sha256": "2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "requirement": "jsonschema-specifications==2024.10.1", + "sha256": "0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", "urls": [ - "https://files.pythonhosted.org/packages/d7/4b/cbd8e699e64a6f16ca3a8220661b5f83792b3017d0f79807cb8708d33913/iniconfig-2.0.0.tar.gz" + "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz" ] } }, - "ncore_pip_deps_311_ipython_py3_none_any_c6ab68cc": { + "ncore_pip_deps_311_jupyter_client_py3_none_any_e8a19cc9": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4445,17 +5507,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "ipython-9.10.0-py3-none-any.whl", + "filename": "jupyter_client-8.6.3-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "ipython==9.10.0", - "sha256": "c6ab68cc23bba8c7e18e9b932797014cc61ea7fd6f19de180ab9ba73e65ee58d", + "requirement": "jupyter-client==8.6.3", + "sha256": "e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", "urls": [ - "https://files.pythonhosted.org/packages/3d/aa/898dec789a05731cd5a9f50605b7b44a72bd198fd0d4528e11fc610177cc/ipython-9.10.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_ipython_pygments_lexers_py3_none_any_a9462224": { + "ncore_pip_deps_311_jupyter_client_sdist_35b3a094": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4469,17 +5531,23 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "ipython_pygments_lexers-1.1.1-py3-none-any.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "jupyter_client-8.6.3.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "ipython-pygments-lexers==1.1.1", - "sha256": "a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", + "requirement": "jupyter-client==8.6.3", + "sha256": "35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", "urls": [ - "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz" ] } }, - "ncore_pip_deps_311_ipython_pygments_lexers_sdist_09c01380": { + "ncore_pip_deps_311_jupyter_core_py3_none_any_4f7315d2": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4493,23 +5561,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "ipython_pygments_lexers-1.1.1.tar.gz", + "filename": "jupyter_core-5.7.2-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "ipython-pygments-lexers==1.1.1", - "sha256": "09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", + "requirement": "jupyter-core==5.7.2", + "sha256": "4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", "urls": [ - "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz" + "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_ipython_sdist_cd9e656b": { + "ncore_pip_deps_311_jupyter_core_sdist_aa5f8d32": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4529,17 +5591,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "ipython-9.10.0.tar.gz", + "filename": "jupyter_core-5.7.2.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "ipython==9.10.0", - "sha256": "cd9e656be97618a0676d058134cd44e6dc7012c0e5cb36a9ce96a8c904adaf77", + "requirement": "jupyter-core==5.7.2", + "sha256": "aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", "urls": [ - "https://files.pythonhosted.org/packages/a6/60/2111715ea11f39b1535bed6024b7dec7918b71e5e5d30855a5b503056b50/ipython-9.10.0.tar.gz" + "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz" ] } }, - "ncore_pip_deps_311_jedi_py2_none_any_a8ef22bd": { + "ncore_pip_deps_311_jupyterlab_pygments_py3_none_any_841a8902": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4553,17 +5615,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "jedi-0.19.2-py2.py3-none-any.whl", + "filename": "jupyterlab_pygments-0.3.0-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jedi==0.19.2", - "sha256": "a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", + "requirement": "jupyterlab-pygments==0.3.0", + "sha256": "841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", "urls": [ - "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl" + "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_jedi_sdist_4770dc3d": { + "ncore_pip_deps_311_jupyterlab_pygments_sdist_721aca4d": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4583,17 +5645,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "jedi-0.19.2.tar.gz", + "filename": "jupyterlab_pygments-0.3.0.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jedi==0.19.2", - "sha256": "4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", + "requirement": "jupyterlab-pygments==0.3.0", + "sha256": "721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", "urls": [ - "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz" + "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz" ] } }, - "ncore_pip_deps_311_jinja2_py3_none_any_aba0f4dc": { + "ncore_pip_deps_311_keras_py3_none_any_ebd2c14d": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4607,17 +5669,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "jinja2-3.1.5-py3-none-any.whl", + "filename": "keras-3.14.1-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jinja2==3.1.5", - "sha256": "aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb", + "requirement": "keras==3.14.1", + "sha256": "ebd2c14d2af3c9de18083604d408483996407fc7d2f9ebd1d565961f96608c29", "urls": [ - "https://files.pythonhosted.org/packages/bd/0f/2ba5fbcd631e3e88689309dbe978c5769e883e4b84ebfe7da30b43275c5a/jinja2-3.1.5-py3-none-any.whl" + "https://files.pythonhosted.org/packages/02/03/184267c1d09783dd070f1ddfd0d4beb7503139dfc7bd75b422867cf282fd/keras-3.14.1-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_jinja2_sdist_8fefff8d": { + "ncore_pip_deps_311_keras_sdist_ef479173": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4637,17 +5699,17 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "jinja2-3.1.5.tar.gz", + "filename": "keras-3.14.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jinja2==3.1.5", - "sha256": "8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb", + "requirement": "keras==3.14.1", + "sha256": "ef479173102ad29db89b53c232efdc3fb5ad57c28bc27ead59f3e78a1eecd05b", "urls": [ - "https://files.pythonhosted.org/packages/af/92/b3130cbbf5591acf9ade8708c365f3238046ac7cb8ccba6e81abccb0ccff/jinja2-3.1.5.tar.gz" + "https://files.pythonhosted.org/packages/35/e7/97a7664581b73e4f9ff1d3a767a493b6ac5d3e0ed1926bd2b6b2c8bbccd7/keras-3.14.1.tar.gz" ] } }, - "ncore_pip_deps_311_jsonschema_py3_none_any_fbadb6f8": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_macosx_10_9_universal2_a4d36019": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4661,17 +5723,41 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "jsonschema-4.23.0-py3-none-any.whl", + "filename": "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jsonschema==4.23.0", - "sha256": "fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", + "requirement": "kiwisolver==1.4.8", + "sha256": "a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84", + "urls": [ + "https://files.pythonhosted.org/packages/da/ed/c913ee28936c371418cb167b128066ffb20bbf37771eecc2c97edf8a6e4c/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl" + ] + } + }, + "ncore_pip_deps_311_kiwisolver_cp311_cp311_macosx_10_9_x86_64_856b269c": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "kiwisolver==1.4.8", + "sha256": "856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561", "urls": [ - "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/4c/45/4a7f896f7467aaf5f56ef093d1f329346f3b594e77c6a3c327b2d415f521/kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl" ] } }, - "ncore_pip_deps_311_jsonschema_sdist_d71497fe": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_macosx_11_0_arm64_c2b9a96e": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4685,23 +5771,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "jsonschema-4.23.0.tar.gz", + "filename": "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jsonschema==4.23.0", - "sha256": "d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", + "requirement": "kiwisolver==1.4.8", + "sha256": "c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7", "urls": [ - "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz" + "https://files.pythonhosted.org/packages/5f/b4/c12b3ac0852a3a68f94598d4c8d569f55361beef6159dce4e7b624160da2/kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl" ] } }, - "ncore_pip_deps_311_jsonschema_specifications_py3_none_any_a09a0680": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_manylinux_2_17_aarch64_dace81d2": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4715,17 +5795,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "jsonschema_specifications-2024.10.1-py3-none-any.whl", + "filename": "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jsonschema-specifications==2024.10.1", - "sha256": "a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf", + "requirement": "kiwisolver==1.4.8", + "sha256": "dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954", "urls": [ - "https://files.pythonhosted.org/packages/d1/0f/8910b19ac0670a0f80ce1008e5e751c4a57e14d2c4c13a482aa6079fa9d6/jsonschema_specifications-2024.10.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/8d/bf/b4b169b050c8421a7c53ea1ea74e4ef9c335ee9013216c558a047f162d20/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" ] } }, - "ncore_pip_deps_311_jsonschema_specifications_sdist_0f38b836": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_manylinux_2_17_ppc64le_11e1022b": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4739,23 +5819,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "jsonschema_specifications-2024.10.1.tar.gz", + "filename": "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jsonschema-specifications==2024.10.1", - "sha256": "0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", + "requirement": "kiwisolver==1.4.8", + "sha256": "11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79", "urls": [ - "https://files.pythonhosted.org/packages/10/db/58f950c996c793472e336ff3655b13fbcf1e3b359dcf52dcf3ed3b52c352/jsonschema_specifications-2024.10.1.tar.gz" + "https://files.pythonhosted.org/packages/66/5a/e13bd341fbcf73325ea60fdc8af752addf75c5079867af2e04cc41f34434/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl" ] } }, - "ncore_pip_deps_311_jupyter_client_py3_none_any_e8a19cc9": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_manylinux_2_17_s390x_3b9b4d28": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4769,17 +5843,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "jupyter_client-8.6.3-py3-none-any.whl", + "filename": "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jupyter-client==8.6.3", - "sha256": "e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", + "requirement": "kiwisolver==1.4.8", + "sha256": "3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6", "urls": [ - "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl" + "https://files.pythonhosted.org/packages/9b/4f/5955dcb376ba4a830384cc6fab7d7547bd6759fe75a09564910e9e3bb8ea/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl" ] } }, - "ncore_pip_deps_311_jupyter_client_sdist_35b3a094": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_manylinux_2_17_x86_64_3a96c0e7": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4793,23 +5867,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "jupyter_client-8.6.3.tar.gz", + "filename": "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jupyter-client==8.6.3", - "sha256": "35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", + "requirement": "kiwisolver==1.4.8", + "sha256": "3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0", "urls": [ - "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz" + "https://files.pythonhosted.org/packages/3a/97/5edbed69a9d0caa2e4aa616ae7df8127e10f6586940aa683a496c2c280b9/kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" ] } }, - "ncore_pip_deps_311_jupyter_core_py3_none_any_4f7315d2": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_musllinux_1_2_aarch64_23454ff0": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4823,17 +5891,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "jupyter_core-5.7.2-py3-none-any.whl", + "filename": "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jupyter-core==5.7.2", - "sha256": "4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", + "requirement": "kiwisolver==1.4.8", + "sha256": "23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab", "urls": [ - "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl" + "https://files.pythonhosted.org/packages/13/fc/e756382cb64e556af6c1809a1bbb22c141bbc2445049f2da06b420fe52bf/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl" ] } }, - "ncore_pip_deps_311_jupyter_core_sdist_aa5f8d32": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_musllinux_1_2_ppc64le_b21dbe16": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4847,23 +5915,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "jupyter_core-5.7.2.tar.gz", + "filename": "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jupyter-core==5.7.2", - "sha256": "aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", + "requirement": "kiwisolver==1.4.8", + "sha256": "b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25", "urls": [ - "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz" + "https://files.pythonhosted.org/packages/e9/39/483558c2a913ab8384d6e4b66a932406f87c95a6080112433da5ed668559/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl" ] } }, - "ncore_pip_deps_311_jupyterlab_pygments_py3_none_any_841a8902": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_musllinux_1_2_s390x_768cade2": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4877,17 +5939,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "jupyterlab_pygments-0.3.0-py3-none-any.whl", + "filename": "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jupyterlab-pygments==0.3.0", - "sha256": "841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", + "requirement": "kiwisolver==1.4.8", + "sha256": "768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc", "urls": [ - "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl" + "https://files.pythonhosted.org/packages/01/aa/efad1fbca6570a161d29224f14b082960c7e08268a133fe5dc0f6906820e/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl" ] } }, - "ncore_pip_deps_311_jupyterlab_pygments_sdist_721aca4d": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_musllinux_1_2_x86_64_d47cfb26": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4901,23 +5963,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "jupyterlab_pygments-0.3.0.tar.gz", + "filename": "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "jupyterlab-pygments==0.3.0", - "sha256": "721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", + "requirement": "kiwisolver==1.4.8", + "sha256": "d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67", "urls": [ - "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz" + "https://files.pythonhosted.org/packages/c9/4f/15988966ba46bcd5ab9d0c8296914436720dd67fca689ae1a75b4ec1c72f/kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl" ] } }, - "ncore_pip_deps_311_keras_py3_none_any_ebd2c14d": { + "ncore_pip_deps_311_kiwisolver_cp311_cp311_win_amd64_ed33ca20": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4931,17 +5987,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "keras-3.14.1-py3-none-any.whl", + "filename": "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "keras==3.14.1", - "sha256": "ebd2c14d2af3c9de18083604d408483996407fc7d2f9ebd1d565961f96608c29", + "requirement": "kiwisolver==1.4.8", + "sha256": "ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34", "urls": [ - "https://files.pythonhosted.org/packages/02/03/184267c1d09783dd070f1ddfd0d4beb7503139dfc7bd75b422867cf282fd/keras-3.14.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/2d/27/bdf1c769c83f74d98cbc34483a972f221440703054894a37d174fba8aa68/kiwisolver-1.4.8-cp311-cp311-win_amd64.whl" ] } }, - "ncore_pip_deps_311_keras_sdist_ef479173": { + "ncore_pip_deps_311_kiwisolver_sdist_23d5f023": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -4961,13 +6017,13 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "keras-3.14.1.tar.gz", + "filename": "kiwisolver-1.4.8.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "keras==3.14.1", - "sha256": "ef479173102ad29db89b53c232efdc3fb5ad57c28bc27ead59f3e78a1eecd05b", + "requirement": "kiwisolver==1.4.8", + "sha256": "23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e", "urls": [ - "https://files.pythonhosted.org/packages/35/e7/97a7664581b73e4f9ff1d3a767a493b6ac5d3e0ed1926bd2b6b2c8bbccd7/keras-3.14.1.tar.gz" + "https://files.pythonhosted.org/packages/82/59/7c91426a8ac292e1cdd53a63b6d9439abd573c875c3f92c146767dd33faf/kiwisolver-1.4.8.tar.gz" ] } }, @@ -6195,6 +7251,150 @@ ] } }, + "ncore_pip_deps_311_matplotlib_cp311_cp311_macosx_10_12_x86_64_fd44fc75": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "matplotlib-3.10.0-cp311-cp311-macosx_10_12_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "matplotlib==3.10.0", + "sha256": "fd44fc75522f58612ec4a33958a7e5552562b7705b42ef1b4f8c0818e304a363", + "urls": [ + "https://files.pythonhosted.org/packages/0c/f1/e37f6c84d252867d7ddc418fff70fc661cfd363179263b08e52e8b748e30/matplotlib-3.10.0-cp311-cp311-macosx_10_12_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_matplotlib_cp311_cp311_macosx_11_0_arm64_c58a9622": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "matplotlib-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "matplotlib==3.10.0", + "sha256": "c58a9622d5dbeb668f407f35f4e6bfac34bb9ecdcc81680c04d0258169747997", + "urls": [ + "https://files.pythonhosted.org/packages/c7/8b/92e9da1f28310a1f6572b5c55097b0c0ceb5e27486d85fb73b54f5a9b939/matplotlib-3.10.0-cp311-cp311-macosx_11_0_arm64.whl" + ] + } + }, + "ncore_pip_deps_311_matplotlib_cp311_cp311_manylinux_2_17_aarch64_845d9656": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "matplotlib==3.10.0", + "sha256": "845d96568ec873be63f25fa80e9e7fae4be854a66a7e2f0c8ccc99e94a8bd4ef", + "urls": [ + "https://files.pythonhosted.org/packages/c5/cb/49e83f0fd066937a5bd3bc5c5d63093703f3637b2824df8d856e0558beef/matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" + ] + } + }, + "ncore_pip_deps_311_matplotlib_cp311_cp311_manylinux_2_17_x86_64_5439f4c5": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "matplotlib-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "matplotlib==3.10.0", + "sha256": "5439f4c5a3e2e8eab18e2f8c3ef929772fd5641876db71f08127eed95ab64683", + "urls": [ + "https://files.pythonhosted.org/packages/b2/7d/2d873209536b9ee17340754118a2a17988bc18981b5b56e6715ee07373ac/matplotlib-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_matplotlib_cp311_cp311_musllinux_1_2_x86_64_4673ff67": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "matplotlib-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "matplotlib==3.10.0", + "sha256": "4673ff67a36152c48ddeaf1135e74ce0d4bce1bbf836ae40ed39c29edf7e2765", + "urls": [ + "https://files.pythonhosted.org/packages/b8/03/57d6cbbe85c61fe4cbb7c94b54dce443d68c21961830833a1f34d056e5ea/matplotlib-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_matplotlib_cp311_cp311_win_amd64_7e8632ba": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "matplotlib-3.10.0-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "matplotlib==3.10.0", + "sha256": "7e8632baebb058555ac0cde75db885c61f1212e47723d63921879806b40bec6a", + "urls": [ + "https://files.pythonhosted.org/packages/14/cf/e382598f98be11bf51dd0bc60eca44a517f6793e3dc8b9d53634a144620c/matplotlib-3.10.0-cp311-cp311-win_amd64.whl" + ] + } + }, "ncore_pip_deps_311_matplotlib_inline_py3_none_any_d56ce515": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { @@ -6249,6 +7449,36 @@ ] } }, + "ncore_pip_deps_311_matplotlib_sdist_b886d02a": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "matplotlib-3.10.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "matplotlib==3.10.0", + "sha256": "b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278", + "urls": [ + "https://files.pythonhosted.org/packages/68/dd/fa2e1a45fce2d09f4aea3cee169760e672c8262325aa5796c49d543dc7e6/matplotlib-3.10.0.tar.gz" + ] + } + }, "ncore_pip_deps_311_mdurl_py3_none_any_84008a41": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { @@ -7401,13 +8631,43 @@ "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", "requirement": "numpy==1.26.4", - "sha256": "cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", + "sha256": "cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", + "urls": [ + "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl" + ] + } + }, + "ncore_pip_deps_311_numpy_sdist_2a02aba9": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "numpy-1.26.4.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "numpy==1.26.4", + "sha256": "2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", "urls": [ - "https://files.pythonhosted.org/packages/3f/6b/5610004206cf7f8e7ad91c5a85a8c71b2f2f8051a0c0c4d5916b76d6cbb2/numpy-1.26.4-cp311-cp311-win_amd64.whl" + "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz" ] } }, - "ncore_pip_deps_311_numpy_sdist_2a02aba9": { + "ncore_pip_deps_311_nuscenes_devkit_py3_none_any_76cee0e7": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -7421,19 +8681,13 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "numpy-1.26.4.tar.gz", + "filename": "nuscenes_devkit-1.2.0-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "numpy==1.26.4", - "sha256": "2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", + "requirement": "nuscenes-devkit==1.2.0", + "sha256": "76cee0e7f96ec96d6269ee3acb4ff69e8ac2f9413e974d9eb542233ea7479bf1", "urls": [ - "https://files.pythonhosted.org/packages/65/6e/09db70a523a96d25e115e71cc56a6f9031e7b8cd166c1ac8438307c14058/numpy-1.26.4.tar.gz" + "https://files.pythonhosted.org/packages/3a/13/e9124913743cd815fff25a3438072e4d184100e1d548ad926189e3e6988c/nuscenes_devkit-1.2.0-py3-none-any.whl" ] } }, @@ -10335,6 +11589,180 @@ ] } }, + "ncore_pip_deps_311_pycocotools_cp311_cp311_macosx_10_9_universal2_81bdceeb": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pycocotools-2.0.11-cp311-cp311-macosx_10_9_universal2.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pycocotools==2.0.11", + "sha256": "81bdceebb4c64e9265213e2d733808a12f9c18dfb14457323cc6b9af07fa0e61", + "urls": [ + "https://files.pythonhosted.org/packages/b3/3f/41ce3fce61b7721158f21b61727eb054805babc0088cfa48506935b80a36/pycocotools-2.0.11-cp311-cp311-macosx_10_9_universal2.whl" + ] + } + }, + "ncore_pip_deps_311_pycocotools_cp311_cp311_manylinux_2_17_aarch64_a1c05f91": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pycocotools-2.0.11-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pycocotools==2.0.11", + "sha256": "a1c05f91ccc658dfe01325267209c4b435da1722c93eeb5749fabc1d087b6882", + "urls": [ + "https://files.pythonhosted.org/packages/e2/9b/a739705b246445bd1376394bf9d1ec2dd292b16740e92f203461b2bb12ed/pycocotools-2.0.11-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + ] + } + }, + "ncore_pip_deps_311_pycocotools_cp311_cp311_manylinux_2_17_x86_64_18ba75ff": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pycocotools-2.0.11-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pycocotools==2.0.11", + "sha256": "18ba75ff58cedb33a85ce2c18f1452f1fe20c9dd59925eec5300b2bf6205dbe1", + "urls": [ + "https://files.pythonhosted.org/packages/34/70/7a12752784e57d8034a76c245c618a2f88a9d2463862b990f314aea7e5d6/pycocotools-2.0.11-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_pycocotools_cp311_cp311_musllinux_1_2_aarch64_69341779": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pycocotools-2.0.11-cp311-cp311-musllinux_1_2_aarch64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pycocotools==2.0.11", + "sha256": "693417797f0377fd094eb815c0a1e7d1c3c0251b71e3b3779fce3b3cf24793c5", + "urls": [ + "https://files.pythonhosted.org/packages/5c/fc/d703599ac728209dba08aea8d4bee884d5adabfcd9041abed1658d863747/pycocotools-2.0.11-cp311-cp311-musllinux_1_2_aarch64.whl" + ] + } + }, + "ncore_pip_deps_311_pycocotools_cp311_cp311_musllinux_1_2_x86_64_b6a07071": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pycocotools-2.0.11-cp311-cp311-musllinux_1_2_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pycocotools==2.0.11", + "sha256": "b6a07071c441d0f5e480a8f287106191582e40289d4e242dfe684e0c8a751088", + "urls": [ + "https://files.pythonhosted.org/packages/81/d9/e1cfc320bbb2cd58c3b4398c3821cbe75d93c16ed3135ac9e774a18a02d3/pycocotools-2.0.11-cp311-cp311-musllinux_1_2_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_pycocotools_cp311_cp311_win_amd64_8e159232": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pycocotools-2.0.11-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pycocotools==2.0.11", + "sha256": "8e159232adae3aef6b4e2d37b008bff107b26e9ed3b48e70ea6482302834bd34", + "urls": [ + "https://files.pythonhosted.org/packages/a2/23/d17f6111c2a6ae8631d4fa90202bea05844da715d61431fbc34d276462d5/pycocotools-2.0.11-cp311-cp311-win_amd64.whl" + ] + } + }, + "ncore_pip_deps_311_pycocotools_sdist_34254d76": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "pycocotools-2.0.11.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pycocotools==2.0.11", + "sha256": "34254d76da85576fcaf5c1f3aa9aae16b8cb15418334ba4283b800796bd1993d", + "urls": [ + "https://files.pythonhosted.org/packages/a2/df/32354b5dda963ffdfc8f75c9acf8828ef7890723a4ed57bb3ff2dc1d6f7e/pycocotools-2.0.11.tar.gz" + ] + } + }, "ncore_pip_deps_311_pycollada_py3_none_any_636e6496": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { @@ -10436,14 +11864,116 @@ "filename": "pydata_sphinx_theme-0.16.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "pydata-sphinx-theme==0.16.1", - "sha256": "a08b7f0b7f70387219dc659bff0893a7554d5eb39b59d3b8ef37b8401b7642d7", + "requirement": "pydata-sphinx-theme==0.16.1", + "sha256": "a08b7f0b7f70387219dc659bff0893a7554d5eb39b59d3b8ef37b8401b7642d7", + "urls": [ + "https://files.pythonhosted.org/packages/00/20/bb50f9de3a6de69e6abd6b087b52fa2418a0418b19597601605f855ad044/pydata_sphinx_theme-0.16.1.tar.gz" + ] + } + }, + "ncore_pip_deps_311_pygments_py3_none_any_9ea1544a": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pygments-2.19.1-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pygments==2.19.1", + "sha256": "9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", + "urls": [ + "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_pygments_sdist_61c16d2a": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "pygments-2.19.1.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pygments==2.19.1", + "sha256": "61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", + "urls": [ + "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz" + ] + } + }, + "ncore_pip_deps_311_pynvvideocodec_cp311_cp311_manylinux_2_28_aarch64_b8d9b47b": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pynvvideocodec-2.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pynvvideocodec==2.1.0", + "sha256": "b8d9b47b5c910953d6c24fa60fd7bf6ac57f3d4a20831fcaf35e039349a91d42", + "urls": [ + "https://files.pythonhosted.org/packages/70/a8/03cb3acbdcb571bfdf350106742860a0ac13d263a4b647e22de6c7d07d73/pynvvideocodec-2.1.0-cp311-cp311-manylinux_2_28_aarch64.whl" + ] + } + }, + "ncore_pip_deps_311_pynvvideocodec_cp311_cp311_manylinux_2_28_x86_64_6d653240": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "pynvvideocodec-2.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "pynvvideocodec==2.1.0", + "sha256": "6d653240ce835e9ab531a4d61350a4af54f7f7859e5392e1323c030ffcfc8ff0", "urls": [ - "https://files.pythonhosted.org/packages/00/20/bb50f9de3a6de69e6abd6b087b52fa2418a0418b19597601605f855ad044/pydata_sphinx_theme-0.16.1.tar.gz" + "https://files.pythonhosted.org/packages/67/16/cf18b6346db08364fd8dcad5364bf6ce1c9a5ebe41be833801d18a1193e9/pynvvideocodec-2.1.0-cp311-cp311-manylinux_2_28_x86_64.whl" ] } }, - "ncore_pip_deps_311_pygments_py3_none_any_9ea1544a": { + "ncore_pip_deps_311_pynvvideocodec_cp311_cp311_win_amd64_ee5d2dc5": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -10457,17 +11987,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "pygments-2.19.1-py3-none-any.whl", + "filename": "pynvvideocodec-2.1.0-cp311-cp311-win_amd64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "pygments==2.19.1", - "sha256": "9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", + "requirement": "pynvvideocodec==2.1.0", + "sha256": "ee5d2dc56ac5ca8d223fa6fe8f57c67faf5ee1c9360216d9194cfbcd3f9d3948", "urls": [ - "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl" + "https://files.pythonhosted.org/packages/e5/29/0cb89a9cb860ecb0c96fc44a1aec7096909fe725c1fe9ca014e12fe2f994/pynvvideocodec-2.1.0-cp311-cp311-win_amd64.whl" ] } }, - "ncore_pip_deps_311_pygments_sdist_61c16d2a": { + "ncore_pip_deps_311_pyparsing_py3_none_any_506ff4f4": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -10481,23 +12011,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "extra_pip_args": [ - "--index-url", - "https://pypi.org/simple", - "--find-links", - "https://download.pytorch.org/whl/cu128/torch" - ], - "filename": "pygments-2.19.1.tar.gz", + "filename": "pyparsing-3.2.1-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "pygments==2.19.1", - "sha256": "61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", + "requirement": "pyparsing==3.2.1", + "sha256": "506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1", "urls": [ - "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz" + "https://files.pythonhosted.org/packages/1c/a7/c8a2d361bf89c0d9577c934ebb7421b25dc84bf3a8e3ac0a40aed9acc547/pyparsing-3.2.1-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_pynvvideocodec_cp311_cp311_manylinux_2_28_aarch64_b8d9b47b": { + "ncore_pip_deps_311_pyparsing_sdist_61980854": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -10511,17 +12035,23 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "pynvvideocodec-2.1.0-cp311-cp311-manylinux_2_28_aarch64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "pyparsing-3.2.1.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "pynvvideocodec==2.1.0", - "sha256": "b8d9b47b5c910953d6c24fa60fd7bf6ac57f3d4a20831fcaf35e039349a91d42", + "requirement": "pyparsing==3.2.1", + "sha256": "61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a", "urls": [ - "https://files.pythonhosted.org/packages/70/a8/03cb3acbdcb571bfdf350106742860a0ac13d263a4b647e22de6c7d07d73/pynvvideocodec-2.1.0-cp311-cp311-manylinux_2_28_aarch64.whl" + "https://files.pythonhosted.org/packages/8b/1a/3544f4f299a47911c2ab3710f534e52fea62a633c96806995da5d25be4b2/pyparsing-3.2.1.tar.gz" ] } }, - "ncore_pip_deps_311_pynvvideocodec_cp311_cp311_manylinux_2_28_x86_64_6d653240": { + "ncore_pip_deps_311_pyquaternion_py3_none_any_e65f6e3f": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -10535,17 +12065,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "pynvvideocodec-2.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", + "filename": "pyquaternion-0.9.9-py3-none-any.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "pynvvideocodec==2.1.0", - "sha256": "6d653240ce835e9ab531a4d61350a4af54f7f7859e5392e1323c030ffcfc8ff0", + "requirement": "pyquaternion==0.9.9", + "sha256": "e65f6e3f7b1fdf1a9e23f82434334a1ae84f14223eee835190cd2e841f8172ec", "urls": [ - "https://files.pythonhosted.org/packages/67/16/cf18b6346db08364fd8dcad5364bf6ce1c9a5ebe41be833801d18a1193e9/pynvvideocodec-2.1.0-cp311-cp311-manylinux_2_28_x86_64.whl" + "https://files.pythonhosted.org/packages/49/b3/d8482e8cacc8ea15a356efea13d22ce1c5914a9ee36622ba250523240bf2/pyquaternion-0.9.9-py3-none-any.whl" ] } }, - "ncore_pip_deps_311_pynvvideocodec_cp311_cp311_win_amd64_ee5d2dc5": { + "ncore_pip_deps_311_pyquaternion_sdist_b1f61af2": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -10559,13 +12089,19 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "pynvvideocodec-2.1.0-cp311-cp311-win_amd64.whl", + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "pyquaternion-0.9.9.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "pynvvideocodec==2.1.0", - "sha256": "ee5d2dc56ac5ca8d223fa6fe8f57c67faf5ee1c9360216d9194cfbcd3f9d3948", + "requirement": "pyquaternion==0.9.9", + "sha256": "b1f61af219cb2fe966b5fb79a192124f2e63a3f7a777ac3cadf2957b1a81bea8", "urls": [ - "https://files.pythonhosted.org/packages/e5/29/0cb89a9cb860ecb0c96fc44a1aec7096909fe725c1fe9ca014e12fe2f994/pynvvideocodec-2.1.0-cp311-cp311-win_amd64.whl" + "https://files.pythonhosted.org/packages/7d/0d/3d092aa20efaedacb89c3221a92c6491be5b28f618a2c36b52b53e7446c2/pyquaternion-0.9.9.tar.gz" ] } }, @@ -11691,6 +13227,156 @@ ] } }, + "ncore_pip_deps_311_scikit_learn_cp311_cp311_macosx_10_9_x86_64_146b4d36": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "scikit-learn==1.8.0", + "sha256": "146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da", + "urls": [ + "https://files.pythonhosted.org/packages/c9/92/53ea2181da8ac6bf27170191028aee7251f8f841f8d3edbfdcaf2008fde9/scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_scikit_learn_cp311_cp311_macosx_12_0_arm64_f984ca4b": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "scikit-learn==1.8.0", + "sha256": "f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1", + "urls": [ + "https://files.pythonhosted.org/packages/01/18/d154dc1638803adf987910cdd07097d9c526663a55666a97c124d09fb96a/scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl" + ] + } + }, + "ncore_pip_deps_311_scikit_learn_cp311_cp311_manylinux_2_27_aarch64_5e30adb8": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "scikit-learn==1.8.0", + "sha256": "5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b", + "urls": [ + "https://files.pythonhosted.org/packages/8a/44/226142fcb7b7101e64fdee5f49dbe6288d4c7af8abf593237b70fca080a4/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl" + ] + } + }, + "ncore_pip_deps_311_scikit_learn_cp311_cp311_manylinux_2_27_x86_64_ada8121b": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "scikit-learn==1.8.0", + "sha256": "ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1", + "urls": [ + "https://files.pythonhosted.org/packages/36/4d/4a67f30778a45d542bbea5db2dbfa1e9e100bf9ba64aefe34215ba9f11f6/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl" + ] + } + }, + "ncore_pip_deps_311_scikit_learn_cp311_cp311_win_amd64_c57b1b61": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "scikit_learn-1.8.0-cp311-cp311-win_amd64.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "scikit-learn==1.8.0", + "sha256": "c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b", + "urls": [ + "https://files.pythonhosted.org/packages/89/3c/45c352094cfa60050bcbb967b1faf246b22e93cb459f2f907b600f2ceda5/scikit_learn-1.8.0-cp311-cp311-win_amd64.whl" + ] + } + }, + "ncore_pip_deps_311_scikit_learn_sdist_9bccbb3b": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "scikit_learn-1.8.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "scikit-learn==1.8.0", + "sha256": "9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", + "urls": [ + "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz" + ] + } + }, "ncore_pip_deps_311_scipy_cp311_cp311_macosx_10_13_x86_64_92233b2d": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { @@ -11991,55 +13677,7 @@ ] } }, - "ncore_pip_deps_311_shapely_cp311_cp311_macosx_10_9_x86_64_91121757": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@ncore_pip_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "shapely-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "ncore_pip_deps_311", - "requirement": "shapely==2.1.2", - "sha256": "91121757b0a36c9aac3427a651a7e6567110a4a67c97edf04f8d55d4765f6618", - "urls": [ - "https://files.pythonhosted.org/packages/8f/8d/1ff672dea9ec6a7b5d422eb6d095ed886e2e523733329f75fdcb14ee1149/shapely-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl" - ] - } - }, - "ncore_pip_deps_311_shapely_cp311_cp311_macosx_11_0_arm64_16a9c722": { - "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", - "attributes": { - "dep_template": "@ncore_pip_deps//{name}:{target}", - "experimental_target_platforms": [ - "cp311_linux_aarch64", - "cp311_linux_arm", - "cp311_linux_ppc", - "cp311_linux_s390x", - "cp311_linux_x86_64", - "cp311_osx_aarch64", - "cp311_osx_x86_64", - "cp311_windows_x86_64" - ], - "filename": "shapely-2.1.2-cp311-cp311-macosx_11_0_arm64.whl", - "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", - "repo": "ncore_pip_deps_311", - "requirement": "shapely==2.1.2", - "sha256": "16a9c722ba774cf50b5d4541242b4cce05aafd44a015290c82ba8a16931ff63d", - "urls": [ - "https://files.pythonhosted.org/packages/4f/ce/28fab8c772ce5db23a0d86bf0adaee0c4c79d5ad1db766055fa3dab442e2/shapely-2.1.2-cp311-cp311-macosx_11_0_arm64.whl" - ] - } - }, - "ncore_pip_deps_311_shapely_cp311_cp311_manylinux_2_17_aarch64_cc4f7397": { + "ncore_pip_deps_311_shapely_cp311_cp311_macosx_10_9_x86_64_5cf23400": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -12053,17 +13691,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "shapely-2.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", + "filename": "shapely-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "shapely==2.1.2", - "sha256": "cc4f7397459b12c0b196c9efe1f9d7e92463cbba142632b4cc6d8bbbbd3e2b09", + "requirement": "shapely==2.0.7", + "sha256": "5cf23400cb25deccf48c56a7cdda8197ae66c0e9097fcdd122ac2007e320bc34", "urls": [ - "https://files.pythonhosted.org/packages/70/8b/868b7e3f4982f5006e9395c1e12343c66a8155c0374fdc07c0e6a1ab547d/shapely-2.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl" + "https://files.pythonhosted.org/packages/1d/ad/21798c2fec013e289f8ab91d42d4d3299c315b8c4460c08c75fef0901713/shapely-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl" ] } }, - "ncore_pip_deps_311_shapely_cp311_cp311_manylinux_2_17_x86_64_136ab87b": { + "ncore_pip_deps_311_shapely_cp311_cp311_macosx_11_0_arm64_d8f1da01": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -12077,17 +13715,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "shapely-2.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", + "filename": "shapely-2.0.7-cp311-cp311-macosx_11_0_arm64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "shapely==2.1.2", - "sha256": "136ab87b17e733e22f0961504d05e77e7be8c9b5a8184f685b4a91a84efe3c26", + "requirement": "shapely==2.0.7", + "sha256": "d8f1da01c04527f7da59ee3755d8ee112cd8967c15fab9e43bba936b81e2a013", "urls": [ - "https://files.pythonhosted.org/packages/13/02/58b0b8d9c17c93ab6340edd8b7308c0c5a5b81f94ce65705819b7416dba5/shapely-2.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" + "https://files.pythonhosted.org/packages/15/63/eef4f180f1b5859c70e7f91d2f2570643e5c61e7d7c40743d15f8c6cbc42/shapely-2.0.7-cp311-cp311-macosx_11_0_arm64.whl" ] } }, - "ncore_pip_deps_311_shapely_cp311_cp311_musllinux_1_2_aarch64_16c5d0fc": { + "ncore_pip_deps_311_shapely_cp311_cp311_manylinux_2_17_aarch64_8f623b64": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -12101,17 +13739,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "shapely-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", + "filename": "shapely-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "shapely==2.1.2", - "sha256": "16c5d0fc45d3aa0a69074979f4f1928ca2734fb2e0dde8af9611e134e46774e7", + "requirement": "shapely==2.0.7", + "sha256": "8f623b64bb219d62014781120f47499a7adc30cf7787e24b659e56651ceebcb0", "urls": [ - "https://files.pythonhosted.org/packages/af/61/8e389c97994d5f331dcffb25e2fa761aeedfb52b3ad9bcdd7b8671f4810a/shapely-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl" + "https://files.pythonhosted.org/packages/fe/67/77851dd17738bbe7762a0ef1acf7bc499d756f68600dd68a987d78229412/shapely-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl" ] } }, - "ncore_pip_deps_311_shapely_cp311_cp311_musllinux_1_2_x86_64_6ddc759f": { + "ncore_pip_deps_311_shapely_cp311_cp311_manylinux_2_17_x86_64_e6d95703": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -12125,17 +13763,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "shapely-2.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", + "filename": "shapely-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "shapely==2.1.2", - "sha256": "6ddc759f72b5b2b0f54a7e7cde44acef680a55019eb52ac63a7af2cf17cb9cd2", + "requirement": "shapely==2.0.7", + "sha256": "e6d95703efaa64aaabf278ced641b888fc23d9c6dd71f8215091afd8a26a66e3", "urls": [ - "https://files.pythonhosted.org/packages/d3/d4/9b2a9fe6039f9e42ccf2cb3e84f219fd8364b0c3b8e7bbc857b5fbe9c14c/shapely-2.1.2-cp311-cp311-musllinux_1_2_x86_64.whl" + "https://files.pythonhosted.org/packages/0b/a5/2c8dbb0f383519771df19164e3bf3a8895d195d2edeab4b6040f176ee28e/shapely-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl" ] } }, - "ncore_pip_deps_311_shapely_cp311_cp311_win_amd64_c64d5c97": { + "ncore_pip_deps_311_shapely_cp311_cp311_win_amd64_b52f3ab8": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -12149,17 +13787,17 @@ "cp311_osx_x86_64", "cp311_windows_x86_64" ], - "filename": "shapely-2.1.2-cp311-cp311-win_amd64.whl", + "filename": "shapely-2.0.7-cp311-cp311-win_amd64.whl", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "shapely==2.1.2", - "sha256": "c64d5c97b2f47e3cd9b712eaced3b061f2b71234b3fc263e0fcf7d889c6559dc", + "requirement": "shapely==2.0.7", + "sha256": "b52f3ab845d32dfd20afba86675c91919a622f4627182daec64974db9b0b4608", "urls": [ - "https://files.pythonhosted.org/packages/38/1e/3f8ea46353c2a33c1669eb7327f9665103aa3a8dfe7f2e4ef714c210b2c2/shapely-2.1.2-cp311-cp311-win_amd64.whl" + "https://files.pythonhosted.org/packages/27/57/8ec7c62012bed06731f7ee979da7f207bbc4b27feed5f36680b6a70df54f/shapely-2.0.7-cp311-cp311-win_amd64.whl" ] } }, - "ncore_pip_deps_311_shapely_sdist_2ed4ecb2": { + "ncore_pip_deps_311_shapely_sdist_28fe2997": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { "dep_template": "@ncore_pip_deps//{name}:{target}", @@ -12179,13 +13817,13 @@ "--find-links", "https://download.pytorch.org/whl/cu128/torch" ], - "filename": "shapely-2.1.2.tar.gz", + "filename": "shapely-2.0.7.tar.gz", "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", "repo": "ncore_pip_deps_311", - "requirement": "shapely==2.1.2", - "sha256": "2ed4ecb28320a433db18a5bf029986aa8afcfd740745e78847e330d5d94922a9", + "requirement": "shapely==2.0.7", + "sha256": "28fe2997aab9a9dc026dc6a355d04e85841546b2a5d232ed953e3321ab958ee5", "urls": [ - "https://files.pythonhosted.org/packages/4d/bc/0989043118a27cccb4e906a46b7565ce36ca7b57f5a18b78f4f1b0f72d9d/shapely-2.1.2.tar.gz" + "https://files.pythonhosted.org/packages/21/c0/a911d1fd765d07a2b6769ce155219a281bfbe311584ebe97340d75c5bdb1/shapely-2.0.7.tar.gz" ] } }, @@ -13191,6 +14829,60 @@ ] } }, + "ncore_pip_deps_311_threadpoolctl_py3_none_any_43a0b8fd": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "filename": "threadpoolctl-3.6.0-py3-none-any.whl", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "threadpoolctl==3.6.0", + "sha256": "43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", + "urls": [ + "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl" + ] + } + }, + "ncore_pip_deps_311_threadpoolctl_sdist_8ab8b4aa": { + "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", + "attributes": { + "dep_template": "@ncore_pip_deps//{name}:{target}", + "experimental_target_platforms": [ + "cp311_linux_aarch64", + "cp311_linux_arm", + "cp311_linux_ppc", + "cp311_linux_s390x", + "cp311_linux_x86_64", + "cp311_osx_aarch64", + "cp311_osx_x86_64", + "cp311_windows_x86_64" + ], + "extra_pip_args": [ + "--index-url", + "https://pypi.org/simple", + "--find-links", + "https://download.pytorch.org/whl/cu128/torch" + ], + "filename": "threadpoolctl-3.6.0.tar.gz", + "python_interpreter_target": "@@rules_python++python+python_3_11_host//:python", + "repo": "ncore_pip_deps_311", + "requirement": "threadpoolctl==3.6.0", + "sha256": "8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", + "urls": [ + "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz" + ] + } + }, "ncore_pip_deps_311_tinycss2_py3_none_any_3a49cf47": { "repoRuleId": "@@rules_python+//python/private/pypi:whl_library.bzl%whl_library", "attributes": { @@ -20040,16 +21732,20 @@ "babel": "{\"ncore_pip_deps_311_babel_py3_none_any_4d0b5309\":[{\"filename\":\"babel-2.17.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_babel_sdist_0c54cffb\":[{\"filename\":\"babel-2.17.0.tar.gz\",\"version\":\"3.11\"}]}", "beautifulsoup4": "{\"ncore_pip_deps_311_beautifulsoup4_py3_none_any_99045d7d\":[{\"filename\":\"beautifulsoup4-4.13.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_beautifulsoup4_sdist_1bd32405\":[{\"filename\":\"beautifulsoup4-4.13.3.tar.gz\",\"version\":\"3.11\"}]}", "bleach": "{\"ncore_pip_deps_311_bleach_py3_none_any_117d9c60\":[{\"filename\":\"bleach-6.2.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_bleach_sdist_123e8941\":[{\"filename\":\"bleach-6.2.0.tar.gz\",\"version\":\"3.11\"}]}", + "cachetools": "{\"ncore_pip_deps_311_cachetools_py3_none_any_9876787e\":[{\"filename\":\"cachetools-7.1.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_cachetools_sdist_135cfe94\":[{\"filename\":\"cachetools-7.1.3.tar.gz\",\"version\":\"3.11\"}]}", "cbor2": "{\"ncore_pip_deps_311_cbor2_cp311_cp311_macosx_11_0_arm64_0485d337\":[{\"filename\":\"cbor2-5.9.0-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_cbor2_cp311_cp311_manylinux_2_17_aarch64_a9d6e4e0\":[{\"filename\":\"cbor2-5.9.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_cbor2_cp311_cp311_manylinux_2_17_x86_64_5326336f\":[{\"filename\":\"cbor2-5.9.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_cbor2_cp311_cp311_musllinux_1_2_aarch64_5e702b02\":[{\"filename\":\"cbor2-5.9.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_cbor2_cp311_cp311_musllinux_1_2_x86_64_2372d357\":[{\"filename\":\"cbor2-5.9.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_cbor2_cp311_cp311_win_amd64_1d02b65f\":[{\"filename\":\"cbor2-5.9.0-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_cbor2_py3_none_any_27695cbd\":[{\"filename\":\"cbor2-5.9.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_cbor2_sdist_85c7a462\":[{\"filename\":\"cbor2-5.9.0.tar.gz\",\"version\":\"3.11\"}],\"ncore_pip_deps_38_cbor2_cp38_cp38_macosx_10_9_x86_64_d2984a48\":[{\"filename\":\"cbor2-5.4.6-cp38-cp38-macosx_10_9_x86_64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_cbor2_cp38_cp38_macosx_11_0_arm64_c285a2cb\":[{\"filename\":\"cbor2-5.4.6-cp38-cp38-macosx_11_0_arm64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_cbor2_cp38_cp38_manylinux_2_17_aarch64_6709d976\":[{\"filename\":\"cbor2-5.4.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_cbor2_cp38_cp38_manylinux_2_17_x86_64_96087fa5\":[{\"filename\":\"cbor2-5.4.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_cbor2_cp38_cp38_musllinux_1_1_aarch64_0d2b926b\":[{\"filename\":\"cbor2-5.4.6-cp38-cp38-musllinux_1_1_aarch64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_cbor2_cp38_cp38_musllinux_1_1_x86_64_6e1b5aee\":[{\"filename\":\"cbor2-5.4.6-cp38-cp38-musllinux_1_1_x86_64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_cbor2_cp38_cp38_win_amd64_79e048e6\":[{\"filename\":\"cbor2-5.4.6-cp38-cp38-win_amd64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_cbor2_py3_none_any_181ac494\":[{\"filename\":\"cbor2-5.4.6-py3-none-any.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_cbor2_sdist_b893500d\":[{\"filename\":\"cbor2-5.4.6.tar.gz\",\"version\":\"3.8\"}]}", "certifi": "{\"ncore_pip_deps_311_certifi_py3_none_any_ca78db45\":[{\"filename\":\"certifi-2025.1.31-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_certifi_sdist_3d5da692\":[{\"filename\":\"certifi-2025.1.31.tar.gz\",\"version\":\"3.11\"}]}", "charset_normalizer": "{\"ncore_pip_deps_311_charset_normalizer_cp311_cp311_macosx_10_9_universal2_8bfa33f4\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_aarch64_28bf5762\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_ppc64le_f08ff5e9\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_s390x_234ac59e\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_cp311_cp311_manylinux_2_17_x86_64_fd4ec41f\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_aarch64_c96836c9\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_ppc64le_09b5e673\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_s390x_5777ee08\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_cp311_cp311_musllinux_1_2_x86_64_237bdbe6\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_cp311_cp311_win_amd64_d7f50a1f\":[{\"filename\":\"charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_py3_none_any_d98b1668\":[{\"filename\":\"charset_normalizer-3.4.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_charset_normalizer_sdist_44251f18\":[{\"filename\":\"charset_normalizer-3.4.1.tar.gz\",\"version\":\"3.11\"}]}", "click": "{\"ncore_pip_deps_311_click_py3_none_any_63c132bb\":[{\"filename\":\"click-8.1.8-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_click_sdist_ed53c9d8\":[{\"filename\":\"click-8.1.8.tar.gz\",\"version\":\"3.11\"}]}", "colorlog": "{\"ncore_pip_deps_311_colorlog_py3_none_any_2d7e8348\":[{\"filename\":\"colorlog-6.10.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_colorlog_sdist_eb4ae5cb\":[{\"filename\":\"colorlog-6.10.1.tar.gz\",\"version\":\"3.11\"}]}", + "contourpy": "{\"ncore_pip_deps_311_contourpy_cp311_cp311_macosx_10_9_x86_64_3e8b974d\":[{\"filename\":\"contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_contourpy_cp311_cp311_macosx_11_0_arm64_20914c8c\":[{\"filename\":\"contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_contourpy_cp311_cp311_manylinux_2_17_aarch64_19d40d37\":[{\"filename\":\"contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_contourpy_cp311_cp311_manylinux_2_17_ppc64le_113231fe\":[{\"filename\":\"contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_contourpy_cp311_cp311_manylinux_2_17_s390x_4dbbc03a\":[{\"filename\":\"contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_contourpy_cp311_cp311_manylinux_2_17_x86_64_3a04ecd6\":[{\"filename\":\"contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_contourpy_cp311_cp311_musllinux_1_2_aarch64_c414fc1e\":[{\"filename\":\"contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_contourpy_cp311_cp311_musllinux_1_2_x86_64_31c1b55c\":[{\"filename\":\"contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_contourpy_cp311_cp311_win_amd64_b2bdca22\":[{\"filename\":\"contourpy-1.3.1-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_contourpy_sdist_dfd97abd\":[{\"filename\":\"contourpy-1.3.1.tar.gz\",\"version\":\"3.11\"}]}", + "cycler": "{\"ncore_pip_deps_311_cycler_py3_none_any_85cef7cf\":[{\"filename\":\"cycler-0.12.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_cycler_sdist_88bb128f\":[{\"filename\":\"cycler-0.12.1.tar.gz\",\"version\":\"3.11\"}]}", "dataclasses_json": "{\"ncore_pip_deps_311_dataclasses_json_py3_none_any_0dbf33f2\":[{\"filename\":\"dataclasses_json-0.6.7-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_dataclasses_json_sdist_b6b3e528\":[{\"filename\":\"dataclasses_json-0.6.7.tar.gz\",\"version\":\"3.11\"}],\"ncore_pip_deps_38_dataclasses_json_py3_none_any_5ec6fed6\":[{\"filename\":\"dataclasses_json-0.5.14-py3-none-any.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_dataclasses_json_sdist_d82896a9\":[{\"filename\":\"dataclasses_json-0.5.14.tar.gz\",\"version\":\"3.8\"}]}", "debugpy": "{\"ncore_pip_deps_311_debugpy_cp311_cp311_macosx_14_0_universal2_36f48298\":[{\"filename\":\"debugpy-1.8.12-cp311-cp311-macosx_14_0_universal2.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_debugpy_cp311_cp311_manylinux_2_5_x86_64_a28ed481\":[{\"filename\":\"debugpy-1.8.12-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_debugpy_cp311_cp311_win_amd64_4703575b\":[{\"filename\":\"debugpy-1.8.12-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_debugpy_py2_none_any_274b6a20\":[{\"filename\":\"debugpy-1.8.12-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_debugpy_sdist_646530b0\":[{\"filename\":\"debugpy-1.8.12.tar.gz\",\"version\":\"3.11\"}]}", "decorator": "{\"ncore_pip_deps_311_decorator_py3_none_any_d316bb41\":[{\"filename\":\"decorator-5.2.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_decorator_sdist_65f26614\":[{\"filename\":\"decorator-5.2.1.tar.gz\",\"version\":\"3.11\"}]}", "defusedxml": "{\"ncore_pip_deps_311_defusedxml_py2_none_any_a352e7e4\":[{\"filename\":\"defusedxml-0.7.1-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_defusedxml_sdist_1bb3032d\":[{\"filename\":\"defusedxml-0.7.1.tar.gz\",\"version\":\"3.11\"}]}", "deprecated": "{\"ncore_pip_deps_311_deprecated_py2_none_any_bd501178\":[{\"filename\":\"Deprecated-1.2.18-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_deprecated_sdist_422b6f6d\":[{\"filename\":\"deprecated-1.2.18.tar.gz\",\"version\":\"3.11\"}]}", + "descartes": "{\"ncore_pip_deps_311_descartes_py2_none_any_b7e412e7\":[{\"filename\":\"descartes-1.1.0-py2-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_descartes_sdist_135a5021\":[{\"filename\":\"descartes-1.1.0.tar.gz\",\"version\":\"3.11\"}]}", "docutils": "{\"ncore_pip_deps_311_docutils_py3_none_any_d0013f54\":[{\"filename\":\"docutils-0.22.4-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_docutils_sdist_4db53b1f\":[{\"filename\":\"docutils-0.22.4.tar.gz\",\"version\":\"3.11\"}]}", "dracopy": "{\"ncore_pip_deps_311_dracopy_cp311_cp311_macosx_10_9_x86_64_c4131151\":[{\"filename\":\"dracopy-2.0.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_dracopy_cp311_cp311_macosx_11_0_arm64_e16575ab\":[{\"filename\":\"dracopy-2.0.0-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_dracopy_cp311_cp311_manylinux_2_24_aarch64_418964da\":[{\"filename\":\"dracopy-2.0.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_dracopy_cp311_cp311_manylinux_2_24_x86_64_fa9a3215\":[{\"filename\":\"dracopy-2.0.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_dracopy_cp311_cp311_win_amd64_106c968f\":[{\"filename\":\"dracopy-2.0.0-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}]}", "embreex": "{\"ncore_pip_deps_311_embreex_cp311_cp311_macosx_10_9_x86_64_8154ab34\":[{\"filename\":\"embreex-2.17.7.post7-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_embreex_cp311_cp311_manylinux_2_12_x86_64_c4775a4d\":[{\"filename\":\"embreex-2.17.7.post7-cp311-cp311-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_embreex_cp311_cp311_win_amd64_a1157976\":[{\"filename\":\"embreex-2.17.7.post7-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}]}", @@ -20059,7 +21755,9 @@ "fasteners": "{\"ncore_pip_deps_311_fasteners_py3_none_any_758819cb\":[{\"filename\":\"fasteners-0.19-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fasteners_sdist_b4f37c3a\":[{\"filename\":\"fasteners-0.19.tar.gz\",\"version\":\"3.11\"}],\"ncore_pip_deps_38_fasteners_py3_none_any_1d4caf5f\":[{\"filename\":\"fasteners-0.18-py3-none-any.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_fasteners_sdist_cb7c13ef\":[{\"filename\":\"fasteners-0.18.tar.gz\",\"version\":\"3.8\"}]}", "fastjsonschema": "{\"ncore_pip_deps_311_fastjsonschema_py3_none_any_c9e5b7e9\":[{\"filename\":\"fastjsonschema-2.21.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fastjsonschema_sdist_794d4f0a\":[{\"filename\":\"fastjsonschema-2.21.1.tar.gz\",\"version\":\"3.11\"}]}", "filelock": "{\"ncore_pip_deps_311_filelock_py3_none_any_96f5f634\":[{\"filename\":\"filelock-3.29.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_filelock_sdist_69974355\":[{\"filename\":\"filelock-3.29.0.tar.gz\",\"version\":\"3.11\"}]}", + "fire": "{\"ncore_pip_deps_311_fire_py3_none_any_e43fd8a5\":[{\"filename\":\"fire-0.7.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fire_sdist_3b208f05\":[{\"filename\":\"fire-0.7.1.tar.gz\",\"version\":\"3.11\"}]}", "flatbuffers": "{\"ncore_pip_deps_311_flatbuffers_py2_none_any_7634f50c\":[{\"filename\":\"flatbuffers-25.12.19-py2.py3-none-any.whl\",\"version\":\"3.11\"}]}", + "fonttools": "{\"ncore_pip_deps_311_fonttools_cp311_cp311_macosx_10_9_universal2_7ef04bc7\":[{\"filename\":\"fonttools-4.56.0-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fonttools_cp311_cp311_macosx_10_9_x86_64_ffda9b8c\":[{\"filename\":\"fonttools-4.56.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fonttools_cp311_cp311_manylinux_2_17_aarch64_e2e993e8\":[{\"filename\":\"fonttools-4.56.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fonttools_cp311_cp311_manylinux_2_17_x86_64_003548ea\":[{\"filename\":\"fonttools-4.56.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fonttools_cp311_cp311_musllinux_1_2_aarch64_bd982582\":[{\"filename\":\"fonttools-4.56.0-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fonttools_cp311_cp311_musllinux_1_2_x86_64_b23d30a2\":[{\"filename\":\"fonttools-4.56.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fonttools_cp311_cp311_win_amd64_14a3e3e6\":[{\"filename\":\"fonttools-4.56.0-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fonttools_py3_none_any_1088182f\":[{\"filename\":\"fonttools-4.56.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fonttools_sdist_a114d156\":[{\"filename\":\"fonttools-4.56.0.tar.gz\",\"version\":\"3.11\"}]}", "fsspec": "{\"ncore_pip_deps_311_fsspec_py3_none_any_7c771235\":[{\"filename\":\"fsspec-2025.10.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_fsspec_sdist_b6789427\":[{\"filename\":\"fsspec-2025.10.0.tar.gz\",\"version\":\"3.11\"}],\"ncore_pip_deps_38_fsspec_py3_none_any_efb87af3\":[{\"filename\":\"fsspec-2025.3.0-py3-none-any.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_fsspec_sdist_a935fd1e\":[{\"filename\":\"fsspec-2025.3.0.tar.gz\",\"version\":\"3.8\"}]}", "gast": "{\"ncore_pip_deps_311_gast_py3_none_any_52b18231\":[{\"filename\":\"gast-0.6.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_gast_sdist_88fc5300\":[{\"filename\":\"gast-0.6.0.tar.gz\",\"version\":\"3.11\"}]}", "google_pasta": "{\"ncore_pip_deps_311_google_pasta_py3_none_any_b3248279\":[{\"filename\":\"google_pasta-0.2.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_google_pasta_sdist_c9f2c8df\":[{\"filename\":\"google-pasta-0.2.0.tar.gz\",\"version\":\"3.11\"}]}", @@ -20076,12 +21774,14 @@ "ipython_pygments_lexers": "{\"ncore_pip_deps_311_ipython_pygments_lexers_py3_none_any_a9462224\":[{\"filename\":\"ipython_pygments_lexers-1.1.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_ipython_pygments_lexers_sdist_09c01380\":[{\"filename\":\"ipython_pygments_lexers-1.1.1.tar.gz\",\"version\":\"3.11\"}]}", "jedi": "{\"ncore_pip_deps_311_jedi_py2_none_any_a8ef22bd\":[{\"filename\":\"jedi-0.19.2-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_jedi_sdist_4770dc3d\":[{\"filename\":\"jedi-0.19.2.tar.gz\",\"version\":\"3.11\"}]}", "jinja2": "{\"ncore_pip_deps_311_jinja2_py3_none_any_aba0f4dc\":[{\"filename\":\"jinja2-3.1.5-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_jinja2_sdist_8fefff8d\":[{\"filename\":\"jinja2-3.1.5.tar.gz\",\"version\":\"3.11\"}]}", + "joblib": "{\"ncore_pip_deps_311_joblib_py3_none_any_5fc3c503\":[{\"filename\":\"joblib-1.5.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_joblib_sdist_8561a326\":[{\"filename\":\"joblib-1.5.3.tar.gz\",\"version\":\"3.11\"}]}", "jsonschema": "{\"ncore_pip_deps_311_jsonschema_py3_none_any_fbadb6f8\":[{\"filename\":\"jsonschema-4.23.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_jsonschema_sdist_d71497fe\":[{\"filename\":\"jsonschema-4.23.0.tar.gz\",\"version\":\"3.11\"}]}", "jsonschema_specifications": "{\"ncore_pip_deps_311_jsonschema_specifications_py3_none_any_a09a0680\":[{\"filename\":\"jsonschema_specifications-2024.10.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_jsonschema_specifications_sdist_0f38b836\":[{\"filename\":\"jsonschema_specifications-2024.10.1.tar.gz\",\"version\":\"3.11\"}]}", "jupyter_client": "{\"ncore_pip_deps_311_jupyter_client_py3_none_any_e8a19cc9\":[{\"filename\":\"jupyter_client-8.6.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_jupyter_client_sdist_35b3a094\":[{\"filename\":\"jupyter_client-8.6.3.tar.gz\",\"version\":\"3.11\"}]}", "jupyter_core": "{\"ncore_pip_deps_311_jupyter_core_py3_none_any_4f7315d2\":[{\"filename\":\"jupyter_core-5.7.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_jupyter_core_sdist_aa5f8d32\":[{\"filename\":\"jupyter_core-5.7.2.tar.gz\",\"version\":\"3.11\"}]}", "jupyterlab_pygments": "{\"ncore_pip_deps_311_jupyterlab_pygments_py3_none_any_841a8902\":[{\"filename\":\"jupyterlab_pygments-0.3.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_jupyterlab_pygments_sdist_721aca4d\":[{\"filename\":\"jupyterlab_pygments-0.3.0.tar.gz\",\"version\":\"3.11\"}]}", "keras": "{\"ncore_pip_deps_311_keras_py3_none_any_ebd2c14d\":[{\"filename\":\"keras-3.14.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_keras_sdist_ef479173\":[{\"filename\":\"keras-3.14.1.tar.gz\",\"version\":\"3.11\"}]}", + "kiwisolver": "{\"ncore_pip_deps_311_kiwisolver_cp311_cp311_macosx_10_9_universal2_a4d36019\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_macosx_10_9_x86_64_856b269c\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_macosx_11_0_arm64_c2b9a96e\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_manylinux_2_17_aarch64_dace81d2\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_manylinux_2_17_ppc64le_11e1022b\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_manylinux_2_17_s390x_3b9b4d28\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_manylinux_2_17_x86_64_3a96c0e7\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_musllinux_1_2_aarch64_23454ff0\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_musllinux_1_2_ppc64le_b21dbe16\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_musllinux_1_2_s390x_768cade2\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_musllinux_1_2_x86_64_d47cfb26\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_cp311_cp311_win_amd64_ed33ca20\":[{\"filename\":\"kiwisolver-1.4.8-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_kiwisolver_sdist_23d5f023\":[{\"filename\":\"kiwisolver-1.4.8.tar.gz\",\"version\":\"3.11\"}]}", "libclang": "{\"ncore_pip_deps_311_libclang_py2_none_macosx_10_9_x86_64_6f14c3f1\":[{\"filename\":\"libclang-18.1.1-py2.py3-none-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_libclang_py2_none_macosx_11_0_arm64_83ce5045\":[{\"filename\":\"libclang-18.1.1-py2.py3-none-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_libclang_py2_none_manylinux_2_12_x86_64_c533091d\":[{\"filename\":\"libclang-18.1.1-py2.py3-none-manylinux2010_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_libclang_py2_none_manylinux_2_17_aarch64_54dda940\":[{\"filename\":\"libclang-18.1.1-py2.py3-none-manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_libclang_py2_none_manylinux_2_17_armv7l_cf4a99b0\":[{\"filename\":\"libclang-18.1.1-py2.py3-none-manylinux2014_armv7l.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_libclang_py2_none_musllinux_1_2_x86_64_69f8eb8f\":[{\"filename\":\"libclang-18.1.1-py2.py3-none-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_libclang_py2_none_win_amd64_4dd2d3b8\":[{\"filename\":\"libclang-18.1.1-py2.py3-none-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_libclang_sdist_a1214966\":[{\"filename\":\"libclang-18.1.1.tar.gz\",\"version\":\"3.11\"}]}", "lxml": "{\"ncore_pip_deps_311_lxml_cp311_cp311_macosx_10_9_universal2_13e35cbc\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_cp311_cp311_macosx_10_9_x86_64_3b1675e0\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_cp311_cp311_manylinux_2_17_aarch64_8ac6e581\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_cp311_cp311_manylinux_2_17_x86_64_5aa0fc67\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_cp311_cp311_manylinux_2_26_aarch64_de496365\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_cp311_cp311_manylinux_2_26_x86_64_7d2de809\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_cp311_cp311_manylinux_2_31_armv7l_b2c3da8d\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_cp311_cp311_musllinux_1_2_aarch64_2593c77e\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_cp311_cp311_musllinux_1_2_armv7l_3e3cb088\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_cp311_cp311_musllinux_1_2_x86_64_b8f18914\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_cp311_cp311_win_amd64_e5867f26\":[{\"filename\":\"lxml-6.0.2-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_lxml_sdist_cd79f336\":[{\"filename\":\"lxml-6.0.2.tar.gz\",\"version\":\"3.11\"}]}", "manifold3d": "{\"ncore_pip_deps_311_manifold3d_cp311_cp311_macosx_10_14_universal2_6f395cc9\":[{\"filename\":\"manifold3d-3.4.0-cp311-cp311-macosx_10_14_universal2.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_manifold3d_cp311_cp311_macosx_10_14_x86_64_ae5dee5e\":[{\"filename\":\"manifold3d-3.4.0-cp311-cp311-macosx_10_14_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_manifold3d_cp311_cp311_macosx_11_0_arm64_2d7c7cae\":[{\"filename\":\"manifold3d-3.4.0-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_manifold3d_cp311_cp311_manylinux_2_17_aarch64_b332ee7b\":[{\"filename\":\"manifold3d-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_manifold3d_cp311_cp311_manylinux_2_27_x86_64_ec538215\":[{\"filename\":\"manifold3d-3.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_manifold3d_cp311_cp311_win_amd64_4d330587\":[{\"filename\":\"manifold3d-3.4.0-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_manifold3d_sdist_4e082bda\":[{\"filename\":\"manifold3d-3.4.0.tar.gz\",\"version\":\"3.11\"}]}", @@ -20090,6 +21790,7 @@ "markdown_it_py": "{\"ncore_pip_deps_311_markdown_it_py_py3_none_any_35521684\":[{\"filename\":\"markdown_it_py-3.0.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_markdown_it_py_sdist_e3f60a94\":[{\"filename\":\"markdown-it-py-3.0.0.tar.gz\",\"version\":\"3.11\"}]}", "markupsafe": "{\"ncore_pip_deps_311_markupsafe_cp311_cp311_macosx_10_9_universal2_9025b401\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_markupsafe_cp311_cp311_macosx_11_0_arm64_93335ca3\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_markupsafe_cp311_cp311_manylinux_2_17_aarch64_2cb8438c\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_markupsafe_cp311_cp311_manylinux_2_17_x86_64_a123e330\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_markupsafe_cp311_cp311_musllinux_1_2_aarch64_d8213e09\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_markupsafe_cp311_cp311_musllinux_1_2_x86_64_0bff5e0a\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_markupsafe_cp311_cp311_win_amd64_70a87b41\":[{\"filename\":\"MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_markupsafe_sdist_ee55d3ed\":[{\"filename\":\"markupsafe-3.0.2.tar.gz\",\"version\":\"3.11\"}]}", "marshmallow": "{\"ncore_pip_deps_311_marshmallow_py3_none_any_3350409f\":[{\"filename\":\"marshmallow-3.26.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_marshmallow_sdist_e6d8affb\":[{\"filename\":\"marshmallow-3.26.1.tar.gz\",\"version\":\"3.11\"}],\"ncore_pip_deps_38_marshmallow_py3_none_any_684939db\":[{\"filename\":\"marshmallow-3.20.1-py3-none-any.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_marshmallow_sdist_5d2371bb\":[{\"filename\":\"marshmallow-3.20.1.tar.gz\",\"version\":\"3.8\"}]}", + "matplotlib": "{\"ncore_pip_deps_311_matplotlib_cp311_cp311_macosx_10_12_x86_64_fd44fc75\":[{\"filename\":\"matplotlib-3.10.0-cp311-cp311-macosx_10_12_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_matplotlib_cp311_cp311_macosx_11_0_arm64_c58a9622\":[{\"filename\":\"matplotlib-3.10.0-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_matplotlib_cp311_cp311_manylinux_2_17_aarch64_845d9656\":[{\"filename\":\"matplotlib-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_matplotlib_cp311_cp311_manylinux_2_17_x86_64_5439f4c5\":[{\"filename\":\"matplotlib-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_matplotlib_cp311_cp311_musllinux_1_2_x86_64_4673ff67\":[{\"filename\":\"matplotlib-3.10.0-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_matplotlib_cp311_cp311_win_amd64_7e8632ba\":[{\"filename\":\"matplotlib-3.10.0-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_matplotlib_sdist_b886d02a\":[{\"filename\":\"matplotlib-3.10.0.tar.gz\",\"version\":\"3.11\"}]}", "matplotlib_inline": "{\"ncore_pip_deps_311_matplotlib_inline_py3_none_any_d56ce515\":[{\"filename\":\"matplotlib_inline-0.2.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_matplotlib_inline_sdist_e1ee949c\":[{\"filename\":\"matplotlib_inline-0.2.1.tar.gz\",\"version\":\"3.11\"}]}", "mdurl": "{\"ncore_pip_deps_311_mdurl_py3_none_any_84008a41\":[{\"filename\":\"mdurl-0.1.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_mdurl_sdist_bb413d29\":[{\"filename\":\"mdurl-0.1.2.tar.gz\",\"version\":\"3.11\"}]}", "mistune": "{\"ncore_pip_deps_311_mistune_py2_none_any_bad7f5d4\":[{\"filename\":\"mistune-2.0.5-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_mistune_sdist_0246113c\":[{\"filename\":\"mistune-2.0.5.tar.gz\",\"version\":\"3.11\"}]}", @@ -20105,6 +21806,7 @@ "networkx": "{\"ncore_pip_deps_311_networkx_py3_none_any_d47fbf30\":[{\"filename\":\"networkx-3.6.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_networkx_sdist_26b7c357\":[{\"filename\":\"networkx-3.6.1.tar.gz\",\"version\":\"3.11\"}]}", "numcodecs": "{\"ncore_pip_deps_311_numcodecs_cp311_cp311_macosx_10_9_x86_64_698f1d59\":[{\"filename\":\"numcodecs-0.15.1-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numcodecs_cp311_cp311_macosx_11_0_arm64_bef8c8e6\":[{\"filename\":\"numcodecs-0.15.1-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numcodecs_cp311_cp311_manylinux_2_17_x86_64_cdfaef9f\":[{\"filename\":\"numcodecs-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numcodecs_cp311_cp311_win_amd64_e2547fa3\":[{\"filename\":\"numcodecs-0.15.1-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numcodecs_sdist_eeed77e4\":[{\"filename\":\"numcodecs-0.15.1.tar.gz\",\"version\":\"3.11\"}],\"ncore_pip_deps_38_numcodecs_cp38_cp38_macosx_10_9_x86_64_0c240858\":[{\"filename\":\"numcodecs-0.11.0-cp38-cp38-macosx_10_9_x86_64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_numcodecs_cp38_cp38_manylinux_2_17_x86_64_ee5bda16\":[{\"filename\":\"numcodecs-0.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_numcodecs_cp38_cp38_win_amd64_bd05cdb8\":[{\"filename\":\"numcodecs-0.11.0-cp38-cp38-win_amd64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_numcodecs_sdist_6c058b32\":[{\"filename\":\"numcodecs-0.11.0.tar.gz\",\"version\":\"3.8\"}]}", "numpy": "{\"ncore_pip_deps_311_numpy_cp311_cp311_macosx_10_9_x86_64_4c66707f\":[{\"filename\":\"numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numpy_cp311_cp311_macosx_11_0_arm64_edd8b5fe\":[{\"filename\":\"numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numpy_cp311_cp311_manylinux_2_17_aarch64_7ab55401\":[{\"filename\":\"numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numpy_cp311_cp311_manylinux_2_17_x86_64_666dbfb6\":[{\"filename\":\"numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numpy_cp311_cp311_musllinux_1_1_aarch64_96ff0b2a\":[{\"filename\":\"numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numpy_cp311_cp311_musllinux_1_1_x86_64_60dedbb9\":[{\"filename\":\"numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numpy_cp311_cp311_win_amd64_cd25bcec\":[{\"filename\":\"numpy-1.26.4-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_numpy_sdist_2a02aba9\":[{\"filename\":\"numpy-1.26.4.tar.gz\",\"version\":\"3.11\"}],\"ncore_pip_deps_38_numpy_cp38_cp38_macosx_10_9_x86_64_cf240200\":[{\"filename\":\"numpy-1.19.5-cp38-cp38-macosx_10_9_x86_64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_numpy_cp38_cp38_manylinux_2_12_x86_64_a9d17f2b\":[{\"filename\":\"numpy-1.19.5-cp38-cp38-manylinux2010_x86_64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_numpy_cp38_cp38_manylinux_2_17_aarch64_99abf4f3\":[{\"filename\":\"numpy-1.19.5-cp38-cp38-manylinux2014_aarch64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_numpy_cp38_cp38_manylinux_2_5_x86_64_012426a4\":[{\"filename\":\"numpy-1.19.5-cp38-cp38-manylinux1_x86_64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_numpy_cp38_cp38_win_amd64_811daee3\":[{\"filename\":\"numpy-1.19.5-cp38-cp38-win_amd64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_numpy_sdist_a76f5024\":[{\"filename\":\"numpy-1.19.5.zip\",\"version\":\"3.8\"}]}", + "nuscenes_devkit": "{\"ncore_pip_deps_311_nuscenes_devkit_py3_none_any_76cee0e7\":[{\"filename\":\"nuscenes_devkit-1.2.0-py3-none-any.whl\",\"version\":\"3.11\"}]}", "nvidia_cublas_cu12": "{\"ncore_pip_deps_311_nvidia_cublas_cu12_py3_none_manylinux_2_27_aarch64_93a4e0e3\":[{\"filename\":\"nvidia_cublas_cu12-12.8.3.14-py3-none-manylinux_2_27_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_nvidia_cublas_cu12_py3_none_manylinux_2_27_x86_64_3f0e05e7\":[{\"filename\":\"nvidia_cublas_cu12-12.8.3.14-py3-none-manylinux_2_27_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_nvidia_cublas_cu12_py3_none_win_amd64_9ae5eae5\":[{\"filename\":\"nvidia_cublas_cu12-12.8.3.14-py3-none-win_amd64.whl\",\"version\":\"3.11\"}]}", "nvidia_cuda_cupti_cu12": "{\"ncore_pip_deps_311_nvidia_cuda_cupti_cu12_py3_none_manylinux_2_17_aarch64_ff154211\":[{\"filename\":\"nvidia_cuda_cupti_cu12-12.8.57-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_nvidia_cuda_cupti_cu12_py3_none_manylinux_2_17_x86_64_8e0b2eb8\":[{\"filename\":\"nvidia_cuda_cupti_cu12-12.8.57-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_nvidia_cuda_cupti_cu12_py3_none_win_amd64_bbed719c\":[{\"filename\":\"nvidia_cuda_cupti_cu12-12.8.57-py3-none-win_amd64.whl\",\"version\":\"3.11\"}]}", "nvidia_cuda_nvrtc_cu12": "{\"ncore_pip_deps_311_nvidia_cuda_nvrtc_cu12_py3_none_manylinux_2_12_x86_64_a0fa9c2a\":[{\"filename\":\"nvidia_cuda_nvrtc_cu12-12.8.61-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_nvidia_cuda_nvrtc_cu12_py3_none_manylinux_2_17_aarch64_b1f376bf\":[{\"filename\":\"nvidia_cuda_nvrtc_cu12-12.8.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_nvidia_cuda_nvrtc_cu12_py3_none_win_amd64_9c8887bf\":[{\"filename\":\"nvidia_cuda_nvrtc_cu12-12.8.61-py3-none-win_amd64.whl\",\"version\":\"3.11\"}]}", @@ -20139,10 +21841,13 @@ "ptyprocess": "{\"ncore_pip_deps_311_ptyprocess_py2_none_any_4b41f396\":[{\"filename\":\"ptyprocess-0.7.0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_ptyprocess_sdist_5c5d0a3b\":[{\"filename\":\"ptyprocess-0.7.0.tar.gz\",\"version\":\"3.11\"}]}", "pure_eval": "{\"ncore_pip_deps_311_pure_eval_py3_none_any_1db8e35b\":[{\"filename\":\"pure_eval-0.2.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pure_eval_sdist_5f4e983f\":[{\"filename\":\"pure_eval-0.2.3.tar.gz\",\"version\":\"3.11\"}]}", "pyarrow": "{\"ncore_pip_deps_311_pyarrow_cp311_cp311_macosx_12_0_arm64_6f0147ee\":[{\"filename\":\"pyarrow-23.0.1-cp311-cp311-macosx_12_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pyarrow_cp311_cp311_macosx_12_0_x86_64_0ae6e17c\":[{\"filename\":\"pyarrow-23.0.1-cp311-cp311-macosx_12_0_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pyarrow_cp311_cp311_manylinux_2_28_aarch64_fed70202\":[{\"filename\":\"pyarrow-23.0.1-cp311-cp311-manylinux_2_28_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pyarrow_cp311_cp311_manylinux_2_28_x86_64_26d50dee\":[{\"filename\":\"pyarrow-23.0.1-cp311-cp311-manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pyarrow_cp311_cp311_musllinux_1_2_aarch64_3c30143b\":[{\"filename\":\"pyarrow-23.0.1-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pyarrow_cp311_cp311_musllinux_1_2_x86_64_db2190fa\":[{\"filename\":\"pyarrow-23.0.1-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pyarrow_cp311_cp311_win_amd64_f00f993a\":[{\"filename\":\"pyarrow-23.0.1-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pyarrow_sdist_b8c5873e\":[{\"filename\":\"pyarrow-23.0.1.tar.gz\",\"version\":\"3.11\"}]}", + "pycocotools": "{\"ncore_pip_deps_311_pycocotools_cp311_cp311_macosx_10_9_universal2_81bdceeb\":[{\"filename\":\"pycocotools-2.0.11-cp311-cp311-macosx_10_9_universal2.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pycocotools_cp311_cp311_manylinux_2_17_aarch64_a1c05f91\":[{\"filename\":\"pycocotools-2.0.11-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pycocotools_cp311_cp311_manylinux_2_17_x86_64_18ba75ff\":[{\"filename\":\"pycocotools-2.0.11-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pycocotools_cp311_cp311_musllinux_1_2_aarch64_69341779\":[{\"filename\":\"pycocotools-2.0.11-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pycocotools_cp311_cp311_musllinux_1_2_x86_64_b6a07071\":[{\"filename\":\"pycocotools-2.0.11-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pycocotools_cp311_cp311_win_amd64_8e159232\":[{\"filename\":\"pycocotools-2.0.11-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pycocotools_sdist_34254d76\":[{\"filename\":\"pycocotools-2.0.11.tar.gz\",\"version\":\"3.11\"}]}", "pycollada": "{\"ncore_pip_deps_311_pycollada_py3_none_any_636e6496\":[{\"filename\":\"pycollada-0.9.3-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pycollada_sdist_c34d6dcf\":[{\"filename\":\"pycollada-0.9.3.tar.gz\",\"version\":\"3.11\"}]}", "pydata_sphinx_theme": "{\"ncore_pip_deps_311_pydata_sphinx_theme_py3_none_any_225331e8\":[{\"filename\":\"pydata_sphinx_theme-0.16.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pydata_sphinx_theme_sdist_a08b7f0b\":[{\"filename\":\"pydata_sphinx_theme-0.16.1.tar.gz\",\"version\":\"3.11\"}]}", "pygments": "{\"ncore_pip_deps_311_pygments_py3_none_any_9ea1544a\":[{\"filename\":\"pygments-2.19.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pygments_sdist_61c16d2a\":[{\"filename\":\"pygments-2.19.1.tar.gz\",\"version\":\"3.11\"}]}", "pynvvideocodec": "{\"ncore_pip_deps_311_pynvvideocodec_cp311_cp311_manylinux_2_28_aarch64_b8d9b47b\":[{\"filename\":\"pynvvideocodec-2.1.0-cp311-cp311-manylinux_2_28_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pynvvideocodec_cp311_cp311_manylinux_2_28_x86_64_6d653240\":[{\"filename\":\"pynvvideocodec-2.1.0-cp311-cp311-manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pynvvideocodec_cp311_cp311_win_amd64_ee5d2dc5\":[{\"filename\":\"pynvvideocodec-2.1.0-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}]}", + "pyparsing": "{\"ncore_pip_deps_311_pyparsing_py3_none_any_506ff4f4\":[{\"filename\":\"pyparsing-3.2.1-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pyparsing_sdist_61980854\":[{\"filename\":\"pyparsing-3.2.1.tar.gz\",\"version\":\"3.11\"}]}", + "pyquaternion": "{\"ncore_pip_deps_311_pyquaternion_py3_none_any_e65f6e3f\":[{\"filename\":\"pyquaternion-0.9.9-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pyquaternion_sdist_b1f61af2\":[{\"filename\":\"pyquaternion-0.9.9.tar.gz\",\"version\":\"3.11\"}]}", "pytest": "{\"ncore_pip_deps_311_pytest_py3_none_any_50e16d95\":[{\"filename\":\"pytest-8.3.4-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pytest_sdist_965370d0\":[{\"filename\":\"pytest-8.3.4.tar.gz\",\"version\":\"3.11\"}],\"ncore_pip_deps_38_pytest_py3_none_any_78bf1645\":[{\"filename\":\"pytest-7.4.0-py3-none-any.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_pytest_sdist_b4bf8c45\":[{\"filename\":\"pytest-7.4.0.tar.gz\",\"version\":\"3.8\"}]}", "python_dateutil": "{\"ncore_pip_deps_311_python_dateutil_py2_none_any_a8b2bc7b\":[{\"filename\":\"python_dateutil-2.9.0.post0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_python_dateutil_sdist_37dd5420\":[{\"filename\":\"python-dateutil-2.9.0.post0.tar.gz\",\"version\":\"3.11\"}]}", "pytz": "{\"ncore_pip_deps_311_pytz_py2_none_any_89dd22dc\":[{\"filename\":\"pytz-2025.1-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_pytz_sdist_c2db42be\":[{\"filename\":\"pytz-2025.1.tar.gz\",\"version\":\"3.11\"}]}", @@ -20154,9 +21859,10 @@ "roman_numerals": "{\"ncore_pip_deps_311_roman_numerals_py3_none_any_647ba99c\":[{\"filename\":\"roman_numerals-4.1.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_roman_numerals_sdist_1af8b147\":[{\"filename\":\"roman_numerals-4.1.0.tar.gz\",\"version\":\"3.11\"}]}", "rpds_py": "{\"ncore_pip_deps_311_rpds_py_cp311_cp311_macosx_10_12_x86_64_d20cfb4e\":[{\"filename\":\"rpds_py-0.22.3-cp311-cp311-macosx_10_12_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rpds_py_cp311_cp311_macosx_11_0_arm64_68049202\":[{\"filename\":\"rpds_py-0.22.3-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rpds_py_cp311_cp311_manylinux_2_17_aarch64_fb4f868f\":[{\"filename\":\"rpds_py-0.22.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rpds_py_cp311_cp311_manylinux_2_17_armv7l_bc51abd0\":[{\"filename\":\"rpds_py-0.22.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rpds_py_cp311_cp311_manylinux_2_17_ppc64le_0f3cec04\":[{\"filename\":\"rpds_py-0.22.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rpds_py_cp311_cp311_manylinux_2_17_s390x_7ef9d9da\":[{\"filename\":\"rpds_py-0.22.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rpds_py_cp311_cp311_manylinux_2_17_x86_64_59f4a79c\":[{\"filename\":\"rpds_py-0.22.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rpds_py_cp311_cp311_musllinux_1_2_aarch64_e89391e6\":[{\"filename\":\"rpds_py-0.22.3-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rpds_py_cp311_cp311_musllinux_1_2_x86_64_1352ae4f\":[{\"filename\":\"rpds_py-0.22.3-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rpds_py_cp311_cp311_win_amd64_8bd7c8cf\":[{\"filename\":\"rpds_py-0.22.3-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rpds_py_sdist_e32fee8a\":[{\"filename\":\"rpds_py-0.22.3.tar.gz\",\"version\":\"3.11\"}]}", "rtree": "{\"ncore_pip_deps_311_rtree_py3_none_macosx_10_9_x86_64_d6721842\":[{\"filename\":\"rtree-1.4.1-py3-none-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rtree_py3_none_macosx_11_0_arm64_a7e48d80\":[{\"filename\":\"rtree-1.4.1-py3-none-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rtree_py3_none_manylinux_2_24_aarch64_efa8c449\":[{\"filename\":\"rtree-1.4.1-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rtree_py3_none_manylinux_2_24_x86_64_12de4578\":[{\"filename\":\"rtree-1.4.1-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rtree_py3_none_musllinux_1_2_aarch64_b558edda\":[{\"filename\":\"rtree-1.4.1-py3-none-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rtree_py3_none_musllinux_1_2_x86_64_f155bc8d\":[{\"filename\":\"rtree-1.4.1-py3-none-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rtree_py3_none_win_amd64_efe125f4\":[{\"filename\":\"rtree-1.4.1-py3-none-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_rtree_sdist_c6b1b355\":[{\"filename\":\"rtree-1.4.1.tar.gz\",\"version\":\"3.11\"}]}", + "scikit_learn": "{\"ncore_pip_deps_311_scikit_learn_cp311_cp311_macosx_10_9_x86_64_146b4d36\":[{\"filename\":\"scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scikit_learn_cp311_cp311_macosx_12_0_arm64_f984ca4b\":[{\"filename\":\"scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scikit_learn_cp311_cp311_manylinux_2_27_aarch64_5e30adb8\":[{\"filename\":\"scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scikit_learn_cp311_cp311_manylinux_2_27_x86_64_ada8121b\":[{\"filename\":\"scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scikit_learn_cp311_cp311_win_amd64_c57b1b61\":[{\"filename\":\"scikit_learn-1.8.0-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scikit_learn_sdist_9bccbb3b\":[{\"filename\":\"scikit_learn-1.8.0.tar.gz\",\"version\":\"3.11\"}]}", "scipy": "{\"ncore_pip_deps_311_scipy_cp311_cp311_macosx_10_13_x86_64_92233b2d\":[{\"filename\":\"scipy-1.15.2-cp311-cp311-macosx_10_13_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scipy_cp311_cp311_macosx_12_0_arm64_62ca1ff3\":[{\"filename\":\"scipy-1.15.2-cp311-cp311-macosx_12_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scipy_cp311_cp311_macosx_14_0_arm64_4c667649\":[{\"filename\":\"scipy-1.15.2-cp311-cp311-macosx_14_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scipy_cp311_cp311_macosx_14_0_x86_64_a8bf5cb4\":[{\"filename\":\"scipy-1.15.2-cp311-cp311-macosx_14_0_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scipy_cp311_cp311_manylinux_2_17_aarch64_6a8e34cf\":[{\"filename\":\"scipy-1.15.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scipy_cp311_cp311_manylinux_2_17_x86_64_28a0d2c2\":[{\"filename\":\"scipy-1.15.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scipy_cp311_cp311_musllinux_1_2_aarch64_42dabaaa\":[{\"filename\":\"scipy-1.15.2-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scipy_cp311_cp311_musllinux_1_2_x86_64_6f5e296e\":[{\"filename\":\"scipy-1.15.2-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scipy_cp311_cp311_win_amd64_597a0c70\":[{\"filename\":\"scipy-1.15.2-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_scipy_sdist_cd58a314\":[{\"filename\":\"scipy-1.15.2.tar.gz\",\"version\":\"3.11\"}],\"ncore_pip_deps_38_scipy_cp38_cp38_macosx_10_9_x86_64_5678f88c\":[{\"filename\":\"scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_scipy_cp38_cp38_macosx_12_0_arm64_39becb03\":[{\"filename\":\"scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_scipy_cp38_cp38_manylinux_2_17_aarch64_bce5869c\":[{\"filename\":\"scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_scipy_cp38_cp38_manylinux_2_17_x86_64_07c3457c\":[{\"filename\":\"scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_scipy_cp38_cp38_win_amd64_049a8bbf\":[{\"filename\":\"scipy-1.10.1-cp38-cp38-win_amd64.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_scipy_sdist_2cf9dfb8\":[{\"filename\":\"scipy-1.10.1.tar.gz\",\"version\":\"3.8\"}]}", "setuptools": "{\"ncore_pip_deps_311_setuptools_py3_none_any_e3982f44\":[{\"filename\":\"setuptools-75.8.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_setuptools_sdist_c5afc8f4\":[{\"filename\":\"setuptools-75.8.0.tar.gz\",\"version\":\"3.11\"}]}", - "shapely": "{\"ncore_pip_deps_311_shapely_cp311_cp311_macosx_10_9_x86_64_91121757\":[{\"filename\":\"shapely-2.1.2-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_cp311_cp311_macosx_11_0_arm64_16a9c722\":[{\"filename\":\"shapely-2.1.2-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_cp311_cp311_manylinux_2_17_aarch64_cc4f7397\":[{\"filename\":\"shapely-2.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_cp311_cp311_manylinux_2_17_x86_64_136ab87b\":[{\"filename\":\"shapely-2.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_cp311_cp311_musllinux_1_2_aarch64_16c5d0fc\":[{\"filename\":\"shapely-2.1.2-cp311-cp311-musllinux_1_2_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_cp311_cp311_musllinux_1_2_x86_64_6ddc759f\":[{\"filename\":\"shapely-2.1.2-cp311-cp311-musllinux_1_2_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_cp311_cp311_win_amd64_c64d5c97\":[{\"filename\":\"shapely-2.1.2-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_sdist_2ed4ecb2\":[{\"filename\":\"shapely-2.1.2.tar.gz\",\"version\":\"3.11\"}]}", + "shapely": "{\"ncore_pip_deps_311_shapely_cp311_cp311_macosx_10_9_x86_64_5cf23400\":[{\"filename\":\"shapely-2.0.7-cp311-cp311-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_cp311_cp311_macosx_11_0_arm64_d8f1da01\":[{\"filename\":\"shapely-2.0.7-cp311-cp311-macosx_11_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_cp311_cp311_manylinux_2_17_aarch64_8f623b64\":[{\"filename\":\"shapely-2.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_cp311_cp311_manylinux_2_17_x86_64_e6d95703\":[{\"filename\":\"shapely-2.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_cp311_cp311_win_amd64_b52f3ab8\":[{\"filename\":\"shapely-2.0.7-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_shapely_sdist_28fe2997\":[{\"filename\":\"shapely-2.0.7.tar.gz\",\"version\":\"3.11\"}]}", "six": "{\"ncore_pip_deps_311_six_py2_none_any_4721f391\":[{\"filename\":\"six-1.17.0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_six_sdist_ff70335d\":[{\"filename\":\"six-1.17.0.tar.gz\",\"version\":\"3.11\"}]}", "snowballstemmer": "{\"ncore_pip_deps_311_snowballstemmer_py2_none_any_c8e1716e\":[{\"filename\":\"snowballstemmer-2.2.0-py2.py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_snowballstemmer_sdist_09b16deb\":[{\"filename\":\"snowballstemmer-2.2.0.tar.gz\",\"version\":\"3.11\"}]}", "soupsieve": "{\"ncore_pip_deps_311_soupsieve_py3_none_any_e72c4ff0\":[{\"filename\":\"soupsieve-2.6-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_soupsieve_sdist_e2e68417\":[{\"filename\":\"soupsieve-2.6.tar.gz\",\"version\":\"3.11\"}]}", @@ -20175,6 +21881,7 @@ "tensorboard_data_server": "{\"ncore_pip_deps_311_tensorboard_data_server_py3_none_any_7e0610d2\":[{\"filename\":\"tensorboard_data_server-0.7.2-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_tensorboard_data_server_py3_none_macosx_10_9_x86_64_9fe5d242\":[{\"filename\":\"tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_tensorboard_data_server_py3_none_manylinux_2_31_x86_64_ef687163\":[{\"filename\":\"tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl\",\"version\":\"3.11\"}]}", "tensorflow": "{\"ncore_pip_deps_311_tensorflow_cp311_cp311_macosx_12_0_arm64_5f964016\":[{\"filename\":\"tensorflow-2.20.0-cp311-cp311-macosx_12_0_arm64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_tensorflow_cp311_cp311_manylinux_2_17_aarch64_3e9568c8\":[{\"filename\":\"tensorflow-2.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_tensorflow_cp311_cp311_manylinux_2_17_x86_64_481499fd\":[{\"filename\":\"tensorflow-2.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_tensorflow_cp311_cp311_win_amd64_7551558a\":[{\"filename\":\"tensorflow-2.20.0-cp311-cp311-win_amd64.whl\",\"version\":\"3.11\"}]}", "termcolor": "{\"ncore_pip_deps_311_termcolor_py3_none_any_37b17b5f\":[{\"filename\":\"termcolor-2.5.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_termcolor_sdist_998d8d27\":[{\"filename\":\"termcolor-2.5.0.tar.gz\",\"version\":\"3.11\"}]}", + "threadpoolctl": "{\"ncore_pip_deps_311_threadpoolctl_py3_none_any_43a0b8fd\":[{\"filename\":\"threadpoolctl-3.6.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_threadpoolctl_sdist_8ab8b4aa\":[{\"filename\":\"threadpoolctl-3.6.0.tar.gz\",\"version\":\"3.11\"}]}", "tinycss2": "{\"ncore_pip_deps_311_tinycss2_py3_none_any_3a49cf47\":[{\"filename\":\"tinycss2-1.4.0-py3-none-any.whl\",\"version\":\"3.11\"}],\"ncore_pip_deps_311_tinycss2_sdist_10c0972f\":[{\"filename\":\"tinycss2-1.4.0.tar.gz\",\"version\":\"3.11\"}]}", "tomli": "{\"ncore_pip_deps_38_tomli_py3_none_any_939de3e7\":[{\"filename\":\"tomli-2.0.1-py3-none-any.whl\",\"version\":\"3.8\"}],\"ncore_pip_deps_38_tomli_sdist_de526c12\":[{\"filename\":\"tomli-2.0.1.tar.gz\",\"version\":\"3.8\"}]}", "torch": "{\"ncore_pip_deps_311_torch\":[{\"version\":\"3.11\"}],\"ncore_pip_deps_38_torch\":[{\"version\":\"3.8\"}]}", @@ -20213,16 +21920,20 @@ "babel", "beautifulsoup4", "bleach", + "cachetools", "cbor2", "certifi", "charset_normalizer", "click", "colorlog", + "contourpy", + "cycler", "dataclasses_json", "debugpy", "decorator", "defusedxml", "deprecated", + "descartes", "docutils", "dracopy", "embreex", @@ -20232,7 +21943,9 @@ "fasteners", "fastjsonschema", "filelock", + "fire", "flatbuffers", + "fonttools", "fsspec", "gast", "google_pasta", @@ -20249,12 +21962,14 @@ "ipython_pygments_lexers", "jedi", "jinja2", + "joblib", "jsonschema", "jsonschema_specifications", "jupyter_client", "jupyter_core", "jupyterlab_pygments", "keras", + "kiwisolver", "libclang", "lxml", "manifold3d", @@ -20263,6 +21978,7 @@ "markdown_it_py", "markupsafe", "marshmallow", + "matplotlib", "matplotlib_inline", "mdurl", "mistune", @@ -20278,6 +21994,7 @@ "networkx", "numcodecs", "numpy", + "nuscenes_devkit", "nvidia_cublas_cu12", "nvidia_cuda_cupti_cu12", "nvidia_cuda_nvrtc_cu12", @@ -20312,10 +22029,13 @@ "ptyprocess", "pure_eval", "pyarrow", + "pycocotools", "pycollada", "pydata_sphinx_theme", "pygments", "pynvvideocodec", + "pyparsing", + "pyquaternion", "pytest", "python_dateutil", "pytz", @@ -20327,6 +22047,7 @@ "roman_numerals", "rpds_py", "rtree", + "scikit_learn", "scipy", "setuptools", "shapely", @@ -20348,6 +22069,7 @@ "tensorboard_data_server", "tensorflow", "termcolor", + "threadpoolctl", "tinycss2", "tomli", "torch", diff --git a/deps/pip/BUILD.bazel b/deps/pip/BUILD.bazel index b031d2fd..1e9c3e3d 100644 --- a/deps/pip/BUILD.bazel +++ b/deps/pip/BUILD.bazel @@ -37,6 +37,7 @@ pip_compile( ":requirements_colmap.in", ":requirements_docs.in", ":requirements_ncore.in", + ":requirements_nuscenes.in", ":requirements_pai.in", ":requirements_tests.in", ":requirements_tools.in", diff --git a/deps/pip/requirements_3_11.in b/deps/pip/requirements_3_11.in index e0c05cc3..e7c68a14 100644 --- a/deps/pip/requirements_3_11.in +++ b/deps/pip/requirements_3_11.in @@ -20,6 +20,7 @@ -r requirements_tools.in -r requirements_waymo.in -r requirements_colmap.in +-r requirements_nuscenes.in -r requirements_pai.in # Public API restrictions for 3.11 diff --git a/deps/pip/requirements_3_11.txt b/deps/pip/requirements_3_11.txt index 548514e2..37fe4126 100644 --- a/deps/pip/requirements_3_11.txt +++ b/deps/pip/requirements_3_11.txt @@ -55,6 +55,10 @@ bleach==6.2.0 \ --hash=sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e \ --hash=sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f # via nbconvert +cachetools==7.1.3 \ + --hash=sha256:135cfe944bc3c1e805505f65dae0bef375a2f96261171ab66c79ef77d0bda39d \ + --hash=sha256:9876787e2346e20584d5cca236cb5d49d04e7193de91646f230725b2e1e8b804 + # via nuscenes-devkit cbor2==5.9.0 \ --hash=sha256:0322296b9d52f55880e300ba8ba09ecf644303b99b51138bbb1c0fb644fa7c3e \ --hash=sha256:0485d3372fc832c5e16d4eb45fa1a20fc53e806e6c29a1d2b0d3e176cedd52b9 \ @@ -217,6 +221,66 @@ colorlog==6.10.1 \ --hash=sha256:2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c \ --hash=sha256:eb4ae5cb65fe7fec7773c2306061a8e63e02efc2c72eba9d27b0fa23c94f1321 # via trimesh +contourpy==1.3.1 \ + --hash=sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1 \ + --hash=sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda \ + --hash=sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d \ + --hash=sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509 \ + --hash=sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6 \ + --hash=sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f \ + --hash=sha256:174e758c66bbc1c8576992cec9599ce8b6672b741b5d336b5c74e35ac382b18e \ + --hash=sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751 \ + --hash=sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86 \ + --hash=sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b \ + --hash=sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc \ + --hash=sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546 \ + --hash=sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec \ + --hash=sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f \ + --hash=sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82 \ + --hash=sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c \ + --hash=sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b \ + --hash=sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c \ + --hash=sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c \ + --hash=sha256:44a29502ca9c7b5ba389e620d44f2fbe792b1fb5734e8b931ad307071ec58c53 \ + --hash=sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80 \ + --hash=sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242 \ + --hash=sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85 \ + --hash=sha256:500360b77259914f7805af7462e41f9cb7ca92ad38e9f94d6c8641b089338124 \ + --hash=sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5 \ + --hash=sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2 \ + --hash=sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3 \ + --hash=sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d \ + --hash=sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc \ + --hash=sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342 \ + --hash=sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1 \ + --hash=sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1 \ + --hash=sha256:974d8145f8ca354498005b5b981165b74a195abfae9a8129df3e56771961d595 \ + --hash=sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30 \ + --hash=sha256:a045f341a77b77e1c5de31e74e966537bba9f3c4099b35bf4c2e3939dd54cdab \ + --hash=sha256:a0cffcbede75c059f535725c1680dfb17b6ba8753f0c74b14e6a9c68c29d7ea3 \ + --hash=sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2 \ + --hash=sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd \ + --hash=sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7 \ + --hash=sha256:ab29962927945d89d9b293eabd0d59aea28d887d4f3be6c22deaefbb938a7277 \ + --hash=sha256:abbb49fb7dac584e5abc6636b7b2a7227111c4f771005853e7d25176daaf8453 \ + --hash=sha256:ac4578ac281983f63b400f7fe6c101bedc10651650eef012be1ccffcbacf3697 \ + --hash=sha256:adce39d67c0edf383647a3a007de0a45fd1b08dedaa5318404f1a73059c2512b \ + --hash=sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454 \ + --hash=sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9 \ + --hash=sha256:b2f926efda994cdf3c8d3fdb40b9962f86edbc4457e739277b961eced3d0b4c1 \ + --hash=sha256:b457d6430833cee8e4b8e9b6f07aa1c161e5e0d52e118dc102c8f9bd7dd060d6 \ + --hash=sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291 \ + --hash=sha256:cb76c1a154b83991a3cbbf0dfeb26ec2833ad56f95540b442c73950af2013750 \ + --hash=sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699 \ + --hash=sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e \ + --hash=sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81 \ + --hash=sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9 \ + --hash=sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375 + # via matplotlib +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ + --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c + # via matplotlib dataclasses-json==0.6.7 \ --hash=sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a \ --hash=sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0 @@ -261,6 +325,11 @@ deprecated==1.2.18 \ --hash=sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d \ --hash=sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec # via numcodecs +descartes==1.1.0 \ + --hash=sha256:135a502146af5ed6ff359975e2ebc5fa4b71b5432c355c2cafdc6dea1337035b \ + --hash=sha256:4c62dc41109689d03e4b35de0a2bcbdeeb81047badc607c4415d5c753bd683af \ + --hash=sha256:b7e412e7e6e294412f1d0f661f187babc970088c2456089e6801eebb043c2e1b + # via nuscenes-devkit docutils==0.22.4 \ --hash=sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968 \ --hash=sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de @@ -359,9 +428,65 @@ filelock==3.29.0 \ --hash=sha256:69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90 \ --hash=sha256:96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258 # via torch +fire==0.7.1 \ + --hash=sha256:3b208f05c736de98fb343310d090dcc4d8c78b2a89ea4f32b837c586270a9cbf \ + --hash=sha256:e43fd8a5033a9001e7e2973bab96070694b9f12f2e0ecf96d4683971b5ab1882 + # via nuscenes-devkit flatbuffers==25.12.19 \ --hash=sha256:7634f50c427838bb021c2d66a3d1168e9d199b0607e6329399f04846d42e20b4 # via tensorflow +fonttools==4.56.0 \ + --hash=sha256:003548eadd674175510773f73fb2060bb46adb77c94854af3e0cc5bc70260049 \ + --hash=sha256:0073b62c3438cf0058488c002ea90489e8801d3a7af5ce5f7c05c105bee815c3 \ + --hash=sha256:1088182f68c303b50ca4dc0c82d42083d176cba37af1937e1a976a31149d4d14 \ + --hash=sha256:133bedb9a5c6376ad43e6518b7e2cd2f866a05b1998f14842631d5feb36b5786 \ + --hash=sha256:14a3e3e6b211660db54ca1ef7006401e4a694e53ffd4553ab9bc87ead01d0f05 \ + --hash=sha256:17f39313b649037f6c800209984a11fc256a6137cbe5487091c6c7187cae4685 \ + --hash=sha256:193b86e9f769320bc98ffdb42accafb5d0c8c49bd62884f1c0702bc598b3f0a2 \ + --hash=sha256:2d351275f73ebdd81dd5b09a8b8dac7a30f29a279d41e1c1192aedf1b6dced40 \ + --hash=sha256:300c310bb725b2bdb4f5fc7e148e190bd69f01925c7ab437b9c0ca3e1c7cd9ba \ + --hash=sha256:331954d002dbf5e704c7f3756028e21db07097c19722569983ba4d74df014000 \ + --hash=sha256:38b947de71748bab150259ee05a775e8a0635891568e9fdb3cdd7d0e0004e62f \ + --hash=sha256:3cf4f8d2a30b454ac682e12c61831dcb174950c406011418e739de592bbf8f76 \ + --hash=sha256:3fd3fccb7b9adaaecfa79ad51b759f2123e1aba97f857936ce044d4f029abd71 \ + --hash=sha256:442ad4122468d0e47d83bc59d0e91b474593a8c813839e1872e47c7a0cb53b10 \ + --hash=sha256:47b5e4680002ae1756d3ae3b6114e20aaee6cc5c69d1e5911f5ffffd3ee46c6b \ + --hash=sha256:53f5e9767978a4daf46f28e09dbeb7d010319924ae622f7b56174b777258e5ba \ + --hash=sha256:62b4c6802fa28e14dba010e75190e0e6228513573f1eeae57b11aa1a39b7e5b1 \ + --hash=sha256:62cc1253827d1e500fde9dbe981219fea4eb000fd63402283472d38e7d8aa1c6 \ + --hash=sha256:654ac4583e2d7c62aebc6fc6a4c6736f078f50300e18aa105d87ce8925cfac31 \ + --hash=sha256:661a8995d11e6e4914a44ca7d52d1286e2d9b154f685a4d1f69add8418961563 \ + --hash=sha256:6c1d38642ca2dddc7ae992ef5d026e5061a84f10ff2b906be5680ab089f55bb8 \ + --hash=sha256:6e81c1cc80c1d8bf071356cc3e0e25071fbba1c75afc48d41b26048980b3c771 \ + --hash=sha256:705837eae384fe21cee5e5746fd4f4b2f06f87544fa60f60740007e0aa600311 \ + --hash=sha256:7ef04bc7827adb7532be3d14462390dd71287644516af3f1e67f1e6ff9c6d6df \ + --hash=sha256:86b2a1013ef7a64d2e94606632683f07712045ed86d937c11ef4dde97319c086 \ + --hash=sha256:8d1613abd5af2f93c05867b3a3759a56e8bf97eb79b1da76b2bc10892f96ff16 \ + --hash=sha256:965d0209e6dbdb9416100123b6709cb13f5232e2d52d17ed37f9df0cc31e2b35 \ + --hash=sha256:96a4271f63a615bcb902b9f56de00ea225d6896052c49f20d0c91e9f43529a29 \ + --hash=sha256:9d94449ad0a5f2a8bf5d2f8d71d65088aee48adbe45f3c5f8e00e3ad861ed81a \ + --hash=sha256:9da650cb29bc098b8cfd15ef09009c914b35c7986c8fa9f08b51108b7bc393b4 \ + --hash=sha256:a05d1f07eb0a7d755fbe01fee1fd255c3a4d3730130cf1bfefb682d18fd2fcea \ + --hash=sha256:a114d1567e1a1586b7e9e7fc2ff686ca542a82769a296cef131e4c4af51e58f4 \ + --hash=sha256:a1af375734018951c31c0737d04a9d5fd0a353a0253db5fbed2ccd44eac62d8c \ + --hash=sha256:b23d30a2c0b992fb1c4f8ac9bfde44b5586d23457759b6cf9a787f1a35179ee0 \ + --hash=sha256:bc871904a53a9d4d908673c6faa15689874af1c7c5ac403a8e12d967ebd0c0dc \ + --hash=sha256:bce60f9a977c9d3d51de475af3f3581d9b36952e1f8fc19a1f2254f1dda7ce9c \ + --hash=sha256:bd9825822e7bb243f285013e653f6741954d8147427aaa0324a862cdbf4cbf62 \ + --hash=sha256:ca7962e8e5fc047cc4e59389959843aafbf7445b6c08c20d883e60ced46370a5 \ + --hash=sha256:d0cb73ccf7f6d7ca8d0bc7ea8ac0a5b84969a41c56ac3ac3422a24df2680546f \ + --hash=sha256:d54a45d30251f1d729e69e5b675f9a08b7da413391a1227781e2a297fa37f6d2 \ + --hash=sha256:d6ca96d1b61a707ba01a43318c9c40aaf11a5a568d1e61146fafa6ab20890793 \ + --hash=sha256:d6f195c14c01bd057bc9b4f70756b510e009c83c5ea67b25ced3e2c38e6ee6e9 \ + --hash=sha256:e2cad98c94833465bcf28f51c248aaf07ca022efc6a3eba750ad9c1e0256d278 \ + --hash=sha256:e2e993e8db36306cc3f1734edc8ea67906c55f98683d6fd34c3fc5593fdbba4c \ + --hash=sha256:e9270505a19361e81eecdbc2c251ad1e1a9a9c2ad75fa022ccdee533f55535dc \ + --hash=sha256:f20e2c0dfab82983a90f3d00703ac0960412036153e5023eed2b4641d7d5e692 \ + --hash=sha256:f36a0868f47b7566237640c026c65a86d09a3d9ca5df1cd039e30a1da73098a0 \ + --hash=sha256:f59746f7953f69cc3290ce2f971ab01056e55ddd0fb8b792c31a8acd7fee2d28 \ + --hash=sha256:fa760e5fe8b50cbc2d71884a1eff2ed2b95a005f02dda2fa431560db0ddd927f \ + --hash=sha256:ffda9b8cd9cb8b301cae2602ec62375b59e2e2108a117746f12215145e3f786c + # via matplotlib fsspec==2025.10.0 \ --hash=sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d \ --hash=sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59 @@ -519,6 +644,10 @@ jinja2==3.1.5 \ # nbsphinx # sphinx # torch +joblib==1.5.3 \ + --hash=sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713 \ + --hash=sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3 + # via scikit-learn jsonschema==4.23.0 \ --hash=sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4 \ --hash=sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566 @@ -549,6 +678,88 @@ keras==3.14.1 \ --hash=sha256:ebd2c14d2af3c9de18083604d408483996407fc7d2f9ebd1d565961f96608c29 \ --hash=sha256:ef479173102ad29db89b53c232efdc3fb5ad57c28bc27ead59f3e78a1eecd05b # via tensorflow +kiwisolver==1.4.8 \ + --hash=sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50 \ + --hash=sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c \ + --hash=sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8 \ + --hash=sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc \ + --hash=sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f \ + --hash=sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79 \ + --hash=sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6 \ + --hash=sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2 \ + --hash=sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605 \ + --hash=sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09 \ + --hash=sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab \ + --hash=sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e \ + --hash=sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc \ + --hash=sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8 \ + --hash=sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7 \ + --hash=sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880 \ + --hash=sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b \ + --hash=sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b \ + --hash=sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff \ + --hash=sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3 \ + --hash=sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c \ + --hash=sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0 \ + --hash=sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6 \ + --hash=sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30 \ + --hash=sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47 \ + --hash=sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0 \ + --hash=sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1 \ + --hash=sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90 \ + --hash=sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d \ + --hash=sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b \ + --hash=sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c \ + --hash=sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a \ + --hash=sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e \ + --hash=sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc \ + --hash=sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16 \ + --hash=sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a \ + --hash=sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712 \ + --hash=sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c \ + --hash=sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3 \ + --hash=sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc \ + --hash=sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561 \ + --hash=sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d \ + --hash=sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc \ + --hash=sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db \ + --hash=sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed \ + --hash=sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751 \ + --hash=sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957 \ + --hash=sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165 \ + --hash=sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2 \ + --hash=sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476 \ + --hash=sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84 \ + --hash=sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246 \ + --hash=sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4 \ + --hash=sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25 \ + --hash=sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d \ + --hash=sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271 \ + --hash=sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb \ + --hash=sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31 \ + --hash=sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e \ + --hash=sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85 \ + --hash=sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b \ + --hash=sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7 \ + --hash=sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03 \ + --hash=sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b \ + --hash=sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d \ + --hash=sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a \ + --hash=sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d \ + --hash=sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3 \ + --hash=sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67 \ + --hash=sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f \ + --hash=sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c \ + --hash=sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502 \ + --hash=sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062 \ + --hash=sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954 \ + --hash=sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb \ + --hash=sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a \ + --hash=sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b \ + --hash=sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed \ + --hash=sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34 \ + --hash=sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794 + # via matplotlib libclang==18.1.1 \ --hash=sha256:0b2e143f0fac830156feb56f9231ff8338c20aecfe72b4ffe96f19e5a1dbb69a \ --hash=sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8 \ @@ -885,6 +1096,44 @@ marshmallow==3.26.1 \ --hash=sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c \ --hash=sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6 # via dataclasses-json +matplotlib==3.10.0 \ + --hash=sha256:01d2b19f13aeec2e759414d3bfe19ddfb16b13a1250add08d46d5ff6f9be83c6 \ + --hash=sha256:12eaf48463b472c3c0f8dbacdbf906e573013df81a0ab82f0616ea4b11281908 \ + --hash=sha256:2c5829a5a1dd5a71f0e31e6e8bb449bc0ee9dbfb05ad28fc0c6b55101b3a4be6 \ + --hash=sha256:2fbbabc82fde51391c4da5006f965e36d86d95f6ee83fb594b279564a4c5d0d2 \ + --hash=sha256:3547d153d70233a8496859097ef0312212e2689cdf8d7ed764441c77604095ae \ + --hash=sha256:359f87baedb1f836ce307f0e850d12bb5f1936f70d035561f90d41d305fdacea \ + --hash=sha256:3b427392354d10975c1d0f4ee18aa5844640b512d5311ef32efd4dd7db106ede \ + --hash=sha256:4659665bc7c9b58f8c00317c3c2a299f7f258eeae5a5d56b4c64226fca2f7c59 \ + --hash=sha256:4673ff67a36152c48ddeaf1135e74ce0d4bce1bbf836ae40ed39c29edf7e2765 \ + --hash=sha256:503feb23bd8c8acc75541548a1d709c059b7184cde26314896e10a9f14df5f12 \ + --hash=sha256:5439f4c5a3e2e8eab18e2f8c3ef929772fd5641876db71f08127eed95ab64683 \ + --hash=sha256:5cdbaf909887373c3e094b0318d7ff230b2ad9dcb64da7ade654182872ab2593 \ + --hash=sha256:5e6c6461e1fc63df30bf6f80f0b93f5b6784299f721bc28530477acd51bfc3d1 \ + --hash=sha256:5fd41b0ec7ee45cd960a8e71aea7c946a28a0b8a4dcee47d2856b2af051f334c \ + --hash=sha256:607b16c8a73943df110f99ee2e940b8a1cbf9714b65307c040d422558397dac5 \ + --hash=sha256:7e8632baebb058555ac0cde75db885c61f1212e47723d63921879806b40bec6a \ + --hash=sha256:81713dd0d103b379de4516b861d964b1d789a144103277769238c732229d7f03 \ + --hash=sha256:845d96568ec873be63f25fa80e9e7fae4be854a66a7e2f0c8ccc99e94a8bd4ef \ + --hash=sha256:95b710fea129c76d30be72c3b38f330269363fbc6e570a5dd43580487380b5ff \ + --hash=sha256:96f2886f5c1e466f21cc41b70c5a0cd47bfa0015eb2d5793c88ebce658600e25 \ + --hash=sha256:994c07b9d9fe8d25951e3202a68c17900679274dadfc1248738dcfa1bd40d7f3 \ + --hash=sha256:9ade1003376731a971e398cc4ef38bb83ee8caf0aee46ac6daa4b0506db1fd06 \ + --hash=sha256:9b0558bae37f154fffda54d779a592bc97ca8b4701f1c710055b609a3bac44c8 \ + --hash=sha256:a2a43cbefe22d653ab34bb55d42384ed30f611bcbdea1f8d7f431011a2e1c62e \ + --hash=sha256:a994f29e968ca002b50982b27168addfd65f0105610b6be7fa515ca4b5307c95 \ + --hash=sha256:ad2e15300530c1a94c63cfa546e3b7864bd18ea2901317bae8bbf06a5ade6dcf \ + --hash=sha256:ae80dc3a4add4665cf2faa90138384a7ffe2a4e37c58d83e115b54287c4f06ef \ + --hash=sha256:b886d02a581b96704c9d1ffe55709e49b4d2d52709ccebc4be42db856e511278 \ + --hash=sha256:c40ba2eb08b3f5de88152c2333c58cee7edcead0a2a0d60fcafa116b17117adc \ + --hash=sha256:c55b20591ced744aa04e8c3e4b7543ea4d650b6c3c4b208c08a05b4010e8b442 \ + --hash=sha256:c58a9622d5dbeb668f407f35f4e6bfac34bb9ecdcc81680c04d0258169747997 \ + --hash=sha256:d44cb942af1693cced2604c33a9abcef6205601c445f6d0dc531d813af8a2f5a \ + --hash=sha256:d907fddb39f923d011875452ff1eca29a9e7f21722b873e90db32e5d8ddff12e \ + --hash=sha256:fd44fc75522f58612ec4a33958a7e5552562b7705b42ef1b4f8c0818e304a363 + # via + # descartes + # nuscenes-devkit matplotlib-inline==0.2.1 \ --hash=sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76 \ --hash=sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe @@ -1094,18 +1343,24 @@ numpy==1.26.4 \ # -r deps/pip/requirements_pai.in # -r deps/pip/requirements_tools.in # -r deps/pip/requirements_waymo.in + # contourpy # embreex # h5py # imageio # keras # manifold3d # mapbox-earcut + # matplotlib # ml-dtypes # numcodecs + # nuscenes-devkit # opencv-python-headless # pandas # point-cloud-utils + # pycocotools # pycollada + # pyquaternion + # scikit-learn # scipy # shapely # tensorboard @@ -1115,6 +1370,9 @@ numpy==1.26.4 \ # viser # yourdfpy # zarr +nuscenes-devkit==1.2.0 \ + --hash=sha256:76cee0e7f96ec96d6269ee3acb4ff69e8ac2f9413e974d9eb542233ea7479bf1 + # via -r deps/pip/requirements_nuscenes.in nvidia-cublas-cu12==12.8.3.14 \ --hash=sha256:3f0e05e7293598cf61933258b73e66a160c27d59c4422670bf0b79348c04be44 \ --hash=sha256:93a4e0e386cc7f6e56c822531396de8170ed17068a1e18f987574895044cd8c3 \ @@ -1206,6 +1464,7 @@ opencv-python-headless==4.11.0.86 \ # via # -r deps/pip/requirements_tests.in # -r deps/pip/requirements_tools.in + # nuscenes-devkit opt-einsum==3.4.0 \ --hash=sha256:69bb92469f86a1565195ece4ac0323943e83477171b91d24c35afe028a90d7cd \ --hash=sha256:96ca72f1b886d148241348783498194c577fa30a8faac108586b14f1ba4473ac @@ -1298,6 +1557,7 @@ packaging==24.2 \ # via # keras # marshmallow + # matplotlib # nbconvert # pytest # sphinx @@ -1356,7 +1616,9 @@ pandocfilters==1.5.1 \ parameterized==0.9.0 \ --hash=sha256:4e0758e3d41bea3bbd05ec14fc2c24736723f243b28d702081aef438c9372b1b \ --hash=sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1 - # via -r deps/pip/requirements_tests.in + # via + # -r deps/pip/requirements_tests.in + # nuscenes-devkit parso==0.8.6 \ --hash=sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd \ --hash=sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff @@ -1467,6 +1729,8 @@ pillow==12.2.0 \ # -r deps/pip/requirements_ncore.in # -r deps/pip/requirements_pai.in # imageio + # matplotlib + # nuscenes-devkit # tensorboard # trimesh platformdirs==4.3.6 \ @@ -1590,6 +1854,51 @@ pyarrow==23.0.1 \ --hash=sha256:fa8e51cb04b9f8c9c5ace6bab63af9a1f88d35c0d6cbf53e8c17c098552285e1 \ --hash=sha256:fed7020203e9ef273360b9e45be52a2a47d3103caf156a30ace5247ffb51bdbd # via -r deps/pip/requirements_pai.in +pycocotools==2.0.11 \ + --hash=sha256:04480330df5013f6edd94891a0ee8294274185f1b5093d1b0f23d51778f0c0e9 \ + --hash=sha256:08c79789fd79e801ae4ecfcfeec32b31e36254e7a2b4019af28c104975d5e730 \ + --hash=sha256:1192de413a23b4b94199197e8f8dbe1277cc24e6e9847bee6a71be3d8e543963 \ + --hash=sha256:18ba75ff58cedb33a85ce2c18f1452f1fe20c9dd59925eec5300b2bf6205dbe1 \ + --hash=sha256:34254d76da85576fcaf5c1f3aa9aae16b8cb15418334ba4283b800796bd1993d \ + --hash=sha256:368244f30eb8d6cae7003aa2c0831fbdf0153664a32859ec7fbceea52bfb6878 \ + --hash=sha256:484d33515353186aadba9e2a290d81b107275cdb9565084e31a5568a52a0b120 \ + --hash=sha256:4fc9889e819452b9c142036e1eabac8a13a8bd552d8beba299a57e0da6bfa1ec \ + --hash=sha256:63026e11a56211058d0e84e8263f74cbccd5e786fac18d83fd221ecb9819fcc7 \ + --hash=sha256:693417797f0377fd094eb815c0a1e7d1c3c0251b71e3b3779fce3b3cf24793c5 \ + --hash=sha256:6a2f4f036f5bfdaf8c9625279051e921721fc9d27f92c97a3f3355a07ba38513 \ + --hash=sha256:78bae4a9de9d34c4759754a848dfb3306f9ef1c2fcb12164ffbd3d013d008321 \ + --hash=sha256:7cd4cdfd2c676f30838aa0b1047441892fb4f97d70bf3df480bcc7a18a64d7d4 \ + --hash=sha256:7fd4121766cc057133534679c0ec3f9023dbd96e9b31cf95c86a069ebdac2b65 \ + --hash=sha256:81bdceebb4c64e9265213e2d733808a12f9c18dfb14457323cc6b9af07fa0e61 \ + --hash=sha256:83d896f4310379849dfcfa7893afb0ff21f4f3cdb04ab3f61b05dd98953dd0ad \ + --hash=sha256:87af87b8d06d5b852a885a319d9362dca3bed9f8bbcc3feb6513acb1f88ea242 \ + --hash=sha256:89e853425018e2c2920ee0f2112cf7c140a1dcf5f4f49abd9c2da112c3e0f4b3 \ + --hash=sha256:8cedb8ccb97ffe9ed2c8c259234fa69f4f1e8665afe3a02caf93f6ef2952c07f \ + --hash=sha256:8e159232adae3aef6b4e2d37b008bff107b26e9ed3b48e70ea6482302834bd34 \ + --hash=sha256:9dc8b388984c72aa84b1a68933f196ce71ab114c59232d0eab20c97cc1300875 \ + --hash=sha256:a1c05f91ccc658dfe01325267209c4b435da1722c93eeb5749fabc1d087b6882 \ + --hash=sha256:a2b018497ec198ffc737dd7e6306a2e69999779ca619a9e12950e4506e410c3e \ + --hash=sha256:a2e9634bc7cadfb01c88e0b98589aaf0bd12983c7927bde93f19c0103e5441f4 \ + --hash=sha256:a6b13baf6bfcf881b6d6ac6e23c776f87a68304cd86e53d1d6b9afa31e363c4e \ + --hash=sha256:a82d1c9ed83f75da0b3f244f2a3cf559351a283307bd9b79a4ee2b93ab3231dd \ + --hash=sha256:ac8aa17263e6489aa521f9fa91e959dfe0ea3a5519fde2cbf547312cdce7559e \ + --hash=sha256:b6a07071c441d0f5e480a8f287106191582e40289d4e242dfe684e0c8a751088 \ + --hash=sha256:bd7a1e19ef56a828a94bace673372071d334a9232cd32ae3cd48845a04d45c4f \ + --hash=sha256:c230f5e7b14bd19085217b4f40bba81bf14a182b150b8e9fab1c15d504ade343 \ + --hash=sha256:c3546b93b39943347c4f5b0694b5824105cbe2174098a416bcad4acd9c21e957 \ + --hash=sha256:ca9f120f719ec405ad0c74ccfdb8402b0c37bd5f88ab5b6482a0de2efd5a36f4 \ + --hash=sha256:d6b88557166794a24acd03f50296f2b95adf3e4206b4b8995e6bdca925c9cb72 \ + --hash=sha256:e21311ea71f85591680d8992858e2d44a2a156dc3b2bf1c5c901c4a19348177b \ + --hash=sha256:e40a3a898c6e5340b8d70cf7984868b9bff8c3d80187de9a3b661d504d665978 \ + --hash=sha256:e72527fdc00985d29dbe31d17b19cd2d16fbad7b01e974c567b593d5844de710 \ + --hash=sha256:eba35d6e06caaea28ce65a4b92e4343ecbb9abf4915f7ef7fca989b80839111c \ + --hash=sha256:eebd723503a2eb2c8b285f56ea3be1d9f3875cd7c40d945358a428db94f14015 \ + --hash=sha256:efd1694b2075f2f10c5828f10f6e6c4e44368841fd07dae385c3aa015c8e25f9 \ + --hash=sha256:f78cbb1a32d061fcad4bdba083de70a39a21c1c3d9235a3f77d8f007541ec5ef \ + --hash=sha256:f7eb43b79448476b094240450420b7425d06e297880144b8ea6f01e9b4340e43 \ + --hash=sha256:fd72b9734e6084b217c1fc3945bfd4ec05bdc75a44e4f0c461a91442bb804973 \ + --hash=sha256:ffe806ce535f5996445188f9a35643791dc54beabc61bd81e2b03367356d604f + # via nuscenes-devkit pycollada==0.9.3 \ --hash=sha256:636e6496f60987586db82455ea7bbd9ade775e8181c6590c83b698b6cd53a9f5 \ --hash=sha256:c34d6dcf0fe2eba5896f71c96d37a1c0fe1a61f08440fa0cfcec3dc2895d3302 @@ -1622,6 +1931,17 @@ pynvvideocodec==2.1.0 \ --hash=sha256:e778af3319a759c1728065e9e4682f591c44dedbbc90c1ca71d025dce65d6a58 \ --hash=sha256:ee5d2dc56ac5ca8d223fa6fe8f57c67faf5ee1c9360216d9194cfbcd3f9d3948 # via -r deps/pip/requirements_pai.in +pyparsing==3.2.1 \ + --hash=sha256:506ff4f4386c4cec0590ec19e6302d3aedb992fdc02c761e90416f158dacf8e1 \ + --hash=sha256:61980854fd66de3a90028d679a954d5f2623e83144b5afe5ee86f43d762e5f0a + # via matplotlib +pyquaternion==0.9.9 \ + --hash=sha256:b1f61af219cb2fe966b5fb79a192124f2e63a3f7a777ac3cadf2957b1a81bea8 \ + --hash=sha256:d0eb69219ca99bfcbc25c1e2c4f82e58c61dce3e907e929f13c5f3615e4b6518 \ + --hash=sha256:e65f6e3f7b1fdf1a9e23f82434334a1ae84f14223eee835190cd2e841f8172ec + # via + # -r deps/pip/requirements_nuscenes.in + # nuscenes-devkit pytest==8.3.4 \ --hash=sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6 \ --hash=sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761 @@ -1631,6 +1951,7 @@ python-dateutil==2.9.0.post0 \ --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 # via # jupyter-client + # matplotlib # pandas # pycollada pytz==2025.1 \ @@ -1895,6 +2216,45 @@ rtree==1.4.1 \ --hash=sha256:efe125f416fd27150197ab8521158662943a40f87acab8028a1aac4ad667a489 \ --hash=sha256:f155bc8d6bac9dcd383481dee8c130947a4866db1d16cb6dff442329a038a0dc # via trimesh +scikit-learn==1.8.0 \ + --hash=sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2 \ + --hash=sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a \ + --hash=sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da \ + --hash=sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9 \ + --hash=sha256:2838551e011a64e3053ad7618dda9310175f7515f1742fa2d756f7c874c05961 \ + --hash=sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6 \ + --hash=sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271 \ + --hash=sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809 \ + --hash=sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242 \ + --hash=sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4 \ + --hash=sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7 \ + --hash=sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76 \ + --hash=sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6 \ + --hash=sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b \ + --hash=sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e \ + --hash=sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7 \ + --hash=sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e \ + --hash=sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57 \ + --hash=sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735 \ + --hash=sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb \ + --hash=sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb \ + --hash=sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e \ + --hash=sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd \ + --hash=sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a \ + --hash=sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9 \ + --hash=sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1 \ + --hash=sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde \ + --hash=sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3 \ + --hash=sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f \ + --hash=sha256:c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b \ + --hash=sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3 \ + --hash=sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e \ + --hash=sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702 \ + --hash=sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c \ + --hash=sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1 \ + --hash=sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4 \ + --hash=sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd + # via nuscenes-devkit scipy==1.15.2 \ --hash=sha256:01edfac9f0798ad6b46d9c4c9ca0e0ad23dbf0b1eb70e96adb9fa7f525eff0bf \ --hash=sha256:03205d57a28e18dfd39f0377d5002725bf1f19a46f444108c29bdb246b6c8a11 \ @@ -1948,7 +2308,9 @@ scipy==1.15.2 \ # -r deps/pip/requirements_pai.in # -r deps/pip/requirements_tools.in # -r deps/pip/requirements_waymo.in + # nuscenes-devkit # point-cloud-utils + # scikit-learn # trimesh setuptools==75.8.0 \ --hash=sha256:c5afc8f407c626b8313a86e10311dd3f661c6cd9c09d4bf8c15c0e11f9f2b0e6 \ @@ -1957,65 +2319,52 @@ setuptools==75.8.0 \ # tensorboard # tensorflow # triton -shapely==2.1.2 \ - --hash=sha256:0036ac886e0923417932c2e6369b6c52e38e0ff5d9120b90eef5cd9a5fc5cae9 \ - --hash=sha256:01d0d304b25634d60bd7cf291828119ab55a3bab87dc4af1e44b07fb225f188b \ - --hash=sha256:0bd308103340030feef6c111d3eb98d50dc13feea33affc8a6f9fa549e9458a3 \ - --hash=sha256:136ab87b17e733e22f0961504d05e77e7be8c9b5a8184f685b4a91a84efe3c26 \ - --hash=sha256:16a9c722ba774cf50b5d4541242b4cce05aafd44a015290c82ba8a16931ff63d \ - --hash=sha256:16c5d0fc45d3aa0a69074979f4f1928ca2734fb2e0dde8af9611e134e46774e7 \ - --hash=sha256:19efa3611eef966e776183e338b2d7ea43569ae99ab34f8d17c2c054d3205cc0 \ - --hash=sha256:1d0bfb4b8f661b3b4ec3565fa36c340bfb1cda82087199711f86a88647d26b2f \ - --hash=sha256:1e7d4d7ad262a48bb44277ca12c7c78cb1b0f56b32c10734ec9a1d30c0b0c54b \ - --hash=sha256:1f2f33f486777456586948e333a56ae21f35ae273be99255a191f5c1fa302eb4 \ - --hash=sha256:1ff629e00818033b8d71139565527ced7d776c269a49bd78c9df84e8f852190c \ - --hash=sha256:21952dc00df38a2c28375659b07a3979d22641aeb104751e769c3ee825aadecf \ - --hash=sha256:2d93d23bdd2ed9dc157b46bc2f19b7da143ca8714464249bef6771c679d5ff40 \ - --hash=sha256:2ed4ecb28320a433db18a5bf029986aa8afcfd740745e78847e330d5d94922a9 \ - --hash=sha256:2fa78b49485391224755a856ed3b3bd91c8455f6121fee0db0e71cefb07d0ef6 \ - --hash=sha256:346ec0c1a0fcd32f57f00e4134d1200e14bf3f5ae12af87ba83ca275c502498c \ - --hash=sha256:361b6d45030b4ac64ddd0a26046906c8202eb60d0f9f53085f5179f1d23021a0 \ - --hash=sha256:40d784101f5d06a1fd30b55fc11ea58a61be23f930d934d86f19a180909908a4 \ - --hash=sha256:4a44bc62a10d84c11a7a3d7c1c4fe857f7477c3506e24c9062da0db0ae0c449c \ - --hash=sha256:5860eb9f00a1d49ebb14e881f5caf6c2cf472c7fd38bd7f253bbd34f934eb076 \ - --hash=sha256:5ebe3f84c6112ad3d4632b1fd2290665aa75d4cef5f6c5d77c4c95b324527c6a \ - --hash=sha256:61edcd8d0d17dd99075d320a1dd39c0cb9616f7572f10ef91b4b5b00c4aeb566 \ - --hash=sha256:6305993a35989391bd3476ee538a5c9a845861462327efe00dd11a5c8c709a99 \ - --hash=sha256:6ddc759f72b5b2b0f54a7e7cde44acef680a55019eb52ac63a7af2cf17cb9cd2 \ - --hash=sha256:743044b4cfb34f9a67205cee9279feaf60ba7d02e69febc2afc609047cb49179 \ - --hash=sha256:7ae48c236c0324b4e139bea88a306a04ca630f49be66741b340729d380d8f52f \ - --hash=sha256:7ed1a5bbfb386ee8332713bf7508bc24e32d24b74fc9a7b9f8529a55db9f4ee6 \ - --hash=sha256:8cff473e81017594d20ec55d86b54bc635544897e13a7cfc12e36909c5309a2a \ - --hash=sha256:8d8382dd120d64b03698b7298b89611a6ea6f55ada9d39942838b79c9bc89801 \ - --hash=sha256:9111274b88e4d7b54a95218e243282709b330ef52b7b86bc6aaf4f805306f454 \ - --hash=sha256:91121757b0a36c9aac3427a651a7e6567110a4a67c97edf04f8d55d4765f6618 \ - --hash=sha256:980c777c612514c0cf99bc8a9de6d286f5e186dcaf9091252fcd444e5638193d \ - --hash=sha256:9a522f460d28e2bf4e12396240a5fc1518788b2fcd73535166d748399ef0c223 \ - --hash=sha256:9c3a3c648aedc9f99c09263b39f2d8252f199cb3ac154fadc173283d7d111350 \ - --hash=sha256:a1fd0ea855b2cf7c9cddaf25543e914dd75af9de08785f20ca3085f2c9ca60b0 \ - --hash=sha256:a444e7afccdb0999e203b976adb37ea633725333e5b119ad40b1ca291ecf311c \ - --hash=sha256:a84e0582858d841d54355246ddfcbd1fce3179f185da7470f41ce39d001ee1af \ - --hash=sha256:b510dda1a3672d6879beb319bc7c5fd302c6c354584690973c838f46ec3e0fa8 \ - --hash=sha256:b54df60f1fbdecc8ebc2c5b11870461a6417b3d617f555e5033f1505d36e5735 \ - --hash=sha256:b705c99c76695702656327b819c9660768ec33f5ce01fa32b2af62b56ba400a1 \ - --hash=sha256:ba4d1333cc0bc94381d6d4308d2e4e008e0bd128bdcff5573199742ee3634359 \ - --hash=sha256:c64d5c97b2f47e3cd9b712eaced3b061f2b71234b3fc263e0fcf7d889c6559dc \ - --hash=sha256:c8876673449f3401f278c86eb33224c5764582f72b653a415d0e6672fde887bf \ - --hash=sha256:ca2591bff6645c216695bdf1614fca9c82ea1144d4a7591a466fef64f28f0715 \ - --hash=sha256:cc4f7397459b12c0b196c9efe1f9d7e92463cbba142632b4cc6d8bbbbd3e2b09 \ - --hash=sha256:cf831a13e0d5a7eb519e96f58ec26e049b1fad411fc6fc23b162a7ce04d9cffc \ - --hash=sha256:dc3487447a43d42adcdf52d7ac73804f2312cbfa5d433a7d2c506dcab0033dfd \ - --hash=sha256:df90e2db118c3671a0754f38e36802db75fe0920d211a27481daf50a711fdf26 \ - --hash=sha256:e38a190442aacc67ff9f75ce60aec04893041f16f97d242209106d502486a142 \ - --hash=sha256:e9eddfe513096a71896441a7c37db72da0687b34752c4e193577a145c71736fc \ - --hash=sha256:eba6710407f1daa8e7602c347dfc94adc02205ec27ed956346190d66579eb9ea \ - --hash=sha256:ef4a456cc8b7b3d50ccec29642aa4aeda959e9da2fe9540a92754770d5f0cf1f \ - --hash=sha256:f67b34271dedc3c653eba4e3d7111aa421d5be9b4c4c7d38d30907f796cb30df \ - --hash=sha256:f6f6cd5819c50d9bcf921882784586aab34a4bd53e7553e175dece6db513a6f0 \ - --hash=sha256:fe2533caae6a91a543dec62e8360fe86ffcdc42a7c55f9dfd0128a977a896b94 \ - --hash=sha256:fe7b77dc63d707c09726b7908f575fc04ff1d1ad0f3fb92aec212396bc6cfe5e \ - --hash=sha256:fe9627c39c59e553c90f5bc3128252cb85dc3b3be8189710666d2f8bc3a5503e - # via trimesh +shapely==2.0.7 \ + --hash=sha256:0145387565fcf8f7c028b073c802956431308da933ef41d08b1693de49990d27 \ + --hash=sha256:04a65d882456e13c8b417562c36324c0cd1e5915f3c18ad516bb32ee3f5fc895 \ + --hash=sha256:06ff6020949b44baa8fc2e5e57e0f3d09486cd5c33b47d669f847c54136e7027 \ + --hash=sha256:19cbc8808efe87a71150e785b71d8a0e614751464e21fb679d97e274eca7bd43 \ + --hash=sha256:1a2e03277128e62f9a49a58eb7eb813fa9b343925fca5e7d631d50f4c0e8e0b8 \ + --hash=sha256:1e9fed9a7d6451979d914cb6ebbb218b4b4e77c0d50da23e23d8327948662611 \ + --hash=sha256:25085a30a2462cee4e850a6e3fb37431cbbe4ad51cbcc163af0cea1eaa9eb96d \ + --hash=sha256:28fe2997aab9a9dc026dc6a355d04e85841546b2a5d232ed953e3321ab958ee5 \ + --hash=sha256:2934834c7f417aeb7cba3b0d9b4441a76ebcecf9ea6e80b455c33c7c62d96a24 \ + --hash=sha256:2e4a1749ad64bc6e7668c8f2f9479029f079991f4ae3cb9e6b25440e35a4b532 \ + --hash=sha256:2f6e4759cf680a0f00a54234902415f2fa5fe02f6b05546c662654001f0793a2 \ + --hash=sha256:33fb10e50b16113714ae40adccf7670379e9ccf5b7a41d0002046ba2b8f0f691 \ + --hash=sha256:35524cc8d40ee4752520819f9894b9f28ba339a42d4922e92c99b148bed3be39 \ + --hash=sha256:3697bd078b4459f5a1781015854ef5ea5d824dbf95282d0b60bfad6ff83ec8dc \ + --hash=sha256:4abeb44b3b946236e4e1a1b3d2a0987fb4d8a63bfb3fdefb8a19d142b72001e5 \ + --hash=sha256:4c2b9859424facbafa54f4a19b625a752ff958ab49e01bc695f254f7db1835fa \ + --hash=sha256:5aed1c6764f51011d69a679fdf6b57e691371ae49ebe28c3edb5486537ffbd51 \ + --hash=sha256:5cf23400cb25deccf48c56a7cdda8197ae66c0e9097fcdd122ac2007e320bc34 \ + --hash=sha256:5d6dbf096f961ca6bec5640e22e65ccdec11e676344e8157fe7d636e7904fd36 \ + --hash=sha256:6bca5095e86be9d4ef3cb52d56bdd66df63ff111d580855cb8546f06c3c907cd \ + --hash=sha256:73c9ae8cf443187d784d57202199bf9fd2d4bb7d5521fe8926ba40db1bc33e8e \ + --hash=sha256:7977d8a39c4cf0e06247cd2dca695ad4e020b81981d4c82152c996346cf1094b \ + --hash=sha256:7e97104d28e60b69f9b6a957c4d3a2a893b27525bc1fc96b47b3ccef46726bf2 \ + --hash=sha256:8ae5cb6b645ac3fba34ad84b32fbdccb2ab321facb461954925bde807a0d3b74 \ + --hash=sha256:8f623b64bb219d62014781120f47499a7adc30cf7787e24b659e56651ceebcb0 \ + --hash=sha256:98697c842d5c221408ba8aa573d4f49caef4831e9bc6b6e785ce38aca42d1999 \ + --hash=sha256:a0c09e3e02f948631c7763b4fd3dd175bc45303a0ae04b000856dedebefe13cb \ + --hash=sha256:a3fb7fbae257e1b042f440289ee7235d03f433ea880e73e687f108d044b24db5 \ + --hash=sha256:a7f04691ce1c7ed974c2f8b34a1fe4c3c5dfe33128eae886aa32d730f1ec1913 \ + --hash=sha256:a9469f49ff873ef566864cb3516091881f217b5d231c8164f7883990eec88b73 \ + --hash=sha256:aaaf5f7e6cc234c1793f2a2760da464b604584fb58c6b6d7d94144fd2692d67e \ + --hash=sha256:adeddfb1e22c20548e840403e5e0b3d9dc3daf66f05fa59f1fcf5b5f664f0e98 \ + --hash=sha256:b52f3ab845d32dfd20afba86675c91919a622f4627182daec64974db9b0b4608 \ + --hash=sha256:cd0e75d9124b73e06a42bf1615ad3d7d805f66871aa94538c3a9b7871d620013 \ + --hash=sha256:cf6c50cd879831955ac47af9c907ce0310245f9d162e298703f82e1785e38c98 \ + --hash=sha256:d8f1da01c04527f7da59ee3755d8ee112cd8967c15fab9e43bba936b81e2a013 \ + --hash=sha256:dd37d65519b3f8ed8976fa4302a2827cbb96e0a461a2e504db583b08a22f0b98 \ + --hash=sha256:e1c4f1071fe9c09af077a69b6c75f17feb473caeea0c3579b3e94834efcbdc36 \ + --hash=sha256:e6d95703efaa64aaabf278ced641b888fc23d9c6dd71f8215091afd8a26a66e3 \ + --hash=sha256:f44eda8bd7a4bccb0f281264b34bf3518d8c4c9a8ffe69a1a05dabf6e8461147 \ + --hash=sha256:f86e2c0259fe598c4532acfcf638c1f520fa77c1275912bbc958faecbf00b108 \ + --hash=sha256:fc19b78cc966db195024d8011649b4e22812f805dd49264323980715ab80accc + # via + # nuscenes-devkit + # trimesh six==1.17.0 \ --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 @@ -2115,7 +2464,13 @@ tensorflow==2.20.0 \ termcolor==2.5.0 \ --hash=sha256:37b17b5fc1e604945c2642c872a3764b5d547a48009871aea3edd3afa180afb8 \ --hash=sha256:998d8d27da6d48442e8e1f016119076b690d962507531df4890fcd2db2ef8a6f - # via tensorflow + # via + # fire + # tensorflow +threadpoolctl==3.6.0 \ + --hash=sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb \ + --hash=sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e + # via scikit-learn tinycss2==1.4.0 \ --hash=sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7 \ --hash=sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289 @@ -2146,6 +2501,7 @@ tqdm==4.67.1 \ # -r deps/pip/requirements_pai.in # -r deps/pip/requirements_tools.in # -r deps/pip/requirements_waymo.in + # nuscenes-devkit # viser traitlets==5.14.3 \ --hash=sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7 \ diff --git a/deps/pip/requirements_nuscenes.in b/deps/pip/requirements_nuscenes.in new file mode 100644 index 00000000..4cfbe852 --- /dev/null +++ b/deps/pip/requirements_nuscenes.in @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# nuScenes converter dependencies +nuscenes-devkit +# pyquaternion is a transitive dependency of nuscenes-devkit that we also use directly +# for quaternion-to-rotation-matrix conversion and SLERP interpolation. +pyquaternion diff --git a/docs/conversions/index.rst b/docs/conversions/index.rst index 3e622ec5..be50bee1 100644 --- a/docs/conversions/index.rst +++ b/docs/conversions/index.rst @@ -5,13 +5,14 @@ Data Conversions ================ NCore provides conversion tools for importing 3rd-party dataset formats into -the NCore V4 component-based format. Supported formats include KITTI, Waymo, -COLMAP (including ScanNet++), and PAI. +the NCore V4 component-based format. Supported formats include KITTI, nuScenes, +Waymo, COLMAP (including ScanNet++), and PAI. .. toctree:: :maxdepth: 1 kitti/kitti + nuscenes/nuscenes waymo/waymo colmap/colmap pai/pai diff --git a/docs/conversions/nuscenes/nuscenes.rst b/docs/conversions/nuscenes/nuscenes.rst new file mode 100644 index 00000000..881bd33d --- /dev/null +++ b/docs/conversions/nuscenes/nuscenes.rst @@ -0,0 +1,145 @@ +.. SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +.. SPDX-License-Identifier: Apache-2.0 + +nuScenes Dataset +================ + +The NCore nuScenes tool converts data from the +`nuScenes `_ autonomous driving dataset into +NCore V4 format. All dataset versions are supported (v1.0-mini, +v1.0-trainval, v1.0-test). + +.. _nuscenes_data_conventions: + +Conventions +----------- + +The nuScenes dataset provides data from 6 cameras, 1 lidar, and 5 +radars. The converter handles all sensor modalities and 3D annotations. + +Camera Sensors +^^^^^^^^^^^^^^ + 1. **Front (camera_front)** -- 1600x900, 70 deg FOV + 2. **Front Left (camera_front_left)** -- 1600x900, 70 deg FOV + 3. **Front Right (camera_front_right)** -- 1600x900, 70 deg FOV + 4. **Back (camera_back)** -- 1600x900, 110 deg FOV + 5. **Back Left (camera_back_left)** -- 1600x900, 70 deg FOV + 6. **Back Right (camera_back_right)** -- 1600x900, 70 deg FOV + +All cameras use Basler acA1600-60gc sensors (global shutter). Images are +provided undistorted with zero distortion coefficients. Camera intrinsics +are stored using :class:`~ncore.data.OpenCVPinholeCameraModelParameters` +with ``ShutterType.GLOBAL``. + +LiDAR Sensor +^^^^^^^^^^^^^ + 1. **Top LiDAR (lidar_top)** -- Velodyne HDL-32E, 32 layers, ~34k points/frame + +Point clouds in nuScenes are motion-compensated to the sensor frame at the +sweep reference timestamp. The converter decompensates them back to +per-point-time sensor frames (raw measurements) before storing, since +NCore V4 expects non-motion-compensated ray-bundle data. + +Per-point timestamps are derived from the column structure of the .bin +file: each file contains 32-point columns (one per beam) in sequential +firing order. All points within a column receive the same timestamp. +Frame time bounds are derived from consecutive sweep timestamps (not a +hardcoded scan frequency). + +A structured lidar model (``RowOffsetStructuredSpinningLidarModelParameters``) +is derived approximately from a decompensated reference frame and stored as +intrinsics. The model is approximate because nuScenes only provides +motion-compensated point clouds -- the original raw sensor data and exact +per-point timestamps are not available. The model is derived by decompensating +a reference frame using column-index-based timestamps and then extracting the +firing geometry from the resulting point cloud: + +- ``row_elevations_rad``: per-beam elevation angles (median across valid columns) +- ``column_azimuths_rad``: per-column azimuth angles from a reference beam row +- ``row_azimuth_offsets_rad``: per-beam azimuth offsets (intrinsic firing delay) +- ``spinning_direction``: clockwise ("cw") +- ``spinning_frequency_hz``: derived from inter-sweep timestamps (~20 Hz) + +The ``model_element`` field is populated with ``[ring_index, column_index]`` +per point, enabling structured lidar operations at read time. Column indices +are assigned via iterative column alignment (matching per-frame decompensated +azimuths against the static model). + +The minimum distance filter (1.0 m) matches the ``remove_close`` +default used by the nuScenes devkit to discard sensor housing +reflections. + +Radar Sensors +^^^^^^^^^^^^^ + 1. **Front (radar_front)** -- Continental ARS 408 + 2. **Front Left (radar_front_left)** -- Continental ARS 408 + 3. **Front Right (radar_front_right)** -- Continental ARS 408 + 4. **Back Left (radar_back_left)** -- Continental ARS 408 + 5. **Back Right (radar_back_right)** -- Continental ARS 408 + +Radar detections are sparse (typically 10-100 per sweep). Each detection +provides position (x, y, z), ego-motion-compensated velocity, and radar +cross section (RCS). Per-frame generic data fields: + +- ``radial_velocity_m_s`` (float32, [N]) -- radial velocity in m/s + (positive = moving away from sensor), computed by projecting the + ego-motion-compensated velocity vector onto the detection direction. +- ``rcs_dBsm`` (float32, [N]) -- radar cross section in dBsm. + +Radar is not a spinning sensor; all detections in a frame share a single +timestamp. + +Ego Poses +^^^^^^^^^ +Ego poses are derived from the per-sweep ``ego_pose`` records in the +nuScenes database (GPS/INS-based). Poses are stored as dynamic +``("rig", "world")`` poses relative to the first frame. The absolute +first-frame pose is preserved as a static ``("world", "world_global")`` +transform. + +3D Annotations +^^^^^^^^^^^^^^ +Cuboid annotations are stored in the ``world_global`` coordinate frame +(the nuScenes global map frame) as +:class:`~ncore.data.v4.CuboidsComponent` observations. Only keyframe +annotations are included. The :meth:`~ncore.data.CuboidTrackObservation.transform` +method can re-project them to any sensor frame at runtime via the pose +graph. + +Category mapping from nuScenes to NCore class IDs: + +- vehicle.car -> car +- vehicle.truck -> truck +- vehicle.bus.* -> bus +- vehicle.construction -> construction_vehicle +- vehicle.motorcycle -> motorcycle +- vehicle.bicycle -> bicycle +- vehicle.trailer -> trailer +- vehicle.emergency.* -> emergency_vehicle +- human.pedestrian.* -> pedestrian +- movable_object.barrier -> barrier +- movable_object.trafficcone -> traffic_cone + +Usage +----- + +.. code-block:: bash + + bazel run //tools/data_converter/nuscenes -- \ + --root-dir /path/to/nuscenes \ + --output-dir /path/to/output \ + nuscenes \ + --version v1.0-trainval + +Convert a single scene by name: + +.. code-block:: bash + + bazel run //tools/data_converter/nuscenes -- \ + --root-dir /path/to/nuscenes \ + --output-dir /path/to/output \ + nuscenes \ + --version v1.0-mini \ + --scene-name scene-0061 + +See ``tools/data_converter/nuscenes/README.md`` for full option documentation. diff --git a/tools/data_converter/nuscenes/BUILD.bazel b/tools/data_converter/nuscenes/BUILD.bazel new file mode 100644 index 00000000..cfc23604 --- /dev/null +++ b/tools/data_converter/nuscenes/BUILD.bazel @@ -0,0 +1,92 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@ncore_pip_deps//:requirements.bzl", "requirement") +load("@rules_python//python:defs.bzl", "py_binary", "py_library") +load("//bazel/pytest:defs.bzl", "pytest_test") + +# nuScenes-specific utilities: scene enumeration, box retrieval +py_library( + name = "pylib_utils", + srcs = ["utils.py"], + deps = [ + requirement("numpy"), + requirement("nuscenes-devkit"), + requirement("pyquaternion"), + "//ncore:pylib", + ], +) + +# Structured lidar model: derivation, alignment, optimization +py_library( + name = "pylib_lidar_model", + srcs = ["lidar_model.py"], + deps = [ + requirement("numpy"), + "//ncore:pylib", + ], +) + +# Converter library (config, converter class, CLI registration) +py_library( + name = "pylib", + srcs = [ + "converter.py", + ], + deps = [ + ":pylib_lidar_model", + ":pylib_utils", + requirement("click"), + requirement("numpy"), + requirement("nuscenes-devkit"), + requirement("pyquaternion"), + requirement("tqdm"), + requirement("universal_pathlib"), + "//ncore:pylib", + "//tools/data_converter:pylib_cli", + ], +) + +# Standalone CLI binary +py_binary( + name = "convert", + srcs = ["main.py"], + main = "main.py", + deps = [":pylib"], +) + +alias( + name = "nuscenes", + actual = ":convert", +) + +# Integration test for the nuScenes converter (requires NUSCENES_DIR env var) +pytest_test( + name = "pytest_converter", + srcs = ["converter_test.py"], + args = ["--import-mode=importlib"], + python_versions = ["3.11"], + tags = ["manual"], # Only run when explicitly requested (needs external data) + deps = [ + ":pylib", + requirement("nuscenes-devkit"), + requirement("numpy"), + requirement("parameterized"), + requirement("pyquaternion"), + requirement("torch"), + requirement("universal_pathlib"), + "//ncore:pylib", + ], +) diff --git a/tools/data_converter/nuscenes/NOTICE b/tools/data_converter/nuscenes/NOTICE new file mode 100644 index 00000000..bd27cc4a --- /dev/null +++ b/tools/data_converter/nuscenes/NOTICE @@ -0,0 +1,11 @@ +nuScenes Dataset +Copyright (c) 2019 nuScenes (https://www.nuscenes.org) + +This converter processes data from the nuScenes dataset. +The nuScenes dataset is released under the Creative Commons +Attribution-NonCommercial-ShareAlike 4.0 International License (CC BY-NC-SA 4.0). + +Users must agree to the nuScenes Terms of Use before downloading or using the dataset: +https://www.nuscenes.org/terms-of-use + +The nuscenes-devkit library is released under the Apache License 2.0. diff --git a/tools/data_converter/nuscenes/README.md b/tools/data_converter/nuscenes/README.md new file mode 100644 index 00000000..c26fefaa --- /dev/null +++ b/tools/data_converter/nuscenes/README.md @@ -0,0 +1,73 @@ +# nuScenes to NCore V4 Converter + +Converts [nuScenes](https://www.nuscenes.org/) dataset scenes to NCore V4 format. + +## Requirements + +- nuScenes dataset downloaded locally (any version: v1.0-mini, v1.0-trainval, v1.0-test) +- Python packages: `nuscenes-devkit`, `pyquaternion` + +## Usage + +```bash +bazel run //tools/data_converter/nuscenes -- \ + --root-dir /path/to/nuscenes \ + --output-dir /path/to/output \ + nuscenes \ + --version v1.0-trainval +``` + +### Convert a single scene by token + +```bash +bazel run //tools/data_converter/nuscenes -- \ + --root-dir /path/to/nuscenes \ + --output-dir /path/to/output \ + nuscenes \ + --version v1.0-mini \ + --scene-token cc8c0bf57f984915a77078b10eb33198 +``` + +### Convert a single scene by name + +```bash +bazel run //tools/data_converter/nuscenes -- \ + --root-dir /path/to/nuscenes \ + --output-dir /path/to/output \ + nuscenes \ + --version v1.0-mini \ + --scene-name scene-0061 +``` + +## Options + +| Option | Default | Description | +|--------|---------|-------------| +| `--version` | v1.0-trainval | nuScenes version string | +| `--scene-token` | None | Filter to a single scene by token | +| `--scene-name` | None | Filter to a single scene by name | +| `--store-type` | itar | Output store format (itar or directory) | +| `--profile` | separate-sensors | Component group assignment profile | +| `--sequence-meta/--no-sequence-meta` | enabled | Generate sequence meta JSON | + +## Sensor Assumptions + +- **Cameras**: Treated as global shutter (ShutterType.GLOBAL). nuScenes provides a single + capture timestamp per image with no rolling-shutter metadata. Images are already undistorted, + so all distortion coefficients are zero. +- **Lidar**: Velodyne HDL-32E spinning lidar at 20 Hz. Source point clouds are + motion-compensated; the converter decompensates them to raw per-point-time + measurements. Per-point timestamps are derived from the 32-beam column structure + in the .bin file. An approximate structured lidar model (elevation/azimuth per + beam/column) is derived from a decompensated reference frame and stored as + intrinsics. The model is approximate because nuScenes only provides + motion-compensated data -- original raw timestamps are not available. +- **Cuboid annotations**: Stored in the world coordinate frame. Only keyframe annotations + are included. + +## Testing + +```bash +NUSCENES_DIR=/path/to/nuscenes NUSCENES_VERSION=v1.0-mini \ + bazel test //tools/data_converter/nuscenes:pytest_converter +``` diff --git a/tools/data_converter/nuscenes/converter.py b/tools/data_converter/nuscenes/converter.py new file mode 100644 index 00000000..b4db4d51 --- /dev/null +++ b/tools/data_converter/nuscenes/converter.py @@ -0,0 +1,936 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""nuScenes dataset to NCore V4 converter.""" + +from __future__ import annotations + +import json +import logging + +from dataclasses import dataclass, replace +from typing import Dict, List, Literal, Optional + +import click +import numpy as np +import tqdm + +from nuscenes.utils.data_classes import RadarPointCloud +from pyquaternion import Quaternion +from upath import UPath + +from ncore.impl.common.transformations import HalfClosedInterval, MotionCompensator, se3_inverse +from ncore.impl.data.types import ( + BBox3, + CuboidTrackObservation, + LabelSource, + OpenCVPinholeCameraModelParameters, + RowOffsetStructuredSpinningLidarModelParameters, + ShutterType, +) +from ncore.impl.data.v4.components import ( + CameraSensorComponent, + CuboidsComponent, + IntrinsicsComponent, + LidarSensorComponent, + MasksComponent, + PosesComponent, + RadarSensorComponent, + SequenceComponentGroupsReader, + SequenceComponentGroupsWriter, +) +from ncore.impl.data.v4.types import ComponentGroupAssignments +from ncore.impl.data_converter.base import FileBasedDataConverter, FileBasedDataConverterConfig +from tools.data_converter.cli import cli +from tools.data_converter.nuscenes.lidar_model import ( + HDL32E_N_BEAMS, + HDL32E_N_TARGET_COLS, + HDL32E_SCAN_DURATION_US, + LidarFrameData, + align_frame, + compute_frame_timestamps, + compute_model_consistency, + decompensate_frame, + derive_model_from_decompensated, + optimize_model, +) +from tools.data_converter.nuscenes.utils import ( + CAMERA_MAP, + LIDAR_CHANNEL, + LIDAR_ID, + NUSCENES_CATEGORY_MAP, + RADAR_MAP, + get_boxes_for_sample_data, + get_nuscenes, + get_sweep_tokens, + resolve_scene_token, +) + + +# ----------------------------------------------------------------------------- +# Config +# ----------------------------------------------------------------------------- + + +@dataclass(kw_only=True, slots=True) +class NuScenesConverter4Config(FileBasedDataConverterConfig): + """Configuration for nuScenes to NCore V4 conversion.""" + + version: str = "v1.0-trainval" + scene_token: Optional[str] = None + scene_name: Optional[str] = None + store_type: Literal["itar", "directory"] = "itar" + component_group_profile: Literal["default", "separate-sensors", "separate-all"] = "separate-sensors" + store_sequence_meta: bool = True + lidar_model_optimization_passes: int = 1 + + +# ----------------------------------------------------------------------------- +# Converter +# ----------------------------------------------------------------------------- + + +class NuScenesConverter4(FileBasedDataConverter): + """Dataset preprocessing class for converting nuScenes data to NCore V4 format. + + Supports nuScenes versions: v1.0-mini, v1.0-trainval, v1.0-test. + + Sensor assumptions: + - Cameras: Treated as global shutter (ShutterType.GLOBAL). nuScenes provides a + single capture timestamp per image with no rolling-shutter metadata. Images are + already undistorted. + - Lidar: Velodyne HDL-32E spinning lidar (20 Hz, ~50ms scan duration). Per-point + timestamps are derived from the 32-beam column structure in the .bin file. + Source data is motion-compensated; we decompensate to raw measurements before + storing. Structured lidar model parameters (elevation/azimuth per beam/column) + are derived from the first frame's geometry. + - Cuboid annotations: Stored in the world coordinate frame. For non-keyframe + sweeps, box positions are linearly interpolated between bracketing keyframes. + """ + + def __init__(self, config: NuScenesConverter4Config) -> None: + super().__init__(config) + + self.component_group_profile = config.component_group_profile + self.store_type = config.store_type + self.store_sequence_meta = config.store_sequence_meta + self._lidar_model_optimization_passes = config.lidar_model_optimization_passes + + self._version = config.version + self._scene_token = config.scene_token + self._scene_name = config.scene_name + + self.logger = logging.getLogger(__name__) + + @staticmethod + def get_sequence_ids(config: NuScenesConverter4Config) -> List[str]: + """Discover scene tokens to convert.""" + nusc = get_nuscenes(version=config.version, dataroot=config.root_dir) + + resolved = resolve_scene_token(nusc, config.scene_token, config.scene_name) + if resolved is not None: + return [resolved] + + # All scenes + return [s["token"] for s in nusc.scene] + + @staticmethod + def from_config(config: NuScenesConverter4Config) -> NuScenesConverter4: + return NuScenesConverter4(config) + + def convert_sequence(self, sequence_id: str) -> None: + """Convert a single nuScenes scene to NCore V4 format.""" + scene_token = sequence_id + nusc = get_nuscenes(version=self._version, dataroot=str(self.root_dir)) + scene_record = nusc.get("scene", scene_token) + scene_name = scene_record["name"] + + self.logger.info(f"Converting scene {scene_name} ({scene_token})") + + # Use scene name as output directory (more readable than token) + sequence_output_name = scene_name + + # --- Gather lidar sweep timeline (used as pose timeline) --------------- + lidar_sweep_tokens = get_sweep_tokens(nusc, scene_record, LIDAR_CHANNEL) + lidar_sweep_data = [nusc.get("sample_data", t) for t in lidar_sweep_tokens] + lidar_timestamps_us = np.array([sd["timestamp"] for sd in lidar_sweep_data], dtype=np.uint64) + + n_lidar_frames = len(lidar_sweep_tokens) + assert n_lidar_frames >= 2, f"Scene has fewer than 2 lidar sweeps: {n_lidar_frames}" + + # --- Decode ego poses from lidar sweep ego_pose records ---------------- + T_rig_world_list: List[np.ndarray] = [] + for sd in lidar_sweep_data: + ego_pose = nusc.get("ego_pose", sd["ego_pose_token"]) + T = np.eye(4, dtype=np.float64) + T[:3, :3] = Quaternion(ego_pose["rotation"]).rotation_matrix + T[:3, 3] = ego_pose["translation"] + T_rig_world_list.append(T) + + T_rig_world_all = np.stack(T_rig_world_list) # [N, 4, 4] float64 (global coords) + pose_timestamps_us = lidar_timestamps_us.copy() + + # Store first pose as the world_global anchor (high precision for global coordinates), + # then make all poses relative to it (local coords -> float32 sufficient). + T_world_world_global = T_rig_world_all[0].copy() # float64 for global accuracy + T_world_global_inv = se3_inverse(T_world_world_global) + T_rig_world_relative = (T_world_global_inv @ T_rig_world_all).astype(np.float32) + + # --- Determine active sensors ------------------------------------------ + camera_ids = self.get_active_camera_ids(list(CAMERA_MAP.keys())) + lidar_ids = self.get_active_lidar_ids([LIDAR_ID]) + radar_ids = self.get_active_radar_ids(list(RADAR_MAP.keys())) + + # --- Compute sequence time interval ------------------------------------ + # Per-point timestamps span [prev_sweep_ts, current_sweep_ts] for each frame. + # For the first frame, extrapolate backward using the gap to the next frame. + if len(lidar_timestamps_us) >= 2: + first_gap = int(lidar_timestamps_us[1]) - int(lidar_timestamps_us[0]) + else: + first_gap = HDL32E_SCAN_DURATION_US + seq_start_us = int(lidar_timestamps_us[0]) - first_gap + seq_end_us = int(lidar_timestamps_us[-1]) + + # Also include camera and radar timestamps for full coverage + for ncore_cam_id, nusc_channel in CAMERA_MAP.items(): + if ncore_cam_id not in camera_ids: + continue + cam_tokens = get_sweep_tokens(nusc, scene_record, nusc_channel) + if cam_tokens: + cam_data = [nusc.get("sample_data", t) for t in cam_tokens] + cam_ts = [sd["timestamp"] for sd in cam_data] + seq_start_us = min(seq_start_us, min(cam_ts)) + seq_end_us = max(seq_end_us, max(cam_ts)) + + for ncore_radar_id, nusc_channel in RADAR_MAP.items(): + if ncore_radar_id not in radar_ids: + continue + radar_tokens = get_sweep_tokens(nusc, scene_record, nusc_channel) + if radar_tokens: + radar_data = [nusc.get("sample_data", t) for t in radar_tokens] + radar_ts = [sd["timestamp"] for sd in radar_data] + seq_start_us = min(seq_start_us, min(radar_ts)) + seq_end_us = max(seq_end_us, max(radar_ts)) + + sequence_timestamp_interval_us = HalfClosedInterval.from_start_end(seq_start_us, seq_end_us) + + # Extend pose timestamps to cover sequence interval boundaries. + # For the start boundary, extrapolate backward using the motion between + # the first two poses (constant-velocity assumption). This is critical + # for the first lidar frame's decompensation -- if we just replicate the + # first pose, the decompensator sees zero motion and produces no correction. + if seq_start_us < int(pose_timestamps_us[0]): + if len(T_rig_world_relative) >= 2: + # Extrapolate: apply the inverse of the motion from 0->1 to get the pose before 0. + T_0 = T_rig_world_relative[0] + T_1 = T_rig_world_relative[1] + T_delta_inv = se3_inverse(T_1) @ T_0 + T_boundary = (T_0 @ T_delta_inv).astype(np.float32) + T_rig_world_relative = np.concatenate([T_boundary[np.newaxis], T_rig_world_relative], axis=0) + else: + T_rig_world_relative = np.concatenate([T_rig_world_relative[:1], T_rig_world_relative], axis=0) + pose_timestamps_us = np.concatenate([np.array([seq_start_us], dtype=np.uint64), pose_timestamps_us]) + + if seq_end_us > int(pose_timestamps_us[-1]): + if len(T_rig_world_relative) >= 2: + # Extrapolate forward using constant-velocity from last two poses. + T_n1 = T_rig_world_relative[-2] + T_n = T_rig_world_relative[-1] + T_delta = se3_inverse(T_n1) @ T_n + T_boundary = (T_n @ T_delta).astype(np.float32) + T_rig_world_relative = np.concatenate([T_rig_world_relative, T_boundary[np.newaxis]], axis=0) + else: + T_rig_world_relative = np.concatenate([T_rig_world_relative, T_rig_world_relative[-1:]], axis=0) + pose_timestamps_us = np.concatenate([pose_timestamps_us, np.array([seq_end_us], dtype=np.uint64)]) + + # --- Component group assignments -------------------------------------- + component_groups = ComponentGroupAssignments.create( + camera_ids=camera_ids, + lidar_ids=lidar_ids, + radar_ids=radar_ids, + point_clouds_ids=[], + camera_labels_ids=[], + profile=self.component_group_profile, + ) + + # --- Create writer ---------------------------------------------------- + store_writer = SequenceComponentGroupsWriter( + output_dir_path=self.output_dir / sequence_output_name, + store_base_name=sequence_output_name, + sequence_id=sequence_output_name, + sequence_timestamp_interval_us=sequence_timestamp_interval_us, + store_type=self.store_type, + generic_meta_data={ + "source_dataset": "nuscenes", + "nuscenes_version": self._version, + "nuscenes_scene_token": scene_token, + "nuscenes_scene_name": scene_name, + }, + ) + + # --- Register component writers --------------------------------------- + poses_writer = store_writer.register_component_writer( + PosesComponent.Writer, + component_instance_name="default", + group_name=component_groups.poses_component_group, + generic_meta_data={ + "calibration_type": "nuscenes:calibrated_sensor", + "egomotion_type": "nuscenes:ego_pose", + }, + ) + + intrinsics_writer = store_writer.register_component_writer( + IntrinsicsComponent.Writer, + component_instance_name="default", + group_name=component_groups.intrinsics_component_group, + ) + + masks_writer = store_writer.register_component_writer( + MasksComponent.Writer, + component_instance_name="default", + group_name=component_groups.masks_component_group, + ) + + # --- Store ego poses -------------------------------------------------- + poses_writer.store_dynamic_pose( + source_frame_id="rig", + target_frame_id="world", + poses=T_rig_world_relative, + timestamps_us=pose_timestamps_us, + ) + + poses_writer.store_static_pose( + source_frame_id="world", + target_frame_id="world_global", + pose=T_world_world_global, + ) + + # --- Decode lidar ----------------------------------------------------- + if LIDAR_ID in lidar_ids: + self._decode_lidar( + nusc=nusc, + store_writer=store_writer, + poses_writer=poses_writer, + intrinsics_writer=intrinsics_writer, + component_groups=component_groups, + lidar_sweep_tokens=lidar_sweep_tokens, + lidar_sweep_data=lidar_sweep_data, + T_rig_world_relative=T_rig_world_relative, + pose_timestamps_us=pose_timestamps_us, + ) + + # --- Decode cameras --------------------------------------------------- + self._decode_cameras( + nusc=nusc, + scene_record=scene_record, + store_writer=store_writer, + poses_writer=poses_writer, + intrinsics_writer=intrinsics_writer, + masks_writer=masks_writer, + component_groups=component_groups, + camera_ids=camera_ids, + ) + + # --- Decode radars ---------------------------------------------------- + self._decode_radars( + nusc=nusc, + scene_record=scene_record, + store_writer=store_writer, + poses_writer=poses_writer, + component_groups=component_groups, + radar_ids=radar_ids, + ) + + # --- Decode cuboid annotations ---------------------------------------- + self._decode_cuboids( + nusc=nusc, + store_writer=store_writer, + component_groups=component_groups, + lidar_sweep_tokens=lidar_sweep_tokens, + lidar_sweep_data=lidar_sweep_data, + ) + + # --- Finalize --------------------------------------------------------- + ncore_4_paths = store_writer.finalize() + + if self.store_sequence_meta: + sequence_component_reader = SequenceComponentGroupsReader(ncore_4_paths) + sequence_meta_path = ( + self.output_dir / sequence_output_name / f"{sequence_component_reader.sequence_id}.json" + ) + with sequence_meta_path.open("w") as f: + json.dump(sequence_component_reader.get_sequence_meta().to_dict(), f, indent=2) + self.logger.info(f"Wrote sequence meta data {str(sequence_meta_path)}") + + # ------------------------------------------------------------------------- + # Lidar + # ------------------------------------------------------------------------- + + def _decode_lidar( + self, + nusc, + store_writer: SequenceComponentGroupsWriter, + poses_writer: PosesComponent.Writer, + intrinsics_writer: IntrinsicsComponent.Writer, + component_groups: ComponentGroupAssignments, + lidar_sweep_tokens: List[str], + lidar_sweep_data: List[Dict], + T_rig_world_relative: np.ndarray, + pose_timestamps_us: np.ndarray, + ) -> None: + """Decode and store all lidar frames. + + nuScenes point clouds are motion-compensated to the sensor frame at the sweep's + reference timestamp. We decompensate them back to per-point-time sensor frames + before storing, since NCore V4 expects raw (non-motion-compensated) measurements. + + Per-point timestamps are derived from the model column index (constant angular + velocity: one full rotation per frame). A structured lidar model with per-row + azimuth offsets is extracted from a reference frame and used for column alignment. + """ + # Get extrinsic from calibrated_sensor (lidar -> rig) + calibrated_sensor = nusc.get("calibrated_sensor", lidar_sweep_data[0]["calibrated_sensor_token"]) + T_lidar_rig = np.eye(4, dtype=np.float32) + T_lidar_rig[:3, :3] = Quaternion(calibrated_sensor["rotation"]).rotation_matrix + T_lidar_rig[:3, 3] = calibrated_sensor["translation"] + + # Store static extrinsic pose (lidar -> rig) + poses_writer.store_static_pose(source_frame_id=LIDAR_ID, target_frame_id="rig", pose=T_lidar_rig) + + # Initialize motion compensator for decompensation + motion_compensator = MotionCompensator.from_sensor_rig( + sensor_id=LIDAR_ID, + T_sensor_rig=T_lidar_rig, + T_rig_worlds=T_rig_world_relative, + T_rig_worlds_timestamps_us=pose_timestamps_us, + ) + + # Register lidar component writer + lidar_writer = store_writer.register_component_writer( + LidarSensorComponent.Writer, + component_instance_name=LIDAR_ID, + group_name=component_groups.lidar_component_groups.get(LIDAR_ID), + generic_meta_data={"sensor_model": "Velodyne HDL-32E"}, + ) + + # Precompute frame start timestamps from consecutive sweep times. + frame_start_timestamps = [] + for i in range(len(lidar_sweep_data)): + if i == 0: + if len(lidar_sweep_data) >= 2: + gap = int(lidar_sweep_data[1]["timestamp"]) - int(lidar_sweep_data[0]["timestamp"]) + else: + gap = HDL32E_SCAN_DURATION_US + frame_start_timestamps.append(int(lidar_sweep_data[0]["timestamp"]) - gap) + else: + frame_start_timestamps.append(int(lidar_sweep_data[i - 1]["timestamp"])) + + # --- Derive lidar model from a "good" frame --- + # Find the first frame with the target column count, decompensate it, and + # extract the model from the decompensated azimuths. + lidar_model_parameters: RowOffsetStructuredSpinningLidarModelParameters | None = None + + for j, sd_j in enumerate(lidar_sweep_data): + scan_j = np.fromfile(str(UPath(str(self.root_dir)) / sd_j["filename"]), dtype=np.float32).reshape(-1, 5) + xyz_j = scan_j[:, :3].astype(np.float32) + + if len(xyz_j) // HDL32E_N_BEAMS != HDL32E_N_TARGET_COLS: + continue + + frame_end_j = int(sd_j["timestamp"]) + frame_start_j = frame_start_timestamps[j] + frame_duration_s = (frame_end_j - frame_start_j) / 1e6 + freq_hz = 1.0 / frame_duration_s if frame_duration_s > 0 else 20.0 + + # Decompensate using column-index timestamps + + n_pts_j = len(xyz_j) + col_idx_j = np.arange(n_pts_j) // HDL32E_N_BEAMS + ts_j = compute_frame_timestamps(col_idx_j, HDL32E_N_TARGET_COLS, frame_start_j, frame_end_j) + + xyz_decomp_j = decompensate_frame(xyz_j, ts_j, frame_start_j, frame_end_j, motion_compensator, LIDAR_ID) + + lidar_model_parameters = derive_model_from_decompensated( + xyz_decompensated=xyz_decomp_j, + n_beams_per_column=HDL32E_N_BEAMS, + n_target_cols=HDL32E_N_TARGET_COLS, + spinning_direction="cw", + spinning_frequency_hz=freq_hz, + ) + if lidar_model_parameters is not None: + self.logger.info(f"Derived lidar model from frame {j} (n_cols={lidar_model_parameters.n_columns})") + break + + assert lidar_model_parameters is not None, ( + f"Failed to derive lidar model: no frame with {HDL32E_N_TARGET_COLS} columns found" + ) + n_model_cols = lidar_model_parameters.n_columns + + # --- Process each frame --- + optimization_data: List[LidarFrameData] = [] + + for i, (_, sd) in enumerate( + tqdm.tqdm( + zip(lidar_sweep_tokens, lidar_sweep_data), + total=len(lidar_sweep_tokens), + desc=f"Process {LIDAR_ID}", + ) + ): + source_pc_path = UPath(str(self.root_dir)) / sd["filename"] + scan = np.fromfile(str(source_pc_path), dtype=np.float32).reshape(-1, 5) + xyz_mc = scan[:, :3].astype(np.float32) + raw_intensity = scan[:, 3] + ring_index = scan[:, 4].astype(np.uint16) + intensity = (raw_intensity / 255.0).astype(np.float32) + + frame_end_us = int(sd["timestamp"]) + frame_start_us = frame_start_timestamps[i] + + # Align and decompensate using modular pipeline + frame_data = align_frame( + xyz_mc=xyz_mc, + ring_index=ring_index, + intensity=intensity, + n_beams_per_column=HDL32E_N_BEAMS, + model_params=lidar_model_parameters, + motion_compensator=motion_compensator, + sensor_id=LIDAR_ID, + frame_start_us=frame_start_us, + frame_end_us=frame_end_us, + ) + + if frame_data is None: + continue + + # Collect data for optional multi-frame optimization + if self._lidar_model_optimization_passes > 0: + optimization_data.append(frame_data) + + # Compute direction and distance from decompensated points + distance_m = np.linalg.norm(frame_data.xyz_decompensated, axis=1).astype(np.float32) + direction = np.zeros_like(frame_data.xyz_decompensated) + nonzero_mask = distance_m > 0 + direction[nonzero_mask] = frame_data.xyz_decompensated[nonzero_mask] / distance_m[nonzero_mask, np.newaxis] + + lidar_writer.store_frame( + direction=direction, + timestamp_us=frame_data.timestamps_us, + model_element=frame_data.model_element, + distance_m=distance_m.reshape(1, -1), + intensity=frame_data.intensity.reshape(1, -1), + frame_timestamps_us=np.array([frame_start_us, frame_end_us], dtype=np.uint64), + generic_data={}, + generic_meta_data={}, + ) + + # --- Optional: multi-frame model optimization --- + if self._lidar_model_optimization_passes > 0 and optimization_data: + frame_azimuths = [] + frame_model_cols = [] + frame_model_rows = [] + frame_distances = [] + + for fd in optimization_data: + az = np.arctan2(fd.xyz_decompensated[:, 1], fd.xyz_decompensated[:, 0]).astype(np.float64) + frame_azimuths.append(az) + frame_model_cols.append(fd.model_element[:, 1].astype(np.int64)) + frame_model_rows.append(fd.model_element[:, 0].astype(np.int64)) + frame_distances.append(np.linalg.norm(fd.xyz_decompensated, axis=1)) + + lidar_model_parameters = optimize_model( + model_params=lidar_model_parameters, + frame_azimuths=frame_azimuths, + frame_model_cols=frame_model_cols, + frame_model_rows=frame_model_rows, + frame_distances=frame_distances, + min_range_m=10.0, + n_iterations=self._lidar_model_optimization_passes, + ) + self.logger.info( + f"Optimized lidar model across {len(optimization_data)} frames " + f"({self._lidar_model_optimization_passes} iterations)" + ) + + # Store lidar intrinsics (structured model, possibly optimized) + intrinsics_writer.store_lidar_intrinsics( + lidar_id=LIDAR_ID, + lidar_model_parameters=lidar_model_parameters, + ) + + # ------------------------------------------------------------------------- + # Cameras + # ------------------------------------------------------------------------- + + def _decode_cameras( + self, + nusc, + scene_record: Dict, + store_writer: SequenceComponentGroupsWriter, + poses_writer: PosesComponent.Writer, + intrinsics_writer: IntrinsicsComponent.Writer, + masks_writer: MasksComponent.Writer, + component_groups: ComponentGroupAssignments, + camera_ids: List[str], + ) -> None: + """Decode and store all camera frames.""" + for ncore_cam_id, nusc_channel in CAMERA_MAP.items(): + if ncore_cam_id not in camera_ids: + continue + + self.logger.info(f"Processing camera {ncore_cam_id} ({nusc_channel})") + + cam_sweep_tokens = get_sweep_tokens(nusc, scene_record, nusc_channel) + cam_sweep_data = [nusc.get("sample_data", t) for t in cam_sweep_tokens] + + if not cam_sweep_data: + self.logger.warning(f"No data for camera {nusc_channel}") + continue + + # Get calibration from first sweep + calibrated_sensor = nusc.get("calibrated_sensor", cam_sweep_data[0]["calibrated_sensor_token"]) + + # Camera extrinsic: sensor -> rig + T_cam_rig = np.eye(4, dtype=np.float32) + T_cam_rig[:3, :3] = Quaternion(calibrated_sensor["rotation"]).rotation_matrix + T_cam_rig[:3, 3] = calibrated_sensor["translation"] + + # Store camera extrinsic + poses_writer.store_static_pose( + source_frame_id=ncore_cam_id, + target_frame_id="rig", + pose=T_cam_rig, + ) + + # Parse intrinsics + I_cam = np.array(calibrated_sensor["camera_intrinsic"], dtype=np.float32) # [3, 3] + width = int(cam_sweep_data[0]["width"]) + height = int(cam_sweep_data[0]["height"]) + + # Store camera intrinsics + # nuScenes images are undistorted, so all distortion coefficients are zero. + # ShutterType.GLOBAL: nuScenes provides a single capture timestamp per image + # with no rolling-shutter metadata available. + intrinsics_writer.store_camera_intrinsics( + camera_id=ncore_cam_id, + camera_model_parameters=OpenCVPinholeCameraModelParameters( + resolution=np.array([width, height], dtype=np.uint64), + shutter_type=ShutterType.GLOBAL, + external_distortion_parameters=None, + principal_point=np.array([I_cam[0, 2], I_cam[1, 2]], dtype=np.float32), + focal_length=np.array([I_cam[0, 0], I_cam[1, 1]], dtype=np.float32), + radial_coeffs=np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0], dtype=np.float32), + tangential_coeffs=np.array([0.0, 0.0], dtype=np.float32), + thin_prism_coeffs=np.array([0.0, 0.0, 0.0, 0.0], dtype=np.float32), + ), + ) + + # Store empty masks + masks_writer.store_camera_masks( + camera_id=ncore_cam_id, + mask_images={}, + ) + + # Register camera component writer + camera_writer = store_writer.register_component_writer( + CameraSensorComponent.Writer, + component_instance_name=ncore_cam_id, + group_name=component_groups.camera_component_groups.get(ncore_cam_id), + generic_meta_data={}, + ) + + # Store frames + for sd in tqdm.tqdm(cam_sweep_data, desc=f"Process {ncore_cam_id}"): + image_path = UPath(str(self.root_dir)) / sd["filename"] + + with image_path.open("rb") as f: + image_binary = f.read() + + # Global shutter: frame start == frame end timestamp + frame_ts = int(sd["timestamp"]) + + camera_writer.store_frame( + image_binary_data=image_binary, + image_format="jpeg", + frame_timestamps_us=np.array([frame_ts, frame_ts], dtype=np.uint64), + generic_data={}, + generic_meta_data={}, + ) + + self.logger.info(f"Processed {len(camera_ids)} cameras") + + # ------------------------------------------------------------------------- + # Radars + # ------------------------------------------------------------------------- + + def _decode_radars( + self, + nusc, + scene_record: Dict, + store_writer: SequenceComponentGroupsWriter, + poses_writer: PosesComponent.Writer, + component_groups: ComponentGroupAssignments, + radar_ids: List[str], + ) -> None: + """Decode and store all radar frames. + + nuScenes radars (Continental ARS 408) provide sparse detections with + Cartesian position (x, y, z), ego-motion-compensated velocity (vx_comp, + vy_comp), and radar cross section (rcs). Data is stored in .pcd files + with 18 fields per detection. + + We compute radial velocity by projecting the compensated velocity vector + onto the detection direction (positive = moving away from sensor). + """ + + for ncore_radar_id, nusc_channel in RADAR_MAP.items(): + if ncore_radar_id not in radar_ids: + continue + + self.logger.info(f"Processing radar {ncore_radar_id} ({nusc_channel})") + + radar_sweep_tokens = get_sweep_tokens(nusc, scene_record, nusc_channel) + radar_sweep_data = [nusc.get("sample_data", t) for t in radar_sweep_tokens] + + if not radar_sweep_data: + self.logger.warning(f"No data for radar {nusc_channel}") + continue + + # Get calibration (radar -> rig extrinsic) + calibrated_sensor = nusc.get("calibrated_sensor", radar_sweep_data[0]["calibrated_sensor_token"]) + T_radar_rig = np.eye(4, dtype=np.float32) + T_radar_rig[:3, :3] = Quaternion(calibrated_sensor["rotation"]).rotation_matrix + T_radar_rig[:3, 3] = calibrated_sensor["translation"] + + # Store radar extrinsic + poses_writer.store_static_pose( + source_frame_id=ncore_radar_id, + target_frame_id="rig", + pose=T_radar_rig, + ) + + # Register radar component writer + radar_writer = store_writer.register_component_writer( + RadarSensorComponent.Writer, + component_instance_name=ncore_radar_id, + group_name=component_groups.radar_component_groups.get(ncore_radar_id), + generic_meta_data={ + "sensor_model": "Continental ARS 408", + }, + ) + + # Store frames + for sd in tqdm.tqdm(radar_sweep_data, desc=f"Process {ncore_radar_id}"): + radar_path = UPath(str(self.root_dir)) / sd["filename"] + + # Load radar point cloud (18 fields) + pc = RadarPointCloud.from_file(str(radar_path)) + pts = pc.points.T # [N, 18] + + if len(pts) == 0: + continue + + # Extract fields + xyz = pts[:, :3].astype(np.float32) # x, y, z in sensor frame + rcs = pts[:, 5].astype(np.float32) # radar cross section (dBsm) + vx_comp = pts[:, 8].astype(np.float32) # ego-motion-compensated velocity x + vy_comp = pts[:, 9].astype(np.float32) # ego-motion-compensated velocity y + + # Compute distance and direction + distance = np.linalg.norm(xyz, axis=1).astype(np.float32) + valid_mask = distance > 0.1 # filter degenerate detections + + if not valid_mask.any(): + continue + + xyz = xyz[valid_mask] + distance = distance[valid_mask] + rcs = rcs[valid_mask] + vx_comp = vx_comp[valid_mask] + vy_comp = vy_comp[valid_mask] + + direction = (xyz / distance[:, np.newaxis]).astype(np.float32) + + # Compute radial velocity: project compensated velocity onto direction + # Positive = moving away from sensor + velocity_vec = np.stack([vx_comp, vy_comp, np.zeros_like(vx_comp)], axis=1) + radial_velocity = np.sum(velocity_vec * direction, axis=1).astype(np.float32) + + # Radar is not a spinning sensor -- all detections share one timestamp + frame_ts = int(sd["timestamp"]) + timestamp_us = np.full(len(xyz), frame_ts, dtype=np.uint64) + + radar_writer.store_frame( + direction=direction, + timestamp_us=timestamp_us, + distance_m=distance.reshape(1, -1), # [1, N] single return + frame_timestamps_us=np.array([frame_ts, frame_ts], dtype=np.uint64), + generic_data={ + "radial_velocity_m_s": radial_velocity, + "rcs_dBsm": rcs, + }, + generic_meta_data={}, + ) + + self.logger.info(f"Processed {len(radar_ids)} radars") + + # ------------------------------------------------------------------------- + # Cuboid annotations + # ------------------------------------------------------------------------- + + def _decode_cuboids( + self, + nusc, + store_writer: SequenceComponentGroupsWriter, + component_groups: ComponentGroupAssignments, + lidar_sweep_tokens: List[str], + lidar_sweep_data: List[Dict], + ) -> None: + """Decode nuScenes 3D annotations and store as cuboid track observations. + + Annotations are stored in the world coordinate frame. For non-keyframe sweeps, + box positions are interpolated between bracketing keyframes. + """ + cuboid_observations: List[CuboidTrackObservation] = [] + + for token, sd in tqdm.tqdm( + zip(lidar_sweep_tokens, lidar_sweep_data), + total=len(lidar_sweep_tokens), + desc="Process cuboids", + ): + # Only process keyframes (annotations are defined at keyframes) + if not sd["is_key_frame"]: + continue + + boxes = get_boxes_for_sample_data(nusc, token) + timestamp_us = int(sd["timestamp"]) + + for box in boxes: + # Filter to mapped categories only + if box.name not in NUSCENES_CATEGORY_MAP: + continue + + class_id = NUSCENES_CATEGORY_MAP[box.name] + + # nuScenes Box: center=[x,y,z] in global frame, wlh=[width, length, height] + # BBox3 format: [cx, cy, cz, size_x, size_y, size_z, rx, ry, rz] + # nuScenes wlh order is [width, length, height] + # Heading: extract yaw from quaternion + yaw = Quaternion(box.orientation).yaw_pitch_roll[0] + + bbox3 = BBox3.from_array( + np.array( + [ + box.center[0], + box.center[1], + box.center[2], + box.wlh[1], # length -> size_x + box.wlh[0], # width -> size_y + box.wlh[2], # height -> size_z + 0.0, # rx (pitch) -- only yaw used + 0.0, # ry (roll) -- only yaw used + yaw, # rz (yaw) + ], + dtype=np.float32, + ) + ) + + cuboid_observations.append( + CuboidTrackObservation( + track_id=box.token, # instance_token as track ID + class_id=class_id, + timestamp_us=timestamp_us, + reference_frame_id="world_global", + reference_frame_timestamp_us=timestamp_us, + bbox3=bbox3, + source=LabelSource.EXTERNAL, + ) + ) + + if cuboid_observations: + store_writer.register_component_writer( + CuboidsComponent.Writer, + "default", + component_groups.cuboid_track_observations_component_group, + ).store_observations(cuboid_observations) + + self.logger.info(f"Stored {len(cuboid_observations)} cuboid observations") + else: + self.logger.info("No cuboid annotations found (test split or empty scenes)") + + +# ----------------------------------------------------------------------------- +# CLI +# ----------------------------------------------------------------------------- + + +@cli.command() +@click.option( + "--version", + "nuscenes_version", + type=str, + default="v1.0-trainval", + show_default=True, + help="nuScenes dataset version (v1.0-mini, v1.0-trainval, v1.0-test)", +) +@click.option( + "--scene-token", + type=str, + default=None, + help="Convert only the scene with this token (mutually exclusive with --scene-name)", +) +@click.option( + "--scene-name", + type=str, + default=None, + help="Convert only the scene with this name, e.g. 'scene-0001' (mutually exclusive with --scene-token)", +) +@click.option( + "--store-type", + type=click.Choice(["itar", "directory"], case_sensitive=False), + default="itar", + show_default=True, + help="Output store type", +) +@click.option( + "component_group_profile", + "--profile", + type=click.Choice(["default", "separate-sensors", "separate-all"], case_sensitive=False), + default="separate-sensors", + show_default=True, + help="Output profile for component group assignment", +) +@click.option( + "store_sequence_meta", + "--sequence-meta/--no-sequence-meta", + default=True, + help="Generate sequence meta-data JSON?", +) +@click.option( + "lidar_model_optimization_passes", + "--lidar-model-optimization-passes", + type=int, + default=1, + show_default=True, + help="Number of multi-frame optimization passes for the lidar model (0 to disable).", +) +@click.pass_context +def nuscenes(ctx, nuscenes_version, scene_token, scene_name, **kwargs): + """nuScenes data conversion (V4 format)""" + + config = NuScenesConverter4Config( + **{**vars(ctx.obj), "version": nuscenes_version, "scene_token": scene_token, "scene_name": scene_name, **kwargs} + ) + + NuScenesConverter4.convert(config) diff --git a/tools/data_converter/nuscenes/converter_test.py b/tools/data_converter/nuscenes/converter_test.py new file mode 100644 index 00000000..7b400602 --- /dev/null +++ b/tools/data_converter/nuscenes/converter_test.py @@ -0,0 +1,403 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Integration tests for the nuScenes data converter (V4 format). + +Requires the NUSCENES_DIR environment variable pointing to a nuScenes dataset root +directory (e.g. /data/nuscenes). Works with any version but v1.0-mini is recommended +for CI since it is small (~4GB). + +Set NUSCENES_VERSION to override the default (v1.0-mini for tests). +""" + +import os +import tempfile +import unittest + +from typing import Literal, cast + +import numpy as np +import torch + +from parameterized import parameterized_class +from upath import UPath + +from ncore.impl.data.types import OpenCVPinholeCameraModelParameters, RowOffsetStructuredSpinningLidarModelParameters +from ncore.impl.data.v4.components import ( + CameraSensorComponent, + CuboidsComponent, + IntrinsicsComponent, + LidarSensorComponent, + PosesComponent, + RadarSensorComponent, + SequenceComponentGroupsReader, +) +from ncore.impl.sensors.lidar import StructuredLidarModel +from tools.data_converter.nuscenes.converter import NuScenesConverter4, NuScenesConverter4Config +from tools.data_converter.nuscenes.utils import get_nuscenes + + +@parameterized_class( + ("store_type",), + [ + ("itar",), + ("directory",), + ], +) +class TestNuScenesConverter(unittest.TestCase): + """Integration tests for nuScenes data converter. + + Requires NUSCENES_DIR environment variable pointing to a nuScenes dataset root. + Uses the first scene in the dataset for testing. + """ + + store_type: Literal["itar", "directory"] + + @classmethod + def setUpClass(cls): + cls.nuscenes_dir = os.environ.get("NUSCENES_DIR") + if cls.nuscenes_dir is None: + raise unittest.SkipTest("NUSCENES_DIR not set -- skipping nuScenes integration tests") + + cls.nuscenes_version = os.environ.get("NUSCENES_VERSION", "v1.0-mini") + + cls._tempdir = tempfile.TemporaryDirectory(prefix="nuscenes_test_") + cls.output_dir = cls._tempdir.name + + # Run the converter for the first scene only + + nusc = get_nuscenes(version=cls.nuscenes_version, dataroot=cls.nuscenes_dir) + cls.scene_token = nusc.scene[0]["token"] + cls.scene_name = nusc.scene[0]["name"] + + config = NuScenesConverter4Config( + root_dir=cls.nuscenes_dir, + output_dir=cls.output_dir, + no_cameras=False, + camera_ids=None, + no_lidars=False, + lidar_ids=None, + no_radars=False, + radar_ids=None, + verbose=False, + debug=False, + debug_port=5678, + version=cls.nuscenes_version, + scene_token=cls.scene_token, + scene_name=None, + store_type=cls.store_type, + component_group_profile="separate-sensors", + store_sequence_meta=True, + ) + NuScenesConverter4.convert(config) + + # Find output sequence directory (named after scene_name) + seq_dirs = [d for d in UPath(cls.output_dir).iterdir() if d.is_dir()] + assert len(seq_dirs) == 1, f"Expected 1 sequence dir, found {len(seq_dirs)}: {seq_dirs}" + cls.seq_dir = seq_dirs[0] + + # Open reader via the sequence meta JSON file + meta_files = list(cls.seq_dir.glob("*.json")) + assert len(meta_files) == 1, f"Expected 1 meta JSON, found {len(meta_files)}" + cls.reader = SequenceComponentGroupsReader([meta_files[0]]) + + @classmethod + def tearDownClass(cls): + cls._tempdir.cleanup() + + # --- Poses ---------------------------------------------------------------- + + def test_sequence_has_dynamic_rig_to_world_pose(self): + """Verify dynamic rig -> world ego pose exists.""" + poses_readers = self.reader.open_component_readers(PosesComponent.Reader) + self.assertEqual(len(poses_readers), 1) + poses_reader = list(poses_readers.values())[0] + + poses, timestamps = poses_reader.get_dynamic_pose("rig", "world") + self.assertEqual(poses.shape[1:], (4, 4)) + self.assertGreater(poses.shape[0], 0) + self.assertEqual(timestamps.shape[0], poses.shape[0]) + + def test_sequence_has_static_world_to_world_global(self): + """Verify static world -> world_global pose exists.""" + poses_readers = self.reader.open_component_readers(PosesComponent.Reader) + poses_reader = list(poses_readers.values())[0] + + static_poses = dict(poses_reader.get_static_poses()) + self.assertIn(("world", "world_global"), static_poses) + pose = static_poses[("world", "world_global")] + self.assertEqual(pose.shape, (4, 4)) + + def test_first_pose_near_identity(self): + """Verify the first actual sweep pose is near identity (local origin).""" + poses_readers = self.reader.open_component_readers(PosesComponent.Reader) + poses_reader = list(poses_readers.values())[0] + + poses, _ = poses_reader.get_dynamic_pose("rig", "world") + # poses[0] is the extrapolated boundary; poses[1] is the first real sweep + second_pose = poses[1] + np.testing.assert_array_almost_equal(second_pose, np.eye(4, dtype=np.float32), decimal=3) + + # --- Cameras -------------------------------------------------------------- + + def test_six_cameras_exist(self): + """Verify all 6 camera readers exist with frames.""" + camera_readers = self.reader.open_component_readers(CameraSensorComponent.Reader) + expected_ids = { + "camera_front", + "camera_front_left", + "camera_front_right", + "camera_back", + "camera_back_left", + "camera_back_right", + } + self.assertEqual(set(camera_readers.keys()), expected_ids) + for cam_id, cam_reader in camera_readers.items(): + self.assertGreater(cam_reader.frames_count, 0, f"{cam_id} should have frames") + + def test_camera_intrinsics_zero_distortion(self): + """Verify camera intrinsics have zero distortion (undistorted images).""" + intrinsics_readers = self.reader.open_component_readers(IntrinsicsComponent.Reader) + self.assertEqual(len(intrinsics_readers), 1) + intrinsics_reader = list(intrinsics_readers.values())[0] + + for cam_id in [ + "camera_front", + "camera_front_left", + "camera_front_right", + "camera_back", + "camera_back_left", + "camera_back_right", + ]: + params = intrinsics_reader.get_camera_model_parameters(cam_id) + self.assertIsInstance(params, OpenCVPinholeCameraModelParameters) + params = cast(OpenCVPinholeCameraModelParameters, params) + np.testing.assert_array_equal(params.radial_coeffs, np.zeros(6, dtype=np.float32)) + np.testing.assert_array_equal(params.tangential_coeffs, np.zeros(2, dtype=np.float32)) + self.assertTrue(np.all(params.focal_length > 0)) + + def test_camera_extrinsics_stored_as_static_poses(self): + """Verify each camera has a static sensor -> rig extrinsic pose.""" + poses_readers = self.reader.open_component_readers(PosesComponent.Reader) + poses_reader = list(poses_readers.values())[0] + + static_poses = dict(poses_reader.get_static_poses()) + for cam_id in [ + "camera_front", + "camera_front_left", + "camera_front_right", + "camera_back", + "camera_back_left", + "camera_back_right", + ]: + self.assertIn((cam_id, "rig"), static_poses, f"Missing static pose for {cam_id}") + pose = static_poses[(cam_id, "rig")] + self.assertEqual(pose.shape, (4, 4)) + + # --- Lidar ---------------------------------------------------------------- + + def test_lidar_exists_with_frames(self): + """Verify lidar reader exists with frames.""" + lidar_readers = self.reader.open_component_readers(LidarSensorComponent.Reader) + self.assertIn("lidar_top", lidar_readers) + lidar_reader = lidar_readers["lidar_top"] + self.assertGreater(lidar_reader.frames_count, 0) + + def test_lidar_extrinsic_stored_as_static_pose(self): + """Verify lidar has a static sensor -> rig extrinsic pose.""" + poses_readers = self.reader.open_component_readers(PosesComponent.Reader) + poses_reader = list(poses_readers.values())[0] + + static_poses = dict(poses_reader.get_static_poses()) + self.assertIn(("lidar_top", "rig"), static_poses) + pose = static_poses[("lidar_top", "rig")] + self.assertEqual(pose.shape, (4, 4)) + + def test_lidar_has_structured_model(self): + """Verify lidar intrinsics contain a structured spinning model.""" + + intrinsics_readers = self.reader.open_component_readers(IntrinsicsComponent.Reader) + intrinsics_reader = list(intrinsics_readers.values())[0] + + params = intrinsics_reader.get_lidar_model_parameters("lidar_top") + self.assertIsNotNone(params) + self.assertIsInstance(params, RowOffsetStructuredSpinningLidarModelParameters) + assert isinstance(params, RowOffsetStructuredSpinningLidarModelParameters) # narrow type + + # HDL-32E: 32 rows, spinning CW at ~20Hz + self.assertEqual(params.n_rows, 32) + self.assertGreater(params.n_columns, 1000) # typically ~1084 + self.assertEqual(params.spinning_direction, "cw") + self.assertAlmostEqual(params.spinning_frequency_hz, 20.0, delta=1.0) + + # Elevation angles: should span roughly -30 to +10 deg for HDL-32E + self.assertEqual(len(params.row_elevations_rad), 32) + min_elev_deg = np.degrees(params.row_elevations_rad.min()) + max_elev_deg = np.degrees(params.row_elevations_rad.max()) + self.assertLess(min_elev_deg, -20.0) + self.assertGreater(max_elev_deg, 5.0) + + # Column azimuths: should span nearly 360 degrees + azimuth_span = params.column_azimuths_rad.max() - params.column_azimuths_rad.min() + self.assertGreater(np.degrees(azimuth_span), 300.0) + + def test_lidar_model_reproduces_point_cloud(self): + """Verify that model-based points match native direction*distance points across frames. + + For each lidar frame, computes points two ways: + 1. Native: direction * distance (stored ray-bundle data) + 2. Model-based: elements_to_sensor_points(model_element, distance) + + The model is derived from median statistics, so we expect small angular + deviations (~0.1 deg) but the overall structure should match closely. + """ + + intrinsics_readers = self.reader.open_component_readers(IntrinsicsComponent.Reader) + intrinsics_reader = list(intrinsics_readers.values())[0] + params = intrinsics_reader.get_lidar_model_parameters("lidar_top") + assert isinstance(params, RowOffsetStructuredSpinningLidarModelParameters) + + lidar_model = StructuredLidarModel.maybe_from_parameters(params, device="cpu") + assert lidar_model is not None + + lidar_readers = self.reader.open_component_readers(LidarSensorComponent.Reader) + lidar_reader = lidar_readers["lidar_top"] + + # Get frame end timestamps for indexing (reader API uses end-of-frame timestamp as key) + frame_timestamps = lidar_reader.frames_timestamps_us # [N, 2] (start, end) + frame_end_timestamps = frame_timestamps[:, 1] + n_frames = len(frame_end_timestamps) + + # Check a subset of frames (every 20th to keep test fast) + frame_indices = list(range(0, n_frames, max(1, n_frames // 20))) + + max_angular_errors_deg = [] + mean_angular_errors_deg = [] + + for idx in frame_indices: + ts = int(frame_end_timestamps[idx]) + + # Native: direction * distance + direction = lidar_reader.get_frame_ray_bundle_data(ts, "direction") + distance_2d = np.array(lidar_reader._get_ray_bundle_returns_group(ts)["distance_m"]) # [R, N] + distance = distance_2d[0] # first return + + # Model element + model_element_data = lidar_reader.get_frame_ray_bundle_data(ts, "model_element") + + # Filter valid (finite, positive distance) + valid = np.isfinite(distance) & (distance > 0) + if not valid.any(): + continue + + native_pts = direction[valid] * distance[valid, np.newaxis] + + # Model-based: elements_to_sensor_points + model_pts = ( + lidar_model.elements_to_sensor_points( + model_element_data[valid], + distance[valid], + ) + .cpu() + .numpy() + ) + + # Compare via angular error between the two point sets + native_norms = np.linalg.norm(native_pts, axis=1, keepdims=True) + model_norms = np.linalg.norm(model_pts, axis=1, keepdims=True) + native_dirs = native_pts / np.maximum(native_norms, 1e-8) + model_dirs = model_pts / np.maximum(model_norms, 1e-8) + cos_angle = np.clip(np.sum(native_dirs * model_dirs, axis=1), -1.0, 1.0) + angular_error_deg = np.degrees(np.arccos(cos_angle)) + + max_angular_errors_deg.append(float(angular_error_deg.max())) + mean_angular_errors_deg.append(float(angular_error_deg.mean())) + + # Expect: mean angular error < 0.5 deg overall, < 0.2 deg for >20m range. + # The model uses a linear fit of far-range azimuths + iterative timestamp refinement. + # Deviations come from MC distortion (translational) which scales inversely with range. + overall_mean = np.mean(mean_angular_errors_deg) + overall_max = np.max(max_angular_errors_deg) + self.assertLess(overall_mean, 0.5, f"Mean angular error too large: {overall_mean:.3f} deg") + self.assertLess(overall_max, 5.0, f"Max angular error too large: {overall_max:.3f} deg") + + # --- Radars --------------------------------------------------------------- + + def test_five_radars_exist(self): + """Verify all 5 radar readers exist with frames.""" + radar_readers = self.reader.open_component_readers(RadarSensorComponent.Reader) + expected_ids = { + "radar_front", + "radar_front_left", + "radar_front_right", + "radar_back_left", + "radar_back_right", + } + self.assertEqual(set(radar_readers.keys()), expected_ids) + for radar_id, radar_reader in radar_readers.items(): + self.assertGreater(radar_reader.frames_count, 0, f"{radar_id} should have frames") + + def test_radar_extrinsics_stored_as_static_poses(self): + """Verify each radar has a static sensor -> rig extrinsic pose.""" + poses_readers = self.reader.open_component_readers(PosesComponent.Reader) + poses_reader = list(poses_readers.values())[0] + + static_poses = dict(poses_reader.get_static_poses()) + for radar_id in [ + "radar_front", + "radar_front_left", + "radar_front_right", + "radar_back_left", + "radar_back_right", + ]: + self.assertIn((radar_id, "rig"), static_poses, f"Missing static pose for {radar_id}") + pose = static_poses[(radar_id, "rig")] + self.assertEqual(pose.shape, (4, 4)) + + # --- Cuboids (Annotations) ------------------------------------------------ + + def test_cuboid_observations_exist(self): + """Verify cuboid track observations were stored from annotations.""" + cuboid_readers = self.reader.open_component_readers(CuboidsComponent.Reader) + # v1.0-mini has annotations, v1.0-test does not + if not cuboid_readers: + self.skipTest("No cuboid component (possibly test split with no annotations)") + + self.assertEqual(len(cuboid_readers), 1) + cuboid_reader = list(cuboid_readers.values())[0] + + observations = list(cuboid_reader.get_observations()) + self.assertGreater(len(observations), 0) + + # Check first observation has expected fields + obs = observations[0] + self.assertIsInstance(obs.track_id, str) + self.assertIsInstance(obs.class_id, str) + self.assertEqual(obs.reference_frame_id, "world_global") + + # --- Sequence Meta -------------------------------------------------------- + + def test_sequence_meta_file_exists(self): + """Verify sequence meta JSON file was written.""" + meta_files = list(self.seq_dir.glob("*.json")) + self.assertEqual(len(meta_files), 1) + + def test_sequence_id_matches_scene_name(self): + """Verify the sequence ID matches the scene name.""" + self.assertEqual(self.reader.sequence_id, self.scene_name) + + +if __name__ == "__main__": + unittest.main() diff --git a/tools/data_converter/nuscenes/lidar_model.py b/tools/data_converter/nuscenes/lidar_model.py new file mode 100644 index 00000000..962aabf0 --- /dev/null +++ b/tools/data_converter/nuscenes/lidar_model.py @@ -0,0 +1,739 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Modular lidar model utilities for structured spinning lidar processing. + +This module provides pure, independently testable functions for: +- Column alignment between measured lidar spins and a static model +- Per-column azimuth extraction from point clouds +- Frame timestamp computation from model column indices +- Motion decompensation of MC'd points +- Model parameter derivation from decompensated data +- Iterative frame alignment pipeline +- Multi-frame model optimization +- Model consistency metrics +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Literal, Optional + +import numpy as np + +from ncore.impl.common.transformations import MotionCompensator +from ncore.impl.data.types import RowOffsetStructuredSpinningLidarModelParameters + + +# --- Constants ----------------------------------------------------------------- + +HDL32E_N_BEAMS: int = 32 +HDL32E_N_TARGET_COLS: int = 1085 +HDL32E_SCAN_DURATION_US: int = 50_000 + + +# --- Internal helpers ---------------------------------------------------------- + + +def _grouped_median(values: np.ndarray, groups: np.ndarray, n_groups: int, min_count: int = 3) -> np.ndarray: + """Compute median of values grouped by integer group index (vectorized). + + Args: + values: Values to aggregate [N]. + groups: Group index per value [N], integers in [0, n_groups). + n_groups: Total number of groups. + min_count: Minimum values per group to produce a valid median. + + Returns: + Per-group medians [n_groups]. Groups with fewer than min_count values get 0. + """ + result = np.zeros(n_groups, dtype=np.float64) + sort_idx = np.argsort(groups) + sorted_groups = groups[sort_idx] + sorted_values = values[sort_idx] + # Find group boundaries using searchsorted + boundaries = np.searchsorted(sorted_groups, np.arange(n_groups + 1)) + for g in range(n_groups): + start, end = boundaries[g], boundaries[g + 1] + if end - start >= min_count: + result[g] = np.median(sorted_values[start:end]) + return result + + +# --- Data structures ----------------------------------------------------------- + + +@dataclass +class LidarColumnAlignment: + """Result of column alignment between a lidar spin and a static model.""" + + spin_column_range: range + static_column_range: range + mean_alignment_error_rad: float + + +@dataclass +class LidarFrameData: + """Processed lidar frame data ready for storage.""" + + xyz_decompensated: np.ndarray # [N, 3] decompensated points + intensity: np.ndarray # [N] normalized intensity + timestamps_us: np.ndarray # [N] uint64 per-point timestamps + model_element: np.ndarray # [N, 2] uint16 (model_row, model_col) + frame_start_us: int + frame_end_us: int + + +# --- Core functions ------------------------------------------------------------ + + +def compute_column_alignment( + spin_azimuths_rad: np.ndarray, + model_column_azimuths_rad: np.ndarray, + max_column_shift: int = 20, + resolution_factor: int = 1, +) -> LidarColumnAlignment: + """Align measured column azimuths to a static model via brute-force shift search. + + Tries integer column shifts in [-max_column_shift, +max_column_shift] and selects + the shift minimizing the mean angular difference. Uses arccos(cos(...)) for + wrap-around safety. + + When resolution_factor > 1, both arrays are upsampled by linear interpolation + before alignment, giving sub-column shift precision (e.g., factor=4 gives + quarter-column granularity). The returned ranges are in original resolution. + + Args: + spin_azimuths_rad: Per-column measured azimuths for the current frame [n_spin_cols]. + model_column_azimuths_rad: Static model column azimuths [n_model_cols]. + max_column_shift: Maximum shift in original columns to search. + resolution_factor: Upsample factor for sub-column precision (1 = native). + + Returns: + LidarColumnAlignment with optimal spin/static column ranges (in original resolution). + """ + # Upsample if requested + if resolution_factor > 1: + n_spin_orig = len(spin_azimuths_rad) + n_model_orig = len(model_column_azimuths_rad) + + # Upsample spin azimuths (interpolate, handling NaN gaps) + valid_spin = ~np.isnan(spin_azimuths_rad) + if valid_spin.all(): + spin_unwrapped = np.unwrap(spin_azimuths_rad) + else: + vi = np.where(valid_spin)[0] + spin_unwrapped = np.interp(np.arange(n_spin_orig), vi, np.unwrap(spin_azimuths_rad[valid_spin])) + + spin_up = np.interp( + np.linspace(0, n_spin_orig - 1, n_spin_orig * resolution_factor), + np.arange(n_spin_orig), + spin_unwrapped, + ) + spin_up = (spin_up + np.pi) % (2 * np.pi) - np.pi + + # Upsample model azimuths + model_unwrapped = np.unwrap(model_column_azimuths_rad.astype(np.float64)) + model_up = np.interp( + np.linspace(0, n_model_orig - 1, n_model_orig * resolution_factor), + np.arange(n_model_orig), + model_unwrapped, + ) + model_up = ((model_up + np.pi) % (2 * np.pi) - np.pi).astype(np.float32) + + # Search at upsampled resolution + max_shift_up = max_column_shift * resolution_factor + result_up = compute_column_alignment(spin_up, model_up, max_shift_up, resolution_factor=1) + + # Convert ranges back to original resolution (floor division for start, ceil for stop) + spin_start = result_up.spin_column_range.start // resolution_factor + spin_stop = (result_up.spin_column_range.stop + resolution_factor - 1) // resolution_factor + spin_stop = min(spin_stop, n_spin_orig) + static_start = result_up.static_column_range.start // resolution_factor + static_stop = static_start + (spin_stop - spin_start) + static_stop = min(static_stop, n_model_orig) + # Ensure equal lengths + length = min(spin_stop - spin_start, static_stop - static_start) + + return LidarColumnAlignment( + spin_column_range=range(spin_start, spin_start + length), + static_column_range=range(static_start, static_start + length), + mean_alignment_error_rad=result_up.mean_alignment_error_rad, + ) + + # Native resolution search + best_spin_range = range(0, 0) + best_static_range = range(0, 0) + best_mean_error: Optional[float] = None + + n_spin = len(spin_azimuths_rad) + n_model = len(model_column_azimuths_rad) + + for shift in range(-max_column_shift, max_column_shift + 1): + spin_start = max(-shift, 0) + static_start = max(shift, 0) + spin_stop = min(n_spin, n_model - static_start + spin_start) + static_stop = static_start + (spin_stop - spin_start) + + if spin_stop <= spin_start: + continue + + # cos-based angular difference (handles wrap-around) + abs_error_rad = np.arccos( + np.clip( + np.cos(spin_azimuths_rad[spin_start:spin_stop] - model_column_azimuths_rad[static_start:static_stop]), + -1.0, + 1.0, + ) + ) + + mean_err = float(abs_error_rad.mean()) + + if best_mean_error is None or mean_err < best_mean_error: + best_mean_error = mean_err + best_spin_range = range(spin_start, spin_stop) + best_static_range = range(static_start, static_stop) + + assert best_mean_error is not None + + return LidarColumnAlignment( + spin_column_range=best_spin_range, + static_column_range=best_static_range, + mean_alignment_error_rad=best_mean_error, + ) + + +def extract_column_azimuths( + xyz: np.ndarray, + col_idx: np.ndarray, + n_cols: int, + min_range_m: float = 20.0, + min_points_per_col: int = 3, +) -> np.ndarray: + """Extract per-column median azimuths from far-range points. + + Args: + xyz: Point cloud [N, 3]. + col_idx: Column index per point [N]. + n_cols: Total number of columns. + min_range_m: Minimum point range to include. + min_points_per_col: Minimum points needed for a valid column azimuth. + + Returns: + Per-column azimuths [n_cols], with NaN for columns without enough data. + """ + dist = np.linalg.norm(xyz, axis=1) + azimuth = np.arctan2(xyz[:, 1], xyz[:, 0]) + col_az = np.full(n_cols, np.nan, dtype=np.float64) + + valid = dist > min_range_m + valid_az = azimuth[valid] + valid_cols = col_idx[valid] + + # Vectorized per-column median using sorted groups + if len(valid_az) > 0: + sort_idx = np.argsort(valid_cols) + sorted_cols = valid_cols[sort_idx] + sorted_az = valid_az[sort_idx] + # Find group boundaries + col_changes = np.concatenate([[0], np.where(np.diff(sorted_cols))[0] + 1, [len(sorted_cols)]]) + for gi in range(len(col_changes) - 1): + start, end = col_changes[gi], col_changes[gi + 1] + if end - start >= min_points_per_col: + c = sorted_cols[start] + if c < n_cols: + col_az[c] = np.median(sorted_az[start:end]) + + return col_az + + +def compute_frame_timestamps( + model_col: np.ndarray, + n_model_cols: int, + frame_start_us: int, + frame_end_us: int, +) -> np.ndarray: + """Compute per-point timestamps from model column indices. + + Each column corresponds to a fixed fraction of the rotation. + Column k fires at: frame_start + k/n_model_cols * duration. + + Args: + model_col: Model column index per point [N], integer array. + n_model_cols: Total number of model columns. + frame_start_us: Frame start timestamp in microseconds. + frame_end_us: Frame end timestamp in microseconds. + + Returns: + Per-point timestamps [N] as uint64, clipped to [frame_start_us, frame_end_us]. + """ + fraction = model_col.astype(np.float64) / n_model_cols + duration_us = frame_end_us - frame_start_us + timestamps = frame_start_us + fraction * duration_us + timestamps = np.clip(timestamps, frame_start_us, frame_end_us) + return timestamps.astype(np.uint64) + + +def decompensate_frame( + xyz_mc: np.ndarray, + timestamps_us: np.ndarray, + frame_start_us: int, + frame_end_us: int, + motion_compensator: MotionCompensator, + sensor_id: str, +) -> np.ndarray: + """Decompensate MC'd points to raw sensor-at-measurement-time frame. + + Args: + xyz_mc: Motion-compensated points [N, 3] float32. + timestamps_us: Per-point timestamps [N] uint64. + frame_start_us: Frame start timestamp in microseconds. + frame_end_us: Frame end timestamp in microseconds. + motion_compensator: MotionCompensator instance with loaded poses. + sensor_id: Sensor identifier for pose lookup. + + Returns: + Decompensated points [N, 3] in the time-dependent sensor frame. + """ + return motion_compensator.motion_decompensate_points( + sensor_id=sensor_id, + xyz_sensorend=xyz_mc, + timestamp_us=timestamps_us, + frame_start_timestamp_us=frame_start_us, + frame_end_timestamp_us=frame_end_us, + ) + + +def derive_model_from_decompensated( + xyz_decompensated: np.ndarray, + n_beams_per_column: int, + n_target_cols: int, + spinning_direction: Literal["cw", "ccw"], + spinning_frequency_hz: float, + min_valid_distance_m: float = 0.5, +) -> Optional[RowOffsetStructuredSpinningLidarModelParameters]: + """Derive structured lidar model directly from decompensated point cloud. + + Uses the same approach as extracting parameters from raw sensor data: + - column_azimuths from a reference row's per-column azimuths + - row_azimuth_offsets from the center column (each row vs reference row) + - row_elevations from the center column + + Points below min_valid_distance_m are treated as "no return" sentinel values + (the HDL-32E stores ~0.1m vectors for missed returns) and excluded. + + Args: + xyz_decompensated: Decompensated (raw) point cloud [N, 3]. + n_beams_per_column: Beams per column (32 for HDL-32E). + n_target_cols: Expected column count. Returns None if different. + spinning_direction: "cw" or "ccw". + spinning_frequency_hz: Spinning frequency in Hz. + min_valid_distance_m: Minimum distance to consider a point as a valid return. + + Returns: + Model parameters, or None if frame doesn't match target column count. + """ + n_points = len(xyz_decompensated) + n_cols = n_points // n_beams_per_column + if n_cols != n_target_cols: + return None + + # Reshape into [n_cols, n_beams_per_column, 3] grid + xyz_grid = xyz_decompensated.reshape(n_cols, n_beams_per_column, 3) + + # Compute per-cell angles and distances from the grid + dist_grid = np.linalg.norm(xyz_grid, axis=2) + az_grid = np.arctan2(xyz_grid[:, :, 1], xyz_grid[:, :, 0]) + xy_range_grid = np.sqrt(xyz_grid[:, :, 0] ** 2 + xyz_grid[:, :, 1] ** 2) + el_grid = np.arctan2(xyz_grid[:, :, 2], xy_range_grid) + + # Valid mask: exclude "no return" sentinel points (stored as ~0.1m vectors) + valid_grid = dist_grid > min_valid_distance_m + + # Reference row: the one with the most valid returns across all columns + row_valid_count = valid_grid.sum(axis=0) + ref_row = int(np.argmax(row_valid_count)) + + # column_azimuths: reference row's per-column azimuths (monotonic after decompensation). + # For columns where the reference row has a sentinel, interpolate from valid neighbors. + ref_valid = valid_grid[:, ref_row] + if ref_valid.sum() < n_cols * 0.9: + # Not enough valid data in the reference row -- frame is unsuitable + return None + + col_az = az_grid[:, ref_row].astype(np.float64) + if not ref_valid.all(): + valid_indices = np.where(ref_valid)[0] + valid_az_unwrapped = np.unwrap(col_az[ref_valid]) + col_az = np.interp(np.arange(n_cols, dtype=np.float64), valid_indices, valid_az_unwrapped) + + column_azimuths_rad = col_az.astype(np.float32) + # Normalize wrap-around: force strictly decreasing for CW + column_azimuths_rad[column_azimuths_rad > column_azimuths_rad[0]] -= np.float32(2 * np.pi) + + # row_azimuth_offsets: each row's azimuth offset relative to reference row. + # Start with a small window around center column; progressively widen if a ring + # has no valid returns there (lower beams often only produce sentinels near center). + center_col = n_cols // 2 + row_azimuth_offsets = np.zeros(n_beams_per_column, dtype=np.float32) + + # Compute azimuth difference grid: az_grid - column_azimuths (broadcast) + az_diff_grid = np.arctan2( + np.sin(az_grid - column_azimuths_rad[:, np.newaxis]), + np.cos(az_grid - column_azimuths_rad[:, np.newaxis]), + ) # [n_cols, n_beams] + + # For each row, find valid diffs in progressively wider windows around center + for r in range(n_beams_per_column): + for half_width in [5, 50, n_cols // 2]: + window_start = max(0, center_col - half_width) + window_stop = min(n_cols, center_col + half_width + 1) + window_valid = valid_grid[window_start:window_stop, r] + if window_valid.any(): + row_azimuth_offsets[r] = np.median(az_diff_grid[window_start:window_stop, r][window_valid]) + break + + # row_elevations: median across all valid columns per ring (vectorized) + row_elevations = np.zeros(n_beams_per_column, dtype=np.float32) + for r in range(n_beams_per_column): + valid_cols_r = valid_grid[:, r] + if valid_cols_r.any(): + row_elevations[r] = np.median(el_grid[valid_cols_r, r]) + + # Reverse row order: model expects row 0 = highest elevation (ring n_beams-1) + row_azimuth_offsets = row_azimuth_offsets[::-1] + row_elevations = row_elevations[::-1] + + return RowOffsetStructuredSpinningLidarModelParameters( + spinning_frequency_hz=spinning_frequency_hz, + spinning_direction=spinning_direction, + n_rows=n_beams_per_column, + n_columns=n_cols, + row_elevations_rad=row_elevations, + column_azimuths_rad=column_azimuths_rad, + row_azimuth_offsets_rad=row_azimuth_offsets, + ) + + +def align_frame( + xyz_mc: np.ndarray, + ring_index: np.ndarray, + intensity: np.ndarray, + n_beams_per_column: int, + model_params: RowOffsetStructuredSpinningLidarModelParameters, + motion_compensator: MotionCompensator, + sensor_id: str, + frame_start_us: int, + frame_end_us: int, + n_iterations: int = 2, + min_valid_distance_m: float = 0.5, + alignment_resolution_factor: int = 1, +) -> Optional[LidarFrameData]: + """Align a single frame to the model and decompensate. + + Iteratively: + 1. Align columns (MC'd azimuths on first iter, decompensated on subsequent) + 2. Compute timestamps from alignment + 3. Decompensate + + Returns processed frame data ready for storage. + + Args: + xyz_mc: Motion-compensated point cloud [N, 3] float32. + ring_index: Beam ID per point [N], values 0..n_beams_per_column-1. + n_beams_per_column: Number of beams per firing column. + model_params: Static lidar model parameters. + motion_compensator: MotionCompensator instance with loaded poses. + sensor_id: Sensor identifier for pose lookup. + frame_start_us: Frame start timestamp in microseconds. + frame_end_us: Frame end timestamp in microseconds. + n_iterations: Number of align-decompensate iterations. + min_valid_distance_m: Minimum distance to consider a point valid. + + Returns: + LidarFrameData with filtered, aligned, and decompensated frame data. + """ + n_points = len(xyz_mc) + n_cols = n_points // n_beams_per_column + n_model_cols = model_params.n_columns + col_idx = np.arange(n_points, dtype=np.int64) // n_beams_per_column + + xyz_decomp_full: Optional[np.ndarray] = None + alignment: Optional[LidarColumnAlignment] = None + spin_range: Optional[range] = None + + for iteration in range(n_iterations): + if iteration == 0: + # Initial alignment from MC'd azimuths (approximate) + spin_col_azimuths = extract_column_azimuths(xyz_mc, col_idx, n_cols, min_range_m=20.0) + valid_az_mask = ~np.isnan(spin_col_azimuths) + if valid_az_mask.sum() < n_cols * 0.3: + spin_col_azimuths = extract_column_azimuths(xyz_mc, col_idx, n_cols, min_range_m=5.0) + valid_az_mask = ~np.isnan(spin_col_azimuths) + else: + # Refined alignment from decompensated azimuths (accurate). + # Only use columns within the overlap range -- boundary columns have + # incorrect decompensation due to clamped timestamps. + assert xyz_decomp_full is not None + assert spin_range is not None + spin_col_azimuths = extract_column_azimuths(xyz_decomp_full, col_idx, n_cols, min_range_m=0.5) + # Invalidate columns outside the previous iteration's overlap + spin_col_azimuths[: spin_range.start] = np.nan + spin_col_azimuths[spin_range.stop :] = np.nan + valid_az_mask = ~np.isnan(spin_col_azimuths) + + # Fill NaN gaps by interpolation + if valid_az_mask.any() and not valid_az_mask.all(): + valid_indices = np.where(valid_az_mask)[0] + valid_values = spin_col_azimuths[valid_az_mask] + valid_unwrapped = np.unwrap(valid_values) + all_unwrapped = np.interp(np.arange(n_cols), valid_indices, valid_unwrapped) + spin_col_azimuths = ((all_unwrapped + np.pi) % (2 * np.pi) - np.pi).astype(np.float64) + + alignment = compute_column_alignment( + spin_azimuths_rad=spin_col_azimuths, + model_column_azimuths_rad=model_params.column_azimuths_rad, + max_column_shift=20, + resolution_factor=alignment_resolution_factor, + ) + + # Compute timestamps from model column indices (only for overlap points) + spin_range = alignment.spin_column_range + model_col_full = (alignment.static_column_range.start + (col_idx - spin_range.start)).astype(np.int64) + + # For points outside the overlap, assign the nearest boundary timestamp. + # These points will be filtered before storage, but need valid timestamps + # for the full-frame decompensation used in the next alignment iteration. + model_col_full[col_idx < spin_range.start] = 0 + model_col_full[col_idx >= spin_range.stop] = n_model_cols - 1 + + point_timestamps_full = compute_frame_timestamps(model_col_full, n_model_cols, frame_start_us, frame_end_us) + + # Decompensate full frame (needed for refined alignment on next iteration) + xyz_decomp_full = decompensate_frame( + xyz_mc=xyz_mc, + timestamps_us=point_timestamps_full, + frame_start_us=frame_start_us, + frame_end_us=frame_end_us, + motion_compensator=motion_compensator, + sensor_id=sensor_id, + ) + + # --- Apply final alignment: keep only points with valid model element indices --- + assert alignment is not None + assert spin_range is not None + assert xyz_decomp_full is not None + + in_overlap = (col_idx >= spin_range.start) & (col_idx < spin_range.stop) + distance_mc = np.linalg.norm(xyz_mc, axis=1) + valid_mask = in_overlap & (distance_mc > min_valid_distance_m) + + # Model element indices + col_idx_filtered = col_idx[valid_mask] + ring_index_filtered = ring_index[valid_mask] + model_row = (n_beams_per_column - 1 - ring_index_filtered).astype(np.uint16) + model_col = (alignment.static_column_range.start + (col_idx_filtered - spin_range.start)).astype(np.uint16) + model_element = np.stack([model_row, model_col], axis=1) + + # Final timestamps from model column + timestamps_us = compute_frame_timestamps(model_col, n_model_cols, frame_start_us, frame_end_us) + + # Final decompensation of filtered points + xyz_decompensated = decompensate_frame( + xyz_mc=xyz_mc[valid_mask], + timestamps_us=timestamps_us, + frame_start_us=frame_start_us, + frame_end_us=frame_end_us, + motion_compensator=motion_compensator, + sensor_id=sensor_id, + ) + + return LidarFrameData( + xyz_decompensated=xyz_decompensated, + intensity=intensity[valid_mask], + timestamps_us=timestamps_us, + model_element=model_element, + frame_start_us=frame_start_us, + frame_end_us=frame_end_us, + ) + + +def optimize_model( + model_params: RowOffsetStructuredSpinningLidarModelParameters, + frame_azimuths: list[np.ndarray], + frame_model_cols: list[np.ndarray], + frame_model_rows: list[np.ndarray], + frame_distances: list[np.ndarray], + min_range_m: float = 10.0, + n_iterations: int = 1, +) -> RowOffsetStructuredSpinningLidarModelParameters: + """Optimize model parameters from multi-frame observations. + + Solves for column_azimuths and row_azimuth_offsets that minimize the + angular error across all frames, weighted by distance (far-range points + have less MC distortion). + + Each iteration: + 1. Compute residuals: actual_azimuth - (column_azimuths[col] + row_offsets[row]) + 2. Update column_azimuths: median residual per column across all frames + 3. Update row_offsets: median residual per row across all frames + + Parameters: + model_params: Initial model to refine. + frame_azimuths: Decompensated azimuth per point for each frame. + frame_model_cols: Model column index per point for each frame. + frame_model_rows: Model row index per point for each frame. + frame_distances: Distance per point for each frame (for weighting). + min_range_m: Minimum distance for points to include in optimization. + n_iterations: Number of alternating optimization iterations. + + Returns: + Optimized model parameters. + """ + n_columns = model_params.n_columns + n_rows = model_params.n_rows + + # Work in float64 for precision + column_azimuths = model_params.column_azimuths_rad.astype(np.float64) + row_offsets = model_params.row_azimuth_offsets_rad.astype(np.float64) + + # Concatenate all frames, filtering by distance + all_azimuths: list[np.ndarray] = [] + all_cols: list[np.ndarray] = [] + all_rows: list[np.ndarray] = [] + + for az, cols, rows, dists in zip(frame_azimuths, frame_model_cols, frame_model_rows, frame_distances): + far_mask = dists > min_range_m + all_azimuths.append(az[far_mask].astype(np.float64)) + all_cols.append(cols[far_mask].astype(np.int64)) + all_rows.append(rows[far_mask].astype(np.int64)) + + if not all_azimuths: + return model_params + + cat_azimuths = np.concatenate(all_azimuths) + cat_cols = np.concatenate(all_cols) + cat_rows = np.concatenate(all_rows) + + if len(cat_azimuths) == 0: + return model_params + + for _ in range(n_iterations): + # Compute residual = actual_az - (column_azimuths[col] + row_offsets[row]) + predicted = column_azimuths[cat_cols] + row_offsets[cat_rows] + residual = cat_azimuths - predicted + # Wrap residual to [-pi, pi] + residual = np.arctan2(np.sin(residual), np.cos(residual)) + + # Per-column correction: median of residuals grouped by column (vectorized) + col_correction = _grouped_median(residual, cat_cols, n_columns, min_count=3) + column_azimuths += col_correction + + # Recompute residual after column correction + predicted = column_azimuths[cat_cols] + row_offsets[cat_rows] + residual = cat_azimuths - predicted + residual = np.arctan2(np.sin(residual), np.cos(residual)) + + # Per-row correction: median of residuals grouped by row (vectorized) + row_correction = _grouped_median(residual, cat_rows, n_rows, min_count=3) + row_offsets += row_correction + + # Monotonicity enforcement on column_azimuths (wrap fix for CW spinning). + # Unwrap then re-normalize so azimuths are strictly decreasing. + column_azimuths_unwrapped = np.unwrap(column_azimuths) + # Normalize to (-pi, pi] + column_azimuths_norm = ((column_azimuths_unwrapped + np.pi) % (2 * np.pi)) - np.pi + # Force strictly decreasing for CW: values above first element get wrapped down + column_azimuths_norm[column_azimuths_norm > column_azimuths_norm[0]] -= 2 * np.pi + + return RowOffsetStructuredSpinningLidarModelParameters( + spinning_frequency_hz=model_params.spinning_frequency_hz, + spinning_direction=model_params.spinning_direction, + n_rows=n_rows, + n_columns=n_columns, + row_elevations_rad=model_params.row_elevations_rad, + column_azimuths_rad=column_azimuths_norm.astype(np.float32), + row_azimuth_offsets_rad=row_offsets.astype(np.float32), + ) + + +def compute_model_consistency( + directions: np.ndarray, + model_element: np.ndarray, + distances: np.ndarray, + model_params: RowOffsetStructuredSpinningLidarModelParameters, + far_range_m: float = 20.0, +) -> tuple[float, float, float]: + """Compute model consistency metrics. + + Compares stored direction vectors against model-predicted directions to + quantify alignment quality. + + Args: + directions: Stored direction unit vectors [N, 3] float32. + model_element: Model element indices [N, 2] uint16 as (row, col). + distances: Per-point distances [N] float32. + model_params: Lidar model parameters. + far_range_m: Distance threshold for far-range metric. + + Returns: + (mean_err_all_deg, mean_err_far_deg, mean_az_shift_deg): + - mean_err_all_deg: Mean angular error across all valid points (degrees). + - mean_err_far_deg: Mean angular error for far-range points (degrees). + - mean_az_shift_deg: Mean systematic azimuth shift for far-range points (degrees). + """ + model_row = model_element[:, 0].astype(np.int64) + model_col = model_element[:, 1].astype(np.int64) + + # Predicted azimuth and elevation from model + model_az = model_params.column_azimuths_rad[model_col].astype(np.float64) + model_params.row_azimuth_offsets_rad[ + model_row + ].astype(np.float64) + model_el = model_params.row_elevations_rad[model_row].astype(np.float64) + + # Predicted direction vectors + cos_el = np.cos(model_el) + model_dir = np.stack([cos_el * np.cos(model_az), cos_el * np.sin(model_az), np.sin(model_el)], axis=1).astype( + np.float32 + ) + + # Only compute for points with nonzero distance (valid returns) + nonzero_mask = distances > 0 + if not nonzero_mask.any(): + return (0.0, 0.0, 0.0) + + cos_angle = np.clip(np.sum(directions[nonzero_mask] * model_dir[nonzero_mask], axis=1), -1.0, 1.0) + ang_err_deg = np.degrees(np.arccos(cos_angle)) + + mean_err_all_deg = float(ang_err_deg.mean()) + + # Far-range metrics + far_mask = distances[nonzero_mask] > far_range_m + if far_mask.any(): + mean_err_far_deg = float(ang_err_deg[far_mask].mean()) + + # Systematic azimuth shift (signed) + actual_az = np.arctan2( + directions[nonzero_mask][far_mask, 1], + directions[nonzero_mask][far_mask, 0], + ) + model_az_far = model_az[nonzero_mask][far_mask] + az_shift = np.arctan2(np.sin(actual_az - model_az_far), np.cos(actual_az - model_az_far)) + mean_az_shift_deg = float(np.degrees(az_shift.mean())) + else: + mean_err_far_deg = mean_err_all_deg + mean_az_shift_deg = 0.0 + + return (mean_err_all_deg, mean_err_far_deg, mean_az_shift_deg) diff --git a/tools/data_converter/nuscenes/main.py b/tools/data_converter/nuscenes/main.py new file mode 100644 index 00000000..b2d4baae --- /dev/null +++ b/tools/data_converter/nuscenes/main.py @@ -0,0 +1,23 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""nuScenes converter CLI entry point.""" + +from tools.data_converter.cli import cli +from tools.data_converter.nuscenes.converter import nuscenes # noqa: F401 -- registers CLI command + + +if __name__ == "__main__": + cli(show_default=True) diff --git a/tools/data_converter/nuscenes/utils.py b/tools/data_converter/nuscenes/utils.py new file mode 100644 index 00000000..ed282604 --- /dev/null +++ b/tools/data_converter/nuscenes/utils.py @@ -0,0 +1,618 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""nuScenes-specific utilities for the NCore V4 converter.""" + +from __future__ import annotations + +from dataclasses import dataclass +from functools import cache +from typing import Any, Dict, List, Literal, Optional + +import numpy as np + +from nuscenes.nuscenes import NuScenes +from nuscenes.utils.data_classes import Box +from pyquaternion import Quaternion + +from ncore.impl.data.types import RowOffsetStructuredSpinningLidarModelParameters + + +# --- Sensor ID mappings -------------------------------------------------------- +# Mapping from NCore sensor ID -> nuScenes channel name + +CAMERA_MAP: Dict[str, str] = { + "camera_front": "CAM_FRONT", + "camera_front_left": "CAM_FRONT_LEFT", + "camera_front_right": "CAM_FRONT_RIGHT", + "camera_back": "CAM_BACK", + "camera_back_left": "CAM_BACK_LEFT", + "camera_back_right": "CAM_BACK_RIGHT", +} + +LIDAR_ID = "lidar_top" +LIDAR_CHANNEL = "LIDAR_TOP" + +RADAR_MAP: Dict[str, str] = { + "radar_front": "RADAR_FRONT", + "radar_front_left": "RADAR_FRONT_LEFT", + "radar_front_right": "RADAR_FRONT_RIGHT", + "radar_back_left": "RADAR_BACK_LEFT", + "radar_back_right": "RADAR_BACK_RIGHT", +} + +# nuScenes category name -> NCore class_id mapping +NUSCENES_CATEGORY_MAP: Dict[str, str] = { + "vehicle.car": "car", + "vehicle.truck": "truck", + "vehicle.bus.bendy": "bus", + "vehicle.bus.rigid": "bus", + "vehicle.construction": "construction_vehicle", + "vehicle.motorcycle": "motorcycle", + "vehicle.bicycle": "bicycle", + "vehicle.trailer": "trailer", + "vehicle.emergency.ambulance": "emergency_vehicle", + "vehicle.emergency.police": "emergency_vehicle", + "human.pedestrian.adult": "pedestrian", + "human.pedestrian.child": "pedestrian", + "human.pedestrian.construction_worker": "pedestrian", + "human.pedestrian.police_officer": "pedestrian", + "movable_object.barrier": "barrier", + "movable_object.trafficcone": "traffic_cone", +} + +# HDL-32E constants +HDL32E_N_BEAMS: int = 32 +HDL32E_N_TARGET_COLS: int = 1085 # nominal: 50000us / 46.08us per column cycle = 1085.07 +HDL32E_SCAN_DURATION_US: int = 50_000 # fallback for single-frame edge cases + + +# --- nuScenes DB helpers ------------------------------------------------------- + + +@cache +def get_nuscenes(version: str, dataroot: str) -> NuScenes: + """Cached nuScenes DB loader to avoid reloading for multiple scenes.""" + return NuScenes(version=version, dataroot=dataroot, verbose=False) + + +def get_sweep_tokens(nusc: NuScenes, scene_record: Dict[str, Any], channel: str) -> List[str]: + """Return ordered list of sample_data tokens for all sweeps in a scene for a given channel. + + This includes both keyframe and non-keyframe (interleaved) sweeps. + """ + result: List[str] = [] + sample_token = scene_record["first_sample_token"] + sample_record = nusc.get("sample", sample_token) + sweep_token = sample_record["data"][channel] + + while sweep_token: + result.append(sweep_token) + sample_data_record = nusc.get("sample_data", sweep_token) + sweep_token = sample_data_record["next"] + + return result + + +def get_sample_records(nusc: NuScenes, scene_record: Dict[str, Any]) -> List[Dict[str, Any]]: + """Return ordered list of keyframe sample records for a scene.""" + result: List[Dict[str, Any]] = [] + sample_token = scene_record["first_sample_token"] + + while sample_token: + sample_record = nusc.get("sample", sample_token) + result.append(sample_record) + sample_token = sample_record["next"] + + return result + + +def resolve_scene_token(nusc: NuScenes, scene_token: Optional[str], scene_name: Optional[str]) -> Optional[str]: + """Resolve a scene identifier to its token. + + If scene_token is provided, validate it exists and return it. + If scene_name is provided, look it up and return its token. + If neither provided, return None (meaning: convert all scenes). + """ + if scene_token is not None and scene_name is not None: + raise ValueError("Specify at most one of --scene-token or --scene-name, not both.") + + if scene_token is not None: + all_tokens = {s["token"] for s in nusc.scene} + if scene_token not in all_tokens: + raise ValueError( + f"Scene token '{scene_token}' not found in dataset. Available: {sorted(all_tokens)[:5]}..." + ) + return scene_token + + if scene_name is not None: + name_to_token = {s["name"]: s["token"] for s in nusc.scene} + if scene_name not in name_to_token: + raise ValueError(f"Scene name '{scene_name}' not found. Available: {sorted(name_to_token.keys())[:5]}...") + return name_to_token[scene_name] + + return None + + +# --- Structured lidar model utilities ------------------------------------------ + + +@dataclass +class LidarColumnAlignment: + """Result of column alignment between a lidar spin and a static model.""" + + spin_column_range: range # columns to use from the current frame + static_column_range: range # corresponding columns in the model + mean_alignment_error_rad: float + + +def compute_lidar_column_alignment( + spin_azimuths_rad: np.ndarray, + model_column_azimuths_rad: np.ndarray, + max_column_shift: int = 20, +) -> LidarColumnAlignment: + """Align measured column azimuths to a static model via brute-force shift search. + + Tries integer column shifts in [-max_column_shift, +max_column_shift] and selects + the shift minimizing the mean angular difference. Uses arccos(cos(...)) for + wrap-around safety. + + This is a generic utility usable for any spinning lidar where column count + varies between frames. + + Args: + spin_azimuths_rad: Per-column measured azimuths for the current frame [n_spin_cols]. + model_column_azimuths_rad: Static model column azimuths [n_model_cols]. + max_column_shift: Maximum integer shift to search (positive and negative). + + Returns: + LidarColumnAlignment with optimal spin/static column ranges and error metrics. + """ + best_spin_range = range(0, 0) + best_static_range = range(0, 0) + best_mean_error: Optional[float] = None + + n_spin = len(spin_azimuths_rad) + n_model = len(model_column_azimuths_rad) + + for shift in range(-max_column_shift, max_column_shift + 1): + spin_start = max(-shift, 0) + static_start = max(shift, 0) + spin_stop = min(n_spin, n_model - static_start + spin_start) + static_stop = static_start + (spin_stop - spin_start) + + if spin_stop <= spin_start: + continue + + # cos-based angular difference (handles wrap-around) + abs_error_rad = np.arccos( + np.clip( + np.cos(spin_azimuths_rad[spin_start:spin_stop] - model_column_azimuths_rad[static_start:static_stop]), + -1.0, + 1.0, + ) + ) + + mean_err = float(abs_error_rad.mean()) + + if best_mean_error is None or mean_err < best_mean_error: + best_mean_error = mean_err + best_spin_range = range(spin_start, spin_stop) + best_static_range = range(static_start, static_stop) + + assert best_mean_error is not None + + return LidarColumnAlignment( + spin_column_range=best_spin_range, + static_column_range=best_static_range, + mean_alignment_error_rad=best_mean_error, + ) + + +def derive_lidar_model_from_frame( + xyz_mc: np.ndarray, + ring_index: np.ndarray, + n_beams: int, + n_target_cols: int, + spinning_direction: Literal["cw", "ccw"], + spinning_frequency_hz: float, + min_range_m: float = 20.0, + fallback_min_range_m: float = 5.0, + xyz_decompensated: Optional[np.ndarray] = None, +) -> Optional[RowOffsetStructuredSpinningLidarModelParameters]: + """Derive structured lidar model parameters from a single frame. + + If xyz_decompensated is provided, azimuths and elevations are extracted from the + decompensated (raw) point cloud, which gives ~4x better accuracy than using MC'd + data directly (0.08 deg vs 0.33 deg per-column noise). The MC'd data is still used + for range filtering (distance computation). + + Args: + xyz_mc: Motion-compensated point cloud [N, 3] float32. + ring_index: Beam ID per point [N], values 0..n_beams-1. + n_beams: Number of beams (32 for HDL-32E). + n_target_cols: Expected number of columns. Frame is rejected if column count differs. + spinning_direction: "cw" or "ccw". + spinning_frequency_hz: Nominal spinning frequency. + min_range_m: Minimum range for "good" points (default 20m). + fallback_min_range_m: If <50% columns covered at min_range_m, retry at this range. + xyz_decompensated: If provided, decompensated point cloud [N, 3] used for + azimuth/elevation extraction (much more accurate than MC'd data). + + Returns: + Model parameters, or None if frame doesn't meet quality criteria. + """ + n_points = len(xyz_mc) + n_cols = n_points // n_beams + if n_cols != n_target_cols: + return None + + # Use decompensated data for azimuth/elevation if available (4x more accurate); + # fall back to MC'd data. Distance filtering always uses MC'd data (range is preserved). + xyz_for_angles = xyz_decompensated if xyz_decompensated is not None else xyz_mc + + col_idx = np.arange(n_points) // n_beams + dist = np.linalg.norm(xyz_mc, axis=1) + azimuth = np.arctan2(xyz_for_angles[:, 1], xyz_for_angles[:, 0]) + elevation_xy_range = np.sqrt(xyz_for_angles[:, 0] ** 2 + xyz_for_angles[:, 1] ** 2) + elevation = np.arctan2(xyz_for_angles[:, 2], elevation_xy_range) + + # Try to extract per-column azimuths at min_range_m; fall back if insufficient coverage + effective_min_range = min_range_m + for attempt_range in [min_range_m, fallback_min_range_m]: + col_az = np.full(n_cols, np.nan, dtype=np.float64) + for c in range(n_cols): + mask = (col_idx == c) & (dist > attempt_range) + if mask.sum() >= 3: + col_az[c] = np.median(azimuth[mask]) + + coverage = np.sum(~np.isnan(col_az)) / n_cols + if coverage >= 0.5: + effective_min_range = attempt_range + break + else: + # Even fallback range doesn't give enough coverage + return None + + # --- Column azimuths and per-row offsets --- + col_idx = np.arange(n_points) // n_beams + az_grid = azimuth.reshape(n_cols, n_beams) + dist_grid = dist.reshape(n_cols, n_beams) + + # Pick reference ring with best far-range coverage + ring_coverage = np.array([np.sum(dist_grid[:, r] > effective_min_range) for r in range(n_beams)]) + ref_ring = int(np.argmax(ring_coverage)) + + # Determine starting azimuth from far-range data at mid-scan (robust to boundary noise) + # Determine the reference ring's azimuth intercept via least-squares fit with + # fixed step (-2*pi/n_cols). Using a single mid-scan anchor point is biased by + # MC distortion; fitting across all far-range columns averages it out. + col_az_ref = np.full(n_cols, np.nan, dtype=np.float64) + for c in range(n_cols): + if dist_grid[c, ref_ring] > effective_min_range: + col_az_ref[c] = az_grid[c, ref_ring] + + valid_ref = ~np.isnan(col_az_ref) + if valid_ref.sum() < 10: + return None + + valid_cols = np.where(valid_ref)[0].astype(np.float64) + valid_az_unwrapped = np.unwrap(col_az_ref[valid_ref]) + + step_rad = -2.0 * np.pi / n_cols + # Fit intercept only (step is fixed from physics): intercept = mean(az - step * col) + intercept = float(np.mean(valid_az_unwrapped - step_rad * valid_cols)) + + # Column azimuths: exactly one full rotation (2*pi) over n_cols columns (CW). + col_indices = np.arange(n_cols, dtype=np.float64) + column_azimuths_f64 = intercept + step_rad * col_indices + # Normalize to (-pi, pi] + column_azimuths_f64 = ((column_azimuths_f64 + np.pi) % (2 * np.pi)) - np.pi + column_azimuths_rad = column_azimuths_f64.astype(np.float32) + # Force strictly decreasing through the wrap-around point + column_azimuths_rad[column_azimuths_rad > column_azimuths_rad[0]] -= np.float32(2 * np.pi) + + # --- Per-row azimuth offsets --- + # The HDL-32E fires beams sequentially within each column, causing each beam to + # fire at a slightly different azimuth (up to ~0.7 deg for edge beams). + # We compute offsets from far-range points (>20m preferred) across all columns. + # Far-range is preferred because MC translational distortion has minimal angular + # effect at long range, giving more accurate offset estimates. + offset_min_range = max(min_range_m, 20.0) + row_azimuth_offsets = np.zeros(n_beams, dtype=np.float32) + + for r in range(n_beams): + diffs = [] + for c in range(n_cols): + if dist_grid[c, r] > offset_min_range: + measured = az_grid[c, r] + base = column_azimuths_rad[c] + diff = np.arctan2(np.sin(measured - base), np.cos(measured - base)) + diffs.append(diff) + # Fall back to effective_min_range if not enough far-range points + if len(diffs) < 10: + diffs = [] + for c in range(n_cols): + if dist_grid[c, r] > effective_min_range: + measured = az_grid[c, r] + base = column_azimuths_rad[c] + diff = np.arctan2(np.sin(measured - base), np.cos(measured - base)) + diffs.append(diff) + if len(diffs) >= 10: + row_azimuth_offsets[r] = np.median(diffs) + + # Subtract reference ring's offset (column_azimuths represents that ring) + row_azimuth_offsets -= row_azimuth_offsets[ref_ring] + # Reverse to match model row order (row 0 = ring n_beams-1 = highest elevation) + row_azimuth_offsets = row_azimuth_offsets[::-1] + + # --- Per-ring elevation --- + row_elevations = np.zeros(n_beams, dtype=np.float32) + for r in range(n_beams): + ring_mask = (ring_index == r) & (dist > effective_min_range) + if ring_mask.any(): + row_elevations[r] = np.median(elevation[ring_mask]) + else: + ring_mask_all = ring_index == r + if ring_mask_all.any(): + row_elevations[r] = np.median(elevation[ring_mask_all]) + + # Reverse elevation order: model expects row 0 = highest elevation (ring n_beams-1) + row_elevations = row_elevations[::-1] + + return RowOffsetStructuredSpinningLidarModelParameters( + spinning_frequency_hz=spinning_frequency_hz, + spinning_direction=spinning_direction, + n_rows=n_beams, + n_columns=n_cols, + row_elevations_rad=row_elevations, + column_azimuths_rad=column_azimuths_rad, + row_azimuth_offsets_rad=row_azimuth_offsets, + ) + + +def derive_lidar_model_simple( + xyz_decompensated: np.ndarray, + n_beams_per_column: int, + n_target_cols: int, + spinning_direction: Literal["cw", "ccw"], + spinning_frequency_hz: float, + min_valid_distance_m: float = 0.5, +) -> Optional[RowOffsetStructuredSpinningLidarModelParameters]: + """Derive structured lidar model directly from decompensated point cloud. + + Uses the same approach as extracting parameters from raw sensor data: + - column_azimuths from a reference row's per-column azimuths + - row_azimuth_offsets from the center column (each row vs reference row) + - row_elevations from the center column + + Points below min_valid_distance_m are treated as "no return" sentinel values + (the HDL-32E stores ~0.1m vectors for missed returns) and excluded. + + Args: + xyz_decompensated: Decompensated (raw) point cloud [N, 3]. + n_beams_per_column: Beams per column (32 for HDL-32E). + n_target_cols: Expected column count. Returns None if different. + spinning_direction: "cw" or "ccw". + spinning_frequency_hz: Spinning frequency in Hz. + min_valid_distance_m: Minimum distance to consider a point as a valid return. + + Returns: + Model parameters, or None if frame doesn't match target column count. + """ + n_points = len(xyz_decompensated) + n_cols = n_points // n_beams_per_column + if n_cols != n_target_cols: + return None + + # Reshape into [n_cols, n_beams_per_column, 3] grid + xyz_grid = xyz_decompensated.reshape(n_cols, n_beams_per_column, 3) + + # Compute per-cell angles and distances from the grid + dist_grid = np.linalg.norm(xyz_grid, axis=2) + az_grid = np.arctan2(xyz_grid[:, :, 1], xyz_grid[:, :, 0]) + xy_range_grid = np.sqrt(xyz_grid[:, :, 0] ** 2 + xyz_grid[:, :, 1] ** 2) + el_grid = np.arctan2(xyz_grid[:, :, 2], xy_range_grid) + + # Valid mask: exclude "no return" sentinel points (stored as ~0.1m vectors) + valid_grid = dist_grid > min_valid_distance_m + + # Reference row: the one with the most valid returns across all columns + row_valid_count = valid_grid.sum(axis=0) + ref_row = int(np.argmax(row_valid_count)) + + # column_azimuths: reference row's per-column azimuths (monotonic after decompensation). + # For columns where the reference row has a sentinel, interpolate from valid neighbors. + ref_valid = valid_grid[:, ref_row] + if ref_valid.sum() < n_cols * 0.9: + # Not enough valid data in the reference row -- frame is unsuitable + return None + + col_az = az_grid[:, ref_row].astype(np.float64) + if not ref_valid.all(): + valid_indices = np.where(ref_valid)[0] + valid_az_unwrapped = np.unwrap(col_az[ref_valid]) + col_az = np.interp(np.arange(n_cols, dtype=np.float64), valid_indices, valid_az_unwrapped) + + column_azimuths_rad = col_az.astype(np.float32) + # Normalize wrap-around: force strictly decreasing for CW + column_azimuths_rad[column_azimuths_rad > column_azimuths_rad[0]] -= np.float32(2 * np.pi) + + # row_azimuth_offsets: each row's azimuth offset relative to reference row. + # Start with a small window around center column; progressively widen if a ring + # has no valid returns there (lower beams often only produce sentinels near center). + center_col = n_cols // 2 + row_azimuth_offsets = np.zeros(n_beams_per_column, dtype=np.float32) + for r in range(n_beams_per_column): + valid_diffs = [] + for half_width in [5, 50, n_cols // 2]: + window_start = max(0, center_col - half_width) + window_stop = min(n_cols, center_col + half_width + 1) + for c in range(window_start, window_stop): + if valid_grid[c, r]: + base = column_azimuths_rad[c] + diff = np.arctan2(np.sin(az_grid[c, r] - base), np.cos(az_grid[c, r] - base)) + valid_diffs.append(diff) + if valid_diffs: + break + if valid_diffs: + row_azimuth_offsets[r] = np.median(valid_diffs) + + # row_elevations: median across all valid columns per ring (robust to occasional sentinels) + row_elevations = np.zeros(n_beams_per_column, dtype=np.float32) + for r in range(n_beams_per_column): + valid_cols_r = valid_grid[:, r] + if valid_cols_r.any(): + row_elevations[r] = np.median(el_grid[valid_cols_r, r]) + + # Reverse row order: model expects row 0 = highest elevation (ring n_beams-1) + row_azimuth_offsets = row_azimuth_offsets[::-1] + row_elevations = row_elevations[::-1] + + return RowOffsetStructuredSpinningLidarModelParameters( + spinning_frequency_hz=spinning_frequency_hz, + spinning_direction=spinning_direction, + n_rows=n_beams_per_column, + n_columns=n_cols, + row_elevations_rad=row_elevations, + column_azimuths_rad=column_azimuths_rad, + row_azimuth_offsets_rad=row_azimuth_offsets, + ) + + +def extract_column_azimuths( + xyz: np.ndarray, + col_idx: np.ndarray, + n_cols: int, + min_range_m: float = 20.0, + min_points_per_col: int = 3, +) -> np.ndarray: + """Extract per-column median azimuths from far-range points. + + Args: + xyz: Point cloud [N, 3]. + col_idx: Column index per point [N]. + n_cols: Total number of columns. + min_range_m: Minimum point range to include. + min_points_per_col: Minimum points needed for a valid column azimuth. + + Returns: + Per-column azimuths [n_cols], with NaN for columns without enough data. + """ + dist = np.linalg.norm(xyz, axis=1) + azimuth = np.arctan2(xyz[:, 1], xyz[:, 0]) + col_az = np.full(n_cols, np.nan, dtype=np.float64) + + for c in range(n_cols): + mask = (col_idx == c) & (dist > min_range_m) + if mask.sum() >= min_points_per_col: + col_az[c] = np.median(azimuth[mask]) + + return col_az + + +# --- Cuboid / annotation helpers ----------------------------------------------- + + +def get_boxes_for_sample_data(nusc: NuScenes, sample_data_token: str) -> List[Box]: + """Get annotation boxes for a sample_data record. + + If the sample_data is a keyframe, returns the annotations for that sample directly. + If it is an intermediate sweep, interpolates box positions linearly between + the bracketing keyframes. + + Each returned Box has: + - .center: [x, y, z] in the global frame + - .wlh: [width, length, height] + - .orientation: Quaternion + - .velocity: [vx, vy, vz] (may contain NaN) + - .name: category name + - .token: instance_token (used as track_id) + + Returns: + List of Box objects in the global (world) coordinate frame. + """ + sd_record = nusc.get("sample_data", sample_data_token) + curr_sample_record = nusc.get("sample", sd_record["sample_token"]) + + if curr_sample_record["prev"] == "" or sd_record["is_key_frame"]: + # Keyframe or first sample: return annotations directly + boxes = [] + for ann_token in curr_sample_record["anns"]: + record = nusc.get("sample_annotation", ann_token) + velocity = nusc.box_velocity(record["token"]) + box = Box( + record["translation"], + record["size"], + Quaternion(record["rotation"]), + velocity=tuple(velocity), + name=record["category_name"], + token=record["instance_token"], + ) + boxes.append(box) + return boxes + + # Non-keyframe: interpolate between previous and current keyframe annotations + prev_sample_record = nusc.get("sample", curr_sample_record["prev"]) + + curr_ann_recs = [nusc.get("sample_annotation", token) for token in curr_sample_record["anns"]] + prev_ann_recs = [nusc.get("sample_annotation", token) for token in prev_sample_record["anns"]] + + # Map instance tokens to previous annotation records + prev_inst_map = {entry["instance_token"]: entry for entry in prev_ann_recs} + + t0 = prev_sample_record["timestamp"] + t1 = curr_sample_record["timestamp"] + t = sd_record["timestamp"] + + # Clamp t to [t0, t1] for safety + t = max(t0, min(t1, t)) + + boxes: List[Box] = [] + for curr_ann_rec in curr_ann_recs: + instance_token = curr_ann_rec["instance_token"] + + if instance_token in prev_inst_map: + prev_ann_rec = prev_inst_map[instance_token] + + # Interpolate center + center = [ + np.interp(t, [t0, t1], [c0, c1]) + for c0, c1 in zip(prev_ann_rec["translation"], curr_ann_rec["translation"]) + ] + + # Interpolate orientation via SLERP + rotation = Quaternion.slerp( + q0=Quaternion(prev_ann_rec["rotation"]), + q1=Quaternion(curr_ann_rec["rotation"]), + amount=(t - t0) / (t1 - t0), + ) + else: + # New instance -- use current annotation directly + center = curr_ann_rec["translation"] + rotation = Quaternion(curr_ann_rec["rotation"]) + + velocity = nusc.box_velocity(curr_ann_rec["token"]) + box = Box( + center, + curr_ann_rec["size"], + rotation, + velocity=tuple(velocity), + name=curr_ann_rec["category_name"], + token=instance_token, + ) + boxes.append(box) + + return boxes