knitr::opts_chunk$set(echo = TRUE)
# Directory
dir_base <- ".."

1 Load packages and functions

# Install and load packages
source(file.path(dir_base, "load_package.R"))
script <- list.files( 
  path = file.path(dir_base,"code/function"),
  pattern = "[.]R$", 
  full.names = T,
  recursive = T
)
for (f in script) source(f)
library(InterSIM) # Use for simulation of multi-omics data

2 Variable selection

Our multi-omics MRF variable selection framework is implemented using the randomforestSRC R package (Ishwaran and Kogalur 2024).

2.1 Simulation of three-omics data

To generate omics data, we simulated mRNA, miRNA, and DNA methylation datasets with 150 samples using the InterSim() function InterSim package (Chalise, Raghavan, and Fridley 2018a). This package allows for the simulation of multiple interrelated data types, including DNA methylation, mRNA gene expression, and protein expression, based on the TCGA ovarian cancer data. Here we set the mean cluster shift of all data to 0.6 and 4 clusters are generated with the proportions of (0.1, 0.3, 0.4, 0.2).

set.seed(12354)
sim1 <- InterSIM(n.sample = 150,
                 delta.methyl = .6,
                 cluster.sample.prop=c(0.1,0.3,0.4,0.2),
                 delta.expr = .6,
                 delta.protein = .6)

dat_list <- sim1[1:3]
label <- sim1$clustering.assignment$cluster.id
# Ensure the input for MRF functions is a named list, where each element in the list is a data frame
class(dat_list) 
## [1] "list"
names(dat_list)  
## [1] "dat.methyl"  "dat.expr"    "dat.protein"
# Note: The column names in each data frame must not contain special characters like "."
dat.list <- dat_list %>% purrr::map(~data.frame(.))
dat.list$dat.protein <- dat_list$dat.protein %>% janitor::clean_names()  

The dimensions of each data:

purrr::map(dat_list, ~dim(.))
## $dat.methyl
## [1] 150 367
## 
## $dat.expr
## [1] 150 131
## 
## $dat.protein
## [1] 150 160

2.2 Run initial MRF model

Before performing variable selection, the initial MRF model must be fitted using the mrf3_init() function. Below is an explanation of the key parameters:

  • dat.list: A list containing multi-omics datasets with samples in columns and features in rows. Samples should be matched across datasets.
  • ntree: Number of trees for fitting the MRF model. Default is 300.
  • scale: Whether to z-standardize each feature. Default is TRUE.
  • yprob: Probability of response features being selected in each node split. Default is 0.5.
  • connect_list: Pre-defined connection list between datasets. If provided, variable selection uses this list. If not, the algorithm finds optimal connections between datasets.
  • var_prop: Proportion of variance explained by PC datasets when finding optimal connections. Default is 0.6.
  • direct: Logical; determines whether to keep both directions in the connection list for optimal connections.
  • lambda: Penalizes variables selected only once in a tree. Experimental parameter. Default is 1.
  • normalized: Logical; determines whether to use normalized variable weights. Default is TRUE.
  • use_depth: Logical; determines whether to compute the average IMD selected in a tree. Default is FALSE.
  • calc: Select which weights to calculate: "X", "Y", or "Both". Use when fewer than two datasets are in the model. Default is "Both".
  • parallel: Logical; determines whether to use parallel computation for weight calculation.
  • return_data: Whether to return the data list. Default is FALSE.
  • cores: Number of cores to use for computation.
mod <- mrf3_init(dat.list = dat_list)
## Finding maximum connections..
## Fitting models..
## Calculating weights..
## Done!
# This might take a while to run the function.

The variable inverse minimal depth (IMD) for data are saved under weights. Here we can plot the IMD using the plot_weights() function in utility folder.

plot_weights(mod$weights, top = NULL)

2.3 Conduct variable selection

The variable selection for different omics data can be conducted using mrf3_vs() function simoutanously. The methods described in the manuscript can be selected by the parameter method:

  • "filter": Variable filtering. The adjustable parameter k specifies the number of times the out-of-bag (OOB) error is computed. The default value is 3.
  • "mixture": Detecting signals with mixture model. The adjustable parameters are c1, which specifies the prior distribution of the first component (options: “normal” or “truncn”), and c2, which specifies the prior distribution of the second component (options: “normal” or “gamma”).
  • "test": IMD transformation. The adjustable parameter level specifies the significance level for selecting important variables. The default value is 0.05.

In this example, we used the mixture model method for illustration.

mod_vs <- mrf3_vs(
  mod = mod,
  dat.list = dat_list,
  method = "mixture"
)
## Variable selection..
## Refit model..
plot_weights(mod_vs$weights, top = NULL)

After variable selection, the number of variables reduced to

purrr::map(mod_vs$weights, ~length(.[.>0]))
## $dat.methyl
## [1] 31
## 
## $dat.expr
## [1] 12
## 
## $dat.protein
## [1] 33

3 Clustering analysis using IntNMF (Optional)

To demonstrate how the selected variables improve clustering results, we used the IntNMF method (Chalise, Raghavan, and Fridley 2018b) to perform clustering analysis. We began by conducting the analysis using the original data:

# Scale the data and shift all values to be positive.
df <- dat_list %>% purrr::map(~ {
  . <- scale(.)
  if (!all(. > 0)) {
    m <- abs(min(.))
    . <- pmax(. + m, 0)
  }
  as.matrix(./max(.))
})

# Perform clustering with IntNMF
mod_int_org <- IntNMF::nmf.mnnals(df, k = 4)

# Calculate the Adjusted Rand Index (ARI) for the clustering results
ari_org <- mclust::adjustedRandIndex(mod_int_org$clusters, label)
print(ari_org)
## [1] 0.7937115
g1 <- plot_tSNE(dat_list$dat.expr, main = "Original: mRNA", group = factor(label), label_group = F)
g2 <- plot_tSNE(dat_list$dat.methyl, main = "Original: methyl", group = factor(label), label_group = F)
g3 <- plot_tSNE(dat_list$dat.protein, main = "Original: protein", group = factor(label), label_group = F)
ggpubr::ggarrange(g1,g2,g3, nrow = 1, ncol = 3)

Next, we performed the clustering analysis using the selected variables:

# Scale the data and shift all values to be positive.
df <- mod_vs$dat.list %>% purrr::map(~ {
  . <- scale(.)
  if (!all(. > 0)) {
    m <- abs(min(.))
    . <- pmax(. + m, 0)
  }
  as.matrix(./max(.))
})

# Perform clustering with IntNMF using the selected variables
mod_int_vs <- IntNMF::nmf.mnnals(df, k = 4)

