Last updated: 2020-11-24

Checks: 7 0

Knit directory: interaction-tools/

This reproducible R Markdown analysis was created with workflowr (version 1.6.2). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.


Great! Since the R Markdown file has been committed to the Git repository, you know the exact version of the code that produced these results.

Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.

The command set.seed(20191213) was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.

Great job! Recording the operating system, R version, and package versions is critical for reproducibility.

Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.

Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.

Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.

The results in this page were generated with repository version c6b67b8. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.

Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish or wflow_git_commit). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:


Ignored files:
    Ignored:    .Rhistory
    Ignored:    .Rproj.user/
    Ignored:    .drake/
    Ignored:    data/COMUNET/
    Ignored:    data/CellChat/
    Ignored:    data/ICELLNET/
    Ignored:    data/NicheNet/
    Ignored:    data/cellphonedb/
    Ignored:    data/celltalker/
    Ignored:    output/14-CellChat.Rmd/
    Ignored:    output/15-talklr.Rmd/
    Ignored:    output/16-CiteFuse.Rmd/
    Ignored:    output/17-scTHI.Rmd/
    Ignored:    output/18-celltalker.Rmd/
    Ignored:    output/index.Rmd/
    Ignored:    renv/library/
    Ignored:    renv/python/
    Ignored:    renv/staging/

Untracked files:
    Untracked:  analysis/_navbar.html
    Untracked:  code/render.R

Unstaged changes:
    Modified:   _drake.R
    Modified:   analysis/_site.yml
    Modified:   analysis/index.Rmd

Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.


These are the previous versions of the repository in which changes were made to the R Markdown (analysis/18-celltalker.Rmd) and HTML (docs/18-celltalker.html) files. If you’ve configured a remote Git repository (see ?wflow_git_remote), click on the hyperlinks in the table below to view the files as they were in that past version.

File Version Author Date Message
html b305bfe Luke Zappia 2020-11-10 Add celltalker to drake
Rmd 4e1d47f Luke Zappia 2020-11-10 Add celltalker tutorial

# Setup document
source(here::here("code", "setup.R"))

# Function dependencies
invisible(drake::readd(download_link))

Introduction

In this document we are going to run through the example analysis for the celltalker package and have a look at the output it produces. More information about celltalker can be found at https://github.com/arc85/celltalker.

library("celltalker")

Chunk time: 0.15 secs

1 Input

1.1 Expression

The main input to celltalker is an expression matrix for a set of samples (3 PBMC samples and 3 tonsil samples) from GEO accession GSE139324. We create this by reading in the raw Cell Ranger output files and storing them as a Seurat object.

Note: It is not entirely clear from the celltalker tutorial exactly which samples to use so these results may differ from what is show there.

data_paths <- fs::dir_ls(here("data", "celltalker"))
names(data_paths) <- c("pbmc1", "pbmc2", "pbmc3", "tonsil1", "tonsil2",
                       "tonsil3")

raw_data <- Seurat::Read10X(data_paths)
metadata <- data.frame(
    Sample = stringr::str_remove(colnames(raw_data), "_[A-Z-0-9]+")
)
metadata$Tissue <- stringr::str_remove(metadata$Sample, "[0-9]")
rownames(metadata) <- colnames(raw_data)

seurat <- Seurat::CreateSeuratObject(counts = raw_data, meta.data = metadata)

seurat
An object of class Seurat 
33694 features across 15524 samples within 1 assay 
Active assay: RNA (33694 features, 0 variable features)

Chunk time: 15.36 secs

1.2 Ligand-receptor pairs

celltalker includes a set of ligand-receptor pairs.

skim(ramilowski_pairs)
Data summary
Name ramilowski_pairs
Number of rows 2557
Number of columns 3
_______________________
Column type frequency:
factor 3
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
ligand 0 1 FALSE 708 CAL: 41, GNA: 38, FN1: 28, CAL: 22
receptor 0 1 FALSE 691 ITG: 67, ITG: 35, EGF: 32, LRP: 31
pair 0 1 FALSE 2557 A2M: 1, AAN: 1, AAN: 1, ACE: 1

Chunk time: 0.09 secs

2 Seurat analysis

We first need to perform a standard Seurat analysis to get clusters and cell type labels. Most of the details are skipped over here.

2.1 Clustering

set.seed(02221989)

seurat <- Seurat::NormalizeData(seurat)
seurat <- Seurat::FindVariableFeatures(seurat)
seurat <- Seurat::ScaleData(seurat)
seurat <- Seurat::RunPCA(seurat, verbose = FALSE)
seurat <- Seurat::RunUMAP(seurat, reduction = "pca", dims = 1:15,
                          verbose = FALSE)
seurat <- Seurat::FindNeighbors(seurat, reduction = "pca", dims = 1:15,
                                verbose = FALSE)
seurat <- Seurat::FindClusters(seurat, resolution = 0.5, verbose = FALSE)

p1 <- Seurat::DimPlot(seurat, reduction = "umap", group.by = "Sample")
p2 <- Seurat::DimPlot(seurat, reduction = "umap", group.by = "Tissue")
p3 <- Seurat::DimPlot(seurat, reduction = "umap", group.by = "RNA_snn_res.0.5",
                      label = TRUE) +
    Seurat::NoLegend()

cowplot::plot_grid(p1, p2, p3)

Version Author Date
b305bfe Luke Zappia 2020-11-10

Chunk time: 52.39 secs

2.2 Labels

Seurat::FeaturePlot(seurat, reduction = "umap",
                    features = c("CD3D", "CD8A", "CD4", "CD14", "MS4A1",
                                 "FCGR3A", "IL3RA"))

Version Author Date
b305bfe Luke Zappia 2020-11-10
# Add metadata for cell types
cell_types <- vector("logical", length = ncol(seurat))
names(cell_types) <- colnames(seurat)

cell_types[seurat@meta.data$RNA_snn_res.0.5 ==  "0"] <- "CD4 T conv"
cell_types[seurat@meta.data$RNA_snn_res.0.5 ==  "1"] <- "CD4 T conv"
cell_types[seurat@meta.data$RNA_snn_res.0.5 ==  "2"] <- "B cells"
cell_types[seurat@meta.data$RNA_snn_res.0.5 ==  "3"] <- "B cells"
cell_types[seurat@meta.data$RNA_snn_res.0.5 ==  "4"] <- "CD14 monocytes"
cell_types[seurat@meta.data$RNA_snn_res.0.5 ==  "5"] <- "CD8"
cell_types[seurat@meta.data$RNA_snn_res.0.5 ==  "6"] <- "CD4 T conv"
cell_types[seurat@meta.data$RNA_snn_res.0.5 ==  "7"] <- "CD4 T conv"
cell_types[seurat@meta.data$RNA_snn_res.0.5 ==  "8"] <- "B cells"
cell_types[seurat@meta.data$RNA_snn_res.0.5 ==  "9"] <- "B cells"
cell_types[seurat@meta.data$RNA_snn_res.0.5 == "10"] <- "NK cells"
cell_types[seurat@meta.data$RNA_snn_res.0.5 == "11"] <- "CD8"
cell_types[seurat@meta.data$RNA_snn_res.0.5 == "12"] <- "Plasma"
cell_types[seurat@meta.data$RNA_snn_res.0.5 == "13"] <- "CD14 monocytes"
cell_types[seurat@meta.data$RNA_snn_res.0.5 == "14"] <- "CD16 monocytes"
cell_types[seurat@meta.data$RNA_snn_res.0.5 == "15"] <- "PDC"
cell_types[seurat@meta.data$RNA_snn_res.0.5 == "16"] <- "RBCs"

