1. load libraries
2. Load Seurat Object
#Load Seurat Object Integrated Object
load("/home/bioinfo/Cluster_to_Computer_Transfer_files_folder/All_Normal-PBMC_Abnormal-cellLines_T_cells_Merged_Annotated_UMAP_on_Clusters_to_USE.Robj")
All_samples_Merged
An object of class Seurat
62625 features across 46976 samples within 6 assays
Active assay: SCT (25901 features, 3000 variable features)
3 layers present: counts, data, scale.data
5 other assays present: RNA, ADT, prediction.score.celltype.l1, prediction.score.celltype.l2, prediction.score.celltype.l3
4 dimensional reductions calculated: pca, umap, integrated_dr, ref.umap
DefaultAssay(All_samples_Merged) <- "SCT"
Idents(All_samples_Merged) <- "SCT_snn_res.0.9"
3. Data input & processing and initialization of CellChat
object
#------------------------------------------------------------------------------
# **Part I: Data input & processing and initialization of CellChat object**
#------------------------------------------------------------------------------
# Loading and Preparing Data
All_samples_Merged <- AddMetaData(object = All_samples_Merged,
metadata = paste0("Cluster_", All_samples_Merged$seurat_clusters),
col.name = 'Clusters')
#All_samples_Merged[["RNA"]] <- JoinLayers(All_samples_Merged[["RNA"]])
# Extract the normalized data
#data_input <- GetAssayData(All_samples_Merged, assay = "RNA", slot = "data")
data.input <- All_samples_Merged@assays$SCT$data
#1. Create CellChat object
cellchat <- createCellChat(object = data.input, meta = All_samples_Merged@meta.data, group.by = "Clusters")
[1] "Create a CellChat object from a data matrix"
Warning: The 'meta' data does not have a column named `samples`. We now add this column and all cells are assumed to belong to `sample1`!
Set cell identities for the new CellChat object
The cell groups used for CellChat analysis are Cluster_0, Cluster_1, Cluster_10, Cluster_11, Cluster_12, Cluster_13, Cluster_14, Cluster_15, Cluster_16, Cluster_17, Cluster_18, Cluster_19, Cluster_2, Cluster_20, Cluster_21, Cluster_22, Cluster_23, Cluster_24, Cluster_3, Cluster_4, Cluster_5, Cluster_6, Cluster_7, Cluster_8, Cluster_9
#2. Set the ligand-receptor interaction database
cellchatDB <- CellChatDB.human # or CellChatDB.mouse
showDatabaseCategory(cellchatDB)

