From c189beedac28c0248d497cc3e219b13a4fa6753d Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Mon, 20 Nov 2023 19:22:28 +0100 Subject: [PATCH 001/166] README.md additional notes on two version releases --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ac430b574..b3a587998 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ Additional notes: - Use the `--dry` option to preview the release change. - The release tag (e.g. a/b/rc) is determined from the last release. Use the `--tag` option to switch the release tag. + - For making "outdate" release since we fix minor version to `2x.04.xx` and `2x.10.xx`, use e.g. `bumpver update --set-version v23.10.0rc4 --ignore-vcs-tag` to make the release. ## Acknowledgements From e5570464c2a07d69c15b055bf92eead4e1d1d007 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Mon, 20 Nov 2023 20:24:41 +0100 Subject: [PATCH 002/166] k8s: revert aiidalab install app for k8s bind home mount (#562) I revert the install of app in container from using aiidalab install to pip install, since the aiidalab install in the backend calls pip install --user and installs dependencies to /home/jovyan/.local. In k8s deployment, the home folder is not bind mounted therefore dependencies will all lost. Issue https://github.com/aiidalab/aiidalab-qe/issues/563 is opened for future improment. --- docker/Dockerfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index a92fecfef..1df916f35 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -18,7 +18,10 @@ RUN cd ${PREINSTALL_APP_FOLDER} && \ # and then the app and restart the daemon in the end. # But since the aiida profile not yet exists, the daemon restart will fail but it is not a problem. # Because we only need the dependencies to be installed. - aiidalab install --yes --python ${CONDA_DIR}/bin/python "quantum-espresso@file://${PREINSTALL_APP_FOLDER}" && \ + # aiidalab install --yes --python ${CONDA_DIR}/bin/python "quantum-espresso@file://${PREINSTALL_APP_FOLDER}" && \ + # However, have to use `pip install` explicitly because `aiidalab install` call `pip install --user` which will install the app to `/home/${NB_USER}/.local`. + # It won't cause issue for docker but for k8s deployment the home folder is not bind mounted to the pod and the dependencies won't be found. (see issue in `jupyter/docker-stacks` https://github.com/jupyter/docker-stacks/issues/815) + pip install . --no-cache-dir && \ fix-permissions "${CONDA_DIR}" && \ fix-permissions "/home/${NB_USER}" From a1a1a008d7d06744da96bf4340930b0fb1079546 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Mon, 20 Nov 2023 20:37:27 +0100 Subject: [PATCH 003/166] Bump version v23.10.0b2 -> v23.10.0rc0 --- setup.cfg | 4 ++-- src/aiidalab_qe/version.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.cfg b/setup.cfg index 06f187089..4f7e1e685 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = aiidalab_qe -version = 23.10.0b2 +version = 23.10.0rc0 description = Package for the AiiDAlab QE app long_description = file: README.md long_description_content_type = text/markdown @@ -71,7 +71,7 @@ ignore = E203 [bumpver] -current_version = "v23.10.0b2" +current_version = "v23.10.0rc0" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = True diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index 705e34129..201ae4c62 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -3,4 +3,4 @@ """This module contains project version information for both the app and the workflow.""" -__version__ = "v23.10.0b2" +__version__ = "v23.10.0rc0" From 0f4279b3118d4adb03e3a61a396f31c7b15ed57e Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Thu, 23 Nov 2023 08:35:37 +0100 Subject: [PATCH 004/166] Clean pdos setting (#568) - removes the values from the kpoints_distance from the pdos plugin - fixes the behavior of create_kpoints_from_distance creating a new aiida node in pdos --- src/aiidalab_qe/plugins/pdos/setting.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/aiidalab_qe/plugins/pdos/setting.py b/src/aiidalab_qe/plugins/pdos/setting.py index fb88a7bee..180a5c032 100644 --- a/src/aiidalab_qe/plugins/pdos/setting.py +++ b/src/aiidalab_qe/plugins/pdos/setting.py @@ -6,16 +6,10 @@ from aiida_quantumespresso.calculations.functions.create_kpoints_from_distance import ( create_kpoints_from_distance, ) +from aiida_quantumespresso.workflows.pdos import PdosWorkChain from aiidalab_qe.common.panel import Panel -# nscf_kpoints_distance values from PdosWorkChain -NSCF_DISTANCE_MAP = { - "fast": 0.5, - "moderate": 0.1, - "precise": 0.05, -} - class Setting(Panel): title = "PDOS" @@ -48,7 +42,9 @@ def __init__(self, **kwargs): @tl.observe("protocol") def _procotol_changed(self, change): - self.nscf_kpoints_distance.value = NSCF_DISTANCE_MAP[change["new"]] + self.nscf_kpoints_distance.value = PdosWorkChain.get_protocol_inputs( + change["new"] + )["nscf"]["kpoints_distance"] self._display_mesh() @tl.observe("input_structure") @@ -58,7 +54,7 @@ def _update_structure(self, _=None): def _display_mesh(self, _=None): if self.input_structure is None: return - mesh = create_kpoints_from_distance( + mesh = create_kpoints_from_distance.process_class._func( self.input_structure, orm.Float(self.nscf_kpoints_distance.value), orm.Bool(True), From 09ba7d0fbf506cceed5d03338ceb8b397fd62c05 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Wed, 29 Nov 2023 23:43:12 +0100 Subject: [PATCH 005/166] DevOps: from forked repo not trigger push and arm64 image build (#573) --- .github/workflows/docker.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 2120e957b..32d0d64a9 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -71,6 +71,7 @@ jobs: image: qe architecture: arm64 runsOn: ARM64 + if: ${{ !github.event.pull_request.head.repo.fork }} amd64-push-ghcr: uses: ./.github/workflows/docker-push.yml @@ -82,6 +83,7 @@ jobs: REGISTRY_USERNAME: ${{ github.actor }} REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} needs: [amd64] + if: ${{ !github.event.pull_request.head.repo.fork }} arm64-push-ghcr: uses: ./.github/workflows/docker-push.yml @@ -93,6 +95,7 @@ jobs: REGISTRY_USERNAME: ${{ github.actor }} REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} needs: [arm64] + if: ${{ !github.event.pull_request.head.repo.fork }} merge-tags-ghcr: uses: ./.github/workflows/docker-merge-tags.yml @@ -103,6 +106,7 @@ jobs: REGISTRY_USERNAME: ${{ github.actor }} REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} needs: [amd64-push-ghcr, arm64-push-ghcr] + if: ${{ !github.event.pull_request.head.repo.fork }} amd64-push-dockerhub: if: github.repository == 'aiidalab/aiidalab-qe' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) From 0cc35b9c9f4aa19dd2f8ae71ac09a40075dab69b Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Thu, 30 Nov 2023 21:47:06 +0100 Subject: [PATCH 006/166] Checks if any element in the array returned by get_tags() is non-zero (#574) fixes #541 The structure can be 1D, 2D or 3D which will have different shape of array list for the empty selected tags when the tag editor is used. The issue comes from the if condition such as `[] == [[], []]` --- src/aiidalab_qe/common/widgets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aiidalab_qe/common/widgets.py b/src/aiidalab_qe/common/widgets.py index 8360ce783..afb7b6b88 100644 --- a/src/aiidalab_qe/common/widgets.py +++ b/src/aiidalab_qe/common/widgets.py @@ -566,7 +566,7 @@ def _add_tags(self, _=None): else: selection = string_range_to_list(self.atom_selection.value)[0] new_structure = deepcopy(self.structure) - if new_structure.get_tags() == []: + if not new_structure.get_tags().any(): new_tags = np.zeros(len(new_structure)) else: new_tags = new_structure.get_tags() From 30ffe7a5caeb0ecc289a045db2b70783de7f1d57 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Tue, 12 Dec 2023 14:18:17 +0100 Subject: [PATCH 007/166] DOC: new docker stack update and add placeholder section for docker desktop (#572) Adding section for docker desktop and update the documentation organization of docker running part. --- docs/requirements.in | 2 +- docs/requirements.txt | 25 +++- docs/source/conf.py | 2 + docs/source/index.rst | 2 +- .../access_aiidalab/container.rst | 110 ++++++++++++++++++ .../{aiidalab => access_aiidalab}/index.rst | 45 +++---- .../{aiidalab => access_aiidalab}/vm.rst | 0 docs/source/installation/aiidalab/docker.rst | 35 ------ docs/source/installation/aiidalab/launch.rst | 66 ----------- docs/source/installation/index.rst | 2 +- setup.cfg | 2 + 11 files changed, 151 insertions(+), 140 deletions(-) create mode 100644 docs/source/installation/access_aiidalab/container.rst rename docs/source/installation/{aiidalab => access_aiidalab}/index.rst (76%) rename docs/source/installation/{aiidalab => access_aiidalab}/vm.rst (100%) delete mode 100644 docs/source/installation/aiidalab/docker.rst delete mode 100644 docs/source/installation/aiidalab/launch.rst diff --git a/docs/requirements.in b/docs/requirements.in index c3b945730..a53e994fb 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,3 +1,3 @@ sphinx~=4.5.0 sphinx-design~=0.4.1 -pydata-sphinx-theme==0.8.0 +pydata-sphinx-theme==0.13.3 diff --git a/docs/requirements.txt b/docs/requirements.txt index a72320b01..7c8bea324 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,13 +1,17 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.9 # by the following command: # # pip-compile docs/requirements.in # +accessible-pygments==0.0.4 + # via pydata-sphinx-theme alabaster==0.7.13 # via sphinx babel==2.12.1 - # via sphinx + # via + # pydata-sphinx-theme + # sphinx beautifulsoup4==4.12.2 # via pydata-sphinx-theme certifi==2023.5.7 @@ -22,16 +26,23 @@ idna==3.4 # via requests imagesize==1.4.1 # via sphinx +importlib-metadata==6.8.0 + # via sphinx jinja2==3.1.2 # via sphinx markupsafe==2.1.3 # via jinja2 packaging==23.1 - # via sphinx -pydata-sphinx-theme==0.8.0 + # via + # pydata-sphinx-theme + # sphinx +pydata-sphinx-theme==0.13.3 # via -r docs/requirements.in pygments==2.15.1 - # via sphinx + # via + # accessible-pygments + # pydata-sphinx-theme + # sphinx requests==2.31.0 # via sphinx snowballstemmer==2.2.0 @@ -57,5 +68,9 @@ sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx +typing-extensions==4.8.0 + # via pydata-sphinx-theme urllib3==2.0.3 # via requests +zipp==3.17.0 + # via importlib-metadata diff --git a/docs/source/conf.py b/docs/source/conf.py index 3d88c4283..8c907a464 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,6 +18,8 @@ # -- Project information ----------------------------------------------------- +version = "v23.10.0rc0" +release = f"{version}-dev" project = "Quantum ESPRESSO App" copyright_first_year = "2023" copyright_owners = "The AiiDAlab Team" diff --git a/docs/source/index.rst b/docs/source/index.rst index c7ffcf5ec..4464737e2 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -11,7 +11,7 @@ Welcome Page :child-align: justify :class: sd-fs-5 - .. rubric:: The Quantum ESPRESSO App - Version 23.10.0a0 + .. rubric:: The Quantum ESPRESSO App - Version |release| The Quantum ESPRESSO (QE) app is an `AiiDAlab`_ Jupyter-based graphical user interface allowing users to conduct and streamline many of `Quantum ESPRESSO`_'s calculations by leveraging `AiiDA`_'s powerful workflows implemented in the AiiDA Quantum ESPRESSO plugin. diff --git a/docs/source/installation/access_aiidalab/container.rst b/docs/source/installation/access_aiidalab/container.rst new file mode 100644 index 000000000..927bc06c7 --- /dev/null +++ b/docs/source/installation/access_aiidalab/container.rst @@ -0,0 +1,110 @@ +======================== +Local Container Instance +======================== + +.. note:: + + If you already have access to AiiDAlab but the Quantum ESPRESSO app is not installed, you need proceed to :doc:`install the app `. + +AiiDAlab is available as a Docker container - a self-contained, pre-configured environment including all the necessary software to access the AiiDAlab platform. +We also provide container that includes the Quantum ESPRESSO app installed and ready to use. +To run the container, you first need to install Docker on your local machine. +If you have yet to do so, you may click `here `_ to follow the official Docker installation guide. + +We recommended to install the `Docker Desktop `_ which is available for all major operating systems. + +.. important:: + + On Linux, if the docker is installed by `docker engine `_, you need `root` privileges to perform the `post-installation steps for Docker Engine `_. There is **NO NEED** to perform this step if the docker is installed by `docker desktop `_. + +Once Docker is installed, you can launch the container in one of several ways depending on your operating system. +This is discussed in the following sections. + +Docker Desktop +************** + +If you use Windows, this may be the easiest way to launch the container. +For MacOS and Linux, you can also use Docker Desktop, but you may prefer to use the command line interface (CLI), see the next sections. + +Comming soon with video tutorial. + +AiiDAlab launch +*************** + +.. important:: + + The following steps require a local installation of Docker. + You can check the docker is properly installed by running ``docker run hello-world`` in the terminal. + +`AiiDAlab launch`_ is a thin Docker wrapper which takes care of all the prerequisites to run the AiiDAlab Docker image. +It helps to manage multiple AiiDAlab profiles, each with its own home directory for persistent storage, and allows to easily switch between them. +To use AiiDAlab launch, you will have to + +#. Install AiiDAlab launch with `pipx `_ (**recommended**): + + .. code-block:: console + + pipx install aiidalab-launch + + or directly with pip + + .. code-block:: console + + pip install aiidalab-launch + +#. Set up a new `QE` profile with + + .. code-block:: console + + aiidalab-launch profile add --image aiidalab/qe:latest QE + + At the prompt, enter `n` to skip editing the profile settings. + +#. Start AiiDAlab with + + .. code-block:: console + + aiidalab-launch start -p QE + +#. Follow the URL on the screen to open AiiDAlab in the browser + +.. tip:: + + For more detailed help, run + + .. code-block:: console + + aiidalab-launch --help + +Profile Management +^^^^^^^^^^^^^^^^^^ + +As shown above, you can manage multiple profiles in AiiDAlab launch, e.g., with different home directories or ports. For more information, run + +.. code-block:: console + + aiidalab-launch profiles --help + +You can inspect the status of all configured AiiDAlab profiles with + +.. code-block:: console + + aiidalab-launch status + +.. _`AiiDAlab launch`: https://github.com/aiidalab/aiidalab-launch + +Using docker CLI directly +************************* + +It is not necessary to use AiiDAlab launch to run the AiiDAlab container. +You can also use the docker CLI directly by running + +.. code-block:: console + + docker run -p 8888:8888 aiidalab/qe:latest + +Follow the URL on the screen to open AiiDAlab in the browser. + +.. important:: + + If you use the docker CLI directly, the data in the home directory of the container will be lost when the container is deleted. You can use the ``-v`` option to mount a local directory to the container to store the data persistently. For more information, run ``docker run --help``. diff --git a/docs/source/installation/aiidalab/index.rst b/docs/source/installation/access_aiidalab/index.rst similarity index 76% rename from docs/source/installation/aiidalab/index.rst rename to docs/source/installation/access_aiidalab/index.rst index 9bd26240f..9f962cdd6 100644 --- a/docs/source/installation/aiidalab/index.rst +++ b/docs/source/installation/access_aiidalab/index.rst @@ -9,71 +9,55 @@ Access AiiDAlab .. grid:: 1 1 1 2 :gutter: 3 - .. grid-item-card:: Local Docker Instance + .. grid-item-card:: Materials Cloud AiiDAlab Server :text-align: center :shadow: md - Install Docker locally and run an instance of an AiiDAlab image *pre-configured** for the Quantum ESPRESSO app. No prior knowledge of Docker necessary! + For researchers affiliated with Materials Cloud partners, log into the open AiiDAlab server hosted on the Materials Cloud. ++++ - .. button-ref:: docker - :ref-type: doc + .. button-link:: https://aiidalab.materialscloud.org/hub/login :click-parent: :expand: :color: primary :outline: - To the guide + Launch the server - .. grid-item-card:: Virtual Machine Image + .. grid-item-card:: Local Docker Instance :text-align: center :shadow: md - Download a virtual machine image for AiiDAlab based on Quantum Mobile, *pre-configured** with everything you need to run the Quantum ESPRESSO app. + Install Docker locally and run an instance of an AiiDAlab image *pre-configured** for the Quantum ESPRESSO app. No prior knowledge of Docker necessary! ++++ - .. button-ref:: vm + .. button-ref:: container :ref-type: doc :click-parent: :expand: :color: primary :outline: - To the download page - - .. grid-item-card:: Materials Cloud AiiDAlab Server - :text-align: center - :shadow: md - - For researchers affiliated with Materials Cloud partners, log into the open AiiDAlab server hosted on the Materials Cloud. - - ++++ - - .. button-link:: https://aiidalab.materialscloud.org/hub/login - :click-parent: - :expand: - :color: primary - :outline: - - Launch the server + To the guide - .. grid-item-card:: Materials MarketPlace AiiDAlab Server + .. grid-item-card:: Virtual Machine Image :text-align: center :shadow: md - For members of the Materials Modeling MarketPlace, log into the open AiiDAlab server hosted on the Materials MarketPlace. + Download a virtual machine image for AiiDAlab based on Quantum Mobile, *pre-configured** with everything you need to run the Quantum ESPRESSO app. ++++ - .. button-link:: https://aiidalab.materials-marketplace.eu/hub/login + .. button-ref:: vm + :ref-type: doc :click-parent: :expand: :color: primary :outline: - Launch the server + To the download page .. div:: @@ -83,6 +67,5 @@ Access AiiDAlab :maxdepth: 1 :hidden: - docker - launch + container vm diff --git a/docs/source/installation/aiidalab/vm.rst b/docs/source/installation/access_aiidalab/vm.rst similarity index 100% rename from docs/source/installation/aiidalab/vm.rst rename to docs/source/installation/access_aiidalab/vm.rst diff --git a/docs/source/installation/aiidalab/docker.rst b/docs/source/installation/aiidalab/docker.rst deleted file mode 100644 index 966e8421f..000000000 --- a/docs/source/installation/aiidalab/docker.rst +++ /dev/null @@ -1,35 +0,0 @@ -============== -Install Docker -============== - -.. note:: - - If you used another method to access AiiDAlab, you may proceed to :doc:`install the app `. - -AiiDAlab is available as a Docker container - a self-contained, pre-configured environment including all the necessary software to access the AiiDAlab platform. To run the container, you first need to install Docker on your local machine. If you have yet to do so, you may click `here `_ to follow the official Docker installation guide. - -.. important:: - - On Linux, you need `root` privileges to perform the `post-installation steps for Docker Engine `_. - -Once Docker is installed, you can launch the container in one of several ways depending on your operating system. This is discussed in the following sections. - -Linux -***** - -You have two options to launch the container: - -#. Execute the following from terminal: - - .. code-block:: console - - docker run -p 8888:8888 aiidalab/qe:edge - -#. Use the :doc:`aiidalab-launch ` (**recommended**) - -Windows/Mac -*********** - -.. note:: - - Instructions for using the `Docker Desktop `_ app coming soon diff --git a/docs/source/installation/aiidalab/launch.rst b/docs/source/installation/aiidalab/launch.rst deleted file mode 100644 index 95bcebbd0..000000000 --- a/docs/source/installation/aiidalab/launch.rst +++ /dev/null @@ -1,66 +0,0 @@ -=============== -AiiDAlab launch -=============== - -.. note:: - - If you ran the container directly using the :code:`docker` command, feel free to skip this page. - -.. important:: - - The following steps require a local installation of Docker. If you have yet to do so, you can follow the instructions :doc:`here `. - -`AiiDAlab launch`_ is a thin Docker wrapper which takes care of all the prerequisites to run the AiiDAlab Docker image. To use AiiDAlab launch, you will have to - -#. Install AiiDAlab launch with `pipx `_ (**recommended**): - - .. code-block:: console - - pipx install aiidalab-launch - - or directly with pip - - .. code-block:: console - - pip install aiidalab-launch - -#. Set up a new `QE` profile with - - .. code-block:: console - - aiidalab-launch profile add --image aiidalab/qe:edge QE - - At the prompt, enter `n` to skip editing the profile settings. - -#. Start AiiDAlab with - - .. code-block:: console - - aiidalab-launch start -p QE - -#. Follow the URL on the screen to open AiiDAlab in the browser - -.. tip:: - - For more detailed help, run - - .. code-block:: console - - aiidalab-launch --help - -Profile Management -^^^^^^^^^^^^^^^^^^ - -As shown above, you can manage multiple profiles in AiiDAlab launch, e.g., with different home directories or ports. For more information, run - -.. code-block:: console - - aiidalab-launch profiles --help - -You can inspect the status of all configured AiiDAlab profiles with - -.. code-block:: console - - aiidalab-launch status - -.. _`AiiDAlab launch`: https://github.com/aiidalab/aiidalab-launch diff --git a/docs/source/installation/index.rst b/docs/source/installation/index.rst index 3df7803ce..6f45fed97 100644 --- a/docs/source/installation/index.rst +++ b/docs/source/installation/index.rst @@ -7,6 +7,6 @@ The following links will guide you through the necessary steps to access the Aii .. toctree:: :maxdepth: 1 - aiidalab/index + access_aiidalab/index install launch diff --git a/setup.cfg b/setup.cfg index 4f7e1e685..d3484958e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -84,3 +84,5 @@ src/aiidalab_qe/version.py = setup.cfg = current_version = "{version}" version = {pep440_version} +docs/source/conf.py = + version = "{version}" From 83bfea68114924c1f8fc04ffebc20f62bc96ebf7 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Wed, 13 Dec 2023 09:48:29 +0100 Subject: [PATCH 008/166] confirm steps when loading previous result (#570) In https://github.com/aiidalab/aiidalab-qe/pull/537 we introduce a mechanism that when the structure setup step or configure setup step is modified without confirmation, the submission step will be blocked. When loading finished calculations from the workflow selection bar, since setup steps are not confirmed, the user has to go back to previous steps to confirm which is not ideal. This PR make it automatically confirm the setup steps when the workflows are loaded from workflow selection dropdown. --- src/aiidalab_qe/app/main.py | 6 +++--- tests/test_app.py | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/aiidalab_qe/app/main.py b/src/aiidalab_qe/app/main.py index 71b12a3b0..deed96509 100644 --- a/src/aiidalab_qe/app/main.py +++ b/src/aiidalab_qe/app/main.py @@ -137,8 +137,8 @@ def _observe_process_selection(self, change): self.structure_step.manager.viewer.structure = ( process.inputs.structure.get_ase() ) - self.structure_step.confirmed_structure = process.inputs.structure - self.configure_step.state = WizardAppWidgetStep.State.SUCCESS + self.structure_step.structure = process.inputs.structure + self.structure_step.confirm() self.submit_step.process = process # set ui_parameters # print out error message if yaml format ui_parameters is not reachable @@ -146,6 +146,6 @@ def _observe_process_selection(self, change): if ui_parameters and isinstance(ui_parameters, str): ui_parameters = deserialize_unsafe(ui_parameters) self.configure_step.set_configuration_parameters(ui_parameters) - self.configure_step.state = self.configure_step.State.SUCCESS + self.configure_step.confirm() self.submit_step.set_submission_parameters(ui_parameters) self.submit_step.state = self.submit_step.State.SUCCESS diff --git a/tests/test_app.py b/tests/test_app.py index 65bfac6c2..10e804f44 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -24,6 +24,11 @@ def test_reload_and_reset(submit_app_generator, generate_qeapp_workchain): ) > 0 ) + assert app.configure_step.state == app.configure_step.State.SUCCESS + # in the reload case, go to the submit step should not + # trigger the reset of previous steps + app._wizard_app_widget.selected_index = 2 + assert app.configure_step.state == app.configure_step.State.SUCCESS # new workflow, this will reset the GUI app.work_chain_selector.value = None # check if the value are reload correctly From 102f39a45396162815f0ace706e6c45afc5c6cf4 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Mon, 18 Dec 2023 11:21:20 +0100 Subject: [PATCH 009/166] Bump SSSP to 1.3 (#578) --- docs/source/development/architecture.rst | 2 +- docs/source/development/plugin.rst | 2 +- post_install | 3 +- qe.ipynb | 2 +- src/aiidalab_qe/app/configuration/advanced.py | 9 +++-- src/aiidalab_qe/app/configuration/pseudos.py | 3 +- src/aiidalab_qe/app/parameters/qeapp.yaml | 2 +- src/aiidalab_qe/common/setup_pseudos.py | 2 +- src/aiidalab_qe/plugins/bands/workchain.py | 5 +++ src/aiidalab_qe/workflows/__init__.py | 5 ++- tests/conftest.py | 40 ++++++++++++++++--- tests/test_configure.py | 9 ++++- tests/test_pseudo.py | 21 ++++++---- tests/test_result/test_summary_report.yml | 4 +- tests/test_submit_qe_workchain.py | 6 +++ 15 files changed, 86 insertions(+), 29 deletions(-) diff --git a/docs/source/development/architecture.rst b/docs/source/development/architecture.rst index dced079e8..4daf5c908 100644 --- a/docs/source/development/architecture.rst +++ b/docs/source/development/architecture.rst @@ -46,7 +46,7 @@ The dictionary has the following structure: }, "pseudos": {"Si": "eaef3352-2b0e-4205-b404-e6565a88aec8"}, }, - "pseudo_family": "SSSP/1.2/PBEsol/efficiency", + "pseudo_family": "SSSP/1.3/PBEsol/efficiency", "kpoints_distance": 0.5, }, "bands": {"kpath_2d": "hexagonal"}, diff --git a/docs/source/development/plugin.rst b/docs/source/development/plugin.rst index 3dbd12692..7be427bb4 100644 --- a/docs/source/development/plugin.rst +++ b/docs/source/development/plugin.rst @@ -206,7 +206,7 @@ The `parameters` passed to the `get_builder` function has the following structur }, "pseudos": {"Si": "eaef3352-2b0e-4205-b404-e6565a88aec8"}, }, - "pseudo_family": "SSSP/1.2/PBEsol/efficiency", + "pseudo_family": "SSSP/1.3/PBEsol/efficiency", "kpoints_distance": 0.5, }, "bands": {"kpath_2d": "hexagonal"}, diff --git a/post_install b/post_install index 5a251b0e8..605a4848f 100755 --- a/post_install +++ b/post_install @@ -2,9 +2,10 @@ # This script is executed after the app installation completes # triggered by the post install hook implemented in https://github.com/aiidalab/aiidalab/pull/295 +# TODO: this script is not yet properly tested. The integration tests are run from the qeapp docker image, this script is executed when the app is installed by `aiidalab install`. Therefore, we need to bring original di test (which removed in https://github.com/aiidalab/aiidalab-qe/pull/449/files#diff-83993fe9ad162677c85ae244400df2469b6d666c2a28d7b8d179785e87beb7f3) back. echo "Starting installation of QE..." python -m aiidalab_qe install-qe & disown echo "Starting installation of pseudo-potentials..." -python -m aiidalab_qe install-sssp & disown +python -m aiidalab_qe install-pseudos & disown diff --git a/qe.ipynb b/qe.ipynb index cca80a21d..089f19f62 100644 --- a/qe.ipynb +++ b/qe.ipynb @@ -97,7 +97,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.10" + "version": "3.9.13" }, "vscode": { "interpreter": { diff --git a/src/aiidalab_qe/app/configuration/advanced.py b/src/aiidalab_qe/app/configuration/advanced.py index ecdee89d4..18950fcd6 100644 --- a/src/aiidalab_qe/app/configuration/advanced.py +++ b/src/aiidalab_qe/app/configuration/advanced.py @@ -196,6 +196,10 @@ def _update_settings_from_protocol(self, protocol): self.kpoints_distance.value = parameters["kpoints_distance"] + # The pseudo_family read from the protocol (aiida-quantumespresso plugin settings) + # we override it with the value from the pseudo_family_selector widget + parameters["pseudo_family"] = self.pseudo_family_selector.value + def _callback_value_set(self, _=None): """Callback function to set the parameters""" settings = { @@ -299,10 +303,7 @@ def reset(self): self._update_settings_from_protocol(self.protocol) # reset the pseudo family - pseudo_family_dict = DEFAULT_PARAMETERS["advanced"]["pseudo_family"] - pseudo_family = PseudoFamily(**pseudo_family_dict) - - self.pseudo_family_selector.load_from_pseudo_family(pseudo_family) + self.pseudo_family_selector.reset() # reset total charge self.total_charge.value = DEFAULT_PARAMETERS["advanced"]["tot_charge"] diff --git a/src/aiidalab_qe/app/configuration/pseudos.py b/src/aiidalab_qe/app/configuration/pseudos.py index 012c41956..7815c8600 100644 --- a/src/aiidalab_qe/app/configuration/pseudos.py +++ b/src/aiidalab_qe/app/configuration/pseudos.py @@ -78,7 +78,6 @@ def __init__(self, **kwargs): self.override = ipw.Checkbox( description="", indent=False, - value=False, layout=ipw.Layout(max_width="10%"), ) self.set_pseudo_family_box = ipw.HBox( @@ -140,6 +139,7 @@ def __init__(self, **kwargs): # this will trigger the callback to set the value of widgets to the default self._default_protocol = DEFAULT_PARAMETERS["workchain"]["protocol"] self.protocol = self._default_protocol + self.override.value = False def set_value(self, _=None): """The callback when the selection of pseudo family or dft functional is changed. @@ -197,6 +197,7 @@ def _protocol_changed(self, _): def _update_settings_from_protocol(self, protocol): """Update the widget values from the given protocol, and trigger the callback.""" + # FIXME: this rely on the aiida-quantumespresso, which is not ideal pseudo_family_string = PwBaseWorkChain.get_protocol_inputs(protocol)[ "pseudo_family" ] diff --git a/src/aiidalab_qe/app/parameters/qeapp.yaml b/src/aiidalab_qe/app/parameters/qeapp.yaml index 613f25dc9..024e1ec6c 100644 --- a/src/aiidalab_qe/app/parameters/qeapp.yaml +++ b/src/aiidalab_qe/app/parameters/qeapp.yaml @@ -17,7 +17,7 @@ workchain: advanced: pseudo_family: library: SSSP - version: 1.2 + version: 1.3 functional: PBEsol accuracy: efficiency tot_charge: 0 diff --git a/src/aiidalab_qe/common/setup_pseudos.py b/src/aiidalab_qe/common/setup_pseudos.py index 12a556cbc..1257a905b 100644 --- a/src/aiidalab_qe/common/setup_pseudos.py +++ b/src/aiidalab_qe/common/setup_pseudos.py @@ -16,7 +16,7 @@ from aiidalab_qe.common.widgets import ProgressBar -SSSP_VERSION = "1.2" +SSSP_VERSION = "1.3" PSEUDODOJO_VERSION = "0.4" EXPECTED_PSEUDOS = { diff --git a/src/aiidalab_qe/plugins/bands/workchain.py b/src/aiidalab_qe/plugins/bands/workchain.py index 4574032af..2a8f9f6e8 100644 --- a/src/aiidalab_qe/plugins/bands/workchain.py +++ b/src/aiidalab_qe/plugins/bands/workchain.py @@ -177,6 +177,10 @@ def get_builder(codes, structure, parameters, **kwargs): pw_code = codes.get("pw") protocol = parameters["workchain"]["protocol"] scf_overrides = deepcopy(parameters["advanced"]) + relax_overrides = { + "base": deepcopy(parameters["advanced"]), + "base_final_scf": deepcopy(parameters["advanced"]), + } bands_overrides = deepcopy(parameters["advanced"]) bands_overrides.pop("kpoints_distance", None) bands_overrides["pw"]["parameters"]["SYSTEM"].pop("smearing", None) @@ -184,6 +188,7 @@ def get_builder(codes, structure, parameters, **kwargs): overrides = { "scf": scf_overrides, "bands": bands_overrides, + "relax": relax_overrides, } bands = PwBandsWorkChain.get_builder_from_protocol( code=pw_code, diff --git a/src/aiidalab_qe/workflows/__init__.py b/src/aiidalab_qe/workflows/__init__.py index 75a74029b..ac292cb4a 100644 --- a/src/aiidalab_qe/workflows/__init__.py +++ b/src/aiidalab_qe/workflows/__init__.py @@ -124,7 +124,10 @@ def get_builder_from_protocol( # Set the structure. builder.structure = structure # relax - relax_overrides = {"base": parameters["advanced"]} + relax_overrides = { + "base": parameters["advanced"], + "base_final_scf": parameters["advanced"], + } protocol = parameters["workchain"]["protocol"] relax_builder = PwRelaxWorkChain.get_builder_from_protocol( code=codes.get("pw"), diff --git a/tests/conftest.py b/tests/conftest.py index d73f258fd..076ac04c8 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -7,6 +7,8 @@ import pytest from aiida import orm +from aiidalab_qe.common.setup_pseudos import SSSP_VERSION + pytest_plugins = ["aiida.manage.tests.pytest_fixtures"] @@ -214,7 +216,7 @@ def sssp(aiida_profile, generate_upf_data): "cutoff_rho": 240.0, } - label = "SSSP/1.2/PBEsol/efficiency" + label = f"SSSP/{SSSP_VERSION}/PBEsol/efficiency" family = SsspFamily.create_from_folder(dirpath, label) family.set_cutoffs(cutoffs, stringency, unit="Ry") @@ -423,11 +425,21 @@ def _generate_pdos_workchain(structure, spin_type="none"): from aiida.orm import Dict, FolderData, RemoteData from aiida_quantumespresso.workflows.pdos import PdosWorkChain + pseudo_family = f"SSSP/{SSSP_VERSION}/PBEsol/efficiency" + inputs = { "pw_code": fixture_code("quantumespresso.pw"), "dos_code": fixture_code("quantumespresso.dos"), "projwfc_code": fixture_code("quantumespresso.projwfc"), "structure": structure, + "overrides": { + "scf": { + "pseudo_family": pseudo_family, + }, + "nscf": { + "pseudo_family": pseudo_family, + }, + }, } builder = PdosWorkChain.get_builder_from_protocol(**inputs) inputs = builder._inputs() @@ -515,9 +527,7 @@ def _generate_pdos_workchain(structure, spin_type="none"): @pytest.fixture def generate_bands_workchain( - fixture_localhost, fixture_code, - generate_xy_data, generate_bands_data, generate_workchain, ): @@ -530,9 +540,27 @@ def _generate_bands_workchain(structure): from aiida.orm import Dict from aiida_quantumespresso.workflows.pw.bands import PwBandsWorkChain + pseudo_family = f"SSSP/{SSSP_VERSION}/PBEsol/efficiency" + inputs = { "code": fixture_code("quantumespresso.pw"), "structure": structure, + "overrides": { + "scf": { + "pseudo_family": pseudo_family, + }, + "bands": { + "pseudo_family": pseudo_family, + }, + "relax": { + "base": { + "pseudo_family": pseudo_family, + }, + "base_final_scf": { + "pseudo_family": pseudo_family, + }, + }, + }, } builder = PwBandsWorkChain.get_builder_from_protocol(**inputs) inputs = builder._inputs() @@ -579,6 +607,8 @@ def _generate_qeapp_workchain( from aiida.orm.utils.serialize import serialize + from aiidalab_qe.app.configuration import ConfigureQeAppWorkChainStep + from aiidalab_qe.app.submission import SubmitQeAppWorkChainStep from aiidalab_qe.workflows import QeAppWorkChain # Step 1: select structure from example @@ -595,7 +625,7 @@ def _generate_qeapp_workchain( s1.confirm() structure = s1.confirmed_structure # step 2 configure - s2 = app.configure_step + s2: ConfigureQeAppWorkChainStep = app.configure_step s2.workchain_settings.relax_type.value = relax_type # In order to parepare a complete inputs, I set all the properties to true # this can be overrided later @@ -608,7 +638,7 @@ def _generate_qeapp_workchain( ) s2.confirm() # step 3 setup code and resources - s3 = app.submit_step + s3: SubmitQeAppWorkChainStep = app.submit_step s3.resources_config.num_cpus.value = 4 builder = s3._create_builder() inputs = builder._inputs() diff --git a/tests/test_configure.py b/tests/test_configure.py index 3727280cf..3885dc789 100644 --- a/tests/test_configure.py +++ b/tests/test_configure.py @@ -1,3 +1,6 @@ +from aiidalab_qe.common.setup_pseudos import PSEUDODOJO_VERSION, SSSP_VERSION + + def test_protocol(): """Test the protocol. The protocol from workchain_settings will trigger the @@ -31,12 +34,14 @@ def test_set_configuration_parameters(): wg = ConfigureQeAppWorkChainStep() parameters = wg.get_configuration_parameters() parameters["workchain"]["relax_type"] = "positions" - parameters["advanced"]["pseudo_family"] = "SSSP/1.2/PBE/efficiency" + parameters["advanced"]["pseudo_family"] = f"SSSP/{SSSP_VERSION}/PBE/efficiency" wg.set_configuration_parameters(parameters) new_parameters = wg.get_configuration_parameters() assert parameters == new_parameters # test pseudodojo - parameters["advanced"]["pseudo_family"] = "PseudoDojo/0.4/PBEsol/SR/standard/upf" + parameters["advanced"][ + "pseudo_family" + ] = f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/SR/standard/upf" wg.set_configuration_parameters(parameters) new_parameters = wg.get_configuration_parameters() assert parameters == new_parameters diff --git a/tests/test_pseudo.py b/tests/test_pseudo.py index a6628da64..f35995317 100644 --- a/tests/test_pseudo.py +++ b/tests/test_pseudo.py @@ -75,7 +75,10 @@ def test_setup_pseudos_cmd(tmp_path): assert "--from-download" not in cmd # mock the source file - source_file = tmp_path / "PseudoDojo_0.4_PBEsol_SR_standard_upf.aiida_pseudo" + source_file = ( + tmp_path + / f"PseudoDojo_{PSEUDODOJO_VERSION}_PBEsol_SR_standard_upf.aiida_pseudo" + ) source_file.touch() cmd = _construct_cmd(pseudo_family, cwd=tmp_path) assert cmd == [ @@ -85,7 +88,7 @@ def test_setup_pseudos_cmd(tmp_path): "--functional", "PBEsol", "--version", - "0.4", + f"{PSEUDODOJO_VERSION}", "-p", "standard", "--relativistic", @@ -93,7 +96,7 @@ def test_setup_pseudos_cmd(tmp_path): "--pseudo-format", "upf", "--from-download", - f"{str(tmp_path)}/PseudoDojo_0.4_PBEsol_SR_standard_upf.aiida_pseudo", + f"{str(tmp_path)}/PseudoDojo_{PSEUDODOJO_VERSION}_PBEsol_SR_standard_upf.aiida_pseudo", ] @@ -146,19 +149,19 @@ def test_pseudos_family_selector_widget(): w.override.value = True # test the default value - assert w.value == "SSSP/1.2/PBEsol/efficiency" + assert w.value == f"SSSP/{SSSP_VERSION}/PBEsol/efficiency" # Test if the protocol change the value will be updated w.protocol = "precise" - assert w.value == "SSSP/1.2/PBEsol/precision" + assert w.value == f"SSSP/{SSSP_VERSION}/PBEsol/precision" # test the functional change will update the value w.dft_functional.value = "PBE" - assert w.value == "SSSP/1.2/PBE/precision" + assert w.value == f"SSSP/{SSSP_VERSION}/PBE/precision" # Test if selecet new pseudo library the value will be updated w.library_selection.value = "PseudoDojo stringent" - assert w.value == "PseudoDojo/0.4/PBE/SR/stringent/upf" + assert w.value == f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/SR/stringent/upf" @pytest.mark.usefixtures("sssp") @@ -168,7 +171,9 @@ def test_pseudos_setter_widget(generate_structure_data, generate_upf_data): # test the widget is set with the elements of the structure silicon = generate_structure_data("silicon") - w = PseudoSetter(structure=silicon, pseudo_family="SSSP/1.2/PBEsol/efficiency") + w = PseudoSetter( + structure=silicon, pseudo_family=f"SSSP/{SSSP_VERSION}/PBEsol/efficiency" + ) assert "Si" in w.pseudos.keys() assert w.ecutwfc == 30 diff --git a/tests/test_result/test_summary_report.yml b/tests/test_result/test_summary_report.yml index 334d6ad33..da8360942 100644 --- a/tests/test_result/test_summary_report.yml +++ b/tests/test_result/test_summary_report.yml @@ -17,11 +17,11 @@ properties: - pdos - relax protocol: fast -pseudo_family: SSSP/1.2/PBEsol/efficiency +pseudo_family: SSSP/1.3/PBEsol/efficiency pseudo_library: SSSP pseudo_link: https://www.materialscloud.org/discover/sssp/table/efficiency pseudo_protocol: efficiency -pseudo_version: '1.2' +pseudo_version: '1.3' relax_method: positions_cell relaxed: positions_cell scf_kpoints_distance: 0.5 diff --git a/tests/test_submit_qe_workchain.py b/tests/test_submit_qe_workchain.py index 40a8560ad..9f71ffb4d 100644 --- a/tests/test_submit_qe_workchain.py +++ b/tests/test_submit_qe_workchain.py @@ -1,3 +1,7 @@ +import pytest + + +@pytest.mark.usefixtures("sssp") def test_create_builder_default( data_regression, submit_app_generator, @@ -19,6 +23,7 @@ def test_create_builder_default( data_regression.check(got) +@pytest.mark.usefixtures("sssp") def test_create_builder_insulator( submit_app_generator, ): @@ -41,6 +46,7 @@ def test_create_builder_insulator( assert "smearing" not in got["bands"]["scf"]["pw"]["parameters"]["SYSTEM"] +@pytest.mark.usefixtures("sssp") def test_create_builder_advanced_settings( submit_app_generator, ): From f753dc9412a4305182bcb0ec90c1a0029174d250 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Mon, 18 Dec 2023 15:05:09 +0100 Subject: [PATCH 010/166] Bump artifact action to v4 (#584) --- .github/actions/integration-tests/action.yml | 2 +- .github/actions/load-image/action.yml | 2 +- .github/workflows/docker-build-test-upload.yml | 4 ++-- .github/workflows/docker-merge-tags.yml | 6 +++--- .github/workflows/docker-push.yml | 2 +- .github/workflows/release.yml | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/actions/integration-tests/action.yml b/.github/actions/integration-tests/action.yml index 6fe7ed55b..ed3f92cc3 100644 --- a/.github/actions/integration-tests/action.yml +++ b/.github/actions/integration-tests/action.yml @@ -52,7 +52,7 @@ runs: - name: Upload screenshots as artifacts if : ${{ inputs.architecture == 'amd64' }} - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: Screenshots-CI-${{ inputs.architecture }} path: screenshots/ diff --git a/.github/actions/load-image/action.yml b/.github/actions/load-image/action.yml index bbdedb8a3..4bc7a99c6 100644 --- a/.github/actions/load-image/action.yml +++ b/.github/actions/load-image/action.yml @@ -16,7 +16,7 @@ runs: using: composite steps: - name: Download built image 📥 - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ inputs.image }}-${{ inputs.architecture }} path: /tmp/aiidalab/ diff --git a/.github/workflows/docker-build-test-upload.yml b/.github/workflows/docker-build-test-upload.yml index b6473b0f9..ba66842a3 100644 --- a/.github/workflows/docker-build-test-upload.yml +++ b/.github/workflows/docker-build-test-upload.yml @@ -27,7 +27,7 @@ jobs: steps: - name: Checkout Repo ⚡️ - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Create dev environment 📦 uses: ./.github/actions/create-dev-env with: @@ -69,7 +69,7 @@ jobs: if: always() - name: Upload image as artifact 💾 - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.image }}-${{ inputs.architecture }} path: /tmp/aiidalab/${{ inputs.image }}-${{ inputs.architecture }}.tar diff --git a/.github/workflows/docker-merge-tags.yml b/.github/workflows/docker-merge-tags.yml index d99569f97..b0d43fec6 100644 --- a/.github/workflows/docker-merge-tags.yml +++ b/.github/workflows/docker-merge-tags.yml @@ -25,19 +25,19 @@ jobs: steps: - name: Checkout Repo ⚡️ - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Create dev environment 📦 uses: ./.github/actions/create-dev-env with: architecture: amd64 - name: Download amd64 tags file 📥 - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ inputs.registry }}-${{ inputs.image }}-amd64-tags path: /tmp/aiidalab - name: Download arm64 tags file 📥 - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: name: ${{ inputs.registry }}-${{ inputs.image }}-arm64-tags path: /tmp/aiidalab diff --git a/.github/workflows/docker-push.yml b/.github/workflows/docker-push.yml index a30fac7e3..ddc9d63ee 100644 --- a/.github/workflows/docker-push.yml +++ b/.github/workflows/docker-push.yml @@ -86,7 +86,7 @@ jobs: shell: bash - name: Upload tags file 📤 - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: ${{ inputs.registry }}-${{ inputs.image }}-${{ inputs.architecture }}-tags path: /tmp/aiidalab/${{ inputs.image }}-${{ inputs.architecture }}-tags.txt diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 462cd85bb..0540530f5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,7 +35,7 @@ jobs: --outdir dist/ - name: Upload distribution artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: release path: dist/ @@ -46,7 +46,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/download-artifact@v2 + - uses: actions/download-artifact@v4 name: Download distribution artifact with: name: release From 6468bbc7044987484a4719aa0077df0a5d86d05f Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Mon, 18 Dec 2023 17:46:22 +0100 Subject: [PATCH 011/166] Bump version v23.10.0rc0 -> v23.10.0rc1 --- docs/source/conf.py | 2 +- setup.cfg | 4 ++-- src/aiidalab_qe/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 8c907a464..7b8a44e7d 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- -version = "v23.10.0rc0" +version = "v23.10.0rc1" release = f"{version}-dev" project = "Quantum ESPRESSO App" copyright_first_year = "2023" diff --git a/setup.cfg b/setup.cfg index d3484958e..e59bdf5f0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = aiidalab_qe -version = 23.10.0rc0 +version = 23.10.0rc1 description = Package for the AiiDAlab QE app long_description = file: README.md long_description_content_type = text/markdown @@ -71,7 +71,7 @@ ignore = E203 [bumpver] -current_version = "v23.10.0rc0" +current_version = "v23.10.0rc1" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = True diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index 201ae4c62..329d21e09 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -3,4 +3,4 @@ """This module contains project version information for both the app and the workflow.""" -__version__ = "v23.10.0rc0" +__version__ = "v23.10.0rc1" From 13d2eac1b5e79feeb655bf1c6ca6c83a919f0706 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Mon, 18 Dec 2023 18:34:49 +0100 Subject: [PATCH 012/166] Bump version v23.10.0rc1 -> v23.10.0 --- docs/source/conf.py | 2 +- setup.cfg | 4 ++-- src/aiidalab_qe/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 7b8a44e7d..de635b5a2 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- -version = "v23.10.0rc1" +version = "v23.10.0" release = f"{version}-dev" project = "Quantum ESPRESSO App" copyright_first_year = "2023" diff --git a/setup.cfg b/setup.cfg index e59bdf5f0..740912872 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = aiidalab_qe -version = 23.10.0rc1 +version = 23.10.0 description = Package for the AiiDAlab QE app long_description = file: README.md long_description_content_type = text/markdown @@ -71,7 +71,7 @@ ignore = E203 [bumpver] -current_version = "v23.10.0rc1" +current_version = "v23.10.0" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = True diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index 329d21e09..7b1060fcd 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -3,4 +3,4 @@ """This module contains project version information for both the app and the workflow.""" -__version__ = "v23.10.0rc1" +__version__ = "v23.10.0" From ceb0b9a4d1abde28c647d5cb6c9015f4af91d8fb Mon Sep 17 00:00:00 2001 From: Edan Bainglass <45081142+edan-bainglass@users.noreply.github.com> Date: Fri, 22 Dec 2023 11:13:26 +0100 Subject: [PATCH 013/166] Docs update on running docker container with docker desktop (#586) Update language Add a section describing how to spin up an aiidalab/qe container using Windows Docker Desktop --- .../access_aiidalab/container.rst | 69 +++++++++++++++---- 1 file changed, 54 insertions(+), 15 deletions(-) diff --git a/docs/source/installation/access_aiidalab/container.rst b/docs/source/installation/access_aiidalab/container.rst index 927bc06c7..af4a94855 100644 --- a/docs/source/installation/access_aiidalab/container.rst +++ b/docs/source/installation/access_aiidalab/container.rst @@ -1,21 +1,17 @@ -======================== -Local Container Instance -======================== +===================== +Local Docker Instance +===================== .. note:: - If you already have access to AiiDAlab but the Quantum ESPRESSO app is not installed, you need proceed to :doc:`install the app `. + If you used another method to access AiiDAlab, you may proceed to :doc:`install the app `. AiiDAlab is available as a Docker container - a self-contained, pre-configured environment including all the necessary software to access the AiiDAlab platform. -We also provide container that includes the Quantum ESPRESSO app installed and ready to use. -To run the container, you first need to install Docker on your local machine. -If you have yet to do so, you may click `here `_ to follow the official Docker installation guide. - -We recommended to install the `Docker Desktop `_ which is available for all major operating systems. +Conveniently, we provide a blueprint (image) for such a container with the Quantum ESPRESSO app pre-installed and ready for use. To run the container, you first need to `install Docker `_ on your local machine. .. important:: - On Linux, if the docker is installed by `docker engine `_, you need `root` privileges to perform the `post-installation steps for Docker Engine `_. There is **NO NEED** to perform this step if the docker is installed by `docker desktop `_. + The Docker installation link above walks you through installing Docker Desktop - a convenient graphical user interface to Docker. However, if you have chosen instead to install the `docker engine `_ directly for use via a terminal, if **(and only if)** you are on a Linux system, you will need `root` privileges to perform the `post-installation steps for Docker Engine `_. Once Docker is installed, you can launch the container in one of several ways depending on your operating system. This is discussed in the following sections. @@ -23,18 +19,61 @@ This is discussed in the following sections. Docker Desktop ************** -If you use Windows, this may be the easiest way to launch the container. -For MacOS and Linux, you can also use Docker Desktop, but you may prefer to use the command line interface (CLI), see the next sections. +If you use Windows, you may choose to use the Docker Desktop interface to launch the container. +Once Docker Desktop is installed (see above link), follow these instructions to spin up an AiiDAlab container. + +#. Open the Docker Desktop app +#. On the left sidebar, click on *Images* +#. In the search bar at the top of the app, type ``aiidalab/qe`` +#. Select ``latest`` from the *tag* dropdown menu +#. Click *Pull* to download the image + + * Once downloaded, the image will appear as a new line in the list of images + * Exit the search menu when done + +#. At the far right column of the new image line, under actions, click ▶️ to start a container instance +#. In the pop-up window, expand *optional settings* +#. You may choose to name the container for easy reference (randomly generated otherwise) +#. Choose a local port from which to communicate with the container's 8888 port +#. Set up the following local volumes: **see notes below** + + * ``\aiidalab_qe_home`` --> ``/home/jovyan`` + * ``\aiidalab_qe_conda`` --> ``/home/jovyan/.conda`` + + .. note:: + + ``local-docker-volumes-dir`` can be any local directory in which to store Docker volumes, for example ``C:\Users\\Docker\`` + +#. Click *Run* to start the container +#. On the left sidebar, click on *Containers* +#. Click on the name of your newly-created container +#. Wait for the container build process to finish + + * The log will show a line ``To access the notebook, open this file in a browser:`` + +#. Click on the ``:8888`` link at the top of the app to open AiiDAlab in the browser +#. Copy and paste the container's token to the browser and submit to open AiiDAlab + + * The token can be found at the bottom of the log in a line similar to ``...?token=`` + + .. note:: + + Subsequent connections to the port in the browser will not prompt for a token for some time. If and when it does, you may again retrieve the token from the log. + +.. important:: + + To avoid losing your work when the container shuts down (manually, or when the machine is turned off), it is important to associate the container with a volume - a local directory - with which the container data's is mirrored. When set up, the container will restart from this mirrored volume. -Comming soon with video tutorial. +Note that Docker Desktop is also available for MacOS and Linux. +However, you may prefer to use the command line interface (CLI). +If so, proceed to the following sections for instructions. AiiDAlab launch *************** .. important:: - The following steps require a local installation of Docker. - You can check the docker is properly installed by running ``docker run hello-world`` in the terminal. + The following steps require a local installation of Docker. You can verify your Docker installation by running ``docker run hello-world`` in the terminal. `AiiDAlab launch`_ is a thin Docker wrapper which takes care of all the prerequisites to run the AiiDAlab Docker image. It helps to manage multiple AiiDAlab profiles, each with its own home directory for persistent storage, and allows to easily switch between them. From 2ea253e618f9a23f4a4bb7ac52ffe5581c639abc Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Fri, 22 Dec 2023 15:16:53 +0100 Subject: [PATCH 014/166] Add links and instructions on running with Quantum Mobile images (#588) Link and instructions of how to install and use QEapp Quantum Mobile image for: - M1/M2 apple silicon - x86_64 --- .../installation/access_aiidalab/vm.rst | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/docs/source/installation/access_aiidalab/vm.rst b/docs/source/installation/access_aiidalab/vm.rst index a3a543b38..c79217185 100644 --- a/docs/source/installation/access_aiidalab/vm.rst +++ b/docs/source/installation/access_aiidalab/vm.rst @@ -6,7 +6,52 @@ Virtual Machine Image If you used another method to access AiiDAlab, you may proceed to :doc:`install the app `. -The AiiDAlab virtual image based on `Quantum Mobile `_ is available for the following architectures: +The AiiDAlab Quantum ESPRESSO virtual image based on `Quantum Mobile `_ image and is available for the following architectures: -#. M1/AMD64 - link coming soon -#. All other - link coming soon ++ Intel x86_64 ++ Mac computer with Apple Silicon + +See the following sections for instructions on how to download and run the virtual machine image on your computer. + +Intel x86_64 +------------ + +Get AiiDAlab Quantum ESPRESSO virtual machine running on your computer in three simple steps: + +#. Download the virtual machine image (4.09 GB) + + + URL: https://bit.ly/48qUay9 (Google drive: https://bit.ly/3Nyf4Dt) + + Filename: `quantum_mobile_23.10.0-qeapp.ova` + + MD5 hash: `5c80d9ab2458f2edac30e97dc2fe36e7` + +#. Install Virtual Box 6.1.6 or later (see https://www.virtualbox.org) +#. Import the virtual machine image into Virtualbox (11.2 GB) File => **Import Appliance** + +Login credentials: + ++ username: `max` ++ password: `moritz` + +The default configuration of 4 cores and 4096 MB RAM can be adjusted in the VM settings. + +Mac computer with Apple Silicon +------------------------------- + +If you have an Apple silicon Mac computer with M1/M2 chips, you can use `UTM `_ to run the AiiDAlab Quantum ESPRESSO virtual machine. The steps are as follows: + +#. Download the compressed virtual machine image (5.9 GB) + + + URL: https://bit.ly/477mMeR (Google Drive: https://bit.ly/486rKtP) + + Filename: `quantum_mobile_23.10.0-qeapp.utm.zip` + + MD5 hash: `44ea9189d788737459c31bf330366926` + +#. Decompress the zip file. +#. Install UTM (see https://mac.getutm.app/) +#. Import the image into UTM by clicking on the **Create a New Virtual Machine** button and selecting the `quantum_mobile_23.10.0-qeapp.utm` file. + +Login credentials: + ++ username: `max` ++ password: `moritz` + +The default configuration of 4 cores and 4096 MB RAM can be adjusted in the VM settings. From 65e908e21da0bd7ccd22a95e45338bd6eb09d255 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 11:36:50 +0100 Subject: [PATCH 015/166] [pre-commit.ci] pre-commit autoupdate (#589) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [pre-commit.ci] pre-commit autoupdate updates: - [github.com/pre-commit/pre-commit-hooks: v4.4.0 → v4.5.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.4.0...v4.5.0) - [github.com/psf/black: 23.9.1 → 23.12.1](https://github.com/psf/black/compare/23.9.1...23.12.1) - [github.com/pycqa/isort: 5.12.0 → 5.13.2](https://github.com/pycqa/isort/compare/5.12.0...5.13.2) - [github.com/sirosen/check-jsonschema: 0.27.0 → 0.27.3](https://github.com/sirosen/check-jsonschema/compare/0.27.0...0.27.3) - [github.com/nbQA-dev/nbQA: 1.7.0 → 1.7.1](https://github.com/nbQA-dev/nbQA/compare/1.7.0...1.7.1) * Bump pre-commit to ~=3.2 * Remove pre-commit CI since already use pre-commit.ci hook * Update .github/workflows/ci.yml Co-authored-by: Daniel Hollas --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Jusong Yu Co-authored-by: Daniel Hollas --- .github/workflows/ci.yml | 27 --------------------------- .pre-commit-config.yaml | 10 +++++----- setup.cfg | 2 +- 3 files changed, 6 insertions(+), 33 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8ae8cae18..ad7c72840 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,35 +13,8 @@ concurrency: jobs: - pre-commit: - # Adapted from: https://github.com/CasperWA/voila-optimade-client - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.10' - cache: pip - cache-dependency-path: | - .pre-commit-config.yaml - **/setup.cfg - **/pyproject.toml - **/requirements*.txt - - - name: Install dependencies - run: python -m pip install pre-commit~=2.20 - - - name: Run pre-commit - run: pre-commit run --all-files || ( git status --short ; git diff ; exit 1 ) - - test-package: - needs: [pre-commit] strategy: matrix: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5c82e17d9..5cc7a45a2 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ ci: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: check-json - id: check-yaml @@ -20,7 +20,7 @@ repos: exclude: tests - repo: https://github.com/psf/black - rev: 23.9.1 + rev: 23.12.1 hooks: - id: black language_version: python3 # Should be a command that runs python3.6+ @@ -34,13 +34,13 @@ repos: - flake8-bugbear==22.7.1 - repo: https://github.com/pycqa/isort - rev: 5.12.0 + rev: 5.13.2 hooks: - id: isort args: [--profile, black, --filter-files] - repo: https://github.com/sirosen/check-jsonschema - rev: 0.27.0 + rev: 0.27.3 hooks: - id: check-github-workflows @@ -50,7 +50,7 @@ repos: - id: nbstripout - repo: https://github.com/nbQA-dev/nbQA - rev: 1.7.0 + rev: 1.7.1 hooks: - id: nbqa-pyupgrade args: [--py38-plus] diff --git a/setup.cfg b/setup.cfg index 740912872..dba974948 100644 --- a/setup.cfg +++ b/setup.cfg @@ -41,7 +41,7 @@ where = src [options.extras_require] dev = bumpver~=2023.1124 - pre-commit~=2.20 + pre-commit~=3.2 pytest~=6.2 pytest-regressions~=2.2 pgtest==1.3.1 From 5f40802aa89215cb06e9d2181a45b80f3c1b5d82 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Tue, 16 Jan 2024 16:46:52 +0100 Subject: [PATCH 016/166] Bump aiida-quantumespresso to 4.4.0 and unpinning pydantic (#591) The pydantic is pinned in https://github.com/aiidalab/aiidalab-qe/pull/416, after the release of `aiida-quantumespresso` it is not needed, this PR bump the aiida-quantumespresso and unpin the pydantic. --- setup.cfg | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index dba974948..bd7bf7f1a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,13 +26,12 @@ packages = find: install_requires = aiida-core~=2.2,<3 Jinja2~=3.0 - aiida-quantumespresso~=4.3.0 + aiida-quantumespresso~=4.4.0 aiidalab-widgets-base==2.1.0rc0 aiida-pseudo~=1.4 filelock~=3.8 importlib-resources~=5.2 widget-bandsplot~=0.5.1 - pydantic~=1.10,>=1.10.8 python_requires = >=3.8 [options.packages.find] From 622a922803ea8391cc6497008683391fcd9eaa9e Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Fri, 19 Jan 2024 11:07:42 +0100 Subject: [PATCH 017/166] Use ruff as code formatter (#593) --- .pre-commit-config.yaml | 42 +++++++++------------- qe.ipynb | 31 +++++++++------- setup.cfg | 6 ---- src/aiidalab_qe/app/structure/__init__.py | 2 +- src/aiidalab_qe/common/node_view.py | 4 +-- src/aiidalab_qe/common/setup_pseudos.py | 5 +-- src/aiidalab_qe/plugins/bands/workchain.py | 4 +-- 7 files changed, 42 insertions(+), 52 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5cc7a45a2..70b59b910 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,36 +19,11 @@ repos: - id: yamlfmt exclude: tests - - repo: https://github.com/psf/black - rev: 23.12.1 - hooks: - - id: black - language_version: python3 # Should be a command that runs python3.6+ - - - repo: https://github.com/PyCQA/flake8 - rev: 6.1.0 - hooks: - - id: flake8 - args: [--count, --show-source, --statistics] - additional_dependencies: - - flake8-bugbear==22.7.1 - - - repo: https://github.com/pycqa/isort - rev: 5.13.2 - hooks: - - id: isort - args: [--profile, black, --filter-files] - - repo: https://github.com/sirosen/check-jsonschema rev: 0.27.3 hooks: - id: check-github-workflows - - repo: https://github.com/kynan/nbstripout - rev: 0.6.1 - hooks: - - id: nbstripout - - repo: https://github.com/nbQA-dev/nbQA rev: 1.7.1 hooks: @@ -56,4 +31,19 @@ repos: args: [--py38-plus] - id: nbqa-isort args: [--profile=black] - - id: nbqa-black + - id: nbqa-ruff + + - repo: https://github.com/kynan/nbstripout + rev: 0.6.1 + hooks: + - id: nbstripout + + - repo: https://github.com/astral-sh/ruff-pre-commit + # Ruff version. + rev: v0.1.11 + hooks: + # Run the linter. + - id: ruff + args: [--fix] + # Run the formatter. + - id: ruff-format diff --git a/qe.ipynb b/qe.ipynb index 089f19f62..dbb706798 100644 --- a/qe.ipynb +++ b/qe.ipynb @@ -25,9 +25,27 @@ "\n", " sys.modules[\"pybel\"] = __import__(\"openbabel\", globals(), locals(), [\"pybel\"]).pybel\n", "except Exception:\n", - " pass" + " pass\n", + "\n", + "import ipywidgets as ipw\n", + "from aiidalab_widgets_base.bug_report import (\n", + " install_create_github_issue_exception_handler,\n", + ")\n", + "from importlib_resources import files\n", + "from IPython.display import display\n", + "from jinja2 import Environment\n", + "\n", + "from aiidalab_qe.app import App, static\n", + "from aiidalab_qe.version import __version__" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, @@ -45,17 +63,6 @@ "metadata": {}, "outputs": [], "source": [ - "import ipywidgets as ipw\n", - "from aiidalab_widgets_base.bug_report import (\n", - " install_create_github_issue_exception_handler,\n", - ")\n", - "from importlib_resources import files\n", - "from IPython.display import display\n", - "from jinja2 import Environment\n", - "\n", - "from aiidalab_qe.app import App, static\n", - "from aiidalab_qe.version import __version__\n", - "\n", "env = Environment()\n", "\n", "template = files(static).joinpath(\"welcome.jinja\").read_text()\n", diff --git a/setup.cfg b/setup.cfg index bd7bf7f1a..ee7175886 100644 --- a/setup.cfg +++ b/setup.cfg @@ -63,12 +63,6 @@ description = Perform Quantum ESPRESSO calculations categories = quantum -[flake8] -ignore = - E501 - W503 - E203 - [bumpver] current_version = "v23.10.0" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" diff --git a/src/aiidalab_qe/app/structure/__init__.py b/src/aiidalab_qe/app/structure/__init__.py index a1b915454..28c25ba56 100644 --- a/src/aiidalab_qe/app/structure/__init__.py +++ b/src/aiidalab_qe/app/structure/__init__.py @@ -115,7 +115,7 @@ def __init__(self, description=None, **kwargs): self.message_area, self.confirm_button, ], - **kwargs + **kwargs, ) @traitlets.default("state") diff --git a/src/aiidalab_qe/common/node_view.py b/src/aiidalab_qe/common/node_view.py index 8e7fcdd2f..764652ef9 100644 --- a/src/aiidalab_qe/common/node_view.py +++ b/src/aiidalab_qe/common/node_view.py @@ -74,9 +74,7 @@ def _update_displayed_structure(self, change): def _update_structure_viewer(self, change): """Update the view if displayed_structure trait was modified.""" with self.hold_trait_notifications(): - for ( - comp_id - ) in self._viewer._ngl_component_ids: # pylint: disable=protected-access + for comp_id in self._viewer._ngl_component_ids: # pylint: disable=protected-access self._viewer.remove_component(comp_id) self.selection = list() if change["new"] is not None: diff --git a/src/aiidalab_qe/common/setup_pseudos.py b/src/aiidalab_qe/common/setup_pseudos.py index 1257a905b..2ade10d69 100644 --- a/src/aiidalab_qe/common/setup_pseudos.py +++ b/src/aiidalab_qe/common/setup_pseudos.py @@ -213,8 +213,9 @@ def install( except Timeout: # Assume that the installation was triggered by a different process. - yield "Installation was already started elsewhere, waiting for it to finish...", ProgressBar.AnimationRate( - 1.0 + yield ( + "Installation was already started elsewhere, waiting for it to finish...", + ProgressBar.AnimationRate(1.0), ) with FileLock(FN_LOCKFILE, timeout=120): if len(pseudos_to_install()) > 0: diff --git a/src/aiidalab_qe/plugins/bands/workchain.py b/src/aiidalab_qe/plugins/bands/workchain.py index 2a8f9f6e8..8a0ace12f 100644 --- a/src/aiidalab_qe/plugins/bands/workchain.py +++ b/src/aiidalab_qe/plugins/bands/workchain.py @@ -102,8 +102,8 @@ def generate_kpath_2d(structure, kpoints_distance, kpath_2d): a2 = reciprocal_cell[1] norm_a1 = np.linalg.norm(a1) norm_a2 = np.linalg.norm(a2) - cos_gamma = a1.dot(a2) / ( - norm_a1 * norm_a2 + cos_gamma = ( + a1.dot(a2) / (norm_a1 * norm_a2) ) # Angle between a1 and a2 # like in https://pubs.acs.org/doi/10.1021/acs.jpclett.2c02972 gamma = np.arccos(cos_gamma) eta = (1 - (norm_a1 / norm_a2) * cos_gamma) / (2 * np.power(np.sin(gamma), 2)) From 345901abf20c921effe419c680dfe582ca1dec8a Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Tue, 23 Jan 2024 01:24:51 +0100 Subject: [PATCH 018/166] aiidalab-widgets-base bump to use final release 2.1.0 (#597) --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index ee7175886..4c028cd3f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -27,7 +27,7 @@ install_requires = aiida-core~=2.2,<3 Jinja2~=3.0 aiida-quantumespresso~=4.4.0 - aiidalab-widgets-base==2.1.0rc0 + aiidalab-widgets-base~=2.1 aiida-pseudo~=1.4 filelock~=3.8 importlib-resources~=5.2 From d70ad697e468f5f7d2ed62869963a7a51daa818c Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Tue, 23 Jan 2024 01:48:42 +0100 Subject: [PATCH 019/166] Bump version v23.10.0 -> v23.10.1 --- docs/source/conf.py | 2 +- setup.cfg | 4 ++-- src/aiidalab_qe/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index de635b5a2..559cb56d5 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- -version = "v23.10.0" +version = "v23.10.1" release = f"{version}-dev" project = "Quantum ESPRESSO App" copyright_first_year = "2023" diff --git a/setup.cfg b/setup.cfg index 4c028cd3f..48c5e55bc 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = aiidalab_qe -version = 23.10.0 +version = 23.10.1 description = Package for the AiiDAlab QE app long_description = file: README.md long_description_content_type = text/markdown @@ -64,7 +64,7 @@ categories = quantum [bumpver] -current_version = "v23.10.0" +current_version = "v23.10.1" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = True diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index 7b1060fcd..d1f843a65 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -3,4 +3,4 @@ """This module contains project version information for both the app and the workflow.""" -__version__ = "v23.10.0" +__version__ = "v23.10.1" From c9d010a0d222a054515ddbfed86af0f88e41b4e1 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Wed, 24 Jan 2024 20:11:08 +0100 Subject: [PATCH 020/166] Remove the load_profile warning by move it to front (#599) The problem is introduced by #593, where I move the load_profile to after the import of AWB. --- .pre-commit-config.yaml | 2 ++ qe.ipynb | 29 +++++++++++------------------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 70b59b910..111c1ea3d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,6 +32,8 @@ repos: - id: nbqa-isort args: [--profile=black] - id: nbqa-ruff + # suppress E402 + args: [--ignore=E402] - repo: https://github.com/kynan/nbstripout rev: 0.6.1 diff --git a/qe.ipynb b/qe.ipynb index dbb706798..12c25b9eb 100644 --- a/qe.ipynb +++ b/qe.ipynb @@ -13,6 +13,17 @@ "document.title='AiiDAlab QE app'" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aiida import load_profile\n", + "\n", + "load_profile(); # noqa: E402" + ] + }, { "cell_type": "code", "execution_count": null, @@ -39,24 +50,6 @@ "from aiidalab_qe.version import __version__" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from aiida import load_profile\n", - "\n", - "load_profile();" - ] - }, { "cell_type": "code", "execution_count": null, From 1818b17e8893941125e103bfa684a8c90daaa6e1 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Wed, 24 Jan 2024 21:43:09 +0100 Subject: [PATCH 021/166] removing force_parity from create_kpoints_from_distance (#598) Use the same default value as of the aiida-quantumespresso plugin, therefore displaying the final kpoint mesh as in the calculation. --- src/aiidalab_qe/app/configuration/advanced.py | 2 +- src/aiidalab_qe/plugins/pdos/setting.py | 2 +- tests/configuration/test_advanced.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/aiidalab_qe/app/configuration/advanced.py b/src/aiidalab_qe/app/configuration/advanced.py index 18950fcd6..df75c76d9 100644 --- a/src/aiidalab_qe/app/configuration/advanced.py +++ b/src/aiidalab_qe/app/configuration/advanced.py @@ -328,7 +328,7 @@ def _display_mesh(self, _=None): mesh = create_kpoints_from_distance.process_class._func( self.input_structure, orm.Float(self.kpoints_distance.value), - orm.Bool(True), + orm.Bool(False), ) self.mesh_grid.value = "Mesh " + str(mesh.get_kpoints_mesh()[0]) else: diff --git a/src/aiidalab_qe/plugins/pdos/setting.py b/src/aiidalab_qe/plugins/pdos/setting.py index 180a5c032..1edcd00cc 100644 --- a/src/aiidalab_qe/plugins/pdos/setting.py +++ b/src/aiidalab_qe/plugins/pdos/setting.py @@ -57,7 +57,7 @@ def _display_mesh(self, _=None): mesh = create_kpoints_from_distance.process_class._func( self.input_structure, orm.Float(self.nscf_kpoints_distance.value), - orm.Bool(True), + orm.Bool(False), ) self.mesh_grid.value = "Mesh " + str(mesh.get_kpoints_mesh()[0]) diff --git a/tests/configuration/test_advanced.py b/tests/configuration/test_advanced.py index a860fe618..3f70a53cf 100644 --- a/tests/configuration/test_advanced.py +++ b/tests/configuration/test_advanced.py @@ -150,4 +150,4 @@ def test_advanced_kpoints_mesh(): # change protocol w.protocol = "fast" - assert w.mesh_grid.value == "Mesh [6, 6, 6]" + assert w.mesh_grid.value == "Mesh [5, 5, 5]" From 1bbba4d70074cbe2f0c7c437560739be6b674db5 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Thu, 25 Jan 2024 10:11:43 +0100 Subject: [PATCH 022/166] Bump version v23.10.1 -> v24.04.0a0 --- docs/source/conf.py | 2 +- setup.cfg | 4 ++-- src/aiidalab_qe/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 559cb56d5..161b54646 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- -version = "v23.10.1" +version = "v24.04.0a0" release = f"{version}-dev" project = "Quantum ESPRESSO App" copyright_first_year = "2023" diff --git a/setup.cfg b/setup.cfg index 48c5e55bc..c16c2cf8f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = aiidalab_qe -version = 23.10.1 +version = 24.4.0a0 description = Package for the AiiDAlab QE app long_description = file: README.md long_description_content_type = text/markdown @@ -64,7 +64,7 @@ categories = quantum [bumpver] -current_version = "v23.10.1" +current_version = "v24.04.0a0" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = True diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index d1f843a65..90a86e6a7 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -3,4 +3,4 @@ """This module contains project version information for both the app and the workflow.""" -__version__ = "v23.10.1" +__version__ = "v24.04.0a0" From 8ad9d9c1fe1ddebb55c45a622b5df0b2a698703f Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Fri, 26 Jan 2024 15:49:51 +0100 Subject: [PATCH 023/166] Update acknowledgement for big-map (#608) * Add acknowledgements to big-map and eu, in readme and docs. * move logos to docs/_static folder --- README.md | 24 ++++++++++-------- docs/source/_static/logos/EU_flag.png | Bin 0 -> 198558 bytes .../source/_static}/logos/MARVEL.png | Bin .../source/_static}/logos/MaX.png | Bin .../source/_static}/logos/MarketPlace.png | Bin .../source/_static}/logos/QE.jpg | Bin docs/source/_static/logos/bigmap_logo.png | Bin 0 -> 5851 bytes docs/source/index.rst | 19 ++++++++++++++ 8 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 docs/source/_static/logos/EU_flag.png rename {miscellaneous => docs/source/_static}/logos/MARVEL.png (100%) rename {miscellaneous => docs/source/_static}/logos/MaX.png (100%) rename {miscellaneous => docs/source/_static}/logos/MarketPlace.png (100%) rename {miscellaneous => docs/source/_static}/logos/QE.jpg (100%) create mode 100644 docs/source/_static/logos/bigmap_logo.png diff --git a/README.md b/README.md index b3a587998..0d5ff20b6 100644 --- a/README.md +++ b/README.md @@ -58,14 +58,18 @@ Additional notes: - For making "outdate" release since we fix minor version to `2x.04.xx` and `2x.10.xx`, use e.g. `bumpver update --set-version v23.10.0rc4 --ignore-vcs-tag` to make the release. ## Acknowledgements - -This project has received funding from the European Union’s [Horizon 2020 research and innovation programme](https://ec.europa.eu/programmes/horizon2020/en) under grant agreement [No 957189](https://cordis.europa.eu/project/id/957189). The project is part of BATTERY 2030+, the large-scale European research initiative for inventing the sustainable batteries of the future. -Also supported by the [MARVEL National Centre for Competency in Research]() funded by the [Swiss National Science Foundation](), -the MARKETPLACE project funded by [Horizon 2020](https://ec.europa.eu/programmes/horizon2020/) under the H2020-NMBP-25-2017 call (Grant No. 760173), -as well as by the [MaX European Centre of Excellence]() funded by the Horizon 2020 EINFRA-5 program, Grant No. 676598. - -
- MARVEL - MaX - MarketPlace +We acknowledge support from: +* the European Union\'s Horizon 2020 research and innovation programme (Grant No. 957189, [project BIG-MAP](https://www.big-map.eu)) +* the [MARVEL National Centre for Competency in Research]() funded by the [Swiss National Science Foundation]() +* the MARKETPLACE project funded by [Horizon 2020](https://ec.europa.eu/programmes/horizon2020/) under the H2020-NMBP-25-2017 call (Grant No. 760173), +* the [MaX European Centre of Excellence]() funded by the Horizon 2020 EINFRA-5 program, Grant No. 676598. + +
+ MARVEL + MaX + MarketPlace +
+
+ BIG-MAP + EU
diff --git a/docs/source/_static/logos/EU_flag.png b/docs/source/_static/logos/EU_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..b18a700b189edf94d98d802e6278c82f1249f35e GIT binary patch literal 198558 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 z zp;+3TfeqPx{;v!5aut;@V3C9BMKObCEe5I}KUcKfen)ZDP&2d(4~~Z>{z__n^-TV6 zgb9}nQ{-SL;PlF)I=${&^rn)>puR7JVH8`xA|5S;xDXQ7>T8D0KB zAgsRpF~C~}yH-ofD9fc-;}$+xaj_jXrmxK(+_frsY5~uDEuS;8OC5Y2TB_4xhR5MY zd#B4(=6H&g6qNc~8b!8d;}Dw1>_5!6GatwE<-5IyJHqGfN$|F|6TDj{Gtfl%M*b~* zmNC?P8y5#(S<89Eo=TU_%zFPs-^Xnle_yz+(+RbFDe1JT=Ow=%UHwO z<$@&i<<94lADO2%kkhK&X#*06Z_4Uxjgo8A16jsC#o@q7;AUnlPEpBp(&G^}K>j{@ zGiLe+ie>?73(tkJ6v@6xu)5VlA*hxvb`j@+d>%@x-cT|Mhy-7BIm z;^C&Ql7Xn)!B7{n9rY{uWemr=uHcXgNpA-f zzs5j~nS$2v*?Z~TEbRxLXTX=YK&ag$GxL~l=U(fV@hbP#8wiJh)e7zHI2FIfHewHh za5g$M4X^st3(52@JHL=Wr21OoXE0)syXAS`b)6(*eb*{A%Qno33Sc;qHjCOS6+F~Z zrs8xo=`b0k1dVG`g8DgD!dRR}v(=4JYr)U1R}aBsHt8r6lSC>;uRbe20`^&}-y-M4fLc%EF)Xr#vg_+<8)+1y9f}xb1?Xf}9BW;x*np z1~mbik2~{1T>VDEN^S)9U*R=^8e{D!9SxPtV7`2}(2 zQ|f!AbUv|P7BDwDD1y1flp?JZY^){>t$bzh_!=X8z9)5oLWCps)_%S6B0eHVoV zjI=ZYuYuG@GDm?q>^BsBJ9vM%B%%6Ae%Y@}n?5I4G4(b#UE~(4I6vIu;+C2Qe6H>t zr23VFT1k-ur=upCP0&UTLruJmce5G9V3U}c^e9}E$$d0oc{bIbvU?)J%bB{fPG|b0 zBy10D`B|^34Q@%AY9?dI#?)G`>ZgkbUMnfLX z$_GS2k1hR0g}%8-?n;leHC~n)c&{3ODLgxS&vy7=iC061_*XGPJ!2GO6w51&wyZm} zED7?Pj`)d8ud?#HdDizYxD>gH>K(GkgrWQT%>I(}E_y+5rNt3*yrTVYCTc?;{p#6# z=^%}kKzxuO-a{gZY1Q*YGMT&DC{K?N)-HO*Oi$*KdqE7gROhYu>16%7m9Xi+1N{wW zKIJes^siOlu*1HMR&}dTx)-NeUU0xpvd*;6?9y(@u+CZuihQ96M?h)7 zOTq9>JcU9gwt(=>TW+Yn>a`i9(X8apFt`9bo@yKE_Htr_3Vi*X1_t{|z2GhCFi%xo z04AjsdE>gXf@DQmDRM{M0;y<6oHh;LLWLxM$n3sYxNkhLgj`eYS)wY2neaBpP)?vB z!+fYBygdiL!&sZ~DkN{@oTpFWcE9Mx>>@B-hFLZS2keV{E{|a$|T-eUV=}-{tOFso0dQ-9BW#eHgGR;UJOD)EXMlId504|0r59` z`4f1&H7%VZ4Rc;R(&bwVK0Qf|ZUuUMI6038GGa8<-rOfx-2xL(@GI>Lj;rMRWN*$n#(x8c5Tar-X^I`8os&v1$KXEQ(A$ zVDax8=&bK>IY)H>a>pLI<0JSF0Ae~DvbfWFqhE91WEtOjF3dlac2VQ?Ebpq+8U{HJ zxBJPUjcVFI3<7oyFJ1~f)BV!%A= zk!?8*KkWTBJ5rMdlWsjbX|L!t-2*zh?l#?=)_Ly$(lI_5r=kHveRmp~y^)040$Z2G zLEkZi-o(ID^*<B-k7Sz9-g=*FO9NZ031o z_mX={J=Mq@<8P{tBK)e5uRF&t#1iDKZ@4R4#kbXX)~S}rt?~}7*UaU6UgrjPi2|n7nokcHwgvvbJywp+Xq7aaxZ?YjKklz7;ytrq`D3 z8jX-&yVcMBV(WwwDuDCvogAU|9(KT+pl5-f3*0X#4ak@DV9-n!mQPc;VCJamM24Eg zWNOLp6F4dhE;(AfV8rwr(byLNe&Bv~Ju2_B?_>M5A;qp0<7xdP5i;Ph`9u#}b@pR6 zCArS>A$a%0ogS~ZZRh}X8zp=}s1dlQf32!2BRpCZ6b`=_It9)}VkyU}L?_Ly?C26o zMhJMPlr95z^9&!S{6`tvp8ak|c?^l83g=mT#bVBG6>!MDHYxP4R~iqtZt*vCD1k=S z#h?9tZkmHRix*wOuaf)x^}D~rRWoo zA04`4N?Ev0{kgC=U^Goh?5tJ$=NKfgkjdo}46ig&2`T1w? zh?5iKO$3)kn%5hYr!*RCMX0X)hy*Nf$vo8xV#-2Ni%>jJN6@KwrTqGV?QEw0eFzqa zNX7ymSIV7j0h)nQq>P6m5S-11bBzW|@R*YC(I&T2mhhFB!`I(qkAv-Ggz2ibJ;d?D zsv=fo&vSD0B9WlHH^W%V%JSH?J|raNK`i`jDH~ zr7CGU^z4f=x&xWsg0!rl?aoJns50y?-Dr3*0}3F-zWzg$H_lW=u#64FXL}X-(Xe!$Lr9j=9OSCE8u1NbMNz^ z=#^EYXKy}upw<&mcJPHw*z1+8z=3qxesNo%$2%V~#rLz{ZY;Z&@;i#e0+cxNsZRmC zo9*U09n;Y%RC(A0!dP5RCH5?T6nBTp^cV4XOJY9Q2hF1+W)$5oli|0t;R-%SrZwBz zzH`eN2Ln}EpRs_Jjns%rQF9V7Y@)jk42AUAf?7S_$b)32D@)3v ze9s%vwO@{o*(%HiPNGQ9gX!cp;zs+9rGF*`bf}##GsGX_Xq|yaBNe`va1O!ru$(p` z1MsGqP?&i>`1h3k9#v;o;5PDVYDHAzxgEDcXbjeLK$g1e(Dc$`&qqN6kB2uj#wm6ax<r1rl2f4rgv;{QTA2-y8sM2 zmh|}k8y`EiuBDZ}3OMQAm6$B=i+cg$1KqqL!sE1zEuFJ&>7$_ojQd)z0!v>Vk_O?T|Zh2LnJ z6se#3I}C~%Xw6O|YIzA=4>l8UiwblfzB(X&v=W4)n3n*1zmNd0vWwdtr+q0rzZ+2j zl(AKjane+LveoJ@*nkSp%*Uryw@4HqZdCI*? zo1kVScOvCx2F}=p-HjYve*5R!;5GMV$ahLO6!YG}j$F+I8hC)B=%as$;0Jo%S*PMu zq-&^KI{he#*4cf`h0-+)Q7c@tGO4;R*mkP=KD6p$q@uld7fsr=V_yQvFKhL4e>@gX za2uotc~t+a7(Vn+GIYw+^f1GQC?QOISV$6eduWM$@-4xy^LJ(I$Wy4Sz0En4l1_b=*z@C*H) zTRC9X*AGQIs5cfWK*@=~)q^|Dw>7^59^(m9IFK4ytg>6RcVoKz^le-r|bK2c3KCe>XWlq?__qt0Z2i4+TjW}j@S0fiV2 zwi9h8$G*~M?B052d-^wPG@s~WX%cU$!Q?GfEs3$+6c?@d7TB1nM-~dqK>3AruitMf zNq#7l+%Hu8`(l)!zlpj+6{rw{#-Mk)EsIMx!aH6;dl?2;_@Et-7Ne%OXcc*-Lr#6h z7}r(9Ng5qyZX$YT$+lYY`)GF{?+714nOWGJc5L^pW0x3d32v>ws0V(1=9K7A%bM4< z%a^bkfAztENGYU&)(%dS)_g@#Z{2~S(r%Xh?J$N?L+_Dew`jb<(Yl~doNI#mbRf6l zEgDhDTfSOnUlIj@o*K_qlpg%tn59_ z`g1#|L{zfMw$p;q(jNrf(q>E9MRP-WeiJgrp#vb|Uh77w9L=X6{GAtxDXB%AcB6&F zRVXF5fZIV(&jsqgL%VINV7<4?aBTP|3FHgP3c@MbQUW``Of3+3)j zZGHP#8)-lSy2OzQ$Jam1L}dp9=|g8>MB6A*kK4Vqjd}^JecNjqsxjE3Eg`RbkEWFe zlPBmQxludfExCH227CK2%A^EOlT{9Jp>6o%)7lj$cVsPSSq|zjU@Qs^iPGpFyL;xC z5uqsf6X~@w9c{iS-}3F>YfzBq-lX|+lK7D2U9rDaa0rxa;i#(Yi`lz6|FgtGHIGT; zaK$d913(ceG6sR-9*f5G+9h(TwoTG`gAmIJZ@QRI1?6Lh^5Y(_SRk#%A(n&%TqBtUy4sjf^#KjWofi z4C%*y4$x)A;1GIrPX9qf17pwHFD2iQ$$aT}&K{7xJl`Rj7L~!~Na#_caNEDTEn~Ku zF*GCAdg#LEExjLvv|KL@?BSMm)C;4*&984I8eS0alG>S-G<^cR*pgL|j(DN!iFWik z=tWz=MK~8)0+B=!bGXMfM5Gqb%?|b0eQu@qbS!`3xV`qm%P2dC83W;7yOV5^BLuCQ zUi}83F{L#>2_uRk&)aP*)NE6=*XiWSuRi%cjk1B21+Iu!br;Ri#I4f>W*C!VsCjV>kzzfc@ zy4D`aI;CEuue#wmXW!~x(KV6DYAl2X-}rG4>&%Ph40n}sYrf*?@7UXJe-(Kt#6=W| zHVUI7DPu2QCXD*hjrdm-{EKCfPxXf(uy$5S zOBR2ws5Cf}Lu1grpbtZza2+{-@dnmr4WoJE-(+v`bBXKHokN&F&T&elbh{2CD&s@8 z8H0P4HrD62$yed%!qx-XU4Y`FE;iGJEk= zgnbpswC(!BLN0CY#((q?9@N{SEiiPx>pIxo;OAx3cx8W#qLE}!!Zs?2WOWQjLF{R@ z9uDvyMn|y>LUNz3ZxJ1KEhERJ&6>Oje8ZS`08@bPlyHcc9JMKEHnOA=s_dybIHd0i>bos)$P%oW7d~HP z9vJZuifxG*;9i9Hs4dz@B80nE7k%0w;ma@dF7ZI|z_n!8fVw^>V5KE_i*XjaV}#Jh zj~d2IY!1XQ_S@$O+zT<+J}G-zx@o0Kg3{aVPS*t7=r~6)WU`woKMdSqKIaR?%@u>q z{le?Bx5+FKi`eXNfg0wB3cVWUZE3nqh+x)l91Xz{%N}92@@C_~mty4=Z*jc<3jD33 zrW`5OZ;q-Xr-gouTK|Oz2UF4@f{>k$aXIIiXpfKyR4;*)Gh&Wz4dKnzOBBkj9A5Aa z1S$u|qj2*gK7m*&(EsuMR9GGUO~9P^qYSlRMO;AbjDK%q#d6RLgTzvOz~oIV@8!0Khjf)9iW?UT`#=Q;^>Qk5ujlq_amIc!e0+Cpch&JWA>Hp3uM;YQ0osx+Nyc``GI0n#5b8> zCl5`iHKQqGOkXIJ)7y{vFbUl7p5`eLe(`Rb5UUYc>+0dy6S(^+SsK&DVD#dv*EuRW z5oLkssP`5p*?gF~^-8W6@d!gjX0^1KcN`b_%!ksXSd=WIKGr-I8Adezu&6}<&%kii zqa!o4hLC+#4v)5Q$gtHZ*t%|~v7fc^ZW^c~5yAa&vHBMcwEh`Z9_-&%{0tpCQU(p1 z8Q-)fPf^WR*2^8qhSMtk)8MekM%iAHdhB5dW(=2qTM)KM+a~jetDq*7Bt-3{Qa!`PKz6wAh<1z87^0{2w)b;4K42i;;` zQ~oZmB@~epctck4>5AhDkApTv1hU$4t2^=>>9v;sC>*Kid!?S#&&52hg%Og_facNZ z(5=o-Ha(|Exy!H0M($5;4f57&ta@GeK6oN=keOKCrAFuYwtyhJ&2^@_G~K6FuAQ^; zwZv{)ds2Xe{sQcVDkzNG-=72RMl*#dD=z1yHye6gLGu!1VJ`>dbaY+ptNO-q9<^)#Gu zgNRrgeJ{IcKzUcPwCujhLtewSG{H)^R5?L>{B{i*rXdFG3tHOHEy_#x%S zv2xTm_|v?S5}MF>ZwIkPUMlvD7nj&?mhsVLF~^6>c*-0!GYpfB361Hs)qo$fz#+%EeXr~2jG7dN<;&uX@E zGq}O7VxMZvyp%)Nw*Cwl_D@xz@L-|^sr*A2g+ARRkLfp%i+6(-`#d7LVg| zCa`?xMc-SR((nfe3~)uZga4VAE{9xpBYJ8$;Qj{YmIVwK-?DWca?!@ z)^(5f;V{w9>M0M(z|OeXLsJqX2umBl!R@1&EPv1}Ws8}mAvODU`+<9+MVMr=+h*Hx zc^ACb^$gqws4M2}fkA?f*D3jtu760TZ`7R4u8iZJC6wTlSy;>2gcnV{42|K8R}k7A zQ@ofGrh^{_XUvsue=}xF$vqhQf#Q4N+2)3_a)VF#x3}^r#@D0lKq)vhw`@U_KUy11 zD18tTSkD6(zfj@piXk=hQ^?x;awsa4EXLos)VK^S6J{Qo^xj02hn*B@m~ZEGUKfedoLK{ zRw==B$&stic9bZMT_;*zV%4Mv8d)1iKh(Tz1(0sMZS6WB>@RlNZaljqh@)?kEp6zL z9h?8+?1^@-YN^Oy@VJrxRb&@?Gq(hDYHnq&xGKXsViIWk!HwraRG(BBoMmoRE;+7L zEXVw&oiN0TR9SlgtffUE;C4c@iFN$XN??_1Jx3xs`1!r>`iHcXIX*e{?zA0b?FB{%YR*rd=nT zG+m)?PMZijNB6HQygYj_zg?RmvAY2F)Zt%lr<#fzUI>p}m%+{8-9I}dayoB;F2FBB zFV+*?>?i_0WFlnmiCV5bPsphro;Jz2i1bJBWUwAHO8#LP@(Z}u(%yRRmd9IpU5b;e zZw`x@4o0~DTm1)|FBzBwT9YKpX%6b#?&4M;i2i<0BZB?lpVkQb^hW`7{LKiQi`tRM z0K)(@`Jn#AA*hC+qqqrAH34jV?G%+7E_(Yxf6H^G+rjbIAWF4z6@9mNMu2tQuTq@( zBQ2Bl9Lti4zg*m7a1VZ&M+X08{E}BsUHGaf-I(M%1g-J5(>RxlVQh>j6f*4Nrz>&- zj%X5|4hR)_fB@b~_ZxWYjBrlPAKXWy2FA?f{tYZeH2|_E?8~W5RQqU;aKf}PYDF=O z^@-X)sJu;t25#dhzD=-V$>!f0>CWdIrg+XPvHS>Y4`7-HN{!f-nW%l+vr+DtA<&{o zZY075O>+JfmE9F)#cK*`g1m}je*5v_t7VJH2@{D3V#qB0RMSKZMi4XpLb?=RoE!}o z)MI2)G$wgMK8Crw)n4RNS=|#f#!+0vOdH)xflao3ga;9M$yzH*^!UBVVAa*zXva;O zhw(St`{5->{5p~-W3*1mUP7eacwe>W&XU;t}Ro0RDNi45PL#JswX z??%#XKWp7h*&V5z?XV}mxW$x=k7<|!Gvqeo7^1-}ol!zE`DwgvqSE};;)RjyD*Y!W zZCaAnA>-b^CH8-Q0S{z{kr;`Kezb<5Qm~NDxVFP%(r3@m%aG8wn0PL5-N?e96&_FL z$T^cR7Aa`!XLni6^m=9Ai$FAj840{sjd(r>VzWqc)Q@1CVkeme2Qu(=(Y_wgI$(eB z?WugU3JZg(Yf=KuF=AI?lu6h3Op#IG(}^`fvXWgmZx?%t)Q@=b-F#*^E2_?|^oyq5 zqE?!Z7%FTff>VLCu@Vy_7e8n1{vSF?+hY*0FxWc-wL(DQ7mfSuZ7kV!ia!2dtq#=$lbWj zjezR2L!*pF$v_WZRZ%3YkWXO`^&FYq$B_n!zSlPwCW`{u6jK$Us$jsY7z0Gv4fx<3 z1w=87qSVE@&*l+uMH(=l{o6g#Y@^;%#BLwb5qQPk^$poe4!w&i{KlL$-!rD$aUDtW zJE0;gF=u~SU$>#9m{-p*)6k)y)KR#=qlYgv4K@G3F00$)9r@~>c8eBZwj@7KW&1M{ zZ7uXc1ctA7nDui3pq8yyNok7pz+OGJblCn#%4rzH>hfp{=PtK6+t@KSd>4K8z7IHw zhAjOwEA@`(N3gRgqES*rG-zfk^VJ}Sk-7nbD7G?z8!QWG8r;hkKwCmBPU?*6_*$^? z!OZPFrFLr%U~D9;m}2VJKCT#163E9y5omvMmN)Sm)O?%75lwO=M zYT6onnbF)V^_1E;sYk5EC&vhzD_#7S+yh%UUvht)CDnx=%CFhy?c^9ZF`Yrdk6m+N z8cD+xx80nh!3b_R?^l&w-@qai6Prs8Zo-x61IN!aw(zTKLb}yp<#s^I>azj;%kpSw z?&~AXgQXs7(LSU%QshSPJ{$JoOS%`;W>=^QeIobyU~2R?fvmBkqY|2y&qMX8y=DeaZy#j|4EjF&58ET0NDLYM6#-c<`S5{`D7B)@XGV>i z3+wktvK=h?V@jmew|?dt=l%g19X&-;mL0r%n_vi@;dsdA4b}`H`JeD2;X&y%hJLD| z^bNlLXtR9lo$nt@a#BGi;H_bmcy4?g&Re0rg73IR8M}uHXOyEP3vnltyKbwu6*c3Z zd37GF@=jVH)fs^{;1jvi@hi3c((w%j(r_GUM78#)C_&TEXt;F z`aHN55BVJ*sVIE_Ozu}4W5OWVla{rn+jMz$G!~!&+Lp*P)`)r|I^8qtOd~lKj7WYw zN)~9%THaz&qW|T@5#T9JHg|;4s~Z`K(I+~g_EV6i#kmb<;UjFKwaG{PySQOl`y-{5 z#11%Q>#lIBAzbq`A7+lfStQy-cob>bTr_5ln5$fh>Q~f{H9U*PP3RsV%p6V(K8qTG+vs1uGlvG86CgL-wj`O!suex%|10# z1`z8?axD~m+DO6^uE8}PY=8sGNhKDYNE}aNm7zvt8QX_7O2#oxsF~;Frb^DN{uTK_ z`wTd9;L1Ng6VMyFMDbL#D&q348$`lyd*v zK_zjTK2u3sd%GJ>zA5lBU}h~CYk~^n9jXyZ1>Z+;_VGJGA&*p8#yGB8JgJrRa1Yxy z%Ltg)-=B$a7{`BP@gh+39f+-KbS>DcbnhjqgOz$* z)t19UsC)MPYE;|_IVzCk_f7(we`W7E+oCJ71aC?-f*XA?@Dv=;s=z`?jnF6>+C#X( zQyJ;>Zo?fWB#X*k(pAGQKS%cfVm^E}hrclY@Na?hk8~3jU>ZEXzZe;Re+x8ya~y9$ zQtaiR`+l|tAUY~+{D-!H?3YfdE|Mv)OXe&Q{hk`{${A8FqEAz1F21Z(VB0HYd~se+ z(RZ`42U!BV4S8c$fFk97d?g!F_L%r|x(EO@N9l<#U!fTW7*ILbrYIiBkM`Z zPBJ%?ov+Og0qXseL&#~Pb|~}X%w`^|neRM*6LdG7RE&PLpg0{$b{i4;O%p5L8 z4&QJH8Pa4vE)O~Uc2Q>^r?ux{>}1>iP5tpe$Pp%4GNcVtnm|gGDQ)D7SeGZ;*|{dEIY1R7iH42+8dr=|O0*$?k!mUl=@WTjufN@M`iA zpxrg7^irD}g8h2qSZxcMa$nnEI5g?7=kU*Lfceu@9e~=#FXXb`U-CRN__F^#TS#cf z?a@39KTHTB}CW0w|E>S-O)7g7JM(k zbpIgT_r2&}^9IF1_v=3{zfuEzeb{^@CBCYG$56{#-I8e4&nc)R=rm~UKMh3BWLQKE zbb8yo zOzzT;$gI_-k+rIXO@LBBo+4ff5|b`?iNN`dt+nUlmPlp&!;14nCHUNP7MaJ*tPW=T z_BnLWWJlGHYC(MB>)FtepK|RlDEhcnYJtcw=@DoOM@>MtZ-b6vtQ#uuF|*F*JVe^Y z3Q}Ql_Z=yteUcm6F`AlLB9ig3JoZF<&D`&=t?sY5XTgO8me>N0UhMkql1?inWyv#J zcvDWa?Z+)aN>NfH-ibB>KIeCk->Nc)>#-3bE632#+VOT~wc&1OlF)xMiAj~7g-dVg zsspMI4W3gR2Ch@;Y6&Fnuf?J1K$NR@XGV#!GeojJOH`tRT9rDDCO8XM`Pn|SE;fDS zKTlm^DUo-G=azZtMQz^p#U?2^XEIE(rm15#)Kz3uwi2CvUQ{SJksLy%LpUAs5*#D-yA3!lmK85GdZUsQL zT*GFD#O|}>S!~A>%m*;(@y^-4z;}wobk4@?FGi}bEa1Dc-r-Dolzrcf(iuo-_R)eD zpR-bI>0OY6ws}e90U4L6p@OiFS48pd_e zc@=lu^`CYJf>+GbhqtO*cKysR&xIt4`~2Uj-rF~#4sX~A7de+`_ZVuL48S(DWH z!&)OaVU6s!mXM^Z-WH&VpRf@*A>Xk0_voaV6n_tF-2aEB^Zuvuf8%(|%1X+}I7yzD68a6caJ$NkH7 zU9ac$yzFie*&?n$yQlfQxrHtkedZG{y-M`2fK=WBE`DLXRTD&#mrC{nCnXyE`|$*vBi{+ygACZ=y$O%If9tks@9^ zQ6=wOiscgI@^+CF4DIKsU!~P^QbhrZe!HmFYXu7S@_<-L=YJ7F|2(OD2jFie)!KUk zWJ_vj(j{kIk2l)>SGs*>uMR$oiu{-WI0BE5ABP>rzJVCEbbUGA0@*& zIe%=4s+9j$y|FHuk~SH+!RB9%&Eju{KYip*Qp*?{MPoL^fa+?NpRn1^<+0um4pE;whC6eBqOM;J0vXtuNV6 z>?e4N=NA3R49AJA>Xm!<*`AHatE!XraNzCoea${|D}l)t20~8ub6T<*(tk~BcE8a# zEbcy1z{=C**4(O;UR;O6d^xb?X$L)4)1L(|TNY6MGkrT23|oOSTrLY5IkKe#fpYe1 zze#suet*$4UJv+5y32GgV@Fh4kad$A-V5KULtVY57(USUivPm?msUNSIDt9}roK?% zlOhphTE8MJu^I3GrkU)@apk`!fgc0E$Cuo*d8;`068_&}$nQ&9bQkDFtV_eNTD=<%$zJZ$Vb}bQj*hHcR7`g_U2pD9nJ``zYXacZHK6o(yQ{G*?(d9*D(V!=FDn+ z>u6??x8WeHY@qJlq*PT%(rD9;a8 zHlw*Ik@Qvh!y^qR?+zIFzbbHH?sHr`HZ5nVy-y3Qyxt_mFHgSvC02y(Y9}0NgF++@~losv)z-z%4{e}L-J#mZE1Kcy^xq}!X#z| zOnN{`ngWjcqq@{t>i|8J=K_>N~iy%ldJ)k$~n*low$My-M3cxtc1!;eh5?GZo zHKd|KDS)4B=gV)#k&b2#3aX8@I9qHz?Nmm%5IY0tudi(@q5|{#%`|)4&TPI&@795o zmg)))re1qeAn$ipk-sL*Gtu(SfR|hy{B$Wna@ay=R*%*iHd?<8O zc+Ps=K%oz;2cpmsXxmTlu=HBf0s@AI{%iXUz);gVQyGxq0w#&3zcS9h93)B_FVOf) z?V-+`If|1TX zN8f`+T5J6053tEoM-egTtJZT|v~HCd)?a)rocqBCpzu0_+yW*`VP)Knw zwbyiKU)96d#P{#+hu@2RlKL1cG=X>Cwq=M)1FvL}nSJxV+p~kzN+=@m!M$H}uSwm= zu|kvE=&~tc2#F-l=zV7Ie;j}?5c_hW6SzIrFh$YRoB8|On3HeM zq}eMlWx!?h~MV6?{2q{OHRj@W;x+^efOSO#yk}mnr>?7NviMC zxOk)2gL@rP`a>Q+1R0+VlDzur{aJKNsU)sff$I(Qc{F2^?UX%jq4wheAan;K55z^o zW2VuIk#9R&-Ud4NPzm1An28`m{C+qqVVXCAwP0$9I0g<3Jar)}08O~u0!uM>Z?rpnY|M`B}d_8{urv-16@s6;w*0_ZUx3*m2 z-iF3g*Vkb;IOImTkqxqrZOfu2v;}j9Z3SM#&Wof31j)!{PBcAe*xAl}S(E9BU0Y_Png-ST6<@@YLAq~Q+l#C&? zcufAFMrzrZlajV6*C#TR4XONXk&QOWl@9@l+HG%#eCNxI%`jB`5 zS?uIfvw-|f-DEN6Ax7QO&?mgstx+za4==wV!wzk3EeIN43m5nxGGr}+q49c({IAf= zWa4_PR7`JjlR)zy<~8Z8|GAg1tZnLWQH^b)0K|O}9%a)+k<{9dm*#g0@iC$fz5H1&Q9t|oZnoR? z#+>K1Z&o$7m!H^#L)Jk}RYg%(GZg-9 z>p?byDS05^5Q`>=LX`ZcSG@8!_O>6l2e;%pQ9P=?;n6~kp^dfLfj`uC0*4gdOG~*SAEL_Fuv~xgjFH_Q6S3?C@^7u*FC){q46q zZ#tg+I`UUh7kC6;F->6u*{8yT08LW3O}*|Vqr11ak;O#$nOh{y=+7J|_+Vr-Wi!2w zOH5f2bO^?a046UF;CBq3=lr)MbC1v8e5KY%bra}5)gy2;TR!@WCU~$-;OShW5qkV0 zp%2@x+D)k%hvw2gZmF%phuPkg@_Z3-q=(q4p`M^dN19*NbOH3-f)8h%hu(2zbZ?Zs zQZgo3QfnxCL6;~jXAt$xXqD91jHhZ^=Q}#NL$&xJ!X-;M_CyjCQIgm$b2X%zYlA&k z=KJ8ah_`LgbMx1$=hfO*RSGMTtfFp<{0FWV4B@_d_4)YST>D7p|JE+FfXZ`LRQ~S* zNYG9`F%NlTdSKdOa20H<{c4#8V`q@?@91l*4O{3}F=-fc=U~1|SXZ^!4ST4Rhvu~N zdE!a^6UQX@uJ2kO|C3rmbjHywj6TzOc^Upbt4strB2JwEF3ZH<-HOD4D?XaCb($`sUuP{LgJ?AwX=B(?omvgzoH?<*bxrxgi7{o9`p9G>r+ zj}?G{WB1dx>O+Q9Z=G8EuUUQaAEiRi{_qIa$BuNvVVaKX{>}Rm&4)Ghn$Pm~n=HrD z$aK!|y0^R%soTN2;yn<)kq=GY4_XfFQsHtBuB*lHQjW-UF+*Rat~GvFeI$$IS@xChPQ40U}?wh#G(`e{j(&wL}0$28}oiQyGKHKhERklI{_&&QJ|? zUsj4Eapu3^f=FG~%~xQaM(!fPSGg?>fd$0d!8R>9`r!IsrNOyd`UPACt;^oG7-7z( zj4-u5<_W^rAk-h19#^PR>nQ13=EqK!H!O-ajh&b6Nx4GybPas9kSn#IDEf7#?$>{W zWry+VD<`ySvVpAp$2p_R9>qYjr%6EjBX4^(P*v+i6`5F>u0WKOyM^l$#!O0|-l<8U zk5dFVaVq6{)BDhIq}+{2pdU6s>;C@0DCI{7l@s>>c!rX&bo>2j>@)jt{s4c`QCXyE z&d6KeqSN@bl}OWHC-2wLzpOgO622MYF5Yvh)=`U*d+%Zmm7J?YW-GO$MKdI=sAlsc zO%YDU&~mQu->SuK*7SX`+CkkD`nVa18g?) z9w+SNE72LgnqB}RC80916oAB*iF~CqI;hy*-p}TFPI*|w?Xu}>)4Z$nXIhdAT>n`A z72ebDTPd*enQ_ZzWL^4j7WiZkNkMc}@;{FGHj{YxlI9+MEX?awQAZ3AC#XdE7wNj` zb3N~tJXcD2HAk;8Oe@spO`>{jP=of0{Tpb{0ZzCWnGBDsn__)uQ4}I^-AJ=$?xLd6 zt;@`*vt)K=w-B=Ey`$EfJjHN4xPuYKCh6ZDdPgS8IA!ff^FMO!-3I!96)oRJE6B@a z(X8}!aFb=4YpD|F?c-8h9bSD6xc>Z|Cr);-Rr?cKCO+eYT1~(_Y)u-Bq%20p*jXkF z&q#k3kbon$L1{BpVYHs5yR3daa3sYBHE}vD-u>nW`!5!!nZDa*nNrGMRP0mZ7VXtc zT}v$QTV*jzGkd8h|JVJlNP^1sW92DSD(7*hZsET&>4lt^*$)~Pj~HI^7V7dj{jz+G^v~Z|!JRLKI+u`-`x#{29LeWq* zpSSciOchh$MHCr>@0Z^c7qBPAT^;y@zV86O%^f5~Sd$M?4wwOWpgW;$cy@SSpYZd$ zY<5CD&l(9In$k=jhyt4Cr4u%)2d zH!EtM{bNONi!?R9Q2^{9U>}JqaDw1i320m+KyKS@Z6_2)3dYjG@zG=O6L^z{Z%5`f zmL}`!=BI!GlA7KXCv)Xbd?=44w>}!g6A5qV{RR6htIYx{6#Zh}I=5HrU)g3>xGO13 zX61fI?p9Cm{+5W#TD&H1$*~q>yDGRr|ES9i{}a}q*?8p^ zla+PIt$;h%veyH)VWk?#?~C>eHaLv;Lr}S{!iW%uiyF(H&8`c8QBC`1Nl$qF)qqR4 zJ=&dB^OA8IfEZlJIA8|PSv^bVhiyOgQh7r6b5fb(CdK>Un(ACNASK6nzkB0{nzHxTm@L8%3hTBii4#!Q z8)4&`MQp?g_${4YP`$}4rML?JnaE;Kwq4DoC(yw*LM%T|w+$IpBuV{ZHDhYK4a1+Mb%YFVzi%M8dwF@oCoAj6ta8e>%e< zOVSU&9~_r}vGX~)IM&Gy_KQ)P{7fwqHtn46<2XS!ae8^n+EX~)VNcb+9{ zv&y~U+hOo3eB2YY*9L=bM!%8ySJr0dZDFh+yyt^r=STjK5kvnVN_WcO+teT{ zA05N?gB#CAH?rA4w9mWAmS#C!LAqg1rsqR|VV;wVKZkTCi2-Tb{mQ(xCIRo>e~?ZpAUW+>*2QPm*UTeG(Fe{8j7?7G*@Mt*O_ z*gv)%gnxI*4n*GVUsm|@_E7Dqw5pzw#Eb5)v^*C%g5Lt|&oef1WU4^;B9ClBCbU({3TDSW} zz?52d-9iJ8*8admE_RmJGOUg75l9S)4eKWxFIB$k#r{zH_UPLyce^ohfxu@OC8Gg9 zt7}`I?T(@=LOz`Bn*IH`De}02VL-9qTn^VQpdYN*D)7ui7|QIL5G1{$M!d?)xRrjj zjZH_jDK~%{qARJAT&SI#Y3!~TT@|f&_^|X-%98Y`WveFh#LY%ppZBj$mrWbO@_Ov3 zlg~TbA8=eHEWC?C(Y6NLLq&|H_uZA9m3SBm%Xp0?vKh0<8oORNumB$-vbDxKieHMNe1fkDa*o-kO6$O>2;lJ8*}sP_e{!?KWv=Eh zHJ#?$X+3DDv;D(}4Zi-XOZ?&6!@3RPDuOrO=teb9W(#|c46Sibxf{QS041BA@caZ#j ztg4qkKKe`l$F=Hqq#!ll2#hD`J?*%w)?*^Ibm=1^=3GK}(g3~Wx{gS%TE{j7?U$0OTCnm|BH38u8E$rQQjm(e-Nt2si`}k7o(z3Z zV!*V-QjUnGEw?Soa{2E0$URSe8Q;#T8yY}R#K?T%F~&DqsJy&v#wvG{YKDtKR7B*y z1@#N?*ISHET?GkVeZKCdTasObDbQ>b4kwDX=nEjYfJG*9)ZldquN@$NJ9|uVg`w(UkMQA*j z$j5QNmFP47^Z-hF=UBZ}u~-MNPNO3cu`5*8oiK#lyM`{h%nuUYVcVO)qiJZZ`pTZY zfRhH8$iAd@eEVn_%X&Xpsu@><9M3)Cyhj-y!)B@e;(Qqq#c@xSD@2F0A*iLSXL)tk3)Ue$*0?~< z$da%fyH>GZUavAv>O=naawZ0|>W&Se0p>Brh641eE`HC^R5f!uD1fNHa1$}?ta1me zETsZVcla&uPso)_S3O8arKz6n7&i0{3(vl^-R`FwU6ns`SWXIKq8f81i$1NxC)mZX z<+xn@xfOJnc-Hf|e;L|m#1*q{Z34~I9I}Wtsgmw2XJx065j3d_?LoNoM;Dsh8^zW+ z8qw`p>}YyDwvYw>Ro_5JgLeWiNaTt_1^02l-#4o5Ohnxiw7)pZ5Hr^BK~iEDOncrE z%=__?d@Z#=J^S3pGCHotqy!qyqv&mnoY|bqtrW%a)j*q>+-u{?OzToTB|=c|azU;h%T;VEFVKUPTk$qm2^Yl_9zjO*I$GIkso?fePkyf~eg_=|OSp6Lr z?jD(YY>}Bjq97D*!!l?C-VhMvebBJb?79!R=Wm%dNg*dgj|wv;|JsIU4g@Aax!uoHlz9r=%fypu7<}!m+*ESl5R4paA=cTtL!j z0`s;Y{OSz%!zpLsvumKQ$2rmI6&g0@T8M~pk|ILqjX_iS)4+LVV2QC z<>uXFQ+Lt(UGk!m`Q4#8lp#MHmERvbUiEmtqW}>vB^Af1$Oi$IK9*hgS#p_~VNF_l zZNTu{SPRJE!nv;N;MJY^oLlMY`Z+Mew|-&{U&LIgKfvbw&}TK#@-=cK%?I2#LsIC7 z9&JjiC|~W)PnI6Li(}5^y+NqdA#!iCP|_2m*iY_s-j=yTw`}Lfy<3k&k|Ycgttnx` zco_@nWM9u)hU&f?u-xCM-W1|(8!T@|{<&~yJ>~ndy`~S5fdAXXmQ*wx;DCD(SomB! zOSe4@J$M)QGo+X+#U72FPZdTnKYzaP!#-GPUJo7nHU@tr^mVP(tX& zwvmfvthj1}J29hE??(>gdrIiy*L2KOypE~$Eq_7|>j*y^uFM&$+6~pE_e!~G-S+XL zYz9+d#Ixi2p@qza(zP6Mnb;*HU8_wm8=4b-A&QQTUZ!OE?TNq@Rkn*d_s2(nRKHeTxg{>7$sg2u zKj$w{p&8vdKqzDm*d$hZM(>q_!!F!VCUFlG&nu46=+NtEX85<+$19FD7nB=4nPZt29+|*=reKS)O$F<>e>7U{rM*5tFkTb z)eO-BcaELO$(wE~9rlU_z7$c`Tru_JW)RXfLAHgadg5yu^A{^_^jaEi{pfCy7Zm*| zBEo%>#(*VF;W{t-rctKmkJ8U~O;$wQ1PUVI~B{o@Q*qqShyn&oggWQ4|TI#fwKxO6hDhQm+}a@MgfHlXWK3b z=WEI0rU+Z4_jEHh8ohsp4Q|{R>w%NvuzM==XNMyY4mhRtDx~uLN>6!Gi_XKv6~mqN z*Vgp}W&yk(0%z1n|3WdMLW0n#&_w?6ceex^pz7{<65MmreAtt3j3E+^nIWftkNGf% zN@Mbr1Q7BA=>dP7Cb;LCxzN?wxrwu6E0vGxlNTV5bIZ-mcp7YLvbXK`8-BArRvih| ztvW4&{DQ=m!VfAVvFf1utc4>{Jw5ONyK{QWF@s9hB<*0JDps$0t6-BnUW?sok$dC# zgR6AvlVwitqmgvlKSi8=r=93fnFq+w36SR-l`4hetb`|X|IV_|d5489|DA3L?{9_o zH)GQ z;zjgh1*FPZtyjN1y%A%hBJm*XzSk!ajU|z~V(`9~+7qSRd$_hMMRp={Tj`7e0?JW& zpKsDaBcC;On+U!rl=$~ooW{+#DJuB6vD6&f@bJa=F3Hy!_>-mVN!nh7C*yZPy9A1t291hsM*AFSpQ7BtnhW`uvlFU#ut?FVG?B66f-0)lp#U(57IbiuIsFGXjX8dE&zinOnL|2dCD%{F>3i%QbMI{i} z+oUdQb<0ujHsl$PyakyhcdUMSrX!O-Ww= zQZI51>V7=QR&TksOH1%JL&@)fkJ>3%^`W^;>Wp8@7h)W+Eqd%tbyZRMy*Bh0XXgcP z)F3=UHqE z(#)SkZ|xn2E>K0sQkvG;#}L47oeun{1BF~T_&%4zN>W*rz5qkP;{+{m@F63HwU9sf zu+k&AGubih;I#By2b|7mhSd?bPGgNhCqM)p!M>eu>N`wRX;W@~6ObsM{?{5h^^mQ+ zfjFE0A3Jv-hk-q`Kd_Y$|9#2h3z_YrSWj%-LsCLdm_`U)F8jc*@wB_H#vY&FQ6_Gx zE|Eew2-n$kmMV@9Hf_mO@J1lDU}E+6gjSk-Xf%a@I>>~#(>ld~iBmRvF)uZSagrR7 zb;r|y`|k4jC5u0>?Z=()U}uIGj?gnE4I9!5Yp!yhUj0zwr&fcban>*u+b?2c+JkBr z*ZFhiD>QG#yNx$88f*zZgo$4K{43wUNLM5KKZZF=#g$QUqCbK1?}AEn^QC-4>o|T7 z$2YwL1;s(LSPfndMo;{iI=P(s|j2JW2zd&yFpjw8*c69Uz z>Tv%J2jV`(m`ZPNpz8x46m@i8%& z&dQmb{>y)qrHyr!cEgcci;VI=;|^Ghye)%guG@DhJYw5NX=3)+=^_M5jI zam)tZ{`t#DZShnV=3YBtN(!!qQ)_OB8WWH0SXE)Sl1Z|vAKtL~j2h#Qs0lUSU5BDy z6&42#h_Zcg=iPNy5*SmzDUD)vUElzJm8q?PI9B-tOFpJzjlns?pT4c!;jzB@cOx(O zD>vUwr}ycs;W!_eA@jRh>uT5eo9X!}90Iq5!r-wN#fbV@iZ+r&rvaGFzwaw+zqsrF z6Ow9g=;q8CzfpHQ(}uKR`P*C2E8P9U*hTvF+oGo^n#P#28*_bLAG24SLNHh4RgZ%x zo8AIEKB>z_gRy)Q8RB}Oi<0lO+r|8)RUgI=v_+Cf#J6E3m~4x>ED#^3-ARz4|DBIdNmt5 zlqxgUb|&n1_TNaJOTr(fDE#(vXZB>b!-)iwaM90r%|0{98 zW={vcl9H7L+e!h#vHnBKsw&<~FV`x&kE<&teKG#`H$?(gQ>@;VALGYpug#mEAqozZ zR&uVm@xU+TFT5Ul^QFxY_a0Dd-y9fD^47kaz0LGg%RRS_*Ai3wfq;V-4i}-b?3wAH>z`2QVJYW~rrxJv znIAZ6y_Ir#K3;n~Q;80(!wX)IFrrpJ-=ag5`=pCrY0Gm;%V5OR?9rfhkalsp$Ov+C z7veq-xs7UwV|-HJPZ;4GXI*l`EqhOW?*a&2PbEM#d5hCL!-h;2pABNRV|O-K<~s$V zb#hKt)he#WxHxR|@uWpve^LH1m0g)Xm!njdV9$15~8D&9i-a?Z3-HJ(qGPUSc!J|O*}HpxR&6+;mE z(o-iUw`|GRCJY=XLK~ZZN+)*L15=W$XKd(`lZ^W4pZ+ z%2ibOj$XmjdefvOTE6gc!N z*r(bYXP46r>A}z0$cK~-Fd2`HMm42ot=Q;DH#*QfqJ-WIAs@}ub=3*ZgyJ)x(wnIg z8#a=38GfqX0XKCtx$QTk>~kX39XD-^CC_7N45}Q7Tp;8jGg@}}&{F=hAVL|I6?Dl!dsxDX^jaZy z)#!;Mg1!HtY8?lg{zMsNNbR^YFsK*0 zUgtWIL|B`$OPfJ=|0qMc0je$WeV}i(axs{S3)wiHS<-%NhmGy-P@usMA zGFg)X5-S+sK;M(COpzUReygX|Nu4W+KI?hV3OW5l;Dvh|e*Q~vXe#455Yu&b90q%~hHBclIfgz8!aP)=v>T4O4QnGks6l7~W-*e` z1>CAIFI3^8FS5J~b^n#M_a>40N$ zO?RqGHVXD(8=(dJ6g(zlfp}B$6+-0!tgl=6`DmZ);Oln1!NPuSNs;^TJ^#rufSBN% z23wy*t3d?eW}xd$seAUh%IM))R*|a>fJ=1hl&d23wQzT@ar>XSWaP*Dm)WuB(2Oa` zBK8WXnpzn1N;LKiVbIxCMbidVM8iJ$4s2(oQU8Ldvty^Qk`{H;&^qNW-JZQVeB(F) zO|T{&ESmea7#K< zY5eKqz#)yo=6g{$RjCDuTH-NoH?Ub3LFQheK|?f&mP)IbML0^h7JUiwWc5a+t&CT0 z$DA9}IYb!59oO8Jf;k%3VBq z6hEmPM9eQ4s;n6@Frya^xx<$$B0I?1!8LHo zI=LI1BMIYA@&^HA!7L)WLL4fqWhXom8?0@9 z0b2lV7LZD@rytli5{38;5DPUY*P&S#?G1XVRAxJPwNzGHM5!Sa5-+i@_2U& zLTEQT12q_3jEubaN-N8gtRpwPaZe}lZpbdk{nmjLdqBZ72r6CJ(24%02|eqqeBOei zg%UZOd5-}uz3QpM6Y>yE_Jx_jYb>MVZF9BRp@+^DAoL?{d^fxj-LdC=A0XI(5rk_N zN|I#j;;pfFeqq8-sC+`K;zyEjN1aUiR_+$=LeIV^D?WDSm3JbN;ebsN`DKl&?XQ*~{H|JjR zx4ER?`e!dyuxgis8GeOI&&asP5bmUTyqktpy*Jxomb`>t66{OGYxmD1K*+$B#G5U5 z+a50uMHE+`gde@9-F!fIklEw6!)o}eXXVGaJn=xF+-FiD`}4;N5clgxhrc62w}9+D zoo^nE<&A^>`~KC(GN#Ewru^1QI4;v#%k;aR8Sd+k-8Ub8zjyg(K%kRt;a<+w;vcs* zC5jtg+FrkO*PZq{z2PP93@)Ww_MS>>WxcBN8*jHwj>g8u()XGvB+BH%h7!gLOG*1vwHTap1X&W`UGRYvF=iEN4#iR8U*!Q08JY!z)2yE2@WDDO)-?N+K z^>mqY1oxPxTvBm1uC#(RHLv%pj#EcZDIffHtKT<9Y14L((IQ%Iw)iG$ zdc@rm$}qr7Io%=+?W+t^u_%~{-*%>atvzZ<)c#tAANlX zq5`U~U7B)^W7(X2VKmOsa^S=u%s`e-Ku3Vto1H?d;@ciRe3pXaI!Yc=_N}GVI0H{e zZWv-8ezpHy*qHF_-oLhs0@71zw}(`dv_;;ze=Fc@eIPO95|ATmV1AoWeB0I2{H@km+N|@35hij(@?+`(m6M-~UG-rjsu5|8e$6(g?W(q zcEMGFU@Nf|rL*2EqF(iv3xj0LjJCZBEnj*CEpS*UO5c4k7Q4Zle^I;NWMGnMHMGaQ zs6;;bz@ntBVbd75ZNMyavt_XG>T|1K$fX{Jt)*H{xb5%nnEM^q`+%ff0N|$5P*6kc z(r4k;B`0WG7bBjauVp~9SGQ7CbliDV|1KLJplvxTOl6UNff=fvhfsDJXCUNt)?X;t zlBd$2#-X#1c7Cad_$HjW<}8MkmQs^oQ+~Sr<2w9D~??W~2yRg(Z9jZ1!(cmv6aJ@)Mf6F3 zR=o5mBl)^q4@CdJ2RGktqpxb69sxY9IG>zVxP`jBEs9$dV4y+#2-_E9wM$yN<%&2_kjD?+{krqjp?qnlO|pUe z8<{<4J=k6W4p;ZhZb=(l!3|mWQvPBG@Rw1P zcO+5F8DyrqTxG7-o7B6)^rca(Zvh`SfUkqE=j{#-E%b)Igr>g_=doqK=ez#?mkT+v zK@5-}p$oNzU`fH#g=|?7B`@#9-zi-!n}OsdVsACLF=^bmQ%k^~8SQSZ)YX9qM2rKR zyd6_#@0}zLddI9=e#`ws3dW1LV(0U%e{`5 zGV}{4NuPy+S>Qk%Wb5oLB^kejy#nrB=Gz4|oLZ3zoPD2?iXe?O^WXSv$chedl>c{z z^nkyD);J{u*nqb7+i*i*va~5{N0(l$6pnr=CstkfwciS8?_cHL!((wmEpv=cBlB$* z^NI?S`sf|kM5@guSk!DAUODe@TboMP*%vvyO$1jpzU?RUrW4`TdMBv2?FaUNFmKOD z%heagy4Kn@kySczEIL}n-ui+zH;nBRZtpWC3KxYf!I#k=9tdd~e}Ck2cSw$$(qJ%g zC>JrncTGc}C3b?P$Ykj~pdCwnLLSWhaq%Oc0>|IgpQ*^~@z)~<@XTyf{Fe6+jOLDh z(Sf4hlV_(Xyfs!f#g8;cE)^!0>7x|Og#>iWz6xq~t)UJdks`7g$xMH%7t^6x%0kH$ zA&Z|$YrLqH4ci|tAJ>+9d>30WZuP=S$1=b_N4~yO6e()@7ME8fofhCUco61?48*?< z;B(e0wG~1w`ZYQD6spz6nmg21+PMVfG(9ZjAdt?$FP80iX6LB&930#GcV>rx5ZCGa zQhni6o&6K|E$avcA$2+s&D`-$^sgYEQ;&pQzQqZ-Iuuv+725@e7k%C3$h+3}Z>{M$ zWIDjHv*0P%CePj%W6-j>eeWXw!(=P@Sz$1|mU8T@oJ$$yfkc_9s#ba2D(YR?wy7^% zud3cSa@S2?U>NFoI6Fd)+H;{o(aza+aO!TY;oMc1 zL$)1N*A{cXai_-klo5wV2TqELi;@tLBQ7ieoz*419JB?ypE7zI^3~B0Cv{!LDYSd; z=m_a!x{Agf^{0P|*?DRl9egHHC*`|IBE@TXO%v5cweqKFAWB!``B{g96?w;nr4ON9 z^0$=*gEcQ~kwhk`;I3$2IK@&-=^M&2!r_jOu#N+W*R&v{z$rN+h zzn)s)?-E6@}qL=`Uuh6^V z^%Ln5Th^JM7$7Y|0IE&0B?fsJUR?W@BKa?v2(C#ZW2~_}!nn1TrJ^ddSe$((MZ*xm z`}|$nOkXI_4?bkS?BfuvHL0hbMED;~=lxIh|G#lXNfDXJN|_-=CG+Hs$P7s`PWIk= zos)#jV}xX!5R#QmILF>2dmJ2lALm%d;f&YU=ZEj#@Os{!&&TU=-LLDSFRPN2GBb6f zD+RsO$a_`crSRo`QMl<{9o<&~-`y=WU)uR48ZnjJcsc$tQbVN{=lFp%p4g5(JjUHc z*pMO~-XJ-#MpS4}YqeZOTzW}iM&POcN-ELk)W(UtYt=2jf{1TGg}$N~)AXwrKW9=L zJnGRN(5N^7ek7ic;aaZ$1dK5p9ohnR6`lMGQU`riE|^G|sFb6-)Q%A8QR5SChniSL?aVp$lIoC|v0WX;^dKj;fK3%)6E z#3tEXO~&~zP9gTi{J16>@tv5J<`A1AMchmy9)*>kqYQ%rZG-pbPkLALCF0ylE^$a{9h-`+iS3R$kb_3om!}fpCpE zQ-Ndgxwlfk>59@(?G!2kH>S0$tQzBGLFIFL#)2t=tdTMD zl-~OxyeCYz+CP+IZ!76~r&BT){j10=VA7%AW|0MK{|)70kvf#%&#K(g7%1YM?<#zg zv`X~q>}d4kEO{1%%ikgL!^_0UTt>Z9ey;s@^}YkPAUg7+dMF%EtB-!W!nb%Ve_P({ zuNk1h;jUdu1IP8jV#$xkrN*4+KoR3_F^r0TZXUO{yaw{kQeXQ$nqjboGeHhOw@4yo zj_G%x350E^&3h!q5&FxBtoM>jy!kay!Iv1UOvC{3Stlq8K`@9Dem-hh3_Ns?1p7B; z!fqAk3ouCiV$Ql#pb=rZ;I{Dy8eV9pk#zg`7JElj?L56!A@ZM2*!$#r50_Rr-a36~ z_rGVE*e0g^L?r$?R4D4Oy`pj5M#UyKNs9gr+1bJ-^{SBYms`Iok)=laRpd8S=VP2{ z7QGob2CBz@_gLveTtzd*jfjbt_BmfwiWpiNIW5YOvTAS5s6?KNxej8Yq7Qc0pj}gI z+6bT5RbiESLX{-3_)MO6%TwN{=!~J3dpUL?#EO(p^HtshKeCwH3Me&0( z`s2+ZWRkMnGB$Y997Ck^nqvZ|#~o3kT#QizIV|>mC|7^CdN657xSnzGG|O*C9DZ*- zU!v#R3zy2TEdx*Iyy+D-6|8ALSZ|K{b=|}=gS@iZj$Q|Ub5Db>R7yr_ImiYV@w*e2 zJ!q-azx#Y$hkCJdIlUqK7g<7eMAFIb+-reO`(EgIrRfA0^P$#IJ>mfRYziM*0sU#- z)${7bt6=CF=?qV4dQUu&0hP6!Ey&ad^CI%h`{+01Er4QtZAD{C=-K%2QJGJ9PcZc* z0{A&OfOzVTtR%<7DZl+l*RV;TPT@Ca6giHqHk(#o_7t7$jT0DkJhQJ*?Hwp*boN97 zzKGr?DCII1v+5Gm#Dm~os0gUxv1W4Jtc{mjFE218pp;2>oz|K&=;nnG9NSgYA!3xB z6ikIzB;`CE=PPI9np3ox@u9fqA^ck?dchtwf;{jDKJ9@=DfY~nobws$hh!wDi}{Vn zo~@W}2gN(dea@j}JYc0^sf`-uUh$L>3Yu5VK!ioV+_@(2AL#25#HlmwcZGEUlEiG70fET=>j)ndJ8M4(FU?eo!O0 z7R1VWT=s@x`vsR;1kweW@=*g<dLzAKaI5a`L`5go5WmK zUueogzD$SMZmkh26Pi|XAAHiCJXqHFVIV|F^9t{2dw_UyNrH7HklD1CgpWzqZi-A$ zyGDIj;QM24afIR&5qz*tZ`ZRq<4SO+e|?XBUSEPvk$yNTBQ@%Qc~zi8Ut>1o`ImPaVw z-$?l-uh3uHSERw{VFx9&uF~I(@2P%nZA*ou{LaRkE&ld9QI<1VOl@!afD)qq8^5+^ z;`Uv>5v2sdw)v$=d!(QECsy_iwgxR659;>dzM%p^i~p4rep|l+0?2f>kje^xn5eVUf^ka#KC1D3p{kV)xN%NgW+Ov>NhnJqdqk zkE{<}-F0)XfE?HbKd9rgvI>f%>&ZlWH;@AR@1tWI*3`XvosI=sShk$OJwyHbTuVB~egQhFIMZA5rmkNv~& zFSC}x+^I=}{%CTYLfa4dd(Owu_m1X&8)d4D2421Wo!!zSY90+7BRvL*NSzfUQOj=6 z9Mv@yX&S>dlb_rPdy?~m{?&TYRSI=3OR&TKrE3t>G=dD>F}>7#ucZh`heMq#~nxnPa6-j%pDIP-xnAuwVvPk;;uhMhc%hF;9;aG1IQW%Qf#4+WyCdU)#5qHGLtck& zq|YO9dl{vcon$;MsB(6ZGOU8BV^l;goJH7I(u_F2WDH_Br?GEPU6bX&b4mpS4z&-{ z3?u{NCJyCXug{8qXr{hZcMQvpgSoiYk0?R@k_+4k9>j4laocae@b+)cN~QKye{2A8 z5>vlOnZt(>-E8h!3x?VEp>kPfG+aufNUgp<*w`_+Z#}7rnb|tPZQA1dGc<5s91l&G;x)JjB@^HQU{(>8l zLNu=RM*!~;Qm3Ery~UZHGPk<2kGZ%QS3pmeBtn}SX~wgY7C1&JzM~FMM@G9}dT1fO z1bV!c@_myJM9*{35wk$P&z>PwO3rvxcC0ML-gUW5PP)>zf-_qXRBt<=JiSP zi7C0f(q_&f!_mFp$zV;_qtYswo)9BqiUE-+CvW5C?TuS(38}cY9YP&NZ*IhxZ zG_tsGtBLB1s}WIpme+n;)9l>Cb1dTiy)dss&-ahYrboh5f42=hPa)$9BRy_gM*V*l z!0hdKexLkC)N^~^@=NItQDSOs4QUnB3&E6Qq=Fnc;h@r=a zcxQL0AF)$d()m=;E6e_G#V5Xnn^g~5w~-_DGQ(Rg3J;HVV$~R~|L}bm8{X|=@m;R^ zx15 zUYy*}Yyf?xBOfX~WyGl~MYqm9U{swjb#9J{7?GbDhR-@8&!$!}J&*(Ex#$HkRJScG zk2n2Mvl{8g^uBCOn}pMsH-nnIAQ$a~-lrhYx91f=Ls^3T3jFZ%~{=BI$f%tg|7#lwZL-R`5MVDf_voQee2Ohbt6h4iM!jz_psMk zUhH+db6w@KKb1!jE-xP6u(h3=vUJks=o3LV)BWfRXW7Fez=q4=^F#~Lsj^y zo?!N)02_84N2QCf$z49hLJGJ{tNn$(OYQR~nfqRRBFxTa9)mWk?}~o%u)Ir3=exP` z*+A#x?4!3nc{--F{1yAn+#L_kT127+L!zmxKUI9vtuFf<20khOt8a^hmYAX%vNAIg9%&r76IGkiZxJ)y zWET*`r+iC~3rFhh7kvJh55H(0VDNsNA-$iK`k0^T!9c*r+ryhuAMbysradrQ{k)~1 zz#Qy{%_u{^1hsOmz8b!$$v(9U9>9W%TMl?eT%fo!VcRoE=5GDwR$%>2oP=+KS8;F2 zr`}#J6pf$CUI770FgkaF3b@QHKE<|rQDX4P_94yWbx@#b@bJ*)#VmwwWyIt0nM(XZ=XTlf)x4gV_%!^KG6f9M`jL){v{Y(wI|_ zmkAMrZY*fo4Iib4Hrs_xM7=hEio(Uxh34BtVNrOL12s0nv!CIEV(;fvY9EiVwaG~4V=_I9k}~W2_;Bt>zAZWw{B#c)R8Mb>WjNKUoAEQ zu?ncX?Ver!P3kDAbyg2Uqi)e7W2^olhiWNS!F45G<&?KtkdC|-AWfyQX%>-d9_8*? z8rPzj*2jgHq#AnT7G=w4I++a}VYT5cj| z`WfvUVr@7YoG_4|FZ6f4HgmP+N7e5?+S`5+UNG|SRq&dSzBX}|ukC{ECGOYpO@Fw% zTKn_Km9@i{kILKXhSc*nr=EcY!#28|mBtrw{d%<(!Dse!H{2o3=AoPt;lm3}-^U*t z@;?&@ZAmfoz&~L=dNUKb_S9t(q@FK7!n~{8!-x$iTtY;R)S}$bPVPY?<8xeS@}A#F zv{+-p!0hAjczdYt+4WlP(pH@zulN?b>t-n0o&xLLUaO9F*GXV1kWxe*`s*0@d>lVV zaV!TxiDChi@5VEWM@xotdZeDsnkYSs$pqepNYA~;S3}a~F3lXjy!5C(^m6N^i3C-! zifXj4?2tUVV-W31~Rtl657DXzlAi33B8teUJj5 zB-Cr8;()3S>cI2E2EG2H|G1k6GUQ+>`t=YRyC~_?0onUXf#)tw%eZh1%7Wa7-??}M z6|u4?%(>Vz)U8ezuT`tJUSD-WXP4z?59Kk7mF~TAbVo0j-dqzgakE`Q7kZ?G@jae5 z{xj|daKm<6cK_nL>lIr<&ljCh`?>iTaq3ecxXq9>;c7gKy!+D8`OGDOaQ(*-Ov#3E z`5g|xrGINP;^w}HZm7_U=S5MMBFwLn`m}CVUDy)isZ)e4>DEp^QP8m!QinfWX%UZ< z)^_rx7jBf@B>hU~nl&tBJ)(?Ajo957SEQ8=Sv~ykK+;o5a2~^9>e>G&$vhn-b!4lw zRV&sxmh?6~j{3ufB8^vOdA5OCc==&uk2-)#QsG$o-QNcZY|OkId^!bvJDs(97MDLd`q9qF@KjqKo3>^69OfQ~Q7D+Mb`w{4S%?#IXl`@bThN>#8R=ADVCG4fESo5ovSNj>#=NnCfo6OrxM0H$`ZVB<3-FzNwlzl6_#uqp0w}0%` zba0-6$rwSjD2AMm`kiiq=XvE1#9ace#Sk0&+nAdxlkbWzY#>!m)fVp+$xX@Cao`SB z&Mynw*12BA^MtfCc_(KsG)xT*1$SNy$9JSKo zW$xVFk`o(vS+`H&i*)%ZISR$CHrA+sqa+R9@Oj*T_q?5n#BXuk&@NRB=hH33j+b8W zH;oTFC*b6N*`LG1T&*Ucm)kuiGIDQE)PjeNq>HbEsAFYYl9sEK?tbfOyAyJ@Fh=>6 ze;nN=EPdHPf&5kSdWDo0^?2%g(svG{fENd(?YB|GX;V zrJA&eJcdf&qaOM?F0ZrfkNsIJxzX$_iDI#l&GAPB5ih;|B3{BC-^c&(p~Q{Q>a${&2lRN zhBzNys<%|wF8ChIO|bgwW*jZBTY39)oF#xm+Wln!-KOQt8hY0!*~D?ecUevP%Vy@N zPpPTjqU>thfC7ST)8jziKkRVpoAYmDUiopizbj$*6Y#+{{-i>7G>6Q}d$1DZ=yTl3 zo6j=5a$nE0*qJ-&=HP#ab=xGpKdhuA`8t$4V)rV=%@H1q6AB1ah}&%O3-lSR_Kb*E zzwJD>G#e0jx9)OWLn~uuP{dbYvcn597N$JAV7S(YEgQSOI-5!r zO_$~CnoZ5ckws;1hFcq(B-*lWN^Y&8Or&y;(5uHc_|7h4?*w3T@o*^C5py5@S5R{J z;Cqn#AQfhax%rjHYU0Qy@r@iXF(SWvR^P@DX`0m{f2q&=*s*uf2ux08cRKxpOek5L z)Q2`i4AGC1wp-*%za<%b&zU8fNx1+vP2en7NfKXBh*eE$b4)(}gXi4u>`HA7?Z%R{ zGj0!rq#1K_q#*lJyo!McuFZ;SWPTqV!>xSn1QHiMJ?93g&5+0v#M|}=^?06wit8(fssLVrGAC~(2S*kU?%4IoZ&lDAo ze%+gI$ektpbfebbC+R_Y!nI0+x9VVBvE;>DSE0$QAx}*lYFdj!93^?6W#n6L2s!#T zvbA5|hl7=NyF|fNV3Upam(KYu4yT7JiSWFc>I#6?SU~Vv|Bi^XL2?tmY*FCF2Ju#f%e*1$#^j0~d8{_BO!i(F_I%)b}+R=7X zEpzlXo48q@KE5hs6?47mu-{u@3Lil1t{|uq?~f48nj$L#10uPsz3Lp98MmmORkQ|m zWb|yB6aw?B>T{+bFLPqN|NOs2Xpdn4cN`rxEI&{&Flx8I3AOlSJ>w3~m)|(O3M->i zWOj?X=+75rJyT@#F5kVO*iZx3buW@}_D;3aF*C}~OmpzQSKcx;*si+k#1ekAc%Wq+ z^w|HZpGsRy;of+o=JJDZ```3=OsO7I1 zL?S!!a#wF#aG-6U=9c^asE}d)&3NwaR=tKKGQl+z7Z9Xv;koIBpy1$+GFT1Q%>##f zE43Pu+m2-UguWL_cT3A%y!6^k+#-WlqskqCjk-(}QR(ofAD~#8mqyaLCl&9q0Y)9~&6T85)!niiRPV<=Y3P^jx8u>q zz_ZrzMXWn)>_s=8Mn6CtG&wYlJ*-=a^O2G-BoxkO7;<-y72tuCpEx0fC8IQr$7KV$ znL6d3#@}}LjAL5}UHN}Cr^8L8P8-C^_fy45mO2=gSrcS+_SU$IGYQFyp5v~4Y176V zeP>b)0|USALUsc!l&0HdFmlN%+#trTkt|8T&$)BL$~@D9uQI8nu<11YT`sSwj^6ot z?RfvkABGQw+&LNax0z#qdY!*`8+kAGbKN?_8^60(xJmketv*(2gTRi1CcuXmrxbOI zB`<-jEmxT%#fEYCzNRl zO-qQzfV-eR-Gq|CMcd~Q^4Krd7RKGXI1Lzq4v?y{Pm_gR^g#~`H45-c73Uxt(rxY? zz64tmff4-gZFSe+KU9Mv*U4WwVcVHMLkshn##wIA^IEI}h!8naS7g!iB5d$Z*6oK( z8#K@I45GeD1)?_Q&H}IE84oVVr?WEqIw-{%+|3CXi4RFNxOniu*NJpiXnzXU8j#)H>)$s+8gXdtBQCPic`QNOb1@7n8mn9P{^&-3k zbBfsh&GsYzw9fBU6rs=m{wMQBw}P?gGL5HL1K-nFL#Bmd>T zA(veH{Evp-JJ9jDtW>pJl>LgnRI;t9@W_JQMBRUpp`xwRVU z=S{4Ho~-zF=tMO*?PTQNsX`1?4=AxKhDgZ1YWM^89Z=Zy(BC~*D9=+6 zGM|9h*nLb4J6;2Z%l6(pcX(XZb7gJT?tr87v2>mXCn!hFUY@_(=ITJ{Vp0wXc@^}s z(EHz91o_It-g(F^HV4XeB^Ihh-qu>*xS3@&xyPd{%fG^Ky8RU`{1P_Q_D?;KYlig#+V*M7oPcA<$XO5Go`r96$3@*^__!r7iY+W zaD?%-Aw2>nu0Z1chz|Id5QoUq-^P@?<_E~ zRvF_Aqgp~hq~?I=-IadXPA3hN(kx^RgcH2Bypi+4s@Q%Q8%&}%;r0M!~0#^?A%|zoSwus!LJMVndD8xh+gQJcKb{> z-$z+1BP$lZYA;PzoJKti=@;e!IRPH|h>Hgr^3bsmVs||;4(q}tJ=yuIW1W!Vy_D~> znKX9c=s7Vd)@`1kaQMCc?#hF>QqVymWH|VF#x~6~DSD^_A~h=jv)K~qPIbFPM&<$GkWmS*r((@XYhS6&_rWJ={ue~_n> zfwC>bWW)nVnOUwccNR?hRg=#&c7^SMbvuUCW_y=9y*Up(B1dkG&TBqndu!PRX=3nmIU$QaEdP;@A(s;mLoe>ZXBpawB;G zxTh9il0~5PY@~2@GKp()=c8{AUTkS@l;-gl2NyY$~ZXFakOx5y}!VcenHylS1s_PM=VIos+Rr_D3iB;gNg z*`-!ZF92#7MKsOhE$M_*i>E~Zg9np;5+ux)Qet?%b~UaqE8Ld|$F|~{k zo0GbqfE^iXY}E%m7yw9)KzFSq;2Cn+zNSW_!P1P!v~+W@-po(ya5a~UQ?6m(zr0^R zM$_iZ^5<+*mVR{!KLbB;nTst6{P*k48zfP}!!O|9FVhpiTL0}HaD)e2-Xs=Sbm^HK z=lg((@Y{&nw#%2%84kJ7#}qKEVxYFzkM!xWi&+;uT~tCrtvvA!T%ut(u$t;!vLPTH z@*-ORvk5IbX8(ETp8N}Ki>+tNw2i>)(hJD;^>wW!h44=4sVI||p+CueGPvRiY-7bj z2xs#up)0sWA~UJg(|J<8)uVUf^OqVTLkM0V(LT=^m4HCVj(fvn<<4 zVg?HrW)pG}iT4Li#!))cy!MHkl|5gH-}uSw*cb_kr{!D@XS`_fm{$=#+2l%2$_MdT zce_US7P1l4sE{!L8_$*W0r zJeT0nZ9`h$lwV^U)$px^I8n-J2i8AV?brsm48?(y0k+G#^OUxWedlfu(w20%97I&+ ze)yQv;6SE)*?fOo{BDk+v?yVe^ZA%N6|BkJ&?<0}E&F}(!M{Fy8pY@qELVAiYa3 zxT8?sitSK?)zM(pHS>>?{tSw%a1)aGPoNTynM8g&_YXu5KX2~+@+Wo>+&0BWcIKnk2cIF z0Pt@D$BmHPY^Ciy4AzRGo{;`%r?BCPOIhiUvFPXr)IAJ);&df1c+ylv^osOyauxc= z#$@ZN?&a_VCXQJ`lY~Ie4`XV|-uuh59LTzDjrB*Dym` z!Q5W9Y3AbRNIxu`@8=qRyP~Ea@bXv~= z?n(KlfJF?TmY*EZ|7|%@p+y0Qh7}I5EXZ~8(kn#LaP8Z)&;I1=w}GiyqzuJ+=)!d6 z`&1)sVfh;oX>a_+K=0$;CKMi9@uxiKfzNJvohW6jQf#*!1HLQFwhmp*513kAy>)eY z9S?38AgpDC<>_vf?md3xu{76;G@XxzIGq0WBj*OA01_GNhVEb6qXPdyDb}R_Ups-HDfZ$ZX!p*uXGm>7x!M!qhQJK zmF$lgH1Gh-Gx7O`_%4Z$EwvQT>Jl;feS?c`zewu|3uF?&K}B5mrc~-dc(v|%$_WM? z{3ib5a@kj(Vaa4KUvh?8?In|uywD3p!YQ5{Oa|i_XC^8VVu}l7`dkK1kbICc*I7yg zz(MFt5DwnDJ#eBP#_s8^exI`DofQX(Mz$N*$CsFR!IC?i%8I#TqByQ=b2h%ES`ra; zfUL_D-Y@kVj$7r9X;Bue-&J95{AcRP**cUAG7#MVPlz?)h6n+X-}s$zHjFo-U;kZn ztQ`A6Jv%%>T&DQ5IXyE+4P5i7#`=wZdZfJHukt&@Ik<*}HK2CT)}dz@1unGoqTjkR zx&MhUhTVi>j1OEoG(%M)n~X?b?nJ2Fcg7tUS%iEvcP8s0PT;L|6v+?BL)FH+2x=BU zX8Rj#OdlP(qe|35pXcB?5UbUg?t%IM=OV4`ve1oD41QRTd#UT5OkI5lp#amFKV73f zf}`Mek^c}$%H&-OANAnAA$iOz<0C7UG&k~>9%y55Jvkgo9K#d&LZ8`hLgrGMa`l}u z3qF9Q!mTtcTzE020Pze=jE~nkK-Rc;&MMe7-D%^ae(;my5PCK7#u*qzf;CTY{D@HM zNN>GrZ>xzK@{l}u0D0K>8XSB2u9ekVKnSzJNjp-=XZ1+Qb7u~3UJq#?A6K`QhCHs9ru9F0?k?O+Eb4i_yS@+(v zyzDFS$FjfAPpOclbI3Y!*&Haaadp*Ho>YKm^ckLsO5ibLw0KXF<&R_f+_dR_i0rv0 z^=vHTeGMbT;fEIbt;;Sh-_GMgqt~hP2|3}<*t_yM?coX(_j-TBtz8%+So-dFmYcic zLlc&jnFc55ivsxa_|+*qkgJb2_&^8Wt382{{z@ued%Tw3V52(n+zR?bk;4=MBg<^YSz+}L|6uj%?EL9r=kvPx&4_}~0Jk7n;Xnt_P_rP~wY z&saIBOWbQ07F~#YyiXpUXbYc1PldP3J(w)XkcsqUWep zYF>Sh-O+gsqs8wv-PK%n9gkBW12yPLJ3=C>N7iCr*_%zMw|x~wbP z^FVGAGlZgdP!u$|@#Xr1&Y6F}eRffEm)x?BUS6DCF-H$^nbz>$o=Lmj&ApohGj7@b zU^8svsRt1Z#Vug;nklOnEUiU%Ep`E49L49(*Rnf@cZU+sFzIeh<%-094E`F}2DK1q zARmJJj$djVsZR%C>hR_j6m8-ThfBS^f@_iaa0a16+>^4?RPF?fgCK%v!=?mmD@dE( z6f(22>M$BM&o3>1vNij&%0zLTpc2G`$kB}# zqm69;Mg)VOH+H6Nfx@>5_^C#jFzdN(5AaR8LPY+S;-;O+6-~9db_%OMNxAVRm^0~<`Op6h4x3^`B|^5Wpv$@j z5+QjMZ2Q6$aO1bv1oPAXa+XtIVe3FNOX|bVd{hu7-RW)9=9{>aa#}s^^~bd+6r8w^ znk%vRGs*kBP2C9bXA-iGk--Iy+8JVM*6hMIT@Jkk1A0(Kai6S!gp%T?32~yoY>8Dyy#4 zYWYPr>gfJ%YPFU};2#?CA~68QfvIKVI?(an&Lk1aDV4-?Ue7{ZQC-qF#v=VxfGAS1z4@_@VtG_PpAt63;@HK0%R(R{Ad_R!sn% zdC3rck|p2(J@8B4FGoH1N-QG3JY{Oxf<}_NIAWB2l!-~~K)4{epFKX38&4#ntH%79 zA0O~vSq|-M;gUrcFxyI3L$uPF-`R(zvRsA=E#EJCk(T`|K;*tj|45kpl-fa*9kp|v z@z!f0UbEsFeSAST?D2J;zopgSmS7p-?B5&qqmHV?uR1ijzw)bwAX+7MAL!Ehe7fEv zrYOfjmgWSo7ZU+YP)y3tnYR56UCz{hU*I4hEQs%r{BOA`NNVpIq<-h}30#_%YSP=0 z+CO~c6YrXu!0G&{1CbAj4aMk@Mn`G}&L%cY7lTZQwf+hvp-a-n2dP#03MnBpT&1+W zm2H*w(f=J&_s%XK)R#OA{?)R7<+QHCo|7_VI#NrN4F}NBy(<_UzMxC~2HyDO(*f^& zP3xhzcBxwTGH&`DB4?Q!eE;*i0eC0smRxQ9{z1d!ZJ};^Nu)O*IdCKJ!(V?ngi`ge z6N(XTKw|oQgMeJ|@BNOs&u$i2os_c&epg{stmrp~oz>Aa%4puZO(jEUMhTTjsB?Y= zhYs}2!O2(<$_=sX(uCoG{b{Dm<8ztVtn&e(d4!3oLX^ksne1y{VDB1`T*BGhx1P(}E(~+E{$bjZNC*Dw~XU z{ygWC9pqF27(U7{lKU2=RPL0juEKg^RVJ54J`c7G=($6|Qk(1ueBvm+mIa73$NqM? z`3V#lpv%*H3tAl3c!wIv=z60v0_gxqC-H#%;$1kK$ck06`=6zWWl$Z4vKbP?LW~@1 zN@*=Yl%eF)3{wEzLH#uF!I$lRzCf{M`rkQ9vSJ3?k=#0Oh?;7^iEKwVnGAZQ6+)tJ zeNP(PqUHwwPn3t5D#J^agyz;YPNSTS*eZleisH~rr1=niyhaDZLn_g zM!h3J_mczqCN5}LI;k9Gp|=}{f&SggN26C96icb9AjY^=bx#h|ulgmf8y@R&63xYI2dmdb;%H$D zK~)J;1is6)`mTPtBNi6Vs-HC+ky_8JFOV{<1C$hup3DKVqUMN70cydknHIDAguQWo z-2MCZ4fy!WvPYjBm#l4u?=h{#w^#s363!NLrq|LEdbGPZm2)(xg7IIZ4B`inM=N-$ zX`lL=mGk@ZBY`#jL$lS-Y?#ywmBcR0_L{*H^{g6$=vHiB1FOlQjpwzrM!>sny7HdE zC}o?RVM!10E?ha@#xVpH)vVHp*o z+EstjWw-IRtAgGFv3f-RmB;49mPoS2%uXw|#>4nrB}2P5QHrPFDac9@cwFi1pY$2k zpvns`cN$p#Q@2h-%gNsRY39MHnxrCw$f_;H3KhoF88D3qiN`Zn@CFoSRwI@Log?u?eq<$iodY zDM;M^WL%8{^Yiisai+iIBZwGbhu^{YQieClrl)vjTXponZ3EDk+-K0))%&DIN_Pn5 zBA!4$shFAe(C}Q@Syd~JR-$|jIw^5^zCqA@{R&`BbDcnb6LfBek(ne${mV~@ z6wM#^jdnyt*sqyiM}(JbFc66lODMxHYLz6<%GAafzJ(?osnV6GMuB(FwwAIihVlvUbghXvAK}J(g*3(|r&nr(a!ZH?G8oET|_M?BSEc=6rsjnO@x_;fAT zs{3aTBH`NZA>10D5L@iS9Tpl(6*mjz=LWz8M+BQWoU`zf0h zi``g%>~^uMg!apI+AEA;6~=OWJ9sd*Bl3N7lVCs+(7sG{wE*GVPa>Q)WG% zOKn`!qs!wo(!Ajvl6+##*@-3v*VoAN2HiP^P=5@YKmEHI>w_Cdm<8)k6?E}^&K0DD zXNM;lmM7kw`}g1tW6N72a)R16AJ|U1GrVGfN5&hS#!E;U<4U}`cANR%($1xm*ayja zY=Mf6R&)p^)^-7Fb3ny1E#kBj-fY|VuRTkYa+T7)ya3rXAPW4#e7g7|N~sDiUHn0> zidR{&@E92As}-T=+Ck-nYC7Sx-Hj6|_4p629;rX6{T@^zR=xh8t*I zt-qxHzNbiOo<+R>o1E!Q1?usnuFV|KA?xIcM$Q}0*SI5=J6sm8-lbA!G7E*=y!D!} z;+420VG<#P5b@)-mL3_Ca~^q69J1qhtB(-DhcU>Ui;;}VUA3A z(|7osL4<5A`Sj5WsIND+EUi(LCH~L&9;tN6v~hCDj!^jm@VT}3wSXL0^dBz8go$VP z#Uy1bX+_hxLppO+Vbk3HM$hc;`#Rw29#hELA8$L{SjilR&47I2?;aq;T{03NY zHfGRD0f@zM*mvj^p?a|d#kmBJLded!%4 zAwTv~gal~jo?{@Y2&Osn@UAc8c@L;x&XG0#2c%9cpmViI>|~NZPPGo>@~^BDyw0fA zgV0*>@EWoK1!^5I8hkmc^*`rOigU*%S7Ye}|9Zp(|f)Sdv^wjd>-vsp!AE96!Z;b+3 zwYTVOdAUjuBkzIc8CUV2KZt!0^y}_)nB8W%k{ZN;G&X3s`;s!QVZ6`DYD~)^pb-J8 zBYOSGaXkQ1$Z8mY=`O0H*5T>pHw@d)Y~kbf>%a3MV!=*qDW~;x6IznPZvHB_e`5FD+|4=1d>N>k5Z6?xkj! zQiFa>Do!_OW5nF4&X!ad8(l3QdTq*gfFK}}Y;V@(#)pAEOQrbMaFFNvk7Rx+nz?oJ zD(V|%aU7zx;Jz!P3mSfmUh>tx%$c$)&YBDxPEr?^t#X{C^MO%;{*1r-{UST-j~;gF znKs5#5cRHSyeOR*Nbg&-2b{C#H!Cm62!|wbopW64V;~M~h^x0ubT8gHZuHv1?oDlA zwG}ouU+h&=$=Ij9k_)MC4`Ioa$%)Rh?WLT>bLUXZ3DOSphsFm=mgiqvW^CnO^%I@14jKb!up?Y%=#t+V}bu>J4Y7C(Q;F z>5d5U-sO1V1#7f48OS{Yd*h8Ts<81V&kvrGI;%BJwzz4tF9jHH63t7S^YNe$Z^l`P zV^)R<$}Me>o=W$tT#D}(Su;K&6fExk{Bnlvw)tYlMS2C2s*6#owhsm23;PR+0bhst z#^vSC-9pO5FGtb-G@OWLV%F0hH^~gN<@(om7-*wqnnoG)<$E~J+{=%`eqVzwvClBi zA`Gf&L3}rT+vYSeH1+wDq+x^@=+T-oyAGw?bJVl6PZGM2f{1JOQtU7NP7U?d)zieY z((Xp4#`Yfp}E0PEQiP8uFQp zo=SgGvcNdeN%`}!*nO!xCB6T;8ar%rm$OFm`p0f8kDZ{}^6{dFyAI<^n-OS*MSB0E zfsp9cyfbh5)7|jz%ZKTwSwwc~(Hh!eua;U=Sfc6y)$o}@v3S2|2AWafJ7~=%d9Us$ zzLwhj1=4AqXDQHf`}L#jvs`JG*cwqvDMD=QB?Fq0JdR7QG=?J=UiVA<{oK?CIK^|X zp0g4a?|?^zJ5nTTHP=wl-09w6eA&-+QKA+$?(mUp+G6nBM+t!cZ1sIxE86Hl3uW6@ zqhkKLYw74r-I`F5he@~K|66Pnq9~zV+uh$d*8J1(MQv^I~9A z&(+@jR6=CR6OJwZoApzZXgO=`03AiWeJnnanRc;fs2Vc%TtDB74qPX6*Ng|yCBP2G zyLTm-HfkiuH`QDb);v_HxGK^@2v0XXnDn2*6rN(a+*X>~c^eTZ5LH>%W zL@XAO025`PrmeorfVm4wz=>|X4+H80Ci_je>D7D<#nMjhMXZItc&?~7dX;wE)1mnn z^U5c{&`d~9DEr0F7s0v{uQ|haL0(+Fd@GJ0hJ-XN#cNLVGqm2WTItu&@@`*IQ=7ze zKVnIJR(V|C21!?FM0&|5uM7{&_$$-ni$~=HhHjVaQH89Yzk0%T5S}f_U1fYddi(&(!hC zio!Mo8WNN(K^anL#VE+D_v?mEps*eF(Y6w5aqs;UzbAc}?_3T7K@|Bt8wPN83krWP7`L=C z=cL!8zTr>vnTax4(XL0k%MEHAZXfxzk~}VYwd*$Znm)N#wRFSoyqIYNOi#fXHD|f% zbf%`(=IX?;Z&6lr_U;8-3|2wc(C+gZh`LqEdRR`--_ZBZD45LKfjhly$}rzSs^sFMiG1WL6?OwkkEQa*Eb(?mBvr5 zIvhVKT)5`Wd=u&3hdt*JdEn3WD|$20G3Wb@PydZ1x@qX$`M&Oy+&(6_+e3leU)>&( zQrUc-ynefbFO~40V8OdTpBbr-Pb^!hI(Y9Fe|lkeiWC>8*T6<4xcHRtalHKWxhvsh z8posGR5;`4C#ZM>iz*9yXRPK$*cZp zt%*VTF%s?*WvyWOW|!*1l-fMl4RxqHKWHcQFmmoQGGq#)2g-QPmy55|^6K?!Zi>Bg zkDsoKcK_ZRbNP{3!!Oz)?V74%Tpd9xW(po@T8o`HjO}CYv94{xl7ki9jzQfZ*TH$s zk7;R&(0lS8RlKduz4HpNPX=)B)_&dp^(r==GA9|Ps5FN5`f!UGVtn3dIpz41%arr!Z?uDsj5Pdq(_EI` zga}{WY-`15ju1@`R}YD9aikd1O1Zu{;L9+-R!h_3>h(DJirJ$;=|kUeaRJLWv-5tR zEmBscN;&}lI1|oH9Y2!{a21A2M4Dcg`r@fbzTMemljrS6>H@bt$9-O?j_G&X2hww* z$-?jQy2)SMEVH}%BmwL4Z<0UEUl$JqPf1HCt$FZyanYp1Q*^+l+QSe*|C6p z{q%sX$yVE%MP>7G|8~4m-}Bo?+qzrt)+z0^0jc*(tR$;3^~&>AK}`qgN!rr6-*s83 zT32b*-lrQ7k@tdg%w$AF^au9{;7fxKPN_9zQdc#ZzO85@PA?NLj^-*mf7>@daO3w~ zg$i(#jJ1KFH)LxKM%@m>f7{|aVGAZKI|Bo?hPk zxRkTkYLQ6koN2!>B`zA1smr>Ictt>;f%hjaXFC-wYQWqr&%#xeUTBrur->C2=;$_cmYDp55#gHh!sia5Hn6IV)RQg(r3^U9?QEa3lNZ@JJrn z)6DVEaVtApv{ymiQ!{r@%AVbWPNeRu7{o@^YYzM`DXZ3*UKjYft<9Oc)_!6qzq;t7 zJIHI3&GK0c)z>c=Vv)zkOX7<1pR=raxp$4J3Q<6yF=;5!XT5nkr2WqV(9k&pZ=pZ< z{vl0Kn$%~}umW4SAiC`oCqM!0^*s0p$oWVP)fUHwfyG^{{LA3Zt3CZYq%6W zv-L3hGui7C&;J0z;wYNRlT#@l7V(XZyT|HTP6TNOXIUw!pUeyl|LrNR<%B)^Pgrgc zHqP#3ycsV%7%zRV_KPJ)!?v3)f?>WZDN8x>bqd?h@PbthBWP~xS~m6IX|}$PG<@%Q z>3-Br)bYZ)+)xH4m#D@%CKwm?4iSp{oJC}+nZLD@sHBJd*M1{-gFBvE!&#(d;EPv^ z;7A4GsUan87xHDhC~v&(dNO@mph^YF9+1_=uH>wSITO7vB+oj!(Z|(!TEfaEsKpJJ zQdjR+zIm)Z9#WH=))^B2yC(ljf;2Z5kj7|p@oOoYu`b#edIrEse5p7Yd zLpegOm3%Jc=oFK(6^Dv(&-w=B6`fh)$ueTk%VE3favM@fb+N z%!(J??dAQp;<@u^RR0hn>P}`{ul&Z1rFq-|s<>jVa<@@H9ZdgwMH+Xe1ji4yg*pe_ zRmpF*T4QuKUSNdQ0TIhX@2cTO$p7{SNh=v{PgeXD=L~|m)j2lNWB+ol2F!u`GXoQW z;y(SFbb$`^SWI63jNU=9hjQsby29W+oC#l?*f4I@NDFyPq6%@o>D}(+SW6k7L_Y7S%02 z7{)DaSGGMlv&6-HrGw1YK1}~Dn)nK747n?NKpj!>Y}je?4q@!YL)=n^0l>&eAI~uU zH0$SBvXQHKNjfJHx?{9R0Y4S>(TF6nK#v5pHhxwhwh$oU%=oLs{ucwl`p)BAcIvW_ zTahiGcry)V15~7jJlxMXi6hNW-eO#0NJ|G&DjF{I*`e$3+N%dal3`$55#gic{80;G z8iiJ^68nQLnHl93B}G+%H_|&Sgd~$bX{Oe+hM&qdTINqtWnZ3G60tm4SHgY7bw0J@ z_=+G!(qHw1vQD~i+C32BT5CmdjLK=wY7oagkbOyi?QgUHt|5oNJ#;_eD;J~M`4PqW zVEsm2ZJW)s)Ny>9V7Pz9iPMazQO&;V+rV7!M-Faqmfy*4=26XmPwK)oNW~8eyVSF& z6-k?C`L(6D1W_XxO-GflZ-&0b^?`TGM!QtFqtx*`~N?3{zm)=g$IgmYbwo5Tskt@_cR zC444qyZ;y=OX4tAR-f*aK7T#fiz(=I*D0EXR=j#q)m2R9%ue(wSFj2JSU zP<|$HainhIay46;-Ih<^m%l3x4@G@u+{tS(Mbhg_Nrq;DBqn}^FM`0;QtrSIXx(4%CyP1_+nZ;Lt&g016u3Ien2iiTXLxx>$B&^QU}Gi@;#b zQx>#(%qksU+C=GGFMTI>)AR4%edYb_Y4&Yji@rDi+Vx*qFrRVJ-uk96^`GU@#&5U! zI>Fp8F-}LTv=RL(i6;Lgm(e%sP;elnptE@sYJNKuFLqZLJFKDeGQ2{QIom3m^7!ohL-$BV>DzA-*VTs>fz*8CSEp*%1^5&?=!j2e z`H5e)AB;`y{2Vn~u5905#eOMnD^?6fU1CivuA@GUDwwbl{(Z_G4tB?8$jCnE7l+wp z^2fc~#XSx;V+xxn9fvfoLKR`=Zlp^AlcFJ1ihhci*rAq+a-#B!AT3EYn*Zgh$?w~W$79H91F^yN&E$K2c*z!d)~234s+roci6)jlWt)wR@-qx; ze&<`)rgy5IVn>QngX(X@&0EzieerV&3_~->TCAjlaKlS zDhmrgV`+_e+AkrIAvQB`^!F)gNcF$iE>e?FZ;CzPQdjUX#f#D>IQ55Kd}S4O@%12# znAnb!bi)wnDHf=VO9xzmTsIb^%dYoa3g7uiIhQC;;K~RhVMB?#(Dd3~B9H#FOUUCs z<414Bcr>FHf7Cl0w8qeWvzZ;CR2sB0E{J<3s9K3iWb+%$;?>6a@;6)ubClO2-|1we z+a6W)YX3#s!YgWLKPs^dO3FDmew+Vn&+~2GvSGU=0^oV}-0~WrJ!Gs($e)GMYcIzV zzxDd6!?iX)42a9{yLz;@aoBxGz8d5lrfsa`)z*I5obP0bFKw*XUJmdMTA;Q-XkiBC z`W{poproiz8DQGp=(q1P>*$juWBwh4!V*{r&?a2%iLa><_1>`8K#(f4koPj2z zh-pR7o$li>ipPDBZK)$PK#m=Gl=mV3Xe(%h#D?zY6o_Q4m41gL-6-Kwk?_@*gb53~ zI=zVyW{=e!-p4&e#PMFqx|_dIu9oq|;69#$V)b6Id116c@QK|?@urIW_ZQ(0YQCp< zfP#l_3*PGPT#2dR^XKSz)){%&g}X^xb;q*T)kkHfXm#t?9R`kUo418je;!#|0})3Q zprg`Sx;6K8gX~i#(Xy?G`w(`*75`AF0ni7dy0NEqy#gZO@eUw+dD;zrvO^AcpKYKI zqVlE^%sj6xHT^nh9cvHzCWRmAAigs>2lFTO#Kz$)Qx%=h=&#O{hCRU+=f{*2(Tw2H z#HW-Z7;ao2c}<@MaQxC~zfu@oar zwg#Lr@dEqD&L4y<6TvX(TU)=oRea}SYE=z@Q0f*Iu-=2lf>|t%!Qxlnw*#t5Z!}1= zCk73(5Jkggd2Mh2Yc&4s4B-2t+L&Yad5d=KKJ*qea~tSPpn0-0afc*s1+2%ds3=J% zu#E$^I?ljXQ&-A1Xcj&ji$4)u%#|%Uz2T5CxL#W}8r^M?#1U~IRTPrVPIux%$keAXH+VO2A`rV9DWg;)cK`$k+Gv3*->ETSMU zsl^1wAn)#M3F6!m!lfVAb=tllKwdY|hxOo-ihOtfBi~vmflk87oireZZgC!~KcPO@ za*5c~a%>Dbpe3lvk9qSry)5_0|OA$>5Ta;$ABHkT9QE&t9oGPgbkt zPmoAs@VX^J8V{P+^?|!lnEx*D`X?auX5afMiCq0Eg;FY9w;<<#LM+MKL3b*#@8RVu z>Ep7x*|Bi&NAVRXvEtj2SsMUStelzw?hyp%>JgKqnJMy$C}LaKY%u!WO-~&#e@U>o z0?(Yel2W4WqX|Uy$>}`%7}L<9M&mG&Y{3eBm!-7XVhRnOJ?GB8Wy98g=XrX;(a&E! zTwdDz3DxnxXo_yD75y9HqKPoceyh&fHLA2IMT7ZQ7Z&~lqyhFU*I=&x8vE5wL}Ph5 z{U9!p=T8Ub(;*k^0ZCE329zHu+9zlrh-mcW@PAU%=C2Aq(|6!CpmR9Mflzt z9(iLQbsr|SzfoRqW(GvKS8g#fhT+5$-Ad@kD2opU7f?DmD#012mjX*mq!AgS8$J)V z?2;dX3&zJ-1_zR-(*g_>AQuIG*gve_qd=jpjvrkGB;4m$({nZewi|=7QP=YHUw@&u z=M|prt4a5HxCxzxZj>j2pGG8ZVvHo2ADB~pSh=?FQoCc@ZvOACrKyWgGyP9-Hy+Y8 zt32h4_Gm!kRsZb%Xz9Qy_mFS)ssuA9y+H?=-;1`aVPLQM%&h=@{_Qs1yc)XG|K`_s zs;8!j+N$Cbz>s4E&qyIj0xJW6;sjXnO1d?Cq*kUh_d2bEwZ;(31m1tN+v3@^?Q zBlqh)2Z^_NtxWr{H&Yo>NO$!XbFz7-+Ih&)w9(ZvthZTTt5N4$v5^Cmy*Yv(FL4V@ z%3FYqxkyQsFe$l)L4{iWgX9*J9eCsodR*!;@Fwh{rCc8rQVM>PRTvD-*esbs2*%+o z%*^g&{Zst!`L#RNsLWF$Mr<&P86W!YI1Lhmv$?I4TxA0YcW~{d&reo?`elQpEy>=* zq#8Mxp?ZfM6kNG&Hs^kn2JJ1i|FOC-_2g$6X^iQryw!&VXK2n82W9Y$J%2V!d>bGX zf2*h)h0zB#afp$!x$f4phad7(w&YeR*vYMP5W>~{V=wgrV@N-K!P#97!TC!D&kFZz zBaXnK9LSEQ%G~9^EB;4|3;dwYIjpTv8*{i6>BCG6uKrBB!?Vc_PMWQrBx5@oXGsQt zv$08|3v}IC;?Z%2pk16PmM1@W&*&huu;VyORT!$P`E774v|}TtZ0F9OLL@abMX6sR zCsZ^;kiwUv1MwS~LNuQgh&`mKv(muYezeomr)j@EwQb)JRfbC^@34X&sLIO&Bl7CB z444lM{em&(0tHar(*3SSUI4p1p{a)((hYIqLyMZ6w{_(fLX@sRfEr(@@ z<0Dk68+I>FuCg3Zy5`hQ<8UF-Q^~+_G4>&7>EGR!QZfu;mXSn zvJFWOo=5#x*ZDe4IPa7)1=j-}2U>Q)e*T8r{WN|$ot5-ZS)qP4gVKHVB0>~;u1UAY zZ@xNrMcAfFQo7HI?(vmZJSj=vBJbQ=Olg_kH5?=U3Ocz6CJT{rkUq!|G2QvYCGXMY zpo%kdXLS9!(iUNKUV!xWDnnv!O7bf7%OiF%#kbmvS+9PNSF!neOsoI#r23O|9^X|^ zT$xu`XZ$It8>Y8Pfqa#V(V$WAyJ}pVKH-jvs;yON`gU_ep#Z;(y1nrD{gWw;j0hrC z)|rkYHRLq>{XksP1MjOz-0K&;g%sTWkVFkuUW4UO97VOpF6^OMmazI)C5cy z)3-d-nJ*T!FW|Gq73%6{sDVzvc%75dWe*oA;LDhm)6DC*`ZenNs<{_#jC1K<$5AgG zdW`swu?|G+CdUGsH(Xi=yyn4pXI1ne35=XkI=RSfpbK7Hr-ch0wSgE-ZG^N26gK zjbsTfYIea~LbmsOS-Tz?a-@rgL(fLBvyjy%=!>?|i#qH}@MD_qY?zXj416-|V=46@ zWv)xH;?ND91|L|9))k47Fl&92DI(mJKr>dT1bN6=xA5velE|GLQLY1Ibbm#KAZV7R3B6Z#c(Be%e!|JTB;CI$<4|s)6 zNMi(`y6n$FjdTZDkr?P{W;0A2qrme>7x`c~$$((J`nbU8;rAOp)s(C~Y-?#wf<^bQ zE~?$%@{2;;3R;Qs7cA7d^DIvaHY!tX%1{btDEiV?GWtzDTevz2o{(=Eu_@%^LDN&X zrpA73j*A|>Uhtm~wK>NKPTIpG)@5ZZ#D0==_cru>Z7^Rqwf+9qMZ7+-y!IQ^!qu%7 z$;Eag7cHpH+7mk%GhT(fwqv*NwXuW-^dBWvZ?R8R4%Hu0xKxgBDAWWGprS(#Ks8PX zPFMlQane`^Z2hP@u6uaun6lRKFr=B72|i{gPt~0y`_aMKBoebX6qqMY<6d-7cimIn)`qkfZ?b-U%7Czog;0GUz zGYhmiYMCR&9|ELmccKR#112q?N3-R!BKEs_HPEb(lLo9KfRSln#qbh-h-$QMsr(@P zOjqmKRE33M|Feeh2-J&e?{QQscJNdko?mx5>k`Qfc$m&a4N7ZA^+>R1TSNUv7fJdE z>fN6O3;9@V(}V*-hbh0a82y4BqggBHrym|EWLq zC@SgA5)}*zVR{)RgHZ@8{{S_ib!P9lt*L<4&aHX+U(qr>u?8q{+?_Wf4BEmYci2`` z&8oTY_6+Rc1b?tPDK~Q0eo0SP&+MQy`Yv^5$h$o=K}9KawYsH=w(;%;Pt z^BQzR>v7x?XAc1CSWA_zU&M_n<-Epsey+GDI_uY8NSf+?4lWA*yF3RUcl--k5CmYj z@o%}W5Oc#JtM&yiz52*n=rB~ViSM3j*VXQ*;ryhKhDvAHFbyvQZPf0DP z?bq5Tp8>H;`h*M)b|?#vj#7hLt>q7q@WgXyeQ}*YBHYK>BvAea$lO-sr@$AW`NE-@ zVvy*tW2UR>9AKWzEe*9Iy7w77=@)sMCsf8-o(hm}BgL)fmdXa`om2ub_#~^4QVkgRk^;FDhX6Ui^QCqFE6|bXyB? zZe+%G$sx%K-{}tMl1bS;N?6cC3Sd`NyAdE2Th4OA4_~5h@#APnTob`v8-UOyLbhe~Ep^xOt>>b`ryNRVH>g)Gf7GEe7khrp%r-B+C7I<%!@zXw_a z9~s1Yo>$CBLA~&+Z28*p;Ax&N2XE%zI`(g;N1fh9tmfp-*m3B_KGiQKx9+ zVS#K!maofqH_i~g$qjcyJX;0)=I_etl_#1t42bf8&;@)mUcN?;Ab)B z$|Dj&<`~*PW3L|>2bj7iia5-^_qT82$y~B~ge`Ljf>aNQeC&AY=W#KQrb|?sf)E&? zzuQmnoKBWNjvgc;rOdh`y|)ui`UAmd1E<*tibX%@t`NTmxM_9B(`;sHiG@nJQpH6G zZqmM`7M{r-{B|w+`G~gZrZDT0Bfey8da96EqSy?ad5}@0z+T01x|bus3QH*WuTx>k zZ&A98hH5C-V^J{!5z4tar|e$W0!uY~kY|N9 z@6%-#67TP+WoTn3A1?DDx8j1uHAGdl9tX^wMAOW8_BuX$I(SNHuI+QNLBmG612gOs zGRt8G9ebxBZ_4(o?QMbNmpXta`R>pRM~#jPmdphPM>Fa0m~U=a(|q_M%zUNof1IeabazI zyD_McAE%V&i|9Nz@Kbn@qUpx+&GWiaIP1A9KpojiAk@lP-x;adr?=7?J+`hFOP z^o&_3zl_j}Zx0^4$(^_&=!cm`053~^pany!_FX8{bK^#D-)6IR$*I6bmCGt8?&p#c z%WL31Ao=u4_4z*%1*Py<&};R2_}$jZy0`97fynY3{k%I{LTBzBvV9aT7NKUC3|Wfw zu%$d`n{OUtjR)QF>1r)P&q!&K)CDCSV7uMh=MGlRpZBry2R`-0es2f7$wG^B7+c*k z@g43+i0XjtZ+)R^ulbA>RqWdCJGek>$gyoYJ zfw!XD*nWlDx}GN{0TZM>7IFPSz_zy)AQyb)ryNfm3rauUmhiWfekzYLz6e{xxWlU~K zz%_O_#kJJ2laE#fQ9f9>Y%mA(FNp@a{rD)oteg${`W*rsM5&J6jqE+uKc0ycNF$W{ zTqKo!s6^N@2{Z)7i}?Q+QrV5)r*12s-=>4uy>|z!6PmwubPXP?R^%|{yKaqf)Q>$q zHO5yT65r#iL6>$x8=Ap4`C&DZ2RR6L%M}X(95LzmhzK6@T4|;vrtfq`%29s}s-%H+}IWzR@&99A8OeWLUp)4gM zrNq8eA3D6^%+_7SLf6g8W*#qco6wjRX?l-BkL<%x(V^EM+$&qRSP2qUDy;hlj}CR2 z`HcuT#JZyteV8ktzeV(}Q8j#gy=uUj8G!GlB`y5sAJi}9e!jIcs$Swf`Q)ZRf+3qp zAaz4qc*|b@j{OiK!qTU68)yH0!+H`Gor@_8@J%pM+eur3pkp;Tz}!4n;&&b>ps9cC zQq6sVwLMa?9adMgYd+4z3EvBpw4bP2@s0*i7q$dTBlTL~2Nc01wDIa^#U*qluCCu7 zetz-hy+W^nq!G2M8Ara&6*<}O^jD)G9vj(CuwMGuT}Um~NC z>{vQJKi!FoTK)Ue;2jJHjRBW%AFe|M>!PqGC=r>B$~h{ulH`uN`UNp3;M8MGg8KNO z0LII$_8&{f8bObrprsf)B27KE>|GVf1>EsJt7W1zsZ!V z_G7@+o@Oe-9im@F5!nw_jiwm;MUWi$z^@frhi#chZwT;Z(j`3GqYdCg+=6z@ry)xX z^gqm>*N94Jt9qsGT83-2>biC(IMY8S=rLvGTMH#trGfxN@K4?jW$r%O{wpyYeIpJ zc7S5ps2HcB{!1rXiZ?f%U0@}FL*#g-oU?wJ?mwZwo7t1$?z|~3e`r8MqMEHN@ShU) zC3;6JEDxM6_s&PdL@XE)cwBEz-OUdsh`I}yjdD5+7?cHNf6(rgxnY-X9z; zv69*3?W@Z8N*SUB-WGY5g>6yLJ|V~t?S#eor4zA&6l3sH5w1^V{S$nvB*31(%#X1x2h~ysPSAyu7o^OQ zN~>?CT*qtBAAVW_XYi*q|KhQ%KQ!)RSjiTszi+JZphWm2#NKTVhIC*r#x;skbeb96 zBRyY}xP)HGAR?uYgq^sY|4biMQ>Dw`;WhjD1Mkk^{D^4O{xRGj0oTVW5OrB@6V6^Z za$4#2@$%Fbongv|D5=%1@Ba!11)wspykKqf`JnsKU(elKX633c(>p~H>lX54m)zui z=PZ1;j1W+Q`FXwn;@S1tlkLz1pKRj;9(VY8?<5*Th*Lno7V!k^yue4|Ny#Ky9unBH zI%10+nOAi4dfpq;^^fwac-1mRY@X6NvwQsgg8l%`#~Yz?mRE}w2ZcvX65uUHCz^;p z7v1@T+S06d4=@6u!3VOOYw&>lhA}ldmOj)jj-p!oKXFWV&nwv^qkcd~Zsir8&Mi!q zBz`0}TKuk6)YORubOQmVJN}(dQ2z2_URdc`kg)s_#=6(Y-~|&c>Ir5?rW&*()lv7h zv_>Fo51T3YdInP=$iYu|jqYV8zg*3ls*;OYKQ4s~h(Sfkf(VQKZj2&Zg}G+NeXH;C ziM*x{Ybq=+KfU&Cc-*$8TA!TulH+r)=Y2NEXYQ{wXLV1D+=`q8KZ$Bf?gqR3`x;$R z+;r=X`v`6*TQI#_tUAypkO@3JzNP*_@5xsqjDb04tjtlbeh)usA28ry(LaUW#Qg|4 zO$Q~(t_)qwH!dw$oY#!i&%#mF*sg`~Bh(IdeGQN1es$lh|5;bJ=Q8c00`YO-R&xfP!kH`pUJ85XbI4@|HU37F zQdQIqBcr%!Qq9!$dz&fM(SRnf@a}6pC$w{?#rjlMNQ7BfPBwsG5WEqzalQGQkmJt^ z3|P2eie#PMi>0DocJ2fb$=E0w(l*p7ucN*S*;&>0^;_8`lnJT8;>#Y~UKu#G2-I8N zyW&3wc1Bfw&(Hniy~Mzj$=|n9_TH52av_nD@3_tt06;7S8);i#Rp6R_K97 z6q@d|D6UP+D0p<`vv^*BR{i(P*=SwEWC^p^6De!(r z{SQFIyJjTp&8ZE&P|TMBcAV$T9m2Hi9#Kz{{X?HbJpK;C5dj!J5VmMc05>ifSelA- zYbZ2IPHL&X374En!(^?icLRd~}n2`U(-5WZA zRT)QYHW;;|2;qBbfja$%6h?~%`nOkNpAcxogRvW$c!9z1FIKMqvIDu12f?yOEu3J@ zC(GDeq?bQ_W>#rBFQ|Lo?_v<8=sUyI+=Uf58-CN1dG}A7Z%{^Y*l0Db_bQ8O@JW{E z!{b`3o2++OFBFL-bW!mVulhicqt(ZeNq@g*EPVbC-t+8yz2t}A7;Byr{IblyE-`pr z4BZI#@(x;Dz)N=QgIKMr`W=S`X})Wn-N}}{?_{bur<+jc0u-`UfCFe0h=xJ@H|!sH z$G{OJ0|9rlRx-CR=;rgK&M8j?(jZDZ2H`#z<4*VhUd{ge7iZcC*H3w2 z(qfR$h7qVfWn%2NhxYdTk)RbJPrHFfAx)kQ#DVI5OT#wv=3OAQ2R`TYZp30xSft_Y z9iaccX;|aKCVU!Zj3(D=VGW(I2Wy?Gg!{rm#>$jtI=14;PNR>57kkl zu((C;^MF(e$mHg5C;FOaP$Uiv>(Y*KU$~iCJea!Fs?XEI2dRZ8l{sD}3wNE=tsi;! zW#dv0x#5}6%YtG=tCELC&{!05?tnxj%PKh6_;fppR>rPp5~DRxptw5Kps1z!R5Z3S z5v+Spp_KUG+df%(FFcy?`TmV;1=2D)Sn0{HSHq9&^UOp*dtEdxjoe;=PiiiEex^w0 zbm!?l_;b7%k{oS2?4>|qJ6-M;vd!^9W5pBa%UY1#@y94w?gN>182E1D?I+1qy}5eh z&cuvuJ%9cwh8b(v+)_w5(% z(!Vq(*cpUj6CQ{VwP)vSXV;*;q?;^Xw?FemJ#~*4s9sL<@VE`lNmMVEQZKIh6~{J6IEX?EUiMe#@`WQhX3uzZ|_)r1AtwC~@5+?zPi7~Q3Q zQ!3cg0~s<}ITibefcrB&yZ9%?Q{wXys zgMv@J@Z*PhPKOt`T0|>}D1vZ=6O`AF>=cM+%wFE8RKKeFKlOia_1}uY{or7NHuJf} z`0jFxL63g@?Y3snRsMN>&8P&Gq;fbVBwx<+$Q4==XSI?@%IvVqE;aR=zxUrG4E!N? z9j&ZrOfE&21+$#Pii-al*xxXDV~nx$E|z)>*I#LmkBcS_D^GSTc3c353SBRza z8h6gB+S6XQxj_&Y!1PBXzEJlzCBm*dt%XaxgGdDkmv*7$ zeV18pr4^%K<~MZfzrTNAgE~=X$G@XCW=!r#s8&-#Hp)6%*_h>&?1^VbJEPWsA7Kzu zW?<1S4}o-iJ$mq((s=9-&|+df{W`yoF!yp9_(N_4gig;+-hXqCuKnrhTnQGn0CGYC zuIF`!O?y)4dVdR-vG#Q8l_bvr_q8b2_qMNd$InH5YFHOVykYXjE|F4Ub588k?2#`_ z@>k5e`)>GMSz;K247niWZWLY~tiUHTEvWTa%5$Bc#HHA!^WseDYo(9%t{ zgU&Az)$tVTTXVquSK7X@05N1D^`YE-awe22>!`8^jthAxt45$P_Np`;CcY5qk;Z&r`XUZ4)cd}^U;|Ex1bY1o)j&~d zG@)qn2D;JjOL%!v2&7Z);j}){whZCIbWN;vHi)2?v;uzIUB@~yJN19GvzSWkKG^!) zS~S&snwAmz)f7ohX!E(;zB6M1Ees*%`Zpd1Erg&KI#xB%24hHP8P2L;5%U3>C7O*i zE#+VSwWrlBvVSaxXjnWC3HfTA@>=hus=Ni_yswIfbA?B#4Vu@Ys;aoI?)wf6{hPc0<|-da`w4X)N< zAEf7To1N;$if>m{49J|iqb~0X->Z$1INlcs`?nl11LQ(=jqSd+J)vZe0+5^0;m z*9Z@0F8!t8ieR&J=a3-@&SKYr8^9P=B`LBKQs8Cdm5z&g#AD1EtI?eiNjn`w(R@8a zWpb`W=WL>Uw51LvPkyqgwo88t%%10e(WD8^1a>{*S4yuuZqYxI{cGc zWU9!09n8*kG=FNlo)$+1nKJGji+O`_PQBBo^wB#lV@FHiCaw8Mp?Nik^S>_bN&e6` zpRsp=DCM{IRE*5@6Gpy=J95S8fJA=;;w(2cOE4k=ufeXca>QM2MpNHuh zTLl}jgQ*OJBINNx&5d}_0IVLK@fXX=;i4BiI9PFkH1;l(*%4(5f(II^gs{x2Nx0s! z+?zz{H0G37teF1(E=LJ!)>%MtYV?iY<=wsBD_{1nmQF`(rz=cmH?$(9;4Y78CnEo* zIF-mRX2SZ+ezEAI{l~A=vDsL?e{27K?C3YF_X}tMdgTQ}v5@*W*m^>x{yH@Gz2K9~ zPcy1O5s|iJP#bRSO30QbGI zJ_g}M4qd^gGh+=#@Y5Z?1x?YjUHVlOuFCWmUl(%!o2a1-b6L1d;q)Ou@+4PU!m!K& zWNHqhDQts|{UaK!b<~I)q7HU+c&TKgsYQ(Jm0IG5Y9e*3Kx8 zMW*`c1xJvqmR^r;$W80#p~@o=t4c^ zv@CcjIgdOO{n-9iQiLSCnnf-JXOblF>Ej`f_Kog1^&+PZmWIUqSD8M1_~5KJk;O;( z&Q#EkOXGc}D@_9C#>Mv-S!pa|r|7wG@wK^kwDe9#_rI!iD}}!Nb+2Kvna%_Ge9KOf zzv#EwHDx*JcU+|Rsku1$7rzoLm(^$@mIexwO82RKrpWMtIg=$ZwCc|Fmv%2o+yI)R z>9;vfRQuE+BXShb!ue3}{_L-9PWWDb5pj1cB{P_9s9-%hYW*H;Q+8(Q<7TMeRxNn; zAaMEzntJ)Nh^#W@#9SALpRuI}3{Z14?~ZcZj1A@$sCa=qa@v|;3%|K)Vl_OoW>`o! zVQ!@ipu(civ*3@F#3B5l3y8R{flx`zcV}(7EpHPcmjCN4ce#%7$LIVXJ~91sS4OMA z35_0^#JkCSmJih4zL(K5s|Q`}o8Tt#k%d}?FHvzkdC+!6y|2ciPcqP8f<$v(N$OPB z7*{z;GE(+=lMmlwyKjhU>vXt#fFm0QWG-sf+lb)%*oXxauW01*4hYlk^?x*-_dk{I?|{4_tQwm!QygxE_^oLUuTK$^PwI6ua!nW1Yz6{GO-L3 z7igB>gl_I?pm;8j7vANQ;d`w?Zn|Foy^Ue>TE0=UBaQpy`*rI+q0(q#l6WE~*g`pq znq=?01fjSys;*lyhRIzcE7)FAYTyL+Pvd8Wf6DHrN3FdtfRJB=5V+>6%a6T=LF+eK z(=AJZa`D0(og;ub^2q^Y7xpe&)<({0w0`u5RB{pRKQZdTqEHF>=qNLxmX81WHy&10 zbAksL@3!l|%NAy`cvwS=2$+B4SJ0%IA6hSY>%nVrGMO-0ADPJVb+0?dr6ul?Bk=Xh zqqUFJaj$&@-bCt;=jON;m3()C$Tqu{v4Dg2L6iblYem2@S*62;|K8@J{0Fr`$;H=aeZKsz z2C`Pii`!}|=(aN|L-K@XLbK?-t-_}Z&!TGj=$aPjW$6d{_R4QLEEdAM;T2w^Z?sUZ z2mELruD;0FcPT-_@c9+lj}t!DtmK=Q8v{UY#%GZ;ZeozL{S$Bih?9iVeA?^S@8Uck z2BNdcCE+30f|H1JuMQizU1p0GAF?}}?!%Y{rFkH=g8jX?Q9g$ZVwk>jTyp!VK%;kTiwJQ#;=SmpC_b}jxv$79pkLwc(x||C*SXbPx5{U@Z5}>bNcUB?q*Lc zrlA!F>w%uvDs-7J*lp;2!(<((p1n!h)zd@!{DCADXJJnY)3ly0ZNc{R&1Gefz~{|| z@6Gcb>EA+?8gGH>3cfb70<&K9?A$(NT;&lpH2C+^MxV`l@7csMu4cbO2XWN(4->^> zR*|(3bZPT_P$1eW0qP0rOI2eA3CVASPYd-lOdw*2dr%UL_) zhP7aEo0l*T+!oHc!fa$W0S- z?&7c@s&#pB+Q6Hf9=t=?q_WwY<(D1Z-6{2fmaByp*UcReo68SUTE_DkXiu!z$-WO4l){5jcFH!=Yl&@?LuUc z;dlkL&Aua2xnOJrW{&#-@pEiBY-Yod;t}e$dd?qRe|Fj3RkOofZ*V;!HZAja zJM+hs&TG~=R0S?Vo@=l#a<*uBH~eOrZgn$n{W^|2+qbO1?gPx6+QwFs%-vK~`9=X` z_D02mII~b`WAPAEyW);;^uK`_l=(_~r|9XC_tX-q5?@FnoB45iG@kxp5Ki)R6-Vu> z^ouCl=^x$aaAnz7WH!GNIBG5?Ou?aUEy%0ws{9jzhsSW|6Q6Z`S#STpV*e?KaBp_o z(L&YB#0#b8qD_kBqLvte6XPW>id+u^X#+lI)8yI*IYji`hl`Z5@o8!R`z+D8LHUqKKW#GHq6XG@VKJbHwjy*^6Y*|+!qaZ_uQuIr@(3z= zX>Q`oOU@-RRr(;S*hadAYV)8ti3;j1AO8$13-zJ0)bPKhA*WP72htFaHbg&962#Ge z7@9&s))yj~G0x{eGht8PC@~v5bn#Xvj4m}K-{r#=Uoa6G(i1r+vUu-hmUW-v^WF<_ zh0-PUB{>9%?yo~UKC0bb>TdI{>`d5XI3g0gx*e6Bd4-{i1E-i(z2ktLXz)Bh)N@`n z-4%Bp33zt2ay9qHRM_hayVxIBtHR0B1WS!tc2woKscs$V1=?bh%N+Ia4}6}=9-rU- zT03gi1L%i)n1{;0XKdN;Rj^91bzS&jc$~OvFqJKW{mtrDFy)I=J+{hQt`EjIcW|kz zGP$$*@I5lC3WApeBBp_sJ!*1ocHmOYG7=)J+1{KEh|E6yaPpahSI?0qaS!Mn4I02$ zpkbAv*|z&o%+GibyWwBf*!g((VUzfZ=|BBWpD#`j z_vB!0ZJD>0QlI)K@(~ZYo1*F~B_dP(TkbH(61ED7OB|09@f6VU<|YN7vpdc)Bpw(d zLr!tF@&qS1zft$L+jlK-6I7R}x=~6P{D(y9SR_q2cs4;LN)Id%4~51``+6XZKNjF+ zUHxe6U(GV+Hy%BmKk&{>)n_wk?49qwEVHdMNW!FPp0Lzh%L98@Wi=0yj-0qp-!qm@ z_%AJtPG(V&_~t26A0Mehg5j@1vH*Io1@lJ)hr)4(qj=hVp}T_%vQoX#d+^?KQ4gOh z9byvGE1EQeXF{b<<`dVybL)KEZ1}hvaMBSj6i|83W;g$~Nz8x-UjNr}@7te0+UdNR zl5ZqeHBVUZLR&{sB(-hkcLqAR^Vjjea-^S}sDRkQ0R#<0ziziMIz`mwez==?Af7$> z84G{R7nECyX&Fz3L=4QMbR=U>l$a?p$UyY{eTMj~kzVN`xmr4f>Y3$}PRa%NWng@r zGYqM0oSWR{n!&O?OtU!?b3$M!qD6Xxrq84#cBW@2ng0xjHxgOru z7~n|o??Xqa{_jJAMq7hW0{rpZ7EIou zswlZ44lzf}n#ywc@V*4zCoCJPZxBY=Y%6&E$Af9s}6LL zMOVjiQX;TjioJmt9kZr6sN22~ND6ajPV}x#w6^;|5d=KW6t@px&rxfAkg4qEe-2;# z?K+I!X~{BGAK#Y8$$My0q`O zK0SrUQ4Xs0wpc^~muB0aud>!6ig4=&Vu{b+&$4wX*4i6|sQNrq3nM6g+~4dwSa#s` z31;%?q2Kzvg^$rOCim~>k;^U@#xFmaJ_aMXvL6vl3@Ow-9PY64pQ)=(vsZTn?nFPp zT$lcL@7=4>i{MJTIpa$Ga|~6xEXNORS-nS8MYmJ2Y6mRX>DR+z_+csU9I^mW|x(LzqZTE}hJuJ@x9MGV%M?KA7rN3EM9v&y==+WW6>ELG%ef_aH?yUD| zjC+9)aYvb&*;O&RA+sKEeGga5!O9v;MQr>4NG2jaenlQf-(IT6A}TP&6ZrfBn!F7Y zf;c2Kcu50i{&j~4P4k>f+w}k9|%9D zGy@6Cx8-||OtD3>r!xe%dCu3dc}t$!$H7jQ3l~;^rkQ%!MaN9lX9Il_>N3?+&r%a7fCvk)xUYo1!6v=Cbz#vo;~NpAAv)V^xnvW~|VWt1NWu zIx@c5EW`t*iQS`zm#>4JD2YMtvk*U~on&fU8(GnhFFEJ89(k<8H4t0OIkDUZSjx`X z)P$|A4;3oIbx|r5YIym8$S)~A1#pZ8AN!4u2cA4C9cDsd+Jq=O2cu2&^W#mo_gq*v z)PG!VaR(}Q?7q<^u3A!XnY@yA;cfG(k;3^sR^t~@OZjbMiV;WmO?5lrs6k$ejJ3Z( zu7aheZ@bplbk1Ui94x8aFf&^)G;S%@!=Lk5h{K3=(5t)cb7SYm@I6MRbsD){p)b?K+ zdcibgWlwqJ!Ao3ZD|L8`oQcr0aRc_TdtH{t_H+=s+fg==lA8~^+6!ORYZO>9HdpG# z%OBmtRAOKve|TT#vti_J%?gw5Q8A?~QmpfTb=90SwAvKppz0O$poY?OkHxpVLDqd@ zz!8qd6%pp?&GF>oh5$VCwwr-}_QmiKY{Lp?ne7go9^scT%`Dj`3iMVB#Au(c25qYJ zKaqhtW_I$c0wUp)gWXq!aQ_m*fggN<@;vN4Mcw7{e%BY{cbT36|KjnEGUV@; z`BSI<7R@h*w$}~0()L7c{QAso^zdB%uiH5R4ItI|!B;g!Ud0yU?Dpy)Tj32?z;tRGdWf>9rXC2rI>jjG_g_XBfn^R2+Im6EEj7Os~tmfrViIa>|4 zbyZ2Az2bvDSHr|rMLFltWQFSTIIrHkx!wsBaByNU8P6(^lrcYlnGulbR(s8=vHir` zcPx@mJ0kPS;x@V0v;<`HB^o)Pf5_Zs%)Q!|{JR7eV5iE6Y3Pn);iWHQFb$Xmzd=hI z%yN1}h)0nM^KSJ^UvSnaz7e^P&*8`^&OJigHwf46`|<#EPT>ORYLle_NDfDmBJKWu zo$)o^)j1r6oYqPiebTS*LA+0CB6-DEcE9r44=fUGOR}T{b0kb6T6w|=hvoOb`_^}V z7qYN^5%P`Mkz%AnO7>_94=Ic?GH}%AnZbiT49TW=e!|+r{4$HLB2l@PRgMzhd7>{> z2j7JsQ4HO0H|E2v|DoV#1{W_FWknf~B-Ry9Sl6LXeB&yO+9ByzzVdS)m&9w70|1_S zAce}JjpE=aIpnm^-r6 z@X<2p%~vcD4d<5-_ym)Qo|&DOCB8#YBOHph{yZozWx~s<{-{g0m#g~Be7CWR3qM`RXpyuxx|nQR3sf`v?6}k@6|ObuuMrE=PNc4dd6@|Ltu> z#J*;YdH1ox@cM@8tA`QJ2^p-p1F0Wpm>E z!Qaz_)3mR(V4LRG9oBCL_agl{PjJg82^i$cWddd^HLH(f)NKkHrFPNLCtkPWvs%=4 zbjVT*BerihRQh3pQ7uPT?EB`B_j9u~-pR>pzyF2W(fU*q;H}$X7$k^rg&Efvae_4c zF`yM-%r4)0w#8a8etE)JI_^^Q=SXv3ytSH-7*kxe`VwDqT~>y6f^rG|o37=T1Dz%s z@x{KHfS&Qi&t*^Y%|6VSU&(c0Ec4*yZt1Sw{-d+q;HYHUftbdUDvT7F>$!%sLBj6_ zUMl;%dZ-u)(u<85NG;T!2Pm8=-!}vu-AW_>oO>(7@+93?1p7MTek!o(HU2iNY8PwG zs+Pll(zhU9i5_8=vk~_{-|u{Oz`}KtX&8&FiXmNWM|{Gz|4?*g_c%^)zaV5 z8swTu4tGulYC<(I{LmRKW{=qHrFvTDob>@exhvSs7zB6HTN@$exr9OJU-l~lk6By) z9SX8@4ZyFGSF2?R=tYdY5iBarIV{mfJI#M+@6JW`{kTeU!*O4ZdGKlc2x`X_aw_pHM5(%5-8NT9rB><2fP^L}7v zlH_ur0lB%rJ+E~UbF=zY@%PCuEJm02Nf>DP0`&mYqPB0G>n?o}jQYbs`78*JV1g`D z(S-JZ?0G%-d>(}^%)$p4-|8o35M}={R)kt(@&OeWjR+~K`Rlgdv!%|<9P%fE7(VV zoJ<6eKq83iFQZ}wznyUpn8sPH_JYEW>aj3>V!RTA;$!6>H2&v5YUkoA(+fOT;uh<= z;Z%31<5(K4PSpPEG0TdO`-S@)0!<^(EqB7zb%VUjU;fP@NHTOA0vGLKrr>~T=}V!8 zCE~Js^~kN!SZv`V0%R#AsjXa8mU)G~f8<9AUEwcE|HD*x)G&LdBLsT_#W6Uy6cTz}yc^GUG17zW&oTrW&lM2%U!ASApa5S`IXD2mPW^srEBd!Ttev@r2DT1=6?a<%k!<8wRce8 zG2InY=t?%K%g&a&1yxD;uN=ZyrNw0;4)D%BOCWcoSy#^#f zdiT6avG4CCooGe+kJqgp?EyCjB28l>BXMG$aj=gPP+GGN8ErdP=QbGoO>6$E*Dp`d z9+mS>up`)LV+#0(rsizlx2CJNnI}C=X-Ut9-iiOFUzIG((0XU1=KSS^z1yKi%3z+| zW8tOZ@%7Ws<x!Cow@g;-#4RZNPn!vpwF0@M|s`~3nz7D4@{m8cg{_g`%5spNJ$dv`4n%b%j2aN zK&|2#=}JKicUN-?-{=3GwFEu=uKJbo=1n5tp2*&M{1Q7((8n=yb2jgbD8ctW)Rsx~v=d%mEs6~&Ns?NnwOt=NQA4BH6 zE;n8&`|wZ23UYJ&JxiGe`6dDM2JP%qwLD@n*S{72ljm)XnUJTk{dFIGd)xK2+Z}6& zZmw7vZT)hSUI>=a+3%7h@XgJ54!Gm`_1LaPZ&K<$_ETEX!hZFBR0uOg6+Yg)!{~7- z!!E4cbhQ~9`c|7;gs5X*crk3E@W+lTjR428{L5e70UfY}10B_mb6=BS`o1310j+mB zM@uWZd6ia~&Ze#a3PpU4NXs9^#{vz&9j`VYm(%rf%^f?RGo)q<@gNW77B4?aT&IIp z6IfO*3NZ49=~d41f7v*WT1eT}IY?7Y+mV;WUuxc&sZ$>R)y>K4m9-=@sj`hQh{7Q* zf>Gtpz7aOoI&~Rqej#++gpBBaL@PMvxb|!XJ`qONrZX#h^SD(Vz_f78sC@9V!W*8y5rp`>J!XEg|0);p`f81PejA^AXtC@1;3 z%JN!Fzyt0Glg&`Eq*vl*ES5{Yq-}_!Ud+DjyKVmc);?JDEABK zIVhe|nWJzd+?BFD;Ju8edjS8O`RXw&0gRgb4^5M@C3GS9ES-O*D*@tATx1u@?O>Ka zCMxsKwA21)h0;Cw`l-1-*8ehOV>xbbEjAbD@OmU#-D^+!l{)qJo6)+e{8;ien2Wh|0*Kzy3a{Wl^OBDNRA{jpmlJFB%hVC!^b({ISk9PSr1weF-Iek@tCSmrzfZ=bXP ztel^aEQ`x?h`o3-LAGK~ydH)=bVI?2pPU^F;U1J4ozUxTMgjZBG6w*Hiv)F8ed7MFZ6O`COC5-@M8o`E+;Gd-tB zc6{^vE3s>AA3|EID^FmO~?YKtG z%rr9jlmQ%z%3l$`FppN8P7x_7OEZT+7INi}>Ipjwr}#Wf1793zzg3-z+q)-P8-a+u z?7OaUUQ>*L3yceki?CqrHBa!SksuX5_Yca6<*3R}Yt1DD5nuZ$e&RT=kEvW`18x~V zT@D-x8Sa!YU^};tyuKz{EPrXzvvd9MBUbx9*vRt!gB-9Bb%5~CT(Q`Wg!X!AC4t?b zQP*AF!kD)vvITtSCq{o9(gRmERr=^}bAYTipEYrDEPUS93#Y+*;95kZZna;EeTo2Q zdJLSX{EC3@BO!Ie+}Fckzxj{X}ctxd#}Hi==91 zZ~54x2#V-~o~eJn(_P=0UH+;q(xf+ z$c*Co=nQ&M46fc24i*E^Sx{62tMc&rYCcQRYu1>|oFv`YbV(3KG-wl@K)Y9OEKx8< zq<_Dg8@KrKU;rJ$b>)bCjC&6W*IE?NPq|BeO=sm4Om^3Xf66F|4;0HpU&RSz3AEH< z*%}j?$X2j!*PeKMrc0e1wEkp>gKQ6K`@gsZ%~j^#g7kBIvV>g*2?uH(=q)kLcVFCa zyim+(0tN&1>u?tpB|5~hip;rD5?x}W#GWsQ=HIsO_3r-4)FQHlJXJiP zYRMP*f6W)fWc!6FXl$7j2q-IQTp`XO{9oaAA^tSrgF<7&6tD4fzTq^F$cHC+0BM&G znx)j*2Uv#Vq;cngiix%fDQPlsw{KNU6Yo^S!xBo9stc>FbhjW4lA8exn(=z(0r@3{ z=&ofC$S#lv2yr*-+-*sVb0##S$>owObj#Mo=k^-{HYyfCv7nZNa66_Cd@UwZ=zS`4 zQ{Os?11Xi$w9JxtV+yU6{wEig!uq1Puiw>QDeV>QB^hnMWb)UIn?xsy;=li=5Vr7Q z-`=UVldD9OulTo#x7Cp&qIu2kheS?Nq`tmF;^J@Es@LuTg_Dy>NE255b+_m<16lu? zATH4XNFD0l*mw=7aVOBHM;zl7;AZAqgsA@zt#CE4H~z-=ju0G8ZQljl-~4cx9Iexo zxPml%K9bip;DjHTb~F=jq_O) z%(VoH&~c{7oinYj2?)Bz#p>GKs)*KK!af$J0E1Qs$A=!)Qo(e>QQg7=vMOrtQTn?^tk3){7iVO=1rJvzkul;k zb*fy8&cKu$tfp;u2>y|7@dA$-1P-TA=3XlU_m3<(PTlU(C1s!FDL?u%DTcl#2(gzt zi^>SiJP;_P%U&1#&Nfd*XEw8pJrS=vB4Sq7LN3}p0kD%jXlOqRalX5-p!M9ZX1< ze|5j=;14mgES@&k_fQ)U9ej<$6=f)BIPRz5USy-A3ok%LUgy9jzEFivs9|0C^Mo+5 z9&Pt4>Pc21QjWNg{lxvADCPJ5iVMV|tJiq1Y9+v+xxa;x};ID+_cKiur#jj zG5a+W`gekcFQ4iD{rk5$PW;k)Rq0A%D6rhCJC4itIlj`A>yGO0j5oG@B)NDqPM?Nb zr;PgYkGK$0<->DgGvVC5NHJHbGAiDGRU{(*0&&${YmIkiyKnMf(GoG8{*pYFh|Kzt zg!&SiJ(9BZG=j$>Ri=w&gx0tp6=#R41D%Ur<(So0(J#0emyqe44tv+%)A$70zd)4=)m&b?<26#H3cm!WNeetL){W1s4 z9ziP*@ahj5OFv|rK`>8t>X|~%AR!BR$_=7K3}%C&^~48BN*gbqMS3or%J>jhXO5rbZP&Sp9fmmf&U6m+rI(E#65Os#>VVQy z1jbKB1z}sdzoef!-nWs8eP_jlU{L-@rM!DzA}Q{wZv@mAOX{Ldj@}A|jiVc|d#v&7 z)*qWizxU#m)jX(GX6Bh}G_=Z|{QNv`35=>&Y<}sD_zhWt`barOBF-xIl*f(>y>?d8^%ZcXRKIY!pP?I{fGSAq_@V%RYmk!M? zbX7Gd|LT)qa~RjV>5PF%M!pG@xQ|H%_Qd#@HN@dPwU?vkYN4bT?(|$DgvPi;`fPT) zf8KXCQiPJ`v_Z)oLpW>WO$o9IZ8SBiA%wN5&QCmAyXt1}sul3@!tb0RvGHnY3&FTY z6uc{A1q)c3tng6(|FB=^ z4TggB!clK+GO$te^F;ceps`0;#qRn^jl9J$du2;!n8qU!tts!o2LZ2V?n>-c++(Av z%kH$nu>oCBwT)Z+lu^2ENkJg(kTSY>28aWWK(@Is#`6=?1&v0*$o~WqQy&v5wTFd% zHa94pvFHAMbdWlnK30JS`BzZ*Z*Vhy`=(+-^M{YefEp+bDttArS!HxZ zlSIZ(;>S^c=__rT1!DwNH*|{st@U^=ZT8LAWS{E$#kAPcDfn8qxOT{a30F+t-6tf> zd#p_jD<`D)>l|mD$&iwLkUqoc#6__8z{}=lf<>Kg*Q1l3#~q(V)m_fwL-bL zz>cf(wayz4?3+jl8tp+W%Nt@0>=U|>vX4hXS!IZC=}$KVO@}?GdSH94{xd8f*(YRN zZ46o_!wT5crX!dX%5}1sRAl?c>>p^}x`t^xmj&9$M`fVol?#J9sMt6i<@_r}M8Y#cC zcPn+wtk`GV>-&IUK&ZU7wNLpH(wY)?*A?8QdR^dKYlisge+X?)Uos(8*?N98E$h|C z&RIAlDx4?nVDI-r{O}eFcI=f8eIx0d5pr4r@kiw?;@j^fhX3`ssof7x&eI?0h!!_P2b{gc^`M(O$4 zCT@{{Et=x!DJ^|fhJ`LQ{wqv?>r(ucQj2FiXww>X@vI!#LF9vyU0~Ute7<~@n*pAP z^R5n9G2K1;(GA*f^ONdHbY8_VFr&FxAKeb_gnCLfyLh@9D;U)%fWs7>J9Yord86=* zbi?NIeL&4E5n+P$U_o0f#kaW&aSHKz2Ej~5r)D8Rw8nNKkT?Zs& zsV7E)198>)4F5C$Y>cpbbVE5cpYZK*9V{~DUpb~UQ|Kft)w2P%riKt9z8ZrJL>bi| zdST(s{^_#|xmiTEhN@#q#`8oJ=$ABLrte}5sj z_6__CbTD4uoPrz8)j3oW#_h!5=-uUr|3t84di-)8Y8uF{gLS(YG6TgmuLaq5nJ@pf z2=40(UDR7n7ab+-V`dzOax_x;D~RBF;+hvls!h4gi~i`I9V>7@_tw`uf0*_5_`lNF z?g)*Z_oYX9Gd2vtDPWy4N@t%=3F6WA;qX7r3{||MEspbK?QFK!(R0F`oZce)+qQ_| z#OaT{GKUN;B8tnLu?e|Z<<@|gB)~^bUnJKw0bO>Tu>Tqto>?|xc#uwc%4?2{i66t@O z6I>d#9!@afB9E^EJqiB(O~uZ5^xCU1LR8XEiuTTkIr^0+FBxlB`$FOnoTRmCw6dK_ zOrql)B&xgD!kmi2!$?Y`bE)W|Q^xkjsQih%P-LE&Mu!MCle5Ixa*pL?VRh!_wBA*Z zu5}nKe~|PKtx<-C*KmREIC#6WS%7+EbclI@-vucn68`rls_li;85vMtk2uR0^Z4@E zdgeDx7SCiBtk*Jj$p&`}yb!x@y$i*5^AAZsJ-;OKg~y3Z^9rwf@c z;;Utd+MfZcpFfks@C=uT+Fff#d=>Bm3p4l;lVFKSahq}ca4=`%_!Fvj+D&JwhGzYZBO;x>do*60k32QG>J4x!hyDe z2wk$%5Uw0sUPSHA#b}hOSSpyX&W)akIt#EaL3d&0y&}EUdIo>2qO1cj-z{Xo!af zRZmG|_FrzqQhO}T(|IZA|Ir(jKtt?gxs z2IH@~WOs&iFbp;U|0;|a-11N6U!*z662ky%t}K(y@#`f(>Bp=MOnX~UWisQ3mL;gv z%)1}m=lxXBU8CkEl!e;DM+8Qw;UM1TTVvTdJ3s~zB{fGj6Lg>B>Ap0#;3A||<{Opn2pu;x1c>1VIPToeLTX9>)$#PWZfHJ4 zR9k)wUVc?=bUHvJhYCkM&Z;+gvxkod$`6~9K#rSpKnmZrd}>8ho?x7zcX+z$-8sGXr=~F((;6oD*vj{>Q6Gts*;NL{B(=)+ft2kc5q+1X1f!iw@<9AkdfH+NUwttM^ zu-WV!r>)z1zY@DH_Eb8M)8bWXP=VEL=Gww+ar_}2Q*Zx!G`BjsX~rp#EFb zd@$C4OsETSeJo^(K}666KMi`j?x8Ka7z0m(QV@@H>#EQ0V?U-h*{VH0W+B2C^Wrv7 zj3guyfwgk!oi~YE|2_JS-A5v{B{`~S*mgJdoRn2m;pmG6{9+pY|i9s4?1+` z{)!crt!prh7(RYs+D-B6-aw>_+w~#QGJV5$2Q-lDp_J`r=Sp`mA*$pv55G6#Ehf?Z z{4_p+X=l4%tGJ|I-e~%!zZ-ovz#h!;Z4OEbo709~$ z=PGTZnMvbi1q@&p2A72L2cDPjOPD1(2l-zcX0HooG-|cpTI_lsg%BDIE%6L}?Kaf% zP8m1oi!bDC4iwipEOQSC;=09Web;_2#Mxd)1WT_Os_xQC4(kSDoXt}1EUYAgCL$2U zk34$+(gM`rm^DwU-vnL(vWOd7QBIL?>f%tscu`=YuD%B6(#Mf5`G2zn@%JCRqKCqL z8i4p3L`#m!=Z=+47)`u+hj_vC!iuMsl&}@^?Ouup#X7Rbf8ynZ3H@DFrWW=#>_|v8 zBa=&0hl}{;Aapki_DK8w`CN@s1cAgN8vnJ#OibkiHSM}Ey>u{X5V4YssLUpj;p|>M zkMcLsZ_k!bn)yIku9Q~&YNce}XQ9fsqdUugYKT$hKDV#u4a;p#gT0Lx`C9g08IU3$ zIpX~@Cq7ZUIVRs(-ONU!xLWt`DXU=CN9+z{pGPBY%lAdv;1hWE;{v3U)IUBcQX?N#e zf(Yx9R&-NiOGX{BE8|1?i)K0ED4_!1YvSGq%1tMk_xseTS%uNAQpQib&7PmCpXV&j zhL?PmHbd>ze^RRU<$zN~*!tgdO{pP+@AW&gi%e{g*2tBHF<@domQNEzgWKdn zPTo~r&<>*W8~;TxR}Has(f;s4efgp;z$BnHvN4f^PpsX1eVf))+E)FN0?AK&BslnA zA%_qH%o3qbS`@{9!O+ExBU&2*E7=(Yq}_0d2rA;oZ5sa#Eu`s%@&VnOx+!0LUs5u* zMV9#1j|_qQ_~LR9`s7bXAI(0tcq#CRt;=_q;*rl6n)cj?AV;j^lJxbcub-dco$WuY z0n66P_vYO2g=Nm_(3MWP^H+NlVoBtbF(a_PhNwaH{U_=(0OOKM28nZ38L-&mVe4 zf-tYZ*u3HKMbY0WF9bQtrRH=`jY@y_LwD6W(lH!L??`PEE>a=f<3kJKnAb=VD+#YnWxPSnUM z`#Dyw3Wzp_l&_mAUcK0#>lQ$*7t_TfllvPNs8RGG;RGQdalV|FU&-`sH(N(8MQ>c{|LWVb8 z7PIJ=n=zmPq0KhgVb&6I_U=&jFy@|#7qSDidQJ1ca#=PFs|4?xv{v7HLk4Q4AKU!P zB`Ndsi4-;;>*{IX02r)_{7k6_&luqHa!o4cU{-kVF3B>gp~_)E$si*LymUAa<3bxX zxdRiCN5b(Sik4BYU-!U$Rlt41N=7}7Ycf*}v+a1tZyW>uQ`ZZTc_DW>5m$$4SOl+~ zq_`g1GFmp}NQxdHgrP4sCR%9U{NY5x7B=@Vs$ck~K7FNZ!nUHtSn1g z2UqBH!rofT=@h^rlE2Rkn!wKRJ6Zdg8eA6idg75+h~cxQZ%<2NZN|+Ri|2iD@P7c6 zkh%JY1`v&Etii(`co`s4Ug46J+1m8@91*A2(iyXAAx11A)Brv4gs$*4)~IuW30~EU zFcEzA5QT`M+vp@R;fqH2;5sPch3?IJ+ZU%U8QDq^VPei- zLi4=zBi*K-Tw9!wT^82!e=wbJ{f;RGbZ_aW;5}nKnZCH|jf-F3DW0v*l+p@WP5+b- z_ZE-&wwS+m49c}FRTE6peU_I26CK2 z9i7xzuV+{QiK<9nS!TFma*NkDoo61naX`{ONg9WD3G?(Eq9V_({qUaBymG*42)dI$ zzX$uw_{j$U?rF?9vkPz(GC|Lv~#@)DW809$qIJ<9x6Tgz4EfGW9v!yfoR;X0KRB1%-< zQpW`wjEL~U9AGxwmaB5aeb_*=El0@Rd6nwJa^WMHL41cpzfCJUh}e=@nfK_{d|9>k ze*pX=UiI=Hs2!wEUIj`0@jI;+`BmFi;WA)Qx-K~6CKM*-Z|il6q^W`vQfdCB&uAwha3`%T#Ose(_U zi(x={DW+^fD&qE6Q6ji`lCKU2BQv9d*^L9|ceNfcBJYyQ?E(tC|Fs2lW+BlGqjw$J z2sTfOP3O$e;QKA1JQ%ka?#i3U(;F=YT{_o8e&N4G+Vc{l+bb$~49C8h(*9m7a7wnn z-~7XT9+GJwcRXZcvA70w@DeJpslAv6jsd%+8aC`+F??eOlX0t*SQvVecD2)IIDA!s zH0AC217`v6nLV}bl}|cx$mJh0UalsbBe0iC-i5$eRx>Nh&WA^)j=8h{bHw!7CpMEac{;XfLefS6Zd~(!0l2asd!$|{I*a$vy0LE>4 zD`_XoZ!4y&)Zew8ynJ&l-{nbefCv$6bN$V@UGe;@g@04jcq3ZJCpNleKOf=3|M0aR zgV}&}xtlDkCp9S>EWnl?|Ft|fd}e#T#oSTI}K_N+To2?JOCC5&D!3B zm5>!`L$qC)Pl71^FZek^@RLgMhyM zAqCV)KwD9?LGzf~5EuLkC(PSyN7AS`;C}|D%4NN>DC|<-kbjRDBxTyPr6lF&Ijb_4 zy+2u2gRo53g{9^pKPoCK^J##>TF&WR7qC5S>K!R)19cS6SKLdznB4WbCIx*;}vpQ>URtBe!XcLjs)C|MCeN32XS)toHw+uJ|v; zb^8^ez^(X}t9#!|D(=?y?+R_l7s8$^`l|mo@sU9M+iLj_!76^8!gaV6|Eu3>T4?K` zvbN%b={RmX5Of3I_{+4juwSKe)vx0IE!schzi~S$G2>6MyoSFTf8y(Nw8Zh&`E#N2 zYzNbjxOe*-eu6TpBH7}lb1Oe{T30DNY1OF!2irUfq>1HYuP-HI<0DMU&r->7xTv#2Cku-pFfM%hne5GCpq9z@Lk zCqojY5DK$&8#N)36~?Z2jw|r4T%-R>d*vu^y>ktG>*_ddWmXM(weTMAw!cWXwf~H- zyb`!!e`d6oWG*09|Y{}r{?X~)3VsB-=6e+a1m|E&F2@RJGjjIToC*Il`jjX&~? z)3trWF#S7%p{(gE=MSYke*I91OsP@of z@%L_HE%)gxES#QNNWn&BFftFDYeo+QNKHk@@uQZL`jw~jA@osl{mD1&^8o$&)42j}*hmEyZ|6CJdl z#&PX(FZ(IWLksMcI!;}R16ujQzr?YY+t0LYTrlicf-vJMB#f*0tNs^J{L(}9Ci@Yb zg@BYHeu*x9y59tpE(m1? zgYr`$t^Sw4JZ)X7Ek}lnU)16cmiKkCLLjf|l9}w+efr6E(nzsr$6>z)>D$gP<_3O= zh|J(emV8_MFFxfnzI6Ow>b0~#z#U&cPe7Evw12`^_M-jaJ-Pq8{rY7WzPiMIe5$Je zgF49pO4qI8d$ObdHIRCU%XH;*PRp$(D_v}JQtf|&DrMpS17tXLD7)^T@P6DN7!li0Goaw9qLt?Zm-wnzF`i-3}^Q6t5sG2`RHC2Eq@GrxGTQ`(g2o zLaK{zs!qVgiO1Ln9eiXB~4CNrw9kP;6YQOju z8`X$WXJNnj)%GunZT_EW%WtvcnD&pNFl~#!_#b2H%seewhMmy=>LPx1Y;1#1DbpaC z;8A|zFKt}5zjBs!%286D;xDmtqX)CHyZm4HrCP{?UyR0%c(E4!^owa7Uy5!14>23% zr2lJN_kY?L>5d0M>Glh_&Hoe@KJ?xKRcZ#t6Z(JHFWw=_WC>ZI%OdnZzM33|U%u}4 zM^DvI0=(vBXA_e+UZ$ezmEf<~FH@mM$h^F5Nf`cL!KX^D3BUKd64iZbwKSw!dt$~f zzMe0mi;$vS{+Gv*(G_78Tv%#BrsGGc0a`Uu_v)`6U$pi3v*mK)gX41{r*6=x#!zLn z|A;?r(XUhd)dUsBiVbCzfQ;eBXY4P0 zRFuNqGeV+~V$vwtk2_k_6;Li|F5pm{5C@wC zC*b>SY>&q?^WEM)zh|v=&OYzun{Q&PRNXV*Is3BKde&Nd?S1yy?|IL=fDZ=s5X0pz zGlt8mW&{*IMUp>PL2)4stS-rB@F7IxfG@c&&)W|^jK}l8C{6C&70I@?=BLHl2tTl< z__T^}nf+Rg$0UmVBm|O5H`R3g4;42b@QgH(r>(eG<1-M=DH%Di?3{|fp*0AX`oHjL zL>UQ8nN$DkE{s(+jS(~=jk_ze2!G)36^DL>{j|jDUT5RfBX%fp^waIR`MJ~QHD8fq%HZe2TkyQ z$XBDWq8=$uS+tt|;gm_Wr40U86Zp2=iohIGY7D-B_oP+>X8|Ai1xjAYs-b80QK?A1 zaK=enWhn!`$3}3Mh^ha<*H1jn^!vIjn%G*!|JEIY(xJ9HTyt6f7Z5VMJ?lY3t@Pn& zeQgdDs#)fL=-~*u%1|c!(5LE@b3%6C|F*&Yr`gDJ_z05y5;)UWb!@+N5jEs}N=1C~ zL*8)T(Oqo5#<|rN*hV#lE}VInyPXV|Ga>{JnM%>vhe!0%zxr#CGH1UD z^RUc*>PXS{e;@x!{ePwXAJ)aO?6-?$s{Q9ChLw8a74bix1#^+?k*E0K>>mHm&i}7; z|MOX#zeoH3js4k=*kfloid^|;HU4}7mIll4zjXiWqGB6mpUyQlhVl0Qko{J0h5hsM zzdI@q?zys~vytX#Q{^i#|9Z6q&RiNJM-3f5^`vF<5B`TZ`Ua{|%F+Fg0wo!~vavFf zs^+4w)Rps}u6F~mDQn9;3ZYXsiE37l&rU{wa4dHn<3%@B!air2G|4(yGnubS>!nIo zOl%yG;u4(UX*IMOQ#(&02TAA_6mW#Bx)}|ASC60_c*cRagm1DqTevF1AAw=Kge|I6 zBAY^IWDU5eR4D*PJyKUzdB&&RiHw}9Q{1V|4x% z+l%(oPyYG?PEfmjr8;ZNZ4uQjafX5vws?W8il|G{qNz#*#DBMpJ|kE57lN2V4V^~s zm*i|xTjcsxuY^Scw+LOMf{Zjz#@~ccb}#oou1tL_a1>jz@IO#vQmJ?bQvx3vXi<+8 z_DPZ|_?+3T;vM}TqGI(CC_O(c2PwK_SxU*Pt^>*T!@;PFH1I%=oYb!HLzemgHpfP< zKhzQb(3!-NB?y3CQ3@ETbB%v^2EsY~;tdh-kthWYQA3%XBl_Q>U6%(NgV3rh{E#wK zm!ec4z6>A9-Ib*~(!zt}M*BmvQMUCFAwy@N%*xm&jQXkl%!Qiq(irbp34{2vT0SHO zfa(IMuLuYrTosfq6R92|Jm1PHyv?~4w`$fCxe=%A|iwI@X*TVyg zZi+F)+8BJ$Q2KTLD?bW zYGyRHm8oT#@Wt2k#RQ!43;tJ?coe>aEB_()L* zwl{U>q(AHjeS+^M^rDvdS3Y%0VxJH}20i&~m-1!(FB?q=W8zn=^z*Ov0(TyNrTx}I z)SdmMG{Vd$K;x@SO8nA%@P9N(68_Xz1M&aVFtgWT^ndz7oPoemHsBlaFZI9ck<|6S zxv1gNsHgqG4^cyG21mHk^H0uc4sT2AD3;nUnGzaDqw5g!|0o0hgU|dY@*+lbmtyf! z(HdmYoJ<40YW*1;^-7XQQ}2IF%_i0Jl~n!gQrRC(qb@41UHA4M(@r=8P^F=hBvlpk zf2=ORO35NKs2LPqA~HY;_Zh7)-eNfFk5Z+v?9Y?%7^8kue;)lhtIF{wKFjIx)oi0h z5HI;aUM3OOXH>3n6NhE^l42YkAQ|kZOhAqHLjVbhbB~X$)fVj$jHYu#aL{H#*^5

5T8k<>-is;b=M_Xr^^2>jWgRPZpFvB-g8vPPb+SqRjJuT)PpoPg%PhPY0InMRZzALI&|b{)nwNxBv4+4A54q(SACDqLsvZfG$x`5-LuZ8 z;23Gfa*sd6OWHyIT9z1>^?x6K)n{PP|K)#7B^G08Z)HpowPfWhbft;@Xa32XmA?N= z15`sNWcK)~8j|CWpoP#0eEK9(=o6*Eeg<&GKj#pyag8l1QeNNJ_}gd)2Rm(ZOET9l zwl$S!s&9KIHRN|%J8^#04><9~q0qZBa@Btm`@=Z1^!8uY|A;TnV}N1^^!Ph@8a1uOT{h9_)=Roz*nxrDi;}Fy7pb4zz zU{_kffC`7SRBTL@a5CBa4 zNCY)xlcUZ9#LU@4BSBJ>Ot@o>i{mXw1Hkq#!yk|k$Y05>xvvlxnFWuN@x9T73axORLL$Vd!GMzP{NG z4|G8XhR>ic$?u!!J^DXZEgFZ;8vtN+6g34+61 zA(UgvLd=HfxnSZq>)DY`@Zl>tc7TeUg%2HXZX?pXpkS1nCSxij&-K6x`#t%i1Zeb7 zC^R`rHsS+ceWOC(|GwLS&%S^#xRFVU5CliAh|N)sKJt&wn6v9P}g~DdiX!9}5xxi-F0Wu^x9sfj{~$g~C3hXpQkN zdbjCNG{UG?(-=QQ2DjQg{LsVrWBiBDix|10fnGLHJEjqz&WnX8;G#;x(tqTwcE#G( zZkt`yh5K-$ZJ&Cv?TP7de@Alm+Sq$YvU(wu zidgVnwFz}7`<11BGXCjE&qHDVXgj$P-wS{w2yrNtv~J+OOGG@TGD&_sZ04@_=s;s{}1EOUW70FmJ&GGuk^WFJa|X@J#0l2 z`U-Q91E&(WuGXRKr^@v)9_Tl}`ZZQCsX#GVpbH^SM@nO&WUa<31g0Y3urM z1bI@^_(%z)vcI%jZ9jNnMB)pmx4&NN8Nn$Fhlx4y6VcE|wU!$>P~wJ9FZNwzIY0UfMm~UeJWGAztp#!F6}}b|(7`xgp(WiigH8 z|6>v~`kV9rx*UuBb`T_{E1!1utE~dxaw`6E5~1$s_ya*S;LA=!Nk{OP#$Qm_p3=sJ zAqwR$_iMEVK5}_BffuGs;~#Fd&e=c2KgN+(*&hKEG}i67@uwS4!4khm;v?Tq@gZ@h zr?4>f9Q2_KPiMc1-kQ$3W#g|dtb_dv_@f?$P>_L?_Sfgdep zcmz#aX&D{Lg7`!!QCFv!)Pk}l z54>m>#6cB+aVG$}F!aZk95IJ%gjZh#Yj7^JAAYCQY4Aegmv5jM%pNkqn$ic%_-q=1 z*@vlNKmPK1;ucgUaYmLC_;yCw-}_$_#iXo#D4k5H`WnyBO#CnDwJllx58V?|1^bUm zLR;sF{RNx$S3d@F%q=XI`uWd`m9)|eSu;s47)qQl#gORhnE^dDW?3*p?d#wA`F6+c54KO<_ty5{?7Z2xg^{;Xw)9fw4~k&$9iY9aG&Uh%3ed|5xvV%d@ut7Gg=z3IyyZXeOa@zWo zczn=VGO)jjG-1zp7ZGhmLz7|QaVF^d_(#?lf4NnMKbfo%M9Nc-f2Hvkib&R#`X79T z3i@M@bU_`8R?C^H$u?-9ExNJUHF$L){_UWbH~u9&bSr$F-97TB7m&1H)_%sPCe-YI zWQL(SV-sUj8Ehk2?Ya05B_NMw;?PWH1wMk9;7_ifZjU{8zWv>Ay{~=sJ0EJl{2RBo z4}S7(?dqm&_wDC3MO*#s z;+zr);jVLeDETgu9a`%k9^Z-MN$4gCc{%Epwb62rx7ncU=tt>U5B&;!aQy^6;?Wt; zCVmbT8k8Vd#9z1|nKEsK&Gsff5lAB7^p8@HPt7X(LzfYMSjo>{5Ro}ZSE0uT(dCiC zeowJS;Uo3(_FIB5_SG*3ZR6mCF6fuqzx_ME-R^qxW9`Gg`Ih#>Kl%1{%S~(TMbYry zX(qw)KiqzM)1?2wO(T~2U(K{blBujSXR=a9$HqV^ikIpCd=A2}OYnz!DKa2hpP@AN zzlgo-(Z!$nhr@CFAH*!-Sk5_h_Tyi>;R@mpDPh|2@ki@qx0qw%O+{QDDHh{jfW8$8 z^~WP4AnrFX1G(N_Wt*5pInyXz6$winJ~1DlWtFnTpC8Iq?W*xd4_-e0MWVC{|4Z?I zNDQf$$H%!x;p5u1w!L{>JGb#n`{BR*(e{n^oNYh_F zU^4%tP!wG{{}`ph$;6}dE5YZAfc;0~_x|^tv~-2jcBZOd8a~XjG4bPqjw2Xf$X6S8 z1%ZVcq&%_}BmzoSMmbSNt16M{fSGeF^l|Np3kN*>dHmBD0s~X|8n>41HV)9KMj&=h zBAdo-9lptj7Snr55x=(|MNjLo@R1!BCVrII!ikkz=mW`Mf2wO%bJvtsx`Uq=L1>F! zpLzM>pfUmCiOfQhz?g|Y*l$TNjQ9)w2R|+q;k&S(hqJl186St}F`G?Y(6_YWzv;}g z?O%NVC)(Y2TxkFO*Iv`U@87(mz5euxc1{n-afceK_7(kK_E>ksclN7u@e^<_%l}A7 zS=OTR2rhRi8^sP^jnwfs!B?3e_4XYBD1zXnp#(-HrN#KiF8MgFf-otCgzz~dAbdeB ze_jNE6#`wk6hHN$k6{dQRUwO#E<(fXhr(XX8KV>5T;Xa8ISmhV}uR7Wg4nYu^k`JC@NimK;HH14& zt3w8*yU)DfLvKnSd;b$GOymUz;RHW8bd2#i!B5(XKkvfOof0q{`r4>Py3@MZf>W}9JGBl5B7xQkHiKABx8yH(OzH^{~v*G zX_NR1%Ln_pK*@%||1jV@Ic1su;Vb)t4qE*ePh5ZI`X5;)NU`L_IN+-t{|_=D&lL7U z9WyEz6Ix_bk^VS#{1?7;3lS6hC;0e*zt9=I2VISi4*D-YS{!**h3Ew6{7-90Od7TM z+FU=MN;6x!6~qXOR4qCBxLEMSA06oJNAWl+5DyGTIgY`e^&ux(P2n~W5Eg0|%7{PG z2i-irC<&GcPRX3dM;3|p;wjn@A7_WVp^Ey*@iemridiHJ`*rdqcY+TFGDNHTSUkW) z8tn<4Elff}9|rst`F{m|Sis1d$9Km`kJa{X=wi-$im%$9>2tb2Za?td54JbIuC-tN z_*VOuKmFGBhmXCs?Mcj`-$s-7lS}NU|Bu2Szv?*ce{>)HZ>L#bJQMzx(KbVLE9?*d z^HjbFC-FDRi>>pBIQ#)m#9j1J97p=-nYdUp;9k-GzYIQ_vDtSe_Lu*s_Lo)afBnO5 z>{@2OO)T@1&XXY%-V*!4iSYsxvZMd0A6q(nciw9Jq6`&soFJ3_9Pr_PG9qm6BzBOcKo{v8yjdsr4pA(euDqYV0@R0RO z7PO^Y^H0Tpd{u6WPl=>EbiG&xXAgMfsnQ>}Z`3=%;BXwOTvL1oW&kHY@sw@D=YR@w z_fN@ld&qSaWn-$&s}U-u32M5RbI0itp=HRE&Q#D z?5HSi>ifCWulONGqvsq5p?A`kcNuBkov@508DU^L+m^=4l(^58^R( zVxw}Xz{fyl&{3dR*xn z3!oDKhRw-yVNzFl{AK_1l)Lrm4k#5{v=~&Kn~t*dfWYpUb5)i=>mZH*3Yw4=_X3h6 zcgMZx+%zu4a7d^@Nvj`s&Um+Lnh+1Tz0l(IV7M5B^zVP)~ z6kp9!P|(rlOqW2{(NC= zica;haKc~8b5LcGM?c^fUK%M8n$;Y)7AGpn+R>!(!iA0Y6}LRoe(3u?(cXLeemfx- zJn_P%_KP2TP5b*laZkH>`;_j|_pN_zFXKz%Bt0bg(R0*cId~j-8q+?PzNS$FZFZz{ z$RYLi%RW`dFBOTpNXWwPvaE9<JE#i!;gm_Qs6~m;YT@oB_u^ZpbdX~e>--O z;4d!D?k!Oq7eBPl`F zvcZ09T6Fyx9{DD22PJdb{~2nF{Vx%{|3hNv=I`FC)$#8KZqb@3EH7{YfrFaFPy30h z9T|7s^-s1R`tHxPZ@K5iwxd^dzPP*JKKNT(?LYj|pKpKs=yh#t>jk|-;;MGQMcN;5 zTe!u>Tpj%oUI#~zifiOE&vCK}sU`bD_<_)09{uV)HcNr%3f>QkvEM$YD*0? zUKsyWD#Z*F`Lcgm{I9Yi#zUc6=t-=Dm=kaaKfRFUD(9~&2Z*gf5=fba0SZTik+>;fe?0<>YS5|onFZ)@wit8QAkvw~kg2a{;F#HXiW5B2@k1NE;SsM*=v zZO%NJ(GI2C+PZXGzo0ht^v4L>(1Sd@sL0(HgK{zccv~7v z%xU~Z5Xl*KbM-$yE&nTPU(rTpc`E*=F-hM+TK3v3Oe2gQ>$UH87QnI)l{ZA~&6La?W_*WGFN7;|6O1=LXX|_cd zr5aKb|BHS(K7!~RB&K8S8}-86`~yXw7V*_eA4?2TQ~2uisHSq#|IjA!fFA;82O67d zThkkv*47!TihGSkY?!r+sj9}2cfDTH&?HYA9k8S0LECOGv?q6W+V{WzPull<;QscO zTl9dOns?=+dmlO1e*EX|X+QI8ceR^eeb{z2hS4(&&{z|`?Ksfa*#sJ2XVaL40v!%c znsjqRV{`pQRcNrUoz&aCxAkon=6sE5{X1&@RkL{J?WaJvY4&wyH%VADJh>@ohG z$NUso{-3}87?*?bv6&1B>k41v(oNMyyBS8RN&JT{tNPzkI2_ggRvaSzW&FoZFxVv8 zgp;{t@wamR5l=t<0|Q^l&k{R6Ab&-d@$A?aQ!|OtW(Xu>B02uHCyGQ_! z1xo5;VpIEBTi;35d%;xVMH4!Sc5Sw6R~%}{pS5|YkRwTOO>92U)#S*(WTc-s&ARBX1sMq zx*Tc>T9+QPebqB5fUS%Cp%xx%njkhdUQ$^TjAoQW^kW7S4Q7OOD%k%p%GYkYQvZwI zjEFeC|Ci!RL@ns%{XdC6xxUAvgNpMb{1k z8-5ZnI`sH%s#pfV_#rEpINHHW@$G+8^!SlKUi?e8zv`9tF2x^IuwB-t@Ban-Slk~E zU(83^AO3X=D;p(rR*ue74RurhQ>TTGXrljvLS*t`EId7P(5MA%TYEv>Ps}UUy$IGK z)@^ZNovmq6t)IzVpPlms*i)t612J1Wt?t@vr)C$l-G119yKQLr zuuyqO3;Lh>@XhT4ct0xxD{Z&HuHx zEKLyRE<`@@r?cYEXE%VANp$1KuZ16NA*Q!K^2DDXCn_1h*nagTJ{sm98WKNg@ZTg^ z&#Ec>s1%Fk#<}XSUwW`ut%U4Xz2nDpLcBV{OT*Y6;pPbe?lcFt3U<1LxU3FPm7ONb zxESIqQbEKvXq4|CE*`4e&|9OLw#V6BIbc%ND)Tho>817$zU>q3YwtYQPF^iKO#mzro_v0N@a?IRVGkm;V0Dt=QM7^+Rr+5VW3)BmA)w9BuiRsTi2BT#**MF{@@q|YN3jUxI; z=t3IsmB$+-&e4tll?ZgzLOZeFPJm<%A3)-668~Wp_{b0YI($KJHx@`yZ>j}+^`+vd z{ExhiCHT|vk6>b4yy`Z6@L<_r_{OQ z-OzaRqD~ibzYCwmHFx71xFG(Ge&J(V?WaEUj`oGeZd08W)_OxBeqGnD*lgpX@O74~+3ch);Mk{yz5F-R z3#4W<-4Ku%hx&GlCJ^ymjIdPM57~LX5lz{T)9XT_EO8wEcOm_Yi|9jI@Gd$0Vb{eG z|I5GBLOY3nRnvrj%HIRN{7<}*=!y~FRmLGV;>#?#-{I!^XoU|D=+I#SU$v9@x9oTS z!#9WTiooSK!51yf#3=FQqZLvu{*%lJe#YPN@JHEe*S}M5io+h@tSI?RsW@%!n$idz zL{bCW)Hnta`e#$c>uqqAtKA;8IWh}kPEy>1GRZ7BI8vW*9F73f;+!d>Ja_n}9CV+@ zhnYH^bt-(eI)}hPq}d<{`m}0bg`^~rcVJj#$xdDeO|(xV>N5D2S@^(4fP`LZ6g&9( zbj`uQz+Cr=n~UUW&C91XDd?jO{-CfPw+B>*4^NvcHiWycZ9Xnso-D&CTNd$11yLn? zMdQ@dM2$$qull4+S;1=(^wJ$lc#Sh7Mx}~Byty*|O`85Lz&ux+37&j=Tf`vE56wN@ppW-z3+|sjhc6N~XfJxI5? zqaSl&Va>;6YG2#n`|RhWFL&?47qww@qOmKuCJx3IS}hU^U*jOQqo?@Dw=CJm`Ul&izY(Xr8%Hqb z(1$jf=aThDL@AiMha3^l+iyIH628T{Ecw0cK}JY%*pDhrHGozA9`4X9c=0)lW;(yR z0}RVneO#ZS4Rj0u!(h%qJ@OhALji*-e`8a~OfJW7alX$~Lz@ecw!ijbwM#D|yd5UWRZ;&VezKDZ%=COkK9 z{{$aW?3b$Lf3O^c+-dW9xnBv$=U|sqzp1<6t0h{4_)xEd)MwZ0Y_)OW)C9>Lz@aYY zGkuoMMSiA>{MO;gcK-BZ?FYZ{f3?5$P0#Cn(V7?l)f=aH=@j;S{?Xm`Pd|8D`{hr4 zP1`xRN)R_OrP6(XF;;L z+lp1Cr)Br&#C|!<_TzuKjJ7zA@kb4HqVOLrBp=~d#_^{-6l3er{c!j6nT+Ch^+F;R^%dKA8uOhwU6bb$4}# zk3OciFF1ry;*XsH%lC;`Oxcu=vOn#d;!CvdjQL!8w*MMEcz(6U(erI<=Um&_*l8Ee zOGoW#Z*Q^qWh@JeH+6AGs&~K5HgzYzc}^Gf!**ul+4law@cH&vzy68#mK)aF-ktzO zx~@C)eNAj%cxJc#-2b?#{lw3|shzy>Ogn#(UAmXFP`{wK)k6N@TE!I6s~U)$2|jCS5wbR6#M0Fspr;{e2Mh_{QpFPBcKC?Dspa z(F{5g^(42G0aOJ@27F~oA$+c1NMjrLKwE08vS&Qpwtco;cg@r7wKrU7*X``Ly^9C! z14JW!t+?GKyh`=1*%7H($cY^RB@`d>aF4(h$emIocai<7H- zz@?5q;?|%Yk*IAC=j2326&?T7lLDV@v531otJ$$^cH|emnXJ=@PaObpA`|ha3b3SS z!blzRDGPS3 zAW(*wXZ(4kuDt&D{&(IIyZ-O-F$sAji|0@kQ8)TO+uUI=;D5#kdcb1=gE}!YQ_o+I zFT3@RF2ghC)L2~S4qXe~wyz&I(pb6irbpYCzwxPd)Afq~mp0m^=hbV(?kUZjyE-!` z&U7K&;;#9nwzap>u0L_Ez59Jnx4Um!Z)Y}j5ywAz*o~J!u|Pk6Y1V%4{_Xbb_nm2H zHI@$4rr%?e4wA)hFUX!SPuh8*poRR-dVB8qtJ;H~zpg#;)UEB}fiS&e#x4S%uWP__ zm!77EJ%h<<;WGQfc2Nee-IqSDIia+4W(VKDQSxvbDfaEDr8?`pyQ*+;h8uYK~% z+Gjs~ZF}^ITiYe=xb5kV{*d2TXD*NqHjtHkpVEGxR@yHH+Vpq4_{WVeFaD0x|Dg;0 zqCffWIQ<{4p8tG7$1?5& z^uH2W3)PuBgBXM=)GSbh-5L7g3sG646ZSA|1vDYs4TuST@RS@%an}_S1=p@pETyYr zsOn8ntx?<_hmpg%0-4~4tPWMA;(B5&^M!WshS81y+?&x_lB%fll zjYc4#C$r5i6N@I8E#5P!3q2nJs*xvy z|6zfyPxE|ZF9enCOv$D#A#?o?bu~FJ|NAanOl)~UzL>_?rY&@d<9vBwPY^GfI{TrY z$7lS3+sFSXmz;FdAMrS*!Y|#boca|=+8<+dF&BuePY+$e%7zItH(E zHb`Y`ll{F5A}XPxdGtT_*LuZ`-C>kom19lh=E{N|Cixy5O#MMkn#Ug+qIs|i|HC)N znFb8ct!Qbxu1~vpuHdw`*l)k}rS`6`_;mY*d!B1|yiQNCYv)Y=bs?6Wl7@_ZZceoL z+0f*_rsr39(Ctt<@_8?dJal6dbzNiA3o(4DE%-Ivd9(R8)3;Ob)w;$qyA9mQUy!k9 zFKo33{`jE%#_yhKzxt`$+u3KXZZDj_s%hHLIOkzFz8S+VffnANNJ#xsra=j?a*VQl zswkrl8{nrONs%iLWvtSKtc<@Th1}VKnZ}G@lZRb)^r7!nC(gE$+IoNQTOV)V`Q9(I zJKlJrU3*$9dq=Z)bqB7!dZ{bDwYwIxg(eLR?oB;K%LMGc(IN(#18w(haG__CkfHhr zUZ4AE9+3YJ)z(!1qHeyQI=kC`|BrUs&wlLo_UQ-tyzqM66v3yZgjidI z6De8%ut2CD2>+)qAyHcdba4fQd*4oueu@u&paq6IQs14KDf>bWtM*m?hX8-u zx%dfPROfz1*3kb*qD<9X{HuCieh5(mY^g`Z#OMdLWpbYb48D)q057&#QRQW*vi)T!|9jV-nF{mo^01_J<-1AD?i)b{jNW4@4j=d-Kkf(vRImFA#4xGXni6U zF{?4R&Kqw)HtXPr`4Ch==Di5Ar?N4={9bz^bT!_K`_P%#w=;{msu0NH9J}@iRVISdeUIWu$a} z{nZ8iM>RK#K~yI9KpPohkFkVeAq-hiSg_~=r{{5O$w}}=Jv=59){ra!lTkQi;xu1q zA@?7lsk}gz;)^QikdsWxkdH}<&I#w#qypKPkc<7HhbIF8!Ea5a4>#q0*@n)p8<{)Z z;TRL8z(;$mQ^HZb{jMzh&{>8m6S4y9X#cmpO-WY|@f8(x<#TC4vi*H(b4Od@C-t?L zXWL)A>tpS`?|P}d?JXDDEw9p-*U&@3z*lmZNNm6IzA$U1Thkxb zMXM-^+9g%1c2#S&#Gb8D6s3*P)~2=^Nv+yqw6s>Js@i*x*s=GFo!A61B8cSi%kvMM z>pJH;=X~DdzF+qP9=?yI!j)N6K~Ltizp-k(`AcUF#Lq^-oe14Ozh6cE+PYUi#huiV zo;z6%Aa%M-mBSXoysjJE80FPeJ63{3&yUdn0Hf!GaW&5bHsabF+3!G# z7}8vsAN@LKg_0c&wcoRG$(p?WPiQp!b7FnPI?~dDnCDzR)Vjo-Ww|T|o*7|MIM0wm zV@HH2S+149H8pTtiB#WlXh5~Y*pN+D9tEq*L53fL;>5s5H9;*!?U`d=Oa{w7?7ZXs zWiMc16uh2WS3RO|p;6QP_VU(+K>x+W#e`}VVQuH-a==Wf(!>N#v=J?!Nnb(jyiV99 zs^my==RUtfYF`-@*pDusumn*)HQ^qTt`os9T@mEH!qw z=k6bq7z456aZAc3tPi3ofab+1JMyV&%$ECyuL}C3;Z{#G<(kd~y|@r}UcU&PB|21J zYetfeAMH9hU2r#2=Oh#sI~3BW8$Xr^>u20E0ZIR`zH_e(IsP)OFNIc8gd&>jfkqDt zD|x^m$0Hd2juEopFyUFN@Sn(m1eGF+U&k!YdNb*ur~CRNI=Y98e&4TnV7IALx5)&! zKhWdXjKGez1Orj#KcDnK(Y5e1px0^`#Wx*kW<{Ls;|>QEDxz)7cn1+byjwj6*6)bG3;S;RlM@k6PULOa&_q5 z+8W+&L0xW+Phs;Nw>JbKOf(ID)qfRRw85$XDSnk4yA?)HXjvOSb3KBWPl0f%2*?EW zkV3bbGh7UDwg^I9y7CPzCbZ%!K8xOC=((HNT|ns{DDobkS9crQMo$u9+#|6aeFU<8 zMnuLjdiB66^4N7=qF}e?fBRFlgO_|X-+f={3nTKe{7%xPVX#a8c)0>0f5f5oc-Z#g z%XAj(0JxeLfEPE9^e9B-iR0FU@9|*-2|O?c%=6e;Hx6=+1Art#fc@KWB;aY zM}@1>Cafy0=-ybNDKT|FX#i$oOdFQ zV!yNHvEkhSO!KURei1R~{eK_7;KLzw_0@8xnxb#D_?F`Eo5fFtjmh8y`c?_z(@2e% z1rJ_WsWH4a<{}(0M3Him^*^U1*;*iOfP&ec@+y9x?iLllDIMsjwAQ~1{mgpeOAxvRjvVw~uqQ zd5kI*Qv|6_ZGPEPb3JbJbv2<%R-%7)jPx#LA6`Zb<39N>sni+zr!Q%s(*Ukpjdyb^DDw;3-a<%-AJjY z+Np+L|FfGz(%6sSkww6lPw*=oAj2O1`9KU~M1R%bb4YMltN`YT`M<%PtW%S6fmh*& zFO74mF}?v$6HXU7_0~vMkgl1=TNmSaUh$6&23E%a8i1<&t><@ZnwI35p4kdtzLSAU z^wX~Ty$-#Zy#rw;unTzq;B$_I1m-?j)T4g6CkT8Z)-4n2r~aiGOBp(TAN(lemHW=2 z5pO{U9&Hm=dM#uNhY{=U(fy_D9tmz8;3MMcu@?cG|}D{w;x0sn#)6)rIwyWWP&6A0V4k%uJ=>79g#XN)wJQD*mZ%d|NS^$R*?MH<#v_Dy4oc1i&cTg;ip)r(jLd9&>`B9_tT%9r|qni z_J6v}22lq7=VyEPcPg-qlk&r40sO4n&5gqX+d~cz`wz;d$K9r$SYcSo&BH%l zawN172EwZrSPR^QlgR)3k3_=%#d!TcRD7`IOZmq+la0CqPLF?sX}ZGNCMv>eR1|3j z+FG}HlxTZ@w%=M%ipV6k$#I zTOX9?Q|Q|0!7CI_?8m8rQ4@CC)3uYnccyz?8_7k^t0bn7*xGnHLuI$o8oDmmagD#| z=NOzWqY z!iTg(+kxRRbMGvNm@3mXA}^+BzX2XJAwnu{LB*8SO85=yJ@@q~ayb}i=DnZ#56}Af zlFjmqsN?KeoiB1}-!Q=O;9t-hF9K7y?Co?};~V6Dd1%Xu#Emuhc=;L1&bvU)7_F;o z*7vdT&SiM=$mAq8RGD;-vd>Qt0+B=mS_-g!SsT{v3#oBe!g-sSVP4- z8R3<>umZt5>-Jz%NnNc>^Zz}zkLh(OTDIvxgypos?~(3Bo@yo~W9eUPMmD~n)x?6# zNnzf6S15p=9QAK8EPx?lttM6e{YFF;7k5obka=^>)czNu9dh?QQ7Hfu1Dtw)L1@9n zdfLtJkL76g7~Ja6D4|z-W;>iP;r*Zq;J>32aG>et=muWSynd3trk9g;urZ&fXVBV@ z6VjIYIdgQiBU-%waY5plV14l}i4biSfW`_!MV2P6V*R(dg836-Qk2!LVwXv;7mAFd zEDvtIw(D9Z-fnkz0Bj~Ul5JPF?VkG9=!SF&pkZ`#Vp|@>S3S$0!r-5j>wADRaF3Sa zHk-Z9n?`@Q{+PtkZuWi_sMuzLgx$Oeb~f)ZL>RArxViz^10uHYK&;@;3+UUYb=@vy zqg0EscPicr?Tt>+3l6$)-B*72>W{&vmpzvM{v5aprbc)gT9MCHyn0ZwM*Ts!rSDr$ z6fI&>5mm<|WFdce$@bfu!1LP$`4na6HHcoCU4c`IpPLI1K&Me8M*-8l8-%w5-w(Jy z2Oi%{NLwsZAl$eY;YsAR0n@E5B*uz>i<$t%X?LUOz0P2(Q+)({pvB&crCJ|}I<$xk z{^7d1@6z&nQXb4<`RJ6snsupWYPg>it{0Lq5&U(6fcn_%FqJkzSLcJ|efweQJbx3J z4!$bI4bv~q?UNRy<{OSXmKsF&)4j)=m17V_M@ha|z9NzN1JC*RDncuK0;vJ+o6T5*5+YK& zKXys*2o!m$An-jl8krr_vB>+9q<#o3nV^dE{xS4WhmI>R{c+oyca&Af*P#4|A6I!& zwtPt@2<|KBD=}xQtb34x|LoSE5mw%6sC>XsLvXAlKVtYqD2aRdKdFts=Lc$%k8bs= zop)%@u>z^h&Okv*!&tyBD#0+V3t)Y9S8C)HVO%n%mLmh6JvSqX`&Yt+*&;Jzoqulm zpG#fLCjIrI71xf-1Rb~H3Ii;f40%Nu8rs&Le;1%A6vVRZ#+Em{0TT+)xM`q*D;%F< zT3y#nqCs}14%d`mLVdh8#%fyv#_*V}*UzV^(B%%VwCwcPAse7=tI$_kaOrNyi)lvF z_8Yz46nY_JNdn=$;}^PoLr`ig?QM~p@jux{qT!bj_*|B7X~WyucrN{#;BD#1URx8k zi3URI7v^t2P7%lS&qrr~C|kXQiNDUW-h}X#a;MO^b>QO_3D+5}M)k)_ElQN;`7$bx zCs;A>EKlvD)rCt>6u$l})0&kWpg3ZP{eq);S`)KO(>SL|kTjAv$J)M9&mVlA2xRhz zUpDukC0g9$e30Lp&2+v_lT7^FL;CzF(w)zAl6OrNP+980q^V0t!@n<1^dK0|M3=X; zL! zYX+7@Vjq6<&#U84=!1Ojmw`>?iX@eXc$H{0YV-3}ZsuEW&t9xU4{R`N0C)tT+d!Qj zOW8b_9KZ2*H05drFXs0;d`LQzjS?tE$dzg~9-3;e-J*fjyh=zwmp-k$|2za1qx7x6 z_TNy9Rhk(gi?n~6xRRn+%Lk-f(=fjk$idp$J32gaze>Nu0tai&g8b`{JcV!pr(Y5B zbrLU*@KQ6E;Xgi(a`ymq`c(wo_oW-!X2-e@*}0ZI5wPnGXV0?R@(HpCgDM@K#VI4@ z8PY+`FTVbE_7pHBm6BbJ=3U_+r2RMyh_K*-;}Mitb0Z%{F8$6MMphLVe4 zd5NMsI9&!HN9yhiYw)12Y)1dJiF8l;PRbGYjX8q^5kPk~)=hEbYChEp+q%Xn9bqRG z??I^WypH_xB-rlp+L)br;di%HvK<0wvCC^DRITYw*s#^(M{L`@<*ZbpMXk2WJzaOy z1O)1vyiHWLBx!tWGDfw3sH>6|1b?-~wQ8+tkqH)l2x4_s?|Z9Mc}NqSoE*ENC3{TJ zn)YCMEJb)}bK)W;rRKLMK+y5{cVnCABscyi{g8&zsrIQ53Mq1>NzdWkLwBFgAyTo) zHn4^n?p$Ri)Cl@Hn}&@53{v#G06wG#r`gI;8bt^R@CbAU@1Jy4$X@=Gf0}c)?+_7S zff)edr*WZ>T?Ne4$n)jevoHy9f$W-w{}}Vnz3%{gV=b=~ONT~Uc6F|Yw)jS$)s-n1 zw@bq@a3vRDYitQ6uq(>R75s@o+A_E9(!D$0 z#fIkMJ}u^uB!E{(xN8t|`C{N@yz2vThphWMeMIx2Uqwli?_*tdqk{#obrqFU~+tbz2qRNuUAW|Gnt7 z6c_uCP~-z?estb|wR=%v*F#!KUG8=Z_(ZslHF$u*O@v0XHlucY+RihY%Dvex|k%WY`~evP}x`WP1jhzSIO<6}kLj zIzoXi>scG%^`ZV;yaxexLzh4eS03ubn|7NfeK;(NNa?_sgWZ6C6{IDFt- zb8Wwdj}dWokU|C0#$xRmK3M#W^)1_DliGxrzuO>+%g@ItWGA`E7A;tP=I4Qd1y}mO z<7gZu1ScHCeO7*v<*1qJc3SVDSq`5~jG8SVbqK+o0ITi(KVCSPvyH$0O;0?6+fKD7 zK!k)JJ`QJ~m_Aq=3$^#r_4!CJJ;y{SRcczm1wQib9Rx9wOvP@oEum|y^%j*TZ{uR6j zk51>JEtC7;ooh^V!+0v^2wK|Vp6SEJxEuUyu4YKs`FRkj2U;!BYzXbEN#NSMza3&Z zR#7RvFm*s7AQ<-IN8y*IAVO5jHO})q1BZrVFMQ5Q?2t<+BaELu6jQcTxU2FGkFn2k zyYc6~Sg6LX8&Eq5bg$2t$fGy+opk-~Q0P!GH#+a~KJ?CdOwwX_Y>OL0z#m#&?oAR1 zxez&`AQpOsa7|C9OiZ=<7V1fuJ@~GnnWxh3$q3}dMk(0r#Z+aHgv73*fnx0k8VLR! zhRp5~|24f(QDHLzYd3pFuHOz~Bzuj@M^0;Zpdf#%r;!y!`My9Ey zMKitDiFczv_QPEiE@ZbK$$YG05>1i&K<4@2e))&P0)tbj@8}pn9jZ)Dec=FN6?uo!P{p=xe4N4)?wd`9J zy@w>&Io4>{-xn7RRz;oVxInqKIp-2GkwOMNWsSmUX^9>0+1|#Gm;+ zzN0TioZT|%ZiX}*kMOkfyC1ptXm7$M)&R*L2}vi7=ZJ2kbRKi<-@4=e~f3gdu4>SxG=^Hh@n80f-D6w<55C(X62n93c zz!PNgD!>=oX#)<7e#AHX9q`V^nAmAY<=(Agw1p)9sUNi%p^$5H%vV*ybUGHyUBi{- zVmG{BgE%X#olzvUU!P>hzVksN^DcHZpSPIJmvbciy7Fb*BtQ*Fx)a9XUyD*0g1H!l z&IY-dzzgF1+`DScGD}zZMSKhfK4E*-g7IwBouPV1GlbI8C*R}E1*{5JeZwOPCb8Ad z^(gnM=@lT@MK@8FF(&#;bi)w%;mVIOg_Zz0qILSO(5HeNwIyiS07)-9^w4Rggm>QL z$M?<~kk~cc=UxlExm|(Q-yYb72AIkW`QX-RPwPLIg%@4R+5KD?eFhTBj`&4%pke`G zw^C?O*7|~v_#p%{+H<^otQS|^F(OVkvGm_+$x3~2j?p;sRW#CnZ(HQ|J+hA}0RGh3 zc>%8IVM4;3ASM+}|H&b>%r!SL)X@44mHS{=rHRUh#Jvi)ZTH3{7dc-q-KNbi2M(km z$VDlRR$_w2CG|ulJp}wYescQJmW*yzvzNK&ai0$s)$P;yrDgUn9!nU$j!#`LN`)fJ zh}-Wk^WjJ97zGF+53~10VH8;ZP)EUa#z;P^L(I=m4{Bh;)zSaBPcHQ8=f5^NVxb3v z=Da1ru*c=h{jsod>L$!qA&SHZ|Khb8>Al;te2ZqGD}ODuIH=O|KZEjbTLtvM6`$uN zsF8&(mWzY|12gJJ_nOnU=og)?>`E`gzTr5)7Rp45J|vzd;r6b1ZUcZF-=*v=bG|MXq^Lf|ddAzyrej1%<_LVkhT9~Xa03YYberQbgrjm(hPaAb)SQECl#^^aq)&G(Z zr&n7p+X4N_cJ=SaJTEhde7BHQ#ggjL14%Ix2u!~2|13hMm zt0dwMZtN0XjKS=7r{@ZGd*}f%ahsyb zifX2y|Mj_K7M_ZL7l4rcLE+GPy?v5FpyD!-N_ z)zw9CfBDpOJUmik3P+9kj7Y_&Ed|j$8M0R7Am$=UYhn1j%^Jw5r-ai;>(wtzp;dex zH^WS;1PA*ENPO!W94*#ap+KN`vtqfOz&V$?RG_Tsh_2qEw)jvUVSD9AJgzK$ESuwF zMPXdb9`fdPyko+DgdhU%c!3E;IN3tjGVP}a#POT8spY@UCr65QBH*7qXITha~?#yb*E`um+G~Yx};qwsC zY-%VWzAQuQcQPKMJ3C9?L~`7$62?9lOV>4^H6rD-B#A%z7!Y*AY2k`NHu zf_rG2l8%yBS3FNbIp-HgNM4tmr1rAwqXlCaFl}D5-49!4fY=p)JyB8C5 zr%q1aBYbd3{i_`@4B%?_5*fFdwOG2NLo}0^7mGi=bbBA;{Vml^um^&I8~-UEP3xh0 ze5B!GGA`D%S^JSRwWSnKD5C*?f7mOO|A;f|4|s z(QDrrfL}9^spn3_y!MpQPhvp1&hs)IYDZretfs^`jD@TH=V zj?gV}fn2xCDa8dz8sncQ-v)xYX`ToT+CEh9NP4b3^rn4{<*V!zN+t8RzwGU_56|I^ z#_Mq&ywe|G;~XJzF0VoU*3W-4fxmYl)an#Ns*BdFwYD3_31+XkJ?hv&f4_dIh4^XM z-IgYY)c@L6)$jd76-rWVx~l$;>>*mD8;+q5_aVL6apBfNghHxE_LD`)d(&gQ7qR=F zfr#hy)W}ffl&~_lmhO2fNs; z`t!^*t|0DzRxhsv_oIQ(o`xUgSZ8AmY`$$Tob5)fdyNFCV|(;Wa_QFaB&1WGWmqWr zQC-a=1`Yi+EZ&nfhi)K?4RSJYm&@q%8@|)YDV3lvC`B50BO>()^&#uaAMZgl(uR$Y ziqWflSj~GQr({_O%VpMla97uNb|Q4)Jc^u|IX$JdbLT|}go6aGkQ)7__@9;qeWnAE zvQqnZr)k=uyyIeZeH&BKXPYbc)RKSLvXRYHG?d4PXr_ZHy(_PM2Hc?bpA8mbARToo zY@5gblc3|9y*i-e5p9a&S1dQ{kK!S*&GC)BNA&KXOU15ydWVM_d}b5?PC&v8q%3HN zh7K8ih4Ik_{0PD)7Nw=i)PV3Mo3&?z?RS`vrEkkKZvXc7_qINe&T$v1fyF_)GeL!m zXL*;HTF-e*h6g@c5ky+A16{{ZEH}3XZM92GS_YcwbDym3tq1_4oaXf%=?+r@1~oMW zUUlkGyJ3zOS@(0r^?P<?o<9eT((h>>^6YV1@yrxnbt$EndduuF z8lSu8%2b|6_SL-h%o+C(ONocfzi2>^8yK^&k-s5RmEPDMH*808#^3Vid;^f2QS z;WlUHS6&?OOm zF@}2`6o58@?$rSy_GMT7umvO$w(M_sd19B9FSF=oZ%TJMOE3eW{v>2Q-_ZSyLtg7; zqi{VlE%2bBpzHqJe?u;)xOR%Tg@)EaPIb#1fmqJ78oNc0ISB_Y?yaihP@3N}wnPkK zg7H_V_6!rGc{{nsl~yjV(4CUyt+AShheKTwJ`7e_PkOx=vgrs>TQZ^Jk25;(|G|P! zKefpKKikJ=b8T_1|J35uHQp4V`S=^HZ~Qsr7UmRPbd-3DyD=9v^1jb5)i4iuC8PIM zi~p2Q>ifhxAbH{Eo0l2n#9PR&*i zUu;5##;U3R&^cN<#`43l1_@Gx4)zfe8<21}i)U^^K9eNLE|%ad-y@Lb|0@buA4X$j z+(>F@WNSl<$d!u%rHJVSeHoe{*DE0-N@C&&+Z(oLB$G47Z-%pVQGg)U(e=_bg+G%| zdo5^&UR{Y_3^!=b(}OP$>fG>!K@jF+Sm0sy)x~_)1b90LG|3IwGf#v2OQe%4#Tr zqRJvSDwm=r>ST9B(x9hb{3)Il(|Gn8oEzVW%GO+%i1s+N5IBk-ZFF zfX4Gkh+%OAPhXU!E%CHj%)k5;n$J%hz5#ooRxV9?kUx01c`mW9@V!})CSL-_o;fL{ z;qvJSAV;)~rt9dK6w@l2_*?lM@(4kzeEYHpgr<|*HzRBKWcFVbrq2oaAfK6u?a${2 zj)#nbiV+)pp<#f$2Y)&G7=0NEbw26dkRLxVL9!e9GgbC{lVGbJ2zhDt?1YXmiq|#J zL#2wnmz88=!30iCu)BDbF$b7QA)pjQho*K&vPx7eVN)6^dy#mjE-;e;48F^)qhUhp zuJ&Y7@^yO|cFbinMXwZr(V3TPHCa9m%n3@@>sda=95|1_o!~9I?`6tZA0ZJ+5NT|) z<(y^wYz;)i@r${y)<9uigYXw5q6!*Dgk8@9&mkP(jay?}{r;rHUq{Ec>i3cNb;vsF z?cHv##%};zJdYtOafwEnV6FhmE~G6%czw`*-{!8VPGV|Cs}0V;cMB2Wk5-t0IS`qC9!cRCAkWTF zD+SUiTm)FpHTO|>;v9gLf!s-;gjzy>b^!8zc1Vv1d#gD;uFBKWq^u!o5~l1PdA~%B z5ORfPEIYqURM2j}Di2fd9UK9w>EmEDa($V?#H3`^AQx?m9>Q3W80hNlC-ZnSB{hR5 zFV^3Cg+1@p&{EIUVh~-Pdn`wBTVrd&^hpK4pG+h+&qV!ICXmiKoc|p?m)bx#6`a-_ zaqWgQNeQ;;KY1!lktWiRz|kiF>E^|)TU-D;4TX;W+ZBQ8TM$ea% z+#`;J>a8fk>bs{266rDW{Wo^>eeSFBb&!QDoojB=J{Wtq)#bmj2M#FNSi7#|b1_oa z!x3T`=rROX5dq5qu}+<-`Yq)BOGVP1iad%zS2d1KyM1?7_`5o~9nHFULQ%rCHP3x2 z!zq67VyyLOU%$pJa1nvrf2Chj*Sz@!v?NWYLgY@tL-1m(K53?I@yhKbG;5isj-VcXVlgm3PKVlDw`2I}^uz;$amz zrnl(Ou>BeK%41!|J3rb^a)LZX(!u*r3vV{=-3M0iL?ppU?kS_jf_?VXrB09UXurkB z0QsOhmgA#(Inj}NYwjPPzb$s5@{pD>Fgexcu?QY;#dLQv(?A~+{fTxiAkcoMA_ri`|_r$w&J6fh_nyZ@;xmTS&ozt605zr~tXO-{^7jaNur*N?* zM(6NaVoPZt8+J8Mod8ddWP7P?G4PnGHE#{ zDm9&{1Ka?lNiIwa1RTTqkNhevqxF$EnX~G+G`p+}k*<@2#7o5M6BDr$gic74$X&Ej zx(oLT1KhJKhaCk%k5DBa%s~gCE*aU0aRa3dgb2r9u)p4DH**SOjcuM-Yr=C|foBr| z8KhWvP)#mbhaguItz}y#(^OJW?+3@&Cb4HIsAv-N`8}JTkQD*;`vTOZl5o4lpAXc< zCeED{^Ib#;27UUJ9-c&7Bg?(N^RuLyq-*2(>-h=oGb_^cUneIZ&-2NsOT3ov zG~r@S1yol&G7iO^w)U^S3Yi)xyZF{~Y$s8R;Ffci2%O%WXI;Gf*(!lj2{;2R7PxO# zef;uU(2lUwhQh!rbEMrBl zwXt#SJB;XRgv}41eFHTfbPK)touGuUPGl1e;ZCHRc73bmOGd(} z(}1?-oxt04tzKi??IvBFWq_|A5w#riZpqT^w%>i6pk;!XiK45082UiK&Xc;EbL z?q12=OZmiIQyV%u*BO92zIfaiI)CPh&3v}`Qs9UF!;bZmQ`<$Z!>X3NkzU_n9iMc! zFdVuqoX95v8v#`7`gd!Btla&oEJqJoBl0Q)DJmyup4Pr@j)^?2*yj@c^NXoB@$e$T zD;BaBKoB7fPVn=WD8~m^?hC`ID8&mmlHYQ7b-)NKp~AB~#Mh6AUk6I~z3=PP57nF3 z@)_qBc#dUx76&*7zvn!M!Z`Tv6iZAgo0g!(5~OdGx)Vdw!;@LeTC6<8wYcjhx`3NT zh;n9j$g^Q6M2mjOI`;!t<%_!%zA{0^AOBv*XGfeOrvWy*Al6V860ZSLJ=~?nSHt)8 zEtJ%cCl@rg{c1$4@_jK?caId_YVN+d;y6E*iQ{isDIWmX$}Jt+UerRAkKcIWGBVa< z(oeeeXj&g#^N^-ygoAu>bM7A3-I&ky9%h-F;>pR=2AIt3y_ zWpy9!darxG;t7=zp^r&CJ6YQtql={sev)0p*w0~y<%OLtoMIy&AFm{le#vhuNAk&z zXJ|Vf$P7q$jjVkHqeiML3si{+DuuUAV?rj1S~qX_WcS1~HBo+Rx$CGD*v+7MnABheaw@&Q{G-cx1B0(=+25+FY{K6IQ2IWV4O1iv16W5*9hS!oPCp<0d5 z&H149njz}2fj}>R9HI2I4eGVwhTz6Bap-iH544p%?ZH}aP^7Rkf`zVy8bmN|}1UI{c$YL3nj*qwviG>?PMN?)1K_BLI*ct)+fysE3A! zCLHDPbEfowF!k@x^IZ|lQ>Z#I0}k7je6I9|ur^xu9vIC>C_UwbWy{EE66{<(@T-2$;yvD8DzW&9H2H3*`! z&mR`o(3~=Z+UG*uqE*8vXrJJwCsI`C^VMcePWcP?7=FK^Yz=W2bn#LPFpFW#GYEI% zLXz8!(zB};$vk~km^RKSsGzlFEd>pU0Z@*uX;!ubF+u)_$X5~V{_DE~^dGeAp1nb< zO#A%bJ?K`2C1DkU%qvW{WkO}#?`9}S!J4*AkmW7$5Xr`b%MU@BIZ#<$8;_ghW7i5J z&7nYxjJ*ZahhdoT29JJ>4=Z+2M5D`~gN&z}TAs&c^6eGZYg5PlV6|Dc&#!`*<`k0jdfW_|R$K2A{n zikqg-8Xq%1I-`Iil1^O9nu3c-F^Vyq_t?9>e>oUK(-O1^n$_?Qg@{Q3>?P$hjmLYFHowN-fA=VQRF zX*YI}_kPVgK&+t?y;5)Yg%KenH9|1e#H6ry0bTp?&Z@Hm5L$T@>r`ne>2p@(V z@|vPbpP>phegs4INTY?oY`*KmK$+JGP|m7#Ue*1=Gi9r*WMtvWq?b4?bC+)<-fu@7 z1iDvbdyiRHkIFEP$5tZlA&ni8-z2xya9{RYG!wo%pm2H)%eZTSqBt6EoHp_~5 zFT&ha|0VJL&QF>GZ2~5nCqah3xKCd}(Yc}>drt>mxF`8q-^$xIPn+S>k>~w8{89*d zUB9S6Z920q6U#1#z3ZI4yKGVAvUjRKx3QTh{~O7p_N(2n$&Xe0QBReSS52OEej6VEwyYY1NNqZDr$)-NO4tWUBvR zcgoiX`^jAG1)ut=oXq2l%lZgPAuArxXIn z2+U8!biX%nBK zVdpb|8tcw~ZEkuCFR3~6US%XPywPM;Q$)kR0a^0+w$JG`&cvS!mfKQ$CP6+hPNIjC z@e{n&w-h!3v_;a!yRx1J86%JyMiKFj3I` zVNp88k&xdve(pG337R!>Jg~d($jNXaNmNK92bQbnD2S`EpX;L^$>xI~6kC6iTIG^@ znd76Fa2mml@ngs8YB=p;-wO{zx(jvLxKNBl=PIYcH~i-8Jxk2c!3}leTG`Lmtg?y0 zZ$H@UqeDOy83PbP-^#qy?kXJIOtf7#=$Vd(x&$9K%%1tBQh!>>{S0j(Mt1uY#I>MH z$lD$LPe3-oj)veL9jd@*$;ldKdB-pV_dob-uMBQ#w6hWXs-2^ z#?Nh3?3v0|)58ZJ!feHUSPzE>JAA66GQO8h&DUf6j5E|Cx0sUibLtvYs``*mH#-#{ zBXM&3&u^>%5RWW*wo_r zA5S~+=pg2J8tW+%UROJbN?1gWzT}CcF*K1{=SJEZ=%k;8ke_eXp2A4G&%O@nhV{Xs zKH`l_E7Xz&WPFov5${GM*RE*hzg%bgMFkWTW+@y5(nJ^xs?IZg$Q);@VaMBAc1b`` zD8XP+j_Gg~`Bk`-@{t9HJyNf8InjCa4qT~+NNG3o`Wc?8mQ@v{pU&Eu@W}!VNTiVT z7z}c@)I$JXKaji?{{6hn|Mbt-#LJ6Kzv<&|HgO7O$%JJ3csN4@o)xlU#CcRU4HyUu zzIAZ+0%iKS(E+WcAsTU7Hx27k;t;Ee1s)=P4qRe8Qa_D!!%EXgp%UZ}5Tt*@)fsp< z1mAFZAeTyr*70Q&GC}Nu!aqf?-Rb`k8{2=bsV4~wV0S1u&^j(HgQUDVc_;)vc?L|q zmVJc9ewRQ+y`%Z*2pfTc3a?7mk3m9lS9V>Gz-#+`aj*U+=H8d`&07sKoZto7GVVKGm@>eTg76v{Gk%Ok~%l0#3Snc9lKK{zm)ai1)s;J74U7 zs?vq;edU6s4gsrBLR;}St?pdXpS1xxQQwB$sKP?(V~wOVwj*LKI1ZoKlrxqo zQ}|(s z#PLM@C;wGTgWOjG8<{H26b>ykEFZJYLc=AAZ$>}$kWhl@&Zb9Y#{eTCPa=W<1#f`F zV*IRj*ol#>ZX)gVlfJ4(#jx0pfR9P8KK{_(|%+GPX3y@##)!;x}DPhsS1kpv{W76+=w zpWz2&VUWNOR!WT%g6(4^RK5=<3h;WO1SK)^;g@2^)D10nz1tN|=8)nTaw(#z6J{XN z`<%6cf~v@dKpSIoaqxndTj)jex;V?ojjDg+3ekBvDYsSBSJ*A#lWlpL%(sjc7`}dG z`^~F-`yQ#@K*>i*eVDK)+tv}!=C*g+$Fe$^5zA$>na@m3_PA3*jCf5U5jBri{;}wI z=lyY!p|InxRl(Hy(~^hn7590Hvyc8Z01UMwYRjwd*+Mb@zA~B`^RZ$@Epa^04j{c1 zN>c3qd6ourmoX_Rle$5l_n&l(r+%BP(Is3>geb|8lcY!4d#a9>&%;YUIOqFM55tptVCNKf?N^`vyQu5ekHKJw z7Lz{jIUzmF0NJO5eS}346|h9lJ?|#l_J{`&&2&6u`MB`klQ?*@)sVqcWem2iVFm!% z-{GOw9lFnnpW58F^u7L8%^0N-Kh=o(GoS^wIG|ORT_0)pEhOAfk_J5NV3XbjAg<2Y zA6u7lJ;C@ zPnPx~@6CR{ZgmItDEVO7Un1ul@%s1x0@cREYD66W=U0SZPir|M zO8JRSgpu-yvC2geSwjxIJ~PDGIyS?MVci>xP*vPds8_ItcPyg;Wh++GJ=g;*W#Q3C z+XmIQ`or*%PmXXOLK6u!5?*+0q1(@i0 zXfV!&kK3C@!Ju%p+b`pRg0ZTt$tgD_(wj&xJw9j>FH70w!q!Hq;fv{5fcuqS40lEC zl`8Qjq*{LyUhstbvEI34_r`x^jJLP!UD~*78sOJGAM=OQ8KCWF)16ZmCHMZ-zKe(i z%yKia&4Q)f-bpL$BiQ;}ji1Ns?{)5ha#`|jBR*Xf-+Fm(c>5TV0pSJTQfIKlF5lql z0S2o29H!JVgS*E|S|2Jw-VvrklOs(Da)9mPm&sSAZMXT4!x`sIz?Mq4#NC3(+-n<# z(2!`nEp(*2<9Y~>!kO-*qnyhIA9Yqlqx{*pZzMjTvWl7e_g)>-71?JUJc)TSZ9y&4 ze6-02e#GeQWzf|C+Bo2FK+A*Y?!U2qaVze#=ZgLAyTydW40>KY9876es7-GL{)trK z?)(8+u}AubPd4~-Pw!lvy@~7EsMHe~w(EKp%1MNy*ixJ~LD=G#b5y#tQ zx`mDstrNs~U+p>agkIl{Sk|q02UscT&=%c;R~7$t#P2BiR6lh&e;^~G`-wn>EDJs_Z$H``|NAdh12=#<(aKtg2e11V; zpz%b9Yb(qb?Kg2AF6nmTVJB(g*cKT`h?6}9%%MKOEgMO) z{K0+rqBxp}b*$#=-=~~{PH1T3+ROCA%+?t+Ay;$XJ%Y{*PLALvD=k^?-f{cfDbPmC z#W;C8r%wf0GyY7{Z~XW_YNsvociCGmYo@*eFv-~e(R7tjQG9=21w;fvx>;!iB$b9m z@JEV>fPex^h;(=D(nu~PAuS*(NT&izFCi)2-LXsV!tTzW=f(4G&Y5%O+?l!O-uwN2 zYUP^L{#ydy9V+c!HiMpfP@k?(LzZdBq(64l12SvYfV3Nrnvgf?*i=DmbyC-i`5(ZV z0PWoK^CaXa=F7NybLjHl1x+Z#0BIo6ue>;B%%Eyix6$6KJ6~y2sA0I$j*&23YS;|d zMAelg;;&`q zoZrC|z(b%si7T?~Ub67owDn4MlIu|2j#Nx?Bk<-Vh8UlKWo(E57pN;3TbmJ8o~nbs zMc~e_AbOA!FjIYkkMUFw_`?>)`YAaP{si_3u*a5^w^zo&%8g>x5*|bo4?!b1mgjaw z^-_Nf!wwpx#`57?=Ry=+PepiRo-jV5 zXI|nuTc@}REm97p=WwTXD^X1o$eG zgg;nBAZgR;^H7_`Bh+3gGBTWIF>8;Uz5_qSgIpkz9ge-*FV*ZZX(x3ZzGpk1a|pX%lZT7&hAhmtnMRvZblmmQaO=~ zlEs$9l}pPKOl-6@DWEOG+e*#vSq)pzz>oxeAS_O-+7X5V4?9L?8hS$ zHP%V*#JFdn!oI1alCP_4t4!lGciFT=VCHLOIxKGVfw!pX{^)s-z#7V^YqI!OY8^@t#TJz#*V=CNV#kKb;5Hw2(rnNa z9UayaM#W+H2ez}f{FHD{XTDj4>>r5;{y_2I5 zf_t5vt=M#MAA%h10B^tsN(vSy#2c=Rl$jYP11mc0V5DEF0hKr|lI=DrV(9he8Bf$YCcCfgF`MHQIEXwKr6hKT znYDoBWZBzUupyJ#y(F4m)l;9GYnjl?)4os1Bpr`%j)yg886ZK~vLON|$iO0kz*BGHQ zw0_7ddA8N~o&bKSMC_Ar(Kc0Iy5xIyl;gHV-HQ})1t_KotFzG0!nQ?sy3duKzA}BS zN8w*uscHA-kGgyN+IPFXy{-`AZ3^o8S{7xC>l}{K4e4a*680w( z2KO@Eid>UWdb0MwDi!?!CHYql0y4&f1xSJ8L(IM11Y%p{G`AkbkSexeJyNA;0qubS z3CPv>f59uF>#9-Cg(LMZTt;abOd1~b60(VpiAGpzac3_F1;LvCbtd_DTO}C}<|mcm z=yRUc?f<_Q0POtX-z=IPBIKhtlGZz(<%^rpasr zl4l0$Po|k*_UZOaObFT`bLh^GFlX}OL|wJ1w;$QlF} zlD1It_&NZ*LV*JfR#sHmx;tLe2IRE8T`_hRn4_jJ>LICKBgke+ds1BV4;dQw`wNf$ zdp7M{l#`wxSx3X3`-oDkMY42; zlr`Y|O)5SPJ_(z{Tx#AG`!6vK*m}5i6Rp7De>(!2j`g>a7r$2+eD33YVo@&{nZrnW(M0$dVDUz>_$);=gtmO6+)c=R;nauNCpyM)Pv zO3~4UL9xM`w-xnz35@ABJ)q^}QNQT#g`;U(y4GQ4`R?wjuR#F%?vAY8*rrJdux1>3wgXjFnYj3s<+WL9gC zna5Ht@OFkK^AL37LE-(XnU#MfUg6+O>-X^*y2@tcgfWRb;H;;QwQ)tt(I39?UG(2V z^33k!H&C=2OP)iXyuCM3z0nQOLpcg#NC5hb@w>22*X28(eN<#Nbt4}#M>_VxzS?@C z6ZL6-(*w75a19w!@1nTu?LCajFxSjYS1469B$*8k!~*V?)V@qJs$}sofY5hOLfmXa z8cFps8&KzavqTlT=1@yjxPHywi7cu9H!jB_v?etuO5Z(TB-n-H{@t;Ujb+L$Quzf( z>=KQ_Stq46DpxZo9GqGs?AWSP-7P2!U1#d7<3CMBfRj6qM+LnkCYR|eKYD%Jr_xwQ zgX*@hW!{o7lUs5r{5{K_nozjwumiCI<=u!tf&0m?X1X6ELCgv~QSND-DDAiYRAC7E zhg|e!f3e4=_t=W>hW0>*!{}hWuqG$+7uLVctOvMBQbJQa`30T2R{Aln zrhp({A(_K3BJcF6%3r%rd^t}>)(WyAtj9%*K4S$$(J!Juy-}f9r{#W-ute8K<&@-h zYb6cMbCL$ac9U5Um7~ZbXxT`_Q|`37xqUFss_PVG|B(qgK8$A(25Cjb-v#g8{&P*m zzai*wBaHG4^eR?HYxgsX&P4-nd&3@{?Ij~`Rjwlqx(#AsP5KrV$iR!-cmVuP`n z4g-DQn!pyZ5N-;vUWRVC?Mwiy`V~|MY%C8apIg)o>ys)@zYZidbu+CR4)fC ze1SYBrD-mu8I6HXCXHiWVrs1zydli1f%^Zm{9 zj6Hs91=be@#D;I|HVUlK)juGp>pOMnig?Mvz9a?(1;ub)RbG9Bj$u~Y6%dekN&6l? zVKF{amgDvjA9o2tlKMT=>^F1ePd#{yZoune@WL4?IojAo4g%{gR_jBUG z>s{h;nt#DFF_Bz+f6VMUWypuFsnmr(?fB9EYja}nSq`xZ(a#)y$DYpytf=QK6Zec@`fy@;lScAu z!!OLgtvdXJC`X+u~24k$3WB2`Bl+oV5o)5RUg# z@XT_5C>)bL5Zw3TIpuEGEOtZ@q2?R~(>5|C5WQ%>HMI>ot(nr2GwcSPf;u+QjqNW9 zaar!#su_4VBAKi1s=ofn$NwnR{jS2tw#?33FEsqXd|F{*+&nWUP3LxJO_NnA=a={8 zQ}rkmyyRiGhfb&j`?`*0NWXM&7-H|{t7VFBHEu_BFWLZ_ z9Cf;fh>|gr1cZb-_dBU?z=VCT*r^Z)B}+MdekzuTK1l%OYKtr5H8D_Z1xoY@)}PHX z6TmNxx&G999=vX^Mv3{nyxE8V2SF;r{`YOr??M{#rmGOE^AMFNzm8q3tGnyR^?YNc z7)Kg)LY8bf?ZF8qV{sGFp_heTF3MXs!Og_=>&dA2%M!9|rn@U=cFocp&k+YqTQ?eg zNpOr(dUUzbuUOcV_}dGOo50`Edn9#wIFkKHw{U>EXDuV3H~&LCzp>_%aYHA5-LXJ1(o~JCV>9ZF#@j3Wv^?{49QVcjk8V#Sm8p8FH{2JKBQFW}T z+k4&s_IC>HX{0~i^!eW|6!sYZuF!e%el@Nk77P(sCFkEYz3F5SUk;}BO#!0681dW?Kv-c;?3J)Skr9}5Q`hU1k<6TKfKdWSUx$a< zpK9WAWU37X0oX7YXBoV0st5w&WfC#KViM+yWXRrS*4Gr?W zJ~L1;8opxm4T>crD=vjd@E15nt5J#5{Xfk$WbDgEo+LT zajgITO>9zd1wLyY$1d7JW9(mIYr|iNmEY0#`Na%7eNRKFLnf~hAIp74B;v$;m2yWf z_BRqMy>$%Hl8iyn)k5D8)ceB04AMRM4o|a|jKf-{Fv$O6=+v=MaPdyf5cmyn74upL zQ(w?Gs@fw?IN%`{_qp#ZOK{+S8$$f$W_@!hg1ZQJ){KU*1RI_Du>ncx?QDpuzRxR2 zBe$gUod9(Yov48-j^jYo-SG4=U7 zbYzIq!4x-itgc5+!l+h}a?sU2DXUI~;KUZDQh*$9BHdCn;vNZEuPK?Khh2iMSBb-a zC8CGn#~)6A0v#Y3w_=f0aqRlYK*#6m@#pctr~FijW4;;X>^bbO*>zXCECG&w55~RH zM-9g2R)|DdF&M!FVf8gmtV16*MT6~tc}3cbuYCevQ8SCjIYuWv-`iwq9 zMG|Ug&Wt+27rLt@W|R@4m%6-Y8T?fGqU1$pY*sE(X`K-W?V^&R=n??<(YjCulioor z*XIyUM*8!U9;xCdYme%zp{c9#El0YXRM|WR|@m_4xQiCIb@@e{1)wM0$52mW*9D2 z#}VV)>Q#zscqf*`2!qE853bjV`Z!|TRo0c_!AVRNQYf;{2!v8+l9tNaT!R?Sg|y~F z1SGc0QeBPau9h;9x;}-<-HEysLjbP}bFyjT+|RcA$K(U(~%=NZ@W5b@Bk}hxZ2f!i{>}TE3r;P{> zQ)|FJF4R(8MJAc%{^U6Mj}UF$`!3iDD z8B1QqJQfsEBd}W1z#e~!{-b0ayNa=!j*mMm>!i6}i+?rH5>Z=u`p>2#`GM_?jYV+{ zKfY|PtZinDc-%K&_80%$#p(kV-u_Wnj1BPbO%@1o$6y`K%R)Wd6VbD6e^bX@{p3#1<&HS|jTzaVofl zlv7-RU=4INpy;6ql>XfKS9@JmU9PO;jtT@dV`cyaN*dh|IEeFaW&^|m`w%vSPqYNd zNMu63;D?U6b=W+46IKRek%Usv_JPfbZPHgkOUW`Vsr+Wm8} z@~HYT;cPHg6Q?SQ>}o-k2{fEfAPt>kLF_ZQp*Vk2oMO8r)D0IIu1dG^@u#s#urd0UNzjNsVkAR9*qgv59b=(EGNNx=&I52TT>^b!5LQlsQqmeI2 z?do(Z>0oEYq3&5QhGFdX`GZkv*xL*YH&Es5UdGWp-}mlJQbXX|Y$4l&af@5@b9J$b z-7X~$PSS>0O)a8&dV(nmUJ<{W#orZXC|{)#IM0smjww@{D=aG$=GSAgrg!>ue4bd~ z@tK*QNrE<9uqSQYz4LSYTsZh5&zW%KP|Er)W}Vx@ zluGQp=hJs_;{Ye-Ku&q;uR;bAj=ietR_CH0Z%g2#2c|MWK8D#R;O7f1e|3vC5-&#_ z8kZY<@=n64jB`@ix96>Z*jMpz?KmMqt@AYnKQ`RQ?Iya{++dmcm%GtiGR1o*@LU6> z$e#1~sT}%P)4YlD;}skx+y8>4Fv(fLW+t6YKf&rVGax>RjZTVa9!xwIDSf`OiBQ+l zu?8l$#EJnT#8cjFS}3tyXMWYx9u5<#U4%Qug+kbaMD~STu0NS&X=fHgCuD0BBMLE# z6%X$0BH;ZHOOexBi|((VxD+hH;5?JDi11A*(nObB<|#CM9n=u9#{+~syyfhEyH}=j zgh)%N;45gm>L!$$j{VPQDUnYOPjjuFr94WXdg~F(x+~||+ie&e{FCBN6F0#fCy%(d z7N)DUquJxiWXm>b#ftO)^J-;Yc+ZGxZgs5CTw%NOz2}-mY3`W!!PEux&+o=%%FBr6 zz+MaYt1lzZ}z{dxKbI1nZ}9N)QjDSS%B%iA19BL zrSr*koQ>U^Tp?AgeYn`@8Hb&6l@!~p*sl(5>KVD7Me@RHf}!WdI_&&^xDzPSOEgz< z!j@5m3_hZ#{JOE-?J6Z};+;PoSE#1LdG0V9`y_TTLoaQvXJAwFes!fpWrvCjGU`Y@S> z0qQ-x39@SntMR?-UdGxLZ3rZP3>CK*^Ciq;y7IAMPuAa@a7>fIG%Pb184eG>*nG0T zZMlj1@Dqi~oZ7#H4d_0AZi9Ka33bA2-z%zw8SnS^rarG9H~L7VVfoTTy3RA7GU#Rg zedH!$e;lksDBKl@SzfQ~=?@shp~k)`N(Y!D9}U!`!-g=|Eh1(!)pf|5%l8!iI4yY< z!>iw)7G{;~)C0e;{=TQQG!|L*YS*@5xWRUbFxxN_ToX({zn@>vaGAncDcw^?$1}n4 z+r^K!KbW4CcpiwQE@pzid^NjC8c@%(bYnXFC3T9UsD14re1C~LR?L5qlVCGq{Bgla zp86dvY~JR^geT|x-Qz#6a)9xyb$-QqHp4G`hmSFzHBxb>D-$zmzRipaGK6j#^WOWg zSkUeff^y=&DEpC@@HQq!?HhDLxf`iK&wyyyk}B^TwtPcuV%q#eU*c?bMkFV|&}i~% z#oeiNbkcRo!zk}?jP*S#Xe@yVKevw{zh2`nUH47i_0XmMzJ>ZTDe*#scZH{HtU~=! zT_hC)*^tM(TyKp^q5~mcv6_*B9{58b9K^{Gdh+kZsq|GUFueD*QmCQoh+!#VBF0*9xX2*)m%$5+bo0 z`eYxyhi*6Li^G@ia?P^9+_+!5KWg5@=-&9;*Ew5+Jkf8r7` zV30Mty3^jHs{Z&ON)DeAXG9WUKehUMCLdA+ zKYIw9d%WS2v+G^nYiBD|GVUq#Sx+C#aq3GlSR?-CnIqWkJ6w*3cCH;QQ%k@XBNG7u%f&?_N5XPS9pASjs`w3RO!h`+OOq$ccJZfnDEv-a3&HbHx)C3=90>XhRfL;b6C z6GY2Doe62%2>6}6OjH+zSc991)A9)L2c6`~D0R6`4J2)v-W4BwsyE^HgfN)tH7*j5 zr{bB_q56J`=C{38XG}R!PtF;I5AUaz#yP9=Z9}T~qv3jB2?fAZbk}X_QrORas_Bt9j zVwl}4@Z2We?%|64^l~aDhU_8%WA@Q$Aq_ei8hvBUf}}<725_|S;9iT(0R)p}tCF+DCu$tIrqG{A5Ro7_j&tqJ<+ z9J6e3w-csg`och+6~2XeqBQsSlsid72sg{0Vt>=7$k?@kWVyYA!lJ%B>Xk_bE7-MQ zrhMujdD>P;KIQic{0irVv9>3trLdq*E)?iN@J&@AMKv zaJC@cl6xoPI8WU#z2XhS=xZaDV5Gp~5Y-u$`sc2H!3hWl)Bl9g?|q-ZgxjYj0Cw1_ z^S+*(?p7k@$ZpNKX&`Rp$3=}TtO|b#yCgaseqYf5Bg8=_2>m07y2arAw}G*xM<=8i z8?92>>!R6!$5cMW+B-mKqMGoyslihp7f9&Ou*ao-pn-iAWqs8THUml`Ttt8B^Ck&8 z>2B%bd7(;MGIXyl9H^#Gu(nx{97(LLZ&y{7^BN3IJH3`Y0;KlB-1mi`FG1l00xeO+ zEk?BbQ!S5Q+MrlNDcrprxSbkoz+AQQej7${S1!%c!+IqaNEd(_c@X*2S8>gt>qCB0=`6mw z7A+!$M%+*ifD*Z=^cOrNH3kln_X@S+cT7h_$(SFCa&pOPC0Q%VZC3;Y8X=~N|C|%? zV$;o2=9QL3j!f4m2E+&z8y`{NzOP4)U3*sGR6rFssr$E^;Dsf! z)W>ZW9iX+f(x&i?VIYT-c|)xcd`rkAyUFz<3qo z`rZM^u||7IH1bA7__DCHDc;^-Qti=q1LnQbVZ;FS^9U)7Dk1ch{QNM;u<-$IXN-+El)9C|@Fb|BG`Yq+}1P_4vZBLzt_<+dGvTIa+GqMuuSHo5x`#_Nvu(&JqCX<|`*IwIqN5{2vztJ`Aen7Eb zf%?v2!QoM!t2~YWW(LmWdIT5%HAuI3H7ZtIA#hmMIRvgpH2E+4VLwqT=d#EShAej? zra**(r_0uq&Fh-e!@cyXenj=ovtcj;6{J4nud%4!{kTsQ>s0&}bG+<>Hn=UK2VSqe zOlJ;s`vBC}AhL*=0eKyBrMmmRsn*?y1DN{iR4y^|>7Xkhw>plC8)FIep}n){|1sm$ z)^W$|3JeaT;#u(I#ZD?>M4N+X$sIp|bB0YpR=-Yo@`iNrjm7Q10f!xHscrC1EaK66 zxBmlz5W(`B8*-iMLC+~dW_DlQ8RfKFdrERlb+|m^(z+XZAx#)~Kj#ZufBxq%J@;bJ zb>0!!(1F}!ue7(u#t?QS(a>SocNOjzb?$l>(^M5VII<>qe z%&ti)TD6Xov_k3PeWNtv^vmjr2HFHTYJ6#d3E0QD@}(qL7iM1hef=!D_1Jy4 z9!-lKc68wQT`+@3X>+G28-gbl*K5)RpOyMb;nwvDA|;9&XLV2gzA*^Y<04EU3wk#_ zECyF*)+HG`A%c3#jZ=;720#PLjhF60oLVb%?5!*7&V+N$Um4a}2fu~3cp8@LHguIq zfA{~h=+>2WfzsEl1J?GJ=G!jcgQt#ydz*c1e9Q1_$7W-i_`&&Tu#fBfzkl9PlgDj( ziTjYXUJ{*`5B`k#+mJ@2jaj;)K0A9?!A-55ZSZhR^xg+t!ef7fzOiOBqlQ`9+@0=! zX~T%e0M9ZKV%(C%$70{N{0!>~skZNhec$~_!ySBu&d1z9qs=PCWX9Z3zG{?H?!m`J zH>x37!1fe^R(8?HbzI2tu&7x1dzpSO0Thk61--bzs~J8sx}^IQGs@-6z(Dd}aG(q` zaZ}&M8gY4IT>hmNPa(FYHLya_$A0YSx)WXx!Z^CRLcEV%=4ET`K$xA)3s>lR-UT<} zbn|fbDqQeNE$a0V4)dL_%3b+dKuT#ZkJL-#RGo697cz{D97+M&s|fAK1zii=zlsFc z-}ckI?C<(7D-O((F5`?#$nu*aktH`hkuO*MR`lK?5@IY4tM>H9nTWM`5QW#^zvEx; zKWX?yBk8o^;q?pf#B~R_+~hD0zWpxo@9@1-Rq?xjuq`^*W+NG4yIX&677@N%@_L8v z=l`jAM(@c+aw^@^3p+>^=@4W-VCpsv70S+nxRX9x)g|ZoVD0?fvV68$9oI%KDcF$U z6roXaUA%tssX~t9`k1Y8d?F-?%1Lx;5XW4(!pPrCG-h&(U8by)-sz<^(||7J4H=Tq z0Wzv)i}?PmwLrKBawk5%+w|w#xYFyFx$E2763;&6Ln=)K$g{BajP#l3!YE+s+0#G#(t)@t0g2!OdI%q-aYq9+wT75?Lsew+QAO8f#0* z7hQPmMpggD+j0Ej6ZMD%nu|vIm6lC?Yb}4!a(e)ZC}&0kMSvjFY)bhe`?6`yJF1;ytk2jG4@Ru4kkkSDYBvlvu|ls3YH_Hi`{ z*l(~4l|yTQbTNtZxBc50KFlYeJ^Ym^T{>W6WLXycbi^ISLtrx0=i-Q*X_80)=a%6x zrCg9!5ifw8sDR}^(A%BA+hSHy569NTzxHOP>#RmQFnxPJsN(Hq{{|Y6=t;l(T&>RI z-EsCozN4+LXdP+ZoFmZhNNB>3Ug9*b*WUZi=Y0bCpEv~ma|M^-@%h1qffcW=GAO;J zMe{HMT2ZsV+c%>+5MN%@YR!%zrNUP7K3N(k{xj=kulHf)!^5oweQ5I)j=7~3-p)kc zx~)$Jb>imFVp-cKP|cY^9@ad$eG7`y&7WsuSvfE9(I{gH4iHN8rE8! z51;oiLA4ZbedmYq>7%%_;DSb&$^Viyw#Gx^W{GZ_JFk?|=4*Zk>z{7?u312+_0yX3 z2YAyqXbCQ_d)43cxDu&4I&pkp#lbaq)CX(+B`QAnzi;H?8$n;S z&x0F~zRBOh@aI+CPsB%rC|Grtg|j~L*aeCXbwa!cE3VptkAw9QP{qb~PkvCdygLo~ z*v@jxQaJv(l#H^~!A#;|C((Z@rZM`Tn*=v0K5MOU_WnH4n5_t5cY4|0`$$sjQ+mY1 z^mp8E936P-xAK;7M@h@ahzq4^hS{*GYpo7pH%YvA($Bhn&sA?J=mV9If&0O=X-!<_(f-%COfmq_vJWvOqIjw z^j!%;sZR628BVzEM7luq%B8V!hZhBveQS(>HE(P@@HIKv2f`+U@O1%o0%Vu>=1XsxGFn!A+pp_Cw6!&bLe{MHMdo5 zEi%fZQV;B9w@by<^~gOWRmk~WKjc_Y$XT1wTx6@SKBo)Cxi%-dbpb`|t{8;fCdtP=SH>9xS;{1b1k_RxmGDlH7Sm*jsbVmbCP zR}$pe#!B4zRcZv5whjAqR{XI{{srwqwMmb97{6UAU~T-Vc7{B6Rw?|FK|0Iy+hm)d zci(mG{K9F)t39vz)xridhQBl0oQ=7(+jC@cg(Hd{)%efH80G6!7$)?hh5x8-z3r=y zLuoF!c^Z20>-|l{__C-Y+{|Cfh_mmaP$saBh=b{dHnQuRfvh7?no6V(CkMjky8nLJmBa9e^tXrVz0Z1=x2`TDj(0E+KLZ=eu11Ohljz2Gz?_UpIrhT@PZ6f> zMbKwTcvQx0{^tw+%XTB%p`{6e;MWDpj4{eUuepz@>d*k#JZar(7m)}m>#{bA}mmiLiDiAq(QRE)w zcru)b5Wy_eGGR)_aYmN z*U=cl5cKSVNV!C$7tC`uYsJ~}-I||FSN`LiwB(R zPAUJI;+$JCPo;A^qCz`5yx1LAX;qRY3?EWpgL%c3{IdN{>9FPqv=8>}1?$uBES5w5}Bkn6l@b35H)PjnZD z$Rspf2<5Bb)`0K6As4k`+l=aI`I|5O!fdR3cU$W0k+1GE$$bm1j8G^Xm4Y~Sxn5s4 zT1eTFwz1r(?cm<+Rm<$~z@LkjKnp=uheWPcgQog8|6CkrIklo|Sz4Aam}~c2_nB?t z2z4|O!fI^h^TFI6f~U!>43_pJxXj#B`c}snn4;dKw=$C%v-dMT65sdc7V)_8)AI=y z^`yrmZ!Y;*Ok`$0Ahbn}^&Zu?oM4Q!cRG#NQkeaNE&7zaRO6cQ>)ju}&PFVgOV7LF zi{fS^aRCkCw3@mfQ;)x@6N@|Yzo5N)%C74IM~ewm?@gXgF&st=D9rfs%0QOSI^^f6 z(2FjcTN6Wv|KO$$V3hN*GmHQa{@#ijragR$&a<&J>B8&7&F#ThR_Qv}*$8B5*m-fW zLD!wtF{9RWoPp@~vex%DQZr*IDW(RJs~WS!XP)x5BYA!~QB$e$ONIJhjPNSYaIWm} znCL&#jXcc(H*e4WTnm4hpEqgt^4mE)D0gb`rwUr>QSY9PUrkpS+$3{JNhUC#e3&l*wk!P`Gh z9_m5U@Dj?U%QFerzm*2Qe|t#0!&9YHMmYQSbf8iADu8NH*zo0ZDEFT_%@{5RG4eY_ z%9FCMtoRcta)rZGS;Hz!c+P`Eda6&Ne@8-cfAtNT4wJEk)N2{2!?Qd++$!C-e zrVI#fsBbev!EZ%*vmD+BI;7b@a&s73b;)}^ewZ&KGt9V$(K&pX5+y>8Yx!4M878PT zMlm2aQ8RQw1>TPJB-_3Rs5X9tq0SLTj7oi;iO?4?pi&!hbH8V0Y%XWlL#l6E<^mA2DSFQ4<#`G|V+A8^4VH1>zA# zE=OId!%eda4~}*5qNqRh?{rzv+fMg+C9j>c9MPb|>gCy#oF`P;QHG0%{lZV#={B4Lc!mkTyV7P3~c0{SsIe*4E!v}9ct=Qc!6x1F$tvcoi z4E)L=F2D~n&eP8gipa6g%l3bkkCo$Ym!{w2)a#LKmuS5bTD}0g+NT{q z9Z|6Qrq39v7nfka-uUyBiy&gCJKf@BZ+;Dt{+p3V@VEA%XNa%msA*(=q`6tEl`4Wm zT)99G4n$n)p}}jS=T*wnNAa9lv8I;@xi2@9spFV2^~<*8bHW_qn~X1n75VN+^;0)l z@4eT7eMuEhzD+zpaHQY!)M2UkXNB&&Z#k?x&Rih!^3BG;OHO;^qmA~kI}~;T+HaRB zgQ%j*1~H-F4doRVsDQQ&U0WNaOZVWSJC|K3gkO;N`P0;S5ufV(ze5;?gw)%t-!DiZ zM}?&FvxZ6m-`4fC%KJbvtRMO%$%~m~60gURaxn=?jxR*KidGEmhNAEhbX{i@4PlD|305jjCQ{AlI_aUiFRn; zdWAH9Bjfyo(&jLJsIP3yP^&oyg(5U;`+4T)-yYa+4Ze{LL{sj0U|FBd!NYXPz(c;b zk=Loq*dG__kbiSS4cvF_?wy3}^4cw5XW=ib!Gtp(0GU51$%mZBD!OPEcA@q8=WW1I zb%X8D7%C3g)5rzwg$g;S!=GFW6vEHG%uHrPn1Seua=!=U$Le@eEr~qPFGVaJvkjcD9B0E=N70Q z4E1{XPxpeBRrc|dv$7dTb&1F~vQ8qeinc$Fa`aR7+Idu8>Jb|EcVB!@v%x9389l#G zi}Vcg+;6%@RE);?(V6`421RLTBcmnD?Q~XbC(dQ;1==e7^mHCc5fy5^0mlZh{}SgO zdT^6fJ=r|2H=-#&IBLBDUvDl}Ib(rnM@exx(x!FEkJ+%j9=>G|9?lL_fo_Kom-^5G z)M4db;~S#uag&GYLBT(6ynH-f!y&}olI$Qw28`J7^47o297=_ zoacMA+I$JrVb0z|kRJ(ur>U3#2d?{x*oPitz4CWsUX>A|%LHkEOnuOUUl>8|cNcQ^ z6|)GRFlU(M+XQ(FFVtfi!#c^Wh4sS7g7$km*ja+Vl-;qv`^kU^oV8cBG?>B_x6luW z&7yzk>j}LcdMO!nIP%{u%ti)YeU&PvAvCg>EdS*&tL>ra^zQQ~A21SHqnDV6IYzr$ zT$z*@tpaVn1JtdB1nI;2KY4C7!HbgMrM#fi()rKY$jpnjZsowNGMkTIE?hSDzWg)$ znD(lw;O~P!8ne*4MgQydL*9`Yd(ozA<2fDke>N8bt~GXeM$zL2UzkN%@Wwys##+X# z-b+;xWb?UqJad(g_WY`L)O_8a!M-JMf2on{tcz{sK^+xr?PcIfk*+<}>FwfRBj*oQ zm-Mfdli%fyayPKL_7_X{4zmRPY}x50pzh);ZBH)9M@O!KPm#jspv?QRbAk!KGuI46 zFRmDuv*Jpw7)R=2T^0O!SDj^T@BKa_=_`MnDeLf?=gGvERn_&P1}%=Uns&1eh% zDZxl%IlAeD&gIce6$R-@YN!_Or;`nrNMx+&zm!6*Npjux17ThvncIxq-RiHw@_NO+ zuANkQ*()Nb$pVQds^-WHCw(oq=-^bmhuv5w!BoN4dUg`cc%hBRnW!_rd_7J9swNkD zdsr$)T~_Xm>%xoTllGt`mIxd9__oF+lwIIht

+
+ BIG-MAP + EU +
From 1950c345c3f82c3d06c3efbeea8252c4891f3666 Mon Sep 17 00:00:00 2001 From: Peter Gillespie <55498719+PNOGillespie@users.noreply.github.com> Date: Mon, 29 Jan 2024 22:33:25 +0100 Subject: [PATCH 024/166] Add Feature: XAS Plugin (#580) Adds a plugin to calculate XANES spectra using the XspectraCrystalWorkChain of AiiDA-QE. The Setting panel allows users to simply select which element to calculate XAS for, as well as tuning the supercell size to be used in the calculation. This panel also provides the option to change the type of core-hole approximation between FCH (removing the excited electron with tot_charge = 1) and XCH (allowing the excited electron to occupy the conduction band. The result will display both the complete powder XAS for the input structure and the contributions from each symmetrically non-equivalent site. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Xing Wang --- setup.cfg | 1 + src/aiidalab_qe/plugins/xas/__init__.py | 31 ++ src/aiidalab_qe/plugins/xas/pseudo_toc.yaml | 26 + src/aiidalab_qe/plugins/xas/result.py | 535 ++++++++++++++++++++ src/aiidalab_qe/plugins/xas/setting.py | 341 +++++++++++++ src/aiidalab_qe/plugins/xas/workchain.py | 111 ++++ tests/test_plugins_xas.py | 37 ++ 7 files changed, 1082 insertions(+) create mode 100644 src/aiidalab_qe/plugins/xas/__init__.py create mode 100644 src/aiidalab_qe/plugins/xas/pseudo_toc.yaml create mode 100644 src/aiidalab_qe/plugins/xas/result.py create mode 100644 src/aiidalab_qe/plugins/xas/setting.py create mode 100644 src/aiidalab_qe/plugins/xas/workchain.py create mode 100644 tests/test_plugins_xas.py diff --git a/setup.cfg b/setup.cfg index c16c2cf8f..8965d9585 100644 --- a/setup.cfg +++ b/setup.cfg @@ -56,6 +56,7 @@ aiidalab_qe.properties = bands = aiidalab_qe.plugins.bands:bands pdos = aiidalab_qe.plugins.pdos:pdos electronic_structure = aiidalab_qe.plugins.electronic_structure:electronic_structure + xas = aiidalab_qe.plugins.xas:xas [aiidalab] title = Quantum ESPRESSO diff --git a/src/aiidalab_qe/plugins/xas/__init__.py b/src/aiidalab_qe/plugins/xas/__init__.py new file mode 100644 index 000000000..1ca6f4473 --- /dev/null +++ b/src/aiidalab_qe/plugins/xas/__init__.py @@ -0,0 +1,31 @@ +from importlib import resources + +import yaml +from aiidalab_widgets_base import ComputationalResourcesWidget + +from aiidalab_qe.common.panel import OutlinePanel +from aiidalab_qe.plugins import xas as xas_folder + +from .result import Result +from .setting import Setting +from .workchain import workchain_and_builder + +PSEUDO_TOC = yaml.safe_load(resources.read_text(xas_folder, "pseudo_toc.yaml")) + + +class XasOutline(OutlinePanel): + title = "X-ray absorption spectroscopy (XAS)" + help = """""" + + +xs_code = ComputationalResourcesWidget( + description="xspectra.x", default_calc_job_plugin="quantumespresso.xspectra" +) + +xas = { + "outline": XasOutline, + "code": {"xspectra": xs_code}, + "setting": Setting, + "result": Result, + "workchain": workchain_and_builder, +} diff --git a/src/aiidalab_qe/plugins/xas/pseudo_toc.yaml b/src/aiidalab_qe/plugins/xas/pseudo_toc.yaml new file mode 100644 index 000000000..8c3299225 --- /dev/null +++ b/src/aiidalab_qe/plugins/xas/pseudo_toc.yaml @@ -0,0 +1,26 @@ +--- +xas_xch_elements: [C, Li] +pseudos: + pbe: + gipaw_pseudos: + C: C.pbe-n-kjgipaw_psl.1.0.0.UPF + Cu: Cu.pbe-n-van_gipaw.UPF + F: F.pbe-gipaw_kj_no_hole.UPF + Li: Li.pbe-s-rrkjus-gipaw.UPF + O: O.pbe-n-kjpaw_gipaw.UPF + Si: Si.pbe-van_gipaw.UPF + core_wavefunction_data: + C: C.pbe-n-kjgipaw_psl.1.0.0.dat + Cu: Cu.pbe-n-van_gipaw.dat + F: F.pbe-gipaw_kj_no_hole.dat + Li: Li.pbe-s-rrkjus-gipaw.dat + O: O.pbe-n-kjpaw_gipaw.dat + Si: Si.pbe-van_gipaw.dat + core_hole_pseudos: + 1s: + C: C.star1s.pbe-n-kjgipaw_psl.1.0.0.UPF + Cu: Cu.star1s-pbe-n-van_gipaw.UPF + F: F.star1s-pbe-gipaw_kj.UPF + Li: Li.star1s-pbe-s-rrkjus-gipaw-test_2.UPF + O: O.star1s.pbe-n-kjpaw_gipaw.UPF + Si: Si.star1s-pbe-van_gipaw.UPF diff --git a/src/aiidalab_qe/plugins/xas/result.py b/src/aiidalab_qe/plugins/xas/result.py new file mode 100644 index 000000000..c6874c09d --- /dev/null +++ b/src/aiidalab_qe/plugins/xas/result.py @@ -0,0 +1,535 @@ +"""XAS results view widgets + +""" +import base64 +import hashlib +from typing import Callable + +import ipywidgets as ipw +import numpy as np +from IPython.display import HTML, display +from scipy.interpolate import make_interp_spline + +from aiidalab_qe.common.panel import ResultPanel + + +class SpectrumDownloadButton(ipw.Button): + """Download button with dynamic content + The content is generated using a callback when the button is clicked. + Modified from responses to https://stackoverflow.com/questions/61708701/how-to-download-a-file-using-ipywidget-button#62641240 + """ + + def __init__(self, filename: str, contents: Callable[[], str], **kwargs): + super(SpectrumDownloadButton, self).__init__(**kwargs) + self.filename = filename + self.contents = contents + self.on_click(self.__on_click) + + def __on_click(self, b): + if self.contents is None: + pass # to avoid a crash because NoneType obviously can't be processed here + else: + contents: bytes = self.contents().encode("utf-8") + b64 = base64.b64encode(contents) + payload = b64.decode() + digest = hashlib.md5(contents).hexdigest() # bypass browser cache + id = f"dl_{digest}" + + display( + HTML( + f""" + + +
+ + + + + """ + ) + ) + + +def write_csv(dataset): + from pandas import DataFrame + + x_vals = dataset[0]["x"] + df_data = {"energy_ev": x_vals} + for entry in dataset: + if "site" in entry["name"]: + if entry["weighting"] != 1: + df_data[ + f'{entry["name"].capitalize().replace("_", " ")} (Weighted)' + ] = entry["y"] + df_data[ + f'{entry["name"].capitalize().replace("_", " ")} (Unweighted)' + ] = entry["y"] / entry["weighting"] + else: + df_data[entry["name"].capitalize().replace("_", " ")] = entry["y"] + else: + df_data[entry["name"]] = entry["y"] + + df = DataFrame(data=df_data) + df_energy_indexed = df.set_index("energy_ev") + + return df_energy_indexed.to_csv(header=True) + + +def export_xas_data(outputs): + if "final_spectra" in outputs.xas: + final_spectra = outputs.xas.final_spectra + symmetry_analysis_data = outputs.xas.symmetry_analysis_data.get_dict() + equivalent_sites_data = symmetry_analysis_data["equivalent_sites_data"] + + return ( + final_spectra, + equivalent_sites_data, + ) + else: + return None + + +def broaden_xas( + input_array, variable=False, gamma_hole=0.01, gamma_max=5, center_energy=15 +): + """Take an input spectrum and return a broadened spectrum as output using either a constant or variable parameter. + + :param input_array: The 2D array of x/y values to be broadened. Should be plotted with + little or no broadening before using the function. + :param gamma_hole: The broadening parameter for the Lorenzian broadening function. In constant mode (variable=False), + this value is applied to the entire spectrum. In variable mode (variable=True), this value defines + the starting broadening parameter of the arctangent function. Refers to the natural linewidth of + the element/XAS edge combination in question and (for elements Z > 10) should be based on reference + values from X-ray spectroscopy. + :param variable: Request a variable-energy broadening of the spectrum instead of the defaultconstant broadening. + Uses the functional form defined in Calandra and Bunau, PRB, 87, 205105 (2013). + :param gamma_max: The maximum lorenzian broadening to be applied in variable energy broadening mode. Refers to the + broadening effects at infinite energy above the main edge. + :param center_energy: The inflection point of the variable broadening function. Does not relate to experimental data + and must be tuned manually. + """ + + if variable: + if not all([gamma_hole, gamma_max, center_energy]): + missing = [ + i[0] + for i in zip( + ["gamma_hole", "gamma_max", "center_energy"], + [gamma_hole, gamma_max, center_energy], + ) + if i[1] is None + ] + raise ValueError( + f"The following variables were not defined {missing} and are required for variable-energy broadening" + ) + + x_vals = input_array[:, 0] + y_vals = input_array[:, 1] + + lorenz_y = np.zeros(len(x_vals)) + + if variable: + for x, y in zip(x_vals, y_vals): + if x < 0: # the function is bounded between gamma_hole and gamma_max + gamma_var = gamma_hole + else: + e = x / center_energy + + gamma_var = gamma_hole + gamma_max * ( + 0.5 + np.arctan((e - 1) / (e**2)) / np.pi + ) + + if y <= 1.0e-6: # do this to skip the calculation for very small values + lorenz_y = y + else: + lorenz_y += ( + gamma_var + / 2.0 + / np.pi + / ((x_vals - x) ** 2 + 0.25 * gamma_var**2) + * y + ) + else: + for x, y in zip(x_vals, y_vals): + lorenz_y += ( + gamma_hole + / 2.0 + / np.pi + / ((x_vals - x) ** 2 + 0.25 * gamma_hole**2) + * y + ) + + return np.column_stack((x_vals, lorenz_y)) + + +def get_aligned_spectra(core_wc_dict, equivalent_sites_dict): + """Return a set of spectra aligned according to the chemical shift (difference in Fermi level). + + Primarily this is a copy of ``get_spectra_by_element`` from AiiDA-QE which operates on only one + element. + """ + data_dict = {} + spectrum_dict = { + site: node.outputs.powder_spectrum for site, node in core_wc_dict.items() + } + for key, value in core_wc_dict.items(): + xspectra_out_params = value.outputs.parameters_xspectra__xas_0.get_dict() + energy_zero = xspectra_out_params["energy_zero"] + multiplicity = equivalent_sites_dict[key]["multiplicity"] + + if "total_multiplicity" not in data_dict: + data_dict["total_multiplicity"] = multiplicity + else: + data_dict["total_multiplicity"] += multiplicity + + data_dict[key] = { + "spectrum_node": spectrum_dict[key], + "multiplicity": multiplicity, + "energy_zero": energy_zero, + } + + spectra_list = [] + total_multiplicity = data_dict.pop("total_multiplicity") + for key in data_dict: + spectrum_node = data_dict[key]["spectrum_node"] + site_multiplicity = data_dict[key]["multiplicity"] + weighting = site_multiplicity / total_multiplicity + weighting_string = f"{site_multiplicity}/{total_multiplicity}" + spectrum_x = spectrum_node.get_x()[1] + spectrum_y = spectrum_node.get_y()[0][1] + spline = make_interp_spline(spectrum_x, spectrum_y) + norm_y = spline(spectrum_x) / np.trapz(spline(spectrum_x), spectrum_x) + weighted_spectrum = np.column_stack( + (spectrum_x, norm_y * (site_multiplicity / total_multiplicity)) + ) + spectra_list.append( + ( + weighted_spectrum, + key, + weighting, + weighting_string, + float(data_dict[key]["energy_zero"]), + ) + ) + + # Sort according to Fermi level, then correct to align all spectra to the + # highest value. Note that this is needed because XSpectra automatically aligns the + # final spectrum such that the system's Fermi level is at 0 eV. + spectra_list.sort(key=lambda entry: entry[-1]) + highest_level = spectra_list[0][-1] + energy_zero_corrections = [ + (entry[0], entry[1], entry[2], entry[3], entry[-1] - highest_level) + for entry in spectra_list + ] + aligned_spectra = [ + ( + entry[1], + entry[2], + entry[3], + np.column_stack((entry[0][:, 0] - entry[-1], entry[0][:, 1])), + ) + for entry in energy_zero_corrections + ] + + return aligned_spectra + + +class Result(ResultPanel): + title = "XAS" + workchain_labels = ["xas"] + + def __init__(self, node=None, **kwargs): + super().__init__(node=node, identifier="xas", **kwargs) + + def _update_view(self): + import plotly.graph_objects as go + + gamma_select_prompt = ipw.HTML( + """ +
+ Select parameters for spectrum broadening
""" + ) + + # PNOG: If someone knows a way to format certain words differently in HTML without causing a line-break, hit me up. + # For now, (17/10/23) we'll just have the function terms be in italics. + # Alternatively, if it's possible to format mathematical terms in HTML without a line-break, let me know + variable_broad_select_help = ipw.HTML( + """ +

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 +- the `MARVEL National Centre for Competency in Research `_ funded by the `Swiss National Science Foundation `_; +- the MARKETPLACE project funded by `Horizon 2020 `_ under the H2020-NMBP-25-2017 call (Grant No. 760173); +- the `MaX European Centre of Excellence `_ funded by the Horizon 2020 EINFRA-5 program, Grant No. 676598. + +.. raw:: html + +

+ Broadening parameters: + +

Γhole - Defines a constant Lorenzian broadening width for the whole spectrum. In "variable" mode, defines the initial broadening width of the ArcTangent function.

+

Γmax - Maximum Lorenzian broadening parameter at infinte energy in "variable" mode.

+

Ecenter - Defines the inflection point of the variable-energy broadening function.

+
+
+ Note that setting Γhole to 0 eV will simply plot the raw spectrum. +
+ """ + ) + spectrum_select_prompt = ipw.HTML( + """ +
+ Select spectrum to plot
""" + ) + final_spectra, equivalent_sites_data = export_xas_data(self.outputs) + xas_wc = [ + n for n in self.node.called if n.process_label == "XspectraCrystalWorkChain" + ][0] + core_wcs = { + n.get_metadata_inputs()["metadata"]["call_link_label"]: n + for n in xas_wc.called + if n.process_label == "XspectraCoreWorkChain" + } + core_wc_dict = { + key.replace("_xspectra", ""): value for key, value in core_wcs.items() + } + + spectrum_select_options = [key.split("_")[0] for key in final_spectra.keys()] + + spectrum_select = ipw.Dropdown( + description="", + disabled=False, + value=spectrum_select_options[0], + options=spectrum_select_options, + layout=ipw.Layout(width="20%"), + ) + + variable_broad_select = ipw.Checkbox( + value=False, + disabled=False, + description="Use variable energy broadening.", + style={"description_width": "initial", "opacity": 0.5}, + ) + + gamma_hole_select = ipw.FloatSlider( + value=0.0, + min=0.0, + max=5, + step=0.1, + description="$\Gamma_{hole}$", # noqa: W605 + disabled=False, + continuous_update=False, + orientation="horizontal", + readout=True, + ) + + gamma_max_select = ipw.FloatSlider( + value=5.0, + min=2.0, + max=10, + step=0.5, + continuous_update=False, + description="$\Gamma_{max}$", # noqa: W605 + disabled=True, + orientation="horizontal", + readout=True, + ) + + center_e_select = ipw.FloatSlider( + value=15.0, + min=5, + max=30, + step=0.5, + continuous_update=False, + description="$E_{center}$", + disabled=True, + orientation="horizontal", + readout=True, + ) + download_data = SpectrumDownloadButton( + filename=f"{spectrum_select.value}_XAS_Spectra.csv", + contents=None, + description="Download CSV", + icon="download", + ) + # # get data + # # init figure + g = go.FigureWidget( + layout=go.Layout( + title=dict(text="XAS"), + barmode="overlay", + ) + ) + + g.layout.xaxis.title = "Relative Photon Energy (eV)" + + chosen_spectrum = spectrum_select.value + chosen_spectrum_label = f"{chosen_spectrum}_xas" + spectra = final_spectra[chosen_spectrum_label] + + raw_spectrum = np.column_stack((spectra.get_x()[1], spectra.get_y()[0][1])) + + x = raw_spectrum[:, 0] + y = raw_spectrum[:, 1] + spline = make_interp_spline(x, y) + norm_y = spline(x) / np.trapz(spline(x), x) + element = chosen_spectrum_label.split("_")[0] + element_sites = [ + key + for key in equivalent_sites_data + if equivalent_sites_data[key]["symbol"] == element + ] + element_core_wcs = {} + total_multiplicity = 0 + for site in element_sites: + site_multiplicity = equivalent_sites_data[site]["multiplicity"] + total_multiplicity += site_multiplicity + element_core_wcs[site] = core_wc_dict[site] + + g.add_scatter(x=x, y=norm_y, name=f"{element} K-edge") + for entry in get_aligned_spectra( + core_wc_dict=element_core_wcs, equivalent_sites_dict=equivalent_sites_data + ): + g.add_scatter( + x=entry[-1][:, 0], + y=entry[-1][:, 1], + name=entry[0].capitalize().replace("_", " "), + ) + + def _update_download_selection(dataset, element): + download_data.contents = lambda: write_csv(dataset) + download_data.filename = f"{element}_XAS_Spectra.csv" + + def response(change): + chosen_spectrum = spectrum_select.value + chosen_spectrum_label = f"{chosen_spectrum}_xas" + element_sites = [ + key + for key in equivalent_sites_data + if equivalent_sites_data[key]["symbol"] == chosen_spectrum + ] + element_core_wcs = { + key: value + for key, value in core_wc_dict.items() + if key in element_sites + } + spectra = [] + final_spectrum_node = final_spectra[chosen_spectrum_label] + final_spectrum = np.column_stack( + (final_spectrum_node.get_x()[1], final_spectrum_node.get_y()[0][1]) + ) + final_x_vals = final_spectrum[:, 0] + final_y_vals = final_spectrum[:, 1] + final_spectrum_spline = make_interp_spline(final_x_vals, final_y_vals) + final_norm_y = final_spectrum_spline(final_x_vals) / np.trapz( + final_spectrum_spline(final_x_vals), final_x_vals + ) + spectra.append( + ( + f"{chosen_spectrum} K-edge", + 1, + "1", + np.column_stack((final_x_vals, final_norm_y)), + ) + ) + datasets = [] + for entry in get_aligned_spectra( + core_wc_dict=element_core_wcs, + equivalent_sites_dict=equivalent_sites_data, + ): + spectra.append(entry) + + for entry in spectra: + label = entry[0] + weighting = entry[1] + weighting_string = entry[2] + raw_spectrum = entry[-1] + x = raw_spectrum[:, 0] + y = raw_spectrum[:, 1] + if not variable_broad_select: + gamma_max_select.disabled = True + center_e_select.disabled = True + else: + gamma_max_select.disabled = False + center_e_select.disabled = False + + if gamma_hole_select.value == 0.0: + x = raw_spectrum[:, 0] + y = raw_spectrum[:, 1] + else: + broad_spectrum = broaden_xas( + raw_spectrum, + gamma_hole=gamma_hole_select.value, + gamma_max=gamma_max_select.value, + center_energy=center_e_select.value, + variable=variable_broad_select.value, + ) + x = broad_spectrum[:, 0] + y = broad_spectrum[:, 1] + + final_spline = make_interp_spline(x, y) + final_y_vals = final_spline(final_x_vals) + datasets.append( + { + "x": final_x_vals, + "y": final_y_vals, + "name": label, + "weighting": weighting, + "weighting_string": weighting_string, + } + ) + _update_download_selection(datasets, chosen_spectrum) + + with g.batch_update(): + # If the number of datasets is different from one update to the next, + # then we need to reset the data already in the Widget. Otherwise, we can + # simply override the data. This also helps since then changing the + # broadening is much smoother. + if len(datasets) == len( + g.data + ): # if the number of entries is the same, just update + for index, entry in enumerate(datasets): + g.data[index].x = entry["x"] + g.data[index].y = entry["y"] + if "site_" in entry["name"]: + g.data[index].name = ( + entry["name"].capitalize().replace("_", " ") + ) + else: + g.data[index].name = entry["name"] + else: # otherwise, reset the figure + g.data = () + for entry in datasets: + if "site_" in entry["name"]: + name = entry["name"].capitalize().replace("_", " ") + else: + name = entry["name"] + g.add_scatter(x=entry["x"], y=entry["y"], name=name) + + spectrum_select.observe(response, names="value") + gamma_hole_select.observe(response, names="value") + gamma_max_select.observe(response, names="value") + center_e_select.observe(response, names="value") + variable_broad_select.observe(response, names="value") + download_data.observe(response, names=["contents", "filename"]) + self.children = [ + ipw.HBox( + [ + ipw.VBox( + [ + spectrum_select_prompt, + spectrum_select, + gamma_select_prompt, + gamma_hole_select, + gamma_max_select, + center_e_select, + ], + layout=ipw.Layout(width="40%"), + ), + ipw.VBox( + [ + variable_broad_select, + variable_broad_select_help, + ], + layout=ipw.Layout(width="60%"), + ), + ] + ), + download_data, + g, + ] diff --git a/src/aiidalab_qe/plugins/xas/setting.py b/src/aiidalab_qe/plugins/xas/setting.py new file mode 100644 index 000000000..55b6ccb36 --- /dev/null +++ b/src/aiidalab_qe/plugins/xas/setting.py @@ -0,0 +1,341 @@ +# -*- coding: utf-8 -*- +"""Panel for XAS plugin. + +""" +import os +import tarfile +from importlib import resources +from pathlib import Path + +import ipywidgets as ipw +import requests +import traitlets as tl +import yaml +from aiida import orm + +from aiidalab_qe.common.panel import Panel +from aiidalab_qe.plugins import xas as xas_folder + +PSEUDO_TOC = yaml.safe_load(resources.read_text(xas_folder, "pseudo_toc.yaml")) +pseudo_data_dict = PSEUDO_TOC["pseudos"] +xch_elements = PSEUDO_TOC["xas_xch_elements"] + +base_url = "https://github.com/PNOGillespie/Core_Level_Spectra_Pseudos/raw/main" +head_path = f"{Path.home()}/.local/lib" +dir_header = "cls_pseudos" +functionals = ["pbe"] +core_wfc_dir = "core_wfc_data" +gipaw_dir = "gipaw_pseudos" +ch_pseudo_dir = "ch_pseudos/star1s" + + +def _load_or_import_nodes_from_filenames(in_dict, path, core_wfc_data=False): + for filename in in_dict.values(): + try: + orm.load_node(filename) + except BaseException: + if not core_wfc_data: + new_upf = orm.UpfData(f"{path}/{filename}", filename=filename) + new_upf.label = filename + new_upf.store() + else: + new_singlefile = orm.SinglefileData( + f"{path}/{filename}", filename="stdout" + ) + new_singlefile.label = filename + new_singlefile.store() + + +def _download_extract_pseudo_archive(func): + dir = f"{head_path}/{dir_header}/{func}" + archive_filename = f"{func}_ch_pseudos.tgz" + remote_archive_filename = f"{base_url}/{func}/{archive_filename}" + local_archive_filename = f"{dir}/{archive_filename}" + + env = os.environ.copy() + env["PATH"] = f"{env['PATH']}:{Path.home() / '.local' / 'lib'}" + + response = requests.get(remote_archive_filename, timeout=30) + response.raise_for_status() + with open(local_archive_filename, "wb") as handle: + handle.write(response.content) + handle.flush() + response.close() + + with tarfile.open(local_archive_filename, "r:gz") as tarfil: + tarfil.extractall(dir) + + +url = f"{base_url}" +for func in functionals: + dir = f"{head_path}/{dir_header}/{func}" + os.makedirs(dir, exist_ok=True) + archive_filename = f"{func}_ch_pseudos.tgz" + archive_found = False + for entry in os.listdir(dir): + if entry == archive_filename: + archive_found = True + if not archive_found: + _download_extract_pseudo_archive(func) + + +# Check all the pseudos/core-wfc data files in the TOC dictionary +# and load/check all of them before proceeding. Note that this +# approach relies on there not being multiple instances of nodes +# with the same label. +for func in functionals: + gipaw_pseudo_dict = pseudo_data_dict[func]["gipaw_pseudos"] + core_wfc_dict = pseudo_data_dict[func]["core_wavefunction_data"] + core_hole_pseudo_dict = pseudo_data_dict[func]["core_hole_pseudos"] + main_path = f"{head_path}/{dir_header}/{func}" + core_wfc_dir = f"{main_path}/core_wfc_data" + gipaw_dir = f"{main_path}/gipaw_pseudos" + ch_pseudo_dir = f"{main_path}/ch_pseudos/star1s" + # First, check that the local directories contain what's in the pseudo_toc + for pseudo_dir, pseudo_dict in zip( + [gipaw_dir, core_wfc_dir, ch_pseudo_dir], + [gipaw_pseudo_dict, core_wfc_dict, core_hole_pseudo_dict], + ): + pseudo_toc_mismatch = os.listdir(pseudo_dir) != pseudo_dict.values() + + # Re-download the relevant archive if there is a mismatch + if pseudo_toc_mismatch: + _download_extract_pseudo_archive(func) + + _load_or_import_nodes_from_filenames( + in_dict=gipaw_pseudo_dict, + path=gipaw_dir, + ) + _load_or_import_nodes_from_filenames( + in_dict=core_wfc_dict, path=core_wfc_dir, core_wfc_data=True + ) + _load_or_import_nodes_from_filenames( + in_dict=core_hole_pseudo_dict["1s"], path=ch_pseudo_dir + ) + + +class Setting(Panel): + title = "XAS Settings" + identifier = "xas" + input_structure = tl.Instance(orm.StructureData, allow_none=True) + protocol = tl.Unicode(allow_none=True) + + element_selection_title = ipw.HTML( + """
+

Element and Core-Hole Treatment Setting.

""" + ) + + # TODO: The element selection should lock the "Confirm" button if no elements have been + # selected for XAS calculation. + + element_selection_help = ipw.HTML( + """
+ To select elements for calculation of K-edge spectra:
+ (1) Tick the checkbox for each element symbol to select the element for calculation.
+ (2) Select the core-hole treatment scheme from the dropdown box.
+
+ There are three supported options for core-hole treatment:
+ - FCH: Remove one electron from the system (any occupations scheme).
+ - XCH (Smearing): places the excited electron into the conduction band (smeared occupations).
+ - XCH (Fixed): places the excited electron into the conduction band (fixed occupations).
+
+ For XAS calculations of most elements, the FCH treatment is recommended, however in some cases the XCH treatment should be used instead.
+ The recommended setting will be shown for each available element. + Note that only elements for which core-hole pseudopotential sets are available + will be shown.
+
""" + ) + # I will leave these objects here for now (15/11/23), but since the calculation of molecular + # systems is not really supported (neither in terms of XAS nor the main App itself) we should + # not present this option that essentially does nothing. + # structure_title = ipw.HTML( + # """
+ #

Structure

""" + # ) + # structure_help = ipw.HTML( + # """
+ # Below you can indicate if the material should be treated as a molecule + # or a crystal. + #
""" + # ) + supercell_title = ipw.HTML( + """
+

Cell size

""" + ) + supercell_help = ipw.HTML( + """
+ Define the minimum cell length in angstrom for the resulting supercell, and thus all output + structures. The default value of 8.0 angstrom will be used + if no input is given. Setting this value to 0.0 will + instruct the CF to not scale up the input structure. +
""" + ) + + def __init__(self, **kwargs): + self.gipaw_pseudos = pseudo_data_dict["pbe"]["gipaw_pseudos"] + self.core_hole_pseudos = pseudo_data_dict["pbe"]["core_hole_pseudos"]["1s"] + self.core_wfc_data_dict = pseudo_data_dict["pbe"]["core_wavefunction_data"] + + self.element_and_ch_treatment = ipw.VBox(layout=ipw.Layout(width="100%")) + + # self.structure_type = ipw.ToggleButtons( + # options=[ + # ("Molecule", "molecule"), + # ("Crystal", "crystal"), + # ], + # value="crystal", + # ) + self.supercell_min_parameter = ipw.FloatText( + value=8.0, + description="The minimum cell length (Å):", + disabled=False, + style={"description_width": "initial"}, + ) + + self.children = [ + # self.structure_title, + # self.structure_help, + # ipw.HBox( + # [self.structure_type], + # ), + self.element_selection_title, + self.element_selection_help, + ipw.HBox([self.element_and_ch_treatment], layout=ipw.Layout(width="95%")), + self.supercell_title, + self.supercell_help, + ipw.HBox( + [self.supercell_min_parameter], + ), + ] + + super().__init__(**kwargs) + + def get_panel_value(self): + elements_list = [] + core_hole_treatments = {} + for entry in self.element_and_ch_treatment.children: + if entry.children[0].value is True: + element = entry.children[0].description + ch_treatment = entry.children[1].value + elements_list.append(element) + core_hole_treatments[element] = ch_treatment + + pseudo_labels = {} + core_wfc_data_labels = {} + for element in elements_list: + pseudo_labels[element] = { + "gipaw": self.gipaw_pseudos[element], + "core_hole": self.core_hole_pseudos[element], + } + core_wfc_data_labels[element] = self.core_wfc_data_dict[element] + + parameters = { + "core_hole_treatments": core_hole_treatments, + "elements_list": elements_list, + # "structure_type": self.structure_type.value, + "pseudo_labels": pseudo_labels, + "core_wfc_data_labels": core_wfc_data_labels, + "supercell_min_parameter": self.supercell_min_parameter.value, + } + return parameters + + def set_panel_value(self, input_dict): + """Load a dictionary with the input parameters for the plugin.""" + + # set selected elements and core-hole treatments + elements_list = input_dict.get("elements_list", []) + for entry in self.element_and_ch_treatment.children: + element = entry.children[0].description + if element in elements_list: + entry.children[0].value = True + entry.children[1].value = input_dict["core_hole_treatments"][element] + else: + entry.children[0].value = False + entry.children[1].value = "full" + # set supercell min parameter + self.supercell_min_parameter.value = input_dict.get( + "supercell_min_parameter", 8.0 + ) + # self.structure_type.value = input_dict.get("structure_type", "crystal") + + @tl.observe("input_structure") + def _update_structure(self, _=None): + self._update_element_select_panel() + + def _update_element_select_panel(self): + if self.input_structure is None: + return + + starting_treatment_mapping = {"FCH": "full", "XCH": "xch_smear"} + ch_treatment_options = [ + ("FCH", "full"), + ("XCH (Smearing)", "xch_smear"), + ("XCH (Fixed)", "xch_fixed"), + ] + ch_pseudos = self.core_hole_pseudos + structure = self.input_structure + available_elements = [k for k in ch_pseudos] + elements_to_select = sorted( + [ + kind.symbol + for kind in structure.kinds + if kind.symbol in available_elements + ] + ) + treatment_options = () + + for element in elements_to_select: + if element in xch_elements: + recommended_treatment = "XCH" + else: + recommended_treatment = "FCH" + + treatment_options += ( + ipw.HBox( + [ + ipw.Checkbox( + description=element, + value=False, + disabled=False, + style={"description_width": "initial"}, + layout=ipw.Layout(width="7%"), + ), + ipw.Dropdown( + options=ch_treatment_options, + value=starting_treatment_mapping[recommended_treatment], + disabled=False, + layout=ipw.Layout(width="15%"), + ), + ipw.HTML( + f"Recommended treatment: {recommended_treatment} (PBE Core-Hole Pseudopotential)", + layout=ipw.Layout(width="78%"), + ), + ], + layout=ipw.Layout( + width="100%", + ), + ), + ) + + self.element_and_ch_treatment.children = treatment_options + + # For reference: + # This is the whole widget: + # print(f"{self.element_and_ch_treatment}\n") + + # This is the tuple of selected element and core-hole treatment: + # print(f"{self.element_and_ch_treatment.children[0]}\n") + + # This is the checkbox for the element, giving element name and whether to add it to the elements list + # print(f"{self.element_and_ch_treatment.children[0].children[0]}\n") + # print(f"{self.element_and_ch_treatment.children[0].children[0].value}\n") + # print(f"{self.element_and_ch_treatment.children[0].children[0].description}\n") + + # This is the dropdown for the core-hole treatment option: + # print(f"{self.element_and_ch_treatment.children[0].children[1]}\n") + # print(f"{self.element_and_ch_treatment.children[0].children[1].value}\n") + + def reset(self): + """Reset the panel to its initial state.""" + self.input_structure = None + # self.structure_type.value = "crystal" diff --git a/src/aiidalab_qe/plugins/xas/workchain.py b/src/aiidalab_qe/plugins/xas/workchain.py new file mode 100644 index 000000000..bfd175053 --- /dev/null +++ b/src/aiidalab_qe/plugins/xas/workchain.py @@ -0,0 +1,111 @@ +from importlib import resources + +import yaml +from aiida import orm +from aiida.plugins import WorkflowFactory +from aiida_quantumespresso.common.types import ElectronicType, SpinType + +from aiidalab_qe.plugins import xas as xas_folder + +XspectraCrystalWorkChain = WorkflowFactory("quantumespresso.xspectra.crystal") +PSEUDO_TOC = yaml.safe_load(resources.read_text(xas_folder, "pseudo_toc.yaml")) +pseudo_data_dict = PSEUDO_TOC["pseudos"] +xch_elements = PSEUDO_TOC["xas_xch_elements"] + + +def get_builder(codes, structure, parameters, **kwargs): + from copy import deepcopy + + protocol = parameters["workchain"]["protocol"] + xas_parameters = parameters["xas"] + core_hole_treatments = xas_parameters["core_hole_treatments"] + elements_list = xas_parameters["elements_list"] + supercell_min_parameter = xas_parameters["supercell_min_parameter"] + pseudo_labels = xas_parameters["pseudo_labels"] + core_wfc_data_labels = xas_parameters["core_wfc_data_labels"] + pseudos = {} + # Convert the pseudo and core_wfc_data node labels into nodes: + core_wfc_data = {k: orm.load_node(v) for k, v in core_wfc_data_labels.items()} + for element in elements_list: + pseudos[element] = { + k: orm.load_node(v) for k, v in pseudo_labels[element].items() + } + + # TODO should we override the cutoff_wfc, cutoff_rho by the new pseudo? + # In principle we should, if we know what that value is, but that would + # require testing them first... + + # (13/10/23) I'm keeping the part about molecules in for future reference, + # but we need to establish the protocol & backend code for XAS of molecules + # before thinking about a workflow. + # (22/01/24) Commented out the code for molecules, just so the option doesn't + # appear in the UI and confuse the user. + # is_molecule_input = ( + # True if xas_parameters.get("structure_type") == "molecule" else False + # ) + + structure_preparation_settings = { + "supercell_min_parameter": orm.Float(supercell_min_parameter), + # "is_molecule_input": orm.Bool(is_molecule_input), + } + spglib_settings = orm.Dict({"symprec": 1.0e-3}) + + pw_code = codes["pw"] + xs_code = codes["xspectra"] + overrides = { + "core": { + "scf": deepcopy(parameters["advanced"]), + # PG: Here, we set a "variable" broadening scheme, which actually defines a constant broadening + # The reason for this is that in "gamma_mode = constant", the Lorenzian broadening parameter + # is defined by "xgamma" (in "PLOT"), but this parameter *also* controls the broadening value + # used in the Lanczos algorithm to enhance the convergence rate. In order to give the user a + # final spectrum with minimal broadening, we use "gamma_mode = variable", which uses a different + # parameter set ("gamma_energy(1-2)", "gamma_value(1-2)") and thus allows us to decouple spectrum + # broadening from Lanczos broadening and avoid having to re-plot the final spectrum. + "xs_prod": { + "xspectra": { + "parameters": { + "PLOT": { + "gamma_mode": "variable", + "gamma_energy(1)": 0, + "gamma_energy(2)": 1, + "gamma_value(1)": 0.1, + "gamma_value(2)": 0.1, + } + } + } + }, + } + } + + builder = XspectraCrystalWorkChain.get_builder_from_protocol( + pw_code=pw_code, + xs_code=xs_code, + structure=structure, + protocol=protocol, + pseudos=pseudos, + elements_list=elements_list, + core_hole_treatments=core_hole_treatments, + core_wfc_data=core_wfc_data, + electronic_type=ElectronicType(parameters["workchain"]["electronic_type"]), + spin_type=SpinType(parameters["workchain"]["spin_type"]), + # TODO: We will need to merge the changes in AiiDA-QE PR#969 in order + # to better handle magnetic and Hubbard data. For now, we can probably + # leave it as it is. + initial_magnetic_moments=parameters["advanced"]["initial_magnetic_moments"], + overrides=overrides, + **kwargs, + ) + builder.pop("relax") + builder.pop("clean_workdir", None) + builder.spglib_settings = spglib_settings + builder.structure_preparation_settings = structure_preparation_settings + + return builder + + +workchain_and_builder = { + "workchain": XspectraCrystalWorkChain, + "exclude": ("clean_workdir", "structure", "relax"), + "get_builder": get_builder, +} diff --git a/tests/test_plugins_xas.py b/tests/test_plugins_xas.py new file mode 100644 index 000000000..4b45fc43a --- /dev/null +++ b/tests/test_plugins_xas.py @@ -0,0 +1,37 @@ +import pytest + + +@pytest.mark.usefixtures("sssp") +def test_settings(submit_app_generator): + """Test the settings of the xas app.""" + app = submit_app_generator(properties=["xas"]) + configure_step = app.configure_step + # test get_panel_value + # select the first elmement + configure_step.settings["xas"].element_and_ch_treatment.children[0].children[ + 0 + ].value = True + configure_step.settings["xas"].supercell_min_parameter.value = 4.0 + parameters = configure_step.settings["xas"].get_panel_value() + assert parameters["core_hole_treatments"] == {"Si": "full"} + assert parameters["pseudo_labels"] == { + "Si": { + "gipaw": "Si.pbe-van_gipaw.UPF", + "core_hole": "Si.star1s-pbe-van_gipaw.UPF", + } + } + assert parameters["core_wfc_data_labels"] == {"Si": "Si.pbe-van_gipaw.dat"} + assert parameters["supercell_min_parameter"] == 4.0 + # test set_panel_value + # update the parameters + parameters["supercell_min_parameter"] = 5.0 + parameters["core_hole_treatments"] = {"Si": "xch_smear"} + configure_step.settings["xas"].set_panel_value(parameters) + assert configure_step.settings["xas"].supercell_min_parameter.value == 5.0 + assert ( + configure_step.settings["xas"] + .element_and_ch_treatment.children[0] + .children[1] + .value + == "xch_smear" + ) From 683f851dff949470d1626b2d63cc15560d4ea6dc Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Tue, 30 Jan 2024 12:40:58 +0100 Subject: [PATCH 025/166] include xas yaml in package data (#609) --- setup.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.cfg b/setup.cfg index 8965d9585..3e36228ca 100644 --- a/setup.cfg +++ b/setup.cfg @@ -50,6 +50,7 @@ dev = aiidalab_qe.app.parameters = qeapp.yaml aiidalab_qe.app.static = * aiidalab_qe.app.structure.examples = * +aiidalab_qe.plugins.xas = pseudo_toc.yaml [options.entry_points] aiidalab_qe.properties = From a17893e786a289341c94ad69e53e6905201d5899 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Tue, 30 Jan 2024 13:06:23 +0100 Subject: [PATCH 026/166] Bump version v24.04.0a0 -> v24.04.0a1 --- docs/source/conf.py | 2 +- setup.cfg | 4 ++-- src/aiidalab_qe/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 161b54646..90fffb3ee 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- -version = "v24.04.0a0" +version = "v24.04.0a1" release = f"{version}-dev" project = "Quantum ESPRESSO App" copyright_first_year = "2023" diff --git a/setup.cfg b/setup.cfg index 3e36228ca..1b2c18642 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = aiidalab_qe -version = 24.4.0a0 +version = 24.4.0a1 description = Package for the AiiDAlab QE app long_description = file: README.md long_description_content_type = text/markdown @@ -66,7 +66,7 @@ categories = quantum [bumpver] -current_version = "v24.04.0a0" +current_version = "v24.04.0a1" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = True diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index 90a86e6a7..ca2e5be6d 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -3,4 +3,4 @@ """This module contains project version information for both the app and the workflow.""" -__version__ = "v24.04.0a0" +__version__ = "v24.04.0a1" From 77317852a6cef9affce5913a3b5b19ed0606b866 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Thu, 1 Feb 2024 06:29:19 +0100 Subject: [PATCH 027/166] Update README.md (#612) --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 0d5ff20b6..154d598c6 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,8 @@ This will: 1. Create a tagged release with bumped version and push it to the repository. 2. Trigger a GitHub actions workflow that creates a GitHub release. +For more details of the releases plan and management, please go to [the wiki](https://github.com/aiidalab/aiidalab-qe/wiki/Releases-management). + Additional notes: - Use the `--dry` option to preview the release change. From c990a59cd5ac607e0a942a468376f1e23efce0db Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Fri, 2 Feb 2024 11:05:27 +0100 Subject: [PATCH 028/166] Link miscellaneous/logos to docs folder (#616) Move logos back to miscellaneous, then add a link to it inside the docs/source/_static/logos so that the docs can also use the logos. --- README.md | 18 +++++++++--------- docs/source/_static/logos | 1 + docs/source/index.rst | 2 +- .../logos/EU_flag.png | Bin .../logos/MARVEL.png | Bin .../_static => miscellaneous}/logos/MaX.png | Bin .../logos/MarketPlace.png | Bin .../_static => miscellaneous}/logos/QE.jpg | Bin .../logos/bigmap_logo.png | Bin 9 files changed, 11 insertions(+), 10 deletions(-) create mode 120000 docs/source/_static/logos rename {docs/source/_static => miscellaneous}/logos/EU_flag.png (100%) rename {docs/source/_static => miscellaneous}/logos/MARVEL.png (100%) rename {docs/source/_static => miscellaneous}/logos/MaX.png (100%) rename {docs/source/_static => miscellaneous}/logos/MarketPlace.png (100%) rename {docs/source/_static => miscellaneous}/logos/QE.jpg (100%) rename {docs/source/_static => miscellaneous}/logos/bigmap_logo.png (100%) diff --git a/README.md b/README.md index 154d598c6..2c3725ab2 100644 --- a/README.md +++ b/README.md @@ -61,17 +61,17 @@ Additional notes: ## Acknowledgements We acknowledge support from: -* the European Union\'s Horizon 2020 research and innovation programme (Grant No. 957189, [project BIG-MAP](https://www.big-map.eu)) -* the [MARVEL National Centre for Competency in Research]() funded by the [Swiss National Science Foundation]() -* the MARKETPLACE project funded by [Horizon 2020](https://ec.europa.eu/programmes/horizon2020/) under the H2020-NMBP-25-2017 call (Grant No. 760173), -* the [MaX European Centre of Excellence]() funded by the Horizon 2020 EINFRA-5 program, Grant No. 676598. +* the European Union\'s Horizon 2020 research and innovation programme (Grant No. 957189, [project BIG-MAP](https://www.big-map.eu)). +* the [MARVEL National Centre for Competency in Research]() funded by the [Swiss National Science Foundation](). +* the MARKETPLACE project funded by [Horizon 2020](https://ec.europa.eu/programmes/horizon2020/) under the H2020-NMBP-25-2017 call (Grant No. 760173). +* the [MaX European Centre of Excellence]() funded by the Horizon 2020 EINFRA-5 program (Grant No. 676598).
- MARVEL - MaX - MarketPlace + MARVEL + MaX + MarketPlace
- BIG-MAP - EU + BIG-MAP + EU
diff --git a/docs/source/_static/logos b/docs/source/_static/logos new file mode 120000 index 000000000..a954d2141 --- /dev/null +++ b/docs/source/_static/logos @@ -0,0 +1 @@ +../../../miscellaneous/logos \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index 222500c7e..46bdb6149 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -146,7 +146,7 @@ We also acknowledge support from: - the European Union's Horizon 2020 research and innovation programme (Grant No. 957189, `project BIG-MAP `_); - the `MARVEL National Centre for Competency in Research `_ funded by the `Swiss National Science Foundation `_; - the MARKETPLACE project funded by `Horizon 2020 `_ under the H2020-NMBP-25-2017 call (Grant No. 760173); -- the `MaX European Centre of Excellence `_ funded by the Horizon 2020 EINFRA-5 program, Grant No. 676598. +- the `MaX European Centre of Excellence `_ funded by the Horizon 2020 EINFRA-5 program (Grant No. 676598). .. raw:: html diff --git a/docs/source/_static/logos/EU_flag.png b/miscellaneous/logos/EU_flag.png similarity index 100% rename from docs/source/_static/logos/EU_flag.png rename to miscellaneous/logos/EU_flag.png diff --git a/docs/source/_static/logos/MARVEL.png b/miscellaneous/logos/MARVEL.png similarity index 100% rename from docs/source/_static/logos/MARVEL.png rename to miscellaneous/logos/MARVEL.png diff --git a/docs/source/_static/logos/MaX.png b/miscellaneous/logos/MaX.png similarity index 100% rename from docs/source/_static/logos/MaX.png rename to miscellaneous/logos/MaX.png diff --git a/docs/source/_static/logos/MarketPlace.png b/miscellaneous/logos/MarketPlace.png similarity index 100% rename from docs/source/_static/logos/MarketPlace.png rename to miscellaneous/logos/MarketPlace.png diff --git a/docs/source/_static/logos/QE.jpg b/miscellaneous/logos/QE.jpg similarity index 100% rename from docs/source/_static/logos/QE.jpg rename to miscellaneous/logos/QE.jpg diff --git a/docs/source/_static/logos/bigmap_logo.png b/miscellaneous/logos/bigmap_logo.png similarity index 100% rename from docs/source/_static/logos/bigmap_logo.png rename to miscellaneous/logos/bigmap_logo.png From 87ba4dc61080be9d88fecbaba9085096544e3753 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Mon, 5 Feb 2024 14:53:56 +0100 Subject: [PATCH 029/166] New BandsPdosWidget (#581) The old bandsplot widget https://github.com/aiidalab/widget-bandsplot was separately maintained in the repo with complex and not well modulized JS code. In this PR, the new bandspdoswidget is introduced to have it all implemented in python and in ipywidget framework with using plotly as plot engine. The output band structure is in a publish ready level with a flexible control on the groups of orbitals/atoms user want to projected. Co-authored-by: Jusong Yu --- setup.cfg | 1 - src/aiidalab_qe/common/bandpdoswidget.py | 862 ++++++++++++++++++ src/aiidalab_qe/plugins/bands/result.py | 33 +- .../plugins/electronic_structure/result.py | 230 +---- src/aiidalab_qe/plugins/pdos/result.py | 203 +---- tests/test_plugins_bands.py | 30 +- tests/test_plugins_electronic_structure.py | 36 +- tests/test_plugins_pdos.py | 42 +- 8 files changed, 961 insertions(+), 476 deletions(-) create mode 100644 src/aiidalab_qe/common/bandpdoswidget.py diff --git a/setup.cfg b/setup.cfg index 1b2c18642..5f4aea118 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,7 +31,6 @@ install_requires = aiida-pseudo~=1.4 filelock~=3.8 importlib-resources~=5.2 - widget-bandsplot~=0.5.1 python_requires = >=3.8 [options.packages.find] diff --git a/src/aiidalab_qe/common/bandpdoswidget.py b/src/aiidalab_qe/common/bandpdoswidget.py new file mode 100644 index 000000000..16909e42b --- /dev/null +++ b/src/aiidalab_qe/common/bandpdoswidget.py @@ -0,0 +1,862 @@ +import base64 +import json + +import ipywidgets as ipw +import numpy as np +import plotly.graph_objects as go +from aiida.orm import ProjectionData +from aiidalab_widgets_base.utils import string_range_to_list, StatusHTML +from IPython.display import clear_output, display +from plotly.subplots import make_subplots +import re + + +class BandPdosPlotly: + SETTINGS = { + "axis_linecolor": "#111111", + "bands_linecolor": "#111111", + "bands_up_linecolor": "rgba(205, 0, 0, 0.4)", # Red Opacitiy 40% + "bands_down_linecolor": "rgba(72,118,255, 0.4)", # Blue Opacitiy 40% + "combined_plot_height": 600, + "combined_plot_width": 900, + "combined_column_widths": [0.7, 0.3], + "bands_plot_height": 600, + "bands_plot_width": 850, + "pdos_plot_height": 600, + "pdos_plot_width": 850, + "vertical_linecolor": "#111111", + "horizontal_linecolor": "#111111", + "vertical_range_bands": [-10, 10], + "horizontal_range_pdos": [-10, 10], + } + + def __init__(self, bands_data=None, pdos_data=None): + self.bands_data = bands_data + self.pdos_data = pdos_data + self.fermi_energy = self._get_fermi_energy() + + # Plotly Axis + # Plotly settings + self._bands_xaxis = self._band_xaxis() + self._bands_yaxis = self._band_yaxis() + self._dos_xaxis = self._dos_xaxis() + self._dos_yaxis = self._dos_yaxis() + + def _get_fermi_energy(self): + fermi_energy = ( + self.pdos_data["fermi_energy"] + if self.pdos_data + else self.bands_data["fermi_energy"] + ) + return fermi_energy + + def _band_xaxis(self): + """Function to return the xaxis for the bands plot.""" + + if not self.bands_data: + return None + paths = self.bands_data.get("paths") + slider_bands = go.layout.xaxis.Rangeslider( + thickness=0.08, + range=[0, paths[-1]["x"][-1]], + ) + bandxaxis = go.layout.XAxis( + title="k-points", + range=[0, paths[-1]["x"][-1]], + showgrid=True, + showline=True, + tickmode="array", + rangeslider=slider_bands, + fixedrange=False, + tickvals=self.bands_data["pathlabels"][1], # ,self.band_labels[1], + ticktext=self.bands_data["pathlabels"][0], # self.band_labels[0], + showticklabels=True, + linecolor=self.SETTINGS["axis_linecolor"], + mirror=True, + linewidth=2, + type="linear", + ) + + return bandxaxis + + def _band_yaxis(self): + """Function to return the yaxis for the bands plot.""" + + if not self.bands_data: + return None + + bandyaxis = go.layout.YAxis( + title=dict(text="Electronic Bands (eV)", standoff=1), + side="left", + showgrid=True, + showline=True, + zeroline=True, + range=self.SETTINGS["vertical_range_bands"], + fixedrange=False, + automargin=True, + ticks="inside", + linewidth=2, + linecolor=self.SETTINGS["axis_linecolor"], + tickwidth=2, + zerolinewidth=2, + ) + + return bandyaxis + + def _dos_xaxis(self): + """Function to return the xaxis for the dos plot.""" + + if not self.pdos_data: + return None + + if self.bands_data: + dosxaxis = go.layout.XAxis( + title="Density of states", + side="bottom", + showgrid=True, + showline=True, + linecolor=self.SETTINGS["axis_linecolor"], + mirror="ticks", + ticks="inside", + linewidth=2, + tickwidth=2, + automargin=True, + ) + + else: + dosxaxis = go.layout.XAxis( + title="Density of states (eV)", + showgrid=True, + showline=True, + linecolor=self.SETTINGS["axis_linecolor"], + mirror="ticks", + ticks="inside", + linewidth=2, + tickwidth=2, + range=self.SETTINGS["horizontal_range_pdos"], + ) + + return dosxaxis + + def _dos_yaxis(self): + """Function to return the yaxis for the dos plot.""" + + if not self.pdos_data: + return None + + if self.bands_data: + dosyaxis = go.layout.YAxis( + # title= {"text":"Density of states (eV)", "standoff": 1}, + showgrid=True, + showline=True, + side="right", + mirror="ticks", + ticks="inside", + linewidth=2, + tickwidth=2, + linecolor=self.SETTINGS["axis_linecolor"], + zerolinewidth=2, + ) + + else: + dosyaxis = go.layout.YAxis( + # title="Density of states (eV)", + showgrid=True, + showline=True, + side="left", + mirror="ticks", + ticks="inside", + linewidth=2, + tickwidth=2, + linecolor=self.SETTINGS["axis_linecolor"], + zerolinewidth=2, + ) + + return dosyaxis + + def _get_bandspdos_plot(self): + """Function to return the bands plot widget.""" + conditions = { + (True, False): self._create_bands_only_plot, + (False, True): self._create_dos_only_plot, + (True, True): self._create_combined_plot, + } + + return conditions.get((bool(self.bands_data), bool(self.pdos_data)), None)() + + def _create_bands_only_plot(self): + """Function to return the bands plot widget.""" + + fig = go.Figure() + paths = self.bands_data.get("paths") + + self._add_band_traces(fig, paths, "bands_only") + + band_labels = self.bands_data.get("pathlabels") + for i in band_labels[1]: + fig.add_vline( + x=i, line=dict(color=self.SETTINGS["vertical_linecolor"], width=1) + ) + fig.update_layout( + xaxis=self._bands_xaxis, + yaxis=self._bands_yaxis, + plot_bgcolor="white", + height=self.SETTINGS["bands_plot_height"], + width=self.SETTINGS["bands_plot_width"], + ) + return go.FigureWidget(fig) + + def _create_dos_only_plot(self): + """Function to return the pdos plot widget.""" + + fig = go.Figure() + # Extract DOS data + self._add_dos_traces(fig, plot_type="dos_only") + # Add a vertical line at zero energy + fig.add_vline( + x=0, + line=dict(color=self.SETTINGS["vertical_linecolor"], width=1, dash="dot"), + ) + + # Update the layout of the Figure + fig.update_layout( + xaxis=self._dos_xaxis, + yaxis=self._dos_yaxis, + plot_bgcolor="white", + height=self.SETTINGS["pdos_plot_height"], + width=self.SETTINGS["pdos_plot_width"], + ) + + return go.FigureWidget(fig) + + def _create_combined_plot(self): + fig = make_subplots( + rows=1, + cols=2, + shared_yaxes=True, + column_widths=self.SETTINGS["combined_column_widths"], + horizontal_spacing=0.015, + ) + paths = self.bands_data.get("paths") + self._add_band_traces(fig, paths, plot_type="combined") + self._add_dos_traces(fig, plot_type="combined") + band_labels = self.bands_data.get("pathlabels") + for i in band_labels[1]: + fig.add_vline( + x=i, + line=dict(color=self.SETTINGS["vertical_linecolor"], width=1), + row=1, + col=1, + ) + self._customize_combined_layout(fig) + return go.FigureWidget(fig) + + def _add_band_traces(self, fig, paths, plot_type): + paths = self.bands_data.get("paths") + + # Spin condition: True if spin-polarized False if not + spin_type = paths[0].get("two_band_types") + # Convert paths to a list of Scatter objects + scatter_objects = [] + + for band in paths: + if not spin_type: + # Non-spin-polarized case + for bands in band["values"]: + bands_np = np.array(bands) + scatter_objects.append( + go.Scatter( + x=band["x"], + y=bands_np - self.fermi_energy, + mode="lines", + line=dict( + color=self.SETTINGS["bands_linecolor"], + shape="spline", + smoothing=1.3, + ), + showlegend=False, + ) + ) + else: + half_len = len(band["values"]) // 2 + first_half = band["values"][:half_len] + second_half = band["values"][half_len:] + + # Red line for the Spin up + color_first_half = self.SETTINGS["bands_up_linecolor"] + # Blue line for the Spin down + color_second_half = self.SETTINGS["bands_down_linecolor"] + + for bands, color in zip( + (first_half, second_half), (color_first_half, color_second_half) + ): + for band_values in bands: + bands_np = np.array(band_values) + scatter_objects.append( + go.Scatter( + x=band["x"], + y=bands_np - self.fermi_energy, + mode="lines", + line=dict( + color=color, + shape="spline", + smoothing=1.3, + ), + showlegend=False, + ) + ) + + if plot_type == "bands_only": + fig.add_traces(scatter_objects) + else: + rows = [1] * len(scatter_objects) + cols = [1] * len(scatter_objects) + fig.add_traces(scatter_objects, rows=rows, cols=cols) + + def _add_dos_traces(self, fig, plot_type): + # Extract DOS data + dos_data = self.pdos_data["dos"] + + # Pre-allocate memory for Scatter objects + num_traces = len(dos_data) + scatter_objects = [None] * num_traces + + # Vectorize Scatter object creation + for i, trace in enumerate(dos_data): + dos_np = np.array(trace["x"]) + fill = "tozerox" if plot_type == "combined" else "tozeroy" + x_data = ( + trace["y"] if plot_type == "combined" else dos_np - self.fermi_energy + ) + y_data = ( + dos_np - self.fermi_energy if plot_type == "combined" else trace["y"] + ) + scatter_objects[i] = go.Scatter( + x=x_data, + y=y_data, + fill=fill, + name=trace["label"], + line=dict(color=trace["borderColor"], shape="spline", smoothing=1.0), + ) + if plot_type == "dos_only": + fig.add_traces(scatter_objects) + else: + rows = [1] * len(scatter_objects) + cols = [2] * len(scatter_objects) + fig.add_traces(scatter_objects, rows=rows, cols=cols) + + def _customize_combined_layout(self, fig): + self._customize_layout(fig, self._bands_xaxis, self._bands_yaxis) + self._customize_layout(fig, self._dos_xaxis, self._dos_yaxis, col=2) + fig.update_layout( + legend=dict(xanchor="left", x=1.06), + height=self.SETTINGS["combined_plot_height"], + width=self.SETTINGS["combined_plot_width"], + plot_bgcolor="white", + ) + + def _customize_layout(self, fig, xaxis, yaxis, row=1, col=1): + fig.update_xaxes(patch=xaxis, row=row, col=col) + fig.update_yaxes(patch=yaxis, row=row, col=col, showticklabels=True) + fig.add_hline( + y=0, + line=dict(color=self.SETTINGS["horizontal_linecolor"], width=1, dash="dot"), + row=row, + col=col, + ) + + @property + def bandspdosfigure(self): + return self._get_bandspdos_plot() + + +class BandPdosWidget(ipw.VBox): + """ + A widget for plotting band structure and projected density of states (PDOS) data. + + Parameters: + - bands (optional): A node containing band structure data. + - pdos (optional): A node containing PDOS data. + + Attributes: + - description: HTML description of the widget. + - dos_atoms_group: Dropdown widget to select the grouping of atoms for PDOS plotting. + - dos_plot_group: Dropdown widget to select the type of PDOS contributions to plot. + - selected_atoms: Text widget to select specific atoms for PDOS plotting. + - update_plot_button: Button widget to update the plot. + - download_button: Button widget to download the data. + - dos_data: PDOS data. + - bands_data: Band structure data. + - bandsplot_widget: Plotly widget for band structure and PDOS plot. + - bands_widget: Output widget to display the bandsplot widget. + - pdos_options_out: Output widget to clear specific widgets. + """ + + description = ipw.HTML( + """
+ Select the style of plotting the projected density of states. +
""" + ) + + def __init__(self, bands=None, pdos=None, **kwargs): + if bands is None and pdos is None: + raise ValueError("Either bands or pdos must be provided") + + self.bands = bands # bands node + self.pdos = pdos # pdos node + + self.dos_atoms_group = ipw.Dropdown( + description="Group by:", + options=[ + ("Kinds", "kinds"), + ("Atoms", "atoms"), + ], + value="kinds", + style={"description_width": "initial"}, + ) + self.dos_plot_group = ipw.Dropdown( + description="Plot contributions:", + options=[ + ("Total", "total"), + ("Orbital", "orbital"), + ("Angular momentum", "angular_momentum"), + ], + value="total", + style={"description_width": "initial"}, + ) + self.selected_atoms = ipw.Text( + description="Select atoms:", + value="", + style={"description_width": "initial"}, + ) + self._wrong_syntax = StatusHTML(clear_after=8) + self.update_plot_button = ipw.Button( + description="Update Plot", + icon="pencil", + button_style="primary", + disabled=False, + ) + self.download_button = ipw.Button( + description="Download Data", + icon="download", + button_style="primary", + disabled=False, + layout=ipw.Layout(visibility="hidden"), + ) + + # Information for the plot + self.dos_data = self._get_dos_data() + self.bands_data = self._get_bands_data() + # Plotly widget + self.bandsplot_widget = BandPdosPlotly( + bands_data=self.bands_data, pdos_data=self.dos_data + ).bandspdosfigure + # Output widget to display the bandsplot widget + self.bands_widget = ipw.Output() + # Output widget to clear the specific widgets + self.pdos_options_out = ipw.Output() + + self.pdos_options = ipw.VBox( + [ + self.description, + self.dos_atoms_group, + self.dos_plot_group, + ipw.HBox([self.selected_atoms, self._wrong_syntax]), + self.update_plot_button, + ] + ) + + self._initial_view() + + # Set the event handlers + self.download_button.on_click(self.download_data) + self.update_plot_button.on_click(self._update_plot) + + super().__init__( + children=[ + self.pdos_options_out, + self.download_button, + self.bands_widget, # Add the output widget to the VBox + ], + **kwargs, + ) + if self.pdos: + with self.pdos_options_out: + display(self.pdos_options) + + def download_data(self, _=None): + """Function to download the data.""" + file_name_bands = "bands_data.json" + file_name_dos = "dos_data.json" + if self.bands_data: + json_str = json.dumps(self.bands_data) + b64_str = base64.b64encode(json_str.encode()).decode() + self._download(payload=b64_str, filename=file_name_bands) + if self.dos_data: + json_str = json.dumps(self.dos_data) + b64_str = base64.b64encode(json_str.encode()).decode() + self._download(payload=b64_str, filename=file_name_dos) + + @staticmethod + def _download(payload, filename): + """Download payload as a file named as filename.""" + from IPython.display import Javascript + + javas = Javascript( + """ + var link = document.createElement('a'); + link.href = 'data:text/json;charset=utf-8;base64,{payload}' + link.download = "{filename}" + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + """.format(payload=payload, filename=filename) + ) + display(javas) + + def _get_dos_data(self): + if not self.pdos: + return None + expanded_selection, syntax_ok = string_range_to_list( + self.selected_atoms.value, shift=-1 + ) + if syntax_ok: + dos = get_pdos_data( + self.pdos, + group_tag=self.dos_atoms_group.value, + plot_tag=self.dos_plot_group.value, + selected_atoms=expanded_selection, + ) + return dos + else: + return None + + def _get_bands_data(self): + if not self.bands: + return None + + bands = export_bands_data(self.bands) + return bands + + def _initial_view(self): + with self.bands_widget: + self._clear_output_and_display(self.bandsplot_widget) + self.download_button.layout.visibility = "visible" + + def _update_plot(self, _=None): + with self.bands_widget: + expanded_selection, syntax_ok = string_range_to_list( + self.selected_atoms.value, shift=-1 + ) + if not syntax_ok: + self._wrong_syntax.message = """
ERROR: Invalid syntax for selected atoms
""" + clear_output(wait=True) + else: + self.dos_data = self._get_dos_data() + self.bandsplot_widget = BandPdosPlotly( + bands_data=self.bands_data, pdos_data=self.dos_data + ).bandspdosfigure + self._clear_output_and_display(self.bandsplot_widget) + + def _clear_output_and_display(self, widget=None): + clear_output(wait=True) + if widget: + display(widget) + + +def get_pdos_data(pdos, group_tag, plot_tag, selected_atoms): + dos = [] + + if "output_dos" not in pdos.dos: + return None + + _, energy_dos, _ = pdos.dos.output_dos.get_x() + tdos_values = {f"{n}": v for n, v, _ in pdos.dos.output_dos.get_y()} + + if "projections" in pdos.projwfc: + # Total DOS + tdos = { + "label": "Total DOS", + "x": energy_dos.tolist(), + "y": tdos_values.get("dos").tolist(), + "borderColor": "#8A8A8A", # dark gray + "backgroundColor": "#999999", # light gray + "backgroundAlpha": "40%", + "lineStyle": "solid", + } + dos.append(tdos) + dos += _projections_curated_options( + pdos.projwfc.projections, + spin_type="none", + group_tag=group_tag, + plot_tag=plot_tag, + selected_atoms=selected_atoms, + ) + else: + # Total DOS (↑) and Total DOS (↓) + tdos_up = { + "label": "Total DOS (↑)", + "x": energy_dos.tolist(), + "y": tdos_values.get("dos_spin_up").tolist(), + "borderColor": "#8A8A8A", # dark gray + "backgroundColor": "#999999", # light gray + "backgroundAlpha": "40%", + "lineStyle": "solid", + } + tdos_down = { + "label": "Total DOS (↓)", + "x": energy_dos.tolist(), + "y": (-tdos_values.get("dos_spin_down")).tolist(), + "borderColor": "#8A8A8A", # dark gray + "backgroundColor": "#999999", # light gray + "backgroundAlpha": "40%", + "lineStyle": "dash", + } + dos += [tdos_up, tdos_down] + + # Spin-up (↑) and Spin-down (↓) + dos += _projections_curated_options( + pdos.projwfc.projections_up, + spin_type="up", + group_tag=group_tag, + plot_tag=plot_tag, + selected_atoms=selected_atoms, + ) + dos += _projections_curated_options( + pdos.projwfc.projections_down, + spin_type="down", + line_style="dash", + group_tag=group_tag, + plot_tag=plot_tag, + selected_atoms=selected_atoms, + ) + + data_dict = { + "fermi_energy": pdos.nscf.output_parameters["fermi_energy"], + "dos": dos, + } + + return json.loads(json.dumps(data_dict)) + + +def _projections_curated_options( + projections: ProjectionData, + group_tag, + plot_tag, + selected_atoms, + spin_type="none", + line_style="solid", +): + _pdos = {} + list_positions = [] + + # Constants for HTML tags + HTML_TAGS = { + "s": "s", + "pz": "pz", + "px": "px", + "py": "py", + "dz2": "dz2", + "dxy": "dxy", + "dxz": "dxz", + "dyz": "dyz", + "dx2-y2": "dx2-y2", + "fz3": "fz3", + "fxz2": "fxz2", + "fyz2": "fyz2", + "fxyz": "fxzy", + "fx(x2-3y2)": "fx(x2-3y2)", + "fy(3x2-y2)": "fy(3x2-y2)", + "fy(x2-z2)": "fy(x2-z2)", + 0.5: "+1/2", + -0.5: "-1/2", + 1.5: "+3/2", + -1.5: "-3/2", + 2.5: "+5/2", + -2.5: "-5/2", + } + + # Constants for spin types + SPIN_LABELS = {"up": "(↑)", "down": "(↓)", "none": ""} + + def get_key( + group_tag, + plot_tag, + atom_position, + kind_name, + orbital_name_plotly, + orbital_angular_momentum, + ): + """Generates the key based on group_tag and plot_tag.""" + + key_formats = { + ("atoms", "total"): r"{var1}-{var}", + ("kinds", "total"): r"{var1}", + ("atoms", "orbital"): r"{var1}-{var}
{var2}", + ("kinds", "orbital"): r"{var1}-{var2}", + ("atoms", "angular_momentum"): r"{var1}-{var}
{var3}", + ("kinds", "angular_momentum"): r"{var1}-{var3}", + } + + key = key_formats.get((group_tag, plot_tag)) + if key is not None: + return key.format( + var=atom_position, + var1=kind_name, + var2=orbital_name_plotly, + var3=orbital_angular_momentum, + ) + else: + return None + + for orbital, pdos, energy in projections.get_pdos(): + orbital_data = orbital.get_orbital_dict() + kind_name = orbital_data["kind_name"] + atom_position = [round(i, 2) for i in orbital_data["position"]] + + if atom_position not in list_positions: + list_positions.append(atom_position) + + try: + orbital_name = orbital.get_name_from_quantum_numbers( + orbital_data["angular_momentum"], orbital_data["magnetic_number"] + ).lower() + orbital_name_plotly = HTML_TAGS.get(orbital_name, orbital_name) + orbital_angular_momentum = orbital_name[0] + except AttributeError: + orbital_name = "j {j} l {l} m_j{m_j}".format( + j=orbital_data["total_angular_momentum"], + l=orbital_data["angular_momentum"], + m_j=orbital_data["magnetic_number"], + ) + orbital_name_plotly = "j={j} l={l} mj={m_j}".format( + j=HTML_TAGS.get( + orbital_data["total_angular_momentum"], + orbital_data["total_angular_momentum"], + ), + l=orbital_data["angular_momentum"], + m_j=HTML_TAGS.get( + orbital_data["magnetic_number"], orbital_data["magnetic_number"] + ), + ) + orbital_angular_momentum = "l {l} ".format( + l=orbital_data["angular_momentum"], + ) + + if not selected_atoms: + key = get_key( + group_tag, + plot_tag, + atom_position, + kind_name, + orbital_name_plotly, + orbital_angular_momentum, + ) + + if key: + _pdos.setdefault(key, [energy, 0])[1] += pdos + + else: + try: + index = list_positions.index(atom_position) + if index in selected_atoms: + key = get_key( + group_tag, + plot_tag, + atom_position, + kind_name, + orbital_name_plotly, + orbital_angular_momentum, + ) + + if key: + _pdos.setdefault(key, [energy, 0])[1] += pdos + + except ValueError: + pass + + dos = [] + for label, (energy, pdos) in _pdos.items(): + if spin_type == "down": + pdos = -pdos + label += SPIN_LABELS[spin_type] + + if spin_type == "up": + label += SPIN_LABELS[spin_type] + + orbital_pdos = { + "label": label, + "x": energy.tolist(), + "y": pdos.tolist(), + "borderColor": cmap(label), + "lineStyle": line_style, + } + dos.append(orbital_pdos) + + return dos + + +def export_bands_data(outputs, fermi_energy=None): + if "band_structure" not in outputs: + return None + + data = json.loads(outputs.band_structure._exportcontent("json", comments=False)[0]) + # The fermi energy from band calculation is not robust. + data["fermi_energy"] = outputs.band_parameters["fermi_energy"] or fermi_energy + data["pathlabels"] = get_bands_labeling(data) + return data + + +def get_bands_labeling(bandsdata: dict) -> list: + """Function to return two lists containing the labels and values (kpoint) for plotting. + params: + - bandsdata: dictionary from export_bands_data function + output: update bandsdata with a new key "pathlabels" including (list of str), label_values (list of float) + """ + UNICODE_SYMBOL = { + "GAMMA": "\u0393", + "DELTA": "\u0394", + "LAMBDA": "\u039B", + "SIGMA": "\u03A3", + "EPSILON": "\u0395", + } + paths = bandsdata.get("paths") + labels = [] + for path in paths: # Remove duplicates + label_a = [path["from"], path["x"][0]] + label_b = [path["to"], path["x"][-1]] + if label_a not in labels: + labels.append(label_a) + if label_b not in labels: + labels.append(label_b) + + clean_labels = [] # Format + for i in labels: + if clean_labels: + if (i not in clean_labels) and (clean_labels[-1][-1] == i[1]): + clean_labels[-1][0] = clean_labels[-1][0] + "|" + i[0] + else: + clean_labels.append(i) + else: + clean_labels.append(i) + + path_labels = [label[0] for label in clean_labels] + for i, label in enumerate(path_labels): + path_labels[i] = re.sub( + r"([A-Z]+)", lambda x: UNICODE_SYMBOL.get(x.group(), x.group()), label + ) + path_values = [label[1] for label in clean_labels] + return [path_labels, path_values] + + +def cmap(label: str) -> str: + """Return RGB string of color for given pseudo info + Hardcoded at the momment. + """ + import random + + # if a unknow type generate random color based on ascii sum + ascn = sum([ord(c) for c in label]) + random.seed(ascn) + + return "#%06x" % random.randint(0, 0xFFFFFF) diff --git a/src/aiidalab_qe/plugins/bands/result.py b/src/aiidalab_qe/plugins/bands/result.py index 905aee852..e24c76d7e 100644 --- a/src/aiidalab_qe/plugins/bands/result.py +++ b/src/aiidalab_qe/plugins/bands/result.py @@ -1,30 +1,10 @@ """Bands results view widgets """ - - +from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.common.panel import ResultPanel -def export_bands_data(outputs, fermi_energy=None): - """Export the bands data from the outputs of the calculation.""" - import json - - from monty.json import jsanitize - - if "band_structure" in outputs: - data = json.loads( - outputs.band_structure._exportcontent("json", comments=False)[0] - ) - # The fermi energy from band calculation is not robust. - data["fermi_level"] = fermi_energy or outputs.band_parameters["fermi_energy"] - return [ - jsanitize(data), - ] - else: - return None - - class Result(ResultPanel): """Result panel for the bands calculation.""" @@ -35,12 +15,13 @@ def __init__(self, node=None, **kwargs): super().__init__(node=node, **kwargs) def _update_view(self): - from widget_bandsplot import BandsPlotWidget + # Check if the workchain has the outputs + try: + bands_node = self.node.outputs.bands + except AttributeError: + bands_node = None - bands_data = export_bands_data(self.outputs.bands) - _bands_plot_view = BandsPlotWidget( - bands=bands_data, - ) + _bands_plot_view = BandPdosWidget(bands=bands_node) self.children = [ _bands_plot_view, ] diff --git a/src/aiidalab_qe/plugins/electronic_structure/result.py b/src/aiidalab_qe/plugins/electronic_structure/result.py index 2a5d652a3..1142ae450 100644 --- a/src/aiidalab_qe/plugins/electronic_structure/result.py +++ b/src/aiidalab_qe/plugins/electronic_structure/result.py @@ -1,234 +1,28 @@ """Electronic structure results view widgets""" -import json -import random - -import ipywidgets as ipw -from aiida import orm -from monty.json import jsanitize -from widget_bandsplot import BandsPlotWidget +from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.common.panel import ResultPanel -def export_data(work_chain_node, group_dos_by="atom"): - dos = export_pdos_data(work_chain_node, group_dos_by=group_dos_by) - fermi_energy = dos["fermi_energy"] if dos else None - - bands = export_bands_data(work_chain_node, fermi_energy) - - return dict( - bands=bands, - dos=dos, - ) - - -def export_pdos_data(work_chain_node, group_dos_by="atom"): - if "pdos" in work_chain_node.outputs: - _, energy_dos, _ = work_chain_node.outputs.pdos.dos.output_dos.get_x() - tdos_values = { - f"{n}": v for n, v, _ in work_chain_node.outputs.pdos.dos.output_dos.get_y() - } - - dos = [] - - if "projections" in work_chain_node.outputs.pdos.projwfc: - # The total dos parsed - tdos = { - "label": "Total DOS", - "x": energy_dos.tolist(), - "y": tdos_values.get("dos").tolist(), - "borderColor": "#8A8A8A", # dark gray - "backgroundColor": "#999999", # light gray - "backgroundAlpha": "40%", - "lineStyle": "solid", - } - dos.append(tdos) - - dos += _projections_curated( - work_chain_node.outputs.pdos.projwfc.projections, - group_dos_by=group_dos_by, - spin_type="none", - ) - - else: - # The total dos parsed - tdos_up = { - "label": "Total DOS (↑)", - "x": energy_dos.tolist(), - "y": tdos_values.get("dos_spin_up").tolist(), - "borderColor": "#8A8A8A", # dark gray - "backgroundColor": "#999999", # light gray - "backgroundAlpha": "40%", - "lineStyle": "solid", - } - tdos_down = { - "label": "Total DOS (↓)", - "x": energy_dos.tolist(), - "y": (-tdos_values.get("dos_spin_down")).tolist(), # minus - "borderColor": "#8A8A8A", # dark gray - "backgroundColor": "#999999", # light gray - "backgroundAlpha": "40%", - "lineStyle": "dash", - } - dos += [tdos_up, tdos_down] - - # spin-up (↑) - dos += _projections_curated( - work_chain_node.outputs.pdos.projwfc.projections_up, - group_dos_by=group_dos_by, - spin_type="up", - ) - - # spin-dn (↓) - dos += _projections_curated( - work_chain_node.outputs.pdos.projwfc.projections_down, - group_dos_by=group_dos_by, - spin_type="down", - line_style="dash", - ) - - data_dict = { - "fermi_energy": work_chain_node.outputs.pdos.nscf.output_parameters[ - "fermi_energy" - ], - "dos": dos, - } - - return json.loads(json.dumps(data_dict)) - - else: - return None - - -def export_bands_data(work_chain_node, fermi_energy=None): - if "bands" in work_chain_node.outputs: - data = json.loads( - work_chain_node.outputs.bands.band_structure._exportcontent( - "json", comments=False - )[0] - ) - # The fermi energy from band calculation is not robust. - data["fermi_level"] = ( - fermi_energy - or work_chain_node.outputs.bands.band_parameters["fermi_energy"] - ) - return [ - jsanitize(data), - ] - else: - return None - - -def _projections_curated( - projections: orm.ProjectionData, - group_dos_by="atom", - spin_type="none", - line_style="solid", -): - """Collect the data from ProjectionData and parse it as dos list which can be - understand by bandsplot widget. `group_dos_by` is for which tag to be grouped, by atom or by orbital name. - The spin_type is used to invert all the y values of pdos to be shown as spin down pdos and to set label. - """ - _pdos = {} - - for orbital, pdos, energy in projections.get_pdos(): - orbital_data = orbital.get_orbital_dict() - kind_name = orbital_data["kind_name"] - atom_position = [round(i, 2) for i in orbital_data["position"]] - orbital_name = orbital.get_name_from_quantum_numbers( - orbital_data["angular_momentum"], orbital_data["magnetic_number"] - ).lower() - - if group_dos_by == "atom": - dos_group_name = atom_position - elif group_dos_by == "angular": - # by orbital label - dos_group_name = orbital_name[0] - elif group_dos_by == "angular_and_magnetic": - # by orbital label - dos_group_name = orbital_name - else: - raise Exception(f"Unknow dos type: {group_dos_by}!") - - key = f"{kind_name}-{dos_group_name}" - if key in _pdos: - _pdos[key][1] += pdos - else: - _pdos[key] = [energy, pdos] - - dos = [] - for label, (energy, pdos) in _pdos.items(): - if spin_type == "down": - # invert y-axis - pdos = -pdos - label = f"{label} (↓)" - - if spin_type == "up": - label = f"{label} (↑)" - - orbital_pdos = { - "label": label, - "x": energy.tolist(), - "y": pdos.tolist(), - "borderColor": cmap(label), - "lineStyle": line_style, - } - dos.append(orbital_pdos) - - return dos - - -def cmap(label: str) -> str: - """Return RGB string of color for given pseudo info - Hardcoded at the momment. - """ - # if a unknow type generate random color based on ascii sum - ascn = sum([ord(c) for c in label]) - random.seed(ascn) - - return "#%06x" % random.randint(0, 0xFFFFFF) - - class Result(ResultPanel): title = "Electronic Structure" workchain_labels = ["bands", "pdos"] def __init__(self, node=None, **kwargs): - self.dos_group_label = ipw.Label( - "DOS grouped by:", - layout=ipw.Layout(justify_content="flex-start", width="120px"), - ) - self.group_dos_by = ipw.ToggleButtons( - options=[ - ("Atom", "atom"), - ("Orbital", "angular"), - ], - value="atom", - ) - self.settings = ipw.HBox( - children=[ - self.dos_group_label, - self.group_dos_by, - ], - layout={"margin": "0 0 30px 30px"}, - ) - self.group_dos_by.observe(self._observe_group_dos_by, names="value") super().__init__(node=node, **kwargs) - def _observe_group_dos_by(self, change): - """Update the view of the widget when the group_dos_by value changes.""" - self._update_view() - def _update_view(self): """Update the view of the widget.""" # - data = export_data(self.node, group_dos_by=self.group_dos_by.value) - _bands_plot_view = BandsPlotWidget( - bands=data.get("bands", None), - dos=data.get("dos", None), - ) + try: + pdos_node = self.node.outputs.pdos + except AttributeError: + pdos_node = None + + try: + bands_node = self.node.outputs.bands + except AttributeError: + bands_node = None + _bands_dos_widget = BandPdosWidget(bands=bands_node, pdos=pdos_node) # update the electronic structure tab - self.children = [ - self.settings, - _bands_plot_view, - ] + self.children = [_bands_dos_widget] diff --git a/src/aiidalab_qe/plugins/pdos/result.py b/src/aiidalab_qe/plugins/pdos/result.py index b57be09ef..db46484b8 100644 --- a/src/aiidalab_qe/plugins/pdos/result.py +++ b/src/aiidalab_qe/plugins/pdos/result.py @@ -2,160 +2,10 @@ """ -import ipywidgets as ipw -from aiida.orm import ProjectionData - +from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.common.panel import ResultPanel -def cmap(label: str) -> str: - """Return RGB string of color for given pseudo info - Hardcoded at the momment. - """ - import random - - # if a unknow type generate random color based on ascii sum - ascn = sum([ord(c) for c in label]) - random.seed(ascn) - - return "#%06x" % random.randint(0, 0xFFFFFF) - - -def _projections_curated( - projections: ProjectionData, - group_dos_by="atom", - spin_type="none", - line_style="solid", -): - """Collect the data from ProjectionData and parse it as dos list which can be - understand by bandsplot widget. `group_dos_by` is for which tag to be grouped, by atom or by orbital name. - The spin_type is used to invert all the y values of pdos to be shown as spin down pdos and to set label. - """ - _pdos = {} - - for orbital, pdos, energy in projections.get_pdos(): - orbital_data = orbital.get_orbital_dict() - kind_name = orbital_data["kind_name"] - atom_position = [round(i, 2) for i in orbital_data["position"]] - orbital_name = orbital.get_name_from_quantum_numbers( - orbital_data["angular_momentum"], orbital_data["magnetic_number"] - ).lower() - - if group_dos_by == "atom": - dos_group_name = atom_position - elif group_dos_by == "angular": - # by orbital label - dos_group_name = orbital_name[0] - elif group_dos_by == "angular_and_magnetic": - # by orbital label - dos_group_name = orbital_name - else: - raise Exception(f"Unknow dos type: {group_dos_by}!") - - key = f"{kind_name}-{dos_group_name}" - if key in _pdos: - _pdos[key][1] += pdos - else: - _pdos[key] = [energy, pdos] - - dos = [] - for label, (energy, pdos) in _pdos.items(): - if spin_type == "down": - # invert y-axis - pdos = -pdos - label = f"{label} (↓)" - - if spin_type == "up": - label = f"{label} (↑)" - - orbital_pdos = { - "label": label, - "x": energy.tolist(), - "y": pdos.tolist(), - "borderColor": cmap(label), - "lineStyle": line_style, - } - dos.append(orbital_pdos) - - return dos - - -def export_pdos_data(outputs, group_dos_by="atom"): - import json - - if "output_dos" in outputs.dos: - _, energy_dos, _ = outputs.dos.output_dos.get_x() - tdos_values = {f"{n}": v for n, v, _ in outputs.dos.output_dos.get_y()} - - dos = [] - - if "projections" in outputs.projwfc: - # The total dos parsed - tdos = { - "label": "Total DOS", - "x": energy_dos.tolist(), - "y": tdos_values.get("dos").tolist(), - "borderColor": "#8A8A8A", # dark gray - "backgroundColor": "#999999", # light gray - "backgroundAlpha": "40%", - "lineStyle": "solid", - } - dos.append(tdos) - - dos += _projections_curated( - outputs.projwfc.projections, - group_dos_by=group_dos_by, - spin_type="none", - ) - - else: - # The total dos parsed - tdos_up = { - "label": "Total DOS (↑)", - "x": energy_dos.tolist(), - "y": tdos_values.get("dos_spin_up").tolist(), - "borderColor": "#8A8A8A", # dark gray - "backgroundColor": "#999999", # light gray - "backgroundAlpha": "40%", - "lineStyle": "solid", - } - tdos_down = { - "label": "Total DOS (↓)", - "x": energy_dos.tolist(), - "y": (-tdos_values.get("dos_spin_down")).tolist(), # minus - "borderColor": "#8A8A8A", # dark gray - "backgroundColor": "#999999", # light gray - "backgroundAlpha": "40%", - "lineStyle": "dash", - } - dos += [tdos_up, tdos_down] - - # spin-up (↑) - dos += _projections_curated( - outputs.projwfc.projections_up, - group_dos_by=group_dos_by, - spin_type="up", - ) - - # spin-dn (↓) - dos += _projections_curated( - outputs.projwfc.projections_down, - group_dos_by=group_dos_by, - spin_type="down", - line_style="dash", - ) - - data_dict = { - "fermi_energy": outputs.nscf.output_parameters["fermi_energy"], - "dos": dos, - } - - return json.loads(json.dumps(data_dict)) - - else: - return None - - class Result(ResultPanel): title = "PDOS" workchain_labels = ["pdos"] @@ -165,52 +15,13 @@ def __init__(self, node=None, **kwargs): def _update_view(self): """Update the view of the widget.""" - from widget_bandsplot import BandsPlotWidget - group_dos_by = ipw.ToggleButtons( - options=[ - ("Atom", "atom"), - ("Orbital", "angular"), - ], - value="atom", - ) - settings = ipw.VBox( - children=[ - ipw.HBox( - children=[ - ipw.Label( - "DOS grouped by:", - layout=ipw.Layout( - justify_content="flex-start", width="120px" - ), - ), - group_dos_by, - ] - ), - ], - layout={"margin": "0 0 30px 30px"}, - ) - # - dos_data = export_pdos_data(self.outputs.pdos, group_dos_by=group_dos_by.value) - _bands_plot_view = BandsPlotWidget( - dos=dos_data, - ) + try: + pdos_node = self.node.outputs.pdos + except AttributeError: + pdos_node = None - def response(change): - dos_data = export_pdos_data( - self.outputs.pdos, group_dos_by=group_dos_by.value - ) - _bands_plot_view = BandsPlotWidget( - dos=dos_data, - ) - self.children = [ - settings, - _bands_plot_view, - ] + _pdos_plot_view = BandPdosWidget(pdos=pdos_node) - group_dos_by.observe(response, names="value") # update the electronic structure tab - self.children = [ - settings, - _bands_plot_view, - ] + self.children = [_pdos_plot_view] diff --git a/tests/test_plugins_bands.py b/tests/test_plugins_bands.py index a819f1ea8..a586ca285 100644 --- a/tests/test_plugins_bands.py +++ b/tests/test_plugins_bands.py @@ -3,17 +3,35 @@ @pytest.mark.usefixtures("sssp") def test_result(generate_qeapp_workchain): - from widget_bandsplot import BandsPlotWidget - - from aiidalab_qe.plugins.bands.result import Result, export_bands_data + from aiidalab_qe.common.bandpdoswidget import BandPdosWidget + import plotly.graph_objects as go + from aiidalab_qe.plugins.bands.result import Result wkchain = generate_qeapp_workchain() - data = export_bands_data(wkchain.node.outputs.bands) - assert data is not None # generate structure for scf calculation result = Result(wkchain.node) result._update_view() - assert isinstance(result.children[0], BandsPlotWidget) + assert isinstance(result.children[0], BandPdosWidget) + assert isinstance(result.children[0].bandsplot_widget, go.FigureWidget) + + # Check if data is correct + assert result.children[0].bands_data is not None + assert result.children[0].bands_data["pathlabels"] is not None + assert result.children[0].dos_data is None + + # Check Bands axis + assert result.children[0].bandsplot_widget.layout.xaxis.title.text == "k-points" + assert ( + result.children[0].bandsplot_widget.layout.yaxis.title.text + == "Electronic Bands (eV)" + ) + assert isinstance( + result.children[0].bandsplot_widget.layout.xaxis.rangeslider, + go.layout.xaxis.Rangeslider, + ) + assert result.children[0].bands_data["pathlabels"][0] == list( + result.children[0].bandsplot_widget.layout.xaxis.ticktext + ) @pytest.mark.usefixtures("sssp") diff --git a/tests/test_plugins_electronic_structure.py b/tests/test_plugins_electronic_structure.py index c9c107f43..8e209cede 100644 --- a/tests/test_plugins_electronic_structure.py +++ b/tests/test_plugins_electronic_structure.py @@ -3,6 +3,9 @@ def test_electronic_structure(generate_qeapp_workchain): from aiida import engine from aiidalab_qe.app.result.workchain_viewer import WorkChainViewer + from aiidalab_qe.common.bandpdoswidget import BandPdosWidget + import plotly.graph_objects as go + from aiidalab_qe.plugins.electronic_structure.result import Result wkchain = generate_qeapp_workchain() wkchain.node.set_exit_status(0) @@ -16,5 +19,34 @@ def test_electronic_structure(generate_qeapp_workchain): for tab in wcv.result_tabs.children if getattr(tab, "identifier", "") == "electronic_structure" ][0] - # It should have two children: settings and the _bands_plot_view - assert len(tab.children) == 2 + # It should have one children: the _bands_plot_view + assert len(tab.children) == 1 + + result = Result(node=wkchain.node) + result._update_view() + + assert isinstance(result.children[0], BandPdosWidget) + assert isinstance(result.children[0].bandsplot_widget, go.FigureWidget) + + # Check if data is correct + assert result.children[0].bands_data is not None + assert result.children[0].bands_data["pathlabels"] is not None + assert result.children[0].dos_data is not None + + # Check Bands axis + assert result.children[0].bandsplot_widget.layout.xaxis.title.text == "k-points" + assert ( + result.children[0].bandsplot_widget.layout.xaxis2.title.text + == "Density of states" + ) + assert ( + result.children[0].bandsplot_widget.layout.yaxis.title.text + == "Electronic Bands (eV)" + ) + assert isinstance( + result.children[0].bandsplot_widget.layout.xaxis.rangeslider, + go.layout.xaxis.Rangeslider, + ) + assert result.children[0].bands_data["pathlabels"][0] == list( + result.children[0].bandsplot_widget.layout.xaxis.ticktext + ) diff --git a/tests/test_plugins_pdos.py b/tests/test_plugins_pdos.py index b625143a9..354c67e7f 100644 --- a/tests/test_plugins_pdos.py +++ b/tests/test_plugins_pdos.py @@ -3,38 +3,26 @@ @pytest.mark.usefixtures("sssp") def test_result(generate_qeapp_workchain): - from aiidalab_qe.plugins.pdos.result import Result, export_pdos_data + from aiidalab_qe.common.bandpdoswidget import BandPdosWidget + import plotly.graph_objects as go + from aiidalab_qe.plugins.pdos.result import Result wkchain = generate_qeapp_workchain() - data = export_pdos_data(wkchain.node.outputs.pdos) - assert data is not None # generate structure for scf calculation result = Result(node=wkchain.node) result._update_view() - assert len(result.children) == 2 + assert isinstance(result.children[0], BandPdosWidget) + assert isinstance(result.children[0].bandsplot_widget, go.FigureWidget) + # Check if data is correct + assert result.children[0].bands_data is None + assert result.children[0].dos_data is not None -@pytest.mark.usefixtures("sssp") -def test_result_spin(generate_qeapp_workchain): - from aiidalab_qe.plugins.pdos.result import Result, export_pdos_data - - wkchain = generate_qeapp_workchain(spin_type="collinear") - data = export_pdos_data(wkchain.node.outputs.pdos) - assert data is not None - # generate structure for scf calculation - result = Result(node=wkchain.node) - result._update_view() - assert len(result.children) == 2 - + # Check PDOS settings is not None -@pytest.mark.usefixtures("sssp") -def test_result_group_by(generate_qeapp_workchain): - from aiidalab_qe.plugins.pdos.result import Result, export_pdos_data - - wkchain = generate_qeapp_workchain() - data = export_pdos_data(wkchain.node.outputs.pdos) - assert data is not None - # generate structure for scf calculation - result = Result(node=wkchain.node) - result._update_view() - result.children[0].children[0].children[1].value = "angular" + # Check Bands axis + assert ( + result.children[0].bandsplot_widget.layout.xaxis.title.text + == "Density of states (eV)" + ) + assert result.children[0].bandsplot_widget.layout.yaxis.title.text is None From 98ebc43e66fbd0a49e47c89e2d24e20ebc084cc0 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Mon, 5 Feb 2024 13:55:08 +0000 Subject: [PATCH 030/166] Bump version v24.04.0a1 -> v24.04.0a2 --- docs/source/conf.py | 2 +- setup.cfg | 4 ++-- src/aiidalab_qe/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 90fffb3ee..3829a3dd1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- -version = "v24.04.0a1" +version = "v24.04.0a2" release = f"{version}-dev" project = "Quantum ESPRESSO App" copyright_first_year = "2023" diff --git a/setup.cfg b/setup.cfg index 5f4aea118..d344ce906 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = aiidalab_qe -version = 24.4.0a1 +version = 24.4.0a2 description = Package for the AiiDAlab QE app long_description = file: README.md long_description_content_type = text/markdown @@ -65,7 +65,7 @@ categories = quantum [bumpver] -current_version = "v24.04.0a1" +current_version = "v24.04.0a2" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = True diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index ca2e5be6d..6ac2e2b8c 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -3,4 +3,4 @@ """This module contains project version information for both the app and the workflow.""" -__version__ = "v24.04.0a1" +__version__ = "v24.04.0a2" From 983845a46ff9afc0bd9a10e2f2da96518d160445 Mon Sep 17 00:00:00 2001 From: Peter Gillespie <55498719+PNOGillespie@users.noreply.github.com> Date: Mon, 12 Feb 2024 15:05:29 +0100 Subject: [PATCH 031/166] Add Feature: Documentation Page for XAS Plugin (#614) This PR adds a complete documentation set for using the XAS plugin of AiiDALab-QE, covering both calculation setup and post-processing of the final spectra using the Plotly-derived widget provided with the plugin. The instructions should adequately cover all features of the XAS App using a self-contained, robust, and well-tested example. --- ..._Bunau-PRB-205105-2013-gamma_func_plot.png | Bin 0 -> 1715773 bytes ...2CO3_Example-C_K-edge-XCH_Only-Cropped.png | Bin 0 -> 741141 bytes ...2CO3_Example-O_K-edge-FCH_Only-Cropped.png | Bin 0 -> 759890 bytes ...-Set_Adv_Options-Alt-Annotated-Cropped.png | Bin 0 -> 2713761 bytes ..._Result_Panel-Carbon-Annotated-Cropped.png | Bin 0 -> 2250975 bytes .../images/XAS_Plugin_Result_Panel-Oxygen.png | Bin 0 -> 1868873 bytes ...Plugin_Setting_Panel-Annotated-Cropped.png | Bin 0 -> 2032152 bytes .../XAS_Plugin_Structure_Panel-Li2CO3.png | Bin 0 -> 2264985 bytes docs/source/howto/index.rst | 1 + docs/source/howto/xas.rst | 184 ++++++++++++++++++ .../app/structure/examples/Li2CO3.cif | 43 ++++ 11 files changed, 228 insertions(+) create mode 100644 docs/source/_static/images/Calandra_Bunau-PRB-205105-2013-gamma_func_plot.png create mode 100644 docs/source/_static/images/Li2CO3_Example-C_K-edge-XCH_Only-Cropped.png create mode 100644 docs/source/_static/images/Li2CO3_Example-O_K-edge-FCH_Only-Cropped.png create mode 100644 docs/source/_static/images/XAS_Plugin-Set_Adv_Options-Alt-Annotated-Cropped.png create mode 100644 docs/source/_static/images/XAS_Plugin_Result_Panel-Carbon-Annotated-Cropped.png create mode 100644 docs/source/_static/images/XAS_Plugin_Result_Panel-Oxygen.png create mode 100644 docs/source/_static/images/XAS_Plugin_Setting_Panel-Annotated-Cropped.png create mode 100644 docs/source/_static/images/XAS_Plugin_Structure_Panel-Li2CO3.png create mode 100644 docs/source/howto/xas.rst create mode 100644 src/aiidalab_qe/app/structure/examples/Li2CO3.cif diff --git a/docs/source/_static/images/Calandra_Bunau-PRB-205105-2013-gamma_func_plot.png b/docs/source/_static/images/Calandra_Bunau-PRB-205105-2013-gamma_func_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..f920cc01042878364f3a74e56bf3f709b5211dc2 GIT binary patch literal 1715773 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/Li2CO3_Example-C_K-edge-XCH_Only-Cropped.png b/docs/source/_static/images/Li2CO3_Example-C_K-edge-XCH_Only-Cropped.png new file mode 100644 index 0000000000000000000000000000000000000000..92054cd7a56c626ba9414813f217e80fd2d5c1b6 GIT binary patch literal 741141 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 S(|1sv-Mb#sWz1p4*Zn`9ePEIR literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/Li2CO3_Example-O_K-edge-FCH_Only-Cropped.png b/docs/source/_static/images/Li2CO3_Example-O_K-edge-FCH_Only-Cropped.png new file mode 100644 index 0000000000000000000000000000000000000000..b62ff68eb46a6f35254037d80ae6efd77d45f8c9 GIT binary patch literal 759890 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%0AJkrhdT1APELqC6;%7wL^R-iUqAXGUcZ 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

Oz-~EAOjM%6T%y{iWyD)O}m&22 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%0AkU+B`pyDS$K8EuD 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/XAS_Plugin_Result_Panel-Oxygen.png b/docs/source/_static/images/XAS_Plugin_Result_Panel-Oxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..4b6a238dfd94566a2028c09696e02ab933b86334 GIT binary patch literal 1868873 zcmeF)2i*5l`3LalF|x9iSvFmKj(YC=UnGHpR+#aI@kC6{n7gCetz;vXPR`xh!K;o zxyGs+ju;m%(okO(9Ki9jNd2qXfDKq8O`G(#X6b2DTzJ`qR+5`jb@5l93Qfqq2b zdsB?};D^2d{a9=k)m;RVJ$DzeOrHoO0*OE(kO(9Ki9jMSybwsnJiOXFYnuop0*OE( zkO(9Ki9jOIT?CRbcNeitp9mxZi9jNd2n>1z)_!9BrP3E*&^KdNU|_~W}wlL-=m zM4-C}9Qek@-OZBe2M~dWclqc5mOjXf{^2rDzns1RgS-(_{X`%U_%8xovuA17Uw{4o z=EzV7BXI7y=VoJdaQpm^Y6qVBKbLut2qXfDKq8O`Bmy0aKwFHtW3^Ak5`n>sz;`A- zW4rCP8@&1tE6v|OcFV>ZR&Ab@O#~8wMBslANT25afg>*xfka?%Bk=lh-#9IO0S0#) zruKqG?ZyK3p1(ifl;TPAf%1QLNnAQ4Ce`Wk^`&wY(>%1;Cm zfkYq?NCXmrL?96u+z2FN9^CDh+9v{uKq8O`Bm#**B9I95H3Gfx>bawjK6-%#7Fce% z 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 NS6(}CVgEZO|3Al&$ff`Q literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/XAS_Plugin_Setting_Panel-Annotated-Cropped.png b/docs/source/_static/images/XAS_Plugin_Setting_Panel-Annotated-Cropped.png new file mode 100644 index 0000000000000000000000000000000000000000..c46fbb27f3157c1f6b3d6ec4c8c82b1d1b68555d GIT binary patch literal 2032152 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/XAS_Plugin_Structure_Panel-Li2CO3.png b/docs/source/_static/images/XAS_Plugin_Structure_Panel-Li2CO3.png new file mode 100644 index 0000000000000000000000000000000000000000..c2eeaa88928cb913e5499f0d384df9f33cc7826c GIT binary patch literal 2264985 zcmeF41)LRC8;4oCyQM<}K?FoZR9Z?FMX(hS1F-W`46wTc14YF`Q9)Eh5JeP_P-z4~ zy1Se2!B>vs+_`sq_wL^R{e9nh=FG|G%$fP0_q;Paes+AjLix+*&z3D)p$_fabj_A6 z$Es}EvTx6uotP3gJh6fQn_a)m0Hl zG6Bi=BqLJ>5fA|p5CIVo0TB=Z5lBx0lI-b8TXl(m2#A0Ph=2%)fCz{{k_pJKJ;}(F zK?FoV1X4&~<%oN0$rm7n5S3j7L_h>$m4Mz!jn$D?zePXYKm$m4GCBtd4v-_4~_dWiOL2Ksv!zH6kDaA|L`HAObN!Ku$6- zFv#kn2#A0Ph=2%)fCz{{W+sp`GdEss7lAB7VDR94(n??(%fbNf*e`mYFxfCz|y2xJig^>?+xIigCo4sBX?%OYJ;H$*@L z90AF9he81n5CIVo0TB=Z5fA|ph(-dE?9n(XYLf_vfCz|y2#A0Ph=2$<0+Q?wg#scV z0-2D&n|-%_AYXt?IB;sR2#A0Ph(K})NWLeRobri)2#A0Ph=2%)fCz{{x)9LEAJYZ1 zDiHw@5CIVo0TB>^C?*h>Ev`hq;stXRTEBb!&iy;1xTRs6R<2-Nqp~>)=8jvo?a^n!X?Ps z@%P_CfZk>0+B?Vq+oA;6CdEV=s@8`=3oLejBDdls#AD_?Lp8UDu z7WXOW{x|RHf}eHG*RX63ZyH~?X7TK!&dY!Isd;?yi99TsFK*#ALH~wQBJ&?jmau&9 z)vMQSx80T_M~<#tyB;`j;K?VS?9rpg(d?=A-|pSJBR5h1sa9fY6f|ef99nhhrI)5g zVQEsvv(G-eY15{M9(pKEN>6d2FTeaU0N;G`&BT|Kj4X*STq#9B1VlgtL?AN~Sh8eE zxMoK<6)uY}{^mwETzg{gvIWXmJf`;srB8g~^v6yv+t`=V4tv$@nJ?#mbZ}s@bc@WL zBirj8@}6^S&W*bd51zUInJN25FFsH_Z`_lu@($^ouWHc%t$XfgyBiJO$^Y69-L-t% z;eqY)<_JjjPY=2tn{(QlgAY&Kn{GV{tSEc~|4xo^9XsxE#~t^}FTV^KGUU%c|0Mjy z7hmk$nJITq0uf~1NLCaZHf&%u)v{$v8P_xKI40QgE3drryz|cU4)N=+zkc6+_a&Gy zO%q&m%{Al3jq_FU?YG}{?AUSq`0;}V4SL~)7kp=RC;}oN0wRzM0$a9hVIw{8AJV@3 z^2<5(`|rOeqgcz*v1P;|0U67=88f?aMjLog>#RjczKDw}h``TxizpTzhft z3y8n_#a_dY`U3cpWz^yIjdC|BpX28h2U~x*>%pJ*zBGMbpV50Bn{-5NhZE&n_a5H7 z=g9w-Zawt$lzpZ0$5kv8Rvs748@F=%VQ=p+qUQ>m+?y~}!y^X7_fMeKty{MqK74rT z(xo4L^wIY1+jHj3`P*;5A?)+#&rdwwG{+u$Y>^^G+O};wfBt-5sq7A?qC zrAn2DAAXo*IDiZrHjM0e<^1u-AKr4-tXXr>MHiJRQ>Jw3(pDpe|4 zv}mhVt)@(wVp+)ErcIk$Zn*{LkrPim5l<6#2#OUeR;yO6AAb0OG^|9bR;_yHop-W@ zK;ARXIAiYIxx^zmunymR^UYRHSy%a-~Ij|DJTxNyuzS?%%&ZU%q_Vvu9^A!jMSHA?3Vz z^E!3vM4QW(FMsjH7gH~h&p-b>ZNLWIrAwE7{rY(eWEX@}c<5Yk!37Kr(vB*2?AYN= z6If<~Epa7KCi^S3Yu7GVuwecA^&w!V@Q0%6FTebfqQ3g-E0>D_4$-hcZWu7{RF-GiFdAx1hW3x{I;%W$~8( z-FM$nDS5dPF1ze9Uw=tSnWvwAI{Oe6D^}!!dHnImE&IZS3p;e^zyQ^(S@Y3HA3b#F zkO8C@B%o3nz_OIE@nIXoGTPrjl0&4pll-DO}li zsz9y+SnxmS`0l&y2VZ>Lg%o~8-OE`BShDvzymR|Ww^*12P0F6^%bvVL^z(&va_!oG z`1)`6?AZ5@x~^0>`%R5=TY(1?a(6#;I2+k8*^|CTvFv!(%)YX~*bDP_s($2c&^`@w z$Jfl&w_&b3PRWg2pLl73-VJh3?opsh(d>ou#68t2@ARGpe(6zw>azd+&$`wumi@yn z`Q}_z@TW@)oL@Va>lCF?=FDCN9%`QF?}YA5Vgm_C_6ij$Ag_1t-i>ZX`_`*h54pph z48wrok1!VsvJ4%M<=1D64@|Ir{d)90LJb**uDa)*dq{Tct+$e$CV%qDClu&yd$(@g zSS_4&)>+7FF4n$%`*IekN-ox!T&(Ez)~#EcRz|-f?0)?5M>IE8oOar2G>pFs7A!zr zk#WzSJv9EQr=Fszl=;(7KecPu4k_ua(S-{aE{y)*kTefI_#ifJvXGHplZDAMefo4R zTmpzclppEec;gM1-38jWZ;wozJbCiWnKNksS*HH|Ba&0dclthN%oyydp#I>452%Gx zmfh+_9lFx+I$@=B)m2yZ@85sctXb@Wu#TckmOw5|xH2QR#APSl{OMgt2BfU{J? zSI88$rJ;5%0M-~T3lcv*J|092<*BEh%IF}$=@*BjA&k~XL%;g!t0$ar!nN04yKLDq z1`!%o0y38@tgL)lT=`(9gunj!t9S3-j5|9(KyYU*K$#OKPGph8$^k*o!i@D8Rh)U| znZTzb)vH%$@$=ks&%uE#tmtek2(y+WB?Hu?NfRWvD>)oV-u~c1qApgLO`A4lRbcL8 zffos-v0z)VV#TgqyIjdh4Y29}(Ykf(lA19s(zB{Tkq4H{T9lP%;3-9lfCz|y2qc>T z4=*fJUe#`Tok)z5X!_)pTsD81()mk~ci4i@UYq&GyiG^UuU{DPaa>Qnz3d}_R>ZfJ0A&bXY{j=SN$iT5`<=G3#RcbUHS*ZQUEk>;3!$K=Y9 zv+m!e5iXRw;EWA3y?K)zMlfADYES&I-COqlqt_{F)s90Kf3XL582)$Z$lalZ7tEav ze|Y{^zF^#qjdOp!=)m@Uhx6vl_U>8vzFT^r*^pfiPu%x-%RKc<=NS0wzAqN;f92Qx zPfXrNIVJPQA?usIyK~{DLyxt{!-4@{n;u{8?pQr%ulh#>I*NS$#zSYkxAT#SdmnC| zr&!)2h_Lv#sGPI&C%Y~kxd$EJs9Ypp`q0)|OahV}WyaPwG7&+Ee4jmgHZlccBpL+) zfmpoz?z^#A^TQne*=L`5s|iei85J3X97J+q+C-6a$m-DaA8O2At+aBm+@q_I_%r}B zJaR2pu3VTKX%fbDL?l-*#$far8qTs{0!N5r046|U4#}tT= zLN2>g-T=L0CJh=u~@pva8k*z4CCx+@%PC13dp%uB9 zaAihriOWua@>v70`G9seYr3~aRtqdTXokyzP}{h1BNCsBge=hDl0f^~Vgs#=X`Hna z_Zs@hP68v2M0T4Jj1<=omzFP!E1xyei!Z(iVb%cfCmt;BtP4;MU|HjFBO?;Y&fuc0 zSx%gL?zvp6TwTL8}^S_-^K zNQ~{D3x@YZyoDzz%vyq_2<7;4vASb+&_N8_EJ)}MODqy|VUvB)CE6XNg>x4+u%G`q;>*Qfo4?GY)sqQNSv{3gMe_WUz{mfC`5)mJ->Omz7hf<} z!BfgLd1c0{oA+#4vTeyne++F{`ouXK=jP9q|Coa1k1tW@#}yNDX3tT+V7YoFkDt9^ z&YlDRnDAT)$qQgm|9$Pj#asSkS3htl+l+Mwe_MOxe@nLh=akhl{M`IAdKKV**u`5{ z$#MULBbMCe6?3lNefX^z`|+dse(8bX3lB7_ki*xioY}MCgR_3u;UanB+E&eZ&yPpK z==B$;?K{2V5et33oN+7z_^~8t@YYU>vJ#&9W$*3-M_M&&-9gjz7N7XPf0r6QIW|IU z= zIco~?`|rOejO4QPIKvQd>Kt)w3xGU%^6)JjTZ5w2kTsT`zlbdhvw=VWA>v|On$Un% zapR3Qx>NMmB3-WuV1{=IEP%{K3L}76MUVjB7}M@p=rPug9Xpm}-tK(-@yD(^EM2^% zu~c9|#UcvDAHlB4&O>0CyZ{`bC9WdI2=RwDWeG$it}?)MO(MqEDq`4;L0RJRboJF& za|qZ_9Yz{FpOLUE)#wGu+>ccX%G(`=1{giyR0-$KKb8` zMOI2IQCP=vIk9lU`<*cSnWQYG*l}VOaM|Ed#+Atez%_%xjgSnb&Ki{(S(;KK>+PXK zhq62)9;Bm2jdJ@fT+E1aD#cTXL1$xxL&&iCV0E$0!qyO8Qd~uNc9G`x+iz#l&g`aD zEE2fMSeO;m0}njlTBv{sh=2%)fR})&cAl7+QHbY(K79CaBE4yn8eYG9gJrq9$(`Hx zZAYnNXuq`f#gz+Js#>Hfr`GTKCxNfz-3N9Lnl<>E6Rw=RdWxMYQ=l{k_?KF};8L#H zwdTN~12fmps#mgJ?Gm-7uly|uz+S*@TvJ?iY70o`decl{@%ZfiYAL{+h zzbk>drLsTUChw?42Y6f6S4*1@cbUpZUfzB4tLOpWh|s6O@E+8oQ@=gIwb;&c9^q;Sc8QA3EvFfGNinUu(AL>^MW z<+57bp*Jy+*h;aln-`6H4FkspPWfDGTnT{z41N}Gc0uwYqlv-j%U?QzQQw=dqS3L266S~SfxL2;u8#5MQHsaV|Ms39YG-G&Yc@+&IqC=Sx_-3 zII*DWOO`C@+cODAGF-iZ7fHCpNsVXMf)@txHS#*BeE#|8c&SyZR*lAURe+anvNA-b zQ$Ew={PWMZ>1GaN-by1R!)(KVqQ6-QaP>loRXTZDrL!P$dYxLZva<|hUFR*?8)ip> z7gtc{EYWd!XDHF`tWn9!YMB=yD4gX4svTpzt-!t66&3*z5CIWz1WdJKYe$B0qfYrf zbJLzp3pOvL{5mCSHz{{=>HMWV;Ums7SlnIhzQBZ)KjAHdzPEUc>jw`XylPDEo};hi zf7gw>;pu75amxH;u(HqHICs{D+35A-OCZ_(_Dx^mi9alz|A@{;xK}Qm{qqF}Tt>Xi z?`oQ-deQ82Hbm0Mdk$n9Hva(Po{ZSbv4WpEWT*Y_>`!;S@w;EL|E*|_R6=5ec=PxF zN!)JeuA9HxL!~&oV|vHF{^+E=*PoQTQ;olc+&^;NwJte<1SC68RxSv17$!6f?dWwB z1JVJxdC4W0n7=#bRm^@^vP~JdRs<$M1Yq{VCWpLW-yFYod%M((tQg%*CR!n^5U}+k z1W|kJ)FVxJw4+X_9qEk45f^j3CV1*om#a6y03JTP`iZ8*o{bj=iUc1RbSmnHT9Cz< z60Hzx6{`a3#lZmEFm^|F{BdQ$mXFOCwZSF;W==BVhJj!TtQ~Jb6Daq0fYb(vO6&HuTayay6ac9X(7?Fn+*UNiwM;iI zbyim1>& z45dge^fyL33gp8qt`PJA8$h_|;A)IB35GqyA7|0HxP4=^=8JPEUDP4=JeMoM0Ciz) zrA)l8vH#J>vSrJ@^wLXsaZnU%0~C*$(s9nlV2N7=-*rLjP%jb$^DPR4Wem1PT8KfB zEZCB1Iej4`8xg)Xm{>%3p-%Xjf!`vj6rT8OpvY|*KvAIm<1a@%E#Q! z1z=7}J_mQsMj+|h<_!d1BqT`rYpGTXR}N0$g9i_`&kYfYp`9&=umAq>(g==Z;N=Bh z?!PQY=@-mV$(&-T$;IPsZG>d3dAu``Ffruyc{ecyxKvni;a=%2*@dZ*_PEwk4vBf* z*vbLP&f1Ax4)i*6iuvd=Dj)(PAOa!~jsSO2Zl2-JCN+M>`k61!7mt;pOes%QQpHBec|Gtoc46lJVoC)bKv8rKQe2>tWOqv%Bi)x z)}rQda3{QM+w#2!_f1=qY92C_iFps9{PDc~1o#x>?^hJyJ20s27L{_$+jzuhhO?1> z%eNomA6IQxH3u)Y_WF9yg>`aHy}SVLq(1QT-l?kt?2N9o8^`S7+cG~~od4r<@=aQK zkQZ1vb=!A)+E&RqrAL9c&&r2~%-Dn$46d{U195I?m0;2=kbtcN9KzVC4}HBa3-nH1 z$h-tl;l59LdHcd=msq&k`?$p8h0juxWem1o`!MiTP`3SPHVqKra50 z2Ca`(-dk*hWV~XFYaAKbbs;ayRMucD-dNSJRJKC!*kM6S0@OBcFzjEkAZKZ3e(fwC z*pWliGuK$y;|_;dXXk-+9p3Gfz$a5#$>1Z$f|*4x>k3LBj9q}u0j%$&!Jmz#9ou5` zi#G?@9J8wRR|G^r1VkVL0pByF^YBPUH!FuPImTD-j4MmQ+y&O{T0e2sq^}l_+I3)8 zgj&-26#x3FtD@S#|9s)v#S_3fenRQ&6IUF>ABJzaG%lY5llhA6hj#@N(yj%2=aklF}qc2wAy@}1(4{W{`l zC;st#&&R$EN<4cVY`NH50hGYL7TTS7UbMxp#^gKuB>15r-&rBBnIrigidQirAOa$g zDg^LWf8n>6Ql+SLE`;y3qur@=(UwE~#vl10OjiBL;+|DUR{hFM1bo(!%+z$XRRlyp z1VkXp2>6~UiLtmxSr3jhCy^HSC~SGkn9x|IfQ>S*L62i3o^*2#A0Ph=2%)fCyw20+Q@mWhB)P5fA|p z5CIVo0TB>^EJ{F6 zo-Az2BmyEJ0wN#+A|L`HAOh({ASS;CnO<;Jj|e250B`>%KCx1YfCz|y2#A0P#1w(p z`T}H34Xrwxfdp=Qxi0?}w0r?Fa0pbj2#A0Ph=2%WRRVI7$*Lo(eu;nxh=2%)fCz|y z2xJiglI&SzAk_^K5CIVo0TB=Z5fFi_N+5-jy?B>;MdS;RRWAY zAle8d@LKAwUAv;K#cGcTh(LxA$e%yIt5!c4el} z;_k{(KmGoIv+mpL{^R02w|EYCzf&7%?EezchT>GFIs#AOa#F0wN#+ zA|L`HkU|2I>?s7O>>?lnA|L`HAOa#F0wR#M1SHwhmaj?|0TB>^G$62LbJ5cB1xN$1 zDpCYQKm;-Y0m=7FFi2{m2#A0Ph=2%)fCz{{EEAAqkLA%<-$g(KL_h>YKmz68{H5fA|p5CIVo0WSf`cQ1{o3-g)mO`A6PnzeubeqW3Z zML+~%mcZe|hj;AQv1iYom?fZ&i$GKnIB?*Aw><|B9$deEy)V+6Kw%L`B!L9}&80+^ zqGV}A;OnoyUbbvm@7}%L*Y}q!Su$_lybc{YxEgow-aT;OKzCTMV8P>#JMOg8PRpKM z>oG?~0TIYj1g1})UZqNveEITCoH%j*{Q3L#?W23eiWO_vu;B?OoDdfm=j-kG@#D$j zA`28KaO|(HS?1X!=zA=-V!h!NGQ zRSRwOMHgLEq(~8LZ)?`9`Rc2$3KuSX;)y4QCQD4rbI(23wr$(vk3T*!iIbh?wbx$j z)~#EK5+#ydf-;Ig%o13%Xwj4@QxM-fckaxUD_7aFWzDMh-FM${m+0KNbEqz_QKJU) z8e;A)f!t5_UBZ!{IdkUHrAw*N#V8;GF-~Cf=FOjc@=5pZ-A%#UbKL&=$gr;Ffu1{e zZeM&N4--H8PzA>vb4<$TdmPOXD^#eEU@|2T0TIYR0&KOR*Ae2^TyqU8_De6l^pZ<1DPFudYJSqB zNudqPks}AU2zQqtYC0WSer*}XKP zHyl~7``XPGIWnEdv17+_Q(Ga34&#P^rkJ*tPu8kZOW&s60J%dGtCufOnw zuT-g$<^Aoq-`E~UD*yib?+X?z;5mEw<(Ff-A2n(e58|3NYjQWRlz;s3N1Zx#xRcl+ zuf=}$*=IP-UUk(~%=D2XM{eD^)lP-}WwB7QWXUV9yb`g^qaTByH%;hSd}MI7Wh0Sx zhBnOda%(#2q?0bY?6T8OKOO%dy?WeT}`+!#ewyv*)VH5|c>`T6Icc~SEV2 ze*OA($V9DNxiVpl@0iZbnVjYQph1JUNAS$%otc&`TT(t+pZR~Zylkw@vErElo!8h{ z2JqxQ`Q(#b0&jp@3_oH>dF{2=`s{s?&jvP(qImU=I}`zAJuRU*#nBD8%ClxBd*8l&*$-pA&9k39 zJXQ{_Km|lV1VRa*+A*Ak#=97{uLchuJa_I~_d*#)I;L2oMvX|rG{^N7!#cB--LD}- zhH#cAwM}zZh&K>AdA(-?=Q|1X!1Yp!+OQ;h)DF$R4dY!ejN;q2ZTmMWBoyu)boWL( zHgXp0?kzQ3T6n0Vh7s$m;3*tgjET+_jE&8Eh_eha?yLozVSvxuuttCL%{NKLYQg6z z6Zvdl!zkZ-OClUvyRR`i6oKRs7*y&YPTp0rb!gMFTk=YX+FTnpY@ltto$hNPYxPc@ zIuXefW*`3j_uuD%jWb%{WJH}~x5K-QEjUyKN`l)38Q*#59apUPUg07Y5CIYJ5@1(~ zA8s$+NN*Tx7hjzr0k$@aXG$`QUw{2|mkb3@7&kY*Lo;X29Pig?TpAY$oxJR>yR(7w zowIuQIz-VNkbIBk(fOxsJbm#e!7V(pf)DJ8b9!L~kGG8Zv?JM>x8~-GjT}Q7Rso+q z8{O~SXD7Yczp2H&7LTOHz|Vu6o%c3>|5mJ6@y$2ia1V0#l*nf(EnLIc3Uocf*`8P7 z-Jt>^AOa9zx|J(e&ig#(byM8lnA*gLL&QA+J33;0?b@~c4V-`|h6W89;Dkc}=XPA? zunV&I=S3K+jwx@SpbS@w;zd9N5bL~3hBZAh3YOCt!hibdCrieZWd7oxW{14VVv~+% zA|ICItron~nVaFt^@*&Ks>b!*H)5h8JdBQ4!ACBR^cjs1e^;(%^@OQIPhyG8GU35nzI_jK}|V-MV$q zU`pb(!aJgb*+cj0_&`?dx!EpO-~^mJc{00v_~Vj{qIi#;HGKK<<#|~hZy8qj7~r`% zSjqZV-~tINGR6s*UQci)8YLWHn7=nI&>&=7(W?a zRJAg(Wb@$XM&ol#=V{HWX1ryN(5D$V?eMv0vhbD+F(`Ok=bcYHACM#^@5=D7$6LlH zwFA$x7(jVYEcc_phOsTk{fiqGPB>?ueYWinB#(n~i9psPfX^$NU_9MOc_61H}+Czbu*aGJ}mFj_;DX!0dJ{uUWtypKnol<-{5a8cQ;C&SQ*O|js9VT;o ztt1_4&%i2J0H77zk{|zCKYr8~AamkN`&N5rx2sJ)?hb_l zA|L`HAOa#F0wN#+A`p!PWO0wiQBj*jAPNb17yYuhN8tdeNwG{o(=(PwUwzMd1iUla z^-flHhe81n5CIVo0TD{OQrtz1^7a(oes#FmW z0TB=Z5jaXf^8F|Y{Z|A;KmU1Orwh=2%)fCz|y z2#A0Ph=7lPB)boY4n;r&L_h>YKm2vBwqks3?d)` zA|L`HAOfKTB;P}sC`JTCKmYKmYKm1VlgtL_h>YAl3$ zoq!~JtX~1@zX*tc2#A0Ph=2%)K$H`ZWRLOzQu9PW1VkXM2>f!%@&@t+NGrN3R|G^r z1k#Mahyn5arQy>IuL>3c5fA|p5CIVo0TB>^)F6<_B>RR98*aPpwwg6-7B61BNs}gT zzx{S>e%7p6#83`moj~r~x!-u>4H|ax$tQCd zt|i_=X3w5|=9y;}D^{#VjT(2}d8eyl^5n@hp6!K7l`7qS`|VV5;J^V}sO;RilPbK0 z5dQ10zs@=5oRTF=QWS8k*FG|=MiAWBUw{3>4?kR|PMzt~r*nAv>8D#!Z@&2^hd1AR zvmJ&ufCa;^zy8YEWy_YaaEg%KR}op@!wyM>3KbxK{`u##!m(QPR|G^r1VlgtL_h>$ zhrov&Z#bAjUjS5Tgx_0ly%phXf~R`*>J>T|IdkSjXolvUG-=WqXPklhY~8x`Z@>K( znxI364pv(E^5rkP>@r+s=FOXD$xb}+L|4(YY10tF91=+b@H2glm!bGB%Z$% zRjyn)!XyZ-$YN*-2@uV8h?eEBN|h?U^lojCBS#L@Hf}cfyCbhHS-6&1ga7>VPaJG$ zVgCI2Su>n+$|+QVi#&N3FJ7D{Po7-4a&_(66AShd14HQ@94O@*#o!&N}O?2-$rV zQDD=iP02_udXznT_G6DdcK`nUzAorc1VlgtL_h>YKm=l$KsfE4Ei#mF*&^q1XR(fB z_CBid{`v2dPd@1qxBwPh)6zjpp{XmfZl1<#c@h{P~=E?z!i# zyz)vMcnCW(giT3Tty&fPH-`~4cen=FUIc|l&hD$|r=NbJJ1l9)#g9b=hxpsrq5g`1 z2#A0Ph=2%)fCxY!oc2yzCmEFM4?q0iRqg0?UgAWq`F^N3^K!9x1f|!YYmw;nIdkUV zoAJyu&vftJ-Sjtp9k{i4OT&bZX`IrqUZY~KyY4#9;)vqX;7LLlag5y;w-XHT?o@;T zp6hU=@X$2KZoEf6{`h0McESlKkN{zQ-+lKb*b-8*4&m?p_uo%b*$qIfqsxgzZ4+;n zY2LxbY)_e_Au{ksUfgo%I0C(H-MW;+LIO*6U}E+$aHI)5 z{Duu1Ml$c9cylQ%0wN#+B9J8rygYjC#VPa!$PygX2@yzT0{^iSr*heU7iS8-MT-{5 z!EoB0gqWEl*N&(iGGqv8F1_^9lTJDbKkQw*b|I;efT&~wE;~Y&Fdt+@<-5p2g$lVa z^3lRB;7%nYfX_E>?)B=`V@1J_KGIHncxY9EEulI~!yC8e6K@Sbg0rq5jDx$y;DKX- z2!9dBue|aKwc}#MI)|+W{Elc?Xci3f-bj`uc8Ev5i%)z50<&8=t|IGZe0)4EK&}c5 z|1PY62#A0Ph=2%)fCz{{I06X><#5@O6mP2i(@#GQw6$ANh&dJ(eB{MPyk9nM+{nA0e4mkzGvW^JT@s8KF@nU{$WgQu;@uFi zLIVF%a^P#J=wn*N8?Nq?kvOza0Gz+J!spK`W{_VHly7Y-@K!ohB91B=C zckkY9-DJCiPMMDPrPQGah=2%)fCz|y2#A2607@>xFPv{pge=KE#ivn_iD*`wVZQ(V z`_OXiGwmecl})~sVs0MInl-aG8qHIjRRLb$ybnr0d9jrbuwZT{j8_H)nqLiT1B4@b zns}skXhjy2NWXUcd8~>uWy*By*bxU6mIwU4`sypn3D*+m*G_9$pCH-sBj<~gG>OmM zAfS=a_{#I+qbugkf5QzoP#{W|G-&040|$Crj+;J(Q13+-U4#=q%OsNVp-j?v$(Xx2 zjzgB0oeDm-LrUCf_^^y^JJ_qJ;TmAhOGxlhqeex@?yHFE>_uBPNvNHH;J0+?Qg0U& z7J*Dm;KqAP?mg-YkcqpYri*|Gh=2%05rJ?zJllu?@%_{G-PB}I;Qh=9x$uYQ+b1}F zW0=OB1P2p)$C50FMua7z7rQfs;O31ZM!tOcP_Q3<_@R}FZbYx*8(+C{< z<>9JJq=qLuFT}DIU;)DF0E05-e!kgg#fEE%)9@tYn~GS~QSvmYM~@!t2UuR-5kU9S z=86?7@>v?!R5Uj01zz8^WbW^eKmN$K= z9*EEY77_g8u(XQz1xOYyduTFaM_xc^+qNyQ#k!U&AOa#F0wN#+A|L`H0D*A2 zJ&tpz*l<7o^-n&!9qw$Vi$|F9&MI!(iSZTBbiGr9ML+~ZKm2PtW3K0+i5fA|p5CIVo0TD<(0ZI1cvr|qH5CIVo0TB=Z5fA|pNCyIv?CAhmRfvEH zh=2%)K#B-lS><~EWs=zQ1xOJzWfp;~NYKm@WX0ZI0(IYKmYKmv-Qk@WiSS29& z9;+j-ev5zzh=2%)fCz|y2xJlhlI)pepwvte5CIVo0TB=Z5fFh`B_PQjt0S*|#{hw< zt?r*HUw{}GXmwEpL_h>YAhrmM7!coI8a}qhT)h$gMcJ^Y>cydDFPxO0wN#+B9JZw+6>NlyLYKmYKmYKm?+NfFyggjD*@D0wN#+A|L`H z@E-yPzP`VJd;$K0L8GDQ?zrRf=g(iGMvZ&!xo6LwJ>ftvUAnYTp+e!###;RU{`bF< zB}=YfzdqA-eCW`j6)IF1F=9ku%Q@S&ZQH<8ks~7m>DjX0TH>(r_9^2;wrNF46e zzJ2@7Jo8Kn36~&?#rNsc2WVNWQ|gWgh=2%Wb^>W7*`I&@`Bz?f<;^$WT)TGd#~*+E z?YG||yiyU?AAkH&s#K{|De%GzFHGKp+|^#LT)8=O=D5R@1h#G42D(|ZW~El|Qqq{D z=6&XwXHd^wx^(eo48hx{+2Q!)`2wT^9F$7cs#U%1SJ+D+WHh}e(shaLzgBeD>LAk38}Svvt6L0sZ^;=N^^RlE3@zJML*e|NQf!MT>Ig%=!E8 zzbC1L&{nzZY0WlC_smqhr@0O$K9G168Qadp_ed#4Kmm6s+8)jOiZ!cw{MS&i{ruMYCm}JAey0k z`SLC%Y6F`#ZK_hGO6oQ*6iDipPiZVVjz9kRR4+EE1t#Y5NNSmxH2s}--pO`dG8&)9 z^CSD$Uw{46Pe1+j*I$JT7v`{X<;q-64?Xly-@bj5R5%wl6EIh9_E4u8= z&0@uh<<6bk#e@btjmi^xRxu(V0wN#+B9IsYX=QfLmoFa%rd6v}StCwA{d9~z7RHm} zgcD9EP@n*jGiJ>2wQ}CPd97Nt!cvBp4fc9Fiz`j1PMwMrDN?g$O}6VdZ{FOzd2^nl zJUe&o+T|?)vs&%iwe#l9i*^jPsqw(R=%R~w#Nvu_?X}mki+=CD_tG95d3cahGG{w? z?%b$RBg*s|bl99HC6T*#?m^N+NtXsFPb?esHYt^a+1UBs#ELcFy#*G_kBzqg}+qb8` zpM3HOegrLAv^eINV?y0kD3)?KMdMjMVZx>as(ALk~#U%ni9U9@P?>eZ`1`Q(#$ zV_6BlzoE&#{PIgDv(7v3Jh%S2;DQTox#bp&u(t2QND=esqmN?h#pUOXH{P(4*)-yc zEm5LGuU@_AAj!NnhF(;h4Q&IFiMc#}_~8dGKioQ+Hf?GqU7&GsVnJr;DS?Zhq5>=R zwhFT{W6d;d(4fJOKmN!m#3k4n9jwm~=-s=w0b~xcw5ITuEn6;Gvcy{m;be~>(-7?4 zx^+AD*khR;p`Kr%J#|&H;2$?`9EZM%?-CH;Vnc$z{r215$a?kaF;ZN~C!TmB@$bCz zPLCcvOs`wAi!Z)-`0(K%crkzax@4x?^nZ=ET#r)Q-TYnF3!VSa{qZJSeqeqWMda`|ulthRi8qg~wK#L=r zaK1pA^Xw<`mtTItmjq<-rgTLSi3BMB&r)TvVu zF++w7q5R7)zx=7Eo^pY}WIK26#Og`kNrr?)v9Xx6FnDPgKsY3T)FXy4f4R~ikAmbn zM38aC-gn=9%uSM!!2Loms=zjo-k~5IczH1Tw2e!5&6+i=D_Fsj^2HZlME`LqvKU4n zvW_J(v{EA7kL!evOqw)_DZ{w4<;5w=1Om#2F!PH}kqrK*d@S6^Ylf9b1h*^40+O%n;#H7M%pPB0|Q(+Mh0TGCD0^ziGw#e-cmo0KGJIh02 z%9JVSa+DSi7>v8b-*CeX+)`b3q$dvsC)p83+`--1Yp%Hl$7623$ZNZ;a|+8A4_Egn za)}9`53rtE47rfAl#eu4kid#VB##Z!6L60T9yunGEQ@=9ap)vFnue#QCE$60 z8!cg%(iKIdSChG713PG?*Q5o9b{2!oxc zyCrsiX(U!mJ48&Nm>D3-r)w68O%dfmIB<+yIRpY5Lwtggo#la*Lpx3SBpwJOPMZVa3u@`p6}U;gIF4MIsOxW!e^6skceUP`mQERMwnO1<61z`q4-lNB+;VDQGG z#?77Az<5UT!?J~i#=^e8m_;!ha*xKW_{0-WV3qMDz*3HM!wH81+2BUC`w}?!317Sk zIFyjthwLon@YMIEbcdG34qdT<9dubj11=*{-t`(3Y#C$exAd5i2+&z}7!b7<_7%mW zjt9Ie0mXwSMxYS);^c1HiE@=?4 zC1R6;3B^mx3|wfX-ooh=8%L~8+2_Hx+nr(&i>r?v+Hhn2rA9YXaA#%q`8y1cy3KBideaMuVK!5FQ*92cI6NNnoG$c z{v>vmcyHL7B|_NS9^VAFT;A)@T_oOIB=h#dS65=LNpF_GfsSzNw!99A_hu4$OD8dR zX`F~y46v;7*6Rzu|Ni^jyXY?)Cbm@eCJ3AwBw(_*WQ6IvJB;nXz#`8U%#6MOu{~<) zy$A#o@C)4FR7s3QoMEJ7Q`P0ent~ib`=Y=QB?vG3p|-J`x@4TiJb(1$axBMe@#EFN zzOa)!Sif*_aap_p43ju{W0%4x&Vs>-5|@ViICdjSN}F zmC?uUVSwu}3k+WgzAV0C13Ty|!F%Z1gC_%~J3GbmjP?-YO&K|iZsW=7O5m}FE;J?Q z9<;86$YVsZWH%<4vVA(HSC@|_`L+ug}`b2jkS652vm zP>vhRbT|4gSLj6*t_@^~e0gxGyYfkiD>GhR3pJ+CzZN8J5ai zFtDfYtOdeNd<^rfy>VXWZ4+M>-ywE% zoX7CfaPi-K^9=x5gE2;KSUKyxoFX*al|#VIO>bnf!`}7;PH^vah?KXAyt#<+_QKba z2-l=9r5%PsNbt5m#=u;G6P!z$Zcd**-Ckx0Yy+1iR(9+@*iD!V4?OUI@AZY*Un5_5;<9II_F9Z*-n?YTix-bZZqNkSm&d_? zfOl+g>b>NWORzoTWP)bJN5anHzUfV7VLWr*efM1o!5Id%MHENlw%fZ^GRbt<&Xzz&8c3yt9|F1#I#8$Qi=ErTvJS%er$VD|$nCT(UPnMD*j zJ}`acF(OM+8xx4vs!lu*{Hb_D4(AY_;^`FwEf|d*~`kfZ6Mhx2kFlXn&|k@ z5_~b|pMO3}LDpvU0;R|m<ox^2z~M6jk#H z6w|4pm3o^^N(}S3CNuROfBbP~lX)e1(^wc+8P*|87A6-LIR?(qG{mIJ2zpBn?5Q^a z;cye*c3tdk8N9uHxx9zmf^dJwxQl6kg*xMilQgq{xzGE}IN{)N2OQ=s*du(o-dkp> zhmCE5bBY@mvX$Eoj$3qr$;)+^m|oa@GTb%k>rRA$PVlziE6NT7CpdTDn{U3EmvH#< zE#5e8P35bdMG+n3&QAg!A6%%uJ9gmIpk8*FcsYbe4EIckQ3#QYeu7&xfn89f2#A0P zL<<4#gAsn=d}|_Pu~R%J&;fYCVwT2|#{&rio}J=O&GUojF5k+qHy1H?;V*7yi8`8xSXjC5 zV=qUFnMXKgd$bg-#qeYP&6b|0IGeMGdmapkCw|1EY*6Y%VzlO!Q0zcNvLK-)d~bw4 zTB~qQz|R$PAZLBW26oVD;%sDD3HJV|tJ(sgJ#|CrF3Zq~?=6bE6H1OL z=_~ngmswx6I_eAHImbGUT{|vv@Un#CwE?a}JI}?BL4i91@L4ihWMCJdfea;qyM}#W zDWB4;1a5sSFD=aNiyNJV1OGbCoDG~`E*Dom_bd9&jN=_mCO#JlX9IiTa(VBWf!C)? zNx)GwL_h?hmOwZi9!HBKtR%QcC+{CWiBP6ar2_$; zZOPcgPhPHc=uU=I!PLO0iFXRB%f9JJGuQ=Uryh})Ax%ofN^Ro%b`Mgqd|y!p(-#^2 zhbe4!3bT9p{Px>#EbLiz5Xp`T0X~r8O%QG2RP1|_y2c8PWhxsoNy??fA|L`H5IqFK zY40>~l8K&f$81ZIq1R!Ryj)oovdLMtW!Q(o%FYfx-`QkUgGn_DbeY~+2h*o7=~-7Q z_9%tTPGNR$NBH6v|84+#DJXS549bhS-m_5{PQ|`QVeix=5fA|pNPhzVe4Zu!D^`su zC-CI2HTjTDm24f_w2b!Wcgi~(4JGigIbK)5If_>o@SwmSTDl|}#wFI;z&ASaro&yE z1thLbyt)u;1k_&<5CIX0bpj&>#P^q{Osro8>c0qxfCz|y2#A0Ph(MGOkf%(P41}5? z0wN#+A|L`HAOcyA!1_Gb^R;aG0;J2p%F#VtFsl*~5CIVo0TB=Z5fA|pNG<_M_T-XN zJ`oTB5fA|p5CIVo0TDUf>u6t$PcKHG%@|saH5fA|p5CIVo0TB>^j3Y2&Kzx5`_>AMP znngeaL_h>YKmYKmYKmBJYfcJ10+xpE~weX>)&_S$RRyLV4^_6*GU&O7gP?%X*88=$I_ zO5nl^FMRpsmy?=H>0^sPqlG!Q$`>HE#$3G>0TDy{}~X56@OojP^8>86`P8$Dsdgfq@KqjBTL-+%x8*s){t=FNNNnP;N@LsO<=Of(4D z3~WQ&wryEsq$1C7MX@YFd51fj>hXX4@kgmrrBYIC1`bL}nw>s*rO4BVvuY6m5fA|p z5CI>7G?DE4_wUDizHs3}Dyvto-tWKv{@#1&pz`d^Bv-Qvuf2U7m3k&-@bkBFe?Ri?AWn+^XAm;(VchRdG*y- zr*4^nrJ>hPKb?PeGsAvqL66R)QL)i^8T;m1hK;2v76B0u0TB>^SS64ql6}~)VK}`Q z(mi|j5U{@%^S}cS95`^m0iQQ--n41cuD$kJ7n37L4$SSCfr%+suH2kCbL`ah*I$3{ zz4sFC)2GkF4?kS9X3ZOKyb+00v0}x?9(xQ28x{$a)~Z!2d~%LE?zoRX{@60su3h`f zFTd>8t=qB39*eKe`t|E^*Fm#>_0?Ax{w<9ad-KgV+aX>$`SRu4wr!g`OJMo(_3G81eDcY|hYu4OTDZ%ydiCnuxpQyaxY1%Rz4X$%@4nle4Q&GrrrAY`6zSc& zw<~%yPNE^u11i+rmQW!gW@yTv-te(yYH;cuGqjq3FOf8 zt@kPf`2yfbcFZxyaIw*aAAkIj@_mER%Yz?X z=nj2>vSrK8o;}+lueZ`9J=&fYbDovum%9Sfy49f#|)?yH9sL!jex(bCf zb?Vegl`63_z^TB(FTecqr=EI>v*_l*g9j5pzMx!Z&6-8n{ahR91!Um1bLURl%mM~= zMKTIM<&;xcz@Rl>eDOsTBs7q-yas^0CIQkMT|RpBXe8+)k30evw4*DZ08G$!tW{XF zpw(bv{emIFiv&<*NkA_4D_9XxBTZ$wMNte53C=zDT;w2lsSAZ?>lU(;c;(8KBw$U_ zqD2b=NILq<3W07S+CKmMb0R4a;Z6tX{_C&5&d{(*L2$D`va_K>!vHmD(qzGc1r)_{ z>y}$?A?4d|zkSwOXAy8eSn>JIyPLbt%0?5s$AI9$W;x#Rd*aAO|wqj|BtEl1Y;$(QG7j!-frs_g=;v z1~UIA|KY=|B3MIm#UipH&mxvn=<=6dddbqTHaqRK(+J;o+ii5vrkmyBI$>(Sjh2&O z*|KF!8Tu9O^7hU(Z!Lir-fzGCM#-pl2tWS#<3M&zvWDre2#A0Ph=2%)Kx6{pw0D|V z+|BG~>fCJYX1lc*{+dFyLrx{*jZAc2n>KB*XHy71IZr(C1mgaiZ@%F#R&$KLDB6oJ zz8EcHwGbvTQW&eVDK?Au{zd(uT#+3_B0Df1d(WaE*+zKox#xIs7K0@U53y(oA{37H zLb;NRMGMLp+2<|O7e;fVWmyeg z&2RYd;TU28i>3Cy`|kVp+i$G|Y~k#35N03@Da!+NFn{SLT9E2oT@->vnWi!{ycbJ@ zA#7(u>GkT>3t7pMfKE{bD&Ljk4RGbKl3~bbJOa_o)!qbz9X(&X9e(uDM_doAVOXDF zjYgg(($C5j8#pKtI8ZMb86#F=pkS@&dgm_V2+Xb7l+TU<+d;tLn&+|!?43n|nxQ1j zP837HKoDll(6?`20&Gn%C^#}jxV*h{&C29&;DrZIF8K4#JFi5E5_jBj2MauxUI7sh z0TB=Z5fFit5XhO5%t3ie_iOU3*B8K4oux#|V<^Qm>&=J_*d1b$$MA_FLAkm}RvTCo zanEou1k3@$V!Tx#Pmy25|Mk~j7^hJrE*H|!!j^zAy2qXM1#;%hiI7EYhpu&}c=-||I+57skxi~N zBC+wax*&!%4Dz&EwQ3-;1h@>5z$LZ-I?@6p^M;9}eAb2DRR^V6;?Q2RAHuhEkcl*s z-2>K9=x<95J(rP~$n;nPppWOyor|>?jUG+~(p3Cg*xA6`j!y_(W<_DuxxbE{iy`1H zBu3e_ijl>1?M>zjyIjP(Vgm;y0tfQ4G{O$eVuMSOHI=Kydl`pgZiyLIBs;BTjl=~O zDwMrV^-c%E39xPZP5{LfthC0~{t)uY)(HMl6pm0h$ndH0}v52GPPczS9+`I6LKZGKcQ0H;k^v zW=%5tO_?$UPXx;wL9SZ@`)gKmTsbhsqOZKCkUFeEoX0-8#jQRf6i#O`n)9A5UMl#T zcnkD}!xiFsO7GC;)-}G?gV~)803y+EM|->+0fw0szv90Q=9_sX7(WP_>VzB_ef35@ zqyuGaPek8Dqg~AlU914z?V4`NHB|Yf0ex;Qg>FuKRSEQwV;n{FcTd zBV69DVXjO9ffpX5=BYAlU@cM6zSB=1o6qlRfXTBfBQzwc!;3 zm}Rlg;t!0s3onrFE?U>xvZ&wBmN(2rRPVd+z;gtlmG7dhp$5(QK%vt`O zdg`gXh7DnSUW_vx1T20xTp_$VOGWl$Hv;c{E)Tq`*oZQHPcpvVWS0b&jlG$i$jjT{ z1YUU1z^|UoD$=m(cC(MgGpnzoEz*BQKmH3GBnk}C27J?cG+l^w$^?Z@fe8&4R)hmu3wV?@V20jFqQK=q{w zJj9BRsXnyVBo1stU?D`Jw~P*FhH38}h!E2oz4}?2{7+dcP zFT6ne-PyzhKK$@Q+K+DwFsTlA`f#~W!1jVG@6e)sy^c;ak7gk07(re=Wltl58wJT& z9WjWk=vbU!9(L~(c&oM-Wm(CfhJgbRws&YJwG+TQ$(xvK3_ltcQLIM5#X5(xcxllR z7DZfO$Xs+Mm#7;QHZ82nJj_0qA+iJ%Oo5)C=oc2h3Z&EP&lHQ7lUbuxixu9 zj?DauE3W9!p#yK9GN!h|Auq3?0-wz*-qU7%Lf5Q7YT?45gZSjLP@!JpnVVSLNkdWm zD+{c96M1>F0m8lnBN%w$L7v4nR|qRrBs(uZ+bm`fnY`W(Dl7sbAOa#F0wRzk0&!@O z2pMpbHnklgO}JB-$+7(L8AAjLS_k(P+&Oq9FI@U`i>J$>4j!&{v^XZrB>jV@E-!)5 z!dZc!l3BW-BfTl3JZu+61W?}gV-ZK}dSj9o4yBj8a+J#mu+@XV4NC|w5SF!wX?AJ6 zkqV1|2#A0Ph=2%01A%bbJJsJ!{kOANta0QpUygrcqaYMchT^M$+c##{1if)0bi!A- zeF_iTWaiTAbkNt42wmn>s_6BkRvNiUIx7M(Mxc9*_e;qaAjSq=-4y{5h*1J*DBm+3 zQQYG3+_g`Er&ihQ00h#2#A0Ph=2%)fC$7Ifi!fIi8Yk!uLy{M2#A0P zh=2%)fC!|7KsYCvRPaSkNwbt!1d>dk`@u>hYKmYKm{)+|)k6^w0TB=Z5fA|p5P?ihK$1OE51$$@0wR$51d3d?dcJ%CQlG0z6af(s0TDwu_{vpL_h>G3xNmsbk8hJRXZWD zxDRh!>L&ssAOg`#AWbAY-97v4v!l1uYS}*o-fujI3*g`H0t_EMTmzR`t_}@WW*I5k z`QS&HsIh9Q2#A0Ph(NRxNGtgs?fq8!L_h>YAT0^poA;BRJ$t5Q4Jtd;2>iWEtieh( zo+?NLL?A5)$ge#usH#j65CIVo0TB=Z5fFi-5_ofFsW`7MKvMI^NP5Zl7#V1FQv^gn z1VlgtL_h>YAkz{UF(AIbbbF>9J~dnfL_h>YKmYKmw6DMZx@5_cC!c(Bk_ylAiTCc^JAVB5Wy_ZB*s-HjsZ#ao)jQ#Y6Rg(^ z+^@g>YT+C?a+E1krcIkR<;s=&=%bI8E?w#)Q@wiiZr!>K8#ast&6+i%%*m4{pL_1P zHEPswDW^=C^8NSUcj(Z;Rk3T=u9seViE+8&iYr{QH{N(-)22;!SgcsFV~;)dj5E&2 zp8d!wlwsupb15xw@x>Qcs8GQdnN<(}_~Q>g7ul#$BgP_JA9wED2~|4_x6-9cH*DCD zk#*?5h_Bvu*`5CIVo0TGBn0vRURqlER;sZ(3E zYK30^^2;w-Fr0JFIZ@KEsA>i>eaMg@D0S90g$fl~wQ3cTn!oMax3_lIs#U99yLN<4 z*?<1|=hs|w4KNQKIz;4m-+dPs7YAp;CaEo#{Uv6>f(2g5&Y>?E0+f2!uV0TwFJ8R3 z%T9ZaJMK7YS+{N-wQSzJ*^MCSec#{9lP8bMnB@cW=g%)(xG>zDWS=;3;>?*dd-v|` z0tSIqP{D!)_wC!qdJKjH5c+m19QGv8yP@WC(4j1=e1-h<(@!j(eUYhq_|7};uu2~}a%AcjtI|Y31VkWa3Bpq6{~H`UI&poj$Ir}Dwc9f1}Nkg2Jbp`>Qt&!iO8HebLPvJj{tws zix^)wZrq3k*V1E#M~+(pi}C)Y1Prc7aFgtqfys;6-kSysdj0zKNrt{*q}-|8xpP~w zRjXD#|NQe`ef8C~Yu8%d2sOIwSv9~y^v^&4WOM1W&punRVukH9utsG8MweZ{x}P_1 zUKsMj*3LMN9Xl4(1UMTGdsgL^A^m#s#TPHU@IqHL1L4A{6{uLT;%~qG<}J-`dfpg? zML+~ZKm?+kKr~8rthq?B4I4Hf-4I?l((uUfa^&%Yr5tTnzI^$%ZQGg&7Bel%5?>m8 zZ<;h|V)i@?vEP3CEtcA{Wy_M-TL|G#KmC;Sn1b-fShHpgwnneh&f&v{Crz4!krG*t zYX`<%#Eq|nSU5a*@Zg*|b1uE~Qg3H@juj=y@X}gfR^7*|P_8 zZiqfhQyL2l zI>NoeBDoAsKmBy}VM2QsoiQ{R4xw#h-m(4+y=#T0OfZHub6^z-W>f+Z5CIVof#@L+ zrLUsm0Vz=c)2B~&g;)T0YNRK|V|0w~6o>d~BX>A^)m2yV_{57QG>wZHcW%jTeqR80 zGV28JQ9)Wc^SSF71A%6;Ls$WyAF`Ww25`VglCLw$49#an5x`sB)j|Nb4eBy4cJrC> zp7n+q*)3bPSPU(B{J%dM=}nx4!z^-4zd{mviSH@m7&U1O6U5HsVqMp@Yu6qnq;*;g$$P?s)g#e}9V>Esi7|m9wPm-o5)Bcih1p^~4iTWcavCvufgJ!_>HO;}1Xl5b|7gojP@5 zlgHNvTE+V+7*@CvSh?9*e1T{%_X>K!LdBOwhaw;XA|L`j0#Pd8c@AMCr>&JMS4OTm zJx2^G0fQW-L~M$P03JC!p0W9%8+a-Z$+L|^GvX2;jaeV-)~)O7eB?tOEzO%ZM=|hF z;bDm>H*)%{dY07@82R}+h#3!O42xu)^W5LR*Is)KRgHTFXMO1-9GYZDF(CR;33$AC z6H_?uzrF@Yq!<&#$|P^-O!QWV+D7nUNM`?vsp?kdHl2xN^wEVBPA*g+iq+KFg1L@4c5WedN9u zA0N;91TxGr)<~>a5bNiicOLi2AAa}&Rn4K7wuPZ_w1$8F%S6L?!OIN&`}fD6>X~Pr zdF!pWIQR6^PxC7IFTec4MhZ(@4y^=Uapt9AtSSu}G-%qi>D_nV&F!&TwQ2(g4zvW1 zJ@(kgAAig>!zlRN=-EZ#l6dN=r`R{+s{@QF*CY#jD&=hlve1}EAAK~m*@_VX5fA|p z@DhkdCmGs@jmNc;@b>N7-63Ho=`ae~S*$f!@36_C08n*2dq~fNp=i;f7Uqz6GX%P# zA_p+j^1O6955+)s{zlG~_0GZ#F^#R=XE?`K!Nnkw&N}O?WcM8lI*JWD>$Yv%Sd8Hj z;fi9oQJnlxBo@gt9;N6KcmoU>i#?0s+MrDD*%%3IpSFwg); zNhbz7^UJ*o!o0AzewiqFR{sT~E0t(S4%`qdegCYj*_Lg|PRDc^#as18fKM;-QBg!m^H$ zo6QsSwE3+u7a(scnJ^3I(EhR#@cFgdVDbJ5^w9k%X679kd-dwYrX}+l<}9n+mztR1 zq$B}V{PovgtcxscD=WfmkJ#OyU%!5AZrOea@%(5rXKhh;*Ijq{ujd(}p`Tv;z3 zG0oE&cmK|vJG_3IiD3@q$1RhI+^_rdM8hrIpW13xfv__I+E%PLUVk zh^s&fTawwcBi1p^;tp;dnKo@222|6633iPk;Pn#TUgfK)31T;Q8k-<2o3Wcxe&9^> z){D0rgNPp*vx!xi^Fw2*x>u7KU+xbSh!L0F8+Dcw4a>bzlBo!cv5IM`I7+3pl_pFy|bvqkfCz|y2>ge@hyn5aGt5(lyEOZ^n9q1#BZ*PnxJbBL zH{R^FgNlU?gBlzDuH_hj@T$cs$7AKkAAjUA!6O?Z4gmx_0iF>UaR~4z;VI9HaHQnv zfQyYQBryRjca%@_C<=dC-h4|;t}K}b)yKn^R|yy+7EL%VVGU%T+^4Zq(sznNG*XNA zvyc>spSHUyI7AX4SGYE;E<7d}TpTDEUo;+h@vE{^3_Yj3zgRHs(O)c{EP@OIe*ue* z_39{h$^wQ6Gb?Hh11NS?^kHP|mXVo=7dj#wABplx)47;3@Sn%f1D$aO}UbtRV~QV{13N<-ET8Z?NT zhEd>ju^7_06ID5(|r+ACX zdSNWxI6*kOCmqCdcwq7337VT%QdyPZXpJQ0Ri<8tH zRzB|jX&ISiP~{GZ=R6MQ3?=Us^KuY(NYG*a;LiN^+ix?Pi_JW2Y6IP+lIHK_mG6%I|wSM zsHiB41yrzL@4eUG-oT2zVFx?*26il1Kt)7)5$QERfRJ8y_rH_T<9?e>fUp~OH_y4a zmf1N|?>X7?%zNIMvpoTJgG5YtOR??Ar8M;;z^b#I8LawMs$BIWpuwsiw_TEp!P@4J zC-atDZn=e}o8B#CI~mO0tp7BTSS6l#;t4ifVa|+eIxBK<9%Kq_e!4MRuoWk79wRZ2 zA~9I-*vh*!zwcaPCV)og*#*xhv7S&q>tOMyVt$UN4D&bM$aK|JSKWByjn`dw9X1i_ z1ux=1ZW0;`b?)i#@=2w8AUe zn8*=e=Eii+IMRE!ydlH&yVEsf3ssj0h(O~ZP}?t(Bzxnz2K@I_D$qZdkc`z}h2*gK zZ`AfkcKt?a3??BEFOIq6vGQ^sx=7@j@GztQ>{UYr$ zzxGB!U7ZwxfDzdGcys*3impb=k?}WOhu|i1VlgtL|~WsxYvQ6SEYKm)zWKmYAjAm- z%Snb^6hge`YMwpTSn@r9P2B#@D5VI9fCz|y2<#{U-LQ6)n9_@Y2y7350NVv7j2t>bo-*45UTH)? z1VlgtL_h>YKm$flxCYz&`;=cK=)y8^Hv|HTi9# zd;ubOfYmh-5CIVo0TGC30+R0$J-q6i2#A0Ph=2%)fCz{{_!E$15C1V#4@5u&L_h>Y zKmYKmXpkAOa#F0wN#+A|L`Hu!967*>@0_l8b-{h=2%) zfCz|y2#7$#5|CtXSl$sYKmYpwSSJWN$P>t&WO-2#A0Ph=2%) zfCz*q0ZH}{8Mmm+_fL^8K!^-RL^fl^iWRl>tBzB(Wl_8ch=2%)fCz}dt|AaN^8M8DSdHf=i- zE13xF41uj%xAy7N=e+aIt69jo=bp={S+i!B5CIVo0TB>^5F`*blHD&mbo1SJ z-_5DpZoBRM_uu!MhRE5oXYalD-r3pNwI$f0__yAAYt*PwLx&E1`|Y=>ea4I#_uO;O z4wVq_#29Z(d)0j{(8H1?b^3*AJ!dI<3&IO zL_h?BN#M7q?zls~0Kp_&|FYSzA&d`%NL*apHapO^ZQFbAy%#mJ&6L|rkei$P!V51v z^UO1Q?6C)lTefV8lt1Bw6V|O;N4SpcSmi4#E9*$0Qz8&>0#82qBxZFKJSD&S>Z^Pj z?atNvC>k_|NQem{qz%`FTeaUJ@j}y z&pr3tQAZth^;jWre`!pMQSijW-S%GUVB3 zpPe*m54RKv}yD1yYHr^rt+1H!-o&=-@iZ3Gar2Lfk{9N z%{bzSBfkFnYhsoxS#tK-XCHjIM0=9+6ruzdOQOE0~2 zz<>cKo_ON7-+pV#*JtA-fG9_rbGaJ3JEnJIYnNVcoY#YTEdnAS0wNH;1j1Xg8}64~ zb{S%q&kHWNfS5o3{IhA(rk{TLDF(%dAAT57yFJ5$@Fnrsv11W8lP6Dp`st_9?#uxS z3k$uoqo-@S7If;=DKRmzyuAF*JMTQ}th2uQ>Z@z7z4nnu9w{m+GI=LVnDE9MZ=l`z z`p!G=;L?LzOOqx|m?R*?shYXL9e3P8o4a@Ke%*D~nKl;`6f9o6_|Zon#s3GnKXc|x zvOo0DLsUnBOiOA{;8*)Dl02P^rP3Aflv<57Us{N@7;cd8yf*{ z)y}oe+>!~T?CXu~GEjfFLEziDGgr$OU>lHhS_DKObO=O(eD|T*x^-)Wa!gDNCTApd zNlA%M0>57|Z`CWPkI`H}NV)AsL66 z{QP{A_q5Ya>)5fQ!%;>1j5E$aqi1Af+1@%W#fA+VNJa?=EfY_xOn_5(Ec1yzFD)%Kk=7?Z_Dh#8#oxz@89aEf z6;`0p5-`%8T^}Xd8|^iqj*EZ@h=2%$HGv3}>~)Wa;nf5#J^_Dm@zND_+p0+9VncXR(5aszIrteWUCHVsBYf88KXRYJxFa6 zNk-&2F?_XTx;e!sc7MF?AAImZd|@aPyS#PE1egQtw%cwmz4Vg#x@ps<=;&ylH2T^& z38Y;<=;8hT^#w>vlXh>Mmw|dM0wN#+A`k%t!pTzx12e{K>pG+|r3KY9LI(xx_1vlMv6H17Kon{ge5-@}#=-F}xKNn(ZmdPHH zsDIpEP~p9L^=j3s75*$t0Orh@gJV1%?^xn{_Uu_RBQf~J&}$Swg-@I~k)1-UDoppW z++%V7?6c4Kieo$uIILy$Ta+S2Kmg+Mr2++>|NXeNuzd@T=!k6Z1ltqF=8bS?iK*FD63aTUt=KS-|zwf^L5a`}z(magi#IunM-t6oi$ys79zWCx1BSv6=N5ntz#1pld z$YmImrl}cIzg!o6Su$owe9h8!G{$kxtSA5V1=!KNb)*MW zO|O+Y(g*L98L|**Oz^s?l6N72K>ac9!Y-(45fA|p5CIVg9Rl^!#LL_h>YKmXh%>SA^fD$;TsC=M&0RoCtg@qvj$@efEG&NZSL_h>Y zKmg5SWsSfCz|y2#A0Ph=2%)Km!w)FmmV!>GlSOuIfZU1VlgtL_h>Y zKmRHcc42#A0Ph=2%0Gy%!?h#p>bP6R|i1Vlgt zL_h>YAp8kPvWNc|ss|z<0wN#+A|L`HAOe9Pkom^18$;d~K=M5hL#;AIKmYAZP?6*@K2w1&e?Ph=2%)fCz|y2#7!+2t);<5I<$S`s%BGVihFF zW{ZFbh=2%)fCz|y2s9P~lI)FTq}5LmXuJeQkA3rJ`2sZF@mJ49Km zJ0c(gA|L`HAOa#F0ue`G!pNZ`q}wBISk)mB5CIVo0TB=Z5fFjMA`q1IsF8&zOnNi9 z@9~xL1qhSDQZq$hrwMd?zHq0@PystY;Lf-Yb|AHqihu}+Kn(%`+^$9Py#`%Hh=2%) zfCz|y&34>z#|cBj5Ewsxyl4w`!w_i5TDY(SSe+z$0AZ>q5fA|p2qFQDz5z7Y1hJtJ zQFQfdNF>=KVl35(T}7bsyl3u{FF;V}%f~$^SXHP9h=2%)fCz|y2#A0P1d4zpd!R_F z91#!!5fA|p5CIVo0TBoa0ZI0tU{#?aAOa#F0*!~j`iZ-x$QPjTjJJ9!0=t@k|>ihu}+fCz|y2#A0Ph`_EUpq*rP^$4hb5eO#& z^IE)pl6(QeX~fjlh9&Urx8Kf~G2{5-kMG*GYs1#u=xSTEXwl4>GuN+Q9~&DB?Sl?F zC?+PRHVQAi@B*7lHgDeC3e=WT@je6=E?oHOr=OZg2*dD@Lk?-tqJ>Ygo%#CZmtSUP zX7=mXuik|`^UO1+o_Z>U)VqYR%P5O`*bSK)ECM1R0<{vz&CR{yiYwZ+YnPOi)Td9M z*I$3V)}%Ju%9SgVlauR6pi|o<;PH6Sktr!DfBp5>HWMqs&Jg(Hk3S|(oVfe$yR#kY z(MKP>di82#-_8`Mymb&rO-;SJ`Z)XSvs<@r{r1~$GgGP~y-qa*fe9mrj*xC|2-2!U z1Vlgt8ioLpX4$f37=PEUUHiZT5B%T%{of~_d=kK_UwrY!lTPB%OVtq_9bNalz$A<8 zPt;>YMa7|q9=c@7lFCY6Tpjd-nL=Ss<} z++pHm$U|nIefF6>dp0^dEiLV+qmJV7#t%RIfYZUIO`A4v-t2HV4m<3yHf`F_Q@(!l z%{STE*`z@yb?@GtNRnY<#?Z+esav;hhaY}8S%@LcoH=vwT)+op%9JToQBqQZz#24Y z5Tz9r74h1rBab|C?%cWS)~)N(r3+z7L*r7#nl)<@5)uXs7|^3f4w7Uyj)x!UicK2Cv;qFTE7^U8-O*U`qJ&&p(*}9DD4st5&T-HZd6^WBc~) zzyJPwlYlZojb-}63oo2Me?G}*oRyVz$t9OC^b86jY2(I?j3dp!uZot_21HUQ zkI0rSTbP;nw2)5W@pTzpQGX!|b0cT|T(xpq$&0K_BoXwgw<1%Je*{W45-0mo! zX(2yBTy=y|;hj2lGLYP??gZZ8W92Ro#V!hL!WU6#g&C+c$PmZ zw@mJHk3RY+_t7CkhG2a4cC_$&7B?I2vbWxPD>v!>{rjJG+G%8b@WBVs>!>{o>xK;* zi05X^eVQ2p8r{;Due|aKKC!HA<7WTdbI(~>A|^nWT`pIL4jt$bGZSw=nLYN{0~Z70 zne8wNTeof{jJC$4O@P%0$eq9c{u@^46-@G&7|}Po?Y7&B6)Q-<05Q+u6!u6COzA{& zPz!}HL%=AGn!x}`M&uMq-6WtrOq>W4PhDhWfY9g|*C_`N6P~@e-EKyl7SeK((Lz2$ zd`?Bb=(Xvi&u486eUgRw*GsM#cWg-c0$}P!K=gr6TA z$a~9oE^>yF>}2$o-OS3ENpjh9p>pZ+M=@{SJn~{_;Ma_YD%67cz+CDJ7A)XLiTN;p zBS#!@M3@h5eVQ+anfg#u9uW`$5eQ8Jn4=KWKmYvmci(-7)V}7LYcRl{dFGjXqOi?< z4n>X^2LcY2Z+hYP>~FvQhD8=RP8y8s+-v{fm?w=kLhe`zP(^0iKn!6%(eBiXkBv!#w*vvpndGJYCX!EYA!S8| zP5|}h{XoMsjOPrv2GJM43`3{!5zrDKM@2<(rEyJ~`6`{_qT&oH;6KcmVbO z`|sm?#o7<1m!|Lh37CMnCM_W53dinXVsNt|hA=Zse!&=4^F+n$8H2@v%fO_hC7iO# zX(Rzj_C_+$>ZS;YK;#oZgdrIZKKNjyImi9?-+$e8*Rdr8(ism?9&KBmsj$GpYDsp# zXEB>`CpOf$L8AWs66CSCm5c2BqE?YdiFpn%~5)K8&?BxBCV{4FTvSGL^OsH-*E?oVcrNjH1d9Ma3)baY8wyHe z92r5hK53X3nCpVl59d}i><#Zv_r0=(4`H^x$k z>k;~%!9sUpO=Q_9*_lVN(hil+FtH$kcyci}FkZzt1~4MT{D-SL#1I>!BW?!x)05rX zFz=n1F~v5?mLSy2?2bhU7)r70<7$jg6p^f6cxLN= z!rp%xwRN9$3s}>6xI{%vNBOIvd=hhcW6NhM%f(OCT>rF(Q%HG|q22kjs?SeNZS4q? zcv;-TWT4bc5fA|p*cJhnJR-zd$av?ScXIDUQ{t?G+YHt$Jk*KDbDG=UJMX+hyzxUd zMfyF9#|t+5&p!JMyDYCaK~1u)BRFNScO?v$^?e+o_p>|7y}`b8Eof<0}d*fDVJA*${?E zm@`Zij;zNk9i?Ke@H0i>;LFfF{q)mp*@1g8f`&pY3%W^TJ`w2D#V$1HAq?&KP@$7J zc#94#ME+ucKl$X7jXRTf#!w66YDH&Ru*f8b=?XwtWlJM*(D%zQ)Y>0j?P0F|*0iASJwZ6nqRV-)9M)b>br60@|Li~srOpJyET ztLfdlH<4^m!}ZK#C4R^F)nXSW3db1_^E}fw65w0UwA0w>`PxVhJAdbObd_zS*tn;T z1Ue-GA|L`H&@cqH=LZ?16nfpbgmSk-%CJ<_Ja@*Dil;lKT-GB#@x&A8dsI6j(n#={ zXXzA@j;&*`4YM-r*=L{SHi;)RcTjXBH&h&0(ec>ce){Pr)I1WFn=~87A9KtxW|J-T5)1*8^eTT**R3uFR=jJDi=O?G4l>KPZN9WAXfq{n1lZ`zH4PXPNU z)B%LK&7z=P4;5Y8Pra<{+XSuzA`lb;S7wf4r|WR@1qccX6&fT0NOpeu{T6<1_2GSr zy-h6hdCjw=#5&92odr>Dc6lSxTGWUnoj!fKcQWs@ghz}RQMakcC$GMWfCz|y2>1|? zkGl^LeH8%_5CIVgJb^~&gc^8=Dp3SPpfMAeFmmV!ncW-n6`;P0fCz|y2n3!0d*#YKm@iyK$3kMfOJ{}L_h>YKmnuyC>%<7a+t3NzD@h5fFiT5RiPY z2Q+070TB=Z5fA|p5CIVofrcX>$=-0RRg(yafCz|y2#A0Ph=2&xgMcJ^J)kK|h!MDS z)lt987a+t2Ma>Zb5fA|p5CIVg4gtyc;BZx`A|L`HAOa#F0wN#+A`mD76GjdlA>AG* znkq*GL_h>YKmYKm;P4fFygQkFfeD0wS=} z1TwdL`nY@nb{eA!5CIVo0TBoY0m=7(U{oO@AOa#F0wN#+A|L`H5G(?c?7YKmz^kvm>Kmo+BG6C-&O7hChN>#k z>iO}{17^qqWtz0uS$Y=$c28!AtkkRKv7Py|Fk z1VlgtL_h>Ypm7tBWN+N#uilG*2#A0P?0N!i`X73Wd;xa-IH(085GDj9-@{~})Jzc& z0TB=Z5fA|p5P`-@K$5+&j=cIU0wN#+A|L`HAOa!~CIlqe!(^b;Oc96-0u^W9_=kJ} zB4aGo3lR_j5fFi0LqPI<*Kk*@A|L`HAOa#F0wN#+BCwqVB-ytUl#+>n2#A0Ph=2%) zfCz}dt|1`F9xU!39Q5t)@&yPMU6m^WB2Z5P9*^g-#~$n6y?a7JLg&t%@3`ZR($dn} z%38T{WpZ+IZD$oP0wN#+BCtycNWSk9?5b1*L_h=@j=)n-J@wpk&%ONe%NsUqc>n$P zzxn2yn{U23fYmQrv?wbpYdZ^U(W1rt`SZ6kv66{^2#A0P{6k>E$e|;o+jTjJfCz{{ zgcJDi!w;{y=9&WzH~<@Z-@bh@yMO)l*Ad=lbx#CDz?;Bwr|=%bI;ty^bO9(2$_7|Km}!h{LC@4kCtVj_{VXV3O2YT?3#haP$; zq8~3C?Dgg>t~5sJLzvHNps(4avZH*P%au*1Ip{(HQ2m{hcC)v8&uW*1&~VSau-325g@C!KWDO*i%H z*Kf}~_x$6JKh8h@{5`6V#fuk{prD}O^wUpIPfyRx%)H`?E8K23k>{Ov-r&K53Fr_3 z5fFh$B_PQjsUxd?iGT=*z&`{YfBf;XvNCitiuu6@ADlODo;fjR&YW}3Ip@(wA6>nA z^^hS$jy&?n!oos}T1iRC5l0+x?6JqLTD1xz{RJ0XFm2j2B=WFf!+Q7by=2Lfd+xdC z?6c1%%TGW3)TBuh3c-2a%8nvG^UO1ExZ#GiYu8f6RaaewDF5!e@0vDkie5*x-*wkr zQ>RY-@y8#hPoK^-;QH&YH+jd8AAiOfXHZw4K7IDzfB)NWzn!^6$BrGJfBtzAJo3mR zv}e|=S!8_o-FH9z^iv`)zWCxBZ@kf}S^*Id0TGBi0#T9ICG|)IL_h>Yz?%RH`?ueI zLm8u(Kl$X7TW`Jfvdb|bP>9o#6-US`s;{z%-$w1jx^1iH^1(>>-dUU9T`n_ zr_+fvzwf^LqN1WsJMFZJ>chJ(E9`JMsIh0yp2T$M(7|rEV~im@#7r@3z}+Sk(#i@85s<^5va6bu!@v3lt0TB>^e+XbW#}fui`9AyXgGT@T_umoC zSg$c!BaX+89gA~|If{yka&mGkaGYfk>Axr2eDTE>n9MPaw{6=N?QW7`amN;JW$_Ng z#Kd3}A2@IzUiA+@{4i?X`>f05TEBk1l^2bUh2GST1B^*Y7Vof$WG|e<4?i5&9h$+@ z1Mf!!-sLMS0wN#+5k}yDenTUyZ|aT+h=2%)05<89Pd?e(XZ_SuPsN)Bv5P?+&vGp2 z=0IT^>$`!*S)9xNJ-HgM6&z963LAQ>IM0<(6B#&nheeA|L{h zNsgWe1V)S)fs;J}Q#eaY3E+Xl697#3vvCKYIUtM=Lg_uhLiuJc&y zS(b|8XF)9~nOfjyUt1Q%i+~7-Km-twe2;)ZR2M`*1Vo@N0;5Nd9zJ|H`>x=W!pc;9 z&GA-edl@`f9(w2@wqZe7%3DWZ)TmMA<>h$BQzI@kOa@5I!~=(!I&$fh2#A0PggXH{ug|Na5BwbS zYhFhJoe}{N5CIWr7y^y_2bsGSYg_Awx{;%+A2j6(2mxJt0l^rih175KYs(c5R`%;& zeV(1l+S>*X8aO;m2Tjcu0TB=Z5eOWCdTaN_>7{Xy~t2#>Lf+*V4yNAB3F zXCfd1A|L`HAOa#F0uez#l071ZQJoM05fA|p5CIVo0TGB?0+Q^JJGSbX2#A0P>YAW#IN0#%U85djep0TB>^ zkR`yL$RXP{HB1CVKm@i)K$3l%h?F4m2|Rk}VHe03Ao9mqJrsc|0(z04t^*Mefp8}v zCz)^`LA755L_h>YKm_yDVWA|L`HAOa#F0wN#+;YHxHQ{yXY_XUuA z53kWwYehf=L_h>YKm50wN#+A|L`HAOa!~Gy;wsFRJ#a>fCz|y2#A0Ph=2%egMcLaHUR0g z2#A0Ph=2%)fCz|y2<&146GjdlA>F=<2SL?~fCz{{Pzfwpu)yhbrl+SD78aU{jyvu+ zyWRfybka#%w{Cs?_18(h zX3d(Xng^K?`UBE0|p`}EJ8FMljk2>lok|E_`i(sWCKm70mF*G$MCZKnn`D4J=%9n1c;X3a!TkKtLl2qwoSdBFk3XJz8PG=_d4yj4 z{PWM8V$i8NEiDa0^{7#!5aLAo?R$QHK4sEzQ=s=Jnwyr>qo}B;zJ2k_@jdWvV&J$Q z%+abV`Jed@4~UA3i!J&7!3Q4z`GE%>U@nB> zXY@(nlS^MkAo2PT=rxK6T4vL>f9((MuBw%Vm zBqrYF%a;!vIFK;9jRH+PQjcVK(GZXRBfZ~3$W8*fiIn6~gLl37X>jU_E3Uxt10~wK zcW=&`zQ@MKo^#GQ2OoSe36S-~zwp8fgy}CGhapo7$RHf)Cdc*HU*E4^KN66P#K=k_ z39Mhg-sB?u#v5-CCM99m5`OT(2MJq;0Yy`pDnRw8pMD|@4o;Y*`6T?~k3W)_l7UHg zFg!CgBA)pY@rNCD7-76hz`~dkW@-d3^X}r}WpTN8CzPs06 zd-+82b;E`Y0Hl08`>Bqe)=Xo?&KpvNN! za$)*K5JM8{uTi}|6`8N7Wac(>4bg1evQIww|!#}f~Zr!>uX}REn3#iK)U+P zN?qN%cc)2wWpHQCoN4BJeC2rvPYnF#Qltn(HUT-wgzWgfand>b=C-#D9yD-x$Tm_9 z69EwjO9IAU9Mdd*EOcPy%9VUtt{QvpxhG#SZ*Q}2c*vku(P}7K5+hr&h2xchhX$$< zdn(3P<8NaXWlZCI#S?~4rV7?6q$FWXuzOb@GiJ=-t8rPe($owf_ld-*gHKAUyAa%3 zYL@Wu!w+N0X6l052~I4m)B`i+K6^187*A3Y83&~5_%1U zn{U3kW<@3jwTdkqmlZN%3r7b-tY%_n8pd9Zv_+$%$eH=z^X;9I;WP6Y3+A$A%SeFM zH_0rgCNr9tz-jh?0Ru`)O9933)zNqFihROIYQGNdJd~I;X%eTn0RHd){tsfcO=Flp zaQWehgaZr@d_ae{k54V;t9M;MW0nO#bLxvPzA)1mzZn%N0uf9=@;!nFS6veU5fFj@ z2w<1xi}@tbu3bAmjc*2lIdkTiNOp}RU>rQK<`VWfC;`cc!#Wa>Q|wEFOE(%FlR05* z_6T}2EAYwa_p3>X$rh={QBhGrv8-IInV7RRBTY=*g_x;@cV1*G_H~{_W39(zj)%{+ z*ItWB+oUlPnd%52+?g0qKK6195EjR|;L_nBMb=VRiT z4DeKeWfDH=^;HBK0|7b7G=@=DA4Na}M8KB-D;M$ZxbMFE%)&n0NU*r$pKUx_MvNHo z>#x7!>*AZO`ukaDorTLd>pL+><3NIfH@@;nH$0Uo(5OaB$@wkBL}E_H6&`mEL^Bc- z9}=wHKKncx!!u@Vvx2r}Y1>nXcP?JAz=g>6uEi&8mV{!YN39}Tea`xPr2)j? zRKs>U)JV7vm^{S5?Suv}6F>w5%9I9JRuSO1!b|{1e6%%f`1I3H{q~(%2WD^7{~v$+ z;nNtt(q;J6^iE-dhvz*BSXase1g33IKm9ZvQudM7{t)0K4Nw zR!zfeKWcN0uRVv(h=2%)fCvPIz)t=k8!e8rwbeK@7Q3C`+kj|8n9!8MjC8%JbKY&G<&3Aru8lm zxsRI)5}ZnLWj3W*%Th^+Uj)AFXiyBg-tpe6X8jgomZcgw?p-5c?9()c*5Wsh_QhCE zq*<1VQpdp>#ffUi;7vTw0r1Ag+a9|+4kxH;QyM0DJW|-UoW~c|GE=|HQcZgNzqw1} zuVTJ>fBJyJ)7_MeR|#FF%!@9%i1f6IW|)jjy(rDB*F+ODwP2<}E>jDxI3z=M<9I_n zZaipf(;dHkH=Zq2#KJFyy$5lP_?O)vxsb_HzpY)ixwwL6?pa=^Eu{r zpM}C!nV_IFyppUKo@OBZxw`JS;|}I0R=fft5aI;t_oH1~E<3%gL+8Kx>Z|9ScU~O{ zbV>w7Km64IoO=p3(m+XS$pKowDuCk*&r9&HLCL@K&O12a^DH5-wFIy>qDTdxT3VEygoUVM+8Jb1iT2~fP-rfYg6$Y@rn*W5dR&ViP(4sn?Bw> zyf=xjL@U#oVu#E{DWN$+!C3AQgl zNOf3^5djep0TB>^NFX4KdnAma`T&8#{Gz#&m*vcGXF1!YrljUCuH3w7bMw7pns@nU z=ieQrRJ5gR<&xa|&CZO(CM}~{=Wa<@{QV|Z+3GHPRK4a!hX{y(2#A0Ph=2$*7y(K4 z21Bii0z;rMzj)QsHCs33yFKpqU0b(q-;#2R3rlBzw<348y>)Vz_?Y;jveKOVwJFUi zV$)jHyH-zhWn9~m^=tA=Hk33^YndLMwJF=Pw@V^Vv-y^_U_aqE7iLJbEYr&@|_>HtSU{3%ZPTyxZJK^;}@p3 zjBVSkdBuiU=f;e-P1;3A#pIRbuPIpCV&CXKhjvOxOzv(6+pCLzYdx!=eDlJoE2BM0an5*~$5T>KSn9~{cSNsYXC9H9n&e&4 z(!W;C`)#RbYg|TFMxP_wCuLQ=wzA#_FFoYlh1Ltd>s^jAihu}+fCz|y2!s)VMj_wB zXgmVd)bfJ$u8OL+S#RgDW%I_;l485f7XRrNg`bSy*tKissi($tXzO-hO|Ci$Hf|{| zDo$?FBsMkC?x>FAt$3U;pQN(e@)sO%+i& z?zO)cESWSft7Clo-J7Ll#yFj>S<@EJow7QvEV)Os%(&pr?^`6>zvU&AtuS`tdiiBuDGJI*!6!d{b2Jez4mXLks4E8SZa?>UG(SX zoJGY=Q(DE@OE>)R%rBoV?soAd?iT;EkHkM!`qpf#sC1QVAG~e^XJWnd5<35 zTU5W-JTEVQ!Cwm(EL@VawTw5JaO~f&Z|C;S+%`vEVda{28)BktyLD@qn4I3UWyk+| zrH}}SfCz|y2#7#f5s+jLtKr)2#uop1M^Vl+x5K&JIcx||Pfkund{L9rZRxhDt|e1T z7JJHUHdZckm2j4SZrsOhwla?=scF;rq$*o-VNQ;_u#i(uyB&k}euJtiwA)@Rn^pB% z?s^=aVo!@$TZ=J#>RJO)~p?`G2tzQAAjIv4IVTw!29>_ z!cM8`1|uN(-e9O3x}wD1wllJUMGqQL@94Vz*bR=4x^8?%zG}jyq!a-FHX( zyz=ktgwRSq=Iye%#Ix-S=OF7}z)WL&y6b`R` z|K^)-Qsd%yoeJ-mU%q_#mMvSFG-<*P&G9i+mVYKYNc@ucc$X`SH-dA-#4xe4C1YKmvM9Jyz@?l-M)v@*%Bq{bYeW_RG!C^<92V($VlnkyK`2SQSdv| z)OKB4WVJ}2|J$^pc0rca_9)@_MjpTv%(XaHEVmu8S#DlE*v%L^RK>&uB`0ra5SqH zqBweBd0&JywA-;7w{W?(*zI_y#Mtfl&TMkIwqn>FI54JrMVA4`WbJ-*Ol&=0Pn3`x zx6cthyYJg}^|JNZi*r}cm~SggPD^W#M+|FF4r|bZ^>-dBuLyh=a$Y-=<7MC{mL!Nl2%P=mcOc{!-0UWdeY!@Hg`A*+-`uR zBk8Mkd%4}t*IbutliSTBiflaK_t>-F@S9RQ?XaDl9wEhh_Uy^$4?p~{WXY1Gq$F0Q zBHDRTIwo~gI;M6b;0Yk?OG`^rQ&SH={P4YdH7&`W93&+gG~X z>)r0vE*D1Rg05Yi{rmSh|NPdw?_NCrxeAo^P9N;Z(z8$Jo~g@nzIf)3uO}_-aco+z zlbUCAwMQXSZTNr0#oEeUwsLoMggx5nh>mjd$pe7@{KvPhSh4c0x6(UzZhOipJKdtH z0!oTX%Sxlto9&(6{lugJw-@EiU9kM?*cFr0wk&6ogC|im=5@5Y6TkZ?R*=S4RInJJ z#O+?e^rmm$4wnsS-OX}luTP5*>%DvTMx$d-$Lt;z6-5|9ZxlRpD?DgiE*J4w+lk+E z&pr3wfB%YtrS+*yc|<@2L_h>YKmpxm;K%DjK99fj?Zu>welon z;8kAfwz18MtJ3Cn+1&2xC92gQXjZ??lyY0ZNVwwgAr<$wXUHf?PE`&-4g;SZxTR{YYpY%5OetkJcj-eY5-MnzF&WfBSfGrc9|v8+@{)Wu~TOC6$&JmsL<>S$RceajB<8W}oi6XPtBa9?%*^7JHK>Y)n$@b{9Duv2Hi-CA};(r_6?6cPt7G}(tk?C}HEHAJxnYf~?FxO*CZr2|}GpZHsUQ||C zR8~+>wl%YTa_8P{?d7Elo*H8tJ9f|PZ2VQ&xN-?wTqY%TZrj#hQ+F(`ZO4`^JFJ-b z*NT*QHjz)n6$Vut<&5pp>L6$P8C$Zatd#i2f{?dvFY?Cynb_l9bB_E!7un-a`dsU~J*B%W}> zs?^lw4?b8rV@7Mcy;D?F^4j0#etuQ<0XL-fIL2*r7Z&Ag-t>1)-s-LH^4>jrI?HpX z|KELyjNKl) ztun1sNmj27IrHMMY)3`0?WW!1VZyML-FI;PZ_%RdfB`K!cPU!Atjcv}=MIE;*REaX z&!5lARI?5h?T%v%W_9E`s+|M(nAWXZ@3F@oJ6Dx*i+~7-fCz|y2!sTI9dwdeIxZ*s zUtfTbXulfK5Cm{@?|9Z(MLl{fXZdMm<(i6$HGEc9uBxnLm&n9n!@3V2p4zNgu$$8M zu*15)@WR@`gXfo(l~-0ab2$1Ht;_gf#M1GX{PyPY^PlZk^xm1VU*DQO{i*z~o?CL= zRV_dLlx3T2M9I$S3tP8N7&U6I`|ocO2<>iq+M-=nhdxb9;x=XHu2{BV-u!jbHx{fb zD9zm(6`P&bX;E}y6|VB~|8TJtkH=HVn$*J&uPz|~k0aQyoyDmftW0HnDhGSWa3I;u zQBY98yHoetYp-CBj>;E-1|#s+TW|4X>9NNiYp@z0e)!=D6DBlRb#+w4E>iqOhp*2Y zFQ34^!0xq^Cr`fXuDck=MT-_${hc&vQp=V+)AcFPSHkf-x@tT%hdN81~X3g5AO$g)4cTm2EaZlCs9VW2namV$#_14urddzUU z=eyktD=X2X2vE<^q5W>XwdHQR?Qn_p%8=fv)80=#<+}Rng-J=c=&+7dq+j><8^1pL#A@)PePyZudHuYhllxO&)x(V}SOMu^OI~oY?>HzQBR+hq6+U;ALbllu`$m-7B=XgBeTHtccak=K=s&ekRhuwEy%Pw84 zLUumTv}x0U0|$2R-ksMj<#`>5_)VLtUQWeU?*|=p(7zQiPYA$N;os8qzXPnj}h-n@Ckh7GGnb=O^YU0|mcvuDrVd+)swsr6_~184dC^Uu#b^Gu&g z|NQgM!wx%)UnhQ)2y+%$Y^5P)pMCbRzM24XoG$b8`R=>#B4;nZ{PG)bypc&1XZ!T& z^Y`C>GY3G&Q{cxRf9#WYC%+onwH5NmAAh|5`s+-hTD59bTbg>rdm}R0d3?I>zWW+n zehXZ&Vnw@l?aVZ0n+dphR(r9sbM+EMC!-}reA%JKfdz; z2dtbiWBS7n?=x#wPlsbE{ul=ynAyI4U@F+YQerbQx?g|&mc930_w2KarcK-I@wB$t zS~#6))tkqoM)8MX-*k2_$B%rC+nqmjXt$eg%Bt`0Lfwr@Oit|6e>Yo6jBV2bcL}~Q zB(K_}{fKi8*{6H*hEbyuRxDu?o@LFNrJi`=pmWX%tXMZ~V;4v^cEs?;SMF#0xK}yt zR6EmiBRTZYLk~XqV5=8W>lO+H!k54?)knj$AMJ9*6<6?9;vK3E@$}(`ACl|kmtRKl z?@->l6JwREDQfG^va8Pi_~VaQpnYmbcUlkqrca-K#u;azda;h1_c(i>H5n0hjP~=- zKY#McC!3f{F1ZBpN0wV|xrG?A@FEL-1_|@)xAB(sea`yV7hvN?1f0pW^PiBvoxMUi`@?pS=3&tH^N-R@<2X zm^|p{+qZAc^d^R0GnAix`YEsVyZY*@`E#JNwI$wWJk})|=>v+X5qB{R|J%&&lYnP6 zUw-)|PhD=f;Rfr}|NYOC>A$_(* zV*va8_uo5o=zyp?;e-iqv5cjA{svX>@!mxhSdWOIDpj}OgoK4 zBR)Gjd-(9-O{x!W!`zRFL=#ivQ%^lb*l%};HzwF8o_GR(fM(5_Sw=X&wM?8ikz_~{ zGWr~dAzDQVOo{28ag|xKW(|LFy!h;=pMHA({r7#c@D)=cXL$g|T-vWNqS$&HiJLQy9uD|~J!Gj0$hivL1{*_l=p%9)hU}?rJ#K%xtTP~y?k_epy zYRjsP3kq82^wUqrKLMllM<0E3+G(dz7loK!U`0Oi$Rim(^46SqFrfUlK$QysWqjwI zcbZ&SeEIPq1}w;NA`y8{KmGKZZ@x)llg50aM@{=-n3I!38(4=ke*Ac!vsM-^NUl;# zyPJ4y_Gnr2MA0gcQ^3TQY~?ip-Yd<>(rnINd+oKxERBNX=aJt`;=R)|0l4X=o3J!< zJ-qYII|yZKvf-VKFa~K#KqF%4^(pPU@4lnW{JoGDo+jfq$y?=n_h{k5g^V~a;-DzM z>XtEDzI-_^*TW=lmEaxln}DeZzW`iOTnuyP&h<`D7}v_tqeqV$HxAVchf_~IwWb$P z%@HRfLZ81EM#tw#3-PN~ts=qHsZ)7A%+J|oj^2sL&`|S?#$O4Rx zXfH&tF~_ocyS7@4WJG6>(dXdyk8CoLs88l0bRXXg^Z}7ba|Au2%_o=nic<$l%kL=! zF3?u4T#2z0nfuH$&yb8M6JhiRVc;;|Ch+*H<#jjMuoGQS!#W(<+bmMtSA4Ip6UB|s#X91@c-wQvm(xa_jaxVi|S!?+lz zny@)Y&)8vA{Ws#D|A}D-Ez`E+k3Zh@h;v*FblE#GBfj5$`+PPgA%`5o-@bPOzavfp zYT@q%^}KG~I`8y2@F3QiEyJHb9R6yUiE$+}yCWH&{9WT~)ZW9|^46Y1XF`HNz;*kUg$q|4b4)>cdPzpc zw0`~8Oq%4kpTXAcGe7v?qkZ<7nv#MrF3-wBv3vN9ZQtJAym?VZ#^SWJ2}wy4FTZ@# z|K8*LHg#tr*RR+-<(1_>+`0bkD}R6b>@VNCeER4MCVc(Yl-18YM;qK38B5aB=iYRa zPZiSbK0x$!2M8Ro;e~hq^#!QTR=*$TrAwEh;;;#ts*SOgC2B@yBU;!~)TdP#e7W0V zMCP`LnUd^A1#vGX%$*c{h`c11(eOwnQv%wI1V{^?!nxrRkBXo`GeJ22{PVG*qTjgr zzVy;d$Sq99)JQoPe~CvV^I!mLCh>?IOT*XJ9WtWOcvCP6mN2stYQ){3wpvKz_rU6E z#H~5Y+HV{O`t|FF5#LJBB!vmfS!bPv`Phmy0gSvp6Cx`CPcKkPd_}Qi*~IQo81H>- zohA+TXy!6Bn0XCC%S68Y_S@KwP1yRZnTu0oG*X}DJ@CK-ye^qYrYb#p^f1yFpKvl_ zgC?Fz`}glp0JVm!CBVTn4QOU$O$?t`UU}t(7hY(-^1#MS4N%C8sg;JS2qDc(&78I3 z2{4U9#hDn4t#BiZ<$)n)D480N*E_v=#$!n}>lD{5m!yrlX1j399kr!Wlu@Smf0`CAql)np%zeHN4F{5F^W!X>Ar7$GT zHpyEhdn2+U`72-FiO7cxoi&O1=|KGd{PWLNUJ^5(wGNtL zogx5F?-+*In!@m`3mSZSrw@^E{eHA-%Oy`4E+HM;CJ@u4Nojn1xvlzrskylhUV*eL z4)Y45N>?fgM9`>cAqQ6)R2SG^L-{7XnrPe{d?CWuGj){>H~EKM}Az7p%ffby#&N5Mvo>D3DD- zFlwVF(Mc4G4+52P3SC8kcx2%Dg2Kam$t1y)&u87;L4ILGCYjlxgu-j9#VXJzfRgt1 z8^W~*Vssg23M(ZO10*kk13zb!jTKJ-Dai!JJH~{O{!DxDWkZ)Bg6R~`{IPGMQ1Kuz zX_(ItiSrSDL)Lg<@%Qm^_nV6n@V4N&1xEj4k3E*UknBX_wSnQ@03=L<5jQ5Dy6{`U z@dq0{lsK@)qPaOtd(0=fh71{E!ls3UF*Gw{v69g{<~c|=%aOr4Hp?hWO*!Ak4Th|G~m*r6l0fHk2G~Lq0O2IOm*myi*cJ zp<=|xpl{-9()Lad3LHt;(963tJc(!$%uPzFNCtqFl4#+k+Mg=8`s54Ad6 z`fDceu7zn5ikbPaSvX+IWN^7S`7`8^29lAw&4YclwA7 z|Mxo>k=;|L0!1LPY14wlL>7kgWAEOu!ChDwsFHW6ob*mzVp_Ll87eO_!n(zV<+jpN zPgxmvdh>Q8X4&@i^!Ol4_JYkN1sh9~V^b5NlRQF76O(AF|%=r-Z79aQ^_(&qZ zxflXwKKK@)n~|ZEX#^i-TG~jt+rwAr6?XTVTtF;si|?jX`{AzR$w7ArFnl^0KH421n&kgUPm2u z6uIgq?_I1nA`?#xP32LHcQWrV-27fr3q+3470WaW!_ zj#slK5f&rK9$^C-#O|c@>={+POrIs7g@653Q2hus;PqY5ei{p#+S>*X8d&A*TF2pu zP1u^8u|7I}lgqWGvJ$ag#7kY>?p(KfGcShXb)|j#ruFJoM+pHrBH0G}ubHRg)cm4AvZ?y;#JE%K@fb9FZ zE19?O#x5W(&TwlZeM@3R^x-8f+}d)C#IfHyEIBb!P7#n zG#(4^C`Zw}t+4Ja-f{yJFAPHFsT@VD=MCG%I$Uj)Ac zJn=AjnP^$&b^_iOcdl55!h%1Ceuv}MMPTmcO*s!sG)b?4MZ%u9K6(1r5 z0`B8Zzvhk|ySz`I@{Ekl>FIx6eRb~tEZRFl-}A;pJq~&^De32=B(_KY zJ2iD-O3L))UT24%~}L&vH#}irj|L3Ive& z7&Q^x#N+khxA6Dgd(Rk3kvRB>qhd*hSVSdYlS7)*Fhm=XC>TUPcV(14kJ`ydq~+I6 z*l%};$FH3>6X3w{gN7lb2>Y$2wza94b?Fzm5J{Lk&8ku40=+}e5syBgo5(W4J_jlm zYpYMB`N|^;d?yewOm$dPKmbcNVid7!5>OqTHDR_wVWjXB!b1r&B)Y`AOuxC1+O!I2 zcndIb;**g@N-{k|?vNc>hGE#0!&4VLVN4ijcjg$(G|)rF)!w@mZO$=6Brd7x< zzB2Kkc`(7%fv`!yRD@r|Dx8s+ z0W#CW7H(xkqodXM%B<2%IjmDAfa2t8q+T42EZ1$!$xOO@Qu38+iLG>?gijHgm5oVi zrmy?#+x3I zH4~tWX|qYsA3oDLW<*wY?`;+NtKmQgTW3wc?}#(Ga_i!`04nGoGqh zl`^s6YGjJ!%b1B46HY5W)B^SU(XK65wR5l;B7dJuRhjJi zJEOReCb0E~3+>GhPwaGTR7^sk8anTjPof@uwB4db{7Gy$=9nfo-IQ8mhxFq4&sIdY zjBj^jOl-jF^=|*#Wg8YuTDy6E_Le_C@XY@@v%DxCryZM(8)<2W4*T7C=bry=`0Jf3 zu;J__YZiaAIeKHe#Ms1nYi4KXu4$IqdTUXRZSGqGmVe$WDrzlG1s7l3rN%2DDspEP zt^C@Vyhn1Uf81CD(y)yaCTzO)+U`+No8#m2h7a$2*Ihovmgg@i&Hgzqy-!Tje>|Ig z66kBV5D38^Wc*vO)p0*YZ-ooSy4%Tg0)uf)5o6_|%Qy&yyHyWW=k2aw^)9dh45es# zACs-$D)6Po|K2S#dye!y$X^*_rF z>Znzx!ixZ|681p1xM{a;xtW<2fBhAen3b2~iO(ymx%RWF(tua&)sd2tvhwnZq>Q%C z120(ZuzTiz)uytn)a{Nv=%6mQ-pZ?@ywV0M=-9lr*{?5U{yK5 z<3WM7B-d>BRI{9hjNw&U4Ov~p)FsItF+&;jj>KhVuG{mpoKB-sGrO%Um|w9eAtjHk zWjq_#Z%WTfNo|rG^cL7`t=l)N+!D2JR9VR#dUgWC2XDO+=Wb zS)W};jdjz*W6GH7>+sjFqi~%HDFTx0AvGK!-5B1Nn$~as;yH=j%JQ}ruKH;0-(TgH zR1{_Qaqd5?$3K!C^L{WFL&hb>c0Z_P_k*fHt@>z@=kITAxjBTlu3jCTot;|yy88f< zEnB;mC8rKFy4zizm=v9oZ1cF;NhUU-g}cQbxlTuJ;@Y^T&H&cvx2VFLoH?(&vU>FB z-gZ0hu8p?a*}T zsO_>g7nJ0emU@!o(qf`wqU_N&n}dy1_~-WEXa3I-P@D3LKrg4L@Nytbv=R`Q)X z?<^>Y;q}Z;C%ZkCCMCqBC3`At(Wv*hq?qXF(uxwdy*xTTai{9oR_4;8qWPbEvSjpV z4Es%Owq%C``OX-yJ!e93arUpjuH-eBUAm;m?!GOOIxhkuAOa#F0%1Ww8$pJ}FojAZ zGg>A_CD>eUSCk{#>14iVcY9pPX^HU(al5#Q`T4ejf(B^A+WGT0%$SkD%bs|rQqP`k z4?Zw4Il*21l);I+qQg;KQ4*8pXx1vYe(f6;E?hHlBK!I_wcFX3vx&oz=5+Fc_e{IJ zDPP%$VaAMAQ>Qin5LF=pA|L`HAOa%L5CkTS96Ca#_J$xGF?D3NPTQ22SGlF4w4C=I zmD=nn)q72`Dbs(Z_6F;0ZdTTuAwwL42N#r;mCl}ha5@&yP#7;3Qyh=2%)Ko}B`**y#gZPzt9J~@_m zl$KSLIUG^d&KWkBr!plyIX(eF+t5c@TwFnVdR~(z1t}?2E-I^5<*i*C>_(KVUthL* zHM8CdkH^`(c~+0EiAnLfMLC6Kc}a08HjgK>RZ5$#|GoYFf7=rYKm;O#fFyfljAH}!A|*Ys%vMlXUQke) zUshRV;l{0 z`!sGl>CUBa=I2M}=Cb~_h*zMdq{ODDR(f0&u1cHT6CD*@;jV~Hv8Oe~X{DAUKx`a| ziMEUkdRt607z4C>dAX;uvclyero?88ijPle(xjF~C|U$WKmHeBhQZg*KlMb&mPb~_UZwzE%-ifWsmzu}87)^_gP>X>5!S+~j(0TB=Z5fA|p z*cAjM*>?r?u&s0Jmb`hh=S}-%L0Lg%=VrYhJD`qwdI z7L6O1o|nfCE-`j{NmkSH)p@I*pSWVqhNSqkB^%~1+xVBuQ<0Jv72A2AKK*<7t$inr z?Bzv8>%RRq@44spU$LS*I{HtWZFyy7x!s=3x>&qrs&|02I~*Myj&z43cEyUNH{ZPc z#~*uKF)rc>P(qbj`a@ zf3an0MYEKSMV@>|)ozeBm#Z?~laW2E^jr6DQD;WgwjMKpt(sDOpxSx2U0ht8(}~5| zjg;rzdAy){*7D^=4?R?toxS_nX9r5bFa7=ZX%9W*`RS)Vc6*ZDj*}VNx34Nn%>J`H zIV-Mv%e~^F6W9upnM_G}QSQ1;Z$9+@?41W-9M#o@xA&q|FSaC0vgKZI1A~n*V7h6h z1VS+oAdpZ332DSm2#^2)0!at~LMLFVAs8@VFgC^AxXQ9DS-sa?Z7=_kC(OUdlB}}3 z+SQ(kBi_!udF6XEyXW1x@6PIj=aw(MCd3h4@WQ2%XPlN+oM!9^v%T@c~hvn9TnO7aJv4n6CSQH76011!)36MZU z2~e^}6nE@a*3#7a=93?_AM)oU7bfbGeOM1El|ZNFq>O`iJ6@bxv**xzFMNK|F%_dG zXNIqvpM3Jknl)?SNskvlL!;we*Km?SbzZL*X~_2mpRc~8Wa~4}sLbXWS6nglmb6w@ zmcII`{EIL0q*8={L?B4K`@Gqd)0Vv`CH&r8)fE*T+O(;?s>+y{ zm^*&_l!XgR-+OQK0}o7VZ%1JF(Jq(n%RSZ2*2arcrd%>(aJBQSm?qHL+8WdCkLSkY zi%#r5$5BKPa|w=P%nezO4Gtd19y5e{CnbBh36GHSw|%kK)1t^s$VfJ(nYD>pwGl4{ zg#g9kOQ)-|!_kI-Cao1UwaKp3LMe1@n6}c=(x#@SjEoHEb!@P*!`v=d*`cH%<&8#T zv&E8JTH3r}L*1-d=@TXlu_eW8)>N-rg}0HWOC<0-(a2;KDsxrx6jkz+6k}$BK1HYL zlI${RmzCY+aVlggc*0b*+IN3dHfF-;%`V7A|!(UZYYfjZAhIE1E&Ye3eDk|XD4&ypDXm_OH;12l? z5s!X&urgJvbr}peYTdoNxu|I9@*SaL3~gIAl&W-zyknjD&{ar4n!&UY1C$_&oR(R+TCJ%6f zsrCEoX3QA%i(h2S>Tb^e?j(syug^ICcui_*36{^k|9+lQiT9{#4jpQK@x_+H!o)&M zM!1mx36KB@kN^q95&;H+jHS^USX&3}ka0vc+c)lNYq05{O;uX8Qm0iyHOs5p_I|Sa zjq-;5S&3s(Oj#O*&Y(85v?aDRYO2@xidVXKtg2}!M_iMTZLq0Bn!^(YjxpGffL@12 z7rfhX6dU$C6bcW_@EslQA;*GjuB>c3bVwtW!Y>6&QL&Z!{Rd@QgFaQOFlZHejY^|c z$qjmmNiQ*|B^tF-rPircdacSJ^Qk?KA-zP_<@D_Q{NUC%>Qnu>2~sIS&6$&T@4eLPA|ED5fCNZ@1V|v32&`JMWI0Xk zu{2`C)mFJop;Bn1awUQsD&$bkQngaj;cRsKTxkXGqX{I@-YrzTFGKSrZf554hJVf3DAv)Ml-$a#Z^+xn#z#f8GBwbxBE+Zn&Xh)TljgzB%Q}EA`{B5+RgZ z-P$E>^aThdQI2=jM$D0rXjW^Lj)32H_ywuZ&R(A+#h9U0>Wb=j zWhRXqn>r0gBye{3n#)Q%9Iac%W=>2ormCfrYu8uRRc@JaN`6)jT*U{uHJ6rFtXcEL zr=RX?Yg1-qz#|6nV_<@}+Yz?iBRIMvA*3_lDU+0xX0>WJY-kueHuczJ2Un}By}jY1 zk80Pi#|ue2UlaQaDi9q>P>9d+< z?ut2+<`nc)%+dELbqak-q+g14^ky*!36KB@kN^pgK)(r4viAqo%YQuceEI?iq#%?v zMul6_W^=Y`)q1%{;g|T8UiiT1bCM=IJr1k0&E{xt>uj>tjoJjS&trGmTI>z` zDtF6dQg?AnMQKSzLyf)BXMvVf=wy;4yU+RguDv_gm7a6;!imR>6-Nb;YRY!kZ2DlI zt6rYrvbx)ihi1?AOrD%+v84HY`}XZ?Zf=G{yI^QX0w+SgI~)%D)$8@bnpKC%)FhE8 zH*HFI|NRn&qtWf2G;0=)3bk}}bkx??+H5v-Ej>LwGc!}Hy|J-z_rnjXo_*FNl~owB z>+;T2W-lCT9A(y8U}cxeDTlq!!d$8?;qXl%-;u)Yjd>^&1CKmsH{0wh2J(MW*uJsL+Ps@halR`l}(!omA6ktwDHqt;%H7S&X^_ zm(ShlvU+xJwtcZORbvk1pJ6iPYPDvpob`HP!?(3IHN0~F+hayMlVlwptF@-V;S5X| zmANoGai-m~(fiHcGu#!5NvGAPq(Boxmzzu`yfqbq8}D4g!c@4*2o`tfZ@9JCnws3X zxyi}NX-?-cb#)0XEqhg}J#}@CHEZ^imQJ5ALD|r-`=gI`Z`)R7v-z^K0~QO6_XPz7 zXP$W`{(kx8mm5F-JY)NI#Bl7iS<~g#M17hwb0$36;Q-_4nw+%MwO3ZRmPw?NbW={3 zyM0#>NHtc)qSuH9X?3>izwF=hPt{KCRRcKhyq`|`GJ%PuN{1>55F z=Iq`3t<_qzZe49z*{Jq*vqUmSBAG0aG}P2oq^DaaOgMDt&_5o2IH9>Yy{KqLV`H9N zo-C6g(4@lI*jl@}JacZN#?shP-QcKjD{7Nebp<)H@>XMIlgs0C8$C9y0#dXO*T4RS zSi5*nMqXYX2KSg_y1s(`{O3Q988hbMi!Y8$GlW`(rP4@taL9H2@Tv3U8_vxpf9z=~HABFzhp@V2=9G*h?9*2Y8-!AX|y0myrTZ(IJVqy~3TAJ0#DWlBA zmHS$18!d(ugnyJuWNx3c!`>`U^jv!L>C=y$Xy3hV#{3*z&V091TC%-r_xgR#8hM)2 zmD=#F+HKRzWGOP)c%QAU?4#zIjWznL3b{tvRyxt%kcJ592+|^vxC4O>XRD)V)o6tx zTaI@;bwxq+@856IYM0z_!}L>55gc8XELpN(!GfBa8u+!t=skKg)cgOIU1Ak##ooQ8 zt*ynocjvlXh@+VAa<%T?@9=t4F#(Xv_3(^AMG{G?$CF%Nf5_*P1p;H6oAW&$G|!+^ zD!Yz%WoQlr4sn>veB#SKAWwDuY6*@CLj#SDQW1 zW>X|++f>=6LX*~1kT$Nay|%pmK!PbT*OVxeB#hD)7&2$W)5fH>=+p+aQX@ZXt#|sI zm;?X@rl&#B5fw3guv^szy8WAul(dEKe_YHJL~J~|M8E1Jow;)%a<*Ie@{L2R5bFm(@qOv+eUU#(0Lfyi4!OO`q#h4i|juC{BtB8fBf;WWB=cSG0F+t zbI(0frc62Syz^dq>7~`HSL0fZ@&<>gd0%|-1s*$>mX^Z8g&)T-)e^p9(d=7px#jJ* z-$oUB~!A;&|pQbsjbcJoBq4cwnvk$DKMLjPPe+^K|64wiiO6`~3#FJPG>|pB-K|hxfGk{jiI}0N>*GA4*8*Jp1f< zH{6gpX;N?%aFW3myhluDPn?)?&pmaE7aw@y3G+AKv;+dBK3}R-ia7u((jJ!V9yp|X zy-t_QS5=jvP|Q>))XKwdKd3YiXz=;!jYj#rd801BV)nv?Mw3A-TuA5)niH4I$)1p2 zyrZnDw83d}CnOtZPMI)adVW$$QpvWevh}6*wv1#`@@UIw#LBF*R+mc;NC zN`ePpzx&g~dky0V znJ!cf%P1a2zV+5yLsUx*4Gnlw8sY97fBf;VF-N%4=&A0r&ptc*?6cwXiFp_9(CBH{ zAXIapH(Pg_31jFB@(3 z``3CroBaOS3I+Zl^gC9S;`O76GFg+)*JLuu=FQ8z^wRMso~Y|(N+2`^?&ecwPQbq- zTb4IH13pA$U)I)C+cPYqlg()osmy8rroDEDO`hWRHJUYvYK0nl-Jq2y6%scBM+W3x zxk`!mNGa43hr-p_6)Zk@!z-k`PNyz8Id~`2BoHwIFx`zBHA>LyLZw+*SZO2h(id_^s8U}>i+xh|6iHcY&oyxJ70jH^1F2$Hn}(7d=v8u zl!i*7q{R#`yzl~QDK9U7|NZyj?15U)whJ%35D)8wJZsmkeg669u{H)$50+*uXGa_0 zE&`7r_~6Z(HxDfre1V>O?l}|!XA&4MfBMs(PMtaxUAytd8_zxWT%f>){Et5RXjxeq zjMEXAGl+c*ZQ`SkK7w^KxXhbxz8Sp^-h<(TG5doLKETR;4EJrf-6k+U5)l+6}Ti*nuiMj z9SN>ctU4AG2-^UcC)^I`5k^6f?_hi6jnL!Wibu{uuTc(eRoq{~&3@l~_obz!U3=}d zA`{$Pxa^CHip*v+YB}qyvv3GI|N7Uz!l4c(e>hw%T)0ro-`i08LUNNuvV6t!;4I$1t_@fbn750r~cf`MdqL*$ zzs|VgL&*={+&b~RPi4B@9#0i)-hlvS)9_1?s#FqI*L%gmxDj zsZLC^oO4df`lM-^yg`1A$z*eAZzzKc*1ve*ZUe`Foj}PfwXrclX^3 z{_~%LbI~0l7 z4MW#L1Hr-#vGwY!um13dKZJ)j7LFq)^cnOze!^j@hfCXwFTQx}vB%;GxNvmu-o2PS z3trShu~31~Qpf}C-dmYs1J&=B1>d<1bJo)64@aK8?<(Ic@+a{E- zX3ZM>-V2&TI2VmXld$uj|NJK&BVaayoRA0*e82zw?@<@T#NYq^cj0tMK+IJj6XBkR z$p&;h3Wvmb=bd-N7RFElBZZkyxABD(gTM{$1$qY~F4P-lI~Y3*6OQ(V2t$uK8?XeI z0J}c47ba=oj9C*zHjX~@&_gKg-~awMp68(al`B^UpVDKcM~?nA*IWbfjlaP*W=z#E ztkAERG-5*ao8SBf^D7jN3+CX#gK(6pXy3^y0 zaO52-_B|;n36q?!zWNG#Fq_3lEn2ilJcF_#&-yAdCb-@ zYC_4YR;{}F>Z_l4;tBLuunUMaj=TgV`^X#95cDWxj@pnfsq3sM_wJZ~ZT{?2Cu+3c z^MUDq9VUxGtyLi43<9nABp#J6F*Wa$)RTU-WyZ3Vx{RF&4uf}~LaV}41e1FOq${+n z3{Qd};$eCp`UQ#-P?{VyNF=BT)_v57`2aj&;DOV%AJc<`go=|-K6K7G?fLmWZOFo$ z=S>*3^!5|So@Hz-c}=zTNkdy{s?V8M@`-83%N~0({NO$QfZHu`bV^)KxW@##-e%>; z4~oy@b$Na8tMA&Zb#=QQe6Z%m8}l}9G;G``*^kw^+(=*;2q3s>Z{8pfXV611v%%(i z;)y3h+QPhtCgOs|Gj80`Fx_2#`Q@3OG7r4_r0SLbO3R3NtwjfjK!j*I$3V(Atkb{umPmXdUE);D9E8 zP=F|b9UZ1SbPYZvqSYDq=?ypBkeHYV!HO?1JY;~t#gqg7^ue{qN*bCBP3`j7>vMyp z7Kq?~0zC(dH5TCZfe1#~^UptDcv2yj3R5W1;V)DgG#RF6K#H-(2m&T(UwP$~TefTw z^CQt?rTrXzOw8~wWZJZ8kbtn@LRJbQ5*IV}qi_r>E+IrG3$8Jy)52|qF5udR1sYQz zp*ua^2uI$b!F|W#F$@j%K<;B|iXjU=3JH!4dvMF+Q3goj5eHN?R>2~Tkv-*A1_Y$jCELjdk!;J*G6Hw?S84Cl=+V&}9r)K1)bU!?h&qlM}C--)`oK9D#OX+aR zv@(ez#ZWMR>ZLmyimWBIF1&OVU;SRM1m6INz>b^N?}z6(z77)d^YH?ufz;MRUcJer zFqt|70jzX|=RCfqX2@j4GTBbId%axVrcn4G|E-;|n%uE735rB`3 zpml=}!VC@ZjMpBBi^Fjgq8h);LN?LK8IQXWumt!0{Q2{-ZV*l@cn1E5Kl~xMwBU3f zWeVBwfL*K0%l}9U5Esh{o*Lu|r6UuWf+Nfr%exUs%$`ok&2|LK5Kn0fu9k zWl;!Jx>zheLayK=I)%()6=(+R*J8F^^Mbu&Tojj`;#s4nvIL2?wqUm|Vro!EM0K9xLtV=;JDy^PSTrYQ(exdoW&@ zISLLSVx=P^fva)%;SJBCgdRb|<4G9Oz1;{$-k~B27_#w13KK5e_$QxyvbbMJ;28#N z?wF+Gn*pvXm>^@Mus8x9E@IB$vwA#=aYO^e$>ZY1i*YWV%!wrk35*)1c%l^^BPf2u z2)7}!iT7Z)b4Sug%J-2pnxX8A#-x~aY6w<#nJuRA$K+UR4zxR3)Jm*NmHPueg-4ZQ z9FtRUy1RLQYwJOi-wz|Z*5g4~7cZhg1_D@{+6<5PoE*)N*SzTy6O(7mXwS}WtE|)? z_M*>}NPeVJc~vUJ$f@`F4*2~}{Inz{;ujiU3gY)ysAy{RswqFXpkYjA>!;5+%0Eh# zO0v8TW#yL#9j(n0zp?O4{CHr-;`TT@-Bz2k4WP^!itKTj)n9&Dx?)A{wr!b*ZD9@Y z{6~DvlTXecpk5DEM_5jr6M!8J{wBr6#bT^QC|x|Jh6INifN!eE2O><2K>`OEA&sA5 z++X-v#e;M_SI6^w`~c%oym(f(L?2}eIbmzV54n&=jj#-gj_bii;inyPTu_=#+MYgrI`V)jItwgtQs@y;@QGrX7_tj4xBza? zu%g1D9hVT?9H7`RFA~NGu{yDd`H|?c(teIUMh9amlm^=kE(T#D(PP_!D~-`K1Ujtk zaQ_k7k8#0c62V!fw;SQeJ5=mDo-^SQ3!IYR8;^%f;(jD>!DC4R9+qH@0G>Sk=}&*c zln*0?I~qPvLQc5Hi>~t6)8kQmEg+kC`@oovyE6DJp(uyrkH)K>uB+$+H z*W~xZ1lNdfRs0h8e2o@M+M-42GbDLC@hQ8KME^ zI>CzsPtjqR$I`N33tVuMQ3yWvQKpa?&*9-)4&{gPVeE%(F}M&h4bh3Jp#ryW-;TFF z2yMX6Jbc%MhQS_r#u;ZIKMI6%EX;n`5C3*Nw}&o=$sDQ_foGvDU{gff1n&T`e0X6% za6lvpRfs;fVun~rKt{v29|5}s=LJm0;Qj!kcyRkMWbhk;QU?}zAY<7Ajvf_Ja0zfu z#{38J3y&T1lxK1!75WSg%6ML+*x6y~Uc5rpbhIz=IJ$tYp&hwC! z<3sVA5?n=8rEzbHw;mb>`3r+Ib|T&5jez|}-l5njZkUkcUVyiJH)9s=AULICy(nz( z(BilSFqC+pfmPWbe)u776Fiv06$PWaSX7Tk;r4>3+*m7t+Xu65EOQWMZn(>WU1sno z43h^m6+hEhdI}#ajI3C4{3If6Wly*~8EXh~C1;#+($e^$%$|w_ObN!buUPbQ`+H@Z zi_%S_@xG=6eX>QLZ1?-@S@RCrn|#ehqr6@dj97=mrnf`HCnb%(_S&42P7(_lN+NsO zH1|(`x(Tmf+OQ$h>xDxM9+|@-r&%H?RjC@MPxt2KwY9WBo#2ZPUv@*OtB-Rv24ljU zIkmN#j^=%1Iyw+dXNKSD-SgI0yWi0}TVdr>BN!%@^Ob*c=(DG!t*r=9X_UzzWU6$! zw$n} zf824$A>usjvZ56RdoWlSAei=H48~9j>M*$c5tGKG8WS*tR0-}8?lpL$L4O~4BY-M$ z_IQViCE#>S*u*Zp7qvMu`%M-o|;30!2Y4|DtYRts&JphY1?jYP~;whN7_jnY8 z0wX=9;&|kR(4$x&jT;b7^;n63uNvWWlnjSD++{!b!4FUlo~^~_yBVaICy79hOu&kO zZ{#EQb5E2LX!-0qS;nb`ymJ&PT_l@o-~BhQDpQ+tx>DV}-i|igr*D6`@xxv2jzDhe z#1vyjMbm*ce{D{oUj6ku>WyE(t_=4WJRJ4s<;}hQ_E}4p>Vo3A4ZRoTaA0qYI^9QDedhY z63J$-7a{nYB@fp)hP+eJR-mAQAPU3Ruwfs^9&dy`?obg0X2np+kj^o&3;;tJv2hd;^_>{p zmv(PwMcU%tci(t)1QReN81lyCD<@@EmDe7&rz3QM>b$EK=M*SgO4g<;mC&g>5wPLD z`^H{&SvWZ4OrMT_oxl23?fv%~o_-o{MBOQumwP;o4hMojU_u{0`+9J9R3_8dE6zw9 zH?HjIr%P6^#zdu1E>AuDmRLcucl!Np@DcKQ?J`+yPLAQ$TPFsY^n#0Gngn8w0De=k zS`Go+PCxzhm}@*6JR%7|YWF@-Md%>qdxSu< z8W3o%>yW#Q8il6Q?eI$w0J1BHd7!yjW3?h^J3=)k!`-cya1fyasJB@B77HSO;T?X7 z3Pny*(zw%3gKtbX2fk2M*JC*vlPT-eQ#(8!?|}nZB_(((RFX`FnDrol5I1U>3`>5h zeZEZ^jpd9p&K|OM@9UXbkL}}55(pasIH(}<8$2j_TtXVQYFRJ|kidWmz+DQi=l9-w z?|{$b3E?3?$sQiAEVU;B0SA^?D)d^T$LE84mRu^cwRbjF?bA0j;6j9lojNyHb2yAc zPiKd0pDriIm!0jes?s=}ikcelFu4%;Y&IFzX5qcD=s5KH;rR7(zhCWkYa!f`z-y@F z^3Ze}vOSDXfJ4(pmNLQ!V3``6VY+n+>jJUZvD?n@eS~{Dw(ynDl1U&Y2=sU(^mvB` zcL#pt!5^6(b^?qfGwee!!WsZ!*sC@)Y4HLkV^`FufFFOQ5baWVduge=z8?M|comW+ zFHfJ55pE(rlgVW;z?~e1ZLP~CJsh?o+?9&ui*%e;YiCmv<|;6*OJP|@Oe?h-Z=FIK zJCzcN3NLjHr>mvdBqrj9!2Ct_KhYN;Zibs3B>@r`u>>gJN9@o>TgMLWsp_bAsugO) zXFvRIB?(+)U~$)WI`PgDT!>hX8L(L30v_&`2h3)-*^D6Zhyj~ywVJKgaM$=<`QLL_ zF=u2Xj~j=8Hi!#}m8o5Cp2E6*j|U&nHa9}bAX;UgtH!@8mj5LI5+DH*AOR8>;RGnz zNB96oPxrhIpCX`9C{-SRSMZd>UK&$a7}%=tVFmehpY3u6+}MFnmaco1aHImHf3vG|9t_}u(_Mf2s?>8L3=oC`f#w37_$nLg|o{1 z{(8I>%HzRXp@bL3HX*Kz&sUDOyH1%h>F{e|hNXF|lmtkC1W14cNFaI$!0^b81R_D8 zz25Gz>0}z2%ZoTFzJN+1lgm3QtNo45@aV=nOx-3^K(CKLQ*`jh$<2kc4BpbL!K<3# znKB#>DPF$f%2C@_UTt_<2~ZELG< zYm;aaQqmF~iG>Gk$tinFrsn4M-Gz`Jg?vX48HL7ZoUl;USvz&Zvy&8x2EE?4Y+1pI z6(O&V1(E;>kN^pg013n{0ZR7R9lL04c~8#u2oa-|$y72~z}e~yRJ+}senf+mNCTti zx6Hckpi;HJdPn}W>@newCDU9{vF?Ef4y{^~G3~m*;veZ$`tq_bzI=LXb%{)skZ8(K z&pvfRc*%m#;Vr8mMJ>}dl{vJQWS4%de?!+^yUo_o+$?0^UlJez5+DH*AOR8(2vD-~ zN{9r3&O?Wkjg7e4IuWIPbcQ-HK@yO-d`^{8t5@l~YGdm32}wD+a5tr;qGHnn54c}{ zeTG8Y>1ubnohFT0r%AHtrnKxcH(Dzvo{qPtMrc#26&Vu}@DKG>7HNf0IzZ%VXlOck zFgZUzLhWERBtQZr5Gn%K?p$_#Xng@f)iRbt0wan5qsok^;f&hO*h)&g_4V*&M+`>w zm|S&gl3(Ie$P@;ZL8(x={hkh2o6GA6cl!^1@Il9#HDhG5F#)&6(PVYC`K1Ua?{WuR z2rJ|BBT6Nl?}u~ix*;774}5sIkpKyh011!)36Q{d1Sr|RBfQmT{+rQ7Q=Bx?)_h{PDitzyTHhA+ObbacR>K2au1b2c074N{3; zsZhvdm`w!qCbhvF-Zu2sJ&#IdO-SfSOzbq9F>R2xxA&HFko$Y`TpDCiJdFfMfCNZ@ z1V|v_1n49aapdt=VS7`P%4$W77+A2K$;obmKH%yK-Qw}%9ibAbOz!kLl2f&&r0_<5 zv{hGoYHAWC5}j14kxI>;)^%ufO&KmsHX3Iepahk_!@=#xOlfdlgT zdW}Saz~sjKd`)Vq&*upQd`h`WtyD_`GMl4Ap$lkq>OPAJ!9f{<*GQ$Xu1lp-yW85< z*@Ax#w_PStU^;;q?)VpiY6e>bTGeG4@9dO^+~PjiChC{$Nhf=OFsEh$bZC5%2im+>CwaFwm8u4By z57c=eknHI+Ia}OrmrNo<97eQP8gLtoTAkS(-1f+)A=#akmA00a$XCr8Nq_`MfCNZ@ z1frC{sufF?Q@2Oy;6y{SE`N8mFVwyOvbHw$VGR!_nYKUx%TxV6pUdM=D%2XK#wYQa zGmOSCyUc*CyQ8DEqoXAdfU~_7u_)bkUuQ#OC*I`hKqPg9y79roJP^QKBk}{`^?L1g zdneSp!=dzgb)B8Q*4D^3gEf)>36KB@kN^opCjmOTN9VYVkXFIPeb48gH@@{&er+v` z*;a|fP*C7jYwMc#R<%^Xz1*PD7*z>AlS85iZz#wED_3?r`eSP+>p*tc)rbI(1ubLUQ@(O6$!5AD7~ zp;*_@aO@jzoO9uYX$1w5X$ET{0TLhq5+DH*h-Lzm?9n_rvE8=PO`F#L@sG~0zDklv z4oDaqPO4IUC6OHTc$|K}Lzh;hO09EP%`#Pr5s#h%Hl?{jGr45(5sO#T=FboP z0DRwqzhT3MXPyorey+W$+1p-d5-R5kq+fng>YrX6W+1N>AdM$L|2ihwt z4*caW+EuFx#v2U@UGGN<*%qXuVQc^7lTUm;UrI`fUayCI$I?_p$b`{dtJSuuR5gLX z)(<{Fc*gSYU}rIEVCq= zlhcMGPyZio#g|{!Jo;$n)~%UJr3`ZhzrQRaBk}gz{V4?pUfY(YH>Dazo3s{%T#04` zBz{Ah1?yzn98EPcX#pz4<9|tj1W14cNPq<5jsPWl+zojII$XDTldP;PO(Mao zjqpz+lkHL%%MvH56AO~{X$kryz1FNzXcaO!w6e?VQp%N5Nxq$xX_%7?O=zi&m+FYKQsT<8?dS zHiVY(`aE?>6D76^{R=Pb*taj`nrre;JTbJ~%FD}(i;GPr6AbFuAlcPwwOlTTiQVPu zifiAsIMrxuGntxOTJ%Ll^(7_raS!bfurv~gZUR?~xoS0i0it`1*g6szHUgCI!-jrD zR(#k8MA~+sMB3PBl*#l`sY))dmr6fTnCrD^d731h#;jAD3~GZ`Emz7UzJOfek;8+- z>vJ15iS>2WRV8(WGsYMULwXle(}oS&x8ELxHpu08)l(S)#$R}0!ELu0M~x~is%$80 zP0%LkH71?Ps8e;hr*t?QzdrcczUrNmM;$vMbC$u=sWN1=>NBPFW%+);JPh$6+uGV1 z8yjI|R~+7ufQVNrmGGH?s|@~PH+H%;8ate4nwpw19pVzz5qZzBQzSqFBtQZr&<_HX z?EQemECVE9Yi{=1Yzi4(MB25Ldc6&LlS*UJD77kuTBT5Flrp_WqEqGV5;JUMCZT*<+M_V)I2gTb|QY3|imL$9MBtqtwgW~WA(q?T(` z3XMjk)aj%!KbUsQwURKrK^0iw34;wy!e4xZ zxg8o^@Q~@Ec6h@91f#@V3NIsWBtQZrKmsH{0&z=#l09yRK8zhVCns4A29MqDg?F~! zuaqg^4va1bUdbR6c*NcyE*xGKh+w79mA;nIS!4v)3YhlSQ zU$@S3`|T6YKVR&v&5Ee#4vieO9j;a?QOG53uhZp*7rDdfu`9crdb+mGgyfD%lft3b zT~=#*S(y`|9_3i08-Pt6N*%s22qOdE7^LwR>8_7B=J!hi2qup(`Xh9EX!h-h2f(-h zBXoG#EfOFB5+H$)6QFz#InuZ;u%*^r`tL{DH&^>RJKH4^l|omRG-2=PlXKE%rWn$( z=o3m6+SKP!xt-F0PvZ4UJb2$y*8#7`?{)b+>7%ofQ$w*VH6cNB#~p=t-l_S%i;K>n zfj5fR>hb!0UH`m(r(2etJT517%(n6ka+!KY_5!cJt1&it>Q|pTYZ}&$nrg|Ll9e$! zb?8IeSyx;B+Qxm~KDN!}YDr7eXfz1>2;mNMI||2NNOtTIcEV={q3#_@rM0}ghgHy5=FbC)#2{6Iogs8 zX%jPM`CI&D@73*idy^?wKJkR?ano~*W<;|b@aF97tX;RR{@s=3j7}`+oi^a= zc>)QL011!)36MZc6Iiuk$#UxUhz#M<|9*DDu=xUDjp*TJq7muo;Yu1;uFPDyGOeX$ zzahJ5{N>856XxiXvGP+cRX~?IJr0|zqt)JsNa6vhA7{7}I=M_Cfq~oS>VzAKqa9u> zQv&Bn!(}rn`0>-Y+En_fhU^ z)}Lz&_yS`CjalY4kM8xZ69Vwj_WJ@}SleB0I|L}!pehtfyxmCN71aIkalB(_uCK64&NCx z)#LE^+-j^^RU6UNE=T;X42bgXhZBv=>gcI?T^x?G`E8!Y4tKSpzWHOkTnXx2<@IJs z{IYtvM3vw$OmeAnu+!;uc3NBg_Bwlmsv~Psa$2^*QN2aF>C4=DiJ?KVu3WnA_gJrr zHsPNH>wmjih&IZxnm{U-Nx&8>20#)^3KU3Vjc_12Gi%0zX^{ThNPq-LfCNZ@1Y(f@ zC3`H6+R@vbF!vsR?jg6!arCT1%ONOe;cx3FpEkVrZllqtKjEUzy3G2@2B*9|b7DeP zfmyAV>Jt*$TkM~Hu(PewiLmJi<~+RRFrq_x!Tz< z@E@KYbp82mN)v^Hrly~NgDNShqs?EoyC(Gn=h$i4Nh#k`jec#x+PA)` zJlLu7BM_qs#(104oj;>+^tiOv{Q;#dJ11pKf>zPm*|z`lVxP=7eNllHfg^{uwbXSK zZ77x2=1tBXqmrxIJKJ2cqUooP_Q)OEJ}q`N_|-}+W*~NVr_!ijaOu*8XCDXcF4Q@G zj^wzr>{SQr_iw4J+}@&39F=$6M1At%s5k>}RraJs$6e*HTCG@>3MY1#rz~d0wh2JBtQZqg8(J_ z$QZ|1>V+lAB1w{DWT#I*wo5dNo6e-3d;YkhjEdT?OHCb_W?e$2Cf_tFJ0(di<{4-L z*75T7R!c`-q9qaW9xIy49G05nmW&xU?SInTVA4&VRfvBBEt&aAfCOTNz}8b9)6o|o zRz{2MBmolW2La0Wen4WDND(lYwBu%Hs&x&A)>pY&UE>#}Wgf3l7zbZ{T1JX|QgVw+ z)@gG#IIGMv-N&CYH7U(J_!4<036KB@kN^pg00~5#0400Gk+Z@+379O#DJK|Z>VuWL zD83geL8bfnbDQs+wSF6+K^`_=jOaSIEn*ZaiJgCsx#BtQZrKmyT7fRa5LM}=*g zG&>*vLc&3=m1N9QW*$F9YZ$z4J1GUBtQZrFq{M^--nYv z>y8WoopGqKXd=^2)2;znK>T!@Jtctw5}=+4< z011!)36KB@kif_wK*>Hb#*w`s0TLhq5+DH*AORBS2Z1Y-URT7pFTko5OO{i^_hYP? zg#<`|1W14cNPq-LfCPq*044kIv1iRBKmsH{0wh2JBtQZr&<_HX?EQemEF?ezBtQZr z5L*PMF1TuTjQaw_7I3zf1R_X)@;!pESrrM8011!)36KB@kN^n`oB$>Jz?tz35+DH* zAOR8}0TLhq5{MuHO7;lCW>q9W0%0I9#qjY&`T~RjEQ=%o5+DH*h)x2O@6kCfY!wNR z011!)36KB@kN^q%j{qe*F9i}H0TLhq5+DH*AORAHY66t(Q9V50Z`?8S-+P0;0N-cA zPb5GBBtQZrKmsHXUj!)M<7>RxTM{4v5+DH*AOR8}ftVve$sTh<#s-rB36KB@kN^pg zKr|3YJpGc-=nF6mBe815lI7I!!vLODk^l*i011!)36KB@kU;+lP_p-*6?2jR36KB@ zkN^pg011%5Fc6?*9|q{Gk_1SA1V|uu2xxA6>v!}8h@J6bOG#kl6QFz_`D4r;k^l*i z011!)36KB@#54g)_Lv?%Hl74XfCNZ@1W14cNMPg>pkyEUW6U0sKz|7wxIJYneF6GQ zi}^@^1W14cNMKk9P`(cfc2-IPBtQZrKmsH{0wh2J{Ut!j-d|G8M*<{30wh2JBtQZr zKmx-;AWkLwD}VmaWAp_WmMe~xk^l*i011!)36KB@41qwL%J(4<LjBtQZrKmsH{ z0wfS$1Sr|#YrNUpND;W#eEYBH3lJ&VtcL_hfCNZ@1mcJQ<$D|rHoHm!BtQZrKmsH{ z0wfTN1Sr{Kan#sm5+DH*AOR8}0TLjAI3h4)$$s#SH_xLlKpb5$>?#S6011!)36KB@ zkiak!7_xjH#8UBtQbOP9S^3N*8?rVto|Zei9%75*Q2t%J;!g<2fWi0wh2JBtQZrKmsHX zF#?qA5kt+2NPq-LfCNZ@1W14cNMJAoDA@-?jpsy?z=>_gZ=f$gB#E;w5+DH*AOR8} zfhZ z9s-o?!^54mk^l*i011!)36KB@kU&2PP_p+E6tj^435-+%4}W{$G5P|G)X`?sZ${vvb36KB@kN^pg011pJ0+j3{YB<>$5+DH*AOR8}0TLjAkw<`%edLX4 z?>$;wf5uMw0`$&@M@WDKNPq-LfCNY&>IqQ3NBt17fh0fzBtQZrKmsH{0`X0Nl0Cl1 zpS>pm5+DH*AOR8}f#D)>;k@bh(HCIA^eNv5jEpCc011!)36KB@kN^pgKqLuJvPY6O z>mmUXAOR8}0TLhq5+H#A6QE=tFfyJ%0wh2JBtQZKC2-liw@;-nz(A=nKM9aPj|5h& zShAcNzDG3NNdhE50wh2JBtQZrKmyT1fRa60MuP1i0TLhq5+DH*AOR8}fgTA^viFFE zJ4t{921B6wzIm_H7ho{tcn%4W011!)3G|l$<$HfgF&_z#011!)36KB@kN^n`3js>@ zVZqKyNq_`MfCNZ@1W14cNT9z2DB1f<>ihXtUvS3>^ac1n6MiBA5+DH*AOR8}0TKv1 z0m}EVBW498KmsH{0wh2JBtQZrFcbom>_ef)b4h>%NPq-LfCNY&8VEGoSDNSx5Dg;{ zfi_USM*uRbAOR8}0TLhq5+DH*Ac4UXpkyCBJDy1bBtQZrKmsH{0wh2J5g9JqA+vZAAOR8}0TLhq5+DH*7#aae_M!3P*(5*$BtQZrKmsH{ z0wfS-0+j4w2F&7zpFr`FpPWWtfZ-npwtxgkfCNZ@1V|th1nB4<3W~jy!Bu3vfZ^`2 z69|JxblBS*?h1H6hMO?U?~MTO$KJ?rKM9aP{|QjC_n*~Za`KycFw}U?& zlSzOCNPq-LfCNZ@1mcMRC3`%LHv38fBtQZrKmsH{0wfTF1Sr{KaM0Lf5+H%-BXHl+ zUkoWOK=k#9Eg}IDAORAHQUa@1ELlzsAEkrCW|061kN^pg011!)36Ow5AYLTd7c5wC%{A9-+O+A& zJmQ|+yLZo>J6HVJ|Af_Q{nMZRbkRi@EnK+pM?d<}yYIf+|8to$4hj7D$3K>Sw`F8x zTzcuH_4V~}$bnrZ0TLhq5+H%-ArLQ;J$i_XEop6Sz4FQ{olfUH_uTW!E3ZJc-*($= z`}gk`Ga&K#=bxW>=9$5Jx~0GU_S;#rX4Tf#Vm~xJUMVww{(NYx_3PIQIh&fAF1ze9 zNUmT0@|Q2Z_~QBJpa1v2{~hy$;BtzKi*LB$262za<9YbuhtD|U3`qPt?zlrJTsT_r z%%W*Sc}IX)2NSVF;DQ2vR^i&1J$rU%XJ=@euT(0ZfByO2%KX6(et?S> zM{(U^lH6N1?k52fAOR8}fjA*R`95p|4KbaWnF;MaapJ^LqefkQ_0^}Ga>}c(zA84T zp`igs#g9EEva_?1Cm|uh?RMi?!OWR6-+c4U3of|euDkBS={V)_#~;tj%Yz)pq0ys9 zV={pE_r3rA``fl{!%@ikmtTJQ*T4RCaN(FseEs#;PdxF&TW`H(Hk1n3!lXnNBOBLOgO-*SNaWz0m@vSCF6?>kx#!Z- z()#w62|gD#d&n0U%TesxZ@&!@gJ}j@i#*Uz!8ws0H*Op{js%<^e)X$gL1qPK_`@Im z0B;##4?Or$G6Yj_2BzbU04~(BGJHKs{_&50VD5^UXHiiR9`amq#TD53;DZn1O53qx z2mHJ6$OvK@3LZDklqpj%hs5Os$FR!EO60_qiTen5RxrR1Kl~7vIPKS1ff){hHUcDN!9``0rKjxTYmMmG~^?Gp>Q;3~AccNqneLOz;;)^fDQKrv!^GKh{qdBZ>mGa*cd(7O=3LLrc_OP4N18cyee1c9VTPfv#z3U=bC zV1R`Gz#u9WPJ!G(LZRrHKc)~+Mew5O=JMW0buyU@zAiuc$xohs`e|fC8uoJd$-rDH zm&?1Is8Xpg3F)>|{D__+4Lt;L29KKG|Ni&lAtvIJfUrmveShkyr|!T1{z;Q2Aq_(~ zq&y~vcDo%{3;s@?JQ>;@4(r>uZ-+*Q=EfBc!#tk+V8bcM|I?rTv>QV_@4D%xo3Im3 zTv#>@=b4jFKDk>Se8la5Y$u+0BGM@NnP;Baym>Pmz+5gD*3n`oO#U$2!yW&~bGe5E zNPq-LfCOTlKwMkdp)(-LVX-^=?6ZYu?!s{9=jV&#iih&Bvctp(8y+Nuu;Ix*g20G* z29bcg(ChVrsargK@7}%eM~9eRzI^%be)l`LzQFd6qk`9gn61aefddENE%WH3kHX3b zOXLeLyztdmUqK<^+-|kt^n(WvLhJNcj<6Gw3+_YTeDe(^0Q2U}>mw%*#RGvuhYsOd zLQiocV4^GB1$ac0l9Gbus<4G4OcPwl@QesCi{N{POAcvqMhYvtaJ^w-d?c={tSn48 zh5abGs;cV9JlKQ%;zf&+b8>P7%ROeKaKRT&33dkSu@LSgfmkMR(c{%r&34FI!(=H_OYEw8)oI@AbLBCO^}2&+hgGj~g4At{!(o^ZkmI-L#^ zlH-p*9)V@x>5e`B{`bFwGvmPm+!)}i5WF)u4X+{0B4E6K?6Jonl7bI09ft&9Q-|}3 z5Jwd^0-iw$cLAJL;P{R;6%f|9+;R(Mx$nLA9_}W@FM{7WK8n-MmtJ}a50QXQl{Q|0wgek3B-|Phb+MIN^ygm z3e+$xeDD~7&VU~|w6Y*FAf4eK0`>g2zx@rXQL$|9^wUpAm__7)H4#!6;uzNPAzl_( zLI)iK7Zk`8EGmV3M-Uh&b<85Re7C`N4oQShP~oT!;t359Hw2Ls+c16lbePH4u3d{} zL%x6Z*=I9m%)n8^fq~&1Hc_-6wIBmR*1(9~$AVWlKVUKgw|J}?6gE+NiPbSNvI)TR z1a}J7XXB#6;%Ru1386x<-s3mF`3>yuxOd>P0v|JQfEzl3MdIp$zZvc(JW4`vQY_Md zM>`6E+d8glc+T`j40A~MbRj1$TEwdneC3fDl?I;z&oo?_xVCYH!@(V{H8A-HXJDEH zNPq-LfCNS`fu8-UM`VX#N{5UPy9POqz=&{?fjbIp(gsM`&xTqQ=D!J&jnUxPY+}p6>9R!HQ?- zbzF6D@q$2y#U0Oxa7n{3kJS;F0pdLaJ)*;O6w_&3nFfOaGgwTICC9%j`{Mt70q_J2 zR(woQ5o$�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 YUti#pwQpkkU(duo6c@8Jdi0e4121vOJOBUy literal 0 HcmV?d00001 diff --git a/docs/source/howto/index.rst b/docs/source/howto/index.rst index 4e6138b81..0194629ee 100644 --- a/docs/source/howto/index.rst +++ b/docs/source/howto/index.rst @@ -10,3 +10,4 @@ How-to guides setup_computer_code import_structure upgrade_uninstall + xas diff --git a/docs/source/howto/xas.rst b/docs/source/howto/xas.rst new file mode 100644 index 000000000..1e0ac2b36 --- /dev/null +++ b/docs/source/howto/xas.rst @@ -0,0 +1,184 @@ +============================== +How to calculate XANES spectra +============================== + +Overview +-------- + +Using the XSpectra module of Quantum Espresso, it is possible to calculate X-ray Absorption Near Edge Spectra (XANES) for many types of systems. +Here we will compute XANES spectra for lithium carbonate (Li\ :sub:`2`\ CO\ :sub:`3`). + +Due to the number of calculation steps required, we will need to set up our environment to submit to a remote machine capable of handling the calculation. +Please refer to the relevant :doc:`How-To ` section for this procedure. + +.. admonition:: Goal + + To submit an XANES calculation with XSpectra and post-process the results + +.. note:: + The XAS plugin feature is available in the official AiiDALab-QE App as of pre-release `v24.04.0a1` and upwards. + See the relevant :doc:`How-To ` guide on upgrading and remember to tick `include prereleases` when searching for the latest version in the App Manager. + +Start +----- + +To start, go ahead and :doc:`launch ` the app, then follow the steps below. + +Step 1: Select a structure +************************** + +Select `Lithium Carbonate` from the `From Examples` tab and click `Confirm`. + +.. image:: ../_static/images/XAS_Plugin_Structure_Panel-Li2CO3.png + +Step 2: Configure the workflow +****************************** + +Select `Full geometry` to relax the structure and set `ElectronicType` to `Insulator`, then select `X-ray absorption spectroscopy (XAS)` as the properties of interest. + +For the protocol, select `fast` to quickly produce results, or, if you have enough resources, you can select the `moderate` protocol for increased accuracy. + +.. tip:: + For this example of Li\ :sub:`2`\ CO\ :sub:`3` changing the **K-points distance** to 0.25 from 0.15 in the `advanced settings` tab while using the `moderate` protocol will speed up calculations without compromising accuracy. + +.. note:: + At present the pseudopotential set available for XAS calculations only covers the PBE functional. + In order to run the workflow: select the `Advanced settings` tab, navigate to `Accuracy and precision`, tick the `Override` box on the right-hand-side and in the dropdown box under `Exchange-correlation functional` select `PBE`. + + .. image:: ../_static/images/XAS_Plugin-Set_Adv_Options-Alt-Annotated-Cropped.png + :scale: 55 % + :align: center + +Open the `XAS Settings` tab. +Selection of elements for XANES calculations is found below the explanatory text for the core-hole treatment. +You may wish to test different treatments for each element to see how this changes the spectra at a later date, however for this example we will use the default values. + + .. image:: ../_static/images/XAS_Plugin_Setting_Panel-Annotated-Cropped.png + :scale: 75 % + :align: center + +Tick the boxes for O and C to select these for calculation, then click `Confirm` to proceed. + +Step 3 - Choose computational resources +*************************************** + +As mentioned in the overview, our calculation will require more computational resources than the basic tutorial. +Please make sure to read the relevant :doc:`How-To ` section to configure the environment with a remote machine. + +Since the workflow uses `xspectra.x` to calculate the XANES spectrum, a code for this will also be required. +When you're done, click `Submit` to submit the calculation. + +.. tip:: + `xspectra.x` does not require additional conserdiations for installation or setup compared to `pw.x`, so re-using the configuration for the `pw.x` code and changing the executable & plugin entry point will be sufficient. + +.. note:: + As the XSpectra module of Quantum Espresso is not currently able to exploit GPU accelleration, it is strongly recommend to configure this calculation for a non-GPU system if possible. + +Step 4: Check the status +************************ + +While the calculation is running, you can monitor its status as shown in the :ref:`basic tutorial `. +You can view the results once the calculation is finished. + +Step 5: Spectrum view and post-processing +***************************************** + +Once the calculation is finished, you can view the calculated spectra in the `XAS` tab of the results panel. +You can change which element to view XANES spectra for using the dropdown box in the top left. +Select carbon from the dropdown box. + + .. figure:: ../_static/images/XAS_Plugin_Result_Panel-Carbon-Annotated-Cropped.png + :scale: 65 % + :align: center + + XAS result panel for carbon K-edge of Li\ :sub:`2`\ CO\ :sub:`3`. + +.. note:: + You should notice that "C K-edge" and "Site 4" are listed in the legend to the right of the plot - this is because all carbon atoms in the structure are symmetrically equivalent and thus will produce the same spectrum. + The workflow has accounted for this and only calculates the spectrum of the first carbon atom (site number 4 in the structure.) + +Immediately below the element selection box are the broadening parameters. +The XANES spectrum returned by the workflow will initially have a Lorentzian broadening of 0.1 eV. +As broadening parameters cannot be calculated from first-principles, we will tune these parameters by hand. +We will first compare to an experimentally-obtained C K-edge spectrum of Li\ :sub:`2`\ CO\ :sub:`3`. + +Try changing the first slider (:math:`\Gamma_{hole}`). +This will initially apply a constant Lorentzian broadening for the entire spectrum. +Comparing to the experimental reference for carbon, we can see that it is difficult to effectively re-create the experimental spectrum with a constant Lorentzian broadening scheme. +Setting this to 0 eV will plot the spectrum with no post-processing. + +Navigate to the upper center of the XAS panel and tick the box next to `use variable energy broadening`, which will change the behaviour of the broadening tools to use an arctangent-like function commonly used for broadening XANES spectra (see `Calandra & Bunau (2013)`_\ [1]_ for further discussion). +Set the three sliders in the following configuration: + +* :math:`\Gamma_{hole} = 0.3` +* :math:`\Gamma_{max} = 5.0` +* :math:`E_{center} = 15` + +The resulting spectrum should now more closely resemble the features seen in the experimental example: + +.. figure:: ../_static/images/Li2CO3_Example-C_K-edge-XCH_Only-Cropped.png + :scale: 75 % + :align: center + + Carbon K-edge XRS (low-q)\ [2]_ of Li\ :sub:`2`\ CO\ :sub:`3` compared to the XANES dipole computed with the XCH approximation. + Note that computed and experimental spectra are aligned according to the first peak of the signal in this case. + +.. tip:: + For advice with parameter tuning: + + * :math:`\Gamma_{hole}` sets the initial Lorentzian broadening value up to the Fermi level (:math:`E_{F}`, where :math:`E_{F} = 0` eV on the relative energy scale used here). The natural linewidth of the core-hole (if known) typically provides a good reference value (`reference for atomic numbers 10-110`_). + * :math:`\Gamma_{max}` sets the "sharpness" of the s-curve of the function - lower values give a smoother change at the inflexion point, while higher values cause the broadening to increase more quickly at the inflexion point. + * :math:`E_{center}` sets the energy position of the inflexion point of the function. + + The variable energy function (:math:`\Gamma(\Omega)`) and its parameters can be visualised in the following plot (from Fig.1 of `Calandra & Bunau (2013)`_\ [1]_): + + .. image:: ../_static/images/Calandra_Bunau-PRB-205105-2013-gamma_func_plot.png + :scale: 33 % + :align: center + + +Next, select the oxygen K-edge spectrum using the dropdown box in the upper left. +With the broadening scheme used for carbon, the spectrum should already resemble the experimental spectrum quite well, though you may try to tune the parameters further if desired - particularly increasing the initial broadening (:math:`\Gamma_{hole}`): + +.. figure:: ../_static/images/Li2CO3_Example-O_K-edge-FCH_Only-Cropped.png + :scale: 75 % + :align: center + + O K-edge total electron yield (TEY)\ [3]_ XAS spectrum compared to the XANES dipole computed with the FCH approximation. + Here, the broadening scheme used for carbon is modified such that :math:`\Gamma_{hole} = 0.8` eV. + Note that computed and experimental spectra are aligned according to the first peak of the signal in this case. + +In the plot window, you should be able to see three different plots: One for the full O K-edge and one for each of the two symmetrically-inequivalent oxygen atoms. +The component spectra in each case are first normalised, then the intensities are scaled according to the site multiplicity. + +.. image:: ../_static/images/XAS_Plugin_Result_Panel-Oxygen.png + +Click on a spectrum in the legend to show/hide it in the viewer. +Click and drag a box over the plot area to zoom in to the selected region. +Double-click to zoom out to the full spectrum. + +Finally, click on the "Download CSV" button to the upper left of the plot area to download a CSV file of the XAS plots for the selected element in order to export the spectrum for further analysis. + +.. note:: + The CSV file will contain all component spectra for the selected element. + Any broadening applied to the spectrum *via* the available tools will be applied to the data in the CSV file. + If multiple inequivalent absorbing atoms are present, the CSV file will contain one column for the total and two for each component: + + * The normalised & weighted spectrum. (with respect to ratio of site multiplicity to total multiplicity) + * The normalised & un-weighted spectrum. + +Summary +------- + +Here, you learned how to submit an XANES calculation on a remote machine using the Quantum ESPRESSO app and how to effectively use the post-processing tools. + +.. rubric:: References + +.. [1] O\. Bunau and M. Calandra, *Phys. Rev. B*, **87**, 205105 (2013) https://dx.doi.org/10.1103/PhysRevB.87.205105 +.. [2] E\. de Clermont Gallerande *et al*, *Phys. Rev. B*, **98**, 214104, (2018) https://dx.doi.org/10.1103/PhysRevB.98.214104 +.. [3] R\. Qiao *et al*, *Plos ONE*, **7**, e49182 (2012) https://dx.doi.org/doi:10.1371/journal.pone.0049182 + +.. _reference for atomic numbers 10-110: https://dx.doi.org/10.1063/1.555595 +.. _inelastic mean free path: https://dx.doi.org/10.1002/sia.740010103 +.. _Calandra & Bunau (2013): https://dx.doi.org/10.1103/PhysRevB.87.205105 +.. _PEP 440 version specifier: https://www.python.org/dev/peps/pep-0440/#version-specifiers diff --git a/src/aiidalab_qe/app/structure/examples/Li2CO3.cif b/src/aiidalab_qe/app/structure/examples/Li2CO3.cif new file mode 100644 index 000000000..687ef2a01 --- /dev/null +++ b/src/aiidalab_qe/app/structure/examples/Li2CO3.cif @@ -0,0 +1,43 @@ +# generated using pymatgen +data_Li2CO3 +_symmetry_space_group_name_H-M C2/c +_cell_length_a 8.28221965 +_cell_length_b 4.96902479 +_cell_length_c 6.07631725 +_cell_angle_alpha 90.00000000 +_cell_angle_beta 113.74593345 +_cell_angle_gamma 90.00000000 +_symmetry_Int_Tables_number 15 +_chemical_formula_structural Li2CO3 +_chemical_formula_sum 'Li8 C4 O12' +_cell_volume 228.89737819 +_cell_formula_units_Z 4 +loop_ + _symmetry_equiv_pos_site_id + _symmetry_equiv_pos_as_xyz + 1 'x, y, z' + 2 '-x, -y, -z' + 3 '-x, y, -z+1/2' + 4 'x, -y, z+1/2' + 5 'x+1/2, y+1/2, z' + 6 '-x+1/2, -y+1/2, -z' + 7 '-x+1/2, y+1/2, -z+1/2' + 8 'x+1/2, -y+1/2, z+1/2' +loop_ + _atom_type_symbol + _atom_type_oxidation_number + Li+ 1.0 + C4+ 4.0 + O2- -2.0 +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Li+ Li0 8 0.19639168 0.44656424 0.83739024 1 + C4+ C1 4 0.00000000 0.06619574 0.25000000 1 + O2- O2 8 0.14745362 0.06495296 0.81423924 1 + O2- O3 4 0.00000000 0.32319230 0.25000000 1 From 54bc0cf808af088bb76f95b7a27cc58ed5fbcbf4 Mon Sep 17 00:00:00 2001 From: Peter Gillespie <55498719+PNOGillespie@users.noreply.github.com> Date: Wed, 14 Feb 2024 18:17:20 +0100 Subject: [PATCH 032/166] Examples: Add Lithium Carbonate to List of Examples (#622) Fixes an oversight from https://github.com/aiidalab/aiidalab-qe/pull/614 where the lithium carbonate example was not added to `Examples` in `__init__.py` and was thus not selectable as a structure. --- src/aiidalab_qe/app/structure/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/aiidalab_qe/app/structure/__init__.py b/src/aiidalab_qe/app/structure/__init__.py index 28c25ba56..183899ab2 100644 --- a/src/aiidalab_qe/app/structure/__init__.py +++ b/src/aiidalab_qe/app/structure/__init__.py @@ -32,6 +32,7 @@ ("Gallium arsenide", file_path / "examples" / "GaAs.xyz"), ("Gold (fcc)", file_path / "examples" / "Au.cif"), ("Cobalt (hcp)", file_path / "examples" / "Co.cif"), + ("Lithium carbonate", file_path / "examples" / "Li2CO3.cif"), ] OptimadeQueryWidget.title = "OPTIMADE" # monkeypatch From f9519642ce32f9d57faaa6769d349308a7d87910 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Thu, 15 Feb 2024 08:35:45 +0100 Subject: [PATCH 033/166] Add plugin: X-ray Photoelectron Spectroscopy (XPS) (#518) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR adds a plugin for calculating X-ray Photoelectron Spectroscopy (XPS) spectra using the XpsWorkChain of aiida-quantumespresso package. The Setting panel allows users to select the core-level (element and orbital) to be calculated. The availability of core-evel in the panel depends on the corresponding pseudopotentials. The Result panel displays the final XPS spectrum - Broadened spectrum using a Voight profile (combined Lorenzian and Gaussian). - The chemical shift values (differences in total energy relative to the lowest value) - Absolute binding energy - The Offset Energies (δ) To make the setting as simple as possible for user. The following default core_hole_treatment are used: - `full` for molecule - `xch_smear` for metal - `xch_fixed` for insulator The supercell_min_parameter is updated based on protocol. --------- Co-authored-by: Peter Gillespie <55498719+PNOGillespie@users.noreply.github.com> --- setup.cfg | 1 + .../app/structure/examples/SiO2.xyz | 14 +- src/aiidalab_qe/plugins/xps/__init__.py | 18 ++ src/aiidalab_qe/plugins/xps/result.py | 246 ++++++++++++++++++ src/aiidalab_qe/plugins/xps/setting.py | 245 +++++++++++++++++ src/aiidalab_qe/plugins/xps/workchain.py | 100 +++++++ tests/test_plugins_xps.py | 37 +++ 7 files changed, 654 insertions(+), 7 deletions(-) create mode 100644 src/aiidalab_qe/plugins/xps/__init__.py create mode 100644 src/aiidalab_qe/plugins/xps/result.py create mode 100644 src/aiidalab_qe/plugins/xps/setting.py create mode 100644 src/aiidalab_qe/plugins/xps/workchain.py create mode 100644 tests/test_plugins_xps.py diff --git a/setup.cfg b/setup.cfg index d344ce906..74e9c345f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -55,6 +55,7 @@ aiidalab_qe.plugins.xas = pseudo_toc.yaml aiidalab_qe.properties = bands = aiidalab_qe.plugins.bands:bands pdos = aiidalab_qe.plugins.pdos:pdos + xps = aiidalab_qe.plugins.xps:xps electronic_structure = aiidalab_qe.plugins.electronic_structure:electronic_structure xas = aiidalab_qe.plugins.xas:xas diff --git a/src/aiidalab_qe/app/structure/examples/SiO2.xyz b/src/aiidalab_qe/app/structure/examples/SiO2.xyz index 5838ae55c..76f977ac6 100644 --- a/src/aiidalab_qe/app/structure/examples/SiO2.xyz +++ b/src/aiidalab_qe/app/structure/examples/SiO2.xyz @@ -1,8 +1,8 @@ 6 -Lattice="4.1801 0.0 0.0 0.0 4.1801 0.0 0.0 0.0 2.6678" Properties=species:S:1:pos:R:3:tags:I:1 spacegroup="P 42/m n m" unit_cell=conventional pbc="T T T" -Si 0.00000000 0.00000000 0.00000000 0 -Si 2.09005000 2.09005000 1.33390000 0 -O 1.28203667 1.28203667 0.00000000 1 -O 2.89806333 2.89806333 0.00000000 1 -O 3.37208667 0.80801333 1.33390000 1 -O 0.80801333 3.37208667 1.33390000 1 +Lattice="4.1801 0.0 0.0 0.0 4.1801 0.0 0.0 0.0 2.6678" Properties=species:S:1:pos:R:3 spacegroup="P 42/m n m" unit_cell=conventional pbc="T T T" +Si 0.00000000 0.00000000 0.00000000 +Si 2.09005000 2.09005000 1.33390000 +O 1.28203667 1.28203667 0.00000000 +O 2.89806333 2.89806333 0.00000000 +O 3.37208667 0.80801333 1.33390000 +O 0.80801333 3.37208667 1.33390000 diff --git a/src/aiidalab_qe/plugins/xps/__init__.py b/src/aiidalab_qe/plugins/xps/__init__.py new file mode 100644 index 000000000..56d0eb276 --- /dev/null +++ b/src/aiidalab_qe/plugins/xps/__init__.py @@ -0,0 +1,18 @@ +from aiidalab_qe.common.panel import OutlinePanel + +from .result import Result +from .setting import Setting +from .workchain import workchain_and_builder + + +class XpsOutline(OutlinePanel): + title = "X-ray photoelectron spectroscopy (XPS)" + help = """""" + + +xps = { + "outline": XpsOutline, + "setting": Setting, + "result": Result, + "workchain": workchain_and_builder, +} diff --git a/src/aiidalab_qe/plugins/xps/result.py b/src/aiidalab_qe/plugins/xps/result.py new file mode 100644 index 000000000..1660df5ae --- /dev/null +++ b/src/aiidalab_qe/plugins/xps/result.py @@ -0,0 +1,246 @@ +"""XPS results view widgets + +""" +import ipywidgets as ipw + +from aiidalab_qe.common.panel import ResultPanel + + +def export_xps_data(outputs): + """Export the data from the XPS workchain""" + + chemical_shifts = {} + symmetry_analysis_data = outputs.symmetry_analysis_data.get_dict() + equivalent_sites_data = symmetry_analysis_data["equivalent_sites_data"] + if "chemical_shifts" in outputs: + for key, data in outputs.chemical_shifts.items(): + ele = key[:-4] + chemical_shifts[ele] = data.get_dict() + binding_energies = {} + if "binding_energies" in outputs: + for key, data in outputs.binding_energies.items(): + ele = key[:-3] + binding_energies[ele] = data.get_dict() + + return ( + chemical_shifts, + binding_energies, + equivalent_sites_data, + ) + + +def xps_spectra_broadening( + points, equivalent_sites_data, gamma=0.3, sigma=0.3, label="" +): + """Broadening the XPS spectra with Voigt function and return the spectra data""" + + import numpy as np + from scipy.special import voigt_profile # pylint: disable=no-name-in-module + + result_spectra = {} + fwhm_voight = gamma / 2 + np.sqrt(gamma**2 / 4 + sigma**2) + for element, point in points.items(): + result_spectra[element] = {} + final_spectra_y_arrays = [] + total_multiplicity = sum( + [equivalent_sites_data[site]["multiplicity"] for site in point] + ) + max_core_level_shift = max(point.values()) + min_core_level_shift = min(point.values()) + # Energy range for the Broadening function + x_energy_range = np.linspace( + min_core_level_shift - fwhm_voight - 1.5, + max_core_level_shift + fwhm_voight + 1.5, + 500, + ) + for site in point: + # Weight for the spectra of every atom + intensity = equivalent_sites_data[site]["multiplicity"] + relative_core_level_position = point[site] + y = ( + intensity + * voigt_profile( + x_energy_range - relative_core_level_position, sigma, gamma + ) + / total_multiplicity + ) + result_spectra[element][site] = [x_energy_range, y] + final_spectra_y_arrays.append(y) + total = sum(final_spectra_y_arrays) + result_spectra[element]["total"] = [x_energy_range, total] + return result_spectra + + +class Result(ResultPanel): + title = "XPS" + workchain_labels = ["xps"] + + def __init__(self, node=None, **kwargs): + super().__init__(node=node, **kwargs) + + def _update_view(self): + import plotly.graph_objects as go + + spectrum_select_prompt = ipw.HTML( + """ +

""" + ) + + voigt_profile_help = ipw.HTML( + """
+ Set the Voigt profile to broaden the XPS spectra: +
""" + ) + + spectra_type = ipw.ToggleButtons( + options=[ + ("Chemical shift", "chemical_shift"), + ("Binding energy", "binding_energy"), + ], + value="chemical_shift", + ) + gamma = ipw.FloatSlider( + value=0.3, + min=0.1, + max=1, + description="Lorentzian profile ($\gamma$)", + disabled=False, + style={"description_width": "initial"}, + ) + sigma = ipw.FloatSlider( + value=0.3, + min=0.1, + max=1, + description="Gaussian profile ($\sigma$)", + disabled=False, + style={"description_width": "initial"}, + ) + fill = ipw.Checkbox( + description="Fill", + value=True, + disabled=False, + style={"description_width": "initial"}, + ) + paras = ipw.HBox( + children=[ + gamma, + sigma, + ] + ) + # get data + ( + chemical_shifts, + binding_energies, + equivalent_sites_data, + ) = export_xps_data(self.outputs.xps) + self.spectrum_select_options = [ + key.split("_")[0] for key in chemical_shifts.keys() + ] + spectrum_select = ipw.Dropdown( + description="", + disabled=False, + value=self.spectrum_select_options[0], + options=self.spectrum_select_options, + layout=ipw.Layout(width="20%"), + ) + # init figure + g = go.FigureWidget( + layout=go.Layout( + title=dict(text="XPS"), + barmode="overlay", + ) + ) + g.layout.xaxis.title = "Chemical shift (eV)" + g.layout.xaxis.autorange = "reversed" + # + spectra = xps_spectra_broadening( + chemical_shifts, equivalent_sites_data, gamma=gamma.value, sigma=sigma.value + ) + # only plot the selected spectrum + for site, d in spectra[spectrum_select.value].items(): + g.add_scatter(x=d[0], y=d[1], fill="tozeroy", name=site.replace("_", " ")) + + def response(change): + data = [] + if spectra_type.value == "chemical_shift": + points = chemical_shifts + xaxis = "Chemical Shift (eV)" + else: + points = binding_energies + xaxis = "Binding Energy (eV)" + # + spectra = xps_spectra_broadening( + points, equivalent_sites_data, gamma=gamma.value, sigma=sigma.value + ) + + for site, d in spectra[spectrum_select.value].items(): + data.append( + { + "x": d[0], + "y": d[1], + "site": site, + } + ) + fill_type = "tozeroy" if fill.value else None + with g.batch_update(): + if len(g.data) == len(data): + for i in range(len(data)): + g.data[i].x = data[i]["x"] + g.data[i].y = data[i]["y"] + g.data[i].fill = fill_type + g.data[i].name = data[i]["site"].replace("_", " ") + + else: + g.data = [] + for d in data: + g.add_scatter( + x=d["x"], y=d["y"], fill=fill_type, name=d["site"] + ) + g.layout.barmode = "overlay" + g.layout.xaxis.title = xaxis + + spectra_type.observe(response, names="value") + spectrum_select.observe(response, names="value") + gamma.observe(response, names="value") + sigma.observe(response, names="value") + fill.observe(response, names="value") + correction_energies_table = self._get_corrections() + self.children = [ + spectra_type, + ipw.HBox( + children=[ + spectrum_select_prompt, + spectrum_select, + ] + ), + voigt_profile_help, + paras, + fill, + g, + correction_energies_table, + ] + + def _get_corrections(self): + from aiida.orm.utils.serialize import deserialize_unsafe + + ui_parameters = self.node.base.extras.get("ui_parameters", {}) + ui_parameters = deserialize_unsafe(ui_parameters) + correction_energies = ui_parameters["xps"]["correction_energies"] + # create a table for the correction energies using ipywidgets + # These offsets mainly depend on chemical element and core level, and are determined by comparing the calculated core electron binding energy to the experimental one. + correction_energies_table = ipw.HTML( + """

Offset Energies (δ)

+
When comparing the calculated binding energies to the experimental data, these should be corrected by the given offset listed below.
+ """ + ) + for core_level, value in correction_energies.items(): + element = core_level.split("_")[0] + if element not in self.spectrum_select_options: + continue + exp = -value["exp"] + sign = "" if exp < 0 else "+" + correction_energies_table.value += ( + f"" + ) + return correction_energies_table diff --git a/src/aiidalab_qe/plugins/xps/setting.py b/src/aiidalab_qe/plugins/xps/setting.py new file mode 100644 index 000000000..9f8e5d11d --- /dev/null +++ b/src/aiidalab_qe/plugins/xps/setting.py @@ -0,0 +1,245 @@ +# -*- coding: utf-8 -*- +"""Panel for XPS plugin. + +""" +import ipywidgets as ipw +import traitlets as tl +from aiida.orm import Group, QueryBuilder, StructureData + +from aiidalab_qe.common.panel import Panel + +base_url = "https://github.com/superstar54/xps-data/raw/main/pseudo_demo/" + + +def install_pseudos(pseudo_group="pseudo_demo_pbe"): + import os + from pathlib import Path + from subprocess import run + + url = base_url + pseudo_group + ".aiida" + + env = os.environ.copy() + env["PATH"] = f"{env['PATH']}:{Path.home().joinpath('.local', 'bin')}" + + def run_(*args, **kwargs): + return run(*args, env=env, capture_output=True, check=True, **kwargs) + + run_(["verdi", "archive", "import", url]) + + +class Setting(Panel): + title = "XPS Settings" + identifier = "xps" + input_structure = tl.Instance(StructureData, allow_none=True) + protocol = tl.Unicode(allow_none=True) + + core_hole_treatment_title = ipw.HTML( + """
+

Core hole treatment

""" + ) + core_hole_treatment_help = ipw.HTML( + """
+ You have three options:
+ (1) XCH(smear): places the excited electron into the conduction band, suitable for extend system.
+ (2) XCH(fixed): places the excited electron into the conduction band, suitable for extend system.
+ (3) Full: remove one electron from the system, suitable for molecule.
""" + ) + + pseudo_title = ipw.HTML( + """
+

Core-Hole pseudopotential group

""" + ) + pseudo_help = ipw.HTML( + f"""
+ Please select a pseudopotential group, which provide the ground-state and excited-state pseudopotentials for the element. The pseudopotentials are downloaded from this repository. +
""" + ) + + core_level_title = ipw.HTML( + """
+

Select core-level

""" + ) + core_level_help = ipw.HTML( + """
+ The list of core-levels to be considered for analysis. +
""" + ) + structure_title = ipw.HTML( + """
+

Structure

""" + ) + structure_help = ipw.HTML( + """
+ Below you can indicate if the material should be treated as a molecule + or a crystal. +
""" + ) + supercell_title = ipw.HTML( + """
+

Cell size

""" + ) + supercell_help = ipw.HTML( + """
+ Define the minimum cell length in angstrom for the resulting supercell, and thus all output + structures. The default value of 8.0 angstrom will be used + if no input is given. Setting this value to 0.0 will + instruct the CF to not scale up the input structure. +
""" + ) + binding_energy_title = ipw.HTML( + """
+

Absolute binding energy

""" + ) + binding_energy_help = ipw.HTML( + """
+ To calculate the absolute binding energy, you need to provide the correction energy for the core electrons. The correction energy is Ecorr = E_core_hole - E_gipaw, where E_core_hole and E_gipaw are calculated by Etot - Etotps. Etot and Etotps can be found in the output when generating the pseudo potential. A offset corretion by fitting the experimental data is also added. Here is a example: C:339.79,O:668.22,F:955.73,Si:153.19 +
""" + ) + + def __init__(self, **kwargs): + # Core hole treatment type + self.core_hole_treatment = ipw.ToggleButtons( + options=[ + ("XCH(smear)", "xch_smear"), + ("XCH(fixed)", "xch_fixed"), + ("Full", "full"), + ], + value="xch_smear", + ) + self.pseudo_group = ipw.Dropdown( + options=["pseudo_demo_pbe", "pseudo_demo_pbesol"], + value="pseudo_demo_pbe", + description="Group:", + disabled=False, + style={"description_width": "initial"}, + ) + self.core_level_list = ipw.VBox() + + self.structure_type = ipw.ToggleButtons( + options=[ + ("Molecule", "molecule"), + ("Crystal", "crystal"), + ], + value="crystal", + ) + self.supercell_min_parameter = ipw.FloatText( + value=8.0, + description="The minimum cell length (Å):", + disabled=False, + style={"description_width": "initial"}, + ) + self.calc_binding_energy = ipw.Checkbox( + description="Calculate binding energy: ", + indent=False, + value=False, + ) + + self.children = [ + self.structure_title, + self.structure_help, + ipw.HBox( + [self.structure_type], + ), + self.pseudo_title, + self.pseudo_help, + self.pseudo_group, + self.core_level_title, + self.core_level_help, + ipw.HBox( + [self.core_level_list], + ), + ] + self.pseudo_group.observe(self._update_pseudo, names="value") + super().__init__(**kwargs) + + def get_panel_value(self): + """Return a dictionary with the input parameters for the plugin.""" + core_level_list = [ + core_level.description + for core_level in self.core_level_list.children + if core_level.value + ] + # if len(core_level_list) == 0: + # raise Exception("Please select at least one core_level.") + parameters = { + # "core_hole_treatment": self.core_hole_treatment.value, + "structure_type": self.structure_type.value, + "pseudo_group": self.pseudo_group.value, + "correction_energies": self.correction_energies, + "core_level_list": core_level_list, + } + return parameters + + def set_panel_value(self, input_dict): + """Load a dictionary with the input parameters for the plugin.""" + self.pseudo_group.value = input_dict.get("pseudo_group", "pseudo_demo_pbe") + # self.core_hole_treatment.value = input_dict.get( + # "core_hole_treatment", "xch_smear" + # ) + self.structure_type.value = input_dict.get("structure_type", "crystal") + core_level_list = input_dict.get("core_level_list", []) + for core_level in self.core_level_list.children: + if core_level.description in core_level_list: + core_level.value = True + + @tl.observe("input_structure") + def _update_structure(self, _=None): + self._update_core_level_list() + + def _update_core_level_list(self): + if self.input_structure is None: + return + structure = self.input_structure + kind_list = [Kind.symbol for Kind in structure.kinds] + checkbox_list = [] + qb = QueryBuilder() + qb.append(Group, filters={"label": self.pseudo_group.value}) + if len(qb.all()) == 0: + install_pseudos(self.pseudo_group.value) + group = qb.all()[0][0] + self.correction_energies = group.base.extras.get("correction") + supported_core_levels = {} + for key in self.correction_energies: + ele, orbital = key.split("_") + if ele not in supported_core_levels: + supported_core_levels[ele] = [key] + else: + supported_core_levels[ele].append(key) + # print("supported_core_levels: ", supported_core_levels) + for ele in kind_list: + if ele in supported_core_levels: + for orbital in supported_core_levels[ele]: + checkbox_list += ( + ipw.Checkbox( + description=orbital, + indent=False, + value=False, + layout=ipw.Layout(max_width="100%"), + ), + ) + else: + checkbox_list += ( + ipw.Checkbox( + description=f"{ele}, not supported by the selected pseudo group", + indent=False, + value=False, + disabled=True, + style={"description_width": "initial"}, + layout=ipw.Layout(max_width="100%"), + ), + ) + self.core_level_list.children = checkbox_list + + def _update_pseudo(self, change): + pseudo_group = change["new"] + qb = QueryBuilder() + qb.append(Group, filters={"label": pseudo_group}) + if len(qb.all()) == 0: + install_pseudos(pseudo_group) + self._update_core_level_list() + + def reset(self): + """Reset the panel to its initial state.""" + self.input_structure = None + self.structure_type.value = "crystal" + self.pseudo_group.value = "pseudo_demo_pbe" diff --git a/src/aiidalab_qe/plugins/xps/workchain.py b/src/aiidalab_qe/plugins/xps/workchain.py new file mode 100644 index 000000000..4d8efb660 --- /dev/null +++ b/src/aiidalab_qe/plugins/xps/workchain.py @@ -0,0 +1,100 @@ +from aiida.orm import Bool, Dict, Float, Group, QueryBuilder +from aiida.plugins import WorkflowFactory +from aiida_quantumespresso.common.types import ElectronicType, SpinType + +XpsWorkChain = WorkflowFactory("quantumespresso.xps") + +# supercell min parameter for different protocols +supercell_min_parameter_map = { + "fast": 4.0, + "moderate": 6.0, + "precise": 8.0, +} + + +def get_builder(codes, structure, parameters, **kwargs): + from copy import deepcopy + + protocol = parameters["workchain"]["protocol"] + xps_parameters = parameters.get("xps", {}) + all_correction_energies = xps_parameters.pop("correction_energies", {}) + core_level_list = xps_parameters.pop("core_level_list", None) + # load pseudo for excited-state and group-state. + pseudo_group = xps_parameters.pop("pseudo_group") + pseudo_group = ( + QueryBuilder().append(Group, filters={"label": pseudo_group}).one()[0] + ) + # set pseudo for element + pseudos = {} + elements_list = [] + correction_energies = {} + for label in core_level_list: + element = label.split("_")[0] + pseudos[element] = { + "core_hole": [ + pseudo for pseudo in pseudo_group.nodes if pseudo.label == label + ][0], + "gipaw": [ + pseudo + for pseudo in pseudo_group.nodes + if pseudo.label == f"{element}_gs" + ][0], + } + correction_energies[element] = all_correction_energies[label]["core"] + elements_list.append(element) + # + is_molecule_input = ( + True if xps_parameters.get("structure_type") == "molecule" else False + ) + # set core hole treatment based on electronic type + if parameters["workchain"]["electronic_type"] == "metal": + core_hole_treatment = "xch_smear" + else: + core_hole_treatment = "xch_fixed" + # if molecule input, set core hole treatment to full + if is_molecule_input: + core_hole_treatment = "full" + core_hole_treatments = {element: core_hole_treatment for element in elements_list} + structure_preparation_settings = { + "supercell_min_parameter": Float(supercell_min_parameter_map[protocol]), + "is_molecule_input": Bool(is_molecule_input), + } + pw_code = codes.get("pw", None) + overrides = { + "relax": { + "base": deepcopy(parameters["advanced"]), + "base_final_scf": deepcopy(parameters["advanced"]), + }, + "ch_scf": deepcopy(parameters["advanced"]), + } + builder = XpsWorkChain.get_builder_from_protocol( + code=pw_code, + structure=structure, + protocol=protocol, + pseudos=pseudos, + elements_list=elements_list, + calc_binding_energy=Bool(True), + correction_energies=Dict(correction_energies), + core_hole_treatments=core_hole_treatments, + structure_preparation_settings=structure_preparation_settings, + electronic_type=ElectronicType(parameters["workchain"]["electronic_type"]), + spin_type=SpinType(parameters["workchain"]["spin_type"]), + initial_magnetic_moments=parameters["advanced"]["initial_magnetic_moments"], + overrides=overrides, + **kwargs, + ) + builder.pop("relax") + builder.pop("clean_workdir", None) + # there is a bug in aiida-quantumespresso xps, that one can not set the kpoints + # this is fxied in a PR, but we need to wait for the next release. + # we set a large kpoints_distance value to set the kpoints to 1x1x1 + if is_molecule_input: + builder.ch_scf.kpoints_distance = Float(5) + return builder + + +workchain_and_builder = { + "workchain": XpsWorkChain, + "exclude": ("clean_workdir", "structure", "relax"), + "get_builder": get_builder, +} diff --git a/tests/test_plugins_xps.py b/tests/test_plugins_xps.py new file mode 100644 index 000000000..6bc0d9af3 --- /dev/null +++ b/tests/test_plugins_xps.py @@ -0,0 +1,37 @@ +import pytest + + +@pytest.mark.usefixtures("sssp") +def test_settings(): + """Test the settings of the xps app.""" + + from aiidalab_qe.app.configuration import ConfigureQeAppWorkChainStep + from ase.build import molecule + from aiida.orm import StructureData + + configure_step = ConfigureQeAppWorkChainStep() + # set the input structure + h2o = molecule("H2O") + h2o.center(vacuum=3.0) + structure = StructureData(ase=h2o) + configure_step.input_structure = structure + # select xps + configure_step.workchain_settings.properties["xps"].run.value = True + # test get_panel_value + configure_step.settings["xps"].structure_type.value = "molecule" + # select the first elmement, which is O_1s + configure_step.settings["xps"].core_level_list.children[0].value = True + parameters = configure_step.settings["xps"].get_panel_value() + print("parameters", parameters) + assert parameters["structure_type"] == "molecule" + assert parameters["core_level_list"] == ["O_1s"] + assert ( + "not supported" + in configure_step.settings["xps"].core_level_list.children[1].description + ) + # set the parameters + configure_step.settings["xps"].structure_type.value = "crystal" + configure_step.settings["xps"].core_level_list.children[0].value = False + configure_step.settings["xps"].set_panel_value(parameters) + assert configure_step.settings["xps"].core_level_list.children[0].value is True + assert configure_step.settings["xps"].structure_type.value == "molecule" From 708fed53666f800c78d66880d3e32affe4f7b699 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Thu, 15 Feb 2024 15:03:45 +0100 Subject: [PATCH 034/166] Fix Hexagonal 2D path order (#619) * Fix Hexagonal 2D path order --- src/aiidalab_qe/plugins/bands/workchain.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/aiidalab_qe/plugins/bands/workchain.py b/src/aiidalab_qe/plugins/bands/workchain.py index 8a0ace12f..484ec082f 100644 --- a/src/aiidalab_qe/plugins/bands/workchain.py +++ b/src/aiidalab_qe/plugins/bands/workchain.py @@ -59,6 +59,7 @@ def generate_kpath_1d(structure, kpoints_distance): def generate_kpath_2d(structure, kpoints_distance, kpath_2d): """Return a kpoints object for two dimensional systems based on the selected 2D symmetry path The number of kpoints is calculated based on the kpoints_distance (as in the PwBandsWorkChain protocol) + The 2D symmetry paths are defined as in The Journal of Physical Chemistry Letters 2022 13 (50), 11581-11594 (https://pubs.acs.org/doi/10.1021/acs.jpclett.2c02972) """ kpoints = KpointsData() kpoints.set_cell_from_structure(structure) @@ -70,11 +71,11 @@ def generate_kpath_2d(structure, kpoints_distance, kpath_2d): "hexagonal": { "path": [ [0.0, 0.0, 0.0], + [0.5, 0.0, 0.0], [0.33333, 0.33333, 0.0], - [0.5, 0.5, 0.0], [1.0, 0.0, 0.0], ], - "labels": [GAMMA, "K", "M", GAMMA], + "labels": [GAMMA, "M", "K", GAMMA], }, "square": { "path": [ From f64607c601f0f468902050e167b5617d415a37db Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Thu, 15 Feb 2024 15:25:41 +0100 Subject: [PATCH 035/166] Adding Van del Waals Correction widget (Adv Setting) (#620) --- src/aiidalab_qe/app/configuration/advanced.py | 50 +++++++++++++++++++ src/aiidalab_qe/app/parameters/qeapp.yaml | 1 + src/aiidalab_qe/app/result/summary_viewer.py | 13 +++++ .../app/static/workflow_summary.jinja | 4 ++ tests/conftest.py | 2 + tests/test_result/test_summary_report.yml | 1 + tests/test_submit_qe_workchain.py | 3 ++ .../test_create_builder_default.yml | 5 ++ 8 files changed, 79 insertions(+) diff --git a/src/aiidalab_qe/app/configuration/advanced.py b/src/aiidalab_qe/app/configuration/advanced.py index df75c76d9..99becc4fd 100644 --- a/src/aiidalab_qe/app/configuration/advanced.py +++ b/src/aiidalab_qe/app/configuration/advanced.py @@ -38,6 +38,12 @@ class AdvancedSettings(Panel): Tick the box to override the default, smaller is more accurate and costly. """ ) + dftd3_version = { + "dft-d3": 3, + "dft-d3bj": 4, + "dft-d3m": 5, + "dft-d3mbj": 6, + } # protocol interface protocol = tl.Unicode(allow_none=True) input_structure = tl.Instance(orm.StructureData, allow_none=True) @@ -121,6 +127,28 @@ def __init__(self, default_protocol=None, **kwargs): ) self.total_charge.observe(self._callback_value_set, "value") + # Van der Waals setting widget + self.van_der_waals = ipw.Dropdown( + options=[ + ("None", "none"), + ("Grimme-D3", "dft-d3"), + ("Grimme-D3BJ", "dft-d3bj"), + ("Grimme-D3M", "dft-d3m"), + ("Grimme-D3MBJ", "dft-d3mbj"), + ("Tkatchenko-Scheffler", "ts-vdw"), + ], + description="Van der Waals correction:", + value="none", + disabled=False, + style={"description_width": "initial"}, + ) + + ipw.dlink( + (self.override, "value"), + (self.van_der_waals, "disabled"), + lambda override: not override, + ) + self.magnetization = MagnetizationSettings() ipw.dlink( (self.override, "value"), @@ -146,6 +174,8 @@ def __init__(self, default_protocol=None, **kwargs): ), # total charge setting widget self.total_charge, + # van der waals setting widget + self.van_der_waals, # magnetization setting widget self.magnetization, # smearing setting widget @@ -245,6 +275,17 @@ def get_panel_value(self): ] = self.pseudo_setter.ecutrho # if override is not ticked, use the default value parameters["pw"]["parameters"]["SYSTEM"]["tot_charge"] = self.total_charge.value + + if self.van_der_waals.value in ["none", "ts-vdw"]: + parameters["pw"]["parameters"]["SYSTEM"][ + "vdw_corr" + ] = self.van_der_waals.value + else: + parameters["pw"]["parameters"]["SYSTEM"]["vdw_corr"] = "dft-d3" + parameters["pw"]["parameters"]["SYSTEM"][ + "dftd3_version" + ] = self.dftd3_version[self.van_der_waals.value] + # there are two choose, use link or parent if self.spin_type == "collinear": parameters[ @@ -290,6 +331,12 @@ def set_panel_value(self, parameters): self.total_charge.value = parameters["pw"]["parameters"]["SYSTEM"].get( "tot_charge", 0 ) + # van der waals correction + self.van_der_waals.value = self.dftd3_version.get( + system.get("dftd3_version"), + parameters["pw"]["parameters"]["SYSTEM"].get("vdw_corr", "none"), + ) + if parameters.get("initial_magnetic_moments"): self.magnetization._set_magnetization_values( parameters.get("initial_magnetic_moments") @@ -308,6 +355,9 @@ def reset(self): # reset total charge self.total_charge.value = DEFAULT_PARAMETERS["advanced"]["tot_charge"] + # reset the van der waals correction + self.van_der_waals.value = DEFAULT_PARAMETERS["advanced"]["vdw_corr"] + # reset the override checkbox self.override.value = False self.smearing.reset() diff --git a/src/aiidalab_qe/app/parameters/qeapp.yaml b/src/aiidalab_qe/app/parameters/qeapp.yaml index 024e1ec6c..616f4286c 100644 --- a/src/aiidalab_qe/app/parameters/qeapp.yaml +++ b/src/aiidalab_qe/app/parameters/qeapp.yaml @@ -21,6 +21,7 @@ advanced: functional: PBEsol accuracy: efficiency tot_charge: 0 + vdw_corr: none ## Codes codes: diff --git a/src/aiidalab_qe/app/result/summary_viewer.py b/src/aiidalab_qe/app/result/summary_viewer.py index 45880cbc8..1340eefcd 100644 --- a/src/aiidalab_qe/app/result/summary_viewer.py +++ b/src/aiidalab_qe/app/result/summary_viewer.py @@ -24,6 +24,15 @@ (True, False, False): "x", } +VDW_CORRECTION_VERSION = { + 3: "Grimme-D3", + 4: "Grimme-D3BJ", + 5: "Grimme-D3M", + 6: "Grimme-D3MBJ", + "ts-vdw": "Tkatchenko-Scheffler", + "none": "None", +} + def generate_report_parameters(qeapp_wc): """Generate the report parameters from the ui parameters and workchain's input. @@ -107,6 +116,10 @@ def generate_report_parameters(qeapp_wc): report["degauss"] = pw_parameters["SYSTEM"]["degauss"] report["smearing"] = pw_parameters["SYSTEM"]["smearing"] report["tot_charge"] = pw_parameters["SYSTEM"].get("tot_charge", 0.0) + report["vdw_corr"] = VDW_CORRECTION_VERSION.get( + pw_parameters["SYSTEM"].get("dftd3_version"), + pw_parameters["SYSTEM"].get("vdw_corr", "none"), + ) report["periodicity"] = PERIODICITY_MAPPING.get( qeapp_wc.inputs.structure.pbc, "xyz" ) diff --git a/src/aiidalab_qe/app/static/workflow_summary.jinja b/src/aiidalab_qe/app/static/workflow_summary.jinja index 5ff5d32d8..33630127d 100644 --- a/src/aiidalab_qe/app/static/workflow_summary.jinja +++ b/src/aiidalab_qe/app/static/workflow_summary.jinja @@ -100,6 +100,10 @@ + + + + diff --git a/tests/conftest.py b/tests/conftest.py index 076ac04c8..a83ac32cf 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -336,6 +336,7 @@ def _submit_app_generator( smearing="methfessel-paxton", degauss=0.015, tot_charge=0.0, + vdw_corr="none", initial_magnetic_moments=0.0, ): configure_step = app.configure_step @@ -354,6 +355,7 @@ def _submit_app_generator( # Advanced settings configure_step.advanced_settings.override.value = True configure_step.advanced_settings.total_charge.value = tot_charge + configure_step.advanced_settings.van_der_waals.value = vdw_corr configure_step.advanced_settings.kpoints_distance.value = kpoints_distance configure_step.advanced_settings.magnetization._set_magnetization_values( initial_magnetic_moments diff --git a/tests/test_result/test_summary_report.yml b/tests/test_result/test_summary_report.yml index da8360942..734ec9e11 100644 --- a/tests/test_result/test_summary_report.yml +++ b/tests/test_result/test_summary_report.yml @@ -27,3 +27,4 @@ relaxed: positions_cell scf_kpoints_distance: 0.5 smearing: cold tot_charge: 0.0 +vdw_corr: none diff --git a/tests/test_submit_qe_workchain.py b/tests/test_submit_qe_workchain.py index 9f71ffb4d..5bde299c2 100644 --- a/tests/test_submit_qe_workchain.py +++ b/tests/test_submit_qe_workchain.py @@ -62,6 +62,7 @@ def test_create_builder_advanced_settings( electronic_type="metal", spin_type="collinear", tot_charge=1.0, + vdw_corr="dft-d3bj", initial_magnetic_moments=0.1, properties=["bands", "pdos"], ) @@ -80,6 +81,8 @@ def test_create_builder_advanced_settings( got["pdos"]["nscf"], ]: assert parameters["pw"]["parameters"]["SYSTEM"]["tot_charge"] == 1.0 + assert parameters["pw"]["parameters"]["SYSTEM"]["vdw_corr"] == "dft-d3" + assert parameters["pw"]["parameters"]["SYSTEM"]["dftd3_version"] == 4 # test initial_magnetic_moments set 'starting_magnetization' in pw.in assert ( diff --git a/tests/test_submit_qe_workchain/test_create_builder_default.yml b/tests/test_submit_qe_workchain/test_create_builder_default.yml index b2af426fc..868198e3b 100644 --- a/tests/test_submit_qe_workchain/test_create_builder_default.yml +++ b/tests/test_submit_qe_workchain/test_create_builder_default.yml @@ -26,6 +26,7 @@ bands: occupations: smearing smearing: cold tot_charge: 0.0 + vdw_corr: none pseudos: Si: Si.upf bands_kpoints_distance: 0.025 @@ -55,6 +56,7 @@ bands: occupations: smearing smearing: methfessel-paxton tot_charge: 0.0 + vdw_corr: none pseudos: Si: Si.upf clean_workdir: false @@ -87,6 +89,7 @@ pdos: nosym: true occupations: tetrahedra tot_charge: 0.0 + vdw_corr: none pseudos: Si: Si.upf projwfc: @@ -123,6 +126,7 @@ pdos: occupations: smearing smearing: methfessel-paxton tot_charge: 0.0 + vdw_corr: none pseudos: Si: Si.upf properties: @@ -158,6 +162,7 @@ relax: occupations: smearing smearing: methfessel-paxton tot_charge: 0.0 + vdw_corr: none pseudos: Si: Si.upf base_final_scf: From 979f2e483e02928d2f1c31e7215d966d7c1ce451 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Tue, 27 Feb 2024 14:03:55 +0100 Subject: [PATCH 036/166] fix pw setting for molecule in XPS calculation (#625) * use `gamma_only` and `assume_isolated`. * adjust the `supercell_min_parameter_map`, so it uses the default 8.0 when the user selects the moderate protocol. --- src/aiidalab_qe/plugins/xps/workchain.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/aiidalab_qe/plugins/xps/workchain.py b/src/aiidalab_qe/plugins/xps/workchain.py index 4d8efb660..44b697a01 100644 --- a/src/aiidalab_qe/plugins/xps/workchain.py +++ b/src/aiidalab_qe/plugins/xps/workchain.py @@ -7,8 +7,8 @@ # supercell min parameter for different protocols supercell_min_parameter_map = { "fast": 4.0, - "moderate": 6.0, - "precise": 8.0, + "moderate": 8.0, + "precise": 12.0, } @@ -60,12 +60,15 @@ def get_builder(codes, structure, parameters, **kwargs): "is_molecule_input": Bool(is_molecule_input), } pw_code = codes.get("pw", None) + overrides_ch_scf = deepcopy(parameters["advanced"]) + if is_molecule_input: + overrides_ch_scf["pw"]["parameters"]["SYSTEM"]["assume_isolated"] = "mt" overrides = { "relax": { "base": deepcopy(parameters["advanced"]), "base_final_scf": deepcopy(parameters["advanced"]), }, - "ch_scf": deepcopy(parameters["advanced"]), + "ch_scf": overrides_ch_scf, } builder = XpsWorkChain.get_builder_from_protocol( code=pw_code, @@ -85,11 +88,10 @@ def get_builder(codes, structure, parameters, **kwargs): ) builder.pop("relax") builder.pop("clean_workdir", None) - # there is a bug in aiida-quantumespresso xps, that one can not set the kpoints - # this is fxied in a PR, but we need to wait for the next release. - # we set a large kpoints_distance value to set the kpoints to 1x1x1 if is_molecule_input: + # set a large kpoints_distance value to set the kpoints to 1x1x1 builder.ch_scf.kpoints_distance = Float(5) + builder.ch_scf.pw.settings = Dict(dict={"gamma_only": True}) return builder From 1157b881fe3e0c4c860bebb68286a61723a274e3 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Thu, 29 Feb 2024 17:14:08 +0100 Subject: [PATCH 037/166] DOC: add xps to howto (#438) - added the doc for XPS plugin; - added an upload button for the experimental data. - add the offset correction into the workflow so that the users don't need to correct the binding energy manually. --------- Co-authored-by: Peter Gillespie <55498719+PNOGillespie@users.noreply.github.com> --- .gitignore | 3 + docs/source/_static/images/xps_etfa_dft.png | Bin 0 -> 87961 bytes docs/source/_static/images/xps_etfa_exp.jpg | Bin 0 -> 18537 bytes docs/source/_static/images/xps_step_1.png | Bin 0 -> 70661 bytes .../_static/images/xps_step_2_setting_tab.png | Bin 0 -> 54657 bytes docs/source/_static/images/xps_step_3.png | Bin 0 -> 40724 bytes .../_static/images/xps_step_4_output.png | Bin 0 -> 80206 bytes .../_static/images/xps_step_4_pa_exp.png | Bin 0 -> 37923 bytes .../_static/images/xps_step_4_xps_tab.png | Bin 0 -> 86161 bytes docs/source/howto/index.rst | 1 + docs/source/howto/xps.rst | 161 ++++++++++++++++++ src/aiidalab_qe/app/structure/__init__.py | 2 + .../app/structure/examples/ETFA.xyz | 16 ++ .../structure/examples/Phenylacetylene.xyz | 16 ++ src/aiidalab_qe/plugins/xps/result.py | 108 +++++++----- src/aiidalab_qe/plugins/xps/workchain.py | 5 +- 16 files changed, 265 insertions(+), 47 deletions(-) create mode 100644 docs/source/_static/images/xps_etfa_dft.png create mode 100644 docs/source/_static/images/xps_etfa_exp.jpg create mode 100644 docs/source/_static/images/xps_step_1.png create mode 100644 docs/source/_static/images/xps_step_2_setting_tab.png create mode 100644 docs/source/_static/images/xps_step_3.png create mode 100644 docs/source/_static/images/xps_step_4_output.png create mode 100644 docs/source/_static/images/xps_step_4_pa_exp.png create mode 100644 docs/source/_static/images/xps_step_4_xps_tab.png create mode 100644 docs/source/howto/xps.rst create mode 100644 src/aiidalab_qe/app/structure/examples/ETFA.xyz create mode 100644 src/aiidalab_qe/app/structure/examples/Phenylacetylene.xyz diff --git a/.gitignore b/.gitignore index 5515ed710..a5965059b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,7 @@ build/ export/ .do-not-setup-on-localhost + +# Sphinx documentation +docs/html screenshots/ diff --git a/docs/source/_static/images/xps_etfa_dft.png b/docs/source/_static/images/xps_etfa_dft.png new file mode 100644 index 0000000000000000000000000000000000000000..d92fba9b3f617e74d2a0a18b659dbf6e2936992a GIT binary patch literal 87961 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

GP0l5}enQTq|0T)}~ zne(vc9E*IeENLp$d44#V~8{+YnqE)$?*vp`8edu5WP{KkL;3bPMI~&!__cy1PNlr=+iZo|h>l@kfNIHdioN${=WYPB&_@ z%JSc3#n$TqRGymWL>_<83x7FKaP*;d9;uW~l8|X)yypn+k8s7|vL~B3xooCiduFF7 z$xCZilt{HWqV|?bb<qr@n5-uu`}p5Mh+y!KeQ! zIVfk>#7rl!HxFC?DdTVd;ei}3{zNVCRZWwkXb1NxIty?-(CM(u)hAdWDfDwwXkol> z$FG>5>y5cyZrx6Iz#-b#^@PvX71YdFuso39pZ&6T1YxpEG4Hv{tV(MulW8O<7s%l} zj^FYEyM2Q(fs-#;YF=D3gL}5g_n5nru_&cg<1G#9hCBS6Bacca;1LZPF8L-T1?_YT z)JDgYeE7DENa=U7`-%2SJ>{yyZ6NGKO)KlH1EH8)F%yk6+#4-?Aw0L}@a>Puw9e-8Ab;z66a z-dhXSDpT=56N#b^asBtMxSnwXpPJX~QgE^H%7MM7Lo-m%M(%6R6ui{TXlE+@{*Dth zxXeG~T-YO1IKE8Yg7~E~K2+d0T^r}3s+uyVz@KB@%xj>i=1Rh|k$?$Welr}(*Ef&N zSJ`dycCN+3aavy8Ud3i)B-BeOW-)$KsyPThe;IBGnG7^&oo&< zrwwnxN5GOP)=B^K$AAT2eTR2gyaJ;XsAkJ*mJY{G3C~W`G)n*Xb2602rY-gTjTU)c z9lIP{KpBvxw^-}-d*#S(f@Q?J3VdsIsrQ9!aJYWa;sZn{S0do_#IaQWjduN-!v~M> z_Ku_dEJqT+QClp1(}n5xs0V7xOB>2yw`fRLmj`=iliO-}*&OjL5!){5ExY%{czUEM zla1tMu5pT-FHj6y*8{sh-elnmM5ODQ9Qu~}&Cm@=+mNf|6xIDr4K1aO^`^7JMsx4d z=OQk69izqF^~p4U(q-4DJabhvVCH~)%!tsm12wY!+E|EvvZDr-rKVIZrUUoOOn~?n zAC(#Z*^a zZ@t?aiji?JJZ48oYO~H5MZ4ykFP*lZl5jh*39@ixi4nX$2(YRTexCN zmNY)Xw9oZ?YY^gTDYEx1?^&e*OsuhePmJ$sOD^H``mNtodW3&eA{lr^t%l%4lXyPg z=0A;Q29FrX@#*@NZbd?mgZ2ki~iiDHk23 zj7)3N`yHC@Q+5TU49H~HF^c+)29ulQRW$<@r?&WFiH!N*0&(!xHr3*x_EraN*1hf& zxBgrjg`GOo=TQ2jfe)_72-ZqzM+j(|7GH{nRsu15n&>$O>d7TBBsQz2#4?XjwfayG zgbk>daQ4s*lN)ZPqy|&(PdfH`m(Gov7^eK7bZt9q-aONE1nnI`9ICrP&PHd_Y~Kq( zwO$IK-3=N9L#s9*+;wUsEy~UzhK*do$V)RmA>B|=QLWviF#T4_W{gS^^>&6ldluz$ z;~E&c5O0um1ku|wA;uuf4IJ8G6{=^1w^$!0jnk}RP#_s+Ywln@;<0{ zj7=^Yad)p24ne(uwu2Yj#q!=>pVP6`T&Cfj4}YEAFw7t>Mo)>J2_|; z5ABl@Johq+uTnCow58iDF+x;Fg0)Yu2%Yk>Xrzov=LXaQO+9Zyh6N>;&PdL$C2E+ut>uz14Vg~X%O0tZ_)$L&IFxN_Uv_9;p!!D-j%r*0YH=9vBe&5IxMy0 zY8^&`dyvrN;wUv@XV>FmHGj)G%Q0k zE0=m~$x6^oo!F}um}6h+uhOP2Kdya*u%WLychV~r?*>)B-!k0Soc{5u$`+rra#c84 zI#KoU!SJ~}ph2~#(?Ghw6j7DC9YiQXb}(L~p39 z>C58cpnk}T>vFr@?AIjxAI8r9Pat?;A0#;uJ|>D*0DX3_A`y&l?dtAkS0O}JXeIL+ ztgfu&siz4^t<&86A$4p(L?mf&+i<45!U&EYOcOrDU?5N^ln_F~szORZF`XuCTj#c- zi25BbPcXp;4)YNcVR?y&vhVPVhie$t+Qe8`S|S?VEUCGH%DcO}HE?)JTU*=0;v$IP zrsb?nVV9y=3V5CQK~V40jORRFr<3zSkW)|Kjcw2jOd zgEGUf{Egr)pi*E7usy(cc3$R^ssRqyJ3mB0xIx^`i_I9ihJUp4Zx(g%T?M3}HaANc zAuSs%IIVlMZ4GL|uUZQi=pcPLy^z`%!h79DW zn`5WY-`6LYjnGAkP-N~?>843=9^OQzKzWDxovea1GM`7~dEimXF!#wEk#pnu%Pl{l zjasLnf!W|2KL*e;VsZ@s!2-Q=QJF^g@=@qK7s0Dz!g99Z4cUV9INI_EV|q?ee>r0X z@V@j0Wz$co-fAUr)J=?z<3H;+N*|q8nOLIBX{)|+$?Eew_^Xgb2Dmrw zj{SPyC!#DSA1IOk979KwS23Jm6TvUDL6Vo*I@EL)PMfqQu&ZEEF7C?5E;!w6%UGg2cf zV17kRBmhYKVn0#HuFLlI*IHI;^3FnC{bLp6KR?}ih$cG9K)p!)=F5^U#y~E-<@(st;xuDVwNMxz)s+}B8Bv?JJ3&nKG2VdpK5X6hy;XGMuGJ&r3FNMcbxvmS9!B z;uVIr8O->cpV7;(2R%UAbm zmBE6&N_1De6+^U%&FPAsredfgl+gLShM2zv^TPP=dzEyE4OfnKqov7G!=AG>0UNaX zoa5|nM?_j=Ho=;cgHZp(SU>dbN#bgd!=%g&n-9Bs>QUqzrZSi>c*%BxUxX^Vw@$#? zuZtq6k!6oZv6BJRW3On=?g&mu#>HfdwyvITrV7}0Hjh&>(TH9iRUu+3JfP4C2%*hv;RaqtTtG-t9EVY=Gp<%M6kAfM7 zZUinh*RP2z=EzHt4FDwG$sqU(9YR$%x@axy-8aO=)l2f(8JfA4;{T*)jJlXisd=_H z`;rkF2Wz?B|!$GXmpv^1$9qov679%#C z6z7_WcG;?^d62MpPHh!gSwb?Q+U$0iR|z=$$(25uu#mBVjl`0Yq37T%J5 zdHR1!q}q(OYVYHy_f^cBRGX=7U104bRBrPM{9J4W`#?x!SpE*Drve0G3QI7v_T<{N z;>v`741hV0HSr`Y{H^RY6+{@7R7aq){C5hu=L2)5NK`<7o%7z7BMw=q5!LktQsBV~ zUA}>`0dJmq&W5@K@WI?vfsRKmUJ*AkFfKYRu{c>ioq-j9pOD^j@#x|dYDA@j6-KoP zKQ(g(Xzb(`m!2Q{dNiIKU%ffn(imML-^D!|)-JDWwb>cZp0O!C6yP_Fi;h+Y&k`I7 zTQu)z#ERIDKPPzo8En-6`1$!qTJGsSByD0BFN$Tr8KclPR35mew1J9ylX}0@O4e`C zT9?Wg4_pv-&~k}pBNJf0H#uI+hi)BWn^TjDhZjy!F8cEzr(;vx_{D*+3xS%R3h6^fAUz{Pd7Ry8Ho#p{0 zvn}ccACKwH#{_xnYRwlu>1q2VeYyEzi%nx=ADnqg`d5`zI{SDnSYR zQtXqT&u=Mipt&BO>&}8y((v5e=s-^7xqmcz{U}+F+0_?yptFuiqhg?UGIuc-zFY_JeVWC!fGpO5kLgPUqILs2Oyi#rkJ zyrI2q(=IS@6H{q%6$xA`N0!v>7}(Gldhb7A-y>hEL{NT+fZAK(SNf;%@Yc(8hlLob zW@@jUPc^dZmD~}wnXX$UCac_izxc`|V=1ODUTxVSzo1X!e%cI_ZqtT%N^q!<`Ki>@$atpl70qJ0esU|csB&~_!@EYs*M z!t9lo<4Ek1$mB&GzoEO51@2e3)wxd&ej`b>MM+ezk2m|!QTlb1rkbjb-V*FW8xXQy z3J-o;!2J%yRJ0Sg|4I3224;m5vj>9*OcRqv`^U9pm5mp*A4wFf+A+^1&!}ggVxKkj zckeXto4{SZyGs+_f|?g5YBjy`epH0MT?#6z|LI94TcS9$4*aYmeGQIzU$avTH;j z!1^wgHo&@`Nr@edw_rx^k^zXug~Z)Us%In%vU+9Rfz9@a1c{ZtuWI|UW@ zSxN_Tu<1XouDR?x@+$6!-q$RauydxtQ=pVHL?}U{=Is z2w@40eiP|W?Db<&UzXG`4SK6ed;VB+Fd7tT7Cb(v20?J-QMJC$#{XWg{B$qy;1E_Q zaqhQOW^ggtW^3N0c-x_Wn@`o~DC%X(n3Q3fA_juVt4_z@)$31^ay19vb&L#`jC%(H zx7vA@jgtUshFSL>_%+jhJ>XraTFOZ zg3CT@(rgLCkdEt)L zmtOi0XT|3hFI1-AtW>Hf$e88Y@45p!zC$kqqRKXdf@3n~c92q8Zq|Wn6E;&I;NJLQ z{|evUf8%^FKaEmr4%1fv&AaCh`LH>X#ob8UCGpxO9}(AJnX3?&U>cG99`NsZFnZ>%pD(D6AFeq9__D1oQ7Q zyWA#4w;9w<2ACK@_A!ZO2NLPKue8dr(%aI@w@ZE8^L1OHa+Id02?VWyDv^;-DHR=O zxVJD2>F^M@Kc!*%`byBEXw8|gB*^55L;vc0F&J%?^N1UJf8-ep3k#EU00C!ExeAsg zpbZiMgp}_A0gnWtIrBE&578OCzA<$4TPiPwyPW&GfX#7z=GOF-9k4eiotCYSA1r&v++8c<8T>gV;dJ<&^keOT<5T}{RA=ZGj2z^sk^aWG@6AO!6|+WI5X1L|wS zZ#yAogklp`@-E2suE;^tx1hyN1#_jdeyLqNfH9tgZ3`(NF7$1`G{TIyl{aN^YVl8H zpL_-vrpyFUv~Nnz>(a({S}#a?O|% z$Y4EgQF$xFu8<7N?Q+j34bU<}*;ktyD8@|m-ZSYuB(RYcW}Te}9n;-XhZ#1ZjHRCR zHWpS0KKg`xuvtVAjxUj%XmA8YWggJnN0`muLh1FNnk~v)ydK7gObmzsz9a&rpFDYea&pp#mHGA~7*SE; z+HY-cl4XFv{JOYm;CQEF##6%5!i?DCOK_WAYdR=3bIMWOF)V7ohcrC&7_+@Ww14(! zAn!8kADXmuhvio(fWWiL|nrE)IyvZz%e#pR3_VFXpVxwEAK=_Y=AB0IicC279i<`uHnEe$VXISNsVTEB^2kQflg& zb`qCP;rfCcQDcNO8Ns1Yg*UGKv8MPPW}QOyw6mLcf7tv>f|XmJ;5B&pztz$2e+^bL zW_#b-O>L9MdO$qTihr%$3lhTHxayx{j_3dNKlBl7d%;?#LSCCtuuxQ%?c#skMc;_Cc2*BfrWw;{*TtN}8GqsDIZOT!R-JHWg@ILcP`gQ}$-Y-8wU1{bvIeKW`Us za`a@bpI42$`to{3K_tOV>OXi~K5I9qFYjxiQm;Sxbv2)-Z7(Ro{8HzT+5%g}+ZXNy z)SL-s5x63MYT@D!AxF})4N8K$2{&0fVy=sSwA~A1$O)|c?9m(t9PK`=Z7s9LW@e3_ zwq)=3=ZbAb2`M1ljwoTY*M;{d+di`d?{kA)IEFv-1{TG~ zB--2{Jp%KE&Px1S7FKncS=#;GuPRF?o%2si*Wb+*bwI9p=KaLox_fRsg}Z^5^_UfQ zv~=E=FojSoZA04`_$5Pzl^>*q*=j`dvoMt^jEHY)u& zu(}Z2eEt-Gw{Hz^lh6-6D*EOEo!Azjade+DOvib3k|=8F_^pkV{rY=HO9oV&YQ!~v zAMxAQ2&1VG+y=hLr{R;#J+hW?9P6d_s66K3HtyG>BZ(bNy5;YgAK!84Cj0W5JV~nf z%^XG);=ly+JJ3`nF12jQRb|~qb4u@%!DNoNJOupK0x)cPc=R?WiB@1MDL&uMB+5_U z+#5kBBBw_3(B^uzJQ4g^sO0v$kOnFWf{-~*1~1!rLOtK^y0+!T9Th42F|CCRn>JSz z*V#j6-zJ2nltR=5rul>??SGP1NCz0`SwiRjU1~qnqSRt36Z4v-_Zrmzy}O79P^{sC z&@is<;IV?5;3-lmENeXZT*hJCjh1@HK=+(oC6@az$U6p{S>l?^_bv`WMzw{81rQ$= ztCu8{8Wwz3wOX#aCiAt0^4qVZ6DKBD8-=xb3nSa3k*uD;v!|?ev>c~8oqea8Q7Ty) zm7X|#R)-~j{iMv=zN>EJ;hu-qg*W5W2`-}EcIoL*Mx(sUTTi{Or_GMwHbx5a;p?V} zZaU}k^F1yyZxJf)({tq^IA_y~g5yhL921tM>eA@j%iQp%%txz9{qmc&1zK|vCNo(= ziKL+6d^re@T0(BnMaM+E9d|$Y*$x6Ehh};Vq0Y=Wpa-) zgU^k>bulhNLdOX9F@pAByXhQ~i#a_zp!XMzFgz~L>vH2C97fjFHeZ;Ib!oZRofsZE zdIhz8ZKkcCjvos}pj*u911`*W&Mz8Ioaal=EtQIQ;?`FUo3bVRWtu9kx#nZa!_!fY zCqnO=rA=vad6`H`U9){CK7t8+Bt>thlR}IJz`lqEX{*~O>NLrV0xrQ-HN2*U(CNyF zV(JtRE^V;t4!`D}Wa-%-BG2NTiovhb{|?-hy;slUqvD%{-~qjhlN~7NKRWhXk`FT~ z!Sb4%|3_g0|DOue|0^LA5$lT|Q|8i$0tGFqlW&_sLTzuNvb16Nu1R8qvV%Cu+ZrS@!=>C8W$*sGxOf$?J0Zr*ZrE(&i3W&xm(UzV}uS|g^8 zR><8vtxD;$<>%ME_<_4yr>XWp)7PXupA}xdH$%~9;*XBwfA>jj(f)Q&dT+$;m?DW%K;CqbDMWrM*Fn50P4$&>bD-{(?cVUpYVp9& zxM1{li~nxlAY0#0o@^&mOj;JlQMkWfy)ltO=xBHU7+r*(Ow6|sd`S*D4WFhwoiq>2=3;rN+ zC4uqs_0O6rCIC4`Ta{nTAU8Ly=N8NwwQ8wN=ebOHAlvgt9ozzdiW9@8wi*xT*2G@43Az^+EH*SAp5rtDh+z zIR?BU+yD!yq9!u#?lg-nbyMG#C3+@#T%h(cxc1(UePN?np%0&1ltqp*Tm!R&m%Qm* zCH69m&wEAxy336EK7ICI-I+<8t)UIR^YNh*n?Z}qIIfWAO{@8>xn;+VTP+6wsSxRX zdikQjdM~WeK*|B7E*yzj!duze_%E)eezAHs0m`AJvFM8E}X{VTN^k3uJ z6(Z&)lu<54%-U!*1vnPEKDEI2{XJzBb39TI<;iqww_|_rM8TL+EL}g24 z%Lx9SSe^6VaOcHnKyb{)dV8k^Cmej*)6(ducYgq7IU6C<*AvIfDdJXC!oiGmIEXU~ zB8#Da*YQbB6h`%e^}l@qF2l?4$l(qFv&=lbfa9N^b+38lGqDB*oaMx7%Dh?bC;d`v zktLa7BP4PMK6+K?xaMC>md@-_6fn>Cyjq%Qyj@~^_n&4#Qk$DS*n>J(S#tPSvin_` zhJgXQdiJX0_s3>|l&1^riP*}8-%Olb`DPclre*3v*T{=(#0-MQ3XG3uhPJQJ+h8>pXCVgNHj#zHPjJ+v>|PgznG#Gd*Azk@5S(IL(zQx>yj~G z^Nh!`VkS=?)o;Bp@rqVCbs+i~j&*~}d?n1&VOqw|eBD$^hPNrR^}U1VM=;5t@Ou^L zJPwh5T%6Relf#LZ)`*Kn7wXravxIlp5I)n~#@|8^D4H|_qsM~TRn z?V23L9Ap?bD+<~CL$ct0*1Q&)I!a1dN9=tQwV|T}GEm(TnkO42907lOzaX+RBjWFc zu{G{JP10u}@Ntdb&O;fbb{m_6X6GV?7a!QcIk#^k_%+=!alDg9&k|Uk?)GYe`dRxK zpM^G0QWd?l2M(3L8<4tZicx!TrunyZBp_Yjs@v(|>Qlv@aNn~5==#?|4(+)gFWpmB z;`L1Ar|&1IJUMbx`FYfFtN04mdn5NoV}Qg*CliaH6QdD zJT4>H0DLn^!wr!B2%imtvN^^E2yH1}Y$^Mfz01WVwOx|k(QLASg*Ps5{_zTF*}d^V zfN8-a>j#K4!&H%~l3+4qLQzcMp&2db>1H%p5gjQvb!y-9ipJCV;F|tnk~I z+H=iH!JFT9Q3ouGJHo%;1|1wr7x z6XI@I3ZZfN1#DwOYmUIGGy045!%9fpFiyP_?Zh8*rh~a7Sg8+(0F5Ms4)PkXyWJl% zh$!$A?2l7onbDYy@*a0zgRj3&A~X81BtJXiUW2}Sr5LGLZhi~77V!&f^Cz`JBImWm z$4@#huT16}*ZN0}LPhjp^uvu<(qRxEGq@q%K|E0Y<9z$M0)Oi^&jKcGBjprwd+IKds`(d8Ml8^#eoJ0? z%2K9J9C#$3gM<8fN!|C}9cewxq5gbx&2=_9cyG^^*Fm`XFf=+ckzJN(JJHO{hR-VC z!03Ua5Luc-3At<6Vgs?+5$jKyjx?*PeIu&7y**2<;tb~*1AV+Rj&6(2M*DldA2UOr27=3N7ZCVw)-b~6COyr1=e<0*EaqpEb-#kf7e5vsIxH$5@ud;AL9QlQA-`6 zHfN+z0|wYbO%^z+)^89PIa$Aq{q8rZa}8ZsHekp{)ZUv~ah8-Qq$Nmd-I9_tilCbJ zE~I{FfdJA;buFZ0}0mHqI?Vlc9&FORRvlNDVrb%@%ji zv!rgNXeSWl*C>gXWgl9$mhVybqbwt;@Do+G@SS;WH!{onxowZKH2Vl2G!BU5$*l`{ z*LarymIk3eiI|hAN6?hs{G;V_;u|Kt$K}--r4QAwWaoXJ zoz1jTa$dhx10V4B{w|H9&3{8Rfa*4^yI*D=hSTX_lmopl)bhGy@*O!*x$yA&8VMX5 zUv;eE6spxoPDqt}xY&z)BT&Out4t2g)Q!j4kM@6y-&Bv;pP6BPrVBpd)Dh9f`@JqN zkTM?bNYrYwnF6llNC_>D^gn+14Y1E&Q*4(+IQFNFHg5R0#NT>^t5laB@-)2qQcs}C z@L!rf(zE>NSieDJDm>->9i(*Ap>*e7`SdMjIBw-gPQEQ{p16lwQ3$7-UP?}+GXpuj8xaMB!*{gL{4_u-vw7PEh9Z3L%s3r{)c`c^wCyr)b>!7m#781uZNSEREeMm!IQ>Rr2ze_Y-1KG^lJ#L$IfqH z{xkZ>ZWRzdbXGpHnGb03GyR9MSU#01i!b9mq;h>myd$8_vziedac#_`&RU=;1Uv&6-^evC(#Cl;j?fe5hy@erUL8Lct;BOWQpVL zRsPAFa$Of6MY*UARNUjP06R|GoF;WQehxwx?P@N%2z zw}2#mrw}t|O+q`~uQDj<#r+MZjtA*k?z zy;a|$IdLO6{S5yc3zRftS~)F6!GT~QL#GcQ?T^c1$B{irG>;27LXwLQ&ks=?!>fCkAZ4`vbogh zU6BC+r{#*%-ppo&_t0V>DBjyev|8niK~q^);+ zYHrB>7Xyg2y!);YOgk~8mLvp*oVg{Ey&t9K!Uy zKW{-2)tUaFa=hm6DXs}Y_XW*`z%%9gOmhTovn%W33wuHCGZbg``q&2U2bL@7!OW{S+FvCwGMClM(b~D0pxiDZiYIYuC+6(QQ~ue2+^kZi^qI zF>EFDTyic_@Rb00Hg3QE`%XYkUBD$anv}s*JfQMkh1OrxvLxYQSk;t6nmO%MRRiB2J`1t~PAndHE zmA$m20kR|6Lhxb}p9KCJ7uC6I>D~)Bz2}eUg#Qa|s|rZBB|1fDxU;+bkr*IQ;-S&j z?#_<9!6Om&^9uzvdB?`-NKhh{+AFy2v@pJl;Qb1nWv;7@Q|iVm>%b{%ne1+`gT*s! zKTtn7Wxb?Q@ymBLLFJ%nPS4m^i_cB|T<$C*A##EXn5=Tk*rm++pi|EQTI zU?+rs5wa2LQ?X1yWGfJThCTCC#G?$=IyTRedrGn8_SbX0M;J#_C1lT6y6``vZcfV` zqORB+cC7#-Im@!71ek`E5{HAB(_fGM5L=OODrb13s`R{DMb}e_wEV(sindEM0Dwe zn7-~dxIqi|g#I()xDqYu3p*}2LP?=TqDTx6XT{){8WMpPsoB@FNOy$}{l=?|sX4QE z-ibyxH;1LV(yt0+qkkD%-u*q|x-KIIx9%LC>jWc+COZD>m~|38VlVYv+3h=z%s2%2 zz2eWquyJq?wi*3%T72i<9_RIknTCEibL{ARw8taNE8*KGo}U6VpqBp568{whRZPd$ z$A{AO((=a?u|Qib{muC%sE7==KF}xNG)_Q98e7!HOnZuWJ<@NUsuomE5(=Hbg9H|j z$Yz%F{)gL}fS5B2R)vR+Ae)`Zlll+ja%f&rTWe;zQq8K;&_;w_0qb1}2EEUaT%~%B zn}%GweWMx$2Dlb)v+8b{4l%q`=pI$H>x#d-xo%Ubu8s+Er0D+lsg8rFm#1!RkE2v9Zq;s zG$EfZscj)4Vm8tuK=BNKn?nkIUF?$2=X*2_R)5w75{eAe7Qu-wHxbQN83f2HR(2Fc z9Me@1tolMM{p;gGGWuw(C3In|IPA2@$<}mu%H&4sNxif5^54P`*7>&&-Uth4VO|&#+bwnJlyzHY#zhF-svmC9m zCjGr)Py$>SMHu_N z*Cfga#;yX-IhkO!FfGXpmW)eZ*F~qVOFhG9`B>AA%pD@s+m0D@HhgsK7@_*5%{FgYY+iq@Oh`yv&{9vu_ z4suqD3d^!B`YykP{I}WOF9DwM8P47JfK{jcnn3_`jqQk5zT_W(t1erETl?Je77G8y zB&ze7`W0W^ONjKU*V^;x~g4YQG#$$9f~4*rDymQ51l<&=O@WhMNkhNkS{V;B8ATt?!Xo4r{#!$t*BCi z-hL(p&s|P5UIku9Y={(ut^I*^Tk9(NmZW_@08JkKOZT@F(!>^|{swd;t}J-pBnx$q zuj53SJu!@k;|CNUNr*rRUOYk-an?LC;=nM)e2t(nN<|`H3~Mny?G!8}nrM4f0CO`W zY`bTFZmxffv(jS!0w!7I{aaF=3XvRmrgj@!r%dSoGdy)?IEHeYe^pmf*s#;|^W^m8+}Kil_bd?usp zx>Z@pO%n8@jGKPfkr-j7G@ALU4HfxgjsJc6_&T7v_acEkgE@R8QBkK8U)!(}OXWT> z@l|qz9xT1L{2SlRvQ{Rp4>8l+NR@Z}V7}=7RbNTi+HjQcztn(J;J@;@k9G-umqQ*7dpW#ZitH*Z(W{zVEl1hA;6ru%?32H{_V* zKb+lJzw)+neX4NX?Agsiy_bW=Y!SzSdN=(%cvz{3+-~GrL`UCYCW9Oq>Wo66*7mj7 zwPwR)MITDqPFhIQbOCH+vLirN6;_G6GoBmecSO<(HZ@NS3K`iLy1o1mit>3y>iG~d zwdE6pEphWzMmn5bS<*XVp)H8I>;T-;t1HuUn`T_pQkyK%&pYV+Vx{|U!9kGX*+2*g zyX$Ts3j5NR@lf@1HPqX2f5oxaj+j@8-LLtpZQS=5|1HHp^I1oF5w2>q%v_@=k-+rt z2sBJ_*1;uk|LEzY3R&$+6&MECwM872cfkQ=Ls*^JCn{e1%*B|N?H!;A_wUydR!tDf zYK%JvCDt$n!>06Tc*-bBIeZ{0S(oEh4)xM>7!fFonldnC)Vm*hq`}*8D}SMln+B%#lnZ5W(0^d zs!WOB58mJjQ!y0SPBTX!bL8pdGVwZEdK8c%;DZESI=7=a6`v2>9gkZu6Fi>e8Qwv* zFAn=ltxhQO8v7LNG`Z4m>=cFZ)KCi;HHGEsB1=xZh4k=RjUoI9Ul&woh6|2pYj>iv zVz(ueU%W-Q_+A-T-|6)uyI;9y19Y@v3ijRPeyFNNFfWI$Zv;Kd*@vE(A|I11KWPM& zb_tdmqYO>{4~6TS|DwNfSANMPDHW-5o)QSqAH z;X!=T8`@~d_Hu`KSzx{Vg>EzbVtb-6@n(zHb&hGUO)J>ETUd?nSzZ6#4&}5Z95KLa z4E1OwR-m@y?wx>~!8X!}4L%}$h5(IF_{)z(iWLKQ5|N1t1wBe{rW0v_r~Q-_{SDly z-98Kr=LZ?sYMs4;20@;sUp^3D0nMLvrPf^@1*(Q~^{B9o7)!QPXon3&Te5el)FfuQ=U z6JI%&XJuL-KQEvd^4&3naI?=ngxCyd&V%^CP~7=N&ly)W3P2=zPAkC3*`ZrrfPS<0 z>;>F|V-SaH5LrGn?w`J@=yRV+6YtQ|ZMX7v{oX{i0xLO?J$U>FgdLY;k=!ig72rWz zDSUml5`ZQB+(plllF=jK@i6zH04bd-jP$I+{h{?CMxh=a9vI#!*89%$G-PjeQc&C- zYZ`_t6b`EQb{8aF!9_p~NGS}0>3ea8^J^5xg?)0;K(M0eAzUqpA)~ALHA{oeN14re zUPIdTpaxcHAa+qcC`$}EJQw>(nYe?bT#}aoZ>oK`v4&v{k-`ecrL-@@Nb!-o_lxOl ztacLXp&j?BluVmOtI9803>}^-wdr4T<&-eWIf(HLJ-!Jxl`3P+UN_;50Dbb+NW?o@ z?;&=n@by@Mj}1)p=i{I~Qti$Jr!u^Y{X4Gzs(*M>^9-!otVUoJ*5gHPn=x2Fx6f0exmJhy3+jDtCnFrYWv80IRH9;Z$Wrq!=w1ZR#R zB!42hcNbw{i2Q~@q(66eG6bFYswtFlCO$Q1Lrv9@kbo^K5urJ1`B1u{24KJ9WpFhP zqZM_2@y8pfhvF~cF6Q6wllL$G{d)R@lV}(&b+1_;iD`$S`zeG3bvvI?x9{=i`DT9q zw2kR_LbtEPgVV#(dyIRQFV3mJKU0RsINe&4OW&To9(kR9Zw-&XHG(^nTb{8fXhm#3d)W`9Ra|NMum5za-;Fqz-X40K zqq=V<@a)imUtMsi0YM zix_5TE{AOrR3-=R-xwZy`qa?Sq%wx1!;-qQ8#Cz2t!jj!9`~(XCriprumXA*pzS28 zMNbSusnl~BEStORTfHsr%bsy5{-T!0Esq1rQsZv)BRM3aXo`m z%F@p#B~2$d)@i*HwiP)mt)Jtu10};k1XbgJKk9D4N=oTR*8`4rb78)*Ry#5cnWn(V zv%YUAu=z?TxQCz%MPl>30nX=l?Zu%=aKVbh_uT(}z%fnP_S`#HcDmK)s$4mul{L|`Nw_y+}$$wiTWs3!CriGKck!>%DwS{irK0^ z#UV7e`gy-ELj#GCx(-;Z_RKyahOBhQ8bEh1H}cOzH!ou54WIXsfsMiYt<(OMv=xGU zHnhgF;UC_9h6)Pre$Djeq9H;OlS->8MqK42XeNs)i65cZm<=~LYp>eaO8fi&qB%4? z#(bB}^C73DiaBUf6*?Gy+GX{t^Edo?!HhtOkW3S8cZ3BL1@~!008t)EM&HD|>2mvT z)@Woi?Vgh=yhK{t`vwFmNkj#t{k#a@>Nt7KW+k+7+-bhA@aX4`K4NPgSoqPu zGbv;p*|=8*k`eIbyb#vD`bG5;N2G4^SkYt-MzktA0QLf26%0Pxw)o*63Fwfl4$H-$ zgP47I5-FDGJJP|vq^IzcZMVeU!AF9fp#7;k$L!@T7ysGVDfN*y+XYs%nu5Y&bfXes ze;Sb{7E{?s@iBV|NN{gLlOxyMv2m`$)!y$P5OvluzG=PXBqQRac{ox2w`S2-U7zMq zScWh2gkFW*B~0H|Mam<*?Y5*|HSG3clh9{tUIR}FSA}nXs5Jbf>p4tCow)%T`Ilb4hklriaPTz6{Rl zLQJCC)Z0ZFoqsO8OW9oGZTbblTYjhh9xodjH_yir7?5RGNd=JkFx;nY2rA>=Ko-r~ zQS6d>wklNdRYryjbpD(LS|D;I025*eaoI(nMWasT1%dC1*=3Qai(GK8Fv;&*1{~}W z8Pw>e!0$MbB%3bAHRJZPZrYdW0T;6DnXq{qmZk&B`CZ@!sQo~8-yqCXq;WW726O6K zX*`;Iku>4X9InUJZuBr7!Z7mxJ$+&JMquQ^=&twd>(};_``9BBTgb!!O^_Kr1J}pr zu;}bc{`Cg<<~Fs8g zx)fJLg^VAX;8&@LQ9>J%h20A{8Z^&GKO#G+DmU*5D6T7>{N}jzvvK%ICo^PM@+P#>%tbvLbtz6*D&Md2ldt zZS!kYtM@yt7o9fQq4@pZF*IxdN@Lx-mku{g1+Dzxb?cGi-S3x$bwS4a>sZ|5DR1|0 zenLGRHo(w;@?AI`Ys#w{WI-yRZ?`UqC#^|A`9n8pV= zjp7bcZn|#F4{(B-6$AkmX}(X#G{5&ft7VfpW~qT}|49)Q#W`Q}|1cC(d1hsrxXeS` zb4_uvPaOz$4Z#Strw#kN;I^F0D|iM7&neh%gV@s?y%XfjgaH-OaO!v)WOKRFYl0!u z70R9u$$RcWNAd?#YY27|ztwwi!JPO#%k{8C4=R{3n9T68bkT4^kXA94Z5An8uJ(y7 z`ZwxbcbemajRc@w)q(0Xxv+$lO=;^}nlKGq7EzS>T#EZ#zLJvhTi)SBb{C1nd>E+Q z_{0i~ObNt2&kz^ODYHW?N(4&|7&~_h55P^rkwlbhz8#t-jFLH68T`1fd_?97z1?bx zv95mM6O;_zFW-)?sQIh2utRK)Tb4S<3DJ7~Q-7~-yt_{~_Yon@t}`mmmrr~>Zf|8dzPlCzFX-<6G9bq1uYCV~&v{)hU+?NJ1p2`srr|8MiVF*V;6v}%deF2&08yXQOdp+d^;TfB z?OdzQ|K~#XQj1X%vJsC`25JL-lo`hT`N}L6-GjF|avJp6wO;T6Bi6jMZf||s>9TF^ zlG}W4nhP2%gFS8i_o7Uew^iF;?Il)iWfrg#>FV|eEFJdY!byw|3!d|Y*7O3Vu5=z) zjX*H}DCn6u6@)xqgddemL!1j#9GX`2vN?uU6AU2$9B2xAzZR|=VpU6g&42n0Z^J7o`kQo>D0r=In$d%dR?>I4r29o(zr@)p z;L-Lt9*WJg(a8C==4kgxAqy znv>*r>seQ&ps&I%v=TF~CI4A)Av&Ct?ouosPaYAk)2e|+K6)VqKVvk3S1i|20dNfKBPBPPya)Y^XLvRmz;+q`8> zeEUpnY8kBwifHB1gnwkJi~BWir-9fU6#CQd%wdSi{AnN4S+(lu?46g%59L!HKXwcO@ZTGEgc&RCP*~xBu9&_MB$coEPPrG{aKUHm6^{xKV07-=CDA;U z0bQ}`C#PVf+|=a&EpyA)j=I$RB|vq><4^v9ENvD`@m16sx3!OPiEs}$$1cYYdz945 z0;DsB$cH)LrhBP+Xy`5Fh7;+j)`^#C`}8p+6M1eyf;ot+t<>$|gn zIz8EisN?!Io=nS3vmvSD)` zhEDjzWj2QPhP#M#N7cw}Ha2@C8O;^*Acr+yG9~UI$9Akzj6R7UvWH`C8@<|!^#@aN zMjQ^>mO>~24j&K_<3W<{CGCzV_=MT>M@L{}zMw%!$7uABKGKhT1f9hmuu%u4n)X9E zyzAa<`$0=m=(ZML>jwRg7kz%KTqkm}{7AgK;jtcF*VR+l)X+`X8I54SFEVcbnCO>% zllfROIA<%P@7802dM+cDfoL>AK#a?%JB-sv(aNQvFh4lnzqfCe@{XP$@*2JgCl;p*9 z8j1ieFLWKztpdg5_c21TM^pw(%ZnxRp20NCwak*1<4?EQw3qhK{9NR*5XWXkJ4%d{ zUCg4_9k6%gDbv)coK)QfN%Dg^n4OM4ApWt zNKx@4L}C-Z5(>e$7^QzbuM_tXQ{3>NF`u;8Z~p|g71+n`h$8{I4tm6J{JmQGy`cRvIk?lzQxpgdTbCa+clZmjx3LrT?Ey62)Gip-KLHi&{)REXs!0|Jq)sAK3V7~g? zqUTM2I^7-ZO8D|MZT*pj|HDh1f8Y%U@N`)@NxBhGJ_PYmCa;U40=Z)Ed7`J1_)Qp- zt=?`-PCLUl{B-#tW!HgcQVw1dLd~)rzh@Du1mLpwzYvYWiAoUjf%QrQcGzS|EI>^J zH19+2aPnTyX)xrDkt-3Vx;R3Zke{Vud zbslHp#oheP3Q`k)yk_(x}jOM^W`9ti9$% zm>wMN*-b(tJ$U+dJ`4Jd;It!%E`vItJzjS1ZPFiUO`%W-UN>!D^mou&W%C04tI5>8PQ6y7Q z_9fgbk#aVH?LwwT#*!IBj>U^ZDf0Z3gr=2xK8LNUIaXrM&nBJn9)jU0pyn}{u?>;> zZVAxZddUssFwz9#QZtEoS*{}1A*qF5&c~atsFN=bq^vW8Wz5#i=ziMiWDQHy0(5pE zYN0L<`}p8sc_;-7n4Ch1(_5#^yRcyijr;$N7BBa5Bkela)w(Pt@Tuh{2jjgTsY69* z+rK3e(68~p`PXAnPf4wwj#y7D?l3Pu@&0WJ7bWvT{X)0+uw&^TSp+z8ZU?lGEKW?B z?pP!fbq&fiA!!Uuz<3aUm#Z)b$;>?Ija5r2v>`pSv@yXS@+X1l`y#-3tQE4GehpF; zwH`~$+?A3J(1FLXeM=20Fia+l6R5@2A1@@+e<;g}bEc55ARt}lG6sG^MHmWA6GcB$|a!m1MRag0koR_r))`q=;Wv30vRt@!9OT z*gHmVq8RoIhV9JWHSGUBsX;ON9je>i>yP;MXi1zO$#dxX(QausM4ZZJwHgyrcAht$ z+1I7L|E|&2xSCqRlE7sHn(Pqczv#gyv5UL67;-J)IG&w(Benh>)KS);$VOwsO)jh; zI;}yx$kjo-7gM*uViHqNAIZqr|_F2-sLK)@7+YG30o(+S87k9ba}mvgS2F8u~X z=^(O|q&_2ZDdc1w1Z~I6XkqzzYx8vm44oigGXN5XL}n}HfvO7dK5__t7UE%ZcHvmH zRQT*dIOrPy!Pe6i>*i5JP$S8!r21&^eWBCvhTS1zk%>b8H1|3z`}z=PU;Ohc2F5lO8u2$8JD!rb<@ zAt%EzOkyh2th(&NR_5u>j2%mzX62RnzQ8fTX3;OiC}ad~km?+P=U1#qU-gkyf~f#V^>(!2$WQu)<1%WWV% z!*gr&hgJ7v$)HYOZ&Xwt#9(bq43$bC)xRQ>8u#

`&h|$E^zHKAmC@EniLiOzR2$ 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∾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�~RJbh@{icK7V~Ox9W3=PZplci8x9H z&Z^s5u-qe`Q{h^k#2E|oz$HdH33uB1*2S=w4s~)#3xT(oz1fb|$(0mjlz!Y$Poj&q zI`H4=Zi+tm$BUPk`qzCGL$g`d^CYT>`SF1zyyhrCayGNK7?IA`lHlB3|H70dn=qy3 z1+{_2A+KV(Gq;RxknBk&4%$g_zaK}s^xoMMSxH*_h0UKwA2@_pbXH{m)&})rF-f}4 zNzlX`8v}grjQ7Sn>~7$U0yeUWlfxHMBryUvuL(W7LbEkw;BWpqu+r83P?|v{VK4|} zAk#;AwdMaKrA;?(G%%2yr&@itvXUS<(wE}28T_ilZqUzK5_(*DtznP{=|$~zxW z2P-W#dU{8Ami}-5vRGX{oZlgLZrIJB$8r>OB_wC1#lnV^wiSVk92j|#4O(H z%M`9dshJ}4sp}A&oG9v`r{C&rxw(D|{^QH|B#r^_32DO_XGz1y!`p>(b{#(hmwhLW za+F%@l?d*6*8z8e-(Ag>*1ei%GF=CPEUK!MHKtSh)=sv7X4th}EFXPb^^<-*_-mBw zqEK;#(!M?G)wOemfiJaRNtCJe*J++TR+pFZY&s8|nAOkU0y0MkM@d77? zTh3x34CMHn@6sh)^GSQJ`|X_xMZ8ExwZwsYPZ`Wd2n8<&9hv{&Bu6&B5BOZdGvr1e zc3=@q2&Cu+jw-FSc&*fI3OfHF+Uw+?69Uew={9#=oEzBr*@i51Q(a49^gh|Bi27zn ztnx?`PsmnPyYaj5zCmgQpP=kICFW&M_8IaDDgJntaet!g%WqIxoK-Dq3$Ffr)kkli zf0zYKxWt<0N$UP95*7V;F}r(aT&-t@yY-r?gCvFOf@ zrP6(XOL1dU3>NGFmzJfTE2!BMg%y6^0s<>BIz0_)mety`I-ypEI~{p;J&u*4-s2f2 zzJ)XQd7`!9V1aI`M0z1LVnUF_U_6QS;NW0%pAs(3~zeDSrFz z$}V{wn)5W`#H(4VF(fXs9cU8FXM0r#kS zre6s*8f*-$x|r+;bJ)b~4DfW{MR;FC@UvT-iRgtrinH^r)(hG)n<$sIHrJrz*S8ql z^a#&sx0*LLvV*8}R;Xr1Mqpbn64v66j^^(+>~xr=xWNlol6u-E48A}90p7iw6Og8p zq<^|V#|w3qC+Nd%#;Tskx_9i_z-8lwx*&q1&DZ6$*JVl0#c;%`zY#g%CH+rdgUQZK2K$}IVj(0B;;@Y#gM@TAc80=`dKlqbQ~q# zt08cjH#7;-n$`1~c?xzdJs|V-0r+OybwDR=Z~S)B?OGOJ?VC!r>|{*dr`?j^dq6xR zklRHOr1pxAYxX|Qr4oCd{qKY2MNMvRck*WRS;cw$LH~gMEAI83U2=yv|EvN5aYd|F zY5A#q6RMUrpBEaQvi9R3*_9a5%{k%f++f7V*~Sys{wT+3c_)?VhlcLvX?-3}rkH2;wOLy;pgVffUb()_jk91sA*fRS1%?P%Ksd! z7=c~^hbDIkLHS{}&AG7+cwrP$D)yySgKXbQE3I_?NgCouVpNm}?hv3hlB4vN5o(?hgq}C6Oh5E@9`}wi)gq6I@y;hXd7PaZ zB>1A@leDnvd6p7qCX+ddqG_OD7MiS%QQi5dz_f3k_;oeV%Og4-jk#}(Pp+rkHwbY~ z2xtG!`R3RfAST5X%VOdzcdjWI8u>S>3jCr;q`Zq@TE4_wDTkTIXNSQJvgO)c2_4l=;80S+C2#GOJ8 zi|_7^`^2pno*dvkED2kq4R!;rv2W9GIM4Df^k)L9;x_2j+!*PZTLi<w}eu!v^l)b-t|9n$&$uXPUxe za;s`c^GKJfQ?(U$c+Y(lV}|a=>s(1XN>zJY*F*=atf(g(Dat(cTpZ+!>^dk>hH$Ij zWzp+LsmmK86M@{4wWD8FdDRcBqWQPpR{BQ4>*$hm`mHbq9_cG5P1};wAaj#rs&Fgn zfpy{daJ&(XX{!pw!Tk>@<=g{xjyrscKoK_U!3$Rh_NFB(I*KsPl*8#BRn(;ypy<5) z=ZEA-sT6(9cOr8R%sX`5g)Y>$)5flrKl$FKfqLTW9ri$iEAF9QbUW?rXKve=PD8;S zUp31Zt0KMX9jA7fd`k3Xv2TgU>yaP|MB%V z?x=qc`leaI{qHgFu$kV!eQ)spYo7mq;D3*MbiQ$GFz)3F?{@5YAX8>Iq+G*0{dlcsb6!&xy^;V01TRDliJ_?KFnij=>0XoJ=%BS9*+Zzf zUELpIqNj({8S7DLaA?WTQX@MUB%p>EX(YQgOsI*pw|=gRS>C0(MdLM-$3m^6b^F!Gin# z8f;+vJWco{dIP7=9dXsGsswS=k}1u8MxymO~C2!wiE5p7q2 z5SsB!kUHJVadLUlnpOpq1A-sQjeVx6KpRH3}Fhv1Sxt z%@DN9J0Q0^;PYKvt>fulE_Yrvh)UVXCv#h*{%&1Nk}diYF&y6oUD$mQ#!%Q%TZ5ZD zqxikRW+_50wj3poU+j+XXgpk;lQ*Yf&njZMGEbY#dK_dF6@8MCZo0hm7^p!coR!w@ z6BTN4)pf)4gn1+M)N z?PIBx&NP`Zol#&_#{HZ*lVI3hp0&ld7DnWArWv-i)m9uaXE&)b%M2g<0b!Q@KNc zlk&$3jKao@KybunqLK^FC4K`2I1hy@g0xuNY5gbdKiaHKD$l=)Bxi9`xEos64BXzQ zH(gy|MoZtO0$fxHVD$N=Y#}3v?)sY8l8#DQzWQT_-0qzY%INX)MENiqin)yhcg^nA zo!L;2^Tjzv-SLx9E`nV1F3$u>&_gMSSNlm+S&gfz*)jpros2Q#UWyOl9~fgaV$JTY zO%O^y{;|CSYe&P_H6@kSoZ)7(8C$^8|3htDN0vDIV*{c6+n39_3Z z?|H2G(ww|W6v=rW1N)Im2A5`w+P5f&Ai6%32)UlYCc#G$kqJSAn}R#r3vaKo!1CMx?!5MNk2hTX5pa0(T*XC0@J=ahK1}i0{`y{huC!cm zmq&F@?Af(emqq2E_&f7HpLCA$36+b;)!w55QVAB|#|6g)P?Y~-=q~}6I1;$DtZK^1 zOsux?Yhw8^e#TnH=m@lQJ8(9*g`kvSl?~`ZTFh&qO;9YRv2L z=_E*f8zWp->I$$&s8n~o8_3{N34mwQ=1!Q%p8Q&k1jUW5m*#liYDB^(23tosHW%r> zpC*le(7W_>tp~+)Haos1IUV!XWpPixdx1F~4kRUwSFuVKOcZDYds68-q;L7JL{JC% z=2-?M=G9J{VdDO7S)w5jq2^Ow@_>)yRM`Csamrz!%>wq_MeTLBHXPI~!`Gc!q~s3+ z8yeuMbyEo@Mo^D5q*4z*0n#?ZL52o+YSWggfz2IqXI7L%;3H?K^W<4tA|tH@a5%Nu zz_9yxIi7&h4_q4gK3omla3LXWD^cT-&caA#VeBB7b#Q6a^4tiVKhickuoGj z$scBFnpitZkF{iK86@E8u51{hgZ#5UL(Bp{=pm~e5uR14D{&)= zjt$UlJ|33t)VQ9ZeHdMLV@Lkj($loWZmMGsD86pJ>c!#v6|Yq4 zM4wKOVLE!K57NGK*c04+IOQm47Y*^Q@6(Gd+ww0iTbZnF?k^=yXH z`umnf4#L2R)FS1=yyUcfG{=W^TP;HZS&evV8;IAKU<0FW^xitG?R8?_If$6t&u?K6 z>(3sJp`{^Sguj@Tweor6`z?O|Q42cIhry)+$ZL8j3LzZ_vqgwp`eBiyfG?bT^3_>5 zKf;J!Fqe^AcV>P2nUzQBd1{UBP&;&>D3Si7K*^9VLC;?Es|h#X+52FSpdyfWQvQ68 zVIouUqRQz4CPd!pd9u%0H^sibraYSgnX`0VYoLVH{#;w1 zr|O^4>DTrB+HnZDl{i2DxmD~AIUoq`|uWc!#-Pe^xgMRXWgPY>Q|^(Y=@+D6`XF7bx#ky{yqIT&S-YJii{Cbwrp@ z3g)7oUg?cYn?r$u_GxslCM2tS&vY=0O$*gw9eN;h>yu{lz1=9PnX5%4^d2@@p7Vq29iX}bcCw+FNNrm@movnta^P;V@9eHs? zPROWAzBCpFeboBupyhdsMF*?vR|&C4L_9+EkFw>nl=-Vme`#7%FDbsWB%}A@{Pc)& zMGaVyKTdh`8C>tI`%7t`)_hlvSf_RredO34wUDeR&o-UMo~8pZkX(x;PBffSEvk83 z05ZrpL^Ov0j?UVYTcK=UX3XarK4gXWPMhZJA8AE1^gmvr=&-n>cTp>k-xSa4op&(* zfs(zV<#Cy3F&;=ZwYQ<&Cac~HgA>GMR@F;N#Ewm;VKzL8;@EY z=c7a4nfg9;8(v4aI-61x!?T7Vle#}S?O2@k7?PXonoCF7rq9SyGt4>Jrh89JfI9CO zYc63rETZ_uWKeESOkUwzh1etj_)?;-&YiBB^loWPd_@};WiC;%Y*2GtN;t7AZQG~5 zDXWqr02#52!J>#9V@NcBvK!pdjA|=IabzAiPkGZAB36s_qm{b2nAzo9#o95?xG9b%~(3;oT zl||h3+;x94tx_7+0?hP}udo-kh~lF-W-%!*L*my&@$JYd2B|4=fs})9qg@#j>%*lg zTeP2^p3DrC-IYTTP;UR4*RU;Cvz|A8WzbZX(KV8E1V5kFZKRr&P(n7poez^b0WMZx z5X@ZHj>cynI@;gDU;k_bWT+h2q{BAKfc$*6X=PxWN7 z7Ef0Dc4t>qVbh0OeS44kH;%8*BN(ir7bv$WGpPcf2zC>y;@2j9)=-(UPk$p{i*OUu z?-RB>vnS3V-e9hEdS7bVMW844$A;yFu5Ouq*LyK!*H^X_*VUq|T2W#S;)*rv#0h1P zqX`%H@3P++w`mXp5$6CXvig}#b*Mjccno>j@1hTS!Dn6j2E4Kql>6SNcG`{QF5(pf z@7v6a3i}_Faz(vW%N~jspI08r@jlE5cH&j6@8>naOQM9va;bVv;S^-U#NuKRi<2sw zsu?*Jb}l7Pv}kGZd8VK95P)i$zO3H$PG1nG?V0yJEOl8iUX4DN5_|KbFy#g%zvbAs zS`s&QEhieU;YG+DPOd25*D~V&!8ZT$$icjCRwu=tTU5bMLo~RjGBj&%L1@d*D?mtW z#N?Ci@M%Cjw>X^`Qah<~zOUkZVx%w))>D54*e&({k*xssbJVAu&A79`?H|kSHs-I& zD_dh3$Q_RGyF5E|H1Bcv9k*({+tV&D?kvW1?19_=Qzm5zz-{p=yZgbq-qR#Kq=`<+ zZ>ZIon9mS0E$u#%w!tQNC*g!w&U&EA@qJo! zJmru8mf-3<%e6m0^we7pM7`4?Y^7uaGgHcgzdowd#d2>|9`lY3TlcMWmLIiM60kIx zLYaI;qAKUh2Sc~zchfs!68Qye!~^4PvxiJ2?|x&1H&9WOd=$;v3swa>x0N~Qr@X^k zpE-QIbU(8v;XQ*V+5A?kZ@AGMCzCrOS!7;`DDsn3VI%5*l@QlziHB)1%F?aq9(XJKGU=A!4%fbgwfKVAF+rUE z{^XOIT(Ng`oc+sf&m)V~Fmu!O?q1+g* zAI#9qRUVfxxnwsjVHdyTW+GUC!`GVPw?4%ABODQD1^2H3KM(8)SB#%Btuoqd&duRl zxhp9j9f3qL?cve`H=}V@8 zB^_5bOM2x&(F=8;$H$Nhl8Ml~D2MZMKlKh>msp(F8T|{jv_3BfnWZS}%N%-FKW|XyKb6JY z0#IVl?lN}Vba9UuEqua)_ej)ro&z_MktgtgaxYF~9_6bv#>j z@gMx56CSxBGQ8|+v4(^0#2GUcyaqo(xcD9x6OUi}NeagGZ0egyEukCjEIw@-Nk=yU zV=`;|n&ZEh{)!()Q0#AOi~@M(?EuQGa-Ipf}tw<^eyr26S8jnf?|x zYtw4^t>_`zH#M^e#;oX3PCcP}wb-;<9j3N_@R+3wkZ=-2+O3O+j|HnjeUyr+qt7cN zA`E|8C0flaI+JN!P{Xytd$u~gGs!h%MYra~a^vvI4@S!Y>IYtg@Ohe#Qg`NKeQiJ1 z9h`%1bAwNc8D0!ZG}eS2AQCUqAC2gWi<}Ew;G9f1I5##|K}oF-wkQni9)gMaFZF)& zfp#!=xjuI?I9P6v;k3jsZJ+(LyK&^mDR5+NRJLYlmR9K5({gjl+Hqxbh$cEJWH^J@L^A_xuUhSTf z3BY0JotwxBpU%Ew;+JPe8ntZ`Oba0Y5YJ!u;6q+#N8a7IB_3a#4-wE&RcnpkqsWWg zXgyNqTB9{85X8qIBcQ6NPhB6)#b9T_yo$V(44@-vI6w0La zmJ-mC-<|%B4TkvLjEz#a({)&!-LeOVX79mjOPAsL6!CDSvoUqQtmm>eIQDtQbY^~P zwwI)?r25Ij04xlE2V#XA0UG+%nI~}2L}Q;?OpoF*6G<~#G8u!+m9t!T3&7SZF*g$q zv;P6RKe6Ni6Iy$RO zV~UIZ{;c@`xVj9?@w<5A;0e`4U9(6a}KBC|p7|`Im@XGkMU-s8um(5y0{b7yK+s=m*NWiXx z^=|tuB)c**Vxsc4{cUl9O=Ez1d7PvZaX&- zvTR)S6H=G|f|~ateHTMKPRClxapA+PUoBSWbg-=MV-wJ??YY0q3+w%S+~2N>TfQxs z81Nz*wwtHY(A0 zdrr*nQ5J4{=x%FczF(KEJnC-qDXkjlw}cZTsW{B>tq;8r;z2a(s=*Sof+M^n(LhXz zkQ4+rR}0_Y-(_~j?Ts5VqWyksYgWD`Ya|3dd3rWN%Y0>7p^5AggZ-b0?R)+bS8~Dy z+ID0?PPbMtxCT?PdwjZeJgtc!8oR>WKdUF5r)_wX89|QKcwlrb+#C=AK-O;VCvgM5*%mf2W7jORHjjgntt3@4c)Mk=GbiI(eC6 ztX!*K|&&~^26(>cFRhjF4& znM?P{j6wJ9h2@-@WmXiGqCd26u;p;cnA}-za0weT_X5aETp$OCf@3Sjdbkzcj=43T zk(YF$tzg!anl&n2u$#)FLMECTwVg_R{k^Vboi9G0V+gCu@N?>{Dt3nGnTr6!BX_yJ zW%%b5Q1wJpFKq}cg=>YnNB^TH+1X!7xaP7SsLbmkgc|u}?(*GiN6ewm1YkE}|AFVC z+@%_0`MWK{)uIN#4JM7>^C&tc4FV1%6(6~uFZ~Ba8vJo8a^nDXo;puEB#Gu{2fc%z z(at2lO4KhQR`Hi|^eFXA?G@yRawbemo=SFJ4D9?bFpH&|YUd8ghxUxT-J-T>bjgQ6 zu@4b1Dre-d@F`uSJM}-w?h8K=K|7xvBX-Q>+NFhKG3YO<67fFTD*K1ecBf9V7$fHR zKS=55C;I&8>O9Ld)awDGgh^B2Zmdz&@&8FThr7JbzxVkWKDTiCGvEc44!D_>{OCK> z7Z=0NXfwFP!;A1fc%zj5;_qoFAf`MYqDo{CqBm$9ipQE(T7zZ9Se;ItUP`Taw2cZB z!Yxu$ft0l#6&ixY{Xg+s8v=;XqKSKIa(q{Q(HA9r&VLq^2fR%-f_&PZu`i&^i6Yk-$@^YV5sme{cEfkd&|NftLoD7 zYAy`5^|u=uoU(Fq{rNb%Be-Y%*`#Js&qtE1Z90hE^83%7a-U{pSK4ioQ)X)(Bk;(7 z-r?kQo)IN2;N72-0O+uHxG@+yiq0WeI!V;{93&qC1$vkEvL3u$i)DLL{E@w;fGYn_ zWb&1=0!iFRSN$)1UHKfxrkw@Le1hUR^qViLKkjKf&|G0|>Qg*>pH>m~#lUev+b#he zMkN^^JjHX;(vRO?-d3ETulS7nXKvT-WqiG|T^nt3F zq)7lyEc+^0eH^YCF?97Y^-~g)f4~!;^*!gHsNVww??Y_oC46rlL{3U5(WgspxXL;>+V=Po9Q87vwuf?yie%g)~R5 z03F&~yP-#CvVW7Ll8B=|m+D3@e(?eJQ#ZjO&l>W;+_ky69lAQorj^c>kU zO6S|=1D^a2{W_d(>nr=%L6zbz0~yfoLlJTr0>S#ZKaK>*OM)Hc-=_LH4&T^8-`Zrw zz5Ktf7=|QYjYoG{OV}Xl9GBwmJSARG?=_mN!D>wj_=SZ!-vbp_lUQ3C)AU&B^|{A? z4VY+x^%Xtf>1N^KDM>9qJ8ga*P@CRr zWW=h@6V2=^f~St1>l9H`Q|4N~I&q%>5mKK|_!sOo6mKCt=YJ6%+aw ztTUJ?#|)j+n)0{iQ8e~rNo_#8q!Prp+7K=Rn0n< zxv?CvcGi(h#`pcwvghz~Up2vRF7AP;rzfQMk%6a5lz4EY_kDaP{$NAlI5eAib>Tn=%+k_!ih z#~-MmWBp1-)ua41L~Ja?zw}6f6Qx0d1_%${sJ(;b&d82T&I2tBxmi_mHA@wig*B{9^_?m|rXpTU2n?7ZnXSo~DF2Z=5c*cAKMI8tq zH~$HbpUE#j7O58{JE;~L_g-i>B1#^JIrT{ETkSOa3x1#xkk7IP%(Hk`)Gye(|AW8y zdF;#2*6;p6p;57`()03YmC?zHH)QxBG&C!k8S$%~FY7IWqgBK07Tn^oHHt`E*|3~& zpEnP3g#ZEJHgjGBg$EN&b3>cQ&Us&EHvW@Y4NT^&x30LXxYRp|aqH1DS8;ar2DLjN z&LUr}D$1-tO{zIxcghTpR(9d%^zxrsa_ym0(ig>hdi|MxpeI643#Be*j8n(NKC*=5 zhf_<5NWPeTc-WC7NAr3;Y6RK4!7T-n3a#3je0a#1SH4FOII6#FBRwhKFkJg;MgqVa zRljy>7`sd6(6n&5{GYI^e(ryUT?0=Q4F4F3DG9p&D9gI8G$Z3kj;OPT>FHnJT^ru$ z75DQp(o9|BRPQ%lbB?j9tv_lotU>k02_Bi3tF4no(`7MLz0kyrvY+;wI+NAgDHtoQ z5{4aq2%w=|U^R)Rl&OSxIe%3O4CyWG`ZLO`SR?kuc;C?FzO0u)&ittSaf@%*MbCKLj9lcE;LktlkxMO|HKPAwAPVatBIz`C389xN5KGUvfrKhCQ6z0o^p}ARg z=7hT-_GYg4sntz6DgEKNTaJ1giZNfFl`GOhe1txMEg~AE?b4tyCELRE-V#<6pn7SK zU&1l_hpWY*&VpL=K`TyX?Y*0a@!MuUmL5yr?zL+VWRd(a?>rZd4-onU+v~pdN}g>o zX4YOV0C!7Hhk43MMiyE(c!*Ok(0u0|SKSR~V15Pav#4@|>6u;MEh(mV6UU46x)&lM zPi;6Qj}nPm!AqkSbLNK`dK>Y=JoT79Yu^*Xy*FuZYtt0)X{orYmun$JRDHr-5eNQ3 zW)W$Ag2K1B(n&Vo&I zSjo=I-PG*7;~ut-UIhOYaEnCapDn|jAy#zArO$VMOp2QoDJUT#f5j~}bAd0~WeX#1 zYfR|#2tdw8FCZ*T5u~wFUfzyTygM-ruhRwHG)_wGkC;jI=OclyX|>#}!|XV()mUW| zQe>3(3ldLeOyW2Hxe#k-|9wIRt(@1$>9jE2xsQA_LKMKT7V9x4N%8ZzVC31`nu*Ty z&XuLNZ2f6k2!{3cE+5y;J1&Qj8*l9Xr)Z$czl#%!Yx|tWHjEdvG^BQ zTyhs(h}i%8J|6B_S!)LRZ+qzG|0REU&t2P!wNfTZ3~Ms599mOry!Cj^bG8rtr^M|c zGxL#w<(wt;GT>$v0NfK>J0FGL?7<87dfDE>;#E#(ZV#0epZzr(fED9m<&PNNi`dgg zuv##5+^iS%y*<PbLY0}W@(^7pH-^g{>Cqaf`rvH-1xje3GV%OoWP6?<@he>1v@ z*D7==m)HGj$LLh4#M`ag)#cJ<66?4b;i-k?!^0$*>qnwVXHNwa=`PZBz4IHA_YA<9 zGYrX5TVOBbv`5WF^41%m)DS?xWOZ6N)=I^H=XMV{D{OH2M{TC``6K=Ik;aGiyJkO5 zt{=%P_Vmm(-#qFG3I+8%huE}dzkQ}6Hl}E6@nv|BPi;Dh2>W2zTIET-#=T=mt=G;r zj%T1?=cz7I|9r^cGI+$l*brZwo#aN*_&Qru3s#m{Tmt%iA=b0iXF&%%U`8p_j5(?B zOBd9IzCly?nLKa8Y%&J6{lO#t`g@^m8rGr?Le3B{VkZ8cIbQugV@=CxU01(!fdqatsRb57xffSYTJX)yw&Z0@%9X{9O ziNqdpi6dszLV3*4j&(|N7y#^$zv6Q9{KUI<(z*T$_cae}C5kPO@_H=WG56GjGGRDw zDKK0#mT`S~*-m7!ImsZ?bzq%6unoQRp#^gW!mMUHvc2CAhpHTmZ8^tgULAc&u&R$P zV#gKisCxf`7<-rNZ&qp$RLZR50a|3$MprWv#eov%Obb-2Be#P+4^krLOk7V;@0yYZ z?l}z+-DwY`SiS<_+#c~F0zFd?Cy>4Op5FE=?$MhdH$Xw~wNy;w?O@zeMR{RMCsE5z zAAn+DD;Kl8Y2YX1nihP!l0AE2Gcyvyox*)Jw)Ld+W;3P9LRZuIRCuAPJZm1HyE79u zz?uylj#D?$a3~7kEx-N|oQ_Gqj0(KG6X?2&x;#oNb?so@2{<%a?AM*9NB)|~?}KkN zURbzjKNW=&LVd1zM2Z{g>u$oE_)mF7y-JY9=ah2&TP8PYpy|b-Y{P7uRVe0OJs@zs zy+-m+MOykzE$+=KiSY{fM&-){XuDo1w>$f@K+n1;>MKnetv>MfoLT0*-=T`A(@wU- zuknB^-P@f~{c~jPlcQ~ThLy|FEh72$TE}lj^{BQKD!XX{n5H>yl5~!cmGKU5((X!e zYzWdyI$gj(D)qWMGM8$?ACeao{&2^SQY*LDw`! zda=&Z{1LOj6`#9-9vnI8EqX0r%rZ~F$u>Xx$VS044f*OgwaV<~TMC)0##I|#-Gg80 zvXi&z1{*c!;@^DBsYkes8wwRR{Uw!GHyszk8*O2N?VaLfPRr2R^dQA{u_JOfhiHLC zvQP^pcDSkqUL*BvLf-8q>z3%m=;%nV7O5d6?O)PKlOPwzkmEpfpup&Uiq9M#J6aA@ zJZj{ZI9K~RaBnKW93EAP1`&&4%RhYbUU7+s!3fo6NC#R|#^I9bidZc{9Tsv%Sm~J_ zzHp-;1-RTY7L{L(A>68Uz>suB!cqBdeBz!};Wdhg=ymR*N1`j4*C&qW=4OJ2_L2@7 z9DR30c-tlMHsQ`@)PF-dLCK)iC>9`Z!R;*vpv~!Ed(d)Nt;zc4S~wd)=6ZhQeN@rM z{pFQ!Fn%MZ6rTrQxQxXZbHxlLDRL_!O& zeiH{+d&=JJ@K#sFdiuvpg}oua!>iJR6qu;%&O7L4pqSF?GV9a8h8Xak?XOdSe+Ihr z7BYET7wvu|e!jmoF)Mn_ze7=9TkVq>N4s>3${6Nt4p_p`HM!EDoGCgz{B^?0A;Z~n zcvG5+L8c!TbG|svO~eRXD`NT@uwlorl_ldsxT4 zA2nIjNWBCca^oKxf?m@knjEY&64L=0XD~i4hd?$-^`lwz!uW#n&KcM#AL+l;KgfH* zbooA^xJ~_ z1y7@)UAN`H5slk@=;1!N|2zhTxqi!DIw!XyYG8N0;jyjTJW@I#{;WrX98dgGvD*ID znyVOgn~}ccnThmbF|LAYQPpx zfo=(X1&J9_ld%Y=&y&n?8Q7g3hPO_j?`TT&pl9bxZiPu*P+B_olDL+O75XL+8)Hg( zYHzOEU34Wc$WcTYlGhZsC$ztBCcvXDr(B_L|L)~SPIb|Oyw_RGY~#cW+(YM=j>#zh5^4jOR0r~-ITQRa~Tr605brjZrOc_GBtM|7Q8WNz zzd8BJ-o;tSX%Ea0Hz9-4?XTb3pl%R9ijJ>uWhRw)@4DzcXX2(i zptQHsoDZs~TrMXvhSWHw(CeSId z_#^D7|MlC~yjXiCJtwMrt2DHkBaDKNVn10wXCFcDb?@Q2HY5F;HyW(Nyp2)k?rN`I zA+tFy5h62oz|S{(Rp%|s_j^yX0IHJCuyG+bxRp6fzmV}5O9}DLFSINhXbbErB zoTD2$&s7P(&=35!(5jcE65TW2Pu&d6!X;rjBNOu~yABCZUz+}Grm_~kLecu#a@97B zp(wZJ7xKLO>(|GFS4Qvm#9yX!M5Kc96Zoee;hk3?TQ$3l>34jIJ}^_CcTf@UE)96! zMhmI*5!1GQx|12uUh!P`4q-$;t8WFEd$#%)T~8Ue3&#~QK~BwPdd;+7FBSG@A7EeB8s$cD`!*Iau;Kge~D*6uue~XwZ$B{$)9mrp9!v z9{~Oge)ZwbRCY2SC>4B-Z}&n@RIET|zLX6zSkPkkq`UXNeKKpF>ZvrtPOsb#T3U(u z*j`pNBgUfDLI5JrgxfQX$i7pe1}amu5`@F?Ix71z4K=nvNv3k-^xK^+=1&bg8%-~` z9~t|kx~cI{lE$M71o@)sqT=!uzg^@p{-+jz80{!cqlZUB)kYr`^Nb+ttfL1$vG^rj z^R;Ak<^6DT{>9W!`F4~Bbg%;SHXq@A4G>FKuUsqkL4>x4J13*jn$f7o$uO9j)X>u= zjGuN-On4A!@h9H030lIA)`^8MT6Mxf2X=N`rnXkmPc|g$Bf!4&o37;LoKB5Y1)tRd zBbNdYQ|B#T*ie$Bvk|H6DF=gsRi~-5w%f;v-dOtTx|Sk~Io?|}MJX?C?cGc&--XZ? z_0c8eKRwSj+G9^+hQ`GQnh~t%_0M2oepts^L^h0CGL?()P(7=-)!QpE*95GyNl^a5BMsgrB>Tq%tBC~ z+AgJ@Hio-~s_vOu^ z(qeWYc0F|=-dQZ8qj~*1KR%e}Wj`Qu^-iRQIBGJV6?n*oLXvNC)sXC zKqOLTC=~?T&v?1E<;fyVMME3)wmO&|k6fe9ydE^8P8?#Qe)ae}X<28Yw?@x{79SPO z1-(^K@!uuDUS1XETI0JtM1O?eYdIJX4WcI`hTc1AHJ8-w5cs{DlWBM=q{nJrYffJ6=f2^t>tp{6p&4-j8FXj#bf(5cdYNYHOm8$W+^+RgJ3zax3#v*_;%O9rq-Ulu;T zkkmip5%ruz#KP~cQ>u%6xe|OQWbrFH6Hbn)qj%gsy^Ez}unPqkP5M6D*8AkhE;a76 zG1BKyop{?wQ^BCxQ!d7cUb{Ok+twnMj`2S(2dBw?zJqbN6RD*E27a0|L`kCN?s^&4 zrL}#O25u-Qe&8?BdpS3K$?7&1&TlP2A|ss{9u!ua@>QB8<@4dwH52y_Y*=o5Qm{l1 zhG!~(?Sxl4=9{FnI`7eW%az`Ou4sxXbG;u;zl@ zJ-<91^I)LV7IxP|tWtlWt+g|IQ#WLiBx(i#ynF;OxgSEGe zimMA2L?H=5g1Zx(;O@}DT>=Rbq;Yq52qX|ZxI^#|+`VykcXxNUIpq5?ch+0?&3*6A zoYnkjdTUkfs@i2|fzb@4*43vmcfArm*s8xBAaCB}&^D&jb=lO=nuNqM{{uaIqZ|6S zprGXb_VgOcrn(+3){^u@S65mP8YYH_!I`#`=Zd?v$(&Y4D)v*Wh-FRqD;A2;EAeTS zJLr1I@iNc4I~b20)u!GyO<3c2c(=eP?nw!yNQ;k$nZiH*N9rQM!oJ&s*yN{LkE1-l zLQV9;a2H+Mb`*j4j^Cahu(=$Mii|}*Jqa4~{NP}SI``*@wm1Rh3o>P!h%hJMud`SHS48i7qaJOw*4$284yAv53s!-)tB)T8ReGk?I<@|btrBro zQnsk7rh=`ev@0;uTmELHV$NMS0SnD^G6ndCk_iL~4we3r83*n5k)5K@D zipw8wj7z^Fl2W}3yKc$#ek3CeG?2GF+1!lbzsrGT{*If{yDsCvu)l~Qyc(T`R$)nZ z)ObQhkT}=O`n9`n6_3x8s;A8@ac$mR4;_Q$H!`!?$7UMaJ4RY3bzH}}z_CL=i_E}> zV87o?RLt1R&9*2$u~uf0!~mQ8B`C$dUq)7C!Ha5~95Dba6GW{DXQV}0uJ zfe7y@c~*b!g9N>32TJzJ0FLdwH64|R)Id#adhFZR7srd-=^kQ+xW9c? zIY{0+H4k)Rp`3LdY4vNR$+t{86ujTegozGGlhO9~^SwKx>FJ?5={3nxoHDbm_rCHTaAHFc%0 z?}d_KJS$FU^F6VJ_cGdS1}{wYy+`DiRoT>~@tNBI3~kCheY4(bSxuq6EA&&e2g( zW9FVIN@|A#SkHOY$>!(k5~AyO#nmWoX82XWe}G5wKOGwLZ*`&nWz~vm|5`HPf0q24 zHjMsW_utY)|J7Rm8v|}w6#lBIxwa^j7G3B218VeVV{le@N@WS+Efg);mLSpepOPuV z?0-$S82w`?Wmc+DAI1{0ej|@5rNX|66X6SZOC_z+r zGbzSaFmiJ)j%SaM;x$CmcVNlcjYq(Q+=P&{DFmx8Q`lwKF>F}Xw<>*i`L4GN#^5+oyG0W-v(+xpBa3p5 z><%k)Qch3wJ7q})g{>$B!5u$@XVO}~YaX3~NtT`drBQR1roEo(Ty48;L;!W@S$sN& zqiv8>j>g!x{H5cKR1+rm`uYWkUpgWa`85p7bZpDZr!B@#iRN@J?9;U}7Jg@lx4eNgy%wtJZ?b>UZIFSk7F?0|fi(<=VY#2yLfgB>1?QE>>wx)*n$HD7+B zah)_j)rRjeLYt(UO_1}~x)C^n+r&T(-(ZO$;d^904@buiEn^Lb{G!7@TQn0B`--19 zQe^1THdDKna(0HP`?-(Fsaz&YxgIcgxeL2^Vp}Ro&NirB*A?bWD8BzJ8JTB2nwqyY zoQ9uUm>RM(!e8~)U3XQCU*;?mm z@zcjM$0f{Vq2!y~Ummov&INLb2V?M~ua zTk4rN_F4alZ4{E=-dX%`#+weXv2 z{u9>X#)d>J9-)TYsRyZDJ7LgyX;yG9B4I$Q7S;XM}3<7Jubhbn#nFYmo^~ z)tyUM_D(&o(aKtaLqh7Xs*Xxd_Miu7-Bnm|vB8y%Ts&lZ&+ZSY6FLqCY{Y66pRR%- zdiO|c$6}ptI}H~Hx0!W@vqNM;*7I}3xf`NFldjmjW)DIjsBc3`$5_ATSCkjR=r9Yl z6;qRsknjg|pxM_%h~tQ688Ul4xlO9RB-FdhsfL%X4?KZ>nOT*FbJnTsY_s!LNAcBK z)T&9|lERx3&$GE7ZWudg5JxbVH4GC|U0}(B_1WMc%lv8i$yaE^D%-wjTaU6Eq8CFS z1+#e}ZEN!oS900p7KXT+*l$|Se5Nhd`cEbK450X*D{Hlki&K+MGuf{~afdG2Jb}!J z@O4GyHw*zO4G;3+3xnr7W3@M%N#SpL^*ciV8TAkJoDK(s9GV7J zlg3=ypSE=NaEpe#LSVfJp#uoMw0zZ?<`F{b-k5Fu*)(S^}=&{(XdU$~O&^OTF;xMDjXT##}pwJrAb1go&?+j#2K(yG~) z5=GvsWu4Xn>e%tdD2q5o;?(4&0u?#}E-Qo8_P_#g6Y+bYKXOWbrWPmGugG}BJlt;V z+tOti4w@Mf`9o^l%>WWLvIOz&iEob|UK$TPw)N_P`FsOWL<@;HOqK2FsyDyz1k%vy zzIT`r^RmYZZ~|6K?wz+`r+ zd%2HMApIcyvS`!jszEEu8=utx&bsjeuzZh%|H{u-R(ux55z0=33T=Xhe&TF9{*sH@ z_1L)}84ezm<=4gc85$Ey+{!e5$ul(J9FXzNoq}|e20v?*Nk`IK``jL z1!cOz6vO*r4~!N4hlHb3+{ycvTDI#?Z>mB3y{&1G?fTD-?P^B%dx&H{QQFjI!)jIu zggr7$qLE2Xt0q)_opv&V7wcF?Y?&01-77oud{^>Lf*;!-6lPp5A7Q(fuHeGw&-7Dm z+Qc&1x`*lm;g-Y1g0Fw;uvE*Le`!OFb)iGy-wtkJnUZg+vJq+L_Nv?F(sU-Z(O{ec-6J{=c*V$&>(^NAUx*%daeaHl ztPVc62CywEx}EUs;w8(q@|oJZxE%jkQxl(@oP5-fvADY>Yv#5A?s4Vvi+pOxQ&6xK zP~An{35TE@eR}R}#M`uc*y)7kcyefG1%3?Q{fd0jkQK6e=F{=+@m!IZ!K_~hFDzo~^jlU{ivzwk+TP= z>dz04aWXso*7|yK=)V9F9mGrYXLtrV8QFiO9_Ko6JS(m|+VgCMo?5=iluaxuSB~%i zwu0QwUQGO>=?m0cOlsWKz2fnkEYiyNoJTPMU7-MK|G~uLpFPR9S%*yAx^;K~)POq- zYXM+Na_fIyHU2{j9%jnbt>!q`I7`vEtwThMI2#>~c=~>^y5gzj48ZTl9quSa(3)@!3zQ^5as6d!G}&SsLqHx!x{xfk_x=#7Zw|v}PGBPNs`Ce~9tJh@$*fBO z^^L>9<26?53|ij;NUn2q$5}vOkW|8K=6FBt*R>m}AJps5a7ZN5`@iz>Kwg*;ena9& zjuwpC0ela{R9Bm&##?T&jaaQA-jFZpb#4<<7fmJeQpYH(fy60`&(KN6K|XYS`T4Fc z$o``Un!Obh+5HY{GMfdi&t4muU9MpS!6y;*!5#5sTU2gK%Wm9nxH>o1>IGaG1Js(!Bb~WU$NM~6WVo)Yj>OT7zjQ{tAx$4Zo&YS6eVSn|EUGuvbdPZTMq#635wR(e?h}JM$|+XC)Ez z8$8HQM4d+3xJZVbnu5ol7Lz4rE1IWMd@Xu96b8!2=WSWAo7=>5wbQrlgqtACt{H@t zHT!oijA`33QQg`*?V54Yb_1-mUg}btr4fcto~d&|eR@8+`nMTmr@7)S5Miop?ru%O zFnukgi!@%AE|6?bkS6-=67_dw`>crF-L{ZAQ^G*fiGqikuyOB@6Q+E9K6YJ- zi&a+*)dfG#%lu`S0Icp$7#RaHQ?49z_r>f^PA3c3@JW`j>lw$=EG@Or5S{g zv;Oq05=e4AJJ2HJeua(bAC}S`I@O8($|Vu7gyO)uKTf?=!)0ZS2{{)nc=@GDz~b?Y z>bDlQFjJ7u_;Go|4rJ?gVYyzgFYtS}x^o9+4hoa;;DEh)-KhM=78O({Gr@;+2vtmQ zdBT$v6=jTjUXiULw-M6JRbd9{&-~Qcggu-e51Pzxs>YSUV3C#*CA%Z=w}Te+Q>B6| zMkmFS?Gv`&ntRwk9@y!pOX7CJfhvTF?{BnfF+IbMe$?d?*7F2JPI0bIS0#@Zy3#M$ z`{~}J7T zH?Yq-xut&}%zS2sf@R$xvw(KIKhsa=%~pF_H8XF2WpOB5s(A4`MIgZEGwdG72fqAp zCDq;7ehxS4iqoU{3%O56>rau&@yOnktAV#Xi1;A2p-sQcngcM<&bv11Sx9yPyNc)K4kggayXd41FH+LIXkSYVI_JdRlk}>#UyfN7j4o7OVk0G)sE7 z<_c8ypM9-G`Nzdu4XG}WiVo}cw&wR2N&~)s9f4R9v-;b9sQh@~^c^&N_5rFlR;!vf~6umtPcCvTsej~6&vF`&WP`7Bp!zgO1y^&T&YiE8U@yLqwj&2O^KZ8v6c3@JN$5p` z5I&RR*=2=J7Pn~CN6nUe(8Sx@d$%5hXy+9nzTfLJvzHnx(3OG+_dp5@t;2Nac(Wh-mSDBz zE!2p-pI(?0XAj!*sCFS`9F}u(k4kE#d{ayE-k)ZTzWxva@niA}K(&nsn5} zD&cSj(J`Gh1&N49n3R_ogI}Vy)|g(|b%`$Rqxc4(xx*9kPa{hpE2i zl7xlr1Skh9fScx2@PU%!JZ;gj_1KB;H;WOv@3EF`SLVz7DbLChJ~sL9cC~DO2K)j-*O6P;2W9^PcuVelTBi8WUXGu)wxq$0CTd;7st0SRXvoo>z~+HG*P^4vG8$F2T<4{`Z$R7Kl{@A^@|(j`$BZy5XTXq4A)(0RegL+ z$q~`PgENYPT~mSzFYf#qhVSPa8a7p(9R0Wf_%)Jsi^BU#>mw7q8lPSn1Y>D@X1uwI z(Q{9abQ>)d|J?IgbKo?OTHCR&@?zV1MWCu&0>1`gaafaH32ppRG<>^=)$dpHor~r; zm&iwhAr=k!_1{G~rsM3y-62QUJ{x(4A|u#N?4kO?+&1lgGlzV|sLgAfC%7Wa$66#q z7F>M14oUH^bYH2%!6SF@I?H> zVbLVkFT2Rpnn&f^y5&gozE`}1WL;afd5-dGua#0Nd5%1SCZmdwB#Y^E3tush@mft(vorq78p z`iSy0HbJ)XrbxHs*|+)12c{2(s_-xjf5EaaUShC57(SVWw+OgQH3~n$P7eHy1z>Zo zGxqw}nv6F?KeNow>1%RGXFT%;*B@3!a;jK3?`!syiT%^G?Y-H`sF#3i3*Ik2;>5*C zr6j*&sjtP1^I=A)aL(_}9HZ|C+|oxy1@gIkGgARQyXm&Tuo~MWZ2zwso{q%x9TN3g zF8l#Izg>-m;yTdARODjDxOitTdtR$RDq@Dh5e?73D_&X@XN)XK%@M=yEzLSUrj*OV zfs(nu3@=!h&1w&P!A5bJuQ8)j1K(1)!%_B+jy>+q?QS@@n%wE(Buy0=hhMw~VjEhT z)7!fOl- zXv9V#(s7s5IiKSbhB8h2r zcUo%=0F48KIYTM_EdIznhA)kDUYRckTk*7qa5GDcZRzWAmW6a`k{IR>L5`Svu{;VD z#tz7@Opv}AG-dr3Gl(IAAIkj2Og=&a7EE%hNv6XuPW=Qzg6omq)i?5hmo0~)wOLUw zb9VX^^fd6L`11;^e!{(i1c+PXdxhBW@n$ghV>MP(dX|yq-W}t|IV9O69pkpN)DEv# zC5WV6_Xc{t^fq#|e7%#U4K&fi!Fn}zdiXuyqBh8^P`APhWH-c+|Ba*a{G7o^cdfgh zTk>X8FShXNy(D5!LP9&rYb7t?TMYs=jq}tagt>GUid-#EZLe>Ul(aE;$(|2I&$)ESrIG(%YP#HWR5Tm4H=_u^+!)~AqNqFf+U}8^ksKH zQq3MTXnutD*?>KnkLPJ|zU^DaWvqsD?iJ=`1weg8wSQ;fLjCnT&7;pAL%7pcU!1@i zQW?2H4CNPZo?|D{0E650wbZ?|*dz9L2`OS=QZo{U#96P#o*D^DR7fD#>6IN{hk|t{ zE^BmYrZ~pu2|kTqAl&5(x4Q|Q=3J5j^3yg`L}cRkBJ*eMPi;)Mbrir=R#Du8ig$ooj z>C1E@da>A=92F?Y_W({kcWaV99+|sZZ#BT(SA1_Rcni`VD|xm)0ndx`wvzec*Q5V@ zU1#4;e)h{nlOueo043i%nqGe{?pZg{COubsDQ~2us_V_KU_4KPA8JlklBfE zAAAB0(;JX-E`{)&o+asDWvVa7ti~FkpG8c5xBAM zdHlO#o&+zPzb-)e9B_bPiZb;-gK6zd{T(ce?tzou{NukKz`8N(w!iL5=RdQ=ZQs2H z=2*WU0e;ER{ii0gr1Pz=+GKaY_inuOYSm}!NBA>L1O4Ovfoay8SfJ#@u;HT>(b z+>v^E(|2q3&-)e7cmjdV#l-xJLxWqbzs-PMAL1Cn+y!9hzEB*q+A>DR4+Xcg~^{?wZO6j?)Z%|FjkWrb-JpYul($m6MycV#l(Th zvUN#TQ;lfsDR2SiR6grcj~_CO(C~25`=u{NOc|4l7JC&_etu$?oVr*n1#~I?gYxt2 zp_K6-qDKBmZQfBAzcr<+J}R=4_d5HjxBb4Oj^JhuYyT=5nak9&_$lnLG$puD!61s4 zHF0~}1l@WtvjLixBuVsAnmP<%XG|4o)5hkM-<-1}O@he>vA61%w%(h+vu8WC*=Hnk z_rMmb|FV!x-z`hULK*>#O11Dw(lEc6;EpL%Dn(UtvEZF7K8eJ9J4`gBF$kvm?oqzM z7TzhYX%q;`;Sh|d`6{|9PQ|+O`04Szc3Wh$4wXP=DPY**Is0Rvx*f$*ju&i5=HVJL z+>z#sNxKtw3DxDy5cZU##W7}kijtM4y;9Oz`)SjUUv{M7*m}P8UtcUuZs9j3?o}CG z@5*TI9GKiej?7C+?eh``sJtnL3WgX0{Be<%=G{ae+D4N#2{D3y{mRR^&15y=*oE$rf?SnzQjf>D7|0d#aYhUUW#jZK)#&(Sbmks(a+jP z^MKmiS+G<{3TkufbP50rW*?sIbE9+)C+%bZzwScz78Ka>i-V;_h^$5|0=?DrXST2$ zbVjyi(+S5v{ccZhrs;hsgU$m3*^lg35iDwk~DJA?3@<8BECEe z(7anpcJUkTy>nA}fN5}~!y7#Q_UQ*h6XOgrn5(feB}rYF|MDW#WQ;m>4Qv+}w~ccO z4&Ce=Okuwo9{ehfu@|#K^agQH%8%9OM(UkwaIlTXBr-NLff+M~QOfl2Ck3_-q7qJ@ z#SGZ}`^3&hnnLACr}T7Qkvz<8p9fL|sSm}pt$o8>NRmF>TFDyh&s=scmsAu7O4F79 zdV1zX5%%Br*6j9+406CnAkd6nM{KOjqi6QC_OGl|hk^)|GHlgykKI7ik^dJpIIj*r zcC)|5wwwsKP@}CSb}30MjEX6nv#(fWL(p(H>w7E;x+28F};(3h4AE1fg&)#S(xcNRlLPSy%VHoET?- z@#P%cQ%BcjjM8}`#u$5eN`P#Bun`I~e@Z_cEseVRj)oEMyW7l{8sbz^OPj+U`6)0v z>hu@hF)?T{vcl&h$JVPJ^~r^I@>}Lb&rCc8;AbLjjJp7{6cr5%OjH-W$&~s?pZJx5 zKlwPgt<-RRO_nZW-}xQx`%w`}dLnJ<$r#)A&=B$m=Lrfq1!~%##i_IEx!8(!B$!!Z z7(^+}^9rNyT+OgQh(-V!(QZc`#UuZ6hHfmT9Z90_fJhHTn1bOb8MS&7_`R8&V8WY& znn>235KR#$VOp8T*yj6HGNtPE$mAcAdZU=q0ZiEjA4aR^-lp&L*G~CA3lppfC+(NLG&E~H-VljA!`8zpjOY3I3UK> z`?pmkw1Lsr8*=~a(3Ksnm$!9L&tm;Z{;#N`cn?U_y3hIFyA!g%Jj+NPl7H+W&qC3T z^&gQnh(l!W%w9*o6$H3BAdEr)W^(^IYUpTy^6O z-$-U{K1;~%E6pb4zFYeLOxpfOkwY_QcTJuM@Z&Lyh7gqrpog36k^i4hMgZkY; zI0Z_X$k)uvWwp}+kR&q|rfeG#k?Ou7*vq?2JR2caSCZRDP7poCUayTW6C9OQYNK`V zo;_ogASh`(*e~JKL*#1UF;+s)hPfrhTbz+Qdn@oPhQF+nIx-$rV!qp;jASlokA0Wr zDkhRkAfaa4rj<#?@bZi!e&L*qY{~l%XU>0p?g+g^$7x40K;H2y{Wx7X87h7nXY0eP ziT>o#sT9h=8oGND<(HlCxDQoiaRzU6X5VSXORT&$2CF)WQ$Ce_EgOAN7I61i^o}9p zTwl_ATz;luT(GcE!If6sO`q2_1~nw~D_v%t<>&Ga`Lliw_Uh^}uk)?37o!Z+>Rr?_ zJ&)Nb>&CRdie~y2<=!x-^-@_YrG zof8V`1mdAvqG;~tmzHvB+qIZ|+5>3oHBFq$)xWF^Qaw8h7AWTv=t(3eVJ>Oi${zhC&TP%*>GL zt@tuONAzG)Yjl0kuW8lptYaz6L$*9u`WR>_nP2E?vjDLG>-gZ1%#=Roh@fc_7$`Jp1Oq}dD<=tMZ?Wm4Qq1pWjoN*aLk=+`f#6QTh zhjo?pxD}xD$E*(}%jsr^HcSx~^aQq^^lNSk9ub^y(EH^2W<32S^|VEUQEtm~r3}9r za%Lf$FA18*dqd-Bs8rJ<)FZ2A59V~WhW#4!%OX}l;7t;Yg)?JUDQn!<%*?Na<}{i} zV>pa&*+v5&N?|bX4=``5pzfq;?wJD{y0)T-@f7E}WO^E#zTZZB^j7iGBpGMsxIoKj z+d9@g;ZL$}DV24|KejvVhi^ny557vKf4IRs<;3lGYx%Oa%VZUN?3RhV2g?8igdcvG%^+yz{tjk_M_F{ewS=fCCKK>M#8o#hG78e=O~FcS%C zcgzP!+vw_nljRoahH6RU!15}# zpSb~dXVEb2CT?!a#S*&#{z=<*l~+6dkb}A5UAW4f)pgF|o=aiBMwMf6^}^ht}4C+x?JVEc(&8qBnTy zqsv)wYhMY^V(5}f<6_}iBRnt{3hzC~OFM$vrs6-ZUN9`~ zX~i13)b8q9i@A3}XwRHyG|NXcE@#E9FXAMs!I4)h(o1DQ-U`QhrLJ4kp58~EvJ6$3?Q5w0;DX1tv}Xe3K8CjhSFZ6)KL3pMWWP=Dboy&vKRkbx3%)DW{z4(w9jRb3 zi|?$l4{Yyp#pztWppcPdUsO?H{Ukj4GICpsAwzrggB!?h(EZA^> z$y@B~61R}B%pqK;oj-B>xw!Wt)?@Y{v94&VZ(~u`Ja;N#YHyB{9KGSJI$0Qr%ueNe z@@X^k;ZHE~I-yQVmCrnjPsCvIUDUm@+@7fk6j^25Wt z4K=SJXFhM5vsoxrFDSzVNHGH4#^dkVx;AU3$vCJnx9A4aPwTZ>QOhfIL3nwC%!s1o zH^&{&>+-WP=0eo72#}_yc$lkaOSy2fhWaz+*jyM!rY(ptBKM}YqLN~li_HPHL+e%1Kb$aofF-*LoDRHbz_nx-md!a>Nv0%gqvyjhqkNtm>G7lrTd4kG>g|+ z?lwQJG9pvEs*uJk?Y25Fn$f0EP*FO7I^3=uPSXaduWo4&-TnIDxsGseQCnC|hO9clY+gLA>oK5Q{v;u$6)}4-Zi{vUQGPaB z@JPJUfC?5mE>+kb5fy_5&_KeMP?>tG!km#2SaqGdJ{s0XBCm;b!S0Na(U$2!dShbJ zxz_&ZK`K`Kadq~G#Nm;QtsH&p%&7cb&JB@rMib?d8=?|%nX;Dp!QG7m(*#{vJ&O02 zI`yk}7nVCaKv3PgCl%kda-&3$qvGYYL+cWg-ry1MAWr8e1wW8q!Ue<+eI;TA6)$w+ zg}690mc*1+d0Zn21LYW87k;2M_@=sP??DM6?Op4mD~{o-pk6Y*wjg_vcVYzl;{isI z0+qRih7K0wQ?%Ig)zNlk>SyYF2LtBa0vkvN#d8xUg!Z1B`{#tGOyP<0Bb-nAk0!v) ze?d|kL5JeUU9w-}z`%ateD`U+<@miVv}?Wsx*p%zxZ(#4`BtndEBtuwr>dC5K`l4U z@%jQaa(6+$nacF9r`;CBsk&z{OT(|qsHhd6bSW>Ea){qh^HbA-Kl|C+Vee@5Z(>KB zi2x=f?c+;FBtYZOZH*MY98zZ1%wA`rZ-wL~x4O!dCaH{i3kJVJv>-=sF34IxA=@Vi z>UN*~G9x!!AwNjQ)@!gAl<*QLZY;>&@Z9dJt~i7j70vD;->p4E~v zT&w1z8{_2(?w5?}osur`p7gQrQ!*OrH|p_cTnz+G^DZ%Eo*yIF&3-aUVL$9c0>SK=R=j!N^ZV;$MT$%7N28Z^CP~b*LO>(^6oKy;;B`~o8 zri@eX_xk-}EK>L~gaT2O2PRlWcS*6`x4t}~z9!jUnRi>q@HRzV^gu(z%a&4HoHHSp znd~5cs`}`-#$>uNX0+oQq*&R^L8>4!XOq1Y`Bn@1u9pJtl(n5%%6bLj9vr zP`WE!aM!tcYh6DGI6rqj@fzRo?Rr2gWVT=~7DJnoHstVhFYx_WD#N6%HU&41iTOCr z`$883sOK6~+K$Dw*!t=%CfXJ;+q}apaT2RBU5vGk%&ie+PK^X>I_s|pfOHb=6)jG- z9)gRf>H4edoL>HuwY0_2D9&$L^Z1N0%*#LE7<=GGX?Zbi12Q15dAX&%dHoD=BX$cE z6R_&`e=`ie&(FX#8bLs=s;MgsvFM{!!kT}fjovA|MuX1S@ybMMHpg-{N1zEb`gPGH zm<+~su~-#c(bIG0F+>?~CNQ+|i$YyM@Pqbcm^!0cK^&zNLsucEGoC%2hUc1dJwZ8r zU)er=Pvn-uM2{J~deBH;VE9(g29n(rOCOREk9q81wUsiPfxSrX)yA3rPYkf5w&u)& z)mElm3r1j>ZN=wUVb3%LwGwSc$Ev4$4<7vij~QI@o>85~apv$;7HisIz8Ir(3D z25ZSNb`gaKjjzEox42TV6qN<_9Aer{LsvbEo%DBtO&Z#)_zA2J zhBiIcGGHwTi`OLT<114uQcwcjK}$z`cB>Q-BN z9t|Beu3u>Mgs@%jRu@sP=%q!R3%C#>^ZV&52KX9p2|HY^r)yZ|oCg+_+rIIAtC`0* z@ig#gSJY@V?fVuE_^4u{Orjw4Xr&5I3I*0k#A;58&Xo0j70;)(6(hY9q@%jaCL>ID zL(d5oRY(15KDPleriE*Dw%HygH8VFKF<}oO0YRGDYE7K#Q-+5XX=!Ph@k1Yo!rsEQ zVs(n2{5BXBRMz*<5vUCZFH%g@@P}W-3zROLdb37)8Yrq=6<>Vh+M3itB__ilqx_7@*=GKEN5@e zmgaeh*A{@%M7xUfY6Ty|%phCLXv45rZK$jfiN1dSqUytr)J#cIG|~f>53sBlDT+Q{ zn{TsC-k^<*4GIbhW|QH!t*xylR#rK`e+Q9EgdH!sAK7lDIA1!)<2c-&n`(QUh~>zq z^jcOg_$%d!#u{oe;&g=(k%K^KH)mT{&hh_%(s!64g8oe_mf6u_&Q@Q~9M_U3p&nr8kKjOokEheGd*^qXyl;`@Mb^I4_E)g2gjQSy|D8 zJ6a>iC2;wiEW86~pAiLow7wgtqZYkS^EibE-SjBn^1Il)9eD+Zf>Mp`xO~!L_NfGA1?_ z+aH-|7G>l@K7WF&k99$yQ-FpB?znI*PdS&-+2k)Ismau_zta8aF~}$@i%d+!2c8%3 z01q3VoK(`#2p-!pm@d(MAT+%iH{Fi4JV; zd4IhWozIA&AtUnzN+i(IDreY={EY>m1(H#+)6=1)A^|LI&ez(1{P@x4eEWkJ5RHE2 z{A=MkARmZaPv&(*0Ge1@ibYZwsOQwxJ*Qs;Vo=u{RL$M;ef(!4q3u}7SeO+Ac8_Zt zqk%**FE2qyM@K{gPI_hnCuL=fk&%)6`z_E`dmu)8XXmAJ%>url2RA^wT~^h~%E~}# z(^mknKB}so4R9?1k;g3;Q{bf~U4*!JMAY%65C4#XhxZ@YjQh}YYh;YHmBu1}8-_vg7F!}INtXXt5b4|b7w6UGnAWfO}Pw$llM2ifHfKTyF&a)8D^;BLuXOq8t9xdF40RGZ6)uu;VAoQ%_7x zK>hkiD;`GJv-Egb?G@JFWmJxafq~(Y^$CD%05Xx@e2wh`VZxu20&qIQ=d<{Uf{Mz2 zBvZnEy&J7To2jLxg_{t$x3{-s?%;uln9unztEeapAPFddZviQIdiU2S|H}}`=2rb> z^Gnchtyh=?1br)Q0X$CoxUk5Ca22f9OOTX~V4N!r&3dPU)$u%K;FKw=s|Svlte*{m zwjS?}j;iDT1;a{x-6pV=YnGagSPivOJs7vfR3L2>Al)?YN1lX)gfE7&RL{gQ?{PK| z*YK#ED_?5AC69>!gN23F-rlaLq~zOUARI{n@SWnuOZ;-9fx2}^fSo@RMC-=eI$dC= zCO|0&nT#59&>}9zSGG zA`X|z1@(pVICK&les}}~-`7g}I=p%3yA;;4|Z_e~$S5opDi*lJkEy*(R zw)j9QBmS|f&;^y#xWV@XSPGkQ0^av}5UvHrJ6m415dC4At{=BTB&!!{Jz!n}KNUZv z%no+0D0B%DLFWj5zQ_^z!S>k&URN2(2|UR;Z_`~nj~{ZUqDYCbZ}dH~aA_J~OoWBk6Asr+-NU7&$sNcBis} zKu2dNL6fTIGuq!^(=P**V!YlR0WgRVQW1YpQ9x{=wkO|-tk3ph6!U2_6R>X5Yy%UW-93yL~vH$c^Bi<(D>u}&fZoE zeN+_Vwr?bN$UOaA87W8Vwog$Vbn;oPiM{&n>q{K$;Lz(_8D{TWgfmzT77fSkY%;q= zv$O|p8jyhmXk^+FkFpQrJJ?FRnmb%6De84@=z>C03BAHw*K#DNhc&TiK`w#|mzQoa ziS60%B$`|Jzs{QE_o}BBD_7Ox@+?FTWpCE32f`=&WWWkhUbKG+OBsgwA@z z!6Ke1%G2H)lKpME!6!fdqbI7+8n)8@i;@WYT>rOn{4=maaRTmQ$a(Pk!=mp-mF>(r^c z^5_e7Rc0;U%876;D9jSM$y(4CCdfXoJe`jc_tMZL>@)Ibg*(X5M2H(YF1-5XqEtO| ziy3f%han^+9k~Pp(%;vMGx0QrXvQ7)k&m{BWmEuUvs3+@7L#oDTR&BW5IK2Xm~=CqtAYcOR1 zaSgX~K0!XP2@<3?ih&e@XWY!p6WDJl7Ok?&;?x7}{;tcC)OiFEajlctXdD;u%0Ou} z_T1HpA~PjcdUKS*NP&&n$d0u(fPP(Y^NBB}HK@u?6Wfj?DOAe3`6n0ZlOi&<^Ol;& zB?E_!TD07zNO=OwKr^l<`b=8o!B(%Q0SGr-H=~$vtkLqsMOrc``Tb@br`_fNRlU9S zt75G3PrU2FCxASMr0KaLZgHhg~P0+izUH zOMCRUEcPPX%c#ZX5M$|*!(NJ;RJ{03y!ghdyI2R+1ep58@9%zK;!Dn{ORFS*wa-9P zo*E#wVOdHdjuSBG#Mf`nQduoEh+-cR9X%zK4s!@qb9R3HjUX0{3-`x4g)G;y?R34I zTGO3ZMTCHISEQEZ+_sy?lBu)7fb z$N_VZ?xBRUrPKI+AvML6f}yv?sQ;${7|nDRee@8#YA(eWE!V4GJH5tAGpi~+qC_+~ zU}^w4cwr5Xhm!qaJ4NP@k&V(@PNX4ZBWp25wn|K`X&-s7%yEEU+ojaFd&e^ixcdd7= z_2lpQt@Y{&W>TMb-FNU*Z*X(PeatWD75L3pfuWL-co#7rzN!9hx6+K6Ixw0qUnh9p zYyX&_FPK(A&LKRxY$C;}NWyaj(SmUJ`7!&4OeeK7!8%tMS6*}pMkPZO)KkjC1LU3O zYSz)r=DKC?)7xRT7|e%9MSNN5zUy3?8XMsthfKw(9+Vvadf#D_tJp)GQ7u369pc47 ztt}%-oV2mpJre@kN_ z^T2kZa&B#Z%C1m%pX`x?v9bM^LxoE#7|WehBU~%de$P1x=a1r_{An~PeEsO_nd_Z% z-U1Kf)sselx6sA8yMo#;onvBlWQ%(@CG^@gSQ_TXh{W$QP6Zsdi196ig2Ur~-f@Pr zOp_6ivdP?brYRuKH#j>I@@q}WA$00N`nW=nv&Q9x)XX``joOfzGR%X5==E>uEkyW`*Bl-|!{W1O-yFT+JcE{)$QW+T~MK&s3~-qAO@uw~mhoK8{a|sTIdgV8W}3RSZu8O>zq<9<{UEvR z-SH>NCNa!A$0-8Qz6Z++LFyfh?&^{oUtg#ASub5Xw6oZjJNrV^byGSjfi0Ne+ClZU zvY>*&<47#QRzDZ^>|O zN~xS5G?!j15fjlcPG6+TuJogjI{5yzUWd%onBq{C_?LRfJ((yAaV*B+#V21QUyM#X z57>_(u`~h+ z5ptvE6DBVve>HuKuMAGT$;0Sv5KMP#mVwSP3cJRO_?wPKf$F-^!kqQqn!I+*VzuT0 zTKo&_R3dVmWCaGk<&?9^D||eUDjgO=9d87DF8Wy^?ET@C2{J2on40sdOiNt26Yo@pYaMw=`>V&ODgAkf?{-PulOH@#$OxhBm}O9l6Ww`t ze};Q8q>rUB^m%JY5g(qd8Yby;CQ^>u?G{t1zs*z6KIM%Ob)xNS?$mJ?dqlE6-{+-Z zLlRZ8=Bi54tS>k3=KH)bQfxrpvH68Bp+UAN^?eC)_bZSJ=<&KeT>%)c@f; zvCItgC;IrQwxfnx^GmuB9s_M=BA{c7L^H(LS#hX9j28 z?2u{FKvs*7S-ExMEaYi{*mJe88XvWGa)l{wj5=N+ez_fg}#YR*wmOs`m9B>mCKKKHadeZd=R zjXTZz0 zIgih9esA2wXQ8GY$eiTiLj zBGJ^A+id%c;m-pVZEYayT>+J$q?B=T;>GfLx3y&j(9{=$n1uyHfE@rq0h~nyzuINr z&AjrrsEWDMf&>lkl8m+Tb?3;Q$ zHZiv^wy6Em^JAU*T$~ctDZl2LdaXv;#_&P=cKr&*7#sh1 z{fBQ{^USU+Q6<-G(fpz_+uvBa`yA`vmY53nc0YEpp_IB${^dD+!CZ?#(Z)vf4lmPM zUBz<~^!yg1Qi)+J-chY#lhUI|xn$*XttDq~Nx_!i=Y}`7A{B~MB!8q;;Id}V&itl& z(XvymfR*M@o3W?3mTcAUGGsaCYj?;#bFJKUSBiru!Y}+cao$j=uy4R37Ng+EbTyyt zNI`&f6N7hlXMp+ZcloXiUSs~HqT)5$KgyckP4FfhHI(L~yV6D*l2uQBSW3Dhz>S44 z3_aC;EHg#+hxZDm=iqS_SCsK5o!-dl5_{VqolytP653jqTC%Zgsl!a`DP(OWW4t&< zhAhkYc!Web7SxPk=bOU?Zp&izBEkC{9Nq29&E=1sBFGpXdPlk?dv{X zS}dbjq|6~AKZ&V})R{n+l5k@AJkGip=JeCw#tloWPEDJbGMKD1ZEU7+?O_YY;|WCV zuzb*968*@Of8e#Kj`y5dwrO*TdmQ{9A7idpVOCpJ3S{iF$;k%{Qpo-)*|<$KR#&&V z*zGovwD|fuMvxl+&}^A5OMl3gW_9kg{fv#VoM|@|2hv5$fM~6?vblUh*BTs7Q0x?! z-r-TJpQEH*ts%2A#dCefm^bw9N0WOsIXIt{{Fae2ZGL0V+sp3Qa1*>9q%AhHsg4!Z z=$BA4Z!O>q4xJ*cUPhjuA0%gY`b#HxN!rL4A^a`W&yLB3DES?t@+JbK%A#EP%J+Ua z^!nSr{&jplYc(Biw=}A``59tscC3FBqk<`2)yn7mIP?mAtAoUozbHC#4@TR)`6wh1Llqg=lLTA zW59oUsl(!b)l}a19VZiZaSI}_Xxt?{*M04}rpZnEOye^8y zO$&WVmY(kGli~~SA7@ZWKdGfIp9uIxd53B-R7jYzsnhO7xa8a#|BK~pDZY{i$88p5 zECXWlF|xnDnXNh2i?-J(yf};u8nFdPjq zTM|rqWmjBmQ`2pjv)_j8cn9s3yYEMBNHj5!J|d&Fis5&d&tYy;&up8kugELVwLe8V z47&8P{G44vi1%E4E3w@h?4Iy%d}WyGR)U#ak1?g+VghbDqxIG569vh2p;;-GJ?rfZ zL1mD%G`|T7>^fzu_W)b&n6{V=>h7`f^M-^wv)J$uzEU@QO0^_35tQa}fS2-iRCYGrpt?gVM&p4XM=M!eLb z-{yOrI-cA%;49hcaz43NmNSN!AMqS_2@3yGEPxqi%{^kEu2A-s(bH0p@wOY!=N&44 zdgIv00Ik%TKJ)K4rW}RiH{WeEdk~edEm~f8Ify90(;wUNj_-cxzWi~WsYzWqsC(E# zOLVzU(ZsnJZLE_9|HQ_m_Nta`dy&!c%{&KsnQwRD?7+c&`VNnK_wIQQO`(+H-Mi~p zSStlN_0@K#2?rCI{1-e$PN!DS^6y?JCc4mNKanGM?nw!`c!KHE zlNPcY;~V{$k!GJWqsP+hz9f&N(*a?qsr7ULVOS-DpAYNTZM2|VDb=Db$shd~;bt$M z92#(EGQHrl^DC{5cygjaOCX#ev+)E^LG!gn`EWN4{zBJt--wyqmf;5!s@l@D%if$= z4;uD|L|ctozwEg&atD)j89g+?bih|vQGJ1!XGGK zn{d1{iu={rs5El-X1zKg-m3q2*iMR} zApF(d3_CvkQT-e)7I7CH6K7ngqjG3(7w`UVU5|&^6o%G&hwG}s5BK9fQ_!a5|7zNp z;ueh8I2pznGi_3M?%Q5V5+_oV75;+)x8c41TQaFK6A2x*@;1qVJOhL#Dlw@Z9#*Z< zwoL4RN|ELr}VF;AN0L{L{#|)^EE zH&0DXrIkxZtfppWVg|Q8g?fxG>4huO^PKJayI#TNA!h#_l~6g2pP|hoH1$SL>yHTi zdG_{ap7j*vV&r^VpxI2iGP7u?t4v?CRwy>mW+SPl{mImXZUtLnaw3xv3_}U zDPOkvf5sTUZWWYFSsx6sD-YTsj{36es6+f#zgl@YLDingVb)Xm|Hq&=w<{%Yc*qpnVN9S-YzoS&WEFtv1SdA zev8aV6_|;$*y?+cP;VzoNq&~vkro|{?+9r5oi|wBITNc@aehFO@Y3X4?F5akGL}lp zmoW=&-ScD&0@gu=GgSfgRQy1ec-q)Fni|y?zr(D}*<1_4N4m>j&o=IuP?o8+PmC{x ze$t5Oz%P;@0o;({HP3VsWXZknh4Yzz@b8=Z|;oem5` zin4|spQc7_1{%D2AT?>?nrFw_!S^d?c%LpHNyO+5X$!`ihcY4v=h*e0`|h!X9Yb&I zMZ#MnaAll75_158)GfviP-rH6K9jlCZ!YC7#t)Bm6fHV42D)xpEutR5|sv$5zB=*QlP~OlJtqg&aAoMBj;IB;;5AiL(j*Eg}=4XSYGS<&z?Plfr&nSiixxD9-*NQ zM-t(zKl-h#udjdC*r9qt0C_Y!Zr3mEp0^5>MS-)eCKT>TNl8f(#oS?|%g&}2X>4MG zRbq5{dr_^}@LVodf%@8Bih2Xrot!?+P{z6dBx``G{hbO_b1EECZzUMf9>y8C zn`$YO#_%t`Ua^+1VDJv8bugoT_49gZ=YuPVUr=)CX;&R^qhYLW?;qDRKqbVdSJzmqS9aRLll5rTu*e!HY_m{&Me?2sscC z7(m}HW9D2u?vR$2hN3@IAD^3;tT^VGLbVb4jRXe3x8k=wS6d~@Wh2SS$uo0vX$1uC zyl)gSH(yUxSNfOEP_g!R#F==)XJ5dz0^&gW*oFoir8kidh@hDn4IkfE{>_>&A8cZe z&6DQ=Bu^Y1xSgGyQ9OaHtOqobE00e1rFkY`!Ktk(HQn}pi=zk-7f7c6a9YkqP-Qtn z7f8;4$nq9)Iq!`j6!~X&p=);2^MW6aWQDT!2cU;&_qm7%lC{($SL-j!$;&r($MIjP z*lr~sDSnHG_TsLBUDJZOb7tn1Q~`3y}Z2q%jn*EJo_4WHquABXp7x($pG9y zmE(;XZi&!;>h^wjnt1b=A`b5OQ7INAdIM+^df=&(umktW;3H(wm`)(@Dsc^x&I|85C|6k_)=|b_VPt@yu}4x z&FJW8!y6rtuen9wJpC6_=j~tJ7Xzxx(~mcvgwl|alcVn6UF_N1ET|#@ev9LzGyU71 zcpQOK=ibC8e~ma4Vb3Yz{~g1g-`@)QR-Y8B^@KeFgOU&!9Z$8iC^!r|mo|H=BEEbP zfwHSbIl0#*^s9F}*nz;{AS_O&N%Z8L0vKH=62u`rB?YbKK8m;CusPY)!CD_6nsk?& zJF>O)d75lOH><}sHgHFd<2r<#cWA&${V*wg%^eFkf+5HzaMEh@aLflq^<=eJoX z2lJsFbpm6l1j+^=1j(=j{pqs1V?aI$9dge+pCPWFE=6cR%~bpjjH#fYw3L(&?xzQT zta$m>(!nOP0n&iPh02sq|MJ@A%@0(!0-yK)v9xx>j0)wg`#`0zIJ^4dZm7YZEF}GQ*>MevFso~cc{UZ+_Z8J~!?oh}7FM-hei;!ra2 zMr~p1PZNqEhr;9+6FlRArQ*4{&&a~E;6to^7i!d!p_lhd%gXTa@qeTzc)Wm_1eyYh zjz(@-v+asFe)^Tu7$0<6QAtVu)vKnYr@mik`~Y{f+mkc;^e?m4Q_TJTsP)Vol%<^u928-<7k` zbCbXgct_3yX#1n73E-&4c^e2@kRiDm z@T)q%J>K16mOXvxOdzoD`LnLqkG-r?XEwFH)Fs zlbe*1MZ9f60(lWg5?yeh#$ftRg6qa(PBI)6`5~NIQX!G@f<*J5 zvMl=58xYwQ*e-T&mPp5YB99xY7$Sa&D2!AJL8DN&g?my83%B_Zj+JIWo6>I!O8RXC zq{16(+1Ts!o(dC)^DA2k7sm+|nk;ltFrI?7ySa*0q{Nm1ZHs*6Ez zw&ham-NVVnm86h4TxL!VYd~BoeXuzttEHutD0IQ+fhVkLd5z zvz;9q#Rr5y5z}k>2wei@5a@~Ca6MS&_MV>l`&9X~|1beHkMkzps0obD74cioTq&RO z;0F_|2PZ^dxpvCO4Yh#3e90My>fa`%T0*BS#5!BRD@3cC~}`JFwsMQ7BE4;sax2W6aLG>#V}Oyd*xNjX<*Gqlp4i zCYrYatS|%)^gwr3&tO2NwL4r1*aL zaFc>U+RTg@x(}e>j|A6HCq>cK)y2ufbIpSL$miq7t5vzK0+hHEe9hqHSr%9RjV**P zgHvYt934#p5r-YEMUSu_;mxD+Vjy3l{*Z5R5pw_oxIBNlx{LVZnR~uCT0g0Ez8*Gq zP=C5=d2x*0GN8S9IOdsl?qFQ6dFsL!WuGb(J6s>^;#$9pG_DsMb4=ZoTqM64xBAJ? zuX1?n-)QRzO~;RUfKwj3pMb(}f#Jn4e0Ei*eC6cC1xUG&175G0oGjFD;{`7)qWdzd z-k>i*m5ZBuX5R%}EB}1cwN@LX3+z8wsDo%PC1qs?hVshFn1X_WhS@*>IWGtE@07DZ zN_nMdZj0Q-^9UhqCe>lV$IXQ1YfTHXtF#f!lLmKjE=uCA_zSogg z!pn-rjNYh-3fGx>`4Yi+$>V0*A<=9dTL^iTjMVnTH)Nf4@E#+PpB`Aj3avNa}YL_YHjr`T1M!ha|3;=(S}OBQ>8=H#yl%2kD5& zSsM>mZ79Q{X1>{Vi*84$RD89_%zrZK zZvxKvKp3^MvWmL$wlkW|TUimHFNiSj-rFr_{#A5mNoE2P79iMy*mddDGGM zEbH*7D#R^7<}n7^JV0z)TU)qcrXbPR@GU)gra{GkvJI0tw^6-$b*YrA|Bn^gO|aSE zviNEIk#EIxGK4Nj3~RNgX5Sc`GeV>Wyy7bsS3$OCx1GH5VA*8Ab(fTtDF9~I{^m6V zAYPW_g9wBpLw!*Ze)*U*#KPb{f$R)U>(Y@$8Y*oBEn;`sTk0t9dq-02=3{aqPAQ8t zy_HqzIX&XZW)p{XXMS^c;p59l<&;8X``9OB(tD%FKTePN{i-(b={nW}k7#==q*G!m z(R@7Yg9J?#+WAc8{6$I2ZLF}-Y%y_^x7V_8silnVB8rZwI?q9@zim30vf6SI zfVZQ_X=!!+iePemI0bLS*qVLZOgv9<0fUD0C6#9gz;ovl-bGah!>vM;w03yDV~N@we< z4}K`K%pCn#beeJCJ)2rR>IiBY_{eZqv!mo%{9W3**pk|1-WGE0xvoC_fif{Rm)55O z+oxkoR#H0y4)JED(roK>ay9zstDZZah$1szAN@sLCpRpn3xlg{_Zl(<&D@slaff5k zNbH(e)y|e!NwfFNlh;{u^-migd`0uIxcd2m)+g52%N0@2anYoTOt4|Sus5Xh^zfi0 z$TjF9_civv^I?cLP?Z%CUvx3UdRih-vWqF4349+KeoRN-Ru+P&uSbT(!>mF2pGRbq{|)l6OI?x-t`pO1IOHH&M}Ca{fJ zCh&Sq)k2NZlxJ;b)g_Uz&q{U4V9PsnAD0NpV(eLnSv}|WF7z!K^Fbd!Hb8y{oZ;5W} znof%OcG7m{IQT_->qY(Qr1ST+?iDe@%|k{ zYnRI>;qkX(gEk+=eK|6uUZ(th-Do`&B-q*9#6&sE&E}GezWoi%Au3*WoUkWG;WVck z)oT;gK(alsI@;0$C*eF7B7UOSjl(nE0Ko}V2vC^=;5zQ^f&c+{PmzO3gNg#=f}^AA zsPv@VLMz{(t+mw#@~LPq;Wo?MwiyL(9%Rs{e-%b|svC3n&T2ffQK2>CKaq6P8os_0dxI2RhkN(F>8kF~+R;3m(myNBbP$na{P zhxz9B-TM$Z8oNYomqZCUJ*?4AdsKGTMx%yzIw^R$^Yu?NNj4-Zyz?D54<26QbT5pp zeK{W_xo-OTp7n7P33c8gA|@8}i*Tba@C_1Y!C=04e(+(A4nc=^sVSq-m^~rx1y>lN zr)yd^pIC0|SlAQIJcGH&{=e*%Hm) zjw)U*eQ4&qFWZ>`l;VXZ&P#3Bh^;JrGSAVkvdE$RadL&uDjsGu27+Ey53el#gyiX# zH?4eS#n#2|#}Y<IY9WCPu5}oOQffv?S?0hyk?{ozCvN9pFBv7VmCxyXPDq8L9FTPaMg$bjQ`fBXGGp zGb8*tzNL`Nw)lFPoaN%Xlk@1>!<~UqGwol_mz#)JhgEIzw2s{c+b#`mhEw+LJjkB3;xOGOLXGd_7|Wl7+a@td|CS(&qXo~ZvZq)lbu0q| zgYLQJFmf$h)j~q=SPPLaL;u7~AQY0Kqd-v+>o_Zi(R$ zPp6xV7f9w2azq&W61Da@)iyy$H=u%=%CNm*R;B)g5D4;|D6sCgIMqBLMu4duODA-E z3Jf$@?n_1OicwN}2KW}>y57xzLqr0OB*FwC1}$tAYBX9qOL%+eaZsGV=D4AW+Q8N^ z4*+snQ*gZ*1Sa6(0dPXW;Zycu1y+AVXJ%(nJ`WnBSjouD1jlx5#g;Gb8^2=^X!9nd zn2!MpbLZsbv>TR1ei*4w05wG)vjJ?(eNuK>DtfbeQ%E^qyDQ&gpJ}6Vk&=i-(`nEw zfr@GSO&ycOdveFm{+CuLBaI(7BGDHgO~edyd#E)I^S^zx@qzTSurq}<2M3Nhv2P&{ z2iF3xZ^wj~Y&CkaJMrcPdZJ$w)uy=h>J1li?jt~=9?^!3eLO-cPw z98^$0(1^paxz&6<*|0%=qf2-c8$Ue!|(WEthZI{o0(q zt5!dKbqY!9gic4nyJmjMMf0tI+)`h?-1px*@(laF~DxQVX>1G)R z<%!M!Ni2~@oC|@l(L)E@lymNtZOupC#=@4Xq=_}&na>G*>yE0P61oeuFgy_isOrGAa)Q534iCMfa3^;>WBzuYaEf62MxG{3&38ql#lG-;hM>w|KT$oM zpT)3fJ$Q#V{+^22?heJp&Yf{+PA65S*i;OLqj?$kE45l=V-0$IthSY zB=;`^!hv!^FXIJ{T?d^X6A%;I_Dl2p9vEl_#3>^;7st->aFgDX{XARe+<)o zw`nVY`6D<|!RJAdZg<6yH@RVP2J? z-d@1Taqanm&NqDO=Wl#r{gm|ymv#3M_bYq_xWaa z-)*0)n($cgy+}VwyQn_DCd^4%HpcB^J~^h&xdJeX1A|AP2S}VEad1$ zWcp(bEIU*`A(Yg`d8#Ou`NP%kq>WxZ_xpD9!b3*@c?df{^^Y1qni31ffSsrO~eI@Nc-mt9g>L!l-Vo&E!ZYa>ug#GsB zq<-9Da0#V;cJ_B7!YqetX`+K2@}nKwSM8jb?>Ce>UfEyU>eh1GUw<5bHrU-@8o2+! z!JRF*&|K{enAVJqZjAMwM_@}CEf?@SU82je9CxEUwc56)t;g9c+3+R^J1R|hl&&Gz zFT!>|^9;RjU$;;Zc@^AInav;fN-lB50O{NCcC?gR97nO&Ei01lyVoOvUqNlEwmr|Z z!%%jy6sjPNRrae+uz|QhJvTfe!g^;;5>*<}*QXAnlb&g(PdMwIXVt9uqH{Jwyf#|; z85}t-rGNzFX6m_-03ou!?Y;G>TEEr7ueTb&PC?M-D$8fT`Q|HQWo+dbpI}-^jG^6EooC#HLzKG(wx7df zR7Z5h8JMDfiM+ak_ftWRs9@{lybw*VUGnKI#OkqAbWz^wiH9)4J9}SyYPBkIqwdtA z_H3skD<{WnxyP^=auS*HahuO4hnx8vZ@Z1A>fA@G9rJ-;H>`htSRyNQEC$7jK8Tz& z>JE?kWrda8-D?4xNP!_`)zxX2Pr77-xg8#xzpRp;xb6Qr_jiYA&Q}9^cTKW|)sl8jtOA!(e1lf)FEq8N z8GoMZ+e_D;JryOqc_&GZaJgAhQkr^lpPp&(rdyz>y$Cs_=Zj~4vL^ei6V%?oR39OikC)j$DZy)pqgiOIDZ7L=fjAB@+UUL;C3B zT)708#k}Q(d-Y8h;_E$w=T|c6ClOmZLYeajUx_UFjh*AsjmJ9TqR&l7-z6B2Ud}`g zpZ@ZAlj>1#{*7`qr>B**N=4&Yr6~Cr97jQTO_7TI`z#(NpWtN5N>Jo`jrG%C?mUX5 zJvE7yxvg+2m3CUHG~P)l%Z_GmTJlE1?B$PB-}f$TKljnb9WjeDdG1#rnHES}e4qV9 zp3l4d@hrbx)S(`!>_opiIOih~)X(=jBQ0dwCGP0p!{v{5ZV}QF(TnT~`|Tz^ADr{3 z`I-!dmv&)Sb85oH*`mwwd{imyQLWwjf$ahnu)0@r7Tk7Aat~DtL}UfFKL9$NNx|>1 z)Z>XPj)(1WlsLa~PfuG|J$|Rv6YIFi3!nYLvtJu#lAyhB`gc*?hLch<)%U#$-1zLJr_eR6ElQaY^i$;#cb5s#p7kx_83ji+=| zwN_Cl+5g8wmzfKp)I-9gPl>;)j9*k>Im~5!mk(VjwOouH6?XBrFmbt^-?VAEsC~#F zab8!xe-OgvZ(3EtraQw)8#6VO5brE|kXdd=@)}(+cO}hruXVyHZ0||lq;ZvCf#Igi zy3nokSURT~pIwTLJagAP+ySYqiFBL`%R=Q^chR_&6z$5op$(qH%1!KC#(|CC6;6*C zl6InWM(X;ZSpKhRgDMP%T|EY|?9Y;wl3#Hli*O1{1v(jdE(%swR+Xk?4)4vjnu?9M zx*U=p4%|Mjbh&U^q}7R_I}^dS%p3Szubx@&<|e|muW;_??(%lxsmq(EmG7>V1cqJ; zvydPEUC($pn|7;w6#dtE)9uk6gIYz6)UT~_BfdO>YZ+VhrPU=e_N83$wek67ax8u|Ndlkk$1XgVP3{7O}bw?d6vMcNS#?{1}{K6PUZGwI^vIqF`t?334x(KS}TaBjPJ8E=BG%{?aBp#G<_UjLt4 zLT=GN&}l1EtR;CekrNMH(wEC3PyBiI_w*k>+~r<1tNViaigTm6J92ijc}&)LnN_=w zct5m0A>}KXGm`GZ%dg)nZd;b;)Cbijj|ZdM_lM`@A)lBAFr&LS2%q;0qtNxf<^FU+ zBBC@nU?EPxS%J0g=sToRd6O)g0{jkZa!N`OV1MuF=;*}p*}s7O+tW!JBCOXdxV3`M zhti^uHP3>XJv1Zsy`}RfF8zlK;7=kX!!v=5j{mk?=jb@DrS|J+w*RE%$HNVSk21f{ z@wy|V6#`QlOlJwUH(s3Y1~x?OxZ7@C2)53*s8|TpE zSSy)UhtU8jt$sZIdZPHA=&h!(k}Y7()Lpnq)*oFwU*gdh#3B(Azwkh)xU3{Oj}j3i z-Fl@EPEf5e#a%{Ldx-U?YQB*RYvN086hbI*t%wZc<1p94$K|Sva$CC&E6LoaZ;m+6 z*OIUVBWe|QJylp4#i%WiAsbW_caOV!zirm13qOp>ANO_`N$*r@eW$VaGeLRD@0RR} zYh1)Fg7lG#RYAeh9ZGZKFDYmv^ae}xQ{|FR%7RYKiXX%cq}{5TT|CU*ag<%!C^2EQ zDwx^q?u#o7HA!1aD~M2c?kPWcGDKy!!M$*cg35A9)CXCXEJuCY^ZRZ$FS>=i!rtz$ zuI%3MFD%^{-m?T_8GRA^YdEek71>GCVc8#8Sms!*yr(z-X~aPrN<+U@rlCu{zc9$ zjrhI^?E2pK!6jL&0?!UFYF@|+7AqbONGfEsrm`S@kfV$H9e|X$!0tBER;Gw zc&T!s8x|DcqD*a3lU^=$xoUn;MQ8ABf_oZx$p?4uia?P>(cZq4=%M;v+-A&%F>nA1 zpq2`oACur@3kp6v38p^0Is`q-IU zDwWQX#!27y;BsZ+8tcijY`1%hf=XVB?f78l?okzq;QqzJfo zN(Ls$172R$&=P}=NbS6wT!7e>E?v5Wg^N1`*t|yF1OLPunyE51$!pT{FTO@J$4a27 zP<2~t2NvAey9K9TAactmv*7>PNl8!OKG+W`2Qz?$jqO@3AgQ3H7K20{)-$oQD?mBP zhA)l}0A37tE)uW0+0RiPStV4$`M1lFFG;oBbqLV**uKp+2zH22*#MP*k%mSLjJ9!J+Ib4p|D+(4qYB>yH%!C+D8OhY62Yx6jK9PZxKW z)Be_p<7?(MyE{Yu5#1{o(}H}0#5ZEHg=;45$yH_^<3DP?ptG&HMBCr8z*CmFB`s}OdEH~r~_qWIkA zX8!r)J@+o5H4J*eYCZvKfwG%h4XOr9@z_QTj^$90koc6N zobBc|?x+IwUC7*xPY>2z;7o}fAt7O*Ct>PUHZ}}S(?Q#@hy8HikBM~`7h(x09|PO7ZG@zxjGtS+ zL%k@n9=3QGl&W)CO^c9z1jd1j1fUMY6H~w{a-|S*Q-v{@8S@JWXcB#Xrkt&$oLxG< zJU->N8wkLg$2Lr-9sCMaaUxi_~+A zRG9&2=)Wy1U@heIx!Xr{ihM+4=eW>M9cz6;-7s3;f2s zq=R3Gx|SeJ|JB_+1UN{xR3WBU_Qye!^>utJ!r7xAsmQ&-4HEG*>OE>t_E*zE zO^#1b;Xw*$8%|D7J09Ht$;gDD9%w~S*84JIrfg)CfrN8rjDh1Zv9St;ZPdzNMn~5` zMt2!vT)FadYDy<`V0btKYJrj)x*K+UPeXLw*fYz@%4j)xg88mpz50NGK>`ed`6$PY!-+Gx{^K4tsOCoMkzn1p zp(r9EB9#Cd1iy84bzn41%*@P4jV(4-$1Ljy;WQ~OIBT(^NDDglil1@Ui=lT*3g)+( z_JSTk#MR@UPn^+%H3pdYVU!kPXsAqpVhj`k8iSclU?!4^<*vr+kV!A5y?%Of0*_XD zWx>k}4W<}|ngO7d!PoXTCTge!UNWs=W#-}7)=FH8eMuLFTDhi2b_Z)}k|xLH9rFsH zem9!Fbj+JzHg?@;f;vkaFasvmk>6zA#va6unbqx`Kv^6Hps25(3|H!rJiM?#lK;~( z55z$OKmpSqH_`&XNXIK+|OZ0P=u^gQFxV=?5Y~ zUp$fn2z8`XMl4mypumoXjt*;jeN+SQ>}pw!wgRYfvr?3VdB#T^+M| zYzG6AauReuDFLx!Wnhr%1Ef9?K=f4*W{?cdl#m@FasnL*M{k0P&?( zOappAt0;jkV8Y;xqwx6nyslWDj<&XR1A-AV?()w5Gj((GT$l%YIQ}UYGVkvv8f9iN zfD*<>ZdzH?$yPdZR__}iP-fh~Al0Jo*l+@zd5vu6rc`s2rsky81=;2Cr-P7waV!Sxw+Kzja;DhN~o1cWkDVCYKS%)>!!Fc)AW zS_mwHoZJ_S>h&^8ZGCw7>79Gjl%8Gg0lx#LHVT&-5KgZAuy%*|2{*kV;q^h^XqIqdz}<$lwUF;C=o#KX0A` ztrHRKu}8f=QLWn3v39t#i0_?qzjXTX84?UQYKwiAD(yApGgJplhz%<3grfIJBc4Yhn|`Yin9URLLPIF$49r0DW1a-@%V=J8-AqmFy-_G9 zPsU;RvO|Rz%(6-Mx5t7mmHRCu+-A|RM%*X^HE)A*mN1YZpzZBLV7G5#UePJ>3)b$z z^q^kMq3x0>FlDlVT?f8ZvM+|??H-`k5ANMdiej=Qe{7Qiw3hGS|0O~%U%vdNctlZM zeY7J2rGCV%r$5*cy2*GjQ#hQr6z{-k%96SlO=&!(+RgfwX+_}RniCP_he}7KLjdAU~ zqFmrBgUMe7;tiRgO9}YIL9pE@kOvhEY;XSt9kOeqaNKjqgtkR|YxtOLNxAdhfS(@J zLGBRakaNF;57agf%hzPJ%xhOgl8wE5Xt>ZV7qpE?EN+!feL>T+>@m_Ph`9{d;-zj5yH z%0cKLeGZ-wW={c#uzJT2nwAMc5FgfTUeXbvl2cZugO~)eQ|P zSd}qRO$8L((DX*3L4AD+D8GY>Jt1fZ8UQLI`1R`rpg%7moa+U$h->wL!?WklQP~Y} zL?5nN0bc->r-P^{J$vSZf(SwV{uQL^n%zq}4TLNZ?n7xb4!IrdxdiSnD=$x3M8r#z zB?|Pn#BxdqVro<1Zr5s=_$s`5RqAmLGsL2#qQV4W!AHF%SSLQGtwgZqm>uxE6|bEg zRTt6>G#f2y_myjrC#xrG#XSW0_}?M6Kt-64dH|2H7btr!)y*>S4iTft8fSR3n6kEZ zJSYf^B7Sv}ntCroWf^o7a zJyiIQHaa`_ZxaVjTB-}|W~e`ksMN49qoc8~ZCFFADwlq+qa})4&Evu(ef>{I;LFhV zu0Mxv8wNiV+(6ytbqy{={ZQ6$Gw&8Cqdtm=!)J6f7otP>uU9taKb@iBeK0_Mize`Y zG{-=hcpVKb@9O{bC0yKq{-3)i|J!gZ`gbM&PVkMUbK>_X z=U{^RC;a^HIryLY`~SOO+FozO==^w{`YU5b9j8BR zm^6KG&;)(|$?KZ4oBmn&b+C_UE?1wzI!r$h{eOAlUJfTRZjdj3Cwo=yeTTmtc`=28 zHTwH3qfh^DjlsjmSaScp&(7yR@|chPk3{_Mzx+o+|GTKTL}r#_LpMho5QXpZ{-XlK z@cFM4^}ZHEjYtk)l}{Z|TvX^x+5|wszUhzz^5$L^yZykNaV{%VK%& zlUU*jCA=C6E|!!Crla-z-#ZCXV;Jh1C%2yV6ACep)Xuz|NGKIQSw+51lkuohO^dA0 z!X=ixC)mdTN|V1kTCldt)G|=Z?0#Zn8Fd*=#b-;TU3l6bSppB0I0h>-w$`*ih{;%y zFxOOZ4{h(xQ$8(fioEdW+y@S9Fqo-8gpWZ-qCD9}ef_}O&AQRCRI~=dc0S$VXRM|q zeHo+|%pG301XXW=OwBLa>#2pFJPYUxzbLIK|7XrLlm4y(&4= zE2sx(QmqzfSA`hrQq2z-*hG5{-~^`eXa2D$|EHou8x81(%!fsgN=>p{sxW~wI1d~! zwS9Jpdu@3=FEvE?7Pw(ddwywf6t`NX_*U<=8MI4`rWpgM65NaSKbw!gt^PNSLS6V@ z_Qh)7v!{qjRw}t~-mOlvN4oyY`~d?Ki&hZ5RLO#9WZ0Y&qqICLZMIVz{s@cNZ(LNA z0gRn^q0=>v$9HfcV>5z-8moXE&k1J%OZEXt5n}6faPW{UOUDbSZEtUfra(l)0A2~a zq&d8*_Ttd9!;Blw)7;mgm4w|gh%)mrJE&+tqHnq~kVyt7_u}PZ^!mDmrXIC3DXqPA zxG*bYc<{e!dkdhr{;f-t2oMMsBse5!@C0`W?$FRkW5M0s3GM`UcXw?hgy8ND!QI{G z@Xx(>rr!JJRed${x{{)4y8GDgY*~A+wdqw0-!jHJ8>Z047ltl$I_S^ZfRByTv2Ek1 z9W@G9vB~-`35T?RgR_F(cASEB`s3(0ZPo(~1`;xXAQ(t21&BTGD<6Sq+Z2eupOFYn z*8`TpR4(ObAPsOp=YU@`0o2j(IPHw;Z-I8A+w!Md2674tld&A}=eP<;fJ>i)-{A;B zSk0c4qW#mbBw~_Y)y&n@**=%gs=a>ru~&Mh`UnG5vhQgsxp)qSCwD0&YgdQ#X7ABs zYK!^f=|+Kds_xhP$haR|s+xq0UAp~cG?*y5KzR6l->iwtq-b$$8d|XtRAaQ>fci>q z{Iy}_)H0iNrEV4$K1T8NL~LJi12YQ|x09Tf$4&0$P--zy@a_Wug6E7B1d0NIKxzWoOMI*Rb9Reu= z5))*Gv7eqU-0 z2clvCT#yAg8PL}IQ^^*9PI!9-*bMqR_~roc`(j1=W{GeO{8&Rt<;MeHG#^f4S?G>x zpIeI@4N+Y`5vZtnYntYy43j)GtsLxWJsekWpUg}uTF5G1^=YHm4GT(JRUju2wQ7)0 z)3u!v=*vVI+c@vQ18{W5=p1&}>7W*iXG7z% zLlh(=BoJxRWRz1Y3peW3tAgzpK5n%FeIe2A7F7yk2OA)<;3+e$+{w1#(JEX?#eMAZ zb9g1=&Inya>jkR**L#in1Mja6I_bq3`|)N^2D_$ul=}T%_m)s|a6wJxe91m@v}2c)fayJ2pVXdhbWR*gk5oFM9=XqqN@;{(#yVTT#VdeO^4EzX zBFE*)^T{QYRP}>uJ{^pb@HpPxbnu1q@TeIAx%raEojKq?0C=H3F)lrwA$c$la2mZj zl{MT0G|bG3KobyPh>a2Y{}xFss@?YPB1@HuTLDVS+3nTI$zk!u_o)=(4WqSIpW@dJN8~~R&f7QLeWMP^^!*6IR`F;rIEik(tslzoSIyj_ca$Q%3W{z zL7C99HYHmEMOD92Yt{& zeb3Xd6SYvy?R5O@8BYTAsgqi7cWF3MWhN&kwt>pT*xgYZL-Ax0ke(M+Re`!ApaFGz zySp`>PmgisvAf{_8wALmiZ)ue%3E(Go;ygM>4fc&7w)0`nX9EVvAmY01AH2p zcu-6}McGpwK*UBk7@Uh0Gxss0AsU~kY{#gv%prLt$da+>)$;PJQ1m0UOt51f&Ds)k zXLB4?eik!R;aAoAuHxfwjm#8+rfE`fs-T4q4#>kFP_8tv8)VgV0+MM~p5>>xPT~6p z^~+_byx07eEf;aXS-`{r3csYHyJ@b6k&`B|lO~hrJL9#+;}nhRhmQR~P%7VFo~hBlMDYBk=5ORJ!~>7|D8vN$#$Na(Pqo_hF^4p5``b z?m9tq&g}A|SDfUkm`q%frWA?fZAf%b?I1=ay0}5iw02|pd{>8cT(lIm!I#Wig zR)$E_!suPbW@h`x=8q!+Oc^cE_c87b`?mS+U!mrIas{9Gg=!=icdb6A4W37yL*TYG zA}0MC-2Nv;{7)$R|4a=27|$p_L;XN}3PX>$#Q=m`wIo2u3W%-$`=zxT7omUm0swzz zS^M9`x`OdnwB>5`hc*-c$)-2m<>C1LHCmN2lge!$aTk z|9h(U?`*OIOdO~2G*bj_y9s-YapaG()4O_mJ7}q7+(DV|+W1da_cOMyy#DQWox9ov zG)%b2)G~=m<-|75#6@v>&=)DafQ&=G61GW;-Bswu(?eV2fM%ZmH>ME8S74#Wt zgJGDI)NYg!emaY4#j%1K$l}^*3!f8bnfm)V)9OzB{BcM}#7&|ZL<(teweH_DP<8~`oS7`3?U&k&}Pu>D31ier&Rg}5q)~9)2~w-Iw?F^QI;|i zagvKb3IzDIa!tg3dJb7GMNo|ZKC`GT{fEzYbE~m7Y9%kZOd7NJ=a+k?<74Sn{nhh- z8!0F6h&r@oV4p_N+-iAdaXg&XnAk?*kyAavKICnSJZyI>u;g5H?o8@)T9wELOO5Pv z)EoVXfIbHKI8wJQ$a>V;bN;B8Dfe&!MJXP~FK>@qSI2Syw9=_ZF#NuF5=)bmvuF84 zt?iRW2j5ew=AB~FwdIp2lSrYl-W}{gS?JW2C!^>ztR$y9Kk@!tsdp6OWWzu(!58_U z-umq%FWK6aowlMJ`6%7|sgk+k9O%(#Mg-Jod~4jnG?8;6mo$AJv=pFKw4bA3u=gfR zGNCL-MUuE_{rOD5xM&_NRhy+u)mvJQ_+LfzOkON#*bVme4iweqnjMW(6!HjA5;9qUEM!i?RqYazQa9=Tv*zN_15vKGo9 z(X|{66LcqsHMx#CqR}5i>z&r};03MqwzwFUOA2;%o5(qqCGxte6PwLuXb7YDbuMM8 zl@XID?+~@L8prp!iEel0sQ4w433r+7UPaqUKUvhw3ee?;)R}gKzf1*IW6V5=xzaP2 zx5r%?ih9+v^n5^Gyv0}WXvwdtmr+@cZp#>SEbdK;J+6{V&9w*;a$FB(CNiqZ&o{(- z9cRLlPFnEwBbk3+q-Z*oFLI^kj=aO;Vprkfiyer}wp(O5Sg0m&3X6K&zyoi(=eEpi zPA#>;QJamRh2ii@Ooyfy$iMSItm`ysun*w(w!5XPZvzcBlZy*qKLsLwAK{?s>q4fsNEUY zq{|0atVyO`;^yS!2x(x@YhWD8^@cz%I=A$bIGuzH>7H+!pWxD~4x4BT?6D=D{>(_k z^T=Hp&UI!o+us>+YA&R3$Wi6gZ3_C4(FUfY38c51$**oNtrGiCh(?yKBx+c2E6fv zkYjT9@^VJ}@~sjv_Pt<`{Iq>@N}JXl{;UyrWj2kfvY&OnxYIEZ-9UD-Aj6j7=0=UP znerbHtyutAq6-8ulv;l*!+9 z%~txWA)Pkzuyx%8zZ)97>EU4@PR~)4+`83R_f-_4AxcOXj@XHPuTa^Dp1~B zC2$j<#$u;rvTcxja2lj2)KG3$Clco2!>o6Vh8%=s$A*XI1nU<3kGX2ek7tZbA9$b* zPII|~h2Q83e!1~D%(g{`fu5REm|Z?vn+Z$Je*L}fNg5AJC9k}-#Cmu{0Ou0Z{IdK0-DUc8@dX%G4y+&bmnSf%Bq$|$qT z-_AvC6gc^N`|_@O7LH1e^5Vd?(PeA@&Ex?MC|7k1H=b((HMtpWJ8DP<_=@q78X^^y#1H*#FHT?Fs- zT&_ITTV}4%hG&TPr|ZR7k4=V-rB)6HHdB^ck(8FZd=5zj-!cIY9c<_b9hG=+xK*K< zW$PtTnA|TujpA?7>$~52rWs7KEC`5b!S03LvaOTi!*YZUsRqNzrM@#CPr01=wcJ1% z46TJRaO&CkZG5uT6ph&zKTb}9>#mD7`M)Dd$k^e4Ug<{L?b!=rs=M;T61$U1CzRpC zUpG-Uk=-DHbau_iJ5}s#j=1{nDx^H*5t3LOi$q?FA+{(@%M#>#Q}%1UZV(eSfsPu$ zd+RDN8{P^bTe}xJI_xX9kA4nI=2fFwYgBuN(!Cs+aQ(IISUZ6J?C08*dYQ}fVuoq> z1{8WnfiR=hmg`>uhs#acUvRRF|NlM~`)>#RAISUPo4B?&%mV}))OR`m?w5`oZX7nP ziWSH1KfnJ8ZrA?@{r{gR`2RM<`8Q1d-+x0BRve8(=~ULb3Q*pfg;&v!NX$F$K2;oL zUc4D~DSi6wjL>fes@61~GKN5(?!_BJ4uU;%j#uY+S~ZR3m1Y&H)TYFv*5|TI5Jn+Q z<7dmx5Y7QI1-TzUZ5k8P1Z=m!Om{mhORFp)+*%* zm%)oB~ zQ{+veX@y}g^Jarf4kDqz+pHZi>QGh35faY|Df z3RA8DCeT!<47!okuPuiuQP&wz(G7VV&fJ;r>6Yu$m!_L4%PmM?H6>}D&Jd;6ReMHP z8Fcnr)b^P~D6OuVVX;1F#y_&k3p@&#U$)q5m$|Nrss~sM$gdiDB=eE}o=zRfo(ke-X``T8b?& zf`XNxTOJ4N3x8;*ZtwD_rYvIZy)-K84NM+*w;FjplgoZ1R0gM_70>h5dIE>qGDe+kevp!YHwWP1W z{P^0jBe^Rola*9gv|nB1CICNdV>}zFe~>2Bd#=vhZptI%bSo57vMACva&M$aCwo^V zR(}4l23>bjF(k67^`USPl%|_ArxO}_ak!RwSwNGcl6SgBhENUlC-Rv+fIr8BJ)peV-zy2*=_M#Gm7y~|? z2}GhBN?s0)=s#W17fGS(bUOTYw-|T-WwwH4dQQ&5?A|)`UG2AId7yMCpKM8sPpmuO zIogs2hAQJwu`w_$l~_y~LJykitxwm458dU|^h%N}zN`|_ZM)%5Y~uG@27l2JNm8rx zIk})FZI3cBYYtol-^Jhf>yII3XJkI?VAq7Xs>fDZrws<)^s;6*w|@@RwZ!YUsH#no z?_k*Z{ zIrygQ6qw51=KX|kDD-eXc)2%U`8%*l+fRO?oz*g%b6LehFs0IM81`^sXz07YHs%9o zd!TB?==Q0ZTV%JAxrP5b7UoG61r>c9ky827RX5T;*5w)CH-CA3vu38gz&qpdI+|qz z+T=8ylG~9MGs7+a`v4uJ{s}C)wvc%bym1@usZ9eM`D~_8^X`QM#SQu|I!SkCpBR-E z2z2$#OlrH*OFyrQ(0^IlA9^m68g&E8JC?xGvg4_8D^TnVR_F`;l$fkpCDkW4bof$# zxU%p#$XLR&Q1K>$tVtA>9BeiWnp;;9?*2{9N+G`^yWYrm<9Hyy>8nELP9iy;m9yk%Wv_QHlJ+}?97woXl`1W< zC@@8@VG%M(t8#JSEZJcJduWK^TsY>a?EyJpUn zDgf>92IT0JdbXz!`axC>= z&E@^^asHBEV^VDBz%+*GgCNbJU3vb-=Ehu|YiyJt+2lmu$B>dZha~&hqH9wqdX&yW z8^b0J`7&ni*y6PXxWf(gYR+U6?~Ii5(1{0Pb(isSWo0Z4^=4;pSS^Tp@pa=DEtL05Xg63be?2@K>^-7) zf9n&hrSTm+ChQcDQTfr}w3NKqBZp(Itsd~ukP4miXJJ-8@yOmj2toP1GHX-BPIx#^ zn-iTgubL{;!re4C6_`r5SW$hhC|z(Ca@tU{AE~ICtaY|P)XizyUG%$iw$G!XkX6!q z%pwf5Gky4=ykXU&Q(43_ltc~ogXmqFde*90KK)vzAJ6jz_ciq{+&Hv&*=B@Wjs^2c z;G*XBk@QwtFBP;KH6zR`?2|W6h@<&Vjb1TrtDO+=ZF*SQ6wjW zx0H>0$wJ7gvo>?6hEz*d1*520sa*|I7>SMN9O^Jj=PIT9Eq-wFv9aqXC*`IrGnn3J zNF}Dyni>}ZsP9cH2rMn8q>}@MlLTb}H`;l~XcRm~?A2Z^wE-CrF`ZYGb(~%&N)RR% zlUK)?Tu3@obFX_8>l5LTs|8|SRTJowtHfLzwIUM9#-Zrb=xUc`5e+MgTSo>v=u>Ye z+UZ+3h%xr>E0-N#em z(a?h0)57|!)~U+5;*oE~{nSFRuGU%2`)Nj!uOv)~`<0BjsyQ7EX(*XB&blS#&o=v8 zIr3fIYbePCjG6ZPmQy|He_rU_VVf*N^m#!=HG{&`)C0;xp`Z;9yRx$cKhv6%R-shl z;T)cbJX8HnH}ktD^$jgU8f{ts_dFWZv#T+j3<7nVxTxj|7S^Fr(Pkj&%HT`k-YQSO zF?5}0J78Q&uWjBYO{MD|9v5Cqbr2!k_jJKWqivE!U1w47whai*uTk>!)M9^uM*69AJ;$zn6+QTl7DU{i0Svt3s&a_#!|77iQH?JC%a%5mUTc%g)(U9t#;ykC6 zmKg@rfS%04bR6mAH)&ABb0ICCH5zr53;*nqU}0^3x;Z0?2Fd?H*X$ z9DT``s4tuB5)6`%HdzY5>T9*EJ^usAMKzsF-?~g#P~`%U$HbzBp3Su!6=$x#SoX;l z%am|xjwOvuV~i|);`gQ36SU@Y(>28eC>;H4R7|~uF4-7k$@JKl>Q83+Ek?>y9lg?b z(6s}Xk6ZlRLj)V)QVP2>dD!;@HitmrXMwF zes=D1(k5fn=qR^V876~|L3v{oD*Axi*Z~McHK}ao;fsxZ#7TLfn`{+zii7DyIp$n% z$;AIv>7nff7lf%v#@?@y2fvLZ3qgOMPvdYUvcZvazj#w6Bdbs)95oOOWs(lk2%i%> zeH-QOQUpp`Iu;2Fi)?IG$J%PKcKmdetKK;vsSrapI~MaUK7YSdV@YrR<2+1AN_T(q zVdmb=C4;Z7Y%8M3km4@cRkB?F1X6A|FWVv`uP_zc?2y(7xWF9P2P?y-tbwSn=ruZq zg{+V4MF(zJjeRNAAeYZ-l3fx-g;CiQTF&X6rjunPv6!2mHss>Qh=!u8q2?07wr(8NI zD|l!R=3u%u`0>!q*t5*$?OLq0R+VcKhX}4CMbS4?3n($7#t7?DlXTJ-t^d^I`1rKq z9-RB=LZ|P!))thpLN)TtwYI2CqjCz170>O%H&N}6;u8uHs+41jnp=ia!8S>Q=6pDx zll9B2?e^HMEyUs{`NT%wo?$-ivGn2Wc(m9pqL*IwkIiwJ6MB3e%?m}D<6sjkoMMns zzO0yp*yc+|DNOb5NF*keu|OpiA1{(2Ul^5f&yo(qh>{9IajE)Llry4ELFQ29zQpuH zYtKprXW26FO$zOxB`+E0Y#Fu<3hiTs+*I$Ar|T8*#6;pY@_mR9$EUeytoh$rlAjK( zROU<@T$U+{?=)B0TYR;z5Q~ox*HR}NQqAQJA&ZalvyUr6%eWyA+1PvPH2QNWoEot6 zr|9!8(({#U=K8aBxH) zaSYoMarwJtpQaWNHMna05mL2)Y0U}0*&T%_au@2XJyIwlsW*RCU7;mxNU+kKb5)bS zaiT18nEXZ2Nl)f0ggogsR;;jDNI__PU>iY(W&oMJ=#GbYw zDT4p6A5xn$5zR*#_m*ELSJOLx;=|#JICFpb>X(NbFqBMAdXwv522U+%^3J6Jd2kOt ziQv`ePgcC@@7{7&VX;KSd_1kg{=Pk<-zDj9C`j(0H<`(V`PEU(&(bGYy5D59EW%o9 zyRVYwZ%ouK1bO60C$FIxvTxQb zCPblx#d)V;RvV5#=gVF+Vp;Ji2P8$Qe2T`N_%<#<%3aF4?ZRaeZ|;3tfND~JpD9PV zTjh{p<^vC@A*`KpA{^)}aF-Rmi^IE?a71D4me&8FJw)VY97DbxZ?_G3Q*`J9C1W^Q zr1I#4-^oIx+sKk@sAO!FVH%*pLnG294sf;a>B`CLibCRe>-F9{Y3yD-YHcvQ)`6K@ z6#+Vka;L+!-$rOeU)FJErK$5EnT7%r^=^#ZeY;U`I@7TCbNJd!bR3(&LC6QY0=V5c z@`5E|I2XK%9aV(dVZ{}=cyfQ-%9Ix^niG#%NEfQLMy`d_qw0%wtwa}|1zsete$ZO+ zs=jhn#&6c}YPMtAO`m;Z*!r5^yQ=7Y**%KWk_@7C5#ntch0Zc zSQKX?fi!~>X#`8E9eCNM!ygJ)+Dm{aa?B{z zi*>hNQ7!w~_lF)69pbDlpfRxG3H8Il7ok!Y@TsF3-uoc6sfYFPK}PK$!j5vn1+_?z z0W=t>6R)H`8@|ds4vaSd7I9!}?U#-!hhIK%S5Y29czP-l>Q;OvqCH2%4qH75bg#Bp ze4{)nid(2dXHVZax`zI!)>q`64muoP3~H0xeq(Y<-lOW3NAZwzh>T2iWdM71ApA|0 zNfGSl;_;^(c`_e=#Li}aBVd$!X1?fGCG%ACsX-rcU3t{6PNVTC+-frZ$qba{cgUm@ zTxqO-M0%R5n3M~l@!ZPGp?N(l2-XbU%;sP$=NU)Z7ED?<3I;|jo`Th z!0bw0o{ECrRn6#AL=4S5y2KcHAjgv4(^(k;=ggOHL^2l2VQyHAF7H;Z?pB@(P-F_x z`kK*Re$V+Zj>Z2ogTEIRv-736LUdY9O3jt)E2Ag9?Tv6T#Q?Gwpm^*wdKzkFWOe?E z44p=v_lVyF4_5d~P`X5LH`Pib+AKD${U+;cQc+p;8OyUus;BD(FYL@))f|)N1<^~bdj%0*M zMTQ;Ci&OS{r`6h;5Z{h~py>ze(ZQOZe)hTO%>kTf+!HUg8VGA&VWTRsesIb{8M-U3 zWZUSQFxvPXPQ}0)TPB#%jId-#vns&hfb=?|mh|R_IP)DF3`Cjho`>p6JR4^$K-Ck9 zyOhGnZX0dTwBpfnW1CUt566%u#9~DKq5p*6T&|+5_LX!DyY%PttQFX(LCe^atO;j(^ju~3&3A{Zl zN?isi=Vgsv)gVf4F*4nWcFV6)>{YD;~ykrBpFnA8N?F}_Z!ORkgf_!i`m{O zb_C4*8K(ASF$~qss)sc_((<0WVu9iG4y&D+RYOoNe2qiaGfR;mMUhaY>#jhfJh$RH zMCe)&N%VW^0C^;?@z21^^-~k}S6uQ?K8J+>)B_=f2*ROG^z$`jE4oq{?w=A|b+5QC zU+Hf+d=ULkax=<0(#EkwtfGvmg5(uLN4fh!9AyIj>l;}3mzMAgA^M8k^9alD)yz(e z;31ct#C?^bm_bR*=~zH)U$=KWUuuv4ot&Hk%GHwtMMbKXHUu4}0~SD)YX z)#c^yy{8zAPFbhS4bDF)%ir@BD<5ZErezf8spUOE0aL{!Ov*uimONhm*v)T*!P}fL z9IbftR)nkaKE# z*-vWz#xIJVVBfYKRD+PVChaqr3LgqWLF-x)o&Kdf>YH~l74uf1(p~=MdPxNvlLu+I zF7+4-{44RT@8$H*%4XI_!tr-bvtj$dRy-akw)hbYqTj8^ zNqFs_k_~mACA*a<%`XQ z&fbDg-m?45=PpCZ8w z?qQ0o#4`~2$VRV4_*2^zvW#1?hzcSrqSlxkNo2i=FZne2oCppl`D*FAxCK1x^(89t4zpv^gF)O|b3=heU=h$y} zQx`PYU-GqA*%zIUVz+sXgMuXM3^u-EqwnhwD}rQ@RsUiHSNuN?cUlq zdp7m#=;b==5#X3QR%lV8xI(Z0>riEIu(>E) z09Vtfb=1re#mD~2jg&UoIpW@M3rq>%Y6Lxek>JSW`Sp?9y&fJIBPyJa_BAE!fK375 zU*Vq4iZltI=?=|QGW7pC{dUS5R$A{I%YDAU{CNZJ?jkwm)np6SS9;w0fysDkU-c^a ziBdnzRn9OVv;zqwgJq!y^p}^^4UpJr3`0$eYH#ne6={VXV$SPBc zIYx4S?95|tZE(>+Yy0qp|CYbZislF8<*h1(eT2?SfpJ|K?ZNstxj#v0g)5KLR+9;h zG0F&vXZ9o7Hb>-zgoNy(;rzoTFun%P6V4#;H@wgfhMzP{mXEcE(g+IivA56_)Ex?) z%!^ihAs*2z^WD$~jNW7@l=uoYa;fRPpBk-^#WKO3x0Mb}aKB&ymj-G#d%Cp%@WnAD zz_iR_<#M8}SFM48Mmqgv{0G_Zn9a^YXMAsoLCju+^DPxTs!S#2ynrto9n?`t6U)+^ zmuI|L-#)Dx5e#m-zVs`b>-Q>^$GS%l)Q80elvCNVHc- z{e5GMw|3&+_kDuxVEp?&c|?ExzwgV!{GVTlR1baW$eBLu2rcIS=dHz*$}VV zr9O97fm=&~%2}t<59zTQ5p*`*a8N0a#JJuHO&oQxp^kKc`Ljk}$KLH4$YXGBc zgc%u74-^0dfjl11($|1)xfd|!=jXuS(^X)Uf|#Ua2Oy^@uda>+Gt=hD2S~`vgFuWq z3qb2GaunI~^nsT!=a-jRfWq3=aC$eOH7^GO0o6(GBZKU}r<0-p0VD2WO1fa7Ovly~ zelA!KaM*X#nP$=~p~0y5ZF|k{FS3o*UWGDvhE&}1I00nO6F^@*qoxM)YRQ!WAVwbp zoW3>SrQb;`rk{1YkboHtFf>XfKNlKptyg}*as!i+8vx>OWOOuBnY~c9eDi4^O~w2{ z0-q;u6BK#^&_YT0_=w>;d^r^V?oz8QMjoz1K{3WIH+*04`ZX6iZU5fNMg7lMV$b4k zpE)f|QcKN`h_N~`JWJl+?0kQTB+H^^tc;R>O40S7RSzVOsQ-Y2oVCJ7U3rGVx7!y| z>CgtZ{bGNy;r^NJJh=!Z*Q6VbF>w9Y!l64QO(G!X|7p-_GsLO2GC%3b>Rm?)9-a(79VI{)Gk2TtFS9k`h}4Hf8H zs}?zU(KxJR2v>z+Bhpixi5d5fP;?u9>I-6r_srS1qb+Y17zU3Ui1seOxzf{wX~ zR;+MDvfq`rJ#qqM@6nl=z_he9wOZW2_a+|>##WrR0P-9!Xr#uK0aB-^Gfw#tXNya| zwmobv7BPnimHSbrLDPmG4o3XDX)NKP2kmCr^f>#_@>d8xomoni;c3oqou4gn)L zTrbax&;sJYQUUg~qVFtkVf1E*%0yOv893Ea_lUZGreAz5Y6e?TR^;mrrEINuEg6KN zdsRimr!gHF8_TlG4O|#NG^7J)!aW9huSw8@GIDbC#D4NR?Bno0oR5F(*JyFU0*1E8 zmQVsmztI;9u!Oq-SsH&pCF74{+udTq9_2q)O=9fiMMZsVKZYQ*7)fV7J@d?3Z&;eBE z5`bYA9=GG^FJXwB{=A@t)EM>H03G=vt4{+1QoslT_~+3^FaTrs4?r$v2joIAg696(RUt}lz2<5zf2Uo2q;sgQ1%x$ zB9>oIjXa)1N=&78s=4Rf;9&K04V>`t(MDdVpXzo8>oi<;XVtw%-X({DqoM8}G;-zT zCH6YbELFJ^dix6|7<)dG$iiDWB=*QX6ZcU_W$K;Vu+L@M$ND16K7e%#j7{-1dIH`=Gn_7Fmw1 zL5^MaRhC!th+mVTLNdIXNb2yVBE~|*bcR_PexwlvV*G(n2kCqMJ|We{@T4*B>vR*r z`Dp2xli!?*OKq<>VS4oh2gg}Hzxdh5IYDTzT^a@7tM~n3l##u<`NRrHtd^C3-4P2A zIRCcmzm#)!=6DvYX+9g`k^=(*GPuun&C=rxA16!%_(!YJgbB|G)je--?5>m(JSvzd^w0@Ae9}c4Ts_LL5j+5bB#`0sD#e+e@>RG9Yf^`@`nQUCSD$sneuNHwMRNB<`wi!KTwz`nN2 zPl#bf7|)mL&Z!Y^usR?qyAri@e1>SZS+#*UD2ppiJL<)g4kYkbA|m4$6AaAg;~sly znuu!wVPt_vvZ)ww0hZaGBcY~jY4KtH&Sov0JZ9UTJAd&VIfM7#4nsMNc3iNq%QSJU zZ=?h%9^;)q+8C~rjQ)C#niJGyj*OSKSj2E}@^b&Um*JzK|SL-3?<*@s$ z7FyO*ULP<%Cabb?7zn%;M+s~nuPQQ9%;wgOuj`5VUVkv3siE3YkmIn#&67?1KE-5y zUCzf7;iFM5AQAuk>KJA2vf|>vxRjV6o+kSV$s^GX7v9tT>TyO&9IMXa^Pz4Y4?TZ( zG&N8yoFiX7CZ|w6)%{ zEZz2NV-6|)NQ(>KYY3lJtv;!qWt9>i_Ck9}*?Q0PX!j@!;{}#r;pKRuqIKLLA=UV0 zZ%t@<-t0##E<)RSW!NJYFIRex_w;~mxjJMswN9&ubx-Vu_K5cO@WybT>jshf^og*$ zjr)7!_!j@rk9SQ3U52|<1L+qq22zc0+sl2f(}&%c4^V(}bPNBB3y5s(x|`TcS;v0B z@f5B3jEDwaYQe*(A40u>Q?hcT{1`sW;7*k6IM>nHvDs=wLiN|S4IhiWc1CW%NGabThOxpx%#%iVJI=> zCP%IVd6M##$dK-B%+6ZT6V(MKOr+D|gFTwp&&h4DdXUI!`FF8%#4^pcVA|)EoMo;1 zd=oe6YV1Q_!>AZRyoMP9tPWQ>m{S)5JVqmc?V~<8QBmY}meFW6Iatq}Mz+4G%F_#L z3jZG9K|Y?%Sw(?L?|5)q`}^tT&m3#b{?;+JnuXTK92+6NtOxg?>4$Am2;LnlV35MF zpYP&P!o70r$6zB*Oknw6Z@6zHu&}uP&OrKL9q-U{3Y=leF6YluN!;rX0Q=;AFU7O- zoQlbc9IsumW8&jD6Eb?4kZ2nz50TEk>hpS5)A{GtotoTJw%!kkc=3TK!SltP*?dI? z!Sya#>sT9J-TlcDMuS5OYFl$T!Ie}CyuUac4moK`oM%VLKw`s!Bf=JanvY)3&jnmt z7#P4lh#rQjr;PdsSOPXEiG2ns87Sfy5qqwPPOTe%>ZAWE;sRIVI84mQb8U~h#N%l9 zTR;23-H3P5+w%*5ul_wEkxdA)3vg7fJ4?6ANc}4Gy_VOU} z3RvB@ysQzxF|_6~fBaog+Th?(wRcza7RUt6qnUW%g_+)dVPe9M9vjQp#gp-{N7sO` z&HMpE+wFi%gGW*}4Uxa*e(?E55Q2HWXem&qLkHz&+=t@LrRx9fj4PByaPVHVHNpk$ ouS1Z=X|DcnCyoD=d$@kOJU(I*|9H9c+>$CTEF)C*^_%zq0Lij#jsO4v literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/xps_step_2_setting_tab.png b/docs/source/_static/images/xps_step_2_setting_tab.png new file mode 100644 index 0000000000000000000000000000000000000000..4476bc01aabbbd56d518f10dd110c0f4b65081b0 GIT binary patch literal 54657 zcmd>mbx@n#_a{=IK=I;Ef#MFqso+}NrC6Z2TadO;+$k0crMSCWDH7b>g1cJ?5|+2` z_qY4c&ir;}|JvCznaPv;oaEm7oO6$S&bopHGA<*qfo069C!28IT7gL5 z7L2@R<=2k$?9Vo>}0+Cc@pZRch0lxeS4cZDEl#mY9mgYRn%d76LuJL4( zEW|+7W((!OYE0N3vo;1 z>}1moOcDq`p0aZ4Aye;FS{$!~v150T7e%OR$au9j=eaaDa5pk`EO2CtY6gEWN_Srq zw%0kd;2ncPOp_b%TlHB4@l+| zd44Q-V{=^*MSUw`8g&z{Erqjwriw?jPoVT?uV0{_wqLiU!r60v@MWcls+yp}UFv1l zObqctYkRQ7+z%%J1l4Rkf2@0!*l<1o1h^IX6nwiD4~X+MhPcqt=N!7xVkc8~HOTX~ zXS96F%IEyp>xWaBPxEoPx(rEL1w;n!dDoMo1Ds1@2Y;Ik>=r7&k?ac-44td8r@0_0 zTN~@Nx{SHpjtzMQ_X*voHSjz1lw1{sF(n55B)tNSa_Tsx{vnoBld(!L8463Ya zKkIq$<-NH?(;q)xA9Fmc7NEx1H2C*VaWjP3LZ9gz!I3c2LdnPh2=)MY;hWDVbkf{< zeogdp7_I&^<^?s3emIhm_wg#!=hLn%R{dR)69gysPgBE+GL%&3mgL_sV*75>kmUl>vDI3H<0uk zNa&J9XxoRs1wnRa+bCE=clb}!@bpPfR1(|2`qU@mHKLCphO1uqWHZlz*A-Uaj5RGlJQhdK^TT8{PV&9$hpesq(=d<765h$6AA6@Z@`qlJ1 z#~vW7dJ{)N50K)lrb%3M2>ok8mn@heghRLSN6N@vFP3h&oxHjE0c?VDb-9^_HqF5; zl;WRKvk$m|hLVmO1^Eg#j*zM)`}_}kx7+bR^we-A-1P2RzW%!o0qqL|WyEdQux$(P z^_*?Kc2J26>jI=ST!jY{6Lb5t@wzvn!ROPtzD0sHSO;$WV#eBf-_+A0idVP39jIu) z*{g$)a2w0?P*$(;OXJ~=biq8d*``rr&&V)a=VnX|4vvDsn}7tULX$2-^Bf1N27uo$ zheOWF?~6pzbv!0cP?Z%*dTwT%?G5h&R8UhjmaWBZ>8x7dYE0nHwr}L^?9*h4X1!jx zJdNmJujD*3izo%7h0&MJke7P`!(?t{F%%VuOwY|%+d1d~==S+LvHiWd_B<8I4HQP; zv@{^~=UggUyM15%C|v_uIC2H^w5T+du}+hf`X#NOYQ=c zVz#0EG^16;FYqn+I=UVIMVCU${JB1=1)65tN%1Ac^^3NEMTHBQ!TYD~j^a@FtR@x_ zb7uVKXXf9G@`es-DtcV4Ab0s0!{%556c$v&@+Gfz(fI8RKh;~f4h8rf;S)Sjyx)P4 zsz<$g+bnE|W+et?w(R*f&Pfj*HbN6EvDLgf-duuPTCBu{ebg#k*gbmU*<=1Ip5R=7g6!> z@FK2mLKw|OE+K1|u3Vq?N2kd2lstb|53Q;B7k9kb#q_f zWaDxrEAJ>I4zi!KpBG|PdhO}3vq{XNRmKo9S?n2G_(snJoAml{>w~YokfL_sre41X z4qcFfe6yrpcz4^u+{?CX}($7`LpdWyJdzV$usql;D+i~BdYDL#LxTb>ct4OYLVjlR(|+R)=O7; zEH)h|dT)GmLv~AeW&7D^q5X3k`O5u4ddBsGcGJL2PIDkuNxqs@SDLt1g*rh)obMFN zC*X1ew32=%lEQ->MM&{GCPa~8F#ww0{+Ow<7^d=Vm2b`4YI6GzC&uaWCikw!%t&#? ziuHbb#)GVrYA@r?f34snAze^KwR*i(!6FOon^*wUT(dk{+MQgvU@T*6@tEmA9T3Qd zof4qjR()Wr1E6wB(L6M13nDJiU>z@#h|eV9Xmaq@TfL7d0*TKhs{RnY&f>^z%vvsM3KZNsi z*5MLlU0nM~raxAw=A%7c^VXj7X_db6lFzcwM7d0nUK76kTyLSSNl#lDrIK|iqzlEx zvi+Uo*{1{#=-tXx)6Dr);o)GCz7oBcAwx-1kevuaiQmQajmPRWonWy@yCnCxIAAXZeoJg@3YzxM5upKES!YP`d^a0L%A z(^U-5oj*%;Rq;z>1(&Zd9`%AXj6IYxSp9~7H@BnDnoS0d=h-_seoy3WTK4=KhV->r z@b+5z9~bjC^M%fYEbsxmoP>^O6?=?eVn6TbnBsQ}yE3XVG_r%a@dtxn4~#uv09N!} zE;@b;C>t+76YJv)p4=XjMK=m8d!QP$;L#KETaS4Ykgv%0mAphuuE+Vrm{F|9D%1 z_&}T=lWhOHEcD;D_5VIy{r`q>n6m|ih*`Oj)Fmt|mol(w`2qJWBD8G($gSi3Q|uD| z2&`5CAurTB+^Iq6Rc*G1($d9T<$Becpag#<#NV&}l<>Q9dyI;GbzE*;BD5q%+b9P5*6k`J@Q?D?I7$BG&)O=&4I&dN(f^^?0Z$ z`FQUpNqa7mg-70-8s1T94GrngbsA!3#<>gW>i1$D|P$f#6Ie7CE8x-o$`P2$snn@ zqKr9QnpvD6tY;Y&FSa(&2bC3i=o7F&5a^JSgYB~sF8Y$4O8P?__uG&z+v_1+dr2og zVYbx4zbUU4hko48pLF*q?+dR#bWrXO4fK>r@%ax+fA&e+H1bVs9)uB8sSS!d%Bup&hF-1VmNo#XF`-P7UZAJTy zgYSA{fDN~7kHm1Hm)%DdcHNv&HbO!|d3kv{#G&s>No^>QHXxDn41Eq#u-sf-_4|#` zVJx%gEefPTE%!Ej)Tel~qTA~9yw3asaAjWOyGuzd5jFL2Q=!KTmWGf_>J{^Y?}r;E zf_ta|^GQf=_NzibXK*8g;@zKLN2|~@!Jp^QW6FO7?Q#PQgv|CRzVT*(2O7#9TG4SE zi9BKqCYNrVHd+40fv(33IDMet)|D4-&-CdyT304C!+_#LEPS{eH$ubZitgU|MKpEw zygJaY1yPQtXgH5*2D9OSKQvVy^;#@i%s1IfQsVX^nVqr7huqq3X^d34^_W8}xEwbJ zNL3%01zGJM6454g@%=k_>@;2o7T?rZO(U--sGSbu71&O958U_12!A1}KU?0+37)>* ztdJUY-UD$kSEA$96$U}4>p7Ns)3hi}keQyt5Q)(#ulDADN#`G3x<1IsZ3Mo-3iUed z5<65^B;~U=Z3Z`<3!YXB)3hxV0HdSD;SmJ;Ykjf_zXB}omtGpcY!tI=gSkEL1ei}S zv+W>k&fbF9I>+lE!Z(iZiUspO_PjAVD$p0T63TZMNr;glAR--{6Dz}{@8m$R-I0fWR2%Q#i zDTb?Wk9=(18BJ$1I|sYg9?+cB7bX+dXh`gM9Bw<_995lE+Jyd4)Q+u&jV@^&K!Z?d zV)(cMrhS0>Sk0!G@>ySJyIpTa6Q9j~lKYO5Tq}xdbBEvf=9P_`YNof0|>7|RI$VuDz?LDiw!PWB;pBQ>IWjPKj{ZA z@P2W8qv}s1BaQX(=6vZg>ARXRc6;L{a=VaYaov%wc=!AI89Fdtc%v}Gxe%l@|JtX#m{xbhem%t&NH>KOHeCDTJC^l5{R8xm zk;tEs_ma}$nW09RYr&}^hcV@_T4HjXF8T zlunsG<;3~0$tOdQNMZH0(icNhpo_ZAb}XO9sr8bDy5cfNbI?FsPY}fk4Cwhn&2(5$ zaN)kA5d1>FGb@&a;cC}%0kHdLOrvA6j|-nDu&DFZ^aP1 z0jl041jVi*Nr(;kvP9B738uE&XX9#8ILFlX8%YB z>x+1=3Ks>1FOGiJ#KTu-!%H^m@hODxPjRp5_12&hcS0pH=PqjsmsyN{F=lch>72v2 z=-1AfDzmmnzml>TH4Cg9o4IiJeT|irD~Sl`rd=L&F=S=?-iI0#sVi*to^UR3)pEvV zMcVE1c)+j{XEr49`|-dKvgs?xGHsK?XD>tZK&<~q23 zvyE3U&!1IwE8XjFQakBop9#Yy;KhbF0$-s#pcY+!kjl3g$NQc3onL=rIi7Tp1m$;K zpN07JB}0w1L)&n2lV*YOUG3}#C&dsn7lfri?y=cXI@!L*r`QfO4wEbIY`>$+Hk2=%ckjmdBu%^(R-Wa8VRNeu2LoOz@V*~4xsA0*9$u5 z8~1Ba{kE;=I~74-Y{rb1FS^J`Y6C+4&r+fd=c;eS0-|d)gvAqXJ(M=wj2|#D!}aWi zO82rlmn(gjC_?Q%FNojAeOD2iIUS7PC+omxn{|A*^-F<~DX%gR?j2LwtRvae6B#_% zuxJ3V*X5?`mUysx=EfAySn55;vA5;A)BknDQ97+*^2F5Lc)M(*$`3{`k|jEzi!muQ zuPN_QN1)w6CgZfHS?M!J=P*RWqK$Gf7@*2b+U09TONyQHdT!DsxpUlsecpYQQP&xj zuqn>+RHdQ^2LPkYLN7u}W=u#Z_13G9u+ zUVK`?1ZD!F$w6@Uv(|Ju)DWi}D;@FkC2v+aETr&mlk;CcPwF5jD5(93Gux*o8}NR& z=Q-_%f5g->a%{RBK>|1LDMEI&fd4FN7#yhPfo>nb#6nr0xfiMyr*$qIxlR3Z?EMcL z>QAT%bK({+bT6os%2ASvmZSLU=;0IeIzy>l6Ao`{xn0U6@$e|GZ=}~XJ12?hLX>v6 z;s<9#jR5|c7ue;BiL1pin&nNm+yD8Vc=DD0Fk;_H=rf5tS5)BKyA zKYz03h8a=(C|nUh-Jg4)BV5u^o9dCJ-S7N3rMZ|^$NXLPh%L`_6wH12)`a@>8C2JJ zpd9<#1oABUA|v(3;S7mq0uHL-tuaTL$i&`yUaPtGdyCL`;{0@ksTD0gXhNt9?>txcbi3x^7m4IXH5^Yd z!1@y6tOAi}fqMq&yx1Jg!h^A=C@9vgCqk>9d7SO);ASc^!xae`X|4M4_~%?FTnsh6 zMv*`lOU&M4fF8)RL#GBxzj7iS!XBCnPl2thG_pm={|E z^A3kmiY4@+NB0dP)fRYM*#xspZAd!rlwPiPk1QLVv&p|bvAI6+y0=$z9ilxHcQt;u zrxBFEbm8i~7WC0f^d}s#&|z#E+f!wpfZv+JKKb6WiRzL zGhE;RsAk!KH#lxucx;+Z%6HW3t4)-eq9bLZn)neXn+Tg<0Vn-HFT*mRECP^6edM-NZK0w7Fh*#M^n?|CSnh~>dlS>hv0CzQM_$Sd! zY`SA_FTzN@n%;?dYzbM;o7iw1w_BQ9J?SYRi)7`#!*MLKT6*2oKx5l1Ha5M}OT&F{AK zlEF~wZOAI2w}bwl#tOBuUn;n|Ek@XyCF822lE7C@ z_Zxe&AiwX$@21-#;b#Y5y?6Rm;uSp#bscGxey-u!{nuUqlF{x8hcXTZ*Bp6ErDAU5 zp<0&%g{qb{(_i$_?C_5+upF5|GLnk>m~o{9WJ)we*@?m+F+D76${p<|Qw{m@d6ai~ z$3dsv+rb0iv}yO^WIm2dLbBl6sja50t8A|3UL10I?Z>U@KbF-^QK^SoG*Kuf^?1Ku z#$I2(b#qf-3qp+0(Ujba77)H@yd^ZqCU+V}#Kg!L2g$*$&*@EkbGYcanUGeJoF14> zb>BV1=uz&p1$}cJ56- z;yytmV@ppCA>MG8>-A%px6q?_0<8{}+me+q0zZ(d`CT@~IrQYW^n^`}=-09=0ApjP z87?E4e6;!grIk27c|YpoMD9Pp2P6OE&2Smwhd8TY1@3FoVT&pGui%pCpQrf(EZ;ki z3S^G4ht+`}+943}h6kDSB&z5h9Gb$JNS70#Kj{zU|KL%NY>J>q`lj=gysZtZ6E8A` zv z{OM<0v)m76IJ=HS6hZup`cHArBT<`acv#rIpVie?!~by){|nXmKZbw)pJjvzpQ%_r z9;)qLe;|$^KJD&We&_f|H!$Tm8dL!w0vVRu-e7z zsB%0YAyK3LleiYhTdn&l^WIX|cYY2{O;gyF2Xd^=XD=lc!i@a1_ds?2uQdz{<9BHR z$|){)-nd*;3DWeIj*qTeDJ+`gGYC=&{tRjp%n{<;GIJ%5Xz9wlT5M9DlfXWixW=)M zZNVnabLRHb{uhg@cEQsH5h=80r1x7OyWd%(QU)HYxWF`D`1EC^pEzv)xt(QQUw?bi ziJ>5IO?=hrzbE2?c~Z|6KFpuMdv};|e@#$&e3f=n@X&l~P7aqxf*+U|^43Eff$q>5 zEtd7r&`|CW_S)59C$Ge3_7Al}D>$;wqAth|7cCzur(dpX047?ZzK797I)z;h_pNVINlGf&)Qy30f!8{!n%{9u+UHMV>|eB+oUA5S1cfVHrAJ1xaC50 z;et7#&b8b4$rbnCJY`%d0$z4C3+!CUH2DN95!T;JW{ob+!`5l z4%U$qU1tJEr(T~9*tRU$>k0o!jV0CGI?^xASOJF_;WvCj!U4m8a=!CVJ%4Z=N}A8rIk zg@$q7c&Du~c7yt^H$toCidP-n7{}Y;{-^yGpNB{ap3r>CIN#teD%+=?q3gDWYG=cz zPQouQsVHS7-ZQCT<4aeln^t=azmKB0rd;k7>`mWjC;B_$crgz(Cr7I)^vSageX1DA z?tKyHslur2%ZSCkRD{|G35G9Rrbi5{C0J44Cj{9|S|o)-5lgk7ZHQER6lrE1a5jpv zHOX$xzl+)Qs~Djcz0^NkfEJ1Ab*zc^90FFmK89WH*y z3@YSf6-*Y%4}Y#D(5vM^Zp;K4$28seRI7{61 zs`qsRHWOv6)%I^g-6RJ`$(KXlFL?g#VRK};M)QY7pnrPY`uAP0pcP91sScRbnc+(7OnESz1pTH^bSL}0v1NqBUcb~7Cej!aa&TP< zbAFe9wase!)pf>S`EeUC!uYib6imB<$k6VeP5$ntee~{xnMOJA08{eLhtsg3%;J1e z!pCdhG^xUrh%mu^09x_+IJfsSdAF0>N?u>P znvJnY@Vh()A4Exx0O&-Q`D%Q+?O)Rmi|9!$<<|Sb^ATma*`r1G>|ZSpTdFU0o%OqQ zll_;C0ruaNNdBMok^j4T&;Q+IU>s*ED{$m338Sa2oxk}jFlc=ISxxdJXzwq9G1pmV z?=bgq<}UH%;2j53ct2R@R+UCl7nk`XV!`O+4(Ckr%YAm=BPRm`_Mu^n5h6qZEf2zu zqSt#pP9L)4XghJx-FV==zpf|QQ+Wn?oix;t0x*?& zV34AEYzUZZ^24g7?#wjJ?17#G*j&nb{jdRNjux|GqUC|Xu5N9=_RD2avNkS#I$tf zE92-1sQ^DIWP%0kL<(h`ZEh8pbn@?jb|LCcW$x856+M8*iUHpdyIS8L8 zrGdX$m*|g@G(G{%+a}r3i;GNeNby^<*U1pE{Yb-m6y*8{P;)TjNCCR%7jQ&98^o6BbeSlXC--e#&$$rz20h(Wnoc7 zIu)M1VUq8EAUhTIJWqC~s-ZLpB_k7#LU06e?R_((_QU7r9!8YUfr5cRk&JivbD9TB zkA*YBd7fidw&36o&E_f#S7{^t?6wYS%Y9-hC8x*ckm8Z5ysU|OSC+SL-@dF^3Ma62 zNgG@wpUL4`>!IRJ3A8~{ido=2bK9LhR}rF0|DB_~c<~@9#%xQQcq_!zD*c>bjX=xp z0=Y!Za_a4DOk02rc4n4q80utZp26U#qm9!ZWZxV6U1Drm#q$KQXCe{yVS+IMt)iwF{u9X>cmlwQ>?^?K z|lqYl~eX4QSdax3tYLRI< zg;TEOIoR6|6{EvGFbv3kXja6Q%F!GIx2#5oUOMC+)K4H#!jCz3<#`#ukgx~@*FOEco=l+vAy5lxs2jay;_N^ zIeZ*~5X|5?yoH_l>0Jgm>|YvYI4A>WaPn2)AKne>{5pPxs^`PTG-(a=RF+qc6=V<( z9@ChW^30(cjh>=z)hT;1iiZe0cA%=Dk2fx;v_5_b5iTVXZd{ofx!G?Cnm2o%IC;wb+UCkSCe{&eI+4r6L1YDiz zFkDL3V)5QJN?)q_2WHXfw|UUKW0Z(Fx*(=N-5nQSm8ZpFxZm(k5*cN1r&u&^@BKN* zMH3bcjpoI)o(~$x*SlC_W?Lb%ARKy%RVg3YPSU>iFAfD3CkvgFEAsY|)!3Wm7U@e( z)WX+Od3#f_`J2JNqC>%x*9WhZc%WW*yxOKlR)mxF_VChVRz#lwk==EAEXA`_=99-` zZ;q`n@^MMwwnNx5HrUtcq*Z6~zCZY)}KtLXpza=3`K}2$9>gt>~7H8g;Fq-#TX;39L>`VUW zVUpo3Y;y{t^1)wjk!xtzzLZ9A2vWjb0P`2=sJGtMZ&8rE%qued`Hj4}|7>nA??G8X z4eax2LdHTvDD_bbOR!>8iMOaAKTQWui|2$x5*Wq1-3MD%9>?%a6HGa>9t74YoBdE5 z9%p~rO_ONdZPA$zs*ve@dTc4z{GB~_shkQijWg|a zC{W$Hs-k(VO*$s>eWBXqBYAZvvjX&LL!O7pGjh=@dX}n-(FziPL2(0)zRNU!)@$K@Wdam6R%sDBj*~F5i`Bo0vipy^mH;Bbz!rX0Fr3Yuvs(DKRK*< z8qN9)4$l^dMt~?bmm*PMvG%;;qwJBQU@sX_O<@Hl*Tf8{VRjr^ur1;A2g{3J$>L}a zVt<8TBeLsg!c$EraKK6zeRLVBn{vZeNjU}O@4#X#O#CF5SUkrsmCMVIpBGbrHI(B;>ODz&Z8a9>A6Tf1(GZiI_f}_B>?jRxP?x=xjmVLS2;fLaoBMB z95{9ph*B;=c3*)uQ%t*ezPqj86J{8dR8y0$6MH*@0S%25M2c?Be&790A*qo_3tqDS1VbO6} zZu4$YMX0KOaX7FT4%R6927Wm6Oq{;!52;DyqlQwN0!|K_xSyP;{!Tf}y=T_k^i9Ef zzzzIvJ#jWP-AQJ0@2Y_H$d>-eXOq}t?WCnpu3I5T3Pv5P%~*Fm+02%Jw{#v-7bH}9 z{fTOt-Kf81ry*hl0X8Bfu_<{0{_F=jG$_CHT2@kU+xGF>0?1v^XUZ1d6k&j&?xK~^ z$!fJ*m!)T=(fo1EvE=-!coIyiAWjBdH*->>N`Px$=n0S4-wxI(@>NC80JK*{b*LrTpRMVh~Cg|bbSw^Y#r&_ICmyVa53p`6mVs=8k)W4wm7frXKnUFa5lPXsRQjL#)tFa@k z?&+Xbn{pH1F~+LRe@|pe!nu&J(cZUT$5r46ys!DukS5ttO%n+&%WNUbvi@PCK6WNL zb3K`7pML+$grrjcr*F$h(rIPf^j&y^+^UqoKgY!qh#X<(X1#gjns|tJc1{q=2lzvc zcaEDxvx(kF(n3L)g28BzY>&^$J}xU}+&$9ab(z4E)r`1q`BC(C5aUZbC20qk2fj`nw3ccFEa#pBrIBCB)J4P>l9`<6F%t z`t~_%j8T!7ae@9>zuVP~kn`ZYOe>cVBlI5z)|37eQujPILpWtLC8acCc$z;vpTO z=!1E2$+xRA`&-8LTdQt0H_=ei)PoTtZbxc%zKsQXBA#?z){YD_dR6#?oo?TDoG>|_ zj?rugSFY;6BQdqJ`;(_-0Lk_DSzG_=gowIZ`~B-Xtq!9AYwbgCeQlu{&tJhqhvkknut&Cg5#{Q$MYYxE`BJs9|$s#gwv zra!Q^)Xdfph;MQ{o8n=$(<9Br*z-RNuIYaZt~)HaPPC>FQtkQcKt){0_!+2=gPF+h z^Bg!6+7549la?K~lJw%pR3U>O;J4qL8~QeY(xi+BE-bS~y&HgAhJ+1^V9KY8tr2)m z2tZlB7r0QVUtTx9Jd1I1utE&F@WBrh|HjzrHbtu6HnXLra|LAq`(W!!b~v8+WCX!H zAXRgqQ)GFx%60Ig0VThmRR1TC6T){_HS_Kt#jEp6zgZcou%v93xFU zTm0Vlaev-;^>qMo`3PU#@Q=p^5`A7mnj1By6PhNar9EZ4repFO1@38d&7a3=imHhe zllo=lMW$4**-J>WrgSni*a^~{yi^X|ySO=uh3gsO=I0lLXk{URmQ!5LOFu8gq!Nz& zV4N4@=rW=^)93~KaXG{MJ?m;Av6FM1a7f&ntd?nggP`Fsx+P>1=P;VTWVWK*IYdSL zIPKqfdmcizjuaR)rI{h_XSehO=E;jvckNl8j-ti&g}04wvIc~V`dwOk zEmnRLuVv}VSxX!ZeSLRgsn@dfs0ZfTNZ>vY@hC74r2eh>7!BO4hElU%DMapSRI8yg zIXv4ORh#F^(U;1-=8VnHXObl^3(wC?9g0*NWpEuJ%oiHO=;k|*e{Q`)*G`CY$5Z{0 zRzBRSD|lyj?1+=?QG_p2!v5JNZ1qnX_ADCyU_W-zvzt4!w!L3+ZX%y^U+4_Ei8hos zgXp&xNb!rpySsDOH#Ss$7U22(xvjc^%|3rH>`L}{gdlF+aUldK7eE@#fwfoOL|q|d z6DA3SB7tlhHGI`zu_mSZkE?-;JoqHahHv(4ZgAL|R2l3S;wtJXHQ8aLc0bpdU-3~gyrh1Y9V>Y?}W`$&Br zg1~Nb5SklLr&rINyi5Zju=8v*HF z@n8A`Br0&`BWv35d&Dvx71weUx{Oh!_w-h0*pDc(JF)KvS|})CQMG)J9a3)fI{plf zCR<9HdG9e$W?SDwSutx*sP=@l)_euZDnn0RJJDnED9EMqc;MuL8-BWTJ;&ns9sV^? zSoKUrqGyWypfRBnLuB^Pm5qTF9yCT@DdY2CXzxUkjvw=(0^PPfhe_w!%d<+egzKlo zf>4#&lHRT-T+4R5z!h$dej8e}-Jx8}_J-EHc;k$HI2?(=d_ zaDGO*;1?e`>H;AM?GITf7i}doShH<-OS791j!$^3XLW10Wn=9S$+V_npL}=p<5YOq zG<77+^7kW*ftrx=5y`In(>uGxHc~Rmv`D&yn<= z`WM?k)twn_)=(gif8NIBu##ASWoI_uRLNGj?sC0!=ELWHTenf8709ln#Etd)-U4G& zC=@VQ{8&RN7j&a1SDmP>>?l*L`O1=rKfvX_duHps6yIJ$B6)A(G;d-coz0 zXQjq7Zv!4yK>d;Gj;!bXfl!{#VI8l61TQ!oThn%-bsJ}^dOuRx^uTk`O+5A=-yflVlbiih@PT}pUgT|AmV)iG9gZs_H~E=*BQR)18@m)X z^Hcrk@c2xyy=E7GHw|IfE<@4U*`NLjetR_VM%{!KkUSygOJKqf9A{4a7~6J-Yqx*< zh=jo9e;e|Xq3biB)^Fs(=Y@?jQ_cG`22~z2%guo^`nrZ?w;oeEF4Ow3-kCO-&QcCr z<8wAbx_ zKxSBtzSa0+LI^PMUU-FA$)Krgd5{+M@%mjPg(v=}he6+MF5|Pibx&a_A*7L!k>@m| z(TK>vcgA=7H=n%SGRO>ZB(=X12<@YbD&OKtHWd82YVbR)*I;?4WZ$#1(wXX`7ybKV zByatar$9xnzw4*DVC?5M+9#&|M+tIm+s-0l_*?$B=B8ib3($Ay@?C#v9Uzl!R^vvu zKHwXbys8&{(Uaut$8j`^PS8-yP|C_vmWHt~+WKO#8ESFmET(L8hzU>wXxUdIS<{z& zsH;3fuRJ}Bpf|PSDbL3!em2up*(RAPkj+UW4f@=SeU1BHdjXIKX~{vx^D|#R+)djD zCwY7Y7f{|~n98NVA4BO-oo;fgvB6PHsAW9apYdATTGhSgJTC7oxC}^Ae%G%cy}%az zLeqIQUOKI-XQz!?w-qiw6c?99VTeSh70zP7|KfVFnZ9q7^1FeP^wwF;`1tY*>z)Pk z@#^cabTX8u0XN=x{&u|hAaFj)kXD5?W_J=5Ro5{d(7GPvtAgrc?#g-NWe`J(E4yz= z6U57ZNALL7;U(-;c7tBMaP}8Uut8dpWN&@bpJwb^jAhxUoyvM=FEYQNm=4QA_iwXe z{b%R;V)U!ZQ(FpAM`Fv-P9jzc$wbj){5ZRItcHZe!=H$;HP5LcY0j{@1CeA=|t3(W&|u{T-4U|KY&3l zXzk?n41=#9o=RcylHvI1E7ht`Wr@#EfOBi{C`N8~am9UA{T~v0s>8Ev_NOiWSsWv; zpYR>pFI7udUsv|;d3`*cQ36ChkV}XG18$xUM8p>fXFVOR@CT*dtV>$gvP2Io$L7Ev z17!88mi(R*5)eG3I7`wqFx=|-j}?dpQW^1DUP!!vk4@7t{8FRZA!1 z>g~PVDgPD{&IOs<|Ec^)OD9$Eo-sWIJx`pV=y2}8j09VD%Altj{u8m7TC6Mm%L%6- zGX2ZQFfg0?fAy0!-cZUh8v!IFdg+D7W~qXShcuQ~;nE3vz;Nkbu$t_vzg_Qk9JRe} zf3t0=3xh?4yLfJWKv*b#NpFrxOCt})*Ke0)h~MSpuci4rn{5enPhm0}hVNox@NTMLa>_i+v9xDo;~wekByVgdAM6Li#oEZa0_GzDCq)V)Wi$>N5|SQp`h4X)9}k>^ofz5J z5l(yxiU<;ij_yj@+0}{2C5NvK0NC1Z6|4G#qAdG2S=$!Q8gS?y>OZ5n71+{W2WJt! zRLEwKZ}lXcC31%;gd7xbzvXOrFuS^~7*MOS3JdE9N`uC9my;5Y2QFY8uC!4O0&!%6 z!n#wPcGg@$$90`~%Sz6xzUJlM|5jr!v-Lr{SfB{T87uY9JrdQd$WS%sw@0*z-gz9pWYYcBC$p37C zXVqLCDWOC-9@uu*iN4n7e~r?R_!I=0`-2p=yxebbQC3jH6>nkk75o;T!|%1AgOex^ zWQOVs7b1rx7yy;oT&2;-$~&Ry|@3KaM@i==qP!}{;ULWfp;Lg8Q}Vb zcqw032%DwZivnu{?2CadEC9<6u^6t%^s616D%CE=`_|e((M5>@G@~LQwkJ>Y3r43W zQPVD@jZQnbWtBy-J{1^Afb9t>&U^*;k3!vY%$Ud|xh%j4et#FRTUVDl4YNYu1l#Xv zJ{%k{E;aX^aEkhLj&3sc#Sx+=^6E$TP2-F^+W<`af+ z@A@3(2HAE61|)p`*P7IFz>oMQaknxpdGG|=Uv@5ipR`whzb*cdK+ zr*DuaQz;|MyMaeT{H=%Jl+7C_mjn)jy)VL)35*j*M@6$5#cEv1*HKu!FI>IBhKa~~ z0}dNG{rhrj#x@Dq#j;&won{2X3DxJF5H-6S_`b!CPQgTkma5RM;0h^K{r3hnKU@+t zT{2OfBfeAezY{O;xv&2|L!&#dl_{YstDmMUMEuGe>8sS1X{an5F5MwUupg*KyEP*c?`n{nI&9Frc{Rc@+fLV9|v2%q)e=!1Jc zJSGjqXZUW57S&Q)<~g?LU8892TL%c8Y!s&q&=CfluQa`EMi< zU8o-T_N*1qzQF7BE(pOEtFG(#=HzqIJ}m7XkMxDAK={Gk%ViG2V-veApO7=gqg|9K z<6uV<4c7etWf@k12E%VnFGT?b?cT9&d(@Kx=m0c3;~_6;Jy%3nG_9o-%B{ybH2?tB z7ZW>I*R(P}zZrOSG`j^nm11vPib_9*3j;>* zHG6T1%arRZp)9037Y%Uv@SObp!F<(-93oacV@tPJ_S`wlb`v1pd(ymEZBGj+W(gQU zt~NTr?JwORVF~N`XC}--(!G3DBS1xwNAQeE5J`+r6>!qxIF$;l-1J-ig#-pDC-j=W z91D(>^5e|7T@&mQu0ynBw%ySshp47ihPu^U6#fqD2gd+xIKwMX;{z{?_w%PHC2f}i zzzOkAI^4(!tlHwq@)#d>sl^?w5cGIZQA9rrRe1%AqSqiX9BjwN=B$^3s9dkVC$4T0RX{{LRuk1+KpDHB$4l>V*#2^qW+UhZF_H>d{x zvjqnCdIMdLjSWOejwZ1(CEPMFK2FbYWbE}1CMl?1-GnotqmNpbgfaaWE{r2Re?5sL zM}r-om@u%hL4t>ePoP!+x83X%`5Uee+@e^L4KxFgfP8fXL+^D&ohZvjI(gQiW{nlJU$T_)3^rkTs%Sh;(b6Gm%Z$%Kw$O4|RwH!;5h`UbUfA_ACAy^vr zhg3>#$m{i2(>k~XAC$+qBGAHL&ji>r9`Vip^SK`iFv_9p#o+{{W|V&ZGq&7pNgQq< zz%caG;H$roZ4#^VhN%~<{Cz4^%Uy$FbTOB?(S-(KtplAGj3Ck> zia(vx{AZmbPcZWg)4RRDEP~T@4{>c%>Cu)ky*o&))wf2dVX7@}#dAeB+MfPjN*l1@ zKDy2w74m%sZrG4&*oPy_80j&Jg+1oerVLJdmjc-t{DAd3&m5bAo!GG-)bjNR77Yac z0!*DUAA-x&WOXA<-?`^Oo=8wGwX(sFQHDHw&K5TmJT(dTieK1*ZLgtyF`HA?O_yI6 z^zA}^(=^$x<_QOR9J1Xq@k(*L;Gq%+6?|Upsj@;H{=tfI3)7pN*R-7zxA@H)4TARL z_jB&k%u5QdbvPl)Upe`<=+Y}rJl0<(W+74*@=!I%buO6dhVN6GFV7gzY+rMXG*04a_T%i7t z5870>aIq)Bhoi&xKhqYYd(s1?9;Y9K9D~Aj9i<(!9n0d{05+KM51KBT8ec=pdIEPe ze(%Md{;0O*hkLKN#d5K>r;M6QpV0$LhWywqBA<*}Xq6$W!5(LbEo(@E_YzFJ+x18? z>tqYPHe-6p%_r1}-_gCx^k}u^w!p7#W* zh;$)&N@;nZr9N|sjLzqj%?6fMCZFI1B{F-^nab%C7sh>3qgb77<4$4^tt4rKc<%&a zAM=Rir9>r`gUq%(@WVB`20`;H+GPw!PU5ZXM_L~$Z3%EMXq&zo;*;Ldb{4YAuKsxy9sM+xN_1qy zA15DfAx=PDW7gnpn_7*h4Sc)yGQ3_Szaa@@t=Z-S1kOwjovJ`(&~jVl*3ITMDjFN% zdSTYL_}E_Vz0%4#MSowU$?lz$N%hxzg-Ai*Yln3T&AC| zdDHa+1Z%8!lu}TIw}}66q?q^*qsyIvj0b3m1Sp z03DYd^H!sE7A4dnzz5$npu!)M=LKO%CuJ*0%L|J;l!p50l%t_KaB>qTKu8GLMXm6ueBm~1GGH;9L-^+eJ|Vdew$ zL_#Zsn;U`WJOfA|j^K0oR04d7gTaVeRRNJ6 zg4~=n=>$-%NYzUj+X-x0{VVFuar)Co``0YpXy?^2x%B3(CMBqmhYq<`g|*2!H&USW zk1}Q4t{6OjlQY=o7EhnIHX_t$tUC6`!6TV9-#jstuGUUTgu(W7#$&wPLirn{4%Oo! zubWcY-i7vd99QvGj>4Nd8t;GD^CkypOy~MEyvi9#z%s>amzR;ZDNs)zrQG?==1h?= zQL5B_Z|(7h&SYQq0-5$#WAyPLmv(5)H~n=F54COj4$C}`OSg1R7c2ltf+RIYc!IAa zwF)diJCZd~d8z>wQzBFKSQ@E$_P!KTJ?ZW88lx8|KM!)`ICx+SZe&F9gPN*_oCS6 zHyLo2!#Uqr_S|GJ21IGCVzj>?E;-513NE8TvhicUI(ojl3c1DI#y9-NR2**Jf)Sn27B3nV_c~X95g7nm>272vVmcOlHx4 z9@NRB^3&Tb4FF3pj@uc=verc)rpMBd;@z#h&Y0RHJQxh;@)^)r1XFglLm~r3otkMrx)@ z7Z-TrQcFj@s3m2{5F`yw-tKPcVD&@$w`R!6*y{I2+CJ7qw9#Im8zrD=t}E4)mQ+mH z6+2gHmp}9hFIuB(Qt*~F2n@gzq9zpcxiC4;twK1yg~1B$_Ch~%r1AZi-m+kK<}QutSkrDk)vi@H`b6BAqLmQ)O9%BhZ9$ z@k;h`QlSuYEmU^0j=@okTy`D|~2?bhsqOlCT&;aPBCvZ$+0VVJw_=z7YG7Z$zNq zFa)jK5O?n;&lVI3r8h3WFynhA^ZY(|qwxIXf>0F_*v1vT@q$=v<_`m4q*{EUJhg7m z_y$s=xUcmZKBQl+c~^uR1==V1=4=_scN1d#)Rfily4?uI_>BF9=Vd0E^bN6n1GEu~ z9eHW1i#y%dfbrj7VHrjXHV{!l0w2=74XTtWgAz5vK2ZSLZn}o}XU+8>{@k&ury76c zkg59S4@d`DBXn^J2^6s|eEs)uK%B?hHm_kgixSX<)O{jk1bi==O|=ohyu@bSKGDTt zyGBlTr_onfKu#o7;q*LA*=Q|=rm}na$wjMnJ==z;k}R_PP1&`!JAew#E%AQl@c^6$ zo+~}0LG4Q03mjFMjT)rKb>R94N5S);dJASlI8+kSsG8mew)eewKea{s{+nL2 z=0;xtr&vJ)6yt*VvC@jq{>r3Mr9g?byeze#Z2Tn|xbE*0DFY1n4T;%e< zwL7&QXJU7_Cr@}M2#%>w*POqsF1D&wAeoN1p9qsS%4tLkoxxprRZY_~Mu_vGfaHR7YUXJOWx; zFwRU7mQ6W9@VSqGzb6pb>}`TBdjEu~7UA^meKNQ!L&b0w#`{^Nuc74?XxpO~>VXqA zq%hQ=x4ygjsVjYWU5k~@l`wRFGK8h`967Z8;S=y(TkKEo22RT{q#*RINVUv9`9i6M z9D)`7z1URdNNVuf!Y8yd#Yp3g-Be#23MylQSMw&H`A7vDHs%j&QEyP zyvsj#_Vl>CfH52QoM*oUk0u+ctc;MJx_WQd=Wz=J{4S#2GKdwZv@`+#cb-s-!}UhyXAV-og1;cUO9uhj94 zrvY=huR>6(+f`?OXIk?miW>7}>R!}47Yw4r)F*NzJg^-+_N`n4tj1!&Fx(<1MG^)u zn0^Gs+q&&FQJHgfQ4{j6-;Wvhjo|*v{%NQG;h~xK1|K5d5J+%aGyvGrdKV3&^u(3; zzo$X!*EA}l4*Vd_=0Bdm&dwOSgt1Tb`MK3)Rc0HOt)Y?OQ`I*0O9Ev@#Y#XC@d8By zrTqHhc_04`4_K`>cse${%dy8ux$ml>5D`$}^1j#xR6(&=P8gUcuGo%uyrYf5H7E6Q z*+gwjCq;9*X`908C%p3-Fr*v8)@XgJYM2FtKLlwLBhV82`nR}3X0v?Kwo4`jVRGCZ zb?9+{s>+NXR&*>Bj_5r$kRD~pp3{rU>F;?JW!E}v#S&$VsyRvNwcnk#RZNVi5L(Kp z1%&n1=_<>V)_Trz^tf~4368O_scRAspF$!wk=_`BpH{<;1CWobtF*k44XEaA$_D%z zcKT(P1u1{+b8$Vx^U(JLh6d9QAF| zLfs&D0y8#*O7CJS!v`b4tIvCQKke<9{z5ePS2l2HT>b2KNE0_YunpxBdU~u2r#;Ol zVq&Or=d8n$^Ja(y;r*8OrPamXmx%m75?fX+uV*P6Y6rf=&y|!KdoC-{*U+Cb*jsOw zVA!sD?59mw=wgdrMbHlaXp`6E3suv9EEU<)pUeL~oHG2sFPi>;pu_&pBIi>`xc>KE zfd5M}@Bb|Rzl;1}M`b$MQ4@_#Vn=?MzlSFv2|na^T}T7uvp#4qBAgnf3^kQeXO=Ra zzJd)a&|CZG4=yHj$&2Tn_V#CJ)5-K&4pGwDLVJ_-A6>2Wp@q;cN34)X65YDIr5j9w zfWln^tjqFN9%!&D)g?k(@}+s~OK*J%gpH@mdf=cfuY%{?5q&Ztz8dBR-`$^P>2*$J zfj7hk_z;8Z2w!`Yhfs>MbLiyo&-N5Frd4Aj>fYWqhzl9s&qxhpeCK%ZTuIxUS7*;Y z#7cr0sGX-W(R%LY*M{jn7Mkt*Kh|SL+6Jv<|15art4(@l#$=x1!fx&aDYR}ltx5U} z!4*wMAsRV~*|3-+jS3Y;=}?fha(*|Y0lxhbpYd%>=zfi;c(gzoiP$x>A^hd^JT>R| z7{dTH!tU-dpqA3m{rj-#BPHKAK|ydEtD~R?0q*Q~e=&EBsF;rUbF4g>sbjDBkQ}QoVwTXMjb0+=rvc`sF)aOegEF#OfXG%z&9mk>S7J4 zS^j-)!{DO&1sjruLz78Eg__ysJ!?mM3y_zIP zduJgzPA|=(uRn5;J<1&8B-fdnz0C<$>#)OclS+tB2SZioxAu<^ZJB)Q37V0Rl{Vrq zF0n79Vo=-??E|!Mzbe~s!1?k`>uM+q$ogg^7vYy4F|sKZz73um9c{_GxwrO=%_3r! zy7sO?Fg2{oMoMb!gZ85Qu+Z%v>{SC8k*KilM6;WC);ii7j0xOR8*jEZ%*`|g2tPLR zTolisIwH3V@8n#<5H`a$H6nc*ctU6E;IX#qVq2MBg}8lw4ecTPougYpdvRwSg-i2% zQE6R&T&7rj{km6gP3`K92;BwS%usLL_~V;(bK<3FVmIZ(-F<}oG5c8Gu)UeaI`oE|+;C+ejcA~iZP`MeMbm}s^4Bot$JcaEXsDalyt&}H?<*=^w;_fQADfz2l+eFWv z8rfJQtLi=BD=%=XjSFWJ#KvBt2Whi+vK^wsM6zKcl2w>zza#r;Mb$DYaWUG+%1kA4 zHP8Ei_iYgG#zq^}#&~T@br9cRvwWD_gtdPv9;`v3FdyHmbfItBm~DEJ0;WsUy#D!Q z4)s@2qwph|fx3qt1gb9>{1dx>a*+!$-Iv3NTeXIB-VMF0mJObm-^pXZVsRW*0kq{t zorQ#@kKp8>D?MNG7Y1SlS)S~fc$%9bq{%OnbE+C z&)$MXiME%BnE?IU-KR{b>I;w`El|8>h4Hq4i(X|TOw#@xGQpk(VG7T?=2aGprHnre zEYW+~^a}ZKshLFV(fYf}?>JaoZc=I(-_d8KBzrNfPN5}fM4iKMTB~5>(Pz-Qp zBx+<@pMELlu^a{soLwdS>@sLHTWw*+@`wP~TCO=VQ&=WE!+b@ZF~L9@ES}LdJm#Fj z2pL&%uC&FCZhbqmbFdTDKL|2cQ&uvGDTA`6C8?v7m+$a_ARkpJ2(Ru#i8=W67p zF4FA&lq0$>`>=VbrlE$#?6x*;QO>`{f)w?-zP*10^)-g%M#~N=3=lnK<$o4YMdlzV zGl!Skp?Gn+#qLzRox|s%TpVKS+m&wKIUU}2b_Cj1Q}y(^DK2#!_iRRK$lx*Dw}k+< zxOXgj%$s8JuDV}d%)YrXqinp_@2p|H}Zw4NTYQgCe01Br+bje0v$zbmuv{goqx z+J2|W=EB)AAV!Z_6Hzndki5@zk(Y;q5A<-dpXxxMwBGk}ai{KfOi$TZ?EkY&7stHs zId$QSJL9;Cm8nM4oDa*~{qZlHt=;H2&zUN_GkgWeH;8%`BVL=R$VBb*7=*?3i7~$z(1LK%Zj> z&}X9m!99WIq#*jWD>ShqT>m}%~j3ANs_p8u5MbnI=N3ze@ar3S1>nc~j z8$EsmYM-^a6XSOd$I`g#^g~Q*`Sv&Jj~ByWeT+Z9reuN6x6PyaC!F6Wb=*G2*w7ji zV7SlcM}@Xq>mCN9?#bKkBFQz^$B_t8yYy4YGLu}xKgjSSu$d-pFn^Kjq?6FD)MKP! z;&pVLy!s;O#lHv`EkZ4WB4T15r$U z%SqEMWYCf015rxNSekUqKgiA>n(ml=O)v#0f-pf#0(oT*CfgHMV{@3;%W9lzIHZh2 zmM3`VT(VBM)vCPnF!oMX)piv;GTPy@Fr*lUoA=*y$4$rjm7-99W!$g_t#yA7!-sov zol25+VooksSY2)~_auWOI_&XsqBZFF>9*+x&)h$5W@ls6Zd)@qh7+v{RgCHrd=sNq zt(B0`a|STDvoiPFk=>fwwe&2kr9vvg;uQ(D00nnt)NQ>9`33`$ z?IABnpvf3*$hgZ6u`7~eyoG%MKY`Ag{zP(x3 zT9&}LJkGO*SE*N@-&8ANzzRq4q`F)V6e5%T9Ebw@!A{ZUN-xpdzgOJd8wo66BB?Zh zJeYEwHKk!m1D^(1fz@_KHOIs<9M-1lH?6X{PD@pP|M@ha3Cz{xQ|M46wr5v>A+3yH z=^-){&X?@BIc3am>@+-V)%swbcaV@!jo}+G(lU#zRx1mZZbd)ukUfX9W^Nlke+H#2 zF?Y)~H)&Gt#50Am%)f&ZYTJ$DZFC&@0_lv3#mxJf(9tmxMGpH+BeW(N13 zbT`cHTfMW3s84Yj7d92)N$Yn@>b0P2UOVsZi=airB}MQeRPN_?&TM6FSLo05J>G2& zPe=ttGtmT{za!kbqJT^`=WO19c)*3c?29K&p3KOo>qw_v`CGG`54t@9>htG;j~;Z4 zohGu%I%zna^mTdAZ14`}_?%>Aa(dzXc0eOn0T$o-RT;Z~8UU^ER;RHus3p?~it}=A zEmkiMSgMe&cyYe;7H0uk%G9FJS`)iB=_D}2%W=YsXfxtdzN zn+q4zfX3q5C`g^<`Gd7_=8t>V8<_pm_7QDkkululnH9=0miTSAytebf{n$S|bt2+5 z-&n5eU6yA%goHKlOAZ@vocE(q@B5K&CBvDpEyw1mt0Epdcp_ScR0PRwP_wu`{nZ?n z8x01XWr#kD4mEDK;#ynIfAsTJnaEJ-n1GJH*C4%j@i?6|JVLq_c4FMBwi=dX1Krs$ zp0>W0g)BSn)j9P4ZA!aGJ_qxy5@~|DwR>A6SnMLL(S#cYoUOPOhczyNkWQD zvX*0LjXDR`XVF#Ow3hx0`?&{q*}qi&%BWi8>b%rAvbXY5k*+aW#R*il7Jm=U*3rqo9Qk%~-T_+PGW6$`P7=k-Y!?{s!v;or=f?l z_%%PCHF#yJg+M)0mt90e%Sk0t`&%%p2Oq@d{ATkdJ=g$V^uU#d^>%hkXq1+1u6>NH ze2*%4H&R3AS!nza$JU|Lt6;R%CRAIYH?Slf5sAxtb(V&u4!=#+*&ks8w)O_HqF)BC>EOh+^gTI3$<+VituL zL;=VzUTDDtSGqfR1g>+QOvC9|Sl%y|t2@@){)ibKuA`}{j8+A;8z6pDBmo#W6WZ@g zYZMa`b)Q{t9L~+_;S=vy9?r4gxZc?gRUoMK)s?mNufd%mY85nyr8?~Wq>{T>JDgV# zyV3B5jQeHTi|41YeO#<05$@?)=P|^!o(e%FU+Y6kbSD) z-@GAsT=>4_F?9;k;MQ9&mV9nMI~_8BILA63YXwEx!@!CxTMpTCeBZhadv)7iMARA6 z>+OlaD<&rH4;yMg(G>DDqn0ma>9jgS0#GY|s0aDLP@hU-gpj85pY8Ty?DoLuu%r(% z{-&03CFFDEU;pQOd?^9B;My*)yqlzSLQ>Et%<{9Q65Cgn;J_p+WP@ zPa#Qfo`woAI*0-sUKEZG$$a}KNnd7tXGqfyxo_O>hYywtiN_*+M1>HSz`Y`so`MVKJu zI#M$-A~8LA%$1PTvEm)gOK4&G&EX0Lz__E1F=R5lASj$;IC#C2bud5zj&dhO4TP3h zXU1J}eR;kn7-NkBQa1a!-1Fg+&Rru#6Glw{*OIK)5y!y>Q#_>Eopdu48h6#tUoP}A zBjl6luN;ifCK#P=sMC}FjD|nth;%uptQ2r&OT4F7iK0S??AS+IZ2i0}@l~ei*4Blq zivRhwiNk0-aMNz*O{*JRJT%OIG!GKcT{dO-V$KF}ZR$F(#K^RzDL^0~ofWupIXE`Q zmsWT4N~EQ>WVqjJZ^nNG$DV0`!~EuZsHO%cq7A-)ToyWfKD+2^sft(QG2(~DGNre@ zUzusQ`iozRyj>x$Meyg68zenwkDH3`LsgmReBD@MZr{|1!)}m!)=-p(D$$_dpnVg; z$ITBUlZ9>Z^l&jXIr!9;z!BwLxvs~PVOGaP*0(AKM-B%tall~wy&>z+f&h!0ATHle z!m*4h%RTl(BwarzRA>;Nu`U7^5G!fyQ58q#`Sr7J&qodyyWK>;2FMH6V+u(%)(tFs zTQmbb)yzBW>zxlFVS!7F`BxvmbryzvKc-+@F1IyRa^EB`7ToU8ZhdX7MVl}nST^7z zBbcal(=w+IBiK$imvS)|SPzq`!AlO0o9;di(bIfTmozvc;M)JLTITUIxnEH0V@uqV zTO2vrzB~8_xo;>#8$tk>1Lz~R3AQp=LkfM3lN_%wIFH>Bn*n!FA1u0W$XMey&PoVX zpf;$glSx_a8QCECifPYGw*XFf5;-t<8*{n$RjtM(1e3e`dT})=G(sd@66yKI#@}0k zXNx5pg#LNAU7W+zrx)+azvM(53?4MKJXk!*LhbmPZ|6b_#Vhl=j&~=bgpFq#bE+Yv zD(}l)tT?LjQD;>5Csua_PjxN9XXcFKETcyVOp6e z;cO`SLM#bVlP=87M6OBA6sDV}FA<(QlY}k4F}PJ9YnGM8j;!JKl7zbB4wpVy=mXB0 zRB1-1|4$zlB6zOy76*j zv=ZOc0}UoXA`cE{qA6495s#aJ*{cD9Fy;by0AfY!8ibZ3ju4(=TnAz^D5>- zUSXPT5%ze{Xb;vj&oVO+TQ@}C#E;mgOV*ob3pW3x_aK$12ta6GJIBV7;f=~lqgxr9 zM6pqB&Ih~a%E(8PC}eYwS2L9esAnl~M@?H$!~La(n&l_Fo{LbQk&~}BhUsjnVYHId zAP8jE4*P=#2LtoK-yMfbLs8(q$zO}@k2M=NoFoQq4A##T30;gkZHVPQS8XLEwG1h5La=Mk^0E^6N5>-_`MT}AETTLJOWr1XhyxNdit}e>FMk%vCl1a;r*ZDej8&Ax(>8 zJ6y_HneO&DV|94B1czv|wXh)eVig_CzPi86sqWOIkGi`~F;yP=Rr&1<~Sjm2zpFBsXN# zvgmHAa#*kO>_t_sqs>TiEI&8&5Y9xOyod)JYP3DO>zU5ghp8UOB`5!`62yPTYQuP_Uc-93U+gCxVSOw0zRjmIpQ+=#UhsDMAm?DAneZedV-tM z&dmMt+4LIljDA%ZLLrWU;NI24Rud5xumo0Ck9aM zqUl!y*92HSPa|De=hEfv=|Ms_%6ep~Fm-2g>zeXn0$EvEJ6hV1x!z%WHX(ePOuCDO z1$g6(iEMA25yNz^3_yXbc30GF=HXIsz3}w)yn2#DImV@eI&(2JR>m;Sq9k?ZP)}n$ zw&VyoN|=Ir`va3O)zEQb8fIQi?9a=meuKq8QchKCTA%b6fftl^{D614XB2@xBl2qw z#ryR`0>uvQ(Y4L63L3qxOZ_1<;SH&lh5tv3;WS_4&g)VS}Q&??UDV39V{y{#^_DUggg#L z{H%O7Y-~=vEXHeqZ&xkE3SF1Q2`xBwG-^cA9B43!mk`R0pm?2**`49$^!lh8mJ7y{ zJ(Km?cy5=UoO##hZKId&(Let_Ne`~fENREDr(2xzLIdK@PbGQ8yd3S(Im8~bT@cf( zb``&#y;&3F-|NxN?qi1a+nvS5mF#jhtUI`*Qz&^QgfVS}Z+9^SP7Uy1TseJ69|8zG zir^K$9{~Gc|F1q{Dup&RPGw6?i!86xqo_<@mBC1w3fvaVmI|Y)_~c$xQJdfo89QWpdYVDZYfl8X-^^vyJvMSy{l5yMxEVf z(#vMkZ{r^a1wdHzRORygo~-G8fE3y`q8T#nXzNnKpFjSB(1SdfBU(XewqO9xK984c zHrnP}u=3^?_Jt`gB8JDyOUpnkEEtA?_B$G&&QOQNRRKDkSOCjGZ;9b zDBDR7zRmQGXwdU!cYPG4)!@?;h$I3?_&<8ZSE}-Wwq=Tx_qK&er3B&AXj+#ouFNJx zGF|u6y>)cKUKKsfzln;`)RFt{p7dt|8{JSYA)#JSjW|8J9>DTmkn&PvzLw6N1xR&T zE36LdAT@|F^fE76!&KyZOYZvhb*6Ov;YmmUG~Pn#t52iez*NSVRCM-gmf;mM$O#)B zOGNfGM)WM;zB1dYEsVq)Cvso3x&lVKTQ6$B$vMD^cinNt(2uiCQqu{s!h>W6<9k$7 zrmH`tXN(y=1d#}jgAkx4CT;rSQh2gmw%8D?wIOvgeNrCFAxt7|WA{{`+Nwv?S*PL9 z@gBNY$MBs)bi}3v_H&KxK^znuh`^j4i1L-Q=(~z_R&4$Mvz7W8DX3(ZU^=GH8+MQ% z+W3hDW`Pukt&Z;OT^aEV)Boa;9agj9ie0_7=8lid82h6IoRXk z$9>W?J|h9#dCpRJU#3>3-3toOnblvf=0aEpnVmM5tco__-w%-_JDdFhg=}dO*327F z7Y42xnRju7Hvc~y-_|u|8lJ*32tPmk=xg3Q`c3ZCc#o#MxXHO1UFTaK`S|U0PkE{l z%hWjhm>n;2yJ>^y_8cR_8iE`(*<eG24D|w&|M=P;K z2SaU+qCK87)rT$!47Znw1)^OC;#F6Qe2`yO;TbHJzW)Fg#e+9o%IL{io#`q(V*sz5 zYc%-b(7PO<%fV3=Fj5xAAwZ@ZtSi9>}e(o;9 z^a2Cp!NMge>u4d-x(&yufEa%e=UmNua58Vhxa0IszRlCk(3zv~?$pty{+k{ydWkO` zv?Gi@^WR7Dnnrf+{*sN9#)tEy*OnW2%3E}U`oYA9RyI!)G%?p|Vhw^GwBz-Wh{55xTDjvc9+BM)aYjL|li{=w&!A~-$m z7F0Ez0C|d#bN+WNWOBsmx)SrI65tRe)U{@kXrIE$dFLGOdenSe4GhBN(=_H^xAhbG z-cesg=o`G1C1O8Q2eiKMI@*J(xI%XWl8?p}AuoNMueD9-QoYKCO{_!Q=T=#wm|xz# z3a$BgtR;k{O$^aIOL$fuFSk&kI!X$wV?QR0SoH} zp|B^-2xn~%_xD28H~lb=7hB+?6I__l-r+$B8lJFOiF|LS#b}75+*+|w4+&l}G8r>x zYpaE{^#1Hyoe)Wg}Cl5c|oDk+1h*h=mPbo zf((uERT)WC9PQ|1XP%3_;0Grrg{xz*Id^ZQ8lWDq)zGuB0#}4$^A6#;n1TY1-QYNm zT@hIXc#v8Ig9uB(PM&bVXtd;hYe;{HEB(rEboj2#cB}$N*1U2eT#+iV>9VjXHBUUc z0^by}`Z+SfYAkSK6=x+Eyu(zzDs|+C$@UgU0{ksilPwIPfTj?uorw*ypq9*5Iat!K zuTKPM1mXiG5b7Q`lM2W6*Pe$rcaoht_5P+$44;q7ziXaK@Z+|{Ql3u~4Rq_dTMrt@ z>VQ>Oo2_WK%5Dx6p(kC94#AsqIpNOUX~UP&Sn0Gz-$CS=aZ!gS2_>_*c=pcAz>Ys} zBWHRug=3wIpk8i|mJMmBzg?4gyto8sNU5=U%^EK-s1L#m5J7LSO(b|v)KlKXJCxp@rUED@4<1?#^seOU=(`ePlE!_Px4%-u1Q;6h~;Km9!o55 zzx90;^87XTsB{Y?qk&}lFtDN0eDW>9&M z`)yiG$(~BmeO}|0$TKgXAEY__Grn)R^O+o2_q*13$&{Yk_hdku?@kBH4e?LbYulsg zy9)XPYSZ$J1J z%;_st^eE`$+PRA|vdVU94%fGi2h-5iW_x`POZRm4!ycu{Tu=cm)wMa^3lEii_tuvJ zL4@Gl1*t&XsP7d>)%M0KaVle+Y$YEg8$?jNP*1ek$nZ^b?K_kVpJYuEVi?{`B$sUh znei*PsI^3A-q~Fuc*z+?-}&M}v7X7%0(_tfec(Cz7x2GtfF!%xjJNJ_T|bt=u$T@% zZjte0!{iZ_rzrZukgnB~V!eUNtH#sRQ0z5fzB(L1A=S98Lziy&Zl$l4`@MG%Go4{E zXp-X1WImdmo=UCe@`p@s*{VUUD|xZOr`s!yReHttPwCtPEvw-BNt;Pqs2hoeLFGF4 zl^f9)*%kDE#r?cczoKk{9^2G`9+nuXubTN7%k4Y8DAGcx!Utt$7e ze@Zf<(|9qZCge^Yg6-~PCR|b5oetmRw1bqsi~h7=E)ujxnaxb$@2HR~t0dW)_HhYC zI47#(@!eJ$|Ds@&d#8KsEw^&9p#1@k;p94=m-mZT=rU^vO_%kqbS`wmv+Ukja`?t_ z3L)o8n_^QfQ{^|!Q`jWp36X24M|;TO?eD@3yr=8#J5R$Ua(1K^ts3XXoy@*)16f9k z?g0Yt+)RtD6vS*Xc6zN95V07W3f*o|#;FuN69=ZT|iw*3) z%>TvQTSvv!J?(-JAcR050fI|_V8PuXfdmPbgy7P+yGzr!TX2T}0g_P4d3K`DWHPYt6kQ>z+SYhwjsRpS@3=+Eu%rsz>M2LTlcW<3RNB80|!~P2!bF4S>rDaqUAey`Yx|nT&Y^zbrgNd zw+7dbPP*0#ESpa1>@NdT6M)q}CfXSD0Q&(?e)l?Q(bt@RxVLs>KIN2`bDNS1_^dz5jao?+Wn>s<IQKr!f`L+<73+TuVJ-%O{(J`Hkvc+Hwc@M~lv=z5Y&5qF9| z5;7I=*uw>1VvC}`ZZz|9xgJJXO5J}aj`;G>&#fifu)?Y9VE2HFU3Vp}doX2Wiwm*q zN;l-MJFKJgOT)*_sr7iux1Sy}`djRmjBuk|jM^rF1v3$|d8af%PiE2(NrTAUxB%$% z{(3cFI(~CQ3X=4En_|~_8q@<&=vm|w@UVR~E0#=`tW;pXQPY4b$wJg)(`}%ZiJdz* zY}AELl$%r-{Fi5f%50Vpn0ef15^^aycBam{WfUq`gA4W8ID2^+naabw?9GOg9n(1u zAz*y0Qd>Ykr^Z3&kcT~~cSd{qSx5=g61mZf_~zW1Q)edRCb$+q9W+x}E}&P@^^Cx( zy%!Q+2k;u*0E26JiIscja5O4? zYs71x8_fn*T8WxE;cN6h35yD&p`qW)3!FAg&n(2#6H3yS(bFy2k`twt3YT%1M|Dcl z2EN|+{yyn~UfmGgR#%n$!y9takxp}SD_?jD?Vq%_aCD(jj}~njD`Ss>&WuXp*dMP( z(U(Pa5wgdj2@qq>>+Z{iDmRsTY2hDZJv_8!_Z183kaTBcMIZY#Q}0Pf}hji@rVXoa|0qz3@JQlmLPP zT0z6BbpxUsW-`%Zs!UBz41lupZ?H#0XK>av4VkIl?zpMvkzSd%c1F&`ZQ5T zxY5Q|*-?*xNP7#f%PY@cp2H7@$@F!uBKmoz7N_~DI5g6aDjF|W8f{*pNjvh!n-$X+ z%c*o!h`I@T54$>~5FDBW6$qN1ejk!2!25!eg5*sr(8yw?wAk8^&wSu8sO_30@9Wb3 z^9itOQ`$LZ)+GMALgTU8|ciRIfQ$ zy@0wVnhdh>HMA95$WNq&ZvdB_K|3T#Ed1)z>M9n|e)VE~Rh<#*yiM+Vi|oeF+3~@X zO|zArcy;aIa*>$m# zbzjWaLES%bG2O2%bU#=~3q0pT!P{**p@i~RM(1yQ{}A$Jn`36Wsg-Y8NG(_CNa>1d zyFdBeAzPytFKJK0VzYbW8xlJ*{jHDw$*t7#;2VZWwdQS@iZWTyaL%u6>N8Iq6Zdub z)9p(i!t`6QY@EgS(9jn>bypvSMdOGj#RP5S9zKShcVRU_u2m)dN2Ff4tB0;vjvDxe z5ur&KZD8AdYWV&7gpgfk`VPta>pbN%`D^z|3Jkk575J+}76 zZ{rJB&P?CUA`XEq>~VPe?Ia(%zR%P1cHTHGfQ(V8TFZgds$ChRxA5^xgV-Z;&tLaD-jp4hic|8%jQVEgF+R(D z^=WB5@MDf(BHT6~d@aH`>z5fpt_V^67DvF^2s+I8%)Hlq>d`vBX-?V#DrXAFYVG@7 z-#UK6h=MsVSu72&5PHFWyX!qbNVA{plEDloG|^RfjU(YRA3!-WmHW|rxL8N@kI&XG z&CtooO|h9S>cJfw8#}8SbF-zX!EYn3qHD!ntvV(BrBZiSGZ+^liBMW`ZtfM(`;%X` zzS76kxC=NqNvROseQ?;(u>?k#R(hc*qMdI2@y1SG_SO6trd1ZEqe*L_wlQig;_wEr z=RgntFy4DeGF=Q9^<;TwYJGx!Ope8k*G9=h5FdR9|H+Ps_4-zy_D85_4aW(Ae+hfK z3Yag#|2lPwDo1~sdG;*5U>RAG^#1s-&R@$g6E=f#*3EbMr?J+Aq@Wx=zRe=LoeP*B!Aoe@n2jZZJXq8d(0MZ~%_TNgiRnEZ}*D>*EN6t8N565#f7wetyH)ldkn4RM}u zjsBo8IIr|ARr&VzHfBZ4{cvZ3t#MikQ|GI3GYcT&$Kc6~aK&}ULBP$C8uL`kv~OP+ zWg7Y$ge|E%$>-31HThsH*4;dVNDCOd*5*dKxCf1Gshv!RAxo7KZgz9Dtenl& z%QbRF^}LfgIXx*kWryjX+?^PV9OZeF`wwZ)`kYg2aa@j`l)$$&76YoB_AXEI$}~JV zu^8hVnCC;YZoNMAPY2SQiWx~XHw-PtN~+TCOc$bxME62Y1=NL#?Z@eWciX z#pQ7&Pspppbyw-9pkvb`R!jYyEaVH&`xl&6+vg^bOTum|E|Y*kMuM#QNStHpc({tX zT%_P+RJsv(E!U9+et4XxGljpL7HBM+&xF=mQ-`;eIBjO!_T~I+B%%zWuH|pI z&4?;DZ(c*g%`{sO==R}1sBzcJZp2c!ke{34(Cu%_N)Pq{(Qj_XI7q9x0%^uUhF1y7 z7GF*oAspKA(4cAnx4ZOXj_5GMshG-(E2Q&(YyT+1h&%ORW=-}Fx)wSaFh|(cu~*BX zdZZ6OWn+s+?>9V>)-rr*#Tdh>k@y`|>nCU-9BtOV{Zy-N2*v1v01`1{ zqp<`$riMM97A^Olh9O74A?y181UkVuK3fvW~orA!B|S+G1X~qt`n~_oqgM?)qX*I+S&S*`dtyO!Sr(! z#(fxnfeoF{o^7vM#l^@6VQ2Oj0$*99qg{7=wo{AIuf-IaOGbl+uY4Y~u^BJ4q=s4UM1T==stm}N< z7EGz7d#oR(IdZk|rpj8KRNa>%$YQjZLPWh}!pN{?Knc{4ka;`C>bJ^gtSU4L<_~@8T`(-23JQav zx$(~yV-KhqQDi#O0txJa*gmF2gQ)xRAIsi66+(%Zm;0%DYS>#NrY<1-iKeN(T3kdT zjrV)kC8du8t5D@!cM>`}I;Y3Ux^_pI5 zX_a`{*<-FJUMclSMoyj{D_NaaPHC6C<;>z2o6XNY=$>4x>PORwV{e@e?z!BWsjw4g z92nMHgY*{~0vZdiqhLZJE5^v^H7&ZRNN7xE0Sp%D7wN-++ZsN!vsfhZJZ>c3-UQRA zu~vVz8jY=grt#W=Ie;%sL5GHhhP3v9K*2*u{YLu`DyQy>q$KwthV6vEF8fIX#DSFt z)xO@Uv8NlIoy@kbe!+ccXqlSSDTtm!izZ-X7gc zrc~WL8%?2K|NXL|KMR%KG`wqlSBYIkl$ZeL2)sV@NJL=XZeDGEAwxD=jsXL0pRzw4 zE`1zrdnou)ca`>-bowx7XSill>mn*L(s&?&xwZ*eMHxw_$~H>`?A)DZfFB9nR5UU! zbQGfvv3rO)pq5g&q2iB=4G)iFmQjGigv@-4_%dE*#n5!;2_Ek3XQw3CgQ1&F<M$AgP<0M$GN z%kMMDDDQx`*~Oe21lk`qRf~y3;Q+Rvr9t!rLV00A!-Zt}f^m@Xu#1`WMKamOzWNJZ zN3Vw1XDaLhj`{RozMu%A>Cmj)RJ+diZR|*o_fdOP9%imw8af9nF6r0Bf)DVI%hl_M zI>uLvr(db7NiUD%hbp5uYWhSe%l7mSMNy=*IR;%^kRRyDg)&a^;nmxZ{BkW<6bM;D zF3Nj(ZTHi2zm1}jNtwOd{WaQj(QZ68%!lG7J4WRC_`Z&4bh4MyOZso<9!~Qf8Q$%4 zfyoO)cuO{Pq?~bisiH<~28wC;o2vn3P z8IxomlUGDlXkd#ecAXwXAg0g|Ur=Q_aph)l^-vy*x_w{cO9K$G=IN+BPNq{NVcYtu za=GNxj4f0*@n;UECg&dYCzQIrDd=7AmJ{BCF9LQ{!xSQe^eA8qBDN)vw{g?k*|Cg; zrWA=aoMl>aB!l1GB!y0mmJ7bXaHF35J|IGqQYG5*c?QqEUo(LD{T0-7wqgzCWu`{Q zjiUOJ=r8O75F54HaMbF|BrIc*GZ9aQt+{rje-2Y6uK|yoNZLX8`SRmNVzy1=52|~# zpHs{Cjb`np_Dpo<+rpm^Gpiu;@}tyeei^S!x^n!oMsgn~c!v8c;eB`YSk=L91t)W; zZ{HhvmoWo1&j3d`x7+X5FFi@B-cDIovU~HjpnmhK#>VR!?$emdZAEXLu9}`ddR?y;o8aw6s|!ep0W98p zX3>69*6E9JLw3GCc_8J{s)(K8bgfeEqWZJW?j=Tm&ZOtbn`>o~@#ZH068(Yaue(C* zR0JxYM;>&z?+n#6NvzV7jX3AM*0t@6KV>`2nJO(O9;Q(cYgW zm}8P9<#M%pYlhkh_xfhY9TqUK-iKV=Y>Z2rC?ZR*K?&!W${L`wb9GOj}fAw0s-AF)34bG5({w(*u5;x#J^K zsmn!sjc(>9cmMv;o&;9zER%D&N<5o&Z)va_DYWI!f`SAIExHTiwZwM04+l7IC>esx znv?@JC@Ts{{`6IjmA1?J=jZGAN6z)kAnrIx5A zv&e5MeGV<2)u@@`bE%md^Qv<}7Q81Gk`tF+3afu-@?^%LuZBm{mD6HXGJ`yt*762i zmtNYUS3xmJHbDo_a_X_s?D0#8BOHpgQO)051(08|Af9E4Chj-=>$-7}%K+nL8;tA0 z{M59q3w;Fu&jmuywHe+Ycu_3tz2n^&>Pt^M8i5^Y@uV>wRDd&#*eLncy+cVQ4v7KY z!(jm{j`<2@t$9Es6p~R9;_q_XmM$Ux; zZXcpX>op1QjoHW?Yy`~JAD0TGRX&`Div1(V2^Aa{bIAq$z%>pyb4r)XV%u zZ}^jJ>EGYI2tBlvP1agE_fz1gsF>n8v*Tzpu0pq8pSOCVoTZQ?fwFK>xPH0|Zhm2b_coNCEDUi?j@4ap zxZXE2?*L zuAeh<{R}O#LkJkTSjn;Yd6vq^F?%ag+=!n%*np(5cR~O;esZUgg^6JsZac=Fi((JG z&gMaVqr1d(SGilTdr?#6%J{k!9s3X`{+1hGhCP3pPt#pNX2n!;V}15s#bLnX;CLAk zqu9$H@x2grfeg{P>3He1f3X0h*dv7tTmL-bekxLvX=~m2fpx;yjVm81#9c!9V67W@ z>SSLeKm-7|PxL@ejx$wdyzvW{C0B&-!Ry3^Gh0%dp=Vm@1D71-4!1QTOL`ex9oe`QR^OSej|Ry*n|Y798K#YLr4vw zvTj!f25~91fY+4LV~KIUhI&P~oASLTe*2aREykFXKHdstGTkNLv$C`aLr1tFg@!|X zr1w@YPj6hpoSHmDh%F4-K)l?0SWA_jkmiq!5+*U%qiDo&GUk_?X_4!g&eyQrvOzGhC1QWpguzDeKo+*Lba2sntf%$igB@OhW=Y z$d|xbikQq~%)|MO8_oTQjd~7E^;_xdb8-5^Mm8p;qH|T!F(3Xt!#lh!O_<=yQe4d$ zGF%L6i1GSIJCgL(ER)0cu+gOl3y!yk27%Svln`YqK}ka`6x1LEL3H(;iZZlowb5K{;q@joGc*HpCF_@E;+WJtqakFx-;N zOax?K@xRO+Au(mw=nZCrXx2L8=3NUQ@#xj)wUnXGnL$|v{bvFi<)Y8F{> zGZ$@MOdAG-7zw)Aqp4h-uQsC5I3G;zvKPHGYv$05Kdafl?X=LG4q6iT$o9aL@~APo z+=CoK|07X|p#cr}E4H0q<=YW@(%`h5;F!V)KQ!rKQB>)E;e#l|+BAuot={bnCpk;& zflXjCTtGB~E5qrMB!Ab9ujdA|dPTKU@&ahR!IUTOp0cvGX`PZG8ugW1F|x&IYQ6%$ zyt`?XWU?~nM1bOXXPd={(d0c~xjCQk@DItp5<|5cKTz z_}@omO=_YZZ$Lr{Lfu>Mj}MEC94w{y6A4E0D35Rtl+Iqc{7bAo``_6W|HUTyf5%Yy zU$sH4b94asl`v+V!GJ*p!i;<2LMR0LfH9+26pjJ>2^!>DTgu!;ZjxS1lMiX4ZJs_V zIQL~srTU8us)rM3Mm9PNFEC25@Jw zbn;ejsd%xqSFUGz`%!1-ZRpM6s#Ga$08HcjrdSZ7O5U^QYSbxGjU8m7%G0fNEy}bZv>fH@ZN|Gu*ryBgPDO@Z_x$rq((1Dp zfGSt-i49Tr^F)#+ckBSNIf>mrNThYH6ODYn`2N9;b{i(*U1i&)r^2ABU}Kck8NnQK zRmp%ykFoNNH*h0$y=cbIH_ws$mj>FXf{h5He^5$Dj8NKX%5eFFdC$8Vla5Ur9Gj1R zi#)?iqtd%MOjn{X!W^2Mz~DgqMH3v6wI^}vcwdM2oI;}z;Zx5cg*>a|y#u2oD)}iA zAP^|Qg5Os{iHx)cixUZXB5S#1F8j>(enYQy$!!UhRfc$6BA3>$9obq!p$SxzLf-FU z!|v&aUm|<#OONtKmv}o{7tNzd?Oi7y&8c#{{~*hhL%(;74AYe@hNP2AbWF6Y1fpZ& z<5QTISZy4*P|9sx={2+Gya`NtOuzr504NCWTDZ115W3Y?fB7v`0;41CWOmGIt1fxZ z(Fbn$W<;N?Nhr8oH!H{D_Az?W_ue}q&Fom`>_WnOY>f0fI!%Xul(-qea%>YcG%ObN zs8I3B(0a!;p?b)zpO-f-xA+L3^o?kPxL9b^F@*G~o*&4G-2fRiJTBv>eK|9CH}<3f z20jG)x}3kwDa1VbSjbISEF7q-e%MqRAz>?DZ|H|kg!OG(rG&)ejFj_kKK8+i)a6yP z60gnY%rDCyv;cQr!A95*N9%x3{o0Y&mb@Q1)`q(GOyQNtj;f7^wjxp(xYmMR{A{Vl z0QZwmv%eJl5#KP;v*dXO<*&$4gS5z&p!LSc?=tj$FEHtG zj%g4jyUM`0c!WtnF0Guy-$;A*58p*;L9O|5=;kf}&Hg>G_+e6HTNZL&kq!&OWJUtt z$fQq1*GQqSdg?NhoWmE4ZpyM^M$P+7k#-{v9p4-Y%4=ju(Msx*lVl(jQd zdu)LTpTgqCm3D{|r;@8tU5JipRfLW`p5JGW(s~^?ninLbU$UilW&6#RckvaqaZ~e) zNzO=fBMmx0p7avEv`$*}NM{-mw-)fG*5G9cuij%U-bFq8<2h9xaj&@%^Xo~6PRA?8 zwbTbR($MT^?Q~J@Npq^t!z3-jld?j*bKkc|$26R|hVJj=h-G$Z#-m@WcZWV8a?A79 zIHSI~7*Yz|!B~j$ZFB9hlPPY^*1U}VD6DK`Bz>AW?c)mXkRJ9wC_NV&ok4gI(77EW zdWP4%8rknQ_10fq{XFiquu8v+w6eUIqA;M4Z@h*%!}#9ccbixietbz}6=jyxY)c5< zv35>P`*M6+-@El<4K{xsnvtSEabjsbD3)wWBAr_fe2tMO8_y9*my9eEjURQEJ;B$M zO=e9Y%M&>xMEN9H)FcYNm0btZvm@ky98EB;H$^Wq_M2RB4M5;hqF@Fx!azKub(ixQCr6`PA9~X&$1A z1dREa^ZmQw%0+=r>td4G*=;U^JGNf4OVU4)zw|F3UA>E?fx6gyo0pq!Q0i3w0qu|$ z-yW!oW*sVptO}v_O>aL>^WrdA94H2rPLWDTU?Q$u@L@4}z zAFaD^pQqJfEi}m}LbHlKkl1UwcLANDaMk(Xb3hb~*nY5_h?2HRL(q$|-*-cU@S`@% zcxj@9nfj1PiHwM6%^;qycMiWZmhy{Nme*_tjqcaWAX|)h)0_5|%CL2-3)Jxz^C&k4 z9$@WF4SLK`DK8t6cEjz=H4xLrwOcRpV8(qF zF&GiiW8cTI2^~@G3k*Zf11YrH)AB5Q3C=yp$7^DJ8bU-SDS9MAOrL(7!L?^7R(gJt z6}?IEa5+%>nBfLMZ>5O)hMvjV?$(RHUchYkZ~@1s=js_|ZMX~58YpcWBEAfLIv?!% z9AUg06M`aGY0bU|tIboj5CQ(TC@aUCTk*VmBihi5s%Y6N8;lL7n95ef9iF286ffw_ zo^>nHY@JC&N+GKsmZTtJu~IRc(VgV&4%(-;DmgBG12DYH<6LoAY)I=o12>> z7%b1c2y6a^YmOIYG1yN|^84%dnNd+oCC+uA#;VF!&%Mo;cU&PQ$xqJTy>qCL#@yZD zdFC}dxIqUPWjfux^q2DRUVO*io7s>bA~b+&j5w`9M*iQzIDNuZp>4_XJn7PDT^3IG zdW!<3*nbdKM*O|`UT?(#5~c41MU<6AGm!CzmSnTlr3LJJOqQ0@L(YnG(eAXNdr;SH zL5ruSR`%ZDA)fKAP~WyFDUVUKQzr{F%KJc6?D$vA#+=FEj?0?eiK~S}ddiU=`A^jn z>FTseB%tTjs6aD~@z#E1e8Ab3mCuOut2PTY#cf5f)^jAnhHP^0)ZqB?6hVXy+jp9r zOYyG=2SjTqevA^JX zIDD}_B>!W0ZI-j5$Gg^O>tpb60K;#Or#j;GDQ;N@Z(EO5Q^x56j6}VU2Ff#1oF3}v z7Bd|KahR#P?E)j6h5iLST{-OVjuws`9rx8K!YB{so1xNU>if1|-f}PR?}rsy^hV9W zE>?Fm(owC5eorxG(v*H;vsi<(!qg9XY!INV!zn^Hf^SIRmHP4YrMHuWzpV)C*-?r% z2(NT0q-+=NHzCNcbSMq!gMYU_V)-d-dfT8MM#nJaA5&}AAk&p_emEjAu2Lr)P|sy9h% z(A&S7Qu|aR>S9qbifAPxnhflpH}xzNj6}EFZRHdjJl@>X7DIL)!C1b$yZXs&didq51|+z0Lt(3r5SKmE!F%Zzwpjsg<$jJm zw=m9g{PnP#&mx%zlvUcVUC;e4n$;M=zX$pUvLz@me(jVVd6hou!EFpkD~Q4_H=e6i zC!Tz72!rzoQB0+H260~lr0_SL9O^IwKlF76#x^C(#V6s%hc1}hFdMvJUR(ww{{E97f1#tBuq}n50*9!KGR#C*JU*`8xO^ zgF1})F%HH@7sxP7 zQ|;c#{UdV~;&IQiU442(mW{(cm=OBHUvgmlI_9a?XL#GMmu5SNdDc9HDKIN?lIn=< z_VL|&cZ zWy}*liM?;kMwzN8CM|2sTHx9^F{g%>BX>q8hmcmE>C}gm+WJE7slf*&mH2G|W(_X% zXT3>*gyl-TJ{}gN(zsA}utH>H)@TCd_|B-EFlNOO;;*-M`6pPi$>nikOiM>sSw!_L zR{PuGUEppM9_;eG{Ik>az~}qbEv_Z9V$bM~6!7d4%8iT<3T|tQHr^Ef{(6;Gm_zLl#STYiv#Rl<*W(YYkY1gopwOm;i zT$ch`vxJ;BjV=CxTE#{hLq2aI%O?L+D@n`uF1r64Yw&ktJ$7)L=RY{Ctea&kp^m25 zvJbV+pr(19z8%fL@Tf+fm6&+=Z&`|T2A4dAtcW+={{@M~?!yBym*^A@=Tnl+ z=EhxaOqIGB9FO}P5!1WeblU2LBgMsmGlH8zZDN2c*4DNWuuxT1)}ppZ3-2Bo5*U7p`^%!24E)iRhCE$~?i;JH<1!;l*KatBF) zpMejbk>SgJ2>W?T(VDm(GC}=MnBXXDd%4kO=Y6DbiTSQwgOT-Jws+E`sM0x)M zFgH_n?Kc~8m@(YM@hV&wWA8&=U+Z43RXGvPjUy5Hd8XO*dXF_FGJ0BL%I~f9cRHzv zk)Q&kcxbeOypzs#TR~#T=wj;OmR>D2HE;Ch!4${I!cSzx#NUBAO*Ot@)V7aCkK&xc zAQ}#E8aP+}zT}Q##i0@6ejAb8##o3&rz-W2SSW{EUq{*@D=8y|(BN>sKJ}3N>C@N9 zPKmV6a=_n$))9t+d7e}2iMNbgLKq(^q*Xi-H<%og1MwaN>YL*XzrnB9ggYt9;!_Di4E&tkd$Y^=^Z70V+3~tt1 zHBlF)e5Vh(09A*7vB5~vcoXfTq4(RF=V@X?uhJ`;{u#ThX@$*CC)0vvQ{^Fjk;hwH z$9p{!GP==!r(q_v*U+KJR&oD3sWn^vG(5>mWX3VAn+}j;yL02-P`8{``zSH(On<5-k`iCHYr&g?HSTx{<=9bSt`fa0m0p>EgDE%=X{`lY&%JY}A>jRxnm zILY9VNDY5WjVCT?sdAN~xiVW|$UH=dKu`c>h+C2I$M z#?S(%&stD(ILcn2m=_8mvWQ4&Jy_f${L^-<3?n4KuH?-Rie~)}OtoQY?XJkP-xhTjTA6}j^ zS<+#NL>O(7-u$9Fs9}>UrkG71ALC)7Q5D1~{US8Fh97wct-F7*^ZfjUH<6VL7*f8-u%>!~3;l zD|;J~e%uF_u0Ad;nh5MzgVbt=v{<$q2M33oIT5fRcP&pAJG;9oMaP@of6cRd+ejmq z{bLpy$(7`XDd9hvvb3}@824N8!+cr)t=6a*`4`}9j2R-M+t!(IGJ>wvdc-HAGDbe( zy19ee%EK#}4f(5D%1!twflh%CXD4L(fI>{1Z2kRT&7p}zN+K^r zAug_G%E}|G2YWj^ss9&t!uE3d3H-zRMrlrt;ku2piCd%Z>r;WLjFF8LmoF#`5bF|x z*PP17zvq1p`dK_z0lSp0y7f+w4661Cs$U!JlcuxnZLctPM3zoCAWh0iil;>%5)jyT zLzmDyE%Icu(fLLy72JZ`2$%##jFZhDxvcfd4S?nu3)Q5Ih~Gx7F~>B-A@j|r5rWgM z64oUWf38u^y>mUP-v0{7k82XY;%N|vL^dRLJSttxT*B3qDUX!*;X+JG2cn1Ili|PL zdAM+C0>7(uTUz<3dP&{86fgOhKK{#>r!=UNfq{$PFq!egY2Q4<+I{T$VIVy8f&l!g z(ce(BT%Pcw&OCij$NRU>o<41teEvc5dEC>!m%*p0uxlg3$5;e9#F~uR)377a{&^=T z5Q+rxjbwP4op4=J+xPZe&t@cb%}^P+dqGKy^v%2796l)sqFz#vO_rIld*Qt^sl)4zJEA}h4$bini`p3&8nMZL#3Xj)#*U@5T&BFx z6PgpSv%r<)SKHhlTk%>oEve&_rGbEat(Xtd(^|KW3I#wE6coa=`?>%nxkjYoCKi`MSsKX4dTyhL z{J#7E(*a&2!u)fGgne!nuaNUL9Jk7PF5zgZxgOSC#w@DqomE#n3ksbs#QmxY)@V2* zYhNg{Ej(gn>1MID8(J12=3JWtlTNgfmuL3=`ehwG8>1R&rr^xtsUsdT8A55|lI2~j zJ2W(BDH3<}!Q-x{=hSp;NiAMm<-nxZVz%k|K?B}u7Cm-7Lz4ip2zX>YaTZqLl@RRAQJ19x5c@k;txBx2+xJyVI{Gm3I^l?5_V5H(LgACc-=5$)^c?N$EVTxTgnXUiaAiqci_8=r)D{Qj1@_#~S!6CXC{uZZ>v}vu9>7t-e_i%#xHcXxRz+ zEz1AB{&IYk)hH4ss#oXjuX$?nquh*DK%F;&YdneCMJY_mF6HA#-9f-~GMP%l?EE<2 zzXO5I`VNEuFE{QVBVU{&T~efDC8BEeHTJ%~LNq z?OTO|NM+exZHl@0kbTyEyFeMYfsI+ZU3jD>Pht8F=kaYtOHJws@uGe~(~T6Hk?!@p zsJ2bMM6*G#-o&ivMZX+!u;-D4PErbWsWqZSS__ykj z@)y1}HffHpZUtxHaV?PvRg?>i-a?wh-B}976J_3 z`u#VHKvPzlB&Y8M8=R$wD%2=t+c{k_h2<7TuCr5FFLeka@brK9V0B^!S9shC%)}I% zOuCi7T>Sl<8f8QlzZXt(0E@XOCt=MxGauvdi~Tqm0s$F6r?!h)*|Z3-Fh-3~CTGxH ziW#CVUYFf*<@fgRM_|!CVumCM)^MEZoSJlfd0T3^hIcWxl7>DV zRLM2%>&?;MPa3H}@g`5}x+`6tQK3NU3x+7&&cbbO#qq4t38n<+eiAdXVlL`~Z6BC> znw?gAkBS*P-_=;v4`PV8&fvB77}JS$=K%++iKDWzQn6Re6Vz$Pt?dYuqsY2o@--g@ z`VGh{8T-j$kTF|PO&2#J*!BYDEDyT6CT5kgxB!bBcGZRToB^J38RK{du=;X{F}(Z@ zzO$xWSM2(7jAOYvzX;rB63&y z02DtFn>lt`;lOxGsN;~ORz!^vg3bKPP*mqp#l{ghs2_FewVAtMKxdL) z$+r9^j>S;t2IU9eLO%cbu?J?<8Z1|BWE7z>Zci{@jlV3mxP-YQ@8iNa-Y!7eVU6Uu zV6YF+IUID59PfC;trrR}tCnaB@eNMwE!4|DW?lwV3V#ugk-8ku zH5Sd*>cUo8tvj}tTJ2dF@o!aZ%QB(6`whd1@NYMiWv zReWlr3o-#LsGf~!sq+!*J3cO#R!y@*H9*g})qPmp?zbVKO?I)ex3a&NB0>aHz6)wP z+J7SIz92`7sk~l(8NT!D}G__)B&oxycBDKDZr7l38`# zO2a1?sr$u}ZS|Jxf~ktpVo!^n3vPHqx7)`(Ku69@Lk3P`2a)L)KF*LkV6|(IhiY;G z%%(S!<{Op%NV{pJQT0PX0by%n2u?y~(U6*N>tuK~U&3oB-#0VT@6dTQd+y9QUw+;P zIvdV0Jq8+kPxOb0SxAXJr3+_UJ8D7f{MzrRjSCB5PI8@<9`J<=n)Y{$N>bfJv z#9pxz^X~)reKzCSDno@UDX!HwB!V%rn=^0w93HT#Uf)gRh$Zk^N=@38BHyR*hg364 zs^~n|{mx?%!!3kXU}0@Q2)@9M!zzPVv`}-hfNA7fK`Ivzo)J<0uqON1t9$;GzU`fj zU%Og3w~cYq>pl*H3uD}=r+cJ!HG(nmfSpV_FKOYL)t_4$$30ZZ;FzzvPgsHzt>8G+?}0H3tlo&diphS8DRCEax7G#%Q4vRr7?df-vh_d*(2V+6 z#S?bnlEB-d^G6_OK2$h_7hPD}^a!wsHb=)eIfBlu-#hei4jg-hZ!#t@dd3RKS+mr~arb|Wf zfu3Fl2)oRtR2ZOB4YL;ay*O;tyc&~se3GH$m3r*m`=tu}@eFABqh7m}isJIrhChS* zHE#CH5_^Y!5LSrQ?p~-)k|JpvTiK25GyNaba)lA(B8`KS8f%`m4L{jlvS+mj^>4tY zK>OZ$024-#d$y&j+rgsWZFceUo(|eMjyTW+!)v7Ckv60Wp;$(L@4fs`0o6WVG95~D zINkop&CP9Tv$wS+Q)xPckRQot$Ha!N7scL^l3nj1#zpjptp?LP@Qx_~=wIJVaO$~x zGYqlm3wIMNSwB$kK3};@0<}kip2MB=L`{X!#2eG=BB1$w*rE@Foz}2NMjNSS?9$(5 zcZF<2B*OX%*hm-Q-2QF>4tlNf`f$GsA9uQD=w&QUI$pq5bN>Yso*;_*S#HtU^I&*= zBASeK6~!5^oeqS=e6UzukJf4Kz&Xs}VNKtgn3FlW1xry5D34_;JTbZ6XO6P#ZFb&At6D&g(15 zP-eU(J+?9fofsMSi|we$gB{H^uAdX7+v(=w4egRqSHI$1>UWUe&;J=lUpmjUNv`7M}7Lb@FN^%J^j|d5-iBow_@b~k+hD-~dfuucCs(~Gm4`&^cEs}T#yEM5F($9uLd-~4_}RCri#*%A zt>o_g_FakyuAYrCtxuou2^f`bnsp!b1z4FSwCpauY^~+>V@+2T^`u&#>~+!-4reYO^L~|F4`F>$t1Xw--}yHT z(Szzp4h4+(*0Rf!y}N{>>A3qXwmL@j*=i+LABq~Bm8sZq>;w#IDJSucJJkMYwV|(s_-u$?p7t{tRbJAVRb=190gG*qyOl=4puZgnSuY zs|^R7_+)_KZ|xNsGG!y-TB$S|35-0RpO4@D)0^<15-+K*IuKk< zcYD#*xc|lr7n6JHONA8%1QyO=?u{Jk34{r`<0YH9xiX!ee!cjnEcooF?GesblMC~L zkhhi2oj`Fg`%ecSWEarvD6C9B6_#DApo55HCNSXFKdvhA0cz9tuQ7 zz|iDrJVh66}`?H(nmh3|hpHl#=s4xihjl!m*SI zRVH}A+IZ2M^ltwsvuppH^2e6y;Awk1u!^Sy*bSFoD)M;29!`mQvpwArkVu~NY|8r; zqIY_YbRx_C?lnbyKdZ!8LOUDe=_+;T+Jv@fwTsy7z!38BVeZ@~Fnt@Y;J20fg~24& zw{^BGccS9U+xl)S_*Tm1DE^ft#B@A!HFiat&&kYxR=~ zdN}g1v%d6yTXA^b`>Dha@gM7_Qc`&=N>KI;};`& zweL|+c;tp+>!UwcM}9b2V|RY_7nVLHop~3JR4n;$;1qkr+-!z=JwA{0o8sRM%VW7J z4_-G^tg&Cec7OlQ*TEWGvX1eqpI5&22AzYJ3MvnP*N%T#$M10K-}A^#e>La*s4_kN zsr=)$Wj|}mE**3g44!doAM?M4{mbjG&h=IP^ZMY+Lo(CPC-S~?T74;ZjrV!B1se6r z@pBEf@b8t-pYxpoI2k_CXE!64#k}e6%<_c5Paj_G{}j2+ z_>14`OWhAP)obRuZd+v?{pqAW+v@lYr+>Ho+50-#YqMrSh|RS4N$us4FWQ8>-l&Ft z`*^5`@9KQD^{4(GR-JM~yYASO0N}A<+XI|B^$NuVCtCS{PCI*(cQnjo}WT-o4u!@$Vk5hNfk0oxdNjHaZ0=Q$6NBJrRGln!PW8>4E6k8S}mu7hkWQd2Mac zi`F-1M1n4JuYSAV{;ll3t=|)i-gkcC;yZf%vUGNWyinD-CtVKK+iKWvs_#=hyIQy~ zv6112Nyp;+$w6gu_hU^xfK!ksDi`|$%eRSEYg+E!*MFirzj~&CVB7X^?q4opxrM*3 zRNL(TYMf*G=B>uBS>gLDCM6msd+d0^nYWhxr|Zlmse6tK-(UJEd1K?F`p>`07yeoK z)<$fbKAYd>?-z>q)LMw!IMww}2F`Y@{H$|KVtV;sA1~mQP^*BmrcanYs@wcAYIFOx zr1Y@DAKR{tbMGBLw|M0exjW(C7=u71(*C@{L)NBt>qJ5G(w{8LbXu?XFO7NO1Pqra zHWzFuC^fOxKw`-~J1@9GX1hA(=tse(4T&%H|MQ=Ec%Wof`L0L6VM+#1S3j3^P6SQ7q2@&kPzGn76t+YcL^Q_OK^907~Exm5Zpot5Zr@XaCdiich|w?PTu$X z>YQ``yZ6?uI#s7@sz$1-r+4q&tJnHHYlSMvNur~^MFju==+aUkB>(`S8vuZ_M?r%9 z5>q%I0DF7o^hsI;1=hS#OhRDaiJiqYoR#g&oZSo^O#$Y%c3@K`Cu2ubQ(GqsJLgk` zRv}oY_kTNyIhqRufXJzMn$Hw-NjrSu5+YdZ=H2~lp zKpG^f;+}G}>}#RD`%HW5=IS#~WxtN1^F7|Vf1IXK2xtf#FORbzVvNOzm!_P^(Few0 zl>9jP?b=yeVK+C^Fn_u=&}?J9%U-ZNSfw_=*%#=T}p zh}PThu1Vs-kqM*E4kp?)rgxGl&vlU2cUAEt9wV2Vmjb)qIh&hgK;S#zKW!oCxk$ee z9`tW(C7|j4_fr*^?E}p}J+i>z(rnoOG_bZzSZK)KX0d3bB=c|2MS@tP|BO}h3lI07 zj^j1mIlunt7*fOZKM(nw+L!KR+>7zXQ<(l`K{eCmma8Y6?bF|psvKJTbLQxFV_IS) zJ#3-iLjCCM7jYg^d2NHc07QaD+?9kZsb>pDTW4R=W%>DW->3fRYENUl^#BYFCIXE# z*R}^Gyn;p&hR(XwjmtXKElzG!T<8h&j5wbs)h;f;-X~znqLh>^_z)qKW@&R{{qS zKfXx*AnGREccD$cr)j*1diEauIk>?=X@Cf{=$@xhUemy%CvvTRs)J`@zEbXJ&QSF1 zi8_nrqoMBre9=ny9(1QRTkVZ_KJwFEBX59=BkCkiFZKZ-;?$9j2(a^qXsHr`pRqYa z*h1|S@p)~wR2=>uZJt71T>B8=2O49RA?BwL5R0JZcH0~6NFw1AN$>G8|Iwy*x2)jTC|}DPk$vN zU?5Fn4I)|e6%Jfa7`kCnLvDgC!D1B{V32XP|ISm__3v%Iad+5wI{I;4RXiHN>&e7# zz{eXgwGDAkuV^!Jqq>EVPoHj}P?UFG{3JV3-=r&cL$izSu%3q-Y*)nFwZ8KpiYMb= zqvAy|2jhg)q zw%;-GyS907HQQy#FQVQJU&@9A2vK@1@unjnc?0I$fcv{B*pJz0<##f z=034QCl`Da?;S;SP(dCLkeN7$+|PAqy~$1(;PW`m>pmxB)A+Wf#12tJhH3a{rj}U4;J?x2#SuvdNY_+&CV}f{TO8 zo#|S~_gAjT#-vHb#dc_Rks*0P5^g(Q_m$u2{4DH7LY9(aLSvaPcd6JCrFL?F@1;o< z5y9N&&0LhBZzwBQMti7l@`088l;?}@6a*%23_qFKP9H!Ox?a{lKD1Pn=wgTJlKv3M z1Ns45Fo%*>>esaM)i+{)y>b;DJBh6@GLB#*cPij#pUFj8;2gg`*znDjH`4!^!%2(- zTL69m>d;Xf_NnaGc)Cb`%#OBKCWc*G`Dk#{Bl^b-Wyj2775)H$T>Ys$4+GcU>0QiG zeIn6jGv`xPDxjPTX%Re;D`7JNEB4DES%CPb{^`T_H#A+VaH7GIz|#n+qq;9DB30_Y zbAW#&nrB0d|C*mHr07Jva4Acz`)dXU+zsyJTb8Yy8rRoAAiGz)x!x6dx>b?^lZ)hU zxdsrph~mq1*EH@Af44kpbKF#HFjx*Ba1R?2&$#iS23`_g=Q? z#Zkhxl&TZNVF>9PhU0+qv1OZ&J@VTFU%obwrtuu2=DXsNs;Wd%?sH&5@+^wmjIR``h@OHqGzciD_To^$R${DCxW{6uTQiRo+P zP|}q5u~Ih6%D*)^N(<>DBi=8h4I?}Z-4N$coLU`V+|N_(wJ*uh0MRErW&t+tm2ETi z68pbV3nj+zM|VBi8~AnxlU*8*lYcMJ+H@bL%_p%el9aGb)E=V!d2nu75ZagO{0S$W znp!!!EK!-eQnz0#*0_{3x8Gi3S2RAzT%e7@Ph4Jj~vD(&kH`+y;v)1H}sbuD=`^bTdUD~zjMz+U&y8F>Q z#p9#Su5N&hHMxq|S|@4P>gYQMLlmE2PNF+%iBY6=L9CvwC$k44x)p9aLfK~96-P^t zLXyo|xFu%Bl`K@mdm*>x75b{>r25mRiG%5V`%YiRS1%C!z#^)UmgJ7d$fVDW@YOzX zdKN`5wcQBa@k(m~djY5b@LNtd>2&5&DoCTUqtFW*!V?KBR>05jZuC1y@%U0aZM2d_ z)}({DW2RVFU0mpN**lqWT0~)|4xmb)VLg|mn5uV~GEb8YwnYH&S789au6tg?Y71bq zDk2H6v@qBmOmweiuz1K#M$S%6C*#LNzmL|T8z!xhdBxf{lPWV+M z@|hynd#r;i$}1W`cF66ZUdpXNXoY+@%9EnDDGTDW+eC;fSJTw*PwM4o{J(!$_c`y( z#6XWw4Ypzdtm%*{8GO-;&1I%c*5W>yp) z0!bv}FU}=wErL;JMcI9>uUN0UIlZreJ<-=m6!`*C z)eHB*J>bd^GGYI73KtM_E}OlG_%j(rM*`37w+n8>_-$O}a|1fQFg@$eFUN0H00ZN% z9JR2{M}L2BNfh6?RLl{Mrh*z`Od=;yWNF$ldz5Gja2CyKsg<}L@{%t!wr^s=+}rWh z>JqQ9_~GaZYfI`M`!4Uh0BawQf@hG3kTP1aC6Df)N2=lnRfHIg2 z5U<*+KTD6&{xyq_GX<~k({=^U1oFg6rUBgx-*t%Tykm<_l_gGsf7G8cKZGTjth#pI z|3qB5IT%f{O_o9W>rL1Br`Z?}P;gX+Q0$)7Gkr9$LAH+)+Z@B{v=K;4hd$^HZM zqc-eGG~U`{Gsu;Ft4Icyl+Hs4&68oD>$U8TX_z7uiGw!Scf0iP^WiMiGuuRh<&lk@y^ron4gML-{>H^vDVx`_7t0ZWgaGld>os7Pa_oy)K3!uawSZoWW+o$$X8 zm&Nrlj5(8Ct`Z>tb}oo8U9ukn>6CijLiMPk{s~{+f`@s!FKx)bVU+ngM>7J38qeVzqiCAF9@QLbI0oEE~5_N$3TR`&Vvm> zdQojR5a9_z;GQ~g>{J$b4S5@{{yXMjtkwS8z%*UQZrGWSjL}vQ+z}epQuQBK=2pz> z)}0u^-GGN6!t2jS`(@|`wG_`!tm#6{qv7KZ5SgW9i5z2(*YxnalGqKz?OWTdDLj&E z%jU=@+u!d>(ZrzduH|06_2YUmI&s2AbM7AZr3yN;M(TL5lJaGZ0&;>@P{abl)=03? z^eH4aWUy))AsTO9N9gcm2+T&eFeB#Eu+8C06bkzJSBmn+p_-Ku8dl9`x-IwzV1K*r zVe=LY>(fMl^MX5f>xo(A`{vAzH2TBh52ZW1-&~}0*C@!qcQ|q)4!g_l?HNU)A9_vo zVP%ZnuLMmOw8iDKBlrnn8dmp(sB)&@DVNTO=KJ%Xu9vQX8`Icm!nhK9en=(gbS9fb z%{p+U5mc*&2!)kWzDYqZIn$2{ZGG<`ws`Iz;C-aQH5ny^WY-vgZO)BT`7DhvD!qw} z48M+Q-alzAE+grtP|xn@xk&1s(W}nq2IM&FPNHV5fEOil}=gXFHpc#+oADC;On}`)xRO=E?xQxWZb56V@1M z*q|c*9*Z{z`%Q-$uUf*Nq+UueY12@}7`oUlJje$sgz6T-_O*p>@(nKkv9$Nqz6BnY zCpktqd|NoOFvm5Fj$2kB_`&38XCt=8YBeInw-)%hk^a8_UfFt*3dd6pSJj`6Tldk9 z+Qjv)GiF6v>ZqLAsu6gw;@341w-bjI!{1N&dMF`pq07Zx1ZQ>jjn3izw19|jDQC0u1N{$ZJ~{az55x$9C?MSRQ_cQ%GH zk-l`MJZXy=8d^3<6P6XSupisk9l?2RHh4cI>}_@P7|>_M?lR==sza|4{XyxLKZ~XUX$$3Q&d{Pe4|sk z%&(ic-n;D}Y$!^bt)PdR*IGrL+eUv|NsOQ92-vjx(MW`oAd8(VM);yV$?mj5g^KrD zW=3o3OOB%x2sp}eo$xaJZRokF#j}j~U;oL49|VFNcRkhueMiu5(%+oCsxD8{{Jqn{QscW{2w}`psSM2 zlAPg{GnU>m#-TDyUHa3xzAyfwuT1w=TTvXaD!%?4fWKa(twR2f-i3`#&hdd+pXA%A z2u$QCv~ML9^L9j4PB02N;$VfkvMdE>^{Les7XGW4fwYUjlU^&)*{9QrTl~S_TL=Oq zb-f3DIluO;LvHonN^GU-4YeH3e=WrMcXV)xtgo`ptvhKy@<*iS22RQ}bAExZ`^lA3 z>H0DukrcFSw?7D@@|emsipx(AdqQs}=tjAYG=_~Ir|-Gdke67{sa)(#@3u*@dC$M% zUgt5EYaH9(Kd?Q!Y|c&~p{8R1-P_;}mHEpzKQNFYe3Ot#-*WVS`eu zjDW_cJs;OG$98iOX@ zAm^5EN@6`SONl5J;>?lA5hLFr7T45uQ{czG}&T=TH}M8~#>q=|GG| z7=F}y0-Q5mb_1N|h@8jtW)(UKd~!jcs(l-+E`ELpEMG({G43q+&n{@?h`zbnuZKc5 zwZw(={VEm_PJf_j`OjvHd3+ap=Js3U!$U)4PG~W)d(z}Nx@>(CND$+;ZgU;0{e^|# zw-Gp+opB{g&c@pQpgnS{q`ThR3`aL*y7PxnxX+-INeA| zGoL}m1(w1>i9&+l!WT<*!j;}pBzgq{OZ9l$tDj+k>N{vEumH&ciy%CAJsp32w1{=! z{ZD{_+biXHOAsb}BIfn4p22vP55N$CvbF^bB4Jg9RBca{O+$POj@8~2_%~=%K;Ol{DB%miC|j&1xk{Zt>Cb z&82vb0&bY!$5>rVTi<;a2AUfYy=0*v(CZ-UDA=0E)UVdX`40_~MqscAG{POtWHKOK z+;#l;bHT$AE}w7f)Zru|TCMSQqCm{<)?6J=!)-nTK7r+2vwmus{M$$`*1Yw* z8(HlCY`GVx@Y5vh_50dpHP{!*LJq{I=yiYmvQ$FseydNurgrj$dgVd#an$!2hu>3z zm5acy8QtA88b5IGh5xy;*4OV+{}I#u;H5d(R}O81;zbwEYvkFh>v?-p`IPtSWMlVDl>`rvz4dyB08 zFmp})uU&XLu{qhFM2}ef5TQ@hI|U`Za2ph9L{AzFZaWu6YuWg;na;`$kpa3g2lbO6 z{v@YY;BQ80ArL?MY3|U7Y#EUjW%Q^;{yu-K5g3wMVRWT{S0hg^MapGY#Jox*e#PP- zV;)X7`eE#2^BGS(m%7A3GhBq+@0dni3H*Zr@W1-Lg|^qxf3^O-n}hRb>VFXc_V_8$ z{{t}azwJR&GECcz`R13v!W1V)jFqh=Jl2HNy5HMrNalO(GZDH4xX4u=d?_$P9}rcsO{0?^}gnQo%X zuR&nLsQ>e!ws!IPF*Qvq2g2elj7_vFK59|Ldk$mV)IaXLnG>Pls`0YkxuF@#b?C5d zj}ks&eL0@1xP9?0&$!ti8}O&LsM&-{blm(i zI^>~l8-2ybfWI7m=4jXBog(^VS$?a1AY`@1no$^A z-bzkDD(h4RqnQvEQLb+M@wJTHJx-;JNLOZqSP=#4-y>u*5f!ao)ZY_wse|srNd+kI zV!UQ+#Z8~tXWevOxHD5EE`A4TJYLtDLpvl<}z37Xgq`mowB9kF`ZGy;91&@CxlpDr4OtS@* zjn0}rLBA=AJVI@G(mGJESugC!kDDzX*l_+WRj9%9u zU?(iRcXg9>@nzaOy`>=!Q4^d2b9DY-=<|)F18^+-1VN4$BOQ^@sgc=_M*||8HbfU z>7I))AsYgcxv#(MRO}u?Z-N|*gl6mo&0ikm4G z#5aJG-&j85=)L5$DGeme=(~ydn^(0&f70lXuDLxbRY_|;CRAHJuy->A?78w8_%5_m zp)*D4K3Ta_3XyrG>{@O1N?*0EeG_wP%N(xth?7g5rN_`JrD9NRArqf7?kV036wNt7=z&6b zs~|ZfA2S~nS&Ca|-1u#*mg#}ys76P@^h)N-XDz9S3gY)HqIEaFjCXjky3QV(^k(ZV z;tm_tcEWyroP1Mj8~jAf)8Sjx>lD7prT-#h4b>jBP8YdJ0_6w?uB5@-lZ%O=f9?OT_(n45;Lw0#&M z47<-@dG3NMX%QQ;hF2>|-wTo}l?s@ATH_CJ!RjJ3wuyEsEg>N-48Td@@V*l4^L)5O z{ztKt|K)giB_QG3j5b;HC7}WhNd73mF=aN|5zF-N~T=R(FKle$-*ViVX3d zr`6i^Ga=_H&;fsjFO-x(-HGO~v&cHZ=m%xe{KY&sAro9cx0%9S_QYD9EV9J!{9M>~ zd{kni1sjd-l3Od^Zo$mNQtAh(9PeY6xkITLfYFZZRqFUJ$ZkV7C-14NzF;pF5MyKa zH*e!CW@7h0F#?rhhP0V0$fTtTq$?eL9YgO2oSRb!dUb@~ z3UYx)i^A0P_qVD_VmO{opFfinYadsB&mT?pX)yCWQWxiEr>U%_LFDrAJ*cBEy{rsh z^v1@4&i@(;lRB>SqdO)i9+=@7!3-^;dKVfNvP6QLo)z}8Q9K2UuhU{$U=z*(Z7E6w zU0Y4u`Z3Tuyd{OVNFBbK%2PkQcj z?|{IClkYOi9IJ&n$X(Ox387xr5u>mrIz8)`s?aMj`h*nKWAeMd$>u;&0_o%7u|>J6 zvCm^HOv(zq~L%DWV3LRQHVneqFX#E4L^G$7R*mp<<^^IDN%cdTV^1i)N z5x?U3oeKmiC1JH5ux*x@7MDTftmY*ncbn84Slmo|)z!p|{1u16}>! zBfO~?MizlUH)i*PORHQp2Zaa5cb|j5ASpqm=K4GrS=CBLSeQmrBX_Mn^n;@5OKXQ( z64HOa|Dzo@W^PtQFth)D^RERdqxxb@O(m8ZHs^V;doJl_vXL)a6+5Zq^)tp_F8Lcl zDe-6anQR!t-mWyiJdEc%-7(e%O(0~=!~du=kLQ0Vm7jWIt6Vu0B;*Q>omLTg4U>+( ztP+|fTg_8C6p$0wSNEL9r%%R1_Y0q99G`~!+H7U-C&I-|SEj^aaZz;_&1`G@tk@vT zlF+a_4bXfxPnUTyiFew~8ZC|vsb|iIT)KZLtUn;hJ|Rckr=m(;_gEI`5*IrYj)gqGzt;q^+0U7^lru#1 zW#atM-|}y?%(<}r7S)&mQ22<<>cbGZ_Z&Gp>q+-jDi2=7|B#PoO6m1>J#-e=$wNk; zsl!PCO%`tKMD)lLTbY(i#qRg_d1BC(!PB*jHXu`sKt_KQ&TUd^^#*7U;#gfI{&f4j zL1AZV8t6^?a8TP)aMnZ+bh(2!VeJiAxcEhqApj1jhWWLVoT!*+`GRcJ%&!c*zPeNb z?8#n>>2F_GRj=sJz|*BRqX=uSy4T_^=)BIov)jbyd6aaf1B{i5`u2zvEEU6{3P{42 zS0{p}`H%B|era2d;DhuIohx78P&!&X-AsRId<-EiJ@smPLuR(D)$_zYO`%Nf4Kj0UYOe$@um z8p*(JiGLavJU2jLz4g23x)RF4GN+Po9d>D%ro|+d(2n?i4=1Vwd7=$s8Wm&?ATo|E zbP)JQVdublyztUl6Xrq@s)b(a=dZr44vXxKy4zv$+qG{#RYgyd4Xo|O#0Pxjv>;Rc zIbcC{Xq^(Pc9up^!N9HMr^)gj>Fu&5Yii<8&~zkVk0u&*6G1nT~e{6b=P{~ zVY|dm{f5LXSNeQ98MFHh5nWv5OmA9cn=LY``lb{_``h?$stZGSgi&q^HgGFR{Hc?y zU8XG=GOEEPm3Lo6|8S2*(dD4$F13LewI*n%srM)vgT?#7Z)17jAQ+5~>{K!vV+KAW z5C64$&W*mFEu`{?7;jDVHlM6u@I&S3i9BWE4W+$_=9?Mbm4>oRK!)|J%32(hW6r}| zHxC0A!ipAri&$4gtbMk{903xLy*gatk?|wD_u|1*jq0pvvi{3V9l2F`fzuqRANQN1 zVED7yQ=I9KE_BeteO18`7nNkhfp!3VQm;FE5=U(jUja7uG&N zrmrnF->jg|S1TzmM8~by4Mfej%|O*q)gbYlT*z#z(+yNC$!I7>pTS@l!Y}@6H7#-w zfg4pz61Dm}^TJ?$J)xlLBhA>xtNNizHW^>`u<__Dlr*Ncy{qigM_wchp@IfYIJ$Dz zs<*wctsLYj!xEhjan0hZf5jApu9S?tvc6F6Gwj*&ngknUiOH%BH8!bqK zG=Ldj{iWb$_ZWx1ynSW-Of8t~b9ET16+@5carum~TV!>U0>cCO*D4fY|^h_pnwkXHRkG0qKa%_Wd3n2{xRSJR3_ z_s0}<^+p2NKZCE|SJY%I&|_$qAd@8SGA)!JRDe-@e!(+GP(cR5`+OLhdb5Z;XkRtY zQy#g_kq>1}psK2^g{2S?w8^OmaKmq72WHJjT^$q!RjFFY+)%tj3_ zgDqSImphF0BsEnJJMNp->zh9NRx$SO1laBJvab@Cuk?uu^TMA#@zU54C{~*)@Q%GX zy$C;wKV0!v<&Ft{Bp7*G?A!TalpS(34L?OLe049aSW%DVZVgD3|JvtU_HN2B`1&(^ zbR!~B;mX$J+^~Xywd&~mVufkc zFiZkvxlK`Q@lFh{VAMwyaZ3!SyrJJf0BSK=p@&i0V73zC&}WkTpA1k~It9PVtI<)T zjkBJ#14FRO5PpfyPG*G(yG1Y(tE&azR}t_<@m0Hewmm+uRce{L(|rhcAt+xhKR;R@ z8340RU)qcz#`Eka37YfiNCU$08Asf#&z~vSS$@Yn4?Q~nIZGp4!A~D6BX9K7eu}#b zAK^o&rdhVuAr`q6Gq{o%dHlI5wf>E}PGT5;?jxRxuhp%DNokl8VtL7?7-lYqUnV9z z5xl~)714S&b_8i3Wlbo*_>A$B@kEX;<{(`>T%%Pm{+C(CP0`mu2SNA*bjSEV3&S@R zm=Y9HD-8v$6(>DBtASv-G3!6^td8iMo<%rL9v-@kBqi}X__X)<>eDXVCIoey%J9l}t9__Hk~GI}9KEZ3 z$H*C6G%RhsDRHy8=gWooRLO}GtO8K&(x1Z8&y@j`Y#J~x8j)EVjfmtLYG-TtXIhz& z@gty6giw0CN8kL6-E4=H)OBuLtUdUn;_8mo$PM{>%eeW<>ucz{l;Feu%a5btB&I5b z;S_Yk#QACfRaJ^p_af*b((G!IqNSsM4gT(9waqmtQdM26p$kb=fg$6o z_dLM#gbdfabq0A#hsu`8C+dw^rn4J&e_cIy*a_ZbwDM@SB=-(t{7k*}>8zY=l45%B zl|l=51g?3k?8`U53uM4FeWA#qG4txES+HYSh$aF64X>0srszidJo{aPJngWy{({P0 zs@Bs?bmVl&xWqvXxoa|6u6E!(0>XflPXD80y8W?p`*Ms};WOafX0St-U6oLSqV7Z0 zIP7Uw#Jpc;VzJeJZlYL8GcmRBXu}Rs&7}yIjr2X2IsRYTh5vjDi)JcbeCkH*0SPuWCE@ zt|bX~GE0<$W&J(ijPYVxQb5maCw|suRK^=8`-r7IY#xMwLaFr2P9N^b17?axFDEIT zQsJR)I^eS}-1KORbANt%~7*(jc5)*y+Jo`y`d&@vcj0JIUQ5o`K;;yxoiw#wzs6JLU zRM;hZZfWcoeRYLJ*e>BSo!gwD{`2|MQqP7#CELR1BEEU|(wkY?8HiyC0r|o?MG;$ZoWfCaLBi$<%x!#^BEs> zM1*N%d=1zA9q@w$-1!&FpF8xdXvGgYuNcE)>$zZV9^tImX5*{hr;Y2EbcY{T4i5D% zA=dTJHS-3wstQfI`e)=h-0N zzE%x4cN&|v`{Sk*Qc}qX0ujgMx@kTv|^YX7F+8jUnYeXA8@27|Rw28AEd8M4CGIh9t zkarGnPmf!=nJ-J2KMd$^BL(k68hCqc$?$sIr4m#};H z)x8l@sN0VX*+LR|-Io=9HO=#3lmPqo9jg9f&q0l|%&dMb^sI?o{IrCw3E69$B&_}H zssn?w{{7x-1@90&wCww+H&H%%S9%HrzQW#!B;LWzzXVSMFSn&1^-Bi8#5aRS5$_-$ z{5BSC=Z;Xd=w6k)DU##{~D53 z4Rn}_wDrY`Vd1@lsc{97&Nx7cBYR zos4LoJ-uhor!nMgi}#Z?;&>%Cnt*oOn*Y7BJ!TZ3EZX=?6M#8Mx5BeId+;vCuD z9W{qBPcqFBzo3->Q;@zrObHIu;QCtO)Drl{dNBs&aT?y9y6GZb!C-h3y!Cd#_ao|T zBx?#xJx1#BpOqM!O>8$9W&Lw-KO)Ysv1Le*UDnI$QY$^Zi$;h1G*a@`G`){Z{jRoO{-~5WXLg%lH&da!!Cxw;3@;NeiD&7%C>)ae<~uTd(B^nj$#)}d)wc<)n&hu zR)JU0za_PGP4orh{&=?QknWyo;c7B3v?iE+1H#|5d*HiRn$ocaeJg-md%-gq62d*= zLXSE+tQcW8eZ1I8InBVcPig0(6EhRJ=+;_@d!2n;1($Q-2>CtW6u9aF( zavWAV^npez;9QLKDKCi4hp?QEUZ>ZHNceO$E4Ue!{-Foe5`H|LXM65ecpBY(BC8V) zJzIa(l#n-Gdox=)v|4~1i$bv{wm{Hxn`ivS_abPf4YG*$cVM{x!P(p&IRBF}@c*V% zr$nFf12Yin@OHa|(VRJaPYC(GtgKo6fQx@=_kv_0Sc~oZlM}2WXK`I9*|y#k>WDQ% z*i&n8#Iyd)+fdT{tC-v4^qQ_|=G~7T7Uj4=BJYXqGL9Z~vV_$O(mPwC6BzI1MkNw5 z=nb{r8T^}#uKmQ6iC>2 z?qmfgY9+FZFzM)%q6!@>#sZ`Myw-1&_zRRtYU^{{nZrewLvekHCFWKm|AGm9B9PT{ z!=)kl`E0}b(&jgq-hcN=n8ugWFIf8O1{70ICV4A@b-wt&s`TbC;*h&PdvumY)_XSC zya%mcA8W*J*3;D-@f`uqZ1=38I|=_!Iy>LEkLRE5K-=dO-0K9Iire?W{#%2tysLWG z;1wNm#ROd16_TD%!p8M!GW*t#p+~U7nnPi)(Hw$S%ZAjhj8*Wp{|V@(XtPh4bM9`{Z%^`YB$;LIKq3vZmJjtN54{sV))62kcoyerT4$FWDc$)tOH2GA* zDp`tQN9$Y14v0P0%VNd59!NgWWd{9p5tegV)A6+1VPsksWGKiQ5u~oRV9;7as-Nw5 zd$?>bWE{MF0&)`*fD<`~Roduc%%#_KJ~@&G@&Rgl*H>{x2LSeNq|4W=62b?P_AShp zi*QVv)%Vk^Uy)P(Uek3kwj1U|2-1?hmFwIM)aX_M-<>sdZPFIhYCU%nZ0Md2!@BJQ zz=7FdY-c`$+QoHVte!pf!3|T}{ie2MYNRJQURZSbx6&wEKn=pDCvjm)o5CWWWy5*Y zD$%Oa`c}d|9RXt*-OhsOywY|~{|lGhgVkjgIr7tK^adz{a2Yla(j&f$hDkRh!8>n?x?N+rOzoo)o_Gi_69qTFZAN(T zfDZZUrV0;#%{vY6J{>E%9~*Mez!A;Lwb@#RL^_f-Uz@EC&FsGXgQ{U{i*R^ku|$m9S$`SO0fUv?4$cnL=#IJf$Z3ycz5M>!S#sQ)Frob;eg%vnOi*FR zgvqpKg}ORwSt-R1QMgo)k;lTwLQK-u%6Z7Wjts2Er{xH@#7Trb8U#A&lS-g36&{fi z2jy@xPzBp;G_o=Pfq&Ie=j;9}`5nVkovY9V7^jF&xTK>J^WxfnPy*#p;|dnmtqe%X zg0}K3Lyy$nUulYiK)>Y|x}bSW6F#VH=gzmL8+y$?aUWjK>)<>tm@!7-lMm}9de4b2mFJa<+>)bVl^iE8DdJR9dGPFiz0%7Ce zY_O|2X((l)>+;0r$sOB4@Dz8pqRVL6Ey(1+JZ9-HDR~>SG`cfqw&ECiEcNL#Q0c$Q zcW#hSg*3J4Gp~yd{_Nd+_W%UOJ~W+<7}8&X1UYGP@z1MbAYj3kf5{E2@#$^^nqXeo z=>}Phm+^+O%K4+^Z%D+4*T+@T)T+4kTtITJcgkFvb0fYEGmJ00#QTeat1W8ho{|!2 zwbE;`pM6BkO*c%WBw930A6)|vjCEt@-F&i6$bKwkC&`fMM_^;e%)99r@pHeA+YbDR zgHv8_@($dh{9hzeg0soaK&1<-WU}rtE@1_>U?iaVO!6}0C*EaCR#6$VYscn3)E*>A z5)&^J!6*$`<^CP^`66CLYLe#st=grL5JuE{f|ejq zqjoE+F^W~IX!e#Ro-2{o_jFhtN^XGFQ!z%Z(>vMMs~yf2Ubg&*&3tM=Gdb*q48Bie zj=p71s?59Al(G?I*i~Y}$1dRjD!;Gv`42J4-S$+8-H%PO=smnF<7P01A(NxO7aLjf zPySk~WVFLW6+CQn+5A&`Fc;*iDm_NO(8 z+q%JG$>g9jHkQvkzlZH+7Z?>Vkg(=VF$c8$hR8LrKI&l3a_|3fs zPh%OL#;E(LqM(K$H=EwgJ|7PFRjXRRRavSyH!78A$y_JEWbH)AN&0G=$VnMYOj!&s zkiXC1VKASD^uP024R2$sOpkl=2_eky}O3WG*h9v>obF>Px!rF^OXW<$D03ZUQ@ow zBy1&@hCUq@jwT=_{#|VpI45AcFJ(YSF4mOVlkHYazuFp~5{vv_v0wML#>d$DZ}QXl zsr=&3jf%msM$?%pEO8H}1c)L|7rOL&DU>KEin`ndnpb}dixDjz^dG;Q-LX>m=&W)W zT9%~|fAr@nZ|DCmQ9`R0#Kg|(2*)vL6y38i??xx>TkryAoV5|-uY+7`H8U6=Ei~)C zgQ~xw+LXI-9?csDE0q`t3Dy?Q++V}Q+CsWzUbx=s?qh3AIQ?qWVyRGob+F5Muo{s z&9`$KpE78#o{QX%bA&$?H*`Zt{RcM+bDb-Z>DOq}Hk#2l z=zzj5&&u^svr=A?*L2$JF9-bs$aYTwIV69YwfcP*Fb^5>b+$TgVi0GSyMGG)5H|3$ ztXz;IkDdR@_d$je{`bC~qins(X~uWTz(G4&_1fwFL%&>D6;@9~ zuDUXNqOmW?e=iNk+bfH8G8{a%`w6)yfi*_RBe`4?JO=rUL{-OpUlVY05vfs#FzPmV z=1sU4hP9;oWnYPfL(6Jjkexm3zqtUdX@-l}`$V^INqLXkZYna%yk?yVGYgS`nHcb7 za-YrWEg)U;##7Q_0mL_7pWX85GG`#OtshpNG0{~|$?|k~cAVe*&RHMi9cz|`Ij39U zJ40g0rF82vbk4ypF|3M}WN!$Dc39i>4lU4e+rQ4EU7cJ>*BY|bf3TQ~vh!oP5*sxY z2#KcuptIIn!6gEf;lRpttVta(E$wZDxV+QEmc;{K+Jr~nrI*!W zcn#8P2{7+ScT2Ek*{{^CvK5(Us}RUmo_kb6hwS{(<4FPd0}k=tBb@ZS`z5%p_U?7W z4Q_L#QQM0Cmj+^?sIdw0CUvgQdm?Xsp9fTFSE7GWU%e*cn~<3zJ-url_yT3ndvtO- zf9~oZIZcy@ggsA|KvK8~V^ho5)omi}P}bS*`H-evTC9HHO}zVy@~A18X0%3_V{ya-4Cwe|%5A(-2+fz>JPHH!V80-72plBLe)t^Ary`}{_H1x3=55#s6PbyI`Om&0uBmR?vDYmclACol zI_mz`Y8XfPN1BB5y0W@`vLl?h2E81^ptXvRU*&j4sO@E(#xDjw!YlHmos0a4ZQ=*p ztg1*m38bMP)0wVcG+;Lu_Lx+!qDQI-FN?eiAunu8PL;g#pRE%mpAO^I&w2++d-2yQ&C6(foTATlvbmd6{ zdou36@?K`}_6K==4%t|&>`Ph8$yt`XqvxS{_kS_>mQi&z-e_hv4oG!5xCT zySuv+++BjZUfkgZcXxMpmpi;~e*f-SvwFI}%<7(6d^+rNZq=!Mc2zykQ?)&nSxM)) z9LV}i4)4zFm(Z??Iv|XUomzXKs)+C0GwTLs?X}o+&YQ}>+b?|YIyLr2rGm9sB>dGXw+PsZ8 znTDM9f3n-)&6Q_@UwE6qG)O5@WTXl72f;I4RD9>+#a!@%WZX(U`fXnuQ6Ygn>b5L> zl_0{A(CuW3Jr|K{)XYp>1U-4&3r}8TjH$6HlLWYvE1D?LAVvDCF1)TDukOaonagT>Kp$j-z%_^{1;}Vy6sy zkrso-kap2D2{}_|=w8fV;y2P#NW@H)WIT-y>UpSd)$whmW(gM^-%hcEh~Oml&ZZa88n7A@Zl{wa zv0uTInzX>2aC@|t;dc*qf|0UGaQI~L;X-i}xl-^z23gPYDyZ-*9pV!tMZO!J#A89u zpW!Ft7?SD3_P)^@O-EfDqP25!JI4T|@4Gh?l4~7lO43W5o0BK>0p0QN7-Y(hZf|{@ zyDAI6Kh}`K^t)CVQ*<~VbL=ry=LKQFD5 z27uW0L@x7)w0PMp8hcOdYIf7~0lR|F`b@azM*Q<+OccnzgYNY^$ER_)t`k7T4TRU5 z*j=LZMattJ#&tIf))-s3(>Dc5*$)&LP_ zR`t3E=ELjQm{y#Z4ibzXyX1x5PAY=ZhHGZjQ(ry3ciNuf1jt9k!}DRywdH=HL#;3#)A!($-_$p!QF4D)VdO=-UH8r0UwbbEhx z@yeWJ>-qNuWs<{&Pxuc>HOY6?F9dAx4CH+kFj;f6Sk9-%0JNH;T3Tl7IV>}N=6^=) zi&-kwab{k#w_nl3QGcIBDOzm{i+^&N7Im)va@`LncRd-8^!WY^Dg8d}&R1iTPX@Ro zD9`oXq;tsrIH4ty`@A{uq^d3YY^5m&6-z8%-oe4a?d7b={iL!fmBW4;lIm!akMo(J zUY9d4g{+>AfI63p6Eh4HEBXyTiwST+ysOuQW36%LwA< z9&F+t&wb>s+3z7)z1fzu!GpZiEQ9MBiL>n(m0Wn?Y0;xSYnmu<)FsJzea9M5D6Tt% zj!5-z?-I=75Z-f@e6)=T-I0+A;XVY-4L)}o^~~KgT%?6($i?3 zvr}L|??TrgXDWW$J3G$W?3DoDp>44V`W{YLF4q)?hX}M1HD63`!N>89?Tu#t$~!SL z?zsMDY&f?=TiZS^SiYww$?THlu^#>(Oy<(54Svw?{Ss7@oz>|LG1do!rI9TrR5J?x z^5i$TC6VLr15_Ul#uUlyS=3zaPb@|TM?l+mlGYPRnP#-E6T}Y@XL?gJTJ;@WZn>T~ zA+a0|#;NZ;y7RDaUq`Hl9Pq^%j%iQ}mGB#A#n%@q?cwDY7=jeD_)v93HMgfVJ%9IY zK$MksTP8Ft2E#*!PPp!)-#D75`>Up-`)k&DP?z3QB^}1wtD2WUEbYVi{#FxL=n_!A zvC8)s;{)yfzGA>&etYK$m~Iw#%#exREY|9}ZR~qL;{7X8_U@occ#g$Eb{%RbqXje) z{q1&Emmef`j-h3rL-xxwvC7&bR}6?pCs3@Z?l9V*vArf_PYQ#x zflH6{65~REPSAeI0N2Txv9ysnvij7=(^O5{cnmyHvlC;~EW_8UI{4K1u3Bx7vpBNf zb$9)^()|l*F_k}smESiyl)%GJLW9> z!+n&wYt-BGz`2M`?Yi^MQq_cCa3xMN@vz~Z!#G}gdokk!N>j*wF@oavs7hWwz$bR} z#kSN%>>2Qxe}AN{ct}ya0pwiI4D83ZcLb5UHUWPLy}s7w%sefelrCMf@T>Dg2ZGk8 z6Atu@Uw7fh<37Ug_eSPyvk~FgGtY_&PxlY0$gHA^GG1``Yid!;kcGu>Mp)$UmqpkM z&7z+#`WnkO=KQQ%p*`hfO&k^ycRU)xwioh+UB4>UuLv!DLo(^E{hhf?N(Y6{;SLoq z>ezmS5Is(_^(&m#iaMijs@P|AJ|C@R$vv~f(@?xeOd0RM^gci&iqOo20**hZD!HHRl z4YyBQL&kXyBRhR%Sjs1rWoW#?wHbS@KGYET6OX;4i+hE;xvGNziAi&f;oSl z>4};8bK&M~%N5~!3n9k`2<|)LcE9dJf|6cQ2XXW{=eL;N&_C_b>u!4bwnofZ`U>F0 zj(*$#!ov4DmB{uof!lZifbshrM}6w*mNJl(ks(F?5}TAXN6v7Lha7{)oxGsq8FjTY zpnJHDcuMU%mM@3Fd~%(C>SOZt;b2X`XA7wm{*`ThUdZ-(J{QK#!LTF$yKdmY{RyWU zNM#}>f`mQ&1a!?tM*tZc&iul)yx|)I;$XB}J}Htpk?SSb1d-LS?N9!^My&GlfwiR92$l`8~ zJtHrSwIf(E#X8`1Hn6@5MJL^R+g`oryhCOWUFqD8*zPq}N9~XK@_)${T{rKDHgEbP zbXv>Yd}dk7>yD_=e?L?854k5{XFAnj(960I!3xtI`7&)L(6()RkNLKb^oDEgl9E+`U7p{ zX+p2q2?(c#lAav8+8HW{Id3pi`j(%-{Rl7e(B`0o(G`Hy8<&K`Pe^K zYbe+DL|3FrLv)F_%7ectY13(a{Y6wF#^l_ zRjt<6)@O)6IRpAL9i*CBZWvsK4|UOUZe3dkJa-9&L85PwNve4HXOEsdZ7eyJYdD!4 z7e;^&tr45wIgW?eC=F7a9rq4Q4Xjp|FqGaIkXUjDBt}ucKi6I>WK% z)!+B+*HrSYj&84L!ZWGaixBxx6{YlQO-hGv>L|2l*XXY8$Hw^c%F`zqa+Whv!()SK z*;C`4_E5JYtRGw(kM^t)I|DOIx2PbmRhgmL9*=|sY+f#WFjwxW{;P2#>3n}AB((PF z=q#0ce7q>{`=RxHLt6+AhVijoqeFO~A17bg9rlJu44iVb$r4tn-D3JSvv4Eor=IVD zqgDJZ=Z^$>lA5p7Hzh37qDpr|k?#r{hNlo5g*Ih_VNUUE?;{;-G9lgog163mU7hO z9J%~h-goPiipD^cNG-A*DbDL|cmwaQB)0Dh0##}4VY^pZ(j2cCQ5W@BE2HLGuES*J zuM!sAxpJOKCl5p#T=b@+#-+$lwtSod?E~MIeKtgojm^Io7sa`3BcGjh?}262`%Ys_ z7#uQ%e+)jE(agSb_Ns|?memI@#QJ$A%oyFAGa^z#V4x~d+?hItwM{ZhU0#3fI~LP6 zdjtjyE;VK0yT#A23RINKPChxfyzl1J)@!^Br!vxbAm7EO>)gkD@UwQ1oaIu@P7|0`Iz)Zb0GBvD zAXYLAX(wUL)#uW3ookt!if`N#^h_;C4#ubd(8U(-p^c%7eVWY@E5Gvuw}7?2dVbJ! zHFBQdTW)g3-`P+8!(m^E40nA<>ZRXqtw2dUyW6?(!OeU?fNV9@`PkchR<+suc#q{g z>|nt@%o=3JZ`}1BG>cQT{kpr*-pa1SPS6zs+7NS`nLX+Dz)L&20KD8S5?+sQyupIF z&q%29KOAB3=mQT*{Rb(8arqSVAEYo2qR0wq+?!SDv~erl1WFNO>E45?EZuJ0$&gs^ zhMM&e=}+LX&{y=TUkWw3k#z`=!UU8B#Ou7M?(}}3vl-ty8*ze;p6DVqz2&DKS(irX z-F}Io?ysw-xMM4fL#7Lxaw9p2L!M!JpZke=84y&H7fkc=c#;^B-KOxj z^9!D^x3f_78aotzpB>oqCvJi!+_gbh{IcB{PExOnkeLg-r{h~qj!sKz|HtndSz^9D zJLQcvrkk}%rUkxh(oSoi+jO@v#SEQm4@ybh*#G3r>~mbaTR@A+f#H%|mh%?KWCwVo z7ZexIJQMV&wW19y)}ClbBekkZpr`2iaJIReZ7+1a-(eCHh8Sh~wq@s4d-pbWfpkZ+ zc{7$A&xz>!uev5 zS}EPC3q71>I3?h-n!T~mmIaRSM5@2ZG5!@w^FoxV7xdSN1r+V}tbi-95sJ1hjEQYn zp7+m!ni%nzR3usnp5tUI-?BJ^Z?*eq)O-`??~TalDYvS3CeD{_Go??8Qc_>X9x=~B zoN1OwyaVgp7iZf zY8liULok>8S zJ+?#cw@cm9*Opmb^a;;2aj$0D<_(`z%x5&F%Mm&TFO*)FJ0gC&nmMF{fhvnKZD3Jt zb1x8N65sG?rjX^hQA*8YS8LjoAd=upgcwZtXz1 zE=lvCdUyUwsGwH1PnGNI#*YkBk0*)BhuzN?`LDAp+#+7{!HXkLc=ZiKYn4|LwQ zCZN|j?kxH6-_$QOuC5mT6Cnn*4X{G&mo=SPf1ci=s{5v1ryb-fnU<85g+JYdKJUX= zzweE%`;gEpt@a&UTi(^Ot0~sU$rZn(vagIanE1&?znLI$pJW@Z*xHzkDL&k$cf7zI z|IuOF$DHZBHBOf6m<*1KnEUY%WXIvp$k69c+s0ZegL!i^5<+fylH4gmZp zEy(}>g&6-A=%y(yx>(Kx$zHrva{-9FFTi>lzCGp{Ms&hh{x3c%JYHDy(rIJnKg<{Zn*t5026d(8jIEi>e5FkmTs1@UIlpFNlH3f|BXMk(BP}yerZd z^7C;`)D*Wy`hWsE2}#&w7`pcISBN%`J;&c6d2L!okupT2d|IAc%V4?ZEYR~?k`hE0 zPn|nWftK0@1$*){_%GacT~Udr3a=A%-$#-ItZVtRnS_CcaA{jLaq;m1edoj%TRz4d zVgr9`MT|M_o?%AqM)*a7&B|~GPUD0kGh0lZAtGM&9?h!C^hW!qYZuN1AXhEjg37iM8as>2j&8-C``Cf7R?IPA7m`CPjNMq->#Xoe#dNXiOz1JSnLoHDK{o3ABl zZ)`^-2eoaX-L|YP~Zv1HJwfHG)vcCA&p&R=--vnlcz1&0qIKphx=bg3PRWN6%H8)k| zpH1ay;+Uz`6aAdyxFf}-X@`$iTHYoXOk2Y)dKT6NN0a9GflI;V55oG;-^|1P9K!)} zOb4#)iXD6e1DxD{VSAL8$#FUg*}C|y!t8$Ds9HH8*3K)kQD&(U9~0~)-df#6J8rw* z=&Bm9l$7NB_l2MGwDpOJ2#1D-RZmK_<3)@HxZ0ac4X`tMBKwk9L}d33B^&h47Y3{) zS#wq=j>K8@kF!)c1hLR4ON#{9I8^_et1K@~@bMDim_AGzW+ql5ArI2#*(GG0JuK~v z$fzm!{~9S-n_u%>Z9^xsy2_m_;2L}r;B4Us)5w5nR};7j4|ZFoW#QlHkB6O#0SZ5l zq2pP{{7~@Xf4m$0NJ#KEM?hehOVs8s!w76R`QA7RhM#&~RnerFcbI?Up_bZ#S03$6 z7HQ%b>z1y(_+DIgVeL{0KkT%D%Vz50i6NW5WRoGAz^ypAGd&yf@jA_#|4XNXv&NQY!TmF7C4zgLHOU0GDRg^^RLvmB`k^xtR(N7|7V?N=S=!y?6 zv6Er~=`IyOZeFy7H`dxsMl~sWAG-CgtSq=3X+;KN5Soo}VhS`lT8@74eT9!3a463u zY268Y;f*3gItqR(5NZIs=!ofNT0W%~YC%P1lq8uzgkR^Rb3$9h5aKCs?M&pZ3?Sfmidt)(zjuY{li}U zyXYt_D{Gw;iKYMjbaSA4NF0{Qx(3>nhIa)i{=+?8Ll%IE$%cN0X-PeNCoeYq{=kor z^Iw#k^S*$+Co`**<6ycT&;+1gYaGkk7MA{ycTnTzEs{M3bnt{E@~bkTGBMTr_(Xd# zRB?Y&o$4iQK zLfPDw`r+#8e-cI=sbOsH^dY}MmaJG87aTEU9Hfe7iW#Xw_R+KDj)fGmnyt zF}f>D!;QFZ+m1IGAgq8seO7Nypaw*HQTU0D!^NScxK%h|EG~aA^O~`K>y4 zN^h3X(Q?O<$1h=QiU1?1G&H6`C!_czP08PFt}{Q`xmTxFXaO(yZF8R+_Rf&CPcG)L?$k)F1(0X35G(`l{~y z&J7{Ue5tizL7t;L^;sy%t$0`7{fn7x-t{}Sk!)BJ_szYa1tR=p-@@FFsUUb**DS5s z8kU5}LVvY3w~oa24@QWCX(%;zD3X+w*O|{K<7mFx8od)0ug(g5PBTVeS!%#v5~G!Q zs78G-RYiOaC8T=c-Fb7+Xe+3_@@J+pS+@7@F;vtjsNuM%*V4ToinoeE_U2#kZc^Y zNZw~@ocDLRe%pUqG4%b%P{xGh<-)c9`n7p}uxr@j@f9ybAD3;oC3&>a1y|`pwWPEa<3k(19$5`~u zG(;Z@PxMU)5$IvsV&6=1@47>>6!KK0w)Fg1v989pZi5aXOIPMQslQ0Did}xASs{AP ze5G-^XlvC;zd^BL2tQ*2#X+!UZJ1h@rC|GZYfhiT`i+!575*g4Sk#ci#b?+w4PgN3 zo1uAV$%oI?IOGl0j4xT$dtpemd3W-vT=X~qy^|&u*Y*D#8+tTub&{^AEupVC9k`x( zulVU>^$)BdZ2Vblm`9;tz(s?LJk#G%5~~087Q=yXbIY`I`OyHcc>}9#L)O!cHFGS{ zjgzW(XjveisbdA*%5hW@dm6$+2r#6!`j1`uP1N#4t83#1Maz)Y?m}P8gGZbECH==6 zpzYsR|4_IDs%5b8t=l~IXGFbLZYiF;=%vM3kF#2E!vi1f09!}OF8PJ?mr+gMI$P}~ zoKKf(_>)anWb^gf=PsY1c?yX!gK0GzwGN2~F(a2FwPPfm%cHqPhxS=R#}iXImSe&IXxvnp;N6V;U``^}BiaaYzl@3cRfH2!>W zK*NREv>hh)%|=7hOK*-mg9b<6U=Y?P+uzAjlG|%k1F7%MX?))4*wy6^0B1Db>e#@; ziO)L!!%8G6MFA`J`j}C7No#Ki#lU$v<~a2j-la;fZR^702rx8nOE2*z4SVVQoLLHH zQg`tX-_n-+1EPWrXN%Wa>D-JMoi*X@Cu_#Ris8V!4#xUpZGzE&XH!J7_KMi#iSg%h z=!;RcEK!#^)MhHA4JT%>dG{oib4p;AQ;0E+q$=}@YyD>S0njEqsgH9)YTh5r-`@iV zIw@cbYOGpG;bU@S77xBLGe^@Fm%B2mo>XbufiMwdsq;yeIo4>vIX}v-#CXw>Pmj;B zLoLC;e9hGa&8DRIL*R8@ehkwNUJq4rVW+q$k*n|er8V8$jA1ML=rBXMHMH)I?iI=7 zimq~?qZT6OX_gmpnM``qtt1-*#B?h0BmV0{y>zcwfVXExTl(U=WbCQ?x|(*8iQ=_I z?D9*9If1v@)f{B0ZWf;9&Jo>e0-@V?o?Vr=HJ{_^VIVuLkKVl2wP{h!+g!h!v&mN4 zPS{?W#eltYVsb1Q+&@d=xUH-?>a+^>J-~I5m&)gCg*42b=T;a@?F$iy} zP(|;R*MdkJUN$JnEx%6-a%jj6-NMg1SDznuC!P~d_m#4y81=03CT23kiKBz2rI}PR zrKjVJ$X8+SFI0BqX!Bng=}DjTt(d(ND=2%=%!wkuYCaEHOCPaG$9)kBg}#uG@_ zgl~U-*8v4;{aw2NIRMqsQ-lcBEQZ;8Jt!bzi#o2Mw;rbBoS}Sk0ylrN<~<{@rLRP& zP=KXK1m>cXh{g39crj3W3`DIH>*Tbg9K+YYa#_f4LC(>b6X8r{uIlDCgT%hTqgx#W z!nKgT-J;+6+?}^u3E%~{uOk7RYtrk-Z&sa-zZEoxI;$g3Uxp0;ZuCRIHlBpdZ#Wpw z_@4C*!6lqow5k1B`b&-bNGPvr3>iQO&HPF4 zWDTHjjUK+hpIH=y2dj`JiTC5N-Rh7-F`w`QH_Fw-vHM%1<yP`MGUBoUjGxGr1!jtT zE6|4>c=a-oF$#=be$PvvK5H80qo*&l+MVHVV!g~6*RzT4DTSw&53P1>fl+l zEGO!M`CGyDlgBB5=R>^tSEj3SUxhqJKaaHRX_LL*^OZ||AlEv$*(6C}!#Tv5dk@S1 z{>xU?;?@3W9g15c6Cb5YVv%Y2(#7rO(S}r}QJ)C{8V`DoWZ9hDTGhD=^6$Z{fmYXT zZ{K+u+(xxaR-+8;eXYo5D{w4(PweYVr0qe-_6@rHhCfCHm4>{h=|YE8iYi{Ex=i(%*?1 zBY2XL)xTVp?Dr3F~1 zIrtMy7a0a$PA#l=CTJpEr!OHvWNZbc4uC850=)S4Q?R-g+6@&_78Ly9H)mtw4JOx( zXf2P8tcAOJ@V%u|l8{Z0a0Yr8LlF*gxsr+4X158oAwTptx@H?bv1>Q0KpmboogY>W zxNmB@+6`FGq;*{C>paVV(Bs9&87N#7t_^7UEH1fd)%rDRw6cOPMBqkrO8YU9*rXL# z7jY$zxw*ELxP2#JMod;#-d;W<8Htl9Vh(M!KPl1q`jSNC zY0t)Dp(cSY~W*l)l5cU2wIDF4UReVV6R$n9MoJ7GE63MfiJaz#aMzF z9f@p!3(fdu31fV72CPrZjcT_lKAzDD`PBtoz3}P#lARokyq70N8d_#z{R@TeUNk@2 zNw0M^`Q%=&F=Wm5aL6+h&iUiy;eMsaBO5Eq8LUFB8{Smk9(p8nm9FU0o4zE5Y9^QB zvz~QtW|XZ6;uv+^VCJ?#e;J{B491oPT@Qe#`@)lnq3`&*%))_eu|{T)grPQISj0tq zBHyhg__#%V^m2F0b19m91w#9c$~rG5?+LGBWSo%N6AH4Ln^HYX$|xZvcp?<4i?5Q8 zs&N-Z>zvq8fh-L$EUvB~GgPrP;VY+&kfDH@f;SRsjIOM0#Gj43Gz`As89i=E&eZ!! zj@UsUxI}Z4xEks@r=qy9GSKeEMY1k1as4RwHY)*?z=>a0oS#o}|J0macY;HiswoX@ zd7hv{C!E~wXP(XE%W)j=Q6F_3j$yL7PKrG5x@Om;@Szz@4AtFA>3SxW8@1Xg^!3PU zgp>dI`7?;Gt9NSkVtB5!%W{_%r7lcYGU4(Ka;GjTK0PVKQL9RR z?F|DwzmFmZJ4axR0Y1NSYSAla#V*nnEBY5AkP*;bViVn^y#)Y@-sM>V`Ns7*Y_G8( zaa6wH16C-I`c*=~Nk!jfT!4I2`W#iRIFOq64PF@wrEBRt7Zy~P>t{`-k%cDn#@Gbk#_^$*N9&5dNT@@0oMk?o6#e)06WCa#{3t-OL??&)k_403 zVaoD}BY<+v;rYSOEUcSk52D}mGIH0s0E`T$ahA}Z_5=3}?{4-QZmf!QrV%-TVd1#E zZ6E6uzRz6EUJ&OZbLon{eqF_x=#n$HG-rCbMj5D!oi%h zL-y^vHw1wSH)C#cUMd_Ao9ZVYBasHakiCCx`5j+Jx#apm?P0bO5>JON$qbR$d>)B- z>Cp8mQEe0XC7hQ^+p)0p+>TFw&(*T11&)ozM7jEDN*r!gt@qyaT2GA89T5k6roCc? z^|aoH*deYiiWLo^;bUqheq(sPn8{~It5)SA?=&d0*NB?Q%iD)nY%}{c=La*4_}$OW ze0Wt$+7XkbS`L$+&83uV3j5al{^e`Uo}GU(#3jyNAYXP*C?cU_R$8kcHBg&_EkQ$~7B0zUff zan!TuS4+jJn$%kl!&t^DOZBzI zm0A%0YRqqI;=4>p8xJB%PqQOEQdQfGWgJm_8o1WmaEWRPlZzfPyK;5NF;^1@B1xTt zTK&E=NB?qRS(NzhzosBOl!;90*iqrxkS30vmrHi6vKQON7xr|F65W-V8e_ZcGf%56 zwweDJA+k}LYv#^cyjus^H07&40}ZUa+_lX|vc!>7R^1Z`H?qpjpV!kn88uHi}i zQL`3ZyWCmfnQGr_;YhIMJ4OIGq5JUzMOse36w-Rn?Mmkm@P+K=ZSEoR&^gP&zV%gUZYQh02jpS_qv$365u|AMhKT_LqNQ zXp}fO0buc8GWGxHu9W`~0WgmZ-8Xe`Bi^!$N_X_u!V-+GNmli0aEvHCVaypiKPP-u zAXP(iIq=S>&=Z-6?odW-nk}Y^)|a4AvwFe*uy;mYvnU##{{g7qbW;Cq?h)zHX=7u2 zSLe5lyEV8xVZ=Gb4j(-CnT*ADPwvhuQ|*2@k|EjkG6$v^z_@+?SfWWAOqGTHO~qpT z=&N(09AJl|4e$@^|51vMXn-~7RAk*;r%HjUlkEqOIe_m9?+L9GJgFnUCuPf z<%8B3x%r?qh)78xM<6iQm3;yN5!BE5y`JZS7wOK}wO&6+_uXmuaGi^FijVz~!K0~0 zz<383%8$wYn$G-LIKf_(AXC3bsb$R1qn04h!a5!_yYrgoXAl?1kaPBo7HJVl!=y&| zTXtaxhIube0WCL@yNu;goNPrr+dK)gaBP-dN}68iTEH*?4|kRVw|j;u>CNZfoA}}S zp+zeoU@`gEqP9W{tva>4eq{j%1}%$11fbPA^Rb8`^KECi(aK7l4H^3OZPX3wNGHql zob%xu$Z4Fn3l*pm#0-$h8K*6VHy)9(W2w(OxSfS5r+5FUvM;*X!0?K+Sl`&P2DSoz z78XhOTl<3~`Y7Rx4KU$J5U8+vlQ@K*x{qAk2+V|5PsKL6k>jr@1d&F*T-fE_9nLy- z85jO|7KZ*Dj+Bcg?=(B&_s!ooAF~Gz(Fqsl&rgFdamCs{+q^GN@qXyr+kfs6C2yyv zuse$}Gd^`CcJ2;b#?wc?-Mwo4aLq_PqwRw+9hNncPf2tfmi5{S&|a6P;Xgp)U#8qp zg^Hgi6|e(ApXdV)8knGfvu1O-z@7WltLImO+Bf73DHK0)WQ)SI}$wD+>AAM4glAB@fA@a36dx zZExqw-CL7?M$~riqKqbJ%a&&qjPiV1^?bq7bLT|RI{@t;CHq_Hv*ah^*?=N)Z@XkU z+;0E*9U(I+cA#3Ew`DMajC0myb{Jt?Es#eSPZ#0$TPo~=BT@ZY^}>2v7XtJIQg>Y& zTCO%7OJ!;?yhKQ?LN?EY{~A8TM0)Lk8no7u#}PXuV>2Sd>|p~v`0r5LVoZOabr^if zrFA^vNjy60IH^3~j zR#j?ooim~QwU~W1cnJ>u%t46Jz-fYakMF7`J$aev60Q4F6 z3rbXRtjfTrlAj8G1+oM)i7HE56gl^Z-$_HNI>y5Opo&xOU_t+;qMH4>0~vKqCMyz0 z!0JarNAF_7?n1|=XGk_nyQ~DVST@QORT9`dt0dR>(*lNT7TgsN`zvAsk9GtK$})$Z)6g$}P?Ue* zWq`i?$|n-;KQ;3#LO@73%0iEf`T9OvQ86PBe|kxPl$UF;uL8r>f&atdJ%GvHiElcn zW>@IKvGZsqff?l%H(F?YHl|7}OVR&L{p+#dHPVUE;cw!~QCxMESbXsB>Z*fo%zvZ# z*G;rky>g2lt>913nfZm$L6iKjv}X#PaxtYp_5Fz0Q}GaU4+>xp;ou^pT&N?z5M6bm z?5`e;8&ZBp$M$f4_b`LgbKfFh$U9P7*meAqz(mzQ0H!TsGg(GBjV8(yIFjR;ed5N- zrbev%ht!1!+!rj#A5RdTXLkp?&-pDFG6M*UjwNu`D>!;QYfuaQjhVO| zGZJ@r9L)>AZf9&#RnoWCF$0}_k+s{>Hxo(BDsKoc@4Z+VdKb_HE`12=*I-5@!D(>b z4(T6qAJm{T0hOP5gF_(0W{*>q7BelyW+b)?LP7tYNShu=Q82Kp4&nm*VV~1JR zLFxYn{4k74;V(qVt*C!hbHY+vXxNm0Q#%nqvl#sRPbxQ&i2rmT%2!&bzQ49g^;qbC z{ab$O|DYk2_A%^#!g*d>n`deHkA>V1ertDa{P*AdY*jcnkQ~A-uusInAEyNV+v*ZC zT0RQ=h=~r z>cZi3+kTaartXDxty&tEpd19s7*rpm?njilwFNLwk$YMRqy;p6 zc>Ft{1}w#z%^}+(%Ho#4XCOER0AbzKFcs@iUbY@+$=+ks*j-nKF}8L!WX-V>s*(ap z7WgT|0=f}@lCQXZH}J}zP(hNQalVO&i!H2?3#aqWni(GHR?nhaRb)d5O3h^gi->D0 z)X@~Hlw_>N%1n#~hv9p4ecrr9fPTxT#?XK;IS5o!;N^yCVCnMbh$X0p@y?~dNWiDr zZ|#RXlkgMX4R)zAihD*-lN#27H@`~Ppj|ZdmP?}`MDZEBYnj1(^Klw1r5P$MMK;QL z&AfkjS}#pTi=T_%n?bxo;n0YJ!6?gka1PWSAYg=Jx1BB(I&9`R(^(J#q;|oRyAt8 zX1=T|RfdcZ1f{`+8s#a*Ld+iP>FwbMW=+^kFt?{A!G+5OZ;Ks=Ue5csK}*YAa!-O>X?C1a|=)1be$k1tsTWF2yqR0R?kucNuZ?`5}CsGzGsL&!p zh03Sc$bw-+Q?)wunJ>_N&Bz8k>qMDfRca3sRf@D0NaF>+*jGt$7^i$G3`V|U)33Js z6?i~~xK91;PG#zTfA0?eHCuU5^SJ@@pfyM_KKRYE+RRwz@M{$HZ7(K1reI`P^j%#I z-+Q z{sA2n!7o?C`5r`-HYii|lhIGg65^ICe>PtP!y<(8tSf20Wy`@41s!gX!Ijp@a@>m&`fz)eXDC#0gT;|4O^HTj8DNvqT=L z9F@nu;&UV(Q6pP_&?hj}$mL1LtQ{H7`+y}fGZBnziWna9t=#O%-DBP`j2W+&PNKKP zH!mtLZx3Icg(nAH5dK$m^>FWd(EP#nb{I#qJpE{l$j5uk^Ucsv>tg4a(_xj#0|ls@ z4$jCDRbL>Je6;C?Ouxb$Whz223=TTDyqA&-b!mrOFwa;q!)@~N?9w7|8x6;Ze-HC^%xl2l zNnHT+6y7oH*sfbootk$a;a?!l-1FG-BBnC2zFKWW7Hq%9%a1Mp*4NYQat416fTLWo zd8*1v%iCyx-Fbs2L`8}S(m|14rS~F4Aata6 zqzlrKjtUs0cS2E+o=^`RqzXrB2%+YNbI)7ruDjm4Z{79g@9&$LZ|^<7z2~>T*~5Vk zcFa7Yso9LT!AP&NWM_NS_{Za%H?&gQ(NNL&M5qQd?YP5$$YPLL?lY{bRZObBxtG|- zjuk~fJP>QHh&HctnQ)#1x9?BhMV-JXC0OJn>=jn+1$h8E>Nn0t6_+jYK0bJqun&LB zjeUoy{0eJhOaY7B-V<0>s@_5=0Q1An$C`dCg8H5Zdd$u)^jvUT_dF9~F zxk9=YOMtmk0>xk!6ZcZTNIi7hNHvePsEhnsF-#ayZr%(;=!CB=3^de1{qL8Un zneF0bLlzyhaCPrBrvoQXFB$BsI_JKYDH2J%?NsHlW-*;5@menZIXPQApV+WUj(+_R z2qO%0h(hXDO)4AjM5sUKb`Mf!j%!9Z7%znuKI9UG0|4Y3$KFgjlkF~%uT66b7xx2deoymrZ-hJpS%abn~3oT0UhdpkHHAn z`b#u#uFVnHy-@Pk3w=CK+~{XrUP?UN2he{8e16mE2Xg(QRHXkwNn3w${Jx7f=i+#{ zud*DrluQUD+G&J*sftu5d2XlstUQfp>=hk!hi}_44C+cZcJ9PqEAvrOMKW?icEFFf zMK4TG?7+CCk~MrWq`%#cZEZ|cPf6*Op4{R7RDVnM5Id1dsJqgQp}Q|L#u=OSO6ceh zVP+a^woINOMRX68L}QU~-iQ%3WL55#DE*4c3kXx4(jTvanev4U4euX6%M+4g(=7x) zD=CcTa>&uM3Mt`NU4^~V6Z`EoBXnLc9|^Z%bBo6ml`fLyH8Tv8T4(OWd(um8T9}iN zJAHb7`)yG;ocm+2Et_pgA^#1>#y4|FTpOvxMs%M`h*KV89^Z!Z9B@EnQVyPZIbNGG z;NaYd*PXx&CfQ@Q*fa|BAabjAc)zl?t9pc>@5}(5G^`V=w6OGWkV)39k(9bsL29bu z1MoxM$aKan`joP5?d%1Sa3#$35~ej1VPK@IAg64jQ+~3UWd6)msmI3z$qC}d*n2m6 z!oVRz{90onLW2;!AIZB;O1LcA_!k$sYSwGajGQb5gC)tVd0-PsmcD>+_}O{8Ti%}1 zmZFG1sf**ho{{R4j}(NS?`}Z}CB0toq&%4<*`c@hVK;QRaZFLnFPX1Drd1Fwq=qzP zvYfw}UA~h=%ai&nf<4!jRXeOhJ`Be7aXvoG_BPUx?g5EFSGD-tu1jUKi}SDyPN=Is zn5No@vf7BXJt>=SP<<0^W2{{tqADgE{VNcj$Xhr-vh~$hN1YJ!WIS#wOY|pcZp_|s z;p*|siF(q=6#VfI*zI4a+>|BMyqHMaLcEvomjC^?g|@)<1TYYEPTSA&gWlk((t=Fr zhdexQa87|uoioTh(!YdwakF2Tu|C}d$Va=xN;jh2Diw%m^9FM)Zr9=$K>=zuJq`|Qmv(SlQzT&FJvd5&WJ zK)6*z5LIHYg75jNCc4v;?WL)fX?Z~~g7E{J+&A8EMb(LCzSY2THj8+DHRuitu+VLyVlFZHSkfmWYp48P96Q^(Slb!KPy`x0#3AL~E!` zS3m51Di^vm*R4v>R^OE^USFB1kqBu;WwVng^P4eGNTF(4p(=w*lSm~?4&9y%)w~vn)yjY&Rul-iPyCBAWO`P6=TP$lqNA6xod~+N_W+zW zGkY9o(6mDp(?&Cts8}A;PSc${Nj&|wdrsK>nuiOVrQ6eC-nhNGPOvNl|6~E1v+h`> z^Z%WeU60wK=7s~A;tG!lSOP@u7RH0MY;O$t%bGL^#(XN5XUo@C{%~$G#=@DWW~tgr zM)Pzmx@&N|N}gH0xN@vgJ=|cGjQuTV)-#3S-qxFRB@T%?85?_p0f(5SQ!;;QP{8A{ z5L#Mof_P-!j;!-ZC8);?Cqw*FK?b^b0|)3@F>ybqr+$S>fTqY*(?eDKR}?^P25g># zUdS(XT|SD@>BU^wnqb@K&bbiQgKn$(&Kd#AqpN#ZFu@iJZNOsqnt8OC+4#0n{#uxG zJyB+wTTnqW>3L)yP9VRDU*6m3!Fzbg%Z5jGfA^8%_rmcRZa&U z7OiX1V02}S%GDvvP{+r1iVE$1R#4(QZLNV?`JUa?T~woRrlI2v$*@{KTOOmGFHG~h zA<*~a^`rg!PvTdBPx4@#Zl8#IiR*IQbp=g}+1%_u@|k$wMefIQjQ9mfT4*EI8orBcN@{dXCzjOr z;VWQHk}#D^$4n5>1Wb@!mN8(xxSEELebuZkSMxc13@Cfvot$uVye&hL!T z==AJCe%mGEjUp!>G6mL0yxc7^Y1=Dvn+k`q2IwKv6Yh#VE;bij=27quZ4poBS=v6u z2H;bml=O@c)9X484q3NW(p@ixOang}UuhqMvF_TawP8rg`^Ov64hc%Et1fblSc%O(D*0J!l4yt=cdkbWiBHT1}C^G8neoxamtA(2VmKX#AqJW^ehry^^}fnUP$^jFC$!sqQgnx+r|uif5OkH+Z?c zy-~E9&RMczC-x5|c$5tDgl?bLE%=KMcDIP|&HWfmkna%ZGYS2Zj?MK|FcM$SoIxj2 z&GY+p9IVLk@W!Q>@L<1nZPZYX)z5jkl`#_~HJ;W-GlBv5J;jciMSCR|W3jbn0uTCx zgRVbLo-Bpo(j>mS>5E1D=I|Cob0aYq%X!u$Y4X7!$TPTjpY3-4QnWQ!g=W%Q+~S$~ zfiLb8mLHRb-PkDb71Ui;`4t6IH_X49(7r{sO9cdp4_9|XuKiyM<@w^hCXM={<3Hp% zoKiU_C01Hg-X!;$LL=%1$PE)3hK-;h+1b7?T&rIygak12rlndb8u~7qWGs}s%G#JQ zpCy49yeT5>sX~eRcty~q0M4FfR3ciI&i#?5a&+yH-J8rJai(OM$>`;3CY^H1^Hna^ zd03<~aNYN0onu*LFaRq8Z*?2g7kvL(Ph43mppu!ln2^8;6qY3H>Hin4Nl!l$+rXC_ z^XDOB-PM4o-PpwJ&C;7%V0GbumtcZSV=Wu}+z#zBRg=IW8d3K)?+ckl66tH(n-#!X zB5kQs%Iu)Y1769!bR|c2o>*Oi8TOj^C33DdGi9`ZNF@oO3kXXqBeh3Px3Q4_Ge0Qc zMt~F|u@$b9;%U=rpOib8^Co36;LG#;!VY{Y46eClS;wz098+eJ-oj7|lg@~6{w#QX zBsHJ^^h&Ib&AZ^3oUhFfquaLudbIh#Vk)`t5;OQTjZHgGuqOg8PjZi6)jpZ+`(%yd z7I+QFa5zyD<@xLj{+JrYX8%2jb(g8+Krnz@rNPCe7i0^^k8y{h-G^^XeMLNx`0D5EdQHY#afAz6~2+?pi)|>BS>p^CkQe0d)C@TlS`3fKa@Ok!87OE@LVNP#I zq^Eu%dS63a=v=RWF1dn*#`kPMB{r6!_+Lm>v_J}T$kKM?;Tl=Xc6!T$aW5Yqo56Hp zH8ZM~L^{~8+u7eYfcz`9ihc2y0%+9*>WhC5rF>_X#9LZhGg>G- z!v$#NV@l!IH4E_#rL&B7`e$wxY)tv~f7sFc{QsnYi;BMgO`^uUWeB(aPY>$1WP*sz zgE6nB!>_kD_zh0Ev+E!>SuYVh~=*eruI;Ip3#822v;jdX9{^5e@Za&;| zn;UKv_R_x|?l%8FiQvHO_i1UJ0U6BtE#S7RK5+=PZ#t#fv$|k3eaV!%Z*%IW$9jHG z%{x1+Q9yicuuPm`@KcB@bK??BioNE7@Ppr~1?RU?rRiXMNqrdoNJ3tZN>&ns8NQS& zDk0*U1=l8c-SNx5615a3vS8O$rGrquz_k-|DK3t>e7ewVf?Tl&(e24?=#Vrn1h90N zpFX`|Il# z%IF1xi``K~j>nQzsnmh-HjdLnfDnM){~1ljmsrSijvmVZcSIo4E8J|c9|0jI=?ib6 z73|9Uo+q}<8&WuuhEZep!5R}tWm|YEBA8yD%th?Y!N!}92a$7z@*Vohhv9UK8aR@Q zj9}*c=5=bGtF%s$#e|}Zjl=$wpH+d?)IRh6q`MCY?WC8#gZsdc5>8tBLX9uZEZ4uzp*YknV);rQB z%NN~e#KN=3y^-S~G}ki2{>~4M8_fs~g3bNNzX>3c83>2~JzSlc?)2SI2tXgG@aNNB zr!!FN5`lO(?wB$$q~iM zGTc+VURu{yh?1ui+~Y(~SzY{G;Fme`-KEb}(+Zmvk+8a~q%Rd;padj8zZ+n83NDes z63TR-@AuwITuC(9?X1a3CjeY+jBF1MRL|QH0OpOsD{=X!z!3!QTxr@&R+cQ(!~+P$ z6R_5OzsB*Ni&!-%xf^d8KS3N9g$0*So3I3llsGzP^hq~nW)lC2T^9E)i4o^VeynO2 zlmNHg%cJWz$`F|4o;Z%5;=dl!(C~MuH+?Q4;)qK+==u)Y|DEkBXY4H)_1*_^xcTj; zraW1$cGN*ac>>n!kZ!SQe=kl1pJ>}6(dOPztC5K7+!-~GYr%^#a9eaLfCZtE*X@RB zw#36xONZ!}AkjVVzofg4I+{wtV;p|Yo>T`}{}HbK4Pvg5?f(KmgIF4QA+NjF3c$B? hpvwOTF8|l@aUAD5+h=;qrm_Hhd#0qJ2$#1E`v*QtJ*xl! literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/xps_step_4_output.png b/docs/source/_static/images/xps_step_4_output.png new file mode 100644 index 0000000000000000000000000000000000000000..af0b33b00b4d1dfff524bb5b2633d7e23c286f1b GIT binary patch literal 80206 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%0A63sKsfJi*~mEdn}v2|;l*F+>K1RNUe>o0Q!v=3 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⁣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 z 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 LHoQ}%WflHEUM2$4 literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/xps_step_4_pa_exp.png b/docs/source/_static/images/xps_step_4_pa_exp.png new file mode 100644 index 0000000000000000000000000000000000000000..d27a16acabdb626a4f4b98136a1bdeee2d5d8120 GIT binary patch literal 37923 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�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

vh<6glR-I`c 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ŝ=GZ6|zCfIhdC+-Jb&>Uhro}01SBl`+a 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 literal 0 HcmV?d00001 diff --git a/docs/source/howto/index.rst b/docs/source/howto/index.rst index 0194629ee..08361e63e 100644 --- a/docs/source/howto/index.rst +++ b/docs/source/howto/index.rst @@ -11,3 +11,4 @@ How-to guides import_structure upgrade_uninstall xas + xps diff --git a/docs/source/howto/xps.rst b/docs/source/howto/xps.rst new file mode 100644 index 000000000..f8ac2ddda --- /dev/null +++ b/docs/source/howto/xps.rst @@ -0,0 +1,161 @@ +============================ +How to calculate XPS spectra +============================ + +Overview +======== +This tutorial will guide you through the process of setting up and running an XPS calculation for Phenylacetylene molecule. + + +Steps +===== + +To start, go ahead and :doc:`launch ` the app, then follow the steps below. + + +Step 1 Select a structure +-------------------------------- +For this tutorial task, please use the `From Examples` tab, and select the Phenylacetylene molecule structure. + +Click the `Confirm` button to proceed. + +.. figure:: /_static/images/xps_step_1.png + :align: center + + +Step 2 Configure workflow +-------------------------------- + +In the **Basic Settings** tab, set the following parameters: + +- In the **Structure optimization** section, select ``Structure as is``. +- Set **Electronic Type** to ``Insulator`` +- In the **properties** section, select ``X-ray photoelectron spectroscopy (XPS)`` + + +Then go to the **Advanced settings** tab, navigate to `Accuracy and precision`, tick the `Override` box on the right-hand-side and in the dropdown box under `Exchange-correlation functional` select `PBE`. + +.. image:: ../_static/images/XAS_Plugin-Set_Adv_Options-Alt-Annotated-Cropped.png + :align: center + + +.. note:: + At present, core-hole pseudopotentials for Si and O are only available for the PBE functional. + +Then go to the **XPS setting** tab and, in the **Select core-level** section, select ``C_1s`` by ticking the appropriate box. + +.. image:: ../_static/images/xps_step_2_setting_tab.png + :align: center + + +Click the **Confirm** button to proceed. + + +Step 3 Choose computational resources +--------------------------------------- +We need to use a `pw` code on the high-performance computer to run XPS calculation for this system. +Please read the relevant :doc:`How-To ` section to setup code on a remote machine. + +.. image:: ../_static/images/xps_step_3.png + :align: center + + +Then, click the **Submit** button. + + + +Step 4 Check the status and results +----------------------------------------- +The job may take 5~10 minutes to finish if your jobs are running immediately without waiting in the queue. + +While the calculation is running, you can monitor its status as shown in the :ref:`basic tutorial `. +When the job is finished, you can view result spectra in the `XPS` tab. + +.. tip:: + + If the `XPS` tab is now shown when the jobs is finished. + Click the ``QeAppWorkChain`` item on top of the nodetree to refresh the step. + +Here is the result of the XPS calculation. +You can click the **Binding energy** button to view the calculated binding energies. +You can change which element to view XPS spectra for using the dropdown box in the top left. + +.. figure:: /_static/images/xps_step_4_xps_tab.png + :align: center + +One can upload the experimental XPS spectra, and compare to the calculated XPS spectra. +There is a button on the bottom left of the XPS tab to upload the experimental data. +Here is an example of the comparison between the calculated and experimental XPS spectra [1] for the C_1s core level of Phenylacetylene. + +.. figure:: /_static/images/xps_step_4_pa_exp.png + :align: center + +The calculated spectra agrees well with the experimental data, underscoring the reliability of DFT calculations. + + +.. tip:: + + One can also read the exact binding energies from the the output of the calculation, by clicking the `outputs` tab on the node tree of the WorkChain, as shown below. + + .. figure:: /_static/images/xps_step_4_output.png + :align: center + + + The DFT calculated binding energies do not include spin-orbit splitting of the core level state. + We can include the spin-orbit splitting using its experimental value. + Take `f` orbit as a example, we need subtracting :math:`3/7` of the experimental spin-orbit splitting or adding :math:`4/7` of the DFT calculated value, to get the position of the :math:`4f_{7/2}` and :math:`4f_{5/2}` peaks, respectively. Here is a table of the spin-orbit splitting for different orbitals. + + +----------------+-------------------+-------------------+ + | Orbit | Substracting | Adding | + +================+===================+===================+ + | 1s | 0 | 0 | + +----------------+-------------------+-------------------+ + | 2p | :math:`1/3` | :math:`2/3` | + +----------------+-------------------+-------------------+ + | 3d | :math:`2/5` | :math:`3/5` | + +----------------+-------------------+-------------------+ + | 4f | :math:`3/7` | :math:`4/7` | + +----------------+-------------------+-------------------+ + + + +Congratulations, you have finished this tutorial! + + +Another example +==================== +ETFA is commonly used as example for XPS measurements and calculations due to the extreme chemical shifts of its four different carbon atoms. [2] + +.. tip:: + + One can select the ETFA molecule from the `From Example` tab, and follow the same steps as above to run the XPS calculation for this molecule. + +Here is the result of the XPS calculation for the ETFA molecule. + +.. figure:: /_static/images/xps_etfa_dft.png + :align: center + +Here is the chemical shift from experiment. [2] + +.. figure:: /_static/images/xps_etfa_exp.jpg + :align: center + + +The calculated relative shifts align well with the trends observed in experimental data, underscoring the reliability of DFT calculations. +Although there are minor discrepancies in the absolute shift values, this is a recognized limitation stemming from the approximations in the exchange-correlation functional within DFT frameworks. [3] + +Questions +========= + +If you have any questions, please, do not hesitate to ask on the AiiDA discourse forum: https://aiida.discourse.group/. + + + +References +========== + +[1] V. Carravetta, *et al.*, *Chem. Phys.* 264, 175 (2001) https://doi.org/10.1016/S0301-0104(00)00396-7 + +[2] O. Travnikova, *et al.*, , *Relat. Phenom.* 185, 191 (2012) https://doi.org/10.1016/j.elspec.2012.05.009 + +[3] B.P. Klein, *et al.*, , *J. Phys. Condens. Matter* 33, 154005 (2021) https://doi.org/10.1088/1361-648X/abdf00 diff --git a/src/aiidalab_qe/app/structure/__init__.py b/src/aiidalab_qe/app/structure/__init__.py index 183899ab2..215c7479f 100644 --- a/src/aiidalab_qe/app/structure/__init__.py +++ b/src/aiidalab_qe/app/structure/__init__.py @@ -33,6 +33,8 @@ ("Gold (fcc)", file_path / "examples" / "Au.cif"), ("Cobalt (hcp)", file_path / "examples" / "Co.cif"), ("Lithium carbonate", file_path / "examples" / "Li2CO3.cif"), + ("Phenylacetylene molecule", file_path / "examples" / "Phenylacetylene.xyz"), + ("ETFA molecule", file_path / "examples" / "ETFA.xyz"), ] OptimadeQueryWidget.title = "OPTIMADE" # monkeypatch diff --git a/src/aiidalab_qe/app/structure/examples/ETFA.xyz b/src/aiidalab_qe/app/structure/examples/ETFA.xyz new file mode 100644 index 000000000..798a6382f --- /dev/null +++ b/src/aiidalab_qe/app/structure/examples/ETFA.xyz @@ -0,0 +1,16 @@ +14 +Lattice="12.30241974 0.0 0.0 0.0 14.640175719999998 0.0 0.0 0.0 15.46505195" Properties=species:S:1:pos:R:3 pbc="T T T" +C 6.21899370 8.39832269 5.55679337 +C 6.34421988 8.42035817 7.11190719 +C 6.34626493 7.04152238 9.04380147 +C 6.24209921 5.56976459 9.37839976 +F 6.36233512 9.64017572 5.05341708 +F 7.17124959 7.60031062 5.00000000 +F 5.00000000 7.92279567 5.17742669 +O 6.50098824 9.43606057 7.75095904 +O 6.24663056 7.16890953 7.58195838 +H 7.30241974 7.48055705 9.35298092 +H 5.53775445 7.63550949 9.48679926 +H 5.28506039 5.15498764 9.04352071 +H 7.05371060 5.00000000 8.91281931 +H 6.31087194 5.44012134 10.46505195 diff --git a/src/aiidalab_qe/app/structure/examples/Phenylacetylene.xyz b/src/aiidalab_qe/app/structure/examples/Phenylacetylene.xyz new file mode 100644 index 000000000..e6393c580 --- /dev/null +++ b/src/aiidalab_qe/app/structure/examples/Phenylacetylene.xyz @@ -0,0 +1,16 @@ +14 +Lattice="17.572400000000002 0.0 0.0 0.0 14.3161 0.0 0.0 0.0 10.0002" Properties=species:S:1:pos:R:3 pbc="T T T" +C 8.87580000 7.15810000 5.00010000 +C 8.17830000 8.36610000 5.00010000 +C 8.17830000 5.95000000 5.00010000 +C 6.78350000 8.36630000 5.00010000 +C 6.78340000 5.95020000 5.00010000 +C 6.08610000 7.15830000 5.00010000 +C 10.30480000 7.15810000 5.00010000 +C 11.50750000 7.15840000 5.00010000 +H 8.70750000 9.31610000 5.00000000 +H 8.70750000 5.00000000 5.00010000 +H 6.24030000 9.30680000 5.00010000 +H 6.24010000 5.00980000 5.00010000 +H 5.00000000 7.15830000 5.00020000 +H 12.57240000 7.15850000 5.00020000 diff --git a/src/aiidalab_qe/plugins/xps/result.py b/src/aiidalab_qe/plugins/xps/result.py index 1660df5ae..64faebc97 100644 --- a/src/aiidalab_qe/plugins/xps/result.py +++ b/src/aiidalab_qe/plugins/xps/result.py @@ -77,6 +77,7 @@ class Result(ResultPanel): def __init__(self, node=None, **kwargs): super().__init__(node=node, **kwargs) + self.experimental_data = None # Placeholder for experimental data def _update_view(self): import plotly.graph_objects as go @@ -101,17 +102,17 @@ def _update_view(self): value="chemical_shift", ) gamma = ipw.FloatSlider( - value=0.3, - min=0.1, - max=1, + value=0.1, + min=0.01, + max=0.5, description="Lorentzian profile ($\gamma$)", disabled=False, style={"description_width": "initial"}, ) sigma = ipw.FloatSlider( - value=0.3, - min=0.1, - max=1, + value=0.1, + min=0.01, + max=0.5, description="Gaussian profile ($\sigma$)", disabled=False, style={"description_width": "initial"}, @@ -122,6 +123,21 @@ def _update_view(self): disabled=False, style={"description_width": "initial"}, ) + # Create a description label + upload_description = ipw.HTML( + value="Upload Experimental Data (csv format):", + placeholder="", + description="", + ) + + # Create the upload button + upload_btn = ipw.FileUpload( + description="Choose File", + multiple=False, + ) + upload_container = ipw.VBox([upload_description, upload_btn]) + upload_btn.observe(self._handle_upload, names="value") + paras = ipw.HBox( children=[ gamma, @@ -145,21 +161,23 @@ def _update_view(self): layout=ipw.Layout(width="20%"), ) # init figure - g = go.FigureWidget( + self.g = go.FigureWidget( layout=go.Layout( title=dict(text="XPS"), barmode="overlay", ) ) - g.layout.xaxis.title = "Chemical shift (eV)" - g.layout.xaxis.autorange = "reversed" + self.g.layout.xaxis.title = "Chemical shift (eV)" + self.g.layout.xaxis.autorange = "reversed" # spectra = xps_spectra_broadening( chemical_shifts, equivalent_sites_data, gamma=gamma.value, sigma=sigma.value ) # only plot the selected spectrum for site, d in spectra[spectrum_select.value].items(): - g.add_scatter(x=d[0], y=d[1], fill="tozeroy", name=site.replace("_", " ")) + self.g.add_scatter( + x=d[0], y=d[1], fill="tozeroy", name=site.replace("_", " ") + ) def response(change): data = [] @@ -183,29 +201,29 @@ def response(change): } ) fill_type = "tozeroy" if fill.value else None - with g.batch_update(): - if len(g.data) == len(data): + with self.g.batch_update(): + if len(self.g.data) == len(data): for i in range(len(data)): - g.data[i].x = data[i]["x"] - g.data[i].y = data[i]["y"] - g.data[i].fill = fill_type - g.data[i].name = data[i]["site"].replace("_", " ") + self.g.data[i].x = data[i]["x"] + self.g.data[i].y = data[i]["y"] + self.g.data[i].fill = fill_type + self.g.data[i].name = data[i]["site"].replace("_", " ") else: - g.data = [] + self.g.data = [] for d in data: - g.add_scatter( + self.g.add_scatter( x=d["x"], y=d["y"], fill=fill_type, name=d["site"] ) - g.layout.barmode = "overlay" - g.layout.xaxis.title = xaxis + self.g.layout.barmode = "overlay" + self.g.layout.xaxis.title = xaxis + self.plot_experimental_data() spectra_type.observe(response, names="value") spectrum_select.observe(response, names="value") gamma.observe(response, names="value") sigma.observe(response, names="value") fill.observe(response, names="value") - correction_energies_table = self._get_corrections() self.children = [ spectra_type, ipw.HBox( @@ -217,30 +235,28 @@ def response(change): voigt_profile_help, paras, fill, - g, - correction_energies_table, + self.g, + upload_container, ] - def _get_corrections(self): - from aiida.orm.utils.serialize import deserialize_unsafe - - ui_parameters = self.node.base.extras.get("ui_parameters", {}) - ui_parameters = deserialize_unsafe(ui_parameters) - correction_energies = ui_parameters["xps"]["correction_energies"] - # create a table for the correction energies using ipywidgets - # These offsets mainly depend on chemical element and core level, and are determined by comparing the calculated core electron binding energy to the experimental one. - correction_energies_table = ipw.HTML( - """

Offset Energies (δ)

-
When comparing the calculated binding energies to the experimental data, these should be corrected by the given offset listed below.
-
Core-levelValue (eV)
{core_level}{sign}{exp}
Total Charge {{ tot_charge }}
Van der Waals Correction{{ vdw_corr }}
Initial Magnetic Moments {{ initial_magnetic_moments }}
""" - ) - for core_level, value in correction_energies.items(): - element = core_level.split("_")[0] - if element not in self.spectrum_select_options: - continue - exp = -value["exp"] - sign = "" if exp < 0 else "+" - correction_energies_table.value += ( - f"" - ) - return correction_energies_table + def _handle_upload(self, change): + """Process the uploaded experimental data file.""" + import pandas as pd + + uploaded_file = next(iter(change.new.values())) + content = uploaded_file["content"] + content_str = content.decode("utf-8") + + from io import StringIO + + df = pd.read_csv(StringIO(content_str), header=None) + + self.experimental_data = df + self.plot_experimental_data() + + def plot_experimental_data(self): + """Plot the experimental data alongside the calculated data.""" + if self.experimental_data is not None: + x = self.experimental_data[0] + y = self.experimental_data[1] + self.g.add_scatter(x=x, y=y, mode="lines", name="Experimental Data") diff --git a/src/aiidalab_qe/plugins/xps/workchain.py b/src/aiidalab_qe/plugins/xps/workchain.py index 44b697a01..a58dce82c 100644 --- a/src/aiidalab_qe/plugins/xps/workchain.py +++ b/src/aiidalab_qe/plugins/xps/workchain.py @@ -40,7 +40,10 @@ def get_builder(codes, structure, parameters, **kwargs): if pseudo.label == f"{element}_gs" ][0], } - correction_energies[element] = all_correction_energies[label]["core"] + correction_energies[element] = ( + all_correction_energies[label]["core"] + - all_correction_energies[label]["exp"] + ) elements_list.append(element) # is_molecule_input = ( From d77bdb251919a2dd352672149996b3085c0d1420 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Tue, 12 Mar 2024 05:53:51 -0500 Subject: [PATCH 038/166] Deprecate py3.8 where AWB already deprecated it (#633) --- .github/workflows/ci.yml | 2 +- setup.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ad7c72840..e1645e175 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,7 @@ jobs: strategy: matrix: tag: [latest] - python-version: ['3.8', '3.9', '3.10'] + python-version: ['3.9', '3.10'] fail-fast: false runs-on: ubuntu-latest diff --git a/setup.cfg b/setup.cfg index 74e9c345f..1ae7ee7d6 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,7 +31,7 @@ install_requires = aiida-pseudo~=1.4 filelock~=3.8 importlib-resources~=5.2 -python_requires = >=3.8 +python_requires = >=3.9 [options.packages.find] where = src From ed72b08504281ff9a8c96ae8d8a5e0afeee5083e Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Wed, 13 Mar 2024 01:31:19 -0500 Subject: [PATCH 039/166] Bump aiidalab-widgets-base with new ipyoptimade (#632) --- setup.cfg | 2 +- src/aiidalab_qe/app/structure/__init__.py | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/setup.cfg b/setup.cfg index 1ae7ee7d6..4f8936a7f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -27,7 +27,7 @@ install_requires = aiida-core~=2.2,<3 Jinja2~=3.0 aiida-quantumespresso~=4.4.0 - aiidalab-widgets-base~=2.1 + aiidalab-widgets-base[optimade]~=2.2.0a0 aiida-pseudo~=1.4 filelock~=3.8 importlib-resources~=5.2 diff --git a/src/aiidalab_qe/app/structure/__init__.py b/src/aiidalab_qe/app/structure/__init__.py index 215c7479f..2fa9b2aa7 100644 --- a/src/aiidalab_qe/app/structure/__init__.py +++ b/src/aiidalab_qe/app/structure/__init__.py @@ -7,7 +7,7 @@ import aiida import ipywidgets as ipw -import traitlets +import traitlets as tl from aiidalab_widgets_base import ( BasicCellEditor, BasicStructureEditor, @@ -37,8 +37,6 @@ ("ETFA molecule", file_path / "examples" / "ETFA.xyz"), ] -OptimadeQueryWidget.title = "OPTIMADE" # monkeypatch - class StructureSelectionStep(ipw.VBox, WizardAppWidgetStep): """Integrated widget for the selection and edition of structure. @@ -47,8 +45,8 @@ class StructureSelectionStep(ipw.VBox, WizardAppWidgetStep): structure importers and the structure editors can be extended by plugins. """ - structure = traitlets.Instance(aiida.orm.StructureData, allow_none=True) - confirmed_structure = traitlets.Instance(aiida.orm.StructureData, allow_none=True) + structure = tl.Instance(aiida.orm.StructureData, allow_none=True) + confirmed_structure = tl.Instance(aiida.orm.StructureData, allow_none=True) def __init__(self, description=None, **kwargs): importers = [ @@ -121,7 +119,7 @@ def __init__(self, description=None, **kwargs): **kwargs, ) - @traitlets.default("state") + @tl.default("state") def _default_state(self): return self.State.INIT @@ -137,7 +135,7 @@ def _update_state(self): else: self.state = self.State.SUCCESS - @traitlets.observe("structure") + @tl.observe("structure") def _observe_structure(self, change): structure = change["new"] with self.hold_trait_notifications(): @@ -148,12 +146,12 @@ def _observe_structure(self, change): self.structure_name_text.value = str(self.structure.get_formula()) self._update_state() - @traitlets.observe("confirmed_structure") + @tl.observe("confirmed_structure") def _observe_confirmed_structure(self, _): with self.hold_trait_notifications(): self._update_state() - @traitlets.observe("state") + @tl.observe("state") def _observe_state(self, change): with self.hold_trait_notifications(): state = change["new"] From cb811c739fb85ff579fe892e5e7d72c9b8801e28 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Thu, 21 Mar 2024 16:14:55 +0100 Subject: [PATCH 040/166] Add aiida-core-version in the CI test (#643) --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e1645e175..4e8ebe76d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,6 +20,7 @@ jobs: matrix: tag: [latest] python-version: ['3.9', '3.10'] + aiida-core-version: [2.3, 2.4.3] fail-fast: false runs-on: ubuntu-latest @@ -46,7 +47,7 @@ jobs: **/pyproject.toml **/requirements*.txt - name: Install package - run: pip install -e .[dev] + run: pip install -e .[dev] aiida-core==${{ matrix.aiida-core-version }} - name: Run pytest run: pytest -v tests --cov From a6f3517b4c9ae179781a86056a2d4bede9e68003 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Thu, 21 Mar 2024 17:23:56 +0100 Subject: [PATCH 041/166] Regression test for the parameters generated by the app (#644) The previous test used the final builder generated by the workchain, which is like an end-to-end test. However, the builder depends on the version of the aiida-quantumespresso, which we want to avoid for the moment. In this PR, we only test the ui_parameters generated by the app. This ui_parameter is the most important parameter, and it contains all the information on the jobs. We can use it to recreate the whole qeapp instance. The test here guarantees that the ui_parameters are the same as the reference data. --- tests/test_submit_qe_workchain.py | 45 +++- .../test_create_builder_default.yml | 203 +++--------------- 2 files changed, 70 insertions(+), 178 deletions(-) diff --git a/tests/test_submit_qe_workchain.py b/tests/test_submit_qe_workchain.py index 5bde299c2..51d3a4a1a 100644 --- a/tests/test_submit_qe_workchain.py +++ b/tests/test_submit_qe_workchain.py @@ -14,13 +14,12 @@ def test_create_builder_default( app = submit_app_generator(properties=["bands", "pdos"]) submit_step = app.submit_step - builder = submit_step._create_builder() - - # check and validate the builder - got = builder_to_readable_dict(builder) - - # regression test - data_regression.check(got) + submit_step._create_builder() + # since uuid is specific to each run, we remove it from the output + ui_parameters = remove_uuid_fields(submit_step.ui_parameters) + # regression test for the parameters generated by the app + # this parameters are passed to the workchain + data_regression.check(ui_parameters) @pytest.mark.usefixtures("sssp") @@ -121,3 +120,35 @@ def builder_to_readable_dict(builder): readable_dict[k] = v return readable_dict + + +def remove_uuid_fields(data): + """ + Recursively remove fields that contain UUID values from a dictionary. + + :param data: The dictionary to process. + :return: The dictionary with UUID fields removed. + """ + import re + + # Define a UUID pattern + uuid_pattern = re.compile( + r"[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}", re.I + ) + + if isinstance(data, dict): + new_dict = {} + for key, value in data.items(): + # If the value matches the UUID pattern, skip adding it to the new dictionary + if isinstance(value, str) and uuid_pattern.match(value): + continue + # Otherwise, process the value recursively and add it to the new dictionary + else: + new_dict[key] = remove_uuid_fields(value) + return new_dict + elif isinstance(data, list): + # Process each item in the list recursively + return [remove_uuid_fields(item) for item in data] + else: + # Return the value unchanged if it's not a dictionary or list + return data diff --git a/tests/test_submit_qe_workchain/test_create_builder_default.yml b/tests/test_submit_qe_workchain/test_create_builder_default.yml index 868198e3b..2f9f23575 100644 --- a/tests/test_submit_qe_workchain/test_create_builder_default.yml +++ b/tests/test_submit_qe_workchain/test_create_builder_default.yml @@ -1,173 +1,34 @@ +advanced: + clean_workdir: false + initial_magnetic_moments: null + kpoints_distance: 0.12 + pseudo_family: SSSP/1.3/PBEsol/efficiency + pw: + parameters: + SYSTEM: + degauss: 0.015 + ecutrho: 240.0 + ecutwfc: 30.0 + smearing: methfessel-paxton + tot_charge: 0.0 + vdw_corr: none + pseudos: {} bands: - bands: - pw: - parallelization: - npool: 1 - parameters: - CONTROL: - calculation: bands - etot_conv_thr: 2.0e-05 - forc_conv_thr: 0.0001 - restart_mode: from_scratch - tprnfor: true - tstress: true - ELECTRONS: - conv_thr: 4.0e-10 - diago_full_acc: true - diagonalization: paro - electron_maxstep: 80 - mixing_beta: 0.4 - startingpot: file - SYSTEM: - degauss: 0.01 - ecutrho: 240.0 - ecutwfc: 30.0 - nosym: false - occupations: smearing - smearing: cold - tot_charge: 0.0 - vdw_corr: none - pseudos: - Si: Si.upf - bands_kpoints_distance: 0.025 - nbands_factor: 3.0 - scf: - kpoints_distance: 0.12 - kpoints_force_parity: false - pw: - parallelization: - npool: 1 - parameters: - CONTROL: - calculation: scf - etot_conv_thr: 2.0e-05 - forc_conv_thr: 0.0001 - tprnfor: true - tstress: true - ELECTRONS: - conv_thr: 4.0e-10 - electron_maxstep: 80 - mixing_beta: 0.4 - SYSTEM: - degauss: 0.015 - ecutrho: 240.0 - ecutwfc: 30.0 - nosym: false - occupations: smearing - smearing: methfessel-paxton - tot_charge: 0.0 - vdw_corr: none - pseudos: - Si: Si.upf -clean_workdir: false + kpath_2d: hexagonal +codes: + xspectra: null pdos: - dos: - parameters: - DOS: - DeltaE: 0.02 - nscf: - kpoints_distance: 0.1 - kpoints_force_parity: false - pw: - parallelization: - npool: 1 - parameters: - CONTROL: - calculation: nscf - etot_conv_thr: 2.0e-05 - forc_conv_thr: 0.0001 - restart_mode: from_scratch - tprnfor: true - tstress: true - ELECTRONS: - conv_thr: 4.0e-10 - electron_maxstep: 80 - mixing_beta: 0.4 - SYSTEM: - ecutrho: 240.0 - ecutwfc: 30.0 - nosym: true - occupations: tetrahedra - tot_charge: 0.0 - vdw_corr: none - pseudos: - Si: Si.upf - projwfc: - parameters: - PROJWFC: - DeltaE: 0.02 - settings: - cmdline: - - -nk - - '1' - scf: - kpoints_distance: 0.12 - kpoints_force_parity: false - pw: - parallelization: - npool: 1 - parameters: - CONTROL: - calculation: scf - etot_conv_thr: 2.0e-05 - forc_conv_thr: 0.0001 - restart_mode: from_scratch - tprnfor: true - tstress: true - ELECTRONS: - conv_thr: 4.0e-10 - electron_maxstep: 80 - mixing_beta: 0.4 - SYSTEM: - degauss: 0.015 - ecutrho: 240.0 - ecutwfc: 30.0 - nosym: false - occupations: smearing - smearing: methfessel-paxton - tot_charge: 0.0 - vdw_corr: none - pseudos: - Si: Si.upf -properties: -- bands -- pdos -- relax -relax: - base: - kpoints_distance: 0.12 - kpoints_force_parity: false - pw: - parallelization: - npool: 1 - parameters: - CELL: - cell_dofree: all - press_conv_thr: 0.5 - CONTROL: - calculation: vc-relax - etot_conv_thr: 2.0e-05 - forc_conv_thr: 0.0001 - tprnfor: true - tstress: true - ELECTRONS: - conv_thr: 4.0e-10 - electron_maxstep: 80 - mixing_beta: 0.4 - SYSTEM: - degauss: 0.015 - ecutrho: 240.0 - ecutwfc: 30.0 - nosym: false - occupations: smearing - smearing: methfessel-paxton - tot_charge: 0.0 - vdw_corr: none - pseudos: - Si: Si.upf - base_final_scf: - pw: - pseudos: {} - max_meta_convergence_iterations: 5 - meta_convergence: true - volume_convergence: 0.02 + nscf_kpoints_distance: 0.1 +resources: + npools: 1 + num_machines: 1 + num_mpiprocs_per_machine: 2 +workchain: + electronic_type: metal + properties: + - bands + - pdos + - relax + protocol: moderate + relax_type: positions_cell + spin_type: none From 15abd2b5b438b6c2a2f2d052f2dfc63216be7ac7 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Fri, 22 Mar 2024 10:08:12 +0100 Subject: [PATCH 042/166] Support quantumespresso plugin to 4.5.0 (#601) aiida-quantumespresso==4.5.0 rely on the aiida-core 2.5.0 which include a break change on using pydantic v2. It can potentially break things. To make it backward compatible, we make the aiida-quantumespresso denpendency version pinned as `~=4.4`. So that dependent on the aiida-core in the container, it will install the correspond version of aiida-quantumespresso. --- .github/workflows/ci.yml | 2 +- setup.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4e8ebe76d..10ee2f6d1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: matrix: tag: [latest] python-version: ['3.9', '3.10'] - aiida-core-version: [2.3, 2.4.3] + aiida-core-version: [2.3, 2.5] fail-fast: false runs-on: ubuntu-latest diff --git a/setup.cfg b/setup.cfg index 4f8936a7f..d9e6a107d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,7 +26,7 @@ packages = find: install_requires = aiida-core~=2.2,<3 Jinja2~=3.0 - aiida-quantumespresso~=4.4.0 + aiida-quantumespresso~=4.4 aiidalab-widgets-base[optimade]~=2.2.0a0 aiida-pseudo~=1.4 filelock~=3.8 From 3b5924af7e4949b5fc9c2bdd20d1623d376767a5 Mon Sep 17 00:00:00 2001 From: superstar54 Date: Tue, 26 Mar 2024 14:13:32 +0000 Subject: [PATCH 043/166] Bump version v24.04.0a2 -> v24.04.0a3 --- docs/source/conf.py | 2 +- setup.cfg | 4 ++-- src/aiidalab_qe/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 3829a3dd1..2ee63ffaa 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- -version = "v24.04.0a2" +version = "v24.04.0a3" release = f"{version}-dev" project = "Quantum ESPRESSO App" copyright_first_year = "2023" diff --git a/setup.cfg b/setup.cfg index d9e6a107d..3f4f5d613 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = aiidalab_qe -version = 24.4.0a2 +version = 24.4.0a3 description = Package for the AiiDAlab QE app long_description = file: README.md long_description_content_type = text/markdown @@ -66,7 +66,7 @@ categories = quantum [bumpver] -current_version = "v24.04.0a2" +current_version = "v24.04.0a3" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = True diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index 6ac2e2b8c..45fcd8d85 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -3,4 +3,4 @@ """This module contains project version information for both the app and the workflow.""" -__version__ = "v24.04.0a2" +__version__ = "v24.04.0a3" From ccc0f2f3c1b99ef02890f504a8b1ae7348f0fa43 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Fri, 29 Mar 2024 17:24:39 +0100 Subject: [PATCH 044/166] DOC: update docstrings and documentation consistent for XPS (#649) --- docs/source/development/plugin.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/source/development/plugin.rst b/docs/source/development/plugin.rst index 7be427bb4..0f885e421 100644 --- a/docs/source/development/plugin.rst +++ b/docs/source/development/plugin.rst @@ -98,14 +98,15 @@ Beside, you need to override the the following methods: } def set_panel_value(self, input_dict): - """Set a dictionary with the input parameters for the plugin.""" + """Set the value of the widgets in the panel from the input dictionary. + This method is called when the user wants to reload the panel from the previous calculation, + or reset the panel to the default values.""" self.scale.value = input_dict.get("scale", 0.05) self.npoint.value = input_dict.get("npoint", 5) def reset(self): """Reset the input fields.""" - self.scale.value = 0.05 - self.npoint.value = 5 + self.set_panel_value({"scale": 0.05, "npoint": 5}) Result ----------------------- From 91de25a72fbac09a99b713075c75b25d0bd673b5 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Tue, 2 Apr 2024 16:46:01 +0200 Subject: [PATCH 045/166] XPS: add an adjustable intensity factor for XPS spectra (#642) - Add an adjustable intensity factor - Align the max value of the total spectra with the max value of the experimental data --- src/aiidalab_qe/plugins/xps/result.py | 47 +++++++++++++++++++------- src/aiidalab_qe/plugins/xps/setting.py | 2 +- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/aiidalab_qe/plugins/xps/result.py b/src/aiidalab_qe/plugins/xps/result.py index 64faebc97..7931be4cf 100644 --- a/src/aiidalab_qe/plugins/xps/result.py +++ b/src/aiidalab_qe/plugins/xps/result.py @@ -30,7 +30,7 @@ def export_xps_data(outputs): def xps_spectra_broadening( - points, equivalent_sites_data, gamma=0.3, sigma=0.3, label="" + points, equivalent_sites_data, gamma=0.3, sigma=0.3, label="", intensity=1.0 ): """Broadening the XPS spectra with Voigt function and return the spectra data""" @@ -55,7 +55,7 @@ def xps_spectra_broadening( ) for site in point: # Weight for the spectra of every atom - intensity = equivalent_sites_data[site]["multiplicity"] + intensity = equivalent_sites_data[site]["multiplicity"] * intensity relative_core_level_position = point[site] y = ( intensity @@ -117,6 +117,13 @@ def _update_view(self): disabled=False, style={"description_width": "initial"}, ) + self.intensity = ipw.FloatText( + value=1.0, + min=0.001, + description="Adjustable Intensity Factor", + disabled=False, + style={"description_width": "initial"}, + ) fill = ipw.Checkbox( description="Fill", value=True, @@ -125,7 +132,7 @@ def _update_view(self): ) # Create a description label upload_description = ipw.HTML( - value="Upload Experimental Data (csv format):", + value="Upload Experimental Data (csv format, without header):", placeholder="", description="", ) @@ -135,7 +142,7 @@ def _update_view(self): description="Choose File", multiple=False, ) - upload_container = ipw.VBox([upload_description, upload_btn]) + upload_container = ipw.VBox([upload_description, upload_btn, self.intensity]) upload_btn.observe(self._handle_upload, names="value") paras = ipw.HBox( @@ -153,7 +160,7 @@ def _update_view(self): self.spectrum_select_options = [ key.split("_")[0] for key in chemical_shifts.keys() ] - spectrum_select = ipw.Dropdown( + self.spectrum_select = ipw.Dropdown( description="", disabled=False, value=self.spectrum_select_options[0], @@ -170,11 +177,15 @@ def _update_view(self): self.g.layout.xaxis.title = "Chemical shift (eV)" self.g.layout.xaxis.autorange = "reversed" # - spectra = xps_spectra_broadening( - chemical_shifts, equivalent_sites_data, gamma=gamma.value, sigma=sigma.value + self.spectra = xps_spectra_broadening( + chemical_shifts, + equivalent_sites_data, + gamma=gamma.value, + sigma=sigma.value, + intensity=self.intensity.value, ) # only plot the selected spectrum - for site, d in spectra[spectrum_select.value].items(): + for site, d in self.spectra[self.spectrum_select.value].items(): self.g.add_scatter( x=d[0], y=d[1], fill="tozeroy", name=site.replace("_", " ") ) @@ -189,10 +200,14 @@ def response(change): xaxis = "Binding Energy (eV)" # spectra = xps_spectra_broadening( - points, equivalent_sites_data, gamma=gamma.value, sigma=sigma.value + points, + equivalent_sites_data, + gamma=gamma.value, + sigma=sigma.value, + intensity=self.intensity.value, ) - for site, d in spectra[spectrum_select.value].items(): + for site, d in spectra[self.spectrum_select.value].items(): data.append( { "x": d[0], @@ -220,16 +235,17 @@ def response(change): self.plot_experimental_data() spectra_type.observe(response, names="value") - spectrum_select.observe(response, names="value") + self.spectrum_select.observe(response, names="value") gamma.observe(response, names="value") sigma.observe(response, names="value") + self.intensity.observe(response, names="value") fill.observe(response, names="value") self.children = [ spectra_type, ipw.HBox( children=[ spectrum_select_prompt, - spectrum_select, + self.spectrum_select, ] ), voigt_profile_help, @@ -252,7 +268,12 @@ def _handle_upload(self, change): df = pd.read_csv(StringIO(content_str), header=None) self.experimental_data = df - self.plot_experimental_data() + # Calculate an initial guess for the intensity factor + total = self.spectra[self.spectrum_select.value]["total"] + # Align the max value of the total spectra with the max value of the experimental data + max_exp = max(self.experimental_data[1]) + max_total = max(total[1]) + self.intensity.value = max_exp / max_total def plot_experimental_data(self): """Plot the experimental data alongside the calculated data.""" diff --git a/src/aiidalab_qe/plugins/xps/setting.py b/src/aiidalab_qe/plugins/xps/setting.py index 9f8e5d11d..6e7d2cdf9 100644 --- a/src/aiidalab_qe/plugins/xps/setting.py +++ b/src/aiidalab_qe/plugins/xps/setting.py @@ -24,7 +24,7 @@ def install_pseudos(pseudo_group="pseudo_demo_pbe"): def run_(*args, **kwargs): return run(*args, env=env, capture_output=True, check=True, **kwargs) - run_(["verdi", "archive", "import", url]) + run_(["verdi", "archive", "import", url, "--no-import-group"]) class Setting(Panel): From 2381200683c5b26778e10b0d85b25009c0484b77 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Wed, 3 Apr 2024 10:31:37 +0200 Subject: [PATCH 046/166] Skip setting the code automatically if the code does not exist in the DEFAULT_PARAMETERS. (#660) --- src/aiidalab_qe/app/submission/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/aiidalab_qe/app/submission/__init__.py b/src/aiidalab_qe/app/submission/__init__.py index 372df860b..ba9d23d37 100644 --- a/src/aiidalab_qe/app/submission/__init__.py +++ b/src/aiidalab_qe/app/submission/__init__.py @@ -198,6 +198,8 @@ def _toggle_install_widgets(self, change): def _auto_select_code(self, change): if change["new"] and not change["old"]: for name, code_widget in self.codes.items(): + if not DEFAULT_PARAMETERS["codes"].get(name): + continue try: code_widget.refresh() code_widget.value = orm.load_code( From df1b7cfe41a3df0af0c267158c3db41b47db804a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 10:58:07 +0200 Subject: [PATCH 047/166] [pre-commit.ci] pre-commit autoupdate (#654) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [pre-commit.ci] pre-commit autoupdate updates: - [github.com/sirosen/check-jsonschema: 0.27.3 → 0.28.1](https://github.com/sirosen/check-jsonschema/compare/0.27.3...0.28.1) - [github.com/nbQA-dev/nbQA: 1.7.1 → 1.8.5](https://github.com/nbQA-dev/nbQA/compare/1.7.1...1.8.5) - [github.com/kynan/nbstripout: 0.6.1 → 0.7.1](https://github.com/kynan/nbstripout/compare/0.6.1...0.7.1) - [github.com/astral-sh/ruff-pre-commit: v0.1.11 → v0.3.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.1.11...v0.3.4) * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 8 ++-- src/aiidalab_qe/__init__.py | 1 + src/aiidalab_qe/__main__.py | 3 +- src/aiidalab_qe/app/configuration/__init__.py | 1 + src/aiidalab_qe/app/configuration/advanced.py | 43 ++++++++++--------- src/aiidalab_qe/app/configuration/workflow.py | 1 + src/aiidalab_qe/app/result/summary_viewer.py | 6 +-- src/aiidalab_qe/app/submission/__init__.py | 1 + src/aiidalab_qe/app/submission/resource.py | 1 + src/aiidalab_qe/common/bandpdoswidget.py | 4 +- src/aiidalab_qe/common/panel.py | 1 + src/aiidalab_qe/common/process.py | 1 + src/aiidalab_qe/plugins/bands/result.py | 3 +- src/aiidalab_qe/plugins/bands/setting.py | 1 + src/aiidalab_qe/plugins/pdos/result.py | 4 +- src/aiidalab_qe/plugins/pdos/setting.py | 1 + src/aiidalab_qe/plugins/xas/result.py | 3 +- src/aiidalab_qe/plugins/xas/setting.py | 3 +- src/aiidalab_qe/plugins/xps/result.py | 3 +- src/aiidalab_qe/plugins/xps/setting.py | 3 +- tests/test_configure.py | 6 +-- 21 files changed, 50 insertions(+), 48 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 111c1ea3d..88747e471 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,12 +20,12 @@ repos: exclude: tests - repo: https://github.com/sirosen/check-jsonschema - rev: 0.27.3 + rev: 0.28.1 hooks: - id: check-github-workflows - repo: https://github.com/nbQA-dev/nbQA - rev: 1.7.1 + rev: 1.8.5 hooks: - id: nbqa-pyupgrade args: [--py38-plus] @@ -36,13 +36,13 @@ repos: args: [--ignore=E402] - repo: https://github.com/kynan/nbstripout - rev: 0.6.1 + rev: 0.7.1 hooks: - id: nbstripout - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.1.11 + rev: v0.3.4 hooks: # Run the linter. - id: ruff diff --git a/src/aiidalab_qe/__init__.py b/src/aiidalab_qe/__init__.py index 7ed200493..1331bdcde 100644 --- a/src/aiidalab_qe/__init__.py +++ b/src/aiidalab_qe/__init__.py @@ -1,6 +1,7 @@ """Package for the AiiDAlab QE app version. Plugin (workflow) version will be read from the plugin's __init__.py file. """ + from aiidalab_qe.version import __version__ __all__ = [ diff --git a/src/aiidalab_qe/__main__.py b/src/aiidalab_qe/__main__.py index 703016968..b093b030a 100644 --- a/src/aiidalab_qe/__main__.py +++ b/src/aiidalab_qe/__main__.py @@ -1,5 +1,4 @@ -"""For running the app from the command line used for post_install script. -""" +"""For running the app from the command line used for post_install script.""" from pathlib import Path diff --git a/src/aiidalab_qe/app/configuration/__init__.py b/src/aiidalab_qe/app/configuration/__init__.py index 67c8981a8..ff28a9402 100644 --- a/src/aiidalab_qe/app/configuration/__init__.py +++ b/src/aiidalab_qe/app/configuration/__init__.py @@ -3,6 +3,7 @@ Authors: AiiDAlab team """ + from __future__ import annotations import ipywidgets as ipw diff --git a/src/aiidalab_qe/app/configuration/advanced.py b/src/aiidalab_qe/app/configuration/advanced.py index 99becc4fd..0140685f2 100644 --- a/src/aiidalab_qe/app/configuration/advanced.py +++ b/src/aiidalab_qe/app/configuration/advanced.py @@ -3,6 +3,7 @@ Authors: AiiDAlab team """ + import os import ipywidgets as ipw @@ -267,40 +268,40 @@ def get_panel_value(self): parameters["pseudo_family"] = self.pseudo_family_selector.value if self.pseudo_setter.pseudos: parameters["pw"]["pseudos"] = self.pseudo_setter.pseudos - parameters["pw"]["parameters"]["SYSTEM"][ - "ecutwfc" - ] = self.pseudo_setter.ecutwfc - parameters["pw"]["parameters"]["SYSTEM"][ - "ecutrho" - ] = self.pseudo_setter.ecutrho + parameters["pw"]["parameters"]["SYSTEM"]["ecutwfc"] = ( + self.pseudo_setter.ecutwfc + ) + parameters["pw"]["parameters"]["SYSTEM"]["ecutrho"] = ( + self.pseudo_setter.ecutrho + ) # if override is not ticked, use the default value parameters["pw"]["parameters"]["SYSTEM"]["tot_charge"] = self.total_charge.value if self.van_der_waals.value in ["none", "ts-vdw"]: - parameters["pw"]["parameters"]["SYSTEM"][ - "vdw_corr" - ] = self.van_der_waals.value + parameters["pw"]["parameters"]["SYSTEM"]["vdw_corr"] = ( + self.van_der_waals.value + ) else: parameters["pw"]["parameters"]["SYSTEM"]["vdw_corr"] = "dft-d3" - parameters["pw"]["parameters"]["SYSTEM"][ - "dftd3_version" - ] = self.dftd3_version[self.van_der_waals.value] + parameters["pw"]["parameters"]["SYSTEM"]["dftd3_version"] = ( + self.dftd3_version[self.van_der_waals.value] + ) # there are two choose, use link or parent if self.spin_type == "collinear": - parameters[ - "initial_magnetic_moments" - ] = self.magnetization.get_magnetization() + parameters["initial_magnetic_moments"] = ( + self.magnetization.get_magnetization() + ) parameters["kpoints_distance"] = self.value.get("kpoints_distance") if self.electronic_type == "metal": # smearing type setting - parameters["pw"]["parameters"]["SYSTEM"][ - "smearing" - ] = self.smearing.smearing_value + parameters["pw"]["parameters"]["SYSTEM"]["smearing"] = ( + self.smearing.smearing_value + ) # smearing degauss setting - parameters["pw"]["parameters"]["SYSTEM"][ - "degauss" - ] = self.smearing.degauss_value + parameters["pw"]["parameters"]["SYSTEM"]["degauss"] = ( + self.smearing.degauss_value + ) return parameters diff --git a/src/aiidalab_qe/app/configuration/workflow.py b/src/aiidalab_qe/app/configuration/workflow.py index 444213630..c7ccd5001 100644 --- a/src/aiidalab_qe/app/configuration/workflow.py +++ b/src/aiidalab_qe/app/configuration/workflow.py @@ -3,6 +3,7 @@ Authors: AiiDAlab team """ + import ipywidgets as ipw from aiida_quantumespresso.common.types import RelaxType diff --git a/src/aiidalab_qe/app/result/summary_viewer.py b/src/aiidalab_qe/app/result/summary_viewer.py index 1340eefcd..59f12e2c6 100644 --- a/src/aiidalab_qe/app/result/summary_viewer.py +++ b/src/aiidalab_qe/app/result/summary_viewer.py @@ -130,9 +130,9 @@ def generate_report_parameters(qeapp_wc): )["bands_kpoints_distance"] if "pdos" in qeapp_wc.inputs: - report[ - "nscf_kpoints_distance" - ] = qeapp_wc.inputs.pdos.nscf.kpoints_distance.value + report["nscf_kpoints_distance"] = ( + qeapp_wc.inputs.pdos.nscf.kpoints_distance.value + ) return report diff --git a/src/aiidalab_qe/app/submission/__init__.py b/src/aiidalab_qe/app/submission/__init__.py index ba9d23d37..478ebbf02 100644 --- a/src/aiidalab_qe/app/submission/__init__.py +++ b/src/aiidalab_qe/app/submission/__init__.py @@ -3,6 +3,7 @@ Authors: AiiDAlab team """ + from __future__ import annotations import os diff --git a/src/aiidalab_qe/app/submission/resource.py b/src/aiidalab_qe/app/submission/resource.py index 3d3e5fb9b..a12bc173c 100644 --- a/src/aiidalab_qe/app/submission/resource.py +++ b/src/aiidalab_qe/app/submission/resource.py @@ -3,6 +3,7 @@ Authors: AiiDAlab team """ + import ipywidgets as ipw diff --git a/src/aiidalab_qe/common/bandpdoswidget.py b/src/aiidalab_qe/common/bandpdoswidget.py index 16909e42b..540c2c647 100644 --- a/src/aiidalab_qe/common/bandpdoswidget.py +++ b/src/aiidalab_qe/common/bandpdoswidget.py @@ -816,8 +816,8 @@ def get_bands_labeling(bandsdata: dict) -> list: UNICODE_SYMBOL = { "GAMMA": "\u0393", "DELTA": "\u0394", - "LAMBDA": "\u039B", - "SIGMA": "\u03A3", + "LAMBDA": "\u039b", + "SIGMA": "\u03a3", "EPSILON": "\u0395", } paths = bandsdata.get("paths") diff --git a/src/aiidalab_qe/common/panel.py b/src/aiidalab_qe/common/panel.py index 2a88d486e..ca414cb6b 100644 --- a/src/aiidalab_qe/common/panel.py +++ b/src/aiidalab_qe/common/panel.py @@ -5,6 +5,7 @@ AiiDAlab Team """ + import ipywidgets as ipw DEFAULT_PARAMETERS = {} diff --git a/src/aiidalab_qe/common/process.py b/src/aiidalab_qe/common/process.py index e68a5404f..b1c2ea34a 100644 --- a/src/aiidalab_qe/common/process.py +++ b/src/aiidalab_qe/common/process.py @@ -1,4 +1,5 @@ """Widgets related to process management.""" + from dataclasses import make_dataclass import ipywidgets as ipw diff --git a/src/aiidalab_qe/plugins/bands/result.py b/src/aiidalab_qe/plugins/bands/result.py index e24c76d7e..03b7630cd 100644 --- a/src/aiidalab_qe/plugins/bands/result.py +++ b/src/aiidalab_qe/plugins/bands/result.py @@ -1,6 +1,5 @@ -"""Bands results view widgets +"""Bands results view widgets""" -""" from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.common.panel import ResultPanel diff --git a/src/aiidalab_qe/plugins/bands/setting.py b/src/aiidalab_qe/plugins/bands/setting.py index b664bc2a4..5d3b06da8 100644 --- a/src/aiidalab_qe/plugins/bands/setting.py +++ b/src/aiidalab_qe/plugins/bands/setting.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- """Panel for Bands plugin.""" + import ipywidgets as ipw from aiidalab_qe.common.panel import Panel diff --git a/src/aiidalab_qe/plugins/pdos/result.py b/src/aiidalab_qe/plugins/pdos/result.py index db46484b8..b20d58d47 100644 --- a/src/aiidalab_qe/plugins/pdos/result.py +++ b/src/aiidalab_qe/plugins/pdos/result.py @@ -1,6 +1,4 @@ -"""PDOS results view widgets - -""" +"""PDOS results view widgets""" from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.common.panel import ResultPanel diff --git a/src/aiidalab_qe/plugins/pdos/setting.py b/src/aiidalab_qe/plugins/pdos/setting.py index 1edcd00cc..302bd0457 100644 --- a/src/aiidalab_qe/plugins/pdos/setting.py +++ b/src/aiidalab_qe/plugins/pdos/setting.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- """Panel for Pdos plugin.""" + import ipywidgets as ipw import traitlets as tl from aiida import orm diff --git a/src/aiidalab_qe/plugins/xas/result.py b/src/aiidalab_qe/plugins/xas/result.py index c6874c09d..97dd7ec13 100644 --- a/src/aiidalab_qe/plugins/xas/result.py +++ b/src/aiidalab_qe/plugins/xas/result.py @@ -1,6 +1,5 @@ -"""XAS results view widgets +"""XAS results view widgets""" -""" import base64 import hashlib from typing import Callable diff --git a/src/aiidalab_qe/plugins/xas/setting.py b/src/aiidalab_qe/plugins/xas/setting.py index 55b6ccb36..2d9b52535 100644 --- a/src/aiidalab_qe/plugins/xas/setting.py +++ b/src/aiidalab_qe/plugins/xas/setting.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- -"""Panel for XAS plugin. +"""Panel for XAS plugin.""" -""" import os import tarfile from importlib import resources diff --git a/src/aiidalab_qe/plugins/xps/result.py b/src/aiidalab_qe/plugins/xps/result.py index 7931be4cf..3c0016c99 100644 --- a/src/aiidalab_qe/plugins/xps/result.py +++ b/src/aiidalab_qe/plugins/xps/result.py @@ -1,6 +1,5 @@ -"""XPS results view widgets +"""XPS results view widgets""" -""" import ipywidgets as ipw from aiidalab_qe.common.panel import ResultPanel diff --git a/src/aiidalab_qe/plugins/xps/setting.py b/src/aiidalab_qe/plugins/xps/setting.py index 6e7d2cdf9..0f2077244 100644 --- a/src/aiidalab_qe/plugins/xps/setting.py +++ b/src/aiidalab_qe/plugins/xps/setting.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- -"""Panel for XPS plugin. +"""Panel for XPS plugin.""" -""" import ipywidgets as ipw import traitlets as tl from aiida.orm import Group, QueryBuilder, StructureData diff --git a/tests/test_configure.py b/tests/test_configure.py index 3885dc789..5f6135e4f 100644 --- a/tests/test_configure.py +++ b/tests/test_configure.py @@ -39,9 +39,9 @@ def test_set_configuration_parameters(): new_parameters = wg.get_configuration_parameters() assert parameters == new_parameters # test pseudodojo - parameters["advanced"][ - "pseudo_family" - ] = f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/SR/standard/upf" + parameters["advanced"]["pseudo_family"] = ( + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/SR/standard/upf" + ) wg.set_configuration_parameters(parameters) new_parameters = wg.get_configuration_parameters() assert parameters == new_parameters From 97c9c10f46e57f3b1135851cad76576711ee7fba Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Wed, 3 Apr 2024 14:22:56 +0200 Subject: [PATCH 048/166] Add HP code and LiCoO2 example (#655) * add hp code and LiCoO2 example * add default code for xspectra and pp --- src/aiidalab_qe/app/parameters/qeapp.yaml | 3 ++ src/aiidalab_qe/app/structure/__init__.py | 1 + .../app/structure/examples/LiCoO2.cif | 29 +++++++++++++++++++ src/aiidalab_qe/common/setup_codes.py | 1 + 4 files changed, 34 insertions(+) create mode 100644 src/aiidalab_qe/app/structure/examples/LiCoO2.cif diff --git a/src/aiidalab_qe/app/parameters/qeapp.yaml b/src/aiidalab_qe/app/parameters/qeapp.yaml index 616f4286c..e553edf28 100644 --- a/src/aiidalab_qe/app/parameters/qeapp.yaml +++ b/src/aiidalab_qe/app/parameters/qeapp.yaml @@ -28,3 +28,6 @@ codes: dos: dos-7.2@localhost projwfc: projwfc-7.2@localhost pw: pw-7.2@localhost + pp: pp-7.2@localhost + xspectra: xspectra-7.2@localhost + hp: hp-7.2@localhost diff --git a/src/aiidalab_qe/app/structure/__init__.py b/src/aiidalab_qe/app/structure/__init__.py index 2fa9b2aa7..f5cc2f60d 100644 --- a/src/aiidalab_qe/app/structure/__init__.py +++ b/src/aiidalab_qe/app/structure/__init__.py @@ -35,6 +35,7 @@ ("Lithium carbonate", file_path / "examples" / "Li2CO3.cif"), ("Phenylacetylene molecule", file_path / "examples" / "Phenylacetylene.xyz"), ("ETFA molecule", file_path / "examples" / "ETFA.xyz"), + ("LiCoO2", file_path / "examples" / "LiCoO2.cif"), ] diff --git a/src/aiidalab_qe/app/structure/examples/LiCoO2.cif b/src/aiidalab_qe/app/structure/examples/LiCoO2.cif new file mode 100644 index 000000000..71b6ce33b --- /dev/null +++ b/src/aiidalab_qe/app/structure/examples/LiCoO2.cif @@ -0,0 +1,29 @@ +data_image0 +_chemical_formula_structural CoO2Li +_chemical_formula_sum "Co1 O2 Li1" +_cell_length_a 4.95865 +_cell_length_b 4.95865 +_cell_length_c 4.95865 +_cell_angle_alpha 32.9927 +_cell_angle_beta 32.9927 +_cell_angle_gamma 32.9927 + +_space_group_name_H-M_alt "P 1" +_space_group_IT_number 1 + +loop_ + _space_group_symop_operation_xyz + 'x, y, z' + +loop_ + _atom_site_type_symbol + _atom_site_label + _atom_site_symmetry_multiplicity + _atom_site_fract_x + _atom_site_fract_y + _atom_site_fract_z + _atom_site_occupancy + Co Co1 1.0 0.00000 0.00000 0.00000 1.0000 + O O1 1.0 0.26049 0.26049 0.26049 1.0000 + O O2 1.0 0.73945 0.73946 0.73945 1.0000 + Li Li1 1.0 0.50000 0.50000 0.50000 1.0000 diff --git a/src/aiidalab_qe/common/setup_codes.py b/src/aiidalab_qe/common/setup_codes.py index bfa95a8f3..6092c6bac 100644 --- a/src/aiidalab_qe/common/setup_codes.py +++ b/src/aiidalab_qe/common/setup_codes.py @@ -41,6 +41,7 @@ "pw2wannier90", "q2r", "xspectra", + "hp", ) From 2c5ca5543ed3f63707936e3dcc2b3610774b46c8 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Fri, 5 Apr 2024 14:43:53 +0200 Subject: [PATCH 049/166] Fix tot magnetization (#512) * updating Magnetization widget, and including logic for insulator * adapting logic of bands and pdos for bandspdoswidget * starting_magnetization as default --- src/aiidalab_qe/app/configuration/advanced.py | 146 ++++++++++++++---- src/aiidalab_qe/app/result/summary_viewer.py | 4 + .../app/static/workflow_summary.jinja | 8 + src/aiidalab_qe/common/bandpdoswidget.py | 115 +++++++++++--- src/aiidalab_qe/plugins/bands/workchain.py | 5 + src/aiidalab_qe/plugins/pdos/workchain.py | 7 + src/aiidalab_qe/workflows/__init__.py | 9 ++ tests/conftest.py | 20 ++- tests/test_result.py | 2 +- tests/test_result/test_summary_report.yml | 1 + 10 files changed, 260 insertions(+), 57 deletions(-) diff --git a/src/aiidalab_qe/app/configuration/advanced.py b/src/aiidalab_qe/app/configuration/advanced.py index 0140685f2..ad2b33264 100644 --- a/src/aiidalab_qe/app/configuration/advanced.py +++ b/src/aiidalab_qe/app/configuration/advanced.py @@ -211,6 +211,11 @@ def _update_input_structure(self, change): self.magnetization.input_structure = None self.pseudo_setter.structure = None + @tl.observe("electronic_type") + def _electronic_type_changed(self, change): + """Input electronic_type changed, update the widget values.""" + self.magnetization.electronic_type = change["new"] + @tl.observe("protocol") def _protocol_changed(self, _): """Input protocol changed, update the widget values.""" @@ -255,17 +260,16 @@ def get_panel_value(self): # XXX: start from parameters = {} and then bundle the settings by purposes (e.g. pw, bands, etc.) parameters = { "initial_magnetic_moments": None, - "pw": { - "parameters": { - "SYSTEM": {}, - }, - }, + "pw": {"parameters": {"SYSTEM": {}}}, + "clean_workdir": self.clean_workdir.value, + "pseudo_family": self.pseudo_family_selector.value, + "kpoints_distance": self.value.get("kpoints_distance"), } - # add clean_workdir to the parameters - parameters["clean_workdir"] = self.clean_workdir.value - # add the pseudo_family to the parameters - parameters["pseudo_family"] = self.pseudo_family_selector.value + # Set total charge + parameters["pw"]["parameters"]["SYSTEM"]["tot_charge"] = self.total_charge.value + + # Set the pseudos if self.pseudo_setter.pseudos: parameters["pw"]["pseudos"] = self.pseudo_setter.pseudos parameters["pw"]["parameters"]["SYSTEM"]["ecutwfc"] = ( @@ -303,8 +307,35 @@ def get_panel_value(self): self.smearing.degauss_value ) + # Set tot_magnetization for collinear simulations. + if self.spin_type == "collinear": + # Conditions for metallic systems. Select the magnetization type and set the value if override is True + if self.electronic_type == "metal" and self.override.value is True: + self.set_metallic_magnetization(parameters) + # Conditions for insulator systems. Default value is 0.0 + elif self.electronic_type == "insulator": + self.set_insulator_magnetization(parameters) + return parameters + def set_insulator_magnetization(self, parameters): + """Set the parameters for collinear insulator calculation. Total magnetization.""" + parameters["pw"]["parameters"]["SYSTEM"]["tot_magnetization"] = ( + self.magnetization.tot_magnetization.value + ) + + def set_metallic_magnetization(self, parameters): + """Set the parameters for magnetization calculation in metals""" + magnetization_type = self.magnetization.magnetization_type.value + if magnetization_type == "tot_magnetization": + parameters["pw"]["parameters"]["SYSTEM"]["tot_magnetization"] = ( + self.magnetization.tot_magnetization.value + ) + else: + parameters["initial_magnetic_moments"] = ( + self.magnetization.get_magnetization() + ) + def set_panel_value(self, parameters): """Set the panel value from the given parameters.""" @@ -338,11 +369,18 @@ def set_panel_value(self, parameters): parameters["pw"]["parameters"]["SYSTEM"].get("vdw_corr", "none"), ) + # Logic to set the magnetization if parameters.get("initial_magnetic_moments"): self.magnetization._set_magnetization_values( parameters.get("initial_magnetic_moments") ) + if "tot_magnetization" in parameters["pw"]["parameters"]["SYSTEM"]: + self.magnetization.magnetization_type.value = "tot_magnetization" + self.magnetization._set_tot_magnetization( + parameters["pw"]["parameters"]["SYSTEM"]["tot_magnetization"] + ) + def reset(self): """Reset the widget and the traitlets""" @@ -363,7 +401,11 @@ def reset(self): self.override.value = False self.smearing.reset() # reset the pseudo setter - self.pseudo_setter._reset() + if self.input_structure is None: + self.pseudo_setter.structure = None + self.pseudo_setter._reset() + else: + self.pseudo_setter._reset() # reset the magnetization self.magnetization.reset() # reset mesh grid @@ -387,10 +429,13 @@ def _display_mesh(self, _=None): class MagnetizationSettings(ipw.VBox): - """Widget to set the initial magnetic moments for each kind names defined in the StructureData (StructureDtaa.get_kind_names()) + """Widget to set the type of magnetization used in the calculation: + 1) Tot_magnetization: Total majority spin charge - minority spin charge. + 2) Starting magnetization: Starting spin polarization on atomic type 'i' in a spin polarized (LSDA or noncollinear/spin-orbit) calculation. + + For Starting magnetization you can set each kind names defined in the StructureData (StructureDtaa.get_kind_names()) Usually these are the names of the elements in the StructureData (For example 'C' , 'N' , 'Fe' . However the StructureData can have defined kinds like 'Fe1' and 'Fe2') - The widget generate a dictionary that can be used to set initial_magnetic_moments in the builder of PwBaseWorkChain Attributes: @@ -398,30 +443,45 @@ class MagnetizationSettings(ipw.VBox): """ input_structure = tl.Instance(orm.StructureData, allow_none=True) - + electronic_type = tl.Unicode() disabled = tl.Bool() + _DEFAULT_TOT_MAGNETIZATION = 0.0 + _DEFAULT_DESCRIPTION = "Magnetization: Input structure not confirmed" def __init__(self, **kwargs): self.input_structure = orm.StructureData() self.input_structure_labels = [] - self.description = ipw.HTML( - "Define magnetization: Input structure not confirmed" + self.tot_magnetization = ipw.BoundedIntText( + min=0, + max=100, + step=1, + value=self._DEFAULT_TOT_MAGNETIZATION, + disabled=True, + description="Total magnetization:", + style={"description_width": "initial"}, + ) + self.magnetization_type = ipw.ToggleButtons( + options=[ + ("Starting Magnetization", "starting_magnetization"), + ("Tot. Magnetization", "tot_magnetization"), + ], + value="starting_magnetization", + style={"description_width": "initial"}, ) + self.description = ipw.HTML(self._DEFAULT_DESCRIPTION) self.kinds = self.create_kinds_widget() self.kinds_widget_out = ipw.Output() + self.magnetization_out = ipw.Output() + self.magnetization_type.observe(self._render, "value") super().__init__( children=[ - ipw.HBox( - [ - self.description, - self.kinds_widget_out, - ], - ), + self.description, + self.magnetization_out, + self.kinds_widget_out, ], layout=ipw.Layout(justify_content="space-between"), **kwargs, ) - self.display_kinds() @tl.observe("disabled") def _disabled_changed(self, _): @@ -429,19 +489,19 @@ def _disabled_changed(self, _): if hasattr(self.kinds, "children") and self.kinds.children: for i in range(len(self.kinds.children)): self.kinds.children[i].disabled = self.disabled + self.tot_magnetization.disabled = self.disabled + self.magnetization_type.disabled = self.disabled def reset(self): self.disabled = True + self.tot_magnetization.value = self._DEFAULT_TOT_MAGNETIZATION + # if self.input_structure is None: - self.description.value = ( - "Define magnetization: Input structure not confirmed" - ) + self.description.value = self._DEFAULT_DESCRIPTION self.kinds = None - with self.kinds_widget_out: - clear_output() - else: - self.update_kinds_widget() + self.description.value = "Magnetization" + self.kinds = self.create_kinds_widget() def create_kinds_widget(self): if self.input_structure_labels: @@ -462,11 +522,30 @@ def create_kinds_widget(self): return kinds_widget + @tl.observe("electronic_type") + def _electronic_type_changed(self, change): + with self.magnetization_out: + clear_output() + if change["new"] == "metal": + display(self.magnetization_type) + self._render({"new": self.magnetization_type.value}) + else: + display(self.tot_magnetization) + with self.kinds_widget_out: + clear_output() + def update_kinds_widget(self): self.input_structure_labels = self.input_structure.get_kind_names() self.kinds = self.create_kinds_widget() - self.description.value = "Define magnetization: " - self.display_kinds() + self.description.value = "Magnetization" + + def _render(self, value): + if value["new"] == "tot_magnetization": + with self.kinds_widget_out: + clear_output() + display(self.tot_magnetization) + else: + self.display_kinds() def display_kinds(self): if "PYTEST_CURRENT_TEST" not in os.environ and self.kinds: @@ -477,6 +556,7 @@ def display_kinds(self): def _update_widget(self, change): self.input_structure = change["new"] self.update_kinds_widget() + self.display_kinds() def get_magnetization(self): """Method to generate the dictionary with the initial magnetic moments""" @@ -497,6 +577,10 @@ def _set_magnetization_values(self, magnetic_moments): else: self.kinds.children[i].value = magnetic_moments + def _set_tot_magnetization(self, tot_magnetization): + """Set the total magnetization""" + self.tot_magnetization.value = tot_magnetization + class SmearingSettings(ipw.VBox): # accept protocol as input and set the values diff --git a/src/aiidalab_qe/app/result/summary_viewer.py b/src/aiidalab_qe/app/result/summary_viewer.py index 59f12e2c6..95840dd00 100644 --- a/src/aiidalab_qe/app/result/summary_viewer.py +++ b/src/aiidalab_qe/app/result/summary_viewer.py @@ -123,6 +123,10 @@ def generate_report_parameters(qeapp_wc): report["periodicity"] = PERIODICITY_MAPPING.get( qeapp_wc.inputs.structure.pbc, "xyz" ) + report["tot_magnetization"] = pw_parameters["SYSTEM"].get( + "tot_magnetization", False + ) + # hard code bands and pdos if "bands" in qeapp_wc.inputs: report["bands_kpoints_distance"] = PwBandsWorkChain.get_protocol_inputs( diff --git a/src/aiidalab_qe/app/static/workflow_summary.jinja b/src/aiidalab_qe/app/static/workflow_summary.jinja index 33630127d..dd54e3718 100644 --- a/src/aiidalab_qe/app/static/workflow_summary.jinja +++ b/src/aiidalab_qe/app/static/workflow_summary.jinja @@ -104,10 +104,18 @@ + + {% if tot_magnetization %} + + + + + {% else %} + {% endif %}
Core-levelValue (eV)
{core_level}{sign}{exp}
Van der Waals Correction {{ vdw_corr }}
Total magnetization{{ tot_magnetization }}
Initial Magnetic Moments {{ initial_magnetic_moments }}

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 z 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/images/XAS_Plugin_Result_Panel-Carbon-Annotated-Cropped.png b/docs/source/_static/images/XAS_Plugin_Result_Panel-Carbon-Annotated-Cropped.png new file mode 100644 index 0000000000000000000000000000000000000000..e54106f161e6e5e35e13be27eff7cb5d6e47d1d9 GIT binary patch literal 2250975 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

diff --git a/src/aiidalab_qe/common/bandpdoswidget.py b/src/aiidalab_qe/common/bandpdoswidget.py index 540c2c647..04d43a1b5 100644 --- a/src/aiidalab_qe/common/bandpdoswidget.py +++ b/src/aiidalab_qe/common/bandpdoswidget.py @@ -43,12 +43,21 @@ def __init__(self, bands_data=None, pdos_data=None): self._dos_yaxis = self._dos_yaxis() def _get_fermi_energy(self): - fermi_energy = ( - self.pdos_data["fermi_energy"] - if self.pdos_data - else self.bands_data["fermi_energy"] - ) - return fermi_energy + """Function to return the Fermi energy information depending on the data available.""" + fermi_data = {} + if self.pdos_data: + if "fermi_energy_up" in self.pdos_data: + fermi_data["fermi_energy_up"] = self.pdos_data["fermi_energy_up"] + fermi_data["fermi_energy_down"] = self.pdos_data["fermi_energy_down"] + else: + fermi_data["fermi_energy"] = self.pdos_data["fermi_energy"] + else: + if "fermi_energy_up" in self.bands_data: + fermi_data["fermi_energy_up"] = self.bands_data["fermi_energy_up"] + fermi_data["fermi_energy_down"] = self.bands_data["fermi_energy_down"] + else: + fermi_data["fermi_energy"] = self.bands_data["fermi_energy"] + return fermi_data def _band_xaxis(self): """Function to return the xaxis for the bands plot.""" @@ -267,7 +276,7 @@ def _add_band_traces(self, fig, paths, plot_type): scatter_objects.append( go.Scatter( x=band["x"], - y=bands_np - self.fermi_energy, + y=bands_np - self.fermi_energy["fermi_energy"], mode="lines", line=dict( color=self.SETTINGS["bands_linecolor"], @@ -286,16 +295,15 @@ def _add_band_traces(self, fig, paths, plot_type): color_first_half = self.SETTINGS["bands_up_linecolor"] # Blue line for the Spin down color_second_half = self.SETTINGS["bands_down_linecolor"] - - for bands, color in zip( - (first_half, second_half), (color_first_half, color_second_half) - ): - for band_values in bands: - bands_np = np.array(band_values) + if "fermi_energy" in self.fermi_energy: + for bands, color in zip( + (first_half, second_half), (color_first_half, color_second_half) + ): + bands_np = np.array(bands) scatter_objects.append( go.Scatter( x=band["x"], - y=bands_np - self.fermi_energy, + y=bands_np - self.fermi_energy["fermi_energy"], mode="lines", line=dict( color=color, @@ -305,6 +313,30 @@ def _add_band_traces(self, fig, paths, plot_type): showlegend=False, ) ) + else: + for bands, color, fermi_energy in zip( + (first_half, second_half), + (color_first_half, color_second_half), + ( + self.fermi_energy["fermi_energy_up"], + self.fermi_energy["fermi_energy_down"], + ), + ): + for band_values in bands: + bands_np = np.array(band_values) + scatter_objects.append( + go.Scatter( + x=band["x"], + y=bands_np - fermi_energy, + mode="lines", + line=dict( + color=color, + shape="spline", + smoothing=1.3, + ), + showlegend=False, + ) + ) if plot_type == "bands_only": fig.add_traces(scatter_objects) @@ -325,12 +357,41 @@ def _add_dos_traces(self, fig, plot_type): for i, trace in enumerate(dos_data): dos_np = np.array(trace["x"]) fill = "tozerox" if plot_type == "combined" else "tozeroy" - x_data = ( - trace["y"] if plot_type == "combined" else dos_np - self.fermi_energy - ) - y_data = ( - dos_np - self.fermi_energy if plot_type == "combined" else trace["y"] - ) + + if "fermi_energy" in self.fermi_energy: + y_data = ( + dos_np - self.fermi_energy["fermi_energy"] + if plot_type == "combined" + else trace["y"] + ) + x_data = ( + trace["y"] + if plot_type == "combined" + else dos_np - self.fermi_energy["fermi_energy"] + ) + else: + if trace["label"].endswith("(↑)"): + y_data = ( + dos_np - self.fermi_energy["fermi_energy_up"] + if plot_type == "combined" + else trace["y"] + ) + x_data = ( + trace["y"] + if plot_type == "combined" + else dos_np - self.fermi_energy["fermi_energy_up"] + ) + else: + y_data = ( + dos_np - self.fermi_energy["fermi_energy_down"] + if plot_type == "combined" + else trace["y"] + ) + x_data = ( + trace["y"] + if plot_type == "combined" + else dos_np - self.fermi_energy["fermi_energy_down"] + ) scatter_objects[i] = go.Scatter( x=x_data, y=y_data, @@ -632,9 +693,15 @@ def get_pdos_data(pdos, group_tag, plot_tag, selected_atoms): ) data_dict = { - "fermi_energy": pdos.nscf.output_parameters["fermi_energy"], "dos": dos, } + if "fermi_energy_up" in pdos.nscf.output_parameters: + data_dict["fermi_energy_up"] = pdos.nscf.output_parameters["fermi_energy_up"] + data_dict["fermi_energy_down"] = pdos.nscf.output_parameters[ + "fermi_energy_down" + ] + else: + data_dict["fermi_energy"] = pdos.nscf.output_parameters["fermi_energy"] return json.loads(json.dumps(data_dict)) @@ -802,7 +869,11 @@ def export_bands_data(outputs, fermi_energy=None): data = json.loads(outputs.band_structure._exportcontent("json", comments=False)[0]) # The fermi energy from band calculation is not robust. - data["fermi_energy"] = outputs.band_parameters["fermi_energy"] or fermi_energy + if "fermi_energy_up" in outputs.band_parameters: + data["fermi_energy_up"] = outputs.band_parameters["fermi_energy_up"] + data["fermi_energy_down"] = outputs.band_parameters["fermi_energy_down"] + else: + data["fermi_energy"] = outputs.band_parameters["fermi_energy"] or fermi_energy data["pathlabels"] = get_bands_labeling(data) return data diff --git a/src/aiidalab_qe/plugins/bands/workchain.py b/src/aiidalab_qe/plugins/bands/workchain.py index 484ec082f..e60c611f4 100644 --- a/src/aiidalab_qe/plugins/bands/workchain.py +++ b/src/aiidalab_qe/plugins/bands/workchain.py @@ -217,6 +217,11 @@ def get_builder(codes, structure, parameters, **kwargs): bands.pop("relax") bands.pop("structure", None) bands.pop("clean_workdir", None) + + if scf_overrides["pw"]["parameters"]["SYSTEM"].get("tot_magnetization") is not None: + bands.scf["pw"]["parameters"]["SYSTEM"].pop("starting_magnetization", None) + bands.bands["pw"]["parameters"]["SYSTEM"].pop("starting_magnetization", None) + return bands diff --git a/src/aiidalab_qe/plugins/pdos/workchain.py b/src/aiidalab_qe/plugins/pdos/workchain.py index bd9915f2e..b0c8325e7 100644 --- a/src/aiidalab_qe/plugins/pdos/workchain.py +++ b/src/aiidalab_qe/plugins/pdos/workchain.py @@ -66,6 +66,13 @@ def get_builder(codes, structure, parameters, **kwargs): # pop the inputs that are exclueded from the expose_inputs pdos.pop("structure", None) pdos.pop("clean_workdir", None) + + if ( + scf_overrides["pw"]["parameters"]["SYSTEM"].get("tot_magnetization") + is not None + ): + pdos.scf["pw"]["parameters"]["SYSTEM"].pop("starting_magnetization", None) + pdos.nscf["pw"]["parameters"]["SYSTEM"].pop("starting_magnetization", None) else: raise ValueError("The dos_code and projwfc_code are required.") return pdos diff --git a/src/aiidalab_qe/workflows/__init__.py b/src/aiidalab_qe/workflows/__init__.py index ac292cb4a..c2d002815 100644 --- a/src/aiidalab_qe/workflows/__init__.py +++ b/src/aiidalab_qe/workflows/__init__.py @@ -146,6 +146,15 @@ def get_builder_from_protocol( relax_builder.pop("base_final_scf", None) # never run a final scf builder.relax = relax_builder + # remove starting magnetization if tot_magnetization is set + if ( + relax_builder["base"]["pw"]["parameters"]["SYSTEM"].get("tot_magnetization") + is not None + ): + builder.relax["base"]["pw"]["parameters"]["SYSTEM"].pop( + "starting_magnetization", None + ) + if properties is None: properties = [] builder.properties = orm.List(list=properties) diff --git a/tests/conftest.py b/tests/conftest.py index a83ac32cf..cca1ed0d0 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -603,7 +603,10 @@ def _generate_qeapp_workchain( run_bands=True, run_pdos=True, spin_type="none", + electronic_type="metal", + magnetization_type="starting_magnetization", # Options: "starting_magnetization", "tot_magnetization" initial_magnetic_moments=0.0, + tot_magnetization=0.0, ): from copy import deepcopy @@ -635,9 +638,20 @@ def _generate_qeapp_workchain( s2.workchain_settings.properties["pdos"].run.value = run_pdos s2.workchain_settings.workchain_protocol.value = "fast" s2.workchain_settings.spin_type.value = spin_type - s2.advanced_settings.magnetization._set_magnetization_values( - initial_magnetic_moments - ) + s2.workchain_settings.electronic_type.value = electronic_type + if spin_type == "collinear": + s2.advanced_settings.override.value = True + magnetization_values = ( + initial_magnetic_moments + if magnetization_type == "starting_magnetization" + else tot_magnetization + ) + s2.advanced_settings.magnetization._set_tot_magnetization( + tot_magnetization + ) if electronic_type == "insulator" else s2.advanced_settings.magnetization._set_magnetization_values( + magnetization_values + ) + s2.confirm() # step 3 setup code and resources s3: SubmitQeAppWorkChainStep = app.submit_step diff --git a/tests/test_result.py b/tests/test_result.py index 7fca7ba85..c6e087d17 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -34,7 +34,7 @@ def test_summary_report_advanced_settings(data_regression, generate_qeapp_workch from aiidalab_qe.app.result.summary_viewer import SummaryView wkchain = generate_qeapp_workchain( - spin_type="collinear", initial_magnetic_moments=0.1 + spin_type="collinear", electronic_type="metal", initial_magnetic_moments=0.1 ) viewer = SummaryView(wkchain.node) report = viewer.report diff --git a/tests/test_result/test_summary_report.yml b/tests/test_result/test_summary_report.yml index 734ec9e11..d41f91b10 100644 --- a/tests/test_result/test_summary_report.yml +++ b/tests/test_result/test_summary_report.yml @@ -27,4 +27,5 @@ relaxed: positions_cell scf_kpoints_distance: 0.5 smearing: cold tot_charge: 0.0 +tot_magnetization: false vdw_corr: none From 0aab1e65dd0733c4f3f636d5a0263b7995b4d7f1 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Fri, 5 Apr 2024 19:00:09 +0200 Subject: [PATCH 050/166] Add plugin list page (#646) To help users easily find and manage the plugins, this PR adds a new plugin list page. ## Plugin registry User can add their plugin entry point into the `plugins.yaml` file in this repository. ## Home page On the home page, I added a new **Preference** section on the right side of the logo. ## Plugin list page The UI has the following features: - **Accordion Display for Plugins**: Each plugin is listed within an accordion-style component. This design keeps the interface clean and organized, allowing users to quickly scan through available plugins. The accordion's title bar displays essential information: - Plugin Name: Clearly indicates the name of the plugin for easy identification. - Installation Status: An icon indicator shows whether the plugin is currently installed. - **Expandable Details**: Users can interact with the accordion to expand it, revealing more detailed information about each plugin. - **Install button and remove button.** --- docs/source/development/index.rst | 1 + docs/source/development/plugin.rst | 4 + docs/source/development/plugin_registry.rst | 46 +++++ plugin_list.ipynb | 196 ++++++++++++++++++++ plugins.yaml | 17 ++ start.py | 9 + 6 files changed, 273 insertions(+) create mode 100644 docs/source/development/plugin_registry.rst create mode 100644 plugin_list.ipynb create mode 100644 plugins.yaml diff --git a/docs/source/development/index.rst b/docs/source/development/index.rst index b81d49d9e..712b0d37e 100644 --- a/docs/source/development/index.rst +++ b/docs/source/development/index.rst @@ -11,3 +11,4 @@ This guide explains the architecture of the application and how to extend the fu architecture plugin + plugin_registry diff --git a/docs/source/development/plugin.rst b/docs/source/development/plugin.rst index 0f885e421..06a6b3254 100644 --- a/docs/source/development/plugin.rst +++ b/docs/source/development/plugin.rst @@ -362,4 +362,8 @@ Further Reading QuantumESPRESSO app comes with several built-in plugins, which can be found in the ``aiidalab_qe.plugins`` folder. You can also use them as a start point to create your own plugins. + +You can register your plugin to facilitate its discovery and use by the community. +Please refer to the :doc:`Plugin registry ` for more details. + .. _aiidalab-qe-plugin-demos: https://github.com/aiidalab/aiidalab-qe-plugin-demos diff --git a/docs/source/development/plugin_registry.rst b/docs/source/development/plugin_registry.rst new file mode 100644 index 000000000..9d5fcb77a --- /dev/null +++ b/docs/source/development/plugin_registry.rst @@ -0,0 +1,46 @@ + + +Plugin Registry +========================================= + +If you are either in the process of creating a new plugin or already have one developed, you're encouraged to register your plugin here to become part of the official AiiDAlab Quantum ESPRESSO App plugin ecosystem. + +Registering Your Plugin +----------------------- + +To include your plugin in the registry, follow these steps: + +1. Fork this `repository `_. + +2. Add your plugin to the `plugins.yaml` file. Place your entry at the end of the file, following this example: + + .. code-block:: yaml + + aiidalab-qe-xyz: + description: "Quantum ESPRESSO plugin for XYZ by AiiDAlab." + author: "Alice Doe" + github: "https://github.com/alicedoe/aiidalab-qe-xyz" + documentation: "https://aiidalab-qe-xyz.readthedocs.io/" + pip: "aiidalab-qe-xyz" + +3. Submit a Pull Request. Direct it to `this repository's Pull Requests section `_. + +Plugin Entry Requirements +------------------------- + +**Required Keys** + +- **Top-level key:** The plugin's distribution name, which should be lowercase and prefixed by ``aiidalab-`` or ``aiida-``. For example, ``aiidalab-qe-coolfeature`` or ``aiidalab-neutron``. +- **description:** A brief description of your plugin. + +**Optional Keys** + +- **github:** If provided, this should be the URL to the plugin's GitHub homepage. + +At least one of ``github`` or ``pip`` is required. + +- **pip:** The PyPI package name for your plugin, useful for installation via pip. Example: ``aiida-quantum``. +- **documentation:** The URL to your plugin's online documentation, such as ReadTheDocs. +- **author:** The developer of the plugin. + +By following these guidelines, you can ensure your plugin is correctly listed and accessible within the AiiDAlab Quantum ESPRESSO app, facilitating its discovery and use by the community. diff --git a/plugin_list.ipynb b/plugin_list.ipynb new file mode 100644 index 000000000..7f206a19f --- /dev/null +++ b/plugin_list.ipynb @@ -0,0 +1,196 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## AiiDAlab Quantum ESPRESSO Plugin manager\n", + "\n", + "This page lets you manage the plugins. You can find all the plugins that available in the official AiiDAlab Quantum ESPRESSO Plugin registry. You can install and remove plugins from this page.\n", + "\n", + "### Plugin registry\n", + "\n", + "If you are starting to develop a new plugin or if you already have one, and want it discoveried and used by the community. Please refer to this [page](https://aiidalab-qe.readthedocs.io/development/plugin_registry.html) to learn how to register a plugin.\n", + "\n", + "\n", + "### Available plugins\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import requests\n", + "import yaml\n", + "\n", + "# URL of the YAML file\n", + "filepath = 'https://raw.githubusercontent.com/aiidalab/aiidalab-qe-plugin-registry/main/plugins.yaml'\n", + "\n", + "# Fetch the contents of the URL\n", + "response = requests.get(filepath)\n", + "\n", + "# Check if the request was successful\n", + "if response.status_code == 200:\n", + " # Load the YAML content\n", + " data = yaml.safe_load(response.content)\n", + " # Now 'data' contains the YAML file's contents as a Python object\n", + "else:\n", + " print(f\"Failed to fetch the YAML file: HTTP {response.status_code}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import subprocess\n", + "from threading import Thread\n", + "\n", + "import ipywidgets as ipw\n", + "from IPython.display import display\n", + "\n", + "\n", + "def is_package_installed(package_name):\n", + " import importlib\n", + " package_name = package_name.replace('-', '_')\n", + " try:\n", + " importlib.import_module(package_name)\n", + " return True\n", + " except ImportError:\n", + " return False\n", + "\n", + "\n", + "def stream_output(process, output_widget):\n", + " \"\"\"Reads output from the process and forwards it to the output widget.\"\"\"\n", + " while True:\n", + " output = process.stdout.readline()\n", + " if process.poll() is not None and output == '':\n", + " break\n", + " if output:\n", + " output_widget.value += f\"\"\"
{output}
\"\"\"\n", + "\n", + "\n", + "def execute_command_with_output(command, output_widget, install_btn, remove_btn, action=\"install\"):\n", + " \"\"\"Execute a command and stream its output to the given output widget.\"\"\"\n", + " output_widget.value = \"\" # Clear the widget\n", + " process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1)\n", + " # Create a thread to read the output stream and write it to the output widget\n", + " thread = Thread(target=stream_output, args=(process, output_widget))\n", + " thread.start()\n", + " thread.join() # Wait for the thread to finish\n", + "\n", + " if process.returncode == 0 and action == \"install\":\n", + " output_widget.value += \"\"\"
Command executed successfully.
\"\"\"\n", + " install_btn.disabled = True\n", + " remove_btn.disabled = False\n", + " return True\n", + " elif process.returncode == 0 and action == \"remove\":\n", + " output_widget.value += \"\"\"
Command executed successfully.
\"\"\"\n", + " install_btn.disabled = False\n", + " remove_btn.disabled = True\n", + " return True\n", + " else:\n", + " output_widget.value += \"\"\"
Command failed.
\"\"\"\n", + " return False\n", + "\n", + "\n", + "def install_package(pip, github, output_container, install_btn, remove_btn, accordion, index):\n", + " if pip:\n", + " command = [\"pip\", \"install\", pip]\n", + " else:\n", + " command = [\"pip\", \"install\", \"git+\" + github]\n", + " result = execute_command_with_output(command, output_container, install_btn, remove_btn)\n", + " if result:\n", + " # restart daemon\n", + " accordion.set_title(index, f\"{accordion.get_title(index)[:-2]} ✅\")\n", + " command = [\"verdi\", \"daemon\", \"restart\"]\n", + " subprocess.run(command, capture_output=True, shell=False)\n", + "\n", + "\n", + "def remove_package(package_name, output_container, install_btn, remove_btn, accordion, index):\n", + " package_name = package_name.replace('-', '_')\n", + " command = [\"pip\", \"uninstall\", \"-y\", package_name]\n", + " result = execute_command_with_output(command, output_container, install_btn, remove_btn, action=\"remove\")\n", + " if result:\n", + " accordion.set_title(index, f\"{accordion.get_title(index)[:-2]} ☐\")\n", + " command = [\"verdi\", \"daemon\", \"restart\"]\n", + " subprocess.run(command, capture_output=True, shell=False)\n", + "\n", + "\n", + "accordion = ipw.Accordion()\n", + "\n", + "for i, (plugin_name, plugin_data) in enumerate(data.items()):\n", + " installed = is_package_installed(plugin_name)\n", + " \n", + " # Output container with customized styling\n", + " output_container = ipw.HTML(\n", + " value=\"\"\"\n", + "
\n", + "
\n", + " \"\"\",\n", + " layout=ipw.Layout(\n", + " max_height='250px', \n", + " overflow='auto',\n", + " border='2px solid #CCCCCC'\n", + " )\n", + " )\n", + " \n", + " details = f\"Author: {plugin_data.get('author', 'N/A')}
\" \\\n", + " f\"Description: {plugin_data.get('description', 'No description available')}
\"\n", + " if 'documentation' in plugin_data:\n", + " details += f\"Documentation:
Visit
\"\n", + " if 'github' in plugin_data:\n", + " details += f\"Github: Visit\"\n", + "\n", + " install_btn = ipw.Button(description=\"Install\", button_style='success', disabled=installed)\n", + " remove_btn = ipw.Button(description=\"Remove\", button_style='danger', disabled=not installed)\n", + "\n", + " install_btn.on_click(lambda btn, pip=plugin_data.get('pip', None), github=plugin_data.get('github', ''), oc=output_container, ib=install_btn, rb=remove_btn, ac=accordion, index=i: install_package(pip, github, oc, ib, rb, ac, index))\n", + " remove_btn.on_click(lambda btn, pn=plugin_name, oc=output_container, ib=install_btn, rb=remove_btn, ac=accordion, index=i: remove_package(pn, oc, ib, rb, ac, index))\n", + "\n", + " box = ipw.VBox([\n", + " ipw.HTML(details),\n", + " ipw.HBox([install_btn, remove_btn]),\n", + " output_container # Include the output container in the VBox\n", + " ])\n", + "\n", + " title_with_icon = f\"{plugin_name} {'✅' if installed else '☐'}\"\n", + " accordion.set_title(i, title_with_icon)\n", + " accordion.children = list(accordion.children) + [box]\n", + "\n", + "display(accordion)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/plugins.yaml b/plugins.yaml new file mode 100644 index 000000000..929d5cfc3 --- /dev/null +++ b/plugins.yaml @@ -0,0 +1,17 @@ +--- +aiida-bader: + description: AiiDA plugin for the Bader analysis + author: Xing Wang + github: https://github.com/superstar54/aiida-bader + documentation: https://aiida-bader.readthedocs.io/ + pip: aiida-bader + +aiidalab-qe-vibroscopy: + description: Plugin to compute vibrational properties of materials via the aiida-vibroscopy AiiDA plugin + author: Miki Bonacci, Andres Ortega Guerrero + github: https://github.com/mikibonacci/aiidalab-qe-vibroscopy + +aiidalab-qe-muon: + description: Plugin to compute muon stopping sites and related properties via the aiida-muon and aiida-musconv AiiDA plugins + author: Miki Bonacci + github: https://github.com/mikibonacci/aiidalab-qe-muon diff --git a/start.py b/start.py index 322943c15..fb41a8f08 100644 --- a/start.py +++ b/start.py @@ -4,6 +4,15 @@ def get_start_widget(appbase, jupbase, notebase): return ipw.HTML( f""" + + + + + + +
Preferences
From 585229f7543a454a9c969e9d6780cfb990e05e96 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Mon, 8 Apr 2024 16:27:46 +0200 Subject: [PATCH 051/166] add reminder text when users selecting property (#663) * add reminder text when users select property --- src/aiidalab_qe/app/configuration/workflow.py | 19 ++++++++++++++++++- src/aiidalab_qe/common/panel.py | 2 +- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/aiidalab_qe/app/configuration/workflow.py b/src/aiidalab_qe/app/configuration/workflow.py index c7ccd5001..6a34f727f 100644 --- a/src/aiidalab_qe/app/configuration/workflow.py +++ b/src/aiidalab_qe/app/configuration/workflow.py @@ -94,9 +94,26 @@ def __init__(self, **kwargs): ipw.HTML("Select which properties to calculate:"), ] entries = get_entry_items("aiidalab_qe.properties", "outline") + setting_entries = get_entry_items("aiidalab_qe.properties", "setting") for name, entry_point in entries.items(): self.properties[name] = entry_point() - self.property_children.append(self.properties[name]) + if name in setting_entries: + reminder_text = ipw.HTML() + self.property_children.append( + ipw.HBox([self.properties[name], reminder_text]) + ) + + # observer change to update the reminder text + def update_reminder_text(change, reminder_text=reminder_text, name=name): + if change["new"]: + reminder_text.value = ( + f"""Customize {name} settings in the panel above if needed.""" + ) + else: + reminder_text.value = "" + + self.properties[name].run.observe(update_reminder_text, "value") + self.property_children.append(self.properties_help) self.children = [ self.structure_title, diff --git a/src/aiidalab_qe/common/panel.py b/src/aiidalab_qe/common/panel.py index ca414cb6b..bd6fdcfdc 100644 --- a/src/aiidalab_qe/common/panel.py +++ b/src/aiidalab_qe/common/panel.py @@ -72,7 +72,7 @@ def __init__(self, **kwargs): description=self.title, indent=False, value=False, - layout=ipw.Layout(max_width="50%"), + style={"description_width": "initial"}, ) self.description_html = ipw.HTML( f"""
From 8da3db97e0be6451c2f9d4f5b04780f9e31b825f Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Mon, 8 Apr 2024 17:07:07 +0200 Subject: [PATCH 052/166] assgin clean_workdir to plugin's builder (#667) * assgin clean_workdir to plugin's builder * check if the plugin has a clean_workdir input --- src/aiidalab_qe/plugins/bands/workchain.py | 2 +- src/aiidalab_qe/plugins/pdos/workchain.py | 2 +- src/aiidalab_qe/plugins/xas/workchain.py | 2 +- src/aiidalab_qe/plugins/xps/workchain.py | 2 +- src/aiidalab_qe/workflows/__init__.py | 12 +++++++----- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/aiidalab_qe/plugins/bands/workchain.py b/src/aiidalab_qe/plugins/bands/workchain.py index e60c611f4..9f7bd7d0e 100644 --- a/src/aiidalab_qe/plugins/bands/workchain.py +++ b/src/aiidalab_qe/plugins/bands/workchain.py @@ -227,6 +227,6 @@ def get_builder(codes, structure, parameters, **kwargs): workchain_and_builder = { "workchain": PwBandsWorkChain, - "exclude": ("clean_workdir", "structure", "relax"), + "exclude": ("structure", "relax"), "get_builder": get_builder, } diff --git a/src/aiidalab_qe/plugins/pdos/workchain.py b/src/aiidalab_qe/plugins/pdos/workchain.py index b0c8325e7..4dd5fd665 100644 --- a/src/aiidalab_qe/plugins/pdos/workchain.py +++ b/src/aiidalab_qe/plugins/pdos/workchain.py @@ -80,6 +80,6 @@ def get_builder(codes, structure, parameters, **kwargs): workchain_and_builder = { "workchain": PdosWorkChain, - "exclude": ("clean_workdir", "structure", "relax"), + "exclude": ("structure", "relax"), "get_builder": get_builder, } diff --git a/src/aiidalab_qe/plugins/xas/workchain.py b/src/aiidalab_qe/plugins/xas/workchain.py index bfd175053..0c08ce431 100644 --- a/src/aiidalab_qe/plugins/xas/workchain.py +++ b/src/aiidalab_qe/plugins/xas/workchain.py @@ -106,6 +106,6 @@ def get_builder(codes, structure, parameters, **kwargs): workchain_and_builder = { "workchain": XspectraCrystalWorkChain, - "exclude": ("clean_workdir", "structure", "relax"), + "exclude": ("structure", "relax"), "get_builder": get_builder, } diff --git a/src/aiidalab_qe/plugins/xps/workchain.py b/src/aiidalab_qe/plugins/xps/workchain.py index a58dce82c..238215d62 100644 --- a/src/aiidalab_qe/plugins/xps/workchain.py +++ b/src/aiidalab_qe/plugins/xps/workchain.py @@ -100,6 +100,6 @@ def get_builder(codes, structure, parameters, **kwargs): workchain_and_builder = { "workchain": XpsWorkChain, - "exclude": ("clean_workdir", "structure", "relax"), + "exclude": ("structure", "relax"), "get_builder": get_builder, } diff --git a/src/aiidalab_qe/workflows/__init__.py b/src/aiidalab_qe/workflows/__init__.py index c2d002815..093484d0e 100644 --- a/src/aiidalab_qe/workflows/__init__.py +++ b/src/aiidalab_qe/workflows/__init__.py @@ -158,21 +158,23 @@ def get_builder_from_protocol( if properties is None: properties = [] builder.properties = orm.List(list=properties) + # clean workdir + clean_workdir = orm.Bool(parameters["advanced"]["clean_workdir"]) + builder.clean_workdir = clean_workdir # add plugin workchain for name, entry_point in plugin_entries.items(): if name in properties: plugin_builder = entry_point["get_builder"]( codes, structure, copy.deepcopy(parameters), **kwargs ) + # check if the plugin has a clean_workdir input + plugin_workchain = entry_point["workchain"] + if plugin_workchain.spec().has_input("clean_workdir"): + plugin_builder.clean_workdir = clean_workdir setattr(builder, name, plugin_builder) else: builder.pop(name, None) - # XXX (unkcpz) I smell not proper design here since I have to look at - # configuration step to know what show be set here. - clean_workdir = parameters["advanced"]["clean_workdir"] - builder.clean_workdir = orm.Bool(clean_workdir) - return builder def setup(self): From 86f4aac9f4af11873fbf0d8b06c99c6715e3b5c6 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Tue, 9 Apr 2024 10:34:00 +0200 Subject: [PATCH 053/166] hide kill button when the process is done (#648) * add process status information along with the kill button * hide kill button when the process is done, and replace it with "Workflow completed successfully!" --- src/aiidalab_qe/app/result/__init__.py | 27 +++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/aiidalab_qe/app/result/__init__.py b/src/aiidalab_qe/app/result/__init__.py index 125c5c738..7a3d2640a 100644 --- a/src/aiidalab_qe/app/result/__init__.py +++ b/src/aiidalab_qe/app/result/__init__.py @@ -13,6 +13,10 @@ # trigger registration of the viewer widget: from .workchain_viewer import WorkChainViewer # noqa: F401 +PROCESS_COMPLETED = "

Workflow completed successfully!

" +PROCESS_EXCEPTED = "

Workflow is excepted!

" +PROCESS_RUNNING = "

Workflow is running!

" + class ViewQeAppWorkChainStatusAndResultsStep(ipw.VBox, WizardAppWidgetStep): process = tl.Unicode(allow_none=True) @@ -50,8 +54,15 @@ def __init__(self, **kwargs): layout=ipw.Layout(width="120px", height="40px"), ) self.kill_button.on_click(self._on_click_kill_button) + self.process_info = ipw.HTML() - super().__init__([self.kill_button, self.process_status], **kwargs) + super().__init__( + [ + ipw.HBox(children=[self.kill_button, self.process_info]), + self.process_status, + ], + **kwargs, + ) self._update_kill_button_layout() @@ -75,21 +86,31 @@ def _update_state(self): ProcessState.WAITING, ): self.state = self.State.ACTIVE + self.process_info.value = PROCESS_RUNNING elif ( process_state in (ProcessState.EXCEPTED, ProcessState.KILLED) or process.is_failed ): self.state = self.State.FAIL + self.kill_button.layout.display = "none" + self.process_info.value = PROCESS_EXCEPTED elif process.is_finished_ok: self.state = self.State.SUCCESS + self.kill_button.layout.display = "none" + self.process_info.value = PROCESS_COMPLETED def _update_kill_button_layout(self): """Update the layout of the kill button.""" # If no process is selected, hide the button. - if self.process is None: + if self.process is None or self.process == "": self.kill_button.layout.display = "none" else: - self.kill_button.layout.display = "block" + process = orm.load_node(self.process) + # If the process is finished or excepted, hide the button. + if process.is_finished or process.is_excepted: + self.kill_button.layout.display = "none" + else: + self.kill_button.layout.display = "block" # If the step is not activated, no point to click the button, so disable it. # Only enable it if the process is on (RUNNING, CREATED, WAITING). From dcb951d4e5363c72347fefecab4d06192b19fae0 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Thu, 11 Apr 2024 13:16:15 +0200 Subject: [PATCH 054/166] check if the code is installed and usable (#669) if code is imported from another user, it is not usable and thus will not be treated as an option in the ComputationalResourcesWidget. This PR checks if the code is installed and usable. --- src/aiidalab_qe/app/submission/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/aiidalab_qe/app/submission/__init__.py b/src/aiidalab_qe/app/submission/__init__.py index 478ebbf02..9d0ff726b 100644 --- a/src/aiidalab_qe/app/submission/__init__.py +++ b/src/aiidalab_qe/app/submission/__init__.py @@ -347,7 +347,12 @@ def _get_code_uuid(code): with self.hold_trait_notifications(): for name, code in self.codes.items(): - code.value = _get_code_uuid(codes.get(name)) + # check if the code is installed and usable + # note: if code is imported from another user, it is not usable and thus will not be + # treated as an option in the ComputationalResourcesWidget. + code_options = [o[1] for o in self.pw_code.code_select_dropdown.options] + if _get_code_uuid(codes.get(name)) in code_options: + code.value = _get_code_uuid(codes.get(name)) def update_codes_display(self): """Hide code if no related property is selected.""" From 2f5009e62d02ca454ba216f94e7d81b67abd7078 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 02:52:59 +0000 Subject: [PATCH 055/166] Bump idna from 3.4 to 3.7 in /docs Bumps [idna](https://github.com/kjd/idna) from 3.4 to 3.7. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.4...v3.7) --- updated-dependencies: - dependency-name: idna dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/requirements.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 7c8bea324..cb854f417 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -22,7 +22,7 @@ docutils==0.17.1 # via # pydata-sphinx-theme # sphinx -idna==3.4 +idna==3.7 # via requests imagesize==1.4.1 # via sphinx @@ -37,7 +37,7 @@ packaging==23.1 # pydata-sphinx-theme # sphinx pydata-sphinx-theme==0.13.3 - # via -r docs/requirements.in + # via -r requirements.in pygments==2.15.1 # via # accessible-pygments @@ -51,11 +51,11 @@ soupsieve==2.4.1 # via beautifulsoup4 sphinx==4.5.0 # via - # -r docs/requirements.in + # -r requirements.in # pydata-sphinx-theme # sphinx-design sphinx-design==0.4.1 - # via -r docs/requirements.in + # via -r requirements.in sphinxcontrib-applehelp==1.0.4 # via sphinx sphinxcontrib-devhelp==1.0.2 From 4476651aa23fe547546d5b51dd6779fb1e2056c1 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Tue, 16 Apr 2024 16:20:23 +0200 Subject: [PATCH 056/166] add a `update_inputs` to plugin's `workchain_and_builder` (#656) This PR enhances the plugin API by introducing a new feature to the `workchain_and_builder` configuration: the `update_inputs` method. This addition addresses limitations in the previous design, where the main workchain rigidly passed only the `structure` to the plugins' workchains. This approach had notable disadvantages: - It mandated that all plugins' workchains accept an input named `structure`, leading to errors if this was not adhered to. This is the case in the newly developed plugin: [aiidalab-qe-hp](https://github.com/superstar54/aiidalab-qe-hp). - It restricted data passed to plugins to be hardcoded, thereby limiting plugin developers' ability to tailor the inputs based on their specific requirements. The introduction of the `update_inputs` method provides a dynamic mechanism for updating the inputs of plugins' workchains. It accepts two parameters: `inputs` and `ctx`. This method enables developers to customize how the inputs to a plugin's workchain are updated, leveraging the broader context of the Workchain. An immediate benefit of this improvement is observed in the **bands** and **pdos** plugins, which can now access `current_number_of_bands` from the context if available. --- src/aiidalab_qe/plugins/bands/workchain.py | 11 +++++++++++ src/aiidalab_qe/plugins/pdos/workchain.py | 11 +++++++++++ src/aiidalab_qe/plugins/xas/workchain.py | 6 ++++++ src/aiidalab_qe/plugins/xps/workchain.py | 6 ++++++ src/aiidalab_qe/workflows/__init__.py | 3 ++- 5 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/aiidalab_qe/plugins/bands/workchain.py b/src/aiidalab_qe/plugins/bands/workchain.py index 9f7bd7d0e..56594b2b7 100644 --- a/src/aiidalab_qe/plugins/bands/workchain.py +++ b/src/aiidalab_qe/plugins/bands/workchain.py @@ -225,8 +225,19 @@ def get_builder(codes, structure, parameters, **kwargs): return bands +def update_inputs(inputs, ctx): + """Update the inputs using context.""" + inputs.structure = ctx.current_structure + inputs.scf.pw.parameters = inputs.scf.pw.parameters.get_dict() + if ctx.current_number_of_bands: + inputs.scf.pw.parameters.setdefault("SYSTEM", {}).setdefault( + "nbnd", ctx.current_number_of_bands + ) + + workchain_and_builder = { "workchain": PwBandsWorkChain, "exclude": ("structure", "relax"), "get_builder": get_builder, + "update_inputs": update_inputs, } diff --git a/src/aiidalab_qe/plugins/pdos/workchain.py b/src/aiidalab_qe/plugins/pdos/workchain.py index 4dd5fd665..2d5fd3e40 100644 --- a/src/aiidalab_qe/plugins/pdos/workchain.py +++ b/src/aiidalab_qe/plugins/pdos/workchain.py @@ -78,8 +78,19 @@ def get_builder(codes, structure, parameters, **kwargs): return pdos +def update_inputs(inputs, ctx): + """Update the inputs using context.""" + inputs.structure = ctx.current_structure + inputs.nscf.pw.parameters = inputs.nscf.pw.parameters.get_dict() + if ctx.current_number_of_bands: + inputs.nscf.pw.parameters.setdefault("SYSTEM", {}).setdefault( + "nbnd", ctx.current_number_of_bands + ) + + workchain_and_builder = { "workchain": PdosWorkChain, "exclude": ("structure", "relax"), "get_builder": get_builder, + "update_inputs": update_inputs, } diff --git a/src/aiidalab_qe/plugins/xas/workchain.py b/src/aiidalab_qe/plugins/xas/workchain.py index 0c08ce431..47a189cf5 100644 --- a/src/aiidalab_qe/plugins/xas/workchain.py +++ b/src/aiidalab_qe/plugins/xas/workchain.py @@ -104,8 +104,14 @@ def get_builder(codes, structure, parameters, **kwargs): return builder +def update_inputs(inputs, ctx): + """Update the inputs using context.""" + inputs.structure = ctx.current_structure + + workchain_and_builder = { "workchain": XspectraCrystalWorkChain, "exclude": ("structure", "relax"), "get_builder": get_builder, + "update_inputs": update_inputs, } diff --git a/src/aiidalab_qe/plugins/xps/workchain.py b/src/aiidalab_qe/plugins/xps/workchain.py index 238215d62..270400fc7 100644 --- a/src/aiidalab_qe/plugins/xps/workchain.py +++ b/src/aiidalab_qe/plugins/xps/workchain.py @@ -98,8 +98,14 @@ def get_builder(codes, structure, parameters, **kwargs): return builder +def update_inputs(inputs, ctx): + """Update the inputs using context.""" + inputs.structure = ctx.current_structure + + workchain_and_builder = { "workchain": XpsWorkChain, "exclude": ("structure", "relax"), "get_builder": get_builder, + "update_inputs": update_inputs, } diff --git a/src/aiidalab_qe/workflows/__init__.py b/src/aiidalab_qe/workflows/__init__.py index 093484d0e..cb5c5698e 100644 --- a/src/aiidalab_qe/workflows/__init__.py +++ b/src/aiidalab_qe/workflows/__init__.py @@ -238,7 +238,8 @@ def run_plugin(self): self.exposed_inputs(plugin_workchain, namespace=name) ) inputs.metadata.call_link_label = name - inputs.structure = self.ctx.current_structure + if entry_point.get("update_inputs"): + entry_point["update_inputs"](inputs, self.ctx) inputs = prepare_process_inputs(plugin_workchain, inputs) running = self.submit(plugin_workchain, **inputs) self.report(f"launching plugin {name} <{running.pk}>") From 5cc3952804ebd3b9709fbb8f22d34cc340211012 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Tue, 23 Apr 2024 15:40:42 +0200 Subject: [PATCH 057/166] Feature DFT+U (#577) * adding HubbardWidget to Advanced settings * adding HubbardStructureData to the logic of QeAppWorkchain * adding HubbardWidget test * add Hubbard parameters in WorkFlow Summary --- src/aiidalab_qe/app/configuration/advanced.py | 43 +- src/aiidalab_qe/app/result/summary_viewer.py | 6 + .../app/static/workflow_summary.jinja | 6 + src/aiidalab_qe/common/widgets.py | 407 ++++++++++++++++++ src/aiidalab_qe/workflows/__init__.py | 23 +- tests/configuration/test_advanced.py | 55 +++ tests/conftest.py | 20 + 7 files changed, 554 insertions(+), 6 deletions(-) diff --git a/src/aiidalab_qe/app/configuration/advanced.py b/src/aiidalab_qe/app/configuration/advanced.py index ad2b33264..93766b64d 100644 --- a/src/aiidalab_qe/app/configuration/advanced.py +++ b/src/aiidalab_qe/app/configuration/advanced.py @@ -18,6 +18,7 @@ from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS from aiidalab_qe.common.panel import Panel from aiidalab_qe.common.setup_pseudos import PseudoFamily +from aiidalab_qe.common.widgets import HubbardWidget from .pseudos import PseudoFamilySelector, PseudoSetter @@ -112,6 +113,13 @@ def __init__(self, default_protocol=None, **kwargs): ) self.kpoints_distance.observe(self._callback_value_set, "value") + # Hubbard setting widget + self.hubbard_widget = HubbardWidget() + ipw.dlink( + (self.override, "value"), + (self.hubbard_widget.activate_hubbard, "disabled"), + lambda override: not override, + ) # Total change setting widget self.total_charge = ipw.BoundedFloatText( min=-3, @@ -184,6 +192,7 @@ def __init__(self, default_protocol=None, **kwargs): # Kpoints setting widget self.kpoints_description, ipw.HBox([self.kpoints_distance, self.mesh_grid]), + self.hubbard_widget, self.pseudo_family_selector, self.pseudo_setter, ] @@ -207,6 +216,7 @@ def _update_input_structure(self, change): self.magnetization._update_widget(change) self.pseudo_setter.structure = change["new"] self._display_mesh() + self.hubbard_widget.update_widgets(change["new"]) else: self.magnetization.input_structure = None self.pseudo_setter.structure = None @@ -269,7 +279,18 @@ def get_panel_value(self): # Set total charge parameters["pw"]["parameters"]["SYSTEM"]["tot_charge"] = self.total_charge.value - # Set the pseudos + if self.hubbard_widget.activate_hubbard.value: + parameters["hubbard_parameters"] = self.hubbard_widget.hubbard_dict + if self.hubbard_widget.eigenvalues_label.value: + parameters["pw"]["parameters"]["SYSTEM"].update( + self.hubbard_widget.eigenvalues_dict + ) + + # add clean_workdir to the parameters + parameters["clean_workdir"] = self.clean_workdir.value + + # add the pseudo_family to the parameters + parameters["pseudo_family"] = self.pseudo_family_selector.value if self.pseudo_setter.pseudos: parameters["pw"]["pseudos"] = self.pseudo_setter.pseudos parameters["pw"]["parameters"]["SYSTEM"]["ecutwfc"] = ( @@ -278,8 +299,6 @@ def get_panel_value(self): parameters["pw"]["parameters"]["SYSTEM"]["ecutrho"] = ( self.pseudo_setter.ecutrho ) - # if override is not ticked, use the default value - parameters["pw"]["parameters"]["SYSTEM"]["tot_charge"] = self.total_charge.value if self.van_der_waals.value in ["none", "ts-vdw"]: parameters["pw"]["parameters"]["SYSTEM"]["vdw_corr"] = ( @@ -381,6 +400,22 @@ def set_panel_value(self, parameters): parameters["pw"]["parameters"]["SYSTEM"]["tot_magnetization"] ) + if parameters.get("hubbard_parameters"): + self.hubbard_widget.activate_hubbard.value = True + self.hubbard_widget.set_hubbard_widget( + parameters["hubbard_parameters"]["hubbard_u"] + ) + starting_ns_eigenvalue = ( + parameters.get("pw", {}) + .get("parameters", {}) + .get("SYSTEM", {}) + .get("starting_ns_eigenvalue") + ) + + if starting_ns_eigenvalue is not None: + self.hubbard_widget.eigenvalues_label.value = True + self.hubbard_widget.set_eigenvalues_widget(starting_ns_eigenvalue) + def reset(self): """Reset the widget and the traitlets""" @@ -408,6 +443,8 @@ def reset(self): self.pseudo_setter._reset() # reset the magnetization self.magnetization.reset() + # reset the hubbard widget + self.hubbard_widget.reset() # reset mesh grid if self.input_structure is None: self.mesh_grid.value = " " diff --git a/src/aiidalab_qe/app/result/summary_viewer.py b/src/aiidalab_qe/app/result/summary_viewer.py index 95840dd00..cec3f803a 100644 --- a/src/aiidalab_qe/app/result/summary_viewer.py +++ b/src/aiidalab_qe/app/result/summary_viewer.py @@ -123,6 +123,12 @@ def generate_report_parameters(qeapp_wc): report["periodicity"] = PERIODICITY_MAPPING.get( qeapp_wc.inputs.structure.pbc, "xyz" ) + + # DFT+U + hubbard_dict = ui_parameters["advanced"].pop("hubbard_parameters", None) + if hubbard_dict: + hubbard_parameters = hubbard_dict["hubbard_u"] + report["hubbard_u"] = hubbard_parameters report["tot_magnetization"] = pw_parameters["SYSTEM"].get( "tot_magnetization", False ) diff --git a/src/aiidalab_qe/app/static/workflow_summary.jinja b/src/aiidalab_qe/app/static/workflow_summary.jinja index dd54e3718..58f18141a 100644 --- a/src/aiidalab_qe/app/static/workflow_summary.jinja +++ b/src/aiidalab_qe/app/static/workflow_summary.jinja @@ -116,6 +116,12 @@ {{ initial_magnetic_moments }} {% endif %} + {% if hubbard_u %} + + DFT+U + {{ hubbard_u }} + + {% endif %}
diff --git a/src/aiidalab_qe/common/widgets.py b/src/aiidalab_qe/common/widgets.py index afb7b6b88..91b1b515a 100644 --- a/src/aiidalab_qe/common/widgets.py +++ b/src/aiidalab_qe/common/widgets.py @@ -24,6 +24,7 @@ string_range_to_list, ) from IPython.display import HTML, Javascript, clear_output, display +from pymatgen.core.periodic_table import Element __all__ = [ "CalcJobOutputFollower", @@ -617,3 +618,409 @@ def _select_periodicity(self, _=None): new_structure.set_pbc(periodicity_options[self.periodicity.value]) self.structure = None self.structure = deepcopy(new_structure) + + +class HubbardWidget(ipw.VBox): + """Widget for setting up Hubbard parameters.""" + + def __init__(self, input_structure=None): + self.input_structure = input_structure + self.eigenvalues_help = ipw.HTML( + value="For transition metals and lanthanoids, the starting eigenvalues can be defined (Magnetic calculation).", + layout=ipw.Layout(width="auto"), + ) + self.activate_hubbard = ipw.Checkbox( + description="", + tooltip="Use Hubbard DFT+U.", + indent=False, + value=False, + layout=ipw.Layout(max_width="10%"), + ) + self.eigenvalues_label = ipw.Checkbox( + description="Define eigenvalues", + tooltip="Define eigenvalues", + indent=False, + value=False, + layout=ipw.Layout(max_width="30%"), + ) + self.hubbard_widget = self.create_hubbard_widget() + self.hubbard_widget_out = ipw.Output() + self.eigen_values_widget = self.create_eigenvalues_widget() + self.eigen_values_widget_out = ipw.Output() + + super().__init__( + children=[ + ipw.HBox( + children=[ + ipw.HTML("Hubbard (DFT+U)"), + self.activate_hubbard, + ] + ), + self.hubbard_widget_out, + self.eigen_values_widget_out, + ] + ) + self.activate_hubbard.observe(self.toggle_hubbard_widgets, names="value") + self.eigenvalues_label.observe(self.toggle_eigenvalues_widgets, names="value") + + def create_hubbard_widget(self): + """ + Creates a widget for defining Hubbard U values for each atomic species in the input structure. + + Returns: + hubbard_widget (ipywidgets.VBox): The widget containing the input fields for defining Hubbard U values. + """ + + def _display_checkbox(symbols): + return any( + Element(symbol).is_transition_metal + or Element(symbol).is_lanthanoid + or Element(symbol).is_actinoid + for symbol in symbols + ) + + condition = False + if self.input_structure is None: + self.input_labels = [] + else: + self.input_labels = self._hubbard_widget_labels() + condition = _display_checkbox(self.input_structure.get_symbols_set()) + widgets_list = [] + for label in self.input_labels: + hbox_container = ipw.HBox() + float_widget = ipw.BoundedFloatText( + description=label, + min=0, + max=20, + step=0.1, + value=0.0, + layout={"width": "160px"}, + ) + hbox_container.children = [float_widget] + widgets_list.append(hbox_container) + + if condition: + hubbard_widget = ipw.VBox( + [ipw.HTML("Define U value [eV] ")] + + widgets_list + + [self.eigenvalues_help, self.eigenvalues_label] + ) + else: + hubbard_widget = ipw.VBox([ipw.HTML("Define U value [eV] ")] + widgets_list) + return hubbard_widget + + def _hubbard_widget_labels(self): + """ + Returns a list of labels for the Hubbard widget. + + The labels are generated based on the kind names and the corresponding Hubbard manifolds + of the input structure. + + Returns: + list: A list of labels in the format "{kind} - {manifold}". + """ + kind_list = self.input_structure.get_kind_names() + hubbard_manifold_list = [ + self._get_hubbard_manifold(Element(x.symbol)) + for x in self.input_structure.kinds + ] + result = [ + f"{kind} - {manifold}" + for kind, manifold in zip(kind_list, hubbard_manifold_list) + ] + return result + + def _get_hubbard_manifold(self, element): + """ + Get the Hubbard manifold for a given element. + + Parameters: + element (Element): The element for which to determine the Hubbard manifold. + + Returns: + str: The Hubbard manifold for the given element. + """ + valence = [ + orbital + for orbital in element.electronic_structure.split(".") + if "[" not in orbital + ] + orbital_shells = [shell[:2] for shell in valence] + + def is_condition_met(shell): + return condition and condition in shell + + # Conditions for determining the Hubbard manifold to be selected from the electronic structure + hubbard_conditions = { + element.is_transition_metal: "d", + element.is_lanthanoid or element.is_actinoid: "f", + element.is_post_transition_metal + or element.is_metalloid + or element.is_halogen + or element.is_chalcogen + or element.symbol in ["C", "N", "P"]: "p", + element.is_alkaline or element.is_alkali or element.is_noble_gas: "s", + } + + condition = next( + (shell for condition, shell in hubbard_conditions.items() if condition), + None, + ) + + hubbard_manifold = next( + (shell for shell in orbital_shells if is_condition_met(shell)), None + ) + + return hubbard_manifold + + def create_eigenvalues_widget(self): + """ + Creates and returns a widget for selecting eigenvalues of different kinds of atoms. + + Returns: + occup_kinds_widget (ipywidgets.VBox): Widget for selecting eigenvalues. + """ + + if self.input_structure is None: + self.input_kinds_eigenvalues = [] + else: + list_of_kinds = [ + [index + 1, value.name, Element(value.symbol)] + for index, value in enumerate(self.input_structure.kinds) + ] + self.input_kinds_eigenvalues = [ + x + for x in list_of_kinds + if x[2].is_transition_metal or x[2].is_lanthanoid + ] + + kind_list = [] + for kind in self.input_kinds_eigenvalues: + if kind[2].is_transition_metal: + num_states = 5 # d states + if kind[2].is_lanthanoid: + num_states = 7 # f states + if kind[2].is_transition_metal or kind[2].is_lanthanoid: + widgets_list_up = [] + widgets_list_down = [] + for i in range(num_states): + eigenvalues_up = ipw.Dropdown( + description=f"{i+1}", + options=["-1", "0", "1"], + layout=ipw.Layout(width="65px"), + style={"description_width": "initial"}, + ) + eigenvalues_down = ipw.Dropdown( + description=f"{i+1}", + options=["-1", "0", "1"], + layout=ipw.Layout(width="65px"), + style={"description_width": "initial"}, + ) + widgets_list_up.append(eigenvalues_up) + widgets_list_down.append(eigenvalues_down) + + row_up = ipw.HBox( + children=[ + ipw.Label( + "Up:", + layout=ipw.Layout( + justify_content="flex-start", width="50px" + ), + ) + ] + + widgets_list_up, + ) + + row_down = ipw.HBox( + children=[ + ipw.Label( + "Down:", + layout=ipw.Layout( + justify_content="flex-start", width="50px" + ), + ) + ] + + widgets_list_down, + ) + eigenvalues_container = ipw.VBox(children=[row_up, row_down]) + kind_container = ipw.HBox( + children=[ + ipw.Label( + kind[1], + layout=ipw.Layout( + justify_content="flex-start", width="50px" + ), + ), + eigenvalues_container, + ] + ) + kind_list.append(kind_container) + occup_kinds_widget = ipw.VBox(kind_list) + return occup_kinds_widget + + def update_widgets(self, change): + """ + Update the widgets based on the given change. + """ + self.input_structure = change + self.hubbard_widget = self.create_hubbard_widget() + self.eigenvalues_label.value = False + if self.activate_hubbard.value: + with self.hubbard_widget_out: + clear_output() + display(self.hubbard_widget) + + self.eigen_values_widget = self.create_eigenvalues_widget() + if self.eigenvalues_label.value: + with self.eigen_values_widget_out: + clear_output() + display(self.eigen_values_widget) + + def toggle_hubbard_widgets(self, change): + """ + Toggle the visibility of the Hubbard widgets based on the value of check box. + """ + if change["new"]: + with self.hubbard_widget_out: + clear_output() + display(self.hubbard_widget) + if self.eigenvalues_label.value: + with self.eigen_values_widget_out: + clear_output() + display(self.eigen_values_widget) + else: + with self.hubbard_widget_out: + clear_output() + with self.eigen_values_widget_out: + clear_output() + + def toggle_eigenvalues_widgets(self, change): + """ + Toggle the visibility of eigenvalues widgets based on the value of the eigenvalues check box. + """ + if change["new"]: + with self.eigen_values_widget_out: + clear_output() + display(self.eigen_values_widget) + else: + with self.eigen_values_widget_out: + clear_output() + + def _get_hubbard_u(self) -> dict: + """ + Get the Hubbard U values for each input label. + + Returns: + dict: A dictionary containing the Hubbard U values for each input label. + The dictionary format is {'kind_name - hubbard_manifold': U_value} + + """ + hubbard_u = {} + for index, label in enumerate(self.input_labels): + value_hubbard = self.hubbard_widget.children[index + 1].children[0].value + if value_hubbard != 0: + hubbard_u[label] = ( + self.hubbard_widget.children[index + 1].children[0].value + ) + return hubbard_u + + def _get_starting_ns_eigenvalue(self) -> list: + """ + Get the starting ns eigenvalues for transition metal and lanthanoid elements. + + Returns: + list: A list of starting ns eigenvalues for each element. + Each element in the list is a list containing the following information: + - The eigenvalue + - The spin index + - The element symbol + - The value of the eigenvalue + """ + starting_ns_eigenvalue = [] + for index, kind in enumerate(self.input_kinds_eigenvalues): + if kind[2].is_transition_metal or kind[2].is_lanthanoid: + if kind[2].is_transition_metal: + num_states = 5 + else: + num_states = 7 + for i in range(2): # up and down + spin = ( + self.eigen_values_widget.children[index].children[1].children[i] + ) + for j in range(num_states): + value_eigenvalue = int(spin.children[j + 1].value) + if value_eigenvalue != -1: + starting_ns_eigenvalue.append( + [j + 1, i + 1, kind[1], value_eigenvalue] + ) + + return starting_ns_eigenvalue + + def set_hubbard_widget(self, parameters): + """ + Set the Hubbard widget based on the given parameters. + + Parameters: + parameters (dict): A dictionary containing the Hubbard U values for each input label. + The dictionary format is {'kind_name - hubbard_manifold': U_value} + """ + for index, label in enumerate(self.input_labels): + if label in parameters: + self.hubbard_widget.children[index + 1].children[0].value = parameters[ + label + ] + + def set_eigenvalues_widget(self, parameters): + """ + Set the eigenvalues widget based on the given parameters. + + Parameters: + parameters (list): A list of starting ns eigenvalues for each element. + Each element in the list is a list containing the following information: + - The eigenvalue + - The spin index + - The element symbol + - The value of the eigenvalue + """ + for param in parameters: + eigenvalue, spin_index, element_symbol, value = param + for index, kind in enumerate(self.input_kinds_eigenvalues): + if kind[1] == element_symbol: + spin = ( + self.eigen_values_widget.children[index] + .children[1] + .children[spin_index - 1] + ) + spin.children[eigenvalue].value = str(value) + + def reset(self): + """Reset the widget.""" + self.activate_hubbard.value = False + self.eigenvalues_label.value = False + self.input_structure = None + self.hubbard_widget = self.create_hubbard_widget() + self.eigen_values_widget = self.create_eigenvalues_widget() + with self.hubbard_widget_out: + clear_output() + with self.eigen_values_widget_out: + clear_output() + + @property + def hubbard_dict(self) -> dict: + if self.activate_hubbard.value: + hubbard_dict = { + "hubbard_u": self._get_hubbard_u(), + } + else: + hubbard_dict = {} + return hubbard_dict + + @property + def eigenvalues_dict(self) -> dict: + if self.eigenvalues_label.value: + eigenvalues_dict = { + "starting_ns_eigenvalue": self._get_starting_ns_eigenvalue() + } + else: + eigenvalues_dict = {} + return eigenvalues_dict diff --git a/src/aiidalab_qe/workflows/__init__.py b/src/aiidalab_qe/workflows/__init__.py index cb5c5698e..2ae51269d 100644 --- a/src/aiidalab_qe/workflows/__init__.py +++ b/src/aiidalab_qe/workflows/__init__.py @@ -6,6 +6,7 @@ # AiiDA Quantum ESPRESSO plugin inputs. from aiida_quantumespresso.common.types import ElectronicType, RelaxType, SpinType +from aiida_quantumespresso.data.hubbard_structure import HubbardStructureData from aiida_quantumespresso.utils.mapping import prepare_process_inputs from aiida_quantumespresso.workflows.pw.relax import PwRelaxWorkChain @@ -121,8 +122,24 @@ def get_builder_from_protocol( parameters["advanced"]["pw"]["pseudos"][kind] = orm.load_node(uuid) # builder = cls.get_builder() - # Set the structure. - builder.structure = structure + # Set a HubbardStructureData if hubbard_parameters is specified + hubbard_dict = parameters["advanced"].pop("hubbard_parameters", None) + if hubbard_dict is not None: + hubbard_parameters = hubbard_dict["hubbard_u"] + hubbard_structure = HubbardStructureData.from_structure(structure) + for key, value in hubbard_parameters.items(): + kind, orbital = key.rsplit(" - ", 1) + hubbard_structure.initialize_onsites_hubbard( + atom_name=kind, + atom_manifold=orbital, + value=value, + hubbard_type="U", + use_kinds=True, + ) + hubbard_structure.store() + builder.structure = hubbard_structure + else: + builder.structure = structure # relax relax_overrides = { "base": parameters["advanced"], @@ -165,7 +182,7 @@ def get_builder_from_protocol( for name, entry_point in plugin_entries.items(): if name in properties: plugin_builder = entry_point["get_builder"]( - codes, structure, copy.deepcopy(parameters), **kwargs + codes, builder.structure, copy.deepcopy(parameters), **kwargs ) # check if the plugin has a clean_workdir input plugin_workchain = entry_point["workchain"] diff --git a/tests/configuration/test_advanced.py b/tests/configuration/test_advanced.py index 3f70a53cf..4dee1caa9 100644 --- a/tests/configuration/test_advanced.py +++ b/tests/configuration/test_advanced.py @@ -151,3 +151,58 @@ def test_advanced_kpoints_mesh(): # change protocol w.protocol = "fast" assert w.mesh_grid.value == "Mesh [5, 5, 5]" + + +def test_advanced_hubbard_widget(generate_structure_data): + """Test Hubbard widget.""" + + from aiidalab_qe.app.configuration.advanced import AdvancedSettings + + w = AdvancedSettings() + + structure = generate_structure_data(name="LiCoO2") + + w.input_structure = structure + + # Activate Hubbard U widget + w.hubbard_widget.activate_hubbard.value = True + + assert w.hubbard_widget.input_labels == ["Co - 3d", "O - 2p", "Li - 2s"] + + # Change the value of the Hubbard U for Co, O and Li + w.hubbard_widget.hubbard_widget.children[1].children[0].value = 1 + w.hubbard_widget.hubbard_widget.children[2].children[0].value = 2 + w.hubbard_widget.hubbard_widget.children[3].children[0].value = 3 + + assert w.hubbard_widget.hubbard_dict == { + "hubbard_u": {"Co - 3d": 1.0, "O - 2p": 2.0, "Li - 2s": 3.0} + } + + # Check eigenvalues are empty + assert w.hubbard_widget.eigenvalues_dict == {} + + w.hubbard_widget.eigenvalues_label.value = True + + # Check there is only eigenvalues for Co (Transition metal) + + assert len(w.hubbard_widget.eigen_values_widget.children) == 1 + + # The widget hierarchy for eigenvalues: + # - w.hubbard_widget.eigen_values_widget.children[0]: List of eigenvalues for Co + # - w.hubbard_widget.eigen_values_widget.children[0].children[1]: Widgets for up and down spin + # - w.hubbard_widget.eigen_values_widget.children[0].children[1].children[0]: Widget for up spin + # - w.hubbard_widget.eigen_values_widget.children[0].children[1].children[0].children[1]: Widget for eigenvalue 1 (3d range: 1 to 5) + + w.hubbard_widget.eigen_values_widget.children[0].children[1].children[0].children[ + 1 + ].value = "1" + w.hubbard_widget.eigen_values_widget.children[0].children[1].children[0].children[ + 3 + ].value = "1" + w.hubbard_widget.eigen_values_widget.children[0].children[1].children[0].children[ + 5 + ].value = "1" + + assert w.hubbard_widget.eigenvalues_dict == { + "starting_ns_eigenvalue": [[1, 1, "Co", 1], [3, 1, "Co", 1], [5, 1, "Co", 1]] + } diff --git a/tests/conftest.py b/tests/conftest.py index cca1ed0d0..768415c43 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -71,7 +71,27 @@ def _generate_structure_data(name="silicon", pbc=(True, True, True)): structure.append_atom(position=(1.28, 1.28, 0.0), symbols="O") structure.append_atom(position=(2.9, 2.9, 0.0), symbols="O") structure.append_atom(position=(0.81, 3.37, 1.33), symbols="O") + + elif name == "LiCoO2": + a, b, c, d = ( + 1.4060463552647, + 0.81178124180108, + 4.6012019181836, + 1.6235624832021, + ) + cell = [[a, -b, c], [0.0, d, c], [-a, -b, c]] + sites = [ + ["Co", "Co", (0, 0, 0)], + ["O", "O", (0, 0, 3.6020728736387)], + ["O", "O", (0, 0, 10.201532881212)], + ["Li", "Li", (0, 0, 6.9018028772754)], + ] + structure = orm.StructureData(cell=cell) + + for site in sites: + structure.append_atom(position=site[2], symbols=site[0], name=site[1]) structure.pbc = pbc + return structure return _generate_structure_data From 26889ead276748d851db03952741fc455ea6d2bb Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Tue, 23 Apr 2024 16:00:48 +0200 Subject: [PATCH 058/166] add label and description for the job (#670) This PR supports users in labeling their jobs and providing a brief description. These details help identify the job later and make the search process easier. The placeholder for the label is generated based on the job. The description is default empty. --- src/aiidalab_qe/app/submission/__init__.py | 35 +++++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/src/aiidalab_qe/app/submission/__init__.py b/src/aiidalab_qe/app/submission/__init__.py index 9d0ff726b..0dd1af82d 100644 --- a/src/aiidalab_qe/app/submission/__init__.py +++ b/src/aiidalab_qe/app/submission/__init__.py @@ -39,6 +39,13 @@ class SubmitQeAppWorkChainStep(ipw.VBox, WizardAppWidgetStep): configure new ones on potentially more powerful machines by clicking on "Setup new code".""" ) + process_label_help = ipw.HTML( + """
+

Labeling Your Job

+

Label your job and provide a brief description. These details help identify the job later and make the search process easier. While optional, adding a description is recommended for better clarity.

+
""" + ) # This number provides a rough estimate for how many MPI tasks are needed # for a given structure. @@ -89,6 +96,13 @@ def __init__(self, qe_auto_setup=True, **kwargs): self.code_children.append(self.codes[name]) # set default codes self.set_selected_codes(DEFAULT_PARAMETERS["codes"]) + # set process label and description + self.process_label = ipw.Text( + description="Label:", layout=ipw.Layout(width="auto", indent="0px") + ) + self.process_description = ipw.Textarea( + description="Description", layout=ipw.Layout(width="auto", indent="0px") + ) # self.submit_button = ipw.Button( description="Submit", @@ -130,6 +144,9 @@ def __init__(self, qe_auto_setup=True, **kwargs): self.sssp_installation_status, self.qe_setup_status, self._submission_blocker_messages, + self.process_label_help, + self.process_label, + self.process_description, self.submit_button, ] ) @@ -313,6 +330,7 @@ def _observe_state(self, change): def _observe_input_structure(self, _): self._update_state() self.update_codes_display() + self._update_process_label() @tl.observe("process") def _observe_process(self, change): @@ -376,16 +394,21 @@ def submit(self, _=None): with self.hold_trait_notifications(): process = submit(builder) - process.label = self._generate_label() + process.label = self.process_label.value + process.description = self.process_description.value # since AiiDA data node may exist in the ui_parameters, # we serialize it to yaml process.base.extras.set("ui_parameters", serialize(self.ui_parameters)) + # store the workchain name in extras, this will help to filter the workchain in the future + process.base.extras.set("workchain", self.ui_parameters["workchain"]) self.process = process self._update_state() - def _generate_label(self) -> dict: + def _update_process_label(self) -> dict: """Generate a label for the work chain based on the input parameters.""" + if not self.input_structure: + return "" formula = self.input_structure.get_formula() properties = [ p for p in self.input_parameters["workchain"]["properties"] if p != "realx" @@ -398,10 +421,10 @@ def _generate_label(self) -> dict: if not properties: properties_info = "" else: - properties_info = f"properties on {', '.join(properties)}" + properties_info = f", properties on {', '.join(properties)}" label = "{} {} {}".format(formula, relax_info, properties_info) - return label + self.process_label.value = label def _create_builder(self) -> ProcessBuilderNamespace: """Create the builder for the `QeAppWorkChain` submit.""" @@ -449,6 +472,10 @@ def _update_builder(self, buildy, max_mpi_per_pool): def set_submission_parameters(self, parameters): self.set_resources(parameters["resources"]) self.set_selected_codes(parameters["codes"]) + # label and description are not stored in the parameters, but in the process directly + if self.process: + self.process_label.value = self.process.label + self.process_description.value = self.process.description def get_submission_parameters(self): """Get the parameters for the submission step.""" From 851bbc065d536011de1fe361847a8e579325452d Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Tue, 23 Apr 2024 16:45:00 +0200 Subject: [PATCH 059/166] bump aiida-quantumespresso from 4.4 to 4.6 (#674) --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index 3f4f5d613..122ab531b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -26,7 +26,7 @@ packages = find: install_requires = aiida-core~=2.2,<3 Jinja2~=3.0 - aiida-quantumespresso~=4.4 + aiida-quantumespresso~=4.6 aiidalab-widgets-base[optimade]~=2.2.0a0 aiida-pseudo~=1.4 filelock~=3.8 From ae79e3ef74c4158ca8e058085511980ae356e82c Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Wed, 24 Apr 2024 14:04:10 +0200 Subject: [PATCH 060/166] Add job management page (#657) To help users easily search and manage their jobs, this PR adds a new job management page. * search jobs based on property, job label, job state and date. * support deleting job. Show confirmation and explanation when deleting the job. Show a warning message and block the deletion if there are any linked QEApp jobs. * inspect the details of the job --- delete.ipynb | 135 ++++++++++++++++ job_list.ipynb | 65 ++++++++ qe.ipynb | 10 ++ src/aiidalab_qe/app/submission/__init__.py | 1 + src/aiidalab_qe/app/utils/search_jobs.py | 179 +++++++++++++++++++++ start.py | 3 +- 6 files changed, 392 insertions(+), 1 deletion(-) create mode 100644 delete.ipynb create mode 100644 job_list.ipynb create mode 100644 src/aiidalab_qe/app/utils/search_jobs.py diff --git a/delete.ipynb b/delete.ipynb new file mode 100644 index 000000000..374c73a0f --- /dev/null +++ b/delete.ipynb @@ -0,0 +1,135 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# AiiDAlab QuantumESPRESSO App\n", + "\n", + "Caution! Deleting this job will also remove all associated nodes, including every calculation initiated by this job and their respective results. This action is irreversible.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import urllib.parse as urlparse\n", + "\n", + "import ipywidgets as widgets\n", + "from aiida import load_profile\n", + "from aiida.orm import load_node\n", + "from aiida.tools import delete_nodes\n", + "from IPython.display import Markdown, display\n", + "\n", + "# Load AiiDA profile\n", + "load_profile()\n", + "\n", + "# Parse the primary key from the Jupyter notebook URL\n", + "url = urlparse.urlsplit(jupyter_notebook_url) # noqa F821\n", + "query = urlparse.parse_qs(url.query)\n", + "pk = int(query['pk'][0])\n", + "\n", + "\n", + "def display_node_details(pk):\n", + " try:\n", + " node = load_node(pk)\n", + " print(f\"Node ID: {node.pk}\")\n", + " print(f\"Node Type: {node.process_label}\")\n", + " print(f\"Label: {node.label}\")\n", + " print(f\"Description: {node.description}\")\n", + " print(f\"Creation Time: {node.ctime}\")\n", + " except Exception as e:\n", + " print(f\"Error loading node: {str(e)}\")\n", + " return False\n", + " return True\n", + "\n", + "\n", + "def delete_node(pk, dry_run=True):\n", + " if dry_run:\n", + " _, was_deleted = delete_nodes([pk], dry_run=True)\n", + " if was_deleted:\n", + " print(f'Dry run: Node {pk} can be deleted.')\n", + " return\n", + " \n", + " _, was_deleted = delete_nodes([pk], dry_run=False)\n", + " if was_deleted:\n", + " print(f'Node {pk} deleted successfully.')\n", + "\n", + "\n", + "def confirm_deletion(b):\n", + " if delete_confirmation.value.lower() in ['y', 'yes']:\n", + " delete_node(pk, dry_run=False)\n", + " else:\n", + " print('Deletion aborted.')\n", + "\n", + "\n", + "def find_linked_qeapp_jobs(root_node_pk, process_label='QeAppWorkChain'):\n", + " \"\"\"Query all linked node with process_label = QeAppWorkChain.\"\"\"\n", + " from aiida.orm import Node, QueryBuilder\n", + " from aiida.orm.nodes.process.workflow.workchain import WorkChainNode\n", + " qb = QueryBuilder()\n", + " qb.append(WorkChainNode, filters={'id': root_node_pk}, tag='root')\n", + " qb.append(Node, with_incoming='root', tag='calcjob')\n", + " # There are seems a bug with `with_ancestors` in the QueryBuilder, so we have to use `with_incoming` instead.\n", + " # For the moment, it's safe to use `with_incoming` since we check it very time we delete a QEApp \n", + " qb.append(WorkChainNode, filters={'attributes.process_label': 'QeAppWorkChain'}, with_incoming='calcjob')\n", + " results = qb.all()\n", + " if len(results) == 0:\n", + " return None\n", + " return results\n", + "\n", + "\n", + "if display_node_details(pk):\n", + " linked_qeapp_jobs = find_linked_qeapp_jobs(pk)\n", + " if linked_qeapp_jobs:\n", + " warning_html = f\"\"\"\n", + "
\n", + " Critical: Unable to delete the requested node due to dependencies.\n", + " There are {len(linked_qeapp_jobs)} QEApp jobs linked to this node. Please delete them first:\n", + "
diff --git a/src/aiidalab_qe/common/setup_pseudos.py b/src/aiidalab_qe/common/setup_pseudos.py index 3e73a9e34..f367dccfd 100644 --- a/src/aiidalab_qe/common/setup_pseudos.py +++ b/src/aiidalab_qe/common/setup_pseudos.py @@ -28,6 +28,10 @@ f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/SR/standard/upf", f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/SR/stringent/upf", f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/SR/stringent/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/FR/standard/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/FR/standard/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/FR/stringent/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/FR/stringent/upf", } diff --git a/src/aiidalab_qe/workflows/__init__.py b/src/aiidalab_qe/workflows/__init__.py index 372f9e804..04ebc0486 100644 --- a/src/aiidalab_qe/workflows/__init__.py +++ b/src/aiidalab_qe/workflows/__init__.py @@ -20,6 +20,8 @@ # because we want to decouple the workflows from the app, so I copied it here # instead of importing it. # load entry points + + def get_entries(entry_point_name="aiidalab_qe.property"): from importlib.metadata import entry_points @@ -190,15 +192,6 @@ def get_builder_from_protocol( relax_builder.pop("base_final_scf", None) # never run a final scf builder.relax = relax_builder - # remove starting magnetization if tot_magnetization is set - if ( - relax_builder["base"]["pw"]["parameters"]["SYSTEM"].get("tot_magnetization") - is not None - ): - builder.relax["base"]["pw"]["parameters"]["SYSTEM"].pop( - "starting_magnetization", None - ) - if properties is None: properties = [] builder.properties = orm.List(list=properties) @@ -211,7 +204,6 @@ def get_builder_from_protocol( plugin_builder = entry_point["get_builder"]( codes, builder.structure, copy.deepcopy(parameters), **kwargs ) - # check if the plugin has a clean_workdir input plugin_workchain = entry_point["workchain"] if plugin_workchain.spec().has_input("clean_workdir"): plugin_builder.clean_workdir = clean_workdir diff --git a/tests/test_pseudo.py b/tests/test_pseudo.py index f35995317..2412b63bd 100644 --- a/tests/test_pseudo.py +++ b/tests/test_pseudo.py @@ -104,7 +104,7 @@ def test_setup_pseudos_cmd(tmp_path): def test_pseudos_installation(): """Test install_pseudos""" # Test by compare the pseudos_to_install before and after the installation - assert len(pseudos_to_install()) == 8 + assert len(pseudos_to_install()) == 12 EXPECTED_PSEUDOS = { f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/SR/standard/upf", f"SSSP/{SSSP_VERSION}/PBE/efficiency", @@ -114,13 +114,13 @@ def test_pseudos_installation(): [_ for _ in _install_pseudos(EXPECTED_PSEUDOS)] # Two pseudos are installed - assert len(pseudos_to_install()) == 6 + assert len(pseudos_to_install()) == 10 @pytest.mark.usefixtures("aiida_profile_clean") def test_download_and_install_pseudo_from_file(tmp_path): """Test download and install pseudo from file.""" - assert len(pseudos_to_install()) == 8 + assert len(pseudos_to_install()) == 12 EXPECTED_PSEUDOS = { f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/SR/standard/upf", f"SSSP/{SSSP_VERSION}/PBE/efficiency", @@ -129,14 +129,14 @@ def test_download_and_install_pseudo_from_file(tmp_path): # Download the pseudos to the tmp_path but not install [_ for _ in _install_pseudos(EXPECTED_PSEUDOS, download_only=True, cwd=tmp_path)] - assert len(pseudos_to_install()) == 8 + assert len(pseudos_to_install()) == 12 assert len(list(tmp_path.iterdir())) == 2 # Install the pseudos from the tmp_path [_ for _ in _install_pseudos(EXPECTED_PSEUDOS, cwd=tmp_path)] # Two pseudos are installed - assert len(pseudos_to_install()) == 6 + assert len(pseudos_to_install()) == 10 def test_pseudos_family_selector_widget(): @@ -147,7 +147,7 @@ def test_pseudos_family_selector_widget(): assert w.override.value is False w.override.value = True - + w.spin_orbit = "wo_soc" # test the default value assert w.value == f"SSSP/{SSSP_VERSION}/PBEsol/efficiency" @@ -163,6 +163,12 @@ def test_pseudos_family_selector_widget(): w.library_selection.value = "PseudoDojo stringent" assert w.value == f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/SR/stringent/upf" + # Test spin-orbit change will update + + w.spin_orbit = "soc" + w.protocol = "moderate" + assert w.value == f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/FR/standard/upf" + @pytest.mark.usefixtures("sssp") def test_pseudos_setter_widget(generate_structure_data, generate_upf_data): diff --git a/tests/test_result/test_summary_report.yml b/tests/test_result/test_summary_report.yml index d41f91b10..b1ebaa504 100644 --- a/tests/test_result/test_summary_report.yml +++ b/tests/test_result/test_summary_report.yml @@ -26,6 +26,7 @@ relax_method: positions_cell relaxed: positions_cell scf_kpoints_distance: 0.5 smearing: cold +spin_orbit: false tot_charge: 0.0 tot_magnetization: false vdw_corr: none diff --git a/tests_integration/test_image.py b/tests_integration/test_image.py index 1a4841b25..e134df02b 100755 --- a/tests_integration/test_image.py +++ b/tests_integration/test_image.py @@ -26,4 +26,4 @@ def test_pseudos_families_are_installed(aiidalab_exec, nb_user): assert "PseudoDojo" in output # Two lines of header, 8 pseudos - assert len(output.splitlines()) == 10 + assert len(output.splitlines()) == 14 From 1e96c0b128907c7a3c9345bd8e048341ec18cc00 Mon Sep 17 00:00:00 2001 From: mikibonacci Date: Fri, 17 May 2024 08:59:55 +0000 Subject: [PATCH 093/166] Adding time res widget --- .../774101c8-e0aa-451b-85ab-bc2829a74706.zip | Bin 0 -> 177928 bytes src/aiidalab_qe/app/submission/__init__.py | 1 + src/aiidalab_qe/common/widgets.py | 15 ++++++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 exports/774101c8-e0aa-451b-85ab-bc2829a74706.zip diff --git a/exports/774101c8-e0aa-451b-85ab-bc2829a74706.zip b/exports/774101c8-e0aa-451b-85ab-bc2829a74706.zip new file mode 100644 index 0000000000000000000000000000000000000000..c9a4e709945f21f5456bbf59e0350195b4b4a0b1 GIT binary patch literal 177928 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 z zO#5!XxN3oV2<<&&o>H*6W$_~riMYG~#1{r?7x&{^+&huzz|^Xi_gkZ%Zpeym@}I7^ zH4}emTyS93aH*_r1`NvpIi~Xj7_oUbrn)#pUnC@57Q#-lM=M9^nI4qq<}O8LvbKuqdthDTB@s^$^3*7uc(ESIRrm3D5B0K$+W+zTFVEHj?O8I{&#A&8gPf+<)H7uT?>ne*p&< zuMV^n3h%WMTjFXo^=``Ba*h{!KCB-7ou320qO@|^!6W>F8?McG9UVRrfcp&vo9c)R zhL~AMY}@v0@H|Qq*u=H@f`|7Hae~z>-6Eu?CzHEnH+ckFzst?jxVcKhyYOzyo)EwM zH37U#|9nX(3gV1;_wY^7M6O!LgmjBC>9(Y^VVfrDfzop;cI?*CGsW357qlXxtr~)W z&*@gLtCD)&qM;T#4@S`KhD_nz${#CDkN$Ab_memu5NuO4OVHh_NRsu=^n#;^odX$j zv;sT|6{^bYIWP0}aTAU}>u0mz%zBoKpdqd`CEtqR2+?fgcEnY~f@5~YCN`fdhS8yr z*WU0@`&p13+V`Q`A7iSdyYC+m`c+ALQI=Z<7ZB+CObz`DG|Qhj9Hx3dK64{?wCjJw z9*1LhUe@kFb?Y|${&NWDv^)8IlJDKKx%A=J)96WM%@-I-w%HG4WzS0eRsXQ2lR3Py z3@zNmY2IiI4;N$gnia~H&j_io+jQ*E9?VgX^kFLSlYooLEr(oZz4SQ`ZX(~G%et4U zRd1{!1Xu@R_(j8TUItG!FvYvFC;QqbjSRz zV-zv9A=qpEa0l`7>%Gu189o*&WDI+LM7IvhwOZx_)p|#{egU(Ir4!53fgy_T-F6bS z*p|Y9*v`ivM`mh;9Xu^1MXb|$P;DHKV^KF^YBQ~BeGBz4jgF`R+rji95(Sy+9VblN zR%ws#YALI5_vEztIw_QGchfoTgMkr;|=)T$(uguhG~N8#tf)pt%qpaSigR7dn$~)v+MfeA$YeMB8Gq zSOX1>u2_sD$E_+3l9p!|wyP)gc%n^$OtHGI`tFAaY_Pe~n72ud^zecK!|9OaOhm}L z3y9BYp0Ls#4Z-BT@v zez+VSG*?R>z7AK3R^U+iB4`h*Jb>Bnnj83DemabiUL7CT=USD|c>^`Q2c9DpNmY}; zl2NpYd1VU+o~zQ@-M(bM`@r3*acLH!GW>{ni3&y4sbxH1|B5BKqB9_~hwM{W)@Qxr zo7N8ltX!=d+^!EmPgGA1?w#zO91h((;XrGGNSH{OfS+5q%=0^cee?I1i~syU2dtjn zssaGGn6RUZi>s5Rvxl&HAvtG}Y%D!3g|YT{TVW4toUN0kh_4g=Up4*>YdOr9 zeCrf|K5as$?H^lSh_S#K0nLBXY`pNc?!q3PHn#5WBA&jUf9AeeGD01*0D#~}0AT+I z^z@h)vVIoV(%#<2QpCmU-&mwU>-z){04R|H0NXDtp&Msp{2R;O`OmR_o=x(1#INO2 zsGNcNwcOKq|EXNKLY7eD9{_N}jTGSeC8FM0+`oU%`t~ATuGoL&{C9hQ^+sD7^q- zr|F2&Q*U(s&70xI|CROMc+=2)2I|*x|7&kREoX550-IIQ|<_g?_A CLl(UN literal 0 HcmV?d00001 diff --git a/src/aiidalab_qe/app/submission/__init__.py b/src/aiidalab_qe/app/submission/__init__.py index 9069d7396..cb13630ad 100644 --- a/src/aiidalab_qe/app/submission/__init__.py +++ b/src/aiidalab_qe/app/submission/__init__.py @@ -407,6 +407,7 @@ def _update_builder(self, builder, codes): "num_mpiprocs_per_machine": codes.get("pw")["ntasks_per_node"], "num_cores_per_mpiproc": codes.get("pw")["cpus_per_task"], } + #builder.relax.base.pw.metadata.options['max_wallclock_seconds'] = codes.get("pw")["max_wallclock_seconds"] builder.relax.base.pw.parallelization = orm.Dict( dict=codes["pw"]["parallelization"] ) diff --git a/src/aiidalab_qe/common/widgets.py b/src/aiidalab_qe/common/widgets.py index 2d53df78f..4a823e635 100644 --- a/src/aiidalab_qe/common/widgets.py +++ b/src/aiidalab_qe/common/widgets.py @@ -715,6 +715,8 @@ def set_parameters(self, parameters): self.resource_detail.ntasks_per_node.value = parameters["ntasks_per_node"] if "cpus_per_task" in parameters: self.resource_detail.cpus_per_task.value = parameters["cpus_per_task"] + if "max_wallclock_seconds" in parameters: + self.resource_detail.max_wallclock_seconds.value = parameters["max_wallclock_seconds"] def _setup_resource_detail(self, _=None): with self._setup_resource_detail_output: @@ -762,8 +764,16 @@ def __init__(self, **kwargs): description="cpus-per-task", style={"description_width": "100px"}, ) + self.max_wallclock_seconds = ipw.BoundedIntText( + value= 3600*12, + step=3600, + min=1800, + max=3600*24*10, + description="max-wallclock-time (seconds)", + style={"description_width": "100px"}, + ) super().__init__( - children=[self.prompt, self.ntasks_per_node, self.cpus_per_task], **kwargs + children=[self.prompt, self.ntasks_per_node, self.cpus_per_task, self.max_wallclock_seconds], **kwargs ) @property @@ -775,17 +785,20 @@ def get_parameters(self): return { "ntasks_per_node": self.ntasks_per_node.value, "cpus_per_task": self.cpus_per_task.value, + "max_wallclock_seconds":self.max_wallclock_seconds, } @parameters.setter def parameters(self, parameters): self.ntasks_per_node.value = parameters.get("ntasks_per_node", 1) self.cpus_per_task.value = parameters.get("cpus_per_task", 1) + self.max_wallclock_seconds.value = parameters.get("max_wallclock_seconds", 3600*12) def reset(self): """Reset the settings.""" self.ntasks_per_node.value = 1 self.cpus_per_task.value = 1 + self.max_wallclock_seconds.value = 3600*12 class ParallelizationSettings(ipw.VBox): From 993d0096ebe3d5ddd8e795da5345b86c10b869fa Mon Sep 17 00:00:00 2001 From: mikibonacci Date: Wed, 22 May 2024 16:53:12 +0000 Subject: [PATCH 094/166] Max_wallclock_time widget working also in the set_resources function. Missing: documentation on how to do it in a plugin. --- src/aiidalab_qe/app/submission/__init__.py | 2 +- src/aiidalab_qe/common/widgets.py | 2 +- src/aiidalab_qe/plugins/utils.py | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/aiidalab_qe/app/submission/__init__.py b/src/aiidalab_qe/app/submission/__init__.py index cb13630ad..285c191f6 100644 --- a/src/aiidalab_qe/app/submission/__init__.py +++ b/src/aiidalab_qe/app/submission/__init__.py @@ -407,7 +407,7 @@ def _update_builder(self, builder, codes): "num_mpiprocs_per_machine": codes.get("pw")["ntasks_per_node"], "num_cores_per_mpiproc": codes.get("pw")["cpus_per_task"], } - #builder.relax.base.pw.metadata.options['max_wallclock_seconds'] = codes.get("pw")["max_wallclock_seconds"] + builder.relax.base.pw.metadata.options['max_wallclock_seconds'] = codes.get("pw")["max_wallclock_seconds"] builder.relax.base.pw.parallelization = orm.Dict( dict=codes["pw"]["parallelization"] ) diff --git a/src/aiidalab_qe/common/widgets.py b/src/aiidalab_qe/common/widgets.py index 4a823e635..c6a2e2038 100644 --- a/src/aiidalab_qe/common/widgets.py +++ b/src/aiidalab_qe/common/widgets.py @@ -785,7 +785,7 @@ def get_parameters(self): return { "ntasks_per_node": self.ntasks_per_node.value, "cpus_per_task": self.cpus_per_task.value, - "max_wallclock_seconds":self.max_wallclock_seconds, + "max_wallclock_seconds":self.max_wallclock_seconds.value, } @parameters.setter diff --git a/src/aiidalab_qe/plugins/utils.py b/src/aiidalab_qe/plugins/utils.py index a4172cc87..ced03d614 100644 --- a/src/aiidalab_qe/plugins/utils.py +++ b/src/aiidalab_qe/plugins/utils.py @@ -9,5 +9,6 @@ def set_component_resources(component, code_info): "num_mpiprocs_per_machine": code_info["ntasks_per_node"], "num_cores_per_mpiproc": code_info["cpus_per_task"], } + component.metadata.options['max_wallclock_seconds'] = code_info["max_wallclock_seconds"] if "parallelization" in code_info: component.parallelization = orm.Dict(dict=code_info["parallelization"]) From 519d8026ad345b6844e2a405af66c1613fe859df Mon Sep 17 00:00:00 2001 From: mikibonacci Date: Wed, 22 May 2024 17:02:06 +0000 Subject: [PATCH 095/166] Adding the documentation on how to update resources for a given code inside a generic plugin. --- docs/source/development/plugin.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/source/development/plugin.rst b/docs/source/development/plugin.rst index abce2df78..913e1063b 100644 --- a/docs/source/development/plugin.rst +++ b/docs/source/development/plugin.rst @@ -240,8 +240,21 @@ The ``get_builder`` function will return a ``builder`` for the ``EOSWorkChain``, overrides=overrides, **kwargs, ) + # update resources + update_resources(builder, codes) return builder +The `update_resources` function is used to set the computational resources of the builder. It will basically +feed the `metadata` of each Calcjob which is submitted in the workchain. For example, in the EOSWorkChain case: + +.. code-block:: python + + from aiidalab_qe.plugins.utils import set_component_resources + + def update_resources(builder, codes): + set_component_resources(builder.pw, codes.get("pw")) + +This function can and should be adapted for each plugin specific case. Then add the workchain and builder into the `workchain_and_builder` dict, so that the QuantumESPRESSO app can load them. .. code-block:: python From 781e34d15089268994792a32f2b639a37b70a62b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 09:05:15 +0000 Subject: [PATCH 096/166] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- docs/source/development/plugin.rst | 2 +- src/aiidalab_qe/app/submission/__init__.py | 4 +++- src/aiidalab_qe/common/widgets.py | 28 +++++++++++++++------- src/aiidalab_qe/plugins/utils.py | 4 +++- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/docs/source/development/plugin.rst b/docs/source/development/plugin.rst index 913e1063b..9176e69fd 100644 --- a/docs/source/development/plugin.rst +++ b/docs/source/development/plugin.rst @@ -254,7 +254,7 @@ feed the `metadata` of each Calcjob which is submitted in the workchain. For exa def update_resources(builder, codes): set_component_resources(builder.pw, codes.get("pw")) -This function can and should be adapted for each plugin specific case. +This function can and should be adapted for each plugin specific case. Then add the workchain and builder into the `workchain_and_builder` dict, so that the QuantumESPRESSO app can load them. .. code-block:: python diff --git a/src/aiidalab_qe/app/submission/__init__.py b/src/aiidalab_qe/app/submission/__init__.py index 285c191f6..d5032e6a1 100644 --- a/src/aiidalab_qe/app/submission/__init__.py +++ b/src/aiidalab_qe/app/submission/__init__.py @@ -407,7 +407,9 @@ def _update_builder(self, builder, codes): "num_mpiprocs_per_machine": codes.get("pw")["ntasks_per_node"], "num_cores_per_mpiproc": codes.get("pw")["cpus_per_task"], } - builder.relax.base.pw.metadata.options['max_wallclock_seconds'] = codes.get("pw")["max_wallclock_seconds"] + builder.relax.base.pw.metadata.options["max_wallclock_seconds"] = codes.get( + "pw" + )["max_wallclock_seconds"] builder.relax.base.pw.parallelization = orm.Dict( dict=codes["pw"]["parallelization"] ) diff --git a/src/aiidalab_qe/common/widgets.py b/src/aiidalab_qe/common/widgets.py index c6a2e2038..4393edc6e 100644 --- a/src/aiidalab_qe/common/widgets.py +++ b/src/aiidalab_qe/common/widgets.py @@ -716,7 +716,9 @@ def set_parameters(self, parameters): if "cpus_per_task" in parameters: self.resource_detail.cpus_per_task.value = parameters["cpus_per_task"] if "max_wallclock_seconds" in parameters: - self.resource_detail.max_wallclock_seconds.value = parameters["max_wallclock_seconds"] + self.resource_detail.max_wallclock_seconds.value = parameters[ + "max_wallclock_seconds" + ] def _setup_resource_detail(self, _=None): with self._setup_resource_detail_output: @@ -765,15 +767,21 @@ def __init__(self, **kwargs): style={"description_width": "100px"}, ) self.max_wallclock_seconds = ipw.BoundedIntText( - value= 3600*12, - step=3600, - min=1800, - max=3600*24*10, + value=3600 * 12, + step=3600, + min=1800, + max=3600 * 24 * 10, description="max-wallclock-time (seconds)", style={"description_width": "100px"}, ) super().__init__( - children=[self.prompt, self.ntasks_per_node, self.cpus_per_task, self.max_wallclock_seconds], **kwargs + children=[ + self.prompt, + self.ntasks_per_node, + self.cpus_per_task, + self.max_wallclock_seconds, + ], + **kwargs, ) @property @@ -785,20 +793,22 @@ def get_parameters(self): return { "ntasks_per_node": self.ntasks_per_node.value, "cpus_per_task": self.cpus_per_task.value, - "max_wallclock_seconds":self.max_wallclock_seconds.value, + "max_wallclock_seconds": self.max_wallclock_seconds.value, } @parameters.setter def parameters(self, parameters): self.ntasks_per_node.value = parameters.get("ntasks_per_node", 1) self.cpus_per_task.value = parameters.get("cpus_per_task", 1) - self.max_wallclock_seconds.value = parameters.get("max_wallclock_seconds", 3600*12) + self.max_wallclock_seconds.value = parameters.get( + "max_wallclock_seconds", 3600 * 12 + ) def reset(self): """Reset the settings.""" self.ntasks_per_node.value = 1 self.cpus_per_task.value = 1 - self.max_wallclock_seconds.value = 3600*12 + self.max_wallclock_seconds.value = 3600 * 12 class ParallelizationSettings(ipw.VBox): diff --git a/src/aiidalab_qe/plugins/utils.py b/src/aiidalab_qe/plugins/utils.py index ced03d614..8aa602ac5 100644 --- a/src/aiidalab_qe/plugins/utils.py +++ b/src/aiidalab_qe/plugins/utils.py @@ -9,6 +9,8 @@ def set_component_resources(component, code_info): "num_mpiprocs_per_machine": code_info["ntasks_per_node"], "num_cores_per_mpiproc": code_info["cpus_per_task"], } - component.metadata.options['max_wallclock_seconds'] = code_info["max_wallclock_seconds"] + component.metadata.options["max_wallclock_seconds"] = code_info[ + "max_wallclock_seconds" + ] if "parallelization" in code_info: component.parallelization = orm.Dict(dict=code_info["parallelization"]) From 80d6e7b9b505c3306bdc054bda58ea1d06b50a05 Mon Sep 17 00:00:00 2001 From: Miki Bonacci Date: Thu, 23 May 2024 19:46:22 +0000 Subject: [PATCH 097/166] Setting max wallclock time to 24h. Adding a sentence which tells the user to carefully set the advance code resources (included the time) `test_qeapp_computational_resources_widget` test function adapted to work with the new wallclock setting. Removed the export folder. --- .../774101c8-e0aa-451b-85ab-bc2829a74706.zip | Bin 177928 -> 0 bytes src/aiidalab_qe/common/widgets.py | 9 +++++---- tests/test_codes.py | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) delete mode 100644 exports/774101c8-e0aa-451b-85ab-bc2829a74706.zip diff --git a/exports/774101c8-e0aa-451b-85ab-bc2829a74706.zip b/exports/774101c8-e0aa-451b-85ab-bc2829a74706.zip deleted file mode 100644 index c9a4e709945f21f5456bbf59e0350195b4b4a0b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 177928 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 z zO#5!XxN3oV2<<&&o>H*6W$_~riMYG~#1{r?7x&{^+&huzz|^Xi_gkZ%Zpeym@}I7^ zH4}emTyS93aH*_r1`NvpIi~Xj7_oUbrn)#pUnC@57Q#-lM=M9^nI4qq<}O8LvbKuqdthDTB@s^$^3*7uc(ESIRrm3D5B0K$+W+zTFVEHj?O8I{&#A&8gPf+<)H7uT?>ne*p&< zuMV^n3h%WMTjFXo^=``Ba*h{!KCB-7ou320qO@|^!6W>F8?McG9UVRrfcp&vo9c)R zhL~AMY}@v0@H|Qq*u=H@f`|7Hae~z>-6Eu?CzHEnH+ckFzst?jxVcKhyYOzyo)EwM zH37U#|9nX(3gV1;_wY^7M6O!LgmjBC>9(Y^VVfrDfzop;cI?*CGsW357qlXxtr~)W z&*@gLtCD)&qM;T#4@S`KhD_nz${#CDkN$Ab_memu5NuO4OVHh_NRsu=^n#;^odX$j zv;sT|6{^bYIWP0}aTAU}>u0mz%zBoKpdqd`CEtqR2+?fgcEnY~f@5~YCN`fdhS8yr z*WU0@`&p13+V`Q`A7iSdyYC+m`c+ALQI=Z<7ZB+CObz`DG|Qhj9Hx3dK64{?wCjJw z9*1LhUe@kFb?Y|${&NWDv^)8IlJDKKx%A=J)96WM%@-I-w%HG4WzS0eRsXQ2lR3Py z3@zNmY2IiI4;N$gnia~H&j_io+jQ*E9?VgX^kFLSlYooLEr(oZz4SQ`ZX(~G%et4U zRd1{!1Xu@R_(j8TUItG!FvYvFC;QqbjSRz zV-zv9A=qpEa0l`7>%Gu189o*&WDI+LM7IvhwOZx_)p|#{egU(Ir4!53fgy_T-F6bS z*p|Y9*v`ivM`mh;9Xu^1MXb|$P;DHKV^KF^YBQ~BeGBz4jgF`R+rji95(Sy+9VblN zR%ws#YALI5_vEztIw_QGchfoTgMkr;|=)T$(uguhG~N8#tf)pt%qpaSigR7dn$~)v+MfeA$YeMB8Gq zSOX1>u2_sD$E_+3l9p!|wyP)gc%n^$OtHGI`tFAaY_Pe~n72ud^zecK!|9OaOhm}L z3y9BYp0Ls#4Z-BT@v zez+VSG*?R>z7AK3R^U+iB4`h*Jb>Bnnj83DemabiUL7CT=USD|c>^`Q2c9DpNmY}; zl2NpYd1VU+o~zQ@-M(bM`@r3*acLH!GW>{ni3&y4sbxH1|B5BKqB9_~hwM{W)@Qxr zo7N8ltX!=d+^!EmPgGA1?w#zO91h((;XrGGNSH{OfS+5q%=0^cee?I1i~syU2dtjn zssaGGn6RUZi>s5Rvxl&HAvtG}Y%D!3g|YT{TVW4toUN0kh_4g=Up4*>YdOr9 zeCrf|K5as$?H^lSh_S#K0nLBXY`pNc?!q3PHn#5WBA&jUf9AeeGD01*0D#~}0AT+I z^z@h)vVIoV(%#<2QpCmU-&mwU>-z){04R|H0NXDtp&Msp{2R;O`OmR_o=x(1#INO2 zsGNcNwcOKq|EXNKLY7eD9{_N}jTGSeC8FM0+`oU%`t~ATuGoL&{C9hQ^+sD7^q- zr|F2&Q*U(s&70xI|CROMc+=2)2I|*x|7&kREoX550-IIQ|<_g?_A CLl(UN diff --git a/src/aiidalab_qe/common/widgets.py b/src/aiidalab_qe/common/widgets.py index 4393edc6e..b15165883 100644 --- a/src/aiidalab_qe/common/widgets.py +++ b/src/aiidalab_qe/common/widgets.py @@ -746,7 +746,8 @@ class ResourceDetailSettings(ipw.VBox): prompt = ipw.HTML( """

- Specify the parameters for the scheduler (only for advanced user). + Specify the parameters for the scheduler (only for advanced user).
+ These should be specified accordingly to the computer where the code will run.

""" ) @@ -769,9 +770,9 @@ def __init__(self, **kwargs): self.max_wallclock_seconds = ipw.BoundedIntText( value=3600 * 12, step=3600, - min=1800, - max=3600 * 24 * 10, - description="max-wallclock-time (seconds)", + min=60 * 10, + max=3600 * 24, + description="max seconds", style={"description_width": "100px"}, ) super().__init__( diff --git a/tests/test_codes.py b/tests/test_codes.py index f351df525..af03f4a23 100644 --- a/tests/test_codes.py +++ b/tests/test_codes.py @@ -74,6 +74,7 @@ def test_qeapp_computational_resources_widget(): "code": None, "cpus": 1, "cpus_per_task": 1, + 'max_wallclock_seconds': 43200, "nodes": 1, "ntasks_per_node": 1, "parallelization": {"npool": 2}, From 77daa78cfebbf93e0de9ecd1b6fc83facbf380ff Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 19:48:27 +0000 Subject: [PATCH 098/166] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_codes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_codes.py b/tests/test_codes.py index af03f4a23..535d94526 100644 --- a/tests/test_codes.py +++ b/tests/test_codes.py @@ -74,7 +74,7 @@ def test_qeapp_computational_resources_widget(): "code": None, "cpus": 1, "cpus_per_task": 1, - 'max_wallclock_seconds': 43200, + "max_wallclock_seconds": 43200, "nodes": 1, "ntasks_per_node": 1, "parallelization": {"npool": 2}, From e33f6e8ed6a3e12d0c3ab3597bc39697a5424ec6 Mon Sep 17 00:00:00 2001 From: Miki Bonacci Date: Thu, 23 May 2024 20:16:41 +0000 Subject: [PATCH 099/166] Fixing the yaml file with the default builder parameters: added the max_wallclock_seconds. --- tests/test_submit_qe_workchain/test_create_builder_default.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/test_submit_qe_workchain/test_create_builder_default.yml b/tests/test_submit_qe_workchain/test_create_builder_default.yml index 791f4e37f..d16d0e9f7 100644 --- a/tests/test_submit_qe_workchain/test_create_builder_default.yml +++ b/tests/test_submit_qe_workchain/test_create_builder_default.yml @@ -24,16 +24,19 @@ codes: dos: cpus: 1 cpus_per_task: 1 + max_wallclock_seconds: 43200 nodes: 1 ntasks_per_node: 1 projwfc: cpus: 1 cpus_per_task: 1 + max_wallclock_seconds: 43200 nodes: 1 ntasks_per_node: 1 pw: cpus: 2 cpus_per_task: 1 + max_wallclock_seconds: 43200 nodes: 1 ntasks_per_node: 2 parallelization: {} From 39d411b950602ed9f9d0f34ac170fcf756519215 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Sun, 30 Jun 2024 13:37:50 +0100 Subject: [PATCH 100/166] CI: Use uv for installing deps (#752) * CI: Use uv for installing deps - Use FORCE_COLOR to get colored logs in Github UI - Update actions - Don't collect code coverage from tests/ folders * Use uv for readthedocs --- .github/workflows/ci.yml | 26 ++++++++++--------- .../workflows/docker-build-test-upload.yml | 1 + .readthedocs.yaml | 23 +++++----------- docs/source/blogs/index.rst | 2 +- 4 files changed, 23 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 10ee2f6d1..e727c0878 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,7 +1,7 @@ --- # Run basic tests for this app -name: continuous-integration +name: CI on: [push, pull_request] @@ -11,11 +11,13 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true +env: + FORCE_COLOR: 1 + jobs: test-package: - strategy: matrix: tag: [latest] @@ -35,26 +37,26 @@ jobs: steps: - name: Check out app - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - cache: pip - cache-dependency-path: | - **/setup.cfg - **/pyproject.toml - **/requirements*.txt + + - name: Install uv + run: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/uv/releases/download/0.2.13/uv-installer.sh | sh + - name: Install package - run: pip install -e .[dev] aiida-core==${{ matrix.aiida-core-version }} + run: uv pip install --system -e .[dev] aiida-core==${{ matrix.aiida-core-version }} - name: Run pytest - run: pytest -v tests --cov + run: pytest -v tests --cov=aiidalab_qe env: TAG: ${{ matrix.tag }} - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: flags: python-${{ matrix.python-version }} + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/docker-build-test-upload.yml b/.github/workflows/docker-build-test-upload.yml index ba66842a3..bd3e13285 100644 --- a/.github/workflows/docker-build-test-upload.yml +++ b/.github/workflows/docker-build-test-upload.yml @@ -3,6 +3,7 @@ name: Build a new image and then upload the image, tags and manifests to GitHub env: OWNER: ${{ github.repository_owner }} + FORCE_COLOR: 1 on: workflow_call: diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 4e458ea54..0533b11c5 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -10,19 +10,10 @@ build: os: ubuntu-22.04 tools: python: '3.11' - -# Build documentation in the "docs/" directory with Sphinx -sphinx: - configuration: docs/source/conf.py - -# Optionally build your docs in additional formats such as PDF and ePub -# formats: -# - pdf -# - epub - -# Optional but recommended, declare the Python requirements required -# to build your documentation -# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html -python: - install: - - requirements: docs/requirements.txt + commands: + - asdf plugin add uv + - asdf install uv 0.2.13 + - asdf global uv 0.2.13 + - uv venv + - uv pip install -r docs/requirements.txt + - .venv/bin/python -m sphinx -W --keep-going -d _build/doctrees -D language=en -b html docs/source $READTHEDOCS_OUTPUT/html diff --git a/docs/source/blogs/index.rst b/docs/source/blogs/index.rst index b65f74406..5f46e381f 100644 --- a/docs/source/blogs/index.rst +++ b/docs/source/blogs/index.rst @@ -1,4 +1,4 @@ -.. _develop-apps: +.. _blog: ################### Blogs From e2d3d93f5cb620e9875f6fa7254415184068f971 Mon Sep 17 00:00:00 2001 From: Miki Bonacci <46074008+mikibonacci@users.noreply.github.com> Date: Mon, 1 Jul 2024 21:35:54 +0200 Subject: [PATCH 101/166] Deleting the unused diamond.cif file, as it will give case-insensitive in Mac (#757) --- .../app/structure/examples/diamond.cif | 33 ------------------- 1 file changed, 33 deletions(-) delete mode 100644 src/aiidalab_qe/app/structure/examples/diamond.cif diff --git a/src/aiidalab_qe/app/structure/examples/diamond.cif b/src/aiidalab_qe/app/structure/examples/diamond.cif deleted file mode 100644 index 844368a0f..000000000 --- a/src/aiidalab_qe/app/structure/examples/diamond.cif +++ /dev/null @@ -1,33 +0,0 @@ -data_image0 -_cell_length_a 4.332 -_cell_length_b 5.098 -_cell_length_c 4.432 -_cell_angle_alpha 90 -_cell_angle_beta 90 -_cell_angle_gamma 90 - -loop_ - _atom_site_label - _atom_site_occupancy - _atom_site_fract_x - _atom_site_fract_y - _atom_site_fract_z - _atom_site_thermal_displace_type - _atom_site_B_iso_or_equiv - _atom_site_type_symbol - C1 1.0000 0.10045 0.00336 0.25487 Biso 1.000 C - C2 1.0000 0.60034 0.24661 0.25487 Biso 1.000 C - C3 1.0000 0.93283 0.24667 0.75481 Biso 1.000 C - C4 1.0000 0.43520 0.49797 0.30226 Biso 1.000 C - C5 1.0000 0.10042 1.00341 0.74519 Biso 1.000 C - C6 1.0000 0.59801 0.75203 0.80226 Biso 1.000 C - C7 1.0000 0.93509 0.75205 0.30228 Biso 1.000 C - C8 1.0000 0.43519 0.49797 0.69776 Biso 1.000 C - C9 1.0000 0.43298 0.00331 0.24525 Biso 1.000 C - C10 1.0000 0.93287 0.24666 0.24525 Biso 1.000 C - C11 1.0000 0.60031 0.24661 0.74519 Biso 1.000 C - C12 1.0000 0.09813 0.49798 0.19779 Biso 1.000 C - C13 1.0000 0.43295 1.00335 0.75480 Biso 1.000 C - C14 1.0000 0.93508 0.75206 0.69775 Biso 1.000 C - C15 1.0000 0.59802 0.75204 0.19776 Biso 1.000 C - C16 1.0000 0.09811 0.49799 0.80224 Biso 1.000 C From aea602299887355b07ae684b06cf6f9bb6595dd7 Mon Sep 17 00:00:00 2001 From: Miki Bonacci <46074008+mikibonacci@users.noreply.github.com> Date: Mon, 8 Jul 2024 15:32:57 +0200 Subject: [PATCH 102/166] Feature/post install plugins (#755) * Adding the post installation trigger when we install a plugin. Putting also the post install information for the vibroscopy in the plugin.yaml file. * Modification of the name of the post_install command for vibroscopy GUI. Documentation will come in the next commit in order to help developers to set the post installation for their plugins. Also, updating of the plugin_list notebook, now the post installation step title is also printed. to test with the aiidalab-qe-vibroscopy plugin, you should modify the data dictionary of the first block of the notebook like this: data['aiidalab-qe-vibroscopy']['github'] = "https://github.com/mikibonacci/aiidalab-qe-vibroscopy@automatic_installation_codes" data['aiidalab-qe-vibroscopy']['post_install'] = "setup-phonopy" * Modifying the plugin_list notebook to take the local plugins.yaml file. I think this is better, as the file can also contain specific plugin versions which are compatible with the current local qeApp version (not with the remote main). Also, due to this, I modified the plugin.yaml file to update the branch of the vibroscopy plugin. (will change to the release version soon). * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Adding the documentation section on how to setup the post-install for a given plugin. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Updating dependencies: allowing installation of aiidalab-widgets-base[optimade]<2.4.0 * Updating the plugin_list notebook following the pre-commit suggestion. * documentation on automatic post install plugins refined and ready. * Changing the aiidalab-qe-vibroscopy installation from github to pip * Removing the attempt of fetching plugins.yaml file from remote. We should keep it local so we don't risk to load incompatible plugins (wrt the app version). * Adding a space in post_install command in the plugin_list notebook. --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/source/development/plugin_registry.rst | 15 ++++++-- plugin_list.ipynb | 42 +++++++++++++-------- plugins.yaml | 3 +- setup.cfg | 2 +- 4 files changed, 40 insertions(+), 22 deletions(-) diff --git a/docs/source/development/plugin_registry.rst b/docs/source/development/plugin_registry.rst index 9d5fcb77a..ef2f6f616 100644 --- a/docs/source/development/plugin_registry.rst +++ b/docs/source/development/plugin_registry.rst @@ -21,7 +21,8 @@ To include your plugin in the registry, follow these steps: author: "Alice Doe" github: "https://github.com/alicedoe/aiidalab-qe-xyz" documentation: "https://aiidalab-qe-xyz.readthedocs.io/" - pip: "aiidalab-qe-xyz" + pip: "aiidalab-qe-xyz==version-of-the-code" + post-install: "post-install-command" 3. Submit a Pull Request. Direct it to `this repository's Pull Requests section `_. @@ -37,10 +38,16 @@ Plugin Entry Requirements - **github:** If provided, this should be the URL to the plugin's GitHub homepage. -At least one of ``github`` or ``pip`` is required. +At least one of ``github`` or ``pip`` is required. ``pip`` installation will be preferred if both are provided, and "==version-of-the-code" can be omitted (but strongly suggested, to ensure compatiblity). - **pip:** The PyPI package name for your plugin, useful for installation via pip. Example: ``aiida-quantum``. - **documentation:** The URL to your plugin's online documentation, such as ReadTheDocs. - **author:** The developer of the plugin. - -By following these guidelines, you can ensure your plugin is correctly listed and accessible within the AiiDAlab Quantum ESPRESSO app, facilitating its discovery and use by the community. +- **post-install:** a post install Command Line Interface (CLI) command which should be defined inside your plugin if you needs it. For example in the ``aiidalab-qe-vibroscopy`` plugin, we automatically setup the phonopy code via this command. See below for more explanations. + +How to define a post install command in your plugin +--------------------------------------------------------------------- +If you need to run a post-install command, you can define it in the CLI of your package. The command should be designed to be run as ``package-name post-install-command``. +To define the CLI, you can use the ``__main__.py`` file in your source folder and the ``pyproject.toml`` file. You can refer to the `aiidalab-qe-vibroscopy `_ plugin for an example of how to do this. +In that plugin, the automatic setup for the phonopy code is implemented. It assumes that the ``phonopy`` binary is already present on the machine, as the plugin will install it as a dependency. +The post-install command will be triggered after the installation of the plugin (only) from the plugin list page of the Quantum ESPRESSO app. diff --git a/plugin_list.ipynb b/plugin_list.ipynb index a3db71ffd..72741f3c5 100644 --- a/plugin_list.ipynb +++ b/plugin_list.ipynb @@ -22,22 +22,20 @@ "metadata": {}, "outputs": [], "source": [ - "import requests\n", - "import yaml\n", + "from pathlib import Path\n", "\n", - "# URL of the YAML file\n", - "filepath = 'https://raw.githubusercontent.com/aiidalab/aiidalab-qe/main/plugins.yaml'\n", + "import yaml\n", "\n", - "# Fetch the contents of the URL\n", - "response = requests.get(filepath)\n", + "# Get the current working directory\n", + "cwd = Path.cwd()\n", + "# Define a relative path\n", + "relative_path = 'plugins.yaml'\n", + "# Resolve the relative path to an absolute path\n", + "yaml_file = cwd / relative_path\n", "\n", - "# Check if the request was successful\n", - "if response.status_code == 200:\n", - " # Load the YAML content\n", - " data = yaml.safe_load(response.content)\n", - " # Now 'data' contains the YAML file's contents as a Python object\n", - "else:\n", - " print(f\"Failed to fetch the YAML file: HTTP {response.status_code}\")" + "# Load the YAML content\n", + "with yaml_file.open('r') as file:\n", + " data = yaml.safe_load(file)" ] }, { @@ -54,7 +52,6 @@ "from IPython.display import display\n", "\n", "\n", - "\n", "def is_package_installed(package_name):\n", " import importlib\n", " package_name = package_name.replace('-', '_')\n", @@ -97,13 +94,19 @@ " return False\n", "\n", "\n", - "def install_package(package_name, pip, github, output_container, message_container, install_btn, remove_btn, accordion, index):\n", + "def install_package(package_name, pip, github, post_install, output_container, message_container, install_btn, remove_btn, accordion, index):\n", " if pip:\n", " command = [\"pip\", \"install\", pip, \"--user\"]\n", " else:\n", " command = [\"pip\", \"install\", \"git+\" + github, \"--user\"]\n", " message_container.value = f\"\"\"
Installing {package_name}...
\"\"\"\n", " result = execute_command_with_output(command, output_container, install_btn, remove_btn)\n", + " # Execute post install if defined in the plugin.yaml:\n", + " if post_install: \n", + " message_container.value += \"\"\"
Post installation step...
\"\"\"\n", + " command = [sys.executable, '-m', package_name.replace('-','_'), post_install]\n", + " # Execute the command\n", + " result = subprocess.run(command, capture_output=True, text=True)\n", " # if the package was installed successfully\n", " if result:\n", " message_container.value += \"\"\"
Initiating test to load the plugin...
\"\"\"\n", @@ -183,7 +186,7 @@ " install_btn = ipw.Button(description=\"Install\", button_style='success', disabled=installed)\n", " remove_btn = ipw.Button(description=\"Remove\", button_style='danger', disabled=not installed)\n", "\n", - " install_btn.on_click(lambda btn, pn=plugin_name, pip=plugin_data.get('pip', None), github=plugin_data.get('github', ''), oc=output_container, mc=message_container, ib=install_btn, rb=remove_btn, ac=accordion, index=i: install_package(pn, pip, github, oc, mc, ib, rb, ac, index))\n", + " install_btn.on_click(lambda btn, pn=plugin_name, pip=plugin_data.get('pip', None), github=plugin_data.get('github', ''), post = plugin_data.get('post_install', None), oc=output_container, mc=message_container, ib=install_btn, rb=remove_btn, ac=accordion, index=i: install_package(pn, pip, github, post, oc, mc, ib, rb, ac, index))\n", " remove_btn.on_click(lambda btn, pn=plugin_name, oc=output_container, mc=message_container, ib=install_btn, rb=remove_btn, ac=accordion, index=i: run_remove_button(pn, oc, mc, ib, rb, ac, index))\n", "\n", " box = ipw.VBox([\n", @@ -200,6 +203,13 @@ "display(accordion)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/plugins.yaml b/plugins.yaml index 929d5cfc3..98a2de817 100644 --- a/plugins.yaml +++ b/plugins.yaml @@ -9,7 +9,8 @@ aiida-bader: aiidalab-qe-vibroscopy: description: Plugin to compute vibrational properties of materials via the aiida-vibroscopy AiiDA plugin author: Miki Bonacci, Andres Ortega Guerrero - github: https://github.com/mikibonacci/aiidalab-qe-vibroscopy + pip: aiidalab-qe-vibroscopy==1.0.1 + post_install: setup-phonopy aiidalab-qe-muon: description: Plugin to compute muon stopping sites and related properties via the aiida-muon and aiida-musconv AiiDA plugins diff --git a/setup.cfg b/setup.cfg index f1fe1979f..07af6ef5b 100644 --- a/setup.cfg +++ b/setup.cfg @@ -27,7 +27,7 @@ install_requires = aiida-core~=2.2,<3 Jinja2~=3.0 aiida-quantumespresso~=4.6 - aiidalab-widgets-base[optimade]~=2.2.0 + aiidalab-widgets-base[optimade]~=2.2.0,<2.4.0 aiida-pseudo~=1.4 filelock~=3.8 importlib-resources~=5.2 From 2c201f0f2dbc0fc72f1059493fc3b4f635def850 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Mon, 8 Jul 2024 16:44:28 +0100 Subject: [PATCH 103/166] Use uv to install deps during docker build (#761) --- .github/workflows/docker-build-test-upload.yml | 2 +- docker/Dockerfile | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/docker-build-test-upload.yml b/.github/workflows/docker-build-test-upload.yml index bd3e13285..f4579cf31 100644 --- a/.github/workflows/docker-build-test-upload.yml +++ b/.github/workflows/docker-build-test-upload.yml @@ -38,7 +38,7 @@ jobs: # Also, they might have running or stopped containers, # which are not cleaned up by `docker system prun` - name: Reset docker state and cleanup artifacts 🗑️ - if: ${{ inputs.platform != 'x86_64' }} + if: ${{ startsWith(inputs.runsOn, 'ubuntu') }} run: | docker kill $(docker ps --quiet) || true docker rm $(docker ps --all --quiet) || true diff --git a/docker/Dockerfile b/docker/Dockerfile index 1df916f35..aca8a4731 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,5 @@ # syntax=docker/dockerfile:1 +FROM ghcr.io/astral-sh/uv:0.2.18 as uv FROM base-image # Copy whole repo and pre-install the dependencies and app to the tmp folder. @@ -8,7 +9,12 @@ COPY --chown=${NB_UID}:${NB_GID} --from=src . ${PREINSTALL_APP_FOLDER} USER ${NB_USER} -RUN cd ${PREINSTALL_APP_FOLDER} && \ +# Using uv to speed up installation, per docs: +# https://github.com/astral-sh/uv/blob/main/docs/guides/docker.md#using-uv-temporarily +# Use the same constraint file as PIP +ENV UV_CONSTRAINT ${PIP_CONSTRAINT} +RUN --mount=from=uv,source=/uv,target=/bin/uv \ + cd ${PREINSTALL_APP_FOLDER} && \ # Remove all untracked files and directories. For example the setup lock flag file. git clean -fx && \ # It is important to install from `aiidalab install` to mimic the exact installation operation as @@ -21,7 +27,7 @@ RUN cd ${PREINSTALL_APP_FOLDER} && \ # aiidalab install --yes --python ${CONDA_DIR}/bin/python "quantum-espresso@file://${PREINSTALL_APP_FOLDER}" && \ # However, have to use `pip install` explicitly because `aiidalab install` call `pip install --user` which will install the app to `/home/${NB_USER}/.local`. # It won't cause issue for docker but for k8s deployment the home folder is not bind mounted to the pod and the dependencies won't be found. (see issue in `jupyter/docker-stacks` https://github.com/jupyter/docker-stacks/issues/815) - pip install . --no-cache-dir && \ + uv pip install --system --no-cache . && \ fix-permissions "${CONDA_DIR}" && \ fix-permissions "/home/${NB_USER}" From 7f8d18109cba4dec0baae43110a55f62c3c5ac23 Mon Sep 17 00:00:00 2001 From: Miki Bonacci Date: Mon, 8 Jul 2024 16:10:47 +0000 Subject: [PATCH 104/166] Bump version v24.10.0a0 -> v24.10.0a1 --- docs/source/conf.py | 2 +- setup.cfg | 4 ++-- src/aiidalab_qe/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index edd144b23..fc0719077 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- -version = "v24.10.0a0" +version = "v24.10.0a1" release = f"{version}-dev" project = "Quantum ESPRESSO App" copyright_first_year = "2023" diff --git a/setup.cfg b/setup.cfg index 07af6ef5b..43eef8f43 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = aiidalab_qe -version = 24.10.0a0 +version = 24.10.0a1 description = Package for the AiiDAlab QE app long_description = file: README.md long_description_content_type = text/markdown @@ -66,7 +66,7 @@ categories = quantum [bumpver] -current_version = "v24.10.0a0" +current_version = "v24.10.0a1" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = True diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index f4e4f01d4..6d4128302 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -3,4 +3,4 @@ """This module contains project version information for both the app and the workflow.""" -__version__ = "v24.10.0a0" +__version__ = "v24.10.0a1" From 71cf2ffadd149f206d65b7143e38940ddf8c87eb Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Fri, 19 Jul 2024 10:04:34 +0100 Subject: [PATCH 105/166] Remove arm64 build (#776) * Remove arm64 build * Move Dockerfile up * Remove firefox tests * Don't push to dockerhub --- .github/actions/create-dev-env/action.yml | 27 ---- .github/actions/integration-tests/action.yml | 59 ------- .github/actions/load-image/action.yml | 31 ---- .../workflows/docker-build-test-upload.yml | 125 ++++++++------- .github/workflows/docker-merge-tags.yml | 65 -------- .github/workflows/docker-push.yml | 93 ----------- .github/workflows/docker.yml | 144 ------------------ docker/Dockerfile => Dockerfile | 19 +-- README.md | 9 +- .../70_prepare-qe-executable.sh | 0 .../71_install-qeapp.sh | 0 docker/build.json | 10 -- docker/docker-bake.hcl | 27 ---- docker/requirements-dev.txt | 11 -- requirements-docker.txt | 6 + tests_integration/conftest.py | 10 +- tests_integration/docker-compose.yml | 2 +- 17 files changed, 89 insertions(+), 549 deletions(-) delete mode 100644 .github/actions/create-dev-env/action.yml delete mode 100644 .github/actions/integration-tests/action.yml delete mode 100644 .github/actions/load-image/action.yml delete mode 100644 .github/workflows/docker-merge-tags.yml delete mode 100644 .github/workflows/docker-push.yml delete mode 100644 .github/workflows/docker.yml rename docker/Dockerfile => Dockerfile (84%) rename {docker/before-notebook.d => before-notebook.d}/70_prepare-qe-executable.sh (100%) rename {docker/before-notebook.d => before-notebook.d}/71_install-qeapp.sh (100%) delete mode 100644 docker/build.json delete mode 100644 docker/docker-bake.hcl delete mode 100644 docker/requirements-dev.txt create mode 100644 requirements-docker.txt diff --git a/.github/actions/create-dev-env/action.yml b/.github/actions/create-dev-env/action.yml deleted file mode 100644 index b8b3d3d40..000000000 --- a/.github/actions/create-dev-env/action.yml +++ /dev/null @@ -1,27 +0,0 @@ ---- -name: Build environment -description: Create build environment - -inputs: - architecture: - description: architecture to be run on - required: true - type: string - -runs: - using: composite - steps: - # actions/setup-python doesn't support Linux arm64 runners - # See: https://github.com/actions/setup-python/issues/108 - # python3 is manually preinstalled in the arm64 VM self-hosted runner - - name: Set Up Python 🐍 - if: ${{ inputs.architecture == 'amd64' }} - uses: actions/setup-python@v4 - with: - python-version: 3.x - - - name: Install Dev Dependencies 📦 - run: | - pip install --upgrade pip - pip install --upgrade -r docker/requirements-dev.txt - shell: bash diff --git a/.github/actions/integration-tests/action.yml b/.github/actions/integration-tests/action.yml deleted file mode 100644 index ed3f92cc3..000000000 --- a/.github/actions/integration-tests/action.yml +++ /dev/null @@ -1,59 +0,0 @@ ---- -name: Downstream tests -description: Integration downstream tests the bulid image - -inputs: - architecture: - description: Image architecture - required: true - type: string - runsOn: - description: GitHub Actions Runner image - required: true - type: string - -runs: - using: composite - - steps: - - name: Set jupyter token env - run: echo "JUPYTER_TOKEN=$(openssl rand -hex 32)" >> $GITHUB_ENV - shell: bash - - - name: Run pytest to test image is working - run: TAG=newly-baked pytest tests_integration/test_image.py - shell: bash - - # The Firefox and its engine geckodrive need do be installed manually to run - # selenium tests. This only works on amd64 architecture and it should be enough only test this - # on one architecture. - - name: Install Firefox - if : ${{ inputs.architecture == 'amd64' }} - uses: browser-actions/setup-firefox@latest - with: - firefox-version: '96.0' - - - name: Install geckodriver - if : ${{ inputs.architecture == 'amd64' }} - run: | - wget -c https://github.com/mozilla/geckodriver/releases/download/v0.30.0/geckodriver-v0.30.0-linux64.tar.gz - tar xf geckodriver-v0.30.0-linux64.tar.gz -C /usr/local/bin - shell: bash - - - name: Run pytest for firefox - if : ${{ inputs.architecture == 'amd64' }} - run: TAG=newly-baked pytest --driver Firefox tests_integration/test_app.py - shell: bash - - - name: Run pytest for Chrome - if : ${{ inputs.architecture == 'amd64' }} - run: TAG=newly-baked pytest --driver Chrome tests_integration/test_app.py - shell: bash - - - name: Upload screenshots as artifacts - if : ${{ inputs.architecture == 'amd64' }} - uses: actions/upload-artifact@v4 - with: - name: Screenshots-CI-${{ inputs.architecture }} - path: screenshots/ - if-no-files-found: error diff --git a/.github/actions/load-image/action.yml b/.github/actions/load-image/action.yml deleted file mode 100644 index 4bc7a99c6..000000000 --- a/.github/actions/load-image/action.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: Load Docker image -description: Download image tar and load it to docker - -inputs: - image: - description: Image name - required: true - type: string - architecture: - description: Image architecture - required: true - type: string - -runs: - using: composite - steps: - - name: Download built image 📥 - uses: actions/download-artifact@v4 - with: - name: ${{ inputs.image }}-${{ inputs.architecture }} - path: /tmp/aiidalab/ - - name: Load downloaded image to docker 📥 - run: | - docker load --input /tmp/aiidalab/${{ inputs.image }}-${{ inputs.architecture }}.tar - docker image ls --all - shell: bash - - name: Delete the file 🗑️ - run: rm -f /tmp/aiidalab/${{ inputs.image }}-${{ inputs.architecture }}.tar - shell: bash - if: always() diff --git a/.github/workflows/docker-build-test-upload.yml b/.github/workflows/docker-build-test-upload.yml index f4579cf31..ab62a71fb 100644 --- a/.github/workflows/docker-build-test-upload.yml +++ b/.github/workflows/docker-build-test-upload.yml @@ -1,78 +1,91 @@ --- -name: Build a new image and then upload the image, tags and manifests to GitHub artifacts +name: Build Docker image + +on: + pull_request: + push: + branches: + - main + tags: + - v* + workflow_dispatch: env: - OWNER: ${{ github.repository_owner }} FORCE_COLOR: 1 + IMAGE: ghcr.io/aiidalab/qe + BUILDKIT_PROGRESS: plain -on: - workflow_call: - inputs: - image: - description: Image name - required: true - type: string - architecture: - description: Image architecture, e.g. amd64, arm64 - required: true - type: string - runsOn: - description: GitHub Actions Runner image - required: true - type: string +# https://docs.github.com/en/actions/using-jobs/using-concurrency +concurrency: + # only cancel in-progress jobs or runs for the current workflow - matches against branch & tags + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true jobs: build-test-upload: - runs-on: ${{ inputs.runsOn }} + runs-on: ubuntu-latest continue-on-error: true steps: - name: Checkout Repo ⚡️ uses: actions/checkout@v4 - - name: Create dev environment 📦 - uses: ./.github/actions/create-dev-env + + - name: Login to Container Registry 🔑 + uses: docker/login-action@v2 + if: ${{ !github.event.pull_request.head.repo.fork }} with: - architecture: ${{ inputs.architecture }} + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} - # Self-hosted runners share a state (whole VM) between runs - # Also, they might have running or stopped containers, - # which are not cleaned up by `docker system prun` - - name: Reset docker state and cleanup artifacts 🗑️ - if: ${{ startsWith(inputs.runsOn, 'ubuntu') }} - run: | - docker kill $(docker ps --quiet) || true - docker rm $(docker ps --all --quiet) || true - docker system prune --all --force - rm -rf /tmp/aiidalab/ - shell: bash + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 - - name: Build image 🛠 - working-directory: docker - run: docker buildx bake --set qe.platform=linux/${{ inputs.architecture }} -f docker-bake.hcl -f build.json --load - env: - # Use buildx - DOCKER_BUILDKIT: 1 - # Full logs for CI build - BUILDKIT_PROGRESS: plain - shell: bash + - name: Docker meta 📝 + id: meta + uses: docker/metadata-action@v5 + with: + images: | + name=${{ env.IMAGE }} + tags: | + type=ref,event=pr + type=edge,enable={{is_default_branch}} + type=raw,value={{tag}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - name: Run tests ✅ - uses: ./.github/actions/integration-tests + - name: Build and push image + id: build-upload + uses: docker/build-push-action@v5 with: - architecture: ${{ inputs.architecture }} - runsOn: ${{ inputs.runsOn }} + tags: ${{ steps.meta.outputs.tags }} + load: ${{ github.event.pull_request.head.repo.fork }} + push: ${{ ! github.event.pull_request.head.repo.fork }} + context: . + platforms: linux/amd64 + cache-to: | + type=gha,scope=${{ github.workflow }},mode=min + cache-from: | + type=gha,scope=${{ github.workflow }} - - name: Save image as a tar for later use 💾 - run: | - mkdir -p /tmp/aiidalab/ - docker save ${{ env.OWNER }}/${{ inputs.image }} -o /tmp/aiidalab/${{ inputs.image }}-${{ inputs.architecture }}.tar - shell: bash - if: always() + - name: Set Up Python 🐍 + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Install Dev Dependencies 📦 + run: pip install -r requirements-docker.txt - - name: Upload image as artifact 💾 + - name: Set jupyter token env + run: echo "JUPYTER_TOKEN=$(openssl rand -hex 32)" >> $GITHUB_ENV + + - name: Run pytest for Chrome + run: pytest --driver Chrome tests_integration/ + env: + QE_IMAGE: ${{ env.IMAGE }}@${{ steps.build-upload.outputs.digest }} + + - name: Upload screenshots as artifacts + if: always() uses: actions/upload-artifact@v4 with: - name: ${{ inputs.image }}-${{ inputs.architecture }} - path: /tmp/aiidalab/${{ inputs.image }}-${{ inputs.architecture }}.tar - retention-days: 3 - if: always() + name: Screenshots + path: screenshots/ + if-no-files-found: error diff --git a/.github/workflows/docker-merge-tags.yml b/.github/workflows/docker-merge-tags.yml deleted file mode 100644 index b0d43fec6..000000000 --- a/.github/workflows/docker-merge-tags.yml +++ /dev/null @@ -1,65 +0,0 @@ ---- -name: Download images tags from GitHub artifacts and create multi-platform manifests - -on: - workflow_call: - inputs: - image: - description: Image name - required: true - type: string - registry: - description: Docker registry, e.g. ghcr.io, docker.io - required: true - type: string - secrets: - REGISTRY_USERNAME: - required: true - REGISTRY_TOKEN: - required: true - - -jobs: - merge-tags: - runs-on: ubuntu-latest - - steps: - - name: Checkout Repo ⚡️ - uses: actions/checkout@v4 - - name: Create dev environment 📦 - uses: ./.github/actions/create-dev-env - with: - architecture: amd64 - - - name: Download amd64 tags file 📥 - uses: actions/download-artifact@v4 - with: - name: ${{ inputs.registry }}-${{ inputs.image }}-amd64-tags - path: /tmp/aiidalab - - name: Download arm64 tags file 📥 - uses: actions/download-artifact@v4 - with: - name: ${{ inputs.registry }}-${{ inputs.image }}-arm64-tags - path: /tmp/aiidalab - - - name: Login to Container Registry 🔑 - uses: docker/login-action@v2 - with: - registry: ${{ inputs.registry }} - username: ${{ secrets.REGISTRY_USERNAME }} - password: ${{ secrets.REGISTRY_TOKEN }} - - - name: Merge tags for the images of different arch 🔀 - run: | - for arch_tag in $(cat /tmp/aiidalab/${{ inputs.image }}-amd64-tags.txt); do - tag=$(echo $arch_tag | sed "s/:amd64-/:/") - docker manifest create $tag --amend $arch_tag - docker manifest push $tag - done - - for arch_tag in $(cat /tmp/aiidalab/${{ inputs.image }}-arm64-tags.txt); do - tag=$(echo $arch_tag | sed "s/:arm64-/:/") - docker manifest create $tag --amend $arch_tag - docker manifest push $tag - done - shell: bash diff --git a/.github/workflows/docker-push.yml b/.github/workflows/docker-push.yml deleted file mode 100644 index ddc9d63ee..000000000 --- a/.github/workflows/docker-push.yml +++ /dev/null @@ -1,93 +0,0 @@ ---- -name: Download Docker image and its tags from GitHub artifacts, apply them and push the image to container registry - -env: - OWNER: ${{ github.repository_owner }} - -on: - workflow_call: - inputs: - image: - description: Image name - required: true - type: string - architecture: - description: Image architecture - required: true - type: string - registry: - description: Docker registry - required: true - type: string - secrets: - REGISTRY_USERNAME: - required: true - REGISTRY_TOKEN: - required: true - -jobs: - tag-push: - runs-on: ubuntu-latest - - steps: - - name: Checkout Repo ⚡️ - uses: actions/checkout@v3 - - name: Create dev environment 📦 - uses: ./.github/actions/create-dev-env - with: - architecture: ${{ inputs.architecture }} - - name: Load image to Docker 📥 - uses: ./.github/actions/load-image - with: - image: ${{ inputs.image }} - architecture: ${{ inputs.architecture }} - - - name: Read build variables - working-directory: docker - id: build_vars - run: | - vars=$(cat build.json | jq -c '[.variable | to_entries[] | {"key": .key, "value": .value.default}] | from_entries') - echo "vars=$vars" >> "${GITHUB_OUTPUT}" - - - name: Docker meta 📝 - id: meta - uses: docker/metadata-action@v4 - env: ${{ fromJson(steps.build_vars.outputs.vars) }} - with: - images: | - name=${{ inputs.registry }}/${{ env.OWNER }}/${{ inputs.image }} - tags: | - type=edge,enable={{is_default_branch}} - type=sha,enable=${{ github.ref_type != 'tag' }} - type=ref,event=pr - type=match,pattern=v(\d{2}\.\d{2}.\d+.*),group=1 - type=raw,value={{tag}},enable=${{ startsWith(github.ref, 'refs/tags/v') }} - type=raw,value=qe-${{ env.QE_VERSION }},enable=${{ startsWith(github.ref, 'refs/tags/v') }} - - - name: Login to Container Registry 🔑 - uses: docker/login-action@v2 - with: - registry: ${{ inputs.registry }} - username: ${{ secrets.REGISTRY_USERNAME }} - password: ${{ secrets.REGISTRY_TOKEN }} - - - name: Set tags for image and push 🏷️📤💾 - run: | - declare -a arr=(${{ steps.meta.outputs.tags }}) - for tag in "${arr[@]}"; do - arch_tag=$(echo ${tag} | sed "s/:/:${{ inputs.architecture }}-/") - docker tag aiidalab/${{ inputs.image }}:newly-baked ${arch_tag} - docker push ${arch_tag} - - # write tag to file - mkdir -p /tmp/aiidalab/ - echo ${arch_tag} >> /tmp/aiidalab/${{ inputs.image }}-${{ inputs.architecture }}-tags.txt - done - shell: bash - - - name: Upload tags file 📤 - uses: actions/upload-artifact@v4 - with: - name: ${{ inputs.registry }}-${{ inputs.image }}-${{ inputs.architecture }}-tags - path: /tmp/aiidalab/${{ inputs.image }}-${{ inputs.architecture }}-tags.txt - retention-days: 3 diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml deleted file mode 100644 index 32d0d64a9..000000000 --- a/.github/workflows/docker.yml +++ /dev/null @@ -1,144 +0,0 @@ ---- -name: Build, and push Docker Image - -on: - pull_request: - paths: - - .github/workflows/docker.yml - # We use local reusable workflows to make architecture clean an simple - # https://docs.github.com/en/actions/using-workflows/reusing-workflows - - .github/workflows/docker-build-test-upload.yml - - .github/workflows/docker-merge-tags.yml - - .github/workflows/docker-push.yml - - # We use local composite actions to combine multiple workflow steps within one action - # https://docs.github.com/en/actions/creating-actions/about-custom-actions#composite-actions - - .github/actions/create-dev-env/action.yml - - .github/actions/load-image/action.yml - - - src/** - - docker/** - - qe.ipynb - - setup.cfg - - pyproject.toml - - push: - branches: - - main - tags: - - v* - paths: - - .github/workflows/docker.yml - # We use local reusable workflows to make architecture clean an simple - # https://docs.github.com/en/actions/using-workflows/reusing-workflows - - .github/workflows/docker-build-test-upload.yml - - .github/workflows/docker-merge-tags.yml - - .github/workflows/docker-push.yml - - # We use local composite actions to combine multiple workflow steps within one action - # https://docs.github.com/en/actions/creating-actions/about-custom-actions#composite-actions - - .github/actions/create-dev-env/action.yml - - .github/actions/load-image/action.yml - - - src/** - - docker/** - - qe.ipynb - - setup.cfg - - pyproject.toml - workflow_dispatch: - schedule: - # Periodically build and test the image and keep `edge` always up-to-date - # Weekly, at 03:00 on Monday UTC time - - cron: 0 3 * * 1 - -# https://docs.github.com/en/actions/using-jobs/using-concurrency -concurrency: - # only cancel in-progress jobs or runs for the current workflow - matches against branch & tags - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - amd64: - uses: ./.github/workflows/docker-build-test-upload.yml - with: - image: qe - architecture: amd64 - runsOn: ubuntu-latest - - arm64: - uses: ./.github/workflows/docker-build-test-upload.yml - with: - image: qe - architecture: arm64 - runsOn: ARM64 - if: ${{ !github.event.pull_request.head.repo.fork }} - - amd64-push-ghcr: - uses: ./.github/workflows/docker-push.yml - with: - image: qe - architecture: amd64 - registry: ghcr.io - secrets: - REGISTRY_USERNAME: ${{ github.actor }} - REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} - needs: [amd64] - if: ${{ !github.event.pull_request.head.repo.fork }} - - arm64-push-ghcr: - uses: ./.github/workflows/docker-push.yml - with: - image: qe - architecture: arm64 - registry: ghcr.io - secrets: - REGISTRY_USERNAME: ${{ github.actor }} - REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} - needs: [arm64] - if: ${{ !github.event.pull_request.head.repo.fork }} - - merge-tags-ghcr: - uses: ./.github/workflows/docker-merge-tags.yml - with: - image: qe - registry: ghcr.io - secrets: - REGISTRY_USERNAME: ${{ github.actor }} - REGISTRY_TOKEN: ${{ secrets.GITHUB_TOKEN }} - needs: [amd64-push-ghcr, arm64-push-ghcr] - if: ${{ !github.event.pull_request.head.repo.fork }} - - amd64-push-dockerhub: - if: github.repository == 'aiidalab/aiidalab-qe' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) - uses: ./.github/workflows/docker-push.yml - with: - image: qe - architecture: amd64 - registry: docker.io - secrets: - REGISTRY_USERNAME: ${{ secrets.DOCKER_USERNAME }} - REGISTRY_TOKEN: ${{ secrets.DOCKER_PASSWORD }} - needs: [amd64] - - arm64-push-dockerhub: - if: github.repository == 'aiidalab/aiidalab-qe' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) - uses: ./.github/workflows/docker-push.yml - with: - image: qe - architecture: arm64 - registry: docker.io - secrets: - REGISTRY_USERNAME: ${{ secrets.DOCKER_USERNAME }} - REGISTRY_TOKEN: ${{ secrets.DOCKER_PASSWORD }} - needs: [arm64] - - merge-tags-dockerhub: - if: github.repository == 'aiidalab/aiidalab-qe' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')) - uses: ./.github/workflows/docker-merge-tags.yml - with: - image: qe - registry: docker.io - secrets: - REGISTRY_USERNAME: ${{ secrets.DOCKER_USERNAME }} - REGISTRY_TOKEN: ${{ secrets.DOCKER_PASSWORD }} - needs: [amd64-push-dockerhub, arm64-push-dockerhub] diff --git a/docker/Dockerfile b/Dockerfile similarity index 84% rename from docker/Dockerfile rename to Dockerfile index aca8a4731..c53456900 100644 --- a/docker/Dockerfile +++ b/Dockerfile @@ -1,18 +1,18 @@ # syntax=docker/dockerfile:1 -FROM ghcr.io/astral-sh/uv:0.2.18 as uv -FROM base-image +FROM ghcr.io/astral-sh/uv:0.2.18 AS uv +FROM ghcr.io/aiidalab/full-stack:2024.1019 # Copy whole repo and pre-install the dependencies and app to the tmp folder. # In the before notebook scripts the app will be re-installed by moving it to the app folder. -ENV PREINSTALL_APP_FOLDER ${CONDA_DIR}/aiidalab-qe -COPY --chown=${NB_UID}:${NB_GID} --from=src . ${PREINSTALL_APP_FOLDER} +ENV PREINSTALL_APP_FOLDER=${CONDA_DIR}/aiidalab-qe +COPY --chown=${NB_UID}:${NB_GID} . ${PREINSTALL_APP_FOLDER} USER ${NB_USER} # Using uv to speed up installation, per docs: # https://github.com/astral-sh/uv/blob/main/docs/guides/docker.md#using-uv-temporarily # Use the same constraint file as PIP -ENV UV_CONSTRAINT ${PIP_CONSTRAINT} +ENV UV_CONSTRAINT=${PIP_CONSTRAINT} RUN --mount=from=uv,source=/uv,target=/bin/uv \ cd ${PREINSTALL_APP_FOLDER} && \ # Remove all untracked files and directories. For example the setup lock flag file. @@ -31,12 +31,7 @@ RUN --mount=from=uv,source=/uv,target=/bin/uv \ fix-permissions "${CONDA_DIR}" && \ fix-permissions "/home/${NB_USER}" -# The app version is used for installing the app when first time the container is started. -ARG APP_VERSION -ENV APP_VERSION ${APP_VERSION} - -ARG QE_VERSION -ENV QE_VERSION ${QE_VERSION} +ENV QE_VERSION="7.2" RUN mamba create -p /opt/conda/envs/quantum-espresso --yes \ qe=${QE_VERSION} \ && mamba clean --all -f -y && \ @@ -44,7 +39,7 @@ RUN mamba create -p /opt/conda/envs/quantum-espresso --yes \ fix-permissions "/home/${NB_USER}" # Download the QE pseudopotentials to the folder for afterware installation. -ENV PSEUDO_FOLDER ${CONDA_DIR}/pseudo +ENV PSEUDO_FOLDER=${CONDA_DIR}/pseudo RUN mkdir -p ${PSEUDO_FOLDER} && \ python -m aiidalab_qe download-pseudos --dest ${PSEUDO_FOLDER} diff --git a/README.md b/README.md index 2c3725ab2..f5c167709 100644 --- a/README.md +++ b/README.md @@ -32,15 +32,14 @@ pytest -sv tests To run the integration tests, you need to build the Docker image first: ``` -cd docker/ -docker buildx bake -f build.json -f docker-bake.hcl --set "*.platform=linux/amd64" --load +docker build . -t aiidalab/qe ``` Then, you can run the integration tests with: ```bash -JUPYTER_TOKEN=max TAG=newly-baked pytest --driver Chrome tests_integration -sv -`````` +pytest --driver Chrome tests_integration +``` ## For maintainers @@ -57,7 +56,7 @@ Additional notes: - Use the `--dry` option to preview the release change. - The release tag (e.g. a/b/rc) is determined from the last release. Use the `--tag` option to switch the release tag. - - For making "outdate" release since we fix minor version to `2x.04.xx` and `2x.10.xx`, use e.g. `bumpver update --set-version v23.10.0rc4 --ignore-vcs-tag` to make the release. + - For making "outdated" release since we fix minor version to `2x.04.xx` and `2x.10.xx`, use e.g. `bumpver update --set-version v23.10.0rc4 --ignore-vcs-tag` to make the release. ## Acknowledgements We acknowledge support from: diff --git a/docker/before-notebook.d/70_prepare-qe-executable.sh b/before-notebook.d/70_prepare-qe-executable.sh similarity index 100% rename from docker/before-notebook.d/70_prepare-qe-executable.sh rename to before-notebook.d/70_prepare-qe-executable.sh diff --git a/docker/before-notebook.d/71_install-qeapp.sh b/before-notebook.d/71_install-qeapp.sh similarity index 100% rename from docker/before-notebook.d/71_install-qeapp.sh rename to before-notebook.d/71_install-qeapp.sh diff --git a/docker/build.json b/docker/build.json deleted file mode 100644 index 44dc1b92a..000000000 --- a/docker/build.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "variable": { - "AIIDALAB_BASE_IMAGE": { - "default": "ghcr.io/aiidalab/full-stack:2024.1019" - }, - "QE_VERSION": { - "default": "7.2" - } - } -} diff --git a/docker/docker-bake.hcl b/docker/docker-bake.hcl deleted file mode 100644 index 97017844f..000000000 --- a/docker/docker-bake.hcl +++ /dev/null @@ -1,27 +0,0 @@ -# docker-bake.hcl for building QeApp images -group "default" { - targets = ["qe"] -} - -variable "QE_VERSION" { -} - -variable "BASE_IMAGE" { - default = "aiidalab/full-stack:latest" -} - -variable "ORGANIZATION" { - default = "aiidalab" -} - -target "qe" { - tags = ["${ORGANIZATION}/qe:newly-baked"] - context = "." - contexts = { - src = ".." - base-image = "docker-image://${BASE_IMAGE}" - } - args = { - "QE_VERSION" = "${QE_VERSION}" - } -} diff --git a/docker/requirements-dev.txt b/docker/requirements-dev.txt deleted file mode 100644 index 4c8d31491..000000000 --- a/docker/requirements-dev.txt +++ /dev/null @@ -1,11 +0,0 @@ -docker -requests -pre-commit -pytest -pytest-docker - -# test dependencies -pytest-selenium -pytest-html<4.0 -selenium~=4.9.0 -webdriver-manager diff --git a/requirements-docker.txt b/requirements-docker.txt new file mode 100644 index 000000000..4cfdbb2c9 --- /dev/null +++ b/requirements-docker.txt @@ -0,0 +1,6 @@ +docker +requests +pytest~=8.2.0 +pytest-docker~=3.0 +pytest-selenium~=4.1 +selenium==4.20.0 diff --git a/tests_integration/conftest.py b/tests_integration/conftest.py index f27cc24ac..cbd576174 100644 --- a/tests_integration/conftest.py +++ b/tests_integration/conftest.py @@ -4,7 +4,7 @@ import pytest import requests -import selenium.webdriver.support.expected_conditions as EC +import selenium.webdriver.support.expected_conditions as ec from requests.exceptions import ConnectionError from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait @@ -85,7 +85,7 @@ def _selenium_driver(nb_path, wait_time=5.0): selenium.find_element(By.ID, "ipython-main-app") selenium.find_element(By.ID, "notebook-container") WebDriverWait(selenium, 100).until( - EC.invisibility_of_element((By.ID, "appmode-busy")) + ec.invisibility_of_element((By.ID, "appmode-busy")) ) return selenium @@ -116,12 +116,6 @@ def screenshot_dir(): return sdir -@pytest.fixture -def firefox_options(firefox_options): - firefox_options.add_argument("--headless") - return firefox_options - - @pytest.fixture def chrome_options(chrome_options): chrome_options.add_argument("--headless") diff --git a/tests_integration/docker-compose.yml b/tests_integration/docker-compose.yml index 5c506843b..9a5a6809b 100644 --- a/tests_integration/docker-compose.yml +++ b/tests_integration/docker-compose.yml @@ -4,7 +4,7 @@ version: '3.4' services: aiidalab: - image: ${REGISTRY:-}${QE_IMAGE:-aiidalab/qe}:${TAG:-newly-baked} + image: ${REGISTRY:-}${QE_IMAGE:-aiidalab/qe}${TAG} environment: TZ: Europe/Zurich DOCKER_STACKS_JUPYTER_CMD: notebook From bdefa84f145b28fea615174ecfb8e3288c607010 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Fri, 19 Jul 2024 12:22:09 +0100 Subject: [PATCH 106/166] Fix Docker build on main branch (#779) --- .github/workflows/docker-build-test-upload.yml | 4 ++-- tests_integration/docker-compose.yml | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker-build-test-upload.yml b/.github/workflows/docker-build-test-upload.yml index ab62a71fb..c285cf4d0 100644 --- a/.github/workflows/docker-build-test-upload.yml +++ b/.github/workflows/docker-build-test-upload.yml @@ -57,8 +57,8 @@ jobs: uses: docker/build-push-action@v5 with: tags: ${{ steps.meta.outputs.tags }} - load: ${{ github.event.pull_request.head.repo.fork }} - push: ${{ ! github.event.pull_request.head.repo.fork }} + load: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork }} + push: ${{ ! (github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork) }} context: . platforms: linux/amd64 cache-to: | diff --git a/tests_integration/docker-compose.yml b/tests_integration/docker-compose.yml index 9a5a6809b..cd9e4f03c 100644 --- a/tests_integration/docker-compose.yml +++ b/tests_integration/docker-compose.yml @@ -1,10 +1,8 @@ --- -version: '3.4' - services: aiidalab: - image: ${REGISTRY:-}${QE_IMAGE:-aiidalab/qe}${TAG} + image: ${REGISTRY:-}${QE_IMAGE:-aiidalab/qe}${TAG:-} environment: TZ: Europe/Zurich DOCKER_STACKS_JUPYTER_CMD: notebook From c70c8296207b541c208f0350671bd12a2ad77fd8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:02:31 +0200 Subject: [PATCH 107/166] Bump urllib3 from 2.0.3 to 2.0.7 in /docs (#684) Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.3 to 2.0.7. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.0.3...2.0.7) --- updated-dependencies: - dependency-name: urllib3 dependency-type: indirect ... --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index cb854f417..3e6b5d38d 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -70,7 +70,7 @@ sphinxcontrib-serializinghtml==1.1.5 # via sphinx typing-extensions==4.8.0 # via pydata-sphinx-theme -urllib3==2.0.3 +urllib3==2.0.7 # via requests zipp==3.17.0 # via importlib-metadata From 86a1fe9c8f8c71e56357250087555ae4928daae2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:03:35 +0200 Subject: [PATCH 108/166] --- (#741) updated-dependencies: - dependency-name: requests dependency-type: indirect ... --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 3e6b5d38d..96e977ed3 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -43,7 +43,7 @@ pygments==2.15.1 # accessible-pygments # pydata-sphinx-theme # sphinx -requests==2.31.0 +requests==2.32.0 # via sphinx snowballstemmer==2.2.0 # via sphinx From 7de62a10d3ffb0fd46e079579b9b6afc2a57183e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:04:26 +0200 Subject: [PATCH 109/166] Bump jinja2 from 3.1.2 to 3.1.4 in /docs (#722) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.4. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.4) --- updated-dependencies: - dependency-name: jinja2 dependency-type: indirect ... --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 96e977ed3..9080b43a7 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -28,7 +28,7 @@ imagesize==1.4.1 # via sphinx importlib-metadata==6.8.0 # via sphinx -jinja2==3.1.2 +jinja2==3.1.4 # via sphinx markupsafe==2.1.3 # via jinja2 From 036003319ad6dddd64c392f5f41d12b550f77c61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:30:16 +0200 Subject: [PATCH 110/166] Bump certifi from 2023.5.7 to 2023.7.22 in /docs (#686) Bumps [certifi](https://github.com/certifi/python-certifi) from 2023.5.7 to 2023.7.22. - [Commits](https://github.com/certifi/python-certifi/compare/2023.05.07...2023.07.22) --- updated-dependencies: - dependency-name: certifi dependency-type: indirect ... --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 9080b43a7..e2b8531f3 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -14,7 +14,7 @@ babel==2.12.1 # sphinx beautifulsoup4==4.12.2 # via pydata-sphinx-theme -certifi==2023.5.7 +certifi==2023.7.22 # via requests charset-normalizer==3.1.0 # via requests From 02dce651af29396c102d2398db5d2978c5a05cd5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:31:34 +0200 Subject: [PATCH 111/166] Bump certifi from 2023.5.7 to 2024.7.4 in /docs (#767) Bumps [certifi](https://github.com/certifi/python-certifi) from 2023.5.7 to 2024.7.4. - [Commits](https://github.com/certifi/python-certifi/compare/2023.05.07...2024.07.04) --- updated-dependencies: - dependency-name: certifi dependency-type: indirect ... --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index e2b8531f3..9da63020f 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -14,7 +14,7 @@ babel==2.12.1 # sphinx beautifulsoup4==4.12.2 # via pydata-sphinx-theme -certifi==2023.7.22 +certifi==2024.7.4 # via requests charset-normalizer==3.1.0 # via requests From cce0c91f1af9ef96d39aadcf418fe256720b201a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 15:32:08 +0200 Subject: [PATCH 112/166] Bump zipp from 3.17.0 to 3.19.1 in /docs (#771) Bumps [zipp](https://github.com/jaraco/zipp) from 3.17.0 to 3.19.1. - [Release notes](https://github.com/jaraco/zipp/releases) - [Changelog](https://github.com/jaraco/zipp/blob/main/NEWS.rst) - [Commits](https://github.com/jaraco/zipp/compare/v3.17.0...v3.19.1) --- updated-dependencies: - dependency-name: zipp dependency-type: indirect ... --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 9da63020f..ad92937b8 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -72,5 +72,5 @@ typing-extensions==4.8.0 # via pydata-sphinx-theme urllib3==2.0.7 # via requests -zipp==3.17.0 +zipp==3.19.1 # via importlib-metadata From 122efe1ca84df125ee428107544a07afcc6dc5da Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 11:28:34 +0100 Subject: [PATCH 113/166] [pre-commit.ci] pre-commit autoupdate (#759) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/pre-commit/pre-commit-hooks: v4.5.0 → v4.6.0](https://github.com/pre-commit/pre-commit-hooks/compare/v4.5.0...v4.6.0) - [github.com/sirosen/check-jsonschema: 0.28.1 → 0.28.6](https://github.com/sirosen/check-jsonschema/compare/0.28.1...0.28.6) - [github.com/astral-sh/ruff-pre-commit: v0.3.4 → v0.5.0](https://github.com/astral-sh/ruff-pre-commit/compare/v0.3.4...v0.5.0) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 88747e471..123447ae1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,7 +5,7 @@ ci: repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.5.0 + rev: v4.6.0 hooks: - id: check-json - id: check-yaml @@ -20,7 +20,7 @@ repos: exclude: tests - repo: https://github.com/sirosen/check-jsonschema - rev: 0.28.1 + rev: 0.28.6 hooks: - id: check-github-workflows @@ -42,7 +42,7 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.3.4 + rev: v0.5.0 hooks: # Run the linter. - id: ruff From 533027367197f32ab4de4f0423d6cf806374f8e7 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Tue, 23 Jul 2024 13:15:11 +0100 Subject: [PATCH 114/166] Print container logs if service fails to start (#782) When a Docker container fails to start properly, the integration tests fail with a timeout error. In that case, we will print container logs for debugging. --- .github/workflows/docker-build-test-upload.yml | 2 +- tests_integration/conftest.py | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.github/workflows/docker-build-test-upload.yml b/.github/workflows/docker-build-test-upload.yml index c285cf4d0..f8f0e3b55 100644 --- a/.github/workflows/docker-build-test-upload.yml +++ b/.github/workflows/docker-build-test-upload.yml @@ -78,7 +78,7 @@ jobs: run: echo "JUPYTER_TOKEN=$(openssl rand -hex 32)" >> $GITHUB_ENV - name: Run pytest for Chrome - run: pytest --driver Chrome tests_integration/ + run: pytest -sv --driver Chrome tests_integration/ env: QE_IMAGE: ${{ env.IMAGE }}@${{ steps.build-upload.outputs.digest }} diff --git a/tests_integration/conftest.py b/tests_integration/conftest.py index cbd576174..39eb0f7f7 100644 --- a/tests_integration/conftest.py +++ b/tests_integration/conftest.py @@ -50,19 +50,22 @@ def nb_user(aiidalab_exec): @pytest.fixture(scope="session") -def notebook_service(docker_ip, docker_services): +def notebook_service(docker_compose, docker_ip, docker_services): """Ensure that HTTP service is up and responsive.""" # `port_for` takes a container port and returns the corresponding host port port = docker_services.port_for("aiidalab", 8888) url = f"http://{docker_ip}:{port}" token = os.environ.get("JUPYTER_TOKEN", "testtoken") - docker_services.wait_until_responsive( - # The timeout is very high for this test, because the installation of pseudo libraries. - timeout=180.0, - pause=0.1, - check=lambda: is_responsive(url), - ) + try: + docker_services.wait_until_responsive( + timeout=180.0, + pause=1.0, + check=lambda: is_responsive(url), + ) + except Exception as e: + print(docker_compose.execute("logs").decode().strip()) + pytest.exit(e) return url, token From a3b40b0d6d8305a71ee0cbb09628bb1ee960ea47 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Tue, 23 Jul 2024 13:17:24 +0100 Subject: [PATCH 115/166] Move QE conda install into separate stage (#783) When building the QEApp Docker container, the Quantum Espresso installation into a conda environment is a step that's completely independent from the others. By putting it into a separate Docker build stage, it can be build in parallel (when using buildkit), as: DOCKER_BUILDKIT=1 docker build . --- .dockerignore | 16 +++++++ .../workflows/docker-build-test-upload.yml | 2 +- Dockerfile | 47 ++++++++++--------- before-notebook.d/70_prepare-qe-executable.sh | 2 +- 4 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..f45fee4b5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +**/*.egg-info +**/__pycache__ +**/.*_cache +**/*.pyc +**/*.tar.gz +*.code-workspace +**/.*.ipynb +**/.ipynb* +.venv/ +build/ +export/ +.do-not-setup-on-localhost + +# Sphinx documentation +docs/html +screenshots/ diff --git a/.github/workflows/docker-build-test-upload.yml b/.github/workflows/docker-build-test-upload.yml index f8f0e3b55..521f640ad 100644 --- a/.github/workflows/docker-build-test-upload.yml +++ b/.github/workflows/docker-build-test-upload.yml @@ -62,7 +62,7 @@ jobs: context: . platforms: linux/amd64 cache-to: | - type=gha,scope=${{ github.workflow }},mode=min + type=gha,scope=${{ github.workflow }},mode=max cache-from: | type=gha,scope=${{ github.workflow }} diff --git a/Dockerfile b/Dockerfile index c53456900..48c48d15b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,26 @@ # syntax=docker/dockerfile:1 -FROM ghcr.io/astral-sh/uv:0.2.18 AS uv -FROM ghcr.io/aiidalab/full-stack:2024.1019 +ARG FULL_STACK_VER=2024.1021 +ARG UV_VER=0.2.27 +ARG QE_VER=7.2 +ARG QE_DIR=/opt/conda/envs/quantum-espresso-${QE_VER} +FROM ghcr.io/astral-sh/uv:0.2.27 AS uv + +# STAGE 1 +# Install QE into conda environment in /opt/conda +# This step is independent from the others and can be run in parallel. +FROM ghcr.io/aiidalab/full-stack:${FULL_STACK_VER} AS qe_conda_env +ARG QE_VER +ARG QE_DIR +RUN mamba create -p "${QE_DIR}" --yes qe="${QE_VER}" && \ + mamba clean --all -f -y && \ + fix-permissions "${CONDA_DIR}" + + +# STAGE 2 +FROM ghcr.io/aiidalab/full-stack:${FULL_STACK_VER} +ARG QE_VER +ARG QE_DIR # Copy whole repo and pre-install the dependencies and app to the tmp folder. # In the before notebook scripts the app will be re-installed by moving it to the app folder. ENV PREINSTALL_APP_FOLDER=${CONDA_DIR}/aiidalab-qe @@ -17,32 +36,18 @@ RUN --mount=from=uv,source=/uv,target=/bin/uv \ cd ${PREINSTALL_APP_FOLDER} && \ # Remove all untracked files and directories. For example the setup lock flag file. git clean -fx && \ - # It is important to install from `aiidalab install` to mimic the exact installation operation as - # from the app store. - # The command wil first install the dependencies from list by parsing setup config files, - # (for `aiidalab/aiidalab<23.03.2` the `setup.py` should be in the root folder of the app https://github.com/aiidalab/aiidalab/pull/382). - # and then the app and restart the daemon in the end. - # But since the aiida profile not yet exists, the daemon restart will fail but it is not a problem. - # Because we only need the dependencies to be installed. - # aiidalab install --yes --python ${CONDA_DIR}/bin/python "quantum-espresso@file://${PREINSTALL_APP_FOLDER}" && \ - # However, have to use `pip install` explicitly because `aiidalab install` call `pip install --user` which will install the app to `/home/${NB_USER}/.local`. - # It won't cause issue for docker but for k8s deployment the home folder is not bind mounted to the pod and the dependencies won't be found. (see issue in `jupyter/docker-stacks` https://github.com/jupyter/docker-stacks/issues/815) uv pip install --system --no-cache . && \ - fix-permissions "${CONDA_DIR}" && \ - fix-permissions "/home/${NB_USER}" - -ENV QE_VERSION="7.2" -RUN mamba create -p /opt/conda/envs/quantum-espresso --yes \ - qe=${QE_VERSION} \ - && mamba clean --all -f -y && \ - fix-permissions "${CONDA_DIR}" && \ - fix-permissions "/home/${NB_USER}" + fix-permissions "${CONDA_DIR}" # Download the QE pseudopotentials to the folder for afterware installation. ENV PSEUDO_FOLDER=${CONDA_DIR}/pseudo RUN mkdir -p ${PSEUDO_FOLDER} && \ python -m aiidalab_qe download-pseudos --dest ${PSEUDO_FOLDER} +COPY --from=qe_conda_env "${QE_DIR}" "${QE_DIR}" +# TODO: Remove this once we get rid of 70_prepare-qe-executable.sh +ENV QE_VERSION="$QE_VER" + COPY before-notebook.d/* /usr/local/bin/before-notebook.d/ WORKDIR "/home/${NB_USER}" diff --git a/before-notebook.d/70_prepare-qe-executable.sh b/before-notebook.d/70_prepare-qe-executable.sh index 41ba2d391..51d828310 100644 --- a/before-notebook.d/70_prepare-qe-executable.sh +++ b/before-notebook.d/70_prepare-qe-executable.sh @@ -6,7 +6,7 @@ set -x # Copy quantum espresso env to user space. mkdir -p /home/${NB_USER}/.conda/envs if [ ! -d /home/${NB_USER}/.conda/envs/quantum-espresso-${QE_VERSION} ]; then - ln -s /opt/conda/envs/quantum-espresso /home/${NB_USER}/.conda/envs/quantum-espresso-${QE_VERSION} + ln -s /opt/conda/envs/quantum-espresso-${QE_VERSION} /home/${NB_USER}/.conda/envs/quantum-espresso-${QE_VERSION} # Install qe so the progress bar not shown in the notebook when first time using app. echo "Installing qe." From 4d92c545ed3326e9c188a93b7e1b2495c2b9fdc6 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Tue, 23 Jul 2024 15:49:19 +0100 Subject: [PATCH 116/166] Support QE conda env in /opt/conda (#784) --- before-notebook.d/70_prepare-qe-executable.sh | 11 ++---- src/aiidalab_qe/common/setup_codes.py | 35 +++++++++++-------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/before-notebook.d/70_prepare-qe-executable.sh b/before-notebook.d/70_prepare-qe-executable.sh index 51d828310..1bba44cae 100644 --- a/before-notebook.d/70_prepare-qe-executable.sh +++ b/before-notebook.d/70_prepare-qe-executable.sh @@ -3,14 +3,9 @@ # Debugging. set -x -# Copy quantum espresso env to user space. -mkdir -p /home/${NB_USER}/.conda/envs -if [ ! -d /home/${NB_USER}/.conda/envs/quantum-espresso-${QE_VERSION} ]; then - ln -s /opt/conda/envs/quantum-espresso-${QE_VERSION} /home/${NB_USER}/.conda/envs/quantum-espresso-${QE_VERSION} - - # Install qe so the progress bar not shown in the notebook when first time using app. - echo "Installing qe." +if [[ $(verdi code list -Y localhost -r | wc -l) -eq 0 ]]; then + echo "Installing QE codes..." python -m aiidalab_qe install-qe else - echo "Quantum ESPRESSO app is already installed." + echo "Quantum ESPRESSO codes are already installed." fi diff --git a/src/aiidalab_qe/common/setup_codes.py b/src/aiidalab_qe/common/setup_codes.py index 453e279fa..11ee58d1a 100644 --- a/src/aiidalab_qe/common/setup_codes.py +++ b/src/aiidalab_qe/common/setup_codes.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from pathlib import Path from shutil import which from subprocess import CalledProcessError, run @@ -21,9 +20,15 @@ QE_VERSION = "7.2" -CONDA_ENV_PREFIX = Path.home().joinpath( - ".conda", "envs", f"quantum-espresso-{QE_VERSION}" -) + +def get_qe_env(): + # QE is already pre-installed in the QE image + path = Path(f"/opt/conda/envs/quantum-espresso-{QE_VERSION}") + if path.exists(): + return path + else: + return Path.home().joinpath(".conda", "envs", f"quantum-espresso-{QE_VERSION}") + # Add all QE codes with the calcjob entry point in the aiida-quantumespresso. CODE_NAMES = ( @@ -46,7 +51,7 @@ def qe_installed(): - return CONDA_ENV_PREFIX.exists() + return get_qe_env().exists() def install_qe(): @@ -59,7 +64,7 @@ def install_qe(): "--channel", "conda-forge", "--prefix", - str(CONDA_ENV_PREFIX), + str(get_qe_env()), f"qe={QE_VERSION}", ], capture_output=True, @@ -102,9 +107,9 @@ def _generate_string_to_setup_code(code_name, computer_name="localhost"): except NotExistent: label = f"{code_name}-{QE_VERSION}" description = f"{code_name}.x ({QE_VERSION}) setup by AiiDAlab." - filepath_executable = str(CONDA_ENV_PREFIX.joinpath("bin", f"{code_name}.x")) + filepath_executable = get_qe_env().joinpath("bin", f"{code_name}.x") default_calc_job_plugin = f"quantumespresso.{code_name}" - prepend_text = f'eval "$(conda shell.posix hook)"\\nconda activate {CONDA_ENV_PREFIX}\\nexport OMP_NUM_THREADS=1' + prepend_text = f'eval "$(conda shell.posix hook)"\\nconda activate {get_qe_env()}\\nexport OMP_NUM_THREADS=1' python_code = """ computer = load_computer('{}') code = InstalledCode(computer=computer, @@ -116,7 +121,7 @@ def _generate_string_to_setup_code(code_name, computer_name="localhost"): ) code.store() -""".format( +""".format( # noqa: UP032 computer_name, label, description, @@ -134,7 +139,7 @@ def setup_codes(): try: run(["python", "-c", python_code], capture_output=True, check=True) except CalledProcessError as error: - raise RuntimeError(f"Failed to setup codes: {error}") + raise RuntimeError(f"Failed to setup codes: {error}") from None def install(force=False): @@ -175,7 +180,9 @@ def install(force=False): try: install_qe() except CalledProcessError as error: - raise RuntimeError(f"Failed to create conda environment: {error}") + raise RuntimeError( + f"Failed to create conda environment: {error}" + ) from None # After installing QE, we install the corresponding # AiiDA codes: @@ -189,7 +196,7 @@ def install(force=False): yield "Setting up all codes..." run(["python", "-c", python_code], capture_output=True, check=True) except CalledProcessError as error: - raise RuntimeError(f"Failed to setup codes: {error}") + raise RuntimeError(f"Failed to setup codes: {error}") from None except Timeout: # Assume that the installation was triggered by a different process. @@ -198,7 +205,7 @@ def install(force=False): if not codes_are_setup(): raise RuntimeError( "Installation process did not finish in the expected time." - ) + ) from None class QESetupWidget(ipw.VBox): @@ -311,7 +318,7 @@ def _toggle_error_view(self, change): @traitlets.observe("busy") @traitlets.observe("error") @traitlets.observe("installed") - def _update(self, change): + def _update(self, _change): with self.hold_trait_notifications(): if self.hide_by_default: self.layout.visibility = ( From 82b329b32dd007e361732aa0591a02dfffc4eb95 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Thu, 25 Jul 2024 18:07:46 +0100 Subject: [PATCH 117/166] Archive home directory using multi-stage build (#781) The strategy of archiving home directory and extracting it at startup allows for a bunch of simplification of the Dockerfile since everything can be directly prepared in home folder, without intermediary steps, and this allows to get rid of the current startup scripts (70_, 71_). All startup scripts from full-stack are preserved and reused, the only new startup script is the 00_untar_home.sh. I've done some quick benchmarking, at starting the container takes around 10s. --- .../workflows/docker-build-test-upload.yml | 2 +- Dockerfile | 104 +++++++++++++----- before-notebook.d/00_untar_home.sh | 26 +++++ before-notebook.d/70_prepare-qe-executable.sh | 11 -- before-notebook.d/71_install-qeapp.sh | 21 ---- tests_integration/conftest.py | 2 +- 6 files changed, 105 insertions(+), 61 deletions(-) create mode 100644 before-notebook.d/00_untar_home.sh delete mode 100644 before-notebook.d/70_prepare-qe-executable.sh delete mode 100644 before-notebook.d/71_install-qeapp.sh diff --git a/.github/workflows/docker-build-test-upload.yml b/.github/workflows/docker-build-test-upload.yml index 521f640ad..f8f0e3b55 100644 --- a/.github/workflows/docker-build-test-upload.yml +++ b/.github/workflows/docker-build-test-upload.yml @@ -62,7 +62,7 @@ jobs: context: . platforms: linux/amd64 cache-to: | - type=gha,scope=${{ github.workflow }},mode=max + type=gha,scope=${{ github.workflow }},mode=min cache-from: | type=gha,scope=${{ github.workflow }} diff --git a/Dockerfile b/Dockerfile index 48c48d15b..2785c947e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,50 +4,100 @@ ARG UV_VER=0.2.27 ARG QE_VER=7.2 ARG QE_DIR=/opt/conda/envs/quantum-espresso-${QE_VER} -FROM ghcr.io/astral-sh/uv:0.2.27 AS uv +ARG UV_CACHE_DIR=/tmp/uv_cache +ARG QE_APP_SRC=/tmp/quantum-espresso + +FROM ghcr.io/astral-sh/uv:${UV_VER} AS uv # STAGE 1 # Install QE into conda environment in /opt/conda -# This step is independent from the others and can be run in parallel. +# This step is largely independent from the others and can run in parallel. +# However, it needs to be done before running `python -m aiidalab_qe install-qe`, +# otherwise QE gets installed into ~/.conda folder. FROM ghcr.io/aiidalab/full-stack:${FULL_STACK_VER} AS qe_conda_env ARG QE_VER ARG QE_DIR -RUN mamba create -p "${QE_DIR}" --yes qe="${QE_VER}" && \ - mamba clean --all -f -y && \ - fix-permissions "${CONDA_DIR}" +USER ${NB_USER} +RUN mamba create -p ${QE_DIR} --yes qe=${QE_VER} && \ + mamba clean --all -f -y # STAGE 2 -FROM ghcr.io/aiidalab/full-stack:${FULL_STACK_VER} -ARG QE_VER +# Install python dependencies needed to run aiidalab_qe CLI commands +# uv package cache from this stage is reused in the final stage as well. +FROM ghcr.io/aiidalab/full-stack:${FULL_STACK_VER} AS build_deps ARG QE_DIR -# Copy whole repo and pre-install the dependencies and app to the tmp folder. -# In the before notebook scripts the app will be re-installed by moving it to the app folder. -ENV PREINSTALL_APP_FOLDER=${CONDA_DIR}/aiidalab-qe -COPY --chown=${NB_UID}:${NB_GID} . ${PREINSTALL_APP_FOLDER} +ARG UV_CACHE_DIR +ARG QE_APP_SRC -USER ${NB_USER} +WORKDIR ${QE_APP_SRC} +COPY --chown=${NB_UID}:${NB_GID} src/ ${QE_APP_SRC}/src +COPY --chown=${NB_UID}:${NB_GID} setup.cfg pyproject.toml LICENSE README.md ${QE_APP_SRC} -# Using uv to speed up installation, per docs: +# Use uv instead of pip to speed up installation, per docs: # https://github.com/astral-sh/uv/blob/main/docs/guides/docker.md#using-uv-temporarily -# Use the same constraint file as PIP +# Use the same constraint file as pip ENV UV_CONSTRAINT=${PIP_CONSTRAINT} -RUN --mount=from=uv,source=/uv,target=/bin/uv \ - cd ${PREINSTALL_APP_FOLDER} && \ - # Remove all untracked files and directories. For example the setup lock flag file. - git clean -fx && \ - uv pip install --system --no-cache . && \ - fix-permissions "${CONDA_DIR}" - -# Download the QE pseudopotentials to the folder for afterware installation. -ENV PSEUDO_FOLDER=${CONDA_DIR}/pseudo +RUN --mount=from=uv,source=/uv,target=/bin/uv \ + uv pip install --strict --system --cache-dir=${UV_CACHE_DIR} . + +# STAGE 3 +# - Prepare AiiDA profile and localhost computer +# - Install QE codes and pseudopotentials +# - Archive home folder +FROM build_deps AS home_build +ARG QE_DIR +ENV PSEUDO_FOLDER=/tmp/pseudo RUN mkdir -p ${PSEUDO_FOLDER} && \ python -m aiidalab_qe download-pseudos --dest ${PSEUDO_FOLDER} -COPY --from=qe_conda_env "${QE_DIR}" "${QE_DIR}" -# TODO: Remove this once we get rid of 70_prepare-qe-executable.sh -ENV QE_VERSION="$QE_VER" +# TODO: Remove PGSQL and daemon log files, and other unneeded files +RUN --mount=from=qe_conda_env,source=${QE_DIR},target=${QE_DIR} \ + bash /usr/local/bin/before-notebook.d/20_start-postgresql.sh && \ + bash /usr/local/bin/before-notebook.d/40_prepare-aiida.sh && \ + python -m aiidalab_qe install-qe && \ + python -m aiidalab_qe install-pseudos --source ${PSEUDO_FOLDER} && \ + verdi daemon stop && \ + mamba run -n aiida-core-services pg_ctl stop && \ + cd /home/${NB_USER} && tar -cf /opt/conda/home.tar . -COPY before-notebook.d/* /usr/local/bin/before-notebook.d/ +# STAGE 3 - Final stage +# - Install python dependencies +# - Copy QE env environment +# - Remove all content of home folder +# - Copy the whole repo content into the container +# - Copy home folder archive +FROM ghcr.io/aiidalab/full-stack:${FULL_STACK_VER} +ARG QE_DIR +ARG QE_APP_SRC +ARG UV_CACHE_DIR +USER ${NB_USER} + +WORKDIR /tmp +# Install python dependencies +# Use uv cache from the previous build step +ENV UV_CONSTRAINT=${PIP_CONSTRAINT} +RUN --mount=from=uv,source=/uv,target=/bin/uv \ + --mount=from=build_deps,source=${UV_CACHE_DIR},target=${UV_CACHE_DIR},rw \ + --mount=from=build_deps,source=${QE_APP_SRC},target=${QE_APP_SRC},rw \ + uv pip install --strict --system --compile-bytecode --cache-dir=${UV_CACHE_DIR} ${QE_APP_SRC} + +COPY --from=qe_conda_env ${QE_DIR} ${QE_DIR} +USER root +COPY ./before-notebook.d/* /usr/local/bin/before-notebook.d/ +RUN fix-permissions "${CONDA_DIR}" +# Remove content of $HOME +# '-mindepth=1' ensures that we do not remove the home directory itself. +RUN find /home/${NB_USER}/ -mindepth 1 -delete + +ENV QE_APP_FOLDER=/opt/conda/quantum-espresso +COPY --chown=${NB_UID}:${NB_GID} . ${QE_APP_FOLDER} +# Remove all untracked files and directories. +RUN git clean -dffx || true + +ENV HOME_TAR="/opt/home.tar" +COPY --from=home_build /opt/conda/home.tar "$HOME_TAR" + +USER ${NB_USER} WORKDIR "/home/${NB_USER}" diff --git a/before-notebook.d/00_untar_home.sh b/before-notebook.d/00_untar_home.sh new file mode 100644 index 000000000..d911474e8 --- /dev/null +++ b/before-notebook.d/00_untar_home.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -eux + +home="/home/${NB_USER}" + +# Untar home archive file to restore home directory if it is empty +if [[ $(ls -A ${home} | wc -l) = "0" ]]; then + if [[ ! -f $HOME_TAR ]]; then + echo "File $HOME_TAR does not exist!" + exit 1 + fi + if [[ ! -d ${QE_APP_FOLDER} ]]; then + echo "Folder $QE_APP_FOLDER does not exist!" + exit 1 + fi + + echo "Extracting $HOME_TAR to $home" + tar -xf $HOME_TAR -C "$home" + + echo "Copying directory '$QE_APP_FOLDER' to '$AIIDALAB_APPS'" + cp -r "$QE_APP_FOLDER" "$AIIDALAB_APPS" +else + echo "$home folder is not empty!" + ls -lrta "$home" +fi +set +eux diff --git a/before-notebook.d/70_prepare-qe-executable.sh b/before-notebook.d/70_prepare-qe-executable.sh deleted file mode 100644 index 1bba44cae..000000000 --- a/before-notebook.d/70_prepare-qe-executable.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -e - -# Debugging. -set -x - -if [[ $(verdi code list -Y localhost -r | wc -l) -eq 0 ]]; then - echo "Installing QE codes..." - python -m aiidalab_qe install-qe -else - echo "Quantum ESPRESSO codes are already installed." -fi diff --git a/before-notebook.d/71_install-qeapp.sh b/before-notebook.d/71_install-qeapp.sh deleted file mode 100644 index 849d92849..000000000 --- a/before-notebook.d/71_install-qeapp.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -e - -# Debugging. -set -x - -# Install qeapp if it is not already installed. -if aiidalab list | grep -q quantum-espresso; then - echo "Quantum ESPRESSO app is already installed." -else - echo "Installing Quantum ESPRESSO app." - # Install by move the repo folder that is already in the image. - mv ${PREINSTALL_APP_FOLDER} /home/${NB_USER}/apps/quantum-espresso -fi - -# Install the pseudo libraries if not already installed. -if aiida-pseudo list | grep -q "no pseudo potential families"; then - echo "Installing pseudo potential families." - python -m aiidalab_qe install-pseudos --source ${PSEUDO_FOLDER} -else - echo "Pseudo potential families are already installed." -fi diff --git a/tests_integration/conftest.py b/tests_integration/conftest.py index 39eb0f7f7..a011bfee7 100644 --- a/tests_integration/conftest.py +++ b/tests_integration/conftest.py @@ -59,7 +59,7 @@ def notebook_service(docker_compose, docker_ip, docker_services): token = os.environ.get("JUPYTER_TOKEN", "testtoken") try: docker_services.wait_until_responsive( - timeout=180.0, + timeout=60.0, pause=1.0, check=lambda: is_responsive(url), ) From 02ee3ab3e0c71007d19046f369a693d864e41c54 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Mon, 29 Jul 2024 14:07:42 +0100 Subject: [PATCH 118/166] Fix integration tests on PRs from forks (#780) --- .github/workflows/docker-build-test-upload.yml | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker-build-test-upload.yml b/.github/workflows/docker-build-test-upload.yml index f8f0e3b55..d9d691b1b 100644 --- a/.github/workflows/docker-build-test-upload.yml +++ b/.github/workflows/docker-build-test-upload.yml @@ -80,7 +80,18 @@ jobs: - name: Run pytest for Chrome run: pytest -sv --driver Chrome tests_integration/ env: - QE_IMAGE: ${{ env.IMAGE }}@${{ steps.build-upload.outputs.digest }} + # We'd like to identify the image by its unique digest, i.e ghcr.io/aiidalab/qe@sha256: + # but that sadly does not work when the image is loaded to Docker locally and not published on ghcr.io + # as is the case for PRs from forks. Hence this super-ugly ternary expression... + # For forks, we take the image as ghcr.io/aiidalab/qe:pr-XXX + # which is stored in the steps.meta.outputs.tags variable + QE_IMAGE: >- + ${{ + github.event_name == 'pull_request' && + github.event.pull_request.head.repo.fork && + steps.meta.outputs.tags || + format('{0}@{1}', env.IMAGE, steps.build-upload.outputs.imageid) + }} - name: Upload screenshots as artifacts if: always() From 94b92f3cf66a572881680711f5380b582e7fec75 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Wed, 31 Jul 2024 12:49:56 +0100 Subject: [PATCH 119/166] Adopt more ruff rules to align with AWB codebase (#785) * remove nbqa, run ruff on notebooks directly * Format notebooks --- .pre-commit-config.yaml | 18 +- delete.ipynb | 48 +++-- docs/source/conf.py | 9 +- plugin_list.ipynb | 196 +++++++++++++----- pyproject.toml | 33 +++ qe.ipynb | 18 +- src/aiidalab_qe/__main__.py | 15 +- src/aiidalab_qe/app/configuration/__init__.py | 7 +- src/aiidalab_qe/app/configuration/advanced.py | 10 +- src/aiidalab_qe/app/configuration/pseudos.py | 10 +- src/aiidalab_qe/app/configuration/workflow.py | 3 +- src/aiidalab_qe/app/main.py | 5 +- src/aiidalab_qe/app/result/__init__.py | 1 + src/aiidalab_qe/app/result/summary_viewer.py | 1 + .../app/result/workchain_viewer.py | 20 +- src/aiidalab_qe/app/structure/__init__.py | 10 +- src/aiidalab_qe/app/submission/__init__.py | 14 +- src/aiidalab_qe/app/utils/search_jobs.py | 3 +- src/aiidalab_qe/common/bandpdoswidget.py | 63 +++--- src/aiidalab_qe/common/node_view.py | 13 +- src/aiidalab_qe/common/panel.py | 1 - src/aiidalab_qe/common/process.py | 5 +- src/aiidalab_qe/common/setup_codes.py | 9 +- src/aiidalab_qe/common/setup_pseudos.py | 9 +- src/aiidalab_qe/common/widgets.py | 55 ++--- src/aiidalab_qe/plugins/bands/setting.py | 1 - src/aiidalab_qe/plugins/bands/workchain.py | 3 +- src/aiidalab_qe/plugins/pdos/setting.py | 3 +- src/aiidalab_qe/plugins/pdos/workchain.py | 12 +- src/aiidalab_qe/plugins/xas/__init__.py | 2 +- src/aiidalab_qe/plugins/xas/result.py | 64 +++--- src/aiidalab_qe/plugins/xas/setting.py | 17 +- src/aiidalab_qe/plugins/xas/workchain.py | 4 +- src/aiidalab_qe/plugins/xps/result.py | 6 +- src/aiidalab_qe/plugins/xps/setting.py | 3 +- src/aiidalab_qe/plugins/xps/workchain.py | 8 +- src/aiidalab_qe/version.py | 1 - src/aiidalab_qe/workflows/__init__.py | 3 +- start.py | 2 +- tests/configuration/test_advanced.py | 4 +- tests/conftest.py | 56 ++--- tests/test_cli.py | 4 +- tests/test_plugins_bands.py | 2 +- tests/test_plugins_electronic_structure.py | 10 +- tests/test_plugins_pdos.py | 2 +- tests/test_plugins_xps.py | 1 + tests/test_pseudo.py | 12 +- tests/test_result.py | 3 +- tests_integration/test_app.py | 2 +- 49 files changed, 463 insertions(+), 338 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 123447ae1..658562e09 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,28 +24,16 @@ repos: hooks: - id: check-github-workflows - - repo: https://github.com/nbQA-dev/nbQA - rev: 1.8.5 - hooks: - - id: nbqa-pyupgrade - args: [--py38-plus] - - id: nbqa-isort - args: [--profile=black] - - id: nbqa-ruff - # suppress E402 - args: [--ignore=E402] - - repo: https://github.com/kynan/nbstripout rev: 0.7.1 hooks: - id: nbstripout - repo: https://github.com/astral-sh/ruff-pre-commit - # Ruff version. - rev: v0.5.0 + rev: v0.5.5 hooks: - # Run the linter. - id: ruff + types_or: [python, pyi, jupyter] args: [--fix] - # Run the formatter. - id: ruff-format + types_or: [python, pyi, jupyter] diff --git a/delete.ipynb b/delete.ipynb index 374c73a0f..670a6561f 100644 --- a/delete.ipynb +++ b/delete.ipynb @@ -18,18 +18,19 @@ "import urllib.parse as urlparse\n", "\n", "import ipywidgets as widgets\n", + "from IPython.display import Markdown, display\n", + "\n", "from aiida import load_profile\n", "from aiida.orm import load_node\n", "from aiida.tools import delete_nodes\n", - "from IPython.display import Markdown, display\n", "\n", "# Load AiiDA profile\n", "load_profile()\n", "\n", "# Parse the primary key from the Jupyter notebook URL\n", - "url = urlparse.urlsplit(jupyter_notebook_url) # noqa F821\n", + "url = urlparse.urlsplit(jupyter_notebook_url) # noqa F821\n", "query = urlparse.parse_qs(url.query)\n", - "pk = int(query['pk'][0])\n", + "pk = int(query[\"pk\"][0])\n", "\n", "\n", "def display_node_details(pk):\n", @@ -41,7 +42,7 @@ " print(f\"Description: {node.description}\")\n", " print(f\"Creation Time: {node.ctime}\")\n", " except Exception as e:\n", - " print(f\"Error loading node: {str(e)}\")\n", + " print(f\"Error loading node: {e!s}\")\n", " return False\n", " return True\n", "\n", @@ -50,31 +51,36 @@ " if dry_run:\n", " _, was_deleted = delete_nodes([pk], dry_run=True)\n", " if was_deleted:\n", - " print(f'Dry run: Node {pk} can be deleted.')\n", + " print(f\"Dry run: Node {pk} can be deleted.\")\n", " return\n", - " \n", + "\n", " _, was_deleted = delete_nodes([pk], dry_run=False)\n", " if was_deleted:\n", - " print(f'Node {pk} deleted successfully.')\n", + " print(f\"Node {pk} deleted successfully.\")\n", "\n", "\n", - "def confirm_deletion(b):\n", - " if delete_confirmation.value.lower() in ['y', 'yes']:\n", + "def confirm_deletion(_):\n", + " if delete_confirmation.value.lower() in (\"y\", \"yes\"):\n", " delete_node(pk, dry_run=False)\n", " else:\n", - " print('Deletion aborted.')\n", + " print(\"Deletion aborted.\")\n", "\n", "\n", - "def find_linked_qeapp_jobs(root_node_pk, process_label='QeAppWorkChain'):\n", + "def find_linked_qeapp_jobs(root_node_pk, process_label=\"QeAppWorkChain\"):\n", " \"\"\"Query all linked node with process_label = QeAppWorkChain.\"\"\"\n", " from aiida.orm import Node, QueryBuilder\n", " from aiida.orm.nodes.process.workflow.workchain import WorkChainNode\n", + "\n", " qb = QueryBuilder()\n", - " qb.append(WorkChainNode, filters={'id': root_node_pk}, tag='root')\n", - " qb.append(Node, with_incoming='root', tag='calcjob')\n", + " qb.append(WorkChainNode, filters={\"id\": root_node_pk}, tag=\"root\")\n", + " qb.append(Node, with_incoming=\"root\", tag=\"calcjob\")\n", " # There are seems a bug with `with_ancestors` in the QueryBuilder, so we have to use `with_incoming` instead.\n", - " # For the moment, it's safe to use `with_incoming` since we check it very time we delete a QEApp \n", - " qb.append(WorkChainNode, filters={'attributes.process_label': 'QeAppWorkChain'}, with_incoming='calcjob')\n", + " # For the moment, it's safe to use `with_incoming` since we check it very time we delete a QEApp\n", + " qb.append(\n", + " WorkChainNode,\n", + " filters={\"attributes.process_label\": process_label},\n", + " with_incoming=\"calcjob\",\n", + " )\n", " results = qb.all()\n", " if len(results) == 0:\n", " return None\n", @@ -96,12 +102,16 @@ " else:\n", " # Ask for confirmation\n", " nodes, _ = delete_nodes([pk], dry_run=True)\n", - " display(Markdown(f'**YOU ARE ABOUT TO DELETE `{len(nodes)}` NODES! THIS CANNOT BE UNDONE!**'))\n", + " display(\n", + " Markdown(\n", + " f\"**YOU ARE ABOUT TO DELETE `{len(nodes)}` NODES! THIS CANNOT BE UNDONE!**\"\n", + " )\n", + " )\n", " delete_confirmation = widgets.Text(\n", - " value='',\n", + " value=\"\",\n", " placeholder='Type \"yes\" to confirm',\n", - " description='Confirm:',\n", - " disabled=False\n", + " description=\"Confirm:\",\n", + " disabled=False,\n", " )\n", " confirm_button = widgets.Button(description=\"Delete Node\")\n", " confirm_button.on_click(confirm_deletion)\n", diff --git a/docs/source/conf.py b/docs/source/conf.py index fc0719077..8f39260d7 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -9,13 +9,8 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys import time -# sys.path.insert(0, os.path.abspath('.')) - # -- Project information ----------------------------------------------------- version = "v24.10.0a1" @@ -30,9 +25,7 @@ if current_year == copyright_first_year else f"{copyright_first_year}-{current_year}" ) -copyright = "{}, {}. All rights reserved".format( - copyright_year_string, copyright_owners -) +copyright = f"{copyright_year_string}, {copyright_owners}. All rights reserved" # noqa: A001 # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. diff --git a/plugin_list.ipynb b/plugin_list.ipynb index 72741f3c5..30c17bc48 100644 --- a/plugin_list.ipynb +++ b/plugin_list.ipynb @@ -29,12 +29,12 @@ "# Get the current working directory\n", "cwd = Path.cwd()\n", "# Define a relative path\n", - "relative_path = 'plugins.yaml'\n", + "relative_path = \"plugins.yaml\"\n", "# Resolve the relative path to an absolute path\n", "yaml_file = cwd / relative_path\n", "\n", "# Load the YAML content\n", - "with yaml_file.open('r') as file:\n", + "with yaml_file.open(\"r\") as file:\n", " data = yaml.safe_load(file)" ] }, @@ -54,28 +54,34 @@ "\n", "def is_package_installed(package_name):\n", " import importlib\n", - " package_name = package_name.replace('-', '_')\n", + "\n", + " package_name = package_name.replace(\"-\", \"_\")\n", " try:\n", " importlib.import_module(package_name)\n", - " return True\n", " except ImportError:\n", " return False\n", + " else:\n", + " return True\n", "\n", "\n", "def stream_output(process, output_widget):\n", " \"\"\"Reads output from the process and forwards it to the output widget.\"\"\"\n", " while True:\n", " output = process.stdout.readline()\n", - " if process.poll() is not None and output == '':\n", + " if process.poll() is not None and output == \"\":\n", " break\n", " if output:\n", " output_widget.value += f\"\"\"
{output}
\"\"\"\n", "\n", "\n", - "def execute_command_with_output(command, output_widget, install_btn, remove_btn, action=\"install\"):\n", + "def execute_command_with_output(\n", + " command, output_widget, install_btn, remove_btn, action=\"install\"\n", + "):\n", " \"\"\"Execute a command and stream its output to the given output widget.\"\"\"\n", " output_widget.value = \"\" # Clear the widget\n", - " process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1)\n", + " process = subprocess.Popen(\n", + " command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True, bufsize=1\n", + " )\n", " # Create a thread to read the output stream and write it to the output widget\n", " thread = Thread(target=stream_output, args=(process, output_widget))\n", " thread.start()\n", @@ -94,63 +100,120 @@ " return False\n", "\n", "\n", - "def install_package(package_name, pip, github, post_install, output_container, message_container, install_btn, remove_btn, accordion, index):\n", + "def install_package(\n", + " package_name,\n", + " pip,\n", + " github,\n", + " post_install,\n", + " output_container,\n", + " message_container,\n", + " install_btn,\n", + " remove_btn,\n", + " accordion,\n", + " index,\n", + "):\n", " if pip:\n", " command = [\"pip\", \"install\", pip, \"--user\"]\n", " else:\n", " command = [\"pip\", \"install\", \"git+\" + github, \"--user\"]\n", - " message_container.value = f\"\"\"
Installing {package_name}...
\"\"\"\n", - " result = execute_command_with_output(command, output_container, install_btn, remove_btn)\n", + " message_container.value = (\n", + " f\"\"\"
Installing {package_name}...
\"\"\"\n", + " )\n", + " result = execute_command_with_output(\n", + " command, output_container, install_btn, remove_btn\n", + " )\n", " # Execute post install if defined in the plugin.yaml:\n", - " if post_install: \n", - " message_container.value += \"\"\"
Post installation step...
\"\"\"\n", - " command = [sys.executable, '-m', package_name.replace('-','_'), post_install]\n", + " if post_install:\n", + " message_container.value += (\n", + " \"\"\"
Post installation step...
\"\"\"\n", + " )\n", + " command = [sys.executable, \"-m\", package_name.replace(\"-\", \"_\"), post_install]\n", " # Execute the command\n", - " result = subprocess.run(command, capture_output=True, text=True)\n", + " result = subprocess.run(command, capture_output=True, text=True, check=False)\n", " # if the package was installed successfully\n", " if result:\n", " message_container.value += \"\"\"
Initiating test to load the plugin...
\"\"\"\n", " # Test plugin functionality\n", - " command = [sys.executable, '-m', 'aiidalab_qe', 'test-plugin', package_name]\n", + " command = [sys.executable, \"-m\", \"aiidalab_qe\", \"test-plugin\", package_name]\n", " # Execute the command\n", - " result = subprocess.run(command, capture_output=True, text=True)\n", + " result = subprocess.run(command, capture_output=True, text=True, check=False)\n", " if result.returncode == 0:\n", " # restart daemon\n", - " message_container.value = \"\"\"
Loading plugin test passed.
\"\"\"\n", - " message_container.value += \"\"\"
Plugin installed successfully.
\"\"\"\n", + " message_container.value = (\n", + " \"\"\"
Loading plugin test passed.
\"\"\"\n", + " )\n", + " message_container.value += (\n", + " \"\"\"
Plugin installed successfully.
\"\"\"\n", + " )\n", " accordion.set_title(index, f\"{accordion.get_title(index)[:-2]} ✅\")\n", " command = [\"verdi\", \"daemon\", \"restart\"]\n", - " subprocess.run(command, capture_output=True, shell=False)\n", + " subprocess.run(command, capture_output=True, shell=False, check=False)\n", " else:\n", " # uninstall the package\n", " message_container.value = f\"\"\"
The plugin '{package_name}' was installed successfully but plugin functionality test failed: {result.stderr}.
\"\"\"\n", " message_container.value += \"\"\"
This may be due to compatibility issues with the current AiiDAlab QEApp version. Please contact the plugin author for further assistance.
\"\"\"\n", " message_container.value += \"\"\"
To prevent potential issues, the plugin will now be uninstalled.
\"\"\"\n", - " remove_package(package_name, output_container, message_container, install_btn, remove_btn, accordion, index)\n", + " remove_package(\n", + " package_name,\n", + " output_container,\n", + " message_container,\n", + " install_btn,\n", + " remove_btn,\n", + " accordion,\n", + " index,\n", + " )\n", "\n", "\n", - "def remove_package(package_name, output_container, message_container, install_btn, remove_btn, accordion, index):\n", - " message_container.value += f\"\"\"
Removing {package_name}...
\"\"\"\n", - " package_name = package_name.replace('-', '_')\n", + "def remove_package(\n", + " package_name,\n", + " output_container,\n", + " message_container,\n", + " install_btn,\n", + " remove_btn,\n", + " accordion,\n", + " index,\n", + "):\n", + " message_container.value += (\n", + " f\"\"\"
Removing {package_name}...
\"\"\"\n", + " )\n", + " package_name = package_name.replace(\"-\", \"_\")\n", " command = [\"pip\", \"uninstall\", \"-y\", package_name]\n", - " result = execute_command_with_output(command, output_container, install_btn, remove_btn, action=\"remove\")\n", + " result = execute_command_with_output(\n", + " command, output_container, install_btn, remove_btn, action=\"remove\"\n", + " )\n", " if result:\n", " message_container.value += f\"\"\"
{package_name} removed successfully.
\"\"\"\n", " accordion.set_title(index, f\"{accordion.get_title(index)[:-2]} ☐\")\n", " command = [\"verdi\", \"daemon\", \"restart\"]\n", - " subprocess.run(command, capture_output=True, shell=False)\n", + " subprocess.run(command, capture_output=True, shell=False, check=False)\n", "\n", "\n", - "def run_remove_button(package_name, output_container, message_container, install_btn, remove_btn, accordion, index):\n", + "def run_remove_button(\n", + " package_name,\n", + " output_container,\n", + " message_container,\n", + " install_btn,\n", + " remove_btn,\n", + " accordion,\n", + " index,\n", + "):\n", " message_container.value = \"\"\n", - " remove_package(package_name, output_container, message_container, install_btn, remove_btn, accordion, index)\n", + " remove_package(\n", + " package_name,\n", + " output_container,\n", + " message_container,\n", + " install_btn,\n", + " remove_btn,\n", + " accordion,\n", + " index,\n", + " )\n", "\n", "\n", "accordion = ipw.Accordion()\n", "\n", "for i, (plugin_name, plugin_data) in enumerate(data.items()):\n", " installed = is_package_installed(plugin_name)\n", - " \n", + "\n", " # Output container with customized styling\n", " output_container = ipw.HTML(\n", " value=\"\"\"\n", @@ -158,10 +221,8 @@ " \n", " \"\"\",\n", " layout=ipw.Layout(\n", - " max_height='250px', \n", - " overflow='auto',\n", - " border='2px solid #CCCCCC'\n", - " )\n", + " max_height=\"250px\", overflow=\"auto\", border=\"2px solid #CCCCCC\"\n", + " ),\n", " )\n", " # Output container with customized styling\n", " message_container = ipw.HTML(\n", @@ -170,35 +231,64 @@ " \n", " \"\"\",\n", " layout=ipw.Layout(\n", - " max_height='250px', \n", - " overflow='auto',\n", - " border='2px solid #CCCCCC'\n", - " )\n", + " max_height=\"250px\", overflow=\"auto\", border=\"2px solid #CCCCCC\"\n", + " ),\n", " )\n", - " \n", - " details = f\"Author: {plugin_data.get('author', 'N/A')}
\" \\\n", - " f\"Description: {plugin_data.get('description', 'No description available')}
\"\n", - " if 'documentation' in plugin_data:\n", + "\n", + " details = (\n", + " f\"Author: {plugin_data.get('author', 'N/A')}
\"\n", + " f\"Description: {plugin_data.get('description', 'No description available')}
\"\n", + " )\n", + " if \"documentation\" in plugin_data:\n", " details += f\"Documentation:
Visit
\"\n", - " if 'github' in plugin_data:\n", - " details += f\"Github: Visit\"\n", + " if \"github\" in plugin_data:\n", + " details += (\n", + " f\"Github: Visit\"\n", + " )\n", "\n", - " install_btn = ipw.Button(description=\"Install\", button_style='success', disabled=installed)\n", - " remove_btn = ipw.Button(description=\"Remove\", button_style='danger', disabled=not installed)\n", + " install_btn = ipw.Button(\n", + " description=\"Install\", button_style=\"success\", disabled=installed\n", + " )\n", + " remove_btn = ipw.Button(\n", + " description=\"Remove\", button_style=\"danger\", disabled=not installed\n", + " )\n", "\n", - " install_btn.on_click(lambda btn, pn=plugin_name, pip=plugin_data.get('pip', None), github=plugin_data.get('github', ''), post = plugin_data.get('post_install', None), oc=output_container, mc=message_container, ib=install_btn, rb=remove_btn, ac=accordion, index=i: install_package(pn, pip, github, post, oc, mc, ib, rb, ac, index))\n", - " remove_btn.on_click(lambda btn, pn=plugin_name, oc=output_container, mc=message_container, ib=install_btn, rb=remove_btn, ac=accordion, index=i: run_remove_button(pn, oc, mc, ib, rb, ac, index))\n", + " install_btn.on_click(\n", + " lambda _btn,\n", + " pn=plugin_name,\n", + " pip=plugin_data.get(\"pip\", None), # noqa: B008\n", + " github=plugin_data.get(\"github\", \"\"), # noqa: B008\n", + " post=plugin_data.get(\"post_install\", None), # noqa: B008\n", + " oc=output_container,\n", + " mc=message_container,\n", + " ib=install_btn,\n", + " rb=remove_btn,\n", + " ac=accordion,\n", + " index=i: install_package(pn, pip, github, post, oc, mc, ib, rb, ac, index)\n", + " )\n", + " remove_btn.on_click(\n", + " lambda _btn,\n", + " pn=plugin_name,\n", + " oc=output_container,\n", + " mc=message_container,\n", + " ib=install_btn,\n", + " rb=remove_btn,\n", + " ac=accordion,\n", + " index=i: run_remove_button(pn, oc, mc, ib, rb, ac, index)\n", + " )\n", "\n", - " box = ipw.VBox([\n", - " ipw.HTML(details),\n", - " ipw.HBox([install_btn, remove_btn]),\n", - " message_container,\n", - " output_container,\n", - " ])\n", + " box = ipw.VBox(\n", + " [\n", + " ipw.HTML(details),\n", + " ipw.HBox([install_btn, remove_btn]),\n", + " message_container,\n", + " output_container,\n", + " ]\n", + " )\n", "\n", " title_with_icon = f\"{plugin_name} {'✅' if installed else '☐'}\"\n", " accordion.set_title(i, title_with_icon)\n", - " accordion.children = list(accordion.children) + [box]\n", + " accordion.children = [*accordion.children, box]\n", "\n", "display(accordion)" ] diff --git a/pyproject.toml b/pyproject.toml index 1eb0ca77d..dd0525383 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,3 +4,36 @@ requires = [ "wheel" ] build-backend = "setuptools.build_meta" + +[tool.ruff] +line-length = 88 +show-fixes = true +output-format = "full" +target-version = "py39" +extend-include = ["*.ipynb"] + +[tool.ruff.lint] +ignore = ["E501", "E402", "TRY003", "RUF012", "N806"] +select = [ + "A", # flake8-builtins + "ARG", # flake8-unused-arguments + "B", # flake8-bugbear + "C4", # flake8-comprehensions + "E", # pycodestyle + "F", # pyflakes + "I", # isort + "N", # pep8-naming + "PLE", # pylint error rules + "PLW", # pylint warning rules + "PLC", # pylint convention rules + "RUF", # ruff-specific rules + "TRY", # Tryceratops + "UP" # pyupgrade +] + +[tool.ruff.lint.isort] +known-first-party = ["aiida", "aiidalab_widgets_base", "aiida_quantumespresso"] + +[tool.ruff.lint.per-file-ignores] +"tests/*" = ["ARG001"] +"tests_integration/*" = ["ARG001"] diff --git a/qe.ipynb b/qe.ipynb index 269e49674..cac6b0014 100644 --- a/qe.ipynb +++ b/qe.ipynb @@ -21,7 +21,7 @@ "source": [ "from aiida import load_profile\n", "\n", - "load_profile(); # noqa: E402" + "load_profile();" ] }, { @@ -42,15 +42,15 @@ "from datetime import datetime\n", "\n", "import ipywidgets as ipw\n", - "from aiidalab_widgets_base.bug_report import (\n", - " install_create_github_issue_exception_handler,\n", - ")\n", + "from aiidalab_qe.app import App, static\n", + "from aiidalab_qe.version import __version__\n", "from importlib_resources import files\n", "from IPython.display import display\n", "from jinja2 import Environment\n", "\n", - "from aiidalab_qe.app import App, static\n", - "from aiidalab_qe.version import __version__" + "from aiidalab_widgets_base.bug_report import (\n", + " install_create_github_issue_exception_handler,\n", + ")" ] }, { @@ -69,14 +69,14 @@ " f'

Copyright (c) {current_year} AiiDAlab team  Version: {__version__}

'\n", ")\n", "\n", - "url = urlparse.urlsplit(jupyter_notebook_url) # noqa F821\n", + "url = urlparse.urlsplit(jupyter_notebook_url) # noqa F821\n", "query = urlparse.parse_qs(url.query)\n", "\n", "\n", "app_with_work_chain_selector = App(qe_auto_setup=True)\n", "# if a pk is provided in the query string, set it as the value of the work_chain_selector\n", - "if 'pk' in query:\n", - " pk = int(query['pk'][0])\n", + "if \"pk\" in query:\n", + " pk = int(query[\"pk\"][0])\n", " app_with_work_chain_selector.work_chain_selector.value = pk\n", "\n", "output = ipw.Output()\n", diff --git a/src/aiidalab_qe/__main__.py b/src/aiidalab_qe/__main__.py index 7ea58f39d..667b011c2 100644 --- a/src/aiidalab_qe/__main__.py +++ b/src/aiidalab_qe/__main__.py @@ -1,10 +1,11 @@ """For running the app from the command line used for post_install script.""" -from pathlib import Path import sys +from pathlib import Path + import click -from aiida import load_profile +from aiida import load_profile from aiidalab_qe.common.setup_codes import codes_are_setup from aiidalab_qe.common.setup_codes import install as install_qe_codes @@ -28,7 +29,7 @@ def install_qe(force, profile): assert codes_are_setup() click.secho("Codes are setup!", fg="green") except Exception as error: - raise click.ClickException(f"Failed to set up QE failed: {error}") + raise click.ClickException(f"Failed to set up QE failed: {error}") from error @cli.command() @@ -53,7 +54,9 @@ def install_pseudos(profile, source): click.echo(msg) click.secho("Pseudopotentials are installed!", fg="green") except Exception as error: - raise click.ClickException(f"Failed to set up pseudo potentials: {error}") + raise click.ClickException( + f"Failed to set up pseudo potentials: {error}" + ) from error @cli.command() @@ -75,7 +78,9 @@ def download_pseudos(dest): click.secho("Pseudopotentials are downloaded!", fg="green") except Exception as error: - raise click.ClickException(f"Failed to download pseudo potentials: {error}") + raise click.ClickException( + f"Failed to download pseudo potentials: {error}" + ) from error @cli.command() diff --git a/src/aiidalab_qe/app/configuration/__init__.py b/src/aiidalab_qe/app/configuration/__init__.py index ff28a9402..adebd3898 100644 --- a/src/aiidalab_qe/app/configuration/__init__.py +++ b/src/aiidalab_qe/app/configuration/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Widgets for the submission of bands work chains. Authors: AiiDAlab team @@ -8,10 +7,10 @@ import ipywidgets as ipw import traitlets as tl -from aiida import orm -from aiidalab_widgets_base import WizardAppWidgetStep +from aiida import orm from aiidalab_qe.app.utils import get_entry_items +from aiidalab_widgets_base import WizardAppWidgetStep from .advanced import AdvancedSettings from .workflow import WorkChainSettings @@ -111,7 +110,7 @@ def __init__(self, **kwargs): ) @tl.observe("previous_step_state") - def _observe_previous_step_state(self, change): + def _observe_previous_step_state(self, _change): self._update_state() def get_configuration_parameters(self): diff --git a/src/aiidalab_qe/app/configuration/advanced.py b/src/aiidalab_qe/app/configuration/advanced.py index bc5e51faf..65a416960 100644 --- a/src/aiidalab_qe/app/configuration/advanced.py +++ b/src/aiidalab_qe/app/configuration/advanced.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Widgets for the submission of bands work chains. Authors: AiiDAlab team @@ -7,20 +6,21 @@ import os import ipywidgets as ipw +import numpy as np import traitlets as tl +from IPython.display import clear_output, display + from aiida import orm -import numpy as np from aiida_quantumespresso.calculations.functions.create_kpoints_from_distance import ( create_kpoints_from_distance, ) +from aiida_quantumespresso.data.hubbard_structure import HubbardStructureData from aiida_quantumespresso.workflows.pw.base import PwBaseWorkChain -from IPython.display import clear_output, display - from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS from aiidalab_qe.common.panel import Panel from aiidalab_qe.common.setup_pseudos import PseudoFamily from aiidalab_qe.common.widgets import HubbardWidget -from aiida_quantumespresso.data.hubbard_structure import HubbardStructureData + from .pseudos import PseudoFamilySelector, PseudoSetter diff --git a/src/aiidalab_qe/app/configuration/pseudos.py b/src/aiidalab_qe/app/configuration/pseudos.py index 912041c20..2a46a9bce 100644 --- a/src/aiidalab_qe/app/configuration/pseudos.py +++ b/src/aiidalab_qe/app/configuration/pseudos.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from __future__ import annotations import io @@ -6,18 +5,18 @@ import ipywidgets as ipw import traitlets as tl + from aiida import orm from aiida.common import exceptions from aiida.plugins import DataFactory, GroupFactory from aiida_quantumespresso.workflows.pw.base import PwBaseWorkChain -from aiidalab_widgets_base.utils import StatusHTML - from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS from aiidalab_qe.common.setup_pseudos import ( PSEUDODOJO_VERSION, SSSP_VERSION, PseudoFamily, ) +from aiidalab_widgets_base.utils import StatusHTML UpfData = DataFactory("pseudo.upf") SsspFamily = GroupFactory("pseudo.family.sssp") @@ -128,6 +127,7 @@ def __init__(self, **kwargs): self.pseudo_family_help, ], layout=ipw.Layout(max_width="60%"), + **kwargs, ) ipw.dlink((self.show_ui, "value"), (self.library_selection, "disabled")) ipw.dlink((self.show_ui, "value"), (self.dft_functional, "disabled")) @@ -338,7 +338,7 @@ def _reset_traitlets(self): """Reset the traitlets to the initial state""" self.ecutwfc = 0 self.ecutrho = 0 - self.pseudos = dict() + self.pseudos = {} def _reset(self): """Reset the pseudo setting widgets according to the structure @@ -377,7 +377,7 @@ def _reset(self): pseudo_family = self._get_pseudos_family(self.pseudo_family) except exceptions.NotExistent as exception: self._status_message.message = ( - f"""
ERROR: {str(exception)}
""" + f"""
ERROR: {exception!s}
""" ) return diff --git a/src/aiidalab_qe/app/configuration/workflow.py b/src/aiidalab_qe/app/configuration/workflow.py index 9fc2f0159..47db49cc0 100644 --- a/src/aiidalab_qe/app/configuration/workflow.py +++ b/src/aiidalab_qe/app/configuration/workflow.py @@ -1,12 +1,11 @@ -# -*- coding: utf-8 -*- """Widgets for the submission of bands work chains. Authors: AiiDAlab team """ import ipywidgets as ipw -from aiida_quantumespresso.common.types import RelaxType +from aiida_quantumespresso.common.types import RelaxType from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS from aiidalab_qe.app.utils import get_entry_items from aiidalab_qe.common.panel import Panel diff --git a/src/aiidalab_qe/app/main.py b/src/aiidalab_qe/app/main.py index deed96509..b02d4feb3 100644 --- a/src/aiidalab_qe/app/main.py +++ b/src/aiidalab_qe/app/main.py @@ -1,18 +1,17 @@ -# -*- coding: utf-8 -*- """The main widget that shows the application in the Jupyter notebook. Authors: AiiDAlab team """ import ipywidgets as ipw -from aiida.orm import load_node -from aiidalab_widgets_base import WizardAppWidget, WizardAppWidgetStep +from aiida.orm import load_node from aiidalab_qe.app.configuration import ConfigureQeAppWorkChainStep from aiidalab_qe.app.result import ViewQeAppWorkChainStatusAndResultsStep from aiidalab_qe.app.structure import StructureSelectionStep from aiidalab_qe.app.submission import SubmitQeAppWorkChainStep from aiidalab_qe.common import QeAppWorkChainSelector +from aiidalab_widgets_base import WizardAppWidget, WizardAppWidgetStep class App(ipw.VBox): diff --git a/src/aiidalab_qe/app/result/__init__.py b/src/aiidalab_qe/app/result/__init__.py index 7a3d2640a..9451a28ac 100644 --- a/src/aiidalab_qe/app/result/__init__.py +++ b/src/aiidalab_qe/app/result/__init__.py @@ -1,5 +1,6 @@ import ipywidgets as ipw import traitlets as tl + from aiida import orm from aiida.engine import ProcessState from aiida.engine.processes import control diff --git a/src/aiidalab_qe/app/result/summary_viewer.py b/src/aiidalab_qe/app/result/summary_viewer.py index 0bc1b728a..9524ebe27 100644 --- a/src/aiidalab_qe/app/result/summary_viewer.py +++ b/src/aiidalab_qe/app/result/summary_viewer.py @@ -1,4 +1,5 @@ import ipywidgets as ipw + from aiida_quantumespresso.workflows.pw.bands import PwBandsWorkChain FUNCTIONAL_LINK_MAP = { diff --git a/src/aiidalab_qe/app/result/workchain_viewer.py b/src/aiidalab_qe/app/result/workchain_viewer.py index b90d76586..34ed75dc9 100644 --- a/src/aiidalab_qe/app/result/workchain_viewer.py +++ b/src/aiidalab_qe/app/result/workchain_viewer.py @@ -6,18 +6,18 @@ import ipywidgets as ipw import traitlets as tl -from aiida import orm -from aiida.cmdline.utils.common import get_workchain_report -from aiida.common import LinkType -from aiida.orm.utils.serialize import deserialize_unsafe -from aiidalab_widgets_base import ProcessMonitor, register_viewer_widget -from aiidalab_widgets_base.viewers import StructureDataViewer from filelock import FileLock, Timeout from IPython.display import HTML, display from jinja2 import Environment +from aiida import orm +from aiida.cmdline.utils.common import get_workchain_report +from aiida.common import LinkType +from aiida.orm.utils.serialize import deserialize_unsafe from aiidalab_qe.app import static from aiidalab_qe.app.utils import get_entry_items +from aiidalab_widgets_base import ProcessMonitor, register_viewer_widget +from aiidalab_widgets_base.viewers import StructureDataViewer from .summary_viewer import SummaryView @@ -147,7 +147,9 @@ class WorkChainOutputs(ipw.VBox): _busy = tl.Bool(read_only=True) def __init__(self, node, export_dir=None, **kwargs): - self.export_dir = Path.cwd().joinpath("exports") + if export_dir is None: + export_dir = Path.cwd().joinpath("exports") + self.export_dir = export_dir if node.process_label != "QeAppWorkChain": raise KeyError(str(node.node_type)) @@ -233,7 +235,7 @@ def _download_archive(self, _): finally: self.set_trait("_busy", False) - id = f"dl_{self.node.uuid}" + link_id = f"dl_{self.node.uuid}" display( HTML( @@ -241,7 +243,7 @@ def _download_archive(self, _): diff --git a/src/aiidalab_qe/app/structure/__init__.py b/src/aiidalab_qe/app/structure/__init__.py index 276f29c22..3a9652878 100644 --- a/src/aiidalab_qe/app/structure/__init__.py +++ b/src/aiidalab_qe/app/structure/__init__.py @@ -5,9 +5,13 @@ import pathlib -import aiida import ipywidgets as ipw import traitlets as tl + +import aiida +from aiida_quantumespresso.data.hubbard_structure import HubbardStructureData +from aiidalab_qe.app.utils import get_entry_items +from aiidalab_qe.common import AddingTagsEditor from aiidalab_widgets_base import ( BasicCellEditor, BasicStructureEditor, @@ -19,10 +23,6 @@ WizardAppWidgetStep, ) -from aiidalab_qe.app.utils import get_entry_items -from aiidalab_qe.common import AddingTagsEditor -from aiida_quantumespresso.data.hubbard_structure import HubbardStructureData - # The Examples list of (name, file) tuple curretly passed to # StructureExamplesWidget. file_path = pathlib.Path(__file__).parent diff --git a/src/aiidalab_qe/app/submission/__init__.py b/src/aiidalab_qe/app/submission/__init__.py index d5032e6a1..93c5e27af 100644 --- a/src/aiidalab_qe/app/submission/__init__.py +++ b/src/aiidalab_qe/app/submission/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Widgets for the submission of bands work chains. Authors: AiiDAlab team @@ -8,12 +7,11 @@ import ipywidgets as ipw import traitlets as tl +from IPython.display import display + from aiida import orm from aiida.common import NotExistent from aiida.engine import ProcessBuilderNamespace, submit -from aiidalab_widgets_base import WizardAppWidgetStep -from IPython.display import display - from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS from aiidalab_qe.app.utils import get_entry_items from aiidalab_qe.common.setup_codes import QESetupWidget @@ -23,6 +21,7 @@ QEAppComputationalResourcesWidget, ) from aiidalab_qe.workflows import QeAppWorkChain +from aiidalab_widgets_base import WizardAppWidgetStep class SubmitQeAppWorkChainStep(ipw.VBox, WizardAppWidgetStep): @@ -138,7 +137,8 @@ def __init__(self, qe_auto_setup=True, **kwargs): self.process_label, self.process_description, self.submit_button, - ] + ], + **kwargs, ) # set default codes self.set_selected_codes(DEFAULT_PARAMETERS["codes"]) @@ -148,7 +148,7 @@ def _observe_submission_blockers(self, _change): """Observe the submission blockers and update the message area.""" blockers = self.internal_submission_blockers + self.external_submission_blockers if any(blockers): - fmt_list = "\n".join((f"
  • {item}
  • " for item in sorted(blockers))) + fmt_list = "\n".join(f"
  • {item}
  • " for item in sorted(blockers)) self._submission_blocker_messages.value = f"""
    The submission is blocked, due to the following reason(s): @@ -379,7 +379,7 @@ def _update_process_label(self) -> dict: else: properties_info = f", properties on {', '.join(properties)}" - label = "{} {} {}".format(formula, relax_info, properties_info) + label = f"{formula} {relax_info} {properties_info}" self.process_label.value = label def _create_builder(self) -> ProcessBuilderNamespace: diff --git a/src/aiidalab_qe/app/utils/search_jobs.py b/src/aiidalab_qe/app/utils/search_jobs.py index bf3d81f84..d13271010 100644 --- a/src/aiidalab_qe/app/utils/search_jobs.py +++ b/src/aiidalab_qe/app/utils/search_jobs.py @@ -1,8 +1,9 @@ import ipywidgets as ipw import pandas as pd +from IPython.display import display + from aiida.orm import QueryBuilder from aiidalab_qe.workflows import QeAppWorkChain -from IPython.display import display class QueryInterface: diff --git a/src/aiidalab_qe/common/bandpdoswidget.py b/src/aiidalab_qe/common/bandpdoswidget.py index 0550c93a1..d8494577e 100644 --- a/src/aiidalab_qe/common/bandpdoswidget.py +++ b/src/aiidalab_qe/common/bandpdoswidget.py @@ -1,14 +1,15 @@ import base64 import json +import re import ipywidgets as ipw import numpy as np import plotly.graph_objects as go -from aiida.orm import ProjectionData -from aiidalab_widgets_base.utils import string_range_to_list, StatusHTML from IPython.display import clear_output, display from plotly.subplots import make_subplots -import re + +from aiida.orm import ProjectionData +from aiidalab_widgets_base.utils import StatusHTML, string_range_to_list class BandPdosPlotly: @@ -110,7 +111,7 @@ def _band_yaxis(self): return None bandyaxis = go.layout.YAxis( - title=dict(text="Electronic Bands (eV)", standoff=1), + title={"text": "Electronic Bands (eV)", "standoff": 1}, side="left", showgrid=True, showline=True, @@ -185,7 +186,7 @@ def _get_bandspdos_plot(self): for label in band_labels[1]: fig.add_vline( x=label, - line=dict(color=self.SETTINGS["vertical_linecolor"], width=1), + line={"color": self.SETTINGS["vertical_linecolor"], "width": 1}, ) if self.project_bands: @@ -196,9 +197,11 @@ def _get_bandspdos_plot(self): if self.plot_type == "pdos": fig.add_vline( x=0, - line=dict( - color=self.SETTINGS["vertical_linecolor"], width=1, dash="dot" - ), + line={ + "color": self.SETTINGS["vertical_linecolor"], + "width": 1, + "dash": "dot", + }, ) if self.plot_type == "combined": @@ -274,11 +277,11 @@ def _add_band_traces(self, fig): x=x_bands_comb, y=y_bands_comb - fermi_energy, mode="lines", - line=dict( - color=colors[(spin_polarized, spin)], - shape="spline", - smoothing=1.3, - ), + line={ + "color": colors[(spin_polarized, spin)], + "shape": "spline", + "smoothing": 1.3, + }, showlegend=False, ) ) @@ -319,7 +322,11 @@ def _add_pdos_traces(self, fig): y=y_data, fill=fill, name=trace["label"], - line=dict(color=trace["borderColor"], shape="spline", smoothing=1.0), + line={ + "color": trace["borderColor"], + "shape": "spline", + "smoothing": 1.0, + }, legendgroup=trace["label"], ) @@ -350,7 +357,7 @@ def _add_projection_traces(self, fig): fill="toself", legendgroup=proj_bands["label"], mode="lines", - line=dict(width=0, color=proj_bands["color"]), + line={"width": 0, "color": proj_bands["color"]}, name=proj_bands["label"], # If PDOS is present, use those legend entries showlegend=True if self.plot_type == "bands" else False, @@ -363,7 +370,7 @@ def _customize_combined_layout(self, fig): self._customize_layout(fig, self._bands_xaxis, self._bands_yaxis) self._customize_layout(fig, self._pdos_xaxis, self._pdos_yaxis, col=2) fig.update_layout( - legend=dict(xanchor="left", x=1.06), + legend={"xanchor": "left", "x": 1.06}, height=self.SETTINGS["combined_plot_height"], width=self.SETTINGS["combined_plot_width"], plot_bgcolor="white", @@ -374,7 +381,11 @@ def _customize_layout(self, fig, xaxis, yaxis, row=1, col=1): fig.update_yaxes(patch=yaxis, row=row, col=col, showticklabels=True) fig.add_hline( y=0, - line=dict(color=self.SETTINGS["horizontal_linecolor"], width=1, dash="dot"), + line={ + "color": self.SETTINGS["horizontal_linecolor"], + "width": 1, + "dash": "dot", + }, row=row, col=col, ) @@ -543,14 +554,14 @@ def _download(payload, filename): from IPython.display import Javascript javas = Javascript( - """ + f""" var link = document.createElement('a'); link.href = 'data:text/json;charset=utf-8;base64,{payload}' link.download = "{filename}" document.body.appendChild(link); link.click(); document.body.removeChild(link); - """.format(payload=payload, filename=filename) + """ ) display(javas) @@ -903,13 +914,9 @@ def _curate_orbitals(orbital): qn_j = orbital_data["total_angular_momentum"] qn_l = orbital_data["angular_momentum"] qn_m_j = orbital_data["magnetic_number"] - orbital_name = "j {j} l {l} m_j{m_j}".format(j=qn_j, l=qn_l, m_j=qn_m_j) - orbital_name_plotly = "j={j} l={l} mj={m_j}".format( - j=HTML_TAGS.get(qn_j, qn_j), - l=qn_l, - m_j=HTML_TAGS.get(qn_m_j, qn_m_j), - ) - orbital_angular_momentum = "l {l} ".format(l=qn_l) + orbital_name = f"j {qn_j} l {qn_l} m_j{qn_m_j}" + orbital_name_plotly = f"j={HTML_TAGS.get(qn_j, qn_j)} l={qn_l} mj={HTML_TAGS.get(qn_m_j, qn_m_j)}" + orbital_angular_momentum = f"l {qn_l} " return orbital_name_plotly, orbital_angular_momentum, kind_name, atom_position @@ -982,7 +989,7 @@ def _projections_curated_options( curated_proj = [] for label, (energy, proj_pdos) in _proj_pdos.items(): - label += SPIN_LABELS[spin_type] + label += SPIN_LABELS[spin_type] # noqa: PLW2901 if projections_pdos == "pdos": orbital_proj_pdos = { "label": label, @@ -1054,4 +1061,4 @@ def cmap(label: str) -> str: ascn = sum([ord(c) for c in label]) random.seed(ascn) - return "#%06x" % random.randint(0, 0xFFFFFF) + return f"#{random.randint(0, 0xFFFFFF):06x}" diff --git a/src/aiidalab_qe/common/node_view.py b/src/aiidalab_qe/common/node_view.py index 764652ef9..3b8d49661 100644 --- a/src/aiidalab_qe/common/node_view.py +++ b/src/aiidalab_qe/common/node_view.py @@ -6,9 +6,10 @@ import ipywidgets as ipw import nglview import traitlets as tl +from ase import Atoms + from aiida import orm from aiidalab_widgets_base import register_viewer_widget -from ase import Atoms from .widgets import CalcJobOutputFollower, LogOutputWidget @@ -29,10 +30,10 @@ def __init__(self, structure, *args, **kwargs): self.structure = structure super().__init__( + *args, children=[ self._viewer, ], - *args, **kwargs, ) @@ -45,7 +46,7 @@ def _default_supercell(self): return [1, 1, 1] @tl.validate("structure") - def _valid_structure(self, change): # pylint: disable=no-self-use + def _valid_structure(self, change): """Update structure.""" structure = change["value"] @@ -74,9 +75,9 @@ def _update_displayed_structure(self, change): def _update_structure_viewer(self, change): """Update the view if displayed_structure trait was modified.""" with self.hold_trait_notifications(): - for comp_id in self._viewer._ngl_component_ids: # pylint: disable=protected-access + for comp_id in self._viewer._ngl_component_ids: self._viewer.remove_component(comp_id) - self.selection = list() + self.selection = [] if change["new"] is not None: self._viewer.add_component(nglview.ASEStructure(change["new"])) self._viewer.clear() @@ -87,7 +88,7 @@ def _update_structure_viewer(self, change): class VBoxWithCaption(ipw.VBox): def __init__(self, caption, body, *args, **kwargs): - super().__init__(children=[ipw.HTML(caption), body], *args, **kwargs) + super().__init__(*args, children=[ipw.HTML(caption), body], **kwargs) @register_viewer_widget("process.calculation.calcjob.CalcJobNode.") diff --git a/src/aiidalab_qe/common/panel.py b/src/aiidalab_qe/common/panel.py index bd6fdcfdc..40a7f98a8 100644 --- a/src/aiidalab_qe/common/panel.py +++ b/src/aiidalab_qe/common/panel.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Class to . Authors: diff --git a/src/aiidalab_qe/common/process.py b/src/aiidalab_qe/common/process.py index b1c2ea34a..799de74bc 100644 --- a/src/aiidalab_qe/common/process.py +++ b/src/aiidalab_qe/common/process.py @@ -4,6 +4,7 @@ import ipywidgets as ipw import traitlets as tl + from aiida.tools.query.calculation import CalculationQueryBuilder @@ -87,9 +88,9 @@ def __init__(self, process_label, **kwargs): self.refresh_work_chains() # the following is needed to disable the button. - def parse_extra_info(self, pk: int) -> dict: + def parse_extra_info(self, _pk: int) -> dict: """Parse extra information about the work chain.""" - return dict() + return {} def find_work_chains(self): builder = CalculationQueryBuilder() diff --git a/src/aiidalab_qe/common/setup_codes.py b/src/aiidalab_qe/common/setup_codes.py index 11ee58d1a..0da53b237 100644 --- a/src/aiidalab_qe/common/setup_codes.py +++ b/src/aiidalab_qe/common/setup_codes.py @@ -5,10 +5,10 @@ import ipywidgets as ipw import traitlets -from aiida.common.exceptions import NotExistent -from aiida.orm import load_code from filelock import FileLock, Timeout +from aiida.common.exceptions import NotExistent +from aiida.orm import load_code from aiidalab_qe.common.widgets import ProgressBar __all__ = [ @@ -99,11 +99,11 @@ def _generate_header_to_setup_code(): def _generate_string_to_setup_code(code_name, computer_name="localhost"): """Generate the Python string to setup an AiiDA code for a given computer. + Tries to load an existing code and if not existent, generates Python code to create and store a new code setup.""" try: load_code(f"{code_name}-{QE_VERSION}@{computer_name}") - return "" except NotExistent: label = f"{code_name}-{QE_VERSION}" description = f"{code_name}.x ({QE_VERSION}) setup by AiiDAlab." @@ -130,6 +130,9 @@ def _generate_string_to_setup_code(code_name, computer_name="localhost"): prepend_text, ) return python_code + else: + # the code already exists + return "" def setup_codes(): diff --git a/src/aiidalab_qe/common/setup_pseudos.py b/src/aiidalab_qe/common/setup_pseudos.py index f367dccfd..4285456e4 100644 --- a/src/aiidalab_qe/common/setup_pseudos.py +++ b/src/aiidalab_qe/common/setup_pseudos.py @@ -1,19 +1,18 @@ -# -*- coding: utf-8 -*- from __future__ import annotations import os +from collections.abc import Iterable from dataclasses import dataclass, field from pathlib import Path from subprocess import run from threading import Thread -from typing import Iterable import ipywidgets as ipw import traitlets -from aiida.orm import QueryBuilder from aiida_pseudo.groups.family import PseudoPotentialFamily from filelock import FileLock, Timeout +from aiida.orm import QueryBuilder from aiidalab_qe.common.widgets import ProgressBar SSSP_VERSION = "1.3" @@ -225,7 +224,7 @@ def install( if len(pseudos_to_install()) > 0: raise RuntimeError( "Installation process did not finish in the expected time." - ) + ) from None class PseudosInstallWidget(ProgressBar): @@ -287,7 +286,7 @@ def _default_error(self): @traitlets.observe("busy") @traitlets.observe("error") @traitlets.observe("installed") - def _update(self, change): + def _update(self, _change): with self.hold_trait_notifications(): if self.hide_by_default: self.layout.visibility = ( diff --git a/src/aiidalab_qe/common/widgets.py b/src/aiidalab_qe/common/widgets.py index b15165883..0d07650a2 100644 --- a/src/aiidalab_qe/common/widgets.py +++ b/src/aiidalab_qe/common/widgets.py @@ -15,19 +15,18 @@ import ipywidgets as ipw import numpy as np import traitlets -from aiida.orm import CalcJobNode +from IPython.display import HTML, Javascript, clear_output, display +from pymatgen.core.periodic_table import Element + +from aiida.orm import CalcJobNode, load_code, load_node from aiida.orm import Data as orm_Data -from aiida.orm import load_code, load_node +from aiida_quantumespresso.data.hubbard_structure import HubbardStructureData from aiidalab_widgets_base import ComputationalResourcesWidget from aiidalab_widgets_base.utils import ( StatusHTML, list_to_string_range, string_range_to_list, ) -from IPython.display import HTML, Javascript, clear_output, display -from pymatgen.core.periodic_table import Element -from aiida_quantumespresso.data.hubbard_structure import HubbardStructureData - __all__ = [ "CalcJobOutputFollower", @@ -43,7 +42,7 @@ class RollingOutput(ipw.VBox): value = traitlets.Unicode() auto_scroll = traitlets.Bool() - def __init__(self, num_min_lines=10, max_output_height="200px", **kwargs): + def __init__(self, num_min_lines=10, max_output_height="200px", **kwargs): # noqa: ARG002 self._num_min_lines = num_min_lines self._output = ipw.HTML(layout=ipw.Layout(min_width="50em")) self._refresh_output() @@ -121,14 +120,14 @@ def __on_click(self, _): digest = hashlib.md5(self.payload).hexdigest() # bypass browser cache payload = base64.b64encode(self.payload).decode() - id = f"dl_{digest}" + link_id = f"dl_{digest}" display( HTML( f""" - + - - - """ - ) + return + + contents: bytes = self.contents().encode("utf-8") + b64 = base64.b64encode(contents) + payload = b64.decode() + digest = hashlib.md5(contents).hexdigest() # bypass browser cache + link_id = f"dl_{digest}" + + display( + HTML( + f""" + + + + + + + + """ ) + ) def write_csv(dataset): @@ -276,9 +276,9 @@ def _update_view(self): Select spectrum to plot
    """ ) final_spectra, equivalent_sites_data = export_xas_data(self.outputs) - xas_wc = [ + xas_wc = next( n for n in self.node.called if n.process_label == "XspectraCrystalWorkChain" - ][0] + ) core_wcs = { n.get_metadata_inputs()["metadata"]["call_link_label"]: n for n in xas_wc.called @@ -310,7 +310,7 @@ def _update_view(self): min=0.0, max=5, step=0.1, - description="$\Gamma_{hole}$", # noqa: W605 + description="$\Gamma_{hole}$", disabled=False, continuous_update=False, orientation="horizontal", @@ -323,7 +323,7 @@ def _update_view(self): max=10, step=0.5, continuous_update=False, - description="$\Gamma_{max}$", # noqa: W605 + description="$\Gamma_{max}$", disabled=True, orientation="horizontal", readout=True, @@ -350,7 +350,7 @@ def _update_view(self): # # init figure g = go.FigureWidget( layout=go.Layout( - title=dict(text="XAS"), + title={"text": "XAS"}, barmode="overlay", ) ) @@ -394,7 +394,7 @@ def _update_download_selection(dataset, element): download_data.contents = lambda: write_csv(dataset) download_data.filename = f"{element}_XAS_Spectra.csv" - def response(change): + def response(_change): chosen_spectrum = spectrum_select.value chosen_spectrum_label = f"{chosen_spectrum}_xas" element_sites = [ diff --git a/src/aiidalab_qe/plugins/xas/setting.py b/src/aiidalab_qe/plugins/xas/setting.py index 2d9b52535..165143295 100644 --- a/src/aiidalab_qe/plugins/xas/setting.py +++ b/src/aiidalab_qe/plugins/xas/setting.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Panel for XAS plugin.""" import os @@ -10,8 +9,8 @@ import requests import traitlets as tl import yaml -from aiida import orm +from aiida import orm from aiidalab_qe.common.panel import Panel from aiidalab_qe.plugins import xas as xas_folder @@ -46,10 +45,10 @@ def _load_or_import_nodes_from_filenames(in_dict, path, core_wfc_data=False): def _download_extract_pseudo_archive(func): - dir = f"{head_path}/{dir_header}/{func}" + target_dir = f"{head_path}/{dir_header}/{func}" archive_filename = f"{func}_ch_pseudos.tgz" remote_archive_filename = f"{base_url}/{func}/{archive_filename}" - local_archive_filename = f"{dir}/{archive_filename}" + local_archive_filename = f"{target_dir}/{archive_filename}" env = os.environ.copy() env["PATH"] = f"{env['PATH']}:{Path.home() / '.local' / 'lib'}" @@ -62,16 +61,16 @@ def _download_extract_pseudo_archive(func): response.close() with tarfile.open(local_archive_filename, "r:gz") as tarfil: - tarfil.extractall(dir) + tarfil.extractall(target_dir) url = f"{base_url}" for func in functionals: - dir = f"{head_path}/{dir_header}/{func}" - os.makedirs(dir, exist_ok=True) + target_dir = f"{head_path}/{dir_header}/{func}" + os.makedirs(target_dir, exist_ok=True) archive_filename = f"{func}_ch_pseudos.tgz" archive_found = False - for entry in os.listdir(dir): + for entry in os.listdir(target_dir): if entry == archive_filename: archive_found = True if not archive_found: @@ -273,7 +272,7 @@ def _update_element_select_panel(self): ] ch_pseudos = self.core_hole_pseudos structure = self.input_structure - available_elements = [k for k in ch_pseudos] + available_elements = list(ch_pseudos) elements_to_select = sorted( [ kind.symbol diff --git a/src/aiidalab_qe/plugins/xas/workchain.py b/src/aiidalab_qe/plugins/xas/workchain.py index d5b3cf000..07f51bfda 100644 --- a/src/aiidalab_qe/plugins/xas/workchain.py +++ b/src/aiidalab_qe/plugins/xas/workchain.py @@ -1,12 +1,12 @@ from importlib import resources import yaml + from aiida import orm from aiida.plugins import WorkflowFactory from aiida_quantumespresso.common.types import ElectronicType, SpinType -from aiidalab_qe.plugins.utils import set_component_resources - from aiidalab_qe.plugins import xas as xas_folder +from aiidalab_qe.plugins.utils import set_component_resources XspectraCrystalWorkChain = WorkflowFactory("quantumespresso.xspectra.crystal") PSEUDO_TOC = yaml.safe_load(resources.read_text(xas_folder, "pseudo_toc.yaml")) diff --git a/src/aiidalab_qe/plugins/xps/result.py b/src/aiidalab_qe/plugins/xps/result.py index 3c0016c99..57789f555 100644 --- a/src/aiidalab_qe/plugins/xps/result.py +++ b/src/aiidalab_qe/plugins/xps/result.py @@ -29,7 +29,7 @@ def export_xps_data(outputs): def xps_spectra_broadening( - points, equivalent_sites_data, gamma=0.3, sigma=0.3, label="", intensity=1.0 + points, equivalent_sites_data, gamma=0.3, sigma=0.3, _label="", intensity=1.0 ): """Broadening the XPS spectra with Voigt function and return the spectra data""" @@ -169,7 +169,7 @@ def _update_view(self): # init figure self.g = go.FigureWidget( layout=go.Layout( - title=dict(text="XPS"), + title={"text": "XPS"}, barmode="overlay", ) ) @@ -189,7 +189,7 @@ def _update_view(self): x=d[0], y=d[1], fill="tozeroy", name=site.replace("_", " ") ) - def response(change): + def response(_change): data = [] if spectra_type.value == "chemical_shift": points = chemical_shifts diff --git a/src/aiidalab_qe/plugins/xps/setting.py b/src/aiidalab_qe/plugins/xps/setting.py index 0f2077244..ecb1b4c9e 100644 --- a/src/aiidalab_qe/plugins/xps/setting.py +++ b/src/aiidalab_qe/plugins/xps/setting.py @@ -1,10 +1,9 @@ -# -*- coding: utf-8 -*- """Panel for XPS plugin.""" import ipywidgets as ipw import traitlets as tl -from aiida.orm import Group, QueryBuilder, StructureData +from aiida.orm import Group, QueryBuilder, StructureData from aiidalab_qe.common.panel import Panel base_url = "https://github.com/superstar54/xps-data/raw/main/pseudo_demo/" diff --git a/src/aiidalab_qe/plugins/xps/workchain.py b/src/aiidalab_qe/plugins/xps/workchain.py index f707ebd5e..f0a63a2ac 100644 --- a/src/aiidalab_qe/plugins/xps/workchain.py +++ b/src/aiidalab_qe/plugins/xps/workchain.py @@ -37,14 +37,14 @@ def get_builder(codes, structure, parameters, **kwargs): for label in core_level_list: element = label.split("_")[0] pseudos[element] = { - "core_hole": [ + "core_hole": next( pseudo for pseudo in pseudo_group.nodes if pseudo.label == label - ][0], - "gipaw": [ + ), + "gipaw": next( pseudo for pseudo in pseudo_group.nodes if pseudo.label == f"{element}_gs" - ][0], + ), } correction_energies[element] = ( all_correction_energies[label]["core"] diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index 6d4128302..5ceb56539 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- """This module contains project version information for both the app and the workflow.""" diff --git a/src/aiidalab_qe/workflows/__init__.py b/src/aiidalab_qe/workflows/__init__.py index 04ebc0486..6fc798afc 100644 --- a/src/aiidalab_qe/workflows/__init__.py +++ b/src/aiidalab_qe/workflows/__init__.py @@ -1,10 +1,9 @@ # AiiDA imports. +# AiiDA Quantum ESPRESSO plugin inputs. from aiida import orm from aiida.common import AttributeDict from aiida.engine import ToContext, WorkChain, if_ from aiida.plugins import DataFactory - -# AiiDA Quantum ESPRESSO plugin inputs. from aiida_quantumespresso.common.types import ElectronicType, RelaxType, SpinType from aiida_quantumespresso.data.hubbard_structure import HubbardStructureData from aiida_quantumespresso.utils.mapping import prepare_process_inputs diff --git a/start.py b/start.py index a43a898df..7d25ecf3e 100644 --- a/start.py +++ b/start.py @@ -1,7 +1,7 @@ import ipywidgets as ipw -def get_start_widget(appbase, jupbase, notebase): +def get_start_widget(appbase, jupbase, notebase): # noqa: ARG001 return ipw.HTML( f""" diff --git a/tests/configuration/test_advanced.py b/tests/configuration/test_advanced.py index 4dee1caa9..800436bd7 100644 --- a/tests/configuration/test_advanced.py +++ b/tests/configuration/test_advanced.py @@ -120,10 +120,10 @@ def test_advanced_tot_charge_settings(): def test_advanced_kpoints_mesh(): """Test Mesh Grid HTML widget.""" - from aiida import orm - from aiidalab_qe.app.configuration.advanced import AdvancedSettings + from aiida import orm + w = AdvancedSettings() # Create a StructureData for AdvancedSettings (Silicon) diff --git a/tests/conftest.py b/tests/conftest.py index 100ebdcfd..b7c83a187 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,10 +5,10 @@ import tempfile import pytest -from aiida import orm - from aiidalab_qe.common.setup_pseudos import SSSP_VERSION +from aiida import orm + pytest_plugins = ["aiida.manage.tests.pytest_fixtures"] @@ -107,10 +107,6 @@ def _generate_xy_data(xvals=None, yvals=None, xlabel=None, ylabel=None): """ from aiida.orm import XyData - xvals = xvals - yvals = yvals - xlabel = xlabel - ylabel = ylabel xunits = "n/a" yunits = ["n/a"] * len(ylabel) @@ -130,6 +126,7 @@ def generate_bands_data(): def _generate_bands_data(): """Return a `BandsData` instance with some basic `kpoints` and `bands` arrays.""" import numpy as np + from aiida.plugins import DataFactory BandsData = DataFactory("core.array.bands") @@ -153,6 +150,7 @@ def generate_projection_data(generate_bands_data): def _generate_projection_data(): """Return an ``ProjectionData`` node.""" import numpy as np + from aiida.plugins import DataFactory, OrbitalFactory ProjectionData = DataFactory("core.array.projection") @@ -197,33 +195,34 @@ def sssp(aiida_profile, generate_upf_data): cutoffs = {} stringency = "standard" - with tempfile.TemporaryDirectory() as dirpath: + actinides = ( + "Ac", + "Th", + "Pa", + "U", + "Np", + "Pu", + "Am", + "Cm", + "Bk", + "Cf", + "Es", + "Fm", + "Md", + "No", + "Lr", + ) + + with tempfile.TemporaryDirectory() as d: + dirpath = pathlib.Path(d) + for values in elements.values(): element = values["symbol"] - actinides = ( - "Ac", - "Th", - "Pa", - "U", - "Np", - "Pu", - "Am", - "Cm", - "Bk", - "Cf", - "Es", - "Fm", - "Md", - "No", - "Lr", - ) - if element in actinides: continue upf = generate_upf_data(element) - dirpath = pathlib.Path(dirpath) filename = dirpath / f"{element}.upf" with open(filename, "w+b") as handle: @@ -443,6 +442,7 @@ def generate_pdos_workchain( def _generate_pdos_workchain(structure, spin_type="none"): import numpy as np + from aiida import engine from aiida.orm import Dict, FolderData, RemoteData from aiida_quantumespresso.workflows.pdos import PdosWorkChain @@ -630,12 +630,12 @@ def _generate_qeapp_workchain( ): from copy import deepcopy - from aiida.orm.utils.serialize import serialize - from aiidalab_qe.app.configuration import ConfigureQeAppWorkChainStep from aiidalab_qe.app.submission import SubmitQeAppWorkChainStep from aiidalab_qe.workflows import QeAppWorkChain + from aiida.orm.utils.serialize import serialize + # Step 1: select structure from example s1 = app.structure_step if structure is None: diff --git a/tests/test_cli.py b/tests/test_cli.py index 53c334307..91bb0668f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,9 +1,9 @@ import time -import aiida +import aiidalab_qe.__main__ as cli from click.testing import CliRunner, Result -import aiidalab_qe.__main__ as cli +import aiida # To learn more about testing click applications, see: https://click.palletsprojects.com/en/8.1.x/testing/ diff --git a/tests/test_plugins_bands.py b/tests/test_plugins_bands.py index 27533eec0..b3c2a9dc8 100644 --- a/tests/test_plugins_bands.py +++ b/tests/test_plugins_bands.py @@ -3,8 +3,8 @@ @pytest.mark.usefixtures("sssp") def test_result(generate_qeapp_workchain): - from aiidalab_qe.common.bandpdoswidget import BandPdosWidget import plotly.graph_objects as go + from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.plugins.bands.result import Result wkchain = generate_qeapp_workchain() diff --git a/tests/test_plugins_electronic_structure.py b/tests/test_plugins_electronic_structure.py index c2c0203d3..271adfd1b 100644 --- a/tests/test_plugins_electronic_structure.py +++ b/tests/test_plugins_electronic_structure.py @@ -1,12 +1,12 @@ def test_electronic_structure(generate_qeapp_workchain): """Test the electronic structure tab.""" - from aiida import engine - + import plotly.graph_objects as go from aiidalab_qe.app.result.workchain_viewer import WorkChainViewer from aiidalab_qe.common.bandpdoswidget import BandPdosWidget - import plotly.graph_objects as go from aiidalab_qe.plugins.electronic_structure.result import Result + from aiida import engine + wkchain = generate_qeapp_workchain() wkchain.node.set_exit_status(0) wkchain.node.set_process_state(engine.ProcessState.FINISHED) @@ -14,11 +14,11 @@ def test_electronic_structure(generate_qeapp_workchain): # find the tab with the identifier "electronic_structure" # the built-in summary and structure tabs is not a plugin panel, # thus don't have identifiers - tab = [ + tab = next( tab for tab in wcv.result_tabs.children if getattr(tab, "identifier", "") == "electronic_structure" - ][0] + ) # It should have one children: the _bands_plot_view assert len(tab.children) == 1 diff --git a/tests/test_plugins_pdos.py b/tests/test_plugins_pdos.py index 6d02a140e..426393694 100644 --- a/tests/test_plugins_pdos.py +++ b/tests/test_plugins_pdos.py @@ -3,8 +3,8 @@ @pytest.mark.usefixtures("sssp") def test_result(generate_qeapp_workchain): - from aiidalab_qe.common.bandpdoswidget import BandPdosWidget import plotly.graph_objects as go + from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.plugins.pdos.result import Result wkchain = generate_qeapp_workchain() diff --git a/tests/test_plugins_xps.py b/tests/test_plugins_xps.py index 6bc0d9af3..8f15c3b80 100644 --- a/tests/test_plugins_xps.py +++ b/tests/test_plugins_xps.py @@ -7,6 +7,7 @@ def test_settings(): from aiidalab_qe.app.configuration import ConfigureQeAppWorkChainStep from ase.build import molecule + from aiida.orm import StructureData configure_step = ConfigureQeAppWorkChainStep() diff --git a/tests/test_pseudo.py b/tests/test_pseudo.py index 2412b63bd..a85c34e86 100644 --- a/tests/test_pseudo.py +++ b/tests/test_pseudo.py @@ -1,6 +1,4 @@ import pytest -from aiida import orm - from aiidalab_qe.common.setup_pseudos import ( PSEUDODOJO_VERSION, SSSP_VERSION, @@ -9,6 +7,8 @@ pseudos_to_install, ) +from aiida import orm + def test_setup_pseudos_cmd(tmp_path): """Test _construct_cmd function in setup_pseudos.py.""" @@ -96,7 +96,7 @@ def test_setup_pseudos_cmd(tmp_path): "--pseudo-format", "upf", "--from-download", - f"{str(tmp_path)}/PseudoDojo_{PSEUDODOJO_VERSION}_PBEsol_SR_standard_upf.aiida_pseudo", + f"{tmp_path!s}/PseudoDojo_{PSEUDODOJO_VERSION}_PBEsol_SR_standard_upf.aiida_pseudo", ] @@ -111,7 +111,7 @@ def test_pseudos_installation(): } # Install the pseudos - [_ for _ in _install_pseudos(EXPECTED_PSEUDOS)] + list(_install_pseudos(EXPECTED_PSEUDOS)) # Two pseudos are installed assert len(pseudos_to_install()) == 10 @@ -127,13 +127,13 @@ def test_download_and_install_pseudo_from_file(tmp_path): } # Download the pseudos to the tmp_path but not install - [_ for _ in _install_pseudos(EXPECTED_PSEUDOS, download_only=True, cwd=tmp_path)] + list(_install_pseudos(EXPECTED_PSEUDOS, download_only=True, cwd=tmp_path)) assert len(pseudos_to_install()) == 12 assert len(list(tmp_path.iterdir())) == 2 # Install the pseudos from the tmp_path - [_ for _ in _install_pseudos(EXPECTED_PSEUDOS, cwd=tmp_path)] + list(_install_pseudos(EXPECTED_PSEUDOS, cwd=tmp_path)) # Two pseudos are installed assert len(pseudos_to_install()) == 10 diff --git a/tests/test_result.py b/tests/test_result.py index c6e087d17..9deb51f0a 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -43,9 +43,8 @@ def test_summary_report_advanced_settings(data_regression, generate_qeapp_workch def test_summary_view(generate_qeapp_workchain): """Test the report html can be properly generated.""" - from bs4 import BeautifulSoup - from aiidalab_qe.app.result.summary_viewer import SummaryView + from bs4 import BeautifulSoup wkchain = generate_qeapp_workchain() viewer = SummaryView(wkchain.node) diff --git a/tests_integration/test_app.py b/tests_integration/test_app.py index d847e7ff0..e1475282b 100755 --- a/tests_integration/test_app.py +++ b/tests_integration/test_app.py @@ -1,7 +1,7 @@ import time from pathlib import Path -import selenium.webdriver.support.expected_conditions as EC +import selenium.webdriver.support.expected_conditions as EC # noqa: N812 from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait From ea6b6459b33c9833d3f33444f7906d53636294cc Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Wed, 31 Jul 2024 16:07:52 +0200 Subject: [PATCH 120/166] Slim image without fix-permissions on CONDA_DIR (#790) fixes #789 A layer by layer investigation using docker slim shows how aiidalab-qe image grows, I find an extra layer added with same content by `fix-permissions`. I increase size since it change the file permission which are regarded as different files in OCI bundle. It is identical in terms of files as the layer with `uv pip install ${QE_APP_SRC}`. By remove the fix-permission line, the image size goes by more than 600 MB. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 2785c947e..0d8fdf05d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -86,7 +86,7 @@ COPY --from=qe_conda_env ${QE_DIR} ${QE_DIR} USER root COPY ./before-notebook.d/* /usr/local/bin/before-notebook.d/ -RUN fix-permissions "${CONDA_DIR}" + # Remove content of $HOME # '-mindepth=1' ensures that we do not remove the home directory itself. RUN find /home/${NB_USER}/ -mindepth 1 -delete From 8855969f0f1703c76de574a806a874bbb90ad5b9 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Mon, 19 Aug 2024 14:45:08 +0100 Subject: [PATCH 121/166] Code/Pseudos setup: Separate frontend from backend (#796) * Document docker images in README --- README.md | 14 +- src/aiidalab_qe/__main__.py | 18 +- src/aiidalab_qe/app/configuration/advanced.py | 2 +- src/aiidalab_qe/app/configuration/pseudos.py | 2 +- src/aiidalab_qe/common/setup_codes.py | 201 +--------------- src/aiidalab_qe/common/setup_pseudos.py | 222 +---------------- src/aiidalab_qe/setup/__init__.py | 5 + src/aiidalab_qe/setup/codes.py | 203 ++++++++++++++++ src/aiidalab_qe/setup/pseudos.py | 225 ++++++++++++++++++ tests/conftest.py | 2 +- tests/test_cli.py | 4 +- tests/test_configure.py | 2 +- tests/test_pseudo.py | 4 +- 13 files changed, 467 insertions(+), 437 deletions(-) create mode 100644 src/aiidalab_qe/setup/__init__.py create mode 100644 src/aiidalab_qe/setup/codes.py create mode 100644 src/aiidalab_qe/setup/pseudos.py diff --git a/README.md b/README.md index f5c167709..59eca0b83 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,8 @@ ## About -This is a early-development implementation of an AiiDAlab application for Quantum ESPRESSO workflow. -The app allows the execution of a workflow with Quantum ESPRESSO that includes the selection of an input structure, its relaxation, and the bands structure calculation. +This is an AiiDAlab application for Quantum ESPRESSO workflows. +The app allows the execution of a workflow with Quantum ESPRESSO that includes the selection of an input structure, its relaxation, the bands structure calculation, and more! **The app is currently in an early development stage!** @@ -41,6 +41,16 @@ Then, you can run the integration tests with: pytest --driver Chrome tests_integration ``` +### Published Docker images + +Supported tags released on [Github Container Registry](https://ghcr.io/aiidalab): + +- `edge` – the latest commit on the default branch (`main`) +- `latest` – the latest stable release +- `$version` – the version of a specific release (ex. `2022.1001`) + +Pull requests into the default branch are further released on ghcr.io with the `pr-###` tag to simplify the testing of development versions. + ## For maintainers To create a new release, clone the repository, install development dependencies with `pip install '.[dev]'`, and then execute `bumpver update`. diff --git a/src/aiidalab_qe/__main__.py b/src/aiidalab_qe/__main__.py index 667b011c2..1e5d5043a 100644 --- a/src/aiidalab_qe/__main__.py +++ b/src/aiidalab_qe/__main__.py @@ -5,10 +5,6 @@ import click -from aiida import load_profile -from aiidalab_qe.common.setup_codes import codes_are_setup -from aiidalab_qe.common.setup_codes import install as install_qe_codes - # The default profile name of AiiDAlab container. _DEFAULT_PROFILE = "default" @@ -22,9 +18,12 @@ def cli(): @click.option("-f", "--force", is_flag=True) @click.option("-p", "--profile", default=_DEFAULT_PROFILE) def install_qe(force, profile): + from aiida import load_profile + from aiidalab_qe.setup.codes import codes_are_setup, install + load_profile(profile) try: - for msg in install_qe_codes(force=force): + for msg in install(force=force): click.echo(msg) assert codes_are_setup() click.secho("Codes are setup!", fg="green") @@ -45,7 +44,8 @@ def install_pseudos(profile, source): """Install pseudopotentials from a local folder if source is specified, otherwise download from remote repositories. """ - from aiidalab_qe.common.setup_pseudos import install + from aiida import load_profile + from aiidalab_qe.setup.pseudos import install load_profile(profile) @@ -68,7 +68,7 @@ def install_pseudos(profile, source): type=click.Path(exists=True, path_type=Path, resolve_path=True), ) def download_pseudos(dest): - from aiidalab_qe.common.setup_pseudos import EXPECTED_PSEUDOS, _install_pseudos + from aiidalab_qe.setup.pseudos import EXPECTED_PSEUDOS, _install_pseudos try: for progress in _install_pseudos( @@ -90,9 +90,11 @@ def download_pseudos(dest): ) @click.option("-p", "--profile", default=_DEFAULT_PROFILE) def test_plugin(plugin_name, profile): - load_profile(profile) + from aiida import load_profile from aiidalab_qe.app.utils import test_plugin_functionality + load_profile(profile) + try: success, message = test_plugin_functionality(plugin_name) if success: diff --git a/src/aiidalab_qe/app/configuration/advanced.py b/src/aiidalab_qe/app/configuration/advanced.py index 65a416960..343be6134 100644 --- a/src/aiidalab_qe/app/configuration/advanced.py +++ b/src/aiidalab_qe/app/configuration/advanced.py @@ -18,8 +18,8 @@ from aiida_quantumespresso.workflows.pw.base import PwBaseWorkChain from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS from aiidalab_qe.common.panel import Panel -from aiidalab_qe.common.setup_pseudos import PseudoFamily from aiidalab_qe.common.widgets import HubbardWidget +from aiidalab_qe.setup.pseudos import PseudoFamily from .pseudos import PseudoFamilySelector, PseudoSetter diff --git a/src/aiidalab_qe/app/configuration/pseudos.py b/src/aiidalab_qe/app/configuration/pseudos.py index 2a46a9bce..1d969779f 100644 --- a/src/aiidalab_qe/app/configuration/pseudos.py +++ b/src/aiidalab_qe/app/configuration/pseudos.py @@ -11,7 +11,7 @@ from aiida.plugins import DataFactory, GroupFactory from aiida_quantumespresso.workflows.pw.base import PwBaseWorkChain from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS -from aiidalab_qe.common.setup_pseudos import ( +from aiidalab_qe.setup.pseudos import ( PSEUDODOJO_VERSION, SSSP_VERSION, PseudoFamily, diff --git a/src/aiidalab_qe/common/setup_codes.py b/src/aiidalab_qe/common/setup_codes.py index 0da53b237..32cae7ede 100644 --- a/src/aiidalab_qe/common/setup_codes.py +++ b/src/aiidalab_qe/common/setup_codes.py @@ -1,215 +1,18 @@ from pathlib import Path -from shutil import which -from subprocess import CalledProcessError, run from threading import Thread import ipywidgets as ipw import traitlets -from filelock import FileLock, Timeout -from aiida.common.exceptions import NotExistent -from aiida.orm import load_code -from aiidalab_qe.common.widgets import ProgressBar +from ..setup.codes import QE_VERSION, install +from .widgets import ProgressBar __all__ = [ "QESetupWidget", ] -FN_LOCKFILE = Path.home().joinpath(".install-qe-on-localhost.lock") FN_DO_NOT_SETUP = Path.cwd().joinpath(".do-not-setup-on-localhost") -QE_VERSION = "7.2" - - -def get_qe_env(): - # QE is already pre-installed in the QE image - path = Path(f"/opt/conda/envs/quantum-espresso-{QE_VERSION}") - if path.exists(): - return path - else: - return Path.home().joinpath(".conda", "envs", f"quantum-espresso-{QE_VERSION}") - - -# Add all QE codes with the calcjob entry point in the aiida-quantumespresso. -CODE_NAMES = ( - "pw", - "projwfc", - "dos", - "cp", - "epw", - "matdyn", - "neb", - "open_grid", - "ph", - "pp", - "pw2gw", - "pw2wannier90", - "q2r", - "xspectra", - "hp", -) - - -def qe_installed(): - return get_qe_env().exists() - - -def install_qe(): - run( - [ - "conda", - "create", - "--yes", - "--override-channels", - "--channel", - "conda-forge", - "--prefix", - str(get_qe_env()), - f"qe={QE_VERSION}", - ], - capture_output=True, - check=True, - ) - - -def _code_is_setup(name): - try: - load_code(f"{name}-{QE_VERSION}@localhost") - except NotExistent: - return False - else: - return True - - -def codes_are_setup(): - return all(_code_is_setup(code_name) for code_name in CODE_NAMES) - - -def _generate_header_to_setup_code(): - """Generate the header string to setup a code for a given computer.""" - header_code = """ -from aiida.orm.nodes.data.code.installed import InstalledCode -from aiida.orm import load_computer -from aiida import load_profile -load_profile() - -""" - return header_code - - -def _generate_string_to_setup_code(code_name, computer_name="localhost"): - """Generate the Python string to setup an AiiDA code for a given computer. - - Tries to load an existing code and if not existent, - generates Python code to create and store a new code setup.""" - try: - load_code(f"{code_name}-{QE_VERSION}@{computer_name}") - except NotExistent: - label = f"{code_name}-{QE_VERSION}" - description = f"{code_name}.x ({QE_VERSION}) setup by AiiDAlab." - filepath_executable = get_qe_env().joinpath("bin", f"{code_name}.x") - default_calc_job_plugin = f"quantumespresso.{code_name}" - prepend_text = f'eval "$(conda shell.posix hook)"\\nconda activate {get_qe_env()}\\nexport OMP_NUM_THREADS=1' - python_code = """ -computer = load_computer('{}') -code = InstalledCode(computer=computer, - label='{}', - description='{}', - filepath_executable='{}', - default_calc_job_plugin='{}', - prepend_text='{}' - ) - -code.store() -""".format( # noqa: UP032 - computer_name, - label, - description, - filepath_executable, - default_calc_job_plugin, - prepend_text, - ) - return python_code - else: - # the code already exists - return "" - - -def setup_codes(): - python_code = _generate_header_to_setup_code() - for code_name in CODE_NAMES: - python_code += _generate_string_to_setup_code(code_name) - try: - run(["python", "-c", python_code], capture_output=True, check=True) - except CalledProcessError as error: - raise RuntimeError(f"Failed to setup codes: {error}") from None - - -def install(force=False): - """Install Quantum ESPRESSO and the corresponding AiiDA codes. - - Args: - force: Ignore previously failed attempts and install anyways. - """ - # Check for "do not install file" and skip actual check. The purpose of - # this file is to not re-try this process on every app start in case that - # there are issues. - if not force and FN_DO_NOT_SETUP.exists(): - raise RuntimeError("Installation failed in previous attempt.") - - yield "Checking installation status..." - - conda_installed = which("conda") - try: - with FileLock(FN_LOCKFILE, timeout=5): - # We assume that if the codes are already setup, everything is in - # order. Only if they are not present, should we take action, - # however we only do so if the environment has a conda binary - # present (`which conda`). If that is not the case then we assume - # that this is a custom user environment in which case we also take - # no further action. - if codes_are_setup(): - return # Already setup - - if not conda_installed: - raise RuntimeError( - "Unable to automatically install Quantum ESPRESSO, conda " - "is not available." - ) - - if not qe_installed(): - # First, install Quantum ESPRESSO. - yield "Installing QE..." - try: - install_qe() - except CalledProcessError as error: - raise RuntimeError( - f"Failed to create conda environment: {error}" - ) from None - - # After installing QE, we install the corresponding - # AiiDA codes: - python_code = _generate_header_to_setup_code() - for code_name in CODE_NAMES: - if not _code_is_setup(code_name): - yield f"Preparing setup script for ({code_name})..." - code_string = _generate_string_to_setup_code(code_name) - python_code += code_string - try: - yield "Setting up all codes..." - run(["python", "-c", python_code], capture_output=True, check=True) - except CalledProcessError as error: - raise RuntimeError(f"Failed to setup codes: {error}") from None - - except Timeout: - # Assume that the installation was triggered by a different process. - yield "Installation was already started, waiting for it to finish..." - with FileLock(FN_LOCKFILE, timeout=120): - if not codes_are_setup(): - raise RuntimeError( - "Installation process did not finish in the expected time." - ) from None - class QESetupWidget(ipw.VBox): installed = traitlets.Bool(allow_none=True).tag(readonly=True) diff --git a/src/aiidalab_qe/common/setup_pseudos.py b/src/aiidalab_qe/common/setup_pseudos.py index 4285456e4..608a9a45f 100644 --- a/src/aiidalab_qe/common/setup_pseudos.py +++ b/src/aiidalab_qe/common/setup_pseudos.py @@ -1,230 +1,12 @@ from __future__ import annotations -import os -from collections.abc import Iterable -from dataclasses import dataclass, field -from pathlib import Path -from subprocess import run from threading import Thread import ipywidgets as ipw import traitlets -from aiida_pseudo.groups.family import PseudoPotentialFamily -from filelock import FileLock, Timeout -from aiida.orm import QueryBuilder -from aiidalab_qe.common.widgets import ProgressBar - -SSSP_VERSION = "1.3" -PSEUDODOJO_VERSION = "0.4" - -EXPECTED_PSEUDOS = { - f"SSSP/{SSSP_VERSION}/PBE/efficiency", - f"SSSP/{SSSP_VERSION}/PBE/precision", - f"SSSP/{SSSP_VERSION}/PBEsol/efficiency", - f"SSSP/{SSSP_VERSION}/PBEsol/precision", - f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/SR/standard/upf", - f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/SR/standard/upf", - f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/SR/stringent/upf", - f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/SR/stringent/upf", - f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/FR/standard/upf", - f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/FR/standard/upf", - f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/FR/stringent/upf", - f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/FR/stringent/upf", -} - - -FN_LOCKFILE = Path.home().joinpath(".install-sssp.lock") - - -@dataclass -class PseudoFamily: - """The dataclass to deal with pseudo family strings. - - Attributes: - library: the library name of the pseudo family, e.g. SSSP or PseudoDojo. - cmd_library_name: the sub command name used in aiida-pseudo command line. - version: the version of the pseudo family, e.g. 1.2 - functional: the functional of the pseudo family, e.g. PBE, PBEsol. - accuracy: the accuracy of the pseudo family, which is protocol in aiida-pseudo, e.g. efficiency, precision, standard, stringent. - relativistic: the relativistic treatment of the pseudo family, e.g. SR, FR. - file_type: the file type of the pseudo family, e.g. upf, psml, currently only used for PseudoDojo. - """ - - library: str - version: str - functional: str - accuracy: str - cmd_library_name: str = field(init=False) - relativistic: str | None = None - file_type: str | None = None - - def __post_init__(self): - """Post init operations and checks.""" - if self.library == "SSSP": - self.cmd_library_name = "sssp" - elif self.library == "PseudoDojo": - self.cmd_library_name = "pseudo-dojo" - else: - raise ValueError(f"Unknown pseudo library {self.library}") - - @classmethod - def from_string(cls, pseudo_family_string: str) -> PseudoFamily: - """Initialize from a pseudo family string.""" - # We support two pseudo families: SSSP and PseudoDojo - # They are formatted as follows: - # SSSP: SSSP/// - # PseudoDojo: PseudoDojo///// - # where is either 'SR' or 'FR' and is either 'upf' or 'psml' - # Before we unify the format of family strings, the conditions below are necessary - # to distinguish between the two families - library = pseudo_family_string.split("/")[0] - if library == "SSSP": - version, functional, accuracy = pseudo_family_string.split("/")[1:] - relativistic = None - file_type = None - elif library == "PseudoDojo": - ( - version, - functional, - relativistic, - accuracy, - file_type, - ) = pseudo_family_string.split("/")[1:] - else: - raise ValueError( - f"Not able to parse valid library name from {pseudo_family_string}" - ) - - return cls( - library=library, - version=version, - functional=functional, - accuracy=accuracy, - relativistic=relativistic, - file_type=file_type, - ) - - -def pseudos_to_install() -> set[str]: - """Query the database and return the list of pseudopotentials that are not installed.""" - qb = QueryBuilder() - qb.append( - PseudoPotentialFamily, - filters={ - "or": [ - {"label": {"like": "SSSP/%"}}, - {"label": {"like": "PseudoDojo/%"}}, - ] - }, - project="label", - ) - labels = set(qb.all(flat=True)) - return EXPECTED_PSEUDOS - labels - - -def _construct_cmd( - pseudo_family_string: str, download_only: bool = False, cwd: Path | None = None -) -> list: - """Construct the command for installation of pseudopotentials. - - If ``cwd`` is not None, and ``download_only`` is True the, only download the - pseudopotential files to the ``cwd`` folder. - If ``download_only`` is False and ``cwd`` is not None, the the pseudos will be installed from the ``cwd`` where the pseudos are downloaded to. - - NOTE: download_only has nothing to do with cwd, it will not download the pseudos to cwd if cwd is specified. - The control to download to cwd is in the ``_install_pseudos`` function below. - """ - pseudo_family = PseudoFamily.from_string(pseudo_family_string) - - # the library used in command line is lowercase - # e.g. SSSP -> sssp and PseudoDojo -> pseudo-dojo - library = pseudo_family.cmd_library_name - version = pseudo_family.version - functional = pseudo_family.functional - accuracy = pseudo_family.accuracy - cmd = [ - "aiida-pseudo", - "install", - library, - "--functional", - functional, - "--version", - version, - "-p", # p for protocol which is the accuracy of the library - accuracy, - ] - - # extra arguments for PseudoDojo - if library == "pseudo-dojo": - relativistic = pseudo_family.relativistic - file_type = pseudo_family.file_type - cmd.extend( - [ - "--relativistic", - relativistic, - "--pseudo-format", - file_type, - ] - ) - - if download_only: - cmd.append("--download-only") - - # if cwd source folder specified, then install the pseudos from the folder - # download file name is replace `/` with `_` of the pseudo family string with `.aiida_pseudo` extension - if not download_only and cwd is not None: - file_path = cwd / f"{pseudo_family_string.replace('/', '_')}.aiida_pseudo" - if file_path.exists(): - cmd.extend(["--from-download", str(file_path)]) - - return cmd - - -def run_cmd(cmd: list, env: dict | None = None, cwd: Path | None = None): - """Run the command with specific env in the workdir specified.""" - run(cmd, env=env, cwd=cwd, capture_output=True, check=True) - - -def _install_pseudos( - pseudo_families: set[str], download_only: bool = False, cwd: Path | None = None -) -> Iterable[float]: - """Go through the list of pseudo families and install them.""" - env = os.environ.copy() - env["PATH"] = f"{env['PATH']}:{Path.home() / '.local' / 'bin'}" - - mult = 1.0 / len(pseudo_families) - yield mult * 0 - for i, pseudo_family in enumerate(pseudo_families): - cmd = _construct_cmd(pseudo_family, download_only, cwd=cwd) - - run_cmd(cmd, env=env, cwd=cwd) - - yield mult * (i + 1) - - -def install( - download_only: bool = False, cwd: Path | None = None -) -> Iterable[tuple[str, float]]: - yield "Checking installation status...", 0.1 - try: - with FileLock(FN_LOCKFILE, timeout=5): - if len(pseudos := pseudos_to_install()) > 0: - yield "Installing...", 0.1 - for progress in _install_pseudos(pseudos, download_only, cwd): - yield "Installing...", progress - - except Timeout: - # Assume that the installation was triggered by a different process. - yield ( - "Installation was already started elsewhere, waiting for it to finish...", - ProgressBar.AnimationRate(1.0), - ) - with FileLock(FN_LOCKFILE, timeout=300): - if len(pseudos_to_install()) > 0: - raise RuntimeError( - "Installation process did not finish in the expected time." - ) from None +from ..setup.pseudos import install, pseudos_to_install +from .widgets import ProgressBar class PseudosInstallWidget(ProgressBar): diff --git a/src/aiidalab_qe/setup/__init__.py b/src/aiidalab_qe/setup/__init__.py new file mode 100644 index 000000000..762d595d7 --- /dev/null +++ b/src/aiidalab_qe/setup/__init__.py @@ -0,0 +1,5 @@ +"""Package for the QE app CLI for setting up codes and pseudos""" + +from .codes import QE_VERSION + +__all__ = ["QE_VERSION"] diff --git a/src/aiidalab_qe/setup/codes.py b/src/aiidalab_qe/setup/codes.py new file mode 100644 index 000000000..21eba487e --- /dev/null +++ b/src/aiidalab_qe/setup/codes.py @@ -0,0 +1,203 @@ +from pathlib import Path +from shutil import which +from subprocess import CalledProcessError, run + +from filelock import FileLock, Timeout + +from aiida.common.exceptions import NotExistent +from aiida.orm import load_code + +FN_LOCKFILE = Path.home().joinpath(".install-qe-on-localhost.lock") +FN_DO_NOT_SETUP = Path.cwd().joinpath(".do-not-setup-on-localhost") + +QE_VERSION = "7.2" + + +def get_qe_env(): + # QE is already pre-installed in the QE image + path = Path(f"/opt/conda/envs/quantum-espresso-{QE_VERSION}") + if path.exists(): + return path + else: + return Path.home().joinpath(".conda", "envs", f"quantum-espresso-{QE_VERSION}") + + +# Add all QE codes with the calcjob entry point in the aiida-quantumespresso. +CODE_NAMES = ( + "pw", + "projwfc", + "dos", + "cp", + "epw", + "matdyn", + "neb", + "open_grid", + "ph", + "pp", + "pw2gw", + "pw2wannier90", + "q2r", + "xspectra", + "hp", +) + + +def qe_installed(): + return get_qe_env().exists() + + +def install_qe(): + run( + [ + "conda", + "create", + "--yes", + "--override-channels", + "--channel", + "conda-forge", + "--prefix", + str(get_qe_env()), + f"qe={QE_VERSION}", + ], + capture_output=True, + check=True, + ) + + +def _code_is_setup(name): + try: + load_code(f"{name}-{QE_VERSION}@localhost") + except NotExistent: + return False + else: + return True + + +def codes_are_setup(): + return all(_code_is_setup(code_name) for code_name in CODE_NAMES) + + +def _generate_header_to_setup_code(): + """Generate the header string to setup a code for a given computer.""" + header_code = """ +from aiida.orm.nodes.data.code.installed import InstalledCode +from aiida.orm import load_computer +from aiida import load_profile +load_profile() + +""" + return header_code + + +def _generate_string_to_setup_code(code_name, computer_name="localhost"): + """Generate the Python string to setup an AiiDA code for a given computer. + + Tries to load an existing code and if not existent, + generates Python code to create and store a new code setup.""" + try: + load_code(f"{code_name}-{QE_VERSION}@{computer_name}") + except NotExistent: + label = f"{code_name}-{QE_VERSION}" + description = f"{code_name}.x ({QE_VERSION}) setup by AiiDAlab." + filepath_executable = get_qe_env().joinpath("bin", f"{code_name}.x") + default_calc_job_plugin = f"quantumespresso.{code_name}" + prepend_text = f'eval "$(conda shell.posix hook)"\\nconda activate {get_qe_env()}\\nexport OMP_NUM_THREADS=1' + python_code = """ +computer = load_computer('{}') +code = InstalledCode(computer=computer, + label='{}', + description='{}', + filepath_executable='{}', + default_calc_job_plugin='{}', + prepend_text='{}' + ) + +code.store() +""".format( # noqa: UP032 + computer_name, + label, + description, + filepath_executable, + default_calc_job_plugin, + prepend_text, + ) + return python_code + else: + # the code already exists + return "" + + +def setup_codes(): + python_code = _generate_header_to_setup_code() + for code_name in CODE_NAMES: + python_code += _generate_string_to_setup_code(code_name) + try: + run(["python", "-c", python_code], capture_output=True, check=True) + except CalledProcessError as error: + raise RuntimeError(f"Failed to setup codes: {error}") from None + + +def install(force=False): + """Install Quantum ESPRESSO and the corresponding AiiDA codes. + + Args: + force: Ignore previously failed attempts and install anyways. + """ + # Check for "do not install file" and skip actual check. The purpose of + # this file is to not re-try this process on every app start in case that + # there are issues. + if not force and FN_DO_NOT_SETUP.exists(): + raise RuntimeError("Installation failed in previous attempt.") + + yield "Checking installation status..." + + conda_installed = which("conda") + try: + with FileLock(FN_LOCKFILE, timeout=5): + # We assume that if the codes are already setup, everything is in + # order. Only if they are not present, should we take action, + # however we only do so if the environment has a conda binary + # present (`which conda`). If that is not the case then we assume + # that this is a custom user environment in which case we also take + # no further action. + if codes_are_setup(): + return # Already setup + + if not conda_installed: + raise RuntimeError( + "Unable to automatically install Quantum ESPRESSO, conda " + "is not available." + ) + + if not qe_installed(): + # First, install Quantum ESPRESSO. + yield "Installing QE..." + try: + install_qe() + except CalledProcessError as error: + raise RuntimeError( + f"Failed to create conda environment: {error}" + ) from None + + # After installing QE, we install the corresponding + # AiiDA codes: + python_code = _generate_header_to_setup_code() + for code_name in CODE_NAMES: + if not _code_is_setup(code_name): + yield f"Preparing setup script for ({code_name})..." + code_string = _generate_string_to_setup_code(code_name) + python_code += code_string + try: + yield "Setting up all codes..." + run(["python", "-c", python_code], capture_output=True, check=True) + except CalledProcessError as error: + raise RuntimeError(f"Failed to setup codes: {error}") from None + + except Timeout: + # Assume that the installation was triggered by a different process. + yield "Installation was already started, waiting for it to finish..." + with FileLock(FN_LOCKFILE, timeout=120): + if not codes_are_setup(): + raise RuntimeError( + "Installation process did not finish in the expected time." + ) from None diff --git a/src/aiidalab_qe/setup/pseudos.py b/src/aiidalab_qe/setup/pseudos.py new file mode 100644 index 000000000..2dd0b1323 --- /dev/null +++ b/src/aiidalab_qe/setup/pseudos.py @@ -0,0 +1,225 @@ +from __future__ import annotations + +import os +from collections.abc import Iterable +from dataclasses import dataclass, field +from pathlib import Path +from subprocess import run + +from aiida_pseudo.groups.family import PseudoPotentialFamily +from filelock import FileLock, Timeout + +from aiida.orm import QueryBuilder + +SSSP_VERSION = "1.3" +PSEUDODOJO_VERSION = "0.4" + +EXPECTED_PSEUDOS = { + f"SSSP/{SSSP_VERSION}/PBE/efficiency", + f"SSSP/{SSSP_VERSION}/PBE/precision", + f"SSSP/{SSSP_VERSION}/PBEsol/efficiency", + f"SSSP/{SSSP_VERSION}/PBEsol/precision", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/SR/standard/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/SR/standard/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/SR/stringent/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/SR/stringent/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/FR/standard/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/FR/standard/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBE/FR/stringent/upf", + f"PseudoDojo/{PSEUDODOJO_VERSION}/PBEsol/FR/stringent/upf", +} + + +FN_LOCKFILE = Path.home().joinpath(".install-sssp.lock") + + +@dataclass +class PseudoFamily: + """The dataclass to deal with pseudo family strings. + + Attributes: + library: the library name of the pseudo family, e.g. SSSP or PseudoDojo. + cmd_library_name: the sub command name used in aiida-pseudo command line. + version: the version of the pseudo family, e.g. 1.2 + functional: the functional of the pseudo family, e.g. PBE, PBEsol. + accuracy: the accuracy of the pseudo family, which is protocol in aiida-pseudo, e.g. efficiency, precision, standard, stringent. + relativistic: the relativistic treatment of the pseudo family, e.g. SR, FR. + file_type: the file type of the pseudo family, e.g. upf, psml, currently only used for PseudoDojo. + """ + + library: str + version: str + functional: str + accuracy: str + cmd_library_name: str = field(init=False) + relativistic: str | None = None + file_type: str | None = None + + def __post_init__(self): + """Post init operations and checks.""" + if self.library == "SSSP": + self.cmd_library_name = "sssp" + elif self.library == "PseudoDojo": + self.cmd_library_name = "pseudo-dojo" + else: + raise ValueError(f"Unknown pseudo library {self.library}") + + @classmethod + def from_string(cls, pseudo_family_string: str) -> PseudoFamily: + """Initialize from a pseudo family string.""" + # We support two pseudo families: SSSP and PseudoDojo + # They are formatted as follows: + # SSSP: SSSP/// + # PseudoDojo: PseudoDojo///// + # where is either 'SR' or 'FR' and is either 'upf' or 'psml' + # Before we unify the format of family strings, the conditions below are necessary + # to distinguish between the two families + library = pseudo_family_string.split("/")[0] + if library == "SSSP": + version, functional, accuracy = pseudo_family_string.split("/")[1:] + relativistic = None + file_type = None + elif library == "PseudoDojo": + ( + version, + functional, + relativistic, + accuracy, + file_type, + ) = pseudo_family_string.split("/")[1:] + else: + raise ValueError( + f"Not able to parse valid library name from {pseudo_family_string}" + ) + + return cls( + library=library, + version=version, + functional=functional, + accuracy=accuracy, + relativistic=relativistic, + file_type=file_type, + ) + + +def pseudos_to_install() -> set[str]: + """Query the database and return the list of pseudopotentials that are not installed.""" + qb = QueryBuilder() + qb.append( + PseudoPotentialFamily, + filters={ + "or": [ + {"label": {"like": "SSSP/%"}}, + {"label": {"like": "PseudoDojo/%"}}, + ] + }, + project="label", + ) + labels = set(qb.all(flat=True)) + return EXPECTED_PSEUDOS - labels + + +def _construct_cmd( + pseudo_family_string: str, download_only: bool = False, cwd: Path | None = None +) -> list: + """Construct the command for installation of pseudopotentials. + + If ``cwd`` is not None, and ``download_only`` is True the, only download the + pseudopotential files to the ``cwd`` folder. + If ``download_only`` is False and ``cwd`` is not None, the the pseudos will be installed from the ``cwd`` where the pseudos are downloaded to. + + NOTE: download_only has nothing to do with cwd, it will not download the pseudos to cwd if cwd is specified. + The control to download to cwd is in the ``_install_pseudos`` function below. + """ + pseudo_family = PseudoFamily.from_string(pseudo_family_string) + + # the library used in command line is lowercase + # e.g. SSSP -> sssp and PseudoDojo -> pseudo-dojo + library = pseudo_family.cmd_library_name + version = pseudo_family.version + functional = pseudo_family.functional + accuracy = pseudo_family.accuracy + cmd = [ + "aiida-pseudo", + "install", + library, + "--functional", + functional, + "--version", + version, + "-p", # p for protocol which is the accuracy of the library + accuracy, + ] + + # extra arguments for PseudoDojo + if library == "pseudo-dojo": + relativistic = pseudo_family.relativistic + file_type = pseudo_family.file_type + cmd.extend( + [ + "--relativistic", + relativistic, + "--pseudo-format", + file_type, + ] + ) + + if download_only: + cmd.append("--download-only") + + # if cwd source folder specified, then install the pseudos from the folder + # download file name is replace `/` with `_` of the pseudo family string with `.aiida_pseudo` extension + if not download_only and cwd is not None: + file_path = cwd / f"{pseudo_family_string.replace('/', '_')}.aiida_pseudo" + if file_path.exists(): + cmd.extend(["--from-download", str(file_path)]) + + return cmd + + +def run_cmd(cmd: list, env: dict | None = None, cwd: Path | None = None): + """Run the command with specific env in the workdir specified.""" + run(cmd, env=env, cwd=cwd, capture_output=True, check=True) + + +def _install_pseudos( + pseudo_families: set[str], download_only: bool = False, cwd: Path | None = None +) -> Iterable[float]: + """Go through the list of pseudo families and install them.""" + env = os.environ.copy() + env["PATH"] = f"{env['PATH']}:{Path.home() / '.local' / 'bin'}" + + mult = 1.0 / len(pseudo_families) + yield mult * 0 + for i, pseudo_family in enumerate(pseudo_families): + cmd = _construct_cmd(pseudo_family, download_only, cwd=cwd) + + run_cmd(cmd, env=env, cwd=cwd) + + yield mult * (i + 1) + + +def install( + download_only: bool = False, cwd: Path | None = None +) -> Iterable[tuple[str, float]]: + yield "Checking installation status...", 0.1 + try: + with FileLock(FN_LOCKFILE, timeout=5): + if len(pseudos := pseudos_to_install()) > 0: + yield "Installing...", 0.1 + for progress in _install_pseudos(pseudos, download_only, cwd): + yield "Installing...", progress + + except Timeout: + # Assume that the installation was triggered by a different process. + from aiidalab_qe.common.widgets import ProgressBar + + yield ( + "Installation was already started elsewhere, waiting for it to finish...", + ProgressBar.AnimationRate(1.0), + ) + with FileLock(FN_LOCKFILE, timeout=300): + if len(pseudos_to_install()) > 0: + raise RuntimeError( + "Installation process did not finish in the expected time." + ) from None diff --git a/tests/conftest.py b/tests/conftest.py index b7c83a187..6c3e98e7d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,7 +5,7 @@ import tempfile import pytest -from aiidalab_qe.common.setup_pseudos import SSSP_VERSION +from aiidalab_qe.setup.pseudos import SSSP_VERSION from aiida import orm diff --git a/tests/test_cli.py b/tests/test_cli.py index 91bb0668f..d3076fe2c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -24,7 +24,7 @@ def test_download_and_install_pseudos(tmp_path, aiida_profile, monkeypatch): Note: this test is slow, it takes about ~30 seconds to run. """ - from aiidalab_qe.common.setup_pseudos import ( + from aiidalab_qe.setup.pseudos import ( PSEUDODOJO_VERSION, SSSP_VERSION, pseudos_to_install, @@ -39,7 +39,7 @@ def test_download_and_install_pseudos(tmp_path, aiida_profile, monkeypatch): } # mock the EXPECTED_PSEUDOS monkeypatch.setattr( - "aiidalab_qe.common.setup_pseudos.EXPECTED_PSEUDOS", + "aiidalab_qe.setup.pseudos.EXPECTED_PSEUDOS", MOCK_EXPECTED_PSEUDOS, ) diff --git a/tests/test_configure.py b/tests/test_configure.py index 0af35c976..6274e0df2 100644 --- a/tests/test_configure.py +++ b/tests/test_configure.py @@ -1,4 +1,4 @@ -from aiidalab_qe.common.setup_pseudos import PSEUDODOJO_VERSION, SSSP_VERSION +from aiidalab_qe.setup.pseudos import PSEUDODOJO_VERSION, SSSP_VERSION def test_protocol(): diff --git a/tests/test_pseudo.py b/tests/test_pseudo.py index a85c34e86..4aa971922 100644 --- a/tests/test_pseudo.py +++ b/tests/test_pseudo.py @@ -1,5 +1,5 @@ import pytest -from aiidalab_qe.common.setup_pseudos import ( +from aiidalab_qe.setup.pseudos import ( PSEUDODOJO_VERSION, SSSP_VERSION, _construct_cmd, @@ -11,7 +11,7 @@ def test_setup_pseudos_cmd(tmp_path): - """Test _construct_cmd function in setup_pseudos.py.""" + """Test _construct_cmd function in setup.pseudos""" # SSSP family pseudo_family = f"SSSP/{SSSP_VERSION}/PBE/efficiency" From 3ce7d18d1534f87e9aa90ceae4fcc85ebc878bab Mon Sep 17 00:00:00 2001 From: Peter Gillespie <55498719+PNOGillespie@users.noreply.github.com> Date: Mon, 19 Aug 2024 15:21:49 +0100 Subject: [PATCH 122/166] XAS/XPS: Fix Bug Caused by VdW Module (#786) This PR forces core-hole SCF calculation steps in the XPS and XAS plugins not to use VdW corrections of any type, keeping any such setting for the relaxed step. Since the VdW correction only affects the total energy/forces and doesn't affect the electronic structure, simply removing the term from the core-hole SCF calculation solves the issue without any downsides. --- src/aiidalab_qe/plugins/xas/workchain.py | 4 ++++ src/aiidalab_qe/plugins/xps/workchain.py | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/aiidalab_qe/plugins/xas/workchain.py b/src/aiidalab_qe/plugins/xas/workchain.py index 07f51bfda..b195a441a 100644 --- a/src/aiidalab_qe/plugins/xas/workchain.py +++ b/src/aiidalab_qe/plugins/xas/workchain.py @@ -85,6 +85,10 @@ def get_builder(codes, structure, parameters, **kwargs): } } + # Ensure that VdW corrections are not applied for the core-hole SCF calculation + # Required to resolve issue #765 (https://github.com/aiidalab/aiidalab-qe/issues/765) + overrides["core"]["scf"]["pw"]["parameters"]["SYSTEM"]["vdw_corr"] = "none" + builder = XspectraCrystalWorkChain.get_builder_from_protocol( pw_code=pw_code, xs_code=xs_code, diff --git a/src/aiidalab_qe/plugins/xps/workchain.py b/src/aiidalab_qe/plugins/xps/workchain.py index f0a63a2ac..06379b99c 100644 --- a/src/aiidalab_qe/plugins/xps/workchain.py +++ b/src/aiidalab_qe/plugins/xps/workchain.py @@ -79,6 +79,10 @@ def get_builder(codes, structure, parameters, **kwargs): }, "ch_scf": overrides_ch_scf, } + # Ensure that VdW corrections are not applied for the core-hole SCF calculation + # Required to resolve issue #765 (https://github.com/aiidalab/aiidalab-qe/issues/765) + overrides["ch_scf"]["pw"]["parameters"]["SYSTEM"]["vdw_corr"] = "none" + builder = XpsWorkChain.get_builder_from_protocol( code=pw_code, structure=structure, From b9cea17ce1ed5001b3f1617faea03fa73efcf10b Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Wed, 21 Aug 2024 19:13:32 +0100 Subject: [PATCH 123/166] Test with aiida-core=2.6.1 and python 3.11 (#760) * Update links in README * Collect coverage only for aiida-core=2.3 runs * Report pytest timings * Filter warnings as in AWB * Bump pytest and pytest-cov * bump uv version * Bump uv and ruff versions --- .github/workflows/ci.yml | 15 ++++++++------- .pre-commit-config.yaml | 2 +- README.md | 4 ++-- pyproject.toml | 12 +++++++++++- qe.ipynb | 4 ++-- setup.cfg | 4 ++-- tests/configuration/test_advanced.py | 3 +-- tests/conftest.py | 5 ++--- tests/test_cli.py | 2 +- tests/test_plugins_bands.py | 1 + tests/test_plugins_electronic_structure.py | 4 ++-- tests/test_plugins_pdos.py | 1 + tests/test_plugins_xps.py | 2 +- tests/test_pseudo.py | 4 ++-- tests/test_result.py | 3 ++- 15 files changed, 39 insertions(+), 27 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e727c0878..d4e533255 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,6 +13,7 @@ concurrency: env: FORCE_COLOR: 1 + UV_VERSION: 0.3.0 jobs: @@ -20,9 +21,8 @@ jobs: strategy: matrix: - tag: [latest] - python-version: ['3.9', '3.10'] - aiida-core-version: [2.3, 2.5] + python-version: ['3.9', '3.11'] + aiida-core-version: ['2.3', '2.6'] fail-fast: false runs-on: ubuntu-latest @@ -45,15 +45,16 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install uv - run: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/uv/releases/download/0.2.13/uv-installer.sh | sh + run: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/uv/releases/download/${{ env.UV_VERSION }}/uv-installer.sh | sh - name: Install package run: uv pip install --system -e .[dev] aiida-core==${{ matrix.aiida-core-version }} - name: Run pytest - run: pytest -v tests --cov=aiidalab_qe - env: - TAG: ${{ matrix.tag }} + # Only collect code coverage with aiida-core=2.3, to speed up tests + # with higher aiida versions that for some reason run slower, see: + # https://github.com/aiidalab/aiidalab-qe/issues/766 + run: pytest -v tests ${{ matrix.aiida-core-version == '2.3' && '--cov=aiidalab_qe' || '' }} - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v4 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 658562e09..7a5a29698 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,7 +30,7 @@ repos: - id: nbstripout - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.5.5 + rev: v0.6.1 hooks: - id: ruff types_or: [python, pyi, jupyter] diff --git a/README.md b/README.md index 59eca0b83..9172dd71e 100644 --- a/README.md +++ b/README.md @@ -71,9 +71,9 @@ Additional notes: ## Acknowledgements We acknowledge support from: * the European Union\'s Horizon 2020 research and innovation programme (Grant No. 957189, [project BIG-MAP](https://www.big-map.eu)). -* the [MARVEL National Centre for Competency in Research]() funded by the [Swiss National Science Foundation](). +* the [MARVEL National Centre for Competency in Research](https://nccr-marvel.ch/) funded by the [Swiss National Science Foundation](https://www.snf.ch/en). * the MARKETPLACE project funded by [Horizon 2020](https://ec.europa.eu/programmes/horizon2020/) under the H2020-NMBP-25-2017 call (Grant No. 760173). -* the [MaX European Centre of Excellence]() funded by the Horizon 2020 EINFRA-5 program (Grant No. 676598). +* the [MaX European Centre of Excellence](https://www.max-centre.eu/) funded by the Horizon 2020 EINFRA-5 program (Grant No. 676598).
    MARVEL diff --git a/pyproject.toml b/pyproject.toml index dd0525383..fc5478f42 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,12 +5,22 @@ requires = [ ] build-backend = "setuptools.build_meta" +[tool.pytest.ini_options] +addopts = '--strict-config --strict-markers --durations=30 --durations-min=1 -ra' +filterwarnings = [ + 'ignore:Object of type .* not in session, .* operation along .* will not proceed:', + 'ignore:Creating AiiDA configuration:UserWarning:', + 'ignore:metadata.*traitlets.traitlets.Unicode object:DeprecationWarning:', + # For some reason we get this error, see + # https://github.com/aiidalab/aiidalab-widgets-base/issues/551 + 'ignore:Exception ignored in:pytest.PytestUnraisableExceptionWarning:_pytest', +] + [tool.ruff] line-length = 88 show-fixes = true output-format = "full" target-version = "py39" -extend-include = ["*.ipynb"] [tool.ruff.lint] ignore = ["E501", "E402", "TRY003", "RUF012", "N806"] diff --git a/qe.ipynb b/qe.ipynb index cac6b0014..bd76c667e 100644 --- a/qe.ipynb +++ b/qe.ipynb @@ -42,12 +42,12 @@ "from datetime import datetime\n", "\n", "import ipywidgets as ipw\n", - "from aiidalab_qe.app import App, static\n", - "from aiidalab_qe.version import __version__\n", "from importlib_resources import files\n", "from IPython.display import display\n", "from jinja2 import Environment\n", "\n", + "from aiidalab_qe.app import App, static\n", + "from aiidalab_qe.version import __version__\n", "from aiidalab_widgets_base.bug_report import (\n", " install_create_github_issue_exception_handler,\n", ")" diff --git a/setup.cfg b/setup.cfg index 43eef8f43..ebab1ee38 100644 --- a/setup.cfg +++ b/setup.cfg @@ -40,10 +40,10 @@ where = src dev = bumpver~=2023.1124 pre-commit~=3.2 - pytest~=6.2 + pytest~=7.4 pytest-regressions~=2.2 pgtest==1.3.1 - pytest-cov~=4.0 + pytest-cov~=5.0 [options.package_data] aiidalab_qe.app.parameters = qeapp.yaml diff --git a/tests/configuration/test_advanced.py b/tests/configuration/test_advanced.py index 800436bd7..7891db223 100644 --- a/tests/configuration/test_advanced.py +++ b/tests/configuration/test_advanced.py @@ -120,9 +120,8 @@ def test_advanced_tot_charge_settings(): def test_advanced_kpoints_mesh(): """Test Mesh Grid HTML widget.""" - from aiidalab_qe.app.configuration.advanced import AdvancedSettings - from aiida import orm + from aiidalab_qe.app.configuration.advanced import AdvancedSettings w = AdvancedSettings() diff --git a/tests/conftest.py b/tests/conftest.py index 6c3e98e7d..316445d32 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,9 +5,9 @@ import tempfile import pytest -from aiidalab_qe.setup.pseudos import SSSP_VERSION from aiida import orm +from aiidalab_qe.setup.pseudos import SSSP_VERSION pytest_plugins = ["aiida.manage.tests.pytest_fixtures"] @@ -630,12 +630,11 @@ def _generate_qeapp_workchain( ): from copy import deepcopy + from aiida.orm.utils.serialize import serialize from aiidalab_qe.app.configuration import ConfigureQeAppWorkChainStep from aiidalab_qe.app.submission import SubmitQeAppWorkChainStep from aiidalab_qe.workflows import QeAppWorkChain - from aiida.orm.utils.serialize import serialize - # Step 1: select structure from example s1 = app.structure_step if structure is None: diff --git a/tests/test_cli.py b/tests/test_cli.py index d3076fe2c..93cb52229 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,9 +1,9 @@ import time -import aiidalab_qe.__main__ as cli from click.testing import CliRunner, Result import aiida +import aiidalab_qe.__main__ as cli # To learn more about testing click applications, see: https://click.palletsprojects.com/en/8.1.x/testing/ diff --git a/tests/test_plugins_bands.py b/tests/test_plugins_bands.py index b3c2a9dc8..aaa34225a 100644 --- a/tests/test_plugins_bands.py +++ b/tests/test_plugins_bands.py @@ -4,6 +4,7 @@ @pytest.mark.usefixtures("sssp") def test_result(generate_qeapp_workchain): import plotly.graph_objects as go + from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.plugins.bands.result import Result diff --git a/tests/test_plugins_electronic_structure.py b/tests/test_plugins_electronic_structure.py index 271adfd1b..c64c4e778 100644 --- a/tests/test_plugins_electronic_structure.py +++ b/tests/test_plugins_electronic_structure.py @@ -1,12 +1,12 @@ def test_electronic_structure(generate_qeapp_workchain): """Test the electronic structure tab.""" import plotly.graph_objects as go + + from aiida import engine from aiidalab_qe.app.result.workchain_viewer import WorkChainViewer from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.plugins.electronic_structure.result import Result - from aiida import engine - wkchain = generate_qeapp_workchain() wkchain.node.set_exit_status(0) wkchain.node.set_process_state(engine.ProcessState.FINISHED) diff --git a/tests/test_plugins_pdos.py b/tests/test_plugins_pdos.py index 426393694..3fda29b76 100644 --- a/tests/test_plugins_pdos.py +++ b/tests/test_plugins_pdos.py @@ -4,6 +4,7 @@ @pytest.mark.usefixtures("sssp") def test_result(generate_qeapp_workchain): import plotly.graph_objects as go + from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.plugins.pdos.result import Result diff --git a/tests/test_plugins_xps.py b/tests/test_plugins_xps.py index 8f15c3b80..91e0633a5 100644 --- a/tests/test_plugins_xps.py +++ b/tests/test_plugins_xps.py @@ -5,10 +5,10 @@ def test_settings(): """Test the settings of the xps app.""" - from aiidalab_qe.app.configuration import ConfigureQeAppWorkChainStep from ase.build import molecule from aiida.orm import StructureData + from aiidalab_qe.app.configuration import ConfigureQeAppWorkChainStep configure_step = ConfigureQeAppWorkChainStep() # set the input structure diff --git a/tests/test_pseudo.py b/tests/test_pseudo.py index 4aa971922..ce2481928 100644 --- a/tests/test_pseudo.py +++ b/tests/test_pseudo.py @@ -1,4 +1,6 @@ import pytest + +from aiida import orm from aiidalab_qe.setup.pseudos import ( PSEUDODOJO_VERSION, SSSP_VERSION, @@ -7,8 +9,6 @@ pseudos_to_install, ) -from aiida import orm - def test_setup_pseudos_cmd(tmp_path): """Test _construct_cmd function in setup.pseudos""" diff --git a/tests/test_result.py b/tests/test_result.py index 9deb51f0a..c6e087d17 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -43,9 +43,10 @@ def test_summary_report_advanced_settings(data_regression, generate_qeapp_workch def test_summary_view(generate_qeapp_workchain): """Test the report html can be properly generated.""" - from aiidalab_qe.app.result.summary_viewer import SummaryView from bs4 import BeautifulSoup + from aiidalab_qe.app.result.summary_viewer import SummaryView + wkchain = generate_qeapp_workchain() viewer = SummaryView(wkchain.node) report_html = viewer.report_html From 772878b4d55299ded8e2f48863385885ad948f7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 20:27:58 +0200 Subject: [PATCH 124/166] Bump urllib3 from 2.0.7 to 2.2.2 in /docs (#788) Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.0.7 to 2.2.2. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.0.7...2.2.2) --- updated-dependencies: - dependency-name: urllib3 dependency-type: indirect ... --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index ad92937b8..8c4e9752e 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -70,7 +70,7 @@ sphinxcontrib-serializinghtml==1.1.5 # via sphinx typing-extensions==4.8.0 # via pydata-sphinx-theme -urllib3==2.0.7 +urllib3==2.2.2 # via requests zipp==3.19.1 # via importlib-metadata From e492404382ca84aec3b3e8a2f16e1905ba3e2924 Mon Sep 17 00:00:00 2001 From: Edan Bainglass <45081142+edan-bainglass@users.noreply.github.com> Date: Thu, 5 Sep 2024 16:51:44 +0200 Subject: [PATCH 125/166] Reorganize `static` folder and add pre-loaded stylesheets (#772) This PR reorganizes the static folder with dedicated subfolders for templates and styles. The styles folder holds stylesheets that are automatically loaded (using a new `aiidalab-widgets-base` utility function) in the main notebook. --- .gitignore | 2 +- qe.ipynb | 18 +++++++++++++++--- setup.cfg | 5 +++-- src/aiidalab_qe/app/result/summary_viewer.py | 8 ++++---- src/aiidalab_qe/app/result/workchain_viewer.py | 8 ++++---- src/aiidalab_qe/app/static/styles/README.md | 13 +++++++++++++ src/aiidalab_qe/app/static/styles/__init__.py | 0 src/aiidalab_qe/app/static/styles/custom.css | 8 ++++++++ .../app/static/{ => styles}/style.css | 0 .../app/static/templates/__init__.py | 0 .../app/static/{ => templates}/welcome.jinja | 0 .../{ => templates}/workflow_failure.jinja | 0 .../{ => templates}/workflow_summary.jinja | 0 13 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 src/aiidalab_qe/app/static/styles/README.md create mode 100644 src/aiidalab_qe/app/static/styles/__init__.py create mode 100644 src/aiidalab_qe/app/static/styles/custom.css rename src/aiidalab_qe/app/static/{ => styles}/style.css (100%) create mode 100644 src/aiidalab_qe/app/static/templates/__init__.py rename src/aiidalab_qe/app/static/{ => templates}/welcome.jinja (100%) rename src/aiidalab_qe/app/static/{ => templates}/workflow_failure.jinja (100%) rename src/aiidalab_qe/app/static/{ => templates}/workflow_summary.jinja (100%) diff --git a/.gitignore b/.gitignore index a5965059b..740d7b7a3 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ build/ export/ .do-not-setup-on-localhost - +.mypy_cache/ # Sphinx documentation docs/html diff --git a/qe.ipynb b/qe.ipynb index bd76c667e..7d8254bd7 100644 --- a/qe.ipynb +++ b/qe.ipynb @@ -24,6 +24,17 @@ "load_profile();" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from aiidalab_widgets_base.utils.loaders import load_css\n", + "\n", + "load_css(css_path=\"src/aiidalab_qe/app/static/styles\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -46,7 +57,8 @@ "from IPython.display import display\n", "from jinja2 import Environment\n", "\n", - "from aiidalab_qe.app import App, static\n", + "from aiidalab_qe.app import App\n", + "from aiidalab_qe.app.static import styles, templates\n", "from aiidalab_qe.version import __version__\n", "from aiidalab_widgets_base.bug_report import (\n", " install_create_github_issue_exception_handler,\n", @@ -61,8 +73,8 @@ "source": [ "env = Environment()\n", "\n", - "template = files(static).joinpath(\"welcome.jinja\").read_text()\n", - "style = files(static).joinpath(\"style.css\").read_text()\n", + "template = files(templates).joinpath(\"welcome.jinja\").read_text()\n", + "style = files(styles).joinpath(\"style.css\").read_text()\n", "welcome_message = ipw.HTML(env.from_string(template).render(style=style))\n", "current_year = datetime.now().year\n", "footer = ipw.HTML(\n", diff --git a/setup.cfg b/setup.cfg index ebab1ee38..96b30824d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -27,7 +27,7 @@ install_requires = aiida-core~=2.2,<3 Jinja2~=3.0 aiida-quantumespresso~=4.6 - aiidalab-widgets-base[optimade]~=2.2.0,<2.4.0 + aiidalab-widgets-base[optimade]==2.3.0a2 aiida-pseudo~=1.4 filelock~=3.8 importlib-resources~=5.2 @@ -47,7 +47,8 @@ dev = [options.package_data] aiidalab_qe.app.parameters = qeapp.yaml -aiidalab_qe.app.static = * +aiidalab_qe.app.static.styles = *.css +aiidalab_qe.app.static.templates = *.jinja aiidalab_qe.app.structure.examples = * aiidalab_qe.plugins.xas = pseudo_toc.yaml diff --git a/src/aiidalab_qe/app/result/summary_viewer.py b/src/aiidalab_qe/app/result/summary_viewer.py index 9524ebe27..fca5db6a3 100644 --- a/src/aiidalab_qe/app/result/summary_viewer.py +++ b/src/aiidalab_qe/app/result/summary_viewer.py @@ -154,11 +154,11 @@ def _generate_report_html(report): """Read from the bulider parameters and generate a html for reporting the inputs for the `QeAppWorkChain`. """ - from importlib import resources + from importlib.resources import files from jinja2 import Environment - from aiidalab_qe.app import static + from aiidalab_qe.app.static import styles, templates def _fmt_yes_no(truthy): return "Yes" if truthy else "No" @@ -169,8 +169,8 @@ def _fmt_yes_no(truthy): "fmt_yes_no": _fmt_yes_no, } ) - template = resources.read_text(static, "workflow_summary.jinja") - style = resources.read_text(static, "style.css") + template = files(templates).joinpath("workflow_summary.jinja").read_text() + style = files(styles).joinpath("style.css").read_text() report = {key: value for key, value in report.items() if value is not None} return env.from_string(template).render(style=style, **report) diff --git a/src/aiidalab_qe/app/result/workchain_viewer.py b/src/aiidalab_qe/app/result/workchain_viewer.py index 34ed75dc9..e0de4de48 100644 --- a/src/aiidalab_qe/app/result/workchain_viewer.py +++ b/src/aiidalab_qe/app/result/workchain_viewer.py @@ -1,6 +1,6 @@ import shutil import typing as t -from importlib import resources +from importlib.resources import files from pathlib import Path from tempfile import TemporaryDirectory @@ -14,7 +14,7 @@ from aiida.cmdline.utils.common import get_workchain_report from aiida.common import LinkType from aiida.orm.utils.serialize import deserialize_unsafe -from aiidalab_qe.app import static +from aiidalab_qe.app.static import styles, templates from aiidalab_qe.app.utils import get_entry_items from aiidalab_widgets_base import ProcessMonitor, register_viewer_widget from aiidalab_widgets_base.viewers import StructureDataViewer @@ -175,8 +175,8 @@ def __init__(self, node, export_dir=None, **kwargs): ) final_calcjob = self._get_final_calcjob(node) env = Environment() - template = resources.read_text(static, "workflow_failure.jinja") - style = resources.read_text(static, "style.css") + template = files(templates).joinpath("workflow_failure.jinja").read_text() + style = files(styles).joinpath("style.css").read_text() output = ipw.HTML( env.from_string(template).render( style=style, diff --git a/src/aiidalab_qe/app/static/styles/README.md b/src/aiidalab_qe/app/static/styles/README.md new file mode 100644 index 000000000..2dd79ba7c --- /dev/null +++ b/src/aiidalab_qe/app/static/styles/README.md @@ -0,0 +1,13 @@ +# Stylesheets for the Quantum ESPRESSO app + +This folder contains `css` stylesheets. These can be loaded from the styles folder using + +```python +from aiidalab_widgets_base.utils.loaders import load_css + +load_css(css_path="src/aiidalab_qe/app/static/styles") # load all stylesheets in the styles folder + +# or + +load_css(css_path="src/aiidalab_qe/app/static/styles/.css") # load a single stylesheet +``` diff --git a/src/aiidalab_qe/app/static/styles/__init__.py b/src/aiidalab_qe/app/static/styles/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/aiidalab_qe/app/static/styles/custom.css b/src/aiidalab_qe/app/static/styles/custom.css new file mode 100644 index 000000000..24a625467 --- /dev/null +++ b/src/aiidalab_qe/app/static/styles/custom.css @@ -0,0 +1,8 @@ +/* + Override Jupyter width limitation to + make apps take full notebook width +*/ +.output_subarea { + max-width: none !important; +} +/* end override */ diff --git a/src/aiidalab_qe/app/static/style.css b/src/aiidalab_qe/app/static/styles/style.css similarity index 100% rename from src/aiidalab_qe/app/static/style.css rename to src/aiidalab_qe/app/static/styles/style.css diff --git a/src/aiidalab_qe/app/static/templates/__init__.py b/src/aiidalab_qe/app/static/templates/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/aiidalab_qe/app/static/welcome.jinja b/src/aiidalab_qe/app/static/templates/welcome.jinja similarity index 100% rename from src/aiidalab_qe/app/static/welcome.jinja rename to src/aiidalab_qe/app/static/templates/welcome.jinja diff --git a/src/aiidalab_qe/app/static/workflow_failure.jinja b/src/aiidalab_qe/app/static/templates/workflow_failure.jinja similarity index 100% rename from src/aiidalab_qe/app/static/workflow_failure.jinja rename to src/aiidalab_qe/app/static/templates/workflow_failure.jinja diff --git a/src/aiidalab_qe/app/static/workflow_summary.jinja b/src/aiidalab_qe/app/static/templates/workflow_summary.jinja similarity index 100% rename from src/aiidalab_qe/app/static/workflow_summary.jinja rename to src/aiidalab_qe/app/static/templates/workflow_summary.jinja From 2c22abb49b6cc7fdb75b08506698122d2b917696 Mon Sep 17 00:00:00 2001 From: Edan Bainglass <45081142+edan-bainglass@users.noreply.github.com> Date: Tue, 17 Sep 2024 11:15:46 +0200 Subject: [PATCH 126/166] Redesign header with logo, toggled info sections, etc. (#751) This PR refactors the main notebook as follows: - Much of the notebook is refactored as an `AppWrapper` component holding the banner, main, and footer components - The banner component (used to be the welcome message) is redesigned as follows: - App logo (same as documentation logo) and subtitle - Toggle buttons triggering an info box optionally showing one of the following: - Guide section - the old welcome page plus links to online docs, tutorials, etc. - About section - general information about the app and acknowledgements - The actual app is now injected from the notebook into the main component. - The footer component showing copyrights and version stays at the bottom of the page. The PR also introduces the use of CSS, loading custom stylesheets in the notebook via the AWB CSS loader utility (aiidalab/aiidalab-widgets-base#624) --- qe.ipynb | 67 +++---- src/aiidalab_qe/app/__init__.py | 6 - src/aiidalab_qe/app/static/styles/custom.css | 40 ++++ src/aiidalab_qe/app/static/styles/infobox.css | 15 ++ .../app/static/templates/about.jinja | 10 + .../app/static/templates/guide.jinja | 42 ++++ .../app/static/templates/welcome.jinja | 28 --- .../static/templates/workflow_failure.jinja | 6 - .../static/templates/workflow_summary.jinja | 6 - src/aiidalab_qe/app/wrapper.py | 179 ++++++++++++++++++ src/aiidalab_qe/common/infobox.py | 22 +++ tests/test_infobox.py | 16 ++ tests/test_wrapper.py | 64 +++++++ 13 files changed, 423 insertions(+), 78 deletions(-) create mode 100644 src/aiidalab_qe/app/static/styles/infobox.css create mode 100644 src/aiidalab_qe/app/static/templates/about.jinja create mode 100644 src/aiidalab_qe/app/static/templates/guide.jinja delete mode 100644 src/aiidalab_qe/app/static/templates/welcome.jinja create mode 100644 src/aiidalab_qe/app/wrapper.py create mode 100644 src/aiidalab_qe/common/infobox.py create mode 100644 tests/test_infobox.py create mode 100644 tests/test_wrapper.py diff --git a/qe.ipynb b/qe.ipynb index 7d8254bd7..58e173278 100644 --- a/qe.ipynb +++ b/qe.ipynb @@ -47,22 +47,24 @@ "\n", " sys.modules[\"pybel\"] = __import__(\"openbabel\", globals(), locals(), [\"pybel\"]).pybel\n", "except Exception:\n", - " pass\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import display\n", "\n", - "import urllib.parse as urlparse\n", - "from datetime import datetime\n", + "from aiidalab_qe.app.wrapper import AppWrapperContoller, AppWrapperModel, AppWrapperView\n", "\n", - "import ipywidgets as ipw\n", - "from importlib_resources import files\n", - "from IPython.display import display\n", - "from jinja2 import Environment\n", + "model = AppWrapperModel()\n", + "view = AppWrapperView()\n", + "controller = AppWrapperContoller(model, view)\n", "\n", - "from aiidalab_qe.app import App\n", - "from aiidalab_qe.app.static import styles, templates\n", - "from aiidalab_qe.version import __version__\n", - "from aiidalab_widgets_base.bug_report import (\n", - " install_create_github_issue_exception_handler,\n", - ")" + "display(view)" ] }, { @@ -71,37 +73,38 @@ "metadata": {}, "outputs": [], "source": [ - "env = Environment()\n", + "import urllib.parse as urlparse\n", + "\n", + "from aiidalab_qe.app.main import App\n", + "from aiidalab_widgets_base.bug_report import (\n", + " install_create_github_issue_exception_handler,\n", + ")\n", "\n", - "template = files(templates).joinpath(\"welcome.jinja\").read_text()\n", - "style = files(styles).joinpath(\"style.css\").read_text()\n", - "welcome_message = ipw.HTML(env.from_string(template).render(style=style))\n", - "current_year = datetime.now().year\n", - "footer = ipw.HTML(\n", - " f'

    Copyright (c) {current_year} AiiDAlab team  Version: {__version__}

    '\n", + "install_create_github_issue_exception_handler(\n", + " view.output,\n", + " url=\"https://github.com/aiidalab/aiidalab-qe/issues/new\",\n", + " labels=(\"bug\", \"automated-report\"),\n", ")\n", "\n", "url = urlparse.urlsplit(jupyter_notebook_url) # noqa F821\n", "query = urlparse.parse_qs(url.query)\n", "\n", - "\n", "app_with_work_chain_selector = App(qe_auto_setup=True)\n", "# if a pk is provided in the query string, set it as the value of the work_chain_selector\n", "if \"pk\" in query:\n", " pk = int(query[\"pk\"][0])\n", " app_with_work_chain_selector.work_chain_selector.value = pk\n", "\n", - "output = ipw.Output()\n", - "install_create_github_issue_exception_handler(\n", - " output,\n", - " url=\"https://github.com/aiidalab/aiidalab-qe/issues/new\",\n", - " labels=(\"bug\", \"automated-report\"),\n", - ")\n", - "\n", - "with output:\n", - " display(welcome_message, app_with_work_chain_selector, footer)\n", - "\n", - "display(output)" + "view.main.children = [app_with_work_chain_selector]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "controller.enable_toggles()" ] } ], diff --git a/src/aiidalab_qe/app/__init__.py b/src/aiidalab_qe/app/__init__.py index ea2de96ed..8138fc07a 100644 --- a/src/aiidalab_qe/app/__init__.py +++ b/src/aiidalab_qe/app/__init__.py @@ -1,7 +1 @@ """Package for the AiiDAlab QE app.""" - -from .main import App - -__all__ = [ - "App", -] diff --git a/src/aiidalab_qe/app/static/styles/custom.css b/src/aiidalab_qe/app/static/styles/custom.css index 24a625467..0cf6e78a3 100644 --- a/src/aiidalab_qe/app/static/styles/custom.css +++ b/src/aiidalab_qe/app/static/styles/custom.css @@ -6,3 +6,43 @@ max-width: none !important; } /* end override */ + +.app-header { + margin-bottom: 1em; +} + +.logo { + text-align: center; +} + +#subtitle { + text-align: center; + font-style: italic; +} + +.info-toggles { + margin: 0 auto; +} +.info-toggles button { + width: 100px; + margin: 1em 0.5em; +} +.info-toggles button:focus { + outline: none !important; +} + +.guide ol { + list-style: none; +} +.guide p:not(:last-of-type) { + margin-bottom: 0.5em; +} + +#loading { + text-align: center; + font-size: large; +} + +footer { + text-align: right; +} diff --git a/src/aiidalab_qe/app/static/styles/infobox.css b/src/aiidalab_qe/app/static/styles/infobox.css new file mode 100644 index 000000000..a25861e42 --- /dev/null +++ b/src/aiidalab_qe/app/static/styles/infobox.css @@ -0,0 +1,15 @@ +.info-box { + display: none; + margin: 2px; + padding: 1em; + border: 3px solid orangered; + background-color: #ffedcc; + border-radius: 1em; + -webkit-border-radius: 1em; + -moz-border-radius: 1em; + -ms-border-radius: 1em; + -o-border-radius: 1em; +} +.info-box p { + line-height: 24px; +} diff --git a/src/aiidalab_qe/app/static/templates/about.jinja b/src/aiidalab_qe/app/static/templates/about.jinja new file mode 100644 index 000000000..0b617a231 --- /dev/null +++ b/src/aiidalab_qe/app/static/templates/about.jinja @@ -0,0 +1,10 @@ +
    +

    + The Quantum ESPRESSO app + (or QE app for short) is a graphical front end for calculating materials properties using + Quantum ESPRESSO (QE). Each property is calculated by workflows powered by the + AiiDA engine, and maintained in the + aiida-quantumespresso plugin and many other plugins developed by the community. + for AiiDA. +

    +
    diff --git a/src/aiidalab_qe/app/static/templates/guide.jinja b/src/aiidalab_qe/app/static/templates/guide.jinja new file mode 100644 index 000000000..14b10f914 --- /dev/null +++ b/src/aiidalab_qe/app/static/templates/guide.jinja @@ -0,0 +1,42 @@ +
    +

    + The QE app allows you to calculate properties in a simple 4-step process: +

    + +
      +
    1. + 🔍 Step 1: Select the structure you want to run. +
    2. +
    3. + ⚙️ Step 2: Select the properties you are interested in. +
    4. +
    5. + 💻 Step 3: Choose the computational resources you want to run on. +
    6. +
    7. + 🚀 Step 4: Submit your workflow. +
    8. +
    + +

    + New users can go straight to the first step and select their structure. +

    + +

    + Completed workflows can be selected at the top of the app. +

    + +

    + You can also check out the + basic tutorial to get started + with the Quantum ESPRESSO app, or try out the + advanced tutorial to learn + additional features offered by the app. +

    + +

    + For a more in-depth dive into the app's features, please refer to the + how-to guides. +

    +

    +
    diff --git a/src/aiidalab_qe/app/static/templates/welcome.jinja b/src/aiidalab_qe/app/static/templates/welcome.jinja deleted file mode 100644 index cdf8830a3..000000000 --- a/src/aiidalab_qe/app/static/templates/welcome.jinja +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - -
    -

    Welcome to the AiiDAlab Quantum ESPRESSO app! 👋

    - - The Quantum ESPRESSO app (or QE app for short) is a graphical front end for calculating materials properties using Quantum ESPRESSO (QE). - Each property is calculated by workflows powered by the AiiDA engine, and maintained in the Quantum ESPRESSO plugin for AiiDA. - -

    The QE app allows you to calculate properties in a simple 4-step process:

    - -
      -
    1. 🔍 Step 1: Select the structure you want to run.
    2. -
    3. ⚙️ Step 2: Select the properties you are interested in.
    4. -
    5. 💻 Step 3: Choose the computational resources you want to run on.
    6. -
    7. 🚀 Step 4: Submit your workflow.
    8. -
    - -

    New users can go straight to the first step and select their structure. Once you've already run some calculations, you can select the corresponding workflow using the dropdown below.

    -

    Happy computing! 🎉

    -
    - - diff --git a/src/aiidalab_qe/app/static/templates/workflow_failure.jinja b/src/aiidalab_qe/app/static/templates/workflow_failure.jinja index fe4ea7e00..b7adb3a8a 100644 --- a/src/aiidalab_qe/app/static/templates/workflow_failure.jinja +++ b/src/aiidalab_qe/app/static/templates/workflow_failure.jinja @@ -1,9 +1,3 @@ - - - -
    diff --git a/src/aiidalab_qe/app/static/templates/workflow_summary.jinja b/src/aiidalab_qe/app/static/templates/workflow_summary.jinja index 594e46150..01743dca4 100644 --- a/src/aiidalab_qe/app/static/templates/workflow_summary.jinja +++ b/src/aiidalab_qe/app/static/templates/workflow_summary.jinja @@ -1,9 +1,3 @@ - - - -
    diff --git a/src/aiidalab_qe/app/wrapper.py b/src/aiidalab_qe/app/wrapper.py new file mode 100644 index 000000000..5c79ba36d --- /dev/null +++ b/src/aiidalab_qe/app/wrapper.py @@ -0,0 +1,179 @@ +from __future__ import annotations + +import ipywidgets as ipw +import traitlets + + +def without_triggering(toggle: str): + """Decorator to prevent the other toggle from triggering its callback.""" + + def decorator(func): + def wrapper(self, change: dict): + """Toggle off other button without triggering its callback.""" + view: AppWrapperView = self._view + button: ipw.ToggleButton = getattr(view, toggle) + callback = getattr(self, f"_on_{toggle}") + button.unobserve(callback, "value") + button.value = False + func(self, change) + button.observe(callback, "value") + + return wrapper + + return decorator + + +class AppWrapperContoller: + """An MVC controller for `AppWrapper`.""" + + def __init__( + self, + model: AppWrapperModel, + view: AppWrapperView, + ) -> None: + """`AppWrapperController` constructor. + + Parameters + ---------- + `model` : `AppWrapperModel` + The associated model. + `view` : `AppWrapperView` + The associated view. + """ + self._model = model + self._view = view + self._set_event_handlers() + + def enable_toggles(self) -> None: + """Enable the toggle buttons.""" + self._view.guide_toggle.disabled = False + self._view.about_toggle.disabled = False + + @without_triggering("about_toggle") + def _on_guide_toggle(self, change: dict): + """Toggle the guide section.""" + self._view.info_container.children = [self._view.guide] if change["new"] else [] + self._view.info_container.layout.display = "flex" if change["new"] else "none" + + @without_triggering("guide_toggle") + def _on_about_toggle(self, change: dict): + """Toggle the about section.""" + self._view.info_container.children = [self._view.about] if change["new"] else [] + self._view.info_container.layout.display = "flex" if change["new"] else "none" + + def _set_event_handlers(self) -> None: + """Set up event handlers.""" + self._view.guide_toggle.observe(self._on_guide_toggle, "value") + self._view.about_toggle.observe(self._on_about_toggle, "value") + + +class AppWrapperModel(traitlets.HasTraits): + """An MVC model for `AppWrapper`.""" + + def __init__(self): + """`AppWrapperModel` constructor.""" + + +class AppWrapperView(ipw.VBox): + """An MVC view for `AppWrapper`.""" + + def __init__(self) -> None: + """`AppWrapperView` constructor.""" + + ################# LAZY LOADING ################# + + from datetime import datetime + + from importlib_resources import files + from IPython.display import Image, display + from jinja2 import Environment + + from aiidalab_qe.app.static import templates + from aiidalab_qe.common.infobox import InfoBox + from aiidalab_qe.version import __version__ + + ################################################# + + self.output = ipw.Output() + + logo_img = Image( + filename="docs/source/_static/logo.png", + width="700", + ) + logo = ipw.Output() + with logo: + display(logo_img) + logo.add_class("logo") + + subtitle = ipw.HTML("

    🎉 Happy computing 🎉

    ") + + self.guide_toggle = ipw.ToggleButton( + button_style="", + icon="question", + value=False, + description="Guide", + tooltip="Learn how to use the app", + disabled=True, + ) + + self.about_toggle = ipw.ToggleButton( + button_style="", + icon="info", + value=False, + description="About", + tooltip="Learn about the app", + disabled=True, + ) + + info_toggles = ipw.HBox( + children=[ + self.guide_toggle, + self.about_toggle, + ] + ) + info_toggles.add_class("info-toggles") + + env = Environment() + guide_template = files(templates).joinpath("guide.jinja").read_text() + about_template = files(templates).joinpath("about.jinja").read_text() + + self.guide = ipw.HTML(env.from_string(guide_template).render()) + self.about = ipw.HTML(env.from_string(about_template).render()) + + self.info_container = InfoBox() + + header = ipw.VBox( + children=[ + logo, + subtitle, + info_toggles, + self.info_container, + ], + ) + header.add_class("app-header") + + loading = ipw.HTML(""" +
    + Loading the app +
    + """) + + self.main = ipw.VBox(children=[loading]) + + current_year = datetime.now().year + footer = ipw.HTML(f""" +
    + Copyright (c) {current_year} AiiDAlab team
    + Version: {__version__} +
    + """) + + super().__init__( + layout={}, + children=[ + self.output, + header, + self.main, + footer, + ], + ) diff --git a/src/aiidalab_qe/common/infobox.py b/src/aiidalab_qe/common/infobox.py new file mode 100644 index 000000000..86a7eb26b --- /dev/null +++ b/src/aiidalab_qe/common/infobox.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +import ipywidgets as ipw + + +class InfoBox(ipw.VBox): + """The `InfoBox` component is used to provide additional info regarding a widget or an app.""" + + def __init__(self, classes: list[str] | None = None, **kwargs): + """`InfoBox` constructor. + + Parameters + ---------- + `classes` : `list[str]`, optional + One or more CSS classes. + """ + super().__init__(**kwargs) + self.add_class("info-box") + for custom_classes in classes or []: + for custom_class in custom_classes.split(" "): + if custom_class: + self.add_class(custom_class) diff --git a/tests/test_infobox.py b/tests/test_infobox.py new file mode 100644 index 000000000..892335da9 --- /dev/null +++ b/tests/test_infobox.py @@ -0,0 +1,16 @@ +from aiidalab_qe.common.infobox import InfoBox + + +def test_infobox_classes(): + """Test `InfoBox` classes.""" + custom_classes = ["custom-1", "custom-2 custom-3"] + infobox = InfoBox(classes=custom_classes) + assert all( + css_class in infobox._dom_classes + for css_class in ( + "info-box", + "custom-1", + "custom-2", + "custom-3", + ) + ) diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py new file mode 100644 index 000000000..609fa40d8 --- /dev/null +++ b/tests/test_wrapper.py @@ -0,0 +1,64 @@ +from aiidalab_qe.app.wrapper import AppWrapperContoller, AppWrapperModel, AppWrapperView + + +class TestWrapper: + def test_enable_toggles(self): + """Test enable_toggles method.""" + self._instansiate_mvc_components() + assert self.view.guide_toggle.disabled is True + assert self.view.about_toggle.disabled is True + self.controller.enable_toggles() + assert self.view.guide_toggle.disabled is False + assert self.view.about_toggle.disabled is False + + def test_guide_toggle(self): + """Test guide_toggle method.""" + self._instansiate_mvc_components() + self.controller.enable_toggles() + self.controller._on_guide_toggle({"new": True}) + self._assert_guide_is_on() + self.controller._on_guide_toggle({"new": False}) + self._assert_no_guide_info() + + def test_about_toggle(self): + """Test about_toggle method.""" + self._instansiate_mvc_components() + self.controller.enable_toggles() + self.controller._on_about_toggle({"new": True}) + self._assert_about_is_on() + self.controller._on_about_toggle({"new": False}) + self._assert_no_guide_info() + + def test_toggle_switch(self): + """Test toggle_switch method.""" + self._instansiate_mvc_components() + self.controller.enable_toggles() + self._assert_no_guide_info() + self.controller._on_guide_toggle({"new": True}) + self._assert_guide_is_on() + self.controller._on_about_toggle({"new": True}) + self._assert_about_is_on() + self.controller._on_guide_toggle({"new": True}) + self._assert_guide_is_on() + self.controller._on_guide_toggle({"new": False}) + self._assert_no_guide_info() + + def _assert_guide_is_on(self): + """Assert guide is on.""" + assert len(self.view.info_container.children) == 1 + assert self.view.guide in self.view.info_container.children + + def _assert_about_is_on(self): + """Assert about is on.""" + assert len(self.view.info_container.children) == 1 + assert self.view.about in self.view.info_container.children + + def _assert_no_guide_info(self): + """Assert no info is shown.""" + assert len(self.view.info_container.children) == 0 + + def _instansiate_mvc_components(self): + """Instansiate `AppWrapper` MVC components.""" + self.model = AppWrapperModel() + self.view = AppWrapperView() + self.controller = AppWrapperContoller(self.model, self.view) From 95e8f4bcddf16c8fce45e705e323d5e71617fff6 Mon Sep 17 00:00:00 2001 From: Daniel Hollas Date: Wed, 18 Sep 2024 12:30:22 +0100 Subject: [PATCH 127/166] Update full-stack image version - aiida v2.6 (#801) * Update full-stack image version - aiida v2.6 * Update test_verdi_status * Tweak aiidalab_exec fixture * Ignore some warnings * use astral-sh/setup-uv@v1 --- .github/workflows/ci.yml | 5 +++-- Dockerfile | 4 ++-- pyproject.toml | 6 +++++- tests_integration/conftest.py | 4 ++-- tests_integration/test_image.py | 9 ++++++--- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d4e533255..dc01c3400 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,6 @@ concurrency: env: FORCE_COLOR: 1 - UV_VERSION: 0.3.0 jobs: @@ -45,7 +44,9 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install uv - run: curl --proto '=https' --tlsv1.2 -LsSf https://github.com/astral-sh/uv/releases/download/${{ env.UV_VERSION }}/uv-installer.sh | sh + uses: astral-sh/setup-uv@v1 + with: + version: 0.4.7 - name: Install package run: uv pip install --system -e .[dev] aiida-core==${{ matrix.aiida-core-version }} diff --git a/Dockerfile b/Dockerfile index 0d8fdf05d..ff2ae2704 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1 -ARG FULL_STACK_VER=2024.1021 -ARG UV_VER=0.2.27 +ARG FULL_STACK_VER=2024.1022 +ARG UV_VER=0.4.7 ARG QE_VER=7.2 ARG QE_DIR=/opt/conda/envs/quantum-espresso-${QE_VER} diff --git a/pyproject.toml b/pyproject.toml index fc5478f42..616c5ff9b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,12 +8,16 @@ build-backend = "setuptools.build_meta" [tool.pytest.ini_options] addopts = '--strict-config --strict-markers --durations=30 --durations-min=1 -ra' filterwarnings = [ - 'ignore:Object of type .* not in session, .* operation along .* will not proceed:', + # This is needed since SQLAlchemy 2.0, see + # https://github.com/aiidalab/aiidalab-widgets-base/issues/605 + 'ignore:Object of type.*not in session,.*operation along.*will not proceed:', 'ignore:Creating AiiDA configuration:UserWarning:', 'ignore:metadata.*traitlets.traitlets.Unicode object:DeprecationWarning:', # For some reason we get this error, see # https://github.com/aiidalab/aiidalab-widgets-base/issues/551 'ignore:Exception ignored in:pytest.PytestUnraisableExceptionWarning:_pytest', + # This popped up in spglib 2.5. Since we still try to support spglib v1, + "ignore:dict interface.*is deprecated.Use attribute interface:DeprecationWarning:", ] [tool.ruff] diff --git a/tests_integration/conftest.py b/tests_integration/conftest.py index a011bfee7..8c84dd919 100644 --- a/tests_integration/conftest.py +++ b/tests_integration/conftest.py @@ -39,14 +39,14 @@ def execute(command, user=None, workdir=None, **kwargs): opts = f"{opts} --workdir={workdir}" command = f"exec {opts} aiidalab {command}" - return docker_compose.execute(command, **kwargs) + return docker_compose.execute(command, **kwargs).decode().strip() return execute @pytest.fixture(scope="session") def nb_user(aiidalab_exec): - return aiidalab_exec("bash -c 'echo \"${NB_USER}\"'").decode().strip() + return aiidalab_exec("bash -c 'echo \"${NB_USER}\"'") @pytest.fixture(scope="session") diff --git a/tests_integration/test_image.py b/tests_integration/test_image.py index e134df02b..0303ab725 100755 --- a/tests_integration/test_image.py +++ b/tests_integration/test_image.py @@ -12,16 +12,19 @@ def test_notebook_service_available(notebook_service): def test_verdi_status(aiidalab_exec, nb_user): # Check the aiida service is running and connected to RabbitMQ # The notebook_service fixture is needed to wait for the services to be up - output = aiidalab_exec("verdi status", user=nb_user).decode().strip() - assert "Connected to RabbitMQ" in output + output = aiidalab_exec("verdi status", user=nb_user) + for status in ("version", "config", "profile", "storage", "broker", "daemon"): + assert f"✔ {status}" in output + assert "/home/jovyan/.aiida" in output assert "Daemon is running" in output + assert "Unable to connect to broker" not in output @pytest.mark.usefixtures("notebook_service") def test_pseudos_families_are_installed(aiidalab_exec, nb_user): # Check the aiida service is running and connected to RabbitMQ # The notebook_service fixture is needed to wait for the services to be up - output = aiidalab_exec("aiida-pseudo list", user=nb_user).decode().strip() + output = aiidalab_exec("aiida-pseudo list", user=nb_user) assert "SSSP" in output assert "PseudoDojo" in output From 6c7d6b6fb6cf4aa774601e94af468e398c03ddca Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Tue, 24 Sep 2024 14:54:33 +0200 Subject: [PATCH 128/166] Electron MaxStep Widget (#800) * Electron MaxStep Widget --- src/aiidalab_qe/app/configuration/advanced.py | 35 +++++++++++++++++++ tests/conftest.py | 2 ++ tests/test_submit_qe_workchain.py | 5 +++ .../test_create_builder_default.yml | 1 + 4 files changed, 43 insertions(+) diff --git a/src/aiidalab_qe/app/configuration/advanced.py b/src/aiidalab_qe/app/configuration/advanced.py index 343be6134..2793d08e2 100644 --- a/src/aiidalab_qe/app/configuration/advanced.py +++ b/src/aiidalab_qe/app/configuration/advanced.py @@ -209,6 +209,10 @@ def __init__(self, default_protocol=None, **kwargs): (self.etot_conv_thr, "disabled"), lambda override: not override, ) + + # Max electron SCF steps widget + self._create_electron_maxstep_widgets() + # Spin-Orbit calculation self.spin_orbit = ipw.ToggleButtons( options=[ @@ -260,6 +264,8 @@ def __init__(self, default_protocol=None, **kwargs): [self.forc_conv_thr, self.etot_conv_thr, self.scf_conv_thr], layout=ipw.Layout(height="50px", justify_content="flex-start"), ), + # Max electron SCF steps widget + self.electron_maxstep, # smearing setting widget self.smearing, # Kpoints setting widget @@ -279,6 +285,22 @@ def __init__(self, default_protocol=None, **kwargs): # Default settings to trigger the callback self.reset() + def _create_electron_maxstep_widgets(self): + self.electron_maxstep = ipw.BoundedIntText( + min=20, + max=1000, + step=1, + value=80, + description="Max. electron steps:", + style={"description_width": "initial"}, + ) + ipw.dlink( + (self.override, "value"), + (self.electron_maxstep, "disabled"), + lambda override: not override, + ) + self.electron_maxstep.observe(self._callback_value_set, "value") + def set_value_and_step(self, attribute, value): """ Sets the value and adjusts the step based on the order of magnitude of the value. @@ -459,6 +481,11 @@ def get_panel_value(self): self.etot_conv_thr.value ) + # Max electron SCF steps + parameters["pw"]["parameters"]["ELECTRONS"]["electron_maxstep"] = ( + self.electron_maxstep.value + ) + # Spin-Orbit calculation if self.spin_orbit.value == "soc": parameters["pw"]["parameters"]["SYSTEM"]["lspinorb"] = True @@ -542,6 +569,14 @@ def set_panel_value(self, parameters): .get("conv_thr", 0.0) ) + # Max electron SCF steps + self.electron_maxstep.value = ( + parameters.get("pw", {}) + .get("parameters", {}) + .get("ELECTRONS", {}) + .get("electron_maxstep", 80) + ) + # Logic to set the magnetization if parameters.get("initial_magnetic_moments"): self.magnetization._set_magnetization_values( diff --git a/tests/conftest.py b/tests/conftest.py index 316445d32..c65842d28 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -357,6 +357,7 @@ def _submit_app_generator( tot_charge=0.0, vdw_corr="none", initial_magnetic_moments=0.0, + electron_maxstep=80, ): configure_step = app.configure_step # Settings @@ -379,6 +380,7 @@ def _submit_app_generator( configure_step.advanced_settings.magnetization._set_magnetization_values( initial_magnetic_moments ) + configure_step.advanced_settings.electron_maxstep.value = electron_maxstep # mimic the behavior of the smearing widget set up configure_step.advanced_settings.smearing.smearing.value = smearing configure_step.advanced_settings.smearing.degauss.value = degauss diff --git a/tests/test_submit_qe_workchain.py b/tests/test_submit_qe_workchain.py index 140d6a3b7..3f2b7b6aa 100644 --- a/tests/test_submit_qe_workchain.py +++ b/tests/test_submit_qe_workchain.py @@ -58,6 +58,9 @@ def test_create_builder_advanced_settings( -collinear -tot_charge -initial_magnetic_moments + -vdw_corr + -electron_maxstep + -properties: bands, pdos """ app = submit_app_generator( @@ -66,6 +69,7 @@ def test_create_builder_advanced_settings( tot_charge=1.0, vdw_corr="dft-d3bj", initial_magnetic_moments=0.1, + electron_maxstep=100, properties=["bands", "pdos"], ) submit_step = app.submit_step @@ -85,6 +89,7 @@ def test_create_builder_advanced_settings( assert parameters["pw"]["parameters"]["SYSTEM"]["tot_charge"] == 1.0 assert parameters["pw"]["parameters"]["SYSTEM"]["vdw_corr"] == "dft-d3" assert parameters["pw"]["parameters"]["SYSTEM"]["dftd3_version"] == 4 + assert parameters["pw"]["parameters"]["ELECTRONS"]["electron_maxstep"] == 100 # test initial_magnetic_moments set 'starting_magnetization' in pw.in assert ( diff --git a/tests/test_submit_qe_workchain/test_create_builder_default.yml b/tests/test_submit_qe_workchain/test_create_builder_default.yml index d16d0e9f7..ca33c43c9 100644 --- a/tests/test_submit_qe_workchain/test_create_builder_default.yml +++ b/tests/test_submit_qe_workchain/test_create_builder_default.yml @@ -10,6 +10,7 @@ advanced: forc_conv_thr: 0.0001 ELECTRONS: conv_thr: 4.0e-10 + electron_maxstep: 80 SYSTEM: degauss: 0.015 ecutrho: 240.0 From 7e4560714b8b70495e1c0f33c747a4dd82b1457c Mon Sep 17 00:00:00 2001 From: Timo Reents <77727843+t-reents@users.noreply.github.com> Date: Tue, 24 Sep 2024 15:50:51 +0200 Subject: [PATCH 129/166] Add slider to adjust fat bands width (#808) A slider is added to the `BandPdosWidget` to enable the control of the fat bands width. This is necessary as different bandstructures require a different resolution. --- src/aiidalab_qe/common/bandpdoswidget.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/aiidalab_qe/common/bandpdoswidget.py b/src/aiidalab_qe/common/bandpdoswidget.py index d8494577e..c777f7ca8 100644 --- a/src/aiidalab_qe/common/bandpdoswidget.py +++ b/src/aiidalab_qe/common/bandpdoswidget.py @@ -431,7 +431,6 @@ class BandPdosWidget(ipw.VBox): Select the style of plotting the projected density of states.
    """ ) - projected_bands_width = 0.5 def __init__(self, bands=None, pdos=None, **kwargs): if bands is None and pdos is None: @@ -482,6 +481,18 @@ def __init__(self, bands=None, pdos=None, **kwargs): value=False, description="Add `fat bands` projections", ) + self.proj_bands_width_slider = ipw.FloatSlider( + value=0.5, + min=0.01, + max=0.76, + step=0.01, + description="`Fat bands` max width (eV):", + orientation="horizontal", + readout=True, + readout_format=".2f", + style={"description_width": "initial"}, + layout=ipw.Layout(width="380px", visibility="hidden"), + ) # Information for the plot self.pdos_data = self._get_pdos_data() @@ -505,6 +516,7 @@ def __init__(self, bands=None, pdos=None, **kwargs): # If projections are available in the bands data, include the box to plot fat-bands if self.bands_data and "projected_bands" in self.bands_data: pdos_options_list.insert(4, self.project_bands_box) + pdos_options_list.insert(5, self.proj_bands_width_slider) self.pdos_options = ipw.VBox(pdos_options_list) @@ -513,6 +525,7 @@ def __init__(self, bands=None, pdos=None, **kwargs): # Set the event handlers self.download_button.on_click(self.download_data) self.update_plot_button.on_click(self._update_plot) + # self.proj_bands_width_slider.observe(self._update_plot, names='value') super().__init__( children=[ @@ -594,7 +607,7 @@ def _get_bands_data(self): group_tag=self.dos_atoms_group.value, plot_tag=self.dos_plot_group.value, selected_atoms=expanded_selection, - bands_width=self.projected_bands_width, + bands_width=self.proj_bands_width_slider.value, ) return bands return None @@ -622,6 +635,9 @@ def _update_plot(self, _=None): project_bands=self.project_bands_box.value, ).bandspdosfigure self._clear_output_and_display(self.bandsplot_widget) + self.proj_bands_width_slider.layout.visibility = ( + "visible" if self.project_bands_box.value else "hidden" + ) def _clear_output_and_display(self, widget=None): clear_output(wait=True) @@ -675,8 +691,8 @@ def _prepare_projections_to_plot(bands_data, projections, bands_width): for proj in projections[spin]: # Create the upper and lower boundary of the fat bands based on the orbital projections - y_bands_proj_upper = y_bands + bands_width * proj["projections"].T - y_bands_proj_lower = y_bands - bands_width * proj["projections"].T + y_bands_proj_upper = y_bands + bands_width / 2 * proj["projections"].T + y_bands_proj_lower = y_bands - bands_width / 2 * proj["projections"].T # As mentioned above, the bands need to be concatenated with their mirror image # to create the filled areas properly y_bands_mirror = np.hstack( From f9bbbfd6964b63bbaf838412a45b665ed2c364d1 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Thu, 26 Sep 2024 16:46:44 +0200 Subject: [PATCH 130/166] removing text 3D structures only (#828) --- src/aiidalab_qe/app/structure/__init__.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/aiidalab_qe/app/structure/__init__.py b/src/aiidalab_qe/app/structure/__init__.py index 3a9652878..cb5940ccf 100644 --- a/src/aiidalab_qe/app/structure/__init__.py +++ b/src/aiidalab_qe/app/structure/__init__.py @@ -88,9 +88,7 @@ def __init__(self, description=None, **kwargs): description = ipw.HTML( """

    Select a structure from one of the following sources and then click - "Confirm" to go to the next step.

    Currently only three-dimensional structures are - supported. + "Confirm" to go to the next step.

    """ ) self.description = description From 986c0d93ad18af2ee14888d1e1fe40d6d98f5c73 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Wed, 2 Oct 2024 13:17:45 +0200 Subject: [PATCH 131/166] Updating bandspdos widget (#831) Improve Default PDOS zoom/scaling based on values Modification of Update button to Apply Selection Interactive re-plotting after changes in the Dropdown Menus Include a short description of the plot being interactive Add a placeholder for the Selection atom widget Orbital contribution are separated. --- src/aiidalab_qe/common/bandpdoswidget.py | 359 ++++++++++++++++++++++- 1 file changed, 351 insertions(+), 8 deletions(-) diff --git a/src/aiidalab_qe/common/bandpdoswidget.py b/src/aiidalab_qe/common/bandpdoswidget.py index c777f7ca8..8ef9f72da 100644 --- a/src/aiidalab_qe/common/bandpdoswidget.py +++ b/src/aiidalab_qe/common/bandpdoswidget.py @@ -7,6 +7,7 @@ import plotly.graph_objects as go from IPython.display import clear_output, display from plotly.subplots import make_subplots +from pymatgen.core.periodic_table import Element from aiida.orm import ProjectionData from aiidalab_widgets_base.utils import StatusHTML, string_range_to_list @@ -375,6 +376,7 @@ def _customize_combined_layout(self, fig): width=self.SETTINGS["combined_plot_width"], plot_bgcolor="white", ) + self._update_dos_layout(fig) def _customize_layout(self, fig, xaxis, yaxis, row=1, col=1): fig.update_xaxes(patch=xaxis, row=row, col=col) @@ -401,6 +403,92 @@ def _customize_single_layout(self, fig): height=self.SETTINGS[f"{self.plot_type}_plot_height"], width=self.SETTINGS[f"{self.plot_type}_plot_width"], ) + self._update_dos_layout(fig) + + def _update_dos_layout(self, fig): + def update_layout_spin_polarized( + x_data_up, + y_data_up, + x_data_down, + y_data_down, + x_min, + x_max, + update_func, + layout_type, + ): + most_negative_down, max_up = find_max_up_and_down( + x_data_up, y_data_up, x_data_down, y_data_down, x_min, x_max + ) + if layout_type == "layout": + update_func(yaxis={"range": [most_negative_down * 1.10, max_up * 1.10]}) + elif layout_type == "xaxes": + update_func( + patch={"range": [most_negative_down * 1.10, max_up * 1.10]}, + row=1, + col=2, + ) + + def update_layout_non_spin_polarized( + total_dos_xdata, total_dos_ydata, x_min, x_max, update_func, layout_type + ): + max_value = find_max_in_range( + total_dos_xdata, total_dos_ydata, x_min, x_max + ) + if layout_type == "layout": + update_func(yaxis={"range": [0, max_value * 1.10]}) + elif layout_type == "xaxes": + update_func(patch={"range": [0, max_value * 1.10]}, row=1, col=2) + + def get_x_min_max(fermi_energy): + return ( + self.SETTINGS["horizontal_range_pdos"][0] + fermi_energy, + self.SETTINGS["horizontal_range_pdos"][1] + fermi_energy, + ) + + def handle_spin_polarization(fermi_energy, update_func, layout_type): + spin_polarized = "(↑)" in self.pdos_data["dos"][0]["label"] + if not spin_polarized: + total_dos_xdata = self.pdos_data["dos"][0]["x"] + total_dos_ydata = self.pdos_data["dos"][0]["y"] + x_min, x_max = get_x_min_max(fermi_energy) + update_layout_non_spin_polarized( + total_dos_xdata, + total_dos_ydata, + x_min, + x_max, + update_func, + layout_type, + ) + else: + x_data_up = self.pdos_data["dos"][0]["x"] + y_data_up = self.pdos_data["dos"][0]["y"] + x_data_down = self.pdos_data["dos"][1]["x"] + y_data_down = self.pdos_data["dos"][1]["y"] + x_min, x_max = get_x_min_max(fermi_energy) + update_layout_spin_polarized( + x_data_up, + y_data_up, + x_data_down, + y_data_down, + x_min, + x_max, + update_func, + layout_type, + ) + + # PDOS plot type + if self.plot_type == "pdos": + fermi_energy = self.fermi_energy.get( + "fermi_energy" + ) or self.fermi_energy.get("fermi_energy_up") + handle_spin_polarization(fermi_energy, fig.update_layout, "layout") + + # Combined plot type + if self.plot_type == "combined": + fermi_energy = self.fermi_energy.get( + "fermi_energy" + ) or self.fermi_energy.get("fermi_energy_up") + handle_spin_polarization(fermi_energy, fig.update_xaxes, "xaxes") class BandPdosWidget(ipw.VBox): @@ -428,6 +516,8 @@ class BandPdosWidget(ipw.VBox): description = ipw.HTML( """
    + The plot is interactive: you can zoom in and out, as well as move the axes to explore specific regions of interest. +

    Select the style of plotting the projected density of states.
    """ ) @@ -443,7 +533,7 @@ def __init__(self, bands=None, pdos=None, **kwargs): description="Group by:", options=[ ("Kinds", "kinds"), - ("Atoms", "atoms"), + ("Atomic position", "atoms"), ], value="kinds", style={"description_width": "initial"}, @@ -459,13 +549,14 @@ def __init__(self, bands=None, pdos=None, **kwargs): style={"description_width": "initial"}, ) self.selected_atoms = ipw.Text( + placeholder="e.g. 1..5 8 10", description="Select atoms:", value="", style={"description_width": "initial"}, ) self._wrong_syntax = StatusHTML(clear_after=8) self.update_plot_button = ipw.Button( - description="Update Plot", + description="Apply selection", icon="pencil", button_style="primary", disabled=False, @@ -510,8 +601,9 @@ def __init__(self, bands=None, pdos=None, **kwargs): self.description, self.dos_atoms_group, self.dos_plot_group, - ipw.HBox([self.selected_atoms, self._wrong_syntax]), - self.update_plot_button, + ipw.HBox( + [self.selected_atoms, self._wrong_syntax, self.update_plot_button] + ), ] # If projections are available in the bands data, include the box to plot fat-bands if self.bands_data and "projected_bands" in self.bands_data: @@ -526,6 +618,8 @@ def __init__(self, bands=None, pdos=None, **kwargs): self.download_button.on_click(self.download_data) self.update_plot_button.on_click(self._update_plot) # self.proj_bands_width_slider.observe(self._update_plot, names='value') + self.dos_atoms_group.observe(self._update_plot, names="value") + self.dos_plot_group.observe(self._update_plot, names="value") super().__init__( children=[ @@ -853,6 +947,11 @@ def get_pdos_data(pdos, group_tag, plot_tag, selected_atoms): else: data_dict["fermi_energy"] = pdos.nscf.output_parameters["fermi_energy"] + # Updata labels if plot_tag is different than total + if plot_tag != "total": + data_dict = update_pdos_labels(data_dict) + # data_dict = deepcopy(new_dict) + return json.loads(json.dumps(data_dict)) @@ -869,9 +968,9 @@ def _get_grouping_key( key_formats = { ("atoms", "total"): r"{var1}-{var}", ("kinds", "total"): r"{var1}", - ("atoms", "orbital"): r"{var1}-{var}
    {var2}", + ("atoms", "orbital"): r"{var1}-{var2}
    {var}", ("kinds", "orbital"): r"{var1}-{var2}", - ("atoms", "angular_momentum"): r"{var1}-{var}
    {var3}", + ("atoms", "angular_momentum"): r"{var1}-{var3}
    {var}", ("kinds", "angular_momentum"): r"{var1}-{var3}", } @@ -918,13 +1017,17 @@ def _curate_orbitals(orbital): orbital_data = orbital.get_orbital_dict() kind_name = orbital_data["kind_name"] atom_position = [round(i, 2) for i in orbital_data["position"]] + radial_node = orbital_data["radial_nodes"] try: orbital_name = orbital.get_name_from_quantum_numbers( orbital_data["angular_momentum"], orbital_data["magnetic_number"] ).lower() - orbital_name_plotly = HTML_TAGS.get(orbital_name, orbital_name) - orbital_angular_momentum = orbital_name[0] + orbital_name_plotly = ( + f"r{radial_node} {HTML_TAGS.get(orbital_name, orbital_name)}" + ) + orbital_angular_momentum = f"r{radial_node} {orbital_name[0]}" + except AttributeError: # Set quanutum numbers qn_j = orbital_data["total_angular_momentum"] @@ -1078,3 +1181,243 @@ def cmap(label: str) -> str: random.seed(ascn) return f"#{random.randint(0, 0xFFFFFF):06x}" + + +def find_extreme_in_range( + x_data, y_data, x_min, x_max, is_max=True, initial_value=float("-inf") +): + """ + General function to find the extreme value (max or min) in a given range. + + Parameters: + - x_data: List of x values. + - y_data: List of y values. + - x_min: Minimum x value for the range. + - x_max: Maximum x value for the range. + - is_max: Boolean to determine whether to find the maximum or minimum value. + - initial_value: Initial value for extreme (default is -inf for max and 0 for min). + + Returns: + - Extreme value found in the range, or None if no valid values are found. + """ + extreme_value = initial_value + + for x, y in zip(x_data, y_data): + if x_min <= x <= x_max: + if (is_max and y > extreme_value) or (not is_max and y < extreme_value): + extreme_value = y + + return extreme_value if extreme_value != initial_value else None + + +def find_max_up_and_down(x_data_up, y_data_up, x_data_down, y_data_down, x_min, x_max): + """ + Function to find the maximum positive value and the most negative value. + + Parameters: + - x_data_up: List of x values for the positive part. + - y_data_up: List of y values for the positive part. + - x_data_down: List of x values for the negative part. + - y_data_down: List of y values for the negative part. + - x_min: Minimum x value for the range. + - x_max: Maximum x value for the range. + + Returns: + - most_negative_down: Most negative value found in the down part. + - max_up: Maximum value found in the up part. + """ + max_up = find_extreme_in_range(x_data_up, y_data_up, x_min, x_max, is_max=True) + most_negative_down = find_extreme_in_range( + x_data_down, y_data_down, x_min, x_max, is_max=False, initial_value=0 + ) + + return most_negative_down, max_up + + +def find_max_in_range(x_data, y_data, x_min, x_max): + """ + Function to find the maximum value in a specified range. + + Parameters: + - x_data: List of x values. + - y_data: List of y values. + - x_min: Minimum x value for the range. + - x_max: Maximum x value for the range. + + Returns: + - Maximum value found in the range, or None if no valid values are found. + """ + return find_extreme_in_range(x_data, y_data, x_min, x_max, is_max=True) + + +def get_labels_radial_nodes(pdos_dict): + """ + Extracts the original labels from the PDOS data and constructs an orbital dictionary. + + Args: + pdos_dict (dict): Dictionary containing PDOS data with 'dos' key representing orbital information. + + Returns: + tuple: + - original_labels (list): List of strings representing the original orbital labels. + - orbital_dict (dict): A nested dictionary mapping atom kinds to orbital types and their corresponding radial nodes. + """ + original_labels = [] + orbital_dict = {} + + for label_data in pdos_dict["dos"]: + label_str = label_data["label"] + original_labels.append(label_str) + + parts = label_str.split("-") + if len(parts) < 2: + continue # Skip invalid or non-orbital labels + + atom = parts[0] # Atom type (e.g., 'Fe1') + radial_orbital = parts[1].split() # Splits 'r# orbital' (e.g., 'r0 s') + + if len(radial_orbital) < 2: + continue # Malformed label + + radial_node = int(radial_orbital[0][1:]) # Extract radial index from 'r#' + orbital = radial_orbital[1][0] # Orbital type ('s', 'p', 'd', 'f') + + # Populate orbital_dict with atoms, orbitals, and radial nodes + orbital_dict.setdefault(atom, {}).setdefault(orbital, set()).add(radial_node) + + return original_labels, orbital_dict + + +def assign_orbital_labels(orbital_dict): + """ + Assigns orbital labels to atoms based on their radial nodes and electronic structure. + + Args: + orbital_dict (dict): A nested dictionary mapping atom kinds to orbital types and their corresponding radial nodes. + + Returns: + dict: A dictionary mapping atoms and orbitals to their assigned radial labels. + """ + result = {} + + for atom_with_number, orbitals in orbital_dict.items(): + # Extract element name (remove numeric suffixes) + atom = re.sub(r"\d+", "", atom_with_number) + element = Element(atom) + electronic_structure = list(reversed(element.full_electronic_structure)) + + orbital_assignment = {orb: {} for orb in ["s", "p", "d", "f"]} + + # Map orbitals from electronic structure + orbital_map = { + "s": [ + f"{n}{orbital}" + for n, orbital, _ in electronic_structure + if orbital == "s" + ], + "p": [ + f"{n}{orbital}" + for n, orbital, _ in electronic_structure + if orbital == "p" + ], + "d": [ + f"{n}{orbital}" + for n, orbital, _ in electronic_structure + if orbital == "d" + ], + "f": [ + f"{n}{orbital}" + for n, orbital, _ in electronic_structure + if orbital == "f" + ], + } + + # Assign radial nodes to orbitals in reverse order + for orb_type in ["s", "p", "d", "f"]: + if orb_type in orbitals: + sorted_indices = sorted(orbitals[orb_type], reverse=True) + for idx, radial_node in enumerate(sorted_indices): + if radial_node < len(orbital_map[orb_type]): + orbital_assignment[orb_type][idx] = orbital_map[orb_type][ + radial_node + ][0] + + # Clean up empty orbital assignments + result[atom_with_number] = { + orb: val for orb, val in orbital_assignment.items() if val + } + + return result + + +def get_new_pdos_labels(input_list, orbital_dict): + output_list = [] + + for item in input_list: + # Check if the label contains a '-' to proceed with splitting + if "-" in item: + before_dash, after_dash = item.split("-", 1) + + # Split the part after the dash into words to isolate the radial node (r#) + parts = after_dash.split() + + if parts[0].startswith("r"): + radial_index = int(parts[0][1:]) # Extract the number after 'r' + + # Check if the first element after removing the radial part corresponds to an orbital + orbital = parts[1] + + # If the atom and orbital type exist in the orbital_dict, map the radial node + if ( + before_dash in orbital_dict + and orbital[0] in orbital_dict[before_dash] + ): + if radial_index in orbital_dict[before_dash][orbital[0]]: + # Get the mapped radial value + new_radial_value = orbital_dict[before_dash][orbital[0]][ + radial_index + ] + + # Rebuild the string, removing the space before the orbital + after_dash = after_dash.replace( + f"r{radial_index}", new_radial_value, 1 + ) + after_dash = after_dash.replace( + " ", "", 1 + ) # Remove the space after the radial value + new_item = f"{before_dash}-{after_dash}" + else: + new_item = ( + item # If radial index not found, use the original item + ) + else: + new_item = item # If no match in orbital_dict, use original label + else: + new_item = item # In case there's no valid 'r#' part + else: + new_item = item # If no dash, use the original item + + output_list.append(new_item) + + return output_list + + +def update_pdos_labels(pdos_data): + """ + Updates PDOS labels by assigning correct radial nodes to orbitals based on their electronic structure. + + Args: + pdos_data (dict): PDOS data structure containing 'dos' key with orbital information. + + Returns: + tuple: + - pdos_data (dict): Updated PDOS data with correct orbital labels. + """ + original_labels, orbital_dict = get_labels_radial_nodes(pdos_data) + orbital_assignment = assign_orbital_labels(orbital_dict) + updated_labels = get_new_pdos_labels(original_labels, orbital_assignment) + + for idx, label in enumerate(updated_labels): + pdos_data["dos"][idx]["label"] = label + + return pdos_data From d91e8ac3c2ef9b578c0e1473b82a5efb94439555 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Wed, 2 Oct 2024 17:25:15 +0200 Subject: [PATCH 132/166] Feature/degauss widget pdos tab (#833) * Degauss widget for Optional Gaussian Broadening for the PDOS plugin --- src/aiidalab_qe/plugins/pdos/setting.py | 43 +++++++++++++++++++ src/aiidalab_qe/plugins/pdos/workchain.py | 14 ++++++ .../test_create_builder_default.yml | 2 + 3 files changed, 59 insertions(+) diff --git a/src/aiidalab_qe/plugins/pdos/setting.py b/src/aiidalab_qe/plugins/pdos/setting.py index 91a2a7621..60159d1b0 100644 --- a/src/aiidalab_qe/plugins/pdos/setting.py +++ b/src/aiidalab_qe/plugins/pdos/setting.py @@ -10,6 +10,8 @@ from aiida_quantumespresso.workflows.pdos import PdosWorkChain from aiidalab_qe.common.panel import Panel +RYDBERG_TO_EV = 13.605703976 + class Setting(Panel): title = "PDOS" @@ -22,6 +24,11 @@ def __init__(self, **kwargs): """

    Settings

    """ ) + self.description = ipw.HTML( + """
    + By default, the tetrahedron method is used for PDOS calculation. If required you can apply Gaussian broadening with a custom degauss value. +
    """ + ) # nscf kpoints setting widget self.nscf_kpoints_distance = ipw.BoundedFloatText( min=0.001, @@ -31,15 +38,45 @@ def __init__(self, **kwargs): disabled=False, style={"description_width": "initial"}, ) + self.use_pdos_degauss = ipw.Checkbox( + value=False, + description="Use custom PDOS degauss", + style={"description_width": "initial"}, + ) + self.pdos_degauss = ipw.BoundedFloatText( + min=0.00001, + step=0.001, + value=0.005, + description="PDOS degauss (Ry):", + disabled=True, + style={"description_width": "initial"}, + ) + self.pdos_degauss_eV = ipw.HTML( + value=f"({self.pdos_degauss.value * RYDBERG_TO_EV:.4f} eV)", + ) + + self.use_pdos_degauss.observe(self._disable_pdos_degauss, "value") + self.pdos_degauss.observe(self._update_pdos_degauss_ev, "value") self.mesh_grid = ipw.HTML() self.nscf_kpoints_distance.observe(self._display_mesh, "value") self.nscf_kpoints_distance.observe(self._procotol_changed, "change") self.children = [ self.settings_title, + self.description, ipw.HBox([self.nscf_kpoints_distance, self.mesh_grid]), + self.use_pdos_degauss, + ipw.HBox([self.pdos_degauss, self.pdos_degauss_eV]), ] super().__init__(**kwargs) + def _disable_pdos_degauss(self, change): + self.pdos_degauss.disabled = not change["new"] + + def _update_pdos_degauss_ev(self, change): + new_value = change["new"] * RYDBERG_TO_EV + if self.pdos_degauss_eV.value != f"({new_value} eV)": + self.pdos_degauss_eV.value = f"({new_value:.4f} eV)" + @tl.observe("protocol") def _procotol_changed(self, change): self.nscf_kpoints_distance.value = PdosWorkChain.get_protocol_inputs( @@ -65,12 +102,18 @@ def get_panel_value(self): """Return a dictionary with the input parameters for the plugin.""" return { "nscf_kpoints_distance": self.nscf_kpoints_distance.value, + "pdos_degauss": self.pdos_degauss.value, + "use_pdos_degauss": self.use_pdos_degauss.value, } def set_panel_value(self, input_dict): """Load a dictionary with the input parameters for the plugin.""" self.nscf_kpoints_distance.value = input_dict.get("nscf_kpoints_distance", 0.1) + self.pdos_degauss.value = input_dict.get("pdos_degauss", 0.005) + self.use_pdos_degauss.value = input_dict.get("use_pdos_degauss", False) def reset(self): """Reset the panel to its default values.""" self.nscf_kpoints_distance.value = 0.1 + self.pdos_degauss.value = 0.005 + self.use_pdos_degauss.value = False diff --git a/src/aiidalab_qe/plugins/pdos/workchain.py b/src/aiidalab_qe/plugins/pdos/workchain.py index b3c5bfbc6..6fe19ce2f 100644 --- a/src/aiidalab_qe/plugins/pdos/workchain.py +++ b/src/aiidalab_qe/plugins/pdos/workchain.py @@ -52,12 +52,26 @@ def get_builder(codes, structure, parameters, **kwargs): scf_overrides = deepcopy(parameters["advanced"]) nscf_overrides = deepcopy(parameters["advanced"]) + # Dos Projwfc overrides + dos_overrides = {"parameters": {"DOS": {}}} + projwfc_overrides = {"parameters": {"PROJWFC": {}}} + + if parameters["pdos"]["use_pdos_degauss"]: + dos_overrides["parameters"]["DOS"] = { + "degauss": parameters["pdos"]["pdos_degauss"] + } + projwfc_overrides["parameters"]["PROJWFC"] = { + "degauss": parameters["pdos"]["pdos_degauss"] + } + # Update the nscf kpoints distance from the setting panel nscf_overrides["kpoints_distance"] = parameters["pdos"]["nscf_kpoints_distance"] overrides = { "scf": scf_overrides, "nscf": nscf_overrides, + "dos": dos_overrides, + "projwfc": projwfc_overrides, } if dos_code is not None and projwfc_code is not None: pdos = PdosWorkChain.get_builder_from_protocol( diff --git a/tests/test_submit_qe_workchain/test_create_builder_default.yml b/tests/test_submit_qe_workchain/test_create_builder_default.yml index ca33c43c9..4b9f604cc 100644 --- a/tests/test_submit_qe_workchain/test_create_builder_default.yml +++ b/tests/test_submit_qe_workchain/test_create_builder_default.yml @@ -43,6 +43,8 @@ codes: parallelization: {} pdos: nscf_kpoints_distance: 0.1 + pdos_degauss: 0.005 + use_pdos_degauss: false workchain: electronic_type: metal properties: From 64070e707b688a7bc08c68f11ed8227c1e2f7508 Mon Sep 17 00:00:00 2001 From: Miki Bonacci <46074008+mikibonacci@users.noreply.github.com> Date: Thu, 3 Oct 2024 14:19:38 +0200 Subject: [PATCH 133/166] Improvement/process labels (#836) * Process label improved Following the guidelines in https://github.com/aiidalab/aiidalab-qe/issues/811 * Minimal test for the process label generation. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Now structure label will be put instead of formula The two will coincide if the user does not modify the default label. Also, if by mistake the user provides an empty label, automatically the job label will use the structure formula. * Added tests for label and empty label. * Modified PDOS checkbox --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/aiidalab_qe/app/submission/__init__.py | 33 +++++++++++++++------- src/aiidalab_qe/plugins/pdos/__init__.py | 2 +- tests/test_submit_qe_workchain.py | 29 +++++++++++++++++++ 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/aiidalab_qe/app/submission/__init__.py b/src/aiidalab_qe/app/submission/__init__.py index 93c5e27af..a7787341a 100644 --- a/src/aiidalab_qe/app/submission/__init__.py +++ b/src/aiidalab_qe/app/submission/__init__.py @@ -366,20 +366,33 @@ def _update_process_label(self) -> dict: """Generate a label for the work chain based on the input parameters.""" if not self.input_structure: return "" - formula = self.input_structure.get_formula() + structure_label = ( + self.input_structure.label + if len(self.input_structure.label) > 0 + else self.input_structure.get_formula() + ) workchain_data = self.input_parameters.get("workchain", {"properties": []}) properties = [p for p in workchain_data["properties"] if p != "relax"] + # relax_info relax_type = workchain_data.get("relax_type", "none") + relax_info = "relax: none" if relax_type != "none": - relax_info = "structure is relaxed" - else: - relax_info = "structure is not relaxed" - if not properties: - properties_info = "" - else: - properties_info = f", properties on {', '.join(properties)}" - - label = f"{formula} {relax_info} {properties_info}" + relax_info = ( + relax_info.replace("none", "atoms+cell") + if "cell" in relax_type + else relax_info.replace("none", "atoms only") + ) + # protocol_info + protocol_and_magnetic_info = f"{workchain_data['protocol']} protocol" + # magnetic_info + if workchain_data["spin_type"] != "none": + protocol_and_magnetic_info += ", magnetic" + # properties_info + properties_info = "" + if properties: + properties_info = f"→ {', '.join(properties)}" + + label = f"{structure_label} [{relax_info}, {protocol_and_magnetic_info}] {properties_info}".strip() self.process_label.value = label def _create_builder(self) -> ProcessBuilderNamespace: diff --git a/src/aiidalab_qe/plugins/pdos/__init__.py b/src/aiidalab_qe/plugins/pdos/__init__.py index 8bc3fbd54..8bdf2fc13 100644 --- a/src/aiidalab_qe/plugins/pdos/__init__.py +++ b/src/aiidalab_qe/plugins/pdos/__init__.py @@ -7,7 +7,7 @@ class PdosOutline(OutlinePanel): - title = "Projected density of states" + title = "Projected Density of States (PDOS)" help = """""" diff --git a/tests/test_submit_qe_workchain.py b/tests/test_submit_qe_workchain.py index 3f2b7b6aa..b21f1e38f 100644 --- a/tests/test_submit_qe_workchain.py +++ b/tests/test_submit_qe_workchain.py @@ -25,6 +25,35 @@ def test_create_builder_default( # In the future, we will check the builder parameters using regresion test +@pytest.mark.usefixtures("sssp") +def test_create_process_label( + submit_app_generator, +): + """ "Test the creation of the correct process label""" + + app = submit_app_generator(properties=["bands", "pdos"]) + submit_step = app.submit_step + submit_step._update_process_label() + assert ( + submit_step.process_label.value + == "Si2 [relax: atoms+cell, moderate protocol] → bands, pdos" + ) + # suppose we change the label of the structure: + submit_step.input_structure.label = "Si2, unit cell" + submit_step._update_process_label() + assert ( + submit_step.process_label.value + == "Si2, unit cell [relax: atoms+cell, moderate protocol] → bands, pdos" + ) + # suppose by mistake we provide an empty label, we then fallback to use the formula: + submit_step.input_structure.label = "" + submit_step._update_process_label() + assert ( + submit_step.process_label.value + == "Si2 [relax: atoms+cell, moderate protocol] → bands, pdos" + ) + + @pytest.mark.usefixtures("sssp") def test_create_builder_insulator( submit_app_generator, From fc8d0a5f61d8983e22cde79bc3636cf04dfe2188 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Thu, 3 Oct 2024 14:47:24 +0200 Subject: [PATCH 134/166] improving description text in widget (#837) --- src/aiidalab_qe/common/bandpdoswidget.py | 30 ++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/aiidalab_qe/common/bandpdoswidget.py b/src/aiidalab_qe/common/bandpdoswidget.py index 8ef9f72da..e76de7673 100644 --- a/src/aiidalab_qe/common/bandpdoswidget.py +++ b/src/aiidalab_qe/common/bandpdoswidget.py @@ -514,11 +514,21 @@ class BandPdosWidget(ipw.VBox): - pdos_options_out: Output widget to clear specific widgets. """ + widget_description = ipw.HTML( + """
    + Hover over the plot to reveal controls for zoom, pan, and downloading the image. Use the zoom tools or your mouse to zoom in on specific regions, and click on the axes for interactive features. The home button resets to the default view, and the autoscale option displays all computed data, including semicore states. +
    """ + ) + description = ipw.HTML( - """
    - The plot is interactive: you can zoom in and out, as well as move the axes to explore specific regions of interest. -

    - Select the style of plotting the projected density of states. + """
    + Select the style of plotting the projected density of states. +
    """ + ) + + legend_interaction_description = ipw.HTML( + """
    + The legend entries can be clicked to hide or show the corresponding data. Double-clicking on a legend entry will isolate it.
    """ ) @@ -571,6 +581,7 @@ def __init__(self, bands=None, pdos=None, **kwargs): self.project_bands_box = ipw.Checkbox( value=False, description="Add `fat bands` projections", + style={"description_width": "initial"}, ) self.proj_bands_width_slider = ipw.FloatSlider( value=0.5, @@ -623,6 +634,7 @@ def __init__(self, bands=None, pdos=None, **kwargs): super().__init__( children=[ + self.widget_description, self.pdos_options_out, self.download_button, self.bands_widget, # Add the output widget to the VBox @@ -632,6 +644,16 @@ def __init__(self, bands=None, pdos=None, **kwargs): # Plot the options only if the pdos is provided or in case the bands data contains projections if self.pdos or (self.bands_data and "projected_bands" in self.bands_data): + # Add the legend interaction description after the download button + self.children = ( + self.children[ + :3 + ] # Get the first three children: widget_description, pdos_options_out and download_button + + ( + self.legend_interaction_description, + ) # Add the legend interaction description as a tuple + + self.children[3:] # Add the rest of the children + ) with self.pdos_options_out: display(self.pdos_options) From 2b3963ac09a78decbf46f3340cf3d2a4720e6158 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Fri, 4 Oct 2024 10:47:49 +0200 Subject: [PATCH 135/166] adding ProjwfcBandWorkchain (#787) * adding ProjwfcBandWorkchain for Fat bands Calculations --- docs/source/development/architecture.rst | 2 +- docs/source/development/plugin.rst | 2 +- setup.cfg | 4 + src/aiidalab_qe/app/configuration/workflow.py | 9 - src/aiidalab_qe/app/parameters/qeapp.yaml | 2 + src/aiidalab_qe/plugins/bands/__init__.py | 8 + .../plugins/bands/bands_workchain.py | 382 ++++++++++++++++++ src/aiidalab_qe/plugins/bands/result.py | 21 +- src/aiidalab_qe/plugins/bands/setting.py | 38 +- src/aiidalab_qe/plugins/bands/workchain.py | 245 +++-------- .../plugins/electronic_structure/result.py | 21 +- tests/conftest.py | 87 +++- tests/test_plugins_bands.py | 21 +- tests/test_submit_qe_workchain.py | 9 +- .../test_create_builder_default.yml | 8 +- 15 files changed, 597 insertions(+), 262 deletions(-) create mode 100644 src/aiidalab_qe/plugins/bands/bands_workchain.py diff --git a/docs/source/development/architecture.rst b/docs/source/development/architecture.rst index 4daf5c908..5627b6c78 100644 --- a/docs/source/development/architecture.rst +++ b/docs/source/development/architecture.rst @@ -49,7 +49,7 @@ The dictionary has the following structure: "pseudo_family": "SSSP/1.3/PBEsol/efficiency", "kpoints_distance": 0.5, }, - "bands": {"kpath_2d": "hexagonal"}, + "bands": {}, "pdos": {...}, "plugin_1": {...}, "plugin_2": {...}, diff --git a/docs/source/development/plugin.rst b/docs/source/development/plugin.rst index 9176e69fd..5199e70cf 100644 --- a/docs/source/development/plugin.rst +++ b/docs/source/development/plugin.rst @@ -210,7 +210,7 @@ The `parameters` passed to the `get_builder` function has the following structur "pseudo_family": "SSSP/1.3/PBEsol/efficiency", "kpoints_distance": 0.5, }, - "bands": {"kpath_2d": "hexagonal"}, + "bands": {}, "pdos": {...}, "eos": {...}, "plugin_1": {...}, diff --git a/setup.cfg b/setup.cfg index 96b30824d..ae279ba08 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,6 +31,7 @@ install_requires = aiida-pseudo~=1.4 filelock~=3.8 importlib-resources~=5.2 + aiida-wannier90-workflows==2.3.0 python_requires = >=3.9 [options.packages.find] @@ -60,6 +61,9 @@ aiidalab_qe.properties = electronic_structure = aiidalab_qe.plugins.electronic_structure:electronic_structure xas = aiidalab_qe.plugins.xas:xas +aiida.workflows = + aiidalab_qe.bands_workchain = aiidalab_qe.plugins.bands.bands_workchain:BandsWorkChain + [aiidalab] title = Quantum ESPRESSO description = Perform Quantum ESPRESSO calculations diff --git a/src/aiidalab_qe/app/configuration/workflow.py b/src/aiidalab_qe/app/configuration/workflow.py index 47db49cc0..408906ee5 100644 --- a/src/aiidalab_qe/app/configuration/workflow.py +++ b/src/aiidalab_qe/app/configuration/workflow.py @@ -38,14 +38,6 @@ class WorkChainSettings(Panel): """

    Properties

    """ ) - properties_help = ipw.HTML( - """
    - The band structure workflow will - automatically detect the default path in reciprocal space using the - - SeeK-path tool.
    """ - ) - protocol_title = ipw.HTML( """

    Protocol

    """ @@ -116,7 +108,6 @@ def update_reminder_info(change, name=name): if name in setting_entries: self.properties[name].run.observe(update_reminder_info, "value") - self.property_children.append(self.properties_help) self.children = [ self.structure_title, self.structure_help, diff --git a/src/aiidalab_qe/app/parameters/qeapp.yaml b/src/aiidalab_qe/app/parameters/qeapp.yaml index c00c0f1c1..1fba8c032 100644 --- a/src/aiidalab_qe/app/parameters/qeapp.yaml +++ b/src/aiidalab_qe/app/parameters/qeapp.yaml @@ -29,6 +29,8 @@ codes: code: dos-7.2@localhost projwfc: code: projwfc-7.2@localhost + projwfc_bands: + code: projwfc-7.2@localhost pw: code: pw-7.2@localhost pp: diff --git a/src/aiidalab_qe/plugins/bands/__init__.py b/src/aiidalab_qe/plugins/bands/__init__.py index 3d67f0a7b..b38797141 100644 --- a/src/aiidalab_qe/plugins/bands/__init__.py +++ b/src/aiidalab_qe/plugins/bands/__init__.py @@ -1,5 +1,6 @@ # from aiidalab_qe.bands.result import Result from aiidalab_qe.common.panel import OutlinePanel +from aiidalab_qe.common.widgets import QEAppComputationalResourcesWidget from .result import Result from .setting import Setting @@ -15,8 +16,15 @@ class BandsOutline(OutlinePanel): """ +projwfc_code = QEAppComputationalResourcesWidget( + description="projwfc.x", + default_calc_job_plugin="quantumespresso.projwfc", +) + + bands = { "outline": BandsOutline, + "code": {"projwfc_bands": projwfc_code}, "setting": Setting, "result": Result, "workchain": workchain_and_builder, diff --git a/src/aiidalab_qe/plugins/bands/bands_workchain.py b/src/aiidalab_qe/plugins/bands/bands_workchain.py new file mode 100644 index 000000000..d5401341d --- /dev/null +++ b/src/aiidalab_qe/plugins/bands/bands_workchain.py @@ -0,0 +1,382 @@ +import math + +import numpy as np + +from aiida import orm +from aiida.common import AttributeDict +from aiida.engine import WorkChain +from aiida.plugins import DataFactory, WorkflowFactory + +GAMMA = "\u0393" + +PwBandsWorkChain = WorkflowFactory("quantumespresso.pw.bands") +ProjwfcBandsWorkChain = WorkflowFactory("wannier90_workflows.projwfcbands") +KpointsData = DataFactory("core.array.kpoints") + + +def points_per_branch(vector_a, vector_b, reciprocal_cell, bands_kpoints_distance): + """function to calculate the number of points per branch depending on the kpoints_distance and the reciprocal cell""" + scaled_vector_a = np.array(vector_a) + scaled_vector_b = np.array(vector_b) + reciprocal_vector_a = scaled_vector_a.dot(reciprocal_cell) + reciprocal_vector_b = scaled_vector_b.dot(reciprocal_cell) + distance = np.linalg.norm(reciprocal_vector_a - reciprocal_vector_b) + return max( + 2, int(np.round(distance / bands_kpoints_distance)) + ) # at least two points for each segment, including both endpoints explicitly + + +def calculate_bands_kpoints_distance(kpoints_distance): + """function to calculate the bands_kpoints_distance depending on the kpoints_distance""" + if kpoints_distance >= 0.5: + return 0.1 + elif 0.15 < kpoints_distance < 0.5: + return 0.025 + else: + return 0.015 + + +def generate_kpath_1d(structure, kpoints_distance): + """Return a kpoints object for one dimensional systems (from Gamma to X) + The number of kpoints is calculated based on the kpoints_distance (as in the PwBandsWorkChain protocol) + """ + kpoints = KpointsData() + kpoints.set_cell_from_structure(structure) + reciprocal_cell = kpoints.reciprocal_cell + bands_kpoints_distance = calculate_bands_kpoints_distance(kpoints_distance) + + # Number of points per branch + num_points_per_branch = points_per_branch( + [0.0, 0.0, 0.0], + [0.5, 0.0, 0.0], + reciprocal_cell, + bands_kpoints_distance, + ) + # Generate the kpoints + points = np.linspace( + start=[0.0, 0.0, 0.0], + stop=[0.5, 0.0, 0.0], + endpoint=True, + num=num_points_per_branch, + ) + kpoints.set_kpoints(points.tolist()) + kpoints.labels = [[0, GAMMA], [len(points) - 1, "X"]] + return kpoints + + +def generate_kpath_2d(structure, kpoints_distance, kpath_2d): + """Return a kpoints object for two dimensional systems based on the selected 2D symmetry path + The number of kpoints is calculated based on the kpoints_distance (as in the PwBandsWorkChain protocol) + The 2D symmetry paths are defined as in The Journal of Physical Chemistry Letters 2022 13 (50), 11581-11594 (https://pubs.acs.org/doi/10.1021/acs.jpclett.2c02972) + """ + kpoints = KpointsData() + kpoints.set_cell_from_structure(structure) + reciprocal_cell = kpoints.reciprocal_cell + bands_kpoints_distance = calculate_bands_kpoints_distance(kpoints_distance) + + # dictionary with the 2D symmetry paths + selected_paths = { + "hexagonal": { + "path": [ + [0.0, 0.0, 0.0], + [0.5, 0.0, 0.0], + [0.33333, 0.33333, 0.0], + [1.0, 0.0, 0.0], + ], + "labels": [GAMMA, "M", "K", GAMMA], + }, + "square": { + "path": [ + [0.0, 0.0, 0.0], + [0.5, 0.0, 0.0], + [0.5, 0.5, 0.0], + [1.0, 0.0, 0.0], + ], + "labels": [GAMMA, "X", "M", GAMMA], + }, + "rectangular": { + "path": [ + [0.0, 0.0, 0.0], + [0.5, 0.0, 0.0], + [0.5, 0.5, 0.0], + [0.0, 0.5, 0.0], + [1.0, 0.0, 0.0], + ], + "labels": [GAMMA, "X", "S", "Y", GAMMA], + }, + } + # if the selected path is centered_rectangular or oblique, the path is calculated based on the reciprocal cell + if kpath_2d in ["centered_rectangular", "oblique"]: + a1 = reciprocal_cell[0] + a2 = reciprocal_cell[1] + norm_a1 = np.linalg.norm(a1) + norm_a2 = np.linalg.norm(a2) + cos_gamma = ( + a1.dot(a2) / (norm_a1 * norm_a2) + ) # Angle between a1 and a2 # like in https://pubs.acs.org/doi/10.1021/acs.jpclett.2c02972 + gamma = np.arccos(cos_gamma) + eta = (1 - (norm_a1 / norm_a2) * cos_gamma) / (2 * np.power(np.sin(gamma), 2)) + nu = 0.5 - (eta * norm_a2 * cos_gamma) / norm_a1 + selected_paths["centered_rectangular"] = { + "path": [ + [0.0, 0.0, 0.0], + [0.5, 0.0, 0.0], + [1 - eta, nu, 0], + [0.5, 0.5, 0.0], + [eta, 1 - nu, 0.0], + [1.0, 0.0, 0.0], + ], + "labels": [GAMMA, "X", "H_1", "C", "H", GAMMA], + } + selected_paths["oblique"] = { + "path": [ + [0.0, 0.0, 0.0], + [0.5, 0.0, 0.0], + [1 - eta, nu, 0], + [0.5, 0.5, 0.0], + [eta, 1 - nu, 0.0], + [0.0, 0.5, 0.0], + [1.0, 0.0, 0.0], + ], + "labels": [GAMMA, "X", "H_1", "C", "H", "Y", GAMMA], + } + path = selected_paths[kpath_2d]["path"] + labels = selected_paths[kpath_2d]["labels"] + branches = zip(path[:-1], path[1:]) + + all_kpoints = [] # List to hold all k-points + label_map = [] # List to hold labels and their corresponding k-point indices + + # Calculate the number of points per branch and generate the kpoints + index_offset = 0 # Start index for each segment + for (start, end), label_start, _ in zip(branches, labels[:-1], labels[1:]): + num_points_per_branch = points_per_branch( + start, end, reciprocal_cell, bands_kpoints_distance + ) + # Exclude endpoint except for the last segment to prevent duplication + points = np.linspace(start, end, num=num_points_per_branch, endpoint=False) + all_kpoints.extend(points) + label_map.append( + (index_offset, label_start) + ) # Label for the start of the segment + index_offset += len(points) + + # Include the last point and its label + all_kpoints.append(path[-1]) + label_map.append((index_offset, labels[-1])) # Label for the last point + + # Set the kpoints and their labels in KpointsData + kpoints.set_kpoints(all_kpoints) + kpoints.labels = label_map + + return kpoints + + +def determine_symmetry_path(structure): + # Tolerance for checking equality + cell_lengths = structure.cell_lengths + cell_angles = structure.cell_angles + tolerance = 1e-3 + + # Define symmetry conditions and their corresponding types in a dictionary + symmetry_conditions = { + ( + math.isclose(cell_lengths[0], cell_lengths[1], abs_tol=tolerance) + and math.isclose(cell_angles[2], 120.0, abs_tol=tolerance) + ): "hexagonal", + ( + math.isclose(cell_lengths[0], cell_lengths[1], abs_tol=tolerance) + and math.isclose(cell_angles[2], 90.0, abs_tol=tolerance) + ): "square", + ( + not math.isclose(cell_lengths[0], cell_lengths[1], abs_tol=tolerance) + and math.isclose(cell_angles[2], 90.0, abs_tol=tolerance) + ): "rectangular", + ( + math.isclose( + cell_lengths[1] * math.cos(math.radians(cell_angles[2])), + cell_lengths[0] / 2, + abs_tol=tolerance, + ) + ): "rectangular_centered", + ( + not math.isclose(cell_lengths[0], cell_lengths[1], abs_tol=tolerance) + and not math.isclose(cell_angles[2], 90.0, abs_tol=tolerance) + ): "oblique", + } + + # Check for symmetry type based on conditions + for condition, symmetry_type in symmetry_conditions.items(): + if condition: + return symmetry_type + + raise ValueError("Invalid symmetry type") + + +class BandsWorkChain(WorkChain): + "Workchain to compute the electronic band structure" + + label = "bands" + + @classmethod + def define(cls, spec): + super().define(spec) + + spec.input("structure", valid_type=orm.StructureData) + spec.expose_inputs( + PwBandsWorkChain, + namespace="bands", + exclude=["structure", "relax"], + namespace_options={ + "required": False, + "populate_defaults": False, + "help": "Inputs for the `PwBandsWorkChain`, simulation mode normal.", + }, + ) + spec.expose_inputs( + ProjwfcBandsWorkChain, + namespace="bands_projwfc", + exclude=["structure", "relax"], + namespace_options={ + "required": False, + "populate_defaults": False, + "help": "Inputs for the `ProjwfcBandsWorkChain`, simulation mode fat_bands.", + }, + ) + + spec.expose_outputs( + PwBandsWorkChain, + namespace="bands", + namespace_options={ + "required": False, + "help": "Outputs of the `PwBandsWorkChain`.", + }, + ) + spec.expose_outputs( + ProjwfcBandsWorkChain, + namespace="bands_projwfc", + namespace_options={ + "required": False, + "help": "Outputs of the `PwBandsWorkChain`.", + }, + ) + + spec.outline(cls.setup, cls.run_bands, cls.results) + + spec.exit_code( + 400, "ERROR_WORKCHAIN_FAILED", message="The workchain bands failed." + ) + + @classmethod + def get_builder_from_protocol( + cls, + pw_code, + projwfc_code, + structure, + simulation_mode="normal", + protocol=None, + overrides=None, + **kwargs, + ): + """Return a BandsWorkChain builder prepopulated with inputs following the specified protocol + + :param structure: the ``StructureData`` instance to use. + :param pw_code: the ``Code`` instance configured for the ``quantumespresso.pw`` plugin. + :param protocol: protocol to use, if not specified, the default will be used. + :param projwfc_code: the ``Code`` instance configured for the ``quantumespresso.projwfc`` plugin. + :param simulation_mode: hat type of simulation to run normal band or fat bands. + + """ + + builder = cls.get_builder() + + if simulation_mode == "normal": + builder_bands = PwBandsWorkChain.get_builder_from_protocol( + pw_code, structure, protocol, overrides=overrides, **kwargs + ) + builder.pop("bands_projwfc", None) + builder_bands.pop("relax", None) + builder_bands.pop("structure", None) + builder.bands = builder_bands + + elif simulation_mode == "fat_bands": + builder_bands_projwfc = ProjwfcBandsWorkChain.get_builder_from_protocol( + pw_code, + projwfc_code, + structure, + protocol=protocol, + overrides=overrides, + **kwargs, + ) + builder.pop("bands", None) + builder_bands_projwfc.pop("relax", None) + builder_bands_projwfc.pop("structure", None) + builder.bands_projwfc = builder_bands_projwfc + + else: + raise ValueError(f"Unknown simulation_mode: {simulation_mode}") + + # Handle periodic boundary conditions (PBC) + if structure.pbc != (True, True, True): + kpoints_distance = overrides.get("scf", {}).get( + "kpoints_distance", + builder.get("bands", {}).get("scf", {}).get("kpoints_distance"), + ) + kpoints = None + if structure.pbc == (True, False, False): + kpoints = generate_kpath_1d(structure, kpoints_distance) + elif structure.pbc == (True, True, False): + kpoints = generate_kpath_2d( + structure=structure, + kpoints_distance=kpoints_distance, + kpath_2d=determine_symmetry_path(structure), + ) + + if simulation_mode == "normal": + builder.bands.pop("bands_kpoints_distance", None) + builder.bands.update({"bands_kpoints": kpoints}) + elif simulation_mode == "fat_bands": + builder.bands_projwfc.pop("bands_kpoints_distance", None) + builder.bands_projwfc.update({"bands_kpoints": kpoints}) + + builder.structure = structure + return builder + + def setup(self): + """Define the current workchain""" + self.ctx.current_structure = self.inputs.structure + if "bands" in self.inputs: + self.ctx.key = "bands" + self.ctx.workchain = PwBandsWorkChain + elif "bands_projwfc" in self.inputs: + self.ctx.key = "bands_projwfc" + self.ctx.workchain = ProjwfcBandsWorkChain + else: + self.report("No bands workchain specified") + return self.exit_codes.ERROR_WORKCHAIN_FAILED + + def run_bands(self): + """Run the bands workchain""" + inputs = AttributeDict( + self.exposed_inputs(self.ctx.workchain, namespace=self.ctx.key) + ) + inputs.metadata.call_link_label = self.ctx.key + inputs.structure = self.ctx.current_structure + future = self.submit(self.ctx.workchain, **inputs) + self.report(f"submitting `WorkChain` ") + self.to_context(**{self.ctx.key: future}) + + def results(self): + """Attach the bands results""" + workchain = self.ctx[self.ctx.key] + + if not workchain.is_finished_ok: + self.report("Bands workchain failed") + return self.exit_codes.ERROR_WORKCHAIN_FAILED + else: + self.out_many( + self.exposed_outputs( + self.ctx[self.ctx.key], self.ctx.workchain, namespace=self.ctx.key + ) + ) + self.report("Bands workchain completed successfully") diff --git a/src/aiidalab_qe/plugins/bands/result.py b/src/aiidalab_qe/plugins/bands/result.py index 03b7630cd..7ca4b206c 100644 --- a/src/aiidalab_qe/plugins/bands/result.py +++ b/src/aiidalab_qe/plugins/bands/result.py @@ -14,11 +14,22 @@ def __init__(self, node=None, **kwargs): super().__init__(node=node, **kwargs) def _update_view(self): - # Check if the workchain has the outputs - try: - bands_node = self.node.outputs.bands - except AttributeError: - bands_node = None + # Initialize bands_node to None by default + bands_node = None + + # Check if the workchain has the 'bands' output + if hasattr(self.node.outputs, "bands"): + bands_output = self.node.outputs.bands + + # Check for 'bands' or 'bands_projwfc' attributes within 'bands' output + if hasattr(bands_output, "bands"): + bands_node = bands_output.bands + elif hasattr(bands_output, "bands_projwfc"): + bands_node = bands_output.bands_projwfc + else: + # If neither 'bands' nor 'bands_projwfc' exist, use 'bands_output' itself + # This is the case for compatibility with older versions of the plugin + bands_node = bands_output _bands_plot_view = BandPdosWidget(bands=bands_node) self.children = [ diff --git a/src/aiidalab_qe/plugins/bands/setting.py b/src/aiidalab_qe/plugins/bands/setting.py index 12f012279..05ff99e4e 100644 --- a/src/aiidalab_qe/plugins/bands/setting.py +++ b/src/aiidalab_qe/plugins/bands/setting.py @@ -18,39 +18,37 @@ def __init__(self, **kwargs): options=["fast", "moderate", "precise"], value="moderate", ) - self.kpath_2d_help = ipw.HTML( - """
    - If your system has periodicity xy. Please select one of the five 2D Bravais lattices corresponding to your system. -
    """ + self.properties_help = ipw.HTML( + """
    + The band structure workflow will + automatically detect the default path in reciprocal space using the + + SeeK-path tool. +

    + Fat Bands is a band structure plot that includes the angular momentum contributions from specific atoms or orbitals to each energy band. The thickness of the bands represents the strength of these contributions, providing insight into the electronic structure. +
    """ ) - self.kpath_2d = ipw.Dropdown( - description="Lattice:", - options=[ - ("Hexagonal", "hexagonal"), - ("Square", "square"), - ("Rectangular", "rectangular"), - ("Centered Rectangular", "centered_rectangular"), - ("Oblique", "oblique"), - ], - value="hexagonal", + self.projwfc_bands = ipw.Checkbox( + description="Fat bands calculation", + value=False, + style={"description_width": "initial"}, ) self.children = [ self.settings_title, - self.kpath_2d_help, - self.kpath_2d, + self.properties_help, + self.projwfc_bands, ] super().__init__(**kwargs) def get_panel_value(self): """Return a dictionary with the input parameters for the plugin.""" return { - "kpath_2d": self.kpath_2d.value, + "projwfc_bands": self.projwfc_bands.value, } def set_panel_value(self, input_dict): - """Load a dictionary with the input parameters for the plugin.""" - self.kpath_2d.value = input_dict.get("kpath_2d", "hexagonal") + self.projwfc_bands.value = input_dict.get("projwfc_bands", False) def reset(self): """Reset the panel to its default values.""" - self.kpath_2d.value = "hexagonal" + self.projwfc_bands.value = False diff --git a/src/aiidalab_qe/plugins/bands/workchain.py b/src/aiidalab_qe/plugins/bands/workchain.py index c3cc5eb78..863a7dc0b 100644 --- a/src/aiidalab_qe/plugins/bands/workchain.py +++ b/src/aiidalab_qe/plugins/bands/workchain.py @@ -1,180 +1,48 @@ -import numpy as np - -from aiida.plugins import DataFactory, WorkflowFactory +from aiida.plugins import WorkflowFactory from aiida_quantumespresso.common.types import ElectronicType, SpinType from aiidalab_qe.plugins.utils import set_component_resources -GAMMA = "\u0393" - -PwBandsWorkChain = WorkflowFactory("quantumespresso.pw.bands") -KpointsData = DataFactory("core.array.kpoints") - +BandsWorkChain = WorkflowFactory("aiidalab_qe.bands_workchain") +# from .bands_workchain import BandsWorkChain -def points_per_branch(vector_a, vector_b, reciprocal_cell, bands_kpoints_distance): - """function to calculate the number of points per branch depending on the kpoints_distance and the reciprocal cell""" - scaled_vector_a = np.array(vector_a) - scaled_vector_b = np.array(vector_b) - reciprocal_vector_a = scaled_vector_a.dot(reciprocal_cell) - reciprocal_vector_b = scaled_vector_b.dot(reciprocal_cell) - distance = np.linalg.norm(reciprocal_vector_a - reciprocal_vector_b) - return max( - 2, int(np.round(distance / bands_kpoints_distance)) - ) # at least two points for each segment, including both endpoints explicitly - -def calculate_bands_kpoints_distance(kpoints_distance): - """function to calculate the bands_kpoints_distance depending on the kpoints_distance""" - if kpoints_distance >= 0.5: - return 0.1 - elif 0.15 < kpoints_distance < 0.5: - return 0.025 - else: - return 0.015 - - -def generate_kpath_1d(structure, kpoints_distance): - """Return a kpoints object for one dimensional systems (from Gamma to X) - The number of kpoints is calculated based on the kpoints_distance (as in the PwBandsWorkChain protocol) - """ - kpoints = KpointsData() - kpoints.set_cell_from_structure(structure) - reciprocal_cell = kpoints.reciprocal_cell - bands_kpoints_distance = calculate_bands_kpoints_distance(kpoints_distance) - - # Number of points per branch - num_points_per_branch = points_per_branch( - [0.0, 0.0, 0.0], - [0.5, 0.0, 0.0], - reciprocal_cell, - bands_kpoints_distance, - ) - # Generate the kpoints - points = np.linspace( - start=[0.0, 0.0, 0.0], - stop=[0.5, 0.0, 0.0], - endpoint=True, - num=num_points_per_branch, - ) - kpoints.set_kpoints(points.tolist()) - kpoints.labels = [[0, GAMMA], [len(points) - 1, "X"]] - return kpoints - - -def generate_kpath_2d(structure, kpoints_distance, kpath_2d): - """Return a kpoints object for two dimensional systems based on the selected 2D symmetry path - The number of kpoints is calculated based on the kpoints_distance (as in the PwBandsWorkChain protocol) - The 2D symmetry paths are defined as in The Journal of Physical Chemistry Letters 2022 13 (50), 11581-11594 (https://pubs.acs.org/doi/10.1021/acs.jpclett.2c02972) - """ - kpoints = KpointsData() - kpoints.set_cell_from_structure(structure) - reciprocal_cell = kpoints.reciprocal_cell - bands_kpoints_distance = calculate_bands_kpoints_distance(kpoints_distance) - - # dictionary with the 2D symmetry paths - selected_paths = { - "hexagonal": { - "path": [ - [0.0, 0.0, 0.0], - [0.5, 0.0, 0.0], - [0.33333, 0.33333, 0.0], - [1.0, 0.0, 0.0], - ], - "labels": [GAMMA, "M", "K", GAMMA], - }, - "square": { - "path": [ - [0.0, 0.0, 0.0], - [0.5, 0.0, 0.0], - [0.5, 0.5, 0.0], - [1.0, 0.0, 0.0], - ], - "labels": [GAMMA, "X", "M", GAMMA], - }, - "rectangular": { - "path": [ - [0.0, 0.0, 0.0], - [0.5, 0.0, 0.0], - [0.5, 0.5, 0.0], - [0.0, 0.5, 0.0], - [1.0, 0.0, 0.0], - ], - "labels": [GAMMA, "X", "S", "Y", GAMMA], - }, - } - # if the selected path is centered_rectangular or oblique, the path is calculated based on the reciprocal cell - if kpath_2d in ["centered_rectangular", "oblique"]: - a1 = reciprocal_cell[0] - a2 = reciprocal_cell[1] - norm_a1 = np.linalg.norm(a1) - norm_a2 = np.linalg.norm(a2) - cos_gamma = ( - a1.dot(a2) / (norm_a1 * norm_a2) - ) # Angle between a1 and a2 # like in https://pubs.acs.org/doi/10.1021/acs.jpclett.2c02972 - gamma = np.arccos(cos_gamma) - eta = (1 - (norm_a1 / norm_a2) * cos_gamma) / (2 * np.power(np.sin(gamma), 2)) - nu = 0.5 - (eta * norm_a2 * cos_gamma) / norm_a1 - selected_paths["centered_rectangular"] = { - "path": [ - [0.0, 0.0, 0.0], - [0.5, 0.0, 0.0], - [1 - eta, nu, 0], - [0.5, 0.5, 0.0], - [eta, 1 - nu, 0.0], - [1.0, 0.0, 0.0], - ], - "labels": [GAMMA, "X", "H_1", "C", "H", GAMMA], - } - selected_paths["oblique"] = { - "path": [ - [0.0, 0.0, 0.0], - [0.5, 0.0, 0.0], - [1 - eta, nu, 0], - [0.5, 0.5, 0.0], - [eta, 1 - nu, 0.0], - [0.0, 0.5, 0.0], - [1.0, 0.0, 0.0], - ], - "labels": [GAMMA, "X", "H_1", "C", "H", "Y", GAMMA], - } - path = selected_paths[kpath_2d]["path"] - labels = selected_paths[kpath_2d]["labels"] - branches = zip(path[:-1], path[1:]) - - all_kpoints = [] # List to hold all k-points - label_map = [] # List to hold labels and their corresponding k-point indices - - # Calculate the number of points per branch and generate the kpoints - index_offset = 0 # Start index for each segment - for (start, end), label_start, _label_end in zip(branches, labels[:-1], labels[1:]): - num_points_per_branch = points_per_branch( - start, end, reciprocal_cell, bands_kpoints_distance +def check_codes(pw_code, projwfc_code): + """Check that the codes are installed on the same computer.""" + if ( + not any( + [ + pw_code is None, + projwfc_code is None, + ] + ) + and len( + { + pw_code.computer.pk, + projwfc_code.computer.pk, + } + ) + != 1 + ): + raise ValueError( + "All selected codes must be installed on the same computer. This is because the " + "BandsWorkChain calculations rely on large files that are not retrieved by AiiDA." ) - # Exclude endpoint except for the last segment to prevent duplication - points = np.linspace(start, end, num=num_points_per_branch, endpoint=False) - all_kpoints.extend(points) - label_map.append( - (index_offset, label_start) - ) # Label for the start of the segment - index_offset += len(points) - - # Include the last point and its label - all_kpoints.append(path[-1]) - label_map.append((index_offset, labels[-1])) # Label for the last point - - # Set the kpoints and their labels in KpointsData - kpoints.set_kpoints(all_kpoints) - kpoints.labels = label_map - - return kpoints def update_resources(builder, codes): - set_component_resources(builder.scf.pw, codes.get("pw")) - set_component_resources(builder.bands.pw, codes.get("pw")) + if "bands" in builder: + set_component_resources(builder.bands.scf.pw, codes.get("pw")) + set_component_resources(builder.bands.bands.pw, codes.get("pw")) + elif "bands_projwfc" in builder: + set_component_resources(builder.bands_projwfc.scf.pw, codes.get("pw")) + set_component_resources(builder.bands_projwfc.bands.pw, codes.get("pw")) + set_component_resources( + builder.bands_projwfc.projwfc.projwfc, codes.get("projwfc_bands") + ) def get_builder(codes, structure, parameters, **kwargs): - """Get a builder for the PwBandsWorkChain.""" + """Get a builder for the BandsWorkChain.""" from copy import deepcopy pw_code = codes.get("pw")["code"] @@ -188,14 +56,25 @@ def get_builder(codes, structure, parameters, **kwargs): bands_overrides.pop("kpoints_distance", None) bands_overrides["pw"]["parameters"]["SYSTEM"].pop("smearing", None) bands_overrides["pw"]["parameters"]["SYSTEM"].pop("degauss", None) + + check_codes(pw_code, codes.get("projwfc_bands")["code"]) + overrides = { "scf": scf_overrides, "bands": bands_overrides, "relax": relax_overrides, } - bands = PwBandsWorkChain.get_builder_from_protocol( - code=pw_code, + + if parameters["bands"]["projwfc_bands"]: + simulation_mode = "fat_bands" + else: + simulation_mode = "normal" + + bands_builder = BandsWorkChain.get_builder_from_protocol( + pw_code=pw_code, + projwfc_code=codes.get("projwfc_bands")["code"], structure=structure, + simulation_mode=simulation_mode, protocol=protocol, electronic_type=ElectronicType(parameters["workchain"]["electronic_type"]), spin_type=SpinType(parameters["workchain"]["spin_type"]), @@ -203,44 +82,18 @@ def get_builder(codes, structure, parameters, **kwargs): overrides=overrides, **kwargs, ) + update_resources(bands_builder, codes) - if structure.pbc != (True, True, True): - kpoints_distance = parameters["advanced"]["kpoints_distance"] - if structure.pbc == (True, False, False): - kpoints = generate_kpath_1d(structure, kpoints_distance) - elif structure.pbc == (True, True, False): - kpoints = generate_kpath_2d( - structure, kpoints_distance, parameters["bands"]["kpath_2d"] - ) - bands.pop("bands_kpoints_distance") - bands.update({"bands_kpoints": kpoints}) - - # pop the inputs that are excluded from the expose_inputs - bands.pop("relax") - bands.pop("structure", None) - bands.pop("clean_workdir", None) - # update resources - update_resources(bands, codes) - - if scf_overrides["pw"]["parameters"]["SYSTEM"].get("tot_magnetization") is not None: - bands.scf["pw"]["parameters"]["SYSTEM"].pop("starting_magnetization", None) - bands.bands["pw"]["parameters"]["SYSTEM"].pop("starting_magnetization", None) - - return bands + return bands_builder def update_inputs(inputs, ctx): """Update the inputs using context.""" inputs.structure = ctx.current_structure - inputs.scf.pw.parameters = inputs.scf.pw.parameters.get_dict() - if ctx.current_number_of_bands: - inputs.scf.pw.parameters.setdefault("SYSTEM", {}).setdefault( - "nbnd", ctx.current_number_of_bands - ) workchain_and_builder = { - "workchain": PwBandsWorkChain, + "workchain": BandsWorkChain, "exclude": ("structure", "relax"), "get_builder": get_builder, "update_inputs": update_inputs, diff --git a/src/aiidalab_qe/plugins/electronic_structure/result.py b/src/aiidalab_qe/plugins/electronic_structure/result.py index 1142ae450..890e92c3a 100644 --- a/src/aiidalab_qe/plugins/electronic_structure/result.py +++ b/src/aiidalab_qe/plugins/electronic_structure/result.py @@ -19,10 +19,23 @@ def _update_view(self): except AttributeError: pdos_node = None - try: - bands_node = self.node.outputs.bands - except AttributeError: - bands_node = None + # Initialize bands_node to None by default + bands_node = None + + # Check if the workchain has the 'bands' output + if hasattr(self.node.outputs, "bands"): + bands_output = self.node.outputs.bands + + # Check for 'bands' or 'bands_projwfc' attributes within 'bands' output + if hasattr(bands_output, "bands"): + bands_node = bands_output.bands + elif hasattr(bands_output, "bands_projwfc"): + bands_node = bands_output.bands_projwfc + else: + # If neither 'bands' nor 'bands_projwfc' exist, use 'bands_output' itself + # This is the case for compatibility with older versions of the plugin + bands_node = bands_output + _bands_dos_widget = BandPdosWidget(bands=bands_node, pdos=pdos_node) # update the electronic structure tab self.children = [_bands_dos_widget] diff --git a/tests/conftest.py b/tests/conftest.py index c65842d28..20d9bae4e 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -90,6 +90,14 @@ def _generate_structure_data(name="silicon", pbc=(True, True, True)): for site in sites: structure.append_atom(position=site[2], symbols=site[0], name=site[1]) + + elif name == "MoS2": + cell = [[3.1922, 0, 0], [-1.5961, 2.7646, 0], [0, 0, 13.3783]] + structure = orm.StructureData(cell=cell) + structure.append_atom(position=(-0.0, 1.84, 10.03), symbols="Mo") + structure.append_atom(position=(1.6, 0.92, 8.47), symbols="S") + structure.append_atom(position=(1.6, 0.92, 11.6), symbols="S") + structure.pbc = pbc return structure @@ -289,6 +297,16 @@ def projwfc_code(aiida_local_code_factory): ) +@pytest.fixture +def projwfc_bands_code(aiida_local_code_factory): + """Return a `Code` configured for the projwfc.x executable.""" + return aiida_local_code_factory( + label="projwfc_bands", + executable="bash", + entry_point="quantumespresso.projwfc", + ) + + @pytest.fixture() def workchain_settings_generator(): """Return a function that generates a workchain settings dictionary.""" @@ -316,7 +334,7 @@ def _smearing_settings_generator(**kwargs): @pytest.fixture -def app(pw_code, dos_code, projwfc_code): +def app(pw_code, dos_code, projwfc_code, projwfc_bands_code): from aiidalab_qe.app.main import App # Since we use `qe_auto_setup=False`, which will skip the pseudo library installation @@ -329,10 +347,12 @@ def app(pw_code, dos_code, projwfc_code): app.submit_step.pw_code.code_selection.refresh() app.submit_step.codes["dos"].code_selection.refresh() app.submit_step.codes["projwfc"].code_selection.refresh() + app.submit_step.codes["projwfc_bands"].code_selection.refresh() app.submit_step.pw_code.value = pw_code.uuid app.submit_step.codes["dos"].value = dos_code.uuid app.submit_step.codes["projwfc"].value = projwfc_code.uuid + app.submit_step.codes["projwfc_bands"].value = projwfc_bands_code.uuid yield app @@ -558,17 +578,17 @@ def generate_bands_workchain( """Generate an instance of a the WorkChain.""" def _generate_bands_workchain(structure): - from copy import deepcopy - from aiida import engine from aiida.orm import Dict - from aiida_quantumespresso.workflows.pw.bands import PwBandsWorkChain + from aiidalab_qe.plugins.bands.bands_workchain import BandsWorkChain pseudo_family = f"SSSP/{SSSP_VERSION}/PBEsol/efficiency" inputs = { - "code": fixture_code("quantumespresso.pw"), + "pw_code": fixture_code("quantumespresso.pw"), + "projwfc_code": fixture_code("quantumespresso.projwfc"), "structure": structure, + "simulation_mode": "normal", "overrides": { "scf": { "pseudo_family": pseudo_family, @@ -586,20 +606,31 @@ def _generate_bands_workchain(structure): }, }, } - builder = PwBandsWorkChain.get_builder_from_protocol(**inputs) + builder = BandsWorkChain.get_builder_from_protocol(**inputs) inputs = builder._inputs() - inputs["relax"]["base_final_scf"] = deepcopy(inputs["relax"]["base"]) - wkchain = generate_workchain(PwBandsWorkChain, inputs) + wkchain = generate_workchain(BandsWorkChain, inputs) wkchain.setup() # run bands and return the process - output_parameters = Dict(dict={"fermi_energy": 2.0}) - output_parameters.store() - wkchain.out("scf_parameters", output_parameters) - wkchain.out("band_parameters", output_parameters) + fermi_dict = Dict(dict={"fermi_energy": 2.0}) + fermi_dict.store() + output_parameters = { + "bands": { + "scf_parameters": fermi_dict, + "band_parameters": fermi_dict, + } + } + + wkchain.out( + "bands.scf_parameters", output_parameters["bands"]["scf_parameters"] + ) + wkchain.out( + "bands.band_parameters", output_parameters["bands"]["band_parameters"] + ) + # band_structure = generate_bands_data() band_structure.store() - wkchain.out("band_structure", band_structure) + wkchain.out("bands.band_structure", band_structure) wkchain.update_outputs() # bands_node = wkchain.node @@ -616,6 +647,7 @@ def generate_qeapp_workchain( generate_workchain, generate_pdos_workchain, generate_bands_workchain, + fixture_code, ): """Generate an instance of the WorkChain.""" @@ -632,6 +664,7 @@ def _generate_qeapp_workchain( ): from copy import deepcopy + from aiida.orm import Dict from aiida.orm.utils.serialize import serialize from aiidalab_qe.app.configuration import ConfigureQeAppWorkChainStep from aiidalab_qe.app.submission import SubmitQeAppWorkChainStep @@ -677,13 +710,37 @@ def _generate_qeapp_workchain( # step 3 setup code and resources s3: SubmitQeAppWorkChainStep = app.submit_step s3.pw_code.num_cpus.value = 4 + builder = s3._create_builder() inputs = builder._inputs() inputs["relax"]["base_final_scf"] = deepcopy(inputs["relax"]["base"]) + + # Setting up inputs for bands_projwfc + inputs["bands"]["bands_projwfc"]["scf"]["pw"] = deepcopy( + inputs["bands"]["bands"]["scf"]["pw"] + ) + inputs["bands"]["bands_projwfc"]["bands"]["pw"] = deepcopy( + inputs["bands"]["bands"]["bands"]["pw"] + ) + inputs["bands"]["bands_projwfc"]["bands"]["pw"]["code"] = inputs["bands"][ + "bands" + ]["bands"]["pw"]["code"] + inputs["bands"]["bands_projwfc"]["scf"]["pw"]["code"] = inputs["bands"][ + "bands" + ]["scf"]["pw"]["code"] + + inputs["bands"]["bands_projwfc"]["projwfc"]["projwfc"]["code"] = fixture_code( + "quantumespresso.projwfc" + ) + inputs["bands"]["bands_projwfc"]["projwfc"]["projwfc"]["parameters"] = Dict( + {"PROJWFC": {"DeltaE": 0.01}} + ).store() + if run_bands: inputs["properties"].append("bands") if run_pdos: inputs["properties"].append("pdos") + wkchain = generate_workchain(QeAppWorkChain, inputs) wkchain.setup() # mock output @@ -697,11 +754,11 @@ def _generate_qeapp_workchain( wkchain.exposed_outputs(pdos.node, PdosWorkChain, namespace="pdos") ) if run_bands: - from aiida_quantumespresso.workflows.pw.bands import PwBandsWorkChain + from aiidalab_qe.plugins.bands.bands_workchain import BandsWorkChain bands = generate_bands_workchain(structure) wkchain.out_many( - wkchain.exposed_outputs(bands.node, PwBandsWorkChain, namespace="bands") + wkchain.exposed_outputs(bands.node, BandsWorkChain, namespace="bands") ) wkchain.update_outputs() # set ui_parameters diff --git a/tests/test_plugins_bands.py b/tests/test_plugins_bands.py index aaa34225a..00e7a75c8 100644 --- a/tests/test_plugins_bands.py +++ b/tests/test_plugins_bands.py @@ -39,15 +39,22 @@ def test_result(generate_qeapp_workchain): def test_structure_1d(generate_qeapp_workchain, generate_structure_data): structure = generate_structure_data("silicon", pbc=(True, False, False)) wkchain = generate_qeapp_workchain(structure=structure) - assert "bands_kpoints_distance" not in wkchain.inputs.bands - assert "bands_kpoints" in wkchain.inputs.bands - assert len(wkchain.inputs.bands.bands_kpoints.labels) == 2 + assert "bands_kpoints_distance" not in wkchain.inputs.bands.bands + assert "bands_kpoints" in wkchain.inputs.bands.bands + assert len(wkchain.inputs.bands.bands.bands_kpoints.labels) == 2 + assert wkchain.inputs.bands.bands.bands_kpoints.labels == [(0, "Γ"), (9, "X")] @pytest.mark.usefixtures("sssp") def test_structure_2d(generate_qeapp_workchain, generate_structure_data): - structure = generate_structure_data("silicon", pbc=(True, True, False)) + structure = generate_structure_data("MoS2", pbc=(True, True, False)) wkchain = generate_qeapp_workchain(structure=structure) - assert "bands_kpoints_distance" not in wkchain.inputs.bands - assert "bands_kpoints" in wkchain.inputs.bands - assert len(wkchain.inputs.bands.bands_kpoints.labels) == 4 + assert "bands_kpoints_distance" not in wkchain.inputs.bands.bands + assert "bands_kpoints" in wkchain.inputs.bands.bands + assert len(wkchain.inputs.bands.bands.bands_kpoints.labels) == 4 + assert wkchain.inputs.bands.bands.bands_kpoints.labels == [ + (0, "Γ"), + (11, "M"), + (18, "K"), + (31, "Γ"), + ] diff --git a/tests/test_submit_qe_workchain.py b/tests/test_submit_qe_workchain.py index b21f1e38f..181554392 100644 --- a/tests/test_submit_qe_workchain.py +++ b/tests/test_submit_qe_workchain.py @@ -73,8 +73,11 @@ def test_create_builder_insulator( # check and validate the builder got = builder_to_readable_dict(builder) - assert got["bands"]["scf"]["pw"]["parameters"]["SYSTEM"]["occupations"] == "fixed" - assert "smearing" not in got["bands"]["scf"]["pw"]["parameters"]["SYSTEM"] + assert ( + got["bands"]["bands"]["scf"]["pw"]["parameters"]["SYSTEM"]["occupations"] + == "fixed" + ) + assert "smearing" not in got["bands"]["bands"]["scf"]["pw"]["parameters"]["SYSTEM"] @pytest.mark.usefixtures("sssp") @@ -111,7 +114,7 @@ def test_create_builder_advanced_settings( # test tot_charge is updated in the three steps for parameters in [ got["relax"]["base"], - got["bands"]["scf"], + got["bands"]["bands"]["scf"], got["pdos"]["scf"], got["pdos"]["nscf"], ]: diff --git a/tests/test_submit_qe_workchain/test_create_builder_default.yml b/tests/test_submit_qe_workchain/test_create_builder_default.yml index 4b9f604cc..3ad9d35b7 100644 --- a/tests/test_submit_qe_workchain/test_create_builder_default.yml +++ b/tests/test_submit_qe_workchain/test_create_builder_default.yml @@ -20,7 +20,7 @@ advanced: vdw_corr: none pseudos: {} bands: - kpath_2d: hexagonal + projwfc_bands: false codes: dos: cpus: 1 @@ -34,6 +34,12 @@ codes: max_wallclock_seconds: 43200 nodes: 1 ntasks_per_node: 1 + projwfc_bands: + cpus: 1 + cpus_per_task: 1 + max_wallclock_seconds: 43200 + nodes: 1 + ntasks_per_node: 1 pw: cpus: 2 cpus_per_task: 1 From 73f2534503241837827cb8708af64e3226ef405b Mon Sep 17 00:00:00 2001 From: Miki Bonacci <46074008+mikibonacci@users.noreply.github.com> Date: Fri, 4 Oct 2024 11:32:18 +0200 Subject: [PATCH 136/166] Feature/clean button (#838) This fixes https://github.com/aiidalab/aiidalab-qe/issues/815 * Clean button added also, modified a bit the logic of kill button (hidden by default, as sometimes it is loaded - seen for a second - but not necessary) * Added minimal test for kill and clean button diplay. * Fixed hiding of the kill workchain button when process is_terminated * Changing a line, better implementation * Replacing double bool check with only one. --------- Co-authored-by: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> --- src/aiidalab_qe/app/result/__init__.py | 73 +++++++++++++++++++++++--- tests/test_result.py | 22 ++++++++ 2 files changed, 89 insertions(+), 6 deletions(-) diff --git a/src/aiidalab_qe/app/result/__init__.py b/src/aiidalab_qe/app/result/__init__.py index 9451a28ac..72742b0d8 100644 --- a/src/aiidalab_qe/app/result/__init__.py +++ b/src/aiidalab_qe/app/result/__init__.py @@ -52,14 +52,30 @@ def __init__(self, **kwargs): tooltip="Kill the below workchain.", button_style="danger", icon="window-close", - layout=ipw.Layout(width="120px", height="40px"), + layout=ipw.Layout(width="120px", height="40px", display="none"), ) self.kill_button.on_click(self._on_click_kill_button) + + self.clean_scratch_button = ipw.Button( + description="Clean remote data", + tooltip="Clean the remote folders of the workchain.", + button_style="danger", + icon="folder", + layout=ipw.Layout(width="150px", height="40px", display="none"), + ) + self.clean_scratch_button.on_click(self._on_click_clean_scratch_button) + self.process_info = ipw.HTML() super().__init__( [ - ipw.HBox(children=[self.kill_button, self.process_info]), + ipw.HBox( + children=[ + self.kill_button, + self.process_info, + self.clean_scratch_button, + ] + ), self.process_status, ], **kwargs, @@ -93,12 +109,14 @@ def _update_state(self): or process.is_failed ): self.state = self.State.FAIL - self.kill_button.layout.display = "none" self.process_info.value = PROCESS_EXCEPTED elif process.is_finished_ok: self.state = self.State.SUCCESS - self.kill_button.layout.display = "none" self.process_info.value = PROCESS_COMPLETED + # trigger the update of kill and clean button. + if self.state in [self.State.SUCCESS, self.State.FAIL]: + self._update_kill_button_layout() + self._update_clean_scratch_button_layout() def _update_kill_button_layout(self): """Update the layout of the kill button.""" @@ -107,8 +125,8 @@ def _update_kill_button_layout(self): self.kill_button.layout.display = "none" else: process = orm.load_node(self.process) - # If the process is finished or excepted, hide the button. - if process.is_finished or process.is_excepted: + # If the process is terminated, hide the button. + if process.is_terminated: self.kill_button.layout.display = "none" else: self.kill_button.layout.display = "block" @@ -120,6 +138,32 @@ def _update_kill_button_layout(self): else: self.kill_button.disabled = True + def _update_clean_scratch_button_layout(self): + """Update the layout of the kill button.""" + # The button is hidden by default, but if we load a new process, we hide again. + if not self.process: + self.clean_scratch_button.layout.display = "none" + else: + process = orm.load_node(self.process) + # If the process is terminated, show the button. + if process.is_terminated: + self.clean_scratch_button.layout.display = "block" + else: + self.clean_scratch_button.layout.display = "none" + + # If the scratch is already empty, we should deactivate the button. + # not sure about the performance if descendants are several. + cleaned_bool = [] + for called_descendant in process.called_descendants: + if isinstance(called_descendant, orm.CalcJobNode): + try: + cleaned_bool.append( + called_descendant.outputs.remote_folder.is_cleaned + ) + except (OSError, KeyError): + pass + self.clean_scratch_button.disabled = all(cleaned_bool) + def _on_click_kill_button(self, _=None): """callback for the kill button. First kill the process, then update the kill button layout. @@ -130,6 +174,22 @@ def _on_click_kill_button(self, _=None): # update the kill button layout self._update_kill_button_layout() + def _on_click_clean_scratch_button(self, _=None): + """callback for the clean scratch button. + First clean the remote folders, then update the clean button layout. + """ + process = orm.load_node(self.process) + + for called_descendant in process.called_descendants: + if isinstance(called_descendant, orm.CalcJobNode): + try: + called_descendant.outputs.remote_folder._clean() + except (OSError, KeyError): + pass + + # update the kill button layout + self._update_clean_scratch_button_layout() + @tl.observe("process") def _observe_process(self, _): """Callback for when the process is changed.""" @@ -137,3 +197,4 @@ def _observe_process(self, _): # as the self.state is updated in the _update_state method. self._update_state() self._update_kill_button_layout() + self._update_clean_scratch_button_layout() diff --git a/tests/test_result.py b/tests/test_result.py index c6e087d17..cbeef97ed 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -1,3 +1,7 @@ +import pytest + + +@pytest.mark.usefixtures("sssp") def test_result_step(app_to_submit, generate_qeapp_workchain): """Test the result step is properly updated when the process is running.""" @@ -7,6 +11,21 @@ def test_result_step(app_to_submit, generate_qeapp_workchain): assert step.state == step.State.ACTIVE +@pytest.mark.usefixtures("sssp") +def test_kill_and_clean_buttons(app_to_submit, generate_qeapp_workchain): + """Test the kill and clean_scratch button are properly displayed when the process + is in different states.""" + + step = app_to_submit.results_step + step.process = generate_qeapp_workchain().node.uuid + step._update_state() + step._update_kill_button_layout() + step._update_clean_scratch_button_layout() + assert step.kill_button.layout.display == "block" + assert step.clean_scratch_button.layout.display == "none" + + +@pytest.mark.usefixtures("sssp") def test_workchainview(generate_qeapp_workchain): """Test the result tabs are properly updated""" from aiidalab_qe.app.result.workchain_viewer import WorkChainViewer @@ -18,6 +37,7 @@ def test_workchainview(generate_qeapp_workchain): assert wcv.result_tabs._titles["1"] == "Final Geometry" +@pytest.mark.usefixtures("sssp") def test_summary_report(data_regression, generate_qeapp_workchain): """Test the summary report can be properly generated.""" from aiidalab_qe.app.result.summary_viewer import SummaryView @@ -29,6 +49,7 @@ def test_summary_report(data_regression, generate_qeapp_workchain): data_regression.check(report) +@pytest.mark.usefixtures("sssp") def test_summary_report_advanced_settings(data_regression, generate_qeapp_workchain): """Test advanced settings are properly reported""" from aiidalab_qe.app.result.summary_viewer import SummaryView @@ -41,6 +62,7 @@ def test_summary_report_advanced_settings(data_regression, generate_qeapp_workch assert report["initial_magnetic_moments"]["Si"] == 0.1 +@pytest.mark.usefixtures("sssp") def test_summary_view(generate_qeapp_workchain): """Test the report html can be properly generated.""" from bs4 import BeautifulSoup From 9503aedb161251180aaeeb16b1ca9da9af6f2105 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Fri, 4 Oct 2024 15:31:38 +0200 Subject: [PATCH 137/166] Improvement/bandswidget sizewarning (#839) * Include an ipywidget Layout to the BandsPdosWidget to set an horizontal scroll bar --- src/aiidalab_qe/plugins/electronic_structure/result.py | 5 ++++- src/aiidalab_qe/plugins/pdos/result.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/aiidalab_qe/plugins/electronic_structure/result.py b/src/aiidalab_qe/plugins/electronic_structure/result.py index 890e92c3a..5210b51d4 100644 --- a/src/aiidalab_qe/plugins/electronic_structure/result.py +++ b/src/aiidalab_qe/plugins/electronic_structure/result.py @@ -1,5 +1,7 @@ """Electronic structure results view widgets""" +import ipywidgets as ipw + from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.common.panel import ResultPanel @@ -37,5 +39,6 @@ def _update_view(self): bands_node = bands_output _bands_dos_widget = BandPdosWidget(bands=bands_node, pdos=pdos_node) - # update the electronic structure tab + + _bands_dos_widget.layout = ipw.Layout(width="1000px") self.children = [_bands_dos_widget] diff --git a/src/aiidalab_qe/plugins/pdos/result.py b/src/aiidalab_qe/plugins/pdos/result.py index b20d58d47..6fd69d257 100644 --- a/src/aiidalab_qe/plugins/pdos/result.py +++ b/src/aiidalab_qe/plugins/pdos/result.py @@ -1,5 +1,7 @@ """PDOS results view widgets""" +import ipywidgets as ipw + from aiidalab_qe.common.bandpdoswidget import BandPdosWidget from aiidalab_qe.common.panel import ResultPanel @@ -21,5 +23,6 @@ def _update_view(self): _pdos_plot_view = BandPdosWidget(pdos=pdos_node) - # update the electronic structure tab + _pdos_plot_view.layout = ipw.Layout(width="1000px") + self.children = [_pdos_plot_view] From 860f59bd5b0a033a5bd5f28a5e6dd3732b384d86 Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Sat, 5 Oct 2024 08:48:21 +0200 Subject: [PATCH 138/166] Feature/handling molecules (#834) - Include the option molecule for StructureData editor - Band structure calculation should be disabled - Cell Optimizatio not available if structure is molecule - kpoint_distance should be disable and force [1,1,1] - Realoading an old workflow should restore normal behavior of app --- src/aiidalab_qe/app/configuration/__init__.py | 5 +++ src/aiidalab_qe/app/configuration/advanced.py | 45 ++++++++++++++++--- src/aiidalab_qe/app/configuration/workflow.py | 36 +++++++++++++++ src/aiidalab_qe/app/main.py | 1 + src/aiidalab_qe/app/result/summary_viewer.py | 1 + src/aiidalab_qe/common/widgets.py | 7 +-- src/aiidalab_qe/plugins/pdos/setting.py | 8 ++++ tests/configuration/test_advanced.py | 37 +++++++++++++++ tests/conftest.py | 7 +++ 9 files changed, 136 insertions(+), 11 deletions(-) diff --git a/src/aiidalab_qe/app/configuration/__init__.py b/src/aiidalab_qe/app/configuration/__init__.py index adebd3898..39f5f07ae 100644 --- a/src/aiidalab_qe/app/configuration/__init__.py +++ b/src/aiidalab_qe/app/configuration/__init__.py @@ -45,6 +45,11 @@ def __init__(self, **kwargs): (self.advanced_settings, "input_structure"), ) # + ipw.dlink( + (self, "input_structure"), + (self.workchain_settings, "input_structure"), + ) + # self.built_in_settings = [ self.workchain_settings, self.advanced_settings, diff --git a/src/aiidalab_qe/app/configuration/advanced.py b/src/aiidalab_qe/app/configuration/advanced.py index 2793d08e2..5df0e76cd 100644 --- a/src/aiidalab_qe/app/configuration/advanced.py +++ b/src/aiidalab_qe/app/configuration/advanced.py @@ -107,11 +107,7 @@ def __init__(self, default_protocol=None, **kwargs): style={"description_width": "initial"}, ) self.mesh_grid = ipw.HTML() - ipw.dlink( - (self.override, "value"), - (self.kpoints_distance, "disabled"), - lambda override: not override, - ) + self.create_kpoints_distance_link() self.kpoints_distance.observe(self._callback_value_set, "value") # Hubbard setting widget @@ -285,6 +281,20 @@ def __init__(self, default_protocol=None, **kwargs): # Default settings to trigger the callback self.reset() + def create_kpoints_distance_link(self): + """Create the dlink for override and kpoints_distance.""" + self.kpoints_distance_link = ipw.dlink( + (self.override, "value"), + (self.kpoints_distance, "disabled"), + lambda override: not override, + ) + + def remove_kpoints_distance_link(self): + """Remove the kpoints_distance_link.""" + if hasattr(self, "kpoints_distance_link"): + self.kpoints_distance_link.unlink() + del self.kpoints_distance_link + def _create_electron_maxstep_widgets(self): self.electron_maxstep = ipw.BoundedIntText( min=20, @@ -332,10 +342,22 @@ def _update_input_structure(self, change): self.hubbard_widget.update_widgets(change["new"]) if isinstance(self.input_structure, HubbardStructureData): self.override.value = True + if self.input_structure.pbc == (False, False, False): + self.kpoints_distance.value = 100.0 + self.kpoints_distance.disabled = True + if hasattr(self, "kpoints_distance_link"): + self.remove_kpoints_distance_link() + else: + # self.kpoints_distance.disabled = False + if not hasattr(self, "kpoints_distance_link"): + self.create_kpoints_distance_link() else: self.magnetization.input_structure = None self.pseudo_setter.structure = None self.hubbard_widget.update_widgets(None) + self.kpoints_distance.disabled = False + if not hasattr(self, "kpoints_distance_link"): + self.create_kpoints_distance_link() @tl.observe("electronic_type") def _electronic_type_changed(self, change): @@ -356,7 +378,14 @@ def _update_settings_from_protocol(self, protocol): parameters = PwBaseWorkChain.get_protocol_inputs(protocol) - self.kpoints_distance.value = parameters["kpoints_distance"] + if self.input_structure: + if self.input_structure.pbc == (False, False, False): + self.kpoints_distance.value = 100.0 + self.kpoints_distance.disabled = True + else: + self.kpoints_distance.value = parameters["kpoints_distance"] + else: + self.kpoints_distance.value = parameters["kpoints_distance"] num_atoms = len(self.input_structure.sites) if self.input_structure else 1 @@ -630,6 +659,10 @@ def reset(self): self.pseudo_setter._reset() else: self.pseudo_setter._reset() + if self.input_structure.pbc == (False, False, False): + self.kpoints_distance.value = 100.0 + self.kpoints_distance.disabled = True + # reset the magnetization self.magnetization.reset() # reset the hubbard widget diff --git a/src/aiidalab_qe/app/configuration/workflow.py b/src/aiidalab_qe/app/configuration/workflow.py index 408906ee5..cba0df521 100644 --- a/src/aiidalab_qe/app/configuration/workflow.py +++ b/src/aiidalab_qe/app/configuration/workflow.py @@ -4,7 +4,9 @@ """ import ipywidgets as ipw +import traitlets as tl +from aiida import orm from aiida_quantumespresso.common.types import RelaxType from aiidalab_qe.app.parameters import DEFAULT_PARAMETERS from aiidalab_qe.app.utils import get_entry_items @@ -49,6 +51,8 @@ class WorkChainSettings(Panel): with less precision and the "precise" protocol to aim at best accuracy (at the price of longer/costlier calculations).
    """ ) + input_structure = tl.Instance(orm.StructureData, allow_none=True) + def __init__(self, **kwargs): # RelaxType: degrees of freedom in geometry optimization self.relax_type = ipw.ToggleButtons( @@ -141,6 +145,37 @@ def update_reminder_info(change, name=name): **kwargs, ) + @tl.observe("input_structure") + def _on_input_structure_change(self, change): + """Update the relax type options based on the input structure.""" + structure = change["new"] + if structure is None or structure.pbc != (False, False, False): + self.relax_type.options = [ + ("Structure as is", "none"), + ("Atomic positions", "positions"), + ("Full geometry", "positions_cell"), + ] + # Ensure the value is in the options + if self.relax_type.value not in [ + option[1] for option in self.relax_type.options + ]: + self.relax_type.value = "positions_cell" + + self.properties["bands"].run.disabled = False + elif structure.pbc == (False, False, False): + self.relax_type.options = [ + ("Structure as is", "none"), + ("Atomic positions", "positions"), + ] + # Ensure the value is in the options + if self.relax_type.value not in [ + option[1] for option in self.relax_type.options + ]: + self.relax_type.value = "positions" + + self.properties["bands"].run.value = False + self.properties["bands"].run.disabled = True + def get_panel_value(self): # Work chain settings relax_type = self.relax_type.value @@ -192,6 +227,7 @@ def set_panel_value(self, parameters): def reset(self): """Reset the panel to the default value.""" + self.input_structure = None for key in ["relax_type", "spin_type", "electronic_type"]: getattr(self, key).value = DEFAULT_PARAMETERS["workchain"][key] self.workchain_protocol.value = DEFAULT_PARAMETERS["workchain"]["protocol"] diff --git a/src/aiidalab_qe/app/main.py b/src/aiidalab_qe/app/main.py index b02d4feb3..ab3d3d875 100644 --- a/src/aiidalab_qe/app/main.py +++ b/src/aiidalab_qe/app/main.py @@ -139,6 +139,7 @@ def _observe_process_selection(self, change): self.structure_step.structure = process.inputs.structure self.structure_step.confirm() self.submit_step.process = process + # set ui_parameters # print out error message if yaml format ui_parameters is not reachable ui_parameters = process.base.extras.get("ui_parameters", {}) diff --git a/src/aiidalab_qe/app/result/summary_viewer.py b/src/aiidalab_qe/app/result/summary_viewer.py index fca5db6a3..56fc24505 100644 --- a/src/aiidalab_qe/app/result/summary_viewer.py +++ b/src/aiidalab_qe/app/result/summary_viewer.py @@ -23,6 +23,7 @@ (True, True, True): "xyz", (True, True, False): "xy", (True, False, False): "x", + (False, False, False): "molecule", } VDW_CORRECTION_VERSION = { diff --git a/src/aiidalab_qe/common/widgets.py b/src/aiidalab_qe/common/widgets.py index 0d07650a2..5aaad1a7c 100644 --- a/src/aiidalab_qe/common/widgets.py +++ b/src/aiidalab_qe/common/widgets.py @@ -465,11 +465,7 @@ def __init__(self, title=""): layout={"width": "initial"}, ) self.periodicity = ipw.RadioButtons( - options=[ - "xyz", - "xy", - "x", - ], + options=["xyz", "xy", "x", "molecule"], value="xyz", description="Periodicty: ", layout={"width": "initial"}, @@ -613,6 +609,7 @@ def _select_periodicity(self, _=None): "xyz": (True, True, True), "xy": (True, True, False), "x": (True, False, False), + "molecule": (False, False, False), } new_structure = deepcopy(self.structure) new_structure.set_pbc(periodicity_options[self.periodicity.value]) diff --git a/src/aiidalab_qe/plugins/pdos/setting.py b/src/aiidalab_qe/plugins/pdos/setting.py index 60159d1b0..5ddc4c255 100644 --- a/src/aiidalab_qe/plugins/pdos/setting.py +++ b/src/aiidalab_qe/plugins/pdos/setting.py @@ -27,6 +27,8 @@ def __init__(self, **kwargs): self.description = ipw.HTML( """
    By default, the tetrahedron method is used for PDOS calculation. If required you can apply Gaussian broadening with a custom degauss value. +
    + For molecules and systems with localized orbitals, it is recommended to use a custom degauss value.
    """ ) # nscf kpoints setting widget @@ -87,6 +89,12 @@ def _procotol_changed(self, change): @tl.observe("input_structure") def _update_structure(self, _=None): self._display_mesh() + # For molecules this is compulsory + if self.input_structure and self.input_structure.pbc == (False, False, False): + self.nscf_kpoints_distance.value = 100 + self.nscf_kpoints_distance.disabled = True + self.use_pdos_degauss.value = True + self.use_pdos_degauss.disabled = True def _display_mesh(self, _=None): if self.input_structure is None: diff --git a/tests/configuration/test_advanced.py b/tests/configuration/test_advanced.py index 7891db223..0a177460c 100644 --- a/tests/configuration/test_advanced.py +++ b/tests/configuration/test_advanced.py @@ -95,6 +95,43 @@ def test_advanced_kpoints_settings(): assert w.value.get("kpoints_distance") == 0.5 +def test_advanced_molecule_settings(generate_structure_data): + """Test kpoint setting of advanced setting widget.""" + from aiidalab_qe.app.configuration.advanced import AdvancedSettings + + w = AdvancedSettings() + + # Check the disable of is bind to override switch + assert w.kpoints_distance.disabled is True + + w.override.value = True + assert w.kpoints_distance.disabled is False + + # create molecule + structure = generate_structure_data(name="H2O", pbc=(False, False, False)) + # Assign the molecule + w.input_structure = structure + + # Check override can not modify the kpoints_distance + assert w.kpoints_distance.disabled is True + w.override.value = True + assert w.kpoints_distance.disabled is True + + # Confirm the value of kpoints_distance is fixed + assert w.value.get("kpoints_distance") == 100.0 + + w.protocol = "fast" + assert w.value.get("kpoints_distance") == 100.0 + + # # Check reset + w.input_structure = None + w.reset() + + # # the protocol will not be reset + assert w.protocol == "fast" + assert w.value.get("kpoints_distance") == 0.5 + + def test_advanced_tot_charge_settings(): """Test TotCharge widget.""" from aiidalab_qe.app.configuration.advanced import AdvancedSettings diff --git a/tests/conftest.py b/tests/conftest.py index 20d9bae4e..844021450 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -98,6 +98,13 @@ def _generate_structure_data(name="silicon", pbc=(True, True, True)): structure.append_atom(position=(1.6, 0.92, 8.47), symbols="S") structure.append_atom(position=(1.6, 0.92, 11.6), symbols="S") + elif name == "H2O": + cell = [[10.0, 0.0, 0.0], [0.0, 10.0, 0.0], [0.0, 0.0, 10.0]] + structure = orm.StructureData(cell=cell) + structure.append_atom(position=(0.0, 0.0, 0.0), symbols="H") + structure.append_atom(position=(0.0, 0.0, 1.0), symbols="O") + structure.append_atom(position=(0.0, 1.0, 0.0), symbols="H") + structure.pbc = pbc return structure From 4c19d245b6645773fe8b37e3abf1fb9e0413c9ba Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Mon, 7 Oct 2024 18:19:16 +0200 Subject: [PATCH 139/166] update labels for fat_bands (#842) --- src/aiidalab_qe/common/bandpdoswidget.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/aiidalab_qe/common/bandpdoswidget.py b/src/aiidalab_qe/common/bandpdoswidget.py index e76de7673..51b737318 100644 --- a/src/aiidalab_qe/common/bandpdoswidget.py +++ b/src/aiidalab_qe/common/bandpdoswidget.py @@ -628,7 +628,8 @@ def __init__(self, bands=None, pdos=None, **kwargs): # Set the event handlers self.download_button.on_click(self.download_data) self.update_plot_button.on_click(self._update_plot) - # self.proj_bands_width_slider.observe(self._update_plot, names='value') + self.proj_bands_width_slider.observe(self._update_plot, names="value") + self.project_bands_box.observe(self._update_plot, names="value") self.dos_atoms_group.observe(self._update_plot, names="value") self.dos_plot_group.observe(self._update_plot, names="value") @@ -888,6 +889,10 @@ def get_bands_projections_data( bands_data["projected_bands"] = _prepare_projections_to_plot( bands_data, projections, bands_width ) + if plot_tag != "total": + bands_data["projected_bands"] = update_pdos_labels( + bands_data["projected_bands"] + ) return bands_data @@ -1287,7 +1292,9 @@ def get_labels_radial_nodes(pdos_dict): original_labels = [] orbital_dict = {} - for label_data in pdos_dict["dos"]: + label_data_list = pdos_dict["dos"] if "dos" in pdos_dict else pdos_dict + for label_data in label_data_list: + # for label_data in pdos_dict["dos"]: label_str = label_data["label"] original_labels.append(label_str) @@ -1439,7 +1446,8 @@ def update_pdos_labels(pdos_data): orbital_assignment = assign_orbital_labels(orbital_dict) updated_labels = get_new_pdos_labels(original_labels, orbital_assignment) + label_data_list = pdos_data["dos"] if "dos" in pdos_data else pdos_data for idx, label in enumerate(updated_labels): - pdos_data["dos"][idx]["label"] = label + label_data_list[idx]["label"] = label return pdos_data From 14e50090a296ebadbb8badc6925435f6080d1a83 Mon Sep 17 00:00:00 2001 From: Miki Bonacci <46074008+mikibonacci@users.noreply.github.com> Date: Tue, 8 Oct 2024 10:20:58 +0200 Subject: [PATCH 140/166] Add backward compatibility of the clean_button and exception catching (#847) --- src/aiidalab_qe/app/result/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/aiidalab_qe/app/result/__init__.py b/src/aiidalab_qe/app/result/__init__.py index 72742b0d8..8b83364ce 100644 --- a/src/aiidalab_qe/app/result/__init__.py +++ b/src/aiidalab_qe/app/result/__init__.py @@ -158,9 +158,9 @@ def _update_clean_scratch_button_layout(self): if isinstance(called_descendant, orm.CalcJobNode): try: cleaned_bool.append( - called_descendant.outputs.remote_folder.is_cleaned + called_descendant.outputs.remote_folder.is_empty ) - except (OSError, KeyError): + except Exception: pass self.clean_scratch_button.disabled = all(cleaned_bool) @@ -184,7 +184,7 @@ def _on_click_clean_scratch_button(self, _=None): if isinstance(called_descendant, orm.CalcJobNode): try: called_descendant.outputs.remote_folder._clean() - except (OSError, KeyError): + except Exception: pass # update the kill button layout From 6101655c4fd194270cd2b9c487509900f408a42c Mon Sep 17 00:00:00 2001 From: Miki Bonacci <46074008+mikibonacci@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:28:57 +0200 Subject: [PATCH 141/166] Features/warning long calc (#840) This fixes https://github.com/aiidalab/aiidalab-qe/issues/816 * Displaying the warning message if resources are not enough. The check and the message were already there, but not triggered/shown. * Modification for the warning message. * Adding also volume check, for low dimensional system can be useful. * Refining warning messages - not on localhost but big system and CPUs<4 - same as above, but on localhost - on localhost and more than 1 CPUs (we may not have enough slots) * adding self.input_structure check * Warning messages modified as suggested * Adding tests for warning messages --------- Co-authored-by: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> --- src/aiidalab_qe/app/submission/__init__.py | 86 ++++++++++++++++------ tests/conftest.py | 8 ++ tests/test_submit_qe_workchain.py | 56 ++++++++++++++ 3 files changed, 126 insertions(+), 24 deletions(-) diff --git a/src/aiidalab_qe/app/submission/__init__.py b/src/aiidalab_qe/app/submission/__init__.py index a7787341a..2cf0eda95 100644 --- a/src/aiidalab_qe/app/submission/__init__.py +++ b/src/aiidalab_qe/app/submission/__init__.py @@ -7,7 +7,6 @@ import ipywidgets as ipw import traitlets as tl -from IPython.display import display from aiida import orm from aiida.common import NotExistent @@ -53,6 +52,7 @@ class SubmitQeAppWorkChainStep(ipw.VBox, WizardAppWidgetStep): # Warn the user if they are trying to run calculations for a large # structure on localhost. RUN_ON_LOCALHOST_NUM_SITES_WARN_THRESHOLD = 10 + RUN_ON_LOCALHOST_VOLUME_WARN_THRESHOLD = 1000 # \AA^3 # Put a limit on how many MPI tasks you want to run per k-pool by default MAX_MPI_PER_POOL = 20 @@ -65,8 +65,8 @@ class SubmitQeAppWorkChainStep(ipw.VBox, WizardAppWidgetStep): external_submission_blockers = tl.List(tl.Unicode()) def __init__(self, qe_auto_setup=True, **kwargs): - self.message_area = ipw.Output() self._submission_blocker_messages = ipw.HTML() + self._submission_warning_messages = ipw.HTML() self.pw_code = PwCodeResourceSetupWidget( description="pw.x:", default_calc_job_plugin="quantumespresso.pw" @@ -129,10 +129,10 @@ def __init__(self, qe_auto_setup=True, **kwargs): super().__init__( children=[ *self.code_children, - self.message_area, self.sssp_installation_status, self.qe_setup_status, self._submission_blocker_messages, + self._submission_warning_messages, self.process_label_help, self.process_label, self.process_description, @@ -143,6 +143,10 @@ def __init__(self, qe_auto_setup=True, **kwargs): # set default codes self.set_selected_codes(DEFAULT_PARAMETERS["codes"]) + # observe these two for the resource checking: + self.pw_code.num_cpus.observe(self._check_resources, "value") + self.pw_code.num_nodes.observe(self._check_resources, "value") + @tl.observe("internal_submission_blockers", "external_submission_blockers") def _observe_submission_blockers(self, _change): """Observe the submission blockers and update the message area.""" @@ -222,48 +226,82 @@ def _auto_select_code(self, change): _ALERT_MESSAGE = """
    × - × {message}
    """ def _show_alert_message(self, message, alert_class="info"): - with self.message_area: - display( - ipw.HTML( - self._ALERT_MESSAGE.format(alert_class=alert_class, message=message) - ) - ) + self._submission_warning_messages.value = self._ALERT_MESSAGE.format( + alert_class=alert_class, message=message + ) - def _check_resources(self): + @tl.observe("input_structure") + def _check_resources(self, _change=None): """Check whether the currently selected resources will be sufficient and warn if not.""" - if not self.pw_code.value: + if not self.pw_code.value or not self.input_structure: return # No code selected, nothing to do. - num_cpus = self.resources_config.num_cpus.value + num_cpus = self.pw_code.num_cpus.value * self.pw_code.num_nodes.value on_localhost = ( orm.load_node(self.pw_code.value).computer.hostname == "localhost" ) - if self.pw_code.value and on_localhost and num_cpus > 1: + num_sites = len(self.input_structure.sites) + volume = self.input_structure.get_cell_volume() + + if ( + self.input_structure + and not on_localhost + and ( + num_sites > self.RUN_ON_LOCALHOST_NUM_SITES_WARN_THRESHOLD + or volume > self.RUN_ON_LOCALHOST_VOLUME_WARN_THRESHOLD + ) + and num_cpus < 4 + ): + # Warning-1 self._show_alert_message( - "The selected code would be executed on the local host, but " - "the number of CPUs is larger than one. Please review " - "the configuration and consider to select a code that runs " - "on a larger system if necessary.", + f" Warning: The selected structure has a large number of atoms ({num_sites}) " + f"or a significant cell volume ({int(volume)} Å3), making it computationally demanding " + "to run at the localhost. Consider the following: " + "
      " + "
    • Increase the resources (CPUs should be equal or more than 4, if possible)
    • " + "
    • Review the configuration (e.g. choosing fast protocol - this will affect precision) " + "
    ", alert_class="warning", ) elif ( self.input_structure and on_localhost - and len(self.input_structure.sites) - > self.RUN_ON_LOCALHOST_NUM_SITES_WARN_THRESHOLD + and ( + num_sites > self.RUN_ON_LOCALHOST_NUM_SITES_WARN_THRESHOLD + or volume > self.RUN_ON_LOCALHOST_VOLUME_WARN_THRESHOLD + ) + and num_cpus < 4 ): + # Warning-2 + self._show_alert_message( + f" Warning: The selected structure has a large number of atoms ({num_sites}) " + f"or a significant cell volume ({int(volume)} Å3), making it computationally demanding " + "to run in a reasonable amount of time. Consider the following: " + "
      " + "
    • Select a code that runs on a larger machine
    • " + "
    • Increase the resources (CPUs should be equal or more than 4, if possible)
    • " + "
    • Consider to review the configuration (e.g. choosing fast protocol - this will affect precision) " + "
    ", + alert_class="warning", + ) + elif on_localhost and num_cpus > 1: + # Warning-3 self._show_alert_message( - "The selected code would be executed on the local host, but the " - "number of sites of the selected structure is relatively large. " - "Consider to select a code that runs on a larger system if " - "necessary.", + " Warning: the selected pw.x code will run on the local host, but " + "the number of CPUs is larger than one. Please be sure that your local " + "environment has enough free CPUs for the calculation. Consider the following: " + "
      " + "
    • Consider to reduce the number of CPUs to avoid the overloading of the local machine " + "
    • Select a code that runs on a larger machine
    • " + "
    ", alert_class="warning", ) + else: + self._submission_warning_messages.value = "" @tl.observe("state") def _observe_state(self, change): diff --git a/tests/conftest.py b/tests/conftest.py index 844021450..c05067b76 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -105,6 +105,14 @@ def _generate_structure_data(name="silicon", pbc=(True, True, True)): structure.append_atom(position=(0.0, 0.0, 1.0), symbols="O") structure.append_atom(position=(0.0, 1.0, 0.0), symbols="H") + elif name == "H2O-larger": + # just a larger supercell. To test the warning messages + cell = [[20.0, 0.0, 0.0], [0.0, 20.0, 0.0], [0.0, 0.0, 20.0]] + structure = orm.StructureData(cell=cell) + structure.append_atom(position=(0.0, 0.0, 0.0), symbols="H") + structure.append_atom(position=(0.0, 0.0, 1.0), symbols="O") + structure.append_atom(position=(0.0, 1.0, 0.0), symbols="H") + structure.pbc = pbc return structure diff --git a/tests/test_submit_qe_workchain.py b/tests/test_submit_qe_workchain.py index 181554392..6f54d1ee1 100644 --- a/tests/test_submit_qe_workchain.py +++ b/tests/test_submit_qe_workchain.py @@ -132,6 +132,62 @@ def test_create_builder_advanced_settings( ) +@pytest.mark.usefixtures("sssp") +def test_warning_messages( + generate_structure_data, + submit_app_generator, +): + """ "Test the creation of the workchain builder. + + metal, non-magnetic + """ + + app = submit_app_generator(properties=["bands", "pdos"]) + submit_step = app.submit_step + submit_step.codes["pw"].num_cpus.value = 1 + submit_step._check_resources() + # no warning: + assert submit_step._submission_warning_messages.value == "" + + # now we increase the resources, so we should have the Warning-3 + submit_step.codes["pw"].num_cpus.value = 8 + submit_step._check_resources() + message = ( + " Warning: the selected pw.x code will run on the local host, but " + "the number of CPUs is larger than one. Please be sure that your local " + "environment has enough free CPUs for the calculation. Consider the following: " + "
      " + "
    • Consider to reduce the number of CPUs to avoid the overloading of the local machine " + "
    • Select a code that runs on a larger machine
    • " + "
    " + ) + assert ( + submit_step._submission_warning_messages.value + == submit_step._ALERT_MESSAGE.format(alert_class="warning", message=message) + ) + + # now we use a large structure, so we should have the Warning-1 (and 2 if not on localhost) + structure = generate_structure_data("H2O-larger") + submit_step.input_structure = structure + num_sites, volume = len(structure.sites), structure.get_cell_volume() + submit_step.codes["pw"].num_cpus.value = 1 + submit_step._check_resources() + message = ( + f" Warning: The selected structure has a large number of atoms ({num_sites}) " + f"or a significant cell volume ({int(volume)} Å3), making it computationally demanding " + "to run in a reasonable amount of time. Consider the following: " + "
      " + "
    • Select a code that runs on a larger machine
    • " + "
    • Increase the resources (CPUs should be equal or more than 4, if possible)
    • " + "
    • Consider to review the configuration (e.g. choosing fast protocol - this will affect precision) " + "
    " + ) + assert ( + submit_step._submission_warning_messages.value + == submit_step._ALERT_MESSAGE.format(alert_class="warning", message=message) + ) + + def builder_to_readable_dict(builder): """transverse the builder and return a dictionary with readable values.""" from aiida import orm From ad726337c3f2e1fa24fcc46fb8458f04726ca016 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Tue, 8 Oct 2024 16:01:43 +0200 Subject: [PATCH 142/166] Show result tabs immediately when the process is finished. (#844) Use the process monitor with the `on_sealed` callbacks to update the workchain viewer when the process is finished. Since the callback functions are run in another thread, we should avoid using the AiiDA node directly inside the callback. We load the AiiDA node using the process uuid instead. --- .../app/result/workchain_viewer.py | 38 +++++++++++-------- tests/test_plugins_electronic_structure.py | 5 +++ tests/test_result.py | 4 ++ 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/src/aiidalab_qe/app/result/workchain_viewer.py b/src/aiidalab_qe/app/result/workchain_viewer.py index e0de4de48..dff95c155 100644 --- a/src/aiidalab_qe/app/result/workchain_viewer.py +++ b/src/aiidalab_qe/app/result/workchain_viewer.py @@ -25,13 +25,14 @@ @register_viewer_widget("process.workflow.workchain.WorkChainNode.") class WorkChainViewer(ipw.VBox): _results_shown = tl.Set() + process_uuid = tl.Unicode(allow_none=True) def __init__(self, node, **kwargs): if node.process_label != "QeAppWorkChain": super().__init__() return - self.node = node + self.process_uuid = node.uuid # In the new version of the plugin, the ui_parameters are stored as a yaml string # which is then converted to a dictionary ui_parameters = node.base.extras.get("ui_parameters", {}) @@ -41,12 +42,12 @@ def __init__(self, node, **kwargs): self.title = ipw.HTML( f"""
    -

    QE App Workflow (pk: {self.node.pk}) — - {self.node.inputs.structure.get_formula()} +

    QE App Workflow (pk: {node.pk}) — + {node.inputs.structure.get_formula()}

    """ ) - self.workflows_summary = SummaryView(self.node) + self.workflows_summary = SummaryView(node) self.summary_tab = ipw.VBox(children=[self.workflows_summary]) # Only the summary tab is shown by default @@ -59,7 +60,7 @@ def __init__(self, node, **kwargs): self.results = {} entries = get_entry_items("aiidalab_qe.properties", "result") for identifier, entry_point in entries.items(): - result = entry_point(self.node) + result = entry_point(node) self.results[identifier] = result self.results[identifier].identifier = identifier @@ -83,29 +84,36 @@ def toggle_camera(): toggle_camera() self.result_tabs.observe(on_selected_index_change, "selected_index") - self._update_view() super().__init__( children=[self.title, self.result_tabs], **kwargs, ) - self._process_monitor = ProcessMonitor( - process=self.node, - callbacks=[ + self.process_monitor = ProcessMonitor( + timeout=1.0, + on_sealed=[ self._update_view, ], ) + ipw.dlink((self, "process_uuid"), (self.process_monitor, "value")) + + @property + def node(self): + """Load the workchain node using the process_uuid. + Because the workchain node is used in another thread inside the process monitor, + we need to load the node from the database, instead of passing the node object. + Otherwise, we will get a "Instance is not persistent" error. + """ + return orm.load_node(self.process_uuid) def _update_view(self): with self.hold_trait_notifications(): - if self.node.is_finished: + node = self.node + if node.is_finished: self._show_workflow_output() # if the structure is present in the workchain, # the structure tab will be added. - if ( - "structure" not in self._results_shown - and "structure" in self.node.outputs - ): + if "structure" not in self._results_shown and "structure" in node.outputs: self._show_structure() self.result_tabs.children += (self.structure_tab,) # index of the last tab @@ -119,7 +127,7 @@ def _update_view(self): if result.identifier not in self._results_shown: # check if the all required results are in the outputs results_ready = [ - label in self.node.outputs for label in result.workchain_labels + label in node.outputs for label in result.workchain_labels ] if all(results_ready): result._update_view() diff --git a/tests/test_plugins_electronic_structure.py b/tests/test_plugins_electronic_structure.py index c64c4e778..f25351563 100644 --- a/tests/test_plugins_electronic_structure.py +++ b/tests/test_plugins_electronic_structure.py @@ -1,5 +1,7 @@ def test_electronic_structure(generate_qeapp_workchain): """Test the electronic structure tab.""" + import time + import plotly.graph_objects as go from aiida import engine @@ -10,7 +12,10 @@ def test_electronic_structure(generate_qeapp_workchain): wkchain = generate_qeapp_workchain() wkchain.node.set_exit_status(0) wkchain.node.set_process_state(engine.ProcessState.FINISHED) + wkchain.node.seal() wcv = WorkChainViewer(wkchain.node) + # wait for the tabs to be updated by the process monitor + time.sleep(3) # find the tab with the identifier "electronic_structure" # the built-in summary and structure tabs is not a plugin panel, # thus don't have identifiers diff --git a/tests/test_result.py b/tests/test_result.py index cbeef97ed..60b1ba34a 100644 --- a/tests/test_result.py +++ b/tests/test_result.py @@ -28,10 +28,14 @@ def test_kill_and_clean_buttons(app_to_submit, generate_qeapp_workchain): @pytest.mark.usefixtures("sssp") def test_workchainview(generate_qeapp_workchain): """Test the result tabs are properly updated""" + import time + from aiidalab_qe.app.result.workchain_viewer import WorkChainViewer wkchain = generate_qeapp_workchain() + wkchain.node.seal() wcv = WorkChainViewer(wkchain.node) + time.sleep(3) assert len(wcv.result_tabs.children) == 5 assert wcv.result_tabs._titles["0"] == "Workflow Summary" assert wcv.result_tabs._titles["1"] == "Final Geometry" From a7721426fa62fe031ed0af79f59e2e4760d61d14 Mon Sep 17 00:00:00 2001 From: Xing Wang Date: Wed, 9 Oct 2024 12:02:47 +0200 Subject: [PATCH 143/166] Replace workchain selector with the `Job History` button (#849) Merge the job list page into the app by adding a `Job History` button on the top so that the user can switch between the calculation and the job list page. * Add job list into the app wrapper * Remove work_chain_selector * Remove the header of the wizard app, and add a button to start a new calculation by opening a new qe app page. * lazy loading of job list --- qe.ipynb | 11 ++++---- src/aiidalab_qe/app/main.py | 33 +++++++++++++++--------- src/aiidalab_qe/app/utils/search_jobs.py | 24 +++++++++++------ src/aiidalab_qe/app/wrapper.py | 32 +++++++++++++++++++++++ tests/test_app.py | 4 +-- 5 files changed, 77 insertions(+), 27 deletions(-) diff --git a/qe.ipynb b/qe.ipynb index 58e173278..0ec99c175 100644 --- a/qe.ipynb +++ b/qe.ipynb @@ -89,13 +89,14 @@ "url = urlparse.urlsplit(jupyter_notebook_url) # noqa F821\n", "query = urlparse.parse_qs(url.query)\n", "\n", - "app_with_work_chain_selector = App(qe_auto_setup=True)\n", - "# if a pk is provided in the query string, set it as the value of the work_chain_selector\n", + "app = App(qe_auto_setup=True)\n", + "# if a pk is provided in the query string, set it as the process of the app\n", "if \"pk\" in query:\n", - " pk = int(query[\"pk\"][0])\n", - " app_with_work_chain_selector.work_chain_selector.value = pk\n", + " pk = query[\"pk\"][0]\n", + " app.process = pk\n", "\n", - "view.main.children = [app_with_work_chain_selector]" + "view.main.children = [app]\n", + "view.app = app" ] }, { diff --git a/src/aiidalab_qe/app/main.py b/src/aiidalab_qe/app/main.py index ab3d3d875..471cba3f0 100644 --- a/src/aiidalab_qe/app/main.py +++ b/src/aiidalab_qe/app/main.py @@ -4,19 +4,23 @@ """ import ipywidgets as ipw +import traitlets as tl +from IPython.display import Javascript, display from aiida.orm import load_node from aiidalab_qe.app.configuration import ConfigureQeAppWorkChainStep from aiidalab_qe.app.result import ViewQeAppWorkChainStatusAndResultsStep from aiidalab_qe.app.structure import StructureSelectionStep from aiidalab_qe.app.submission import SubmitQeAppWorkChainStep -from aiidalab_qe.common import QeAppWorkChainSelector from aiidalab_widgets_base import WizardAppWidget, WizardAppWidgetStep class App(ipw.VBox): """The main widget that combines all the application steps together.""" + # The PK or UUID of the work chain node. + process = tl.Union([tl.Unicode(), tl.Int()], allow_none=True) + def __init__(self, qe_auto_setup=True): # Create the application steps self.structure_step = StructureSelectionStep(auto_advance=True) @@ -64,23 +68,27 @@ def __init__(self, qe_auto_setup=True): ("Status & Results", self.results_step), ] ) + # hide the header + self._wizard_app_widget.children[0].layout.display = "none" self._wizard_app_widget.observe(self._observe_selected_index, "selected_index") - # Add process selection header - self.work_chain_selector = QeAppWorkChainSelector( - layout=ipw.Layout(width="auto") + # Add a button to start a new calculation + self.new_work_chains_button = ipw.Button( + description="Start New Calculation", + tooltip="Open a new page to start a separate calculation", + button_style="success", + icon="plus-circle", + layout=ipw.Layout(width="30%"), ) - self.work_chain_selector.observe(self._observe_process_selection, "value") - ipw.dlink( - (self.submit_step, "process"), - (self.work_chain_selector, "value"), - transform=lambda node: None if node is None else node.pk, - ) + def on_button_click(_): + display(Javascript("window.open('./qe.ipynb', '_blank')")) + + self.new_work_chains_button.on_click(on_button_click) super().__init__( children=[ - self.work_chain_selector, + self.new_work_chains_button, self._wizard_app_widget, ] ) @@ -119,7 +127,8 @@ def _observe_selected_index(self, change): ) self.submit_step.external_submission_blockers = blockers - def _observe_process_selection(self, change): + @tl.observe("process") + def _observe_process(self, change): from aiida.orm.utils.serialize import deserialize_unsafe if change["old"] == change["new"]: diff --git a/src/aiidalab_qe/app/utils/search_jobs.py b/src/aiidalab_qe/app/utils/search_jobs.py index d13271010..4288630a8 100644 --- a/src/aiidalab_qe/app/utils/search_jobs.py +++ b/src/aiidalab_qe/app/utils/search_jobs.py @@ -1,18 +1,20 @@ -import ipywidgets as ipw -import pandas as pd -from IPython.display import display - -from aiida.orm import QueryBuilder -from aiidalab_qe.workflows import QeAppWorkChain - - class QueryInterface: def __init__(self): + pass + + def setup_table(self): + import ipywidgets as ipw + self.df = self.load_data() self.table = ipw.HTML() self.setup_widgets() def load_data(self): + import pandas as pd + + from aiida.orm import QueryBuilder + from aiidalab_qe.workflows import QeAppWorkChain + projections = [ "id", "extras.structure", @@ -70,6 +72,8 @@ def load_data(self): ] def setup_widgets(self): + import ipywidgets as ipw + self.css_style = """ """ - unique_properties = set(self.df["Properties"].explode()) + unique_properties = set(self.df["Properties"].explode().dropna()) unique_properties.discard(None) property_checkboxes = [ ipw.Checkbox( From ef677e75ae306bcaf36504d89288cc7bfaf2c38b Mon Sep 17 00:00:00 2001 From: AndresOrtegaGuerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Tue, 29 Oct 2024 11:30:53 +0100 Subject: [PATCH 160/166] Layout axes remain the same after update_plot methods is called (#904) * increasing fat_bands_slide/ removing spline --- src/aiidalab_qe/common/bandpdoswidget.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/aiidalab_qe/common/bandpdoswidget.py b/src/aiidalab_qe/common/bandpdoswidget.py index c471b3150..ea95f932a 100644 --- a/src/aiidalab_qe/common/bandpdoswidget.py +++ b/src/aiidalab_qe/common/bandpdoswidget.py @@ -744,12 +744,24 @@ def _update_plot(self, _=None): else: self.pdos_data = self._get_pdos_data() self.bands_data = self._get_bands_data() + + # Get current axis range + xaxis_range = list(self.bandsplot_widget.layout["xaxis"]["range"]) + yaxis_range = list(self.bandsplot_widget.layout["yaxis"]["range"]) + self.bandsplot_widget = BandPdosPlotly( bands_data=self.bands_data, pdos_data=self.pdos_data, project_bands=self.project_bands_box.value, ).bandspdosfigure self._clear_output_and_display(self.bandsplot_widget) + + # Restore Old axis range. I do it after the plot is displayed to the Reset button always return to the Default SETTINGs + if self.bands_data: + self.bandsplot_widget.plotly_relayout({"yaxis.range": yaxis_range}) + if self.pdos_data and not self.bands_data: + self.bandsplot_widget.plotly_relayout({"xaxis.range": xaxis_range}) + self.proj_bands_width_slider.layout.visibility = ( "visible" if self.project_bands_box.value else "hidden" ) From 2787397f3e33a15be4ae913105c979b7efd1b8b9 Mon Sep 17 00:00:00 2001 From: Andres Ortega-Guerrero <34098967+AndresOrtegaGuerrero@users.noreply.github.com> Date: Thu, 31 Oct 2024 12:37:51 +0100 Subject: [PATCH 161/166] using ui_parameters to set the report (#910) * using base.attributes.get(value) --- src/aiidalab_qe/app/result/summary_viewer.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/aiidalab_qe/app/result/summary_viewer.py b/src/aiidalab_qe/app/result/summary_viewer.py index 56fc24505..8b2e8be25 100644 --- a/src/aiidalab_qe/app/result/summary_viewer.py +++ b/src/aiidalab_qe/app/result/summary_viewer.py @@ -105,7 +105,9 @@ def generate_report_parameters(qeapp_wc): energy_cutoff_wfc = pw_parameters["SYSTEM"]["ecutwfc"] energy_cutoff_rho = pw_parameters["SYSTEM"]["ecutrho"] occupation = pw_parameters["SYSTEM"]["occupations"] - scf_kpoints_distance = qeapp_wc.inputs.relax.base.kpoints_distance.value + scf_kpoints_distance = ( + qeapp_wc.inputs.relax.base.kpoints_distance.base.attributes.get("value") + ) report.update( { "energy_cutoff_wfc": energy_cutoff_wfc, @@ -146,7 +148,7 @@ def generate_report_parameters(qeapp_wc): if "pdos" in qeapp_wc.inputs: report["nscf_kpoints_distance"] = ( - qeapp_wc.inputs.pdos.nscf.kpoints_distance.value + qeapp_wc.inputs.pdos.nscf.kpoints_distance.base.attributes.get("value") ) return report From 924ae5f812b42c83ec3cba08a3b0b6081b50fdca Mon Sep 17 00:00:00 2001 From: Peter Gillespie <55498719+PNOGillespie@users.noreply.github.com> Date: Thu, 31 Oct 2024 19:41:11 +0000 Subject: [PATCH 162/166] XAS: Move Startup Logic to `_update_structure()` (#806) --- src/aiidalab_qe/plugins/xas/setting.py | 93 +++++++++++++------------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/src/aiidalab_qe/plugins/xas/setting.py b/src/aiidalab_qe/plugins/xas/setting.py index 165143295..3e75bd2ad 100644 --- a/src/aiidalab_qe/plugins/xas/setting.py +++ b/src/aiidalab_qe/plugins/xas/setting.py @@ -64,54 +64,6 @@ def _download_extract_pseudo_archive(func): tarfil.extractall(target_dir) -url = f"{base_url}" -for func in functionals: - target_dir = f"{head_path}/{dir_header}/{func}" - os.makedirs(target_dir, exist_ok=True) - archive_filename = f"{func}_ch_pseudos.tgz" - archive_found = False - for entry in os.listdir(target_dir): - if entry == archive_filename: - archive_found = True - if not archive_found: - _download_extract_pseudo_archive(func) - - -# Check all the pseudos/core-wfc data files in the TOC dictionary -# and load/check all of them before proceeding. Note that this -# approach relies on there not being multiple instances of nodes -# with the same label. -for func in functionals: - gipaw_pseudo_dict = pseudo_data_dict[func]["gipaw_pseudos"] - core_wfc_dict = pseudo_data_dict[func]["core_wavefunction_data"] - core_hole_pseudo_dict = pseudo_data_dict[func]["core_hole_pseudos"] - main_path = f"{head_path}/{dir_header}/{func}" - core_wfc_dir = f"{main_path}/core_wfc_data" - gipaw_dir = f"{main_path}/gipaw_pseudos" - ch_pseudo_dir = f"{main_path}/ch_pseudos/star1s" - # First, check that the local directories contain what's in the pseudo_toc - for pseudo_dir, pseudo_dict in zip( - [gipaw_dir, core_wfc_dir, ch_pseudo_dir], - [gipaw_pseudo_dict, core_wfc_dict, core_hole_pseudo_dict], - ): - pseudo_toc_mismatch = os.listdir(pseudo_dir) != pseudo_dict.values() - - # Re-download the relevant archive if there is a mismatch - if pseudo_toc_mismatch: - _download_extract_pseudo_archive(func) - - _load_or_import_nodes_from_filenames( - in_dict=gipaw_pseudo_dict, - path=gipaw_dir, - ) - _load_or_import_nodes_from_filenames( - in_dict=core_wfc_dict, path=core_wfc_dir, core_wfc_data=True - ) - _load_or_import_nodes_from_filenames( - in_dict=core_hole_pseudo_dict["1s"], path=ch_pseudo_dir - ) - - class Setting(Panel): title = "XAS Settings" identifier = "xas" @@ -260,6 +212,51 @@ def set_panel_value(self, input_dict): def _update_structure(self, _=None): self._update_element_select_panel() + for func in functionals: + target_dir = f"{head_path}/{dir_header}/{func}" + os.makedirs(target_dir, exist_ok=True) + archive_filename = f"{func}_ch_pseudos.tgz" + archive_found = False + for entry in os.listdir(target_dir): + if entry == archive_filename: + archive_found = True + if not archive_found: + _download_extract_pseudo_archive(func) + + # Check all the pseudos/core-wfc data files in the TOC dictionary + # and load/check all of them before proceeding. Note that this + # approach relies on there not being multiple instances of nodes + # with the same label. + for func in functionals: + gipaw_pseudo_dict = pseudo_data_dict[func]["gipaw_pseudos"] + core_wfc_dict = pseudo_data_dict[func]["core_wavefunction_data"] + core_hole_pseudo_dict = pseudo_data_dict[func]["core_hole_pseudos"] + main_path = f"{head_path}/{dir_header}/{func}" + core_wfc_dir = f"{main_path}/core_wfc_data" + gipaw_dir = f"{main_path}/gipaw_pseudos" + ch_pseudo_dir = f"{main_path}/ch_pseudos/star1s" + # First, check that the local directories contain what's in the pseudo_toc + for pseudo_dir, pseudo_dict in zip( + [gipaw_dir, core_wfc_dir, ch_pseudo_dir], + [gipaw_pseudo_dict, core_wfc_dict, core_hole_pseudo_dict], + ): + pseudo_toc_mismatch = os.listdir(pseudo_dir) != pseudo_dict.values() + + # Re-download the relevant archive if there is a mismatch + if pseudo_toc_mismatch: + _download_extract_pseudo_archive(func) + + _load_or_import_nodes_from_filenames( + in_dict=gipaw_pseudo_dict, + path=gipaw_dir, + ) + _load_or_import_nodes_from_filenames( + in_dict=core_wfc_dict, path=core_wfc_dir, core_wfc_data=True + ) + _load_or_import_nodes_from_filenames( + in_dict=core_hole_pseudo_dict["1s"], path=ch_pseudo_dir + ) + def _update_element_select_panel(self): if self.input_structure is None: return From b34e9971b0ce71003d9e0ef8d3829fe8d74a1bef Mon Sep 17 00:00:00 2001 From: Peter Gillespie <55498719+PNOGillespie@users.noreply.github.com> Date: Thu, 31 Oct 2024 19:59:30 +0000 Subject: [PATCH 163/166] XAS: Fix Conflict Between `tot_charge` Override and CH Protocol (#809) - Fixes a conflict between `tot_charge` being set explicitly in overrides by default and the XAS plugin assuming that `tot_charge` isn't specified in the overrides. - Adds a note to the documentation for the XAS plugin regarding charged systems and provides some suggestions for how to handle them. --- docs/source/howto/xas.rst | 13 +++++++++++++ src/aiidalab_qe/plugins/xas/workchain.py | 7 ++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/docs/source/howto/xas.rst b/docs/source/howto/xas.rst index 1e0ac2b36..e6273d333 100644 --- a/docs/source/howto/xas.rst +++ b/docs/source/howto/xas.rst @@ -167,6 +167,19 @@ Finally, click on the "Download CSV" button to the upper left of the plot area t * The normalised & weighted spectrum. (with respect to ratio of site multiplicity to total multiplicity) * The normalised & un-weighted spectrum. +Additional Note on Charged Systems +---------------------------------- +Computing XANES spectra for systems where a charge has been applied (in this case using the `Total charge` advanced setting) is possible using the tools +available in the QE App, however such workflows should always be tested by the user against experimental data if possible. + +When running XAS workflows for systems where a total charge has been applied, it is suggested to use the following settings for the total charge to ensure the corresponding +core-hole treatment is applied correctly: + +* "xch_fixed" or "xch_smear": Set the total charge as required for the system's charged ground-state. +* "full": **Increase** the total charge by 1 *relative* to the system's charged ground-state (e.g. set total charge = 2 in the advanced settings tab if the charge is normally 1). + +Note that for neutral systems (total charge = 0), the QE App will handle these settings automatically. + Summary ------- diff --git a/src/aiidalab_qe/plugins/xas/workchain.py b/src/aiidalab_qe/plugins/xas/workchain.py index b195a441a..9ad99c207 100644 --- a/src/aiidalab_qe/plugins/xas/workchain.py +++ b/src/aiidalab_qe/plugins/xas/workchain.py @@ -23,6 +23,11 @@ def update_resources(builder, codes): def get_builder(codes, structure, parameters, **kwargs): from copy import deepcopy + adv_parameters = deepcopy(parameters["advanced"]) + # Setting `tot_charge = 0` will cause FCH calculations to fail due to + # inputs being incorrect, thus we pop this from the overrides + if adv_parameters["pw"]["parameters"]["SYSTEM"].get("tot_charge") == 0: + adv_parameters["pw"]["parameters"]["SYSTEM"].pop("tot_charge") protocol = parameters["workchain"]["protocol"] xas_parameters = parameters["xas"] core_hole_treatments = xas_parameters["core_hole_treatments"] @@ -61,7 +66,7 @@ def get_builder(codes, structure, parameters, **kwargs): xs_code = codes["xspectra"]["code"] overrides = { "core": { - "scf": deepcopy(parameters["advanced"]), + "scf": adv_parameters, # PG: Here, we set a "variable" broadening scheme, which actually defines a constant broadening # The reason for this is that in "gamma_mode = constant", the Lorenzian broadening parameter # is defined by "xgamma" (in "PLOT"), but this parameter *also* controls the broadening value From 141a60e688b3b7daef61c6a080e9e335f75e4cc2 Mon Sep 17 00:00:00 2001 From: mikibonacci Date: Tue, 5 Nov 2024 16:23:38 +0000 Subject: [PATCH 164/166] Bump version v24.10.0a2 -> v24.10.0a3 --- docs/source/conf.py | 2 +- setup.cfg | 4 ++-- src/aiidalab_qe/version.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 598bdf807..49ec3f654 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -13,7 +13,7 @@ # -- Project information ----------------------------------------------------- -version = "v24.10.0a2" +version = "v24.10.0a3" release = f"{version}-dev" project = "Quantum ESPRESSO App" copyright_first_year = "2023" diff --git a/setup.cfg b/setup.cfg index 9612ca18f..e3d9a86ed 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = aiidalab_qe -version = 24.10.0a2 +version = 24.10.0a3 description = Package for the AiiDAlab QE app long_description = file: README.md long_description_content_type = text/markdown @@ -71,7 +71,7 @@ categories = quantum [bumpver] -current_version = "v24.10.0a2" +current_version = "v24.10.0a3" version_pattern = "v0Y.0M.PATCH[PYTAGNUM]" commit_message = "Bump version {old_version} -> {new_version}" commit = True diff --git a/src/aiidalab_qe/version.py b/src/aiidalab_qe/version.py index 38dd1ea08..0207c7e47 100644 --- a/src/aiidalab_qe/version.py +++ b/src/aiidalab_qe/version.py @@ -2,4 +2,4 @@ """This module contains project version information for both the app and the workflow.""" -__version__ = "v24.10.0a2" +__version__ = "v24.10.0a3" From d4da2d4e0589b28225521713dbd3869ec12c4484 Mon Sep 17 00:00:00 2001 From: Miki Bonacci <46074008+mikibonacci@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:04:43 +0100 Subject: [PATCH 165/166] Fixing the structure optimized info in the workflow summary (#882) * Fixing the structure optimized info in the workflow summary. * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/aiidalab_qe/app/result/summary_viewer.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/aiidalab_qe/app/result/summary_viewer.py b/src/aiidalab_qe/app/result/summary_viewer.py index 8b2e8be25..c0a64af02 100644 --- a/src/aiidalab_qe/app/result/summary_viewer.py +++ b/src/aiidalab_qe/app/result/summary_viewer.py @@ -57,7 +57,9 @@ def generate_report_parameters(qeapp_wc): if "workchain" not in ui_parameters: return {} report = { - "relaxed": ui_parameters["workchain"]["relax_type"], + "relaxed": None + if ui_parameters["workchain"]["relax_type"] == "none" + else ui_parameters["workchain"]["relax_type"], "relax_method": ui_parameters["workchain"]["relax_type"], "electronic_type": ui_parameters["workchain"]["electronic_type"], "material_magnetic": ui_parameters["workchain"]["spin_type"], From 2924582b373332cb1199affcc01751f3cf99e1f2 Mon Sep 17 00:00:00 2001 From: Miki Bonacci <46074008+mikibonacci@users.noreply.github.com> Date: Wed, 6 Nov 2024 13:53:42 +0100 Subject: [PATCH 166/166] fixing the download of a single QeAppWorkChain (#915) * This fixes https://github.com/aiidalab/aiidalab-qe/issues/914 * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- src/aiidalab_qe/app/result/utils/download_data.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/aiidalab_qe/app/result/utils/download_data.py b/src/aiidalab_qe/app/result/utils/download_data.py index da1f03960..ae276c437 100644 --- a/src/aiidalab_qe/app/result/utils/download_data.py +++ b/src/aiidalab_qe/app/result/utils/download_data.py @@ -146,7 +146,13 @@ def produce_bitestream(node, what="archive"): from aiida.tools.archive.create import create_archive path = pathlib.Path(dirpath) / "archive.aiida" - create_archive(entities=[reloaded_node], filename=path) + create_archive( + entities=[reloaded_node], + filename=path, + call_calc_backward=False, + call_work_backward=False, + create_backward=False, + ) with open(path, "rb") as f: zip_data = f.read()