seurat[["CellType"]] <- cell_types

# Remove red blood cells
rbc_cells <- names(cell_types)[seurat@meta.data$RNA_snn_res.0.5 == "16"]
seurat <- seurat [, !colnames(seurat) %in% rbc_cells]

Chunk time: 8.66 secs

3 Select pairs

Before scoring interaction we first select a set of ligand-receptor pairs to look at. First we check which genes are present in the dataset and then we select those were the ligand or receptor is an up-regulated marker gene for one of the tissue types.

ligands   <- as.character(unique(ramilowski_pairs$ligand))
receptors <- as.character(unique(ramilowski_pairs$receptor))

ligands_present   <- rownames(seurat)[rownames(seurat) %in% ligands]
receptors_present <- rownames(seurat)[rownames(seurat) %in% receptors]
lr_present <- union(ligands_present, receptors_present)

Seurat::Idents(seurat) <- "Tissue"
markers <- Seurat::FindAllMarkers(seurat, assay="RNA", features = lr_present,
                                  only.pos = TRUE, verbose = FALSE)

lr_sel <- unique(markers$gene)

interactions_sel <- rbind(
    ramilowski_pairs[ramilowski_pairs$ligand   %in% lr_sel, ],
    ramilowski_pairs[ramilowski_pairs$receptor %in% lr_sel, ]
)

Chunk time: 2.04 secs

This process selects 61 ligands and receptors and 241 interaction pairs.

4 Rearrange data

celltalker requires the input data in a specific structure. Helpfully it provides some useful functions to make this easier.

4.1 Expression matrices

The first data structure is a nested data frame with expression matrices for the selected ligands and receptors for each group, sample, and cluster.

expr_mat <- Seurat::GetAssayData(seurat, slot = "counts")
clusters <- seurat@meta.data$CellType
tissues  <- seurat@meta.data$Tissue
samples  <- seurat@meta.data$Sample

lr_matrices <- reshape_matrices(
    count.matrix          = expr_mat,
    clusters              = clusters,
    groups                = tissues,
    replicates            = samples,
    ligands.and.receptors = interactions_sel
)

# There is a big where the next step fails if there are some clusters that
# aren't present in all groups. Add dummy values to avoid this.
dummy <- pull(unnest(lr_matrices, cols = "samples"))[[1]][[1]][0, ]
lr_matrices$samples[[2]]$expr.matrices <- map(
    lr_matrices$samples[[2]]$expr.matrices, function(.exp_mats) {
        missing <- unique(clusters[!(clusters %in% names(.exp_mats))])
        for (cluster in missing) {
            .exp_mats[[cluster]] <- dummy
        }
        .exp_mats
    }
)

skim(lr_matrices)
Data summary
Name lr_matrices
Number of rows 2
Number of columns 2
_______________________
Column type frequency:
character 1
list 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
group 0 1 4 6 0 2 0

Variable type: list

