This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

ASSIGNMENT 2 GROUP 1 MEMBERS: 1)INGEET PAL 2)ANUSKA SARKAR 3)ANTIK ROY 4)NANDINI SAHA 5)AVIK BHUIN

Part A: Dataset Selection

  1. What is the NCBI GEO database?

The NCBI Gene Expression Omnibus (GEO) is a public functional genomics data repository that stores high-throughput gene expression data, including microarray and RNA-seq. Researchers deposit their data here so that others can access, re-analyze, and reproduce studies. It includes tools for visualization and downloading of data.

  1. What is the GEO Series ID (e.g., GSEXXXXX) of the dataset you chose?

GSE171110 – This is a publicly available RNA-seq dataset titled:

“RNA-seq of whole blood from COVID-19 patients with different severity and healthy controls”

  1. Explain the experiment and the dataset and why did you choose it?

This dataset comes from an RNA-seq experiment comparing blood transcriptomes of COVID-19 patients with mild, moderate, or severe disease, and healthy controls. It aims to understand how gene expression varies with disease severity, which could uncover immune-related gene changes and potential biomarkers.

Why this dataset?

Timely and relevant to global health. Clearly defined groups (mild, moderate, severe, control). Human blood RNA-seq, commonly studied tissue. Available count data and metadata.

  1. What are the number of different groups in the dataset?

There are 4 different groups:

Healthy controls Mild COVID-19 Moderate COVID-19 Severe COVID-19

#install.packages("BiocManager") 
#BiocManager::install("DESeq2")

library(DESeq2)
library(ggplot2)
library(dplyr)

Part B: Loading dataset and DESeq2 1) Download the raw count matrix from the GEO page. Downloadable in .tsv, .csv or .txt formats.

count_data <- read.delim("GSE171110_Data_RNAseq_raw_counts_geo.txt")
  1. Download the metadata for the dataset (has the information about the different columns). Read the associated paper if required.
metadata<-read.delim("GSE171110_series_matrix.txt")
  1. Display the structure and first 10 columns of the dataset.
str(count_data)
head(count_data, 10)
str(metadata)
head(metadata, 10)
  1. Create a Data Frame for Two Conditions For this analysis, we’ll focus on two conditions: “Healthy” and “Severe”.
# Filter metadata for selected conditions
metadata_filtered <- metadata[metadata$condition %in% c("Healthy", "Severe"), ]

# Subset count data based on filtered metadata
count_data_filtered <- count_data[, rownames(metadata_filtered)]
  1. Pre-process the Dataset for DESeq2
# Ensure count data is in integer format
count_data_filtered <- round(count_data_filtered)

# Create DESeqDataSet
dds <- DESeq2DataSetFromMatrix(countData = count_data_filtered,
                              colData = metadata_filtered,
                              design = ~ condition)
Error in DESeq2DataSetFromMatrix(countData = count_data_filtered, colData = metadata_filtered,  : 
  could not find function "DESeq2DataSetFromMatrix"
  1. Run DESeq2 and Display Results
# Run DESeq2 analysis
dds <- DESeq2(dds)

# Get results
res <- results(dds)

# Display summary
summary(res)

Part C: Analysis and Results 1) How many genes were found to be significantly differentially expressed (adjusted p-value < 0.05)?

# Filter for significant genes
sig_genes <- res[which(res$padj < 0.05), ]

# Number of significant genes
nrow(sig_genes)
  1. List 5 upregulated and 5 downregulated genes
# Sort by log2FoldChange
res_ordered <- res[order(res$log2FoldChange, decreasing = TRUE), ]

# Upregulated genes (log2FC > 1)
head(res_ordered[res_ordered$padj < 0.05 & res_ordered$log2FoldChange > 1, c("log2FoldChange", "padj")], 5)

# Downregulated genes (log2FC < -1)
tail(res_ordered[res_ordered$padj < 0.05 & res_ordered$log2FoldChange < -1, c("log2FoldChange", "padj")], 5)
  1. Choose 3 interesting DE genes and describe their functions

ISG15 (Upregulated) Function: Interferon-stimulated gene involved in antiviral defense. Relevance: Overexpressed in response to viral infections; helps modulate immune responses in COVID-19.

