././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6922362 pytest-mpl-0.16.1/0000755000175100001710000000000014266763666013342 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6842363 pytest-mpl-0.16.1/.github/0000755000175100001710000000000014266763666014702 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/.github/release.yml0000644000175100001710000000061514266763645017044 0ustar00runnerdocker# .github/release.yml changelog: exclude: labels: - ignore-for-release-notes authors: - pre-commit-ci[bot] categories: - title: Fixes labels: - bug - title: Exciting New Features 🎉 labels: - enhancement - title: Other Changes labels: - "*" - title: Infrastructure Changes labels: - infrastructure ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6842363 pytest-mpl-0.16.1/.github/workflows/0000755000175100001710000000000014266763666016737 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/.github/workflows/test_and_publish.yml0000644000175100001710000000256214266763645023013 0ustar00runnerdockername: CI on: push: branches: - main tags: - 'v*' - '!*dev*' - '!*pre*' - '!*post*' pull_request: # Allow manual runs through the web UI workflow_dispatch: jobs: test: uses: OpenAstronomy/github-actions-workflows/.github/workflows/tox.yml@v1 with: envs: | # Test the oldest and newest configuration on Mac and Windows - macos: py36-test-mpl20 - macos: py310-test-mpl35 - windows: py36-test-mpl20 - windows: py310-test-mpl35 # Test all configurations on Linux - linux: py36-test-mpl20 - linux: py36-test-mpl21 - linux: py36-test-mpl22 - linux: py37-test-mpl30 - linux: py37-test-mpl31 - linux: py37-test-mpl32 - linux: py38-test-mpl33 - linux: py39-test-mpl34 - linux: py310-test-mpl35 # Test different versions of pytest - linux: py310-test-mpl35-pytestdev - linux: py310-test-mpl35-pytest62 - linux: py38-test-mpl35-pytest54 coverage: 'codecov' publish: if: github.event_name != 'pull_request' needs: [test] uses: OpenAstronomy/github-actions-workflows/.github/workflows/publish_pure_python.yml@v1 with: test_command: pytest $GITHUB_WORKSPACE/tests; pytest --mpl $GITHUB_WORKSPACE/tests secrets: pypi_token: ${{ secrets.pypi_password }} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/.github/workflows/update-changelog.yaml0000644000175100001710000000154514266763645023034 0ustar00runnerdocker# This workflow takes the GitHub release notes an updates the changelog on the # main branch with the body of the release notes, thereby keeping a log in # the git repo of the changes. name: "Update Changelog" on: release: types: [released] jobs: update: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v2 with: ref: main - name: Update Changelog uses: stefanzweifel/changelog-updater-action@v1 with: release-notes: ${{ github.event.release.body }} latest-version: ${{ github.event.release.name }} path-to-changelog: CHANGES.md - name: Commit updated CHANGELOG uses: stefanzweifel/git-auto-commit-action@v4 with: branch: main commit_message: Update CHANGELOG file_pattern: CHANGES.md ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/.gitignore0000644000175100001710000000012014266763645015320 0ustar00runnerdocker.*.swp .tox .cache *.py[cod] __pycache__ *.egg *.egg-info .idea build dist .tmp ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/.pre-commit-config.yaml0000644000175100001710000000750414266763645017626 0ustar00runnerdockerrepos: # The warnings/errors we check for here are: # E101 - mix of tabs and spaces # E11 - Fix indentation. # E111 - 4 spaces per indentation level # E112 - 4 spaces per indentation level # E113 - 4 spaces per indentation level # E121 - Fix indentation to be a multiple of four. # E122 - Add absent indentation for hanging indentation. # E123 - Align closing bracket to match opening bracket. # E124 - Align closing bracket to match visual indentation. # E125 - Indent to distinguish line from next logical line. # E126 - Fix over-indented hanging indentation. # E127 - Fix visual indentation. # E128 - Fix visual indentation. # E129 - Fix visual indentation. # E131 - Fix hanging indent for unaligned continuation line. # E133 - Fix missing indentation for closing bracket. # E20 - Remove extraneous whitespace. # E211 - Remove extraneous whitespace. # E231 - Add missing whitespace. # E241 - Fix extraneous whitespace around keywords. # E242 - Remove extraneous whitespace around operator. # E251 - Remove whitespace around parameter '=' sign. # E252 - Missing whitespace around parameter equals. # E26 - Fix spacing after comment hash for inline comments. # E265 - Fix spacing after comment hash for block comments. # E266 - Fix too many leading '#' for block comments. # E27 - Fix extraneous whitespace around keywords. # E301 - Add missing blank line. # E302 - Add missing 2 blank lines. # E303 - Remove extra blank lines. # E304 - Remove blank line following function decorator. # E305 - expected 2 blank lines after class or function definition # E305 - Expected 2 blank lines after end of function or class. # E306 - expected 1 blank line before a nested definition # E306 - Expected 1 blank line before a nested definition. # E401 - Put imports on separate lines. # E402 - Fix module level import not at top of file # E502 - Remove extraneous escape of newline. # E701 - Put colon-separated compound statement on separate lines. # E711 - Fix comparison with None. # E712 - Fix comparison with boolean. # E713 - Use 'not in' for test for membership. # E714 - Use 'is not' test for object identity. # E722 - Fix bare except. # E731 - Use a def when use do not assign a lambda expression. # E901 - SyntaxError or IndentationError # E902 - IOError # F822 - undefined name in __all__ # F823 - local variable name referenced before assignment # W291 - Remove trailing whitespace. # W292 - Add a single newline at the end of the file. # W293 - Remove trailing whitespace on blank line. # W391 - Remove trailing blank lines. # W601 - Use "in" rather than "has_key()". # W602 - Fix deprecated form of raising exception. # W603 - Use "!=" instead of "<>" # W604 - Use "repr()" instead of backticks. # W605 - Fix invalid escape sequence 'x'. # W690 - Fix various deprecated code (via lib2to3). - repo: https://github.com/PyCQA/flake8 rev: 4.0.1 hooks: - id: flake8 args: [ "--count", "--select", "E101,E11,E111,E112,E113,E121,E122,E123,E124,E125,E126,E127,E128,E129,E131,E133,E20,E211,E231,E241,E242,E251,E252,E26,E265,E266,E27,E301,E302,E303,E304,E305,E306,E401,E402,E502,E701,E711,E712,E713,E714,E722,E731,E901,E902,F822,F823,W191,W291,W292,W293,W391,W601,W602,W603,W604,W605,W690", ] - repo: https://github.com/PyCQA/isort rev: 5.10.1 hooks: - id: isort args: ["--sp", "setup.cfg"] - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.3.0 hooks: - id: check-ast - id: check-case-conflict - id: trailing-whitespace exclude: CHANGES.md - id: check-yaml - id: debug-statements - id: check-added-large-files - id: end-of-file-fixer - id: mixed-line-ending - id: check-toml ci: autofix_prs: false ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/CHANGES.md0000644000175100001710000001355414266763645014741 0ustar00runnerdocker## v0.16.0 - 2022-06-14 ### Fixes - Make summary log message about test results in general instead of failures by @neutrinoceros in https://github.com/matplotlib/pytest-mpl/pull/148 - Add support for classes with pytest 7 by @ConorMacBride in https://github.com/matplotlib/pytest-mpl/pull/164 Note that this change necessitated a minor breaking change for figure tests within classes only, and the following will need to be done: - Hash library test names will need to be regenerated/updated to include the class name. - If the undocumented `mpl-use-full-test-name` ini option is enabled, the the baseline images will need to be regenerated, or have their filename updated to include the class name. ### Other Changes - Improve parametrized test names in HTML summaries by @ConorMacBride in https://github.com/matplotlib/pytest-mpl/pull/165 ### Infrastructure Changes - Pin tox environment `mpl35` to matplotlib 3.5.1 by @ConorMacBride in https://github.com/matplotlib/pytest-mpl/pull/162 - [pre-commit.ci] pre-commit autoupdate by @pre-commit-ci in https://github.com/matplotlib/pytest-mpl/pull/167 - Improve `tests/subtests` by @ConorMacBride in https://github.com/matplotlib/pytest-mpl/pull/163 **Full Changelog**: https://github.com/matplotlib/pytest-mpl/compare/v0.15.1...v0.16.0 ## v0.15.1 - 2022-04-22 ### Fixes - Add test for image shape mismatch and fix bug by @ConorMacBride in https://github.com/matplotlib/pytest-mpl/pull/145 **Full Changelog**: https://github.com/matplotlib/pytest-mpl/compare/v0.15.0...v0.15.1 ## v0.15.0 - 2022-04-21 ### Features - Remove Python 2 from package classifiers by @dopplershift in https://github.com/matplotlib/pytest-mpl/pull/137 - Downloadable hash library in HTML summary by @ConorMacBride in https://github.com/matplotlib/pytest-mpl/pull/138 ### Fixes - No need to warn when falling back to other URL by @pllim in https://github.com/matplotlib/pytest-mpl/pull/139 - Automatically update changelog in the repo after release by @Cadair in https://github.com/matplotlib/pytest-mpl/pull/143 **Full Changelog**: https://github.com/matplotlib/pytest-mpl/compare/v0.14.0...v0.15.0 ## 0.14 (2022-02-09) - Add `--mpl-results-always` flag which disables removing of test images for - tests which pass. Test images are also stored and generated for hash tests - when a baseline dir is also provided. [#108] - - When generating a HTML summary page, the `--mpl-results-always` flag is - automatically applied. [#131] - - Add a `--mpl-generate-summary=json` option which saves a JSON summary of the - image comparison results. [#127] - - Add a significantly improved HTML summary page, and rename the old simple - summary page to `basic-html`. [#128] - - Various bugfixes, test improvements and documentation updates [#134] - ## 0.13 (2021-07-02) - Ensure all test files are included in the sdist. [#109] - - Print hash for new figure tests. [#111] - - Do not error if a baseline image can not be retrieved when using figure hashes. [#118] - - Allow generation of hash library and testing against hash library simultaneously. [#121] - ## 0.12.1 (2021-07-02) - Fix specification of required Python version in setup.cfg. [#122] ## 0.12 (2020-11-05) - Fix passing a https url for baseline images from the CLI. [#89] - - Added `--mpl-baseline-relative` option to specify baseline images relative to the test path. [#96] - - Add option to do comparisons against a json library of sha256 hashes. [#98] - - Drop support for matplotlib 1.5 and Python < 3.6. [#100] - - Add support for generating a HTML summary of test faliures. [#101] - - Add support for falling back to baseline image comparison if hash comparison fails. [#101] - ## 0.11 (2019-11-15) - Improve error message if image shapes don't match. [#79] - - Properly register mpl_image_compare marker with pytest. [#83] - - Drop support for Python 3.5 and earlier, and Matplotlib 1.5. [#87] - ## 0.10 (2018-09-25) - Improve error message when baseline image is not found. [#76] - - Update compatibility with pytest 3.6. [#72] - - Only close figures if they are a valid Matplotlib figure. [#66] - - Improve tests to not assume pytest executable is called py.test. [#65] - - Make sure local matplotlib files are completely ignored. [#64] - ## 0.9 (2017-10-12) - Fix compatibility with Matplotlib 2.1. [#54] - - Allow baseline_dir to be comma-separated URL list to allow mirrors to - be specified. [#59] - - Make sure figures get closed even if not running with the --mpl - option, and only close actual Matplotlib Figure objects. [#60] - ## 0.8 (2017-07-19) - Fixed use of mpl_image_compare on methods of test classes that also - use setup_method. [#51] - - Make it possible to specify the directory in which to put the results - from the tests using --mpl-results-path. [#39] - - Only import Matplotlib if the plugin is actually used. [#47] - - Make sure figures are closed after saving. [#46] - - Allow the backend to be set on a per-test basis. [#38] - - If test name contains slashes (normally from parameters in - parametrized tests), replace with _. [#50] - ## 0.7 (2016-11-26) - Properly define dependencies in setup.py. [#32] ## 0.6 (2016-11-22) - Added `style` and `remove_text` options. [#20] - - Properly support parametrized tests. [#24] - ## 0.5 (2016-05-06) - Minor fixes to detection of remote baseline directories. - - Minor improvements to documentation. - ## 0.4 (2016-05-04) - Add support for remote baseline images. [#18] - - When providing two conflicting options, warn instead of raising an - exception. [#19] - ## 0.3 (2015-06-26) - Changed default tolerance from 10 to 2. [#9] - - Added `tox.ini`. - - Improvements to documentation - ## 0.2 (2015-06-25) - Added globally-configurable baseline directory with the - `--mpl-baseline-dir` option. [#8] - - Added `baseline_dir` and `filename` options in decorator. - - Improvements to documentation - ## 0.1 (2015-06-25) - Initial version ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/LICENSE0000644000175100001710000000267714266763645014360 0ustar00runnerdockerCopyright (c) 2015, Thomas P. Robitaille All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. The code in this package includes code adapted from WCSAxes, which is released under a 3-clause BSD license and can be found here: https://github.com/astrofrog/wcsaxes ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/MANIFEST.in0000644000175100001710000000022014266763645015067 0ustar00runnerdockerinclude LICENSE include README.rst include CHANGES.md include tox.ini recursive-include tests *.py *.json *.png recursive-include images *.png ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6922362 pytest-mpl-0.16.1/PKG-INFO0000644000175100001710000003215014266763666014440 0ustar00runnerdockerMetadata-Version: 2.1 Name: pytest-mpl Version: 0.16.1 Summary: pytest plugin to help with testing figures output from Matplotlib Home-page: https://github.com/matplotlib/pytest-mpl Author: Thomas Robitaille Author-email: thomas.robitaille@gmail.com License: BSD Classifier: Development Status :: 4 - Beta Classifier: Framework :: Pytest Classifier: Intended Audience :: Developers Classifier: Topic :: Software Development :: Testing Classifier: Topic :: Scientific/Engineering :: Visualization Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Operating System :: OS Independent Classifier: License :: OSI Approved :: BSD License Requires-Python: >=3.6 Description-Content-Type: text/x-rst Provides-Extra: test License-File: LICENSE About ----- This is a plugin to facilitate image comparison for `Matplotlib `__ figures in pytest. For each figure to test, the reference image is subtracted from the generated image, and the RMS of the residual is compared to a user-specified tolerance. If the residual is too large, the test will fail (this is implemented using helper functions from ``matplotlib.testing``). For more information on how to write tests to do this, see the **Using** section below. Installing ---------- This plugin is compatible with Python 3.6 and later, and requires `pytest `__ and `matplotlib `__ to be installed. To install, you can do:: pip install pytest-mpl You can check that the plugin is registered with pytest by doing:: pytest --version which will show a list of plugins: :: This is pytest version 2.7.1, imported from ... setuptools registered plugins: pytest-mpl-0.1 at ... Using ----- With Baseline Images ^^^^^^^^^^^^^^^^^^^^ To use, you simply need to mark the function where you want to compare images using ``@pytest.mark.mpl_image_compare``, and make sure that the function returns a Matplotlib figure (or any figure object that has a ``savefig`` method): .. code:: python import pytest import matplotlib.pyplot as plt @pytest.mark.mpl_image_compare def test_succeeds(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,3]) return fig To generate the baseline images, run the tests with the ``--mpl-generate-path`` option with the name of the directory where the generated images should be placed:: pytest --mpl-generate-path=baseline If the directory does not exist, it will be created. The directory will be interpreted as being relative to where you are running ``pytest``. Once you are happy with the generated images, you should move them to a sub-directory called ``baseline`` relative to the test files (this name is configurable, see below). You can also generate the baseline image directly in the right directory. With a Hash Library ^^^^^^^^^^^^^^^^^^^ Instead of comparing to baseline images, you can instead compare against a JSON library of SHA-256 hashes. This has the advantage of not having to check baseline images into the repository with the tests, or download them from a remote source. The hash library can be generated with ``--mpl-generate-hash-library=path_to_file.json``. The hash library to be used can either be specified via the ``--mpl-hash-library=`` command line argument, or via the ``hash_library=`` keyword argument to the ``@pytest.mark.mpl_image_compare`` decorator. When generating a hash library, the tests will also be run as usual against the existing hash library specified by ``--mpl-hash-library`` or the keyword argument. However, generating baseline images will always result in the tests being skipped. Hybrid Mode: Hashes and Images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is possible to configure both hashes and baseline images. In this scenario only the hash comparison can determine the test result. If the hash comparison fails, the test will fail, however a comparison to the baseline image will be carried out so the actual difference can be seen. If the hash comparison passes, the comparison to the baseline image is skipped (unless **results always** is configured). This is especially useful if the baseline images are external to the repository containing the tests, and are accessed via HTTP. In this situation, if the hashes match, the baseline images won't be retrieved, saving time and bandwidth. Also, it allows the tests to be modified and the hashes updated to reflect the changes without having to modify the external images. Running Tests ^^^^^^^^^^^^^ Once tests are written with baseline images, a hash library, or both to compare against, the tests can be run with:: pytest --mpl and the tests will pass if the images are the same. If you omit the ``--mpl`` option, the tests will run but will only check that the code runs, without checking the output images. Generating a Test Summary ^^^^^^^^^^^^^^^^^^^^^^^^^ By specifying the ``--mpl-generate-summary=html`` CLI argument, a HTML summary page will be generated showing the test result, log entry and generated result image. When in the (default) image comparison mode, the baseline image, diff image and RMS (if any), and tolerance of each test will also be shown. When in the hash comparison mode, the baseline hash and result hash will also be shown. When in hybrid mode, all of these are included. When generating a HTML summary, the ``--mpl-results-always`` option is automatically applied (see section below). Therefore images for passing tests will also be shown. +---------------+---------------+---------------+ | |html all| | |html filter| | |html result| | +---------------+---------------+---------------+ As well as ``html``, ``basic-html`` can be specified for an alternative HTML summary which does not rely on JavaScript or external resources. A ``json`` summary can also be saved. Multiple options can be specified comma-separated. Options ------- Tolerance ^^^^^^^^^ The RMS tolerance for the image comparison (which defaults to 2) can be specified in the ``mpl_image_compare`` decorator with the ``tolerance`` argument: .. code:: python @pytest.mark.mpl_image_compare(tolerance=20) def test_image(): ... Savefig options ^^^^^^^^^^^^^^^ You can pass keyword arguments to ``savefig`` by using ``savefig_kwargs`` in the ``mpl_image_compare`` decorator: .. code:: python @pytest.mark.mpl_image_compare(savefig_kwargs={'dpi':300}) def test_image(): ... Baseline images ^^^^^^^^^^^^^^^ The baseline directory (which defaults to ``baseline`` ) and the filename of the plot (which defaults to the name of the test with a ``.png`` suffix) can be customized with the ``baseline_dir`` and ``filename`` arguments in the ``mpl_image_compare`` decorator: .. code:: python @pytest.mark.mpl_image_compare(baseline_dir='baseline_images', filename='other_name.png') def test_image(): ... The baseline directory in the decorator above will be interpreted as being relative to the test file. Note that the baseline directory can also be a URL (which should start with ``http://`` or ``https://`` and end in a slash). If you want to specify mirrors, set ``baseline_dir`` to a comma-separated list of URLs (real commas in the URL should be encoded as ``%2C``). Finally, you can also set a custom baseline directory globally when running tests by running ``pytest`` with:: pytest --mpl --mpl-baseline-path=baseline_images This directory will be interpreted as being relative to where pytest is run. However, if the ``--mpl-baseline-relative`` option is also included, this directory will be interpreted as being relative to the current test directory. In addition, if both this option and the ``baseline_dir`` option in the ``mpl_image_compare`` decorator are used, the one in the decorator takes precedence. Results always ^^^^^^^^^^^^^^ By default, result images are only saved for tests that fail. Passing ``--mpl-results-always`` to pytest will force result images to be saved for all tests, even for tests that pass. When in **hybrid mode**, even if a test passes hash comparison, a comparison to the baseline image will also be carried out, with the baseline image and diff image (if image comparison fails) saved for all tests. This secondary comparison will not affect the success status of the test. This option is useful for always *comparing* the result images against the baseline images, while only *assessing* the tests against the hash library. If you only update your baseline images after merging a PR, this option means that the generated summary will always show how the PR affects the baseline images, with the success status of each test (based on the hash library) also shown in the generated summary. This option is applied automatically when generating a HTML summary. When the ``--mpl-results-always`` option is active, and some hash comparison tests are performed, a hash library containing all the result hashes will also be saved to the root of the results directory. The filename will be extracted from ``--mpl-generate-hash-library``, ``--mpl-hash-library`` or ``hash_library=`` in that order. Base style ^^^^^^^^^^ By default, tests will be run using the Matplotlib 'classic' style (ignoring any locally defined RC parameters). This can be overridden by using the ``style`` argument: .. code:: python @pytest.mark.mpl_image_compare(style='fivethirtyeight') def test_image(): ... Package version dependencies ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Different versions of Matplotlib and FreeType may result in slightly different images. When testing on multiple platforms or as part of a pipeline, it is important to ensure that the versions of these packages match the versions used to generate the images used for comparison. It can be useful to pin versions of Matplotlib and FreeType so as to avoid automatic updates that fail tests. Removing text ^^^^^^^^^^^^^ If you are running a test for which you are not interested in comparing the text labels, you can use the ``remove_text`` argument to the decorator: .. code:: python @pytest.mark.mpl_image_compare(remove_text=True) def test_image(): ... This will make the test insensitive to changes in e.g. the freetype library. Test failure example -------------------- If the images produced by the tests are correct, then the test will pass, but if they are not, the test will fail with a message similar to the following:: E Exception: Error: Image files did not match. E RMS Value: 142.2287807767823 E Expected: E /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/baseline-coords_overlay_auto_coord_meta.png E Actual: E /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/coords_overlay_auto_coord_meta.png E Difference: E /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/coords_overlay_auto_coord_meta-failed-diff.png E Tolerance: E 10 The image paths included in the exception are then available for inspection: +----------------+----------------+-------------+ | Expected | Actual | Difference | +================+================+=============+ | |expected| | |actual| | |diff| | +----------------+----------------+-------------+ In this case, the differences are very clear, while in some cases it may be necessary to use the difference image, or blink the expected and actual images, in order to see what changed. The default tolerance is 2, which is very strict. In some cases, you may want to relax this to account for differences in fonts across different systems. By default, the expected, actual and difference files are written to a temporary directory with a non-deterministic path. If you want to instead write them to a specific directory, you can use:: pytest --mpl --mpl-results-path=results The ``results`` directory will then contain one sub-directory per test, and each sub-directory will contain the three files mentioned above. If you are using a continuous integration service, you can then use the option to upload artifacts to upload these results to somewhere where you can view them. For more information, see: * `Uploading artifacts on Travis-CI `_ * `Build Artifacts (CircleCI) `_ * `Packaging Artifacts (AppVeyor) `_ Running the tests for pytest-mpl -------------------------------- If you are contributing some changes and want to run the tests, first install the latest version of the plugin then do:: cd tests pytest --mpl The reason for having to install the plugin first is to ensure that the plugin is correctly loaded as part of the test suite. .. |html all| image:: images/html_all.png .. |html filter| image:: images/html_filter.png .. |html result| image:: images/html_result.png .. |expected| image:: images/baseline-coords_overlay_auto_coord_meta.png .. |actual| image:: images/coords_overlay_auto_coord_meta.png .. |diff| image:: images/coords_overlay_auto_coord_meta-failed-diff.png ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/README.rst0000644000175100001710000003052314266763645015031 0ustar00runnerdockerAbout ----- This is a plugin to facilitate image comparison for `Matplotlib `__ figures in pytest. For each figure to test, the reference image is subtracted from the generated image, and the RMS of the residual is compared to a user-specified tolerance. If the residual is too large, the test will fail (this is implemented using helper functions from ``matplotlib.testing``). For more information on how to write tests to do this, see the **Using** section below. Installing ---------- This plugin is compatible with Python 3.6 and later, and requires `pytest `__ and `matplotlib `__ to be installed. To install, you can do:: pip install pytest-mpl You can check that the plugin is registered with pytest by doing:: pytest --version which will show a list of plugins: :: This is pytest version 2.7.1, imported from ... setuptools registered plugins: pytest-mpl-0.1 at ... Using ----- With Baseline Images ^^^^^^^^^^^^^^^^^^^^ To use, you simply need to mark the function where you want to compare images using ``@pytest.mark.mpl_image_compare``, and make sure that the function returns a Matplotlib figure (or any figure object that has a ``savefig`` method): .. code:: python import pytest import matplotlib.pyplot as plt @pytest.mark.mpl_image_compare def test_succeeds(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,3]) return fig To generate the baseline images, run the tests with the ``--mpl-generate-path`` option with the name of the directory where the generated images should be placed:: pytest --mpl-generate-path=baseline If the directory does not exist, it will be created. The directory will be interpreted as being relative to where you are running ``pytest``. Once you are happy with the generated images, you should move them to a sub-directory called ``baseline`` relative to the test files (this name is configurable, see below). You can also generate the baseline image directly in the right directory. With a Hash Library ^^^^^^^^^^^^^^^^^^^ Instead of comparing to baseline images, you can instead compare against a JSON library of SHA-256 hashes. This has the advantage of not having to check baseline images into the repository with the tests, or download them from a remote source. The hash library can be generated with ``--mpl-generate-hash-library=path_to_file.json``. The hash library to be used can either be specified via the ``--mpl-hash-library=`` command line argument, or via the ``hash_library=`` keyword argument to the ``@pytest.mark.mpl_image_compare`` decorator. When generating a hash library, the tests will also be run as usual against the existing hash library specified by ``--mpl-hash-library`` or the keyword argument. However, generating baseline images will always result in the tests being skipped. Hybrid Mode: Hashes and Images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is possible to configure both hashes and baseline images. In this scenario only the hash comparison can determine the test result. If the hash comparison fails, the test will fail, however a comparison to the baseline image will be carried out so the actual difference can be seen. If the hash comparison passes, the comparison to the baseline image is skipped (unless **results always** is configured). This is especially useful if the baseline images are external to the repository containing the tests, and are accessed via HTTP. In this situation, if the hashes match, the baseline images won't be retrieved, saving time and bandwidth. Also, it allows the tests to be modified and the hashes updated to reflect the changes without having to modify the external images. Running Tests ^^^^^^^^^^^^^ Once tests are written with baseline images, a hash library, or both to compare against, the tests can be run with:: pytest --mpl and the tests will pass if the images are the same. If you omit the ``--mpl`` option, the tests will run but will only check that the code runs, without checking the output images. Generating a Test Summary ^^^^^^^^^^^^^^^^^^^^^^^^^ By specifying the ``--mpl-generate-summary=html`` CLI argument, a HTML summary page will be generated showing the test result, log entry and generated result image. When in the (default) image comparison mode, the baseline image, diff image and RMS (if any), and tolerance of each test will also be shown. When in the hash comparison mode, the baseline hash and result hash will also be shown. When in hybrid mode, all of these are included. When generating a HTML summary, the ``--mpl-results-always`` option is automatically applied (see section below). Therefore images for passing tests will also be shown. +---------------+---------------+---------------+ | |html all| | |html filter| | |html result| | +---------------+---------------+---------------+ As well as ``html``, ``basic-html`` can be specified for an alternative HTML summary which does not rely on JavaScript or external resources. A ``json`` summary can also be saved. Multiple options can be specified comma-separated. Options ------- Tolerance ^^^^^^^^^ The RMS tolerance for the image comparison (which defaults to 2) can be specified in the ``mpl_image_compare`` decorator with the ``tolerance`` argument: .. code:: python @pytest.mark.mpl_image_compare(tolerance=20) def test_image(): ... Savefig options ^^^^^^^^^^^^^^^ You can pass keyword arguments to ``savefig`` by using ``savefig_kwargs`` in the ``mpl_image_compare`` decorator: .. code:: python @pytest.mark.mpl_image_compare(savefig_kwargs={'dpi':300}) def test_image(): ... Baseline images ^^^^^^^^^^^^^^^ The baseline directory (which defaults to ``baseline`` ) and the filename of the plot (which defaults to the name of the test with a ``.png`` suffix) can be customized with the ``baseline_dir`` and ``filename`` arguments in the ``mpl_image_compare`` decorator: .. code:: python @pytest.mark.mpl_image_compare(baseline_dir='baseline_images', filename='other_name.png') def test_image(): ... The baseline directory in the decorator above will be interpreted as being relative to the test file. Note that the baseline directory can also be a URL (which should start with ``http://`` or ``https://`` and end in a slash). If you want to specify mirrors, set ``baseline_dir`` to a comma-separated list of URLs (real commas in the URL should be encoded as ``%2C``). Finally, you can also set a custom baseline directory globally when running tests by running ``pytest`` with:: pytest --mpl --mpl-baseline-path=baseline_images This directory will be interpreted as being relative to where pytest is run. However, if the ``--mpl-baseline-relative`` option is also included, this directory will be interpreted as being relative to the current test directory. In addition, if both this option and the ``baseline_dir`` option in the ``mpl_image_compare`` decorator are used, the one in the decorator takes precedence. Results always ^^^^^^^^^^^^^^ By default, result images are only saved for tests that fail. Passing ``--mpl-results-always`` to pytest will force result images to be saved for all tests, even for tests that pass. When in **hybrid mode**, even if a test passes hash comparison, a comparison to the baseline image will also be carried out, with the baseline image and diff image (if image comparison fails) saved for all tests. This secondary comparison will not affect the success status of the test. This option is useful for always *comparing* the result images against the baseline images, while only *assessing* the tests against the hash library. If you only update your baseline images after merging a PR, this option means that the generated summary will always show how the PR affects the baseline images, with the success status of each test (based on the hash library) also shown in the generated summary. This option is applied automatically when generating a HTML summary. When the ``--mpl-results-always`` option is active, and some hash comparison tests are performed, a hash library containing all the result hashes will also be saved to the root of the results directory. The filename will be extracted from ``--mpl-generate-hash-library``, ``--mpl-hash-library`` or ``hash_library=`` in that order. Base style ^^^^^^^^^^ By default, tests will be run using the Matplotlib 'classic' style (ignoring any locally defined RC parameters). This can be overridden by using the ``style`` argument: .. code:: python @pytest.mark.mpl_image_compare(style='fivethirtyeight') def test_image(): ... Package version dependencies ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Different versions of Matplotlib and FreeType may result in slightly different images. When testing on multiple platforms or as part of a pipeline, it is important to ensure that the versions of these packages match the versions used to generate the images used for comparison. It can be useful to pin versions of Matplotlib and FreeType so as to avoid automatic updates that fail tests. Removing text ^^^^^^^^^^^^^ If you are running a test for which you are not interested in comparing the text labels, you can use the ``remove_text`` argument to the decorator: .. code:: python @pytest.mark.mpl_image_compare(remove_text=True) def test_image(): ... This will make the test insensitive to changes in e.g. the freetype library. Test failure example -------------------- If the images produced by the tests are correct, then the test will pass, but if they are not, the test will fail with a message similar to the following:: E Exception: Error: Image files did not match. E RMS Value: 142.2287807767823 E Expected: E /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/baseline-coords_overlay_auto_coord_meta.png E Actual: E /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/coords_overlay_auto_coord_meta.png E Difference: E /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/coords_overlay_auto_coord_meta-failed-diff.png E Tolerance: E 10 The image paths included in the exception are then available for inspection: +----------------+----------------+-------------+ | Expected | Actual | Difference | +================+================+=============+ | |expected| | |actual| | |diff| | +----------------+----------------+-------------+ In this case, the differences are very clear, while in some cases it may be necessary to use the difference image, or blink the expected and actual images, in order to see what changed. The default tolerance is 2, which is very strict. In some cases, you may want to relax this to account for differences in fonts across different systems. By default, the expected, actual and difference files are written to a temporary directory with a non-deterministic path. If you want to instead write them to a specific directory, you can use:: pytest --mpl --mpl-results-path=results The ``results`` directory will then contain one sub-directory per test, and each sub-directory will contain the three files mentioned above. If you are using a continuous integration service, you can then use the option to upload artifacts to upload these results to somewhere where you can view them. For more information, see: * `Uploading artifacts on Travis-CI `_ * `Build Artifacts (CircleCI) `_ * `Packaging Artifacts (AppVeyor) `_ Running the tests for pytest-mpl -------------------------------- If you are contributing some changes and want to run the tests, first install the latest version of the plugin then do:: cd tests pytest --mpl The reason for having to install the plugin first is to ensure that the plugin is correctly loaded as part of the test suite. .. |html all| image:: images/html_all.png .. |html filter| image:: images/html_filter.png .. |html result| image:: images/html_result.png .. |expected| image:: images/baseline-coords_overlay_auto_coord_meta.png .. |actual| image:: images/coords_overlay_auto_coord_meta.png .. |diff| image:: images/coords_overlay_auto_coord_meta-failed-diff.png ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/RELEASING.md0000644000175100001710000000116014266763645015170 0ustar00runnerdocker# Making a Release of pytest-mpl To make a new release of pytest-mpl follow the following steps: * Ensure the sdist and wheel GitHub Actions jobs succeeded on main after the last merge. * Also ensure that the tarball built has an autogenerated version number from setuptools_scm. * Write the release notes in the GitHub releases UI, use the autogenerated notes and tidy up a little. * Publish the new release, using the format `vX.Y.X`. * Watch as GitHub actions builds the sdist and universal wheel and pushes them to PyPI for you, and updates CHANGES.md on the main branch. * Enjoy the beverage of your choosing 🍻. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6842363 pytest-mpl-0.16.1/images/0000755000175100001710000000000014266763666014607 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/images/baseline-coords_overlay_auto_coord_meta.png0000644000175100001710000006476014266763645025365 0ustar00runnerdockerPNG  IHDR6sBIT|d pHYsaa?i IDATxyTT? "Ȫ F&.(/m~OMM&i~k4""hWdEAesYDe`>?ҙ2 3sgu';pg|x1B!DF| (B %B!rB!D.@!ȅ!P!"J BB B\(B %B!rB!D.@!ȅ!P!"J BB B\(B %B!rB!D.@!ȅ!P!"J BB B\(B %B!rB!D.@!ȅ!P!"J BB B\(B %B!rB!D.@!ȅ!P!"J d/_ҥKajj '''ڵ 2׿+V1 cܹ¢E`dd<}wpuu-Ic/###xxxO?tܽ{ӟ055ELL ***&sqq(29>??9sN,??|>:::6s\@ρPXXxD@@#)))я~^z ;w҂P|>/_~/)ƍQ]]} }P^^WWW%DV8`ݺuя~$mŊR?cᥗ^)&}\9FC.\BԶfhhȞz)ɶT؉' 60WWW3/ٳG[o~mσښmٲEy{ecKOOld,11Q{Qes<KsnƆk系wJ=m"CWW lӟիWc˖-`gΜ}0| ctttұlcc~ϟGww7~I=^@?N<)_c…غud5v܉'N@( sn! O9;~ssIm%2co߆5())U_055+Ҥ'`ccX7nDSS`|WFYY<0{ɁR ϗ\QQ AAAx%x< Q&y9$HII0Qo ;;;?2^;績"_x,))1XEExښٱ/`ٳg%}W$c7n͛Ա^z%gwz_dzzzhkk+u+Ԕ=Ɲ:u|v9_|9c,,,qMFWW/"z{{QVV6ιT?~dv4^2>.\(y` ϳP(͛7X>+++8&;;;KroB!޽+9xl{{}Kԃι8::SٷoÎ;;9{- s@Ȥڵk̄vvvXp!Z[['<7r`` c Btuufq-_1\x=d{ii)D"/_.56??>`ll ("Ϲ\~d:皛qa$''Ox, ˗/Gyy9-<績F۲e ggΜrܫ|E~nnn6o,6<<,Xd_||>g T$55usNsss+Ps2'NL|>KNNfْvc$F˫O>[l$&&5Ɋ+000^{ fff/҂",]T_x駱rJI{0SSS:&QEslޞ0KKKa٘jcu!4^B!rB!D.@!ȅ!P!"Dٳg쬒4===Pq撚x{{s4<7EshlleZ@Ξ={r!d;t萤qӪ 64GJ=ցPRR4qpD~i "pIlٲ:tttTv|Ƙd}ڨ#uz]yܸqcҞUDx _|QŞjjjw^q!J1lI(Jss3311rmu_ff\ q-ŜYSSʎLMMٽ{kNuihh`Ƭ[}\~0WWWj3%2U'H@TΝ;'][̌#jjjpuTWWk׮Ҏ9<<'xw`ffŋk6ﭖ,Y7nO#BBBTzi4ފimmE?pʜM6!00_5***}'-- طoRO:::e˖!!!fffHNNƭ[߹566os+qÇqV~r1pzxTUUÃz@+峢ݻwMMMJۿs´|>yf!##cme! v)Ǩk_ )햣q,_ǎCeeҮ5V&-7+eΝC\\\38O?u3bff۷))) SS)hkj\.r VZc9::"11<@JJ ~LM Daii)Rdvܰg#-- 2uuu TBDbccU6M^GGشiΟ?TB[]QQP . ""PӧO#??ccc3~~FFbcc5Q[566B__*?9`ɒ%Sy "$$zzz\f455=97n܀1T!QQ ::8+`ƍشi߿i<\2Kסh=̙;wʕ+o1000Q!**JAY+,,ʕ+ahhu(xڊ:2 1ddd`ݺu\B144ƍtO9SPPUV(<C033Cnn.>sCQ9J P]] '''s vD(ø}6uttE_2s1;w֭Sהּ|V&rBeetT|>W222`bbNlڴI-]z:ot",DFFR 1o>>011:"v EM\;bnnCͨvH$Bff&L Q__C!2òe˰k.\r'Nv^ii)}`Sc@dk SVVOOikGV\tї>2C7n܀.\u(D6K׎"99YR;BT/##C[k}m/H,Q׎"jtJHvLMM`C!Ӡ+ޡ͛022Yv)Z*  QPP@}4%GQ;FGGH\HKKCOO"$SCpp0OQY"݇e aAQQ"""̒&1{{{8;;#$$ɸq!CNNB%rڑCRBOOP,i}ł lTVV"..:<2BАP&;bll9lHݝPhȍ7`bb"Yׯǚ5kp C$q%yXoo/ZZZtRCQSSSlݺ8r^:'oknMM U'[fHLL:H&5c\d$&&Gs#puu"9Dk,Y2ر188(`cc3g["22qqqڑQÚAAA\BH+_ΝclFڍyf#-- s&AqqVطԎ$''k|@ @LLO&|2qtt޽{188ÇOZNKb_[fkGPSSǏkdHSSttth"C! $2?#$$7oF^^222022ôž6l؀ ŋs,nMEsV%v~̰}vPU;?׎D"pVXӭԴD|ա"|TUUaݺu~[Dq*++=\;bddhEss"UW vZ={sb֌ޡĵ#jY;2[ ⎫VVVE233i4ԵvdO&?wx<"!! HOOKc577Gxv`tpb A D -QBCC%D"-u*#q툥%qMNFXX'kբD .(rN3vǏGʎс~옄;@l|Krj2}}}y&-u: ڑիWoQI:MOc˖-e222vZvvvHLLc hooWڱN hJ *F-Qsssrʜj*<(**™3g0<LjHOOk777$%%aƍFhh(رc8x ~m\rO>$%HNNNX|9=!KIOA(HNNFtth0ֆ8;;s yvuGQRRD -P f@JJJ?੧ҥKo>=`͚5(((4ųGGGlmmQVV#]]]޽(^^^DllD֭[LO>$n޼#G`ʕhnnf ;]]]Ib~3… hmm-U666R_\e,wD(eee򂉉 סpqqAbb"p9Zy!TVVRۃCee% $$Gmm-ӑ5<aee_|[XYx15%J?jkku(D:::ǫ `tlf| ;; /[@GG?{{{Ǿ}H3g>CUU%m0'BBB닌 !22R+֮]Km/4Yŋ舚$9P,Yf@a``0aqqr666&ڿ;w;~m;v ;w{s%ʵkא xyyUYcc# fu^7KLLL\CBp.]B\\܄;dnG@##I;x IxS^{ <o {AGGZDCNNH  66vU{1?v=3N vvvo6 aee5psղ%Jaa!텆ijj޴#^wlK]aJ aꂍ9p@j[pp0~YF>b W//zzU$Imafx<K 3www:Hx"xdž'l/|>;q+++cXrūؙ3gXzz:zJ!55uuu)mJF屪Lܸq%%%j&z})+:HPPoےJ&)i/AoovoEss3_Ƽyс+V`9sOƍe-Q:::p xxx`ʕ*%i{aeEss3֬Y#]\\Bb `k IDATuTpSdao>fooόիYFFYٙI5551e?я355eFFFlٲelttTc2W D"VVVƾ+">e$622}]D]5u{.;rfBPy}}}8p@V3Ys?gu2d-Qbbb%''Л粺:^5ZZZbΝ?Ԏ$'#<b $Cvv6bbbeRkGvDP!2OArr2Z[[% "VdjEEEWZ'Es %"@l۶ 'ODuu5͹޽{hjjס^KinP!b``޽[i-Qrddd ..Nx)--ӧ%+բBf+W%JJJ :;;LZk&&&x'T%"Zlڴ 999nBO(… :pvv޽{ӃTܽ{됴%"Ν;7-sssرNNN(D}"$$dNAxx8֯_@lQJ D.X`EorQ0B2NÃPB\;bkkd\~4J Df###())AXX#ǎoriallLQ1$_ekG]tܿ$J Df9992aeeXXXСC3Z(žL׎ĉT;@Lܹ>֋iKxbjGG9K9I| dͳڏ%JGG?\R-UZb_\;@===А4cɌ]t ... [ep(DZZZO툏RSSQ]]M#@ ~ d|UqYYN:AC[rZ׎ȑ#T;"'EfD٫ `˖-hjjBZZqm6MII .]J-'!AFFlmm&mGW TʠDQ>\~Z?`%2-.V(A-g ~:Վ%2/LJ[ E~ׯ_),Xu(֭ڑBߏzp%J[[DQ#**P4Վ }[D6@pi,ZZ[0|A__P4Վ<]IݼyFFFXp!סH(Ӹ{.n߾ ///C3ĵ#8z(ՎC L066\DGGsʤ-QvڅZ?~Z?֭[Wsx{p\|8G סL6l@{{;Dp‚P,pvv:4Nh;L---:Cbb"|~9<<2rV?>_m۶?r%"ܹsy aʕضmJKKq) qʜ?TEB<ԄJL@D][]eP=gUU՜³pqq:dmm 8pPTB]pCQߟ-Qc̜ j`CP9%\COOPFGGk֬ҥK#22rN?\B]tvvvv\(/ÇQWWuH 100r R@c ֭:={ڊ4o"Ӗ |2annu(*pKGGGh\K&ޞP.Zlhh :D177ǡCuH3666lp r@qaٲeصkjjj4%ʅ @M(hv km -QV^oj[Uۋf,]PD"233Uʠ&޽{Զ%JFF4SKt-T^^NSD^ \B:T;03ZܺiK͙Ndne233C3$i28tuuqG^^BBBT=,<3􄉉 \]]sϡcQ{puu!\]]~MЀ̛7?ϥ> / ֯_{{{! 2?K,)h[nAGG\Qttt6mBvv6233! UvNCe$o ''۶m{n=zsDwڵk' 22^xq1ر-7O?<~ _㏱dg?3<3!Ʒz կ~z|prr)++cX\r'{ԃV]@fkSWWǒXmm+Xrr2UB猄KY˛-77x<;H2~J}יlc/f"1ٳgYXX.v O~|>~d[kk+g/X󃑑סh}ރ!\tI+ۄ@ԬaAݙżp-|v~_ORǭ RT;C|K=fdd$}6%9V>סh;;;$&&ŋ񁉉"$P__1---Ǜn:XXXɓި˗6<{wRR~_g?| MZŪݍDDDpVDyD~#11QEEs=q˗/@ ڶpB?g׭[QdggOxgP:u "qqq2~ {饗k ˗/m/4Ymm-,XKKKC!䄽{GA\\܄7oބ) 555p)DEEɵ={< \+WH355O###Xj@پ}=322bWf԰3SSSfiiɞz))5x<31W߾}E˗/OP $& e2}_^vQ&$B!KJJbCCC ;J9\\\o~YU;;;3>??~!aʊmݺUUU|){79 344d˖-c%x Y鱂ɘfmm٧~YZZ+VHllld|>_"βYJJ R;w544dc05%6(uuu,77W s3fDSqr kz),]C~~>`DeeU$<쳒}29_p!.\dddaaaΝ;냛ס N:,:$"P\|P84cǎAWWWjւy\pARM\{lll,<<<&ܯ- ܹvvv8|2atuu1<<^xAi-Qr!88Xs@*++1%((1TVV wʕ+'.b|}a._j9UQEQTT$XVNˑ~/ҋb /^,_\w[r=w!=Pu5#"(w,Q~"<<`2oޭ}5 zm.]aCh茟c IHAҥXtz%L[[pz >o&n߾ 777$%% ?$z-;v QQQxWp}|GvGkk+k @% 333-4",DEEjƒۋ XYY!<<\#_5؟g}W_šC+`ll 'OĚ5k$c-Z7G}ΝS7166IQ[nAGGG?*/Vϟx888hd񫦸>u(jn8p @ я\AVcccF||BKKmoOOO,Yt֭[G $7`x'퍣GJ XO%S(ԩS(((PWMq S)PQggg$&&HIIAggׇ7n_U2[ yСChjjR1QɽƇ6ЪTMGGk֬ҥK!`ffHѥfUMYYYڵk ``ժUsn9E+077ₔ\zUZׯ_#I&͛044o/RKFGGԺd"J *DܹsGEww7::|DFF*9BHccc% cL%5ft?=bBww7222`AWw_Eaa!V\I '>UV[炚,\\ #عs',Xd444L:mmmQqd6z{{___C2~`jj*:KP TLx<{n455رcwq\{(FxxwЫvZtvvɓprrBpp0]kkkXYYq"A]]`mmu(z%%"""Ԫ˃*utt```K,:AW jwƼy󐔔\Ed  QTTQ7qKEimK2(#J jF<fffiYS ={yԹ7oסhJ j xǏ𫹮.twwÃP&n'OjEK\zfqzcbb"p!p!n:CQStKZA~􊩙+W`ѢE?dC@@v؁ |w*_LpttS]pŷSw܉+Wĉ:,fFYYBX7oƊ+p1~5044 pRLe.wbbbEcQQ#9ZnѢEػw/B!ѡdΟ?Y2 ZK"@ DMttt3zj<䓸pΜ9!%GIގa8;;sJ[<(..J<ݻ&qFcڵke~)n OOOjMbi:qK/{{<ԽS*++:9...ZL 055:θj\KzXXXƆP4% AAAޗ5ŦM@DI600r ݆ ,BÚP(ą u(s%eee!**Jsͱc899!%%u{APDΝ;࠶-Qrssjmm/^cϞ=i+2='vލ[nUKqOOOC3/GD"m6GOOOj b͚5ԮZNځxCQkSujS 89\EW )++7LLLTr<V666HNNƵkTrܹjd.-Qĝwx G S<>>>ؽ{7n޼Zmn/h>466R퀌n2449)K@8 t}}}!<<'ODaa︪Xv-(eee*ܑ9) @T zzz:b055šCD#S333rDSzK6Bj@Thll 999: ]vjk+?N X=dtt:9#((?-QNVxKHT O-544Ć˱zj?~%%%տ \2HZxy!55/_Vm-UOTF@T7n܀?סLKuHFGG\&nӃ#Gݻ$ IDAT_?'U %,C`` oߎ2|:,:&4ñadffΪ%@ @ll,ޔ ܸq&&&X`ס[l?PQQU-Qjkk`XZZrVDÇ a``;;;%EH(((u(rstt޽{1<<ÇkV###())AXXסh-///޽MMM3nU2gd.\@`` eV|> @cccDEEiTrrrx%3V^=eMGaa!`hhH](Qoo/ZZZu( 3o>>011՜~#Qm[l#>:C .]իWs $&&bhhӟuHZcI\سgpQpLΟ?OM4 y\xgΜ0ai J v]tvvˋP8hٳ(a=鞓סtvv˗/֭[9g'w#J 4rYYYYa׮]Brr2_uHS{i LDW‚Pǃ/ܐJũ{ NNN077ڮp ##666 Ӻ[ʪ@W 222RYPԎ֭[p|wjjjj鞆Dee%caax<%GŞ={$`\=OoMryDEE=rǓ% z(@gg'ݻG30S!3A%""qV J D_Hj}R.`EM4l'۷o+lׯ_Ǽy`kk}S*|>AAAx'qj2C@e%AHH6oތ={voQkHLMMz7D Dpuużye333öm#Gʕ+r j*+8JL.\P*K,Abb"J-Q@ DFFPPסhݻr{zzooo%EH͜2_8rrr&=nTT[l#f|>555M;`e?r8qt0(;}4{W٭[9(_H>,I<ߗ2CQ]|Xp!n*fmm;wĉR3a`ccb0 K711eJrccclvƔT >(\\pA+o/h˗/Q 44TnF l [oׯ?G[[&&&7oJS-,Hk祩7ܴi###:tZw9jNyf|^{{;"##'likk/wELL adddbbbl2 رcЀɸH,SZZKX&p;Ln3a DPTDШ94 1vTd7V*IU6MoS{Y+lva$(j8DQPa͔0 3zzy~ iӐӧO#!!0AGE\\MN* Z%hL666`L关gٳH$pvv9oFwL_qFĕ+W OR1u۷gb֬Y4D444P(taQghh'qjEy,--6$ce(p\*fA.ވMMN*X*W %%%q`8\v hhhP{b1kJ{{{ZZZ COM #Nr) T'Jppp;2J* $$$D!!!(**R{sii)b܉I/]a&O*"##kaphEEHbJJ@gݽ8wbcZc`fڿ3}}SƠx\zzpIbbM m6,k6}XͳL$ݻw+)Ɓ p@Yood&Xee8bvQo{\Xi+..fr566 ccPc<.i&U֭/CCCG)k;l߾ǎpꐔ<={pq ~GmùucM]bDGGcƄ 0|b@7n܀X,1VBm>[~=sssclԩS:e-H$Ru]ƒO?옃 g|Ndl+ݻw;w}Y ۾};vkjjضmعsА Qx\w}Ǻ dNNNغu+n:椥ͨ`D~aVmm-a}+//GPPL:())Aff&vt&ן'N`̙tx8cǨVtvvgItSE:=Qt #J xXsy֬Y:'0XI&!)2RYѩ{BAf@p-T,DHw'"ë#'l$&&ِ F߷ 2x400ba2rL8qL)nĉVy+**œ9sqlJJJ0oҋQ!=z |bV-`UPPQCYYbcc %J z=G/MAGG^3g DEEA*R)gD@@襟222ptkэsQLrpB#)) /^޽{ QA D@!p]dff޽{|4k׮O=ߡQx|KEݻj%J caayaCnn.K w(dqy\zzzB&QD D&NիW;v@uuIuk?~aaa;2 Nrh͛J8u&5c@N*"55 #(66ܸqӧO;2 +)SL__ԜQ,--Q|Q^#ƹp !//oԓ\z -- f992(F{zzbǎ|c܌o'Ob:Mr)e˖8|E<%q8<3HMM͛7k.ܿ(Zى+W 44tLۙ0a^~eL6m̢@G dDBBqaMo%%%T+[rrr.G???, ?޽C dsuuErr2\\\&ӧVSl~:>VG1’%KpQ n22J f8<*嵵u999t\`QPP`б:>narbfD1Q^ss3<DEEA,i/_3\\\)1RJCQQpBL4%EW f )))prrBzz:]qq̛7OCkkkC]]f̘a}*7OHH#G4"B Lq3f`͚5|2كQo4@PdA.իF%3gmm{111JJJ088{[ZZԄiӦ8JO0V8!%%W^ݻ[>>|IsdeeiSヴ4HR0ưw^' hڵkUfmC]]-Z@[7!1,[ /w8z#PSS5k 22Wn-ԩSsŋ̨#Q.#--0!Xzz:d2aY%wȑ#H$;B8\~=\]](*BN!D'@!!P!J Bt"ׇ'O"##ަMg}VmpӅ S...\.׸j,^&L ֮]w窱SWWHB}X={,Y...Dؾ}z֭H$Ry|>!|fmiۮL-h۶ ֭0k,deei1uTkl[***H$X,FKKk}b1TæM9<Ā1W_Ş={qFc۶mXt) _|?ϟqexى^{ ^^^ݻ+|roܹs1i$DGGܹs(++Sa޽O? A~~׵~2IzMB[Q4Z nIDATM;@LL o;wDRRv؁5k(׽}6RSSa8::bÆ 9s&fΜ'c oեpO?Deĉu94И;q8oS.a,&&F,%%mݺU{tt4vCCC,$$,7=urYNN8}7eׯ_gDZ]?Fc8wߩk &=!|fmhۮ4mm?L$|͙3yyy~*؇~q׿۸q#D޽{*o۶D"VQQ1b}'#G 仰`aa+Y[[?,2ե2aۈ09Ze={^ɓ JsN}|,DzCCC0`DAv%Զ  qqq*KJJ;wPPP\]kk+>#|jiVfӧ!J࠲|Μ9`(@uu5كs9rz455aj3g*++Uqtt\\\ojjYv%0RV3w۫q;;;0PQQ\۷#??/?կ~5g`aptt-[>!OOOez ? exyyw_ -[TBT>[ZZKKK˽{!,, CCC8|0KTUU!??"siWFj~ӦMCnn.n޼ ooo qJi٨(d2,X!99+WT [nÇoggu!>>͛SN\֎`mdSNe?Zq۲er;s .]rssϖ,Yb=cǎ1خ]D"6Oŏhg1H233 iӮFjۚh`%%%ի>c666L$׫m]xQ>زe˔hRTTD"{7F\waڢWmyOOuQA*bHKK?$$$V۞k5=*tڴ+ڶ&3f ##?`˖-`uԩS3Ϩ-Dii)6oެgADDĸl'OOOeң4uSƪUֆjtvv)666pqqQ{^<Ц] -<޶5ywb ף J[V^ ա7nh<mp<0{ *g>8!!!cھz nnn(//W[lNܽ{nnn|w#P۶&}5klpDcy&vءqnXXBBBFhX[[;.wHo޼YhԤ1WWW600\>ܳ5'ajL$}+DѶ] -hӶ_|9::ƾ}~֬YD"*cMAq۸qKCw^CLLVXb1o>>(++3n M}6+X_hiiAhh(RRR؇ơCtR8p Fv%MۮwbAmm-+899h{Oi&477Y\*"44gφ***'OFYY]"36z{{{Ǽ-`٣Fff&[hdVVVՕ-]j\… l9;;kj<DD"Ɵ:v}vZ&Je3f`ӟTmەmhTlllؔ)S؆ 4^!IOa}G,,,M4Y[[3D|M:D @! BiB!D'@!!P!J BtB BN(B %B!:B!D'@!!P!J BtB BN(B %B!:B!D'@!!P!J BtB BN(B %B!:B!D'@!!P!J BtB BN(B %B!:B!D'@!!P!J BtFH*…IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/images/coords_overlay_auto_coord_meta-failed-diff.png0000644000175100001710000002221114266763645025716 0ustar00runnerdockerPNG  IHDR6sBIT|d IDATx=W_=<Ĩ;YV`mAdNf-8e6$X4-3 c Hl6$6‰,` d ְt ޠvuWWSSN{nNx"Pq"@F #`0B!@F #`0B!@F #`0B!@F #`0B!@F #`-|Ӥlֲ&*SV6JQ>|߯TNe畽|ϝ;WkcFA0 %m7a-e㿓e՛U"EA,n_[ڌaHodWWW[?9|G}3va+4 0dPIõ{nyȒ'-S\|=ˌ[md|Q/+}ɳAPZqDUee:+ŬJת1dOd;؞] vb>zhc믥3l PQcx suNWmS?<[8-ORe&ڷgϞg2l>1h)k!R e+d&277iX,Mfӟɓ'O·!}7olu}=#ynyF5 $]W&W[U޽[+(+״xZ]d ȕuoDx2Z(rӣ=( @.ǂxs_zTGR󝯷/fZ@F #`i׺2a#Nf ‚E>vE~]s-#صT\{oæѣa/KԱpD/g~3&{Kaw폟.Is[ܹޗw_r+ V%}lIfi^IҐ.\0O~ێ׊?׍uxllGvMIJ_}7F^0=XӁ$/Q= MIJ{?.ݐ cB2F?F7s< +V6$K7iƹZtR]M{W-dihH-I϶R{FKd١$]\V!Z qc>}pd< I 6cб{~.ڊCwZPzU7ZL ?xHh,w;kc#FN*'dC}sl+5ZӓtF>D'Z蜜@kvyڱqы4q:H:Ԙ&γ.YWCXHL~J@ dGm1 $VwaGl+}7A+]27ՉS U zw#$\P&6ұ1IzFCX)eGfM)Hrk^!,}TڱAArVnڠFJfA\GD9@ $TR/\N%;dit[>M%:`kg3RfC~f@d  .9!K@wʋH.[8) @˥꙾`@j׭d؜@Cd (tH#\\"d \ps W6 HC.o8ACd 8ػ ž` ]XГO>iʋڵ`:u}:>/雾 kCXNؓjީ_/˹Zqr+FgnA!iA,@ d h\ hn i~I_~8a@qVo~\p}w c}7GJ뫉4WE!9}yM1|-ž kCXNX)v+:PµHCv1 LqĹ Ak"I~ߍ| 2LmŹ A릶] HON^zAo4#8" ps =҈pÚSS^:E2So; t Xr L}wvW.݈~:A2`%v@F`]r\0`k!۷3tφpkV}ϲE咯畫|Ѣf⇒NhHzml=o0~$ů'/sd=Փ6!EI4 |xi9*7Y8@ďz6UT9x7k?C͂ߑ$z6$OYlǤ1e ~M?#{3d 9#{eY&)Jo=I;~_t@GaAи`w% Ha  % (/!Tf@YG݄@P"S>CIү%(,; !^m\; c}U14`rrK]!A#}oIbH@ހsy?d -d >7}_p@B+ؐGAk"na*|_T)YlU+OA.`$0TΎ)L> MtAd,3up^970 VWW%Kit$z!oH*yJMeM絇 fGJu,Co 颀S4)e%{>GQ"]fUG?^lOg9#-*A$5#9:.}~v̀9Gd0=$\ eM }O n;rH@/HLKK%U>2eѶJ4I?ow^oys[^L#8O>^o|rra%S=Y6=~ 5<] em\νcq(:&$Ee8 bWh_$+$#x0.1V5laj;̷\?އL%3[n\3҄}{M@%m~NlamW4; X_+nze_JZ^Ǎ'Ϟ_w饗f?SO݊V,#$}Rpٳ}0{=PʾVVYWlDy2m>}y  y׿/)>jkCvKHDqa-[\[ɺX^`H_f ߴT/Y`˹G/? h#;@k\!Vh u.p3ѳG d \\~. h-Jf>zr-!`e;$w.1l"82-6 4Zagsϕz@00EIKpv:P dN:wF儥zFP CXK:dŵ!,&ט^\ aallP0eLV{jt@0YaWm4(@0y& *@Ym$눨&UtI#Q$ep~&\W|Vr#ύꈃO\oz%{ ZN;zh+5V y( DIU 1 '@%.e2CXyzx>Z`rЮ]$I$m۶(hs{o sd 9w"] PHEu떞}قEsm $ ECΟ?Es`T@vޭ۷okqqQ׮]{oz@qU%xHu (d+iii=A"ro~ݻwZHE;v螃WP̵Q '3o[j  /;vŋkH Γt1k~~^W\ѝ;wyr2D}}NL"$2'@b=I%\: Hصky_C)KWR`dXzW786Akŗ:HO쫯f`P@Jܽ{WO=$iΝ*T[ RɰApk! aK'O.ZG2<O6Vdf֍ ;wNRG}a!!Ç_=$KKEu떞}uU\b`.\`B⡫΂dw0`|@F|H^Re׮]}u5z|_F=}?ݾ}[hw1#Hf j\tI?0l6c5:=ZB̲@(իWK/Ɋ AĽ@0 g/E(Z?ᯉ8=xY=}ٳgnܸݼyJ[+yO Fi/5Eэnܸ!I %= hDy߿H._,ijwl/ CXD(jYI/Rz[3^gG(hΝF^tIjؿY6wz| $oyL|:tP&=z\4??I?oFw֝;w,Ľ@&Ȭo7MSOE\6e\U~5Po}9oUse*}z˯f>׏ѝn@q$U;\r\&E3~5Po @QOoY&>AU9`XFH(yϋ: J̬/Cz}ʂjRa)(Wc e}33e yuUSHɂn(NTX;gސEնL6&1dgtfVA7lpqxCeJg=S%jh}J߮gEgW*. ER9toR$du'؆7٥ (}\E3N~nwE\Y$zYtpLm¼ӾAMCz&Ef']=̔M}Ŧc x(*}DW:]1FǶ>eu3eD}YC^usaןa@5eem\1) \ԯ&t}M?c\ްWք{cC~]696KXSVfmL_ /TYUg\.DxRŔ"79aE:d\4o/JGNx!yoKuǞH/W8T(dopy8#P(@C!@F #`0B!@F #`0B!@F #`0B!@F #`0B!@F #xqW>IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/images/coords_overlay_auto_coord_meta.png0000644000175100001710000005661014266763645023600 0ustar00runnerdockerPNG  IHDR6sBIT|d pHYsaa?i IDATxy|u?3i}XPN/A]Uş(x(x-Z\]U",r+¢PJZz7ifG;q&M2+3KN'd|<σ  " "6!BAHA! r A$ȁA BAHA! r A$ȁA BAHA! r A$ȁA BAHA! r A$ȁA BAHA! r A$ȁA BAHA! r A$ȁA BAHA! r A$ȁA BAHA! r A$ȁA BAHA! r A$ȁA BAHA! r D'vڅ[nvлwo̞=t.qXz5 LL8?Cs+**p7"??}_O>Cvv6z뭀6XlY qZ@'|۷oǬY0tPaժU>|8;visw5\ECeeߘǏ9epBĉصky%%%;w..\,\CEaa_~7tfΜ [lEt:dyaڴiddddॗ^¸q{n 0w.0`F O?{<cv;?o<߱{g裏By竫&0@"ԣG̙3.ϟ;? ~;< gB|||@;m6\.Ͱlγ-a]R^^iӦ!-- EEEA1< 11\r v ν+ƞ9s&}N߿jii hksso.\<]AH:\|Ũ?~޽{eggεX,HOOGMMM6xKK }s 犗"B@477cO?CNNN8鵥p8HNNk6TUUe]bذaЩ~q~"سgO ;v 11aKDgȁz={6v؁>F xٳQ\\˲*|Ǿ 87xwx pI&mۄ իW_z51m4߱3g~}|OAt)ߎ^xӧOǬY:~޼y'Obذahllw܁Y'Nqg^ok#0o<^1ciӦhW^o3gɓ?{wq8s?U`׮]8p`ATNtbܸq<˲<0~X;/r[n|BB}q׭[v-Z766JW_ l6~?𼚚333D~ݻ%I?@ IP 9 B@ I! $A )VUU/D>}TTSS416v17˅G⢋.-ڨʁ|嗾"8 %_Jk3TTO>-\z晊LI ;X~K/h*ؑ h Nɯy%n7N"jEؕxs3\hinF'k2'%igL;pr~vZg̀l՛a0џ47j5 )qOM_2 rea B=qwSNߪ#VNIA^ .dC7^3 xCŢUa Q9f 4Ιic=~WE,"atJJcXg''D, fyDC5#q^J ޫSADf7;W/-LJOFԃ`Sqq`|k4i^wsFvwc&ȁLN|75%%Yb\L@, 33CŎBDĘWǐzb!ѣcPL@ /8,RY!Đe (.w L?'zdq RN*d_c#EhWȁ8tbI3l,(#1DNS|mlt'OQCv>FǣpCnjs D^'F 9?WR)FBD9ϟ8a, +VaB*:v"N'J{QuNjM6wY76edб\](ح 97za(eci:R@=WK+)1MfR!"4T!DXC HP@ +KK͒qE*U2ڿļdڴ^n1\%B"~6_q~vxPjBPׁQVl6Axł*`Bf՞0U!4bolM{ôO>Q͵(1S#}6BDPŋ4biC3c*֞U{[n2324gYP;B:A,ČK[Z>w;a*"0f|駟FXT`%\  i5xy(Z8.L`͆)$''cꫣV!۝ij,RIP,*q#5OTP+ݤDKdSdG,S1B*D B@ χ%ss3LRX ;2ݍWc $TV(B9Qbp3v76UhT[* [U T`ުEY"t+0n]oF!0,)1lfVj\JJRe.B*Do`##[dz70Yf ;.7M.FZJ*D^3zpq#KL+ϛRݔdϞ=`YIeR!A۝[BBfEWNIP!e^ҁ;wn_ʨB[[A۝ܯ ,2q~)!bFL@ X}ȸZ0ͰZ12AXك灐 1f8p0rȮORY},~;½z6BDP^} ʁ <1O0nb8BA"nR!]c*2ՅyԀNN _t+Yf`0*U{Ky-.Bԇar"3!H9r@lǏMM%jBY"Xg_Y1wQHW,=:RTYz;IDu(QF(T=SGFyz}CqŊ lI2HhU4S,$ @Ba(Bcef[B@ W%+t0ebC.-Ull,PAiN 8 +K+ZZ 3V ,z_EE?ȁɊ eM zdiD*DA$rG?@jULee =>^5Ba>SʠF¤IA#K#P!o-[cX^R!x ;[)P\邹6B ylT @$r.P9 =B ">㍊FR!ȁD *dK]x(0dٳwMMMx1eeYkl-ѣG,lۑĉO^e%bgO梌,TxYTn|ޘ_n6"k~z,^ڵk1uTlڴ s/x߿]v:iBee%/_޽{7of_;֭[Hߧl@@EŪzaNNJ 8H~%?hzM@~l+**B\\,X;f0|l߾'N8Nd%$zGv{ !<8C}}}BTnwkur~HTH]#sI?ۻw/ a AA۷0f<8x >Clܸ1 Ӊ"##rCjxU)mi.9hNPEqX*a/a!77qXiSފ2dX?$+Sm.9m Q/m51v/HnnoJLYYH^ݎtTWW2_Xt,)Qu>BTX5OT3ְaðyf444 99w|ǎB @CC2"_3~e 46J}c+3^[=@Dbڮ@,@[߆۶k8t 0l2sL\ Nmk׮ѣ/an---~ /_.g/cvF9R\ܕ^,剅x|F&oP"&t@i9&p*l2rH̚5 wN<7Dqq1֮]ѤVBmmoI;[/Z)))(++ða0w\/_|/]vYDs**ls$I1%b!V:qU\bυƃ>/g˗cRdڃBZ!` zꅺ:zPZZ ׋⪫]wKፄ={ଳ‚  RUZ_\.\2㢯NQR+ZbIW^bVtDP wõ6G"r JU"kNn9|XYpޖtq8i{<ϣ=;6FWaF;yi2۳b2̺0hyZ )UB$7B,DenmhP}^OH`rNmyݵvvU}ַ@@#S1M) /hT!t%)D#R].ݎA*<,^DZ)D*r J 1aޣ*sYVqhMY|T!t)ݮ UA |TH3ãRtB(!$*lHU%GkSAmYF7f RuIQBWJK4?3%&bA257nSA*r JsNVEl+BnR)١BFYH &IQ@Wh G'B8#)IR!Р.V~ *#Ki *,$B =)Z1r IDAT8?5/6#K!@,Y'F?eRӦimAP^++K'NWYZgv`qj:R!~liAmjGBWЩ 'ŗedJ H@݉Pu y6-1BDoX dfݠR,mC+R!~tCx<*Z[6Guj#:V!ɓZQ*֨7CR#B`9HeL@D\t?N6Xת&aͺu Bb5&t%L-蒿<ٶ!t*:y`﫰Cr zK $/8q *`Z?a[ %0B@UoFN*Ĕ%b$njKy/DO C?<駻=*Y 8-|8֬Ywxꩧзo_8yG"۷oǃ>b˾8̙3QPPy駟F>}h"#Gh"\xᅸ;Xp!;~6x'`1}^lguYX`rUj.;|:H>y'|/V]8/ϣRmN=ŝga|[ffyyݻwcv֭8s} tR,_k.5 =y߹w}7}Y۷gq?&MGeY|WxGuVSpI <̙3'"lق+ƍ;. V/ sa̘1 4*J&M}Wk+$IIpv+ |¦WBFVKcȕ}XM5tu:h`$:櫮 v{߿.99]vW\q1x`3=>,W0;K/,bƌ~5$pgq駟gm%C=~:t(VXI8p/ƶmiӦgQ>z(͛7:=%%_xpM7)>Uρ'B2Tr<c'E%zNF(my$D]ޱ=9v ^/ ݑHD۷/vܧOϾ?Xv-= Á?˖-СC#s͘0av0 ~/y/UWKS!ҍe%5:"BXAP9MEEE |l6ϟ۷)ׯ_K.<`ĉ(((￯ݺfD-Up1Ԍ,-RgdC4q {EAAAt~߾}8q*++qgwz#w^cTM0?98t*:u99(qFEtCbq]ch@SX󪫫x^o1#Gj1 Yw$N]eUUԦ-Z|1=K1T!f]4r 9].K0l0I=6RA%Ӊp+1\%I^;y]v' 1 5q זXPp8|PIe_k (.Ve1U*D/7fW`#嘅F,\v:.,[cFʤI`Z6W2dN*i<]aP=z)2l|qvz^vIIzC{Bzc:.y_Cvm64q Æ ͛ЀdQ;vh,ڵw܉B>|86oތ͛7KG[Q8|~"j!bP9 .DNG l}X8]V`*gΜ ׋W^ywvcڵ=z43f~׭rƍ8|0f͚>nTUiv64$2\tN+ވa*vTth@FYf=܃W^y&L@qq1z)y?0~xZ O<f͚C뮓Ŗ &20s| O$>n BB[ޞ[P""|2^ͮ׷z ~;~mvmzO6ѣ{/V\K._GGM9v @ tH1L, SUcX?URzai nC~~p88u)t(dUI Vv$ FY~]s{l{1#q@ey4rzaM1BSSN'N'MnpJy]n.F;B>6gXyu 00TƤ DCS$bbYz2rPIB 7r D~~~ŘBV=y52;)/kBP} (c*x YADDJ[yim<Zd|r,.HMmgd޳Y1BfV9? 1 enwrG8C%!k_DE2bLNzPXn-@b@)0 v&x]0 ĉEu7T8dm$bU={7^o$Z[UulѣjYFޑ~ and o %U!GLNƲ"X5nD#*bbU êݐ*^)+CLNnS!"n숍쫮}#* Ȋ=Ił.J j0 3lAu7O9 .nz xQYYԣ T!͢RN#~[tBFWmUMPQJ# 15. ]W;ѩ 扝!ݻwﺮہ=B1v762+%\nD읮gdmw3"1Z` Z 眣򗊊IZ1\ HD*Dp!wi4@Bf͐ݐb-)z[qM[{BQT c-h8Wjm2\p(cQ2VqKIH*!3KG*C$ rrr. BҨ^SZj$Ȕ1ժ U!;=/8S!DeAnDLc2tBjr aF͐xS-uu(m))Qr'YY24T!-_XWkm2@R4zmԍe1:Jn*BXPypȁD@^^1c!;=+SR0j }b70bB24R!<18ƻJưu!&hmj,$e12>#s% 9 !!ݻwGSSfȏ hm*8uJkoOI` *E:U*U`zƘW.Pk TcGC~$bYTI0𩗇Ġ*DU`ȁH ##Ø*$.4*ު@))8-B".Ao\QUR+ 9"L;IXP <FU!Ġ*D?'D233QWWcݻkmHiw(%CT!(B(ڝB]jr Q` ࢋ@u^// BEŨYTPPe~dggZ"/,ۦB**D5Jnl-oNNn7Ex: :=f| =J$EumjY!u ξJ Ш+j@ $J BLZTD$/.#Bz_Ѵ0z VD3a({ g{re_u 9(޽1c! dgkm.-(3d UyU9Ŋ"NUH :aZOG BNMx:v'qqD5Oڪ6bl4|AuTU96nxرϽ19MQ nhzdV!8~L 1atmP} aL7 b1|d"33ӸNeeim&l0ܐ4"5}7)&q#Q B#4ƿUİ2ӦimfQ^[8B 0}|]" i6Yn:TnݺJk3!3Sk 4ɪ^/'*Hlԇ4|=dP!I0ʓdb1h%hm ;.UHϣ,'3KXYAHKKCeef(UFII+T̢B2P!⦚]r U\ڊZ 5C]P(UI)@FFB Wͨ QIJ`Yr00C]af(3ܓ]9"2LBņ8xNcY,p0K!fm ];B8>=UDMMf(CFhSƲRb!@N"T!~D9ጚS>}'4傓ci{G0۳ˠJ璠OKA222pIPR!p<6u;O{IDK o|t޴twթL|{gB47iW"zUs?sDB }r RPt-nl(eiyPI$ٍQB|F-Vr * pZ[OEUk1mDI>r *L*xy[na5E*DQlw҅ r * @*qmAQ+lu!bffP!ˍv&!}j*ѭ[7im2PFJoD.@OnRf t#J4SSá `B Us\},*2c,b#*DCDERSSBX=G(󔑥<Y)JvL6:@T`lCpZ[?g_u|=b*DF}(!Kϣ>9IKKÉ'6C~,ӪywX:qj=J+ub'AeԆFD 5eЄ:H֋-7l;bfjW!By4+ZZPv:8+ ,@VV0aݻyr 0zh/~///ǽދ#99,o 8ql;,l޼,ˢ8ܷ)8vfO\TH-cI*D5.rBy4Wy6,eOX#0m4Xd 222K/aܸqؽ{7 ;ǧ~{ 7nĬY~A@[~?>} =n߿*xxWxb5J G#<"y 9HJJ/}jjـAwdjwU8vA5ǡ;ˢb! ?~ 񠼼phfݻIDATsv{˗>nh6[qdYp V+ !Ar|6 7w}7>#\.9+W $ e0oIL0ax۟={vByy9XŐ!Cp 7nxNسg:,޽;. O>*/bWF ǡN%*Ȋ*E,q(xǁm ׬Yet:܊*D@x<8B56A3ǩfqѯLjj?XxH|?ft M肜_GmpaMV0 6 1nryڪoȁ3ΈK4.d8-RsmK菰z$r ]pWj2oBB<܊bZ ܛyhC]iLBd(y$,ȁ@޽{S.@U?_k $s_%b6 *D]mDא ŋ>gBB~'U#fUeK"NG"Z+id"y<6 q,dө >:(*DTdP! L@"M /%q8ػw*su7z Q{o,wӡ&+;Xd*viT!:4:ItT!@[zAua` }.yb8Q!ۈ0!" XhvcBtBrՑ@*P&Ѻ%}o.98Nz%673x`*G6An 8XS!-_ P@I+ɁLaaY:,ቲFF;5"Ky(|M:Rj[WGp饗*A I@ۓI rcw)H,Cх 1#@Vt|Á]v):&lKs$y A~`R"{E]}z2eǏbʈQ*,,WOQqZ[@KaZƂ QE*9IHH7ި6 }bkͦ~!ڛ'Vy|1c!hPWb2Bdjw0n" BDM.]ȸV!99Ny}J/! kwW"㴰/QaՊO]tI ŋUFˢc\IO9 2 mKczAtkAEr *cp^}ܭ[u\]p ^h8TP9Q]&s,C KUAkz 7 !=zɓW_:nSS<V')Sf{}=β/N@hHeY|%zR!WBP!FSa`wƎ+^$ydSsv3fCMs(I ˢJ71=V+>($&T! LR]1T6O?19vjs!.!B}'O>cjN|<0tb c5U U>' 16M%^޲쳊 nEbcXTBoHHOOnj3d󩧞u<]X,ĩh馦 ƭnfN830rHYlnnu<]٩QKphDhJ{ȁ舩S"cA!c!peg_"eRqV*DЌtu< X^Ԏ(96@t0fD]pi 1P#ijh"a .mr 1jŒ%Kg"QT0i UR!J.ɱ5/!@b̟??q  BFC>cTR! (BOH ѳgOj B X} 5URBBWHqgO>QQ߾X&QPDA$kz Eה-=*fdɭBxPQmwRWW'%:W:mX*ڗr 1 0$0T>EV >'@b4\}Ւ__[[+5:!LbvΊ1B1N1bI}dF' W'^1Bh(}BL6 ^[ctW_ :!FM Ӳ-_ r ;"VTl~V.$ T@ ˲x%֐*$@]H CV]0UUr bouT!,Il4 YjȒ@|tZ@ Fjj*͛***Fc:ǤP:=RBƔ'E0`<̈^zjz YqqY(oDNStIf*pOHU|EĔdÆ Z8R.[.9~:cx<' puqBHBUS:iz!"==wL$><WVjmflnn 1}@ 0#zMemuu5?ᣏ>;~sAw3jۖ0pqs1'D0 F }lٲp>BAbkxb 8k׮ԩSi&s9" x~\ve8t萯ޣkӉ"\}8z(.]ꛯ>O+WĿoܹVkVYY˗w(,,͛+m֭fjB8U,\ \q碲vrrr{+;#9s-))ܹspB`…:t( ;qnV$&&v۷o62 C^رgg|ǚcǎ+W^y1c_uc{^իnOLL?;aa9~aov<3 ÿ曝λk{pX]z)a~ӦMc#Gsss5ks.]pիW󙙙3 ß:uk׮w>}˖- y,_***B\\,X;f0|l߾'NжOa^vv6eYѣSq%Gc'NDAA}9ޖj#;;@xqW4M k!صoEvv6ƍ;0 f͚r|7wYYYh cuu5|A,_\/Λ7X,x%pBycǎa#-- AAAjXv-ܦ~{ tn6طoݻxT*A׻wA&Nsιvtt,:7jDFFyKz=> ш?d2󨫫b 0^YN]M>ݥmtV ն>l4g-++ LdddlW}}=JJJ`2ǯjm6!008}4ϟ_KczMYfիW777 IDQQǏNl?.AfQZZ*VX!&L ^ÇB$q-y$I/jlX?񤰰PH$-}rjaS ???,NHH@YYhٳv~M<}NROHNN8ƞNs^RT#^}ֹߗ?x^1ts4h4x{SW^ kۓ?qFFl6V+={6ژې 6@Vk>,<<?N=^`0bn# s8|$Gg3,, ӦMjuŋ>_b2fSWzާkapm{2Tj$&&:v,]T6 eeenF̙3gط{n\0ІIgc~JJ|ɭׯh4S߿;w%=t={/|6}^^$ITTT&u E@@˽ 9***ݻw]~6m$$Iׯ_e$FOP*33wAnn.p5TWWl6cn:v,Zz?~č7؈+W`֭ia0nĉj6 /^GGww7  dʕ+QYY9SWP rjuD}7b̙hii ǏyQ;v ]]] qGGGh4"11AAA˗ʳo4 &G:Nh4,߿?ee˖3fZ-BCCŪUă޼y&MbݢloAAPTn9" ~~~"22Rٳǫkrg DD}~y')!""E DDa" ""RBDD0@H)!""E DDa" ""RBDD0@H)!""E DDa" ""RBDD0@H)!""E DDa" ""RBDD0@H)!""E DDa"!UQwIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/images/html_all.png0000644000175100001710000017014314266763645017114 0ustar00runnerdockerPNG  IHDRu@fgAMA asRGB pHYs%%IR$ iTXtXML:com.adobe.xmp Screenshot H-zTXtRaw profile type exifxڥi7}8Xs(FU#_W˥6fr=iO >j]GzIz| ?z0r__ۅn4" a]>~~S^~Tݯ?ȕYڅO ߔn7/:>{5}|˄}czCm?w"?O웽_Fw߅~{wyY~ㅓImƟi~jn =DVvcWLg-JZ?ƚzکVhN35Yn;Kcb-/ӟ{(h.㊊ay+פ7~'81KX47p,glЉ~(C . &$[H%X5Xcqd)kӢn[ ﵱ#V$KiX9F J.X^%V̜UjZ^GK-ҬZoǞҭzcpo ~2L32mfc>+lV_cǝ6аmvC(|ʱSiqnڭ~ǏUZտ/V-|Z|+OkJh"Z3V,W Qk[9jfGDY6;hX|Y+_3u9-c~;kj[ފ}P9ǫfٶb1B2Ĺ|0!4Nzl%'w[FvvI.+pwU,3}<{VZ qw_OZ<- :,:ɪY&b`;T/0HXi- ۍˀ~Ϩ7 [}TnKyU) _cbz͓{~Nkf#髹8̵#9-ֶ(ܳqμ_@`wN'~|yV-+=M9I ʝ H.5|3?rNIuFfsBX0ϭ,?b}ׯ͌r:@S[j,@fFJKQ- Xh]$Z9-fC`¿1l/5]W&x=0Ƶ/8cUV´x;=9MSfg2ʂwaqg  eo(*􀝱{٢.b[m.ӻЄ$hPwָNkw8\Ümdxq"?QƴʇeqTAQ|cLe2Y :yuw>VYf.m1S4@gnw^ ]oH|sWzSafoгt 2q.G>r$毼qh\贋k,zvk:@'m#8\%?3r#q#->55hB) NxK̪\qG+Xʺ1uexH@dQۧ;*k`3ţc4}b'ՇS$8mkQ<(m rUMRL +wΥR& 76mNn-9+eg^6dZ\ B#EL ,Li\zA0 \B̉8j%I> +mڈ yd"OrEO@?H`km̓ <.i b_ E+AbwHĊi#~9ǺLʠcr \TIm`l4L#3),^wО6p20&,C[_#PyQE+} \2=ԉQ8Iq9$[Hjڃ;l<~X$W.D"X yQ|U` -DbXE@]Nk~q: #PUA&A" 5wdYC/K5*' M@MWFh"PlT4$a CG3Gw۳Li j#гbUX``U3xL#jAR9c[8, И3iN2䴗_r0ID)y{Pxp :N jͻ 37RȊAD?>DgP$A xLaK"QR6“̍]er5N+԰p HhMq *jLډClgCp(F~\#Č!MMMtzB\9U>3ZUܦC;a+A!cV L(\q4\ yEde!Efŭ%/p&9Cq.8Aw@douRY/Rg^T3/UURM1t{.3QU%@sR#Wjh?"DB|$y8%]RK1!<a& L:QPzCoC A>x4˔2wH \d$~n( >@adF- T-8?/l#pds')~شj = e@? kT}YJKUw5TR넟s4 EE{S=M޾wk8ü!>i1 x,!R8Htȋ7,_HTņb`"*Ҷ2PT׋[М8ͣ2pDmsY{4F?KPDP1PYڕ~TE po]/U- Sy ( A!;{liq+$OyGO s9>QN*s2;M )ծ}a3RVTdY ր99:bmck! `ߒdA .3S?=.!ŀ:|* -YfbXS~lT~=2p{ߖڸիmrb"4HZRYsB¿0 x2MY%im/e<\GIeQ(놖o0B,rbO"K;\Ad!"Bd~@L2؆y<TY`-ߊoqBBeq%%")[1a1(Rm!i+(Ϩ'E%Hv2((1jS Xe6;JR*ץdb gh> ZU@rqQaGNƮ*7Jڬٞ!QNd@645- _*(8L dX X(40WfxhB!y5Ҷ!DZ0$ v9 2,ݪ0rM$ / +6Jg\!T@mUi3hXF$ɵk\En ^Ũ`Nx"\%\+03hϛE+i eEd#5wn*'r# L<*Fe 7\B*i @$!Sps=,OKDe%_`47;&ޑAG%mh7x≑"y+ω5`Ƒ\Yj[u949nHdI*h@CHbP3.sOpa~F@P+@ 6D"67(g f޵y4pPTie»)ƚ9>啃<;ܐ=dS {E_?P^bb@x!Q dȘ2spT DDTnHev2 $( BPc I*DZO'_=,"VW5 "ɈJAi=kڀԃ*Y ~I2VyTSv7hD IXuA%NwRs(& %-Geؿ]틼vNz%!0WD~"2džHj\C*saFȏh}h$&*pex:ɩe0EhfEI9ykBcT䔊Qu**tl^5O19}JJ3k3&w U-8 ~ SG)09G:cяo8WA  JJ"PZn|oc[0l[Feza/kL1~u5ltPY6M~ @f'EU Y䦺u:ۓq ȵ-4 +x6J Lo9[#j:O*7Cn=H\@>9~L9d 1Oy]GݲaY)($mjRy@Uq wҾM}kj`fJnQ*ukjUDN9# oߒԍ#HC`3AWpXS] 6=(DxHv]9fXԾ[M.B5UFdX dHNnHIȺ@H՘Z:\Ϥ0IIż)?3ⷤ pQy H-bE)/8iY0+_oV+Nn&&*ʁ5cl?["?7DXsu_+U!WA=trS0~y/~=u U$ehv`hH*թ ~Zƈ{hc-h,pROF'1 CpAMc("yTrdы`$ J [/*M$"H1@[ȫ8m4s$v1,V%Md(`ƽTuuhKTث/ĉeBu-1 ]`܀GtV 5apL&IߪBMtĶ𳀯섩Y~w.{Vj[ ^hc& |5vD(0/gfi; McduQS{]PhƭRvq0 |WMu`S(j c%j)** @QKlK~U^WZ^.eIqkX¢m"V Skof>N#\Ņ6$6ߕ6K}"܃)UqV$k+fpnL+ k7ZƆ#3o"r* Ϫ7U@}j_Kٵ=8/f큯y::V@"7FElMj$cC>ӴEfն4iÅ3HocQ 0X _ 2 %dqde偆%<鈍S'Kź8j/P R-'_˩[l*p^ھRSyLH2~UbDą<#5k1bAAPQz9ys^v<7UpNsz|$4UKQiIpf N~,YXz_}ܒձgs=4.oߵFYd ZoLflM;D ڎ#( YU:9U Z,&ވEdW*Ec83 R@i5TMNUtk_M%r {v|l$~I_rrE3Hx:" Pd*Df/HlvgsOxTK3IElЄI@+LY`Vw*d_Ҏ9+/m!wp$Ѐ0v\_}jP|u~ 踆lx quA{)mО 1OGө0ʌ&Ytmn-B.u4:pf4NbPF[po7L#Ѧ~NC! 0pό۷Cx*.󝺍Uk(a89*CgP1$>4AM8%|SCpI-vqwϪ6A4.@{`3 ^ _uU#*j1 )]z F}UGUuG^WmceAltkn5D7O`]S*)[Rc0 A1:_܁5]9rk2$gV M~?!5\CiG=9#SMJh\>I} i:nuX5,, NgJ2GI1c*Ej҆U*txV 1%A"1]yѢQwtY˭| SPqoTO%kvSv}ܕi04]?7P{ ar/_BOy?]1TlDFd7r[m`!Pul9FJ jw n) r0guj\ڌͿ3Z%x߶Д[4Glxzx^[A:Q T\.o %0;} XXkZc-S~W!eRt~4< @9@FMHs@΁ nȍ"װohCi箙u\FdDBQ+tW@6"N5ZtƥG"T1!ڰUClE(ǴC)ݬ ju Ettf(CP:h:484ܮrĮܥLC+xkBL;Ѵs\7KȈqNRV LA(m,܀R, yk)r^V_{mD@TriP$ *RKgoԱCs>^t37ʋ$й2t:bxTl*t?TK"r`A-:+ SaTo%A ;+=\+T"ͯIM붟.7|_:.RMHS`҉?5ۢ4nW; -Y=MT |FSyTռl˺ U[O253^4R;د"?cUY#xo8"^Ǭt }NI>fy5hnkA"tvr:. 451T]RׅD#HX\7ZڈS2;SΞ3%!eJN5EBD'6grA@>#^5K2ۓz-3ѻ1:Y4>n`!-6%ăuHixnNh :3Z}!Gڠ% kc0Mս:TnêhwbWu$ZnjouML?%:,b}B|P)uOZ5 J ACiָt?a+sAɠ!х@O bVD͏I>wQat>)bј!,rLL+ D mm.o$T+lm̽ϧ: ZFL |mK5),Y KZ:sۻG1WԆZM݂pCru ;;p-a;w;NX}&(8 R-]:p9_:l BU2Lpfl pU¤{6#&Vꎒzޑ:#W|N-zQuCTuǓ<:#KF"ȿ2-Q1e'SUԠ[? u*C\QED'Ri+)kUq!zIxTh˫]G'ÚjUPG> km!]v{f:NVt;A0/h=yWm U Fz+|$9:ٙqb'Ojղ1><<]pVH{c\C(Pd!oFš2j'3%aL^"R߭xBme(R®N3D>ۏ7-OtOf]Y IJ$2 I-Y Y9UŠgjϧ̼?jӜ=Ff*p<5Hmi}JU| \[6|nŽ~>}{I{OI@ .Gh &־f>rG\>wxVhýA?}agN9Z :jf9 Jߡ"e꣯dqxjY m揇-Nd)>h%wwM -->/3PLTE[tus9,yԒKKJ ϓ6CUx~cIDATx]v* c^^6ۦC#ae-^~yO]***J'׭˱J*{kn+*}]3:[7\kbK?VBg\6-VxUX%\\x8ꮦ\_BXQڅz~ho69W釖zQUwxC:_@VJg;WdK $L7keRu/Y.@,B)BTUelqKPwr.7IzNze@Wwu:଩׀6ChlV~H@xUF˪vuCz-{1#IT7uӭ.hs%B*sU m5g@@XWB%3޹ /q60rR]{'ek܀1-yAb 3 b|u }V^{ וGS1:.nC\-Osn0YwЪ9|Qe֕?m :\(>x)!{t]xQw-_' ۰G Pɸ$ ͨ.mg\WP'=6~M.踎ء7d@f{a}1P nw/=I0+pt}ӝ ~bCw0ƴozeu.<;=r)ߏcK5@Rط_ϟT6Slys4Qw.uU Qb|p/}Ư;=:hlV焳t} u>&r|P.yߘ0 Xم'c,w c e.$W\υt}ضS9"ާ=z%LnԍD/ *hn],b,@ oOoQ Ssu ]Ң |~]FC柰%({\+:8dhZ*cedtTBBШˇc D$ C4Qzׅfa.}¯SJ֠L3r0p]3Wn/)a?ՔX 芕us8ݹםjJ^Q-K%hKoFUSLU:A=CVKKC]fSЋNseacůK.Gȁ|piGr},9ݺ.r MЬ!9J ?٭+Ȍ-rP-ba]}.@?2X93%x(kE lV 3.]nȺ*#~h,bS9TH%0Ìn_:Tʁqw_hmmK6?!=1Ya_/3 (yTFΛ}NSudPS&&Pk?sSsY-N+w͐pggaJ}&. Ǚeyԝ siPQX4!qǤMP"l1P~~_'s:ƉJɬGN d>͵?9w+z 7I~܂6CVKY| ʚY$F݈k̠4"1`p(~a:(S cDQ*EF# K',I$RŚ]Iee1H$MfJig`pueDlfF<n8{@:X'tEϕNh1_Չ \:A$q0Eɴ)?U#޺湱}ŵ_SJ\>x{f >OcO #Oꌠ1XM 2e܉տm0in 1  zhxre:{Mx*HHxX5v껫C)ue> ȈAj:jl ΩEnγMe "Ƨ_ .|v}a9.HBb*b*/0MlH'0RW$s[%TVapfb5#%+Hi4R63X>IeWb42xQ==%&[$qKobb!Pat}0It}m 7iJЀ9  iċPa֠\ֶ {˖;b!#d,a<֢K!? Z9[>ϖS` S~9b 4jxLIwSA_SM]7b:Inv &$(e@v0-6\v1[3wx,|_g`Qew%@5hb^!kRgveN.q,MK%>vA]%IY$|&+&4v|d~[}wJVrVe+?vx?(Y˰ i&b.fk{oٞ]lp,eǚVewm0M-)?Q*=ֺiZƠ7ֺ2@ںQyH릙tTU i?én*S/N맙)?nNmr29iNMY[7 ~,in/'+r_ƕ) 0mI&O%nbxou.l '\'YMe}%OlT'dchdė$q!^-r]fRkcԺdrꦨcӨ6f.iԸn'&uhZ:OY탆9blu$yS범ކ2וjVUf,{MMѴ5/yU*>4ԭ6\Y/;dC]Y+-ڜ^Y/Tߢ5J,PWRűM)X:]q1̭]s)bs!{^Au^׸uyeֆ|I܀+DH1dvR[sDͮ}Hup=~nzyjk\w@3 q0.%t(-`ۢu  d_j4'{yN?5*lsmZ"ڣЄuE0"PmpD"m2:{׭IeL 0Q܌ԥ >$J\SVA3(v.)ؓx@*+LwF#a+$< D]玑b5o}$k1mg)w f? NZR$^uF:cfK %t *~5aq@c*A wtsz]a׵~z^'(8Ĕ92cu"{tarfrI>jnUzC{.Ic"=GQ3:OMis: ī&ڏ|~^'=nqw.ڃ *R0iֆyL?nMN:Q;rl\Sc>ޥeަש{")5"z=fčՆ9?9Vaʏr C0K{i\G#t'>7Q*̀*ҹ_M u\>u9΄H{/׽=.Ӫe6z uz|?׉}("&^'.|'at=f\eüEݨ}^M\GZM䔯`vE2ٴ=$ =7R:5nنIM춦H7nArzE3 u6 @r,S<g~</n9S,p7#. u fLaK)*:I2ζai-,n^YZFfЊb^Bs&6Lvp]`k>1b D&AKFwwY4E[ʤ8h/HB,G%L]z k+&b}SVk6k#HZ.ԚY8Ipw.6{~[FꄡYq*}r\%3}R{_gY[j%76@ |M?rpEuц=v2}:X iKc)}4`a+a5Հ[\up"n)Ot9DB.X- i0| # _0װۊLcXZ%E.3`D+rwpnr]Ѩ $!}λSulXRKXez]6,PD餾aIL5[E9a&p bLGxΡO, K.~k^Uu5T^Hb(6+t::: [DҚMJ7ZQ;>pEJ먈FKb7r:npR˗6W]d"'Xb|ui9ɡ#\492țwot+֞1+:9[ц}YnoN 5x<,9%˰6FRf" H y6s !Df )q]5S1\k\ҚHf~tʘ1Kr]zݤQ.uw FjMYr?b:bo6sצnY{95nuу R%Z+ NHzT@LHr-V )f< E7ZbHӻ=n7/jE|_W:ʗ1U2Ԩ{UPHq!a=t^gW܏0]׳7^6މ(ӵGFNtaf%AL%2 j;`J];;NNQ8Up%V.wS=>c0ļ~ߤc /~t.`D嬊uBb^gZwN*9B])TKA!~IIiO< &l924&a%[ut-j{oGbbbL)GwPr.FKGe#~5 ,wpY\Ւ/MVM?^nx>i S<1kSp:t2ί_뎨boٷ8 ՆI'x+'oP/=bjuL,dn1/Z]-fQ|n#7v$<*uұ' Eׁ@LE,UtһA MFNMj:ߙü:Qq1Hp, ?HHrE.m3A/M,|wй1`vJ*gt\A:9p.I s!R^7.ERbw_ė?gȪx\M]:VpDJE񬋯 қVV"Lyi f4?|Ϻjv&>Ss}|3n/nW9v`"^o ^4bwnp]w$U4H ^]<3 :^l'1fclʩ:,ЊvMX#L6v |~6%>,G&<&eLWrslPE "&(( K>q6\QNٔcԕGa\gnC{\ ] g# Wwt+{ny?pu0X(I#>CȬ8NuF_i?Ӽ. h2l+z҂.,}~6%D.G_ Df28[τf&^N8q:Sύ(@T> *AHK̮Ns>IE/p<,}ыlX&s:Ɨ&x#HƮu]^׭cXbFE*xa6~|]xG\8w!U>d\Ul6rflO&34gRÔI5s1+ 2ZK#]HJ}g󕼮c9cz wNvh(vYuk{\y?w>'yV !FVj ơ# [Zd`! xouԒ?*}&O!Ř$t"'m9yrhůS`r;8Um{m5́:iEnx%uPEI{|ș}-qg9~XA"ɦH7"Iͳ6)- .BV;[cds:^0pQI1St|~y淏b tw.;~|UZs2U'I]:c,7 5ahj .˕=R^w\ôF*N"q )X$j(!́ Š<䀫̮b$a}iJFÏ}|.v 8Dꐏivẗ|SЮb5XͼbcGliJ;Lcn!W'5ꁤRr"&vm3Xw7s?[i`aB?e*%-,{fgPΰ,@g-hVp uTqf݂wwGIvFGqCSOE@ePYW'W5KD)< 3*_םw*ER/D^ `/E2]v)PmW& k?;R6sF9ǎcFz:폞w٘h:wJ9xANKd^9$M T6}E`)E+n"3pkMxvq:v;7%HÏ V7\h[zaJt8pSjG`.{ }׍fE`cLw뺒.I^W.T,N,*&546Fun,d0]c6}k*"2IR0$/V;[. [DCK\+Al_$!G'زbg3.WU/Ou,; 궓^O؇nUSmvU,wdWi ( ]40Ii%[JND.[?үs(U(y5ƙm3(#n4Ϧ?!~T,TZtE\_QWV'CْXF #̍6FUa{6fj=/lʄ\+ ahs}p89O0ۯ9uO،j uZwմwJR ta06KΟJnbxkV 3$Nsh^,{rhS(4+S⺯ꦸtCYgByQTGO]r5y9yD]LF@\+nȃWD{Ftpr%R.ۤ뷹Nv9ay{iT6q,ҏ3#JHk͢ml@Sr<[8ͼndگ&pYR:B/u{›D"W(%L(EEđ^ ҥ%} DBa.mѫ :C f!!?@+z^72+J |gj#ϐ0YMݔ{C]B]4q3F_ʲ&WS&N1E%I"ql-va6(a <59-ze\:kuuV?8ڝ/ o!x1#E:̕.X^OLG%|epһ\wcr. ·^o&NsݴL諩U;#>cH I b+/~]s ̘T˶*$-o:w=uZaRU1^qi}.*U&?u^t|IY]ez ^UajőF^'3 xRwb@3;nI 'u'/ry"D{qɼs@2Ĝ?u'mϦTj8 ) uex"ƸL(Otw{6ezcɪS+಼2~P&IL3El*{uMq>ٌ H90K?YA4qJDv I 3jpm})0SWsu~TJ'=>(!WCk1&Izĺs 7!w0,(DAP˪itڟv_f'vi&®n=iٔ8bыB[fhEG\G}5hlՠ(H <5LvdiT:r#D 42p_M!ߺ<180AӺ=s[:VQ]uדF ~gQluurG+ltIae7q]WUĸT=MfO96e;-b{J~|ۻ_G=t_wa΄n`d:'>?DG\K꒯j-r\$v4IC^C <(ӿvu5!Ki8|˜reȄqݍ0?DF(0FkȦ;\/aje{ ~6?֍Z~X&:wG\Nn}Gm,qx_O>DM#2KC[ĂAsHu|/Es'lw;Aݶ\T ;Y\\dW8ORi*)$t)=~sfy`=z֥FeV7l,6ieݯ[ ̠F ra$&""Kf0 0t9.ڽX ={.,v\ٰSK R`liSRXk!C>}5>nArS"eF%DB'Zr9x,!Ef:dC&KN 9]*9 H@}O2prJ &$ɋjs&vA$ɰOBlu)>=N3ۻΜp|ĸy>X]@Wt-7KE>'歙 $nfvFJ4@u.1R ƛj&rx:~mW&,ݾveS$_GyэFL]6eoIS++]̓}f]8ĜsPYR5We)o>Ǩ{딁{JbiqP =0 Q.7&hªCAvѭ]u";NX9S嶥@˝Zioք4|T@C[AGK5WpuP^]<+K~`0 c,ZTh0L!`3% "d}R7K@H(cr%vQ( +NkvOaOp/ Ҍ)V0[—:chxK7׭͖:Mvh,1#(4 Ԡ}_纹~_(8Hvʦ,]Ɲ{nN^N,KP(sp^3WDg^>u덼rZxû=E% XΥ̟uU\7k=rŮ!zʏgr;x 25q.KG5ey`L~j$/ i{4ˏ1l7Ϲk$Kq>NƜjxF݈+F*qBuLߙDqO|o:z6w0s˗jJK;WhȒ*iTdvnm$qRm9SuƅrF]hL!6 IK,K݃m[K0},">lI.ɶrSzoF&fdYP̚GI[)wn=5:z;104X!_h[JCB Z^'w4: 1ClfqeZ.st4{OЁ3uXaF Ҥa: Hk@毎Ŏ|ؕX3LSqW>||0w+R:IsKiVu]ni^G/s,֢NakUˆdWeU{ӎxIi} 1ym#bL[h=z$E=Ȋ ݠkLyn8 qUu>RJd]Yta^0%pPK@=#BW"/Ұ! N>Խ5+S(,0H rLT9ʽ̉kPwA!3<" XÊ)/ʟ6 |Ss0q 8fFa',u"__ʌ#ZeZ=ٓ+Qv< /vSnu)y_<L.JRgdir vqTaI `_7ca-38Y-X'xn OƐ*&v-\[Bi?c$1?̙>Wq54#;0W[RU?0lJٙי{)t>sd= ,KMmO:lt9#6x1-/)?##p=ֱՉ呂O}/!dHTBW~; id!FXw\יW9p|V$%mp}ȥ{ˠ!ƵMa:o0:c=WF8YT- F$:"VoV<uɻ+Z{N4+hcޢERxEt-K3"Y_\Ux]') ]B)ʕVV)opa>YP΢._p Ped!~[S*[$/g?\w*zI^ؒa74WuaY,}&I)r⚖Z*Kuƞs` ܮkI8tLΔΜDe#짱tcX#l%αSx5,w2'|t!:3%̺Uw&an)f-z'u\ocƆb)lE<~0w|_` II9f\~[h}_e)X*-)eX}hİ: ˇ4QGKTFUvIh"RtcaPi҂-,L+Yjj/Coz:S^ش5y'D2#ȅ^W|XW[ &gJ\&=D7OKl}!֭i-d#'b-oX+a6ibH0ܧG8sHW3̮yThAn&K$%"rH܉]0״~ݿmNO -ACW3'UduH] U"|"(+nSv9꺭5m +XxiK /Fvhyi#5R̃KŽv0gZ񆂵-BUM:!ys;7sJS*픐DXN6~HGtZRV=bL̛9yQa#_wP!EQ I0tO: ҫy_e* `MYW۟ձ(QAj7Ex.%|6+2F)uLK) 1[Nzy49AHFjtUbܺT%OPoJĺjE*p>d9{t Q|*>i) yu GT33t|Tǵ2=K=ق]邬{4cm/ rêszZqK'@-~]WM'^P̰aӇaݩ"pҭk3xyţKJ1Nr1[U3&5B4nݓ~} oq-X54oFQº*?YR_&rQRuXz}vVgד.߰|KRB_,'Vt >>]sSNaPRv2eInD',WVYb(?#\Ng-=;s5r#/a.0G]nlW\ lɂK]X[źB/Lli[u98J'A0(;7&S;c}Bf+k.v9͍B*٭$nG ˇekH 7OR#626+j|/(~XWN9cahaєZ 2j乂a7{&_W3\r`8 t \/\@Ih. Dއb]|va ,Ʉ2U-\`__wBN=+nHPVXW&U@p?xY;=$4]s:uRfeɞֱ&͢d2 u=/ƺߓ[TܨAinA!V{6_I[.j==7EluA-2Kʁ_7}_wn߲0ˠ{,zM`_w놋X'50׭j zi'O~ݰWZX ۰nxywqc;/ue-La#u咔V!8|5/:fv1d>~o7`96ɘw 2)zyёFNΐ]́_+`EXb^۱If: zuak\j^6BF_il\0_^;$U$[ͯBl@pD04+ӆM $wS[>Yqvٍ[2աa!pipuS/r6TXJamXw_ǰuxC`RW?8l.M&؜`ݾC RKm:$Ƃ+P]uO7TZ``i &tmpxQao`h%PI]axm`ٷ2#0ބu^Z"u1̼m{jTZ!qJ$8!uG'E,<#:.Cz7֌dkAp9tdR27Anw u1X藢xNA,acPc\*KݹuN=$:Ӓ g94K'{؉5./LߙNN:.ZPe+c ԱTz[{G|UX"u-+Vzna;0Clca鬎=uUձסq5Z܇u%Ruܑz}nY•>yZ~V; :^Xe S_}>/^ctL{}9^aݟ~e?*uÔ>; u7&jpSr*8JS~ll}ޝlrjl~l|a:7 _'[1SfmpUtN666ě։_w$iցTpv*XuW2ձקN+~]NȴuB'nP? ^u N]:N:߉)~T2mc]rNםWl)iuux@&;!uוm(2#trs\ȴ涁IIܔ71IIN 唯%vIZ"LMW[x^b_'~ J8ul{t/a`'HWĻ9'U'_+n)XQq,M[AM` ~|F>1ZlX*?D՟FWm"!m: y']Xk#^*!gl'%گXBTidivFK?ۓz@HRD!}Kʂs9M:xY h %,kFv< ҙ@B d8 /7#/Mtή !j $Jܡŝ^ITs.0q@0 Hp_R8Av~J/:njqSeYcd9g&zXA=Y<_`M@'G6B6`fh(}g:Av! hIJ]0H&~{ND^34Av Dƶ~c&M' JnMz\XUNMz VPjv>r4d*@@'>NN trK;Д0%nm%%r:SŀdNF9"+qj&YdI3KnCϴU?v" j5R5z%A:?OY)(@&-%nɌ̕x6S8N5U$+*`&[8܋XN-x~@S(68!:Y:}=8lb@#QD,b(D^}~B@AQJܪEE#i@J<p Pb]f75,XW?7=O//[ai`QpNS4.W:p~Lcd g`K: D})qץ.R1`pS#R.:D'm\sNGP;o'Vݔg43[w+67*q h-$m)F~ WH=v:`:0P: (ɾ~ 7UK{(j9!F=\ %~86L?Mjs@$%RXYv ŞpS  NuB&ȳ k9:L+f2:~$Sn ,q;IX:_[* ^a"e9넝įu|bu įF&DZ*ձ.#]6 5.dj`k_D;_wd&a̛ngplWf- 벨t晝{52`/m&g ;A+; $XwA^8ϝtLsvRM"ujGVЃ }T\\D.)+rqpf/|H{.E u:Bu)6\_{6D{Ϗ7:3}Z%q""`Fm54b͗r?2pI8Ϋw5ͪ0O{I@%ZUk?EIN0E甫_Z7qiuѾX݋4I3xmҝxg5sbS~Aނ[trבwbn,#'wLhНqG::<Cr2<$+~ii''C@uF:q`3`| % :;ou?_Kiua2[?*9Lj˵Icqqϭ5w[]XϾ׭qXV6T$ DB(Cz&W1^ꨞz&:JpZL 5`gy460mfeu/AV,eE7#Yxhg:^2-Njbs(ƖZ1]o&^MpR}C&t r I$ܟo8iΧ - ‰ɸbXc5qNW^#,7(!ܘ&I}I%KMOzi[ qX_x6w2dWb\퀬] @7jץ":B:ѷT^0٭|<#y( {2^gG:'&KJfU 3at@L8OMi^r Go)<3nqv4Z]f%kF4m oԦ.\e~Iчkfb.u M ޢ _9[MXպ8Z Eҕ^q^GaCGN{_Ց@&i&9#ș#Lf3X]"[D!LkKXLS"Vl&D԰&7O-w}uC=6ިYO:2nCy*φx6\eVZR9o '_:ju yOεM1Zʍ؊;LϬ.vNZ@KI\j֥}SJi'5sq4yO;,0$F lv*/2)0mx+t3WxؐԆh-Lm`l 5F{GO4C|:w1;GkX:mqTIԘk~6Cx6nq ò줣Oox#f&O# ֘yLk{pjќ)Oy` neuZDSݯSq=&&%:b£]t;-+rW p!1ց,Z=)8kAMn/_a9_[n:^ 3=BV#1bݪn/-sSρbES*a#'gx_wҼZ9guQuƞץtn+x) :X ļX$'[Io~0..xlvwzM^w=_7e6;NaI B47Plv-=*[ꇹWfuٝ.|@x ku_={۹O'uNƃ?RYuju KXTSx.F'胰E^O,rk*頀,lԓ咾n~ݣ|(M|WMYD %q>x9}q ^7) @:E ~)c98R3[svq$~&q8Q% luExb^7}SbE!cl֧u|6euT[WU{EZ'WAZw6EN@E fugK8I0:TR_GV'}ݑ."_6Yaԟb?$/H|qMFs0y }:꽟彃/ԣZau# uMV't08]j,y:Oxݟs ?׺)y_ìfuiz'U_Fm]*8栊Wì1AuG N ʦ6U9U^4നM%Ry*&F[Tys c2Ȥ>JuAr_唣+$f]^Obѹs]mRIo41ݪ( ڔ&ȔcJTvI ij&Xy~~P B`7dk?aIV|N YsgMkvnUhneqG G'Nާ ]"nGhSd6Zag.[^o$DS Mfz4*s#ЌS!v(p&˘\b9oYM*D/iSjUIz. djO\/Oտp0THkH@B \,2me؇y@ I9"C,Hnq^AFY<ƋBͪ^fC;glF<7b!h^Qd[ꤥ\&H@6r d_rf q Bq,;B0E" xJ +Ma /і}ڔdl G.Z%,LΞw-Ͳ<=~ /۪]sB"s{ PxU R js̠V,DQ ײ25eё\װz\ ?%V1WEÂLk3w n<⅗BIsWb:; X^`%aE`' kԔ+¼(,ǥ*Ps+d1;?ϊz !'(?r-Ol V*묄O F,4%J K/g۬@5Bˀ^N2ܯ֊مW<rzT@-UAfP_@Y ]~UJV^"/#y%/}=9IWgm}e^Iu*C^_EGDzh~ wW^W(M;jDe\AS t^pgzjd-T"L4a:LUҹ[a*DKJ:Lej"SST:LUjbGv]GD:Lt8 ج#Ô IrnÂrSLyTd:Le]G: tV,lu=u];u`&u UYvrS$ 5!cod@iEסAǩ 8YaSCZTdAGhN"5mqqRԑ)loHM׎SE9}Mf3x:NE!Nv`jԨtօx0,շ nMN }u jSOMuBK"{ h?NM5)]g%"`IrsZ 7˽LC"SЁ Ay!N] >R|үSb+"lҗ /jW]1 4`qμ݀>ỤpnIOu PJu^_UԲI9Ac&P}TI-sU~9‰vQ\WqyF^9ypgdt&Ytaǟ< ;9mTN隃+ȉ> öcO2Tl69&q Gs p_V$֦4uԴÄVPR4bH1i -RCcX%u5Q׉&mLЩi]8Ey)+2 R dX C$NKxr"*„5u=#>=i5c#Q>4LiٟMr\ۺ u5 .ODį[1"5WlXwrYŎXJ~t ߝ4 B׵K~/)7,BO(2˼x4Y#<<~ ֘ (~uUԉuO08Ѻ;Qtj™ߋ,1؉N4`MYSB@ ҉u:xbZ^V'nJMԱ+u_kPrfI2*^ǀdN=>Ǫ#̋'\ԃ֖xZN:ԙO8~Bըg*84Ș ɥc*xIebQO/: hgzQ;< ;+lc;(ꇹ>׽OP*R .LgQ0L$"B03}'=ɬ3߰ ǥ&,鑣/ah\+?gaϠ߈0yRS2J]x)JfK<2A)Xz T]8C2;Эps&CO5cQqR1|@e2|CM,MlniD:dɓs{]1J̦2JynŭSr(/ nץM1Ы =a\'\XL 5.W[=S KCgƏfWqn`'zoxI f~cWJf@6!,QЃ?HifQ2^i옅 M,_05%j"nN vXZz2= `q m<_ϯ3h4OknMѫcph 768GPm^´C\23Ztv!PN0ǚhǯ5];g:?FMߡ&uj >p%]zmXb`~&yh6;}Sh@M?k{ij"EI<^ FjǼ?uskWCLS3Oьk 6oaN]U;Դ˿BMiǹ=wQ$iM]r^a4ڛwRX*  ܬ3ߺ6l_x{lk뒲9<59n75]xo+bbEdK]\ "P|Tj@ޱu騮Rp"mԦ&\Ve59=~FDבǨ'R![SSnWW'T[)&iW8sA#8ℰsJVk$ }[G՚m7)p{XSou3Vb՗;n0y]$e)j5Ѷq|t A^_C&Xp Rf iNW5* ȷY TDO%`2xU}'+\gtr4͈Sۻ: OF<-->oHx94GL4 B7Yնrnw UzQ!Kw/-aN5 ɷ75tcUh/!'2%:-%lb:.*ctg5 7$[d?{Wܶ@е}&Y뤜Ķ$\= pdvrJ^h8VHdwc`drb5tF Ɂ4=7GU=3>jc]u6W)V4jk2um9YZD/' vp9An`їhg4mf]JIAzӷu#\('1%)sHI"u딾n2^ߍug?ƚe]Kjnrj*iZpAXݍ/Kۯ`Sz9F-۱<<'}lc]eMլv]z4xoUs*?YJ!]7*ic"3Ƨ9 TzlN`SZG\n o93I%u{3R;fMZ?|KO9{rA!a/?yYUQUTejCIm]Y28.X Oi]Pn/jhCÝP~Ť`A*u[h#ֱE5KАod6 ttLZưs\&,f* 7JģԜd[){. lÖl^:xEJ ԙ|0jȥu%u}ޚ/5_ׁ>S\'xhƖ'f<~Ґr~ ,td^GM<bw Y䃼Nla 0"ͩ{NYS5YtÔ4Bu|?-Ѝۻɴp"Oʜ`4V':)?V#BC !xzLKH{ńsPJu|b]kJpƚEe?3޴סvytJڂ\i|JxB2ۗhLLLK wƺ*OZ!eM`SIW!K4l!0`STƢaW6<_O^f u! bő=mSG;K3e^WM 5YQ{/逊)5rHzHp,t.wB u&:r|p8?3wT5WuoOXIaV74ʖq1$$0bUef}' Ιx&U]89˸PЏ+5c(Gve%wKgbT+{+, $܊HmGyQ8fI14vi,u:6B&zN->tuj 75Gk0c nnRrtmJE3@(Œ(uanF9;zݢNnWLdP)Tj|YL]&5YH|ҚRgK/w5GM;k0Gg>Ԫzt9=)/n]LKܳl& }L,*S%K-`/hST$Mu|v]\qyƺ\Pl-QXi$3ӃaJۆY^|7 ִ&5Ͷb5ź-+wR^v JY73)GY6SGTgsJgHB> |. 9{<| en$*u5~%%8aM(9wΚOR8ڀ$.RjۡF҇uJ.5+IEuShJuN.]ʚ7{}NU0&p\]NfImh/'5"%iN>hnf>ƏD WшĨ 믕׍gήh6XRI+*? (v!e`b vLv M`7L^#N(e(Ohnyk&U}Κz)?krUSb^UeITWzqt;u`I,c]PyHLgb]ju5uk>M@86X8 M4k'/^l5 -+u^5֌r2M_" ]].z)kuَwZIk \@AeTO@Z <&,uіar'_M})ςӁ%'욣߲+ZSG{Nk#q\@ꀯZOQ mCs G:Rh8IFNLPb͗ t|^?Q +70Q7Ej:MnJ}9|ƺk|N@˒@4^j{)~͚:bRqRqu;zN1Ppfenw$Y=9l Ku49MΆW]cֱik5풿 5@-"ωw*?!DR>26lu)61p aB2QP0;x0z[nS]HE=1D0ᯈ$yߺ$VS:  b0XaD"ǂ鼕ieuwy& 5uw%rJE ιԪ"0 9/7qlzza*~_NA?ޏ/p6N*u*u}9&VG4dg0>ґ0pyXT}CC}w4Uu %>z?aATLDOZ tɇ58Saǧ ٲnbaUVJM/iytսN]065\D5/hqw³>?xx(fA0;=."C)0)e:wdfi[d2un4ouRh2$U/۝w꼃Il'g*Nk'g-AxM~&y )17S<6W"X=}q`n14ʓT\ӓ\w.^{| wë(O2Crni4 hzXvV7Ӯ U>MN%4[oiC_~ >L&D[yfL%DTU܋veɗur;l@&~y:pb6,o?MWдGR@wSF.. ip@|UUH:[ha$\]eyy$z$ {0naxs?M_r:4? =W,Wn=BB7Il4s=leҖX]G^\wth/WVnv ~̦qO%P7(Enm'J5c~/B3vc"L7Lfgj&%j)k{@ӆX .>]񇗊4&H!H3^FCPyoXKheCdeqe>[ P7;osRӂ؍Se|\? MgNd =2be xJۮvPig罝=L ihb̺a‚x< " EoB2p!CTTMѹ %6Pq^+[U84i@xz4`~vśe>I5 |f{RttPr_c]_u09_Q7Ť3̄;(4lvFM+ћKMZ:lBx,YuEZ憽mwa#I[KS'\H4iyN4-I.>Nzx'J &Z s @9 wީcTc4,ëMCqóaES:'xrP&4TZ})qOp}M&Zt_5| cuUlÆJ^;ܖF}=$ 𙨢Toid<4E2TOr@)*A@)$((ϳuuuO uIƺ9146MɮjVשy'xEmhᨡs#[qEީMa>Y|?`uv0cݱhN&'Eӆ;.5/xqYa2kJ @[['ᆴ[.=bpSM|1F3i&f8gSrHmz-4'M)i?p]LRh"FSq{t/,*aH1E9+j&VTO+~du` t hsS;S&ı/{u;dDg{5X %2Aiagԅ-Cc;*ײ:*.&DɸIT|ݘ^?o6X /3dU3P4TC]&(}X7:%K+CXMb]^j eZusS&4h2&4?Mcݴd3nL@)fΗYq6פ?QU7Aؤ#~X'VB:M":N6%Owg Ox>rM;YX)Kuf[4zϊ&Rs$vSѕә_=6SS&$&,]1֩V MH4m:x*(A?}Yi/ֽJ뾄& QhZeމo8dNU8W׭:'C".y:.KaSJ |R"*,>_[w)ДypuP;`3~6GwGz'X̉[ޟ;>Nk. U{+<I9`.9V\YNU oE2̔h_{hڠs YrdکNrIPPôdhbzzzD3wT>X7Wc6N|1=C7)Vb]rS/ĥVels!u=-f,'u):TW9K{іᗑo0M;"d`s ͹SĺLa $}#,j=$>7; uo'zCq=L.8-| j*i^b##nr2LuC>=Ly,__,:Y6h9]M;źiary"a'?[,i_[Vh|Vs'nwujf(ػ.WQ ϡ nGwڛٝ;FϼR/?y]4i,O'Oظei<=8Bo)qw׸Y[Pe5>.׽ @X{/xI`o%BF&:Ebk9R2%B^B𤭫fsedgۺQjS^˳bpk+t*rGmheI]S9Uɸe>%u0{ş4iSNnf![mTU|4S=b0k&,[ʩָi=Cve`g0l]R1]uSցfuS֙KM͸~u+f뎴g`0upuo<Lm[g.A7[ץkv,p:sMSSf:rMHK`Zj?4Ki,uNS7Y TNI`K`qMK1kiWIK0'SN &uWm]LmT6,׹>Tm0pZ7۷uup:u**i&0[:-^7KLێu]i [0M`9TO1vm|ju׹El05%nkaU0i- ?L#uppWvrˢs&;%1 =GxK*!vjtd&frӶr:u},oO;+BTwEPR !; ļYl ``MȦ{"zІrUoL;S5b0m+K >FH>D@_z'ɑSBާHv<2&t2N(/z*sJ|w`z(`:3Nȿ@āvMF80|ez|LTT]HrO8%i!'q* L;S=i0m+q _$ 8Y]c7y%WdƋvrX I;郠 'Nڵlݼmt;xi pJ$dEŬp"N)i"i`8Oغ-tڭl09wl8$@ '*NY;9qAp"22'`x r^(>AzB;DۺrMi3 ǚltarY$G9Z5ο QN|XTg< Jܼ$K٤i'!)p_?c [p &uA/j2ߛIɂÜ@Øubے-_q01)tS>֭' &[ݔ1)!]1MrnuZ9ֵz snSJ;vi{In=Yz5Wmۺ:tpڨb0ar՛sW\i5TSrdNu+iredqU[g^lK=LIluiNٺKXd0l]U'ɐ1[wٶ]J &.:k ۺ2/迅\汭@N3nvZ Mo`}{׵k#CP!z1-|2(LZ~1{ѕ\vз X x6a>kT_5f{BC:ʃp.Ԟ녩%u'ֲRwn!R3,ɿ%u0uuJv!u]Rbp]3Op`~[|K8U(RLFUR7LJ#C:pI)7r0xུ>u_A,Hq)% HJOY5[77S)iIA/<4?BhLrqKMpQ\G8 1 1 K]K'?a $3Iu57TL5MݠD/NKFQDABGmD,cYmt&| YU+u; ,u34sA_&)D0c&m ĭqBوw-Z0n(uVVݐ$z/;u0ka~E9qE eFꬻ|!fmCg+cels665,9'Z7d}M$x̶'ʬ4{x>B]{kCώ'= N|miNhrcgC 6h1k _y߸ ݿ2QZÐk^.SrS^i9& c8+f)Y5U_,PY@}`"'O{{w&_]@.6:v`Zj\?ss$J迸ƛϥ0Yշܷ´]u1YfWb@7^X[jчkX.ˆ10dK3=hͺĕFkNi}ꦬzoߖd5}[qJbnA:MYu^RD&i{WMA_G`Bݔv ^c0: ySr5u, mTuN〩udxAL n&`aM'0u{s+s]}`je730Y{,q0S -6~:R#s_QITRLuͺoFL'SPN虳qbOQaAĉd Nє8)a>AJ9Z.) qZajֈ ĩ`atj:hNYw S$Di`4rxi_̷f&YF½׫@.<=PuK::&0҆I:^U%pC@˗;wWG΍W :N٫_gE7t8`E nd]SPA=h uϝ[KnY?:$0q6<40& `0$*ȸͺc `zC{_q] l2rXphʹgKtXL[$=箅B4tq'HMd{%@vbrEatbZa2+aSTEƀ|ftu) i)0m\+y |LwLhrr]`:Ô ڔ1=x|B%8FK|ɯ#n_uπi%m];>;aN &1πd{N:LT0 %7 ˻sUk?&`/%V]@ 8L&^80 u0ukbi_.n#Lb}_YIuJmSպ &GJ\RB=}Π iI98&`*=ү#t "ׁfZ \_*qT0ׁuLS&ѯc0 ~]v-xL4-~Ɛ0u0WI: 8[u_ b2u \' (T렜Lp]];I0xlG"J:T6 k UcaI@I``bnLG!4)8q焄߂Rw;L{k);RiʸxQQ(*^IMR!d7`^Sd,^(ߛHR({K׽qhud~: :K!їEap2y/8E"M5ELZ09`QKXȩJ!WǢ"u6`WG\*C'WD*Ύ2yz8JB&=)ccIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/images/html_filter.png0000644000175100001710000016121514266763645017631 0ustar00runnerdockerPNG  IHDRu@fgAMA asRGB pHYs%%IR$ iTXtXML:com.adobe.xmp Screenshot %uzTXtRaw profile type exifxڥidns^'pXwكZz_X%uUgeށʝZ eR<{ >??|\>"/-~av'h_ǁ'J"]}"]oh+˿߃reqI!yL{bS,U俯ǟ ]. u*?|`o~8?__ma{.F.bԏ[|?98Y>Vg\W~ =D"qC;p kWLﵖjq%&+XSO;5b^DsKqY zgky //}?}ݻDAk'\WԊsmD$[_Ҙ[ ??~VzN)PK *;m\LH,k5ǔ$,n.2 !o85.F#"aJlz+g#jnаd̊UkmTrR\E6jZ-V{-ܬV[k{^{뽏9G|x47xeƙf6ˬ>"}V^ʪƎ;ma]w}tSNu~%n-v?߾o⋔WFWk4tŌx%o!)fG"i'h7O~Eߎ+_-;s #r?NESA>s-;]Hge0g 8Vע7>[IkD`[5N8x5Nl*keˀo gak,ՙ}p[p,b)l1$)3r wk#i4s#BZ R:Wkv>Aeڦɬ6E[G9\۾Ej4]L 72d fUeT Sr}4>4~b}ޘ?s7K5jK,VDr`s$Qd6B۵MҌJS"w1;|ɑEV$}{]eP÷gbYr4]Zi5j&ٰ2d֜E$HܣlS#çl,5&<#Hqrr6Dl4%~N3^o<%gc+d{,j}*PӹZ(89AGl 6Z-CFIb=y .sjW"/teQ+<ʜȑD7Zxh8Lqꋢ8'𞚭i>Ye9һn(s(k/E|Ef\ra^>ڏ1,T~ ;B!適s#vNIsZ{Uֳ;Mм 0;L.ӏHr&69Kۀ5Yb ( 4(TN ANIǀ.ff%+Ho4ñ4 6b_8NB$_>OrJ8YzQ<fߗh+K3onFƂ4AJ5F.cW84z\Y~ զTz)G yȴpr3) !1/ L.V`cGv8T_ ;s蒑~(b:QOw@:| >fNj & fod(\2Y YRiI"3`7B"|iGyN/q8'KqA]"ȰX.zBd~  9GŻ&B  C$văsmh:tѨ=DgRc:3& 탛 Ҍ@ ` %xB P$.bY7א5W/OW~$Nw#V  9I;Z$pqZY)-x Fa;ai76 Rk \$ogd\hh|GOIrM[@ \ yV7a87yzrd)xpD@ms꺱Ƀ]!]?ހo~ND, ~( 5j [A &8քSP$[-jsLšv: /,TdxB{ #|tGEs8g9U-* Ɇ\ R@z̛ڃ2o)8K2K}pT\q\ 7ˇo9@! C6bxTFRpgd\%pGXPD|0sDqL&zK@\-] QRCc)zt:" a.5/ Hg07X lKolX@J 4>/,^B Z2"!ʽ^$k YoY`/{(ie8HPtn'dt~@$%2h= YlܩÞ$dHBs Xdaa-hknC-j: Lc :w>Ra]յO9lKuRc^ JsF'j<:<1'ԿG.aŤS7@ ~7QЈ~()ֺpgx0D&h(`\ leB;P t5G*]xxf޳玑#O^IY`Lu TE !i6BH¢hMqa,5| H{VjD7 27ՁPQ@tR R* Y +L}`ϓxd,"MZO $)Ȣu lE#PAf@`LE &2L 8 vR+"m-I~ dm_ WG 5vháAQ#F1l`{ɡ=x0PYd%EMwY34_C6Qq25[P5$2LJK8#(76@FyC)=%zDԆ3Xr 7 p+d0-πf j((LbW>Nșð>hD!b'D53C M/S&"Ɠ(Moz捓B q$ݠ^l|N q @|I u#kWmqn畁U A=[,[f}UKu"J>3K&|^st?\iRn0 {@C\xɁ%6WMDHTѨQ1\' 8OAB]j##k > je\&!PHNG$pP e#Qa2>Gs>P!A+bGAFVs9.NpiG5ZLTYF OBE߰(j_k*BDDdRٕ%vI7{G~w0urgX V+ݥZ@) fH}* 8cb5 l÷6!^& dB[C,j߻_*}r`dH f,nsw\ &jcVX՚J"5~; 'l:CF 0C*y´DEcbmTNE{Ћa%Ԇ H~&Gmހ0reG/X~$xWmLj˹ cCF$ܬjuwȆTRY JQN*=ad N3:++ѡTT]~I)oݙLT?XW(:ܬ`O]>(3W 2/ e۝O37FS yOU4-& Oqf ďh7 0fd$˭kh 3hP/L^1h6]kt-G"u՞R0 PSMx0'o$Q!n"d )率 ;}Q8C@UǹIpQ-I&4uGq=1y܀l@Hu ɶ:A+"Z9ڐQǃV󨯵yIv @U3JWRKÅb%A[$tb1a|~q@QV5[Vqڮx'k;aGliSr\OiOȠu(&wcBSԄ,xc8сTE !ͅGf<~7.H ~с;%vLuɖ Nh85[Eנ#$fk'5|d,YBz G+P˃p+b>Pa}{ErqW;U]ЇHzu7fVs2(M,e&ԝQmp2nIՐ--QmC;ut%@aKC'*)zXр7hڤUo򊪩d5 Rh}l#oˎAخim˜@Al>抳%8@!JI#yhRr2))vp '֮IM㊼$Vlt$(cu}]3{k.9 !;R2VBwYqQ<<a@Baȟ P#~bÂkZsj?Ma9FLM`1PGGǢ?b 5GOմrO% 4V'5M45Ce5iғvͥRMXmT5b<:֬(5R䵀;08Mx#uѐϠ#il[UCXC!3Bc rIj]N!i> SɎjnkF oǶn!GR@ @<8gVBacj6银S{d?8p9&tnB|x G8AfA~czP{|zE"A!&ڗգ1`Qi&)( $L3]\~hQc(.hb"xZ~Z5TEJHi[I;Ჱ3eר3^yOH+rU⑵rdC'04AB@QNSg^MmL\ MS?RB>{,m#&mCL%M$~sEQCW~;SGm$O ա"Ȁ#!,ckmUX(>8)`  qp@HգVڂf~i#Y_^X~o\%E46fYݜ؃?9`éS*4~<_XO¸߾ܥvaOzkAi.@ST.<<8AF;-o0RW#Sՠ4m Fi7k9A'&L#BK,^~vzK }iIHC/MN4H:D%PE@  tmw9Mqk#z% (㖛C&cCGlZqp}Er4:Hy73TӐoJ*|j.QGqռt۠v4͖@@O^I,{Jd2:hq?ΜQWPydY!(7X<8HLp PO@kſp)Jc:Op*&TXGb^4\J7uAoLUR먝&to5rA* " eAI)שq&cT-|^y"pG| MB2J FmTNel5vY6 Y{^K{HF"41e0gԩKuiAtgֶaCEҔ54,̒h7$QLJ6|0Ղ&!CeN*{*(34-T%'I9Hͨ|0~ 9~!AOfP ș  ƷR[BC- e5!{:jM %<~r yn簳SKJoO f5z^0%JDR7q >T4245bӨrzٿjBq>c9%Qo5Mf~VzV6W/SE KrQYr< P΢zy~eM{A'8*7('`1I 4(2$%{lj6,$no L@2z`z fETCY Chժv0PU BZ\ IMLe*ͣc4z1ꉧ޹A\J1HU$t P9=bѤ64Žzzb`AhhlS3_2=_HJ3WmcJɄ }^=AR6qzp0)x}@̥QA 0%F82hN8d,zӅ@F{Ib{14B{jUbKj"9!8FFZD JkWBu$972Ƥͨ%̗~F(5ooV{ij\M*+ᓥg5׵aM='' j@ֱ)*MB Q@c=izkHGzy@CSWJ múXr5.Ka8( (*O01k hkLi_9kThHCYn'f A@GM"Ww ,prcP[G"(|e T;v@@GH&̍O4~—{x?\1xAhY$Dc1 ƈfv<'cwR]-zd( ] {'0cdBzY*yo~}=|z70_.>/_%,pu/2C=Z^V2(+I`CBFw+緕YK>A?_#޹#x~GO9g0a_j6!r/O~.󺏕ͧ&N. S{S~G}>(5}_6}s ^78:RG(R#vyב:3:RGHuԋ`O:IHEHE(uQ"u#uc^GQ^G:RG:QyE(zEHE꨻gx&WuRg|h_M^u_vm"uZvuY~x9:ԑ:Ry#u>Lzב:Rw6IR7㻉1˩Pn`u97M#u=u&D#u7uRG1{qI(z&smqmʵH}u5k|WrfH}D &ҢY̞hԭPSt:u/d@[ 5ݾb.є}?M۟ezxg?b0zżLKU<.#{Ɨݒ`h)6[\go\]bϤwz_aFKU^j4rZڤlVqЬIdsi0&`,K$rb|W<3YljUl[.ۅ~綠* `AL7oYㄇ6,U/lQi2uꘝe ~:P)`Ӡdp0u:80=^?ha~_gleU ~֕V[25qvq)֊YFx,V?uu>'J`r6 SF뀽.ਛڌDe W 325$2`ZkTVBw/@U] JKJÏTi뀐SHR qUҀk*t_1a<*hȇ,v.K ޱ(tD,QK`OW; l՛_%f:Ke\Βֹh0B敖|pԑr4u_ѴZ{ZZ4"mũC&s!I_7:RQw~]EёôB#kN6nPP XI6E7zl@`ಮ +7^ Ȁe ]3cГq,8 R)#TZ+H&7q)}Vl+vameYt5`SNCH:a(RPV  *$mim> L&bKK(lm#Cv0P348NZ׊:ȯ y/u qaf~]"-怙5,P8JH`^ӥ%T%jp 6Fi8SaQwhʫF_+~ GZdb'=ub~"HdN^aNe&#ұ Mj2?F;yCMDq1_}6fCC7:!!$-\时~,^,yŏh|'x܂ Wy3.7+sBJj]$o\ho~O!:=3).=>QY?s-L a`lp~[,Vmszyp/xK-~GN0ب?^Ǜ Ǹ A`/b&Wu\+g[;.Zߒ엽_ĎMڨ[ +h76f^XYHk\"wm]9ywu2.+(vrY~"FݺFZ+㮦W ~]Dx9\^n3!wl[1Vy-5oֺ>]AҺ-r~]j )v@&̰DGB$}ԻyJNu"S?k3%nul,/a;}s9jwܛ$xh f{͟EUQO0 kن-H][y;_mcsev0-9ԲhLz;x>ROCX .^~x&s=|HK+;;u(>(|6cC?p05C+YkS@&%PѱأtffP<|a~ț?5-|6oKY)nNE]`vy_EjgO'"5,ә˨KgP(SEgmi0 %.&x; iӄaqOY61\ H@|'cHհ^hԩMN\W#~> ɾ^%Xw3!D<ku~c б(a|j 7Qge՝p%Ue3 7կ &b2Ku+x0bՇf&ب13Q]U}9@h^4|̔)3qIdz\P8qj8pC9޴:{ (dN1;C)qUS{\\@\Vns(3ip80UR.+ !ו:CIP"(V ̤6~uHϜ/\]] ,qٔ3Af}40n~* zrm-!@P=OOZB4 <3p@__?NῖQd|Jc݀Ha#Y_6Ts>;$&r<_إ-b=#^i]hSԛok,їL~_ٔ޻az5n1Ȼu{/uu]\W@Uz r9!d}՗bz-8KNSæjLGgP&k3k)t߯3b՗үK:H:St^*i0Ls:@{CՅ}(}%!K0Q r^G0׍g<1~'>V-!{Eu}k_ԍ Q7S_sݷ#"4RڀH1EK*Y -/~JƘAyݨ']ߣKU+"VȢM h$;\~-\@@ 1^L@0b 3T~wFMXDSҡ+oWja1EsnA9a !WS9ݼl ._Fک;xUv홴'RJ^3]9{QF=x/ow|aNn_2M9n^^e󁪘JZW-)Tvͅ0{|"1u@j[8|WŘ$hGy]g65 K~E:]$5S)UFtmU{y0՝04W4W>H]4.  UNp-C(<xJGgAɝ7uKEޚgGvmLn]dELfwtt2Y0IJʫv1M15ty<%3h  @ B- he';r}'r[ EߔVmo5]$Y|-s~tZ1e[1XJ3>I:ӽe *:ǵv(3fl'+t:|'Jou vtNbv.׶ ^>cD_w= ި{8%~mvk]$fSG^B qP ˲PɚyOCj|81S|l^ 27<33³:rI^fĊH-vbj{57Ꞡt7:#X)BT*oWVƒ8:pl E1qVe:3~]j0|x*SO1vvP9Jv g8pYG]7ꞁ~L#y*fѸġ%ibE\L(ShOvOץzcc-muOiMh]f >r|StlŤN{uׯ7.HoK%viHo*C_=]}TCYW@Gp]zM~iA>[xw6юH?+_}dyD},;R^羕׽<6-.{lJ ^Cur8Ǜf]2P,XmuVZy T19VLJ|BA1yc.3Pez5OG ǚyyg_ Mk# D*Y>vxe46}(D6sݟ1fR̉{sqfwP)OX⑯~t?üN"A[zwluMzR+u7yiKقS8"$45# T^´<*mٽq9hS6|i|h]vQ%m.s ׽/Asu砓92 +QJ4^:gi\xOZ=NTŬoswF\[0y07lWۋc-Ƀ/ʤB̅/+{_=or]5xYiSAfQ[QDT2bLk;1[{=il"ԫ;ait6f{:D&b_xicٔu/M` v@Q㬵]iA1oYf%'@ 0N[փc7:3e~7AOuO&qy. }$J)d:2./+Oo0wo98SW.e :dCV1[ ▞tރhВNNZ2{)x}u#Xt]0SGF[9\:{iYg+sy:7M-[=^hΞ8e;KZ_|jY$rAF ]Ofa:Z+.NLos;{ɼׅⲥ6t`Lҿ-rDsMLWu7;,ŝq9P~HTj'99wTUlÙ9 'M`ˮ^}y6j]0/6TQUѾH2oڑHcEd]7Q':cgr.^2K8 @$:vj1΢}<;P-MGa)wڶTaM举%_ݯt]\WD@[Υ̱Zܘ%wY%aڒݫu>$'X'0FYsҕL4]纐U,Jvgv7^/J:(v ͥ j?EGq\B"GbH%V. ̮6K74$hé9d^aqW^k 17:^TFQǑh擪v +r1Sͅ=0y'|΁>׭̐y'LԕMd&i̶%irCyo)г{"6(@DjjCjT2.JLWE2AU5O ݫ)^يb/ !ok(.C}cjSyݯ/cH+E6 Ҧ*yi%Ϻ'yGk= tQ6 Zzdq/huf;Y0< Uy9nU_) KʮLT-q]lJĮ)dIeH]8PlbK\/ڃ %k}g{~]%,Ex'U2]I8 \VY[19ZC\)/^ԯ+0iU C\KIзCQL_abw6s?{ԁȰ_Miy:O(ql ZF] 08Y,ȅwຣl naƛq'b _*=-+`܄-uHg>uϨ~]ẚ`ˢDM 5e$B0pנU28BѼO0/S9'$7[d`XkiܮF1?yuqYȣI;BE)2w z*jdLiݪnJujV h\##-4Aq/|hSO^gn O5LP{%oy@NɄZ[lB}r.9(y]>B!fn_9uK57nIeTXMQ(pRs%q`r|"ϣY8Y 7?^D tS2]V,Eû k2OuZUI몄ꞽH;T~$'X:Eَyp”eX*㺛 au# yTg ncբusiO?CwCuBWiev艏YɡͣOWW1'w}U)VCsl5[ R'S^ҏ9(Uy?:nΩIԁG7Go]r؂\UuU%)K)RLmӮr*-9LIv^P,n \\ gbm@j-E1F95T4:̓)ѝfi9dGx FWQ'3]lyF:G ꄺK8twCY[^wv|D 3` U_2V[֢Ҧ^#ݭPGdӟuu B"YaCQZd[t0lX4H]0<#͡1/kDv6UCMz a"… rx b9Нb<_ XÇ8Iҟ`ۡ ߱q$Z&7Zxkh1YJk^e+v岿ׯE|΍8 b7+fy38>y7\/h%/u] i&4zSvOSo?3͋Γdž;gBp>{4wAQ~Puuj!f2zƗΟuߎZ—zje8eT\WHd%Z^ -iʥujEץr D2RRW&҉˸lt90ɦD(4]Qn15`cMg%QYOWN?#m<) "pGX^||=S !DQӐ:@U9 MxdI<Gż}ǨZag4,+e6ٴ)R"s @hșsthJk,%[zq,B!f\#V¡E6J8@i^.4u#,!$ԍ;"7Ƽ2,<`cӟ u9y*:|޿@xJ[.g A4ouĊdɉ]G钰S QF2B L}^lʑ)'S l%BHV: ,.|l ]uVy:PCcp ؤ8 ;[ups.;U$n9sd8 0~\΃8TfxA!ϺY?#msf8Q1y,KT֥P{Ѱ4@FUL &o=&F)6'}渗]:|i˿tU1;Y=K~9LA1*:٠7p)G]1iub_-x^Qwto=M ,b+J]o zyr#ʒsݫvɋ}аuO +4E'R7e৩3'IOcXy]ѐcMt?RrK2cJS|gz'|:s/ZǓ4Y0{y<pJ]@UCm)u/+"ݖ:3l+\gxug4>9JCD(# t.mP_yW uUvt7q%؁E \eQ g_UTOp)aE8MO^ٯYɲ-FC.r뎻\s{vWf<AX,v* $v1RV+ 븞$, kXpDc4Es{9RP`WÌԽf׭SnQA^tػ崕%*q`,+U\*/}̬>2 ʉ'9 MLwK$?~'hpy%c({.sr\8pgMgtA\6XvQ8X:Wu~NQR: *mܤMbrE lc^b76ڿu"'E46+ >Juzxۑ%$` }OX)&.zݔȿu#!DžRQDEQ]I Jk&Gpݻ|=̦^0'dm"tpK־pYn{3kgY MQs#;TĻ0+ 1BEɰ3ɩ:5%hB\F/~s]{#Zp ٫%) rCsQ(S\=w7e"_̔ȄJў878/B}ؕs uX%wu+ϴD]Lr0'uk0;&ߒ}z;Ǻ ûsnŒ$׹)qX|fKc^ أXxu&)Y)f>z u-V&;r,2AOr4“=쨁)Y\wGId6]W<?6.%V=䰝9 .0f.X#5ԝz:mMZ)f㤍)meaT;lzKpѓ evS`7V-RAS D׺eOl|³i*pqp]I9Ƚڹ }ü_]< p'4d`·Cu DhmB~ Z)^e^S̆Yg63`O +TJ+_uӦ 7ؙBa3V̚C!!üNo} uvSV)Ŕrpfi)0bY` P7O?]Le*:j-?"sN-՟T_7ިڨlE0WO|X5N..]GS1/إc *;U6~͛Hd'Ӳ .(kf@Fn3)%U~q;RnssJ=7.g9 7 ̂4OۨHcXk?Y+r;MT%ԩsusaf4UVf{b-d'R&';~cSL:RP@ݔ9˘vF!(UFX!m"x#w@2\˅st\=e+ݔ,US0aλВY2al$=νϛ8NYCbE*D.((IXNTh;*Ltswn SB;%kJ#-Z|dn^h $9VЉXLCM1 Efzŝ'(:|ʹnVw*kwbI*a-Jdew9[*rF\u=trS42'9l8r EOLxsIun12zAxbY4"'9^A7Eੂ姁9>/ &S(XaB9׮bV6 Ah L/5y\9BQl7[W ūBҺ깎A37`MUU+ t0KK-M򠺤BΆf隃q!P$Q3Ŵ۲dK7g:+̯q]w>GwB|p'd Lru7 1srfq8&]eYu$ *<>xuQX+PYO{kF;es]uG)7T~(< 0Lμhy{05VTLfXZ [V3W76:?}gDZ'q>W g_: 78t[and,iANx"tY6&ؙm=;`tl ),hv8ݏ|\4T"#Y1nuaǡ>^kW{po3'ԥQ<~'MsP! O2Yw\dZNW[)MtEj=̠9NY^{Rݸ7 PHŶv0nn\x:W;g~4xO:{5Yק]6 lvg96,D#vt%ޛ+t&A]_JK>'Qmm-z0lvZ9gL_%u\DvjVuTe讇 { N/8Χ/qg9{vS:emݬs]LKv=Ea%a&?U?tI:<:X`Pd1)<*< ttb -t_ CkÇ.4; \5<69xoUȣ <P |gtH tuN.uِmcR-~N3Ff0bv^p~s!]iV:+L\M1@gh{Ϲ.U<:]qC& GwX5 O Pq1ua*3t(ip+Js&qXc=)}2sմQLSEX ^u) v9i7e3-nԮz;TOf4A9'9?uJM.`6ikȺ< hN t!u8|u)qۏGL{&|\ÜY[z0.牫0G()'\:A]L \a:uw7e:A>|3DMui5J\wK{ j77.OG*yQ }&_G~Ku ѹWV%Ҋ(:y{%n;hbn-sOa%Hm; :a]_kr]G'tE"ȵ $nfnxh[/vRd?rs/L7;\-&+('^ji櫛Q_e%=]O6K߹Uw~vRGᣛb,u[ifav _)N-mrjQnvI0 Ÿ%bKEIw{0iQq䵓.$nn؊0.u u/bF( Rr?::xVuJ0l̍x:z%h0]יɠmuInQN91[]$\*dlѶ;?+IDe/ ɫ0b|"=vlZyQ rx|+:V4K]8vjOOfč4i֯ÌF vX |KrL?7[::)Rԛ"6^h*o˜΋)}q7ߍނ˙*D"_G^hmA X6~^W:?ijb 3>rR| ?+;m&E@vCO%ܔQ⍟s% H{eE]=N}Tms8]]s3h%_цц-?{:yS~]7 TAjvaƣ %6<yS]7%nv]tA N?Gm\wG%QS A ohe hBX9Hgb:щQ\g&C]aL;"sBj3Fülׅ|]螦K]?\~suYh9^W ȂvnsSag2PwmsshP:]"҇E]Yj+k]ԕui:ry)WE uO d+Muf[jN:ڭ@sOҳEph@QW6QfIvʗ-.e7]WN2ݎqۍ#b+8,V.Jm7@xks;t{=y;^{¬\yЇ ( %Ѩs,8,*D*΄-" X<1֡sph}RE8K\w `ϠQȮ3$C r7Mu3u8a5C 0Ox$엀4L:\TgH@wߗ1IsQ5̖Z堮+\wV|vAf ׌݌pK<"I& zʚBՓuO)wA]my\nqnn6]*bRd,U,@rȖ *&^D<ѺQ]zT)\anVLH*T8S$h\#9C]y8y@f2vRdx]>υ^d\J ֹau]u1=yՒiUyi߇In:pPd!s+ފ]aeWu>>ϽoNLXA4wO߂1`A_u&x2.MA]D ;QW{.`V Lr0aB ve q3+iJ`;aX89/utegfhmAv]a>\:]r)XS8 0 Dfy 0 2ft _L^D]3Pʾ]P7+.NwrVoM\PXͱ4*P/akԔQ+ l ދ<|,%.^v]u jba٘X"4b;}3q]BC*u%NBU6<0wΔd%ud5j>Z>J]uƝ.v]U7a?2):R*le\캄ʨ(5| PWqr4._rNAuD P@]ۻnìqpC C^*:,Òr I, ,B9X HׂM@`UW8Bi +B'XP]JF| .W!Wn(wF>) " &+X'I9gy5u#C>L*'p 's&SKsv>l $}tH@T!938wX{϶ B5l oߙ9'k[l%~C?1&8gC+U :@>vwu@ZKABꐇ(/ޝY$ IӓӤY gvm neꄓ0H˯pr`DefPtP4(wj0Ρ,ᓎk.JPgI+VDB * <Z-̘gZ,DVj*N 〙9!NB JM*U5]$`um5CW>ϯfY9i  I$=A;T1RQQ ? a`6 % Op ='1WC@tq!");! M: sX|rX>Y:}(uy~uF~9# @1X;̭r:y/?/I.&N%]Hp" *~o:m5CIJgͰ\Θ9nL}m1f~hxb&ċZA$a& d%_I9AI.c` Kfy vn]2I ]i!_ם/鶡\j uk3Z4ЬiqlTel8C~`$GdnȎ))N6ph0?!CD9WI_, RsMQsZgn7Zɇ2c]M̅[E:TN~&ұv~_W9 m, 뉚Іso uo Bݦng8j'tu?ec:Ou37mv7vl A:e3ukPg 8+\WPPW5~] ++++SA]ACQٽiWou{,[>_ẰaU4q0lAẮ=Sw{?L/@(K%WaC J'<}*[[ӯ+1?t nF]7.t5s]69%Ԭ#oAk6u=\P8~ U4Ҹغy,.SC k-ӳ+gˠ]z02Fg/`3uU}u\gZ! ˜$")0rVj4-uUcs*OiaYcFIDG< q%@SZyuNE ejmddh. T-h6MHP$yzME%x"sJ<9 צyOǴ)_Otnn#o9#HZt!``M=7ĸEqSieM}p]1q!2DB$R/Kis 2bc MyK$TS@=N͎KNQ ~Q~G ӧp~en a .Sherj}5._ l.ǨcMtdV`1WbGe`  ƀGrd;ys/\wG}ɀ뻵1̫kut 5u{u#+udft: ~tQHǹ$tIz:XmQ]p]DkGcCњ0V/sgc.5h"ک_TuZͥ_Wڕ\3MEPGg 6l I`oXU| Bt W4qr`| 1zF-n MBg7M.nN\ @9ODykpT+Uء QA[uX.zk;t ~ur +gC6"-Q:u(ɇV3fB\.Pί>!A6a-ˠmus_D.ǖ:aZ=hgr%6qrLv^Я#ޢaSIlM_tz},.IwAgXPǜNæOu 3FO'.)븮۬m>tϚ⺷ 6w%;3;%U] \Lj2r_:ԉBp:EO\?AnÆ e sλn?7^DТ .k^jZdJBz0MFl6Atw\~'*h}N&Jfؔ K17Ncvo0CwugQ}s8߶(CtuMwffNal]}67qxCn˯;yZnIӻ35Վv@|DpZi3ìm&́wfsǶ"zN/R u͡m{Nl#,2j":ld}==עnĝO܌LnfD)y ^ zsuA$w \!*iJI19$̧uD~gl%a~]A7v5@i/FrI-m;䇢nȢ)`/p]O[d3C{ec„{gaZmiAmX1;3  -3" Y/L:}7 {:75WKu†ҽKPf]*ut-nҺ#ÑRbqݐw w9u2?,s b Pͥ)[qZ ГXʡ0q:~|ZW:vR/ee7J^̓A_:ֺSW]R* _Vf4u83 ]3,sX똺Ie7u8 7w:ңGud\BsZKoa7'ӹ8݄%j< Z1` XK_kVeL<"èt#^-( }I/:Gue.'#u9iC:2̑ճdVޜpZ1uôN*8Z$PZ f!{ I16eXA甤ar uLPvucQ:@-fó<Ҁ _'"+쮀%̘I8\uX~9\RVYd:Wo1u7c8 #ϏUd@ n A:l%RP,L@dcVL3̙yc똺q:- p!6ň9lU{%:m =DJֱ t/k똺Pg+V= ω!UC9]:duкQS us~׳c.C[Y^x(1"xC?: m֡tbD*YG7cRVWOXhھ58 έrh,JhCaSf%u3$s\]/ߟȳDt^x@;Zb4xV%(XW YQhf.жUЯeJ?LdꮩuOq&yM9Gn1aK!:Z=e^Oi3(u#=zO*ukr09c.ױ%@Z$=%g꘺{к{2:M LSw-9 Sqk5 s=| |:p׼oA.R_Wͥo/z1K{%>FUs]<[&K]#hc>Ѧ)(P4Qw4l+j`K}_g̒Et‡r򬅐zuO /KZ&L5ߥ&cToEWٟLvmm/xN!krJ*3i3 sRuԩQM$j< wCJ;K2Avۏ"Nq[z$1ȩDON\%mo:u,t2i#5s]N=I4H:iKnx~qfQSN)%0KZw]NZd$X"J%I~.Q~ݹ klنx`TkdSU,N}ep\r:6MQA93]n;hҺGJZ{q^;KXȔ:!tl9>pP.2ᐊ(VWJԽ(sG֍rEV5nQM86]xH*Ng\.65UUIkq[-ZgZLey䜢_sjbY$VbLVqJD5~loBw¬4k%wl4E2=:$9|@aDZ ՙ% chng=}g,ڱr.+DY"/tŴ! c+sQIK)bx&>hLˤ}V5Wjh?J3̲[)-bvxΕ{9۱ vνDbwa"uc)q 0M~ϩQ>!ǁ.wqtbP:'P2 [ Wn-u.> ?N;wr՟a_]#{_ Q_IU4 MG6aː>Gҷ#3SU~_2,LxhA[HxonףոH&.ͮ&ؤxe0 fpva ۣ׌kYvM쯿w.G'8j2w aNԕ^Rtc|u:3ΌADi3p'\5ЈU\S2cO?MyDQ {_g 2 [sG]Ñ7e%?o]Sf+zE{V,A 2a\t\y|Nz|y,BKYDݛ'<:mtu1y<g~öFc.) GD?e`Ңs)Tv.3Ƕ s{ݛsJ8viΎᡛ饎+4'xLA,lusцwǸk}aVI_0)3u@:y1y\ֆ CxvQYVa]h-juDF}&ES^%vOj.ʂ։ إxw8徃 rmK7E#&k9#_v Ok2h̍hku3ڔɒ &C_:LUsK;{zH\*oBrnme,~E*Q'ԦX<#jV6b)Wfy4=Vf$>\sBDݟ0?9p>D ):Ngl΃╹k:\YlcG"Zd[K9@1k|DGMPא%>B抅z4#sNe<$qE4]\:oM=x~-yq^) ;MB+Z1̴==JJ P"[A[z飘S0(9} 8s?Y&T《z srYyM=z_u5"q%ֺM٥P{ uuGtVN+QK(nv2xs.C'rxrEQhʛ#L'+~O5EkZ_jgDy`\]hWR ^P}F:sΎ{"H9Avr7[+7D+2GFOzrQ@a aaޠuڳ:SFHxu.9|4EzuNH: ],)>2t77kmN`vlA{",bAf"f@4.B@ISK)*$lrܚ$Tjƙ$1pHX82a6͈?ݹ&LD3|qfӭFqť&ɳv*0J6 &Jϑ4|% ^1|'sݜ:riƄ` Vh߉h2pdC ÚYr9XbH6[i#t1V(T:KJňPÔbi' YFSK1_(?:=0Cl9r]MyՀAUG Pe V"Qc'ҵ1 y7cY&RK `+,$T5q3;uuJ4R<27[3As% ٥yueA:EaVSi5r X*[tw}؝Laשa~i:Ⱦ,VBkCڎPW06_UJM]-od%G&eS~m%r>,G5s{ٗ?Ä=^I[ɻTy4m?Arn4HQ{ڠiH?ms H2ǹĸ혋}QÕ`:_ׁ!fiI\H11S᪗eVl)`UgLP&fQ\i1qDN3 *,$hX rKnDw8t<{zk0vjZE-ͬw^P;hM01 $D64k&Z brK^%LP׺K;9pt}u_D.2cA@pm[޽u0ˮ+/svcAG&jtFl+.xg W;ٸAf7V7DNirK A%t0oӡ;\>NX?ҍ:=uOOê{zz oo_㺯:Ώ;#.٨]@Hn% d!lEE"̛;8hM>ᬌ1^*F;[\E|LU;uNpo7HKN\ԧwӷ0)|{麧]\+GW뚦:q)`5#0p`pyFt?Z_dAݭN$\u%ҥرU.E??Ȁ@@xP7`hnxN{>'mx<3. NF>=>g<=Ӏ 9+->R^W^y9qlC/;ZFNؚ>n:591A'I4a wm3KN]1` ;@ u9^z?ᐳGCu}/Ÿ%}f<΄חj^Zsvu-ta"Aw֙Vͭ/Z: 7а}+խב3iH "3Bdй5A9BGPzuPBTb^N) G Ka6xͼni?uPuW$VVO0[iʛ@vw3|fF] !Fh '閘-[@sDץ,G:u!)EG:|8} B߿Usq-ۤ6 $cgLZ[)sh5В&bSArH:S IEiu|^Ǥch ;EM}u5(zb|F9py]-Uw-?:kd7㼮mIñVĶ:Ha咋'lKTuڏO=%(Bsu,N&kw_'+SDDK@W|w:> HO?Vyuf;/# FJ7AVF=0D7>[Ylؒ$vX>̧I\?E{6B8>_bwfBn#{|yѳyM1s˒4_].2"*|b:$[!SYSC˘6[.gummv@7d< .g ~CKCOngCs|JuΙ] ]T&MU!1JQtZ^T1͌}S+%1.-guZ%еt$틨1hG/wԷ}<_縮JJ*d m 1Y~(Qs O֛ϒ[#ȈPB R ȏ(Mqpq\uOYot?7q⭖N/hOV& ؃ ]&?4<%yaJcrf^]NQGsˑ&:^kEբEHҖ盯;"5M1z]A)V yzr*fsN!2ZG|YV*,dqw,;1 we_7Evv'Q7VmAŵ/F1ênQZWB溛ϒGhkYuvE+qYHkq1掺\7Hl"ĝ8֔`3Tc<ȠR$ 2 z<.=.Ƭ֕uE G3_!Gi]T|ૻ;AiN+iЛYaTL!KBݤinc-iÈ+~J&^ 3dlv:^&d[ :mgN\Q7׼nQ?)an!:i۳ Vq:z [,--Ib⦨EPfE]E4[*&6b\oʂ۳)¼a2-&}aė!_o;~RjL.TڋYjiȉ:PuereQA1e:50/8ӥrZe|܏q PkumNJGukf'2H9) -gu0TS,ĕA'WH3?g7M%+F|5LЙYQW';T8eYH08|#ۮ&sl0i]mI`mdu aG 2Y3Q`܉Ia-&|㺿8?]zigStOv]P7A:Nr6\ӃtJS8ɢduv|S.혼n\NGaa%:؁//;#YUӖ0gL$Zc_pxP1I=::;nu?K~uKiGK$R.Tbsͺ0>\DeEݺ%߱a4wc`be8uGݿ._i uZhD8tfkM:]sgb*y]]N1\5I"<%`#F3IVA.)#up2Y4.i=:Z l ;'nuME|)#twgPg/6>c$>? l^Jnż(u-ԝ]#q8%!G _ SumӸiv 244X- n\Exc瑫]7ا] |]a!wg{K{=׭EM󾩏ruf]zZZӿ{#I rDNߥ?>-:V\C x@WMrMp+ s_3 qO PF|vaMQ_lqs{r#̵uI+[&.*ڥh*3SVڀJfsssJ)[Ma- {؏C=WK?ҿ>oIԍYwn4ZLj 5y:0;{tr̭nVD+qtҊ=j3 3tQ'Ɏ]fe\Haj%YL!~: ).dr|y4`C=٬Buv*TU K벪 >:%~Q5ˠtd zaĘu)BIm(#L9BmFrs:i{hQj+:jѢ\⋻vdB3I,:V.7ab5**SUCAaоk[ 6?`ʏ9w4$ Qi{U_W{aGOR WafδF567Ҟa9 ˧RrV)}u%c Ja#zWwL[ɭiJT Hႊ"k+o09:齥%0y$ljgFq]*H 1("ɎFhuw `Eq!1Z^ eQVM0A]8<vmnN͏?/7 u̜7 \"[ '2)&۫F̗#6ZtO._0m,@3ni>\,;nf]GT DL.`clm`"t5Q‡ۅ<*P5V 1'd'K96NɤtL~t\rrc@َiѪIuJ>4~%mpO8vz2O7=PlbgܙQlR&[ue)%ErNzP~#\3Pg`wuOϧi<]x7G>kDj1AL!1uV~WR1}iKx6F]!ԅ3G/ӧ)\X3 S<$b Rj1Q-xky@G"p/ a/c):@l*Rau1EQ? wQEl؉g}6KPM:\?pNNaTHH)_2ͺˀ:uXLeNV]s,HQR90LK6d f຀:pQ&JZ0S|:s s )zwd%YNZKG3e@]@_׹KXL?g p[Sܑ ||݋8#b%J2SW3IDY' ycda$7Qy%=|Zx>}DI~[:&j*k,JS(gz|Zb]&5돀R:_{_j߭EfP}LC|y "{:@à_+UU@/~p^W5#@}5!kjsퟣ];&u].Hfpoڌ9ʇtj/CDWχ(iέ~m3A'M6nEB6 EfԷR?]U]L"Q'񶝡Q"nOh?ֺ~Usva>9ڱbw$&#W:ShjPגMr2^ji=A]s[eLqLSg@J~6u&'tޅ?~ɇyC9]RnËbp'Iuiy?x:ox7O5L6i];zUjQ ZGȵ\l[guz:v Fhj4VS~Gyu$1Ax'6ʙ!n: Ւ6L2~cѩcSskJjv_?ۯ'TkfꖷǙy/Qw;A^u! #u)d܂ζdj\ֺSAt3uW0Qׅ*V_*VLVЖicuDέu:%PkyGQ8z~7I ^4:(:iRIԑ֔~]?E](JƗeP+ ڒH#.i\RQ7ԺvqGo&25K{ &#>:o2&(dzzahkm%uN;.o'Hi9a%43'W3nSf2 $u#e83%yUJ[J=H뎩H9F6'KSqF,7TJ<)JKV::H^? :M7K^sRRaÏ ;S76`OM R䌩s{_?&xAq62-1V =ZtE[i<n|Ϭa*GkX( \ΘL5̉uͭuwz|:Qq:)?g[>m(n qzuPuuɯuouf4EPw4߷^ } uqO46-X*vN\_ɏw!p;%WU:h݋SgD_Sg ^xQkr+*hӮll(Y =bѯRD J^6g-ڌŌ/K~Q>:M:Wu&b+\?I^4[YxnUCB3(Wd'N x=Ϸ4[ٯ#?SD|dJ;uxIO2d/R"7}s ќМwQa Z.uJى9gmR9RZ;r,9(y__EU]!^ ~iw)מ9Q*ε֥2tUMW *-C!u$qEJ qW);}I$ ]!N9y^ҦJIQVa~iu+)'=?v56`b,_t;/IxV1:.ʆCi_&pA'rNaGk0?4{)r/dbL`IPJ3XQ+ ez4A^:mp!E, u{@ R7Y.^9xVzuuC)P:u:PCց:huԁ:Pׁ:u:PCxU\X4PA}'q(GLk3u&8S^}RwnxP@kP7k`|ɴ5\eـΰݖmS{c(&\}+KXzϲӤBV\$2^Y(ݚSCu^"Sus `,:2++rB ,+B4GZݦo{׭usFR7Һ#A6 .WRSYuY^.@r_O[C ҦIrӦ ?&eK[I݆Bu/]+u.RSk\)պ*Y02mEQ<;7D>F>yU*PɷSRXn-čPԦ{1:$v;ȓh\IJU[&پ它j]wBYֆBTNIq /Dr]2W[hfs@{D%Q[(Xmp,ީ"tnKK]j(25.@(4t!$+މ|YK\A/됰-u$)Xm{~4Fooucd^\R#8vP%i?7eՓ&[O-_u弍z)&H/,)=m Kv]iJKd7d zkpVlee,+,H"o!u$?y%jS']-UJp4 cUUaB7[З}ħc^wy* 5`wx~I^Ť=3ydj:ߧsEݼiX*Q,)6M~ud͍؋\ vE\q̵pؕƙ4_mVlqS Q>qP EԅRrH즩OZSu:Մ^fKN!PU-D:aJL 7YFPz:;Z?[!A2-F.=0BazfۈI}PWG-hSC4$k]WHOMZZKZtZ]v*ֹ+SҨϩKʦQ ybzD7 °YTZwu;LP-F(3:6k?xP7H2uE3񴈯b69[֭pQ3BԉnN#Lg46u"bL\O[S`[c1?uXԳԺSXڴ--ZNvX0X!"!sQweNIhXa%v@/u;ԭuQ뚑sP]."cXl9n"fmRwwabvA[;'im{?gN<2Sk/9Fyw2ՉG4t`؊̅ wKי &KmzE8̵nʭ} g;}^r MFjtykkJnvenK/Q#7RǼnR'ߥCܔI-Gݿ~覃֑Q&uΓ:.R ԍۡmsW'bAP]]vAԨBRvyuZM-T'9uG\@2P:yv@n:9mMصmrc^\'d7u۳;d.Z>-i݄ϝRm71]wM%6q.xn"u.U'DNzF\B5tDŽE^I!N~_}MuSoΣ;9}%n^ ZM7o̖M͈n< u_;{PDZ)ܴu8'ѺI{|^svc^u:{y :RnxRǼZ73jGB37uZGƕuј).~HݳR/?-QM{P5c=}=֑PG#uԑ:jc^GױPHԑ.ԑ:RǼMuZGHc!u=uf˾ļsZ# Screenshot 4zTXtRaw profile type exifxڥiv9}q77g Œ(UմER@s狵&Rs'|j?~u6ޯOI6u3'KzKx?П]B7w㯿/|BF!BSm VZwp5FAs ͅhW{lϟh>?)~||KZˈ|?^7˟/=gs1c>#ޟ o&܏eK\jNלg&nn~n2/|~p_-_B +Tj?C1Qlwy9sw_OsLdK3`\^>04sۘw^k?qFnkv;K~Vx_Fhwb0.06\vx_Ð ݇3RABfn׭H1'1)P:cJPO!ŔRN%R!ǜr6d[/ĒJ.Jƚjjop/J޹gʝj: ?ˆ#<ʨ>qgyYg}а*vWqw1N8O9?g_Ys;Sz_5^- h"3fGnj^sfk4gy"y47iƘ8>ݏfr3sFS_缙]yf֖ x{P1hwJnUi`vChx.=;mon:ܧ[ubya橕Fʌ̨qy]=[kwl_{1};rMSPښl[f/nq➹]F>1̃btmkvEvM\xs4+e÷#3Ye?q>p Mfh Hrs 5AuxBz؝>VϜ|5Vٕ`<ٱ&CLOKm4)Ɋ۩v^ȡΉ +2 =C5dGm^p mNWI/u2Y'6tpaP3:$0v$H:^ pxfSKȿ71E`KIK&nI!$ g!r$̠TT2?4w3E?Wkąe甋8/ >KkeLy=aHx#3'f){ :8-{O3zi*{b悎Z1)${98n֬g 1d()M&eNSUf\ t0heŲױU7Yf.WCS|h L0y*BF؂ŝD:60 X?J}cw^tϚDR`ʰ )nFCώyh-J ]XӏHt[{v0!(`q&=;{kr ݚ<,&Ef8c0zH0c^IĥeA>̘*2PZTZ0OKFV<+ *@+`!bt;9&V3,Rsg^ l 0r3b5KD7 '$s%Fr\8SA=}l7Ϥƕ{Ż.瘫s.󇍏>ݼ7uj3p/>djF" f $]%SSlN$lAJ@R*}*dkLv?Рl$*%SR \XNHHH#gcj@tj!:kЦ-ƕv?mkt1 QϠafx~`UR$:|0F= 0bj3^/%ɦq`On@ 2n 'A%o: S(܁rXalMmN'bOAۉ N$*l7vpg>ց.mHxA3=Їzof;S*qadáܸv7do]ةNԅV3]ԝ-v^* d b>/tgE3b%1}3Q*FdrJ'p$ ~] s#h.02G-YyxbOd,qg`ήؘG$cur=9bbd4G_-9[DXFqe?vw67H쓽C/2o:;c3!01"w v% -a*x#j$B 5cRd98|[[ 6Aa_l R.RRC<7,=MsY $ t@Y? χ&;}ӠZd#sYEɜg H Fa 5OU .ٚ(PD́AB :ό|x<7V .vpCзI€pF C= L1@蚅 46e]! ef+aRql&%!⏐fj w +Yh;@"Ao(,{YEFCD])Dr8vxH Lz".zNge21+($s Lꡏ+ V$KCD.yɢoY!--tv$T#*b~8? 4KH`&QiU H{uH;8\l$-8O$ g`\Nѷ4( ?z`̜fēeөϛ-\6a`@gDdk7r*F2w f2"7~2anm̉ع K Yf/JY]&x!Jd$ER[:C,wFH+X H_2"yIcV4>pIT]# }rHV%|Ae6y0ݣRy`2ʖH6_`I&@0M3'ctm8x|HF!pђ`0DNxe #aR P?1u\MF$b|h{uBZ?UH2`T8",I9x!S 61AJ \%wG%@E&vΌbuR%T&NhyJqwrPtR4o@;0|f2:3GO  =Ls#ЏN!!l8S 2N"{ӿ% ?sICoB,5Dp/ e]kEzX/'R7ru Dv\'e8x 7ֶ` ,& P٥8@At@Z1Ύ\++w  Gؖ[0G?<ڞA$+?dZgP fnZJ _DX5 ΏE5V{1n@;CI!7MN6cfK^TL:|[ l,9m P9e)=.ƎP c@?~f b![\1F eY$|p{Pf 5bTH$^bdEd%¦q:|)1e*+ֹx9Ip/7qcm.39x\>iUb咾RUBcn`//PACX枻_!o<33:CGz87YOI|ๅNoV*RˎYJ?*8'*0Sp[LOm"&qГRZg#08UQUfUZq4R4x-xY")] $˄iU胜beF͇IǣX\%#l4וrUJ^X+M-ݬnЊ U4L&[2 8Ҹ 5V2s.d6b,whA}iBGCuz1g.xܪ3ڝT=lGrGEsLAY ͈RD19-XItIqE>j t) ΨU*%w#^<^El9R ;4XșPrfIzLp}NQr3:%A >_ oyz[wcltH쀓*C~{}@8;J۷lp UmS ,*#`vT:?3PmoM z0*V DXqI+%1OWrV `[֜xJxDWd:`-P}1׊ G]p"-tYpZՒb2I %UkU-"C$B^*]FClK0\M|!xOXsɦ-1j""_{H_W MjIҺR(@O$ܸN2x3 S5. g]8ykTL!`]9yT--F|-&Gxk~)C UXWV8W700X) e`hIo~-XNZp:OF5'I gxM8W{3nI($fQdES#li14Rd.S& GJvSÒڨU7DZpQDIyb c-S)v&Q̹ZNrn.7 ``*Z,YkuF~T)2;*Lllx]ź{ɩOlRRm9: ߕ*e@S| HcAK%$[.ա]DEW޾qJ5,+4Öa1D0!9_^j7EbjQԒD0T@ʧz5ZZ 籃d59Yʼ/4F@JDCHDcL\Mb(P[[ Ds~y&2*t<p8?FbWj' cӮ65Grg0s Pӹ#Y7qTPA|:,/ؑ@{8S؞R]1/XBAqV$8\htp.-}Bz%w ߪ S#6JĐ+|pz%"S NV Cpþi@3?0@;w?q.2u;0(7( =1K?HwACPէ,h2(RuG"oo!GPu4Uܧ^bp &A&P}r;ƒP?77BրgO'neX{VŧA%(3À+ E#q`yHSGR[ G%B,;38 S宣6׌)@#b7 MmxamnEx'eZl—VEEQd4?0 #J&e`T;ooн^0UPИP&Q`䬲)ROd2̛6:^K"0ZiD#AWb1 $ЅFcl4#t S@)P@ơ<6 l:M |^H_aTx)n0V@$=5*OJ BQ:߳1Dx_WW< E_WTHşH'u*vq X:m?u="UOD3jC;D :)s F@ )Լ{^+\BUua)!R H).#u=4I* Xu"-$b0+԰pd{TghP;pw4wif.R+# T->fPM۩:I6R# UW,6=Q247cERj!Wߏ5OGtZB*F)j~{%HptlmPK`C֊_*N#ULs׵j.jXr9?ld n2fH0BU}ZnwKmјjaEJAiHxp:DU<0a ƃA,q-TVqQkS` b"J~D.6@rb>skjPq517[-,*aianxBŞZf:тx|-h_\ֽ̯u 㳘k}3VE|xcCf5Œ^4$ԫ *PhC*ks,( P+Ƨ?$ah­hsKԮNCYa;X%-ϭ;٠Iv¬jQ?{nM=- Vwrk=9qAM>nhWgAV𠸉]/,(:brC&\qQ ؓd(R4'g8&S0DҎ]z[ y ia# {,D.d >j #lFrvt=GB{m ‘$.od xѫV;tCY$mD"h(@qbfh i7x;-(i+djaC&U+5Ջ*MZ$[vb~{.ÐpgNP#ғMx٫ 8d~}<}wIcK-䃮V:!XRRSZMSg 1*p胍v^lk O{ K53q_ (i Wgi{BT|Os6ts@ ++rR0BGvͳ)S Wpn[5[ rbF*?ʐ4b& Xg3!J[oO4)Ov`ўw%:'ZuO]3^ݪRVC c+[ix߹{6ZdZä˛mڭ60}N .lws{;.׆R+.5/>arߏs%>T٦:l䴐 z[b@ eKPȃ*f{fZIyW=nPQԫxv]Dd䣂`:V29bkIϴGKgk8 /]Mm)ޡdK$ M`UUVGOqMNk0W,HfX= hjuhE!If!(;X?QjZW_w*C}]*u ; o(%ul*bښfKo5^7ě!ΉD [F&!2AwA1Ue 3彈-ϮY`u\Vwi,%L! 'z\kcZEo] \k[|ԥ[*ϳIE yg0Lz8vVF-En1Th>jRN;V޸\Fݼ҄n _bIG p.\tF4-f2{+aJjM٘ٙLEI'5J6x 'IOɪ"sߨ,ͳu@Hq#gBJlI|fQL0Vo?\`*4F !U%//y Ֆ8@N~iK|-o=92'ƙv;UΨ5&gӃVt0.E9ܞ u!HXl}͢VHvYZ~ƿՈlX_͕IɨڪԊ~|l^-V)'D[u/ mFUӘULnoㄔDUGJi^Z]DwwaajG [AjP:}33:/.#ڳxB;Lz\M[Al˜\e 3>5lԪh TS 7yX\itoH pHlEt/3xs/7y|*qb.v$'3{DlFuJ?<4pycj&է6P.aDqhRSk )e3[a.`췦kMJRzR( ZH-Ra5k tdTɃgPK mU*RM8^g@@tZ9f:u@j{A}{%!"TզHjy%0_h]+I;Vƒ*HC>[MBè%NfӨjD):QI,UHj-c`k*a1ĖWCx*ix0DTU ڱp60fTb@^[Q-a~otڜrmc:,:-j6ۻ@3^%Rq߇lxNja,'v".)>Gb!@*/%C i,QeJ/-i/0{zWI vj gXD2f.>;5p-&'ROҥX <-d }1MSϼY[ULm+kz]0ȣ}U"s`2A' ꘔi$.#Aa:Pg3sǑTZɠ.sZQx{E@w/aN=@q 6]&b\@[Qd). rj@D+,Le!:JD ,Y==̩ƻjCZ--jtԲqN‘ !q$8|G<$(uZ3]o=XJKvO ԥuiR&!ۧ9 :$ uJAo'YU СlXDSV~pѪ~U d;:1 wUR:ZuwȬ\|=9,AN\2O oj)Amzx.UO2ǝǷw~7?6C!!jz*O|9*JmaD[[?j]з/R[z U;g[z퇽s}5SqO}𚫪F}GKԇ}UȽ~]3lKi}So5ş,x\ holw:Ii FxN׳³Cӱ0Ge)>lTZ_K§>pگ5Y|o%íGnu"؛搤P:3/D/<7[gu̟I pknYZJ:VEPSEЉV(ݲw[>nIuc[d4Ydv;r9tleUNxN{HN4E +:AT],:MD.VN-ha_Itv)&o Wl>$u >ծQ=kjT)́8ZWa֮-Y5fǑX'[Lm`x$}2fFD * nq[eACuªoK}가Nt5I;(ږT^Ngpsx6D )2m#qBB"Or:Dz)S:Ս#V{c%$y1&z(1OWXh %2xb#g]l@I#d4}##hi2)PK77*IDG w:űDUƀ({0ϐf7i<\J5oc|ĉ,j̀h]2:GKz_)TNVdj6JjL4ڐq`jWA" 4B4o 6amhAf> /uՙөWA N%ҒGy3ga|Wn]ŌJԆ5uN!;$M ՁOVBjQ4)]jl‹$hBCM~>j+?h)FגtU'gNxBֶn$wIQui# r)iIKN4[P1^Z]Z4PGjvG3}SGvjk H*\?kkZE;z6rGŪc 3}ݯ8CL@Rj*ɤ8So <Z@k6#vDmjZ9G 'XGL'MŪCf^t%C@bPQhط2}$jj/QtZ[tأvH\?\m3U!xQʏh5t&R?jJ!C zM W.m:Z;Cv:Sa+^1H5]eUU~,Q7i[-EY$WcɓAM1­J0 @n-DbyU$q^'&ͭ/Qt<*[;Pw^42F$Z 5XU5#yʇOefF RH|mG4u""="Ϗ騹:]rÔ\ׁ1it^PS!|mt| `L4ZÈ=l%N@x$$U_haxR:&krHD3FJE]%@ L^=y"03n1esI^"[S꜖ZnWg.gMRZ ^ ,Rt@֢dFmKS{;atHb)NѱlVsI/ܩr`k=NZJhmb_P=O<'~ւl#<ڈ"]vT=KY:nzj݌o|D E^F.EiMvwE,gKw|m&)SeRѴ1=Xp=ۑIM %*E Slj5MFO~&~(б\iSU T*`?ex6*3PLTE( ~2Bྎ+5Ek ފWOC'[e]GIDATx]b5RDvi hN3䈣]Cҥ{eGХK׺.]uҥk].]tҵKu]tZץK׺.]uҥk].]tҵKu]tZץK׺.]}0~c]֭ B! pDtfiHZǀO!,U;uG i 1"R H bB $DFDAB@}Y?o< B@ Ȉ""w˗rU#XR\"* ` C>CYG<2[NK.߮vJ:du0 P @ Bg! P6-Y LC@ uH|5PD((4ZnEnAh]  Xz@0QI`Lh#0SRX_.߫vkJw1`T밢ACFP!QLC`&dHk\wujtK#D& d\jFj @1]Ĉ8\< ߓ@_X/qBĮu]]֔nDfhT;0@qQEB@O|g 0ir$}$WL׺.,xBX"Ĺ9"̡"f&&ys`nBDHHHL)p-.߯tvW_5r\S"l @p& KoV:S$8 bBa]\ª}c3?]|HVծwtJ[Su]DصKL]tytҥk].]tҵKu]tZץK׺.]tҥk].]tҵKu]tZץK׺.]tҥk].]tҵKu]ty\dWr׺.]ަsk].k].ѵK7kwҥs].Uu]t_ץK.]_ץKu]tK.t~].]u|cEߢK+ˏ?u!da7uu'kSoz@S'19$E)9dqNDLcG0DQJ:oD)؏9W93&Ps s ہǐ<&Ghj|= D00:dX<% $"a$ߟG0Cqar.!0%BphKA!9  D\(s\bt.pap(h1uVh~Fuz1~ yUJѼzsc\Br9DDpɁ8oK ":BpiTO? I.Qěy!ZD9ȹRr AVPytJ`Po~QTЁxm)i@&ͮu]}KDD$D,Lb݁}48$ҨZG.!p]ֺuՄ[֯#!"4 wp@Ruk":'կC}XZu?uc)9a@1L&`P>[%H CR6Z.!arDNB4&zok~]3\6_|pyz},j @:y i+_\RODppZW_]9jRBDH̤?46HTÁ\b 1)lƜ_B1?zok~}̭B"x>C.a} [Tbs1t)z.)ѽZ28\[u|u;2{.]ۯ;+gn !WI }.]Yҥk.]tۯҥK.]_ץKu]tKu]t~].t.]:uҥu]tҥu]t\ץKtҹKuҥs].ݯҥs]׺.]_ץK.]tKu]t~].tr1]X?wB8~Jm\|FzH[~~F!m1]#\!3z萸kWTG\e吺{guDu\-~3uVGTpݫN-l#v!Q /8<!}N)|f 7ons1 .|::dJ N Rrr=y%Zm\!k:!'`r QyOs31 Ѓ fR)k3(g)9DX{گsC&g2@@`t vܺ2vŢa2 ] WO7V u:JI !k]P >¾Whc@:u:J@D (\Gra%"DMa.Mw{ZZ5{w<ӯgrOQmp߇Ν:DpĜ9 aVH8{ptc&>um41Q" r"&V0Ln>c~j݋#\xt$Q9b O9RFMc{Nhx<N㫅pߴXo%ZDx+enq;ܥ^aӍ ;Y8uw#k u7oN:TwbI̳@ _xد7.Go!Cp~`vo烾ox#O~]8/v;]rý8*}xT ~q-gmq̗%_p|0Զh0 *YwhV[u{KLUy"pig_Ox7cptd;]L#wE=v1ru_P+{ ׅ?+f$<|dx¼?(=3owT|ݱC{?m@8'lg->n=\TwOxȂ| ~ү v׎ h !>/>=i"8S~ AmO;6=\xH[Zvɲu3uid߯ ]ruDa$ܲ:|nj5fv3jGq׺?p]5#:׽kݱuu\׹s]u\׹Yw׺u_׹sH:u~?u:-u_׹s]5ۇչs?ɡ뾍Q X 1s76OO~nH0R ʯ#`F!@ ~1(0CB@9@<\G9 d Q$ c`RW~/s#&忆b1!0  XH@i]r#`!B fB $ aT 00"sH@_@r:@ bZ' DA, @w}kSu r*r?T fR( AM 0@:cHJ~ֱ# $*h]EBxu{7QD@(^|1UB&$Aպe|eo~!P1H! 3#11l6' "0Xi s [ H@ pcHQHIـ@(!XI@DFPYlQr@yW}Xu 31d"*$BP< B $ YV 'u5*lߍW"&uIܮtH滘O=u $+,dk ?r7f=Rr)տ6԰ʂVCZ$}wd:}\h2 ˔o: ?sLε>pڣӪRVNktqYc sfaݑ%\6[&tz&i}NE|xf3/K8Q:/FTدK.% \)xFSE["RT :\/]Z\> 3Qw|og\_?If]1ٰ[$iIB 9u~D"S˟%_sE:WdhHYjp-?uNc:Lwm)W7z<œ[m{c/?0r庰o:!82O?uK)bZ]r&2@Z"iH)ݤ NUW%=9kukVW$Z޷AsbMq;0cc2ȋ``f=Xbf&&psml|Sj^V- 5EbsOb@b*@:9cj:s 7ƀO>SļTr\NAޅ_gaaI3"a{#%DBH))7ۚPKv[ Q5Vҵz@zAn\NnV$VԄF?zM5iץ6_$N!0%Teg6a|'sAs}'rOgRvu!@:oaͯ3,n(p[Lq?q27!-̬u$$[{>u)t!"8ܲD-W4u׬xzjn%{ug-L 70tJ4MqyRHR].f\bҘԴEWskDbew3S?DĄOsm`]Թ\Q4@X[iT3SuM 9OYiY|T~o~ê'WjUb־%Nw2i>{ IBPiEFϻw9X@tWLvsp*@rorQԺ'qJ\2l[Z2dꭡ8MTnXlgT 9KuCgL,%[v&ʞbɜ#ֿ_Wn($QrIݭ%"&Pd8T\_96F]_ph`13i5=2{XwVzK ""YL(?xvb}Os or]3@nH)=q|$PVlἇ 47erG⋣2AK[u3]CٞV[cu~~nCfDut)-MH3ԝ<IWs@%7@jo"+_Y˶MHtdm w)Z̔4ɗ^1Zcr5%gFyljo&XrZ ?wbKX)|h[C˓Lu@JjnaŔmȤ}̍%dot@::>AnJ=R/P)ma'Ga 4B>6u$i %%SШU!T͖0M&2;Rjݺ%F+so[͛c.k7{_8Eg u~andy& 9LA1.P4Θ=ʚ ci1-nqWÔgr"B|N$ DU໸hW,)Лi< R-ݕJxO8ũD wϫV9JYM%$bxW䧒oz>v)-O%ur]~D.I?.B[\w4,*,Jc xk_.RkXS52\ccӺt~ -Ǜ1ZS,VuɧDA FxrIN8iGi"<%@LEf Hi5='g J@jau,m4m1׉ _>ZmwAn1N|x,Vďǜaw"wv>鰞uo)ѕb Y$Maց49ոH:H:f<кT_)êUSպbUQl0 ~qݺVh]jZ!;|uԌqu|5GТIKb(,^V|0q^hE)QRPhmGٵf@m)K&7j a6Ź Qδ%uAL}&l3_wukFSCR$AяPSi཭[i-2 0w0O0F4jP 2F}R 4"_iAgI?6eAj΄CUv:8ڔA@*A2LfV4q a-.jgde~30 ڜ&Չ(7UMz3ZLq;j0ٖs\WF])x_33 $H%XKIy,p)4tHR'm榏jZC?y2W"*e93kNi]59N5ƳSּ8qQ<&3EK%y&).!:r4ay)pD:S|RBф/:80-49y,]ō~b<{j|QUP9LTvVn:\wj'ךPXw䆚TsEe^'/J}S9eDSy9~h@!]t<>?h0$@f3Ii9$}MpĘDjlTL*w - ::LMZD@4[iH4i4i@pcZ]b>jhl_u3S({&Ktͭ(ZE]~!"BLMr <]v9FPU-oMMd|\-Ns݈hݓ0qaef4*e2r/RzUħIPƥ//srJuXF]X;naN(UY%ɍ~fCm{w^9lfTnb&՗Ok͙7an3IHuL i3ZޤvAf:;~as,s$Y ɸ? Bp轲jq]CR7O{"ApI QU@u d]y $$K3ʹ%/@J/W1׎l9Q0ʉ!pubKhr] f'.\NilA(0>U=<=>%]M@4?KxSrw~]#\_6i-.p RQSon(U:UiώpzLe0f/p3$ LĚt  Ũ&co erHV7@:Myn&"q];9+]50¢~stGu@oͭ>%=F .So:z]o qx<-;RIdft2iq3Rw)@J@H6 \ffP=L%)q0zs`Q陈|Gm4弍94\:Ld7l}t ?utr78p:5 o2$)D:*xnR,^3 w- O&A^bR.(,:Z^uOLoҜҧHignH 4+hZiZRFvi=ivm !6F]6n/IknOlu^mI'ZL~ϛufqOKVqvew1>6HhV\;(Hz@Z 5˹nu ~ ћǫ]PvԎIb(@eRR>0ߠ$m_|{v$hdQ& C>ggI@ʪ\ƚG:2nG(P{m)O,MByH#r]*یmkLDY*i@]<˶JSuNߓyD1/ަ8M VFTI\;_Fjk25SZǀd#.5PmUrEX_UJH+%sZyHٙ+'2x-]7-au:Ld.$)pe._m3]rς=mv;0 Or]8\ :GdH2z|F l| nm\Jm М(]9;3mҒ:ڑSVcsW~]&"Bd&ÛVZG|Ҕşf&jٳ=m'h=K.R2-uNm vN,zyplL7Ե9 +ɣsQl b{|߮'pTLp8Pfɮn0)9\b:xEHQ;u,:\{.%[]mﱅ9p݊_Uڝ!Y\ϥEi1{|/bq.euϞv]N=MLT(pac#j'*n<i.!~8_WM&E6:!5kjցT*k"J4t9uG{MѪ &ݟ劚VyM·4j s,]&7$aaKQA:;?sA FK^AHLDɽsNW? 2D8MH~ bO@:?y-|Si}ֺ)gPtdK:ޘyX tuJ7<:D >äsϭє: e0(eqd /uS~\s0+MLFպQ]C[ֺqiSeٵ0cb0ȁwu52r6Rlד c-? MFSkSr~bt*qo,Kc f)OJêZIt&|V:t)_ߢte45d/:H夣vM'J=_uG%抚2יhJ1m?]˝@2^v&5fd:Y\0|D?ut9rdZkXTgѮc eeR<\"7W긔mi_r@1cT~4ʎ/3}:sӮHeWԟؙMyϴn~kg~NDS@WV4B1+YYD;3c\VŌYC4:AVۖ{VNlw8XuYv\7~6cI|"YC!P7?nO) ^rBI˹bSYZ  |[`Qui6@+@պ%sSV+€֙+1KDJ W)lT%ƨ=C]uKH)H%~պ$Iєe0| 6iW,1{%:. 1[RK Ѻq_u!##1*\rDoJs:Sf:P'~ΩћMi*5@sU}3$!&bdENzIX\S*^Z՜b3O|/}=hV7SsG\'ڔ@+y'm/4)]1\6ݙ+ٞpt $I\OM IUo8Ql4@)7 5]uWuǵ)7~)N))LS1Wu)Wڔb8ۤF~nWv@8$!HumW(l8HuuZQپU')M޻0GrM/7j3RFoTm+v5R ]ikMOr(EfFh8.YYdoE5҉ 5?A*&\4H~*jMF4RRm*#,u7AF46WT|..]Wokң4W|2lf8S~Qrյ;e3!IqަY9SǰqEu |N .֞L-16ZWcOybdo1CeumA/?H1Lc s̥)Yb)LTi R7'X[饽a6b].e AՄrZIy!q\C|3V?f~MU5.%RdoG~Yw`oWTva0\7rvL4ޱ&iWfe3wͨ -\7PUaHa6MnǭOT+B batW`|J늌klIJp)hb4^u'&88cSI24"9cw8Q;G-5 5SqE%綿K%Fm[ZXvuI5zߖwi@2f_\ukNf bpm:i%fYS1̏sg~IkNI "\Enf\^/^ca6@2SDN&s5.byaWkvVmRl{f{IGsS,z2-ϛ9m&d*3@@H(ju'8 l՚ys8aPzl\n,G.}41O}XnZ.j@FoX"Gw)IK154;4=? b $S' QEmt]N+J)pF rKtYe]:+H3Ix|gz son N\WGsi$kl:f-eg1Ksg{S]Kr?6K8pAq'IF8SÊNu+uNelիf 3g -E13iҫb>Ĝ8rʎ(MmOsXcBevx)|{Cuyg9t؂2V ; 9}1<*y@ b݌mWsRw%zՏK79I0Oi[Asj2iowgh1&Rޤ={z>ץ$KokqV-&b ,:Wp-2]resX+{5ASkׁV@r'. vJn)O)G2Y6Zjf_wtgh 5tB+i\)/H_n򕼁2ZιRoUu|"s0#,Cr$z)ve)FԬmd' YsI\kaj|slZь 奄 ck~8fHqlJwuiu@2єvsd^~Iv|m()jwTIX3K%MUZwϯdzC-;Q^ZDC(!:PF[潘rQ̚J5 Î֥: !6Nf&:9L&8ۉ)oS&u .ީ,Ķ2jqK .I^'qi7Y/;}w3Kзt-Kć7>i4U9j^PnpNas\@+q t0 [U?MNj2'+jqLG*wZ I- K/%?rNlbM.3jsyk6'msCR΁Tc"@P`"~) 7#瘆]1̵qmm]:N`lMjsj{tS$Р@Vr d zu)X˱jS] LT#,<K)Yɩތusnj7d~'NSvCtiC2(["sXSJH8Ό, on)EA/+7@U˴n\n4E.CotL0ƃLxʔO&G>-s ZMyꅆAAjեJu\7si1LH&`sNe[n댷cG@2\g᳙9Eg|vcFMi1W8UG+k?ґ֥D ЌpM<%KJֆٱgb5zCIꔅ\eT*m I9lYvԗ(P@|ca(@%׹d֓O |S뾐i}[TUiycN{֝ !˔uʂؚj8sΌөF`ʜѬcgl}K_u*=vy:nc'bI1 Q(aBˤ5fIZ|] 0l FĠ( o8Wcckab봏ahʫ:zB$D)ɌK̒P9WT6SeԳ\FMn\c7kg%]w߯TKXʯC6MuaK C y[dG $[i16#dm5-˄^Hy&eY?C|{ʝ:hH[ol%)K 51۪?k0z 5MU=;G "i?_&&Q)ۘzq#)]Ea7ԥ&2!lAK~IHb5ٵ-M7ښ =eEvGF{또Nu0̚u}NiƀԢMh'k.'SDѹ#KZtmk:Y秼u:Pq¯a5F7q:6q}cAQ$V0ӺmS~4K*[KK yY+x-oq]B lꫥVr\tUIb2ҩ@́0}וMEG\ $Vl&*0`] :6erhKѻ#sO^b(3~vzvjZ\Myoޥs_ÔQ @lk.G9el4}0/bp"s @5ל6ݦkV˵ $|}i9:ҷܻiֈG?^/Jjg/ygԻ#h,9]61_`a59/$Uс~e~]+IXHIOUn@-έM_՛ݢbgґ3agCaa \W\<(u'&O_$Ma|\9inD $ =_gポsH-nܓas|HZ7!y&_wsn-yU RuprÊu댣b sۭ,:h[0[ΛR9zPiQѺsݿu kJ` $EPnn7GN?s[e&4+A}5tulNOssL8-@ʪWrrF+e+yB:9_ien2g'px;Fc;պu -MmzGٞPڈ Er19sM)Ark{uDZ*2\.Zݥ-` uf[ݚ⥽rmQƞܹ}\'{i^ cp2tXY?7uu׵@2_o~rsSj͠^I\q[~l a1tM6n%DjC:ELOZI$k@Z*>ng ]s=C7i S@{f:}_wR Pzg C9uw\R[t)~4>u[>eœoT9 uu\ǭ#iU6Oi]b`Ó:^p_@\>?_|S@ST?]^3E/~uH8u/L~yQn^|}C@zX/w@G__ᢽʃ]C\=\5U 1>/m:~wp?w)|e~a= ^uAMW22V~7 @y h[?;׽X:V P $}U J '^:@H kZE}cd@Bx2`ֽW?kw010! 6\d7O^oͯ_:,Oi-`dzs"Go#`\\H $f H@@$HW d?ZXy#NO2k=ϪsNIȗ^scHoXn:@y 3bI&|ɌY׺o݄w{_GHLȲaH0@u u-L@ĝ&#$(a_:}t_ 1׉cx? Vc_RjLէp`~й3\DD@ H C XV&RLJ(01"2Rā䗸_L _&$Ub`KhsݿuHT e5@bЇ,sA `@YF#t~ @B @{X>u@B EH9W3BbD )HՊd08 Q9 F (v #lcBFB@`$au{+5@b"-1@E뤸R%@@JįC @RC!srB$)A z)ʭ;pa<(![<d .TBP -3\1H16T"_B B& дꗑ󓘈)@s'LĽ@"$ )  qc)PK:uEtЬNy%{Ϫsݧbn@6-R֡ 1_gn:}Uq Ks]Mk9Ok]My_Ϫk]׺iw1q!lwi˯[L)G_;.S*6<.st2\ץgk].t~].]:u.]tҥu]t\ץKt\ץK7uL]Vv*oͿ.+wѿvs?)~@-Uo?muZeo[q%Z׹K._ץs]u\.t\ץu]:s;\.?땛?oy~ݚ]yrr_-ʟ:||K~i~>!\z%.9032Ke45^.Uĺ<|Ht2{gua36Zw^/+u{n?5̗W_5P~E~~/?˯^.??ğ_w}KKk^mwqo~ r\~7̗_b23s*\Gff\$ DLO~"1L?./1/_)9f".\.?D? ]fֲ<C<_)W@Wz}m˯/.=\{_y\{/<2\~:u^:˕r^\\w \~ߋ<x~^f>u3Kr9{ 4WՐ.sO}y00kJcU=]4Ed{&|YO6qcY=j@@uCÚ}s$ ZB[SF BpN'~m׍6 *p,?3Ba]]9G po (!/"bCWZ?O"X tHѪMtIDWnZv=߰xk^~>L{Ϊk$} L{t]E[L3V}XsĿn*П j_Mlxayz$)Oqm_}.MRJg%z}fڝ^oxH|x1mo:{F#"zk:44:{^|d?r|p__u_w53^ݟ$}TŞ a/_kCU>_[x 7~'װˇ0}#70x?k{S~zfuSMCO:_;zMrn>'M_c6N"M\7erݔgnu\7nLzݔuS^7erL2uS^7erݔM2)^7Q7nʷ溜qrݔfG _)u ţ/5]AD9I zT )RtrHadPfrRk{!HDZ,${r]%QoO)aF^p=-ĴLKŜe~c4KL3KC̯uDCaf.3ίu43"R5ip<t5es]LӒ,)\kÔDH:҄RtTǿ^W\'Wä'i&`rW|gY S f7u2LFY87` ,IQ/s'r3>peM\C6JƔMzݔM\7erݔukz)T&MC:ٖn. ˈgj||#}gޟuB 0̒$ayݲ#&YDcIjv 9q jY5U>~tK`tV#Xޠ;A[f)`x]Ot\ddm/ ?ׅ,]RK.K)00tp3By{VUG*GlRQ>Du/B^\Aҩ=0erh&JBu}ֈxbW`L ,tPiD2 ]fPX@Uha(’q~HEd.q5dӕT{%\H5 ήw~ԯ;8R@c"!ś{UfLڝ##koT MMSޠY1[Q}qJ񌪎# Ru1~puCkq si!_ LJj<*&4.B"@(3100KHDqe%#Iz{]T4y. B%)QQ_7ytq+]8.(R%z)r RL %(z (_u͆Y@Qfˌe0, dLƵ=ts)xo! 3Az`Z4P\+Y`}lib eI%k 2JND wK/2饔Z?Qc(n/8CDir_ɥF02Q&2p _M0Řt-Fģm 3a Qİxס \[ڹ̂h6CJ JemFqp4,cS`L0;: NcJ008oຜun恺CIhʤIiBL1ī!봿#}Dr&F8޳#x@]Z6wԡԎ!p?6-ە  QO۴o(SuuFCs]uY\',;*G;"B}2L,_WPQ_fgCl Gq!J ²Լ,uVu3sii{CrE|ů;[>ΚE8wk.q6OUV]c3:[Jz;SeQu9j.u+Z>6 }Y×5=uM}1nP7~&u?/D亟_7n'ZS&MnnrݔK;|QЉu!>^O8kW[TeG; '{l9?u\m۶tfݶm{p>~Xm[ݱOm2j?Xq_?:mqy>^rG܆4xAקJb \l5\ȵ`l(Y.8>}VxX@}YP<n ֿu/F]%a?$3mhQ.G㾣"N\ljI GzSCr3: -u0~muGʇqݲq\eQ产QWvAL330222((QV%˙S)/6<aNI9],'5VAv![IVw.kk߲`[m]\uYPk2[7,Jw_F}:Pbp":G2оy 4P&ZᒓӐYEbkFUD?G-kH*ՏΤ:,j_a"[~ u\Fζ,RׇׇmYܶm]6/˲=,˶-PZk\ꒈ A=8X=:D_k4  9Qx >1bhER+TGE9- t'O8B{a*Bfm[mĺlplk%uVsauaYm)nݗ <`Ld,~:@]u%1-rtXfI)c$|^hY"20= QN*< 5Qa۽+Sn0u[aY 벬Zma׍;ȗŶ붭Gs CGcϷ^W!Ԕ udG8U<=iX‚Ne|E];];GO[~m@t&V(9YeY?Xn\aVYu4jR,˲m Z>FqGtt q1̠S1$exbTR~1ב+ݱ-$ֳ}ݖow(l!:_@Dz񰶺/%eQ랚aRaId Dv406LYbVdİaFq>&ͤ2\+"3\bpg'QW3r/a[|yxdKalłtlX[ q?8X%Au0U:Ŷ499 3!vjqo, abGkjmü:Ɇ9FvD|nQ#.wa\[C ll?azh"n)KuY\'řy;Vru,;'kpn/aN0X_7nʷ9Ü\7ߡn]eY}nrݔOG؛g|nrݔ2Q7nʿaNMu#q{8ܓ M(qU vGyh.{w,pr丣}~,I{5>R+Ɣx"_x@eT,x#c4Tڨ|?. [zXD8YsN>pl\`VI=>ua4씚oN'Ok(+lSrnrV|S*畨ڲ=*m] O;%GjQxl ˈyiҳT=%{UYZy<[slAn;2,RbV~clc>mJ]NڑGufj?oW̲GxTZX)=9͇ˈaġ()&FƐS~8Y{dYtj^Q8NJ͸kx+ Fy1k߃]Ƹ/Lyv3L PG(ЙȦ#V682PS}o u'9J YЧ00܇ʞAJCLBTͩ${j+Wu@b#" ps\W;0gm%A\{9g])1j@o}2mPW0'.ԡ-؍yѫJdTة/X.e`0ijDp`UsG2O&ndq̀aMgcHQ d~kc,*v9;*@3N8SN3}7onw&MMM2nD)uS&MMM2Q7erD)·t\պ]&zNX/Ԯqfnf:;kpu޾݇=˭/7ףPm 4}=iᨭ[kWڽ{cgw3Sܦh_߉ގWL)vÒ#s,P{o_/ຉldGPt8x[VAT":hO\wQ6#}zk"<6\0֔AG.,eT˞&ŸBÙp+婾{ۍ/afE 5CL'*daK8 kOQE⺲T˸lF #q!!Vp*:x:9d)9IA(82Pif&:T /Fܣޠ 1f)I}^UNj =2 KBjY~O@Yhgf{ʬEG8$GKvu0[ ^u5V Ӓ)u/.j2h%Y'y:\ۛ{DDS\D+.0GuuI^W%eh 1X>F;W<[ӓUUOuuKQNp%Vʊ礑{&C]8 "L{޳7Y*@%FvS%BU'"Gw*:T>Pn'NЁWѣzUa( ^7)fz?;W{P^{=$##̂!2@EZTh`5BUex:}_ *o QQVQU\W';=L@?"`{;YWĈrǡf!wei9Y5bt+VƜ|6O@MuUyduS^&lU$=FV` u51@|O k '1ao(;dC4b_2v6|yHr~Yerݟ@A*c.ƕ+B<{DvK1`]luǤhHQ e_1JDY*u6Cc:ǭNO۸??&-5z+n<8LPQS;N`fmlD I3+'8nLLδhK&Eρ!*}cGUz;k$߇&Q)+Ɗ$x؃N iff5K`% C$xF]u֒e8+̄*ZqG꬙. ph*o%oTyaKf~: qe9}z[IބvlQz|&]9V~&2rDDݔum9QQ7nrݔu&&M\7erg=}*u2id^'-OnGj{qW+&=uXe:Bf{}R~g MVaUU>Z&re] u d)5^Z{E9qI{iW|P20_FHӟvDw4᧚:>êPEWr <uߕ4=70B*y^v"2SbL[1 uw+rLBн+;q\0C(W3N&39:N;74 81iJ6MJ׬Ezj 3dT^T|w0):g{8㻓;;_y*uɟZ)ޛnc-Y#{AyeD-3ե G(#שÂW3̽櫘E{luaXya ų $b.v%f#-?f$ә}~-ejɹZ+wX8χj 1 zzT u.,-wp\qB^H|ӣcCA {`/,C/=cTu=B]t4PM'P:^0ϯY|B]9nC SF,`$ ɆPuT9jWEQs^fwQǫO:K'+^˻; )u^XyuADu1uq%Pi}Mk!O=yshsUÆyRonLoPke_b;<L.}>]o;nʏF#+^eDaI" 0,\ uUaS*QPT0'A3ƉDu^X f;iGD$0 ^'d8$)C/ L\"-Ea#AfB,ں"qb/%*X",U G!KAmr_vd wpqdp:-;mtUe{yWBLz݋6è9>nd(>x3t4KuuS7nnנnrDݔuS&&M2nP23^~ژyY?u~)^Lt=`ϊZK,/sH/l|Yʠu u;bpD[1%o9=͢!7Y^E|ANuS>u(jonE ƖBIP> v 3]G-Z),ꪳC:ՙIi˲EA`B3ꍐ2&>"ѻuS>uB+W Cb웓܃t w;\O% &ո$L+=gZ횓d&Wp\tzJٮu uq5Ӫ3C9@ޠ d'|W\uI'di; UiJ,g3N> uՖ3L SŦq9w. egf]2K{V>:C\F(^VUO}},겶T5ǣWuu#7T~ÙiuUm>u}/풜}sDϛ]&6ܣ3%۟OMMb2QcghWa*{%8˰w [.p|n?-,;׮5vv.=|` ? pNX74WncZ޹Qvuy/\g'Rd;UU!HyH6Ewf)a;ef:=UA:k9(@D7w HIN"5WGNZdI;ڨN廓5N[txtQ'1H5R:5x& K urÝ5)P۱ U+*{!F+N񸺰muw4 "NtJȸԅMT{7n[{6\ f9nh# UfBOUԕtfbea|§< 2GPDjyLugTx[NR{)ãfȁ|"ю|ލh&OQ(ly7xգ'jYF]2G‰4Ä': kHtth-|fjQ'3 Gs~jUUDk( ?5{T,ԉyN^\uٚ5:;@݈e$QXd]?Ț ev]Qq]\q1]m<ݝGCcC''O;uE6\SMV uQlj?uYN:^nKLQF^{*ӂʌ5|eV0s$2QqxTVyΤf0CTP խXxdFk#byV‘aTmȌى?וi NQ7,oPvp_q8S{p|S@݈R#{:9l{CiQݸގU] R^sA'33n%t!ؖx:QǹLy22Wz1,2"-#2ӄ,n ,ce+GēQ]ۏZy92{-"~Cqqa8"ki-OF{'"zqQ<~yŋ$MGvn(Bx潪)V]KOP|S _F"_P S-?_nH!/Sr|^֛|k~D7!uuS&M\7en争uS&L4erݔF]^oݝ2nʧ̜\7埢NO}6>9LqS\7R\R@?uɉurw}\]..cxGy#.Dr̀ffŸu=A:̋w 9坨Kkuyb!(/˥.dK u!¤KD]B)R!k6yuI\W1.r$)x\ 2k~xp] $_h}abpXCL*)o^D)utT$p%u.”̿].1 b 1/æB]օai}:f^T.uS~&E$"Te`x:/z@"QDJQw9|>SOSщqy;p:pw]qx;r1ft£/LaV(KUkS&/挌L2bi".3ˌa?H;.̼\l,gGG͗Ei"fxuM +̎UuT=> ʛWX9ɰj7~ ,KrƒبKP92P::5|蝥uv(`^ۭfv~ sL0)5 ug%TƟEPy-tz5ٿQ/LP5M D]xXcٻwf>L3;wfgF]@\ا Wj<zuC8PwmMHĉ%zwF)bE&!!LйnQp庲f JuSoY%b_}THU2dHex7K!eBQu7zg/aN3̏!~g^.i7'Mݖ PnZ,&~"~P/5|?UDO'nO&~|nn)u|LM.=nʧnl(&M|ku\7( S 9)uIb$`Za&WHf^uS>u!eD8g|ߠQe9erݔubdPJ ԅv7nr]9=yp}jw|,DE!(\7PaR=brZDO3uS>J2nʿ)?BO07LMH O*3Q7cN#:?3lgLn"OtYV]HH:A$,vrݔr]dap 'eqFUu-AwgZлx׌p]<3zf 3aES{ &&ay2Y㹇uaY#eZ"]N՝$6gCBj.bN\IJ _r~uUjZS&׽ufobZ0Llx"1<]Gkjܗ:e'Ū|P%|^`D` Q5^Rdiff]fQI/{ sr/AF2J."+E5ݝ$hM=0wԍeE|oЅ+͞{{5erDݿ9~ϼq\ ryͲ\Fk2}:/§Y^%O|xj#'MMy_争)\7Q7kP7D)L.Uϗ?u+8X'|W_A?,àu+Zݹ Q'^@<E~%]4Qdz;dQ-0 Qh*grD7LKp*H0tc !M~BM\Wʁ'j ¬" ZN6`L2\1%峓T8;bwuS&ަי3OSDT83X_O sG0nü es5:k/0o 3* /(G%n>s-;m}}_JM@dצb%DXŚqݶms]>nk ضmuQ.۽uu3u-˶֏}ݶmYT+eJ\.-TTum(ǵ.qm븉m==e ʶ.@4LpQifZX T_uܖuꑲ=\ՇCauò+ON߫͌Km{X}]V,b-Pwl۶;e]o\>ҹ-X 'صyԭ뺮uYVlz2Y纮@=4l m=n[u3?#,1~^Gw_X0Fʲ$Fg϶<x9:kOuúgfk}]=gx%m~XGXlp3my8 VuC5,,GXy NEї>07:69n}\gu? s-(`Ɔesq]֚as[1SXhk= w|TF5ìJ0Xeݖ}΋Q-k2f=ãhcʹ,md=XǓZuo|sY*^Û|7IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pyproject.toml0000644000175100001710000000021414266763645016250 0ustar00runnerdocker[build-system] requires = ["setuptools>=30.3.0", "setuptools_scm", "wheel"] build-backend = 'setuptools.build_meta' ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6842363 pytest-mpl-0.16.1/pytest_mpl/0000755000175100001710000000000014266763666015542 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/__init__.py0000644000175100001710000000040214266763645017644 0ustar00runnerdockertry: from importlib.metadata import PackageNotFoundError, version except ImportError: from importlib_metadata import PackageNotFoundError, version try: __version__ = version("pytest_mpl") except PackageNotFoundError: __version__ = "unknown" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/plugin.py0000644000175100001710000007637314266763645017427 0ustar00runnerdocker# Copyright (c) 2015, Thomas P. Robitaille # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # The code below includes code adapted from WCSAxes, which is released # under a 3-clause BSD license and can be found here: # # https://github.com/astrofrog/wcsaxes import io import os import json import shutil import hashlib import logging import tempfile import warnings import contextlib from pathlib import Path from urllib.request import urlopen import pytest from pytest_mpl.summary.html import generate_summary_basic_html, generate_summary_html SUPPORTED_FORMATS = {'html', 'json', 'basic-html'} SHAPE_MISMATCH_ERROR = """Error: Image dimensions did not match. Expected shape: {expected_shape} {expected_path} Actual shape: {actual_shape} {actual_path}""" def _hash_file(in_stream): """ Hashes an already opened file. """ in_stream.seek(0) buf = in_stream.read() hasher = hashlib.sha256() hasher.update(buf) return hasher.hexdigest() def pathify(path): """ Remove non-path safe characters. """ path = Path(path) ext = '' if path.suffixes[-1] == '.png': ext = '.png' path = str(path).split(ext)[0] path = str(path) path = path.replace('[', '_').replace(']', '_') path = path.replace('/', '_') if path.endswith('_'): path = path[:-1] return Path(path + ext) def generate_test_name(item): """ Generate a unique name for the hash for this test. """ if item.cls is not None: name = f"{item.module.__name__}.{item.cls.__name__}.{item.name}" else: name = f"{item.module.__name__}.{item.name}" return name def wrap_figure_interceptor(plugin, item): """ Intercept and store figures returned by test functions. """ # Only intercept figures on marked figure tests if get_compare(item) is not None: # Use the full test name as a key to ensure correct figure is being retrieved test_name = generate_test_name(item) def figure_interceptor(store, obj): def wrapper(*args, **kwargs): store.return_value[test_name] = obj(*args, **kwargs) return wrapper item.obj = figure_interceptor(plugin, item.obj) def pytest_report_header(config, startdir): import matplotlib import matplotlib.ft2font return ["Matplotlib: {0}".format(matplotlib.__version__), "Freetype: {0}".format(matplotlib.ft2font.__freetype_version__)] def pytest_addoption(parser): group = parser.getgroup("matplotlib image comparison") group.addoption('--mpl', action='store_true', help="Enable comparison of matplotlib figures to reference files") group.addoption('--mpl-generate-path', help="directory to generate reference images in, relative " "to location where py.test is run", action='store') group.addoption('--mpl-generate-hash-library', help="filepath to save a generated hash library, relative " "to location where py.test is run", action='store') group.addoption('--mpl-baseline-path', help="directory containing baseline images, relative to " "location where py.test is run unless --mpl-baseline-relative is given. " "This can also be a URL or a set of comma-separated URLs (in case " "mirrors are specified)", action='store') group.addoption("--mpl-baseline-relative", help="interpret the baseline directory as " "relative to the test location.", action="store_true") group.addoption('--mpl-hash-library', help="json library of image hashes, relative to " "location where py.test is run", action='store') group.addoption('--mpl-generate-summary', action='store', help="Generate a summary report of any failed tests" ", in --mpl-results-path. The type of the report should be " "specified. Supported types are `html`, `json` and `basic-html`. " "Multiple types can be specified separated by commas.") results_path_help = "directory for test results, relative to location where py.test is run" group.addoption('--mpl-results-path', help=results_path_help, action='store') parser.addini('mpl-results-path', help=results_path_help) results_always_help = ("Always compare to baseline images and save result images, even for passing tests. " "This option is automatically applied when generating a HTML summary.") group.addoption('--mpl-results-always', action='store_true', help=results_always_help) parser.addini('mpl-results-always', help=results_always_help) parser.addini('mpl-use-full-test-name', help="use fully qualified test name as the filename.", type='bool') def pytest_configure(config): config.addinivalue_line('markers', "mpl_image_compare: Compares matplotlib figures " "against a baseline image") if (config.getoption("--mpl") or config.getoption("--mpl-generate-path") is not None or config.getoption("--mpl-generate-hash-library") is not None): baseline_dir = config.getoption("--mpl-baseline-path") generate_dir = config.getoption("--mpl-generate-path") generate_hash_lib = config.getoption("--mpl-generate-hash-library") results_dir = config.getoption("--mpl-results-path") or config.getini("mpl-results-path") hash_library = config.getoption("--mpl-hash-library") generate_summary = config.getoption("--mpl-generate-summary") results_always = (config.getoption("--mpl-results-always") or config.getini("mpl-results-always")) if config.getoption("--mpl-baseline-relative"): baseline_relative_dir = config.getoption("--mpl-baseline-path") else: baseline_relative_dir = None # Note that results_dir is an empty string if not specified if not results_dir: results_dir = None if generate_dir is not None: if baseline_dir is not None: warnings.warn("Ignoring --mpl-baseline-path since --mpl-generate-path is set") if baseline_dir is not None and not baseline_dir.startswith(("https", "http")): baseline_dir = os.path.abspath(baseline_dir) if generate_dir is not None: baseline_dir = os.path.abspath(generate_dir) if results_dir is not None: results_dir = os.path.abspath(results_dir) config.pluginmanager.register(ImageComparison(config, baseline_dir=baseline_dir, baseline_relative_dir=baseline_relative_dir, generate_dir=generate_dir, results_dir=results_dir, hash_library=hash_library, generate_hash_library=generate_hash_lib, generate_summary=generate_summary, results_always=results_always)) else: config.pluginmanager.register(FigureCloser(config)) @contextlib.contextmanager def switch_backend(backend): import matplotlib import matplotlib.pyplot as plt prev_backend = matplotlib.get_backend().lower() if prev_backend != backend.lower(): plt.switch_backend(backend) yield plt.switch_backend(prev_backend) else: yield def close_mpl_figure(fig): "Close a given matplotlib Figure. Any other type of figure is ignored" import matplotlib.pyplot as plt from matplotlib.figure import Figure # We only need to close actual Matplotlib figure objects. If # we are dealing with a figure-like object that provides # savefig but is not a real Matplotlib object, we shouldn't # try closing it here. if isinstance(fig, Figure): plt.close(fig) def get_compare(item): """ Return the mpl_image_compare marker for the given item. """ return item.get_closest_marker("mpl_image_compare") def path_is_not_none(apath): return Path(apath) if apath is not None else apath class ImageComparison: def __init__(self, config, baseline_dir=None, baseline_relative_dir=None, generate_dir=None, results_dir=None, hash_library=None, generate_hash_library=None, generate_summary=None, results_always=False ): self.config = config self.baseline_dir = baseline_dir self.baseline_relative_dir = path_is_not_none(baseline_relative_dir) self.generate_dir = path_is_not_none(generate_dir) self.results_dir = path_is_not_none(results_dir) self.hash_library = path_is_not_none(hash_library) self.generate_hash_library = path_is_not_none(generate_hash_library) if generate_summary: generate_summary = {i.lower() for i in generate_summary.split(',')} unsupported_formats = generate_summary - SUPPORTED_FORMATS if len(unsupported_formats) > 0: raise ValueError(f"The mpl summary type(s) '{sorted(unsupported_formats)}' " "are not supported.") # When generating HTML always apply `results_always` if generate_summary & {'html', 'basic-html'}: results_always = True self.generate_summary = generate_summary self.results_always = results_always # Generate the containing dir for all test results if not self.results_dir: self.results_dir = Path(tempfile.mkdtemp(dir=self.results_dir)) self.results_dir.mkdir(parents=True, exist_ok=True) # Decide what to call the downloadable results hash library if self.hash_library is not None: self.results_hash_library_name = self.hash_library.name else: # Use the first filename encountered in a `hash_library=` kwarg self.results_hash_library_name = None # We need global state to store all the hashes generated over the run self._generated_hash_library = {} self._test_results = {} self._test_stats = None self.return_value = {} # https://stackoverflow.com/questions/51737378/how-should-i-log-in-my-pytest-plugin # turn debug prints on only if "-vv" or more passed level = logging.DEBUG if config.option.verbose > 1 else logging.INFO logging.basicConfig(level=level) self.logger = logging.getLogger('pytest-mpl') def generate_filename(self, item): """ Given a pytest item, generate the figure filename. """ if self.config.getini('mpl-use-full-test-name'): filename = generate_test_name(item) + '.png' else: compare = get_compare(item) # Find test name to use as plot name filename = compare.kwargs.get('filename', None) if filename is None: filename = item.name + '.png' filename = str(pathify(filename)) return filename def make_test_results_dir(self, item): """ Generate the directory to put the results in. """ test_name = pathify(generate_test_name(item)) results_dir = self.results_dir / test_name results_dir.mkdir(exist_ok=True, parents=True) return results_dir def baseline_directory_specified(self, item): """ Returns `True` if a non-default baseline directory is specified. """ compare = get_compare(item) item_baseline_dir = compare.kwargs.get('baseline_dir', None) return item_baseline_dir or self.baseline_dir or self.baseline_relative_dir def get_baseline_directory(self, item): """ Return a full path to the baseline directory, either local or remote. Using the global and per-test configuration return the absolute baseline dir, if the baseline file is local else return base URL. """ compare = get_compare(item) baseline_dir = compare.kwargs.get('baseline_dir', None) if baseline_dir is None: if self.baseline_dir is None: baseline_dir = Path(item.fspath).parent / 'baseline' else: if self.baseline_relative_dir: # baseline dir is relative to the current test baseline_dir = Path(item.fspath).parent / self.baseline_relative_dir else: # baseline dir is relative to where pytest was run baseline_dir = self.baseline_dir baseline_remote = (isinstance(baseline_dir, str) and # noqa baseline_dir.startswith(('http://', 'https://'))) if not baseline_remote: return Path(item.fspath).parent / baseline_dir return baseline_dir def _download_file(self, baseline, filename): # Note that baseline can be a comma-separated list of URLs that we can # then treat as mirrors for base_url in baseline.split(','): try: u = urlopen(base_url + filename) content = u.read() except Exception as e: self.logger.info(f'Downloading {base_url + filename} failed: {repr(e)}') else: break else: raise Exception("Could not download baseline image from any of the " "available URLs") result_dir = Path(tempfile.mkdtemp()) filename = result_dir / 'downloaded' with open(str(filename), 'wb') as tmpfile: tmpfile.write(content) return Path(filename) def obtain_baseline_image(self, item, target_dir): """ Copy the baseline image to our working directory. If the image is remote it is downloaded, if it is local it is copied to ensure it is kept in the event of a test failure. """ filename = self.generate_filename(item) baseline_dir = self.get_baseline_directory(item) baseline_remote = (isinstance(baseline_dir, str) and # noqa baseline_dir.startswith(('http://', 'https://'))) if baseline_remote: # baseline_dir can be a list of URLs when remote, so we have to # pass base and filename to download baseline_image = self._download_file(baseline_dir, filename) else: baseline_image = (baseline_dir / filename).absolute() return baseline_image def generate_baseline_image(self, item, fig): """ Generate reference figures. """ compare = get_compare(item) savefig_kwargs = compare.kwargs.get('savefig_kwargs', {}) if not os.path.exists(self.generate_dir): os.makedirs(self.generate_dir) baseline_filename = self.generate_filename(item) baseline_path = (self.generate_dir / baseline_filename).absolute() fig.savefig(str(baseline_path), **savefig_kwargs) close_mpl_figure(fig) return baseline_path def generate_image_hash(self, item, fig): """ For a `matplotlib.figure.Figure`, returns the SHA256 hash as a hexadecimal string. """ compare = get_compare(item) savefig_kwargs = compare.kwargs.get('savefig_kwargs', {}) imgdata = io.BytesIO() fig.savefig(imgdata, **savefig_kwargs) out = _hash_file(imgdata) imgdata.close() close_mpl_figure(fig) return out def compare_image_to_baseline(self, item, fig, result_dir, summary=None): """ Compare a test image to a baseline image. """ from matplotlib.image import imread from matplotlib.testing.compare import compare_images if summary is None: summary = {} compare = get_compare(item) tolerance = compare.kwargs.get('tolerance', 2) savefig_kwargs = compare.kwargs.get('savefig_kwargs', {}) baseline_image_ref = self.obtain_baseline_image(item, result_dir) test_image = (result_dir / "result.png").absolute() fig.savefig(str(test_image), **savefig_kwargs) summary['result_image'] = test_image.relative_to(self.results_dir).as_posix() if not os.path.exists(baseline_image_ref): summary['status'] = 'failed' summary['image_status'] = 'missing' error_message = ("Image file not found for comparison test in: \n\t" f"{self.get_baseline_directory(item)}\n" "(This is expected for new tests.)\n" "Generated Image: \n\t" f"{test_image}") summary['status_msg'] = error_message return error_message # setuptools may put the baseline images in non-accessible places, # copy to our tmpdir to be sure to keep them in case of failure baseline_image = (result_dir / "baseline.png").absolute() shutil.copyfile(baseline_image_ref, baseline_image) summary['baseline_image'] = baseline_image.relative_to(self.results_dir).as_posix() # Compare image size ourselves since the Matplotlib # exception is a bit cryptic in this case and doesn't show # the filenames expected_shape = imread(str(baseline_image)).shape[:2] actual_shape = imread(str(test_image)).shape[:2] if expected_shape != actual_shape: summary['status'] = 'failed' summary['image_status'] = 'diff' error_message = SHAPE_MISMATCH_ERROR.format(expected_path=baseline_image, expected_shape=expected_shape, actual_path=test_image, actual_shape=actual_shape) summary['status_msg'] = error_message return error_message results = compare_images(str(baseline_image), str(test_image), tol=tolerance, in_decorator=True) summary['tolerance'] = tolerance if results is None: summary['status'] = 'passed' summary['image_status'] = 'match' summary['status_msg'] = 'Image comparison passed.' return None else: summary['status'] = 'failed' summary['image_status'] = 'diff' summary['rms'] = results['rms'] diff_image = (result_dir / 'result-failed-diff.png').absolute() summary['diff_image'] = diff_image.relative_to(self.results_dir).as_posix() template = ['Error: Image files did not match.', 'RMS Value: {rms}', 'Expected: \n {expected}', 'Actual: \n {actual}', 'Difference:\n {diff}', 'Tolerance: \n {tol}', ] error_message = '\n '.join([line.format(**results) for line in template]) summary['status_msg'] = error_message return error_message def load_hash_library(self, library_path): with open(str(library_path)) as fp: return json.load(fp) def compare_image_to_hash_library(self, item, fig, result_dir, summary=None): hash_comparison_pass = False if summary is None: summary = {} compare = get_compare(item) savefig_kwargs = compare.kwargs.get('savefig_kwargs', {}) if not self.results_hash_library_name: # Use hash library name of current test as results hash library name self.results_hash_library_name = Path(compare.kwargs.get("hash_library", "")).name hash_library_filename = self.hash_library or compare.kwargs.get('hash_library', None) hash_library_filename = (Path(item.fspath).parent / hash_library_filename).absolute() if not Path(hash_library_filename).exists(): pytest.fail(f"Can't find hash library at path {hash_library_filename}") hash_library = self.load_hash_library(hash_library_filename) hash_name = generate_test_name(item) baseline_hash = hash_library.get(hash_name, None) summary['baseline_hash'] = baseline_hash test_hash = self.generate_image_hash(item, fig) summary['result_hash'] = test_hash if baseline_hash is None: # hash-missing summary['status'] = 'failed' summary['hash_status'] = 'missing' summary['status_msg'] = (f"Hash for test '{hash_name}' not found in {hash_library_filename}. " f"Generated hash is {test_hash}.") elif test_hash == baseline_hash: # hash-match hash_comparison_pass = True summary['status'] = 'passed' summary['hash_status'] = 'match' summary['status_msg'] = 'Test hash matches baseline hash.' else: # hash-diff summary['status'] = 'failed' summary['hash_status'] = 'diff' summary['status_msg'] = (f"Hash {test_hash} doesn't match hash " f"{baseline_hash} in library " f"{hash_library_filename} for test {hash_name}.") # Save the figure for later summary (will be removed later if not needed) test_image = (result_dir / "result.png").absolute() fig.savefig(str(test_image), **savefig_kwargs) summary['result_image'] = test_image.relative_to(self.results_dir).as_posix() # Hybrid mode (hash and image comparison) if self.baseline_directory_specified(item): # Skip image comparison if hash matches (unless `--mpl-results-always`) if hash_comparison_pass and not self.results_always: return # Run image comparison baseline_summary = {} # summary for image comparison to merge with hash comparison summary try: # Ignore all errors as success does not influence the overall test result baseline_comparison = self.compare_image_to_baseline(item, fig, result_dir, summary=baseline_summary) except Exception as baseline_error: # Append to test error later baseline_comparison = str(baseline_error) else: # Update main summary for k in ['image_status', 'baseline_image', 'diff_image', 'rms', 'tolerance', 'result_image']: summary[k] = summary[k] or baseline_summary.get(k) # Append the log from image comparison r = baseline_comparison or "The comparison to the baseline image succeeded." summary['status_msg'] += ("\n\n" "Image comparison test\n" "---------------------\n") + r if hash_comparison_pass: # Return None to indicate test passed return return summary['status_msg'] @pytest.hookimpl(hookwrapper=True) def pytest_runtest_call(self, item): # noqa compare = get_compare(item) if compare is None: yield return import matplotlib.pyplot as plt try: from matplotlib.testing.decorators import remove_ticks_and_titles except ImportError: from matplotlib.testing.decorators import ImageComparisonTest as MplImageComparisonTest remove_ticks_and_titles = MplImageComparisonTest.remove_text style = compare.kwargs.get('style', 'classic') remove_text = compare.kwargs.get('remove_text', False) backend = compare.kwargs.get('backend', 'agg') with plt.style.context(style, after_reset=True), switch_backend(backend): # Run test and get figure object wrap_figure_interceptor(self, item) yield test_name = generate_test_name(item) if test_name not in self.return_value: # Test function did not complete successfully return fig = self.return_value[test_name] if remove_text: remove_ticks_and_titles(fig) result_dir = self.make_test_results_dir(item) summary = { 'status': None, 'image_status': None, 'hash_status': None, 'status_msg': None, 'baseline_image': None, 'diff_image': None, 'rms': None, 'tolerance': None, 'result_image': None, 'baseline_hash': None, 'result_hash': None, } # What we do now depends on whether we are generating the # reference images or simply running the test. if self.generate_dir is not None: summary['status'] = 'skipped' summary['image_status'] = 'generated' summary['status_msg'] = 'Skipped test, since generating image.' generate_image = self.generate_baseline_image(item, fig) if self.results_always: # Make baseline image available in HTML result_image = (result_dir / "baseline.png").absolute() shutil.copy(generate_image, result_image) summary['baseline_image'] = \ result_image.relative_to(self.results_dir).as_posix() if self.generate_hash_library is not None: summary['hash_status'] = 'generated' image_hash = self.generate_image_hash(item, fig) self._generated_hash_library[test_name] = image_hash summary['baseline_hash'] = image_hash # Only test figures if not generating images if self.generate_dir is None: # Compare to hash library if self.hash_library or compare.kwargs.get('hash_library', None): msg = self.compare_image_to_hash_library(item, fig, result_dir, summary=summary) # Compare against a baseline if specified else: msg = self.compare_image_to_baseline(item, fig, result_dir, summary=summary) close_mpl_figure(fig) if msg is None: if not self.results_always: shutil.rmtree(result_dir) for image_type in ['baseline_image', 'diff_image', 'result_image']: summary[image_type] = None # image no longer exists else: self._test_results[test_name] = summary pytest.fail(msg, pytrace=False) close_mpl_figure(fig) self._test_results[test_name] = summary if summary['status'] == 'skipped': pytest.skip(summary['status_msg']) def generate_summary_json(self): json_file = self.results_dir / 'results.json' with open(json_file, 'w') as f: json.dump(self._test_results, f, indent=2) return json_file def pytest_unconfigure(self, config): """ Save out the hash library at the end of the run. """ result_hash_library = self.results_dir / (self.results_hash_library_name or "temp.json") if self.generate_hash_library is not None: hash_library_path = Path(config.rootdir) / self.generate_hash_library hash_library_path.parent.mkdir(parents=True, exist_ok=True) with open(hash_library_path, "w") as fp: json.dump(self._generated_hash_library, fp, indent=2) if self.results_always: # Make accessible in results directory # Use same name as generated result_hash_library = self.results_dir / hash_library_path.name shutil.copy(hash_library_path, result_hash_library) elif self.results_always and self.results_hash_library_name: result_hashes = {k: v['result_hash'] for k, v in self._test_results.items() if v['result_hash']} if len(result_hashes) > 0: # At least one hash comparison test with open(result_hash_library, "w") as fp: json.dump(result_hashes, fp, indent=2) if self.generate_summary: kwargs = {} if 'json' in self.generate_summary: summary = self.generate_summary_json() print(f"A JSON report can be found at: {summary}") if result_hash_library.exists(): # link to it in the HTML kwargs["hash_library"] = result_hash_library.name if 'html' in self.generate_summary: summary = generate_summary_html(self._test_results, self.results_dir, **kwargs) print(f"A summary of test results can be found at: {summary}") if 'basic-html' in self.generate_summary: summary = generate_summary_basic_html(self._test_results, self.results_dir, **kwargs) print(f"A summary of test results can be found at: {summary}") class FigureCloser: """ This is used in place of ImageComparison when the --mpl option is not used, to make sure that we still close figures returned by tests. """ def __init__(self, config): self.config = config self.return_value = {} @pytest.hookimpl(hookwrapper=True) def pytest_runtest_call(self, item): wrap_figure_interceptor(self, item) yield if get_compare(item) is not None: test_name = generate_test_name(item) if test_name not in self.return_value: # Test function did not complete successfully return fig = self.return_value[test_name] close_mpl_figure(fig) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6882362 pytest-mpl-0.16.1/pytest_mpl/summary/0000755000175100001710000000000014266763666017237 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/__init__.py0000644000175100001710000000000014266763645021333 0ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/html.py0000644000175100001710000002113114266763645020550 0ustar00runnerdockerimport os import sys import shutil if sys.version_info >= (3, 8): from functools import cached_property else: cached_property = property from jinja2 import Environment, PackageLoader, select_autoescape __all__ = ['generate_summary_html', 'generate_summary_basic_html'] class Results: """ Data for the whole test run, used for providing data to the template. Parameters ---------- results : dict The `pytest_mpl.plugin.ImageComparison._test_results` object. title : str Value for HTML . """ def __init__(self, results, title="Image comparison"): self.title = title # HTML <title> # Generate sorted list of results self.cards = [] pad = len(str(len(results.items()))) # maximum length of a result index for collect_n, (name, item) in enumerate(results.items()): card_id = str(collect_n).zfill(pad) # zero pad for alphanumerical sorting self.cards += [Result(name, item, card_id)] self.cards = sorted(self.cards, key=lambda i: i.indexes['status'], reverse=True) @cached_property def statistics(self): """Generate a dictionary of summary statistics.""" stats = {'passed': 0, 'failed': 0, 'passed_baseline': 0, 'failed_baseline': 0, 'skipped': 0} for test in self.cards: if test.status == 'passed': stats['passed'] += 1 if test.image_status != 'match': stats['failed_baseline'] += 1 elif test.status == 'failed': stats['failed'] += 1 if test.image_status == 'match': stats['passed_baseline'] += 1 elif test.status == 'skipped': stats['skipped'] += 1 return stats @cached_property def image_comparison(self): """Whether at least one image comparison test or generation was performed.""" for result in self.cards: if result.image_status: return True return False @cached_property def hash_comparison(self): """Whether at least one hash comparison test or generation was performed.""" for result in self.cards: if result.hash_status: return True return False class Result: """ Result data for a single image test, used for providing data to the template. Parameters ---------- name : str Full name of the test including modules. item : dict Dictionary of summary results for a test in `pytest_mpl.plugin.ImageComparison._test_results`. id : str The test number in order collected. Numbers must be zero padded due to alphanumerical sorting. """ def __init__(self, name, item, id): # Make the summary dictionary available as attributes self.__dict__ = item # Sort index for collection order self.id = id # Name of test with module and test function together and separate self.full_name = name without_parametrized_name = name.split("[")[0] self.module = ".".join(without_parametrized_name.split(".")[:-1]) self.name = name[len(self.module)+1:] # Additional classes to add to the result card self.classes = [f'{k}-{str(v).lower()}' for k, v in [ ('overall', self.status), ('image', self.image_status), ('hash', self.hash_status), ]] @cached_property def indexes(self): """Dictionary with strings optimized for sorting.""" return {'status': self._status_sort, 'rms': self._rms_sort} @property def _status_sort(self): """Status number. Higher means more issues.""" s = 0 if self.status == 'failed': s += 10 if self.image_status == 'diff': s += 3 elif self.image_status == 'missing': s += 4 if self.hash_status == 'diff': s += 1 elif self.hash_status == 'missing': s += 5 return f"{s:02.0f}" @property def _rms_sort(self): """RMS to 3 d.p. for sorting.""" if self.image_status == 'match': return "000000" elif self.image_status == 'diff': if self.rms is None: # Shape mismatch return "999999" # RMS will be in [0, 255] return f"{(self.rms + 2) * 1000:06.0f}" else: # Missing baseline image return "000001" @cached_property def rms_str(self): """RMS to show in template.""" if self.image_status == 'match': return '< tolerance' # self.rms is None elif self.image_status == 'diff': return self.rms else: # Missing baseline image return 'None' @property def badges(self): """Additional badges to show beside overall status badge.""" for test_type, status_getter in [('image', image_status_msg), ('hash', hash_status_msg)]: status = getattr(self, f'{test_type}_status') if ( (status == 'missing') or (self.status == 'failed' and status == 'match') or (self.status == 'passed' and status == 'diff') ): # Only show if different to overall status yield {'status': status, 'svg': test_type, 'tooltip': status_getter(status)} def status_class(status): """Status to Bootstrap class.""" status = status.split('-')[-1] # e.g. "overall-passed" -> "passed" classes = { 'passed': 'success', 'failed': 'danger', 'skipped': 'warning', 'match': 'success', 'diff': 'danger', 'missing': 'warning', 'generated': 'warning', } return classes[status] def image_status_msg(status): """Image status to status message.""" messages = { 'match': 'Baseline image matches', 'diff': 'Baseline image differs', 'missing': 'Baseline image not found', 'generated': 'Baseline image was generated', } return messages[status] def hash_status_msg(status): """Hash status to status message.""" messages = { 'match': 'Baseline hash matches', 'diff': 'Baseline hash differs', 'missing': 'Baseline hash not found', 'generated': 'Baseline hash was generated', } return messages[status] def generate_summary_html(results, results_dir, hash_library=None): """Generate the HTML summary. Parameters ---------- results : dict The `pytest_mpl.plugin.ImageComparison._test_results` object. results_dir : Path Path to the output directory. hash_library : str, optional, default=None Filename of the generated hash library at the root of `results_dir`. Will be linked to in HTML if not None. """ # Initialize Jinja env = Environment( loader=PackageLoader("pytest_mpl.summary.html"), autoescape=select_autoescape() ) # Register additional Jinja filters env.filters["status_class"] = status_class env.filters["image_status_msg"] = image_status_msg env.filters["hash_status_msg"] = hash_status_msg # Render HTML starting from the base template template = env.get_template("base.html") html = template.render(results=Results(results), hash_library=hash_library) # Write files for file in ['styles.css', 'extra.js', 'hash.svg', 'image.svg']: path = os.path.join(os.path.dirname(__file__), 'templates', file) shutil.copy(path, results_dir / file) html_file = results_dir / 'fig_comparison.html' with open(html_file, 'w') as f: f.write(html + '\n') return html_file def generate_summary_basic_html(results, results_dir, hash_library=None): """Generate the basic HTML summary. Parameters ---------- results : dict The `pytest_mpl.plugin.ImageComparison._test_results` object. results_dir : Path Path to the output directory. hash_library : str, optional, default=None Filename of the generated hash library at the root of `results_dir`. Will be linked to in HTML if not None. """ # Initialize Jinja env = Environment( loader=PackageLoader("pytest_mpl.summary.html"), autoescape=select_autoescape() ) # Render HTML starting from the base template template = env.get_template("basic.html") html = template.render(results=Results(results), hash_library=hash_library) # Write files html_file = results_dir / 'fig_comparison_basic.html' with open(html_file, 'w') as f: f.write(html + '\n') return html_file ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000034�00000000000�010212� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������28 mtime=1658578869.6882362 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pytest-mpl-0.16.1/pytest_mpl/summary/templates/�����������������������������������������������������0000755�0001751�0000171�00000000000�14266763666�021235� 5����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������././@PaxHeader��������������������������������������������������������������������������������������0000000�0000000�0000000�00000000026�00000000000�010213� x����������������������������������������������������������������������������������������������������ustar�00�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������22 mtime=1658578853.0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������pytest-mpl-0.16.1/pytest_mpl/summary/templates/base.html��������������������������������������������0000644�0001751�0000171�00000002535�14266763645�023037� 0����������������������������������������������������������������������������������������������������ustar�00runner��������������������������docker�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="styles.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <title>{{ results.title }} {% include 'navbar.html' %}
{% include 'filter.html' %} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/templates/basic.html0000644000175100001710000000427714266763645023213 0ustar00runnerdocker {{ results.title }}

Image test comparison

{{ results.statistics['passed'] }} passed {% if results.statistics['failed_baseline'] > 0 -%} hash comparison, although {{ results.statistics['failed_baseline'] }} of those have a different baseline image {%- endif %}

{{ results.statistics['failed'] }} failed {% if results.statistics['passed_baseline'] > 0 -%} hash comparison, although {{ results.statistics['passed_baseline'] }} of those have a matching baseline image {%- endif %}

{% if hash_library -%}

Download generated hash library

{%- endif %} {% for result in results.cards -%} {% if result.result_image -%} {% macro image(file) -%} {%- endmacro -%} {{ image(result.baseline_image) }} {{ image(result.diff_image) }} {{ image(result.result_image) }} {%- endif %} {%- endfor %}
Baseline Diff Result
{{ result.module }}
{{ result.name }}
{{ result.status | upper }}
RMS: {{ result.rms_str }} ({{ result.image_status }})
{% if result.result_hash -%}
Result hash: {{ result.result_hash }} ({{ result.hash_status}})
{%- endif %}
{% if file %}{% endif %}
././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/templates/extra.js0000644000175100001710000001533414266763645022721 0ustar00runnerdocker// Enable tooltips var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')) var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl) }) // Search, sort and filter var options = { valueNames: ['collected-sort', 'test-name', 'status-sort', 'rms-sort', 'filter-classes', 'rms-value', 'baseline-hash-value', 'result-hash-value'] }; var resultsList = new List('results', options); var filterClasses = []; var filterElements = document.getElementById('filterForm').getElementsByClassName('filter'); for (var i = 0, elem; elem = filterElements[i++];) { filterClasses.push(elem.id); } countClasses(); // Get and apply initial search parameters from URL var searchParams = new URLSearchParams(window.location.search); if (window.location.search.length > 0) { applyURL(); } else { // If no parameters, apply default but don't update the URL resultsList.sort('status-sort', {order: "desc"}); } // Show page after initial filtering to prevent flashing document.getElementById('resultslist').style.display = null; // Show a message if no tests match current filters var alertPlaceholder = document.getElementById('noResultsAlert'); warnIfNone(); // Initialize resultsList.on('updated', function () { warnIfNone(); }) // Record URL parameters after new sort (but do not update URL yet) resultsList.on('sortComplete', function updateSortURL() { var sortElements = document.getElementsByClassName('sort'); for (var i = 0, elem; elem = sortElements[i++];) { if (elem.checked) { searchParams.set('sort', elem.dataset['sort']); searchParams.set('order', getSortOrder(elem)); break; } } }) // Update URL when filter sidebar is hidden var filterOffcanvas = document.getElementById('offcanvasFilter'); filterOffcanvas.addEventListener('hide.bs.offcanvas', function () { updateURL(); }) // Update URL when search bar is clicked away from function searchComplete() { var q = document.getElementsByClassName('search')[0].value; if (q.length > 0) { // Include query in URL if active query searchParams.set('q', q); } else { searchParams.delete('q'); } updateURL(); } // Search, sort and filter by the current URL parameters function applyURL() { // Get and apply sort var sort = searchParams.get('sort'); if (sort) { document.getElementsByName('sort').forEach( function selectSort(elem) { if (elem.dataset['sort'] == sort) { elem.checked = true; } } ) resultsList.sort(sort, {order: searchParams.get('order')}); } // Get and apply filters var filters = searchParams.getAll('f'); if (filters.length > 0) { var cond = searchParams.get('c'); if (cond === 'and') { document.getElementById('conditionand').checked = true; } else if (cond === 'or') { document.getElementById('conditionor').checked = true; } for (var i = 0, f; f = filters[i++];) { document.getElementById(f).checked = true; } applyFilters(); } // Get and apply search var query = searchParams.get('q'); if (query) { document.getElementsByClassName('search')[0].value = query; resultsList.search(query); } } // Update the URL with the current search parameters function updateURL() { var query = searchParams.toString(); if (query.length > 0) { // Don't end the URL with '?' query = '?' + query; } if (window.location.search != query) { // Update URL if changed history.replaceState(null, '', window.location.pathname + query); } } // Get the current sorting order from an active sort radio button function getSortOrder(elem) { var fixedOrder = elem.dataset['order']; if (fixedOrder == 'asc' || fixedOrder == 'desc') { return fixedOrder; } else if (elem.classList.contains('desc')) { return 'desc'; } else if (elem.classList.contains('asc')) { return 'asc'; } else { return 'asc'; } } function applyFilters() { searchParams.delete('f'); searchParams.delete('c'); var cond_and = document.getElementById('filterForm').elements['conditionand'].checked; var filters = []; var filterElements = document.getElementById('filterForm').getElementsByClassName('filter'); for (var i = 0, elem; elem = filterElements[i++];) { if (elem.checked) { filters.push(elem.id); searchParams.append('f', elem.id); } } if (filters.length == 0) { resultsList.filter(); // Show all if nothing selected return countClasses(); } searchParams.set('c', (cond_and) ? 'and' : 'or'); resultsList.filter(function (item) { var inc = false; for (var i = 0, filt; filt = filters[i++];) { if (item.values()['filter-classes'].includes(filt)) { if (!cond_and) { return true; } inc = true; } else { if (cond_and) { return false; } } } return inc; }); countClasses(); } function resetFilters() { resultsList.filter(); document.getElementById("filterForm").reset(); countClasses(); searchParams.delete('f'); searchParams.delete('c'); } function countClasses() { for (var i = 0, filt; filt = filterElements[i++];) { var count = 0; if (document.getElementById('filterForm').elements['conditionand'].checked) { var itms = resultsList.visibleItems; } else { var itms = resultsList.items; } for (var j = 0, itm; itm = itms[j++];) { if (itm.values()['filter-classes'].includes(filt.id)) { count++; } } var badge = filt.parentElement.getElementsByClassName('badge')[0]; badge.innerHTML = count.toString(); } } function warnIfNone() { if (resultsList.visibleItems.length === 0) { // Show info box alertPlaceholder.innerHTML = ''; } else { // Remove info box alertPlaceholder.innerHTML = ''; } } // Clear active search and filters function clearAll() { document.getElementsByClassName('search')[0].value = ''; resultsList.search(''); searchParams.delete('q'); resetFilters(); updateURL(); } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/templates/filter.html0000644000175100001710000000730014266763645023405 0ustar00runnerdocker
Sort and filter results
Sort tests by...
{% macro sort_option(id, name, order='', default=false) -%} {%- endmacro -%} {{ sort_option('status-sort', 'status', 'desc', default=true) }} {{ sort_option('collected-sort', 'collected', 'asc') }} {{ sort_option('test-name', 'name') }} {% if results.image_comparison -%} {{ sort_option('rms-sort', 'RMS', 'desc') }} {%- endif %}
Show tests which have...
{% macro filter_option(id, name) -%} {%- endmacro -%} {{ filter_option('overall-passed', 'passed') }} {{ filter_option('overall-failed', 'failed') }} {{ filter_option('overall-skipped', 'skipped') }}
{% if results.image_comparison -%}
{{ filter_option('image-match', 'matching images') }} {{ filter_option('image-diff', 'differing images') }} {{ filter_option('image-missing', 'no baseline image') }}
{%- endif %} {% if results.hash_comparison -%}
{{ filter_option('hash-match', 'matching hashes') }} {{ filter_option('hash-diff', 'differing hashes') }} {{ filter_option('hash-missing', 'no baseline hash') }}
{%- endif %}
././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/templates/hash.svg0000644000175100001710000000152314266763645022677 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/templates/image.svg0000644000175100001710000000063014266763645023034 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/templates/navbar.html0000644000175100001710000000515114266763645023373 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/templates/result.html0000644000175100001710000000576414266763645023452 0ustar00runnerdocker{% for r in results.cards -%}
{% if r.image_status and r.image_status == "diff" -%}
{% if r.diff_image -%}
diff image
result image
{%- else -%} result image {%- endif %}
{%- elif r.result_image -%} result image {%- elif r.baseline_image -%} baseline image {%- endif %}
{% filter indent(width=8) -%} {% include 'result_images.html' %} {%- endfilter %}
{{ r.module }}
{{ r.name }}
{% for badge in r.badges -%} {% endfor %}
{%- endfor %} ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/templates/result_images.html0000644000175100001710000000644014266763645024767 0ustar00runnerdocker
{{ r.module }}
{{ r.name }}
{% if r.image_status and r.image_status != 'generated' -%}
{% macro image_card(file, name) -%}
{{ name }}
{% if file -%} {{ name }} {%- endif %}
{%- endmacro -%} {{ image_card(r.baseline_image, 'Baseline') }} {{ image_card(r.diff_image, 'Diff') }} {{ image_card(r.result_image, 'Result') }}
{%- endif %}
{{ r.status | upper }}
{{ r.status_msg }}
{% macro pre_data(id, value, name) -%} {% filter indent(width=8) -%}
{{ value }}
{%- endfilter %} {%- endmacro -%} {% if r.image_status -%}
{{ r.image_status | image_status_msg }}
{% if r.image_status == 'match' or r.image_status == 'diff' -%}
{{ pre_data('rms', r.rms_str, 'RMS') }} {{ pre_data('tolerance', r.tolerance, 'Tolerance') }}
{%- endif %}
{%- endif %} {% if r.hash_status -%}
{{ r.hash_status | hash_status_msg }}
{{ pre_data('baseline_hash', r.baseline_hash, 'Baseline') }} {% if r.hash_status != 'generated' -%} {{ pre_data('result_hash', r.result_hash, 'Result') }} {%- endif %}
{%- endif %}
././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/pytest_mpl/summary/templates/styles.css0000644000175100001710000000200514266763645023264 0ustar00runnerdocker.navbar-brand span.repo { font-weight: bold; } .nav-filtertools { width: 100%; } .nav-filtertools div.spacer { flex: 1; display: none; } .nav-filtertools .nav-searchbar { flex: 10; } .nav-filtertools svg { vertical-align: text-bottom; } #filterForm .spacer { flex: 1; } #filterForm span.badge { float: right; margin-top: 2px; } @media (min-width: 576px) { .nav-filtertools div.spacer { display: block; } .nav-filtertools .nav-searchbar { max-width: 400px; } } pre { white-space: pre-line; } .tooltip-inner pre { margin: 0; } div.result div.status-badge button img { vertical-align: sub; } div.result div.status-badge button.btn-warning img { filter: brightness(0); } div.mpl-images { height: auto; } div.hover-image { position: relative; border: 3px solid #dc3545; border-radius: .2rem; } div.hover-image div.result-image { position: absolute; top: 0; } div.hover-image div.result-image img { filter: opacity(0.3); } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6882362 pytest-mpl-0.16.1/pytest_mpl.egg-info/0000755000175100001710000000000014266763666017234 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578869.0 pytest-mpl-0.16.1/pytest_mpl.egg-info/PKG-INFO0000644000175100001710000003215014266763665020331 0ustar00runnerdockerMetadata-Version: 2.1 Name: pytest-mpl Version: 0.16.1 Summary: pytest plugin to help with testing figures output from Matplotlib Home-page: https://github.com/matplotlib/pytest-mpl Author: Thomas Robitaille Author-email: thomas.robitaille@gmail.com License: BSD Classifier: Development Status :: 4 - Beta Classifier: Framework :: Pytest Classifier: Intended Audience :: Developers Classifier: Topic :: Software Development :: Testing Classifier: Topic :: Scientific/Engineering :: Visualization Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Operating System :: OS Independent Classifier: License :: OSI Approved :: BSD License Requires-Python: >=3.6 Description-Content-Type: text/x-rst Provides-Extra: test License-File: LICENSE About ----- This is a plugin to facilitate image comparison for `Matplotlib `__ figures in pytest. For each figure to test, the reference image is subtracted from the generated image, and the RMS of the residual is compared to a user-specified tolerance. If the residual is too large, the test will fail (this is implemented using helper functions from ``matplotlib.testing``). For more information on how to write tests to do this, see the **Using** section below. Installing ---------- This plugin is compatible with Python 3.6 and later, and requires `pytest `__ and `matplotlib `__ to be installed. To install, you can do:: pip install pytest-mpl You can check that the plugin is registered with pytest by doing:: pytest --version which will show a list of plugins: :: This is pytest version 2.7.1, imported from ... setuptools registered plugins: pytest-mpl-0.1 at ... Using ----- With Baseline Images ^^^^^^^^^^^^^^^^^^^^ To use, you simply need to mark the function where you want to compare images using ``@pytest.mark.mpl_image_compare``, and make sure that the function returns a Matplotlib figure (or any figure object that has a ``savefig`` method): .. code:: python import pytest import matplotlib.pyplot as plt @pytest.mark.mpl_image_compare def test_succeeds(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,3]) return fig To generate the baseline images, run the tests with the ``--mpl-generate-path`` option with the name of the directory where the generated images should be placed:: pytest --mpl-generate-path=baseline If the directory does not exist, it will be created. The directory will be interpreted as being relative to where you are running ``pytest``. Once you are happy with the generated images, you should move them to a sub-directory called ``baseline`` relative to the test files (this name is configurable, see below). You can also generate the baseline image directly in the right directory. With a Hash Library ^^^^^^^^^^^^^^^^^^^ Instead of comparing to baseline images, you can instead compare against a JSON library of SHA-256 hashes. This has the advantage of not having to check baseline images into the repository with the tests, or download them from a remote source. The hash library can be generated with ``--mpl-generate-hash-library=path_to_file.json``. The hash library to be used can either be specified via the ``--mpl-hash-library=`` command line argument, or via the ``hash_library=`` keyword argument to the ``@pytest.mark.mpl_image_compare`` decorator. When generating a hash library, the tests will also be run as usual against the existing hash library specified by ``--mpl-hash-library`` or the keyword argument. However, generating baseline images will always result in the tests being skipped. Hybrid Mode: Hashes and Images ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It is possible to configure both hashes and baseline images. In this scenario only the hash comparison can determine the test result. If the hash comparison fails, the test will fail, however a comparison to the baseline image will be carried out so the actual difference can be seen. If the hash comparison passes, the comparison to the baseline image is skipped (unless **results always** is configured). This is especially useful if the baseline images are external to the repository containing the tests, and are accessed via HTTP. In this situation, if the hashes match, the baseline images won't be retrieved, saving time and bandwidth. Also, it allows the tests to be modified and the hashes updated to reflect the changes without having to modify the external images. Running Tests ^^^^^^^^^^^^^ Once tests are written with baseline images, a hash library, or both to compare against, the tests can be run with:: pytest --mpl and the tests will pass if the images are the same. If you omit the ``--mpl`` option, the tests will run but will only check that the code runs, without checking the output images. Generating a Test Summary ^^^^^^^^^^^^^^^^^^^^^^^^^ By specifying the ``--mpl-generate-summary=html`` CLI argument, a HTML summary page will be generated showing the test result, log entry and generated result image. When in the (default) image comparison mode, the baseline image, diff image and RMS (if any), and tolerance of each test will also be shown. When in the hash comparison mode, the baseline hash and result hash will also be shown. When in hybrid mode, all of these are included. When generating a HTML summary, the ``--mpl-results-always`` option is automatically applied (see section below). Therefore images for passing tests will also be shown. +---------------+---------------+---------------+ | |html all| | |html filter| | |html result| | +---------------+---------------+---------------+ As well as ``html``, ``basic-html`` can be specified for an alternative HTML summary which does not rely on JavaScript or external resources. A ``json`` summary can also be saved. Multiple options can be specified comma-separated. Options ------- Tolerance ^^^^^^^^^ The RMS tolerance for the image comparison (which defaults to 2) can be specified in the ``mpl_image_compare`` decorator with the ``tolerance`` argument: .. code:: python @pytest.mark.mpl_image_compare(tolerance=20) def test_image(): ... Savefig options ^^^^^^^^^^^^^^^ You can pass keyword arguments to ``savefig`` by using ``savefig_kwargs`` in the ``mpl_image_compare`` decorator: .. code:: python @pytest.mark.mpl_image_compare(savefig_kwargs={'dpi':300}) def test_image(): ... Baseline images ^^^^^^^^^^^^^^^ The baseline directory (which defaults to ``baseline`` ) and the filename of the plot (which defaults to the name of the test with a ``.png`` suffix) can be customized with the ``baseline_dir`` and ``filename`` arguments in the ``mpl_image_compare`` decorator: .. code:: python @pytest.mark.mpl_image_compare(baseline_dir='baseline_images', filename='other_name.png') def test_image(): ... The baseline directory in the decorator above will be interpreted as being relative to the test file. Note that the baseline directory can also be a URL (which should start with ``http://`` or ``https://`` and end in a slash). If you want to specify mirrors, set ``baseline_dir`` to a comma-separated list of URLs (real commas in the URL should be encoded as ``%2C``). Finally, you can also set a custom baseline directory globally when running tests by running ``pytest`` with:: pytest --mpl --mpl-baseline-path=baseline_images This directory will be interpreted as being relative to where pytest is run. However, if the ``--mpl-baseline-relative`` option is also included, this directory will be interpreted as being relative to the current test directory. In addition, if both this option and the ``baseline_dir`` option in the ``mpl_image_compare`` decorator are used, the one in the decorator takes precedence. Results always ^^^^^^^^^^^^^^ By default, result images are only saved for tests that fail. Passing ``--mpl-results-always`` to pytest will force result images to be saved for all tests, even for tests that pass. When in **hybrid mode**, even if a test passes hash comparison, a comparison to the baseline image will also be carried out, with the baseline image and diff image (if image comparison fails) saved for all tests. This secondary comparison will not affect the success status of the test. This option is useful for always *comparing* the result images against the baseline images, while only *assessing* the tests against the hash library. If you only update your baseline images after merging a PR, this option means that the generated summary will always show how the PR affects the baseline images, with the success status of each test (based on the hash library) also shown in the generated summary. This option is applied automatically when generating a HTML summary. When the ``--mpl-results-always`` option is active, and some hash comparison tests are performed, a hash library containing all the result hashes will also be saved to the root of the results directory. The filename will be extracted from ``--mpl-generate-hash-library``, ``--mpl-hash-library`` or ``hash_library=`` in that order. Base style ^^^^^^^^^^ By default, tests will be run using the Matplotlib 'classic' style (ignoring any locally defined RC parameters). This can be overridden by using the ``style`` argument: .. code:: python @pytest.mark.mpl_image_compare(style='fivethirtyeight') def test_image(): ... Package version dependencies ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Different versions of Matplotlib and FreeType may result in slightly different images. When testing on multiple platforms or as part of a pipeline, it is important to ensure that the versions of these packages match the versions used to generate the images used for comparison. It can be useful to pin versions of Matplotlib and FreeType so as to avoid automatic updates that fail tests. Removing text ^^^^^^^^^^^^^ If you are running a test for which you are not interested in comparing the text labels, you can use the ``remove_text`` argument to the decorator: .. code:: python @pytest.mark.mpl_image_compare(remove_text=True) def test_image(): ... This will make the test insensitive to changes in e.g. the freetype library. Test failure example -------------------- If the images produced by the tests are correct, then the test will pass, but if they are not, the test will fail with a message similar to the following:: E Exception: Error: Image files did not match. E RMS Value: 142.2287807767823 E Expected: E /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/baseline-coords_overlay_auto_coord_meta.png E Actual: E /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/coords_overlay_auto_coord_meta.png E Difference: E /var/folders/zy/t1l3sx310d3d6p0kyxqzlrnr0000gr/T/tmp4h4oxr7y/coords_overlay_auto_coord_meta-failed-diff.png E Tolerance: E 10 The image paths included in the exception are then available for inspection: +----------------+----------------+-------------+ | Expected | Actual | Difference | +================+================+=============+ | |expected| | |actual| | |diff| | +----------------+----------------+-------------+ In this case, the differences are very clear, while in some cases it may be necessary to use the difference image, or blink the expected and actual images, in order to see what changed. The default tolerance is 2, which is very strict. In some cases, you may want to relax this to account for differences in fonts across different systems. By default, the expected, actual and difference files are written to a temporary directory with a non-deterministic path. If you want to instead write them to a specific directory, you can use:: pytest --mpl --mpl-results-path=results The ``results`` directory will then contain one sub-directory per test, and each sub-directory will contain the three files mentioned above. If you are using a continuous integration service, you can then use the option to upload artifacts to upload these results to somewhere where you can view them. For more information, see: * `Uploading artifacts on Travis-CI `_ * `Build Artifacts (CircleCI) `_ * `Packaging Artifacts (AppVeyor) `_ Running the tests for pytest-mpl -------------------------------- If you are contributing some changes and want to run the tests, first install the latest version of the plugin then do:: cd tests pytest --mpl The reason for having to install the plugin first is to ensure that the plugin is correctly loaded as part of the test suite. .. |html all| image:: images/html_all.png .. |html filter| image:: images/html_filter.png .. |html result| image:: images/html_result.png .. |expected| image:: images/baseline-coords_overlay_auto_coord_meta.png .. |actual| image:: images/coords_overlay_auto_coord_meta.png .. |diff| image:: images/coords_overlay_auto_coord_meta-failed-diff.png ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578869.0 pytest-mpl-0.16.1/pytest_mpl.egg-info/SOURCES.txt0000644000175100001710000000726414266763665021130 0ustar00runnerdocker.gitignore .pre-commit-config.yaml CHANGES.md LICENSE MANIFEST.in README.rst RELEASING.md pyproject.toml setup.cfg setup.py tox.ini .github/release.yml .github/workflows/test_and_publish.yml .github/workflows/update-changelog.yaml images/baseline-coords_overlay_auto_coord_meta.png images/coords_overlay_auto_coord_meta-failed-diff.png images/coords_overlay_auto_coord_meta.png images/html_all.png images/html_filter.png images/html_result.png pytest_mpl/__init__.py pytest_mpl/plugin.py pytest_mpl.egg-info/PKG-INFO pytest_mpl.egg-info/SOURCES.txt pytest_mpl.egg-info/dependency_links.txt pytest_mpl.egg-info/entry_points.txt pytest_mpl.egg-info/requires.txt pytest_mpl.egg-info/top_level.txt pytest_mpl.egg-info/zip-safe pytest_mpl/summary/__init__.py pytest_mpl/summary/html.py pytest_mpl/summary/templates/base.html pytest_mpl/summary/templates/basic.html pytest_mpl/summary/templates/extra.js pytest_mpl/summary/templates/filter.html pytest_mpl/summary/templates/hash.svg pytest_mpl/summary/templates/image.svg pytest_mpl/summary/templates/navbar.html pytest_mpl/summary/templates/result.html pytest_mpl/summary/templates/result_images.html pytest_mpl/summary/templates/styles.css tests/conftest.py tests/test_pytest_mpl.py tests/baseline/test_hash_lib.json tests/baseline/2.0.x/test_base_style.png tests/baseline/2.0.x/test_dpi.png tests/baseline/2.0.x/test_modified.png tests/baseline/2.0.x/test_parametrized_5.png tests/baseline/2.0.x/test_parametrized_50.png tests/baseline/2.0.x/test_parametrized_500.png tests/baseline/2.0.x/test_remove_text.png tests/baseline/2.0.x/test_succeeds.png tests/baseline/2.0.x/test_tolerance.png tests/baseline/2.0.x/test_unmodified.png tests/baseline/hashes/mpl20_ft261.json tests/baseline/hashes/mpl21_ft261.json tests/baseline/hashes/mpl22_ft261.json tests/baseline/hashes/mpl30_ft261.json tests/baseline/hashes/mpl31_ft261.json tests/baseline/hashes/mpl32_ft261.json tests/baseline/hashes/mpl33_ft261.json tests/baseline/hybrid/fail/test_hash_fail_hybrid.png tests/baseline/hybrid/succeed/test_hash_fail_hybrid.png tests/subtests/README.rst tests/subtests/__init__.py tests/subtests/helpers.py tests/subtests/subtest.py tests/subtests/test_subtest.py tests/subtests/baseline/test_hdiff_idiff.png tests/subtests/baseline/test_hdiff_idiff_tolerance.png tests/subtests/baseline/test_hdiff_idiffshape.png tests/subtests/baseline/test_hdiff_imatch.png tests/subtests/baseline/test_hdiff_imatch_removetext.png tests/subtests/baseline/test_hdiff_imatch_savefig.png tests/subtests/baseline/test_hdiff_imatch_style.png tests/subtests/baseline/test_hdiff_imatch_tolerance.png tests/subtests/baseline/test_hmatch_idiff.png tests/subtests/baseline/test_hmatch_idiffshape.png tests/subtests/baseline/test_hmatch_imatch.png tests/subtests/baseline/test_hmissing_idiff.png tests/subtests/baseline/test_hmissing_idiffshape.png tests/subtests/baseline/test_hmissing_imatch.png tests/subtests/hashes/mpl33_ft261.json tests/subtests/hashes/mpl34_ft261.json tests/subtests/hashes/mpl35_ft261.json tests/subtests/result_hashes/mpl33_ft261.json tests/subtests/result_hashes/mpl34_ft261.json tests/subtests/result_hashes/mpl35_ft261.json tests/subtests/summaries/test_default.json tests/subtests/summaries/test_generate.json tests/subtests/summaries/test_generate_hashes_only.json tests/subtests/summaries/test_generate_images_only.json tests/subtests/summaries/test_hash.json tests/subtests/summaries/test_html_generate.json tests/subtests/summaries/test_html_generate_hashes_only.json tests/subtests/summaries/test_html_generate_images_only.json tests/subtests/summaries/test_html_hashes_only.json tests/subtests/summaries/test_html_images_only.json tests/subtests/summaries/test_hybrid.json tests/subtests/summaries/test_results_always.json././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578869.0 pytest-mpl-0.16.1/pytest_mpl.egg-info/dependency_links.txt0000644000175100001710000000000114266763665023301 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578869.0 pytest-mpl-0.16.1/pytest_mpl.egg-info/entry_points.txt0000644000175100001710000000005214266763665022526 0ustar00runnerdocker[pytest11] pytest_mpl = pytest_mpl.plugin ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578869.0 pytest-mpl-0.16.1/pytest_mpl.egg-info/requires.txt0000644000175100001710000000015414266763665021633 0ustar00runnerdockerpytest matplotlib packaging Jinja2 Pillow [:python_version < "3.8"] importlib_resources [test] pytest-cov ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578869.0 pytest-mpl-0.16.1/pytest_mpl.egg-info/top_level.txt0000644000175100001710000000001314266763665021757 0ustar00runnerdockerpytest_mpl ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578869.0 pytest-mpl-0.16.1/pytest_mpl.egg-info/zip-safe0000644000175100001710000000000114266763665020663 0ustar00runnerdocker ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6962361 pytest-mpl-0.16.1/setup.cfg0000644000175100001710000000274114266763666015167 0ustar00runnerdocker[metadata] license_file = LICENSE name = pytest-mpl url = https://github.com/matplotlib/pytest-mpl author = Thomas Robitaille author_email = thomas.robitaille@gmail.com classifiers = Development Status :: 4 - Beta Framework :: Pytest Intended Audience :: Developers Topic :: Software Development :: Testing Topic :: Scientific/Engineering :: Visualization Programming Language :: Python Programming Language :: Python :: 3 Operating System :: OS Independent License :: OSI Approved :: BSD License license = BSD description = pytest plugin to help with testing figures output from Matplotlib long_description = file: README.rst long_description_content_type = text/x-rst [options] zip_safe = True packages = find: include_package_data = True python_requires = >=3.6 install_requires = pytest matplotlib importlib_resources;python_version<'3.8' packaging Jinja2 Pillow [options.entry_points] pytest11 = pytest_mpl = pytest_mpl.plugin [options.extras_require] test = pytest-cov [tool:pytest] testpaths = "tests" markers = image: run test during image comparison only mode. hash: run test during hash comparison only mode. filterwarnings = error ignore:distutils Version classes are deprecated ignore:the imp module is deprecated in favour of importlib [flake8] max-line-length = 100 ignore = W504 [pycodestyle] max_line_length = 100 [isort] balanced_wrapping = True length_sort = False length_sort_sections = stdlib line_length = 100 [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/setup.py0000644000175100001710000000012114266763645015043 0ustar00runnerdocker#!/usr/bin/env python from setuptools import setup setup(use_scm_version=True) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6882362 pytest-mpl-0.16.1/tests/0000755000175100001710000000000014266763666014504 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6882362 pytest-mpl-0.16.1/tests/baseline/0000755000175100001710000000000014266763666016266 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6882362 pytest-mpl-0.16.1/tests/baseline/2.0.x/0000755000175100001710000000000014266763666017033 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/2.0.x/test_base_style.png0000644000175100001710000006471214266763645022741 0ustar00runnerdockerPNG  IHDR5sBIT|d pHYsaa?i8tEXtSoftwarematplotlib version3.1.2, http://matplotlib.org/%J IDATx{\Tu?p &jRyi ej`+[ii[`jm]ﮮeff$3܆aß430y=Ϝy;/? DDDD$ 0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I  0I `3L&\t &rKg]R?` X֎Ba$iڥIʵҨHb$Hb$Hb$Hb@ɄKwމP~0a>s56 AXXzyNs<ѣ"""0qD>|=| d2ƏL8EEEXp!}Ql&`ѢEXx1A@rr2>ǘ1cpE;v?|2Od6zj^Ç#??f¨QDw\]]b (hpݻ]7k&1-e6*%Kg] Naa^.Uڠj׷]\d2<3xqEE@V;|{nLQQVkZ]X4Iv@vi-i6]2VOCۧ~BQD`@@ l6~'o'N/pmf%%% ux'c]jҮvOR pbZQW h$$ѽ{w̛7x'zjX{j߭ j0n3X^U*njKgSF,=^ _{"<[5I cƌ6QT Õ+Wy]'v} 5Vҭ-Z%% +iU?G홭kXnralwϽ-0[^˷e]51Z|Թ%-窱rԊU{-'.MHDDDnڊ9z*ox"iZDDDVvɈ< fWyˁWH.-HDDDnPkG ˥q^AA.a$""S-dcx{x5Z _wi@"""0Vo~Uu߉w@z}\67OHDDDlYpNo7#Fhe{6HDDD.e;[7OU1(exGnrHDDD.SXel=r͢ =Nl.JDDDNTP!Gv gSvHDDDJ_k y?]y#3A:wio DDDn ["dj( DDDj,V|U EE(!^0wq%@"""jSߔyx{6B ]\ڄ&g+P'E#&Q DDDjW*-]y%]Ɔ`].9HDDD-&\`+QY缽xcOSA.ZdŢ\~$:nH.wh]0QGRr(q~\ Cd{HDDDMfډ ||^m7ڻe{wHDDDM/f$eq\}p ]1(M3H;] <#ZL..a׮]ؿ?.\t: >= ֤'&&ȑ#c6l؀3g~РA(,,t8666{mұm‚,=,e||C(ۻt v033k׮E^0ft/^޽{w^|ǘ6mZ;~gb߇\.ǨQ^W՘?ȦDDDD$WcɱrT,{ɰ ß]:={؅\L<HLLEfr}ƍCn^h4XdIsj ""6Tf~]]wwod$G.ՙ&Mrrx ;wgn>}fc_? X<4L a뤚uYhk׮ Ä 1غu+&_wHDDD-SUgOFOF*9*B&B:taaa0`@uVl6>x.T^vYۑm6`0}C]]&O\;wJ :W\Se7wȑ#ѿT*`ݺuرc"""Fu%XfϑHJ,6`S7>-Ud/[">H< 8B0tFWm6,X\̝;Ep:-W^i###cl޼ .lX-cSf 44JY;kZ퀴g] +R*qL|dBwowoB|Y =HlHIIΝ;#`͚5->g}3gNSOaǎ8vX+WJ,kgR$Yg.>eQck3\}?[9 7Woߎӧc[ Fɓ'7آPb#zVtܠ@+6 Ɲ!*͌\a5M6 -qd2a-J'OfDDD-J ;b@id09nIi۷cʔ) Gii17O>N;\ӧOw~"""WYgCJO, }5^?1Kzg|%n0-- ۶mC@@UVٽ)11pqiiiXx'x>}gϞŐ!C0d/DDDؿ?ꐚJDD$)GKjǕ*=S%.Ԑ]z* 7EFF4x̙3˃hDpp0ƍ;vlGDD$ufXml"BXozxXL&"""£rvH~9kP,=)C=}6F`߆yuۂTo֣='a9-Cp #.t Q'ъl=wĆxzǿoQ'r ꡯu~EXv BU?b$""6|ԀkDݩBFC=f| DDD̑]~o2 ߭/ѯ0uVog #_xF{]: DDD9.gۻL#=싨  ҿ_UInP+eX=BQ~lBb$""rS?VY ǀۻć)CDSo %#^3j?xn5R@U?j@"""7bţx{:/lL€ o͌<  8\d‚lwX80VGU?j@""fxT9ҿCxhf:зeuH:\ qûõв @""` *L~*wvHDDe&+3`eAA8J;lBf‚l=k_'2T %ۻP;c$""j'F ۻD(Pw!`$""j1#)Kr.;5P+ޅ\ Ym~[}cmns?@""6r҂,=]o>(N0wHDDJ F,9V*e?? oޣƼ;U u @""VdsG {U]]C_ ۻPc$""j}&,Q$22~[ll,vP]]]?%r bv] ^2``d EπGNӾ۷oǔ)S)JKKO>p둝޽{#::~{߾}l߿~lYdΜ9ͫ@نze(9w gA!3$QvSҰm6O>踴4,^?fϞ ooou]hĉ'ph4r՘0af͚S",, ~Çowz\90 +i%knD.^zPUU{"##3Á2rDDD`Xp!wn~Xr%ш޽{üyZRI*+*twA790^Ek2 uAb2PXX8ڥV; ;s됔ǷerhixETg\; H ""6A@ƹj,"g|2;BG{I ѭ#\"%GCE]bÔXCdto?uzdy_-^V#e@r1QeRZ/d   o͌Ƚ1QS-dcx{x5Z _/HDDJU_U`w]+èp͍`$"NlYpNo7#Fhigy@""r{6AUxTΟRGjp&G 1[+`~9fq |Ew!jJ- jQ*Dڻ(`~lL$ DDv6e.Cۻ5 CE&,֣b?g`i> 5 _cùjq l!6]Z:7f$gq efo?Bd{`$"c * ԉwȰ6FɷnrD:]Jۻ x+\43"HDD.%\`+QY缽xcOSA.Dm\dŢ\~$:nH.whޅ=0Kф9z8O.R塁P Qa$"veډ ||^m7ڻe{HDDf$eQP!剾x{lB DD,6Ļ+aq~} V=ޅȕM‚,=,e||C(ۻ  A%߈Q-%{4xw! DDj?XP]C ۻu$@""jZgy IDAT{ xqH ^o9W: HU ?^?EE*9*B.5u3p*:; TlBVlV}ST*%W㴸?]ܑ],**®]~\p%%%t>|8{9 6I;Þ={Wh4"22> yhZ 4{6<""j+uH/ucc{"we333vZ cƌA.]pEݻ{iӦ5s碴#F̙3!ɐ>wƾ}еkWj̟?n{ddd K$"W+P#.D.FGGcϞ=k=77'OFjj*# GEn _|6m»ヒ{}K,ii=DDԆ~1WO~(C/5," ʝ4i]`0ܹsxѢE d2K#GtDD(S~K>Z<؅ᏨiWƝ E˯hlf[nEqq1*lxX9^0p~* :Յ]:&B:taaa0`@Ǝ4M6W^->.5hI-R%;UXq^lB5)!99X|yWϜ94瞳{}֬Y9r$J[;vIFc2?5fs_v)Jfgk5w+,f,+IswDʵ_o췹dAKlHNNΝ;1w\|-:˗ ;wDBBBߛ;v`ʕXpa/]U_DDt2W `i3|/Q( DEEu44m6RRRm6<#ذa/_|'NױezѣGq㡇g}^,))Ahh(Ji]Yj<~ &}:֯_ߪWRR?O 0ş7y+pJ|YyZEV,`Q踡j+2G.*̽xR[ߴiӐѢn | [4ɓ'O`3h"?5X o9 < "D"Ocoݾ};LLWZZRׯ OCN$??=z􀿿˗Oޜڈf^:j_.ֈS녌PD4l۶ ӧVZeD <Gǥa C=܃}~n_ ==111? ~!55mR4wYzX-~*~^v:]z*ڀbo@g ?O8'N8skG~~>Μ9<Fcܸqoo 9Wk֩ |x b-Hat^DDeׯ_7yK,q^Ь9|9}8[&iz:6u& >U፯*`9Vʰzӣ$ޅn`$" ?VY ǀۻć)CD I<_/B"]rջH9W$3B_GK6&a@F$u DD"dp輽 }>  QdxT9ҿCxhfD0u2ߖ!p7XD=B.D+ DD&練TDڻh2bj/烈H:+#,:nttW9; /T9o ]Q DDndyl7(Gp]iЁk&dQ\b?j(ޅȍ-6~o@F#CޅMŌ,=ۻ< @d{"j@"f Xmy G1ZLu#"HDԁ.WZDZ]~.Dz DD@|~%Q%秐{Ԙw 2w!6HDbx{w72ta{"j[ DD.B9u.r@<4rQc$"r:^=QO~o+F{{ @"vf$ebUtܜ{5f{"j_ DDb7XM%"]X-d{"r @"vp܂2|K 0V~lBDHDԆA~0bىrEڻ{̹ݟ]+9b ۻ FfBLD}+5xۻ(dC@x u @"Var|v(:Z̄ ẗc$"jkJ.Tajޅ Q3g*aiObu5 Q3ꐔR. V.lBD"cԩ8p BBBpc8yd`ِwޘ7o._=>=z ""'NÇu\"$6~_Qh 8->GDnaҥKqe3 .Ĉ#Ǐ&`ѢEXx1A@rr2>ǘ1cpE;v?|>+–-[]vAqی30c K ¤`/`>|ݻwp#D&$$ 55cǎE```&"j=xk_[yɀj<70 w!N I >>Νkt[l,[>q~]P^^ݻwO?RٳPنz6 =1hvOoooB-999PT1bkwȑ# رc4="vul+OCbh#ΥYwСC ÀDVWWwu7wvonst௙Laj W)aәֈuߛ a~2ݔ&˦RRKvuPMuuuHNNFmm-/_ `EE@V;|{nLQQVƬURRҮwg]<2j#b+Xq,?{1]ڣ~BQњm6,X\̝;3glyJxxxl6 k=v Lx#D@/06d^ kfto4l6`ΝxGf͚& ߭+++;UR6˸YVmłl=T+:.7X墙O웊Kv=qso۶m>}:֯_iT*ʕ+O^t @Į>vɈ]%[:"BŦD9o6m222tbccQ]]Gڽv7Z:>/]F Qs0[9IYzTwy?A7ۻ5 Mg*JX`9>bbOw!"j)@"p ) '~7C(ۻ  uA%߈Q-%[hlBDC\cųG B.wwFF}4lBDVj =b&]2!xqH \#"jK D2Uu6,;^FqQ d °fFD$- D'UKVqOᏕhb{"vHD&`7XM%"]B|0N#ޅ1QP^,=N"_1V?w!"r@"js YSyp fe{""Wb$6UbbaՊ7Dzm߯#:o%^KE.DDZΆWc.}5^L.lBDԑUJj,=TwyNVܣۻu4@"jU;+*DڻQ(@"j uHR.zbmAlBDNٱc-ZѣGk׮jغukvV+gРAN&&&J"j6A@ƹ*/[8-6 b#"rCWW\B#44?8>r9FeZGFF6{Dv~2ZR,o22T : ""w;~(DFFb͚5XbEw\^ kgRN. }`Μ9~SO=;vرcM X^U*njݳjʂ9d$%6 FD4ۻxgTK{Fɓ`(y"j^2<Eڻ(H34qw;vd2a-J'OfDmPk y|qu^X7Bʟ ._""O!~w"??N<O8p/??˗/L>u%".2!vu'߇~DDw-[ //p97B\NN`ȑeff"-- /vӧOٳ2d t"_|G]]RSSۺj$dƩrW-:J:wq#rm۶ێ=G7s4x̙3˃hDpp0ƍ;vlGDΔf}ûõ1`Jb2PXX;j|]V@H{R51ZLoZgH~ڥV; yqRil=rKĻُ 8U ͌: /T9_UˇiO;|$ȃx>πݗş=(GpE3#""wH!\3!%[`GC.I ^,=.Www o SC.DD\& t%?S H{P?9>a\_M$ꐔR.#}AlBDDW%;#4Շ]5OF+qZ]ؐmR$""O6r ꡯu%F(ޅ\TmX| ۻܡBFC u @6[\l= ۻ$Sa0 GDDV|[./Ǻ8vg{""x D-F{oۻLkb3?v؁Eaڵ+Z-nڬgggC: O"** aaaŦM b+DcW.2d$h++WDaa! 66qqqv d?~ŋ(}( ϟbM&SޞlnHvU;g8om/ .dq]FJ#Rv)j}}ݣX.]`0a"##a4qqXdx뭷WTgp IDATT4f ZVEEEZWlZ]< 2 wNfЊ: O#Y4Iv}W(:B~_~WTHLLİa ,Z!!!m~lGۊlFII BCCTJQ^^M 1ls>N-C=*Lu O#Y;kZtwyP<زe N<xVWYY LFUR6˸扵_`A9Kq^U q?rK!MʂF~[޽ܸi׬V+\={6zQs\KyT#4A^#""!'8y$4h5 8xp둝޽{#::~{߾}l߿~lYdΜ9.P 1Jcd !3y?նlق<s}Y}#GևLa 1{lx{{㮻Bxx8F#N83g@ 33AXz5&LYfaԩ þ}駟O$"`WpZt\Du q#:޽EU 72BESҸ Yoajf᪔Dfjn*xHY mA\Ed0MP E`43p9#99||8o?3ؿƶldgg7l󑞞, Xp!T7nQKXQfz` VI˅ա=At*l.V^S/ ;a ׺k qb?l- OA^,\e{/# l _""RRZsU6>xH!7|H$RSR׈%gqЏ;["> ,M3"" (i!* ?g&bϏʜ~DD$>LGmPsU.wu:DDD0n]"3pRmקao.DD$nLjPqN6\B@1#^f C@.DDDb+Qswxn@/= ,BDDԄ u+* x LZHv#^yԖ]~ uw53.OD\rdy"""]R3[X6ogaH]Zu+Zv^']L3"" uY~S`AF)nV5 -bG;B.DDDz }_MWQQ[]^kF;ւ] Q]Ė(f3XޅI\+GdF/.2i5Л] R®j 񵷔` 3mXޅȘܩyP.~ʻ ۑKFq{*CB~f_F9 jYޅdAU(X]l#@\; 1$,zP. HQg`HvQ*jTwA[3l널,BDDԙR\.GdF).5{a 6ԋE:099r.]•+WP('`֬Y>\.ѣG۷o [oLϰaPPPx8vXOƥTr5> JM25]爈H066pvvޤLܹsQRR___̜9غu+9TWk?,\Pkg@QXӈN W.cݬ}<8LDDԕd޶m͛7c͚5m>E~5mSTXt)alܸQk?GGGX#]s|t2{E `HHHM"`ٲeHHH3g:|2JD۽z u@|Po miQޜ\Z III(**=F'|Ҕ]9uNVy 7QeY?"" g} zqq1/^mԨQHHH??u *|p/ 5ǎNۯzFDDDa0''ׯ ,YY!C@*ƍOI&!++ -`{X^kE_Je{g˸"q;~kQ d `~~>"""؈8;;kyw4~>|8<(Mo>DEEx;wQ8qb4B e[*xZT„}L=u[C̱⎟c9 ~0Ip 11AAAm޼yHNNٳg[߿]mB@qq1\]]aeճֱ]݈jd.<9g~zḎ⎟3v'~'䯸{?cg kkk[ӫVVV]fT*ß+P%PX7mi14_c2R#\eP;kw!"""ch u *^'˻ @'e5~,GdF)5e|e u"Hrr2}B&!))W*?#??_> Àp:u6Jm?T!?G+ +7?"""t:Xݻpuum|rT*,Xƍ_~yyyZ퓓1m4⥗^̙3qUL2Giw?/VB]p^Ți^m///xzzbXfMDð̘13feːԾSN$2((111 }{4JV^~́pğHaƢDDDԅ gXreSǏG`` N8FEE"##?pww믿=zC}ꨲJ,Ȫz[?bP;&DDD클LHRj6n83g4@hhhڛRBWzHDCz 8uMFIkjjPTT\u///xPgooom431~3tD/sQe20۵յm0 X_4^e +( cg쀸g]QV=;w(G{-dffpP݇S2T]Oqqqgw0vs];`͛v6$f5|޽{kj/mp( _}JnP(P\\ WWW/cg쀸g]l( T*nݺFo޼ @y?ooo\xyyyZ {zuLsQUYYYu)lScwQOhWAvvkp m ˻Q7())>w\ڵk5LKKCff&BCC5j N:GaaaBڵ hwDO-Dr+W~iS>???̙3cXbE10g$&&"88>,p!899aÆ d裏`cԩC{U@z \.5eggkU'Blق!C`߾}عs'R)ñj* ֯_QFdܽ{W>׿cK:Nt$vJ4ׯi&O&o… E$xN>mBG0l0e24 cho߾dHJJjqJ%777x{{c׻Ozz:0`xxx <<N@4mcr9V\` <=z4}G2aC*ӂc}ǻq^yxyy HHHJer}„ -^ا+;w}vL:=\\\#`8|BFFMkkk W_}y_~o1J%^~ecј4i򐘘SNӧ>7nDll,<<<0oh-C/댹1zg}||}cǎرc?^xU}{@0zhܹsiii>|8ƍ۷qߤ}0}tڵ {nW^-[ᩧ AGGG@NNƏAA.x[nkL}o7O&! ǎ3Np`OJJŋ'`֬Y&;oG۶mêU 6hɓ򂧧'6oތ5kִz2220i$ðaƌ EJJJSr1Ȁ;AAAK.ހj3D[lADD״MRaҥHHHk7jN~NӘ8q"/_+Vj0dee?~<@P`ɐHMMŘ1cSk"v}9s9tWݻV򚕕ɓ'C*ڵkիqu=pFF~gL>CBxD{הy0h ӦMõk ^K.HcbbgΜ1| Pc]k>|gٳgw[}ͯ\CƏ@8qBcè@dddӇ_GII =ڡ>!bH@"`ٲe5&q0vئrJ}cկI&霹رcQ^^+WxzݷGO333Z7@xᇵ..D~555xAQ%fWTT`޽شivލ˗/\asrrm6lٲ)))(--5yØ}8{,]#G꽥coJ:; nl-] IIIشiUWsMl߾18;wl'4~~~Jz 777iiiسg}Q7o?~<?466ma 6ï+W`ΝprrիCc[X}ÇakkiӦlƾZckޘrrr~z`ɒ%ZϚ5 Gqddd "".\IPUU n>}`Ր(,,ב///l߾F< IDAT>#T*Q]]mJj&ۿ]u`ܿWnqPl}O.\W_}ػw·jccc1f3f  .t*00 3g/5i)))ɓ%ٓƞoJwApp0\\\`kkÇ#..(((03ph@*&L_>} ..NWO[n! @]8J-BVVΝ3g]]OueUUU 1th~qpp<!b/bԩH$HIIO533ܹs>>EYY]f󶆱(tWS}GwT׼1#<<%%%طo_7޼yǸaaahhhxƭψ*H$ٙԚG>鬱W*Xx1<_|7on~b{|(tzU6h }fJ3ިFqqV{g 7wEL2* ))):뿵D=sP[[}+S%իWG_dʱ(T 777ܺuK-k}?R/O>dW)4{ a1 hoS!Z/};<۽{wWtn]\.GMMM{d_u7ث^@\\\ۜcРA/Ӵ14 (**BnnT|Ϟ={3fƦiY`aaM6i+''_~%}v͢btLF}iiiM ֮] }PI_ͩ?Qo2۾)S/W+*((~$… ~J3fhZ . 7o_ OOO .7iҤ E/0rHgO** ϟɓ'QVV+++ <K.ETT*):oGGW{\IvvmlٲC }sNHRcժU:kEDD6mD#F`ٲe p\a+;wΝ٦رcrǏk74C?|#++ 033.\(|||Xظq#ϟoZ`=/tW?U]]LHt=D1HDDDD?HDDDD @""""aHDDD$2LD 0$"""&DDDD"Hd @""""aHDDD$2LD$v%܎vIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/2.0.x/test_dpi.png0000644000175100001710000000616414266763645021360 0ustar00runnerdockerPNG  IHDRsBIT|d pHYs|4k IDATx_hUowZAP ySJ [ zŰA'.. ftTyJ7mudvb1e;VaF[Yfy?Is~`aaGNr[aHKT@Dc4i&L1Hc 0`"1Dc4i&L1Hc 0#}Q477B" Xȕ8 テ͡F((//އIujjj>ǥ.++Coo/箿˗e,-BcL׹=gwxpp 6n܈d2͛7r 2*J|>I ܀~@y9y{WyTtb% @ zi"i>B! y.e&rY1`~G[&Z% (+vm^&*a}MW^\ 0Q.]NہP; LT'EC$&h n6_2?䓪h׮ǏU6n 0 i 6 G"R?6Cb܁ϟ}*PUz1D9.\~m~ 0{Ylz8N$^{M܁e>طزE4kƍ) 02o8zbiؽرC4c]| 恕1HY{sާ̫e$rwJΚ-nm7J 0905e~JE*| MZfnmuWx1t3ͬLڱ[7J 0i#SO8crr~D"BCC*++e,IgnfBף dPQQt: 9ݜBo^'ZА~7'T BH z{{F9.*Iy Ű#G`޽8uԔ瓱<9N0;;+}aU$ @ zi@UnX<)4ن*1d :w3rw3RNfV󤄓ULsZ7J 0Yʉ*1d 'w3tNfV&\ͬLdQ2HTrnfV;0Ty~U=1T2nfV/iͬw`ZL7sSmi܇Y=rynf`*5c70&CCfsF,zW;ᏂVfxlG܁iYw3Lt)N]2ih5 0eY? 0`7`b7xQͬ?.%y}w>`VP`7Df֝qLNNBPHƒ̑iG[[$`nn8w\>BR)=CO/zKRBH_G^-(nf璲b1ܾ}GA2͛Ӄgy&{ 'cy?lexൠc!}T!R:s|XJ %(0XNL73nf)066CaϞ=8uԔ瓱|ɱ 0;;+}aU$ @ z]hv3 cfnoW= ѽ1nfgf v3f&bLrnfҙ<>LLv38z.f&'qULNLNt 0 &ځLnf73f73vDpDl`v3̶f&Z-<3cf&ZfwwVc 1f&*-v`v3GyLT<)/АߏqCqs=p@R)R)cL׹}gB@!u );p]]&&&ىÇ# ֭[8z2^~غՋ;Y }tsv!%_%'DP^nմO׹}g>eaBWW ك!ܸqB^ȵ^Ξ=b޽o133۷㥗^bݍ~?<~V4<DNYYYr:]آE edd:{>ڵKWKAA|>(q OqF]407O1nx ֶl14U?U+ir魷v_>砀j id#oFIRL_( Zy)U0{4}< Pc[JkHRU[6f,jY):Z8PQQҀs>3Q@52gt䈔.իѤ^=ma\@T[nl4oԥK?O׮s }@\(M(eiӤ=x( jYHڷ@^~?_s'-^\l@IK3fw@JfJ3_( *)-5Iu욛̑:u23jx JVv03W5jTqc)#Cھ|-onA)1Qz v  =Z졀*tRТ zIk:z*n#\)5k׬Z| _p/ B/M"- 꾯!=ǎ\P|pHکxmP@ΖxCZLj_m[7l{_uN23^ "c/رRxrC\M Y\ea28a2pO?5' J;NcVG_̌m4ڢ:^GbbM lpURY<#CAGdx/:lڵKJN}VviwݶjRdԽ4c49Sd|v@MP@zEi^)3Sjv5lh2#-]j; &( Ε}m0i9?v@uQ@:t𮛻M2iA?nHO46^yŬYa; :( O&N O0|~4IKNSsKwnbb|C7J/K͛NSs-ZwMlT?HqqCNS{ÆGl~&!AtIJKiTI7B?#Yį];iNHYLפ?P 3gIƍofƊmT~b,qijᰝ9fmc L۷$ϗBCmqP=._.a; <q%%Rd&=4/kX,)sq?/})Nz{ϗ,sa_~)-\(%&Jwi;a vOQ@GKtyv5K63(-p|Tjs)0v 22\饗l\At4{'g;=Kgq4>锢m nuki; >fZ͂AAd~}$eeN)*M{L id#m\FIRL܏>੧s+$vpٳۺUZFJN:trYefE/v- (EFN=̟N^l)=]Lj^eꙟYa܇x\i2i\^\.Թ37Oץ9sNLbeeoYBڱԨ4qc)#CھC/q𠔘(=Yuk!iwQ@ 8E l]IgtN^`:)'GZRjvլ~4( ^2E=Z:v!=;f;  xxRSm'xIP@egKo!-[⁣h7l{v-PN ƌ+ӶziSBV2`?q.uO…RǎN`Ji6i7P@Ü?/EEI#N;pv~0IIf uwQP`~7d.)9YzYmw!͞--^,m; x7 x˗H{wi is3gJݺ˶xEi^)3Sjv\Æwgt4( Ε}mAE¤)S*?vN̰ԡ79{$}{;++,KO7kLKMNiTzVKF4}( `ĉҠAӠO0 mBKN]Pd4%K;V11w  Xq-Լ4-wMlA@qqΝplRCYYYU/СCծ];闿^z%.4R\4|CӠ 3X;ǏWRRԳgjm_*((̙3/*44T:u& ҥKRZ$4dxo; QQQڵk;w*,,ۮ^Zm6lR4i$ 8PYYYJMMuIf!'Gzui];iP[!!fɉ?A?z<Ү]R@4p)3SGZ@7v"<+4hРx@SNUAAn OHHPpp5ύ=ZGvI^…3Hwi; \G)1G06lؠ 6\ܩS,]pҥK˗/W}JJlܫ\zե) fI7xx׮]뮻,% RKEEEꫯ IڵK?dYRmܸQ7tnVQX*i. (edHK/Nw@*'Oȑ#l>|X`%&&W_7|Ν;K~i;VկƍkÆ /4|5hַfϖ/ƚ} Tbɒ%:xտoٲE[l$;43fZn *99YO/~ ZJ&MrKvv9RTԶiw3kDTAA ?&++KYYY=?x` *M*=j; G:+5h -]j; 5t4qԫYdiӤ=>t4>E} NoSw/܇5'͟/͘ajwo3%sϙ} \6ӹ37̑:u23NGjZBڱdԨ4vKf_Gj8xPJLx¬ԅ7֡CkQ@Nsآ ,Z$}鴝\Un#\)5kf; |Mffiziu( P/M"- j; |UD#f_;vvp TA|pHץKm'נ dgKo!-[⁣ |]۶f_۰Az=iQ@N ƌbX)<{ONuxiSBV2`p} /@>Ԝ.\(uh; MNf[Rڶv;(RTt=RL4W11Rf_pv(GRY<#CH K>XP`IVgv풒gnv;fϖ/vﶝj?q)u.͘a; `̜)uf˗mڡOw)5lh; `4lh={Kmڡ4w k; p0iN5GIeef+)Ijee@P@@RzYk!=]jv|MJb֨Ȱj>,M.M( d; P&L0la4P}~4IKNT͒%杺7k7J/K͛NTMf}]i&iz( ?HqqCNTϰake~+!AtIJK4Oj; T_ɑ^,֮4@̈́3_{MCij( Ι3ҤIKNffhv1 3ktzpNԎa9v( Pij˥;lQ@)2R |vnK}5KJlQ@矗Z̔lV@ٷ lQ@/.;ﴝp=>pN壀yҫ.]gpYn3|i4p= *i.O p@)#C͕^zvO;p@=[pX8`; \g9RTԶ' H[E7Ni( |ڵl+(}$eeNDiӤ#<\zQiTQiIRҥvBl$`P@-[#-MjvV˥ޒ~v1'NH'K< i; F""( |SOII+VH4gp8kYiti; uf,u`; Ynż623p` O8{V"#m]8Q4v>iZ-,4IKN2Kw(cbkl嗥mP-kwMl( (..ܹs-[p(++Z㣏>ҠAnIwu|M?HqqCN* 3XꠀTJJJR^^zY׮]jР,Xd 0@~ +!AtIJK@uԩ6mT!!!***RvsNUyۂM}\pRsU.=fI7 WڵKwuDKjH_}.]t~Xy2]V-[d_JMv4iN )7Wz%ix*DZZN|X`%&&W_7|Ν;K|Aw}Zp?={O׿j ~il).NvԿk^>LwGĒ%Kt߲el"I;vui\p8?Ig֛o,кu4fd<)EEImۚ w1ϬZ'Kt{+~f3'G^r8TITs V|$\ʲ7ސ-ڴ/i֌-6Hg; WŠWCHcN+ii @<)!VK9f9qŒ9| }9)XPvS'3֬\)mf; WRTt=RL4ALԿ{.\@]TRY<#CLj ̘SP` ڵKJN}Vvi;fϖ/vﶝ@](RdԽ4c4̙Rnf,|vu\/(+efJ N5lhƠ={KmPW( 4w k; &MbƤ|i kg:tO!)IjތMee- kӥ&MliSW̚D- O&N  UXh; ڠ$9f iizKwfcb̘;Q@H6n_7ע}Wڴv5E~å*6lyƚ PBt钔f; XZN@MP@?#Y];iBBb&}43gIƍnx33VtT\l; ꠀ~l,qijᰝ0k;f2ރuK@1lriiTC%%Rd&=4PsR߾fՒiTC?/})N5`Ʋ|iiT3_~)-\(%&Jwi; ^fL[Pmp#Ktyv;fIfƸRiTTiNsB`4Pw )7Wz%iTٳ8_?i/ƚiTSڶ57Z@j,tN<]+}Yp0(vp 3}e; P@WT$M&=4x4zңJSJGN( 4.'%Ō}9 öl14U+i}Z/zKzmiQ'NH'K< i; ߨQRDcDΝVi3=+Mn; +( ںUZFJN:t3ffG|ٳRt4pi; % `ibiE|@^44cyP޽͔=gNG\isgn3GXVf; ( [BڱҨ4722 ( ;xPJLxq7cCx)<[^xv>If,u:mRI99ʕRfǐ| _o; ?( {iihiPi{EDHi36Nx? ANVPd4+,1HĘ@Q@q-Լ4+Z0cJ6Nx7 H5w\e˖r8ʪ犊СC6$|?HqqCNa#6֌jRǏ+))Iyyyٳg?Ν;Fa:%)-v@EX=u$T $$DEEE:x𠒓k9N|I=c8!|INfvlT$$,k҇Nx' Hծg矯TEgH&I/g; FƏ73cEGKŶއ"gΜ̙33Ժ͚%?.^-9n0k;fpCq$5nX mn'?_ PUf^\ڱvP@\`JMMUrrmǁ*)"#0'mTW|ԷY8v{P@\ >>^mG{y믥L) v@u1ה)St7;xٳ8_?iu)6֌>̆@e( Xd 2N%mkn@ w1ϬTRD^,eeeo[Vc)'G Pׂ̢CHYYftc^ iӤ*ңJSJGNx& Rҥ\-%Ōؖ-摖&je; Z/zK*gbLQ@:qBibi( @˓ϗf0S{)y{3E@iy[sgn2TlS'3CbY4X!af:ivjXȐo7Q@Z:xPJLx@e ;p? P N9h!4ohl!N4{Q@ZXNɑV5-53ǎ>֯p/ PC/M"- j; DDH^,[Rb; P=矗Z̔lj̱+?_Zvz( [_~)-\(%&Jwi; ӣ9-\(UG_*-5^u"=4̬YmcZi4@P@RS;ׁP3RF+4@P@wfϖ~lvbcͱi8RTԶ_`ԺYT鴝~eZ͂AAP7̱,iQ@7iӤ.=4ut4@( Rҥ))Xk; P1 –-摖&je; Ѫ|[oNw4yȑZFIRL9SҹsҊa; pcٳףm*Y#%'K:N{r9efOB:{V"#m̟N>k)=]Ǟ3c`a9&2\i2i^r8TI.xIo( ZoH˖ImNwiC7l{v ҩSfƫ!C1cl;+cӶ_P@~ڔU%Xs,=q[w|,.:v֩9\)mf; ^y)*J)&v|CLԿ9^`; |^%)ɬz!cNckA9)Ʈ]RrNoilibini( /KRҌfΔu3˗m+w)5lh; aCsݳGZv* <ܹRBԷ40isϷVVffЁp$}{s .+n$OO4д+f ik( XKӧK'JN>is,.,tE%Kl?-Yb@1f.P@6n_7Ԣ9i4 kܹ W˖-p8Umnݪ &k׮jҤBCC"׆? IÇK=d; m05h( 8~={Vkۙ3gO>C=^zI<6nܨ޽{ѣ.J;K4Idɗ.ISN_PvO"kN;wTXXX]t~_^p 8Piii?+"ץ5kvlb8Qm'7 ] π pM\˖-W|ҙ3ҤIKN~jx33VtT\l; MU\\֭[ێf͒ViO9fmc1) ,[L/^?l;Gھ\_:j; (Oh9V/_.a;  mۦyiԨQĊz))"#0'm5NoDqJ=Nedd؎㑞^k)3S T&  l7b,oVzuM7Ui_ѣ5zhWĴ/ gvP=zH>b/ڰa6lpsNwP@\~o[h֭ )))ӧ yRsU.1ky9oW1v]we)oZ***W_}K.]}ٳW.],&\Νm@i@uJRnKH%tI9rDÇKDoԹsgIҘ1cM&LP^^5ks4{'g; XsLAfD8NvOչsgl7iӤԅpGSGmbc Km'u)%ccm'ml14U+i@]jJZ\z-m'-N&Ox@9v FIRL9塀-zJ:wNZg_9X4}4T֭Қ5Rrԡ4n33ͬQ@RgJRd4̟NOCK͙#9"K ca9~SBLnl4oԥ4v5))xQ8Q,JϴiRϞEi)( pE} hNl_ߜ '-^l; <u./O?_1üWfJ3uԼڹ37cS'3#fY4:bcQ#i'hXȐo7 oԙD'W  =9W8tvDAp:͠Ң OhlNi` ub:)'GZRjv53 | _o; l־^2E=Z:v""G1ǎN( xRSm' 5\o; lV7ސ-ڴxm͹Æ {NwN23^ "c; &cJ\iiNOj sq9F>  J;NQN\bJi6i.TRTt=RL4Hs l;P@PmIIf {sNQP`18}D%%'K>+~4q4{x{4p5 e)2R]1vKfΔu3/NW^|QڻW̔6 9ƞ=ҥ( so_i/ L1U( 233E\+)Ijޜ{NWR&_ִ+fͱ i TaitiDi i?>isRXh; r:@AAҒ%d"&ƜwP@Pl嗥mE sҦMӠ.Q@P~åa#6֜7P@P%)-v9ԩP@p"@NYHY פ?uk9#M$4n4ffhvט5K:~\ZZr8l0$";fU( jvsRh4jQ/v찝A$D¤'zR߾fiPSH^k)3S z\%?_ZvKiB)1QNi*֣9gYPmAMP@\iKglYn30Ӡ( ~.5UڹӼh; JRnKӠ( ~il).Nv_52Nꠀ)Sڶ57x ֭"N4* ZVc`P4de>HʲUECEEҴicINPsңJSJGNXAiRIj/%ŜN-[#-MjvkJZ\z-mP@ȉH#GNPwF""sE#O=%;'X!9Ü=+Mn; *C[JkHRԽ[n1:fOx& 8{V"#mp(isӠ<?0gt䈔.7|Xz朧Мp:rseˤy.]lp]͹OJ9g^<b4gOs.t4) [Hڷ܈U4S9ڷOZvGIK3fw@MfJ3F TZjnܙ3GZVf; $ OZBڱѨ44n,edH۷s$G1JO9݀㏛sClć8բ xE`stN( >d:)'GZRjvѬ9GiziG|4e4z4t4'"Bzst4#%CJMsKm'_-lԦ4m[sδa{' ;ux5d4f4oX)<ܜC>m;x6%d*s *ps'̹܋>Լx.:v{tdΡVmƿP@RTt=RL4'&FߜS]`;x$yFT"@ssn %%'K>+~4;ٳŋݻm/s)u.͘a; 9S͜c]l;x_23 m~ s={Km}/4w k;  L1Z6 (+334tMR$ooιl]/nNO44m*Yk-#vEKӧK'JNO0{N( 4IKN,1WĘs1- ۸QΖ^~Yjvע9z]i&i|Ś;wղeK9eeeUy'O*::ZmڴQӦMuj׮]R\4|CPcÆGl9'CݡTJJJR^^zYmNX-^X~(%$H.IiiMJK3bSN[(  QQQD;wn>GNf1vj۰akp5ԵkI~h;T 00Pjxyf|6lڴiQFwQIII۟=+M$4n\"7ā¾wa_+ofƊm ؽ{z}:w_/,?.^-9L 8fmcǤYl (**RHHu_yȑ#nRhKBC͹җ_N( .py^|F{ew|%PR߾Ҽyxƍ{Dž {ycwtԩjO ܅} 6m?I(b2]y}nWPP IJLD뮻lG`_] t=؎( .ЫW//QYY57jҤvZvֺuԹs %=ϟWAAl;עRQQN:[oU 4$1B7o֖-[4bIfaM6)""C$u3f۲xv( HKKɓ'ZÇKDoԹsgIۿƏ}uZbJKK5;Ni;ܹ81UMu+g?W\\s*<<\-[PVVV?y򤢣զM5mT{/7\ײ=*UմiSuQF=cZp7N7o֔)SԥKeee??֯ +..ֽޫSNgQ jϞ=jժ xkW\RAAAWʸbǏWRR:v쨞={O>eee~{jW'o~/B]tq]pxkW$%%__yyu>aѢE4rHѣG>}uwV-cZ 8RS399sϟwz~UE߮> p&&&,3Sms:%9;.\p9N377)ɹv*mo:%97mtټysѣ]^6ڵk.L_g9KJJyn@1c*ݖ16oެEGG_}QF8qvءomvo]w6n>׮p::}M Tvj͛u7kذaWkӦFwyG%%%u>6O9sFujذ5uEݻwW^^^2Uvޭ]Yf<wKSveee/˝̙3uޫO*88X7tƎQvޭ>}^kAw}Ν;Wk{լY35iDW_WmѣGNWﯬ cZQ@\,$$DEEE=ۗ]˖-XmjU__?:SW`lCEN:!CɓɩxĘV}իu/OzԣGܹn{t_TAAڴiSWIf_ܵkʮy?W&MԵkWK/8؆\pAڿ{=u֭J1UFR+W+))ڵk_J/"I:t萾ͽkȑ5j;vϷrJ;vL VTTJ.]܈#wi˖-W;~6mڤrn}_|؆k֎;i&ׯ܏cL'ܨQo+!!Av^}Uo֭[5`Io~}׬p[gΜSO= hҥ*--՞={\Z&MGjԨ׿7PϞ=gI&%x4trss_wOT}K.ݻ`ڵKk֬QHHrssu7[ILTEDD\3qcǎ$ƴbo DqySO=l׮300ɹc,:Gl֬3((9tPg~~t_tvyM794hۜ3gt>}ڝe:uToq:Nk~ŏ?8qUV&M8jըPMYf9{ v6hٱcGO<|z$@yU=^o޼i;̑u{{zbg~mwv{͗/_} ׮޼ySɤ4e<َl?;;ۏco @b'#;ۏcoig0 ztZʏ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1vbQ]bvz$g5j=M}ax[墪O|5u]W]55 ouHb}_}?9l69d2i= frax_gg˚|z]DAoBfN28i #@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @bFW񓳮F<}WO6MiN0 C!x^k:jdz~~y  @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1vbQ]bvz$NkVF~5 ok\TUu8E5Z h>x<~ru]u]h"R?0j#q\kfi4 &I1h`6E :;[l4 ڿiNruuUUOgṹhEF'µF+ #@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @bFW񓳮F<}WO6MiN0 C!x^k:jdz~~y  @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @̨j>x<~ru]u]h"fi48ah=uMZV5LZOܯ>`1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1_OκM}_}?9l69g0 ztZժ&Iq, F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@vbQ]bvz$Nk Ǩ;nnnE Z.UUu}}x*Nk 9@񓳮F5 ouH(}}l4tt{{[ɤGa6E :;[l4 OuMFQǧӳ\k<Gm4y<  @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @$}zcg~mwv{#Mpܝvgg~4 F1CUU}$gzn=Ql?;;ۏ0 C!xe1>}>( ۷zUqC}...׭9J#t F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ (1_4IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/2.0.x/test_parametrized_50.png0000644000175100001710000001244114266763645023572 0ustar00runnerdockerPNG  IHDR XvpsBIT|d pHYsaa?iIDATxܱoS'Ƌ%, % SP J3AjH[&1^3%^PBz\xѣ|fYx F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ _U/^+WTiz0L?/.]8 Ȋ/^ԝ;w駟MrJUW6;̂  NNNܹm#?vuZ__oxŲjgdggcogggcogggcogq#t F1 ,~ NNH[fh4c09~ @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@3ɤ^zUɤQΝ9Wn}U/~R/_?[/_6= 0v{{{u޽;GGV{nUklNhأG…Uu2>ΙM&_z˭::={ zZ߯~DWqMӚN_xzᰆk M<ޮ Vu?պPn72Fhh,hPө/x״͛}zvL~~8s&@a׮]ZYz\UUjje'x @`lmmnmn~^փڬVAmn~^`Nzz5Lj<W`3NGxK#X@b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@v`P' M5O\;<FD#XРNS_VcUMi?͛7?O9;gy!@a}w^>A}c8X*@@î]V;;;}kU~nϢ59UyZjZyV#$5G0'z^zL&5zF̙Nfg&x  @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @bnz6 juuĵ~_~>>ᰆk M>ᰆk MFD#X,NS_VcUMi?͛7}"͙9k ,ᄏ__Tՠ޾1Vp,g Οa\vvvvjejתqUVU^jggǟE9kp ikkvwwksjTfZjsݭGdI8kpd2x\ns'58?t #@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 ,p NNH ,x&@ d2'Y<5c}}2fMܹO?Tonz$@_U/^+WTiz0L?/.]8 I1~ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@ F1 @b#@jaaIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/2.0.x/test_parametrized_500.png0000644000175100001710000001746014266763645023660 0ustar00runnerdockerPNG  IHDR XvpsBIT|d pHYsaa?iIDATxO}2PjrX\ DZn֗ziVA%^uC{! \CU?ATzeVlT=V cF;;ش2!"ygcG~gPCePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFekzϯ~,--׾ _K.e׿8#I dÌ?~1Fs99gms9\x1O?^qd|~ՓO>醧-9gms99gm7C@ @]avvFs99gms9כtv= 0\9}M^ϧfyy9W\ɍe۶sLOOd߾}iM pG49ydzLVV%ifz$&vݜ>7XZ?wЃ 0@vm5 V+Z`kK.3Y[A2ٳ|<rԩZ'9P⁴ZԩSElzy3Y[{&z(kktz^њ#@`Ο?kIxdeZ.\P.Ftg[++IG,//fW~0Zʕ+W_{|h= 0 SSS9p`*ɠ?R:T3_ 0@ǎGLu07J~Zy;hy3%Iַx$/YyLo߾Zlff&'NHFu :YXX`pkz=z4I277VgɳjH,,,ߒ9o@ѣGόIf7x=yҒFB333xB}v6cc/e|I^LnO~ɭ?!Ky 9MLLSy_W29$O%y8$NI}燓<ɟWӧI~]|n֤iF9r$GIx69|pz {Q"@`@rUAJѥu8fktyɴZsAA:G̱ch ƨ 0@۷o;I/I^N+'y9;g}->>^cT8q"I^ֽ;ݿu7-:.^cp/8zhdnn.{$/:~gYXX?%s25߀@Gfii)=ߓ$o('y3{c%{a&@L.^gKF_}r_726R}v6?{nᷲVMLLSy_W29$O%y8$NI}燓<ɟWӧ<WFc[ lr:Nn"^/.\HMիW7۲cǎt:t:ݻ׷NsG;z !bC 7kw-X@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @M󙘘64gqq14wt:tLOO7=_zι (#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@25=i~~>6;;ن&,..fqqVWW1ܴNn \9`ePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFeP澦7gbbfgg3;;D,..jC=כtv3==8|;,Q^/ϟOr\7>˶mgΝNɾ}nf ˗/ɓy3YYv;#Gdjj) [z9tpvڕ^[lw|^B&$?GI5++k-d׮ϡC6`k0xvܹ޽'o7?ILNy0%w׏{;wjtF5Cĉٿ>`wKbQJb/ٿ~XFuCiaa!/BKI[͹0kPC senn.|cIƶȭ$$O<-:6^z~PY]]3H'I^]~n,ɱZ}a4C0T^y/sj3l?>X/25v4C04.]gdmT~g^ac@sCԩSiNrhiʩScXkPzy3Y[{&z(kktz^њ4^f 糲r-ɟ\˅ ץ)4K0nnno$[s/YvI,^O(k,PrJzAїիWYz47LLLlfgghn,H|֦jqq14w2?(mIn4gym M5{ ՗NDw`1vܙv/ik/eǎM={ %@ #'+:EdC5ha(ܼ('=IE=^f ¾}29HLN>{KS5ha(}*\&'$ޓI4ɷop29\9}J V NnZ^/.\HMիW7۲cǎt:t:ݻ׷NsG5ڝ CĆn[2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@2(#@+,..6=q6y8lss6ymq8omF5 @?ׯ_O\xIFjc8gms99gmi_qcMMO~1 ?я~1F"կ<_ך/~z.]_z$:PFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePFePIsQIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/2.0.x/test_remove_text.png0000644000175100001710000003062214266763645023141 0ustar00runnerdockerPNG  IHDR XvpsBIT|d pHYsaa?i IDATxM/ws.CQpQkZT*U4iX+ PYvqfg{70g5f2q P]TD:V>m;> W@^s}VPUh P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7_> W/~U_ǬZ*_򗫎ӔߟΪc9~_g֭UhJ HWAKՆcQ/֘,$'kg9o) ]Ky+NC{Q֨kLZ-yd߾ȑ.OvHvNvLΝKfͪ:UkpdÆHOm:Qkq/Y0dhH #&Q/x$%%\̟_ud ڔPS/֨k`6^M^{-y3-WԗBoo GUZG%olޜ|{}sNվ`вn*ch\:߻׊ݪ) d˖dʔdҪjA+yʊ]q( WJSӫN?3@Krؽs'yd͚I~dɒdddDhd M޽7lp!3T|#X47 ձcɮ]V6ߟz2mZ28,\Xu",ƣGIww&Gsq@S{7,s>7wR$'N$VU3аjr, ^|4;4>ؑޝܙ;̚Uu*,eHOm:  ldhHh5  Сdݺ[*ϯ:ӟ䷿MMyR@ƍÇɊU'b2Zӓ,_̞]V*Oɾ}@2sfթ#Xիk%7o&eMю&G%olޜ|{ŋܹU FTn14T.kn;S@4ɖ-ɔ)ٳҥU'jFpZyPpd޼bW Q@`ɫ&otu%N%ӧWFa sJY{Nח][u"&į~,YL(|2gr^_]]̙Su*,ڍɆ eرd.+vl O?ydڴdp0YD4#XSV.A˗OvHvNvLΝKfͪ:2r?$Ǐ'۶UVldhH`( ݃ɡCɺuɷU.ϟ_u*Z,$Sёѣ^5g) ddŊѪ`Z-I/Of.+v&Цɾ}@2sfթhuFիk%7o&e @MA}) m⣏7L6oNdܪSn`[J*bj( -n` ٲ%2%9{6YD3#X-V+ \̛WV*TMhAɫ&otu%N%ӧW `+Wʊ;wdڪ?8h!UdI2uj22|xp^_]]̙Su*ό`47 ձcɮ]VҸ&ߟz2mZ28,\Xu"lFУGIww& @{7,s>+$&rR$'N$VU jr, ^|М7>ؑޝܙ;̚Uu*x:FUkגǓm۪N @+Ǔ!֠4Cuo}\<|>:dd͚dܪSA[J*b@eK2eJrltiՉF&Q9\̛WV*3`&tuSӫN20 \)+vIkN ;~) ޽7˶ 9sNq#ٰ^;e.|'L & V,Qݝ|eŮ S{7,s>R@ХK_8ZUu"hz:co~<(xOJx ɎΝɹsɬYUc s\^^5v<2m[Չy9 }}ex24|R@>ɡCɺuɷU.ϟ_u*h~FIGGrLrhrWa( ddŊAk1b'Y<=U>`) @+#W'%̙Ud hkW7o&e |Qr@ysfMrb2wnթ=ʭ[x K{Z mc` ٲ%2%9{6YD~`-VKIVL++vWsT2}zթ}Z֕+e;I__vmՉ' @K:~Q( @Kw/yd…dΜS,eܸlPFKvbדiӒdª=J~7YU>q9i@of^xᅏ[GGG:::*Jݤ~tw''yw;|FGG+J:PjU|r,XUvR$MjUՉhF4Z\07˃/+Li';v$w';w&%fU xMkm۪N< ' @+Ǔ!4Cuo}\T@`ʕbΝ/YD@dɒdddD`ܻF}{vuB2gNթF` P7n$6ѫcǒ]A&ɓ֭ɴi`paՉFc xf%eŮ|' 3{7LK 9|8y'NS( S.=ƒ'UN4:''V ˖%3f+x DǓ;ݻ;sYN4 #Xc~j~Zydp۶ X А<L$%%\̟_u*Y>IGGrLrhrẂgddŊ1Zӓ,_̞]V*DQ@+#W'%̙UZ, IrjY{f[Ư& ɢEa< ͛5ksN2#XЦnJ6m*'ٻ׊]`) І-[)SgKN #XFjȑdd޼bWI61:_tuSӫN#X\)+vIkN+' O,INMFFZ {={˚ 9sN;#XЂnH6l(Wǎ%vY 4Zɓ֭ɴi`paՉGddbWhw&I)!'4 p168ZUu"O4Z\0_,1\)@S@ ';v$w';w&%fU &szyڵmU'x|N@% !h> 4CuW^I.]Jϯ:3 #9s&9z49xЫ@R@?lܘ<|>XQu"gc P$˗'g h0ccejd߾d` 9T4Wˊݛ72~J@M-*+@kR@b'$7'k$/&sV `r ݺlTJGOOw@kS@"ɖ-ɔ)协o|DY9\̛WV*@P@FG듮䭷SӫNP?FN\)+vIkNPN@O,INMFF}) 0KIo/kv/\H̩:@u`$q#ٰ^;e.ddڴdp0YDLGddbW' 0AM:;?M~9>F 0<\{%'N$VU1.ϠV+̗-Kf(#WS@)';v$w';w&%fU pzyڵmU'hN@ % Nx <CuW^I.]JS4#XnN::3gGj4'7ӧ+Nм`ՒddW>`l\ߟۗ $3gV qjY{f[ƯN@&/^T>&IOH6oN֬)㥗Nz`nJ6m*'ٻ׊]ɢ-[)SFՉZ,R9\̛\|ԃ@M֯OJNJO:@{0@[rؽs'K֮:@{q@8~dϞdf…dΜS'#X7 ձcɮ]VTIeR__`A9fTZ@ø[mޜYSK/U d pVrubӓk.@+R@@eK2eJyߨ:Ւ#G+y˗VP?9Y>Jz+9u*>TL6#Xݕ+ɫ&|%kVzq@]?,Y<|22|ߒ={˚ 9sN@`ݸlPFKvb]) L'[iӒdªP%#XLGddbW Hz7 /|:::QQ"'snٙ'&$4wy'mtt4 ZVu˗/g/\u2<\{%MjUՉ&_{vG0!j䗿L-Kf(#WJ'?AYsgr\2kVթhDL_O^{-v<2m[ՉhdN@xj}}ɂwS>| O+Y.yҥk_:O#9s&9z49xЫ<>68lTN@NNV:VK~R8fN~{Ձɾ}@2sfթhVFTW7o&ƍU'9&/^T> s~ڼ9Y^:wVrubӓk.K I\eK2eJyߨ:@Ւ#G+y˗&d+yԩdSʌ`+WW_M> K֮: @:~@ ~=yڵmU'O% !Ʀ4dݺWKN@};HΜIM9Ah2ɦMÇɊU'g Ij^ eŮ@Q@X:p ٷ/Hfά:<9#X ղbͤ7ٸD4dѢ@S@ejd͚dܪS3`n*[.^Lzz{u( d` ٲ%2%9{6YD0`4Z-9r$Y27U>hE @d:L^u*F*tJ$}}ڵU'"Ǐ'K$?(dϞdf…dΜS@}7 ձcɮ]V^:9y2ٺ56-L.:ԟ,IQݝ^,^\V*+' ݤ3/%9~hc $.=ƒ'UN`j/,[̘QF( 4>eΝɹsɬYUa `\ZrZydp۶@q0 АFx$]]ɺu+$.%W ,tvё9=LNNV:4#XOVK~R8f.+vx| c+#W$%̙Ub 1\ZV޼&7Vۛ,ZT~V>Y( 2nysfMrb2wnթn-W/&==޽VDP@@eK2eJrltiՉuZrHre2o^Y|R@&']]ԩdS@1+Wʊ;wdڪ@rǓ%KS&{={˚ 9sNvnH6l(Wǎ%vY mddڴdp0YD^`mѣ;Y:YU>-ݤ3/%9_ ҆}ĉdժ@{ hIZ`lY2cFR>z rǓ;ݻ;sYN$F}KJ(IDATszyڵmU'e% !4CuW^I.]Jϯ:I`M#9s&9z49xЫi?lܘ<|>XQu"N$˗'g4h*ccejd߾d` 9T24Wˊݛ72~4' @SM-*+Ьݿ8lޜY\̝[u*i֭[ɦMt${Z N@eK2eJrltiՉ` h(ZrHre2o^Y|@P@1:_tuSӫNL$#X@Crؽs'K֮:0;~) @eKIo/kv/\H̩:0`q#ٰ^;e.'[iӒdªb GddbWwΤÇ|nxKNHV:PIS ˖%3f+ڛLdǎddܹd֬SU3L˫׮Gm:(/Y )) x 9t(Y.KN4#X3};HΜIM9?lܘ<|>XQu"J$˗'/XV*Q@'66VFOK{/9T@30'dd͚ܹU,3ݺlڔ\X.k.S $[$S$g&KVhvFVKIVL++v`"( nj&']]ԩdSwWw$[.L$' @dɒdddD&m޽dϞdf…dΜS7 O~;ٹӊ]`r) ЦNLnMdp0YD@;0mѣ;Y:YP>zqҀ|ͼ tttTVqnٙrpy睼;ъҴ/jZ!(._ ddd$/rqh1LJ&MT_{v}BՒcǒe˒3ȕTE6>ؑ]6\;̚Uu*-km۪NZR__l5> )@P@ )СdݺN.]Jϯ:@c0#9s&9z49xЫL r|qcartbEՉ,xFZӓ,_brixccejd߾3Nи`Szؽy3-W|6' z{Eaq) OH6oN֬){̝[u*a ӭ[ɦMŋ޽V<)@eK2eJrltiՉ, ZrHre2o^Y|<=>h~}U~NJO:@s3ʕbΝw˅sǏ'K$S&##DR@?ܻٓl^^̙Su*b ܸlؐ~ΝVLwduk/%ɂU'h]Fh[%徇0ЖM:;RBNS&B.=>_};U'h6jرdٲdƌP_ ma|<ٱ#ٽl:w.WN~`_/_VܶD -lO) Cuo;t)?Tܾtt$g&?Y{Q( 瓍ӧ˫N?3EKՒR8^|U>B+#W'?Q{̙U]ZV޼+VoohQ`><|4s~r@ysvmycܪS8`TnJ6mJ.^L~?b( 4d˖dʔҥU'Ijɑ#ʕɼyeŮМh~}U~NJO:O ʕbΝw5kNrBC:~xR kt4Y>*?N%ӧW fdtJY{Nɚ5U'9S?,Y<|22|{={˅9sN@+0ܸlؐ~ΝV0qdK_J N@1E=Jի˝ݽtv&><0I66<\{|awN@ jɱcɲeɌUszP@xcG{wpu\T va\^^5v<2m[Չh7N@D__pa9R>JH6oN֮-{̝[u*tFԭ[x %EZ @S@@eK2eJycҪ1Djȑdd޼bW( Mbt4yդ:L^u*x2 Hr%Y^nW_KթhvNh֨kwxdIHfMՉhCM[^AsP@Խ{o$۷ 'sT -X dNvb֠4_OM NGi _$g_Ϳ[9|P\F[^QW^Mo}VժA:׿unZu4> W/~U_ǬZ*_򗫎ӔnFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.!t9үIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/2.0.x/test_succeeds.png0000644000175100001710000004211214266763645022373 0ustar00runnerdockerPNG  IHDR XvpsBIT|d pHYsaa?i IDATxpxUD;5;jPF 6L,@ `őޱNgvLNbVgunt*S`MBbKg l b:d_ɹ|l|d&:"Ő$IuI$I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $Iҏ[nk믿ロW^ye@qկ2rH ٳimmsjI$)$v{=ʢ,X~~޾>~~cqYf­ޚ$I\bC^&Mĉ'x7u555 /cǸۘ7o=\"K$II+9~y_d,Zk#GZN<晴$IRҲϻ˿i&nʽ{y78q"C|ڻ8Ȓ$IRRǣ>ȑ#ۿ[֭[… yꩧ=Gno%$I ~k׮%??~z{{9uy>ફ'$I, 1~xƏ>}Gnn.\q~W_='Nsywo>I$)|ܹs룎, !??+Vp>57pGuΟ_WWGii$IR?eQHITWW9sw羚#k7|3~o -#<¦M 5~=|+WQYYzt, ȨQ>ӧꫯ泟,N57nC)ɋ/K/t9 ./ЇcW~;'N_M:kĈ)!]S3w/PYyz+V뿸y~oOO\{[omtR~ߝ}zoo/$I4P==æMpUX@QTTĿ//tvv2|p&MDee% ,8^y啼8հdIԉҋ_l–-[>__GqH'Ix29a„D(e#(CDwM(/<ط/HVDwM/aFX7  $I2֞=PPc̚u$I2N,UU0s&r Z>"IF֬ xuʊ:UpK$I x0~D$I+\0on|D"Iv4<1~|ԩ2#X$IJ[x46KVb7jI$z(.Ca.6-DG$Ifb@9s ;;ص|$ $IFW,Z?0jTԩ$IRZؿ?=v ^~rsNx"I@N --df$IR:y~|0lڻƍ:,I$vW7MI$:aphhɓNrK$I)**`<:5ص|O@$I:;4~TT 0ķSD$IIo߾p`V;7DTvFI$%X,\0[[-"IKŠl cDJ,I$%CՁP] KDHI$%ڰn, $IJ g@y9 Q`sK$I~Kظ֭"IH ;vYQ'R<9%IHbPU3gرaŮ#Y@$IpajX!++TJG$IPmmp0Ԅ+eO@$I055p]fG&H$)NG"җ Ə:$I⪣#p|*Wf2 $I⦾aPص M:$I],(8gdgD$I -av5*TJ`I$iV;`Aԉl<$IҠO ' ˇg$Ie9y~|0lڻƍ:#X$Id퐟F6o]H$ ÇCCLu"G$ItQ̓SÊ]ˇI$ Xg'ӏ ذ.D$Io_{u+̝u""$I+ ̿@Vˇ.D$IKŠl cDJ,I$С0ruTWÒ%Q'R:D$IS[6[>46Z>4x, $I:(/<=;\<0!TJ'`I$ ?JJa:jg$I{@AŽ0kVԉ$I`TU̙0vlXkPI4p$<0<`vw/u*$IJq퐟F6o]e$IJauu/'GH:?G$IRP_TTy0ujXkP*D$)tvBii8 `o++EX@$IRȾ}{֭0wnԉcW$IJX`/ Z>, $II.+`2ؽƌ:ti$IJb<հdIԉ $IR zz`$IJ2g@y9 Q#X$IIQ();aFXΧ+X@$IĞ=PPc̚u"i9%IX `L;6ص|(]Y@$I"F֬իN%ŏ#X$Iik +v0~%;O@$I"PSSϛ-I:}֮"ͅ&?>TR8%I x46KVbW"IP\ C®]0mZԉh8%IGTVœ9VZ>, $Iqcv5*TR$IÊcǠ,:<$IdՐÆAKCsIAr$<0mW{¸qQ#X$IͰ|+vX@$I.S]|0|844Q'#X$I**`<:5ص|H $I%pQQ6ڕ."It ={nsN${$Ib(j.D$izz`RX-ݻa̘SI,I 8t(<%KN$.O@$IΣ6lFˇt, $I8s!/f'L:$I GBI 7ºu>\,I?g@o/fEHJ/`I$VVU̙0vlXkD$e0rf ^ u*)=9%I2Z[[X{0Ԅ+I $IX550eJ!%D$eӧaZ(*\hjN%eG$IRFţ1\:_R"Y@$IRƨb:viӢN$eG̪U;6l7t8p߻e~?y$I)J3Ê]ˇ O@QYYICCy睼;q"&Lw]~ӟ^g̛7ɓ'3$IÊcǠ,:$G1}[o;{'Irr`0hi|H2@XGrgϞu]5\ 8x`J$'ᇡ,lڻƍ:95@?'<]s5}:x J,IRio0zy3,_])X@7_:ӦM_[XXHaacܹ}|;?aJ_á)%'G.wgĈ\y k3f̘ԩSyP0oLVZ> ytuu1o<?ݻʺu7~@_#0bĈVRRBII%%IJGPZN?**`۫$?VnW]u*Iҏ_++ H/~n+_ O<G[fIݡC .Yu"IX,:g [ZZ"Iҟ 9^z &L:2v"I֙3P^yy0{vxnR#X$))= %%s'lTs)X@$IRٳ vYN$i8%IF,UU0s&VZ>b$II;\YWC}=deEJ`sK$E-=|jj $ITM L>on|H"I"q4] EE MM0~|ԩ$ś#X$)::Bhl WrŮ), $)롸]`ڴIJ$G$IRBbPY s@vvXk2D$]W,ZׇaԨSI#X$)+vZX D $IjɁaà!"IIxa(+ ۮqN%)8%IU{;ѫ͛arWJoI4hmŋaphhɓN$)8%I.[_TT0ujXkO@$IeR %d["I.Yss [ܹQ'|B$]X,\01F#WIa$I.+`2ؽƌ:T$ICS \$DR' $i@jkaҤphti, $Μr˃{}`„SIJU`Is:zJJ`Nظ֭.D$k((^رf͊:t$IX `L;6ص|H,ItVwwZVzʊ:t$I-=|jj$ 6O@$I550eJ!)~, $eS`Z(*\hjN%)9%IRP:`*WJ? $IaPص M:L$I$J3Ê]ˇDH!`BX>|lFEJRqK X{‚Q'<$)UWCN --IѲHN+,ݻƍ:L$IiͰ|+v%% $Iif6X<9D$)MAE̟SII@g'B]](!6f, $pߣnsN$I{#$X,\01F#WI"IR 遥Ka X v1cN%I$I)СTC,:$ ' $Z4)46Z>$ $I)(/<ط&L:$]\R검H쁂;`֬IqK$AU̜ cdžI"IR#WkP_YYQ$II-=|jj$O@$IJ550eJ!)=Y@$IةSv-An.45QpKut@aa(UUj+v%7 $Ib:4$, $]XVe`n3&T$:j~`x%Q' $I&M ' C.D:s!/;:$G$IGva:j.I"Id5+D$b13aXx ˇ$]. $I#WkP_YYQ$I-=|jj$ipx"Iҟ)SMMIlIS`Z(*P>n=T~$e(, VrŮ$ŋD롸 >=D$eX *+aΆVˇ$%Dq`BXoQN%I,IRFٿ?=v jkaIRfD1!' ˇ$E"IJ{'NʕPV EJ2#XajfX% $)mm'GH$)AE̟SIJHJg'B]|ona$pߣnsN$IK'$IJy<4̘G+ˇ$%' $)C5˖0fLԩ$I$)e:j~`x%Q'$]' T[ &_!I"IJ)gwFJ4P`IRѣPR;wƍnO5Tc$(, ' ;vYQ'$] G$II-?c7,, F֮իN%I`IR[[X{0@AAԉ$IIRҩ)SMMIJ'IR8u*[Ann(u*I`rK::–&U\+I"I\}=СӧGH/`UVqw0l0n& 9p|_eȑ 6ٳgԒzb19s ;Z[-<Gee% pw;SO1qD~_}7 =_=?5k---z HR:~zjk+:$), 7s='>񉳯1aӟ/g^x(,,n'瞋{~IJvâE,Xu"IR8Տӧ|zq{_|EF͢Eξ6rH ɓq,Irrk!I2@XGrןx &NȐ!gH$)ݜ8+WBYYXw/u*IRY@g?9 7?|ߎK>IJf?'7Ï W_u*IR2o&_י6meee>c<璔ImŋaphhɓNL9 IDAT$I' ;p3b^|E{'N8璔 χSÊ]ˇ$b޼y?~ݻwu8r^Gy#F|䵒JJJ\ PWO<byQa9'Nˁxg?;>ݻEFn M61qK.IQjn|[aܨIҥ V&MQQ{ /0mڴ~ȑ#曜>}k=z^zk./tOÌ0zt|H' xGyO,o7|3 HNNK.w'RQQ迊$%DO$Ic r\ eea޽0n\ԩ$I,I퐟F6o]+IJ< $em`b>`I2#XχSÊ]ˇ$)JHRRo-NY@$) 57ݰu+̝u"I 4OÌ0zt|HDDO$I"I v\ eea޽0n\ԩ$IJ G$)!??^m ˗bWY, ۶0|844Q'$)8냊 ?N +v-L $Qg'B]](!6$e0 $Iss [ܹQ'$)z'I,3`0re$)H 遇 kv-ݻa̘SI<Ar<<2dIԉ$IJ>H I HcCsHe8s֯<ط&L:$I,IDGBI 7ºu>\ H%hhB;`֬I رaŮCHuwkajSIZhk +v((:$II2%|l$rX@$N VEE MM0~|ԩ$IJm`IR?::–&U\+I`H_b:viӢN$IRpKX *+a+v-$ . $]]p!_>oQN%IRqKRۿ?=v jkaI<Ѫ!' ˇ$IfN+,ݻƍ:$I,IͰ|+v%IJ m,^ ÇCCLu"I2#X2B_TT0ujXk$)<:;B ٰ$IHJkGw7l sFH{R,.ϘG+ˇ$IѳHJ;==t)X˖0fLԩ$I8%):j~`x%Q'$IIi&M ' IDR;s!/ N%Iv(Νq#[S%IJfI)k((^رf͊:$IG$X `L;6ص|H, RJwwZVzʊ:$I(G$ba W$)x")%)fˇ$I"):kBQBSu*It::0*X$: T_0t(ӦEH$ G$%X *+a+v-$  cv5*T$i09%))V;`Aԉ$IR\$" ;vYQ'$I,I$*9n%ص|H HhajX^N%IR#X.J[[X{0Ԅ+IDҀ)ysC$]< :u ֮" ?>T$)9%::¥U\+I.D9Cq1  viQ'$Is'_"W\-[[l+wމopibPY s@vvXk$Isxwy'馛;~_^x';vG^ԧ>5H ꂲ2o~|2T$)]X@nȑ#|ӟf߾}L2ƼyL{X>$IRx@7x#/u<#Fk%%%+2Dg'B]](!6߆$_?ڱc>u*---|_Ld,o7|3ӧO<'OfĈoo~Quzzk_gMફN%I2<K/K/PZZ{***۷on|+<=:!٥CS \$D$IpE,EB3---eQॗ`„I)9吗 Y>$IRrqKJGBI 7ºu>\$% 쁂;`֬I$,)bPU3g-@kC$%7 ՚5z5:deEJ$RP[[X{0Ԅ+IT bjj`ʔp!IRDJNڵPTGJ$8%(,p|*WJd\}=СkLu"IKb19s ;;ص|HTgPW,\ׇaԨSI$]>G$X{rp.I.<Hu5ab$I"%'aJ(+ kvqN%I4"3eؕ$I"Eh6X`ҤI$ŗ#XRχS}ˇ$IH PWJȆ 0ķ$IRH {~ᄄI$%J 0cF,$)Y@8遥KaŊjn3&T$IpKCS \$D$IDڰ٪-$I`ݙ3P^yypーoLu*I4ع6nu|$IҟHd((^رf͊:$IRqKLTU̙p-j$I: t՚5z5:deEJ$)y9%]ba W$I:?O@KPSS ͖IH)X 77\$I=PPc̜u"I$% G4hb1 [Š]ˇ$ID;\Y됕u*I$%GtŠÇ&_I$IDL ̛-$I:? .ɩSv-GJ$I,](,&$I .J}=СӦEH$I, H,0gdgI$], . .0jTԩ$IyV;/ Q'$IR*DT] 99pb$I峀cN+,\8߳ƍ:$Iҁ#Xvχy-sŮ$IDgmuACLu"I$GD_TTGKC$I HR %db-$IRX@2XssaN$It{(͛a =:g޾&m.=WǎI `-"zyO!>pdhi22\G@  ޽ҦMK? }wb)X ؅ Җ-ҷJSOTsd:~\ڼYZ[@Wp ւcҫmnK Nz ǥo]?@tun{t+z)3uF2]"UUIƍ{yg)XԹs.TY-vp#CGH?,p 4U]]EEE)((H TEEbbb>~篱_ɑwޑ}W K 8Y,I롡g#RT&{_JaaaS^122~}*d.>޹АϷw}.c^"AZZ; +<<\S￯i pR-vIRIIuAHr=ذIEEES^"Iںui{ duuutߵ>!Iڽ{"##w^566WIII\dڵھ}~EGG7^x@} 0]*))IgΜQ^^>)H_={O>Pff^z%eddT=p!0 "` N}Y%$$(,,LYYYꫯ<;88 (""ByyyӚm544(((hʟ~*|3<amҥ*jjjUVѣe8fejkk͛u=_uuuJOOw}+WN6 ݐdֺldggϸ?6$MMM/K.5lⷚ1?k$fL,###n7 0l6!ɨh/ טmT[[t:'uwwغu{i,?knnVpp***kڱcN8gθ766VYVtv/L,Eqqql7|鵫10uo+Vkƽ4@ɓJMMՒ%K&YF?θ7==}^|8kdkƍKXܘm0 a.\Lv'?pb_U^^_]3f,ˤP؋Ǘ~ZZ_oڴIZ~ۧzk ƢlYm4!IDATӧOR*++4q¦ua3{?KKKSww g٩I{Õ:cצo)&&fN1h6LeddDEEEˣ}4@DzkNSҲe$Rӧuʕ {/\Ԥ)7K矓>/PGG _<,fl/FGGUZZ'NIS67 0]BgZu!=䓺ب^Z~$۫$I? 999'<=eee$wK;v7|nDWLkiiiFddb$&&;w4MOnVCҔ?l\m1i{.3G@k@4!0 i LC`@4!0 i LC`@4!0 i LC`@4!0 i LC`@4!0 i LC`7}IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/2.0.x/test_tolerance.png0000644000175100001710000004065414266763645022562 0ustar00runnerdockerPNG  IHDR XvpsBIT|d pHYsaa?i IDATxkl}!BH PS&ʨAcEVJ ,p(&T3`%pR&2qJDVb/̄pk`0w/M?n]~וQ___$I$A$I$ $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I $IH$I -OѳgOq=ڨL6]O}~TVV8$I2CH4=c|K_(..ܹs;k׮]//9|07:t8~%$IRb8p m۶~ߦ_~?[6;vOꫯcv<$I<H<7xGy/ .4$I  Y?#˖-0tЛwj/򵵵W^{-IuE?Έ#ƴno3gdm?ŋ\j߾o/~ &Nؼ$I[2a„1}өS'~Ӻu~˥Kn_ /4= c(EpSTbϿUUUL8m{8{,#G?WgݻSSSsO| _Gibjq:ubfZ}5Ň)\o:7?f̘1=zɟI^׿*++v 8@x衇bWƱcx1Hx'ؿ?*z+W\cSZZzZmm-*7V_SBnbE4D -̛7;wo|>~rP_~w}c=Ɵٟo#G\իW/Ej&ؽvi$Ir (++߿ݝZn~3ϟ}.^ȠAؼy3cY[999#(y0i~)^^OBO 0CyNR7~y.HRlZ9$5[ii}Ct{B$5˙30s&LJN#IJtIR֬޽C$3W$)]0ho.]B$֜HR 8sf΄1c`i$IjDR3 PRH0W$)ɕƍa:$ID0m HtgN@$)=TWGh[J$`$u [:$Ie._)S;7tI $%矇#GorIRq"II / $I"II.Z+:.IRqp/II^C$9$qOСH4IJ0c<\:$IM $%[ AǎHtN@$):s@N:$Ic7{6dd@QQ$$5+XW`5tI $%g;^&N#IR˰HRZ0*!G+X$W$)_=C$8s"L CSON#IRr"I fٲ;wB+&$iRY V%ЧO4$< $%W!7 B$)6\f > @۶HN@$)= KB~> :$Ic]zգGt]T $Kw/CH[N@$)'a|2FسHR у33ai$IW$); JKC$)>HROC^cdžN#IRX@$)|rC'$), 8wK.eȑtܙ 6o:tѣGEff&_җO]]]BKJ v-v-deN#IR|Y@P[[˲e˨:t??|e͚5ݛٳg3w% >OGɓC$)<ހݻSSSCVV 4ѯݰa{sL>aÆyfbYR{Y^i$I?' h׮YM܍oKnkӽ{wޖ') XzF0, 1|L>*N8)--e…I %ͅAC$)Wb`ԩ6l?[3fN')+wZFp, 1кuk>1bƏOٶmyyydeeo~ϧSN7\!'''%țoBa!,ZN#Ijm۶m۶={6PԑQ___:DM܈֬\"~m233_WѣG9qssd:tGy%Ipk:$9y<%%% >0f9~x`⮨**?|Hxo+WpxGcx1ESIdizࡇ__8}kuuuر}s!Jz:uKo?j8y$yyytԉ^~e}]z… 8q"ʴiӸ{ٶmbi&ԗ$)N6mݻa.mLIҚ6V^͉'R&Nxӝ>1a|A Yjo???x^) y0i:$Ir9,yf6o|#F0Ÿ<4kik׆N"IRⱀHR *->o.]B$)x]Zș30s&LJN#IRbHR ypJJ ##tI+XaFذzFDy6 i$IJlN@${g~mIn"Ip [:$I$._)S;7tIIj矇#GoSI $5AU,_ DI8IKuuU^tIx. H]*)_={}i$IJ.N@$.80th4$% $5R}=̘<+WN#IRrrKiaeeбc4$%'' N9GN#IRHR#̞ PT:$I,I2xزv FDnWF H, t F%dhK$5+XԀ={гg4$' t /ԩ0d :$I"Ik]zKpK^{:tFDR;yχ)S`i$IJmIi>z`f&^:$I,Iim(+Ri$IJ}N@$ӧ!/ƍcC$)=X@$|rC'$)}%)-[ƍ:$I G0}:<(L:$I P[ H^, љ5kwi$IJ?`IJ.An. O?:$I bTVB֡HHJ o PPN#IRHJyuuUv6,Z:$I,I)**`>h.tIқI)1X`i$IDRʪS[$I ,I)k&ؽvi$I8jj`<4 FF$}")%͚mڵH SZ}l]N#I~I)9ƌC$I")< \%%:$IC`IJq#l=zN#In p :$IjiI ڵW=zD%IRqKRx%ػˡCi$IR,8Na> yy0n:$I5 (.D$ŃΝcҥ9Ν;͛/ԩw ` ,%]`XB$I`i@mm-˖-~_i&ѦMUV1tP~ |>OGɓC$I!tޝ`РA~Ǚ9s&yyy0}jk ##tI/N@Ю];~zXr>w-OJjGg>/޽C$Id_Ӈgw]taɒ%\v-t<)K 7 F$ś+X1oӺuko`~aJKKY|9W^0tD)+wZF$ś$Ν;ǵkXr%w7n|EEE,ZөS䐓R&¢EЯ_4$޶mضm Ξ=(M가o* 999ڵ7xC6^xGy$1V"IR 0 Pg>?w 3g=ZQTTڅN#IB'޻zuu5]v{&)c`b˃C$I!Y@z+W\Ok׮i&:wNiNnݢ$)y6O.8y$yyytԉ^~e}]zWWR[[?O~ 6M`nص 23C$IY@nc՜8qKKK)--`ĉ7ݩ'?al߾͛7[2a„dAM ̛&HDQ#'wU8twRJ7~+.]B$yHcvˇ$IKjqg̙0f :$IJ$I-g()i$IR"qKR*/a#tIhHj1ôi0lN#II-砺:zG+ސ$I`"u렰C$I(%50e sN#IIpTT="In fah"It;IMVW^@$I%$5YI :ۇN#IIMrOСHdata xX2tIL\t׶n6XV;N#IIw)3rr`i$IRH+gCFN"I+X ^yl]C$I F9{6ըQ0aB4$)YY@$5…Q Y>Z$Ij W$ў=QxE3tI̜HaT2z*tI윀Heˢ |B$5?NHjPe%ZK@>HT`tKWBn. N#IR+Xni8|mC$I = KB~> :$IJ%I7v-UtI  СC4$)8tɓ0>LÇN#IRDу33ai$IRrK;v@YN#IRI> yy0n:$IJeIÕ+P\:$IJu`Iin.ز6ni$IRs">Gai$IR:p"gZx5F$ |Y{N#I҅+XRt rsa xi$IR:q"+wZF$' RyM(,/tIn, RVaѢi$IR:rKJ#EEPQAvHtDJǎŐN#IҕDJ0u*t@$I ,) lwî]:$IJgN@WSI0bD4$)Y@7kik׆N"I JKۡKi$IH)9ƌC$IX@3p@FF4$IWT^7† УG4$IDJ1ôi0lN#It#' Ry9ʷ$IRH)AX !;;tI"._)S;7tI[s"矇#Gْ$)A9R@U,_ DIDe\]]zիWt]$)!%xuسڷF$HI (('CC$I3 a xX2tIqKJR[F,+C$Ij' R:u ́=:tIƳHIhlȀI$I+XR)+W^-[ki$I)=j(0ܓc IDAT!tIg…Q Y>Z$IJ6`IIbϞx":$IR8ŋ0u* O=:$IR9eSwVm I?H V%KOi$I"%W!7 B$Ij>Wf > @۶H$5)A= KB~> :$IR˰H ڵW=zD%IR+XRz%ػˡCi$IZ)< Ô)0|x4$I-"%Azu4$I-,)eePZ :$IRs"%ӧ!/ƍcC$I (.D$)v, 8wK.eȑtܙ 6oܤ?+77 Fݲ!2v-[`Z F$)v, eٲeTUU79t/2۷otJ%}ӧãɡH$Ŗн{wjjjʢAQ__O^^&M<) }jk ##tIrҀvڑ]-[XR)XzF$), 1GpB-Z"t AӡH$Ň+X1l2ڷoO~~~(JP+V;@e%n:$IR|X@bѣm6ڵkwׯϧSN7\!''"*7߄BX F$ʶmضm Ξ=(M가9s9ڴi>oڴi|g_b Nnݢ$Ir|TWWPVVɓ'ˣSN/ҫW/zIϞ=o̙ç?iokPش v] 33tI0, zjN8qץ0qěT%5̓I`Ĉi$I±"o͛ټysYJ]fA6vm$$IaY@+->o.]B$I UR*;sf΄1c`i$I³H13p@FF4$IṂ%Hy9l6@H$%' R ?Ӧa:$IRp"sAuȕV|I, R ;x֭BF$)ެԂ._)S;7tIDjA?G@E$InDj!UU|9,XM@$It3 ի^$I5DPR{@H$%.' R380th4$I"5C}=̘<+WN#I\aaeeбc4$I DN9GN#I, R͞ PT:$IRpKj2xزv F$)y8ٳF B$IJ..-\,I$5+X]س'*/={N#I|Ht"L CSON#IHlY;]$I1JjJX ,>}B$IJ^^\,F$)%5p08mۆN#IܜHq(,] 0p`4$I"5ڵW=zD%I|`I x%ػˡCi$IRNa>(;C^ :$IRz(ԩЭ[t]$I ʦM{7H$' J550oL#FN#I, JfA6vm$$I,cv%tID)9ƌC$IJog 22B$IJo`)ƍa:$I(e?Ӧa:$I RsAuȕVVmI`QJ:x֭BF$I}a˗a F$I RÑ#PQ.IP(TU`A4$IRb(eEWzE%Ix\PQ()_={}i$It+N@NxI:4tI$5W_3fʕH$v\Rۺ5z`Yt:$In کS0gѡH$N, JjgCFN"IpKI ^yl]C$IRc8QR:{6ըQ0aB4$Ij, …Q Y>Z$IRrpKIgϞx":$I%aT2z*tI$-' J*˖EO=߹ZY%I?)iTVªUd :$Ip*B߾`A4$Ij*W֬Çh6tI$5%GaRχC$IRsX@Ю]zգGt]$I,%^{:tF$ID I?LC$IRK(!ḠիC$IRKqK i(+Ri$IR(> yy0n:$IZD '?\I$I, 8wK.eȑtܙ 6oܨז|z:лworssmklkBVV4$Ijii@mm-˖-gϞǓͱc(..?)'[#>}&OF$I`i@ݩ!++  ׮]U Fɰa(..f屈}jk ##tI$łڵkbСֹsg-%XzF$I89wΝ %\0h|????N:p-''XE 7-~B$Im۶m۶={6Pazcү_?~45/TVªUd :$IDv*B߾`A4$IJF`֬Çh6tI$%#' jGaRχC$IR莮]zգGt]$Ij*WtG/{By9t:$Iɓ0>LÇN#IdgQ ffաH$)eePZ :$IRӐرH$)UX@tKp N"IT nkl7BVV4$IJ%N@t>Gai$Ij> k:$IRDXzF$I,p AӡH$)U9+V;@e%n:$IRPXЯ_4$IJe4WW^egâEH$)չ把vB$IRsƎŋ!/F$IaT-:.I$Ń+Xij&ؽvi$I.7&M#B$IR:YMX6tI$WLii};t:$Iҍ4r ̜ cH$)Y@3 PRH$)&aFذzF$I H8Ma 77tI$3' i砺:zG++$Ia:(,i$I|?<] S@0wn4$IpTT=/-I$EUU`A4$I$EWzE%IDbN *)_={}i$IqbNxI:4tI$FR_3fʕH$I7s+l=l :v F$Iq̙990zt4$IҭY@RِEEH$I s++-еk4$IRÜ$g;^&N#I$ݞ$-\,I$)쉊Nj/BϞH$Iw$I]S!SH$I$I-[=|Nhe$IRG$TY V%ЧO4$IRY@ի }‚H$Iw$f > @۶H$Iw H9z.|80tI$Y@ĵk]zK$I$Kw/CH$IM$ < Ô)0|x4$IRY@\}}LX:tI$y\Jp;v@YN#I$5v4q0vl4$IRY@X~>\šH$I-ҀsαtRFIΝ`͍~~ȴiڵ+ԧWJeee_klkBVVm:҄kפ`i@mm-˖-~^{5Yf:u|+w|0}:<(L/@Vx{MJBo@ݩ!++  ?fȄ bM$Iy<k׮ptЁz(P2I$)D]q!CT0!'5'D1 uR7h:N4tm$Zm)Zs+%8a:§?ݺ8;/=2@.Kuuuo@n[ǎ577R"`D}$髯ҟ)Iڼyvvڥ 544(%%EsW_կ)Sz}ݡ:`EcP1\ƍD/m߾]_|<u-\ТKpuc~aokĉܬeffjŊ;v233[np(>>^qqqZb]6GGEggvءiӦk󎢢z|޽{ڽ{4i$EEE[[[qF%$$hܸq h V^^pmRcccx Ljt:i&=37np8^i, ?֭[r-]TOVvvvݻ\ݽ{Wobbbt!䨶V'O(0k^?~o;:::bknn֞={yn-[L/_}.YD.\Pjjj Lj3^ڳgx A}ZWֳ>Fh駟4gΜ^粦 jjj$~ߘ1O>s}$s9ؕ+WLttٵkWj4^۽{d]&rcq:F)++#GI7vo^ypl VVVf$ (6~cffڵ}eM `YUUqFؘ1c~z={V7osnzz}cO?^x=z4ucHyc&íaJLL inUUNUVp8_|+"@z5Qh"=o,55Usѕ+W˚<H]tIfR\\xFF$6noZ/#Vo3f̐nׄ n:Ԋv%-X@Fedd5@*..N6M˗/իW$nM2XӂG 3˥1#~E!Ed פMشi>CUUUiÆ :r䈞yfD* ͦb:~|M!Y]]^ueee}Yӂ0;vlk:::|6ORHsBެYF>k{Fvv233Y+ۭe˖n kZ a$c;c7i$97>DP{/ӧOWKKˀk-  {ڪ'Nk=bM $ϟdԨQ;wΟ?㻚͘1ƈlZo1~F@z؋/^TwwxMMl6f͚5D!R\v =ttth媯_ٳgkkZ aVPP.}GN)33SӧO$1t~MNի9鵦^iiHs\}cr:voYx-5Zoх X৫K:s*++p?ִex9?~\ofΜ ;wN'Oŋ%IK,?v]۶mSLL<.jl6jܹ3f~G}g7oeن0UoViiVZ4I͛eU\\ 544(%%El/~o qΟ?zj Q4-\Pv]/^'|$9NM:u ֭[{)??^֭$ִ2t@l۶$&&XnN8ONN qMSPP`K/d^jUaB 6ٳg &3sLcfeaq#)ৡcLQQ߶WKKY~7xc_ꫯү_Kwӧ|$I, ϼ~]UU]tcGI>I$)X@7`ʔ) 8~mMMWZn}$IR&tD{}llB˖-뮻3g\vO?;v{~$I¨СC : WuezTWW3l0N8o[n/3+V@e%XS|xr], W裏/rG]v kR &L}aƌi$I $Q,$H,ٳI"IjU %Ij 璤Y v;ui$I $ > C0hP4df$+ai$I,IR6ll ڶ F윀H0}:HRDTi #B'$ W$IWTV?CNHRIex5l:$)X@$I3'ZBV`I\\$]bǎhx-tIRq"I&N;FH.??z_D%IHK'gi$I"I9˃^`i$I,I˗þ}g\{m4TD܁0o@HRDw5z$I $g;a6h&tIR:p"Ii5 &L!CB$ $H$z,X,tIR:qKPVЮ]4tḊB~> :$)X@$)ٳP\:$)%IidVX֮ΝC$#' &Nɓai$I $cॗ ##tIRHRx5˗CHҙ+XΜ<0y$tIRs"I)nBx--C$;' ^-B;tI, jkW990wn4$E%I)a. F(' '|80tI"I)&ᦛKH\nl[BVV4$] $*xQx:4tI.g2u*j+VN"Iҕ%I)4it:$IWDR0e GN#IR, f΄ӧa*F%IIn6X֬]C$~N@$)} LC^^4$}1' Ğz /)ID޽r%,Z99H0^&II`fFs"IIhؿ%II $%JXfώN@$IJ&IJ"իݣKlKRY v;ui$Ij<' $Bx!4(tI"II ai$Ij:W$) l`Ym:$IMD鐛 ÇN#IձHR6 22(tI+Xaz)tIIJPw6 Ǝ Fa5gN^]$)%I hǎhx-tIIJ0550q"y'W]F/@$)%I=, ۶A6H[N@$)#G`,0 FسHR HFYYlY4$Ň+XPVЮ]4$Ň::uyq=СC222())i Çsdee6v%%?|9/tIRcǎ1|*++ӧO}WַšCxX|9=z`ڴi̘1#F%%8{C'$)\C.]sΔ3`fvIcZnM?Yҥ ]w]3Nɓai$I? H |;?fTVVraV^Mii)I 1X22B$)\'a͚5?e˖N')_^|9:$IaX@be˖z :ѣGӺuk6nH~~>;w~舒˃GB$) H ,^"|M3f wuSLa\stp!TT@˖HU2dq#1c_r}ɱ\rsscWRl:,ZsBޡHjƍlܸcՁҤ H Wٳg8w\?/&$Wmmt*''Z@$IJ/WTTpJ|TUUoq\vm;~cl޼n[o5DTIAy9g:$I9Gqq1'NѣqΦ{~ݻ0gƍ7M&Mu]ƍyWX`Z #I' ? F`Dze8|RZZ q.Nケcr7h".]WV^ɓ]RXL7]$EY@qС/JJJ.;>tP$%u`vغ($IJk^"Iͬ }x|BKY@$M ZHx\fTZش :v FD0e GN#IRbHR39NU ##tI+X mka5tIIJ|&:$I $]Gh:$"IWa^X-i$IJ|V'IMg0a 3fN#IRrp"IMd pϦ$5IjJXfώN@$IRX@$jkWݻG/@$I Ҁ$5ҪU{7[N#IRrq"Ip0CAH|, @< oN#IRrrKhÆʠmi$IJNN@$>O\>tIҋIi1x%FbV^~9zУG4$W$3g / G FDRXz **ei$IJON@$_EzFejkW990wn4$7W$"(/] 33tIқI)Ax χC$II)+ᦛK\֭aV F$I) }x F$]`NV`ŊI$I繂%)唖F?6mC$IDRJ9~L#`i$IҟHJ)3gӰjddN#I+XRƶmv-Y]N#I '0i  yyH8z /H, ޽r%,Z99H:g0a 3fN#IIImؿ$IJxN@$%JXfώN@$IRⳀHJJիݣK‚j ;v@֡Hr")> C0hP4$1, J$>šHrKRRٰ!z2h6tIXN@$%>!7F$5DRҘ6 22(tIT`IJ ee~=t:$Ij*' ^uu cC$IW")͙-!WGW$IRrKRB۱#ZСCL2|bRJn[v-t:$I' ṳs"Zz5:uH$Ҝw$L w LJN#Iٳ'կ?3n:vȓO>CǓñcf ddN#Ix7iٲ%?я={6} p9-Z:/GXzF$œ$N:Yx1=#G䣏>sr 7N)q #Hxs+:rss/9KMM jXRBXz ~3h2tIoN@b[n7oM7=K^Vhdh̝ {N#IR6nƍ/9V]](M가ΛoɻK-=zN:{O?M~bQUNNHpEE~{DTUUoٳg/~vYn:tATTիi$IR(N@Q\\̉'.N.8rdggSXXs=oM;oEq1/~ ?5k֐__J3O@~> :$I Re˖q.--q]v'`ӦM| 60vظdE$'M7E/@$IRC}הPRRr,V\ʕ+=L֭aV F$5 b }x F$% :Z+B'$I,I1QZش :v F$% ' 0e GN#IDR9NU ##tIH\Ԭmka5tIhHj6|&:$IJDN@$5Gh$ , ޽r%,Z99HDkg з/̘:$IJdN@$]%K`~(/k|V$Ip"TV‚0{vt"IT &^u]$鋸,!Vݻah:tI HjÇz F$% FD}{X8tIL\h6Do6XVmۆN#II0}:Hdc(ӦAFN"I+X ֯NB$I հa0vl4$)YY@$5Ȝ9zutK$)\vgnB$I zĉpáHdDRϏ/YHTQK“OBϞHT`tEA^gN#IR+Xhrطk F$ ' .s̛п4$)X@$]^u]$9%> ;w¶mЦM4$)8tё#0kLCN#IRDHFYYlY4$)U% ͛ JK]i$IRr"?|9/tI, ((g8tI\֭~=] ;N#IR)< 'wHtDJc?ǎK/AFF4$)X@4k>/=B$I,) 9yy0` :$IJW) D"0q"tStIP\u};l YYHtDJqUU0th4$)Y@7u*j+VN"I JK6AǎH$9R0e GN#IeR̙p4ZH$E%m`ZXv F$鏜H)O`$<B$I)<=G _b$I "{aJXrrB$IJ)`fF$ʜH)bؿ-I)TV‚0{vt"I, R^u]$)!%U`nرZF$~N@$v0CAH$}1 "xAh/F$a\Ԇ ћ A۶H$5) }L0|x4$I gдiEEH$5+XR)+矇Si$I Dx5l:$IRY@$2gN^]$IJ6`IIbǎhx-tIq"%8~8tIs"%w=Eh$)**`RxI3tIcعsz١H$]=W|9{׆N#ItH 7 i$IDJ@Gk$I,)=, ۶A6H$5' R9rf͂ `Ȑi$IDJ HFYYlY4$I,)l eePZ څN#IԩS̛7{:AIIIĉ`R)!?F F$)6, u8vϧ>}4SRRB֭1RQA= šH$Ŏ]tÇt&}H$#<<7 Jna 9tIر!33W/.\LNɓai$Ibˋcɓ/=B$I= H 8p"6nHfff8JPg@^ <:$IR|X@b`ڴi|[bȑ(-\oвe4$Iaif۷og֭rСϝ;GMM Cm۶QPP@vv%rss͍UlâE0w.:$I7qKUWWJ:, =?.ܻ__O3}:O?M~bQFWrrD$%+\QQ(Qj\*[iժC ?e_7i$/}-@R%"(/]K$IRԣ'NpQ8rdggSXXs=oM֭ݺu{M>o`'|80tIcٲe>|KKK)--`ܸq]!'ᦛK$# H=>y]JJJ())iԶnl[BVV4$Ia@JUU0th4$IX@8:Z+B'$I ,)JK6AǎH$Da1FF$)< C3gӰjddN#I+XRlkš5еk4$I |&:$IRp"SOѣ{~K$]d޽r%,Z99H$%_g з/̘:$IRq"5%K`~(/k$IeHͤ,ٳI$]"5U %Ite.H`*ؽv֭C$IJ\N@t0CAH$%6 t"xAh/F$)%] 7,+mC$IJ|N@&>rsai$IDji #B'$IJ`IMPV?CNH$%' R#UWGj0;6tIbiΜh Y:%IsKj;g[i$Ijj`DNxi$IϏ]$I3Jj X|z F$)yY@/pA^0{v4$I, ,_=pH$%7' R=yF$)Y@:?}׫]K$깂%gaNض ڴ F$)585 &L!CB$IJOD" feeH$W?y3Ai)k:$IRjq"}·B~> :$IR걀HSPgBqq$$I,m ڵйs4$I < 'wH$.' pddN#I, J{/cr#tI ڙ3#N#I(-\oвe4$I âEPX{N#I, JKի;7tI RQî]:$IRps <H$ J$'M7E/@$IR|nl[BVV4$I FU<(< :$IRz(mL ZH$/WJK6AǎH$/' JyǏÔ)0b:$IRz(͜ OêU:$IRzsK)m6X֬]C$IO>I`` F$ID)쩧=?ZX%ID)i^X-i$It +|L}ŒH$(,YCy9\#\$)8QJ `D$IQ[]=z$I *JVݰcn:$I RPX=N#IX@"xAh/F$IqKIoÆʠmi$IT' Jj|ӧCn. :$IDIm4ȀI$I`)iЩS4$Ij' JJw6 Ǝ F$I eQR3'ZBV`I$)9cGx< t:$I JM Lw ?:$I ѻ">K$%SҨK'gi$I%s /zٳC$IRS|9{׆N#Irw̛п4$I%zյktI$%7WО}vm۠Mi$It(a9f 0dH4$Ij%H$z,X,tI$5W6o2(-vB$IRsqRSN1o<:t@FF%%% :w۶m=vmڴGQUU)!?F F$I H;֭}7M}裏=z4999CrmF.]|O?M~b.1FWrrD$)\ n@R*UUUQ]]ͭJVOۿ[}]^z%rrrLLEEP^vAff4$I H=9qG#GOvv6 *xQx:4tI$śDq5u*j+VN"I\RܔF?6mC$IRN@ǏÔ)0b:$IB(.f΄ӧa*F$I۶ ֮5kki$I'I0x0N#IМ(z uW$)Y@3{ʕhN#IDkҊ> o_1#tI$% ' %K`~(/k|I$9Q `D$IfU[]=z$Iy.ǨYZwÎкu4$IJ4N@lBx!4(tI$%" E$>šH$)QfaCfeeжm4$IJTN@t>O\> ;w¶mЦM4$IJfN@T#G`,0 F$I:E" feeH$):m eePZ څN#ITDWᇐ#G}N#ITaٳP\:$IR+X֭~=] ;N#ITD8y&OC$IRqK<8;/H$)X@t/GXzF$I,p #H$)U9 [oAEl:$IRhBޡH$)Y@\mmt*' F$I4WTkdfN#IT$<O<0p`4$IJ4ĉpM %Ixp+M[۷֭:$I҅4TU> <CN#ItbICSBVbE$$IJ7`ǦMбc4$IJ7N@0e GN#ItdI#3gӰjddN#It Vض ֮5kki$IO>I`` F$I Hx)8z4zϏVNI$dIq{ʕhN#It)`fF$IrҖ,iI$%' ),ٳI$)X@RPmmt{$IRp1'ZwÎкu4$I9I1Ca!< :$It) H D}{X8tI$r` 7,+mC$I.$E|L0|x4$IҕY@RĴiEEH$Ius+ЩS4$IRݜ$;^ cdžN#I$̉ի+X$IR"s+-<ݺN#I$}1' I&N;F$Ij' Ij]_|ZX#%I$5 UTҥгg4$IRY@̹sz١H$I VY={kC$I H9p̓?tI$, I^u]$IJF`%g;a6h&tI$i$#G`,0 F$Ij: HD7ʂeB$I+X nf(+Rh.tI$8éS7os:t ## &MDN뮻hT?|9?$I, u8vϧ>}4}aԩwÛoSPgBqqcK$IR.]PUUÇYtiݲe /2%%%̛7)S-[2o޼}[azX:wnO oƍ#(MXSXtn_[lo?c:ub̘1̙3'0y2}7ߤǚǚ, 1ꫯү_?Z?wӧ9p@?cf dd2$I_K.pѣi,X=z$$I$jjj̼x֭/~>z#$$I뮻y|?%ɸq|@uuuZj kkJ_PV, 1pԅcr;t(,Y|P8ƏY8~8f555 0e˖ѿ8$ID$IRxI$Iqc3gcq-puo~oй.cƌ]vmۖ1Nd>.JJJۿ[^z%oyީS뮻fܹjՊ~kѱc8JM}]nٲe,*;vӭ[7o~{yo>f͚u:+J:WX`_%ڵk<,Y®]=z4_y(.._~'{\Ӛ ڳgO,]ⱚȭ8p`.Y$D~]>Gdggs 70n8XDU{Wׯ-Z\+; ޹ꮻm۶iӆ#Fo$Dx:cUUUt]裏8sLUzjc }L:5kְeشiJOWXM6??9gf۶m|[jTXyw:ϋcˎ_xw:tSSkӦM#G;`رZ9s4oXyJ1fƌs:t( b…^:`:%7x)S0p@~>5뮸駟^|]M:W驩?ܹ3%tAs?V7MT{}{dgg_>>5$ƺtBUUe/[x^lҹJOM}裏:yxJsR]]Ͱa8q[nmig}rsWҢE Q^^~C==WSkuD":tN:5WD >+**8%C6m%S8xm̧~ʽˁWկ6<cFcgΜaݺu|oqٹ{پ};Gq5?}'{mp*x Ξ={بQx)--xرc {WܥȕkWznկ~+s.Q[[ݻy8p cn̘1?/ڵ6mڄ9qG'? ?7@~~>ٌ?{~ݻ_K{|%ODZNN7߿?TTTvZt޽{TJ$ӧO{7.`ܸq>5p@L5553gF:w̌ 0 uKf+;DFi۶m$+++2|țoJ2M}EկFnHV"_#=X?g|%/}Kov$D~^ >Ȅ ";vi&2x`V:5GΎj*ҭ[C=y JX~7qi $II$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iqc$I7I$Iq(IENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6882362 pytest-mpl-0.16.1/tests/baseline/hashes/0000755000175100001710000000000014266763666017541 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/hashes/mpl20_ft261.json0000644000175100001710000000266414266763645022315 0ustar00runnerdocker{ "test_pytest_mpl.test_succeeds": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_succeeds_remote": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_succeeds_faulty_mirror": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_dpi": "cc21ba84cc41dfcf77f46f5543affed721df2384958fa0adc4e5e60470852781", "test_pytest_mpl.test_tolerance": "ab176e655d3dca536ce74f7447d4eb8b7f70649a81a4055e5ce77c1f53c3a46f", "test_pytest_mpl.test_base_style": "92497fd88fc46bf7a99b1afd32e7fb73fa06fa1ceaee7bcc443324e45c6b4d91", "test_pytest_mpl.test_remove_text": "9c284d7bcbbb1d6c1362b417859e4ce842b573a2fe32c7ceaafcf328a1eb7057", "test_pytest_mpl.test_parametrized[5]": "04c998af2d7932ca4a851d610e8a020d94a2f623d1301dbe9b59fe6efd28a5f7", "test_pytest_mpl.test_parametrized[50]": "937d986ab6b209e7d48eb30cc30e9db62c93bbc4c86768e276a5b454e63bca93", "test_pytest_mpl.test_parametrized[500]": "e39ed724b0762b8736879801e32dc0c1525afd03c0567a43b119435aaa608498", "test_pytest_mpl.test_hash_succeeds": "480062c2239ed9d70e361d1a5b578dc2aa756971161ac6e7287b492ae6118c59", "test.test_modified": "54f6cf83d5b06fa2ecb7fa23d6e87898679178ef5d0dfdd2551a139f1932127b", "test.test_new": "54f6cf83d5b06fa2ecb7fa23d6e87898679178ef5d0dfdd2551a139f1932127b", "test.test_unmodified": "54f6cf83d5b06fa2ecb7fa23d6e87898679178ef5d0dfdd2551a139f1932127b" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/hashes/mpl21_ft261.json0000644000175100001710000000266414266763645022316 0ustar00runnerdocker{ "test_pytest_mpl.test_succeeds": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_succeeds_remote": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_succeeds_faulty_mirror": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_dpi": "cc21ba84cc41dfcf77f46f5543affed721df2384958fa0adc4e5e60470852781", "test_pytest_mpl.test_tolerance": "ab176e655d3dca536ce74f7447d4eb8b7f70649a81a4055e5ce77c1f53c3a46f", "test_pytest_mpl.test_base_style": "92497fd88fc46bf7a99b1afd32e7fb73fa06fa1ceaee7bcc443324e45c6b4d91", "test_pytest_mpl.test_remove_text": "9c284d7bcbbb1d6c1362b417859e4ce842b573a2fe32c7ceaafcf328a1eb7057", "test_pytest_mpl.test_parametrized[5]": "04c998af2d7932ca4a851d610e8a020d94a2f623d1301dbe9b59fe6efd28a5f7", "test_pytest_mpl.test_parametrized[50]": "937d986ab6b209e7d48eb30cc30e9db62c93bbc4c86768e276a5b454e63bca93", "test_pytest_mpl.test_parametrized[500]": "e39ed724b0762b8736879801e32dc0c1525afd03c0567a43b119435aaa608498", "test_pytest_mpl.test_hash_succeeds": "17b65dd0247b0dfd8c1b4b079352414ae0fe03c0a3e79d63c8b8670d84d4098f", "test.test_modified": "14d326881467bc613e6504b87bd7d556a5e58668ff16b896fa3c15745cfb6336", "test.test_new": "14d326881467bc613e6504b87bd7d556a5e58668ff16b896fa3c15745cfb6336", "test.test_unmodified": "14d326881467bc613e6504b87bd7d556a5e58668ff16b896fa3c15745cfb6336" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/hashes/mpl22_ft261.json0000644000175100001710000000266414266763645022317 0ustar00runnerdocker{ "test_pytest_mpl.test_succeeds": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_succeeds_remote": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_succeeds_faulty_mirror": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_dpi": "cc21ba84cc41dfcf77f46f5543affed721df2384958fa0adc4e5e60470852781", "test_pytest_mpl.test_tolerance": "ab176e655d3dca536ce74f7447d4eb8b7f70649a81a4055e5ce77c1f53c3a46f", "test_pytest_mpl.test_base_style": "92497fd88fc46bf7a99b1afd32e7fb73fa06fa1ceaee7bcc443324e45c6b4d91", "test_pytest_mpl.test_remove_text": "9c284d7bcbbb1d6c1362b417859e4ce842b573a2fe32c7ceaafcf328a1eb7057", "test_pytest_mpl.test_parametrized[5]": "04c998af2d7932ca4a851d610e8a020d94a2f623d1301dbe9b59fe6efd28a5f7", "test_pytest_mpl.test_parametrized[50]": "937d986ab6b209e7d48eb30cc30e9db62c93bbc4c86768e276a5b454e63bca93", "test_pytest_mpl.test_parametrized[500]": "e39ed724b0762b8736879801e32dc0c1525afd03c0567a43b119435aaa608498", "test_pytest_mpl.test_hash_succeeds": "e80557c8784fb920fb79b03b26dc072649a98811f00a8c212df8761e4351acde", "test.test_modified": "80e0ee6df7cf7d9d9407395a25af30beb8763e98820a7be972764899246d2cd7", "test.test_new": "80e0ee6df7cf7d9d9407395a25af30beb8763e98820a7be972764899246d2cd7", "test.test_unmodified": "80e0ee6df7cf7d9d9407395a25af30beb8763e98820a7be972764899246d2cd7" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/hashes/mpl30_ft261.json0000644000175100001710000000266414266763645022316 0ustar00runnerdocker{ "test_pytest_mpl.test_succeeds": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_succeeds_remote": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_succeeds_faulty_mirror": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_dpi": "cc21ba84cc41dfcf77f46f5543affed721df2384958fa0adc4e5e60470852781", "test_pytest_mpl.test_tolerance": "ab176e655d3dca536ce74f7447d4eb8b7f70649a81a4055e5ce77c1f53c3a46f", "test_pytest_mpl.test_base_style": "92497fd88fc46bf7a99b1afd32e7fb73fa06fa1ceaee7bcc443324e45c6b4d91", "test_pytest_mpl.test_remove_text": "9c284d7bcbbb1d6c1362b417859e4ce842b573a2fe32c7ceaafcf328a1eb7057", "test_pytest_mpl.test_parametrized[5]": "04c998af2d7932ca4a851d610e8a020d94a2f623d1301dbe9b59fe6efd28a5f7", "test_pytest_mpl.test_parametrized[50]": "937d986ab6b209e7d48eb30cc30e9db62c93bbc4c86768e276a5b454e63bca93", "test_pytest_mpl.test_parametrized[500]": "e39ed724b0762b8736879801e32dc0c1525afd03c0567a43b119435aaa608498", "test_pytest_mpl.test_hash_succeeds": "4e1157a93733cdb327f1741afdb0525f4d0e3f12e60b54f72c93db9f9c9ae27f", "test.test_modified": "6e2e4ba7b77caf62df24f6b92d6fc51ab1b837bf98039750334f65c0a6c5d898", "test.test_new": "6e2e4ba7b77caf62df24f6b92d6fc51ab1b837bf98039750334f65c0a6c5d898", "test.test_unmodified": "6e2e4ba7b77caf62df24f6b92d6fc51ab1b837bf98039750334f65c0a6c5d898" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/hashes/mpl31_ft261.json0000644000175100001710000000266414266763645022317 0ustar00runnerdocker{ "test_pytest_mpl.test_succeeds": "2a4da3a36b384df539f3f47d476f67a918f5eee1df360dbab9469b96260df78f", "test_pytest_mpl.test_succeeds_remote": "2a4da3a36b384df539f3f47d476f67a918f5eee1df360dbab9469b96260df78f", "test_pytest_mpl.test_succeeds_faulty_mirror": "2a4da3a36b384df539f3f47d476f67a918f5eee1df360dbab9469b96260df78f", "test_pytest_mpl.test_dpi": "2fd74751a8654eb0b32ff0663fd8ec137fba20aec0eb6871e312e9a8ff1fe296", "test_pytest_mpl.test_tolerance": "3675e5a48388e8cc341580e9b41115d3cf63d2465cf11eeed3faa23e84030fc2", "test_pytest_mpl.test_base_style": "781074a09615b6efb9aae8ea7630c4c59dce4f7c02b7fc4ce594ccf681955586", "test_pytest_mpl.test_remove_text": "41c85cd546792245d6b2b2ebf5742d3053e679a5e088407738f4785517d8dbac", "test_pytest_mpl.test_parametrized[5]": "be7dc9de64a5d6fd458c1f930d4aa56cf8196ddb0e8b5b07ab79a1f0ea9eb820", "test_pytest_mpl.test_parametrized[50]": "a8ae2427337803dc864784d88c4428a6af5a3e47d2bfc84c98b68b25fde75704", "test_pytest_mpl.test_parametrized[500]": "590ef42388378173e293bd37e95ff22d8e753d53327d1fb5d6bdf2bac4f84d01", "test_pytest_mpl.test_hash_succeeds": "2a4da3a36b384df539f3f47d476f67a918f5eee1df360dbab9469b96260df78f", "test.test_modified": "3675e5a48388e8cc341580e9b41115d3cf63d2465cf11eeed3faa23e84030fc2", "test.test_new": "3675e5a48388e8cc341580e9b41115d3cf63d2465cf11eeed3faa23e84030fc2", "test.test_unmodified": "3675e5a48388e8cc341580e9b41115d3cf63d2465cf11eeed3faa23e84030fc2" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/hashes/mpl32_ft261.json0000644000175100001710000000266414266763645022320 0ustar00runnerdocker{ "test_pytest_mpl.test_succeeds": "8b8ff9ce044bc9075876278781667a708414460209bba25a39d8262ed73d0f04", "test_pytest_mpl.test_succeeds_remote": "8b8ff9ce044bc9075876278781667a708414460209bba25a39d8262ed73d0f04", "test_pytest_mpl.test_succeeds_faulty_mirror": "8b8ff9ce044bc9075876278781667a708414460209bba25a39d8262ed73d0f04", "test_pytest_mpl.test_dpi": "812d841fdc4b84bb7d80e08e484932fd2775dd83e347c50516ed5941c8ad933c", "test_pytest_mpl.test_tolerance": "3b7db65812fd59403d17a2fba3ebe1fd0abdfde8633df06636e4e1daea259da0", "test_pytest_mpl.test_base_style": "23c0c0cd74c3daa99a60d9d0500fb2ec4a6f87ddcaa46309ebd608b03b04a0a9", "test_pytest_mpl.test_remove_text": "cbc0daabceb9b46eaff0031a045bf659ce694b0962443ef26d19aa54425aaa39", "test_pytest_mpl.test_parametrized[5]": "9b2b5b1df784c8f9a5fc624840138fe7b4dbdd42cf592fe5733c9c825e5dda91", "test_pytest_mpl.test_parametrized[50]": "fcf0566ef5514674e2b4bf1e9b4c7f52451c6f98abdc75dc876f43c97a23bc32", "test_pytest_mpl.test_parametrized[500]": "38dccccfc980b44359bc1b325bef48471bc084db37ed622af00a553792a8b093", "test_pytest_mpl.test_hash_succeeds": "8b8ff9ce044bc9075876278781667a708414460209bba25a39d8262ed73d0f04", "test.test_modified": "3b7db65812fd59403d17a2fba3ebe1fd0abdfde8633df06636e4e1daea259da0", "test.test_new": "3b7db65812fd59403d17a2fba3ebe1fd0abdfde8633df06636e4e1daea259da0", "test.test_unmodified": "3b7db65812fd59403d17a2fba3ebe1fd0abdfde8633df06636e4e1daea259da0" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/hashes/mpl33_ft261.json0000644000175100001710000000266414266763645022321 0ustar00runnerdocker{ "test_pytest_mpl.test_succeeds": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_succeeds_remote": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_succeeds_faulty_mirror": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test_pytest_mpl.test_dpi": "cc21ba84cc41dfcf77f46f5543affed721df2384958fa0adc4e5e60470852781", "test_pytest_mpl.test_tolerance": "ab176e655d3dca536ce74f7447d4eb8b7f70649a81a4055e5ce77c1f53c3a46f", "test_pytest_mpl.test_base_style": "92497fd88fc46bf7a99b1afd32e7fb73fa06fa1ceaee7bcc443324e45c6b4d91", "test_pytest_mpl.test_remove_text": "9c284d7bcbbb1d6c1362b417859e4ce842b573a2fe32c7ceaafcf328a1eb7057", "test_pytest_mpl.test_parametrized[5]": "04c998af2d7932ca4a851d610e8a020d94a2f623d1301dbe9b59fe6efd28a5f7", "test_pytest_mpl.test_parametrized[50]": "937d986ab6b209e7d48eb30cc30e9db62c93bbc4c86768e276a5b454e63bca93", "test_pytest_mpl.test_parametrized[500]": "e39ed724b0762b8736879801e32dc0c1525afd03c0567a43b119435aaa608498", "test_pytest_mpl.test_hash_succeeds": "55ad74a44c99606f1df1e79f67a59a4986bddc2b48ea2b2d7ea8365db91dc7ca", "test.test_modified": "ce07de6b726c3b01afb03aa7c9e939d584bc71a54b9737d69853a0d915cd6181", "test.test_new": "ce07de6b726c3b01afb03aa7c9e939d584bc71a54b9737d69853a0d915cd6181", "test.test_unmodified": "ce07de6b726c3b01afb03aa7c9e939d584bc71a54b9737d69853a0d915cd6181" } ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6842363 pytest-mpl-0.16.1/tests/baseline/hybrid/0000755000175100001710000000000014266763666017547 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6882362 pytest-mpl-0.16.1/tests/baseline/hybrid/fail/0000755000175100001710000000000014266763666020462 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/hybrid/fail/test_hash_fail_hybrid.png0000644000175100001710000003062214266763645025506 0ustar00runnerdockerPNG  IHDR XvpsBIT|d pHYsaa?i IDATxM/ws.CQpQkZT*U4iX+ PYvqfg{70g5f2q P]TD:V>m;> W@^s}VPUh P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7 P7_> W/~U_ǬZ*_򗫎ӔߟΪc9~_g֭UhJ HWAKՆcQ/֘,$'kg9o) ]Ky+NC{Q֨kLZ-yd߾ȑ.OvHvNvLΝKfͪ:UkpdÆHOm:Qkq/Y0dhH #&Q/x$%%\̟_ud ڔPS/֨k`6^M^{-y3-WԗBoo GUZG%olޜ|{}sNվ`вn*ch\:߻׊ݪ) d˖dʔdҪjA+yʊ]q( WJSӫN?3@Krؽs'yd͚I~dɒdddDhd M޽7lp!3T|#X47 ձcɮ]V6ߟz2mZ28,\Xu",ƣGIww&Gsq@S{7,s>7wR$'N$VU3аjr, ^|4;4>ؑޝܙ;̚Uu*,eHOm:  ldhHh5  Сdݺ[*ϯ:ӟ䷿MMyR@ƍÇɊU'b2Zӓ,_̞]V*Oɾ}@2sfթ#Xիk%7o&eMю&G%olޜ|{ŋܹU FTn14T.kn;S@4ɖ-ɔ)ٳҥU'jFpZyPpd޼bW Q@`ɫ&otu%N%ӧWFa sJY{Nח][u"&į~,YL(|2gr^_]]̙Su*,ڍɆ eرd.+vl O?ydڴdp0YD4#XSV.A˗OvHvNvLΝKfͪ:2r?$Ǐ'۶UVldhH`( ݃ɡCɺuɷU.ϟ_u*Z,$Sёѣ^5g) ddŊѪ`Z-I/Of.+v&Цɾ}@2sfթhuFիk%7o&e @MA}) m⣏7L6oNdܪSn`[J*bj( -n` ٲ%2%9{6YD3#X-V+ \̛WV*TMhAɫ&otu%N%ӧW `+Wʊ;wdڪ?8h!UdI2uj22|xp^_]]̙Su*ό`47 ձcɮ]VҸ&ߟz2mZ28,\Xu"lFУGIww& @{7,s>+$&rR$'N$VU jr, ^|М7>ؑޝܙ;̚Uu*x:FUkגǓm۪N @+Ǔ!֠4Cuo}\<|>:dd͚dܪSA[J*b@eK2eJrltiՉF&Q9\̛WV*3`&tuSӫN20 \)+vIkN ;~) ޽7˶ 9sNq#ٰ^;e.|'L & V,Qݝ|eŮ S{7,s>R@ХK_8ZUu"hz:co~<(xOJx ɎΝɹsɬYUc s\^^5v<2m[Չy9 }}ex24|R@>ɡCɺuɷU.ϟ_u*h~FIGGrLrhrWa( ddŊAk1b'Y<=U>`) @+#W'%̙Ud hkW7o&e |Qr@ysfMrb2wnթ=ʭ[x K{Z mc` ٲ%2%9{6YD~`-VKIVL++vWsT2}zթ}Z֕+e;I__vmՉ' @K:~Q( @Kw/yd…dΜS,eܸlPFKvbדiӒdª=J~7YU>q9i@of^xᅏ[GGG:::*Jݤ~tw''yw;|FGG+J:PjU|r,XUvR$MjUՉhF4Z\07˃/+Li';v$w';w&%fU xMkm۪N< ' @+Ǔ!4Cuo}\T@`ʕbΝ/YD@dɒdddD`ܻF}{vuB2gNթF` P7n$6ѫcǒ]A&ɓ֭ɴi`paՉFc xf%eŮ|' 3{7LK 9|8y'NS( S.=ƒ'UN4:''V ˖%3f+x DǓ;ݻ;sYN4 #Xc~j~Zydp۶ X А<L$%%\̟_u*Y>IGGrLrhrẂgddŊ1Zӓ,_̞]V*DQ@+#W'%̙UZ, IrjY{f[Ư& ɢEa< ͛5ksN2#XЦnJ6m*'ٻ׊]`) І-[)SgKN #XFjȑdd޼bWI61:_tuSӫN#X\)+vIkN+' O,INMFFZ {={˚ 9sN;#XЂnH6l(Wǎ%vY 4Zɓ֭ɴi`paՉGddbWhw&I)!'4 p168ZUu"O4Z\0_,1\)@S@ ';v$w';w&%fU &szyڵmU'x|N@% !h> 4CuW^I.]Jϯ:3 #9s&9z49xЫ@R@?lܘ<|>XQu"gc P$˗'g h0ccejd߾d` 9T4Wˊݛ72~J@M-*+@kR@b'$7'k$/&sV `r ݺlTJGOOw@kS@"ɖ-ɔ)协o|DY9\̛WV*@P@FG듮䭷SӫNP?FN\)+vIkNPN@O,INMFF}) 0KIo/kv/\H̩:@u`$q#ٰ^;e.ddڴdp0YDLGddbW' 0AM:;?M~9>F 0<\{%'N$VU1.ϠV+̗-Kf(#WS@)';v$w';w&%fU pzyڵmU'hN@ % Nx <CuW^I.]JS4#XnN::3gGj4'7ӧ+Nм`ՒddW>`l\ߟۗ $3gV qjY{f[ƯN@&/^T>&IOH6oN֬)㥗Nz`nJ6m*'ٻ׊]ɢ-[)SFՉZ,R9\̛\|ԃ@M֯OJNJO:@{0@[rؽs'K֮:@{q@8~dϞdf…dΜS'#X7 ձcɮ]VTIeR__`A9fTZ@ø[mޜYSK/U d pVrubӓk.@+R@@eK2eJyߨ:Ւ#G+y˗VP?9Y>Jz+9u*>TL6#Xݕ+ɫ&|%kVzq@]?,Y<|22|ߒ={˚ 9sN@`ݸlPFKvb]) L'[iӒdªP%#XLGddbW Hz7 /|:::QQ"'snٙ'&$4wy'mtt4 ZVu˗/g/\u2<\{%MjUՉ&_{vG0!j䗿L-Kf(#WJ'?AYsgr\2kVթhDL_O^{-v<2m[ՉhdN@xj}}ɂwS>| O+Y.yҥk_:O#9s&9z49xЫ<>68lTN@NNV:VK~R8fN~{Ձɾ}@2sfթhVFTW7o&ƍU'9&/^T> s~ڼ9Y^:wVrubӓk.K I\eK2eJyߨ:@Ւ#G+y˗&d+yԩdSʌ`+WW_M> K֮: @:~@ ~=yڵmU'O% !Ʀ4dݺWKN@};HΜIM9Ah2ɦMÇɊU'g Ij^ eŮ@Q@X:p ٷ/Hfά:<9#X ղbͤ7ٸD4dѢ@S@ejd͚dܪS3`n*[.^Lzz{u( d` ٲ%2%9{6YD0`4Z-9r$Y27U>hE @d:L^u*F*tJ$}}ڵU'"Ǐ'K$?(dϞdf…dΜS@}7 ձcɮ]V^:9y2ٺ56-L.:ԟ,IQݝ^,^\V*+' ݤ3/%9~hc $.=ƒ'UN`j/,[̘QF( 4>eΝɹsɬYUa `\ZrZydp۶@q0 АFx$]]ɺu+$.%W ,tvё9=LNNV:4#XOVK~R8f.+vx| c+#W$%̙Ub 1\ZV޼&7Vۛ,ZT~V>Y( 2nysfMrb2wnթn-W/&==޽VDP@@eK2eJrltiՉuZrHre2o^Y|R@&']]ԩdS@1+Wʊ;wdڪ@rǓ%KS&{={˚ 9sNvnH6l(Wǎ%vY mddڴdp0YD^`mѣ;Y:YU>-ݤ3/%9_ ҆}ĉdժ@{ hIZ`lY2cFR>z rǓ;ݻ;sYN$F}KJ(IDATszyڵmU'e% !4CuW^I.]Jϯ:I`M#9s&9z49xЫi?lܘ<|>XQu"N$˗'g4h*ccejd߾d` 9T24Wˊݛ72~4' @SM-*+Ьݿ8lޜY\̝[u*i֭[ɦMt${Z N@eK2eJrltiՉ` h(ZrHre2o^Y|@P@1:_tuSӫNL$#X@Crؽs'K֮:0;~) @eKIo/kv/\H̩:0`q#ٰ^;e.'[iӒdªb GddbWwΤÇ|nxKNHV:PIS ˖%3f+ڛLdǎddܹd֬SU3L˫׮Gm:(/Y )) x 9t(Y.KN4#X3};HΜIM9?lܘ<|>XQu"J$˗'/XV*Q@'66VFOK{/9T@30'dd͚ܹU,3ݺlڔ\X.k.S $[$S$g&KVhvFVKIVL++v`"( nj&']]ԩdSwWw$[.L$' @dɒdddD&m޽dϞdf…dΜS7 O~;ٹӊ]`r) ЦNLnMdp0YD@;0mѣ;Y:YP>zqҀ|ͼ tttTVqnٙrpy睼;ъҴ/jZ!(._ ddd$/rqh1LJ&MT_{v}BՒcǒe˒3ȕTE6>ؑ]6\;̚Uu*-km۪NZR__l5> )@P@ )СdݺN.]Jϯ:@c0#9s&9z49xЫL r|qcartbEՉ,xFZӓ,_brixccejd߾3Nи`Szؽy3-W|6' z{Eaq) OH6oN֬){̝[u*a ӭ[ɦMŋ޽V<)@eK2eJrltiՉ, ZrHre2o^Y|<=>h~}U~NJO:@s3ʕbΝw˅sǏ'K$S&##DR@?ܻٓl^^̙Su*b ܸlؐ~ΝVLwduk/%ɂU'h]Fh[%徇0ЖM:;RBNS&B.=>_};U'h6jرdٲdƌP_ ma|<ٱ#ٽl:w.WN~`_/_VܶD -lO) Cuo;t)?Tܾtt$g&?Y{Q( 瓍ӧ˫N?3EKՒR8^|U>B+#W'?Q{̙U]ZV޼+VoohQ`><|4s~r@ysvmycܪS8`TnJ6mJ.^L~?b( 4d˖dʔҥU'Ijɑ#ʕɼyeŮМh~}U~NJO:O ʕbΝw5kNrBC:~xR kt4Y>*?N%ӧW fdtJY{Nɚ5U'9S?,Y<|22|{={˅9sN@+0ܸlؐ~ΝV0qdK_J N@1E=Jի˝ݽtv&><0I66<\{|awN@ jɱcɲeɌUszP@xcG{wpu\T va\^^5v<2m[Չh7N@D__pa9R>JH6oN֮-{̝[u*tFԭ[x %EZ @S@@eK2eJycҪ1Djȑdd޼bW( Mbt4yդ:L^u*x2 Hr%Y^nW_KթhvNh֨kwxdIHfMՉhCM[^AsP@Խ{o$۷ 'sT -X dNvb֠4_OM NGi _$g_Ϳ[9|P\F[^QW^Mo}VժA:׿unZu4> W/~U_ǬZ*_򗫎ӔnFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.!t9үIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6882362 pytest-mpl-0.16.1/tests/baseline/hybrid/succeed/0000755000175100001710000000000014266763666021162 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/hybrid/succeed/test_hash_fail_hybrid.png0000644000175100001710000004211214266763645026203 0ustar00runnerdockerPNG  IHDR XvpsBIT|d pHYsaa?i IDATxpxUD;5;jPF 6L,@ `őޱNgvLNbVgunt*S`MBbKg l b:d_ɹ|l|d&:"Ő$IuI$I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $I"I$)a, $Iҏ[nk믿ロW^ye@qկ2rH ٳimmsjI$)$v{=ʢ,X~~޾>~~cqYf­ޚ$I\bC^&Mĉ'x7u555 /cǸۘ7o=\"K$II+9~y_d,Zk#GZN<晴$IRҲϻ˿i&nʽ{y78q"C|ڻ8Ȓ$IRRǣ>ȑ#ۿ[֭[… yꩧ=Gno%$I ~k׮%??~z{{9uy>ફ'$I, 1~xƏ>}Gnn.\q~W_='Nsywo>I$)|ܹs룎, !??+Vp>57pGuΟ_WWGii$IR?eQHITWW9sw羚#k7|3~o -#<¦M 5~=|+WQYYzt, ȨQ>ӧꫯ泟,N57nC)ɋ/K/t9 ./ЇcW~;'N_M:kĈ)!]S3w/PYyz+V뿸y~oOO\{[omtR~ߝ}zoo/$I4P==æMpUX@QTTĿ//tvv2|p&MDee% ,8^y啼8հdIԉҋ_l–-[>__GqH'Ix29a„D(e#(CDwM(/<ط/HVDwM/aFX7  $I2֞=PPc̚u$I2N,UU0s&r Z>"IF֬ xuʊ:UpK$I x0~D$I+\0on|D"Iv4<1~|ԩ2#X$IJ[x46KVb7jI$z(.Ca.6-DG$Ifb@9s ;;ص|$ $IFW,Z?0jTԩ$IRZؿ?=v ^~rsNx"I@N --df$IR:y~|0lڻƍ:,I$vW7MI$:aphhɓNrK$I)**`<:5ص|O@$I:;4~TT 0ķSD$IIo߾p`V;7DTvFI$%X,\0[[-"IKŠl cDJ,I$%CՁP] KDHI$%ڰn, $IJ g@y9 Q`sK$I~Kظ֭"IH ;vYQ'R<9%IHbPU3gرaŮ#Y@$IpajX!++TJG$IPmmp0Ԅ+eO@$I055p]fG&H$)NG"җ Ə:$I⪣#p|*Wf2 $I⦾aPص M:$I],(8gdgD$I -av5*TJ`I$iV;`Aԉl<$IҠO ' ˇg$Ie9y~|0lڻƍ:#X$Id퐟F6o]H$ ÇCCLu"G$ItQ̓SÊ]ˇI$ Xg'ӏ ذ.D$Io_{u+̝u""$I+ ̿@Vˇ.D$IKŠl cDJ,I$С0ruTWÒ%Q'R:D$IS[6[>46Z>4x, $I:(/<=;\<0!TJ'`I$ ?JJa:jg$I{@AŽ0kVԉ$I`TU̙0vlXkPI4p$<0<`vw/u*$IJq퐟F6o]e$IJauu/'GH:?G$IRP_TTy0ujXkP*D$)tvBii8 `o++EX@$IRȾ}{֭0wnԉcW$IJX`/ Z>, $II.+`2ؽƌ:ti$IJb<հdIԉ $IR zz`$IJ2g@y9 Q#X$IIQ();aFXΧ+X@$IĞ=PPc̚u"i9%IX `L;6ص|(]Y@$I"F֬իN%ŏ#X$Iik +v0~%;O@$I"PSSϛ-I:}֮"ͅ&?>TR8%I x46KVbW"IP\ C®]0mZԉh8%IGTVœ9VZ>, $Iqcv5*TR$IÊcǠ,:<$IdՐÆAKCsIAr$<0mW{¸qQ#X$IͰ|+vX@$I.S]|0|844Q'#X$I**`<:5ص|H $I%pQQ6ڕ."It ={nsN${$Ib(j.D$izz`RX-ݻa̘SI,I 8t(<%KN$.O@$IΣ6lFˇt, $I8s!/f'L:$I GBI 7ºu>\,I?g@o/fEHJ/`I$VVU̙0vlXkD$e0rf ^ u*)=9%I2Z[[X{0Ԅ+I $IX550eJ!%D$eӧaZ(*\hjN%eG$IRFţ1\:_R"Y@$IRƨb:viӢN$eG̪U;6l7t8p߻e~?y$I)J3Ê]ˇ O@QYYICCy睼;q"&Lw]~ӟ^g̛7ɓ'3$IÊcǠ,:$G1}[o;{'Irr`0hi|H2@XGrgϞu]5\ 8x`J$'ᇡ,lڻƍ:95@?'<]s5}:x J,IRio0zy3,_])X@7_:ӦM_[XXHaacܹ}|;?aJ_á)%'G.wgĈ\y k3f̘ԩSyP0oLVZ> ytuu1o<?ݻʺu7~@_#0bĈVRRBII%%IJGPZN?**`۫$?VnW]u*Iҏ_++ H/~n+_ O<G[fIݡC .Yu"IX,:g [ZZ"Iҟ 9^z &L:2v"I֙3P^yy0{vxnR#X$))= %%s'lTs)X@$IRٳ vYN$i8%IF,UU0s&VZ>b$II;\YWC}=deEJ`sK$E-=|jj $ITM L>on|H"I"q4] EE MM0~|ԩ$ś#X$)::Bhl WrŮ), $)롸]`ڴIJ$G$IRBbPY s@vvXk2D$]W,ZׇaԨSI#X$)+vZX D $IjɁaà!"IIxa(+ ۮqN%)8%IU{;ѫ͛arWJoI4hmŋaphhɓN$)8%I.[_TT0ujXkO@$IeR %d["I.Yss [ܹQ'|B$]X,\01F#WIa$I.+`2ؽƌ:T$ICS \$DR' $i@jkaҤphti, $Μr˃{}`„SIJU`Is:zJJ`Nظ֭.D$k((^رf͊:t$IX `L;6ص|H,ItVwwZVzʊ:t$I-=|jj$ 6O@$I550eJ!)~, $eS`Z(*\hjN%)9%IRP:`*WJ? $IaPص M:L$I$J3Ê]ˇDH!`BX>|lFEJRqK X{‚Q'<$)UWCN --IѲHN+,ݻƍ:L$IiͰ|+v%% $Iif6X<9D$)MAE̟SII@g'B]](!6f, $pߣnsN$I{#$X,\01F#WI"IR 遥Ka X v1cN%I$I)СTC,:$ ' $Z4)46Z>$ $I)(/<ط&L:$]\R검H쁂;`֬IqK$AU̜ cdžI"IR#WkP_YYQ$II-=|jj$O@$IJ550eJ!)=Y@$IةSv-An.45QpKut@aa(UUj+v%7 $Ib:4$, $]XVe`n3&T$:j~`x%Q' $I&M ' C.D:s!/;:$G$IGva:j.I"Id5+D$b13aXx ˇ$]. $I#WkP_YYQ$I-=|jj$ipx"Iҟ)SMMIlIS`Z(*P>n=T~$e(, VrŮ$ŋD롸 >=D$eX *+aΆVˇ$%Dq`BXoQN%I,IRFٿ?=v jkaIRfD1!' ˇ$E"IJ{'NʕPV EJ2#XajfX% $)mm'GH$)AE̟SIJHJg'B]|ona$pߣnsN$IK'$IJy<4̘G+ˇ$%' $)C5˖0fLԩ$I$)e:j~`x%Q'$]' T[ &_!I"IJ)gwFJ4P`IRѣPR;wƍnO5Tc$(, ' ;vYQ'$] G$II-?c7,, F֮իN%I`IR[[X{0@AAԉ$IIRҩ)SMMIJ'IR8u*[Ann(u*I`rK::–&U\+I"I\}=СӧGH/`UVqw0l0n& 9p|_eȑ 6ٳgԒzb19s ;Z[-<Gee% pw;SO1qD~_}7 =_=?5k---z HR:~zjk+:$), 7s='>񉳯1aӟ/g^x(,,n'瞋{~IJvâE,Xu"IR8Տӧ|zq{_|EF͢Eξ6rH ɓq,Irrk!I2@XGrןx &NȐ!gH$)ݜ8+WBYYXw/u*IRY@g?9 7?|ߎK>IJf?'7Ï W_u*IR2o&_י6meee>c<璔ImŋaphhɓNL9 IDAT$I' ;p3b^|E{'N8璔 χSÊ]ˇ$b޼y?~ݻwu8r^Gy#F|䵒JJJ\ PWO<byQa9'Nˁxg?;>ݻEFn M61qK.IQjn|[aܨIҥ V&MQQ{ /0mڴ~ȑ#曜>}k=z^zk./tOÌ0zt|H' xGyO,o7|3 HNNK.w'RQQ迊$%DO$Ic r\ eea޽0n\ԩ$I,I퐟F6o]+IJ< $em`b>`I2#XχSÊ]ˇ$)JHRRo-NY@$) 57ݰu+̝u"I 4OÌ0zt|HDDO$I"I v\ eea޽0n\ԩ$IJ G$)!??^m ˗bWY, ۶0|844Q'$)8냊 ?N +v-L $Qg'B]](!6$e0 $Iss [ܹQ'$)z'I,3`0re$)H 遇 kv-ݻa̘SI<Ar<<2dIԉ$IJ>H I HcCsHe8s֯<ط&L:$I,IDGBI 7ºu>\ H%hhB;`֬I رaŮCHuwkajSIZhk +v((:$II2%|l$rX@$N VEE MM0~|ԩ$IJm`IR?::–&U\+I`H_b:viӢN$IRpKX *+a+v-$ . $]]p!_>oQN%IRqKRۿ?=v jkaI<Ѫ!' ˇ$IfN+,ݻƍ:$I,IͰ|+v%IJ m,^ ÇCCLu"I2#X2B_TT0ujXk$)<:;B ٰ$IHJkGw7l sFH{R,.ϘG+ˇ$IѳHJ;==t)X˖0fLԩ$I8%):j~`x%Q'$IIi&M ' IDR;s!/ N%Iv(Νq#[S%IJfI)k((^رf͊:$IG$X `L;6ص|H, RJwwZVzʊ:$I(G$ba W$)x")%)fˇ$I"):kBQBSu*It::0*X$: T_0t(ӦEH$ G$%X *+a+v-$  cv5*T$i09%))V;`Aԉ$IR\$" ;vYQ'$I,I$*9n%ص|H HhajX^N%IR#X.J[[X{0Ԅ+IDҀ)ysC$]< :u ֮" ?>T$)9%::¥U\+I.D9Cq1  viQ'$Is'_"W\-[[l+wމopibPY s@vvXk$Isxwy'馛;~_^x';vG^ԧ>5H ꂲ2o~|2T$)]X@nȑ#|ӟf߾}L2ƼyL{X>$IRx@7x#/u<#Fk%%%+2Dg'B]](!6߆$_?ڱc>u*---|_Ld,o7|3ӧO<'OfĈoo~Quzzk_gMફN%I2<K/K/PZZ{***۷on|+<=:!٥CS \$D$IpE,EB3---eQॗ`„I)9吗 Y>$IRrqKJGBI 7ºu>\$% 쁂;`֬I$,)bPU3g-@kC$%7 ՚5z5:deEJ$RP[[X{0Ԅ+IT bjj`ʔp!IRDJNڵPTGJ$8%(,p|*WJd\}=СkLu"IKb19s ;;ص|HTgPW,\ׇaԨSI$]>G$X{rp.I.<Hu5ab$I"%'aJ(+ kvqN%I4"3eؕ$I"Eh6X`ҤI$ŗ#XRχS}ˇ$IH PWJȆ 0ķ$IRH {~ᄄI$%J 0cF,$)Y@8遥KaŊjn3&T$IpKCS \$D$IDڰ٪-$I`ݙ3P^yypーoLu*I4ع6nu|$IҟHd((^رf͊:$IRqKLTU̙p-j$I: t՚5z5:deEJ$)y9%]ba W$I:?O@KPSS ͖IH)X 77\$I=PPc̜u"I$% G4hb1 [Š]ˇ$ID;\Y됕u*I$%GtŠÇ&_I$IDL ̛-$I:? .ɩSv-GJ$I,](,&$I .J}=СӦEH$I, H,0gdgI$], . .0jTԩ$IyV;/ Q'$IR*DT] 99pb$I峀cN+,\8߳ƍ:$Iҁ#Xvχy-sŮ$IDgmuACLu"I$GD_TTGKC$I HR %db-$IRX@2XssaN$It{(͛a =:g޾&m.=WǎI `-"zyO!>pdhi22\G@  ޽ҦMK? }wb)X ؅ Җ-ҷJSOTsd:~\ڼYZ[@Wp ւcҫmnK Nz ǥo]?@tun{t+z)3uF2]"UUIƍ{yg)XԹs.TY-vp#CGH?,p 4U]]EEE)((H TEEbbb>~篱_ɑwޑ}W K 8Y,I롡g#RT&{_JaaaS^122~}*d.>޹АϷw}.c^"AZZ; +<<\S￯i pR-vIRIIuAHr=ذIEEES^"Iںui{ duuutߵ>!Iڽ{"##w^566WIII\dڵھ}~EGG7^x@} 0]*))IgΜQ^^>)H_={O>Pff^z%eddT=p!0 "` N}Y%$$(,,LYYYꫯ<;88 (""ByyyӚm544(((hʟ~*|3<amҥ*jjjUVѣe8fejkk͛u=_uuuJOOw}+WN6 ݐdֺldggϸ?6$MMM/K.5lⷚ1?k$fL,###n7 0l6!ɨh/ טmT[[t:'uwwغu{i,?knnVpp***kڱcN8gθ766VYVtv/L,Eqqql7|鵫10uo+Vkƽ4@ɓJMMՒ%K&YF?θ7==}^|8kdkƍKXܘm0 a.\Lv'?pb_U^^_]3f,ˤP؋Ǘ~ZZ_oڴIZ~ۧzk ƢlYm4!IDATӧOR*++4q¦ua3{?KKKSww g٩I{Õ:cצo)&&fN1h6LeddDEEEˣ}4@DzkNSҲe$Rӧuʕ {/\Ԥ)7K矓>/PGG _<,fl/FGGUZZ'NIS67 0]BgZu!=䓺ب^Z~$۫$I? 999'<=eee$wK;v7|nDWLkiiiFddb$&&;w4MOnVCҔ?l\m1i{.3G@k@4!0 i LC`@4!0 i LC`@4!0 i LC`@4!0 i LC`@4!0 i LC`7}IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/baseline/test_hash_lib.json0000644000175100001710000000027114266763645021766 0ustar00runnerdocker{ "test_pytest_mpl.test_hash_succeeds": "cd01b7a39330033b18d54b507635236214cae5e24f9e09d84b56462a9ac81052", "test.test_hash_fails": "FAIL", "test.test_hash_fail_hybrid": "FAIL" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/conftest.py0000644000175100001710000000031514266763645016677 0ustar00runnerdockerimport pytest from packaging.version import Version pytest_plugins = ["pytester"] if Version(pytest.__version__) < Version("6.2.0"): @pytest.fixture def pytester(testdir): return testdir ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6922362 pytest-mpl-0.16.1/tests/subtests/0000755000175100001710000000000014266763666016360 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/README.rst0000644000175100001710000001071614266763645020051 0ustar00runnerdockerTesting ``pytest-mpl`` using the ``tests/subtests`` ************************************************** ``pytest-mpl`` can output JSON summaries (``--mpl-generate-summary=json``) which contain lots of machine readable information relating to the internal state of the plugin while it was run. This test module (``test_subtest.py``) runs the test file ``subtest.py`` multiple times with different combinations of ``pytest-mpl`` arguments. After each test, it compares the outputted JSON summary to a "baseline" JSON summary for that specific combination of arguments (``summaries/*.json``). These tests are very sensitive to deviations in the documented behaviour of the ``pytest-mpl`` configuration arguments. And the exact behaviour of each comparison mode (such as images, hashes or both) can be asserted. If the format of the hash libraries or the baseline summaries are changed, ``test_subtest.py`` and ``helpers.py`` may require modifications. By using various helper functions defined in ``helpers.py``, the baseline summaries are not specific to the MPL/FreeType versions. This is implemented through regex in the log output, and by replacing baseline hashes with hashes in a version specific baseline hash library ``hashes/*.json`` and replacing result hashes with hashes in a version specific "baseline" result hash library ``result_hashes/*.json``. The baseline images used for the image comparison tests are included in ``baseline/*.png``. Generating baseline data ======================== The baseline image, hashes and summaries are generated automatically without the need to manually set the data which should fail the tests which are expected to fail. All of the test names should follow the existing convention (e.g., ``test_hdiff_imatch``), including one flag from both of the categories below. This ensures the script generates the correct baseline data which should achieve the expected test result. Full details on how the baselines are modified for each case are given below: **Hash comparison status flags:** :``hmatch``: Hash comparison must pass, so same hash in baseline and result hash libraries. :``hdiff``: Hash comparison must fail, so baseline hash is set to the same as the result hash except the first four characters are changed to ``d1ff``. :``hmissing``: Baseline hash must be missing, so baseline hash is deleted from the baseline hash library but not the result hash library. **Image comparison status flags:** :``imatch``: Image comparison must pass, so correct image is included in the baseline directory. :``idiff``: Image comparison must fail, so baseline image is edited to include a red cross such that the RMS is greater than the tolerance. :``idiffshape``: Image comparison must fail due to a different shape, so baseline image is resized to be half the generated width and height before saving. :``imissing``: Baseline image must be missing, so baseline image is deleted from the baseline directory. Generating for each version of matplotlib ----------------------------------------- Baseline data should be generated for each version of matplotlib separately. For each version of matplotlib (defined within the tox environments in ``tox.ini``), follow the three steps in this section. (Only update one version at a time.) So the baseline data can be recreated easily, do not make any manual adjustments to the generated files. Instead, updates the functions which generate the baseline data. To generate the baseline hashes, result hashes and baseline images run the following command. If you are generating for a new version of matplotlib, create empty files such as ``hashes/mpl39_ft261.json`` and ``result_hashes/mpl39_ft261.json`` so it knows you require hashes for this version. :: MPL_UPDATE_BASELINE=1 tox -e Make sure this command runs without any failures or errors. Inspect the generated data to ensure it looks correct, and ``git add``. Then generate baseline summaries for the baseline hashes and images by running: :: MPL_UPDATE_SUMMARY=1 tox -e This will update/create baseline summaries in the ``summaries`` directory. Make sure this command runs without any failures or errors. It is very important that you check every change made to the baseline summaries as these summaries define how the plugin should be running internally for each test, for each plugin configuration. If the summaries are correct, ``git add``. Now run tox normally to ensure the tests pass: :: tox -e If the tests pass, ``git commit`` the updated baselines. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/__init__.py0000644000175100001710000000000014266763645020454 0ustar00runnerdocker././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6922362 pytest-mpl-0.16.1/tests/subtests/baseline/0000755000175100001710000000000014266763666020142 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hdiff_idiff.png0000644000175100001710000006236414266763645024140 0ustar00runnerdockerPNG  IHDR XvpdIDATxudȨPt!JQi~fe**Z"!B?ٵȪ$ٯ[>hbRK*ٚh9?;sfΜ:ܮ\ʙs<8sΜ<3'Tř@JDXD`'WTŃ Tw HB@y 'Pn8#g=J Q*[? DrnDL媴Hɍd8S* gޙ/JbG%+W@ʻSB}!TJ\)s*Y@l rUZș_4*YY*-R%gA媴HxE %dgq4D% pTJ6HT7P4H *YErUZD% p(TJldNUi %dr媴J`'*WE7HT;T*-, l\f_dUiJ \f)A% *W9'HTp8rUD% C+W9/TᕫҜ@$*Y@y\P*DUi %d\"Q@lsa4wJbK+W/XUi ,x*W;HTM\RJcҼ@$*Yp7VJVdg Q3>^qqqjҤrرcJLLT~~Fjժi|OuEEbr؍Uα{)(sA:uCUxg֮]+%%EVZg՟'X + 1iFuy׮]{n}W`գR8END9k۶mJNN.6mh:zU#NJ#_T@;w.:Çs3f\Jrʜnݻ{n۸qn&ꪫB3bM>1s8ҬYW9L_H#FH[yVe18UDR |A|~Y;&\KcHI:-ZHlVI23͛)S* 3X0XZg8q.|/լi(ﱩUKzMiLszڃ X0*8 V$U2ANaN,h9c2ͦu򤹏N"6"`JgZX@َ@>, &sO‡dL͕ZnԱ%Ҥs0{۶&CvhG^z1͚33  \9.~@emlM5y9soYڳXʕ@>1))ʃl6"=`N\ٰpF)1QZ&r_+!؍JB&I_}%9x<ҒͩzoAJM&N#uPr$Sp,@>\zii8wG\xj4aSwGPr4!P"Sj\?>_Jǥwߕ$s, \9a B1CںTWo]M%~}}{i\!\ĩdcIÆI=te҆ fEf@鷿 FU Nƅ |M~t^]=[Z@ZȬmT$*WCq:Β(+H֙ kղ{渐+Bʕ nA% PJ^4jّkW k);Kwi?ujT\&Tg6LVM6I* -[&M"MlӁvOWrzy3ҬYE=MpѣMe_2odTp*W@q+*Yi)-Mi*S's&M3y PQ4z9}oPz}S#>\K:vHT<vT [g6:UR O+KVImH;v=ʕ'@Jx^AcGNϞOI11ʕ@JxOH{JsJU<L)3S1B:y` *W籗/PoڲE>]0Aji"V-7Af}C{*D@**Y"'n-i4gLCo믗>qTb ˨d'L"}9s&:ڷ7mJVo{Qrs ^G% \mvƌ1+ ~}iZGGR~SRTb$VP).6gjV'iroHrmS!lTb$PW=[ڴɜ^iiRNTԶkvOQyXC% \aiXi`Cqfͤ͛iz=*D]T|>w.@zq5y9soل58+˨d#z RvOC:|@ !dVzKz9^=q*Ui}WΖ`*Wg7guJM~q]M%~}ܹ:*WQ;ք_6]&m ' (RAS*WQ~ O?-5nl4Wqi"{Sy+T壒uԿto4r}GI?l Y<B@Apd@DLh6_԰ֵJ[J;Kw)/:eT@ aiTǥ-ƻeˤ)Sɓ=QB *Y`Ś-[Jc=IGKI_|avOߴ\,@Ahd@X}V3嗥sϵ{ѩYyjDQ9Ar @:*Y;ͮ#FHvO{6_6<߫tS9+XPJ). 0o'N{U4mxjԦcS9+D֠A;1wo4Sc))&@TQXJIb4(qU&qiq'O=\! ,3 ֬)vOjՒ|>k7d^+DA% βxrHu= 3K|`TQB QDAPI=Hwm4HRnԪtfCOr(# dc fͲ{~}iZGGR~SE+؀蠒 F^-9%= *jUO/7$'K۶=E\FD,1Qi Ko_AҤsmMt5*WE% @ yQ!饗xsfͤ͛iz_TxTal0%EzADi+8 &MJzes 3'9ٜTiDr"d?~Z7#Bi*驧w=_砒劊LysixA4T"=RvdΘe+*Wp8J1CںTW{DS׮UI}\S @LT_K=& &kg4eI6UV*(r!dp ϼ_U4{`hY ٽ;_\g^yEZl8X O#q!+VD Q @T8T^4jkW\{9&sg;͉ NΩ\ p*Yh0Z5i4'%$H˖ISH'z@wJ .G_z쩦M*>>^uUr o;|طo_8*Yd2Y.{8U\4z}=}Ӧ04*Wps٣GO>jذ o+--M/X}L8Q_~YթS'B pɟy4d&i4pNO>22g5+hAUxď_}eCURRMTIMMUrrrF?H2^Dg5l(#fϐrO^@P RժUըQ#9r$=zTEEE Tb:ԩҥ= ܦ䘡ŋU6m;\<RYݻ5}t[mΝUvm+--Mv1dGǎRvO7Sc))&YaT1j(K*UG5kVW߾}OM6M۷Wnn5jc,Q޽R~0]u !H59*W6H9z!k޽Zx/{ edd]wݥ]C4i^|HJ^ 70m"M.=Լ+jՒ|>AV=}q>tegg+՞vꫯ^'77WIIIQbbbゃX_dΖWx?\k5h ܹSW^yenۨQ##FPBBYeee)++R_3Q`)S/4;[>`jbθ!Xp.\xe6MV%_^zA]w$jP`ۥ?A3Fji)4/*yܜwfi|:/KV@:e.;y,X5jꫯ$iǎ:yڱc}YnAƍӫoFM4$o^_\͛7O5m[JP̞-m$}tyvOOiiRNt=R۶K/I#_~Y/>?_III׿JCJ]'-Y"]vE!h_ ǀ vzxl6 ɢ_xř 7n5k,2bu1ip)+K\ڞ,J7 J'%nA$Β,ÇvOת,WBi*驧wH[r@@THZRz-so7g1USC-%%3fNGD% iWo~c4pT*ҵdկ/o/͝Tl*Y@L;ք_Jp"]&m ' (RAAT4Pi *Y@LY7{CN^8si"{wTGBC% ǏKK7h6{fC"'}渐+lJi']Ws`/P!+WZiVsg;S 0xE% O>N\ji \U$!AZL2E<~Srdr9heKi+8rU8ihi:/6=b,}V3嗥sϵ{8+Wɬ5i"u(͜A TTW۹ =bl4p4T*ҰСR^ұcvOXDA% pbilDrUjդizWڴv{*`*Y̝k;W{8+WȐ>Jx @P\Ib4p$T*rU&t&ef:ɓvOX@D% p4l4X?= cԪ%-\hJ5wS @$PibiJ/Ա{8+W剋 >P[>{*x*Y>ldstvOGUEڷrs;8j60D $*YcgͲ{8JU*Rv#G)?5 dZZz5i4KÕs?I˗}Cm ^BJ`GA.]}@*(iiRN9iC۶&V D% G^zD媒56m24xTXhTp;`*Y@TllMrxW9syo{* , f))҃= lE*lqqҀƍҁRbfS d3iW/KU= lCR渐6mTiD6 ds駥qVr1]$SO;0"NA% DQ^5o.o4REz wl))ɬ NB% ی֭zU \EU׮fNsO@'믥 ڵ{D+\vaYy8Po@Tgԯo@G reեٳ EjvO"NF% +H֙ kղ{D +G>飏6DžXaDp"TrIFv{D+ǺZsVҝwA:eTpT UM{D+KH-&O6]  ,eˤߖf2\F\4fF~=}&@7Hi)-MiQT\S'O&M3ybp+*YF6=o}Orz J/ * .%;fT p3*Ya֙N.i1Tk7d^B4@/_?ukiH\Ť8χJ~+]vOH#^E% 4esα{XUk^͕Znw.@zAX\!+HsHI7l~)w#J\7ի^j׶{'  m(8 %&Jk=Ab,8؁RVtvOQEq!mHĉp*YpͷvOPB\tKO=e>C:|PY,8ʕ[oI='իg44*W*U}WΖ܃dnRSiPiT%]7;ϝ˷[@E% 6;ք_[U\]&m ' (RAS"Qɂ ֯7駥ƍArUn6+]@ZȬmT(@`TEǏKK7(vOQCwG?BV{"BP1*Yc9G t֭RҝwJKN=J%@pd!>D:UzqE A\eˤɓG׮f_!8@d!N2l)c4+@\y=YN {MvOG% zYϤ_=i+PNfIcGiLe 4T`;n#GJvO\6_:T>\K:vb@d! ҀҥJ&= rVM>ݜw*Mi]ᣒ̝k3G{A !}ib{U֠J{sh-= ʠr*Bu23#'*@XJk4ޅPB UKZ>k7d^֣r,^,\)/R:vOӨ\!IÆI~(}t=Ul K={TӦMuCZreP?rzf͚ܹrss#<50T~ztvOӨ\!o/暽nU2oH#g=zT}ь3K4gΜro[\\nݺ7СC5e8p@:uҮ]1>TPʈf矷{F Pڵ#=|8W`)))I'NЎr۶xbeffjɒ%JOO$}}]zO>QbbT9M6*((Ν;#92lTb֣J=?xmF PfҦMfߐu 5jի_Wzuwk֬Y&//O 4(sye{9Yb4tvO8P)+_̛'|gSy=W_Ujj/{Ǐze.?NdňB_?=M r$.N0@ڸQ:p@JL4+#-ZP.]tkժU:v옺wۯQ@l+L>Ӻ! !7LSTdWW\aX/KNËQe.;y,X5jꫯdV5vء'O^zz߯e˖СCZdwE%3f̐nW(rXcРA駟ԡC]zڷox رC>jժ%I7n^}U}7jҤ$@ڶmx@_~֭ٳgH&Lo,WkLO];!zp z /:󕔔ɓ'+--VZUF3gJII7*YIJ%.+NNaNNǀgbט7ftmvO#x~Qq cBW˓F2>;q &{4mݓ*W\c@Gɛ+V˖Io--Z$]tx\C%Qi)-Mi< p'*Y1zTP ͞?P!T,ۭ['Kҥ=GcX~TlQP`Qi<b7qa=wzT_gY#*YQe4}RvO1z8~g{dE/[F{r FdE̔)җ_J[JSTV@xx5!پ]1c ,hՃ J%ٮ41#LT(*Ya=[ڴIZ^:UQAhy4kGK8TQdJI))҃Z~@`J֤IW_IRժݭ{PGaT|ҸqRVaߝ7$| dWHLJ|7D  8ŕ3[--XGcƂJ_K=& &kglNF \NF%7*WTBdnfTVs V=UXD%+/O5J~ۢ0\+@ d &{4mZf+p-*XT-~[ZH5z@m|>!4zec< Q7WY>3 V>_Խ$PD+(5 BG,WIp'v }BGrAR[HӧKO?-5o7.tV=X_?ukiRƅB b+ BSH_~)m*ߩz%箆P  cV@rY8HqԿԤ9=(NdQD \dli&iz*qCU\@b\biXi`CT\@L# |~']p3YiѨdQ oHWKVIk[pѮdQ+ pHÇKYYRnq*YTg e :T-[T͚5ոqceddhΝvo߾(Lk7g̈T%*X~LSn,*W @~խ[7wYkV||Ҵk׮OK֯7gƍm PhB\D+Ho~M8ǫo߾HNNM+77W5qM6VXT$;vА!CԮ];ӧfdd(##.uU:tФI/Fz\.7q| ֩^^(~9ھ}ԭ[7%$$hҥZj㦛n 7ܠ|4uRvOs`CPV@ʑT9rD6lPÆ CFwP1bκ,++KYYY!}wԯԲ4fuC.\ uY~~Mx$'N{ڹsꫯk $ӧOWbbbX_c,QҡC޻#kq!4DҬYҳJ_nN٧J4*XR~RJ6 Qץ DIW_IRժQvU*B% b+ a.=4nԪUp\sǙ$DPQ^]q4~|*W1 DЌ֭ƍRQnXJV@ BZz1i0](|AT*B% <IJ#mPϢ+ҺuҚ5RZb^XJx+ `f@ [HӧKO?-5onѝ*Y T D"'n-iR,p4V@ DSH_~)m*)+kQbB}?HcƘZrx"@%]5ib@蠒B *ili&izB*WE% ={coN\كJ8It3τpTJ؊ 7fVIkWTJ؆RVԭ[%oLʙd- 3*q#*W@% T`J魷_ FT܅JD + P|sƫTW oDʝd@T@cǚAr T `@כ1kԸqWr-T bX?nTEʛd@D~Lhv=_BW5z!%JcJiT'-\[=@@ NII-[JcD% ,A gIRj>ɪ$*Y&V@vzJ9RJN.ID% BFIҀҥJ&$+C% BB $͝kXNz TRXp޿t-ʠA#i>K5kSJrPP/V-\,@% u4l.݃ Q bֈf%K\!d_TĤի(ga@9zT=(@ĜkS d$X@ !1 6 JF}l,' F@x+,1y+mS6JF#>  kyPq!c7]n~}iҤ(Jc8|3=ZuٳթS'yQS$?Ґ!RZԳgdp9#Gԛos=ek3_xۥKjӦMZd%I+O7ߌ'>$ih@=_ ,?ڷoV͛e˖ھ}{]t.beSFF/_ˆ xZI/,M*]zifB% K@~խ[}'JLLT*gӶiFAG@媴i@cG(8g2 YԠA2\wވxNO\6Lz=P.*Y?F+V{l<ػwoIҸqꫯoQ&M$Ҷm[=/O^TT &D8Wۥ{NZ΁Q ?>SIʕ+r2/ TZUF3gJIIuWFjd]*!ѯԸ9U **Y"U)J:999o aIi{5|Ԫs :BxRf-͜) Jm,6"*WoVѯmG B BffkHzIkK7JII 5RgPGq4a*p9ރ,b@P:|X۬~L =T_A% E bjVsDZcmE`6A% @#>|>i͆99d@U H3\m ]vYg]^!*@ @`!VTv,/p*Y*>/ @L ru4nt]-ϯ&r#p*YD q%}4eüb, 0B 6I={JEEҺuRN֏e=CH@ rI3gJ;JMJg B1S>\6Lz=a`*=H}'-^lWP.*Y B\I&picne @%P_ X:yR1B̔ѢEfmTG !V~lsСO&*Y@L# UIz}{jդv"0ToBiT/ r tZ2%|*Y@!^b*?_CziXiZ~%.BOxQm)vVwl, fxI+IZ@jVYS!| , WX*,1gڼYj,@dF W=ӥ?Ε;xpW=$iW/vmiF)) )3Ap%*X[> TF% V@7 ruԻY0AzQ T nFjVsDZcmY<D,'!O3GF`NQ\AUᣠ@zi s .ЌM^ !Q,W_]w2 wųP\˗Kf$;dB(թSҸq]wIb<ȌB% p *X%_/M*]1Jx)6I={JEEҺuRǎn/H8, B\|̙&p4m*>@, B1S>\zA #0#YBlC K)vNZԯP!V$8RR]lBPDS'234G֏F% , Z¨\ KCBF% W=${U3{|kglJ^B" IaT|>idKU+s]XJu R¨\K=zHcǚk-`z]&A 0*W۶S<(X!unldQ `0*W`ԶTCDJBi`OsMRf, `Vcc)=]si\_?~dCƪ$Y#%ծ-m(%%Y8 | )3A , Tabi)5CǢX aTz6&H>*UWlT@ru91ij, yT{W XaO3GF`n.\J@ GAҠA W6HG`F@@*D (O2e6> g؏JPi>/ Hv6o]^x4n;|طo_dG 6Iҗ_JI?LD% (+ :tH'NTƍuu>}L8Q_~YթSǚa067mJI Z<]ظ@ K.D[nUJJJ#55U s1:FyFVF% (@u%}?GU||VjTTcvsモ/zp6w !!YA;wVڵ4ڵP"\I&pٲgNc$շo$''GӦMS핛F=b sIihi s9sZ,mTH$ddd(##.uU:tФI/8] 3|i6|yi~q,8HtMQbSgߗ`~ԮbgB #DQF1B g]H]az|Ҕ)RN…R֍qTm…ZpY4w@믿Vz*ӕ<./+ 'J `9*YJJJi"o,Xaӎ;tӗNQ) ,W{HKfI p0z_ + p7 *WkHzIkK7JWp *Y B{> Tm[)'p@?XKw sIawo1aR8ظBXPںq9mY4F% |j>gtf7\d p07,(04Ȝjqcg Zظ.F fAꫯ{v2 wE`7*Yp!V@\˥dMx, f)i8鮻[n1_s#T"T,z/eeIKSJF T8c&gOHZNѢp !Db8,8C+O9M)v E% F1S>\zA - B",ǂ}'-^lW T0aV$8RR]mB *Yp˂ɓCIRZߣE Fd`!z,\ KC @Pɂ 0W=${U3{|kglĚ ! ¨`!,\|R.RV,@% 6 r,\K=zHcǚk-LAPBdXPڶ͜bAi {wfg(bֲr%I HmJjI99JXP*,1o$5kf|bTaT` V=ӥ?Ε[PB@ V=$iW/vmiF))ɂ@xRgBD |K&H昏B% cruԻY0AzQ 硒 @P9Un5{;&^-vȢ fςIsH7h6%|*T&rUQP =4h9Ն R#{B@ 峨rWfW]&gl^TV@Ecr)9٬dg>*Y$ru4nt]-ϯƺCPB%P,Zؿ_ʒ֯NF5ϣ @?M="i:cG f/HӨ`rI3gѴ9.D% ĺ8Kv5?vT|Pz=aCf(DbXfQjvsモ/6+ITP+ ʂʕdGJ-[*Y8$XT:yRz!)3SJK3{ha͈dATbE~0#;[zyi^7@d<H`C_^Z5GvbK{{B< YTɓ.]V)v  ,Tb,\K=zHcǚk- BgQ**W۶S<(X!unlgSX*W`ԶTCF%+&@ĢUa4xԧ9|&Y3 ,ϣz#K.͝+D,O#EfԫTqlgHɟ "E, ҄ Rj9#'JVUz6&H>*U!')ru91ijœ dyv‡'͙#xP07\J@"P媒ᣠ@zi s ƍ- ",rWfW]&lvJ8cr)9٬dg>GPrSYT:uJ7N.[́\c͈@%U`9O GKYYԩҨQ<Qr$/'̦MRϞRQnԱc"gPr *W>4s MS>@LhYcr5|{I Z0# ![QSoܜ%Vo7;ibSyTy"(֮ׯLޗB"@ ={hԩҥKqӦ2_PzeeUzmۤdSZB4IZw0-\Pq.g"ΒUWK.7SFff}>eddh*,, ,ڶjՒrr+?gq.q6PɊ *8U6mTPP;wVxWR>MfͬePɊ8Uh~7q $I{-n^yE;WzeF K@ T"r6O=|l6;vLO>nv]xᅊ#G4p@իWO5kTΝ9y|ϟ}Evp۲e-[f͚jܸ222sΠn&y|xDֿ/SM6U||֭:hʕAsnݲ 2q ș"|ַo_-]T=7o׿}tMow1uY?~UӧcǎOuE5BlJ U?WZ5ƔCiĉjܸ:}A߶Xݺug}ѣG>DN͛GnSbĉϺN: &O7gϞko>͚5K裏ԪUyy<>%xDƞ={tQG 6TAA~m饗^޶s/ujСeų}X ;;'7uӗ?~׬Y3_vʽɓ}|˶oZoܸqyl|I$#=f:q///|[lI+AvѢE>I%K:u"1n yW||[liƍ³.۹sz7ޖM𼉾SN:ߕW^Y{DQ@LK.UժUJw͛7+)))JII9}Y-t뭷jŖylJ|>O U^]\rIH]t.beSFF/_BƌY<>g:z,Ծ}{{g]ּyslR۷o/>?s=jӦ~h;vâRyly8K]vU4i$6N-;vА!CԮ];ӧ򼉾<>l+i2믿c'N{ڹsVZ:񼉎P@xDVI}*???uz !" 6TJKOOWQQ̙sB+ԨQ#Iiǎene˖Bȿo{ٳgtcs2 /#;8Β;vɓ/KOOlٲӗ:tHK,QvuϟwyG999<TTTLm޼YK,Qv^=y|xDց\vI-X@5j8#܉JVϫظQZFFiĈկ~W_}U֭[:H:u?ѣGuѣzUZ5M6MEEEOB}l㕙kFwz뭷tuiƍwoTڬYtݻW/z믿^4l0%$$o߾zW7ߨI&nI_|Y;:l٢+ƿw4o\_\͛7O 4Ж-[trzH3fP:`D޽%My|xDw߭~I:tХ^}7Ў;jȑq׈kĈǏ~a%\^/%%ŷz곮ӱcG󥧧j׮U;ڵ+Z{^M}W_}UV_#~hy]vOߏo|}9%~G_~|]t/>>ױcGvXϣ>kݺ/!!WZ5_ƍ}۷Ϟ^(<>+Y TcQ%r,d@\Uqr+Y*W 8PPJV*W*+JV2WLAT; |V8?a<" 'W%BtWQTIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hdiff_idiff_tolerance.png0000644000175100001710000004763214266763645026175 0ustar00runnerdockerPNG  IHDR XvpOaIDATxy|Tw@% UPLKY*i1$Ƣ`+V n ↭UR%qiR a <1$ə,9xh9|p2sM3$Ca,Z$  ab$W4a HY0΀D !!74}&Rn8-gԿJxE:Q'[_كD5P+rr'BX*WuE ;Sp+Wu5@N0OJ#U]hJ/U]S%U]?Y]TIrUW$'%gA媮HSŢU]0*YY\˺"Q̆U]JE6U>QU]JfT7HT7rrU$JzWr.HTTJA.gD% HUr>QU] ,N.\Օ"QU] aT乬rU{D% H +Wu+HTDrUH,a.\"Q@.wJ`#@¨d\"Q@yrUD% U] aT\"QrUD% U] aT>\"QrUD% U] aT>\"QrUD% U] aT\"Q@jrUWD% U] aTW nd^T vdTL@dJKKS^bz{*//O[VVtWj׮]VN 7rUa_g>+--M]t?ϨQQQ,kjҤϟ/0[ ը\5T:/:_<_VVja*--m!yرC7oV~$IGV^Wc 8΀D`߿$i͵5J;wԧ~jxpząk@>yQ.Pч~}XsN=zԪJ@x:#C_lGQUU233},|l߾} `@"8|~_?ڵkƅǎ$5mڴDof̘kWeɿyq1q/wq g'1m۶ոq~'I>6|0[)9CR1c4c 5iDS4}tLGQaUqbèEzA'?Q-4|p͟??+EEC8]61"IG+*ի `cA۱"m>etxCAAAG@gzxa 7!%Y~x5Q\b$Je8+$ A% r֣8P\fXJƂp`B C% r@`/*Y\^gJ'2Ծó p pYB!8#J'Pd:&oQ8Ԡs"⨡[8< ԡ"P HR+4ΆBHN=H;q!acAƅ$r dHg=p܉J=1܇@"|_҄ t*==]m۶СCzxbٿ,@|{PM6xg@LٳGGդIԱcGUVVرc[ni1̙]:ֺuk& *Y %N$b+W\Qؔ)Sy@F}5"$*Y``cA 5nX:uRYYY9z TƂ!H_~JKKsN͟?_.Ҙ;bjJ;vvaƅ?=K5jk…Qɓ' 7o"uɉуJ\ QL:Uڷo/_j}WQS7nFCc=f~s6@7nۙWz))#v矯#GK/ Ȉ!Chz7lPxIQ矗2H΀!77Wzo߮={uN:O>ӦMSFw9J "rlZC39< jYl-[VXyyyH;&)/]v]v1vʊs,1sҰ)H)`8x`c'NҥKլY3]pĉnwСz]f u74p߃Xd護g@Lz/4tP}ڿyT-$I3gԒ%K{nuE4x`]r%۷222TTT'|R:u}ݗd\!*W7;; G}TV˖-sjر _믿Jeffo֬YԡCJ PNMSXXX5 N`uS<ApEz@-aD@d|?~W=@@p  _;$Kgh= g@0*Y+D Ծ.tHIhahR iAP#Y>*|^yDB% bhFPg@hd ΀T/gC "}S@ @d$6Dƅlz>@DP`K ^ QT "gW/g|$Jy m֯9'32ظ%/қZtuY3&B~M/H{;<3Jl\f>C/$m],ed8?7T[qp:`VoacA޺@;J #N`BpHv)T".%|N Ne~۲ mq "@% =6M}if[H*YM0`Rƅ`/ѡ&MwVH`&  q!X+YU)-[&oL$@0 !gC ^Q6|Ԭt?)p*YhY"tX% Ƃg@b,M!nƅ_Gx  d@mУJ) @L WP{  Im:<@/ LmQٳ^ڴI\b2q!.,te !ظ@PD3 W{i:s @ q!+H/5mLBJao/vh"t/X% _ kOX% E\> ~ƅ&{Ի@+"/نnIvx"~F% ۙ-xP3 u*Ըq `TMk yt[oI;`6b^ (ظ[D6K҄ 1JT3yٽPҤ-[q"6.({{t1yE g<TT8Ҥovp)E 2*YƂ `,֋B X%ƑÄ Y&~`yS0!JxExXR`.C`JXEx_ѭ&Mn +@DF% @CL|f__CO=%-Z$=ԬY fJal\FCc- } q@ldyIIEE8 vbv63!@04G۶<<3 *Y@ @$JQ*W/ıJ&篪" ɣO; '=T f ֠GΖ*+lg֡x Cch8{ߓn.*LZNzi ~ 91Gi„ :smjСZzuL/++-ܢvکy1blp*YwDx]PVGқoJwK@ &٣GjҤIz衇\4vX-Z(}kjj4f=쳚2exD,Ǐ8/_|XBCG=z}و-**Rvv eH)%פY2~^Kg@bԸqcuIeeeQorJuAǏ?u]vӪUTUUeKQ#_`5H_~JKKsN͟?_.ҨyFj߿*++}v;G܍JzQ*WHӧOWvtyiƌꪫp¨)))QfffceVSظp^ QL:Uߴd=Zꫯرcjڴigy橏,I^W{mhXih(?|9R_^z%UTT(''GѮo֬uǏ?qA% _k-[T$>X㐛[oU۷oWϞ=Moz:v6m222j+((PAAASƅ"ys -lԾ^l2-[ֱM8SѾ׫օ6mRzzz?>˺!x"F!|<^_CdqcgGex8*X&Pr~[zE R3 &nV}:t>l߿_<󌊋E3gjɒ%ڽ{t")@nAڶmGyD՚={v UP?,h!jhwsH|ԣ>Çe˖ܹs5vبmܸ֬Y[ ,бcԯ_?-^8u#LPbƂ]Y @іtBN@d>GZq!P (o`Bk1T Ug=jj A=TDQ*W[JCIv9?ăd!HjhH:HEEy9<ĉd!" 7H*t;RΏbƅ(tҎҟ$Mh `BIQS#/?.m$h, !xE{{4j$gK!*Y8gq:b,x  b,xAO@l,XQ!#@0J$Jj۶RΎv ࠒ7RZ\/tw!|'ࡒTR+iT)?_;6;>!8 `'E\+I7KtdaF\l\'DXLΖ8#T4  ƅC {{n-͝+-oXjdZql,8iͳp:JƂb,$"*W@L !0rUU%88fJbrg4d4a'B  3 T^}UʒJKr0ĂJNrUS#͞-]q4pTX2+6.ĉkBO*5W}P ƅ۷K]&UTW]l!^A%+XbXK1B**"|@4DQ HOzʁy8b,bcA@%_b\Cq?DXIO `5*Y@s@Tջv5c;qp.!؅J7D\`4lt%v s~D؍J;5P ;~c魷|}@ fK* T?Vrs |NaBwao2iSiVgOg ΆNO{{ (J(*xkT`,g% + d9#*W@ X% rH ,k5P*/-De*W~(+tó :TCO pբEh.sp>$4PnMzkwߕusp>)nƅiǞ='nrp6@=p;6.4O=%J6H xXg? V sc3ΐMgČ^UX|^JV+@RjrUY)򗡥vGk%+էJK{Ho*WVI}J_~)m~ T\<)͜)'}{֭RΎHxuz8 HI< ͘|AG?2 !RCH\M$}*û78xaY3cGg؆~JV{{tf,p:VbcA,[Vj`+@ hRqa  8_"+Y1TF}Ğ1GrC,Ϥޒ23[lє)Styܹ}xbٿ@dP2 i\iHW/H4(O p751w\mذA&LE]k…wիǘ3gvZX֭mdƅ1T˥ɓU>iq?[ &.=7qX~~z_z|ѣGo߾v ֲj68gx޽.Bm۶-9z՘_D7.co&M_B׏ h$Faj۶mL1bZjt;V;vyBPd%5> 8gyF{՜9s.==]'O>@ 5o< 䓘n;m4edd:VPP??$-R%ĉ?fٲeZlYc)? ?~\999ھ}x ]pI=ޮ]Ԯ]n;|eee%rjWu+UTH>K]f.**Rvvv&*X&7jŊa[ޒĉ:t֬YB]~ uW4};R]/ޱӧO׋/9rƃ'N$͜9SK,ݻեKI=D.W***ғO>N:skrUU_jMm I$iZzu|zUYYL|͚5k:t``8Pj߶1l\4ໃ[;\ XI['3B~^K׀jT$8Cz(@ @!iij)D"*W1t?B.ʕa , U @?,i D1V_$>,@ hb\jr_ͷl&LHRc i4)?_ɑ6m?9d@:A}Po)q!.=yG43ԝFJ`o=SjdAlH?JbcAGGd@`@ob\uX% ~*W*Yk+WUU֮P"Xڳ' ͖ *YK^Dž毽&]{ԲaԷͳYUW8^cfϖF <>¨dop& &N =[OSĮUظ|^?/m,4js9Jx oY7NjޞR,H x7LKic,$_6@\dg@mb\<)_84QO [Q:x0=Hk?PWc,p8*W+M UWKo) nh*YZTre҂ҰaR׮] QPW"@Q ;CzmcGf*Y*T \;_/կ'*Y%/)mBH ,p΀S#330;;gCv'q! @ )Aıʕa@ J8vrU^./)6sT1\V$}tҡCҋ/J{<" ?GfSpGJ'i@ysPɱy>ĆJ؊VrUU%vtR~qԭ!>T6T Yq0 + 'ni]J؂3 8+WL 7D*Y`)΀@"Xk=Hj♀xy  < `cA\J#87< wŹIg )UM4{b3vG &l٢)S /Tչsgi1ݿLrڵk͛kĈ***yj @\>, w<`*Y|UL̝;W6lЄ tEiZp]zxߚ3F|nmV<Bu 3 \he+UTH"elSX% @Lu]zgo|Ա|[OGʕ+jŊ͕$G5k}Y|)aҢEҏ,]|;98$"gOeb‡$u]^xm+WT4~Sڵkl,h{ߨdH߯1c(##C+WTƍ޾Yfy?~DƂ@dp9V\GVYY֯_;6xL;>cL6M JrV,l2-[ֱM?m߾]o.קO_^555.DߴiգGcJxvs*WRAtmҪU6,.ӧO׋/9rƃ'N$͜9SK,ݻեKI2p@p O^]]ٳg;O+նmWK.-_.M`lP"$iZzuƍk͚5`;vLŋճgOF% ͗/~І[Hol_Qi[;\JW_I?CբER6> q g$/yX ,Kbo3B;oL@Q"` 6lՊ؊U8tA֋tփW(! `jZ T، TB;!o6 ~T؈U$/{H?!e4İJ@$. _{M W6H6aB8QGM4{4z4pTXHjL TO#^`媲R[bfTxną~|ǎ&]glxg@J"|Z%egKǎI6>,S %X:yR9S7NRiwo{FWxp$Wz=i<7>  d5 [X`~Ү]g[4xu!Rׅ) ,XH%6{Q\+@ X% p ITVoa&3*Yk@'%Q:qB6M m,H, X pJ{|ifn HX% H)$.4mk&MuA, (\؎ `$*W!=4rԫTTDQG*Wt=ҽJ.oolJ(*X,nݤ}ϢQJn,ش)G%   ?PlEƂbB6 IV6nNx&ud#JrUS#͞-};ҟd\kQ,*X@"8q4qk2ių*Ye @<|V)7W^}U2 g0CHcD U0EBC>dI!Hr_BVΝ-,VF Ƣ=&Lz΂A% /(Cf!Du *X6ăJ3p$7 "DPQQYf/W6mŋtŋ+--KrUZj,b, *TsQΝukڵq?Ɯ9sԵkZZnm̀Vg= C陵3 >} Al\DD 33S%%%:묳uV/=zktLg=**n{N6MB gxd@"hڴ:묤ѣJOOWƍ- J2|l&]}塥vUZF#FPVcjǎ aIr|ԯ_al!|*Y)Azz&O|*j޼yf|%ESXXX5 Jr={\.np Wq5y-yYPz5kV $+,û 55Ra!BqE7%ʕ$8!j(^-ic|XU#T-Ѵ;R&ISd8acAsd  *W,xD)Db_~+dc p$+W'OJ']yehyݚMdCX bYi:7O =,+M UWKo) flxYB!p*Xp$+W!-X +>F% .FAjYgI+[oI;Z3*Yp!*XH 7U*.:wNr&J\3 H 6$|,bcARJ\XX bBΰrvyu#XTB˂ʕaH< ]z@QB @` *W=}If!T0=,^|Qɱh6P[{t, pֲh?I8Pj\*,$|*Ypֱh5k믗n, ĆJlF ְpo/^~Y=:RJlDArlۣQ#+;aǀPBX@ 6ƅhߗ*+ 8U`bgA0Eh.*YHrUY)ptҍ7J?PBX YtJҥuY0H-VB8, VI}J_~)mDWd!NhƍFnzf<"Tjhѣy^22 d!|͆9G6J@A PBrp , E#G,,A **W˗K]H5c@ƢՉ1cA,,ЃŢ޽i`4e  FfKc\BߖFjDz| !$`\͟/)%>@d,X0#Cץ퓘 U _ٰQ ΀  ?r8*YG 6$cB_#x^`.dQ%YT̑F:t5 \J WYtaW_fϖ~S d k,мPj"@.,d!$1x‡aHOTUI&I/`;*Y#X%҅}gffJJJ!Cŋ'|Rja,[@v[cgy$رcQkRi馛ZH -ZadDH-7WuǏ$5p:#LvݦC_TdѬHZyyxB\ǽxn܋x~\PYgegsn Gf*));>g}&I6y{ύ{ܸϏԋl\H\׫F}r۴iգGӇ5j~iu%YFTlHgCH Z ٺuWmu&MH{9]s5Zbrss%66޽F?M iD(.\2۷<|&O%vޭ.]Hrss5p@p նm[=#ٳ'jQ7PɊ $lӏ}{D_ƍf}Z`;~iٳmAaB)*Xpz gƸH$1l,qa| uEX0QUU{G;vTf4`o{U^^ZnVZ+Ԯ]% o6UTTh֬YզMi1߿Lrڵk͛kĈodŋ~Ҵ~{-[hʔ) ռysuYyyyھ}{Lucd^7裏4a{JOOW۶m5tP^:zm[~ 09M&O+Wjԩ޽/^+Bo ~1bu}I&? _ַ ?7a>Zhq7s@)--՜9sԹsg]|Zvmј1c>UXXݻ7x@$͙3G]vuu PsՆ 4a]tEڿ.\,W^"ޗ׍y~xcϞ=:z&M;R?Ǝ\rK}<ܶn2 @kB>y lڴɐd79uرcFn݌AEܹs I͛O۶mѸqcc̙d<7f2${:~QRRbalٲŐd]ڵy睧3f誫… 'd^رcjڴiՒ;~/bs#Iwyg_}߿~GѽkK2-엗S7nFCc=X~ I&E-qԩS}i媮W_}>qvظPR΀`f͚f?~')"6>7\{:묳oX2gs 2D ck̘18u[4nc׍?|9R_^z%UTT('''굞qv"=VΆ'hcL;>ֱcGiFM6M辈MM4:uґ#G ɱ㹅xX\GVYY^}՘y8''^7Ֆ-[^k',WjH>}}zlڴ4jH{֭[}lӦM:sղeK DH g}vY5"ԧOM6)==]=zHdf׮]~,pqhz饗tt?^7H׍I)<;rUWnnhѢSǪSOiԩ$_w˖-B'|zK&Lpc<7x>:/QKIIuĉSrssu jŊ1fϏg͚5*,,jkƍZb dz;^7^wĉZt5kv*( `%+)|֭[WcxQ]r%:zf̘&Mh޼yo<,s|[gyOukÆ J7[q[pʴo>=?~.Iwܡ M233eu!*o:uz!Ժ`9lĉ&Ey~x몫_|C3ϨX>.Iv\RmvL?رcƌ3:hڴѯ_?W_uaÆfOnZ2Zha|7v辗ssM7\pѲeKI&ygs=_|w9L޽0 Ø4iR9rĸo}[Fzz1l0vXOSO>FFFѤIsmf߿?5 _E&5y~xkٲeȑ#:gqo~9rjժZsŸe3 .\Iϴ$E\*Y )^ OWv)Wnr Y%{',o*W2T@\d?Ph%+Y TyB G*Y TyB H+Y T빴B +Y T|r8%,g+ u\Pr.PR/ŕ,+}RTɲ7P+,+dY@\P%B .*Y*W\J>PǦJVr_6T TrE+ ,d@\Hpr+Y+$PɊ@\hHxXjT>.JV# V T !- +V- +x%%0gjgʕՃiZ_?^xab\+^!1a4XF3`̘k7*ii𗿀ͦb ѱj!jB{G7Y-_^ H I%Ȫ 7*i !wk|V]i !wjFdUWF 5w$BxfFVu5THK!< >Ǜa%BxVDVulR32u DZBannnYUDZBaN.rDZBa.rm"BKaDXuI%pcdU{F U$B9˽ DZB^|κ'ªK"-!p#THK!\GȪ.}HuL9OUDZB2FVu3@UTQ?ЦMZp8lt?Ȫ.cHCcĻ﹧Wx&22^xpB ˘Hkxڬ_s;v3gjʪU O>!<<+VTBDU]FP-*gsYF A߾ճ< b|7FW,eȪ.4GZf:a}R*  ((s~,?LbXZ8K9N3u63fͬ'6ڵ>9cȪ.4Gu+am۲m獂zZDq8u۷HLθq秙X,JKKK/t]R5ʑ#Gҥ 4smf}=c9{!7BBVb4(..ֶo߮mݺU{>ov-F֮n4Ioo.k'~04 77W[fek͚5Znneˬ4smf}=5dhZ|v+U@u~TV%BG"LHLi !"U|{H%K" jv-sDZB*Y5Ht[w_HK%U\HJR}$G"fҧ65i ;$j6l +V@EE~Y"-!DV- _? -[x>Y6P߅,]ڌ C"V2`mͼDZBx.\Ƨ h8ͼDZBx\ʧY"-!Yii呕Ey=ɓ'),,t`$HNn$<$r; 믿ꫯbq8̚5^zU>}t`ԨQǻtÇ/U爴JU5m֌B%%0>XuiF ]t ,>/fٲeշiFII <.o0a F!U$BY4 ߟ_gyoQFպ/fu]\[,Vp p4/em\@0lZPi ;LOH#&Mtqi _&ǐ҈ky'EYyi M0e l:X"-K$8@K>̠$L"+% `&(*27ʣIi.}0i o"Ǔ PVfp!i O&א \^ 'DYyi ͔Fvѕ ,Yyi Ի7tnH"-afYy-i -ri 3ʫIi}!26o6:$f"דBII&FWR$@ZhN-$hJi #HdSBb6gDZBOYi 0p:0FH%I"+% Vuvzj*h4B"-Y4i 4d ޹J@"-JYK"~'T{ MDVOM& D'~~|>N3;Iuv<ھ}Xvi4{0>CgiegCB|sc_dKNV+??>@aZ(+3yP=$w5/Yy~R'O@tF"]< S@1XE"+OAAFWt@t>7MrLi1r$LDV^Q>1>}MFWb EZEE;C;w_C뤤Q6FW<@ pb2o2IUZ O<i-ۆHduWƾs3#i `+1ݮZ+-Z?]II1HRȢC6Vy9̚_ =uVVzL`t%-# ۶]IiUV3@N0}k_$jMxѕ4X,DEi+6GHWqOlʫl7JVff[1Қ;WS|7"OXT]9"JZNVu΁\\On̓bxYܻC'7ߨړI1Сj6Ю]FWbB.,3gWWuV"X\OL]H1LdM+#7T똿M 7I$)gϪA)FWz@L`p(({Zi<+1Ԭ_$9VGnFWz@L @QH#i}!/.9&"))Q+q i &q p:ZhBp!|-1g^p|VZz_at%! $砌BHY ebuԻDV>LuM7:>lt%H̨H\‚}{c˫Z_@"+nBiR9/bc\C7x-Dn7NJwJ(zLW5)J\K¡Cjکh}Ŭ^K5m_8sx;,L&pDVl&.J\KɄTCF!Mq#Cx̝+LaZ~}?^)[!/PxR|:')+1߇?+֙e^‰ٺC"+_en~FWz@L(4T͝jt%m:Ig:7a=,t 9ꢉ4&i &u뭰s<̄_WWmpV+^`@Y'mۦ& `t%! Ĥ:ta\pip/{i◒pb{Nz'$~bb&Az:]yu<4\ye3H'/ucp'i &ֱz-[ft%p ߿pueߡi;̩SݷxCSYFWbÇ*=#FZvR.:JT ӧO'$.**"++'ORXXh@uEmѕQ9zH--Zy-+Y75Mf֬Y<dי~4}tO΋/T1ԙEEFW~'{U릸Ts#-]Jn{W2MfbŊ4MDy T]}]_r̘w GqGEZ.ݒ4|=V4iHN$ Nddd/bV^]wʕ+ϻ[ɝ_|Q^,;\} y:찾Hkjqetz]]qco.T ba~Oѣ @XX.\^ғn3Q_ǫn"?|&Nmշޓ' 5]Ia5?vrrr4eZ܆ Xf :u bЫW/4M6JVVdddsHLT1nt%7(njQN8N_~].hxc˷i'==={;LL3ٱc?0ӧO.ɓ;vx.\HTTՋ:3_нk мFaFTѕ!U;V~eŢEwԚ ^}aޮ[%xc #7dРA 4輟_uU$$$]) jc5JKiPR. fYiTҚ6YZ3fdmoޜ0HJ{E&M3M.oRYit%g<> hꉁnS}7ݶtkYUsq%x%KO퍮@<ժNOMU$szJv\t-j.dϒ^I8@<ؐ!wN+iyXW]ײ:"-Yų,[ J# ă4S(ZΜQk"Ƹ(Ғ_ Z^LWS+i;飼ΛAA:ݑUcZi/H>]nDx#l3}!٣.'UWd՘VDZs\tѕOPf[hB[xuY5)JK뒘ht% K 'NO?]׵`ygFGViAUsakת⋍x 9eQ(mN2Kd՘DZ'둔dt%! ċGEz,XVfH/x׫ˌV>]-|rY5f.[sm,YX~X׎]C:Ua?{u9zf΄C]R|=jLH뺓-}.Ӟ=m9lѕ4/׭맢7xI_aWUvDVMSi͙ǗNիdZ$' 顤Duf,W)1nŅId$)I7;*:E;-bn#_P_z:11FW9>}dM꿽H5k;pN%r_>:5CQ[jz>۴1aRXXӧq: ޞsUaŊ(*-Ug_}5}v&Z+?Ǹ8+,i <̚5xZs=,YĠ*=_~[3]ѧ v"n]+ %5U=]g1MfbŊyw9s&o)))2i/XQf<~JwzQϣh4N:I@@v )--o߾t҅(~Z2lo;tf]DVhpdb]ImVi>d SSS)(( 66gV [,JKKll6/4H`3{ ڶU׸j w_$jͦF8J~WXXș3gA3M@6l5kx ypp0Nsl6vZ}j%++t222w˽T.yHde "V.U#"D4Ξ={Pdi ;vfĈ|w;v ,YBXXW^᭷",,=zTpM\\111DEEH<ժ.ުIde*"V-yyLF& Id[E<<ڲE]m_?+.@|DV>jV{hp/ד$)@Pl zXmz]k$9 $$eo]vupNK$Y33]QoW^sux+i @"+g+a&4 RSa=@DVÇCAƝ ڻ # Hd%. &Lp(֧­+G7J4 7pwdPu:=ڭHYf TG!UtS`v!Α$-pMp(>uc]Yi L"+Bmڨ[ iVJ p?i H"+p:b}nS'6%i$.B!JIc8JO@EEEVYYfɓdee0˭"0.]3+Hk1L@RSS3f >yeffK/īٳg $&6A=pƪiULET $&&_~ 4Mu[QQ^z)3gd޼y)Y "WǘNUj%~ח|ȸHj=v;O=?yyynX,zzY KH/2+_M<#E#b`*CV,!!0{+i߿tYϤo>>s O?eҥY#GVpM\\111DEE(!0{CK֯Wu]vY;Y,-˜1c3y2angر}QV˥_6j))2o_͛:FۼYӷoP5Kk@w/wnfאJx$uJc먬Tu~{~ً"-jY /ҿ?k[[֭j02#i $JLTF}:xY\⡨4WJx:#Øgd@@  H6@ZK"+Vuvzj*}^ө;u*bi4֐J!CgΝ~ q$r9i -!1~~j~~]:He4DVG .ou6l6.KHiO_rJuDZ& )$#!'s~Sq;HŤ4F"+!d'9&LPӅDZ-" B$\턇.H5pavZv 23vuG"-h N׿+% =z@*=4{=zS!| ! 7lPM@"+! kBYY۽vQGZ@ooUId%bݺo SH˳ȹYV4rDVBBR|,/r,'%R0RsUq1?ϟU"+!LOuнiSo;S)xQep8ϧ+gVp^cUĉ`ѷ\!~:QBJ3}%Hjj*cƌG=B`Rѻ7%NEL C4KYT[~[h|n~FWVaϙDZj 111TTT~QKJO9,eUXXHffe+33B˨Yk3iڪ IO䣏 +:"MBB0@L@:t@dd$VkΝ曄WsOskݷ}Ltr˨י3gp:FQ/fӌ K/!"IFWt>SעT 7e1y7N'X` l66mKŃ2n(Boٳg\:oʡC !""TϛYk3iڬV2+r #p:zkV+vg3| LX4uxml>ˋ/Bp0,_kt:yGXr%۷og޼y>| ΄)k4>p*++ZX,̵fZ(.m[+N^Oӽ,]q1AĶmj3Ly~c׺uD>#KJ_=tȔӧy'gv233>|8C !00P߿?˗/gɒ%n?>ǏߟzVFf{JEEovɋ}DcQ:s& g N<4vVZ/` 624+))oߧcǎl۶ 60f&OLYY6l`Jtt4>,vҭ5''';Э[7]*{%&&'NzZ?ꫯ9k>}0c ܹsٺu5۷^zWRVkuر#N2Em`{-7772m4N'~5Bڶ%j-}~j_KKHv6Lh4ՊiGvnԇGֳga#Gزe  Э>PSWS@@@KYYYٰa뉍"iժUoת YCu֍nݺpIQweɒ%|̜9??Z̺#Ff{?k׮DZcǸ+ ̴2Sn5d#s_o銁ڵ}޽<=J޽9qq嗳sNv;۷ow{,ͨtRXXHii)eee V\bK.S9**jk׮N|Gwzwyy9PVV>`*((paڌzU\\L۶m)++trϏ:G7{H3gY !h%?wH gY !h%WJ!_ " 7·4sK"+!M͈Hd% V"B.T%BimE;~\KO>v,<p !0xU;㏱hkèQNBb$$@e%y wIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hdiff_imatch.png0000644000175100001710000005743714266763645024331 0ustar00runnerdockerPNG  IHDR Xvp pHYsaa?i^IDATxy瘐!%KH$YƖ #f|mC:I%D8Xe9Lg/)EEJrb,c˘1f89Ƙ庮<ܜ>3Or\y!p"nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6nC6~W<[p~7= P5gϞ\%5iD)))7n-3gphݺݔ,w ^|ElRJNNgϞoQHH$sz衇jԩ x$΀ƶmcȑ#|3 ͛7$}77ޱcG{uzHk֬W_}U/^Tdd~IѣGz]_=/o> ֭[/f_vI&+ y\<̞=R|+MyhN{}_۩ 6LW.]/hѢ1c*Uqƹ8=?U-3 $m*a_.p]w?WhhK5j/"_ٳt *-*JI_|!-X`;΀${ʕ+]c HYYҐ!CiixK{9 Gz5i,W/)b;RP4l+#acx|( @s['=*~ǧlYSN֭8 xx._Eu"#6m[ ,L9R:sƽ@( Ҷmѹ/&FzU;-@Q@xh{&eߠrewK HN/ d!CK\ט?_  OK'6 a[-/jՒ|\s kHǎIFѣs$=@Q@x(];l`9}~iTG@; v#[Æ҄ _*l ( <^TTԵkĉRҀRfsh'OJ| a.*ť xSjQ@xy̞8je̫J9kXWJsH='-뼯;u;xp8ۣXWKIIȑJ3+7K;kQ@xHCA͙c'@( <Ү]ch}3EGjՒxuY\$%Iqq{;RX4|tk@sJŊI{HgK/Kǻ( ^dkhInVJK*V4%$6VZv+VHIÇNw{K;KCJ.NwpѻaaRZ]@Y~ >\ե6Edvi>n%5h =$3lԺ4pf; ޅ֭3g?~t4x. ʕyvzs6d0܌.^-JƵʖf2-\i; .5 j;{t.=4rt4x ʒ͋jlqUiXI<.iϾ9z77+Kklh; e&MG7 .]AK6AN&NA11R RD$Ԫ%Ys4x KI\~t睶5z" (N}Nx?ws(-X`.I:v죀pѻ={JUN6&LWii6lѻ3qT4`i; P@8UTYТ$xqiB)>p{:zvZF^}U:tv저ph xx$kT|yi`ᰝp%K矗s*e6(ܼL P@8ŢERFQz9iX ip/ B4_EDKp{3gJEJ#GN{Q@r?gϞUT|y꣏>/V@@@'x>jzaFwҶjf4x#Gŋ۷VT^Z]v{ァkL2E5kּ2eʸ(1`WTb;w /ڷ<z'nmĈjڴf̘ҹsg5kUguk; fϖ4ƏϷ< Tjt<sEe1|\tTSx{O,0E_G˗j̙ڰa:t萧c۷oҥK+((H]vՁ\pgeˤC͂j̠ARh35v\Kr1n8{"E{ zIHHЌ3Ժuk%&&ZjłRVw HsUFҤI;NP@r /G:~┙WzLxx tnԱcGꭷܹs]pkפY^ l~uJo!Y΂~\ԫWO?ҥK iӦZh͛7()~IG3g΂ h6uq$z!Chzulj?cƌQpp Kz\)2RjFjvq…ĉU쿍yLIIwP@ʕ+ _U<^2sL5U<ҶmR\$qc3w{wm'jڴDKrpԩnҥKUD կ__})wJ>}c?%$$SN Qt?N^]^Lʲ H  .(44TsN8˗k߾}zwUT)I҄ d:tH5jԐ$nZ7VfD-ZHժU+bo8Grٽ7%Cp%̄m9sN ^> ""B .Ԝ9stu]jڴM]؏?X6mRjjTAiҤIT̟ov8v*=RXt}td_Sx fMS'=\~}ᇥ?6` 5 l1i(IC +l9( ,*Jjμ# ~Z=Za^ O;8aCdpȓ(36,vS)!P8uf,w[Y:,N[Q@ּyx0zמ 93oEW 瞓ʖƿU.yY|Pz5itini [jՒxv^ח ]QR'!NWp92c4@5/r"#M$8`; yCptS@ʔ2EZU4HʲۣI\twAP(/t,< 3zcG^=i:KǎN@( nRB4j$ȏw1gC 3%OEpHNS'IeJfII+WNQ@\oҪUfG~:xݥ2ߙ33^bn\sO߾bbWcm' g4̾KN\Yz]iRiFi$)6VJN6;ûo&c "]d; 7!EEIOެ& ৲GImZ=^^}U:tv?~ϥ~F2uT4x)@TTԠc]J2n,-^l; _Q@?t萴n9]ұsر҉CgKR޶3E/3/J6}-Ze6( YLpѻ.\:v?~${nnRs) #[H{2zƽJӧKn/( ~X b a )5v?~AizFFEHKǏK&NOHIϟUB,YR۷WbbSEFJmHMN׽0rt4OF#GtEWz$I]vռyr=6++K]tъ+4bM>]NRvtYpݻm #]*k; 8\jڴҴo߾[/..NZrz!I:}֭Ν;kŊ<611QM6UBB6nci&!;lE̿O?:vk< Tjt\j*UTIݻw~[ k*==I˥),XCH.ND\\|Y:xfΜ 6CwߩI&*Rk7oT߿ߕ'ϗm'n`9}Z8v'bܸqPj׮_|Q1IIIRMgvqd0zʗYZқoJΝ< $/WK,QΝWz̕+WTxn;(5k̆o,>'=Z 1g{\ԫWO?ҥK SnK(: #*JjNzaI[ ,N#+Kz=)WG2d߯x TREIII7ݞ}[ժUo}ƌnիzU% Ҏ҇N^Æ҄ _*)=D?dƌ'&JOXN( }TJʭ=#ھ}nXk.nݺ>3gdr%U.NĉҪUf4W_3#-[Gs$&&Q#F4ͫq VN:umZtJ(K2g5ۧѣN<urrV\ׇyqޅw)^\ZP7a&=TU+۩/cr0d]pA{t -_\ӻᆱRJI&L%KСCQ$S@Zl맟~R5{leffjVv]xV#W_ujִn/5U6LZD:T9Ӽrdޏ-\Psљ3gt]wiӦ6mv뱁O4~xEEEʕ+ ŋonW9s瞓ʖȿSkM~!~Ez)iRm*11QM6UBBk@pXg={ l fFS'i"c:xk} З o< 5 :t|uhE;V:qvѵkfr_ncI~{ssP@k`A3E#m'9yRҿ'.:ZUKv^JZv0#›4~IڲE?ujFTz56VV6'{( /ws4ț^7ϝkl,_}ev5'iixeeHal'Kb…Ҍ(imۚiRvS( e}IF i"#M$8`; tIK=Z9RںUZv*p-[{\3ey2he; ڻWj\c3fw hQ۩.͢BCm'WP/z*#.Μ 㥞=m'Q@7:xPZѻ3t`vF?^:vv!!=ճ 6P@7ʕyv792lY_3;&o/͚eXB*Uv*BEi"i`D iPyAnr4rgfҶmf9W7 &K?-ݻKO=%!9c; l4mCZNO@ +K6/U=11cm' I))w/Mmnif9\Yz]sqFiRfҫkޒm'n%5n,=$L-! ~pŋ4m'G``t4u4oʒ&O:wZ0#v5 ނH={/ J&HKS@&O֯ʕ ބȆ r7qT4pi; VjT{פ"D>Op(szxqiB)><a?P01Qv*x+ {Gb1`SV҈ҫJj; RS>;C۷KիNoF\ :ZTIvSJ˛O4wS&g@aP@';^ZliR̥#7tfZ3*5UڵKz9ۉ+( -Z$edw[x͋c'l<۵kf\nRfyÆSP@'4_EDH+NfΔ5kBIO7~(N_ChzagnҚ5端̮?$m" p(eK3~ ¤aäslk=v ĉnHWKH00q]ѣm'rvԥ) 'KKNxiӦiǎٳ~a8qB111jҤk=CSLQ͚5oL2.J w2:l'*+s3HD|ԣt\cGۉ`رZb+v5lPoktY8sN>@2;(]{K+VBf}`a&0)5j$}yC 6\֭[P>$N:jРc܋/*33`Ѽyf#l'jfAsfiTi;hv$N}իKom۶N/RR\t,xq۩u1EDDz OfҚ5kK/i˖-jݺ)-\aj))ɜ? 3/ lYL|YڵˬK]VKo>hB 4Kj;w-M*!!AM4)ll8Y˖RRͶp{GƍN5nݤŋ&k8q℺t`Z*Cڴi-Zh3\֮]ѻzAbptl;uL>||!9>HIIQΝuym߾]UV-תV~o!--Maaaڿ6oެ믪PB;sLNy$c43 *VLZ\9c)$8ͮq̮qqR!p%X(8.Aff"""sN\RZ~IIIڷo222v'(!!A:urYfܹG-$D3F4Ib!%W/ih3(mqn:ٳ7mcmڴIR I&RJ 3 [Pٔǥ m'3 V&KNcx=c?7i3zM*/o^:Ӡ0~EjZ3Ϟmt? ^TTc5Ju6o/vluksލv萴n9]бy:vt4ȏkDnݤ m~ml)8XzYI3EtMN2qt£o]l6 8rRtzƍlƏ,9Leˤ al'ʹaox쩈mJ5kN R/'j԰?0}wY.]zFF>LZv*7Q@l5h]׬'XPںvdۻWj\c3fw fkP@BCm'o 2?{ 2gC`W\)ٹgOy@9xPZѻ(RD?_:~\zuiWF4f!O7HN NLT3WuJoaN3zĘ3+VM#~Ei"i`D iqFWm}&5i">,mfs6p/ ҥfF;b~2 Zǥ2#v[ O,XRjnx7$&FJH/,m$Uh;( 6I?lxuzui@F f̥WkJo%N7 FTyGm')QBZ@+Q!g2eKdI)!Av"~b~iFLK&HGNӥC>}̘ݝ;﷝ @6 BLTӶ@ΦMMq8l^GHmژ?zx |^JҐ!ҝwN9+]Z3ǜ]vq{cmހ础-^,w3/`^D#oɓΝ-̈flp+ѻ=zHc; ^dkhIÙ3R.L,_/+g;P@6l9Q)!4noMo1?_{M*+4OBB)y{ˉ.\8f–(uh;gk6d.o`;gvƿJ"H۷x |VtTԳ$իKomȶmx_~Z⤥KƍŋN ( IKKWr୆ 3/ 2ڵfҮ]sN( II݊,LƎkݺIۛ N0( 9reip|Lw>];i)|tfxލ~yp(I9^zI__8М_}%5n,e4~<E_AωZ4w+&-\(-͘a;k9x۶R͚fnvSp& |ʞ=֭l<HcH&IN.Iz#GJ}&Uj;gDG_VO=e; 8ߔ)gܠARV4εwԼfRѢSp |ٳҲef`~iEAAf/0ӱ|E\)Mg,X`&` l; Nfcl) sYYD?I|#իg;W'\&͚eXvpw1gC 3f_| T)۩>a:QFe˚7]֭V&>܌=|Xڶ,8g.?( R6R&{tnn!9c;M8fC2#v[ Q@v6q1(ƎRRLi__6mY_Q@{uܫrewKmᅲ53z]+h;[( j74 l64˖I-[J%KJ R׮6Y8p$`G@$9Y8vIO72c)T<^+#L[*_vV-7%;wN#9"HrhTT<^k ȑ}GK!!ft{96n4 Ov b.Q@ൢmFl' S)SΝ-̈fܟ磀+%$wF$N:jРݛ뱫VRJԽ{UPAZv]ٗҷT4׬XPں5'5o.}9_pѻ;JNޭHi|qmRO\5 yo> >\ZR߾}s+WT<-aG}`.^ݺo}=?w1#Σ̨^\p5 m8qB]tQppVZی`*QD<Үy)ծ-ud; q"nݤ{mZ "%%E;w}vUZTREIII7ݞ}[^Ƙ1co?^QQQrBBBxb=S3':ul380)LHH5 ۷>)xVxlj2`񏶓( (GJkH#G/̞-,)c; \*͟/  *e; \btw|!{nXT4p w g@`ELT3( pE%l;Q@vK? ( p,):Z]VvV6I?lv? **JjXzQI`g@6K6H]MLTӶ "%Ŝ2DNi` nx&=$ۣt=&6l-q.%H-[N8ڻl>lwXtTԳ$Ғ%fUP@2IP@rei)XX^:|X3 p(3v7$vx΀쑶nV3 phjUGIi( pgͦCJENOCS-X`&` l; <Ns4kԫT4D8ͺuѣҨQSQ@4R6R&S1N{m wSDGK+uf; <,-_. ]B?_  B0w{ʗBYF:vL9vx  %*JjVjvx;?ނ3 ((zu),vx  Iå;8<@͓l'7 ߮^̑{N*Wvx mj))I5vx -2RAjvx#_v2kNoKtTԥ$FYR'i&`EA͝++&o; yn H߾R2[Q@'qqҩS҈Q@p[?J>h; cxq[_-%$Hl; g@p[RRNQ@nҥK4i:ur) @/ӱ/V@@@'Npmp'7i*3zZPH\u ɚ2e>5jHyƔ)STfn+e#Ε~l'/B*Uʕ+oUHHHFΝլY3s4̾KN_E5PxqU\_ŋtB" 础PUtik׮:pHypHQQOHuN_%X.~]/ 1cZnDUVvKinm'/@xxïwnԱcGꭷܹs-˛(?v.r6mڨEڼy(uf4jw\qjժƌnիzh7=[*YR-#*66RRR,7_UBo̙jҤ,5U?_0@*UJjڴD l )))ISFFN>}>%$$SNo+VH1z\:~$飏>o&I9r5a-YDR5$I[VƍլY3+11Q-Rj+Vݰ0V-i( o9r%I>M4EDD?֦M*UhРA4i*U?H3gN_p8CȾ0!!?Yڿ_ڳG px_΀@t萴nEL(]ZzYI( ҂ҠAfU( вe҅ ҰaQ@\'o02,Bs[H{5 qEEI?,mk; g@{pďHeJw~311R OND#))ǐ!ҝwND#KiiNE٣w{v+ el'? BB-m'? ػl>lw`g@@tTԳ$wwd|U4wh]x 4_EDH+Nݧ_/>,NaQQfnH$gub$pGEGKUJ=zN =k6:T*Zv_( >h3k`IQ@|̵kҬYR^RŊ7u뤣GQl'nF1R6R&7c ٽ[ڶ8C{uG$'K˗KÆ1z#ϗAl'n22޽mn֬FDEImJN1^.!AڱCZv8墢ե]m'nN>@>\sY/6o( `; 7/u4gsRryCRWKIIҨQyGRRRye/kXv 8Ⅲ5.]l'e8i3 &/3wTi; /n H߾R2G"qqҩS+Q@aF҃N cx_K Ng@DdTԩ$@Q@oIVI#GJExx9ΕJ( KK{O_*]vp( .6VJN6_ގ)*Jz Ni£x/vFp x@l'⡎֬1g? _K[t&MN:\r ŋ|5x`UPA%KT하gϖJ)@xCQ@n!99YSL޽{ըQ|.]hŊ1bOSN]v:pmrE?_0@*UP@nJ*JJJґ#G;UV髯ŋ5i$ >\5iҤҹsMW\<6ƳWQ@nx\r]j*Uݻ_B ڵk| OEEx|<l<>UԤI͛7Wjjߟ"ʄHJJR*Un=Ǐz|͚c$`\ŋtwyK pI4;lE%JqGZZ$^cb/$%%%_^<>sx6ϴw^ICFq Z.UxÇ%I|X;vkQ@ )))I)))UhQIR=j*}ѣ$ʕ+I*_z?|$111:U}~7Iȑ# &hɒ%:tjԨ!-[駟T|y͞=[_ʼnGA7xC7}do6»t&MN:\r ŋ|5x`UPA%KT홧Dy|/^' @'Npmp#FA*Y>ky:kyZ?zZj)((H˗Whh><s'XӪU /N:Zxx }gjӦ-tڷo+*ZfΜmjݺM}l͙3GJ߁W5ew}jԨ><.]_Ѯ];%$$N: ' d2ej֬ymeʔqN@?5m4رC={?'N(&&FM4_zq<>x޸Ƒ#GtEWUVUjjV^]oy,ϝpvxwvhժUN6!7\m޽@DŽ \_汙4iCӮIIIሏwHry:Ccʕo;uꔣL2^z");$9]?رÑ~mw/^ѻw\yzy|x޸ߵk5r<ޏNq ZJ74;S Ν;3cCBBrzCsinP&Ѕ `/^\+W.бVRJԽ{UPAZvӝo/*33 I[VbnN:jРݛ>x޸˗j̙ڰa:t1'EQÆ ]vVZ뮻ןáÇB ΊzGnߵkTn]Kɐ_),,LU~<= ʾ|*%%ṓѣ2335o޼뷥W-TZ5IѣGo߾ںuz鞿+cs雾ޜ9stiuɵq$۷OoѣN<?mZrrVO>QBBϟBTDDvܩ+WUV9ޏy|x޸֩Sn-##CK.U%E;` ך5k4fծ][K,7|-[(44TԮ];}7\cxE5nX/^ԋ/Ejƌݻy )""B 6ԝwީ/R|5j;v(((_ɧ:~̙ݻqƒ#G*88XӒ%Kt!ըQC%ߦMٳ]i=x=VO:uԸqc5kLJLLԢETJǫRJV^PddnXg$7yZu{щ'|r۷OƎ+џ\r/:*W(^#$$駟pm:rz8:z(]TR?O++c3p@GwuhѢڵk;8.\>zI9~:tp8}ῳ={1`w rmۖĉ<#88QhQ}:tĉv">$խ>񼱣0׊uMgIbkFHаaCZn;'|o&|+gOaI$Iv-l7;I泀$gAmK$)bh&vgIua,xiX vIr%qN, խ|3 ;vN#|&|o'9MFc'y>7nM6Ӻukv-S0uA$IЬ k<$XPZ ?˖N#I{.}BQհ$\Уv|i4$IQHW/b˃Ci$IrSO: ЬL Ԓ$I~j;N], bp}@ؿ?vIjw$CԨs0vl4$I٭4,vyճd .{)S`Æi$IӞ=aApꩱd HNhСi$Iςpzk$aj y&MF$)=Z8i$jFeK4$Ic*6,vePcBA.IWR%N, N;֯ %ItryWGV7 H)=nF$)M g ];IvdaPD**b$IL}?>Sծ;Mvd ` X/F$)3͛;z7, YGspع3vIW믇Ί&Y@DIIxˑq$Ib|q8|gM’%H$I'K/ wU, YO- ӧM7N, 9nݰ"vIzp!vIr$4j/ti4$IJAвe$cz Cai$Iң^z D4ujxrI$I##vY@rO.\WN#ITOX$ޭY3vY@rT~a2֠AH$Uٳ!?b'X@rV^^f׿`̘i$IǡC0c ;Ӛ7Rxi$IcM H6 ڶ $F$jR.D_|7{&LF$jxqG$O_ѡv4$IU=wD" D?|(.F$K?Y@@0w.l$Id3g)J GpnȇN#Itb $v}D0aqFXPXQ;$IR-] ;w:z7, a,xiX vIʩ~i}, napK$)S2;z7, ^S@Z޺$I% TL}ƍeb$Iq|=.Snbz=Oc$Ia3gBݺp-X@tLyy0}:w;$Iұ8 Nbj &Oy`i$I_Yv), Q@N0p ;$I7UT-~415`ؾƎF$^|xѻrpa< H$T*,ob'y'l EEpP4$ImDX@tJJ#XÆN"Iݾ}aNqqcIk|,+b$Il"ػ D'*ѧt;$IFyϞp9DY@T%`L35*vI֮-[, 2p<|4$)۔CαdX@T /F$e߇+ , Ra2֭0~|4$)[L7NeQk&OMb$Ia|8ԉF'f#Fаao|H*o(נ$I Z0Hݲ2ʾ={7DʫBƍiӦ n:va\z)Ld,Itb OWl KN}b,Uv`p7{/vIz }ѻj5~<4m +$IJAVбc$*Uz`lX̉F$ew߅Um, v]@pݰ}{4$)SL g7;DiP.  =$I?fx!4N=5vU% ҢQ@/I Il p뭱Y@6zС{w4$)RZ8iT, JSa92vITVa:X@V?)OaձH$*) .$vU Ү_0k i$IRf]^^ 1H$:<.vU h/0{i$IR|$)RpaDծ s† ᇏ$I-73ϸx0WX@:!~;$IJT 6kD`QbLgVTN#Ianx<jՊF`QbԯfOÂHt7/80vDҭ|3 ;vN#Iӑ#0mB&(], J)S-ءCc'$Iirضѻi8,"zqX,vIT]JJˠuIN%RУv|i4$}[p }i$If΄SN~b'QX@>Qb$I{ObQX@ 矏F$-]8zWfQ2:tbi$I]aPL׮_N(kܹa;H^~gQVi&OMb$)7RpyaHmeQ F'cG ?i{BYS`(-_F̕J¯;2D9i0h6;x0vI2GwU|7{&LF3}:4l}NLcQ/aP@~;vI2Ǿ}0w.ReX@ƌ?@*vI2âEw/ ;2D9vpgÆpN$G ;2D9C=\i$I逸waGf0y2̛KR)h :vD"ÀЩS8l4$jwUu, 1Ԩs0vl4$1ujX{ ([X@ppa< H^{CApꩱ([X@qв%CH> p뭱(Ԍ@5b6lRXX)QnY3Fo&M{Hwh؍upٱQVVFYY7gϞHiG^EEEE 6nH6m(//uֱ[F7Ei$I^+WUW/åN~^;y>%cU!IY*_rI$68թsaQ$Ij˖|ѻ:u F[c$z™guNld*iDh0OPIgj׎F"UR0c^ N#IR՚?vD:=zÇΝHT5*<~upY([Y@TR6,vIƊT], j|, ?%ItTѮ]$f$ݺdFy3 fÆA۶HrEIIxb'QHi{ HrwN"Y@(~K=:ߎFJKs{I$ ͘1pP\ _};$)[KH)ڵa\ذ!,$:̜ KI`"n= i$IP@~{Ob ل paAaEE4lt)]%D~}5 ~,F-**ݮ]F_)uo#aAIN+@yw<)!LZM.I%%py"$)!7s-F>{,\Ԫ=%$znO?Ff΄u[b'"%H^L]wN#ID&AHeY3<̓kc$e2ص+왒"%ЀЩ N#IJo ;, Rըs0vl4LUY@0wÆi$I KIcH vв%CHl6x0z7//v, RլL;$)ɦOzoIfU0-[b$%`Qԯ;, R; F4sX`]e ԁsap]}=zGh='vY@ TR6,vIR,%a), Rj|,+b$Űh CN"UDP}@n@޽Hѻ={9N#UDPyy0s&|;$)֮-[d2XA("?;$)]R)b9v, R2:t2vIRupѻT))([HԩШxc$҉HYE <6mFT]>χNicĨQpPTGN#I U&HYS`GDeee}k{쉔&{UTTT`ƍiӆrZn;ЪΈ$)t=T~^;y>%ڵa\ذ!̘$%3.TvH9C0c$ATش)\sM$RH9l8㌰Ї1%)-VicrX0k<4,X;$嶹sc'Dqݺ7ȑcG4iӠ4F^ILn;$a6IgDòeHRII =zmN#I7`:~(wX@$ӧþ}p]HR(-fc'"4k'üyvm4vŋgG*WX@$}ÀЩS4 wc'"j!ncN#I0zc";.7ݰ!vINO<.8]"{y'l EEpP4}R)9rDY3F4)vI.K0lX$RY@$SVa$[N#I٣ %)X@$c_ph4O(+ wk֌FJ? T̝ ׇE3{63vR.HQ:Ѱuk43o_8i8, ĉаa("HRfzqرѻmIǥApnjX8vIL%%Х \tQ$R<IǭG>vF2˫wN"eT)%%,gKR唖¹BHqY@$UJ&d X;$e;`p#??v). Ju Fo,8/v)> J˃3`Ԩi$) C<~{ObⳀH:!p<|4\Kޕ 6dt嗱HRTT]/~; I',? ǏFWѻH:)-Z=ɰiS4,%%pyap"餍^EEpH4 |=~?vtN9̓7߄?)vIJ3n]IdH0n^4ׁaG~РA4RX@$UiS0FYvoDJ *S̞ 9HR_oc"JuwHR"wcHr<^JR.I&v), \F0m/ti4>۶OѻyyHdT-z Cai$)=ODJ. j3u*> #GN"Io0׏FJ. jӟń ձHRO+ jկ_5h|E4T=**=yidHVyya7ȿcN#Ic:xmGJ"5o˱HR+) /_:v), b0h6;I?")ƌYU4tr-{aȐIaVk6۳'sN4R氀HJ¢1ccv-l], 08#,(F*//Νc'2DRìYӰ`A4T9|+V8zW:It7 #GŽH:5oD<IQMjСHs?:ub2DRTCi)<8,[;$ GJ'")޽G6i$؎ Mz,v)3Y@$Eӧ+w;$SO]dX@$%Bf0y2̛fKRRЪt;, c)ܿ?vIw߅U+, ĨQ́ai$雦N To!v)Y@$%6N#I޽C0hzj4RfHJ;-FB8pn5v)Y@$%N͚0;IHu_޽Z8igHZ#l;\j| ;, kX((pRbH];I`Xuܹ~}XT(IeKX>]X@$%ZNѰuk4rMi)y&\w]$RHJaPD**b+> ~8];v){X@$%^0c^ N#)W̟;zWjIG}xpع3vI믇ΊF.I$<(LIm p\RղHM’%Á$UT .4ߕT, 2J>Э[x&{i$e͛g*U 3g4FN#)BӦp5H")"H&7,ZCZH")# :@q1|e4ܹaH")# [HGiPX^HIE <~:vInrضѻRu;kĈ4l_+,,0R")F @v B+TJˠuIeee}k{쉔&{UTTT`ƍiӆrZO:nGر\}5,XxZKbQyW&Lж-VT2Ii)4k.bH^IYgOxu[7l0^(v"I`.XnѻR:X@$e΃_޽o0ة$%ٜ9Xqq$RnH:uC0>\~y+Iv0L7;, R^ /;w6kN%)ix>DIYm[(/+£Gct -[N" ׸1\ ƅUWݱSI<%6,v)X@$5®UWM01KR*-#v)X@$售]aFh:v ]*ݚ5crDR)(^aРN%)fφ|(*D=I9vm1~}:tߏJR::NF=I9o_xط/LZ $-B FÇct<**$L/bT3vICYt#G† jӦI!QJIyD*!//<±n|QsSI!wt;$H !袰Qy$GJI};ѻRY@$) 4(SI١">7FұX@$)jϨ?0<(t;֭vtIo_xط/LZ++e $e,\:5 ?b:5oDReX@$)CСn|qsSIq|9̟B:H $e`F"&MrTr…awc Ԥ <^z=SIq(??Y4*"IfM0|2 iz+v*;zWTIpCzp饰hQDR*) g:vD҉HRa7o_<Jz V9zWdIuCa:֭SIUkT8 I$( $e<0^z v֭a͚ةwo(كN#DY@$) m΅oW^ LJAR&{!8pn5vI'"IYqcXƍ ݻcNףw>;vI'"IYF ;6}Uh^=v*V>ab't, v ӛ4 Kgv{2K*%N"dY@$)G /@QQ8ۿ?;lr-, Cj׆aBxQ?v*釕™guN"*X@$)|3 &f-_;> ~8L];vIU"I9Á+=#Gbi|8|ѻR6HRk-ëkװPJ ϯ:+vIU"I9./֮͛U+X>v* V> %e $ _ 6msυΝSG*T .4ߕ=, Ѵ)<,~{XVX_|;r3.D j)aLʕо=oS)הB|5HjI^{-svti<7,ZB,)X@$IԢE(!ݻID#FRu;7L80vI"IACYY8 7n8x0v*e9s°I$U7 $խ =gpukTpMpHnIR˃ॗ`0h͚ة x>$z, *նm8Ҿ=\y%GN$Ksgh2vIP3v}׈#hذ7VXXHaaaDT9ʕp}0nJ8޸qdJplٲI*++_WQ ظq#mڴn`%֬o/xpD-sRy$Zu7i;^BeeaCIR+(^"4cRlfA~~s!)wX@$IiQvp!<(tQn:tfcN;-vId$7C ˗Nvp, bxu 8r$v*S*]EN"), (6 W'N ]áde^ w#vI1X@$Iwڵy3jNJBH"IWM‡ΝTGf;`p#??vI1X@$Iд)<,~; S͚N") $)1jՂ)S˜ޕ+}{bRU9xf΄~i$b$%N2@veKt, Dj"a8|8v* () ~i$T3vI~}(+aHذ!\Eo4v2U+@yyxNRn$)#;Q=;*+΃nb'D:t.]`$GfB')c@14Q«W/س'v*3NI$%DQjք 'ސm᭷bұ8v N#) , ߅C¢E,YvIRa7o_<8,S2TT-~4"IhuC0>\~9l;^|6m;DRX@$I// ^;ukX&v*Rao~;$HF۶\Hp0~<=;Unڶ x"ˋFRX@$IYqm{ܸ*ؽ;v3cFзo$"I:5jرj*i;Uؿ?)*c4IR5lOo:v ݞ^gSGJ~IRV+(^W zUG͛N#), W6L £BSeu+, q+o_|yD' /_:vIIe$唋/үz?*;|1;I: $)Wi{.t08y!Cb'tIRk}66 /b_9'vIIg$ U L czWo*3] ]I"I^{-svti< :wDR&H--Zҽ;\=NL|+V8zWH=ׇpu԰7*yMFc'), $C^  օ%{ZsNPN42Dѡl]]IX0pʰHt4Q«W/س'vx~;Lb$8լ &O!m[oN_ w%UDJՃK/Eb'Jp&cI$e $I'?ސ}a`8x0vx]XѻNDT.<̞ ֭SUS3b', $<0^z v֭a͚ة޽t ;Ld$ m΅oW^ LJIQf8pn5vI"IRiVq몫`ةףw>;vI"IRQƎ _}ڴ_jZÆN")Y@$I]MQggT ڵK.DR&HTM (l6;zWɲHTj׆aBxQ!<ƔiJK3b', $7+}ab>j׎FRH&__q 9;Տ?va$)6e`5,0L ϯ:+vI"IRwڵy3jNV> %*X@$IWMss06izKJK]I I"j}n=,Fة͛g\<(jY@$IV-2%]ڷ-v0ziSI$e $I ѻ7Zv`xYoXIDi"#t;7L80f$)aׇp(}԰7HLФI~_I"IRСn|qs/m+zX@$IJ`F"&MQ\vn]d$)4Q«W/سz~7 w]!X@$I5k„ aoH۶[URЬ\}uڒI2~P^PhQڻvpmޕT}, $e֯{C :<_wΜp-I: $In]x!=χ/[O;|OnOmI2T^ /;wUk֜د |FJRuHڶ Bڷ+%%й3lY=%kI@ưr%^W]wgoO/++cN(+ wkLV;V8A$M PTB7;eee̚ῧd{G"IR];]}4 Ϗ3.NSRnHn^y B/_߱#+), $個/_+=ahC.(v:If _e˖I}ƍc1$MsL{}#=N2}9m/^L>}bǐ$IҏxG馛bHٵkk֬sΡN:H$[K>cv駟;NFH$IJK$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ[IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hdiff_imatch_savefig.png0000644000175100001710000004164014266763645026022 0ustar00runnerdockerPNG  IHDR Xvp pHYsaa?iCRIDATxtU}QR7NL MCZhR܀mN`d,!SC(tnF]Oi Qrdڊ10 !%QjhSJr" P#霳Ϗk-a1|)I$Iʀ.@$IR0H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1$M$,OiL$I7E]DW=.`< ~ B$I\t?LN'=FO~P$I [Blޞ'GL* $Irs@MkI^s 8LOڽr)%I$I p#k}0D$I*4"k׽{$IBH?~Ђ5oڕൟyO_?V=$I?=Rr$.RBC7P0Z׮w?|J$)Ӿ<w9@a2z6J_7&LZ#0z~K_}o+#6o?w'{yo&yw㮪p؂%I > AmmhRf9"IP[ &75>b$IR^r6o G']UK$Iy-0|Uf@$IaR(*#G$`I$)D)a]G0H$)o3u+8c]zK$Iyԩ w/,\wEJI$/~f͂Q $IY]]nD$IYURx0|ԸRق%Iؽ:TV/Îe+$Ib ܹqWtK$I"ع́Q $Iʸrq#lqWLK$I > AmmhRpD$IS[ &75> D$Iiw l 𑏄=&O*,I$U[[a.[ $IJzX()",I$\ ̓)SD$I)3֭pwU`I$)eN K^uuhQ)8"Ia,5 J"IujWǏäIqWle $IY(+ Wv5.@$I4,òeppLwE`I$iH]jXf K>,G@$Ia0Q] ۶~!0H$))'O.K/C]ryU$I0†-- D$IU`ZX J,I$%tLhzU+HI$hP@$I^*(-ϧN*[$ICe%2[R"I$A;7l$I*`Q;wœ9p=a]Ç"IT::BƍaqW|g $IRjmGs砶6_I$IR{ ?nj2|( $Iؼ**#'`丫RK$&_D$)ҥPTG@IIق%I(l(8oL5|(nI<3֭pwU-X$Iyԩ PW]SH$/~f͂Qc$I]]n@o3؂YtX)$dz=}ν-u%Judq˄{="LPs~010OfzI+Z[Gܹ0Q^wER@ cUwZo@'7OT$I=aSw`$=`^9zݞC$)+W`Rؽn}ˤa$Iʐ6 ׻Į D$)ÈGQ9%%qW$U$I(†)bPa3H$I{;,^ <[0vlUIK$) N K^uuh4$IR}0k͆7$IRtuuaaҤ-X$I)p,֫]`ؕ1H$lq;ӧ]l$Ikנ,3i`H$ ŋ|ymf?ڕe$I'|KॗࡇHtI$EQ`~}aCÇ4TI$tvªUv-^ G„ qW%[$IqLhzU+H]H$ .lu246>2H$%p*TUAi)x>ujUI,I>^*+aز]ͥT1H$ ܹqW$[$IK s=%v R@$IR-W7† P_]l$I}Ν~%)}$I7!eD$+W`f|NɓJ* `IGcct~KJd$I."8rJJH*<`IEaCy`ʔĮCD$vXyn`ظ -X$)o:ؽp`Ѣ+$IK_"̚FAsCIW`:x0iRUI,I7ΞzkYR1H?,[wǎqW$)[$IRNv a93,k# $)g]˗яjض nU)@$IRN:y2t ^z z($%$IRN0†--)@$IRU`ZX JP؂%Ir™3aWӧV"I$IzuuaeNhl4|H"IիPUpaԩqW%i$l$IYyÇaز]ͥ|`$IYˡsHR؂%IFΝ0gsOXb!$I jFذaj`Iص%vϝ~%)?9"IbU[ 3f75>|g$Ir6m XNɓJRق%I2-0|zؕ D$eT}=,] EEp]LK$eD0oL5|H"IҮ/[qwU` $IJS.@],ZwE$IJ5 FfÇ$$IJ.XV ]?&]l` $IJg,^kָĮ2Hٿ-;c`+ml$I#vTWÂ0sfXb!)G@$I҈\˗яjض n#NI0Ha;y2t ^z z($e;?$ICEa} [Z c$IC Vڵz5= &]\a $IJڙ3aWӧ&+V]\$IJJ]]X٪ "It*TUAi)x>ujUIU`I~?p0[q$ʁmہ_OF-)Rjhi;߁0|H9HgKJs~kkX^P$IEs'̙؝;7$ [xm=P >at?_e=|L$IVf |+y3lEEqW%)@t Ni} ,u.Bܚ%IְsP[ qW$)ق5^o{N(IR*ŒMMIcӄы_׀w$8SV$I#w lp!8']|f 6q|7 X$e<ä]JR@0x,~~+aG_?$Iq{>()"I2eZA!ވ$IʕaIs$=`^9y$Y(+ Wv5.+);@$I3òeppX!I,IĵkP] ̙b}$)\˗яjض ncFIY"IR;y2t ^z z($~6"IR0n--I"IRU`ZX Jg $I9xQ8}:l2bEIR$)Յ:;!)@$IWBUS]$ -X$e硲;`w5 $e(/n8x΍"I[$IBQ;wœ9p=a]Ç|`$)ttaJR,IHkkXb9 WO$)KŒMMI"IR̮\M.'`丫K&_DҥPTG@IIIRق%IREl)a]ÇBa$)abغ5رqW%Ic $IrTXbEH2I2f͂Q!p@$IJ.XV ]?&]$,IY(+ Wv5.+II`~X H-X$еkP] ̙a]Ç$# $ŋ|ymf?ꓤ@$IJ'|KॗࡇHH4Q&w_P!I1H4Lj] Wѣ0aBUIRvKa8s&j~tdpŊ+$ICTWVFÇ$ D$] UUPZ &OwU[l$) Ce%> ;v-j.Ia$i P^p ̝wEl$Q;wœ9p=a]Ç$D::BƍaqW%I,Ihm K;JHKm-̘~dT3H\6AE,\'NqW%I,IRkk 1L:_%v%)] V_KBQ9%%qW$I,IRA"ؾ̓)SIJ?$ഷŰuk8cJ -XrTXbEH # QSfQl8@$Iy ֭+jWǏäIqW%I,IR^;{Bծ]fKJR ?,[wǎqW$IKw]jXf K>$);8"I+/amMD7N =.]^"IR_~&$IyQ&w_P!I"Iij] Wѣ0aBUIc $)g9v5?}:l2bEI$)'Յ:;!I"I)WBUS]$)Y`IrPY ÎeKR1HrBCCw7<s]$i8l$e(;a81,ke$erq#lqW%I [$IY5,{ֆ+IRsDujkaƌ0!I"IWMPQ =&O*IR*ق%I mm!x46I׻Į$#$)vt)#PRwEt+&`=k(n` j׾4*I,`v7L K>$)9vP:!8|0%,pOsoK]'>IxY喸$$\sT3 /M©Sa `0\TlJ>Mhjt(I550k͆I*4$EyI~`4p8$)WtuureXq4)$If V v 6 ~@'L_Ξ2xؽVv]I*T$|x (V%=uCO$)˖p]$)N` 1׀,2 |3uIRv a930|H@;a5G#^!n޼1cpT Is",_F?a6ُ$={gϞεTM) O9$_tªXhnnfڴi#/JR$IcO> +WծIJTHlq,+ݰzKJ2"I`>x1=+$*[$)]0sfa$IS/!۶~$IDPSSqrh??$I ,LH]0{6Z lb< VڵaGa„$F`IR8s&j~tdpŊ+$)1G@$)Յ:;!InIQWBUƒɓ0ujUI40[$)?p0[$)7@$)44@y9tw0wnI<[$)GD sĉb$$倎rq#lqW%Iق%IY5,{ֆ+Ir# jkaƌ0!I}IBo 6AE,\<9$I9[$)˴%pDt~KJDH}=,] EEp]$Ie $e(a<2%,k$#$Ŭyn ǁ0vlUI`IRN K^{ $3G@$)&550k͆IRa0HRuuOʕaaҤ$)3l :{W`nX%v%I"Io< ǎAqqIy`IR]0sfa$*G@$).^aBmGT &MMaˡj+$)~~'I)Ek̞ ƅ+Ç$IDRVk WG„ qW%IRKR̙a+H$@]]X٪ $"I#p*TUAi)< < S]$I,I硲;`w5$i0I(/n8x΍"Ir-X4Q;wœ90q">$I $%#\m6C0~|UI[l$%vϝ~%IIDm-̘&75>$I $7a& ']$I,IJ ,'¤]bWT0HRt)#PRwE$[$G0oL5|HZIG`p8c]$I,Iԩ wop.IIf͂Q!IR@$.xIX2,{8LwU$?[$g ^yvի]bWL1H*(cp]$I,I53|Ç$IgI X0 X?> s@Kʫo;Jd Vہc@9Ӏ p5>0hޝ%%{\گϏ"I # |8 گ [z~.)3vٳaܸre$)~>\s&dr׀q^"p])QR:;a*X6pu(LwU$ I󄖪|Ъ7^H3gjk&zkUI I2T ׀w$8SYՅ:;V"Iԗ$ %(V7DRURxA8yN*I` Uw2Jy?9*+aرlqWsId¾GI\BV_%=6o̘1cn8WYYIeeeWKˡsHOÞ={n8S5(̯V?&*儰}no(aɏHܢabiӦ j0D<4̚_ O&K4B---LXxHC ͏_a~ȕ^ees?> ?|HJNGGhڸ6lC $[xK ?=_/s OwBYTZ[GܹnyyI2$힯_9Zu>AI `agBaC&<9$Ip؂˄1׽wNh\)&lpa!IRrDRjk%K ع֯w]IrDRVKd$IY,IY%`v7LÇ$I")k#֭8pƎ*IJ`I N%v/\{ÄsIQl$)@$Ŧ |V ?&]$IJ'[$Y(+W^ݻajؕ$@$eܾ}c0z4;qW$I2,IsTW̙aCx/Cٶ n#I DR55/H$%M]0{6Z $6U`ڰѣ0aBUIق%)Μ >6\"$IRpDRJՅ:;!IndWBUƒɓ0ujUIlc ;*+aرlqWsID҈44@y9tw0wnIlf a"ع́!Ig4djFذJ$[$ IkkXb9 W$IrDRjkaƌ0!I"iPo 6AE,\<9$IR.KҀ`8q"L:_%v%I@$."8rJJH$:[$(a<2%,k$I`tvxغ5رqW%I-XݩSa `0\$)@M ̚FAsC$D*p]]䓰reXfq4)$IRK*`gBY WĮ$IJ/Tѣ1(."ITl ̵kP] ? 3gI)HEX!d6ُ!$IR@{\گϏ"ITSsQv0n\h2|H@< VڵaGa„$I,)O9v5?}:l2bEI$9"奺Ug'46>$IR0HyURxA8yN*IKCe%9=O?$)@< œ9qW$I-XR"ع3!IDQjF!?>$If Z[Ammh$IH9f̛ $)@曰iTTEaɓJ$ihlr@[,Y'N /SOĮ$IM)ҥPT()"IKRQ۷üy0eJXb!IrDB#uk8cJ$il̩Sa `^X0$IR)Ypl$I"e.xIX2L8ohIJ$)lbv,+ݰzKJebo< ǎAqqI$-XR ]jx0磹!I # R]˗!l7Q$I*)|˗CqW$IY~*e@]0{6v57|HBdҬVk WGw]$IR6^x!v̚_ wU$Iҏwf {,(eX&>(**Ieǭ1Rۀ[R]Z[Am-]$IRsH&ExQ ŒaGSC$)Y4 x#ீWR7a&E']$IR+ ו> I 5i`8q"L:)W$I*Hfߌ K}=,]&9%%qW$I Nx͛3f *++LK]_OܹgwU$)Þ={n8S5vחKKJ.ظOa*?5$Id{^9zݞCY(+W^ݻajؕ$IJ ޾}c0z4;qW$I ]5Y!In ]˗!l7%I{\گϏ"Ig*Qv0n>$I2]6pu(}wUI$[Μ >6\"$I # kuuaeNhl4|H$t*TUAi)< < S]$IlR9*+x9xiw5$I商(/n8x̉"I$f BΝ!pL5|H$er^GGhڸ>18tƏ*I$%b rZkkXb9 W$I^(gŒaySC$)@s|6m X(1yrUI$)`)%p$Ia0Q] ۶RI$<{tt}0~I$)Yw"ص /l(b$IRf@ Lg'Zk׆*I$ [ ș3aWӧ&+V]$I # O# I$^*(-ϧN*I$*[PY GsO$IeS P^p ̙wE$I-Xy'`8&N K>$I- y#\m:]$IS`ְsP[گ$IlH3&Ç$I$]6AE,Z<9$IقBhl^r]I$e?HK(QRwE$IRrlG)CMCGQ@k"ؾ̓)SI$H?~< ׀vsì/[q;o&I$ҏwgx׀ˆɧ[z~>TNj^[4"{쉻 7{ݼ?W~ 00X]Yۡ.fQ1Gݼ?{7|eIo{N$GW[+W 0iR+$I2Z~]̞ < gַFI$).ÛoZzKly';ũM$I$ Jy?z"׃=acݫioo?{7Z[[?PVn lw|x"FNS\e`$IR| x,"r# i~(a?ޓlۀ_纇E$$I?ݦ1k@;0 (9WFX/{~ acï IH3NBπ'bm""0PvU~!='޽{VW~77sMz.+ JvX)!\gg";C?lJ>vFqdA6eܛ"z*n~q~ ,u.BCN#3%J?ܻ -?\s~#?d-; U:H}>~"H H7{D~0wˁ*N#-BKC߿% 'Fhs8o9y+"Asdu>7ubgg i篟~~DHùVyD?%| FD[mWA§Ɍ?77< aE҅ ;CeI2B^纀Ms_}m!&Fܛ Pj ^#ܟ+ΕV^~|?DJD' †]>?#M|罤c$&^Op PCh}vR- n aŊ̈́U ^s͸F-طT?If/v>Fb3;}xWk݄͍ !Կ'ޟwoz{Z?'14l% ^_ |nⰉzAstL|}O೓qXm ΀h_ kAThn#΂_Sý7k U_- ~MtLOt|=+#VC sA8;6s7D Ar3=Xs&A4ݛH$IH$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$I$I1H$Iʘ(n5hIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hdiff_imatch_style.png0000644000175100001710000006256114266763645025543 0ustar00runnerdockerPNG  IHDR5 pHYsaa?ie#IDATxyxc7ip3!(X-$. @UXCXKVEEŊ(RQQ9*7 I6fř9{<}8|3`4] """"PzDDDD] DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 dZQTTΧ8ʋ)/Χ2 -p8|=S~Syq>HaHaHaHa</^hDGGcϞ=M9Ӊ+V ++ HKKɓq)O HQ<9g}z?ٳgraԩ:t(֯_ɓ-h>`}}=MLt ^v۶mCVV֭[N?~<ƏGyk׮{DDDD"{^c+@V7gsν`ذa͛Q\\,xFo>,\gFݛ۷hСC;vh8p0MKuuuW.>yٌRKV;uMZhZ7QW ]PYJ`ٮjΧ8|ʋ):'0B10RqSsA3ɓزeK/@uu5 22Rr_א8f1m2^<=g .*++ S~Syq>l^zt wvj uA-+-_%޽K,7qVIIIKl u?=CS"o"U|(fCYYZI-T^Oyq>[Tšݕ.}0nF68[&:vL6 x衇Z|*|UUuUr;^:Z_=N7e`T^Oyq>[50ğ"5Hd2]Y aÆ~m=Z5z8}42rQQ --Cn[ڇaRpUh[xڄ '9##""]xIr_nzG]!!!0a侂ڵ W۴i ++CngnŽsVq^`J,U'(utF=aaaXdiӦɓ5kn+Q^^8]>i$|?U7l؀| 2Iz K"0+#쮫hqJkP,YӅJWخˣ>V\o+Wj0qD`x1uTu]?^WKKDDD_>(cHX5~- ^xbT< TKDDDS?U^R؃n[߲5 ǺSz=WewS0M)y!X<""""e[|kpGl  Q-n mD9[yEɎ'7cT F= L#RQZ|!""%LK|EpeV@Ɉb0[l CDDIj+4LV@CanZ]cF!""eGLZuu[0t^ $ADkZ nek"""O09Qqfh%C*/(~̌zqetj(Gk}0"چt0KG!""މe?w :U ˫T >27ax|/[5B7տYa!mB>zQ3*fk""G*ij7@zHdJ7_l CDD(˅PX%@ Q x}` Չ+KmsA|ep5~?@37JcVy!]򢛵g(_[8FJylOU5 ^aKIh{\ K,ZZ!""qWa@1Ό UcŀHxl[z|zF5#R+z(p0)tk׎Z/-rSs=t8 ĵqҭafQjak""S5v0p_t1~gtk _ .sbJ85pJ|N0`P(-tk%uXzsVkUp&t -[ V5Lasw5 )f%z(V &ނON5 )CM+HDx00[y̌*7](2c?'I`Щ> z0uNܷa(Y. ýxos1( n \^90DD>nZ͏9:ܘ6rWp&o"[QwB\" D,ΊF[yZØE(6׻bP -`CTX1 *0'0DDD.pT4j `N,7. -[QpXڊ*h{h FJ?1'KZxG1rHtIIIڵ+F~M:VcAav*AwTG3[Q`s\xM^Pb6x7ЧO >0ذafΜk߇JմL9* EF SUPK]+&"" K갿\\DJ5q[G"id 1118s t:Uv;ƍ͛7cÆ 1bD9s11Rƴ핢}6|DDfF@Gr XRh4=PTT$EpgZoAƷβ:?ÒTCp(xN6m7犊tRXV`HII0 X//D][+ml" ZCDDE7տ= x25fa…p\֭[QXX lq֬Y5k4HSLSO=ZVk6^ǸMppE5eG|2Χ8|+X`~m C{M@·ǝ˂h!& m۶3gFxOT;S#~N`ĄxvI_*YRЦML<qqq{pB̛7EKJJ¨Q{bȑ ^ŀΣ_zƂOn0:)?Ω8 \R`rw4R<~g:N\\bzLC/ܷ̆EMDDkgLv{B9gZ@XZZ jצ5޽{S#-wIyjek""CK`(EpZd ǎY,̝;0lذ+QXX^o>/[ ۷oGZZ#ǐ } eq5LQI;_ ͢j're ~Ko߾HMMEDDJJJqFTTT_~>}ׯ\ ,ٳzDŽ jѻwob`Ϟ=8pr&! Rkc0pԩˈb}38""_XvD;CG+,3zM7wݻa6 vmfشi PQQJvaڴi9s&ڴi#p̾.|'nd-~ւ;:Ή׏Y|G{޽{7s̑|onn.rssý"uIvJ0*Pnҥ4T#"""%q\xq yUVADkzlek""/8b:Gj0I^ ֠1v_y7̈Zrm??o`Tpw0/AA)[azz5IPu"[LV DsN""zMTG0*Ac;kv`N#\.$"{WCUЕ?ob$}[ì`k""j=wտkIM2 5_wUaT3VH?u`DH `XDK1] Գ5 ~Ln@q8tEmk^sU{yDDD ~jE`*c:a/0!a^:XH#>T܉<D1 ]4.S5 5]فHLU`$ z Vl CDDM$6zV|$]cnZ|tʊ5 5^AV|ܚӀA)!MNTCDDt#fX+F4F= J bCħ½[+asR0UۜXy$^ 5p5^ɉܷϰ5 Ix{3l"MB3V1RFOݤ4tЄmu$""媵aì@joD77aV """q3׊oퟬ ҏ%b& רXH=;l CDDwA7տkY dZ<(}"anI ΚWk1} ,5̜U(45 R9.,rWA<"rrkPc_k:!"ROXq.#Z>H͖@kx[!"R˅k$=+*V  Mҭa2aK#"""_cTuP֎a>5Z#ZQ>mD9[)տhT@j0"D-WZ|!"R:,'>5Z%#VynZ|^lś߳5 Q{MofOBԬ#@j=F5̣80DDAkE6(~$hL{>%`QS1l }xa&H]ߙ]F G!#F5J\ek"`pd{'7;@UZÄJ9_l CD 4.v>IWIv=bx0_[1GDDDr*8w\^{#Ljv*dk"@ u+zH Ge@_#A9H bu-J]; ""fs$r3Y  1j,sю5 QYyԄz[ڇ[#%ZV<9r$w$t#Fo_s:Xb4L<NceCڄbV5ccّDDLN,;b7WGC!K4x7 3f`())̙3NIٳr0uT :ׯqI9K^ȌV˄rf@"Vu6!.^QKɲR3&&gΜNw?nǸqyflذ#Fh8۶mC^^nݺ+?~<ƏGyk׮cE!j/X¼!: ~ìY**J@`F;wU6lrrryf1dnZGoq:شi ==Cףo߾}CرCA-R[<ςCl CDNq_`Yf… rPYY[wuϚf"==jxNIVUl6UO_PV{%_rD4Fx~ʏs*/Χ5kOT_h5r\6Oiht!d ,߂ ?VWW"##%_~u )))gΖy4f Wj/4V[8|˓t B]=+] tSZ}k@Ӊs/O>={s䖒cl6!))Ir#5];݌?Ř.ކs}Z廈$ya$2^yӶWbk""_v(Vi>6xlfڵKYYY|KO_uI6ODDޱ= ٥_%;v Eb`ܹ.򻬼(//&M̟?o6l؀| 2r :`p]rߓ>&'a۹:P&tNC5~!.]}"55())ƍQQQ~aW^rJ,XgƜ9sl0`&N< 8ÇGii)>C矗cGA6p6'pJlpNjDD3/wF,nBii)vލݻwl6#22pwCixb㭷ˡ1zh@ǎ.(-7W㗫 옻 b|26""%:\Qϋŝ"uԝտ` Kݻ7zϙ3ϩT*w}$-r3 XtP-&fDDS?0 R+27Dx雅Qg{PTmjE5,o^ ڒ:[yKkx[8Bٟ5X0_I`A(}[Cl CD)%fsBCffD`D) wq=m5]dk""OXrN?tGտ`H~G,ΊF[71KCQ]:V3Y 6 䗢CTX1 ROT1gwEDĖ1b/c:E4 r3ЂNR#"櫶9X J f[<gMҏ#"{6qodPdJS`c$U xm@, a6^ T""jZ _b$1Rܗ_jl CDb.4U|c݀kBpC#"o`pgZn(f[5r%^/ X/ 0vp YYpV1Jb5!>y  ^sƁ߰5 QS9.,>~ HR`7)VzQ|)?m*q'h nj71R1AzaF5 Q\.PX z p4*+ R+~0e[5du8XQ/!Bߺᎂ  52YBDDH-H뎴pܑ&M缾<[RAiv W> FDk Tܭ3!jVZN@=Teվ6lN=6DI]YS@ x7&IY}5 ~}zJm @$0 8]0DlU=B+`J>Mi)(hTV AN5L SU0D` .8!Jq  i /엾ADNIrP50=?%br[pM2g"` ߄.z$;)Pc|(t9]UaHA,Y]#gT t"*60V54z}LDD u;‘jx@)(*AG{GJ{J!" 6:''eO)hf,/;80DV5d/!]> @ Zjc%ޅ?o`k" Zz'1IKy>)  ^ΎܷB=ck" Nތ:amBpmR@ zc;.ҭaAA)[Qps!7տkY#@R~H0SUX0DҭaPwN5 ?I8-a.a$Ey ӀnZuW¢տY" AHIQTb-dwޭgk" PQEk_1ѫݶb=#""j=˅nXa$E! Jy l CDf:|{^^iw\ X.QLZJ!ptL*Vj Xz VGl CDazl/'pwFDxsSV}a|Vr ¤1iX 'kjq~OE$O%X?!_݅{V`"O*JnÀH?I,gFII .]ٳ'еkWL0{mqoߎh[j%&\Wr%+3l CD~Ɓ9/?rO| d \/Fǎ1x`ɓO駟_ǭegg#''G=33SI?u͢}/4apJ(TLD 5~G\8]&Kӧ>Qh+((رc1k,| iڇgNN̙#Ј#W]I16|S%"?ف~,թ.AY.3Fbh4ȑ#rQDQᵁ1Z6s;l CD~aɡK+CpEաZũjuOƢ",]/"V^O HW*Jr'g+dk"V^^3#|0" 4\v[lArr2222sk֬5kF)SSO5)HZ)l6UONjl8ŖRqk}cDK} dSyq> j%KV]⧨)<}z%F\ϪرcQPP˗;lg=/#F@jj*, vލy桰3f=NQQ R6߅^މ7J^*&"$eOL{;kYe*JVSN@ӉSb͚54i^zV 08z(|+eeeHJJN؟>_hmל=6 >s*/g-9RŗojſH?و稿Tet:1c Ywq-Zc&%%aԨQ޽{1r_t~ u>Ǥx호5̲cV Ocpg ʋ2+ eK^r:>}:y~XlT*y8]OߕmD ;]hEIZ*ᏚNx9^z+VXѬ;s")4^ӹ։l CDgsIr߃a^ :Y˾WƸqr_yy9 Q^^~}I~ٲeؾ};ЧO9L,Zsb+ޔh@D$,8k_qȌp ;ѣM=(r,X :w|իK[`fϞ}?&LV޽{#%%{h$=t֊ ?;?ۈdGK?5NALY3g& /kRSS@w&OM6PTh׮M3gM6r EA1Zw~ZM1ӵ8Q-#JXCX`eZQ\\vA7K37F{w@?8|6B/P1~J})#lcKLچbjKPl8[':E1&wR0_E!=FzJ\%"j=˅Z%'2 D-c*qOZ'fW5 ZA ߜ?6%\ߥ`D,ZGO ˳ux!DDͱptofpFH vcD;E[#u;DDME6NŅ0+: D ^͉FRWܻv^ &{ڿiDJj,#юVyyDD@Vݥ5 Ō 侕Ga]~tS,"cG"3VQp3+qa NرV=T}/dIܙwp5 5b!o&{d-Zgnn :80D^Ł'4@OVH> D2[8FJy|o#`a$Vs8>D D2K,0D$VY?@n&$/@" Uc0njvc[V1$pl0t;@"5LFΉil CxV ѐR0yX(-tkK?)NXPZmJҡoRFDJHҭam^Ӆ0y x9;)_z'筕" nP3&Zy Ą|@,ī*;fk"%q\Xt@7WA݂H D^4 ]ނON5 R|vƊcFh{( FY2B$@"/;[ܿ%f! v. Ta D^S x}@,a*\l C[JEsS j)#"a$( n \^q߃hU1]17'[}(}SVRwb wu`DD D>"gE^-gwna͋+33 XB D>Š1aNT1az|Ylm cwV{|,;9yg^bk`t"H&Ff[<gM^aDXNT_`hU^ ͅWdk@A~MPZ`"Ob$#5gh}60DɎ'-:0Ӂ<ȏܙ:Jm50Dh!n꿫K8 gȏ5LLl CP.:W(L<DڀH= Ɓ߰5 Q Y~ĄZxm!B1I!˵ҕU-q5O͉׎%= 1A'#13տSC#F70)Jʁ1ԊW\awr[X ^pfg /y^^⛶z7}"oa$swNҭaW=.,9(]sG"ob$ a.*Pmck"I ~8DoL!'?=@Sᵁ1PK9U#^Is8]X|PzyƬk _d"/c$ 7&I_:zd-/bk"ѩZW2b46#"%`ҥo={"!!]vń wftbŊBrr20yd:uJ{E_YF1?t{\.9kVVoW\G}N1sL}k6X={6\.NCb}' '';v,f͚o!!! g۶mCVV֭[Rc?~<yfI`j`QhLZ)ڷokdFp. KWr{E@-|G"8fQ,FGi8yyys^ 0l0`(..cDN}p}bυz/vٰ-Sp5L}%^zԍZ-naK۷hСC;vwDQ!rB&țUf4@'u ?y4c˖-HNNFFFF5(--E%bN'Bkc%[Z6TV:11a_!E Oiq S WBC{,O}Ne [oŊ+teggl6c׮]}6mp u`HܗjWg됵<>9-^7HDA]Ñ/Yd /^ƍʕ+ (,,Dy"&M?U/7l؀| 2pKF%`r B(:'\g(8qhFiNK ,;Ν;57|3zң,XٳgcΜ9W^3`L8yyy8p R|ᇈ?/puqlTcV \V AߤCDW{ 6OwvG[ǚlB3̙3Ʉ^xA5W`C/^t[X|9z=Fر%Rp B1#eҕ&F}~e0H6%j oH|fGO0 Vh׮]P/ΧgՁ#֟nGqZnZO5`WUcDvÛc6`O9B9шк/c.~7$RSĊ#&}hZH!A}l"%meu_ų Չѿa hXV)00)L >)_ mKꐵ bˬv^9׋?  D V xW6N@hUֹ0 LV*f U:wSa$RktDLK7wO"{y(ȈOӅJWf  …i-;&"'}:0ww}Y&#Qp\X_PXHD4x/.fk PpUV609#" 5IFS7DVv-"mD(wfV(p1Q&cqG#k6c8Xv1Yq5;Z' 7O'w Dl!*7 v1Gv Y/j E15݀MxQ)0 ;V/. P8QUujE|0""y1QX;<: !̆u \lM~nA?u#&xQKUcuzm=[*Pa?SX}BRfdGd=ZM0Wb>:eEֺkc#j%L.z$7P& D$+ZcGQH5,u֯]FԲ] E@&<#%]jXܕGy(nKmˎ :Nai8D<&R1VO.`~!19Qqy yܘa(ߴq.>S5lC̨on" D DjF!Lo_jB3ŐטXzXײGFÀmc;}EdwFܽ. Ђ:h`DDHD^%JnN#F@@O\jU1Ő.,9T#o'*sDQ]Z'XYFZ}҂uIQpb$"11&bb׆ż>>^`n"  4' \ Ds /g?Ccmd?agGjQT#^g3VmߵNoJ.fDPqgM]*s\Xp/ȯ$zh,gE#\xz<=P|y֊#/ijiy ApO7=&W X.q ej:˅P7t{:Q`$")R/F%`N4;__jٙZ R\mo!(0_Ө̾._ݜHb.Zæ <&FfA$( \ö1] -F=/M0 \ÏERDp EDܜ]?U^LG+#Be`HD)>T╜hhz ^;jb"7տ?#JǏDRDA]Zp]UQS5vN0iw(uӑxH4P 됵<>>v1JH- -0' F D*zE`tҸ}]E함]R8E]fG HDAxIĔ /ĥv1l2A*ߙ_ 0Fc8\mɁ?y{`s`Uau͢*c߈֐6(qܾ`A~rG+.&-?j.:!DL"77 Bbb"jժfc툎vbBTxsP A"+1hy,;lbFM+$),_}~i#..III(..n񱲳#ڞٚ! ;;#+Yi+&:0gw%.Y:uBjj*-ZyX9993g""JAG&կEEEXt)V+RRR0`zXDd2c|K"m/ ūM{&RtCk.Yk֬SLSO=qH>o𶡘?yL\Y 7WcF>!7B~Z}x D~O`ĈHMMbݻ1o<,] `M:j8m6UOe~ lGܹr؄Mgkj?c3xu\xq{.xw^~P FY\ W_]w㕕!;;FGEBBB?STT|'ϝСʧ\־wCb|QUNmZFN|= ~Tt')) FB^^݋#G63\3hPVV$t:9J&nߘ_&}GK˧tk } hv1Msra*"ý">"B 2~ ..`-UN7e`uBGc3Bv1E^ ,-5M?ZqRԸ[$4AZ}N޽{fkT|1" ]n j SUbJTK5 Hn͌G^(,,DyyU'e˖aHKKC>}0B"_Z1G(kE2l)Mh԰eu((/OS}0""%%༼<ܹpo뇉'V\ `W=c„ jݻ7RRR`Xg8pQQQXr%OT?cT^)^J,NQӰMHWf4 DW%ܹUvڅ]v]Нɓ'cӦM(((@EET*ڵkiӦa̙hӦC%"jM]F>Yuˏ+ڸ]DOYq{m`jEqq1ڵkԋC)/ΧGj[P:oZhH<5ן9zXwJ"es 委9 @a(m?U o5Fq@a9^U$ŸA#`JFDZp5(,G./mAfO f n1.Nu5.7b(IEr)6 q50=?"wd5ZnN_zE4Zwϲ]^>d]ww=9@""~}$>GYo(_vaytKu߅fv<Г?0ɬoRM]n>13~|]7/-;l>" tJ3 DDUᕜ=$q ܈pʎa\?U "Mesc^Qa$"P0.#ںocw.ji׎PS/̣ۇ[q@""K WcoⰨ_4x$ 6|tylsˎ0DMHD 6&ǻP.<È?lZVug u|QS0yQ(-9.|^|]9Du^9T#oDMHDeZė7'Sb.XscrwTTv1I J,蛨CVDMHD#JaD[bUhcye;]Xt}O(U|HUaQV MBݿ%8pgwըWhujCx]df˚vDJ u x~_ F|z'8:s\xqtaVOćjH,^Ύv1^G.cieG#5LD U1M f4wQf v1. ݬeZQs1|6*l֝']̶s6 V1)J_ q:'\ v1/=]C-@""?;^c_9cWYFy{/ذ„ HD5*_40oݧM"olA]oza ]'1ߴ EDiW Xxa^msGj(5(ĆX,*z :eEֺc:_e60~9%%f`$""tj]OG#pi~UGva7<#g4 D1Q% l"puf ]W.;f9ڿtӷzD8@""jH op,bC|VO.`~v1*^W8-KD oڻヒ\ 4ƪU}Ӊ+V ++ HKKɓq)JDD0C %bXb.o18USl._J6hLaxHLO_bp\:u*c8y\%"VHWaqX/ a v1.4r#pI-GED7uH_~]C֦wo.vSp>4\!IjmByӺj=x~s6@9hs)̣WΧ86_:\ <}B⏛qvUCq:Y f$㚨_ϩ_}ΆlƮ]D6mH1!*)ag"o`yy9 Q^^~I&ϟ 6 ??C iuA""""p^^v 8r7ĉ+WĂ 0{l̙31 '"//QZZ?111x.bw܉wymvrؐŋ#==o/_^ѣG:v(pK0 HjEqq1ڵkԋC)/Χ8|ʋ)?)W)  0)  0)  0/SLS~Syq>}@""""a$"""R@""""a$"""R@""""a$"""R@""""Q|o1~x"%%o6uuuX`郤$t> .\QU۷o˻ヒ\ 4ƪU}Ӊ+V ++ HKKɓq)۷7x~'P`ҥo={"!!]vń wf|s'V>(Fݻ#)) ]vň#o sTҶmpm!44z+ >cٳgq7z Ӊ?شin3'OD^^n݊7">>  ǜ^6j(dff9dOqqqHJJBqqq<SNŹsn:l޼7nDZZ#Or'dgg#''G] V+WŋѱcG <8y$>S|xq뭷6Xz=+גK.ŋ/իWC+ZV}-5g>/9ĦM鍾>QŮ}: 0i$y睾R@k|3 0Ç / //G&{MM۴cTUUIo[CcNңG[|%iDi'%%%aԨQ N'f̘5k;EsstSH6m0ydKصk.\9xy52L&k.СT*umZocNX,:Rz$''p8J;G=MJ;#o˖-kR_5稔gczJsԝR?aݐ` pزby_^^v 8rߏ}cǎ~aĉg} ,\yQZZ?z6l@Ν9333Z{FJJ , ك ** k׮_\#O2|Wm\s'>,.]}"55())ƍQQQ~aڵW 5J:G />,>C#==kU*`ѢExwtR`„ 33g޽{eTVVBӡcǎ_3g"::ڳ ?sNSvueˁ!/Fzz:z-,_zG?+G ɓ'cӦM(((@EET*ڵkiӦa̙hӦG./}1Lx$_zՓ9*|M7݄R޽wlFdd$222pmFӴ(l稢+DDDDJ5DDDDJHDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD HDDD0 DDDD ]EDGIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hdiff_imatch_tolerance.png0000644000175100001710000004111314266763645026345 0ustar00runnerdockerPNG  IHDR Xvp pHYsaa?iAIDATxyxU; EKA "PfЏAD!1CR W#B**--\AԂeHTAEj!̇H $i)!dks+W O\.̓]D"H$IR@$IRa$I $IX@$I$"I$)0I$IH$I D$IR`, $Ic$I $IX@$I$"I$)0I$IH$I D$IR`, $Ic$I $IX@$I$"I$)0I$IH$I D$IR`, $Ic$I $IX@$I$"I$)0I$IH$I D$IR`, $Ic$I $IX@$I$"I$)0I$IH$I D$IR`, $Ic$I $IX@$I$"I$)0I$IH$I D$IR`, $Ic$I $IX@*#%%N:U[l!33SO=ƍ|O?4)%ID"aw?С)))iӆ徿.]PPPW3f o|#$IR|9)`„ Ջbvu?lܸիWӽ{wLNxȒ$IR\r|M.RyƎˮ]N8ңGV^}A',$I|Ō;oΝ;W蜒֭[GnݎyG|'۷J$I )XxGټy3ZٳgEǼv֭[СC$I# DZ{n~ӟ4k֬߿'|{$IO~B&M;vlkР<k.^yڴisH$)<>cРA4m48 R72{l~_uСC|g4nܘ&Msn&M_>ǼvX˖-s_yFYC߅$Ib=wÎ, eزe %%%qqǼ~Ygqw_ԩCΝYv1ZmҨQ26moU{P7n3f;6k߼>i96U :uO1򓟰o>~_Ӯ];PTTDǎKߗڵkKW裏Xl&L8{dշ-tRߒj@ZZ%y}&~ym'9], ehڴ)Æ ;7߷S~?ΐ!C0ac4oޜ8$I, 1ШQ#/_θq~FII gƌZQK$IJ6JX|y|d… $Ix1<$,Z'rLTAaGP9>k6ÇaD6 ԁ2vTP I Unn.]v%''LJ$I};dgÛoR{yX$IRr%Űt)v,I$:̜-mBn#(I$:EE0k ˖A˖a'=%IZaCɁFNR8"IZ $IX@$I$"IaH$)D"0m  F?WH$)iUWF?+.+In\}5 =a'RY$IR›7zSNa_I$%<Xڵ ;,I$%!7?=D$I Nr $IX@$I$"Iv-lv  $IV$g}F5"ITT]^[`x챰& $IGw5߸1uׅH5I$ŕŋkȪUdc$IRx96 .,ya'RMs $IƠA0g\'+ $IF0jT)KN$I $IX@$IO>ÇNX@$I ׿;b$IR:wYY0thtwsN%Iڲ%Z`ĈmۖT6mJ߾}Yd ϝ3g)))e~l۶-$h Wxyh$4R8 7of߾}5-[RTT3<СCyǸO5NYguԱSO=5F%IRmuEa'*R++c~;]ve* [n(I$%$`UPݺuiժ{98v$Ic)Ǘ_~ɮ]O1c/]vY0`7&55Cq$IwN!`cl0 D߾}xGc[$%Ç |2DRͱcǎt믿/tVZEJ%Kٳ' It;v@v60~+X@*!##[n 6СCJ۪U+> wܸqu,;;J$)\ #F@q1,] v?>?XAAAHiT_O?f͚U3f̠K.3$IRZ&Z8z?Z ;pnn.]rZ\ ;v8ءC7o 4s ??<:T;ws/HNNW\qEBKֵ+<0,[fPrs r _|}3`۶m"Iy|D$) [BQQ)pY@$I|9\tQtA6H$P$<]:=H D$)F `h^xU8SIr,IXvŋ iJ# $I5;7l99Y@$IjX0f 6kv)8K$y& $IR9ƌgH"It))a'D$IR`, $Ic$I0x0vvHZk6o{N#IT:AV|۰z5kv*vp'tITl-V̙pr%"Ij_kz7wIS$IR1}:t),HZ駡A8ɟxIZQHr $IX@$I$"I0mZ)$"I+@.#kWi$D$%:=K6mv*I*X$)a ]/ S u, $)!WCaa\~y؉$UD$% =Mx 8̰I( $IJ8' /;BaTI. Ǵ$I$"I$)0Iv쀕+N! $I;+WBf&4n u놝HRMqD$ōHf΄~ଳ,RHPX^ w c²eвeة$4`I`v"Ib$Iڴ w֭a͚悒S$IRڴa*ˇT8"IB7v IAqD$IR`, $Ic$I1WP{BR!I)X$Ɯ}6 IesD$՘M᷿ ;x$IX@$I$"I*嫯N )Y@$IR}1tO>vI"I*db+IUa$I:|7ڵpa\W$퐝 o<&q |#Fm۶ҴiS˒%K*t޽{i֬ 6d8$I5kJ>.|H>G@ʰyfǨQhٲ%EEE<3 :{o疔0d{=n6m?Lɡ}~'$Uݞ=Ювei$%H$ ;D"(..k׮8podeepB222عs's駟>tڕtR߃$I8!;^>`UPݺuiժ{-}-y >Xfd-Z8c[nIVI$)X@q]ws2x`ꫯ=gԯ_'|r$Ń-[`Pؼ9$j H9:vy),,$==oРAy8puI¶|yt\ؽ;4j᭄ n6l@|O-?c-+qHKK;Xvv6UH-IҿD" 'Ma|8SIi̟?c!IJ82}.Bz-JJJz}ժUr9ϙ1c˺Ij\A sL u놝J_e2:`aǎ;tͣA{@tT#//C/##۷ϖ۵k .$==C$Iu[7xux9>ˇp8R[n/}rgm6z)x9S8q"seӦMi^zq 7^\\̔)SB$Io~/\b)CVVoyGؽ{75k׮L6C{nݺuy9s&{̙3ύHkU] ERR"-@S3 $Iqȟתg@$I$"I$)0I7Dg$)] ]¯ ~vI*Dpм9gJg$) 7-7›oBasIWƍȑa'H@JJ`p8pVΝN$Ic$)ԩqF*"IR9ܰHR$IX@$I$"IR),_;$ņπHG֯.kl Hj# $ʼn {wHIn,h, $쫯஻ + ѱcة$)6%IRlLXzn-:"I"IRH]ᤓSz;$ŞDz*LiFa$)DF@C$Ic$I $I1t lv IIbdf1"HR|H/ ]]0c{{HIjPI LW^ zANNtIRJTCv#W%?:Ob$l_W_v"IO^Fo€k8"IR HM' ;$?G@$I$"I$)0I*2HT۷G.HRbHt+WFw5CHRbHt̜ A۶%v ;$%6 $Ie(,lNX Z ;$%>$?p!ddHDw/ԯkBab$?99PljʒTU2X>$)6U$IR`, $Ic$:%v{/$TX@$IʺuЭlvI}, Zwpu)U. --N$I H֬YyGÆ iݺ5lذΙ32?m@zIJLBN {JK.[iӦb F϶mۘ5k]to:u:ט:u*guQN=%SPGß &ԩPnة$If)C~iʢs?}9־}{;<֯__᯳o>RSS$(O ݻ$6>RAH۷Ӵi 4nܘTƍcP5X>$6rz)lԩS}_jj*G.- 999L>>}KVJ,I$ HqmѻwoFU{333,|ذa 4}r}裏:$Iu۶mcȐ!hѢ*=q%гgO^{$TRↂc9R޽{y뭷hٲeVV裏*qƑvԱlKRv#a&xC璔hϟ:VPPRa9Ά x8s>S5kVΘ1.]Tϓ] PXO?mpnn.]v )Qrp Vf…>ζqСc;w<}/"999\q1,IaD`lb8_v*IRq Ǐ#==={ȑ#8q"seӦMi!rEѭ[7'UVL4)oEQT?̝ 3f@a$# H}],Y’%KyH)KVV/*EEEhтnɓ'ӼyXEl 0o\w]؉$I,%D#s srr|DR8|nƍΝN#Ik$ZN: x"DC$Ic$I $"$UDTBΆ0$d`$W^/_a$% $L @ka'$% $(EʂtX :v ;$)Y$֭-=$X@$I={7wHDTCߡt%I1b$IG|HbH$I D$IR`, T<]jHj+ $7Gw334U$xZhVnN$I$VRSг'Z>$IrD0rdtc]bW> $%gիᥗ`РHe$uM0lvZI$I%)IX>$I"I$)0I$IHR:|~K⋰HTqIJ@;vDWX<4$U`IRYFbX;$I$%Hf΄~ଳ[>$I"I ;aXxuh2T$US$)y',X~%IRrD~kX>$IIJ-ZD?$IJtH$I D$IR`, "$%; $N#IRl$h:jع{:w;$I$w^aCɁI{I ppo څJ`8KWŠ0f J8"IJIo|HjG@$)`>!I$I $IX@$E"m[)$IOIAEEFw8$IG!tI!||x1HK ;$II=]—_ªUpua'$)>Y@$I;߁K/ksSI%IUTX-˗ n,(I҉8"IU԰!tKw[>$IG@$RRN!IRbqD$IR`, $Ic(.;$I"IWp]p5F`2lo~}F*X^=:Qv"I# E"0m :AnCf$ ^}N;-T$%`IPTyyx1 vID-nݰHܜ%ICسH$I D$IR`, j2. ;$I k֬oΣaÆnݚL6lP7Lfhذ! 777Ʃ%0dHlvIj7W*ôiXb#Fg۶m̚5.]N:ܒ {wMӦMy߿?999o>DҚ5K0hP؉$I, eO?׾cYYYtܙ￟=wѢE\ @ff&s'O駟y~I]gφ; .7߄3 ;$Ir VsTh߾=wׯ/EѼys^zYfdffxb<̒Fƌ޲|H/, Dؾ};M6-}]tNу ?G"->l>o<0ԯv"Itz)lBVVVϧE?rl֭1'_mHd%^$Iqr۶mcȐ!h"֭[4hPs(}]$I\ <{[oѲeӢE 9~XEƸqHKK;Xvv6L.I?>?XAAAHi88@zz:6l^sϭy^x!o%%%G=j*RSS9sN5f̘A.]]Jv<|;N$NYͥk׮!%JN*Cqq1YYY,\޽{|8tP鱌 oγ>[zl׮],\2Tq F$U# e?~<=ٳ瘍G ĉ;w.6mM6@Ջn?t'bL"%a1"D$, exwXd K,9#,u_f̙߿ݻ3g:tR[膂k@ǎa'$IUD"aPԑ9999>"_}?ѩWg)JT[Z Ew3!x)ˇ$I)Xڄ ѝ{;$I Hk[>$IJ&I$IH$I DR/n.IDRhh>`/a$IAp,Iؼ22.$IRlX@ZAa(Xڵ ;$IJVNja$Iej4ͅ@$)X,$)0I$IH$I DJr̞ <vI$ Ԋ[ //4$I%%?jqct ;$I# RRZva*ˇ$I)> '°apef tv*IHIw`t/g J$Hpa'$I*# R|Hxf$I $IX@p!lv IH !723 J$%"W-WCmH$j, R{uWxz;$IR9KS< :AnC$%> {{WN$IT}NCvpa'$I9Hq~}ˇ$IJ>I$IH$I D oa$I D AI L_ ]i$I*XRv#W%dԨI$"hZȀBxeI$)XR"=;:Ӣ[>$IRmdӟ-1[кu؉$I,)#F9uׅD$)\)$I휂%I$)0I$IGaa!'O+I&0gΜ ;gRRRضm[l+4v@$) qڵSҺuk./_^1uT:묣z5Pq#a °I$/ qhт|N?t֮]K+5LnbNnG7;/D$IrOٷoԭ[R)_W_  Dڕ$IR|$ @ƍIMMeСlܸ1H! @kX>$I*HMMeѥ$''ӧӧOrssiժUU p5p)a'$IJ$33aÆ1h }ǣ>b:UW0s&~{tD$Ig %\BϞ=yŽjяN I, jժ} 7n8Ҏ:MvvvI$?̟?u 4O?f͚}3f̠K.$$I \vR*XՔO^^*=sc/W\d\tEt֍4rssy'hժ&M Q͛<KBjji$I/ټys>,>,#G<9#xxW)**EtML<͛]w u<( W$ID"aPԑ9999>͛!#f͂1c, $XV}{ZhV+$IBWURSЫX>$IbZ!xh Y4 ;$IRs j7^H$V|H$"I$)0I$I(=a$I%Ça$w떔H$I*XJB;v@v60~K$ ʕ0bҥЯ_؉$I̙Ѷ-Z>$IDI{;`2h2D$I*S: u밓H$<(iX>$ID$IR`, $IcQXV;$Ieo~vI$UDq{.a'$IRu ֺupհs'<H$I~zAÆc$IJŝ_믇,xmh.D$I)NRܹ x<RRN#IdQܩS2$I`I$I D$IR`, ŻBQQ)$I4 г'<`i$I4 ST7c~v"I$U? ذ̓ ;$Ibnb V|H$fԣ°a0`] ;H$Ia(g!--4$I π(<ƍ ;$I# $Ic$I mϞH$)QX@T- @6𗿄D$I*9t(pyV {H$IUTi[DǪU0s&~;J$IJyuW|ӑI$USTa3fЩZ>$ITyUXZs*vZi$I N ID$IX@$I$D"a'$IR2+@n{wI$I, Nys7$IR V-{7\w2L?1ԱJ$)F, XN\}5F 嗇H$IuB<8P0'!I`X@jH'3z <3D$I-U թ3|ka'$IRmH-e$IR, $Ic$I Hzm81$I, I&3o__(D$IҿX@Ha!dgÝwرlJ$IMGw5sXF;$It,G@н{Yc$IR${[!=VN$I$SܩBNy&F$I*$ ivI$buL<+&Mœ9s*|޽{i֬ 6d.$I, DZk.N *unII C 駟o`ǎߟ7($I, ѢE ټy3/*uEXr%savm,_u2yJgY.ia;_^嵉o^%+ qԯ_O?J.Z͛3|c͚5#33ŋs yW/. !o^嵉_^Q;C.]S=z 6k<>YY r%Ig|Zhq#ǶnzK`xqx h I%I` o ߿sO.}<^ MеkL"J$I@ |H19̘rʽ񣠠'~ym&y}BYg#+h#ZlYy}7K/YcРAaGIXjϧvQ^=222Xh>,@tcÅ ^!M6n`%ITy|Tfb޽V-Y;4&NܹsٴimڴW^p |4mڔ~bLַ#I$.%q{iӦ 7o.#c/w}7ٿ?ݻw痿%ݺu ($I, $IF$Ic {hٲ% 4gϞ/й[l!33SO=ƍ|O?4Ɖk^)))|lRWXXɓ+hҤ )))̙3ݻof͚ѰaC z5:gΜ9e?)))l۶-ܚ5k9hذ![&33 6T|ت񾉭>#Fжm[RSSiڴ)}eɒ%:{r|=GfѢEu]oߞ9spWs%B @AA&M^z̘1~o|#"9U#p)~^nXƭUvԩSiݺ5\p˗/%%% 2{ᄏt!Cc9bԩuYG;Sk&`-5m4VX#8ٶmf͢K.oSN=&s}𾉍͛7o>FE˖-)**gaС7;|p .tСyTSblѢEԭ[|'3f~m>r޽;ݻw/=ֱcG.2,XܵAuH/k9ԸsWEѼys^zYfdffxbk ׾oߞ;ח{MU;`ԭ[VZwrSy{w8shܸQ{[y%%%[e{{'|¾}jf̘K/e]V9;g|Zhq#ǎlrt*_:~;=-o#__|̪\[^jj*G7 ӟя~ҥKӧOFU9O=[l!++y߄&ǏYf}L0Yf{Nz߿sjI?y@UTyG}~WӣGslXUJub/33χ ƠA۷/w>hK^^v{fԨQ&x>7뮻`֭,Xbrީszj.]J߾}߿?oQs E]ľ}0acPkJVV;wO+ Xba}KIe֬Yݻ[#0|p."ƎKZZGfܹlڴ6m_r%?jWY:]%^sEѭ[7'EY͛]%_פ#G IuMl]uU|ۗ38m۶SOǃ>C{ƄbmȄ "~z~ݻG^~ӯ_HY?dddD7n9S"#7n *zҫ굹#{nQFzE>=/<PǦM"H$2jԨ>?bϞ=1cDoDRSS#sV8rF"Ջn:r뭷Fm7D}u#oQ}[Ϗ 80ҼyI'׿8p`dG{f8"I$)0>"I$)0I$IH$I D$IR`, $Ic$I $IX@$I$"I$)0I$IH$I D$IR`, $Ic$I $IX@$I$"I$)0I$IH$I D$IR`, $Ic$I $IX@$I$"I$)0I$IH$I D$IR`, $Ic$I $IX@$I$"I$)0I$IH$I D$IR`, $Ic$I $I?Ū; sIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hmatch_idiff.png0000644000175100001710000006307514266763645024324 0ustar00runnerdockerPNG  IHDR XvpfIDATxy|Tw@ HPY.( U-HrQlUA,TP4E ((>$TџDHk "(%l8%L2|<̙'}7) i)Հш0ύGPHQ WTQ zƃ&@B93  CoT 1@E ! Zf=/B>8ԓ҈$rUVhBD*$3,0rUV ȹOEiDe䪬&"WeE׀HXb\}rE$ 8#WeހT4!*+$D1)rUV H,L\e^"̂UY6 ,,\e~D$ p?#WeY׀HD7!rU D$ p#"WeY߀gs,H$"WeۀHD'8*$H`=#We9׀HD+ rU D$ K"We9߀UYi@$"Y@<\*] D$ K#We "T呫ۀHDx rUHG"We "x.rUwH#Weyd 1y4rU "YH\D"A,o7 ,O"Wey "?Y,4 ,x#Wed|* H,x#Wed rUH)A"We "7HUYӀHD\X D$ HUY׀S:uN#rU.ue~y?.;>ܹs_O>Qff$Gjժf̘z0f=" HEb`۵k'IOJm޽vޭʔzDk@*P|LoTpzIIo߮rk׮vޭ#GU"D5 ̛7O~ɓ'հar n۷ou*&4 a:tH'Nc=zEpaQQ$)99ëW^1 r.BGE]#G֥sg}n]'%Q$ɓvĉR)zwԬYsڴm4 / /ٳgK8qBW\~$\zi~nB."%''5j(;A`-GԸ V~vZc|A͞3'232T.Xݻwk!۰an-]TW^yel2YYY5ke {ql܋cn`\̀ЪU+-GՑ#G4g]ve![nU[?3fL ƮJiƔIKK㸸ǽ86űq7KP~^8: nݺo~Snٳ%tu֕ H[4fUVM3g_ѣG[U6S۶m@9~Ab@/wHTuEf2 3qH@ڕos1C?m!I:rk]a0G5uO1[bܪ4`K@8>űq/q|v@{K/uw.XV AkDLa^%9~cT1b0,fC\"LF@9wH˗9h@F$ B5~Q*woo_*N0B5IIcZFsƌT ̀؉H*FwZiBi|qcJ ̀-?넛1i0sgikK ̀8%lHm6&Τ'JIkHU3eh@&զm["YfزE=[:UJODFo4"Y֨$rt4xԺCȘqP!3(6M iV<Ύ- !رCzIi8c֣q$iDhB*a*؈^5kf\{0VD"GܹҦMҺuRԅqpofC 16{JK+udA]K@hQF} ]xՆ`y,CAK JjX" .i(igOBh@HHT1F̙cb] ,"EAkIKHPb ~gRQXhG鮻L 1:"YL\=ф̛iӈ`,&z[g4='5mG]03 ~B$ xGQ4tt}QL ߜfC n.rɓUWwW0UB n%#?_>]z1E &3"YL\9# "l)SdDHp+ f=f̐m6o?ߔIID[X ڵK4Iʒ22LyJ$N(rTRbqctDC$ 8Y >֮RRL}jDE$ UзJcJK7hSD4 HősTgL}jV#bìGЊRn#ծmK$̀@$ ŦUСCȑwHfKD4 7"Y ^6EΕ%>-eg[0,F$ Y5k%K  ,})F$ DUБ#RnҠAL  B&̆ "WA<"<(}#THǁYk>f̐7%a"X ,P*Ii)3Sz[^&b#\M"}/Uj$̀ :@of=ll>oNƏZea"ĆHUPqJO&La""X,9s[ d_&a! rgȑRDp#WAkJ JK;] E$ 8rt4lԹ4d ̀fCv /x`#hDi>c͏*ܗh@"YXCǖ-ԩRz*p,UЩSRC9] ܁HЬGдi_H[Jqk̀= ̆96;vHO>)g̀h@.D"WAFY3t\p'"YD΃AsJ6IIի;] ܋Hpw4~tRNNWЀ݈d#WA?H^(=ND D7z-]j,6+ժt53 "Y8p@5J0@j`7o߾j޼RRRTn]uIxb%%%ڿ ,@"p\>h(s8] @+{ȑ#{ԨQ#?~\ozkذa>ɓu饗Vvm*N@DAkIKH9] @¯k׿.mĈj۶fΜQңGeddXU"Mdl @H>j> ;^!u)D"TjU5iDx#Gغ@$ o>\=ф̛Gu"ctA޽[fon)}vZj)%%E{֗_~iq .\pam<$cySMN"UѣGk*UoWvvvhРAg<͜9S;vT~~4ibG鉉H| **^>h@*0j(Gӊ+T\\SNUO~ԯ_o~ݻSN2e͛guى-88@7 Al#hdcU*ohѢu릁j:zz@ 7ܠ޳RC$ %>\KӧK=&ht5pf@ЧO >\vW\վM4?R D H | :sF2DjR7jl2-[ԶB(IoϞ=ͮg͚6mDH|:4cmytNWPW۶m`prN>_~Y5jUW]%I*((Ν;u鳏[o)//O7|uEbDnUЮ]ҤIRVh83 ! >\?:uƍkzWsN͘1C륗^_f͚I:vkVJKKS~~.\&Mh„ T pGJJ^5nl\$_?C .P۶m5m4ݻ}wհaC :T&M_lOdY >֮RRnNL0S5 vH@\">sV*_?/qq?A 7s]L |B38] ܊,$rb+Hk;] ܊@.Ys%]:tH9RۜnF!"WʒNnG 8,@<l#hiiBA1B$ \9" .u& t5f@pX\=t*B$ PڸѸc ysW"A$ p\<) "efJ |d'q*4 Iqj̸k0sMu՝~ VD 24qٻW?^^S'A"܌HTU\.PziA x,(YS,]j,6+ժt5H̀^A$ 48p@5J0@jHh@/! 2̓wΙt%H4D/" 0a\פ%KzdH4*,4xգt]NWDDx,~Gt?l4!qgHasIM:] 3 _4(*^>A"cs>xA6yUR QB V(SKӧK=&ht5Ht4 _D,u4dԲ4nD#܌Ҷm;] dp"WصK4Iʒ220ЀH reWnA H$D8Y,X }vt51$""YFV~++ ,xрHU `,4*=,Vcv+VHRNT1HrġCȑwHt5@h4 Dȕcӧl+#߈dYFZDZPjjP,"r#GånݤA3 B BL0,"W{A[܏@xDTYmh\1cԼ#rDEN 23p 2̀ ,AD\c髯|jU" gC$p4۾]:U?^jjр, rb#z.Mt5@t` , qr9s[ d ȕ#=4rԡѣ?"Yr@@:T_߸""XA$ "WhҚ5RjaydGʵ ѣݝ ȕ!U&͜t%@|h@B}yJIIQݺuթS'FÇ5l0իWO5kT׮]oqՀ˄;i ܇ȕ_R:NWćk@Bػw9{G5owޚ? vߒr-ڶmƎujܹҥ򔞞nO8,xRB`~Q~woo_0DXm۶Չ'sΰ[bﯕ+WO>^_~zW_}5j۶ԦMQpޓ1x_H;] 8_UZUM4Ç+|믿/X~mS~oɓW ,=h>>|vڥ+"c6lrۃ5jTdee)--Զh1T x@iӌ>±cĬMfjV<l2-[ԶB~OU׺uk_^%%%.D߼yRRRtW:fnH<1Dv쐞|R7NZUMŋ2=}Z/jԨJ1sN>}N999g< owRU=w32|}{GidĂ;Q= _խ…]$^-=ճt%%.W!3JЀ\~w *UZyԶq,3\Np\=[WjЀpB0=zHw#Yݻ 8sǵr^4 \ᇍyʜEp.DZXk07f4D|)$nRӦaC$+9X嗥ˍِݻͩ0+ kSV0>F[^UPVc1㺐Ub0+:w\>A&O6V_+c$ꫥ[][o&LΜf nD|-q !~R~4}q-9HVZ#OҴiD@<\^p\{5Gh@Ι3Ґ!R˖Ҹq1>I $iXiZύ7nh=S5'h@ΌҶmҋ/JժD1Ft>TjLYzYa!"W qp WٵK4Iz!)#ä'!ըȑJw)=jR=D*ǵ,5h@FIqw'L~"YժI3gJ+VHWKI;w\76.@@E,>Hz)%ł1շ'gf 3"W %8-X`Ѹx W[!Cobd]yф)oD)NFa\<cATh(4!ҫgggQ}"W qgp[B͕gvm_8HVRqau7H^+}e\%$5h@8!ㄾO*"HVǎƢbZI7d,`$J!rw88.FQYY]=p!1Dח}Wo -B*vh@8fic F1EVzJzMcݐ iv kJhqmLk рpđ#RnҠANWSF ޽؋q p l.M*o91D.HZZzqgOcx+(.6" _.Mt5q2U4qR۶1DPFp\KO؈-̑n)9jLC${w#Uz+^|'`۳GzQiHC1Q K.֯ ~{q kD\!ߎk h@X*0Uq/EJNΕ^~YZܘ ٽ="W#!5B4 ,hƺNWc"Yұcu!VYTG k|\,B2ƪNWc"YW_mdȻvnո kD\kݻ;] M4 ,3bt̙NWb(#YiiRN?IӦ'5X\##r!U`"1{NSje$+)I;VZVsc-BZvvkIh@zuESY3sgg9+Dq 0 ӍcZv ϵGF>0nҝwJGZ\c""r(0`k ӥƍEd3+VHWKI;wZX_!r(0`cnj:w q!շ'gf D Q`\G4'JI HU]‹2uFҳԿ%>mq~D 1`\[ )lfϖxBJOw2*qQzvnȾ}7D54 v4xԺCNW!QF ׭FZ-\!kuh@m4/_;j<(HVǎR~ԪtMK@ q`\C .;vHO>)g12Uh|~TXha}^C q`\E fFDY3BM)HVժSOIoi!mnq^@ q`\G fsJ6w^j|$HVR^TtuҒ%VD`5z4 bw4~tRNNWCQF.8i_88.'OZX {ЀZ ҅JO?t5>e$F c^0W2N|L؇@Ԗ.֬^Uj@$iPiMwl D`"5>4 r4j4`27le$+#øUoRRIٍLĸ؋@T|83JP.VS:t A &c\E bkIgK9]M"Uq+ѷߖ6oڶ5ID`5~4 "RXhG鮻Fw7"Y+/Xv"W yaz޼炰YK.֯7Y6L- D`54 *n=uԴՠ("YBk/,-_n̆mC r 1ΡP"㶮_/w (#Yұcu!VYX[,\Bkh@Thdc1Ÿ.e$ꫥ[][o&LΜHgV~4}cRNWEJKrr?I6͸Xj l8@HgHCH-[J9] E$+)I;VZVsc-/$|Tk;Ѐi i6w$HV.ҧJ͚I;K>k?+؄q p%M$eeINWEjHiHcu;."W4 J))1Ӹq&|"HVj̙ҊRvΝ&C 6b\܅@) H}doJTQF>L!1+،q pg}q1ҍ7:] ,E$+&gO#rtK `\܇$Tg"*qQzvnȾ}Q+8q p'xMn?Kk;] lE$+)ɸ0}:ok>0!r0D–-[4blR5kTӦMկ_?ڵ}/^_﷡z z'w!vvQD:v4rkJ&cð}+8q p.M 6o߾ꫵ~eggM6ժUJcɺKKm͟_R\vӕ1@f!)\PJixz½`5h@Bx衇ꫯsV)߿~_駟ҥK+}=z(֬,.4p8*mB4!UJO=%]w4poHW_bsnDBرcCղeKر#9r䈊.0͑#RnҠANW׈"ջ'լ)]} +8q p?}w[nDڵjժ[_~{Ai$(uegۈ\#W^yE׿4%TSRR4hР H^^fΜ;*??_M4bb73͝i$+Y^̀V.<,5 sN>}z-of sH[>H ݍHVJ ps,q "X!=ZVR^?[x$?^/k5kLȵ^ )??_ .T&M4a={GF4ZDU ^r~:aEsJ5jXP/M4 !|g\~ w}WǏWÆ 5tPM4I_|U% C@Ot5pe/MH&'MGBq~jD.Ě0!S,\( ,Y-QHپ]綾_6VTp?|@=Z8iD(\䪲W{Lj#ߵt݋Μ^$5h@1BVM9JzIIbRᚐ2ϝ&HӦ_ݻKDRHLkр>c|egKu8] \-UEWuq㤵k?ڴ1.Pa\t5pX#W"եqQzfRsq^Ǹ ScHǏwt $"W0ըF 5x4 ]k!ftqc+LjդY˥իv;) ¸ 3ǎ u, t5p%"W"կ'gfJ+WZ[܍q g&N,ǹ\U&H֕WM- CIOT#\q ƀl"͞-=񄔞t5p#W0*-[&=qaz׮Ɖ(?4 O:e ܺb,"W0$)['}t҇R!Ƹ ӦI_|!tyNWWpK2F:v-n݌\k?р>cƂn[;] \mDɪ__z]w}8ۥB<؈(4kf\ 6rU#Y'=ƺ!6[0FxܹҦMaWw8+D[˓j֔NZĦ`95h@ۻW?^^S'L.6n4n;p^8y҆`5h@ ?AB駝j2FRRE^0VկӦa*5 1ЀtfRZNWG%rU"YIIС҆ ҁR6;X#L$F zt8oD0 ̔z&OJJlqc\ A>hw͙t%p_#W0UI?n|)-"k@<&7Wz5il^=%rU"YUo}mif#gc Xh@),4 ӣt]NW[%Z2Fw7VO_XI}̭׀Cx?%j2F.DZXn0lb\ SJM:] lA*2D^~YZ\Aڽh@(*2n1z}9] lA*:F~[㏥cǤmUl !1ɓՁZDɺjiVkW[ 3glg1Fx@NQkLv3p0j‡\+HVjҬYmzWڵv5b\ B H}doJtDa$_?O̔V poƎ5.ҼF\C+4[n1NF[s5 * Wj3NWSr"YҲeҳw*gS}>jd\`\d )7Wڵ!rND#uoVC*5eр.qqsm9] LA"duh, ڲԭrkB\"+Șgg;] LA["dկ/q-øqK6QkB\`iiLAA܈\ySΓzJzMcݐ ivk5Ѐ;rD>܈u t5 + ջg\X}uƉ6q @Eh@=t4~<ȕDɺ2iF6J+)5ot5+ "-Z$p_I5ЦMk*F8IicpĄUb$$ *m 8 i#5ɓbk*B8d髯_VuDUb a\)!M,TK0 ۥSVQ#r"dթ#o_={J?`[e\fF*=]0j"W*dU"M(y˳F+5l6guQHNvDA${wc, hЀ6ڳGzQiHCAĈ\!"Y\"_o &RQ5ڀq @h@Ɲr7.ԄB$*d%'KsJ/,-_nms Ɗq @4h@,Z$0WjՠRD"YұcR۶ҪU6fEkDAA4zZrNWJB,"d]}qD׮ҭl9cc&b\+#FHժI3g:] *D f$&HӦ_ݻ zȑkbCX,'6K*d%%I?7nջq)'Gz 5,K{K}:] "r+DESY3sgkǸ ^4 ƌ7p+ءHVFQS:z0v,ЀYVZP>]jjP+ةHVjҬYmzWڵv]k,6ȸ 4 3߹4dՠ"WpB~O>1;3SZҦ"p8sЀ8QڷOZ@»=\ *d]yфrѐi,.ֺՀS$f={W 4qԾtF$7m+Z5vI .kƍvۗ_~_ӧ.]v+VZr#Iu嗫GzWm*//Omڴ1 kcsb(޽R߾ҶmRvG]׀q?"X!tرT!IjٲvQᾯ.b~gիWOӛof'xaz<>mC (H%H&RQQb\`'}w[nOզMURv_GwZ:Ujjw*W]_~YZ\AڽC?q h@"+__ ԰arۃgI}^Qq믗j+ r%뷿>X:v̸d*EEF4q =;w߯:{EEEJNN.zgo׫QFӰaCsdee)--ԶhV39cDZƍs 'k'&Pe˖iٲe:TЀq Kv{ァ*Zn׫ԅ7oVJJ.Jc֬YEf0ncyTh0 +|Dtt([B8x^Ďg߿6mڤ+WC!WPP;wgG}rrrn;xV\^z>k4i%ed8]q+z% HG֪UԫW/%IǏK/Z͚5d4 ]w~/8zqqx ġĸU0+>Dx H}$)77Wl@BZz-;V>ŋ+dX`kJ))NW3z$vI u")}tUR~_t5>¬q?RSgqpJ.+XB͕rrڵ'\C$ Cq4rtm9]p+KрʒN\A$ `?[FZDZPjjc͏*f=8-lHߌE@B/m"͞-M*;]K|p "Y@BS֭r rmd δi_H[J%o8܎Hp!=4n1h>xEqh@FY3F FT#sJ6IIի;]CuDcw4~tRNNW~A$ 5x^ ҅JO?t5!rodE t`nT،Y~G$ f@iHFIH={:]h>$ "YЀ|3JlF @!,xVnkҒ%RzNWcf=$:"Y1O*,4xգt]NWc0<F2o^|҈dE nx<ԴXY,sICJ_/wX"C$ f@)'Z%Us.r-8F a\ϧp|itǤ-"II4pׅ0 <ieKi8+0,Ո`f̐m6o?j,HZ̀v&M 1+,uh@j%%]76.@"W`"Y-X }vt5&bE$ p f@Z~++ ,x՘8H8R `,4*=՘,QDJ+VHRNT՘Yp"Yc:$)qtmNW'"WnDрuӧl++"Y`U֬,.4p80B$ 3 p#GånݤA&FDۈdc#xt'rә LAWظѸc ys/DN 23p(#8n髯|jU+H DS1Gm.M*/jt5Q7S1 j4 pLqJO&LpF$ ,8fiVi)9j"@  gȑRNW"WsbFСRF P"Y@Ԉ`vI/Y#:]M\"A$ 3 UA4z4pԽT DрV#FHժI3g:]ID T$GjҤIuE)))I/hŋ+)))-rrlN  >7hBI\5yd5mT\s>ècɺKKm]9z̏?J/-t5!00S3 ׅ4 4lPjРnݪ̨GȰ:3F:~\;eb`Pg 0ՠAȑ#*..6"ZVZP>]jjA, uUjRJJz/lw4lԹ4d՜\]`Y %%E :ۀi̙رդIKĉҾ}ƚU2p, S~7wN:iʔ)7ogiliT)=jDp.Dsߤ 7ܠs[:% ,n-=Ո]d!1b&MGRZZZm Ѐ*tӦI_|!m*o7#j˖-ӲeJm+,,tў={T^J7k,iƆcҸq ch>^@$˵B8??_m۶u" ܹSO>/zKyyy,vFY3tx ,$f@*Çk߾}\}#G*--MǏK/Z͚5$uQ^{222|-\PM4ф ql1winT02"YH4 xgw޳QNN$.wFPM? jС4i.b[jw޽ҽJ:9Pd~")5 _K.RZ6.r:^>_s f@`Kssmn>,#nHFIH={4Ds Q4 ۃc96(w$!J&-Y"EI$2"Yf@BW=zHwe |@$ G=ф̛gØG ##[g4='5mj 1@xDÀ jEEСKg |P9"Yf@ɓUWX² ~F . /M.=Ԣ/D@]l\;sF2DjR7΂ r@d`!b3fH۶I7Ko3ydŘADv&M !AJJ^5nl\n"WXH\*`GڵRJIOʬ!a[iXi`MxB"W8H\aB3ϘDp,8ZB͕rrڵ|2f=p"Yp3 !iH;n㉈\^D%>-eg$Dp?"Y,fdpԠAO¬A$ 6b9" .u& d̀G> Lg6&Y7|̘!5ozD`!"X$<) "efJ<ŎD/"Y3 $M"}/UND?"Y03 ԩRVnփ Lb@Uz4aB; qɂ `%9s[ JL BI`{H>*)uPɃ\ "Y H C "r!JPI/Y#y+P"Y3 @=Z8P=̃\HBh@ЈRj̙!I ĊH"@+_˗Ku&+/"Y3 z-M"W,DP2ft4w9"W*Dvp4Ը\B̀$cǤaäΝ!C~H ؅H H8QڷXJUf=CB͆͹H -[ٳSi>Èd%<"X>v4xԺ4DKJh̀شie O!=6\fC|ć+"rC$W ׄy%)%z-6%h@$Lqt]6`PMdl "X^B{Pa4o A4f@ܮ ׭3瞓6,$f@ܬ棨H:Tz- 5K0V1ywjT6$9RfB\eԶmo͓/M.=Ԣ],Oo.&T!zÜ9# "l)gSa^A$qJ"WA3fH۶I7KoC]^C$՘qZRRǮ]ҤIRVaCm^V̆8Ia~m+)1zոq:"@$uh@>?/O H}doJ  ݢ\}4v4xtgD\N,,N `,4*=Eu$ "Y.Xvr#h )7Wɑj6,] HGդIt7뢋.RRR/^ְab\:$)qtmQr Hɓc]s5Q[RR[nE/,XvYYRvvT/Hɲ H 6TAAݫӧG믿 7~aںsciiLA^Yl%ظ8>6.Y #99Y b9OJRoԯ_?:ydOq4|ԭ4hP%|ǽ86űq7dقL]v:~vU؊Hh@Bs~6l(Iڷo_O|RVHɲ HLwU^]TTTTSl)=9 F!6mۊƇu@ NYSC\q IR5BlL{m3FPN08>űq/q|\"/Omڶ-M۶#XUGtvp[FB>7|#I?noN0W܃^ظ]ʵ,\hUr$nZׯWIITwmJII_)wﮥKYfagI|lHܐF$bIoUf֭ ۹c.2UVM|rV\>}H26LOOWkT9L3 Ço߾G A+_f͚I뮻N_nݺ;wO#lFl#B$+"4 xg޽!_YVzKcǎճ>"effjź+,6 B7!!$"Xaz 1*N ,\,,OqITFTF o^׿~vڪUnVٳ'ZPZWRRRbѣG5i$|ͺ袋ŋGÇ5l0իWO5kT׮]9>/IJJ-l٢#Fe˖Y6m~i׮]Z7}yJIIQݺuթS'FNݺ2q ȹ,>4h^u5JZx~_> 7vGk׮*,,Ԅ TZ5͚5K;wg}:uUb?6A?RSSjժVP<ɓ'iӦkFoIInm۶Mcǎ={#.](//O 9>A'O֥^Zj[ڵ)0AM6M6lP߾}uWkV6mUVa}cxOkݻWG=ܣFz7Իwo͟?_Æ oΟ#F [O7oH L>춢e]СCN6- )'ݶcǎ@ժUǏ7Dϱ4iR@R￷̄uĉ@AAA lXhQD._< )rʳ8]v`Vp9>- H lٲ ӆ 'O,m׮]]wUᾼo}c3gW\Q*zXu~uD,\_WժUKuիWi&_fff*33-Z覛nҊ+L/sl~'钓ՠA}uo?^zׯ|MN͔;Jk@lc~/\j*]v>,~%%%ھ}222}]vڽ{9bZ(cs͛+--M\pn}wV(}jӦT)=ĵkNǏ8kuUjRJJz/|)SPsqF';jݚ5k~mtMS{oc7!ۀt5lذ}~ɓ'cH҅^#Fhz5d-_\կO?YV3"ϱRRR4h _W7Nk׮Uǎ#yDt^y_R+|gDz|xcѪW~_h̘1۔]>wKV)wi.**Rrrr%ORL"2IzK;Pvt]wiܹz-QzS~7wN:iʔ)7oΝ;uC{*|,Es|xcԨQӧۧ+VXNp;,\()f@X$F!s'N8pIi_D&cΝwީ 3>c p j߾=߿_r^V7|-ZPn4p@^ZGU^*3NJِi@ZXaÆ*(((=QF!袋ӾLǦ"M4?wmcBC֚5k"}cXO8oէOmٲkbz$x$ wL֭k׮rl޼CR~_j֭德yf5o\\p&XM8@@|իgVQ֭R7oެ]~Uٳ N8^zi׮]Zzꪈ}cXO8oO}L\pM7 Dӧ /vI-ZH۷W&M$I?srnٲTCkc=u7[[8J)((Ν;uN999g}Z/jԨqQ体_0pp֣~_B/>]V:u$uE֭+1/&ؤ/իkkц ߈Zvv>}߮kV4rHiРAz饗_YfnAyj˖-+#㓞kVJKKS~~.\ j˖-mԨQ3gzU堻[x8$Zv~'uI7+hΝ1cz!I6w\tj)V@L'1cƌ 4h  Yc:wu8/ЧO@Z={KJX͐!CW]uU .TV-_"?1O?Y]r%I!@ s=?SN %%%йsgV6YG n:VZiӦ{7~g~ Wᾂx8#Z˖- t-p;^֭[7,8[;.<5f@\sZ\]S.Yo@` % ϧ|x,6 D|^B ',o5 D|NB |$ +#Y7 D(_B / "Y7 D39}B H<&Ek@\˄HV +qF*o@\(+HV + ߀P(#Y"Wa$JDdp"YUBm,4"UI$+) 0h<#$Gi>+D_7C}YTIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hmatch_idiffshape.png0000644000175100001710000003506614266763645025344 0ustar00runnerdockerPNG  IHDR,9IDATxyxTUwUBBH [QhA%g#2 ( htqVZQH@6Ȧ K ȞT$$dT<`M*=:Oˆ!u*(g^δikWeuyB!tt,/agX Zn;BB5kO!1֬Q0r$Z [[BOq\Y9aT…s }KPu !ٳ0q"] Cԩ0thH5kCZK@xU !TJ%jZ@>DZBꉬjx B&a$BFDV55lR@i !hddUSH·y}aVMi !ojFdUSF U HK!|C3#@*H%zt"$B=y03# i !><YRA"-! ÞjHK!Ȫ&@*H%rdUwH»,xNUDZB&FV53 BxɑUM6 i !Dh>jNUDZB4FV5Y3PG_VF0вejww\8ڶmK^B@cqdU BXa a}ߓ&U%??'|gs=GttE !4j&ª"Һ6Z[3۷jwYj{DGGb BiYlu88ggΝc]0>t^9KݛP˷~kuB]EV5i@JJJx;5{W\I3=Z}ǔӢE BCC)//|lAAf B@͆nrY]pb֤km::צ fCD]m#G!3SȪ&mѣGIۼVز};!={j^]VD₂8}>}֭[W>$%MfĈ 2i"6"222+qVTnsڷoOXX><[ίεzc;wN&;1VĦr& m۶7o6z!O?ld\b#  2|qw}]cit0ػoڵk.Vk׮5.V֦smYmYYh`cգVtڌ@ù*vӹ3_ׯ_cn ] ։VC L*]kԹ6]_OШ5kp2>["UC^ӧ%'1nC07]xXV7N'|UU.221#222jkm::צ VuөfY}pZTWGZ6Zœ9bw0A1c.-Zgu]kԹ6]_OgaXxOAAd|ӪCGF}] 74`> BzYW_v^݆RZZ˗XPDP$޷@!6o6Pҥ0g[-ի:ɳV(5\,A@2:䗗m;5ˬ.N!Ȫ&n ٓ&e*FOY]"QdU_4H5K K@;\A ,/ ZT|W$*.O'bu fȪ&i Ռ{,-۪U(; !LǑUM@p.eU98~P!#Aib_x( ɯ@Hi?m#(V@UM~@bbq𐯾B4IEV5}n?-e--MUM@OX^quzյ$B4FGV5D7R@$B4HGV5LzP=RmK%DV$BE":TRUH\@"-!DMY]T@5P>ZnHKQA"z\W#/ȝ$"pId`@U_(-ȝ$"Hd(@uSaz(C"F pݰb5i $jm =z@TlH%ȪY,$Hdl@zPزHK%t`xCp`=YyT@7}տMxDZB<.ݮV]O"k%%sg3D"-!#Wi@ '' JkDLM رc0aƞ={gW}.ɏ{  MgU]ׄ\ve>}TM%<\}d <RiUL7ܼ>H q1gϪk!2=bڌ@t 9}ڋYZB4Ͳ@ 7&L"-! /r;vQ,-!.g4h PB"-!~%;!- MEHulyy&X"-H$9@}{>Ģ$L"+% Ə!?ߢ$H"+& :we$D"+' Ə?b HK24F Jud9/ʯHi$5.)$E"+# vN4K$:oIid5W%:ʯIi!6JjHKD"+' &VWR $ @gOP jI"-a4fHJRھ'K%$U {[i o*`Ii]] au5HKxDVMH3ރw찺HKxDVOH3%K$!8O y{+iDSHd%0f Օ4DZ1$5Hn,طJ@"-q1Y:HVWDiHd%.B 'O?Z]II%JC4gG!$ lYa#F#pՕ4DZI"+@<,, nǮ DZE"+H40!##Zt:6KHPNH˿Id%Hr1z)z)x~j7L4|KZTeDD!VWAi'D3h@:wLJJ _~9˖-7|3fꫯdG"Gî]au%$J46 $88r2xۜN'EEEtޝ?\6/*:>/H˷IdvmޞUm۶eРAݛʯ\j "446"P6f lՕxAFZ?Ǐ[]E3Hd=Iff&YYYUa 4Z A*oddd֭[5Z 7[]Xo?Rg'--ݻwv.颴i ;wdŬ^w}wرKEϞ=yy׉K/|">>FI\\IucǪ}5iցj5oH' ϰlۗ[oCPK^^#99 &~|tԉr͛GHHHǻ4NO8:||{ ^ |:|VE5ܹӘ:ueI70N+1ɧF۶qmQP`uEMφq׿~0&N4ݻ-+auDah3g;B< I/0}c_/Y H1IR[緟/_#S`T0A]ZHd%L$ $^ ]0Ggi= ?G_d04%%gAqՕ̇",2E$pjDV"@LF"_|au%H+'G5@>Z"4%'MM.7ƑөM7q Hd%,& dݺBEZ3{XKJhBV_Nk4`4 &NlsDVB#@,УDEMVWb1#uo~<1mfX$9Y-gֱ *-3nyuXW/5g+фVy9<k'{9DVBc@,b >4_<&DZn7̝b=JhNU[[vi͛5K5qO/Y ! Bvg7"fV?{oh/Y " b@;wZ]<i@f&J<سJ4H7A_SjJ0i  Q(-ݻa䈙DVI7Ù3lYԣwjʮ.DVOHD}PF! TG.ud "%E-cZJi ,VW#j2Aڗ[[[^/Xw Y ?# D#-[TF iQd]?oW[ݦǎIO )}i-/@43j:?e)3+ǎ]2kXZ̓Ji WBn"xpZ{Vh5u۳]nxDV¿HPb&i+_o…ok̲2Vdl./@4NMm.7Za-lnۃX剚% DS;v#qtxn||w2{Ë̲-?$ DSmXڥ"ji5@E#i NHKl+޽jp5x"F\(# DcmueVWiгgӑV#/ _Mja)6Ks#fe%Uq:9sw-!q~~>:u iAuh^mՕXQ1geG45jZV'4[#0sLz!֘~4yd&O?YT5Ə!?J/0}:7ţiyh-+E mH||<)))[DGGbŊ à$ΝKbbsg]ӧaT0 ꋴ<"6 ]vBII nYz5{/+W6ͬR-1~<|yٳCM8`mՐeQ]:[]@M1jԨʯl6̙Cpp0g 2ۋp8DEEѢE K++TwX]wee`4~? c@VScw=n_}#O)餤, ðҪŭ_k+VcҐl6]t0 JKK+oddd֭[5rs$%J''G5-lCQFY N&L0 OZZwuBNl߾Gyɓ'ԩS?~D/^L\\iiit҅Ǻ\.IHH;]S'W SV7ݤ+K= ݧ:ajC?T?x-^uٳ=l6t޽,^.Nfc撞ΩS #<<`سg̟? %')eeVWYypsEET̲ZF@>UGDxe--EԥȵӇ>}\?쒴Խ;ƪ= (*RW'ZP@aZ\ 8XͲ:Ҩ5q⯳NUyf?f".9Y-oR^nu%WRo,(zqyxE*i >gOllu%SZ 3gʴ<<i/HaAA* RR 3S-lrOEVP%_" .{+^S=ZHKD VkՕ7ժCh vdUfFZ-@M7l -ZwjfEViF# m6(Z^|Q]ufGViFh$ O 'O?Z]JI(/Ȫ>M"P>(dru[{`DViB& ďGMzUJȪ>"0˝UׅGKktӈH_AIHPN06>0Ȫ> "n2DjV{2uZdUFZ/@ѰkddxX[믫/KȪ>DZ?@Pt4 >txn|/U}ꉴ|}៤1c`6p8v᪫s sH|wῤlPwu<$\s#i7g}"4?6vss=e4{\DViJ/(wؾP8G{jɓGhU}FZݚȄwtq!rYЁ4?7nܹ=ѣ0c<0~U}DZ7ZŘwoS<]XOzPQzS L ΓȪa*"c`*%,% $$%u0u*L7$jp4,]IIH$nBx4pja5kga $jQؾ>jڎBx4} T=Z?yDV8>m)?&ρo,x(H j$7'G5UB1YyLx0+z= kVBtv<duZZZ}Nxqq:DV^18^i [75goW{0 ~q?o1'B}vy ?O?֭[Yt)QQQٓ_|_(.Ǻ\.IHH`ȑY]-܌'J+"l6[[1c(zi@l6Ǐ'77tN:EXXcӧөS'˙7o!!!3)Hd"V3"z?.nܹӘ:ue3g cH20֭"Qɓ1na8 sAa̙cAAj+WFy+ugø+}}MYiQH E@D$)E"-Kyu/".NfY&",=wL" DM"+_L=wL$ D\H"+ט_. ymIId7K$ci WYDZ=w,$ DHdQ$c1i N"+V/M"Vx|MH dY_^/VzxH DY^ 4lJ`0{ь4@#U`xSKU/О;H$ X}=i]Լy`0kՕx4@ U5Kx%ҺPPhv?~oMYJ@;wz%ҪܰHgY*;tx58v jy痤#D<سNj H7X@z @DV"BB^THk"ص .014"ho3gA/(@"ŋॗ "j% Hd%E *y}R#TKyT՘OJ4-ѣpIHkrsD5X4_$Q!8~܂peaRR*I5Y  WVSG!|4ڰwyVWc=i D"+aꚐӧ-8EZ_ ovlu5z $^NMl_Wk\]vC$^vcUƑVz:Z]7>j" DgY i] -aUqu3UWYVH"+a;4ζUYkL?Oڶ뮃eˬ<#աMk5>IN$.شI֫"ÇըcdTEݴj .\/Sk#@гZ+&FZG~Xm%.NСCy.-==D^x^z%Ν;gA^ q#rg-"_~OA<~M2rH,X@YYaT-??+3f0|ZeY t ݻx1:}N raj mڴ!66{-PRR¬Yxɩvf3JhlxlqՕÑٳ0e Ç{}P7Uvk^˒%KXhQQQ|\eҺfÁᠴԬrO"+++Tcmy(RchՇtt:$++$F75-Zt"(( +q8v222HKKc֭\uId%|DRu-)hfa:0 ݻ<օV 䧟~b͚5۷O?<nڵk馛*r'!!#GY ӵ+tݒTkBt㏫uƍ3̆lۗ[oCy2UʢaÆqAʈfѺukΜ9Ñ#G={6_}j;W"+ᣒՔ޲2+iFDZy\=s6T.}ҷoj_{hݺ5ݺu[Gp8TXDFgtvK6j"[%&^wWTgi~AߐJdIyՕ4Bm0 |"4OJ=!"6oFi}$&Uۥ.y4OYV%%b]?fHXH\o"=wq=V$Ҫx D"+!}y'>F'uy9*@#-n Y aqԚT5y3ᇡfHd%:v=ԉwS L L@5LR[״ӧaT0n*@"-h np@5Hd%E.vUqc= Slpf ׫'JJ>?+K5ѣUw8r,W>;uI5Y ax5oi ,+ך5dx#.Brz,->N'$~c=F#nL˨Uff&n2jkm::ֻ32yI7;YW:w-.N}=~ /[FK͛HvnM]xpU+~meUw\.N8ݻl69tUv:Dxx8111ZtMSvΤIp&ManM^R~vln7qgxqOFi8s^n؞`r^>p>ʕ+ٶmäaq2 Mpp6op˱lz}smomvr"" Mz!!Dl٢6:UKj _|A죏rSa!%7;mrFΙ3L6cDzj*&MM7duBs簧X+8X.]0f̘ nOOOgƍݛaÆVWqq1˗/رc}\zn_|9nӯ_?~ߛRa|7l߾ƌClllX3Ǐ` eҤIDFFR[NN+VppW3bĈj\ Yd $%%Ѯ];SjHmVU~6lOhhh׳~o>O(k-"-.U]~}_<^|E{"##9s&UVl۵k*l۶ͤoBy8p@ٳAqul'Or1ײeY`o㫯2BN>ͺu8tP `ٲe\r% 0.̴JKKٿ?W\qyyyL6*WY3ׯ-Z0hzYti.\ȉ'f֬Y궲6+*/oT{p<׿>e E3fZ^Gjpᡵ֬?b=CB;~mڶm˖-[8p={` :cR\\۷)J}ͷ~Mo r W\q .0jnذ3vXZhuL;aԩ9s~CBBp\)5PPPNQQ!!!?j tyf_L.F͉'!&N]vd""";v,Ǐ'>>ߵ }:uⷿmYt޷y˗ !efܵoz5#&X\\aɓ'+oK.CxS}]{6Z|--sfaU̲|t^~e?0n8_Bhh(3g$33͛GttF{石rJl6۷gܹjʴھ ^u?N~3gfg}B!|̊0~<n0}+7IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hmatch_imatch.png0000644000175100001710000004672514266763645024513 0ustar00runnerdockerPNG  IHDR Xvp pHYsaa?iMIDATx{t'pRE҃ TerG9\*KD1 ÊP`O\dz N"r;V#phqZ(R :ut^ONI$)QrGw]ڷo_N< @/e]vk$IT E?W^y%ӦM}-Z:u#GfvzH$)<'O?fȑk.rwfɒ%?O>9wԩS>}?6mpW^pW^I9p;{-==?w͚5?~ I$E/KHHj߿*oo}_s5L>|iӦՋm۶]BuF֭sv j|3gd…a/M7OIx̟?Twjٓ_\'?Cwgѣǹeff2gmvn֟'z-fϞ}?lӻwڶmsc>峉_> _$K´ipMr%= _^fFv3fϮxxy8dҥ}̞=4{9:vȬY\$IGaBh< jHnݚ~3g?aÆp:MԒ$IRk,_&]Qr1o]kWV\݂$IԨ `Dh gQ<DܰKP |>g|6[gܹ0f |m#ZDzBURRB>}(..vә$IR|)ogC&տֿ5-X$IJY7CVTVºu0lX%?[$Ir"Xnݠ+I$jނJ`I$)e A~~~rD$I)!?6>b$IRR;}f΄7=ze $IA(, 6Oz $I0n 0hP l$IRD`1z F>D$IIƎ'9s`Z!l$IRRؾ={0*dd] $I/~BVP\lgI$% xQx`Ֆ-н{U&`I$)! t)LD`$IRYڴMO+Rmق%IQUyy0j 0|$W@$IՏ<7qz1H$)m(+ի;®Hef$IR܊D`@bG3H$).äI0eJ0jF%P`I$)\˗Ä aW $IJA 'N@a#@$IΜsa׃z]-X$I ݧBn.6,Xg{y2H$)T7CVTVºu0lX)l$IR("Xnݠ $Ijt6 z îJ` $Ibj^ط+W@$I3п $IӧaLɁo|#8ߣGRl$IRT`ԩMeI$E0n 0hP)l`I$E"#F@Ϟ]Ç"IFVZ cO9v-tvU`I$l=| `+RqD$IU+(.6|zI$5HE<(<@0j=l$IR AՒ%CU $I5kukش "%[$IT'UUF]ÇjI$ѣ0~|AS?V@$IT+۶=7ހ#îHȼ*IE"n ,)1| $Ir4 LɓaF%쪔l$IR Zva„+R2pD$I((&[85$I9s΅1c``y^aWdb $ISͅ߆ `lO5W3H$͛!+ *+a:6,슔l$IJa,ZC5#v &$IR*+ ZOi`zHO*%;[$IRЎpーoWR,"Ib -$IR8}f΄7`V#쪔jl$IJ0t>u#v$IR[ƍ4ذ "2[$IT$(8b5|(lI$TZ cO9v-tvU-X$IIg`PPG]\$IJ" ZAqC"I**GiW[@aW%],Iw/dfWKC9bW"I֭֬a&7스ق%I /F%H5?Enhٲ%ڵcȐ!kwٲe4iҤگƠzIH^7paW%Վ-Xػw/ǏgĉS^^ο2zh~_g<\s5]+T$IJ۶=7ހ#îHH5.M:>}s*5JFҥ0mttvURقUK͚5s;v?~%IRBy9LSɰqCR'Np>.\o^{N6mhٲ%GfQV$%={[!?/矇îJ?[j0k,~дiSƎŋke˖<Hqq1=z+%%%t9K$PP'BPXz]p̘1L>󩬬/l1c9r$C g^vْ$)9.|{0f ,[mۆ]8 5ѣ=z; ##Bx3`|h*IħBn.6,Xg{2332e v믯ӽ;wOS^;sLϔ$IefʂJX Զb VXq޵ҐI:8y$P}ᇴo߾V]p!{!IS$?̚jaW>.))O>!UUO?kOfhтnsNN>}u_b-IRYYr5}zp%7W@1e>s WXHK `Р+,I(DG=f$IR;x́kCe $IRl=| 4 $IR#/`@h _3H$5 xQx`Ֆ-н{UI,IFw/dfWKC9bWD$֭֬a&7스e $IR=UUA^#v R\$IGa`#/̓~+]D$m {?o#G]8$Io-8P!ՕD$a$2&OK-X$IgOrk,_&]\$IAAA0 (,4|H e$Iƙ30w.Ç{ *)ق%I7>rsa=Sͥb$I+7CVTVºu0lXI,I$Сp5]Ç $)啕-Wӧôi~=]l$I)m^ط+I $IJYпEE) $)> 3gBN|u+vURjK$QXl::R,@$IRXƍ4ذ ")؂%I^$(8b5|H0HVZ cO9v-tvURK$%ۃCAvE\$IIU+(.6|H"IJE<(<@0j=$e $IJ{Bffzd <#vxc$IIa>h6m}îHRul$I `(0 k+ $)a= yy0o4U)@$IRBڶ-q8vEj$IRBD (XRbD$%r4 LɓaF%$Յ-X$)!j{7,_&]pD$Ž`Uy9>Df$Iq;ƌÃz]K$ťC 7y,ٳ=\JIw6o,u`ذ+Xl$Iq#E`P`ĮCJ.Iʂa4XîJRcK$nǎ`}_IJNHPC~?>dg$I8}f̀Ȁ[Gm`Iۿ?S+ $Ia8HK `Р+K`ID`|1z F>c$IQWZ cœ9ڵСCUI -X$)oF> 0ztI + $)j/U+(.6|H2H(GiW[@aW%)؂%I޽^-Y=]I"I͚5p}к5l}]xc $Ij*˃Q``ĮCRu\$I r(~yԏ8%]D$۶m~7`Ȱ+|B$Y$l0@Ç1H:)/I`<6n.]®JRK$ڞ=w NvE+ $V VPXhT?IT3g`\36vU-X$\xXfTsI H5?Enhٲ%ڵcȐ!kرc<ôoߞVZ1|pJJJ\$IkfGX! ػw/Ǐgĉ?.Gfɒ%5[UUw/ԩSY`~)Æ cݱ(_D`":&;lXUIJM"H$"Aee%}ԩSܹ'''+W Ç5j/E-))O>ӻwF$I2x!կ`L?®J}\f͚ѹsg;VVZEǎ;vk۷';;***\$Ic-s>$5>H N8#GXp!o~{ݛMk׮h,IRC~?AVVHJ^̚5կ~ٳgs=x9p:uk|ITj$>N3 '22`V#$%3`ƌdff'Oee%_|E]A8p &M#ڵ矧+IRZyVîHR*3T#''?ѣnݚ>}0|F]͚5_gѢEگ$)"IRχ~.*2|HJNIBv4̘99[BaW%Ia $I!ڿ?S+)@$I 0n 0hPIRق%IRE"0>={#v RD*-caΜkZ!$)vl$)FoF> 0ztIR"IR ,_BVP\l $EQE<(LLڲw*I -X$E޽^-Y=]I2Hk}AְivEl$UUA^#v \$= yy0o4>I:DFm[qx 92$)>$I o-8P!I51HTO0iL'ƍХKUIR|Kzس'8| ®H+ $QAA0٪ TIj;ƌÃz]$%[$IC 7y,ٳ=\"I%l YYPY aaW$I,I."E`P`ĮC"IR5ʂa4XîJ-X$;A~~~%IjHW_  $OÌu+vU|l$QXl::-IRJ[ƍ4ذ "IJn`IRR$Èгg0b!Ig$R; ֮®JR-X}{0ba((ѣîHR+ |9 ZAqC`$% xQ81ve tvUl$%{!33hZz&$)iY[æMзoIl$%*˃Q``ĮC+ r(~yԏ$)n@$IIc۶`0rdI I^$l0@Ç$+$)äI0e L 7B.aW%I[$I kϞTݻC'L"Iҥ"IJHdr(,4|HR0Hʙ30w._zW$Ֆ-Xq;0{KR1H͐n vEK"Xn݂IJ\IR*+ ZOi୷ ==$I a $).ݷ+IRsDw_`yQCD7N3 '22=z*IRcKGaa|TGJR22HB~=iia vEhEEEL:oVZqWͮ].yehҤI_A8"?F=IJnTclڴ,qA/^L޽~GϞ=/3~i]qQXOi)< ۿOOCfaW%I6H5o//}ܵz=~_^g5}FLIJX۷#vW_ 6KR-Xո[ ^{-7x#;v9~8]$%a@h j D8tڵN6mhٲ%GfQP[E<(LLڲw*IRقUK/駟u-[<@y[)))s1X޽ KɎؕTe;wc1h &NXk>cƌaȑ 2gy^x!JR\YڴMO+$K8x w}7m۶eժU4Lj3`|(T(I `(0 a$RRFűcظq#Y;wOS^;sLڶm{޵\rssKR,= yy0o4#/I fŊXk!U< q)222صko&7pC~އ~Hkڅ һwymۂeez5qGIRTpII }\m?Fee%999lٲ+W2"8p;wrs>|^u;V$-%K۠C!I[Tc֬Ydddg]p;w./"}]v3DnK۶m)))g?;w'"I1Q^݅ y󰫒$#H5{=^{5^{ 6T''']r:u7Mz):v%)4{28aBIYH$ DRB((l^yz "I.p$ٙ30w._z!I [$Iur;0{Kj"I͛!+ *+a:6,$I,I%E"h  ݺAICT?IRʂa4x-HO*IRKtQ;v#vJpDT|/`^Td$5$$IarDѣ0~l0/*2|HI/3 '22=z*I-XT!;n 6O]ID0n 0hPI l8$I |9 ZAqCh3HJI#0qb0fw=$IJ~`IJ9{Bf&>,] ';bWX1HJ)WC6ivE$[$*˃IbR"Nʍ7HVf׮]رc<ôoߞVZ1|pJJJ\9z; yyW]$Ij̟?M6׾5<ŋݻ7ٳEﭪ=?8ڵgذas7TT8q"h㎰+$)@o_~/}KЫW/_Z͛7rJ233㩧_zS͗.iছ`J%$I-Xո[ ^{-7x#;vUVѱcGƎ{ZΦ,?äI0eJ0jFÇ$IRKHCѮ]_һwo6=?S^^^}$g4C7*It^z%ONNN;p:uk|ITdr(, ®H$-H-ܹ{A1q_{IWqe]vי30w.۶A^aW%I&K8x w}7m۶eժU4k֬׷hѢ}N:}I!ͅwށ `lO5$)@jPZZʨQ8v7n$==tԉ\p3gҶm撛[ʥ԰y3deAe%[Æ]$)X+Vw4j"N:EFFv7n}7|37n꼍腅lْ뮻?c…ݻ޵K.f͂WZd{IꤺKJJӧOH%Tlʕ+4hP;p;weffr!^ys׎9ʕ+Ȩv++ ZOx-Ç$Ij̚5W_} > ?~<s_䣏>k׮@@ȤIx$JbHIe^ط/vE$ xxx.Rf͚㏳h"N_p`QvE$>D"HE(p=  w?q`R򰫒$*pH[Cv6l ԩؕ$)@$ť4ذ.2 B$%`I+̟#F@ϞPRb$)@$ōR3'Z:t*IԘloF> aW$II[<8ѼU+(.6|H BSQ<'BNlݻ]$I&[$b^̄<$[ڴMO+$Ib <.0 a$)")&a͚ ̛MDcuEE~';"I?5,YCǎA˕Cf0iLLڸt *I6[$5={Sw0!$IRpDR*(&[CaC$"Q9s˜1pmvU$)؂%\xXfTsIT=ټ֭a®H$3[$K$СЭ>$Iҥ@$YYYr5}:LoaW%I-Xdǎ`}_I$Ֆ+ j-? 6>$IR@$]_=z]$IJD`I [ΧNuĮ$I?Zƍ4ذ "IltHχ#g`ĮC$5=9ڵСCUIda soF> l8$IjLH`r8ZbÇ$I**G``-н{UIde Lx}X&OvĮ$I.V6m`&'$IR*KJ1UUw= $)V\Rѣ0~ fy$I_s"xꩧ;+iҤ ˖-ս˖-I&~}Ç/x믿Nqq1wyg,S=m}oë3>$I+ 5Xx1ǎO>^/ ӦMm۶̝;_|>]p뭷r-зo_ڶmKII ?ܹ3O>dXjirxzXw"Ia??ws++0~ io[֮]Kyy9:u&O=;vI >~4 _E$IJ.M"H$"8SX\\ۻ23ab<$B}\Q[ڴM}e$I&t*˃!Im(%= Ú5A7%IST8q"h㎰+$IJ~櫔%0x0t%%IX3(%uL &\mW_vU$I,%={{a ®H$)uVPL*/BÇ$IR JJgܹ0f ~;lz]$IlR9trsaxY5S%IDIefʂJX "I$5["X(ݺ#v $IWV\M]$Ic ڎ} ??h$IRrD +? 6>$ID /` Ɂѣ=z*I$Ն-XJ(Cv6l ?<#v%ID cz7҂3> "I$Օ-X{̟#F@Ϟ]Ç$IRb2(=9ڵСCUI$lRھ={0*dd]$Iťa@r(.6|H$% JE<Ll8߼w*I$5[7Lx}X&OvĮ$IR1(.^ mMЧOI$)lR /+Q\l$IJf(4GfMB̓FbIfQ('NWwvE$I?oVLE"d  ;>$IRD1S^&)îJ$Id bbϞTݻC'L"I$E]AA0٪ $I9s΅1ca6+$I&[An.l> fy$I ͛!+ *+a::4$I/lRD`Ѣ pt5|H$@(ʂ[߂ނ$IRK cG0bw>گ$Iχ~ EEI$z9}f̀=:8ߣG$IRKu< G?sĮ$Ij:YƍA®H$I,J$Èгg0b!I2JKaX3'Z:t*I$%"[TۃëBFFI$)Z/bÇ$I TTĉ͛{$IR2Kٻ23aR<$Ij<f wi6A>aW$Idc <5*Q\l$IRtՏ<7K%I%m[ߣ V;"I$%;?NA,Y(XRb$IRl@RLy9LS6n*I$ [RȞ=w NvE$IJ57X),4|H$)$w ̝ c׿l<+$IlJbAn.l> fy$IeIR7CVTVºu0thI$I`%H- Gn]Ç$I$-Wӧ÷oaW%I$'[Ď} ??h$I+ I ? 6>$I i1rr`|=®J$I8[A(,{$I~=ii]$IT;`]DYYO=wy'W^y%M4aٲeرc<ôoߞVZ1|pJJJTS$Èгg0b!IDb#GOcn:[UUw/ԩSY`~)Æ cƎ9skCz(I$)4ԩ`޽峉_>Q2\D͹ꪫuUر#cǎ=w}dggSPP@EEE0p \~9CFFJR#'~l&| Qһwo6=?S^^ή].3**Ga`н{*$IbSN\?{O>0x0t)ТETJ$Ib1QpI7o~.kr}p啰i%IP@E8uԹWl0,\,ɽjD /M7O|ڱcpuq(8;Ao^}1xT\/M7O㏹.#!@ofƍTUU-[ruU{ȑ#/I׮]/J"IxAoo(W:l4i䂯Mxꩧ;+iҤ ˖-ǎ}jՊÇ;O5,[O&M8x`t OrEEEL:oVZqWͮ]juj}]ʢ[nlْv1d^{Z{n܄> Vbƌ\{,[3xWVV)--'$-- 2tP{=/HN}6g?/?͚5f)ȑ#<\}tM۵ロ<A 6b"|z駹kλvW4N)jlڴ,qA/^L޽~GϞ=/zk9MtݻǏ3qD)//__=z4?Ox/zz( #@g=wɓݻG TϏ[cǎHf"s΍Zͩ!橧ÇG̔uԩȁ"H$RTT"?ku~Yrk~i+FܔӐ<DXajڴiSkv4o`…~5{ Qv:utr>3***uj:u*?OXj=կoGfNCe˖<˿ wúu[ky饗ؿ?9995M8j||ƬYh߾=_W={6s/;u&(;y$͛7iI'O}@UL>{߿???|*++/jNݹe-ZԩSzݫکﳹ7|QS5U <iDm۶MlTMѣ#F7 eeedddԸN@SN8pgW{ߕW^IujϦ&;w>kpmjh<[ESZZʨQ8vW}N}Lj{ Qv7k׮ ~u6mJ^ضm+,,[nnݺM%}6Di߾}cz)))녅lْ뮻.T?O#8uڵ7p Ml\:>UZZzީ;HeffRYYɒ%K]?9 sfΝ[TTt^ӟ[oEVVVl~$֐gs ~ޏc>̝wusNN>}Zff&W^9wȑ#\j{u=?:žlʕ+4hP}<7駟^p,_-Z wGD]vv69s&_Wyٺu+֭cȐ! 6wyǏs-pqfϞMZZ={~lZlINNz.nM6Ѳe˰~xb;'|cƎ-ih۶-> /"}]v^{-r }m۶N:QTTDǎCی3HFFy?~<4{?!C|K/sNoh:1(D"'N<"'O|_l22tPOnd}>͋|͑mF"W_}uGokŊ#FD:v/D.2bĈHAAy8\$I3$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3I$I1c$I3?@6mᕵIENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hmissing_idiff.png0000644000175100001710000006471514266763645024703 0ustar00runnerdockerPNG  IHDR XvpiIDATxyxϰ lEDEZ$DRD"&HsW-S7w>" H HQdi%h&5絼_10k,ߜ{RX#L(dsQRF@,|xV@E+)A"+ 5!4"*~Z+# >s@dV=JOB/q;PUI7 eD"n@&B\T~rE4"@pT2rUR&*DJ\R|D`b䪤7 ~de䪤7 e}Sb*)%Fo@/Ƒb׀HD/s rURlHEEJ}RH~GJrdnUI6 ,*,8GJ_"l*) D$ R䪤7 ňdγ*^"UIvHDJ߀#DeӀHDh0rUHP.\,|.\D"݀HDH<* H1"Y"W%yd <*[ D$ UIk@@x\,"W%d|*_ D$ UIk@}_IJb2aO\ډ Bj޼mV];vL*,,ԓO>5kj„ ںuիDUj.u8J?qB]:wÇ˽ɓ'>ӦMԾ}{IR=H/ƼlXƪGR*viiiM6]t}FFvڥ?<&X)ùg#ԋ'(55i׮]:zhJM4FR)S芤$}uХ_,oӧոqKV|cZ',`UЀ믿s=jРA7..Q@1lz8`tX? \y [$IS#w+fMi3w2)-Mڱ#uASh@܌ p}'{̔6m2n^?^-\y 1% [RA4rJ֭Mҳ%c&XDʓh@HhD[7MەuHo"ri4 ^B$ qmBfEfi];ijU@<!4IjB.ەD.ՙnݤ^Gh@H|=bTjJװr3ҷTXh*!"WBeDSSH]&=JWҒ%fߐTOlW>Bwh@H|iӀ]Ni^U=!۰ĘF]ItB!ii:,\ _ɂM(j%unHM5 UZԣ4nTTd*p!"WBgD!p9^Փ/^x\[kU #""Y)S>hثVMz9i {JY#rH4 AA$ .vkfߏumW㜌 {zÆf'ixPD$HdrsÇ~׬v4x4t#҉8"rx4 AC$ .K]wЃ !A}cgmW1D %Ѐ,Xox$i"ixs0B4 0dɓ:uAlWb_($=jm=}zU@Bh@oDG'N1&F.Җ-RR&5O!rrЀbD'sJ+q&M>0cG ]T+T "#Kjv5T4aӻl&a*(+T JG$ YZ_QlW~ҦMKۭ.A Dɂ6mv%кiBz1c3glW"r*ABm65ʨSG5[N7d~U,"W *Hb`dۮ{B!gʚ5Ҟ=Rv&qE QAB^]zQvmxWzoblݺI/>8!rAB̙#}-wcaCiJg̥o_vU|bUG$ PvU|b! ZJھѻN[3J+8A$ Ζڶ:u]?l)_o 4H>\:}vU<D!Revf3Sӥ;]!rр d!骫lW4dnt萔,x+ A$ ;z6~PV-Gj9/$-MC7N**]"r8sdAfmWfZ:Rn9''#rwrsL*+D?4rfgԮz"ro>hB_:uꤷ~cgΜP(r8TsD\i2ѻ.KmHݺI/g \j.ݫGT&Mt [ݻ^{5 :7n+8K_΋pegKnNT5lh=3_"͜ivUV=#4 u]뮻.nĈJII/\GJMMuDH\ rl&9GQRҠARj[R۶+|>CWMȑ#>ѣ:wsEH Ld6^ە޽|Xv҄ b u֭BvUuUbbz>j)YV|9|ټԲ~7d pc|V|Ikjժo߾)D=CFF6;f*\"!uSM]8fMiidm`b-ޅBҐ!Һuf.9Yz]U\HĉKݻۮT@I=zHIEE'p#Yp9z˥^0vUp5"W@\p"YS]Ni^U+h@?)##]u4`@, ֭wߵ]|oCUB=@BҤ=q㤢"Uy+ 0h@ƅ*^=ir]pXE۸@T&=bq"ml*#r s+WJ!U}BUavOoPs:/@ ,粳vp, ޚ5֮ yD:qvU.@ 4v41ѣƅ M,͞-͛'Kn*\GXNԠU ܸ@ (m ?n&f-]j8#r{4 O ҆ .< ]۶]>}cgmWD\3S˸, E%#l`[D@PQ4it}R&8HWҪUҶmfP1"WJAЊҮ]ҨQ8Hw]H[H]'ul9+e|(;[j^JH$ &M>F0]U\( 3۷Go U͚҄ fLRZc* |f$Q#sGTdq)mdܾ4z*J|i,3*!!wH$ ֭MҳgUJ|dtAeذ1, ԑrs\99fߐmWU+UDĹs&~%]}߀HW4rfgջzG @h@X|H"]z/i#u&DDl͉#UÆf3ϘK߾Raa r Fh@ضMz}W?J"Uҋ/JK}CRSO>7'r h@4lfvqD[˓jז:tqc4 }2| "Y@\l)_o 4bV?4h믿^O=~_(''c ԸqK/nԊ8sƌ޽~~}TS8P:q2Ô+y%aO<~i?Ν;cNUޭުkת7nܨDp ~ &0 eg6zٮDة.]-[LsgFdP_EP3gh٪UnfIfUcǎ:sOԢ ~E}a-X@zx~PJoѻE$ ^%\5i"}4b4zԿtXjh~aÆoUNt5z7cP:u$I>f͚ݻwyLҡC=k:w~YWN5FV,򪸷G͚҄ =CL HDYYYV^}U >\/~jɒ%]իW;C,egg7ׯF|fWڮ&Nظl,)mdܾ4~ BF:!3yyyJH۶ImخƂ"%b8v̬Λ'=KfxĉRnm>$6.")9es^Gv#u*.X\nFsƃ"[ "WȑҚ5Ҟ=fT1kn$E gOەSJMVzoV_u3q,ҏEXA9tzuո,C4l(\)=+hЀ.6eteۮąd!H\F %K̾!'[!N6 ȃJW\a" c<{KyyRRҜ9q/Ѐ.5t9 ?*O˖fߐA/Lh@ ݌ v#0"Yˑ$&J3fHSJӧKw)k*^AІ &ѻE$ ~UYB!ii:Z,x B'J_/un"/ri<&iiRҸqRQ 2p9Ъ#/qy@$ ^UyU{NZBڸQJI6o]7\)̾uڮGd<*OF=aC;̉'1ErsÇ1"YpGӬv4x4l#҉4 KRvt]RV)"YpDʓ M,͞-͛'Kn*n@GI[2z7.dF3p-~tFDvt?]I@B<}mW*#,DQCzEioHj'  Vo7od+W[3J2o,;[jVv%"YDuZ֯7 $ .>m*EѮ]Ҳe%"YBʵ3Sӥ;]ʠ('GJiەDȕBҐ!ҺuҡCRrPQ4 @=j~[7tTj("YDsRSy!iiRҸqRQٳ "YBʳՓ/^x\[kU( EEҤIf}ӦA"WWsҊƍRJy+O?5'#d+07l(q9Qp v"HfͤkaäGN] р۹Ffr"W Mlν7OJO>vUрɑ4lW e8Pڰ IM.]pTa0k0mWW!_Dm[sBz׮R>رٳp̙ҩSү~e rxIIҢE撑a60` ѻI\c,gB!駥Um`mW +]@d+KiΝ͔B~,-o/vJDbѤ҈DKǎٮ ۷G#HVB%Ԭ)M`._.I;vخ &IIgx!r*̔6m2n^?n=@Ѐ1v4k4| 2"YC Qj4!={=ƌΜ]_4 @Mn޸ ] |HVdDCuHosL*+KjWd] I#GJkH{QWۮ  -3oZFٮD$ rKR6RnK/ CRDF1AdB5lh>+ڮ  Fm'Ad5jH/(-Yb IM>vUр12i{mWJ$,[˓j6sخ6 Ƽ! n6ʯ,"Wp-;!ӧmWx n&` j"YDBҌԩfwJ{ڮ  JgJ" `NZK$\, ֭wߵ]-4 @.3Wj$<$5՜&!'ٮ  J'J;߂H+xPz /wK_m*h@(l*}!¥"rVMz9i iF)%EڼvUрQ4I{] PF\G22 JwaNTGÇ7ސѻE\5֮ yD:qvUЀU4m 裶+*-,"Widili<)=]sUBT3fKۮ$[,"W ĬKmW PK_~xG\!ڶ5'w*#klKxV"YD`IIҢE撑a60$?X#FP6mTvm]{Ν;=v̙ B/CpZ^S,"W$4xii*i6];izU԰]?^֭}ݧmQrr6lؠGǸqtu]tW\Pňl3W/ە1GnB5 DKt"m"efJ;K4r@рD_Zse]v,?OSѣG:Y&,8xPzMMqsPPeV=R5i"}Y=ڬTʀ!AzzE͇$jJmڴ+|?Gչsb],:U^x|,"W@Ԭ)M`._.I;vخ  :xWpj׮]Un]%&&wN;WA] N"rTZfisvx }*vz衇+hz駵j*GzK*(0y] *:%)W@nm=,igpwرCvڴikתz:>RN4tPM2+%%EyyyJNNlX&{+,YK99ү-vY ivUkcPϞ= V;n{|rͅѻ64@Bf}i3wjU`O գG9rDk׮U(~ѴiS}1ctuWI-9XMɺk.Kԭo~è^[rss{uR:uJzΝ;{o 5hРB0aKz.RP`Ǐ7*PhD5l(\)=3_"͜ivUG|Epq UG+s)++K_`~oWPP;vg}WwQ^^wXpΔ)eI?l_1QҒ%fߐTOlW+ Yfij޼$Hv픚$kjڴƎ ti@|Pb#{Vyh7.P޽<{0^]n*Izo_$,-_\+Wԉ'Ըqc 2D?5jTpҡCE@UtopѼ4"@Z4;?ًjzlWT cx]nחgqVٌpT8,4bt-҂Rf >Es@Rl`Ƃݸ@BҐ!Һufu>9Yz]UGbD%f 0B،- b"5,-MC7N**]Pq4 @p9ASGDz /wK_m*bhD0e(=J8jS̘Çֵ] XEC$ pTF=aC;SwJ͕6SFߊ*"Y5֮ yD:qvU@d4 a);[.U+q*rU"YɓٳytmW\GI[2z>Uyd8Ќ?~LZvEh@ dgK7$+bmն9!kWOiXYU }ŋ]>WlEC$ pTRh4~dd h@M,ծ- d F*,1ҪUҶmRvBр2BM3CԱ] n\H.]-[뮓:w6ch@IsJwn\H&M>0uGKKǎٮ AD+۫Ԣj(x%rU"Ycj֔&L0cz/Ҥ;lWA^-ޅy-rU"Y23M̟۷Ϸ[-|خ"FC$ pT֦ SʒƌΜ]{٠i(>*,1uHq99fߐmWAMl?JJ[ە \ ,1ҦMKۭG_:rD5LJH] |ȕ?ӺiBz1c3glWx/Mn^ G "Y#ԑrs99fߐmWx;gWYYWۮE*Xd#5k={vիmWрw-3/bFٮE*dIO6mnݤ^%h@;R6 \A"8aC3g̥o_vUp |e6x r QҒ%fߐTOlWXLd6;^ەW\!"YczڵMa!h@|c^7Q#r 8eKizoȠAiU!h@n&` j+T,ҌԩfwJ{ڮ Ѣ/=+Կ9 +T,4dnt萔, ҥҾ}E\!dHM5煤I=zHIEEBUЀ&N:v4bHz˥^0vU,x֭҇(dVMz9i iF)%Ŭ;h@y&I?t=+B<avOo>m/^AO;|Xz J"rx"8Y3iZi`3G'lWЀӦM3ߏ>jx +@$ pDB4y4{4oY ٵvU( <3zmWO r7 8b@iqs^ҥ+Bih@YK_~)ix+ ,mJ7K]J}Hcǚ.4 lsg[lW#r7"8")IZH?\22pxR^uhەՈ\ d1 IO?-Z%mf [vU(FO6/z] \H.]-[Mj";7<([jJDEDG4i"}4bIN  ;f`L*Unf~!r? \͚҄ fLeRZcwҫJIW]e + ,ҦMKۭ'h@)o%0z%ѺiBz1cbxĉRnR6++BbN)7לc ٿvUAظ\F] \HsITY##k'^m`?ֈ#ԦMծ][^{233s  :T 4PڵյkW;\M$]wY2EB.tEnK/v4ƏzKݺuĉ5tP}JNNֶm,N)(0'i&`!\D4l(\)=+ڮʿE!_ך;w.eee??SӟJ=v…Z~,X~I233u 7ܹsߏL.Lzaە"WÑ jԐ^|QLLM5oڶ]AzzE͇$jJmڴ]Ni^U HرC?nv=eɓJHH/Qq6ePF +d1 ICH֙4FrYAth@qSIIIZp3VZ8u&N^v% "W@d1j~!F$<UBCGڵkդIriܸ .ǘ1ctuW+X?…/Kh;Lb"77W^ԬY!Q(рԩSիvܩ{O7|s[vZ]t"ƍn0a\_Lb=d8U C%_4!@Ep~~RRR,U^9s)++K_`~oWPP;v̙3ׯƅ,'-^l6d >l\>U&Ojז ] b)W1% @р5NMԱ] F "Y1w1z\C$ @ЀG%haT+dp \aj5'ã\A$ h@ 7K?JP%D!!v.5x_V= #^5$V@`RݺخB,1D^]2 r,1B̑Vz1ەBr)YDkG#5onbDDaͪUJ*~ t: Ζڶ:w] JE @yd$V@`Ů]ҲeҴiG+iTjX99ҕWJخ1 @e1% @р Ojղ] .B @d( nlw]XaJ2Ѐ I}MmW\5"YJI舫+O?5XH' XA\egKIwa|"Y. fNi i sDsƅ &'Gj@/mW`L`SA\aä/]M@D@A\̜):%W+ (\pdEO +nG$ NBVv̱]IFJ+ p\vԾԡJ!+ pf9sx V=x 5iԨt}+ ~,h@#GY䫄+~C$ -8ftF:)W)YЀΙUVtն)"WH+G,[&#͟ob@E:A?SX#mW3D,XAm&4wJ|l\x+ I&M~lW#L1% ,7ߘMjִ]<1fС+"WP1L<1s+RRÆ8"WP9DϠA,]*'e#r! bfDcG)9v%E bHjELl*}!V[l\+ IPەx +p,uh@Ç7ސ{ѻB H*4 ڴi5|ەxS  r{R"W`,:Deb/#mWDdVр *R-خ\a /,/OZNZv%.ƪ[8yTo+ lY3W/ەx, h@P%Jo)=TuKo! dTzui`ە Sۘ8wҫJJW]e!r@$ p *i(ە+"Ych@Pi'JݺImخ\bӇQ)7˒%+q"W FJ:^Jc2ituRϞ+ , fh@PaȑfV `#D6eteۮ"W)Y@h@P!O+]D"T *d|!iە+@YdFrf.nm8"r"Y@0ڰA˓/]I. 5qtR+"WhERcǎWuUW) i̙:v̙ B/p? j~i!r"Y@`7nZr-Zzucܸq. 2EJLzv%cKDRрq*((W_͛7}=z(55Ձ)̾uڮ!zGnBC5U:9zΝ;/7W:|ǣwi>@$  vu*11Q{g}f l鮻VlW6r@bbz H^^^~e+??_M6]b>HںU]IH@Leff=ܣ uI5eULvt~fA&Du8رn6{K)׾}ҨQ>K &D`QӦM駟{1c());UE&Ojז ˷s7#jͽBK H}jРA0aPѥNMԱRB|HkEp~~RRR,U~ XSPP;v̙3ꫯ.;C}6mc甫xwK-[ڮXx, H[{=EiѢEx4eeeiZrN8ƍkȐ!zըQ^WK4aJDspd(Y9vmoi+7ױyX$iniR3S?#$tH2Gݺخh>AP~c tҐ!fO` H̑Vz1ەT@(D\5!4"+ۧa"r,x'ܪUWc+~t:p9V@.;[jVv% r@dX ]eˤi\:E q!<ɑR0v%0 cJ<$Ojղ]\PuD4 5{Uw\=dh@H4IWjv5#r@ɂqz\)}:V=pNԋ{-,a$v;\#a$`vVf̰ÉEX A闿TS)Yp),4+ÆI_n"WG$ р̙ҩSү~e3 `J, ѻI\oL " 8 = Vv̉7%rE+q: H@dgKK:;d!X suU IRF}9h>>da4 >w4k|7"rɂh@|ntG2 bJ@cΙUVt|"W,'زeҞ=9G{|yG%cfn1S"W,+ >mܹ1S"W %V@|j$I_!S@1d! 4 >7få53"W4DP4 >fСQ+Pdh@|YW #"Wdh@|fRi>iԨ*+PUDP4 >3qԱ\\hB9#[J~XōYƅ(+ >2iJS\B4 >qcUb.+4"Y('M3!C*xS@0% 3g/D-D _XXKirnH F$+h@| ;[Y2nD @c IIoU XnG[5+ -5k&4d <(RkYDW :U^]<+r)Y@Q}'4ptU_I x,ߣޒ Q "YFQ'JݺIm~D ,_b mh.a>iTd3'A&|~D$WXPHt=;6.V@)W 蘒y4 ^+Hр DƔ,Oq3"We#94 nIRX,,Oa ˄%)%yRq/  4 .#ͥ_fP:6.t=>κESLjՒz(Ux,W)WNI&=Tnk2d Msnt4rdd -~tᰔ-uԪUJ"YBoX𣏤[Q/ d H.䔔KNNI)w)"2hܪ .ruM4x{$ @ljD̥Dx{{ظ\nB4!U@RYh.Iz֮]"U`7*11Q7pCĻП'5o޼Uؑ/]RِFB0ʳyfo߾ԼߎղeKլYS4o<Ԃ ԯ_?IfcVZ)##Cof*@U(+ eё#GG8zHZݻռysIR~ԡC=k:w~X+n4J6"D* ={FڞݻռWwyGo'O}9snF@Ñ!""Xeay 3cHi* ƅCRR) Fx>}Z<4iZjnB~W\uO>/\ .V^P(R$w1=޽*B!͜99rDCU Tvmuڕy13s̈ϟP(8[}1bڴiڵkkUffvYy8+LJ獳S-SNz+tN~ϖ9 rh졇… OUV9s.}رc;vL]vUaaƎ5kj„ ܹnݪzEU{WUN^Ç5n8]{[z [TT={ .](//OZr)6n8]wu]wWĦ?~֭[Om۶ՁdmذA?яJ=y|q޽{uQ=jҤN8zK{kCzl+#.!'[ƿ}7%u'O l2|yқ6m:իW?1/ȢylW_}tuԩpAAA8?㰤3*ty’ ,8ݡCW\qEN8<>3fK VL֭ >}vNHHey<>D|---MvѣGcVgUP-ztA'JE%mٲEɪV◸48qyx8k׮[ջwo}gKp8~lxQǧg?~\֮]4aXBݺu+; n)Wjܸ%_}7:}tET+R#Fk GռytwoufTL4-zH/^~ZVRzzzVQ9oKeeey;7vTyO>4h믿^O=~_(''c*aJEwz4y~?.*=wzڹs%lܸ#V~k͗|mƍjѢ~ļ cSp8={A*Ut뭷*??_EEE]qF%&&nT_SNW^ڹs-[oB񼉏>>yTaaaSZF UIӹs4uם>}Z3fmݦMJۧ;v\r|Q駟}E|W߫Jݻwwp\@;vЙ3g_ׯ_?Hon[N~rrrt߿_vIF$=C5kvޭ͛K2o;vԶm.y߾}u7ZWGUVZ]vJMMURR5}t5nX5jd_mO<&N^z]trx@xXY/ߪSNktڱc?׿86>ho?׬Y3|ׇy~}YfaI/w>xߋ}7իNLL wܙc;|뭷5k _{Ç8`#ůW]#LJ獳rss?OÍ5 רQ#|Wӟ,YrqgX "W@T|?XrĔϧdy< pOdy·Sۀ@,',o5 Dd>dy!rx>p)F݀JH{"W@<r_B D+B_En]IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hmissing_idiffshape.png0000644000175100001710000003744714266763645025726 0ustar00runnerdockerPNG  IHDR,>IDATxyxTL6" /"Je ) T$("OuZ(Jq EZֺ*A6UBAvd'3C$$d9^LfΝd|9c@cpxIFBz«b`N:֮Bљ30c ba h&O[nbBa&pX8 `&XbByF5gaAE47.Z/駪WBc9fu0v,̙U\TILMZK@XU !0T#;J%j:u@\H"-! DV]THK!|[3뎰jHK!|S"7q=DZBYִRE"-!nnxo\UDZBZYּk!i !whadU[H<>ݼ6œYH<YRE"-!0jHK!Ȫ6ό@H%pdUgH³ xLUDZB:FV3"BΑUm6*i !D˘}T6y j3fRH@UV5p`С{ !Um6*.C?}wOrx0h!Б "ڌj&O_m ή-k֬!$$?VZePB#EV]@hΟgs',\U:x &$$aÆi&+B2YdUiHYYJHϡիfrr4-.N@Km}Jkӌ@¸ꪫt٭*Cƍlܶ?-_ëtBϞl&עiT]63?fͬ'DyGv6;{}wL5 0Mq5hРLc|݌sx-uȹ**kn]+nՍl*Í.Nfϧk3 &p_&2|/e @Ѱt)̟_}&4k`T )88h˨Sttt1kmf~>\YO03g`4xY)7#?p0^@@@x5:<\͋6jBNgtBрDr5EwdXƍ## ;@` u5xW⺖ʕtUTB@MO>6@!G&%WsUm@@EZ˖t:|{֮aX'?]BRGdݢ#gf #|@ae%L#ı|E=={}{2|@92`[=)p?niteBׄ`0Kl.h ZYj3O}?wטrY!h rU^F ^ ZQZiV6:au zjDdhtѯĖRĉ[ҲYqB'\~=) Uk)z /*q$,c̀P!< JƨQ.@0? ] .V1bϖn>@fN(&n7nAAW>@"#|c4,Ww5Bfifd; 6cUz7PoA~qkiI%hDVS[RĸDO Cʪ]ҒHKn\mz_|~@OoU7Pc--ʕ ۷{g|~@tUVi !Չj>}S_$B͑dub2W {wQ"-!Dmn\i{o|~@@BB #"+WYY`C~n{H]Q#7I%`d*%. BB0s &?jKK󾵯jҷ64i ?<Y #l V5ra]:EVRSՄPB~@m"GUj*CoB/oBHKߡcd*/23ίȠAjMDZBx/"+WiiЫi<ʯ3fҥjM&HKcPdjfZQ~@ S7i = \jCu=}ZJKA$¼ \mۦ.d `(+S5DZB "+W65rh0M4<(Bnp'-| 0DVjJp@ r1^}Up8̛7޽{W>{l d̘1ŹFwV׈HU5k֯֜9xŰh oN "# -íL3֭/wK.aŊշiFqq1ܹih^2G!CT3t%,L}d :HUU50%> 03gu`XW]p|L318שS<L<˪>G]#<F&աCjv]gHoըdYVIJ!CԢG,h^ۿ|NHK_yad媲R-_2jѕx4zڿ87WǃJ%GV~I۳ux4tfPԺ$#+WII0pWh@ԋ@K%GVN{ߎ@HtgTDZ—Hd_}]gIi3`(,4/UR7j;_& u~0i _C+MS{]Ii3/B$#+W*2+YJIQiEpѕx4&W#2+A"-]|4riuϾ" ]MI%#+WJ! fTSzM\DZŒ ri\zژHi~ * JjHKDVmKEH3͜74:H%G\8}Z-_/4ӀЦqaJi #Ydj֭D?@Z >^G=Y"-'?\mެ'@Z``ubft% HKxFV WC]ժNOHPMM"- ~YJO=m[+ї4>\ont% p'?\m#F]P@:[J@"-YPXGI# Vv2&HK4DVٱt퍮D@ 0N?6&HK4DVuJNk1 cHqѣ!'3fHK\DV*.C R_|bt%$DVСtht%ƐFɓFWLi WY5() *# čBBT䵣*i7 J# nQMg+i!DVwpS'+147 B#ȪI`0X8i GVVu~n'77Wʚn$5 +q|DVMVQw≵;vzz{wÇ׸=99ロe˖TeicҥFWFi&A`nFWb,4nݺxb}].VXQ}[yy9o6s_gɒ%L;wBVѕDZE"f۸U 3գM61f̘v;%%%׏N:O?T0j|ѕxDZM" IV/NC2x`JJJp8j4[,JJJllz?Cԩu+lFW~i#?nt- U=~]=zxv;䠙|S5HƌClll+44IEE6Ν;WnZ"554.NjˍC,ڷ^z DVnyjIMM%##iȎ;裏Xv-|Ce,[m2`^y|MڶmKݫp8aҤIL0hMSyDZւ*_Hd6U{x*X, 6nq`iHTT۷3grwvEӵkW*++Y`AAA50it\J<̇##G'ղEHdVǏtޞ?VUbjرc6g˨ɓ6}FW?״4 4mdM+*2f'MM۸ׯUThڬYaXYCσY|>2iiF K_~\}Y~g?_>GZ0gq(6"dfBQ\vѕ4t}0~Kgi9> 3f 7=EfYyTr2\qz" DGPZjt%:H+'yD$0i҅4Hdq銍5s5++1DZyyyp(5Hdӧ@ įlLieHnWch>3ttiP} FWb EZ3#h} E"+ݥȑFWa>@ pjSo$*)SKS̚ռut0`ѕ4ﯶLJ2i<. /Y"5U]y.I1̙jE}l"r7.?GP`}d 5gf+1 #Jx)fvczl jlt%$ PmRD@HS㏻a"nU~]9I1аatc0FZ xB5qwr/YƦM]yI1ժ9HkBO{n/"i= ǎz'' `#F@;v] 1ZXM|yhLkWhJK[M(ٴ0z Ћ/ Q$2dII1Q:;w]53zm8xPW!!ڤ_$2b8|XHC@P@F! hb{/Sʴ229KTѕ4:FWi}lHdezIIpFWa~@L"8X(ꉴ,SA,^1JHdezpLm i &rjY#GKieoYg WسڷW(¤HV*BhD8'i 0NXY1O>S$IIw_hꋤĉp萚v*G32*'pwp9v< OdL#xDVޠ\@dƑb2aa*ՐQH} =x0Z-xVdD]ŻױdJWIdev@j*h4Sׄ:et%q#_h\,+mj>mY]R 깥n|L(<\͝`t%y3HGZ7a,'sDM\@e%ڥ.# ĤnoWG|kjuݘzI/0jbzu.J4j^}}Ν*zFӑV#. _oFћohjKHH'Vb0|ٿ?gfرW^RRfm۶R z[Ƴrrԇqqj0HkPx:U-TVm]_-)!+ v57 NYY999hft9d~z֭[kFh=HX,M(//jEjj*iii\>U _Vft% 7(ǍS Wqۗ__]V 0Mؿ?ddd9LL@mƃ>Hll,=Ǐ'--˗SQQObb"ϧwDDDTpäI0a>L>еnW*2ę3jƏR $Md㥥k+°aø馛7n&WlbX1cIhh(aaaݻa…L~J̙jJoEѕWaj\AETͲJLT#>Si㑵ddgW^it%u?r|2d rׯ<Θ1CL_?R{~ot5QR.4f2b /VVUgUfu֜9nu' 5Uk L37sZޤJZL]qep =\nnt%p!Jܼyi/ض wKD3Ib* /Vs^͖Յ")Ғ_`h}FWrރ xe+jH "-E_4NͶAG-+:ͷ;jH "-E%%j$, }IG+Qz]C۶>ёUCi"cn]uht%C QSf\Ξ/v<|0DV iF))IM}Ku% ćx#=6)2ڵjxZ5أY5r5K Uu] ~ N=UCi/z۷OΝķH1&?'=7>0DV idh$uW% ǴicҥsF׿ԞLݺy@Y5/bJ)SSYY?"=jTغl6<Ν*zR"\ <{1Rezet%ITWzb={Ԩ'+>Y5H˺a=3 z/F'oϞ᫤iTn*F. i /'IqӧkΞm3̝ <#F_{dH5L&J?/ >}wIq]@*Jo_~? bcU9Y5NU|;#|$XFe]@R7:~釤x&mW)3ͅId4aa0Xp~#jwWĦxp Ȫe&Ndے|мAfˌķIߠ('G5)SHdq|HV?HIQ]o'bbH䫯޼<@% ď&lP텅y\}5n:DVSˇ@Ǧx6mRjet%T nsiNg\ovX JJ覃Idq5i⎇jY]/i iii<̛7￟3gԸ=99ロe˖TڶUs䫔m䁕ufX6l{ᣏ>2 3b0c IOO'33PνqvJee% , ((>t&ezYRHÍ}*jϵ7!ӌ@ :+0?]5K}P>vZW>(7ŠӦUi-Z/S\0~ܱCm]оѕӌ@YVפ_|hVr HKhDV^xyU\ I14qa24k/СIKDV^^i%%@Idy(*+᷿5$ D$h/Hk^u`NFW⟤_IdSA^i%%ajy?i B"+V/MbHv4'Okf1auu[7J{@DV~jכ,ڸU cȯIdW W[ Ҫ 04#߱X KV78:zTd{p@DV~ ᤧA J{% HdVR%xp#-o :9#F+wi?wo?h"i L"+" n>C)JJ+@f俤"D=Fux0r:%2i F"+qAA0eG!U<iefBQ\v{-# ėHd%iu%Gy JN+PPO/J4ApJ<> HK`Vu{x;D3\=39i>>rϕ)F7J4SVj@BHk&D}V-S44o$p!u]nF#Gz3_%={P4HBBƍ>tx饗xW9{zDVDf̀ s8pU@~;3U0a/2hVBzܹsYp!ڵ3HwJLnЯ:1ZF($*tP4H퉊j=Hx'˫qbѫ̖J،PZjlIIpuͤA1]Nί8%K{Ѷm[LZX,`ٰlUnId%LgOK RZ o[7xhC3dggs^c6k 7 @zfjEjj*iii\u#Id%D|zs={&4McQ Y>|DNAA#--?˗n:F]}?ALL &Mb„ D_Ugv5.JJaàQɴEZaÆqM71n8LLPVV9x DDD`Xh׮Oѣ<\]+5^9SM魨jҤ}0Ҫ Fjذa 6NڵkG߾}(ᮻfSMcuѯ0~~=pZ.]xǪHk`w'wfϐJ3&3) fOBH줁DV‡ m@J>ǫ]`Ԩ>FZf$ ĝdAXÇ!0. 想F;Hd%|jcmy.Hi)Z رbc=iy4J{;ƱctBL Ii P%KzIb@C"+!=rr`>>nr2AA}FH٤4D"+!O>qcj_E"fr!Y qIG<^Vj-CId@" QF!))peqMA"FRDVB4Q?VZ־r7E+hP_v;JVi5HHd%D3Lfc8HMUSwCCWIU/i Y ,mرti#5Ft_M#VHd%DL;wTMj] yHd%[DD?MK^HƫHUDVBԩu0)6oVky%k Y vp5|ycۇ\]'4im۠{wy=?|Hd%EGÐ!꼬16mR᧑o7j!EEp\}>u#-l Y .]Ԓk\vNg'>ɏ"-k Y ax t''X|U?|8-+Jtﮖ&IL8xE }P_^50P|<|ڢݻUtձuƇ#-o g[Kb%@11j$WߖÇŢ]H˻ȹYVDrF!0sz,/kDk>o)β**bDVBB߾{Æ_ozٸL"-S5A~~>u^8ԄsYVSRZ\0oUB$*?#HBBƍ>6;PѧşNń jرXL<4M3:.ښLm۪ik90wȄ x嗩S' bn'==2ꔞn7:63?fmLubE:/6Z+ڰ-, T }DEEau7 lX^O>Ɂ{kܷ}Ltmtut]FZO36xN6c81㟩)^k*{PX\+VM$js:`t:NXߺ5Wf֭,\#Gxbژpk3Mp:bPYYjbO5\YO0omVJ¬hOӽ, MQlFj9sLyȑ_~aW_C..lHЁoNcڴiYロѣG]BxYX+0P|e˖aZ {UV?_лwoNzlذ3~x*--eʕ;voݻ׸}ʕ}~ػw/7½ @QQ7|3%%%-00NJJ #Fq&i]tSLĉDFFIngΝ,Y6m0m4?NLLᵁq*_|]v+1.77#`JAA,NIᾝ; k'3i掁hFhh(ќ^z%8I^RRjnt:tԩS }70k,N'. LAAa[dէǾZ5r ̚h4Պigeeeoؠ fY~CѣzX|Q4hnX?WAAA,FVkמ[uȑL8~gfRSSy뭷jgY}u҅.]IrrrQ'˖-?fܹe16_k;w<?W\@pppfg YZ))wrnئMڵkΝ;O>}xgiBmNNII 3g;¼y&22 ɵ}|嗬^BNxhݺn}W?~Ç3|x }Y:uSO=ʼn'^mvLii)s%));rbXػw/s塇|f͚ō7ިK]eeeL4 ¥^Jpp0_yy ] cZDDDwᅬjg}~ݻwO[o@\\v.u]6_kΞ=ϻҥKl̙3?ⷖ$;-ٳUgcZ.tڶmKee%ha" pEqq1[Μ9CddqidggcZq:Lee%[BZnTԪ (//R9::g֦MN'8Rur Q}TPP 22TZ֭[SZZ$gU۷nJ!VDVB]ݼK"+!Nn>J!"5·}qDVBZi5<J!|_3" 7¿4}K"+!OMHd%V"BW *’J!D]ꊴvڟ|xx:c Ba.꫰``ڵχ1cTqn!^f*1*+d9IENDB`././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/baseline/test_hmissing_imatch.png0000644000175100001710000005545014266763645025063 0ustar00runnerdockerPNG  IHDR Xvp pHYsaa?iZIDATx{u׶FtPʩ~Jy rw!i *n[jRw*mv0S49&"{fYXӵ׵\뽮!+Ő$I(:$Ia$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c$I0I$I c)|,;"=ڵoߞ? *|gqN)I$%X, "}嗜uYdeeQV-۷o~lݺ}RtiFM,?OLPrI$):@*{gӦM?dzj*>C5j@֭99r$=P#K$II; ?b\~|GٓM6ƍpe˖{J$I9 OϞ=ܹ3+9|4l5nܘl۶J$I)!X1qD֬Yo]s{nUv[nguV$IRw@a <￟*U;wPLH$I; 0h N8zYʖ- ݻڮ]xο۴io&j:s$IΝ;Yz5-[rʡ$ H!VZœO>ɣ>ʺuߵk{aTPN8sO8ʔ)ھcիW/}7K觐$IR

A_+Ucɒ%}mԮ];߷VZ@s9A%O>=:t 'yymǶm{~oՇ FKpiIN˗/oMg)y+rAm6ƌ駟_|;8?]vߟ%K_ os!}î9ׯ_?J@Ŋ.I듼6Osgظ^}ڴ+Hٲ5 J934In?rBT\xk7|3۩q gs l4 .Ə=攔#;8{=5k<󋵢$IGcnn.OfQ90"LNI; {OSf̘@$š5ЮSЩdeaΜ'I%; Ru1t'yym7~}ش > QXwm*T 7VkG*+ *// tR'I~[:Z瞃BV?/G K$Ii`fʨ|  *N3b1+>% , $%KA͍V#[RjըLV9% , $X |~<~t[ݻ÷ߖLNI! $I)h6-ZSfeEҿ?'I"IRߡI>=dpx(S͚EEdIRаatdb>wMB.kW|~I"IR ػ7ڭˣ+U &Mիaذ>2D$WG/ +=hE#࣏I I…Ѯ˖yp=j/ uFݛWRHb1x1R];ZbKcadc5*񿿤c$)l;F;uT.OFЧ V!)=X@$IJ"˗C2#GBҡSEѫWV*(FR*H$O6deAn.\w]D'''u}hu,I:RI۳zmh`W\ޯ]:Te$)kysxq;^xʗy$rDyI*. $Inհ`%vDJQYzU1#tI"IRb0|8h-ۤITEw5pQaڼ9tI"IRm?zT:U]I$ $I аa4W!;;t#s> o:Tb$)}.8`t)i:ѻhe]%(, $н;r \=,\:Uʊٴ  FRH'k%OSOPlT%vmo%- FR*Ho-i|tK^;uHX@$I*A0t(n ]h tΆI`*xi$%; $I%dfʨ  ':Ubԫß:df$,YͅsT+;p qF4,??tI*j$dbJP?YҥNF2D\xi$%+ $IGhǎh/nݢ 5kNV&У }:dd$ћӣMǏ(^rTbi$% $I4{64lYn)tR|4,ai$% $IEwoUWG *9l BL, $W_EG/ +NFҥ9!Dpae0o뗾Oc+HJI!R]BJ-C6p7HJI };tzAϞ;PzT'++Z!lǎΑ$Y@$I7˗C2FEstd~hQ, $ШQ}n.\w]DKh,uǎi$d$ سz9 gN>Ju`i$d$ekysxh/Fdy&7򼹹H "Ih-z5,XM8w?:uFRIRF`ph;/ZbIЩ1Dї-&K<IRٺoUN9.0ZVY, аa4W!;;t3x0Ԭ ;CAA4"I> _ ҥjW lY4 .6*9, {7t-h~zTj n /FRX@$Iimxh)SOߕ"N#), 6D \b7T&o /N#), SPCBpE| Bҡi_Dqc4"IJ+7ÕWFdPx58Щcƌ`:xHƒ%ѝ\;J/]JZ5*!ӦEQReIRʋ'g?.] ?yT*nu~:xHRڎpmЭtmpԓMHhzI"IJY;4iӧG eʄNQ&wQY tI`$ٳapMq4m ]]H*iIRJٻ79ˣNTLWðaH*iIRhr嗣]~9'Zli$$ $)%,\jl̛y^[7~i$ $)bcpP6eND8X<>F FRIHбc;vϞ;PzTJFO2V FRIHи1zQPtT aذxvH:ZIRҙ>=;+ rsB'RH99NGcIJmIRسzMhJ+kCt4, v-4o?M:E(_>t*%GqG8d$WÂфsտT)* 3fN#HY@ ׿뮻ڵkCʕi֬ssNJVVV 6$ $X -%v4 JkkGؼ9tIGњ5kضmr իWgǎ˴mۖ'x]6lvǎ?8%Գu+z+}E+egNT0n\Sw3τN#, /~/~у 0jԨ"֭[ӰaxEѧ7Fiڴ HahRl:pVeggSF lRsmF~~~BIR zYb(W.|v[2V׮цR0;6m?FoW\Qs7oN ɡm۶rVInnn%Zfw"8ЩA6nCT:}OPT)ƍwsrrr[K2j(6mJ^^5jHDtIJ*k@v?SOECg\JGvmxz0REV,Jڇb K֭[9c0a'tRG5kF׮]8q!G Xt)?|3_̜ NtᣏLЉ|vug}6-Zo^ciӆvK..~;NI%)Ск5\tQ4򡒖 'êUCH* `Cv֭+W䬳*ֹ5jo[ۧO*Vx;ұcbpݏC1KqR ? W/t"iӦ1mڴmݺ5Pa);wG>J*Ezѣ')e-Y ܾ΅sjժ@ӦM iذ!+V$//)SPF タ?$ώpѮݻNV5m =zA%)X@ ѡC&Ō ؼy3w 4`mG}y뭷رcժUK. 2ثgIR*ߣ]W6Љzfφn୷\YJF.ÛD\MR=;XJ5ɿJsFM.$߯=Hmhա/&[>,Z}7l:g$W_EG/ rPt4'DRrHlB_-y_?+9x"W^ FY@$I?*6he<ЩkڴVhi$c$б#={;@SI?.+ ƏヒIJI!-_0jT4^J?)<LgIY@$I>5>Eͅ H:2]@fѯ;vN#"I:=л7t_>;t*ȕ*O=kHH[7&"/:t< FlI-z5,XM8w]}S'ie Тw^n&SI%c˖EhJ "IlV?zT:?^-FIJ< $eO? W >١SI7x0Ԭ ;CAA4R汀HRzYb(W.V2Eٲ0i,\mT(), Av[ev-OJJfaib f \r *VH,:9, |3Zbw&hK*U&o /N#e $h֭ᢋ N%%6mwoظ1t)3X@$)Mm W^CBϘ1^B'2DВ%ѝ??o|PU£´iQQ_s$Ii$',zS-[N%%oVU6t)Y@$)MݺANfk~\VL|N#7 $4ӣMǏ2eBRK͚X N#/ $ٳapMI;iSv FJOIJQ{F8_u4oM(t)X@$),\jl̛T~k[:w6J*9IJ<\z)vZeN%cɓaԨib};tܳ'.T:5޽aX*t)}X@$)-_GKN%eaâߥ N# $%ӣOars2Mr0~:g$ЏMC8Щt_E >]:, d֮xh/BSIhX,t)Y@$)n5`A4%v*U>xU1#t)Y@$) b0|8h-ۤIT~kGys4R검HR`[WC㭷jЩ$f8س;t)uY@$)O? `lxAJҡT#G³›oN#& $p2KB۶I*nV5$TRX@$)vo[n]N?=t*IE q# :z, @k%OGo`LeCT\kرч"I 2wnƍХKJWhWNѝMIEc8+(C.m0t*IG+;&OUࡇBRDhfʨ  ':R ? s4RjHRFC>xJv3΀Ν!??t)O$X,`~%pIѐ-C/eIч=:, Tv-PfTiS > FJnI*!;4iӧG }2*)3<T}N#%/ $ٳApMIJ'aiewoUWÒ%Ѫ82SVw 6N#%' $FfAŊSI mh(]:"`I: FK.[A~j.)r0v,2J4RHR1b2^ -{eSIJ6C6p7H"IE};tzAϞPzTQVVwEwH% $и1zQoI:y&Ow FJIӧCFͅ GR5~ݱ#t)9X@$z~g:TR<] N#% $bZhIIjUxQ6-pDYS"?? k.VXqM>:0c ڵkƍ93iݺ5/!ˣA,] eX z zχ3%)bпh~׎Qvv65j`˖-}̙39餓kR ۷g޽;I%ݺANI++ &NoCr}6mG7+89}קԿhܸ1;v`ʕ,e4ӣMǏ2eBëY~8ZkiF߾}R gqsW_}5ƍ;9ׯZjwlݺuq* fφ ; M7N$IEwдi<]Hc9޽{<3nݚ|ÞsNqO~_Tv*rX J';&MիaذigM-yؾ};mڴp˖-[<]n,ᅦ֭aĈ1kV$s΁A>(t)>  k׎nݺrJ:BSZ5֯_}ǪWO>}o:vHǎ ކw߅7߄-B_G+u '=wkL6iӦpl֭ҤHþSwSPPpDŋÙgѣ]M*_?ˇq0y2\|1:Q*}9_Aó>Kٲe[.Xb{vW_1k֬6mČ3hӦMC$_~~nZ0xp4T5޽apc[n|4k֌SN9 6 /b FI0`< 9jrsml2*WgС*)*Ih0Vz(JBtЁɓ'3a6oqG >|8m۶=_~L? 5kN#IaeeE{lN# sgpӦ$]xƎEB")i z>io+IگW/h0ڤpitII)/y9'tIJ.0y2Z=:T<IIg^օ{ FSz0`@4GF*: 3r$|IޱdžN#Ik@8CiHJ*+W!Ч4j:$%2eyrcHEc4 UN9%.IqMB0h|Y4ҏHJO= DN#I㡇re bióHJ _~ EKJ^~y4Zʗ'߆SC")X,h\h]IRj7w 6N#DRpӧÜ90~ *(F")>  =Ii$)3-Ϳ[0ڨP ")bh U 蒤p5o/BQHv} (_>tIPbTDbi, fhǛo-C$T&o /NLd7=z@0jT$jzCQHYرp≡Hݘ1^B'QH*q|w mBH S*<(L:2DRر#Z1++tIҡx#jݻ÷߆NLaT̓)S`8i$I'FwF"|t ^!IJ~5kG+c-X:2DR<֭R"I);iã]BQ-MfoNi$Iő &0lX4JwIGS'hAIR94(G(Y@$a2<9&tIґn] F",_<Ew@$Ic>F F"GCjՊ&KR_Fл7 VNtdtƏEUʖ FTR գU BQH:"kpЬY4T<$̟%$ bŢQR4]~~hڵ(X@$ܹѮ*N#Irr ci., 믣ɉ_e4xT ^}fF"Xz,3&tIR"\sM6oF"́^GUC$%ʸqg}w$JIEu+t[ 7N#IJj`HxYxi, L $enVoF"G͟'C͚HBʊٸ F"vvm4ZQj׆caѢi, kذhIcHR 6N`i|;!GsB$%l<V F"P{BP.{o4dR  CQH*ȑ'ѧ\:$) g}X:RDAV!COh(tIR2*S& =:RD UN9%.Iҡ4m =zAg(UX@$੧`לi$Ire bi , K/ZZC$'ai , S;r墥w%I*VছaÆi, >́Ri$Ifh(]:"уs=rqꩧҾ}{V\N:BH@Ijf:tIR*:D;^~^y%t%cBHFÇ>??ذaƍ~O1l0N;qJ,>}`7.tIR*k^x!{eQW, y9uЁzGG֭iذa9tIR*ʊ֭-j2iRDJF*DӦM(useE>۶m#߭AĶmMln5tIR:OL&Ow FRDXʕ+͛7B жm[VZR 6E'feN#IJ]@fѯ;vNdc)^xkҡC>/''[oW^y{wyѴiS&(.|<Ԯ:$)*mhv- :MV,枕?fŊ\tE{dgg?4k֌]2qC>/// tRׯCڽ.;.*"#-IR 4j:MȏذaW^y%+Vd̙.\r ]tovJjU49!I}S'i,\0nJ֭ٲe >իW?UF }bŊر#;v<_OᇣO FΎ9&ިNT<ӦMcڴiۺuk4!Xk.~tR~m4irT߯aÆl۶%[z|ho>2eB'$e`(c8i׎C OXh3f8dX~=+V`Ϟ=mܸ`ҥj*n3,>|He`Y:wiC ѷo_^}Uڴiÿ60`< 9j=D.B6lHŊcʔ)ԨQ/?gE{H(eF/4ڨGЉ1saΜ9}}_)Lxy뭷رcժUK. 2N:)^ÊŢثV&Kh͚GñڶSO H8$8P2eJܹвe4LP.믧&_;z27l$ULo/:BHiG(]:Z}Dڴ믇޽{, R5+z ':$I1czN, Rh_HVGiBQY@4u=cGa*N$oV{hr2DJCE+_:$Iʂ;NDHikh.]B$jքVZ t%DJ3úuSPW$)q4m}hkW4JߞHi$77@:H㲳a$X F`G_pA$Is`РhGNxHibpX &Oc Fn] FdЯ_tDTsчh FNxH).??zUV4]Tը CU(^, R?-V*[6tIΰaPz*VAA4 ֬ۡYi$I:zOXJ?)EbQT).IR կk׆NfRܹ*N#IR!''ڨ0 F%"&]=HT*UW_3BQIH)W/ʂ1cB'$)~&z7NbR̜9KPj4$׸qg}w$*))l ݻCp Hժȑ曡Ө$X@ҿTB&L`I n-ZkWؾ=t- "χᇡfi$IJhoait, R ع3ih9BI2M0v,,Z:DJÆEO|J2T^а!twN#[)#9N#IR80y2Z=:DJb{BP.{o4$W ͉CёHIlHӞc F0p qF!]~~4*. V!COh(tIG2Ѽ\xiT\) D^rJ4]$iS > FaSOѯ99Hz*Wn  FEe̗_B~_:$Iɫ|yx xm:5tDJ"X`rһ$Zn BQQX@$2}:̙CJHFҥ9!J~)Il ={µWN#IR8D;^~^y%t $={`ܸI$IJ=C6Po Fcܹs0j|r4$hwE(yY@mln5tIRO-2y2N4: iS`VV4$.]Y;BQa, R@ Fs>xjFWTڵ0xp4*D dn5 Fq0tht:~"p}P^4$c&/[#FNH  S'* $)>.0ZC>)ƌ%KOeʔ F6x0Ԭ}WP:"%gAг'4i:$Ilh…F "%H,I^j4]$%Ffp0`|E4H ѮO<ˇN#IRf>*VH,:MfH ~}7C˖Hy*T 7Bl)zҥaԨI$I\mCްqc4"٬YcX8i$IlcDCz $sY@8NhڷF$U > ӦkN, Rs-:$IFh wo &X@87L#SB$IdeĉHC<)vK/$IɥfMxhe B,)u੧2Iw@ӦчvN9|k$hro~uN#I%;&Mիaذi2D*A:DJv90hP4gB  ˖p1Hn] &Y@|9<$Ic?F &Y@ U+.IRKFл7 VN, R ?-V*[6tIt$ գU BI_(YCfH#U<$̟HG!GJtIڮ~hNڵӤ' t΍vQP!tIT~{ɉ6*BI?}u4Yᗿ F$JWaƌiҏуs=rqꩧҾ}{V\YlB׮]R ʕy9W/ʂ1cB'$I%kGys4RÇ/sW0fvʂ _>_{nAAW^y%/"=z`Ĉ|\verM1g<(T:$Iq`Iҋ{5_cCԫWw<Sԁ6nܘ;vy0q"<0Ԭ:$Ihoai҃^x֮]KSZ;nݺSڴi,$I kر駡Ӥ> HX;3&Mp-;wL2O~JMÆEO|HQz aIRo~Ć +X"3g$;;/[l}Pbuؑ;1J޽й3ԭ :$IJiӦ1mڴ[Y&P4a9]vѦMV\oMݺut\OAA/^LNNgy~ѣGS~#ή5r$| OoI4Vyyy4h PBӡC-ZČ3hҤI[~=+V`Ϟ=k׎Yf?i&f̘A6m r% }@FH$>o߾ꫴiӆ_msjժD/ncٲeT\ǓPg-hիSN&K$Y@ 0g̙sdgg?~csN5jԩS9묳YqS`̛99H$X, B}c .]2t޾}$I~$8D7X`rһ$I*90g̚*N#I^"г'\{-\}u4$I"@>g:$IRzr̝ =S'N#I"۶AnТzk4$I; 0p l YYH$/ 2…ќ#vi$IқCvΝQ#i$Iҟw@|V<F$)yDO^i$I2D)??zUNT@$IRF3,>2eB$IQ34z&MB$I,eX tU $IJ,`)<4̝ ˇN#Iy~= 7 -[N#I, =z@0jT$$I!XfE^O F$)syDio;m[h>tIfQڻرƏi$I2C̓)S`D8i$Iテ]K?$Iw@u=?JY%IDi)7}z F$ICNpƃ$IJQ>-%KK$%(,_<Ew@$I\, JЫZ $IJ>PQ?-li$IT(-YCfH$P, JyXT<*U&K$)y9K)́ B$IxD)믡woz/C$Iҏ(YY0fL$$I* `)e͙/=UN#IR֭н;n 7:$IԿTB&L`I$)58K)g|8Ǝ5C$IRqxD)eN6;F$Iaâ]gφRgI[8'8i$Itr% }@FH$hX@ UN9%.I,% `< F$IG; JZ_~ ANpH$$X@bhr墥w%I4}:̙fAJH$xDIgf:tI$$ N>g:$IJCT΅瞃)SC$IRIƶmЭh:$I; J¦M:$Ipa4cH];tI$ŋCй34jw:$I; a*˃i$IOQP~ ? N#Ix(hU:Q$IRs3,>2eB$IR"xDA| ={B&H$)Q, JX tU $IR=4̝ ˇN#IDjznZ F$IfQBKèQH$) !l߾!CЪU+N8:ujΝ:u*YYY>6lIl֬1v,xb4$I 9 i& Ʃ{W1l0N;%0| y'm ۇN#IP, PZ5֯_'̒%KhԨQG֭iذaҥ{;`x F$I8ʔ)'|g۶m@5oL#F)N#I, qԼys*T@NNm۶eժU#%wA׮p$Ilndҥ5MG5BGLaݺhϏR]Ig3*ZlIfx8qbt > =uN#Idg r%pEo:DJ$IQ~y}bŊر#;vW7|8,[K1)$I)hڴiL6c[n &}0>3T=z4O@XxH$>ˣA`׳b ٳƍz.]JV/WjE%Ia7-[n:̙×_~ @Ϟ=X" g?VZ4mڔ / RbE2e 5j $h̟eˆN#Idc9YfϚ5Yfp74Oc:[ocUF.]2d'tRBf ͚N#IdbC(oLҥKSnH,/׿B I$T~,fsX>$IthNBQk~i$I, :jzAV:$ICtT́^瞃UC$IR֭н;n 7:$IRDGL $I~CtDχaXY3tI$ v.]iSi$IJb6,|l(e$IR1QŒ<:$IRDEw/t u½N#IT,ȑ'?džN#ITʕ0dN#ITeя*(V:h$ItS`̛99H$)yDЯt_:$IRDE +-+I$-`鐦O9s`,T)tI$P7CϞppաH$)]X@T>}`7.tI$` ss)pɡH$)xDض u-[C$IR0p l YYH$)X@…ќ#vi$I%vΝQ#i$I"|V<F$I; O^i$I, .??zUNT@$IxrV3,>2eB$IRH34z&MB$IR&dX tU $IR"8+C=4̝ ˇN#IL ~= 7 -[N#ILb@=z@0jT$$I40fE^O F$I; o;m[h>tI$e" HرƏi$I!̓)S`D8i$IvK/$IBH<֭(e$IR@4 > =uN#ILiS'hAI$)4a2XJK$) x$M-_<Ew@$Id`ICЫZ $IRp`N?-li$I4f ͚N#I$FbxTM@$ICG Ι*N#I$; i믡woz/C$I gIzAV:$IthJsK/sAժH$Iu+t[ 7N#I$$ !X$IR2sV ?&Ncfi$Is'tMwN#I$w@R԰aѮgC)k$IRo]SP^<?sN4$IRY@R޽й3ԭ :$IT<J1#G':$IT<I!+W!Ч4j:$IT|QPzu)tI$)9+E<,XANN4$IґH K:u/F$I:r$E +-+I$2`%a5 *U F$I::9۷3dZj '@VVSN-[lk׮TRrѼysaf?$I, i& 9unAAW^y%/"=z`Ĉ|\veZߧOسƍ+nzI$)9Y@Zj_5kH1'_̜9 2uT w{Gvv6C );{FO>@%mڴi#0>k6te92ep9s&'t\scUT}̞=ݻwテnݠE #8I^^In^+ H|Gԯ_Rqر+WM' ++I%IIJVA[naڵO$I ;wL2O~sp]q&I$> qPlByڵk xr>$~tdnZ쥔8^I^^IN˗/~e$^z^ndQhРA: O$/Mr$իW,td .&/^ 6N;c|PÇ>??ذaƍ~O;乾nh>nc͚5l۶[nիc^~eڶmOb1 O3f?_ǎ?Xǎ7yc@,777 3|۽{V\+SLn8칾nhۻwoϏuY}sV͜9O~:uĢE?ys5jDF;쳹+>}z\sg6b1[bPʔ)'|DΜ9N:kf*Uо}{fϞݻK*f:C۶m#?? iӦ{S{.˗/?칾nhIljԨ-[<_;g>3< *pq|DžWPP~Z貽7۶m+Hծ]+rqq7W_#飏>~*u_q7fǎEj޼9*T ''m۲jժБR,㫯rʇ}0z}u_}6mG7+89vgׯZjwl&_w>sU4Gzm*UD=x'9s&;wo6nU4Gsm999z<+{̛7MΣ^`ڵtuFQ۷/UT3{ꫯfܸq=N9 =vI2e:o;wP?RZ7n[laݺuL0k /={RbEnVy>sjժD_r%/9`W/\:묀?U8SN.B6lHŊcʔ)TV\N:餀?Ujݻ7cƌM6LXou\_7uWҬY3N96l /+9r$w}7kĄ1ܹ3v=N>X2eb5͝;\z饱.?Xvb*T/_>_2jժDEO{Gzm:w[n㎋.]:vg~_ǾDO{5k֌>>X,r->׿b:ux≱إ^%Hc\pAbŊҥKN=Xc6l󃤑}_걏0iӦZh;餓bsLRJ-ZfϞ}| H$IJH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ $IH$IJ!|ϙ\jIENDB`././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6922362 pytest-mpl-0.16.1/tests/subtests/hashes/0000755000175100001710000000000014266763666017633 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/hashes/mpl33_ft261.json0000644000175100001710000000267114266763645022411 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": "d21af7f9a2c1cbaf3c9bca3598f1b32b36891ac9d5db47e81a7bcaa342f7d4fc", "subtests.subtest.test_hmatch_idiff": "085fcb22e9d6cfbb2bb6e0efbf749fa598be27e837c348130adc21a6dc2fc5fe", "subtests.subtest.test_hmatch_idiffshape": "a8f866c3b765e274c217d49ba72c9ce3bd4b316491ffd34a124ef03643ce45b8", "subtests.subtest.test_hmatch_imissing": "f06e910b6c80db28e1eb08fdb8e1ab9211434498c134d00820900a13a4f2568c", "subtests.subtest.test_hdiff_imatch": "d1ff5c6bc631fbdaffa23d3d57fc027768fcded889f3b269941da859110ce282", "subtests.subtest.test_hdiff_idiff": "d1ff014f73cdfea555e46a29aaac43c4394c3c4c21998e54971edb773eee6c95", "subtests.subtest.test_hdiff_idiffshape": "d1ff3bafdcc8350c612bc925269fc4332dd9062a6399701067863b178568b219", "subtests.subtest.test_hdiff_imissing": "d1ffd5868d14547557653c051d23d3fd48d198d3f59006dc5ba390433d6670ff", "subtests.subtest.test_hdiff_imatch_tolerance": "d1ffa66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_idiff_tolerance": "d1ffa66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_imatch_savefig": "d1ff14c35f1da18de3f4ceb1901501e5a8a5a0d18eb8a7b4db5cfde170b57423", "subtests.subtest.test_hdiff_imatch_style": "d1ffd00c4b99c6087d04f84ca071a5997b4ecf76cf859ce3548634e67841a79b", "subtests.subtest.test_hdiff_imatch_removetext": "d1ffd7512c6d886262b1bcb4501374bfc61ef8569d24930b0258dab08e6eca9a" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/hashes/mpl34_ft261.json0000644000175100001710000000267114266763645022412 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": "d21af7f9a2c1cbaf3c9bca3598f1b32b36891ac9d5db47e81a7bcaa342f7d4fc", "subtests.subtest.test_hmatch_idiff": "085fcb22e9d6cfbb2bb6e0efbf749fa598be27e837c348130adc21a6dc2fc5fe", "subtests.subtest.test_hmatch_idiffshape": "a8f866c3b765e274c217d49ba72c9ce3bd4b316491ffd34a124ef03643ce45b8", "subtests.subtest.test_hmatch_imissing": "f06e910b6c80db28e1eb08fdb8e1ab9211434498c134d00820900a13a4f2568c", "subtests.subtest.test_hdiff_imatch": "d1ff5c6bc631fbdaffa23d3d57fc027768fcded889f3b269941da859110ce282", "subtests.subtest.test_hdiff_idiff": "d1ff014f73cdfea555e46a29aaac43c4394c3c4c21998e54971edb773eee6c95", "subtests.subtest.test_hdiff_idiffshape": "d1ff3bafdcc8350c612bc925269fc4332dd9062a6399701067863b178568b219", "subtests.subtest.test_hdiff_imissing": "d1ffd5868d14547557653c051d23d3fd48d198d3f59006dc5ba390433d6670ff", "subtests.subtest.test_hdiff_imatch_tolerance": "d1ffa66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_idiff_tolerance": "d1ffa66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_imatch_savefig": "d1ff14c35f1da18de3f4ceb1901501e5a8a5a0d18eb8a7b4db5cfde170b57423", "subtests.subtest.test_hdiff_imatch_style": "d1ffd00c4b99c6087d04f84ca071a5997b4ecf76cf859ce3548634e67841a79b", "subtests.subtest.test_hdiff_imatch_removetext": "d1ffd7512c6d886262b1bcb4501374bfc61ef8569d24930b0258dab08e6eca9a" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/hashes/mpl35_ft261.json0000644000175100001710000000267114266763645022413 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": "d21af7f9a2c1cbaf3c9bca3598f1b32b36891ac9d5db47e81a7bcaa342f7d4fc", "subtests.subtest.test_hmatch_idiff": "085fcb22e9d6cfbb2bb6e0efbf749fa598be27e837c348130adc21a6dc2fc5fe", "subtests.subtest.test_hmatch_idiffshape": "a8f866c3b765e274c217d49ba72c9ce3bd4b316491ffd34a124ef03643ce45b8", "subtests.subtest.test_hmatch_imissing": "f06e910b6c80db28e1eb08fdb8e1ab9211434498c134d00820900a13a4f2568c", "subtests.subtest.test_hdiff_imatch": "d1ff5c6bc631fbdaffa23d3d57fc027768fcded889f3b269941da859110ce282", "subtests.subtest.test_hdiff_idiff": "d1ff014f73cdfea555e46a29aaac43c4394c3c4c21998e54971edb773eee6c95", "subtests.subtest.test_hdiff_idiffshape": "d1ff3bafdcc8350c612bc925269fc4332dd9062a6399701067863b178568b219", "subtests.subtest.test_hdiff_imissing": "d1ffd5868d14547557653c051d23d3fd48d198d3f59006dc5ba390433d6670ff", "subtests.subtest.test_hdiff_imatch_tolerance": "d1ffa66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_idiff_tolerance": "d1ffa66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_imatch_savefig": "d1ff14c35f1da18de3f4ceb1901501e5a8a5a0d18eb8a7b4db5cfde170b57423", "subtests.subtest.test_hdiff_imatch_style": "d1ffd00c4b99c6087d04f84ca071a5997b4ecf76cf859ce3548634e67841a79b", "subtests.subtest.test_hdiff_imatch_removetext": "d1ffd7512c6d886262b1bcb4501374bfc61ef8569d24930b0258dab08e6eca9a" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/helpers.py0000644000175100001710000002724414266763645020402 0ustar00runnerdockerimport os import re import json from pathlib import Path from PIL import Image, ImageDraw __all__ = ['diff_summary', 'assert_existence', 'patch_summary', 'apply_regex', 'remove_specific_hashes', 'transform_hashes', 'transform_images'] class MatchError(Exception): pass def diff_summary(baseline, result, baseline_hash_library=None, result_hash_library=None, generating_hashes=False): """Diff a pytest-mpl summary dictionary. Parameters ---------- baseline : dict Baseline pytest-mpl summary. result : dict Generated result pytest-mpl summary. baseline_hash_library : Path, optional, default=None Path to the baseline hash library. Baseline hashes in the baseline summary are updated to these values to handle different Matplotlib versions. result_hash_library : Path, optional, default=None Path to the "baseline" image hash library. Result hashes in the baseline summary are updated to these values to handle different Matplotlib versions. generating_hashes : bool, optional, default=False Whether `--mpl-generate-hash-library` was specified and both of `--mpl-hash-library` and `hash_library=` were not. """ if baseline_hash_library and baseline_hash_library.exists(): # Load "correct" baseline hashes with open(baseline_hash_library, 'r') as f: baseline_hash_library = json.load(f) else: baseline_hash_library = {} if result_hash_library and result_hash_library.exists(): # Load "correct" result hashes with open(result_hash_library, 'r') as f: result_hash_library = json.load(f) else: result_hash_library = {} # Get test names baseline_tests = set(baseline.keys()) result_tests = set(result.keys()) # Test names must be identical diff_set(baseline_tests, result_tests, error='Test names are not identical.') item_match_errors = [] # Raise a MatchError for all mismatched values at the end for test in baseline_tests: # Get baseline and result summary for the specific test baseline_summary = baseline[test] result_summary = result[test] # Swap the baseline and result hashes in the summary # for the corresponding hashes in each hash library if baseline_hash_library and test in baseline_hash_library and not generating_hashes: baseline_summary = replace_hash(baseline_summary, 'baseline_hash', baseline_hash_library[test]) if result_hash_library: if generating_hashes: # Newly generate result will appear as baseline_hash baseline_summary = replace_hash(baseline_summary, 'baseline_hash', result_hash_library[test]) baseline_summary = replace_hash(baseline_summary, 'result_hash', result_hash_library[test]) # Get keys of recorded items baseline_keys = set(baseline_summary.keys()) result_keys = set(result_summary.keys()) # Summaries must have the same keys diff_set(baseline_keys, result_keys, error=f'Summary for {test} is not identical.') for key in baseline_keys: error = f'Summary item {key} for {test} does not match.\n' try: diff_dict_item(baseline_summary[key], result_summary[key], error=error) except MatchError as e: item_match_errors.append(str(e)) if len(item_match_errors) > 0: raise MatchError('\n\n----------\n\n'.join(item_match_errors)) def diff_set(baseline, result, error=''): """Raise and show the difference between Python sets.""" if baseline != result: missing_from_result = baseline - result missing_from_baseline = result - baseline if len(missing_from_result) > 0: error += f'\nKeys {sorted(missing_from_result)} missing from the result.' if len(missing_from_baseline) > 0: error += f'\nKeys {sorted(missing_from_baseline)} missing from the baseline.' raise MatchError(error) def diff_dict_item(baseline, result, error=''): """Diff a specific item in a pytest-mpl summary dictionary.""" # Comparison makes the following (good) assumptions expected_types = (str, int, float, bool, type(None)) assert isinstance(baseline, expected_types) assert isinstance(result, expected_types) # Prepare error message error += f'Baseline:\n"{baseline}"\n\n' error += f'Result:\n"{result}"\n' # Matching items must have the same type if type(baseline) is not type(result): raise MatchError(error + '\nTypes are not equal.\n') # Handle regex in baseline string (so things like paths can be ignored) if isinstance(baseline, str) and baseline.startswith('REGEX:'): if re.fullmatch(baseline[6:], result) is not None: return # Handle bool and NoneType if isinstance(baseline, (bool, type(None))) and baseline is result: return # Handle float if isinstance(baseline, float) and abs(baseline - result) < 1e-4: return # Handle str and int if baseline == result: return raise MatchError(error) def patch_summary(summary, patch_file): """Replace in `summary` any items defined in `patch_file`.""" # By only applying patches, changes between MPL versions are more obvious. with open(patch_file, 'r') as f: patch = json.load(f) for test, test_summary in patch.items(): for k, v in test_summary.items(): summary[test][k] = v return summary def replace_hash(summary, hash_key, new_hash): """Replace a hash in a pytest-mpl summary with a different hash. Parameters ---------- summary : dict A single test from a pytest-mpl summary. hash_key : str Key of the hash. Either `baseline_hash` or `result_hash`. new_hash : str The new hash. """ assert isinstance(new_hash, str) old_hash = summary[hash_key] if not isinstance(old_hash, str) or old_hash == new_hash: return summary # Either already correct or missing # Update the hash summary[hash_key] = new_hash summary['status_msg'] = summary['status_msg'].replace(old_hash, new_hash) return summary def assert_existence(summary, items=('baseline_image', 'diff_image', 'result_image'), path=''): """Assert that images included in a pytest-mpl summary exist. Parameters ---------- summary : dict The pytest-mpl summary dictionary to check. items : tuple or list, optional The image keys to check if reported. path : str or path_like, optional, default='' Path to results directory. Defaults to current directory. """ for test in summary.values(): for item in items: if test[item] is not None: assert (Path(path) / test[item]).exists() def _escape_regex(msg): if not msg.startswith('REGEX:'): msg = msg.replace('.', r'\.').replace('(', r'\(').replace(')', r'\)') msg = 'REGEX:' + msg return msg def _escape_path(msg, path): pattern = (rf"({path}[A-Za-z0-9_\-\/.\\]*)" + r"(baseline\\.png|result-failed-diff\\.png|result\\.png|\\.json)") msg = re.sub(pattern, r".*\2", msg) pattern = rf"({path}[A-Za-z0-9_\-\/.\\]*)" msg = re.sub(pattern, r".*", msg) return msg def _escape_float(msg, key): pattern = rf"({key}[0-9]+\\\.[0-9]{{1}})([0-9]+)" msg = re.sub(pattern, r"\1[0-9]*", msg) return msg def apply_regex(file, regex_paths, regex_strs): """Convert all `status_msg` entries in JSON summary file to regex. Use in your own script to assist with updating baseline summaries. Parameters ---------- file : Path JSON summary file to convert `status_msg` to regex in. Overwritten. regex_paths : list of str List of path beginnings to identify paths that need to be converted to regex. E.g. `['/home/user/']` Does: `aaa /home/user/pytest/tmp/result\\.png bbb` -> `aaa .*result\\.png bbb` regex_strs : list of str List of keys to convert following floats to 1 d.p. E.g. ['RMS Value: '] Does: `aaa RMS Value: 12\\.432644 bbb` -> `aaa RMS Value: 12\\.4[0-9]* bbb` """ with open(file, 'r') as f: summary = json.load(f) for test in summary.keys(): msg = summary[test]['status_msg'] for signal in [*regex_paths, *regex_strs]: if signal in msg: msg = _escape_regex(msg) if not msg.startswith('REGEX:'): continue for signal in regex_paths: if signal in msg: msg = _escape_path(msg, path=signal) for signal in regex_strs: if signal in msg: msg = _escape_float(msg, key=signal) summary[test]['status_msg'] = msg with open(file, 'w') as f: json.dump(summary, f, indent=2) def remove_specific_hashes(summary_file): """Replace all hashes in a summary file with placeholder values. This is done because the actual hashes used for testing are taken from separate files for each specific matplotlib version. """ baseline_placeholder = "###_BASELINE_HASH_###" result_placeholder = "###_RESULT_HASH_###" with open(summary_file, "r") as f: summary = json.load(f) for test in summary.keys(): # Get actual hashes baseline = summary[test]["baseline_hash"] result = summary[test]["result_hash"] # Replace with placeholders (if summary has hashes) if baseline is not None: summary[test]["baseline_hash"] = baseline_placeholder summary[test]["status_msg"] = \ summary[test]["status_msg"].replace(baseline, baseline_placeholder) if result is not None: summary[test]["result_hash"] = result_placeholder summary[test]["status_msg"] = \ summary[test]["status_msg"].replace(result, result_placeholder) with open(summary_file, "w") as f: json.dump(summary, f, indent=2) def transform_hashes(hash_file): """Make hash comparison tests fail correctly. Makes hashes of tests *hdiff* in hash_file fail hash comparison and remove *hmissing* hashes that should be missing. """ with open(hash_file, "r") as f: hashes = json.load(f) for test in list(hashes.keys()): h = hashes[test] if "hdiff" in test and h is not None: # Replace first four letters with d1ff to force mismatch hashes[test] = "d1ff" + h[4:] if "hmissing" in test and h is not None: # Remove hashes that should be missing del hashes[test] with open(hash_file, "w") as f: json.dump(hashes, f, indent=2) def transform_images(baseline_path): """Make image comparison tests fail correctly. Makes images of tests *idiff* under baseline_path fail image comparison and deletes images for *imissing* tests. """ # Delete imissing files for file in baseline_path.glob("**/*imissing*.png"): file.unlink() # Add red cross to idiff files for file in baseline_path.glob("**/*idiff*.png"): with Image.open(file) as im: draw = ImageDraw.Draw(im) draw.line((0, 0) + im.size, "#f00", 3) draw.line((0, im.size[1], im.size[0], 0), "#f00", 3) im.save(file) # Resize idiffshape files for file in baseline_path.glob("**/*idiffshape*.png"): with Image.open(file) as im: (width, height) = (im.width // 2, im.height // 2) im_resized = im.resize((width, height)) im_resized.save(file) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6922362 pytest-mpl-0.16.1/tests/subtests/result_hashes/0000755000175100001710000000000014266763666021231 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/result_hashes/mpl33_ft261.json0000644000175100001710000000357214266763645024010 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": "d21af7f9a2c1cbaf3c9bca3598f1b32b36891ac9d5db47e81a7bcaa342f7d4fc", "subtests.subtest.test_hmatch_idiff": "085fcb22e9d6cfbb2bb6e0efbf749fa598be27e837c348130adc21a6dc2fc5fe", "subtests.subtest.test_hmatch_idiffshape": "a8f866c3b765e274c217d49ba72c9ce3bd4b316491ffd34a124ef03643ce45b8", "subtests.subtest.test_hmatch_imissing": "f06e910b6c80db28e1eb08fdb8e1ab9211434498c134d00820900a13a4f2568c", "subtests.subtest.test_hdiff_imatch": "b92c5c6bc631fbdaffa23d3d57fc027768fcded889f3b269941da859110ce282", "subtests.subtest.test_hdiff_idiff": "567f014f73cdfea555e46a29aaac43c4394c3c4c21998e54971edb773eee6c95", "subtests.subtest.test_hdiff_idiffshape": "b6673bafdcc8350c612bc925269fc4332dd9062a6399701067863b178568b219", "subtests.subtest.test_hdiff_imissing": "e37bd5868d14547557653c051d23d3fd48d198d3f59006dc5ba390433d6670ff", "subtests.subtest.test_hmissing_imatch": "592d12cc2d5749a6607bbf98d715b95c06a2af6572a7e298bcae349648b9997e", "subtests.subtest.test_hmissing_idiff": "9e98dbd2027525c776212daa061180b4fc40ad12dfc2cdfe4b86694ede14e0c3", "subtests.subtest.test_hmissing_idiffshape": "5534324f9da5c1c104c3ef3435dc6fa9792c0d0d8b762fad5d7f81abd91fbb89", "subtests.subtest.test_hmissing_imissing": "2d15274f0e9b44f1c16e6b237710cd36a3de5c5b7596ef0e65e7a33ce4624cf4", "subtests.subtest.test_hdiff_imatch_tolerance": "f26ca66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_idiff_tolerance": "f26ca66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_imatch_savefig": "0a0514c35f1da18de3f4ceb1901501e5a8a5a0d18eb8a7b4db5cfde170b57423", "subtests.subtest.test_hdiff_imatch_style": "588ad00c4b99c6087d04f84ca071a5997b4ecf76cf859ce3548634e67841a79b", "subtests.subtest.test_hdiff_imatch_removetext": "a78ad7512c6d886262b1bcb4501374bfc61ef8569d24930b0258dab08e6eca9a" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/result_hashes/mpl34_ft261.json0000644000175100001710000000357214266763645024011 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": "d21af7f9a2c1cbaf3c9bca3598f1b32b36891ac9d5db47e81a7bcaa342f7d4fc", "subtests.subtest.test_hmatch_idiff": "085fcb22e9d6cfbb2bb6e0efbf749fa598be27e837c348130adc21a6dc2fc5fe", "subtests.subtest.test_hmatch_idiffshape": "a8f866c3b765e274c217d49ba72c9ce3bd4b316491ffd34a124ef03643ce45b8", "subtests.subtest.test_hmatch_imissing": "f06e910b6c80db28e1eb08fdb8e1ab9211434498c134d00820900a13a4f2568c", "subtests.subtest.test_hdiff_imatch": "b92c5c6bc631fbdaffa23d3d57fc027768fcded889f3b269941da859110ce282", "subtests.subtest.test_hdiff_idiff": "567f014f73cdfea555e46a29aaac43c4394c3c4c21998e54971edb773eee6c95", "subtests.subtest.test_hdiff_idiffshape": "b6673bafdcc8350c612bc925269fc4332dd9062a6399701067863b178568b219", "subtests.subtest.test_hdiff_imissing": "e37bd5868d14547557653c051d23d3fd48d198d3f59006dc5ba390433d6670ff", "subtests.subtest.test_hmissing_imatch": "592d12cc2d5749a6607bbf98d715b95c06a2af6572a7e298bcae349648b9997e", "subtests.subtest.test_hmissing_idiff": "9e98dbd2027525c776212daa061180b4fc40ad12dfc2cdfe4b86694ede14e0c3", "subtests.subtest.test_hmissing_idiffshape": "5534324f9da5c1c104c3ef3435dc6fa9792c0d0d8b762fad5d7f81abd91fbb89", "subtests.subtest.test_hmissing_imissing": "2d15274f0e9b44f1c16e6b237710cd36a3de5c5b7596ef0e65e7a33ce4624cf4", "subtests.subtest.test_hdiff_imatch_tolerance": "f26ca66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_idiff_tolerance": "f26ca66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_imatch_savefig": "0a0514c35f1da18de3f4ceb1901501e5a8a5a0d18eb8a7b4db5cfde170b57423", "subtests.subtest.test_hdiff_imatch_style": "588ad00c4b99c6087d04f84ca071a5997b4ecf76cf859ce3548634e67841a79b", "subtests.subtest.test_hdiff_imatch_removetext": "a78ad7512c6d886262b1bcb4501374bfc61ef8569d24930b0258dab08e6eca9a" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/result_hashes/mpl35_ft261.json0000644000175100001710000000357214266763645024012 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": "d21af7f9a2c1cbaf3c9bca3598f1b32b36891ac9d5db47e81a7bcaa342f7d4fc", "subtests.subtest.test_hmatch_idiff": "085fcb22e9d6cfbb2bb6e0efbf749fa598be27e837c348130adc21a6dc2fc5fe", "subtests.subtest.test_hmatch_idiffshape": "a8f866c3b765e274c217d49ba72c9ce3bd4b316491ffd34a124ef03643ce45b8", "subtests.subtest.test_hmatch_imissing": "f06e910b6c80db28e1eb08fdb8e1ab9211434498c134d00820900a13a4f2568c", "subtests.subtest.test_hdiff_imatch": "b92c5c6bc631fbdaffa23d3d57fc027768fcded889f3b269941da859110ce282", "subtests.subtest.test_hdiff_idiff": "567f014f73cdfea555e46a29aaac43c4394c3c4c21998e54971edb773eee6c95", "subtests.subtest.test_hdiff_idiffshape": "b6673bafdcc8350c612bc925269fc4332dd9062a6399701067863b178568b219", "subtests.subtest.test_hdiff_imissing": "e37bd5868d14547557653c051d23d3fd48d198d3f59006dc5ba390433d6670ff", "subtests.subtest.test_hmissing_imatch": "592d12cc2d5749a6607bbf98d715b95c06a2af6572a7e298bcae349648b9997e", "subtests.subtest.test_hmissing_idiff": "9e98dbd2027525c776212daa061180b4fc40ad12dfc2cdfe4b86694ede14e0c3", "subtests.subtest.test_hmissing_idiffshape": "5534324f9da5c1c104c3ef3435dc6fa9792c0d0d8b762fad5d7f81abd91fbb89", "subtests.subtest.test_hmissing_imissing": "2d15274f0e9b44f1c16e6b237710cd36a3de5c5b7596ef0e65e7a33ce4624cf4", "subtests.subtest.test_hdiff_imatch_tolerance": "f26ca66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_idiff_tolerance": "f26ca66a7c02ae64c8b2512021e0450cbe64c084c9d5f7e2600a7342a559c0b1", "subtests.subtest.test_hdiff_imatch_savefig": "0a0514c35f1da18de3f4ceb1901501e5a8a5a0d18eb8a7b4db5cfde170b57423", "subtests.subtest.test_hdiff_imatch_style": "588ad00c4b99c6087d04f84ca071a5997b4ecf76cf859ce3548634e67841a79b", "subtests.subtest.test_hdiff_imatch_removetext": "a78ad7512c6d886262b1bcb4501374bfc61ef8569d24930b0258dab08e6eca9a" } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/subtest.py0000644000175100001710000000760214266763645020425 0ustar00runnerdockerimport matplotlib.pyplot as plt import pytest def plot(line, **kwargs): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot(line, **kwargs) return fig # ### Test all permutations of: # baseline hash: match, diff, or missing # baseline image: match, diff, or missing # hash match @pytest.mark.image @pytest.mark.hash @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hmatch_imatch(): return plot([1, 2, 3, 4]) @pytest.mark.image @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hmatch_idiff(): return plot([1, 3, 2, 4]) @pytest.mark.image @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hmatch_idiffshape(): return plot([4, 2, 3, 1, 2]) @pytest.mark.image @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hmatch_imissing(): return plot([4, 3, 2, 1]) # hash diff @pytest.mark.hash @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hdiff_imatch(): return plot([1, 4, 2, 3]) @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hdiff_idiff(): return plot([1, 2, 4, 3]) @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hdiff_idiffshape(): return plot([4, 2, 3, 1, 3]) @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hdiff_imissing(): return plot([3, 2, 4, 1]) # hash missing @pytest.mark.hash @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hmissing_imatch(): return plot([1, 3, 4, 2]) @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hmissing_idiff(): return plot([1, 4, 3, 2]) @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hmissing_idiffshape(): return plot([4, 2, 3, 1, 4]) @pytest.mark.mpl_image_compare(savefig_kwargs={'metadata': {'Software': None}}) def test_hmissing_imissing(): return plot([2, 4, 3, 1]) # ### Specialized tests # Tolerance: high to force image match @pytest.mark.image @pytest.mark.hash @pytest.mark.mpl_image_compare(tolerance=200, savefig_kwargs={'metadata': {'Software': None}}) def test_hdiff_imatch_tolerance(): return plot([1, 2, 3, 4], linestyle='--') # Tolerance: non-default to verify option recorded in JSON @pytest.mark.image @pytest.mark.hash @pytest.mark.mpl_image_compare(tolerance=3, savefig_kwargs={'metadata': {'Software': None}}) def test_hdiff_idiff_tolerance(): return plot([1, 2, 3, 4], linestyle='--') # Savefig kwargs @pytest.mark.image @pytest.mark.hash @pytest.mark.mpl_image_compare(savefig_kwargs={'facecolor': 'r', 'metadata': {'Software': None}}) def test_hdiff_imatch_savefig(): return plot([1, 2, 3, 4]) # TODO: Implement these path altering tests later # # Different baseline directory # # TODO: Test with a remote `baseline_dir` # @pytest.mark.mpl_image_compare(baseline_dir='baseline/other') # def test_hdiff_imatch_baselinedir(): # return plot([4, 2, 1, 4]) # # # # Different filename # @pytest.mark.mpl_image_compare(filename='test_hdiff_imatch_filename_other.png') # def test_hdiff_imatch_filename(): # return plot([4, 2, 1, 4]) # # # # Different hash library # @pytest.mark.mpl_image_compare(hash_library='hashes/other/other.json') # def test_hdiff_imatch_hashlibrary(): # return plot([4, 2, 1, 4]) # Different style @pytest.mark.image @pytest.mark.hash @pytest.mark.mpl_image_compare(style='fivethirtyeight', savefig_kwargs={'metadata': {'Software': None}}) def test_hdiff_imatch_style(): return plot([4, 2, 1, 4]) # Remove text @pytest.mark.image @pytest.mark.hash @pytest.mark.mpl_image_compare(remove_text=True, savefig_kwargs={'metadata': {'Software': None}}) def test_hdiff_imatch_removetext(): return plot([4, 2, 1, 4]) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1658578869.6922362 pytest-mpl-0.16.1/tests/subtests/summaries/0000755000175100001710000000000014266763666020365 5ustar00runnerdocker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_default.json0000644000175100001710000002027414266763645023745 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_idiff": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmatch_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmatch_idiff/result-failed-diff.png", "rms": 24.618234716477044, "tolerance": 2, "result_image": "subtests.subtest.test_hmatch_idiff/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmatch_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_idiffshape/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_imissing": { "status": "failed", "image_status": "missing", "hash_status": null, "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_imissing/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiff": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hdiff_idiff/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff/result-failed-diff.png", "rms": 24.620185259705547, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_idiff/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hdiff_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_idiffshape/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imissing": { "status": "failed", "image_status": "missing", "hash_status": null, "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imissing/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_imatch": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_idiff": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmissing_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmissing_idiff/result-failed-diff.png", "rms": 24.6217358806762, "tolerance": 2, "result_image": "subtests.subtest.test_hmissing_idiff/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmissing_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_idiffshape/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_imissing": { "status": "failed", "image_status": "missing", "hash_status": null, "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_imissing/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 200, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.5[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 3", "baseline_image": "subtests.subtest.test_hdiff_idiff_tolerance/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff_tolerance/result-failed-diff.png", "rms": 24.576566752362574, "tolerance": 3, "result_image": "subtests.subtest.test_hdiff_idiff_tolerance/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_style": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": null, "result_hash": null } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_generate.json0000644000175100001710000001471614266763645024117 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_idiff": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_imissing": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiff": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imissing": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_imatch": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_idiff": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_imissing": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_style": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_generate_hashes_only.json0000644000175100001710000002116614266763645026510 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_idiff": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmatch_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmatch_idiff/result-failed-diff.png", "rms": 24.618234716477044, "tolerance": 2, "result_image": "subtests.subtest.test_hmatch_idiff/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmatch_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_idiffshape/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_imissing": { "status": "failed", "image_status": "missing", "hash_status": "generated", "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_imissing/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiff": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hdiff_idiff/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff/result-failed-diff.png", "rms": 24.620185259705547, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_idiff/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hdiff_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_idiffshape/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imissing": { "status": "failed", "image_status": "missing", "hash_status": "generated", "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imissing/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_imatch": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_idiff": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmissing_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmissing_idiff/result-failed-diff.png", "rms": 24.6217358806762, "tolerance": 2, "result_image": "subtests.subtest.test_hmissing_idiff/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmissing_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_idiffshape/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_imissing": { "status": "failed", "image_status": "missing", "hash_status": "generated", "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_imissing/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 200, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.5[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 3", "baseline_image": "subtests.subtest.test_hdiff_idiff_tolerance/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff_tolerance/result-failed-diff.png", "rms": 24.576566752362574, "tolerance": 3, "result_image": "subtests.subtest.test_hdiff_idiff_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_style": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": 2, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_generate_images_only.json0000644000175100001710000001402414266763645026475 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_idiff": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_imissing": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiff": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imissing": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_imatch": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_idiff": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_imissing": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_style": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_hash.json0000644000175100001710000001024014266763645023234 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "passed", "image_status": null, "hash_status": "match", "status_msg": "Test hash matches baseline hash.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imatch/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmissing_imatch": { "status": "failed", "image_status": null, "hash_status": "missing", "status_msg": "REGEX:Hash for test 'subtests\\.subtest\\.test_hmissing_imatch' not found in .*\\.json\\. Generated hash is ###_RESULT_HASH_###\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_imatch/result.png", "baseline_hash": null, "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_tolerance\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imatch_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_idiff_tolerance\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_idiff_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_savefig\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imatch_savefig/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_style": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_style\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imatch_style/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_removetext\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imatch_removetext/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_html_generate.json0000644000175100001710000001642614266763645025143 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmatch_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_idiff": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmatch_idiff/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmatch_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_imissing": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmatch_imissing/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiff": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_idiff/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imissing": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imissing/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_imatch": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmissing_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_idiff": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmissing_idiff/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmissing_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_imissing": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmissing_imissing/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imatch_tolerance/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_idiff_tolerance/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imatch_savefig/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_style": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imatch_style/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "skipped", "image_status": "generated", "hash_status": "generated", "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imatch_removetext/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_html_generate_hashes_only.json0000644000175100001710000002245414266763645027535 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hmatch_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hmatch_imatch/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_idiff": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmatch_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmatch_idiff/result-failed-diff.png", "rms": 24.618234716477044, "tolerance": 2, "result_image": "subtests.subtest.test_hmatch_idiff/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmatch_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_idiffshape/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmatch_imissing": { "status": "failed", "image_status": "missing", "hash_status": "generated", "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_imissing/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hdiff_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiff": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hdiff_idiff/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff/result-failed-diff.png", "rms": 24.620185259705547, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_idiff/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hdiff_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_idiffshape/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imissing": { "status": "failed", "image_status": "missing", "hash_status": "generated", "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imissing/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_imatch": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hmissing_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hmissing_imatch/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_idiff": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmissing_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmissing_idiff/result-failed-diff.png", "rms": 24.6217358806762, "tolerance": 2, "result_image": "subtests.subtest.test_hmissing_idiff/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmissing_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_idiffshape/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hmissing_imissing": { "status": "failed", "image_status": "missing", "hash_status": "generated", "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_imissing/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hdiff_imatch_tolerance/baseline.png", "diff_image": null, "rms": null, "tolerance": 200, "result_image": "subtests.subtest.test_hdiff_imatch_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "failed", "image_status": "diff", "hash_status": "generated", "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.5[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 3", "baseline_image": "subtests.subtest.test_hdiff_idiff_tolerance/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff_tolerance/result-failed-diff.png", "rms": 24.576566752362574, "tolerance": 3, "result_image": "subtests.subtest.test_hdiff_idiff_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hdiff_imatch_savefig/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_savefig/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_style": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hdiff_imatch_style/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_style/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "passed", "image_status": "match", "hash_status": "generated", "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hdiff_imatch_removetext/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_removetext/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": null } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_html_generate_images_only.json0000644000175100001710000001553414266763645027530 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmatch_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_idiff": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmatch_idiff/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmatch_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_imissing": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmatch_imissing/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiff": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_idiff/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imissing": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imissing/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_imatch": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmissing_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_idiff": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmissing_idiff/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_idiffshape": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmissing_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_imissing": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hmissing_imissing/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imatch_tolerance/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_idiff_tolerance/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imatch_savefig/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_style": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imatch_style/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "skipped", "image_status": "generated", "hash_status": null, "status_msg": "Skipped test, since generating image.", "baseline_image": "subtests.subtest.test_hdiff_imatch_removetext/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": null, "result_hash": null } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_html_hashes_only.json0000644000175100001710000001031414266763645025653 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "passed", "image_status": null, "hash_status": "match", "status_msg": "Test hash matches baseline hash.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_imatch/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imatch/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmissing_imatch": { "status": "failed", "image_status": null, "hash_status": "missing", "status_msg": "REGEX:Hash for test 'subtests\\.subtest\\.test_hmissing_imatch' not found in .*\\.json\\. Generated hash is ###_RESULT_HASH_###\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_imatch/result.png", "baseline_hash": null, "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_tolerance\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imatch_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_idiff_tolerance\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_idiff_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_savefig\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imatch_savefig/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_style": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_style\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imatch_style/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "failed", "image_status": null, "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_removetext\\.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imatch_removetext/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_html_images_only.json0000644000175100001710000002156214266763645025654 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hmatch_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hmatch_imatch/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_idiff": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmatch_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmatch_idiff/result-failed-diff.png", "rms": 24.618234716477044, "tolerance": 2, "result_image": "subtests.subtest.test_hmatch_idiff/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmatch_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_idiffshape/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmatch_imissing": { "status": "failed", "image_status": "missing", "hash_status": null, "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_imissing/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hdiff_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiff": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hdiff_idiff/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff/result-failed-diff.png", "rms": 24.620185259705547, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_idiff/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hdiff_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_idiffshape/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imissing": { "status": "failed", "image_status": "missing", "hash_status": null, "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imissing/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_imatch": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hmissing_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hmissing_imatch/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_idiff": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmissing_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmissing_idiff/result-failed-diff.png", "rms": 24.6217358806762, "tolerance": 2, "result_image": "subtests.subtest.test_hmissing_idiff/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmissing_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_idiffshape/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hmissing_imissing": { "status": "failed", "image_status": "missing", "hash_status": null, "status_msg": "REGEX:Image file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_imissing/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hdiff_imatch_tolerance/baseline.png", "diff_image": null, "rms": null, "tolerance": 200, "result_image": "subtests.subtest.test_hdiff_imatch_tolerance/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "failed", "image_status": "diff", "hash_status": null, "status_msg": "REGEX:Error: Image files did not match\\.\n RMS Value: 24\\.5[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 3", "baseline_image": "subtests.subtest.test_hdiff_idiff_tolerance/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff_tolerance/result-failed-diff.png", "rms": 24.576566752362574, "tolerance": 3, "result_image": "subtests.subtest.test_hdiff_idiff_tolerance/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hdiff_imatch_savefig/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_savefig/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_style": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hdiff_imatch_style/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_style/result.png", "baseline_hash": null, "result_hash": null }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "passed", "image_status": "match", "hash_status": null, "status_msg": "Image comparison passed.", "baseline_image": "subtests.subtest.test_hdiff_imatch_removetext/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_removetext/result.png", "baseline_hash": null, "result_hash": null } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_hybrid.json0000644000175100001710000002634014266763645023602 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "passed", "image_status": null, "hash_status": "match", "status_msg": "Test hash matches baseline hash.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmatch_idiff": { "status": "passed", "image_status": null, "hash_status": "match", "status_msg": "Test hash matches baseline hash.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmatch_idiffshape": { "status": "passed", "image_status": null, "hash_status": "match", "status_msg": "Test hash matches baseline hash.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmatch_imissing": { "status": "passed", "image_status": null, "hash_status": "match", "status_msg": "Test hash matches baseline hash.", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": null, "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch": { "status": "failed", "image_status": "match", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hdiff_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_idiff": { "status": "failed", "image_status": "diff", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_idiff\\.\n\nImage comparison test\n---------------------\nError: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hdiff_idiff/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff/result-failed-diff.png", "rms": 24.620185259705547, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_idiff/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_idiffshape\\.\n\nImage comparison test\n---------------------\nError: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hdiff_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_idiffshape/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imissing": { "status": "failed", "image_status": "missing", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imissing\\.\n\nImage comparison test\n---------------------\nImage file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imissing/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmissing_imatch": { "status": "failed", "image_status": "match", "hash_status": "missing", "status_msg": "REGEX:Hash for test 'subtests\\.subtest\\.test_hmissing_imatch' not found in .*\\.json\\. Generated hash is ###_RESULT_HASH_###\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hmissing_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hmissing_imatch/result.png", "baseline_hash": null, "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmissing_idiff": { "status": "failed", "image_status": "diff", "hash_status": "missing", "status_msg": "REGEX:Hash for test 'subtests\\.subtest\\.test_hmissing_idiff' not found in .*\\.json\\. Generated hash is ###_RESULT_HASH_###\\.\n\nImage comparison test\n---------------------\nError: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmissing_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmissing_idiff/result-failed-diff.png", "rms": 24.6217358806762, "tolerance": 2, "result_image": "subtests.subtest.test_hmissing_idiff/result.png", "baseline_hash": null, "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmissing_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": "missing", "status_msg": "REGEX:Hash for test 'subtests\\.subtest\\.test_hmissing_idiffshape' not found in .*\\.json\\. Generated hash is ###_RESULT_HASH_###\\.\n\nImage comparison test\n---------------------\nError: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmissing_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_idiffshape/result.png", "baseline_hash": null, "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmissing_imissing": { "status": "failed", "image_status": "missing", "hash_status": "missing", "status_msg": "REGEX:Hash for test 'subtests\\.subtest\\.test_hmissing_imissing' not found in .*\\.json\\. Generated hash is ###_RESULT_HASH_###\\.\n\nImage comparison test\n---------------------\nImage file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_imissing/result.png", "baseline_hash": null, "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "failed", "image_status": "match", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_tolerance\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hdiff_imatch_tolerance/baseline.png", "diff_image": null, "rms": null, "tolerance": 200, "result_image": "subtests.subtest.test_hdiff_imatch_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "failed", "image_status": "diff", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_idiff_tolerance\\.\n\nImage comparison test\n---------------------\nError: Image files did not match\\.\n RMS Value: 24\\.5[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 3", "baseline_image": "subtests.subtest.test_hdiff_idiff_tolerance/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff_tolerance/result-failed-diff.png", "rms": 24.576566752362574, "tolerance": 3, "result_image": "subtests.subtest.test_hdiff_idiff_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "failed", "image_status": "match", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_savefig\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hdiff_imatch_savefig/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_savefig/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_style": { "status": "failed", "image_status": "match", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_style\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hdiff_imatch_style/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_style/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "failed", "image_status": "match", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_removetext\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hdiff_imatch_removetext/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_removetext/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/summaries/test_results_always.json0000644000175100001710000003053414266763645025402 0ustar00runnerdocker{ "subtests.subtest.test_hmatch_imatch": { "status": "passed", "image_status": "match", "hash_status": "match", "status_msg": "Test hash matches baseline hash.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded.", "baseline_image": "subtests.subtest.test_hmatch_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hmatch_imatch/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmatch_idiff": { "status": "passed", "image_status": "diff", "hash_status": "match", "status_msg": "REGEX:Test hash matches baseline hash\\.\n\nImage comparison test\n---------------------\nError: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmatch_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmatch_idiff/result-failed-diff.png", "rms": 24.618234716477044, "tolerance": 2, "result_image": "subtests.subtest.test_hmatch_idiff/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmatch_idiffshape": { "status": "passed", "image_status": "diff", "hash_status": "match", "status_msg": "REGEX:Test hash matches baseline hash\\.\n\nImage comparison test\n---------------------\nError: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmatch_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_idiffshape/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmatch_imissing": { "status": "passed", "image_status": "missing", "hash_status": "match", "status_msg": "REGEX:Test hash matches baseline hash\\.\n\nImage comparison test\n---------------------\nImage file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmatch_imissing/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch": { "status": "failed", "image_status": "match", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hdiff_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_idiff": { "status": "failed", "image_status": "diff", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_idiff\\.\n\nImage comparison test\n---------------------\nError: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hdiff_idiff/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff/result-failed-diff.png", "rms": 24.620185259705547, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_idiff/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_idiffshape\\.\n\nImage comparison test\n---------------------\nError: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hdiff_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_idiffshape/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imissing": { "status": "failed", "image_status": "missing", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imissing\\.\n\nImage comparison test\n---------------------\nImage file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hdiff_imissing/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmissing_imatch": { "status": "failed", "image_status": "match", "hash_status": "missing", "status_msg": "REGEX:Hash for test 'subtests\\.subtest\\.test_hmissing_imatch' not found in .*\\.json\\. Generated hash is ###_RESULT_HASH_###\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hmissing_imatch/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hmissing_imatch/result.png", "baseline_hash": null, "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmissing_idiff": { "status": "failed", "image_status": "diff", "hash_status": "missing", "status_msg": "REGEX:Hash for test 'subtests\\.subtest\\.test_hmissing_idiff' not found in .*\\.json\\. Generated hash is ###_RESULT_HASH_###\\.\n\nImage comparison test\n---------------------\nError: Image files did not match\\.\n RMS Value: 24\\.6[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 2", "baseline_image": "subtests.subtest.test_hmissing_idiff/baseline.png", "diff_image": "subtests.subtest.test_hmissing_idiff/result-failed-diff.png", "rms": 24.6217358806762, "tolerance": 2, "result_image": "subtests.subtest.test_hmissing_idiff/result.png", "baseline_hash": null, "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmissing_idiffshape": { "status": "failed", "image_status": "diff", "hash_status": "missing", "status_msg": "REGEX:Hash for test 'subtests\\.subtest\\.test_hmissing_idiffshape' not found in .*\\.json\\. Generated hash is ###_RESULT_HASH_###\\.\n\nImage comparison test\n---------------------\nError: Image dimensions did not match\\.\n Expected shape: \\(300, 400\\)\n .*baseline\\.png\n Actual shape: \\(600, 800\\)\n .*result\\.png", "baseline_image": "subtests.subtest.test_hmissing_idiffshape/baseline.png", "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_idiffshape/result.png", "baseline_hash": null, "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hmissing_imissing": { "status": "failed", "image_status": "missing", "hash_status": "missing", "status_msg": "REGEX:Hash for test 'subtests\\.subtest\\.test_hmissing_imissing' not found in .*\\.json\\. Generated hash is ###_RESULT_HASH_###\\.\n\nImage comparison test\n---------------------\nImage file not found for comparison test in: \n\t.*\n\\(This is expected for new tests\\.\\)\nGenerated Image: \n\t.*result\\.png", "baseline_image": null, "diff_image": null, "rms": null, "tolerance": null, "result_image": "subtests.subtest.test_hmissing_imissing/result.png", "baseline_hash": null, "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_tolerance": { "status": "failed", "image_status": "match", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_tolerance\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hdiff_imatch_tolerance/baseline.png", "diff_image": null, "rms": null, "tolerance": 200, "result_image": "subtests.subtest.test_hdiff_imatch_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_idiff_tolerance": { "status": "failed", "image_status": "diff", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_idiff_tolerance\\.\n\nImage comparison test\n---------------------\nError: Image files did not match\\.\n RMS Value: 24\\.5[0-9]*\n Expected: \n .*baseline\\.png\n Actual: \n .*result\\.png\n Difference:\n .*result-failed-diff\\.png\n Tolerance: \n 3", "baseline_image": "subtests.subtest.test_hdiff_idiff_tolerance/baseline.png", "diff_image": "subtests.subtest.test_hdiff_idiff_tolerance/result-failed-diff.png", "rms": 24.576566752362574, "tolerance": 3, "result_image": "subtests.subtest.test_hdiff_idiff_tolerance/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_savefig": { "status": "failed", "image_status": "match", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_savefig\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hdiff_imatch_savefig/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_savefig/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_style": { "status": "failed", "image_status": "match", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_style\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hdiff_imatch_style/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_style/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" }, "subtests.subtest.test_hdiff_imatch_removetext": { "status": "failed", "image_status": "match", "hash_status": "diff", "status_msg": "REGEX:Hash ###_RESULT_HASH_### doesn't match hash ###_BASELINE_HASH_### in library .*\\.json for test subtests\\.subtest\\.test_hdiff_imatch_removetext\\.\n\nImage comparison test\n---------------------\nThe comparison to the baseline image succeeded\\.", "baseline_image": "subtests.subtest.test_hdiff_imatch_removetext/baseline.png", "diff_image": null, "rms": null, "tolerance": 2, "result_image": "subtests.subtest.test_hdiff_imatch_removetext/result.png", "baseline_hash": "###_BASELINE_HASH_###", "result_hash": "###_RESULT_HASH_###" } } ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/subtests/test_subtest.py0000644000175100001710000002773614266763645021476 0ustar00runnerdockerimport os import sys import json import shutil import tempfile import subprocess from pathlib import Path import matplotlib import matplotlib.ft2font import pytest from packaging.version import Version from .helpers import (apply_regex, assert_existence, diff_summary, patch_summary, remove_specific_hashes, transform_hashes, transform_images) # Handle Matplotlib and FreeType versions MPL_VERSION = Version(matplotlib.__version__) FTV = matplotlib.ft2font.__freetype_version__.replace('.', '') VERSION_ID = f"mpl{MPL_VERSION.major}{MPL_VERSION.minor}_ft{FTV}" HASH_LIBRARY = Path(__file__).parent / 'hashes' / (VERSION_ID + ".json") RESULT_LIBRARY = Path(__file__).parent / 'result_hashes' / (VERSION_ID + ".json") HASH_LIBRARY_FLAG = rf'--mpl-hash-library={HASH_LIBRARY}' FULL_BASELINE_PATH = Path(__file__).parent / 'baseline' BASELINE_IMAGES_FLAG_REL = ['--mpl-baseline-path=baseline', '--mpl-baseline-relative'] BASELINE_IMAGES_FLAG_ABS = rf'--mpl-baseline-path={FULL_BASELINE_PATH}' IMAGE_COMPARISON_MODE = ["-k", "image"] HASH_COMPARISON_MODE = ["-k", "hash"] # HYBRID_MODE = [] TEST_FILE = Path(__file__).parent / 'subtest.py' # Global settings to update baselines when running pytest # Note: when updating baseline make sure you don't commit "fixes" # for tests that are expected to fail # (See also `run_subtest` argument `update_baseline` and `update_summary`.) UPDATE_BASELINE = os.getenv("MPL_UPDATE_BASELINE") is not None # baseline images and hashes UPDATE_SUMMARY = os.getenv("MPL_UPDATE_SUMMARY") is not None # baseline summaries # When updating baseline summaries, replace parts of status_msg with regex. # See helpers.apply_regex for more information. REGEX_PATHS = [ str(Path(__file__).parent), # replace all references to baseline files os.path.realpath(tempfile.gettempdir()), # replace all references to output files ] REGEX_STRS = [ r'RMS Value: ', ] def run_subtest(baseline_summary_name, tmp_path, args, summaries=None, xfail=True, has_result_hashes=False, generating_hashes=False, update_baseline=UPDATE_BASELINE, update_summary=UPDATE_SUMMARY): """ Run pytest (within pytest) and check JSON summary report. Parameters ---------- baseline_summary_name : str String of the filename without extension for the baseline summary. tmp_path : pathlib.Path Path of a temporary directory to store results. args : list Extra arguments to pass to pytest. summaries : tuple or list or set, optional, default=[] Summaries to generate in addition to `json`. xfail : bool, optional, default=True Whether the overall pytest run should fail. has_result_hashes : bool or str, optional, default=False Whether a hash library is expected to exist in the results directory. If a string, this is the name of the expected results file. generating_hashes : bool, optional, default=False Whether `--mpl-generate-hash-library` was specified and both of `--mpl-hash-library` and `hash_library=` were not. """ if update_baseline and update_summary: raise ValueError("Cannot enable both `update_baseline` and `update_summary`.") # Parse arguments if summaries is None: summaries = [] assert isinstance(summaries, (tuple, list, set)) summaries = ','.join({'json'} | set(summaries)) # Create the results path results_path = tmp_path / 'results' results_path.mkdir() # Configure the arguments to run the test pytest_args = [sys.executable, '-m', 'pytest', str(TEST_FILE)] mpl_args = ['--mpl', rf'--mpl-results-path={results_path.as_posix()}', f'--mpl-generate-summary={summaries}'] if update_baseline: mpl_args += [rf'--mpl-generate-path={FULL_BASELINE_PATH}'] if HASH_LIBRARY.exists(): mpl_args += [rf'--mpl-generate-hash-library={HASH_LIBRARY}'] # Run the test and record exit status status = subprocess.call(pytest_args + mpl_args + args) # If updating baseline, don't check summaries if update_baseline: assert status == 0 transform_images(FULL_BASELINE_PATH) # Make image comparison tests fail correctly if HASH_LIBRARY.exists(): shutil.copy(HASH_LIBRARY, RESULT_LIBRARY) transform_hashes(HASH_LIBRARY) # Make hash comparison tests fail correctly pytest.skip("Skipping testing, since `update_baseline` is enabled.") return # Ensure exit status is as expected if xfail: assert status != 0 else: assert status == 0 # Load summaries baseline_path = Path(__file__).parent / 'summaries' baseline_file = baseline_path / (baseline_summary_name + '.json') results_file = results_path / 'results.json' if update_summary: shutil.copy(results_file, baseline_file) apply_regex(baseline_file, REGEX_PATHS, REGEX_STRS) remove_specific_hashes(baseline_file) with open(baseline_file, 'r') as f: baseline_summary = json.load(f) with open(results_file, 'r') as f: result_summary = json.load(f) # Apply version specific patches patch = baseline_path / (baseline_summary_name + f'_{VERSION_ID}.patch.json') if patch.exists(): baseline_summary = patch_summary(baseline_summary, patch) # Note: version specific hashes should be handled by diff_summary instead # Compare summaries diff_summary(baseline_summary, result_summary, baseline_hash_library=HASH_LIBRARY, result_hash_library=RESULT_LIBRARY, generating_hashes=generating_hashes) # Ensure reported images exist assert_existence(result_summary, path=results_path) # Get expected name for the hash library saved to the results directory if isinstance(has_result_hashes, str): result_hash_file = tmp_path / 'results' / has_result_hashes has_result_hashes = True # convert to bool after processing str else: result_hash_file = tmp_path / 'results' / HASH_LIBRARY.name # Compare the generated hash library to the expected hash library if has_result_hashes: assert result_hash_file.exists() with open(RESULT_LIBRARY, "r") as f: baseline = json.load(f) with open(result_hash_file, "r") as f: result = json.load(f) # Baseline contains hashes for all subtests so remove ones not used for test in list(baseline.keys()): if test not in result: del baseline[test] diff_summary({'a': baseline}, {'a': result}) else: assert not result_hash_file.exists() if update_summary: pytest.skip("Skipping testing, since `update_summary` is enabled.") def test_default(tmp_path): run_subtest('test_default', tmp_path, [*IMAGE_COMPARISON_MODE]) @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_hash(tmp_path): run_subtest('test_hash', tmp_path, [HASH_LIBRARY_FLAG, *HASH_COMPARISON_MODE]) @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_results_always(tmp_path): run_subtest('test_results_always', tmp_path, [HASH_LIBRARY_FLAG, BASELINE_IMAGES_FLAG_ABS, '--mpl-results-always'], has_result_hashes=True) @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_html(tmp_path): run_subtest('test_results_always', tmp_path, [HASH_LIBRARY_FLAG, BASELINE_IMAGES_FLAG_ABS], summaries=['html'], has_result_hashes=True) assert (tmp_path / 'results' / 'fig_comparison.html').exists() assert (tmp_path / 'results' / 'extra.js').exists() assert (tmp_path / 'results' / 'styles.css').exists() @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_html_hashes_only(tmp_path): run_subtest('test_html_hashes_only', tmp_path, [HASH_LIBRARY_FLAG, *HASH_COMPARISON_MODE], summaries=['html'], has_result_hashes=True) assert (tmp_path / 'results' / 'fig_comparison.html').exists() assert (tmp_path / 'results' / 'extra.js').exists() assert (tmp_path / 'results' / 'styles.css').exists() def test_html_images_only(tmp_path): run_subtest('test_html_images_only', tmp_path, [*IMAGE_COMPARISON_MODE], summaries=['html']) assert (tmp_path / 'results' / 'fig_comparison.html').exists() assert (tmp_path / 'results' / 'extra.js').exists() assert (tmp_path / 'results' / 'styles.css').exists() @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_basic_html(tmp_path): run_subtest('test_results_always', tmp_path, [HASH_LIBRARY_FLAG, *BASELINE_IMAGES_FLAG_REL], summaries=['basic-html'], has_result_hashes=True) assert (tmp_path / 'results' / 'fig_comparison_basic.html').exists() @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_generate(tmp_path): # generating hashes and images; no testing run_subtest('test_generate', tmp_path, [rf'--mpl-generate-path={tmp_path}', rf'--mpl-generate-hash-library={tmp_path / "test_hashes.json"}'], xfail=False, generating_hashes=True) def test_generate_images_only(tmp_path): # generating images; no testing run_subtest('test_generate_images_only', tmp_path, [rf'--mpl-generate-path={tmp_path}', *IMAGE_COMPARISON_MODE], xfail=False) @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_generate_hashes_only(tmp_path): # generating hashes; testing images run_subtest('test_generate_hashes_only', tmp_path, [rf'--mpl-generate-hash-library={tmp_path / "test_hashes.json"}'], generating_hashes=True) @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_html_generate(tmp_path): # generating hashes and images; no testing run_subtest('test_html_generate', tmp_path, [rf'--mpl-generate-path={tmp_path}', rf'--mpl-generate-hash-library={tmp_path / "test_hashes.json"}'], summaries=['html'], xfail=False, has_result_hashes="test_hashes.json", generating_hashes=True) assert (tmp_path / 'results' / 'fig_comparison.html').exists() def test_html_generate_images_only(tmp_path): # generating images; no testing run_subtest('test_html_generate_images_only', tmp_path, [rf'--mpl-generate-path={tmp_path}', *IMAGE_COMPARISON_MODE], summaries=['html'], xfail=False) assert (tmp_path / 'results' / 'fig_comparison.html').exists() @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_html_generate_hashes_only(tmp_path): # generating hashes; testing images run_subtest('test_html_generate_hashes_only', tmp_path, [rf'--mpl-generate-hash-library={tmp_path / "test_hashes.json"}'], summaries=['html'], has_result_hashes="test_hashes.json", generating_hashes=True) assert (tmp_path / 'results' / 'fig_comparison.html').exists() @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_html_run_generate_hashes_only(tmp_path): # generating hashes; testing hashes run_subtest('test_html_hashes_only', tmp_path, [rf'--mpl-generate-hash-library={tmp_path / "test_hashes.json"}', HASH_LIBRARY_FLAG, *HASH_COMPARISON_MODE], summaries=['html'], has_result_hashes="test_hashes.json") assert (tmp_path / 'results' / 'fig_comparison.html').exists() # Run a hybrid mode test last so if generating hash libraries, it includes all the hashes. @pytest.mark.skipif(not HASH_LIBRARY.exists(), reason="No hash library for this mpl version") def test_hybrid(tmp_path): run_subtest('test_hybrid', tmp_path, [HASH_LIBRARY_FLAG, BASELINE_IMAGES_FLAG_ABS]) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tests/test_pytest_mpl.py0000644000175100001710000005026714266763645020324 0ustar00runnerdockerimport os import sys import json import subprocess from pathlib import Path from unittest import TestCase import matplotlib import matplotlib.ft2font import matplotlib.pyplot as plt import pytest from packaging.version import Version MPL_VERSION = Version(matplotlib.__version__) baseline_dir = 'baseline' if MPL_VERSION >= Version('2'): baseline_subdir = '2.0.x' baseline_dir_local = os.path.join(baseline_dir, baseline_subdir) baseline_dir_remote = 'http://matplotlib.github.io/pytest-mpl/' + baseline_subdir + '/' ftv = matplotlib.ft2font.__freetype_version__.replace('.', '') hash_filename = f"mpl{MPL_VERSION.major}{MPL_VERSION.minor}_ft{ftv}.json" if "+" in matplotlib.__version__: hash_filename = "mpldev.json" hash_library = (Path(__file__).parent / "baseline" / # noqa "hashes" / hash_filename) fail_hash_library = Path(__file__).parent / "baseline" / "test_hash_lib.json" baseline_dir_abs = Path(__file__).parent / "baseline" / baseline_subdir hash_baseline_dir_abs = Path(__file__).parent / "baseline" / "hybrid" WIN = sys.platform.startswith('win') # In some cases, the fonts on Windows can be quite different DEFAULT_TOLERANCE = 10 if WIN else 2 def call_pytest(args): return subprocess.call([sys.executable, '-m', 'pytest', '-s'] + args) def assert_pytest_fails_with(args, output_substring): try: subprocess.check_output([sys.executable, '-m', 'pytest', '-s'] + args) except subprocess.CalledProcessError as exc: output = exc.output.decode() assert output_substring in output, output return output else: raise RuntimeError(f'pytest did not fail with args {args}') @pytest.mark.mpl_image_compare(baseline_dir=baseline_dir_local, tolerance=DEFAULT_TOLERANCE) def test_succeeds(): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 3]) return fig @pytest.mark.mpl_image_compare(baseline_dir=baseline_dir_remote, tolerance=DEFAULT_TOLERANCE) def test_succeeds_remote(): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 3]) return fig # The following tries an invalid URL first (or at least a URL where the baseline # image won't exist), but should succeed with the second mirror. @pytest.mark.mpl_image_compare(baseline_dir='http://www.python.org,' + baseline_dir_remote, filename='test_succeeds_remote.png', tolerance=DEFAULT_TOLERANCE) def test_succeeds_faulty_mirror(): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 3]) return fig class TestClass(object): @pytest.mark.mpl_image_compare(baseline_dir=baseline_dir_local, tolerance=DEFAULT_TOLERANCE) def test_succeeds(self): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 3]) return fig @pytest.mark.mpl_image_compare(baseline_dir=baseline_dir_local, savefig_kwargs={'dpi': 30}, tolerance=DEFAULT_TOLERANCE) def test_dpi(): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 3]) return fig TEST_FAILING = """ import pytest import matplotlib.pyplot as plt @pytest.mark.mpl_image_compare def test_fail(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,2]) return fig """ def test_fails(tmpdir): test_file = tmpdir.join('test.py').strpath with open(test_file, 'w') as f: f.write(TEST_FAILING) # If we use --mpl, it should detect that the figure is wrong code = call_pytest(['--mpl', test_file]) assert code != 0 # If we don't use --mpl option, the test should succeed code = call_pytest([test_file]) assert code == 0 TEST_OUTPUT_DIR = """ import pytest import matplotlib.pyplot as plt @pytest.mark.mpl_image_compare def test_output_dir(): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 3]) return fig """ def test_output_dir(tmpdir): test_file = tmpdir.join('test.py').strpath with open(test_file, 'w') as f: f.write(TEST_OUTPUT_DIR) output_dir = tmpdir.join('test_output_dir') # When we run the test, we should get output images where we specify code = call_pytest([f'--mpl-results-path={output_dir}', '--mpl', test_file]) assert code != 0 assert output_dir.exists() assert (output_dir / "test.test_output_dir" / "result.png").exists() TEST_GENERATE = """ import pytest import matplotlib.pyplot as plt @pytest.mark.mpl_image_compare def test_gen(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,3]) return fig """ def test_generate(tmpdir): test_file = tmpdir.join('test.py').strpath with open(test_file, 'w') as f: f.write(TEST_GENERATE) gen_dir = tmpdir.mkdir('spam').mkdir('egg').strpath # If we don't generate, the test will fail assert_pytest_fails_with(['--mpl', test_file], 'Image file not found for comparison test') # If we do generate, the test should succeed and a new file will appear code = call_pytest([f'--mpl-generate-path={gen_dir}', test_file]) assert code == 0 assert os.path.exists(os.path.join(gen_dir, 'test_gen.png')) # If we do generate hash, the test will fail as no image is present hash_file = os.path.join(gen_dir, 'test_hashes.json') code = call_pytest([f'--mpl-generate-hash-library={hash_file}', test_file]) assert code == 1 assert os.path.exists(hash_file) with open(hash_file) as fp: hash_lib = json.load(fp) assert "test.test_gen" in hash_lib @pytest.mark.mpl_image_compare(baseline_dir=baseline_dir_local, tolerance=20) def test_tolerance(): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 2]) return fig def test_nofigure(): pass @pytest.mark.mpl_image_compare(baseline_dir=baseline_dir_local, style='fivethirtyeight', tolerance=DEFAULT_TOLERANCE) def test_base_style(): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 3]) return fig @pytest.mark.mpl_image_compare(baseline_dir=baseline_dir_local, remove_text=True) def test_remove_text(): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 3]) return fig @pytest.mark.parametrize('s', [5, 50, 500]) @pytest.mark.mpl_image_compare(baseline_dir=baseline_dir_local, remove_text=True) def test_parametrized(s): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.scatter([1, 3, 4, 3, 2], [1, 4, 3, 3, 1], s=s) return fig class TestClassWithSetup: # Regression test for a bug that occurred when using setup_method def setup_method(self, method): self.x = [1, 2, 3] @pytest.mark.mpl_image_compare(baseline_dir=baseline_dir_local, filename='test_succeeds.png', tolerance=DEFAULT_TOLERANCE) def test_succeeds(self): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot(self.x) return fig class TestClassWithTestCase(TestCase): # Regression test for a bug that occurred when using unittest.TestCase def setUp(self): self.x = [1, 2, 3] @pytest.mark.mpl_image_compare(baseline_dir=baseline_dir_local, filename='test_succeeds.png', tolerance=DEFAULT_TOLERANCE) def test_succeeds(self): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot(self.x) return fig # hashlib @pytest.mark.skipif(not hash_library.exists(), reason="No hash library for this mpl version") @pytest.mark.mpl_image_compare(hash_library=hash_library) def test_hash_succeeds(): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 3]) return fig TEST_FAILING_HASH = rf""" import pytest import matplotlib.pyplot as plt @pytest.mark.mpl_image_compare(hash_library=r"{fail_hash_library}") def test_hash_fails(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,2]) return fig """ def test_hash_fails(tmpdir): test_file = tmpdir.join('test.py').strpath with open(test_file, 'w', encoding='ascii') as f: f.write(TEST_FAILING_HASH) # If we use --mpl, it should detect that the figure is wrong output = assert_pytest_fails_with(['--mpl', test_file], "doesn't match hash FAIL in library") # We didn't specify a baseline dir so we shouldn't attempt to find one assert "Image file not found for comparison test" not in output, output # Check that the summary path is printed and that it exists. output = assert_pytest_fails_with(['--mpl', test_file, '--mpl-generate-summary=html'], "doesn't match hash FAIL in library") # We didn't specify a baseline dir so we shouldn't attempt to find one print_message = "A summary of test results can be found at:" assert print_message in output, output printed_path = Path(output.split(print_message)[1].strip()) assert printed_path.exists() # If we don't use --mpl option, the test should succeed code = call_pytest([test_file]) assert code == 0 TEST_FAILING_HYBRID = rf""" import pytest import matplotlib.pyplot as plt @pytest.mark.mpl_image_compare(hash_library=r"{fail_hash_library}", tolerance=2) def test_hash_fail_hybrid(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,3]) return fig """ @pytest.mark.skipif(ftv != '261', reason="Incorrect freetype version for hash check") def test_hash_fail_hybrid(tmpdir): test_file = tmpdir.join('test.py').strpath with open(test_file, 'w', encoding='ascii') as f: f.write(TEST_FAILING_HYBRID) # Assert that image comparison runs and fails output = assert_pytest_fails_with(['--mpl', test_file, rf'--mpl-baseline-path={hash_baseline_dir_abs / "fail"}'], "doesn't match hash FAIL in library") assert "Error: Image files did not match." in output, output # Assert reports missing baseline image output = assert_pytest_fails_with(['--mpl', test_file, '--mpl-baseline-path=/not/a/path'], "doesn't match hash FAIL in library") assert "Image file not found for comparison test" in output, output # Assert reports image comparison succeeds output = assert_pytest_fails_with(['--mpl', test_file, rf'--mpl-baseline-path={hash_baseline_dir_abs / "succeed"}'], "doesn't match hash FAIL in library") assert "The comparison to the baseline image succeeded." in output, output # If we don't use --mpl option, the test should succeed code = call_pytest([test_file]) assert code == 0 TEST_FAILING_NEW_HASH = r""" import pytest import matplotlib.pyplot as plt @pytest.mark.mpl_image_compare def test_hash_fails(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,2]) return fig """ @pytest.mark.skipif(ftv != '261', reason="Incorrect freetype version for hash check") def test_hash_fail_new_hashes(tmpdir): # Check that the hash comparison fails even if a new hash file is requested test_file = tmpdir.join('test.py').strpath with open(test_file, 'w', encoding='ascii') as f: f.write(TEST_FAILING_NEW_HASH) # Assert that image comparison runs and fails assert_pytest_fails_with(['--mpl', test_file, f'--mpl-hash-library={fail_hash_library}'], "doesn't match hash FAIL in library") hash_file = tmpdir.join('new_hashes.json').strpath # Assert that image comparison runs and fails assert_pytest_fails_with(['--mpl', test_file, f'--mpl-hash-library={fail_hash_library}', f'--mpl-generate-hash-library={hash_file}'], "doesn't match hash FAIL") TEST_MISSING_HASH = """ import pytest import matplotlib.pyplot as plt @pytest.mark.mpl_image_compare def test_hash_missing(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,2]) return fig """ def test_hash_missing(tmpdir): test_file = tmpdir.join('test.py').strpath with open(test_file, 'w') as f: f.write(TEST_MISSING_HASH) # Assert fails if hash library missing assert_pytest_fails_with(['--mpl', test_file, '--mpl-hash-library=/not/a/path'], "Can't find hash library at path") # Assert fails if hash not in library assert_pytest_fails_with(['--mpl', test_file, f'--mpl-hash-library={fail_hash_library}'], "Hash for test 'test.test_hash_missing' not found in") # If we don't use --mpl option, the test should succeed code = call_pytest([test_file]) assert code == 0 TEST_RESULTS_ALWAYS = """ import pytest import matplotlib.pyplot as plt def plot(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.plot([1,2,2]) return fig @pytest.mark.mpl_image_compare def test_modified(): return plot() @pytest.mark.mpl_image_compare def test_new(): return plot() @pytest.mark.mpl_image_compare def test_unmodified(): return plot() """ @pytest.mark.skipif(not hash_library.exists(), reason="No hash library for this mpl version") def test_results_always(tmpdir): test_file = tmpdir.join('test.py').strpath with open(test_file, 'w') as f: f.write(TEST_RESULTS_ALWAYS) results_path = tmpdir.mkdir('results') code = call_pytest(['--mpl', test_file, '--mpl-results-always', rf'--mpl-hash-library={hash_library}', rf'--mpl-baseline-path={baseline_dir_abs}', '--mpl-generate-summary=html,json,basic-html', rf'--mpl-results-path={results_path.strpath}']) assert code == 0 # hashes correct, so all should pass # assert files for interactive HTML exist assert results_path.join('fig_comparison.html').exists() assert results_path.join('styles.css').exists() assert results_path.join('extra.js').exists() comparison_file = results_path.join('fig_comparison_basic.html') with open(comparison_file, 'r') as f: html = f.read() json_file = results_path.join('results.json') with open(json_file, 'r') as f: json_results = json.load(f) # each test, and which images should exist for test, exists in [ ('test_modified', ['baseline', 'result-failed-diff', 'result']), ('test_new', ['result']), ('test_unmodified', ['baseline', 'result']), ]: test_name = f'test.{test}' summary = f'

{test_name.split(".")[-1]}
' assert summary in html assert test_name in json_results.keys() json_res = json_results[test_name] assert json_res['status'] == 'passed' for image_type in ['baseline', 'result-failed-diff', 'result']: image = f'{test_name}/{image_type}.png' image_exists = results_path.join(*image.split('/')).exists() json_image_key = f"{image_type.split('-')[-1]}_image" if image_type in exists: # assert image so pytest prints it on error assert image and image_exists assert image in html assert json_res[json_image_key] == image else: assert image and not image_exists assert image not in html assert json_res[json_image_key] is None TEST_FAILING_CLASS = """ import pytest import matplotlib.pyplot as plt class TestClass(object): @pytest.mark.mpl_image_compare def test_fails(self): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot([1, 2, 3]) return fig """ TEST_FAILING_CLASS_SETUP_METHOD = """ import pytest import matplotlib.pyplot as plt class TestClassWithSetup: def setup_method(self, method): self.x = [1, 2, 3] @pytest.mark.mpl_image_compare def test_fails(self): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot(self.x) return fig """ TEST_FAILING_UNITTEST_TESTCASE = """ from unittest import TestCase import pytest import matplotlib.pyplot as plt class TestClassWithTestCase(TestCase): def setUp(self): self.x = [1, 2, 3] @pytest.mark.mpl_image_compare def test_fails(self): fig = plt.figure() ax = fig.add_subplot(1, 1, 1) ax.plot(self.x) return fig """ @pytest.mark.parametrize("code", [ TEST_FAILING_CLASS, TEST_FAILING_CLASS_SETUP_METHOD, TEST_FAILING_UNITTEST_TESTCASE, ]) def test_class_fail(code, tmpdir): test_file = tmpdir.join('test.py').strpath with open(test_file, 'w') as f: f.write(code) # Assert fails if hash library missing assert_pytest_fails_with(['--mpl', test_file, '--mpl-hash-library=/not/a/path'], "Can't find hash library at path") # If we don't use --mpl option, the test should succeed code = call_pytest([test_file]) assert code == 0 @pytest.mark.parametrize("runpytest_args", [(), ("--mpl",)]) def test_user_fail(pytester, runpytest_args): pytester.makepyfile( """ import pytest @pytest.mark.mpl_image_compare def test_fail(): pytest.fail("Manually failed by user.") """ ) result = pytester.runpytest(*runpytest_args) result.assert_outcomes(failed=1) result.stdout.fnmatch_lines("FAILED*Manually failed by user.*") @pytest.mark.parametrize("runpytest_args", [(), ("--mpl",)]) def test_user_skip(pytester, runpytest_args): pytester.makepyfile( """ import pytest @pytest.mark.mpl_image_compare def test_skip(): pytest.skip("Manually skipped by user.") """ ) result = pytester.runpytest(*runpytest_args) result.assert_outcomes(skipped=1) @pytest.mark.parametrize("runpytest_args", [(), ("--mpl",)]) def test_user_importorskip(pytester, runpytest_args): pytester.makepyfile( """ import pytest @pytest.mark.mpl_image_compare def test_importorskip(): pytest.importorskip("nonexistantmodule") """ ) result = pytester.runpytest(*runpytest_args) result.assert_outcomes(skipped=1) @pytest.mark.parametrize("runpytest_args", [(), ("--mpl",)]) def test_user_xfail(pytester, runpytest_args): pytester.makepyfile( """ import pytest @pytest.mark.mpl_image_compare def test_xfail(): pytest.xfail() """ ) result = pytester.runpytest(*runpytest_args) result.assert_outcomes(xfailed=1) @pytest.mark.parametrize("runpytest_args", [(), ("--mpl",)]) def test_user_exit_success(pytester, runpytest_args): pytester.makepyfile( """ import pytest @pytest.mark.mpl_image_compare def test_exit_success(): pytest.exit("Manually exited by user.", returncode=0) """ ) result = pytester.runpytest(*runpytest_args) result.assert_outcomes() assert result.ret == 0 result.stdout.fnmatch_lines("*Exit*Manually exited by user.*") @pytest.mark.parametrize("runpytest_args", [(), ("--mpl",)]) def test_user_exit_failure(pytester, runpytest_args): pytester.makepyfile( """ import pytest @pytest.mark.mpl_image_compare def test_exit_fail(): pytest.exit("Manually exited by user.", returncode=1) """ ) result = pytester.runpytest(*runpytest_args) result.assert_outcomes() assert result.ret == 1 result.stdout.fnmatch_lines("*Exit*Manually exited by user.*") @pytest.mark.parametrize("runpytest_args", [(), ("--mpl",)]) def test_user_function_raises(pytester, runpytest_args): pytester.makepyfile( """ import pytest @pytest.mark.mpl_image_compare def test_raises(): raise ValueError("User code raised an exception.") """ ) result = pytester.runpytest(*runpytest_args) result.assert_outcomes(failed=1) result.stdout.fnmatch_lines("FAILED*ValueError*User code*") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1658578853.0 pytest-mpl-0.16.1/tox.ini0000644000175100001710000000257714266763645014665 0ustar00runnerdocker[tox] envlist = py{36,310}-test-mpldev py{36,37,38,39,310}-test-mpl{34,35} py37-test-mpl{30,31,32,33} py36-test-mpl{20,21,22,30} codestyle requires = setuptools >= 30.3.0 pip >= 19.3.1 isolated_build = true [testenv] passenv = DISPLAY WINDIR MPL_UPDATE_* setenv = MPLBACKEND = Agg changedir = .tmp/{envname} description = run tests deps = mpl20: matplotlib==2.0.* mpl20: nose mpl21: matplotlib==2.1.* mpl22: matplotlib==2.2.* mpl30: matplotlib==3.0.* mpl31: matplotlib==3.1.* mpl32: matplotlib==3.2.* mpl33: matplotlib==3.3.* mpl34: matplotlib==3.4.* mpl35: matplotlib==3.5.* mpldev: git+https://github.com/matplotlib/matplotlib.git#egg=matplotlib pytest54: pytest==5.4.* pytest60: pytest==6.0.* pytest61: pytest==6.1.* pytest62: pytest==6.2.* pytest70: pytest==7.0.* pytest71: pytest==7.1.* pytestdev: git+https://github.com/pytest-dev/pytest.git#egg=pytest extras = test commands = pip freeze # Make sure the tests pass with and without --mpl # Use -m so pytest skips "subtests" which always apply --mpl pytest '{toxinidir}' -m "mpl_image_compare" {posargs} pytest '{toxinidir}' --mpl --cov pytest_mpl {posargs} [testenv:codestyle] skip_install = true changedir = . description = check code style, e.g. with flake8 deps = pre-commit commands = pre-commit run --all-files