1 Define functions

## Define function that recodes to numeric, but watches out to coercion to not introduce NAs
colstonumeric <- function(df){
  tryCatch({
    df_num <- as.data.frame(
      lapply(df,
             function(x) { as.numeric(as.character(x))})) 
  },warning = function(stop_on_warning) {
    message("Stoped the execution of numeric conversion: ", conditionMessage(stop_on_warning))
  }) 
}
##
## Define function that reverse codes items
ReverseCode <- function(df, tonumeric = FALSE, min = NULL, max = NULL) {
  if(tonumeric) df <- colstonumeric(df)
  df <- (max + min) - df
}
##


# Scores
## Define function that scores only rows with less than 10% NAs (returns NA if all or above threshold percentage of rows are NA); can reverse code if vector of column indexes and min, max are provided.
ScoreLikert <- function(df, stat = c("sum", "mean"), imputena = c(FALSE, "zero", "mean", "median"), 
                        napercent = .1, tonumeric = FALSE, reversecols = NULL, min = NULL, max = NULL) {
  stat <- match.arg(stat)
  imputena <- match.arg(imputena)
  reverse_list <- list(reversecols = reversecols, min = min, max = max)
  reverse_check <- !sapply(reverse_list, is.null)
  
  # Recode to numeric, but watch out to coercion to not introduce NAs
  colstonumeric <- function(df){
    tryCatch({
      df_num <- as.data.frame(
        lapply(df,
               function(x) { as.numeric(as.character(x))})) 
    },warning = function(stop_on_warning) {
      message("Stoped the execution of numeric conversion: ", conditionMessage(stop_on_warning))
    }) 
  }
  
  if(tonumeric) df <- colstonumeric(df)
  
  if(all(reverse_check)){
    df[ ,reversecols] <- (max + min) - df[ ,reversecols]
  }else if(any(reverse_check)){
    stop("Insuficient info for reversing. Please provide: ", paste(names(reverse_list)[!reverse_check], collapse = ", "))
  }
  
  if(tonumeric) df <- colstonumeric(df)                           
  
  if(imputena == "zero") df[is.na(df)] <- 0                            # NAs to 0 can help when stat = "mean" with na.rm = T because it keeps denominator constant
  if(imputena == "mean") {                                             # replace NA with row means, the denominator of this mean is the number of completed items
    # index_na <- which(is.na(df), arr.ind = TRUE)                    # for some reason doesnt work on tibbles
    # df[index_na] <- rowMeans(df, na.rm=TRUE)[index_na[, 1]]
    df <- t(apply(df, 1, function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))))
  }
  if(imputena == "median") {                                             # replace NA with row medians
    df <- t(apply(df, 1, function(x) replace(x, is.na(x), median(x, na.rm = TRUE))))
} 
  
  if(stat == "sum"){
    df_res <- ifelse(rowSums(is.na(df)) > ncol(df) * napercent,
                     NA,
                     rowSums(df, na.rm = TRUE) * NA ^ (rowSums(!is.na(df)) == 0))
  }
  if(stat == "mean"){
    df_res <- ifelse(rowSums(is.na(df)) > ncol(df) * napercent,
                     NA,
                     rowMeans(df, na.rm = TRUE) * NA ^ (rowSums(!is.na(df)) == 0))
  }
  return(df_res)
}
##


# Tests --- Don't Run
# bla <- mtcars[, 8:11]
# 
# bla[1, 4] <- NA
# bla[2, 3] <- NA; bla[2, 4] <- NA 
# bla[3, 2] <- NA; bla[3, 3] <- NA; bla[3, 4] <- NA 
# 
# bla$Tot <- ScoreLikert(bla[, 1:4]) 
# bla$Tot2 <- ScoreLikert(bla[, 1:4], napercent = .9) 
# bla$Tot3 <- ScoreLikert(bla[, 1:4], imputena = "zero", napercent = .1)
# bla$Tot4 <- ScoreLikert(bla[, 1:4], stat = "mean", imputena = "zero", napercent = .1)
# bla$Tot5 <- ScoreLikert(bla[, 1:4], stat = "sum", imputena = "zero", napercent = .1)
# bla$Tot6 <- ScoreLikert(bla[, 1:4], stat = "sum", imputena = "mean", napercent = .9)

2 Read data

3 Clean, Transform, Score scales

## Cutoffs
cutoffPCL <- 32   # literature: 31-33 or 38 
algPCL <- data.frame(B = 1, C = 1, D = 2, E = 2)

cutoffMBI_Ex <- 2.20  
cutoffMBI_Cy <- 2
##


# Define column index:  index = col index; itemindex = index of item in questionnaire
indexDASS <- 22:42
indexMBI <- 43:58
indexCERQ <- 59:94
indexPCL <- 95:114

itemindexMBI_Ex <- c(1, 3, 5, 11, 14)      # Emotional Exhaustion
itemindexMBI_Cy <- c(2, 7, 8, 13, 15)      # Cynicism
itemindexMBI_Pe <- c(4, 6, 9, 10, 12, 16)  # Professional Efficacy

itemindexDASS_S <- c(1, 6, 8, 11, 12, 14, 18)
itemindexDASS_D <- c(3, 5, 10, 13, 16, 17, 21)
itemindexDASS_A <- c(2, 4, 7, 9, 15, 19, 20)

itemindexCERQ_Sbl <- c(1, 10, 19, 28)  # Self-blame
itemindexCERQ_Acc <- c(2, 11, 20, 29)  # Acceptance
itemindexCERQ_Rum <- c(3, 12, 21, 30)  # Rumination
itemindexCERQ_PRf <- c(4, 13, 22, 31)  # Positive Refocusing
itemindexCERQ_RPl <- c(5, 14, 23, 32)  # Refocus on Planning
itemindexCERQ_PRa <- c(6, 15, 24, 33)  # Positive Reappraisal
itemindexCERQ_PPe <- c(7, 16, 25, 34)  # Putting into Perspective
itemindexCERQ_Cat <- c(8, 17, 26, 35)  # Catastrophizing
itemindexCERQ_Obl <- c(9, 18, 27, 36)  # Other-blame

# Rename columns
# names(Data)[1:12] <- stringr::str_replace_all(names(Data)[1:12], "[[:blank:]]", "_")
Data <- janitor::clean_names(Data)
names(Data)[1] <- "ID"
names(Data)[names(Data) %in% names(Data[, indexDASS])]  <- c(sprintf("DASS_%01d", seq(1, 21)))
names(Data)[names(Data) %in% names(Data[, indexMBI])]  <- c(sprintf("MBI_%01d", seq(1, 16)))
names(Data)[names(Data) %in% names(Data[, indexCERQ])]  <- c(sprintf("CERQ_%01d", seq(1, 36)))
names(Data)[names(Data) %in% names(Data[, indexPCL])]  <- c(sprintf("PCL_%01d", seq(1, 20)))

# Transform general info
to_num_cols <- c(2, 5, 6)  # "varsta", "copii", "nepoti"
to_fac_cols <- c(3, 4, 7:21)

Data <-
  Data %>%
  dplyr::mutate_at(vars(to_num_cols), as.numeric) %>%
  dplyr::mutate_at(vars(to_fac_cols), as.factor)

# Transfomr item scores to numeric
Data[, indexDASS] <- colstonumeric(Data[, indexDASS])
Data[, indexMBI] <- colstonumeric(Data[, indexMBI])
Data[, indexCERQ] <- colstonumeric(Data[, indexCERQ])
Data[, indexPCL] <- colstonumeric(Data[, indexPCL])


# Score CERQ
Data$CERQ_Sbl  <- ScoreLikert(Data[, c(sprintf("CERQ_%01d", itemindexCERQ_Sbl))], stat = "sum", imputena = "mean", napercent = 1)
Data$CERQ_Acc  <- ScoreLikert(Data[, c(sprintf("CERQ_%01d", itemindexCERQ_Acc))], stat = "sum", imputena = "mean", napercent = 1)
Data$CERQ_Rum  <- ScoreLikert(Data[, c(sprintf("CERQ_%01d", itemindexCERQ_Rum))], stat = "sum", imputena = "mean", napercent = 1)
Data$CERQ_PRf  <- ScoreLikert(Data[, c(sprintf("CERQ_%01d", itemindexCERQ_PRf))], stat = "sum", imputena = "mean", napercent = 1)
Data$CERQ_RPl  <- ScoreLikert(Data[, c(sprintf("CERQ_%01d", itemindexCERQ_RPl))], stat = "sum", imputena = "mean", napercent = 1)
Data$CERQ_PRa  <- ScoreLikert(Data[, c(sprintf("CERQ_%01d", itemindexCERQ_PRa))], stat = "sum", imputena = "mean", napercent = 1)
Data$CERQ_PPe  <- ScoreLikert(Data[, c(sprintf("CERQ_%01d", itemindexCERQ_PPe))], stat = "sum", imputena = "mean", napercent = 1)
Data$CERQ_Cat  <- ScoreLikert(Data[, c(sprintf("CERQ_%01d", itemindexCERQ_PPe))], stat = "sum", imputena = "mean", napercent = 1)


# Score DASS
Data$DASS_S  <- ScoreLikert(Data[, c(sprintf("DASS_%01d", itemindexDASS_S))], napercent = 1)
Data$DASS_D  <- ScoreLikert(Data[, c(sprintf("DASS_%01d", itemindexDASS_D))], napercent = 1)
Data$DASS_A  <- ScoreLikert(Data[, c(sprintf("DASS_%01d", itemindexDASS_A))], napercent = 1)

# Correct MBI error (MBI items scores are 0-6, while in data item scores range 0-7)
Data[, indexMBI] <-
  Data[, indexMBI] %>%
  dplyr::mutate_all(~ifelse(. == 7, 6, .))

# Score MBI
Data$MBI_Total <- ScoreLikert(Data[, indexMBI], napercent = .3, stat = "mean", imputena = "zero")
Data$MBI_Ex <- ScoreLikert(Data[, c(sprintf("MBI_%01d", itemindexMBI_Ex))], napercent = 1, stat = "mean", imputena = "zero")
Data$MBI_Cy <- ScoreLikert(Data[, c(sprintf("MBI_%01d", itemindexMBI_Cy))], napercent = 1, stat = "mean", imputena = "zero")
Data$MBI_Pe <- ScoreLikert(Data[, c(sprintf("MBI_%01d", itemindexMBI_Pe))], napercent = 1, stat = "mean", imputena = "zero")