HBB (Downregulated) Function: Encodes the beta subunit of hemoglobin. Relevance: Its downregulation may reflect systemic inflammation or blood cell abnormalities seen in severe COVID-19.

OAS1 (Upregulated) Function: Activates RNase L to degrade viral RNA. Relevance: Known to be protective in COVID-19; some polymorphisms linked to better outcomes.

  1. Include and describe a PCA plot
vsd <- vst(dds, blind=FALSE)
plotPCA(vsd, intgroup="condition")
  1. Display a volcano plot
# Load libraries
library(ggplot2)
# Volcano plot with ggplot2
ggplot(result.DEG, aes(x = log2FoldChange, y = (-log10(padj)))) +
geom_point(alpha = 0.6, size = 1.8) +
scale_color_manual(values = c("grey", "red")) +
theme_minimal() +
labs(title = "Volcano Plot", x = "log2 Fold Change", y = "-log10(p-value)") +
theme(legend.title = element_blank())

Part D: Interpretation 1) What challenges or issues did you encounter during the analysis?

Data formatting: GEO data often comes in different formats; aligning sample names between metadata and count matrix can be tricky.

Metadata clarity: Sometimes the condition labels aren’t consistent or well-documented, requiring you to dig into the associated publication.

Batch effects or noise: Especially in clinical datasets (like COVID-19), patient variability can introduce noise.

Filtering decisions: Choosing thresholds for fold change or p-values can be subjective and influence results.

Initially, packages took time to download and load into R.

  1. What assumptions does DESeq2 make about RNA-seq count data? DESeq2 is built on several key assumptions:

Negative binomial distribution: It assumes that count data for each gene follows a negative binomial distribution, which accounts for overdispersion.

No need for prior normalization: DESeq2 normalizes internally using size factors based on the median-of-ratios method.

Majority of genes are not differentially expressed: This assumption allows it to estimate dispersion and size factors more robustly.

  1. What are some limitations of using only DESeq2 for analysis, and what other tools might complement it? Limitations of DESeq2: Focused solely on differential expression — it doesn’t capture splicing, transcript-level, or gene set/pathway analysis.

May not perform well with very small sample sizes.

Doesn’t model batch effects automatically (you need to include them manually in the design formula).

Complementary tools: edgeR or limma – Alternative DE tools with different normalization/statistical approaches.

Sleuth or Salmon + DESeq2 – For transcript-level quantification.

Gene Set Enrichment Analysis (GSEA) – For understanding biological pathways.

clusterProfiler, GOseq – For functional enrichment (GO, KEGG).

Combat or sva – To remove batch effects.

MAST or Seurat – For single-cell RNA-seq data.

