Set up for static FNC analyses

Extracting FNCs

See Matlab script get_FNC_corrs.m under ~/restingstate/data/derivatives/gift/analyses-dissertation/batch-jul-19.

Load packages

library(tidyverse)
Registered S3 method overwritten by 'rvest':
  method            from
  read_xml.response xml2
── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.2.0     ✔ purrr   0.3.2
✔ tibble  2.1.3     ✔ dplyr   0.8.1
✔ tidyr   0.8.3     ✔ stringr 1.4.0
✔ readr   1.3.1     ✔ forcats 0.4.0
── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ .GlobalEnv::filter() masks dplyr::filter(), stats::filter()
✖ dplyr::lag()         masks stats::lag()
library(psych)

Attaching package: ‘psych’

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha
library(sjPlot)
Learn more about sjPlot with 'browseVignettes("sjPlot")'.
library(sjmisc)

Attaching package: ‘sjmisc’

The following object is masked from ‘package:purrr’:

    is_empty

The following object is masked from ‘package:tidyr’:

    replace_na

The following object is masked from ‘package:tibble’:

    add_case
library(nlme)

Attaching package: ‘nlme’

The following object is masked from ‘package:dplyr’:

    collapse
library(jtools)

Attaching package: ‘jtools’

The following objects are masked from ‘package:sjmisc’:

    %nin%, center
library(mediation)
Loading required package: MASS

Attaching package: ‘MASS’

The following object is masked _by_ ‘.GlobalEnv’:

    select

The following object is masked from ‘package:dplyr’:

    select

Loading required package: Matrix

Attaching package: ‘Matrix’

The following object is masked from ‘package:tidyr’:

    expand

Loading required package: mvtnorm
Loading required package: sandwich
mediation: Causal Mediation Analysis
Version: 4.4.7


Attaching package: ‘mediation’

The following object is masked from ‘package:psych’:

    mediate
library(effects)
Loading required package: carData
lattice theme set by effectsTheme()
See ?effectsTheme for details.
library(reghelper)

Attaching package: ‘reghelper’

The following object is masked from ‘package:psych’:

    ICC

The following object is masked from ‘package:base’:

    beta
select <- dplyr::select
filter <- dplyr::filter

Import static FNC data

# read in static FNC stats
## FNC = correlation between a pair of ICs
fnc_pl <- read.csv("/Users/sarenseeley/Dropbox/Dissertation/fMRI data analysis/data/fnc_corrs_networks_pl.csv")
fnc_ot <- read.csv("/Users/sarenseeley/Dropbox/Dissertation/fMRI data analysis/data/fnc_corrs_networks_ot.csv")

# read in subject IDs
subj <- read.csv("/Users/sarenseeley/Dropbox/Dissertation/fMRI data analysis/data/subj.csv", header=F)

subj <- subj %>%  transmute(ID = as.character(subj$V1))
subj$ID <- paste0('D', subj$ID) # add the "D" to make it consistent with the master dataset and other data

# drop the "pl/ot" suffix and add a new column "tx" for the long dataframe
fnc_pl <- fnc_pl %>%
   rename_all(.funs = funs(sub("\\_pl", "", names(fnc_pl))))
fnc_pl$tx <- "placebo"
names(fnc_pl)
fnc_pl <- bind_cols(subj, fnc_pl) # add the "ID" variable

# drop the "pl/ot" suffix and add a new column "tx" for the long dataframe
fnc_ot <- fnc_ot %>%
   rename_all(.funs = funs(sub("\\_ot", "", names(fnc_ot))))
fnc_ot$tx <- "oxytocin"
names(fnc_ot)
fnc_ot <- bind_cols(subj, fnc_ot) # add the "ID" variable

# create the long FNC dataframe
long_fnc <- bind_rows(fnc_pl, fnc_ot)

long_fnc$X <- NULL # remove the "X" variable
# should have 76 (38 subjects*2 sessions) observations of 30 variables (28 IC pairs + ID + tx)

Import additional variables

State variables

These include mean framewise displacement, time elapsed from spray administration to when the resting state sequence began, PANAS, STAI-S, “subjective rating of experience” post-scan questions.

# read in MRQC group stats to get mean FD 
meanfd <- read_tsv("~/Desktop/restingstate/data/derivatives/mriqc/group_bold.tsv", col_names = TRUE, col_types=cols_only(
  bids_name = col_character(),
  fd_mean   = col_number()))

# split up meanfd by session
meanfd_pl <- dplyr::filter(meanfd, grepl("ses-txA",bids_name))
meanfd_ot <- dplyr::filter(meanfd, grepl("ses-txB",bids_name))

# then rename for merging with master dataset variables
meanfd_pl <- rename(meanfd_pl, ID = bids_name)
meanfd_pl$tx <- "placebo"

meanfd_ot <- rename(meanfd_ot, ID = bids_name) 
meanfd_ot$tx <- "oxytocin"

meanfd_pl <- mutate_if(tibble::as_tibble(meanfd_pl), 
                                is.character, 
                                stringr::str_replace_all, pattern = "sub-", replacement = "D")
meanfd_pl <- mutate_if(tibble::as_tibble(meanfd_pl), 
                                is.character, 
                                stringr::str_replace_all, pattern = "_ses-txA_task-rest_bold", replacement = "")

meanfd_ot <- mutate_if(tibble::as_tibble(meanfd_ot), 
                                is.character, 
                                stringr::str_replace_all, pattern = "sub-", replacement = "D")
meanfd_ot <- mutate_if(tibble::as_tibble(meanfd_ot), 
                                is.character, 
                                stringr::str_replace_all, pattern = "_ses-txB_task-rest_bold", replacement = "")

long_meanfd <- bind_rows(meanfd_ot, meanfd_pl)

# read in master dataset
data <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/master-dataset/ot-fmri_master-dataset_020719.rds") 

# note that these data are in wide format
# in particular, need to pull out the state variables and combine into one long variable as with meanfd above

# placebo session:
pl_vars <- subset(data, select=c(ID,
                                 tot_pre_panas_pa_A,
                                 tot_pre_panas_na_A,
                                 tot_pre_stai_A,
                                 tot_post_panas_pa_A,
                                 tot_post_panas_na_A,
                                 tot_post_stai_A,
                                 timetorest_A))
pl_vars$tx <- "placebo"

pl_vars <- pl_vars %>%
   rename_all(.funs = funs(sub("\\_A", "", names(pl_vars)))) # remove the "_A" from column names

# oxytocin session:
ot_vars <- subset(data, select=c(ID,
                                 tot_pre_panas_pa_B,
                                 tot_pre_panas_na_B,
                                 tot_pre_stai_B,
                                 tot_post_panas_pa_B,
                                 tot_post_panas_na_B,
                                 tot_post_stai_B,
                                 timetorest_B))
ot_vars$tx <- "oxytocin"

ot_vars <- ot_vars %>%
   rename_all(.funs = funs(sub("\\_B", "", names(ot_vars)))) # remove the "_B" from column names

# bind the oxytocin and placebo session data together into long format
long_state <- bind_rows(pl_vars, ot_vars)

# merge the state variables with mean FD by ID and tx
long_state <- left_join(long_state, long_meanfd, by=c("ID", "tx"))

long_state_fnc <- left_join(long_fnc, long_state, by=c("ID", "tx"))
long_state_fnc <- long_state_fnc %>% mutate(tx = recode_factor(tx, "placebo" = "placebo", "oxytocin" = "oxytocin", .ordered = TRUE))

Thought content (post-scan reports)

### Self-reported post-scan thoughts
# using the % of content that was spouse/death-related from their post scan reports as a very imperfect measure of ruminative content for Aim 1 H3
# (this will probably change)

rumPL <- read.csv("/Users/sarenseeley/Dropbox/Grants\ and\ Applications/NRSA\ F31\ 2018-2019/Resubmission\ Reviews/power-analysis/rumination_txA.csv") # placebo
rumOT <- read.csv("/Users/sarenseeley/Dropbox/Grants\ and\ Applications/NRSA\ F31\ 2018-2019/Resubmission\ Reviews/power-analysis/rumination_txB.csv") # oxytocin

# rename post_sroe variables for binding rows and make factors into characters 
# (otherwise they get all screwed up, w/warning "Unequal factor levels: coercing to characterbinding character and factor vector")
rumPL <- rumPL %>% rename(post_sroe_1 = post_sroe_1_A,
                          post_sroe_2 = post_sroe_2_A) %>% mutate(
                            ID = as.character(ID),
                            tx = as.character(tx),
                            post_sroe_1 = as.character(post_sroe_1),
                            post_sroe_2 = as.character(post_sroe_2)
                ) %>%  mutate(ID = str_replace(ID, "sub-", "D")) # replace "sub-" prefix in ID to "D" so that the ID variables match across dataframes to merge later
rumPL$X <- NULL

rumOT <- rumOT %>% rename(post_sroe_1 = post_sroe_1_B,
                          post_sroe_2 = post_sroe_2_B) %>% mutate(
                            ID = as.character(ID),
                            tx = as.character(tx),
                            post_sroe_1 = as.character(post_sroe_1),
                            post_sroe_2 = as.character(post_sroe_2)
                          ) %>%
  mutate(ID = str_replace(ID, "sub-", "D")) # replace "sub-" prefix in ID to "D" so that the ID variables match across dataframes to merge later
rum <- bind_rows(rumPL, rumOT) 

# recode "tx" variable 
rum <- rum %>% mutate(tx = recode_factor(tx, "txA" = "placebo", "txB" = "oxytocin", .ordered = TRUE))

## this will only be 75 observations, not 76, because of the one participant (D115) who received the pre-scan Qualtrics instead of the post-scan Qualtrics at one visit, so we have post PANAS and STAI but not SROE responses from him at the oxytocin session

# create composite variables for (1) focus on spouse in post-scan responses, and (2) of all of the things they reported thinking about, what % of what they mentioned was related to their spouse/death?
rum$focus_spouse <- (rum$spouse_1+rum$spouse_2) 
rum$focus_task <- (rum$task_1+rum$task_2) 
rum$focus_whoto <- (rum$whoto_1+rum$whoto_2) 
rum$focus_otherpics <- (rum$otherpics_1+rum$otherpics_2) 
rum$focus_all <- (rum$spouse_1+rum$spouse_2+rum$task_1+rum$task_2+rum$whoto_1+rum$whoto_2+rum$otherpics_1+rum$otherpics_2+rum$somatic_1+rum$somatic_2+rum$metacog_1+rum$metacog_2)
rum$focus_spouse_perc <- (rum$focus_spouse/rum$focus_all) # of the total number of things they were thinking about, what proportion were related to their spouse in some way (positive or negative)?
rum$focus_nonspouse_perc <- (1-(rum$focus_spouse_perc)) # of all the total number of things they were thinking about, what proportion of thought content was NOT related to their spouse?

# drop extraneous variables
rum <- rum %>% dplyr::select(-c(post_sroe_1, spouse_1, task_1, whoto_1, otherpics_1, somatic_1, metacog_1, post_sroe_2, spouse_2, task_2, whoto_2, otherpics_2, somatic_2, metacog_2))

# replace NaNs (generated by dividing zero by zero, for D129 placebo session) with 0
fix_nan <- function(x){
    x[is.nan(x)] <- 0
    x
}
rum$focus_spouse_perc <- fix_nan(rum$focus_spouse_perc) 
rum$focus_nonspouse_perc <- fix_nan(rum$focus_nonspouse_perc)   


# merge with data from master dataset
long_state_fnc_sroe <- left_join(long_state_fnc, rum, by=c("tx", "ID"))

Time-invariant variables

These include participant demographics and characteristics, and trait measures.

# read in master dataset
data <- readRDS("~/Dropbox/GLASS Lab/OT Study/data/master-dataset/ot-fmri_master-dataset_020719.rds")

# add the variables from the master dataset to the long dataset containing the state and FNC variables,
# dropping the wide-format state variables as well as startdate (when they did the Qualtrics), DOB, and DOD
data <- subset(data, select=-c(startdate,
                                    dob,
                                    dateofdeath,
                                    pre_panas_1_v1,
                                    pre_panas_2_v1,
                                    pre_panas_3_v1,
                                    pre_panas_4_v1,
                                    pre_panas_5_v1,
                                    pre_panas_6_v1,
                                    pre_panas_7_v1,
                                    pre_panas_8_v1,
                                    pre_panas_9_v1,
                                    pre_panas_10_v1,
                                    pre_panas_11_v1,
                                    pre_panas_12_v1,
                                    pre_panas_13_v1,
                                    pre_panas_14_v1,
                                    pre_panas_15_v1,
                                    pre_panas_16_v1,
                                    pre_panas_17_v1,
                                    pre_panas_18_v1,
                                    pre_panas_19_v1,
                                    pre_panas_20_v1,
                                    pre_stai_1_v1,
                                    pre_stai_2_v1,
                                    pre_stai_3_v1,
                                    pre_stai_4_v1,
                                    pre_stai_5_v1,
                                    pre_stai_6_v1,
                                    pre_stai_7_v1,
                                    pre_stai_8_v1,
                                    pre_stai_9_v1,
                                    pre_stai_10_v1,
                                    pre_stai_11_v1,
                                    pre_stai_12_v1,
                                    pre_stai_13_v1,
                                    pre_stai_14_v1,
                                    pre_stai_15_v1,
                                    pre_stai_16_v1,
                                    pre_stai_17_v1,
                                    pre_stai_18_v1,
                                    pre_stai_19_v1,
                                    pre_stai_20_v1,
                                    tot_pre_panas_pa_v1,
                                    tot_pre_panas_na_v1,
                                    pre_stai_1r_v1,
                                    pre_stai_2r_v1,
                                    pre_stai_5r_v1,
                                    pre_stai_8r_v1,
                                    pre_stai_10r_v1,
                                    pre_stai_11r_v1,
                                    pre_stai_15r_v1,
                                    pre_stai_16r_v1,
                                    pre_stai_19r_v1,
                                    pre_stai_20r_v1,
                                    tot_pre_stai_v1,
                                    pre_panas_1_v2,
                                    pre_panas_2_v2,
                                    pre_panas_3_v2,
                                    pre_panas_4_v2,
                                    pre_panas_5_v2,
                                    pre_panas_6_v2,
                                    pre_panas_7_v2,
                                    pre_panas_8_v2,
                                    pre_panas_9_v2,
                                    pre_panas_10_v2,
                                    pre_panas_11_v2,
                                    pre_panas_12_v2,
                                    pre_panas_13_v2,
                                    pre_panas_14_v2,
                                    pre_panas_15_v2,
                                    pre_panas_16_v2,
                                    pre_panas_17_v2,
                                    pre_panas_18_v2,
                                    pre_panas_19_v2,
                                    pre_panas_20_v2,
                                    pre_stai_1_v2,
                                    pre_stai_2_v2,
                                    pre_stai_3_v2,
                                    pre_stai_4_v2,
                                    pre_stai_5_v2,
                                    pre_stai_6_v2,
                                    pre_stai_7_v2,
                                    pre_stai_8_v2,
                                    pre_stai_9_v2,
                                    pre_stai_10_v2,
                                    pre_stai_11_v2,
                                    pre_stai_12_v2,
                                    pre_stai_13_v2,
                                    pre_stai_14_v2,
                                    pre_stai_15_v2,
                                    pre_stai_16_v2,
                                    pre_stai_17_v2,
                                    pre_stai_18_v2,
                                    pre_stai_19_v2,
                                    pre_stai_20_v2,
                                    tot_pre_panas_pa_v2,
                                    tot_pre_panas_na_v2,
                                    pre_stai_1r_v2,
                                    pre_stai_2r_v2,
                                    pre_stai_5r_v2,
                                    pre_stai_8r_v2,
                                    pre_stai_10r_v2,
                                    pre_stai_11r_v2,
                                    pre_stai_15r_v2,
                                    pre_stai_16r_v2,
                                    pre_stai_19r_v2,
                                    pre_stai_20r_v2,
                                    tot_pre_stai_v2,
                                    post_panas_1_v1,
                                    post_panas_2_v1,
                                    post_panas_3_v1,
                                    post_panas_4_v1,
                                    post_panas_5_v1,
                                    post_panas_6_v1,
                                    post_panas_7_v1,
                                    post_panas_8_v1,
                                    post_panas_9_v1,
                                    post_panas_10_v1,
                                    post_panas_11_v1,
                                    post_panas_12_v1,
                                    post_panas_13_v1,
                                    post_panas_14_v1,
                                    post_panas_15_v1,
                                    post_panas_16_v1,
                                    post_panas_17_v1,
                                    post_panas_18_v1,
                                    post_panas_19_v1,
                                    post_panas_20_v1,
                                    post_stai_1_v1,
                                    post_stai_2_v1,
                                    post_stai_3_v1,
                                    post_stai_4_v1,
                                    post_stai_5_v1,
                                    post_stai_6_v1,
                                    post_stai_7_v1,
                                    post_stai_8_v1,
                                    post_stai_9_v1,
                                    post_stai_10_v1,
                                    post_stai_11_v1,
                                    post_stai_12_v1,
                                    post_stai_13_v1,
                                    post_stai_14_v1,
                                    post_stai_15_v1,
                                    post_stai_16_v1,
                                    post_stai_17_v1,
                                    post_stai_18_v1,
                                    post_stai_19_v1,
                                    post_stai_20_v1,
                                    post_sroe_1_v1,
                                    post_sroe_2_v1,
                                    post_sroe_3_v1,
                                    tot_post_panas_pa_v1,
                                    tot_post_panas_na_v1,
                                    post_stai_1r_v1,
                                    post_stai_2r_v1,
                                    post_stai_5r_v1,
                                    post_stai_8r_v1,
                                    post_stai_10r_v1,
                                    post_stai_11r_v1,
                                    post_stai_15r_v1,
                                    post_stai_16r_v1,
                                    post_stai_19r_v1,
                                    post_stai_20r_v1,
                                    tot_post_stai_v1,
                                    post_panas_1_v2,
                                    post_panas_2_v2,
                                    post_panas_3_v2,
                                    post_panas_4_v2,
                                    post_panas_5_v2,
                                    post_panas_6_v2,
                                    post_panas_7_v2,
                                    post_panas_8_v2,
                                    post_panas_9_v2,
                                    post_panas_10_v2,
                                    post_panas_11_v2,
                                    post_panas_12_v2,
                                    post_panas_13_v2,
                                    post_panas_14_v2,
                                    post_panas_15_v2,
                                    post_panas_16_v2,
                                    post_panas_17_v2,
                                    post_panas_18_v2,
                                    post_panas_19_v2,
                                    post_panas_20_v2,
                                    post_stai_1_v2,
                                    post_stai_2_v2,
                                    post_stai_3_v2,
                                    post_stai_4_v2,
                                    post_stai_5_v2,
                                    post_stai_6_v2,
                                    post_stai_7_v2,
                                    post_stai_8_v2,
                                    post_stai_9_v2,
                                    post_stai_10_v2,
                                    post_stai_11_v2,
                                    post_stai_12_v2,
                                    post_stai_13_v2,
                                    post_stai_14_v2,
                                    post_stai_15_v2,
                                    post_stai_16_v2,
                                    post_stai_17_v2,
                                    post_stai_18_v2,
                                    post_stai_19_v2,
                                    post_stai_20_v2,
                                    tot_post_panas_pa_v2,
                                    tot_post_panas_na_v2,
                                    post_stai_1r_v2,
                                    post_stai_2r_v2,
                                    post_stai_5r_v2,
                                    post_stai_8r_v2,
                                    post_stai_10r_v2,
                                    post_stai_11r_v2,
                                    post_stai_15r_v2,
                                    post_stai_16r_v2,
                                    post_stai_19r_v2,
                                    post_stai_20r_v2,
                                    tot_post_stai_v2,
                                    post_sroe_1_v2,
                                    post_sroe_2_v2,
                                    post_sroe_3_v2,
                                    timetorest_A,
                                    timetorest_B,
                                    gAAT_RT_spouse_pull_A,
                                    gAAT_RT_spouse_pull_B,
                                    gAAT_RT_spouse_push_A,
                                    gAAT_RT_spouse_push_B,
                                    gAAT_RT_stranger_pull_A,
                                    gAAT_RT_stranger_pull_B,
                                    gAAT_RT_stranger_push_A,
                                    gAAT_RT_stranger_push_B,
                                    gAAT_RT_whoto_pull_A,
                                    gAAT_RT_whoto_pull_B,
                                    gAAT_RT_whoto_push_A,
                                    gAAT_RT_whoto_push_B,
                                    gAAT_RT_neutral_pull_A,
                                    gAAT_RT_neutral_pull_B,
                                    gAAT_RT_neutral_push_A,
                                    gAAT_RT_neutral_push_B,
                                    gAAT_RT_death_pull_A,
                                    gAAT_RT_death_pull_B,
                                    gAAT_RT_death_push_A,
                                    gAAT_RT_death_push_B,
                                    gAAT_push_v1,
                                    gAAT_push_v2,
                                    tot_pre_panas_pa_A,
                                    tot_pre_panas_na_A,
                                    tot_pre_stai_A,
                                    tot_post_panas_pa_A,
                                    tot_post_panas_na_A,
                                    tot_post_stai_A,
                                    post_sroe_1_A,
                                    post_sroe_2_A,
                                    post_sroe_3_A,
                                    cortisol_BL_A,
                                    cortisol_PR_A,
                                    cortisol_PO_A,
                                    tot_pre_panas_pa_B,
                                    tot_pre_panas_na_B,
                                    tot_pre_stai_B,
                                    tot_post_panas_pa_B,
                                    tot_post_panas_na_B,
                                    tot_post_stai_B,
                                    post_sroe_1_B,
                                    post_sroe_2_B,
                                    post_sroe_3_B,
                                    cortisol_BL_B,
                                    cortisol_PR_B,
                                    cortisol_PO_B)) 

# drop D142 & D147, who were not included in the resting state fMRI data analysis due to poor data quality
data <- filter(data, !grepl("D142|D147",ID))

# join the data from the master dataset with the long dataset w/FNC and state variables
data <- left_join(data, long_state_fnc_sroe, by=c("ID")) 
min(data$tx) # check that levels were set correctly (console should display Levels: placebo < oxytocin)

# make variables for retired/non-retired; post-grad ed. vs. no post-grad ed.
data <- data %>% mutate(employment_retired = as.factor(ifelse(employment == "retired", 1, 0)),
                        education_postgrad = recode_factor(education, "less than high school" = "less than postgrad", "high school grad" = "less than postgrad", "some college" = "less than postgrad", "college grad" = "less than postgrad", "1 year grad school" = "postgrad", "2 years grad school" = "postgrad", "3 years grad school" = "postgrad", "4+ years grad school" = "postgrad", .ordered = TRUE),
                        education_collegegrad = recode_factor(education, "less than high school" = "< college grad", "high school grad" = "< college grad", "some college" = "< college grad", "college grad" = "college grad", "1 year grad school" = "college grad", "2 years grad school" = "college grad", "3 years grad school" = "college grad", "4+ years grad school" = "college grad", .ordered = TRUE))
levels(data$education_collegegrad)

# make a "time since death in months" variable
data <- data %>% mutate(timesincedeath_mon = timesincedeath/30.417)

# mean-center the FNCs (any variable starting with "fnc")
# and add the suffix "_cm"
meancent <- function(x) { x - mean(x, na.rm=TRUE) } #simple worker function to mean center a variable
data <- data %>% mutate_at(vars(starts_with("fnc")), funs(cm=meancent))
# also mean-center any continuous variables that will be used in interactions
data <- data %>% mutate_at(vars("tot_bdi", "tot_icg", "age_yrs", "fd_mean", "yrs_together", "timesincedeath_mon"), funs(cm=meancent))

# save as an .rds file and a csv file
saveRDS(data, "/Users/sarenseeley/Dropbox/Dissertation/Non-fMRI data analysis/master_with_static_FNC.rds")
write_csv(data, "/Users/sarenseeley/Dropbox/Dissertation/Non-fMRI data analysis/master_with_static_FNC.csv")

# rm(list=ls()) clears the global environment

# split up by session
data_pl <- data %>% filter(tx == "placebo")
data_ot <- data %>% filter(tx == "oxytocin")

Static FNC results

IC selection for static FNC analyses

Figure 2. Hypothesized major network interactions in complicated grief, showing the flow and content of spontaneous thought as potentially more automatically constrained and less variable due to (a) lesser influence from executive control regions over default mode influence26, (b) greater influence from default mode core subsystem regions48, and (c) greater influence of the salience network – so thoughts are intrusive, inflexible, and fixated on the loss.

Based on my model, the connections that I should care most about are DMNcore-DMNmtl, DMNcore-SN, SN-dorsal attention, SN-FPN, DMNcore-FPN, and FPN-dorsal attention.

There was no dorsal attention network component in the gICA results, leaving (A) DMNcore-DMNmtl, (B) DMNcore-SN, (C) SN-FPN, and (D) DMNcore-FPN as the connections of interest that I can look at in this dataset.

gICA results yielded 4 DMN components, with peaks in the PCC (27), precuneus (13), mOFC/ventral striatum (21), and retrosplenial cortex (10). 27 and 13 are most representative of DMNcore, and 10 is most representative of DMNmtl. 21 is interesting…peak could actually be in nucleus accumbens, and associated Neurosynth topic keywords are mostly stuff in the vein of self-referential, social, and value/reward.

For the final DMN components, I selected 27 as most clearly DMNcore and 10 as most clearly DMNmtl.

