Load libraries

library(Seurat)
library(Matrix)
library(dplyr)
library(RColorBrewer)
library(ggplot2)
library(ggExtra)
library(cowplot)
library(reticulate)
library(wesanderson)
use_python("/usr/bin/python3")

#Set ggplot theme as classic
theme_set(theme_classic())

Load the raw counts matrix

Countdata <- Read10X("outs/filtered_feature_bc_matrix/")

Raw.data <- CreateSeuratObject(counts = Countdata,
                              project = "Pidd1_KO",
                              min.cells = 3,
                              min.features = 800)

Raw.data$Barcodes <- rownames(Raw.data@meta.data)

rm(Countdata)

dim(Raw.data)
## [1] 21491 14705
Raw.data$percent.mito <- PercentageFeatureSet(Raw.data, pattern = "^mt-")
Raw.data$percent.ribo <- PercentageFeatureSet(Raw.data, pattern = "(^Rpl|^Rps|^Mrp)")
VlnPlot(object = Raw.data, features = c("nFeature_RNA","nCount_RNA", "percent.mito", "percent.ribo"), ncol= 2) & NoAxes()

# Inspect cell based on relation between nUMI and nGene detected

# Relation between nUMI and nGene detected
Cell.QC.Stat <- Raw.data@meta.data

p1 <- ggplot(Cell.QC.Stat, aes(x=nCount_RNA, y=nFeature_RNA)) + geom_point() + geom_smooth(method="lm")
p1 <- ggMarginal(p1, type = "histogram", fill="lightgrey")

p2 <- ggplot(Cell.QC.Stat, aes(x=log10(nCount_RNA), y=log10(nFeature_RNA))) + geom_point() + geom_smooth(method="lm")
p2 <- ggMarginal(p2, type = "histogram", fill="lightgrey")

plot_grid(plotlist = list(p1,p2), ncol=2, align='h', rel_widths = c(1, 1)) ; rm(p1,p2)

Raw.data <- AddModuleScore(Raw.data,
                           features = list(c("Hbb-bt", "Hbq1a", "Isg20", "Fech", "Snca", "Rec114")),
                           ctrl = 10,
                           name = "Erythrocyte.signature")

Cell.QC.Stat$Erythrocyte.signature <- Raw.data$Erythrocyte.signature1
gradient <- colorRampPalette(brewer.pal(n =11, name = "Spectral"))(100)

p1 <- ggplot(Cell.QC.Stat, aes(log10(nCount_RNA), y=log10(nFeature_RNA))) +
      geom_point(aes(color= Erythrocyte.signature))  + 
      scale_color_gradientn(colours=rev(gradient), name='Erythrocyte score') + theme(legend.position="none")

p2 <- ggplot(Cell.QC.Stat, aes(log10(nCount_RNA), y=log10(nFeature_RNA))) +
      geom_point(aes(color= percent.mito))  + 
      scale_color_gradientn(colours=rev(gradient), name='Percent mito') + theme(legend.position="none")

p3 <- ggplot(Cell.QC.Stat, aes(log10(nCount_RNA), y=log10(nFeature_RNA))) +
      geom_point(aes(color= percent.ribo))  + 
      scale_color_gradientn(colours=rev(gradient), name='Percent ribo') + theme(legend.position="none")

p1 + p2 + p3

Exclude Erythrocytes

Cell.QC.Stat$Erythrocyte <- ifelse(Cell.QC.Stat$Erythrocyte.signature > 0.1, "Erythrocyte", "Not_Erythrocyte")
p2 <- ggplot(Cell.QC.Stat, aes(x=log10(nCount_RNA), y=log10(nFeature_RNA))) +
  geom_point(aes(colour = Erythrocyte)) +
  theme(legend.position="none")

ggMarginal(p2, type = "histogram", fill="lightgrey")

# Filter cells based on these thresholds
Cell.QC.Stat <- Cell.QC.Stat %>% filter(Cell.QC.Stat$Erythrocyte.signature < 0.1)

Low quality cell filtering

Filtering cells based on percentage of mitochondrial transcripts

We applied a high and low median absolute deviation (mad) thresholds to exclude outlier cells

max.mito.thr <- median(Cell.QC.Stat$percent.mito) + 4*mad(Cell.QC.Stat$percent.mito)
min.mito.thr <- median(Cell.QC.Stat$percent.mito) - 4*mad(Cell.QC.Stat$percent.mito)
p1 <- ggplot(Cell.QC.Stat, aes(x=nFeature_RNA, y=percent.mito)) +
  geom_point() +
  geom_hline(aes(yintercept = max.mito.thr), colour = "red", linetype = 2) +
  geom_hline(aes(yintercept = min.mito.thr), colour = "red", linetype = 2) +
  annotate(geom = "text", label = paste0(as.numeric(table(Cell.QC.Stat$percent.mito > max.mito.thr | Cell.QC.Stat$percent.mito < min.mito.thr)[2])," cells removed\n",
                                         as.numeric(table(Cell.QC.Stat$percent.mito > max.mito.thr | Cell.QC.Stat$percent.mito < min.mito.thr)[1])," cells remain"),
           x = 6000, y = 20)

ggMarginal(p1, type = "histogram", fill="lightgrey", bins=100) 

# Filter cells based on these thresholds
Cell.QC.Stat <- Cell.QC.Stat %>% filter(percent.mito < max.mito.thr) %>% filter(percent.mito > min.mito.thr)

Filtering cells based on number of genes and transcripts detected

Remove cells with to few gene detected or with to many UMI counts

We filter cells which are likely to be doublet based on their higher content of transcript detected as well as cell with to few genes/UMI sequenced

# Set low and hight thresholds on the number of detected genes based on the one obtain with the WT dataset
min.Genes.thr <- log10(2000)
max.Genes.thr <- log10(median(Cell.QC.Stat$nFeature_RNA) + 3*mad(Cell.QC.Stat$nFeature_RNA))

# Set hight threshold on the number of transcripts
max.nUMI.thr <- log10(median(Cell.QC.Stat$nCount_RNA) + 3*mad(Cell.QC.Stat$nCount_RNA))
# Gene/UMI scatter plot before filtering
p1 <- ggplot(Cell.QC.Stat, aes(x=log10(nCount_RNA), y=log10(nFeature_RNA))) +
  geom_point() +
  geom_smooth(method="lm") +
  geom_hline(aes(yintercept = min.Genes.thr), colour = "green", linetype = 2) +
  geom_hline(aes(yintercept = max.Genes.thr), colour = "green", linetype = 2) +
  geom_vline(aes(xintercept = max.nUMI.thr), colour = "red", linetype = 2)

ggMarginal(p1, type = "histogram", fill="lightgrey")

# Filter cells base on both metrics
Cell.QC.Stat <- Cell.QC.Stat %>% filter(log10(nFeature_RNA) > min.Genes.thr) %>% filter(log10(nCount_RNA) < max.nUMI.thr)

Filter cells below the main population nUMI/nGene relationship

lm.model <- lm(data = Cell.QC.Stat, formula = log10(nFeature_RNA) ~ log10(nCount_RNA))

p2 <- ggplot(Cell.QC.Stat, aes(x=log10(nCount_RNA), y=log10(nFeature_RNA))) +
  geom_point() +
  geom_smooth(method="lm") +
  geom_hline(aes(yintercept = min.Genes.thr), colour = "green", linetype = 2) +
  geom_hline(aes(yintercept = max.Genes.thr), colour = "green", linetype = 2) +
  geom_vline(aes(xintercept = max.nUMI.thr), colour = "red", linetype = 2) +
  annotate(geom = "text", label = paste0(dim(Cell.QC.Stat)[1], " QC passed cells"), x = 4, y = 3.8)

ggMarginal(p2, type = "histogram", fill="lightgrey")

Filter the Seurat object