# Show the structure of the database
dplyr::glimpse(cellchatDB$interaction)
Rows: 3,233
Columns: 28
$ interaction_name <chr> "TGFB1_TGFBR1_TGFBR2", "TGFB2_TGFBR1_TGFBR2", "TGFB3_TGFBR1_TGFBR2", "TGFB1_ACVR1B_TGFBR2", "TGFB…
$ pathway_name <chr> "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "…
$ ligand <chr> "TGFB1", "TGFB2", "TGFB3", "TGFB1", "TGFB1", "TGFB2", "TGFB2", "TGFB3", "TGFB3", "TGFB1", "TGFB2"…
$ receptor <chr> "TGFbR1_R2", "TGFbR1_R2", "TGFbR1_R2", "ACVR1B_TGFbR2", "ACVR1C_TGFbR2", "ACVR1B_TGFbR2", "ACVR1C…
$ agonist <chr> "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "TGFb agonist", "…
$ antagonist <chr> "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "TGFb antagonist", "T…
$ co_A_receptor <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
$ co_I_receptor <chr> "TGFb inhibition receptor", "TGFb inhibition receptor", "TGFb inhibition receptor", "TGFb inhibit…
$ evidence <chr> "KEGG: hsa04350", "KEGG: hsa04350", "KEGG: hsa04350", "PMID: 27449815", "PMID: 27449815", "PMID: …
$ annotation <chr> "Secreted Signaling", "Secreted Signaling", "Secreted Signaling", "Secreted Signaling", "Secreted…
$ interaction_name_2 <chr> "TGFB1 - (TGFBR1+TGFBR2)", "TGFB2 - (TGFBR1+TGFBR2)", "TGFB3 - (TGFBR1+TGFBR2)", "TGFB1 - (ACVR1B…
$ is_neurotransmitter <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,…
$ ligand.symbol <chr> "TGFB1", "TGFB2", "TGFB3", "TGFB1", "TGFB1", "TGFB2", "TGFB2", "TGFB3", "TGFB3", "TGFB1", "TGFB2"…
$ ligand.family <chr> "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta", "…
$ ligand.location <chr> "Extracellular matrix, Secreted, Extracellular space", "Extracellular matrix, Secreted, Extracell…
$ ligand.keyword <chr> "Disease variant, Signal, Reference proteome, Extracellular matrix, Disulfide bond, Secreted, Mit…
$ ligand.secreted_type <chr> "growth factor", "growth factor", "cytokine;growth factor", "growth factor", "growth factor", "gr…
$ ligand.transmembrane <lgl> FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FAL…
$ receptor.symbol <chr> "TGFBR2, TGFBR1", "TGFBR2, TGFBR1", "TGFBR2, TGFBR1", "TGFBR2, ACVR1B", "TGFBR2, ACVR1C", "TGFBR2…
$ receptor.family <chr> "Protein kinase superfamily, TKL Ser/Thr protein kinase", "Protein kinase superfamily, TKL Ser/Th…
$ receptor.location <chr> "Cell membrane, Secreted, Membrane raft, Cell surface, Cell junction, Tight junction", "Cell memb…
$ receptor.keyword <chr> "Membrane, Secreted, Disulfide bond, Kinase, Transmembrane, Differentiation, ATP-binding, Recepto…
$ receptor.surfaceome_main <chr> "Receptors", "Receptors", "Receptors", "Receptors", "Receptors", "Receptors", "Receptors", "Recep…
$ receptor.surfaceome_sub <chr> "Act.TGFB;Kinase", "Act.TGFB;Kinase", "Act.TGFB;Kinase", "Act.TGFB;Kinase", "Act.TGFB;Kinase", "A…
$ receptor.adhesome <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
$ receptor.secreted_type <chr> "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "…
$ receptor.transmembrane <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, T…
$ version <chr> "CellChatDB v1", "CellChatDB v1", "CellChatDB v1", "CellChatDB v1", "CellChatDB v1", "CellChatDB …
# use a subset of CellChatDB for cell-cell communication analysis
cellchatDB.use <- subsetDB(cellchatDB, search = "Secreted Signaling", key = "annotation") # use Secreted Signaling
# set the used database in the object
cellchat@DB <- cellchatDB.use
#------------------------------------------------------------------------------
# **Preprocessing the expression data for cell-cell communication analysis**
#------------------------------------------------------------------------------
#3. Preprocess the expression data
cellchat <- subsetData(cellchat)
cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat)
| | 0 % ~calculating
|+ | 1 % ~00s
|++ | 2 % ~00s
|++ | 4 % ~00s
|+++ | 5 % ~00s
|+++ | 6 % ~00s
|++++ | 7 % ~00s
|+++++ | 8 % ~00s
|+++++ | 9 % ~00s
|++++++ | 11% ~00s
|++++++ | 12% ~00s
|+++++++ | 13% ~00s
|++++++++ | 14% ~00s
|++++++++ | 15% ~00s
|+++++++++ | 16% ~00s
|+++++++++ | 18% ~00s
|++++++++++ | 19% ~00s
|++++++++++ | 20% ~00s
|+++++++++++ | 21% ~00s
|++++++++++++ | 22% ~00s
|++++++++++++ | 24% ~00s
|+++++++++++++ | 25% ~00s
|+++++++++++++ | 26% ~00s
|++++++++++++++ | 27% ~00s
|+++++++++++++++ | 28% ~00s
|+++++++++++++++ | 29% ~00s
|++++++++++++++++ | 31% ~00s
|++++++++++++++++ | 32% ~00s
|+++++++++++++++++ | 33% ~00s
|++++++++++++++++++ | 34% ~00s
|++++++++++++++++++ | 35% ~00s
|+++++++++++++++++++ | 36% ~00s
|+++++++++++++++++++ | 38% ~00s
|++++++++++++++++++++ | 39% ~00s
|++++++++++++++++++++ | 40% ~00s
|+++++++++++++++++++++ | 41% ~00s
|++++++++++++++++++++++ | 42% ~00s
|++++++++++++++++++++++ | 44% ~00s
|+++++++++++++++++++++++ | 45% ~00s
|+++++++++++++++++++++++ | 46% ~00s
|++++++++++++++++++++++++ | 47% ~00s
|+++++++++++++++++++++++++ | 48% ~00s
|+++++++++++++++++++++++++ | 49% ~00s
|++++++++++++++++++++++++++ | 51% ~00s
|++++++++++++++++++++++++++ | 52% ~00s
|+++++++++++++++++++++++++++ | 53% ~00s
|++++++++++++++++++++++++++++ | 54% ~00s
|++++++++++++++++++++++++++++ | 55% ~00s
|+++++++++++++++++++++++++++++ | 56% ~00s
|+++++++++++++++++++++++++++++ | 58% ~00s
|++++++++++++++++++++++++++++++ | 59% ~00s
|++++++++++++++++++++++++++++++ | 60% ~00s
|+++++++++++++++++++++++++++++++ | 61% ~00s
|++++++++++++++++++++++++++++++++ | 62% ~00s
|++++++++++++++++++++++++++++++++ | 64% ~00s
|+++++++++++++++++++++++++++++++++ | 65% ~00s
|+++++++++++++++++++++++++++++++++ | 66% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|+++++++++++++++++++++++++++++++++++ | 68% ~00s
|+++++++++++++++++++++++++++++++++++ | 69% ~00s
|++++++++++++++++++++++++++++++++++++ | 71% ~00s
|++++++++++++++++++++++++++++++++++++ | 72% ~00s
|+++++++++++++++++++++++++++++++++++++ | 73% ~00s
|++++++++++++++++++++++++++++++++++++++ | 74% ~00s
|++++++++++++++++++++++++++++++++++++++ | 75% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
| | 0 % ~calculating
|+ | 1 % ~00s
|++ | 2 % ~00s
|++ | 4 % ~00s
|+++ | 5 % ~00s
|+++ | 6 % ~00s
|++++ | 7 % ~00s
|+++++ | 8 % ~00s
|+++++ | 9 % ~00s
|++++++ | 11% ~00s
|++++++ | 12% ~00s
|+++++++ | 13% ~00s
|++++++++ | 14% ~00s
|++++++++ | 15% ~00s
|+++++++++ | 16% ~00s
|+++++++++ | 18% ~00s
|++++++++++ | 19% ~00s
|++++++++++ | 20% ~00s
|+++++++++++ | 21% ~00s
|++++++++++++ | 22% ~00s
|++++++++++++ | 24% ~00s
|+++++++++++++ | 25% ~00s
|+++++++++++++ | 26% ~00s
|++++++++++++++ | 27% ~00s
|+++++++++++++++ | 28% ~00s
|+++++++++++++++ | 29% ~00s
|++++++++++++++++ | 31% ~00s
|++++++++++++++++ | 32% ~00s
|+++++++++++++++++ | 33% ~00s
|++++++++++++++++++ | 34% ~00s
|++++++++++++++++++ | 35% ~00s
|+++++++++++++++++++ | 36% ~00s
|+++++++++++++++++++ | 38% ~00s
|++++++++++++++++++++ | 39% ~00s
|++++++++++++++++++++ | 40% ~00s
|+++++++++++++++++++++ | 41% ~00s
|++++++++++++++++++++++ | 42% ~00s
|++++++++++++++++++++++ | 44% ~00s
|+++++++++++++++++++++++ | 45% ~00s
|+++++++++++++++++++++++ | 46% ~00s
|++++++++++++++++++++++++ | 47% ~00s
|+++++++++++++++++++++++++ | 48% ~00s
|+++++++++++++++++++++++++ | 49% ~00s
|++++++++++++++++++++++++++ | 51% ~00s
|++++++++++++++++++++++++++ | 52% ~00s
|+++++++++++++++++++++++++++ | 53% ~00s
|++++++++++++++++++++++++++++ | 54% ~00s
|++++++++++++++++++++++++++++ | 55% ~00s
|+++++++++++++++++++++++++++++ | 56% ~00s
|+++++++++++++++++++++++++++++ | 58% ~00s
|++++++++++++++++++++++++++++++ | 59% ~00s
|++++++++++++++++++++++++++++++ | 60% ~00s
|+++++++++++++++++++++++++++++++ | 61% ~00s
|++++++++++++++++++++++++++++++++ | 62% ~00s
|++++++++++++++++++++++++++++++++ | 64% ~00s
|+++++++++++++++++++++++++++++++++ | 65% ~00s
|+++++++++++++++++++++++++++++++++ | 66% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|+++++++++++++++++++++++++++++++++++ | 68% ~00s
|+++++++++++++++++++++++++++++++++++ | 69% ~00s
|++++++++++++++++++++++++++++++++++++ | 71% ~00s
|++++++++++++++++++++++++++++++++++++ | 72% ~00s
|+++++++++++++++++++++++++++++++++++++ | 73% ~00s
|++++++++++++++++++++++++++++++++++++++ | 74% ~00s
|++++++++++++++++++++++++++++++++++++++ | 75% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
| | 0 % ~calculating
|+ | 1 % ~00s
|++ | 2 % ~00s
|++ | 3 % ~00s
|+++ | 4 % ~00s
|+++ | 5 % ~00s
|++++ | 6 % ~00s
|++++ | 7 % ~00s
|+++++ | 8 % ~00s
|+++++ | 9 % ~00s
|++++++ | 10% ~00s
|++++++ | 11% ~00s
|+++++++ | 12% ~00s
|+++++++ | 13% ~00s
|++++++++ | 14% ~00s
|++++++++ | 15% ~00s
|+++++++++ | 16% ~00s
|+++++++++ | 17% ~00s
|++++++++++ | 18% ~00s
|++++++++++ | 19% ~00s
|+++++++++++ | 20% ~00s
|+++++++++++ | 21% ~00s
|++++++++++++ | 22% ~00s
|++++++++++++ | 23% ~00s
|+++++++++++++ | 24% ~00s
|+++++++++++++ | 25% ~00s
|++++++++++++++ | 26% ~00s
|++++++++++++++ | 27% ~00s
|+++++++++++++++ | 28% ~00s
|+++++++++++++++ | 29% ~00s
|++++++++++++++++ | 30% ~00s
|++++++++++++++++ | 31% ~00s
|+++++++++++++++++ | 32% ~00s
|+++++++++++++++++ | 33% ~00s
|++++++++++++++++++ | 34% ~00s
|++++++++++++++++++ | 35% ~00s
|+++++++++++++++++++ | 36% ~00s
|+++++++++++++++++++ | 37% ~00s
|++++++++++++++++++++ | 38% ~00s
|++++++++++++++++++++ | 39% ~00s
|+++++++++++++++++++++ | 40% ~00s
|+++++++++++++++++++++ | 41% ~00s
|++++++++++++++++++++++ | 42% ~00s
|++++++++++++++++++++++ | 43% ~00s
|+++++++++++++++++++++++ | 44% ~00s
|+++++++++++++++++++++++ | 45% ~00s
|++++++++++++++++++++++++ | 46% ~00s
|++++++++++++++++++++++++ | 47% ~00s
|+++++++++++++++++++++++++ | 48% ~00s
|+++++++++++++++++++++++++ | 49% ~00s
|++++++++++++++++++++++++++ | 51% ~00s
|++++++++++++++++++++++++++ | 52% ~00s
|+++++++++++++++++++++++++++ | 53% ~00s
|+++++++++++++++++++++++++++ | 54% ~00s
|++++++++++++++++++++++++++++ | 55% ~00s
|++++++++++++++++++++++++++++ | 56% ~00s
|+++++++++++++++++++++++++++++ | 57% ~00s
|+++++++++++++++++++++++++++++ | 58% ~00s
|++++++++++++++++++++++++++++++ | 59% ~00s
|++++++++++++++++++++++++++++++ | 60% ~00s
|+++++++++++++++++++++++++++++++ | 61% ~00s
|+++++++++++++++++++++++++++++++ | 62% ~00s
|++++++++++++++++++++++++++++++++ | 63% ~00s
|++++++++++++++++++++++++++++++++ | 64% ~00s
|+++++++++++++++++++++++++++++++++ | 65% ~00s
|+++++++++++++++++++++++++++++++++ | 66% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|++++++++++++++++++++++++++++++++++ | 68% ~00s
|+++++++++++++++++++++++++++++++++++ | 69% ~00s
|+++++++++++++++++++++++++++++++++++ | 70% ~00s
|++++++++++++++++++++++++++++++++++++ | 71% ~00s
|++++++++++++++++++++++++++++++++++++ | 72% ~00s
|+++++++++++++++++++++++++++++++++++++ | 73% ~00s
|+++++++++++++++++++++++++++++++++++++ | 74% ~00s
|++++++++++++++++++++++++++++++++++++++ | 75% ~00s
|++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
The number of highly variable ligand-receptor pairs used for signaling inference is 549
4. Inference of cell-cell communication network
#------------------------------------------------------------------------------
# **Part II: Inference of cell-cell communication network**
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------------
# **Compute the communication probability and infer cellular communication network**
#------------------------------------------------------------------------------------
#4. Compute communication probability and infer cellular communication network
cellchat <- computeCommunProb(cellchat)
triMean is used for calculating the average gene expression per cell group.
[1] ">>> Run CellChat on sc/snRNA-seq data <<< [2024-09-20 15:34:24.817166]"
|
| | 0%
|
|= | 1%
|
|== | 1%
|
|== | 2%
|
|=== | 2%
|
|=== | 3%
|
|==== | 3%
|
|==== | 4%
|
|===== | 4%
|
|====== | 5%
|
|======= | 5%
|
|======= | 6%
|
|======== | 6%
|
|======== | 7%
|
|========= | 7%
|
|========= | 8%
|
|========== | 8%
|
|========== | 9%
|
|=========== | 9%
|
|============ | 9%
|
|============ | 10%
|
|============= | 10%
|
|============= | 11%
|
|============== | 11%
|
|============== | 12%
|
|=============== | 12%
|
|=============== | 13%
|
|================ | 13%
|
|================= | 14%
|
|================== | 14%
|
|================== | 15%
|
|=================== | 15%
|
|=================== | 16%
|
|==================== | 16%
|
|==================== | 17%
|
|===================== | 17%
|
|====================== | 18%
|
|======================= | 19%
|
|======================== | 19%
|
|======================== | 20%
|
|========================= | 20%
|
|========================= | 21%
|
|========================== | 21%
|
|========================== | 22%
|
|=========================== | 22%
|
|============================ | 23%
|
|============================= | 23%
|
|============================= | 24%
|
|============================== | 24%
|
|============================== | 25%
|
|=============================== | 25%
|
|=============================== | 26%
|
|================================ | 26%
|
|================================ | 27%
|
|================================= | 27%
|
|================================== | 28%
|
|=================================== | 28%
|
|=================================== | 29%
|
|==================================== | 29%
|
|==================================== | 30%
|
|===================================== | 30%
|
|===================================== | 31%
|
|====================================== | 31%
|
|====================================== | 32%
|
|======================================= | 32%
|
|======================================== | 32%
|
|======================================== | 33%
|
|========================================= | 33%
|
|========================================= | 34%
|
|========================================== | 34%
|
|========================================== | 35%
|
|=========================================== | 35%
|
|=========================================== | 36%
|
|============================================ | 36%
|
|============================================= | 37%
|
|============================================== | 37%
|
|============================================== | 38%
|
|=============================================== | 38%
|
|=============================================== | 39%
|
|================================================ | 39%
|
|================================================ | 40%
|
|================================================= | 40%
|
|================================================== | 41%
|
|=================================================== | 42%
|
|==================================================== | 42%
|
|==================================================== | 43%
|
|===================================================== | 43%
|
|===================================================== | 44%
|
|====================================================== | 44%
|
|====================================================== | 45%
|
|======================================================= | 45%
|
|======================================================== | 46%
|
|========================================================= | 46%
|
|========================================================= | 47%
|
|========================================================== | 47%
|
|========================================================== | 48%
|
|=========================================================== | 48%
|
|=========================================================== | 49%
|
|============================================================ | 49%
|
|============================================================ | 50%
|
|============================================================= | 50%
|
|============================================================== | 50%
|
|============================================================== | 51%
|
|=============================================================== | 51%
|
|=============================================================== | 52%
|
|================================================================ | 52%
|
|================================================================ | 53%
|
|================================================================= | 53%
|
|================================================================= | 54%
|
|================================================================== | 54%
|
|=================================================================== | 55%
|
|==================================================================== | 55%
|
|==================================================================== | 56%
|
|===================================================================== | 56%
|
|===================================================================== | 57%
|
|====================================================================== | 57%
|
|====================================================================== | 58%
|
|======================================================================= | 58%
|
|======================================================================== | 59%
|
|========================================================================= | 60%
|
|========================================================================== | 60%
|
|========================================================================== | 61%
|
|=========================================================================== | 61%
|
|=========================================================================== | 62%
|
|============================================================================ | 62%
|
|============================================================================ | 63%
|
|============================================================================= | 63%
|
|============================================================================== | 64%
|
|=============================================================================== | 64%
|
|=============================================================================== | 65%
|
|================================================================================ | 65%
|
|================================================================================ | 66%
|
|================================================================================= | 66%
|
|================================================================================= | 67%
|
|================================================================================== | 67%
|
|================================================================================== | 68%
|
|=================================================================================== | 68%
|
|==================================================================================== | 68%
|
|==================================================================================== | 69%
|
|===================================================================================== | 69%
|
|===================================================================================== | 70%
|
|====================================================================================== | 70%
|
|====================================================================================== | 71%
|
|======================================================================================= | 71%
|
|======================================================================================= | 72%
|
|======================================================================================== | 72%
|
|========================================================================================= | 73%
|
|========================================================================================== | 73%
|
|========================================================================================== | 74%
|
|=========================================================================================== | 74%
|
|=========================================================================================== | 75%
|
|============================================================================================ | 75%
|
|============================================================================================ | 76%
|
|============================================================================================= | 76%
|
|============================================================================================= | 77%
|
|============================================================================================== | 77%
|
|=============================================================================================== | 78%
|
|================================================================================================ | 78%
|
|================================================================================================ | 79%
|
|================================================================================================= | 79%
|
|================================================================================================= | 80%
|
|================================================================================================== | 80%
|
|================================================================================================== | 81%
|
|=================================================================================================== | 81%
|
|==================================================================================================== | 82%
|
|===================================================================================================== | 83%
|
|====================================================================================================== | 83%
|
|====================================================================================================== | 84%
|
|======================================================================================================= | 84%
|
|======================================================================================================= | 85%
|
|======================================================================================================== | 85%
|
|======================================================================================================== | 86%
|
|========================================================================================================= | 86%
|
|========================================================================================================== | 87%
|
|=========================================================================================================== | 87%
|
|=========================================================================================================== | 88%
|
|============================================================================================================ | 88%
|
|============================================================================================================ | 89%
|
|============================================================================================================= | 89%
|
|============================================================================================================= | 90%
|
|============================================================================================================== | 90%
|
|============================================================================================================== | 91%
|
|=============================================================================================================== | 91%
|
|================================================================================================================ | 91%
|
|================================================================================================================ | 92%
|
|================================================================================================================= | 92%
|
|================================================================================================================= | 93%
|
|================================================================================================================== | 93%
|
|================================================================================================================== | 94%
|
|=================================================================================================================== | 94%
|
|=================================================================================================================== | 95%
|
|==================================================================================================================== | 95%
|
|===================================================================================================================== | 96%
|
|====================================================================================================================== | 96%
|
|====================================================================================================================== | 97%
|
|======================================================================================================================= | 97%
|
|======================================================================================================================= | 98%
|
|======================================================================================================================== | 98%
|
|======================================================================================================================== | 99%
|
|========================================================================================================================= | 99%
|
|==========================================================================================================================| 100%
[1] ">>> CellChat inference is done. Parameter values are stored in `object@options$parameter` <<< [2024-09-20 15:39:47.003683]"
cellchat <- filterCommunication(cellchat, min.cells = 10)
#------------------------------------------------------------------------------
# **Infer the cell-cell communication at a signaling pathway level**
#------------------------------------------------------------------------------
#5. Compute communication at the pathway level
cellchat <- computeCommunProbPathway(cellchat)
#------------------------------------------------------------------------------
# **Calculate the aggregated cell-cell communication network**
#------------------------------------------------------------------------------
#6. Aggregate the inferred cell-cell communication network
cellchat <- aggregateNet(cellchat)
#7. Visualize the communication network
groupSize <- as.numeric(table(cellchat@idents))
netVisual_circle(cellchat@net$count, vertex.weight = groupSize, weight.scale = T, label.edge= F, title.name = "Number of interactions")