gICA results yielded one salience network component, primarily centered on the dACC (26). There is also another component that’s basically all insula (posterior & anterior) with the peak in the anterior insula. I classified this as SN as well. However, the fALFF is pretty low (2.65), whereas all the other solidly “good” components have fALFF >4.2 (the “fALFF > 6.0”" rule of thumb for artifact cutoff is different given that ICA-AROMA already removed a lot of high frequency noise).

gICA results yielded two FPN components that both look strongly related to the visuospatial network. I selected 6 (Right) vs. 27 (Left), because 27 has some eyeball movement in it and maps more strongly to the Stanford RSN template.

(look @ this article later: https://academic.oup.com/cercor/article/28/2/726/4637602#116373137)

Selected IC pairs

Relevant to model:

Intra-network connectivity:

  • DMNcore-DMNmtl (fnc_dmn27_dmn10)

Inter-network connectivity:

  • DMNMTL-SN (fnc_dmn10_sn26)
  • DMNcore-SN (fnc_dmn27_sn26)
  • SN-FPN (fnc_fpn6_sn26)
  • DMNcore-FPN (fnc_dmn27_fpn6)

Static FNC Aim 1, based on NRSA Aim 1

For these, the IVs and DVs should be swapped. It makes more sense that we would be interested in predicting grief severity (which has clinical relevance), and this also allows me to use multiple predictors which is important because I don’t have just one FNC of interest.

Aim 1. To test whether dynamic functional connectivity under placebo differs among widowed older adults who are adjusting well, versus those who are adjusting poorly (i.e., complicated grief).

Question 1. Is grief severity associated with functional connectivity between (a) DMNcore-FPN, (b) DMNmtl-DMNcore, or (c) DMNcore-SN?

Static FNC Aim 1. To test whether static functional connectivity between model-relevant IC pairs is predicted by/predicts (???) complicated grief symptom severity.

  • H1: Complicated grief symptom severity will predict lower variability in spontaneous thought flow over time, as indexed by fewer functional connectivity state transitions over the resting state scan.

Aim 1, H1: Not relevant to static FNC.

  • H2: Complicated grief symptom severity will predict greater automatic constraints on thought content, as indexed by more dwell time in states of default mode-salience network interconnectivity.

Static Aim 1, H2: Complicated grief symptom severity will predict/be predicted by stronger correlation between DMN and SN IC pair(s).

  • H3: Ruminative content in self-reported pre-resting state thought content will mediate the relationship between grief symptom severity and automatic constraints as indexed by dwell time in states of default mode-salience network interconnectivity.

Question 2. Does spouse-related thought content mediate the relationship between grief severity complicated grief symptom severity and DMN-SN FNC?

Static Aim 1, H2: Higher proportion of spouse-related thought content will mediate the relationship between complicated grief symptom severity and DMN-SN FNC.

Question 1. Is grief severity associated with functional connectivity between (a) DMNcore-FPN, (b) DMNmtl-DMNcore, or (c) DMNcore-SN? (placebo session)

Within-network FNC

# First, test within-default network FNC
a1h2a <- lm(tot_icg ~ fnc_dmn27_dmn10, data=data_pl)
summary(a1h2a)

Call:
lm(formula = tot_icg ~ fnc_dmn27_dmn10, data = data_pl)

Residuals:
    Min      1Q  Median      3Q     Max 
-18.785  -9.235  -1.199   8.367  24.430 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
(Intercept)       21.611      2.199   9.828 9.85e-12 ***
fnc_dmn27_dmn10    8.985      6.749   1.331    0.191    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12.41 on 36 degrees of freedom
Multiple R-squared:  0.04693,   Adjusted R-squared:  0.02045 
F-statistic: 1.773 on 1 and 36 DF,  p-value: 0.1914
summ(a1h2a, confint=TRUE) # use jtools `summ` function to get confidence intervals
MODEL INFO:
Observations: 38
Dependent Variable: tot_icg
Type: OLS linear regression 

MODEL FIT:
F(1,36) = 1.77, p = 0.19
R² = 0.05
Adj. R² = 0.02 

Standard errors: OLS
-------------------------------------------------------------
                         Est.    2.5%   97.5%   t val.      p
--------------------- ------- ------- ------- -------- ------
(Intercept)             21.61   17.15   26.07     9.83   0.00
fnc_dmn27_dmn10          8.99   -4.70   22.67     1.33   0.19
-------------------------------------------------------------

fnc_dmn27_dmn10 did not predict tot_icg (95% CI’s -4.70, 33.67). The overall model fit was not significant, F(1,36) = 1.77, p = .19.

Between-network FNC

# then, test between-network FNC
a1h2b <- lm(tot_icg ~ fnc_dmn27_sn26 + fnc_dmn10_sn26 + fnc_dmn27_fpn6 + fnc_fpn6_sn26, data=data_pl)
summary(a1h2b)

Call:
lm(formula = tot_icg ~ fnc_dmn27_sn26 + fnc_dmn10_sn26 + fnc_dmn27_fpn6 + 
    fnc_fpn6_sn26, data = data_pl)

Residuals:
    Min      1Q  Median      3Q     Max 
-20.818  -7.106  -1.099   9.211  21.129 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)      29.897      4.381   6.824 8.73e-08 ***
fnc_dmn27_sn26   17.018      6.767   2.515    0.017 *  
fnc_dmn10_sn26    7.093      8.076   0.878    0.386    
fnc_dmn27_fpn6   -7.724      6.773  -1.140    0.262    
fnc_fpn6_sn26    -5.483      7.900  -0.694    0.493    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11.88 on 33 degrees of freedom
Multiple R-squared:  0.1997,    Adjusted R-squared:  0.1027 
F-statistic: 2.058 on 4 and 33 DF,  p-value: 0.1089
summ(a1h2b, confint=TRUE) # use jtools `summ` function to get confidence intervals
MODEL INFO:
Observations: 38
Dependent Variable: tot_icg
Type: OLS linear regression 

MODEL FIT:
F(4,33) = 2.06, p = 0.11
R² = 0.20
Adj. R² = 0.10 

Standard errors: OLS
-------------------------------------------------------------
                        Est.     2.5%   97.5%   t val.      p
-------------------- ------- -------- ------- -------- ------
(Intercept)            29.90    20.98   38.81     6.82   0.00
fnc_dmn27_sn26         17.02     3.25   30.79     2.51   0.02
fnc_dmn10_sn26          7.09    -9.34   23.52     0.88   0.39
fnc_dmn27_fpn6         -7.72   -21.50    6.06    -1.14   0.26
fnc_fpn6_sn26          -5.48   -21.56   10.59    -0.69   0.49
-------------------------------------------------------------

In the model testing all between-network connections, fnc_dmn27_sn26 was the only component pair that was a significant predictor of grief severity, b = 17.02, t = 2.51, p = .017, 95% CI’s 3.25, 30.79). The overall model fit was not significant, F(4,33) = 2.06, p = .11.

A basic scatterplot:

plot_model(a1h2b, type = "pred", terms = c("fnc_dmn27_sn26"), show.data=TRUE) + xlab("FNC between salience and default network core") + ylab("Grief severity (ICG)") + labs(title="Predicted ICG scores") + theme_apa()

plot(data_pl$fnc_dmn27_sn26, data_pl$tot_icg)

Add age, sex, time since death

Next, I tested fnc_dmn27_sn26 in a model that included age, sex, and time since death.

a1h2c <- lm(tot_icg ~ fnc_dmn27_sn26*(age_yrs_cm + sex_m + timesincedeath_mon_cm), data=data_pl) # look at two-way interactions only
summary(a1h2c)

Call:
lm(formula = tot_icg ~ fnc_dmn27_sn26 * (age_yrs_cm + sex_m + 
    timesincedeath_mon_cm), data = data_pl)

Residuals:
    Min      1Q  Median      3Q     Max 
-27.174  -5.283   1.129   5.979  15.334 

Coefficients:
                                     Estimate Std. Error t value Pr(>|t|)    
(Intercept)                           31.1556     2.6133  11.922 6.57e-13 ***
fnc_dmn27_sn26                        21.7524     6.2272   3.493 0.001504 ** 
age_yrs_cm                            -0.0799     0.4002  -0.200 0.843092    
sex_m.L                               13.1018     3.5813   3.658 0.000967 ***
timesincedeath_mon_cm                  0.1561     0.3100   0.503 0.618349    
fnc_dmn27_sn26:age_yrs_cm             -0.5569     0.8257  -0.674 0.505194    
fnc_dmn27_sn26:sex_m.L                22.5152     8.2273   2.737 0.010329 *  
fnc_dmn27_sn26:timesincedeath_mon_cm   0.7677     0.7562   1.015 0.318147    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.3 on 30 degrees of freedom
Multiple R-squared:  0.4528,    Adjusted R-squared:  0.3251 
F-statistic: 3.546 on 7 and 30 DF,  p-value: 0.006798
summ(a1h2c, confint=TRUE)
MODEL INFO:
Observations: 38
Dependent Variable: tot_icg
Type: OLS linear regression 

MODEL FIT:
F(7,30) = 3.55, p = 0.01
R² = 0.45
Adj. R² = 0.33 

Standard errors: OLS
----------------------------------------------------------------------------------
                                              Est.    2.5%   97.5%   t val.      p
------------------------------------------ ------- ------- ------- -------- ------
(Intercept)                                  31.16   25.82   36.49    11.92   0.00
fnc_dmn27_sn26                               21.75    9.03   34.47     3.49   0.00
age_yrs_cm                                   -0.08   -0.90    0.74    -0.20   0.84
sex_m.L                                      13.10    5.79   20.42     3.66   0.00
timesincedeath_mon_cm                         0.16   -0.48    0.79     0.50   0.62
fnc_dmn27_sn26:age_yrs_cm                    -0.56   -2.24    1.13    -0.67   0.51
fnc_dmn27_sn26:sex_m.L                       22.52    5.71   39.32     2.74   0.01
fnc_dmn27_sn26:timesincedeath_mon_cm          0.77   -0.78    2.31     1.02   0.32
----------------------------------------------------------------------------------

DMNcore-SN FNC remained a significant predictor of grief severity in interaction with sex, when age, sex, and time since death were included in the model. The overall model fit was significant, F(7,30) = 3.55, p = .009, adjusted R2 = .33.

The following plot shows the interaction:

plot_model(a1h2c, type = "pred", terms = c("fnc_dmn27_sn26", "sex_m"), show.data=TRUE) + xlab("FNC between salience and default network core") + ylab("Grief severity (ICG)") + labs(title="Predicted ICG scores")

There was a significant interaction between FNC and sex, such that DMN-SN FNC was positively associated with grief severity in men but not women. (Note that grief severity and sex are pretty confounded in this dataset, with higher mean ICG among the men than the women…)

Static FNC Aim 2, based on NRSA Aim 2

Aim 2. To identify how intranasal oxytocin alters dynamic functional connectivity in older adults, and whether effects of oxytocin are moderated by grief severity.

  • H1: Under oxytocin, the sample as a whole will show increased time in salience network-dominant states, relative to placebo.
    Paired t-tests will be used to compare oxytocin and placebo conditions to test whether oxytocin (A) increases dwell time in salience-network dominant states and/or (B) reduces n state transitions in the sample.

  • H2: Complicated grief symptom severity will moderate oxytocin effects on DFNC.

Julia said:

Response: I actually would recommend doing a paired t-test (equally, when no data are missing, a mixed model with oxytocin state as a fixed predictor and a random intercept per participant) to compare the differences in dwell times between oxytocin states. The reason is that when you also have an interaction with grief symptom severity in the model, comparing the two oxytocin states must be done at a particular level of grief symptom severity; the difference between these states will depend on the particular level of grief symptom severity chosen. Even if the interaction is not statistically significant, the model likely did not estimate the interaction as exactly zero. Thus, you’re having to utilize a non-zero estimate of a parameter that you actually think is zero in your calculation of the oxytocin differences. I don’t love that.

Of course, if the interaction is statistically significant, then you definitely should be taking it into account when you’re estimating the difference between oxytocin states. In this case, the grief symptom severity really does moderate that difference between states. Given all this, I would propose looking at the interaction model first. If the interaction is not statistically significant, look at the model with just oxytocin states (again, assuming no missing data, this would be the paired t-test).

Question 3. Does intranasal oxytocin alter static functional connectivity in older adults?

  • H1:
    DFNC:Under oxytocin, the sample as a whole will show increased time in salience network-dominant states, relative to placebo.
    Paired t-tests will be used to compare oxytocin and placebo conditions to test whether oxytocin (A) increases dwell time in salience-network dominant states and/or (B) reduces n state transitions in the sample.

    Static FNC: Oxytocin will increase salience network connectivity with DMN and/or FPN.

Question 4. Are effects of oxytocin moderated by complicated grief symptom severity?

  • H2: Complicated grief symptom severity will moderate oxytocin effects on salience network static FNC.

Following Julia’s advice, test Q4/H2 (interaction model) first, then follow up with LME (instead of t-test, so things like sex can be added to the model) if there is no effect of ICG or interaction:

# fnc_dmn27_sn26 / a
# fnc_dmn10_sn26 / b
# fnc_fpn6_sn26 / c
# fnc_dmn10_dmn27 /d
# from MFO meeting 6/20:
# run it with just icg*tx (+/- other stuff), then see if BDI changes results (+ tot_bdi_cm)
# run 3 models: icg*tx alone, icg*tx + other stuff, icg*tx + other stuff + BDI
# use ML over REML so that models with different fixed effects can be compared
## Models with tot_icg*tx ONLY
# SN component pairs
a2h2a <- lme(fnc_dmn27_sn26 ~ tot_icg_cm*tx, random = ~ 1|ID, data, method="ML") # DMN core-SN dACC
a2h2b <- lme(fnc_dmn10_sn26 ~ tot_icg_cm*tx, random = ~ 1|ID, data, method="ML") # DMN mtl-SN dACC
a2h2c <- lme(fnc_fpn6_sn26 ~ tot_icg_cm*tx, random = ~ 1|ID, data, method="ML") # R FPN-SN dACC
# within-DMN pair
a2h2d <- lme(fnc_dmn27_dmn10 ~ tot_icg_cm*tx, random = ~ 1|ID, data, method="ML") # DMN core-SN dACC
## Models with other covariates
# SN component pairs
a2h2a1 <- lme(fnc_dmn27_sn26 ~ tot_icg_cm*tx + sex_m + age_yrs_cm + fd_mean + meds_hrt + timetorest + meds_psychoactive, random = ~ 1|ID, data, method="ML") # DMN core-SN dACC
a2h2b1 <- lme(fnc_dmn10_sn26 ~ tot_icg_cm*tx + sex_m + age_yrs_cm + fd_mean + meds_hrt + timetorest + meds_psychoactive, random = ~ 1|ID, data, method="ML") # DMN mtl-SN dACC
a2h2c1 <- lme(fnc_fpn6_sn26 ~ tot_icg_cm*tx + sex_m + age_yrs_cm + fd_mean + meds_hrt + timetorest + meds_psychoactive, random = ~ 1|ID, data, method="ML") # R FPN-SN dACC
# within-DMN pair
a2h2d1 <- lme(fnc_dmn27_dmn10 ~ tot_icg_cm*tx + sex_m + age_yrs_cm + fd_mean + meds_hrt + timetorest + meds_psychoactive, random = ~ 1|ID, data, method="ML") # DMN core-SN dACC
# Models w/BDI
# SN component pairs
a2h2a2 <- lme(fnc_dmn27_sn26 ~ tot_icg_cm*tx*tot_bdi_cm, random = ~ 1|ID, data, method="ML") # DMN core-SN dACC
a2h2b2 <- lme(fnc_dmn10_sn26 ~ tot_icg_cm*tx*tot_bdi_cm, random = ~ 1|ID, data, method="ML") # DMN mtl-SN dACC
a2h2c2 <- lme(fnc_fpn6_sn26 ~ tot_icg_cm*tx*tot_bdi_cm, random = ~ 1|ID, data, method="ML") # R FPN-SN dACC
# within-DMN pair
a2h2d2 <- lme(fnc_dmn27_dmn10 ~ tot_icg_cm*tx*tot_bdi_cm, random = ~ 1|ID, data, method="ML") # DMN core-SN dACC

Note that sex_m and tot_icg are confounded - the mean ICG score for men is ~31 while for women it’s ~20, p = .06.

DMN core - SN dACC

anova(a2h2a) # DMN core-SN dACC
              numDF denDF   F-value p-value
(Intercept)       1    36 30.595264  <.0001
tot_icg_cm        1    36  4.531186  0.0402
tx                1    36  2.472479  0.1246
tot_icg_cm:tx     1    36  0.677543  0.4159
anova(a2h2a1) # w/covariates
                  numDF denDF   F-value p-value
(Intercept)           1    34 29.165981  <.0001
tot_icg_cm            1    32  4.319508  0.0458
tx                    1    34  2.381523  0.1320
sex_m                 1    32  0.008121  0.9288
age_yrs_cm            1    32  0.031568  0.8601
fd_mean               1    34  0.354832  0.5553
meds_hrt              1    32  0.383940  0.5399
timetorest            1    34  2.714524  0.1087
meds_psychoactive     1    32  0.010532  0.9189
tot_icg_cm:tx         1    34  0.142984  0.7077
anova(a2h2a2) # w/BDI
                         numDF denDF   F-value p-value
(Intercept)                  1    34 31.545943  <.0001
tot_icg_cm                   1    34  4.671982  0.0378
tx                           1    34  2.517478  0.1218
tot_bdi_cm                   1    34  0.117518  0.7339
tot_icg_cm:tx                1    34  0.689875  0.4120
tot_icg_cm:tot_bdi_cm        1    34  3.001101  0.0923
tx:tot_bdi_cm                1    34  2.269676  0.1412
tot_icg_cm:tx:tot_bdi_cm     1    34  0.385522  0.5388
anova(a2h2a, a2h2a1, a2h2a2) # model comparison
       Model df      AIC      BIC    logLik   Test  L.Ratio p-value
a2h2a      1  6 61.44989 75.43429 -24.72495                        
a2h2a1     2 12 70.07932 98.04812 -23.03966 1 vs 2 3.370575  0.7611
a2h2a2     3 10 63.25768 86.56502 -21.62884 2 vs 3 2.821635  0.2439

Grief severity, but not tx or their interaction, has a significant effect on DMN core-SN ACC FNC - similar to the result with just the placebo data. This effect holds when sex, age, mean FD and hormone replacement treatment are included in the model.

Model summary and confidence intervals for the estimate:

summary(a2h2a)
Linear mixed-effects model fit by maximum likelihood
 Data: data 
       AIC      BIC    logLik
  61.44989 75.43429 -24.72495

Random effects:
 Formula: ~1 | ID
        (Intercept) Residual
StdDev:   0.2260328 0.268737

Fixed effects: fnc_dmn27_sn26 ~ tot_icg_cm * tx 
                      Value  Std.Error DF   t-value p-value
(Intercept)     -0.27222976 0.04921625 36 -5.531299  0.0000
tot_icg_cm       0.00846803 0.00397811 36  2.128658  0.0402
tx.L             0.07042754 0.04478950 36  1.572412  0.1246
tot_icg_cm:tx.L -0.00297997 0.00362030 36 -0.823130  0.4159
 Correlation: 
                (Intr) tt_cg_ tx.L
tot_icg_cm      0                 
tx.L            0      0          
tot_icg_cm:tx.L 0      0      0   

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-1.72884794 -0.64406077  0.02956914  0.64004024  1.98658252 

Number of Observations: 76
Number of Groups: 38 
round(intervals(a2h2a)[["fixed"]],4) # 95% CIs
                  lower    est.   upper
(Intercept)     -0.3694 -0.2722 -0.1751
tot_icg_cm       0.0006  0.0085  0.0163
tx.L            -0.0180  0.0704  0.1588
tot_icg_cm:tx.L -0.0101 -0.0030  0.0042
attr(,"label")
[1] "Fixed effects:"
# variance explained by the entire model 
fitted_a2h2a <- fitted(a2h2a)
data$fitted_a2h2a <- as.vector(fitted_a2h2a)
forR2 <- lm(fnc_dmn27_sn26 ~ fitted_a2h2a, data=data)
summary(forR2) 

Call:
lm(formula = fnc_dmn27_sn26 ~ fitted_a2h2a, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.42141 -0.15045  0.02023  0.17715  0.47552 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)    0.1307     0.0385   3.394  0.00111 ** 
fitted_a2h2a   1.4801     0.1120  13.215  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.205 on 74 degrees of freedom
Multiple R-squared:  0.7024,    Adjusted R-squared:  0.6984 
F-statistic: 174.6 on 1 and 74 DF,  p-value: < 2.2e-16
# ICC (variance explained by between-person variance)
# function from the `reghelper` package
round(ICC(a2h2a),2)
[1] 0.41
# panel by tx
ggplot(data, aes(fnc_dmn27_sn26, tot_icg, fill=tx)) + geom_point(aes(color = tx)) +
xlab("DMN core-SN connectivity") + ylab("Grief severity") + theme_bw(base_size=12) + scale_color_discrete() + facet_grid(. ~ tx) + geom_smooth(method=lm, aes(color = tx)) + theme_apa() + scale_fill_grey(start=.8, end=.8) 

The effect is being driven by the association between grief severity and FNC in the placebo condition.

DMN mtl - SN dACC

anova(a2h2b) # DMN mtl-SN dACC
              numDF denDF   F-value p-value
(Intercept)       1    36 12.086395  0.0013
tot_icg_cm        1    36  1.102735  0.3007
tx                1    36  7.015436  0.0119
tot_icg_cm:tx     1    36  0.086318  0.7706
anova(a2h2b1) # w/covariates
                  numDF denDF   F-value p-value
(Intercept)           1    34 12.608381  0.0011
tot_icg_cm            1    32  1.150360  0.2915
tx                    1    34  6.996639  0.0123
sex_m                 1    32  0.051012  0.8227
age_yrs_cm            1    32  1.566661  0.2198
fd_mean               1    34  2.157875  0.1510
meds_hrt              1    32  1.621930  0.2120
timetorest            1    34  1.006385  0.3229
meds_psychoactive     1    32  1.123969  0.2970
tot_icg_cm:tx         1    34  0.016566  0.8983
anova(a2h2b2) # w/BDI
                         numDF denDF   F-value p-value
(Intercept)                  1    34 13.267921  0.0009
tot_icg_cm                   1    34  1.210535  0.2790
tx                           1    34  7.468969  0.0099
tot_bdi_cm                   1    34  3.459973  0.0715
tot_icg_cm:tx                1    34  0.091898  0.7636
tot_icg_cm:tot_bdi_cm        1    34  2.059271  0.1604
tx:tot_bdi_cm                1    34  3.456061  0.0717
tot_icg_cm:tx:tot_bdi_cm     1    34  0.871266  0.3572
anova(a2h2b, a2h2b1, a2h2b2) # model comparison
       Model df       AIC       BIC    logLik   Test  L.Ratio p-value
a2h2b      1  6 -5.338165  8.646235  8.669082                        
a2h2b1     2 12 -1.455771 26.513029 12.727885 1 vs 2 8.117606  0.2296
a2h2b2     3 10 -7.606898 15.700435 13.803449 2 vs 3 2.151127  0.3411
# variance explained by the entire model 
fitted_a2h2b <- fitted(a2h2b)
data$fitted_a2h2b <- as.vector(fitted_a2h2b)
forR2 <- lm(fnc_dmn10_sn26 ~ fitted_a2h2b, data=data)
summary(forR2) 

Call:
lm(formula = fnc_dmn10_sn26 ~ fitted_a2h2b, data = data)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.302106 -0.082537  0.002776  0.077691  0.277115 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -0.04444    0.01708  -2.602   0.0112 *  
fitted_a2h2b  1.37446    0.08764  15.684   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1181 on 74 degrees of freedom
Multiple R-squared:  0.7687,    Adjusted R-squared:  0.7656 
F-statistic:   246 on 1 and 74 DF,  p-value: < 2.2e-16
# ICC (variance explained by between-person variance)
# function from the `reghelper` package
round(ICC(a2h2b),2)
[1] 0.53

There was a significant main effect of tx (but not tot_icg or their interaction) on the DMN mtl-SN dACC pair, in which these components were more strongly correlated in the oxytocin condition. This effect holds when sex, age, mean FD and hormone replacement treatment are included in the model.

t.test(data$fnc_dmn10_sn26 ~ data$tx, paired=TRUE)

    Paired t-test

data:  data$fnc_dmn10_sn26 by data$tx
t = -2.682, df = 37, p-value = 0.01087
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.17632769 -0.02456044
sample estimates:
mean of the differences 
             -0.1004441 
# create a bar plot with error bars (95% CI)
p <- ggplot(data, aes(tx, fnc_dmn10_sn26, fill=tx)) +
  stat_summary(geom = "bar", fun.y = mean, position = "dodge", color="black") +
  stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") +
  geom_hline(yintercept=0, linetype="solid", color="black", size=.5) + 
  scale_fill_manual(values=c("#FFC107", "#1E88E5"))
p

m <- lme(fnc_dmn10_sn26 ~ tx, random = ~ 1|ID, data, method="ML") # use lme() instead of paired t-test to get effect estimate to plot (this gives same result as paired t-test)
ef <- effect("tx", m)
ef <- as.data.frame(ef)
ggplot(ef, aes(tx, fit, color=tx)) + geom_line() + geom_point() + geom_errorbar(aes(ymin=fit-se, ymax=fit+se), width=0.2) +
    scale_color_discrete() + theme_bw(base_size=12) + xlab("Session") + ylab("Fitted values for DMN mtl (IC10) - SN (IC26)") + labs(color='Session')

R FPN - SN dACC

anova(a2h2c) # R FPN-SN dACC
              numDF denDF   F-value p-value
(Intercept)       1    36 27.681369  <.0001
tot_icg_cm        1    36  4.967929  0.0322
tx                1    36  2.487758  0.1235
tot_icg_cm:tx     1    36  2.178898  0.1486
anova(a2h2c1) # w/covariates
                  numDF denDF   F-value p-value
(Intercept)           1    34 25.952482  <.0001
tot_icg_cm            1    32  4.657648  0.0385
tx                    1    34  2.607650  0.1156
sex_m                 1    32  0.204197  0.6544
age_yrs_cm            1    32  0.002682  0.9590
fd_mean               1    34  2.998659  0.0924
meds_hrt              1    32  0.048902  0.8264
timetorest            1    34  1.146024  0.2919
meds_psychoactive     1    32  0.454598  0.5050
tot_icg_cm:tx         1    34  2.915342  0.0969
anova(a2h2c2) # w/BDI
                         numDF denDF   F-value p-value
(Intercept)                  1    34 26.811864  <.0001
tot_icg_cm                   1    34  4.811880  0.0352
tx                           1    34  2.465044  0.1257
tot_bdi_cm                   1    34  0.812129  0.3738
tot_icg_cm:tx                1    34  2.159004  0.1509
tot_icg_cm:tot_bdi_cm        1    34  0.057067  0.8126
tx:tot_bdi_cm                1    34  0.918632  0.3446
tot_icg_cm:tx:tot_bdi_cm     1    34  0.752677  0.3917
anova(a2h2c, a2h2c1, a2h2c2) # model comparison
       Model df      AIC      BIC    logLik   Test  L.Ratio p-value
a2h2c      1  6 30.96778 44.95218 -9.483889                        
a2h2c1     2 12 37.01705 64.98585 -6.508527 1 vs 2 5.950723  0.4287
a2h2c2     3 10 36.18506 59.49239 -8.092529 2 vs 3 3.168004  0.2052

Grief severity, but not tx or their interaction, has a significant effect on R FPN-SN ACC FNC. This effect holds when sex, age, mean FD and hormone replacement treatment are included in the model.

Model summary and confidence intervals for the estimate:

summary(a2h2c) 
Linear mixed-effects model fit by maximum likelihood
 Data: data 
       AIC      BIC    logLik
  30.96778 44.95218 -9.483889

Random effects:
 Formula: ~1 | ID
        (Intercept)  Residual
StdDev:   0.1362308 0.2425831

Fixed effects: fnc_fpn6_sn26 ~ tot_icg_cm * tx 
                      Value  Std.Error DF   t-value p-value
(Intercept)      0.19208002 0.03650803 36  5.261309  0.0000
tot_icg_cm       0.00657724 0.00295091 36  2.228885  0.0322
tx.L            -0.06376955 0.04043051 36 -1.577263  0.1235
tot_icg_cm:tx.L  0.00482387 0.00326796 36  1.476109  0.1486
 Correlation: 
                (Intr) tt_cg_ tx.L
tot_icg_cm      0                 
tx.L            0      0          
tot_icg_cm:tx.L 0      0      0   

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-2.3547201 -0.4245518  0.1132649  0.6106873  1.8400883 

Number of Observations: 76
Number of Groups: 38 
round(intervals(a2h2c)[["fixed"]],4) # 95% CIs
                  lower    est.  upper
(Intercept)      0.1200  0.1921 0.2641
tot_icg_cm       0.0008  0.0066 0.0124
tx.L            -0.1436 -0.0638 0.0160
tot_icg_cm:tx.L -0.0016  0.0048 0.0113
attr(,"label")
[1] "Fixed effects:"
# panel by tx
ggplot(data, aes(fnc_fpn6_sn26, tot_icg, fill=tx)) + geom_point(aes(color = tx)) +
xlab("FPN-SN connectivity") + ylab("Grief severity") + theme_bw(base_size=12) + scale_color_discrete() + facet_grid(. ~ tx) + geom_smooth(method=lm, aes(color = tx)) + theme_apa() + scale_fill_grey(start=.8, end=.8)

# variance explained by the entire model 
fitted_a2h2c <- fitted(a2h2c)
data$fitted_a2h2c <- as.vector(fitted_a2h2c)
forR2 <- lm(fnc_fpn6_sn26 ~ fitted_a2h2c, data=data)
summary(forR2) 

