1 Notes:

1.1 Querying Dr. Mosser 20230123

  • Question from Najib: Connection between 5’ libraries and VDJ, tags are in fact shared from VDJ/surface to the ‘parent’ GEM. April: Do GEM generation, then split the resulting cDNA at cleanup step to the protein barcode set (at bead cleanup), then go into regular 5’ expression library, from which a set of specific primers are used to enrich the VDJ portion. Thus all three have the same parental cell tag.
  • Question from April: Do we need to change the inputs; from how many cells did we recover reads? He wants 10,000 cells / animal. April pooled according to 10x recommendations: 1:4 VDJ:expression library. Surface protein libraries have not yet been run, these have separate indexes and are much shorter; in contrast the VDJ/expression libraries are relatively similar (550 vs 630 nt).
  • From Najib: why 5’ vs 3’ capture? Not entirely certain, but 5’ kit is used for immunology usually, apparently.
  • Questions about the cell preparations: what was the status of the cells at GEM generation? Can we learn if that affected the number of cells observed, reads/cell? Can April tweak the sequencing library inputs to help even out the differences across samples for future runs (given that there are 3(I think) coming up)? Conversely, should I reprocess the samples so that all samples are perceived as having the least number of cells observed?
  • Quick primer of recombination and V(D)J: each receptor is heterodimer, heavy chain has the constant, V, D, and J. Conversely the light chain has the constant and the VJ. In T-cells, allelic exclusion results in a single resulting expresison event. In B-cells there may be many. In-toto there is a near-infinite random set of possibilities; these are all randomly generated during development. B-cells are constantly making new combinations during the lifespan – T-cells are long-lived and constant (Dave explained an experiment where someone transferred T-cells from mouse to mouse over the course of many years). (orientation 5’->3’? constant->D->J?)
  • Every cell that was sequenced is in theory a T-cell (“lung infected T-cells from mice), so should all have VDJ sequences. A small set of immune cells (NK) do not have these.

1.2 Checkin meeting with Dr. Park 20230124

  • April describing observations, cell #s etc.
  • Definitely not FACS, performed negative enrichment which in theory gets >= 90% pure samples.
  • Najib query: limit to VDJ cells only? Unlikely.
  • It sounds to me that the likely tasks I perform are not needed by Dr. Park.

2 TODO:

  • Check expression of the samples for levels of CD3.
  • Print out filtered amounts on a per-sample basis.
  • Query mSigDB categories of interest (currently I grabbed the ~98 influenza categories arbitrarily): e.g. figure out which ones are actually relevant.

3 Changelog

4 Preprocessing with cellranger

I downloaded a new version of cellranger along with the various reference files provided by 10x for the VD(J) references etc. I got a bit distracted by the pipeline language implemented by 10x called ‘martian’. I have the feeling that it might prove a good thing to play with.

Here are the commands I ran to separate the samples and perform the alignments. There are 4 sample names and each was done with one run of the ‘normal’ GEX scRNASeq method and one of the (new to me) V(D)J library.

5 Rerun the pipeline with multi

April kindly sent some information from 10x which shows that I should have used the multi pipline when preprocessing the data.

Intra-Muscular vs. Nasal

I wrote 4 separate configuration csv files using the templates I downloaded and following a little reading. It seemed to me that I should be able to process them all as a single csv file, but when I attempted that, cellranger did not react well. It also took a few tries before I got the various reference/library options correct.

Note that once cellranger successfully ran for the samples I moved them to the multi/ directory so that I can compare the outputs to when I simply did the ‘count’ operation.

The following invocations of cellranger all appear to work without any problems. Ideally I would like them to be done in a single run, though.

5.0.1 Shenanigans for combined VDJ samples

My attempts so far to use the csv configuration to concatenate multiple vdj libraries have not worked, so I chose to do it the stupid way, which is what I should have just done to begin with. Caveat, it works fine for the gex libraries to do it the way the documentation suggests.

cd preprocessing
for i in R1 R2; do
    for j in Control Mock_Mex09 IM_Mex09 IN_Mex09; do
        A_file=$(/bin/ls A_${j}_VDJ*_${i}_001.fastq.gz)
        B_file=$(/bin/ls B_${j}_VDJ*_${i}_001.fastq.gz)
        out_file="Concat_${j}_VDJ_${i}.fastq.gz"
        cp_cmd="cp ${A_file} ${out_file}"
        echo "Running: ${cp_cmd}."
        eval $cp_cmd
        cat_cmd="cat ${B_file} >> ${out_file}"
        echo "Running: ${cat_cmd}."
        eval $cat_cmd
    done
done
module add cellranger
cellranger multi --id control --csv sample_sheets/multi_config_try05_control.csv
cellranger multi --id mock --csv sample_sheets/multi_config_try05_mock.csv
cellranger multi --id m --csv sample_sheets/multi_config_try05_m.csv
cellranger multi --id n --csv sample_sheets/multi_config_try05_n.csv

mv control mock m n 01multi_combined/

6 Annotations

I wonder if I can put the gene annotations into the misc slot of the seurat data structure? And perhaps overload fData() to use it?

annotations <- load_biomart_annotations()$annotation
## The biomart annotations file already exists, loading from it.
brief <- unique(annotations[, c("hgnc_symbol", "description")])

7 Set prefix of the data

#prefix <- "multi"
prefix <- "01multi_combined"

8 Load the data into Seurat and poke at it

The following block is mostly a cut/paste of itself where I set the (over)simplified name of each sample. This then becomes the template for the path and parameters used to read the data, create a seurat object, and add the clonotype data from the vdj run.

For the moment I want to be able to play with the individual samples as well as the aggregate so that I can better understand the data. So I guess it works out that I didn’t figure out how to run all the samples at the same time via ‘cellranger multi’.

I am pretty sure Seurat’s merge() overload allows one to just do ‘merge(a,b,c,d,e…)’ but I am not using that.

I wrote a little function to make loading the Seurat data from a sample sheet easier. My intention is to have some of this code write back to that sample sheet.

all_scd <- create_scd("sample_sheets/all_samples.csv",
                      vdj_t_column = "vdjtcells")
## Did not find the batch column in the sample sheet.
## Filling it in as undefined.
## Warning in CheckDuplicateCellNames(object.list = objects): Some cell names are
## duplicated across objects provided. Renaming to enforce unique cell names.

## Warning in CheckDuplicateCellNames(object.list = objects): Some cell names are
## duplicated across objects provided. Renaming to enforce unique cell names.
control_cell_idx <- all_scd[["orig.ident"]] == "control"
control_cells <- all_scd[, control_cell_idx]
mock_cell_idx <- all_scd[["orig.ident"]] == "mock"
mock_cells <- all_scd[, mock_cell_idx]
muscular_cell_idx <- all_scd[["orig.ident"]] == "m"
muscular_cells <- all_scd[, muscular_cell_idx]
nasal_cell_idx <- all_scd[["orig.ident"]] == "n"
nasal_cells <- all_scd[, nasal_cell_idx]

9 Query for clonotypes in the individual samples and the full dataset.

control_clono <- !is.na(control_cells[["raw_clonotype_id"]])
summary(control_clono)
##  raw_clonotype_id
##  Mode :logical   
##  FALSE:13209     
##  TRUE :1971
mock_clono <- !is.na(mock_cells[["raw_clonotype_id"]])
summary(mock_clono)
##  raw_clonotype_id
##  Mode :logical   
##  FALSE:10835     
##  TRUE :3090
m_clono <- !is.na(muscular_cells[["raw_clonotype_id"]])
summary(m_clono)
##  raw_clonotype_id
##  Mode :logical   
##  FALSE:9664      
##  TRUE :4217
n_clono <- !is.na(nasal_cells[["raw_clonotype_id"]])
summary(n_clono)
##  raw_clonotype_id
##  Mode :logical   
##  FALSE:5545      
##  TRUE :3063

10 Initial Clusters

I want to take a couple minutes to add some annotations to the seurat object, notably I want to state the identity relationships with some sort of name.

Thus I will make a vector of the the sample IDs and for each one make a category of self/not-self. Note that Seurat comes with a function ‘FindConservedMarkers()’ or something like that which compares each self to all other samples, so this may be redundant; but it is kind of nice to be able to see the categories as a set of binary indexes.

cluster_letters <- as.factor(LETTERS[Idents(object=all_scd)])
names(cluster_letters) <- colnames(x=all_scd)
sample_ids <- as.character(cluster_letters)

Now that I have 4 identical vectors, fill them with my chosen names for the samples and whether they do(nt) have that identity.

control_idx <- sample_ids == "A"
all_scd[["control_state"]] <- "Stimulated"
all_scd@meta.data[control_idx, "control_state"] <- "Control"

mock_idx <- sample_ids  == "B"
all_scd[["mock_state"]] <- "Not Mock"
all_scd@meta.data[mock_idx, "control_state"] <- "Mock"

mock_idx <- sample_ids  == "C"
all_scd[["muscular_state"]] <- "Not Muscular"
all_scd@meta.data[mock_idx, "muscular_state"] <- "Muscular"

mock_idx <- sample_ids  == "D"
all_scd[["nasal_state"]] <- "Not Nasal"
all_scd@meta.data[mock_idx, "nasal_state"] <- "Nasal"

Now add these categories to the sample metadata. I think this is a good place to consdier having a sample sheet from Dr. Park with whatever other random information might prove interesting about the samples.

11 Filters and QC

Let us start filtering the data, leading off with a definition of the minimum number of RNAs, minimum amount of rRNA, and maximum mitochondrial. In addition, let us print how much of each are observed before filtering. Before we can print/filter these attributes, we must use the PercentageFeatureSet() to get the numbers…

min_num_rna <- 200
min_pct_ribo <- 5
max_pct_mito <- 20

all_scd <- record_seurat_samples(all_scd, type="num_cells")

all_scd[["percent_mt"]] <- PercentageFeatureSet(all_scd, pattern="^mt-")
all_scd[["percent_ribo"]] <- PercentageFeatureSet(all_scd, pattern="^Rp[sl]")

Show the state before filtering on a per-cell basis across all samples. Start with the number of cells

sample_summaries <- as_tibble(data.frame(
    "id" = c("control", "mock", "muscular", "nasal"),
    "start_cells" = c(
        sum(all_scd@meta.data[["orig.ident"]] == "control"),
        sum(all_scd@meta.data[["orig.ident"]] == "mock"),
        sum(all_scd@meta.data[["orig.ident"]] == "m"),
        sum(all_scd@meta.data[["orig.ident"]] == "n"))))