Contributions: 1)INGEET PAL: Part B Questions 3-6 2)ANUSKA SARKAR: Part A and Part B Question 1-2 3)ANTIK ROY: Part C Questions 1-3 4)NANDINI SAHA: Part C Questions 4-5 and Part D 5)AVIK BHUIN: Part D

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KDQpBU1NJR05NRU5UIDINCkdST1VQIDENCk1FTUJFUlM6DQoxKUlOR0VFVCBQQUwNCjIpQU5VU0tBIFNBUktBUg0KMylBTlRJSyBST1kNCjQpTkFORElOSSBTQUhBDQo1KUFWSUsgQkhVSU4NCg0KUGFydCBBOiBEYXRhc2V0IFNlbGVjdGlvbg0KDQoxLiBXaGF0IGlzIHRoZSBOQ0JJIEdFTyBkYXRhYmFzZT8NCg0KVGhlIE5DQkkgR2VuZSBFeHByZXNzaW9uIE9tbmlidXMgKEdFTykgaXMgYSBwdWJsaWMgZnVuY3Rpb25hbCBnZW5vbWljcyBkYXRhIHJlcG9zaXRvcnkgdGhhdCBzdG9yZXMgaGlnaC10aHJvdWdocHV0IGdlbmUgZXhwcmVzc2lvbiBkYXRhLCBpbmNsdWRpbmcgbWljcm9hcnJheSBhbmQgUk5BLXNlcS4gUmVzZWFyY2hlcnMgZGVwb3NpdCB0aGVpciBkYXRhIGhlcmUgc28gdGhhdCBvdGhlcnMgY2FuIGFjY2VzcywgcmUtYW5hbHl6ZSwgYW5kIHJlcHJvZHVjZSBzdHVkaWVzLiBJdCBpbmNsdWRlcyB0b29scyBmb3IgdmlzdWFsaXphdGlvbiBhbmQgZG93bmxvYWRpbmcgb2YgZGF0YS4NCg0KMi4gV2hhdCBpcyB0aGUgR0VPIFNlcmllcyBJRCAoZS5nLiwgR1NFWFhYWFgpIG9mIHRoZSBkYXRhc2V0IHlvdSBjaG9zZT8NCg0KR1NFMTcxMTEwIOKAkyBUaGlzIGlzIGEgcHVibGljbHkgYXZhaWxhYmxlIFJOQS1zZXEgZGF0YXNldCB0aXRsZWQ6DQoNCuKAnFJOQS1zZXEgb2Ygd2hvbGUgYmxvb2QgZnJvbSBDT1ZJRC0xOSBwYXRpZW50cyB3aXRoIGRpZmZlcmVudCBzZXZlcml0eSBhbmQgaGVhbHRoeSBjb250cm9sc+KAnQ0KDQozLiBFeHBsYWluIHRoZSBleHBlcmltZW50IGFuZCB0aGUgZGF0YXNldCBhbmQgd2h5IGRpZCB5b3UgY2hvb3NlIGl0Pw0KDQpUaGlzIGRhdGFzZXQgY29tZXMgZnJvbSBhbiBSTkEtc2VxIGV4cGVyaW1lbnQgY29tcGFyaW5nIGJsb29kIHRyYW5zY3JpcHRvbWVzIG9mIENPVklELTE5IHBhdGllbnRzIHdpdGggbWlsZCwgbW9kZXJhdGUsIG9yIHNldmVyZSBkaXNlYXNlLCBhbmQgaGVhbHRoeSBjb250cm9scy4gSXQgYWltcyB0byB1bmRlcnN0YW5kIGhvdyBnZW5lIGV4cHJlc3Npb24gdmFyaWVzIHdpdGggZGlzZWFzZSBzZXZlcml0eSwgd2hpY2ggY291bGQgdW5jb3ZlciBpbW11bmUtcmVsYXRlZCBnZW5lIGNoYW5nZXMgYW5kIHBvdGVudGlhbCBiaW9tYXJrZXJzLg0KDQpXaHkgdGhpcyBkYXRhc2V0Pw0KDQpUaW1lbHkgYW5kIHJlbGV2YW50IHRvIGdsb2JhbCBoZWFsdGguDQpDbGVhcmx5IGRlZmluZWQgZ3JvdXBzIChtaWxkLCBtb2RlcmF0ZSwgc2V2ZXJlLCBjb250cm9sKS4NCkh1bWFuIGJsb29kIFJOQS1zZXEsIGNvbW1vbmx5IHN0dWRpZWQgdGlzc3VlLg0KQXZhaWxhYmxlIGNvdW50IGRhdGEgYW5kIG1ldGFkYXRhLg0KDQo0LiBXaGF0IGFyZSB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBncm91cHMgaW4gdGhlIGRhdGFzZXQ/DQoNClRoZXJlIGFyZSA0IGRpZmZlcmVudCBncm91cHM6DQoNCkhlYWx0aHkgY29udHJvbHMNCk1pbGQgQ09WSUQtMTkNCk1vZGVyYXRlIENPVklELTE5DQpTZXZlcmUgQ09WSUQtMTkNCg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygiQmlvY01hbmFnZXIiKSANCiNCaW9jTWFuYWdlcjo6aW5zdGFsbCgiREVTZXEyIikNCg0KbGlicmFyeShERVNlcTIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNClBhcnQgQjogTG9hZGluZyBkYXRhc2V0IGFuZCBERVNlcTINCjEpIERvd25sb2FkIHRoZSByYXcgY291bnQgbWF0cml4IGZyb20gdGhlIEdFTyBwYWdlLiBEb3dubG9hZGFibGUgaW4gLnRzdiwgLmNzdg0Kb3IgLnR4dCBmb3JtYXRzLg0KYGBge3J9DQpjb3VudF9kYXRhIDwtIHJlYWQuZGVsaW0oIkdTRTE3MTExMF9EYXRhX1JOQXNlcV9yYXdfY291bnRzX2dlby50eHQiKQ0KYGBgDQoNCjIpIERvd25sb2FkIHRoZSBtZXRhZGF0YSBmb3IgdGhlIGRhdGFzZXQgKGhhcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpZmZlcmVudA0KY29sdW1ucykuIFJlYWQgdGhlIGFzc29jaWF0ZWQgcGFwZXIgaWYgcmVxdWlyZWQuDQpgYGB7cn0NCm1ldGFkYXRhPC1yZWFkLmRlbGltKCJHU0UxNzExMTBfc2VyaWVzX21hdHJpeC50eHQiKQ0KYGBgDQoNCjMpIERpc3BsYXkgdGhlIHN0cnVjdHVyZSBhbmQgZmlyc3QgMTAgY29sdW1ucyBvZiB0aGUgZGF0YXNldC4NCmBgYHtyfQ0Kc3RyKGNvdW50X2RhdGEpDQpoZWFkKGNvdW50X2RhdGEsIDEwKQ0Kc3RyKG1ldGFkYXRhKQ0KaGVhZChtZXRhZGF0YSwgMTApDQpgYGANCg0KNC4gQ3JlYXRlIGEgRGF0YSBGcmFtZSBmb3IgVHdvIENvbmRpdGlvbnMNCkZvciB0aGlzIGFuYWx5c2lzLCB3ZSdsbCBmb2N1cyBvbiB0d28gY29uZGl0aW9uczogIkhlYWx0aHkiIGFuZCAiU2V2ZXJlIi4gDQpgYGB7cn0NCiMgRmlsdGVyIG1ldGFkYXRhIGZvciBzZWxlY3RlZCBjb25kaXRpb25zDQptZXRhZGF0YV9maWx0ZXJlZCA8LSBtZXRhZGF0YVttZXRhZGF0YSRjb25kaXRpb24gJWluJSBjKCJIZWFsdGh5IiwgIlNldmVyZSIpLCBdDQoNCiMgU3Vic2V0IGNvdW50IGRhdGEgYmFzZWQgb24gZmlsdGVyZWQgbWV0YWRhdGENCmNvdW50X2RhdGFfZmlsdGVyZWQgPC0gY291bnRfZGF0YVssIHJvd25hbWVzKG1ldGFkYXRhX2ZpbHRlcmVkKV0NCmBgYA0KDQo1LiBQcmUtcHJvY2VzcyB0aGUgRGF0YXNldCBmb3IgREVTZXEyDQpgYGB7cn0NCiMgRW5zdXJlIGNvdW50IGRhdGEgaXMgaW4gaW50ZWdlciBmb3JtYXQNCmNvdW50X2RhdGFfZmlsdGVyZWQgPC0gcm91bmQoY291bnRfZGF0YV9maWx0ZXJlZCkNCg0KIyBDcmVhdGUgREVTZXFEYXRhU2V0DQpkZHMgPC0gREVTZXEyRGF0YVNldEZyb21NYXRyaXgoY291bnREYXRhID0gY291bnRfZGF0YV9maWx0ZXJlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEgPSBtZXRhZGF0YV9maWx0ZXJlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lnbiA9IH4gY29uZGl0aW9uKQ0KYGBgDQoNCjYuIFJ1biBERVNlcTIgYW5kIERpc3BsYXkgUmVzdWx0cw0KYGBge3J9DQojIFJ1biBERVNlcTIgYW5hbHlzaXMNCmRkcyA8LSBERVNlcTIoZGRzKQ0KDQojIEdldCByZXN1bHRzDQpyZXMgPC0gcmVzdWx0cyhkZHMpDQoNCiMgRGlzcGxheSBzdW1tYXJ5DQpzdW1tYXJ5KHJlcykNCmBgYA0KDQpQYXJ0IEM6IEFuYWx5c2lzIGFuZCBSZXN1bHRzDQoxKSBIb3cgbWFueSBnZW5lcyB3ZXJlIGZvdW5kIHRvIGJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkIChhZGp1c3RlZCBwLXZhbHVlIDwgMC4wNSk/DQpgYGB7cn0NCiMgRmlsdGVyIGZvciBzaWduaWZpY2FudCBnZW5lcw0Kc2lnX2dlbmVzIDwtIHJlc1t3aGljaChyZXMkcGFkaiA8IDAuMDUpLCBdDQoNCiMgTnVtYmVyIG9mIHNpZ25pZmljYW50IGdlbmVzDQpucm93KHNpZ19nZW5lcykNCmBgYA0KDQoyKSBMaXN0IDUgdXByZWd1bGF0ZWQgYW5kIDUgZG93bnJlZ3VsYXRlZCBnZW5lcw0KYGBge3J9DQojIFNvcnQgYnkgbG9nMkZvbGRDaGFuZ2UNCnJlc19vcmRlcmVkIDwtIHJlc1tvcmRlcihyZXMkbG9nMkZvbGRDaGFuZ2UsIGRlY3JlYXNpbmcgPSBUUlVFKSwgXQ0KDQojIFVwcmVndWxhdGVkIGdlbmVzIChsb2cyRkMgPiAxKQ0KaGVhZChyZXNfb3JkZXJlZFtyZXNfb3JkZXJlZCRwYWRqIDwgMC4wNSAmIHJlc19vcmRlcmVkJGxvZzJGb2xkQ2hhbmdlID4gMSwgYygibG9nMkZvbGRDaGFuZ2UiLCAicGFkaiIpXSwgNSkNCg0KIyBEb3ducmVndWxhdGVkIGdlbmVzIChsb2cyRkMgPCAtMSkNCnRhaWwocmVzX29yZGVyZWRbcmVzX29yZGVyZWQkcGFkaiA8IDAuMDUgJiByZXNfb3JkZXJlZCRsb2cyRm9sZENoYW5nZSA8IC0xLCBjKCJsb2cyRm9sZENoYW5nZSIsICJwYWRqIildLCA1KQ0KYGBgDQoNCjMpIENob29zZSAzIGludGVyZXN0aW5nIERFIGdlbmVzIGFuZCBkZXNjcmliZSB0aGVpciBmdW5jdGlvbnMNCg0KSVNHMTUgKFVwcmVndWxhdGVkKQ0KRnVuY3Rpb246IEludGVyZmVyb24tc3RpbXVsYXRlZCBnZW5lIGludm9sdmVkIGluIGFudGl2aXJhbCBkZWZlbnNlLg0KUmVsZXZhbmNlOiBPdmVyZXhwcmVzc2VkIGluIHJlc3BvbnNlIHRvIHZpcmFsIGluZmVjdGlvbnM7IGhlbHBzIG1vZHVsYXRlIGltbXVuZSByZXNwb25zZXMgaW4gQ09WSUQtMTkuDQoNCkhCQiAoRG93bnJlZ3VsYXRlZCkNCkZ1bmN0aW9uOiBFbmNvZGVzIHRoZSBiZXRhIHN1YnVuaXQgb2YgaGVtb2dsb2Jpbi4NClJlbGV2YW5jZTogSXRzIGRvd25yZWd1bGF0aW9uIG1heSByZWZsZWN0IHN5c3RlbWljIGluZmxhbW1hdGlvbiBvciBibG9vZCBjZWxsIGFibm9ybWFsaXRpZXMgc2VlbiBpbiBzZXZlcmUgQ09WSUQtMTkuDQoNCk9BUzEgKFVwcmVndWxhdGVkKQ0KRnVuY3Rpb246IEFjdGl2YXRlcyBSTmFzZSBMIHRvIGRlZ3JhZGUgdmlyYWwgUk5BLg0KUmVsZXZhbmNlOiBLbm93biB0byBiZSBwcm90ZWN0aXZlIGluIENPVklELTE5OyBzb21lIHBvbHltb3JwaGlzbXMgbGlua2VkIHRvIGJldHRlciBvdXRjb21lcy4NCg0KNCkgSW5jbHVkZSBhbmQgZGVzY3JpYmUgYSBQQ0EgcGxvdA0KYGBge3J9DQp2c2QgPC0gdnN0KGRkcywgYmxpbmQ9RkFMU0UpDQpwbG90UENBKHZzZCwgaW50Z3JvdXA9ImNvbmRpdGlvbiIpDQpgYGANCg0KNSkgRGlzcGxheSBhIHZvbGNhbm8gcGxvdA0KYGBge3J9DQojIExvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpDQojIFZvbGNhbm8gcGxvdCB3aXRoIGdncGxvdDINCmdncGxvdChyZXN1bHQuREVHLCBhZXMoeCA9IGxvZzJGb2xkQ2hhbmdlLCB5ID0gKC1sb2cxMChwYWRqKSkpKSArDQpnZW9tX3BvaW50KGFscGhhID0gMC42LCBzaXplID0gMS44KSArDQpzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JleSIsICJyZWQiKSkgKw0KdGhlbWVfbWluaW1hbCgpICsNCmxhYnModGl0bGUgPSAiVm9sY2FubyBQbG90IiwgeCA9ICJsb2cyIEZvbGQgQ2hhbmdlIiwgeSA9ICItbG9nMTAocC12YWx1ZSkiKSArDQp0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpDQpgYGANCg0KUGFydCBEOiBJbnRlcnByZXRhdGlvbg0KMSkgV2hhdCBjaGFsbGVuZ2VzIG9yIGlzc3VlcyBkaWQgeW91IGVuY291bnRlciBkdXJpbmcgdGhlIGFuYWx5c2lzPw0KDQpEYXRhIGZvcm1hdHRpbmc6IEdFTyBkYXRhIG9mdGVuIGNvbWVzIGluIGRpZmZlcmVudCBmb3JtYXRzOyBhbGlnbmluZyBzYW1wbGUgbmFtZXMgYmV0d2VlbiBtZXRhZGF0YSBhbmQgY291bnQgbWF0cml4IGNhbiBiZSB0cmlja3kuDQoNCk1ldGFkYXRhIGNsYXJpdHk6IFNvbWV0aW1lcyB0aGUgY29uZGl0aW9uIGxhYmVscyBhcmVuJ3QgY29uc2lzdGVudCBvciB3ZWxsLWRvY3VtZW50ZWQsIHJlcXVpcmluZyB5b3UgdG8gZGlnIGludG8gdGhlIGFzc29jaWF0ZWQgcHVibGljYXRpb24uDQoNCkJhdGNoIGVmZmVjdHMgb3Igbm9pc2U6IEVzcGVjaWFsbHkgaW4gY2xpbmljYWwgZGF0YXNldHMgKGxpa2UgQ09WSUQtMTkpLCBwYXRpZW50IHZhcmlhYmlsaXR5IGNhbiBpbnRyb2R1Y2Ugbm9pc2UuDQoNCkZpbHRlcmluZyBkZWNpc2lvbnM6IENob29zaW5nIHRocmVzaG9sZHMgZm9yIGZvbGQgY2hhbmdlIG9yIHAtdmFsdWVzIGNhbiBiZSBzdWJqZWN0aXZlIGFuZCBpbmZsdWVuY2UgcmVzdWx0cy4NCg0KSW5pdGlhbGx5LCBwYWNrYWdlcyB0b29rIHRpbWUgdG8gZG93bmxvYWQgYW5kIGxvYWQgaW50byBSLg0KDQoyKSBXaGF0IGFzc3VtcHRpb25zIGRvZXMgREVTZXEyIG1ha2UgYWJvdXQgUk5BLXNlcSBjb3VudCBkYXRhPw0KREVTZXEyIGlzIGJ1aWx0IG9uIHNldmVyYWwga2V5IGFzc3VtcHRpb25zOg0KDQpOZWdhdGl2ZSBiaW5vbWlhbCBkaXN0cmlidXRpb246IEl0IGFzc3VtZXMgdGhhdCBjb3VudCBkYXRhIGZvciBlYWNoIGdlbmUgZm9sbG93cyBhIG5lZ2F0aXZlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbiwgd2hpY2ggYWNjb3VudHMgZm9yIG92ZXJkaXNwZXJzaW9uLg0KDQpObyBuZWVkIGZvciBwcmlvciBub3JtYWxpemF0aW9uOiBERVNlcTIgbm9ybWFsaXplcyBpbnRlcm5hbGx5IHVzaW5nIHNpemUgZmFjdG9ycyBiYXNlZCBvbiB0aGUgbWVkaWFuLW9mLXJhdGlvcyBtZXRob2QuDQoNCk1ham9yaXR5IG9mIGdlbmVzIGFyZSBub3QgZGlmZmVyZW50aWFsbHkgZXhwcmVzc2VkOiBUaGlzIGFzc3VtcHRpb24gYWxsb3dzIGl0IHRvIGVzdGltYXRlIGRpc3BlcnNpb24gYW5kIHNpemUgZmFjdG9ycyBtb3JlIHJvYnVzdGx5Lg0KDQozKSBXaGF0IGFyZSBzb21lIGxpbWl0YXRpb25zIG9mIHVzaW5nIG9ubHkgREVTZXEyIGZvciBhbmFseXNpcywgYW5kIHdoYXQgb3RoZXIgdG9vbHMgbWlnaHQgY29tcGxlbWVudCBpdD8NCkxpbWl0YXRpb25zIG9mIERFU2VxMjoNCkZvY3VzZWQgc29sZWx5IG9uIGRpZmZlcmVudGlhbCBleHByZXNzaW9uIOKAlCBpdCBkb2VzbuKAmXQgY2FwdHVyZSBzcGxpY2luZywgdHJhbnNjcmlwdC1sZXZlbCwgb3IgZ2VuZSBzZXQvcGF0aHdheSBhbmFseXNpcy4NCg0KTWF5IG5vdCBwZXJmb3JtIHdlbGwgd2l0aCB2ZXJ5IHNtYWxsIHNhbXBsZSBzaXplcy4NCg0KRG9lc24ndCBtb2RlbCBiYXRjaCBlZmZlY3RzIGF1dG9tYXRpY2FsbHkgKHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlbSBtYW51YWxseSBpbiB0aGUgZGVzaWduIGZvcm11bGEpLg0KDQpDb21wbGVtZW50YXJ5IHRvb2xzOg0KZWRnZVIgb3IgbGltbWEg4oCTIEFsdGVybmF0aXZlIERFIHRvb2xzIHdpdGggZGlmZmVyZW50IG5vcm1hbGl6YXRpb24vc3RhdGlzdGljYWwgYXBwcm9hY2hlcy4NCg0KU2xldXRoIG9yIFNhbG1vbiArIERFU2VxMiDigJMgRm9yIHRyYW5zY3JpcHQtbGV2ZWwgcXVhbnRpZmljYXRpb24uDQoNCkdlbmUgU2V0IEVucmljaG1lbnQgQW5hbHlzaXMgKEdTRUEpIOKAkyBGb3IgdW5kZXJzdGFuZGluZyBiaW9sb2dpY2FsIHBhdGh3YXlzLg0KDQpjbHVzdGVyUHJvZmlsZXIsIEdPc2VxIOKAkyBGb3IgZnVuY3Rpb25hbCBlbnJpY2htZW50IChHTywgS0VHRykuDQoNCkNvbWJhdCBvciBzdmEg4oCTIFRvIHJlbW92ZSBiYXRjaCBlZmZlY3RzLg0KDQpNQVNUIG9yIFNldXJhdCDigJMgRm9yIHNpbmdsZS1jZWxsIFJOQS1zZXEgZGF0YS4NCg0KDQpDb250cmlidXRpb25zOg0KMSlJTkdFRVQgUEFMOiBQYXJ0IEIgUXVlc3Rpb25zIDMtNg0KMilBTlVTS0EgU0FSS0FSOiBQYXJ0IEEgYW5kIFBhcnQgQiBRdWVzdGlvbiAxLTINCjMpQU5USUsgUk9ZOiBQYXJ0IEMgUXVlc3Rpb25zIDEtMw0KNClOQU5ESU5JIFNBSEE6IFBhcnQgQyBRdWVzdGlvbnMgNC01IGFuZCBQYXJ0IEQNCjUpQVZJSyBCSFVJTjogUGFydCBEDQoNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg==