From 277c25a4106cf76257ad81265acb2fa5e5d34f2e Mon Sep 17 00:00:00 2001 From: js2264 Date: Fri, 3 Nov 2023 13:31:39 +0100 Subject: [PATCH] book: switch to BiocBook format --- .Rbuildignore | 8 + .github/CODE_OF_CONDUCT.md | 17 + .github/workflows/biocbook.yml | 111 ++++++ .github/workflows/deploy-bookdown.yaml | 100 ----- .github/workflows/rworkflows.yml | 53 +++ DESCRIPTION | 7 +- Dockerfile | 23 +- LICENSE | 2 + LICENSE.md | 21 + Makefile | 60 --- OHCA.scss | 153 -------- _common.R | 23 -- _quarto.yml | 68 ---- atom-one-dark.theme | 370 ------------------ inst/.gitignore | 6 + inst/_quarto.yml | 12 + inst/assets/_book.yml | 37 ++ inst/assets/_format.yml | 18 + inst/assets/_knitr.yml | 15 + inst/assets/_website.yml | 14 + apa.csl => inst/assets/apa.csl | 0 .../assets/bibliography.bib | 38 +- inst/assets/book.scss | 212 ++++++++++ cover.jpg => inst/assets/cover.jpg | Bin .../section-bibliographies/_extension.yml | 0 .../section-bibliographies.lua | 0 .../tools-tabset-ext/tools-tabset.lua | 39 ++ index.qmd => inst/index.qmd | 81 ++-- .../pages/data-representation.qmd | 48 ++- .../pages/disseminating.qmd | 16 +- .../pages/images}/20230215221337.png | Bin .../pages/images}/20230221172531.png | Bin .../pages/images}/20230303125432.png | Bin .../pages/images}/20230306102639.png | Bin .../pages/images}/20230309114047.png | Bin .../pages/images}/20230309114202.png | Bin .../pages/images}/20230321230247.png | Bin .../pages/images}/20230321233026.png | Bin .../pages/images}/20230322002953.png | Bin .../pages/images}/20230322003342.png | Bin .../pages/images}/20230322085136.png | Bin .../pages/images}/20230322102803.png | Bin .../pages/images}/20230322102919.png | Bin .../pages/images}/20230322181000.png | Bin .../pages/images}/20230322181300.png | Bin .../pages/images}/20230324125800.png | Bin .../pages/images}/20230327182802.png | Bin .../pages/images}/20230403090000.png | Bin .../pages/images}/20230403134800.png | Bin .../pages/images}/20230421134800.jpg | Bin .../pages/images}/20230523141745.jpg | Bin .../pages/images}/20230523144800.png | Bin .../pages/images}/20230523152700.png | Bin .../pages/images}/20230523153300.png | Bin .../pages/images}/20230523180000.png | Bin .../pages/images}/20230523180300.png | Bin .../pages/images}/20230525134200.png | Bin inst/pages/images/rstudio-logo.jpg | Bin 0 -> 33306 bytes inst/pages/images/text-editor-logo.jpg | Bin 0 -> 6112 bytes inst/pages/images/vscode-logo.jpg | Bin 0 -> 32432 bytes .../pages/interactions-centric.qmd | 19 +- .../pages/interoperability.qmd | 21 +- .../pages/matrix-centric.qmd | 40 +- parsing.qmd => inst/pages/parsing.qmd | 37 +- preamble.qmd => inst/pages/preamble.qmd | 13 +- principles.qmd => inst/pages/principles.qmd | 26 +- .../pages/topological-features.qmd | 16 +- .../pages/visualization.qmd | 20 +- .../pages/workflow-centros.qmd | 12 +- .../pages/workflow-chicken.qmd | 28 +- .../pages/workflow-yeast.qmd | 26 +- inst/requirements.yml | 8 + vignettes/Makefile | 5 + vignettes/stub.Rmd | 19 + workflow-multiomics.qmd | 215 ---------- 75 files changed, 864 insertions(+), 1193 deletions(-) create mode 100644 .Rbuildignore create mode 100644 .github/CODE_OF_CONDUCT.md create mode 100644 .github/workflows/biocbook.yml delete mode 100644 .github/workflows/deploy-bookdown.yaml create mode 100644 .github/workflows/rworkflows.yml create mode 100644 LICENSE create mode 100644 LICENSE.md delete mode 100644 Makefile delete mode 100644 OHCA.scss delete mode 100644 _common.R delete mode 100644 _quarto.yml delete mode 100644 atom-one-dark.theme create mode 100644 inst/.gitignore create mode 100644 inst/_quarto.yml create mode 100644 inst/assets/_book.yml create mode 100644 inst/assets/_format.yml create mode 100644 inst/assets/_knitr.yml create mode 100644 inst/assets/_website.yml rename apa.csl => inst/assets/apa.csl (100%) rename bibliography.bib => inst/assets/bibliography.bib (94%) create mode 100644 inst/assets/book.scss rename cover.jpg => inst/assets/cover.jpg (100%) rename {_extensions => inst/extensions}/pandoc-ext/section-bibliographies/_extension.yml (100%) rename {_extensions => inst/extensions}/pandoc-ext/section-bibliographies/section-bibliographies.lua (100%) create mode 100644 inst/extensions/tools-tabset-ext/tools-tabset.lua rename index.qmd => inst/index.qmd (82%) rename data-representation.qmd => inst/pages/data-representation.qmd (99%) rename disseminating.qmd => inst/pages/disseminating.qmd (99%) rename {images => inst/pages/images}/20230215221337.png (100%) rename {images => inst/pages/images}/20230221172531.png (100%) rename {images => inst/pages/images}/20230303125432.png (100%) rename {images => inst/pages/images}/20230306102639.png (100%) rename {images => inst/pages/images}/20230309114047.png (100%) rename {images => inst/pages/images}/20230309114202.png (100%) rename {images => inst/pages/images}/20230321230247.png (100%) rename {images => inst/pages/images}/20230321233026.png (100%) rename {images => inst/pages/images}/20230322002953.png (100%) rename {images => inst/pages/images}/20230322003342.png (100%) rename {images => inst/pages/images}/20230322085136.png (100%) rename {images => inst/pages/images}/20230322102803.png (100%) rename {images => inst/pages/images}/20230322102919.png (100%) rename {images => inst/pages/images}/20230322181000.png (100%) rename {images => inst/pages/images}/20230322181300.png (100%) rename {images => inst/pages/images}/20230324125800.png (100%) rename {images => inst/pages/images}/20230327182802.png (100%) rename {images => inst/pages/images}/20230403090000.png (100%) rename {images => inst/pages/images}/20230403134800.png (100%) rename {images => inst/pages/images}/20230421134800.jpg (100%) rename {images => inst/pages/images}/20230523141745.jpg (100%) rename {images => inst/pages/images}/20230523144800.png (100%) rename {images => inst/pages/images}/20230523152700.png (100%) rename {images => inst/pages/images}/20230523153300.png (100%) rename {images => inst/pages/images}/20230523180000.png (100%) rename {images => inst/pages/images}/20230523180300.png (100%) rename {images => inst/pages/images}/20230525134200.png (100%) create mode 100644 inst/pages/images/rstudio-logo.jpg create mode 100644 inst/pages/images/text-editor-logo.jpg create mode 100644 inst/pages/images/vscode-logo.jpg rename interactions-centric.qmd => inst/pages/interactions-centric.qmd (97%) rename interoperability.qmd => inst/pages/interoperability.qmd (97%) rename matrix-centric.qmd => inst/pages/matrix-centric.qmd (97%) rename parsing.qmd => inst/pages/parsing.qmd (97%) rename preamble.qmd => inst/pages/preamble.qmd (97%) rename principles.qmd => inst/pages/principles.qmd (97%) rename topological-features.qmd => inst/pages/topological-features.qmd (98%) rename visualization.qmd => inst/pages/visualization.qmd (97%) rename workflow-centros.qmd => inst/pages/workflow-centros.qmd (97%) rename workflow-chicken.qmd => inst/pages/workflow-chicken.qmd (97%) rename workflow-yeast.qmd => inst/pages/workflow-yeast.qmd (98%) create mode 100644 inst/requirements.yml create mode 100644 vignettes/Makefile create mode 100644 vignettes/stub.Rmd delete mode 100644 workflow-multiomics.qmd diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..680036d --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,8 @@ +^inst/\.quarto$ +^\.png$ +^\.quarto$ +^\.github$ +^LICENSE\.md$ +^NOTES\.md$ +^README\.Rmd$ +^Dockerfile$ diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..655e9e9 --- /dev/null +++ b/.github/CODE_OF_CONDUCT.md @@ -0,0 +1,17 @@ +The Bioconductor community values + +* an open approach to science that promotes the sharing of ideas, code, and expertise +* collaboration +* diversity and inclusivity +* a kind and welcoming environment +* community contributions + +In line with these values, Bioconductor is dedicated to providing a welcoming, supportive, collegial, experience free of harassment, intimidation, and bullying regardless of: + +* identity: gender, gender identity and expression, sexual orientation, disability, physical appearance, ethnicity, body size, race, age, religion, etc. +* intellectual position: approaches to data analysis, software preferences, coding style, scientific perspective, etc. +* stage of career + +In order to uphold these values, members of the Bioconductor community are required to follow the Code of Conduct.The latest version of Bioconductor project Code of Conduct is available at http://bioconductor.org/about/code-of-conduct/. Please read the Code of Conduct before contributing to this project. + +Thank you! diff --git a/.github/workflows/biocbook.yml b/.github/workflows/biocbook.yml new file mode 100644 index 0000000..723be33 --- /dev/null +++ b/.github/workflows/biocbook.yml @@ -0,0 +1,111 @@ +name: biocbook + +on: + push: + branches: + - devel + - RELEASE_** + +jobs: + build-push: + runs-on: ubuntu-latest + name: build-book (${{ github.ref_name }}) + permissions: + contents: write + packages: write + + steps: + + - name: 🧾 Checkout repository + uses: actions/checkout@v3 + + - name: ⏳ Collect Workflow Telemetry + uses: runforesight/workflow-telemetry-action@v1 + + - name: 🐳 Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: 🐳 Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: πŸ“ Get book info + id: info + env: + OWNER: ${{ github.repository_owner }} + run: | + Pkgname=$(grep -m1 -E '^Package: +' DESCRIPTION | sed -E 's/.*: +//') + echo Pkgname=${Pkgname} >> "${GITHUB_ENV}" + pkgname=${Pkgname,,} + echo pkgname=${pkgname} >> "${GITHUB_ENV}" + owner=${OWNER,,} + echo owner=${owner} >> "${GITHUB_ENV}" + echo pkgversion=$(grep -m1 -E '^Version: +' DESCRIPTION | sed -E 's/.*: +//') >> "${GITHUB_ENV}" + + - name: πŸ” Log in to the Github Container registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ env.owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: 🏷 Get metadata for Docker + id: meta + uses: docker/metadata-action@v4 + with: + images: ghcr.io/${{ env.owner }}/${{ env.pkgname }} + tags: | + ${{ github.ref_name }} + ${{ env.pkgversion }} + type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'devel') }} + + - name: πŸ“¦ Install, build and check package in local Docker image + id: docker + uses: docker/build-push-action@v4 + with: + context: . + load: true + tags: ${{ steps.meta.outputs.tags }} + build-args: | + BIOC_VERSION=${{ github.ref_name }} + + - name: πŸš€ Push local Docker image to ghcr.io + uses: docker/build-push-action@v4 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + build-args: | + BIOC_VERSION=${{ github.ref_name }} + + - name: πŸ“š Recover pkg artifacts generated during build in local Docker container (pkg bundle and book) + env: + IMG: ${{ steps.docker.outputs.ImageID }} + run: | + SHA=$(docker container create ${{ env.IMG }}) + docker container cp ${SHA}:/${{ env.Pkgname }}_${{ env.pkgversion }}.tar.gz . + tar --extract --gzip --file ${{ env.Pkgname }}_${{ env.pkgversion }}.tar.gz + echo bundle_path=${{ env.Pkgname }}_${{ env.pkgversion }}.tar.gz >> "${GITHUB_ENV}" + echo book_path=${{ env.Pkgname }}/inst/doc/book/ >> "${GITHUB_ENV}" + + - name: 🏷 Get gh-branch directory to deploy to + run: | + echo target_folder=$(echo ${{ github.ref_name }} | sed 's,RELEASE_,,' | tr '_' '.') >> "${GITHUB_ENV}" + + - name: πŸš€ Deploy book to Github Pages on versioned branch + uses: JamesIves/github-pages-deploy-action@v4.4.3 + with: + folder: ${{ env.book_path }}/ + target-folder: docs/${{ env.target_folder }}/ + branch: gh-pages + clean: false + + - name: πŸ’Ύ Upload package bundle artifact + uses: actions/upload-artifact@v3 + with: + name: bundle + path: ${{ env.bundle_path }} + + - name: πŸ’Ύ Upload book artifact + uses: actions/upload-artifact@v3 + with: + name: book + path: ${{ env.book_path }} diff --git a/.github/workflows/deploy-bookdown.yaml b/.github/workflows/deploy-bookdown.yaml deleted file mode 100644 index fb68f04..0000000 --- a/.github/workflows/deploy-bookdown.yaml +++ /dev/null @@ -1,100 +0,0 @@ -name: Docker image - -on: - schedule: - - cron: '0 1 1,16 * *' - push: - branches: - - main - -env: - registry: ghcr.io - user: js2264 - repository: ohca - -jobs: - build-push: - strategy: - matrix: - BIOC_VERSION: [devel, RELEASE_3_17] - runs-on: ubuntu-latest - name: ${{ matrix.BIOC_VERSION }} - permissions: - contents: read - packages: write - steps: - - - name: 🧾 Checkout repository - uses: actions/checkout@v3 - with: - persist-credentials: false - - - name: πŸ“€ Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@v1.3.0 - - - name: 𝌚 Get current package version - id: version - run: | - version=$(grep -m1 -E '^Version: +' DESCRIPTION | sed -E 's/.*: +//') - - - name: πŸ” Log in to the Container registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.PAT_GITHUB }} - - - name: 🏷 Get metadata for Docker - id: meta - uses: docker/metadata-action@v4 - with: - images: ghcr.io/js2264/ohca - tags: | - type=raw,value=latest,enable=true - type=raw,value=${{ steps.version.outputs.version }},enable=true - type=raw,value=bioc_${{ matrix.BIOC_VERSION }},enable=true - - - name: πŸ‘· Build and push multi-arch Docker image - uses: docker/build-push-action@v4 - with: - context: . - GITHUB_TOKEN: ${{ secrets.PAT_GITHUB }} - platforms: linux/amd64 - file: Dockerfile - push: true - tags: ${{ steps.meta.outputs.tags }} - outputs: type=image,annotation-index.org.opencontainers.image.description=OHCA - build-args: | - VERSION=${{ steps.version.outputs.version }} - BIOC_VERSION=${{ matrix.BIOC_VERSION }} - - - render-deploy: - needs: build-push - strategy: - matrix: - BIOC_VERSION: [devel] - runs-on: ubuntu-latest - container: ghcr.io/js2264/ohca:bioc_${{ matrix.BIOC_VERSION }} - steps: - - - name: 🧾 Checkout repository - uses: actions/checkout@v3 - with: - persist-credentials: false - - - name: πŸ–Œ Render OHCA book from versionized OHCA container - run: | - quarto install tinytex - quarto render - - - name: πŸ“š Install rsync - run: | - apt-get update && apt-get install -y rsync - - - name: πŸš€ Deploy OHCA book to Github Pages on versionized branch - uses: JamesIves/github-pages-deploy-action@v4.4.3 - with: - folder: docs/ - branch: bioc_${{ matrix.BIOC_VERSION }} - clean: true diff --git a/.github/workflows/rworkflows.yml b/.github/workflows/rworkflows.yml new file mode 100644 index 0000000..0df685c --- /dev/null +++ b/.github/workflows/rworkflows.yml @@ -0,0 +1,53 @@ +## Adapted from neurogenomics/rworkflows: rworkflows::use_workflow() + +name: rworkflows +'on': + push: + branches: + - devel + - RELEASE_** + pull_request: + branches: + - devel + - RELEASE_** + +jobs: + rworkflows: + runs-on: ${{ matrix.config.os }} + name: ${{ matrix.config.os }} (${{ matrix.config.r }}) + container: ${{ matrix.config.cont }} + strategy: + fail-fast: ${{ false }} + matrix: + config: + - os: ubuntu-latest + bioc: devel + r: auto + cont: ghcr.io/bioconductor/bioconductor:devel + rspm: https://packagemanager.rstudio.com/cran/__linux__/focal/release + # - os: macOS-latest + # bioc: release + # r: auto + # cont: ~ + # rspm: ~ + # - os: windows-latest + # bioc: release + # r: auto + # cont: ~ + # rspm: ~ + steps: + - uses: neurogenomics/rworkflows@master + with: + run_bioccheck: ${{ false }} + run_rcmdcheck: ${{ true }} + as_cran: ${{ false }} + run_vignettes: ${{ false }} + has_testthat: ${{ true }} + run_covr: ${{ false }} + run_pkgdown: ${{ false }} + has_runit: ${{ false }} + has_latex: ${{ false }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run_docker: ${{ false }} + runner_os: ${{ runner.os }} + cache_version: cache-v1 diff --git a/DESCRIPTION b/DESCRIPTION index d02532a..83302eb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -22,6 +22,9 @@ Depends: fourDNData Imports: plyinteractions, + terra, + Rfast, + WGCNA, diffHic, strawr, hicrep, @@ -37,9 +40,9 @@ Imports: rebook, quarto, sessioninfo +Suggests: Remotes: - github::TaoYang-dev/hicrep, - github::tidyomics/plyinteractions + github::TaoYang-dev/hicrep biocViews: HiC, DNA3DStructure diff --git a/Dockerfile b/Dockerfile index a189f5f..40cadc5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,10 @@ ARG BIOC_VERSION -ARG VERSION - -# Pull the base image from bioconductor/bioconductor_docker FROM bioconductor/bioconductor_docker:${BIOC_VERSION} +COPY . /opt/pkg -LABEL org.opencontainers.image.source=https://github.com/js2264/OHCA -LABEL org.opencontainers.image.documentation=https://js2264.github.io/OHCA -LABEL org.opencontainers.image.authors="OHCA authors" -LABEL org.opencontainers.image.description="Orchestrating Hi-C analysis with Bioconductor" -LABEL org.opencontainers.image.licenses=MIT -LABEL org.opencontainers.image.version ${VERSION} +# Install book package +RUN Rscript -e 'repos <- BiocManager::repositories() ; remotes::install_local(path = "/opt/pkg/", repos=repos, dependencies=TRUE, build_vignettes=FALSE, upgrade=TRUE) ; sessioninfo::session_info(installed.packages()[,"Package"], include_base = TRUE)' -# Install quarto -# Install OHCA package suite -# Install OHCA package itself -# Print info -# Cleanup files -WORKDIR /opt/OHCA -COPY . /opt/OHCA -RUN make +## Build/install using same approach than BBS +RUN R CMD INSTALL /opt/pkg +RUN quarto install tinytex && R CMD build --keep-empty-dirs --no-resave-data /opt/pkg diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8df9cbc --- /dev/null +++ b/LICENSE @@ -0,0 +1,2 @@ +YEAR: 2023 +COPYRIGHT HOLDER: Jacques Serizay diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..6e4f550 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2023 Jacques Serizay + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile deleted file mode 100644 index 9459926..0000000 --- a/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -RCMD := Rscript -e - -.PHONY: quarto -quarto: ## Update to latest available quarto - @echo "πŸ’Ύ Installing latest Quarto CLI" - wget https://quarto.org/docs/download/_download.json;\ - ver=$$(grep -o '"version": "[^"]*' _download.json | grep -o '[^"]*$$');\ - wget https://github.com/quarto-dev/quarto-cli/releases/download/v"$${ver}"/quarto-"$${ver}"-linux-amd64.deb;\ - sudo dpkg -i quarto-"$${ver}"-linux-amd64.deb;\ - rm quarto-"$${ver}"-linux-amd64.deb;\ - rm _download.json;\ - quarto --version;\ - -.PHONY: setup -setup: ## Install HiCExperiment & co packages with pak. - @echo "πŸ“¦ Installing OHCA core packages" - $(RCMD) 'install.packages("pak", repos = "https://r-lib.github.io/p/pak/devel/")' - $(RCMD) 'write(paste0("R_BIOC_VERSION=", gsub(".[0-9]*$$", "", as.character(packageVersion("BiocVersion")))), paste0(Sys.getenv("R_HOME"), "/etc/Renviron.site"), append = TRUE)' - $(RCMD) 'pak::repo_status()$$url' - $(RCMD) 'pak::pkg_install("HiCExperiment", ask = FALSE, dependencies = c("Depends", "Imports", "Suggests"))' - $(RCMD) 'remove.packages(c("HiContacts"))' - $(RCMD) 'pak::pkg_install("HiContacts", upgrade = TRUE, ask = FALSE, dependencies = c("Depends", "Imports", "Suggests"))' - $(RCMD) 'pak::pkg_install("HiCool", upgrade = TRUE, ask = FALSE, dependencies = c("Depends", "Imports", "Suggests"))' - $(RCMD) 'pak::pkg_install("HiContactsData", upgrade = TRUE, ask = FALSE, dependencies = c("Depends", "Imports", "Suggests"))' - $(RCMD) 'pak::pkg_install("fourDNData", upgrade = TRUE, ask = FALSE, dependencies = c("Depends", "Imports", "Suggests"))' - $(RCMD) 'pak::pkg_install("DNAZooData", upgrade = TRUE, ask = FALSE, dependencies = c("Depends", "Imports", "Suggests"))' - $(RCMD) 'pak::pkg_install("tidyomics/plyinteractions", upgrade = TRUE, ask = FALSE, dependencies = c("Depends", "Imports", "Suggests"))' - -.PHONY: install -install: ## Install OHCA package and dependencies with pak. - @echo "πŸš€ Installing OHCA book package" - $(RCMD) 'pak::pkg_install(".", ask = FALSE, dependencies = c("Depends", "Imports", "Suggests"))' - -.PHONY: info -info: ## list installed packages - @echo "πŸ—‚ Listing installed packages" - $(RCMD) 'pkgs <- installed.packages()[,"Package"] ; sessioninfo::session_info(pkgs, include_base = TRUE)' - -.PHONY: render -render: ## Render OHCA book - @echo "πŸ“– Rendering OHCA book" - $(RCMD) 'pkgs <- installed.packages()[,"Package"] ; sessioninfo::session_info(pkgs, include_base = TRUE)' - quarto render --to html - -.PHONY: cleanup -cleanup: ## Removing temp files before pushing to ghcr.io - @echo "🧹 Cleaning up" - $(RCMD) 'pak::cache_clean()' - rm -rf /tmp/* - rm -rf *_cache - df -h - -.PHONY: help -help: - @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}' - -.PHONY: all -all: quarto setup install info cleanup - -.DEFAULT_GOAL := all diff --git a/OHCA.scss b/OHCA.scss deleted file mode 100644 index ecf14bc..0000000 --- a/OHCA.scss +++ /dev/null @@ -1,153 +0,0 @@ -/*-- scss:defaults --*/ - -$primary: #008CBA !default; - -/*-- scss:rules --*/ - -.sidebar-title { - // color: #480F1F; -} - -img.quarto-cover-image { - box-shadow: 0 .5rem 1rem rgba(0,0,0,.15); -} - -/* Central column page ------------------------------------------------------ */ - -@media (min-width: 992px){ -body.floating .page-columns { - display: grid; - gap: 0; - // grid-template-columns: [screen-start] 1.5em [screen-start-inset] 5fr [page-start] minmax(25px, 50px) [page-start-inset] minmax(50px, 150px) [body-start-outset] minmax(25px, 50px) [body-start] 1.5em [body-content-start] minmax(500px, calc( 1000px - 3em )) [body-content-end] 1.5em [body-end] minmax(25px, 50px) [body-end-outset] minmax(50px, 150px) [page-end-inset] minmax(25px, 50px) [page-end] 5fr [screen-end-inset] 1.5em [screen-end]; - grid-template-columns: [screen-start] 0em [screen-start-inset] 0fr [page-start] minmax(300px, 25%) [body-start-outset] 0em [body-start] 1.5em [body-content-start] minmax(500px, 50%) [body-content-end] 1.5em [body-end] 0em [body-end-outset] minmax(50px, 15%) [page-end-inset] minmax(25px, 50px) [page-end] 0fr [screen-end-inset] 0em [screen-end]; - grid-template-columns: [screen-start] 0em [screen-start-inset] 0em [page-start] minmax(300px, 25%) [body-start-outset] 0em [body-start] 3.5em [body-content-start] minmax(500px, 50%) [body-content-end] 1.5em [body-end] 0em [body-end-outset] minmax(50px, 15%) [page-end-inset] minmax(25px, 50px) [page-end] 0fr [screen-end-inset] 0em [screen-end]; -}} -main { - margin-top: 0em; -} -div.sidebar.sidebar-navigation.rollup.quarto-sidebar-toggle-contents, nav.sidebar.sidebar-navigation:not(.rollup) { - background-color: #f1f1f1; -} - -/* Left navbar ------------------------------------------------------ */ - -div.sidebar-item-container .active, div.sidebar-item-container .show>.nav-link, div.sidebar-item-container .sidebar-link>code { - // color: #480f1f; - font-weight: 800; -} - -.text-start { - text-align: left !important; - font-weight: 800; -} - -#quarto-sidebar { - transition: width .15s ease-in; - padding: 14px 10%; -} - -/* right navbar ------------------------------------------------------ */ - -.sidebar nav[role=doc-toc] ul>li>a.active, .sidebar nav[role=doc-toc] ul>li>ul>li>a.active { - // border-left: 4px solid #480f1f; - border-left: 4px solid; - // color: #480f1f !important; - font-weight: 800; -} - -#toc-title+ ul > li > .nav-link { - font-weight: 800; -} - -/* Headings ------------------------------------------------------ */ - -h2 { - margin-top: 3rem; - margin-bottom: 1rem; - font-size: 1.5rem; -} -h3 { margin-top: 1.5em; font-size: 1.2rem; } -h4 { margin-top: 1.5em; font-size: 1.1rem; } -h5 { margin-top: 1.5em; font-size: 1rem; } - -h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5 { - line-height: 2; - font-weight: 700; -} - -.quarto-section-identifier { - color: #6C6C6C; - font-weight: normal; -} - -/* Underlining links ------------------------------------ */ - -.citation a, .footnote-ref { - text-decoration: underline; -} - -/* Put a border around session info print ------------------------------------------------ */ - -#session-info code, p+ pre code { - // border: 1px solid black -} - -/* Code colors ------------------------------------------------------------------------- */ - -// Text color of `backticked` words -code { - color: #008CBA; -} - -// Border of `backticked` words -li code , .anchored code , p code , .flex-fill code { - // border: 1px solid #008CBA; -} -kbd, samp { - // border: 1px solid; -} - -// background color of chunks of code *WITH A SPECIFIED LANGUAGE* -div.sourceCode { - // background-color: rgba(0, 170, 227, 0.025); - background-color: #f1f1f1; - border: none; -} - -pre.sourceCode { - border: none; - font-size: .875em; - overflow: visible !important; -} - -pre code { - background-color: transparent; - font-size: inherit; - color: inherit; - word-break: normal; - // border: 1px solid rgb(0 0 0 / 65%); -} - -.cell-output-stdout code , .code-with-filename code , .cell-output-stderr code { - background-image: linear-gradient(160deg,#f8f8f8 0,#f1f1f1 100%); -} - -/* Printing ------------------------------------------------ */ - -@media print { - :root { - font-size: 11pt; - } - #quarto-sidebar, #TOC, .nav-page { - display: none; - } - .page-columns .content { - grid-column-start: page-start; - } - .fixed-top { - position: relative; - } - .panel-caption, .figure-caption, figcaption { - color: #666; - } -} diff --git a/_common.R b/_common.R deleted file mode 100644 index 789e562..0000000 --- a/_common.R +++ /dev/null @@ -1,23 +0,0 @@ -set.seed(1014) - -knitr::opts_chunk$set( - comment = "## ", - collapse = TRUE, - cache = TRUE, - fig.align = "center" -) - -options( - dplyr.print_min = 6, - dplyr.print_max = 6, - pillar.max_footer_lines = 2, - pillar.min_chars = 15, - stringr.view_n = 6, - # Temporarily deactivate cli output for quarto - cli.num_colors = 0, - cli.hyperlink = FALSE, - pillar.bold = TRUE, - width = 9999 # 80 - 3 for #> comment -) - -ggplot2::theme_set(ggplot2::theme_gray(12)) diff --git a/_quarto.yml b/_quarto.yml deleted file mode 100644 index d1d7a68..0000000 --- a/_quarto.yml +++ /dev/null @@ -1,68 +0,0 @@ -project: - type: book - output-dir: docs - -book: - title: "Orchestrating Hi-C analysis with Bioconductor" - reader-mode: false - page-footer: - left: | - OHCA: Orchestrating Hi-C analysis with Bioconductor was written by - J. Serizay - right: | - This book was built with Quarto. - cover-image: cover.jpg - favicon: cover.jpg - site-url: https://js2264.github.io/OHCA/ - repo-url: https://github.com/js2264/OHCA/ - repo-branch: main - repo-actions: [edit, issue] - chapters: - - index.qmd - - preamble.qmd - - part: "Fundamentals concepts" - chapters: - - principles.qmd - - data-representation.qmd - - parsing.qmd - - visualization.qmd - - part: "In-depth Hi-C analysis" - chapters: - - matrix-centric.qmd - - interactions-centric.qmd - - topological-features.qmd - - part: "Advanced Hi-C topics" - chapters: - - disseminating.qmd - - interoperability.qmd - - workflow-yeast.qmd - - workflow-chicken.qmd - - workflow-centros.qmd - -format: - html: - default-image-extension: pdf - theme: - - yeti - - OHCA.scss - code-link: true - author-meta: "Jacques Serizay" - highlight-style: atom-one-dark.theme - citations-hover: true - citation-location: margin - toc: true - toc-float: - collapsed: false - toc-depth: 3 - website: - sidebar: - # style: "docked" - search: true - collapse-level: 5 - -filters: - - _extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua - -csl: apa.csl - -editor: visual diff --git a/atom-one-dark.theme b/atom-one-dark.theme deleted file mode 100644 index ea6b50b..0000000 --- a/atom-one-dark.theme +++ /dev/null @@ -1,370 +0,0 @@ -{ - "custom-styles": { - "Diff": { - "Added line": { - "selected-text-color": "#98c379", - "text-color": "#98c379" - }, - "Changed line (new)": { - "selected-text-color": "#98c379", - "text-color": "#98c379" - }, - "Changed line (old)": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Removed line": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - } - }, - "Go": { - "Predeclared Identifier": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - } - }, - "INI Files": { - "Assignment": { - "selected-text-color": "#5f5f5f", - "text-color": "#5f5f5f" - }, - "Section": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - } - }, - "JavaScript": { - "Built-in Objects": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "Function Declaration": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - }, - "Function Name": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - }, - "Module": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "Object Member": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Object Method (Built-in)": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - } - }, - "Markdown": { - "Code": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "Emphasis Text": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "Fenced Code": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "Header H1": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Header H2": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Header H3": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Header H4": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Header H5": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Header H6": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Link": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "Reference-Link Name": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - }, - "Reference-Link Target": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - }, - "Reference-Link Target: Link": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "Reference-Link: Email": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "Reference-Link: Link": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "Strong Text": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - } - }, - "Python": { - "Builtin Function": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - }, - "String Substitution": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - } - }, - "Rust": { - "Lifetime": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "Macro": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - }, - "Self": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Trait": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "Type": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - } - }, - "TypeScript": { - "Built-in Objects": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "Module": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "Object Member": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Object Method (Built-in)": { - "italic": false, - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - }, - "Reserved": { - "italic": false - }, - "Types": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - } - }, - "XML": { - "Attribute": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "Element": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - } - } - }, - "editor-colors": { - "BackgroundColor": "#282c34", - "BracketMatching": "#8e44ad", - "CodeFolding": "#363c4a", - "CurrentLine": "#0A99BBFF", - "CurrentLineNumber": "#abb2bf", - "IconBorder": "#282c34", - "IndentationLine": "#3a3f44", - "LineNumbers": "#636D83", - "MarkBookmark": "#0404bf", - "MarkBreakpointActive": "#8b0607", - "MarkBreakpointDisabled": "#820683", - "MarkBreakpointReached": "#6d6e07", - "MarkError": "#c24038", - "MarkExecution": "#4d4e50", - "MarkWarning": "#d19a66", - "ModifiedLines": "#e06c75", - "ReplaceHighlight": "#a34f56", - "SavedLines": "#98c379", - "SearchHighlight": "#3D528BFF", - "Separator": "#3f4347", - "SpellChecking": "#c24038", - "TabMarker": "#21252B", - "TemplateBackground": "#31363b", - "TemplateFocusedPlaceholder": "#123723", - "TemplatePlaceholder": "#123723", - "TemplateReadOnlyPlaceholder": "#4d1f24", - "TextSelection": "#363c4a", - "WordWrapMarker": "#3a3f44" - }, - "metadata": { - "copyright": [ - "SPDX-FileCopyrightText: 2016 GitHub Inc.", - "SPDX-FileCopyrightText: 2020 Waqar Ahmed " - ], - "license": "SPDX-License-Identifier: MIT", - "name": "Atom One Dark", - "revision": 3 - }, - "text-styles": { - "Alert": { - "background-color": "#4d1f24", - "bold": true, - "selected-text-color": "#95da4c", - "text-color": "#95da4c" - }, - "Annotation": { - "selected-text-color": "#98c379", - "text-color": "#98c379" - }, - "Attribute": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "BaseN": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "BuiltIn": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "Char": { - "selected-text-color": "#98c379", - "text-color": "#98c379" - }, - "Comment": { - "italic": true, - "selected-text-color": "#a0a0a0", - "text-color": "#a0a0a0" - }, - "CommentVar": { - "italic": true, - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "Constant": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "ControlFlow": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "DataType": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "DecVal": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "Documentation": { - "selected-text-color": "#da4453", - "text-color": "#a43340" - }, - "Error": { - "selected-text-color": "#f44747", - "text-color": "#f44747", - "underline": true - }, - "Extension": { - "bold": true, - "selected-text-color": "#167acc", - "text-color": "#167acc" - }, - "Float": { - "selected-text-color": "#d19a66", - "text-color": "#d19a66" - }, - "Function": { - "selected-text-color": "#167acc", - "text-color": "#167acc" - }, - "Import": { - "selected-text-color": "#98c379", - "text-color": "#98c379" - }, - "Information": { - "selected-text-color": "#e46700", - "text-color": "#c45b00" - }, - "Keyword": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "Normal": { - "selected-text-color": "#5f5f5f", - "text-color": "#5f5f5f" - }, - "Operator": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "Others": { - "selected-text-color": "#27ae60", - "text-color": "#27ae60" - }, - "Preprocessor": { - "selected-text-color": "#c678dd", - "text-color": "#c678dd" - }, - "RegionMarker": { - "background-color": "#153042", - "selected-text-color": "#3daee9", - "text-color": "#2980b9" - }, - "SpecialChar": { - "selected-text-color": "#56b6c2", - "text-color": "#56b6c2" - }, - "SpecialString": { - "selected-text-color": "#da4453", - "text-color": "#da4453" - }, - "String": { - "selected-text-color": "#98c379", - "text-color": "#98c379" - }, - "Variable": { - "selected-text-color": "#e06c75", - "text-color": "#e06c75" - }, - "VerbatimString": { - "selected-text-color": "#da4453", - "text-color": "#da4453" - }, - "Warning": { - "selected-text-color": "#da4453", - "text-color": "#da4453" - } - } -} diff --git a/inst/.gitignore b/inst/.gitignore new file mode 100644 index 0000000..85fe9a3 --- /dev/null +++ b/inst/.gitignore @@ -0,0 +1,6 @@ +/.quarto/ +docs/ +*html +*rmarkdown +*_files +*_cache diff --git a/inst/_quarto.yml b/inst/_quarto.yml new file mode 100644 index 0000000..0f09571 --- /dev/null +++ b/inst/_quarto.yml @@ -0,0 +1,12 @@ +project: + type: book + output-dir: docs + +metadata-files: + - assets/_book.yml + - assets/_website.yml + - assets/_format.yml + - assets/_knitr.yml + +filters: + - extensions/tools-tabset-ext/tools-tabset.lua diff --git a/inst/assets/_book.yml b/inst/assets/_book.yml new file mode 100644 index 0000000..fd67ce2 --- /dev/null +++ b/inst/assets/_book.yml @@ -0,0 +1,37 @@ +book: + title: "Orchestrating Hi-C analysis with Bioconductor" + chapters: + - index.qmd + - pages/preamble.qmd + - part: "Fundamentals concepts" + chapters: + - pages/principles.qmd + - pages/data-representation.qmd + - pages/parsing.qmd + - pages/visualization.qmd + - part: "In-depth Hi-C analysis" + chapters: + - pages/matrix-centric.qmd + - pages/interactions-centric.qmd + - pages/topological-features.qmd + - part: "Advanced Hi-C topics" + chapters: + - pages/disseminating.qmd + - pages/interoperability.qmd + - pages/workflow-yeast.qmd + - pages/workflow-chicken.qmd + - pages/workflow-centros.qmd + downloads: pdf + cover-image: assets/cover.jpg + favicon: assets/cover.jpg + sidebar: + tools: + - icon: git + menu: + - text: Source Code + url: https://github.com/js2264/OHCA/ + - text: Browse version `devel` + url: https://js2264.github.io/OHCA/devel/ + style: "docked" + background: "light" + collapse-level: 5 diff --git a/inst/assets/_format.yml b/inst/assets/_format.yml new file mode 100644 index 0000000..81ea0b5 --- /dev/null +++ b/inst/assets/_format.yml @@ -0,0 +1,18 @@ +format: + html: + grid: + sidebar-width: 500px + body-width: 800px + theme: + - cosmo + - assets/book.scss + mainfont: "Atkinson Hyperlegible, sans-serif" + highlight-style: atom-one + code-link: true + editor: visual + # citation-location: margin + bibliography: assets/bibliography.bib + from: markdown+emoji + pdf: default + +csl: assets/apa.csl diff --git a/inst/assets/_knitr.yml b/inst/assets/_knitr.yml new file mode 100644 index 0000000..d0001a2 --- /dev/null +++ b/inst/assets/_knitr.yml @@ -0,0 +1,15 @@ +knitr: + opts_chunk: + collapse: true + comment: "## " + cache: false + fig.align: "center" + python.reticulate: false + R.options: + dplyr.print_min: 6 + dplyr.print_max: 6 + pillar.max_footer_lines: 2 + pillar.min_chars: 15 + stringr.view_n: 6 + pillar.bold: TRUE + width: 77 # 80 - 3 for #> comments diff --git a/inst/assets/_website.yml b/inst/assets/_website.yml new file mode 100644 index 0000000..77d15cf --- /dev/null +++ b/inst/assets/_website.yml @@ -0,0 +1,14 @@ +website: + back-to-top-navigation: true + search: + location: sidebar + page-footer: + background: light + left: | + OHCA: Orchestrating Hi-C analysis with Bioconductor was written by + J. Serizay + right: | + This book was built with BiocBook with :heart: + repo-branch: devel + repo-actions: [edit, issue] + open-graph: true diff --git a/apa.csl b/inst/assets/apa.csl similarity index 100% rename from apa.csl rename to inst/assets/apa.csl diff --git a/bibliography.bib b/inst/assets/bibliography.bib similarity index 94% rename from bibliography.bib rename to inst/assets/bibliography.bib index 2421a3e..93ceb44 100644 --- a/bibliography.bib +++ b/inst/assets/bibliography.bib @@ -1,3 +1,39 @@ +@Manual{serizay2023, + title = {BiocBook: Write, publish and maintain versioned Quarto books with Bioconductor}, + author = {Jacques Serizay}, + year = {2023}, + note = {R package version 0.99.0}, + url = {https://github.com/js2264/BiocBook}, +} + +@Manual{lun2023, + title = {rebook: Re-using Content in Bioconductor Books}, + author = {Aaron Lun}, + year = {2023}, + note = {R package version 1.11.1}, + url = {https://bioconductor.org/packages/rebook}, + doi = {10.18129/B9.bioc.rebook}, +} + +@software{Allaire_Quarto_2022, +author = {Allaire, J.J. and Teague, Charles and Scheidegger, Carlos and Xie, Yihui and Dervieux, Christophe}, +doi = {10.5281/zenodo.5960048}, +month = jan, +title = {{Quarto}}, +url = {https://github.com/quarto-dev/quarto-cli}, +version = {1.2}, +year = {2022} +} + +@Manual{Wickham2022, + title = {devtools: Tools to Make Developing R Packages Easier}, + author = {Hadley Wickham and Jim Hester and Winston Chang and Jennifer Bryan}, + year = {2022}, + note = {R package version 2.4.5}, + url = {https://CRAN.R-project.org/package=devtools}, +} + + @article{Dekker_2002, doi = {10.1126/science.1067799}, url = {https://doi.org/10.1126%2Fscience.1067799}, @@ -445,4 +481,4 @@ @article{Mifsud_2017 editor = {Mark Isalan}, title = {{GOTHiC}, a probabilistic model to resolve complex biases and to identify real interactions in Hi-C data}, journal = {{PLOS} {ONE}} -} \ No newline at end of file +} diff --git a/inst/assets/book.scss b/inst/assets/book.scss new file mode 100644 index 0000000..fc40464 --- /dev/null +++ b/inst/assets/book.scss @@ -0,0 +1,212 @@ +/*-- scss:defaults --*/ + +$primary: #070707 !default; +$body-color: #070707 !default; + +/*-- scss:rules --*/ + +/* ------------------------------------------------------ */ +/* ------------------------------------------------------ */ +/* ------------------ CUSTOM RULES ---------------------- */ +/* ------------------------------------------------------ */ +/* ------------------------------------------------------ */ + +// Add any custom css styling here... + + + +/* ------------------------------------------------------ */ +/* ------------------------------------------------------ */ +/* ----------------- DEFAULT RULES ---------------------- */ +/* ------------------------------------------------------ */ +/* ------------------------------------------------------ */ + +code { color: #070707; } + +/* Code chunks ------------------------------------------ */ + +div.sourceCode { + background-color: #ffffff00; + border: 2px; + border-radius: 8px; + box-shadow: 0 0 0 0 rgba(0, 0, 0, 0.06), 0 2px 5px 0 rgba(0, 0, 0, 0.06), 0 10px 10px 0 rgba(0, 0, 0, 0.05), 0 22px 13px 0 rgba(0, 0, 0, 0.03), 0 39px 16px 0 rgba(0, 0, 0, 0.01), 0 61px 17px 0 rgba(0, 0, 0, 0); +} + +pre.sourceCode.r, code.sourceCode.r { + + $border: 2px; + color: #070707; + background: #FFF; + background-clip: padding-box; /* !importantΓ© */ + border: solid $border transparent; /* !importantΓ© */ + border-radius: 8px; + + &:before { + content: ''; + position: absolute; + top: 0; right: 0; bottom: 0; left: 0; + z-index: -1; + margin: -$border; /* !importantΓ© */ + border-radius: inherit; /* !importantΓ© */ + background: linear-gradient(to right, #18a603, #0484a9, #0087af); + } + +} + +/* Chapter label ---------------------------------------- */ + +.chapter-number::before { + content: "Chapter "; +} + +.chapter-number::after { + content: " –"; +} + +/* Cover image ------------------------------------------ */ + +.quarto-cover-image { + max-width: 250px; + float: right; + margin-left: 30px; + margin-top: -30px; + margin-right: 10%; +} + +/* Left navbar ------------------------------------------ */ + +div.sidebar-item-container .active, div.sidebar-item-container .show>.nav-link, div.sidebar-item-container .sidebar-link>code { + font-weight: 800; +} + +.sidebar-title { + font-weight: 800; + background: linear-gradient(to right, #18a603, #0484a9, #0087af); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.sidebar-tools-main { + font-weight: normal; + background: white; + color: black; + -webkit-background-clip: text; + -webkit-text-fill-color: black; +} + +.sidebar-navigation li a { + text-decoration: underline; +} + +.text-start { + text-align: left !important; + font-weight: 800; +} + +#quarto-sidebar { + transition: width .15s ease-in; + padding: 14px 10%; + background-color: white; +} + +.sidebar.sidebar-navigation:not(.rollup) { + border-right: 0px !important +} + +.sidebar-navigation .sidebar-item { + font-size: 1rem; + line-height: 2em; +} + +.sidebar-menu-container { + border: solid #add2dd 1px; + border-radius: 8px; + padding: 8px; + margin-top: 25px; +} + +/* right navbar ----------------------------------------- */ + +.sidebar nav[role=doc-toc] ul>li>a.active, .sidebar nav[role=doc-toc] ul>li>ul>li>a.active { + border-left: 4px solid #3792ad; + font-weight: 800; +} + +#toc-title+ ul > li > .nav-link { + font-weight: 800; +} + +/* Headings and text styling --------------------------- */ + +h1 { + font-size: 36px; + color: #070707; + font-weight: 700; + border-image: linear-gradient(to right, #18a603, #0484a9, #0087af) 1; + border-bottom-style: solid; + border-bottom-width: 4px; +} +h2 { + margin-top: 3rem; + margin-bottom: 1rem; + font-size: 32px; + border-bottom: 0px; +} +h3 { margin-top: 1.5em; font-size: 1.2rem; } +h4 { margin-top: 1.5em; font-size: 1.1rem; } +h5 { margin-top: 1.5em; font-size: 1rem; } + +h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5 { + line-height: 120%; + margin: 0 0 1rem; + width: fit-content; + padding-top: 0.5rem; + color: #070707; +} + +p { + margin: 0 0 1rem; + font-size: 1rem; + color: #070707; + line-height: 130%; + display: block; + margin-block-start: 1em; + margin-block-end: 1em; + margin-inline-start: 0px; + margin-inline-end: 0px; +} + +.quarto-section-identifier { + color: #070707; + font-weight: normal; +} + +ul li::marker { + color: #3792ad; +} + +/* Underlining links ------------------------------------ */ + +.citation a, .footnote-ref { + text-decoration: underline; +} + +/* Printing --------------------------------------------- */ + +@media print { + :root { + font-size: 11pt; + } + #quarto-sidebar, #TOC, .nav-page { + display: none; + } + .page-columns .content { + grid-column-start: page-start; + } + .fixed-top { + position: relative; + } + .panel-caption, .figure-caption, figcaption { + color: #666; + } +} diff --git a/cover.jpg b/inst/assets/cover.jpg similarity index 100% rename from cover.jpg rename to inst/assets/cover.jpg diff --git a/_extensions/pandoc-ext/section-bibliographies/_extension.yml b/inst/extensions/pandoc-ext/section-bibliographies/_extension.yml similarity index 100% rename from _extensions/pandoc-ext/section-bibliographies/_extension.yml rename to inst/extensions/pandoc-ext/section-bibliographies/_extension.yml diff --git a/_extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua b/inst/extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua similarity index 100% rename from _extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua rename to inst/extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua diff --git a/inst/extensions/tools-tabset-ext/tools-tabset.lua b/inst/extensions/tools-tabset-ext/tools-tabset.lua new file mode 100644 index 0000000..6b11e00 --- /dev/null +++ b/inst/extensions/tools-tabset-ext/tools-tabset.lua @@ -0,0 +1,39 @@ + + +local kTabsetIcons = { + ["VS Code"] = "vscode-logo.jpg", + ["R"] = "rstudio-logo.jpg", + ["Terminal"] = "text-editor-logo.jpg" +} + +local injected = false +local function injectChooseYourTool() + if not injected then + injected = true + quarto.doc.include_text('after-body', [[ + + ]]) + end +end + +function Tabset(el) + if el.attr.attributes["group"] == "tools-tabset" then + injectChooseYourTool() + for i, tab in ipairs(el.tabs) do + local text = pandoc.utils.stringify(tab.title) + local icon = kTabsetIcons[text] + if icon then + tab.title.content:insert(1, pandoc.Image("", "/pages/images/" .. icon)) + end + end + end + return el +end \ No newline at end of file diff --git a/index.qmd b/inst/index.qmd similarity index 82% rename from index.qmd rename to inst/index.qmd index 02f5fe4..59e7d2b 100644 --- a/index.qmd +++ b/inst/index.qmd @@ -1,16 +1,28 @@ ---- -filters: - - _extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua -reference-section-title: References -bibliography: bibliography.bib ---- - -```{r} +```{r "intro"} #| echo: false -source("_common.R") -.gh_url <- file.path('https://github.com', rmarkdown::metadata[['github-repo']]) +intro <- tryCatch( + { + description <- packageDescription("OHCA") + pkg <- description$Package + version <- description$Version + authors <- eval(parse(text = description$Authors)) + license <- description$License + glue::glue( + "**Package:** {pkg}
\n", + "**Authors:** {paste(format(authors, include = c('given', 'family', 'role')), collapse = ', ')}
\n", + "**Compiled:** {as.character(Sys.Date())}
\n", + "**Package version:** {version}
\n", + "**R version:** {R.version.string}
\n", + "**BioC version:** {BiocManager::version()}
\n", + "**License:** {license}
" + ) + }, + error = function(e) {"Local preview"} +) ``` +`r intro` + # Welcome {-} This is the landing page of the **"Orchestrating Hi-C analysis with Bioconductor"** @@ -19,11 +31,9 @@ book starts with key concepts important for the analysis of chromatin conformati presents `Bioconductor` tools that can be leveraged to process, analyze, explore and visualize Hi-C data. -`r rebook::openingDetails(Copyright='J. Serizay', Source=.gh_url)` - ::: {.content-hidden when-format="pdf"} -# Table of contents {-} +## Table of contents {-} This book is divided in three parts: @@ -54,7 +64,7 @@ This book is divided in three parts: # Installation & requirements {-} -## General audience +## General audience {-} This books aims to demonstrate how to pre-process, parse and investigate Hi-C data in `R`. For this reason, a significant portion of this book consists of executable R code chunks. @@ -66,7 +76,8 @@ If you do not have `R >= 4.3` installed, you will need to update your `R` versio will require `R >= 4.3`. ::: {.callout-note collapse="true"} -## Installing R 4.3 πŸ‘‡ + +### Installing R 4.3 πŸ‘‡ Detailed instructions are available [here](https://github.com/js2264/setup_ubuntu) to install `R 4.3` on a Linux machine (Ubuntu 22.04). @@ -116,14 +127,15 @@ sudo apt install -y \ libhdf5-dev libudunits2-dev libgdal-dev libgeos-dev \ libproj-dev libnode-dev libmagick++-dev ``` + ::: -- `Bioconductor >= 3.17` is also required. You can check whether `Bioconductor` is available and its version in `R` by typing `BiocManager::version()`. If you do not have `BiocManager` >= 3.17 installed, you will need to update it as follows: +- `Bioconductor >= 3.18` is also required. You can check whether `Bioconductor` is available and its version in `R` by typing `BiocManager::version()`. If you do not have `BiocManager` >= 3.18 installed, you will need to update it as follows: ```{r eval = FALSE} if (!require("BiocManager", quietly = TRUE)) install.packages("BiocManager") -BiocManager::install(version = "3.17") +BiocManager::install(version = "3.18") ``` - You will also need important packages, which will be described in length in this book. @@ -138,7 +150,7 @@ BiocManager::install("fourDNData", ask = FALSE) BiocManager::install("DNAZooData", ask = FALSE) ``` -## Developers +## Developers {-} For developers or advanced R users, the `devel` versions of these packages can be installed along with their dependencies: @@ -153,7 +165,7 @@ pak::pkg_install("js2264/fourDNData", ask = FALSE, dependencies = c("Depends", " pak::pkg_install("js2264/DNAZooData", ask = FALSE, dependencies = c("Depends", "Imports", "Suggests")) ``` -## Docker image +## Docker image {-} If you have `docker` installed, the easiest approach would be to run the following command in a `shell` terminal: @@ -182,28 +194,27 @@ quarto render ``` ::: {.callout-warning} + All dependencies listed above will be required! + ::: The actual rendering of this book is done by GitHub Actions, and the rendered static website is hosted by GitHub Pages. -## Session info {-} -```{r} -#| echo: false -#| results: "hide" -#| message: false -#| warning: false -library("HiCExperiment") -library("HiCool") -library("HiContacts") -library("HiContactsData") -library("fourDNData") -library("DNAZooData") -library("OHCA") -``` +# Session info {-} + +::: {.callout-note collapse="true"} -```{r} -sessioninfo::session_info() +## Click to expand πŸ‘‡ {-} + +```{r "session info"} +#| cache: false +sessioninfo::session_info( + installed.packages()[,"Package"], + include_base = TRUE +) ``` + +::: diff --git a/data-representation.qmd b/inst/pages/data-representation.qmd similarity index 99% rename from data-representation.qmd rename to inst/pages/data-representation.qmd index 9759b59..8828975 100644 --- a/data-representation.qmd +++ b/inst/pages/data-representation.qmd @@ -1,10 +1,3 @@ ---- -filters: - - _extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua -reference-section-title: References -bibliography: bibliography.bib ---- - # Hi-C data structures in R ```{r} @@ -12,7 +5,6 @@ bibliography: bibliography.bib #| results: "hide" #| message: false #| warning: false -source("_common.R") library(ggplot2) library(GenomicRanges) library(InteractionSet) @@ -33,6 +25,7 @@ metadata(yeast_hic) <- list( ``` ::: {.callout-note} + ## Aims This chapter introduces the four main classes offered by `Bioconductor` leveraged to perform Hi-C analysis, describes their structure and how to interact with them: @@ -40,13 +33,16 @@ leveraged to perform Hi-C analysis, describes their structure and how to interac - `GRanges` (jump to [the section](#granges-class)) - `GInteractions` (jump to [the section](#ginteractions-class)) - `ContactFile` (jump to [the section](#contactfile-class)) -- `HiCExperiment` (jump to [the section](#hicexperiment-class)) +- `HiCExperiment` (jump to [the section](#hicexperiment-class)) + ::: ::: {.callout-tip} + ## TL;DR Directly jump to the [last section of this chapter](#visual-summary-of-the-hicexperiment-data-structure) to get a visual representation of these data structures. + ::: ## `GRanges` class @@ -152,11 +148,13 @@ These methods are referred to as "intra-range" methods as they work *"one-region-at-a-time"*. ::: {.callout-note} -## Note + +##### Note - Each range of the input `GRanges` object is modified independently from the other ranges in the following code chunks. - Intra-range operations are **endomorphisms**: they all take `GRanges` inputs and always return `GRanges` objects. + ::: - Shifting each genomic range in a `GRanges` object by a certain number of bases: @@ -226,10 +224,12 @@ gr * 1000 # ----- Zoom in by a given factor (effectively decreasing the `GRanges ``` ::: {.callout-warning} -## Going further + +##### Going further To fully grasp how to operate `GRanges` objects, we highly recommend reading the detailed documentation for this class by typing `?GenomicRanges` and `` ?GenomicRanges::`intra-range-methods` ``. + ::: #### Inter-range methods {#inter-range} @@ -238,9 +238,11 @@ Compared to "intra-range" methods described above, **inter-range** methods involve comparisons *between* ranges **in a single** GRanges object. ::: {.callout-note} -## Note + +##### Note Compared to previous section, the result of each function described below depends on the **entire set of ranges** in the input `GRanges` object. + ::: - Computing the "inverse" genomic ranges, i.e. ranges in-between the input ranges: @@ -266,9 +268,11 @@ coverage(gr, weight = 'GC') ``` ::: {.callout-warning} -## Going further + +##### Going further To fully grasp how to operate `GRanges` objects, we highly recommend reading the detailed documentation for this class by typing `` ?GenomicRanges::`inter-range-methods` ``. + ::: ### Comparing multiple `GRanges` objects @@ -338,9 +342,11 @@ The `Hits` output clearly describes what overlaps with what: - The query (peak) `#5` overlaps with subject (TSS) `#2` ::: {.callout-note} -## Note + +##### Note Because no other query index or subject index is listed in the `ov` output, none of the remaining ranges from `query` overlap with ranges from `subject`. + ::: - Subsetting by overlaps between a query and a subject @@ -364,7 +370,8 @@ countOverlaps(query = peaks, subject = TSSs) ``` ::: {.callout-note} -## Note + +##### Note Note that which `GRanges` goes in `query` or `subject` is crucial! Counting **for each peak, the number of TSSs it overlaps with** is very different from **for each TSS, how many peaks it overlaps with**. @@ -382,6 +389,7 @@ We can add these counts to the original `query` object: TSSs$n_peaks <- countOverlaps(query = TSSs, subject = peaks) TSSs ``` + ::: - `%over%`, `%within%`, `%outside%` : handy operators @@ -412,9 +420,11 @@ peaks %outside% TSSs ``` ::: {.callout-warning} -## Going further + +##### Going further To fully grasp how to find overlaps between `GRanges` objects, we highly recommend reading the detailed documentation by typing `` ?IRanges::`findOverlaps-methods` ``. + ::: #### Find nearest range from a subject for each range in a query @@ -620,12 +630,14 @@ swapAnchors(gi) ``` ::: {.callout-warning} -## Note + +##### Note "Sorting" and "swapping" a `GInteractions` object are two **entirely different actions**: - "sorting" reorganizes all *rows* (interactions); - "swapping" *anchors* reorganizes *"first" and "second" anchors* for each interaction independently. + ::: #### `GInteractions` distance method @@ -1175,3 +1187,5 @@ queries to seamlessly import parts or all the data contained in disk-stored Hi-C contact matrices in a variety of formats. ![](images/20230309114202.png) + +# References {-} diff --git a/disseminating.qmd b/inst/pages/disseminating.qmd similarity index 99% rename from disseminating.qmd rename to inst/pages/disseminating.qmd index 9448de9..6d38453 100644 --- a/disseminating.qmd +++ b/inst/pages/disseminating.qmd @@ -1,10 +1,3 @@ ---- -filters: - - _extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua -reference-section-title: References -bibliography: bibliography.bib ---- - # Data gateways: accessing public Hi-C data portals ```{r} @@ -12,7 +5,6 @@ bibliography: bibliography.bib #| results: "hide" #| message: false #| warning: false -source("_common.R") library(ggplot2) library(GenomicRanges) library(InteractionSet) @@ -22,6 +14,7 @@ library(DNAZooData) ``` ::: {.callout-note} + ## Aims This chapter focuses on introducing two important portals hosting public Hi-C datasets: the [4DN Consortium](https://www.4dnucleome.org/) @@ -30,6 +23,7 @@ a programmatic access to these portals: - `fourDNData` - `DNAZooData` + ::: The Hi-C experimental approach has gained significant traction across multiple @@ -143,9 +137,11 @@ fourDNData(experimentSetAccession = '4DNES25ABNZ1', type = 'pairs') |> ``` ::: {.callout-warning} -## Watch out + +#### Watch out `.pairs` files can be particularly large and therefore will take both and long time to download and a large storage footprint. + ::: - `type = 'insulation'` will fetch a `.bigwig` track file precomputed by the 4DN consortium. This track corresponds to the genome-wide insulation score computed by `cooltools` as described in @Crane_2015. To know more about this, read [the excerpt from 4DN data portal](https://data.4dnucleome.org/resources/data-analysis/insulation_compartment_scores#insulation_scores_and_boundaries_page_all). Once fetched from the 4DN data portal, the local file can be imported in `R` using the `import` function, which will generate a `RleList` object. @@ -367,3 +363,5 @@ corrected by the DNA Zoo consortium. metadata(hicfile)$assemblyURL ## [1] "https://dnazoo.s3.wasabisys.com/Hypsibius_dujardini/nHd_3.1_HiC.fasta.gz" ``` + +# References {-} diff --git a/images/20230215221337.png b/inst/pages/images/20230215221337.png similarity index 100% rename from images/20230215221337.png rename to inst/pages/images/20230215221337.png diff --git a/images/20230221172531.png b/inst/pages/images/20230221172531.png similarity index 100% rename from images/20230221172531.png rename to inst/pages/images/20230221172531.png diff --git a/images/20230303125432.png b/inst/pages/images/20230303125432.png similarity index 100% rename from images/20230303125432.png rename to inst/pages/images/20230303125432.png diff --git a/images/20230306102639.png b/inst/pages/images/20230306102639.png similarity index 100% rename from images/20230306102639.png rename to inst/pages/images/20230306102639.png diff --git a/images/20230309114047.png b/inst/pages/images/20230309114047.png similarity index 100% rename from images/20230309114047.png rename to inst/pages/images/20230309114047.png diff --git a/images/20230309114202.png b/inst/pages/images/20230309114202.png similarity index 100% rename from images/20230309114202.png rename to inst/pages/images/20230309114202.png diff --git a/images/20230321230247.png b/inst/pages/images/20230321230247.png similarity index 100% rename from images/20230321230247.png rename to inst/pages/images/20230321230247.png diff --git a/images/20230321233026.png b/inst/pages/images/20230321233026.png similarity index 100% rename from images/20230321233026.png rename to inst/pages/images/20230321233026.png diff --git a/images/20230322002953.png b/inst/pages/images/20230322002953.png similarity index 100% rename from images/20230322002953.png rename to inst/pages/images/20230322002953.png diff --git a/images/20230322003342.png b/inst/pages/images/20230322003342.png similarity index 100% rename from images/20230322003342.png rename to inst/pages/images/20230322003342.png diff --git a/images/20230322085136.png b/inst/pages/images/20230322085136.png similarity index 100% rename from images/20230322085136.png rename to inst/pages/images/20230322085136.png diff --git a/images/20230322102803.png b/inst/pages/images/20230322102803.png similarity index 100% rename from images/20230322102803.png rename to inst/pages/images/20230322102803.png diff --git a/images/20230322102919.png b/inst/pages/images/20230322102919.png similarity index 100% rename from images/20230322102919.png rename to inst/pages/images/20230322102919.png diff --git a/images/20230322181000.png b/inst/pages/images/20230322181000.png similarity index 100% rename from images/20230322181000.png rename to inst/pages/images/20230322181000.png diff --git a/images/20230322181300.png b/inst/pages/images/20230322181300.png similarity index 100% rename from images/20230322181300.png rename to inst/pages/images/20230322181300.png diff --git a/images/20230324125800.png b/inst/pages/images/20230324125800.png similarity index 100% rename from images/20230324125800.png rename to inst/pages/images/20230324125800.png diff --git a/images/20230327182802.png b/inst/pages/images/20230327182802.png similarity index 100% rename from images/20230327182802.png rename to inst/pages/images/20230327182802.png diff --git a/images/20230403090000.png b/inst/pages/images/20230403090000.png similarity index 100% rename from images/20230403090000.png rename to inst/pages/images/20230403090000.png diff --git a/images/20230403134800.png b/inst/pages/images/20230403134800.png similarity index 100% rename from images/20230403134800.png rename to inst/pages/images/20230403134800.png diff --git a/images/20230421134800.jpg b/inst/pages/images/20230421134800.jpg similarity index 100% rename from images/20230421134800.jpg rename to inst/pages/images/20230421134800.jpg diff --git a/images/20230523141745.jpg b/inst/pages/images/20230523141745.jpg similarity index 100% rename from images/20230523141745.jpg rename to inst/pages/images/20230523141745.jpg diff --git a/images/20230523144800.png b/inst/pages/images/20230523144800.png similarity index 100% rename from images/20230523144800.png rename to inst/pages/images/20230523144800.png diff --git a/images/20230523152700.png b/inst/pages/images/20230523152700.png similarity index 100% rename from images/20230523152700.png rename to inst/pages/images/20230523152700.png diff --git a/images/20230523153300.png b/inst/pages/images/20230523153300.png similarity index 100% rename from images/20230523153300.png rename to inst/pages/images/20230523153300.png diff --git a/images/20230523180000.png b/inst/pages/images/20230523180000.png similarity index 100% rename from images/20230523180000.png rename to inst/pages/images/20230523180000.png diff --git a/images/20230523180300.png b/inst/pages/images/20230523180300.png similarity index 100% rename from images/20230523180300.png rename to inst/pages/images/20230523180300.png diff --git a/images/20230525134200.png b/inst/pages/images/20230525134200.png similarity index 100% rename from images/20230525134200.png rename to inst/pages/images/20230525134200.png diff --git a/inst/pages/images/rstudio-logo.jpg b/inst/pages/images/rstudio-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0177f5c023fd6642b9d3d3766ba44b85be1bb242 GIT binary patch literal 33306 zcmce;2V9fa`ZykUtAZj+nJrvFw#bs*Rz|BpN<)Z@fPyl@k`*8)P+H_kZ|&c+WZS$#b6PIqNykc=reP-vCZu zHT%L0aNxi}z-8VaV1Ed31#tB6k)uZrA3b{H=&@r*KRAB+`0)=vJTAn4>f~urp|fX2 zg+xTeB+pBWiOWieh;R4jd9Vu-^=j;GqgQbbyxtKc{0nY!4kg@B#0w<>>=} z1HAl^4^Mt@^x(mRhj_(-mSq6_Cs5%cXB}MP1Kpj&XS4#QxRS&pq*;JYWY89Ob=J7dQYoc;MjS!$%Gs z=5_Nnz3ocijNr%Wmoz@LJ|ZOZRkHBSuVp{;e|p8GbZMUsILT{wP~eaNz!)*oZ`%iGeAy^v6+XfkEUHJawl+iXkbuTYC`e--=p5s)UG#vywe?wl zv_sE=pJ?z&dpAAThUV_4_}W%`$?EK~DPj`V2fXQ>{9)ecDmTMaZ+pu`p+9sVV1bER zN2WP$c%o(LFNlmYIyvj;PLdC#iW>mp{KMl%Qm#VZZ4|^ayoNub`_-5WMS5itywN1W zmYn0Z_O_}t@@Y?VG6Hfxr@A0n{(29~ce}o6xYVzhF{G`K^s3T)Vi_0Dt-*wKmyj*h zH#G0ztuF5k?C4J4+Quvo(wfEUnw#hB9Cy>?q@s3VjTI}6DCeo?k^%Dz(@9MBwRQXi z6uW3jUu59WHFKHhh~<@IR!##%yR&I>Q!3k4O6e11+xbj4*YeQY;p^BvDtRw5I?Kr* zvw1zH)HA7vPHnbt(K2bxOR0nR*D{lo`xQpKw{})RMgtxsjrbI1=|=E5KdG`Ak8#6* z?DYA()QrN^CqaGYqrq&L=?dA~|yK1$tEdkASN{{V| zcZ*^OgXYr*r3Jd~39T{y;Z38c(%a+yMBfJy( z+^ZOYz*4>jN!G38l6CBoY-k;**ww`J+`1xiA8^YwiWrwVB8udS2U^^69d|)vSA33s&Zed3R|7j<~wv`khqYa6)G-ZVr3`1ye$?b(#c`mx*VOx=2Hk8|hsQCUq*AicBtCN$qq(og^f~{vx9MKWfnBP6^-;kV0hSd_a zf_z|!xdtl)To87$eQ_9DTS^7D@Gyh3?u2!IaYIoe)|aZasqkr-eYHNDakDB zp@2esq(hWyv_@R;!^V|BHb^pcx}LNTfM$LT%ZvzOfxX<@qLz2DSR59Hcf(?G+}y*` z-pHB!5j(a^5v+vdfR=Vvzof9WO*1J+yhv50&tF&l++%32vDvC=_~taKkHW8Vb)-eS zrkLe?a)Es({3%4-49=%91kJ442h1C1{qTI8Ph2fUFy%70du9ZaLO|v9B_HpnxDb33 zg!*okMBx}&eI-K)sjAii!>eFZYjva0$R7pF@{tZ8lG2L@YF z1V+D$o(5D$)ND2!;V1iC)1{6^JVYLtw$9j$@hb6Hh z_3dH}7GH?1L1WP&85zvm8}-OflNwa9c3K2NOkQ9iN4vP7vt_u3HH2DS*tr_vIJ`2Q z;rVqyMX@WawLP_h9#XLgn0@nKY2MAn7GM=~3(*DHV=nOYD8Nim*G1YA9PQU?*;pQ> z>(qd9D5hRsKe*RBZBI;arX!K&I8<+X{GeuaSx90E74#@OKcuO%m0UTZu12pn_o>N+ zbLw9^hOd|6TROuDDvn9<1z1m%gFMq+-NB>G&dXb;#u&9FjbYebjYSG2%Ny-mA89aWY-Zzh1GE+l!}(RBP5DR3H8m|_DKoc>n$F=kE|5xls4KRJLL8IduC zk_ZB3o2!0PHUGt6h*S-wXBYD63y?Hgn(q=o0w8T zjS7Q|*m>m#{5afAPuuXR;4L5aisvl0L@1~_G9-x&owV<{z}5^3nNJq9*~rT^*xq~s z-tJdpU|HLbhlvn_ex8tH6z0_Qw6bPmCO^%=eiZ|`S(%;1t(!a?!(eQ=t`fg` z2xWxTy4szj=SptO7`k5XyNmT5Aewdro2}AJ*n-n;x0)hAl~41KDwoW-X#*cT`m03! z+lL71YV%8$HfyPOpozz!s7E9c5$uy5-3B@@F8?MUo~HH)S5Lx0|E64=~o3 z|MFGVCIMFuN6h6Q51ZSBew?ILdINo7>tgCGEK5T3&aNf8dffoSTYQ+cs@mYt8z83{Ehp(=XLB@dMWoaTt;` z@`?+&(yhFr!poz=4{%EA?q5Ti*P1^(?lR_-S$wf|m6`jtO}CbDy`hsT$_x8de~wsF z7PBIerNVTBK2%1qCmCoO76HRXuZJzkN0_&+FQai{KqaYe6DA4;Nm$s9u=2W2E7yuh z+RlQ*hN3J5$d&?w0{ein=Uz7`w%LAtc43vNjaP%dapR?sjMVHSTG;a`4mU=|s* zs5R&3I*ez~-4U={czVc=E=hAZQ=OY0uQc;8-Ze8Cp;zZm9s?fMy+c*@@wk?tRcgg` zR_V9w2>)c6dcb+A~B zM=a+@EwcM5vsN}Scn8*SyC!U|q(wR&(rj=gqnNn~t7RHktzJh*DTi*mH!aw`Kv((J zKXo=jSJ#B3ecC+i6R;0Z5;w~%wx5nK>GT0R*A7Zap#)MgXJH$`6uhQ)Le(L47xl5hK8qyA@$>dCppDMIcC}=nuGNe(X9(5q&0Wi z7`)&FW;98qjW@$D@or2|iR?YC>V3e&J*ifBo@pZux%B!)(a>z$Cb-oIm6cfF3QCTF zXH{Y6lL{Bo=TL_}&QMp^zh)*UUj#5f{4q|ydLyWAVbR%a64?2Q-!;CvtTjd0b!^#h zI=FQoATq)ZjgV^1O1Rt=LX63SkXO9gkdD@yTl$VCJ3HA1D=L!O3DG$DQB(nqwK~32 zzfyilqs;47M=f}$GKdB#e<5}3u9l4U?8(9GtyhQs1~~&D&L;}#pe)y}NsA2D=n~00G%~h>Dz-c9u?RR%sTji^T<0h^8Oi z_99Fr9=_@nbN*!n)a$Ewb&aVkyLurS#d1XS)`p>EQe{GlWa-cYazvQYqsv&p=)kX- z_6Nn5-W5(or`~d)s;NlfD$OuiGGI-{4IY!CE>Krr7NFuX-XAS9sm-z$r-4BgpFvyd zAR%CEk+%Z2>tqlY971}tgorq6VA*V^H@Oi{sEjjV`*s5H;qC)HTC4QWNnGbzHEV3v zuI2)u?%5yU@RzIgnPl^FzJ5S*o?PL~5@d5L-0^gRs^Vk`-y@d}Z%{pCCVM<| z`fHU@eq~}l%}g$W7I-u)7oS-iTI>2^W+5{&tHP<$bV!Q|tr_Rd@{qU(a^50M`qy0f zVUvlYYX^m%|97+w*)@yxX~*5yDU*L3fcJvuhRvg1>bvhfWqE05=hb%DD~Wed?P;YI z5elz5a4$>+R&Y75KIiUwDcN_j2Q?~%*di>G9eddoR$5YN;l$iv<-}xvJ&32qpqRkT zzy6j^^>h{TGaT4Tw3y7!`|%+C$N!Ggd$*Vgg~a*I5ONt^;9)V$_|QD22^jODe?G7& zp@)zpu9rWR(gGeoCD-MqRrk>0`{D8c9dyBbxaa{a3wyrRc1-({w zbbWw|(t9)Py&Ce7_`C+iq?}a~=Slb|+rAyDWa*&F|Mop48{Aw-6ZG7%>>axG8DIAyNIUl!> z)8+!xTzL@f)`j{fTZ{gjt?F9PE7I3q5+A2I%P}OasWw~_bFYE847!v>v)S@;f3SC? z^wFY+8BD|lf?zikn!K4uZ^b0z+#!$CY`NW9nj}+Au1Tm=&0cA8u{$j}*&x$3lTkgB zo727R5@2ID-9}mQeFWEIM}`yi~dR@@dlBx6I)Ww(9UZq%TdO;dCH-zCe0w>5D(*3Jkqmw_jQT!TcT;06uZgv) z1oyQ@&_q=rmhkx`uog(andEiK`kOmLer8=KIjOZ<4R;|{e~g^55;jvI6PJ!oPn>dt z$KDN_oEU6wB_^i?s0LYHIgDQL2`UNT3#0>FIkOkG+~RA3_e^3`2VAsl0Q8>g-Sp|q0UPgYY2Uw z0l?d~#rK@gSjRc97Qi201wNb(;+M^O+@F7=e>teDe?D%Lx+eQ#XofZ7PckqSbJH9h zgY0Ru47lc7HftNxIO;&EW`(`aKA_NV6jjvgv#Ylc_=wNUD&j*dVp26;B@ z@jf82Qi5i&56H3z-WV^T(o^gG160Q*92$|16ga~X3ri~e6m`-KPi1JIq{a`uT-MxC zD<0}wovD?`47jjCC~n>vWFZf8qp5dZR=TA$`LeKd6^SqZNHan6mn-)&rD7WcVR#zH z$6*^BW!*P$`30^8>$P@S5Xt?L&$ku zT-e=SVzt~qIl=5~<4rrq;rakP?^lj>UlRlfpSxNt0#^T&{QrlSM@gU3{5-Z2>u?er z2^ytQD~S8D12bjU{j&0LB1Dna9ul{(1blEh4fveC52&|mm}25^;R$m5^vaW!T*PmmL&B)rIQ93^5@Y#faK@D z*TvsdrvU8^-UkF}{g?`}az zF{1<+snBItVe>1&O|lM{H#vH1sd%KZ#2tq^?YkFL@BRio^-6;wJviS&T}FB(EPL8F zV>Z*Z!w%q#*sz zB1UnoO>seFFxb%g1AHUak;c6?7@`vo%PyuG=a~eV?{PbeXO;rh>elWe7^oz}+U5q}hp}E* z{9szv%*C;XHt|g-w7=*GtGIjK>{s0X_hM&b{`5elK`oPCSD4(^0Xhz_=&v8#nJ7VYd}UbTa_jm&Kwpa6IFjp1=X@d9cq>pGVE7h) z1iiH}d(wA*;(^7p1+V0Bn*Y%W~ zl5ExQ_DKCUxGMC7ZOQa-3qeY3%AIy{-mqJ>dvoi)(B5PrZs=lC@b$dyM`l^d`v9+R zg>Z)5Kf3NLbY|`Y0u(SqXS&K?h^aK9+*l(cwZ;!#O+(|)m?bDb8zXx?2=cP#1Z`_< z57Ag|bm~Rk?;qb!FkhsjjSmNMj&EJ5e(lirCEXKCq-VMnF2piY{H(~tJtrwk=UQ0d zj;Nj|I-Sll@V<(f)7^Nu1=)R;co;EwChs#EZp24NBddyR&5EhG(^sx8D8}2%43x)F zy=pA}hR-r=#RxXXMP@#1m>zg+ zvYm2iw{U@I0g)B()`BDA;0qKl_=VC?A{~hqJ^Ny>2xfdhu zOT*83TZ+#-l>XS9@xWn|lll1MY;} z*3@|7b>dcZ`MkdNzvP0;yd5=JyQav*%5#vrQ_d|V#Whaa)@@HKf}bsBJlu6K@9Obg z*6;?K0LggWSzL?qk&Oy_o%;%LMXZlbIsFRp-z^?D4urZkxsm^mGgP8BO(M9j+zq)6sj6y>$4yEaR9ox(ha1 zVX1yVP&_Dg!D{!$fj93uJ7nF0z|`xV-(ICv&gIq9cW38U0=qM4UfStJ2x4V!sdm}{ z#v#ah)Ac9epgn0pglv=ZEO2yci5L*JW&V2nnQM`);aOcZoeKIVlEimled*!V-%#Px&0{or7l7TAWZp;6aa5p&b6Ri(3>w87*4BLPD)9sZzGnWJ2uB$+v>T&FCNISY5nZ>xGQ$Y%0|E=h z93()w%+1XE1-l!WhNUOB#Zvk90m~Zd_^3&`JIDMo+iB^MnjK5|$5{#ee^PU763kPT zf&?VXm9N#HQSLj#3--ncmik70Y{tT}n{4ex&qa=QqTe)3#C<&kH_%LM%{(uyBUiHz zfYY2GUa4++6mIKiu0 zJF=ps<$BkeO|4lzrI&GLZFGe$g2@^*F3-b&UYBWFbgc&> z79icQ1#>OyLBmJAsx_(nM)@&;;;O?CSfd4yr=-$v*3;S*H7W`p5gT3^A_|b9#wc&? zpqd=-J43bdAoL_qI9%(ls^afX%Kxlq%Z=20s)Ck<}To}av>}9dPtd{RUgY*t2<-CZ1f1A-cx9AFLq>5^7fuhxC?2XQ3Y3z%A)jtG;FP#wPAz$M+VVCIVyn z8ilnD{h?sL8sme8ctCoyu7Hg88iV(9~LJirL;t zO6n5}g8_{2#wUU@zp&wta!2%uRhY$W)hWI<=9DJeYBvZtslRn|KvqJ&Fr0=TAHfzE z(F_;aMwGT3A}0`-;qKz)f9DpHXFM=ZK}u0)00kBQgnb!5Tay+>U3lYw8y~@?Ihqe7 zAuVg~M;Q|B^k5X)p6J=2^~<9=gNxSB)#$708}Y+Ae#bis+`CV}90Hd%+bl z$`seo+MNSXzWfh}2k3V&XNQ|J)wS%g#6*ha>@*fB?Tr||j+9fJOcK{8JsOxsl%&q1 zCx!Zb3$XEdp;-CQbXMf~I?-mXXPRdd8Sj3SIE9Vw$r%y7*Hs8ow=tors~d3C`MsOC&P;W=?WNL;PTTg9edxej38uL(Dz|crD=X1lcZM60!>nV z*8QTKTzLgS#)VS%){J{-id&;*kEgY}V3p9GSb4mB{^~(d>`mI&1ruZaR2UHxH86*| zB0Lac`I4>I@&xP3)0NTP_iR>xxJTn7S03!No2Kh}z6dKgXmjINc>kt&s9#W~&H|?^ z;_j7-i=Q2-k`MWA*){50tBzJF({rJz0V>gH@K`)bsFm&h@o>K}LrkmlDh9#vn%bok z$NSs4dh6Y{F{&%hZfi=M9%Vq{N4zfHdPeiESFy2)Q|^UZul>71szU?iT;Rm$359*Y zBy}IqA7WF)q+I6)hMOvBqfE-}$T(|SK-t{Lq^||F(E>!1@}Qr+v2{5%mVQ=HziS!5 zee)aCf3JeSgox==th?_t5RmjP`)T2FQ5JBD20CzenD-+Wub=n(gq-qKvyksf7TeF# zHbNeBlA{rKHEn(k_rUPFdN2B6QKH_Yv&clqkiRiZ&$U~sMVOCLE)S&n2js#NATqEe zYQI!s|AqAQxHzVKF|vfz6m@~?MZ5#V0c?&^}*%zUt{#!vYyd_?sZWCyIgD) zAw|%wc-wtyYfQGQ_y;&10%M7)&@}r^T5LLlErPDjq9;MwnDI$#vS=~YiIGLRqBM4P zt-_gsdD_6uyaaGpy9)q(ND4l==;W&^tikcI)={D(rZaUoCWzjkYq8~#OMNSsTzHd{ zsBS`ns*{1(k3&ASQhwspju=`RA6@sl>s|KAZ&Cccnq!b*>b$ViXC>ac=I^o}^={f) zVpd>xR{s@b{q{-Nj((GyTVwqvV!xG(R2)@ObR!JE zMz|x;y&#Pt%^kZn87wN$fw2+;%Zpwv0b4OYj77DWJ3~3m+gBGK4Bbi(zM)S40RTAl zFu@3TWSx(!ofAC%j4%gV*&`D_xcy9MXc zS8%XdQhc;8PRwEHHj)88@GYGO&g*iP#;_Q_uZcyAwXY}I6|IQNGz|P8H<@9sRzJIu z{yn>XD8-RwXhSkbmwe?r@EQ~&Em|w@5V?G38=$6e_dhZEqtgFk1p%yUQy~rfk&-sU z=n{+Qo`4@h6f!2}{Aq%)s4aYzah~z+T=_H9TvNk=2ZKDsPLthdBiL%r%*W)DeNky$ z%iP^rj~)FMx2VR->%5EF4}XOGFZG5?JTZz~nqqEf>kA5yC3rI47^IIpOV$r|R&hkL zu&NH}*!VF;v@8Dn>gy$K_u9)|XWWYC%LUy^j>+fk1MuXPX*H)4mXWAWuld`my!Dwq z+-YLb$vXX^d5~jckiR5+d}@3MJp$C`$JvN>JmD*svY1959oUfLK_yHlfWVzIH=3<+T`( zW|yE&0^Vy00QmO-L^t<+0P`gl-_dK1E!lx?U3nfBH96+(ky(|yYKg7WC+Xlnc5<07 zY)XrUHzW;TUt0r!9K`U7?d#I~(+s9dcrQgz5(H^MI#%J0Yv2$B#oM*T0gPB%k*uIf z>=E--k8>u9WXQe}feNvwp5FX58~(67x1Aa3f_nvK#awuo{ZPW) zRPNnrLHy;);2aa`-PylhaLDwNUjsjqcCWO)qv^Vkg%8*!gclz)X;9K4OI26w?)5MA z7zwXz5nnUgS($;VP%LW{a%1V4E;6!Z=NeBpex7&bQ>$|KnUhuD@x~g|lD123Lfj{> zF?%VE>o2KJ4XF1J_wL|!<)LDESGc#8)jurPwpYN%*bqJp)msLUatKSElT#i2K z*R0f2<^0;Ah*o_dl`7~orz_}$i$jvzD&5njv0-})3ZGAlO_%`%r@Btq@yhi<>ON9-Zoq9-@La1q8SXy@p9>?(F%vt_ZU)8Q{fOtS z$#ZbHfQDgR6k?ffh#v%vW(TvkA*Bfx?6Yg@s3YLOZJ9KQ&b~nRcY;pqt_{~b&rN*h z4)yKjSZjl~NnCv|#X3ko{nk2JR$dCm#6gG-aFC4|v-*27Jw)|Yrj}z}l&@unL8GC@ zK49xH^mb_J)z(MDx;L*LctDqfCr%zCH|pA@Eh}#J`+@@^R%&P^PEUAd&IKzP$b}fU zwCwI@FV(vdjIi%yMAq~H#4MJ6&AdM<{~}%gt%CMJZ;BWiDh_eO<9swrwg#fL1UR@^p}=yyRTNrdKeOlc@GDU*Yi5aqV;Yz#9 z>fLq3=i)^-{)qDbs25*6+Q__|ciat*CSv23*cQ!*H4i(z+Z!#t{sHp2G`cD<)5Y;t ziLhM5BG2WJqEv9|N#vpI@$FKt`(=5N=n0BRv=FfDyzE!o1&sKhhYrx-k;$;!jGa+U z?-^HbhwTno2mOhG1Htci{o&#Ex64_VRvG$gU%g7WYzwP(c47#O=fs9-2#B`{Xy{)N z7+gv_HcZaE#Jvh5Bv362r?At=GQ;A10N;|YcDCj%ce1Xob+^El5b$1A#HIOjnTfvp z04w7T^P@;Vo@?ofZ@dr1Qe-yX1FaqJq8*z=daYsq5swNZH3q?j9O4HSa>&i#c?Rdo z9C$Wv=%Se@LnPP^LI}D2-f-H~+5)m_7>MgHnj>724=o2aS6XmEo88yGV)Tqof=a?% z<^lu#s1*QZ++7~b_eiRl;LSFwx>~p8kS4?k;bK<%O^M~6=yNPSJ=bGT3@tlg6!?!j z%$tp0j1^r=U&IB-?PYu6Grh18E5J!rzWxxalE)>3m?)V4Y+{`O7PB0nQm^b2UleJ< zPJMpjgZIGTpH1G$0)K~Cz?UQvS2)F5^cLqfuYxs~Jy*Lmo>DiC=`GUSM#_=ELCiR9 z6G3q{(hJQ$f04O&*1w3XZ$a+G2V5-0JLSZsBNL=_XYT7;z9Gx=yWmpi+KG}On9x;o z9ZZNRj3H7GuVQT}WUdLa@Hvf1852(W{(c?e97>|vQv9xqu8x-1b~iAr+<=K_RJ&Hy z)J%F=D&nt9aqEpr6d>?|9v3y1-5Q*QN?e;PqR##+>gDiw&8gGdxslHr57QTElS zY?~+~&u>MpKPfclqEG+VUprbs{VUsNQOkMdB%^0!Odd75&2Kat*Bec8o;ZN+dS6~2 z0TGL5iA^cIBOo7vm8A%7Jd~PDBVM;#i)v~2+Pjdx4`{vt%k!@CnZ-na10ACs`&;ai z4TV~SNJ}Prs$qn&`TF&^V6j?NvZ4NJU=-gKzmq;mrQ27emD%CI#lPTK^FHEuC`<(Q z>UmqapD(lnY;CnG-f1Bh4d6ysChWBBJXSYSFZD^7 z@X)-vpt^78hRlTGm>;TR`{PaJ=$bE<)Esv0kyF&o2Cp}afSiYVFb*`2^EfDcWz+EK z^sDjp@9({V*KQ%XycHcd77BET8ye=R;w6nUo23hGt=*gO-)=WF|6u-c&<*f3(Iou# zI`HUxxxSSUXf&%g3bqvWG=+XDnZ#Bwln^KeQ(bwo2H1e@!@Ng%eo&!Ao?rYr_bjOn{3&ACVsoV?yJ=5S*O?UJiJe}qZQsB z+cL6Y8FR}YWH>KmR!r?G;;P!KrqXCqVNfdcaTPC5V}d~9m+=5l>oN)$=W7lI&a zvI%C}p%bC}Zk0LZr(CF#`K*j&C#TyxS;-a<#3V#99wFlvl3lNMI$VHYo}z#ECr6C; z>hC=^liz`3P*$cqHi%ucq^sCt(Aa4Yf3bB*3Q(~NX|9M*;u*Ab>w5R1zODXoM45Hn zJVi^rbuA5wn;Sq_8Ap=qh5S}Lk`P$VXRgh4;Itx3+hVrssofg)oDybEqv#d$w8znx zb|Gc>emD!N1<~(l!QK195$ax4wgM|oc@}i{ef536gZO`|dLPN*h{5v2 z7zyK{>zj1E&w36OVLydoCu#zG=Ig& zE-^7D;|Sd>PW9tyC8<7Jtq#$dc$OnikDDTj3bImHzmfB;6G%rL^w>OtMy_5BVrpEJnmSC2KX0{)J zYFR^Vc(xC)Mn!Wg^~_EPloBMh9ysD?A9X%ZAS!(>2V1urB`tp6@2&H-$O9?Iz@*_z zfX8S5hb(@dGy6T2&^+CnYD@woU46l z#)?BgPut$nseVkTSqyC`m|pu6Ac}^iO}B+bu#v;V8-J0z$Izx(>4T!)PM8!p4P+X` zZlDTQG?6REY9r_4w8X-QY%oM82E~Cr=?TT1S)(+0-aQ6^pRyLw-J+9CI*no6=b zh>+qJmNzw=#{%{9-QWeMnDwkxWp*vqyE+q6kiNU|W3>>4_(H7Sm{VMTU~xztW4%PN zF@>lxge4o6e&1L@Ku)C3euTWZo{Pxjz6eMFcu16G0!17B{Vuq zJUyR#T;Rd{3+d1g<8-+kMKV(tJ7E!hL^ZN6#DXB?FDz_s8M;a{;&~+ocm%C9DDDHk zC60Ti@rR8{$O{aOUW0ptlPm4>D=US1?zV*=a9j&x>3B z^4c2ydOZ}^OBTI= z-rwQDCxWtnVMva>$z4~ftkQlO!h)C@#b)dSUVTX}o@9D9HH_3Osz_f-_EjOctlLxy zJjO8QvGKF37Qj6#;V%~R-4uJ4*jx(2V^7g7nq&EBW;)^`5+Z*4yCeBG-WP%Q5sKd5 zZhDBg7>r-fYT!;nmP6#j1vMxTs8O_EqUk3ESgc}vK?WM@9-2NIcm47e2aFw62A3i= zS6Qj!T7|%_?0FZ%`7jyIlbAemUBL8)-zPs=sf?A-nKL}9c`HpjJ)J2hu&7E=qy*~~ z=F0i|@;0nG$)Jt#2DwI9jnw1 zbvUY+$P)k>EkWvY>C(nIAswE(L)Eh0!N|c;#_>+*Xhb|(mp8!vJJ!+fuv&G35%ZwZH2l-s(DQ*|_hiI^5B$Y-zX2NT#yTGC_6=Itit-FXC(R5Q8p zp5|?g;3?km=zIFTzu|Ip{+{}{eB9E7^eHrvxTCIRj{i6xZrG_lHC3J*<%;mJOCKq7 zbM>>iDzP?7^4xv&rbOiG%gjU5L%FvZ#$rD6m)FO#3v1nEqv(YhBQ(uIyjo3?CM19C zR_hK9;)c|+-lU$e*S|A~WH>;al)uWnJM8-JqxGlxzw_|>sUykm-xn$rkGzLWe%tHE zpH_*Ap_I>fnsF22kZuGI>g*SxBcH8ftl3oxL;O2r8y|`Zm%15haFu$(j#@NV6Fhv4 z!|_5U*bcAKXctS-so5^Fl(yobTP);b~xVu}X=vyrY2?V?*G}Wp?>E zDUu^!e>|VzQsh{>!QI&g(|jZR^$k$wf{l>w?oW>W@TbH0%geugK#z9E1bby_WBlZp zE9PXPIUR!+dqKvDB<8bxw6aGLzg=^J_-T7~SS{NL94#LZQmSDn988^F+vv6Bj{wE* zTpDglz0@BMIGxW!I>0gdY4~W&;sPwBorD=TF*gi~@~6&TOPjzXRY)UNcBx3KfiOW0 z0ZAcnKX6=nmHL`@{Z1Nb(s8)Aca^uDIv&k3_=WgC$w|XizzA-w?Kol{tAN&bbN7I9 ziYQ1Vj9g7m2;yl+zmfI$JXA@P5n*}XqM58cmsL)H$mt-RIs}!*M41%ZoNpQ}1`a%F z0DLGPbP^cAQQ69sQE0T(agl8j2jb6nU5M;0)xEx9_kDAOJ(>pU*Kg%4pst28dq$8# z*91XU66JvR)~NsOMiHL>2wf2ypNo~_34}~JJr`U4(|xmjL9ehAq?%$M%K;YeGP)1Q zG#Ff3EDkj5Wlan*JvIp!wr#jCt8mA(v-MxLX6Yz0!msuja7u>SNW8!{e<<$z7G7YR zznYn-TmPN6UWnK?cD+k#F1O599TN%jXaw58qIAKcnSDx5#?|vPu7x<=H*&!umOe=w zio)h$U0*1JAxKTNh$TZB(rPoEQ}=cP1e3<4*Bb&U9yFKoAf5zj_pMT>W{9Q-?i_7?70&-O?ygYI!(QJSy z*eyUYjm%M)UBy~Nn)7!(y&obfmjlLq&oV3>MV^$WPCd~Xq3}mor`95#%4%Gv^3*5y zhb>}x-y+k3g3WE3`051(d3&yl3;erdCGYV5qs%e1R_5|0mFtz_!$e1Gi%{NYOS1A7 zqwg;^{G%LfEof$_fe2wGd2l;{8LiirY<(8yB|}-l>tNoJPE3Tg6wn!1nRwS10u_b_ zRRTr=_t;a6WfI4NKs|rbe$fd}kCW04QhnT32&|XM_)q^yq zuJ?@GQ@+}OeiAx$=1cL;_cUi7psj0ewLreZ4e?vQ%YL9`1WxhXp<{1c6u%1qoV0xB z#2NU`vs0{*e`zqIg#G33NQZnV{<(flA1kJ1{S-1Q09gri)Vi0&bCbUI)?xZ3H!+H7 zWmvnW^j4Rr$oq~*96}!2RmoflVb)>ytR~nlZV1JB3{US@P$aRzbCkYKj8VQ_A_VyO zDvv8u)#IP74_UGM6h;pP+GptIPuxKh;zf)-sqS{2u}*)>1$A4 z*RG)aW`{Q1=kNIKzTJT@AI;PJqhWkk|5a`JP0L~p`AY@qS=?n$UL0osY{sfwMKjID zR9!=ZEFkHXlyF}Ro{|tJ?gtw-bqKPAY8Ykr2Ct8jnih#q(Y()}x!oms@c^F6>YJ&D z)rKg<7vOoKH}4}G>5+hM=dM@Yn4WMMp2m{f@*=B7JZD!*8OWevehzl9GdH`SEf0p_ zxuJ&Z8pZi{KW&P-Ez>DcG0BAecXgX0-S5Mhw2B1>!W|++snQe-jKu3?#AfWu0iUx@ zaHZ!R_ok@tf}}RL-P-DQL7To1e#5+3WYech`k(EZZ}l5jZ%96k%G>oq4UZsoH;ra@ zY9_|FU6)=*@V{=f-mC0hG&<(tT(A$YpI+A)?QUBKPW;99w`ZRiqdhY;qK}E!Lo?lS zAQ4!+C#Q2w`(9heBUjIgz0X@d&mQ~nCpXwbV_dA79iBEY>F}0^BR*qc`FXz}m^A;W zcd4t(=ju?4c!l(#3bo$o;=pa>*L2Z2<38dpd1D@xvWV))u`;eQ<~#N?7slVf@AFJ= z_~^hWi5*nXp4I>S^#>oEdV1sTyGeFvEuI&wg^kO6`^}%E^vCzU)v5{3zNAQ0U&J|p z;QH>^65}bPc7#68ky5E2roEnN3fDC;8a4YNgxNv@Yg7=+bWD1h? z`|}{iSe{{=^8fz&rD1FJS-LOL)=0R4>!w15$UoK!?0#@NH)xmAP}V$QNgg7RL-c(wPiY8g3teG%vaRb<4W?bG9DbEZCn@LVK0#zCazE z9(m0=n>qX>48G>=G24WUzH`L%hqoi)ad{lL-V{?Nlg?xzQ}f8wImSoMXq`k%j)1BR zb^2OgKq;Ia@5LN>5I2nkfkrp=EYD}*NquU3clhK&-$MA4r22ED`N=A|cOh>paL%9R#TWr4mx9Veoe_%cN+8S)b`(6Q0QQXB*r=I!o&I5u~IocE=$J6h_ zd`aG1@bu20{en2~Qey|uJS%jvdx?4X|Lg9{1DZP4zOnY|ZC!XNi;67w;w`8wzQF*p z1niZ?C6Ho>?4W=^0tvE1*z}?zdo8jgG(?FekgyaXgb)I^vP9MhAt1Z#1c+=2Ae--@ z*VbEWulD`E{_~!HGBal~^UO16=A4;%e!r*9_2;6`8{4*UvfM39Of*SlxMa6plI`{G+v(QM+UuynoJW#glbNmd7q|2#;K7 zZOTEp_ZfSHpExMcC0c|DINk-=e7vXPLHTH7O*T_EFCny#jGg2f&3+RpYFnyeU#O`M2l+$j=aD>9=zu zE9{X-cK)9`Gf)3p)_(8wn~MIYXxK0RCt7+#cYs$7VuYBjloDe^?uSsU@(bME&_)TrF8@C#{oT z07R#8X02!B@q$uQgmi#je8QFV`Pj3Yj}kYYn*Hgs)hN}_0jy5foxZEZ!@KUTUpVmU zo5;U(m>}I=OK3}dH7O9Sq)iHE=^H<#N#2yV5Nfzi{Qamhg*ONzG9GvTRGjgDA(hKY zVsL-HA5DaX8%GZ|yFS@>WI5x+(qC4;dKleNzvZEFV=W3Y_G&#sGv?3W)Ly%qme`+a zP1yZ^ye^4n*1zbU-9lM_MjIgw=0gFJ6wvXS{R=K~E;vl#nd7ZVRAbGjMR}BT(342|(QoGro{CI*nb!8L3_jTdvP2-%!$W3;}um87Gv=-60 zw7l%F^`_%?zv-^O%18nws&V^ze17UUmo=hj@z}2eExD|AXm&} zKm+m!qoGE7$|!$wE19B1`1hiX@9*!w{tIpV9FdIN>xg5P`xlt6Xm!h2#6~mcfvwMi zyN5+_G5s9qoL#2)@ZE)CSOjCe#As9zU07iO_{mC74Uf5yl&8dwRG3M^6-Vz=edkwrXP9z=Ar($jU$6co zCTodPe3hW;;&OJVj5b{o2olYGCb6&U=uc(+vA-`_IAkQNn{HUPMyxI*i3+r^fqC^iq&HJu^h3x#I@2RWidVi%e2|ee^Nm z-tP|zFTa)d?5XZ^D>Mh@prB74FeL_BONz!v@}_(4+l6t@uJoBREvcc6rHdIXPj@oW z2)k^NjfeKPL`BpdKqO{H6CUnBI=wCJ4-4%sQiZfs(d?FwjXSe!fMwv-v9^J;$pe{z zmTJ}G{hh_|1&xghj$%HDYwW$eDiflb7VBrpD*;mbY=kwvIn1TD#pcT>?Ik~5%;ox~ zhc-Jt|2Hjs5e?~p2)mB6QG}Amp+$tsV>A(IVQE$Nc5!?eH8@#i87v%%j-pbi6;mQn zco(>bX*(EkexH>VS~q1XZ;feo=_LX)e$q0i1vu+I{Nwp@%jrK%8$TDkV<;5dp+}vd zMdx@A4kVARQd7MiH6RZj2!@z9e3?oJC?rR>1at9n{Te=Yb{Qolg0WsY6b_AZL=+=JQtz#>l{DA7JLu8An$ge$_8PWgJ5`gi{$qE^j5?jQaBy>|CM z8sGDC1Alj5U_K?;psmoXawMwRXLOLbyJvwr`FvtI;SySlW?xl*rDw&Uoz1ynaBD53 zCQVs78V@kj4Z#wvp;N9(G6HBZEqXAz4o7}REmE& zD;fHn5}AaG23rUmXGB43&S7av=Q!SFry5hVFZmq(^Hf;3=?cjPU%)H>a&rc-7(FyY zY30A@;pz#(*ly3BuvIhgPj@o@^0weVBDBdcv(^=;^y?gftChVTzaUoN_?)cl8n!du#G!3 zu;;54mlM@?Wfqkhyu}h_iYY+Q*E4cUC>OownqyhM&wu-K6hd!4+g1C=&al1}5$Bl& z(-{lsIhn|r^iBK`a*U(`y=#g(9@LJ(0d5(9M?w#mQy+IT=zNf~_R%7hfFdDcx(Wgi z%r9N)oE+m(!tHohCi;rKF(6-udJe;_UJ9Tfs|T{MgrY;=fr?aALCzE@+x@bonDnARAuPi z9xu&`M~p-nx8l7LD%)F6?_N94)UWL`=pruqOW{zeXheGr`s53uAE8?D;?e~(+CZz| zK+2)hFRc-*bn5^dxzZB}SY#pNQ}QG8*w4a3YaD4dwWM+H)Xdx?lW^rnqbW7J;|=_- zv;xGId!YbBK!wL|f6~7z%kPaVmsum41i1;oa3kabETUeIcchUo4|SFnx{dIfSOFoE zQ+H-?^M7y6MP>vg8+54}`N=HtFZEdl2e;5857jP^u7oy=c>3L>h&0~Q)KY2T{OW^t zP%t*dcfPw!M^vHjUyoUoAeX;iuuq&hM*0TmSFN?A4cW%kPM-2O0^)LPS`>2pgi*HK zV_&Dz=sQf*SOAKQRh7QndJ0_?a)!9~YEj2Ol80oc^n#!-p?)r3HV*Q+8(y_a<#*W^ z>PHjUS>**CVIDhp-@L!p|Ho7rD~aK1v86mYSbFGq@~mUltCD3(EyRT=N4pW`H?*g7 za-#3G#BNOVm$DW*y`=e6R|`~5YZoeHi(ry*I}KJN*4&VIyO8>|G$*zkKv*RTBG`D}9tUUW zFoE*8hypw09`-U}Zy{{w5ojwjG1Ed-s7R2tu&G-HIr@V@RiFt~HKfGHbDaNL(BDd# zI%N@8T{3MF}inBeOGPh*c_*8-8Ea9f}oAY5r)^JY#V#J8O;WGFQ^B%kcN3{4-RR?AQ={8OC?f$m=d%8iPlr%rx z{z$^$&?^7MGS&?v2zFu)GyFE-odPBi5kac$R##e9HETYkJI%oM0|ZY&bye9?hL0mY zw4d;wM121}-ylWhBMxmzk=|oGg%vHBnauKQ3Erq#$D&T;8pxlN6Fyz!j!%fVdbu6^ z9a{PG?;;%{b-E!sTwf|G7?hx!GGl-?8YfJa^3L%}Lvg6;~$QCuiA``@P><+f})74aCm+as4Uc;C!lD|L5K$XQ3TYuS5>ZVSMXsq0ah2C+%(dwPZ)ilB$R$Nyu*UEqQc69-bWN)wP?XNxYl%c` zl*ZUvVbA14K}GK+#Z%9N0=!egag%sTxfeZaZ#V$_aA=p3D*H&M3w3<(1{%J<%D36y zxso}8734h6$v=N8J1!vT!aASbe|~br<&GH9W6Y1AyzALziJu)}ST-XX_;4FP={@pM zmfv${i-|C&lJ)zf!jU#97P+;BZG4<{i-&;dIBbm83WNcc1%TgzDujmz$2YL{^6z({ z^M0L2^PqeiI26i1S!Npa)I`zivuo)CR#fd$0kuog5-dW5*7qnWTlk{GV6iGWE4YGo zwyQxBQfwKMNhulR=$+An7xYbWUU?%$*_-wzl8JKY(Vkp>!Z8L4KszIobN{;hBgFar zwZEIXUpb*d>${Xomr^akE`lPCnNApTmblv@vAE)kAAJ^BkJUTfrGI0XF+&fag?a;) zfxxiM>vfAzRaW2q#eA149pghNn6PMNLxWb2r&Nd^;j1$UgAX$bd5YoScC5Tevo zitH`K>{l|6wmi6+L1l#$B_Nl%9$^SAxnXFO(y^MmjWq-Yw{N6xbBO!A*BfuFnw&g% zZK~I6vY(biovby9b$i;0npESte8cAn+?Dy5#}W@Keutbp4_p7Uq0=A5X#t35;oLG& z-8P%q-+pE@yO^RjtU)-As!42m`eZW4#-f3tyqLn3ENMB>rWaqK)!<=!_ffsBHrBJ- zOm?-pWsO}3F=oY3)W!)!i_Pb+B|ghqZmF-ib=NtGg>Yb*3c-Bk^{Oxz&4a*7&$(x|8xYIa1 zfR`g~N9%+LS9Z^cVBu&8+OY(ceaV|VQ0b0B zl7Y9r^sM`MYh)=K|NQ%I8T8km9y|RzbiJMRpnSvKINIn+L7(-dzD1uDR9?<=;^s~6 zoeG%V*>M*}wUt8PO4E@X0B3kFIBZR}#C<<`H6mpBt85sQy?$SXROfUck=Vqhw4P#~ zG!s_mT00;YN%q{Rx@K@&+tq(;H9J2W&0VHuZYL>>Q6Xl?!RVb?y9;)YicOr z$<=hyILlGhYL2!2Ct^wUdMY`uB{H|f{_X1}eBnG}wq;E~q$rP*;>@JF)rN;}#ihok zS|(kvaiGJ@z#PC6%9E8{k!_n-9{?on5@Bz}`REWpUS|}!fi3W~&lOWEkyMC(kMV(u zWmWfrZAK6Zus8R~U}+QkAwsWE)QX=R1!yQYtMz0<211Gu7@;h%4BDpEB&*f#8MQC; zwv(@CmuhT0H18ZB;VS_o(#^R&tHC@MoI&0MU@=EA{W@rEZr7xspO)3GpS8ekV!${Q z4s5&z*8&!N%RGW@o1N+CBos>g=Em%QY}gtd!(sr_X9A6BBeVoJES-FDJ(4~D{o={T z$4cToS>0YDWb(#RkJ16h2iLUBEmU99oJJjTqQzD`r`0u5_r%xW0YhoalEG^Q)~FPA zr56Wsa`Iwp;Ufdvf+Dx}-c59eLY(BhCd(ZTZDbZ*ki}9zBf8%2;m$919fs;XNZk?Z!iU z!VC(9=LSnlvoA7|3qO-%JaNd#Y+_m}2{`~ zQI+s@VG$BH&oNz()KqW)oalb@AoI*jiuG{EjFDo#V1qi_{<2wW4FKp_q~s9IU!uY* z9b_6E8^nap6BjOql=(^spZ-F=4@D$dx>cVKve&q0uNf$R>g5@L@!~QyU?!^W5ot9@k``CbcNd3`z2x!8kzPK!?3PVXdV-Gk={9MM_@w!Gop4PFb+WA_79+5-T zvF0i<4pXNLGBT^iN4n)kH_u1wC}mA86_0khHx8#O;3KovYwbSHj%~ZSdU)H7gzF3#N2rK73fKrW?adSTYSfi71fv_|y@!OcKW3%pE#&y3=+!$t1Tda;8cFj2Gw z(^YkXc6V@elV&6ipPow9eK`c}_&$ggnWTWy^lR0zfWSv_lNsLJ=DfztdiCe?aOK#8LVI?q}yxThjo+1W`r=!zENZF4$?4qWt-s zO8Bc_jtYSlN?7(+&;hICaw&bbGlt*R5Zq7{8t(<;*OhP!p6W701 zSx$pDC%A92qyV!{nXQWtEc8x4N^|~pP$@B}{bIFNp=aiOL8T`zKGD=EReXGvzve}1 z>G=ntP?sQ74=%W*dq*Nn^f4Xx(Rp@Ixx)i$2A+N|dH`fG-!wqgs}@wg6{=6@Uzca% zp0u!hw)Bt*qrAiDnb1#AC~bJ{(c)Oe^(V0G9}F768w8p?STu*KShnI#d27!<{(kyS za|7GWi&Sk5o)b6^r2}W%vZhcN^gQ4AuVD-3(_POxB2Pa4RP#`z{==)BCc&~w1e&7~ z1)lA=I=_n;aQr*pq(oVmsTH56gh7f6Y+X|#M7HH|e+!w$?dP3fE(c3*9XO#RG+Bzz zjZ)a^%2vM>T!8hY&SPw$F$|C^RV_GS8std-#&OsA71~+IWB&jUYHaK|%d@EYo~3bj zf*oO9CF^}CoyL0JlJ;n%6Ev~C57W-$% zJ?OYwkGv+)FQJAjNL*jKrF5f6q+#cvio4agqPs8QI3+iqly18KGrU|Jb0>;!R}}m5 z9%J_n9mjPm%S)jAp`7EiblY5gHYRT8^=lf7UfP?pcoO-@2;3MGE@nwNthJPjd))9) zglOQ#4U(WYMy)?A1kHzmZ5s!RM{+{K)GdL9eSxWI(DmJ^r$71;`JEXBg3Dt_d5mex z;6Lk&@&!~hyoPc)LN04|(M^qI9}^pNp~TP)f$=IzOb^6*c~-6jZW`p}ETyNLiUWW% z3CP!FB~!6iuY#ezLN4w2iBu=)mus&ORwuem8z=av#gx`2$1yj zE@P7Qx7wC&Se>#}P^$`0(NSIDNUnWW)(_7YsY9Q5u>)4rPZ`GV($oQ)Gli8QG3@4LDej!6t#&R zqef6_w|?69eZT+zKIgj5b*}3<&w1|ix$oy*=M(4i09rL=Rb>DP$t3{K#Q>a70~7(| zq-5k|q~zpe%0{}b(sWkF-YhD=bZr7KT9$a5)#1wKn5fwr?`BHO7_I{xZ)lgcX#@eq>A@)b&3+T_WTNxne zBcDna6%#=*r!kifGf8qqN)%9K#oL;@R9A(Cb@j)*RGft^ZHU$2-;e1}O~&4&UXZL^ zZ)+M-PS(DPsT-F2V9cWkJO?Dn{#Iu!o0cHW=P5Yiaa^X6tvDtw@99KOk5O8GvpM{| zb?;2=5Hz!+^qK-;&?ViNFc)lN9)iL#)cP~9`@jB?3gtX*$i7`Yj=`FxWt6PKOhg8L zL)?1~>3vtQ9ee=zL;4_%%vjqm#*;E-mUoiKSmY|I)0%;uePA3^FJOLcuHn{g&qc6^ zfI()}dmzHA2N+Nk`WKpNQ|JzoQN=Ml&;_vm;oGzgO2tRvZYSES`-fh9{99d7_sbn# znU=Fvcw}_tES<$KQKv{O(@XwmC#o4|Tp_gtS%a8Q<~rhgNuPp+VszoH`iRVLT2@xX zz%5~uLRw_HRwz}Ay7`7B64%L%k3MFJ^Hpb2QZmoQEMcCoq<7b@fQMtK#5$UEyCkl) zsbY#!8O{M~qnR@euG=r=4`}OFuKfthPp$?dP;R18!3Ck)HM1Q>kanL4Hw!$>s?+sZ zNw;HRc}PmwRDE0j;_$q@;i&6dM2)*=M0+9oPF%(B<`B$MXg&dnq`6UTn+ z=y>l$F@Klehr>)S@mxbTKtqjHlUtK{1`mYsno0Rd;Cq0k#RXpz=ra)VNX-%uyx&Y`Vt8HadQWb#-q^{_qMVth z{j1;5iw0M*8bzjeg(RN>%07I?FXo}DX}}pA1X-!9WI~x~7;&O{^E8N9JlyAs^c3O! zWgz+X98i;@UG#^*(9oKUR6E{Xe-xm=sRY|R*$?AtDlAR)G4za*Z8LKUaB?eTGEQ@< z(fT;2Y?PJvwrL&be6S-Mk8KYYn5Z`w@!U6;3IejMyerzY5##bFER68?n)n?=BIcp5 zFBr4ayLBP_r3z~SOIuo+RUAR~#?QvEcx`e?!;Htod{ktuoidmnesX_ua=i?+X0x-FNDzjmV+1v)>6}%_0 z=Q{Rz-^w@$xdIjLn_LmCM`D1&5=#w&n1mZ&p^c3Da&W~yOlt;iNTlvkx7BW`*q)yz>OLu)MwPw~&JQeE0Xewr+-c%$}mX^2YG%m=j3#>z)#~P-82{S1AOY+53 z{g~v9u#_Mz%(<=!o%wp72$irpu07h94c~fm&*xodoq#&FLi1Z^}=VqI|w@3^nj@MSx$ur7OO&WYyq0wNy&8}EgrkR zs{W#O6kl=eaxp(rYi;K+XM&-oD4cpi;u1TmKI*NSE9#77kc~Q;XIvfJG@L3hB#XS2FTLE;s}|sM5UC#u zeGSvJw6865|1O&686{`F^p?^$IHfkes(nu1#w+uMOML>lxGPqBL7GV}%VpW;))o+)o*3f8sy z;kJ>L7X&76vf}D+uP1lPnd7;36Z)M#3~463K^aj4Tb1PN+cLg9d>H=m6Jv?DOh^Tz z*8q{9!!^$`#)&YrsHr%MliqVK{$N%rEIu$-T#_)XvdswI-!ZU?;A~BPxEgtR_Z7!8yUL&>dNO+lJzDF zWPS37DMC+LE-&-%9o=}5?Yn}@yQ}Qk#Bao^-h&Pbq`d`KGoSbAk#}P9kCIN_)Nb2K z`Lirzj-vFdlQlyWt+>@QsuUeMH@4Ww8+7y2Sd{!;N@<^#huoNQ`_L}tqo9W%%W^^Z zu}yK^47(kSRndbxa?W!NPK&1RGSzRT$6Y&l8s~+2PH2oRy`#~Bm;po246glaxe;}B z_d+#!CPxb@47W!g4v44k%|$;N2(#a4-r#Fdm^RIn--gdYh!1#PSSO()_1-{(7G2`h zx`@X8GMo;KILSo=&9UHG@kW3MRiwl@04*6=WCk=#7c;GOIm7XKJu;6!Y@HF$j}&r0id$n9~HOP5K(ZLq5mj>}E-MkPXqo)|T>aug)q zo^X(<^lI4uv1#pX7N<6;0Cl%dO}puHTG~T#mXLmT|bW5Rki=-tE#&HVs_?aCl z&P)RZ(l|8_WMn>34#1RfeCSplyX0C{k!Ec3(tF^bp);%5B!^Qtc!GS?gXTU%XWXG{ zR6vPhN1o<`A6Xu-A*-qnuL8Fw#@dAH2s7he+WKNIkDl~&?1I}D`NNJwx*ff1= zkcCU&yhLi^rqF@s0L7yJTy@=pxaH5&b;Z_X(^aEa__LNiw9Ef~Iy$M&T;_npB!fUb zbF_v0AX~}|r=B2Xqu`%o9zI4tj$)4Q$iPd*q=0lIVuTgb)tLuYmHvAijsX|O`TbXb zo#B3`_QD7FgWtSuO{%(kzd3S8oKBWvR%AW5xs6_qIMRb;s+g@0EpQL1iUq32Bwgi9 z(9y4Wx+FK`+yb`sY#UqG1o>wg4`c`mE0;$g7VwUnjaTW6SVMLl4IcFDtR`K-)oqz1%@ih0n$Hm+foIT0&K2cQr z9P*3z63m#^!S|P6Imoppk>CY7K;V)M3hm*;BD4CtEia5hNiwy8I~c8bT*}26jGCJi zFMSNk&50{?N(ddbZ3V@sxFx0nvFJ9kg1Bl|r{y0;6xHh{im=rh%`_>9Xv{`#d% zl||B$?vgmw`OWEFD)tip1pOMlUePE61}Qhv=Z32@?TKp4C#kBzx^03vp1aoUzj|lr z=qe5WkFF#*CO{R)MfY?PjV+DX+53izWp_*71u1CMt zAB+Ni!!(HJraU;zS)9p1ss~H8^fi0dw{$^O9Q)pg_BPgnaIds+dg0y(Nuz&DdATYa6BjqJlT;R>igx@aBu#VaD7* z-k`0eyV=AchkF-c>w%s9Q@&<4$5WhlV$6^7jxLl>A??Gy8DJzg;VNQgh3zRv$5Fsa zr;^znLW&sgr&mFF=nfksrjeNVb}rd@PA$?-|Atr`!r;+o{&yC!st{+Ci8yyc_w>uD z$486bS89d5C73NU+eP1{;AP;TW(tl)wXvem#_K(7XPUQu^*Vfn4Hbn(qZMZ}~vy-Mg4XGvBPLdRgFX98T`cSFLxL zVS~BwrU=z~RYe3k2sW9&hl*Qpf0Jx|+V*%!hWcg}6~1hgn;g+;G|r~8WYC14zuMsF z(-n?!YcB||7G>3tjS4qlL-a%Gb}47*USK4~nrjRn_#T=m)CW3#~0e z0B~AGWBUFVL=LBrf3;n1lVvr2_KT@K#EXlG=~Sq{f4kac07Iy|a}bwwRyMFPaBBT4 zZ}}V`D0;H@d+L=n^i^-)?+@pIx~wV9CqHT)ynnD&_`j_v6T2r?peeGh;NpWJg_SC4 zp&?0BbIO41p|U!e5-iy^m$K<5GMvgKRfEfHdK3~P$q8>!J_lSQGWd=84FZ?}(A(~N zchd1GRBq3?p3Dm91`Camd55R>&srO8ePdMK<@S;*ysQ6rDn|QQ6k2w#hxwX*a%PI9wkC!t8bY$4wi7zCF_jtIMlA?+R>AT z*S2x=@@uC2aE|G$GkFAiR$hxYZqYz6Mb4O@r91;;ARLZkA{}lMTC}56!nVCuW;33w zlSV#_^{vrgVuSuC5vCg9N8`&-yf=BiGRrQ4A^tFOL(~Y?un4lFDoRFl_s|MO$xMe&;K?75%p8B|`^RIPT~Y8-DD6%~Fmb`J1V)){%x z`asx+b$8%VgW5UZ1#aOqZ*1cecRbb!vImih%HCoB$$X3O57ov7fY$nS2j@N1BbnMw zuKLoqbYQN|JvnCaLz~7uOHYPT|8j`+MTjqW6bXCm=g{|xJW6AE(M6C0X9$Ba?0t2( zA3<>~8~J>6lohL-w*yX7bq|D znffLwS9bfvsC)Y9_^c?avkCTZd_?3IWL6hQd#OCnM1wZC!t%d5tpP^LS8IF%5aaHM zqyFvOf}#F*k#iSZ%z2c^l7IX(l!!u*CC<>3l_UzNsRTa?=Os`?hwVxyC@;H3B`0TJ z^j<(T2Sr8v`Nhfo+KY#oma*vth15WpJGp|-AKo5{8Vt8y+zC=Q%bEg2tRyb$DJcq& zq;d?5v8ATxl?Ifj4XUt?xImVJkaqD4wnooW3nKb9W{OL5dnMyWJA}qDDg&Ra&JdN< zaJxH+-EwlX={C$)krGcDml}P(9ts(vt7dHD+zlh#%x70OvBHqO9-g5xz>qjDl(z&97QrSU^-9e%6G@cdFTTq**7f21yDtpDV9zM$w z!-cpZ>)Dx&9Y(Ppf#gPmW?DXedl-0oC|NHL^`7n6OfPHU1O?E@b{RrSpI zc|Svc#Wkvk9Pb#$!fEt*VymI=96w`Qq501|>{6b7DRwIDsO9*&xW@dHZ?>I5$h1)LFhd==z~Lvibd-^DTo(Bi#gZ0^f{SJw&`XA^ zxX`?^A;!Gv zQDB3hanTe}tsR3hTQAkRm&j-doMSrW4%)&>-g3R}5M4KjFqqj$``&iFIVEWA2_Gck z=KUU#Guk=6`;j*xlcHygNoE@vYYNwW8WL1TCHZSb?XOl2GDhD^w6v6&<2Y4H@F2sM z|3sXL**WmIehx$n_&xux{c`aeSqXN$vnCWvrxeB(tV?97_vAPz-OyNTmWa%aEt+~6 UrB-TTMQ9H8`}kMrJLi-C2f9$Zi~s-t literal 0 HcmV?d00001 diff --git a/inst/pages/images/vscode-logo.jpg b/inst/pages/images/vscode-logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..22c00ceac585e880222ac9770ae4f1e1181ab98b GIT binary patch literal 32432 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 Hcd!2g8sq6} literal 0 HcmV?d00001 diff --git a/interactions-centric.qmd b/inst/pages/interactions-centric.qmd similarity index 97% rename from interactions-centric.qmd rename to inst/pages/interactions-centric.qmd index a6b9ce8..2fa08e3 100644 --- a/interactions-centric.qmd +++ b/inst/pages/interactions-centric.qmd @@ -1,10 +1,3 @@ ---- -filters: - - _extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua -reference-section-title: References -bibliography: bibliography.bib ---- - # Interactions-centric analysis ```{r} @@ -12,7 +5,6 @@ bibliography: bibliography.bib #| results: "hide" #| message: false #| warning: false -source("_common.R") library(dplyr) library(ggplot2) library(GenomicRanges) @@ -39,9 +31,11 @@ eco1_pf <- PairsFile(eco1_pairsf) ``` ::: {.callout-note} + ## Aims This chapter focuses on the various analytical tools offered by `HiContacts` to compute interaction-related metrics from a `HiCExperiment` object. + ::: **Interaction-centric** analyses consider a `HiCExperiment` object from the @@ -54,6 +48,7 @@ This encompasses: - Computing distribution of distance-dependent interaction frequency along chromosomes, a.k.a. scalograms ::: {.callout-note} + ## Note - Contrary to functions presented in the previous chapter, the functions described in this chapter are **not**: they @@ -61,9 +56,11 @@ take `HiCExperiment` objects as input and generally return data frames rather than modified `HiCExperiment` objects. - Internally, most of the functions presented in this chapter make a call to `interactions()` to coerce it into `GInteractions`. + ::: ::: {.callout-tip collapse="true"} + ## Generating the example `hic` object πŸ‘‡ To demonstrate `HiContacts` functionalities, we will create @@ -93,6 +90,7 @@ hic <- import(cf, focus = 'II', resolution = 2000) ```{r} hic ``` + ::: ## Distance law(s) @@ -231,6 +229,7 @@ v4C `ggplot2` can be used to visualize the 4C-like profile over multiple chromosomes. :::{.column-page-right} + ```{r fig.asp = 0.7, out.width = '100%'} df <- as_tibble(v4C) ggplot(df, aes(x = center, y = score)) + @@ -240,6 +239,7 @@ ggplot(df, aes(x = center, y = score)) + scale_x_continuous(labels = scales::unit_format(unit = "M", scale = 1e-06)) + facet_wrap(~seqnames, scales = 'free_y') ``` + ::: This clearly highlights trans interactions of the chromosome `II` centromere @@ -262,6 +262,7 @@ Several scalograms can be plotted together to compare distance-dependent contact frequencies along a given chromosome in different samples. :::{.column-page-right} + ```{r fig.asp = .4, out.width = '100%'} eco1_hic <- import( CoolFile(HiContactsData('yeast_eco1', 'mcool')), @@ -278,8 +279,10 @@ merged_scalo <- rbind( plotScalogram(merged_scalo |> filter(chr == 'II'), ylim = c(1e3, 1e5)) + facet_grid(~sample) ``` + ::: This example points out the overall longer interactions within the long arm of the chromosome `II` in an `eco1` mutant. +# References {-} diff --git a/interoperability.qmd b/inst/pages/interoperability.qmd similarity index 97% rename from interoperability.qmd rename to inst/pages/interoperability.qmd index 1bd3770..66b9c81 100644 --- a/interoperability.qmd +++ b/inst/pages/interoperability.qmd @@ -1,10 +1,3 @@ ---- -filters: - - _extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua -reference-section-title: References -bibliography: bibliography.bib ---- - # Interoperability: using HiCExperiment with other R packages ::: {.callout-note} @@ -29,7 +22,6 @@ following packages is illustrated here: #| results: "hide" #| message: false #| warning: false -source("_common.R") library(ggplot2) library(purrr) library(GenomicRanges) @@ -244,7 +236,6 @@ Unfortunately, the format of the input to `TopDom` is rather tricky (see `?TopDo The following chunk of code shows how to coerce a `HiCExperiment` object into a `TopDom`-compatible object. - ```{r} library(TopDom) hic <- import(coolf_wt, format = 'cool') @@ -294,6 +285,7 @@ rtracklayer::export(topologicalFeatures(hic, 'domain'), 'hic_domains.bed') `GOTHiC` relies on a cumulative binomial test to detect interactions between distal genomic loci that have significantly more reads than expected by chance in Hi-C experiments (@Mifsud_2017). ::: {.callout-important icon='true'} + ### Using the `GOTHiC` function Unfortunately, the main `GOTHiC` function @@ -386,13 +378,4 @@ interactions(res) -## References {-} - -::: {#refs} -::: - -## Session info {-} - -```{r echo = FALSE} -sessioninfo::session_info() -``` +# References {-} diff --git a/matrix-centric.qmd b/inst/pages/matrix-centric.qmd similarity index 97% rename from matrix-centric.qmd rename to inst/pages/matrix-centric.qmd index e1d190f..5dd8799 100644 --- a/matrix-centric.qmd +++ b/inst/pages/matrix-centric.qmd @@ -1,10 +1,3 @@ ---- -filters: - - _extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua -reference-section-title: References -bibliography: bibliography.bib ---- - # Matrix-centric analysis ```{r} @@ -12,7 +5,6 @@ bibliography: bibliography.bib #| results: "hide" #| message: false #| warning: false -source("_common.R") library(ggplot2) library(GenomicRanges) library(InteractionSet) @@ -33,9 +25,11 @@ hic_eco1 <- import( ``` ::: {.callout-note} + ## Aims This chapter focuses on the various analytical tools offered by `HiContacts` to compute matrix-related metrics from a `HiCExperiment` object. + ::: In the first part of this book, we have seen how to query parts or all of the @@ -66,15 +60,18 @@ This encompasses: ![](images/20230421134800.jpg) ::: {.callout-note} + ## Note - All the functions described in this chapter are **endomorphisms**: they take `HiCExperiment` objects as input and return modified `HiCExperiment` objects. - Internally, most of the functions presented in this chapter make a call to `as.matrix()` to coerce it into a `matrix`. + ::: ::: {.callout-tip collapse="true"} + ## Generating the example `hic` object πŸ‘‡ To demonstrate `HiContacts` functionalities, we will create @@ -99,6 +96,7 @@ hic <- import(cf, focus = 'II', resolution = 2000) ```{r} hic ``` + ::: ## Operations in an individual matrix @@ -131,6 +129,7 @@ should be nearly identical to `balanced` scores, which were originally imported from the disk-stored contact matrix. :::{.column-body-outset-right} + ```{r out.width = '100%', fig.asp = .33} patchwork::wrap_plots( plotMatrix(normalized_hic, use.scores = 'count', caption = FALSE), @@ -139,6 +138,7 @@ patchwork::wrap_plots( nrow = 1 ) ``` + ::: ### Computing observed/expected (O/E) map @@ -169,6 +169,7 @@ detrended_hic Topological features will be visually more prominent in the O/E `detrended` Hi-C map. :::{.column-page-right} + ```{r out.width = '100%', fig.asp = .33} patchwork::wrap_plots( plotMatrix(detrended_hic, use.scores = 'balanced', scale = 'log10', limits = c(-3.5, -1.2), caption = FALSE), @@ -177,13 +178,16 @@ patchwork::wrap_plots( nrow = 1 ) ``` + ::: ::: {.callout-note} -## Scale for `detrended` scores + +#### Scale for `detrended` scores - `expected` scores are in `linear` scale and Β± in the same amplitude than `balanced` scores; - `detrended` scores are in `log2` scale, in general approximately centered around 0. When plotting `detrended` scores, -`scale = linear` should be set to prevent the default `log10` scaling. +`scale = linear` should be set to prevent the default `log10` scaling. + ::: ### Computing autocorrelated map @@ -216,7 +220,8 @@ Correlated and anti-correlated loci will be visually represented in the `autocorrelated` Hi-C map in red and blue pixels, respectively. ::: {.callout-note} -## Note + +#### Note Here we have illustrated how to compute an autocorrelation matrix from a `HiCExperiment` object using the example **yeast** Hi-C experiment. Bear in mind that this is unusual and not very useful, as yeast chromatin @@ -224,6 +229,7 @@ is not segregated in two compartments but rather follows a Rabl conformation (@Duan_2010). An example of autocorrelation map from a vertebrate Hi-C experiment (for which chromatin is segregated in A/B compartments) is shown in [Chapter 10](workflow-chicken.qmd). + ::: ```{r} @@ -237,11 +243,13 @@ plotMatrix( ``` ::: {.callout-note} -## Scale for `autocorrelated` scores + +#### Scale for `autocorrelated` scores - `autocorrelated` scores are in `linear` scale, in general approximately centered around 0. When plotting `autocorrelated` scores, `scale = linear` should be set to prevent the default `log10` scaling. - `limits` should be manually set to `c(-x, x)` (`0 < x <= 1`) to ensure that the color range is effectively centered on `0`. + ::: ### Despeckling (smoothing out) a contact map @@ -265,6 +273,7 @@ results in a smoother Hi-C heatmap, effectively removing the "speckles" observed at longer range. :::{.column-page-right} + ```{r out.width = '100%', fig.asp = .33} library(InteractionSet) loops <- system.file('extdata', 'S288C-loops.bedpe', package = 'HiCExperiment') |> @@ -287,12 +296,15 @@ patchwork::wrap_plots( nrow = 1 ) ``` + ::: ::: {.callout-note} -## Scale for `despeckled` scores + +#### Scale for `despeckled` scores `despeckled` scores are in the same scale than the `scores` they were computed from. + ::: ## Operations between multiple matrices @@ -352,3 +364,5 @@ cowplot::plot_grid( ) ) ``` + +# References {-} diff --git a/parsing.qmd b/inst/pages/parsing.qmd similarity index 97% rename from parsing.qmd rename to inst/pages/parsing.qmd index 5b5b798..24914db 100644 --- a/parsing.qmd +++ b/inst/pages/parsing.qmd @@ -1,10 +1,3 @@ ---- -filters: - - _extensions/pandoc-ext/section-bibliographies/section-bibliographies.lua -reference-section-title: References -bibliography: bibliography.bib ---- - # Manipulating Hi-C data in R ```{r} @@ -12,7 +5,6 @@ bibliography: bibliography.bib #| results: "hide" #| message: false #| warning: false -source("_common.R") library(ggplot2) library(GenomicRanges) library(InteractionSet) @@ -24,23 +16,28 @@ pairsf <- HiContactsData('yeast_wt', 'pairs.gz') ``` ::: {.callout-note} + ## Aims This chapter focuses on: - Modifying information associated with an existing `HiCExperiment` object - Subsetting a `HiCExperiment` object - Coercing a `HiCExperiment` object in a base data structure + ::: ::: {.callout-important} + ## Important reminder - An `HiCExperiment` object allows random access parsing of a disk-stored contact matrix. - An `HiCExperiment` object operates by wrapping together (1) a `ContactFile` (i.e. a connection to a disk-stored data file) and (2) a `GInteractions` generated by parsing the data file. + ::: ::: {.callout-warning collapse="true"} + ## Recap on `HiCExperiment` objects πŸ‘‡ - Creating a connection to a disk-stored contact matrix: @@ -66,9 +63,11 @@ hic ```{r} interactions(hic) ``` + ::: ::: {.callout-tip collapse="true"} + ## Generating the example `hic` object πŸ‘‡ To demonstrate how to manipulate a `HiCExperiment` object, we will create @@ -90,6 +89,7 @@ cf hic <- import(cf, focus = 'II:300001-813184', resolution = 2000) hic ``` + ::: ## Subsetting a contact matrix @@ -134,7 +134,8 @@ parsing `HiCExperiment` data, as disk-stored contact matrices allow ``` ::: {.callout-important collapse="true"} -## More examples for import with `focus` argument πŸ‘‡ + +#### More examples for import with `focus` argument πŸ‘‡ - Subsetting to a specific **on-diagonal** genomic location using standard UCSC coordinates query: @@ -165,6 +166,7 @@ import(cf, focus = 'II|III', resolution = 2000) ```{r} import(cf, focus = 'II:300001-800000|V:1-500000', resolution = 2000) ``` + :::