skim(all_scd[["percent_mt"]])
Data summary
Name all_scd[[“percent_mt”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
percent_mt 0 1 2.26 3.32 0 1.28 1.88 2.69 98.86 ▇▁▁▁▁
skim(all_scd[["percent_ribo"]])
Data summary
Name all_scd[[“percent_ribo”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
percent_ribo 0 1 11.26 9.15 0 5.19 7.46 13.84 51.42 ▇▂▁▁▁
skim(all_scd[["nFeature_RNA"]])
Data summary
Name all_scd[[“nFeature_RNA”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
nFeature_RNA 0 1 2078 1242 18 1124 1702 2798 8128 ▇▆▂▁▁
skim(all_scd[["nCount_RNA"]])
Data summary
Name all_scd[[“nCount_RNA”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
nCount_RNA 0 1 5623 5052 500 2141 3659 7659 53836 ▇▁▁▁▁
## Length and reads are for only those cells with clonotypes.
skim(all_scd[["reads"]])
Data summary
Name all_scd[[“reads”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
reads 39253 0.24 4425 4534 24 1639 3089 5505 53188 ▇▁▁▁▁
skim(all_scd[["length"]])
Data summary
Name all_scd[[“length”]]
Number of rows 51594
Number of columns 1
_______________________
Column type frequency:
numeric 1
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
length 39253 0.24 557.5 58.07 402 519 540 570 1004 ▅▇▁▁▁
## How many cells have specific chains associated with them
sum(!is.na(all_scd$chain))
## [1] 12341

And on a per-sample basis with (new to me) skimr, which provides a pretty summary of the category of interest. The way I wrote the following stanzas should also append new columns to my sample_summaries table comprised of the mean values for these elements.

all_scd <- record_seurat_samples(all_scd, type="num_cells") %>%
  record_seurat_samples(type="nFeature_RNA") %>%
  record_seurat_samples(type="nCount_RNA") %>%
  record_seurat_samples(type="reads", column_name="clonotype_reads") %>%
  record_seurat_samples(type="pct_mito", pattern="^mt-") %>%
  record_seurat_samples(type="pct_ribo", pattern="^Rp[sl]")
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             51594     
## Number of columns          45        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd p0   p25   p50
## 1 nFeature_RNA  control            0             1 1999. 1113. 20 1158  1700.
## 2 nFeature_RNA  m                  0             1 2066. 1275. 22 1101  1651 
## 3 nFeature_RNA  mock               0             1 2086. 1218. 18 1149  1734 
## 4 nFeature_RNA  n                  0             1 2224. 1416. 27 1063. 1734.
##     p75 p100 hist 
## 1 2637. 7532 ▇▇▃▁▁
## 2 2778  7590 ▇▆▂▁▁
## 3 2785  7442 ▇▇▃▁▁
## 4 3228  8128 ▇▅▃▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             51594     
## Number of columns          45        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd  p0   p25  p50
## 1 nCount_RNA    control            0             1 5115. 4137. 500 2149  3618
## 2 nCount_RNA    m                  0             1 5729. 5383. 500 2155  3601
## 3 nCount_RNA    mock               0             1 5539. 4862. 500 2144  3665
## 4 nCount_RNA    n                  0             1 6488. 6052. 500 2094. 3912
##     p75  p100 hist 
## 1 7057. 40853 ▇▂▁▁▁
## 2 7642  53707 ▇▁▁▁▁
## 3 7518  44494 ▇▂▁▁▁
## 4 9417. 53836 ▇▂▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             51594     
## Number of columns          45        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd p0   p25  p50
## 1 reads         control        13209         0.130 7066. 6037. 41 3114. 5365
## 2 reads         m               9664         0.304 3685. 4114. 24 1403  2565
## 3 reads         mock           10835         0.222 4709. 4085. 42 1998. 3618
## 4 reads         n               5545         0.356 3460. 3604. 25 1377  2475
##     p75  p100 hist 
## 1 9344. 53188 ▇▂▁▁▁
## 2 4469  48039 ▇▁▁▁▁
## 3 6198. 40634 ▇▁▁▁▁
## 4 4232. 36105 ▇▁▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             51594     
## Number of columns          46        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate mean   sd p0  p25  p50  p75
## 1 pct_mito      control            0             1 2.47 3.79  0 1.35 1.99 2.92
## 2 pct_mito      m                  0             1 2.32 3.42  0 1.35 1.97 2.75
## 3 pct_mito      mock               0             1 2.10 2.53  0 1.19 1.77 2.55
## 4 pct_mito      n                  0             1 2.06 3.36  0 1.21 1.76 2.45
##   p100 hist 
## 1 98.7 ▇▁▁▁▁
## 2 98.4 ▇▁▁▁▁
## 3 98.9 ▇▁▁▁▁
## 4 97.3 ▇▁▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             51594     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd p0  p25  p50  p75
## 1 pct_ribo      control            0             1 10.0   7.39  0 5.48 7.69 10.9
## 2 pct_ribo      m                  0             1 13.3  10.7   0 5.54 8.34 18.9
## 3 pct_ribo      mock               0             1  9.08  7.41  0 4.44 6.10 10.6
## 4 pct_ribo      n                  0             1 13.7  10.5   0 5.82 8.31 20.8
##   p100 hist 
## 1 51.4 ▇▂▁▁▁
## 2 50.1 ▇▂▂▂▁
## 3 45.0 ▇▂▁▁▁
## 4 48.8 ▇▂▂▂▁
## The recorded information is here, but not printing it for now:
all_scd@misc[["sample_metadata"]]
##         sampleid condition                  gexfile vdjtcells gexcells
## control  control   control 01multi_combined/control       100      100
## mock        mock      mock    01multi_combined/mock       100      100
## m              m  muscular       01multi_combined/m       100      100
## n              n     nasal       01multi_combined/n       100      100
##             batch num_cells mean_nFeature_RNA mean_nCount_RNA
## control undefined     15180              1999            5115
## mock    undefined     13925              2066            5729
## m       undefined     13881              2086            5539
## n       undefined      8608              2224            6488
##         mean_clonotype_reads mean_pct_mito mean_pct_ribo
## control                 7066         2.473        10.001
## mock                    3685         2.322        13.305
## m                       4709         2.096         9.083
## n                       3460         2.065        13.675

Ok, that was fun; lets look at this information as a series of plots:

VlnPlot(all_scd, features="nFeature_RNA", pt.size=0)

VlnPlot(all_scd, features="pct_mito", pt.size=0)

VlnPlot(all_scd, features="pct_ribo", pt.size=0)

VlnPlot(all_scd, features="nCount_RNA", pt.size=0)

VlnPlot(all_scd, features="reads", pt.size=0)
## Warning: Removed 39253 rows containing non-finite values (`stat_ydensity()`).

## I am curious about the length of the clonotype sequences.
VlnPlot(all_scd, features="length", pt.size=0)
## Warning: Removed 39253 rows containing non-finite values (`stat_ydensity()`).

FeatureScatter(all_scd, "pct_ribo", "pct_mito")

FeatureScatter(all_scd, "nCount_RNA", "nFeature_RNA")

FeatureScatter(all_scd, "nCount_RNA", "pct_ribo")

FeatureScatter(all_scd, "nCount_RNA", "pct_mito")

12 Filter samples using our guesstimates

Start with a minimum number of RNAs filter.

sufficient_rna_observed <- WhichCells(all_scd, expression=nFeature_RNA >= min_num_rna)
filt_scd <- subset(all_scd, cells=sufficient_rna_observed)

Second I will check that the number of reads/rna across cells is sufficient, that filter does nothing currently, which I think is good.

## I think this filter does nothing in its current form.
sufficiently_observed_idx <- rowSums(filt_scd) > 3
summary(sufficiently_observed_idx)
##    Mode   FALSE    TRUE 
## logical   11112   21173
dim(filt_scd)
## [1] 32285 51536
filt_scd <- subset(filt_scd, features=rownames(filt_scd)[sufficiently_observed_idx])
dim(filt_scd)
## [1] 21173 51536
## Keep cells with at least some ribosomal reads
## Note the Percent function above actually puts in a floating point
## number from 0-100, not (as I assumed from 0-1).
high_ribosomal <- WhichCells(filt_scd, expression=percent_ribo >= min_pct_ribo)
filt_scd <- subset(filt_scd, cells=high_ribosomal)

Exclude cells with too much mitochondrial RNA

12.1 Now drop mitochondrial genes

low_mitochondrial <- WhichCells(filt_scd, expression=percent_mt <= max_pct_mito)
filt_scd <- subset(filt_scd, cells=low_mitochondrial)

13 Record post-filtered stats

filt_scd <- record_seurat_samples(filt_scd, type="num_cells") %>%
  record_seurat_samples(type="nFeature_RNA") %>%
  record_seurat_samples(type="nCount_RNA") %>%
  record_seurat_samples(type="reads", column_name="clonotype_reads") %>%
  record_seurat_samples(type="pct_mito", pattern="^mt-") %>%
  record_seurat_samples(type="pct_ribo", pattern="^Rp[sl]")
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             40008     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd  p0  p25  p50
## 1 nFeature_RNA  control            0             1 2065. 1147. 240 1177 1774
## 2 nFeature_RNA  m                  0             1 2107. 1320. 221 1096 1648
## 3 nFeature_RNA  mock               0             1 2044. 1237. 248 1089 1665
## 4 nFeature_RNA  n                  0             1 2249. 1440. 303 1057 1744
##     p75 p100 hist 
## 1 2757  7530 ▇▆▂▁▁
## 2 2891  7588 ▇▅▂▁▁
## 3 2775. 7442 ▇▅▂▁▁
## 4 3292  8128 ▇▃▃▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             40008     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd  p0  p25   p50
## 1 nCount_RNA    control            0             1 5431. 4322. 500 2227 3898.
## 2 nCount_RNA    m                  0             1 6048. 5681. 500 2214 3689 
## 3 nCount_RNA    mock               0             1 5608. 5043. 502 2053 3587 
## 4 nCount_RNA    n                  0             1 6715. 6246. 500 2131 4047 
##    p75  p100 hist 
## 1 7649 40851 ▇▂▁▁▁
## 2 8338 53707 ▇▁▁▁▁
## 3 7821 44492 ▇▂▁▁▁
## 4 9926 53836 ▇▂▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             40008     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate  mean    sd p0   p25   p50
## 1 reads         control        10368         0.159 7089. 6045. 41 3116. 5402 
## 2 reads         m               7045         0.373 3694. 4120. 24 1408  2576.
## 3 reads         mock            6107         0.333 4732. 4098. 42 2018  3647 
## 4 reads         n               4236         0.418 3473. 3612. 43 1388  2486 
##     p75  p100 hist 
## 1 9356. 53188 ▇▂▁▁▁
## 2 4474. 48039 ▇▁▁▁▁
## 3 6223  40634 ▇▁▁▁▁
## 4 4252  36105 ▇▁▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             40008     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate mean   sd p0  p25  p50  p75
## 1 pct_mito      control            0             1 2.49 1.45  0 1.56 2.20 3.10
## 2 pct_mito      m                  0             1 2.37 1.29  0 1.59 2.18 2.88
## 3 pct_mito      mock               0             1 2.35 1.35  0 1.54 2.12 2.88
## 4 pct_mito      n                  0             1 2.03 1.05  0 1.36 1.90 2.54
##   p100 hist 
## 1 19.4 ▇▁▁▁▁
## 2 19.4 ▇▁▁▁▁
## 3 19.5 ▇▁▁▁▁
## 4 16.8 ▇▁▁▁▁
## ── Data Summary ────────────────────────
##                            Values    
## Name                       data      
## Number of rows             40008     
## Number of columns          47        
## _______________________              
## Column type frequency:               
##   numeric                  1         
## ________________________             
## Group variables            orig.ident
## 
## ── Variable type: numeric ──────────────────────────────────────────────────────
##   skim_variable orig.ident n_missing complete_rate mean    sd p0  p25   p50  p75
## 1 pct_ribo      control            0             1 11.4  7.54  5 6.69  8.59 12.5
## 2 pct_ribo      m                  0             1 15.5 10.7   5 6.96 10.4  22.6
## 3 pct_ribo      mock               0             1 11.8  7.84  5 6.15  8.24 15.0
## 4 pct_ribo      n                  0             1 15.5 10.4   5 6.75 10.5  23.3
##   p100 hist 
## 1 51.4 ▇▁▁▁▁
## 2 50.1 ▇▂▂▂▁
## 3 45.0 ▇▂▁▁▁
## 4 48.8 ▇▂▂▂▁

Add the new filtered mean values onto the original set.

all_scd@misc$sample_metadata <- cbind(all_scd@misc$sample_metadata, filt_scd@misc$sample_metadata)

14 Distribution

14.1 Before filtering

all_norm <- NormalizeData(object=all_scd) %>%
  FindVariableFeatures() %>%
  ScaleData() %>%
  RunPCA() %>%
  FindNeighbors() %>%
  FindClusters() %>%
  RunTSNE(check_duplicates=FALSE) %>%
  RunUMAP(reduction="pca", dims=1:10)
## Centering and scaling data matrix
## PC_ 1 
## Positive:  Rac2, Coro1a, Arhgdib, Laptm5, Cd3e, Ms4a4b, Selplg, Cd52, Cd3g, Ptprc 
##     Cd3d, Lat, Gimap3, Lck, Ms4a6b, Thy1, Ltb, Ptprcap, Vps37b, Sept1 
##     Il7r, Skap1, Itgb7, Lsp1, Cd53, Cytip, Gramd3, Cd37, Cd2, Fyb 
## Negative:  Sparc, Mettl7a1, Ager, Cd63, Emp2, Cldn18, Selenbp1, Cystm1, Selenbp2, Alcam 
##     Gsn, Limch1, Aqp5, Clic3, Krt7, Cryab, Timp3, Npnt, Scnn1a, Igfbp6 
##     Krt18, Igfbp7, Myh14, Gprc5a, Scd2, Krt8, Fads3, Sec14l3, Mal2, Prnp 
## PC_ 2 
## Positive:  Wfdc2, Atp1b1, Ctsh, Cldn3, Cbr2, Sftpd, Napsa, Sftpb, Cldn7, Cxcl15 
##     Chchd10, Slc34a2, Muc1, Sftpa1, Ppp1r14c, Chil1, Lamp3, Epcam, Ptprf, Krt18 
##     Irx1, Lgi3, Sftpc, Lyz2, Car8, Sdc1, Baiap2l1, Nkx2-1, Scd1, Krt8 
## Negative:  Sod3, Serping1, Prelp, Bgn, Olfml3, Plpp3, Loxl1, Spon1, Tcf21, Hsd11b1 
##     Rarres2, Plxdc2, Col1a2, Col1a1, Fn1, Pdgfra, Itga8, Cdo1, Ptgis, Dpep1 
##     Clec3b, Mfap4, Colec12, Gpx3, Lrp1, Pcolce2, Col3a1, C7, Atp1a2, Mxra8 
## PC_ 3 
## Positive:  Rtkn2, Scnn1g, Spock2, Col4a3, Igfbp2, Pdpn, Scnn1b, Col4a4, Flrt3, Sema3e 
##     Cytl1, Lama3, Hopx, Lamb3, Itgb6, Ndnf, Tmem37, Clic5, Bdnf, Cyp2b10 
##     Crlf1, Ptpre, Sema3a, Tspan8, Krt7, Tacstd2, Cdkn2b, Cyp4b1, Abca5, Hck 
## Negative:  Cbr2, Cldn3, Mgst1, Nupr1, Ppp1r14c, Car8, Cxcl15, Sftpd, Chil1, Muc1 
##     Dram1, Sftpb, Slc34a2, Dynlrb2, Hp, Sftpa1, Lamp3, Cxcl17, Acot1, Lyz2 
##     Foxj1, Napsa, Scd1, Dmkn, Lbp, Fam183b, Cpm, Sftpc, Lgi3, Hdc 
## PC_ 4 
## Positive:  Slc34a2, Lamp3, Napsa, Sftpb, Sftpa1, Sftpc, Cxcl15, Chil1, Lyz2, Dram1 
##     Lgi3, Sftpd, Hc, Scd1, Egfl6, S100g, Muc1, Pla2g1b, Etv5, Fabp5 
##     Ctsc, Lpcat1, Sfta2, Slc26a9, Mlc1, Chia1, Ppp1r14c, Tspan11, Fasn, Kcnj15 
## Negative:  Fam183b, Tmem212, Foxj1, Ccdc153, 1700007K13Rik, Cyp2s1, 1110017D15Rik, Gm19935, Arhgdig, Tctex1d4 
##     Spaca9, BC051019, 1700094D03Rik, Cfap126, 1700001C02Rik, 1700016K19Rik, Rsph1, Gm867, Ccdc113, Nme5 
##     Dnali1, Tekt4, AU040972, Pifo, Odf3b, Sntn, Ak7, 2410004P03Rik, Nme9, Mns1 
## PC_ 5 
## Positive:  Lgals1, Coro1a, Rac2, Laptm5, Arhgdib, Cd3e, Cd52, Selplg, Cd3g, Ms4a4b 
##     Ptprc, Lsp1, Ptprcap, Lat, Thy1, Cytip, Sept1, Cd3d, Lck, Ltb 
##     Ms4a6b, Itgb7, Ifi27l2a, Gimap3, Skap1, Cd37, Icos, Il2rb, Cd2, Cd53 
## Negative:  Ly6a, Tm4sf1, Ly6c1, Sema3c, Kdr, Tmem252, Car4, H2-Ab1, Plaur, Tmcc2 
##     Id1, Efnb2, Cd74, Gja4, Lyve1, Tbx3, Sox17, Emcn, Sema7a, Plk2 
##     H2-Eb1, Scarb1, Nes, Hspb1, Cyp4b1, Prx, Ccnd1, Serpina3i, Id3, H2-Aa
## Computing nearest neighbor graph
## Computing SNN
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 51594
## Number of edges: 1601833
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.9148
## Number of communities: 29
## Elapsed time: 15 seconds
## Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
## To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
## This message will be shown once per session
## 21:31:24 UMAP embedding parameters a = 0.9922 b = 1.112
## 21:31:24 Read 51594 rows and found 10 numeric columns
## 21:31:24 Using Annoy for neighbor search, n_neighbors = 30
## 21:31:24 Building Annoy index with metric = cosine, n_trees = 50
## 0%   10   20   30   40   50   60   70   80   90   100%
## [----|----|----|----|----|----|----|----|----|----|
## **************************************************|
## 21:31:32 Writing NN index file to temp file /tmp/RtmpjW2YO0/file13414146bef84b
## 21:31:32 Searching Annoy index using 1 thread, search_k = 3000
## 21:31:58 Annoy recall = 100%
## 21:32:00 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
## 21:32:05 Initializing from normalized Laplacian + noise (using irlba)
## 21:32:15 Commencing optimization for 200 epochs, with 2133286 positive edges
## 21:32:47 Optimization finished
DimPlot(object=all_norm, reduction="tsne")

plotted <- DimPlot(all_norm, reduction="umap", group.by="orig.ident", label=TRUE)
plotted

14.2 After filtering

fnorm_scd <- NormalizeData(object=filt_scd) %>%
  FindVariableFeatures() %>%
  ScaleData() %>%
  RunPCA() %>%
  FindNeighbors() %>%
  FindClusters() %>%
  RunTSNE() %>%
  RunUMAP(reduction="pca", dims=1:10)
## Centering and scaling data matrix
## PC_ 1 
## Positive:  Rac2, Coro1a, Arhgdib, Laptm5, Cd3e, Ms4a4b, Selplg, Cd52, Cd3g, Ptprc 
##     Cd3d, Lat, Lck, Ms4a6b, Thy1, Ltb, Ptprcap, Il7r, Itgb7, Lsp1 
##     Gramd3, Fyb, Cd2, Cd28, Icos, Cd69, Bin2, Il2rb, AW112010, Itgb2 
## Negative:  Sparc, Emp2, Cd63, Igfbp7, Mettl7a1, Ager, Gsn, Cldn18, Timp3, Limch1 
##     Selenbp1, Cystm1, Cst3, Gpx3, Selenbp2, Cryab, Npnt, Bcam, Bgn, Clic3 
##     Aqp5, Pmp22, Alcam, Apoe, Ces1d, Krt7, Hspb1, Anxa3, Col4a1, Fhl1 
## PC_ 2 
## Positive:  Bgn, Serping1, Sod3, Plpp3, Prelp, Rarres2, Col1a2, Sparcl1, Hsd11b1, Olfml3 
##     Tcf21, Col1a1, Loxl1, Clec3b, Vim, Ptgis, Mxra8, Spon1, Plxdc2, Gpx3 
##     Fhl1, Fxyd1, Ltbp4, Col3a1, Ppp1r14a, Lrp1, Cdo1, Pcolce2, Mfap4, Fn1 
## Negative:  Sftpd, Napsa, Sftpb, Cxcl15, Slc34a2, Wfdc2, Cbr2, Sftpa1, Cldn3, Atp1b1 
##     Chil1, Lamp3, Muc1, Ppp1r14c, Sftpc, Lgi3, Lyz2, Dram1, Ctsh, Scd1 
##     Hc, Car8, Egfl6, S100g, Lpcat1, Irx1, Pi4k2b, Pla2g1b, Abca3, Ank3 
## PC_ 3 
## Positive:  Mgst1, Col6a1, Nupr1, Loxl1, Col3a1, Col1a1, Sod3, Col1a2, Dram1, C3 
##     Ces1d, Col6a2, Apoe, Slc34a2, Cxcl15, Mmp2, Chil1, Lamp3, Plxdc2, Sftpb 
##     Dpep1, Pdgfra, Lyz2, Prelp, Sftpd, Sftpa1, Spon1, Cd302, Napsa, Serping1 
## Negative:  Rtkn2, Scnn1g, Spock2, Hopx, Igfbp2, Col4a3, Cyp4b1, Sema3e, Clic5, Cyp2b10 
##     Pdpn, Scnn1b, Col4a4, Lama3, Flrt3, Tacstd2, Krt7, Tspan8, Cytl1, Sec14l3 
##     Lamb3, Krt19, Cdkn2b, Itgb6, Mab21l4, Tmem37, Scnn1a, Clic3, Lmo7, Ndnf 
## PC_ 4 
## Positive:  Lgals1, S100a6, Birc5, Mki67, Pclaf, Lgals3, Top2a, Ccna2, Anxa1, Ube2c 
##     Coro1a, Prdx6, Rac2, Cdk1, Tacstd2, Ccnb2, Rrm2, Aurkb, Pdpn, Cyp2b10 
##     Laptm5, Sema3e, S100a11, Arhgdib, Cdca8, Krt19, Knl1, Tk1, Lsp1, Cd52 
## Negative:  Cldn5, Plvap, Hpgd, Cd93, H2-Ab1, Cd74, Tmem252, Sema3c, H2-Eb1, H2-Aa 
##     Pcdh1, Mcam, Gja4, Efnb2, Stmn2, Lyve1, Tm4sf1, Sox17, Dll4, Kdr 
##     Ly6c1, Plk2, Hspa1a, Tmcc2, Emcn, Ly6a, Ifitm3, Hspa1b, Scn7a, Car4 
## PC_ 5 
## Positive:  Col4a4, Aqp5, Scnn1g, Ager, Rtkn2, Ndnf, Col4a3, Slc39a8, Gprc5a, Spock2 
##     Tmem37, Pdpn, Scnn1b, Igfbp6, Flrt3, Igfbp2, Crlf1, Scd2, Lamb3, Fads3 
##     Rgcc, Cldn18, Itgb6, Tmod1, Mal2, Rnase4, Fam189a2, Hs2st1, Abca5, Lamc2 
## Negative:  Fam183b, Foxj1, Tmem212, 1700007K13Rik, 1110017D15Rik, Ccdc153, Gm19935, Cfap126, Spaca9, Tctex1d4 
##     BC051019, 1700094D03Rik, Odf3b, 1700001C02Rik, 1700016K19Rik, Tekt4, Dnali1, Rsph1, Cyp2s1, AU040972 
##     Ak7, Ccdc113, Sntn, Gm867, Nme5, Nme9, 2410004P03Rik, Dynlrb2, Pifo, Lrrc10b
## Computing nearest neighbor graph
## Computing SNN
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 40008
## Number of edges: 1239751
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.9087
## Number of communities: 24
## Elapsed time: 11 seconds
## 21:37:44 UMAP embedding parameters a = 0.9922 b = 1.112
## 21:37:44 Read 40008 rows and found 10 numeric columns
## 21:37:44 Using Annoy for neighbor search, n_neighbors = 30
## 21:37:44 Building Annoy index with metric = cosine, n_trees = 50
## 0%   10   20   30   40   50   60   70   80   90   100%
## [----|----|----|----|----|----|----|----|----|----|
## **************************************************|
## 21:37:51 Writing NN index file to temp file /tmp/RtmpjW2YO0/file134141e0af54a
## 21:37:51 Searching Annoy index using 1 thread, search_k = 3000
## 21:38:10 Annoy recall = 100%
## 21:38:12 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
## 21:38:17 Initializing from normalized Laplacian + noise (using irlba)
## 21:38:24 Commencing optimization for 200 epochs, with 1638822 positive edges
## 21:38:46 Optimization finished
DimPlot(object=fnorm_scd, reduction="tsne")

plotted <- DimPlot(fnorm_scd, reduction="umap", group.by="orig.ident", label=TRUE)
plotted

fnorm_scd <- JackStraw(fnorm_scd, num.replicate=10)
fnorm_scd <- ScoreJackStraw(fnorm_scd)
JackStrawPlot(fnorm_scd)
## Warning: Removed 7000 rows containing missing values (`geom_point()`).

ElbowPlot(fnorm_scd)

## So I am thinking maybe 4-10?
wanted_dims <- 6

fnorm_scd <- FindNeighbors(fnorm_scd, dims=1:wanted_dims) %>%
  FindClusters(resolution=0.5) %>%
  StashIdent(save.name="res0p5_clusters")
## Computing nearest neighbor graph
## Computing SNN
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 40008
## Number of edges: 1172946
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.9258
## Number of communities: 19
## Elapsed time: 9 seconds
## With Seurat 3.X, stashing identity classes can be accomplished with the following:
## .[["res0p5_clusters"]] <- Idents(object = .)
RunUMAP(fnorm_scd, dims=1:9)
## 21:41:36 UMAP embedding parameters a = 0.9922 b = 1.112
## 21:41:36 Read 40008 rows and found 9 numeric columns
## 21:41:36 Using Annoy for neighbor search, n_neighbors = 30
## 21:41:36 Building Annoy index with metric = cosine, n_trees = 50
## 0%   10   20   30   40   50   60   70   80   90   100%
## [----|----|----|----|----|----|----|----|----|----|
## **************************************************|
## 21:41:43 Writing NN index file to temp file /tmp/RtmpjW2YO0/file1341414487935a
## 21:41:43 Searching Annoy index using 1 thread, search_k = 3000
## 21:42:03 Annoy recall = 100%
## 21:42:04 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
## 21:42:09 Initializing from normalized Laplacian + noise (using irlba)
## 21:42:17 Commencing optimization for 200 epochs, with 1633254 positive edges
## 21:42:37 Optimization finished
## An object of class Seurat 
## 21173 features across 40008 samples within 1 assay 
## Active assay: RNA (21173 features, 2000 variable features)
##  3 dimensional reductions calculated: pca, tsne, umap
DimPlot(fnorm_scd, label=TRUE)

fnorm_scd <- FindClusters(fnorm_scd, resolution=0.1) %>%
  FindNeighbors(k.param=6) %>%
  StashIdent(save.name="res0p1_clusters")
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
## 
## Number of nodes: 40008
## Number of edges: 1172946
## 
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.9704
## Number of communities: 7
## Elapsed time: 12 seconds
## Computing nearest neighbor graph
## Computing SNN
## With Seurat 3.X, stashing identity classes can be accomplished with the following:
## .[["res0p1_clusters"]] <- Idents(object = .)
RunUMAP(fnorm_scd, dims=1:9)
## 21:43:03 UMAP embedding parameters a = 0.9922 b = 1.112
## 21:43:03 Read 40008 rows and found 9 numeric columns
## 21:43:03 Using Annoy for neighbor search, n_neighbors = 30
## 21:43:03 Building Annoy index with metric = cosine, n_trees = 50
## 0%   10   20   30   40   50   60   70   80   90   100%
## [----|----|----|----|----|----|----|----|----|----|
## **************************************************|
## 21:43:10 Writing NN index file to temp file /tmp/RtmpjW2YO0/file1341414bb1934
## 21:43:10 Searching Annoy index using 1 thread, search_k = 3000
## 21:43:30 Annoy recall = 100%
## 21:43:32 Commencing smooth kNN distance calibration using 1 thread with target n_neighbors = 30
## 21:43:37 Initializing from normalized Laplacian + noise (using irlba)
## 21:43:44 Commencing optimization for 200 epochs, with 1633254 positive edges
## 21:44:05 Optimization finished
## An object of class Seurat 
## 21173 features across 40008 samples within 1 assay 
## Active assay: RNA (21173 features, 2000 variable features)
##  3 dimensional reductions calculated: pca, tsne, umap
DimPlot(fnorm_scd, label=TRUE)

Add into the metadata a concatenation of the sample ID and the cluster ID

identity_vector <- fnorm_scd[["orig.ident"]][["orig.ident"]]
class(identity_vector)
## [1] "character"
cluster_vector <- as.character(fnorm_scd[["res0p1_clusters"]][["res0p1_clusters"]])
concatenated_vector <- paste0(identity_vector, "_", cluster_vector)
fnorm_scd[["cluster_sample"]] <- concatenated_vector

15 Add these new clusters to our non-normalized data

I am not yet certain of how Seurat handles (non)normalized data for the various FindMarkers functions. Thus, I am adding the clusters from the dimension reductions to the non-normalized data here.

filt_scd[["res0p1_clusters"]] <- fnorm_scd[["res0p1_clusters"]]
filt_scd[["cluster_sample"]] <- fnorm_scd[["cluster_sample"]]

16 Variable features

var <- FindVariableFeatures(fnorm_scd)
most_var <- head(VariableFeatures(var), 30)
variable_plot <- VariableFeaturePlot(var)
variable_plot <- LabelPoints(plot=variable_plot, points=most_var, repel=TRUE)
## When using repel, set xnudge and ynudge to 0 for optimal results
variable_plot
## Warning: Transformation introduced infinite values in continuous x-axis
## Warning: ggrepel: 14 unlabeled data points (too many overlaps). Consider
## increasing max.overlaps

17 Various marker searches

17.1 All Markers

17.1.1 By sample

Question: Is it smart enough to use the raw data if I give FindAllMarkers the normalized data? For the moment I do not think I will risk it.

combined_markers <- FindAllMarkers(filt_scd, only.pos=TRUE, logfc.threshold=0.5)
## Calculating cluster control
## Calculating cluster m
## Calculating cluster mock
## Calculating cluster n
head(combined_markers)
##              p_val avg_log2FC pct.1 pct.2  p_val_adj cluster    gene
## Tmem252  0.000e+00     1.0024 0.491 0.311  0.000e+00 control Tmem252
## Plvap    0.000e+00     0.8014 0.599 0.410  0.000e+00 control   Plvap
## Eng      0.000e+00     0.5932 0.625 0.446  0.000e+00 control     Eng
## Ctla2a  2.069e-303     0.6391 0.672 0.518 4.382e-299 control  Ctla2a
## Lyve1   3.612e-291     0.5805 0.411 0.240 7.647e-287 control   Lyve1
## Atf3    1.289e-266     0.5544 0.721 0.543 2.730e-262 control    Atf3
combined <- as.data.frame(combined_markers)
rownames(combined) <- toupper(rownames(combined))
annotated_markers <- merge(combined, brief, by.x="row.names", by.y="hgnc_symbol",
                           all.x=TRUE)

17.1.2 By sample

combined_markers <- FindAllMarkers(filt_scd, only.pos=TRUE, logfc.threshold=0.5)
## Calculating cluster control
## Calculating cluster m
## Calculating cluster mock
## Calculating cluster n
combined <- as.data.frame(combined_markers)
rownames(combined) <- toupper(rownames(combined))
annotated_markers <- merge(combined, brief, by.x="row.names", by.y="hgnc_symbol",
                           all.x=TRUE)
head(annotated_markers)
##   Row.names      p_val avg_log2FC pct.1 pct.2  p_val_adj cluster gene
## 1      AGER  6.586e-14     0.5312 0.442 0.422  1.394e-09       n Ager
## 2      APOD  0.000e+00     1.5162 0.236 0.062  0.000e+00       n Apod
## 3      ATF3 1.289e-266     0.5544 0.721 0.543 2.730e-262 control Atf3
## 4       B2M 2.881e-294     0.7894 0.990 0.961 6.099e-290       n  B2m
## 5      BST2  0.000e+00     0.8906 0.844 0.659  0.000e+00    mock Bst2
## 6     BST21 2.627e-245     1.0587 0.786 0.683 5.562e-241       n Bst2
##                                                                              description
## 1 advanced glycosylation end-product specific receptor [Source:HGNC Symbol;Acc:HGNC:320]
## 2                                     apolipoprotein D [Source:HGNC Symbol;Acc:HGNC:612]
## 3                    activating transcription factor 3 [Source:HGNC Symbol;Acc:HGNC:785]
## 4                                 beta-2-microglobulin [Source:HGNC Symbol;Acc:HGNC:914]
## 5                  bone marrow stromal cell antigen 2 [Source:HGNC Symbol;Acc:HGNC:1119]
## 6                                                                                   <NA>

17.1.3 By Cluster

Since I am not using the fnorm_scd data structure, I will need to pull the cluster information from the normalized copy…

cluster_scd <- filt_scd
Idents(cluster_scd) <- cluster_scd[["res0p1_clusters"]]
cluster_markers <- FindAllMarkers(cluster_scd, only.pos=TRUE, logfc.threshold=0.5)
## Calculating cluster 0
## Calculating cluster 1
## Calculating cluster 2
## Calculating cluster 3
## Calculating cluster 4
## Calculating cluster 5
## Calculating cluster 6
cluster_genes <- as.data.frame(cluster_markers)
rownames(cluster_genes) <- toupper(rownames(cluster_genes))
annotated_clusters <- merge(cluster_genes, brief, by.x="row.names", by.y="hgnc_symbol",
                           all.x=TRUE)
head(annotated_clusters)
##        Row.names     p_val avg_log2FC pct.1 pct.2 p_val_adj cluster
## 1  0610012G03RIK 0.000e+00     0.5489 0.606 0.293 0.000e+00       4
## 2  1110004F10RIK 0.000e+00     0.6244 0.658 0.321 0.000e+00       4
## 3  1110008P14RIK 0.000e+00     0.6551 0.610 0.242 0.000e+00       2
## 4 1110008P14RIK1 0.000e+00     0.7474 0.684 0.285 0.000e+00       4
## 5 1110008P14RIK2 1.536e-15     0.5203 0.551 0.313 3.252e-11       6
## 6  1110017D15RIK 0.000e+00     2.9425 0.944 0.002 0.000e+00       6
##            gene description
## 1 0610012G03Rik        <NA>
## 2 1110004F10Rik        <NA>
## 3 1110008P14Rik        <NA>
## 4 1110008P14Rik        <NA>
## 5 1110008P14Rik        <NA>
## 6 1110017D15Rik        <NA>
annotated_clusters %>%
  group_by(cluster) %>%
  dplyr::top_n(n=10, wt=avg_log2FC) %>%
  as.data.frame()
##    Row.names      p_val avg_log2FC pct.1 pct.2  p_val_adj cluster     gene
## 1      AGER1  0.000e+00     3.7834 0.979 0.383  0.000e+00       4     Ager
## 2      AQP51  0.000e+00     2.9905 0.956 0.228  0.000e+00       4     Aqp5
## 3   AU040972  0.000e+00     4.8511 0.893 0.001  0.000e+00       6 AU040972
## 4        BGN  0.000e+00     2.2803 0.993 0.375  0.000e+00       3      Bgn
## 5     CALCRL  0.000e+00     0.9969 0.819 0.317  0.000e+00       0   Calcrl
## 6       CBR2  0.000e+00     4.3375 0.980 0.055  0.000e+00       2     Cbr2
## 7      CBR21 4.429e-184     3.7510 0.985 0.233 9.377e-180       6     Cbr2
## 8       CCL4  0.000e+00     2.4403 0.198 0.024  0.000e+00       5     Ccl4
## 9       CCL5  0.000e+00     2.0472 0.261 0.046  0.000e+00       1     Ccl5
## 10      CCL6  0.000e+00     2.9675 0.328 0.006  0.000e+00       5     Ccl6
## 11      CCR7  0.000e+00     1.4132 0.446 0.052  0.000e+00       1     Ccr7
## 12    CD24A1 3.691e-227     3.7296 0.980 0.214 7.814e-223       6    Cd24a
## 13      CD3E  0.000e+00     1.4123 0.871 0.131  0.000e+00       1     Cd3e
## 14      CD3G  0.000e+00     1.2805 0.798 0.096  0.000e+00       1     Cd3g
## 15      CD52  0.000e+00     1.2322 0.818 0.120  0.000e+00       1     Cd52
## 16     CHIL1  0.000e+00     4.5050 0.956 0.023  0.000e+00       2    Chil1
## 17     CLDN5  0.000e+00     1.1284 0.864 0.322  0.000e+00       0    Cldn5
## 18    CLIC31  0.000e+00     2.9544 0.988 0.259  0.000e+00       4    Clic3
## 19    COL3A1  0.000e+00     2.2265 0.735 0.111  0.000e+00       3   Col3a1
## 20   CORO1A1  0.000e+00     2.5876 0.807 0.348  0.000e+00       5   Coro1a
## 21    CXCL15  0.000e+00     5.4208 0.992 0.054  0.000e+00       2   Cxcl15
## 22  CYP2B101  0.000e+00     2.8234 0.923 0.124  0.000e+00       4  Cyp2b10
## 23   CYP2F21  0.000e+00     4.7064 0.842 0.062  0.000e+00       6   Cyp2f2
## 24       DCN  0.000e+00     2.2901 0.197 0.014  0.000e+00       3      Dcn
## 25     EGFL7  0.000e+00     1.1288 0.914 0.357  0.000e+00       0    Egfl7
## 26     EMP21  0.000e+00     2.9421 0.998 0.515  0.000e+00       4     Emp2
## 27       ENG  0.000e+00     1.0684 0.866 0.345  0.000e+00       0      Eng
## 28   FAM183B  0.000e+00     3.8069 0.985 0.001  0.000e+00       6  Fam183b
## 29   GPIHBP1  0.000e+00     1.1059 0.845 0.322  0.000e+00       0  Gpihbp1
## 30     GPX31  0.000e+00     2.2369 0.957 0.423  0.000e+00       3     Gpx3
## 31      GSN1  0.000e+00     2.7082 0.991 0.418  0.000e+00       3      Gsn
## 32    H2AFZ1  0.000e+00     2.6822 0.940 0.750  0.000e+00       5    H2afz
## 33     HMGB2  0.000e+00     3.2449 0.716 0.379  0.000e+00       5    Hmgb2
## 34     HOPX1  0.000e+00     3.5088 0.997 0.518  0.000e+00       4     Hopx
## 35       HP1 7.150e-159     4.0364 0.893 0.186 1.514e-154       6       Hp
## 36      HPGD  0.000e+00     1.0586 0.757 0.298  0.000e+00       0     Hpgd
## 37      IL7R  0.000e+00     1.3570 0.708 0.087  0.000e+00       1     Il7r
## 38     INMT1  0.000e+00     2.3873 0.815 0.327  0.000e+00       3     Inmt
## 39    KRT191  0.000e+00     2.8780 0.969 0.180  0.000e+00       4    Krt19
## 40     KRT71  0.000e+00     3.2929 0.996 0.268  0.000e+00       4     Krt7
## 41   LGALS11  0.000e+00     3.0568 0.842 0.444  0.000e+00       5   Lgals1
## 42       LTB  0.000e+00     1.2300 0.729 0.104  0.000e+00       1      Ltb
## 43      LYZ1  0.000e+00     5.6451 0.583 0.044  0.000e+00       2     Lyz1
## 44      LYZ2  0.000e+00     5.9383 0.961 0.116  0.000e+00       2     Lyz2
## 45     MFAP4  0.000e+00     2.6800 0.893 0.321  0.000e+00       3    Mfap4
## 46       MGP  0.000e+00     2.3298 0.868 0.236  0.000e+00       3      Mgp
## 47     MKI67  0.000e+00     2.3501 0.508 0.011  0.000e+00       5    Mki67
## 48    MS4A4B  0.000e+00     1.6335 0.829 0.098  0.000e+00       1   Ms4a4b
## 49      PLTP  0.000e+00     1.0803 0.899 0.396  0.000e+00       0     Pltp
## 50     PLVAP  0.000e+00     1.2741 0.827 0.315  0.000e+00       0    Plvap
## 51    PRDX61  0.000e+00     2.8102 0.998 0.671  0.000e+00       4    Prdx6
## 52      RAC2  0.000e+00     1.3101 0.914 0.139  0.000e+00       1     Rac2
## 53     RAMP2  0.000e+00     1.1862 0.937 0.368  0.000e+00       0    Ramp2
## 54   RETNLA1 8.850e-126     3.9645 0.398 0.044 1.874e-121       6   Retnla
## 55    S100A6  0.000e+00     2.8077 0.992 0.496  0.000e+00       4   S100a6
## 56  SCGB1A11  5.313e-84     6.1010 0.888 0.452  1.125e-79       6  Scgb1a1
## 57   SCGB3A2 1.096e-242     3.6340 0.260 0.010 2.320e-238       6  Scgb3a2
## 58  SERPING1  0.000e+00     2.4296 0.975 0.283  0.000e+00       3 Serping1
## 59    SFTPA1  0.000e+00     6.3368 0.994 0.104  0.000e+00       2   Sftpa1
## 60     SFTPB  0.000e+00     5.5744 0.995 0.059  0.000e+00       2    Sftpb
## 61     SFTPC  0.000e+00     7.2041 0.993 0.471  0.000e+00       2    Sftpc
## 62     SFTPD  0.000e+00     4.9517 0.994 0.038  0.000e+00       2    Sftpd
## 63   SLC34A2  0.000e+00     4.2143 0.974 0.018  0.000e+00       2  Slc34a2
## 64      SOD3  0.000e+00     2.6096 0.982 0.230  0.000e+00       3     Sod3
## 65    TPPP31 6.865e-231     3.7106 0.990 0.217 1.454e-226       6    Tppp3
## 66    TSPAN7  0.000e+00     1.2372 0.905 0.351  0.000e+00       0   Tspan7
## 67    TUBB51 2.543e-198     2.4460 0.819 0.707 5.384e-194       5    Tubb5
## 68    TYROBP  0.000e+00     2.6053 0.439 0.017  0.000e+00       5   Tyrobp
## 69     UBE2C  0.000e+00     2.5058 0.421 0.007  0.000e+00       5    Ube2c
## 70    VPS37B  0.000e+00     1.3906 0.781 0.197  0.000e+00       1   Vps37b
##                                                                                                             description
## 1                                                                                                                  <NA>
## 2                                                                                                                  <NA>
## 3                                                                                                                  <NA>
## 4                                                                           biglycan [Source:HGNC Symbol;Acc:HGNC:1044]
## 5                                                 calcitonin receptor like receptor [Source:HGNC Symbol;Acc:HGNC:16709]
## 6                                                                                                                  <NA>
## 7                                                                                                                  <NA>
## 8                                                      C-C motif chemokine ligand 4 [Source:HGNC Symbol;Acc:HGNC:10630]
## 9                                                      C-C motif chemokine ligand 5 [Source:HGNC Symbol;Acc:HGNC:10632]
## 10                                                                                                                 <NA>
## 11                                                    C-C motif chemokine receptor 7 [Source:HGNC Symbol;Acc:HGNC:1608]
## 12                                                                                                                 <NA>
## 13                                                                     CD3e molecule [Source:HGNC Symbol;Acc:HGNC:1674]
## 14                                                                     CD3g molecule [Source:HGNC Symbol;Acc:HGNC:1675]
## 15                                                                     CD52 molecule [Source:HGNC Symbol;Acc:HGNC:1804]
## 16                                                                                                                 <NA>
## 17                                                                         claudin 5 [Source:HGNC Symbol;Acc:HGNC:2047]
## 18                                                                                                                 <NA>
## 19                                                   collagen type III alpha 1 chain [Source:HGNC Symbol;Acc:HGNC:2201]
## 20                                                                                                                 <NA>
## 21                                                                                                                 <NA>
## 22                                                                                                                 <NA>
## 23                                                                                                                 <NA>
## 24                                                                           decorin [Source:HGNC Symbol;Acc:HGNC:2705]
## 25                                                       EGF like domain multiple 7 [Source:HGNC Symbol;Acc:HGNC:20594]
## 26                                                                                                                 <NA>
## 27                                                                          endoglin [Source:HGNC Symbol;Acc:HGNC:3349]
## 28                                                                                                                 <NA>
## 29 glycosylphosphatidylinositol anchored high density lipoprotein binding protein 1 [Source:HGNC Symbol;Acc:HGNC:24945]
## 30                                                                                                                 <NA>
## 31                                                                                                                 <NA>
## 32                                                                                                                 <NA>
## 33                                                         high mobility group box 2 [Source:HGNC Symbol;Acc:HGNC:5000]
## 34                                                                                                                 <NA>
## 35                                                                                                                 <NA>
## 36                                             15-hydroxyprostaglandin dehydrogenase [Source:HGNC Symbol;Acc:HGNC:5154]
## 37                                                            interleukin 7 receptor [Source:HGNC Symbol;Acc:HGNC:6024]
## 38                                                                                                                 <NA>
## 39                                                                                                                 <NA>
## 40                                                                       keratin 71 [Source:HGNC Symbol;Acc:HGNC:28927]
## 41                                                                                                                 <NA>
## 42                                                                  lymphotoxin beta [Source:HGNC Symbol;Acc:HGNC:6711]
## 43                                                                                                                 <NA>
## 44                                                                                                                 <NA>
## 45                                                  microfibril associated protein 4 [Source:HGNC Symbol;Acc:HGNC:7035]
## 46                                                                matrix Gla protein [Source:HGNC Symbol;Acc:HGNC:7060]
## 47                                                     marker of proliferation Ki-67 [Source:HGNC Symbol;Acc:HGNC:7107]
## 48                                                                                                                 <NA>
## 49                                                     phospholipid transfer protein [Source:HGNC Symbol;Acc:HGNC:9093]
## 50                                           plasmalemma vesicle associated protein [Source:HGNC Symbol;Acc:HGNC:13635]
## 51                                                                                                                 <NA>
## 52                                                         Rac family small GTPase 2 [Source:HGNC Symbol;Acc:HGNC:9802]
## 53                                             receptor activity modifying protein 2 [Source:HGNC Symbol;Acc:HGNC:9844]
## 54                                                                                                                 <NA>
## 55                                                  S100 calcium binding protein A6 [Source:HGNC Symbol;Acc:HGNC:10496]
## 56                                                                                                                 <NA>
## 57                                                 secretoglobin family 3A member 2 [Source:HGNC Symbol;Acc:HGNC:18391]
## 58                                                          serpin family G member 1 [Source:HGNC Symbol;Acc:HGNC:1228]
## 59                                                            surfactant protein A1 [Source:HGNC Symbol;Acc:HGNC:10798]
## 60                                                             surfactant protein B [Source:HGNC Symbol;Acc:HGNC:10801]
## 61                                                             surfactant protein C [Source:HGNC Symbol;Acc:HGNC:10802]
## 62                                                             surfactant protein D [Source:HGNC Symbol;Acc:HGNC:10803]
## 63                                                solute carrier family 34 member 2 [Source:HGNC Symbol;Acc:HGNC:11020]
## 64                                                           superoxide dismutase 3 [Source:HGNC Symbol;Acc:HGNC:11181]
## 65                                                                                                                 <NA>
## 66                                                                    tetraspanin 7 [Source:HGNC Symbol;Acc:HGNC:11854]
## 67                                                                                                                 <NA>
## 68                                    transmembrane immune signaling adaptor TYROBP [Source:HGNC Symbol;Acc:HGNC:12449]
## 69                                                ubiquitin conjugating enzyme E2 C [Source:HGNC Symbol;Acc:HGNC:15937]
## 70                                                        VPS37B subunit of ESCRT-I [Source:HGNC Symbol;Acc:HGNC:25754]
sum(cluster_scd[["res0p1_clusters"]] == "0")
## [1] 11970
sum(cluster_scd[["res0p1_clusters"]] == "0" &
    !is.na(cluster_scd[["raw_clonotype_id"]]))
## [1] 891
sum(cluster_scd[["res0p1_clusters"]] == "1")
## [1] 11495
sum(cluster_scd[["res0p1_clusters"]] == "1" &
    !is.na(cluster_scd[["raw_clonotype_id"]]))
## [1] 9592
sum(cluster_scd[["res0p1_clusters"]] == "2")
## [1] 7852
sum(cluster_scd[["res0p1_clusters"]] == "2" &
    !is.na(cluster_scd[["raw_clonotype_id"]]))
## [1] 455
sum(cluster_scd[["res0p1_clusters"]] == "3")
## [1] 3940
sum(cluster_scd[["res0p1_clusters"]] == "3" &
    !is.na(cluster_scd[["raw_clonotype_id"]]))
## [1] 309
sum(cluster_scd[["res0p1_clusters"]] == "4")
## [1] 2895
sum(cluster_scd[["res0p1_clusters"]] == "4" &
    !is.na(cluster_scd[["raw_clonotype_id"]]))
## [1] 261
sum(cluster_scd[["res0p1_clusters"]] == "5")
## [1] 1660
sum(cluster_scd[["res0p1_clusters"]] == "5" &
    !is.na(cluster_scd[["raw_clonotype_id"]]))
## [1] 719
sum(cluster_scd[["res0p1_clusters"]] == "6")
## [1] 196
sum(cluster_scd[["res0p1_clusters"]] == "6" &
    !is.na(cluster_scd[["raw_clonotype_id"]]))
## [1] 25

Clusters 0 and 5 have a great majority of the clonotypes. 0 has something like 90%, 5 has ~ 30%, the others ~ 10%

17.2 Compare specific clusters

17.2.1 Look at cluster 0, Nasal vs. Control

test_group <- cluster_scd[["cluster_sample"]] == "control_0"
sum(test_group)
## [1] 5008
test_group <- cluster_scd[["cluster_sample"]] == "n_0"
sum(test_group)
## [1] 1061
controln_0 <- FindMarkers(
    cluster_scd, group.by="cluster_sample",
    ident.1="control_0", ident.2="n_0")
controln_0 <- as.data.frame(controln_0)
rownames(controln_0) <- toupper(rownames(controln_0))
controln_0 <- merge(controln_0, brief, by="row.names", by.y="hgnc_symbol",
                    all.x=TRUE)

annotated_clusters %>%
  group_by(cluster) %>%
  dplyr::top_n(n=10, wt=avg_log2FC) %>%
  as.data.frame()
##    Row.names      p_val avg_log2FC pct.1 pct.2  p_val_adj cluster     gene
## 1      AGER1  0.000e+00     3.7834 0.979 0.383  0.000e+00       4     Ager
## 2      AQP51  0.000e+00     2.9905 0.956 0.228  0.000e+00       4     Aqp5
## 3   AU040972  0.000e+00     4.8511 0.893 0.001  0.000e+00       6 AU040972
## 4        BGN  0.000e+00     2.2803 0.993 0.375  0.000e+00       3      Bgn
## 5     CALCRL  0.000e+00     0.9969 0.819 0.317  0.000e+00       0   Calcrl
## 6       CBR2  0.000e+00     4.3375 0.980 0.055  0.000e+00       2     Cbr2
## 7      CBR21 4.429e-184     3.7510 0.985 0.233 9.377e-180       6     Cbr2
## 8       CCL4  0.000e+00     2.4403 0.198 0.024  0.000e+00       5     Ccl4
## 9       CCL5  0.000e+00     2.0472 0.261 0.046  0.000e+00       1     Ccl5
## 10      CCL6  0.000e+00     2.9675 0.328 0.006  0.000e+00       5     Ccl6
## 11      CCR7  0.000e+00     1.4132 0.446 0.052  0.000e+00       1     Ccr7
## 12    CD24A1 3.691e-227     3.7296 0.980 0.214 7.814e-223       6    Cd24a
## 13      CD3E  0.000e+00     1.4123 0.871 0.131  0.000e+00       1     Cd3e
## 14      CD3G  0.000e+00     1.2805 0.798 0.096  0.000e+00       1     Cd3g
## 15      CD52  0.000e+00     1.2322 0.818 0.120  0.000e+00       1     Cd52
## 16     CHIL1  0.000e+00     4.5050 0.956 0.023  0.000e+00       2    Chil1
## 17     CLDN5  0.000e+00     1.1284 0.864 0.322  0.000e+00       0    Cldn5
## 18    CLIC31  0.000e+00     2.9544 0.988 0.259  0.000e+00       4    Clic3
## 19    COL3A1  0.000e+00     2.2265 0.735 0.111  0.000e+00       3   Col3a1
## 20   CORO1A1  0.000e+00     2.5876 0.807 0.348  0.000e+00       5   Coro1a
## 21    CXCL15  0.000e+00     5.4208 0.992 0.054  0.000e+00       2   Cxcl15
## 22  CYP2B101  0.000e+00     2.8234 0.923 0.124  0.000e+00       4  Cyp2b10
## 23   CYP2F21  0.000e+00     4.7064 0.842 0.062  0.000e+00       6   Cyp2f2
## 24       DCN  0.000e+00     2.2901 0.197 0.014  0.000e+00       3      Dcn
## 25     EGFL7  0.000e+00     1.1288 0.914 0.357  0.000e+00       0    Egfl7
## 26     EMP21  0.000e+00     2.9421 0.998 0.515  0.000e+00       4     Emp2
## 27       ENG  0.000e+00     1.0684 0.866 0.345  0.000e+00       0      Eng
## 28   FAM183B  0.000e+00     3.8069 0.985 0.001  0.000e+00       6  Fam183b
## 29   GPIHBP1  0.000e+00     1.1059 0.845 0.322  0.000e+00       0  Gpihbp1
## 30     GPX31  0.000e+00     2.2369 0.957 0.423  0.000e+00       3     Gpx3
## 31      GSN1  0.000e+00     2.7082 0.991 0.418  0.000e+00       3      Gsn
## 32    H2AFZ1  0.000e+00     2.6822 0.940 0.750  0.000e+00       5    H2afz
## 33     HMGB2  0.000e+00     3.2449 0.716 0.379  0.000e+00       5    Hmgb2
## 34     HOPX1  0.000e+00     3.5088 0.997 0.518  0.000e+00       4     Hopx
## 35       HP1 7.150e-159     4.0364 0.893 0.186 1.514e-154       6       Hp
## 36      HPGD  0.000e+00     1.0586 0.757 0.298  0.000e+00       0     Hpgd
## 37      IL7R  0.000e+00     1.3570 0.708 0.087  0.000e+00       1     Il7r
## 38     INMT1  0.000e+00     2.3873 0.815 0.327  0.000e+00       3     Inmt
## 39    KRT191  0.000e+00     2.8780 0.969 0.180  0.000e+00       4    Krt19
## 40     KRT71  0.000e+00     3.2929 0.996 0.268  0.000e+00       4     Krt7
## 41   LGALS11  0.000e+00     3.0568 0.842 0.444  0.000e+00       5   Lgals1
## 42       LTB  0.000e+00     1.2300 0.729 0.104  0.000e+00       1      Ltb
## 43      LYZ1  0.000e+00     5.6451 0.583 0.044  0.000e+00       2     Lyz1
## 44      LYZ2  0.000e+00     5.9383 0.961 0.116  0.000e+00       2     Lyz2
## 45     MFAP4  0.000e+00     2.6800 0.893 0.321  0.000e+00       3    Mfap4
## 46       MGP  0.000e+00     2.3298 0.868 0.236  0.000e+00       3      Mgp
## 47     MKI67  0.000e+00     2.3501 0.508 0.011  0.000e+00       5    Mki67
## 48    MS4A4B  0.000e+00     1.6335 0.829 0.098  0.000e+00       1   Ms4a4b
## 49      PLTP  0.000e+00     1.0803 0.899 0.396  0.000e+00       0     Pltp
## 50     PLVAP  0.000e+00     1.2741 0.827 0.315  0.000e+00       0    Plvap
## 51    PRDX61  0.000e+00     2.8102 0.998 0.671  0.000e+00       4    Prdx6
## 52      RAC2  0.000e+00     1.3101 0.914 0.139  0.000e+00       1     Rac2
## 53     RAMP2  0.000e+00     1.1862 0.937 0.368  0.000e+00       0    Ramp2
## 54   RETNLA1 8.850e-126     3.9645 0.398 0.044 1.874e-121       6   Retnla
## 55    S100A6  0.000e+00     2.8077 0.992 0.496  0.000e+00       4   S100a6
## 56  SCGB1A11  5.313e-84     6.1010 0.888 0.452  1.125e-79       6  Scgb1a1
## 57   SCGB3A2 1.096e-242     3.6340 0.260 0.010 2.320e-238       6  Scgb3a2
## 58  SERPING1  0.000e+00     2.4296 0.975 0.283  0.000e+00       3 Serping1
## 59    SFTPA1  0.000e+00     6.3368 0.994 0.104  0.000e+00       2   Sftpa1
## 60     SFTPB  0.000e+00     5.5744 0.995 0.059  0.000e+00       2    Sftpb
## 61     SFTPC  0.000e+00     7.2041 0.993 0.471  0.000e+00       2    Sftpc
## 62     SFTPD  0.000e+00     4.9517 0.994 0.038  0.000e+00       2    Sftpd
## 63   SLC34A2  0.000e+00     4.2143 0.974 0.018  0.000e+00       2  Slc34a2
## 64      SOD3  0.000e+00     2.6096 0.982 0.230  0.000e+00       3     Sod3
## 65    TPPP31 6.865e-231     3.7106 0.990 0.217 1.454e-226       6    Tppp3
## 66    TSPAN7  0.000e+00     1.2372 0.905 0.351  0.000e+00       0   Tspan7
## 67    TUBB51 2.543e-198     2.4460 0.819 0.707 5.384e-194       5    Tubb5
## 68    TYROBP  0.000e+00     2.6053 0.439 0.017  0.000e+00       5   Tyrobp
## 69     UBE2C  0.000e+00     2.5058 0.421 0.007  0.000e+00       5    Ube2c
## 70    VPS37B  0.000e+00     1.3906 0.781 0.197  0.000e+00       1   Vps37b
##                                                                                                             description
## 1                                                                                                                  <NA>
## 2                                                                                                                  <NA>
## 3                                                                                                                  <NA>
## 4                                                                           biglycan [Source:HGNC Symbol;Acc:HGNC:1044]
## 5                                                 calcitonin receptor like receptor [Source:HGNC Symbol;Acc:HGNC:16709]
## 6                                                                                                                  <NA>
## 7                                                                                                                  <NA>
## 8                                                      C-C motif chemokine ligand 4 [Source:HGNC Symbol;Acc:HGNC:10630]
## 9                                                      C-C motif chemokine ligand 5 [Source:HGNC Symbol;Acc:HGNC:10632]
## 10                                                                                                                 <NA>
## 11                                                    C-C motif chemokine receptor 7 [Source:HGNC Symbol;Acc:HGNC:1608]
## 12                                                                                                                 <NA>
## 13                                                                     CD3e molecule [Source:HGNC Symbol;Acc:HGNC:1674]
## 14                                                                     CD3g molecule [Source:HGNC Symbol;Acc:HGNC:1675]
## 15                                                                     CD52 molecule [Source:HGNC Symbol;Acc:HGNC:1804]
## 16                                                                                                                 <NA>
## 17                                                                         claudin 5 [Source:HGNC Symbol;Acc:HGNC:2047]
## 18                                                                                                                 <NA>
## 19                                                   collagen type III alpha 1 chain [Source:HGNC Symbol;Acc:HGNC:2201]
## 20                                                                                                                 <NA>
## 21                                                                                                                 <NA>
## 22                                                                                                                 <NA>
## 23                                                                                                                 <NA>
## 24                                                                           decorin [Source:HGNC Symbol;Acc:HGNC:2705]
## 25                                                       EGF like domain multiple 7 [Source:HGNC Symbol;Acc:HGNC:20594]
## 26                                                                                                                 <NA>
## 27                                                                          endoglin [Source:HGNC Symbol;Acc:HGNC:3349]
## 28                                                                                                                 <NA>
## 29 glycosylphosphatidylinositol anchored high density lipoprotein binding protein 1 [Source:HGNC Symbol;Acc:HGNC:24945]
## 30                                                                                                                 <NA>
## 31                                                                                                                 <NA>
## 32                                                                                                                 <NA>
## 33                                                         high mobility group box 2 [Source:HGNC Symbol;Acc:HGNC:5000]
## 34                                                                                                                 <NA>
## 35                                                                                                                 <NA>
## 36                                             15-hydroxyprostaglandin dehydrogenase [Source:HGNC Symbol;Acc:HGNC:5154]
## 37                                                            interleukin 7 receptor [Source:HGNC Symbol;Acc:HGNC:6024]
## 38                                                                                                                 <NA>
## 39                                                                                                                 <NA>
## 40                                                                       keratin 71 [Source:HGNC Symbol;Acc:HGNC:28927]
## 41                                                                                                                 <NA>
## 42                                                                  lymphotoxin beta [Source:HGNC Symbol;Acc:HGNC:6711]
## 43                                                                                                                 <NA>
## 44                                                                                                                 <NA>
## 45                                                  microfibril associated protein 4 [Source:HGNC Symbol;Acc:HGNC:7035]
## 46                                                                matrix Gla protein [Source:HGNC Symbol;Acc:HGNC:7060]
## 47                                                     marker of proliferation Ki-67 [Source:HGNC Symbol;Acc:HGNC:7107]
## 48                                                                                                                 <NA>
## 49                                                     phospholipid transfer protein [Source:HGNC Symbol;Acc:HGNC:9093]
## 50                                           plasmalemma vesicle associated protein [Source:HGNC Symbol;Acc:HGNC:13635]
## 51                                                                                                                 <NA>
## 52                                                         Rac family small GTPase 2 [Source:HGNC Symbol;Acc:HGNC:9802]
## 53                                             receptor activity modifying protein 2 [Source:HGNC Symbol;Acc:HGNC:9844]
## 54                                                                                                                 <NA>
## 55                                                  S100 calcium binding protein A6 [Source:HGNC Symbol;Acc:HGNC:10496]
## 56                                                                                                                 <NA>
## 57                                                 secretoglobin family 3A member 2 [Source:HGNC Symbol;Acc:HGNC:18391]
## 58                                                          serpin family G member 1 [Source:HGNC Symbol;Acc:HGNC:1228]
## 59                                                            surfactant protein A1 [Source:HGNC Symbol;Acc:HGNC:10798]
## 60                                                             surfactant protein B [Source:HGNC Symbol;Acc:HGNC:10801]
## 61                                                             surfactant protein C [Source:HGNC Symbol;Acc:HGNC:10802]
## 62                                                             surfactant protein D [Source:HGNC Symbol;Acc:HGNC:10803]
## 63                                                solute carrier family 34 member 2 [Source:HGNC Symbol;Acc:HGNC:11020]
## 64                                                           superoxide dismutase 3 [Source:HGNC Symbol;Acc:HGNC:11181]
## 65                                                                                                                 <NA>
## 66                                                                    tetraspanin 7 [Source:HGNC Symbol;Acc:HGNC:11854]
## 67                                                                                                                 <NA>
## 68                                    transmembrane immune signaling adaptor TYROBP [Source:HGNC Symbol;Acc:HGNC:12449]
## 69                                                ubiquitin conjugating enzyme E2 C [Source:HGNC Symbol;Acc:HGNC:15937]
## 70                                                        VPS37B subunit of ESCRT-I [Source:HGNC Symbol;Acc:HGNC:25754]

17.2.2 Cluster 0 Nasal vs. Mock

mockvsn_0 <- FindMarkers(
    cluster_scd, group.by="cluster_sample",
    ident.1="n_0", ident.2="mock_0") %>%
  as.data.frame()
head(mockvsn_0)
##              p_val avg_log2FC pct.1 pct.2  p_val_adj
## Zbtb16  9.557e-142     0.6963 0.449 0.101 2.024e-137
## Ucp2     3.405e-60     0.8380 0.891 0.795  7.210e-56
## Mt1      1.889e-50     0.8455 0.326 0.126  4.000e-46
## Lpl      9.500e-50     0.7433 0.505 0.287  2.011e-45
## Serinc3  1.649e-46     0.6785 0.905 0.835  3.490e-42
## Klf9     1.020e-44     0.5291 0.616 0.406  2.159e-40
rownames(mockvsn_0) <- toupper(rownames(mockvsn_0))
mockvsn_0 <- merge(mockvsn_0, brief, by="row.names", by.y="hgnc_symbol",
                   all.x=TRUE)

mockvsm_0 <- FindMarkers(
    cluster_scd, group.by="cluster_sample",
    ident.1="m_0", ident.2="mock_0") %>%
  as.data.frame()
head(mockvsm_0)
##             p_val avg_log2FC pct.1 pct.2  p_val_adj
## Irf7   5.073e-161    -1.2561 0.422 0.699 1.074e-156
## Ifit3  1.756e-160    -1.0526 0.261 0.574 3.718e-156
## Isg15  4.117e-152    -1.2583 0.603 0.815 8.718e-148
## Bst2   1.980e-135    -1.0896 0.780 0.894 4.192e-131
## Ly6e   6.879e-125    -0.9231 0.914 0.973 1.457e-120
## Ifit3b 3.726e-107    -0.6385 0.153 0.398 7.889e-103
rownames(mockvsm_0) <- toupper(rownames(mockvsm_0))
mockvsm_0 <- merge(mockvsm_0, brief, by="row.names", by.y="hgnc_symbol",
                   all.x=TRUE)
head(mockvsm_0, n=30)
##    Row.names      p_val avg_log2FC pct.1 pct.2  p_val_adj
## 1       APOD  1.536e-24    -0.3568 0.037 0.104  3.252e-20
## 2       BST2 1.980e-135    -1.0896 0.780 0.894 4.192e-131
## 3     CACYBP  3.624e-37    -0.2926 0.314 0.460  7.673e-33
## 4       CALR  3.761e-17    -0.2822 0.623 0.693  7.962e-13
## 5     CDKN1C  9.315e-05     0.2678 0.222 0.185  1.000e+00
## 6        CFB  4.482e-49    -0.3433 0.027 0.129  9.490e-45
## 7     CLEC1A  3.536e-20     0.2739 0.739 0.660  7.486e-16
## 8      CMPK2  1.023e-39    -0.3287 0.131 0.263  2.167e-35
## 9      COX6C  2.888e-22     0.2574 0.598 0.500  6.115e-18
## 10     COX8A  7.305e-19     0.2721 0.786 0.728  1.547e-14
## 11     CRIP1  1.257e-09     0.3182 0.643 0.598  2.661e-05
## 12    CTLA2A  5.998e-21    -0.3264 0.777 0.851  1.270e-16
## 13    CXCL10  1.436e-28    -0.7258 0.142 0.254  3.041e-24
## 14    DNAJA1  4.655e-56    -0.5561 0.692 0.815  9.856e-52
## 15    DNAJB1  5.886e-14    -0.4203 0.589 0.657  1.246e-09
## 16       ENG  9.385e-20    -0.3263 0.809 0.860  1.987e-15
## 17       FAU  6.792e-27     0.4035 0.960 0.934  1.438e-22
## 18      GBP4  3.755e-18     0.3444 0.745 0.689  7.950e-14
## 19     H2-K1  2.533e-10    -0.2578 0.979 0.977  5.364e-06
## 20     H2-Q1  5.252e-18    -0.2636 0.464 0.552  1.112e-13
## 21     HERC6  1.527e-25    -0.2592 0.209 0.321  3.232e-21
## 22    HILPDA  1.267e-12     0.2854 0.713 0.654  2.683e-08
## 23      HOPX  1.598e-05     0.2755 0.732 0.718  3.383e-01
## 24  HSP90AA1  6.721e-63    -0.6724 0.790 0.886  1.423e-58
## 25  HSP90AB1  1.344e-86    -0.6609 0.966 0.988  2.845e-82
## 26   HSP90B1  5.617e-34    -0.3939 0.758 0.827  1.189e-29
## 27    HSPA1A  5.112e-17    -0.3788 0.639 0.713  1.082e-12
## 28    HSPA1B  1.318e-22    -0.4739 0.584 0.675  2.791e-18
## 29     HSPA5  4.882e-27    -0.3993 0.755 0.803  1.034e-22
## 30     HSPA8  1.291e-37    -0.4151 0.959 0.980  2.734e-33
##                                                                                                       description
## 1                                                              apolipoprotein D [Source:HGNC Symbol;Acc:HGNC:612]
## 2                                           bone marrow stromal cell antigen 2 [Source:HGNC Symbol;Acc:HGNC:1119]
## 3                                                   calcyclin binding protein [Source:HGNC Symbol;Acc:HGNC:30423]
## 4                                                                 calreticulin [Source:HGNC Symbol;Acc:HGNC:1455]
## 5                                         cyclin dependent kinase inhibitor 1C [Source:HGNC Symbol;Acc:HGNC:1786]
## 6                                                          complement factor B [Source:HGNC Symbol;Acc:HGNC:1037]
## 7                                      C-type lectin domain family 1 member A [Source:HGNC Symbol;Acc:HGNC:24355]
## 8                                     cytidine/uridine monophosphate kinase 2 [Source:HGNC Symbol;Acc:HGNC:27015]
## 9                                              cytochrome c oxidase subunit 6C [Source:HGNC Symbol;Acc:HGNC:2285]
## 10                                             cytochrome c oxidase subunit 8A [Source:HGNC Symbol;Acc:HGNC:2294]
## 11                                                     cysteine rich protein 1 [Source:HGNC Symbol;Acc:HGNC:2360]
## 12                                                                                                           <NA>
## 13                                            C-X-C motif chemokine ligand 10 [Source:HGNC Symbol;Acc:HGNC:10637]
## 14                            DnaJ heat shock protein family (Hsp40) member A1 [Source:HGNC Symbol;Acc:HGNC:5229]
## 15                            DnaJ heat shock protein family (Hsp40) member B1 [Source:HGNC Symbol;Acc:HGNC:5270]
## 16                                                                    endoglin [Source:HGNC Symbol;Acc:HGNC:3349]
## 17                         FAU ubiquitin like and ribosomal protein S30 fusion [Source:HGNC Symbol;Acc:HGNC:3597]
## 18                                                guanylate binding protein 4 [Source:HGNC Symbol;Acc:HGNC:20480]
## 19                                                                                                           <NA>
## 20                                                                                                           <NA>
## 21 HECT and RLD domain containing E3 ubiquitin protein ligase family member 6 [Source:HGNC Symbol;Acc:HGNC:26072]
## 22                                 hypoxia inducible lipid droplet associated [Source:HGNC Symbol;Acc:HGNC:28859]
## 23                                                               HOP homeobox [Source:HGNC Symbol;Acc:HGNC:24961]
## 24                         heat shock protein 90 alpha family class A member 1 [Source:HGNC Symbol;Acc:HGNC:5253]
## 25                         heat shock protein 90 alpha family class B member 1 [Source:HGNC Symbol;Acc:HGNC:5258]
## 26                                 heat shock protein 90 beta family member 1 [Source:HGNC Symbol;Acc:HGNC:12028]
## 27                               heat shock protein family A (Hsp70) member 1A [Source:HGNC Symbol;Acc:HGNC:5232]
## 28                               heat shock protein family A (Hsp70) member 1B [Source:HGNC Symbol;Acc:HGNC:5233]
## 29                                heat shock protein family A (Hsp70) member 5 [Source:HGNC Symbol;Acc:HGNC:5238]
## 30                                heat shock protein family A (Hsp70) member 8 [Source:HGNC Symbol;Acc:HGNC:5241]

17.3 Find Conserved Markers

This function makes no sense.

DefaultAssay(cluster_scd) <- "RNA"
conserved_markers <- FindConservedMarkers(
    cluster_scd, ident.1=c(0, 1), ident.2=c(2,3,4),
    grouping.var="sample", only.pos=TRUE,
    verbose=TRUE)
mock_vs_control <- FindMarkers(cluster_scd, group.by="orig.ident",
                               ident.1="mock",
                               ident.2="control")
head(mock_vs_control)
muscular_vs_mock <- FindMarkers(cluster_scd, group.by="orig.ident",
                                ident.1="m",
                                ident.2="mock")
summary(muscular_vs_mock)
nasal_vs_mock <- FindMarkers(cluster_scd, group.by="orig.ident",
                             min.pct=0.25, ident.1="n",
                             ident.2="mock")
summary(nasal_vs_mock)

FeaturePlot(cluster_scd, features=c("Rgcc"),
            split.by="orig.ident", max.cutoff=3,
            cols=c("darkgreen", "darkred"))

18 Scan for likely cell cycle genes

This is a neat idea, I think we can repurpose it to immunology gene sets.

cluster_scd <- CellCycleScoring(
    object=cluster_scd,
    g2m.features=cc.genes$g2m.genes,
    s.features=cc.genes$s.genes)
## Warning: The following features are not present in the object: MCM5, PCNA, TYMS,
## FEN1, MCM2, MCM4, RRM1, UNG, GINS2, MCM6, CDCA7, DTL, PRIM1, UHRF1, MLF1IP,
## HELLS, RFC2, RPA2, 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, not searching for symbol synonyms
## Warning: The following features are not present in the object: HMGB2, CDK1,
## NUSAP1, UBE2C, BIRC5, TPX2, TOP2A, NDC80, CKS2, NUF2, CKS1B, MKI67, TMPO, CENPF,
## 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, not searching for symbol synonyms
## Warning in AddModuleScore(object = object, features = features, name = name, :
## Could not find enough features in the object from the following feature lists:
## S.Score Attempting to match case...Could not find enough features in the object
## from the following feature lists: G2M.Score Attempting to match case...
VlnPlot(cluster_scd, features=c("S.Score", "G2M.Score"),
        group.by="orig.ident",
        ncol=4, pt.size=0)

Having written the following I realized I used an older version of my mSigDB reference… FIXME: Redo it with the 7.5+ data.

broad_types <- load_gmt_signatures(signatures="reference/m8.all.v2022.1.Mm.symbols.gmt")
broad_list <- list()
for (i in names(broad_types)) {
  broad_list[[i]] <- geneIds(broad_types[[i]])
}
gsea_scd <- AddModuleScore(object=cluster_scd, features=broad_list,
                      name="m8")
## Warning: The following features are not present in the object: Gm29346, Pdyn,
## Iqcj, Iqschfp, Gm15578, Gm12724, A930005G22Rik, Gm38839, Adgra1, 5530401A14Rik,
## Gm16246, Adamts16, Crhbp, Lrtm1, Gm1604b, Galr1, Slit1, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Ifi203-ps,
## 9630010A21Rik, Gm26236, Niban2, Pcsk2os2, 4930573H18Rik, Gm12426, 8030487O14Rik,
## E030026E10Rik, Gm36503, Gm36816, Garre1, 9530078K11Rik, Gm22060, Scn4b,
## 4632418H02Rik, Gm25410, Snord104, not searching for symbol synonyms
## Warning: The following features are not present in the object: Spp2, Golt1a,
## F13b, Mtarc1, Mtarc2, Hnf4aos, Hnf4a, Hnf4g, Sertm1, Tm4sf4, Gm40055,
## 1700007F19Rik, Aadac, A330069K06Rik, Fgb, Gm16958, Acnat1, Ambp, Kif12, Gm12602,
## C8b, C8a, Gm19666, Gm42614, Klb, Ugt2b34, Ugt2b35, Ugt2b36, Ugt2b5, Afm,
## Hnf1a, Hnf1aos1, 1810017P11Rik, Mmd2, Gm20635, Gm3289, Akr1d1, 9930120I10Rik,
## Gm20426, Chst13, Uroc1, A2m, Gys2, Sult2a8, Prodh2, Slc7a9, Anks4b, Rps23rg1,
## Aadat, Hsd17b2, Gm27216, Smlr1, Gm29571, Mfsd4b3-ps, Creb3l3, Pah, Inhbc,
## Slc39a5, Igfbp1, Timd2, Shbg, 4930405D11Rik, Gm24233, Serpina6, Serpina1c,
## Mir337, DQ267102, Gm25357, Slc17a3, Cdhr2, Slc25a48, Lect2, Bhmt, Bhmt2, Dmgdh,
## Cpb2, 4930517O19Rik, Agxt2, Cyp2d26, Kng1, Spink1, Slc22a8, Keg1, A1cf, Pde6c,
## Cyp2c67, Cyp2c68, Cyp2c70, Abcc2, Pnliprp2, Rtl4, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Gm29260, Gm13584,
## Gm37004, Tfap2c, AI849053, Gm15577, Gm35040, Gm25630, A330033J07Rik, Drd3,
## Gm23887, Emx2os, Emx2, Gm14664, not searching for symbol synonyms
## Warning: The following features are not present in the object: Oprk1, Dusp27,
## 2900092N22Rik, A530058N18Rik, C130080G10Rik, Ctcflos, BC002189, C630028M04Rik,
## Gm12514, Gm12866, Trim63, Trim54, Myl2, Bmp10, Gm18066, 4930512H18Rik, Gm27211,
## Unc13c, Myl3, Gm10118, Hand1, 4932435O22Rik, Irx4, Thbs4, Gm3002, Gm8281,
## Mov10l1, Gm4335, Nkx2-5, Hdac1-ps, Mir133a-1hg, Gata6os, Tlx1, 6030498E09Rik,
## Gm14769, not searching for symbol synonyms
## Warning: The following features are not present in the object: Vwc2l,
## Gm29514, Olah, Dbh, Pla2g4e, Gm9831, Gm12371, D130004A15Rik, A230006K03Rik,
## 4930567K12Rik, Hs3st4, 4930551E15Rik, 3110080E11Rik, Gm39244, Hcrtr2, Gm28905,
## Car10, Rab9b, not searching for symbol synonyms
## Warning: The following features are not present in the object: Vxn, Gm13630,
## Prdm13, Tmprss11a, Srrm4os, Gm20501, Neurod4, Gm12224, Gm38534, Neurog1, Gm6999,
## Dcc, Drr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Prdx2-ps1,
## 9630028B13Rik, Gm2061, Slc30a10, Epb42, Gm14049, Hsd3b6, 9830132P13Rik,
## 4933401H06Rik, 1700015C17Rik, Asb17os, Asb17, Gm22247, Lexm, Rnf212, Kel,
## Gm3793, Hbb-bh1, Hbb-bh0, Aqp8, Rusf1, Gypa, H2ax, Gm28530, Gm37249, Inhca,
## Ankrd36, Hba-x, Slc4a1, H2ac11, H2bc11, H1f4, Gm23127, Gm16867, Gm10110,
## 1810053B23Rik, Pdxk-ps, Marchf2, Gm20541, Rhag, Gm20517, Marchf3, Marchf5,
## Dennd10, Fmr1nb, not searching for symbol synonyms
## Warning: The following features are not present in the object: A130048G24Rik,
## A630081D01Rik, A130071D04Rik, Gm5834, Cd5l, Gm15644, Clec7a, 4933406J09Rik,
## Gvin-ps6, Gvin-ps7, Gvin3, Gm15542, 6430710M23Rik, 2310008N11Rik, Gm23677,
## Hmgb1-ps8, C920009B18Rik, Nlrp1c-ps, 1700030C10Rik, Gm17160, Cyrib, Mx1, Pgap6,
## Ncr3-ps, Olfr111, Ms4a14, Tasl, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm20172,
## Cracdl, Lmx1a, Ush2a, Gm13266, Dync2i2, Dcdc5, Gm4540, Gm15689, Dnai3, Dnai1,
## Ube2u, Dynlt5, Dnai4, Gm12930, Tex47, Smkr-ps, Gm44196, E330012B07Rik, Odad1,
## 3100003L05Rik, Katnip, Spef1l, Ins2, Gm36879, Poteg, Gm30504, Olfr370, Vat1l,
## 4933408N05Rik, Odad3, Dpy19l2, Gm1110, Hoatz, Gm20276, Odad4, Marchf10, Dnai2,
## 1700086L19Rik, Gm10735, Trhr, D930007P13Rik, Cfap91, Odad2, Gm16090, Ttr, Wnt8b,
## Frmpd4, not searching for symbol synonyms
## Warning: The following features are not present in the object: Abca12,
## 4933417C20Rik, Mir205hg, Gm13219, Macrod2os1, Gpr87, Fhip1a, Gm12446, Ugt2a2,
## Gm33050, Vwde, Pyurf, Rfx6, Nepn, Fam174c, Tac2, B4galnt2, BC006965, Gm10406,
## Oc90, Gm15538, not searching for symbol synonyms
## Warning: The following features are not present in the object: Lincmd1, Col19a1,
## Mstn, Chrnd, Chrng, Myog, Chrna1, 7530428D23Rik, Gm30735, Casq2, 4632404M16Rik,
## Frmpd1os, Pax7, Gm8091, Gm42875, Vgll2, Mybpc1, Myh8, Septin4, 4930544I03Rik,
## Cspg4b, 1520401A03Rik, Mymx, Pitx3, Tex16, Tceal7, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Gm6209, Gm12829,
## Gm20485, Gm42397, Gm32531, Zic1, Gm12098, Zic2, Atp13a5, Htr1f, Mro, Slc22a6,
## Mageb18, not searching for symbol synonyms
## Warning: The following features are not present in the object: Col9a1,
## 1700019A02Rik, Olfr1219, 9130410C08Rik, Gm12830, Gm10578, Epyc, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Gm29455,
## 3110062G12Rik, Rapgef4os1, 2600014E21Rik, Neurod6, Gm26604, Kash5,
## C230057M02Rik, Camkv, 2900079G21Rik, Neurod2, Lrfn5, Gm20687, Mpped1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Tfap2d, Gm16582,
## A930036I15Rik, Barhl2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm13629, Neurod1,
## Gm13791, Xkr7, 4930419G24Rik, Gm19445, 2610028E06Rik, Hmx1, Grxcr1, Exoc1l, Hrk,
## Gm16036, Ppp1r17, Tlx2, Hs3st2, Htr3a, Htr3b, Trhde, 4930473D10Rik, Gm15723,
## Tlx3, D130052B06Rik, Nrsn1, Prrxl1, Rxfp3, Gm2824, Olfr15, Ppef1, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Dmbx1, Gm15637,
## Trh, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm13377, Pax8,
## Gm13415, Lamp5, Gm27199, Lhx5, Slc6a5, Gm16010, Sox14, Lhx1, Lhx1os, Otp, Skor2,
## Pax2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm22786,
## 9430037O13Rik, Rrh, Kif19b, B130021K23Rik, C430039J01Rik, 4930413G21Rik,
## Septin1, Gm7972, Gm30238, Gpr137b-ps, H2bc22, Gm22208, Hoxc11, Dynlt2b, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ibsp, Mir6240,
## Susd5, not searching for symbol synonyms
## Warning: The following features are not present in the object: 6720464F23Rik,
## E430021H15Rik, 2310040G07Rik, Gm38825, Olfr959, 9430081H08Rik, Septin8, Btnl10,
## H2ac22, Slc66a2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm28175,
## 5930409G06Rik, Gsx1, Qrfprl, Gm18716, Cckbr, Sox1, Gm6607, Mcf2, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Gm29865, Cyp2j8,
## Gm12688, Apc-ps1, Pramel47, Gjc3, Gm10046, 4930505M18Rik, Gm29507, Gm19514,
## Atp10b, AA914427, Gm16168, Slitrk2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Serpinb10,
## Gm33100, Olfr643, Irag1, 4933432K03Rik, Gm35657, H2bc4, H1f2, Pla2g10, Gm1720,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Marchf4, Ecel1,
## Lhx4, Gm10530, Crp, Lhx3, Mnx1, Phox2b, G630064G18Rik, Gm31592, Grip1os2,
## Chat, Slc18a3, Gm2990, Cdh12, Marchf11, Hoxc8, Uts2b, Kcnh8, Slc5a7, Gm14696,
## A730046J19Rik, not searching for symbol synonyms
## Warning: The following features are not present in the object: Sall4, Gm23445,
## Foxb1, A730062M13Rik, Gm30698, Sp8, not searching for symbol synonyms
## Warning: The following features are not present in the object: D030025E07Rik,
## Gm10400, Hdnr, Olfr1372-ps1, Barx1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Cryge, Cryga,
## Cryba2, Olfr1062, Gm33206, Gm37359, Gja8, Tmprss11d, Gm31816, Gm20757, Mip,
## Gja3, not searching for symbol synonyms
## Warning: The following features are not present in the object: Pth2r, Pax3,
## Gm30731, Slc6a11, Msx3, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm19335, Myo3a,
## Nxph2, Dlx1as, Dlx2, Gm38505, Gm20515, Trpc4, Vmn2r1, Lhx8, Calb1, Dlx6os1,
## Dlx6os2, Dlx5, Slc6a1, C230062I16Rik, B020031H02Rik, Gm12068, 4933430M04Rik,
## Gm11346, Cntnap3, Smim45, Nol4, Arx, not searching for symbol synonyms
## Warning: The following features are not present in the object: Tacr3, Tyrp1,
## Olfr1338, 2900064K03Rik, Oca2, Gabra5, Tyr, Gm15483, Clec18a, Slc38a8,
## 7630403G23Rik, Opn4, Slc45a2, AW822252, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm13652, Gm31243,
## Gm5860, Gm15997, Alx1, Smc1b, Srd5a2, Dsc3, Mir6984, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Otor, Vmn2r3,
## Gm14335, Kera, Gm22205, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm17893,
## 4930509J09Rik, Gm23054, Rph3a, Iqsec3, A230077H06Rik, Cacng3, Esrrb, Pou6f2,
## Slc35f4, Cdh9, 1700123O21Rik, Gm15808, Akain1, Htr4, Gm15155, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Fcnb, Gm16035,
## Prap1, Ngp, Slc13a5, Stfa1, Stfa3, not searching for symbol synonyms
## Warning: The following features are not present in the object: Lmx1b,
## 9430024E24Rik, BB557941, Hoxd13, Hoxd12, Hoxd11, Gm14055, Gm10258, Hoxa10,
## Hoxa11, Hoxa11os, Hoxa13, Hottip, Sox5os4, A530021J07Rik, Gm31727, Hand2,
## Gm9143, not searching for symbol synonyms
## Warning: The following features are not present in the object: 3110099E03Rik,
## Gm24492, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Slc2a5, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Gpr137b-ps, Fam3d, Cela2a, Smim30, Iqsec3, Irag1, Phxr4, Frmd7, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Ins2, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H1f2, Get1,
## Mir24-2, Exosc6, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Tamalin,
## Ddx39a, Mir24-2, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ube2d-ps,
## Ubb-ps, H1f2, Zfp935, Cep20, Cldn25, Sting1, Slc66a2, Emx2, Atp5pb, Adprs,
## Smim30, Chaserr, Mir24-2, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ins2, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9, Slc66a2,
## H2az1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Niban1, Dnaaf10,
## H2bc4, Plac9, Sting1, Slc66a2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Clec7a, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, H2aj,
## Mir9-3hg, Psme3ip1, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Ubb-ps,
## H2bc4, Zic2, Atp5pb, Rpl34-ps1, Mir24-2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## Ubb-ps, Zic2, Rpl34-ps1, H2az1, Fam110d, Smim30, Mir24-2, Mobp, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Zic2,
## Neurod1, Cbln1, Calb2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Amer3, Zbed6,
## Clvs2, Diras1, Ano4, H2az2, Fem1al, Neurod2, Efcab15, Mideas, Tunar, Dync2i1,
## H2ac13, H2bc4, AW495222, Fam3d, Mir124a-1hg, Cacng2, Gm15760, Kcnj6, Lhfpl5,
## St6gal2, 2410021H03Rik, Niban2, Zfp804a, Pla2g4e, Rbm12, Gm20754, Fam110d,
## Srrm3, Particl, Ttc9b, Gm5113, 1500012K07Rik, Mir9-3hg, Hs3st4, Ins2, Ncan,
## Brme1, Get3, Exosc6, Gm6981, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## H2bu2, Ubb-ps, H2bc4, Tamalin, Cep20, Cerox1, Antkmt, Iftap, Nkx2-2, Dusp15,
## Hapln2, Atp5pb, H2az1, Smim30, Chaserr, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2bu2,
## Ubb-ps, Antkmt, Nkx2-2, Smim30, Pnma8b, H2ax, Sox3, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Ubb-ps, Ngp, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Ubb-ps,
## Rpl34-ps1, Mir24-2, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Ubb-ps,
## Rpl34-ps1, Slc2a5, Mir24-2, Gm6981, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Mars1,
## Ubb-ps, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## Ubb-ps, Pyy, H2bc4, Antkmt, Polr1h, Slc66a2, Bambi-ps1, 5830417I10Rik, Atp5pb,
## Cibar1, Spring1, Smim30, Particl, Chaserr, 4930413G21Rik, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Tnfsfm13, Macroh2a1, Particl, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, H1f2, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Abca12, Nkx2-5,
## Ambp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Fam110d, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Slc2a5,
## Cd209f, Vsig4, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps,
## Zfp862-ps, not searching for symbol synonyms
## Warning: The following features are not present in the object: Trim63, Trim54,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm5069,
## Rps15a-ps6, Rpl31-ps12, Morf4l1-ps1, Myoz2, Mir703, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Rpl31-ps12, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Gm7609, H2bc4,
## Rpl31-ps12, Fam110d, Gm15421, Klra9, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## H2bc4, Plac9, Tmem254, Rpl31-ps12, Eef1a2, Gm15421, Mir703, H2aj, G530011O06Rik,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Lilrb4b,
## Rps15a-ps6, Plac9, Cd209f, Cd209g, Vsig4, not searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9,
## Rpl31-ps12, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rdh16f2, H1f2,
## Tmem254, Cyp2d9, Miox, Hao2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rdh16f2,
## Rps15a-ps6, Akr1c21, H2bc4, H1f2, Bhmt, Tmem254, Cyp2d12, Rpl31-ps12, Spink1,
## Slc22a8, Defb29, Cyp24a1, Hsd3b4, Hao2, H2az1, Cyp4a14, Guca2b, Mir703, Hpd,
## Slc13a1, Slc51b, Gsta5, not searching for symbol synonyms
## Warning: The following features are not present in the object: Spink1, Fam110d,
## Kap, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## Rpl31-ps12, not searching for symbol synonyms
## Warning: The following features are not present in the object: Spink1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Foxi1, Tmem254,
## Entpd4, Miox, Rpl31-ps12, Spink1, Thoc2l, 6820431F20Rik, Erdr1, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: Plac9, Kap, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Tmem254, Kap, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Spink1, Kap, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Kcnj16, Tmem254,
## Entpd4, Miox, Rpl31-ps12, Cldn16, Spink1, Bbln, Clcnkb, Tmem52b, Kap, H2aj,
## Umod, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9, Kap, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: G6pc, H2bc4,
## H1f2, Tmem254, Cyp2d12, Defb29, Cyp24a1, Rps15a-ps4, Slc13a1, Clec2h, Kap,
## Slco1a6, not searching for symbol synonyms
## Warning: The following features are not present in the object: Miox, Rpl31-ps12,
## Spink1, H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: 1700016C15Rik,
## Pah, Akr1c21, Tmem174, Tmem254, Miox, Mep1a, Spink1, Glyat, Keg1, Defb29,
## Hsd3b4, Hao2, Cyp2j5, Guca2b, Kap, H2aj, Acsm2, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Ubb-ps, Gfus, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Golt1a, Mptx1,
## Mtarc2, Slc39a5, Rps15a-ps6, H2az2, Ubb-ps, Macroh2a1, Fam3d, Gsdmc2, Gfus,
## Cyp2d26, Pla2g10, Rpl31-ps12, Antkmt, Dpcd, Bbln, Hao2, Atp5pb, Fabp2, H2az1,
## Hyi, Guca2b, Rps15a-ps4, Sult1b1, Cdx2, Pals2, H2aj, Prap1, Defb37, Hsd17b2,
## Slc51b, Pigbos1, Gsta1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## H2ac23, H1f2, Fam3d, Tmem254, Gfus, Rpl31-ps12, Antkmt, Gm6402, Gm9320, H2az1,
## Cdx2, Smim30, Aqp8, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mptx1, H2az2,
## Ubb-ps, Hoxb13, H1f2, Fam3d, Gfus, Pla2g10, Cldn14, Tpsg1, Antkmt, Gm6402,
## Ttr, Cyp2c55, Bbln, Atp5pb, Fabp2, Guca2b, Pla2g2a, Smim30, H2aj, Scgb2b7, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Tlcd3a,
## Cldn25, Cldn14, Aldh3b2, Cdx2, Hoxa11os, Ush1c, Ddx39a, Get3, H2ax, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H2az1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9, Tmem254,
## Cldn25, H2az1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## Cyrib, Rpl31-ps12, H2az1, Rps15a-ps4, Gm15421, not searching for symbol synonyms
## Warning: The following features are not present in the object: Plac9,
## G530011O06Rik, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Plac9,
## Rpl31-ps12, not searching for symbol synonyms
## Warning: The following features are not present in the object: Dnaaf10, Plac9,
## Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rpl32l,
## Rps15a-ps6, Ubb-ps, H2ac23, Bhmt, Tmem254, Gm12191, Rpl31-ps12, Morf4l1-ps1,
## Ndufs5-ps, Gm6402, Gm9320, Rpl34-ps1, Ptma-ps2, Rps15a-ps4, Gm15421, Mir703,
## Npm3-ps1, Gm6654, H2ax, Gm6222, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm7609, Rpl32l,
## Rps15a-ps6, H2az2, Ubb-ps, Rpl31-ps12, Morf4l1-ps1, Ndufs5-ps, Gm6402, Gm9320,
## Norad, Rpl34-ps1, Rps15a-ps4, Gm15421, Mir703, Gm6654, Gm6222, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Agxt, Rdh16f2,
## Bhmt, Tmem254, Ugt3a1, A1bg, Rpl31-ps12, Mup2, Mup20, Ambp, Rps15a-ps4, Hpd,
## Cyp3a44, Sult2a2, Sult2a1, Sult2a7, Prodh2, Hamp2, Aqp8, Apoa5, not searching
## for symbol synonyms
## Warning: The following features are not present in the object: H2bc4, Ins2, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Tmem254, Cldn25,
## H2az1, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H1f4, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Gm4956, Atp5pb,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: H2bc4, H1f2,
## H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: Fam110d, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, H2ac23,
## H1f4, Macroh2a1, Antkmt, Bbln, H2az1, H2aj, H2ax, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: Ins1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Gm4956, Mtarc2,
## H2bc4, H1f2, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, H1f4,
## Bbln, H2az1, H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: Niban2, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Tamalin, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## H1f2, Macroh2a1, Bbln, H2ac18, not searching for symbol synonyms
## Warning: The following features are not present in the object: H1f2, Macroh2a1,
## Antkmt, H2az1, H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Tenm2,
## Plac9, Tmem254, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## H2bc4, H2ac18, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Btn1a1,
## Tmem254, Slc66a2, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Wfdc18, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, H2az2,
## Plac9, Tmem254, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Atp10d,
## Chaserr, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, H1f2,
## H3c1, Antkmt, Polr1h, Bbln, Smim30, H2aj, Exosc6, not searching for symbol
## synonyms
## Warning: The following features are not present in the object: H1f5, H1f3,
## H2ac8, H1f4, Cldn13, Ngp, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mrgpra2b, Ngp,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Exosc6,
## H2ax, Gm6981, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2ac23, Fcnb,
## Gypa, H2ax, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Tmem254, Ngp, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Ubb-ps,
## Atp5pb, Smim30, Ddx39a, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2ac6, H2az1,
## Cldn13, Mrgpra2b, Gypa, Ddx39a, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2bc4, Bbln,
## H2ac18, H2aj, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ddx39a, Ngp, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Skp1, Ubb-ps,
## Polr1h, H2aj, 2610005L07Rik, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mrgpra2b, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ngp, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2, Tmem254,
## Antkmt, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mrgpra2b, Ngp,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Macroh2a1,
## Tmem254, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Fcnb, H2az1,
## Mrgpra2b, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ngp, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Tamalin,
## Tff2, Cela2a, 2610005L07Rik, not searching for symbol synonyms
## Warning: The following features are not present in the object: Cela2a, Try4,
## Reg1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Pyy,
## Dbpht2, H1f2, Scgn, Pnlip, Cela2a, Try4, Reg1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Syndig1l,
## Ucn3, H1f2, Isl1, Ins1, Gm13498, Neurod1, Nkx2-2, Sertm1, Kif12, Cela2a, Try4,
## Ins2, H2ap, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Dbpht2,
## Cela2a, Try4, Ush1c, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Cela2a,
## Try4, not searching for symbol synonyms
## Warning: The following features are not present in the object: 1810007D17Rik,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Pnliprp2,
## Ambp, Get3, Mmp7, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Antkmt,
## Mir24-2, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Ubb-ps,
## Norad, not searching for symbol synonyms
## Warning: The following features are not present in the object: Zbed6,
## Rps15a-ps6, B4galnt2, Slc4a1, Gm12191, Cyrib, Morf4l1-ps1, Ndufs5-ps,
## Tmem181c-ps, Mep1a, Cyp2c55, Niban2, Pck1, Fabp2, Sult1b1, Gm6654, Aqp8, Prap1,
## Gypa, Ces2a, Hsd17b2, Gcnt3, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Tamalin,
## Norad, Mrgprg, Mir24-2, not searching for symbol synonyms
## Warning: The following features are not present in the object: Mtarc2,
## Rps15a-ps6, H2az2, Ubb-ps, Calm5, Rpl31-ps12, Antkmt, Gm9320, Gm94, Bbln,
## 2310050C09Rik, Hyi, Cela2a, Oas1f, Smim30, BC064078, H2aj, Krtdap, Mt4, Exosc6,
## Apoc3, not searching for symbol synonyms
## Warning: The following features are not present in the object: Tfap2b, Mtarc2,
## H2az2, Tenm2, Ubb-ps, Krt24, Krt4, Hoxc8, Rpl34-ps1, Smim30, BC064078, H2aj,
## Irag2, Mir24-2, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## Ubb-ps, Calm5, Gfus, Krt4, Rpl31-ps12, Acer1, Gm9320, Hyi, Dlx5, BC064078,
## Exosc6, H2ax, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps4, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, H2az1,
## not searching for symbol synonyms

## Warning: The following features are not present in the object: Ubb-ps, H2az1,
## not searching for symbol synonyms
## Warning: The following features are not present in the object: Gm4956,
## Rps15a-ps6, Gm9320, Rps15a-ps4, not searching for symbol synonyms
## Warning: The following features are not present in the object: Tmem254, Cldn25,
## H2az1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Macir, Cyrib,
## Rpl31-ps12, H2az1, Mrgpra2b, Ngp, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2bc4, H2aj, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## Rpl31-ps12, H2az1, Rps15a-ps4, H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: Slc4a1,
## Rpl31-ps12, Epb42, Gm6654, Gypa, not searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Polr1f,
## H2ac23, H2bc4, H1f2, Macroh2a1, Tmem254, Rpl31-ps12, Antkmt, Polr1h, Gm9320,
## Atp5pb, H2az1, Gm15421, Mir703, Smim30, H2ax, Pigbos1, Erdr1, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Antkmt, Gm6402,
## H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: Erdr1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H2az2, Ubb-ps,
## H2ac23, H2ac11, H2ac8, Macroh2a1, Antkmt, H2-T10, Atp5pb, H2az1, H2aj, Ddx39a,
## Exosc6, H2ax, Erdr1, not searching for symbol synonyms
## Warning: The following features are not present in the object: Serpinb3a, Krt36,
## H2ac23, Plac9, Gm94, Sprr1b, H2az1, Krtdap, Ddx39a, H2ax, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Krtap3-3, Krt36,
## Plac9, Tmem254, Krt84, Sprr1b, Krtdap, Defb4, not searching for symbol synonyms
## Warning: The following features are not present in the object: Ubb-ps, Mideas,
## H2ac13, H3c1, Obi1, Ins1, Adprs, Cela2a, Ins2, 6820431F20Rik, not searching for
## symbol synonyms
## Warning: The following features are not present in the object: Tmem181c-ps, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: H2aw, H2bc4,
## Gm9320, Atp5pb, H2aj, not searching for symbol synonyms
## Warning: The following features are not present in the object: Rps15a-ps6,
## Ubb-ps, Rpl31-ps12, Gm6402, Gm9320, not searching for symbol synonyms
## Warning: The following features are not present in the object: Garre1, not
## searching for symbol synonyms
## Warning: The following features are not present in the object: Dcpp3, Gm6402,
## Npm3-ps1, not searching for symbol synonyms
chosen <- c(3, 9, 11, 36, 43, 42, 14)
names(broad_types)[chosen]
## [1] "DESCARTES_ORGANOGENESIS_HEPATOCYTES"                  
## [2] "DESCARTES_ORGANOGENESIS_WHITE_BLOOD_CELLS"            
## [3] "DESCARTES_ORGANOGENESIS_EPITHELIAL_CELLS"             
## [4] "DESCARTES_ORGANOGENESIS_NUETROPHILS"                  
## [5] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_T_CELL_AGEING"
## [6] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_B_CELL_AGEING"
## [7] "DESCARTES_ORGANOGENESIS_JAW_AND_TOOTH_PROGENITORS"
columns <- paste0("m8", chosen)
VlnPlot(gsea_scd, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Warning: Removed 1 rows containing non-finite values (`stat_ydensity()`).

chosen <- c(50, 51, 60, 61, 62, 65, 66)
names(broad_types)[chosen]
## [1] "TABULA_MURIS_SENIS_BLADDER_LEUKOCYTE_AGEING"            
## [2] "TABULA_MURIS_SENIS_BRAIN_MYELOID_MACROPHAGE_AGEING"     
## [3] "TABULA_MURIS_SENIS_DIAPHRAGM_B_CELL_AGEING"             
## [4] "TABULA_MURIS_SENIS_DIAPHRAGM_ENDOTHELIAL_CELL_AGEING"   
## [5] "TABULA_MURIS_SENIS_DIAPHRAGM_MACROPHAGE_AGEING"         
## [6] "TABULA_MURIS_SENIS_GONADAL_ADIPOSE_TISSUE_B_CELL_AGEING"
## [7] "TABULA_MURIS_SENIS_GONADAL_ADIPOSE_TISSUE_T_CELL_AGEING"
columns <- paste0("m8", chosen)
VlnPlot(gsea_scd, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Warning: Removed 1 rows containing non-finite values (`stat_ydensity()`).

chosen <- c(115, 118, 119, 120, 121, 125, 128)
names(broad_types)[chosen]
## [1] "TABULA_MURIS_SENIS_LIVER_MATURE_NK_T_CELL_AGEING"             
## [2] "TABULA_MURIS_SENIS_LUNG_CD4_POSITIVE_ALPHA_BETA_T_CELL_AGEING"
## [3] "TABULA_MURIS_SENIS_LUNG_CD8_POSITIVE_ALPHA_BETA_T_CELL_AGEING"
## [4] "TABULA_MURIS_SENIS_LUNG_NK_CELL_AGEING"                       
## [5] "TABULA_MURIS_SENIS_LUNG_T_CELL_AGEING"                        
## [6] "TABULA_MURIS_SENIS_LUNG_CLASSICAL_MONOCYTE_AGEING"            
## [7] "TABULA_MURIS_SENIS_LUNG_INTERMEDIATE_MONOCYTE_AGEING"
columns <- paste0("m8", chosen)
VlnPlot(gsea_scd, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)

chosen <- c(212, 211, 210, 209)
names(broad_types)[chosen]
## [1] "TABULA_MURIS_SENIS_TRACHEA_GRANULOCYTE_AGEING"                                   
## [2] "TABULA_MURIS_SENIS_TRACHEA_FIBROBLAST_AGEING"                                    
## [3] "TABULA_MURIS_SENIS_TRACHEA_ENDOTHELIAL_CELL_AGEING"                              
## [4] "TABULA_MURIS_SENIS_TRACHEA_BASAL_EPITHELIAL_CELL_OF_TRACHEOBRONCHIAL_TREE_AGEING"
columns <- paste0("m8", chosen)
VlnPlot(gsea_scd, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)

chosen <- c(176:182)
names(broad_types)[chosen]
## [1] "TABULA_MURIS_SENIS_PANCREAS_PANCREATIC_DELTA_CELL_AGEING"              
## [2] "TABULA_MURIS_SENIS_PANCREAS_PANCREATIC_POLYPEPTIDE_CELL_AGEING"        
## [3] "TABULA_MURIS_SENIS_PANCREAS_PANCREATIC_ACINAR_CELL_AGEING"             
## [4] "TABULA_MURIS_SENIS_PANCREAS_PANCREATIC_DUCTAL_CELL_AGEING"             
## [5] "TABULA_MURIS_SENIS_PANCREAS_PANCREATIC_STELLATE_CELL_AGEING"           
## [6] "TABULA_MURIS_SENIS_SUBCUTANEOUS_ADIPOSE_TISSUE_B_CELL_AGEING"          
## [7] "TABULA_MURIS_SENIS_SUBCUTANEOUS_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"
columns <- paste0("m8", chosen)
VlnPlot(gsea_scd, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Warning: Removed 1 rows containing non-finite values (`stat_ydensity()`).

chosen <- c(42:47)
names(broad_types)[chosen]
## [1] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_B_CELL_AGEING"                          
## [2] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_T_CELL_AGEING"                          
## [3] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"                
## [4] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_MESENCHYMAL_STEM_CELL_OF_ADIPOSE_AGEING"
## [5] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_MYELOID_CELL_AGEING"                    
## [6] "TABULA_MURIS_SENIS_BLADDER_BLADDER_CELL_AGEING"
columns <- paste0("m8", chosen)
VlnPlot(gsea_scd, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Warning: Removed 1 rows containing non-finite values (`stat_ydensity()`).

t_groups_idx <- grepl(pattern="_T_CELL", x=names(broad_types))
t_groups <- names(broad_types)[t_groups_idx]
t_nums <- which(t_groups_idx, broad_types)
columns <- paste0("m8", t_nums)
VlnPlot(gsea_scd, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)

t_groups
##  [1] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_T_CELL_AGEING"                             
##  [2] "TABULA_MURIS_SENIS_GONADAL_ADIPOSE_TISSUE_T_CELL_AGEING"                           
##  [3] "TABULA_MURIS_SENIS_HEART_T_CELL_AGEING"                                            
##  [4] "TABULA_MURIS_SENIS_KIDNEY_T_CELL_AGEING"                                           
##  [5] "TABULA_MURIS_SENIS_LIMB_MUSCLE_T_CELL_AGEING"                                      
##  [6] "TABULA_MURIS_SENIS_LIVER_MATURE_NK_T_CELL_AGEING"                                  
##  [7] "TABULA_MURIS_SENIS_LUNG_CD4_POSITIVE_ALPHA_BETA_T_CELL_AGEING"                     
##  [8] "TABULA_MURIS_SENIS_LUNG_CD8_POSITIVE_ALPHA_BETA_T_CELL_AGEING"                     
##  [9] "TABULA_MURIS_SENIS_LUNG_T_CELL_AGEING"                                             
## [10] "TABULA_MURIS_SENIS_LUNG_MATURE_NK_T_CELL_AGEING"                                   
## [11] "TABULA_MURIS_SENIS_MESENTERIC_ADIPOSE_TISSUE_CD4_POSITIVE_ALPHA_BETA_T_CELL_AGEING"
## [12] "TABULA_MURIS_SENIS_MESENTERIC_ADIPOSE_TISSUE_CD8_POSITIVE_ALPHA_BETA_T_CELL_AGEING"
## [13] "TABULA_MURIS_SENIS_MAMMARY_GLAND_T_CELL_AGEING"                                    
## [14] "TABULA_MURIS_SENIS_MARROW_CD4_POSITIVE_ALPHA_BETA_T_CELL_AGEING"                   
## [15] "TABULA_MURIS_SENIS_MARROW_MATURE_ALPHA_BETA_T_CELL_AGEING"                         
## [16] "TABULA_MURIS_SENIS_MARROW_NAIVE_T_CELL_AGEING"                                     
## [17] "TABULA_MURIS_SENIS_SPLEEN_CD4_POSITIVE_ALPHA_BETA_T_CELL_AGEING"                   
## [18] "TABULA_MURIS_SENIS_SPLEEN_CD8_POSITIVE_ALPHA_BETA_T_CELL_AGEING"                   
## [19] "TABULA_MURIS_SENIS_SPLEEN_T_CELL_AGEING"                                           
## [20] "TABULA_MURIS_SENIS_SPLEEN_MATURE_NK_T_CELL_AGEING"                                 
## [21] "TABULA_MURIS_SENIS_THYMUS_IMMATURE_T_CELL_AGEING"                                  
## [22] "TABULA_MURIS_SENIS_TRACHEA_T_CELL_AGEING"
t_groups_idx <- grepl(pattern="_EPITHELIAL_", x=names(broad_types))
t_groups <- names(broad_types)[t_groups_idx]
t_nums <- which(t_groups_idx, broad_types)
columns <- paste0("m8", t_nums)
VlnPlot(gsea_scd, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Warning: Removed 1 rows containing non-finite values (`stat_ydensity()`).

t_groups
##  [1] "DESCARTES_ORGANOGENESIS_EPITHELIAL_CELLS"                                                  
##  [2] "TABULA_MURIS_SENIS_KIDNEY_EPITHELIAL_CELL_OF_PROXIMAL_TUBULE_AGEING"                       
##  [3] "TABULA_MURIS_SENIS_KIDNEY_KIDNEY_COLLECTING_DUCT_EPITHELIAL_CELL_AGEING"                   
##  [4] "TABULA_MURIS_SENIS_KIDNEY_KIDNEY_DISTAL_CONVOLUTED_TUBULE_EPITHELIAL_CELL_AGEING"          
##  [5] "TABULA_MURIS_SENIS_KIDNEY_KIDNEY_LOOP_OF_HENLE_ASCENDING_LIMB_EPITHELIAL_CELL_AGEING"      
##  [6] "TABULA_MURIS_SENIS_KIDNEY_KIDNEY_LOOP_OF_HENLE_THICK_ASCENDING_LIMB_EPITHELIAL_CELL_AGEING"
##  [7] "TABULA_MURIS_SENIS_KIDNEY_KIDNEY_PROXIMAL_CONVOLUTED_TUBULE_EPITHELIAL_CELL_AGEING"        
##  [8] "TABULA_MURIS_SENIS_MAMMARY_GLAND_LUMINAL_EPITHELIAL_CELL_OF_MAMMARY_GLAND_AGEING"          
##  [9] "TABULA_MURIS_SENIS_SUBCUTANEOUS_ADIPOSE_TISSUE_EPITHELIAL_CELL_AGEING"                     
## [10] "TABULA_MURIS_SENIS_TRACHEA_BASAL_EPITHELIAL_CELL_OF_TRACHEOBRONCHIAL_TREE_AGEING"
t_groups_idx <- grepl(pattern="_ENDOTHELIAL_", x=names(broad_types))
t_groups <- names(broad_types)[t_groups_idx]
t_nums <- which(t_groups_idx, broad_types)
columns <- paste0("m8", t_nums)
VlnPlot(gsea_scd, features=columns,
        group.by="res0p1_clusters", same.y.lims=TRUE,
        ncol=4, pt.size=0)
## Warning: Removed 1 rows containing non-finite values (`stat_ydensity()`).

t_groups
##  [1] "DESCARTES_ORGANOGENESIS_ENDOTHELIAL_CELLS"                                    
##  [2] "TABULA_MURIS_SENIS_AORTA_AORTIC_ENDOTHELIAL_CELL_AGEING"                      
##  [3] "TABULA_MURIS_SENIS_BROWN_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"              
##  [4] "TABULA_MURIS_SENIS_BLADDER_ENDOTHELIAL_CELL_AGEING"                           
##  [5] "TABULA_MURIS_SENIS_BRAIN_NON_MYELOID_ENDOTHELIAL_CELL_AGEING"                 
##  [6] "TABULA_MURIS_SENIS_DIAPHRAGM_ENDOTHELIAL_CELL_AGEING"                         
##  [7] "TABULA_MURIS_SENIS_GONADAL_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"            
##  [8] "TABULA_MURIS_SENIS_HEART_ENDOTHELIAL_CELL_OF_CORONARY_ARTERY_AGEING"          
##  [9] "TABULA_MURIS_SENIS_HEART_AND_AORTA_ENDOTHELIAL_CELL_OF_CORONARY_ARTERY_AGEING"
## [10] "TABULA_MURIS_SENIS_LIMB_MUSCLE_ENDOTHELIAL_CELL_AGEING"                       
## [11] "TABULA_MURIS_SENIS_LIVER_ENDOTHELIAL_CELL_OF_HEPATIC_SINUSOID_AGEING"         
## [12] "TABULA_MURIS_SENIS_LUNG_ENDOTHELIAL_CELL_OF_LYMPHATIC_VESSEL_AGEING"          
## [13] "TABULA_MURIS_SENIS_LUNG_VEIN_ENDOTHELIAL_CELL_AGEING"                         
## [14] "TABULA_MURIS_SENIS_MESENTERIC_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"         
## [15] "TABULA_MURIS_SENIS_MAMMARY_GLAND_ENDOTHELIAL_CELL_AGEING"                     
## [16] "TABULA_MURIS_SENIS_PANCREAS_ENDOTHELIAL_CELL_AGEING"                          
## [17] "TABULA_MURIS_SENIS_SUBCUTANEOUS_ADIPOSE_TISSUE_ENDOTHELIAL_CELL_AGEING"       
## [18] "TABULA_MURIS_SENIS_TRACHEA_ENDOTHELIAL_CELL_AGEING"
pander::pander(sessionInfo())

R version 4.2.0 (2022-04-22)

Platform: x86_64-pc-linux-gnu (64-bit)

locale: LC_CTYPE=en_US.UTF-8, LC_NUMERIC=C, LC_TIME=en_US.UTF-8, LC_COLLATE=en_US.UTF-8, LC_MONETARY=en_US.UTF-8, LC_MESSAGES=en_US.UTF-8, LC_PAPER=en_US.UTF-8, LC_NAME=C, LC_ADDRESS=C, LC_TELEPHONE=C, LC_MEASUREMENT=en_US.UTF-8 and LC_IDENTIFICATION=C

attached base packages: stats4, stats, graphics, grDevices, utils, datasets, methods and base

other attached packages: tibble(v.3.1.8), GSEABase(v.1.60.0), graph(v.1.76.0), annotate(v.1.76.0), XML(v.3.99-0.13), AnnotationDbi(v.1.60.0), skimr(v.2.1.5), purrr(v.1.0.0), ggplot2(v.3.4.0), SeuratObject(v.4.1.3), Seurat(v.4.3.0), hpgltools(v.1.0), testthat(v.3.1.6), reticulate(v.1.26), SummarizedExperiment(v.1.28.0), GenomicRanges(v.1.50.2), GenomeInfoDb(v.1.34.6), IRanges(v.2.32.0), S4Vectors(v.0.36.1), MatrixGenerics(v.1.10.0), matrixStats(v.0.63.0), Biobase(v.2.58.0) and BiocGenerics(v.0.44.0)

loaded via a namespace (and not attached): ica(v.1.0-3), ps(v.1.7.2), Rsamtools(v.2.14.0), foreach(v.1.5.2), lmtest(v.0.9-40), rprojroot(v.2.0.3), crayon(v.1.5.2), rbibutils(v.2.2.11), MASS(v.7.3-58.1), nlme(v.3.1-161), backports(v.1.4.1), sva(v.3.46.0), GOSemSim(v.2.24.0), rlang(v.1.0.6), XVector(v.0.38.0), HDO.db(v.0.99.1), ROCR(v.1.0-11), irlba(v.2.3.5.1), nloptr(v.2.0.3), callr(v.3.7.3), limma(v.3.54.0), filelock(v.1.0.2), BiocParallel(v.1.32.5), rjson(v.0.2.21), bit64(v.4.0.5), glue(v.1.6.2), sctransform(v.0.3.5), vipor(v.0.4.5), pbkrtest(v.0.5.1), parallel(v.4.2.0), processx(v.3.8.0), spatstat.sparse(v.3.0-0), DOSE(v.3.24.2), spatstat.geom(v.3.0-3), tidyselect(v.1.2.0), usethis(v.2.1.6), fitdistrplus(v.1.1-8), variancePartition(v.1.28.0), tidyr(v.1.2.1), zoo(v.1.8-11), GenomicAlignments(v.1.34.0), xtable(v.1.8-4), magrittr(v.2.0.3), evaluate(v.0.19), Rdpack(v.2.4), cli(v.3.5.0), zlibbioc(v.1.44.0), rstudioapi(v.0.14), miniUI(v.0.1.1.1), sp(v.1.5-1), bslib(v.0.4.2), fastmatch(v.1.1-3), aod(v.1.3.2), treeio(v.1.22.0), shiny(v.1.7.4), xfun(v.0.36), pkgbuild(v.1.4.0), gson(v.0.0.9), cluster(v.2.1.4), caTools(v.1.18.2), tidygraph(v.1.2.2), KEGGREST(v.1.38.0), ggrepel(v.0.9.2), ape(v.5.6-2), listenv(v.0.9.0), Biostrings(v.2.66.0), png(v.0.1-8), future(v.1.30.0), withr(v.2.5.0), bitops(v.1.0-7), ggforce(v.0.4.1), plyr(v.1.8.8), pillar(v.1.8.1), gplots(v.3.1.3), cachem(v.1.0.6), GenomicFeatures(v.1.50.3), fs(v.1.5.2), clusterProfiler(v.4.6.0), vctrs(v.0.5.1), ellipsis(v.0.3.2), generics(v.0.1.3), devtools(v.2.4.5), tools(v.4.2.0), beeswarm(v.0.4.0), munsell(v.0.5.0), tweenr(v.2.0.2), fgsea(v.1.24.0), DelayedArray(v.0.24.0), fastmap(v.1.1.0), compiler(v.4.2.0), pkgload(v.1.3.2), abind(v.1.4-5), httpuv(v.1.6.7), rtracklayer(v.1.58.0), sessioninfo(v.1.2.2), plotly(v.4.10.1), GenomeInfoDbData(v.1.2.9), gridExtra(v.2.3), edgeR(v.3.40.1), lattice(v.0.20-45), deldir(v.1.0-6), utf8(v.1.2.2), later(v.1.3.0), dplyr(v.1.0.10), BiocFileCache(v.2.6.0), jsonlite(v.1.8.4), scales(v.1.2.1), tidytree(v.0.4.2), pbapply(v.1.6-0), genefilter(v.1.80.2), lazyeval(v.0.2.2), promises(v.1.2.0.1), doParallel(v.1.0.17), R.utils(v.2.12.2), goftest(v.1.2-3), spatstat.utils(v.3.0-1), rmarkdown(v.2.19), cowplot(v.1.1.1), Rtsne(v.0.16), pander(v.0.6.5), downloader(v.0.4), uwot(v.0.1.14), igraph(v.1.3.5), survival(v.3.4-0), yaml(v.2.3.6), htmltools(v.0.5.4), memoise(v.2.0.1), profvis(v.0.3.7), BiocIO(v.1.8.0), locfit(v.1.5-9.7), graphlayouts(v.0.8.4), viridisLite(v.0.4.1), digest(v.0.6.31), assertthat(v.0.2.1), RhpcBLASctl(v.0.21-247.1), mime(v.0.12), rappdirs(v.0.3.3), repr(v.1.1.4), RSQLite(v.2.2.20), yulab.utils(v.0.0.6), future.apply(v.1.10.0), remotes(v.2.4.2), data.table(v.1.14.6), urlchecker(v.1.0.1), blob(v.1.2.3), R.oo(v.1.25.0), labeling(v.0.4.2), splines(v.4.2.0), RCurl(v.1.98-1.9), broom(v.1.0.2), hms(v.1.1.2), colorspace(v.2.0-3), base64enc(v.0.1-3), ggbeeswarm(v.0.7.1), aplot(v.0.1.9), ggrastr(v.1.0.1), sass(v.0.4.4), Rcpp(v.1.0.9), RANN(v.2.6.1), enrichplot(v.1.18.3), fansi(v.1.0.3), tzdb(v.0.3.0), brio(v.1.1.3), parallelly(v.1.33.0), R6(v.2.5.1), grid(v.4.2.0), ggridges(v.0.5.4), lifecycle(v.1.0.3), curl(v.4.3.3), minqa(v.1.2.5), leiden(v.0.4.3), jquerylib(v.0.1.4), PROPER(v.1.30.0), Matrix(v.1.5-3), qvalue(v.2.30.0), desc(v.1.4.2), RcppAnnoy(v.0.0.20), RColorBrewer(v.1.1-3), iterators(v.1.0.14), spatstat.explore(v.3.0-5), stringr(v.1.5.0), htmlwidgets(v.1.6.0), polyclip(v.1.10-4), biomaRt(v.2.54.0), shadowtext(v.0.1.2), gridGraphics(v.0.5-1), mgcv(v.1.8-41), globals(v.0.16.2), patchwork(v.1.1.2), spatstat.random(v.3.0-1), progressr(v.0.12.0), codetools(v.0.2-18), GO.db(v.3.16.0), gtools(v.3.9.4), prettyunits(v.1.1.1), dbplyr(v.2.2.1), R.methodsS3(v.1.8.2), gtable(v.0.3.1), DBI(v.1.1.3), ggfun(v.0.0.9), tensor(v.1.5), httr(v.1.4.4), highr(v.0.10), KernSmooth(v.2.23-20), stringi(v.1.7.8), vroom(v.1.6.0), progress(v.1.2.2), reshape2(v.1.4.4), farver(v.2.1.1), viridis(v.0.6.2), ggtree(v.3.6.2), xml2(v.1.3.3), boot(v.1.3-28.1), lme4(v.1.1-31), restfulr(v.0.0.15), readr(v.2.1.3), ggplotify(v.0.1.0), scattermore(v.0.8), bit(v.4.0.5), scatterpie(v.0.1.8), spatstat.data(v.3.0-0), ggraph(v.2.1.0), pkgconfig(v.2.0.3) and knitr(v.1.41)

message(paste0("This is hpgltools commit: ", get_git_commit()))
## If you wish to reproduce this exact build of hpgltools, invoke the following:
## > git clone http://github.com/abelew/hpgltools.git
## > git reset 140f18734ff1a7e49669ad91dd4f469f0560ca1a
## This is hpgltools commit: Sun Jan 29 15:36:20 2023 -0500: 140f18734ff1a7e49669ad91dd4f469f0560ca1a
this_save <- paste0(gsub(pattern="\\.Rmd", replace="", x=rmd_file), "-v", ver, ".rda.xz")
##message(paste0("Saving to ", this_save))
##tmp <- sm(saveme(filename=this_save))
LS0tCnRpdGxlOiAiUGxheWluZyB3aXRoIHNvbWUgbmV3IHNjUk5BU2VxIGRhdGE6IEErQiAyMDIzMDEuIgphdXRob3I6ICJhdGIgYWJlbGV3QGdtYWlsLmNvbSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgZmlnX2NhcHRpb246IHRydWUKICAgIGZpZ19oZWlnaHQ6IDcKICAgIGZpZ193aWR0aDogNwogICAgaGlnaGxpZ2h0OiB0YW5nbwogICAga2VlcF9tZDogZmFsc2UKICAgIG1vZGU6IHNlbGZjb250YWluZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRoZW1lOiByZWFkYWJsZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UKLS0tCgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgpib2R5LCB0ZCB7CiAgZm9udC1zaXplOiAxNnB4Owp9CmNvZGUucnsKICBmb250LXNpemU6IDE2cHg7Cn0KcHJlIHsKIGZvbnQtc2l6ZTogMTZweAp9Cjwvc3R5bGU+CgpgYGB7ciBvcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KCJocGdsdG9vbHMiKQpsaWJyYXJ5KCJyZXRpY3VsYXRlIikKdHQgPC0gZGV2dG9vbHM6OmxvYWRfYWxsKCJ+L2hwZ2x0b29scyIpCmtuaXRyOjpvcHRzX2tuaXQkc2V0KHdpZHRoPTEyMCwKICAgICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3M9VFJVRSwKICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UUlVFLAogICAgICAgICAgICAgICAgICAgICBlY2hvPVRSVUUpCmtuaXRyOjpvcHRzX2NodW5rJHNldChlcnJvcj1UUlVFLAogICAgICAgICAgICAgICAgICAgICAgZHBpPTk2KQpsdWFfZmlsdGVycyA8LSBybWFya2Rvd246OnBhbmRvY19sdWFfZmlsdGVyX2FyZ3MoInBhbmRvYy16b3R4dC5sdWEiKQpvbGRfb3B0aW9ucyA8LSBvcHRpb25zKGRpZ2l0cz00LAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAga25pdHIuZHVwbGljYXRlLmxhYmVsPSJhbGxvdyIpCmdncGxvdDI6OnRoZW1lX3NldChnZ3Bsb3QyOjp0aGVtZV9idyhiYXNlX3NpemU9MTApKQpydW5kYXRlIDwtIGZvcm1hdChTeXMuRGF0ZSgpLCBmb3JtYXQ9IiVZJW0lZCIpCnByZXZpb3VzX2ZpbGUgPC0gIiIKdmVyIDwtICIyMDIzMDEiCgojI3RtcCA8LSBzbShsb2FkbWUoZmlsZW5hbWU9cGFzdGUwKGdzdWIocGF0dGVybj0iXFwuUm1kIiwgcmVwbGFjZT0iIiwgeD1wcmV2aW91c19maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpKSkKcm1kX2ZpbGUgPC0gImluZGV4X0FCLlJtZCIKbGlicmFyeShTZXVyYXQpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShwdXJycikKbGlicmFyeShza2ltcikKbGlicmFyeShHU0VBQmFzZSkKbGlicmFyeSh0aWJibGUpCmBgYAoKIyBOb3RlczoKCiMjIFF1ZXJ5aW5nIERyLiBNb3NzZXIgMjAyMzAxMjMKCiogUXVlc3Rpb24gZnJvbSBOYWppYjogQ29ubmVjdGlvbiBiZXR3ZWVuIDUnIGxpYnJhcmllcyBhbmQgVkRKLCB0YWdzCiAgYXJlIGluIGZhY3Qgc2hhcmVkIGZyb20gVkRKL3N1cmZhY2UgdG8gdGhlICdwYXJlbnQnIEdFTS4gIEFwcmlsOiBEbwogIEdFTSBnZW5lcmF0aW9uLCB0aGVuIHNwbGl0IHRoZSByZXN1bHRpbmcgY0ROQSBhdCBjbGVhbnVwIHN0ZXAgdG8gdGhlCiAgcHJvdGVpbiBiYXJjb2RlIHNldCAoYXQgYmVhZCBjbGVhbnVwKSwgdGhlbiBnbyBpbnRvIHJlZ3VsYXIgNScKICBleHByZXNzaW9uIGxpYnJhcnksIGZyb20gd2hpY2ggYSBzZXQgb2Ygc3BlY2lmaWMgcHJpbWVycyBhcmUgdXNlZCB0bwogIGVucmljaCB0aGUgVkRKIHBvcnRpb24uICBUaHVzIGFsbCB0aHJlZSBoYXZlIHRoZSBzYW1lIHBhcmVudGFsIGNlbGwKICB0YWcuCiogUXVlc3Rpb24gZnJvbSBBcHJpbDogRG8gd2UgbmVlZCB0byBjaGFuZ2UgdGhlIGlucHV0czsgZnJvbSBob3cgbWFueSBjZWxscwogIGRpZCB3ZSByZWNvdmVyIHJlYWRzPyAgSGUgd2FudHMgMTAsMDAwIGNlbGxzIC8gYW5pbWFsLiAgQXByaWwgcG9vbGVkCiAgYWNjb3JkaW5nIHRvIDEweCByZWNvbW1lbmRhdGlvbnM6IDE6NCBWREo6ZXhwcmVzc2lvbiBsaWJyYXJ5LgogIFN1cmZhY2UgcHJvdGVpbiBsaWJyYXJpZXMgaGF2ZSBub3QgeWV0IGJlZW4gcnVuLCB0aGVzZSBoYXZlIHNlcGFyYXRlCiAgaW5kZXhlcyBhbmQgYXJlIG11Y2ggc2hvcnRlcjsgaW4gY29udHJhc3QgdGhlIFZESi9leHByZXNzaW9uCiAgbGlicmFyaWVzIGFyZSByZWxhdGl2ZWx5IHNpbWlsYXIgKDU1MCB2cyA2MzAgbnQpLgoqIEZyb20gTmFqaWI6IHdoeSA1JyB2cyAzJyBjYXB0dXJlPyAgTm90IGVudGlyZWx5IGNlcnRhaW4sIGJ1dCA1JyBraXQKICBpcyB1c2VkIGZvciBpbW11bm9sb2d5IHVzdWFsbHksIGFwcGFyZW50bHkuCiogUXVlc3Rpb25zIGFib3V0IHRoZSBjZWxsIHByZXBhcmF0aW9uczogd2hhdCB3YXMgdGhlIHN0YXR1cyBvZiB0aGUKICBjZWxscyBhdCBHRU0gZ2VuZXJhdGlvbj8gIENhbiB3ZSBsZWFybiBpZiB0aGF0IGFmZmVjdGVkIHRoZSBudW1iZXIKICBvZiBjZWxscyBvYnNlcnZlZCwgcmVhZHMvY2VsbD8gIENhbiBBcHJpbCB0d2VhayB0aGUgc2VxdWVuY2luZwogIGxpYnJhcnkgaW5wdXRzIHRvIGhlbHAgZXZlbiBvdXQgdGhlIGRpZmZlcmVuY2VzIGFjcm9zcyBzYW1wbGVzIGZvcgogIGZ1dHVyZSBydW5zIChnaXZlbiB0aGF0IHRoZXJlIGFyZSAzKEkgdGhpbmspIGNvbWluZyB1cCk/CiAgQ29udmVyc2VseSwgc2hvdWxkIEkgcmVwcm9jZXNzIHRoZSBzYW1wbGVzIHNvIHRoYXQgYWxsIHNhbXBsZXMgYXJlCiAgcGVyY2VpdmVkIGFzIGhhdmluZyB0aGUgbGVhc3QgbnVtYmVyIG9mIGNlbGxzIG9ic2VydmVkPwoqIFF1aWNrIHByaW1lciBvZiByZWNvbWJpbmF0aW9uIGFuZCBWKEQpSjogZWFjaCByZWNlcHRvciBpcwogIGhldGVyb2RpbWVyLCBoZWF2eSBjaGFpbiBoYXMgdGhlIGNvbnN0YW50LCBWLCBELCBhbmQgSi4gIENvbnZlcnNlbHkgdGhlCiAgbGlnaHQgY2hhaW4gaGFzIHRoZSBjb25zdGFudCBhbmQgdGhlIFZKLiAgSW4gVC1jZWxscywgYWxsZWxpYwogIGV4Y2x1c2lvbiByZXN1bHRzIGluIGEgc2luZ2xlIHJlc3VsdGluZyBleHByZXNpc29uIGV2ZW50LiAgSW4KICBCLWNlbGxzIHRoZXJlIG1heSBiZSBtYW55LiAgSW4tdG90byB0aGVyZSBpcyBhIG5lYXItaW5maW5pdGUgcmFuZG9tCiAgc2V0IG9mIHBvc3NpYmlsaXRpZXM7IHRoZXNlIGFyZSBhbGwgcmFuZG9tbHkgZ2VuZXJhdGVkIGR1cmluZwogIGRldmVsb3BtZW50LiAgQi1jZWxscyBhcmUgY29uc3RhbnRseSBtYWtpbmcgbmV3IGNvbWJpbmF0aW9ucyBkdXJpbmcKICB0aGUgbGlmZXNwYW4gLS0gVC1jZWxscyBhcmUgbG9uZy1saXZlZCBhbmQgY29uc3RhbnQgKERhdmUgZXhwbGFpbmVkCiAgYW4gZXhwZXJpbWVudCB3aGVyZSBzb21lb25lIHRyYW5zZmVycmVkIFQtY2VsbHMgZnJvbSBtb3VzZSB0byBtb3VzZQogIG92ZXIgdGhlIGNvdXJzZSBvZiBtYW55IHllYXJzKS4gIChvcmllbnRhdGlvbiA1Jy0+Myc/ICBjb25zdGFudC0+RC0+Sj8pCiogRXZlcnkgY2VsbCB0aGF0IHdhcyBzZXF1ZW5jZWQgaXMgaW4gdGhlb3J5IGEgVC1jZWxsICgibHVuZyBpbmZlY3RlZAogIFQtY2VsbHMgZnJvbSBtaWNlKSwgc28gc2hvdWxkIGFsbCBoYXZlIFZESiBzZXF1ZW5jZXMuICBBIHNtYWxsIHNldAogIG9mIGltbXVuZSBjZWxscyAoTkspIGRvIG5vdCBoYXZlIHRoZXNlLgoKIyMgQ2hlY2tpbiBtZWV0aW5nIHdpdGggRHIuIFBhcmsgMjAyMzAxMjQKCiogQXByaWwgZGVzY3JpYmluZyBvYnNlcnZhdGlvbnMsIGNlbGwgI3MgZXRjLgoqIERlZmluaXRlbHkgbm90IEZBQ1MsIHBlcmZvcm1lZCBuZWdhdGl2ZSBlbnJpY2htZW50IHdoaWNoIGluIHRoZW9yeSBnZXRzID49IDkwJSBwdXJlIHNhbXBsZXMuCiogTmFqaWIgcXVlcnk6IGxpbWl0IHRvIFZESiBjZWxscyBvbmx5PyAgVW5saWtlbHkuCiogSXQgc291bmRzIHRvIG1lIHRoYXQgdGhlIGxpa2VseSB0YXNrcyBJIHBlcmZvcm0gYXJlIG5vdCBuZWVkZWQgYnkgRHIuIFBhcmsuCgojIFRPRE86CgoqIENoZWNrIGV4cHJlc3Npb24gb2YgdGhlIHNhbXBsZXMgZm9yIGxldmVscyBvZiBDRDMuCiogUHJpbnQgb3V0IGZpbHRlcmVkIGFtb3VudHMgb24gYSBwZXItc2FtcGxlIGJhc2lzLgoqIFF1ZXJ5IG1TaWdEQiBjYXRlZ29yaWVzIG9mIGludGVyZXN0IChjdXJyZW50bHkgSSBncmFiYmVkIHRoZSB+OTgKICBpbmZsdWVuemEgY2F0ZWdvcmllcyBhcmJpdHJhcmlseSk6IGUuZy4gZmlndXJlIG91dCB3aGljaCBvbmVzIGFyZQogIGFjdHVhbGx5IHJlbGV2YW50LgoKIyBDaGFuZ2Vsb2cKCiMgUHJlcHJvY2Vzc2luZyB3aXRoIGNlbGxyYW5nZXIKCkkgZG93bmxvYWRlZCBhIG5ldyB2ZXJzaW9uIG9mIGNlbGxyYW5nZXIgYWxvbmcgd2l0aCB0aGUgdmFyaW91cwpyZWZlcmVuY2UgZmlsZXMgcHJvdmlkZWQgYnkgMTB4IGZvciB0aGUgVkQoSikgcmVmZXJlbmNlcyBldGMuICBJIGdvdCBhCmJpdCBkaXN0cmFjdGVkIGJ5IHRoZSBwaXBlbGluZSBsYW5ndWFnZSBpbXBsZW1lbnRlZCBieSAxMHggY2FsbGVkCidtYXJ0aWFuJy4gICBJIGhhdmUgdGhlIGZlZWxpbmcgdGhhdCBpdCBtaWdodCBwcm92ZSBhIGdvb2QgdGhpbmcgdG8KcGxheSB3aXRoLgoKSGVyZSBhcmUgdGhlIGNvbW1hbmRzIEkgcmFuIHRvIHNlcGFyYXRlIHRoZSBzYW1wbGVzIGFuZCBwZXJmb3JtIHRoZQphbGlnbm1lbnRzLiAgVGhlcmUgYXJlIDQgc2FtcGxlIG5hbWVzIGFuZCBlYWNoIHdhcyBkb25lIHdpdGggb25lIHJ1bgpvZiB0aGUgJ25vcm1hbCcgR0VYIHNjUk5BU2VxIG1ldGhvZCBhbmQgb25lIG9mIHRoZSAobmV3IHRvIG1lKSBWKEQpSgpsaWJyYXJ5LgoKIyBSZXJ1biB0aGUgcGlwZWxpbmUgd2l0aCBtdWx0aQoKQXByaWwga2luZGx5IHNlbnQgc29tZSBpbmZvcm1hdGlvbiBmcm9tIDEweCB3aGljaCBzaG93cyB0aGF0IEkgc2hvdWxkCmhhdmUgdXNlZCB0aGUgbXVsdGkgcGlwbGluZSB3aGVuIHByZXByb2Nlc3NpbmcgdGhlIGRhdGEuCgpJbnRyYS1NdXNjdWxhciB2cy4gTmFzYWwKCkkgd3JvdGUgNCBzZXBhcmF0ZSBjb25maWd1cmF0aW9uIGNzdiBmaWxlcyB1c2luZyB0aGUgdGVtcGxhdGVzIEkKZG93bmxvYWRlZCBhbmQgZm9sbG93aW5nIGEgbGl0dGxlIHJlYWRpbmcuICBJdCBzZWVtZWQgdG8gbWUgdGhhdCBJCnNob3VsZCBiZSBhYmxlIHRvIHByb2Nlc3MgdGhlbSBhbGwgYXMgYSBzaW5nbGUgY3N2IGZpbGUsIGJ1dCB3aGVuIEkKYXR0ZW1wdGVkIHRoYXQsIGNlbGxyYW5nZXIgZGlkIG5vdCByZWFjdCB3ZWxsLiAgSXQgYWxzbyB0b29rIGEgZmV3CnRyaWVzIGJlZm9yZSBJIGdvdCB0aGUgdmFyaW91cyByZWZlcmVuY2UvbGlicmFyeSBvcHRpb25zIGNvcnJlY3QuCgpOb3RlIHRoYXQgb25jZSBjZWxscmFuZ2VyIHN1Y2Nlc3NmdWxseSByYW4gZm9yIHRoZSBzYW1wbGVzIEkgbW92ZWQKdGhlbSB0byB0aGUgbXVsdGkvIGRpcmVjdG9yeSBzbyB0aGF0IEkgY2FuIGNvbXBhcmUgdGhlIG91dHB1dHMgdG8gd2hlbgpJIHNpbXBseSBkaWQgdGhlICdjb3VudCcgb3BlcmF0aW9uLgoKVGhlIGZvbGxvd2luZyBpbnZvY2F0aW9ucyBvZiBjZWxscmFuZ2VyIGFsbCBhcHBlYXIgdG8gd29yayB3aXRob3V0IGFueQpwcm9ibGVtcy4gIElkZWFsbHkgSSB3b3VsZCBsaWtlIHRoZW0gdG8gYmUgZG9uZSBpbiBhIHNpbmdsZSBydW4sIHRob3VnaC4KCiMjIyBTaGVuYW5pZ2FucyBmb3IgY29tYmluZWQgVkRKIHNhbXBsZXMKCk15IGF0dGVtcHRzIHNvIGZhciB0byB1c2UgdGhlIGNzdiBjb25maWd1cmF0aW9uIHRvIGNvbmNhdGVuYXRlCm11bHRpcGxlIHZkaiBsaWJyYXJpZXMgaGF2ZSBub3Qgd29ya2VkLCBzbyBJIGNob3NlIHRvIGRvIGl0IHRoZSBzdHVwaWQKd2F5LCB3aGljaCBpcyB3aGF0IEkgc2hvdWxkIGhhdmUganVzdCBkb25lIHRvIGJlZ2luIHdpdGguICBDYXZlYXQsIGl0CndvcmtzIGZpbmUgZm9yIHRoZSBnZXggbGlicmFyaWVzIHRvIGRvIGl0IHRoZSB3YXkgdGhlIGRvY3VtZW50YXRpb24Kc3VnZ2VzdHMuCgpgYGB7YmFzaCBzaGVuYW5pZ2FucywgZXZhbD1GQUxTRX0KY2QgcHJlcHJvY2Vzc2luZwpmb3IgaSBpbiBSMSBSMjsgZG8KICAgIGZvciBqIGluIENvbnRyb2wgTW9ja19NZXgwOSBJTV9NZXgwOSBJTl9NZXgwOTsgZG8KICAgICAgICBBX2ZpbGU9JCgvYmluL2xzIEFfJHtqfV9WREoqXyR7aX1fMDAxLmZhc3RxLmd6KQogICAgICAgIEJfZmlsZT0kKC9iaW4vbHMgQl8ke2p9X1ZESipfJHtpfV8wMDEuZmFzdHEuZ3opCiAgICAgICAgb3V0X2ZpbGU9IkNvbmNhdF8ke2p9X1ZESl8ke2l9LmZhc3RxLmd6IgogICAgICAgIGNwX2NtZD0iY3AgJHtBX2ZpbGV9ICR7b3V0X2ZpbGV9IgogICAgICAgIGVjaG8gIlJ1bm5pbmc6ICR7Y3BfY21kfS4iCiAgICAgICAgZXZhbCAkY3BfY21kCiAgICAgICAgY2F0X2NtZD0iY2F0ICR7Ql9maWxlfSA+PiAke291dF9maWxlfSIKICAgICAgICBlY2hvICJSdW5uaW5nOiAke2NhdF9jbWR9LiIKICAgICAgICBldmFsICRjYXRfY21kCiAgICBkb25lCmRvbmUKYGBgCgpgYGB7YmFzaCBjZWxscmFuZ2VydjIsIGV2YWw9RkFMU0V9Cm1vZHVsZSBhZGQgY2VsbHJhbmdlcgpjZWxscmFuZ2VyIG11bHRpIC0taWQgY29udHJvbCAtLWNzdiBzYW1wbGVfc2hlZXRzL211bHRpX2NvbmZpZ190cnkwNV9jb250cm9sLmNzdgpjZWxscmFuZ2VyIG11bHRpIC0taWQgbW9jayAtLWNzdiBzYW1wbGVfc2hlZXRzL211bHRpX2NvbmZpZ190cnkwNV9tb2NrLmNzdgpjZWxscmFuZ2VyIG11bHRpIC0taWQgbSAtLWNzdiBzYW1wbGVfc2hlZXRzL211bHRpX2NvbmZpZ190cnkwNV9tLmNzdgpjZWxscmFuZ2VyIG11bHRpIC0taWQgbiAtLWNzdiBzYW1wbGVfc2hlZXRzL211bHRpX2NvbmZpZ190cnkwNV9uLmNzdgoKbXYgY29udHJvbCBtb2NrIG0gbiAwMW11bHRpX2NvbWJpbmVkLwpgYGAKCiMgQW5ub3RhdGlvbnMKCkkgd29uZGVyIGlmIEkgY2FuIHB1dCB0aGUgZ2VuZSBhbm5vdGF0aW9ucyBpbnRvIHRoZSBtaXNjIHNsb3Qgb2YgdGhlCnNldXJhdCBkYXRhIHN0cnVjdHVyZT8gIEFuZCBwZXJoYXBzIG92ZXJsb2FkIGZEYXRhKCkgdG8gdXNlIGl0PwoKYGBge3IgaGczOF9mdW59CmFubm90YXRpb25zIDwtIGxvYWRfYmlvbWFydF9hbm5vdGF0aW9ucygpJGFubm90YXRpb24KYnJpZWYgPC0gdW5pcXVlKGFubm90YXRpb25zWywgYygiaGduY19zeW1ib2wiLCAiZGVzY3JpcHRpb24iKV0pCmBgYAoKIyBTZXQgcHJlZml4IG9mIHRoZSBkYXRhCgpgYGB7ciBwcmVmaXh9CiNwcmVmaXggPC0gIm11bHRpIgpwcmVmaXggPC0gIjAxbXVsdGlfY29tYmluZWQiCmBgYAoKIyBMb2FkIHRoZSBkYXRhIGludG8gU2V1cmF0IGFuZCBwb2tlIGF0IGl0CgpUaGUgZm9sbG93aW5nIGJsb2NrIGlzIG1vc3RseSBhIGN1dC9wYXN0ZSBvZiBpdHNlbGYgd2hlcmUgSSBzZXQgdGhlCihvdmVyKXNpbXBsaWZpZWQgbmFtZSBvZiBlYWNoIHNhbXBsZS4gIFRoaXMgdGhlbiBiZWNvbWVzIHRoZSB0ZW1wbGF0ZQpmb3IgdGhlIHBhdGggYW5kIHBhcmFtZXRlcnMgdXNlZCB0byByZWFkIHRoZSBkYXRhLCBjcmVhdGUgYSBzZXVyYXQKb2JqZWN0LCBhbmQgYWRkIHRoZSBjbG9ub3R5cGUgZGF0YSBmcm9tIHRoZSB2ZGogcnVuLgoKRm9yIHRoZSBtb21lbnQgSSB3YW50IHRvIGJlIGFibGUgdG8gcGxheSB3aXRoIHRoZSBpbmRpdmlkdWFsCnNhbXBsZXMgYXMgd2VsbCBhcyB0aGUgYWdncmVnYXRlIHNvIHRoYXQgSSBjYW4gYmV0dGVyIHVuZGVyc3RhbmQgdGhlCmRhdGEuICBTbyBJIGd1ZXNzIGl0IHdvcmtzIG91dCB0aGF0IEkgZGlkbid0IGZpZ3VyZSBvdXQgaG93IHRvIHJ1biBhbGwKdGhlIHNhbXBsZXMgYXQgdGhlIHNhbWUgdGltZSB2aWEgJ2NlbGxyYW5nZXIgbXVsdGknLgoKSSBhbSBwcmV0dHkgc3VyZSBTZXVyYXQncyBtZXJnZSgpIG92ZXJsb2FkIGFsbG93cyBvbmUgdG8ganVzdCBkbwonbWVyZ2UoYSxiLGMsZCxlLi4uKScgYnV0IEkgYW0gbm90IHVzaW5nIHRoYXQuCgpJIHdyb3RlIGEgbGl0dGxlIGZ1bmN0aW9uIHRvIG1ha2UgbG9hZGluZyB0aGUgU2V1cmF0IGRhdGEgZnJvbSBhCnNhbXBsZSBzaGVldCBlYXNpZXIuICBNeSBpbnRlbnRpb24gaXMgdG8gaGF2ZSBzb21lIG9mIHRoaXMgY29kZSB3cml0ZQpiYWNrIHRvIHRoYXQgc2FtcGxlIHNoZWV0LgoKYGBge3Igc2V1cmF0X2xvYWRpbmd9CmFsbF9zY2QgPC0gY3JlYXRlX3NjZCgic2FtcGxlX3NoZWV0cy9hbGxfc2FtcGxlcy5jc3YiLAogICAgICAgICAgICAgICAgICAgICAgdmRqX3RfY29sdW1uID0gInZkanRjZWxscyIpCgpjb250cm9sX2NlbGxfaWR4IDwtIGFsbF9zY2RbWyJvcmlnLmlkZW50Il1dID09ICJjb250cm9sIgpjb250cm9sX2NlbGxzIDwtIGFsbF9zY2RbLCBjb250cm9sX2NlbGxfaWR4XQptb2NrX2NlbGxfaWR4IDwtIGFsbF9zY2RbWyJvcmlnLmlkZW50Il1dID09ICJtb2NrIgptb2NrX2NlbGxzIDwtIGFsbF9zY2RbLCBtb2NrX2NlbGxfaWR4XQptdXNjdWxhcl9jZWxsX2lkeCA8LSBhbGxfc2NkW1sib3JpZy5pZGVudCJdXSA9PSAibSIKbXVzY3VsYXJfY2VsbHMgPC0gYWxsX3NjZFssIG11c2N1bGFyX2NlbGxfaWR4XQpuYXNhbF9jZWxsX2lkeCA8LSBhbGxfc2NkW1sib3JpZy5pZGVudCJdXSA9PSAibiIKbmFzYWxfY2VsbHMgPC0gYWxsX3NjZFssIG5hc2FsX2NlbGxfaWR4XQpgYGAKCiMgUXVlcnkgZm9yIGNsb25vdHlwZXMgaW4gdGhlIGluZGl2aWR1YWwgc2FtcGxlcyBhbmQgdGhlIGZ1bGwgZGF0YXNldC4KCmBgYHtyIHF1ZXJ5X2Nsb25vdHlwZXN9CmNvbnRyb2xfY2xvbm8gPC0gIWlzLm5hKGNvbnRyb2xfY2VsbHNbWyJyYXdfY2xvbm90eXBlX2lkIl1dKQpzdW1tYXJ5KGNvbnRyb2xfY2xvbm8pCgptb2NrX2Nsb25vIDwtICFpcy5uYShtb2NrX2NlbGxzW1sicmF3X2Nsb25vdHlwZV9pZCJdXSkKc3VtbWFyeShtb2NrX2Nsb25vKQoKbV9jbG9ubyA8LSAhaXMubmEobXVzY3VsYXJfY2VsbHNbWyJyYXdfY2xvbm90eXBlX2lkIl1dKQpzdW1tYXJ5KG1fY2xvbm8pCgpuX2Nsb25vIDwtICFpcy5uYShuYXNhbF9jZWxsc1tbInJhd19jbG9ub3R5cGVfaWQiXV0pCnN1bW1hcnkobl9jbG9ubykKYGBgCgojIEluaXRpYWwgQ2x1c3RlcnMKCkkgd2FudCB0byB0YWtlIGEgY291cGxlIG1pbnV0ZXMgdG8gYWRkIHNvbWUgYW5ub3RhdGlvbnMgdG8gdGhlIHNldXJhdApvYmplY3QsIG5vdGFibHkgSSB3YW50IHRvIHN0YXRlIHRoZSBpZGVudGl0eSByZWxhdGlvbnNoaXBzIHdpdGggc29tZQpzb3J0IG9mIG5hbWUuCgpUaHVzIEkgd2lsbCBtYWtlIGEgdmVjdG9yIG9mIHRoZSB0aGUgc2FtcGxlIElEcyBhbmQgZm9yIGVhY2ggb25lIG1ha2UKYSBjYXRlZ29yeSBvZiBzZWxmL25vdC1zZWxmLiAgTm90ZSB0aGF0IFNldXJhdCBjb21lcyB3aXRoIGEgZnVuY3Rpb24KJ0ZpbmRDb25zZXJ2ZWRNYXJrZXJzKCknIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgd2hpY2ggY29tcGFyZXMgZWFjaApzZWxmIHRvIGFsbCBvdGhlciBzYW1wbGVzLCBzbyB0aGlzIG1heSBiZSByZWR1bmRhbnQ7IGJ1dCBpdCBpcyBraW5kIG9mCm5pY2UgdG8gYmUgYWJsZSB0byBzZWUgdGhlIGNhdGVnb3JpZXMgYXMgYSBzZXQgb2YgYmluYXJ5IGluZGV4ZXMuCgpgYGB7ciBpbml0aWFsX2NsdXN0ZXJzfQpjbHVzdGVyX2xldHRlcnMgPC0gYXMuZmFjdG9yKExFVFRFUlNbSWRlbnRzKG9iamVjdD1hbGxfc2NkKV0pCm5hbWVzKGNsdXN0ZXJfbGV0dGVycykgPC0gY29sbmFtZXMoeD1hbGxfc2NkKQpzYW1wbGVfaWRzIDwtIGFzLmNoYXJhY3RlcihjbHVzdGVyX2xldHRlcnMpCmBgYAoKTm93IHRoYXQgSSBoYXZlIDQgaWRlbnRpY2FsIHZlY3RvcnMsIGZpbGwgdGhlbSB3aXRoIG15IGNob3NlbiBuYW1lcwpmb3IgdGhlIHNhbXBsZXMgYW5kIHdoZXRoZXIgdGhleSBkbyhudCkgaGF2ZSB0aGF0IGlkZW50aXR5LgoKYGBge3Igc2VsZl9ub3RzZWxmfQpjb250cm9sX2lkeCA8LSBzYW1wbGVfaWRzID09ICJBIgphbGxfc2NkW1siY29udHJvbF9zdGF0ZSJdXSA8LSAiU3RpbXVsYXRlZCIKYWxsX3NjZEBtZXRhLmRhdGFbY29udHJvbF9pZHgsICJjb250cm9sX3N0YXRlIl0gPC0gIkNvbnRyb2wiCgptb2NrX2lkeCA8LSBzYW1wbGVfaWRzICA9PSAiQiIKYWxsX3NjZFtbIm1vY2tfc3RhdGUiXV0gPC0gIk5vdCBNb2NrIgphbGxfc2NkQG1ldGEuZGF0YVttb2NrX2lkeCwgImNvbnRyb2xfc3RhdGUiXSA8LSAiTW9jayIKCm1vY2tfaWR4IDwtIHNhbXBsZV9pZHMgID09ICJDIgphbGxfc2NkW1sibXVzY3VsYXJfc3RhdGUiXV0gPC0gIk5vdCBNdXNjdWxhciIKYWxsX3NjZEBtZXRhLmRhdGFbbW9ja19pZHgsICJtdXNjdWxhcl9zdGF0ZSJdIDwtICJNdXNjdWxhciIKCm1vY2tfaWR4IDwtIHNhbXBsZV9pZHMgID09ICJEIgphbGxfc2NkW1sibmFzYWxfc3RhdGUiXV0gPC0gIk5vdCBOYXNhbCIKYWxsX3NjZEBtZXRhLmRhdGFbbW9ja19pZHgsICJuYXNhbF9zdGF0ZSJdIDwtICJOYXNhbCIKYGBgCgpOb3cgYWRkIHRoZXNlIGNhdGVnb3JpZXMgdG8gdGhlIHNhbXBsZSBtZXRhZGF0YS4gIEkgdGhpbmsgdGhpcyBpcyBhCmdvb2QgcGxhY2UgdG8gY29uc2RpZXIgaGF2aW5nIGEgc2FtcGxlIHNoZWV0IGZyb20gRHIuIFBhcmsgd2l0aAp3aGF0ZXZlciBvdGhlciByYW5kb20gaW5mb3JtYXRpb24gbWlnaHQgcHJvdmUgaW50ZXJlc3RpbmcgYWJvdXQgdGhlCnNhbXBsZXMuCgojIEZpbHRlcnMgYW5kIFFDCgpMZXQgdXMgc3RhcnQgZmlsdGVyaW5nIHRoZSBkYXRhLCBsZWFkaW5nIG9mZiB3aXRoIGEgZGVmaW5pdGlvbiBvZiB0aGUKbWluaW11bSBudW1iZXIgb2YgUk5BcywgbWluaW11bSBhbW91bnQgb2YgclJOQSwgYW5kIG1heGltdW0KbWl0b2Nob25kcmlhbC4gIEluIGFkZGl0aW9uLCBsZXQgdXMgcHJpbnQgaG93IG11Y2ggb2YgZWFjaCBhcmUKb2JzZXJ2ZWQgYmVmb3JlIGZpbHRlcmluZy4gIEJlZm9yZSB3ZSBjYW4gcHJpbnQvZmlsdGVyIHRoZXNlCmF0dHJpYnV0ZXMsIHdlIG11c3QgdXNlIHRoZSBQZXJjZW50YWdlRmVhdHVyZVNldCgpIHRvIGdldCB0aGUKbnVtYmVycy4uLgoKYGBge3IgZmlsdGVyX3RocmVzaG9sZHN9Cm1pbl9udW1fcm5hIDwtIDIwMAptaW5fcGN0X3JpYm8gPC0gNQptYXhfcGN0X21pdG8gPC0gMjAKCmFsbF9zY2QgPC0gcmVjb3JkX3NldXJhdF9zYW1wbGVzKGFsbF9zY2QsIHR5cGU9Im51bV9jZWxscyIpCgphbGxfc2NkW1sicGVyY2VudF9tdCJdXSA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChhbGxfc2NkLCBwYXR0ZXJuPSJebXQtIikKYWxsX3NjZFtbInBlcmNlbnRfcmlibyJdXSA8LSBQZXJjZW50YWdlRmVhdHVyZVNldChhbGxfc2NkLCBwYXR0ZXJuPSJeUnBbc2xdIikKYGBgCgpTaG93IHRoZSBzdGF0ZSBiZWZvcmUgZmlsdGVyaW5nIG9uIGEgcGVyLWNlbGwgYmFzaXMgYWNyb3NzIGFsbApzYW1wbGVzLiBTdGFydCB3aXRoIHRoZSBudW1iZXIgb2YgY2VsbHMKCgpgYGB7ciBzaG93X251bV9jZWxsc30Kc2FtcGxlX3N1bW1hcmllcyA8LSBhc190aWJibGUoZGF0YS5mcmFtZSgKICAgICJpZCIgPSBjKCJjb250cm9sIiwgIm1vY2siLCAibXVzY3VsYXIiLCAibmFzYWwiKSwKICAgICJzdGFydF9jZWxscyIgPSBjKAogICAgICAgIHN1bShhbGxfc2NkQG1ldGEuZGF0YVtbIm9yaWcuaWRlbnQiXV0gPT0gImNvbnRyb2wiKSwKICAgICAgICBzdW0oYWxsX3NjZEBtZXRhLmRhdGFbWyJvcmlnLmlkZW50Il1dID09ICJtb2NrIiksCiAgICAgICAgc3VtKGFsbF9zY2RAbWV0YS5kYXRhW1sib3JpZy5pZGVudCJdXSA9PSAibSIpLAogICAgICAgIHN1bShhbGxfc2NkQG1ldGEuZGF0YVtbIm9yaWcuaWRlbnQiXV0gPT0gIm4iKSkpKQpgYGAKCmBgYHtyIHNob3dfYWxsX3N1bW1hcmllc30Kc2tpbShhbGxfc2NkW1sicGVyY2VudF9tdCJdXSkKc2tpbShhbGxfc2NkW1sicGVyY2VudF9yaWJvIl1dKQpza2ltKGFsbF9zY2RbWyJuRmVhdHVyZV9STkEiXV0pCnNraW0oYWxsX3NjZFtbIm5Db3VudF9STkEiXV0pCiMjIExlbmd0aCBhbmQgcmVhZHMgYXJlIGZvciBvbmx5IHRob3NlIGNlbGxzIHdpdGggY2xvbm90eXBlcy4Kc2tpbShhbGxfc2NkW1sicmVhZHMiXV0pCnNraW0oYWxsX3NjZFtbImxlbmd0aCJdXSkKCiMjIEhvdyBtYW55IGNlbGxzIGhhdmUgc3BlY2lmaWMgY2hhaW5zIGFzc29jaWF0ZWQgd2l0aCB0aGVtCnN1bSghaXMubmEoYWxsX3NjZCRjaGFpbikpCmBgYAoKQW5kIG9uIGEgcGVyLXNhbXBsZSBiYXNpcyB3aXRoIChuZXcgdG8gbWUpIHNraW1yLCB3aGljaCBwcm92aWRlcyBhCnByZXR0eSBzdW1tYXJ5IG9mIHRoZSBjYXRlZ29yeSBvZiBpbnRlcmVzdC4gIFRoZSB3YXkgSSB3cm90ZSB0aGUKZm9sbG93aW5nIHN0YW56YXMgc2hvdWxkIGFsc28gYXBwZW5kIG5ldyBjb2x1bW5zIHRvIG15CnNhbXBsZV9zdW1tYXJpZXMgdGFibGUgY29tcHJpc2VkIG9mIHRoZSBtZWFuIHZhbHVlcyBmb3IgdGhlc2UKZWxlbWVudHMuCgpgYGB7ciBzaG93X3N0YXRlX3NhbXBsZXN9CmFsbF9zY2QgPC0gcmVjb3JkX3NldXJhdF9zYW1wbGVzKGFsbF9zY2QsIHR5cGU9Im51bV9jZWxscyIpICU+JQogIHJlY29yZF9zZXVyYXRfc2FtcGxlcyh0eXBlPSJuRmVhdHVyZV9STkEiKSAlPiUKICByZWNvcmRfc2V1cmF0X3NhbXBsZXModHlwZT0ibkNvdW50X1JOQSIpICU+JQogIHJlY29yZF9zZXVyYXRfc2FtcGxlcyh0eXBlPSJyZWFkcyIsIGNvbHVtbl9uYW1lPSJjbG9ub3R5cGVfcmVhZHMiKSAlPiUKICByZWNvcmRfc2V1cmF0X3NhbXBsZXModHlwZT0icGN0X21pdG8iLCBwYXR0ZXJuPSJebXQtIikgJT4lCiAgcmVjb3JkX3NldXJhdF9zYW1wbGVzKHR5cGU9InBjdF9yaWJvIiwgcGF0dGVybj0iXlJwW3NsXSIpCmBgYAoKYGBge3IgcHJpbnRfbWV0YX0KIyMgVGhlIHJlY29yZGVkIGluZm9ybWF0aW9uIGlzIGhlcmUsIGJ1dCBub3QgcHJpbnRpbmcgaXQgZm9yIG5vdzoKYWxsX3NjZEBtaXNjW1sic2FtcGxlX21ldGFkYXRhIl1dCmBgYAoKT2ssIHRoYXQgd2FzIGZ1bjsgbGV0cyBsb29rIGF0IHRoaXMgaW5mb3JtYXRpb24gYXMgYSBzZXJpZXMgb2YgcGxvdHM6CgpgYGB7ciBmaWx0ZXJzX3FjfQpWbG5QbG90KGFsbF9zY2QsIGZlYXR1cmVzPSJuRmVhdHVyZV9STkEiLCBwdC5zaXplPTApClZsblBsb3QoYWxsX3NjZCwgZmVhdHVyZXM9InBjdF9taXRvIiwgcHQuc2l6ZT0wKQpWbG5QbG90KGFsbF9zY2QsIGZlYXR1cmVzPSJwY3RfcmlibyIsIHB0LnNpemU9MCkKVmxuUGxvdChhbGxfc2NkLCBmZWF0dXJlcz0ibkNvdW50X1JOQSIsIHB0LnNpemU9MCkKVmxuUGxvdChhbGxfc2NkLCBmZWF0dXJlcz0icmVhZHMiLCBwdC5zaXplPTApCiMjIEkgYW0gY3VyaW91cyBhYm91dCB0aGUgbGVuZ3RoIG9mIHRoZSBjbG9ub3R5cGUgc2VxdWVuY2VzLgpWbG5QbG90KGFsbF9zY2QsIGZlYXR1cmVzPSJsZW5ndGgiLCBwdC5zaXplPTApCgpGZWF0dXJlU2NhdHRlcihhbGxfc2NkLCAicGN0X3JpYm8iLCAicGN0X21pdG8iKQpGZWF0dXJlU2NhdHRlcihhbGxfc2NkLCAibkNvdW50X1JOQSIsICJuRmVhdHVyZV9STkEiKQpGZWF0dXJlU2NhdHRlcihhbGxfc2NkLCAibkNvdW50X1JOQSIsICJwY3RfcmlibyIpCkZlYXR1cmVTY2F0dGVyKGFsbF9zY2QsICJuQ291bnRfUk5BIiwgInBjdF9taXRvIikKYGBgCgojIEZpbHRlciBzYW1wbGVzIHVzaW5nIG91ciBndWVzc3RpbWF0ZXMKClN0YXJ0IHdpdGggYSBtaW5pbXVtIG51bWJlciBvZiBSTkFzIGZpbHRlci4KCmBgYHtyIGZpbHRlcl9taW5fcm5hc30Kc3VmZmljaWVudF9ybmFfb2JzZXJ2ZWQgPC0gV2hpY2hDZWxscyhhbGxfc2NkLCBleHByZXNzaW9uPW5GZWF0dXJlX1JOQSA+PSBtaW5fbnVtX3JuYSkKZmlsdF9zY2QgPC0gc3Vic2V0KGFsbF9zY2QsIGNlbGxzPXN1ZmZpY2llbnRfcm5hX29ic2VydmVkKQpgYGAKClNlY29uZCBJIHdpbGwgY2hlY2sgdGhhdCB0aGUgbnVtYmVyIG9mIHJlYWRzL3JuYSBhY3Jvc3MgY2VsbHMgaXMKc3VmZmljaWVudCwgdGhhdCBmaWx0ZXIgZG9lcyBub3RoaW5nIGN1cnJlbnRseSwgd2hpY2ggSSB0aGluayBpcyBnb29kLgoKYGBge3IgZmlsdGVyX3JpYm9zb21hbH0KIyMgSSB0aGluayB0aGlzIGZpbHRlciBkb2VzIG5vdGhpbmcgaW4gaXRzIGN1cnJlbnQgZm9ybS4Kc3VmZmljaWVudGx5X29ic2VydmVkX2lkeCA8LSByb3dTdW1zKGZpbHRfc2NkKSA+IDMKc3VtbWFyeShzdWZmaWNpZW50bHlfb2JzZXJ2ZWRfaWR4KQpkaW0oZmlsdF9zY2QpCmZpbHRfc2NkIDwtIHN1YnNldChmaWx0X3NjZCwgZmVhdHVyZXM9cm93bmFtZXMoZmlsdF9zY2QpW3N1ZmZpY2llbnRseV9vYnNlcnZlZF9pZHhdKQpkaW0oZmlsdF9zY2QpCgojIyBLZWVwIGNlbGxzIHdpdGggYXQgbGVhc3Qgc29tZSByaWJvc29tYWwgcmVhZHMKIyMgTm90ZSB0aGUgUGVyY2VudCBmdW5jdGlvbiBhYm92ZSBhY3R1YWxseSBwdXRzIGluIGEgZmxvYXRpbmcgcG9pbnQKIyMgbnVtYmVyIGZyb20gMC0xMDAsIG5vdCAoYXMgSSBhc3N1bWVkIGZyb20gMC0xKS4KaGlnaF9yaWJvc29tYWwgPC0gV2hpY2hDZWxscyhmaWx0X3NjZCwgZXhwcmVzc2lvbj1wZXJjZW50X3JpYm8gPj0gbWluX3BjdF9yaWJvKQpmaWx0X3NjZCA8LSBzdWJzZXQoZmlsdF9zY2QsIGNlbGxzPWhpZ2hfcmlib3NvbWFsKQpgYGAKCkV4Y2x1ZGUgY2VsbHMgd2l0aCB0b28gbXVjaCBtaXRvY2hvbmRyaWFsIFJOQQoKIyMgTm93IGRyb3AgbWl0b2Nob25kcmlhbCBnZW5lcwoKYGBge3IgZmlsdGVyX21pdG99Cmxvd19taXRvY2hvbmRyaWFsIDwtIFdoaWNoQ2VsbHMoZmlsdF9zY2QsIGV4cHJlc3Npb249cGVyY2VudF9tdCA8PSBtYXhfcGN0X21pdG8pCmZpbHRfc2NkIDwtIHN1YnNldChmaWx0X3NjZCwgY2VsbHM9bG93X21pdG9jaG9uZHJpYWwpCmBgYAoKIyBSZWNvcmQgcG9zdC1maWx0ZXJlZCBzdGF0cwoKYGBge3IgcG9zdF9maWx0X3N0YXRzfQpmaWx0X3NjZCA8LSByZWNvcmRfc2V1cmF0X3NhbXBsZXMoZmlsdF9zY2QsIHR5cGU9Im51bV9jZWxscyIpICU+JQogIHJlY29yZF9zZXVyYXRfc2FtcGxlcyh0eXBlPSJuRmVhdHVyZV9STkEiKSAlPiUKICByZWNvcmRfc2V1cmF0X3NhbXBsZXModHlwZT0ibkNvdW50X1JOQSIpICU+JQogIHJlY29yZF9zZXVyYXRfc2FtcGxlcyh0eXBlPSJyZWFkcyIsIGNvbHVtbl9uYW1lPSJjbG9ub3R5cGVfcmVhZHMiKSAlPiUKICByZWNvcmRfc2V1cmF0X3NhbXBsZXModHlwZT0icGN0X21pdG8iLCBwYXR0ZXJuPSJebXQtIikgJT4lCiAgcmVjb3JkX3NldXJhdF9zYW1wbGVzKHR5cGU9InBjdF9yaWJvIiwgcGF0dGVybj0iXlJwW3NsXSIpCmBgYAoKQWRkIHRoZSBuZXcgZmlsdGVyZWQgbWVhbiB2YWx1ZXMgb250byB0aGUgb3JpZ2luYWwgc2V0LgoKYGBge3IgY2JpbmRfbWV0YX0KYWxsX3NjZEBtaXNjJHNhbXBsZV9tZXRhZGF0YSA8LSBjYmluZChhbGxfc2NkQG1pc2Mkc2FtcGxlX21ldGFkYXRhLCBmaWx0X3NjZEBtaXNjJHNhbXBsZV9tZXRhZGF0YSkKYGBgCgojIERpc3RyaWJ1dGlvbgoKIyMgQmVmb3JlIGZpbHRlcmluZwoKYGBge3IgZGlzdHJpYnV0aW9ufQphbGxfbm9ybSA8LSBOb3JtYWxpemVEYXRhKG9iamVjdD1hbGxfc2NkKSAlPiUKICBGaW5kVmFyaWFibGVGZWF0dXJlcygpICU+JQogIFNjYWxlRGF0YSgpICU+JQogIFJ1blBDQSgpICU+JQogIEZpbmROZWlnaGJvcnMoKSAlPiUKICBGaW5kQ2x1c3RlcnMoKSAlPiUKICBSdW5UU05FKGNoZWNrX2R1cGxpY2F0ZXM9RkFMU0UpICU+JQogIFJ1blVNQVAocmVkdWN0aW9uPSJwY2EiLCBkaW1zPTE6MTApCgpEaW1QbG90KG9iamVjdD1hbGxfbm9ybSwgcmVkdWN0aW9uPSJ0c25lIikKcGxvdHRlZCA8LSBEaW1QbG90KGFsbF9ub3JtLCByZWR1Y3Rpb249InVtYXAiLCBncm91cC5ieT0ib3JpZy5pZGVudCIsIGxhYmVsPVRSVUUpCnBsb3R0ZWQKYGBgCgojIyBBZnRlciBmaWx0ZXJpbmcKCmBgYHtyIGRpc3RyaWJ1dGlvbl9wb3N0fQpmbm9ybV9zY2QgPC0gTm9ybWFsaXplRGF0YShvYmplY3Q9ZmlsdF9zY2QpICU+JQogIEZpbmRWYXJpYWJsZUZlYXR1cmVzKCkgJT4lCiAgU2NhbGVEYXRhKCkgJT4lCiAgUnVuUENBKCkgJT4lCiAgRmluZE5laWdoYm9ycygpICU+JQogIEZpbmRDbHVzdGVycygpICU+JQogIFJ1blRTTkUoKSAlPiUKICBSdW5VTUFQKHJlZHVjdGlvbj0icGNhIiwgZGltcz0xOjEwKQoKRGltUGxvdChvYmplY3Q9Zm5vcm1fc2NkLCByZWR1Y3Rpb249InRzbmUiKQpwbG90dGVkIDwtIERpbVBsb3QoZm5vcm1fc2NkLCByZWR1Y3Rpb249InVtYXAiLCBncm91cC5ieT0ib3JpZy5pZGVudCIsIGxhYmVsPVRSVUUpCnBsb3R0ZWQKYGBgCgpgYGB7ciBjaG9vc2VfZGltc30KZm5vcm1fc2NkIDwtIEphY2tTdHJhdyhmbm9ybV9zY2QsIG51bS5yZXBsaWNhdGU9MTApCmZub3JtX3NjZCA8LSBTY29yZUphY2tTdHJhdyhmbm9ybV9zY2QpCkphY2tTdHJhd1Bsb3QoZm5vcm1fc2NkKQpFbGJvd1Bsb3QoZm5vcm1fc2NkKQojIyBTbyBJIGFtIHRoaW5raW5nIG1heWJlIDQtMTA/CndhbnRlZF9kaW1zIDwtIDYKCmZub3JtX3NjZCA8LSBGaW5kTmVpZ2hib3JzKGZub3JtX3NjZCwgZGltcz0xOndhbnRlZF9kaW1zKSAlPiUKICBGaW5kQ2x1c3RlcnMocmVzb2x1dGlvbj0wLjUpICU+JQogIFN0YXNoSWRlbnQoc2F2ZS5uYW1lPSJyZXMwcDVfY2x1c3RlcnMiKQpSdW5VTUFQKGZub3JtX3NjZCwgZGltcz0xOjkpCkRpbVBsb3QoZm5vcm1fc2NkLCBsYWJlbD1UUlVFKQoKZm5vcm1fc2NkIDwtIEZpbmRDbHVzdGVycyhmbm9ybV9zY2QsIHJlc29sdXRpb249MC4xKSAlPiUKICBGaW5kTmVpZ2hib3JzKGsucGFyYW09NikgJT4lCiAgU3Rhc2hJZGVudChzYXZlLm5hbWU9InJlczBwMV9jbHVzdGVycyIpClJ1blVNQVAoZm5vcm1fc2NkLCBkaW1zPTE6OSkKRGltUGxvdChmbm9ybV9zY2QsIGxhYmVsPVRSVUUpCmBgYAoKQWRkIGludG8gdGhlIG1ldGFkYXRhIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc2FtcGxlIElEIGFuZCB0aGUgY2x1c3RlciBJRAoKYGBge3IgY29tcGFyZV9jbHVzdGVyc30KaWRlbnRpdHlfdmVjdG9yIDwtIGZub3JtX3NjZFtbIm9yaWcuaWRlbnQiXV1bWyJvcmlnLmlkZW50Il1dCmNsYXNzKGlkZW50aXR5X3ZlY3RvcikKY2x1c3Rlcl92ZWN0b3IgPC0gYXMuY2hhcmFjdGVyKGZub3JtX3NjZFtbInJlczBwMV9jbHVzdGVycyJdXVtbInJlczBwMV9jbHVzdGVycyJdXSkKY29uY2F0ZW5hdGVkX3ZlY3RvciA8LSBwYXN0ZTAoaWRlbnRpdHlfdmVjdG9yLCAiXyIsIGNsdXN0ZXJfdmVjdG9yKQpmbm9ybV9zY2RbWyJjbHVzdGVyX3NhbXBsZSJdXSA8LSBjb25jYXRlbmF0ZWRfdmVjdG9yCmBgYAoKIyBBZGQgdGhlc2UgbmV3IGNsdXN0ZXJzIHRvIG91ciBub24tbm9ybWFsaXplZCBkYXRhCgpJIGFtIG5vdCB5ZXQgY2VydGFpbiBvZiBob3cgU2V1cmF0IGhhbmRsZXMgKG5vbilub3JtYWxpemVkIGRhdGEgZm9yCnRoZSB2YXJpb3VzIEZpbmRNYXJrZXJzIGZ1bmN0aW9ucy4gIFRodXMsIEkgYW0gYWRkaW5nIHRoZSBjbHVzdGVycwpmcm9tIHRoZSBkaW1lbnNpb24gcmVkdWN0aW9ucyB0byB0aGUgbm9uLW5vcm1hbGl6ZWQgZGF0YSBoZXJlLgoKYGBge3IgYWRkX2NsdXN0ZXJzX3RvX2ZpbHR9CmZpbHRfc2NkW1sicmVzMHAxX2NsdXN0ZXJzIl1dIDwtIGZub3JtX3NjZFtbInJlczBwMV9jbHVzdGVycyJdXQpmaWx0X3NjZFtbImNsdXN0ZXJfc2FtcGxlIl1dIDwtIGZub3JtX3NjZFtbImNsdXN0ZXJfc2FtcGxlIl1dCmBgYAoKIyBWYXJpYWJsZSBmZWF0dXJlcwoKYGBge3IgdmFyaWFibGVfZmVhdHVyZXN9CnZhciA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhmbm9ybV9zY2QpCm1vc3RfdmFyIDwtIGhlYWQoVmFyaWFibGVGZWF0dXJlcyh2YXIpLCAzMCkKdmFyaWFibGVfcGxvdCA8LSBWYXJpYWJsZUZlYXR1cmVQbG90KHZhcikKdmFyaWFibGVfcGxvdCA8LSBMYWJlbFBvaW50cyhwbG90PXZhcmlhYmxlX3Bsb3QsIHBvaW50cz1tb3N0X3ZhciwgcmVwZWw9VFJVRSkKdmFyaWFibGVfcGxvdApgYGAKCiMgVmFyaW91cyBtYXJrZXIgc2VhcmNoZXMKCiMjIEFsbCBNYXJrZXJzCgojIyMgQnkgc2FtcGxlCgpRdWVzdGlvbjogSXMgaXQgc21hcnQgZW5vdWdoIHRvIHVzZSB0aGUgcmF3IGRhdGEgaWYgSSBnaXZlCkZpbmRBbGxNYXJrZXJzIHRoZSBub3JtYWxpemVkIGRhdGE/ICBGb3IgdGhlIG1vbWVudCBJIGRvIG5vdCB0aGluayBJCndpbGwgcmlzayBpdC4KCmBgYHtyIGZpbmRhbGxtYXJrZXJzMDF9CmNvbWJpbmVkX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoZmlsdF9zY2QsIG9ubHkucG9zPVRSVUUsIGxvZ2ZjLnRocmVzaG9sZD0wLjUpCmhlYWQoY29tYmluZWRfbWFya2VycykKCmNvbWJpbmVkIDwtIGFzLmRhdGEuZnJhbWUoY29tYmluZWRfbWFya2VycykKcm93bmFtZXMoY29tYmluZWQpIDwtIHRvdXBwZXIocm93bmFtZXMoY29tYmluZWQpKQphbm5vdGF0ZWRfbWFya2VycyA8LSBtZXJnZShjb21iaW5lZCwgYnJpZWYsIGJ5Lng9InJvdy5uYW1lcyIsIGJ5Lnk9ImhnbmNfc3ltYm9sIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLng9VFJVRSkKYGBgCgojIyMgQnkgc2FtcGxlCgpgYGB7ciBmaW5kYWxsbWFya2VyczAyfQpjb21iaW5lZF9tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGZpbHRfc2NkLCBvbmx5LnBvcz1UUlVFLCBsb2dmYy50aHJlc2hvbGQ9MC41KQoKY29tYmluZWQgPC0gYXMuZGF0YS5mcmFtZShjb21iaW5lZF9tYXJrZXJzKQpyb3duYW1lcyhjb21iaW5lZCkgPC0gdG91cHBlcihyb3duYW1lcyhjb21iaW5lZCkpCmFubm90YXRlZF9tYXJrZXJzIDwtIG1lcmdlKGNvbWJpbmVkLCBicmllZiwgYnkueD0icm93Lm5hbWVzIiwgYnkueT0iaGduY19zeW1ib2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwueD1UUlVFKQpoZWFkKGFubm90YXRlZF9tYXJrZXJzKQpgYGAKCiMjIyBCeSBDbHVzdGVyCgpTaW5jZSBJIGFtIG5vdCB1c2luZyB0aGUgZm5vcm1fc2NkIGRhdGEgc3RydWN0dXJlLCBJIHdpbGwgbmVlZCB0byBwdWxsCnRoZSBjbHVzdGVyIGluZm9ybWF0aW9uIGZyb20gdGhlIG5vcm1hbGl6ZWQgY29weS4uLgoKYGBge3IgbWFya2Vyc19ieV9jbHVzdGVyfQpjbHVzdGVyX3NjZCA8LSBmaWx0X3NjZApJZGVudHMoY2x1c3Rlcl9zY2QpIDwtIGNsdXN0ZXJfc2NkW1sicmVzMHAxX2NsdXN0ZXJzIl1dCmNsdXN0ZXJfbWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhjbHVzdGVyX3NjZCwgb25seS5wb3M9VFJVRSwgbG9nZmMudGhyZXNob2xkPTAuNSkKCmNsdXN0ZXJfZ2VuZXMgPC0gYXMuZGF0YS5mcmFtZShjbHVzdGVyX21hcmtlcnMpCnJvd25hbWVzKGNsdXN0ZXJfZ2VuZXMpIDwtIHRvdXBwZXIocm93bmFtZXMoY2x1c3Rlcl9nZW5lcykpCmFubm90YXRlZF9jbHVzdGVycyA8LSBtZXJnZShjbHVzdGVyX2dlbmVzLCBicmllZiwgYnkueD0icm93Lm5hbWVzIiwgYnkueT0iaGduY19zeW1ib2wiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwueD1UUlVFKQpoZWFkKGFubm90YXRlZF9jbHVzdGVycykKCmFubm90YXRlZF9jbHVzdGVycyAlPiUKICBncm91cF9ieShjbHVzdGVyKSAlPiUKICBkcGx5cjo6dG9wX24obj0xMCwgd3Q9YXZnX2xvZzJGQykgJT4lCiAgYXMuZGF0YS5mcmFtZSgpCmBgYAoKYGBge3IgY291bnRfY2x1c3Rlcl9jbG9ub30Kc3VtKGNsdXN0ZXJfc2NkW1sicmVzMHAxX2NsdXN0ZXJzIl1dID09ICIwIikKc3VtKGNsdXN0ZXJfc2NkW1sicmVzMHAxX2NsdXN0ZXJzIl1dID09ICIwIiAmCiAgICAhaXMubmEoY2x1c3Rlcl9zY2RbWyJyYXdfY2xvbm90eXBlX2lkIl1dKSkKCnN1bShjbHVzdGVyX3NjZFtbInJlczBwMV9jbHVzdGVycyJdXSA9PSAiMSIpCnN1bShjbHVzdGVyX3NjZFtbInJlczBwMV9jbHVzdGVycyJdXSA9PSAiMSIgJgogICAgIWlzLm5hKGNsdXN0ZXJfc2NkW1sicmF3X2Nsb25vdHlwZV9pZCJdXSkpCgpzdW0oY2x1c3Rlcl9zY2RbWyJyZXMwcDFfY2x1c3RlcnMiXV0gPT0gIjIiKQpzdW0oY2x1c3Rlcl9zY2RbWyJyZXMwcDFfY2x1c3RlcnMiXV0gPT0gIjIiICYKICAgICFpcy5uYShjbHVzdGVyX3NjZFtbInJhd19jbG9ub3R5cGVfaWQiXV0pKQoKc3VtKGNsdXN0ZXJfc2NkW1sicmVzMHAxX2NsdXN0ZXJzIl1dID09ICIzIikKc3VtKGNsdXN0ZXJfc2NkW1sicmVzMHAxX2NsdXN0ZXJzIl1dID09ICIzIiAmCiAgICAhaXMubmEoY2x1c3Rlcl9zY2RbWyJyYXdfY2xvbm90eXBlX2lkIl1dKSkKCnN1bShjbHVzdGVyX3NjZFtbInJlczBwMV9jbHVzdGVycyJdXSA9PSAiNCIpCnN1bShjbHVzdGVyX3NjZFtbInJlczBwMV9jbHVzdGVycyJdXSA9PSAiNCIgJgogICAgIWlzLm5hKGNsdXN0ZXJfc2NkW1sicmF3X2Nsb25vdHlwZV9pZCJdXSkpCgpzdW0oY2x1c3Rlcl9zY2RbWyJyZXMwcDFfY2x1c3RlcnMiXV0gPT0gIjUiKQpzdW0oY2x1c3Rlcl9zY2RbWyJyZXMwcDFfY2x1c3RlcnMiXV0gPT0gIjUiICYKICAgICFpcy5uYShjbHVzdGVyX3NjZFtbInJhd19jbG9ub3R5cGVfaWQiXV0pKQoKc3VtKGNsdXN0ZXJfc2NkW1sicmVzMHAxX2NsdXN0ZXJzIl1dID09ICI2IikKc3VtKGNsdXN0ZXJfc2NkW1sicmVzMHAxX2NsdXN0ZXJzIl1dID09ICI2IiAmCiAgICAhaXMubmEoY2x1c3Rlcl9zY2RbWyJyYXdfY2xvbm90eXBlX2lkIl1dKSkKYGBgCgpDbHVzdGVycyAwIGFuZCA1IGhhdmUgYSBncmVhdCBtYWpvcml0eSBvZiB0aGUgY2xvbm90eXBlcy4KMCBoYXMgc29tZXRoaW5nIGxpa2UgOTAlLCA1IGhhcyB+IDMwJSwgdGhlIG90aGVycyB+IDEwJQoKIyMgQ29tcGFyZSBzcGVjaWZpYyBjbHVzdGVycwoKIyMjIExvb2sgYXQgY2x1c3RlciAwLCBOYXNhbCB2cy4gQ29udHJvbAoKYGBge3Igc3BlY2lmaWNfY2x1c3Rlcl9tYXJrZXJzfQp0ZXN0X2dyb3VwIDwtIGNsdXN0ZXJfc2NkW1siY2x1c3Rlcl9zYW1wbGUiXV0gPT0gImNvbnRyb2xfMCIKc3VtKHRlc3RfZ3JvdXApCnRlc3RfZ3JvdXAgPC0gY2x1c3Rlcl9zY2RbWyJjbHVzdGVyX3NhbXBsZSJdXSA9PSAibl8wIgpzdW0odGVzdF9ncm91cCkKCmNvbnRyb2xuXzAgPC0gRmluZE1hcmtlcnMoCiAgICBjbHVzdGVyX3NjZCwgZ3JvdXAuYnk9ImNsdXN0ZXJfc2FtcGxlIiwKICAgIGlkZW50LjE9ImNvbnRyb2xfMCIsIGlkZW50LjI9Im5fMCIpCmNvbnRyb2xuXzAgPC0gYXMuZGF0YS5mcmFtZShjb250cm9sbl8wKQpyb3duYW1lcyhjb250cm9sbl8wKSA8LSB0b3VwcGVyKHJvd25hbWVzKGNvbnRyb2xuXzApKQpjb250cm9sbl8wIDwtIG1lcmdlKGNvbnRyb2xuXzAsIGJyaWVmLCBieT0icm93Lm5hbWVzIiwgYnkueT0iaGduY19zeW1ib2wiLAogICAgICAgICAgICAgICAgICAgIGFsbC54PVRSVUUpCgphbm5vdGF0ZWRfY2x1c3RlcnMgJT4lCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lCiAgZHBseXI6OnRvcF9uKG49MTAsIHd0PWF2Z19sb2cyRkMpICU+JQogIGFzLmRhdGEuZnJhbWUoKQpgYGAKCiMjIyBDbHVzdGVyIDAgTmFzYWwgdnMuIE1vY2sKCmBgYHtyIHNwZWNpZmljXzBfbm1vY2t9Cm1vY2t2c25fMCA8LSBGaW5kTWFya2VycygKICAgIGNsdXN0ZXJfc2NkLCBncm91cC5ieT0iY2x1c3Rlcl9zYW1wbGUiLAogICAgaWRlbnQuMT0ibl8wIiwgaWRlbnQuMj0ibW9ja18wIikgJT4lCiAgYXMuZGF0YS5mcmFtZSgpCmhlYWQobW9ja3Zzbl8wKQpyb3duYW1lcyhtb2NrdnNuXzApIDwtIHRvdXBwZXIocm93bmFtZXMobW9ja3Zzbl8wKSkKbW9ja3Zzbl8wIDwtIG1lcmdlKG1vY2t2c25fMCwgYnJpZWYsIGJ5PSJyb3cubmFtZXMiLCBieS55PSJoZ25jX3N5bWJvbCIsCiAgICAgICAgICAgICAgICAgICBhbGwueD1UUlVFKQoKbW9ja3ZzbV8wIDwtIEZpbmRNYXJrZXJzKAogICAgY2x1c3Rlcl9zY2QsIGdyb3VwLmJ5PSJjbHVzdGVyX3NhbXBsZSIsCiAgICBpZGVudC4xPSJtXzAiLCBpZGVudC4yPSJtb2NrXzAiKSAlPiUKICBhcy5kYXRhLmZyYW1lKCkKaGVhZChtb2NrdnNtXzApCnJvd25hbWVzKG1vY2t2c21fMCkgPC0gdG91cHBlcihyb3duYW1lcyhtb2NrdnNtXzApKQptb2NrdnNtXzAgPC0gbWVyZ2UobW9ja3ZzbV8wLCBicmllZiwgYnk9InJvdy5uYW1lcyIsIGJ5Lnk9ImhnbmNfc3ltYm9sIiwKICAgICAgICAgICAgICAgICAgIGFsbC54PVRSVUUpCmhlYWQobW9ja3ZzbV8wLCBuPTMwKQpgYGAKCiMjIEZpbmQgQ29uc2VydmVkIE1hcmtlcnMKClRoaXMgZnVuY3Rpb24gbWFrZXMgbm8gc2Vuc2UuCgpgYGB7ciBmaW5kX2NvbnNlcnZlZF9tYXJrZXJzLCBldmFsPUZBTFNFfQpEZWZhdWx0QXNzYXkoY2x1c3Rlcl9zY2QpIDwtICJSTkEiCmNvbnNlcnZlZF9tYXJrZXJzIDwtIEZpbmRDb25zZXJ2ZWRNYXJrZXJzKAogICAgY2x1c3Rlcl9zY2QsIGlkZW50LjE9YygwLCAxKSwgaWRlbnQuMj1jKDIsMyw0KSwKICAgIGdyb3VwaW5nLnZhcj0ic2FtcGxlIiwgb25seS5wb3M9VFJVRSwKICAgIHZlcmJvc2U9VFJVRSkKYGBgCgpgYGB7ciBjb21wYXJlX290aGVyX2dyb3VwcywgZXZhbD1GQUxTRX0KbW9ja192c19jb250cm9sIDwtIEZpbmRNYXJrZXJzKGNsdXN0ZXJfc2NkLCBncm91cC5ieT0ib3JpZy5pZGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xPSJtb2NrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjI9ImNvbnRyb2wiKQpoZWFkKG1vY2tfdnNfY29udHJvbCkKbXVzY3VsYXJfdnNfbW9jayA8LSBGaW5kTWFya2VycyhjbHVzdGVyX3NjZCwgZ3JvdXAuYnk9Im9yaWcuaWRlbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjE9Im0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjI9Im1vY2siKQpzdW1tYXJ5KG11c2N1bGFyX3ZzX21vY2spCm5hc2FsX3ZzX21vY2sgPC0gRmluZE1hcmtlcnMoY2x1c3Rlcl9zY2QsIGdyb3VwLmJ5PSJvcmlnLmlkZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4ucGN0PTAuMjUsIGlkZW50LjE9Im4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjI9Im1vY2siKQpzdW1tYXJ5KG5hc2FsX3ZzX21vY2spCgpGZWF0dXJlUGxvdChjbHVzdGVyX3NjZCwgZmVhdHVyZXM9YygiUmdjYyIpLAogICAgICAgICAgICBzcGxpdC5ieT0ib3JpZy5pZGVudCIsIG1heC5jdXRvZmY9MywKICAgICAgICAgICAgY29scz1jKCJkYXJrZ3JlZW4iLCAiZGFya3JlZCIpKQpgYGAKCiMgU2NhbiBmb3IgbGlrZWx5IGNlbGwgY3ljbGUgZ2VuZXMKClRoaXMgaXMgYSBuZWF0IGlkZWEsIEkgdGhpbmsgd2UgY2FuIHJlcHVycG9zZSBpdCB0byBpbW11bm9sb2d5IGdlbmUgc2V0cy4KCmBgYHtyIGNlbGxfY3ljbGV9CmNsdXN0ZXJfc2NkIDwtIENlbGxDeWNsZVNjb3JpbmcoCiAgICBvYmplY3Q9Y2x1c3Rlcl9zY2QsCiAgICBnMm0uZmVhdHVyZXM9Y2MuZ2VuZXMkZzJtLmdlbmVzLAogICAgcy5mZWF0dXJlcz1jYy5nZW5lcyRzLmdlbmVzKQpWbG5QbG90KGNsdXN0ZXJfc2NkLCBmZWF0dXJlcz1jKCJTLlNjb3JlIiwgIkcyTS5TY29yZSIpLAogICAgICAgIGdyb3VwLmJ5PSJvcmlnLmlkZW50IiwKICAgICAgICBuY29sPTQsIHB0LnNpemU9MCkKYGBgCgpIYXZpbmcgd3JpdHRlbiB0aGUgZm9sbG93aW5nIEkgcmVhbGl6ZWQgSSB1c2VkIGFuIG9sZGVyIHZlcnNpb24gb2YgbXkKbVNpZ0RCIHJlZmVyZW5jZS4uLiAgRklYTUU6IFJlZG8gaXQgd2l0aCB0aGUgNy41KyBkYXRhLgoKYGBge3IgbXNpZ2RifQpicm9hZF90eXBlcyA8LSBsb2FkX2dtdF9zaWduYXR1cmVzKHNpZ25hdHVyZXM9InJlZmVyZW5jZS9tOC5hbGwudjIwMjIuMS5NbS5zeW1ib2xzLmdtdCIpCmJyb2FkX2xpc3QgPC0gbGlzdCgpCmZvciAoaSBpbiBuYW1lcyhicm9hZF90eXBlcykpIHsKICBicm9hZF9saXN0W1tpXV0gPC0gZ2VuZUlkcyhicm9hZF90eXBlc1tbaV1dKQp9CmdzZWFfc2NkIDwtIEFkZE1vZHVsZVNjb3JlKG9iamVjdD1jbHVzdGVyX3NjZCwgZmVhdHVyZXM9YnJvYWRfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgIG5hbWU9Im04IikKCmNob3NlbiA8LSBjKDMsIDksIDExLCAzNiwgNDMsIDQyLCAxNCkKbmFtZXMoYnJvYWRfdHlwZXMpW2Nob3Nlbl0KY29sdW1ucyA8LSBwYXN0ZTAoIm04IiwgY2hvc2VuKQpWbG5QbG90KGdzZWFfc2NkLCBmZWF0dXJlcz1jb2x1bW5zLAogICAgICAgIGdyb3VwLmJ5PSJyZXMwcDFfY2x1c3RlcnMiLCBzYW1lLnkubGltcz1UUlVFLAogICAgICAgIG5jb2w9NCwgcHQuc2l6ZT0wKQoKCmNob3NlbiA8LSBjKDUwLCA1MSwgNjAsIDYxLCA2MiwgNjUsIDY2KQpuYW1lcyhicm9hZF90eXBlcylbY2hvc2VuXQpjb2x1bW5zIDwtIHBhc3RlMCgibTgiLCBjaG9zZW4pClZsblBsb3QoZ3NlYV9zY2QsIGZlYXR1cmVzPWNvbHVtbnMsCiAgICAgICAgZ3JvdXAuYnk9InJlczBwMV9jbHVzdGVycyIsIHNhbWUueS5saW1zPVRSVUUsCiAgICAgICAgbmNvbD00LCBwdC5zaXplPTApCgpjaG9zZW4gPC0gYygxMTUsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTI1LCAxMjgpCm5hbWVzKGJyb2FkX3R5cGVzKVtjaG9zZW5dCmNvbHVtbnMgPC0gcGFzdGUwKCJtOCIsIGNob3NlbikKVmxuUGxvdChnc2VhX3NjZCwgZmVhdHVyZXM9Y29sdW1ucywKICAgICAgICBncm91cC5ieT0icmVzMHAxX2NsdXN0ZXJzIiwgc2FtZS55LmxpbXM9VFJVRSwKICAgICAgICBuY29sPTQsIHB0LnNpemU9MCkKCmNob3NlbiA8LSBjKDIxMiwgMjExLCAyMTAsIDIwOSkKbmFtZXMoYnJvYWRfdHlwZXMpW2Nob3Nlbl0KY29sdW1ucyA8LSBwYXN0ZTAoIm04IiwgY2hvc2VuKQpWbG5QbG90KGdzZWFfc2NkLCBmZWF0dXJlcz1jb2x1bW5zLAogICAgICAgIGdyb3VwLmJ5PSJyZXMwcDFfY2x1c3RlcnMiLCBzYW1lLnkubGltcz1UUlVFLAogICAgICAgIG5jb2w9NCwgcHQuc2l6ZT0wKQoKY2hvc2VuIDwtIGMoMTc2OjE4MikKbmFtZXMoYnJvYWRfdHlwZXMpW2Nob3Nlbl0KY29sdW1ucyA8LSBwYXN0ZTAoIm04IiwgY2hvc2VuKQpWbG5QbG90KGdzZWFfc2NkLCBmZWF0dXJlcz1jb2x1bW5zLAogICAgICAgIGdyb3VwLmJ5PSJyZXMwcDFfY2x1c3RlcnMiLCBzYW1lLnkubGltcz1UUlVFLAogICAgICAgIG5jb2w9NCwgcHQuc2l6ZT0wKQoKY2hvc2VuIDwtIGMoNDI6NDcpCm5hbWVzKGJyb2FkX3R5cGVzKVtjaG9zZW5dCmNvbHVtbnMgPC0gcGFzdGUwKCJtOCIsIGNob3NlbikKVmxuUGxvdChnc2VhX3NjZCwgZmVhdHVyZXM9Y29sdW1ucywKICAgICAgICBncm91cC5ieT0icmVzMHAxX2NsdXN0ZXJzIiwgc2FtZS55LmxpbXM9VFJVRSwKICAgICAgICBuY29sPTQsIHB0LnNpemU9MCkKCnRfZ3JvdXBzX2lkeCA8LSBncmVwbChwYXR0ZXJuPSJfVF9DRUxMIiwgeD1uYW1lcyhicm9hZF90eXBlcykpCnRfZ3JvdXBzIDwtIG5hbWVzKGJyb2FkX3R5cGVzKVt0X2dyb3Vwc19pZHhdCnRfbnVtcyA8LSB3aGljaCh0X2dyb3Vwc19pZHgsIGJyb2FkX3R5cGVzKQpjb2x1bW5zIDwtIHBhc3RlMCgibTgiLCB0X251bXMpClZsblBsb3QoZ3NlYV9zY2QsIGZlYXR1cmVzPWNvbHVtbnMsCiAgICAgICAgZ3JvdXAuYnk9InJlczBwMV9jbHVzdGVycyIsIHNhbWUueS5saW1zPVRSVUUsCiAgICAgICAgbmNvbD00LCBwdC5zaXplPTApCnRfZ3JvdXBzCgp0X2dyb3Vwc19pZHggPC0gZ3JlcGwocGF0dGVybj0iX0VQSVRIRUxJQUxfIiwgeD1uYW1lcyhicm9hZF90eXBlcykpCnRfZ3JvdXBzIDwtIG5hbWVzKGJyb2FkX3R5cGVzKVt0X2dyb3Vwc19pZHhdCnRfbnVtcyA8LSB3aGljaCh0X2dyb3Vwc19pZHgsIGJyb2FkX3R5cGVzKQpjb2x1bW5zIDwtIHBhc3RlMCgibTgiLCB0X251bXMpClZsblBsb3QoZ3NlYV9zY2QsIGZlYXR1cmVzPWNvbHVtbnMsCiAgICAgICAgZ3JvdXAuYnk9InJlczBwMV9jbHVzdGVycyIsIHNhbWUueS5saW1zPVRSVUUsCiAgICAgICAgbmNvbD00LCBwdC5zaXplPTApCnRfZ3JvdXBzCgp0X2dyb3Vwc19pZHggPC0gZ3JlcGwocGF0dGVybj0iX0VORE9USEVMSUFMXyIsIHg9bmFtZXMoYnJvYWRfdHlwZXMpKQp0X2dyb3VwcyA8LSBuYW1lcyhicm9hZF90eXBlcylbdF9ncm91cHNfaWR4XQp0X251bXMgPC0gd2hpY2godF9ncm91cHNfaWR4LCBicm9hZF90eXBlcykKY29sdW1ucyA8LSBwYXN0ZTAoIm04IiwgdF9udW1zKQpWbG5QbG90KGdzZWFfc2NkLCBmZWF0dXJlcz1jb2x1bW5zLAogICAgICAgIGdyb3VwLmJ5PSJyZXMwcDFfY2x1c3RlcnMiLCBzYW1lLnkubGltcz1UUlVFLAogICAgICAgIG5jb2w9NCwgcHQuc2l6ZT0wKQp0X2dyb3VwcwpgYGAKCmBgYHtyIHNhdmVtZX0KcGFuZGVyOjpwYW5kZXIoc2Vzc2lvbkluZm8oKSkKbWVzc2FnZShwYXN0ZTAoIlRoaXMgaXMgaHBnbHRvb2xzIGNvbW1pdDogIiwgZ2V0X2dpdF9jb21taXQoKSkpCnRoaXNfc2F2ZSA8LSBwYXN0ZTAoZ3N1YihwYXR0ZXJuPSJcXC5SbWQiLCByZXBsYWNlPSIiLCB4PXJtZF9maWxlKSwgIi12IiwgdmVyLCAiLnJkYS54eiIpCiMjbWVzc2FnZShwYXN0ZTAoIlNhdmluZyB0byAiLCB0aGlzX3NhdmUpKQojI3RtcCA8LSBzbShzYXZlbWUoZmlsZW5hbWU9dGhpc19zYXZlKSkKYGBgCg==