Raw.data <- subset(x = Raw.data, subset = Barcodes %in%  Cell.QC.Stat$Barcodes)
# Plot final QC metrics
VlnPlot(object = Raw.data, features = c("nFeature_RNA","nCount_RNA", "percent.mito", "percent.ribo"), ncol= 2) & NoAxes()

p1 <- ggplot(Raw.data@meta.data, aes(x=log10(nCount_RNA), y=log10(nFeature_RNA))) + geom_point() + geom_smooth(method="lm")
ggMarginal(p1, type = "histogram", fill="lightgrey")

rm(list = ls()[!ls() %in% "Raw.data"])

Use Scrublet to detect obvious doublets

Run Scrublet with default parameter

Export raw count matrix as input to Scrublet

#Export filtered matrix
dir.create("Scrublet_inputs")

exprData <- Matrix(as.matrix(Raw.data@assays[["RNA"]]@counts), sparse = TRUE)
writeMM(exprData, "Scrublet_inputs/matrix1.mtx")
## NULL
import scrublet as scr
import scipy.io
import numpy as np
import os

#Load raw counts matrix and gene list
input_dir = 'Scrublet_inputs'
counts_matrix = scipy.io.mmread(input_dir + '/matrix1.mtx').T.tocsc()

#Initialize Scrublet
scrub = scr.Scrublet(counts_matrix, expected_doublet_rate=0.1, sim_doublet_ratio=2, n_neighbors = 8)

#Run the default pipeline
doublet_scores, predicted_doublets = scrub.scrub_doublets(min_counts=1, min_cells=3, min_gene_variability_pctl=85, n_prin_comps=25)
## Preprocessing...
## Simulating doublets...
## Embedding transcriptomes using PCA...
## Calculating doublet scores...
## Automatically set threshold at doublet score = 0.34
## Detected doublet rate = 4.4%
## Estimated detectable doublet fraction = 35.8%
## Overall doublet rate:
##  Expected   = 10.0%
##  Estimated  = 12.3%
## Elapsed time: 22.8 seconds
# Import scrublet's doublet score
Raw.data$Doubletscore <- py$doublet_scores

# Plot doublet score
ggplot(Raw.data@meta.data, aes(x = Doubletscore, stat(ndensity))) +
  geom_histogram(bins = 200, colour ="lightgrey")+
  geom_vline(xintercept = 0.2, colour = "red", linetype = 2)

# Manually set threshold at doublet score to 0.2
Raw.data$Predicted_doublets <- ifelse(py$doublet_scores > 0.2, "Doublet","Singlet")
table(Raw.data$Predicted_doublets)
## 
## Doublet Singlet 
##    1103   10177
Raw.data <- subset(x = Raw.data, subset = Predicted_doublets == "Singlet")

Generate SRING dimentionality reduction

Export counts matrix

dir.create("./SpringCoordinates")
# Export raw expression matrix and gene list to regenerate a spring plot
exprData <- Matrix(as.matrix(Raw.data@assays[["RNA"]]@counts), sparse = TRUE)
writeMM(exprData, "./SpringCoordinates/ExprData.mtx")
## NULL
Genelist <- row.names(Raw.data@assays[["RNA"]]@counts)
write.table(Genelist, "./SpringCoordinates/Genelist.csv", sep="\t", col.names = F, row.names = F, quote = F)
#Export metadata
Scrublet <- c("Scrublet", Raw.data$Predicted_doublets)
Scrublet <- paste(Scrublet, sep=",", collapse=",")

Cellgrouping <- Scrublet
write.table(Cellgrouping, "./SpringCoordinates/Cellgrouping.csv", quote =F, row.names = F, col.names = F)

Import coordinates

spring.coor <- read.table("SpringCoordinates/coordinates.txt", sep = ",", header = F, row.names = 1)
colnames(spring.coor) <- c("Spring_1", "Spring_2")
Spring.Sym <- function(x){
  x = abs(max(spring.coor$Spring_2)-x)
 }

spring.coor$Spring_2 <- sapply(spring.coor$Spring_2, function(x) Spring.Sym(x))
Raw.data$Spring_1 <- spring.coor$Spring_1
Raw.data$Spring_2 <- spring.coor$Spring_2
spring <- as.matrix(Raw.data@meta.data %>% select("Spring_1", "Spring_2"))
  
Raw.data[["spring"]] <- CreateDimReducObject(embeddings = spring, key = "Spring_", assay = DefaultAssay(Raw.data))
DimPlot(Raw.data, 
        reduction = "spring",
        pt.size = 0.5) & NoAxes()

# Broad clustering

Sctransform normalization

s.genes <- c("Mcm5", "Pcna", "Tym5", "Fen1", "Mcm2", "Mcm4", "Rrm1", "Ung", "Gins2", "Mcm6", "Cdca7", "Dtl", "Prim1", "Uhrf1", "Mlf1ip", "Hells", "Rfc2", "Rap2", "Nasp", "Rad51ap1", "Gmnn", "Wdr76", "Slbp", "Ccne2", "Ubr7", "Pold3", "Msh2", "Atad2", "Rad51", "Rrm2", "Cdc45", "Cdc6", "Exo1", "Tipin", "Dscc1", "Blm", " Casp8ap2", "Usp1", "Clspn", "Pola1", "Chaf1b", "Brip1", "E2f8")
g2m.genes <- c("Hmgb2", "Ddk1","Nusap1", "Ube2c", "Birc5", "Tpx2", "Top2a", "Ndc80", "Cks2", "Nuf2", "Cks1b", "Mki67", "Tmpo", " Cenpk", "Tacc3", "Fam64a", "Smc4", "Ccnb2", "Ckap2l", "Ckap2", "Aurkb", "Bub1", "Kif11", "Anp32e", "Tubb4b", "Gtse1", "kif20b", "Hjurp", "Cdca3", "Hn1", "Cdc20", "Ttk", "Cdc25c", "kif2c", "Rangap1", "Ncapd2", "Dlgap5", "Cdca2", "Cdca8", "Ect2", "Kif23", "Hmmr", "Aurka", "Psrc1", "Anln", "Lbr", "Ckap5", "Cenpe", "Ctcf", "Nek2", "G2e3", "Gas2l3", "Cbx5", "Cenpa")

Raw.data <- CellCycleScoring(Raw.data, s.features = s.genes, g2m.features = g2m.genes, set.ident = TRUE)
Raw.data$CC.Difference <- Raw.data$S.Score - Raw.data$G2M.Score
Raw.data <- SCTransform(Raw.data,
                        method = "glmGamPoi",
                        vars.to.regress = c("percent.mito", "CC.Difference", "nCount_RNA"),
                        verbose = T)
## 
  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |==================                                                    |  25%
  |                                                                            
  |===================================                                   |  50%
  |                                                                            
  |====================================================                  |  75%
  |                                                                            
  |======================================================================| 100%
## 
  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |==                                                                    |   2%
  |                                                                            
  |====                                                                  |   5%
  |                                                                            
  |=====                                                                 |   8%
  |                                                                            
  |=======                                                               |  10%
  |                                                                            
  |=========                                                             |  12%
  |                                                                            
  |==========                                                            |  15%
  |                                                                            
  |============                                                          |  18%
  |                                                                            
  |==============                                                        |  20%
  |                                                                            
  |================                                                      |  22%
  |                                                                            
  |==================                                                    |  25%
  |                                                                            
  |===================                                                   |  28%
  |                                                                            
  |=====================                                                 |  30%
  |                                                                            
  |=======================                                               |  32%
  |                                                                            
  |========================                                              |  35%
  |                                                                            
  |==========================                                            |  38%
  |                                                                            
  |============================                                          |  40%
  |                                                                            
  |==============================                                        |  42%
  |                                                                            
  |================================                                      |  45%
  |                                                                            
  |=================================                                     |  48%
  |                                                                            
  |===================================                                   |  50%
  |                                                                            
  |=====================================                                 |  52%
  |                                                                            
  |======================================                                |  55%
  |                                                                            
  |========================================                              |  58%
  |                                                                            
  |==========================================                            |  60%
  |                                                                            
  |============================================                          |  62%
  |                                                                            
  |==============================================                        |  65%
  |                                                                            
  |===============================================                       |  68%
  |                                                                            
  |=================================================                     |  70%
  |                                                                            
  |===================================================                   |  72%
  |                                                                            
  |====================================================                  |  75%
  |                                                                            
  |======================================================                |  78%
  |                                                                            
  |========================================================              |  80%
  |                                                                            
  |==========================================================            |  82%
  |                                                                            
  |============================================================          |  85%
  |                                                                            
  |=============================================================         |  88%
  |                                                                            
  |===============================================================       |  90%
  |                                                                            
  |=================================================================     |  92%
  |                                                                            
  |==================================================================    |  95%
  |                                                                            
  |====================================================================  |  98%
  |                                                                            
  |======================================================================| 100%