netVisual_circle(cellchat@net$weight, vertex.weight = groupSize, weight.scale = T, label.edge= F, title.name = "Interaction weights/strength")

mat <- cellchat@net$weight
par(mfrow = c(3,4), xpd=TRUE)

for (i in 1:nrow(mat)) {
mat2 <- matrix(0, nrow = nrow(mat), ncol = ncol(mat), dimnames = dimnames(mat))
mat2[i, ] <- mat[i, ]
netVisual_circle(mat2, vertex.weight = groupSize, weight.scale = T, edge.weight.max = max(mat), title.name = rownames(mat)[i])
}


NA

5. Visualization of cell-cell communication network
#------------------------------------------------------------------------------
# **Part III: Visualization of cell-cell communication network**
#------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------------------
# **Visualize each signaling pathway using Hierarchy plot, Circle plot or Chord diagram**
#----------------------------------------------------------------------------------------------------
pathways.show <- c("CXCL")
# Hierarchy plot
# Here we define `vertex.receive` so that the left portion of the hierarchy plot shows signaling to fibroblast and the right portion shows signaling to immune cells
vertex.receiver = seq(1,4) # a numeric vector.
netVisual_aggregate(cellchat, signaling = pathways.show, vertex.receiver = vertex.receiver)

# Circle plot
par(mfrow=c(1,1))

netVisual_aggregate(cellchat, signaling = pathways.show, layout = "circle")

# Chord diagram
par(mfrow=c(1,1))

netVisual_aggregate(cellchat, signaling = pathways.show, layout = "chord")

# Heatmap
par(mfrow=c(1,1))

netVisual_heatmap(cellchat, signaling = pathways.show, color.heatmap = "Reds")
Do heatmap based on a single object

#> Do heatmap based on a single object
# Get the levels of cell types
cell_types <- levels(cellchat@idents)
# Chord diagram
group.cellType <- c(rep("CXCL", 6), rep("CCL", 6), rep("IL2", 6), rep("TNF", 7))
group.cellType <- rep(NA, length(cell_types))
# Assign each cell type to a group
# You'll need to adjust this based on your actual data and biological knowledge
group.cellType[1:6] <- "CXCL"
group.cellType[7:12] <- "CCL"
group.cellType[13:18] <- "IL2"
group.cellType[19:25] <- "TNF"
# Name the vector with the cell types
names(group.cellType) <- cell_types
# Check the result
print(group.cellType)
Cluster_0 Cluster_1 Cluster_10 Cluster_11 Cluster_12 Cluster_13 Cluster_14 Cluster_15 Cluster_16 Cluster_17 Cluster_18 Cluster_19
"CXCL" "CXCL" "CXCL" "CXCL" "CXCL" "CXCL" "CCL" "CCL" "CCL" "CCL" "CCL" "CCL"
Cluster_2 Cluster_20 Cluster_21 Cluster_22 Cluster_23 Cluster_24 Cluster_3 Cluster_4 Cluster_5 Cluster_6 Cluster_7 Cluster_8
"IL2" "IL2" "IL2" "IL2" "IL2" "IL2" "TNF" "TNF" "TNF" "TNF" "TNF" "TNF"
Cluster_9
"TNF"
netVisual_chord_cell(cellchat, signaling = pathways.show, group = group.cellType, title.name = paste0(pathways.show, " signaling network"))
Plot the aggregated cell-cell communication network at the signaling pathway level


#> Plot the aggregated cell-cell communication network at the signaling pathway level
# Compute the contribution of each ligand-receptor pair to the overall signaling pathway and visualize cell-cell
#communication mediated by a single ligand-receptor pair
netAnalysis_contribution(cellchat, signaling = pathways.show)

pairLR.CXCL <- extractEnrichedLR(cellchat, signaling = pathways.show, geneLR.return = FALSE)
LR.show <- pairLR.CXCL[1,] # show one ligand-receptor pair
# Hierarchy plot
vertex.receiver = seq(1,4) # a numeric vector
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, vertex.receiver = vertex.receiver)
[[1]]


#> [[1]]
# Circle plot
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "circle")
[[1]]


#> [[1]]
# Chord diagram
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "chord")
[[1]]


# Access all the signaling pathways showing significant communications
pathways.show.all <- cellchat@netP$pathways
# check the order of cell identity to set suitable vertex.receiver
levels(cellchat@idents)
[1] "Cluster_0" "Cluster_1" "Cluster_10" "Cluster_11" "Cluster_12" "Cluster_13" "Cluster_14" "Cluster_15" "Cluster_16"
[10] "Cluster_17" "Cluster_18" "Cluster_19" "Cluster_2" "Cluster_20" "Cluster_21" "Cluster_22" "Cluster_23" "Cluster_24"
[19] "Cluster_3" "Cluster_4" "Cluster_5" "Cluster_6" "Cluster_7" "Cluster_8" "Cluster_9"
vertex.receiver = seq(1,4)
for (i in 1:length(pathways.show.all)) {
# Visualize communication network associated with both signaling pathway and individual L-R pairs
netVisual(cellchat, signaling = pathways.show.all[i], vertex.receiver = vertex.receiver, layout = "hierarchy")
# Compute and visualize the contribution of each ligand-receptor pair to the overall signaling pathway
gg <- netAnalysis_contribution(cellchat, signaling = pathways.show.all[i])
ggsave(filename=paste0(pathways.show.all[i], "_L-R_contribution.pdf"), plot=gg, width = 3, height = 2, units = 'in', dpi = 300)
}
#----------------------------------------------------------------------------------------------------
# **Visualize cell-cell communication mediated by multiple ligand-receptors or signaling pathways**
#----------------------------------------------------------------------------------------------------
#(A) Bubble plot
# (1) show all the significant interactions (L-R pairs) from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), remove.isolate = FALSE)
Comparing communications on a single object

