From d74f08e5a57367c425549b2e2cdbafa61047792e Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Mon, 22 May 2023 10:49:51 +0200 Subject: [PATCH 01/61] chore(github): update workflows --- .github/workflows/release.yml | 144 ++++++++++++++++++++++++++++++++++ .github/workflows/shed.yml | 2 +- .github/workflows/tests.yml | 4 +- 3 files changed, 147 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..86725ab9 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,144 @@ +name: Release + +on: + schedule: + - cron: '0 0 * * 2' + +jobs: + + Diff: + runs-on: ubuntu-latest + outputs: + nb: ${{ steps.set-diff.outputs.nb }} + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + fetch-depth: 0 + ref: 'stable' + - name: "Check diff" + id: set-diff + run: | + nb=$(git diff --quiet stable..origin/main) + echo "nb=$nb" >> "${GITHUB_OUTPUT}" + + TagRaw: + runs-on: ubuntu-latest + needs: [Diff] + if: ${{ needs.Diff.outputs.nb > 0 }} + outputs: + tag: ${{ steps.tag_label.outputs.tag }} + changelog: ${{ steps.tag_raw.outputs.changelog }} + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + fetch-depth: 0 + - name: 'Bump version and push tag - dry run' + id: tag_raw + uses: mathieudutour/github-tag-action@v6.1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + release_branches: stable + tag_prefix: + dry_run: true + - name: 'Format tag' + id: tag_label + env: + TAG: ${{ steps.tag_raw.outputs.new_tag }} + run: | + TAG=$(echo "$TAG" | cut -f1 -d "-") + echo "tag=$TAG" >> "$GITHUB_OUTPUT" + + Changelog: + runs-on: ubuntu-latest + needs: [TagRaw] + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + fetch-depth: 0 + - name: 'Check file present' + run: | + [[ -f CHANGELOG.md ]] || touch CHANGELOG.md + - uses: ruby/setup-ruby@v1 + with: + ruby-version: 3 # Not needed with a .ruby-version file + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + - name: 'Generate CHANGELOG' + env: + CHANGELOG_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gem install github_changelog_generator + USER=$(echo "$GITHUB_REPOSITORY" | sed -e 's/\// /g' | awk '{print $1}') + PROJECT=$(echo "$GITHUB_REPOSITORY" | sed -e 's/\// /g' | awk '{print $2}') + echo "$USER $PROJECT" + github_changelog_generator --user "$USER" --project "$PROJECT" --no-unreleased + - name: 'Upload Artifact Changelog' + uses: actions/upload-artifact@v3 + with: + name: changelog-artifact + path: CHANGELOG.md + retention-days: 1 + + Commit: + needs: [Changelog] + runs-on: ubuntu-latest + steps: + # Get Data + - name: 'Checkout' + uses: actions/checkout@v3 + with: + persist-credentials: false + fetch-depth: 0 + - name: 'Download Artifact Changelog' + uses: actions/download-artifact@v3 + with: + name: changelog-artifact + # Commit + - name: 'Commit files' + run: | + git config --local user.email "$GITHUB_EMAIL" + git config --local user.name "$GITHUB_USERNAME" + git add . + git commit -m "doc(changelog): update" + env: + GITHUB_USERNAME: guillaume-gricourt + GITHUB_EMAIL: guipagui@gmail.com + - name: 'Push changes' + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: ${{ github.ref }} + - name: 'Update main branch' + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: main + + Tag: + needs: [Commit, TagRaw] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + fetch-depth: 0 + - name: 'Bump version and push tag' + id: tag + uses: mathieudutour/github-tag-action@v6.1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + release_branches: stable + custom_tag: ${{ needs.TagRaw.outputs.tag }} + tag_prefix: + + Release: + needs: [TagRaw, Tag] + runs-on: ubuntu-latest + steps: + - name: 'Create Release' + uses: softprops/action-gh-release@v1 + with: + tag_name: ${{ needs.TagRaw.outputs.tag }} + body: ${{ needs.TagRaw.outputs.changelog }} diff --git a/.github/workflows/shed.yml b/.github/workflows/shed.yml index 36d5ba5a..6ae99990 100644 --- a/.github/workflows/shed.yml +++ b/.github/workflows/shed.yml @@ -2,7 +2,7 @@ name: Shed on: schedule: - - cron: '0 0 * * 1' + - cron: '0 0 1 * *' # Run monthly jobs: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 0ceef656..888683f3 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -80,11 +80,11 @@ jobs: "tools/${{ matrix.repo }}" - name: 'Prepare artefact' run: | - zip -r -9 log.zip log + zip -r -9 log.zip "log/${{ matrix.repo }}" - name: 'Upload Artifact Version' uses: actions/upload-artifact@v3 with: - name: log-artifact + name: log-artifact-${{ matrix.repo }} path: log.zip - name: 'Aggregate results' run: | From 74597bdca6bed6b8236a81ad8552277619c25422 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Mon, 22 May 2023 11:07:58 +0200 Subject: [PATCH 02/61] chore(github): add CONTRIBUTING --- .github/CONTRIBUTING.md | 51 +++++++++++++++++++++++++++++++++++++++++ README.md | 14 ++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 .github/CONTRIBUTING.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 00000000..5c5bd886 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,51 @@ +# Contributing + +Contributions are welcome, and they are greatly appreciated! Every little bit helps, and credit will always be given. + +## Ways you can help + +### Report Bugs + +Report bugs at . + +If you are reporting a bug, please include: + +- Your operating system name and version, versions of synbiocad-galaxy-wrappers and the wrapper associated. +- Any details about your local setup that might be helpful in troubleshooting. +- Detailed steps to reproduce the bug. + +### Fix Bugs + +Look through the GitHub issues for bugs. Anything tagged with `bug` is open to whoever wants to implement it. + +### Implement Features + +Look through the GitHub issues for features. Anything tagged with `enhancement` is open to whoever wants to implement it. + +### Write Documentation + +Same as Implement Features + +### Submit Feedback + +The best way to send feedback is to file an issue at . + +If you are proposing a feature: + +- Explain in detail how it would work. +- Keep the scope as narrow as possible, to make it easier to implement. +- This will hopefully become a community-driven project and contributions are welcome :) + +## Pull Request Guidelines + +Open a Pull Request will trigger a bunch of tests checking: + +1. the `.shed.yml` file +2. the wrapper with `planemo` + +Add a reviewer: `@guillaume-gricourt` or `@breakthewall` or `@tduigou` +When the Pull Request will be closed, the wrapper will be updated in the following repository: +1. testtoolshed +2. toolshed + +This policy was modified from [planemo project](https://github.com/galaxyproject/planemo/blob/master/CONTRIBUTING.rst) diff --git a/README.md b/README.md index 78fc0b73..60d30d70 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ # SynBioCAD Galaxy Wrappers -To contribute, please visit the [documentation](https://github.com/brsynth/synbiocad-galaxy-docs). +This repository hosts the Galaxy wrappers maintained by the [brsynth group](https://github.com/brsynth). +All are deployed under the owner `@tduigou`. +The wrappers are synchronized to the [testtoolshed](http://testtoolshed.g2.bx.psu.edu) and the [main toolshed](http://toolshed.g2.bx.psu.edu). + +## Contribute + +### Members belonging to the group brsynth + +Please visit the [documentation](https://github.com/brsynth/synbiocad-galaxy-docs). + +### External members + +Please see [contributing](.github/CONTRIBUTING.md) From 05a43f73a0983ab10345063d31627c42f6c9636a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Mon, 22 May 2023 16:12:02 +0200 Subject: [PATCH 03/61] fix(get_sbml_model): rm 'parent' --- tools/get_sbml_model/get_infos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/get_sbml_model/get_infos.py b/tools/get_sbml_model/get_infos.py index 2e86170e..9a23a07f 100644 --- a/tools/get_sbml_model/get_infos.py +++ b/tools/get_sbml_model/get_infos.py @@ -72,7 +72,7 @@ def entry_point(): print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") else: try: - taxid = r.json()["parent"]["id"] + taxid = r.json()["id"] except KeyError: print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") with open(params.taxid, 'w') as f: From ce6583e5d3bab0048b7ade234694f1bc2a26b5f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Mon, 22 May 2023 16:52:38 +0200 Subject: [PATCH 04/61] chore(get_sbml_model): handle errors --- tools/get_sbml_model/get_infos.py | 32 +++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/tools/get_sbml_model/get_infos.py b/tools/get_sbml_model/get_infos.py index 9a23a07f..5523aee5 100644 --- a/tools/get_sbml_model/get_infos.py +++ b/tools/get_sbml_model/get_infos.py @@ -62,22 +62,26 @@ def entry_point(): try: hostname = r.json()["organism"] except KeyError: - print(f"*** Error: unable to retrieve host name for id {params.hostid}") - return -1 - # TAXON ID - server = 'https://rest.ensembl.org' - ext = f'/taxonomy/id/{hostname}?' - r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) - if not r.ok: - print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") + print(f"Warning: unable to retrieve host name for id {params.hostid}") + hostname = '' + if not hostname: + taxid = '' else: - try: - taxid = r.json()["id"] - except KeyError: + # TAXON ID + server = 'https://rest.ensembl.org' + ext = f'/taxonomy/id/{hostname}?' + r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) + if not r.ok: print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") - with open(params.taxid, 'w') as f: - f.write('#ID\n') - f.write(f'{taxid}\n') + else: + try: + taxid = r.json()["id"] + except KeyError: + print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") + taxid = '' + with open(params.taxid, 'w') as f: + f.write('#ID\n') + f.write(f'{taxid}\n') if __name__ == "__main__": From 34d0ed89122ef079541a7b8a4f42e968395fe457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Mon, 22 May 2023 16:55:01 +0200 Subject: [PATCH 05/61] fix(get_sbml_model): fix 'requests' version --- tools/get_sbml_model/get_sbml_model.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/get_sbml_model/get_sbml_model.xml b/tools/get_sbml_model/get_sbml_model.xml index 60f44998..64d5c8b9 100644 --- a/tools/get_sbml_model/get_sbml_model.xml +++ b/tools/get_sbml_model/get_sbml_model.xml @@ -4,12 +4,17 @@ curl gzip python-libsbml - requests + requests '$model'; - python '$__tool_directory__/'get_infos.py '$model' --hostid '$input' --comp '$compartments' --biomass '$biomass' --taxid '$taxid' + python '$__tool_directory__/'get_infos.py + '$model' + --hostid '$input' + --comp '$compartments' + --biomass '$biomass' + --taxid '$taxid' ]]> From 4a0b08beb8cdf51ab295a1f5f8c586d6bbaf5586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Mon, 22 May 2023 16:56:27 +0200 Subject: [PATCH 06/61] taxonid (#114) * fix(get_sbml_model): rm 'parent' * chore(get_sbml_model): handle errors * fix(get_sbml_model): fix 'requests' version --- tools/get_sbml_model/get_infos.py | 32 ++++++++++++++----------- tools/get_sbml_model/get_sbml_model.xml | 9 +++++-- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/tools/get_sbml_model/get_infos.py b/tools/get_sbml_model/get_infos.py index 2e86170e..5523aee5 100644 --- a/tools/get_sbml_model/get_infos.py +++ b/tools/get_sbml_model/get_infos.py @@ -62,22 +62,26 @@ def entry_point(): try: hostname = r.json()["organism"] except KeyError: - print(f"*** Error: unable to retrieve host name for id {params.hostid}") - return -1 - # TAXON ID - server = 'https://rest.ensembl.org' - ext = f'/taxonomy/id/{hostname}?' - r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) - if not r.ok: - print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") + print(f"Warning: unable to retrieve host name for id {params.hostid}") + hostname = '' + if not hostname: + taxid = '' else: - try: - taxid = r.json()["parent"]["id"] - except KeyError: + # TAXON ID + server = 'https://rest.ensembl.org' + ext = f'/taxonomy/id/{hostname}?' + r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) + if not r.ok: print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") - with open(params.taxid, 'w') as f: - f.write('#ID\n') - f.write(f'{taxid}\n') + else: + try: + taxid = r.json()["id"] + except KeyError: + print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") + taxid = '' + with open(params.taxid, 'w') as f: + f.write('#ID\n') + f.write(f'{taxid}\n') if __name__ == "__main__": diff --git a/tools/get_sbml_model/get_sbml_model.xml b/tools/get_sbml_model/get_sbml_model.xml index 60f44998..64d5c8b9 100644 --- a/tools/get_sbml_model/get_sbml_model.xml +++ b/tools/get_sbml_model/get_sbml_model.xml @@ -4,12 +4,17 @@ curl gzip python-libsbml - requests + requests '$model'; - python '$__tool_directory__/'get_infos.py '$model' --hostid '$input' --comp '$compartments' --biomass '$biomass' --taxid '$taxid' + python '$__tool_directory__/'get_infos.py + '$model' + --hostid '$input' + --comp '$compartments' + --biomass '$biomass' + --taxid '$taxid' ]]> From b87d547089fa9d3a919f75522afc40f981df26a9 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 23 May 2023 10:06:15 +0200 Subject: [PATCH 07/61] chore(github): workflow release --- .github/workflows/pr.yml | 2 ++ .github/workflows/release.yml | 21 +--------------- .github/workflows/release_schedule.yml | 35 ++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/release_schedule.yml diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index d855e8eb..07b6ca5a 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -136,3 +136,5 @@ jobs: - name: 'Main ToolShed' run: | planemo shed_update --force_repository_creation --shed_target toolshed --shed_key "${{ secrets.TOOLSHED }}" "tools/${{ matrix.repo }}" || planemo shed_update --force_repository_creation --shed_target toolshed --shed_key "${{ secrets.TOOLSHED }}" "tools/${{ matrix.repo }}" + - name: 'Create release' + uses: ./.github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 86725ab9..660dcdf8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,31 +1,12 @@ name: Release on: - schedule: - - cron: '0 0 * * 2' + workflow_call: jobs: - Diff: - runs-on: ubuntu-latest - outputs: - nb: ${{ steps.set-diff.outputs.nb }} - steps: - - uses: actions/checkout@v3 - with: - persist-credentials: false - fetch-depth: 0 - ref: 'stable' - - name: "Check diff" - id: set-diff - run: | - nb=$(git diff --quiet stable..origin/main) - echo "nb=$nb" >> "${GITHUB_OUTPUT}" - TagRaw: runs-on: ubuntu-latest - needs: [Diff] - if: ${{ needs.Diff.outputs.nb > 0 }} outputs: tag: ${{ steps.tag_label.outputs.tag }} changelog: ${{ steps.tag_raw.outputs.changelog }} diff --git a/.github/workflows/release_schedule.yml b/.github/workflows/release_schedule.yml new file mode 100644 index 00000000..1624e8d8 --- /dev/null +++ b/.github/workflows/release_schedule.yml @@ -0,0 +1,35 @@ +name: ReleaseSchedule + +on: + schedule: + - cron: '0 0 * * 2' + +jobs: + + Diff: + runs-on: ubuntu-latest + outputs: + nb: ${{ steps.set-diff.outputs.nb }} + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + fetch-depth: 0 + ref: 'stable' + - name: "Check diff" + id: set-diff + run: | + git diff --quiet stable..origin/main + echo "nb=$?" >> "${GITHUB_OUTPUT}" + + Call: + runs-on: ubuntu-latest + needs: [Diff] + if: ${{ needs.Diff.outputs.nb > 0 }} + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + fetch-depth: 0 + - name: 'Dispatch' + uses: ./.github/workflows/release.yml From 3f1bce23f8dbaee38bb19cb4b04e4237124da892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Tue, 23 May 2023 16:12:49 +0200 Subject: [PATCH 08/61] feat(selenzy_wrapper): give taxon ID via a file --- tools/selenzy_wrapper/selenzy_wrapper.xml | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/tools/selenzy_wrapper/selenzy_wrapper.xml b/tools/selenzy_wrapper/selenzy_wrapper.xml index 88d6231e..45ce71a7 100644 --- a/tools/selenzy_wrapper/selenzy_wrapper.xml +++ b/tools/selenzy_wrapper/selenzy_wrapper.xml @@ -12,7 +12,11 @@ --nb_targets '$adv.nb_targets' --d '$adv.direction' $adv.NoMSA - --host_taxID '$adv.host_taxID' + #if str($host_taxID_type_conditional.host_taxID_type) == "tsv": + --host_taxID `sed 1d ${host_taxID_type_conditional.host_taxID_file}` + #else: + --host_taxID '$host_taxID_type_conditional.host_taxID_int' + #end if #if str($adv.enzyme_taxIDs) != "": --enzyme_taxIDs '$adv.enzyme_taxIDs' #end if @@ -22,8 +26,20 @@ ]]> + + + + + + + + + + + + +
- From 45a7c182f39c67507b05e39509b865a04ecdd1f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Tue, 23 May 2023 16:16:00 +0200 Subject: [PATCH 09/61] chore(selenzy_wrapper): rm comment (#115) --- tools/selenzy_wrapper/selenzy_wrapper.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/selenzy_wrapper/selenzy_wrapper.xml b/tools/selenzy_wrapper/selenzy_wrapper.xml index 45ce71a7..9855ae8d 100644 --- a/tools/selenzy_wrapper/selenzy_wrapper.xml +++ b/tools/selenzy_wrapper/selenzy_wrapper.xml @@ -38,7 +38,6 @@ -
From fbfd016123e0abfb27b9756b857463c4da84c381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Tue, 23 May 2023 16:29:31 +0200 Subject: [PATCH 10/61] Taxonid (#116) * chore(selenzy_wrapper): rm comment * chore(selenzy-wrapper): rm config * chore(selenzy-wrapper): rename --- tools/selenzy_wrapper/.shed.yml | 2 +- tools/selenzy_wrapper/config/job_conf.xml | 1 - tools/selenzy_wrapper/config/tool_conf.xml | 3 --- 3 files changed, 1 insertion(+), 5 deletions(-) delete mode 100644 tools/selenzy_wrapper/config/job_conf.xml delete mode 100644 tools/selenzy_wrapper/config/tool_conf.xml diff --git a/tools/selenzy_wrapper/.shed.yml b/tools/selenzy_wrapper/.shed.yml index 23672ea4..85ce6bc7 100644 --- a/tools/selenzy_wrapper/.shed.yml +++ b/tools/selenzy_wrapper/.shed.yml @@ -6,7 +6,7 @@ long_description: 'Selenzy performs enzyme sequence selection from a reaction qu RetroRules(https://github.com/brsynth/RRParser). This feature makes this tool especially useful in combination with RetroPath2.0 (https://github.com/brsynth/RetroPath2-wrapper). Source code may be found at the following location: https://github.com/brsynth/selenzy-wrapper' -name: selenzy +name: selenzy-wrapper owner: tduigou homepage_url: https://github.com/brsynth/selenzy-wrapper remote_repository_url: https://github.com/brsynth/selenzy-wrapper diff --git a/tools/selenzy_wrapper/config/job_conf.xml b/tools/selenzy_wrapper/config/job_conf.xml deleted file mode 100644 index 59824328..00000000 --- a/tools/selenzy_wrapper/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/selenzy_wrapper/config/tool_conf.xml b/tools/selenzy_wrapper/config/tool_conf.xml deleted file mode 100644 index d843485f..00000000 --- a/tools/selenzy_wrapper/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
\ No newline at end of file From 71e08a724df679ce0b7e7e01d5994de9ea4012a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Tue, 23 May 2023 17:01:43 +0200 Subject: [PATCH 11/61] Taxonid (#117) * chore(selenzy_wrapper): rm comment * chore(selenzy-wrapper): rm config * chore(selenzy-wrapper): rename * chore(selenzy-wrapper): rename * chore(selenzy_wrapper): add test --- tools/selenzy_wrapper/.shed.yml | 2 +- tools/selenzy_wrapper/selenzy_wrapper.xml | 10 ++++++++++ tools/selenzy_wrapper/test-data/taxID.tsv | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 tools/selenzy_wrapper/test-data/taxID.tsv diff --git a/tools/selenzy_wrapper/.shed.yml b/tools/selenzy_wrapper/.shed.yml index 85ce6bc7..5633fdf8 100644 --- a/tools/selenzy_wrapper/.shed.yml +++ b/tools/selenzy_wrapper/.shed.yml @@ -6,7 +6,7 @@ long_description: 'Selenzy performs enzyme sequence selection from a reaction qu RetroRules(https://github.com/brsynth/RRParser). This feature makes this tool especially useful in combination with RetroPath2.0 (https://github.com/brsynth/RetroPath2-wrapper). Source code may be found at the following location: https://github.com/brsynth/selenzy-wrapper' -name: selenzy-wrapper +name: selenzy_wrapper owner: tduigou homepage_url: https://github.com/brsynth/selenzy-wrapper remote_repository_url: https://github.com/brsynth/selenzy-wrapper diff --git a/tools/selenzy_wrapper/selenzy_wrapper.xml b/tools/selenzy_wrapper/selenzy_wrapper.xml index 9855ae8d..43fa1e04 100644 --- a/tools/selenzy_wrapper/selenzy_wrapper.xml +++ b/tools/selenzy_wrapper/selenzy_wrapper.xml @@ -57,6 +57,16 @@ + + + + + + + + + + Date: Tue, 30 May 2023 10:59:44 +0200 Subject: [PATCH 12/61] chore(deps): bump tj-actions/changed-files from 35 to 36 (#120) Bumps [tj-actions/changed-files](https://github.com/tj-actions/changed-files) from 35 to 36. - [Release notes](https://github.com/tj-actions/changed-files/releases) - [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md) - [Commits](https://github.com/tj-actions/changed-files/compare/v35...v36) --- updated-dependencies: - dependency-name: tj-actions/changed-files dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/pr.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 07b6ca5a..17daa4d4 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -24,7 +24,7 @@ jobs: - name: 'Select modified files' id: files #uses: Ana06/get-changed-files@v2.2.0 - uses: tj-actions/changed-files@v35 + uses: tj-actions/changed-files@v36 with: files: tools/** separator: "," From a5b69fe4535111136076c9ee42dff64ce8088451 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 30 May 2023 11:03:44 +0200 Subject: [PATCH 13/61] fix(github): workflow syntax --- .github/workflows/release_schedule.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release_schedule.yml b/.github/workflows/release_schedule.yml index 1624e8d8..e909cd2f 100644 --- a/.github/workflows/release_schedule.yml +++ b/.github/workflows/release_schedule.yml @@ -20,7 +20,8 @@ jobs: id: set-diff run: | git diff --quiet stable..origin/main - echo "nb=$?" >> "${GITHUB_OUTPUT}" + nb=$? + echo "nb=$nb" >> "${GITHUB_OUTPUT}" Call: runs-on: ubuntu-latest From 1e01b679611d980f87089184e7d8a538b96d68c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Tue, 30 May 2023 22:58:47 +0200 Subject: [PATCH 14/61] chore: rm config folders (#118) * chore: rm config folders * fix(get_sbml_model): fix taxid md5 * fix(icfree): update test section * fix(rp2biosensor): udpate version, add --cache-dir arg * chore(github): skip `partsgenie` test * fix(github): missing files * fix(github): skip aggregate_results if test is skipped * fix(github): increase timeout * fix(github): skip temporarly `rpbasicdesign` --------- Co-authored-by: Guillaume Gricourt --- .github/workflows/pr.yml | 6 +++-- .github/workflows/test_skip.txt | 2 ++ .github/workflows/tests.yml | 4 +++- tools/dnabot/config/job_conf.xml | 1 - tools/dnabot/config/tool_conf.xml | 3 --- tools/dnaweaver/config/job_conf.xml | 1 - tools/dnaweaver/config/tool_conf.xml | 3 --- tools/doe_synbio/config/job_conf.xml | 1 - tools/doe_synbio/config/tool_conf.xml | 3 --- tools/get_sbml_model/config/job_conf.xml | 1 - tools/get_sbml_model/config/tool_conf.xml | 3 --- tools/get_sbml_model/get_sbml_model.xml | 2 +- tools/icfree/config/job_conf.xml | 1 - tools/icfree/config/tool_conf.xml | 6 ----- tools/icfree/instructor.xml | 16 +++++++------- tools/inchi_to_sink/config/job_conf.xml | 1 - tools/inchi_to_sink/config/tool_conf.xml | 3 --- tools/lcrgenie/config/job_conf.xml | 1 - tools/lcrgenie/config/tool_conf.xml | 3 --- tools/partsgenie/config/job_conf.xml | 1 - tools/partsgenie/config/tool_conf.xml | 3 --- tools/retropath2_wrapper/config/job_conf.xml | 1 - tools/retropath2_wrapper/config/tool_conf.xml | 3 --- tools/rp2biosensor/config/job_conf.xml | 1 - tools/rp2biosensor/config/tool_conf.xml | 3 --- tools/rp2biosensor/rp2biosensor.xml | 22 +++++-------------- tools/rp2paths/config/job_conf.xml | 1 - tools/rp2paths/config/tool_conf.xml | 3 --- tools/rpbasicdesign/config/job_conf.xml | 1 - tools/rpbasicdesign/config/tool_conf.xml | 3 --- tools/rrparser/config/job_conf.xml | 1 - tools/rrparser/config/tool_conf.xml | 3 --- tools/sbml2sbol/config/job_conf.xml | 1 - tools/sbml2sbol/config/tool_conf.xml | 3 --- tools/straindesign/config/job_conf.xml | 1 - tools/straindesign/config/tool_conf.xml | 5 ----- 36 files changed, 24 insertions(+), 93 deletions(-) delete mode 100644 tools/dnabot/config/job_conf.xml delete mode 100644 tools/dnabot/config/tool_conf.xml delete mode 100644 tools/dnaweaver/config/job_conf.xml delete mode 100644 tools/dnaweaver/config/tool_conf.xml delete mode 100644 tools/doe_synbio/config/job_conf.xml delete mode 100644 tools/doe_synbio/config/tool_conf.xml delete mode 100644 tools/get_sbml_model/config/job_conf.xml delete mode 100644 tools/get_sbml_model/config/tool_conf.xml delete mode 100644 tools/icfree/config/job_conf.xml delete mode 100644 tools/icfree/config/tool_conf.xml delete mode 100644 tools/inchi_to_sink/config/job_conf.xml delete mode 100644 tools/inchi_to_sink/config/tool_conf.xml delete mode 100644 tools/lcrgenie/config/job_conf.xml delete mode 100644 tools/lcrgenie/config/tool_conf.xml delete mode 100644 tools/partsgenie/config/job_conf.xml delete mode 100644 tools/partsgenie/config/tool_conf.xml delete mode 100644 tools/retropath2_wrapper/config/job_conf.xml delete mode 100644 tools/retropath2_wrapper/config/tool_conf.xml delete mode 100644 tools/rp2biosensor/config/job_conf.xml delete mode 100644 tools/rp2biosensor/config/tool_conf.xml delete mode 100644 tools/rp2paths/config/job_conf.xml delete mode 100644 tools/rp2paths/config/tool_conf.xml delete mode 100644 tools/rpbasicdesign/config/job_conf.xml delete mode 100644 tools/rpbasicdesign/config/tool_conf.xml delete mode 100644 tools/rrparser/config/job_conf.xml delete mode 100644 tools/rrparser/config/tool_conf.xml delete mode 100644 tools/sbml2sbol/config/job_conf.xml delete mode 100644 tools/sbml2sbol/config/tool_conf.xml delete mode 100644 tools/straindesign/config/job_conf.xml delete mode 100644 tools/straindesign/config/tool_conf.xml diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 17daa4d4..b02f18c0 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -85,7 +85,7 @@ jobs: ./scripts/shed_lint.py -i "tools/${{ matrix.repo }}" - name: 'Test tool' if: ${{ ! contains(fromJson(needs.skip.outputs.matrix), matrix.repo) }} - timeout-minutes: 60 + timeout-minutes: 120 continue-on-error: true run: | planemo test \ @@ -95,9 +95,10 @@ jobs: --galaxy_source https://github.com/galaxyproject/galaxy \ --galaxy_branch release_22.05 \ --galaxy_python_version 3.7 \ - "tools/${{ matrix.repo }}" || { touch tool_test_output.html tool_test_output.json; } + "tools/${{ matrix.repo }}" - name: 'Prepare artefact' run: | + touch tool_test_output.html tool_test_output.json zip -9 ${{ matrix.repo }}.zip tool_test_output.html tool_test_output.json - name: 'Upload Artifact Version' uses: actions/upload-artifact@v3 @@ -105,6 +106,7 @@ jobs: name: ${{ matrix.repo }}-artifact path: ${{ matrix.repo }}.zip - name: 'Aggregate results' + if: ${{ ! contains(fromJson(needs.skip.outputs.matrix), matrix.repo) }} run: | ./scripts/aggregate_test.py -i . diff --git a/.github/workflows/test_skip.txt b/.github/workflows/test_skip.txt index 56fe0bec..4512586d 100644 --- a/.github/workflows/test_skip.txt +++ b/.github/workflows/test_skip.txt @@ -1 +1,3 @@ retropath2_wrapper +rpbasicdesign +partsgenie diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 888683f3..95024bdd 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -65,7 +65,7 @@ jobs: ./scripts/shed_lint.py -i "tools/${{ matrix.repo }}" - name: 'Test tool' if: ${{ ! contains(fromJson(needs.skip.outputs.matrix), matrix.repo) }} - timeout-minutes: 60 + timeout-minutes: 120 continue-on-error: true run: | mkdir -p "log/${{ matrix.repo }}" @@ -80,6 +80,7 @@ jobs: "tools/${{ matrix.repo }}" - name: 'Prepare artefact' run: | + mkdir -p "log/${{ matrix.repo }}" zip -r -9 log.zip "log/${{ matrix.repo }}" - name: 'Upload Artifact Version' uses: actions/upload-artifact@v3 @@ -87,5 +88,6 @@ jobs: name: log-artifact-${{ matrix.repo }} path: log.zip - name: 'Aggregate results' + if: ${{ ! contains(fromJson(needs.skip.outputs.matrix), matrix.repo) }} run: | ./scripts/aggregate_test.py -i . diff --git a/tools/dnabot/config/job_conf.xml b/tools/dnabot/config/job_conf.xml deleted file mode 100644 index 074bb5ff..00000000 --- a/tools/dnabot/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/dnabot/config/tool_conf.xml b/tools/dnabot/config/tool_conf.xml deleted file mode 100644 index 2bd575fa..00000000 --- a/tools/dnabot/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/dnaweaver/config/job_conf.xml b/tools/dnaweaver/config/job_conf.xml deleted file mode 100644 index 26e6611b..00000000 --- a/tools/dnaweaver/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/dnaweaver/config/tool_conf.xml b/tools/dnaweaver/config/tool_conf.xml deleted file mode 100644 index 276006ba..00000000 --- a/tools/dnaweaver/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/doe_synbio/config/job_conf.xml b/tools/doe_synbio/config/job_conf.xml deleted file mode 100644 index 29e4469d..00000000 --- a/tools/doe_synbio/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/doe_synbio/config/tool_conf.xml b/tools/doe_synbio/config/tool_conf.xml deleted file mode 100644 index 0d0a82a0..00000000 --- a/tools/doe_synbio/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/get_sbml_model/config/job_conf.xml b/tools/get_sbml_model/config/job_conf.xml deleted file mode 100644 index a256854f..00000000 --- a/tools/get_sbml_model/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/get_sbml_model/config/tool_conf.xml b/tools/get_sbml_model/config/tool_conf.xml deleted file mode 100644 index 93afd9e7..00000000 --- a/tools/get_sbml_model/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/get_sbml_model/get_sbml_model.xml b/tools/get_sbml_model/get_sbml_model.xml index 64d5c8b9..c19e620a 100644 --- a/tools/get_sbml_model/get_sbml_model.xml +++ b/tools/get_sbml_model/get_sbml_model.xml @@ -78,7 +78,7 @@ - + diff --git a/tools/icfree/config/job_conf.xml b/tools/icfree/config/job_conf.xml deleted file mode 100644 index 7c88a103..00000000 --- a/tools/icfree/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/icfree/config/tool_conf.xml b/tools/icfree/config/tool_conf.xml deleted file mode 100644 index 38c31a44..00000000 --- a/tools/icfree/config/tool_conf.xml +++ /dev/null @@ -1,6 +0,0 @@ -
- - - - -
diff --git a/tools/icfree/instructor.xml b/tools/icfree/instructor.xml index 90f6342e..0ff386a3 100644 --- a/tools/icfree/instructor.xml +++ b/tools/icfree/instructor.xml @@ -37,10 +37,10 @@ --robot '$robot' --output-folder '.' && mv instructions.csv '$output_instruction' && - #if not os.path.isfile('volume_warning.tsv') - touch volume_warning.tsv && + #if not os.path.isfile('volumes_warnings.tsv') + touch volumes_warnings.tsv && #end if - mv volume_warning.tsv '$output_warning' + mv volumes_warnings.tsv '$output_warning' ]]> @@ -53,7 +53,7 @@ - + @@ -61,10 +61,10 @@ - - - - + + + + diff --git a/tools/inchi_to_sink/config/job_conf.xml b/tools/inchi_to_sink/config/job_conf.xml deleted file mode 100644 index 90fd0239..00000000 --- a/tools/inchi_to_sink/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/inchi_to_sink/config/tool_conf.xml b/tools/inchi_to_sink/config/tool_conf.xml deleted file mode 100644 index 29d37ee4..00000000 --- a/tools/inchi_to_sink/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/lcrgenie/config/job_conf.xml b/tools/lcrgenie/config/job_conf.xml deleted file mode 100644 index 0a375e2e..00000000 --- a/tools/lcrgenie/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/lcrgenie/config/tool_conf.xml b/tools/lcrgenie/config/tool_conf.xml deleted file mode 100644 index ac766f83..00000000 --- a/tools/lcrgenie/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/partsgenie/config/job_conf.xml b/tools/partsgenie/config/job_conf.xml deleted file mode 100644 index d76ec419..00000000 --- a/tools/partsgenie/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/partsgenie/config/tool_conf.xml b/tools/partsgenie/config/tool_conf.xml deleted file mode 100644 index 66363c79..00000000 --- a/tools/partsgenie/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/retropath2_wrapper/config/job_conf.xml b/tools/retropath2_wrapper/config/job_conf.xml deleted file mode 100644 index 116db138..00000000 --- a/tools/retropath2_wrapper/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/retropath2_wrapper/config/tool_conf.xml b/tools/retropath2_wrapper/config/tool_conf.xml deleted file mode 100644 index 8ec97bc6..00000000 --- a/tools/retropath2_wrapper/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/rp2biosensor/config/job_conf.xml b/tools/rp2biosensor/config/job_conf.xml deleted file mode 100644 index c135e571..00000000 --- a/tools/rp2biosensor/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/rp2biosensor/config/tool_conf.xml b/tools/rp2biosensor/config/tool_conf.xml deleted file mode 100644 index 0ad53392..00000000 --- a/tools/rp2biosensor/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/rp2biosensor/rp2biosensor.xml b/tools/rp2biosensor/rp2biosensor.xml index 606cf5ef..e17f73b0 100644 --- a/tools/rp2biosensor/rp2biosensor.xml +++ b/tools/rp2biosensor/rp2biosensor.xml @@ -1,8 +1,8 @@ - + Build Sensing-Enabling Metabolic Pathways from RetroPath2.0 output 0 - 3.1.0 + 3.2.1 rp2biosensor @@ -15,6 +15,7 @@ #if str($adv.json_graph) == "true" --ojson '$json_file' #end if + --cache-dir "\${TMPDIR:-.}" ]]> @@ -43,7 +44,7 @@
`_ the subnetwork of interest, linking the biosensor to the compound to be detected, and produce an interactive web page showing the transducing reactions. @@ -65,22 +66,11 @@ Output Optional: * **JSON file**\ : Output the graph as JSON file. - -Project Links ------------------- - -* `GitHub `_ - -License -------- - -* `MIT `_ - ]]> - + 10.1021/acssynbio.2c00138 -
\ No newline at end of file +
diff --git a/tools/rp2paths/config/job_conf.xml b/tools/rp2paths/config/job_conf.xml deleted file mode 100644 index 30042210..00000000 --- a/tools/rp2paths/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/rp2paths/config/tool_conf.xml b/tools/rp2paths/config/tool_conf.xml deleted file mode 100644 index 4242cb9e..00000000 --- a/tools/rp2paths/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/rpbasicdesign/config/job_conf.xml b/tools/rpbasicdesign/config/job_conf.xml deleted file mode 100644 index 326cc69e..00000000 --- a/tools/rpbasicdesign/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/rpbasicdesign/config/tool_conf.xml b/tools/rpbasicdesign/config/tool_conf.xml deleted file mode 100644 index 8ebe11f8..00000000 --- a/tools/rpbasicdesign/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/rrparser/config/job_conf.xml b/tools/rrparser/config/job_conf.xml deleted file mode 100644 index c0d779ec..00000000 --- a/tools/rrparser/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/rrparser/config/tool_conf.xml b/tools/rrparser/config/tool_conf.xml deleted file mode 100644 index 5c0c9561..00000000 --- a/tools/rrparser/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/sbml2sbol/config/job_conf.xml b/tools/sbml2sbol/config/job_conf.xml deleted file mode 100644 index a40bf1a0..00000000 --- a/tools/sbml2sbol/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/sbml2sbol/config/tool_conf.xml b/tools/sbml2sbol/config/tool_conf.xml deleted file mode 100644 index 5bc56da5..00000000 --- a/tools/sbml2sbol/config/tool_conf.xml +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/tools/straindesign/config/job_conf.xml b/tools/straindesign/config/job_conf.xml deleted file mode 100644 index fa7b339f..00000000 --- a/tools/straindesign/config/job_conf.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/tools/straindesign/config/tool_conf.xml b/tools/straindesign/config/tool_conf.xml deleted file mode 100644 index 5decfe1b..00000000 --- a/tools/straindesign/config/tool_conf.xml +++ /dev/null @@ -1,5 +0,0 @@ -
- - - -
From 00bca561a4d1aa67ea9dd9139c79d526a0878357 Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Mon, 5 Jun 2023 10:44:36 +0200 Subject: [PATCH 15/61] Workflows `basic_assembly_workflow` (#119) * feat(workflows): add one workflow --- .github/workflows/pr.yml | 2 +- .github/workflows/prworkflows.yml | 128 +++++ .../{test_skip.txt => test_tools_skip.txt} | 0 .github/workflows/test_workflows_skip.txt | 0 .../workflows/{tests.yml => testtools.yml} | 6 +- .github/workflows/testworkflows.yml | 82 ++++ .gitignore | 1 + scripts/upload_workflow.py | 54 +++ workflows/basic_assembly_workflow/.shed.yml | 12 + .../basic_assembly_workflow-job.yml | 11 + .../basic_assembly_workflow-tests.yml | 17 + .../basic_assembly_workflow.ga | 436 ++++++++++++++++++ .../test-data/dna_bot_scripts.tar | Bin 0 -> 174080 bytes 13 files changed, 745 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/prworkflows.yml rename .github/workflows/{test_skip.txt => test_tools_skip.txt} (100%) create mode 100644 .github/workflows/test_workflows_skip.txt rename .github/workflows/{tests.yml => testtools.yml} (97%) create mode 100644 .github/workflows/testworkflows.yml create mode 100755 scripts/upload_workflow.py create mode 100644 workflows/basic_assembly_workflow/.shed.yml create mode 100644 workflows/basic_assembly_workflow/basic_assembly_workflow-job.yml create mode 100644 workflows/basic_assembly_workflow/basic_assembly_workflow-tests.yml create mode 100644 workflows/basic_assembly_workflow/basic_assembly_workflow.ga create mode 100644 workflows/basic_assembly_workflow/test-data/dna_bot_scripts.tar diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index b02f18c0..e83fac63 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -50,7 +50,7 @@ jobs: - name: 'List repos' id: set-matrix run: | - matrix=$(jq -R -s -c '[split("\n")[] | select(.|length>0)]' .github/workflows/test_skip.txt) + matrix=$(jq -R -s -c '[split("\n")[] | select(.|length>0)]' .github/workflows/test_tools_skip.txt) echo "Number of repos: ${matrix}" echo "matrix=$matrix" >> "${GITHUB_OUTPUT}" diff --git a/.github/workflows/prworkflows.yml b/.github/workflows/prworkflows.yml new file mode 100644 index 00000000..36b44bc1 --- /dev/null +++ b/.github/workflows/prworkflows.yml @@ -0,0 +1,128 @@ +name: PullRequest + +on: + pull_request: + types: + - edited + - opened + - reopened + - synchronize + pull_request_target: + types: + - closed + +jobs: + + list: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + nb: ${{ steps.set-matrix.outputs.nb }} + steps: + - name: 'Checkout' + uses: actions/checkout@v3 + - name: 'Select modified files' + id: files + #uses: Ana06/get-changed-files@v2.2.0 + uses: tj-actions/changed-files@v36 + with: + files: tools/** + separator: "," + - name: 'List repos' + id: set-matrix + run: | + echo "list file modified" + echo ${{ steps.files.outputs.all_changed_and_modified_files }} + matrix=$(echo ${{ steps.files.outputs.all_changed_and_modified_files }} | jq -R -s -c 'split(",") | map(select(contains("workflows"))) | map(split("/")[1]) | sort | unique') + echo "list of repo: ${matrix}" + echo "matrix=$matrix" >> "${GITHUB_OUTPUT}" + nb=$(echo ${matrix} | jq -s -c '.[] | length') + echo "Number of repos: ${nb}" + echo "nb=$nb" >> "${GITHUB_OUTPUT}" + + skip: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: 'Checkout' + uses: actions/checkout@v3 + - name: 'List repos' + id: set-matrix + run: | + matrix=$(jq -R -s -c '[split("\n")[] | select(.|length>0)]' .github/workflows/test_workflows_skip.txt) + echo "Number of repos: ${matrix}" + echo "matrix=$matrix" >> "${GITHUB_OUTPUT}" + + test: + needs: [list, skip] + if: ${{ github.event.pull_request.merged == false && needs.list.outputs.nb > 0 }} + runs-on: ubuntu-latest + strategy: + max-parallel: 1 + matrix: + repo: ${{ fromJson(needs.list.outputs.matrix) }} + steps: + - name: 'Checkout' + uses: actions/checkout@v3 + - name: "Setup python" + uses: actions/setup-python@v4 + with: + python-version: '3.10' + cache: 'pip' # caching pip dependencies + cache-dependency-path: | + env/requirements.txt + - name: 'Install packages' + run: | + pip install -r env/requirements.txt + - name: 'Worfklow Lint' + run: | + planemo workflow_lint \ + --fail_level error \ + "workflows/${{ matrix.repo }}" + - name: 'Shed lint' + run: | + planemo shed_lint --urls --xsd --ensure_metadata "workflows/${{ matrix.repo }}" + ./scripts/shed_lint.py -i "workflows/${{ matrix.repo }}" + - name: 'Test tool' + if: ${{ ! contains(fromJson(needs.skip.outputs.matrix), matrix.repo) }} + timeout-minutes: 60 + run: | + echo "list workflows" + ls workflows + echo "list repo" + ls "workflows/${{ matrix.repo }}" + planemo test \ + --engine external_galaxy \ + --galaxy_url https://galaxy-synbiocad.org \ + --galaxy_user_key "${{ secrets.GG_SYNBIOCAD_TOKEN }}" \ + "workflows/${{ matrix.repo }}/${{ matrix.repo }}.ga" + + shed: + needs: list + if: ${{ github.event.pull_request.merged == true && needs.list.outputs.nb > 0 }} + runs-on: ubuntu-latest + continue-on-error: true + strategy: + max-parallel: 1 + matrix: + repo: ${{ fromJson(needs.list.outputs.matrix) }} + steps: + - name: 'Checkout' + uses: actions/checkout@v3 + - name: "Setup python" + uses: actions/setup-python@v4 + with: + python-version: '3.10' + cache: 'pip' # caching pip dependencies + cache-dependency-path: | + env/requirements.txt + - name: 'Install packages' + run: | + pip install -r env/requirements.txt + - name: 'Deploy' + run: | + ./scripts/upload_workflow.py \ + --workflow "workflows/${{ matrix.repo }}/${{ matrix.repo }}.ga" \ + --galaxy_url https://galaxy-synbiocad.org \ + --galaxy_user_key "${{ secrets.GG_SYNBIOCAD_TOKEN }}" diff --git a/.github/workflows/test_skip.txt b/.github/workflows/test_tools_skip.txt similarity index 100% rename from .github/workflows/test_skip.txt rename to .github/workflows/test_tools_skip.txt diff --git a/.github/workflows/test_workflows_skip.txt b/.github/workflows/test_workflows_skip.txt new file mode 100644 index 00000000..e69de29b diff --git a/.github/workflows/tests.yml b/.github/workflows/testtools.yml similarity index 97% rename from .github/workflows/tests.yml rename to .github/workflows/testtools.yml index 95024bdd..afd4ea07 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/testtools.yml @@ -1,4 +1,4 @@ -name: Tests +name: TestTools on: schedule: @@ -27,7 +27,7 @@ jobs: - name: 'List repos' id: set-matrix run: | - matrix=$(jq -R -s -c '[split("\n")[] | select(.|length>0)]' .github/workflows/test_skip.txt) + matrix=$(jq -R -s -c '[split("\n")[] | select(.|length>0)]' .github/workflows/test_tools_skip.txt) echo "Number of repos: ${matrix}" echo "matrix=$matrix" >> "${GITHUB_OUTPUT}" @@ -42,7 +42,7 @@ jobs: - name: 'Checkout' uses: actions/checkout@v3 with: - ref: main + fetch-depth: 0 - name: "Setup python" uses: actions/setup-python@v4 with: diff --git a/.github/workflows/testworkflows.yml b/.github/workflows/testworkflows.yml new file mode 100644 index 00000000..e7ff61a6 --- /dev/null +++ b/.github/workflows/testworkflows.yml @@ -0,0 +1,82 @@ +name: TestWorkflows + +on: + schedule: + - cron: '0 0 * * 1' + pull_request: + types: + - edited + - opened + - reopened + - synchronize + pull_request_target: + types: + - closed + +jobs: + + list: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: 'Checkout' + uses: actions/checkout@v3 + - name: 'List repos' + id: set-matrix + run: echo "matrix=$(find workflows -mindepth 1 -maxdepth 1 -type d | jq -R -s -c 'split("\n")[:-1] | map(split("/")[-1])')" >> "${GITHUB_OUTPUT}" + + skip: + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - name: 'Checkout' + uses: actions/checkout@v3 + - name: 'List repos' + id: set-matrix + run: | + matrix=$(jq -R -s -c '[split("\n")[] | select(.|length>0)]' .github/workflows/test_workflows_skip.txt) + echo "Number of repos: ${matrix}" + echo "matrix=$matrix" >> "${GITHUB_OUTPUT}" + + test: + needs: [list, skip] + runs-on: ubuntu-latest + strategy: + max-parallel: 1 + matrix: + repo: ${{ fromJson(needs.list.outputs.matrix) }} + steps: + - name: 'Checkout' + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: "Setup python" + uses: actions/setup-python@v4 + with: + python-version: '3.10' + cache: 'pip' # caching pip dependencies + cache-dependency-path: | + env/requirements.txt + - name: 'Install packages' + run: | + pip install -r env/requirements.txt + - name: 'Worfklow Lint' + run: | + planemo workflow_lint \ + --fail_level error \ + "workflows/${{ matrix.repo }}" + - name: 'Shed lint' + run: | + planemo shed_lint --urls --xsd --ensure_metadata "workflows/${{ matrix.repo }}" + ./scripts/shed_lint.py -i "workflows/${{ matrix.repo }}" + - name: 'Test tool' + if: ${{ ! contains(fromJson(needs.skip.outputs.matrix), matrix.repo) }} + timeout-minutes: 60 + run: | + planemo test \ + --engine external_galaxy \ + --galaxy_url https://galaxy-synbiocad.org \ + --galaxy_user_key "${{ secrets.GG_SYNBIOCAD_TOKEN }}" \ + "workflows/${{ matrix.repo }}/${{ matrix.repo }}.ga" diff --git a/.gitignore b/.gitignore index 3a5cc03c..9bfb4d39 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ node_modules *.code-workspace tool_test_output.html tool_test_output.json +.hg_archival.txt diff --git a/scripts/upload_workflow.py b/scripts/upload_workflow.py new file mode 100755 index 00000000..e959bebf --- /dev/null +++ b/scripts/upload_workflow.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +import argparse +import json +import os +from typing import Any, Dict + +from bioblend.galaxy import GalaxyInstance +from bioblend.galaxy.workflows import WorkflowClient + + +class GalaxyUploadWorkflow(object): + def __init__(self, url: str, key: str): + self.gi = GalaxyInstance(url=url, key=key) + self.wc = WorkflowClient(galaxy_instance=self.gi) + + def upload(self, workflow: str) -> None: + data = GalaxyUploadWorkflow.read_workflow(path=workflow) + + self.wc.update_workflow( + workflow_id=data["uuid"], + workflow=data["steps"], + name=data["name"], + annotation=data["annotation"], + menu_entry=True, + tags=data["tags"], + published=True, + ) + + @classmethod + def read_workflow(cls, path: str) -> Dict[str, Any]: + with open(path) as fd: + return json.load(fd) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser_input = parser.add_argument_group("Input") + parser_input.add_argument( + "--galaxy_url", + required=True, + help="Url of Galaxy Instance", + ) + parser_input.add_argument( + "--galaxy_user_key", + required=True, + help="Token for Galaxy Instance", + ) + parser_input.add_argument("--workflow", required=True, help="Worfklow file (.ga)") + + args = parser.parse_args() + + guw = GalaxyUploadWorkflow(url=args.galaxy_url, key=args.galaxy_user_key) + guw.upload(workflow=args.workflow) diff --git a/workflows/basic_assembly_workflow/.shed.yml b/workflows/basic_assembly_workflow/.shed.yml new file mode 100644 index 00000000..aba24099 --- /dev/null +++ b/workflows/basic_assembly_workflow/.shed.yml @@ -0,0 +1,12 @@ +Typical workflow: +name: basic_assembly_workflow +owner: tduigou +remote_repository_url: https://github.com/brsynth/galaxytools/tree/master/workflows/basic_assembly_workflow +homepage_url: https://github.com/brsynth/galaxytools +type: unrestricted +categories: + - Systems Biology + - Synthetic Biology +description: BASIC Assembly Workflow +long_description: | + 'This workflow proposes an alternative route to design plasmids encoding predicted pathways by using the BASIC assembly method. Importantly, it generates scripts enabling the automatic build of these plasmids using an Opentrons liquid handler robot. Source code may be found at the following location: https://github.com/brsynth/selenzy-wrapper , https://github.com/brsynth/rpbasicdesign , https://github.com/brsynth/DNA-BOT/tree/DNA-BOT-APIv2' diff --git a/workflows/basic_assembly_workflow/basic_assembly_workflow-job.yml b/workflows/basic_assembly_workflow/basic_assembly_workflow-job.yml new file mode 100644 index 00000000..30a535ad --- /dev/null +++ b/workflows/basic_assembly_workflow/basic_assembly_workflow-job.yml @@ -0,0 +1,11 @@ +Linkers and user parts: + class: File + location: https://zenodo.org/record/6123887/files/parts_for_lycopene.csv +Pathway (SBML): + class: File + location: https://zenodo.org/record/6123887/files/rp_002_0011.xml +DNA-Bot settings: + class: File + location: https://zenodo.org/record/6123887/files/dnabot_paris_settings.yaml +Host taxon ID: 83333 +Enzyme taxon IDs: 553 diff --git a/workflows/basic_assembly_workflow/basic_assembly_workflow-tests.yml b/workflows/basic_assembly_workflow/basic_assembly_workflow-tests.yml new file mode 100644 index 00000000..9840a875 --- /dev/null +++ b/workflows/basic_assembly_workflow/basic_assembly_workflow-tests.yml @@ -0,0 +1,17 @@ +- doc: Test for BASIC Assembly workflow + job: + Linkers and user parts: + class: File + location: https://zenodo.org/record/6123887/files/parts_for_lycopene.csv + Pathway (SBML): + class: File + location: https://zenodo.org/record/6123887/files/rp_002_0011.xml + DNA-Bot settings: + class: File + location: https://zenodo.org/record/6123887/files/dnabot_paris_settings.yaml + Host taxon ID: 83333 + Enzyme taxon IDs: 553 + outputs: + dnabot_scripts: + path: test-data/dna_bot_scripts.tar + compare: sim_size diff --git a/workflows/basic_assembly_workflow/basic_assembly_workflow.ga b/workflows/basic_assembly_workflow/basic_assembly_workflow.ga new file mode 100644 index 00000000..e24dbf29 --- /dev/null +++ b/workflows/basic_assembly_workflow/basic_assembly_workflow.ga @@ -0,0 +1,436 @@ +{ + "a_galaxy_workflow": "true", + "annotation": "Design plasmids encoding predicted pathways by using the BASIC assembly method.", + "format-version": "0.1", + "name": "Genetic Design (BASIC Assembly)", + "steps": { + "0": { + "annotation": "", + "content_id": null, + "errors": null, + "id": 0, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "Pathway (SBML)" + } + ], + "label": "Pathway (SBML)", + "name": "Input dataset", + "outputs": [], + "position": { + "bottom": 314.8000030517578, + "height": 61.80000305175781, + "left": 239, + "right": 439, + "top": 253, + "width": 200, + "x": 239, + "y": 253 + }, + "tool_id": null, + "tool_state": "{\"optional\": false}", + "tool_version": null, + "type": "data_input", + "uuid": "c24c8466-a2fa-40e6-b218-9e857ede1368", + "workflow_outputs": [] + }, + "1": { + "annotation": "", + "content_id": null, + "errors": null, + "id": 1, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "Host taxon ID" + } + ], + "label": "Host taxon ID", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 404.8000030517578, + "height": 61.80000305175781, + "left": 241, + "right": 441, + "top": 343, + "width": 200, + "x": 241, + "y": 343 + }, + "tool_id": null, + "tool_state": "{\"default\": 83333, \"parameter_type\": \"integer\", \"optional\": true}", + "tool_version": null, + "type": "parameter_input", + "uuid": "421174ff-5277-4144-9624-d55db17be30d", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "fa443ca9-5251-4bde-92db-c7cf8894001b" + } + ] + }, + "2": { + "annotation": "Comma separated values", + "content_id": null, + "errors": null, + "id": 2, + "input_connections": {}, + "inputs": [ + { + "description": "Comma separated values", + "name": "Enzyme taxon IDs" + } + ], + "label": "Enzyme taxon IDs", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 517.1999969482422, + "height": 82.19999694824219, + "left": 241, + "right": 441, + "top": 435, + "width": 200, + "x": 241, + "y": 435 + }, + "tool_id": null, + "tool_state": "{\"parameter_type\": \"text\", \"optional\": true}", + "tool_version": null, + "type": "parameter_input", + "uuid": "008f4464-c232-483a-a07e-7e9dc60c9ebf", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "46a410ab-1e02-4452-8551-690bb3d7b708" + } + ] + }, + "3": { + "annotation": "", + "content_id": null, + "errors": null, + "id": 3, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "Linkers and user parts" + } + ], + "label": "Linkers and user parts", + "name": "Input dataset", + "outputs": [], + "position": { + "bottom": 628.1999969482422, + "height": 82.19999694824219, + "left": 243, + "right": 443, + "top": 546, + "width": 200, + "x": 243, + "y": 546 + }, + "tool_id": null, + "tool_state": "{\"optional\": false}", + "tool_version": null, + "type": "data_input", + "uuid": "818a252c-d3f9-4627-83bd-60cbac258497", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "6c8f6c11-c878-4dc5-9064-cc44a4b96358" + } + ] + }, + "4": { + "annotation": "", + "content_id": null, + "errors": null, + "id": 4, + "input_connections": {}, + "inputs": [ + { + "description": "", + "name": "DNA-Bot settings" + } + ], + "label": "DNA-Bot settings", + "name": "Input dataset", + "outputs": [], + "position": { + "bottom": 852.1999969482422, + "height": 82.19999694824219, + "left": 246, + "right": 446, + "top": 770, + "width": 200, + "x": 246, + "y": 770 + }, + "tool_id": null, + "tool_state": "{\"optional\": true}", + "tool_version": null, + "type": "data_input", + "uuid": "824b42b7-4ca0-4104-83f1-2145d1472b64", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "cf85648b-2ba9-4600-b0d7-b00e4db69ba0" + } + ] + }, + "5": { + "annotation": "Performs enzyme selection from a reaction query.", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/selenzy/selenzy-wrapper/0.2.0", + "errors": null, + "id": 5, + "input_connections": { + "adv|enzyme_taxIDs": { + "id": 2, + "output_name": "output" + }, + "adv|host_taxID": { + "id": 1, + "output_name": "output" + }, + "pathway": { + "id": 0, + "output_name": "output" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool Selenzyme", + "name": "pathway" + } + ], + "label": "Selenzyme", + "name": "Selenzyme", + "outputs": [ + { + "name": "uniprot_ids", + "type": "xml" + }, + { + "name": "uniprot_ids_csv", + "type": "csv" + } + ], + "position": { + "bottom": 508.1999969482422, + "height": 225.1999969482422, + "left": 553, + "right": 753, + "top": 283, + "width": 200, + "x": 553, + "y": 283 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/selenzy/selenzy-wrapper/0.2.0", + "tool_shed_repository": { + "changeset_revision": "34a9d136a5bf", + "name": "selenzy", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"host_taxID\": {\"__class__\": \"ConnectedValue\"}, \"enzyme_taxIDs\": {\"__class__\": \"ConnectedValue\"}, \"nb_ids\": \"-1\", \"nb_targets\": \"500\", \"direction\": \"0.0\", \"NoMSA\": \"true\"}, \"pathway\": {\"__class__\": \"RuntimeValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": null, + "type": "tool", + "uuid": "69b876a0-0dac-4592-94ed-19820860998c", + "workflow_outputs": [ + { + "label": null, + "output_name": "uniprot_ids_csv", + "uuid": "bf22d3b6-7500-49ed-9f0d-fad0d5a93e80" + }, + { + "label": "Uniprot IDs", + "output_name": "uniprot_ids", + "uuid": "eab193c0-12aa-40d1-944a-062813653cb9" + } + ] + }, + "6": { + "annotation": "Extracts enzyme IDs from rpSBML files.", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpbasicdesign/rpbasicdesign/0.3.4", + "errors": null, + "id": 6, + "input_connections": { + "adv|parts_files": { + "id": 3, + "output_name": "output" + }, + "rpsbml_file": { + "id": 5, + "output_name": "uniprot_ids" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool BasicDesign", + "name": "adv" + }, + { + "description": "runtime parameter for tool BasicDesign", + "name": "rpsbml_file" + } + ], + "label": "BasicDesign", + "name": "BasicDesign", + "outputs": [ + { + "name": "sbol_dir", + "type": "input" + }, + { + "name": "Constructs", + "type": "csv" + }, + { + "name": "User parts plate", + "type": "csv" + }, + { + "name": "Biolegio plate", + "type": "csv" + } + ], + "position": { + "bottom": 646.8000030517578, + "height": 214.8000030517578, + "left": 816, + "right": 1016, + "top": 432, + "width": 200, + "x": 816, + "y": 432 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpbasicdesign/rpbasicdesign/0.3.4", + "tool_shed_repository": { + "changeset_revision": "de9f53630349", + "name": "rpbasicdesign", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"parts_files\": {\"__class__\": \"RuntimeValue\"}, \"lms_id\": \"LMS\", \"lmp_id\": \"LMP\", \"cds_permutation\": \"true\"}, \"backbone_id\": \"BASIC_SEVA_37_CmR-p15A.1\", \"rpsbml_file\": {\"__class__\": \"RuntimeValue\"}, \"sample_size\": \"88\", \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": null, + "type": "tool", + "uuid": "77649640-9d17-417f-9195-18e10b50d9d6", + "workflow_outputs": [ + { + "label": null, + "output_name": "Constructs", + "uuid": "e653f383-afb6-4cc1-a862-d4946512b50b" + }, + { + "label": null, + "output_name": "User parts plate", + "uuid": "780352cb-695e-4ca0-b391-7f624e8dd8cb" + }, + { + "label": null, + "output_name": "sbol_dir", + "uuid": "4d464905-d571-4f21-b8a6-d7f1b2c31eab" + }, + { + "label": null, + "output_name": "Biolegio plate", + "uuid": "16de9e3c-a177-4228-b2b8-de2d51fa11b4" + } + ] + }, + "7": { + "annotation": "DNA assembly using BASIC on OpenTrons.", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/dnabot/dnabot/3.1.0", + "errors": null, + "id": 7, + "input_connections": { + "adv|default_settings_file": { + "id": 4, + "output_name": "output" + }, + "construct_file": { + "id": 6, + "output_name": "Constructs" + }, + "plate_files": [ + { + "id": 6, + "output_name": "User parts plate" + }, + { + "id": 6, + "output_name": "Biolegio plate" + } + ] + }, + "inputs": [ + { + "description": "runtime parameter for tool DNA-Bot", + "name": "adv" + }, + { + "description": "runtime parameter for tool DNA-Bot", + "name": "construct_file" + }, + { + "description": "runtime parameter for tool DNA-Bot", + "name": "plate_files" + } + ], + "label": "DNA-Bot", + "name": "DNA-Bot", + "outputs": [ + { + "name": "dnabot_scripts", + "type": "tar" + } + ], + "position": { + "bottom": 728.8000030517578, + "height": 194.8000030517578, + "left": 1073, + "right": 1273, + "top": 534, + "width": 200, + "x": 1073, + "y": 534 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/dnabot/dnabot/3.1.0", + "tool_shed_repository": { + "changeset_revision": "de6812daba39", + "name": "dnabot", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"default_settings_file\": {\"__class__\": \"RuntimeValue\"}, \"etoh_well\": \"A11\", \"soc_column\": \"1\"}, \"construct_file\": {\"__class__\": \"RuntimeValue\"}, \"plate_files\": {\"__class__\": \"RuntimeValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": null, + "type": "tool", + "uuid": "4a917d61-47a7-4f71-922d-740231461a83", + "workflow_outputs": [ + { + "label": "dnabot_scripts", + "output_name": "dnabot_scripts", + "uuid": "346c5730-0a87-4848-b6bf-4e455b5f2505" + } + ] + } + }, + "tags": [ + "brs", "assembly" + ], + "uuid": "22764e28-d3c7-40d2-888c-7a3722d29d26", + "version": 0 +} diff --git a/workflows/basic_assembly_workflow/test-data/dna_bot_scripts.tar b/workflows/basic_assembly_workflow/test-data/dna_bot_scripts.tar new file mode 100644 index 0000000000000000000000000000000000000000..8dd75aae8119bee9ae566c8699a4935332026380 GIT binary patch literal 174080 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 literal 0 HcmV?d00001 From f7df6238cbaa188a138cb48217658b6c7b22a181 Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Mon, 5 Jun 2023 11:30:18 +0200 Subject: [PATCH 16/61] fix(tools): update `sbol_converter` commands (#122) --- tools/sbol_converter/sbol_converter.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/sbol_converter/sbol_converter.xml b/tools/sbol_converter/sbol_converter.xml index ee7920fa..92169629 100644 --- a/tools/sbol_converter/sbol_converter.xml +++ b/tools/sbol_converter/sbol_converter.xml @@ -10,22 +10,22 @@ Date: Tue, 6 Jun 2023 09:49:47 +0200 Subject: [PATCH 17/61] chore(github): fix syntax --- .github/workflows/release_schedule.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release_schedule.yml b/.github/workflows/release_schedule.yml index e909cd2f..2750de15 100644 --- a/.github/workflows/release_schedule.yml +++ b/.github/workflows/release_schedule.yml @@ -18,10 +18,12 @@ jobs: ref: 'stable' - name: "Check diff" id: set-diff + continue-on-error: true run: | git diff --quiet stable..origin/main nb=$? - echo "nb=$nb" >> "${GITHUB_OUTPUT}" + echo "Find diff: ${nb}" + echo "nb=${nb}" >> "${GITHUB_OUTPUT}" Call: runs-on: ubuntu-latest From 5a21330bb75fe5b6433862f09802ddb3334051c1 Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Thu, 8 Jun 2023 17:17:01 +0200 Subject: [PATCH 18/61] Add `pathway_analysis` workflow (#128) * fix(workflows): rm unused files * feat(workflows): add `pathway_analysis` --- .github/workflows/prworkflows.yml | 12 +- .github/workflows/testworkflows.yml | 15 +- workflows/basic_assembly_workflow/.shed.yml | 12 - .../basic_assembly_workflow-job.yml | 11 - .../pathway_analysis_workflow-tests.yml | 42 ++ .../pathway_analysis_workflow.ga | 381 ++++++++++++++++++ .../test-data/ranked_pathways.csv | 10 + 7 files changed, 436 insertions(+), 47 deletions(-) delete mode 100644 workflows/basic_assembly_workflow/.shed.yml delete mode 100644 workflows/basic_assembly_workflow/basic_assembly_workflow-job.yml create mode 100644 workflows/pathway_analysis_workflow/pathway_analysis_workflow-tests.yml create mode 100644 workflows/pathway_analysis_workflow/pathway_analysis_workflow.ga create mode 100644 workflows/pathway_analysis_workflow/test-data/ranked_pathways.csv diff --git a/.github/workflows/prworkflows.yml b/.github/workflows/prworkflows.yml index 36b44bc1..e3ab3686 100644 --- a/.github/workflows/prworkflows.yml +++ b/.github/workflows/prworkflows.yml @@ -1,4 +1,4 @@ -name: PullRequest +name: PullRequestWorkflow on: pull_request: @@ -26,7 +26,7 @@ jobs: #uses: Ana06/get-changed-files@v2.2.0 uses: tj-actions/changed-files@v36 with: - files: tools/** + files: workflows/** separator: "," - name: 'List repos' id: set-matrix @@ -80,18 +80,10 @@ jobs: planemo workflow_lint \ --fail_level error \ "workflows/${{ matrix.repo }}" - - name: 'Shed lint' - run: | - planemo shed_lint --urls --xsd --ensure_metadata "workflows/${{ matrix.repo }}" - ./scripts/shed_lint.py -i "workflows/${{ matrix.repo }}" - name: 'Test tool' if: ${{ ! contains(fromJson(needs.skip.outputs.matrix), matrix.repo) }} timeout-minutes: 60 run: | - echo "list workflows" - ls workflows - echo "list repo" - ls "workflows/${{ matrix.repo }}" planemo test \ --engine external_galaxy \ --galaxy_url https://galaxy-synbiocad.org \ diff --git a/.github/workflows/testworkflows.yml b/.github/workflows/testworkflows.yml index e7ff61a6..acb1fd2e 100644 --- a/.github/workflows/testworkflows.yml +++ b/.github/workflows/testworkflows.yml @@ -3,15 +3,6 @@ name: TestWorkflows on: schedule: - cron: '0 0 * * 1' - pull_request: - types: - - edited - - opened - - reopened - - synchronize - pull_request_target: - types: - - closed jobs: @@ -67,11 +58,7 @@ jobs: planemo workflow_lint \ --fail_level error \ "workflows/${{ matrix.repo }}" - - name: 'Shed lint' - run: | - planemo shed_lint --urls --xsd --ensure_metadata "workflows/${{ matrix.repo }}" - ./scripts/shed_lint.py -i "workflows/${{ matrix.repo }}" - - name: 'Test tool' + - name: 'Test worflow' if: ${{ ! contains(fromJson(needs.skip.outputs.matrix), matrix.repo) }} timeout-minutes: 60 run: | diff --git a/workflows/basic_assembly_workflow/.shed.yml b/workflows/basic_assembly_workflow/.shed.yml deleted file mode 100644 index aba24099..00000000 --- a/workflows/basic_assembly_workflow/.shed.yml +++ /dev/null @@ -1,12 +0,0 @@ -Typical workflow: -name: basic_assembly_workflow -owner: tduigou -remote_repository_url: https://github.com/brsynth/galaxytools/tree/master/workflows/basic_assembly_workflow -homepage_url: https://github.com/brsynth/galaxytools -type: unrestricted -categories: - - Systems Biology - - Synthetic Biology -description: BASIC Assembly Workflow -long_description: | - 'This workflow proposes an alternative route to design plasmids encoding predicted pathways by using the BASIC assembly method. Importantly, it generates scripts enabling the automatic build of these plasmids using an Opentrons liquid handler robot. Source code may be found at the following location: https://github.com/brsynth/selenzy-wrapper , https://github.com/brsynth/rpbasicdesign , https://github.com/brsynth/DNA-BOT/tree/DNA-BOT-APIv2' diff --git a/workflows/basic_assembly_workflow/basic_assembly_workflow-job.yml b/workflows/basic_assembly_workflow/basic_assembly_workflow-job.yml deleted file mode 100644 index 30a535ad..00000000 --- a/workflows/basic_assembly_workflow/basic_assembly_workflow-job.yml +++ /dev/null @@ -1,11 +0,0 @@ -Linkers and user parts: - class: File - location: https://zenodo.org/record/6123887/files/parts_for_lycopene.csv -Pathway (SBML): - class: File - location: https://zenodo.org/record/6123887/files/rp_002_0011.xml -DNA-Bot settings: - class: File - location: https://zenodo.org/record/6123887/files/dnabot_paris_settings.yaml -Host taxon ID: 83333 -Enzyme taxon IDs: 553 diff --git a/workflows/pathway_analysis_workflow/pathway_analysis_workflow-tests.yml b/workflows/pathway_analysis_workflow/pathway_analysis_workflow-tests.yml new file mode 100644 index 00000000..c723fb75 --- /dev/null +++ b/workflows/pathway_analysis_workflow/pathway_analysis_workflow-tests.yml @@ -0,0 +1,42 @@ +- doc: Evaluating and ranking a set of pathways based on multiple metrics + job: + Heterologous pathways: + class: Collection + collection_type: list + elements: + - identifier: rp_001_0001.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_001_0001.xml + - identifier: rp_001_0006.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_001_0006.xml + - identifier: rp_001_0011.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_001_0011.xml + - identifier: rp_002_0001.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_002_0001.xml + - identifier: rp_002_0006.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_002_0006.xml + - identifier: rp_002_0011.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_002_0011.xml + - identifier: rp_003_0001.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_003_0001.xml + - identifier: rp_003_0116.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_003_0116.xml + - identifier: rp_003_0231.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_003_0231.xml + Chassis where to produce target from: + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/SBML_Model_iML1515.xml + Biomass reaction ID: R_BIOMASS_Ec_iML1515_core_75p37M + Cell compartment ID: c + outputs: + Ranked Pathways: + path: test-data/ranked_pathways.csv + compare: sim_size diff --git a/workflows/pathway_analysis_workflow/pathway_analysis_workflow.ga b/workflows/pathway_analysis_workflow/pathway_analysis_workflow.ga new file mode 100644 index 00000000..ad8497aa --- /dev/null +++ b/workflows/pathway_analysis_workflow/pathway_analysis_workflow.ga @@ -0,0 +1,381 @@ +{ + "a_galaxy_workflow": "true", + "annotation": "Evaluating and ranking a set of pathways based on multiple metrics", + "creator": [ + { + "class": "Organization", + "name": "BioRetroSynth", + "url": "https://github.com/brsynth" + } + ], + "format-version": "0.1", + "license": "MIT", + "name": "Pathway Analysis", + "steps": { + "0": { + "annotation": "An identifier like \"biomass\"", + "content_id": null, + "errors": null, + "id": 0, + "input_connections": {}, + "inputs": [ + { + "description": "An identifier like \"biomass\"", + "name": "Biomass reaction ID" + } + ], + "label": "Biomass reaction ID", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 340.6434088812934, + "height": 75.60000610351562, + "left": -340.35936143663196, + "right": -160.35936143663196, + "top": 265.04340277777777, + "width": 180, + "x": -340.35936143663196, + "y": 265.04340277777777 + }, + "tool_id": null, + "tool_state": "{\"parameter_type\": \"text\", \"optional\": false}", + "tool_version": null, + "type": "parameter_input", + "uuid": "d2ebc0df-8d14-471a-a940-f9163d309d70", + "workflow_outputs": [] + }, + "1": { + "annotation": "Dataset of rpsbml pathways", + "content_id": null, + "errors": null, + "id": 1, + "input_connections": {}, + "inputs": [ + { + "description": "Dataset of rpsbml pathways", + "name": "Heterologous pathways" + } + ], + "label": "Heterologous pathways", + "name": "Input dataset collection", + "outputs": [], + "position": { + "bottom": 462.64339531792535, + "height": 75.60000610351562, + "left": -340.35936143663196, + "right": -160.35936143663196, + "top": 387.04338921440973, + "width": 180, + "x": -340.35936143663196, + "y": 387.04338921440973 + }, + "tool_id": null, + "tool_state": "{\"optional\": false, \"collection_type\": \"list\"}", + "tool_version": null, + "type": "data_collection_input", + "uuid": "396a82be-e939-4c16-95d7-cfafb0e472bd", + "workflow_outputs": [] + }, + "2": { + "annotation": "SBML model", + "content_id": null, + "errors": null, + "id": 2, + "input_connections": {}, + "inputs": [ + { + "description": "SBML model", + "name": "Chassis where to produce target from" + } + ], + "label": "Chassis where to produce target from", + "name": "Input dataset", + "outputs": [], + "position": { + "bottom": 584.6434156629774, + "height": 75.60000610351562, + "left": -340.35936143663196, + "right": -160.35936143663196, + "top": 509.0434095594618, + "width": 180, + "x": -340.35936143663196, + "y": 509.0434095594618 + }, + "tool_id": null, + "tool_state": "{\"optional\": false}", + "tool_version": null, + "type": "data_input", + "uuid": "ca69a88b-c781-4d72-ab5c-92df2afc720a", + "workflow_outputs": [] + }, + "3": { + "annotation": "An identifier like \"c\"", + "content_id": null, + "errors": null, + "id": 3, + "input_connections": {}, + "inputs": [ + { + "description": "An identifier like \"c\"", + "name": "Cell compartment ID" + } + ], + "label": "Cell compartment ID", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 707.7527533637152, + "height": 75.5999755859375, + "left": -340.35936143663196, + "right": -160.35936143663196, + "top": 632.1527777777777, + "width": 180, + "x": -340.35936143663196, + "y": 632.1527777777777 + }, + "tool_id": null, + "tool_state": "{\"parameter_type\": \"text\", \"optional\": false}", + "tool_version": null, + "type": "parameter_input", + "uuid": "d92f3120-93f4-4341-aab7-7432a889fd40", + "workflow_outputs": [] + }, + "4": { + "annotation": "Perform FBA", + "content_id": "toolshed.g2.bx.psu.edu/repos/iuc/rpfba/rpfba/5.12.1", + "errors": null, + "id": 4, + "input_connections": { + "biomass_rxn_id": { + "id": 0, + "output_name": "output" + }, + "compartment_id": { + "id": 3, + "output_name": "output" + }, + "model": { + "id": 2, + "output_name": "output" + }, + "pathway": { + "id": 1, + "output_name": "output" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool Flux balance analysis", + "name": "model" + }, + { + "description": "runtime parameter for tool Flux balance analysis", + "name": "pathway" + } + ], + "label": "Flux Balance Analysis", + "name": "Flux balance analysis", + "outputs": [ + { + "name": "pathway_with_fba", + "type": "sbml" + } + ], + "position": { + "bottom": 527.1434156629774, + "height": 188.10000610351562, + "left": -52.29688856336806, + "right": 127.703126695421, + "top": 339.0434095594618, + "width": 180.00001525878906, + "x": -52.29688856336806, + "y": 339.0434095594618 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/iuc/rpfba/rpfba/5.12.1", + "tool_shed_repository": { + "changeset_revision": "19be43e96154", + "name": "rpfba", + "owner": "iuc", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"merge\": \"false\", \"ignore_orphan_species\": \"true\"}, \"biomass_rxn_id\": {\"__class__\": \"ConnectedValue\"}, \"compartment_id\": {\"__class__\": \"ConnectedValue\"}, \"input_sim_type\": {\"sim_type\": \"fraction\", \"__current_case__\": 0, \"fraction_of\": \"0.75\"}, \"model\": {\"__class__\": \"RuntimeValue\"}, \"objective_rxn_id\": \"rxn_target\", \"pathway\": {\"__class__\": \"RuntimeValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "5.12.1", + "type": "tool", + "uuid": "84470349-6e9c-4810-b2c8-3d5fdae0cca4", + "workflow_outputs": [ + { + "label": "pathway_fba", + "output_name": "pathway_with_fba", + "uuid": "5691075c-3a81-427b-b12d-5df59b988edc" + } + ] + }, + "5": { + "annotation": "Calculate the formation energy of chemical species and the Gibbs free energy of their reactions and pathways in an SBML", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpthermo/rpthermo/5.12.1", + "errors": null, + "id": 5, + "input_connections": { + "input": { + "id": 4, + "output_name": "pathway_with_fba" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool Thermo", + "name": "input" + } + ], + "label": "Thermo", + "name": "Thermo", + "outputs": [ + { + "name": "pathway_with_thermo", + "type": "xml" + } + ], + "position": { + "bottom": 481.54339599609375, + "height": 85.5, + "left": 225.703125, + "right": 405.703125, + "top": 396.04339599609375, + "width": 180, + "x": 225.703125, + "y": 396.04339599609375 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpthermo/rpthermo/5.12.1", + "tool_shed_repository": { + "changeset_revision": "21a900eee812", + "name": "rpthermo", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"ph\": \"7.5\", \"ionic_strength\": \"0.25\", \"pMg\": \"3.0\"}, \"input\": {\"__class__\": \"RuntimeValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "5.12.1", + "type": "tool", + "uuid": "7b32553d-b992-4a54-a863-815f9b946581", + "workflow_outputs": [ + { + "label": "pathay_thermo", + "output_name": "pathway_with_thermo", + "uuid": "bbb6a168-236b-4e28-a1c4-18dbb8538eb0" + } + ] + }, + "6": { + "annotation": "Computes a global score for a heterologous pathway.", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpscore/rpscore/5.12.1", + "errors": null, + "id": 6, + "input_connections": { + "pathway": { + "id": 5, + "output_name": "pathway_with_thermo" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool Score Pathway", + "name": "pathway" + } + ], + "label": "Score Pathway", + "name": "Score Pathway", + "outputs": [ + { + "name": "scored_pathway", + "type": "xml" + } + ], + "position": { + "bottom": 491.54339599609375, + "height": 85.5, + "left": 503.70313856336804, + "right": 683.703138563368, + "top": 406.04339599609375, + "width": 180, + "x": 503.70313856336804, + "y": 406.04339599609375 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpscore/rpscore/5.12.1", + "tool_shed_repository": { + "changeset_revision": "da8ae7fa5ed3", + "name": "rpscore", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"no_of_rxns_thres\": \"10\"}, \"pathway\": {\"__class__\": \"RuntimeValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "5.12.1", + "type": "tool", + "uuid": "6b680491-6b40-4f44-943e-9026a9264b54", + "workflow_outputs": [ + { + "label": "pathway_score", + "output_name": "scored_pathway", + "uuid": "87b486d0-6923-47d8-9d4f-0afcacbaca95" + } + ] + }, + "7": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpranker/rpranker/5.12.1", + "errors": null, + "id": 7, + "input_connections": { + "pathway_collection": { + "id": 6, + "output_name": "scored_pathway" + } + }, + "inputs": [], + "label": null, + "name": "Rank Pathways", + "outputs": [ + { + "name": "sorted_pathways", + "type": "csv" + } + ], + "position": { + "bottom": 510.54340277777777, + "height": 85.5, + "left": 781.7031521267361, + "right": 961.7031521267361, + "top": 425.04340277777777, + "width": 180, + "x": 781.7031521267361, + "y": 425.04340277777777 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpranker/rpranker/5.12.1", + "tool_shed_repository": { + "changeset_revision": "bab690866445", + "name": "rpranker", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"pathway_collection\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "5.12.1", + "type": "tool", + "uuid": "39986296-e23e-4af7-ac3d-e84de3cb1b4c", + "workflow_outputs": [ + { + "label": "Ranked Pathways", + "output_name": "sorted_pathways", + "uuid": "561c935b-6ccb-4aa6-9b23-31f374acec9e" + } + ] + } + }, + "tags": [ + "brs", + "retrosynthesis" + ], + "uuid": "f1011985-7282-45df-8326-b91a873fcd00", + "version": 10 +} \ No newline at end of file diff --git a/workflows/pathway_analysis_workflow/test-data/ranked_pathways.csv b/workflows/pathway_analysis_workflow/test-data/ranked_pathways.csv new file mode 100644 index 00000000..151bac2d --- /dev/null +++ b/workflows/pathway_analysis_workflow/test-data/ranked_pathways.csv @@ -0,0 +1,10 @@ +#Name,Score +002_0011,0.9894743263721466 +001_0011,0.989453911781311 +002_0006,0.9892315685749054 +001_0006,0.9890591621398924 +003_0231,0.9878535568714142 +003_0116,0.9863117098808288 +003_0001,0.975385755300522 +002_0001,0.9752638757228852 +001_0001,0.975147980451584 From 023843343989a124130115957ccdb2b279a72996 Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Fri, 9 Jun 2023 16:25:21 +0200 Subject: [PATCH 19/61] feat(workflows): add `retrosynthesis` (#129) --- .github/workflows/test_workflows_skip.txt | 1 + .../retrosynthesis_workflow-tests.yml | 44 ++ .../retrosynthesis_workflow.ga | 378 ++++++++++++++++++ 3 files changed, 423 insertions(+) create mode 100644 workflows/retrosynthesis_workflow/retrosynthesis_workflow-tests.yml create mode 100644 workflows/retrosynthesis_workflow/retrosynthesis_workflow.ga diff --git a/.github/workflows/test_workflows_skip.txt b/.github/workflows/test_workflows_skip.txt index e69de29b..59da3239 100644 --- a/.github/workflows/test_workflows_skip.txt +++ b/.github/workflows/test_workflows_skip.txt @@ -0,0 +1 @@ +retrosynthesis_workflow diff --git a/workflows/retrosynthesis_workflow/retrosynthesis_workflow-tests.yml b/workflows/retrosynthesis_workflow/retrosynthesis_workflow-tests.yml new file mode 100644 index 00000000..c6bbab9d --- /dev/null +++ b/workflows/retrosynthesis_workflow/retrosynthesis_workflow-tests.yml @@ -0,0 +1,44 @@ +- doc: Retrosynthesis + job: + Target to produce: 'InChI=1S/C40H56/c1-33(2)19-13-23-37(7)27-17-31-39(9)29-15-25-35(5)21-11-12-22-36(6)26-16-30-40(10)32-18-28-38(8)24-14-20-34(3)4/h11-12,15-22,25-32H,13-14,23-24H2,1-10H3/b12-11+,25-15+,26-16+,31-17+,32-18+,35-21+,36-22+,37-27+,38-28+,39-29+,40-30+' + outputs: + rpCompletion: + class: Collection + collection_type: list + elements: + - identifier: rp_001_0001.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_001_0001.xml + compare: sim_size + - identifier: rp_001_0006.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_001_0006.xml + compare: sim_size + - identifier: rp_001_0011.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_001_0011.xml + compare: sim_size + - identifier: rp_002_0001.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_002_0001.xml + compare: sim_size + - identifier: rp_002_0006.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_002_0006.xml + compare: sim_size + - identifier: rp_002_0011.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_002_0011.xml + compare: sim_size + - identifier: rp_003_0001.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_003_0001.xml + compare: sim_size + - identifier: rp_003_0116.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_003_0116.xml + compare: sim_size + - identifier: rp_003_0231.xml + class: File + location: https://zenodo.org/api/files/5db78fa1-b8cb-4046-b57c-8a9d00806f42/rp_003_0231.xml + compare: sim_size diff --git a/workflows/retrosynthesis_workflow/retrosynthesis_workflow.ga b/workflows/retrosynthesis_workflow/retrosynthesis_workflow.ga new file mode 100644 index 00000000..9fd6009f --- /dev/null +++ b/workflows/retrosynthesis_workflow/retrosynthesis_workflow.ga @@ -0,0 +1,378 @@ +{ + "a_galaxy_workflow": "true", + "annotation": "Generating theoretical possible pathways for the production of Lycopene in E.Coli using Retrosynthesis tools", + "creator": [ + { + "class": "Organization", + "name": "BioRetroSynth", + "url": "https://github.com/brsynth" + } + ], + "format-version": "0.1", + "license": "MIT", + "name": "RetroSynthesis", + "steps": { + "0": { + "annotation": "The International Chemical Identifier (InChI) of the compound of interest to produce", + "content_id": null, + "errors": null, + "id": 0, + "input_connections": {}, + "inputs": [ + { + "description": "The International Chemical Identifier (InChI) of the compound of interest to produce", + "name": "Target to produce" + } + ], + "label": "Target to produce", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 718.09375, + "height": 84, + "left": 359.375, + "right": 559.375, + "top": 634.09375, + "width": 200, + "x": 359.375, + "y": 634.09375 + }, + "tool_id": null, + "tool_state": "{\"parameter_type\": \"text\", \"optional\": false}", + "tool_version": null, + "type": "parameter_input", + "uuid": "832d6ff4-18ac-4728-a776-277ba25b6b74", + "workflow_outputs": [] + }, + "1": { + "annotation": "Pick a SBML model", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/get_sbml_model/get_sbml_model/0.0.1", + "errors": null, + "id": 1, + "input_connections": {}, + "inputs": [ + { + "description": "runtime parameter for tool Pick SBML Model", + "name": "SBML model" + } + ], + "label": "SBML model", + "name": "Pick SBML Model", + "outputs": [ + { + "name": "sbml_model", + "type": "xml" + } + ], + "position": { + "bottom": 808.59375, + "height": 84, + "left": 356, + "right": 556, + "top": 724.59375, + "width": 200, + "x": 356, + "y": 724.59375 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/get_sbml_model/get_sbml_model/0.0.1", + "tool_shed_repository": { + "changeset_revision": "4797d0b36ff3", + "name": "get_sbml_model", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"input\": {\"__class__\": \"RuntimeValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "0.0.1", + "type": "tool", + "uuid": "bb68ae97-ef17-41c3-8e99-d62a6a4508ee", + "workflow_outputs": [ + { + "label": "Pick SBML Model - iML1515", + "output_name": "sbml_model", + "uuid": "a1ea773f-4da4-4154-a9c5-403c3eb24789" + } + ] + }, + "2": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rrparser/rrparser/2.4.6", + "errors": null, + "id": 2, + "input_connections": {}, + "inputs": [], + "label": null, + "name": "RRules Parser", + "outputs": [ + { + "name": "out_rules", + "type": "csv" + } + ], + "position": { + "bottom": 936.375, + "height": 105, + "left": 601, + "right": 801, + "top": 831.375, + "width": 200, + "x": 601, + "y": 831.375 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rrparser/rrparser/2.4.6", + "tool_shed_repository": { + "changeset_revision": "ea590c609fec", + "name": "rrparser", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"compress\": \"false\", \"diameters\": [\"2\", \"4\", \"6\", \"8\", \"10\", \"12\", \"14\", \"16\"], \"rules\": {\"type\": \"retro\", \"__current_case__\": 2}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "2.4.6", + "type": "tool", + "uuid": "5bcc6c73-b4cf-45fc-96f6-9e3cbf31832e", + "workflow_outputs": [ + { + "label": "RRules Parser(retro, d=['2', '4', '6', '8', '10', '12', '14', '16'])", + "output_name": "out_rules", + "uuid": "cbbe5eb3-a09b-43f0-a680-6fbdfae47f27" + } + ] + }, + "3": { + "annotation": "The sinks expected to be bound in a chassis", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpextractsink/rpextractsink/5.12.1", + "errors": null, + "id": 3, + "input_connections": { + "input": { + "id": 1, + "output_name": "sbml_model" + } + }, + "inputs": [], + "label": "Sink from SBML", + "name": "Sink from SBML", + "outputs": [ + { + "name": "sink", + "type": "csv" + } + ], + "position": { + "bottom": 804.578125, + "height": 95, + "left": 604, + "right": 804, + "top": 709.578125, + "width": 200, + "x": 604, + "y": 709.578125 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpextractsink/rpextractsink/5.12.1", + "tool_shed_repository": { + "changeset_revision": "47bb93e7832b", + "name": "rpextractsink", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"remove_dead_end\": \"true\"}, \"compartment_id\": \"c\", \"input\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "5.12.1", + "type": "tool", + "uuid": "4dd55661-fbf3-484a-8df4-f884973e06cf", + "workflow_outputs": [ + { + "label": "sink", + "output_name": "sink", + "uuid": "538da761-7ef7-4f12-bbfa-b09f02450835" + } + ] + }, + "4": { + "annotation": "Run Retropath2.0", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/retropath2/retropath2/2.3.0", + "errors": null, + "id": 4, + "input_connections": { + "rulesfile": { + "id": 2, + "output_name": "out_rules" + }, + "sinkfile": { + "id": 3, + "output_name": "sink" + }, + "source_inchi_type|source_inchi": { + "id": 0, + "output_name": "output" + } + }, + "inputs": [], + "label": "Retropath2.0", + "name": "RetroPath2.0", + "outputs": [ + { + "name": "Reaction_Network", + "type": "csv" + } + ], + "position": { + "bottom": 751.578125, + "height": 157, + "left": 847, + "right": 1047, + "top": 594.578125, + "width": 200, + "x": 847, + "y": 594.578125 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/retropath2/retropath2/2.3.0", + "tool_shed_repository": { + "changeset_revision": "9c8ac9980bd6", + "name": "retropath2", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"version\": \"r20220104\", \"topx\": \"100\", \"dmin\": \"0\", \"dmax\": \"1000\", \"mwmax_source\": \"1000\", \"timeout\": \"60\"}, \"max_steps\": \"3\", \"rulesfile\": {\"__class__\": \"ConnectedValue\"}, \"sinkfile\": {\"__class__\": \"ConnectedValue\"}, \"source_inchi_type\": {\"inchi_type\": \"string\", \"__current_case__\": 0, \"source_inchi\": {\"__class__\": \"ConnectedValue\"}}, \"source_name\": \"target\", \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "2.3.0", + "type": "tool", + "uuid": "61f75528-3c9f-412b-b5ed-ecde3d5f3533", + "workflow_outputs": [ + { + "label": "Retropath2.0", + "output_name": "Reaction_Network", + "uuid": "8e3eb073-046b-41a1-a3ad-15d6fa3dae85" + } + ] + }, + "5": { + "annotation": "Enumerate pathways", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rp2paths/rp2paths/1.5.0", + "errors": null, + "id": 5, + "input_connections": { + "rp2_pathways": { + "id": 4, + "output_name": "Reaction_Network" + } + }, + "inputs": [], + "label": "RP2paths", + "name": "RP2paths", + "outputs": [ + { + "name": "master_pathways", + "type": "csv" + }, + { + "name": "compounds", + "type": "tsv" + } + ], + "position": { + "bottom": 679, + "height": 168, + "left": 1101.296875, + "right": 1301.296875, + "top": 511, + "width": 200, + "x": 1101.296875, + "y": 511 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rp2paths/rp2paths/1.5.0", + "tool_shed_repository": { + "changeset_revision": "e3db7fb2c85e", + "name": "rp2paths", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"timeout\": \"1800\"}, \"rp2_pathways\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "1.5.0", + "type": "tool", + "uuid": "dbb47e06-b8c4-4ba3-9385-8a84ca952c7f", + "workflow_outputs": [ + { + "label": "RP2paths (pathways)", + "output_name": "master_pathways", + "uuid": "5c89b9e1-cdde-4672-b14a-a62dc07b726b" + }, + { + "label": "RP2paths (compounds)", + "output_name": "compounds", + "uuid": "5662c480-168b-4841-96d7-14fe138720a4" + } + ] + }, + "6": { + "annotation": "SBML file compiling output from rp2paths, sink, retropath2.0", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpcompletion/rpcompletion/5.12.2", + "errors": null, + "id": 6, + "input_connections": { + "rp2_pathways": { + "id": 4, + "output_name": "Reaction_Network" + }, + "rp2paths_compounds": { + "id": 5, + "output_name": "compounds" + }, + "rp2paths_pathways": { + "id": 5, + "output_name": "master_pathways" + }, + "sink": { + "id": 3, + "output_name": "sink" + } + }, + "inputs": [], + "label": "Complete Reactions", + "name": "Complete Reactions", + "outputs": [ + { + "name": "pathways", + "type": "input" + } + ], + "position": { + "bottom": 846.5, + "height": 230, + "left": 1375.5, + "right": 1575.5, + "top": 616.5, + "width": 200, + "x": 1375.5, + "y": 616.5 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rpcompletion/rpcompletion/5.12.2", + "tool_shed_repository": { + "changeset_revision": "d5c53a916005", + "name": "rpcompletion", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"max_subpaths_filter\": \"10\", \"upper_flux_bound\": \"999999\", \"lower_flux_bound\": \"0\"}, \"rp2_pathways\": {\"__class__\": \"ConnectedValue\"}, \"rp2paths_compounds\": {\"__class__\": \"ConnectedValue\"}, \"rp2paths_pathways\": {\"__class__\": \"ConnectedValue\"}, \"sink\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "5.12.2", + "type": "tool", + "uuid": "4f7eded9-10da-4459-9345-f8058fc94905", + "workflow_outputs": [ + { + "label": "rpCompletion", + "output_name": "pathways", + "uuid": "ce8df96b-0296-4736-b183-33500eb2533c" + } + ] + } + }, + "tags": [ + "brs", + "retrosynthesis" + ], + "uuid": "06357c34-cf77-4251-9fab-09fafd6ce21a", + "version": 14 +} From a28bed08736e066fe805d55e2917054cc14e2106 Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Mon, 12 Jun 2023 13:04:33 +0200 Subject: [PATCH 20/61] rp2biosensor: syntax (#130) * fix(rp2biosensor): add attribute to test tag --- tools/rp2biosensor/rp2biosensor.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/rp2biosensor/rp2biosensor.xml b/tools/rp2biosensor/rp2biosensor.xml index e17f73b0..8b05c689 100644 --- a/tools/rp2biosensor/rp2biosensor.xml +++ b/tools/rp2biosensor/rp2biosensor.xml @@ -25,13 +25,13 @@
- - + + adv['json_graph'] - + From 5a51e961c57d475d474b6872d63eb0f2c9fa9684 Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Mon, 12 Jun 2023 14:00:31 +0200 Subject: [PATCH 21/61] feat(workflows): add `biosensor` (#131) --- .../biosensor_workflow-tests.yml | 7 + .../biosensor_workflow/biosensor_workflow.ga | 440 +++++++ .../test-data/biosensor.html | 1105 +++++++++++++++++ 3 files changed, 1552 insertions(+) create mode 100644 workflows/biosensor_workflow/biosensor_workflow-tests.yml create mode 100644 workflows/biosensor_workflow/biosensor_workflow.ga create mode 100644 workflows/biosensor_workflow/test-data/biosensor.html diff --git a/workflows/biosensor_workflow/biosensor_workflow-tests.yml b/workflows/biosensor_workflow/biosensor_workflow-tests.yml new file mode 100644 index 00000000..179d0bfc --- /dev/null +++ b/workflows/biosensor_workflow/biosensor_workflow-tests.yml @@ -0,0 +1,7 @@ +- doc: Biosensor + job: + Compound InChI: 'InChI=1S/C3H6O3/c1-2(4)3(5)6/h2,4H,1H3,(H,5,6)/p-1/t2-/m0/s1' + outputs: + biosensor: + path: test-data/biosensor.html + compare: sim_size diff --git a/workflows/biosensor_workflow/biosensor_workflow.ga b/workflows/biosensor_workflow/biosensor_workflow.ga new file mode 100644 index 00000000..87358713 --- /dev/null +++ b/workflows/biosensor_workflow/biosensor_workflow.ga @@ -0,0 +1,440 @@ +{ + "a_galaxy_workflow": "true", + "annotation": "Predicts metabolic reactions connecting any query metabolite to a given biosensor.", + "creator": [ + { + "class": "Organization", + "name": "BioRetroSynth", + "url": "https://github.com/brsynth" + } + ], + "format-version": "0.1", + "license": "MIT", + "name": "BioSensor", + "steps": { + "0": { + "annotation": "Name of the biosensor", + "content_id": null, + "errors": null, + "id": 0, + "input_connections": {}, + "inputs": [ + { + "description": "Name of the biosensor", + "name": "BioSensor name" + } + ], + "label": "BioSensor name", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 349, + "height": 63, + "left": -48.5, + "right": 151.5, + "top": 286, + "width": 200, + "x": -48.5, + "y": 286 + }, + "tool_id": null, + "tool_state": "{\"default\": \"H2O2\", \"parameter_type\": \"text\", \"optional\": true}", + "tool_version": null, + "type": "parameter_input", + "uuid": "6c743f9a-f4d5-44ad-9b18-41c631b89c26", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "baf1d70e-3f00-4ed3-ba3e-4a5e8c087bf8" + } + ] + }, + "1": { + "annotation": "InChI of the biosensor. Default: InChI of H2O2.", + "content_id": null, + "errors": null, + "id": 1, + "input_connections": {}, + "inputs": [ + { + "description": "InChI of the biosensor. Default: InChI of H2O2.", + "name": "BioSensor InChI" + } + ], + "label": "BioSensor InChI", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 439, + "height": 63, + "left": -47.5, + "right": 152.5, + "top": 376, + "width": 200, + "x": -47.5, + "y": 376 + }, + "tool_id": null, + "tool_state": "{\"default\": \"InChI=1S/H2O2/c1-2/h1-2H\", \"parameter_type\": \"text\", \"optional\": true}", + "tool_version": null, + "type": "parameter_input", + "uuid": "5dc9e2bb-09e4-4cd1-8931-4b40fef15f5d", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "64ed0ece-c8b9-4ad3-ae4f-caa41cd839c2" + } + ] + }, + "2": { + "annotation": "Name of the compound to detect", + "content_id": null, + "errors": null, + "id": 2, + "input_connections": {}, + "inputs": [ + { + "description": "Name of the compound to detect", + "name": "Compound name" + } + ], + "label": "Compound name", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 577, + "height": 84, + "left": -45.5, + "right": 154.5, + "top": 493, + "width": 200, + "x": -45.5, + "y": 493 + }, + "tool_id": null, + "tool_state": "{\"default\": \"Target\", \"parameter_type\": \"text\", \"optional\": true}", + "tool_version": null, + "type": "parameter_input", + "uuid": "398b9893-c88b-4690-bb83-c3e8c064d595", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "310a24d5-1d0a-4851-a9b4-c24ddd6feb78" + } + ] + }, + "3": { + "annotation": "InChI of the compound to detect", + "content_id": null, + "errors": null, + "id": 3, + "input_connections": {}, + "inputs": [ + { + "description": "InChI of the compound to detect", + "name": "Compound InChI" + } + ], + "label": "Compound InChI", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 666, + "height": 63, + "left": -42.5, + "right": 157.5, + "top": 603, + "width": 200, + "x": -42.5, + "y": 603 + }, + "tool_id": null, + "tool_state": "{\"parameter_type\": \"text\", \"optional\": false}", + "tool_version": null, + "type": "parameter_input", + "uuid": "c4987b08-dd9c-465d-858f-b3caeb4ee748", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "00a3c0ad-8253-427c-86e7-3c250c3fe431" + } + ] + }, + "4": { + "annotation": "InChI of the biosensor", + "content_id": null, + "errors": null, + "id": 4, + "input_connections": {}, + "inputs": [ + { + "description": "InChI of the biosensor", + "name": "Number of steps" + } + ], + "label": "Number of steps", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 762, + "height": 63, + "left": -40.5, + "right": 159.5, + "top": 699, + "width": 200, + "x": -40.5, + "y": 699 + }, + "tool_id": null, + "tool_state": "{\"default\": 2, \"parameter_type\": \"integer\", \"optional\": true}", + "tool_version": null, + "type": "parameter_input", + "uuid": "649e1211-0c09-4195-a3ec-e38f45355925", + "workflow_outputs": [ + { + "label": null, + "output_name": "output", + "uuid": "af169980-4524-43d4-a32f-b945f87860d7" + } + ] + }, + "5": { + "annotation": "Extract reaction rules from RetroRules.", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rrparser/rrparser/2.4.6", + "errors": null, + "id": 5, + "input_connections": {}, + "inputs": [], + "label": "rrparser", + "name": "RRules Parser", + "outputs": [ + { + "name": "out_rules", + "type": "csv" + } + ], + "position": { + "bottom": 920, + "height": 105, + "left": 265.5, + "right": 465.5, + "top": 815, + "width": 200, + "x": 265.5, + "y": 815 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rrparser/rrparser/2.4.6", + "tool_shed_repository": { + "changeset_revision": "ea590c609fec", + "name": "rrparser", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"compress\": \"false\", \"diameters\": [\"2\", \"4\", \"6\", \"8\", \"10\", \"12\"], \"rules\": {\"type\": \"all\", \"__current_case__\": 3}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "2.4.6", + "type": "tool", + "uuid": "2b726baf-728a-465c-ba23-9acac5b67bae", + "workflow_outputs": [ + { + "label": "RRules Parser(retro, d=['2', '4', '6', '8', '10', '12', '14', '16'])", + "output_name": "out_rules", + "uuid": "2c9da489-ff1d-4523-9227-4bb6e81a4b17" + } + ] + }, + "6": { + "annotation": "Convert sink information into a RetroPath2.0-ready sink file", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/inchi_to_sink/inchi_to_sink/1.0.0", + "errors": null, + "id": 6, + "input_connections": { + "source_inchi": { + "id": 1, + "output_name": "output" + }, + "source_name": { + "id": 0, + "output_name": "output" + } + }, + "inputs": [], + "label": "inchi to sink", + "name": "Inchi to sink", + "outputs": [ + { + "name": "sink", + "type": "csv" + } + ], + "position": { + "bottom": 523, + "height": 147, + "left": 256.5, + "right": 456.5, + "top": 376, + "width": 200, + "x": 256.5, + "y": 376 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/inchi_to_sink/inchi_to_sink/1.0.0", + "tool_shed_repository": { + "changeset_revision": "3627d3e49889", + "name": "inchi_to_sink", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"source_inchi\": {\"__class__\": \"ConnectedValue\"}, \"source_name\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "1.0.0", + "type": "tool", + "uuid": "d5d107ee-b25a-41d8-ab23-d1dda2106288", + "workflow_outputs": [ + { + "label": "Inchi to sink - Biosensor", + "output_name": "sink", + "uuid": "b72ea03a-4c0d-41b9-b74b-6655ce70cbef" + } + ] + }, + "7": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/retropath2/retropath2/2.3.0", + "errors": null, + "id": 7, + "input_connections": { + "max_steps": { + "id": 4, + "output_name": "output" + }, + "rulesfile": { + "id": 5, + "output_name": "out_rules" + }, + "sinkfile": { + "id": 6, + "output_name": "sink" + }, + "source_inchi_type|source_inchi": { + "id": 3, + "output_name": "output" + }, + "source_name": { + "id": 2, + "output_name": "output" + } + }, + "inputs": [], + "label": "RetroPath2.0", + "name": "RetroPath2.0", + "outputs": [ + { + "name": "Reaction_Network", + "type": "csv" + } + ], + "position": { + "bottom": 751, + "height": 219, + "left": 541.5, + "right": 741.5, + "top": 532, + "width": 200, + "x": 541.5, + "y": 532 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/retropath2/retropath2/2.3.0", + "tool_shed_repository": { + "changeset_revision": "9c8ac9980bd6", + "name": "retropath2", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"version\": \"r20220104\", \"topx\": \"100\", \"dmin\": \"0\", \"dmax\": \"1000\", \"mwmax_source\": \"1000\", \"timeout\": \"60\"}, \"max_steps\": {\"__class__\": \"ConnectedValue\"}, \"rulesfile\": {\"__class__\": \"ConnectedValue\"}, \"sinkfile\": {\"__class__\": \"ConnectedValue\"}, \"source_inchi_type\": {\"inchi_type\": \"string\", \"__current_case__\": 0, \"source_inchi\": {\"__class__\": \"ConnectedValue\"}}, \"source_name\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "2.3.0", + "type": "tool", + "uuid": "245868cc-dbe2-40ea-bdf6-ca7053e13537", + "workflow_outputs": [ + { + "label": "RetroPath2.0", + "output_name": "Reaction_Network", + "uuid": "7ee0e88b-5ddd-49f6-82d2-6a01b01ba0a1" + } + ] + }, + "8": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rp2biosensor/rp2biosensor/3.0.0", + "errors": null, + "id": 8, + "input_connections": { + "rp2_results": { + "id": 7, + "output_name": "Reaction_Network" + }, + "sink_file": { + "id": 6, + "output_name": "sink" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool rp2biosensor", + "name": "rp2_results" + }, + { + "description": "runtime parameter for tool rp2biosensor", + "name": "sink_file" + } + ], + "label": null, + "name": "rp2biosensor", + "outputs": [ + { + "name": "html_file", + "type": "html" + } + ], + "position": { + "bottom": 572, + "height": 147, + "left": 825.5, + "right": 1025.5, + "top": 425, + "width": 200, + "x": 825.5, + "y": 425 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/rp2biosensor/rp2biosensor/3.0.0", + "tool_shed_repository": { + "changeset_revision": "b0efd4b2ffba", + "name": "rp2biosensor", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"json_graph\": \"false\"}, \"rp2_results\": {\"__class__\": \"RuntimeValue\"}, \"sink_file\": {\"__class__\": \"RuntimeValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "3.0.0", + "type": "tool", + "uuid": "ea1788bb-7af6-4097-87f5-8b2918b7f698", + "workflow_outputs": [ + { + "label": "biosensor", + "output_name": "html_file", + "uuid": "f4279ed9-48e8-44a1-a76f-b2db9fd0836f" + } + ] + } + }, + "tags": [ + "brs", + "biosensor" + ], + "uuid": "b8d05692-eccc-4288-b1e4-33399b403876", + "version": 2 +} diff --git a/workflows/biosensor_workflow/test-data/biosensor.html b/workflows/biosensor_workflow/test-data/biosensor.html new file mode 100644 index 00000000..cf79a99e --- /dev/null +++ b/workflows/biosensor_workflow/test-data/biosensor.html @@ -0,0 +1,1105 @@ + + + + + + + + + + Sensing Enabling Pathway + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + +
+
How to
+
+

Click on a node to view information on it.

+

Clicking on a chemical node will show structural + information (SMILES, InChI) as well as related + entries in the PubChem database.

+

Clicking on a reaction node will show related + EC number(s), reaction template IDs (ie the reaction + used to build the rule), and crosslinks to related + entries in other database as well as in Selenzyme.

+
+
Node shape
+
+

 Chemical

+

 Transformation (in/outgoing arrows show direction)

+
+
Compound color
+
+

 Target

+

 Intermediate chemicals

+

 Precursors

+
+
+
+
+
+
+
+ +
+
Chemical
+
+
+ +
+
+
+
+
+ +
+
SMILES
+
+ +
+ +
+
InChI
+
+ +
+ +
+
InChIKey
+
+ +
+ +
+
Cofactor?
+
+
+ +
+
Sink?
+
+
+
+ +
+
Reaction
+
+
+ +
+
EC number(s)
+
+
+ +
+
Reaction template ID(s)
+
+
+ +
+
Enzyme selection using Selenzyme
+
+
+ +
+
Rule score
+
+
+ +
+
Reaction SMILES
+
+
+ +
+
Rule ID(s)
+
+
+
+
+ +
+
+ +
+ + + From e41ed8b7182c2d15982d8285cf4bdf34c0626e5b Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Mon, 12 Jun 2023 14:47:23 +0200 Subject: [PATCH 22/61] feat(workflows): add `straindesign` (#132) --- .../straindesign_workflow-tests.yml | 20 + .../straindesign_workflow.ga | 491 ++++++++++++++++++ 2 files changed, 511 insertions(+) create mode 100644 workflows/straindesign_workflow/straindesign_workflow-tests.yml create mode 100644 workflows/straindesign_workflow/straindesign_workflow.ga diff --git a/workflows/straindesign_workflow/straindesign_workflow-tests.yml b/workflows/straindesign_workflow/straindesign_workflow-tests.yml new file mode 100644 index 00000000..0329a0a5 --- /dev/null +++ b/workflows/straindesign_workflow/straindesign_workflow-tests.yml @@ -0,0 +1,20 @@ +- doc: StrainDesign + job: + Medium file: + class: File + location: https://raw.github.com/brsynth/straindesign/main/tests/straindesign/dataset/medium/butanol.tsv + Model chassis: + class: File + location: https://raw.github.com/brsynth/straindesign/main/tests/straindesign/dataset/model/iAF1260.xml + Heterologous pathway: + class: File + location: https://raw.github.com/brsynth/straindesign/main/tests/straindesign/dataset/pathway/butanol.xml + Biomass Reaction ID: BIOMASS_Ec_iAF1260_core_59p81M + Target Reaction ID: EX_1btol_e + Substrate Reaction ID: EX_glc__D_e + outputs: + straindesign: + asserts: + has_size: + value: "30000" + delta: "10000" diff --git a/workflows/straindesign_workflow/straindesign_workflow.ga b/workflows/straindesign_workflow/straindesign_workflow.ga new file mode 100644 index 00000000..525e50e8 --- /dev/null +++ b/workflows/straindesign_workflow/straindesign_workflow.ga @@ -0,0 +1,491 @@ +{ + "a_galaxy_workflow": "true", + "annotation": "Perform deletion of genes to produce a compound", + "creator": [ + { + "class": "Organization", + "name": "BioRetroSynth", + "url": "https://github.com/brsynth" + } + ], + "format-version": "0.1", + "license": "MIT", + "name": "StrainDesign", + "steps": { + "0": { + "annotation": "SBML type expected", + "content_id": null, + "errors": null, + "id": 0, + "input_connections": {}, + "inputs": [ + { + "description": "SBML type expected", + "name": "Model chassis" + } + ], + "label": "Model chassis", + "name": "Input dataset", + "outputs": [], + "position": { + "bottom": 210.5, + "height": 63, + "left": 345, + "right": 545, + "top": 147.5, + "width": 200, + "x": 345, + "y": 147.5 + }, + "tool_id": null, + "tool_state": "{\"optional\": false}", + "tool_version": null, + "type": "data_input", + "uuid": "97aabce5-3fc3-4144-a371-575bb52f1659", + "workflow_outputs": [] + }, + "1": { + "annotation": "Tabular type expected", + "content_id": null, + "errors": null, + "id": 1, + "input_connections": {}, + "inputs": [ + { + "description": "Tabular type expected", + "name": "Medium file" + } + ], + "label": "Medium file", + "name": "Input dataset", + "outputs": [], + "position": { + "bottom": 311.5, + "height": 63, + "left": 345, + "right": 545, + "top": 248.5, + "width": 200, + "x": 345, + "y": 248.5 + }, + "tool_id": null, + "tool_state": "{\"optional\": true}", + "tool_version": null, + "type": "data_input", + "uuid": "0503bba7-3d65-47b6-9063-0a363b3a567f", + "workflow_outputs": [] + }, + "2": { + "annotation": "Reaction ID", + "content_id": null, + "errors": null, + "id": 2, + "input_connections": {}, + "inputs": [ + { + "description": "Reaction ID", + "name": "Biomass Reaction ID" + } + ], + "label": "Biomass Reaction ID", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 433.5, + "height": 84, + "left": 345, + "right": 545, + "top": 349.5, + "width": 200, + "x": 345, + "y": 349.5 + }, + "tool_id": null, + "tool_state": "{\"parameter_type\": \"text\", \"optional\": false}", + "tool_version": null, + "type": "parameter_input", + "uuid": "ef1634ab-2bd3-419e-b92d-c451ffc4962a", + "workflow_outputs": [] + }, + "3": { + "annotation": "SBML type expected", + "content_id": null, + "errors": null, + "id": 3, + "input_connections": {}, + "inputs": [ + { + "description": "SBML type expected", + "name": "Heterologous pathway" + } + ], + "label": "Heterologous pathway", + "name": "Input dataset", + "outputs": [], + "position": { + "bottom": 555.5, + "height": 84, + "left": 345, + "right": 545, + "top": 471.5, + "width": 200, + "x": 345, + "y": 471.5 + }, + "tool_id": null, + "tool_state": "{\"optional\": true}", + "tool_version": null, + "type": "data_input", + "uuid": "5c9e7c6c-fc18-4afa-a463-0984eaffa600", + "workflow_outputs": [] + }, + "4": { + "annotation": "Reaction ID", + "content_id": null, + "errors": null, + "id": 4, + "input_connections": {}, + "inputs": [ + { + "description": "Reaction ID", + "name": "Target Reaction ID" + } + ], + "label": "Target Reaction ID", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 676.5, + "height": 84, + "left": 346, + "right": 546, + "top": 592.5, + "width": 200, + "x": 346, + "y": 592.5 + }, + "tool_id": null, + "tool_state": "{\"parameter_type\": \"text\", \"optional\": false}", + "tool_version": null, + "type": "parameter_input", + "uuid": "67937d19-0e0b-490e-acc6-a41227646799", + "workflow_outputs": [] + }, + "5": { + "annotation": "Reaction ID", + "content_id": null, + "errors": null, + "id": 5, + "input_connections": {}, + "inputs": [ + { + "description": "Reaction ID", + "name": "Substrate Reaction ID" + } + ], + "label": "Substrate Reaction ID", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 819.5, + "height": 105, + "left": 345, + "right": 545, + "top": 714.5, + "width": 200, + "x": 345, + "y": 714.5 + }, + "tool_id": null, + "tool_state": "{\"parameter_type\": \"text\", \"optional\": true}", + "tool_version": null, + "type": "parameter_input", + "uuid": "12550252-99f0-4c89-994a-fa117ce0a432", + "workflow_outputs": [] + }, + "6": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/iuc/straindesign_simulate_deletion/straindesign_simulate_deletion/3.1.0+galaxy1", + "errors": null, + "id": 6, + "input_connections": { + "biomass_rxn_id": { + "id": 2, + "output_name": "output" + }, + "input_strategy|substrate_rxn_id": { + "id": 5, + "output_name": "output" + }, + "medium": { + "id": 1, + "output_name": "output" + }, + "model": { + "id": 0, + "output_name": "output" + }, + "pathway": { + "id": 3, + "output_name": "output" + }, + "target_rxn_id": { + "id": 4, + "output_name": "output" + } + }, + "inputs": [], + "label": null, + "name": "StrainDesign simulate-deletion", + "outputs": [ + { + "name": "output_tsv", + "type": "tabular" + } + ], + "position": { + "bottom": 250.5, + "height": 292, + "left": 673, + "right": 873, + "top": -41.5, + "width": 200, + "x": 673, + "y": -41.5 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/iuc/straindesign_simulate_deletion/straindesign_simulate_deletion/3.1.0+galaxy1", + "tool_shed_repository": { + "changeset_revision": "33c6ffbd098f", + "name": "straindesign_simulate_deletion", + "owner": "iuc", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"biomass_rxn_id\": {\"__class__\": \"ConnectedValue\"}, \"input_strategy\": {\"strategy\": \"ko\", \"__current_case__\": 0, \"substrate_rxn_id\": {\"__class__\": \"ConnectedValue\"}, \"annotate\": \"false\"}, \"max_knockouts\": \"3\", \"max_time_cond\": {\"max_time_param\": \"no\", \"__current_case__\": 1}, \"medium\": {\"__class__\": \"ConnectedValue\"}, \"model\": {\"__class__\": \"ConnectedValue\"}, \"pathway\": {\"__class__\": \"ConnectedValue\"}, \"target_rxn_id\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "3.1.0+galaxy1", + "type": "tool", + "uuid": "166ac096-162b-4bbd-bc78-fc756eefc5d7", + "workflow_outputs": [ + { + "label": "StrainDesign simulate-deletion(ko)", + "output_name": "output_tsv", + "uuid": "4fab08c4-e4bc-4376-9364-560712ccb870" + } + ] + }, + "7": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/iuc/straindesign_analyzing_model/straindesign_analyzing_model/3.1.0+galaxy1", + "errors": null, + "id": 7, + "input_connections": { + "biomass_rxn_id": { + "id": 2, + "output_name": "output" + }, + "medium": { + "id": 1, + "output_name": "output" + }, + "model": { + "id": 0, + "output_name": "output" + }, + "pathway": { + "id": 3, + "output_name": "output" + }, + "substrate_cond|substrate_rxn_id": { + "id": 5, + "output_name": "output" + }, + "target_rxn_id": { + "id": 4, + "output_name": "output" + } + }, + "inputs": [], + "label": null, + "name": "StrainDesign analyzing-model", + "outputs": [ + { + "name": "output_png", + "type": "png" + } + ], + "position": { + "bottom": 592.5, + "height": 292, + "left": 673, + "right": 873, + "top": 300.5, + "width": 200, + "x": 673, + "y": 300.5 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/iuc/straindesign_analyzing_model/straindesign_analyzing_model/3.1.0+galaxy1", + "tool_shed_repository": { + "changeset_revision": "490a37e24bed", + "name": "straindesign_analyzing_model", + "owner": "iuc", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"biomass_rxn_id\": {\"__class__\": \"ConnectedValue\"}, \"medium\": {\"__class__\": \"ConnectedValue\"}, \"model\": {\"__class__\": \"ConnectedValue\"}, \"pathway\": {\"__class__\": \"ConnectedValue\"}, \"substrate_cond\": {\"substrate_param\": \"yes\", \"__current_case__\": 0, \"substrate_rxn_id\": {\"__class__\": \"ConnectedValue\"}}, \"target_rxn_id\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "3.1.0+galaxy1", + "type": "tool", + "uuid": "2602ede6-0d47-44da-bd85-c1c07376a6a7", + "workflow_outputs": [ + { + "label": "StrainDesign analyzing-model", + "output_name": "output_png", + "uuid": "c476faa7-7b68-4fcc-ab5c-591262ecc6b6" + } + ] + }, + "8": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/iuc/straindesign_reduce_model/straindesign_reduce_model/3.1.0+galaxy1", + "errors": null, + "id": 8, + "input_connections": { + "model": { + "id": 0, + "output_name": "output" + }, + "sd_strategy|sd_tsv": { + "id": 6, + "output_name": "output_tsv" + } + }, + "inputs": [], + "label": null, + "name": "StrainDesign reduce-model", + "outputs": [ + { + "name": "output_sbml", + "type": "sbml" + } + ], + "position": { + "bottom": 261.5, + "height": 189, + "left": 951, + "right": 1151, + "top": 72.5, + "width": 200, + "x": 951, + "y": 72.5 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/iuc/straindesign_reduce_model/straindesign_reduce_model/3.1.0+galaxy1", + "tool_shed_repository": { + "changeset_revision": "78b7443af284", + "name": "straindesign_reduce_model", + "owner": "iuc", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"input_gene_str\": \"\", \"model\": {\"__class__\": \"ConnectedValue\"}, \"sd_strategy\": {\"sd_cond\": \"yes\", \"__current_case__\": 0, \"sd_tsv\": {\"__class__\": \"ConnectedValue\"}, \"sd_strategy_str\": \"yield-max\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "3.1.0+galaxy1", + "type": "tool", + "uuid": "e5af6044-76fd-4d01-93d3-dced5ecca572", + "workflow_outputs": [ + { + "label": "StrainDesign reduce-model", + "output_name": "output_sbml", + "uuid": "eb4069a8-fdf3-466c-9d7a-fda83227b0d7" + } + ] + }, + "9": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/iuc/straindesign_analyzing_model/straindesign_analyzing_model/3.1.0+galaxy1", + "errors": null, + "id": 9, + "input_connections": { + "biomass_rxn_id": { + "id": 2, + "output_name": "output" + }, + "medium": { + "id": 1, + "output_name": "output" + }, + "model": { + "id": 8, + "output_name": "output_sbml" + }, + "pathway": { + "id": 3, + "output_name": "output" + }, + "substrate_cond|substrate_rxn_id": { + "id": 5, + "output_name": "output" + }, + "target_rxn_id": { + "id": 4, + "output_name": "output" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool StrainDesign analyzing-model", + "name": "medium" + }, + { + "description": "runtime parameter for tool StrainDesign analyzing-model", + "name": "model" + }, + { + "description": "runtime parameter for tool StrainDesign analyzing-model", + "name": "pathway" + } + ], + "label": null, + "name": "StrainDesign analyzing-model", + "outputs": [ + { + "name": "output_png", + "type": "png" + } + ], + "position": { + "bottom": 747.5, + "height": 271, + "left": 1239, + "right": 1439, + "top": 476.5, + "width": 200, + "x": 1239, + "y": 476.5 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/iuc/straindesign_analyzing_model/straindesign_analyzing_model/3.1.0+galaxy1", + "tool_shed_repository": { + "changeset_revision": "490a37e24bed", + "name": "straindesign_analyzing_model", + "owner": "iuc", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"biomass_rxn_id\": {\"__class__\": \"ConnectedValue\"}, \"medium\": {\"__class__\": \"RuntimeValue\"}, \"model\": {\"__class__\": \"RuntimeValue\"}, \"pathway\": {\"__class__\": \"RuntimeValue\"}, \"substrate_cond\": {\"substrate_param\": \"yes\", \"__current_case__\": 0, \"substrate_rxn_id\": {\"__class__\": \"ConnectedValue\"}}, \"target_rxn_id\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "3.1.0+galaxy1", + "type": "tool", + "uuid": "95b2e9ce-d31d-42d0-829d-f85736bbe804", + "workflow_outputs": [ + { + "label": "straindesign", + "output_name": "output_png", + "uuid": "e0b3c37d-260d-4033-b015-bad7822bd7b8" + } + ] + } + }, + "tags": [ + "brs", + "straindesign" + ], + "uuid": "5ef85967-2620-4ef3-8514-a72267a0c87b", + "version": 13 +} \ No newline at end of file From 4dcb0f3b3ea3aebe146f3f0bbecea1c8eb8753e2 Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Mon, 12 Jun 2023 14:51:38 +0200 Subject: [PATCH 23/61] feat(workflows): add `genetic assembly` (#133) --- .../genetic_assembly_workflow.ga | 454 ++++++++++++++++++ 1 file changed, 454 insertions(+) create mode 100644 workflows/genetic_assembly_workflow/genetic_assembly_workflow.ga diff --git a/workflows/genetic_assembly_workflow/genetic_assembly_workflow.ga b/workflows/genetic_assembly_workflow/genetic_assembly_workflow.ga new file mode 100644 index 00000000..8b26d2b9 --- /dev/null +++ b/workflows/genetic_assembly_workflow/genetic_assembly_workflow.ga @@ -0,0 +1,454 @@ +{ + "a_galaxy_workflow": "true", + "annotation": "", + "creator": [ + { + "class": "Organization", + "name": "BioRetroSynth", + "url": "https://github.com/brsynth" + } + ], + "format-version": "0.1", + "license": "MIT", + "name": "Genetic Design (Gibson, Golden Gate, LCR)", + "steps": { + "0": { + "annotation": "SBML files", + "content_id": null, + "errors": null, + "id": 0, + "input_connections": {}, + "inputs": [ + { + "description": "SBML files", + "name": "Heterologous pathway" + } + ], + "label": "Heterologous pathway", + "name": "Input dataset", + "outputs": [], + "position": { + "bottom": 481, + "height": 84, + "left": -473.5, + "right": -273.5, + "top": 397, + "width": 200, + "x": -473.5, + "y": 397 + }, + "tool_id": null, + "tool_state": "{\"optional\": false}", + "tool_version": null, + "type": "data_input", + "uuid": "6ae37b45-f137-46a4-bf60-8a6e973613e4", + "workflow_outputs": [] + }, + "1": { + "annotation": "Taxon ID", + "content_id": null, + "errors": null, + "id": 1, + "input_connections": {}, + "inputs": [ + { + "description": "Taxon ID", + "name": "Host taxon ID" + } + ], + "label": "Host taxon ID", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 564, + "height": 63, + "left": -477.5, + "right": -277.5, + "top": 501, + "width": 200, + "x": -477.5, + "y": 501 + }, + "tool_id": null, + "tool_state": "{\"default\": 83333, \"parameter_type\": \"integer\", \"optional\": true}", + "tool_version": null, + "type": "parameter_input", + "uuid": "e56bd850-e18f-45d0-922b-a74617e1c371", + "workflow_outputs": [] + }, + "2": { + "annotation": "Comma separated", + "content_id": null, + "errors": null, + "id": 2, + "input_connections": {}, + "inputs": [ + { + "description": "Comma separated", + "name": "Taxon IDs of output enzyme sequences" + } + ], + "label": "Taxon IDs of output enzyme sequences", + "name": "Input parameter", + "outputs": [], + "position": { + "bottom": 691, + "height": 105, + "left": -475.5, + "right": -275.5, + "top": 586, + "width": 200, + "x": -475.5, + "y": 586 + }, + "tool_id": null, + "tool_state": "{\"parameter_type\": \"text\", \"optional\": false}", + "tool_version": null, + "type": "parameter_input", + "uuid": "4b6f3f52-3722-4f43-b44b-955c615ba2b7", + "workflow_outputs": [] + }, + "3": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/selenzy/selenzy-wrapper/0.2.0", + "errors": null, + "id": 3, + "input_connections": { + "adv|enzyme_taxIDs": { + "id": 2, + "output_name": "output" + }, + "adv|host_taxID": { + "id": 1, + "output_name": "output" + }, + "pathway": { + "id": 0, + "output_name": "output" + } + }, + "inputs": [], + "label": null, + "name": "Selenzyme", + "outputs": [ + { + "name": "uniprot_ids", + "type": "xml" + }, + { + "name": "uniprot_ids_csv", + "type": "csv" + } + ], + "position": { + "bottom": 649, + "height": 230, + "left": -176.5, + "right": 23.5, + "top": 419, + "width": 200, + "x": -176.5, + "y": 419 + }, + "post_job_actions": { + "HideDatasetActionuniprot_ids": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "uniprot_ids" + }, + "HideDatasetActionuniprot_ids_csv": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "uniprot_ids_csv" + } + }, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/selenzy/selenzy-wrapper/0.2.0", + "tool_shed_repository": { + "changeset_revision": "34a9d136a5bf", + "name": "selenzy", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"host_taxID\": {\"__class__\": \"ConnectedValue\"}, \"enzyme_taxIDs\": {\"__class__\": \"ConnectedValue\"}, \"nb_ids\": \"-1\", \"nb_targets\": \"500\", \"direction\": \"0.0\", \"NoMSA\": \"true\"}, \"pathway\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "0.2.0", + "type": "tool", + "uuid": "4cb691c9-c1d5-4e74-9a92-8e9334bd2292", + "workflow_outputs": [] + }, + "4": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/sbml2sbol/sbml2sbol/0.1.13", + "errors": null, + "id": 4, + "input_connections": { + "sbml_single_input": { + "id": 3, + "output_name": "uniprot_ids" + } + }, + "inputs": [], + "label": null, + "name": "SbmlToSbol", + "outputs": [ + { + "name": "sbol_outfile", + "type": "xml" + } + ], + "position": { + "bottom": 429, + "height": 116, + "left": 82.5, + "right": 282.5, + "top": 313, + "width": 200, + "x": 82.5, + "y": 313 + }, + "post_job_actions": { + "HideDatasetActionsbol_outfile": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "sbol_outfile" + } + }, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/sbml2sbol/sbml2sbol/0.1.13", + "tool_shed_repository": { + "changeset_revision": "83108f3c65aa", + "name": "sbml2sbol", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"rbs\": \"true\", \"max_prot_per_react\": \"3\", \"tirs\": \"\", \"pathway_id\": \"rp_pathway\", \"uniprotID_key\": \"selenzy\"}, \"sbml_single_input\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "0.1.13", + "type": "tool", + "uuid": "66f1558b-8b6d-4b86-9279-e6a4cfab827c", + "workflow_outputs": [] + }, + "5": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/partsgenie/PartsGenie/1.0.1", + "errors": null, + "id": 5, + "input_connections": { + "enzymes_file": { + "id": 4, + "output_name": "sbol_outfile" + } + }, + "inputs": [], + "label": null, + "name": "PartsGenie", + "outputs": [ + { + "name": "parts", + "type": "xml" + } + ], + "position": { + "bottom": 459, + "height": 95, + "left": 330.5, + "right": 530.5, + "top": 364, + "width": 200, + "x": 330.5, + "y": 364 + }, + "post_job_actions": { + "HideDatasetActionparts": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "parts" + } + }, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/partsgenie/PartsGenie/1.0.1", + "tool_shed_repository": { + "changeset_revision": "295a21fc55d0", + "name": "partsgenie", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"url\": \"https://partsgenie.micalis.inrae.fr\"}, \"enzymes_file\": {\"__class__\": \"ConnectedValue\"}, \"taxonomy_id\": \"83333\", \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "1.0.1", + "type": "tool", + "uuid": "6de5ce99-5548-4473-bb4f-eade579882bb", + "workflow_outputs": [] + }, + "6": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/optdoe/optdoe/2.0.2", + "errors": null, + "id": 6, + "input_connections": { + "adv|genes_sbol_file": { + "id": 5, + "output_name": "parts" + }, + "genes_file": { + "id": 3, + "output_name": "uniprot_ids_csv" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool Design of Experiment", + "name": "adv" + } + ], + "label": null, + "name": "Design of Experiment", + "outputs": [ + { + "name": "constructs", + "type": "xml" + } + ], + "position": { + "bottom": 541.5, + "height": 199, + "left": 645.5, + "right": 845.5, + "top": 342.5, + "width": 200, + "x": 645.5, + "y": 342.5 + }, + "post_job_actions": { + "HideDatasetActionconstructs": { + "action_arguments": {}, + "action_type": "HideDatasetAction", + "output_name": "constructs" + } + }, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/optdoe/optdoe/2.0.2", + "tool_shed_repository": { + "changeset_revision": "c3f32929a4b7", + "name": "optdoe", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"genes_sbol_file\": {\"__class__\": \"ConnectedValue\"}, \"ref_parts_file\": {\"__class__\": \"RuntimeValue\"}, \"libsize\": \"32\", \"get_sequences\": \"true\", \"backtranslate\": \"true\", \"codon_table\": \"Eecoli.cut\"}, \"genes_file\": {\"__class__\": \"ConnectedValue\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "2.0.2", + "type": "tool", + "uuid": "3210cb4e-5c8f-43bd-bae7-a732b57b9504", + "workflow_outputs": [] + }, + "7": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/dnaweaver/dnaweaver/1.0.2", + "errors": null, + "id": 7, + "input_connections": { + "input": { + "id": 6, + "output_name": "constructs" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool DNA Weaver", + "name": "input" + } + ], + "label": null, + "name": "DNA Weaver", + "outputs": [ + { + "name": "output", + "type": "xlsx" + } + ], + "position": { + "bottom": 490, + "height": 116, + "left": 978.5, + "right": 1178.5, + "top": 374, + "width": 200, + "x": 978.5, + "y": 374 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/dnaweaver/dnaweaver/1.0.2", + "tool_shed_repository": { + "changeset_revision": "c519517e3ade", + "name": "dnaweaver", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"adv\": {\"max_constructs\": \"-1\"}, \"input\": {\"__class__\": \"RuntimeValue\"}, \"method\": \"golden_gate\", \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "1.0.2", + "type": "tool", + "uuid": "970ae428-0737-4d4c-8388-2f8332cdf7c4", + "workflow_outputs": [ + { + "label": "DNA Weaver - Assembly Plan", + "output_name": "output", + "uuid": "d34b220e-4c49-4158-ad02-b86a945637fb" + } + ] + }, + "8": { + "annotation": "", + "content_id": "toolshed.g2.bx.psu.edu/repos/tduigou/lcrgenie/LCRGenie/1.0.2", + "errors": null, + "id": 8, + "input_connections": { + "LCR_input": { + "id": 6, + "output_name": "constructs" + } + }, + "inputs": [ + { + "description": "runtime parameter for tool LCR Genie", + "name": "LCR_input" + } + ], + "label": null, + "name": "LCR Genie", + "outputs": [ + { + "name": "LCR_output", + "type": "xlsx" + } + ], + "position": { + "bottom": 639, + "height": 116, + "left": 981.5, + "right": 1181.5, + "top": 523, + "width": 200, + "x": 981.5, + "y": 523 + }, + "post_job_actions": {}, + "tool_id": "toolshed.g2.bx.psu.edu/repos/tduigou/lcrgenie/LCRGenie/1.0.2", + "tool_shed_repository": { + "changeset_revision": "afbbecdcc0e3", + "name": "lcrgenie", + "owner": "tduigou", + "tool_shed": "toolshed.g2.bx.psu.edu" + }, + "tool_state": "{\"LCR_input\": {\"__class__\": \"RuntimeValue\"}, \"adv\": {\"melting_temp\": \"60.0\"}, \"__page__\": null, \"__rerun_remap_job_id__\": null}", + "tool_version": "1.0.2", + "type": "tool", + "uuid": "708d8372-93fe-4c40-aa56-6ff28054cc8a", + "workflow_outputs": [ + { + "label": "LCR Genie: Assembly Plan", + "output_name": "LCR_output", + "uuid": "40a04511-dc63-449c-b937-7805aec37daf" + } + ] + } + }, + "tags": [ + "brs", + "assembly" + ], + "uuid": "2dcc920c-2c3e-425f-9726-2d32d441d8d2", + "version": 4 +} \ No newline at end of file From 246067538ba27ec1c312efaeca0acfa3be8089b9 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 13 Jun 2023 10:35:30 +0200 Subject: [PATCH 24/61] chore(github): fix syntax --- .github/workflows/release_schedule.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/release_schedule.yml b/.github/workflows/release_schedule.yml index 2750de15..59cfef71 100644 --- a/.github/workflows/release_schedule.yml +++ b/.github/workflows/release_schedule.yml @@ -18,10 +18,8 @@ jobs: ref: 'stable' - name: "Check diff" id: set-diff - continue-on-error: true run: | - git diff --quiet stable..origin/main - nb=$? + nb=$(git diff --shortstat stable..origin/main | cut -f2 -d ' ') echo "Find diff: ${nb}" echo "nb=${nb}" >> "${GITHUB_OUTPUT}" From 6f759e31905a8f6bb619c87ef726bf5f13694d23 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Mon, 19 Jun 2023 10:28:57 +0200 Subject: [PATCH 25/61] chore(github): update workflows to skip --- .github/workflows/test_workflows_skip.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test_workflows_skip.txt b/.github/workflows/test_workflows_skip.txt index 59da3239..5e07a6ef 100644 --- a/.github/workflows/test_workflows_skip.txt +++ b/.github/workflows/test_workflows_skip.txt @@ -1 +1,3 @@ retrosynthesis_workflow +genetic_assembly_workflow +straindesign_workflow From c5acde8be8b4f7f9f3176e270d8c97571fbc2e51 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Mon, 19 Jun 2023 11:37:36 +0200 Subject: [PATCH 26/61] chore(github): fix artefacts log --- .github/workflows/testtools.yml | 7 ++++--- scripts/aggregate_test.py | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/testtools.yml b/.github/workflows/testtools.yml index afd4ea07..718fe0a1 100644 --- a/.github/workflows/testtools.yml +++ b/.github/workflows/testtools.yml @@ -63,12 +63,14 @@ jobs: run: | planemo shed_lint --urls --xsd --ensure_metadata "tools/${{ matrix.repo }}" ./scripts/shed_lint.py -i "tools/${{ matrix.repo }}" + - name: 'Prepare' + run: | + mkdir -p "log/${{ matrix.repo }}" - name: 'Test tool' if: ${{ ! contains(fromJson(needs.skip.outputs.matrix), matrix.repo) }} timeout-minutes: 120 continue-on-error: true run: | - mkdir -p "log/${{ matrix.repo }}" planemo test \ --biocontainers \ --no_dependency_resolution \ @@ -80,8 +82,7 @@ jobs: "tools/${{ matrix.repo }}" - name: 'Prepare artefact' run: | - mkdir -p "log/${{ matrix.repo }}" - zip -r -9 log.zip "log/${{ matrix.repo }}" + zip -r -9 log.zip log - name: 'Upload Artifact Version' uses: actions/upload-artifact@v3 with: diff --git a/scripts/aggregate_test.py b/scripts/aggregate_test.py index 895ea0c0..727abde4 100755 --- a/scripts/aggregate_test.py +++ b/scripts/aggregate_test.py @@ -41,5 +41,5 @@ def parse_artifacts(finputs: List[str]) -> int: ) if len(finputs) < 1: parser.error("No file provided") - + print("Found: ", ",".join(finputs)) parse_artifacts(finputs) From 0039ba858e95b91a07a018b2eece0e0737e6a20a Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Mon, 19 Jun 2023 13:21:35 +0200 Subject: [PATCH 27/61] Tools: `selenzy_wrapper` (#134) * fix(tools): selenzy_wrapper, update test section --- .github/workflows/testtools.yml | 2 +- tools/selenzy_wrapper/selenzy_wrapper.xml | 48 +++++++++-------------- 2 files changed, 19 insertions(+), 31 deletions(-) diff --git a/.github/workflows/testtools.yml b/.github/workflows/testtools.yml index 718fe0a1..f9d20cdc 100644 --- a/.github/workflows/testtools.yml +++ b/.github/workflows/testtools.yml @@ -78,8 +78,8 @@ jobs: --galaxy_source https://github.com/galaxyproject/galaxy \ --galaxy_branch release_22.05 \ --galaxy_python_version 3.7 \ - --job_output_files "log/${{ matrix.repo }}" \ "tools/${{ matrix.repo }}" + mv tool_test_output.json "log/${{ matrix.repo }}" - name: 'Prepare artefact' run: | zip -r -9 log.zip log diff --git a/tools/selenzy_wrapper/selenzy_wrapper.xml b/tools/selenzy_wrapper/selenzy_wrapper.xml index 43fa1e04..14cf7a3a 100644 --- a/tools/selenzy_wrapper/selenzy_wrapper.xml +++ b/tools/selenzy_wrapper/selenzy_wrapper.xml @@ -1,4 +1,4 @@ - + Performs enzyme selection from a reaction query 0 @@ -54,7 +54,12 @@ - + + + + + + @@ -64,13 +69,18 @@ - + + + + + +
`_ and outputs an updated SBML file annotated with the enzyme UniProt IDs, as well as in CSV format. @@ -90,33 +100,11 @@ Output * **Uniprot IDs (SBML)**\ : Annotated SBML pathway. * **Uniprot IDs (CSV)**\ : Annotated CSV pathway. - -Project Links ------------------- - -* `GitHub `_ - -Version ----------- - -0.3.0 - -Authors -------- -* **Joan Hérisson** - -License -------- - -* `MIT `_ - -Acknowledgments ---------------- - -* Thomas Duigou - ]]> + + + 10.1093/bioinformatics/bty065 - \ No newline at end of file + From 358bd271ad2735d690bd65782235c5a07224e231 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 20 Jun 2023 10:58:58 +0200 Subject: [PATCH 28/61] chore(github): workflows, fix workflow call --- .github/workflows/release.yml | 2 ++ .github/workflows/release_schedule.yml | 10 ++-------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 660dcdf8..9aa4ed40 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,6 +2,8 @@ name: Release on: workflow_call: + secrets: + jobs: diff --git a/.github/workflows/release_schedule.yml b/.github/workflows/release_schedule.yml index 59cfef71..77cc962a 100644 --- a/.github/workflows/release_schedule.yml +++ b/.github/workflows/release_schedule.yml @@ -24,13 +24,7 @@ jobs: echo "nb=${nb}" >> "${GITHUB_OUTPUT}" Call: - runs-on: ubuntu-latest needs: [Diff] if: ${{ needs.Diff.outputs.nb > 0 }} - steps: - - uses: actions/checkout@v3 - with: - persist-credentials: false - fetch-depth: 0 - - name: 'Dispatch' - uses: ./.github/workflows/release.yml + uses: ./.github/workflows/release.yml + secrets: inherit From 4818f94adea0f7c9e2754284f9611ba6f0447c7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Jun 2023 08:38:15 +0200 Subject: [PATCH 29/61] chore(deps): bump tj-actions/changed-files from 36 to 37 (#135) Bumps [tj-actions/changed-files](https://github.com/tj-actions/changed-files) from 36 to 37. - [Release notes](https://github.com/tj-actions/changed-files/releases) - [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md) - [Commits](https://github.com/tj-actions/changed-files/compare/v36...v37) --- updated-dependencies: - dependency-name: tj-actions/changed-files dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/pr.yml | 2 +- .github/workflows/prworkflows.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index e83fac63..b4d13ff5 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -24,7 +24,7 @@ jobs: - name: 'Select modified files' id: files #uses: Ana06/get-changed-files@v2.2.0 - uses: tj-actions/changed-files@v36 + uses: tj-actions/changed-files@v37 with: files: tools/** separator: "," diff --git a/.github/workflows/prworkflows.yml b/.github/workflows/prworkflows.yml index e3ab3686..5462b6e9 100644 --- a/.github/workflows/prworkflows.yml +++ b/.github/workflows/prworkflows.yml @@ -24,7 +24,7 @@ jobs: - name: 'Select modified files' id: files #uses: Ana06/get-changed-files@v2.2.0 - uses: tj-actions/changed-files@v36 + uses: tj-actions/changed-files@v37 with: files: workflows/** separator: "," From 7dd996b8ce696060c27eb52b63ee1aa749a88aeb Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 27 Jun 2023 08:47:56 +0200 Subject: [PATCH 30/61] chore(github): merge release workflows --- .github/workflows/release.yml | 35 +++++++++++++++++++++----- .github/workflows/release_schedule.yml | 30 ---------------------- 2 files changed, 29 insertions(+), 36 deletions(-) delete mode 100644 .github/workflows/release_schedule.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9aa4ed40..7d35fc58 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,13 +1,31 @@ name: Release on: - workflow_call: - secrets: - + schedule: + - cron: '0 0 * * 2' jobs: + Diff: + runs-on: ubuntu-latest + outputs: + nb: ${{ steps.set-diff.outputs.nb }} + steps: + - uses: actions/checkout@v3 + with: + persist-credentials: false + fetch-depth: 0 + ref: 'stable' + - name: "Check diff" + id: set-diff + run: | + nb=$(git diff --shortstat stable..origin/main | cut -f2 -d ' ') + echo "Find diff: ${nb}" + echo "nb=${nb}" >> "${GITHUB_OUTPUT}" + TagRaw: + needs: Diff + if: ${{ needs.Diff.outputs.nb > 0 }} runs-on: ubuntu-latest outputs: tag: ${{ steps.tag_label.outputs.tag }} @@ -34,6 +52,8 @@ jobs: echo "tag=$TAG" >> "$GITHUB_OUTPUT" Changelog: + needs: Diff + if: ${{ needs.Diff.outputs.nb > 0 }} runs-on: ubuntu-latest needs: [TagRaw] steps: @@ -65,7 +85,8 @@ jobs: retention-days: 1 Commit: - needs: [Changelog] + needs: [Changelog, Diff] + if: ${{ needs.Diff.outputs.nb > 0 }} runs-on: ubuntu-latest steps: # Get Data @@ -100,7 +121,8 @@ jobs: branch: main Tag: - needs: [Commit, TagRaw] + needs: [Commit, Diff, TagRaw] + if: ${{ needs.Diff.outputs.nb > 0 }} runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -117,7 +139,8 @@ jobs: tag_prefix: Release: - needs: [TagRaw, Tag] + needs: [Diff, TagRaw, Tag] + if: ${{ needs.Diff.outputs.nb > 0 }} runs-on: ubuntu-latest steps: - name: 'Create Release' diff --git a/.github/workflows/release_schedule.yml b/.github/workflows/release_schedule.yml deleted file mode 100644 index 77cc962a..00000000 --- a/.github/workflows/release_schedule.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: ReleaseSchedule - -on: - schedule: - - cron: '0 0 * * 2' - -jobs: - - Diff: - runs-on: ubuntu-latest - outputs: - nb: ${{ steps.set-diff.outputs.nb }} - steps: - - uses: actions/checkout@v3 - with: - persist-credentials: false - fetch-depth: 0 - ref: 'stable' - - name: "Check diff" - id: set-diff - run: | - nb=$(git diff --shortstat stable..origin/main | cut -f2 -d ' ') - echo "Find diff: ${nb}" - echo "nb=${nb}" >> "${GITHUB_OUTPUT}" - - Call: - needs: [Diff] - if: ${{ needs.Diff.outputs.nb > 0 }} - uses: ./.github/workflows/release.yml - secrets: inherit From 3f3ef2caac4af0bdec9ab4c9e7ee8a977bbdc581 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 27 Jun 2023 08:49:14 +0200 Subject: [PATCH 31/61] chore(github): fix syntax --- .github/workflows/release.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7d35fc58..9b46ae6b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -52,10 +52,9 @@ jobs: echo "tag=$TAG" >> "$GITHUB_OUTPUT" Changelog: - needs: Diff + needs: [Diff, TagRaw] if: ${{ needs.Diff.outputs.nb > 0 }} runs-on: ubuntu-latest - needs: [TagRaw] steps: - uses: actions/checkout@v3 with: From b29963ef22900ba666d9be11f1dc09e4e3febf8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Thu, 29 Jun 2023 22:11:32 +0200 Subject: [PATCH 32/61] doc(sampler): update --- tools/doe_synbio/sampler.xml | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/tools/doe_synbio/sampler.xml b/tools/doe_synbio/sampler.xml index 8a7c4d77..d444a9e9 100644 --- a/tools/doe_synbio/sampler.xml +++ b/tools/doe_synbio/sampler.xml @@ -87,7 +87,27 @@ To avoid this, we have set some filters to select the appropriate sampling metho Input ----- -* **CFPS Parameters File**: The first column is the parameter (or factor) names. The second column is the maxValue of the parameter that will be used in the sampling. The third column is the concnetration of the stock. The fourth column is the deadVolume of the parameter. This is used to calculate the volume of the parameter that will not be pipetted by the robot (because of viscosity). The fifth column is the specific ratios we want to have for this parameter. If nothing defined, then take ratios given in program options. If one single number is given, then take this number as a const value. + +Below is an example of an input file: + +| Parameter | maxValue | Ratios | +|-----------|----------|---------------------| +| CP | 125 | 0.0 0.1 0.3 0.5 1.0 | +| CPK | 125 | 1 | +| tRNA | 125 | | +| AA | 125 | | +| ribosomes | 125 | | +| mRNA | 125 | | +| Mg | 125 | | +| K | 125 | | + +The first column is the parameter (or factor) names. + +The second column is the maxValue of the parameter that will be used in the sampling. + +The third column is the specific ratios we want to have for this parameter. If nothing defined, then take ratios given in program options. +If one single number is given, then take this number as a const value. +If no value is given, then take the default ratios (`nb_samples` linear ratios from 0 to 1). Advanced options: ----------------- From f20f60fd4e265f3f710b711d1c72cd25c06938e4 Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Mon, 3 Jul 2023 12:37:17 +0200 Subject: [PATCH 33/61] fix(tools): sampler, table syntax (#136) --- tools/doe_synbio/sampler.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tools/doe_synbio/sampler.xml b/tools/doe_synbio/sampler.xml index d444a9e9..f48d868a 100644 --- a/tools/doe_synbio/sampler.xml +++ b/tools/doe_synbio/sampler.xml @@ -90,16 +90,25 @@ Input Below is an example of an input file: ++-----------+----------+---------------------+ | Parameter | maxValue | Ratios | -|-----------|----------|---------------------| ++===========+==========+=====================+ | CP | 125 | 0.0 0.1 0.3 0.5 1.0 | ++-----------+----------+---------------------+ | CPK | 125 | 1 | ++-----------+----------+---------------------+ | tRNA | 125 | | ++-----------+----------+---------------------+ | AA | 125 | | ++-----------+----------+---------------------+ | ribosomes | 125 | | ++-----------+----------+---------------------+ | mRNA | 125 | | ++-----------+----------+---------------------+ | Mg | 125 | | ++-----------+----------+---------------------+ | K | 125 | | ++-----------+----------+---------------------+ The first column is the parameter (or factor) names. From f48e512f2ed910da01a86a2088dfb1ba866ad47b Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 4 Jul 2023 01:17:11 +0000 Subject: [PATCH 34/61] doc(changelog): update --- CHANGELOG.md | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..3d6112d7 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,121 @@ +# Changelog + +## [0.1.0](https://github.com/brsynth/galaxytools/tree/0.1.0) (2023-05-17) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/55db1c4095f1833e0122c5e1e8cf1df82fab81b6...0.1.0) + +**Merged pull requests:** + +- fix: XDG\_CACHE\_HOME [\#113](https://github.com/brsynth/galaxytools/pull/113) ([breakthewall](https://github.com/breakthewall)) +- Fix rptools - rpthermo: locate cache dir [\#112](https://github.com/brsynth/galaxytools/pull/112) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Fix straindesign: testtoolshed [\#111](https://github.com/brsynth/galaxytools/pull/111) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Updating sbol3\_diff from version 1.0a16 to 1.0a17 [\#110](https://github.com/brsynth/galaxytools/pull/110) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Updating sbol\_converter from version 1.0a16 to 1.0a17 [\#109](https://github.com/brsynth/galaxytools/pull/109) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- sbol\_converter: add citation tag [\#108](https://github.com/brsynth/galaxytools/pull/108) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Feat\(get sbml model\) [\#107](https://github.com/brsynth/galaxytools/pull/107) ([breakthewall](https://github.com/breakthewall)) +- chore\(deps\): bump github/super-linter from 4 to 5 [\#106](https://github.com/brsynth/galaxytools/pull/106) ([dependabot[bot]](https://github.com/apps/dependabot)) +- feat\(get\_sbml\_model\) [\#105](https://github.com/brsynth/galaxytools/pull/105) ([breakthewall](https://github.com/breakthewall)) +- Shed lint [\#104](https://github.com/brsynth/galaxytools/pull/104) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Updating rpbasicdesign from version 1.1.0 to 1.2.2 [\#103](https://github.com/brsynth/galaxytools/pull/103) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- retropath2\_wrapper - Id retropath2 ambiguous [\#102](https://github.com/brsynth/galaxytools/pull/102) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Updating retropath2\_wrapper from version 3.0.0 to 3.0.1 [\#101](https://github.com/brsynth/galaxytools/pull/101) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- fix\(github\): workflow syntax [\#97](https://github.com/brsynth/galaxytools/pull/97) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- chore\(github\): enable autoupdate [\#96](https://github.com/brsynth/galaxytools/pull/96) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Refactor repository [\#95](https://github.com/brsynth/galaxytools/pull/95) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- feat\(retropath2\_wrapper\): update to 3.0.0 [\#94](https://github.com/brsynth/galaxytools/pull/94) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- feat\(rrpser\): update [\#93](https://github.com/brsynth/galaxytools/pull/93) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- fix\(get\_sbml\_model\): output fmt [\#92](https://github.com/brsynth/galaxytools/pull/92) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- feat\(rp2paths\): output format [\#91](https://github.com/brsynth/galaxytools/pull/91) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Doe synbio [\#90](https://github.com/brsynth/galaxytools/pull/90) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- rptools [\#89](https://github.com/brsynth/galaxytools/pull/89) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Icfree [\#88](https://github.com/brsynth/galaxytools/pull/88) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Sbol3 diff [\#87](https://github.com/brsynth/galaxytools/pull/87) ([kenza12](https://github.com/kenza12)) +- style\(rpranker\): add single quotes and element\_identifier [\#86](https://github.com/brsynth/galaxytools/pull/86) ([kenza12](https://github.com/kenza12)) +- feat\(rptools\): add one common macro file and test only content in rpt… [\#85](https://github.com/brsynth/galaxytools/pull/85) ([kenza12](https://github.com/kenza12)) +- Iuc rptools [\#84](https://github.com/brsynth/galaxytools/pull/84) ([kenza12](https://github.com/kenza12)) +- Iuc rp2biosensor [\#83](https://github.com/brsynth/galaxytools/pull/83) ([kenza12](https://github.com/kenza12)) +- Iuc lcrgenie [\#82](https://github.com/brsynth/galaxytools/pull/82) ([kenza12](https://github.com/kenza12)) +- Iuc dnaweaver [\#81](https://github.com/brsynth/galaxytools/pull/81) ([kenza12](https://github.com/kenza12)) +- Update rptools suite to 6.0.1 [\#80](https://github.com/brsynth/galaxytools/pull/80) ([kenza12](https://github.com/kenza12)) +- doc\(rpExtractSink\): add creator names and update rptools [\#79](https://github.com/brsynth/galaxytools/pull/79) ([kenza12](https://github.com/kenza12)) +- Iuc rpfba [\#78](https://github.com/brsynth/galaxytools/pull/78) ([kenza12](https://github.com/kenza12)) +- Iuc rpreport [\#77](https://github.com/brsynth/galaxytools/pull/77) ([kenza12](https://github.com/kenza12)) +- Iuc rpviz [\#76](https://github.com/brsynth/galaxytools/pull/76) ([kenza12](https://github.com/kenza12)) +- doc\(optdoe\): optimize name and def tool [\#75](https://github.com/brsynth/galaxytools/pull/75) ([kenza12](https://github.com/kenza12)) +- fix\(OptDoE\): remove duplicates from codon tables [\#74](https://github.com/brsynth/galaxytools/pull/74) ([kenza12](https://github.com/kenza12)) +- Iuc rpranker [\#73](https://github.com/brsynth/galaxytools/pull/73) ([kenza12](https://github.com/kenza12)) +- Iuc optdoe [\#72](https://github.com/brsynth/galaxytools/pull/72) ([kenza12](https://github.com/kenza12)) +- Iuc rpranker [\#71](https://github.com/brsynth/galaxytools/pull/71) ([kenza12](https://github.com/kenza12)) +- Test sbml2sbol \(IUC requests\) [\#70](https://github.com/brsynth/galaxytools/pull/70) ([kenza12](https://github.com/kenza12)) +- Add straindesign wrapper [\#69](https://github.com/brsynth/galaxytools/pull/69) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Iuc sbml2sbol [\#68](https://github.com/brsynth/galaxytools/pull/68) ([kenza12](https://github.com/kenza12)) +- Iuc rp2paths [\#67](https://github.com/brsynth/galaxytools/pull/67) ([kenza12](https://github.com/kenza12)) +- fix\(Retropath2\_wrapper\): fix writing in tool dir with kinstall option [\#66](https://github.com/brsynth/galaxytools/pull/66) ([kenza12](https://github.com/kenza12)) +- IUC rp2paths [\#65](https://github.com/brsynth/galaxytools/pull/65) ([kenza12](https://github.com/kenza12)) +- Iuc rpcompletion [\#64](https://github.com/brsynth/galaxytools/pull/64) ([kenza12](https://github.com/kenza12)) +- test\(sbol-converter\): add few tests and README [\#63](https://github.com/brsynth/galaxytools/pull/63) ([kenza12](https://github.com/kenza12)) +- feat\(sbol\_converter\): add sbol converter \(splitted wrappers\) [\#62](https://github.com/brsynth/galaxytools/pull/62) ([kenza12](https://github.com/kenza12)) +- feat\(sbol-converter\): add first release of sbol-converter wrapper [\#61](https://github.com/brsynth/galaxytools/pull/61) ([kenza12](https://github.com/kenza12)) +- Iuc retropath2 [\#60](https://github.com/brsynth/galaxytools/pull/60) ([kenza12](https://github.com/kenza12)) +- Iuc retropath2 [\#59](https://github.com/brsynth/galaxytools/pull/59) ([kenza12](https://github.com/kenza12)) +- feat\(rrparser\): update rrparser and add rules-dir option [\#58](https://github.com/brsynth/galaxytools/pull/58) ([kenza12](https://github.com/kenza12)) +- Iuc selenzy [\#57](https://github.com/brsynth/galaxytools/pull/57) ([kenza12](https://github.com/kenza12)) +- Iuc rpextractsink [\#56](https://github.com/brsynth/galaxytools/pull/56) ([kenza12](https://github.com/kenza12)) +- Iuc rrparser [\#55](https://github.com/brsynth/galaxytools/pull/55) ([kenza12](https://github.com/kenza12)) +- feat\(rpbasicdesign\): add missing max\_gene\_per\_construct parameter and… [\#54](https://github.com/brsynth/galaxytools/pull/54) ([kenza12](https://github.com/kenza12)) +- Update rpfba [\#53](https://github.com/brsynth/galaxytools/pull/53) ([kenza12](https://github.com/kenza12)) +- Iuc rp2paths [\#52](https://github.com/brsynth/galaxytools/pull/52) ([kenza12](https://github.com/kenza12)) +- Iuc dnabot [\#51](https://github.com/brsynth/galaxytools/pull/51) ([kenza12](https://github.com/kenza12)) +- Test dnabot [\#49](https://github.com/brsynth/galaxytools/pull/49) ([kenza12](https://github.com/kenza12)) +- Iuc rpbasicdesign [\#48](https://github.com/brsynth/galaxytools/pull/48) ([kenza12](https://github.com/kenza12)) +- Test rpbasicdesign [\#47](https://github.com/brsynth/galaxytools/pull/47) ([kenza12](https://github.com/kenza12)) +- test\(rp2biosensor\): add sink test file and update to 3.1.0 [\#46](https://github.com/brsynth/galaxytools/pull/46) ([kenza12](https://github.com/kenza12)) +- Test rpbasicdesign [\#45](https://github.com/brsynth/galaxytools/pull/45) ([kenza12](https://github.com/kenza12)) +- feat\(rp2biosensor\): add input sink file and upgrade to 3.0.0 [\#44](https://github.com/brsynth/galaxytools/pull/44) ([kenza12](https://github.com/kenza12)) +- Test rp2biosensor [\#43](https://github.com/brsynth/galaxytools/pull/43) ([kenza12](https://github.com/kenza12)) +- Test dnabot [\#42](https://github.com/brsynth/galaxytools/pull/42) ([kenza12](https://github.com/kenza12)) +- feat: add rp\_fba\_analysis [\#41](https://github.com/brsynth/galaxytools/pull/41) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Test rpreport [\#40](https://github.com/brsynth/galaxytools/pull/40) ([kenza12](https://github.com/kenza12)) +- Test rpranker [\#39](https://github.com/brsynth/galaxytools/pull/39) ([kenza12](https://github.com/kenza12)) +- Test rpscore [\#38](https://github.com/brsynth/galaxytools/pull/38) ([kenza12](https://github.com/kenza12)) +- Test rpcompletion [\#37](https://github.com/brsynth/galaxytools/pull/37) ([kenza12](https://github.com/kenza12)) +- Test sbml2sbol [\#36](https://github.com/brsynth/galaxytools/pull/36) ([kenza12](https://github.com/kenza12)) +- Test rpextractsink [\#35](https://github.com/brsynth/galaxytools/pull/35) ([kenza12](https://github.com/kenza12)) +- Test rpthermo [\#34](https://github.com/brsynth/galaxytools/pull/34) ([kenza12](https://github.com/kenza12)) +- Test selenzy [\#33](https://github.com/brsynth/galaxytools/pull/33) ([kenza12](https://github.com/kenza12)) +- test\(retropath2\): update test section with small inputs [\#32](https://github.com/brsynth/galaxytools/pull/32) ([kenza12](https://github.com/kenza12)) +- Test retropath2 [\#31](https://github.com/brsynth/galaxytools/pull/31) ([kenza12](https://github.com/kenza12)) +- Test dnaweaver [\#30](https://github.com/brsynth/galaxytools/pull/30) ([kenza12](https://github.com/kenza12)) +- Feat inchi to sink [\#29](https://github.com/brsynth/galaxytools/pull/29) ([kenza12](https://github.com/kenza12)) +- test\(LCRGenie\): update test section [\#28](https://github.com/brsynth/galaxytools/pull/28) ([kenza12](https://github.com/kenza12)) +- Test optdoe [\#27](https://github.com/brsynth/galaxytools/pull/27) ([kenza12](https://github.com/kenza12)) +- Test rrparser [\#26](https://github.com/brsynth/galaxytools/pull/26) ([kenza12](https://github.com/kenza12)) +- fix\(rpFBA\): fix objective\_rxn\_id parameter name [\#25](https://github.com/brsynth/galaxytools/pull/25) ([kenza12](https://github.com/kenza12)) +- Feat inchi to sink [\#24](https://github.com/brsynth/galaxytools/pull/24) ([kenza12](https://github.com/kenza12)) +- Test rpfba [\#23](https://github.com/brsynth/galaxytools/pull/23) ([kenza12](https://github.com/kenza12)) +- Feat rpfba [\#22](https://github.com/brsynth/galaxytools/pull/22) ([kenza12](https://github.com/kenza12)) +- Test rpfba [\#21](https://github.com/brsynth/galaxytools/pull/21) ([kenza12](https://github.com/kenza12)) +- Test get sbml model [\#20](https://github.com/brsynth/galaxytools/pull/20) ([kenza12](https://github.com/kenza12)) +- Test rpextractsink [\#19](https://github.com/brsynth/galaxytools/pull/19) ([kenza12](https://github.com/kenza12)) +- Feat rp2biosensor [\#18](https://github.com/brsynth/galaxytools/pull/18) ([kenza12](https://github.com/kenza12)) +- Test rpextractsink [\#17](https://github.com/brsynth/galaxytools/pull/17) ([kenza12](https://github.com/kenza12)) +- Test rpextractsink [\#16](https://github.com/brsynth/galaxytools/pull/16) ([kenza12](https://github.com/kenza12)) +- Test partsgenie [\#15](https://github.com/brsynth/galaxytools/pull/15) ([kenza12](https://github.com/kenza12)) +- Test lcr genie [\#14](https://github.com/brsynth/galaxytools/pull/14) ([kenza12](https://github.com/kenza12)) +- Test dnaweaver [\#13](https://github.com/brsynth/galaxytools/pull/13) ([kenza12](https://github.com/kenza12)) +- Test optdoe [\#12](https://github.com/brsynth/galaxytools/pull/12) ([kenza12](https://github.com/kenza12)) +- Test selenzy wrapper [\#11](https://github.com/brsynth/galaxytools/pull/11) ([kenza12](https://github.com/kenza12)) +- Test rprank [\#10](https://github.com/brsynth/galaxytools/pull/10) ([kenza12](https://github.com/kenza12)) +- Feat rpviz [\#9](https://github.com/brsynth/galaxytools/pull/9) ([kenza12](https://github.com/kenza12)) +- feat\(dnabot\): output a tar file and update data tests [\#8](https://github.com/brsynth/galaxytools/pull/8) ([kenza12](https://github.com/kenza12)) +- Test sbml2sbol [\#7](https://github.com/brsynth/galaxytools/pull/7) ([kenza12](https://github.com/kenza12)) +- test\(rpscore\): add test section and data tests [\#6](https://github.com/brsynth/galaxytools/pull/6) ([kenza12](https://github.com/kenza12)) +- Feat dnabot [\#5](https://github.com/brsynth/galaxytools/pull/5) ([kenza12](https://github.com/kenza12)) +- test\(rp2paths\): update data tests and test section [\#4](https://github.com/brsynth/galaxytools/pull/4) ([kenza12](https://github.com/kenza12)) +- Test rpthermo [\#3](https://github.com/brsynth/galaxytools/pull/3) ([kenza12](https://github.com/kenza12)) +- Test rpfba [\#2](https://github.com/brsynth/galaxytools/pull/2) ([kenza12](https://github.com/kenza12)) +- Test rpcompletion [\#1](https://github.com/brsynth/galaxytools/pull/1) ([kenza12](https://github.com/kenza12)) + + + +\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* From cb8252ee0280a420233b52f6a7166c3da074ea8a Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 11 Jul 2023 01:10:00 +0000 Subject: [PATCH 35/61] doc(changelog): update --- CHANGELOG.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d6112d7..5dd1a69d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,40 @@ # Changelog +## [0.2.0](https://github.com/brsynth/galaxytools/tree/0.2.0) (2023-07-03) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.1.0...0.2.0) + +**Implemented enhancements:** + +- Add workflow `strain design` [\#127](https://github.com/brsynth/galaxytools/issues/127) +- Add workflow `genetic design` [\#125](https://github.com/brsynth/galaxytools/issues/125) +- Add workflow `biosensor` [\#124](https://github.com/brsynth/galaxytools/issues/124) +- Add workflow `retrosynthesis` [\#123](https://github.com/brsynth/galaxytools/issues/123) + +**Fixed bugs:** + +- workflow `pathway analysis` [\#126](https://github.com/brsynth/galaxytools/issues/126) +- rp2biosensor: syntax [\#130](https://github.com/brsynth/galaxytools/pull/130) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) + +**Merged pull requests:** + +- Tools sample, table syntax [\#136](https://github.com/brsynth/galaxytools/pull/136) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- chore\(deps\): bump tj-actions/changed-files from 36 to 37 [\#135](https://github.com/brsynth/galaxytools/pull/135) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Tools: `selenzy_wrapper` [\#134](https://github.com/brsynth/galaxytools/pull/134) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Workflows: add `genetic assembly` [\#133](https://github.com/brsynth/galaxytools/pull/133) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Workflows: `straindesign` [\#132](https://github.com/brsynth/galaxytools/pull/132) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Workflows: add `biosensor` [\#131](https://github.com/brsynth/galaxytools/pull/131) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- workflows `retrosynthesis` [\#129](https://github.com/brsynth/galaxytools/pull/129) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- Add `pathway_analysis` workflow [\#128](https://github.com/brsynth/galaxytools/pull/128) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- fix `sbol_converter` [\#122](https://github.com/brsynth/galaxytools/pull/122) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- chore\(deps\): bump tj-actions/changed-files from 35 to 36 [\#120](https://github.com/brsynth/galaxytools/pull/120) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Workflows `basic_assembly_workflow` [\#119](https://github.com/brsynth/galaxytools/pull/119) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- chore: rm config folders [\#118](https://github.com/brsynth/galaxytools/pull/118) ([breakthewall](https://github.com/breakthewall)) +- Taxonid [\#117](https://github.com/brsynth/galaxytools/pull/117) ([breakthewall](https://github.com/breakthewall)) +- Taxonid [\#116](https://github.com/brsynth/galaxytools/pull/116) ([breakthewall](https://github.com/breakthewall)) +- chore\(selenzy\_wrapper\): rm comment [\#115](https://github.com/brsynth/galaxytools/pull/115) ([breakthewall](https://github.com/breakthewall)) +- taxonid [\#114](https://github.com/brsynth/galaxytools/pull/114) ([breakthewall](https://github.com/breakthewall)) + ## [0.1.0](https://github.com/brsynth/galaxytools/tree/0.1.0) (2023-05-17) [Full Changelog](https://github.com/brsynth/galaxytools/compare/55db1c4095f1833e0122c5e1e8cf1df82fab81b6...0.1.0) From df9aa45c5d429775e15f43afac73244d0744934b Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 18 Jul 2023 01:38:54 +0000 Subject: [PATCH 36/61] doc(changelog): update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dd1a69d..c3e3864f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [0.2.1](https://github.com/brsynth/galaxytools/tree/0.2.1) (2023-07-04) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.0...0.2.1) + ## [0.2.0](https://github.com/brsynth/galaxytools/tree/0.2.0) (2023-07-03) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.1.0...0.2.0) From e4b75b1cea6d63df440c36bc3698d37af9f9b13d Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 25 Jul 2023 01:10:51 +0000 Subject: [PATCH 37/61] doc(changelog): update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3e3864f..0d554afc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [0.2.2](https://github.com/brsynth/galaxytools/tree/0.2.2) (2023-07-11) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.1...0.2.2) + ## [0.2.1](https://github.com/brsynth/galaxytools/tree/0.2.1) (2023-07-04) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.0...0.2.1) From a09f2db2f8b2c815f3d4fc0326c9dd1cb82c5fae Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 1 Aug 2023 01:07:29 +0000 Subject: [PATCH 38/61] doc(changelog): update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d554afc..60cbeba6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [0.2.3](https://github.com/brsynth/galaxytools/tree/0.2.3) (2023-07-18) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.2...0.2.3) + ## [0.2.2](https://github.com/brsynth/galaxytools/tree/0.2.2) (2023-07-11) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.1...0.2.2) From 6be8925922529e6c0c3f5f611a922176a6783f98 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 8 Aug 2023 01:00:01 +0000 Subject: [PATCH 39/61] doc(changelog): update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 60cbeba6..f21779d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [0.2.4](https://github.com/brsynth/galaxytools/tree/0.2.4) (2023-07-25) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.3...0.2.4) + ## [0.2.3](https://github.com/brsynth/galaxytools/tree/0.2.3) (2023-07-18) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.2...0.2.3) From c9c9c7b8247716d4b56ce789f3b6fca29bcd3dce Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 15 Aug 2023 00:51:02 +0000 Subject: [PATCH 40/61] doc(changelog): update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f21779d6..889ad86f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [0.2.5](https://github.com/brsynth/galaxytools/tree/0.2.5) (2023-08-01) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.4...0.2.5) + ## [0.2.4](https://github.com/brsynth/galaxytools/tree/0.2.4) (2023-07-25) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.3...0.2.4) From 77c42c23ff1d728b531b5e2fa6fd933aaa2d42f1 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 22 Aug 2023 00:51:35 +0000 Subject: [PATCH 41/61] doc(changelog): update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 889ad86f..ed5efd08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [0.2.6](https://github.com/brsynth/galaxytools/tree/0.2.6) (2023-08-08) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.5...0.2.6) + ## [0.2.5](https://github.com/brsynth/galaxytools/tree/0.2.5) (2023-08-01) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.4...0.2.5) From 87a863d4074543870caef1116b8e9be58005dcdd Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Mon, 28 Aug 2023 16:23:27 +0200 Subject: [PATCH 42/61] get_sbml_model, enable to load file from history (#137) * feat(tools): get_sbml_model, enable to load file from history --- .github/workflows/testtools.yml | 1 + tools/get_sbml_model/get_sbml_model.xml | 158 +- .../get_sbml_model/test-data/e_coli_core.xml | 9898 +++++++++++++++++ 3 files changed, 9993 insertions(+), 64 deletions(-) create mode 100644 tools/get_sbml_model/test-data/e_coli_core.xml diff --git a/.github/workflows/testtools.yml b/.github/workflows/testtools.yml index f9d20cdc..8bb288cf 100644 --- a/.github/workflows/testtools.yml +++ b/.github/workflows/testtools.yml @@ -78,6 +78,7 @@ jobs: --galaxy_source https://github.com/galaxyproject/galaxy \ --galaxy_branch release_22.05 \ --galaxy_python_version 3.7 \ + --docker_extra_volume ./ \ "tools/${{ matrix.repo }}" mv tool_test_output.json "log/${{ matrix.repo }}" - name: 'Prepare artefact' diff --git a/tools/get_sbml_model/get_sbml_model.xml b/tools/get_sbml_model/get_sbml_model.xml index c19e620a..decdd783 100644 --- a/tools/get_sbml_model/get_sbml_model.xml +++ b/tools/get_sbml_model/get_sbml_model.xml @@ -1,4 +1,4 @@ - + Get an SBML model (BiGG) curl @@ -7,87 +7,117 @@ requests '$model'; + #if str($cond_src.from_src) == 'from_bigg' + curl -o - 'http://bigg.ucsd.edu/static/models/${cond_src.hostid}.xml.gz' | gunzip > '$model' && + #else + cp '${cond_src.input_file}' '$model' && + #end if python '$__tool_directory__/'get_infos.py '$model' - --hostid '$input' + --hostid '${cond_src.hostid}' --comp '$compartments' --biomass '$biomass' --taxid '$taxid' ]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/tools/get_sbml_model/test-data/e_coli_core.xml b/tools/get_sbml_model/test-data/e_coli_core.xml new file mode 100644 index 00000000..b1ee5c62 --- /dev/null +++ b/tools/get_sbml_model/test-data/e_coli_core.xml @@ -0,0 +1,9898 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 3412c99a2358f50c047cf40b65427850c0557113 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 29 Aug 2023 00:52:22 +0000 Subject: [PATCH 43/61] doc(changelog): update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed5efd08..26907138 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [0.2.7](https://github.com/brsynth/galaxytools/tree/0.2.7) (2023-08-15) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.6...0.2.7) + ## [0.2.6](https://github.com/brsynth/galaxytools/tree/0.2.6) (2023-08-08) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.5...0.2.6) From 4cffff21ce7706ac1a54689fc6dd1b44da9bcb05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Fri, 1 Sep 2023 16:57:40 +0200 Subject: [PATCH 44/61] fix load from file --- tools/get_sbml_model/get_infos.py | 56 +++++++++++++++---------- tools/get_sbml_model/get_sbml_model.xml | 38 ++++++++++------- 2 files changed, 59 insertions(+), 35 deletions(-) diff --git a/tools/get_sbml_model/get_infos.py b/tools/get_sbml_model/get_infos.py index 5523aee5..0eb113a9 100644 --- a/tools/get_sbml_model/get_infos.py +++ b/tools/get_sbml_model/get_infos.py @@ -12,6 +12,12 @@ def entry_point(): type=str, help='SBML input file (xml)' ) + # argument to tag file from BiGG + parser.add_argument( + '--bigg', + action='store_true', + help='Tag file from BiGG' + ) parser.add_argument( '--comp', type=str, @@ -52,33 +58,41 @@ def entry_point(): f.write(f'{rxn.getId()}\n') if params.taxid: - # Extended Name - server = 'http://bigg.ucsd.edu/api/v2/models/' - ext = params.hostid - r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) - if not r.ok: - print(f"Warning: unable to retrieve host name for id {params.hostid}") - else: - try: - hostname = r.json()["organism"] - except KeyError: - print(f"Warning: unable to retrieve host name for id {params.hostid}") - hostname = '' - if not hostname: - taxid = '' - else: - # TAXON ID - server = 'https://rest.ensembl.org' - ext = f'/taxonomy/id/{hostname}?' + hostname = '' + + # Model from BiGG + if params.bigg: + # Extended Name + server = 'http://bigg.ucsd.edu/api/v2/models/' + ext = params.hostid r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) if not r.ok: - print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") + print(f"Warning: unable to retrieve host name for id {params.hostid}") else: try: - taxid = r.json()["id"] + hostname = r.json()["organism"] except KeyError: + print(f"Warning: unable to retrieve host name for id {params.hostid}") + if not hostname: + taxid = '' + else: + # TAXON ID + server = 'https://rest.ensembl.org' + ext = f'/taxonomy/id/{hostname}?' + r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) + if not r.ok: print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") - taxid = '' + else: + try: + taxid = r.json()["id"] + except KeyError: + print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") + taxid = '' + + # Model from user + else: + taxid = params.hostid + with open(params.taxid, 'w') as f: f.write('#ID\n') f.write(f'{taxid}\n') diff --git a/tools/get_sbml_model/get_sbml_model.xml b/tools/get_sbml_model/get_sbml_model.xml index decdd783..62c93b42 100644 --- a/tools/get_sbml_model/get_sbml_model.xml +++ b/tools/get_sbml_model/get_sbml_model.xml @@ -5,19 +5,28 @@ gzip python-libsbml requests + taxonid '$model' && - #else - cp '${cond_src.input_file}' '$model' && #end if python '$__tool_directory__/'get_infos.py - '$model' - --hostid '${cond_src.hostid}' - --comp '$compartments' - --biomass '$biomass' - --taxid '$taxid' + #if str($cond_src.from_src) == 'from_bigg' + '$model' + #else + '${cond_src.input_file}' + #end if + --hostid '${cond_src.hostid}' + --comp '$compartments' + --biomass '$biomass' + #if str($cond_src.from_src) == 'from_bigg' + --taxid '$taxid' + #else + python -m taxonid '${cond_src.hostid}' --output-file tmpfile + echo "#ID" > '$taxid' + cat tmpfile >> '$taxid' + #end if ]]> @@ -26,8 +35,8 @@ - - + + @@ -85,7 +94,9 @@ - + + + @@ -104,13 +115,12 @@ - + - - - + + Date: Tue, 5 Sep 2023 00:51:36 +0000 Subject: [PATCH 45/61] doc(changelog): update --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26907138..045b1184 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.2.8](https://github.com/brsynth/galaxytools/tree/0.2.8) (2023-08-28) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.7...0.2.8) + +**Merged pull requests:** + +- get\_sbml\_model, enable to load file from history [\#137](https://github.com/brsynth/galaxytools/pull/137) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) + ## [0.2.7](https://github.com/brsynth/galaxytools/tree/0.2.7) (2023-08-15) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.6...0.2.7) From ad7e677e59e2935a4ac7fd6375d6ce641c65c21b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 5 Sep 2023 12:38:52 +0200 Subject: [PATCH 46/61] chore(deps): bump actions/checkout from 3 to 4 (#140) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/lint.yml | 2 +- .github/workflows/pr.yml | 8 ++++---- .github/workflows/prworkflows.yml | 8 ++++---- .github/workflows/release.yml | 10 +++++----- .github/workflows/shed.yml | 4 ++-- .github/workflows/testtools.yml | 6 +++--- .github/workflows/testworkflows.yml | 6 +++--- .github/workflows/update.yml | 4 ++-- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b198a022..3ca3d80c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Lint Code Base diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index b4d13ff5..12f2e450 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -20,7 +20,7 @@ jobs: nb: ${{ steps.set-matrix.outputs.nb }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'Select modified files' id: files #uses: Ana06/get-changed-files@v2.2.0 @@ -46,7 +46,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'List repos' id: set-matrix run: | @@ -64,7 +64,7 @@ jobs: repo: ${{ fromJson(needs.list.outputs.matrix) }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Setup python" uses: actions/setup-python@v4 with: @@ -121,7 +121,7 @@ jobs: repo: ${{ fromJson(needs.list.outputs.matrix) }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Setup python" uses: actions/setup-python@v4 with: diff --git a/.github/workflows/prworkflows.yml b/.github/workflows/prworkflows.yml index 5462b6e9..521ba3f1 100644 --- a/.github/workflows/prworkflows.yml +++ b/.github/workflows/prworkflows.yml @@ -20,7 +20,7 @@ jobs: nb: ${{ steps.set-matrix.outputs.nb }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'Select modified files' id: files #uses: Ana06/get-changed-files@v2.2.0 @@ -46,7 +46,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'List repos' id: set-matrix run: | @@ -64,7 +64,7 @@ jobs: repo: ${{ fromJson(needs.list.outputs.matrix) }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Setup python" uses: actions/setup-python@v4 with: @@ -101,7 +101,7 @@ jobs: repo: ${{ fromJson(needs.list.outputs.matrix) }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Setup python" uses: actions/setup-python@v4 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9b46ae6b..e27aa9c4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,7 +11,7 @@ jobs: outputs: nb: ${{ steps.set-diff.outputs.nb }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 @@ -31,7 +31,7 @@ jobs: tag: ${{ steps.tag_label.outputs.tag }} changelog: ${{ steps.tag_raw.outputs.changelog }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 @@ -56,7 +56,7 @@ jobs: if: ${{ needs.Diff.outputs.nb > 0 }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 @@ -90,7 +90,7 @@ jobs: steps: # Get Data - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 @@ -124,7 +124,7 @@ jobs: if: ${{ needs.Diff.outputs.nb > 0 }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: persist-credentials: false fetch-depth: 0 diff --git a/.github/workflows/shed.yml b/.github/workflows/shed.yml index 6ae99990..6305b15c 100644 --- a/.github/workflows/shed.yml +++ b/.github/workflows/shed.yml @@ -12,7 +12,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'List repos' id: set-matrix run: echo "matrix=$(find tools -mindepth 1 -maxdepth 1 -type d | jq -R -s -c 'split("\n")[:-1] | map(split("/")[-1])')" >> "${GITHUB_OUTPUT}" @@ -27,7 +27,7 @@ jobs: repo: ${{ fromJson(needs.list.outputs.matrix) }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: "Setup python" uses: actions/setup-python@v4 with: diff --git a/.github/workflows/testtools.yml b/.github/workflows/testtools.yml index 8bb288cf..a2e3c763 100644 --- a/.github/workflows/testtools.yml +++ b/.github/workflows/testtools.yml @@ -12,7 +12,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'List repos' id: set-matrix run: echo "matrix=$(find tools -mindepth 1 -maxdepth 1 -type d | jq -R -s -c 'split("\n")[:-1] | map(split("/")[-1])')" >> "${GITHUB_OUTPUT}" @@ -23,7 +23,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'List repos' id: set-matrix run: | @@ -40,7 +40,7 @@ jobs: repo: ${{ fromJson(needs.list.outputs.matrix) }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: "Setup python" diff --git a/.github/workflows/testworkflows.yml b/.github/workflows/testworkflows.yml index acb1fd2e..fcb92af5 100644 --- a/.github/workflows/testworkflows.yml +++ b/.github/workflows/testworkflows.yml @@ -12,7 +12,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'List repos' id: set-matrix run: echo "matrix=$(find workflows -mindepth 1 -maxdepth 1 -type d | jq -R -s -c 'split("\n")[:-1] | map(split("/")[-1])')" >> "${GITHUB_OUTPUT}" @@ -23,7 +23,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'List repos' id: set-matrix run: | @@ -40,7 +40,7 @@ jobs: repo: ${{ fromJson(needs.list.outputs.matrix) }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: "Setup python" diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index fbd69802..a9130721 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -15,7 +15,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 'List repos' id: set-matrix run: echo "matrix=$(find tools -mindepth 1 -maxdepth 1 -type d | jq -R -s -c 'split("\n")[:-1] | map(split("/")[-1])')" >> "${GITHUB_OUTPUT}" @@ -29,7 +29,7 @@ jobs: repo: ${{ fromJson(needs.list.outputs.matrix) }} steps: - name: 'Checkout' - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: token: ${{ secrets.USER_TOKEN }} ref: main From 37d7be976c6f8b15b6d9dddc5301e8b8d7dca619 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 12 Sep 2023 00:51:08 +0000 Subject: [PATCH 47/61] doc(changelog): update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 045b1184..f2e9c588 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [0.2.9](https://github.com/brsynth/galaxytools/tree/0.2.9) (2023-09-01) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.8...0.2.9) + ## [0.2.8](https://github.com/brsynth/galaxytools/tree/0.2.8) (2023-08-28) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.7...0.2.8) From 6d13d6409bb0b103a7cf2887c3fcf1d0fc2e5b39 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 19 Sep 2023 00:53:16 +0000 Subject: [PATCH 48/61] doc(changelog): update --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2e9c588..48a79273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.2.10](https://github.com/brsynth/galaxytools/tree/0.2.10) (2023-09-05) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.9...0.2.10) + +**Merged pull requests:** + +- chore\(deps\): bump actions/checkout from 3 to 4 [\#140](https://github.com/brsynth/galaxytools/pull/140) ([dependabot[bot]](https://github.com/apps/dependabot)) + ## [0.2.9](https://github.com/brsynth/galaxytools/tree/0.2.9) (2023-09-01) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.8...0.2.9) From 6a7b408e749f955fe3db8d35bd0281a5acbaa67c Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 26 Sep 2023 00:53:24 +0000 Subject: [PATCH 49/61] doc(changelog): update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48a79273..bfd21c90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [0.2.11](https://github.com/brsynth/galaxytools/tree/0.2.11) (2023-09-12) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.10...0.2.11) + ## [0.2.10](https://github.com/brsynth/galaxytools/tree/0.2.10) (2023-09-05) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.9...0.2.10) From 1a86e55d9e8c539de5fe8110ba85a2489473bde4 Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Tue, 26 Sep 2023 14:58:06 +0200 Subject: [PATCH 50/61] feat(tools): get_sbml_model, load file from history (#139) --- tools/get_sbml_model/get_sbml_model.xml | 44 +++++++++++++------------ 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/tools/get_sbml_model/get_sbml_model.xml b/tools/get_sbml_model/get_sbml_model.xml index 62c93b42..63e22322 100644 --- a/tools/get_sbml_model/get_sbml_model.xml +++ b/tools/get_sbml_model/get_sbml_model.xml @@ -1,4 +1,4 @@ - + Get an SBML model (BiGG) curl @@ -10,23 +10,23 @@ '$model' && + #else + python -m taxonid '${cond_src.hostname}' --output-file tmpfile && + echo "#ID" > '$taxid' && + cat tmpfile >> '$taxid' && #end if + echo "listdir:"; + ls; python '$__tool_directory__/'get_infos.py #if str($cond_src.from_src) == 'from_bigg' '$model' + --taxid '$taxid' #else '${cond_src.input_file}' #end if --hostid '${cond_src.hostid}' --comp '$compartments' --biomass '$biomass' - #if str($cond_src.from_src) == 'from_bigg' - --taxid '$taxid' - #else - python -m taxonid '${cond_src.hostid}' --output-file tmpfile - echo "#ID" > '$taxid' - cat tmpfile >> '$taxid' - #end if ]]> @@ -35,9 +35,12 @@ - + + + + @@ -94,33 +97,32 @@ - - - + + cond_src['from_src'] == 'from_bigg' + - - - - + + - + - + + - - - + + + Date: Tue, 26 Sep 2023 18:33:11 +0200 Subject: [PATCH 51/61] fix(get_sbml_model.xml): rm weird commands --- tools/get_sbml_model/get_sbml_model.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/get_sbml_model/get_sbml_model.xml b/tools/get_sbml_model/get_sbml_model.xml index 63e22322..dbb361e5 100644 --- a/tools/get_sbml_model/get_sbml_model.xml +++ b/tools/get_sbml_model/get_sbml_model.xml @@ -15,8 +15,6 @@ echo "#ID" > '$taxid' && cat tmpfile >> '$taxid' && #end if - echo "listdir:"; - ls; python '$__tool_directory__/'get_infos.py #if str($cond_src.from_src) == 'from_bigg' '$model' From 8c6b733ffe81b3dc4f9e7d8267c629e38a346372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Tue, 26 Sep 2023 18:37:00 +0200 Subject: [PATCH 52/61] fix(get_sbml_model.xml): add --bigg --- tools/get_sbml_model/get_sbml_model.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/get_sbml_model/get_sbml_model.xml b/tools/get_sbml_model/get_sbml_model.xml index dbb361e5..005c836f 100644 --- a/tools/get_sbml_model/get_sbml_model.xml +++ b/tools/get_sbml_model/get_sbml_model.xml @@ -18,6 +18,7 @@ python '$__tool_directory__/'get_infos.py #if str($cond_src.from_src) == 'from_bigg' '$model' + --bigg --taxid '$taxid' #else '${cond_src.input_file}' From d7b02764aba67f8aa870f8114775dbc011a9cba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Tue, 26 Sep 2023 22:30:37 +0200 Subject: [PATCH 53/61] feat: add --biomass-id arg + refactor --- tools/get_sbml_model/get_infos.py | 164 +- tools/get_sbml_model/model.sbml | 169810 +++++++++++++++++++++++++++ 2 files changed, 169931 insertions(+), 43 deletions(-) create mode 100644 tools/get_sbml_model/model.sbml diff --git a/tools/get_sbml_model/get_infos.py b/tools/get_sbml_model/get_infos.py index 0eb113a9..70e0938d 100644 --- a/tools/get_sbml_model/get_infos.py +++ b/tools/get_sbml_model/get_infos.py @@ -5,7 +5,86 @@ from requests import get as r_get -def entry_point(): +def get_biomass_rxn(sbml_doc): + ''' + Returns the biomass reaction of the model + + Parameters + ---------- + sbml_doc: libsbml.SBMLDocument + SBML model + + Returns + ------- + biomass_rxn: libsbml.Reaction + Biomass reaction + ''' + reactions = sbml_doc.getModel().getListOfReactions() + # Search for 'biomass' keyword in reaction name + for rxn in reactions: + if 'biomass' in rxn.getName().lower(): + return rxn + # Search for 'biomass' keyword in products + # AND not in reactants + for rxn in reactions: + in_reactants = False + for reac in rxn.getListOfReactants(): + if 'biomass' in reac.getSpecies().lower(): + in_reactants = True + break + if not in_reactants: + for prod in rxn.getListOfProducts(): + if 'biomass' in prod.getSpecies().lower(): + return rxn + return None + + +def get_taxon_id(hostid): + ''' + Returns the taxonomy ID of the host organism + + Parameters + ---------- + hostid: str + Extended name of the host organism + + Returns + ------- + taxid: str + Taxonomy ID of the host organism + ''' + taxid = get_taxon_id(hostid) + hostname = '' + # Extended Name + server = 'http://bigg.ucsd.edu/api/v2/models/' + ext = hostid + r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) + if not r.ok: + print(f"Warning: unable to retrieve host name for id {hostid}") + else: + try: + hostname = r.json()["organism"] + except KeyError: + print(f"Warning: unable to retrieve host name for id {hostid}") + if not hostname: + taxid = '' + else: + # TAXON ID + server = 'https://rest.ensembl.org' + ext = f'/taxonomy/id/{hostname}?' + r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) + if not r.ok: + print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") + else: + try: + taxid = r.json()["id"] + except KeyError: + print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") + taxid = '' + return taxid + + +def args(): parser = ArgumentParser('Returns cell informations') parser.add_argument( 'infile', @@ -28,6 +107,11 @@ def entry_point(): type=str, help='Path to store biomass reaction ID' ) + parser.add_argument( + '--biomass-id', + type=str, + help='ID of biomass reaction' + ) parser.add_argument( '--hostid', type=str, @@ -39,63 +123,57 @@ def entry_point(): help='Path to store host taxonomy ID' ) params = parser.parse_args() + return params + + +def entry_point(): + + params = args() sbml_doc = readSBMLFromFile(params.infile) + compartments = sbml_doc.getModel().getListOfCompartments() + comp_str = '' + for comp in compartments: + comp_str += f'{comp.getId()}\t{comp.getName()}\n' if params.comp: - compartments = sbml_doc.getModel().getListOfCompartments() with open(params.comp, 'w') as f: f.write('#ID\tNAME\n') - for comp in compartments: - f.write(f'{comp.getId()}\t{comp.getName()}\n') + f.write(comp_str) + else: + print('Compartments:') + for comp in compartments: + print(f'{comp.getId()}\t{comp.getName()}'.replace('\n', ' | ')) + if params.biomass_id: + biomass_rxn = sbml_doc.getModel().getReaction(params.biomass_id) + else: + biomass_rxn = get_biomass_rxn(sbml_doc) + if not biomass_rxn: + print('Warning: unable to retrieve biomass reaction') + biomass_id = '' + else: + biomass_id = biomass_rxn.getId() if params.biomass: - reactions = sbml_doc.getModel().getListOfReactions() with open(params.biomass, 'w') as f: f.write('#ID\n') - for rxn in reactions: - if 'biomass' in rxn.getId().lower(): - f.write(f'{rxn.getId()}\n') + f.write(f'{biomass_id}\n') + else: + print(f'Biomass reaction ID: {biomass_id}') - if params.taxid: - hostname = '' - - # Model from BiGG - if params.bigg: - # Extended Name - server = 'http://bigg.ucsd.edu/api/v2/models/' - ext = params.hostid - r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) - if not r.ok: - print(f"Warning: unable to retrieve host name for id {params.hostid}") - else: - try: - hostname = r.json()["organism"] - except KeyError: - print(f"Warning: unable to retrieve host name for id {params.hostid}") - if not hostname: - taxid = '' - else: - # TAXON ID - server = 'https://rest.ensembl.org' - ext = f'/taxonomy/id/{hostname}?' - r = r_get(server+ext, headers={ "Content-Type" : "application/json"}) - if not r.ok: - print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") - else: - try: - taxid = r.json()["id"] - except KeyError: - print(f"Warning: unable to retrieve taxonomy ID for host organism {hostname}") - taxid = '' - - # Model from user - else: - taxid = params.hostid + # Model from BiGG + if params.bigg: + taxid = get_taxon_id(params.hostid) + # Model from user + else: + taxid = params.hostid + if params.taxid: with open(params.taxid, 'w') as f: f.write('#ID\n') f.write(f'{taxid}\n') + else: + print(f'Taxonomy ID: {taxid}') if __name__ == "__main__": diff --git a/tools/get_sbml_model/model.sbml b/tools/get_sbml_model/model.sbml new file mode 100644 index 00000000..75655c7c --- /dev/null +++ b/tools/get_sbml_model/model.sbml @@ -0,0 +1,169810 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From aa5a9ac47997d9c1718b9c7eaff1b83c63ac1d58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Tue, 26 Sep 2023 22:47:25 +0200 Subject: [PATCH 54/61] feat(tools): get_sbml_model, load file from history (#143) Co-authored-by: Guillaume Gricourt --- tools/get_sbml_model/.gitignore | 1 + tools/get_sbml_model/get_sbml_model.xml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/tools/get_sbml_model/.gitignore b/tools/get_sbml_model/.gitignore index e7e13ad6..e4b65458 100644 --- a/tools/get_sbml_model/.gitignore +++ b/tools/get_sbml_model/.gitignore @@ -2,3 +2,4 @@ package.json package-lock.json node_modules +planemo/ \ No newline at end of file diff --git a/tools/get_sbml_model/get_sbml_model.xml b/tools/get_sbml_model/get_sbml_model.xml index 005c836f..917b4b0e 100644 --- a/tools/get_sbml_model/get_sbml_model.xml +++ b/tools/get_sbml_model/get_sbml_model.xml @@ -15,6 +15,8 @@ echo "#ID" > '$taxid' && cat tmpfile >> '$taxid' && #end if + echo "listdir:"; + ls; python '$__tool_directory__/'get_infos.py #if str($cond_src.from_src) == 'from_bigg' '$model' From e3d02271d8fc1d37db81db5d2acfdb27ad6a3b5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Sep 2023 11:04:01 +0200 Subject: [PATCH 55/61] chore(deps): bump tj-actions/changed-files from 37 to 39 (#142) Bumps [tj-actions/changed-files](https://github.com/tj-actions/changed-files) from 37 to 39. - [Release notes](https://github.com/tj-actions/changed-files/releases) - [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md) - [Commits](https://github.com/tj-actions/changed-files/compare/v37...v39) --- updated-dependencies: - dependency-name: tj-actions/changed-files dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/pr.yml | 2 +- .github/workflows/prworkflows.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 12f2e450..48b9c3a9 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -24,7 +24,7 @@ jobs: - name: 'Select modified files' id: files #uses: Ana06/get-changed-files@v2.2.0 - uses: tj-actions/changed-files@v37 + uses: tj-actions/changed-files@v39 with: files: tools/** separator: "," diff --git a/.github/workflows/prworkflows.yml b/.github/workflows/prworkflows.yml index 521ba3f1..23077e42 100644 --- a/.github/workflows/prworkflows.yml +++ b/.github/workflows/prworkflows.yml @@ -24,7 +24,7 @@ jobs: - name: 'Select modified files' id: files #uses: Ana06/get-changed-files@v2.2.0 - uses: tj-actions/changed-files@v37 + uses: tj-actions/changed-files@v39 with: files: workflows/** separator: "," From 513db7f056db275f3f5d8d1337d39ff66012d89f Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Fri, 29 Sep 2023 11:31:38 +0200 Subject: [PATCH 56/61] Updating dnabot from version 3.1.0 to 4.1.0 (#141) * Updating dnabot from version 3.1.0 to 4.1.0 * fix(tools): dnabot, update test * fix(tools): dnabot, syntax --- tools/dnabot/dnabot.xml | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/tools/dnabot/dnabot.xml b/tools/dnabot/dnabot.xml index 6db18f80..13f9c96f 100644 --- a/tools/dnabot/dnabot.xml +++ b/tools/dnabot/dnabot.xml @@ -1,7 +1,7 @@ - + DNA assembly using BASIC on OpenTrons - 3.1.0 + 4.1.0 dnabot @@ -63,7 +63,7 @@ - + @@ -99,23 +99,12 @@ Ouput * **Dnabot scripts**: DNA-Bot scripts in TAR format which implement the 4 assembly steps and metainformation to keep track of parameters. -Version -------- - -3.1.0 - Authors ------- * **Matthew C Haines** * Thomas Duigou -License -------- - -`MIT `_ - - Acknowledgments --------------- @@ -125,4 +114,4 @@ Acknowledgments 10.1093/synbio/ysaa010 - \ No newline at end of file + From 9fe4f29ddc7f4a81ffe82551f34a3dbb606715bc Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 3 Oct 2023 00:53:51 +0000 Subject: [PATCH 57/61] doc(changelog): update --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfd21c90..be6b97ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## [0.2.12](https://github.com/brsynth/galaxytools/tree/0.2.12) (2023-09-19) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.11...0.2.12) + ## [0.2.11](https://github.com/brsynth/galaxytools/tree/0.2.11) (2023-09-12) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.10...0.2.11) From 14f6dc27a280e891c139f3100c6281bcbff3a167 Mon Sep 17 00:00:00 2001 From: GuillaumeG Date: Mon, 9 Oct 2023 16:09:06 +0200 Subject: [PATCH 58/61] feat(tools): add `neo4jsbml` (#144) * feat(tools): add `neo4jsbml` * docs(tools): update --- tools/neo4jsbml/.shed.yml | 8 + tools/neo4jsbml/neo4jsbml.xml | 76 +++++ .../test-data/PathwayModelisation-2.0.3.json | 265 ++++++++++++++++++ tools/neo4jsbml/test-data/e_coli_core.xml.gz | Bin 0 -> 39399 bytes 4 files changed, 349 insertions(+) create mode 100644 tools/neo4jsbml/.shed.yml create mode 100644 tools/neo4jsbml/neo4jsbml.xml create mode 100644 tools/neo4jsbml/test-data/PathwayModelisation-2.0.3.json create mode 100644 tools/neo4jsbml/test-data/e_coli_core.xml.gz diff --git a/tools/neo4jsbml/.shed.yml b/tools/neo4jsbml/.shed.yml new file mode 100644 index 00000000..ac5309e8 --- /dev/null +++ b/tools/neo4jsbml/.shed.yml @@ -0,0 +1,8 @@ +categories: + - Systems Biology +description: Import SBML file into Neo4j +long_description: Import SBML file into Neo4j +name: neo4jsbml +owner: tduigou +homepage_url: https://github.com/brsynth/neo4jsbml +remote_repository_url: https://github.com/brsynth/neo4jsbml diff --git a/tools/neo4jsbml/neo4jsbml.xml b/tools/neo4jsbml/neo4jsbml.xml new file mode 100644 index 00000000..3d79942e --- /dev/null +++ b/tools/neo4jsbml/neo4jsbml.xml @@ -0,0 +1,76 @@ + + Import SBML file into Neo4j + + 0.12.0 + + + neo4jsbml + + + + + + + ^(?:[\w-]*)$ + + + + + + + `_ + +Rules: +- Nodes are labelled based on SBML object name as defined in the `SBML specification `_ +- Properties are labelled based on SBML object properties as defined the `SBML specification `_ + +Step 2 +------ +Export your schema at the JSON format. + +Step 3 +------ + +Import your data with `neo4jsbml` into Neo4j. +- Use either a configuration file `ini` or individual parameters +- Password needs to be store in a file for safety security +- If you have multiple model in the database, pass a `tag` to identify the model loaded into the database if you want to avoid collision + +Inputs +------ + +- **AuraDB config like**: a txt file with these variables NEO4J_URI, NEO4J_USERNAME, NEO4J_PASSWORD and AURA_INSTANCENAME. One per line like: NEO4J_USERNAME=neo4j +- **SBML model**: SBML model +- **Identifier of the model**: Associate an ID to the nodes (optional) +- **Arrow's schema**: Schema created with Arrow + +Ouput +----- + +- Traceback of the tool +]]> + + + @unpublished{neo4jsbml + author = {Guillaume Gricourt, Thomas Duigou, Sandra Dérozier, Jean-Loup Faulon}, + title = {{Neo4jSbml}}, + url = {https://github.com/brsynth/neo4jsbml/}, + } + + + diff --git a/tools/neo4jsbml/test-data/PathwayModelisation-2.0.3.json b/tools/neo4jsbml/test-data/PathwayModelisation-2.0.3.json new file mode 100644 index 00000000..ceeb1797 --- /dev/null +++ b/tools/neo4jsbml/test-data/PathwayModelisation-2.0.3.json @@ -0,0 +1,265 @@ +{ + "style": { + "font-family": "sans-serif", + "background-color": "#ffffff", + "background-image": "", + "background-size": "100%", + "node-color": "#ffffff", + "border-width": 4, + "border-color": "#000000", + "radius": 50, + "node-padding": 5, + "node-margin": 2, + "outside-position": "auto", + "node-icon-image": "", + "node-background-image": "", + "icon-position": "inside", + "icon-size": 64, + "caption-position": "inside", + "caption-max-width": 200, + "caption-color": "#000000", + "caption-font-size": 50, + "caption-font-weight": "normal", + "label-position": "inside", + "label-display": "pill", + "label-color": "#000000", + "label-background-color": "#ffffff", + "label-border-color": "#000000", + "label-border-width": 4, + "label-font-size": 40, + "label-padding": 5, + "label-margin": 4, + "directionality": "directed", + "detail-position": "inline", + "detail-orientation": "parallel", + "arrow-width": 5, + "arrow-color": "#000000", + "margin-start": 5, + "margin-end": 5, + "margin-peer": 20, + "attachment-start": "normal", + "attachment-end": "normal", + "relationship-icon-image": "", + "type-color": "#000000", + "type-background-color": "#ffffff", + "type-border-color": "#000000", + "type-border-width": 0, + "type-font-size": 16, + "type-padding": 5, + "property-position": "outside", + "property-alignment": "colon", + "property-color": "#000000", + "property-font-size": 16, + "property-font-weight": "normal" + }, + "nodes": [ + { + "id": "n0", + "position": { + "x": 0, + "y": 0 + }, + "caption": "", + "style": {}, + "labels": [], + "properties": {} + }, + { + "id": "n1", + "position": { + "x": 884.6635137872785, + "y": 380.3581544878789 + }, + "caption": "", + "labels": [ + "Compartment" + ], + "properties": { + "id": "str (required)", + "name": "str (optional)", + "metaid": "str (optional)", + "sboTerm": "str (optional)", + "spatialDimensions": "int (optional)", + "size": "int (optional)", + "constant": "bool (optional)" + }, + "style": {} + }, + { + "id": "n2", + "position": { + "x": 560.2494455950304, + "y": 380.3581544878789 + }, + "caption": "", + "labels": [ + "Species" + ], + "properties": { + "id": "str (required)", + "initialAmount": "float (optional)", + "hasOnlySubstanceUnits": "bool (optional)", + "boundaryCondition": "bool (optional)", + "constant": "bool (optional)" + }, + "style": {} + }, + { + "id": "n3", + "position": { + "x": 432.24944559503035, + "y": 204.94864525928773 + }, + "caption": "", + "labels": [ + "Parameter" + ], + "properties": { + "id": "str (required)", + "name": "str (optional)", + "metaid": "str (optional)", + "sboTerm": "str (optional)", + "value": "float (optional)", + "constant": "bool" + }, + "style": {} + }, + { + "id": "n4", + "position": { + "x": 833.1523435518487, + "y": 204.94864525928796 + }, + "caption": "", + "labels": [ + "Reaction" + ], + "properties": { + "id": "str (required)", + "name": "str (optional)", + "metaid": "str (optional)", + "sboTerm": "str (optional)", + "reversible": "bool" + }, + "style": {} + }, + { + "id": "n5", + "position": { + "x": 129, + "y": 204.94864525928773 + }, + "caption": "", + "labels": [ + "model" + ], + "properties": { + "id": "str", + "name": "str", + "metaid": "str", + "sboTerm": "str" + }, + "style": {} + }, + { + "id": "n6", + "position": { + "x": 129, + "y": 380.3581544878789 + }, + "caption": "", + "labels": [ + "UnitDefinition" + ], + "properties": { + "id": "str (optional)", + "name": "str (optional)", + "metaid": "str (optional)", + "sboTerm": "str (optional)" + }, + "style": {} + }, + { + "id": "n7", + "position": { + "x": 560.2494455950304, + "y": -4 + }, + "caption": "", + "labels": [ + "GeneProduct" + ], + "properties": { + "id": "str", + "name": "str" + }, + "style": {} + } + ], + "relationships": [ + { + "id": "n0", + "fromId": "n2", + "toId": "n1", + "type": "IN_COMPARTMENT", + "properties": {}, + "style": {} + }, + { + "id": "n1", + "fromId": "n4", + "toId": "n2", + "type": "HAS_PRODUCT", + "properties": {}, + "style": {} + }, + { + "id": "n2", + "fromId": "n4", + "toId": "n3", + "type": "HAS_LOWERFLUXBOUND", + "properties": {}, + "style": {} + }, + { + "id": "n3", + "fromId": "n5", + "toId": "n3", + "type": "HAS_PARAMETER", + "properties": {}, + "style": {} + }, + { + "id": "n4", + "type": "HAS_UNITS", + "style": {}, + "properties": {}, + "fromId": "n3", + "toId": "n6" + }, + { + "id": "n5", + "fromId": "n4", + "toId": "n3", + "type": "HAS_UPPERFLUXBOUND", + "properties": {}, + "style": {} + }, + { + "id": "n6", + "fromId": "n4", + "toId": "n7", + "type": "IS_IMPLIED", + "properties": {}, + "style": {} + }, + { + "id": "n7", + "fromId": "n2", + "toId": "n4", + "type": "IS_REACTANT", + "properties": {}, + "style": {} + } + ] +} \ No newline at end of file diff --git a/tools/neo4jsbml/test-data/e_coli_core.xml.gz b/tools/neo4jsbml/test-data/e_coli_core.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..f85bd85055780a8f6acf30fa79878c000dc38394 GIT binary patch literal 39399 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%0D%g&81WQoHURdqwKT&* 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 a`^mTg{`dc|r}%&WkN*qa!&-G-$_fAh>8TF@ literal 0 HcmV?d00001 From f8bd74925ba212d7958340e1440bb6b0c0a4ab76 Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 10 Oct 2023 00:53:01 +0000 Subject: [PATCH 59/61] doc(changelog): update --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be6b97ae..fee2405d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## [0.3.0](https://github.com/brsynth/galaxytools/tree/0.3.0) (2023-09-29) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.12...0.3.0) + +**Merged pull requests:** + +- Get sbml model [\#143](https://github.com/brsynth/galaxytools/pull/143) ([breakthewall](https://github.com/breakthewall)) +- chore\(deps\): bump tj-actions/changed-files from 37 to 39 [\#142](https://github.com/brsynth/galaxytools/pull/142) ([dependabot[bot]](https://github.com/apps/dependabot)) +- Updating dnabot from version 3.1.0 to 4.1.0 [\#141](https://github.com/brsynth/galaxytools/pull/141) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) +- get\_sbml\_model, load file from history [\#139](https://github.com/brsynth/galaxytools/pull/139) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) + ## [0.2.12](https://github.com/brsynth/galaxytools/tree/0.2.12) (2023-09-19) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.11...0.2.12) From 1ce9c19b7ed1a5df6307f1eb64eed2539ea1fa0d Mon Sep 17 00:00:00 2001 From: guillaume-gricourt Date: Tue, 17 Oct 2023 00:53:59 +0000 Subject: [PATCH 60/61] doc(changelog): update --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fee2405d..3867b5b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.4.0](https://github.com/brsynth/galaxytools/tree/0.4.0) (2023-10-09) + +[Full Changelog](https://github.com/brsynth/galaxytools/compare/0.3.0...0.4.0) + +**Merged pull requests:** + +- Add tool `neo4jsbml` [\#144](https://github.com/brsynth/galaxytools/pull/144) ([guillaume-gricourt](https://github.com/guillaume-gricourt)) + ## [0.3.0](https://github.com/brsynth/galaxytools/tree/0.3.0) (2023-09-29) [Full Changelog](https://github.com/brsynth/galaxytools/compare/0.2.12...0.3.0) From 8963ffc51170ec079a8c5719d7d33d8f8d9d3dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20H=C3=A9risson?= Date: Fri, 20 Oct 2023 21:35:49 +0200 Subject: [PATCH 61/61] Rptools (#146) * feat(rpextractsink): add --standalone arg * chore(rp2paths): update version * chore(rptools): v 6.3.0 --- tools/rp2paths/rp2paths.xml | 2 +- tools/rptools/macros.xml | 2 +- tools/rptools/rpextractsink.xml | 7 +++++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tools/rp2paths/rp2paths.xml b/tools/rp2paths/rp2paths.xml index 3b77642b..cc040bfa 100644 --- a/tools/rp2paths/rp2paths.xml +++ b/tools/rp2paths/rp2paths.xml @@ -1,7 +1,7 @@ Enumerate and seperate the different pathways generated by RetroPath2.0 - 1.5.0 + 1.5.1 rp2paths diff --git a/tools/rptools/macros.xml b/tools/rptools/macros.xml index d31cddda..8f7f5ef3 100644 --- a/tools/rptools/macros.xml +++ b/tools/rptools/macros.xml @@ -1,5 +1,5 @@ - 6.2.3 + 6.3.0 0 diff --git a/tools/rptools/rpextractsink.xml b/tools/rptools/rpextractsink.xml index 8ea09d69..2e27ce91 100644 --- a/tools/rptools/rpextractsink.xml +++ b/tools/rptools/rpextractsink.xml @@ -11,8 +11,9 @@ python -m rptools.rpextractsink '$input' '$sink' - --compartment_id '$compartment_id' + --compartment-id '$compartment_id' $adv.remove_dead_end + $adv.standalone --cache-dir "\${TMPDIR:-.}" ]]> @@ -21,7 +22,8 @@
- + +
@@ -55,6 +57,7 @@ Required: Advanced options: * **Remove dead-end metabolites using FVA evaluation?**\ : (boolean, default: True) Perform FVA (Flux Variability Analysis) evaluation to remove dead end metabolites. +* **Do not connect to Internet**: (boolean, default: False) If True, do not retrieve InChI from Internet Output ------