# Calculate the Adjusted Rand Index (ARI) for the clustering results
ari_vs <- mclust::adjustedRandIndex(mod_int_vs$clusters, label)
print(ari_vs)
## [1] 0.9872821
g1 <- plot_tSNE(mod_vs$dat.list$dat.expr, main = "Selected: mRNA", group = factor(label), label_group = F)
g2 <- plot_tSNE(mod_vs$dat.list$dat.methyl, main = "Selected: methyl", group = factor(label), label_group = F)
g3 <- plot_tSNE(mod_vs$dat.list$dat.protein, main = "Selected: protein", group = factor(label), label_group = F)
ggpubr::ggarrange(g1,g2,g3, nrow = 1, ncol = 3)

Results

We observe that the Adjusted Rand Index (ARI) improves significantly when using the selected variables, indicating better clustering performance.

4 Session information

License: GPL-3.0

devtools::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value
##  version  R version 4.4.2 (2024-10-31)
##  os       Ubuntu 22.04.5 LTS
##  system   x86_64, linux-gnu
##  ui       X11
##  language (EN)
##  collate  en_US.UTF-8
##  ctype    en_US.UTF-8
##  tz       America/New_York
##  date     2025-01-27
##  pandoc   3.1.11 @ /usr/lib/rstudio-server/bin/quarto/bin/tools/x86_64/ (via rmarkdown)
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  ! package              * version    date (UTC) lib source
##    abind                  1.4-5      2016-07-21 [2] CRAN (R 4.2.1)
##    annotate               1.78.0     2023-04-25 [2] Bioconductor
##    AnnotationDbi          1.62.2     2023-07-02 [2] Bioconductor
##    ape                    5.8        2024-04-11 [1] CRAN (R 4.4.0)
##    aplot                  0.2.0      2023-08-09 [2] CRAN (R 4.3.0)
##    askpass                1.2.0      2023-09-03 [1] CRAN (R 4.4.0)
##    babelgene              22.9       2022-09-29 [2] CRAN (R 4.2.1)
##    backports              1.5.0      2024-05-23 [1] CRAN (R 4.4.1)
##    Biobase              * 2.64.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.0)
##    BiocFileCache          2.8.0      2023-04-25 [2] Bioconductor
##    BiocGenerics         * 0.50.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.0)
##    BiocManager            1.30.23    2024-05-04 [1] CRAN (R 4.4.0)
##    BiocParallel           1.38.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.0)
##    biomaRt                2.56.1     2023-06-09 [2] Bioconductor
##    Biostrings             2.68.1     2023-05-16 [2] Bioconductor
##    bit                    4.0.5      2022-11-15 [2] CRAN (R 4.3.0)
##    bit64                  4.0.5      2020-08-30 [2] CRAN (R 4.2.1)
##    bitops                 1.0-7      2021-04-24 [2] CRAN (R 4.2.1)
##    blob                   1.2.4      2023-03-17 [2] CRAN (R 4.3.0)
##    broom                  1.0.5      2023-06-09 [2] CRAN (R 4.3.0)
##    bslib                  0.7.0      2024-03-29 [1] CRAN (R 4.4.0)
##    cachem                 1.1.0      2024-05-16 [1] CRAN (R 4.4.0)
##    callr                  3.7.6      2024-03-25 [1] CRAN (R 4.4.0)
##    car                    3.1-2      2023-03-30 [2] CRAN (R 4.3.0)
##    carData                3.0-5      2022-01-06 [2] CRAN (R 4.2.1)
##    caret                * 6.0-94     2023-03-21 [1] CRAN (R 4.4.1)
##    class                  7.3-22     2023-05-03 [2] CRAN (R 4.3.0)
##    cli                    3.6.3      2024-06-21 [1] CRAN (R 4.4.1)
##    cluster              * 2.1.8      2024-12-11 [4] CRAN (R 4.4.2)
##    clusterProfiler      * 4.8.2      2023-07-12 [2] Bioconductor
##    codetools              0.2-20     2024-03-31 [1] CRAN (R 4.4.0)
##    colorspace             2.1-0      2023-01-23 [2] CRAN (R 4.3.0)
##    corpcor              * 1.6.10     2021-09-16 [2] CRAN (R 4.2.1)
##    cowplot                1.1.1      2020-12-30 [2] CRAN (R 4.2.1)
##    crayon                 1.5.3      2024-06-20 [1] CRAN (R 4.4.1)
##    curl                   5.2.1      2024-03-01 [1] CRAN (R 4.4.0)
##    data.table             1.15.4     2024-03-30 [1] CRAN (R 4.4.0)
##    data.tree              1.1.0      2023-11-12 [1] CRAN (R 4.4.0)
##    DBI                    1.2.3      2024-06-02 [1] CRAN (R 4.4.1)
##    dbplyr                 2.3.3      2023-07-07 [2] CRAN (R 4.3.0)
##    DelayedArray           0.26.7     2023-07-28 [2] Bioconductor
##    Deriv                  4.1.3      2021-02-24 [1] CRAN (R 4.4.0)
##    devtools             * 2.4.5      2022-10-11 [2] CRAN (R 4.2.1)
##    DiagrammeR             1.0.11     2024-02-02 [1] CRAN (R 4.4.0)
##    digest                 0.6.36     2024-06-23 [1] CRAN (R 4.4.1)
##    doParallel           * 1.0.17     2022-02-07 [2] CRAN (R 4.2.1)
##    DOSE                   3.26.1     2023-05-03 [2] Bioconductor
##    downloader             0.4        2015-07-09 [2] CRAN (R 4.2.1)
##    dplyr                * 1.1.2      2023-04-20 [2] CRAN (R 4.3.0)
##    ellipse                0.5.0      2023-07-20 [1] CRAN (R 4.4.0)
##    ellipsis               0.3.2      2021-04-29 [2] CRAN (R 4.2.1)
##    enrichplot             1.20.0     2023-04-25 [2] Bioconductor
##    evaluate               0.24.0     2024-06-10 [1] CRAN (R 4.4.1)
##    fansi                  1.0.6      2023-12-08 [1] CRAN (R 4.4.0)
##    farver                 2.1.2      2024-05-13 [1] CRAN (R 4.4.0)
##    fastmap                1.2.0      2024-05-15 [1] CRAN (R 4.4.0)
##    fastmatch              1.1-4      2023-08-18 [1] CRAN (R 4.4.0)
##    fgsea                  1.26.0     2023-04-25 [2] Bioconductor
##    filelock               1.0.3      2023-12-11 [1] CRAN (R 4.4.0)
##    foreach              * 1.5.2      2022-02-02 [2] CRAN (R 4.2.1)
##    fs                     1.6.4      2024-04-25 [1] CRAN (R 4.4.0)
##    future                 1.33.2     2024-03-26 [1] CRAN (R 4.4.0)
##    future.apply           1.11.2     2024-03-28 [1] CRAN (R 4.4.0)
##    genefilter           * 1.82.1     2023-05-02 [2] Bioconductor
##    generics               0.1.3      2022-07-05 [2] CRAN (R 4.2.1)
##    GenomeInfoDb           1.40.1     2024-05-24 [1] Bioconductor 3.19 (R 4.4.1)
##    GenomeInfoDbData       1.2.12     2024-05-17 [1] Bioconductor
##    GenomicRanges          1.56.1     2024-06-12 [1] Bioconductor 3.19 (R 4.4.1)
##    GEOquery             * 2.68.0     2023-04-25 [2] Bioconductor
##    ggforce                0.4.1      2022-10-04 [2] CRAN (R 4.2.1)
##    ggfun                  0.1.2      2023-08-09 [2] CRAN (R 4.3.0)
##    ggplot2              * 3.4.3      2023-08-14 [1] CRAN (R 4.4.1)
##    ggplotify              0.1.2      2023-08-09 [2] CRAN (R 4.3.0)
##    ggpubr               * 0.6.0      2023-02-10 [2] CRAN (R 4.3.0)
##    ggraph                 2.1.0      2022-10-09 [2] CRAN (R 4.2.1)
##    ggrepel                0.9.3      2023-02-03 [2] CRAN (R 4.3.0)
##    ggsci                  3.2.0      2024-06-18 [1] CRAN (R 4.4.1)
##    ggsignif               0.6.4      2022-10-13 [2] CRAN (R 4.2.1)
##    ggtree                 3.8.2      2023-07-24 [2] Bioconductor
##    glmnet               * 4.1-8      2023-08-22 [1] CRAN (R 4.4.0)
##    globals                0.16.3     2024-03-08 [1] CRAN (R 4.4.0)
##    glue                   1.7.0      2024-01-09 [1] CRAN (R 4.4.0)
##    GO.db                  3.17.0     2023-08-14 [2] Bioconductor
##    GOSemSim               2.26.1     2023-07-10 [2] Bioconductor
##    gower                  1.0.1      2022-12-22 [1] CRAN (R 4.4.0)
##    graphlayouts           1.0.0      2023-05-01 [2] CRAN (R 4.3.0)
##    gridBase               0.4-7      2014-02-24 [2] CRAN (R 4.2.1)
##    gridExtra              2.3        2017-09-09 [2] CRAN (R 4.2.1)
##    gridGraphics           0.5-1      2020-12-13 [2] CRAN (R 4.2.1)
##    gson                   0.1.0      2023-03-07 [2] CRAN (R 4.3.0)
##    gtable                 0.3.5      2024-04-22 [1] CRAN (R 4.4.1)
##    hardhat                1.4.0      2024-06-02 [1] CRAN (R 4.4.1)
##    HDO.db                 0.99.1     2023-08-14 [2] Bioconductor
##    highr                  0.11       2024-05-26 [1] CRAN (R 4.4.1)
##    hms                    1.1.3      2023-03-21 [2] CRAN (R 4.3.0)
##    htmltools              0.5.8.1    2024-04-04 [1] CRAN (R 4.4.0)
##    htmlwidgets            1.6.2      2023-03-17 [2] CRAN (R 4.3.0)
##    httpuv                 1.6.15     2024-03-26 [1] CRAN (R 4.4.0)
##    httr                   1.4.7      2023-08-15 [2] CRAN (R 4.3.0)
##  R igraph                 1.5.1      <NA>       [2] <NA>
##    InterSIM             * 2.2.0      2018-07-16 [1] CRAN (R 4.4.0)
##    IntNMF                 1.2.0      2018-07-18 [1] CRAN (R 4.4.0)
##    ipred                  0.9-14     2023-03-09 [1] CRAN (R 4.4.0)
##    IRanges                2.38.1     2024-07-03 [1] Bioconductor 3.19 (R 4.4.1)
##    iterators            * 1.0.14     2022-02-05 [2] CRAN (R 4.2.1)
##    janitor              * 2.2.0      2023-02-02 [1] CRAN (R 4.4.0)
##    jquerylib              0.1.4      2021-04-26 [2] CRAN (R 4.2.1)
##    jsonlite               1.8.8      2023-12-04 [1] CRAN (R 4.4.0)
##    KEGGREST               1.40.0     2023-04-25 [2] Bioconductor
##    km.ci                  0.5-6      2022-04-06 [2] CRAN (R 4.2.1)
##    KMsurv                 0.1-5      2012-12-03 [2] CRAN (R 4.2.1)
##    knitr                  1.48       2024-07-07 [1] CRAN (R 4.4.1)
##    labeling               0.4.3      2023-08-29 [1] CRAN (R 4.4.0)
##    later                  1.3.2      2023-12-06 [1] CRAN (R 4.4.0)
##    lattice              * 0.22-6     2024-03-20 [1] CRAN (R 4.4.0)
##    lava                   1.8.0      2024-03-05 [1] CRAN (R 4.4.0)
##    lazyeval               0.2.2      2019-03-15 [2] CRAN (R 4.2.1)
##    lifecycle              1.0.4      2023-11-07 [1] CRAN (R 4.4.0)
##    limma                  3.60.3     2024-06-16 [1] Bioconductor 3.19 (R 4.4.1)
##    listenv                0.9.1      2024-01-29 [1] CRAN (R 4.4.0)
##    lubridate              1.9.3      2023-09-27 [1] CRAN (R 4.4.0)
##    magrittr               2.0.3      2022-03-30 [2] CRAN (R 4.2.1)
##    MASS                 * 7.3-61     2024-06-13 [1] CRAN (R 4.4.1)
##    Matrix               * 1.7-0      2024-04-26 [1] CRAN (R 4.4.0)
##    MatrixGenerics         1.16.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.0)
##    matrixStats          * 1.3.0      2024-04-11 [1] CRAN (R 4.4.0)
##    mclust                 6.1.1      2024-04-29 [1] CRAN (R 4.4.0)
##    memoise                2.0.1      2021-11-26 [2] CRAN (R 4.2.1)
##    mime                   0.12       2021-09-28 [2] CRAN (R 4.2.1)
##    miniUI                 0.1.1.1    2018-05-18 [2] CRAN (R 4.2.1)
##    mixOmics             * 6.28.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.0)
##    ModelMetrics           1.2.2.2    2020-03-17 [1] CRAN (R 4.4.0)
##    msigdbr              * 7.5.1      2022-03-30 [2] CRAN (R 4.2.1)
##    munsell                0.5.1      2024-04-01 [1] CRAN (R 4.4.0)
##    nlme                   3.1-165    2024-06-06 [1] CRAN (R 4.4.1)
##    NMF                  * 0.26       2023-03-20 [2] CRAN (R 4.3.0)
##    nnet                   7.3-19     2023-05-03 [2] CRAN (R 4.3.0)
##    openssl                2.2.0      2024-05-16 [1] CRAN (R 4.4.0)
##    parallelly             1.37.1     2024-02-29 [1] CRAN (R 4.4.0)
##    patchwork              1.1.3      2023-08-14 [2] CRAN (R 4.3.0)
##    pheatmap             * 1.0.12     2019-01-04 [2] CRAN (R 4.2.1)
##    pillar                 1.9.0      2023-03-22 [2] CRAN (R 4.3.0)
##    pkgbuild               1.4.2      2023-06-26 [2] CRAN (R 4.3.0)
##    pkgconfig              2.0.3      2019-09-22 [2] CRAN (R 4.2.1)
##    pkgload                1.3.2.1    2023-07-08 [2] CRAN (R 4.3.0)
##    plyr                 * 1.8.9      2023-10-02 [1] CRAN (R 4.4.0)
##    PMA                  * 1.2-3      2024-02-06 [1] CRAN (R 4.4.0)
##    png                    0.1-8      2022-11-29 [2] CRAN (R 4.3.0)
##    polyclip               1.10-6     2023-09-27 [1] CRAN (R 4.4.0)
##    prettyunits            1.2.0      2023-09-24 [1] CRAN (R 4.4.0)
##    pROC                   1.18.5     2023-11-01 [1] CRAN (R 4.4.0)
##    processx               3.8.4      2024-03-16 [1] CRAN (R 4.4.0)
##    prodlim                2024.06.25 2024-06-24 [1] CRAN (R 4.4.1)
##    profvis                0.3.8      2023-05-02 [2] CRAN (R 4.3.0)
##    progress               1.2.3      2023-12-06 [1] CRAN (R 4.4.0)
##    promises               1.3.0      2024-04-05 [1] CRAN (R 4.4.0)
##    ps                     1.7.7      2024-07-02 [1] CRAN (R 4.4.1)
##    purrr                * 1.0.2      2023-08-10 [2] CRAN (R 4.3.0)
##    qvalue                 2.32.0     2023-04-25 [2] Bioconductor
##    R6                     2.5.1      2021-08-19 [2] CRAN (R 4.2.1)
##    randomForestSRC      * 3.3.0      2024-06-25 [1] CRAN (R 4.4.1)
##    rappdirs               0.3.3      2021-01-31 [2] CRAN (R 4.2.1)
##    rARPACK                0.11-0     2016-03-10 [1] CRAN (R 4.4.0)
##    RColorBrewer           1.1-3      2022-04-03 [2] CRAN (R 4.2.1)
##    Rcpp                   1.0.12     2024-01-09 [1] CRAN (R 4.4.0)
##    RCurl                  1.98-1.16  2024-07-11 [1] CRAN (R 4.4.1)
##    readr                * 2.1.4      2023-02-10 [2] CRAN (R 4.3.0)
##    recipes                1.1.0      2024-07-04 [1] CRAN (R 4.4.1)
##    registry             * 0.5-1      2019-03-05 [2] CRAN (R 4.2.1)
##    remotes                2.5.0      2024-03-17 [1] CRAN (R 4.4.0)
##    reshape2               1.4.4      2020-04-09 [2] CRAN (R 4.2.1)
##    reticulate             1.38.0     2024-06-19 [1] CRAN (R 4.4.1)
##    RGCCA                * 3.0.3      2023-12-11 [1] CRAN (R 4.4.0)
##    rlang                  1.1.4      2024-06-04 [1] CRAN (R 4.4.1)
##    rmarkdown              2.24       2023-08-14 [2] CRAN (R 4.3.0)
##    rngtools             * 1.5.2      2021-09-20 [2] CRAN (R 4.2.1)
##    rpart                  4.1.23     2023-12-05 [4] CRAN (R 4.3.2)
##    RSpectra               0.16-1     2022-04-24 [2] CRAN (R 4.2.1)
##    RSQLite                2.3.7      2024-05-27 [1] CRAN (R 4.4.1)
##    rstatix              * 0.7.2      2023-02-01 [2] CRAN (R 4.3.0)
##    rstudioapi             0.16.0     2024-03-24 [1] CRAN (R 4.4.0)
##    Rtsne                  0.17       2023-12-07 [1] CRAN (R 4.4.0)
##    rvest                  1.0.4      2024-02-12 [1] CRAN (R 4.4.0)
##    S4Arrays               1.4.1      2024-05-20 [1] Bioconductor 3.19 (R 4.4.1)
##    S4Vectors              0.42.1     2024-07-03 [1] Bioconductor 3.19 (R 4.4.1)
##    sass                   0.4.9      2024-03-15 [1] CRAN (R 4.4.0)
##    scales                 1.3.0      2023-11-28 [1] CRAN (R 4.4.1)
##    scatterpie             0.2.1      2023-06-07 [2] CRAN (R 4.3.0)
##    sessioninfo            1.2.2      2021-12-06 [2] CRAN (R 4.2.1)
##    shadowtext             0.1.2      2022-04-22 [2] CRAN (R 4.2.1)
##    shape                  1.4.6.1    2024-02-23 [1] CRAN (R 4.4.0)
##    shiny                  1.8.1.1    2024-04-02 [1] CRAN (R 4.4.1)
##    snakecase              0.11.1     2023-08-27 [1] CRAN (R 4.4.0)
##    statmod                1.5.0      2023-01-06 [1] CRAN (R 4.4.0)
##    stringi                1.8.4      2024-05-06 [1] CRAN (R 4.4.0)
##    stringr                1.5.1      2023-11-14 [1] CRAN (R 4.4.1)
##    SummarizedExperiment   1.30.2     2023-06-06 [2] Bioconductor
##    survival             * 3.7-0      2024-06-05 [1] CRAN (R 4.4.1)
##    survminer            * 0.4.9      2021-03-09 [2] CRAN (R 4.2.1)
##    survMisc               0.5.6      2022-04-07 [2] CRAN (R 4.2.1)
##    TCGAbiolinks         * 2.28.3     2023-06-06 [2] Bioconductor
##    TCGAbiolinksGUI.data   1.24.0     2024-05-02 [1] Bioconductor 3.19 (R 4.4.0)
##    tibble               * 3.2.1      2023-03-20 [2] CRAN (R 4.3.0)
##    tidygraph              1.2.3      2023-02-01 [2] CRAN (R 4.3.0)
##    tidyr                  1.3.0      2023-01-24 [2] CRAN (R 4.3.0)
##    tidyselect             1.2.0      2022-10-10 [2] CRAN (R 4.2.1)
##    tidytree               0.4.5      2023-08-10 [2] CRAN (R 4.3.0)
##    timechange             0.3.0      2024-01-18 [1] CRAN (R 4.4.0)
##    timeDate               4032.109   2023-12-14 [1] CRAN (R 4.4.0)
##    treeio                 1.24.3     2023-07-24 [2] Bioconductor
##    truncnorm            * 1.0-9      2023-03-20 [1] CRAN (R 4.4.0)
##    tweenr                 2.0.2      2022-09-06 [2] CRAN (R 4.2.1)
##    tzdb                   0.4.0      2023-05-12 [2] CRAN (R 4.3.0)
##    UCSC.utils             1.0.0      2024-04-30 [1] Bioconductor 3.19 (R 4.4.0)
##    umap                 * 0.2.10.0   2023-02-01 [1] CRAN (R 4.4.0)
##    urlchecker             1.0.1      2021-11-30 [2] CRAN (R 4.2.1)
##    usethis              * 2.2.2      2023-07-06 [2] CRAN (R 4.3.0)
##    utf8                   1.2.4      2023-10-22 [1] CRAN (R 4.4.0)
##    vctrs                  0.6.5      2023-12-01 [1] CRAN (R 4.4.0)
##    viridis                0.6.5      2024-01-29 [1] CRAN (R 4.4.1)
##    viridisLite            0.4.2      2023-05-02 [2] CRAN (R 4.3.0)
##    visNetwork             2.1.2      2022-09-29 [1] CRAN (R 4.4.0)
##    withr                  3.0.0      2024-01-16 [1] CRAN (R 4.4.0)
##    xfun                   0.45       2024-06-16 [1] CRAN (R 4.4.1)
##    XML                    3.99-0.17  2024-06-25 [1] CRAN (R 4.4.1)
##    xml2                   1.3.6      2023-12-04 [1] CRAN (R 4.4.0)
##    xtable                 1.8-4      2019-04-21 [2] CRAN (R 4.2.1)
##    XVector                0.40.0     2023-04-25 [2] Bioconductor
##    yaml                   2.3.9      2024-07-05 [1] CRAN (R 4.4.1)
##    yulab.utils            0.1.4      2024-01-28 [1] CRAN (R 4.4.0)
##    zlibbioc               1.50.0     2024-04-30 [1] Bioconductor 3.19 (R 4.4.0)
##    zoo                    1.8-12     2023-04-13 [2] CRAN (R 4.3.0)
## 
##  [1] /home/weizhang/R/x86_64-pc-linux-gnu-library/4.4
##  [2] /usr/local/lib/R/site-library
##  [3] /usr/lib/R/site-library
##  [4] /usr/lib/R/library
## 
##  R ── Package was removed from disk.
## 
## ──────────────────────────────────────────────────────────────────────────────