#> Comparing communications on a single object
# (2) show all the significant interactions (L-R pairs) associated with certain signaling pathways
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), signaling = c("CCL","CXCL"), remove.isolate = FALSE)
Comparing communications on a single object

#> Comparing communications on a single object
# (3) show all the significant interactions (L-R pairs) based on user's input (defined by `pairLR.use`)
pairLR.use <- extractEnrichedLR(cellchat, signaling = c("CCL","CXCL","FGF"))
There is no significant communication of FGF
netVisual_bubble(cellchat, sources.use = c(3,4), targets.use = c(5:8), pairLR.use = pairLR.use, remove.isolate = TRUE)
Comparing communications on a single object

#> Comparing communications on a single object
# (B) Chord diagram
# show all the significant interactions (L-R pairs) from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
# show all the interactions sending from Inflam.FIB
netVisual_chord_gene(cellchat, sources.use = 4, targets.use = c(5:11), lab.cex = 0.5,legend.pos.y = 30)


# show all the interactions received by Inflam.DC
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = 8, legend.pos.x = 15)


# show all the significant interactions (L-R pairs) associated with certain signaling pathways
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = c(5:11), signaling = c("CCL","CXCL"),legend.pos.x = 8)


# show all the significant signaling pathways from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = c(5:11), slot.name = "netP", legend.pos.x = 10)


#----------------------------------------------------------------------------------------------------
# **Plot the signaling gene expression distribution using violin/dot plot**
#----------------------------------------------------------------------------------------------------
plotGeneExpression(cellchat, signaling = "CXCL", enriched.only = TRUE, type = "violin")
Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.

plotGeneExpression(cellchat, signaling = "CXCL", enriched.only = FALSE)
Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.Warning: Default search for "data" layer in "RNA" assay yielded no results; utilizing "counts" layer instead.Scale for y is already present.
Adding another scale for y, which will replace the existing scale.

6. Systems analysis of cell-cell communication network
#----------------------------------------------------------------------------------------------------
# **Part IV: Systems analysis of cell-cell communication network**
#----------------------------------------------------------------------------------------------------
# (A) Compute and visualize the network centrality scores
ptm = Sys.time()
# Compute the network centrality scores
cellchat <- netAnalysis_computeCentrality(cellchat, slot.name = "netP") # the slot 'netP' means the inferred intercellular communication network of signaling pathways
| | 0 % ~calculating
|++ | 4 % ~07s
|++++ | 7 % ~05s
|++++++ | 11% ~05s
|++++++++ | 14% ~04s
|+++++++++ | 18% ~03s
|+++++++++++ | 21% ~03s
|+++++++++++++ | 25% ~02s
|+++++++++++++++ | 29% ~02s
|+++++++++++++++++ | 32% ~02s
|++++++++++++++++++ | 36% ~02s
|++++++++++++++++++++ | 39% ~02s
|++++++++++++++++++++++ | 43% ~01s
|++++++++++++++++++++++++ | 46% ~01s
|+++++++++++++++++++++++++ | 50% ~01s
|+++++++++++++++++++++++++++ | 54% ~01s
|+++++++++++++++++++++++++++++ | 57% ~01s
|+++++++++++++++++++++++++++++++ | 61% ~01s
|+++++++++++++++++++++++++++++++++ | 64% ~01s
|++++++++++++++++++++++++++++++++++ | 68% ~01s
|++++++++++++++++++++++++++++++++++++ | 71% ~01s
|++++++++++++++++++++++++++++++++++++++ | 75% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s
# Visualize the computed centrality scores using heatmap, allowing ready identification of major signaling roles of cell groups
netAnalysis_signalingRole_network(cellchat, signaling = pathways.show, width = 8, height = 2.5, font.size = 10)

#(B) Visualize dominant senders (sources) and receivers (targets) in a 2D space
# Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
gg1 <- netAnalysis_signalingRole_scatter(cellchat)
Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
#> Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
# Signaling role analysis on the cell-cell communication networks of interest
gg2 <- netAnalysis_signalingRole_scatter(cellchat, signaling = c("CXCL", "CCL"))
Signaling role analysis on the cell-cell communication network from user's input
#> Signaling role analysis on the cell-cell communication network from user's input
gg1 + gg2

# (C) Identify signals contributing the most to outgoing or incoming signaling of certain cell groups
# Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
ht1 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "outgoing")
ht2 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "incoming")
ht1 + ht2
Warning: Heatmap/annotation names are duplicated: Relative strength

