Github Actions status:
Coverage status:
Semi-analytical methods for plates, shells and stiffened panels
- Linear and non-linear static analyses, with field outputs of displacements, strains and stresses
- Linear buckling
- Vibration, with or without pre-stress
- Panel flutter using the piston theory
- Geometrically non-linear static analyses (postbuckling) using the Newton-Raphson method or the arc-length methods of Riks and Crisfield
- Dead or follower (hydrostatic) pressure loads, with the unsymmetric load stiffness of the follower pressure
- Multi-domain assemblies of plates, cylindrical shells, cylinders, stiffened panels, with the domains connected exactly with the null-space method, the default, or by penalty stiffnesses. Debonding defects or cohesive zone can be simulated
- CLPT, FSDT and TSDT kinematics for plates and cylindrical shells
- Donnell and Sanders-Koiter kinematics for cylindrical shells
The structural matrices are solved with structsolve.
Citing this library
Saullo G. P. Castro, Nathan D'Souza. (2026). Semi-analytical methods for plates, shells and stiffened panels (Version 0.11.1). Zenodo. DOI: https://doi.org/10.5281/zenodo.2541522.
Documentation
The documentation is available on: https://saullocastro.github.io/panels.
Installation
To get the latest version:
python -m pip install panels
Running in the browser with Pyodide
A WebAssembly wheel is published on PyPI for Pyodide
314 (CPython 3.14), such that panels runs in the browser, e.g. in
JupyterLite or in a web page with Pyodide. NumPy, SciPy and matplotlib come
with Pyodide, and micropip installs composites and structsolve from PyPI:
import micropip
await micropip.install("panels")
import io
from structsolve import lb
from panels.shell import Shell, load
s = Shell(a=0.6, b=0.4, stack=[0, 45, -45, 90], plyt=0.125e-3,
laminaprop=(142.5e9, 8.7e9, 0.28, 5.1e9, 5.1e9, 3.0e9), m=10, n=10)
s.Nxx = -1.
eigvals, eigvecs = lb(s.calc_kC(), s.calc_kG(), silent=True)
print('critical load: Nxx = %1.2f N/m' % -eigvals[0])
s.results['eigvals'] = eigvals
s.results['eigvecs'] = eigvecs
# saving to memory, since a web page has no file system
buf = io.BytesIO()
s.save(buf)
data = buf.getvalue()
# offering the file for download
from js import Blob, Object, URL, document
from pyodide.ffi import to_js
blob = Blob.new(to_js([data]), to_js({'type': 'application/zip'},
dict_converter=Object.fromEntries))
link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = 'plate.shell.zip'
link.click()
# loading the bytes back, e.g. from a file uploaded by the user
s2 = load(io.BytesIO(data))
In Pyodide the field outputs run serially, without OpenMP.
Saving and loading
Shell, StiffPanelBay and MultiDomain are saved with save() to a zip
file with the inputs in JSON and the arrays, such as the results, in NumPy's
.npy format, see panels.json_io. The files are independent of the Python
version, readable outside Python and safe to load from untrusted sources,
unlike pickle:
from panels.shell import load
s.name = 'plate'
s.save() # writes plate.shell.zip
s2 = load('plate')
The pickle files saved by older versions are no longer loaded, since a pickle
file can execute arbitrary code; one from a trusted source can be converted
by loading it with pickle.load() and saving the object again.
History
See CHANGELOG.md for the details of each version.
- version 0.11.1 (2026-10-08)
- Saving and loading in a zip file with JSON and NumPy arrays, replacing pickle:
Shell.save(),StiffPanelBay.save(),MultiDomain.save(), also toio.BytesIO, andpanels.json_io - Pyodide support:
await micropip.install("panels")in the browser, and the whole test suite runs in Pyodide in GitHub Actions - Requires
composites>=0.9.21andstructsolve>=0.6.1
- Saving and loading in a zip file with JSON and NumPy arrays, replacing pickle:
- version 0.11.0 (2026-10-07)
- Follower (hydrostatic) pressure loads,
Shell.add_pressure_load(..., follower=True), with the unsymmetric load stiffnesskCfollowerinShellandMultiDomain - Theory documentation, verification tests and validation notebooks of the follower pressure
- Interactive 3D plots of multi-domain assemblies with plotly,
MultiDomain.plot3d() - Improved Cython and compiler flags
- TSDT uses
Laminate.DtsandLaminate.Fts, requirescomposites>=0.9.12andstructsolve>=0.5.0
- Follower (hydrostatic) pressure loads,
- version 0.9.0 (2026-09-24)
- Null-space connection, exact, new default, as alternative to penalty-based connection
- version 0.8.0 (2026-09-23)
- FSDT and TSDT for plate and cylindrical shells
- Sanders-Koiter for cylindrical shells
- Shell and Multidomain connections supporting FSDT, TSDT and Sanders-Koiter kinematics
- Many improvements in the documentation
- New tests based on literature
- BUG fixes on aerodynamic matrix of cylindrical shells and mass matrix of stiffener 1D
- version 0.7.1 (2026-09-21)
- Fixed the cohesive zone of the
MultiDomainconnection'SB_TSL', which could not capture the onset of failure of the DCB: tangential separation with the rotation of each panel, tractions with the uncorrected separation and separation correction as in the thesis of D'Souza (2024) - Consistent tangent of the cohesive zone,
MultiDomain.calc_kT_TSL(), and faster assembly of the'SB_TSL'secant stiffness - The kernels
fkCSB11_dmg,fkCSB12_dmgandfkCSB22_dmgtake the distancesdtanddbfrom each mid-surface to the interface - Validation of the cohesive zone against mode I DCB results in the
literature, in
notebooks/, with a convergence study - Fixed
StiffPanelBay.save()withcomposites>=0.9.0
- Fixed the cohesive zone of the
- version 0.6.21 (2026-09-18)
- Fixed the mass of the base of
BladeStiff2D, which was missing, and the section forces ofMultiDomain.force(), which lacked the Jacobian StiffPanelBay.calc_kA()sums the contribution of every panel, andcalc_kA,calc_cA,calc_fext,save,get_sizeanduvw_stiffenerofStiffPanelBayandShell.calc_cAno longer raiseShell.strain()andShell.stress()work for a plate withr=None- Line coverage of the tests raised from 67 % to 92 %
- Fixed
StiffPanelBay.add_paneland the partial-domain integration ofShell.calc_kC,calc_kGandcalc_kM - The limits
Shell.x1, x2, y1, y2of the integration domain default toNoneinstead of the sentinels-1and+1, which silently integrated the full domain for a limit at1.0and ignored a limit given on one side only; the old-1now raises - Fixed the
MultiDomainskin-base connections: the'SB'penalty was a hard-coded mm-unit value, the top and bottom panels depended on their order in the assembly, and the connection dictionaries were modified - Penalty constants of each
MultiDomainconnection can be given with'kt'and'kr' - Reproduction of Stamatelos and Labeas with plate domains only in
tests/multidomain/test_stamatelos_labeas_2023_multidomain.py, using everyMultiDomainconnection - Fixed the argument handling of the stiffness API: an invalid
corc_cteno longer reaches the nogil kernels, and a model that needs a radius raises instead of computing withr = 0 - Reproduction of Stamatelos and Labeas (Computation 2023, 11, 110) in
notebooks/stamatelos_labeas_2023.ipynb - Tangent stiffness matrix that is the exact derivative of the internal force vector, giving quadratic convergence to the Newton-Raphson method
ShellandMultiDomaincan be passed directly tostructsolve.Analysis, including the arc-length methods- Gauss-Legendre points and weights from
scipy.special.roots_legendre - Modules of the models renamed without the
_bardellsuffix, and the legacy_bardellmodel names removed frompanels.modelDB.db - Sphinx documentation with usage examples
- Fixed the mass of the base of
- versions 0.5.x
- Damaged multidomain connections
- up to version 0.3.x
- Multidomain methods for pristine structures
License
Distributed under the 3-Clause BSD license (https://raw.github.com/saullocastro/panels/main/LICENSE).
Contact: S.G.P.Castro@tudelft.nl
Metadata
Release files for panels 0.11.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| panels-0.11.1.tar.gz | 7.5 MB | Details |
Built distributions (wheels)
Total release size: 319.0 MB
Release files / panels-0.11.1.tar.gz
| Download URL | panels-0.11.1.tar.gz |
|---|---|
| Size | 7.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2b5d1f0dff18ef7759114c6b4b0740bd22ab7286d4decb3e59c25c2f31e0b639
|
|
BLAKE2b-256 checksum How to use checksums |
1597fff3a0e0346ebbd5d2b65a8dea7326c22c1cbd1ba0e84446caecb7f18b7c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / panels-0.11.1-cp314-cp314-win_amd64.whl
| Download URL | panels-0.11.1-cp314-cp314-win_amd64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.14 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
4be3cfa893445e26ada6ba11d914dde1047959c3a4dc5900db91346ce1eb46fb
|
|
BLAKE2b-256 checksum How to use checksums |
090dc6fe1c50880fb18aebd4317234f2e5c9824bf7d125b645a5ee3444a43099
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Release files / panels-0.11.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl
| Download URL | panels-0.11.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl |
|---|---|
| Size | 10.0 MB |
| Tags | CPython 3.14 PyEmscripten 2026.0+ WebAssembly |
|
SHA-256 checksum How to use checksums |
3dcf104544f38947063f7657d13816944399d1bd0a25e856a466dcf8413150e2
|
|
BLAKE2b-256 checksum How to use checksums |
9f48e7a02e25410a5c0df0bf69f9e3c5b1915c1ed1ee4105db7ab75a7c64fa89
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Release files / panels-0.11.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | panels-0.11.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 36.6 MB |
| Tags | CPython 3.14 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
8a93cdc174c0b5805cfc79a39ba759c34bd967233b8b820c3d751f6959be1ca8
|
|
BLAKE2b-256 checksum How to use checksums |
35ce5f861effd9f6d95c7a319fe61c72fc816bd703bd9ecbb53b52e7ed5158fb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Release files / panels-0.11.1-cp314-cp314-macosx_10_15_universal2.whl
| Download URL | panels-0.11.1-cp314-cp314-macosx_10_15_universal2.whl |
|---|---|
| Size | 9.6 MB |
| Tags | CPython 3.14 macOS 10.15+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
1bbc9e3fa60ee9050af70171bff1a5b5dcf7ba05b070fac6d22e258be23c0fc3
|
|
BLAKE2b-256 checksum How to use checksums |
7791b70d2bb36106e905c1a7e7bdfb808fdf27195ea7371cbb86a69f1cd9f4d6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.7
|
Release files / panels-0.11.1-cp313-cp313-win_amd64.whl
| Download URL | panels-0.11.1-cp313-cp313-win_amd64.whl |
|---|---|
| Size | 4.4 MB |
| Tags | CPython 3.13 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
0478e785cdfa6bf51ae0a1e9dce407dae52b400edf0650fc02327df3ad0fa030
|
|
BLAKE2b-256 checksum How to use checksums |
33da7ee8d5d4a4f79229074b432621a542d6e78af1fadd6cbf8a79c16becc025
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / panels-0.11.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | panels-0.11.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 36.6 MB |
| Tags | CPython 3.13 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
2250ff403f46b6191c6b1604437bfec36932d026e0467bca66e7a0090ab2a5ae
|
|
BLAKE2b-256 checksum How to use checksums |
db6abed65c50ac399000caccaaf51182742f13cc43a56d52ffec49d069624cd5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Release files / panels-0.11.1-cp313-cp313-macosx_10_13_universal2.whl
| Download URL | panels-0.11.1-cp313-cp313-macosx_10_13_universal2.whl |
|---|---|
| Size | 9.6 MB |
| Tags | CPython 3.13 macOS 10.13+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
3a8799d22e92239b67a5d87677d8b232630c6ddcbb7ff55d09a9df1ae2f5e64a
|
|
BLAKE2b-256 checksum How to use checksums |
2d62646446896cbb7cd04aec7d2ee92b22eaf18b109caf2c50b01732bd96326c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / panels-0.11.1-cp312-cp312-win_amd64.whl
| Download URL | panels-0.11.1-cp312-cp312-win_amd64.whl |
|---|---|
| Size | 4.4 MB |
| Tags | CPython 3.12 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
bb27da916a5180d3475a5f7995516b777dd02ff91002553f548784886471347d
|
|
BLAKE2b-256 checksum How to use checksums |
8db1a565c40131b498ca51730f57d0a7d5db9f89eed7fcff6f4a7f52044ec0b4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / panels-0.11.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | panels-0.11.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 36.7 MB |
| Tags | CPython 3.12 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
c76972ed9709f77b1a5a16e484ed7352ab6d9d76dac8cc22dc2f41ab8eed9676
|
|
BLAKE2b-256 checksum How to use checksums |
c2ebd9f0ef66eed6b07d5cd67dc838b3f70b2c77001884fe10a48f22e32ff422
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / panels-0.11.1-cp312-cp312-macosx_10_13_universal2.whl
| Download URL | panels-0.11.1-cp312-cp312-macosx_10_13_universal2.whl |
|---|---|
| Size | 9.4 MB |
| Tags | CPython 3.12 macOS 10.13+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
590d26a49e1f798b9233393d846cf874a8ae98c571d504b0ff104f4fab0986d6
|
|
BLAKE2b-256 checksum How to use checksums |
1ab5452e58467cda3b4795be4bff2aa305fc820b79b99e7f13ea477104d6591e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.10
|
Release files / panels-0.11.1-cp311-cp311-win_amd64.whl
| Download URL | panels-0.11.1-cp311-cp311-win_amd64.whl |
|---|---|
| Size | 4.4 MB |
| Tags | CPython 3.11 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
ec0b32bb43f431681b6f52e80663c265316d46986e9dfed651fd2bb8621ba2fb
|
|
BLAKE2b-256 checksum How to use checksums |
554369f97dc93123c0a60878494112f0f618d025f27136686e1bee34fca80832
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / panels-0.11.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | panels-0.11.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 36.6 MB |
| Tags | CPython 3.11 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
8d380a21f9d79867b80a196e61bd330b5f199cb6096e201d9a875c97a464e2e8
|
|
BLAKE2b-256 checksum How to use checksums |
b8b8fbbaec2e630179409f9a79492fec1323310c60faf269b4d635ff9251e8af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|
Release files / panels-0.11.1-cp311-cp311-macosx_10_9_universal2.whl
| Download URL | panels-0.11.1-cp311-cp311-macosx_10_9_universal2.whl |
|---|---|
| Size | 9.6 MB |
| Tags | CPython 3.11 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
eb309ae92729bd78b7b9096bd3ef84d131f8d955f7ff81833032fcd2dd8f2a3b
|
|
BLAKE2b-256 checksum How to use checksums |
25c7131eead27648c863daeaa83ccc0227e48a80cfe791ecd5b21e31125eecc7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.9
|
Release files / panels-0.11.1-cp310-cp310-win_amd64.whl
| Download URL | panels-0.11.1-cp310-cp310-win_amd64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.10 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
fec57be92f4517fa6aa5761b8e18f397370be45f93786190398ba1b9f2d10cec
|
|
BLAKE2b-256 checksum How to use checksums |
a9c271c5c9f6ed2f2c5c5af119655eaa48d740f24106cde76db316269673ecd9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.11
|
Release files / panels-0.11.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | panels-0.11.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 35.5 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
903b7733c9df3228a961133f026d24ebadd3d03a773dcfc66c6b9547ee018f6a
|
|
BLAKE2b-256 checksum How to use checksums |
da48677b8eda630f1e8b7270f2b56e03292fcec4bd1955425880c81cbb4f493a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.22
|
Release files / panels-0.11.1-cp310-cp310-macosx_10_9_universal2.whl
| Download URL | panels-0.11.1-cp310-cp310-macosx_10_9_universal2.whl |
|---|---|
| Size | 9.7 MB |
| Tags | CPython 3.10 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
ac03567a4aaf8ec198b74e98cdb13a9e75387c48c46f09c5cac3dcefb25a9e82
|
|
BLAKE2b-256 checksum How to use checksums |
c435810e4812d85b4ce5771d06df0c347bca03c6f4ce80206d78fe806369ac77
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.10.11
|
Release files / panels-0.11.1-cp39-cp39-win_amd64.whl
| Download URL | panels-0.11.1-cp39-cp39-win_amd64.whl |
|---|---|
| Size | 4.5 MB |
| Tags | CPython 3.9 Windows x86-64 |
|
SHA-256 checksum How to use checksums |
9d8b6bd18cad10b1f73383093767d6355fd25e28141ca5c973886f155321deea
|
|
BLAKE2b-256 checksum How to use checksums |
10f47b76faf34cc3c2767ed9812804815bfeb0324e4c73cae5ae8fd2381adec1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.13
|
Release files / panels-0.11.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
| Download URL | panels-0.11.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl |
|---|---|
| Size | 35.4 MB |
| Tags | CPython 3.9 Linux glibc 2.17+ x86-64 Linux glibc 2.28+ x86-64 |
|
SHA-256 checksum How to use checksums |
71f0369a4ff1067db444e4108a308f94b7e3ec6a0b1f393b9bc68304cb7b88b7
|
|
BLAKE2b-256 checksum How to use checksums |
5f46c1beefad9b1317abd2b5c851c56fde85ca5efdb315c5a2d4b482985420bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.25
|
Release files / panels-0.11.1-cp39-cp39-macosx_10_9_universal2.whl
| Download URL | panels-0.11.1-cp39-cp39-macosx_10_9_universal2.whl |
|---|---|
| Size | 9.7 MB |
| Tags | CPython 3.9 macOS 10.9+ universal2 (ARM64, x86-64) |
|
SHA-256 checksum How to use checksums |
69cd13e34c32ba50d16a59d3bd5191e186401c2d6737eddb55d0927c3e08d804
|
|
BLAKE2b-256 checksum How to use checksums |
34568ad1a267044dbc153211ffe3a1919a60c40bc7a6d8c410c56941d7598b0a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.9.13
|