diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 30a283d..c76ca6c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -67,6 +67,7 @@ repos: rev: v2.2.4 hooks: - id: codespell + exclude: (poetry.lock) - repo: https://github.com/PyCQA/pylint rev: v2.17.0 hooks: diff --git a/docs/_static/w190-0090-connectors.webp b/docs/_static/w190-0090-connectors.webp new file mode 100644 index 0000000..837a623 Binary files /dev/null and b/docs/_static/w190-0090-connectors.webp differ diff --git a/docs/_static/w190-0090-uart-sniffer-setup.webp b/docs/_static/w190-0090-uart-sniffer-setup.webp new file mode 100644 index 0000000..3915906 Binary files /dev/null and b/docs/_static/w190-0090-uart-sniffer-setup.webp differ diff --git a/docs/_static/w190-0090.webp b/docs/_static/w190-0090.webp new file mode 100644 index 0000000..20b5fb7 Binary files /dev/null and b/docs/_static/w190-0090.webp differ diff --git a/docs/bluetooth_protocol.md b/docs/bluetooth_protocol.md new file mode 100644 index 0000000..2af7301 --- /dev/null +++ b/docs/bluetooth_protocol.md @@ -0,0 +1,453 @@ +# eFIRE Bluetooth Protocol + +## Basic Communication + +Communication with the eFIRE controller is facilitated the through Generic +Attribute Profile (GATT) via a Bluetooth LE connection. + +Commands can be sent to the controller through the write characteristic at +UUID `0000ff01-0000-1000-8000-00805f9b34fb`. Responses to these commands +can be read by subscribing to notifications on the read characteristic at +UUID `0000ff02-0000-1000-8000-00805f9b34fb`. + +## General packet format + +The eFIRE Controller uses a binary protocol that follows a TLV schema. + +```{packetdiag} +{ + colwidth = 16 + + * Header (0xAB) [len=8] + * Message Type (0xAA or 0xBB) [len=8] + * Length [len=8] + * Command [len=8] + * (Variable length data) [style=dashed, len=16] + * Checksum (XOR) [len=8] + * Footer (0x55) [len=8] +} +``` + +Message Type specifies whether the packet is a request (`0xAA`) or a response (`0xBB`). + +The length is given as an unsigned 8-bit integer and denotes the length of the +remaining packet including the footer. Specifically, the length includes the +following fields: Command, Data, Checksum and Footer. + +The commands are detailed in their own section below. + +The checksum is an XOR over the following fields: Length, Command, Data. + +A complete message in this format with a valid checksum could look like this: + +`0xAB 0xBB 0x06 0xF2 0x00 0x08 0x00 0xFF 0x55` + +This is a response from the command. + +## Commands + +This section describes all commands that can be sent to the controller and their +respective parameters. + +(ifc-cmd1)= + +### `0x27`: IFC CMD1 + +This command interacts with the first set of settings of the IFC. This first set +of settings comprises of: + +1. Power (0 or 1) +2. Thermostat (0 or 1) +3. Night Light Level (0-6) +4. Continuous Pilot (0 or 1) + +Payload format: + +```{packetdiag} +{ + colwidth = 16 + node_height = 120 + scale_direction = rtl + + * Power State [len=1, rotate=270] + * Thermostat Mode [len=1, rotate=270] + * [len=2] + * Night Light [len=3, rotate=270] + * Pilot Mode [len=1, rotate=270] + * [len=8] +} +``` + +:parameters: + + ```{describe} CMD1 Payload (2 bytes) + The first byte is always `0x00`. + + Example: `0x00E3` for Power On, Thermostate enabled, Night Light Level 6, + Continuous Pilot enabled. + ``` + +:return: + + - `0x00`: Success + - `0x01`: Failure + +(ifc-cmd2)= + +### `0x28`: IFC CMD2 + +This command interacts with the second set of settings of the IFC. This second set +of settings comprises of: + +1. Flame Height (0-6) +2. Blower Speed (0-6) +3. Aux Relay (0 or 1) +4. Split Flow (0 or 1) + +Payload format: + +```{packetdiag} +{ + colwidth = 16 + node_height = 120 + scale_direction = rtl + + * Flame Height [len=3, rotate=270] + * AUX Relay [len=1, rotate=270] + * Blower Speed [len=3, rotate=270] + * Split Flow Valve [len=1, rotate=270] + * [len=8] +} +``` + +:parameters: + + ```{describe} CMD2 Payload (2 bytes) + The first byte is always `0x00`. + + Example: `0x00EE` for Flame Height 6, AUX Relay on, Blower Speed 6, + Split Flow Valve enabled + ``` + +:return: + + - `0x00`: Success + - `0x01`: Failure + +### `0xB1`: Set LED Power + +Turns the LED Controller on or off. + +:parameters: + + ```{describe} Desired LED state (3 bytes) + - `0xFFFFFF`: On + - `0x000000`: Off + ``` + +:return: + + - `0x00`: Success + - `0x01`: Failure + +### `0xC1`: Set LED Color + +Set the LED color on the LED controller. + +:parameters: + + ```{describe} Desired LED color in hex RGB format (3 bytes) + Example: `0xFFFFFF` for white + ``` + +:return: + + - `0x00`: Success + - `0x01`: Failure + +### `0xC3`: Set Timer + +Set the sleep timer on the controller. + +:parameters: + + ```{describe} Hours (1 byte) + Example: `0x03` for 3 hours + ``` + + ```{describe} Minutes (1 byte) + Example: `0x0f` for 15 minutes + ``` + + ```{describe} Timer state (1 byte) + - `0x01`: Enable Timer + - `0x00`: Disable Timer + ``` + +:return: + + - `0x00`: Success + - `0x01`: Failure + +### `0xC4`: Set Power + +Turns the burner on or off. + +:parameters: + + ```{describe} Desired burner state (1 byte) + - `0xFF`: On + - `0x00`: Off + ``` + +:return: + + - `0x00`: Success + - `0x01`: Failure + +### `0xC5`: Send Password + +Sends a password to the controller. + +Used without any preceding password management commands this will authenticate +the connection using the supplied password. +When used in conjunction with the `0xC6` command while supplying the `0xF5` +parameter it is used to set a new password. + +:parameters: + + ```{describe} Password as ASCII encoded bytes (variable length) + Example: `0x30303030` for a password of "0000" + ``` + :::{warning} + Maximum length and non-numeric passwords have not been tested! + ::: + +:return: + + - `0x00`: Password successfully set + - `0x01`: Set password failed + - `0x19`: Invalid password + - `0x35`: Password accepted + +### `0xC6`: Password Management + +Initiate a password management action. Used in conjunction with `0xC5` to set a +new password. + +:parameters: + + ```{describe} Password action to initiate (1 byte) + - `0x3F`: Reset Password + - `0xF5`: Set Password + ``` + +:return: + + - `0x00`: Success + - `0x01`: Failure + +### `0xC7`: Sync Timer + +Sync local and controller timer values. The eFIRE app presumably uses this to +remove time drift between the app timer display and the remaining time on the controller. + +:parameters: + + ```{describe} Hours (1 byte) + Example: `0x03` for 3 hours + ``` + + ```{describe} Minutes (1 byte) + Example: `0x0f` for 15 minutes + ``` + + ```{describe} Seconds (1 byte) + Example: `0x30` for 48 seconds + ``` + +:return: + + - `0x00`: Success + - `0x01`: Failure + +### `0xE0`: Get LED Controller Power State + +Get the power state of the optional LED controller. + +:return: + + - `0x000000`: LEDs are off + - `0xFFFFFF`: LEDs are on + +### `0xE1`: Get LED Color + +Get the current color setting from the LED controller. + +:return: + + - RGB Hex value of the color + + Example: `0xFF0000` for red + +### `0xE2`: Get LED Mode + +Get the current mode setting from the LED controller. + +:return: + + - `0x010101`: Cycle (i.e. rainbow cycle) + - `0x020202`: Hold (i.e. single color) + - `0xFFFFFF`: Ember Bed (i.e. fire effect) + +### `0xE3`: Get IFC CMD1 State + +Get the current IFC CMD1 state. + +:return: + + Returns 2-bytes corresponding to the format described in the + section. + + Example: `0x00E3` + +### `0xE4`: Get IFC CMD2 State + +Get the current IFC CMD2 state. + +:return: + + Returns 2-bytes corresponding to the format described in the + section. + + Example: `0x00EE` + +### `0xE6`: Get Timer + +Get the timer settings. + +:return: + + ```{describe} Hours (1 byte) + Example: `0x03` for 3 hours + ``` + + ```{describe} Minutes (1 byte) + Example: `0x0f` for 15 minutes + ``` + + ```{describe} Timer state (1 byte) + - `0x01`: Timer enabled + - `0x00`: Timer enabled + ``` + + ```{describe} Seconds (1 byte) + Example: `0x30` for 48 seconds + ``` + +### `0xE7`: Get Power State + +Get the power state of the fireplace. + +:return: + + ```{describe} Current fireplace power state (1 byte) + - `0x00`: Off + - `0xFF`: On + ``` + +### `0xE8`: Get Password + +Get the password currently set on the controller. + +:return: + + ```{describe} Password as ASCII encoded bytes (variable length) + Example: `0x30303030` for a password of "0000" + ``` + +### `0xE9`: Query Set Password Result + +Returns the result from the last password set command. + +:return: + + ```{describe} Current fireplace power state (1 byte) + - `0x25`: Password set failed + - `0x53`: Password set successful + ``` + +### `0xEA`: Time Sync + +read time sync from ctrl + +### `0xEB`: Get LED Controller State + +Return the current overall state of the LED controller. + +:return: + + ```{describe} Current LED controller power state (1 byte) + - `0x00`: Off + - `0xFF`: On + ``` + + ```{describe} Current LED controller RGB Hex color setting (3 bytes) + Example `0xFF0000` for red + ``` + + ```{describe} Current LED controller mode (1 byte) + - `0x01`: Cycle (i.e. rainbow cycle) + - `0x02`: Hold (i.e. single color) + - `0xFF`: Ember Bed (i.e. fire effect) + ``` + +### `0xF1`: Set LED Controller Mode + +Set the LED Controller mode. + +:parameters: + + ```{describe} Desired LED controller mode (1 byte) + - `0x10`: Ember Bed (i.e. fire effect) + - `0x20`: Cycle (i.e. rainbow cycle) + - `0x30`: Hold (i.e. single color) + ``` + +:return: + + - `0x00`: Success + - `0x01`: Failure + +(get-ble-version)= + +### `0xF2`: Get BLE Version + +Get the firmware version of the BLE module. + +:return: + + ```{describe} BLE Firmware version (3 bytes) + Example: `0x000800` is parsed by the app as version string "8" + ``` + +### `0xF3`: Get MCU Version + +Get the firmware version of the MCU. + +:return: + + ```{describe} MCU Firmware version (3 bytes) + Example: `0x010104` is parsed by the app as version string "1.14" + ``` + +### `0xF4`: Get Auxiliary Control + +:::{note} +Untested. Does not return anything on my device +::: + +Return whether the fireplace is currently controlled by the RF remote. + +If the fireplace is controlled by the RF remote Bluetooth commands have no +effect and state reported by the controller is invalid. diff --git a/docs/conf.py b/docs/conf.py index f44a811..fad4c86 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -9,13 +9,14 @@ project = "Bonaparte" copyright = "2023, Felix Kaechele" author = "Felix Kaechele" -release = "0.0.0" +release = "0.1.0" # -- General configuration --------------------------------------------------- # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration extensions = [ "myst_parser", + "sphinxcontrib.packetdiag", ] # The suffix of source filenames. @@ -33,3 +34,8 @@ html_theme = "sphinx_rtd_theme" html_static_path = ["_static"] + +myst_enable_extensions = ["colon_fence", "fieldlist"] + +packetdiag_html_image_format = "SVG" +packetdiag_latex_image_format = "PDF" diff --git a/docs/index.md b/docs/index.md index 552a621..99468e6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,6 +12,8 @@ usage :caption: Project Info :maxdepth: 2 +system_information +bluetooth_protocol changelog contributing ``` diff --git a/docs/system_information.md b/docs/system_information.md new file mode 100644 index 0000000..a50a2e5 --- /dev/null +++ b/docs/system_information.md @@ -0,0 +1,210 @@ +# System Information + +This page provides an overview of the interworking of the Napoleon eFIRE +Bluetooth Controller with the SIT ProFlame 2 Integrated Fireplace Controller. + +## Napoleon eFIRE Bluetooth Controller + +![Napoleon W190-0090 Bluetooth Module](_static/w190-0090.webp) + +The Napoleon W190-0090 Bluetooth Controller is based on an Iton Technology +BT4GMD-Q25P Bluetooth module. +This Bluetooth module utilizes a Cypress Semiconductor CYW20736A1KML2G +Bluetooth LE SoC. + +Refer to [the module's FCC filing](https://fccid.io/VA8W190-0090) for some +additional details. + +### Connectors + +![Napoleon W190-0090 Connectors](_static/w190-0090-connectors.webp) + +The module has three external connectors: + +1. Green terminal, prepopulated with a jumper cable, referred to in the FCC + filing as a "Jumper for user options" +2. Two conductor lead for the an optional LED Controller (Napoleon Model Number W190-0125) +3. A white 2.54mm pitch 4-pin XH series header for 3.3V power and UART from the + SIT ProFlame 2 IFC + +The function of the green terminal is currently unknown. + +The pinout for the XH header, when viewed in the orientation as seen on the above +picture, is as follows: + +`3V3 | RX | TX | GND` + +The GND pin is the one that is closes to the edge of the case and has the typical +XH Pin 1 marking arrow on the side of the housing of the plug end of the connection. + +## SIT ProFlame 2 IFC + +The SIT ProFlame 2 Integrated Fireplace Control is a controller commonly found +in gas fireplaces of various brands. + +SIT provides it's own +[Wi-Fi Dongle](https://proflame.sitgroup.it/eng/proflame-connectivity/wi-fi-dongle) +for the ProFlame 2. + +The [SIT ProFlame Wi-Fi Dongle User Manual](https://proflame.sitgroup.it/media/96/t-file/Proflame-WIFI-Dongle-Use-and-Installation-Instructions.pdf) +details the hardware requirements for the use of the Wi-Fi dongle. +The website also mentions the need to use a ProFlame 2 IFC with the schematics +on the case printed in green. + +My assumption is the significance of this is the ability of this updated IFC in +conjunction with the new "Wi-Fi Enabled" remote (SIT Part 0.584.080) to +synchronize state between the remote and Wi-Fi dongle overcoming the +limitations the Napoleon implementation currently has. + +## SIT ProFlame 2 UART Communication + +The following information on the ProFlame 2 UART communication has been gathered +by sniffing the serial traffic on the port using a little rig I built and the +[slsnif](https://github.com/aeruder/slsnif) tool. + +```{figure} _static/w190-0090-uart-sniffer-setup.webp +:width: 50% +:align: center + +Custom cable that breaks out the individual connections to be intercepted by +common USB to serial adapters. +``` + +The IFCs serial configuration is 9600–8-N-1. + +The binary protocol seems to use a fixed length of 6 bytes per message. +The Napoleon controller polls the IFC every second for state information and +sends commands to the IFC as needed. + +The IFC does not generate any output unless requested through a message. + +### Message format + +```{packetdiag} +{ + colwidth = 8 + + * Message Type [len=8] + * Payload [len=24] + * Register [len=8] + * Checksum (XOR) [len=8] +} +``` + +#### Message Type + +Four message types can be observed: + +1. `0x5D` Set value request +2. `0x5E` Get value request +3. `0xAD` Set value response +4. `0XAE` Get value response + +Request messages originate on the controller, and responses originate +on the IFC. + +#### Payload + +The payload for get requests is `0x00 0x00 0x00`. + +For set requests it differs by register. The `0x17` and `0x18` +registers directly correlate to their Bluetooth protocol counterparts and use +the same payload format as described below. + +#### Register + +What I titled register is what I assume to be an addressing mechanism for +certain function groups. The eFIRE controller uses three different registers: + +1. `0x16`: This seems to relate to requesting control over the fireplace +2. `0x17`: This directly correlates to the command in the + eFIRE Bluetooth Protocol +3. `0x18`: This directly correlates to the command in the + eFIRE Bluetooth Protocol + +### The 0x16 register + +The behaviour observed on the 0x16 register suggests it is responsible to broker +control over the IFC. + +The eFIRE Controller requests control using this message: + +`0x5D 0xC1 0xA0 0x00 0x16 0x2A` + +To which the IFC will reply + +`0xAD 0xC1 0xA0 0x00 0x16 0xDA` + +if control is granted. + +Control is denied if the RF remote is in use. In this case the IFC will reply + +`0xAD 0x00 0x00 0x00 0x16 0xBB` + +The 0x16 register can also be queried using: + +`0x5E 0x00 0x00 0x00 0x16 0x48` + +If we have control the IFC will reply + +`0xAE 0xC1 0xA0 0x00 0x16 0xD9` + +if we do not have control the IFC will reply: + +`0xAE 0x00 0x00 0x00 0x16 0xB8` + +### Communication between eFIRE and ProFlame 2 + +In normal operation the eFIRE Controller requests the current state of both the +`0x17` and `0x18` register every second with the following sequence: + +``` +CTRL: 0x5E 0x00 0x00 0x00 0x17 0x49 + IFC: 0xAE 0X00 0x61 0x00 0x17 0xD8 +CTRL: 0x5E 0x00 0x00 0x00 0x18 0x46 + IFC: 0xAE 0x00 0x00 0x00 0x18 0xB6 +``` + +In this case the night light level is set to 6 and the fireplace mode is "on" +in register `0x17`, however, since no flame height is set in register `0x18`, +the fireplace is not actually operating the burner in this state. + +When a setting in either of those registers is changed through the app the +controller will issues the following sequence of messages and revert to it's +polling loop immediately after: + +``` +CTRL: 0x5D 0xC1 0xA0 0x00 0x16 0x2A # requesting control + IFC: 0xAD 0xC1 0xA0 0x00 0x16 0xDA # we have control +CTRL: 0x5E 0x00 0x00 0x00 0x16 0x48 # checking control + IFC: 0xAE 0xC1 0xA0 0x00 0x16 0xD9 # we have control +CTRL: 0x5E 0x00 0x00 0x00 0x17 0x49 # get 0x17 state + IFC: 0xAE 0X00 0x01 0x00 0x17 0xB8 # 0x17 state +CTRL: 0x5E 0x00 0x00 0x00 0x18 0x46 # get 0x18 state + IFC: 0xAE 0x00 0x00 0x00 0x18 0xB6 # 0x18 state +CTRL: 0x5D 0x00 0x01 0x00 0x17 0x4B # set 0x17 state + IFC: 0xAD 0X00 0x01 0x00 0x17 0xBB # 0x17 state +CTRL: 0x5D 0x00 0x80 0x00 0x18 0xC5 # set 0x18 state (Split Flow On) + IFC: 0xAD 0x00 0x80 0x00 0x18 0x35 # 0x18 state +``` + +## Limitations + +The ProFlame 2 IFC currently does not report valid state information when +ontrol is taken over using the RF remote control. + +Querying the `0x17` and `0x18` registers while the fireplace is controlled by +the RF remote will yield stale values at best and random values at worst. + +As soon as the RF remote control is used to control the fireplace we can no +longer gain control using the `0x16` register and the fireplace will respond to +requests for control as outlined above. + +Control can only be regained using the `0x16` register when the fireplace is +turned off using the RF remote. + +Napoleon mentions this in their documentation by stating that the RF remote +always takes precedence over the eFIRE app. +Screenshots on the Google Play Store suggest the app is supposed to detect when +this happens and block input on the app by showing an overlay. +This is not the case on my fireplace. diff --git a/poetry.lock b/poetry.lock index b690ba9..8fe170d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -335,6 +335,29 @@ files = [ {file = "bleak_winrt-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:63130c11acfe75c504a79c01f9919e87f009f5e742bfc7b7a5c2a9c72bf591a7"}, ] +[[package]] +name = "blockdiag" +version = "3.0.0" +description = "blockdiag generates block-diagram image from text" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "blockdiag-3.0.0-py3-none-any.whl", hash = "sha256:4031bfae6a7f36071d733dec639987346e10f7871356ee2c7a221961c64961d8"}, + {file = "blockdiag-3.0.0.tar.gz", hash = "sha256:dee4195bb87d23654546ba2bf5091480dbf253b409891fce2cd527c91d00a3e2"}, +] + +[package.dependencies] +funcparserlib = ">=1.0.0a0" +Pillow = ">3.0" +setuptools = "*" +webcolors = "*" + +[package.extras] +pdf = ["reportlab"] +rst = ["docutils"] +testing = ["docutils", "flake8", "flake8-coding", "flake8-copyright", "flake8-isort", "nose", "reportlab"] + [[package]] name = "bluetooth-adapters" version = "0.15.2" @@ -716,6 +739,18 @@ files = [ {file = "frozenlist-1.3.3.tar.gz", hash = "sha256:58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a"}, ] +[[package]] +name = "funcparserlib" +version = "1.0.1" +description = "Recursive descent parsing library based on functional combinators" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "funcparserlib-1.0.1-py2.py3-none-any.whl", hash = "sha256:95da15d3f0d00b9b6f4bf04005c708af3faa115f7b45692ace064ebe758c68e8"}, + {file = "funcparserlib-1.0.1.tar.gz", hash = "sha256:a2c4a0d7942f7a0e7635c369d921066c8d4cae7f8b5bf7914466bec3c69837f4"}, +] + [[package]] name = "idna" version = "3.4" @@ -1104,6 +1139,26 @@ rtd = ["ipython", "pydata-sphinx-theme (==v0.13.0rc4)", "sphinx-autodoc2 (>=0.4. testing = ["beautifulsoup4", "coverage[toml]", "pytest (>=7,<8)", "pytest-cov", "pytest-param-files (>=0.3.4,<0.4.0)", "pytest-regressions", "sphinx-pytest"] testing-docutils = ["pygments", "pytest (>=7,<8)", "pytest-param-files (>=0.3.4,<0.4.0)"] +[[package]] +name = "nwdiag" +version = "3.0.0" +description = "nwdiag generates network-diagram image from text" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "nwdiag-3.0.0-py3-none-any.whl", hash = "sha256:549cab5400ca33b8c05ea119414fa41e6bd85be222ba524418c2c176eea87e80"}, + {file = "nwdiag-3.0.0.tar.gz", hash = "sha256:e267530fcaac8a1d9e7403048597ed30e031e17f0191569dc6f704087bacb2eb"}, +] + +[package.dependencies] +blockdiag = ">=3.0.0" + +[package.extras] +pdf = ["reportlab"] +rst = ["docutils"] +testing = ["docutils", "flake8", "flake8-coding", "flake8-copyright", "flake8-isort", "nose", "pep8 (>=1.3)", "reportlab"] + [[package]] name = "packaging" version = "23.0" @@ -1128,6 +1183,97 @@ files = [ {file = "pathspec-0.11.0.tar.gz", hash = "sha256:64d338d4e0914e91c1792321e6907b5a593f1ab1851de7fc269557a21b30ebbc"}, ] +[[package]] +name = "pillow" +version = "9.4.0" +description = "Python Imaging Library (Fork)" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pillow-9.4.0-1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b4b4e9dda4f4e4c4e6896f93e84a8f0bcca3b059de9ddf67dac3c334b1195e1"}, + {file = "Pillow-9.4.0-1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:fb5c1ad6bad98c57482236a21bf985ab0ef42bd51f7ad4e4538e89a997624e12"}, + {file = "Pillow-9.4.0-1-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:f0caf4a5dcf610d96c3bd32932bfac8aee61c96e60481c2a0ea58da435e25acd"}, + {file = "Pillow-9.4.0-1-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:3f4cc516e0b264c8d4ccd6b6cbc69a07c6d582d8337df79be1e15a5056b258c9"}, + {file = "Pillow-9.4.0-1-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b8c2f6eb0df979ee99433d8b3f6d193d9590f735cf12274c108bd954e30ca858"}, + {file = "Pillow-9.4.0-1-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b70756ec9417c34e097f987b4d8c510975216ad26ba6e57ccb53bc758f490dab"}, + {file = "Pillow-9.4.0-1-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:43521ce2c4b865d385e78579a082b6ad1166ebed2b1a2293c3be1d68dd7ca3b9"}, + {file = "Pillow-9.4.0-2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9d9a62576b68cd90f7075876f4e8444487db5eeea0e4df3ba298ee38a8d067b0"}, + {file = "Pillow-9.4.0-2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:87708d78a14d56a990fbf4f9cb350b7d89ee8988705e58e39bdf4d82c149210f"}, + {file = "Pillow-9.4.0-2-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8a2b5874d17e72dfb80d917213abd55d7e1ed2479f38f001f264f7ce7bae757c"}, + {file = "Pillow-9.4.0-2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:83125753a60cfc8c412de5896d10a0a405e0bd88d0470ad82e0869ddf0cb3848"}, + {file = "Pillow-9.4.0-2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9e5f94742033898bfe84c93c831a6f552bb629448d4072dd312306bab3bd96f1"}, + {file = "Pillow-9.4.0-2-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:013016af6b3a12a2f40b704677f8b51f72cb007dac785a9933d5c86a72a7fe33"}, + {file = "Pillow-9.4.0-2-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:99d92d148dd03fd19d16175b6d355cc1b01faf80dae93c6c3eb4163709edc0a9"}, + {file = "Pillow-9.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:2968c58feca624bb6c8502f9564dd187d0e1389964898f5e9e1fbc8533169157"}, + {file = "Pillow-9.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5c1362c14aee73f50143d74389b2c158707b4abce2cb055b7ad37ce60738d47"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd752c5ff1b4a870b7661234694f24b1d2b9076b8bf337321a814c612665f343"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3049a10261d7f2b6514d35bbb7a4dfc3ece4c4de14ef5876c4b7a23a0e566d"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16a8df99701f9095bea8a6c4b3197da105df6f74e6176c5b410bc2df2fd29a57"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:94cdff45173b1919350601f82d61365e792895e3c3a3443cf99819e6fbf717a5"}, + {file = "Pillow-9.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ed3e4b4e1e6de75fdc16d3259098de7c6571b1a6cc863b1a49e7d3d53e036070"}, + {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5b2f8a31bd43e0f18172d8ac82347c8f37ef3e0b414431157718aa234991b28"}, + {file = "Pillow-9.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:09b89ddc95c248ee788328528e6a2996e09eaccddeeb82a5356e92645733be35"}, + {file = "Pillow-9.4.0-cp310-cp310-win32.whl", hash = "sha256:f09598b416ba39a8f489c124447b007fe865f786a89dbfa48bb5cf395693132a"}, + {file = "Pillow-9.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6e78171be3fb7941f9910ea15b4b14ec27725865a73c15277bc39f5ca4f8391"}, + {file = "Pillow-9.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:3fa1284762aacca6dc97474ee9c16f83990b8eeb6697f2ba17140d54b453e133"}, + {file = "Pillow-9.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eaef5d2de3c7e9b21f1e762f289d17b726c2239a42b11e25446abf82b26ac132"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4dfdae195335abb4e89cc9762b2edc524f3c6e80d647a9a81bf81e17e3fb6f0"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6abfb51a82e919e3933eb137e17c4ae9c0475a25508ea88993bb59faf82f3b35"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:451f10ef963918e65b8869e17d67db5e2f4ab40e716ee6ce7129b0cde2876eab"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:6663977496d616b618b6cfa43ec86e479ee62b942e1da76a2c3daa1c75933ef4"}, + {file = "Pillow-9.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:60e7da3a3ad1812c128750fc1bc14a7ceeb8d29f77e0a2356a8fb2aa8925287d"}, + {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:19005a8e58b7c1796bc0167862b1f54a64d3b44ee5d48152b06bb861458bc0f8"}, + {file = "Pillow-9.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f715c32e774a60a337b2bb8ad9839b4abf75b267a0f18806f6f4f5f1688c4b5a"}, + {file = "Pillow-9.4.0-cp311-cp311-win32.whl", hash = "sha256:b222090c455d6d1a64e6b7bb5f4035c4dff479e22455c9eaa1bdd4c75b52c80c"}, + {file = "Pillow-9.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba6612b6548220ff5e9df85261bddc811a057b0b465a1226b39bfb8550616aee"}, + {file = "Pillow-9.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5f532a2ad4d174eb73494e7397988e22bf427f91acc8e6ebf5bb10597b49c493"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dd5a9c3091a0f414a963d427f920368e2b6a4c2f7527fdd82cde8ef0bc7a327"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef21af928e807f10bf4141cad4746eee692a0dd3ff56cfb25fce076ec3cc8abe"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:847b114580c5cc9ebaf216dd8c8dbc6b00a3b7ab0131e173d7120e6deade1f57"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:653d7fb2df65efefbcbf81ef5fe5e5be931f1ee4332c2893ca638c9b11a409c4"}, + {file = "Pillow-9.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:46f39cab8bbf4a384ba7cb0bc8bae7b7062b6a11cfac1ca4bc144dea90d4a9f5"}, + {file = "Pillow-9.4.0-cp37-cp37m-win32.whl", hash = "sha256:7ac7594397698f77bce84382929747130765f66406dc2cd8b4ab4da68ade4c6e"}, + {file = "Pillow-9.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:46c259e87199041583658457372a183636ae8cd56dbf3f0755e0f376a7f9d0e6"}, + {file = "Pillow-9.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:0e51f608da093e5d9038c592b5b575cadc12fd748af1479b5e858045fff955a9"}, + {file = "Pillow-9.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:765cb54c0b8724a7c12c55146ae4647e0274a839fb6de7bcba841e04298e1011"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:519e14e2c49fcf7616d6d2cfc5c70adae95682ae20f0395e9280db85e8d6c4df"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d197df5489004db87d90b918033edbeee0bd6df3848a204bca3ff0a903bef837"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0845adc64fe9886db00f5ab68c4a8cd933ab749a87747555cec1c95acea64b0b"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:e1339790c083c5a4de48f688b4841f18df839eb3c9584a770cbd818b33e26d5d"}, + {file = "Pillow-9.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:a96e6e23f2b79433390273eaf8cc94fec9c6370842e577ab10dabdcc7ea0a66b"}, + {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7cfc287da09f9d2a7ec146ee4d72d6ea1342e770d975e49a8621bf54eaa8f30f"}, + {file = "Pillow-9.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d7081c084ceb58278dd3cf81f836bc818978c0ccc770cbbb202125ddabec6628"}, + {file = "Pillow-9.4.0-cp38-cp38-win32.whl", hash = "sha256:df41112ccce5d47770a0c13651479fbcd8793f34232a2dd9faeccb75eb5d0d0d"}, + {file = "Pillow-9.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7a21222644ab69ddd9967cfe6f2bb420b460dae4289c9d40ff9a4896e7c35c9a"}, + {file = "Pillow-9.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0f3269304c1a7ce82f1759c12ce731ef9b6e95b6df829dccd9fe42912cc48569"}, + {file = "Pillow-9.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb362e3b0976dc994857391b776ddaa8c13c28a16f80ac6522c23d5257156bed"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2e0f87144fcbbe54297cae708c5e7f9da21a4646523456b00cc956bd4c65815"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28676836c7796805914b76b1837a40f76827ee0d5398f72f7dcc634bae7c6264"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0884ba7b515163a1a05440a138adeb722b8a6ae2c2b33aea93ea3118dd3a899e"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:53dcb50fbdc3fb2c55431a9b30caeb2f7027fcd2aeb501459464f0214200a503"}, + {file = "Pillow-9.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:e8c5cf126889a4de385c02a2c3d3aba4b00f70234bfddae82a5eaa3ee6d5e3e6"}, + {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c6b1389ed66cdd174d040105123a5a1bc91d0aa7059c7261d20e583b6d8cbd2"}, + {file = "Pillow-9.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0dd4c681b82214b36273c18ca7ee87065a50e013112eea7d78c7a1b89a739153"}, + {file = "Pillow-9.4.0-cp39-cp39-win32.whl", hash = "sha256:6d9dfb9959a3b0039ee06c1a1a90dc23bac3b430842dcb97908ddde05870601c"}, + {file = "Pillow-9.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:54614444887e0d3043557d9dbc697dbb16cfb5a35d672b7a0fcc1ed0cf1c600b"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b9b752ab91e78234941e44abdecc07f1f0d8f51fb62941d32995b8161f68cfe5"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3b56206244dc8711f7e8b7d6cad4663917cd5b2d950799425076681e8766286"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aabdab8ec1e7ca7f1434d042bf8b1e92056245fb179790dc97ed040361f16bfd"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db74f5562c09953b2c5f8ec4b7dfd3f5421f31811e97d1dbc0a7c93d6e3a24df"}, + {file = "Pillow-9.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e9d7747847c53a16a729b6ee5e737cf170f7a16611c143d95aa60a109a59c336"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:b52ff4f4e002f828ea6483faf4c4e8deea8d743cf801b74910243c58acc6eda3"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:575d8912dca808edd9acd6f7795199332696d3469665ef26163cd090fa1f8bfa"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c4ed2ff6760e98d262e0cc9c9a7f7b8a9f61aa4d47c58835cdaf7b0b8811bb"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e621b0246192d3b9cb1dc62c78cfa4c6f6d2ddc0ec207d43c0dedecb914f152a"}, + {file = "Pillow-9.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8f127e7b028900421cad64f51f75c051b628db17fb00e099eb148761eed598c9"}, + {file = "Pillow-9.4.0.tar.gz", hash = "sha256:a1c2d7780448eb93fbcc3789bf3916aa5720d942e37945f4056680317f1cd23e"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] + [[package]] name = "platformdirs" version = "3.1.1" @@ -1375,6 +1521,68 @@ files = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] +[[package]] +name = "reportlab" +version = "3.6.12" +description = "The Reportlab Toolkit" +category = "dev" +optional = false +python-versions = ">=3.7,<4" +files = [ + {file = "reportlab-3.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dfcf7bd6db5d80711cbbd0996b6e7a79cc414ca81457960367df11d2860f92a"}, + {file = "reportlab-3.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0bc7a1d64fe754b62e175ba0cf47a630b529c0488ec9ac4e4c7655e295ea4d"}, + {file = "reportlab-3.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adf78ccb2defad5b6ecb2e2e9f2a672719b0a8e2278592a7d77f6c220a042388"}, + {file = "reportlab-3.6.12-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c84afd5bef6e407c80ba9f99b6abbe3ea78e8243b0f19897a871a7bcad1f749d"}, + {file = "reportlab-3.6.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4fa3cdf490f3828b055381e8c7dc7819b3e5f7a442d7af7a8f90e9806a7fff51"}, + {file = "reportlab-3.6.12-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07fdd968df7941c2bfb67b9bb4532f424992dfafc71b72a4e4b291ff707e6b0e"}, + {file = "reportlab-3.6.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce85a204f46c871c8af6fa64b9bbed165456935c1d0bfb2f570a3194f6723ddb"}, + {file = "reportlab-3.6.12-cp310-cp310-win32.whl", hash = "sha256:090ea99ff829d918f7b6140594373b1340a34e1e6876eddae5aa06662ec10d64"}, + {file = "reportlab-3.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:4c599645af9b5b2241a23e977a82c965a59c24cd94b2600b8d34373c66cad763"}, + {file = "reportlab-3.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:236a6483210049205f6180d7a7595d0ca2e4ce343d83cc94ca719a4145809c6f"}, + {file = "reportlab-3.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:69f41295d696c822224334f0994f1f107df7efed72211d45a1118696f1427c84"}, + {file = "reportlab-3.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f51dcb39e910a853749250c0f82aced80bca3f7315e9c4ee14349eb7cab6a3f8"}, + {file = "reportlab-3.6.12-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8dddc52e0e486291be0ad39184da0607fae9cc665fdba1881211de9cfc0b332"}, + {file = "reportlab-3.6.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4863c49602722237e35cbce5aa91af4539cc63a671f59504d2b3f3767d898cf"}, + {file = "reportlab-3.6.12-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8b1215facead57cc5325aef4229ef886e85d270b2ba02080fb5809ce9d2b81b4"}, + {file = "reportlab-3.6.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a12049314497d872f6788f811e2b331654db207937f8a2fb34ff3e3cd9897faa"}, + {file = "reportlab-3.6.12-cp311-cp311-win32.whl", hash = "sha256:759495c2b8c15cb0d6b539c246896029e4cde42a896c3956f77e311c5f6b0807"}, + {file = "reportlab-3.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:666bdba4958b348460a765c48b8c0640e7085540846ed9494f47d8651604b33c"}, + {file = "reportlab-3.6.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a7c3369fa618eca79f9554ce06c618a5e738e592d61d96aa09b2457ca3ea410"}, + {file = "reportlab-3.6.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9b0861d8f40d7a24b094b8834f6a489b9e8c70bceaa7fa98237eed229671ce"}, + {file = "reportlab-3.6.12-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26c25ea4afa8b92a2c14f4edc41c8fc30505745ce84cae86538e80cacadd7ae2"}, + {file = "reportlab-3.6.12-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55a070206580e161b6bbe1a96abf816c18d4c2c225d49916654714c93d842835"}, + {file = "reportlab-3.6.12-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c40e108072379ff83dd7442159ebc249d12eb8eec15b70614953fecd2c403792"}, + {file = "reportlab-3.6.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39e92fa4ab2a8f0f2cc051d9c1e3acb881340c07ef59c0c8b627861343d653c0"}, + {file = "reportlab-3.6.12-cp37-cp37m-win32.whl", hash = "sha256:3fd1ffdd5204301eb4c290a5752ac62f44d2d0b262e02e35a1e5234c13e14662"}, + {file = "reportlab-3.6.12-cp37-cp37m-win_amd64.whl", hash = "sha256:d4cecfb48a6cfbfe2caf0fc280cecea999699e63bc98cb02254bd87b39eff677"}, + {file = "reportlab-3.6.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b6a1b685da0b9a8000bb980e02d9d5be202d0cc539af113b661c76c051fca6f1"}, + {file = "reportlab-3.6.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f5808e1dac6b66c109d6205ce2aebf84bb89e1a1493b7e6df38932df5ebfb9cf"}, + {file = "reportlab-3.6.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb83df8f7840321d34cb5b24c972c617a8c1716c8a36e5050fff56adf5891b8c"}, + {file = "reportlab-3.6.12-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72ec333f089b4fce5a6d740ed0a1963a3994146be195722da0d8e14d4a7e1600"}, + {file = "reportlab-3.6.12-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71cf73f9907c444ef663ea653dbac24af07c307079572c3ff8f20ad1463af3b7"}, + {file = "reportlab-3.6.12-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cee3b6ebef5e4a8654ec5f0effeb1a2bb157ad87b0ac856871d25a805c0f2f90"}, + {file = "reportlab-3.6.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db62bed0774778fdf82c609cb9efd0062f2fdcd285be527d01f6be9fd9755888"}, + {file = "reportlab-3.6.12-cp38-cp38-win32.whl", hash = "sha256:b777ddc57b2d3366cbc540616034cdc1089ca0a31fefc907028e1dd62a6bf16c"}, + {file = "reportlab-3.6.12-cp38-cp38-win_amd64.whl", hash = "sha256:c07ec796a2a5d44bf787f2b623b6e668a389b0cafb78af34cf74554ff3bc532b"}, + {file = "reportlab-3.6.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cdd206883e999278d2af656f988dfcc89eb0c175ce6d75e87b713cf1e792c0c4"}, + {file = "reportlab-3.6.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a62e51a4a47616896bd0f1e9cc3fbfb174b713794a5031a34b84f69dbe01775"}, + {file = "reportlab-3.6.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1dd0307b2b13b0482ac8314fd793fbbce263a428b189371addf0466784e1d597"}, + {file = "reportlab-3.6.12-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c56d701f7dc662e1d3d7fe364e66fa1339eafce54a488c2d16ec0ea49dc213c2"}, + {file = "reportlab-3.6.12-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:109009b02fc225882ea766a5ed8be0ef473fa1356e252a3f651a6aa89b4a195f"}, + {file = "reportlab-3.6.12-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b3648f3c340b6b6aabf9352341478c708cee6f00c5cd5c902311fcf4ce870f3c"}, + {file = "reportlab-3.6.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:907f7cd4832bb295d0c1573de15cc5aab5988282caf2ee7a2b1276fb6cdf502b"}, + {file = "reportlab-3.6.12-cp39-cp39-win32.whl", hash = "sha256:93e229519d046491b798f2c12dbbf2f3e237e89589aa5cbb5e1d8c1a978816db"}, + {file = "reportlab-3.6.12-cp39-cp39-win_amd64.whl", hash = "sha256:498b4ec7e73426de64c6bf6ec03c5b3f10dedf5db8a9e13fdf195f95a3d065aa"}, + {file = "reportlab-3.6.12.tar.gz", hash = "sha256:b13cebf4e397bba14542bcd023338b6ff2c151a3a12aabca89eecbf972cb361a"}, +] + +[package.dependencies] +pillow = ">=9.0.0" + +[package.extras] +fttextpath = ["freetype-py (>=2.3.0,<2.4)"] +rlpycairo = ["rlPyCairo (>=0.1.0)"] + [[package]] name = "requests" version = "2.28.2" @@ -1559,6 +1767,23 @@ files = [ [package.extras] test = ["flake8", "mypy", "pytest"] +[[package]] +name = "sphinxcontrib-nwdiag" +version = "2.0.0" +description = "Sphinx \"nwdiag\" extension" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "sphinxcontrib-nwdiag-2.0.0.tar.gz", hash = "sha256:6ee95ad43bad46fe8dc1f65185c8997cb1d16665eee36a7eaaf6de13137ff859"}, + {file = "sphinxcontrib_nwdiag-2.0.0-py2.py3-none-any.whl", hash = "sha256:5aae8c83b19e940409554b69249cf97e4f565331effd208cca9fddbc90b6ea36"}, +] + +[package.dependencies] +blockdiag = ">=1.5.0" +nwdiag = ">=1.0.3" +Sphinx = ">=2.0" + [[package]] name = "sphinxcontrib-qthelp" version = "1.0.3" @@ -1656,6 +1881,18 @@ files = [ {file = "usb_devices-0.4.1.tar.gz", hash = "sha256:2ad810ba1fd29817d014fe244179fbd06866b92a3285e2bb3a8442f99a8e47b6"}, ] +[[package]] +name = "webcolors" +version = "1.12" +description = "A library for working with color names and color values formats defined by HTML and CSS." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "webcolors-1.12-py3-none-any.whl", hash = "sha256:d98743d81d498a2d3eaf165196e65481f0d2ea85281463d856b1e51b09f62dce"}, + {file = "webcolors-1.12.tar.gz", hash = "sha256:16d043d3a08fd6a1b1b7e3e9e62640d09790dce80d2bdd4792a175b35fe794a9"}, +] + [[package]] name = "wrapt" version = "1.15.0" @@ -1832,4 +2069,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "6a19e9d5f6fd780be8112d1c0945719decddab62a631413a4d3208f338fb4b3f" +content-hash = "1b06dcbd35e243037be668b66b134a53ba36054f44498845661fdbbd8384cc4e" diff --git a/pyproject.toml b/pyproject.toml index e9ae8b9..326fdd8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,8 @@ optional = true myst-parser = ">=0.16" sphinx = ">=4.0" sphinx-rtd-theme = ">=1.0" +sphinxcontrib-nwdiag = "^2.0.0" +reportlab = "^3.6.12" [tool.semantic_release] branch = "main"