# Score PCL
Data$PCL_Total <- ScoreLikert(Data[, indexPCL], napercent = .3)               # NA if NA threshold is exceeded 
Data$PCL_B <- ScoreLikert(Data[, c(sprintf("PCL_%01d", 1:5))], napercent = 1)    # do nothing if NA threshold is exceeded
Data$PCL_C <- ScoreLikert(Data[, c(sprintf("PCL_%01d", 6:7))], napercent = 1) 
Data$PCL_D <- ScoreLikert(Data[, c(sprintf("PCL_%01d", 8:14))], napercent = 1)  
Data$PCL_E <- ScoreLikert(Data[, c(sprintf("PCL_%01d", 15:20))], napercent = 1)



# ---
# PCL Diagnostic Algorithm
itemsPCL_B <- c(sprintf("PCL_%01d", 1:5))
itemsPCL_C <- c(sprintf("PCL_%01d", 6:7))
itemsPCL_D <- c(sprintf("PCL_%01d", 8:14))
itemsPCL_E <- c(sprintf("PCL_%01d", 15:20))

DataPCLAlg <-  
  Data %>% 
  dplyr::select(tidyselect::all_of(indexPCL)) %>% 
  dplyr::mutate_all(
    funs(case_when(
      . >=2 ~ 1,
      # . <2 ~ 0,
      is.na(.) ~ 0,
      TRUE  ~  0))) %>% 
  
  mutate(PCL_CritB = case_when(rowSums(.[,itemsPCL_B], na.rm = TRUE) >= algPCL$B ~ 1,      # algPCL <- data.frame(B = 1, C = 1, D = 2, E = 2)
                               # rowSums(.[,itemsPCL_B], na.rm = TRUE) <1 ~ 0,
                               TRUE  ~  0)) %>% 
  mutate(PCL_CritC = case_when(rowSums(.[,itemsPCL_C], na.rm = TRUE) >= algPCL$C ~ 1,    
                               # rowSums(.[,itemsPCL_C], na.rm = TRUE) <1 ~ 0,
                               TRUE  ~  0)) %>% 
  mutate(PCL_CritD = case_when(rowSums(.[,itemsPCL_D], na.rm = TRUE) >= algPCL$D ~ 1,   
                               # rowSums(.[,itemsPCL_D], na.rm = TRUE) <1 ~ 0,
                               TRUE  ~  0)) %>% 
  mutate(PCL_CritE = case_when(rowSums(.[,itemsPCL_E], na.rm = TRUE) >= algPCL$E ~ 1,    
                               # rowSums(.[,itemsPCL_E], na.rm = TRUE) <1 ~ 0,
                               TRUE  ~  0)) %>% 
  mutate(PCL_Alg = case_when(PCL_CritB == 1 & PCL_CritC == 1 & PCL_CritD == 1 & PCL_CritE == 1 ~ 1,
                             TRUE  ~  0)) 

# Cutoffs
Data$PCL_cut <- ifelse(Data$PCL_Total >= cutoffPCL, 1, 0)
Data$PCLAlg <- DataPCLAlg$PCL_Alg

Data$MBI_Ex_cut <- ifelse(Data$MBI_Ex >= cutoffMBI_Ex, 1, 0)
Data$MBI_Cy_cut <- ifelse(Data$MBI_Cy >= cutoffMBI_Cy, 1, 0)
Data$MBI_cut <- ifelse(Data$MBI_Ex_cut | Data$MBI_Cy_cut, 1, 0)
# ---

4 Descriptives

Basic description for dataframe

Data Frame Summary

N: 132
No Variable Stats / Values Freqs (% of Valid) Graph Missing
1 ID [numeric] mean (sd) : 66.5 (38.25) min < med < max : 1 < 66.5 < 132 IQR (CV) : 65.5 (0.58) 132 distinct values 0 (0%)
2 varsta [numeric] mean (sd) : 2.83 (1.05) min < med < max : 1 < 3 < 5 IQR (CV) : 1.5 (0.37) 1 : 18 (13.7%) 2 : 25 (19.1%) 3 : 55 (42.0%) 4 : 27 (20.6%) 5 : 6 (4.6%) 1 (0.76%)
3 gen [factor] 1. 1 2. 2 16 (12.1%) 116 (87.9%) 0 (0%)
4 status marital [factor] 1. 0 2. 1 3. 2 4. 3 5. 4 1 (0.8%) 39 (29.5%) 74 (56.1%) 16 (12.1%) 2 (1.5%) 0 (0%)
5 copii [numeric] mean (sd) : 0.88 (0.86) min < med < max : 0 < 1 < 4 IQR (CV) : 1 (0.98) 0 : 49 (37.4%) 1 : 55 (42.0%) 2 : 23 (17.6%) 3 : 2 (1.5%) 4 : 2 (1.5%) 1 (0.76%)
6 nepoti [numeric] mean (sd) : 0.41 (1.02) min < med < max : 0 < 0 < 6 IQR (CV) : 0 (2.48) 0 : 104 (79.4%) 1 : 14 (10.7%) 2 : 7 (5.3%) 4 : 5 (3.8%) 6 : 1 (0.8%) 1 (0.76%)
7 domiciliu [factor] 1. 0 2. 1 3. 2 4. 3 1 (0.8%) 109 (82.6%) 5 (3.8%) 17 (12.9%) 0 (0%)
8 scoala absolvita [factor] 1. 1 2. 2 3. 3 1 (0.8%) 63 (47.7%) 68 (51.5%) 0 (0%)
9 ani de lucru in domeniu [factor] 1. 1 2. 2 3. 3 4. 4 5. 5 25 (19.1%) 24 (18.3%) 13 (9.9%) 22 (16.8%) 47 (35.9%) 1 (0.76%)
10 profesie ocupatie [factor] 1. 1 2. 2 3. 3 4. 4 5. 5 22 (16.8%) 92 (70.2%) 11 (8.4%) 2 (1.5%) 4 (3.0%) 1 (0.76%)
11 sectia pe care desfasurati activitatea [factor] 1. 1 2. 12 3. 14 4. 16 5. 18 6. 2 7. 20 8. 21 9. 3 10. 4 [ 4 others ] 32 (24.2%) 5 (3.8%) 1 (0.8%) 9 (6.8%) 8 (6.1%) 13 (9.8%) 3 (2.3%) 23 (17.4%) 4 (3.0%) 3 (2.3%) 31 (23.5%) 0 (0%)
12 pe sectia pe care lucrati au fost de la inceputul pandemiei cu covid 19 depistate cazuri pozitive [factor] 1. 1 2. 2 117 (89.3%) 14 (10.7%) 1 (0.76%)
13 care a fost programul de lucru in timpul starii de urgenta [factor] 1. 1 2. 2 3. 7 16 (12.2%) 114 (87.0%) 1 (0.8%) 1 (0.76%)
14 care a fost numarul de garzi in timpul starii de urgenta [factor] 1. 1 2. 2 3. 3 4. 4 5. 5 6. 6 2 (1.5%) 1 (0.8%) 5 (3.8%) 9 (6.9%) 57 (43.5%) 57 (43.5%) 1 (0.76%)
15 ati fost testat a pentru sars cov 2 in aceasta perioada de la inceputul pamdemiei [factor] 1. 1 2. 2 123 (93.9%) 8 (6.1%) 1 (0.76%)
16 daca da de cate ori [factor] 1. 1 2. 2 3. 3 4. 4 5. 5 6. 6 58 (44.3%) 39 (29.8%) 16 (12.2%) 9 (6.9%) 7 (5.3%) 2 (1.5%) 1 (0.76%)
17 in conditiile in care ati fost testat a cate zile ati asteptat rezultatul testului [factor] 1. 1 2. 2 3. 3 4. 4 103 (78.6%) 15 (11.5%) 3 (2.3%) 10 (7.6%) 1 (0.76%)
18 daca da care a fost rezultatul [factor] 1. 1 2. 2 3. 3 24 (18.3%) 99 (75.6%) 8 (6.1%) 1 (0.76%)
19 in urma rezultatului pozitiv al testului ati stat [factor] 1. 2 2. 3 3. 4 4. 5 2 (1.5%) 16 (12.2%) 112 (85.5%) 1 (0.8%) 1 (0.76%)
20 desi nu ati fost depistat pozitiv dar ati avut contact cu colegi pacienti care au fost depistati pozitiv cu sars cov 2 unde ati stat in izolare [factor] 1. 1 2. 2 3. 3 4. 4 5. 5 19 (14.5%) 27 (20.6%) 3 (2.3%) 1 (0.8%) 81 (61.8%) 1 (0.76%)
21 pe o scala de la 1 la 10 dati o nota pentru cat de daunator sanatatii dvs considerati ca ar putea fi virusul sars cov 2 [factor] 1. 1 2. 10 3. 11 4. 2 5. 3 6. 4 7. 5 8. 6 9. 7 10. 8 [ 1 others ] 10 (7.6%) 44 (33.6%) 2 (1.5%) 2 (1.5%) 3 (2.3%) 4 (3.1%) 12 (9.2%) 8 (6.1%) 14 (10.7%) 18 (13.7%) 14 (10.7%) 1 (0.76%)
22 CERQ Sbl [numeric] mean (sd) : 8.27 (3.44) min < med < max : 3 < 8 < 20 IQR (CV) : 5 (0.42) 17 distinct values 0 (0%)
23 CERQ Acc [numeric] mean (sd) : 11.16 (4.04) min < med < max : 4 < 10 < 20 IQR (CV) : 6 (0.36) 16 distinct values 0 (0%)
24 CERQ Rum [numeric] mean (sd) : 11.48 (4.09) min < med < max : 4 < 11 < 20 IQR (CV) : 5 (0.36) 17 distinct values 0 (0%)
25 CERQ PRf [numeric] mean (sd) : 12.78 (4.59) min < med < max : 4 < 12 < 20 IQR (CV) : 8 (0.36) 17 distinct values 0 (0%)
26 CERQ RPl [numeric] mean (sd) : 15.1 (4.03) min < med < max : 4 < 16 < 20 IQR (CV) : 6.25 (0.27) 17 distinct values 0 (0%)
27 CERQ PRa [numeric] mean (sd) : 15.46 (3.82) min < med < max : 4 < 16 < 20 IQR (CV) : 4 (0.25) 16 distinct values 0 (0%)
28 CERQ PPe [numeric] mean (sd) : 13.9 (4) min < med < max : 4 < 14 < 20 IQR (CV) : 6 (0.29) 16 distinct values 0 (0%)
29 CERQ Cat [numeric] mean (sd) : 13.9 (4) min < med < max : 4 < 14 < 20 IQR (CV) : 6 (0.29) 16 distinct values 0 (0%)
30 DASS S [numeric] mean (sd) : 4.94 (4.25) min < med < max : 0 < 4 < 17 IQR (CV) : 5 (0.86) 16 distinct values 0 (0%)
31 DASS D [numeric] mean (sd) : 3.12 (3.64) min < med < max : 0 < 2 < 17 IQR (CV) : 5 (1.17) 14 distinct values 0 (0%)
32 DASS A [numeric] mean (sd) : 3.05 (3.97) min < med < max : 0 < 1 < 20 IQR (CV) : 5 (1.3) 17 distinct values 0 (0%)
33 MBI Total [numeric] mean (sd) : 1.36 (1.17) min < med < max : 0 < 0.97 < 4.94 IQR (CV) : 1.58 (0.86) 53 distinct values 0 (0%)
34 MBI Ex [numeric] mean (sd) : 2.14 (1.6) min < med < max : 0 < 1.8 < 6 IQR (CV) : 2.6 (0.75) 31 distinct values 0 (0%)
35 MBI Cy [numeric] mean (sd) : 1.27 (1.33) min < med < max : 0 < 1 < 6 IQR (CV) : 1.45 (1.05) 24 distinct values 0 (0%)
36 MBI Pe [numeric] mean (sd) : 0.8 (1.16) min < med < max : 0 < 0.17 < 5 IQR (CV) : 1 (1.46) 24 distinct values 0 (0%)
37 PCL Total [numeric] mean (sd) : 15.95 (13.63) min < med < max : 0 < 11.5 < 63 IQR (CV) : 19 (0.85) 41 distinct values 0 (0%)
38 PCL B [numeric] mean (sd) : 4.38 (4.35) min < med < max : 0 < 3 < 16 IQR (CV) : 5 (0.99) 17 distinct values 0 (0%)
39 PCL C [numeric] mean (sd) : 1.95 (2.23) min < med < max : 0 < 1 < 8 IQR (CV) : 3 (1.14) 0 : 48 (36.4%) 1 : 25 (18.9%) 2 : 18 (13.6%) 3 : 11 (8.3%) 4 : 11 (8.3%) 5 : 6 (4.5%) 6 : 6 (4.5%) 7 : 2 (1.5%) 8 : 5 (3.8%) 0 (0%)
40 PCL D [numeric] mean (sd) : 4.33 (5.12) min < med < max : 0 < 2 < 22 IQR (CV) : 7 (1.18) 19 distinct values 0 (0%)
41 PCL E [numeric] mean (sd) : 5.29 (4.21) min < med < max : 0 < 4 < 17 IQR (CV) : 5.25 (0.8) 18 distinct values 0 (0%)
42 PCL cut [numeric] mean (sd) : 0.12 (0.33) min < med < max : 0 < 0 < 1 IQR (CV) : 0 (2.7) 0 : 116 (87.9%) 1 : 16 (12.1%) 0 (0%)
43 PCLAlg [numeric] mean (sd) : 0.14 (0.34) min < med < max : 0 < 0 < 1 IQR (CV) : 0 (2.53) 0 : 114 (86.4%) 1 : 18 (13.6%) 0 (0%)
44 MBI Ex cut [numeric] mean (sd) : 0.45 (0.5) min < med < max : 0 < 0 < 1 IQR (CV) : 1 (1.1) 0 : 72 (54.5%) 1 : 60 (45.5%) 0 (0%)
45 MBI Cy cut [numeric] mean (sd) : 0.22 (0.42) min < med < max : 0 < 0 < 1 IQR (CV) : 0 (1.89) 0 : 103 (78.0%) 1 : 29 (22.0%) 0 (0%)
46 MBI cut [numeric] mean (sd) : 0.48 (0.5) min < med < max : 0 < 0 < 1 IQR (CV) : 1 (1.03) 0 : 68 (51.5%) 1 : 64 (48.5%) 0 (0%)