## 
  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |==                                                                    |   2%
  |                                                                            
  |====                                                                  |   5%
  |                                                                            
  |=====                                                                 |   8%
  |                                                                            
  |=======                                                               |  10%
  |                                                                            
  |=========                                                             |  12%
  |                                                                            
  |==========                                                            |  15%
  |                                                                            
  |============                                                          |  18%
  |                                                                            
  |==============                                                        |  20%
  |                                                                            
  |================                                                      |  22%
  |                                                                            
  |==================                                                    |  25%
  |                                                                            
  |===================                                                   |  28%
  |                                                                            
  |=====================                                                 |  30%
  |                                                                            
  |=======================                                               |  32%
  |                                                                            
  |========================                                              |  35%
  |                                                                            
  |==========================                                            |  38%
  |                                                                            
  |============================                                          |  40%
  |                                                                            
  |==============================                                        |  42%
  |                                                                            
  |================================                                      |  45%
  |                                                                            
  |=================================                                     |  48%
  |                                                                            
  |===================================                                   |  50%
  |                                                                            
  |=====================================                                 |  52%
  |                                                                            
  |======================================                                |  55%
  |                                                                            
  |========================================                              |  58%
  |                                                                            
  |==========================================                            |  60%
  |                                                                            
  |============================================                          |  62%
  |                                                                            
  |==============================================                        |  65%
  |                                                                            
  |===============================================                       |  68%
  |                                                                            
  |=================================================                     |  70%
  |                                                                            
  |===================================================                   |  72%
  |                                                                            
  |====================================================                  |  75%
  |                                                                            
  |======================================================                |  78%
  |                                                                            
  |========================================================              |  80%
  |                                                                            
  |==========================================================            |  82%
  |                                                                            
  |============================================================          |  85%
  |                                                                            
  |=============================================================         |  88%
  |                                                                            
  |===============================================================       |  90%
  |                                                                            
  |=================================================================     |  92%
  |                                                                            
  |==================================================================    |  95%
  |                                                                            
  |====================================================================  |  98%
  |                                                                            
  |======================================================================| 100%

Run PCA and broad clustering

Raw.data <- RunPCA(Raw.data, verbose = FALSE)

Raw.data <- FindNeighbors(Raw.data,
                          dims = 1:20,
                          k.param = 8)

Raw.data <- FindClusters(Raw.data, resolution = 0.3)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 10177
## Number of edges: 206464
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.9042
## Number of communities: 9
## Elapsed time: 0 seconds
DimPlot(Raw.data,
        reduction = "spring",
        cols = c("#ebcb2e", "#9ec22f", "#a9961b", "#cc3a1b", "#d14c8d", "#4cabdc", "#5ab793", "#e7823a", "#046c9a", "#4990c9"),
        pt.size = 0.5) & NoAxes()

Raw.data$Broadclust.ident <- Raw.data$seurat_clusters

Raw.data <- Raw.data %>% subset(idents = c(0,1,2,3,4,5,6))
DimPlot(Raw.data,
        reduction = "spring",
        cols = c("#ebcb2e", "#9ec22f", "#a9961b", "#cc3a1b", "#d14c8d", "#4cabdc", "#5ab793", "#e7823a", "#046c9a", "#4990c9"),
        pt.size = 0.5) & NoAxes()

Split WT(eYFP) cells and Pidd1KO cells

ggplot(as.data.frame(t(Raw.data@assays$SCT@scale.data)), aes(x = eYFP, stat(ndensity))) +
  geom_histogram(bins = 200, colour ="lightgrey")+
  geom_vline(xintercept = -0.8, colour = "red", linetype = 2)

table(Raw.data@assays$SCT@scale.data["eYFP",] > -0.8)
## 
## FALSE  TRUE 
##  6087  3956
Raw.data$Genotype <- ifelse(Raw.data@assays$SCT@scale.data["eYFP",] > -0.8, "Ctrl.eYFP", "Pidd1.KO")
DimPlot(object = Raw.data,
        split.by =  "Genotype",
        group.by = "Genotype",
        reduction = "spring",
        cols = c("#7293c8", "#cc3a1b"),
        pt.size = 0.5)  & NoAxes()

Save the object

saveRDS(Raw.data, "./Pidd1KO.cells.RDS")

Session Info

#date
format(Sys.time(), "%d %B, %Y, %H,%M")
## [1] "16 janvier, 2023, 11,48"
#Packages used
sessionInfo()
## R version 4.2.2 Patched (2022-11-10 r83330)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.5 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
## LAPACK: /home/matthieu/anaconda3/lib/libmkl_rt.so.1
## 
## locale:
##  [1] LC_CTYPE=fr_FR.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=fr_FR.UTF-8        LC_COLLATE=fr_FR.UTF-8    
##  [5] LC_MONETARY=fr_FR.UTF-8    LC_MESSAGES=fr_FR.UTF-8   
##  [7] LC_PAPER=fr_FR.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] wesanderson_0.3.6  reticulate_1.22    cowplot_1.1.1      ggExtra_0.9       
##  [5] ggplot2_3.4.0      RColorBrewer_1.1-2 dplyr_1.0.7        Matrix_1.5-1      
##  [9] SeuratObject_4.0.4 Seurat_4.0.5      
## 
## loaded via a namespace (and not attached):
##   [1] Rtsne_0.15            colorspace_2.0-2      deldir_1.0-6         
##   [4] ellipsis_0.3.2        ggridges_0.5.3        rprojroot_2.0.2      
##   [7] rstudioapi_0.13       spatstat.data_2.1-0   farver_2.1.0         
##  [10] leiden_0.3.9          listenv_0.8.0         ggrepel_0.9.1        
##  [13] fansi_0.5.0           codetools_0.2-18      splines_4.2.2        
##  [16] knitr_1.36            polyclip_1.10-0       jsonlite_1.7.2       
##  [19] ica_1.0-2             cluster_2.1.4         png_0.1-7            
##  [22] uwot_0.1.10           shiny_1.7.1           sctransform_0.3.2    
##  [25] spatstat.sparse_2.0-0 compiler_4.2.2        httr_1.4.2           
##  [28] assertthat_0.2.1      fastmap_1.1.0         lazyeval_0.2.2       
##  [31] cli_3.4.1             later_1.3.0           htmltools_0.5.2      
##  [34] tools_4.2.2           igraph_1.2.11         gtable_0.3.0         
##  [37] glue_1.5.1            RANN_2.6.1            reshape2_1.4.4       
##  [40] Rcpp_1.0.8            scattermore_0.7       jquerylib_0.1.4      
##  [43] vctrs_0.5.1           nlme_3.1-153          lmtest_0.9-39        
##  [46] xfun_0.28             stringr_1.4.0         globals_0.14.0       
##  [49] mime_0.12             miniUI_0.1.1.1        lifecycle_1.0.3      
##  [52] irlba_2.3.3           goftest_1.2-3         future_1.23.0        
##  [55] MASS_7.3-58           zoo_1.8-9             scales_1.2.1         
##  [58] spatstat.core_2.3-1   promises_1.2.0.1      spatstat.utils_2.2-0 
##  [61] parallel_4.2.2        yaml_2.2.1            pbapply_1.5-0        
##  [64] gridExtra_2.3         sass_0.4.0            rpart_4.1.19         
##  [67] stringi_1.7.6         highr_0.9             rlang_1.0.6          
##  [70] pkgconfig_2.0.3       matrixStats_0.61.0    evaluate_0.14        
##  [73] lattice_0.20-45       ROCR_1.0-11           purrr_0.3.4          
##  [76] tensor_1.5            labeling_0.4.2        patchwork_1.1.1      
##  [79] htmlwidgets_1.5.4     tidyselect_1.1.1      here_1.0.1           
##  [82] parallelly_1.29.0     RcppAnnoy_0.0.19      plyr_1.8.6           
##  [85] magrittr_2.0.2        R6_2.5.1              generics_0.1.1       
##  [88] DBI_1.1.1             withr_2.5.0           mgcv_1.8-41          
##  [91] pillar_1.6.4          fitdistrplus_1.1-6    survival_3.4-0       
##  [94] abind_1.4-5           tibble_3.1.6          future.apply_1.8.1   
##  [97] crayon_1.4.2          KernSmooth_2.23-20    utf8_1.2.2           
## [100] spatstat.geom_2.4-0   plotly_4.10.0         rmarkdown_2.11       
## [103] grid_4.2.2            data.table_1.14.2     digest_0.6.29        
## [106] xtable_1.8-4          tidyr_1.1.4           httpuv_1.6.3         
## [109] munsell_0.5.0         viridisLite_0.4.0     bslib_0.3.1

  1. Institute of Psychiatry and Neuroscience of Paris, INSERM U1266, 75014, Paris, France, ↩︎