Call:
lm(formula = fnc_fpn6_sn26 ~ fitted_a2h2c, data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.50451 -0.10227  0.01775  0.12225  0.43372 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -0.12411    0.04096  -3.030  0.00337 ** 
fitted_a2h2c  1.64611    0.17543   9.383 3.15e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.203 on 74 degrees of freedom
Multiple R-squared:  0.5433,    Adjusted R-squared:  0.5372 
F-statistic: 88.05 on 1 and 74 DF,  p-value: 3.15e-14
# ICC (variance explained by between-person variance)
# function from the `reghelper` package
round(ICC(a2h2c),2)
[1] 0.24

The effect is being driven by the association between grief severity and FNC in the oxytocin condition.

Visualizing effects of oxytocin

# to visualize effects (sig. and ns) of oxytocin, create a long dataset with one column for FNC (all kinds), one column for IC pair name, one column for `tx`, one column for `ID`
# first, subset columns to select only FNC pairs of interest
fnc_bar_data <- data %>% select(contains("sn26"), contains("dmn10"), contains("dmn27"), -contains("_cm"), -contains("dmn13"), -contains("dmn10_fpn6"), -contains("dmn21"), -contains("sn12"), -contains("fpn17"), "ID", "tx", "tot_icg", "group", "sex_m")
fnc_bar_data <- gather(fnc_bar_data, fnc,value,-tot_icg, -tx, -ID, -group, -sex_m) %>% mutate(tx = factor(ifelse(tx == "placebo", "placebo", "oxytocin")))
# show as a bar chart w/error bars (mean SE):
ggplot(fnc_bar_data, aes(tx, value, fill=tx)) + stat_summary(geom = "bar", fun.y = mean, position = "dodge", color="black") +
  stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") +
    geom_hline(yintercept=0, linetype="solid", color="black", size=.25) + 
 ylab("Correlation") + facet_grid(. ~ fnc) + scale_fill_discrete() + theme_apa(facet.title.size=7.75)

# panel by group
ggplot(fnc_bar_data, aes(group, value, fill=tx)) + stat_summary(geom = "bar", fun.y = mean, position = "dodge", color="black") +
  stat_summary(geom = "errorbar", fun.data = mean_se, position=position_dodge(.9), width = 0.25, color="black") +
   geom_hline(yintercept=0, linetype="solid", color="black", size=.5) + 
  ylab("Correlation") + facet_grid(. ~ fnc)  + theme_apa(facet.title.size=7.75)

DMN mtl- DMN core

anova(a2h2d)
              numDF denDF   F-value p-value
(Intercept)       1    36 14.128882  0.0006
tot_icg_cm        1    36  1.838644  0.1836
tx                1    36  0.155134  0.6960
tot_icg_cm:tx     1    36  0.189230  0.6662
anova(a2h2d1)
                  numDF denDF   F-value p-value
(Intercept)           1    34 14.724719  0.0005
tot_icg_cm            1    32  1.916183  0.1759
tx                    1    34  0.140201  0.7104
sex_m                 1    32  1.073780  0.3079
age_yrs_cm            1    32  2.236282  0.1446
fd_mean               1    34  0.194583  0.6619
meds_hrt              1    32  0.178177  0.6758
timetorest            1    34  0.076769  0.7834
meds_psychoactive     1    32  0.340334  0.5637
tot_icg_cm:tx         1    34  0.123834  0.7271
anova(a2h2d2)
                         numDF denDF   F-value p-value
(Intercept)                  1    34 13.563076  0.0008
tot_icg_cm                   1    34  1.765014  0.1928
tx                           1    34  0.159221  0.6924
tot_bdi_cm                   1    34  0.015113  0.9029
tot_icg_cm:tx                1    34  0.194215  0.6622
tot_icg_cm:tot_bdi_cm        1    34  0.543228  0.4662
tx:tot_bdi_cm                1    34  2.935086  0.0958
tot_icg_cm:tx:tot_bdi_cm     1    34  0.013287  0.9089
anova(a2h2d, a2h2d1, a2h2d2)
       Model df      AIC      BIC    logLik   Test  L.Ratio p-value
a2h2d      1  6 37.73946 51.72386 -12.86973                        
a2h2d1     2 12 45.40314 73.37194 -10.70157 1 vs 2 4.336315  0.6313
a2h2d2     3 10 41.96037 65.26771 -10.98019 2 vs 3 0.557232  0.7568

There was no effect of tot_icg or oxytocin on within-DMN connectivity.

MANOVA

dependent.vars <- cbind(data$fnc_dmn10_sn26, data$fnc_dmn27_sn26, data$fnc_fpn6_sn26)
summary(aov(dependent.vars ~ data$tot_icg * data$tx))
 Response 1 :
                     Df Sum Sq  Mean Sq F value  Pr(>F)  
data$tot_icg          1 0.0977 0.097675  1.6855 0.19834  
data$tx               1 0.1917 0.191691  3.3079 0.07311 .
data$tot_icg:data$tx  1 0.0024 0.002359  0.0407 0.84069  
Residuals            72 4.1724 0.057950                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 Response 2 :
                     Df Sum Sq Mean Sq F value  Pr(>F)  
data$tot_icg          1 0.8341 0.83415  6.4086 0.01354 *
data$tx               1 0.1885 0.18848  1.4481 0.23278  
data$tot_icg:data$tx  1 0.0517 0.05165  0.3968 0.53073  
Residuals            72 9.3716 0.13016                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 Response 3 :
                     Df Sum Sq Mean Sq F value  Pr(>F)  
data$tot_icg          1 0.5032 0.50323  6.1590 0.01541 *
data$tx               1 0.1545 0.15453  1.8913 0.17332  
data$tot_icg:data$tx  1 0.1353 0.13534  1.6565 0.20220  
Residuals            72 5.8828 0.08171                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
summary(aov(dependent.vars ~ data$tot_icg * data$tx * data$tot_bdi))
 Response 1 :
                                  Df Sum Sq  Mean Sq F value  Pr(>F)  
data$tot_icg                       1 0.0977 0.097675  1.8368 0.17981  
data$tx                            1 0.1917 0.191691  3.6048 0.06186 .
data$tot_bdi                       1 0.2792 0.279176  5.2500 0.02505 *
data$tot_icg:data$tx               1 0.0024 0.002359  0.0444 0.83383  
data$tot_icg:data$tot_bdi          1 0.1662 0.166157  3.1247 0.08160 .
data$tx:data$tot_bdi               1 0.0887 0.088700  1.6680 0.20089  
data$tot_icg:data$tx:data$tot_bdi  1 0.0224 0.022361  0.4205 0.51887  
Residuals                         68 3.6160 0.053176                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 Response 2 :
                                  Df Sum Sq Mean Sq F value  Pr(>F)  
data$tot_icg                       1 0.8341 0.83415  6.5833 0.01250 *
data$tx                            1 0.1885 0.18848  1.4876 0.22681  
data$tot_bdi                       1 0.0210 0.02098  0.1656 0.68533  
data$tot_icg:data$tx               1 0.0517 0.05165  0.4076 0.52531  
data$tot_icg:data$tot_bdi          1 0.5358 0.53582  4.2289 0.04358 *
data$tx:data$tot_bdi               1 0.1699 0.16993  1.3411 0.25089  
data$tot_icg:data$tx:data$tot_bdi  1 0.0289 0.02886  0.2278 0.63469  
Residuals                         68 8.6160 0.12671                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 Response 3 :
                                  Df Sum Sq Mean Sq F value  Pr(>F)  
data$tot_icg                       1 0.5032 0.50323  6.0170 0.01674 *
data$tx                            1 0.1545 0.15453  1.8477 0.17855  
data$tot_bdi                       1 0.0849 0.08493  1.0155 0.31715  
data$tot_icg:data$tx               1 0.1353 0.13534  1.6183 0.20766  
data$tot_icg:data$tot_bdi          1 0.0060 0.00597  0.0714 0.79018  
data$tx:data$tot_bdi               1 0.0576 0.05759  0.6886 0.40956  
data$tot_icg:data$tx:data$tot_bdi  1 0.0472 0.04718  0.5642 0.45518  
Residuals                         68 5.6871 0.08363                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Conclusions: Static FNC

Aim 1

Question 1. Is grief severity associated with functional connectivity between (a) DMNcore-FPN, (b) DMNmtl-DMNcore, or (c) DMNcore-SN?

YES, functional connectivity between DMNcore and SNACC (fnc_dmn27_sn26) was predicted of grief severity (tot_icg). There was a significant interaction with sex, such that DMN-SN FNC was positively associated with grief severity in men but not women (sex also predictive of grief severity, though…)

plot_model(a1h2c, type = "pred", terms = c("fnc_dmn27_sn26", "sex_m"), show.data=TRUE) + xlab("FNC between salience and default network core") + ylab("Grief severity (ICG)") + labs(title="Predicted ICG scores")

# this is the model that includes main and interaction effects of age, sex, and mean FD

Aim 2

Question 3. Does intranasal oxytocin alter static functional connectivity in older adults?

YES, oxytocin increased connectivity between DMNMTL-SNdACC across the sample (no effect of grief severity). This effect held when age, sex, mean FD, and HRT were included as covariates in the model.

Question 4. Are effects of oxytocin moderated by complicated grief symptom severity?

NO, not in any of the component pairs I looked at.

Longitudinal aim w/follow-up ICG (exploratory)

In this aim, I wanted to test whether static FNC would predict change in grief severity from study to 20-24 months post-study.

t.test(data_pl$tot_icg, data_pl$tot_icg_20mFU,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

    Paired t-test

data:  data_pl$tot_icg and data_pl$tot_icg_20mFU
t = 4.4218, df = 30, p-value = 0.0001185
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 2.586522 7.026381
sample estimates:
mean of the differences 
               4.806452 
describe(data_pl$tot_icg)
   vars  n  mean    sd median trimmed   mad min max range skew kurtosis   se
X1    1 38 22.79 12.54   21.5   22.06 10.38   4  51    47 0.48    -0.58 2.03
describe(data_pl$tot_icg_20mFU)
   vars  n  mean    sd median trimmed   mad min max range skew kurtosis   se
X1    1 31 15.45 10.55     13   14.44 13.34   2  45    43 0.75     0.05 1.89
# yes, ICG on average is significantly decreased at the follow-up
# compute ICG change and time elapsed between death and follow-up
data_pl$tot_icg_change <- data_pl$tot_icg_20mFU - data_pl$tot_icg
describe(data_pl$tot_icg_change)
   vars  n  mean   sd median trimmed  mad min max range  skew kurtosis   se
X1    1 31 -4.81 6.05     -4   -4.68 4.45 -19   7    26 -0.31    -0.44 1.09
hist(data_pl$tot_icg_change)

data_pl$time_death_20mFU_mos <- data_pl$timesincedeath_mon + data_pl$timeto20mFU_mos
describe(data_pl$time_death_20mFU_mos)
   vars  n  mean   sd median trimmed  mad   min   max range skew kurtosis  se
X1    1 31 36.43 7.24  35.67   35.39 6.39 26.63 55.56 28.93 1.03     0.41 1.3
hist(data_pl$time_death_20mFU_mos)

# remove the cases with no follow-up data (7 out of the 38)
data_pl_fu <- data_pl %>% filter(!is.na(tot_icg_change))
# Predicting ICG change from DMN mtl-SN dACC FNC, controlling for time to follow-up
a3h3a <- lm(tot_icg_change ~ fnc_dmn10_sn26 + timeto20mFU, data=data_pl_fu)
summary(a3h3a)

Call:
lm(formula = tot_icg_change ~ fnc_dmn10_sn26 + timeto20mFU, data = data_pl_fu)

Residuals:
     Min       1Q   Median       3Q      Max 
-10.3949  -3.6184   0.1642   2.4244  11.2999 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)   
(Intercept)    86.34634   29.73199   2.904  0.00711 **
fnc_dmn10_sn26 -8.61529    3.63124  -2.373  0.02477 * 
timeto20mFU    -0.13692    0.04487  -3.051  0.00495 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.166 on 28 degrees of freedom
Multiple R-squared:  0.3199,    Adjusted R-squared:  0.2714 
F-statistic: 6.586 on 2 and 28 DF,  p-value: 0.004526
summ(a3h3a, confint=TRUE) # use jtools `summ` function to get confidence intervals
MODEL INFO:
Observations: 31
Dependent Variable: tot_icg_change
Type: OLS linear regression 

MODEL FIT:
F(2,28) = 6.59, p = 0.00
R² = 0.32
Adj. R² = 0.27 

Standard errors: OLS
--------------------------------------------------------------
                        Est.     2.5%    97.5%   t val.      p
-------------------- ------- -------- -------- -------- ------
(Intercept)            86.35    25.44   147.25     2.90   0.01
fnc_dmn10_sn26         -8.62   -16.05    -1.18    -2.37   0.02
timeto20mFU            -0.14    -0.23    -0.05    -3.05   0.00
--------------------------------------------------------------
# model diagnostics/assumption-checking:
plot_model(a3h3a, type = "diag")
[[1]]

[[2]]

[[3]]

[[4]]

plot(data_pl_fu$tot_icg_change ~ data_pl_fu$fnc_dmn10_sn26)

plot_model(a3h3a, type = "pred", terms = c("fnc_dmn10_sn26"), show.data=TRUE) + xlab("DMN mtl-SN dACC connectivity") + ylab("ICG change") + labs(title="Predicted ICG change scores")

DMN mtl-SN dACC FNC does continue to predict ICG scores at follow-up when time to follow up is included in the model.

icg <- subset(data_pl_fu, select=c(ID, tot_icg, timeto20mFU, tot_icg_change, group)) %>% mutate(time = rep("T1: study"))
icg_fu <- subset(data_pl_fu, select=c(ID, tot_icg_20mFU,tot_icg_change, group)) %>% rename(tot_icg = tot_icg_20mFU) %>% mutate(time = rep("T2: follow-up"))
change <- bind_rows(icg, icg_fu) %>% mutate(ID=as.factor(ID))
# Plot trajectories
ggplot(data = change, aes(x = time, y = tot_icg, group = ID, color=group)) +
  geom_hline(yintercept=25, linetype="dashed", color="light blue 4", size=.5) + 
  geom_hline(yintercept=22.79, linetype="dotted", color="dark grey", size=.5) + 
  geom_hline(yintercept=15.45, linetype="dotted", color="dark grey", size=.5) +
  geom_point() + geom_line() + 
 annotate("text", label = "Clinical cutoff", x = .55, y = 27, size = 3, colour = "light blue 4", fontface = "italic") + 
 annotate("text", label = "Study M = 22.78", x = .74, y = 21, size = 3, colour = "dark grey") +
 annotate("text", label = "Follow-up M = 15.45", x = .74, y = 14, size = 3, colour = "dark grey")

mean(data_pl$tot_icg) 
[1] 22.78947
mean(data_pl_fu$tot_icg) 
[1] 20.25806
mean(data_pl_fu$tot_icg_20mFU) 
[1] 15.45161

Descriptives (Methods)

# read in data
data <- readRDS("/Users/sarenseeley/Dropbox/Dissertation/Non-fMRI data analysis/master_with_static_FNC.rds")

# make a placebo session-only dataset to get rid of duplicate observations per person,
# which change the descriptive stats
data_pl <- data %>% filter(tx == "placebo")

# also make an oxytocin session dataset while we're at it
data_ot <- data %>% filter(tx == "oxytocin")

NCG vs CG descriptives (Results; Table 1)

Time-invariant variables

count(data_pl,group) # n in each group
count(data_pl_fu,group_20mFU) # n in each group at follow-up

# t-tests

## age
t.test(data_pl$age_yrs ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$age_yrs, group=data_pl$group)

## time since death
t.test(data_pl$timesincedeath ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$timesincedeath, group=data_pl$group)

## relationship length
t.test(data_pl$yrs_together ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$yrs_together, group=data_pl$group)

## total n prescription medications
t.test(data_pl$meds_total ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$meds_total, group=data_pl$group)

## BDI
t.test(data_pl$tot_icg ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$tot_icg, group=data_pl$group)

## ICG
t.test(data_pl$tot_bdi ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$tot_bdi, group=data_pl$group)

## ICG at follow-up
t.test(data_pl$tot_icg_20mFU ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)

describeBy(data_pl$tot_icg, group=data_pl$group)
describeBy(data_pl$tot_icg_20mFU, group=data_pl$group)
bi.bars(data_pl, "tot_icg_20mFU", "group")

No significant difference in age, length of relationship, time since death, or total number of prescription meds. Unsurprisingly, the CG group has higher mean BDI and ICG scores.

# chi-square tests

## sex
chisq.test(data_pl$group, y = data_pl$sex_m, correct = FALSE, simulate.p.value = TRUE) 
# use the simulated p value because if you don't, with small cell sizes, many of the expected values will be very small 
# and therefore the approximations of p may not be correct (R will warn you about this)
data_pl %>% group_by(group) %>%
  count(sex_m) %>%
  mutate(`(\\%)` = prop.table(n)*100)

## race
chisq.test(data_pl$group, y = data_pl$race, correct = FALSE, simulate.p.value = TRUE)
data_pl %>% group_by(group) %>%
  count(race) %>%
  mutate(`(\\%)` = prop.table(n)*100)

## ethnicity
chisq.test(data_pl$group, y = data_pl$ethnicity_hisp, correct = FALSE, simulate.p.value = TRUE)
data_pl %>% group_by(group) %>%
  count(ethnicity_hisp) %>%
  mutate(`(\\%)` = prop.table(n)*100)

## education (college grad vs. less than college degree)
chisq.test(data_pl$group, y = data_pl$education_collegegrad, correct = FALSE)
data_pl %>% group_by(group) %>%
  count(education_collegegrad) %>%
  mutate(`(\\%)` = prop.table(n)*100)

## employment (retired vs. still working full/part-time or looking for work)
chisq.test(data_pl$group, y = data_pl$employment_retired, correct = FALSE, simulate.p.value = TRUE)
data_pl %>% group_by(group) %>%
  count(employment_retired) %>%
  mutate(`(\\%)` = prop.table(n)*100)

## psychoactive meds (yes/no)
chisq.test(data_pl$group, y = data_pl$meds_psychoactive, correct = FALSE, simulate.p.value = TRUE)
data_pl %>% group_by(group) %>%
  count(meds_psychoactive) %>%
  mutate(`(\\%)` = prop.table(n)*100)

## hormone or opiate meds (yes/no)
chisq.test(data_pl$group, y = data_pl$meds_hormone_opiate, correct = FALSE)
data_pl %>% group_by(group) %>%
  count(meds_hormone_opiate) %>%
  mutate(`(\\%)` = prop.table(n)*100)

## order of sessions (B first vs. A first)
chisq.test(data_pl$group, y = data_pl$tx_v1, correct = FALSE)
data_pl %>% group_by(group) %>%
  count(tx_v1) %>%
  mutate(`(\\%)` = prop.table(n)*100)

No significant group differences in the frequencies, though the CG group does have a higher proportion of men and the NCG has a higher proportion of people taking hormones (not HRT - this category includes things like levothyroxine, insulin, etc.) or opiate medications (n=1). I suspect this is confounded with the imbalance in sex between the two groups (i.e., more women being treated for low thyroid).

bi.bars(data_pl, "meds_hormone_opiate", "group", main="Non-HRT hormone & opiate meds by group (NCG, CG)", zero=FALSE) 
# on the y-axis, 1 = No, 2 = Yes, taking

table(data_pl$meds_hormone_opiate, data_pl$sex_m, data_pl$group)

State variables by group

# t-tests

### PANAS
## pre PANAS NA (placebo)
t.test(data_pl$tot_pre_panas_na ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$tot_pre_panas_na, group=data_pl$group)

## pre PANAS NA (oxytocin)
t.test(data_ot$tot_pre_panas_na ~ data_ot$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_ot$tot_pre_panas_na, group=data_ot$group)

## pre PANAS PA (placebo)
t.test(data_pl$tot_pre_panas_pa ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$tot_pre_panas_pa, group=data_pl$group)

## pre PANAS PA (oxytocin)
t.test(data_ot$tot_pre_panas_pa ~ data_ot$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_ot$tot_pre_panas_pa, group=data_ot$group)


### STAI-S
## pre STAI (placebo)
t.test(data_pl$tot_pre_stai ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$tot_pre_stai, group=data_pl$group)

## pre STAI (oxytocin)
t.test(data_ot$tot_pre_stai ~ data_ot$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_ot$tot_pre_stai, group=data_ot$group)

## post STAI (placebo)
t.test(data_pl$tot_post_stai ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$tot_post_stai, group=data_pl$group)

## post STAI (oxytocin)
t.test(data_ot$tot_post_stai ~ data_ot$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_ot$tot_post_stai, group=data_ot$group)


### Framewise displacement
## mean framewise displacement (placebo session)
t.test(data_pl$fd_mean ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$fd_mean, group=data_pl$group)

## mean framewise displacement (oxytocin session)
t.test(data_ot$fd_mean ~ data_ot$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_ot$fd_mean, group=data_ot$group)


### Time to rest
## mean time to resting state start (placebo session)
t.test(data_pl$timetorest ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_pl$timetorest, group=data_pl$group)

## mean time to resting state start (oxytocin session)
t.test(data_ot$timetorest ~ data_ot$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)
describeBy(data_ot$timetorest, group=data_ot$group)

### Thought content 
# spouse related (%), non-spouse related (%)

t.test(data_pl$focus_spouse_perc ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data_pl$focus_nonspouse_perc ~ data_pl$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data_ot$focus_spouse_perc ~ data_ot$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data_ot$focus_nonspouse_perc ~ data_ot$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data$focus_spouse_perc ~ data$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data$focus_nonspouse_perc ~ data$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)

At the placebo session, the groups differ on tot_pre_stai & tot_pre_panas_na (CG > NCG).

At the oxytocin session, the groups differ on tot_pre_stai & tot_pre_panas_na (CG > NCG).

Mean framewise displacement and time elapsed from spray admin. to resting state do not significantly differ at either session. However, the NCG group overall has more movement than the CG group during the oxytocin session (p = .077), and it may make sense to control for this.

Percent of spouse-related or non-spouse-related thought content doesn’t differ by group at either session, but when collapsing across session, the CG group tends to report more spouse-related content, p = .08.

OT vs. PL (state variables)

# by treatment
describe(data$timetorest)
t.test(data$timetorest ~ data$tx,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data$timetorest ~ data$group,
       alternative = c("two.sided"),
       mu = 0, paired = FALSE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data$fd_mean ~ data$tx,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data$tot_pre_panas_na ~ data$tx,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data$tot_pre_panas_pa ~ data$tx,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data$tot_pre_stai ~ data$tx,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data$tot_post_panas_na ~ data$tx,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data$tot_post_panas_pa ~ data$tx,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data$tot_post_stai ~ data$tx,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

# D115 is missing post-scan SROE at one session, so test the SROE variables after removing their case
data_no115 <- data %>% filter(ID != "D115")
t.test(data_no115$focus_spouse_perc ~ data_no115$tx,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

t.test(data_no115$focus_nonspouse_perc ~ data_no115$tx,
       alternative = c("two.sided"),
       mu = 0, paired = TRUE, var.equal = FALSE,
       conf.level = 0.95)

Only pre-scan STAI differs by tx, as shown below. People are generally more anxious before the OT session (although from the descriptives below, it doesn’t look like this should be a significant difference. Hmm.)

describeBy(data$tot_pre_stai, group=data$tx)
histBy(data, "tot_pre_stai", "tx")
bi.bars(data, "tot_pre_stai", "tx", main="pre-scan STAI by session (PL, OT)", zero=FALSE)

Conclusions (covariate identification) ?

Models should definitely include tot_bdi as a predictor, and possibly pre-scan negative affect and anxiety (tot_pre_panas_na, tot_pre_stai), as the two groups differ in these. May also want to consider including fd_mean, as the NCG group on average moved a bit more during the OT session compared to the CG group (p < .077).

Maybe age as well, since that and framewise displacement/motion overall are known to impact FNC?

For the analyses involving data from the oxytocin session, include age and sex based on the Ebner paper?

But, my analyses aren’t using group, so…?

LS0tCnRpdGxlOiAiU3RhdGljIEZOQyBhbmFseXNlcyBmb3IgZGlzc2VydGF0aW9uIgphdXRob3I6ICJTYXJlbiBTZWVsZXkiCmRhdGU6ICJMYXN0IHVwZGF0ZWQgMDctMjMtMjAxOSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogbm8KICAgIHRvY19mbG9hdDogeWVzCiAgICB0aGVtZTogImRlZmF1bHQiCi0tLQoKIyBTZXQgdXAgZm9yIHN0YXRpYyBGTkMgYW5hbHlzZXMKCiMjIyBFeHRyYWN0aW5nIEZOQ3MKU2VlIE1hdGxhYiBzY3JpcHQgYGdldF9GTkNfY29ycnMubWAgdW5kZXIgYH4vcmVzdGluZ3N0YXRlL2RhdGEvZGVyaXZhdGl2ZXMvZ2lmdC9hbmFseXNlcy1kaXNzZXJ0YXRpb24vYmF0Y2gtanVsLTE5YC4KCiMjIyBMb2FkIHBhY2thZ2VzCmBgYHtyIHNldHVwfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwc3ljaCkKbGlicmFyeShzalBsb3QpCmxpYnJhcnkoc2ptaXNjKQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkoanRvb2xzKQpsaWJyYXJ5KG1lZGlhdGlvbikKbGlicmFyeShlZmZlY3RzKQpsaWJyYXJ5KHJlZ2hlbHBlcikKc2VsZWN0IDwtIGRwbHlyOjpzZWxlY3QKZmlsdGVyIDwtIGRwbHlyOjpmaWx0ZXIKYGBgCiMjIyBJbXBvcnQgc3RhdGljIEZOQyBkYXRhCmBgYHtyfQojIHJlYWQgaW4gc3RhdGljIEZOQyBzdGF0cwojIyBGTkMgPSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGEgcGFpciBvZiBJQ3MKZm5jX3BsIDwtIHJlYWQuY3N2KCIvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9EaXNzZXJ0YXRpb24vZk1SSSBkYXRhIGFuYWx5c2lzL2RhdGEvZm5jX2NvcnJzX25ldHdvcmtzX3BsLmNzdiIpCmZuY19vdCA8LSByZWFkLmNzdigiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvRGlzc2VydGF0aW9uL2ZNUkkgZGF0YSBhbmFseXNpcy9kYXRhL2ZuY19jb3Jyc19uZXR3b3Jrc19vdC5jc3YiKQoKIyByZWFkIGluIHN1YmplY3QgSURzCnN1YmogPC0gcmVhZC5jc3YoIi9Vc2Vycy9zYXJlbnNlZWxleS9Ecm9wYm94L0Rpc3NlcnRhdGlvbi9mTVJJIGRhdGEgYW5hbHlzaXMvZGF0YS9zdWJqLmNzdiIsIGhlYWRlcj1GKQoKc3ViaiA8LSBzdWJqICU+JSAgdHJhbnNtdXRlKElEID0gYXMuY2hhcmFjdGVyKHN1YmokVjEpKQpzdWJqJElEIDwtIHBhc3RlMCgnRCcsIHN1YmokSUQpICMgYWRkIHRoZSAiRCIgdG8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggdGhlIG1hc3RlciBkYXRhc2V0IGFuZCBvdGhlciBkYXRhCgojIGRyb3AgdGhlICJwbC9vdCIgc3VmZml4IGFuZCBhZGQgYSBuZXcgY29sdW1uICJ0eCIgZm9yIHRoZSBsb25nIGRhdGFmcmFtZQpmbmNfcGwgPC0gZm5jX3BsICU+JQogICByZW5hbWVfYWxsKC5mdW5zID0gZnVucyhzdWIoIlxcX3BsIiwgIiIsIG5hbWVzKGZuY19wbCkpKSkKZm5jX3BsJHR4IDwtICJwbGFjZWJvIgpuYW1lcyhmbmNfcGwpCmZuY19wbCA8LSBiaW5kX2NvbHMoc3ViaiwgZm5jX3BsKSAjIGFkZCB0aGUgIklEIiB2YXJpYWJsZQoKIyBkcm9wIHRoZSAicGwvb3QiIHN1ZmZpeCBhbmQgYWRkIGEgbmV3IGNvbHVtbiAidHgiIGZvciB0aGUgbG9uZyBkYXRhZnJhbWUKZm5jX290IDwtIGZuY19vdCAlPiUKICAgcmVuYW1lX2FsbCguZnVucyA9IGZ1bnMoc3ViKCJcXF9vdCIsICIiLCBuYW1lcyhmbmNfb3QpKSkpCmZuY19vdCR0eCA8LSAib3h5dG9jaW4iCm5hbWVzKGZuY19vdCkKZm5jX290IDwtIGJpbmRfY29scyhzdWJqLCBmbmNfb3QpICMgYWRkIHRoZSAiSUQiIHZhcmlhYmxlCgojIGNyZWF0ZSB0aGUgbG9uZyBGTkMgZGF0YWZyYW1lCmxvbmdfZm5jIDwtIGJpbmRfcm93cyhmbmNfcGwsIGZuY19vdCkKCmxvbmdfZm5jJFggPC0gTlVMTCAjIHJlbW92ZSB0aGUgIlgiIHZhcmlhYmxlCiMgc2hvdWxkIGhhdmUgNzYgKDM4IHN1YmplY3RzKjIgc2Vzc2lvbnMpIG9ic2VydmF0aW9ucyBvZiAzMCB2YXJpYWJsZXMgKDI4IElDIHBhaXJzICsgSUQgKyB0eCkKYGBgCgojIyMgSW1wb3J0IGFkZGl0aW9uYWwgdmFyaWFibGVzCgojIyMjIFN0YXRlIHZhcmlhYmxlcwpUaGVzZSBpbmNsdWRlIG1lYW4gZnJhbWV3aXNlIGRpc3BsYWNlbWVudCwgdGltZSBlbGFwc2VkIGZyb20gc3ByYXkgYWRtaW5pc3RyYXRpb24gdG8gd2hlbiB0aGUgcmVzdGluZyBzdGF0ZSBzZXF1ZW5jZSBiZWdhbiwgUEFOQVMsIFNUQUktUywgInN1YmplY3RpdmUgcmF0aW5nIG9mIGV4cGVyaWVuY2UiIHBvc3Qtc2NhbiBxdWVzdGlvbnMuCmBgYHtyfQojIHJlYWQgaW4gTVJRQyBncm91cCBzdGF0cyB0byBnZXQgbWVhbiBGRCAKbWVhbmZkIDwtIHJlYWRfdHN2KCJ+L0Rlc2t0b3AvcmVzdGluZ3N0YXRlL2RhdGEvZGVyaXZhdGl2ZXMvbXJpcWMvZ3JvdXBfYm9sZC50c3YiLCBjb2xfbmFtZXMgPSBUUlVFLCBjb2xfdHlwZXM9Y29sc19vbmx5KAogIGJpZHNfbmFtZQk9IGNvbF9jaGFyYWN0ZXIoKSwKICBmZF9tZWFuCT0gY29sX251bWJlcigpKSkKCiMgc3BsaXQgdXAgbWVhbmZkIGJ5IHNlc3Npb24KbWVhbmZkX3BsIDwtIGRwbHlyOjpmaWx0ZXIobWVhbmZkLCBncmVwbCgic2VzLXR4QSIsYmlkc19uYW1lKSkKbWVhbmZkX290IDwtIGRwbHlyOjpmaWx0ZXIobWVhbmZkLCBncmVwbCgic2VzLXR4QiIsYmlkc19uYW1lKSkKCiMgdGhlbiByZW5hbWUgZm9yIG1lcmdpbmcgd2l0aCBtYXN0ZXIgZGF0YXNldCB2YXJpYWJsZXMKbWVhbmZkX3BsIDwtIHJlbmFtZShtZWFuZmRfcGwsIElEID0gYmlkc19uYW1lKQptZWFuZmRfcGwkdHggPC0gInBsYWNlYm8iCgptZWFuZmRfb3QgPC0gcmVuYW1lKG1lYW5mZF9vdCwgSUQgPSBiaWRzX25hbWUpIAptZWFuZmRfb3QkdHggPC0gIm94eXRvY2luIgoKbWVhbmZkX3BsIDwtIG11dGF0ZV9pZih0aWJibGU6OmFzX3RpYmJsZShtZWFuZmRfcGwpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5jaGFyYWN0ZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCwgcGF0dGVybiA9ICJzdWItIiwgcmVwbGFjZW1lbnQgPSAiRCIpCm1lYW5mZF9wbCA8LSBtdXRhdGVfaWYodGliYmxlOjphc190aWJibGUobWVhbmZkX3BsKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2hhcmFjdGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwsIHBhdHRlcm4gPSAiX3Nlcy10eEFfdGFzay1yZXN0X2JvbGQiLCByZXBsYWNlbWVudCA9ICIiKQoKbWVhbmZkX290IDwtIG11dGF0ZV9pZih0aWJibGU6OmFzX3RpYmJsZShtZWFuZmRfb3QpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcy5jaGFyYWN0ZXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbCwgcGF0dGVybiA9ICJzdWItIiwgcmVwbGFjZW1lbnQgPSAiRCIpCm1lYW5mZF9vdCA8LSBtdXRhdGVfaWYodGliYmxlOjphc190aWJibGUobWVhbmZkX290KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2hhcmFjdGVyLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwsIHBhdHRlcm4gPSAiX3Nlcy10eEJfdGFzay1yZXN0X2JvbGQiLCByZXBsYWNlbWVudCA9ICIiKQoKbG9uZ19tZWFuZmQgPC0gYmluZF9yb3dzKG1lYW5mZF9vdCwgbWVhbmZkX3BsKQoKIyByZWFkIGluIG1hc3RlciBkYXRhc2V0CmRhdGEgPC0gcmVhZFJEUygifi9Ecm9wYm94L0dMQVNTIExhYi9PVCBTdHVkeS9kYXRhL21hc3Rlci1kYXRhc2V0L290LWZtcmlfbWFzdGVyLWRhdGFzZXRfMDIwNzE5LnJkcyIpIAoKIyBub3RlIHRoYXQgdGhlc2UgZGF0YSBhcmUgaW4gd2lkZSBmb3JtYXQKIyBpbiBwYXJ0aWN1bGFyLCBuZWVkIHRvIHB1bGwgb3V0IHRoZSBzdGF0ZSB2YXJpYWJsZXMgYW5kIGNvbWJpbmUgaW50byBvbmUgbG9uZyB2YXJpYWJsZSBhcyB3aXRoIG1lYW5mZCBhYm92ZQoKIyBwbGFjZWJvIHNlc3Npb246CnBsX3ZhcnMgPC0gc3Vic2V0KGRhdGEsIHNlbGVjdD1jKElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfcHJlX3BhbmFzX3BhX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wcmVfcGFuYXNfbmFfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90X3ByZV9zdGFpX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3BhbmFzX3BhX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3BhbmFzX25hX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3N0YWlfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXRvcmVzdF9BKSkKcGxfdmFycyR0eCA8LSAicGxhY2VibyIKCnBsX3ZhcnMgPC0gcGxfdmFycyAlPiUKICAgcmVuYW1lX2FsbCguZnVucyA9IGZ1bnMoc3ViKCJcXF9BIiwgIiIsIG5hbWVzKHBsX3ZhcnMpKSkpICMgcmVtb3ZlIHRoZSAiX0EiIGZyb20gY29sdW1uIG5hbWVzCgojIG94eXRvY2luIHNlc3Npb246Cm90X3ZhcnMgPC0gc3Vic2V0KGRhdGEsIHNlbGVjdD1jKElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfcHJlX3BhbmFzX3BhX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wcmVfcGFuYXNfbmFfQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90X3ByZV9zdGFpX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3BhbmFzX3BhX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3BhbmFzX25hX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3N0YWlfQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXRvcmVzdF9CKSkKb3RfdmFycyR0eCA8LSAib3h5dG9jaW4iCgpvdF92YXJzIDwtIG90X3ZhcnMgJT4lCiAgIHJlbmFtZV9hbGwoLmZ1bnMgPSBmdW5zKHN1YigiXFxfQiIsICIiLCBuYW1lcyhvdF92YXJzKSkpKSAjIHJlbW92ZSB0aGUgIl9CIiBmcm9tIGNvbHVtbiBuYW1lcwoKIyBiaW5kIHRoZSBveHl0b2NpbiBhbmQgcGxhY2VibyBzZXNzaW9uIGRhdGEgdG9nZXRoZXIgaW50byBsb25nIGZvcm1hdApsb25nX3N0YXRlIDwtIGJpbmRfcm93cyhwbF92YXJzLCBvdF92YXJzKQoKIyBtZXJnZSB0aGUgc3RhdGUgdmFyaWFibGVzIHdpdGggbWVhbiBGRCBieSBJRCBhbmQgdHgKbG9uZ19zdGF0ZSA8LSBsZWZ0X2pvaW4obG9uZ19zdGF0ZSwgbG9uZ19tZWFuZmQsIGJ5PWMoIklEIiwgInR4IikpCgpsb25nX3N0YXRlX2ZuYyA8LSBsZWZ0X2pvaW4obG9uZ19mbmMsIGxvbmdfc3RhdGUsIGJ5PWMoIklEIiwgInR4IikpCmxvbmdfc3RhdGVfZm5jIDwtIGxvbmdfc3RhdGVfZm5jICU+JSBtdXRhdGUodHggPSByZWNvZGVfZmFjdG9yKHR4LCAicGxhY2VibyIgPSAicGxhY2VibyIsICJveHl0b2NpbiIgPSAib3h5dG9jaW4iLCAub3JkZXJlZCA9IFRSVUUpKQpgYGAKCiMjIyMgVGhvdWdodCBjb250ZW50IChwb3N0LXNjYW4gcmVwb3J0cykgCgpgYGB7cn0KIyMjIFNlbGYtcmVwb3J0ZWQgcG9zdC1zY2FuIHRob3VnaHRzCiMgdXNpbmcgdGhlICUgb2YgY29udGVudCB0aGF0IHdhcyBzcG91c2UvZGVhdGgtcmVsYXRlZCBmcm9tIHRoZWlyIHBvc3Qgc2NhbiByZXBvcnRzIGFzIGEgdmVyeSBpbXBlcmZlY3QgbWVhc3VyZSBvZiBydW1pbmF0aXZlIGNvbnRlbnQgZm9yIEFpbSAxIEgzCiMgKHRoaXMgd2lsbCBwcm9iYWJseSBjaGFuZ2UpCgpydW1QTCA8LSByZWFkLmNzdigiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvR3JhbnRzXCBhbmRcIEFwcGxpY2F0aW9ucy9OUlNBXCBGMzFcIDIwMTgtMjAxOS9SZXN1Ym1pc3Npb25cIFJldmlld3MvcG93ZXItYW5hbHlzaXMvcnVtaW5hdGlvbl90eEEuY3N2IikgIyBwbGFjZWJvCnJ1bU9UIDwtIHJlYWQuY3N2KCIvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9HcmFudHNcIGFuZFwgQXBwbGljYXRpb25zL05SU0FcIEYzMVwgMjAxOC0yMDE5L1Jlc3VibWlzc2lvblwgUmV2aWV3cy9wb3dlci1hbmFseXNpcy9ydW1pbmF0aW9uX3R4Qi5jc3YiKSAjIG94eXRvY2luCgojIHJlbmFtZSBwb3N0X3Nyb2UgdmFyaWFibGVzIGZvciBiaW5kaW5nIHJvd3MgYW5kIG1ha2UgZmFjdG9ycyBpbnRvIGNoYXJhY3RlcnMgCiMgKG90aGVyd2lzZSB0aGV5IGdldCBhbGwgc2NyZXdlZCB1cCwgdy93YXJuaW5nICJVbmVxdWFsIGZhY3RvciBsZXZlbHM6IGNvZXJjaW5nIHRvIGNoYXJhY3RlcmJpbmRpbmcgY2hhcmFjdGVyIGFuZCBmYWN0b3IgdmVjdG9yIikKcnVtUEwgPC0gcnVtUEwgJT4lIHJlbmFtZShwb3N0X3Nyb2VfMSA9IHBvc3Rfc3JvZV8xX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zcm9lXzIgPSBwb3N0X3Nyb2VfMl9BKSAlPiUgbXV0YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgPSBhcy5jaGFyYWN0ZXIoSUQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggPSBhcy5jaGFyYWN0ZXIodHgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zcm9lXzEgPSBhcy5jaGFyYWN0ZXIocG9zdF9zcm9lXzEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zcm9lXzIgPSBhcy5jaGFyYWN0ZXIocG9zdF9zcm9lXzIpCiAgICAgICAgICAgICAgICApICU+JSAgbXV0YXRlKElEID0gc3RyX3JlcGxhY2UoSUQsICJzdWItIiwgIkQiKSkgIyByZXBsYWNlICJzdWItIiBwcmVmaXggaW4gSUQgdG8gIkQiIHNvIHRoYXQgdGhlIElEIHZhcmlhYmxlcyBtYXRjaCBhY3Jvc3MgZGF0YWZyYW1lcyB0byBtZXJnZSBsYXRlcgpydW1QTCRYIDwtIE5VTEwKCnJ1bU9UIDwtIHJ1bU9UICU+JSByZW5hbWUocG9zdF9zcm9lXzEgPSBwb3N0X3Nyb2VfMV9CLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3JvZV8yID0gcG9zdF9zcm9lXzJfQikgJT4lIG11dGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElEID0gYXMuY2hhcmFjdGVyKElEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4ID0gYXMuY2hhcmFjdGVyKHR4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3JvZV8xID0gYXMuY2hhcmFjdGVyKHBvc3Rfc3JvZV8xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3JvZV8yID0gYXMuY2hhcmFjdGVyKHBvc3Rfc3JvZV8yKQogICAgICAgICAgICAgICAgICAgICAgICAgICkgJT4lCiAgbXV0YXRlKElEID0gc3RyX3JlcGxhY2UoSUQsICJzdWItIiwgIkQiKSkgIyByZXBsYWNlICJzdWItIiBwcmVmaXggaW4gSUQgdG8gIkQiIHNvIHRoYXQgdGhlIElEIHZhcmlhYmxlcyBtYXRjaCBhY3Jvc3MgZGF0YWZyYW1lcyB0byBtZXJnZSBsYXRlcgpydW0gPC0gYmluZF9yb3dzKHJ1bVBMLCBydW1PVCkgCgojIHJlY29kZSAidHgiIHZhcmlhYmxlIApydW0gPC0gcnVtICU+JSBtdXRhdGUodHggPSByZWNvZGVfZmFjdG9yKHR4LCAidHhBIiA9ICJwbGFjZWJvIiwgInR4QiIgPSAib3h5dG9jaW4iLCAub3JkZXJlZCA9IFRSVUUpKQoKIyMgdGhpcyB3aWxsIG9ubHkgYmUgNzUgb2JzZXJ2YXRpb25zLCBub3QgNzYsIGJlY2F1c2Ugb2YgdGhlIG9uZSBwYXJ0aWNpcGFudCAoRDExNSkgd2hvIHJlY2VpdmVkIHRoZSBwcmUtc2NhbiBRdWFsdHJpY3MgaW5zdGVhZCBvZiB0aGUgcG9zdC1zY2FuIFF1YWx0cmljcyBhdCBvbmUgdmlzaXQsIHNvIHdlIGhhdmUgcG9zdCBQQU5BUyBhbmQgU1RBSSBidXQgbm90IFNST0UgcmVzcG9uc2VzIGZyb20gaGltIGF0IHRoZSBveHl0b2NpbiBzZXNzaW9uCgojIGNyZWF0ZSBjb21wb3NpdGUgdmFyaWFibGVzIGZvciAoMSkgZm9jdXMgb24gc3BvdXNlIGluIHBvc3Qtc2NhbiByZXNwb25zZXMsIGFuZCAoMikgb2YgYWxsIG9mIHRoZSB0aGluZ3MgdGhleSByZXBvcnRlZCB0aGlua2luZyBhYm91dCwgd2hhdCAlIG9mIHdoYXQgdGhleSBtZW50aW9uZWQgd2FzIHJlbGF0ZWQgdG8gdGhlaXIgc3BvdXNlL2RlYXRoPwpydW0kZm9jdXNfc3BvdXNlIDwtIChydW0kc3BvdXNlXzErcnVtJHNwb3VzZV8yKSAKcnVtJGZvY3VzX3Rhc2sgPC0gKHJ1bSR0YXNrXzErcnVtJHRhc2tfMikgCnJ1bSRmb2N1c193aG90byA8LSAocnVtJHdob3RvXzErcnVtJHdob3RvXzIpIApydW0kZm9jdXNfb3RoZXJwaWNzIDwtIChydW0kb3RoZXJwaWNzXzErcnVtJG90aGVycGljc18yKSAKcnVtJGZvY3VzX2FsbCA8LSAocnVtJHNwb3VzZV8xK3J1bSRzcG91c2VfMitydW0kdGFza18xK3J1bSR0YXNrXzIrcnVtJHdob3RvXzErcnVtJHdob3RvXzIrcnVtJG90aGVycGljc18xK3J1bSRvdGhlcnBpY3NfMitydW0kc29tYXRpY18xK3J1bSRzb21hdGljXzIrcnVtJG1ldGFjb2dfMStydW0kbWV0YWNvZ18yKQpydW0kZm9jdXNfc3BvdXNlX3BlcmMgPC0gKHJ1bSRmb2N1c19zcG91c2UvcnVtJGZvY3VzX2FsbCkgIyBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIHRoaW5ncyB0aGV5IHdlcmUgdGhpbmtpbmcgYWJvdXQsIHdoYXQgcHJvcG9ydGlvbiB3ZXJlIHJlbGF0ZWQgdG8gdGhlaXIgc3BvdXNlIGluIHNvbWUgd2F5IChwb3NpdGl2ZSBvciBuZWdhdGl2ZSk/CnJ1bSRmb2N1c19ub25zcG91c2VfcGVyYyA8LSAoMS0ocnVtJGZvY3VzX3Nwb3VzZV9wZXJjKSkgIyBvZiBhbGwgdGhlIHRvdGFsIG51bWJlciBvZiB0aGluZ3MgdGhleSB3ZXJlIHRoaW5raW5nIGFib3V0LCB3aGF0IHByb3BvcnRpb24gb2YgdGhvdWdodCBjb250ZW50IHdhcyBOT1QgcmVsYXRlZCB0byB0aGVpciBzcG91c2U/CgojIGRyb3AgZXh0cmFuZW91cyB2YXJpYWJsZXMKcnVtIDwtIHJ1bSAlPiUgZHBseXI6OnNlbGVjdCgtYyhwb3N0X3Nyb2VfMSwgc3BvdXNlXzEsIHRhc2tfMSwgd2hvdG9fMSwgb3RoZXJwaWNzXzEsIHNvbWF0aWNfMSwgbWV0YWNvZ18xLCBwb3N0X3Nyb2VfMiwgc3BvdXNlXzIsIHRhc2tfMiwgd2hvdG9fMiwgb3RoZXJwaWNzXzIsIHNvbWF0aWNfMiwgbWV0YWNvZ18yKSkKCiMgcmVwbGFjZSBOYU5zIChnZW5lcmF0ZWQgYnkgZGl2aWRpbmcgemVybyBieSB6ZXJvLCBmb3IgRDEyOSBwbGFjZWJvIHNlc3Npb24pIHdpdGggMApmaXhfbmFuIDwtIGZ1bmN0aW9uKHgpewogICAgeFtpcy5uYW4oeCldIDwtIDAKICAgIHgKfQpydW0kZm9jdXNfc3BvdXNlX3BlcmMgPC0gZml4X25hbihydW0kZm9jdXNfc3BvdXNlX3BlcmMpIApydW0kZm9jdXNfbm9uc3BvdXNlX3BlcmMgPC0gZml4X25hbihydW0kZm9jdXNfbm9uc3BvdXNlX3BlcmMpICAgCgoKIyBtZXJnZSB3aXRoIGRhdGEgZnJvbSBtYXN0ZXIgZGF0YXNldApsb25nX3N0YXRlX2ZuY19zcm9lIDwtIGxlZnRfam9pbihsb25nX3N0YXRlX2ZuYywgcnVtLCBieT1jKCJ0eCIsICJJRCIpKQpgYGAKCiMjIyMgVGltZS1pbnZhcmlhbnQgdmFyaWFibGVzClRoZXNlIGluY2x1ZGUgcGFydGljaXBhbnQgZGVtb2dyYXBoaWNzIGFuZCBjaGFyYWN0ZXJpc3RpY3MsIGFuZCB0cmFpdCBtZWFzdXJlcy4KCmBgYHtyfQojIHJlYWQgaW4gbWFzdGVyIGRhdGFzZXQKZGF0YSA8LSByZWFkUkRTKCJ+L0Ryb3Bib3gvR0xBU1MgTGFiL09UIFN0dWR5L2RhdGEvbWFzdGVyLWRhdGFzZXQvb3QtZm1yaV9tYXN0ZXItZGF0YXNldF8wMjA3MTkucmRzIikKCiMgYWRkIHRoZSB2YXJpYWJsZXMgZnJvbSB0aGUgbWFzdGVyIGRhdGFzZXQgdG8gdGhlIGxvbmcgZGF0YXNldCBjb250YWluaW5nIHRoZSBzdGF0ZSBhbmQgRk5DIHZhcmlhYmxlcywKIyBkcm9wcGluZyB0aGUgd2lkZS1mb3JtYXQgc3RhdGUgdmFyaWFibGVzIGFzIHdlbGwgYXMgc3RhcnRkYXRlICh3aGVuIHRoZXkgZGlkIHRoZSBRdWFsdHJpY3MpLCBET0IsIGFuZCBET0QKZGF0YSA8LSBzdWJzZXQoZGF0YSwgc2VsZWN0PS1jKHN0YXJ0ZGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlb2ZkZWF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzFfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc18yX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfM192MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzRfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc181X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfNl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzdfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc184X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfOV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzEwX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfMTFfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc18xMl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzEzX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfMTRfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc18xNV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzE2X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfMTdfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc18xOF92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzE5X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfMjBfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzFfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzJfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzNfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzRfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzVfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzZfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzdfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzhfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzlfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzEwX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8xMV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMTJfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzEzX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8xNF92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMTVfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzE2X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8xN192MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMThfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzE5X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8yMF92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90X3ByZV9wYW5hc19wYV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90X3ByZV9wYW5hc19uYV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMXJfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzJyX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV81cl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfOHJfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzEwcl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMTFyX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8xNXJfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzE2cl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMTlyX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8yMHJfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wcmVfc3RhaV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzFfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc18yX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfM192MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzRfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc181X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfNl92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzdfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc184X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfOV92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzEwX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfMTFfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc18xMl92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzEzX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfMTRfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc18xNV92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzE2X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfMTdfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9wYW5hc18xOF92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3BhbmFzXzE5X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfcGFuYXNfMjBfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzFfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzNfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzRfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzVfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzZfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzdfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzhfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzlfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzEwX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8xMV92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMTJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzEzX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8xNF92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMTVfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzE2X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8xN192MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMThfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzE5X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8yMF92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90X3ByZV9wYW5hc19wYV92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90X3ByZV9wYW5hc19uYV92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMXJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzJyX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV81cl92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfOHJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzEwcl92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMTFyX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8xNXJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9zdGFpXzE2cl92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX3N0YWlfMTlyX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVfc3RhaV8yMHJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wcmVfc3RhaV92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzJfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfcGFuYXNfM192MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc180X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzVfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfcGFuYXNfNl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc183X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzhfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfcGFuYXNfOV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xMF92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xMV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xMl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xM192MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xNF92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xNV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xNl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xN192MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xOF92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18xOV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18yMF92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzFfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8yX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfM192MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzRfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV81X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfNl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzdfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV84X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfOV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzEwX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTFfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xMl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzEzX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTRfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xNV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzE2X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTdfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xOF92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzE5X3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMjBfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3JvZV8xX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3Nyb2VfMl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zcm9lXzNfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3BhbmFzX3BhX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfcG9zdF9wYW5hc19uYV92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzFyX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMnJfdjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV81cl92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzhyX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTByX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTFyX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTVyX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTZyX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTlyX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMjByX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfcG9zdF9zdGFpX3YxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzFfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfcGFuYXNfMl92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc18zX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzRfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfcGFuYXNfNV92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc182X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzdfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfcGFuYXNfOF92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9wYW5hc185X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzEwX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzExX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzEyX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzEzX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzE0X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzE1X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzE2X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzE3X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzE4X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzE5X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3BhbmFzXzIwX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMV92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8zX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfNF92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzVfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV82X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfN192MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzhfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV85X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTBfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xMV92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzEyX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTNfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xNF92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzE1X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTZfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xN192MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzE4X3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMTlfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8yMF92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90X3Bvc3RfcGFuYXNfcGFfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3BhbmFzX25hX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfMXJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8ycl92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zdGFpXzVyX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3N0YWlfOHJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xMHJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xMXJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xNXJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xNnJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8xOXJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3RhaV8yMHJfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3N0YWlfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3JvZV8xX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X3Nyb2VfMl92MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zcm9lXzNfdjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV0b3Jlc3RfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXRvcmVzdF9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnQUFUX1JUX3Nwb3VzZV9wdWxsX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdBQVRfUlRfc3BvdXNlX3B1bGxfQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FBVF9SVF9zcG91c2VfcHVzaF9BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnQUFUX1JUX3Nwb3VzZV9wdXNoX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdBQVRfUlRfc3RyYW5nZXJfcHVsbF9BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnQUFUX1JUX3N0cmFuZ2VyX3B1bGxfQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FBVF9SVF9zdHJhbmdlcl9wdXNoX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdBQVRfUlRfc3RyYW5nZXJfcHVzaF9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnQUFUX1JUX3dob3RvX3B1bGxfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FBVF9SVF93aG90b19wdWxsX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdBQVRfUlRfd2hvdG9fcHVzaF9BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnQUFUX1JUX3dob3RvX3B1c2hfQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FBVF9SVF9uZXV0cmFsX3B1bGxfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FBVF9SVF9uZXV0cmFsX3B1bGxfQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FBVF9SVF9uZXV0cmFsX3B1c2hfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FBVF9SVF9uZXV0cmFsX3B1c2hfQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FBVF9SVF9kZWF0aF9wdWxsX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdBQVRfUlRfZGVhdGhfcHVsbF9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnQUFUX1JUX2RlYXRoX3B1c2hfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FBVF9SVF9kZWF0aF9wdXNoX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdBQVRfcHVzaF92MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0FBVF9wdXNoX3YyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfcHJlX3BhbmFzX3BhX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wcmVfcGFuYXNfbmFfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90X3ByZV9zdGFpX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3BhbmFzX3BhX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3BhbmFzX25hX0EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wb3N0X3N0YWlfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zcm9lXzFfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zcm9lXzJfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9zcm9lXzNfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ydGlzb2xfQkxfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ydGlzb2xfUFJfQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ydGlzb2xfUE9fQSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90X3ByZV9wYW5hc19wYV9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfcHJlX3BhbmFzX25hX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdF9wcmVfc3RhaV9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfcG9zdF9wYW5hc19wYV9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfcG9zdF9wYW5hc19uYV9CLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RfcG9zdF9zdGFpX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3JvZV8xX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3JvZV8yX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3Rfc3JvZV8zX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnRpc29sX0JMX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnRpc29sX1BSX0IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnRpc29sX1BPX0IpKSAKCiMgZHJvcCBEMTQyICYgRDE0Nywgd2hvIHdlcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN0aW5nIHN0YXRlIGZNUkkgZGF0YSBhbmFseXNpcyBkdWUgdG8gcG9vciBkYXRhIHF1YWxpdHkKZGF0YSA8LSBmaWx0ZXIoZGF0YSwgIWdyZXBsKCJEMTQyfEQxNDciLElEKSkKCiMgam9pbiB0aGUgZGF0YSBmcm9tIHRoZSBtYXN0ZXIgZGF0YXNldCB3aXRoIHRoZSBsb25nIGRhdGFzZXQgdy9GTkMgYW5kIHN0YXRlIHZhcmlhYmxlcwpkYXRhIDwtIGxlZnRfam9pbihkYXRhLCBsb25nX3N0YXRlX2ZuY19zcm9lLCBieT1jKCJJRCIpKSAKbWluKGRhdGEkdHgpICMgY2hlY2sgdGhhdCBsZXZlbHMgd2VyZSBzZXQgY29ycmVjdGx5IChjb25zb2xlIHNob3VsZCBkaXNwbGF5IExldmVsczogcGxhY2VibyA8IG94eXRvY2luKQoKIyBtYWtlIHZhcmlhYmxlcyBmb3IgcmV0aXJlZC9ub24tcmV0aXJlZDsgcG9zdC1ncmFkIGVkLiB2cy4gbm8gcG9zdC1ncmFkIGVkLgpkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZShlbXBsb3ltZW50X3JldGlyZWQgPSBhcy5mYWN0b3IoaWZlbHNlKGVtcGxveW1lbnQgPT0gInJldGlyZWQiLCAxLCAwKSksCiAgICAgICAgICAgICAgICAgICAgICAgIGVkdWNhdGlvbl9wb3N0Z3JhZCA9IHJlY29kZV9mYWN0b3IoZWR1Y2F0aW9uLCAibGVzcyB0aGFuIGhpZ2ggc2Nob29sIiA9ICJsZXNzIHRoYW4gcG9zdGdyYWQiLCAiaGlnaCBzY2hvb2wgZ3JhZCIgPSAibGVzcyB0aGFuIHBvc3RncmFkIiwgInNvbWUgY29sbGVnZSIgPSAibGVzcyB0aGFuIHBvc3RncmFkIiwgImNvbGxlZ2UgZ3JhZCIgPSAibGVzcyB0aGFuIHBvc3RncmFkIiwgIjEgeWVhciBncmFkIHNjaG9vbCIgPSAicG9zdGdyYWQiLCAiMiB5ZWFycyBncmFkIHNjaG9vbCIgPSAicG9zdGdyYWQiLCAiMyB5ZWFycyBncmFkIHNjaG9vbCIgPSAicG9zdGdyYWQiLCAiNCsgeWVhcnMgZ3JhZCBzY2hvb2wiID0gInBvc3RncmFkIiwgLm9yZGVyZWQgPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgZWR1Y2F0aW9uX2NvbGxlZ2VncmFkID0gcmVjb2RlX2ZhY3RvcihlZHVjYXRpb24sICJsZXNzIHRoYW4gaGlnaCBzY2hvb2wiID0gIjwgY29sbGVnZSBncmFkIiwgImhpZ2ggc2Nob29sIGdyYWQiID0gIjwgY29sbGVnZSBncmFkIiwgInNvbWUgY29sbGVnZSIgPSAiPCBjb2xsZWdlIGdyYWQiLCAiY29sbGVnZSBncmFkIiA9ICJjb2xsZWdlIGdyYWQiLCAiMSB5ZWFyIGdyYWQgc2Nob29sIiA9ICJjb2xsZWdlIGdyYWQiLCAiMiB5ZWFycyBncmFkIHNjaG9vbCIgPSAiY29sbGVnZSBncmFkIiwgIjMgeWVhcnMgZ3JhZCBzY2hvb2wiID0gImNvbGxlZ2UgZ3JhZCIsICI0KyB5ZWFycyBncmFkIHNjaG9vbCIgPSAiY29sbGVnZSBncmFkIiwgLm9yZGVyZWQgPSBUUlVFKSkKbGV2ZWxzKGRhdGEkZWR1Y2F0aW9uX2NvbGxlZ2VncmFkKQoKIyBtYWtlIGEgInRpbWUgc2luY2UgZGVhdGggaW4gbW9udGhzIiB2YXJpYWJsZQpkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZSh0aW1lc2luY2VkZWF0aF9tb24gPSB0aW1lc2luY2VkZWF0aC8zMC40MTcpCgojIG1lYW4tY2VudGVyIHRoZSBGTkNzIChhbnkgdmFyaWFibGUgc3RhcnRpbmcgd2l0aCAiZm5jIikKIyBhbmQgYWRkIHRoZSBzdWZmaXggIl9jbSIKbWVhbmNlbnQgPC0gZnVuY3Rpb24oeCkgeyB4IC0gbWVhbih4LCBuYS5ybT1UUlVFKSB9ICNzaW1wbGUgd29ya2VyIGZ1bmN0aW9uIHRvIG1lYW4gY2VudGVyIGEgdmFyaWFibGUKZGF0YSA8LSBkYXRhICU+JSBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiZm5jIikpLCBmdW5zKGNtPW1lYW5jZW50KSkKIyBhbHNvIG1lYW4tY2VudGVyIGFueSBjb250aW51b3VzIHZhcmlhYmxlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiBpbnRlcmFjdGlvbnMKZGF0YSA8LSBkYXRhICU+JSBtdXRhdGVfYXQodmFycygidG90X2JkaSIsICJ0b3RfaWNnIiwgImFnZV95cnMiLCAiZmRfbWVhbiIsICJ5cnNfdG9nZXRoZXIiLCAidGltZXNpbmNlZGVhdGhfbW9uIiksIGZ1bnMoY209bWVhbmNlbnQpKQoKIyBzYXZlIGFzIGFuIC5yZHMgZmlsZSBhbmQgYSBjc3YgZmlsZQpzYXZlUkRTKGRhdGEsICIvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9EaXNzZXJ0YXRpb24vTm9uLWZNUkkgZGF0YSBhbmFseXNpcy9tYXN0ZXJfd2l0aF9zdGF0aWNfRk5DLnJkcyIpCndyaXRlX2NzdihkYXRhLCAiL1VzZXJzL3NhcmVuc2VlbGV5L0Ryb3Bib3gvRGlzc2VydGF0aW9uL05vbi1mTVJJIGRhdGEgYW5hbHlzaXMvbWFzdGVyX3dpdGhfc3RhdGljX0ZOQy5jc3YiKQoKIyBybShsaXN0PWxzKCkpIGNsZWFycyB0aGUgZ2xvYmFsIGVudmlyb25tZW50CgojIHNwbGl0IHVwIGJ5IHNlc3Npb24KZGF0YV9wbCA8LSBkYXRhICU+JSBmaWx0ZXIodHggPT0gInBsYWNlYm8iKQpkYXRhX290IDwtIGRhdGEgJT4lIGZpbHRlcih0eCA9PSAib3h5dG9jaW4iKQpgYGAKCiMjIyMgSXMgJSBzcG91c2UtcmVsYXRlZCB0aG91Z2h0IHJlbGF0ZWQgdG8gZ3JpZWYgc2V2ZXJpdHk/CmBgYHtyfQojIyMjIElzICUgc3BvdXNlLXJlbGF0ZWQgdGhvdWdodCByZWxhdGVkIHRvIGdyaWVmIHNldmVyaXR5PwpjPC1jb3JyLnRlc3QoZGF0YV9wbCR0b3RfaWNnLCBkYXRhX3BsJGZvY3VzX3Nwb3VzZV9wZXJjKQpjb3JyLnRlc3QoZGF0YV9wbCR0b3RfaWNnLCBkYXRhX3BsJGZvY3VzX25vbnNwb3VzZV9wZXJjKQoKCmdncGxvdFJlZ3Jlc3Npb24gPC0gZnVuY3Rpb24gKGZpdCkge2dncGxvdChmaXQkbW9kZWwsIGFlc19zdHJpbmcoeCA9IG5hbWVzKGZpdCRtb2RlbClbMl0sIHkgPSBuYW1lcyhmaXQkbW9kZWwpWzFdKSkgKyAKICBnZW9tX3BvaW50KCkgKwogIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiR3JpZWYgc2V2ZXJpdHkgKElDRyB0b3RhbCkiKSArCiAgICAgIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIlBlcmNlbnQgc3BvdXNlLXJlbGF0ZWQgdGhvdWdodCBjb250ZW50IikgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiQWRqIFIyID0gIixzaWduaWYoc3VtbWFyeShmaXQpJGFkai5yLnNxdWFyZWQsIDIpLAogICAgICAgICAgICAgICAgICAgICAiSW50ZXJjZXB0ID0iLHNpZ25pZihmaXQkY29lZltbMV1dLDQgKSwKICAgICAgICAgICAgICAgICAgICAgIiBTbG9wZSA9IixzaWduaWYoZml0JGNvZWZbWzJdXSwgNCksCiAgICAgICAgICAgICAgICAgICAgICIgUCA9IixzaWduaWYoc3VtbWFyeShmaXQpJGNvZWZbMiw0XSwgMikpKQp9CgoKZ2dwbG90UmVncmVzc2lvbihsbShkYXRhX3BsJHRvdF9pY2cgfiBkYXRhX3BsJGZvY3VzX3Nwb3VzZV9wZXJjKSkKCnBsb3QoZGF0YV9wbCR0b3RfaWNnLCBkYXRhX3BsJGZvY3VzX3Nwb3VzZV9wZXJjKQoKCmBgYAoKCiMgU3RhdGljIEZOQyByZXN1bHRzCgojIyBJQyBzZWxlY3Rpb24gZm9yIHN0YXRpYyBGTkMgYW5hbHlzZXMKPHA+CiFbXSgvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9HcmFudHMgYW5kIEFwcGxpY2F0aW9ucy9OUlNBIEYzMSAyMDE4LTIwMTkvUmVzdWJtaXNzaW9uIFJldmlld3MvcG93ZXItYW5hbHlzaXMvaHRtbC9yZXNlYXJjaC1zdHJhdGVneV9maWcyLnBuZykKPHA+Cj5fRmlndXJlIDIuIEh5cG90aGVzaXplZCBtYWpvciBuZXR3b3JrIGludGVyYWN0aW9ucyBpbiBjb21wbGljYXRlZCBncmllZiwgc2hvd2luZyB0aGUgZmxvdyBhbmQgY29udGVudCBvZiBzcG9udGFuZW91cyB0aG91Z2h0IGFzIHBvdGVudGlhbGx5IG1vcmUgYXV0b21hdGljYWxseSBjb25zdHJhaW5lZCBhbmQgbGVzcyB2YXJpYWJsZSBkdWUgdG8gKGEpIGxlc3NlciBpbmZsdWVuY2UgZnJvbSBleGVjdXRpdmUgY29udHJvbCByZWdpb25zIG92ZXIgZGVmYXVsdCBtb2RlIGluZmx1ZW5jZTI2LCAoYikgZ3JlYXRlciBpbmZsdWVuY2UgZnJvbSBkZWZhdWx0IG1vZGUgY29yZSBzdWJzeXN0ZW0gcmVnaW9uczQ4LCBhbmQgKGMpIGdyZWF0ZXIgaW5mbHVlbmNlIG9mIHRoZSBzYWxpZW5jZSBuZXR3b3JrIOKAkyBzbyB0aG91Z2h0cyBhcmUgaW50cnVzaXZlLCBpbmZsZXhpYmxlLCBhbmQgZml4YXRlZCBvbiB0aGUgbG9zcy5fCgpCYXNlZCBvbiBteSBtb2RlbCwgdGhlIGNvbm5lY3Rpb25zIHRoYXQgSSBzaG91bGQgY2FyZSBtb3N0IGFib3V0IGFyZSBETU48c3ViPmNvcmU8L3N1Yj4tRE1OPHN1Yj5tdGw8L3N1Yj4sIERNTjxzdWI+Y29yZTwvc3ViPi1TTiwgU04tZG9yc2FsIGF0dGVudGlvbiwgU04tRlBOLCBETU48c3ViPmNvcmU8L3N1Yj4tRlBOLCBhbmQgRlBOLWRvcnNhbCBhdHRlbnRpb24uIAoKVGhlcmUgd2FzIG5vIGRvcnNhbCBhdHRlbnRpb24gbmV0d29yayBjb21wb25lbnQgaW4gdGhlIGdJQ0EgcmVzdWx0cywgbGVhdmluZyAoQSkgRE1OPHN1Yj5jb3JlPC9zdWI+LURNTjxzdWI+bXRsPC9zdWI+LCAoQikgRE1OPHN1Yj5jb3JlPC9zdWI+LVNOLCAoQykgU04tRlBOLCBhbmQgKEQpIERNTjxzdWI+Y29yZTwvc3ViPi1GUE4gYXMgdGhlIGNvbm5lY3Rpb25zIG9mIGludGVyZXN0IHRoYXQgSSBjYW4gbG9vayBhdCBpbiB0aGlzIGRhdGFzZXQuIAoKZ0lDQSByZXN1bHRzIHlpZWxkZWQgNCBETU4gY29tcG9uZW50cywgd2l0aCBwZWFrcyBpbiB0aGUgUENDICgyNyksIHByZWN1bmV1cyAoMTMpLCBtT0ZDL3ZlbnRyYWwgc3RyaWF0dW0gKDIxKSwgYW5kIHJldHJvc3BsZW5pYWwgY29ydGV4ICgxMCkuIDI3IGFuZCAxMyBhcmUgbW9zdCByZXByZXNlbnRhdGl2ZSBvZiBETU48c3ViPmNvcmU8L3N1Yj4sIGFuZCAxMCBpcyBtb3N0IHJlcHJlc2VudGF0aXZlIG9mIERNTjxzdWI+bXRsPC9zdWI+LiAyMSBpcyBpbnRlcmVzdGluZy4uLnBlYWsgY291bGQgYWN0dWFsbHkgYmUgaW4gbnVjbGV1cyBhY2N1bWJlbnMsIGFuZCBhc3NvY2lhdGVkIE5ldXJvc3ludGggdG9waWMga2V5d29yZHMgYXJlIG1vc3RseSBzdHVmZiBpbiB0aGUgdmVpbiBvZiBzZWxmLXJlZmVyZW50aWFsLCBzb2NpYWwsIGFuZCB2YWx1ZS9yZXdhcmQuIAoKRm9yIHRoZSBmaW5hbCBETU4gY29tcG9uZW50cywgSSBzZWxlY3RlZCAyNyBhcyBtb3N0IGNsZWFybHkgRE1OPHN1Yj5jb3JlPC9zdWI+IGFuZCAxMCBhcyBtb3N0IGNsZWFybHkgRE1OPHN1Yj5tdGw8L3N1Yj4uIAoKZ0lDQSByZXN1bHRzIHlpZWxkZWQgb25lIHNhbGllbmNlIG5ldHdvcmsgY29tcG9uZW50LCBwcmltYXJpbHkgY2VudGVyZWQgb24gdGhlIGRBQ0MgKDI2KS4gVGhlcmUgaXMgYWxzbyBhbm90aGVyIGNvbXBvbmVudCB0aGF0J3MgYmFzaWNhbGx5IGFsbCBpbnN1bGEgKHBvc3RlcmlvciAmIGFudGVyaW9yKSB3aXRoIHRoZSBwZWFrIGluIHRoZSBhbnRlcmlvciBpbnN1bGEuIEkgY2xhc3NpZmllZCB0aGlzIGFzIFNOIGFzIHdlbGwuIEhvd2V2ZXIsIHRoZSBmQUxGRiBpcyBwcmV0dHkgbG93ICgyLjY1KSwgd2hlcmVhcyBhbGwgdGhlIG90aGVyIHNvbGlkbHkgImdvb2QiIGNvbXBvbmVudHMgaGF2ZSBmQUxGRiA+NC4yICh0aGUgImZBTEZGID4gNi4wIiIgcnVsZSBvZiB0aHVtYiBmb3IgYXJ0aWZhY3QgY3V0b2ZmIGlzIGRpZmZlcmVudCBnaXZlbiB0aGF0IElDQS1BUk9NQSBhbHJlYWR5IHJlbW92ZWQgYSBsb3Qgb2YgaGlnaCBmcmVxdWVuY3kgbm9pc2UpLgoKZ0lDQSByZXN1bHRzIHlpZWxkZWQgdHdvIEZQTiBjb21wb25lbnRzIHRoYXQgYm90aCBsb29rIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gdGhlIHZpc3Vvc3BhdGlhbCBuZXR3b3JrLiBJIHNlbGVjdGVkIDYgKFJpZ2h0KSB2cy4gMjcgKExlZnQpLCBiZWNhdXNlIDI3IGhhcyBzb21lIGV5ZWJhbGwgbW92ZW1lbnQgaW4gaXQgYW5kIG1hcHMgbW9yZSBzdHJvbmdseSB0byB0aGUgU3RhbmZvcmQgUlNOIHRlbXBsYXRlLiAKCihsb29rIEAgdGhpcyBhcnRpY2xlIGxhdGVyOiBodHRwczovL2FjYWRlbWljLm91cC5jb20vY2VyY29yL2FydGljbGUvMjgvMi83MjYvNDYzNzYwMiMxMTYzNzMxMzcpCgojIyMjIFNlbGVjdGVkIElDIHBhaXJzCgpSZWxldmFudCB0byBtb2RlbDoKCkludHJhLW5ldHdvcmsgY29ubmVjdGl2aXR5OgoKKiBETU48c3ViPmNvcmU8L3N1Yj4tRE1OPHN1Yj5tdGw8L3N1Yj4gKGBmbmNfZG1uMjdfZG1uMTBgKQoKSW50ZXItbmV0d29yayBjb25uZWN0aXZpdHk6CgoqIERNTjxzdWI+TVRMPC9zdWI+LVNOIChgZm5jX2RtbjEwX3NuMjZgKQoqIERNTjxzdWI+Y29yZTwvc3ViPi1TTiAoYGZuY19kbW4yN19zbjI2YCkKKiBTTi1GUE4gKGBmbmNfZnBuNl9zbjI2YCkKKiBETU48c3ViPmNvcmU8L3N1Yj4tRlBOIChgZm5jX2RtbjI3X2ZwbjZgKQoKCiMjIFN0YXRpYyBGTkMgQWltIDEsIGJhc2VkIG9uIE5SU0EgQWltIDEKPGNlbnRlcj4KXyoqRm9yIHRoZXNlLCB0aGUgSVZzIGFuZCBEVnMgc2hvdWxkIGJlIHN3YXBwZWQuIEl0IG1ha2VzIG1vcmUgc2Vuc2UgdGhhdCB3ZSB3b3VsZCBiZSBpbnRlcmVzdGVkIGluIHByZWRpY3RpbmcgZ3JpZWYgc2V2ZXJpdHkgKHdoaWNoIGhhcyBjbGluaWNhbCByZWxldmFuY2UpLCBhbmQgdGhpcyBhbHNvIGFsbG93cyBtZSB0byB1c2UgbXVsdGlwbGUgcHJlZGljdG9ycyB3aGljaCBpcyBpbXBvcnRhbnQgYmVjYXVzZSBJIGRvbid0IGhhdmUganVzdCBvbmUgRk5DIG9mIGludGVyZXN0LioqXwo8L2NlbnRlcj4KCj5BaW0gMS4gVG8gdGVzdCB3aGV0aGVyIGR5bmFtaWMgZnVuY3Rpb25hbCBjb25uZWN0aXZpdHkgdW5kZXIgcGxhY2VibyBkaWZmZXJzIGFtb25nIHdpZG93ZWQgb2xkZXIgYWR1bHRzIHdobyBhcmUgYWRqdXN0aW5nIHdlbGwsIHZlcnN1cyB0aG9zZSB3aG8gYXJlIGFkanVzdGluZyBwb29ybHkgKGkuZS4sIGNvbXBsaWNhdGVkIGdyaWVmKS4KCl8qKlF1ZXN0aW9uIDEuIElzIGdyaWVmIHNldmVyaXR5IGFzc29jaWF0ZWQgd2l0aCBmdW5jdGlvbmFsIGNvbm5lY3Rpdml0eSBiZXR3ZWVuIChhKSBETU5jb3JlLUZQTiwgKGIpIERNTm10bC1ETU5jb3JlLCBvciAoYykgRE1OY29yZS1TTj8qKl8KClN0YXRpYyBGTkMgQWltIDEuIFRvIHRlc3Qgd2hldGhlciBzdGF0aWMgZnVuY3Rpb25hbCBjb25uZWN0aXZpdHkgYmV0d2VlbiBtb2RlbC1yZWxldmFudCBJQyBwYWlycyBpcyBwcmVkaWN0ZWQgYnkvcHJlZGljdHMgKD8/PykgY29tcGxpY2F0ZWQgZ3JpZWYgc3ltcHRvbSBzZXZlcml0eS4KCj4qIEgxOiBDb21wbGljYXRlZCBncmllZiBzeW1wdG9tIHNldmVyaXR5IHdpbGwgcHJlZGljdCBsb3dlciB2YXJpYWJpbGl0eSBpbiBzcG9udGFuZW91cyB0aG91Z2h0IGZsb3cgb3ZlciB0aW1lLCBhcyBpbmRleGVkIGJ5IGZld2VyIGZ1bmN0aW9uYWwgY29ubmVjdGl2aXR5IHN0YXRlIHRyYW5zaXRpb25zIG92ZXIgdGhlIHJlc3Rpbmcgc3RhdGUgc2Nhbi4KCioqQWltIDEsIEgxOiBOb3QgcmVsZXZhbnQgdG8gc3RhdGljIEZOQy4qKgoKPiogSDI6IENvbXBsaWNhdGVkIGdyaWVmIHN5bXB0b20gc2V2ZXJpdHkgd2lsbCBwcmVkaWN0IGdyZWF0ZXIgYXV0b21hdGljIGNvbnN0cmFpbnRzIG9uIHRob3VnaHQgY29udGVudCwgYXMgaW5kZXhlZCBieSBtb3JlIGR3ZWxsIHRpbWUgaW4gc3RhdGVzIG9mIGRlZmF1bHQgbW9kZS1zYWxpZW5jZSBuZXR3b3JrIGludGVyY29ubmVjdGl2aXR5LgoKKipTdGF0aWMgQWltIDEsIEgyOiBDb21wbGljYXRlZCBncmllZiBzeW1wdG9tIHNldmVyaXR5IHdpbGwgcHJlZGljdC9iZSBwcmVkaWN0ZWQgYnkgc3Ryb25nZXIgY29ycmVsYXRpb24gYmV0d2VlbiBETU4gYW5kIFNOIElDIHBhaXIocykuKioKCj4qIEgzOiBSdW1pbmF0aXZlIGNvbnRlbnQgaW4gc2VsZi1yZXBvcnRlZCBwcmUtcmVzdGluZyBzdGF0ZSB0aG91Z2h0IGNvbnRlbnQgd2lsbCBtZWRpYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBncmllZiBzeW1wdG9tIHNldmVyaXR5IGFuZCBhdXRvbWF0aWMgY29uc3RyYWludHMgYXMgaW5kZXhlZCBieSBkd2VsbCB0aW1lIGluIHN0YXRlcyBvZiBkZWZhdWx0IG1vZGUtc2FsaWVuY2UgbmV0d29yayBpbnRlcmNvbm5lY3Rpdml0eS4KCl8qKlF1ZXN0aW9uIDIuIERvZXMgc3BvdXNlLXJlbGF0ZWQgdGhvdWdodCBjb250ZW50IG1lZGlhdGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGdyaWVmIHNldmVyaXR5IGNvbXBsaWNhdGVkIGdyaWVmIHN5bXB0b20gc2V2ZXJpdHkgYW5kIERNTi1TTiBGTkM/KipfCgoqKlN0YXRpYyBBaW0gMSwgSDI6IEhpZ2hlciBwcm9wb3J0aW9uIG9mIHNwb3VzZS1yZWxhdGVkIHRob3VnaHQgY29udGVudCB3aWxsIG1lZGlhdGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbXBsaWNhdGVkIGdyaWVmIHN5bXB0b20gc2V2ZXJpdHkgYW5kIERNTi1TTiBGTkMuKioKCiMjIyBRdWVzdGlvbiAxLiBJcyBncmllZiBzZXZlcml0eSBhc3NvY2lhdGVkIHdpdGggZnVuY3Rpb25hbCBjb25uZWN0aXZpdHkgYmV0d2VlbiAoYSkgRE1OY29yZS1GUE4sIChiKSBETU5tdGwtRE1OY29yZSwgb3IgKGMpIERNTmNvcmUtU04/IChwbGFjZWJvIHNlc3Npb24pCgojIyMjIFdpdGhpbi1uZXR3b3JrIEZOQwpgYGB7cn0KIyBGaXJzdCwgdGVzdCB3aXRoaW4tZGVmYXVsdCBuZXR3b3JrIEZOQwphMWgyYSA8LSBsbSh0b3RfaWNnIH4gZm5jX2RtbjI3X2RtbjEwLCBkYXRhPWRhdGFfcGwpCnN1bW1hcnkoYTFoMmEpCnN1bW0oYTFoMmEsIGNvbmZpbnQ9VFJVRSkgIyB1c2UganRvb2xzIGBzdW1tYCBmdW5jdGlvbiB0byBnZXQgY29uZmlkZW5jZSBpbnRlcnZhbHMKYGBgCmBmbmNfZG1uMjdfZG1uMTBgIGRpZCBub3QgcHJlZGljdCBgdG90X2ljZ2AgKDk1JSBDSSdzIC00LjcwLCAzMy42NykuIFRoZSBvdmVyYWxsIG1vZGVsIGZpdCB3YXMgbm90IHNpZ25pZmljYW50LCBGKDEsMzYpID0gMS43NywgcCA9IC4xOS4gCgojIyMjIEJldHdlZW4tbmV0d29yayBGTkMKYGBge3J9CiMgdGhlbiwgdGVzdCBiZXR3ZWVuLW5ldHdvcmsgRk5DCmExaDJiIDwtIGxtKHRvdF9pY2cgfiBmbmNfZG1uMjdfc24yNiArIGZuY19kbW4xMF9zbjI2ICsgZm5jX2RtbjI3X2ZwbjYgKyBmbmNfZnBuNl9zbjI2LCBkYXRhPWRhdGFfcGwpCnN1bW1hcnkoYTFoMmIpCnN1bW0oYTFoMmIsIGNvbmZpbnQ9VFJVRSkgIyB1c2UganRvb2xzIGBzdW1tYCBmdW5jdGlvbiB0byBnZXQgY29uZmlkZW5jZSBpbnRlcnZhbHMKYGBgCkluIHRoZSBtb2RlbCB0ZXN0aW5nIGFsbCBiZXR3ZWVuLW5ldHdvcmsgY29ubmVjdGlvbnMsIGBmbmNfZG1uMjdfc24yNmAgd2FzIHRoZSBvbmx5IGNvbXBvbmVudCBwYWlyIHRoYXQgd2FzIGEgc2lnbmlmaWNhbnQgcHJlZGljdG9yIG9mIGdyaWVmIHNldmVyaXR5LCBiID0gMTcuMDIsIHQgPSAyLjUxLCBwID0gLjAxNywgOTUlIENJJ3MgMy4yNSwgMzAuNzkpLiBUaGUgb3ZlcmFsbCBtb2RlbCBmaXQgd2FzIG5vdCBzaWduaWZpY2FudCwgRig0LDMzKSA9IDIuMDYsIHAgPSAuMTEuIAoKQSBiYXNpYyBzY2F0dGVycGxvdDoKYGBge3J9CnBsb3RfbW9kZWwoYTFoMmIsIHR5cGUgPSAicHJlZCIsIHRlcm1zID0gYygiZm5jX2RtbjI3X3NuMjYiKSwgc2hvdy5kYXRhPVRSVUUpICsgeGxhYigiRk5DIGJldHdlZW4gc2FsaWVuY2UgYW5kIGRlZmF1bHQgbmV0d29yayBjb3JlIikgKyB5bGFiKCJHcmllZiBzZXZlcml0eSAoSUNHKSIpICsgbGFicyh0aXRsZT0iUHJlZGljdGVkIElDRyBzY29yZXMiKSArIHRoZW1lX2FwYSgpCgpwbG90KGRhdGFfcGwkZm5jX2RtbjI3X3NuMjYsIGRhdGFfcGwkdG90X2ljZykKYGBgCgojIyMjIEFkZCBhZ2UsIHNleCwgdGltZSBzaW5jZSBkZWF0aApOZXh0LCBJIHRlc3RlZCBgZm5jX2RtbjI3X3NuMjZgIGluIGEgbW9kZWwgdGhhdCBpbmNsdWRlZCBhZ2UsIHNleCwgYW5kIHRpbWUgc2luY2UgZGVhdGguIApgYGB7cn0KYTFoMmMgPC0gbG0odG90X2ljZyB+IGZuY19kbW4yN19zbjI2KihhZ2VfeXJzX2NtICsgc2V4X20gKyB0aW1lc2luY2VkZWF0aF9tb25fY20pLCBkYXRhPWRhdGFfcGwpICMgbG9vayBhdCB0d28td2F5IGludGVyYWN0aW9ucyBvbmx5CnN1bW1hcnkoYTFoMmMpCnN1bW0oYTFoMmMsIGNvbmZpbnQ9VFJVRSkKYGBgCkRNTjxzdWI+Y29yZTwvc3ViPi1TTiBGTkMgcmVtYWluZWQgYSBzaWduaWZpY2FudCBwcmVkaWN0b3Igb2YgZ3JpZWYgc2V2ZXJpdHkgaW4gaW50ZXJhY3Rpb24gd2l0aCBzZXgsIHdoZW4gYWdlLCBzZXgsIGFuZCB0aW1lIHNpbmNlIGRlYXRoIHdlcmUgaW5jbHVkZWQgaW4gdGhlIG1vZGVsLiBUaGUgb3ZlcmFsbCBtb2RlbCBmaXQgd2FzIHNpZ25pZmljYW50LCBGKDcsMzApID0gMy41NSwgcCA9IC4wMDksIGFkanVzdGVkIFIyID0gLjMzLgoKVGhlIGZvbGxvd2luZyBwbG90IHNob3dzIHRoZSBpbnRlcmFjdGlvbjoKYGBge3J9CnBsb3RfbW9kZWwoYTFoMmMsIHR5cGUgPSAicHJlZCIsIHRlcm1zID0gYygiZm5jX2RtbjI3X3NuMjYiLCAic2V4X20iKSwgc2hvdy5kYXRhPVRSVUUpICsgeGxhYigiRk5DIGJldHdlZW4gc2FsaWVuY2UgYW5kIGRlZmF1bHQgbmV0d29yayBjb3JlIikgKyB5bGFiKCJHcmllZiBzZXZlcml0eSAoSUNHKSIpICsgbGFicyh0aXRsZT0iUHJlZGljdGVkIElDRyBzY29yZXMiKQpgYGAKVGhlcmUgd2FzIGEgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gYmV0d2VlbiBGTkMgYW5kIHNleCwgc3VjaCB0aGF0IERNTi1TTiBGTkMgd2FzIHBvc2l0aXZlbHkgYXNzb2NpYXRlZCB3aXRoIGdyaWVmIHNldmVyaXR5IGluIG1lbiBidXQgbm90IHdvbWVuLiAoTm90ZSB0aGF0IGdyaWVmIHNldmVyaXR5IGFuZCBzZXggYXJlIHByZXR0eSBjb25mb3VuZGVkIGluIHRoaXMgZGF0YXNldCwgd2l0aCBoaWdoZXIgbWVhbiBJQ0cgYW1vbmcgdGhlIG1lbiB0aGFuIHRoZSB3b21lbi4uLikKCgojIyMgUXVlc3Rpb24gMi4gRG9lcyBzcG91c2UtcmVsYXRlZCB0aG91Z2h0IG1lZGlhdGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGdyaWVmIHNldmVyaXR5IGFzc29jaWF0ZWQgd2l0aCBETU4tU04gZnVuY3Rpb25hbCBjb25uZWN0aXZpdHk/IChwbGFjZWJvIHNlc3Npb24pCgpTdGF0aWMgQWltIDEsIEgyOiBIaWdoZXIgcHJvcG9ydGlvbiBvZiBzcG91c2UtcmVsYXRlZCB0aG91Z2h0IGNvbnRlbnQgd2lsbCBtZWRpYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb21wbGljYXRlZCBncmllZiBzeW1wdG9tIHNldmVyaXR5IGFuZCBETU4tU04gRk5DLgoqIF8qKlBsYWNlYm8gZGF0YSBvbmx5KipfCgoqIF8iPHN0cmlrZT5SdW1pbmF0aXZlPC9zdHJpa2U+IF9zcG91c2UtcmVsYXRlZD8/XyBjb250ZW50IGluIHNlbGYtcmVwb3J0ZWQgcHJlLXJlc3Rpbmcgc3RhdGUgdGhvdWdodCBjb250ZW50IHdpbGwgbWVkaWF0ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZ3JpZWYgc3ltcHRvbSBzZXZlcml0eSBhbmQgYXV0b21hdGljIGNvbnN0cmFpbnRzIGFzIGluZGV4ZWQgYnkgZHdlbGwgdGltZSBpbiBzdGF0ZXMgb2YgZGVmYXVsdCBtb2RlLXNhbGllbmNlIG5ldHdvcmsgaW50ZXJjb25uZWN0aXZpdHkuIl8gLS0+IGZvcm1lciBvcGVyYXRpb25hbGl6ZWQgYXMgc3BvdXNlLXJlbGF0ZWQgdGhvdWdodCBjb250ZW50IF9GT1IgTk9XXywgbGF0dGVyIG9wZXJhdGlvbmFsaXplZCBmb3IgRk5DIGFzIERNTi1TTiBjb25uZWN0aXZpdHkuCgpgYGB7cn0KIyMjIEFpbSAxIEh5cG90aGVzaXMgMyAoc3RhdGljIEZOQykKCiMgbW9kZWwuTSA8LSBsbShNIH4gWCwgbXlEYXRhKQojIG1vZGVsLlkgPC0gbG0oWSB+IFggKyBNLCBteURhdGEpCiMgcmVzdWx0cyA8LSBtZWRpYXRlKG1vZGVsLk0sIG1vZGVsLlksIHRyZWF0PSdYJywgbWVkaWF0b3I9J00nLAojICAgICAgICAgICAgICAgICAgIGJvb3Q9VFJVRSwgc2ltcz0xMDApCgojIEFDTUUgc3RhbmRzIGZvciBBdmVyYWdlIENhdXNhbCBNZWRpYXRpb24gRWZmZWN0czoKIyMgInRoZSBtZWRpYXRpb24gZWZmZWN0IChBQ01FKSBpcyB0aGUgdG90YWwgZWZmZWN0IG1pbnVzIHRoZSBkaXJlY3QgZWZmZWN0LCB3aGljaCBlcXVhbHMgdG8gYSBwcm9kdWN0IG9mIGEgY29lZmZpY2llbnQgb2YgWCBpbiB0aGUgc2Vjb25kIHN0ZXAgYW5kIGEgY29lZmZpY2llbnQgb2YgTSBpbiB0aGUgbGFzdCBzdGVwLiBUaGUgZ29hbCBvZiBtZWRpYXRpb24gYW5hbHlzaXMgaXMgdG8gb2J0YWluIHRoaXMgaW5kaXJlY3QgZWZmZWN0IGFuZCBzZWUgaWYgaXTigJlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIgoKIyBBREUgc3RhbmRzIGZvciBBdmVyYWdlIERpcmVjdCBFZmZlY3RzCgojIFRvdGFsIEVmZmVjdCBpcyBhIHN1bSBvZiBhIG1lZGlhdGlvbiAoaW5kaXJlY3QpIGVmZmVjdCBhbmQgYSBkaXJlY3QgZWZmZWN0CgojIFggPSBmbmNfZG1uMjdfc24yNiAoInRyZWF0IikKIyBNID0gZm9jdXNfc3BvdXNlX3BlcmMKIyBZID0gdG90X2ljZwoKIyBXZSBrbm93IGZyb20gdGhlIGFuYWx5c2lzIGluIFExIHRoYXQgZm5jX2RtbjI3X3NuMjYgaXMgdGhlIG9ubHkgcGFpciB0aGF0IHNpZ25pZmljYW50bHkgcHJlZGljdHMgSUNHLgptTSA8LSBsbSh0b3RfaWNnIH4gZm5jX2RtbjI3X3NuMjYsIGRhdGFfcGwpCnN1bW1hcnkobU0pICMgeWVzLCBETU4tU04gRk5DIHByZWRpY3RzIElDRyBzY29yZQoKIyBTdGVwIDI6IGRvZXMgWCBwcmVkaWN0IE0/Cm1YIDwtIGxtKGZvY3VzX3Nwb3VzZV9wZXJjIH4gZm5jX2RtbjI3X3NuMjYsIGRhdGFfcGwpCnN1bW1hcnkobVgpICMgWCBkb2VzIG5vdCBwcmVkaWN0IE0gLS0gRElTQ09OVElOVUUKYGBgCkRNTi1TTiBGTkMgZGlkIG5vdCBwcmVkaWN0IHNwb3VzZS1yZWxhdGVkIHRob3VnaHQgaW4gcG9zdC1zY2FuIHJlcG9ydHMsIHNvIEkgY291bGQgbm90IGNvbnRpbnVlIHcvdGhlIG1lZGlhdGlvbiBtb2RlbC4KCiMjIyMgRXhwbG9yYXRvcnkgbWVkaWF0aW9uIHcvR0NRCgpJIGFtIHN0aWxsIGN1cmlvdXMgYWJvdXQgd2hldGhlciBpbnRlcm5hbGx5LWdlbmVyYXRlZCB0aG91Z2h0cyBleHBsYWluIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBETU4tU04gRk5DIGFuZCBjb21wbGljYXRlZCBncmllZiBzeW1wdG9tcy4gVGhlcmVmb3JlLCBJIGRlY2lkZWQgdG8gZG8gc29tZSBleHBsb3JhdG9yeSBhbmFseXNlcyB3aXRoIHRoZSBHQ1EgIkNoZXJpc2ggZ3JpZWYiIHN1YnNjYWxlIGluIHBsYWNlIG9mIHRoZSBzcG91c2UtcmVsYXRlZCBjb250ZW50IHZhcmlhYmxlLiAKCmBgYHtyfQojIFN0ZXAgMTogZG9lcyBYIHByZWRpY3QgWT8KbU0gPC0gbG0odG90X2ljZyB+IGZuY19kbW4yN19zbjI2LCBkYXRhX3BsKQpzdW1tYXJ5KG1NKQoKIyBTdGVwIDI6IGRvZXMgWCBwcmVkaWN0IE0/Cm1YIDwtIGxtKHRvdF9nY3FfY2hlcmlzaCB+IGZuY19kbW4yN19zbjI2LCBkYXRhX3BsKQpzdW1tYXJ5KG1YKSAKCiMgZG9lcyBNIHByZWRpY3QgWT8KbU1ZIDwtIGxtKHRvdF9pY2cgfiB0b3RfZ2NxX2NoZXJpc2gsIGRhdGFfcGwpCnN1bW1hcnkobU1ZKQoKIyBTdGVwIDM6IGFmdGVyIHJlZ3Jlc3NpbmcgWCBhbmQgTSBvbiBZLCBkb2VzIFggcHJlZGljdCBZPwogbVkgPC0gbG0odG90X2ljZyB+IGZuY19kbW4yN19zbjI2ICsgdG90X2djcV9jaGVyaXNoLCBkYXRhX3BsKQpzdW1tYXJ5KG1ZKQoKIyBTdGVwIDQ6IHRlc3QgaWYgdGhlIG1lZGlhdGlvbiBlZmZlY3RzIGFyZSBzaWduaWZpY2FudApyZXN1bHRzIDwtIG1lZGlhdGlvbjo6bWVkaWF0ZShtTSwgbVksIHRyZWF0PSdmbmNfZG1uMjdfc24yNicsIG1lZGlhdG9yPSd0b3RfZ2NxX2NoZXJpc2gnLAogICAgICAgICAgICAgICAgICAgYm9vdD1UUlVFLCBzaW1zPTIwMDApCnN1bW1hcnkocmVzdWx0cykKcGxvdChyZXN1bHRzKQpgYGAKVGhlIHJlc3VsdHMgd2l0aCBgZ2NxX2NoZXJpc2hgIGFzIG1lZGlhdG9yIGZyb20gdGhlIGVhcmxpZXIgYW5hbHlzaXMgZGlkIHJlcGxpY2F0ZS4gKioqCgojIyBTdGF0aWMgRk5DIEFpbSAyLCBiYXNlZCBvbiBOUlNBIEFpbSAyCgpBaW0gMi4gVG8gaWRlbnRpZnkgaG93IGludHJhbmFzYWwgb3h5dG9jaW4gYWx0ZXJzIGR5bmFtaWMgZnVuY3Rpb25hbCBjb25uZWN0aXZpdHkgaW4gb2xkZXIgYWR1bHRzLCBhbmQgd2hldGhlciBlZmZlY3RzIG9mIG94eXRvY2luIGFyZSBtb2RlcmF0ZWQgYnkgZ3JpZWYgc2V2ZXJpdHkuCgoqIEgxOiBVbmRlciBveHl0b2NpbiwgdGhlIHNhbXBsZSBhcyBhIHdob2xlIHdpbGwgc2hvdyBpbmNyZWFzZWQgdGltZSBpbiBzYWxpZW5jZSBuZXR3b3JrLWRvbWluYW50IHN0YXRlcywgcmVsYXRpdmUgdG8gcGxhY2Viby48YnI+ClBhaXJlZCB0LXRlc3RzIHdpbGwgYmUgdXNlZCB0byBjb21wYXJlIG94eXRvY2luIGFuZCBwbGFjZWJvIGNvbmRpdGlvbnMgdG8gdGVzdCB3aGV0aGVyIG94eXRvY2luIChBKSBpbmNyZWFzZXMgZHdlbGwgdGltZSBpbiBzYWxpZW5jZS1uZXR3b3JrIGRvbWluYW50IHN0YXRlcyBhbmQvb3IgKEIpIHJlZHVjZXMgbiBzdGF0ZSB0cmFuc2l0aW9ucyBpbiB0aGUgc2FtcGxlLgoKKiBIMjogQ29tcGxpY2F0ZWQgZ3JpZWYgc3ltcHRvbSBzZXZlcml0eSB3aWxsIG1vZGVyYXRlIG94eXRvY2luIGVmZmVjdHMgb24gREZOQy48YnI+CgpKdWxpYSBzYWlkOgoKPiBSZXNwb25zZTogSSBhY3R1YWxseSB3b3VsZCByZWNvbW1lbmQgZG9pbmcgYSBwYWlyZWQgdC10ZXN0IChlcXVhbGx5LCB3aGVuIG5vIGRhdGEgYXJlIG1pc3NpbmcsIGEgbWl4ZWQgbW9kZWwgd2l0aCBveHl0b2NpbiBzdGF0ZSBhcyBhIGZpeGVkIHByZWRpY3RvciBhbmQgYSByYW5kb20gaW50ZXJjZXB0IHBlciBwYXJ0aWNpcGFudCkgdG8gY29tcGFyZSB0aGUgZGlmZmVyZW5jZXMgaW4gZHdlbGwgdGltZXMgYmV0d2VlbiBveHl0b2NpbiBzdGF0ZXMuIFRoZSByZWFzb24gaXMgdGhhdCB3aGVuIHlvdSBhbHNvIGhhdmUgYW4gaW50ZXJhY3Rpb24gd2l0aCBncmllZiBzeW1wdG9tIHNldmVyaXR5IGluIHRoZSBtb2RlbCwgY29tcGFyaW5nIHRoZSB0d28gb3h5dG9jaW4gc3RhdGVzIG11c3QgYmUgZG9uZSBhdCBhIHBhcnRpY3VsYXIgbGV2ZWwgb2YgZ3JpZWYgc3ltcHRvbSBzZXZlcml0eTsgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSBzdGF0ZXMgd2lsbCBkZXBlbmQgb24gdGhlIHBhcnRpY3VsYXIgbGV2ZWwgb2YgZ3JpZWYgc3ltcHRvbSBzZXZlcml0eSBjaG9zZW4uIEV2ZW4gaWYgdGhlIGludGVyYWN0aW9uIGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCB0aGUgbW9kZWwgbGlrZWx5IGRpZCBub3QgZXN0aW1hdGUgdGhlIGludGVyYWN0aW9uIGFzIGV4YWN0bHkgemVyby4gVGh1cywgeW914oCZcmUgaGF2aW5nIHRvIHV0aWxpemUgYSBub24temVybyBlc3RpbWF0ZSBvZiBhIHBhcmFtZXRlciB0aGF0IHlvdSBhY3R1YWxseSB0aGluayBpcyB6ZXJvIGluIHlvdXIgY2FsY3VsYXRpb24gb2YgdGhlIG94eXRvY2luIGRpZmZlcmVuY2VzLiBJIGRvbuKAmXQgbG92ZSB0aGF0LgoKPk9mIGNvdXJzZSwgaWYgdGhlIGludGVyYWN0aW9uIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIHRoZW4geW91IGRlZmluaXRlbHkgc2hvdWxkIGJlIHRha2luZyBpdCBpbnRvIGFjY291bnQgd2hlbiB5b3XigJlyZSBlc3RpbWF0aW5nIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gb3h5dG9jaW4gc3RhdGVzLiBJbiB0aGlzIGNhc2UsIHRoZSBncmllZiBzeW1wdG9tIHNldmVyaXR5IHJlYWxseSBkb2VzIG1vZGVyYXRlIHRoYXQgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXRlcy4KR2l2ZW4gYWxsIHRoaXMsIEkgd291bGQgcHJvcG9zZSBsb29raW5nIGF0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbCBmaXJzdC4gSWYgdGhlIGludGVyYWN0aW9uIGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCBsb29rIGF0IHRoZSBtb2RlbCB3aXRoIGp1c3Qgb3h5dG9jaW4gc3RhdGVzIChhZ2FpbiwgYXNzdW1pbmcgbm8gbWlzc2luZyBkYXRhLCB0aGlzIHdvdWxkIGJlIHRoZSBwYWlyZWQgdC10ZXN0KS4KCiMjIyBRdWVzdGlvbiAzLiBEb2VzIGludHJhbmFzYWwgb3h5dG9jaW4gYWx0ZXIgc3RhdGljIGZ1bmN0aW9uYWwgY29ubmVjdGl2aXR5IGluIG9sZGVyIGFkdWx0cz8gCgoqIEgxOiA8YnI+Cl9ERk5DOlVuZGVyIG94eXRvY2luLCB0aGUgc2FtcGxlIGFzIGEgd2hvbGUgd2lsbCBzaG93IGluY3JlYXNlZCB0aW1lIGluIHNhbGllbmNlIG5ldHdvcmstZG9taW5hbnQgc3RhdGVzLCByZWxhdGl2ZSB0byBwbGFjZWJvLjxicj4KUGFpcmVkIHQtdGVzdHMgd2lsbCBiZSB1c2VkIHRvIGNvbXBhcmUgb3h5dG9jaW4gYW5kIHBsYWNlYm8gY29uZGl0aW9ucyB0byB0ZXN0IHdoZXRoZXIgb3h5dG9jaW4gKEEpIGluY3JlYXNlcyBkd2VsbCB0aW1lIGluIHNhbGllbmNlLW5ldHdvcmsgZG9taW5hbnQgc3RhdGVzIGFuZC9vciAoQikgcmVkdWNlcyBuIHN0YXRlIHRyYW5zaXRpb25zIGluIHRoZSBzYW1wbGUuXzxicj4KU3RhdGljIEZOQzogT3h5dG9jaW4gd2lsbCBpbmNyZWFzZSBzYWxpZW5jZSBuZXR3b3JrIGNvbm5lY3Rpdml0eSB3aXRoIERNTiBhbmQvb3IgRlBOLgoKIyMjIFF1ZXN0aW9uIDQuIEFyZSBlZmZlY3RzIG9mIG94eXRvY2luIG1vZGVyYXRlZCBieSBjb21wbGljYXRlZCBncmllZiBzeW1wdG9tIHNldmVyaXR5PyAKCiogSDI6IENvbXBsaWNhdGVkIGdyaWVmIHN5bXB0b20gc2V2ZXJpdHkgd2lsbCBtb2RlcmF0ZSBveHl0b2NpbiBlZmZlY3RzIG9uIHNhbGllbmNlIG5ldHdvcmsgc3RhdGljIEZOQy48YnI+CgpGb2xsb3dpbmcgSnVsaWEncyBhZHZpY2UsIHRlc3QgUTQvSDIgKGludGVyYWN0aW9uIG1vZGVsKSBmaXJzdCwgdGhlbiBmb2xsb3cgdXAgd2l0aCBMTUUgKGluc3RlYWQgb2YgdC10ZXN0LCBzbyB0aGluZ3MgbGlrZSBzZXggY2FuIGJlIGFkZGVkIHRvIHRoZSBtb2RlbCkgaWYgdGhlcmUgaXMgbm8gZWZmZWN0IG9mIElDRyBvciBpbnRlcmFjdGlvbjoKCmBgYHtyfQojIGZuY19kbW4yN19zbjI2IC8gYQojIGZuY19kbW4xMF9zbjI2IC8gYgojIGZuY19mcG42X3NuMjYgLyBjCiMgZm5jX2RtbjEwX2RtbjI3IC9kCgojIGZyb20gTUZPIG1lZXRpbmcgNi8yMDoKIyBydW4gaXQgd2l0aCBqdXN0IGljZyp0eCAoKy8tIG90aGVyIHN0dWZmKSwgdGhlbiBzZWUgaWYgQkRJIGNoYW5nZXMgcmVzdWx0cyAoKyB0b3RfYmRpX2NtKQojIHJ1biAzIG1vZGVsczogaWNnKnR4IGFsb25lLCBpY2cqdHggKyBvdGhlciBzdHVmZiwgaWNnKnR4ICsgb3RoZXIgc3R1ZmYgKyBCREkKIyB1c2UgTUwgb3ZlciBSRU1MIHNvIHRoYXQgbW9kZWxzIHdpdGggZGlmZmVyZW50IGZpeGVkIGVmZmVjdHMgY2FuIGJlIGNvbXBhcmVkCgojIyBNb2RlbHMgd2l0aCB0b3RfaWNnKnR4IE9OTFkKIyBTTiBjb21wb25lbnQgcGFpcnMKYTJoMmEgPC0gbG1lKGZuY19kbW4yN19zbjI2IH4gdG90X2ljZ19jbSp0eCwgcmFuZG9tID0gfiAxfElELCBkYXRhLCBtZXRob2Q9Ik1MIikgIyBETU4gY29yZS1TTiBkQUNDCmEyaDJiIDwtIGxtZShmbmNfZG1uMTBfc24yNiB+IHRvdF9pY2dfY20qdHgsIHJhbmRvbSA9IH4gMXxJRCwgZGF0YSwgbWV0aG9kPSJNTCIpICMgRE1OIG10bC1TTiBkQUNDCmEyaDJjIDwtIGxtZShmbmNfZnBuNl9zbjI2IH4gdG90X2ljZ19jbSp0eCwgcmFuZG9tID0gfiAxfElELCBkYXRhLCBtZXRob2Q9Ik1MIikgIyBSIEZQTi1TTiBkQUNDCgojIHdpdGhpbi1ETU4gcGFpcgphMmgyZCA8LSBsbWUoZm5jX2RtbjI3X2RtbjEwIH4gdG90X2ljZ19jbSp0eCwgcmFuZG9tID0gfiAxfElELCBkYXRhLCBtZXRob2Q9Ik1MIikgIyBETU4gY29yZS1TTiBkQUNDCgojIyBNb2RlbHMgd2l0aCBvdGhlciBjb3ZhcmlhdGVzCiMgU04gY29tcG9uZW50IHBhaXJzCmEyaDJhMSA8LSBsbWUoZm5jX2RtbjI3X3NuMjYgfiB0b3RfaWNnX2NtKnR4ICsgc2V4X20gKyBhZ2VfeXJzX2NtICsgZmRfbWVhbiArIG1lZHNfaHJ0ICsgdGltZXRvcmVzdCArIG1lZHNfcHN5Y2hvYWN0aXZlLCByYW5kb20gPSB+IDF8SUQsIGRhdGEsIG1ldGhvZD0iTUwiKSAjIERNTiBjb3JlLVNOIGRBQ0MKYTJoMmIxIDwtIGxtZShmbmNfZG1uMTBfc24yNiB+IHRvdF9pY2dfY20qdHggKyBzZXhfbSArIGFnZV95cnNfY20gKyBmZF9tZWFuICsgbWVkc19ocnQgKyB0aW1ldG9yZXN0ICsgbWVkc19wc3ljaG9hY3RpdmUsIHJhbmRvbSA9IH4gMXxJRCwgZGF0YSwgbWV0aG9kPSJNTCIpICMgRE1OIG10bC1TTiBkQUNDCmEyaDJjMSA8LSBsbWUoZm5jX2ZwbjZfc24yNiB+IHRvdF9pY2dfY20qdHggKyBzZXhfbSArIGFnZV95cnNfY20gKyBmZF9tZWFuICsgbWVkc19ocnQgKyB0aW1ldG9yZXN0ICsgbWVkc19wc3ljaG9hY3RpdmUsIHJhbmRvbSA9IH4gMXxJRCwgZGF0YSwgbWV0aG9kPSJNTCIpICMgUiBGUE4tU04gZEFDQwoKIyB3aXRoaW4tRE1OIHBhaXIKYTJoMmQxIDwtIGxtZShmbmNfZG1uMjdfZG1uMTAgfiB0b3RfaWNnX2NtKnR4ICsgc2V4X20gKyBhZ2VfeXJzX2NtICsgZmRfbWVhbiArIG1lZHNfaHJ0ICsgdGltZXRvcmVzdCArIG1lZHNfcHN5Y2hvYWN0aXZlLCByYW5kb20gPSB+IDF8SUQsIGRhdGEsIG1ldGhvZD0iTUwiKSAjIERNTiBjb3JlLVNOIGRBQ0MKCiMgTW9kZWxzIHcvQkRJCiMgU04gY29tcG9uZW50IHBhaXJzCmEyaDJhMiA8LSBsbWUoZm5jX2RtbjI3X3NuMjYgfiB0b3RfaWNnX2NtKnR4KnRvdF9iZGlfY20sIHJhbmRvbSA9IH4gMXxJRCwgZGF0YSwgbWV0aG9kPSJNTCIpICMgRE1OIGNvcmUtU04gZEFDQwphMmgyYjIgPC0gbG1lKGZuY19kbW4xMF9zbjI2IH4gdG90X2ljZ19jbSp0eCp0b3RfYmRpX2NtLCByYW5kb20gPSB+IDF8SUQsIGRhdGEsIG1ldGhvZD0iTUwiKSAjIERNTiBtdGwtU04gZEFDQwphMmgyYzIgPC0gbG1lKGZuY19mcG42X3NuMjYgfiB0b3RfaWNnX2NtKnR4KnRvdF9iZGlfY20sIHJhbmRvbSA9IH4gMXxJRCwgZGF0YSwgbWV0aG9kPSJNTCIpICMgUiBGUE4tU04gZEFDQwoKIyB3aXRoaW4tRE1OIHBhaXIKYTJoMmQyIDwtIGxtZShmbmNfZG1uMjdfZG1uMTAgfiB0b3RfaWNnX2NtKnR4KnRvdF9iZGlfY20sIHJhbmRvbSA9IH4gMXxJRCwgZGF0YSwgbWV0aG9kPSJNTCIpICMgRE1OIGNvcmUtU04gZEFDQwpgYGAKCk5vdGUgdGhhdCBgc2V4X21gIGFuZCBgdG90X2ljZ2AgYXJlIGNvbmZvdW5kZWQgLSB0aGUgbWVhbiBJQ0cgc2NvcmUgZm9yIG1lbiBpcyB+MzEgd2hpbGUgZm9yIHdvbWVuIGl0J3MgfjIwLCBwID0gLjA2LgoKIyMjIyBETU4gY29yZSAtIFNOIGRBQ0MKCmBgYHtyfQphbm92YShhMmgyYSkgIyBETU4gY29yZS1TTiBkQUNDCmFub3ZhKGEyaDJhMSkgIyB3L2NvdmFyaWF0ZXMKYW5vdmEoYTJoMmEyKSAjIHcvQkRJCgphbm92YShhMmgyYSwgYTJoMmExLCBhMmgyYTIpICMgbW9kZWwgY29tcGFyaXNvbgpgYGAKCkdyaWVmIHNldmVyaXR5LCBidXQgbm90IGB0eGAgb3IgdGhlaXIgaW50ZXJhY3Rpb24sIGhhcyBhIHNpZ25pZmljYW50IGVmZmVjdCBvbiBETU4gY29yZS1TTiBBQ0MgRk5DIC0gc2ltaWxhciB0byB0aGUgcmVzdWx0IHdpdGgganVzdCB0aGUgcGxhY2VibyBkYXRhLiBUaGlzIGVmZmVjdCBob2xkcyB3aGVuIHNleCwgYWdlLCBtZWFuIEZEIGFuZCBob3Jtb25lIHJlcGxhY2VtZW50IHRyZWF0bWVudCBhcmUgaW5jbHVkZWQgaW4gdGhlIG1vZGVsLgoKCk1vZGVsIHN1bW1hcnkgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciB0aGUgZXN0aW1hdGU6CgpgYGB7cn0Kc3VtbWFyeShhMmgyYSkKcm91bmQoaW50ZXJ2YWxzKGEyaDJhKVtbImZpeGVkIl1dLDQpICMgOTUlIENJcwoKIyB2YXJpYW5jZSBleHBsYWluZWQgYnkgdGhlIGVudGlyZSBtb2RlbCAKZml0dGVkX2EyaDJhIDwtIGZpdHRlZChhMmgyYSkKZGF0YSRmaXR0ZWRfYTJoMmEgPC0gYXMudmVjdG9yKGZpdHRlZF9hMmgyYSkKZm9yUjIgPC0gbG0oZm5jX2RtbjI3X3NuMjYgfiBmaXR0ZWRfYTJoMmEsIGRhdGE9ZGF0YSkKc3VtbWFyeShmb3JSMikgCgojIElDQyAodmFyaWFuY2UgZXhwbGFpbmVkIGJ5IGJldHdlZW4tcGVyc29uIHZhcmlhbmNlKQojIGZ1bmN0aW9uIGZyb20gdGhlIGByZWdoZWxwZXJgIHBhY2thZ2UKcm91bmQoSUNDKGEyaDJhKSwyKQoKIyBwYW5lbCBieSB0eApnZ3Bsb3QoZGF0YSwgYWVzKGZuY19kbW4yN19zbjI2LCB0b3RfaWNnLCBmaWxsPXR4KSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHR4KSkgKwp4bGFiKCJETU4gY29yZS1TTiBjb25uZWN0aXZpdHkiKSArIHlsYWIoIkdyaWVmIHNldmVyaXR5IikgKyB0aGVtZV9idyhiYXNlX3NpemU9MTIpICsgc2NhbGVfY29sb3JfZGlzY3JldGUoKSArIGZhY2V0X2dyaWQoLiB+IHR4KSArIGdlb21fc21vb3RoKG1ldGhvZD1sbSwgYWVzKGNvbG9yID0gdHgpKSArIHRoZW1lX2FwYSgpICsgc2NhbGVfZmlsbF9ncmV5KHN0YXJ0PS44LCBlbmQ9LjgpIAoKYGBgClRoZSBlZmZlY3QgaXMgYmVpbmcgZHJpdmVuIGJ5IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGdyaWVmIHNldmVyaXR5IGFuZCBGTkMgaW4gdGhlIHBsYWNlYm8gY29uZGl0aW9uLgoKIyMjIyBETU4gbXRsIC0gU04gZEFDQwoKYGBge3J9CmFub3ZhKGEyaDJiKSAjIERNTiBtdGwtU04gZEFDQwphbm92YShhMmgyYjEpICMgdy9jb3ZhcmlhdGVzCmFub3ZhKGEyaDJiMikgIyB3L0JESQoKYW5vdmEoYTJoMmIsIGEyaDJiMSwgYTJoMmIyKSAjIG1vZGVsIGNvbXBhcmlzb24KCiMgdmFyaWFuY2UgZXhwbGFpbmVkIGJ5IHRoZSBlbnRpcmUgbW9kZWwgCmZpdHRlZF9hMmgyYiA8LSBmaXR0ZWQoYTJoMmIpCmRhdGEkZml0dGVkX2EyaDJiIDwtIGFzLnZlY3RvcihmaXR0ZWRfYTJoMmIpCmZvclIyIDwtIGxtKGZuY19kbW4xMF9zbjI2IH4gZml0dGVkX2EyaDJiLCBkYXRhPWRhdGEpCnN1bW1hcnkoZm9yUjIpIAoKIyBJQ0MgKHZhcmlhbmNlIGV4cGxhaW5lZCBieSBiZXR3ZWVuLXBlcnNvbiB2YXJpYW5jZSkKIyBmdW5jdGlvbiBmcm9tIHRoZSBgcmVnaGVscGVyYCBwYWNrYWdlCnJvdW5kKElDQyhhMmgyYiksMikKYGBgClRoZXJlIHdhcyBhIHNpZ25pZmljYW50IG1haW4gZWZmZWN0IG9mIGB0eGAgKGJ1dCBub3QgYHRvdF9pY2dgIG9yIHRoZWlyIGludGVyYWN0aW9uKSBvbiB0aGUgRE1OIG10bC1TTiBkQUNDIHBhaXIsIGluIHdoaWNoIHRoZXNlIGNvbXBvbmVudHMgd2VyZSBtb3JlIHN0cm9uZ2x5IGNvcnJlbGF0ZWQgaW4gdGhlIG94eXRvY2luIGNvbmRpdGlvbi4gVGhpcyBlZmZlY3QgaG9sZHMgd2hlbiBzZXgsIGFnZSwgbWVhbiBGRCBhbmQgaG9ybW9uZSByZXBsYWNlbWVudCB0cmVhdG1lbnQgYXJlIGluY2x1ZGVkIGluIHRoZSBtb2RlbC4KCmBgYHtyfQp0LnRlc3QoZGF0YSRmbmNfZG1uMTBfc24yNiB+IGRhdGEkdHgsIHBhaXJlZD1UUlVFKQoKIyBjcmVhdGUgYSBiYXIgcGxvdCB3aXRoIGVycm9yIGJhcnMgKDk1JSBDSSkKcCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHR4LCBmbmNfZG1uMTBfc24yNiwgZmlsbD10eCkpICsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICJiYXIiLCBmdW4ueSA9IG1lYW4sIHBvc2l0aW9uID0gImRvZGdlIiwgY29sb3I9ImJsYWNrIikgKwogIHN0YXRfc3VtbWFyeShnZW9tID0gImVycm9yYmFyIiwgZnVuLmRhdGEgPSBtZWFuX3NlLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSksIHdpZHRoID0gMC4yNSwgY29sb3I9ImJsYWNrIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ic29saWQiLCBjb2xvcj0iYmxhY2siLCBzaXplPS41KSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjRkZDMTA3IiwgIiMxRTg4RTUiKSkKcAoKbSA8LSBsbWUoZm5jX2RtbjEwX3NuMjYgfiB0eCwgcmFuZG9tID0gfiAxfElELCBkYXRhLCBtZXRob2Q9Ik1MIikgIyB1c2UgbG1lKCkgaW5zdGVhZCBvZiBwYWlyZWQgdC10ZXN0IHRvIGdldCBlZmZlY3QgZXN0aW1hdGUgdG8gcGxvdCAodGhpcyBnaXZlcyBzYW1lIHJlc3VsdCBhcyBwYWlyZWQgdC10ZXN0KQplZiA8LSBlZmZlY3QoInR4IiwgbSkKZWYgPC0gYXMuZGF0YS5mcmFtZShlZikKZ2dwbG90KGVmLCBhZXModHgsIGZpdCwgY29sb3I9dHgpKSArIGdlb21fbGluZSgpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1maXQtc2UsIHltYXg9Zml0K3NlKSwgd2lkdGg9MC4yKSArCiAgICBzY2FsZV9jb2xvcl9kaXNjcmV0ZSgpICsgdGhlbWVfYncoYmFzZV9zaXplPTEyKSArIHhsYWIoIlNlc3Npb24iKSArIHlsYWIoIkZpdHRlZCB2YWx1ZXMgZm9yIERNTiBtdGwgKElDMTApIC0gU04gKElDMjYpIikgKyBsYWJzKGNvbG9yPSdTZXNzaW9uJykKYGBgCgoKIyMjIyBSIEZQTiAtIFNOIGRBQ0MKCmBgYHtyfQphbm92YShhMmgyYykgIyBSIEZQTi1TTiBkQUNDCmFub3ZhKGEyaDJjMSkgIyB3L2NvdmFyaWF0ZXMKYW5vdmEoYTJoMmMyKSAjIHcvQkRJCgphbm92YShhMmgyYywgYTJoMmMxLCBhMmgyYzIpICMgbW9kZWwgY29tcGFyaXNvbgpgYGAKR3JpZWYgc2V2ZXJpdHksIGJ1dCBub3QgYHR4YCBvciB0aGVpciBpbnRlcmFjdGlvbiwgaGFzIGEgc2lnbmlmaWNhbnQgZWZmZWN0IG9uIFIgRlBOLVNOIEFDQyBGTkMuIFRoaXMgZWZmZWN0IGhvbGRzIHdoZW4gc2V4LCBhZ2UsIG1lYW4gRkQgYW5kIGhvcm1vbmUgcmVwbGFjZW1lbnQgdHJlYXRtZW50IGFyZSBpbmNsdWRlZCBpbiB0aGUgbW9kZWwuCgpNb2RlbCBzdW1tYXJ5IGFuZCBjb25maWRlbmNlIGludGVydmFscyBmb3IgdGhlIGVzdGltYXRlOgoKYGBge3J9CnN1bW1hcnkoYTJoMmMpIApyb3VuZChpbnRlcnZhbHMoYTJoMmMpW1siZml4ZWQiXV0sNCkgIyA5NSUgQ0lzCgojIHBhbmVsIGJ5IHR4CmdncGxvdChkYXRhLCBhZXMoZm5jX2ZwbjZfc24yNiwgdG90X2ljZywgZmlsbD10eCkpICsgZ2VvbV9wb2ludChhZXMoY29sb3IgPSB0eCkpICsKeGxhYigiRlBOLVNOIGNvbm5lY3Rpdml0eSIpICsgeWxhYigiR3JpZWYgc2V2ZXJpdHkiKSArIHRoZW1lX2J3KGJhc2Vfc2l6ZT0xMikgKyBzY2FsZV9jb2xvcl9kaXNjcmV0ZSgpICsgZmFjZXRfZ3JpZCguIH4gdHgpICsgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBhZXMoY29sb3IgPSB0eCkpICsgdGhlbWVfYXBhKCkgKyBzY2FsZV9maWxsX2dyZXkoc3RhcnQ9LjgsIGVuZD0uOCkKCiMgdmFyaWFuY2UgZXhwbGFpbmVkIGJ5IHRoZSBlbnRpcmUgbW9kZWwgCmZpdHRlZF9hMmgyYyA8LSBmaXR0ZWQoYTJoMmMpCmRhdGEkZml0dGVkX2EyaDJjIDwtIGFzLnZlY3RvcihmaXR0ZWRfYTJoMmMpCmZvclIyIDwtIGxtKGZuY19mcG42X3NuMjYgfiBmaXR0ZWRfYTJoMmMsIGRhdGE9ZGF0YSkKc3VtbWFyeShmb3JSMikgCgojIElDQyAodmFyaWFuY2UgZXhwbGFpbmVkIGJ5IGJldHdlZW4tcGVyc29uIHZhcmlhbmNlKQojIGZ1bmN0aW9uIGZyb20gdGhlIGByZWdoZWxwZXJgIHBhY2thZ2UKcm91bmQoSUNDKGEyaDJjKSwyKQpgYGAKClRoZSBlZmZlY3QgaXMgYmVpbmcgZHJpdmVuIGJ5IHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGdyaWVmIHNldmVyaXR5IGFuZCBGTkMgaW4gdGhlIG94eXRvY2luIGNvbmRpdGlvbi4KCgojIyMgVmlzdWFsaXppbmcgZWZmZWN0cyBvZiBveHl0b2NpbgoKYGBge3J9CiMgdG8gdmlzdWFsaXplIGVmZmVjdHMgKHNpZy4gYW5kIG5zKSBvZiBveHl0b2NpbiwgY3JlYXRlIGEgbG9uZyBkYXRhc2V0IHdpdGggb25lIGNvbHVtbiBmb3IgRk5DIChhbGwga2luZHMpLCBvbmUgY29sdW1uIGZvciBJQyBwYWlyIG5hbWUsIG9uZSBjb2x1bW4gZm9yIGB0eGAsIG9uZSBjb2x1bW4gZm9yIGBJRGAKCiMgZmlyc3QsIHN1YnNldCBjb2x1bW5zIHRvIHNlbGVjdCBvbmx5IEZOQyBwYWlycyBvZiBpbnRlcmVzdApmbmNfYmFyX2RhdGEgPC0gZGF0YSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJzbjI2IiksIGNvbnRhaW5zKCJkbW4xMCIpLCBjb250YWlucygiZG1uMjciKSwgLWNvbnRhaW5zKCJfY20iKSwgLWNvbnRhaW5zKCJkbW4xMyIpLCAtY29udGFpbnMoImRtbjEwX2ZwbjYiKSwgLWNvbnRhaW5zKCJkbW4yMSIpLCAtY29udGFpbnMoInNuMTIiKSwgLWNvbnRhaW5zKCJmcG4xNyIpLCAiSUQiLCAidHgiLCAidG90X2ljZyIsICJncm91cCIsICJzZXhfbSIpCgpmbmNfYmFyX2RhdGEgPC0gZ2F0aGVyKGZuY19iYXJfZGF0YSwgZm5jLHZhbHVlLC10b3RfaWNnLCAtdHgsIC1JRCwgLWdyb3VwLCAtc2V4X20pICU+JSBtdXRhdGUodHggPSBmYWN0b3IoaWZlbHNlKHR4ID09ICJwbGFjZWJvIiwgInBsYWNlYm8iLCAib3h5dG9jaW4iKSkpCgojIHNob3cgYXMgYSBiYXIgY2hhcnQgdy9lcnJvciBiYXJzIChtZWFuIFNFKToKZ2dwbG90KGZuY19iYXJfZGF0YSwgYWVzKHR4LCB2YWx1ZSwgZmlsbD10eCkpICsgc3RhdF9zdW1tYXJ5KGdlb20gPSAiYmFyIiwgZnVuLnkgPSBtZWFuLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbG9yPSJibGFjayIpICsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICJlcnJvcmJhciIsIGZ1bi5kYXRhID0gbWVhbl9zZSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpLCB3aWR0aCA9IDAuMjUsIGNvbG9yPSJibGFjayIpICsKICAgIGdlb21faGxpbmUoeWludGVyY2VwdD0wLCBsaW5ldHlwZT0ic29saWQiLCBjb2xvcj0iYmxhY2siLCBzaXplPS4yNSkgKyAKIHlsYWIoIkNvcnJlbGF0aW9uIikgKyBmYWNldF9ncmlkKC4gfiBmbmMpICsgc2NhbGVfZmlsbF9kaXNjcmV0ZSgpICsgdGhlbWVfYXBhKGZhY2V0LnRpdGxlLnNpemU9Ny43NSkKCiMgcGFuZWwgYnkgZ3JvdXAKZ2dwbG90KGZuY19iYXJfZGF0YSwgYWVzKGdyb3VwLCB2YWx1ZSwgZmlsbD10eCkpICsgc3RhdF9zdW1tYXJ5KGdlb20gPSAiYmFyIiwgZnVuLnkgPSBtZWFuLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbG9yPSJibGFjayIpICsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICJlcnJvcmJhciIsIGZ1bi5kYXRhID0gbWVhbl9zZSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpLCB3aWR0aCA9IDAuMjUsIGNvbG9yPSJibGFjayIpICsKICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTAsIGxpbmV0eXBlPSJzb2xpZCIsIGNvbG9yPSJibGFjayIsIHNpemU9LjUpICsgCiAgeWxhYigiQ29ycmVsYXRpb24iKSArIGZhY2V0X2dyaWQoLiB+IGZuYykgICsgdGhlbWVfYXBhKGZhY2V0LnRpdGxlLnNpemU9Ny43NSkKYGBgCgoKIyMjIyBETU4gbXRsLSBETU4gY29yZQoKYGBge3J9CmFub3ZhKGEyaDJkKQphbm92YShhMmgyZDEpCmFub3ZhKGEyaDJkMikKCmFub3ZhKGEyaDJkLCBhMmgyZDEsIGEyaDJkMikKYGBgClRoZXJlIHdhcyBubyBlZmZlY3Qgb2YgYHRvdF9pY2dgIG9yIG94eXRvY2luIG9uIHdpdGhpbi1ETU4gY29ubmVjdGl2aXR5LgoKIyMjIE1BTk9WQQoKYGBge3J9CmRlcGVuZGVudC52YXJzIDwtIGNiaW5kKGRhdGEkZm5jX2RtbjEwX3NuMjYsIGRhdGEkZm5jX2RtbjI3X3NuMjYsIGRhdGEkZm5jX2ZwbjZfc24yNikKCnN1bW1hcnkoYW92KGRlcGVuZGVudC52YXJzIH4gZGF0YSR0b3RfaWNnICogZGF0YSR0eCkpCnN1bW1hcnkoYW92KGRlcGVuZGVudC52YXJzIH4gZGF0YSR0b3RfaWNnICogZGF0YSR0eCAqIGRhdGEkdG90X2JkaSkpCmBgYAoKIyMgQ29uY2x1c2lvbnM6IFN0YXRpYyBGTkMKCiMjIyBBaW0gMQojIyMjIFF1ZXN0aW9uIDEuIElzIGdyaWVmIHNldmVyaXR5IGFzc29jaWF0ZWQgd2l0aCBmdW5jdGlvbmFsIGNvbm5lY3Rpdml0eSBiZXR3ZWVuIChhKSBETU5jb3JlLUZQTiwgKGIpIERNTm10bC1ETU5jb3JlLCBvciAoYykgRE1OY29yZS1TTj8KCllFUywgZnVuY3Rpb25hbCBjb25uZWN0aXZpdHkgYmV0d2VlbiBETU48c3ViPmNvcmU8L3N1Yj4gYW5kIFNOPHN1Yj5BQ0M8L3N1Yj4gKGBmbmNfZG1uMjdfc24yNmApIHdhcyBwcmVkaWN0ZWQgb2YgZ3JpZWYgc2V2ZXJpdHkgKGB0b3RfaWNnYCkuIFRoZXJlIHdhcyBhIHNpZ25pZmljYW50IGludGVyYWN0aW9uIHdpdGggc2V4LCBzdWNoIHRoYXQgRE1OLVNOIEZOQyB3YXMgcG9zaXRpdmVseSBhc3NvY2lhdGVkIHdpdGggZ3JpZWYgc2V2ZXJpdHkgaW4gbWVuIGJ1dCBub3Qgd29tZW4gKHNleCBhbHNvIHByZWRpY3RpdmUgb2YgZ3JpZWYgc2V2ZXJpdHksIHRob3VnaC4uLikKCmBgYHtyfQpwbG90X21vZGVsKGExaDJjLCB0eXBlID0gInByZWQiLCB0ZXJtcyA9IGMoImZuY19kbW4yN19zbjI2IiwgInNleF9tIiksIHNob3cuZGF0YT1UUlVFKSArIHhsYWIoIkZOQyBiZXR3ZWVuIHNhbGllbmNlIGFuZCBkZWZhdWx0IG5ldHdvcmsgY29yZSIpICsgeWxhYigiR3JpZWYgc2V2ZXJpdHkgKElDRykiKSArIGxhYnModGl0bGU9IlByZWRpY3RlZCBJQ0cgc2NvcmVzIikKCiMgdGhpcyBpcyB0aGUgbW9kZWwgdGhhdCBpbmNsdWRlcyBtYWluIGFuZCBpbnRlcmFjdGlvbiBlZmZlY3RzIG9mIGFnZSwgc2V4LCBhbmQgbWVhbiBGRApgYGAKCiMjIyMgUXVlc3Rpb24gMi4gRG9lcyBzcG91c2UtcmVsYXRlZCB0aG91Z2h0IG1lZGlhdGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGdyaWVmIHNldmVyaXR5IGFzc29jaWF0ZWQgd2l0aCBETU4tU04gZnVuY3Rpb25hbCBjb25uZWN0aXZpdHk/IChwbGFjZWJvIHNlc3Npb24pCgpOTywgc3BvdXNlLXJlbGF0ZWQgdGhvdWdodCB3YXMgTk9UIHNpZ25pZmljYW50bHkgY29ycmVsYXRlZCB3aXRoIERNTi1TTiBGTkMgc28gSSBkaWQgbm90IGNvbnRpbnVlIHdpdGggdGhlIG1lZGlhdGlvbiBtb2RlbC4gSG93ZXZlciwgdGhlIENoZXJpc2ggR3JpZWYgc3Vic2NhbGUgb2YgdGhlIEdDUSBkaWQgc2lnbmlmaWNhbnRseSBtZWRpYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBJQ0cgc2NvcmUgYW5kIERNTi1TTiBGTkMsIGluIGFuIGV4cGxvcmF0b3J5IGFuYWx5c2lzLgoKIyMjIEFpbSAyCiMjIyMgUXVlc3Rpb24gMy4gRG9lcyBpbnRyYW5hc2FsIG94eXRvY2luIGFsdGVyIHN0YXRpYyBmdW5jdGlvbmFsIGNvbm5lY3Rpdml0eSBpbiBvbGRlciBhZHVsdHM/CllFUywgb3h5dG9jaW4gaW5jcmVhc2VkIGNvbm5lY3Rpdml0eSBiZXR3ZWVuIERNTjxzdWI+TVRMPC9zdWI+LVNOPHN1Yj5kQUNDPC9zdWI+IGFjcm9zcyB0aGUgc2FtcGxlIChubyBlZmZlY3Qgb2YgZ3JpZWYgc2V2ZXJpdHkpLiBUaGlzIGVmZmVjdCBoZWxkIHdoZW4gYWdlLCBzZXgsIG1lYW4gRkQsIGFuZCBIUlQgd2VyZSBpbmNsdWRlZCBhcyBjb3ZhcmlhdGVzIGluIHRoZSBtb2RlbC4KCmBgYHtyfQplZiA8LSBlZmZlY3QoInR4IiwgbSkKZWYgPC0gYXMuZGF0YS5mcmFtZShlZikKZ2dwbG90KGRhdGEsIGFlcyh0eCwgZm5jX2RtbjEwX3NuMjYsIGZpbGw9dHgpKSArCiAgc3RhdF9zdW1tYXJ5KGdlb20gPSAiYmFyIiwgZnVuLnkgPSBtZWFuLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbG9yPSJibGFjayIpICsKICBzdGF0X3N1bW1hcnkoZ2VvbSA9ICJlcnJvcmJhciIsIGZ1bi5kYXRhID0gbWVhbl9zZSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoLjkpLCB3aWR0aCA9IDAuMjUsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQ9MCwgbGluZXR5cGU9InNvbGlkIiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uNSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0ZGQzEwNyIsICIjMUU4OEU1IikpCmBgYAoKIyMjIyBRdWVzdGlvbiA0LiBBcmUgZWZmZWN0cyBvZiBveHl0b2NpbiBtb2RlcmF0ZWQgYnkgY29tcGxpY2F0ZWQgZ3JpZWYgc3ltcHRvbSBzZXZlcml0eT8KTk8sIG5vdCBpbiBhbnkgb2YgdGhlIGNvbXBvbmVudCBwYWlycyBJIGxvb2tlZCBhdC4KCiMjIExvbmdpdHVkaW5hbCBhaW0gdy9mb2xsb3ctdXAgSUNHIChleHBsb3JhdG9yeSkKSW4gdGhpcyBhaW0sIEkgd2FudGVkIHRvIHRlc3Qgd2hldGhlciBzdGF0aWMgRk5DIHdvdWxkIHByZWRpY3QgY2hhbmdlIGluIGdyaWVmIHNldmVyaXR5IGZyb20gc3R1ZHkgdG8gMjAtMjQgbW9udGhzIHBvc3Qtc3R1ZHkuIAoKYGBge3J9Cgp0LnRlc3QoZGF0YV9wbCR0b3RfaWNnLCBkYXRhX3BsJHRvdF9pY2dfMjBtRlUsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQpkZXNjcmliZShkYXRhX3BsJHRvdF9pY2cpCmRlc2NyaWJlKGRhdGFfcGwkdG90X2ljZ18yMG1GVSkKIyB5ZXMsIElDRyBvbiBhdmVyYWdlIGlzIHNpZ25pZmljYW50bHkgZGVjcmVhc2VkIGF0IHRoZSBmb2xsb3ctdXAKCiMgY29tcHV0ZSBJQ0cgY2hhbmdlIGFuZCB0aW1lIGVsYXBzZWQgYmV0d2VlbiBkZWF0aCBhbmQgZm9sbG93LXVwCmRhdGFfcGwkdG90X2ljZ19jaGFuZ2UgPC0gZGF0YV9wbCR0b3RfaWNnXzIwbUZVIC0gZGF0YV9wbCR0b3RfaWNnCmRlc2NyaWJlKGRhdGFfcGwkdG90X2ljZ19jaGFuZ2UpCmhpc3QoZGF0YV9wbCR0b3RfaWNnX2NoYW5nZSkKCmRhdGFfcGwkdGltZV9kZWF0aF8yMG1GVV9tb3MgPC0gZGF0YV9wbCR0aW1lc2luY2VkZWF0aF9tb24gKyBkYXRhX3BsJHRpbWV0bzIwbUZVX21vcwpkZXNjcmliZShkYXRhX3BsJHRpbWVfZGVhdGhfMjBtRlVfbW9zKQpoaXN0KGRhdGFfcGwkdGltZV9kZWF0aF8yMG1GVV9tb3MpCgojIHJlbW92ZSB0aGUgY2FzZXMgd2l0aCBubyBmb2xsb3ctdXAgZGF0YSAoNyBvdXQgb2YgdGhlIDM4KQpkYXRhX3BsX2Z1IDwtIGRhdGFfcGwgJT4lIGZpbHRlcighaXMubmEodG90X2ljZ19jaGFuZ2UpKQpgYGAKCmBgYHtyfQojIFByZWRpY3RpbmcgSUNHIGNoYW5nZSBmcm9tIERNTiBtdGwtU04gZEFDQyBGTkMsIGNvbnRyb2xsaW5nIGZvciB0aW1lIHRvIGZvbGxvdy11cAphM2gzYSA8LSBsbSh0b3RfaWNnX2NoYW5nZSB+IGZuY19kbW4xMF9zbjI2ICsgdGltZXRvMjBtRlUsIGRhdGE9ZGF0YV9wbF9mdSkKc3VtbWFyeShhM2gzYSkKc3VtbShhM2gzYSwgY29uZmludD1UUlVFKSAjIHVzZSBqdG9vbHMgYHN1bW1gIGZ1bmN0aW9uIHRvIGdldCBjb25maWRlbmNlIGludGVydmFscwojIG1vZGVsIGRpYWdub3N0aWNzL2Fzc3VtcHRpb24tY2hlY2tpbmc6CnBsb3RfbW9kZWwoYTNoM2EsIHR5cGUgPSAiZGlhZyIpCnBsb3QoZGF0YV9wbF9mdSR0b3RfaWNnX2NoYW5nZSB+IGRhdGFfcGxfZnUkZm5jX2RtbjEwX3NuMjYpCgpwbG90X21vZGVsKGEzaDNhLCB0eXBlID0gInByZWQiLCB0ZXJtcyA9IGMoImZuY19kbW4xMF9zbjI2IiksIHNob3cuZGF0YT1UUlVFKSArIHhsYWIoIkRNTiBtdGwtU04gZEFDQyBjb25uZWN0aXZpdHkiKSArIHlsYWIoIklDRyBjaGFuZ2UiKSArIGxhYnModGl0bGU9IlByZWRpY3RlZCBJQ0cgY2hhbmdlIHNjb3JlcyIpCmBgYApETU4gbXRsLVNOIGRBQ0MgRk5DIGRvZXMgY29udGludWUgdG8gcHJlZGljdCBJQ0cgc2NvcmVzIGF0IGZvbGxvdy11cCB3aGVuIHRpbWUgdG8gZm9sbG93IHVwIGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbC4KCmBgYHtyfQppY2cgPC0gc3Vic2V0KGRhdGFfcGxfZnUsIHNlbGVjdD1jKElELCB0b3RfaWNnLCB0aW1ldG8yMG1GVSwgdG90X2ljZ19jaGFuZ2UsIGdyb3VwKSkgJT4lIG11dGF0ZSh0aW1lID0gcmVwKCJUMTogc3R1ZHkiKSkKaWNnX2Z1IDwtIHN1YnNldChkYXRhX3BsX2Z1LCBzZWxlY3Q9YyhJRCwgdG90X2ljZ18yMG1GVSx0b3RfaWNnX2NoYW5nZSwgZ3JvdXApKSAlPiUgcmVuYW1lKHRvdF9pY2cgPSB0b3RfaWNnXzIwbUZVKSAlPiUgbXV0YXRlKHRpbWUgPSByZXAoIlQyOiBmb2xsb3ctdXAiKSkKY2hhbmdlIDwtIGJpbmRfcm93cyhpY2csIGljZ19mdSkgJT4lIG11dGF0ZShJRD1hcy5mYWN0b3IoSUQpKQojIFBsb3QgdHJhamVjdG9yaWVzCgpnZ3Bsb3QoZGF0YSA9IGNoYW5nZSwgYWVzKHggPSB0aW1lLCB5ID0gdG90X2ljZywgZ3JvdXAgPSBJRCwgY29sb3I9Z3JvdXApKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTI1LCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImxpZ2h0IGJsdWUgNCIsIHNpemU9LjUpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTIyLjc5LCBsaW5ldHlwZT0iZG90dGVkIiwgY29sb3I9ImRhcmsgZ3JleSIsIHNpemU9LjUpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0PTE1LjQ1LCBsaW5ldHlwZT0iZG90dGVkIiwgY29sb3I9ImRhcmsgZ3JleSIsIHNpemU9LjUpICsKICBnZW9tX3BvaW50KCkgKyBnZW9tX2xpbmUoKSArIAogYW5ub3RhdGUoInRleHQiLCBsYWJlbCA9ICJDbGluaWNhbCBjdXRvZmYiLCB4ID0gLjU1LCB5ID0gMjcsIHNpemUgPSAzLCBjb2xvdXIgPSAibGlnaHQgYmx1ZSA0IiwgZm9udGZhY2UgPSAiaXRhbGljIikgKyAKIGFubm90YXRlKCJ0ZXh0IiwgbGFiZWwgPSAiU3R1ZHkgTSA9IDIyLjc4IiwgeCA9IC43NCwgeSA9IDIxLCBzaXplID0gMywgY29sb3VyID0gImRhcmsgZ3JleSIpICsKIGFubm90YXRlKCJ0ZXh0IiwgbGFiZWwgPSAiRm9sbG93LXVwIE0gPSAxNS40NSIsIHggPSAuNzQsIHkgPSAxNCwgc2l6ZSA9IDMsIGNvbG91ciA9ICJkYXJrIGdyZXkiKQoKCm1lYW4oZGF0YV9wbCR0b3RfaWNnKSAKbWVhbihkYXRhX3BsX2Z1JHRvdF9pY2cpIAptZWFuKGRhdGFfcGxfZnUkdG90X2ljZ18yMG1GVSkgCgpgYGAKCiMgRGVzY3JpcHRpdmVzIChNZXRob2RzKQpgYGB7cn0KIyByZWFkIGluIGRhdGEKZGF0YSA8LSByZWFkUkRTKCIvVXNlcnMvc2FyZW5zZWVsZXkvRHJvcGJveC9EaXNzZXJ0YXRpb24vTm9uLWZNUkkgZGF0YSBhbmFseXNpcy9tYXN0ZXJfd2l0aF9zdGF0aWNfRk5DLnJkcyIpCgojIG1ha2UgYSBwbGFjZWJvIHNlc3Npb24tb25seSBkYXRhc2V0IHRvIGdldCByaWQgb2YgZHVwbGljYXRlIG9ic2VydmF0aW9ucyBwZXIgcGVyc29uLAojIHdoaWNoIGNoYW5nZSB0aGUgZGVzY3JpcHRpdmUgc3RhdHMKZGF0YV9wbCA8LSBkYXRhICU+JSBmaWx0ZXIodHggPT0gInBsYWNlYm8iKQoKIyBhbHNvIG1ha2UgYW4gb3h5dG9jaW4gc2Vzc2lvbiBkYXRhc2V0IHdoaWxlIHdlJ3JlIGF0IGl0CmRhdGFfb3QgPC0gZGF0YSAlPiUgZmlsdGVyKHR4ID09ICJveHl0b2NpbiIpCgpgYGAKCgojIyBOQ0cgdnMgQ0cgZGVzY3JpcHRpdmVzIChSZXN1bHRzOyBUYWJsZSAxKQoKIyMjIFRpbWUtaW52YXJpYW50IHZhcmlhYmxlcwpgYGB7cn0KY291bnQoZGF0YV9wbCxncm91cCkgIyBuIGluIGVhY2ggZ3JvdXAKY291bnQoZGF0YV9wbF9mdSxncm91cF8yMG1GVSkgIyBuIGluIGVhY2ggZ3JvdXAgYXQgZm9sbG93LXVwCgojIHQtdGVzdHMKCiMjIGFnZQp0LnRlc3QoZGF0YV9wbCRhZ2VfeXJzIH4gZGF0YV9wbCRncm91cCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IEZBTFNFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQpkZXNjcmliZUJ5KGRhdGFfcGwkYWdlX3lycywgZ3JvdXA9ZGF0YV9wbCRncm91cCkKCiMjIHRpbWUgc2luY2UgZGVhdGgKdC50ZXN0KGRhdGFfcGwkdGltZXNpbmNlZGVhdGggfiBkYXRhX3BsJGdyb3VwLAogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwKICAgICAgIG11ID0gMCwgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCmRlc2NyaWJlQnkoZGF0YV9wbCR0aW1lc2luY2VkZWF0aCwgZ3JvdXA9ZGF0YV9wbCRncm91cCkKCiMjIHJlbGF0aW9uc2hpcCBsZW5ndGgKdC50ZXN0KGRhdGFfcGwkeXJzX3RvZ2V0aGVyIH4gZGF0YV9wbCRncm91cCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IEZBTFNFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQpkZXNjcmliZUJ5KGRhdGFfcGwkeXJzX3RvZ2V0aGVyLCBncm91cD1kYXRhX3BsJGdyb3VwKQoKIyMgdG90YWwgbiBwcmVzY3JpcHRpb24gbWVkaWNhdGlvbnMKdC50ZXN0KGRhdGFfcGwkbWVkc190b3RhbCB+IGRhdGFfcGwkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKZGVzY3JpYmVCeShkYXRhX3BsJG1lZHNfdG90YWwsIGdyb3VwPWRhdGFfcGwkZ3JvdXApCgojIyBCREkKdC50ZXN0KGRhdGFfcGwkdG90X2ljZyB+IGRhdGFfcGwkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKZGVzY3JpYmVCeShkYXRhX3BsJHRvdF9pY2csIGdyb3VwPWRhdGFfcGwkZ3JvdXApCgojIyBJQ0cKdC50ZXN0KGRhdGFfcGwkdG90X2JkaSB+IGRhdGFfcGwkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKZGVzY3JpYmVCeShkYXRhX3BsJHRvdF9iZGksIGdyb3VwPWRhdGFfcGwkZ3JvdXApCgojIyBJQ0cgYXQgZm9sbG93LXVwCnQudGVzdChkYXRhX3BsJHRvdF9pY2dfMjBtRlUgfiBkYXRhX3BsJGdyb3VwLAogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwKICAgICAgIG11ID0gMCwgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCgpkZXNjcmliZUJ5KGRhdGFfcGwkdG90X2ljZywgZ3JvdXA9ZGF0YV9wbCRncm91cCkKZGVzY3JpYmVCeShkYXRhX3BsJHRvdF9pY2dfMjBtRlUsIGdyb3VwPWRhdGFfcGwkZ3JvdXApCmJpLmJhcnMoZGF0YV9wbCwgInRvdF9pY2dfMjBtRlUiLCAiZ3JvdXAiKQpgYGAKTm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBhZ2UsIGxlbmd0aCBvZiByZWxhdGlvbnNoaXAsIHRpbWUgc2luY2UgZGVhdGgsIG9yIHRvdGFsIG51bWJlciBvZiBwcmVzY3JpcHRpb24gbWVkcy4gVW5zdXJwcmlzaW5nbHksIHRoZSBDRyBncm91cCBoYXMgaGlnaGVyIG1lYW4gQkRJIGFuZCBJQ0cgc2NvcmVzLgoKCmBgYHtyfQojIGNoaS1zcXVhcmUgdGVzdHMKCiMjIHNleApjaGlzcS50ZXN0KGRhdGFfcGwkZ3JvdXAsIHkgPSBkYXRhX3BsJHNleF9tLCBjb3JyZWN0ID0gRkFMU0UsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFKSAKIyB1c2UgdGhlIHNpbXVsYXRlZCBwIHZhbHVlIGJlY2F1c2UgaWYgeW91IGRvbid0LCB3aXRoIHNtYWxsIGNlbGwgc2l6ZXMsIG1hbnkgb2YgdGhlIGV4cGVjdGVkIHZhbHVlcyB3aWxsIGJlIHZlcnkgc21hbGwgCiMgYW5kIHRoZXJlZm9yZSB0aGUgYXBwcm94aW1hdGlvbnMgb2YgcCBtYXkgbm90IGJlIGNvcnJlY3QgKFIgd2lsbCB3YXJuIHlvdSBhYm91dCB0aGlzKQpkYXRhX3BsICU+JSBncm91cF9ieShncm91cCkgJT4lCiAgY291bnQoc2V4X20pICU+JQogIG11dGF0ZShgKFxcJSlgID0gcHJvcC50YWJsZShuKSoxMDApCgojIyByYWNlCmNoaXNxLnRlc3QoZGF0YV9wbCRncm91cCwgeSA9IGRhdGFfcGwkcmFjZSwgY29ycmVjdCA9IEZBTFNFLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSkKZGF0YV9wbCAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JQogIGNvdW50KHJhY2UpICU+JQogIG11dGF0ZShgKFxcJSlgID0gcHJvcC50YWJsZShuKSoxMDApCgojIyBldGhuaWNpdHkKY2hpc3EudGVzdChkYXRhX3BsJGdyb3VwLCB5ID0gZGF0YV9wbCRldGhuaWNpdHlfaGlzcCwgY29ycmVjdCA9IEZBTFNFLCBzaW11bGF0ZS5wLnZhbHVlID0gVFJVRSkKZGF0YV9wbCAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JQogIGNvdW50KGV0aG5pY2l0eV9oaXNwKSAlPiUKICBtdXRhdGUoYChcXCUpYCA9IHByb3AudGFibGUobikqMTAwKQoKIyMgZWR1Y2F0aW9uIChjb2xsZWdlIGdyYWQgdnMuIGxlc3MgdGhhbiBjb2xsZWdlIGRlZ3JlZSkKY2hpc3EudGVzdChkYXRhX3BsJGdyb3VwLCB5ID0gZGF0YV9wbCRlZHVjYXRpb25fY29sbGVnZWdyYWQsIGNvcnJlY3QgPSBGQUxTRSkKZGF0YV9wbCAlPiUgZ3JvdXBfYnkoZ3JvdXApICU+JQogIGNvdW50KGVkdWNhdGlvbl9jb2xsZWdlZ3JhZCkgJT4lCiAgbXV0YXRlKGAoXFwlKWAgPSBwcm9wLnRhYmxlKG4pKjEwMCkKCiMjIGVtcGxveW1lbnQgKHJldGlyZWQgdnMuIHN0aWxsIHdvcmtpbmcgZnVsbC9wYXJ0LXRpbWUgb3IgbG9va2luZyBmb3Igd29yaykKY2hpc3EudGVzdChkYXRhX3BsJGdyb3VwLCB5ID0gZGF0YV9wbCRlbXBsb3ltZW50X3JldGlyZWQsIGNvcnJlY3QgPSBGQUxTRSwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUpCmRhdGFfcGwgJT4lIGdyb3VwX2J5KGdyb3VwKSAlPiUKICBjb3VudChlbXBsb3ltZW50X3JldGlyZWQpICU+JQogIG11dGF0ZShgKFxcJSlgID0gcHJvcC50YWJsZShuKSoxMDApCgojIyBwc3ljaG9hY3RpdmUgbWVkcyAoeWVzL25vKQpjaGlzcS50ZXN0KGRhdGFfcGwkZ3JvdXAsIHkgPSBkYXRhX3BsJG1lZHNfcHN5Y2hvYWN0aXZlLCBjb3JyZWN0ID0gRkFMU0UsIHNpbXVsYXRlLnAudmFsdWUgPSBUUlVFKQpkYXRhX3BsICU+JSBncm91cF9ieShncm91cCkgJT4lCiAgY291bnQobWVkc19wc3ljaG9hY3RpdmUpICU+JQogIG11dGF0ZShgKFxcJSlgID0gcHJvcC50YWJsZShuKSoxMDApCgojIyBob3Jtb25lIG9yIG9waWF0ZSBtZWRzICh5ZXMvbm8pCmNoaXNxLnRlc3QoZGF0YV9wbCRncm91cCwgeSA9IGRhdGFfcGwkbWVkc19ob3Jtb25lX29waWF0ZSwgY29ycmVjdCA9IEZBTFNFKQpkYXRhX3BsICU+JSBncm91cF9ieShncm91cCkgJT4lCiAgY291bnQobWVkc19ob3Jtb25lX29waWF0ZSkgJT4lCiAgbXV0YXRlKGAoXFwlKWAgPSBwcm9wLnRhYmxlKG4pKjEwMCkKCiMjIG9yZGVyIG9mIHNlc3Npb25zIChCIGZpcnN0IHZzLiBBIGZpcnN0KQpjaGlzcS50ZXN0KGRhdGFfcGwkZ3JvdXAsIHkgPSBkYXRhX3BsJHR4X3YxLCBjb3JyZWN0ID0gRkFMU0UpCmRhdGFfcGwgJT4lIGdyb3VwX2J5KGdyb3VwKSAlPiUKICBjb3VudCh0eF92MSkgJT4lCiAgbXV0YXRlKGAoXFwlKWAgPSBwcm9wLnRhYmxlKG4pKjEwMCkKCmBgYApObyBzaWduaWZpY2FudCBncm91cCBkaWZmZXJlbmNlcyBpbiB0aGUgZnJlcXVlbmNpZXMsIHRob3VnaCB0aGUgQ0cgZ3JvdXAgZG9lcyBoYXZlIGEgaGlnaGVyIHByb3BvcnRpb24gb2YgbWVuIGFuZCB0aGUgTkNHIGhhcyBhIGhpZ2hlciBwcm9wb3J0aW9uIG9mIHBlb3BsZSB0YWtpbmcgaG9ybW9uZXMgKG5vdCBIUlQgLSB0aGlzIGNhdGVnb3J5IGluY2x1ZGVzIHRoaW5ncyBsaWtlIGxldm90aHlyb3hpbmUsIGluc3VsaW4sIGV0Yy4pIG9yIG9waWF0ZSBtZWRpY2F0aW9ucyAobj0xKS4gSSBzdXNwZWN0IHRoaXMgaXMgY29uZm91bmRlZCB3aXRoIHRoZSBpbWJhbGFuY2UgaW4gc2V4IGJldHdlZW4gdGhlIHR3byBncm91cHMgKGkuZS4sIG1vcmUgd29tZW4gYmVpbmcgdHJlYXRlZCBmb3IgbG93IHRoeXJvaWQpLgoKYGBge3J9CmJpLmJhcnMoZGF0YV9wbCwgIm1lZHNfaG9ybW9uZV9vcGlhdGUiLCAiZ3JvdXAiLCBtYWluPSJOb24tSFJUIGhvcm1vbmUgJiBvcGlhdGUgbWVkcyBieSBncm91cCAoTkNHLCBDRykiLCB6ZXJvPUZBTFNFKSAKIyBvbiB0aGUgeS1heGlzLCAxID0gTm8sIDIgPSBZZXMsIHRha2luZwoKdGFibGUoZGF0YV9wbCRtZWRzX2hvcm1vbmVfb3BpYXRlLCBkYXRhX3BsJHNleF9tLCBkYXRhX3BsJGdyb3VwKQpgYGAKCiMjIyBTdGF0ZSB2YXJpYWJsZXMgYnkgZ3JvdXAKYGBge3J9CiMgdC10ZXN0cwoKIyMjIFBBTkFTCiMjIHByZSBQQU5BUyBOQSAocGxhY2VibykKdC50ZXN0KGRhdGFfcGwkdG90X3ByZV9wYW5hc19uYSB+IGRhdGFfcGwkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKZGVzY3JpYmVCeShkYXRhX3BsJHRvdF9wcmVfcGFuYXNfbmEsIGdyb3VwPWRhdGFfcGwkZ3JvdXApCgojIyBwcmUgUEFOQVMgTkEgKG94eXRvY2luKQp0LnRlc3QoZGF0YV9vdCR0b3RfcHJlX3BhbmFzX25hIH4gZGF0YV9vdCRncm91cCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IEZBTFNFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQpkZXNjcmliZUJ5KGRhdGFfb3QkdG90X3ByZV9wYW5hc19uYSwgZ3JvdXA9ZGF0YV9vdCRncm91cCkKCiMjIHByZSBQQU5BUyBQQSAocGxhY2VibykKdC50ZXN0KGRhdGFfcGwkdG90X3ByZV9wYW5hc19wYSB+IGRhdGFfcGwkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKZGVzY3JpYmVCeShkYXRhX3BsJHRvdF9wcmVfcGFuYXNfcGEsIGdyb3VwPWRhdGFfcGwkZ3JvdXApCgojIyBwcmUgUEFOQVMgUEEgKG94eXRvY2luKQp0LnRlc3QoZGF0YV9vdCR0b3RfcHJlX3BhbmFzX3BhIH4gZGF0YV9vdCRncm91cCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IEZBTFNFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQpkZXNjcmliZUJ5KGRhdGFfb3QkdG90X3ByZV9wYW5hc19wYSwgZ3JvdXA9ZGF0YV9vdCRncm91cCkKCgojIyMgU1RBSS1TCiMjIHByZSBTVEFJIChwbGFjZWJvKQp0LnRlc3QoZGF0YV9wbCR0b3RfcHJlX3N0YWkgfiBkYXRhX3BsJGdyb3VwLAogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwKICAgICAgIG11ID0gMCwgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCmRlc2NyaWJlQnkoZGF0YV9wbCR0b3RfcHJlX3N0YWksIGdyb3VwPWRhdGFfcGwkZ3JvdXApCgojIyBwcmUgU1RBSSAob3h5dG9jaW4pCnQudGVzdChkYXRhX290JHRvdF9wcmVfc3RhaSB+IGRhdGFfb3QkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKZGVzY3JpYmVCeShkYXRhX290JHRvdF9wcmVfc3RhaSwgZ3JvdXA9ZGF0YV9vdCRncm91cCkKCiMjIHBvc3QgU1RBSSAocGxhY2VibykKdC50ZXN0KGRhdGFfcGwkdG90X3Bvc3Rfc3RhaSB+IGRhdGFfcGwkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKZGVzY3JpYmVCeShkYXRhX3BsJHRvdF9wb3N0X3N0YWksIGdyb3VwPWRhdGFfcGwkZ3JvdXApCgojIyBwb3N0IFNUQUkgKG94eXRvY2luKQp0LnRlc3QoZGF0YV9vdCR0b3RfcG9zdF9zdGFpIH4gZGF0YV9vdCRncm91cCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IEZBTFNFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQpkZXNjcmliZUJ5KGRhdGFfb3QkdG90X3Bvc3Rfc3RhaSwgZ3JvdXA9ZGF0YV9vdCRncm91cCkKCgojIyMgRnJhbWV3aXNlIGRpc3BsYWNlbWVudAojIyBtZWFuIGZyYW1ld2lzZSBkaXNwbGFjZW1lbnQgKHBsYWNlYm8gc2Vzc2lvbikKdC50ZXN0KGRhdGFfcGwkZmRfbWVhbiB+IGRhdGFfcGwkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKZGVzY3JpYmVCeShkYXRhX3BsJGZkX21lYW4sIGdyb3VwPWRhdGFfcGwkZ3JvdXApCgojIyBtZWFuIGZyYW1ld2lzZSBkaXNwbGFjZW1lbnQgKG94eXRvY2luIHNlc3Npb24pCnQudGVzdChkYXRhX290JGZkX21lYW4gfiBkYXRhX290JGdyb3VwLAogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwKICAgICAgIG11ID0gMCwgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCmRlc2NyaWJlQnkoZGF0YV9vdCRmZF9tZWFuLCBncm91cD1kYXRhX290JGdyb3VwKQoKCiMjIyBUaW1lIHRvIHJlc3QKIyMgbWVhbiB0aW1lIHRvIHJlc3Rpbmcgc3RhdGUgc3RhcnQgKHBsYWNlYm8gc2Vzc2lvbikKdC50ZXN0KGRhdGFfcGwkdGltZXRvcmVzdCB+IGRhdGFfcGwkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKZGVzY3JpYmVCeShkYXRhX3BsJHRpbWV0b3Jlc3QsIGdyb3VwPWRhdGFfcGwkZ3JvdXApCgojIyBtZWFuIHRpbWUgdG8gcmVzdGluZyBzdGF0ZSBzdGFydCAob3h5dG9jaW4gc2Vzc2lvbikKdC50ZXN0KGRhdGFfb3QkdGltZXRvcmVzdCB+IGRhdGFfb3QkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKZGVzY3JpYmVCeShkYXRhX290JHRpbWV0b3Jlc3QsIGdyb3VwPWRhdGFfb3QkZ3JvdXApCgojIyMgVGhvdWdodCBjb250ZW50IAojIHNwb3VzZSByZWxhdGVkICglKSwgbm9uLXNwb3VzZSByZWxhdGVkICglKQoKdC50ZXN0KGRhdGFfcGwkZm9jdXNfc3BvdXNlX3BlcmMgfiBkYXRhX3BsJGdyb3VwLAogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwKICAgICAgIG11ID0gMCwgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCgp0LnRlc3QoZGF0YV9wbCRmb2N1c19ub25zcG91c2VfcGVyYyB+IGRhdGFfcGwkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKCnQudGVzdChkYXRhX290JGZvY3VzX3Nwb3VzZV9wZXJjIH4gZGF0YV9vdCRncm91cCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IEZBTFNFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQoKdC50ZXN0KGRhdGFfb3QkZm9jdXNfbm9uc3BvdXNlX3BlcmMgfiBkYXRhX290JGdyb3VwLAogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwKICAgICAgIG11ID0gMCwgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCgp0LnRlc3QoZGF0YSRmb2N1c19zcG91c2VfcGVyYyB+IGRhdGEkZ3JvdXAsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBGQUxTRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKCnQudGVzdChkYXRhJGZvY3VzX25vbnNwb3VzZV9wZXJjIH4gZGF0YSRncm91cCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IEZBTFNFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQpgYGAKQXQgdGhlIHBsYWNlYm8gc2Vzc2lvbiwgdGhlIGdyb3VwcyBkaWZmZXIgb24gYHRvdF9wcmVfc3RhaWAgJiBgdG90X3ByZV9wYW5hc19uYWAgKENHID4gTkNHKS4KCkF0IHRoZSBveHl0b2NpbiBzZXNzaW9uLCB0aGUgZ3JvdXBzIGRpZmZlciBvbiBgdG90X3ByZV9zdGFpYCAmIGB0b3RfcHJlX3BhbmFzX25hYCAoQ0cgPiBOQ0cpLiAKCk1lYW4gZnJhbWV3aXNlIGRpc3BsYWNlbWVudCBhbmQgdGltZSBlbGFwc2VkIGZyb20gc3ByYXkgYWRtaW4uIHRvIHJlc3Rpbmcgc3RhdGUgZG8gbm90IHNpZ25pZmljYW50bHkgZGlmZmVyIGF0IGVpdGhlciBzZXNzaW9uLiBIb3dldmVyLCB0aGUgTkNHIGdyb3VwIG92ZXJhbGwgaGFzIG1vcmUgbW92ZW1lbnQgdGhhbiB0aGUgQ0cgZ3JvdXAgZHVyaW5nIHRoZSBveHl0b2NpbiBzZXNzaW9uIChfcF8gPSAuMDc3KSwgYW5kIGl0IG1heSBtYWtlIHNlbnNlIHRvIGNvbnRyb2wgZm9yIHRoaXMuCgpQZXJjZW50IG9mIHNwb3VzZS1yZWxhdGVkIG9yIG5vbi1zcG91c2UtcmVsYXRlZCB0aG91Z2h0IGNvbnRlbnQgZG9lc24ndCBkaWZmZXIgYnkgZ3JvdXAgYXQgZWl0aGVyIHNlc3Npb24sIGJ1dCB3aGVuIGNvbGxhcHNpbmcgYWNyb3NzIHNlc3Npb24sIHRoZSBDRyBncm91cCB0ZW5kcyB0byByZXBvcnQgbW9yZSBzcG91c2UtcmVsYXRlZCBjb250ZW50LCBfcF8gPSAuMDguCgojIyBPVCB2cy4gUEwgKHN0YXRlIHZhcmlhYmxlcykKCmBgYHtyfQojIGJ5IHRyZWF0bWVudApkZXNjcmliZShkYXRhJHRpbWV0b3Jlc3QpCnQudGVzdChkYXRhJHRpbWV0b3Jlc3QgfiBkYXRhJHR4LAogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwKICAgICAgIG11ID0gMCwgcGFpcmVkID0gVFJVRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKCnQudGVzdChkYXRhJHRpbWV0b3Jlc3QgfiBkYXRhJGdyb3VwLAogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwKICAgICAgIG11ID0gMCwgcGFpcmVkID0gRkFMU0UsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCgp0LnRlc3QoZGF0YSRmZF9tZWFuIH4gZGF0YSR0eCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCgp0LnRlc3QoZGF0YSR0b3RfcHJlX3BhbmFzX25hIH4gZGF0YSR0eCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCgp0LnRlc3QoZGF0YSR0b3RfcHJlX3BhbmFzX3BhIH4gZGF0YSR0eCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCgp0LnRlc3QoZGF0YSR0b3RfcHJlX3N0YWkgfiBkYXRhJHR4LAogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwKICAgICAgIG11ID0gMCwgcGFpcmVkID0gVFJVRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKCnQudGVzdChkYXRhJHRvdF9wb3N0X3BhbmFzX25hIH4gZGF0YSR0eCwKICAgICAgIGFsdGVybmF0aXZlID0gYygidHdvLnNpZGVkIiksCiAgICAgICBtdSA9IDAsIHBhaXJlZCA9IFRSVUUsIHZhci5lcXVhbCA9IEZBTFNFLAogICAgICAgY29uZi5sZXZlbCA9IDAuOTUpCgp0LnRlc3QoZGF0YSR0b3RfcG9zdF9wYW5hc19wYSB+IGRhdGEkdHgsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQoKdC50ZXN0KGRhdGEkdG90X3Bvc3Rfc3RhaSB+IGRhdGEkdHgsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQoKIyBEMTE1IGlzIG1pc3NpbmcgcG9zdC1zY2FuIFNST0UgYXQgb25lIHNlc3Npb24sIHNvIHRlc3QgdGhlIFNST0UgdmFyaWFibGVzIGFmdGVyIHJlbW92aW5nIHRoZWlyIGNhc2UKZGF0YV9ubzExNSA8LSBkYXRhICU+JSBmaWx0ZXIoSUQgIT0gIkQxMTUiKQp0LnRlc3QoZGF0YV9ubzExNSRmb2N1c19zcG91c2VfcGVyYyB+IGRhdGFfbm8xMTUkdHgsCiAgICAgICBhbHRlcm5hdGl2ZSA9IGMoInR3by5zaWRlZCIpLAogICAgICAgbXUgPSAwLCBwYWlyZWQgPSBUUlVFLCB2YXIuZXF1YWwgPSBGQUxTRSwKICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQoKdC50ZXN0KGRhdGFfbm8xMTUkZm9jdXNfbm9uc3BvdXNlX3BlcmMgfiBkYXRhX25vMTE1JHR4LAogICAgICAgYWx0ZXJuYXRpdmUgPSBjKCJ0d28uc2lkZWQiKSwKICAgICAgIG11ID0gMCwgcGFpcmVkID0gVFJVRSwgdmFyLmVxdWFsID0gRkFMU0UsCiAgICAgICBjb25mLmxldmVsID0gMC45NSkKYGBgCk9ubHkgcHJlLXNjYW4gU1RBSSBkaWZmZXJzIGJ5IGB0eGAsIGFzIHNob3duIGJlbG93LiBQZW9wbGUgYXJlIGdlbmVyYWxseSBtb3JlIGFueGlvdXMgYmVmb3JlIHRoZSBPVCBzZXNzaW9uIChhbHRob3VnaCBmcm9tIHRoZSBkZXNjcmlwdGl2ZXMgYmVsb3csIGl0IGRvZXNuJ3QgbG9vayBsaWtlIHRoaXMgc2hvdWxkIGJlIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4gSG1tLikKCmBgYHtyfQpkZXNjcmliZUJ5KGRhdGEkdG90X3ByZV9zdGFpLCBncm91cD1kYXRhJHR4KQpoaXN0QnkoZGF0YSwgInRvdF9wcmVfc3RhaSIsICJ0eCIpCmJpLmJhcnMoZGF0YSwgInRvdF9wcmVfc3RhaSIsICJ0eCIsIG1haW49InByZS1zY2FuIFNUQUkgYnkgc2Vzc2lvbiAoUEwsIE9UKSIsIHplcm89RkFMU0UpCgpgYGAKCiMjIyBDb25jbHVzaW9ucyAoY292YXJpYXRlIGlkZW50aWZpY2F0aW9uKSA/Ck1vZGVscyBzaG91bGQgZGVmaW5pdGVseSBpbmNsdWRlIGB0b3RfYmRpYCBhcyBhIHByZWRpY3RvciwgYW5kIHBvc3NpYmx5IHByZS1zY2FuIG5lZ2F0aXZlIGFmZmVjdCBhbmQgYW54aWV0eSAoYHRvdF9wcmVfcGFuYXNfbmFgLCBgdG90X3ByZV9zdGFpYCksIGFzIHRoZSB0d28gZ3JvdXBzIGRpZmZlciBpbiB0aGVzZS4gTWF5IGFsc28gd2FudCB0byBjb25zaWRlciBpbmNsdWRpbmcgYGZkX21lYW5gLCBhcyB0aGUgTkNHIGdyb3VwIG9uIGF2ZXJhZ2UgbW92ZWQgYSBiaXQgbW9yZSBkdXJpbmcgdGhlIE9UIHNlc3Npb24gY29tcGFyZWQgdG8gdGhlIENHIGdyb3VwIChfcF8gPCAuMDc3KS4gCgpNYXliZSBhZ2UgYXMgd2VsbCwgc2luY2UgdGhhdCBhbmQgZnJhbWV3aXNlIGRpc3BsYWNlbWVudC9tb3Rpb24gb3ZlcmFsbCBhcmUga25vd24gdG8gaW1wYWN0IEZOQz8gCgpGb3IgdGhlIGFuYWx5c2VzIGludm9sdmluZyBkYXRhIGZyb20gdGhlIG94eXRvY2luIHNlc3Npb24sIGluY2x1ZGUgYWdlIGFuZCBzZXggYmFzZWQgb24gdGhlIEVibmVyIHBhcGVyPwoKXyoqQnV0LCBteSBhbmFseXNlcyBhcmVuJ3QgdXNpbmcgYGdyb3VwYCwgc28uLi4/KipfCgoKCgoKCgo=