Generated by summarytools 0.8.8 (R version 3.6.1)
2021-03-19

Frequency distribution of all discrete variables

View histogram of all continuous variables

4.1 Rename / compute grouping variables

5 Tests - Item Covid Cases (no. 9 in xlsx, 12 in data)

6 Tests - Item Expunere (no. 12 in xlsx, 15 in data)

7 Tests - Item Sectii (no. 8 in xlsx, releveled in data)

8 Tests - Item Sectii & Cutoff scores


9 Session Info

R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 8.1 x64 (build 9600)

Matrix products: default

locale:
[1] LC_COLLATE=Romanian_Romania.1250  LC_CTYPE=Romanian_Romania.1250    LC_MONETARY=Romanian_Romania.1250 LC_NUMERIC=C                     
[5] LC_TIME=Romanian_Romania.1250    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] dlookr_0.4.3               statsExpressions_1.0.0     ggstatsplot_0.7.1          DataExplorer_0.8.2         performance_0.7.0          rlang_0.4.10              
 [7] pwr_1.2-2                  emmeans_1.5.4              broom_0.7.5                rstatix_0.7.0              rio_0.5.26                 scales_1.1.1              
[13] ggpubr_0.4.0               tadaatoolbox_0.16.1        summarytools_0.8.8         PerformanceAnalytics_1.5.2 xts_0.11-2                 zoo_1.8-4                 
[19] psych_2.0.12               forcats_0.5.1              stringr_1.4.0              dplyr_1.0.5                purrr_0.3.4                readr_1.4.0               
[25] tidyr_1.1.3                tibble_3.1.0               ggplot2_3.3.3              tidyverse_1.3.0            papaja_0.1.0.9997          pacman_0.5.1              

loaded via a namespace (and not attached):
  [1] estimability_1.3          coda_0.19-2               acepack_1.4.1             knitr_1.31                multcomp_1.4-8            data.table_1.14.0        
  [7] rpart_4.1-15              RCurl_1.95-4.11           generics_0.1.0            TH.data_1.0-9             correlation_0.6.0         webshot_0.5.1            
 [13] xml2_1.3.2                lubridate_1.7.4           httpuv_1.5.5              assertthat_0.2.1          viridis_0.5.1             WRS2_1.1-1               
 [19] xfun_0.22                 hms_1.0.0                 evaluate_0.14             promises_1.2.0.1          fansi_0.4.2               dbplyr_2.1.0             
 [25] readxl_1.3.1              igraph_1.2.6              DBI_1.0.0                 tmvnsim_1.0-2             htmlwidgets_1.5.3         reshape_0.8.8            
 [31] kSamples_1.2-9            Rmpfr_0.7-1               paletteer_1.3.0           ellipsis_0.3.1            corrplot_0.84             backports_1.2.1          
 [37] insight_0.13.1            ggcorrplot_0.1.3          prismatic_1.0.0           rapportools_1.0           libcoin_1.0-2             vctrs_0.3.6              
 [43] prettydoc_0.4.1           abind_1.4-5               withr_2.4.1               pryr_0.1.4                RcmdrMisc_2.5-1           checkmate_1.8.5          
 [49] mnormt_2.0.2              svglite_1.2.1             cluster_2.1.1             crayon_1.4.1              pkgconfig_2.0.3           SuppDists_1.1-9.4        
 [55] labeling_0.4.2            nlme_3.1-140              nnet_7.3-12               lifecycle_1.0.0           miniUI_0.1.1.1            MatrixModels_0.4-1       
 [61] sandwich_2.5-0            extrafontdb_1.0           modelr_0.1.8              cellranger_1.1.0          matrixStats_0.54.0        partykit_1.2-13          
 [67] Matrix_1.2-17             mc2d_0.1-18               carData_3.0-2             boot_1.3-22               reprex_1.0.0              base64enc_0.1-3          
 [73] viridisLite_0.3.0         PMCMRplus_1.9.0           parameters_0.12.0         rootSolve_1.8.2.1         bitops_1.0-6              pander_0.6.3             
 [79] ggExtra_0.8               multcompView_0.1-7        ggsignif_0.6.1            memoise_1.1.0             magrittr_2.0.1            plyr_1.8.6               
 [85] compiler_3.6.1            rstantools_2.1.1          kableExtra_1.3.4          RColorBrewer_1.1-2        snakecase_0.9.2           cli_2.3.1                
 [91] patchwork_1.1.1           pbapply_1.3-4             htmlTable_1.12            Formula_1.2-3             MASS_7.3-51.4             tidyselect_1.1.0         
 [97] stringi_1.5.3             pixiedust_0.9.1           yaml_2.2.1                latticeExtra_0.6-28       ggrepel_0.9.1             grid_3.6.1               
[103] tools_3.6.1               lmom_2.8                  parallel_3.6.1            rstudioapi_0.13           foreign_0.8-71            inum_1.0-0               
[109] janitor_2.1.0             gridExtra_2.3             ipmisc_6.0.0              gld_2.6.2                 pairwiseComparisons_3.1.3 farver_2.1.0             
[115] digest_0.6.27             shiny_1.2.0               nortest_1.0-4             quadprog_1.5-5            networkD3_0.4             BWStest_0.2.2            
[121] Rcpp_1.0.6                car_3.0-10                BayesFactor_0.9.12-4.2    later_1.1.0.1             httr_1.4.2                gdtools_0.1.7            
[127] effectsize_0.4.4          colorspace_2.0-0          rvest_1.0.0               fs_1.5.0                  splines_3.6.1             rematch2_2.1.2           
[133] expm_0.999-3              Exact_2.1                 xtable_1.8-4              gmp_0.5-13.2              jsonlite_1.7.2            zeallot_0.1.0            
[139] R6_2.5.0                  Hmisc_4.1-1               pillar_1.5.1              htmltools_0.5.1.1         mime_0.10                 glue_1.4.2               
[145] class_7.3-15              codetools_0.2-16          mvtnorm_1.1-1             utf8_1.2.1                lattice_0.20-38           hrbrthemes_0.8.0         
[151] curl_4.3                  DescTools_0.99.40         gtools_3.8.1              zip_1.0.0                 openxlsx_4.1.0            Rttf2pt1_1.3.8           
[157] survival_2.44-1.1         rmarkdown_2.7             munsell_0.5.0             e1071_1.7-0               haven_2.3.1               gtable_0.3.0             
[163] bayestestR_0.8.2          extrafont_0.17           
 