# Signaling role analysis on the cell-cell communication networks of interest
ht <- netAnalysis_signalingRole_heatmap(cellchat, signaling = c("CXCL", "CCL"))
#---------------------------------------------------------------------------------------------------------------------------
# **Identify global communication patterns to explore how multiple cell types and signaling pathways coordinate together**
#----------------------------------------------------------------------------------------------------------------------------
# (A) Identify and visualize outgoing communication pattern of secreting cells
library(NMF)
Loading required package: registry
Loading required package: rngtools
Loading required package: cluster
NMF - BioConductor layer [OK] | Shared memory capabilities [NO: bigmemory] | Cores 2/2
To enable shared memory capabilities, try: install.extras('
NMF
')
Attaching package: ‘NMF’
The following objects are masked from ‘package:igraph’:
algorithm, compare
#> Loading required package: registry
#> Loading required package: rngtools
#> Loading required package: cluster
#> NMF - BioConductor layer [OK] | Shared memory capabilities [NO: bigmemory] | Cores 2/2
#> To enable shared memory capabilities, try: install.extras('
#> NMF
#> ')
#>
#> Attaching package: 'NMF'
#> The following objects are masked from 'package:igraph':
#>
#> algorithm, compare
library(ggalluvial)
setwd("../SS_CellLines_Pipeline/")
selectK(cellchat, pattern = "outgoing")
Warning: Continuous limits supplied to discrete scale.
ℹ Did you mean `limits = factor(...)` or `scale_*_continuous()`?
nPatterns = 6
cellchat <- identifyCommunicationPatterns(cellchat, pattern = "outgoing", k = nPatterns)
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.

# river plot
netAnalysis_river(cellchat, pattern = "outgoing")
Please make sure you have load `library(ggalluvial)` when running this function

#> Please make sure you have load `library(ggalluvial)` when running this function
# dot plot
netAnalysis_dot(cellchat, pattern = "outgoing")

setwd(".")
# (B) Identify and visualize incoming communication pattern of target cells
selectK(cellchat, pattern = "incoming")
Warning: Continuous limits supplied to discrete scale.
ℹ Did you mean `limits = factor(...)` or `scale_*_continuous()`?
nPatterns = 3
cellchat <- identifyCommunicationPatterns(cellchat, pattern = "incoming", k = nPatterns)
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.
Warning: Recycling array of length 1 in array-vector arithmetic is deprecated.
Use c() or as.vector() instead.

# river plot
netAnalysis_river(cellchat, pattern = "incoming")
Please make sure you have load `library(ggalluvial)` when running this function

#> Please make sure you have load `library(ggalluvial)` when running this function
# dot plot
netAnalysis_dot(cellchat, pattern = "incoming")

#---------------------------------------------------------------------------------------------------------------------------
# **Manifold and classification learning analysis of signaling networks**
#----------------------------------------------------------------------------------------------------------------------------
# Identify signaling groups based on their functional similarity
#8. Identify signaling roles and patterns
cellchat <- computeNetSimilarity(cellchat, type = "functional")
library(uwot)
Loading required package: Matrix
cellchat <- netEmbedding(cellchat, type = "functional", umap.method = "uwot")
Manifold learning of the signaling networks for a single dataset
options(future.globals.maxSize = 16000 * 1024^2) # Set to 16 GB
cellchat <- netClustering(cellchat, type = "functional", do.parallel = FALSE)
Classification learning of the signaling networks for a single dataset
| | 0 % ~calculating
|++++++ | 11% ~00s
|++++++++++++ | 22% ~00s
|+++++++++++++++++ | 33% ~00s
|+++++++++++++++++++++++ | 44% ~00s
|++++++++++++++++++++++++++++ | 56% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
Warning: all eigenvalues are requested, eigen() is used insteadWarning: all eigenvalues are requested, eigen() is used instead
netVisual_embedding(cellchat, type = "functional", label.size = 3.5)
Warning: Using alpha for a discrete variable is not advised.

# Identify signaling groups based on structure similarity
#install umap-learn before running these commands
#pip install umap-learn
cellchat <- computeNetSimilarity(cellchat, type = "structural")
cellchat <- netEmbedding(cellchat, type = "structural", umap.method = "uwot")
Manifold learning of the signaling networks for a single dataset
#> Manifold learning of the signaling networks for a single dataset
options(future.globals.maxSize = 16000 * 1024^2) # Set to 16 GB
cellchat <- netClustering(cellchat, type = "structural", do.parallel = FALSE)
Classification learning of the signaling networks for a single dataset
| | 0 % ~calculating
|++++++ | 11% ~00s
|++++++++++++ | 22% ~00s
|+++++++++++++++++ | 33% ~00s
|+++++++++++++++++++++++ | 44% ~00s
|++++++++++++++++++++++++++++ | 56% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s
Warning: all eigenvalues are requested, eigen() is used insteadWarning: all eigenvalues are requested, eigen() is used instead
#> Classification learning of the signaling networks for a single dataset
# Visualization in 2D-space
netVisual_embedding(cellchat, type = "structural", label.size = 3.5)
Warning: Using alpha for a discrete variable is not advised.

netVisual_embeddingZoomIn(cellchat, type = "structural", nCol = 2)

7. Save the CellChat object
save(cellchat, file = "cellCHAT_Analysis_All_samples_Merged.Robj")
LS0tCnRpdGxlOiAiSW5mZXJlbmNlIGFuZCBhbmFseXNpcyBvZiBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiB1c2luZyBDZWxsQ2hhdC1TU19jZWxsTGluZXMiCmF1dGhvcjogTmFzaXIgTWFobW9vZCBBYmJhc2kKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgI3JtZGZvcm1hdHM6OnJlYWR0aGVkb3duCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0b2NfY29sbGFwc2VkOiB0cnVlCi0tLQoKIyAxLiBsb2FkIGxpYnJhcmllcwpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KCmxpYnJhcnkoU2V1cmF0KQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KENlbGxDaGF0KQpsaWJyYXJ5KHBhdGNod29yaykKb3B0aW9ucyhzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiMgcmV0aWN1bGF0ZTo6dXNlX3B5dGhvbigiL1VzZXJzL3N1b3Fpbmppbi9hbmFjb25kYTMvYmluL3B5dGhvbiIsIHJlcXVpcmVkPVQpIAoKYGBgCgojIDIuIExvYWQgU2V1cmF0IE9iamVjdApgYGB7ciBsb2FkX3NldXJhdE9CSn0KCiNMb2FkIFNldXJhdCBPYmplY3QgSW50ZWdyYXRlZCBPYmplY3QKbG9hZCgiL2hvbWUvYmlvaW5mby9DbHVzdGVyX3RvX0NvbXB1dGVyX1RyYW5zZmVyX2ZpbGVzX2ZvbGRlci9BbGxfTm9ybWFsLVBCTUNfQWJub3JtYWwtY2VsbExpbmVzX1RfY2VsbHNfTWVyZ2VkX0Fubm90YXRlZF9VTUFQX29uX0NsdXN0ZXJzX3RvX1VTRS5Sb2JqIikKIAogIEFsbF9zYW1wbGVzX01lcmdlZAoKRGVmYXVsdEFzc2F5KEFsbF9zYW1wbGVzX01lcmdlZCkgPC0gIlNDVCIKCklkZW50cyhBbGxfc2FtcGxlc19NZXJnZWQpIDwtICJTQ1Rfc25uX3Jlcy4wLjkiCgpgYGAKCgojIDMuIERhdGEgaW5wdXQgJiBwcm9jZXNzaW5nIGFuZCBpbml0aWFsaXphdGlvbiBvZiBDZWxsQ2hhdCBvYmplY3QKYGBge3IgREFUQUlOUFVULCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqKlBhcnQgSTogRGF0YSBpbnB1dCAmIHByb2Nlc3NpbmcgYW5kIGluaXRpYWxpemF0aW9uIG9mIENlbGxDaGF0IG9iamVjdCoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgTG9hZGluZyBhbmQgUHJlcGFyaW5nIERhdGEKQWxsX3NhbXBsZXNfTWVyZ2VkIDwtIEFkZE1ldGFEYXRhKG9iamVjdCA9IEFsbF9zYW1wbGVzX01lcmdlZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBwYXN0ZTAoIkNsdXN0ZXJfIiwgQWxsX3NhbXBsZXNfTWVyZ2VkJHNldXJhdF9jbHVzdGVycyksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5uYW1lID0gJ0NsdXN0ZXJzJykKCiNBbGxfc2FtcGxlc19NZXJnZWRbWyJSTkEiXV0gPC0gSm9pbkxheWVycyhBbGxfc2FtcGxlc19NZXJnZWRbWyJSTkEiXV0pCgoKIyBFeHRyYWN0IHRoZSBub3JtYWxpemVkIGRhdGEKI2RhdGFfaW5wdXQgPC0gR2V0QXNzYXlEYXRhKEFsbF9zYW1wbGVzX01lcmdlZCwgYXNzYXkgPSAiUk5BIiwgc2xvdCA9ICJkYXRhIikKCgpkYXRhLmlucHV0IDwtIEFsbF9zYW1wbGVzX01lcmdlZEBhc3NheXMkU0NUJGRhdGEKCgojMS4gIENyZWF0ZSBDZWxsQ2hhdCBvYmplY3QKY2VsbGNoYXQgPC0gY3JlYXRlQ2VsbENoYXQob2JqZWN0ID0gZGF0YS5pbnB1dCwgbWV0YSA9IEFsbF9zYW1wbGVzX01lcmdlZEBtZXRhLmRhdGEsIGdyb3VwLmJ5ID0gIkNsdXN0ZXJzIikKCgoKCiMyLiAgU2V0IHRoZSBsaWdhbmQtcmVjZXB0b3IgaW50ZXJhY3Rpb24gZGF0YWJhc2UKCmNlbGxjaGF0REIgPC0gQ2VsbENoYXREQi5odW1hbiAjIG9yIENlbGxDaGF0REIubW91c2UKc2hvd0RhdGFiYXNlQ2F0ZWdvcnkoY2VsbGNoYXREQikKCiMgU2hvdyB0aGUgc3RydWN0dXJlIG9mIHRoZSBkYXRhYmFzZQpkcGx5cjo6Z2xpbXBzZShjZWxsY2hhdERCJGludGVyYWN0aW9uKQoKIyB1c2UgYSBzdWJzZXQgb2YgQ2VsbENoYXREQiBmb3IgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gYW5hbHlzaXMKY2VsbGNoYXREQi51c2UgPC0gc3Vic2V0REIoY2VsbGNoYXREQiwgc2VhcmNoID0gIlNlY3JldGVkIFNpZ25hbGluZyIsIGtleSA9ICJhbm5vdGF0aW9uIikgIyB1c2UgU2VjcmV0ZWQgU2lnbmFsaW5nCgojIHNldCB0aGUgdXNlZCBkYXRhYmFzZSBpbiB0aGUgb2JqZWN0CmNlbGxjaGF0QERCIDwtIGNlbGxjaGF0REIudXNlCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipQcmVwcm9jZXNzaW5nIHRoZSBleHByZXNzaW9uIGRhdGEgZm9yIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIGFuYWx5c2lzKioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojMy4gIFByZXByb2Nlc3MgdGhlIGV4cHJlc3Npb24gZGF0YQpjZWxsY2hhdCA8LSBzdWJzZXREYXRhKGNlbGxjaGF0KQpjZWxsY2hhdCA8LSBpZGVudGlmeU92ZXJFeHByZXNzZWRHZW5lcyhjZWxsY2hhdCkKY2VsbGNoYXQgPC0gaWRlbnRpZnlPdmVyRXhwcmVzc2VkSW50ZXJhY3Rpb25zKGNlbGxjaGF0KQoKCgpgYGAKCiMgNC4gSW5mZXJlbmNlIG9mIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsKYGBge3IgSU5GRVJFTkNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqUGFydCBJSTogSW5mZXJlbmNlIG9mIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipDb21wdXRlIHRoZSBjb21tdW5pY2F0aW9uIHByb2JhYmlsaXR5IGFuZCBpbmZlciBjZWxsdWxhciBjb21tdW5pY2F0aW9uIG5ldHdvcmsqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojNC4gIENvbXB1dGUgY29tbXVuaWNhdGlvbiBwcm9iYWJpbGl0eSBhbmQgaW5mZXIgY2VsbHVsYXIgY29tbXVuaWNhdGlvbiBuZXR3b3JrCmNlbGxjaGF0IDwtIGNvbXB1dGVDb21tdW5Qcm9iKGNlbGxjaGF0KQpjZWxsY2hhdCA8LSBmaWx0ZXJDb21tdW5pY2F0aW9uKGNlbGxjaGF0LCBtaW4uY2VsbHMgPSAxMCkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqKkluZmVyIHRoZSBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBhdCBhIHNpZ25hbGluZyBwYXRod2F5IGxldmVsKioKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojNS4gIENvbXB1dGUgY29tbXVuaWNhdGlvbiBhdCB0aGUgcGF0aHdheSBsZXZlbApjZWxsY2hhdCA8LSBjb21wdXRlQ29tbXVuUHJvYlBhdGh3YXkoY2VsbGNoYXQpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipDYWxjdWxhdGUgdGhlIGFnZ3JlZ2F0ZWQgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gbmV0d29yayoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIzYuICBBZ2dyZWdhdGUgdGhlIGluZmVycmVkIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsKY2VsbGNoYXQgPC0gYWdncmVnYXRlTmV0KGNlbGxjaGF0KQoKCiM3LiAgVmlzdWFsaXplIHRoZSBjb21tdW5pY2F0aW9uIG5ldHdvcmsKZ3JvdXBTaXplIDwtIGFzLm51bWVyaWModGFibGUoY2VsbGNoYXRAaWRlbnRzKSkKCm5ldFZpc3VhbF9jaXJjbGUoY2VsbGNoYXRAbmV0JGNvdW50LCB2ZXJ0ZXgud2VpZ2h0ID0gZ3JvdXBTaXplLCB3ZWlnaHQuc2NhbGUgPSBULCBsYWJlbC5lZGdlPSBGLCB0aXRsZS5uYW1lID0gIk51bWJlciBvZiBpbnRlcmFjdGlvbnMiKQpuZXRWaXN1YWxfY2lyY2xlKGNlbGxjaGF0QG5ldCR3ZWlnaHQsIHZlcnRleC53ZWlnaHQgPSBncm91cFNpemUsIHdlaWdodC5zY2FsZSA9IFQsIGxhYmVsLmVkZ2U9IEYsIHRpdGxlLm5hbWUgPSAiSW50ZXJhY3Rpb24gd2VpZ2h0cy9zdHJlbmd0aCIpCgptYXQgPC0gY2VsbGNoYXRAbmV0JHdlaWdodApwYXIobWZyb3cgPSBjKDMsNCksIHhwZD1UUlVFKQpmb3IgKGkgaW4gMTpucm93KG1hdCkpIHsKICBtYXQyIDwtIG1hdHJpeCgwLCBucm93ID0gbnJvdyhtYXQpLCBuY29sID0gbmNvbChtYXQpLCBkaW1uYW1lcyA9IGRpbW5hbWVzKG1hdCkpCiAgbWF0MltpLCBdIDwtIG1hdFtpLCBdCiAgbmV0VmlzdWFsX2NpcmNsZShtYXQyLCB2ZXJ0ZXgud2VpZ2h0ID0gZ3JvdXBTaXplLCB3ZWlnaHQuc2NhbGUgPSBULCBlZGdlLndlaWdodC5tYXggPSBtYXgobWF0KSwgdGl0bGUubmFtZSA9IHJvd25hbWVzKG1hdClbaV0pCn0KCmBgYAojIDUuIFZpc3VhbGl6YXRpb24gb2YgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gbmV0d29yawpgYGB7ciBWSVNVQUxJWkFUSU9OLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMH0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqUGFydCBJSUk6IFZpc3VhbGl6YXRpb24gb2YgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gbmV0d29yayoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqVmlzdWFsaXplIGVhY2ggc2lnbmFsaW5nIHBhdGh3YXkgdXNpbmcgSGllcmFyY2h5IHBsb3QsIENpcmNsZSBwbG90IG9yIENob3JkIGRpYWdyYW0qKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIApwYXRod2F5cy5zaG93IDwtIGMoIkNYQ0wiKSAKIyBIaWVyYXJjaHkgcGxvdAojIEhlcmUgd2UgZGVmaW5lIGB2ZXJ0ZXgucmVjZWl2ZWAgc28gdGhhdCB0aGUgbGVmdCBwb3J0aW9uIG9mIHRoZSBoaWVyYXJjaHkgcGxvdCBzaG93cyBzaWduYWxpbmcgdG8gZmlicm9ibGFzdCBhbmQgdGhlIHJpZ2h0IHBvcnRpb24gc2hvd3Mgc2lnbmFsaW5nIHRvIGltbXVuZSBjZWxscyAKdmVydGV4LnJlY2VpdmVyID0gc2VxKDEsNCkgIyBhIG51bWVyaWMgdmVjdG9yLiAKbmV0VmlzdWFsX2FnZ3JlZ2F0ZShjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgIHZlcnRleC5yZWNlaXZlciA9IHZlcnRleC5yZWNlaXZlcikKIyBDaXJjbGUgcGxvdApwYXIobWZyb3c9YygxLDEpKQpuZXRWaXN1YWxfYWdncmVnYXRlKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LCBsYXlvdXQgPSAiY2lyY2xlIikKCgojIENob3JkIGRpYWdyYW0KcGFyKG1mcm93PWMoMSwxKSkKbmV0VmlzdWFsX2FnZ3JlZ2F0ZShjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgbGF5b3V0ID0gImNob3JkIikKCiMgSGVhdG1hcApwYXIobWZyb3c9YygxLDEpKQpuZXRWaXN1YWxfaGVhdG1hcChjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgY29sb3IuaGVhdG1hcCA9ICJSZWRzIikKIz4gRG8gaGVhdG1hcCBiYXNlZCBvbiBhIHNpbmdsZSBvYmplY3QKCgoKIyBHZXQgdGhlIGxldmVscyBvZiBjZWxsIHR5cGVzCmNlbGxfdHlwZXMgPC0gbGV2ZWxzKGNlbGxjaGF0QGlkZW50cykKCiMgQ2hvcmQgZGlhZ3JhbQpncm91cC5jZWxsVHlwZSA8LSBjKHJlcCgiQ1hDTCIsIDYpLCByZXAoIkNDTCIsIDYpLCByZXAoIklMMiIsIDYpLCByZXAoIlRORiIsIDcpKQoKZ3JvdXAuY2VsbFR5cGUgPC0gcmVwKE5BLCBsZW5ndGgoY2VsbF90eXBlcykpCgojIEFzc2lnbiBlYWNoIGNlbGwgdHlwZSB0byBhIGdyb3VwCiMgWW91J2xsIG5lZWQgdG8gYWRqdXN0IHRoaXMgYmFzZWQgb24geW91ciBhY3R1YWwgZGF0YSBhbmQgYmlvbG9naWNhbCBrbm93bGVkZ2UKZ3JvdXAuY2VsbFR5cGVbMTo2XSA8LSAiQ1hDTCIKZ3JvdXAuY2VsbFR5cGVbNzoxMl0gPC0gIkNDTCIKZ3JvdXAuY2VsbFR5cGVbMTM6MThdIDwtICJJTDIiCmdyb3VwLmNlbGxUeXBlWzE5OjI1XSA8LSAiVE5GIgoKIyBOYW1lIHRoZSB2ZWN0b3Igd2l0aCB0aGUgY2VsbCB0eXBlcwpuYW1lcyhncm91cC5jZWxsVHlwZSkgPC0gY2VsbF90eXBlcwoKIyBDaGVjayB0aGUgcmVzdWx0CnByaW50KGdyb3VwLmNlbGxUeXBlKQoKbmV0VmlzdWFsX2Nob3JkX2NlbGwoY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIGdyb3VwID0gZ3JvdXAuY2VsbFR5cGUsIHRpdGxlLm5hbWUgPSBwYXN0ZTAocGF0aHdheXMuc2hvdywgIiBzaWduYWxpbmcgbmV0d29yayIpKQojPiBQbG90IHRoZSBhZ2dyZWdhdGVkIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsgYXQgdGhlIHNpZ25hbGluZyBwYXRod2F5IGxldmVsCgoKICAKIyBDb21wdXRlIHRoZSBjb250cmlidXRpb24gb2YgZWFjaCBsaWdhbmQtcmVjZXB0b3IgcGFpciB0byB0aGUgb3ZlcmFsbCBzaWduYWxpbmcgcGF0aHdheSBhbmQgdmlzdWFsaXplIGNlbGwtY2VsbCAKI2NvbW11bmljYXRpb24gbWVkaWF0ZWQgYnkgYSBzaW5nbGUgbGlnYW5kLXJlY2VwdG9yIHBhaXIKCm5ldEFuYWx5c2lzX2NvbnRyaWJ1dGlvbihjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdykKCnBhaXJMUi5DWENMIDwtIGV4dHJhY3RFbnJpY2hlZExSKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LCBnZW5lTFIucmV0dXJuID0gRkFMU0UpCkxSLnNob3cgPC0gcGFpckxSLkNYQ0xbMSxdICMgc2hvdyBvbmUgbGlnYW5kLXJlY2VwdG9yIHBhaXIKIyBIaWVyYXJjaHkgcGxvdAp2ZXJ0ZXgucmVjZWl2ZXIgPSBzZXEoMSw0KSAjIGEgbnVtZXJpYyB2ZWN0b3IKbmV0VmlzdWFsX2luZGl2aWR1YWwoY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csICBwYWlyTFIudXNlID0gTFIuc2hvdywgdmVydGV4LnJlY2VpdmVyID0gdmVydGV4LnJlY2VpdmVyKQojPiBbWzFdXQojIENpcmNsZSBwbG90Cm5ldFZpc3VhbF9pbmRpdmlkdWFsKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LCBwYWlyTFIudXNlID0gTFIuc2hvdywgbGF5b3V0ID0gImNpcmNsZSIpCgoKCiM+IFtbMV1dCiMgQ2hvcmQgZGlhZ3JhbQpuZXRWaXN1YWxfaW5kaXZpZHVhbChjZWxsY2hhdCwgc2lnbmFsaW5nID0gcGF0aHdheXMuc2hvdywgcGFpckxSLnVzZSA9IExSLnNob3csIGxheW91dCA9ICJjaG9yZCIpCgojIEFjY2VzcyBhbGwgdGhlIHNpZ25hbGluZyBwYXRod2F5cyBzaG93aW5nIHNpZ25pZmljYW50IGNvbW11bmljYXRpb25zCnBhdGh3YXlzLnNob3cuYWxsIDwtIGNlbGxjaGF0QG5ldFAkcGF0aHdheXMKIyBjaGVjayB0aGUgb3JkZXIgb2YgY2VsbCBpZGVudGl0eSB0byBzZXQgc3VpdGFibGUgdmVydGV4LnJlY2VpdmVyCmxldmVscyhjZWxsY2hhdEBpZGVudHMpCnZlcnRleC5yZWNlaXZlciA9IHNlcSgxLDQpCmZvciAoaSBpbiAxOmxlbmd0aChwYXRod2F5cy5zaG93LmFsbCkpIHsKICAjIFZpc3VhbGl6ZSBjb21tdW5pY2F0aW9uIG5ldHdvcmsgYXNzb2NpYXRlZCB3aXRoIGJvdGggc2lnbmFsaW5nIHBhdGh3YXkgYW5kIGluZGl2aWR1YWwgTC1SIHBhaXJzCiAgbmV0VmlzdWFsKGNlbGxjaGF0LCBzaWduYWxpbmcgPSBwYXRod2F5cy5zaG93LmFsbFtpXSwgdmVydGV4LnJlY2VpdmVyID0gdmVydGV4LnJlY2VpdmVyLCBsYXlvdXQgPSAiaGllcmFyY2h5IikKICAjIENvbXB1dGUgYW5kIHZpc3VhbGl6ZSB0aGUgY29udHJpYnV0aW9uIG9mIGVhY2ggbGlnYW5kLXJlY2VwdG9yIHBhaXIgdG8gdGhlIG92ZXJhbGwgc2lnbmFsaW5nIHBhdGh3YXkKICBnZyA8LSBuZXRBbmFseXNpc19jb250cmlidXRpb24oY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3cuYWxsW2ldKQogIGdnc2F2ZShmaWxlbmFtZT1wYXN0ZTAocGF0aHdheXMuc2hvdy5hbGxbaV0sICJfTC1SX2NvbnRyaWJ1dGlvbi5wZGYiKSwgcGxvdD1nZywgd2lkdGggPSAzLCBoZWlnaHQgPSAyLCB1bml0cyA9ICdpbicsIGRwaSA9IDMwMCkKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqKlZpc3VhbGl6ZSBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBtZWRpYXRlZCBieSBtdWx0aXBsZSBsaWdhbmQtcmVjZXB0b3JzIG9yIHNpZ25hbGluZyBwYXRod2F5cyoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMoQSkgQnViYmxlIHBsb3QKCiMgKDEpIHNob3cgYWxsIHRoZSBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMgKEwtUiBwYWlycykgZnJvbSBzb21lIGNlbGwgZ3JvdXBzIChkZWZpbmVkIGJ5ICdzb3VyY2VzLnVzZScpIHRvIG90aGVyIGNlbGwgZ3JvdXBzIChkZWZpbmVkIGJ5ICd0YXJnZXRzLnVzZScpCm5ldFZpc3VhbF9idWJibGUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gNCwgdGFyZ2V0cy51c2UgPSBjKDU6MTEpLCByZW1vdmUuaXNvbGF0ZSA9IEZBTFNFKQojPiBDb21wYXJpbmcgY29tbXVuaWNhdGlvbnMgb24gYSBzaW5nbGUgb2JqZWN0CgoKCiMgKDIpIHNob3cgYWxsIHRoZSBzaWduaWZpY2FudCBpbnRlcmFjdGlvbnMgKEwtUiBwYWlycykgYXNzb2NpYXRlZCB3aXRoIGNlcnRhaW4gc2lnbmFsaW5nIHBhdGh3YXlzCm5ldFZpc3VhbF9idWJibGUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gNCwgdGFyZ2V0cy51c2UgPSBjKDU6MTEpLCBzaWduYWxpbmcgPSBjKCJDQ0wiLCJDWENMIiksIHJlbW92ZS5pc29sYXRlID0gRkFMU0UpCiM+IENvbXBhcmluZyBjb21tdW5pY2F0aW9ucyBvbiBhIHNpbmdsZSBvYmplY3QKCgojICgzKSBzaG93IGFsbCB0aGUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIChMLVIgcGFpcnMpIGJhc2VkIG9uIHVzZXIncyBpbnB1dCAoZGVmaW5lZCBieSBgcGFpckxSLnVzZWApCnBhaXJMUi51c2UgPC0gZXh0cmFjdEVucmljaGVkTFIoY2VsbGNoYXQsIHNpZ25hbGluZyA9IGMoIkNDTCIsIkNYQ0wiLCJGR0YiKSkKbmV0VmlzdWFsX2J1YmJsZShjZWxsY2hhdCwgc291cmNlcy51c2UgPSBjKDMsNCksIHRhcmdldHMudXNlID0gYyg1OjgpLCBwYWlyTFIudXNlID0gcGFpckxSLnVzZSwgcmVtb3ZlLmlzb2xhdGUgPSBUUlVFKQojPiBDb21wYXJpbmcgY29tbXVuaWNhdGlvbnMgb24gYSBzaW5nbGUgb2JqZWN0CgoKIyAoQikgQ2hvcmQgZGlhZ3JhbQoKIyBzaG93IGFsbCB0aGUgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb25zIChMLVIgcGFpcnMpIGZyb20gc29tZSBjZWxsIGdyb3VwcyAoZGVmaW5lZCBieSAnc291cmNlcy51c2UnKSB0byBvdGhlciBjZWxsIGdyb3VwcyAoZGVmaW5lZCBieSAndGFyZ2V0cy51c2UnKQojIHNob3cgYWxsIHRoZSBpbnRlcmFjdGlvbnMgc2VuZGluZyBmcm9tIEluZmxhbS5GSUIKbmV0VmlzdWFsX2Nob3JkX2dlbmUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gNCwgdGFyZ2V0cy51c2UgPSBjKDU6MTEpLCBsYWIuY2V4ID0gMC41LGxlZ2VuZC5wb3MueSA9IDMwKQoKCiMgc2hvdyBhbGwgdGhlIGludGVyYWN0aW9ucyByZWNlaXZlZCBieSBJbmZsYW0uREMKbmV0VmlzdWFsX2Nob3JkX2dlbmUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gYygxLDIsMyw0KSwgdGFyZ2V0cy51c2UgPSA4LCBsZWdlbmQucG9zLnggPSAxNSkKCiMgc2hvdyBhbGwgdGhlIHNpZ25pZmljYW50IGludGVyYWN0aW9ucyAoTC1SIHBhaXJzKSBhc3NvY2lhdGVkIHdpdGggY2VydGFpbiBzaWduYWxpbmcgcGF0aHdheXMKbmV0VmlzdWFsX2Nob3JkX2dlbmUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gYygxLDIsMyw0KSwgdGFyZ2V0cy51c2UgPSBjKDU6MTEpLCBzaWduYWxpbmcgPSBjKCJDQ0wiLCJDWENMIiksbGVnZW5kLnBvcy54ID0gOCkKCiMgc2hvdyBhbGwgdGhlIHNpZ25pZmljYW50IHNpZ25hbGluZyBwYXRod2F5cyBmcm9tIHNvbWUgY2VsbCBncm91cHMgKGRlZmluZWQgYnkgJ3NvdXJjZXMudXNlJykgdG8gb3RoZXIgY2VsbCBncm91cHMgKGRlZmluZWQgYnkgJ3RhcmdldHMudXNlJykKbmV0VmlzdWFsX2Nob3JkX2dlbmUoY2VsbGNoYXQsIHNvdXJjZXMudXNlID0gYygxLDIsMyw0KSwgdGFyZ2V0cy51c2UgPSBjKDU6MTEpLCBzbG90Lm5hbWUgPSAibmV0UCIsIGxlZ2VuZC5wb3MueCA9IDEwKQoKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipQbG90IHRoZSBzaWduYWxpbmcgZ2VuZSBleHByZXNzaW9uIGRpc3RyaWJ1dGlvbiB1c2luZyB2aW9saW4vZG90IHBsb3QqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKcGxvdEdlbmVFeHByZXNzaW9uKGNlbGxjaGF0LCBzaWduYWxpbmcgPSAiQ1hDTCIsIGVucmljaGVkLm9ubHkgPSBUUlVFLCB0eXBlID0gInZpb2xpbiIpCgoKcGxvdEdlbmVFeHByZXNzaW9uKGNlbGxjaGF0LCBzaWduYWxpbmcgPSAiQ1hDTCIsIGVucmljaGVkLm9ubHkgPSBGQUxTRSkKCmBgYAoKIyA2LiBTeXN0ZW1zIGFuYWx5c2lzIG9mIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsKYGBge3IgU1lTVEVNUy1BTkFMWVNJUywgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTB9CiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipQYXJ0IElWOiBTeXN0ZW1zIGFuYWx5c2lzIG9mIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsqKgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIChBKSBDb21wdXRlIGFuZCB2aXN1YWxpemUgdGhlIG5ldHdvcmsgY2VudHJhbGl0eSBzY29yZXMKCnB0bSA9IFN5cy50aW1lKCkKIyBDb21wdXRlIHRoZSBuZXR3b3JrIGNlbnRyYWxpdHkgc2NvcmVzCmNlbGxjaGF0IDwtIG5ldEFuYWx5c2lzX2NvbXB1dGVDZW50cmFsaXR5KGNlbGxjaGF0LCBzbG90Lm5hbWUgPSAibmV0UCIpICMgdGhlIHNsb3QgJ25ldFAnIG1lYW5zIHRoZSBpbmZlcnJlZCBpbnRlcmNlbGx1bGFyIGNvbW11bmljYXRpb24gbmV0d29yayBvZiBzaWduYWxpbmcgcGF0aHdheXMKIyBWaXN1YWxpemUgdGhlIGNvbXB1dGVkIGNlbnRyYWxpdHkgc2NvcmVzIHVzaW5nIGhlYXRtYXAsIGFsbG93aW5nIHJlYWR5IGlkZW50aWZpY2F0aW9uIG9mIG1ham9yIHNpZ25hbGluZyByb2xlcyBvZiBjZWxsIGdyb3VwcwpuZXRBbmFseXNpc19zaWduYWxpbmdSb2xlX25ldHdvcmsoY2VsbGNoYXQsIHNpZ25hbGluZyA9IHBhdGh3YXlzLnNob3csIHdpZHRoID0gOCwgaGVpZ2h0ID0gMi41LCBmb250LnNpemUgPSAxMCkKCgojKEIpIFZpc3VhbGl6ZSBkb21pbmFudCBzZW5kZXJzIChzb3VyY2VzKSBhbmQgcmVjZWl2ZXJzICh0YXJnZXRzKSBpbiBhIDJEIHNwYWNlCgojIFNpZ25hbGluZyByb2xlIGFuYWx5c2lzIG9uIHRoZSBhZ2dyZWdhdGVkIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsgZnJvbSBhbGwgc2lnbmFsaW5nIHBhdGh3YXlzCmdnMSA8LSBuZXRBbmFseXNpc19zaWduYWxpbmdSb2xlX3NjYXR0ZXIoY2VsbGNoYXQpCiM+IFNpZ25hbGluZyByb2xlIGFuYWx5c2lzIG9uIHRoZSBhZ2dyZWdhdGVkIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmsgZnJvbSBhbGwgc2lnbmFsaW5nIHBhdGh3YXlzCiMgU2lnbmFsaW5nIHJvbGUgYW5hbHlzaXMgb24gdGhlIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmtzIG9mIGludGVyZXN0CmdnMiA8LSBuZXRBbmFseXNpc19zaWduYWxpbmdSb2xlX3NjYXR0ZXIoY2VsbGNoYXQsIHNpZ25hbGluZyA9IGMoIkNYQ0wiLCAiQ0NMIikpCiM+IFNpZ25hbGluZyByb2xlIGFuYWx5c2lzIG9uIHRoZSBjZWxsLWNlbGwgY29tbXVuaWNhdGlvbiBuZXR3b3JrIGZyb20gdXNlcidzIGlucHV0CmdnMSArIGdnMgoKCiMgKEMpIElkZW50aWZ5IHNpZ25hbHMgY29udHJpYnV0aW5nIHRoZSBtb3N0IHRvIG91dGdvaW5nIG9yIGluY29taW5nIHNpZ25hbGluZyBvZiBjZXJ0YWluIGNlbGwgZ3JvdXBzCiMgU2lnbmFsaW5nIHJvbGUgYW5hbHlzaXMgb24gdGhlIGFnZ3JlZ2F0ZWQgY2VsbC1jZWxsIGNvbW11bmljYXRpb24gbmV0d29yayBmcm9tIGFsbCBzaWduYWxpbmcgcGF0aHdheXMKaHQxIDwtIG5ldEFuYWx5c2lzX3NpZ25hbGluZ1JvbGVfaGVhdG1hcChjZWxsY2hhdCwgcGF0dGVybiA9ICJvdXRnb2luZyIpCmh0MiA8LSBuZXRBbmFseXNpc19zaWduYWxpbmdSb2xlX2hlYXRtYXAoY2VsbGNoYXQsIHBhdHRlcm4gPSAiaW5jb21pbmciKQpodDEgKyBodDIKCiMgU2lnbmFsaW5nIHJvbGUgYW5hbHlzaXMgb24gdGhlIGNlbGwtY2VsbCBjb21tdW5pY2F0aW9uIG5ldHdvcmtzIG9mIGludGVyZXN0Cmh0IDwtIG5ldEFuYWx5c2lzX3NpZ25hbGluZ1JvbGVfaGVhdG1hcChjZWxsY2hhdCwgc2lnbmFsaW5nID0gYygiQ1hDTCIsICJDQ0wiKSkKCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKipJZGVudGlmeSBnbG9iYWwgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyB0byBleHBsb3JlIGhvdyBtdWx0aXBsZSBjZWxsIHR5cGVzIGFuZCBzaWduYWxpbmcgcGF0aHdheXMgY29vcmRpbmF0ZSB0b2dldGhlcioqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIChBKSBJZGVudGlmeSBhbmQgdmlzdWFsaXplIG91dGdvaW5nIGNvbW11bmljYXRpb24gcGF0dGVybiBvZiBzZWNyZXRpbmcgY2VsbHMKCmxpYnJhcnkoTk1GKQojPiBMb2FkaW5nIHJlcXVpcmVkIHBhY2thZ2U6IHJlZ2lzdHJ5CiM+IExvYWRpbmcgcmVxdWlyZWQgcGFja2FnZTogcm5ndG9vbHMKIz4gTG9hZGluZyByZXF1aXJlZCBwYWNrYWdlOiBjbHVzdGVyCiM+IE5NRiAtIEJpb0NvbmR1Y3RvciBsYXllciBbT0tdIHwgU2hhcmVkIG1lbW9yeSBjYXBhYmlsaXRpZXMgW05POiBiaWdtZW1vcnldIHwgQ29yZXMgMi8yCiM+ICAgVG8gZW5hYmxlIHNoYXJlZCBtZW1vcnkgY2FwYWJpbGl0aWVzLCB0cnk6IGluc3RhbGwuZXh0cmFzKCcKIz4gTk1GCiM+ICcpCiM+IAojPiBBdHRhY2hpbmcgcGFja2FnZTogJ05NRicKIz4gVGhlIGZvbGxvd2luZyBvYmplY3RzIGFyZSBtYXNrZWQgZnJvbSAncGFja2FnZTppZ3JhcGgnOgojPiAKIz4gICAgIGFsZ29yaXRobSwgY29tcGFyZQpsaWJyYXJ5KGdnYWxsdXZpYWwpCgoKc2V0d2QoIi4uL1NTX0NlbGxMaW5lc19QaXBlbGluZS8iKQpzZWxlY3RLKGNlbGxjaGF0LCBwYXR0ZXJuID0gIm91dGdvaW5nIikKCgpuUGF0dGVybnMgPSA2CgpjZWxsY2hhdCA8LSBpZGVudGlmeUNvbW11bmljYXRpb25QYXR0ZXJucyhjZWxsY2hhdCwgcGF0dGVybiA9ICJvdXRnb2luZyIsIGsgPSBuUGF0dGVybnMpCgoKIyByaXZlciBwbG90Cm5ldEFuYWx5c2lzX3JpdmVyKGNlbGxjaGF0LCBwYXR0ZXJuID0gIm91dGdvaW5nIikKIz4gUGxlYXNlIG1ha2Ugc3VyZSB5b3UgaGF2ZSBsb2FkIGBsaWJyYXJ5KGdnYWxsdXZpYWwpYCB3aGVuIHJ1bm5pbmcgdGhpcyBmdW5jdGlvbgoKCiMgZG90IHBsb3QKbmV0QW5hbHlzaXNfZG90KGNlbGxjaGF0LCBwYXR0ZXJuID0gIm91dGdvaW5nIikKCnNldHdkKCIuIikKCiMgKEIpIElkZW50aWZ5IGFuZCB2aXN1YWxpemUgaW5jb21pbmcgY29tbXVuaWNhdGlvbiBwYXR0ZXJuIG9mIHRhcmdldCBjZWxscwoKc2VsZWN0SyhjZWxsY2hhdCwgcGF0dGVybiA9ICJpbmNvbWluZyIpCgoKCiBuUGF0dGVybnMgPSAzCmNlbGxjaGF0IDwtIGlkZW50aWZ5Q29tbXVuaWNhdGlvblBhdHRlcm5zKGNlbGxjaGF0LCBwYXR0ZXJuID0gImluY29taW5nIiwgayA9IG5QYXR0ZXJucykKCgojIHJpdmVyIHBsb3QKbmV0QW5hbHlzaXNfcml2ZXIoY2VsbGNoYXQsIHBhdHRlcm4gPSAiaW5jb21pbmciKQojPiBQbGVhc2UgbWFrZSBzdXJlIHlvdSBoYXZlIGxvYWQgYGxpYnJhcnkoZ2dhbGx1dmlhbClgIHdoZW4gcnVubmluZyB0aGlzIGZ1bmN0aW9uCgoKIyBkb3QgcGxvdApuZXRBbmFseXNpc19kb3QoY2VsbGNoYXQsIHBhdHRlcm4gPSAiaW5jb21pbmciKQoKCgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICoqTWFuaWZvbGQgYW5kIGNsYXNzaWZpY2F0aW9uIGxlYXJuaW5nIGFuYWx5c2lzIG9mIHNpZ25hbGluZyBuZXR3b3JrcyoqCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIElkZW50aWZ5IHNpZ25hbGluZyBncm91cHMgYmFzZWQgb24gdGhlaXIgZnVuY3Rpb25hbCBzaW1pbGFyaXR5CiM4LiAgSWRlbnRpZnkgc2lnbmFsaW5nIHJvbGVzIGFuZCBwYXR0ZXJucwpjZWxsY2hhdCA8LSBjb21wdXRlTmV0U2ltaWxhcml0eShjZWxsY2hhdCwgdHlwZSA9ICJmdW5jdGlvbmFsIikKbGlicmFyeSh1d290KQpjZWxsY2hhdCA8LSBuZXRFbWJlZGRpbmcoY2VsbGNoYXQsIHR5cGUgPSAiZnVuY3Rpb25hbCIsIHVtYXAubWV0aG9kID0gInV3b3QiKQpvcHRpb25zKGZ1dHVyZS5nbG9iYWxzLm1heFNpemUgPSAxNjAwMCAqIDEwMjReMikgICMgU2V0IHRvIDE2IEdCCmNlbGxjaGF0IDwtIG5ldENsdXN0ZXJpbmcoY2VsbGNoYXQsIHR5cGUgPSAiZnVuY3Rpb25hbCIsIGRvLnBhcmFsbGVsID0gRkFMU0UpCm5ldFZpc3VhbF9lbWJlZGRpbmcoY2VsbGNoYXQsIHR5cGUgPSAiZnVuY3Rpb25hbCIsIGxhYmVsLnNpemUgPSAzLjUpCgojIElkZW50aWZ5IHNpZ25hbGluZyBncm91cHMgYmFzZWQgb24gc3RydWN0dXJlIHNpbWlsYXJpdHkKI2luc3RhbGwgdW1hcC1sZWFybiBiZWZvcmUgcnVubmluZyB0aGVzZSBjb21tYW5kcwogI3BpcCBpbnN0YWxsIHVtYXAtbGVhcm4KY2VsbGNoYXQgPC0gY29tcHV0ZU5ldFNpbWlsYXJpdHkoY2VsbGNoYXQsIHR5cGUgPSAic3RydWN0dXJhbCIpCmNlbGxjaGF0IDwtIG5ldEVtYmVkZGluZyhjZWxsY2hhdCwgdHlwZSA9ICJzdHJ1Y3R1cmFsIiwgdW1hcC5tZXRob2QgPSAidXdvdCIpCiM+IE1hbmlmb2xkIGxlYXJuaW5nIG9mIHRoZSBzaWduYWxpbmcgbmV0d29ya3MgZm9yIGEgc2luZ2xlIGRhdGFzZXQKb3B0aW9ucyhmdXR1cmUuZ2xvYmFscy5tYXhTaXplID0gMTYwMDAgKiAxMDI0XjIpICAjIFNldCB0byAxNiBHQgpjZWxsY2hhdCA8LSBuZXRDbHVzdGVyaW5nKGNlbGxjaGF0LCB0eXBlID0gInN0cnVjdHVyYWwiLCBkby5wYXJhbGxlbCA9IEZBTFNFKQojPiBDbGFzc2lmaWNhdGlvbiBsZWFybmluZyBvZiB0aGUgc2lnbmFsaW5nIG5ldHdvcmtzIGZvciBhIHNpbmdsZSBkYXRhc2V0CiMgVmlzdWFsaXphdGlvbiBpbiAyRC1zcGFjZQpuZXRWaXN1YWxfZW1iZWRkaW5nKGNlbGxjaGF0LCB0eXBlID0gInN0cnVjdHVyYWwiLCBsYWJlbC5zaXplID0gMy41KQoKCm5ldFZpc3VhbF9lbWJlZGRpbmdab29tSW4oY2VsbGNoYXQsIHR5cGUgPSAic3RydWN0dXJhbCIsIG5Db2wgPSAyKQoKYGBgCiMgNy4gU2F2ZSB0aGUgQ2VsbENoYXQgb2JqZWN0CmBgYHtyIFNBVkUtQ0VMTENIQVQsIGV2YWwgPSBGQUxTRX0KCgpzYXZlKGNlbGxjaGF0LCBmaWxlID0gImNlbGxDSEFUX0FuYWx5c2lzX0FsbF9zYW1wbGVzX01lcmdlZC5Sb2JqIikKCmBgYAo=