References

Chalise, Prabhakar, Rama Raghavan, and Brooke Fridley. 2018a. “InterSIM: Simulation of Inter-Related Genomic Datasets.” https://CRAN.R-project.org/package=InterSIM.
———. 2018b. “IntNMF: Integrative Clustering of Multiple Genomic Dataset.” https://CRAN.R-project.org/package=IntNMF.
Ishwaran, H., and U. B. Kogalur. 2024. “Fast Unified Random Forests for Survival, Regression, and Classification (RF-SRC).” manual. https://cran.r-project.org/package=randomForestSRC.

  1. University of Miami↩︎

  2. University of Miami↩︎

LS0tCnRpdGxlOiAiTXVsdGktb21pY3MgdmFyaWFibGUgc2VsZWN0aW9uIHVzaW5nIE1SRiBmcmFtZXdvcmsiCmF1dGhvcjogCiAgLSBXZWkgWmhhbmdeW1VuaXZlcnNpdHkgb2YgTWlhbWldCiAgLSBYaSBTdGV2ZW4gQ2hlbl5bVW5pdmVyc2l0eSBvZiBNaWFtaV0KZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgcm1hcmtkb3duOjpodG1sX2RvY3VtZW50OgogICAgaGlnaGxpZ2h0OiBweWdtZW50cwogICAgdGhlbWU6IHlldGkKICAgIHRvYzogdHJ1ZQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKICAgIHRvY19kZXB0aDogMwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lIApiaWJsaW9ncmFwaHk6IHJlZi5iaWIKcmVmZXJlbmNlX3NlY3Rpb25fdGl0bGU6ICJSZWZlcmVuY2VzIgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPVR9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKIyBEaXJlY3RvcnkKZGlyX2Jhc2UgPC0gIi4uIgpgYGAKCjxzdHlsZT4KYm9keSB7CiAgbGluZS1oZWlnaHQ6IDEuNTsKfQo8L3N0eWxlPgoKIyBMb2FkIHBhY2thZ2VzIGFuZCBmdW5jdGlvbnMKCmBgYHtyIG1lc3NhZ2UgPSBGLCB3YXJuaW5nID0gRn0KIyBJbnN0YWxsIGFuZCBsb2FkIHBhY2thZ2VzCnNvdXJjZShmaWxlLnBhdGgoZGlyX2Jhc2UsICJsb2FkX3BhY2thZ2UuUiIpKQpzY3JpcHQgPC0gbGlzdC5maWxlcyggCiAgcGF0aCA9IGZpbGUucGF0aChkaXJfYmFzZSwiY29kZS9mdW5jdGlvbiIpLAogIHBhdHRlcm4gPSAiWy5dUiQiLCAKICBmdWxsLm5hbWVzID0gVCwKICByZWN1cnNpdmUgPSBUCikKZm9yIChmIGluIHNjcmlwdCkgc291cmNlKGYpCmxpYnJhcnkoSW50ZXJTSU0pICMgVXNlIGZvciBzaW11bGF0aW9uIG9mIG11bHRpLW9taWNzIGRhdGEKYGBgCgojIFZhcmlhYmxlIHNlbGVjdGlvbgoKT3VyIG11bHRpLW9taWNzIE1SRiB2YXJpYWJsZSBzZWxlY3Rpb24gZnJhbWV3b3JrIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSByYW5kb21mb3Jlc3RTUkMgUiBwYWNrYWdlIFtAUkZTUkMyMDI0XS4KCiMjIFNpbXVsYXRpb24gb2YgdGhyZWUtb21pY3MgZGF0YQoKVG8gZ2VuZXJhdGUgb21pY3MgZGF0YSwgd2Ugc2ltdWxhdGVkIG1STkEsIG1pUk5BLCBhbmQgRE5BIG1ldGh5bGF0aW9uIGRhdGFzZXRzIHdpdGggMTUwIHNhbXBsZXMgdXNpbmcKdGhlIGBJbnRlclNpbSgpYCBmdW5jdGlvbiBJbnRlclNpbSBwYWNrYWdlIFtASW50ZXJTSU0yMDE4XS4gVGhpcyBwYWNrYWdlIGFsbG93cyBmb3IgdGhlIHNpbXVsYXRpb24gb2YgbXVsdGlwbGUgaW50ZXJyZWxhdGVkIGRhdGEgdHlwZXMsIGluY2x1ZGluZyBETkEgbWV0aHlsYXRpb24sIG1STkEgZ2VuZSBleHByZXNzaW9uLAphbmQgcHJvdGVpbiBleHByZXNzaW9uLCBiYXNlZCBvbiB0aGUgVENHQSBvdmFyaWFuIGNhbmNlciBkYXRhLiBIZXJlIHdlIHNldCB0aGUKbWVhbiBjbHVzdGVyIHNoaWZ0IG9mIGFsbCBkYXRhIHRvIDAuNiBhbmQgNCBjbHVzdGVycyBhcmUgZ2VuZXJhdGVkIHdpdGggdGhlCnByb3BvcnRpb25zIG9mICgwLjEsIDAuMywgMC40LCAwLjIpLgoKYGBge3J9CnNldC5zZWVkKDEyMzU0KQpzaW0xIDwtIEludGVyU0lNKG4uc2FtcGxlID0gMTUwLAogICAgICAgICAgICAgICAgIGRlbHRhLm1ldGh5bCA9IC42LAogICAgICAgICAgICAgICAgIGNsdXN0ZXIuc2FtcGxlLnByb3A9YygwLjEsMC4zLDAuNCwwLjIpLAogICAgICAgICAgICAgICAgIGRlbHRhLmV4cHIgPSAuNiwKICAgICAgICAgICAgICAgICBkZWx0YS5wcm90ZWluID0gLjYpCgpkYXRfbGlzdCA8LSBzaW0xWzE6M10KbGFiZWwgPC0gc2ltMSRjbHVzdGVyaW5nLmFzc2lnbm1lbnQkY2x1c3Rlci5pZApgYGAKCmBgYHtyfQojIEVuc3VyZSB0aGUgaW5wdXQgZm9yIE1SRiBmdW5jdGlvbnMgaXMgYSBuYW1lZCBsaXN0LCB3aGVyZSBlYWNoIGVsZW1lbnQgaW4gdGhlIGxpc3QgaXMgYSBkYXRhIGZyYW1lCmNsYXNzKGRhdF9saXN0KSAKbmFtZXMoZGF0X2xpc3QpICAKCiMgTm90ZTogVGhlIGNvbHVtbiBuYW1lcyBpbiBlYWNoIGRhdGEgZnJhbWUgbXVzdCBub3QgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlcnMgbGlrZSAiLiIKZGF0Lmxpc3QgPC0gZGF0X2xpc3QgJT4lIHB1cnJyOjptYXAofmRhdGEuZnJhbWUoLikpCmRhdC5saXN0JGRhdC5wcm90ZWluIDwtIGRhdF9saXN0JGRhdC5wcm90ZWluICU+JSBqYW5pdG9yOjpjbGVhbl9uYW1lcygpICAKYGBgCgpUaGUgZGltZW5zaW9ucyBvZiBlYWNoIGRhdGE6CgpgYGB7cn0KcHVycnI6Om1hcChkYXRfbGlzdCwgfmRpbSguKSkKYGBgCgojIyBSdW4gaW5pdGlhbCBNUkYgbW9kZWwKCkJlZm9yZSBwZXJmb3JtaW5nIHZhcmlhYmxlIHNlbGVjdGlvbiwgdGhlIGluaXRpYWwgTVJGIG1vZGVsIG11c3QgYmUgZml0dGVkIHVzaW5nIHRoZSBgbXJmM19pbml0KClgIGZ1bmN0aW9uLiBCZWxvdyBpcyBhbiBleHBsYW5hdGlvbiBvZiB0aGUga2V5IHBhcmFtZXRlcnM6CgotICoqYGRhdC5saXN0YCoqOiBBIGxpc3QgY29udGFpbmluZyBtdWx0aS1vbWljcyBkYXRhc2V0cyB3aXRoIHNhbXBsZXMgaW4gY29sdW1ucyBhbmQgZmVhdHVyZXMgaW4gcm93cy4gU2FtcGxlcyBzaG91bGQgYmUgbWF0Y2hlZCBhY3Jvc3MgZGF0YXNldHMuCi0gKipgbnRyZWVgKio6IE51bWJlciBvZiB0cmVlcyBmb3IgZml0dGluZyB0aGUgTVJGIG1vZGVsLiBEZWZhdWx0IGlzIDMwMC4KLSAqKmBzY2FsZWAqKjogV2hldGhlciB0byB6LXN0YW5kYXJkaXplIGVhY2ggZmVhdHVyZS4gRGVmYXVsdCBpcyBgVFJVRWAuCi0gKipgeXByb2JgKio6IFByb2JhYmlsaXR5IG9mIHJlc3BvbnNlIGZlYXR1cmVzIGJlaW5nIHNlbGVjdGVkIGluIGVhY2ggbm9kZSBzcGxpdC4gRGVmYXVsdCBpcyBgMC41YC4KLSAqKmBjb25uZWN0X2xpc3RgKio6IFByZS1kZWZpbmVkIGNvbm5lY3Rpb24gbGlzdCBiZXR3ZWVuIGRhdGFzZXRzLiBJZiBwcm92aWRlZCwgdmFyaWFibGUgc2VsZWN0aW9uIHVzZXMgdGhpcyBsaXN0LiBJZiBub3QsIHRoZSBhbGdvcml0aG0gZmluZHMgb3B0aW1hbCBjb25uZWN0aW9ucyBiZXR3ZWVuIGRhdGFzZXRzLgotICoqYHZhcl9wcm9wYCoqOiBQcm9wb3J0aW9uIG9mIHZhcmlhbmNlIGV4cGxhaW5lZCBieSBQQyBkYXRhc2V0cyB3aGVuIGZpbmRpbmcgb3B0aW1hbCBjb25uZWN0aW9ucy4gRGVmYXVsdCBpcyBgMC42YC4KLSAqKmBkaXJlY3RgKio6IExvZ2ljYWw7IGRldGVybWluZXMgd2hldGhlciB0byBrZWVwIGJvdGggZGlyZWN0aW9ucyBpbiB0aGUgY29ubmVjdGlvbiBsaXN0IGZvciBvcHRpbWFsIGNvbm5lY3Rpb25zLgotICoqYGxhbWJkYWAqKjogUGVuYWxpemVzIHZhcmlhYmxlcyBzZWxlY3RlZCBvbmx5IG9uY2UgaW4gYSB0cmVlLiBFeHBlcmltZW50YWwgcGFyYW1ldGVyLiBEZWZhdWx0IGlzIGAxYC4KLSAqKmBub3JtYWxpemVkYCoqOiBMb2dpY2FsOyBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIG5vcm1hbGl6ZWQgdmFyaWFibGUgd2VpZ2h0cy4gRGVmYXVsdCBpcyBgVFJVRWAuCi0gKipgdXNlX2RlcHRoYCoqOiBMb2dpY2FsOyBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gY29tcHV0ZSB0aGUgYXZlcmFnZSBJTUQgc2VsZWN0ZWQgaW4gYSB0cmVlLiBEZWZhdWx0IGlzIGBGQUxTRWAuCi0gKipgY2FsY2AqKjogU2VsZWN0IHdoaWNoIHdlaWdodHMgdG8gY2FsY3VsYXRlOiBgIlgiYCwgYCJZImAsIG9yIGAiQm90aCJgLiBVc2Ugd2hlbiBmZXdlciB0aGFuIHR3byBkYXRhc2V0cyBhcmUgaW4gdGhlIG1vZGVsLiBEZWZhdWx0IGlzIGAiQm90aCJgLgotICoqYHBhcmFsbGVsYCoqOiBMb2dpY2FsOyBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gdXNlIHBhcmFsbGVsIGNvbXB1dGF0aW9uIGZvciB3ZWlnaHQgY2FsY3VsYXRpb24uCi0gKipgcmV0dXJuX2RhdGFgKio6IFdoZXRoZXIgdG8gcmV0dXJuIHRoZSBkYXRhIGxpc3QuIERlZmF1bHQgaXMgYEZBTFNFYC4KLSAqKmBjb3Jlc2AqKjogTnVtYmVyIG9mIGNvcmVzIHRvIHVzZSBmb3IgY29tcHV0YXRpb24uCgoKYGBge3J9Cm1vZCA8LSBtcmYzX2luaXQoZGF0Lmxpc3QgPSBkYXRfbGlzdCkKIyBUaGlzIG1pZ2h0IHRha2UgYSB3aGlsZSB0byBydW4gdGhlIGZ1bmN0aW9uLgpgYGAKClRoZSB2YXJpYWJsZSBpbnZlcnNlIG1pbmltYWwgZGVwdGggKElNRCkgZm9yIGRhdGEgYXJlIHNhdmVkIHVuZGVyIGB3ZWlnaHRzYC4gSGVyZSB3ZSBjYW4gcGxvdCB0aGUgSU1EIHVzaW5nIHRoZSBgcGxvdF93ZWlnaHRzKClgIGZ1bmN0aW9uIGluIHV0aWxpdHkgZm9sZGVyLgoKYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTR9CnBsb3Rfd2VpZ2h0cyhtb2Qkd2VpZ2h0cywgdG9wID0gTlVMTCkKYGBgCgoKIyMgQ29uZHVjdCB2YXJpYWJsZSBzZWxlY3Rpb24KClRoZSB2YXJpYWJsZSBzZWxlY3Rpb24gZm9yIGRpZmZlcmVudCBvbWljcyBkYXRhIGNhbiBiZSBjb25kdWN0ZWQgdXNpbmcgYG1yZjNfdnMoKWAgZnVuY3Rpb24gc2ltb3V0YW5vdXNseS4gVGhlIG1ldGhvZHMgZGVzY3JpYmVkIGluIHRoZSBtYW51c2NyaXB0IGNhbiBiZSBzZWxlY3RlZCBieSB0aGUgcGFyYW1ldGVyIGBtZXRob2RgOgoKLSAqKmAiZmlsdGVyImAqKjogVmFyaWFibGUgZmlsdGVyaW5nLiBUaGUgYWRqdXN0YWJsZSBwYXJhbWV0ZXIgYGtgIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBvdXQtb2YtYmFnIChPT0IpIGVycm9yIGlzIGNvbXB1dGVkLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAzLgotICoqYCJtaXh0dXJlImAqKjogRGV0ZWN0aW5nIHNpZ25hbHMgd2l0aCBtaXh0dXJlIG1vZGVsLiBUaGUgYWRqdXN0YWJsZSBwYXJhbWV0ZXJzIGFyZSBgYzFgLCB3aGljaCBzcGVjaWZpZXMgdGhlIHByaW9yIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZmlyc3QgY29tcG9uZW50IChvcHRpb25zOiAibm9ybWFsIiBvciAidHJ1bmNuIiksIGFuZCBgYzJgLCB3aGljaCBzcGVjaWZpZXMgdGhlIHByaW9yIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2Vjb25kIGNvbXBvbmVudCAob3B0aW9uczogIm5vcm1hbCIgb3IgImdhbW1hIikuCi0gKipgInRlc3QiYCoqOiBJTUQgdHJhbnNmb3JtYXRpb24uIFRoZSBhZGp1c3RhYmxlIHBhcmFtZXRlciBgbGV2ZWxgIHNwZWNpZmllcyB0aGUgc2lnbmlmaWNhbmNlIGxldmVsIGZvciBzZWxlY3RpbmcgaW1wb3J0YW50IHZhcmlhYmxlcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4wNS4KCkluIHRoaXMgZXhhbXBsZSwgd2UgdXNlZCB0aGUgbWl4dHVyZSBtb2RlbCBtZXRob2QgZm9yIGlsbHVzdHJhdGlvbi4KCmBgYHtyfQptb2RfdnMgPC0gbXJmM192cygKICBtb2QgPSBtb2QsCiAgZGF0Lmxpc3QgPSBkYXRfbGlzdCwKICBtZXRob2QgPSAibWl4dHVyZSIKKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD00fQpwbG90X3dlaWdodHMobW9kX3ZzJHdlaWdodHMsIHRvcCA9IE5VTEwpCmBgYAoKQWZ0ZXIgdmFyaWFibGUgc2VsZWN0aW9uLCB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlcyByZWR1Y2VkIHRvIAoKYGBge3J9CnB1cnJyOjptYXAobW9kX3ZzJHdlaWdodHMsIH5sZW5ndGgoLlsuPjBdKSkKYGBgCgojIENsdXN0ZXJpbmcgYW5hbHlzaXMgdXNpbmcgSW50Tk1GIChPcHRpb25hbCkKClRvIGRlbW9uc3RyYXRlIGhvdyB0aGUgc2VsZWN0ZWQgdmFyaWFibGVzIGltcHJvdmUgY2x1c3RlcmluZyByZXN1bHRzLCB3ZSB1c2VkIHRoZSBJbnROTUYgbWV0aG9kIFtASW50Tk1GMjAxOF0gdG8gcGVyZm9ybSBjbHVzdGVyaW5nIGFuYWx5c2lzLiBXZSBiZWdhbiBieSBjb25kdWN0aW5nIHRoZSBhbmFseXNpcyB1c2luZyB0aGUgb3JpZ2luYWwgZGF0YToKCmBgYHtyfQojIFNjYWxlIHRoZSBkYXRhIGFuZCBzaGlmdCBhbGwgdmFsdWVzIHRvIGJlIHBvc2l0aXZlLgpkZiA8LSBkYXRfbGlzdCAlPiUgcHVycnI6Om1hcCh+IHsKICAuIDwtIHNjYWxlKC4pCiAgaWYgKCFhbGwoLiA+IDApKSB7CiAgICBtIDwtIGFicyhtaW4oLikpCiAgICAuIDwtIHBtYXgoLiArIG0sIDApCiAgfQogIGFzLm1hdHJpeCguL21heCguKSkKfSkKCiMgUGVyZm9ybSBjbHVzdGVyaW5nIHdpdGggSW50Tk1GCm1vZF9pbnRfb3JnIDwtIEludE5NRjo6bm1mLm1ubmFscyhkZiwgayA9IDQpCgojIENhbGN1bGF0ZSB0aGUgQWRqdXN0ZWQgUmFuZCBJbmRleCAoQVJJKSBmb3IgdGhlIGNsdXN0ZXJpbmcgcmVzdWx0cwphcmlfb3JnIDwtIG1jbHVzdDo6YWRqdXN0ZWRSYW5kSW5kZXgobW9kX2ludF9vcmckY2x1c3RlcnMsIGxhYmVsKQpwcmludChhcmlfb3JnKQpgYGAKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD00fQpnMSA8LSBwbG90X3RTTkUoZGF0X2xpc3QkZGF0LmV4cHIsIG1haW4gPSAiT3JpZ2luYWw6IG1STkEiLCBncm91cCA9IGZhY3RvcihsYWJlbCksIGxhYmVsX2dyb3VwID0gRikKZzIgPC0gcGxvdF90U05FKGRhdF9saXN0JGRhdC5tZXRoeWwsIG1haW4gPSAiT3JpZ2luYWw6IG1ldGh5bCIsIGdyb3VwID0gZmFjdG9yKGxhYmVsKSwgbGFiZWxfZ3JvdXAgPSBGKQpnMyA8LSBwbG90X3RTTkUoZGF0X2xpc3QkZGF0LnByb3RlaW4sIG1haW4gPSAiT3JpZ2luYWw6IHByb3RlaW4iLCBncm91cCA9IGZhY3RvcihsYWJlbCksIGxhYmVsX2dyb3VwID0gRikKZ2dwdWJyOjpnZ2FycmFuZ2UoZzEsZzIsZzMsIG5yb3cgPSAxLCBuY29sID0gMykKYGBgCgpOZXh0LCB3ZSBwZXJmb3JtZWQgdGhlIGNsdXN0ZXJpbmcgYW5hbHlzaXMgdXNpbmcgdGhlIHNlbGVjdGVkIHZhcmlhYmxlczoKCmBgYHtyfQojIFNjYWxlIHRoZSBkYXRhIGFuZCBzaGlmdCBhbGwgdmFsdWVzIHRvIGJlIHBvc2l0aXZlLgpkZiA8LSBtb2RfdnMkZGF0Lmxpc3QgJT4lIHB1cnJyOjptYXAofiB7CiAgLiA8LSBzY2FsZSguKQogIGlmICghYWxsKC4gPiAwKSkgewogICAgbSA8LSBhYnMobWluKC4pKQogICAgLiA8LSBwbWF4KC4gKyBtLCAwKQogIH0KICBhcy5tYXRyaXgoLi9tYXgoLikpCn0pCgojIFBlcmZvcm0gY2x1c3RlcmluZyB3aXRoIEludE5NRiB1c2luZyB0aGUgc2VsZWN0ZWQgdmFyaWFibGVzCm1vZF9pbnRfdnMgPC0gSW50Tk1GOjpubWYubW5uYWxzKGRmLCBrID0gNCkKCiMgQ2FsY3VsYXRlIHRoZSBBZGp1c3RlZCBSYW5kIEluZGV4IChBUkkpIGZvciB0aGUgY2x1c3RlcmluZyByZXN1bHRzCmFyaV92cyA8LSBtY2x1c3Q6OmFkanVzdGVkUmFuZEluZGV4KG1vZF9pbnRfdnMkY2x1c3RlcnMsIGxhYmVsKQpwcmludChhcmlfdnMpCmBgYAoKYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTR9CmcxIDwtIHBsb3RfdFNORShtb2RfdnMkZGF0Lmxpc3QkZGF0LmV4cHIsIG1haW4gPSAiU2VsZWN0ZWQ6IG1STkEiLCBncm91cCA9IGZhY3RvcihsYWJlbCksIGxhYmVsX2dyb3VwID0gRikKZzIgPC0gcGxvdF90U05FKG1vZF92cyRkYXQubGlzdCRkYXQubWV0aHlsLCBtYWluID0gIlNlbGVjdGVkOiBtZXRoeWwiLCBncm91cCA9IGZhY3RvcihsYWJlbCksIGxhYmVsX2dyb3VwID0gRikKZzMgPC0gcGxvdF90U05FKG1vZF92cyRkYXQubGlzdCRkYXQucHJvdGVpbiwgbWFpbiA9ICJTZWxlY3RlZDogcHJvdGVpbiIsIGdyb3VwID0gZmFjdG9yKGxhYmVsKSwgbGFiZWxfZ3JvdXAgPSBGKQpnZ3B1YnI6OmdnYXJyYW5nZShnMSxnMixnMywgbnJvdyA9IDEsIG5jb2wgPSAzKQpgYGAKCioqUmVzdWx0cyoqCgpXZSBvYnNlcnZlIHRoYXQgdGhlIEFkanVzdGVkIFJhbmQgSW5kZXggKEFSSSkgaW1wcm92ZXMgc2lnbmlmaWNhbnRseSB3aGVuIHVzaW5nIHRoZSBzZWxlY3RlZCB2YXJpYWJsZXMsIGluZGljYXRpbmcgYmV0dGVyIGNsdXN0ZXJpbmcgcGVyZm9ybWFuY2UuCgojIFNlc3Npb24gaW5mb3JtYXRpb24KCkxpY2Vuc2U6IEdQTC0zLjAKCjxkZXRhaWxzPgpgYGB7cn0KZGV2dG9vbHM6OnNlc3Npb25faW5mbygpCmBgYAo8L2RldGFpbHM+CgojIFJlZmVyZW5jZXMKCgo=