A work by Claudiu Papasteri

 

LS0tDQp0aXRsZTogIjxicj4gU3R1ZGl1IENvdmlkIFNVVUIiIA0Kc3VidGl0bGU6ICJSZXBvcnQiDQphdXRob3I6ICI8YnI+IENsYXVkaXUgUGFwYXN0ZXJpIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJW0gJVknKWAiDQpvdXRwdXQ6IA0KICAgIGh0bWxfbm90ZWJvb2s6DQogICAgICAgICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICAgICAgICAgIHRvYzogdHJ1ZQ0KICAgICAgICAgICAgdG9jX2RlcHRoOiAyDQogICAgICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICAgICAgICAgIHRoZW1lOiBzcGFjZWxhYg0KICAgICAgICAgICAgaGlnaGxpZ2h0OiB0YW5nbw0KICAgICAgICAgICAgZm9udC1mYW1pbHk6IEFyaWFsDQogICAgICAgICAgICBmaWdfd2lkdGg6IDEwDQogICAgICAgICAgICBmaWdfaGVpZ2h0OiA5DQogICAgIyBwZGZfZG9jdW1lbnQ6IA0KICAgICAgICAgICAgIyB0b2M6IHRydWUNCiAgICAgICAgICAgICMgIHRvY19kZXB0aDogMg0KICAgICAgICAgICAgIyAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgICAgICAgICAjIGZvbnRzaXplOiAxMXB0DQogICAgICAgICAgICAjIGdlb21ldHJ5OiBtYXJnaW49MWluDQogICAgICAgICAgICAjIGZpZ193aWR0aDogNw0KICAgICAgICAgICAgIyBmaWdfaGVpZ2h0OiA2DQogICAgICAgICAgICAjIGZpZ19jYXB0aW9uOiB0cnVlDQogICAgIyBnaXRodWJfZG9jdW1lbnQ6IA0KICAgICAgICAgICAgIyB0b2M6IHRydWUNCiAgICAgICAgICAgICMgdG9jX2RlcHRoOiAyDQogICAgICAgICAgICAjIGh0bWxfcHJldmlldzogZmFsc2UNCiAgICAgICAgICAgICMgZmlnX3dpZHRoOiA1DQogICAgICAgICAgICAjIGZpZ19oZWlnaHQ6IDUNCiAgICAgICAgICAgICMgZGV2OiBqcGVnDQotLS0NCg0KDQo8IS0tIFNldHVwIC0tPg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBraW50ciBvcHRpb25zDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGNvbW1lbnQgPSAiIyIsDQogIGNvbGxhcHNlID0gVFJVRSwNCiAgZXJyb3IgPSBUUlVFLA0KICBlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGNhY2hlID0gVFJVRSAgICAgICAjIGVjaG8gPSBGYWxzZSBmb3IgZ2l0aHViX2RvY3VtZW50LCBidXQgd2lsbCBiZSBmb2xkZWQgaW4gaHRtbF9ub3RlYm9vaw0KKQ0KDQojIEdlbmVyYWwgUiBvcHRpb25zIGFuZCBpbmZvDQpzZXQuc2VlZCgxMTEpICAgICAgICAgICAgICAgIyBpbiBjYXNlIHdlIHVzZSByYW5kb21pemVkIHByb2NlZHVyZXMgICAgICAgDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgICAgICAgIyBwb3NpdGl2ZSB2YWx1ZXMgYmlhcyB0b3dhcmRzIGZpeGVkIGFuZCBuZWdhdGl2ZSB0b3dhcmRzIHNjaWVudGlmaWMgbm90YXRpb24NCg0KIyBMb2FkIHBhY2thZ2VzDQpwYWNrYWdlcyA8LSBjKA0KICAicGFwYWphIiwNCiAgInRpZHl2ZXJzZSIsICAgICAgIA0KICAicHN5Y2giLCAiUGVyZm9ybWFuY2VBbmFseXRpY3MiLCAgICAgICAgICANCiAgInN1bW1hcnl0b29scyIsICJ0YWRhYXRvb2xib3giLCAgICAgICAgICAgDQogICJnZ3Bsb3QyIiwgImdncHViciIsICJzY2FsZXMiLCAgICAgICAgDQogICJyaW8iLA0KICAicnN0YXRpeCIsICJicm9vbSIsICJlbW1lYW5zIiwgInB3ciIsDQogICJybGFuZyIsDQogICJwZXJmb3JtYW5jZSIsICJEYXRhRXhwbG9yZXIiLCAiZ2dzdGF0c3Bsb3QiLCAic3RhdHNFeHByZXNzaW9ucyIsICJkbG9va3IiDQogICMgLCAuLi4NCikNCg0KaWYgKCFyZXF1aXJlKCJwYWNtYW4iKSkgaW5zdGFsbC5wYWNrYWdlcygicGFjbWFuIikNCnBhY21hbjo6cF9sb2FkKGNoYXIgPSBwYWNrYWdlcywgdXBkYXRlID0gRkFMU0UpDQoNCiMgVGhlbWVzIGZvciBnZ3Bsb3QyIHBsb3RpbmcgKGhlcmUgdXNlZCBBUEEgc3R5bGUpDQpnZ3Bsb3QyOjp0aGVtZV9zZXQocGFwYWphOjp0aGVtZV9hcGEoKSkNCmBgYA0KDQoNCg0KDQoNCjwhLS0gUmVwb3J0IC0tPg0KDQojIERlZmluZSBmdW5jdGlvbnMNCg0KYGBge3IgZGVmX2Z1bmN9DQojIyBEZWZpbmUgZnVuY3Rpb24gdGhhdCByZWNvZGVzIHRvIG51bWVyaWMsIGJ1dCB3YXRjaGVzIG91dCB0byBjb2VyY2lvbiB0byBub3QgaW50cm9kdWNlIE5Bcw0KY29sc3RvbnVtZXJpYyA8LSBmdW5jdGlvbihkZil7DQogIHRyeUNhdGNoKHsNCiAgICBkZl9udW0gPC0gYXMuZGF0YS5mcmFtZSgNCiAgICAgIGxhcHBseShkZiwNCiAgICAgICAgICAgICBmdW5jdGlvbih4KSB7IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHgpKX0pKSANCiAgfSx3YXJuaW5nID0gZnVuY3Rpb24oc3RvcF9vbl93YXJuaW5nKSB7DQogICAgbWVzc2FnZSgiU3RvcGVkIHRoZSBleGVjdXRpb24gb2YgbnVtZXJpYyBjb252ZXJzaW9uOiAiLCBjb25kaXRpb25NZXNzYWdlKHN0b3Bfb25fd2FybmluZykpDQogIH0pIA0KfQ0KIyMNCiMjIERlZmluZSBmdW5jdGlvbiB0aGF0IHJldmVyc2UgY29kZXMgaXRlbXMNClJldmVyc2VDb2RlIDwtIGZ1bmN0aW9uKGRmLCB0b251bWVyaWMgPSBGQUxTRSwgbWluID0gTlVMTCwgbWF4ID0gTlVMTCkgew0KICBpZih0b251bWVyaWMpIGRmIDwtIGNvbHN0b251bWVyaWMoZGYpDQogIGRmIDwtIChtYXggKyBtaW4pIC0gZGYNCn0NCiMjDQoNCg0KIyBTY29yZXMNCiMjIERlZmluZSBmdW5jdGlvbiB0aGF0IHNjb3JlcyBvbmx5IHJvd3Mgd2l0aCBsZXNzIHRoYW4gMTAlIE5BcyAocmV0dXJucyBOQSBpZiBhbGwgb3IgYWJvdmUgdGhyZXNob2xkIHBlcmNlbnRhZ2Ugb2Ygcm93cyBhcmUgTkEpOyBjYW4gcmV2ZXJzZSBjb2RlIGlmIHZlY3RvciBvZiBjb2x1bW4gaW5kZXhlcyBhbmQgbWluLCBtYXggYXJlIHByb3ZpZGVkLg0KU2NvcmVMaWtlcnQgPC0gZnVuY3Rpb24oZGYsIHN0YXQgPSBjKCJzdW0iLCAibWVhbiIpLCBpbXB1dGVuYSA9IGMoRkFMU0UsICJ6ZXJvIiwgIm1lYW4iLCAibWVkaWFuIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgbmFwZXJjZW50ID0gLjEsIHRvbnVtZXJpYyA9IEZBTFNFLCByZXZlcnNlY29scyA9IE5VTEwsIG1pbiA9IE5VTEwsIG1heCA9IE5VTEwpIHsNCiAgc3RhdCA8LSBtYXRjaC5hcmcoc3RhdCkNCiAgaW1wdXRlbmEgPC0gbWF0Y2guYXJnKGltcHV0ZW5hKQ0KICByZXZlcnNlX2xpc3QgPC0gbGlzdChyZXZlcnNlY29scyA9IHJldmVyc2Vjb2xzLCBtaW4gPSBtaW4sIG1heCA9IG1heCkNCiAgcmV2ZXJzZV9jaGVjayA8LSAhc2FwcGx5KHJldmVyc2VfbGlzdCwgaXMubnVsbCkNCiAgDQogICMgUmVjb2RlIHRvIG51bWVyaWMsIGJ1dCB3YXRjaCBvdXQgdG8gY29lcmNpb24gdG8gbm90IGludHJvZHVjZSBOQXMNCiAgY29sc3RvbnVtZXJpYyA8LSBmdW5jdGlvbihkZil7DQogICAgdHJ5Q2F0Y2goew0KICAgICAgZGZfbnVtIDwtIGFzLmRhdGEuZnJhbWUoDQogICAgICAgIGxhcHBseShkZiwNCiAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIHsgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeCkpfSkpIA0KICAgIH0sd2FybmluZyA9IGZ1bmN0aW9uKHN0b3Bfb25fd2FybmluZykgew0KICAgICAgbWVzc2FnZSgiU3RvcGVkIHRoZSBleGVjdXRpb24gb2YgbnVtZXJpYyBjb252ZXJzaW9uOiAiLCBjb25kaXRpb25NZXNzYWdlKHN0b3Bfb25fd2FybmluZykpDQogICAgfSkgDQogIH0NCiAgDQogIGlmKHRvbnVtZXJpYykgZGYgPC0gY29sc3RvbnVtZXJpYyhkZikNCiAgDQogIGlmKGFsbChyZXZlcnNlX2NoZWNrKSl7DQogICAgZGZbICxyZXZlcnNlY29sc10gPC0gKG1heCArIG1pbikgLSBkZlsgLHJldmVyc2Vjb2xzXQ0KICB9ZWxzZSBpZihhbnkocmV2ZXJzZV9jaGVjaykpew0KICAgIHN0b3AoIkluc3VmaWNpZW50IGluZm8gZm9yIHJldmVyc2luZy4gUGxlYXNlIHByb3ZpZGU6ICIsIHBhc3RlKG5hbWVzKHJldmVyc2VfbGlzdClbIXJldmVyc2VfY2hlY2tdLCBjb2xsYXBzZSA9ICIsICIpKQ0KICB9DQogIA0KICBpZih0b251bWVyaWMpIGRmIDwtIGNvbHN0b251bWVyaWMoZGYpICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIA0KICBpZihpbXB1dGVuYSA9PSAiemVybyIpIGRmW2lzLm5hKGRmKV0gPC0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5BcyB0byAwIGNhbiBoZWxwIHdoZW4gc3RhdCA9ICJtZWFuIiB3aXRoIG5hLnJtID0gVCBiZWNhdXNlIGl0IGtlZXBzIGRlbm9taW5hdG9yIGNvbnN0YW50DQogIGlmKGltcHV0ZW5hID09ICJtZWFuIikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSBOQSB3aXRoIHJvdyBtZWFucywgdGhlIGRlbm9taW5hdG9yIG9mIHRoaXMgbWVhbiBpcyB0aGUgbnVtYmVyIG9mIGNvbXBsZXRlZCBpdGVtcw0KICAgICMgaW5kZXhfbmEgPC0gd2hpY2goaXMubmEoZGYpLCBhcnIuaW5kID0gVFJVRSkgICAgICAgICAgICAgICAgICAgICMgZm9yIHNvbWUgcmVhc29uIGRvZXNudCB3b3JrIG9uIHRpYmJsZXMNCiAgICAjIGRmW2luZGV4X25hXSA8LSByb3dNZWFucyhkZiwgbmEucm09VFJVRSlbaW5kZXhfbmFbLCAxXV0NCiAgICBkZiA8LSB0KGFwcGx5KGRmLCAxLCBmdW5jdGlvbih4KSByZXBsYWNlKHgsIGlzLm5hKHgpLCBtZWFuKHgsIG5hLnJtID0gVFJVRSkpKSkNCiAgfQ0KICBpZihpbXB1dGVuYSA9PSAibWVkaWFuIikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSBOQSB3aXRoIHJvdyBtZWRpYW5zDQogICAgZGYgPC0gdChhcHBseShkZiwgMSwgZnVuY3Rpb24oeCkgcmVwbGFjZSh4LCBpcy5uYSh4KSwgbWVkaWFuKHgsIG5hLnJtID0gVFJVRSkpKSkNCn0gDQogIA0KICBpZihzdGF0ID09ICJzdW0iKXsNCiAgICBkZl9yZXMgPC0gaWZlbHNlKHJvd1N1bXMoaXMubmEoZGYpKSA+IG5jb2woZGYpICogbmFwZXJjZW50LA0KICAgICAgICAgICAgICAgICAgICAgTkEsDQogICAgICAgICAgICAgICAgICAgICByb3dTdW1zKGRmLCBuYS5ybSA9IFRSVUUpICogTkEgXiAocm93U3VtcyghaXMubmEoZGYpKSA9PSAwKSkNCiAgfQ0KICBpZihzdGF0ID09ICJtZWFuIil7DQogICAgZGZfcmVzIDwtIGlmZWxzZShyb3dTdW1zKGlzLm5hKGRmKSkgPiBuY29sKGRmKSAqIG5hcGVyY2VudCwNCiAgICAgICAgICAgICAgICAgICAgIE5BLA0KICAgICAgICAgICAgICAgICAgICAgcm93TWVhbnMoZGYsIG5hLnJtID0gVFJVRSkgKiBOQSBeIChyb3dTdW1zKCFpcy5uYShkZikpID09IDApKQ0KICB9DQogIHJldHVybihkZl9yZXMpDQp9DQojIw0KDQoNCiMgVGVzdHMgLS0tIERvbid0IFJ1bg0KIyBibGEgPC0gbXRjYXJzWywgODoxMV0NCiMgDQojIGJsYVsxLCA0XSA8LSBOQQ0KIyBibGFbMiwgM10gPC0gTkE7IGJsYVsyLCA0XSA8LSBOQSANCiMgYmxhWzMsIDJdIDwtIE5BOyBibGFbMywgM10gPC0gTkE7IGJsYVszLCA0XSA8LSBOQSANCiMgDQojIGJsYSRUb3QgPC0gU2NvcmVMaWtlcnQoYmxhWywgMTo0XSkgDQojIGJsYSRUb3QyIDwtIFNjb3JlTGlrZXJ0KGJsYVssIDE6NF0sIG5hcGVyY2VudCA9IC45KSANCiMgYmxhJFRvdDMgPC0gU2NvcmVMaWtlcnQoYmxhWywgMTo0XSwgaW1wdXRlbmEgPSAiemVybyIsIG5hcGVyY2VudCA9IC4xKQ0KIyBibGEkVG90NCA8LSBTY29yZUxpa2VydChibGFbLCAxOjRdLCBzdGF0ID0gIm1lYW4iLCBpbXB1dGVuYSA9ICJ6ZXJvIiwgbmFwZXJjZW50ID0gLjEpDQojIGJsYSRUb3Q1IDwtIFNjb3JlTGlrZXJ0KGJsYVssIDE6NF0sIHN0YXQgPSAic3VtIiwgaW1wdXRlbmEgPSAiemVybyIsIG5hcGVyY2VudCA9IC4xKQ0KIyBibGEkVG90NiA8LSBTY29yZUxpa2VydChibGFbLCAxOjRdLCBzdGF0ID0gInN1bSIsIGltcHV0ZW5hID0gIm1lYW4iLCBuYXBlcmNlbnQgPSAuOSkNCmBgYA0KDQoNCg0KIyBSZWFkIGRhdGENCg0KYGBge3IgcmVkX2NsZWFuX3JlY29kZV9tZXJnZSwgcmVzdWx0cz0naGlkZScsIG1lc3NhZ2U9RkFMU0V9DQojfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fg0KIyBSZWFkLCBDbGVhbiwgUmVjb2RlLCBVbml0ZQ0KI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCg0KIyMgUmVhZCBmaWxlcw0KZm9sZGVyIDwtICJDOi9Vc2Vycy9NaWhhaS9EZXNrdG9wL1IgTm90ZWJvb2tzL25vdGVib29rcy9tdW5pY2lwYWwtY292aWQiDQpmaWxlIDwtICJDZXJjZXRhcmUgU1VVQiAtIENvdmlkIDIwMjAueGxzeCINCg0Kc2V0d2QoZm9sZGVyKQ0KDQojIFJlYWQgZGF0YQ0KRGF0YSA8LSByaW86OmltcG9ydChmaWxlLnBhdGgoZm9sZGVyLCBmaWxlKSwNCiAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDAsIHdoaWNoID0gIlNoZWV0MiIpICANCg0KIyBFeGNsdWRlIGxhc3QgMyByb3dzOiBlbXB0eSBhbmQgb3RoZXIgaW5mbw0KRGF0YSA8LSBEYXRhWy1jKDEzMzoxMzUpLF0NCg0KYGBgDQoNCg0KIyBDbGVhbiwgVHJhbnNmb3JtLCBTY29yZSBzY2FsZXMNCg0KYGBge3IgZGFzZH0NCiMjIEN1dG9mZnMNCmN1dG9mZlBDTCA8LSAzMiAgICMgbGl0ZXJhdHVyZTogMzEtMzMgb3IgMzggDQphbGdQQ0wgPC0gZGF0YS5mcmFtZShCID0gMSwgQyA9IDEsIEQgPSAyLCBFID0gMikNCg0KY3V0b2ZmTUJJX0V4IDwtIDIuMjAgIA0KY3V0b2ZmTUJJX0N5IDwtIDINCiMjDQoNCg0KIyBEZWZpbmUgY29sdW1uIGluZGV4OiAgaW5kZXggPSBjb2wgaW5kZXg7IGl0ZW1pbmRleCA9IGluZGV4IG9mIGl0ZW0gaW4gcXVlc3Rpb25uYWlyZQ0KaW5kZXhEQVNTIDwtIDIyOjQyDQppbmRleE1CSSA8LSA0Mzo1OA0KaW5kZXhDRVJRIDwtIDU5Ojk0DQppbmRleFBDTCA8LSA5NToxMTQNCmluZGV4QWxsSXRlbXMgPC0gMjI6MTE0DQoNCml0ZW1pbmRleE1CSV9FeCA8LSBjKDEsIDMsIDUsIDExLCAxNCkgICAgICAjIEVtb3Rpb25hbCBFeGhhdXN0aW9uDQppdGVtaW5kZXhNQklfQ3kgPC0gYygyLCA3LCA4LCAxMywgMTUpICAgICAgIyBDeW5pY2lzbQ0KaXRlbWluZGV4TUJJX1BlIDwtIGMoNCwgNiwgOSwgMTAsIDEyLCAxNikgICMgUHJvZmVzc2lvbmFsIEVmZmljYWN5DQoNCml0ZW1pbmRleERBU1NfUyA8LSBjKDEsIDYsIDgsIDExLCAxMiwgMTQsIDE4KQ0KaXRlbWluZGV4REFTU19EIDwtIGMoMywgNSwgMTAsIDEzLCAxNiwgMTcsIDIxKQ0KaXRlbWluZGV4REFTU19BIDwtIGMoMiwgNCwgNywgOSwgMTUsIDE5LCAyMCkNCg0KaXRlbWluZGV4Q0VSUV9TYmwgPC0gYygxLCAxMCwgMTksIDI4KSAgIyBTZWxmLWJsYW1lDQppdGVtaW5kZXhDRVJRX0FjYyA8LSBjKDIsIDExLCAyMCwgMjkpICAjIEFjY2VwdGFuY2UNCml0ZW1pbmRleENFUlFfUnVtIDwtIGMoMywgMTIsIDIxLCAzMCkgICMgUnVtaW5hdGlvbg0KaXRlbWluZGV4Q0VSUV9QUmYgPC0gYyg0LCAxMywgMjIsIDMxKSAgIyBQb3NpdGl2ZSBSZWZvY3VzaW5nDQppdGVtaW5kZXhDRVJRX1JQbCA8LSBjKDUsIDE0LCAyMywgMzIpICAjIFJlZm9jdXMgb24gUGxhbm5pbmcNCml0ZW1pbmRleENFUlFfUFJhIDwtIGMoNiwgMTUsIDI0LCAzMykgICMgUG9zaXRpdmUgUmVhcHByYWlzYWwNCml0ZW1pbmRleENFUlFfUFBlIDwtIGMoNywgMTYsIDI1LCAzNCkgICMgUHV0dGluZyBpbnRvIFBlcnNwZWN0aXZlDQppdGVtaW5kZXhDRVJRX0NhdCA8LSBjKDgsIDE3LCAyNiwgMzUpICAjIENhdGFzdHJvcGhpemluZw0KaXRlbWluZGV4Q0VSUV9PYmwgPC0gYyg5LCAxOCwgMjcsIDM2KSAgIyBPdGhlci1ibGFtZQ0KDQojIFJlbmFtZSBjb2x1bW5zDQojIG5hbWVzKERhdGEpWzE6MTJdIDwtIHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChuYW1lcyhEYXRhKVsxOjEyXSwgIltbOmJsYW5rOl1dIiwgIl8iKQ0KRGF0YSA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhEYXRhKQ0KbmFtZXMoRGF0YSlbMV0gPC0gIklEIg0KbmFtZXMoRGF0YSlbbmFtZXMoRGF0YSkgJWluJSBuYW1lcyhEYXRhWywgaW5kZXhEQVNTXSldICA8LSBjKHNwcmludGYoIkRBU1NfJTAxZCIsIHNlcSgxLCAyMSkpKQ0KbmFtZXMoRGF0YSlbbmFtZXMoRGF0YSkgJWluJSBuYW1lcyhEYXRhWywgaW5kZXhNQkldKV0gIDwtIGMoc3ByaW50ZigiTUJJXyUwMWQiLCBzZXEoMSwgMTYpKSkNCm5hbWVzKERhdGEpW25hbWVzKERhdGEpICVpbiUgbmFtZXMoRGF0YVssIGluZGV4Q0VSUV0pXSAgPC0gYyhzcHJpbnRmKCJDRVJRXyUwMWQiLCBzZXEoMSwgMzYpKSkNCm5hbWVzKERhdGEpW25hbWVzKERhdGEpICVpbiUgbmFtZXMoRGF0YVssIGluZGV4UENMXSldICA8LSBjKHNwcmludGYoIlBDTF8lMDFkIiwgc2VxKDEsIDIwKSkpDQoNCiMgVHJhbnNmb3JtIGdlbmVyYWwgaW5mbw0KdG9fbnVtX2NvbHMgPC0gYygyLCA1LCA2KSAgIyAidmFyc3RhIiwgImNvcGlpIiwgIm5lcG90aSINCnRvX2ZhY19jb2xzIDwtIGMoMywgNCwgNzoyMSkNCg0KRGF0YSA8LQ0KICBEYXRhICU+JQ0KICBkcGx5cjo6bXV0YXRlX2F0KHZhcnModG9fbnVtX2NvbHMpLCBhcy5udW1lcmljKSAlPiUNCiAgZHBseXI6Om11dGF0ZV9hdCh2YXJzKHRvX2ZhY19jb2xzKSwgYXMuZmFjdG9yKQ0KDQojIFRyYW5zZm9tciBpdGVtIHNjb3JlcyB0byBudW1lcmljDQpEYXRhWywgaW5kZXhEQVNTXSA8LSBjb2xzdG9udW1lcmljKERhdGFbLCBpbmRleERBU1NdKQ0KRGF0YVssIGluZGV4TUJJXSA8LSBjb2xzdG9udW1lcmljKERhdGFbLCBpbmRleE1CSV0pDQpEYXRhWywgaW5kZXhDRVJRXSA8LSBjb2xzdG9udW1lcmljKERhdGFbLCBpbmRleENFUlFdKQ0KRGF0YVssIGluZGV4UENMXSA8LSBjb2xzdG9udW1lcmljKERhdGFbLCBpbmRleFBDTF0pDQoNCg0KIyBTY29yZSBDRVJRDQpEYXRhJENFUlFfU2JsICA8LSBTY29yZUxpa2VydChEYXRhWywgYyhzcHJpbnRmKCJDRVJRXyUwMWQiLCBpdGVtaW5kZXhDRVJRX1NibCkpXSwgc3RhdCA9ICJzdW0iLCBpbXB1dGVuYSA9ICJtZWFuIiwgbmFwZXJjZW50ID0gMSkNCkRhdGEkQ0VSUV9BY2MgIDwtIFNjb3JlTGlrZXJ0KERhdGFbLCBjKHNwcmludGYoIkNFUlFfJTAxZCIsIGl0ZW1pbmRleENFUlFfQWNjKSldLCBzdGF0ID0gInN1bSIsIGltcHV0ZW5hID0gIm1lYW4iLCBuYXBlcmNlbnQgPSAxKQ0KRGF0YSRDRVJRX1J1bSAgPC0gU2NvcmVMaWtlcnQoRGF0YVssIGMoc3ByaW50ZigiQ0VSUV8lMDFkIiwgaXRlbWluZGV4Q0VSUV9SdW0pKV0sIHN0YXQgPSAic3VtIiwgaW1wdXRlbmEgPSAibWVhbiIsIG5hcGVyY2VudCA9IDEpDQpEYXRhJENFUlFfUFJmICA8LSBTY29yZUxpa2VydChEYXRhWywgYyhzcHJpbnRmKCJDRVJRXyUwMWQiLCBpdGVtaW5kZXhDRVJRX1BSZikpXSwgc3RhdCA9ICJzdW0iLCBpbXB1dGVuYSA9ICJtZWFuIiwgbmFwZXJjZW50ID0gMSkNCkRhdGEkQ0VSUV9SUGwgIDwtIFNjb3JlTGlrZXJ0KERhdGFbLCBjKHNwcmludGYoIkNFUlFfJTAxZCIsIGl0ZW1pbmRleENFUlFfUlBsKSldLCBzdGF0ID0gInN1bSIsIGltcHV0ZW5hID0gIm1lYW4iLCBuYXBlcmNlbnQgPSAxKQ0KRGF0YSRDRVJRX1BSYSAgPC0gU2NvcmVMaWtlcnQoRGF0YVssIGMoc3ByaW50ZigiQ0VSUV8lMDFkIiwgaXRlbWluZGV4Q0VSUV9QUmEpKV0sIHN0YXQgPSAic3VtIiwgaW1wdXRlbmEgPSAibWVhbiIsIG5hcGVyY2VudCA9IDEpDQpEYXRhJENFUlFfUFBlICA8LSBTY29yZUxpa2VydChEYXRhWywgYyhzcHJpbnRmKCJDRVJRXyUwMWQiLCBpdGVtaW5kZXhDRVJRX1BQZSkpXSwgc3RhdCA9ICJzdW0iLCBpbXB1dGVuYSA9ICJtZWFuIiwgbmFwZXJjZW50ID0gMSkNCkRhdGEkQ0VSUV9DYXQgIDwtIFNjb3JlTGlrZXJ0KERhdGFbLCBjKHNwcmludGYoIkNFUlFfJTAxZCIsIGl0ZW1pbmRleENFUlFfUFBlKSldLCBzdGF0ID0gInN1bSIsIGltcHV0ZW5hID0gIm1lYW4iLCBuYXBlcmNlbnQgPSAxKQ0KDQoNCiMgU2NvcmUgREFTUw0KRGF0YSREQVNTX1MgIDwtIFNjb3JlTGlrZXJ0KERhdGFbLCBjKHNwcmludGYoIkRBU1NfJTAxZCIsIGl0ZW1pbmRleERBU1NfUykpXSwgbmFwZXJjZW50ID0gMSkNCkRhdGEkREFTU19EICA8LSBTY29yZUxpa2VydChEYXRhWywgYyhzcHJpbnRmKCJEQVNTXyUwMWQiLCBpdGVtaW5kZXhEQVNTX0QpKV0sIG5hcGVyY2VudCA9IDEpDQpEYXRhJERBU1NfQSAgPC0gU2NvcmVMaWtlcnQoRGF0YVssIGMoc3ByaW50ZigiREFTU18lMDFkIiwgaXRlbWluZGV4REFTU19BKSldLCBuYXBlcmNlbnQgPSAxKQ0KDQojIENvcnJlY3QgTUJJIGVycm9yIChNQkkgaXRlbXMgc2NvcmVzIGFyZSAwLTYsIHdoaWxlIGluIGRhdGEgaXRlbSBzY29yZXMgcmFuZ2UgMC03KQ0KRGF0YVssIGluZGV4TUJJXSA8LQ0KICBEYXRhWywgaW5kZXhNQkldICU+JQ0KICBkcGx5cjo6bXV0YXRlX2FsbCh+aWZlbHNlKC4gPT0gNywgNiwgLikpDQoNCiMgU2NvcmUgTUJJDQpEYXRhJE1CSV9Ub3RhbCA8LSBTY29yZUxpa2VydChEYXRhWywgaW5kZXhNQkldLCBuYXBlcmNlbnQgPSAuMywgc3RhdCA9ICJtZWFuIiwgaW1wdXRlbmEgPSAiemVybyIpDQpEYXRhJE1CSV9FeCA8LSBTY29yZUxpa2VydChEYXRhWywgYyhzcHJpbnRmKCJNQklfJTAxZCIsIGl0ZW1pbmRleE1CSV9FeCkpXSwgbmFwZXJjZW50ID0gMSwgc3RhdCA9ICJtZWFuIiwgaW1wdXRlbmEgPSAiemVybyIpDQpEYXRhJE1CSV9DeSA8LSBTY29yZUxpa2VydChEYXRhWywgYyhzcHJpbnRmKCJNQklfJTAxZCIsIGl0ZW1pbmRleE1CSV9DeSkpXSwgbmFwZXJjZW50ID0gMSwgc3RhdCA9ICJtZWFuIiwgaW1wdXRlbmEgPSAiemVybyIpDQpEYXRhJE1CSV9QZSA8LSBTY29yZUxpa2VydChEYXRhWywgYyhzcHJpbnRmKCJNQklfJTAxZCIsIGl0ZW1pbmRleE1CSV9QZSkpXSwgbmFwZXJjZW50ID0gMSwgc3RhdCA9ICJtZWFuIiwgaW1wdXRlbmEgPSAiemVybyIpDQoNCiMgU2NvcmUgUENMDQpEYXRhJFBDTF9Ub3RhbCA8LSBTY29yZUxpa2VydChEYXRhWywgaW5kZXhQQ0xdLCBuYXBlcmNlbnQgPSAuMykgICAgICAgICAgICAgICAjIE5BIGlmIE5BIHRocmVzaG9sZCBpcyBleGNlZWRlZCANCkRhdGEkUENMX0IgPC0gU2NvcmVMaWtlcnQoRGF0YVssIGMoc3ByaW50ZigiUENMXyUwMWQiLCAxOjUpKV0sIG5hcGVyY2VudCA9IDEpICAgICMgZG8gbm90aGluZyBpZiBOQSB0aHJlc2hvbGQgaXMgZXhjZWVkZWQNCkRhdGEkUENMX0MgPC0gU2NvcmVMaWtlcnQoRGF0YVssIGMoc3ByaW50ZigiUENMXyUwMWQiLCA2OjcpKV0sIG5hcGVyY2VudCA9IDEpIA0KRGF0YSRQQ0xfRCA8LSBTY29yZUxpa2VydChEYXRhWywgYyhzcHJpbnRmKCJQQ0xfJTAxZCIsIDg6MTQpKV0sIG5hcGVyY2VudCA9IDEpICANCkRhdGEkUENMX0UgPC0gU2NvcmVMaWtlcnQoRGF0YVssIGMoc3ByaW50ZigiUENMXyUwMWQiLCAxNToyMCkpXSwgbmFwZXJjZW50ID0gMSkNCg0KDQoNCiMgLS0tDQojIFBDTCBEaWFnbm9zdGljIEFsZ29yaXRobQ0KaXRlbXNQQ0xfQiA8LSBjKHNwcmludGYoIlBDTF8lMDFkIiwgMTo1KSkNCml0ZW1zUENMX0MgPC0gYyhzcHJpbnRmKCJQQ0xfJTAxZCIsIDY6NykpDQppdGVtc1BDTF9EIDwtIGMoc3ByaW50ZigiUENMXyUwMWQiLCA4OjE0KSkNCml0ZW1zUENMX0UgPC0gYyhzcHJpbnRmKCJQQ0xfJTAxZCIsIDE1OjIwKSkNCg0KRGF0YVBDTEFsZyA8LSAgDQogIERhdGEgJT4lIA0KICBkcGx5cjo6c2VsZWN0KHRpZHlzZWxlY3Q6OmFsbF9vZihpbmRleFBDTCkpICU+JSANCiAgZHBseXI6Om11dGF0ZV9hbGwoDQogICAgZnVucyhjYXNlX3doZW4oDQogICAgICAuID49MiB+IDEsDQogICAgICAjIC4gPDIgfiAwLA0KICAgICAgaXMubmEoLikgfiAwLA0KICAgICAgVFJVRSAgfiAgMCkpKSAlPiUgDQogIA0KICBtdXRhdGUoUENMX0NyaXRCID0gY2FzZV93aGVuKHJvd1N1bXMoLlssaXRlbXNQQ0xfQl0sIG5hLnJtID0gVFJVRSkgPj0gYWxnUENMJEIgfiAxLCAgICAgICMgYWxnUENMIDwtIGRhdGEuZnJhbWUoQiA9IDEsIEMgPSAxLCBEID0gMiwgRSA9IDIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByb3dTdW1zKC5bLGl0ZW1zUENMX0JdLCBuYS5ybSA9IFRSVUUpIDwxIH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFICB+ICAwKSkgJT4lIA0KICBtdXRhdGUoUENMX0NyaXRDID0gY2FzZV93aGVuKHJvd1N1bXMoLlssaXRlbXNQQ0xfQ10sIG5hLnJtID0gVFJVRSkgPj0gYWxnUENMJEMgfiAxLCAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJvd1N1bXMoLlssaXRlbXNQQ0xfQ10sIG5hLnJtID0gVFJVRSkgPDEgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgIH4gIDApKSAlPiUgDQogIG11dGF0ZShQQ0xfQ3JpdEQgPSBjYXNlX3doZW4ocm93U3VtcyguWyxpdGVtc1BDTF9EXSwgbmEucm0gPSBUUlVFKSA+PSBhbGdQQ0wkRCB+IDEsICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyByb3dTdW1zKC5bLGl0ZW1zUENMX0RdLCBuYS5ybSA9IFRSVUUpIDwxIH4gMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFICB+ICAwKSkgJT4lIA0KICBtdXRhdGUoUENMX0NyaXRFID0gY2FzZV93aGVuKHJvd1N1bXMoLlssaXRlbXNQQ0xfRV0sIG5hLnJtID0gVFJVRSkgPj0gYWxnUENMJEUgfiAxLCAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJvd1N1bXMoLlssaXRlbXNQQ0xfRV0sIG5hLnJtID0gVFJVRSkgPDEgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgIH4gIDApKSAlPiUgDQogIG11dGF0ZShQQ0xfQWxnID0gY2FzZV93aGVuKFBDTF9Dcml0QiA9PSAxICYgUENMX0NyaXRDID09IDEgJiBQQ0xfQ3JpdEQgPT0gMSAmIFBDTF9Dcml0RSA9PSAxIH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSAgfiAgMCkpIA0KDQojIEN1dG9mZnMNCkRhdGEkUENMX2N1dCA8LSBpZmVsc2UoRGF0YSRQQ0xfVG90YWwgPj0gY3V0b2ZmUENMLCAxLCAwKQ0KRGF0YSRQQ0xBbGcgPC0gRGF0YVBDTEFsZyRQQ0xfQWxnDQoNCkRhdGEkTUJJX0V4X2N1dCA8LSBpZmVsc2UoRGF0YSRNQklfRXggPj0gY3V0b2ZmTUJJX0V4LCAxLCAwKQ0KRGF0YSRNQklfQ3lfY3V0IDwtIGlmZWxzZShEYXRhJE1CSV9DeSA+PSBjdXRvZmZNQklfQ3ksIDEsIDApDQpEYXRhJE1CSV9jdXQgPC0gaWZlbHNlKERhdGEkTUJJX0V4X2N1dCB8IERhdGEkTUJJX0N5X2N1dCwgMSwgMCkNCiMgLS0tDQoNCmBgYA0KDQoNCiMgRGVzY3JpcHRpdmVzDQoNCmBgYHtyIGRlc2NfaW50cm99DQprbml0cjo6YXNpc19vdXRwdXQoIiMjIEJhc2ljIGRlc2NyaXB0aW9uIGZvciBkYXRhZnJhbWUiKQ0KaW50cm9kdWNlKERhdGEpDQpgYGANCg0KYGBge3IgZGVzY19zdGF0c30NCiMga25pdHI6OmFzaXNfb3V0cHV0KCIjIyBCYXNpYyBkZXNjcmlwdGlvbiBmb3IgZGF0YWZyYW1lIikNCkRhdGFbLCAtaW5kZXhBbGxJdGVtc10gJT4lDQogIGRwbHlyOjpyZW5hbWVfYWxsKH5zdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoIC4sICJfIiwgIiAiICkpICAlPiUgDQogIGRwbHlyOjpyZW5hbWVfYWxsKH5zdHJpbmdyOjpzdHJfd3JhcCguLCAyMCkpICU+JQ0KICBzdW1tYXJ5dG9vbHM6OmRmU3VtbWFyeShwbGFpbi5hc2NpaSA9IEZBTFNFLCBzdHlsZSA9ICJncmlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICBncmFwaC5tYWduaWYgPSAwLjc1LCB2YWxpZC5jb2wgPSBGQUxTRSkgJT4lDQogIHByaW50KG1ldGhvZCA9ICdyZW5kZXInKQ0KYGBgDQoNCg0KDQpgYGB7ciBkZXNjX2NhdGVnLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMX0NCmtuaXRyOjphc2lzX291dHB1dCgiIyMgRnJlcXVlbmN5IGRpc3RyaWJ1dGlvbiBvZiBhbGwgZGlzY3JldGUgdmFyaWFibGVzIikNCnBsb3RfYmFyKERhdGEpDQoNCiMga25pdHI6OmFzaXNfb3V0cHV0KCIjIyBGcmVxdWVuY3kgZGlzdHJpYnV0aW9uIG9mIGFsbCBkaXNjcmV0ZSB2YXJpYWJsZXMgYnkgUENMIGN1dG9mZiIpDQojIHBsb3RfYmFyKERhdGEsIGJ5ID0gIlBDTF9jdXQiKQ0KIyANCiMga25pdHI6OmFzaXNfb3V0cHV0KCIjIyBGcmVxdWVuY3kgZGlzdHJpYnV0aW9uIG9mIGFsbCBkaXNjcmV0ZSB2YXJpYWJsZXMgYnkgUENMIGRpYWdub3N0aWMgYWxnIikNCiMgcGxvdF9iYXIoRGF0YSwgYnkgPSAiUENMQWxnIikNCiMgDQojIGtuaXRyOjphc2lzX291dHB1dCgiIyMgRnJlcXVlbmN5IGRpc3RyaWJ1dGlvbiBvZiBhbGwgZGlzY3JldGUgdmFyaWFibGVzIGJ5IE1CSSBjdXRvZmYiKQ0KIyBwbG90X2JhcihEYXRhLCBieSA9ICJNQklfY3V0IikNCmBgYA0KDQoNCmBgYHtyIGRlc2NfY29udCwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTF9DQprbml0cjo6YXNpc19vdXRwdXQoIiMjIFZpZXcgaGlzdG9ncmFtIG9mIGFsbCBjb250aW51b3VzIHZhcmlhYmxlcyIpDQpEYXRhICU+JQ0KICBkcGx5cjo6c2VsZWN0KC1hbGxfb2YoYyhpbmRleERBU1MsIGluZGV4TUJJLCBpbmRleENFUlEsIGluZGV4UENMKSkpICU+JSAgICAgICAjIGV4Y2x1ZGUgaXRlbXMNCiAgcGxvdF9oaXN0b2dyYW0oKQ0KYGBgDQoNCg0KDQojIyBSZW5hbWUgLyBjb21wdXRlIGdyb3VwaW5nIHZhcmlhYmxlcw0KYGBge3IgZ3JvdXBpbmdfdmFyc30NCm5hbWVzKERhdGEpWzEyXSA8LSAiY2F6dXJpX3BlX3NlY3RpZSINCm5hbWVzKERhdGEpWzE1XSA8LSAiZXhwdW5lcmUiDQoNCmxldmVsc19zZWN0aWUgPC0gbGV2ZWxzKERhdGEkc2VjdGlhX3BlX2NhcmVfZGVzZmFzdXJhdGlfYWN0aXZpdGF0ZWEpDQpsZXZlbHNfc2VjdGllX2FsdGUgPC0gbGV2ZWxzX3NlY3RpZVshKGxldmVsc19zZWN0aWUgJWluJSBjKCIxIiwgIjIxIikpXSANCkRhdGEkc2VjdGllX2NhdGVnIDwtIGZvcmNhdHM6OmZjdF9jb2xsYXBzZShEYXRhJHNlY3RpYV9wZV9jYXJlX2Rlc2Zhc3VyYXRpX2FjdGl2aXRhdGVhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlbGUgPSBsZXZlbHNfc2VjdGllX2FsdGUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRpID0gIjEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwdSA9ICIyMSIpDQpgYGANCg0KDQojIFRlc3RzIC0gSXRlbSBDb3ZpZCBDYXNlcyAobm8uIDkgaW4geGxzeCwgMTIgaW4gZGF0YSkNCg0KYGBge3IgdGVzdF9pdGVtMTIsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTYsIGZpZy5zZXA9YygnXFxuZXdsaW5lJywnXFxuZXdsaW5lJyl9DQpnZ3N0YXRzcGxvdDo6Z2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBEYXRhLA0KICB4ID0gY2F6dXJpX3BlX3NlY3RpZSwgeSA9IE1CSV9Ub3RhbCwNCiAgdHlwZSA9ICJub25wYXJhbWV0cmljIiwNCiAgdGl0bGUgPSAiQnVybm91dCBUb3RhbCIpDQoNCmdnc3RhdHNwbG90OjpnZ2JldHdlZW5zdGF0cygNCiAgZGF0YSA9IERhdGEsDQogIHggPSBjYXp1cmlfcGVfc2VjdGllLCB5ID0gUENMX1RvdGFsLA0KICB0eXBlID0gIm5vbnBhcmFtZXRyaWMiLA0KICB0aXRsZSA9ICJQVFNEIFRvdGFsIikNCg0KZ2dzdGF0c3Bsb3Q6OmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gRGF0YSwNCiAgeCA9IGNhenVyaV9wZV9zZWN0aWUsIHkgPSBEQVNTX0EsDQogIHR5cGUgPSAibm9ucGFyYW1ldHJpYyIsDQogIHRpdGxlID0gIkFueGlldHkiKQ0KDQpnZ3N0YXRzcGxvdDo6Z2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBEYXRhLA0KICB4ID0gY2F6dXJpX3BlX3NlY3RpZSwgeSA9IERBU1NfUywNCiAgdHlwZSA9ICJub25wYXJhbWV0cmljIiwNCiAgdGl0bGUgPSAiU3RyZXNzIikNCg0KZ2dzdGF0c3Bsb3Q6OmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gRGF0YSwNCiAgeCA9IGNhenVyaV9wZV9zZWN0aWUsIHkgPSBEQVNTX0QsDQogIHR5cGUgPSAibm9ucGFyYW1ldHJpYyIsDQogIHRpdGxlID0gIkRlcHJlc3Npb24iKQ0KYGBgDQoNCiMgVGVzdHMgLSBJdGVtIEV4cHVuZXJlIChuby4gMTIgaW4geGxzeCwgMTUgaW4gZGF0YSkNCg0KYGBge3IgdGVzdF9pdGVtMTUsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTYsIGZpZy5zZXA9YygnXFxuZXdsaW5lJywnXFxuZXdsaW5lJyl9DQpnZ3N0YXRzcGxvdDo6Z2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBEYXRhLA0KICB4ID0gZXhwdW5lcmUsIHkgPSBNQklfVG90YWwsDQogIHR5cGUgPSAibm9ucGFyYW1ldHJpYyIsDQogIHRpdGxlID0gIkJ1cm5vdXQgVG90YWwiKQ0KDQpnZ3N0YXRzcGxvdDo6Z2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBEYXRhLA0KICB4ID0gZXhwdW5lcmUsIHkgPSBQQ0xfVG90YWwsDQogIHR5cGUgPSAibm9ucGFyYW1ldHJpYyIsDQogIHRpdGxlID0gIlBUU0QgVG90YWwiKQ0KDQpnZ3N0YXRzcGxvdDo6Z2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBEYXRhLA0KICB4ID0gZXhwdW5lcmUsIHkgPSBEQVNTX0EsDQogIHR5cGUgPSAibm9ucGFyYW1ldHJpYyIsDQogIHRpdGxlID0gIkFueGlldHkiKQ0KDQpnZ3N0YXRzcGxvdDo6Z2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBEYXRhLA0KICB4ID0gZXhwdW5lcmUsIHkgPSBEQVNTX1MsDQogIHR5cGUgPSAibm9ucGFyYW1ldHJpYyIsDQogIHRpdGxlID0gIlN0cmVzcyIpDQoNCmdnc3RhdHNwbG90OjpnZ2JldHdlZW5zdGF0cygNCiAgZGF0YSA9IERhdGEsDQogIHggPSBleHB1bmVyZSwgeSA9IERBU1NfRCwNCiAgdHlwZSA9ICJub25wYXJhbWV0cmljIiwNCiAgdGl0bGUgPSAiRGVwcmVzc2lvbiIpDQpgYGANCg0KIyBUZXN0cyAtIEl0ZW0gU2VjdGlpIChuby4gOCBpbiB4bHN4LCByZWxldmVsZWQgaW4gZGF0YSkNCg0KYGBge3IgdGVzdF9pdGVtMTQwLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBmaWcuc2VwPWMoJ1xcbmV3bGluZScsJ1xcbmV3bGluZScpfQ0KZ2dzdGF0c3Bsb3Q6OmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gRGF0YSwNCiAgeCA9IHNlY3RpZV9jYXRlZywgeSA9IE1CSV9Ub3RhbCwNCiAgdHlwZSA9ICJub25wYXJhbWV0cmljIiwNCiAgdGl0bGUgPSAiQnVybm91dCBUb3RhbCIpDQoNCmdnc3RhdHNwbG90OjpnZ2JldHdlZW5zdGF0cygNCiAgZGF0YSA9IERhdGEsDQogIHggPSBzZWN0aWVfY2F0ZWcsIHkgPSBQQ0xfVG90YWwsDQogIHR5cGUgPSAibm9ucGFyYW1ldHJpYyIsDQogIHRpdGxlID0gIlBUU0QgVG90YWwiKQ0KDQpnZ3N0YXRzcGxvdDo6Z2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBEYXRhLA0KICB4ID0gc2VjdGllX2NhdGVnLCB5ID0gREFTU19BLA0KICB0eXBlID0gIm5vbnBhcmFtZXRyaWMiLA0KICB0aXRsZSA9ICJBbnhpZXR5IikNCg0KZ2dzdGF0c3Bsb3Q6OmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gRGF0YSwNCiAgeCA9IHNlY3RpZV9jYXRlZywgeSA9IERBU1NfUywNCiAgdHlwZSA9ICJub25wYXJhbWV0cmljIiwNCiAgdGl0bGUgPSAiU3RyZXNzIikNCg0KZ2dzdGF0c3Bsb3Q6OmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gRGF0YSwNCiAgeCA9IHNlY3RpZV9jYXRlZywgeSA9IERBU1NfRCwNCiAgdHlwZSA9ICJub25wYXJhbWV0cmljIiwNCiAgdGl0bGUgPSAiRGVwcmVzc2lvbiIpDQpgYGANCg0KDQojIFRlc3RzIC0gSXRlbSBTZWN0aWkgJiBDdXRvZmYgc2NvcmVzDQoNCmBgYHtyIHRlc3RfaXRlbTE0MF9jdXRvZmZzLCBmaWcuaGVpZ2h0PTcsIGZpZy53aWR0aD05LCBmaWcuc2VwPWMoJ1xcbmV3bGluZScsJ1xcbmV3bGluZScpLCB3YXJuaW5nPUZBTFNFfQ0KZ2dzdGF0c3Bsb3Q6OmdncGllc3RhdHMoDQogIGRhdGEgPSBEYXRhLA0KICB4ID0gc2VjdGllX2NhdGVnLCB5ID0gUENMQWxnLA0KICB0eXBlID0gIm5vbnBhcmFtZXRyaWMiLA0KICB0aXRsZSA9ICJQVFNEIGFsZ28iKQ0KDQpnZ3N0YXRzcGxvdDo6Z2dwaWVzdGF0cygNCiAgZGF0YSA9IERhdGEsDQogIHggPSBzZWN0aWVfY2F0ZWcsIHkgPSBQQ0xfY3V0LA0KICB0eXBlID0gIm5vbnBhcmFtZXRyaWMiLA0KICB0aXRsZSA9ICJQVFNEIGN1dG9mZiIpDQoNCmdnc3RhdHNwbG90OjpnZ3BpZXN0YXRzKA0KICBkYXRhID0gRGF0YSwNCiAgeCA9IHNlY3RpZV9jYXRlZywgeSA9IE1CSV9jdXQsDQogIHR5cGUgPSAibm9ucGFyYW1ldHJpYyIsDQogIHRpdGxlID0gIk1CSSBjdXRvZmYiKQ0KYGBgDQoNCg0KDQoNCg0KPCEtLSBTZXNzaW9uIEluZm8gYW5kIExpY2Vuc2UgLS0+DQoNCjxicj4NCg0KIyBTZXNzaW9uIEluZm8NCmBgYHtyIHNlc3Npb25faW5mbywgZWNobyA9IEZBTFNFLCByZXN1bHRzID0gJ21hcmt1cCd9DQpzZXNzaW9uSW5mbygpICAgIA0KYGBgDQoNCjwhLS0gRm9vdGVyIC0tPg0KJm5ic3A7DQo8aHIgLz4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij5BIHdvcmsgYnkgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0NsYXVkaXVQYXBhc3RlcmkvIj5DbGF1ZGl1IFBhcGFzdGVyaTwvYT48L3A+DQo8cCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjODA4MDgwOyI+PGVtPmNsYXVkaXUucGFwYXN0ZXJpQGdtYWlsLmNvbTwvZW0+PC9zcGFuPjwvcD4NCiZuYnNwOw0K