LS0tCnRpdGxlOiAiUGlkZDEgS08gcXVhbGl0eSBjb250cm9sIgphdXRob3I6CiAgIC0gTWF0dGhpZXUgTW9yZWF1XltJbnN0aXR1dGUgb2YgUHN5Y2hpYXRyeSBhbmQgTmV1cm9zY2llbmNlIG9mIFBhcmlzLCBJTlNFUk0gVTEyNjYsIDc1MDE0LCBQYXJpcywgRnJhbmNlLCBtYXR0aGlldS5tb3JlYXVAaW5zZXJtLmZyXSBbIVtdKGh0dHBzOi8vb3JjaWQub3JnL3NpdGVzL2RlZmF1bHQvZmlsZXMvaW1hZ2VzL29yY2lkXzE2eDE2LnBuZyldKGh0dHBzOi8vb3JjaWQub3JnLzAwMDAtMDAwMi0yNTkyLTIzNzMpCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OiAKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgZGZfcHJpbnQ6IHRpYmJsZQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrCiAgICB0aGVtZTogY29zbW8KICAgIGNzczogIi4uL3N0eWxlLmNzcyIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBmaWcuYWxpZ24gPSAnY2VudGVyJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2FjaGUubGF6eSA9IEZBTFNFKQpgYGAKCiMgTG9hZCBsaWJyYXJpZXMKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KE1hdHJpeCkKbGlicmFyeShkcGx5cikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ0V4dHJhKQpsaWJyYXJ5KGNvd3Bsb3QpCmxpYnJhcnkocmV0aWN1bGF0ZSkKbGlicmFyeSh3ZXNhbmRlcnNvbikKdXNlX3B5dGhvbigiL3Vzci9iaW4vcHl0aG9uMyIpCgojU2V0IGdncGxvdCB0aGVtZSBhcyBjbGFzc2ljCnRoZW1lX3NldCh0aGVtZV9jbGFzc2ljKCkpCmBgYAoKIyBMb2FkIHRoZSByYXcgY291bnRzIG1hdHJpeAoKYGBge3J9CkNvdW50ZGF0YSA8LSBSZWFkMTBYKCJvdXRzL2ZpbHRlcmVkX2ZlYXR1cmVfYmNfbWF0cml4LyIpCgpSYXcuZGF0YSA8LSBDcmVhdGVTZXVyYXRPYmplY3QoY291bnRzID0gQ291bnRkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0ID0gIlBpZGQxX0tPIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLmNlbGxzID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLmZlYXR1cmVzID0gODAwKQoKUmF3LmRhdGEkQmFyY29kZXMgPC0gcm93bmFtZXMoUmF3LmRhdGFAbWV0YS5kYXRhKQoKcm0oQ291bnRkYXRhKQoKZGltKFJhdy5kYXRhKQpgYGAKYGBge3J9ClJhdy5kYXRhJHBlcmNlbnQubWl0byA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChSYXcuZGF0YSwgcGF0dGVybiA9ICJebXQtIikKUmF3LmRhdGEkcGVyY2VudC5yaWJvIDwtIFBlcmNlbnRhZ2VGZWF0dXJlU2V0KFJhdy5kYXRhLCBwYXR0ZXJuID0gIiheUnBsfF5ScHN8Xk1ycCkiKQpgYGAKCmBgYHtyfQpWbG5QbG90KG9iamVjdCA9IFJhdy5kYXRhLCBmZWF0dXJlcyA9IGMoIm5GZWF0dXJlX1JOQSIsIm5Db3VudF9STkEiLCAicGVyY2VudC5taXRvIiwgInBlcmNlbnQucmlibyIpLCBuY29sPSAyKSAmIE5vQXhlcygpCmBgYAojIEluc3BlY3QgY2VsbCBiYXNlZCBvbiByZWxhdGlvbiBiZXR3ZWVuIG5VTUkgYW5kIG5HZW5lIGRldGVjdGVkCgpgYGB7cn0KIyBSZWxhdGlvbiBiZXR3ZWVuIG5VTUkgYW5kIG5HZW5lIGRldGVjdGVkCkNlbGwuUUMuU3RhdCA8LSBSYXcuZGF0YUBtZXRhLmRhdGEKCnAxIDwtIGdncGxvdChDZWxsLlFDLlN0YXQsIGFlcyh4PW5Db3VudF9STkEsIHk9bkZlYXR1cmVfUk5BKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikKcDEgPC0gZ2dNYXJnaW5hbChwMSwgdHlwZSA9ICJoaXN0b2dyYW0iLCBmaWxsPSJsaWdodGdyZXkiKQoKcDIgPC0gZ2dwbG90KENlbGwuUUMuU3RhdCwgYWVzKHg9bG9nMTAobkNvdW50X1JOQSksIHk9bG9nMTAobkZlYXR1cmVfUk5BKSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpCnAyIDwtIGdnTWFyZ2luYWwocDIsIHR5cGUgPSAiaGlzdG9ncmFtIiwgZmlsbD0ibGlnaHRncmV5IikKCnBsb3RfZ3JpZChwbG90bGlzdCA9IGxpc3QocDEscDIpLCBuY29sPTIsIGFsaWduPSdoJywgcmVsX3dpZHRocyA9IGMoMSwgMSkpIDsgcm0ocDEscDIpCmBgYAoKCmBgYHtyfQpSYXcuZGF0YSA8LSBBZGRNb2R1bGVTY29yZShSYXcuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSBsaXN0KGMoIkhiYi1idCIsICJIYnExYSIsICJJc2cyMCIsICJGZWNoIiwgIlNuY2EiLCAiUmVjMTE0IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjdHJsID0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiRXJ5dGhyb2N5dGUuc2lnbmF0dXJlIikKCkNlbGwuUUMuU3RhdCRFcnl0aHJvY3l0ZS5zaWduYXR1cmUgPC0gUmF3LmRhdGEkRXJ5dGhyb2N5dGUuc2lnbmF0dXJlMQpgYGAKCmBgYHtyfQpncmFkaWVudCA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwobiA9MTEsIG5hbWUgPSAiU3BlY3RyYWwiKSkoMTAwKQoKcDEgPC0gZ2dwbG90KENlbGwuUUMuU3RhdCwgYWVzKGxvZzEwKG5Db3VudF9STkEpLCB5PWxvZzEwKG5GZWF0dXJlX1JOQSkpKSArCiAgICAgIGdlb21fcG9pbnQoYWVzKGNvbG9yPSBFcnl0aHJvY3l0ZS5zaWduYXR1cmUpKSAgKyAKICAgICAgc2NhbGVfY29sb3JfZ3JhZGllbnRuKGNvbG91cnM9cmV2KGdyYWRpZW50KSwgbmFtZT0nRXJ5dGhyb2N5dGUgc2NvcmUnKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwMiA8LSBnZ3Bsb3QoQ2VsbC5RQy5TdGF0LCBhZXMobG9nMTAobkNvdW50X1JOQSksIHk9bG9nMTAobkZlYXR1cmVfUk5BKSkpICsKICAgICAgZ2VvbV9wb2ludChhZXMoY29sb3I9IHBlcmNlbnQubWl0bykpICArIAogICAgICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3Vycz1yZXYoZ3JhZGllbnQpLCBuYW1lPSdQZXJjZW50IG1pdG8nKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwMyA8LSBnZ3Bsb3QoQ2VsbC5RQy5TdGF0LCBhZXMobG9nMTAobkNvdW50X1JOQSksIHk9bG9nMTAobkZlYXR1cmVfUk5BKSkpICsKICAgICAgZ2VvbV9wb2ludChhZXMoY29sb3I9IHBlcmNlbnQucmlibykpICArIAogICAgICBzY2FsZV9jb2xvcl9ncmFkaWVudG4oY29sb3Vycz1yZXYoZ3JhZGllbnQpLCBuYW1lPSdQZXJjZW50IHJpYm8nKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpwMSArIHAyICsgcDMKYGBgCgojIyBFeGNsdWRlIEVyeXRocm9jeXRlcwoKYGBge3J9CkNlbGwuUUMuU3RhdCRFcnl0aHJvY3l0ZSA8LSBpZmVsc2UoQ2VsbC5RQy5TdGF0JEVyeXRocm9jeXRlLnNpZ25hdHVyZSA+IDAuMSwgIkVyeXRocm9jeXRlIiwgIk5vdF9Fcnl0aHJvY3l0ZSIpCmBgYAoKYGBge3J9CnAyIDwtIGdncGxvdChDZWxsLlFDLlN0YXQsIGFlcyh4PWxvZzEwKG5Db3VudF9STkEpLCB5PWxvZzEwKG5GZWF0dXJlX1JOQSkpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gRXJ5dGhyb2N5dGUpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCmdnTWFyZ2luYWwocDIsIHR5cGUgPSAiaGlzdG9ncmFtIiwgZmlsbD0ibGlnaHRncmV5IikKYGBgCgpgYGB7cn0KIyBGaWx0ZXIgY2VsbHMgYmFzZWQgb24gdGhlc2UgdGhyZXNob2xkcwpDZWxsLlFDLlN0YXQgPC0gQ2VsbC5RQy5TdGF0ICU+JSBmaWx0ZXIoQ2VsbC5RQy5TdGF0JEVyeXRocm9jeXRlLnNpZ25hdHVyZSA8IDAuMSkKYGBgCgojIExvdyBxdWFsaXR5IGNlbGwgZmlsdGVyaW5nCgojIyBGaWx0ZXJpbmcgY2VsbHMgYmFzZWQgb24gcGVyY2VudGFnZSBvZiBtaXRvY2hvbmRyaWFsIHRyYW5zY3JpcHRzCgpXZSBhcHBsaWVkIGEgaGlnaCBhbmQgbG93IG1lZGlhbiBhYnNvbHV0ZSBkZXZpYXRpb24gKG1hZCkgdGhyZXNob2xkcyB0byBleGNsdWRlIG91dGxpZXIgY2VsbHMKCmBgYHtyfQptYXgubWl0by50aHIgPC0gbWVkaWFuKENlbGwuUUMuU3RhdCRwZXJjZW50Lm1pdG8pICsgNCptYWQoQ2VsbC5RQy5TdGF0JHBlcmNlbnQubWl0bykKbWluLm1pdG8udGhyIDwtIG1lZGlhbihDZWxsLlFDLlN0YXQkcGVyY2VudC5taXRvKSAtIDQqbWFkKENlbGwuUUMuU3RhdCRwZXJjZW50Lm1pdG8pCmBgYAoKYGBge3J9CnAxIDwtIGdncGxvdChDZWxsLlFDLlN0YXQsIGFlcyh4PW5GZWF0dXJlX1JOQSwgeT1wZXJjZW50Lm1pdG8pKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWF4Lm1pdG8udGhyKSwgY29sb3VyID0gInJlZCIsIGxpbmV0eXBlID0gMikgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSBtaW4ubWl0by50aHIpLCBjb2xvdXIgPSAicmVkIiwgbGluZXR5cGUgPSAyKSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgbGFiZWwgPSBwYXN0ZTAoYXMubnVtZXJpYyh0YWJsZShDZWxsLlFDLlN0YXQkcGVyY2VudC5taXRvID4gbWF4Lm1pdG8udGhyIHwgQ2VsbC5RQy5TdGF0JHBlcmNlbnQubWl0byA8IG1pbi5taXRvLnRocilbMl0pLCIgY2VsbHMgcmVtb3ZlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5udW1lcmljKHRhYmxlKENlbGwuUUMuU3RhdCRwZXJjZW50Lm1pdG8gPiBtYXgubWl0by50aHIgfCBDZWxsLlFDLlN0YXQkcGVyY2VudC5taXRvIDwgbWluLm1pdG8udGhyKVsxXSksIiBjZWxscyByZW1haW4iKSwKICAgICAgICAgICB4ID0gNjAwMCwgeSA9IDIwKQoKZ2dNYXJnaW5hbChwMSwgdHlwZSA9ICJoaXN0b2dyYW0iLCBmaWxsPSJsaWdodGdyZXkiLCBiaW5zPTEwMCkgCmBgYAoKYGBge3J9CiMgRmlsdGVyIGNlbGxzIGJhc2VkIG9uIHRoZXNlIHRocmVzaG9sZHMKQ2VsbC5RQy5TdGF0IDwtIENlbGwuUUMuU3RhdCAlPiUgZmlsdGVyKHBlcmNlbnQubWl0byA8IG1heC5taXRvLnRocikgJT4lIGZpbHRlcihwZXJjZW50Lm1pdG8gPiBtaW4ubWl0by50aHIpCmBgYAoKIyMgRmlsdGVyaW5nIGNlbGxzIGJhc2VkIG9uIG51bWJlciBvZiBnZW5lcyBhbmQgdHJhbnNjcmlwdHMgZGV0ZWN0ZWQKCiMjIyBSZW1vdmUgY2VsbHMgd2l0aCB0byBmZXcgZ2VuZSBkZXRlY3RlZCBvciB3aXRoIHRvIG1hbnkgVU1JIGNvdW50cwoKV2UgZmlsdGVyIGNlbGxzIHdoaWNoIGFyZSBsaWtlbHkgdG8gYmUgZG91YmxldCBiYXNlZCBvbiB0aGVpciBoaWdoZXIgY29udGVudCBvZiB0cmFuc2NyaXB0IGRldGVjdGVkIGFzIHdlbGwgYXMgY2VsbCB3aXRoIHRvIGZldyBnZW5lcy9VTUkgc2VxdWVuY2VkCgpgYGB7cn0KIyBTZXQgbG93IGFuZCBoaWdodCB0aHJlc2hvbGRzIG9uIHRoZSBudW1iZXIgb2YgZGV0ZWN0ZWQgZ2VuZXMgYmFzZWQgb24gdGhlIG9uZSBvYnRhaW4gd2l0aCB0aGUgV1QgZGF0YXNldAptaW4uR2VuZXMudGhyIDwtIGxvZzEwKDIwMDApCm1heC5HZW5lcy50aHIgPC0gbG9nMTAobWVkaWFuKENlbGwuUUMuU3RhdCRuRmVhdHVyZV9STkEpICsgMyptYWQoQ2VsbC5RQy5TdGF0JG5GZWF0dXJlX1JOQSkpCgojIFNldCBoaWdodCB0aHJlc2hvbGQgb24gdGhlIG51bWJlciBvZiB0cmFuc2NyaXB0cwptYXgublVNSS50aHIgPC0gbG9nMTAobWVkaWFuKENlbGwuUUMuU3RhdCRuQ291bnRfUk5BKSArIDMqbWFkKENlbGwuUUMuU3RhdCRuQ291bnRfUk5BKSkKYGBgCgpgYGB7cn0KIyBHZW5lL1VNSSBzY2F0dGVyIHBsb3QgYmVmb3JlIGZpbHRlcmluZwpwMSA8LSBnZ3Bsb3QoQ2VsbC5RQy5TdGF0LCBhZXMoeD1sb2cxMChuQ291bnRfUk5BKSwgeT1sb2cxMChuRmVhdHVyZV9STkEpKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWluLkdlbmVzLnRociksIGNvbG91ciA9ICJncmVlbiIsIGxpbmV0eXBlID0gMikgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSBtYXguR2VuZXMudGhyKSwgY29sb3VyID0gImdyZWVuIiwgbGluZXR5cGUgPSAyKSArCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1heC5uVU1JLnRociksIGNvbG91ciA9ICJyZWQiLCBsaW5ldHlwZSA9IDIpCgpnZ01hcmdpbmFsKHAxLCB0eXBlID0gImhpc3RvZ3JhbSIsIGZpbGw9ImxpZ2h0Z3JleSIpCmBgYAoKYGBge3J9CiMgRmlsdGVyIGNlbGxzIGJhc2Ugb24gYm90aCBtZXRyaWNzCkNlbGwuUUMuU3RhdCA8LSBDZWxsLlFDLlN0YXQgJT4lIGZpbHRlcihsb2cxMChuRmVhdHVyZV9STkEpID4gbWluLkdlbmVzLnRocikgJT4lIGZpbHRlcihsb2cxMChuQ291bnRfUk5BKSA8IG1heC5uVU1JLnRocikKYGBgCgojIyMgRmlsdGVyIGNlbGxzIGJlbG93IHRoZSBtYWluIHBvcHVsYXRpb24gblVNSS9uR2VuZSByZWxhdGlvbnNoaXAKCmBgYHtyfQpsbS5tb2RlbCA8LSBsbShkYXRhID0gQ2VsbC5RQy5TdGF0LCBmb3JtdWxhID0gbG9nMTAobkZlYXR1cmVfUk5BKSB+IGxvZzEwKG5Db3VudF9STkEpKQoKcDIgPC0gZ2dwbG90KENlbGwuUUMuU3RhdCwgYWVzKHg9bG9nMTAobkNvdW50X1JOQSksIHk9bG9nMTAobkZlYXR1cmVfUk5BKSkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdCA9IG1pbi5HZW5lcy50aHIpLCBjb2xvdXIgPSAiZ3JlZW4iLCBsaW5ldHlwZSA9IDIpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWF4LkdlbmVzLnRociksIGNvbG91ciA9ICJncmVlbiIsIGxpbmV0eXBlID0gMikgKwogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtYXgublVNSS50aHIpLCBjb2xvdXIgPSAicmVkIiwgbGluZXR5cGUgPSAyKSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJ0ZXh0IiwgbGFiZWwgPSBwYXN0ZTAoZGltKENlbGwuUUMuU3RhdClbMV0sICIgUUMgcGFzc2VkIGNlbGxzIiksIHggPSA0LCB5ID0gMy44KQoKZ2dNYXJnaW5hbChwMiwgdHlwZSA9ICJoaXN0b2dyYW0iLCBmaWxsPSJsaWdodGdyZXkiKQpgYGAKCiMjIEZpbHRlciB0aGUgU2V1cmF0IG9iamVjdAoKYGBge3J9ClJhdy5kYXRhIDwtIHN1YnNldCh4ID0gUmF3LmRhdGEsIHN1YnNldCA9IEJhcmNvZGVzICVpbiUgIENlbGwuUUMuU3RhdCRCYXJjb2RlcykKYGBgCgpgYGB7cn0KIyBQbG90IGZpbmFsIFFDIG1ldHJpY3MKVmxuUGxvdChvYmplY3QgPSBSYXcuZGF0YSwgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiLCJuQ291bnRfUk5BIiwgInBlcmNlbnQubWl0byIsICJwZXJjZW50LnJpYm8iKSwgbmNvbD0gMikgJiBOb0F4ZXMoKQpgYGAKCmBgYHtyfQpwMSA8LSBnZ3Bsb3QoUmF3LmRhdGFAbWV0YS5kYXRhLCBhZXMoeD1sb2cxMChuQ291bnRfUk5BKSwgeT1sb2cxMChuRmVhdHVyZV9STkEpKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikKZ2dNYXJnaW5hbChwMSwgdHlwZSA9ICJoaXN0b2dyYW0iLCBmaWxsPSJsaWdodGdyZXkiKQpgYGAKCmBgYHtyfQpybShsaXN0ID0gbHMoKVshbHMoKSAlaW4lICJSYXcuZGF0YSJdKQpgYGAKCgojIFVzZSBTY3J1YmxldCB0byBkZXRlY3Qgb2J2aW91cyBkb3VibGV0cwoKIyMgUnVuIFNjcnVibGV0IHdpdGggZGVmYXVsdCBwYXJhbWV0ZXIKCkV4cG9ydCByYXcgY291bnQgbWF0cml4IGFzIGlucHV0IHRvIFNjcnVibGV0CgpgYGB7cn0KI0V4cG9ydCBmaWx0ZXJlZCBtYXRyaXgKZGlyLmNyZWF0ZSgiU2NydWJsZXRfaW5wdXRzIikKCmV4cHJEYXRhIDwtIE1hdHJpeChhcy5tYXRyaXgoUmF3LmRhdGFAYXNzYXlzW1siUk5BIl1dQGNvdW50cyksIHNwYXJzZSA9IFRSVUUpCndyaXRlTU0oZXhwckRhdGEsICJTY3J1YmxldF9pbnB1dHMvbWF0cml4MS5tdHgiKQpgYGAKCmBgYHtweXRob259CmltcG9ydCBzY3J1YmxldCBhcyBzY3IKaW1wb3J0IHNjaXB5LmlvCmltcG9ydCBudW1weSBhcyBucAppbXBvcnQgb3MKCiNMb2FkIHJhdyBjb3VudHMgbWF0cml4IGFuZCBnZW5lIGxpc3QKaW5wdXRfZGlyID0gJ1NjcnVibGV0X2lucHV0cycKY291bnRzX21hdHJpeCA9IHNjaXB5LmlvLm1tcmVhZChpbnB1dF9kaXIgKyAnL21hdHJpeDEubXR4JykuVC50b2NzYygpCgojSW5pdGlhbGl6ZSBTY3J1YmxldApzY3J1YiA9IHNjci5TY3J1YmxldChjb3VudHNfbWF0cml4LCBleHBlY3RlZF9kb3VibGV0X3JhdGU9MC4xLCBzaW1fZG91YmxldF9yYXRpbz0yLCBuX25laWdoYm9ycyA9IDgpCgojUnVuIHRoZSBkZWZhdWx0IHBpcGVsaW5lCmRvdWJsZXRfc2NvcmVzLCBwcmVkaWN0ZWRfZG91YmxldHMgPSBzY3J1Yi5zY3J1Yl9kb3VibGV0cyhtaW5fY291bnRzPTEsIG1pbl9jZWxscz0zLCBtaW5fZ2VuZV92YXJpYWJpbGl0eV9wY3RsPTg1LCBuX3ByaW5fY29tcHM9MjUpCmBgYAoKYGBge3J9CiMgSW1wb3J0IHNjcnVibGV0J3MgZG91YmxldCBzY29yZQpSYXcuZGF0YSREb3VibGV0c2NvcmUgPC0gcHkkZG91YmxldF9zY29yZXMKCiMgUGxvdCBkb3VibGV0IHNjb3JlCmdncGxvdChSYXcuZGF0YUBtZXRhLmRhdGEsIGFlcyh4ID0gRG91YmxldHNjb3JlLCBzdGF0KG5kZW5zaXR5KSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjAwLCBjb2xvdXIgPSJsaWdodGdyZXkiKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjIsIGNvbG91ciA9ICJyZWQiLCBsaW5ldHlwZSA9IDIpCmBgYAoKYGBge3J9CiMgTWFudWFsbHkgc2V0IHRocmVzaG9sZCBhdCBkb3VibGV0IHNjb3JlIHRvIDAuMgpSYXcuZGF0YSRQcmVkaWN0ZWRfZG91YmxldHMgPC0gaWZlbHNlKHB5JGRvdWJsZXRfc2NvcmVzID4gMC4yLCAiRG91YmxldCIsIlNpbmdsZXQiKQp0YWJsZShSYXcuZGF0YSRQcmVkaWN0ZWRfZG91YmxldHMpCmBgYApgYGB7cn0KUmF3LmRhdGEgPC0gc3Vic2V0KHggPSBSYXcuZGF0YSwgc3Vic2V0ID0gUHJlZGljdGVkX2RvdWJsZXRzID09ICJTaW5nbGV0IikKYGBgCgojIEdlbmVyYXRlIFNSSU5HIGRpbWVudGlvbmFsaXR5IHJlZHVjdGlvbgoKIyMgRXhwb3J0IGNvdW50cyBtYXRyaXgKCmBgYHtyfQpkaXIuY3JlYXRlKCIuL1NwcmluZ0Nvb3JkaW5hdGVzIikKYGBgCgpgYGB7cn0KIyBFeHBvcnQgcmF3IGV4cHJlc3Npb24gbWF0cml4IGFuZCBnZW5lIGxpc3QgdG8gcmVnZW5lcmF0ZSBhIHNwcmluZyBwbG90CmV4cHJEYXRhIDwtIE1hdHJpeChhcy5tYXRyaXgoUmF3LmRhdGFAYXNzYXlzW1siUk5BIl1dQGNvdW50cyksIHNwYXJzZSA9IFRSVUUpCndyaXRlTU0oZXhwckRhdGEsICIuL1NwcmluZ0Nvb3JkaW5hdGVzL0V4cHJEYXRhLm10eCIpCmBgYAoKYGBge3J9CkdlbmVsaXN0IDwtIHJvdy5uYW1lcyhSYXcuZGF0YUBhc3NheXNbWyJSTkEiXV1AY291bnRzKQp3cml0ZS50YWJsZShHZW5lbGlzdCwgIi4vU3ByaW5nQ29vcmRpbmF0ZXMvR2VuZWxpc3QuY3N2Iiwgc2VwPSJcdCIsIGNvbC5uYW1lcyA9IEYsIHJvdy5uYW1lcyA9IEYsIHF1b3RlID0gRikKYGBgCgpgYGB7cn0KI0V4cG9ydCBtZXRhZGF0YQpTY3J1YmxldCA8LSBjKCJTY3J1YmxldCIsIFJhdy5kYXRhJFByZWRpY3RlZF9kb3VibGV0cykKU2NydWJsZXQgPC0gcGFzdGUoU2NydWJsZXQsIHNlcD0iLCIsIGNvbGxhcHNlPSIsIikKCkNlbGxncm91cGluZyA8LSBTY3J1YmxldAp3cml0ZS50YWJsZShDZWxsZ3JvdXBpbmcsICIuL1NwcmluZ0Nvb3JkaW5hdGVzL0NlbGxncm91cGluZy5jc3YiLCBxdW90ZSA9Riwgcm93Lm5hbWVzID0gRiwgY29sLm5hbWVzID0gRikKYGBgCgojIyBJbXBvcnQgY29vcmRpbmF0ZXMKCmBgYHtyfQpzcHJpbmcuY29vciA8LSByZWFkLnRhYmxlKCJTcHJpbmdDb29yZGluYXRlcy9jb29yZGluYXRlcy50eHQiLCBzZXAgPSAiLCIsIGhlYWRlciA9IEYsIHJvdy5uYW1lcyA9IDEpCmNvbG5hbWVzKHNwcmluZy5jb29yKSA8LSBjKCJTcHJpbmdfMSIsICJTcHJpbmdfMiIpCmBgYAoKYGBge3J9ClNwcmluZy5TeW0gPC0gZnVuY3Rpb24oeCl7CiAgeCA9IGFicyhtYXgoc3ByaW5nLmNvb3IkU3ByaW5nXzIpLXgpCiB9CgpzcHJpbmcuY29vciRTcHJpbmdfMiA8LSBzYXBwbHkoc3ByaW5nLmNvb3IkU3ByaW5nXzIsIGZ1bmN0aW9uKHgpIFNwcmluZy5TeW0oeCkpCmBgYAoKYGBge3J9ClJhdy5kYXRhJFNwcmluZ18xIDwtIHNwcmluZy5jb29yJFNwcmluZ18xClJhdy5kYXRhJFNwcmluZ18yIDwtIHNwcmluZy5jb29yJFNwcmluZ18yCmBgYAoKCmBgYHtyfQpzcHJpbmcgPC0gYXMubWF0cml4KFJhdy5kYXRhQG1ldGEuZGF0YSAlPiUgc2VsZWN0KCJTcHJpbmdfMSIsICJTcHJpbmdfMiIpKQogIApSYXcuZGF0YVtbInNwcmluZyJdXSA8LSBDcmVhdGVEaW1SZWR1Y09iamVjdChlbWJlZGRpbmdzID0gc3ByaW5nLCBrZXkgPSAiU3ByaW5nXyIsIGFzc2F5ID0gRGVmYXVsdEFzc2F5KFJhdy5kYXRhKSkKYGBgCgpgYGB7cn0KRGltUGxvdChSYXcuZGF0YSwgCiAgICAgICAgcmVkdWN0aW9uID0gInNwcmluZyIsCiAgICAgICAgcHQuc2l6ZSA9IDAuNSkgJiBOb0F4ZXMoKQpgYGAKIyBCcm9hZCBjbHVzdGVyaW5nCgojIyBTY3RyYW5zZm9ybSBub3JtYWxpemF0aW9uCgpgYGB7cn0Kcy5nZW5lcyA8LSBjKCJNY201IiwgIlBjbmEiLCAiVHltNSIsICJGZW4xIiwgIk1jbTIiLCAiTWNtNCIsICJScm0xIiwgIlVuZyIsICJHaW5zMiIsICJNY202IiwgIkNkY2E3IiwgIkR0bCIsICJQcmltMSIsICJVaHJmMSIsICJNbGYxaXAiLCAiSGVsbHMiLCAiUmZjMiIsICJSYXAyIiwgIk5hc3AiLCAiUmFkNTFhcDEiLCAiR21ubiIsICJXZHI3NiIsICJTbGJwIiwgIkNjbmUyIiwgIlVicjciLCAiUG9sZDMiLCAiTXNoMiIsICJBdGFkMiIsICJSYWQ1MSIsICJScm0yIiwgIkNkYzQ1IiwgIkNkYzYiLCAiRXhvMSIsICJUaXBpbiIsICJEc2NjMSIsICJCbG0iLCAiIENhc3A4YXAyIiwgIlVzcDEiLCAiQ2xzcG4iLCAiUG9sYTEiLCAiQ2hhZjFiIiwgIkJyaXAxIiwgIkUyZjgiKQpnMm0uZ2VuZXMgPC0gYygiSG1nYjIiLCAiRGRrMSIsIk51c2FwMSIsICJVYmUyYyIsICJCaXJjNSIsICJUcHgyIiwgIlRvcDJhIiwgIk5kYzgwIiwgIkNrczIiLCAiTnVmMiIsICJDa3MxYiIsICJNa2k2NyIsICJUbXBvIiwgIiBDZW5wayIsICJUYWNjMyIsICJGYW02NGEiLCAiU21jNCIsICJDY25iMiIsICJDa2FwMmwiLCAiQ2thcDIiLCAiQXVya2IiLCAiQnViMSIsICJLaWYxMSIsICJBbnAzMmUiLCAiVHViYjRiIiwgIkd0c2UxIiwgImtpZjIwYiIsICJIanVycCIsICJDZGNhMyIsICJIbjEiLCAiQ2RjMjAiLCAiVHRrIiwgIkNkYzI1YyIsICJraWYyYyIsICJSYW5nYXAxIiwgIk5jYXBkMiIsICJEbGdhcDUiLCAiQ2RjYTIiLCAiQ2RjYTgiLCAiRWN0MiIsICJLaWYyMyIsICJIbW1yIiwgIkF1cmthIiwgIlBzcmMxIiwgIkFubG4iLCAiTGJyIiwgIkNrYXA1IiwgIkNlbnBlIiwgIkN0Y2YiLCAiTmVrMiIsICJHMmUzIiwgIkdhczJsMyIsICJDYng1IiwgIkNlbnBhIikKClJhdy5kYXRhIDwtIENlbGxDeWNsZVNjb3JpbmcoUmF3LmRhdGEsIHMuZmVhdHVyZXMgPSBzLmdlbmVzLCBnMm0uZmVhdHVyZXMgPSBnMm0uZ2VuZXMsIHNldC5pZGVudCA9IFRSVUUpClJhdy5kYXRhJENDLkRpZmZlcmVuY2UgPC0gUmF3LmRhdGEkUy5TY29yZSAtIFJhdy5kYXRhJEcyTS5TY29yZQpgYGAKCgpgYGB7ciBjbGFzcy5vdXRwdXQ9InNjcm9sbC0xMDAiLCBjYWNoZT1UUlVFfQpSYXcuZGF0YSA8LSBTQ1RyYW5zZm9ybShSYXcuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gImdsbUdhbVBvaSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcnMudG8ucmVncmVzcyA9IGMoInBlcmNlbnQubWl0byIsICJDQy5EaWZmZXJlbmNlIiwgIm5Db3VudF9STkEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IFQpCmBgYAoKIyMgUnVuIFBDQSBhbmQgYnJvYWQgY2x1c3RlcmluZwoKYGBge3IgY2xhc3Mub3V0cHV0PSJzY3JvbGwtMTAwIiwgY2FjaGU9VFJVRX0KUmF3LmRhdGEgPC0gUnVuUENBKFJhdy5kYXRhLCB2ZXJib3NlID0gRkFMU0UpCgpSYXcuZGF0YSA8LSBGaW5kTmVpZ2hib3JzKFJhdy5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXMgPSAxOjIwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGsucGFyYW0gPSA4KQoKUmF3LmRhdGEgPC0gRmluZENsdXN0ZXJzKFJhdy5kYXRhLCByZXNvbHV0aW9uID0gMC4zKQpgYGAKCmBgYHtyfQpEaW1QbG90KFJhdy5kYXRhLAogICAgICAgIHJlZHVjdGlvbiA9ICJzcHJpbmciLAogICAgICAgIGNvbHMgPSBjKCIjZWJjYjJlIiwgIiM5ZWMyMmYiLCAiI2E5OTYxYiIsICIjY2MzYTFiIiwgIiNkMTRjOGQiLCAiIzRjYWJkYyIsICIjNWFiNzkzIiwgIiNlNzgyM2EiLCAiIzA0NmM5YSIsICIjNDk5MGM5IiksCiAgICAgICAgcHQuc2l6ZSA9IDAuNSkgJiBOb0F4ZXMoKQpgYGAKCmBgYHtyfQpSYXcuZGF0YSRCcm9hZGNsdXN0LmlkZW50IDwtIFJhdy5kYXRhJHNldXJhdF9jbHVzdGVycwoKUmF3LmRhdGEgPC0gUmF3LmRhdGEgJT4lIHN1YnNldChpZGVudHMgPSBjKDAsMSwyLDMsNCw1LDYpKQpgYGAKCmBgYHtyfQpEaW1QbG90KFJhdy5kYXRhLAogICAgICAgIHJlZHVjdGlvbiA9ICJzcHJpbmciLAogICAgICAgIGNvbHMgPSBjKCIjZWJjYjJlIiwgIiM5ZWMyMmYiLCAiI2E5OTYxYiIsICIjY2MzYTFiIiwgIiNkMTRjOGQiLCAiIzRjYWJkYyIsICIjNWFiNzkzIiwgIiNlNzgyM2EiLCAiIzA0NmM5YSIsICIjNDk5MGM5IiksCiAgICAgICAgcHQuc2l6ZSA9IDAuNSkgJiBOb0F4ZXMoKQpgYGAKCiMgU3BsaXQgV1QoZVlGUCkgY2VsbHMgYW5kIFBpZGQxS08gY2VsbHMKCmBgYHtyfQpnZ3Bsb3QoYXMuZGF0YS5mcmFtZSh0KFJhdy5kYXRhQGFzc2F5cyRTQ1RAc2NhbGUuZGF0YSkpLCBhZXMoeCA9IGVZRlAsIHN0YXQobmRlbnNpdHkpKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSAyMDAsIGNvbG91ciA9ImxpZ2h0Z3JleSIpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0wLjgsIGNvbG91ciA9ICJyZWQiLCBsaW5ldHlwZSA9IDIpCgp0YWJsZShSYXcuZGF0YUBhc3NheXMkU0NUQHNjYWxlLmRhdGFbImVZRlAiLF0gPiAtMC44KQpgYGAKCmBgYHtyfQpSYXcuZGF0YSRHZW5vdHlwZSA8LSBpZmVsc2UoUmF3LmRhdGFAYXNzYXlzJFNDVEBzY2FsZS5kYXRhWyJlWUZQIixdID4gLTAuOCwgIkN0cmwuZVlGUCIsICJQaWRkMS5LTyIpCmBgYAoKYGBge3J9CkRpbVBsb3Qob2JqZWN0ID0gUmF3LmRhdGEsCiAgICAgICAgc3BsaXQuYnkgPSAgIkdlbm90eXBlIiwKICAgICAgICBncm91cC5ieSA9ICJHZW5vdHlwZSIsCiAgICAgICAgcmVkdWN0aW9uID0gInNwcmluZyIsCiAgICAgICAgY29scyA9IGMoIiM3MjkzYzgiLCAiI2NjM2ExYiIpLAogICAgICAgIHB0LnNpemUgPSAwLjUpICAmIE5vQXhlcygpCmBgYAoKIyBTYXZlIHRoZSBvYmplY3QKCmBgYHtyIFNhdmUgUkRTfQpzYXZlUkRTKFJhdy5kYXRhLCAiLi9QaWRkMUtPLmNlbGxzLlJEUyIpCmBgYAoKIyBTZXNzaW9uIEluZm8KCmBgYHtyfQojZGF0ZQpmb3JtYXQoU3lzLnRpbWUoKSwgIiVkICVCLCAlWSwgJUgsJU0iKQoKI1BhY2thZ2VzIHVzZWQKc2Vzc2lvbkluZm8oKQpgYGA=