skim_variable n_missing complete_rate n_unique min_length max_length
samples 0 1 2 2 2
skim(unnest(lr_matrices, cols = "samples"))
Data summary
Name unnest(lr_matrices, cols …
Number of rows 6
Number of columns 3
_______________________
Column type frequency:
character 2
list 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
group 0 1 4 6 0 2 0
sample 0 1 5 7 0 6 0

Variable type: list

skim_variable n_missing complete_rate n_unique min_length max_length
expr.matrices 0 1 6 8 8

Chunk time: 1.06 secs

4.2 Expressed ligands and receptors

From the nested expression matrices we then create a similar structure which contains the ligands and receptors that are expressed in each group/cluster combination.

lr_expressed <- create_lig_rec_tib(
    exp.tib               = lr_matrices,
    clusters              = clusters,
    groups                = tissues,
    replicates            = samples,
    cells.reqd            = 10,
    freq.pos.reqd         = 0.5,
    ligands.and.receptors = interactions_sel
)

skim(lr_expressed)
Data summary
Name lr_expressed
Number of rows 2
Number of columns 2
_______________________
Column type frequency:
character 1
list 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
group 0 1 4 6 0 2 0

Variable type: list

skim_variable n_missing complete_rate n_unique min_length max_length
lig.rec.exp 0 1 2 2 2
skim(unnest(lr_expressed[1, 2], cols = "lig.rec.exp"))
Data summary
Name unnest(lr_expressed[1, 2]…
Number of rows 8
Number of columns 2
_______________________
Column type frequency:
character 1
list 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
cluster.id 0 1 3 14 0 8 0

Variable type: list

skim_variable n_missing complete_rate n_unique min_length max_length
ligands.and.receptors 0 1 8 2 2

Chunk time: 1.08 secs

5 Interactions

5.1 Putative interactions

With this data structure we can now look for putative interactions.

putative_interactions <- putative_interactions(
    ligand.receptor.tibble = lr_expressed,
    clusters               = clusters,
    groups                 = tissues,
    freq.group.in.cluster  = 0.05,
    ligands.and.receptors  = interactions_sel
)

skim(putative_interactions)
Data summary
Name putative_interactions
Number of rows 2
Number of columns 2
_______________________
Column type frequency:
character 1
list 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
group 0 1 4 6 0 2 0

Variable type: list

skim_variable n_missing complete_rate n_unique min_length max_length
lig_rec_list 0 1 2 302 304

Chunk time: 1.31 secs

The nested data frame returned by this function contains lists of the active ligands and receptors for each cell type in each group.

5.2 Unique interactions

The next step identifies interactions that are unique to each group.

unique_interactions <- unique_interactions(
    putative_interactions,
    group1 = "pbmc",
    group2 = "tonsil",
    interactions_sel
)

skim(unique_interactions)
Data summary
Name unique_interactions
Number of rows 3
Number of columns 2
_______________________
Column type frequency:
character 1
list 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
comparison 0 1 6 9 0 3 0

Variable type: list

skim_variable n_missing complete_rate n_unique min_length max_length
ligands.and.receptors 0 1 3 22 186

Chunk time: 0.04 secs

This gives use the ligands and receptors that are unique to each group as well as those they have in common.

6 Visualisation

6.1 Circos plot

6.1.1 PBMC

pbmc_lr           <- pull(unique_interactions[1, 2])[[1]]
pbmc_interactions <- pull(putative_interactions[1, 2])[[1]][pbmc_lr]

circos_plot(interactions = pbmc_interactions, clusters = clusters)

Version Author Date
b305bfe Luke Zappia 2020-11-10
[1] "Plotted interactions"

Chunk time: 1.49 secs

6.1.2 Tonsil

tonsil_lr           <- pull(unique_interactions[2, 2])[[1]]
tonsil_interactions <- pull(putative_interactions[2, 2])[[1]][tonsil_lr]

circos_plot(interactions = tonsil_interactions, clusters = clusters)

Version Author Date
b305bfe Luke Zappia 2020-11-10
[1] "Plotted interactions"

Chunk time: 0.46 secs

Summary

Parameters

This table describes parameters used and set in this document.

params <- list(
    
)
params <- toJSON(params, pretty = TRUE)
kable(fromJSON(params))

Chunk time: 0.01 secs

Output files

This table describes the output files produced by this document. Right click and Save Link As… to download the results.

kable(data.frame(
    File = c(
        download_link("parameters.json", OUT_DIR)
    ),
    Description = c(
        "Parameters set and used in this analysis"
    )
))
File Description
parameters.json Parameters set and used in this analysis

Chunk time: 0.01 secs

Session information


sessioninfo::session_info()
─ Session info ───────────────────────────────────────────────────────────────
 setting  value                       
 version  R version 4.0.0 (2020-04-24)
 os       macOS Catalina 10.15.7      
 system   x86_64, darwin17.0          
 ui       X11                         
 language (EN)                        
 collate  en_US.UTF-8                 
 ctype    en_US.UTF-8                 
 tz       Europe/Berlin               
 date     2020-11-24                  

─ Packages ───────────────────────────────────────────────────────────────────
 ! package        * version    date       lib source                           
   abind            1.4-5      2016-07-21 [1] CRAN (R 4.0.0)                   
 P assertthat       0.2.1      2019-03-21 [?] CRAN (R 4.0.0)                   
 P backports        1.1.6      2020-04-05 [?] CRAN (R 4.0.0)                   
 P base64enc        0.1-3      2015-07-28 [?] CRAN (R 4.0.0)                   
 P base64url        1.4        2018-05-14 [?] standard (@1.4)                  
 P broom            0.5.6      2020-04-20 [?] CRAN (R 4.0.0)                   
 P cellranger       1.1.0      2016-07-27 [?] standard (@1.1.0)                
 P celltalker     * 0.0.3.9000 2020-11-10 [?] Github (arc85/celltalker@533b28e)
 P circlize       * 0.4.9      2020-04-30 [?] CRAN (R 4.0.0)                   
 P cli              2.0.2      2020-02-28 [?] CRAN (R 4.0.0)                   
 P cluster          2.1.0      2019-06-19 [?] CRAN (R 4.0.0)                   
 P codetools        0.2-18     2020-11-04 [?] CRAN (R 4.0.2)                   
 P colorspace       1.4-1      2019-03-18 [?] standard (@1.4-1)                
 P conflicted     * 1.0.4      2019-06-21 [?] standard (@1.0.4)                
 P cowplot          1.0.0      2019-07-11 [?] CRAN (R 4.0.0)                   
 P crayon           1.3.4      2017-09-16 [?] CRAN (R 4.0.0)                   
 P data.table       1.12.8     2019-12-09 [?] CRAN (R 4.0.1)                   
 P DBI              1.1.0      2019-12-15 [?] CRAN (R 4.0.0)                   
 P dbplyr           1.4.3      2020-04-19 [?] CRAN (R 4.0.0)                   
   deldir           0.1-28     2020-07-15 [1] CRAN (R 4.0.2)                   
 P digest           0.6.25     2020-02-23 [?] CRAN (R 4.0.0)                   
 P dplyr          * 0.8.5      2020-03-07 [?] CRAN (R 4.0.0)                   
 P drake            7.12.0     2020-03-25 [?] CRAN (R 4.0.0)                   
 P ellipsis         0.3.0      2019-09-20 [?] CRAN (R 4.0.0)                   
 P evaluate         0.14       2019-05-28 [?] standard (@0.14)                 
 P fansi            0.4.1      2020-01-08 [?] CRAN (R 4.0.0)                   
 P farver           2.0.3      2020-01-16 [?] CRAN (R 4.0.0)                   
   fastmap          1.0.1      2019-10-08 [1] CRAN (R 4.0.2)                   
 P filelock         1.0.2      2018-10-05 [?] CRAN (R 4.0.0)                   
 P fitdistrplus     1.0-14     2019-01-23 [?] CRAN (R 4.0.0)                   
 P forcats        * 0.5.0      2020-03-01 [?] CRAN (R 4.0.0)                   
 P fs             * 1.4.1      2020-04-04 [?] CRAN (R 4.0.0)                   
 P future           1.17.0     2020-04-18 [?] CRAN (R 4.0.1)                   
 P future.apply     1.5.0      2020-04-17 [?] CRAN (R 4.0.0)                   
 P generics         0.0.2      2018-11-29 [?] standard (@0.0.2)                
 P ggplot2        * 3.3.0      2020-03-05 [?] CRAN (R 4.0.0)                   
   ggrepel          0.8.2      2020-03-08 [1] CRAN (R 4.0.0)                   
   ggridges         0.5.2      2020-01-12 [1] CRAN (R 4.0.0)                   
 P git2r            0.27.1     2020-05-03 [?] CRAN (R 4.0.0)                   
 P GlobalOptions    0.1.1      2019-09-30 [?] CRAN (R 4.0.0)                   
   globals          0.12.5     2019-12-07 [1] CRAN (R 4.0.0)                   
 P glue           * 1.4.0      2020-04-03 [?] CRAN (R 4.0.0)                   
   goftest          1.2-2      2019-12-02 [1] CRAN (R 4.0.2)                   
   gridExtra        2.3        2017-09-09 [1] CRAN (R 4.0.0)                   
 P gtable           0.3.0      2019-03-25 [?] standard (@0.3.0)                
 P haven            2.2.0      2019-11-08 [?] standard (@2.2.0)                
 P here           * 0.1        2017-05-28 [?] standard (@0.1)                  
 P highr            0.8        2019-03-20 [?] standard (@0.8)                  
 P hms              0.5.3      2020-01-08 [?] CRAN (R 4.0.0)                   
 P htmltools        0.5.0      2020-06-16 [?] CRAN (R 4.0.2)                   
   htmlwidgets      1.5.1      2019-10-08 [1] CRAN (R 4.0.0)                   
 P httpuv           1.5.2      2019-09-11 [?] standard (@1.5.2)                
 P httr             1.4.1      2019-08-05 [?] standard (@1.4.1)                
   ica              1.0-2      2018-05-24 [1] CRAN (R 4.0.0)                   
 P igraph           1.2.5      2020-03-19 [?] CRAN (R 4.0.0)                   
   irlba            2.3.3      2019-02-05 [1] CRAN (R 4.0.0)                   
 P jsonlite       * 1.6.1      2020-02-02 [?] CRAN (R 4.0.0)                   
 P KernSmooth       2.23-17    2020-04-26 [?] CRAN (R 4.0.0)                   
 P knitr          * 1.28       2020-02-06 [?] CRAN (R 4.0.0)                   
 P labeling         0.3        2014-08-23 [?] standard (@0.3)                  
 P later            1.0.0      2019-10-04 [?] standard (@1.0.0)                
 P lattice          0.20-41    2020-04-02 [?] CRAN (R 4.0.0)                   
 P lazyeval         0.2.2      2019-03-15 [?] standard (@0.2.2)                
   leiden           0.3.3      2020-02-04 [1] CRAN (R 4.0.0)                   
 P lifecycle        0.2.0      2020-03-06 [?] CRAN (R 4.0.0)                   
 P limma            3.44.1     2020-04-28 [?] Bioconductor                     
   listenv          0.8.0      2019-12-05 [1] CRAN (R 4.0.0)                   
   lmtest           0.9-37     2019-04-30 [1] CRAN (R 4.0.0)                   
   lsei             1.2-0.1    2020-05-06 [1] CRAN (R 4.0.0)                   
 P lubridate        1.7.8      2020-04-06 [?] CRAN (R 4.0.0)                   
 P magrittr         1.5        2014-11-22 [?] CRAN (R 4.0.0)                   
 P MASS             7.3-51.6   2020-04-26 [?] CRAN (R 4.0.0)                   
 P Matrix           1.2-18     2019-11-27 [?] standard (@1.2-18)               
   matrixStats      0.56.0     2020-03-13 [1] CRAN (R 4.0.2)                   
 P memoise          1.1.0      2017-04-21 [?] standard (@1.1.0)                
 P mgcv             1.8-31     2019-11-09 [?] standard (@1.8-31)               
 P mime             0.9        2020-02-04 [?] CRAN (R 4.0.0)                   
   miniUI           0.1.1.1    2018-05-18 [1] CRAN (R 4.0.2)                   
 P modelr           0.1.7      2020-04-30 [?] CRAN (R 4.0.0)                   
 P munsell          0.5.0      2018-06-12 [?] standard (@0.5.0)                
 P nlme             3.1-147    2020-04-13 [?] CRAN (R 4.0.0)                   
   npsurv           0.4-0.1    2020-05-06 [1] CRAN (R 4.0.0)                   
 P pander         * 0.6.3      2018-11-06 [?] CRAN (R 4.0.0)                   
 P patchwork        1.0.0      2019-12-01 [?] CRAN (R 4.0.0)                   
   pbapply          1.4-2      2019-08-31 [1] CRAN (R 4.0.0)                   
 P pillar           1.4.4      2020-05-05 [?] CRAN (R 4.0.0)                   
 P pkgconfig        2.0.3      2019-09-22 [?] CRAN (R 4.0.0)                   
   plotly           4.9.2.1    2020-04-04 [1] CRAN (R 4.0.0)                   
 P plyr             1.8.6      2020-03-03 [?] CRAN (R 4.0.0)                   
   png              0.1-7      2013-12-03 [1] CRAN (R 4.0.0)                   
 P polyclip         1.10-0     2019-03-14 [?] CRAN (R 4.0.0)                   
 P prettyunits      1.1.1      2020-01-24 [?] CRAN (R 4.0.0)                   
 P progress         1.2.2      2019-05-16 [?] CRAN (R 4.0.0)                   
 P promises         1.1.0      2019-10-04 [?] standard (@1.1.0)                
 P purrr          * 0.3.4      2020-04-17 [?] CRAN (R 4.0.0)                   
 P R6               2.4.1      2019-11-12 [?] CRAN (R 4.0.0)                   
   RANN             2.6.1      2019-01-08 [1] CRAN (R 4.0.0)                   
 P RColorBrewer     1.1-2      2014-12-07 [?] standard (@1.1-2)                
 P Rcpp             1.0.4.6    2020-04-09 [?] CRAN (R 4.0.0)                   
   RcppAnnoy        0.0.16     2020-03-08 [1] CRAN (R 4.0.0)                   
 P readr          * 1.3.1      2018-12-21 [?] standard (@1.3.1)                
 P readxl           1.3.1      2019-03-13 [?] standard (@1.3.1)                
 P renv             0.12.0     2020-08-28 [?] CRAN (R 4.0.2)                   
 P repr             1.1.0      2020-01-28 [?] CRAN (R 4.0.0)                   
 P reprex           0.3.0      2019-05-16 [?] standard (@0.3.0)                
 P reshape2         1.4.4      2020-04-09 [?] CRAN (R 4.0.0)                   
 P reticulate       1.16       2020-05-27 [?] CRAN (R 4.0.2)                   
 P rlang            0.4.6      2020-05-02 [?] CRAN (R 4.0.0)                   
 P rmarkdown        2.1        2020-01-20 [?] CRAN (R 4.0.0)                   
   ROCR             1.0-11     2020-05-02 [1] CRAN (R 4.0.0)                   
 P rpart            4.1-15     2019-04-12 [?] CRAN (R 4.0.0)                   
 P rprojroot        1.3-2      2018-01-03 [?] CRAN (R 4.0.0)                   
   RSpectra         0.16-0     2019-12-01 [1] CRAN (R 4.0.0)                   
 P rstudioapi       0.11       2020-02-07 [?] CRAN (R 4.0.0)                   
   rsvd             1.0.3      2020-02-17 [1] CRAN (R 4.0.0)                   
   Rtsne            0.15       2018-11-10 [1] CRAN (R 4.0.0)                   
 P rvest            0.3.5      2019-11-08 [?] standard (@0.3.5)                
 P scales           1.1.0      2019-11-18 [?] standard (@1.1.0)                
 P sctransform      0.3.1      2020-10-08 [?] CRAN (R 4.0.2)                   
 P sessioninfo      1.1.1      2018-11-05 [?] CRAN (R 4.0.0)                   
 P Seurat           3.2.2      2020-09-26 [?] CRAN (R 4.0.2)                   
 P shape            1.4.4      2018-02-07 [?] CRAN (R 4.0.0)                   
 P shiny            1.5.0      2020-06-23 [?] CRAN (R 4.0.2)                   
 P skimr          * 2.1.1      2020-04-16 [?] CRAN (R 4.0.0)                   
   spatstat         1.64-1     2020-05-12 [1] CRAN (R 4.0.2)                   
   spatstat.data    1.4-3      2020-01-26 [1] CRAN (R 4.0.2)                   
   spatstat.utils   1.17-0     2020-02-07 [1] CRAN (R 4.0.2)                   
 P storr            1.2.1      2018-10-18 [?] standard (@1.2.1)                
 P stringi          1.4.6      2020-02-17 [?] CRAN (R 4.0.0)                   
 P stringr        * 1.4.0      2019-02-10 [?] CRAN (R 4.0.0)                   
 P survival         3.2-7      2020-09-28 [?] CRAN (R 4.0.2)                   
   tensor           1.5        2012-05-05 [1] CRAN (R 4.0.2)                   
 P tibble         * 3.0.1      2020-04-20 [?] CRAN (R 4.0.0)                   
 P tidyr          * 1.0.3      2020-05-07 [?] CRAN (R 4.0.0)                   
 P tidyselect       1.0.0      2020-01-27 [?] CRAN (R 4.0.0)                   
 P tidyverse      * 1.3.0      2019-11-21 [?] standard (@1.3.0)                
 P txtq             0.2.0      2019-10-15 [?] standard (@0.2.0)                
   uwot             0.1.8      2020-03-16 [1] CRAN (R 4.0.0)                   
 P vctrs            0.2.4      2020-03-10 [?] CRAN (R 4.0.0)                   
 P viridisLite      0.3.0      2018-02-01 [?] standard (@0.3.0)                
 P whisker          0.4        2019-08-28 [?] standard (@0.4)                  
 P withr            2.2.0      2020-04-20 [?] CRAN (R 4.0.0)                   
 P workflowr        1.6.2      2020-04-30 [?] CRAN (R 4.0.0)                   
 P xfun             0.13       2020-04-13 [?] CRAN (R 4.0.0)                   
 P xml2             1.3.2      2020-04-23 [?] CRAN (R 4.0.0)                   
   xtable           1.8-4      2019-04-21 [1] CRAN (R 4.0.2)                   
 P yaml             2.2.1      2020-02-01 [?] CRAN (R 4.0.0)                   
   zoo              1.8-8      2020-05-02 [1] CRAN (R 4.0.0)                   

[1] /Users/luke.zappia/Documents/Projects/interaction-tools/renv/library/R-4.0/x86_64-apple-darwin17.0
[2] /private/var/folders/rj/60lhr791617422kqvh0r4vy40000gn/T/RtmpOqMPdA/renv-system-library
[3] /private/var/folders/rj/60lhr791617422kqvh0r4vy40000gn/T/RtmpGqapVJ/renv-system-library
[4] /private/var/folders/rj/60lhr791617422kqvh0r4vy40000gn/T/RtmpgtsH80/renv-system-library

 P ── Loaded and on-disk path mismatch.

Chunk time: 0.32 secs

LS0tCnRpdGxlOiAiY2VsbHRhbGtlciBleGFtcGxlIgpvdXRwdXQ6IHdvcmtmbG93cjo6d2Zsb3dfaHRtbAplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCmBgYHtyIHNldHVwLCBjYWNoZSA9IEZBTFNFfQojIFNldHVwIGRvY3VtZW50CnNvdXJjZShoZXJlOjpoZXJlKCJjb2RlIiwgInNldHVwLlIiKSkKCiMgRnVuY3Rpb24gZGVwZW5kZW5jaWVzCmludmlzaWJsZShkcmFrZTo6cmVhZGQoZG93bmxvYWRfbGluaykpCmBgYAoKSW50cm9kdWN0aW9uIHsudW5udW1iZXJlZH0KPT09PT09PT09PT09CgpJbiB0aGlzIGRvY3VtZW50IHdlIGFyZSBnb2luZyB0byBydW4gdGhyb3VnaCB0aGUgZXhhbXBsZSBhbmFseXNpcyBmb3IgdGhlICoqY2VsbHRhbGtlcioqIHBhY2thZ2UgYW5kIGhhdmUgYSBsb29rIGF0IHRoZSBvdXRwdXQgaXQgcHJvZHVjZXMuCk1vcmUgaW5mb3JtYXRpb24gYWJvdXQgKipjZWxsdGFsa2VyKiogY2FuIGJlIGZvdW5kIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hcmM4NS9jZWxsdGFsa2VyLgoKYGBge3IgbGlicmFyaWVzfQpsaWJyYXJ5KCJjZWxsdGFsa2VyIikKYGBgCgpJbnB1dAo9PT09PQoKRXhwcmVzc2lvbgotLS0tLS0tLS0tCgpUaGUgbWFpbiBpbnB1dCB0byAqKmNlbGx0YWxrZXIqKiBpcyBhbiBleHByZXNzaW9uIG1hdHJpeCBmb3IgYSBzZXQgb2Ygc2FtcGxlcyAoMyBQQk1DIHNhbXBsZXMgYW5kIDMgdG9uc2lsIHNhbXBsZXMpIGZyb20gR0VPIGFjY2Vzc2lvbiBHU0UxMzkzMjQuCldlIGNyZWF0ZSB0aGlzIGJ5IHJlYWRpbmcgaW4gdGhlIHJhdyAqKkNlbGwgUmFuZ2VyKiogb3V0cHV0IGZpbGVzIGFuZCBzdG9yaW5nIHRoZW0gYXMgYSBgU2V1cmF0YCBvYmplY3QuCgo+ICoqTm90ZToqKiBJdCBpcyBub3QgZW50aXJlbHkgY2xlYXIgZnJvbSB0aGUgKipjZWxsdGFsa2VyKiogdHV0b3JpYWwgZXhhY3RseSB3aGljaCBzYW1wbGVzIHRvIHVzZSBzbyB0aGVzZSByZXN1bHRzIG1heSBkaWZmZXIgZnJvbSB3aGF0IGlzIHNob3cgdGhlcmUuCgpgYGB7ciBpbnB1dC1leHByZXNzaW9ufQpkYXRhX3BhdGhzIDwtIGZzOjpkaXJfbHMoaGVyZSgiZGF0YSIsICJjZWxsdGFsa2VyIikpCm5hbWVzKGRhdGFfcGF0aHMpIDwtIGMoInBibWMxIiwgInBibWMyIiwgInBibWMzIiwgInRvbnNpbDEiLCAidG9uc2lsMiIsCiAgICAgICAgICAgICAgICAgICAgICAgInRvbnNpbDMiKQoKcmF3X2RhdGEgPC0gU2V1cmF0OjpSZWFkMTBYKGRhdGFfcGF0aHMpCm1ldGFkYXRhIDwtIGRhdGEuZnJhbWUoCiAgICBTYW1wbGUgPSBzdHJpbmdyOjpzdHJfcmVtb3ZlKGNvbG5hbWVzKHJhd19kYXRhKSwgIl9bQS1aLTAtOV0rIikKKQptZXRhZGF0YSRUaXNzdWUgPC0gc3RyaW5ncjo6c3RyX3JlbW92ZShtZXRhZGF0YSRTYW1wbGUsICJbMC05XSIpCnJvd25hbWVzKG1ldGFkYXRhKSA8LSBjb2xuYW1lcyhyYXdfZGF0YSkKCnNldXJhdCA8LSBTZXVyYXQ6OkNyZWF0ZVNldXJhdE9iamVjdChjb3VudHMgPSByYXdfZGF0YSwgbWV0YS5kYXRhID0gbWV0YWRhdGEpCgpzZXVyYXQKYGBgCgpMaWdhbmQtcmVjZXB0b3IgcGFpcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgoqKmNlbGx0YWxrZXIqKiBpbmNsdWRlcyBhIHNldCBvZiBsaWdhbmQtcmVjZXB0b3IgcGFpcnMuCgpgYGB7ciBpbnB1dC1sci1wYWlyc30Kc2tpbShyYW1pbG93c2tpX3BhaXJzKQpgYGAKCioqU2V1cmF0KiogYW5hbHlzaXMKPT09PT09PT09PT09PT09PT09PQoKV2UgZmlyc3QgbmVlZCB0byBwZXJmb3JtIGEgc3RhbmRhcmQgKipTZXVyYXQqKiBhbmFseXNpcyB0byBnZXQgY2x1c3RlcnMgYW5kIGNlbGwgdHlwZSBsYWJlbHMuCk1vc3Qgb2YgdGhlIGRldGFpbHMgYXJlIHNraXBwZWQgb3ZlciBoZXJlLgoKQ2x1c3RlcmluZwotLS0tLS0tLS0tCgpgYGB7ciBzZXVyYXQtY2x1c3Rlcn0Kc2V0LnNlZWQoMDIyMjE5ODkpCgpzZXVyYXQgPC0gU2V1cmF0OjpOb3JtYWxpemVEYXRhKHNldXJhdCkKc2V1cmF0IDwtIFNldXJhdDo6RmluZFZhcmlhYmxlRmVhdHVyZXMoc2V1cmF0KQpzZXVyYXQgPC0gU2V1cmF0OjpTY2FsZURhdGEoc2V1cmF0KQpzZXVyYXQgPC0gU2V1cmF0OjpSdW5QQ0Eoc2V1cmF0LCB2ZXJib3NlID0gRkFMU0UpCnNldXJhdCA8LSBTZXVyYXQ6OlJ1blVNQVAoc2V1cmF0LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcyA9IDE6MTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IEZBTFNFKQpzZXVyYXQgPC0gU2V1cmF0OjpGaW5kTmVpZ2hib3JzKHNldXJhdCwgcmVkdWN0aW9uID0gInBjYSIsIGRpbXMgPSAxOjE1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBGQUxTRSkKc2V1cmF0IDwtIFNldXJhdDo6RmluZENsdXN0ZXJzKHNldXJhdCwgcmVzb2x1dGlvbiA9IDAuNSwgdmVyYm9zZSA9IEZBTFNFKQoKcDEgPC0gU2V1cmF0OjpEaW1QbG90KHNldXJhdCwgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJTYW1wbGUiKQpwMiA8LSBTZXVyYXQ6OkRpbVBsb3Qoc2V1cmF0LCByZWR1Y3Rpb24gPSAidW1hcCIsIGdyb3VwLmJ5ID0gIlRpc3N1ZSIpCnAzIDwtIFNldXJhdDo6RGltUGxvdChzZXVyYXQsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSAiUk5BX3Nubl9yZXMuMC41IiwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gVFJVRSkgKwogICAgU2V1cmF0OjpOb0xlZ2VuZCgpCgpjb3dwbG90OjpwbG90X2dyaWQocDEsIHAyLCBwMykKYGBgCgpMYWJlbHMKLS0tLS0tCgpgYGB7ciBzZXVyYXQtbGFiZWxzfQpTZXVyYXQ6OkZlYXR1cmVQbG90KHNldXJhdCwgcmVkdWN0aW9uID0gInVtYXAiLAogICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gYygiQ0QzRCIsICJDRDhBIiwgIkNENCIsICJDRDE0IiwgIk1TNEExIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZDR1IzQSIsICJJTDNSQSIpKQoKIyBBZGQgbWV0YWRhdGEgZm9yIGNlbGwgdHlwZXMKY2VsbF90eXBlcyA8LSB2ZWN0b3IoImxvZ2ljYWwiLCBsZW5ndGggPSBuY29sKHNldXJhdCkpCm5hbWVzKGNlbGxfdHlwZXMpIDwtIGNvbG5hbWVzKHNldXJhdCkKCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gICIwIl0gPC0gIkNENCBUIGNvbnYiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gICIxIl0gPC0gIkNENCBUIGNvbnYiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gICIyIl0gPC0gIkIgY2VsbHMiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gICIzIl0gPC0gIkIgY2VsbHMiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gICI0Il0gPC0gIkNEMTQgbW9ub2N5dGVzIgpjZWxsX3R5cGVzW3NldXJhdEBtZXRhLmRhdGEkUk5BX3Nubl9yZXMuMC41ID09ICAiNSJdIDwtICJDRDgiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gICI2Il0gPC0gIkNENCBUIGNvbnYiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gICI3Il0gPC0gIkNENCBUIGNvbnYiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gICI4Il0gPC0gIkIgY2VsbHMiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gICI5Il0gPC0gIkIgY2VsbHMiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gIjEwIl0gPC0gIk5LIGNlbGxzIgpjZWxsX3R5cGVzW3NldXJhdEBtZXRhLmRhdGEkUk5BX3Nubl9yZXMuMC41ID09ICIxMSJdIDwtICJDRDgiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gIjEyIl0gPC0gIlBsYXNtYSIKY2VsbF90eXBlc1tzZXVyYXRAbWV0YS5kYXRhJFJOQV9zbm5fcmVzLjAuNSA9PSAiMTMiXSA8LSAiQ0QxNCBtb25vY3l0ZXMiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gIjE0Il0gPC0gIkNEMTYgbW9ub2N5dGVzIgpjZWxsX3R5cGVzW3NldXJhdEBtZXRhLmRhdGEkUk5BX3Nubl9yZXMuMC41ID09ICIxNSJdIDwtICJQREMiCmNlbGxfdHlwZXNbc2V1cmF0QG1ldGEuZGF0YSRSTkFfc25uX3Jlcy4wLjUgPT0gIjE2Il0gPC0gIlJCQ3MiCgpzZXVyYXRbWyJDZWxsVHlwZSJdXSA8LSBjZWxsX3R5cGVzCgojIFJlbW92ZSByZWQgYmxvb2QgY2VsbHMKcmJjX2NlbGxzIDwtIG5hbWVzKGNlbGxfdHlwZXMpW3NldXJhdEBtZXRhLmRhdGEkUk5BX3Nubl9yZXMuMC41ID09ICIxNiJdCnNldXJhdCA8LSBzZXVyYXQgWywgIWNvbG5hbWVzKHNldXJhdCkgJWluJSByYmNfY2VsbHNdCmBgYAoKU2VsZWN0IHBhaXJzCj09PT09PT09PT09PQoKQmVmb3JlIHNjb3JpbmcgaW50ZXJhY3Rpb24gd2UgZmlyc3Qgc2VsZWN0IGEgc2V0IG9mIGxpZ2FuZC1yZWNlcHRvciBwYWlycyB0byBsb29rIGF0LgpGaXJzdCB3ZSBjaGVjayB3aGljaCBnZW5lcyBhcmUgcHJlc2VudCBpbiB0aGUgZGF0YXNldCBhbmQgdGhlbiB3ZSBzZWxlY3QgdGhvc2Ugd2VyZSB0aGUgbGlnYW5kIG9yIHJlY2VwdG9yIGlzIGFuIHVwLXJlZ3VsYXRlZCBtYXJrZXIgZ2VuZSBmb3Igb25lIG9mIHRoZSB0aXNzdWUgdHlwZXMuCgpgYGB7ciBzZWxlY3R9CmxpZ2FuZHMgICA8LSBhcy5jaGFyYWN0ZXIodW5pcXVlKHJhbWlsb3dza2lfcGFpcnMkbGlnYW5kKSkKcmVjZXB0b3JzIDwtIGFzLmNoYXJhY3Rlcih1bmlxdWUocmFtaWxvd3NraV9wYWlycyRyZWNlcHRvcikpCgpsaWdhbmRzX3ByZXNlbnQgICA8LSByb3duYW1lcyhzZXVyYXQpW3Jvd25hbWVzKHNldXJhdCkgJWluJSBsaWdhbmRzXQpyZWNlcHRvcnNfcHJlc2VudCA8LSByb3duYW1lcyhzZXVyYXQpW3Jvd25hbWVzKHNldXJhdCkgJWluJSByZWNlcHRvcnNdCmxyX3ByZXNlbnQgPC0gdW5pb24obGlnYW5kc19wcmVzZW50LCByZWNlcHRvcnNfcHJlc2VudCkKClNldXJhdDo6SWRlbnRzKHNldXJhdCkgPC0gIlRpc3N1ZSIKbWFya2VycyA8LSBTZXVyYXQ6OkZpbmRBbGxNYXJrZXJzKHNldXJhdCwgYXNzYXk9IlJOQSIsIGZlYXR1cmVzID0gbHJfcHJlc2VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkucG9zID0gVFJVRSwgdmVyYm9zZSA9IEZBTFNFKQoKbHJfc2VsIDwtIHVuaXF1ZShtYXJrZXJzJGdlbmUpCgppbnRlcmFjdGlvbnNfc2VsIDwtIHJiaW5kKAogICAgcmFtaWxvd3NraV9wYWlyc1tyYW1pbG93c2tpX3BhaXJzJGxpZ2FuZCAgICVpbiUgbHJfc2VsLCBdLAogICAgcmFtaWxvd3NraV9wYWlyc1tyYW1pbG93c2tpX3BhaXJzJHJlY2VwdG9yICVpbiUgbHJfc2VsLCBdCikKYGBgCgpUaGlzIHByb2Nlc3Mgc2VsZWN0cyAqKmByIGxlbmd0aChscl9zZWwpYCoqIGxpZ2FuZHMgYW5kIHJlY2VwdG9ycyBhbmQgKipgciBucm93KGludGVyYWN0aW9uc19zZWwpYCoqIGludGVyYWN0aW9uIHBhaXJzLgoKUmVhcnJhbmdlIGRhdGEKPT09PT09PT09PT09PT0KCioqY2VsbHRhbGtlcioqIHJlcXVpcmVzIHRoZSBpbnB1dCBkYXRhIGluIGEgc3BlY2lmaWMgc3RydWN0dXJlLgpIZWxwZnVsbHkgaXQgcHJvdmlkZXMgc29tZSB1c2VmdWwgZnVuY3Rpb25zIHRvIG1ha2UgdGhpcyBlYXNpZXIuCgpFeHByZXNzaW9uIG1hdHJpY2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSBmaXJzdCBkYXRhIHN0cnVjdHVyZSBpcyBhIG5lc3RlZCBkYXRhIGZyYW1lIHdpdGggZXhwcmVzc2lvbiBtYXRyaWNlcyBmb3IgdGhlIHNlbGVjdGVkIGxpZ2FuZHMgYW5kIHJlY2VwdG9ycyBmb3IgZWFjaCBncm91cCwgc2FtcGxlLCBhbmQgY2x1c3Rlci4KCmBgYHtyIHJlYXJyYW5nZS1leHByZXNzaW9ufQpleHByX21hdCA8LSBTZXVyYXQ6OkdldEFzc2F5RGF0YShzZXVyYXQsIHNsb3QgPSAiY291bnRzIikKY2x1c3RlcnMgPC0gc2V1cmF0QG1ldGEuZGF0YSRDZWxsVHlwZQp0aXNzdWVzICA8LSBzZXVyYXRAbWV0YS5kYXRhJFRpc3N1ZQpzYW1wbGVzICA8LSBzZXVyYXRAbWV0YS5kYXRhJFNhbXBsZQoKbHJfbWF0cmljZXMgPC0gcmVzaGFwZV9tYXRyaWNlcygKICAgIGNvdW50Lm1hdHJpeCAgICAgICAgICA9IGV4cHJfbWF0LAogICAgY2x1c3RlcnMgICAgICAgICAgICAgID0gY2x1c3RlcnMsCiAgICBncm91cHMgICAgICAgICAgICAgICAgPSB0aXNzdWVzLAogICAgcmVwbGljYXRlcyAgICAgICAgICAgID0gc2FtcGxlcywKICAgIGxpZ2FuZHMuYW5kLnJlY2VwdG9ycyA9IGludGVyYWN0aW9uc19zZWwKKQoKIyBUaGVyZSBpcyBhIGJpZyB3aGVyZSB0aGUgbmV4dCBzdGVwIGZhaWxzIGlmIHRoZXJlIGFyZSBzb21lIGNsdXN0ZXJzIHRoYXQKIyBhcmVuJ3QgcHJlc2VudCBpbiBhbGwgZ3JvdXBzLiBBZGQgZHVtbXkgdmFsdWVzIHRvIGF2b2lkIHRoaXMuCmR1bW15IDwtIHB1bGwodW5uZXN0KGxyX21hdHJpY2VzLCBjb2xzID0gInNhbXBsZXMiKSlbWzFdXVtbMV1dWzAsIF0KbHJfbWF0cmljZXMkc2FtcGxlc1tbMl1dJGV4cHIubWF0cmljZXMgPC0gbWFwKAogICAgbHJfbWF0cmljZXMkc2FtcGxlc1tbMl1dJGV4cHIubWF0cmljZXMsIGZ1bmN0aW9uKC5leHBfbWF0cykgewogICAgICAgIG1pc3NpbmcgPC0gdW5pcXVlKGNsdXN0ZXJzWyEoY2x1c3RlcnMgJWluJSBuYW1lcyguZXhwX21hdHMpKV0pCiAgICAgICAgZm9yIChjbHVzdGVyIGluIG1pc3NpbmcpIHsKICAgICAgICAgICAgLmV4cF9tYXRzW1tjbHVzdGVyXV0gPC0gZHVtbXkKICAgICAgICB9CiAgICAgICAgLmV4cF9tYXRzCiAgICB9CikKCnNraW0obHJfbWF0cmljZXMpCnNraW0odW5uZXN0KGxyX21hdHJpY2VzLCBjb2xzID0gInNhbXBsZXMiKSkKYGBgCgpFeHByZXNzZWQgbGlnYW5kcyBhbmQgcmVjZXB0b3JzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZyb20gdGhlIG5lc3RlZCBleHByZXNzaW9uIG1hdHJpY2VzIHdlIHRoZW4gY3JlYXRlIGEgc2ltaWxhciBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgdGhlIGxpZ2FuZHMgYW5kIHJlY2VwdG9ycyB0aGF0IGFyZSBleHByZXNzZWQgaW4gZWFjaCBncm91cC9jbHVzdGVyIGNvbWJpbmF0aW9uLgoKYGBge3IgcmVhcnJhbmdlLWxyfQpscl9leHByZXNzZWQgPC0gY3JlYXRlX2xpZ19yZWNfdGliKAogICAgZXhwLnRpYiAgICAgICAgICAgICAgID0gbHJfbWF0cmljZXMsCiAgICBjbHVzdGVycyAgICAgICAgICAgICAgPSBjbHVzdGVycywKICAgIGdyb3VwcyAgICAgICAgICAgICAgICA9IHRpc3N1ZXMsCiAgICByZXBsaWNhdGVzICAgICAgICAgICAgPSBzYW1wbGVzLAogICAgY2VsbHMucmVxZCAgICAgICAgICAgID0gMTAsCiAgICBmcmVxLnBvcy5yZXFkICAgICAgICAgPSAwLjUsCiAgICBsaWdhbmRzLmFuZC5yZWNlcHRvcnMgPSBpbnRlcmFjdGlvbnNfc2VsCikKCnNraW0obHJfZXhwcmVzc2VkKQpza2ltKHVubmVzdChscl9leHByZXNzZWRbMSwgMl0sIGNvbHMgPSAibGlnLnJlYy5leHAiKSkKYGBgCgpJbnRlcmFjdGlvbnMKPT09PT09PT09PT09CgpQdXRhdGl2ZSBpbnRlcmFjdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpXaXRoIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgd2UgY2FuIG5vdyBsb29rIGZvciBwdXRhdGl2ZSBpbnRlcmFjdGlvbnMuCgpgYGB7ciBpbnRlcmFjdGlvbnMtcHV0YXRpdmV9CnB1dGF0aXZlX2ludGVyYWN0aW9ucyA8LSBwdXRhdGl2ZV9pbnRlcmFjdGlvbnMoCiAgICBsaWdhbmQucmVjZXB0b3IudGliYmxlID0gbHJfZXhwcmVzc2VkLAogICAgY2x1c3RlcnMgICAgICAgICAgICAgICA9IGNsdXN0ZXJzLAogICAgZ3JvdXBzICAgICAgICAgICAgICAgICA9IHRpc3N1ZXMsCiAgICBmcmVxLmdyb3VwLmluLmNsdXN0ZXIgID0gMC4wNSwKICAgIGxpZ2FuZHMuYW5kLnJlY2VwdG9ycyAgPSBpbnRlcmFjdGlvbnNfc2VsCikKCnNraW0ocHV0YXRpdmVfaW50ZXJhY3Rpb25zKQpgYGAKClRoZSBuZXN0ZWQgZGF0YSBmcmFtZSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGNvbnRhaW5zIGxpc3RzIG9mIHRoZSBhY3RpdmUgbGlnYW5kcyBhbmQgcmVjZXB0b3JzIGZvciBlYWNoIGNlbGwgdHlwZSBpbiBlYWNoIGdyb3VwLgoKVW5pcXVlIGludGVyYWN0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgbmV4dCBzdGVwIGlkZW50aWZpZXMgaW50ZXJhY3Rpb25zIHRoYXQgYXJlIHVuaXF1ZSB0byBlYWNoIGdyb3VwLgoKYGBge3IgaW50ZXJhY3Rpb25zLXVuaXF1ZX0KdW5pcXVlX2ludGVyYWN0aW9ucyA8LSB1bmlxdWVfaW50ZXJhY3Rpb25zKAogICAgcHV0YXRpdmVfaW50ZXJhY3Rpb25zLAogICAgZ3JvdXAxID0gInBibWMiLAogICAgZ3JvdXAyID0gInRvbnNpbCIsCiAgICBpbnRlcmFjdGlvbnNfc2VsCikKCnNraW0odW5pcXVlX2ludGVyYWN0aW9ucykKYGBgCgpUaGlzIGdpdmVzIHVzZSB0aGUgbGlnYW5kcyBhbmQgcmVjZXB0b3JzIHRoYXQgYXJlIHVuaXF1ZSB0byBlYWNoIGdyb3VwIGFzIHdlbGwgYXMgdGhvc2UgdGhleSBoYXZlIGluIGNvbW1vbi4KClZpc3VhbGlzYXRpb24KPT09PT09PT09PT09PQoKQ2lyY29zIHBsb3QKLS0tLS0tLS0tLS0KCiMjIyBQQk1DCgpgYGB7ciB2aXMtY2lyY29zLXBibWN9CnBibWNfbHIgICAgICAgICAgIDwtIHB1bGwodW5pcXVlX2ludGVyYWN0aW9uc1sxLCAyXSlbWzFdXQpwYm1jX2ludGVyYWN0aW9ucyA8LSBwdWxsKHB1dGF0aXZlX2ludGVyYWN0aW9uc1sxLCAyXSlbWzFdXVtwYm1jX2xyXQoKY2lyY29zX3Bsb3QoaW50ZXJhY3Rpb25zID0gcGJtY19pbnRlcmFjdGlvbnMsIGNsdXN0ZXJzID0gY2x1c3RlcnMpCmBgYAoKIyMjIFRvbnNpbAoKYGBge3IgdmlzLWNpcmNvcy10b25zaWx9CnRvbnNpbF9sciAgICAgICAgICAgPC0gcHVsbCh1bmlxdWVfaW50ZXJhY3Rpb25zWzIsIDJdKVtbMV1dCnRvbnNpbF9pbnRlcmFjdGlvbnMgPC0gcHVsbChwdXRhdGl2ZV9pbnRlcmFjdGlvbnNbMiwgMl0pW1sxXV1bdG9uc2lsX2xyXQoKY2lyY29zX3Bsb3QoaW50ZXJhY3Rpb25zID0gdG9uc2lsX2ludGVyYWN0aW9ucywgY2x1c3RlcnMgPSBjbHVzdGVycykKYGBgCgpTdW1tYXJ5IHsudW5udW1iZXJlZH0KPT09PT09PQoKUGFyYW1ldGVycyB7LnVubnVtYmVyZWR9Ci0tLS0tLS0tLS0KClRoaXMgdGFibGUgZGVzY3JpYmVzIHBhcmFtZXRlcnMgdXNlZCBhbmQgc2V0IGluIHRoaXMgZG9jdW1lbnQuCgpgYGB7ciBwYXJhbWV0ZXJzfQpwYXJhbXMgPC0gbGlzdCgKICAgIAopCnBhcmFtcyA8LSB0b0pTT04ocGFyYW1zLCBwcmV0dHkgPSBUUlVFKQprYWJsZShmcm9tSlNPTihwYXJhbXMpKQpgYGAKCk91dHB1dCBmaWxlcyB7LnVubnVtYmVyZWR9Ci0tLS0tLS0tLS0tLQoKVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG91dHB1dCBmaWxlcyBwcm9kdWNlZCBieSB0aGlzIGRvY3VtZW50LiBSaWdodCBjbGljawphbmQgX1NhdmUgTGluayBBcy4uLl8gdG8gZG93bmxvYWQgdGhlIHJlc3VsdHMuCgpgYGB7ciBvdXRwdXR9CmthYmxlKGRhdGEuZnJhbWUoCiAgICBGaWxlID0gYygKICAgICAgICBkb3dubG9hZF9saW5rKCJwYXJhbWV0ZXJzLmpzb24iLCBPVVRfRElSKQogICAgKSwKICAgIERlc2NyaXB0aW9uID0gYygKICAgICAgICAiUGFyYW1ldGVycyBzZXQgYW5kIHVzZWQgaW4gdGhpcyBhbmFseXNpcyIKICAgICkKKSkKYGBgCgpTZXNzaW9uIGluZm9ybWF0aW9uIHsudW5udW1iZXJlZH0KLS0tLS0tLS0tLS0tLS0tLS0tLQo=