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
}
##
## 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, napercent = .1, tonumeric = FALSE, reversecols = NULL, min = NULL, max = NULL, engine = "sum") {
  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(engine == "sum") {
    return(
      ifelse(rowSums(is.na(df)) > ncol(df) * napercent,
             NA,
             rowSums(df, na.rm = TRUE) * NA ^ (rowSums(!is.na(df)) == 0)
      )
    )  
  }
  
  if(engine == "mean") {
    return(
      ifelse(rowMeans(is.na(df)) > ncol(df) * napercent,
             NA,
             rowMeans(df, na.rm = TRUE) * NA ^ (rowSums(!is.na(df)) == 0)
      )       
    )
  }
  
    if(engine == "mean_na") {
      df[is.na(df)] <- 0
      rowMeans(df)
    }
}

2 Read survey structure

# LimeSurvey export survey as .txt (.xml is good too, but easier to work with .txt)
survey_df <- readr::read_delim("limesurvey_survey_192485.txt", delim = '\t')
Rows: 237 Columns: 147-- Column specification ------------------------------------------------------------------------------------------------------------------------
Delimiter: "\t"
chr  (11): class, type/scale, name, relevance, text, language, mandatory, encrypted, other, em_validation_q, em_validation_q_tip
dbl  (25): id, related_id, same_default, same_script, alphasort, array_filter_style, assessment_value, display_type, dropdown_prefix, exclud...
lgl (111): help, validation, default, allowed_filetypes, answer_width, answer_width_bycolumn, array_filter, array_filter_exclude, category_s...
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
survey_df <- 
  survey_df %>%
  select_if(~ !all(is.na(.)))

survey_codetext <-
  survey_df %>%
  select(name, text) %>%
  slice(
    seq(
      from = min(which(str_detect(name, "nt Informat"))),
      to = nrow(.)
  )) %>%
  mutate(row_no = row_number()) %>%
  relocate(row_no)

DT::datatable(
  survey_codetext[3:nrow(survey_codetext),],
  extensions = "Buttons",
  fillContainer = TRUE,
  rownames = FALSE,
  selection = "multiple",
  # style = "bootstrap", 
  # class = "compact", #width = "1000px",
  options = list(
    #autowidth = TRUE,
    deferRender = FALSE,
    pageLength = 30,
    scrollX = "100px",
    # scrollY = "400px"
    dom = "Bfrtip",
    buttons = c("excel", "csv")
  )
)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

3 Item coding based on survey structure

item_codetext <-
  survey_codetext %>%
  slice(
    seq(
      from = which(str_detect(name, "Demografice")) + 1,
      to = nrow(.)
  )) %>%
  mutate(
    clean_text = str_remove_all(text, "<.*?>"),                           # remove HTML tags
    is_question = str_detect(name, "^G0.*"),                               # tag questions
    is_subquestion = str_detect(name, "^SQ.*"),                            # tag subquestions
    is_answer = str_detect(name, "^AO.*"),                                 # tag answer definitions
    quest_no = cumsum(is_question),                                       # number all questions
    question = if_else(is_question, name, NA_character_),                 # get question codes
    subquestion = if_else(is_subquestion, name, NA_character_),           # get subquestion codes
    question_text = if_else(is_question, clean_text, NA_character_),                 # get question texts
    subquestion_text = if_else(is_subquestion, clean_text, NA_character_),           # get subquestion texts
    answer = 
      if_else(is_answer, 
        paste0("\"", name, "\"", " = ", "\"", clean_text, "\""), 
        NA_character_
      )                                                                   # paste definition of each answer
  ) %>%
  fill(question, .direction = "down") %>%                   # fill with same question, it appies for subquestions and answers
  filter(is_question | is_subquestion | is_answer)                        # drop sections and other useless info

# Full info on items as list-columns dataframe
item_info <-
  item_codetext %>%
  select(question, subquestion, question_text, subquestion_text, answer) %>%
  pivot_longer(cols = -question, values_drop_na = TRUE) %>%
  pivot_wider(names_from = name, values_from = value, values_fn = list)


# Meant to be used as: 
# def <- c("foo" = "bar", "zar" = "far")
# dplyr::recode(as.character(col), !!!def)
# e.g. item_def$answer[item_def$question == "G02Q03"]
#      eval(parse(text = item_def$answer[item_def$question == "G02Q03"]))

item_def <-
  item_codetext %>%
  filter(is_answer) %>%
  select(question, answer) %>%
  group_by(question) %>%
  mutate(answer = paste0(answer, collapse = ", "),
         answer = paste0("c(", answer, ")")) %>%
  distinct()

#e.g. on how to use item_def
# test_df <- 
#   df %>%
#   mutate(
#     across(
#       .cols = starts_with("G02Q03"),
#       .fns = ~recode(., !!!eval(parse(text = item_def$answer[item_def$question == "G02Q03"])))     
#     )
#   )  

DT::datatable(
  item_def,
  extensions = "Buttons",
  fillContainer = TRUE,
  rownames = FALSE,
  selection = "multiple",
  # style = "bootstrap", 
  # class = "compact", #width = "1000px",
  options = list(
    #autowidth = TRUE,
    deferRender = FALSE,
    pageLength = 15,
    scrollX = "100px",
    # scrollY = "400px"
    dom = "Bfrtip",
    buttons = c("excel", "csv")
  )
)

4 Read data & transform

df <- readr::read_csv("survey_192485_R_data_file.csv")
Rows: 62 Columns: 112-- Column specification ------------------------------------------------------------------------------------------------------------------------
Delimiter: ","
chr  (70): startlanguage, G02Q03, G02Q04, G03Q05, G03Q06, G03Q07, G03Q08, G03Q10, G03Q15, G04Q10[SQ001], G04Q10[SQ002], G04Q10[SQ003], G04Q1...
dbl  (41): id, lastpage, seed, Q00[SQ001], G02Q02, G03Q09, G07Q13[SQ001], G07Q13[SQ002], G07Q13[SQ003], G07Q13[SQ004], G07Q13[SQ005], G07Q13...
dttm  (1): submitdate
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
# test_df <- 
#   map_dfc(
#     item_def$question,
#     \(x) {
#       map(
#         df %>%
#           select(contains(x)),
#         \(y) recode(y, !!!eval(parse(text = item_def$answer[str_detect(item_def$question, x)])))
#       )
#     }
#   )

# Need to find a way to iterate this with purrr
df_recoded <-
  df %>%
  mutate(
    across(
      .cols = starts_with(item_def$question[1]),
      .fns = ~recode(., !!!eval(parse(text = item_def$answer[str_detect(item_def$question, item_def$question[1])])))
    ),
    across(
      .cols = starts_with(item_def$question[2]),
      .fns = ~recode(., !!!eval(parse(text = item_def$answer[str_detect(item_def$question, item_def$question[2])])))
    ),
    across(
      .cols = starts_with(item_def$question[3]),
      .fns = ~recode(., !!!eval(parse(text = item_def$answer[str_detect(item_def$question, item_def$question[3])])))
    ),
    across(
      .cols = starts_with(item_def$question[4]),
      .fns = ~recode(., !!!eval(parse(text = item_def$answer[str_detect(item_def$question, item_def$question[4])])))
    ),
    across(
      .cols = starts_with(item_def$question[5]),
      .fns = ~recode(., !!!eval(parse(text = item_def$answer[str_detect(item_def$question, item_def$question[5])])))
    ),
    across(
      .cols = starts_with(item_def$question[6]),
      .fns = ~recode(., !!!eval(parse(text = item_def$answer[str_detect(item_def$question, item_def$question[6])])))
    ),
    across(
      .cols = starts_with(item_def$question[7]),
      .fns = ~recode(., !!!eval(parse(text = item_def$answer[str_detect(item_def$question, item_def$question[7])])))
    ),
    across(
      .cols = starts_with(item_def$question[8]),
      .fns = ~recode(., !!!eval(parse(text = item_def$answer[str_detect(item_def$question, item_def$question[8])])))
    ),
    across(
      .cols = starts_with(item_def$question[9]),
      .fns = ~recode(., !!!eval(parse(text = item_def$answer[str_detect(item_def$question, item_def$question[9])])))
    ),
    across(
      .cols = starts_with(item_def$question[10]),
      .fns = ~recode(., !!!eval(parse(text = item_def$answer[str_detect(item_def$question, item_def$question[10])])))
    )
  )

# To numeric and rescale questionnaire items 
# for numeric extraction: str_extract(x, "[0-9]")   # "[0-9]+" for more digits, but Liker scales have only 1 digit
# [8]  = G04Q10 = Reactiv [1, 7]
# [9]  = G05Q11 = Empath [0, 4]
# [10] = G06Q12 = Online_Terap [1, 5]
#        G07Q13 = QSort (is already numeric, but needs to be on scale [-4, +4])

df_recoded2 <-
  df_recoded %>%
  mutate(
    across(
      .cols = starts_with(c("G04Q10", "G05Q11", "G06Q12")),
      .fns = ~as.numeric(str_extract(., "[0-9]"))     # get only digits and to numeric
    ),
    across(
      .cols = starts_with("G07Q13"),
      .fns = ~((.-5)*(-1))                           # to [-4, +4], where 1=+4, 9=-4
    )
  )
# check - everything fine
# df_recoded2 %>% select(starts_with("G04Q10")) %>% summary()
# df_recoded2 %>% select(starts_with("G05Q11")) %>% summary()
# df_recoded2 %>% select(starts_with("G06Q12")) %>% summary()
# df_recoded2 %>% select(starts_with("G07Q13")) %>% summary()

4.1 Scoring IRI

## IRI
# Scales with reversed c(3,4,7,12,13,14,15,18,19)         min = 0, max = 4
# Empathic Concern   - IRI_EC c(1,5,7,12,16,23,26)
# Perspective Taking - IRI_PT c(3,8,11,15,21,25,28)
# Fantasy            - IRI_F  c(2,4,9,14,18,20,22)
# Personal Distress  - IRI_PD c(6,10,13,17,19,24,27)
idx_iri <- df_recoded2 %>% select(starts_with("G05Q11")) %>% colnames()
idx_item_iri_rev <- c(3,4,7,12,13,14,15,18,19) %>% sprintf('%0.3d', .) %>% paste0("G05Q11[SQ", . ,"]")
idx_item_iri_ec <- c(1,5,7,12,16,23,26) %>% sprintf('%0.3d', .) %>% paste0("G05Q11[SQ", . ,"]")
idx_item_iri_pt <- c(3,8,11,15,21,25,28) %>% sprintf('%0.3d', .) %>% paste0("G05Q11[SQ", . ,"]")
idx_item_iri_f <- c(2,4,9,14,18,20,22) %>% sprintf('%0.3d', .) %>% paste0("G05Q11[SQ", . ,"]")
idx_item_iri_pd <- c(6,10,13,17,19,24,27) %>% sprintf('%0.3d', .) %>% paste0("G05Q11[SQ", . ,"]")

df_recoded2$IRI_EC <- ScoreLikert(df_recoded2[idx_item_iri_ec], reversecols = intersect(idx_item_iri_rev, idx_item_iri_ec), napercent = .9, min = 0, max = 4)
df_recoded2$IRI_PT <- ScoreLikert(df_recoded2[idx_item_iri_pt], reversecols = intersect(idx_item_iri_rev, idx_item_iri_pt), napercent = .9, min = 0, max = 4)
df_recoded2$IRI_F  <- ScoreLikert(df_recoded2[idx_item_iri_f], reversecols = intersect(idx_item_iri_rev, idx_item_iri_f), napercent = .9, min = 0, max = 4)
df_recoded2$IRI_PD <- ScoreLikert(df_recoded2[idx_item_iri_pd], reversecols = intersect(idx_item_iri_rev, idx_item_iri_pd), napercent = .9, min = 0, max = 4)

4.2 Scoring UTAUT (Online Therapy)

# UTAUT
# Scales with reversed c(5,9,11,20,21)         min = 1, max = 5
# Therapy Quality Expectation: 1,2,5R,6,9R,11R,15,17,21R; - UT_QE c(1,2,5,6,9,11,15,17,21)
# Ease of use: 12,14,18,20R;                              - UT_EU c(12,14,18,20)
# Pressure from others: 4,16;                             - UT_PO c(4,16)
# Professional Support: 8,19;                             - UT_PS c(8,19) 
# Convenience: 3,13;                                      - UT_C  c(3,13)
# Behavior intention: 7,10                                - UT_BI c(7,10)
idx_ut <- df_recoded2 %>% select(starts_with("G06Q12")) %>% colnames()
idx_item_ut_rev <- c(5,9,11,20,21) %>% sprintf('%0.3d', .) %>% paste0("G06Q12[SQ", . ,"]")
idx_item_ut_qe <- c(1,2,5,6,9,11,15,17,21) %>% sprintf('%0.3d', .) %>% paste0("G06Q12[SQ", . ,"]")
idx_item_ut_eu <- c(12,14,18,20) %>% sprintf('%0.3d', .) %>% paste0("G06Q12[SQ", . ,"]")
idx_item_ut_po <- c(4,16) %>% sprintf('%0.3d', .) %>% paste0("G06Q12[SQ", . ,"]")
idx_item_ut_ps <- c(8,19) %>% sprintf('%0.3d', .) %>% paste0("G06Q12[SQ", . ,"]")
idx_item_ut_c <- c(3,13) %>% sprintf('%0.3d', .) %>% paste0("G06Q12[SQ", . ,"]")
idx_item_ut_bi <- c(7,10) %>% sprintf('%0.3d', .) %>% paste0("G06Q12[SQ", . ,"]")

df_recoded2$UT_QE <- ScoreLikert(df_recoded2[idx_item_ut_qe], reversecols = intersect(idx_item_ut_rev, idx_item_ut_qe), napercent = .9, min = 1, max = 5)
df_recoded2$UT_EU <- ScoreLikert(df_recoded2[idx_item_ut_eu], reversecols = intersect(idx_item_ut_rev, idx_item_ut_eu), napercent = .9, min = 1, max = 5)
df_recoded2$UT_PO <- ScoreLikert(df_recoded2[idx_item_ut_po], napercent = .9)
df_recoded2$UT_PS <- ScoreLikert(df_recoded2[idx_item_ut_ps], napercent = .9)
df_recoded2$UT_C <- ScoreLikert(df_recoded2[idx_item_ut_c], napercent = .9)
df_recoded2$UT_BI <- ScoreLikert(df_recoded2[idx_item_ut_bi], napercent = .9)

df_recoded2$UT_Total <- rowSums(df_recoded2[, c("UT_QE", "UT_EU", "UT_PO", "UT_PS", "UT_C", "UT_BI")], na.rm = TRUE)

5 Q Method

# ----------------------------------------
# Item texts
item_qsort_text <- read_lines("JHP_operationalis_items.txt") %>% as.vector() 

# Grid
# 2 + 
#   3 + 
#     4 +           # 9 Important
#       5 + 
#         7 +
#       5 +         # 17 Some what important / Neutral
#     4 +
#   3 +
# 2                 # 9 Unimportant

distro <- c(
  rep(-4, 2), rep(-3, 3), rep(-2, 4), 
  rep(-1, 5), rep(0, 7), rep(1, 5),
  rep(2, 4), rep(3, 3), rep(4, 2)
)

# ----------------------------------------
# Prepare data for QMethod
# QMethod needs statements on rows and sorts on columns (t())
idx_qsort <- df_recoded2 %>% select(starts_with("G07Q13")) %>% colnames()
df_qsort_data <-
  df_recoded2[, c("id", idx_qsort)] %>%
  column_to_rownames(var = "id") %>%
  t() %>% 
  as.data.frame() 
df_qsort_text <- paste(rownames(df_qsort_data), item_qsort_text) %>% data.frame(item_text = .)
list_qsort <- list(df_qsort_data, df_qsort_text)

# ----------------------------------------
# Number of factors to extract
screeplot(prcomp(df_qsort_data), main = "Screeplot of unrotated factors", type = "l")  # 3 factors?

# psych::fa.parallel(df_recoded2[idx_qsort])
# ----------------------------------------

# Run the analysis using centroid factor extraction instead of PCA, and without rotation:
results <- qmethod::qmethod(
  df_qsort_data, nfactors = 3,
  forced = FALSE, silent = TRUE,
  distribution = distro
)
Warning: Matrix was not positive definite, smoothing was done
# qmethod:::summary.QmethodRes(results)
# ----------------------------------------

# Print results
results$loa %>% knitr::kable(caption = "Q-sort factor loadings")
Q-sort factor loadings
f1 f2 f3
11 0.1448174 -0.1493926 0.2870959
37 0.4036963 0.0870309 0.0036444
46 0.3371961 -0.1885360 -0.2839555
48 0.3801602 0.1896942 0.0404194
59 0.3187108 0.3548153 -0.1701790
61 0.6283885 0.2828332 0.0785425
63 0.7910716 0.2260446 -0.0625294
72 0.4599512 0.7587518 0.0222622
82 0.7153469 0.2856906 -0.0641746
83 0.2274653 0.5840321 0.2333818
86 0.8727622 0.0587445 0.0706060
92 0.6766646 0.3048455 0.2312658
93 0.2480217 0.5454371 0.0536399
95 -0.1847161 0.0850928 0.7096890
96 0.4670216 0.2396781 -0.0344271
101 0.3852143 0.5777452 0.0940112
102 0.0171218 0.8171551 -0.0695304
105 0.2602513 0.0042346 0.6987283
106 0.5592579 0.4607125 0.0194947
109 0.6743180 0.2498041 0.1232818
113 0.2296119 0.3606906 0.4150292
119 0.3884485 0.0722941 0.3759224
134 0.0495205 0.4784501 -0.3370000
136 0.2538040 0.0701075 0.6300563
137 -0.2681886 0.6658006 0.4266023
138 -0.1837901 -0.2033856 -0.1360679
139 0.3149728 0.3155733 0.5054717
144 0.1998164 0.4997272 0.1174611
145 0.0223731 0.3671758 0.6732903
153 0.2985307 0.7252353 0.3182971
154 0.0827397 0.1634768 0.5799035
159 -0.0935166 0.0122940 0.3759428
171 0.0161382 0.3335623 0.6084304
176 0.4029480 0.3731108 0.3626730
179 0.4535236 -0.0128897 0.1664832
182 0.6866053 0.1516792 0.0153027
191 0.7455406 0.3067641 0.0568509
192 0.1656963 0.1701053 0.1198699
194 0.3038405 0.5461032 0.1536679
197 0.3484276 0.6687571 0.0660291
210 0.0179998 0.0621173 0.4600565
216 0.4647100 -0.1753287 0.4543671
221 0.0678609 0.7164278 0.2561961
222 -0.1290470 0.4030607 0.2417725
229 0.5161928 0.2262611 0.3557571
234 0.3626340 0.4369613 0.2952123
235 0.6136234 -0.0543764 -0.0843731
237 0.9198644 0.0616210 -0.0571609
240 0.1578428 0.6338213 0.3931845
244 0.4757014 -0.0607942 0.4608155
259 0.3998005 0.2733487 0.2896759
264 -0.4890947 0.0952293 0.3071036
269 -0.2221640 0.0268601 0.5346176
271 0.0590251 -0.1060707 -0.1607999
280 -0.4083028 0.0747994 0.6216368
283 0.4447168 0.4106412 0.0169136
285 0.1091876 0.2380480 0.4315982
286 0.3583201 0.3292532 0.2807049
287 0.1312776 0.6863478 0.3010843
288 0.2190694 0.0803580 0.6833975
289 -0.0053536 0.4047308 0.5590562
291 0.1728088 -0.3437969 0.2801386
results$flagged %>% knitr::kable(caption = "Flagged Q-sorts")  
Flagged Q-sorts
flag_f1 flag_f2 flag_f3
11 FALSE FALSE FALSE
37 TRUE FALSE FALSE
46 FALSE FALSE FALSE
48 TRUE FALSE FALSE
59 FALSE FALSE FALSE
61 TRUE FALSE FALSE
63 TRUE FALSE FALSE
72 FALSE TRUE FALSE
82 TRUE FALSE FALSE
83 FALSE TRUE FALSE
86 TRUE FALSE FALSE
92 TRUE FALSE FALSE
93 FALSE TRUE FALSE
95 FALSE FALSE TRUE
96 TRUE FALSE FALSE
101 FALSE TRUE FALSE
102 FALSE TRUE FALSE
105 FALSE FALSE TRUE
106 TRUE FALSE FALSE
109 TRUE FALSE FALSE
113 FALSE FALSE FALSE
119 TRUE FALSE FALSE
134 FALSE TRUE FALSE
136 FALSE FALSE TRUE
137 FALSE TRUE FALSE
138 FALSE FALSE FALSE
139 FALSE FALSE TRUE
144 FALSE TRUE FALSE
145 FALSE FALSE TRUE
153 FALSE TRUE FALSE
154 FALSE FALSE TRUE
159 FALSE FALSE TRUE
171 FALSE FALSE TRUE
176 FALSE FALSE FALSE
179 TRUE FALSE FALSE
182 TRUE FALSE FALSE
191 TRUE FALSE FALSE
192 FALSE FALSE FALSE
194 FALSE TRUE FALSE
197 FALSE TRUE FALSE
210 FALSE FALSE TRUE
216 FALSE FALSE FALSE
221 FALSE TRUE FALSE
222 FALSE TRUE FALSE
229 TRUE FALSE FALSE
234 FALSE FALSE FALSE
235 TRUE FALSE FALSE
237 TRUE FALSE FALSE
240 FALSE TRUE FALSE
244 TRUE FALSE FALSE
259 TRUE FALSE FALSE
264 TRUE FALSE FALSE
269 FALSE FALSE TRUE
271 FALSE FALSE FALSE
280 FALSE FALSE TRUE
283 TRUE FALSE FALSE
285 FALSE FALSE TRUE
286 FALSE FALSE FALSE
287 FALSE TRUE FALSE
288 FALSE FALSE TRUE
289 FALSE FALSE TRUE
291 FALSE TRUE FALSE

# I think flagged  is based on some cutoff on loadings
# try_calc_flag <- !results$loa - apply(results$loa, 1, max) & abs(results$loa) >= .37
# identical(try_calc_flag, results$flagged)
# all.equal(try_calc_flag, results$flagged)   # close enough ... so it's max loading and some cutoff probably

results$zsc %>% knitr::kable(caption = "Statement z-scores")
Statement z-scores
zsc_f1 zsc_f2 zsc_f3
G07Q13[SQ001] 2.1163900 1.8570656 2.4116093
G07Q13[SQ002] 2.0703094 2.0089255 2.2103663
G07Q13[SQ003] 1.6103591 1.5893563 1.0348899
G07Q13[SQ004] 1.6151539 1.3952435 -0.3864255
G07Q13[SQ005] 1.6695393 1.0947901 -1.4258683
G07Q13[SQ006] 1.1057587 0.3603414 -1.1210153
G07Q13[SQ007] 1.0027605 0.1308645 -1.6280403
G07Q13[SQ008] 0.2895092 0.1329359 -0.1558329
G07Q13[SQ009] 0.4332790 0.2263094 -0.7236585
G07Q13[SQ010] 0.1841820 0.5248865 0.5335942
G07Q13[SQ011] 0.0091631 -0.5792138 -0.2000609
G07Q13[SQ012] -0.2688383 0.1338902 0.1139803
G07Q13[SQ013] -1.1843425 -0.0054289 0.3544529
G07Q13[SQ014] -1.1497751 0.7369696 0.6411160
G07Q13[SQ015] -1.3501110 0.3481251 0.4525810
G07Q13[SQ016] -0.9353470 0.6368652 0.4377675
G07Q13[SQ017] -1.3531174 -0.5481111 -0.2176812
G07Q13[SQ018] -1.1027838 -0.9137774 -0.5339872
G07Q13[SQ019] -0.4185989 -0.2303308 0.4940304
G07Q13[SQ020] -1.0868747 -1.4081651 -1.5395981
G07Q13[SQ021] -0.4751558 0.2355206 2.0458886
G07Q13[SQ022] -0.9782590 0.1685800 0.8508475
G07Q13[SQ023] -0.5630221 -0.5692688 -1.5303506
G07Q13[SQ024] -0.5377150 0.0960759 -0.7484994
G07Q13[SQ025] -0.1565261 0.3791426 -0.3188503
G07Q13[SQ026] 0.1254461 0.9932803 -0.0593661
G07Q13[SQ027] -0.6041356 -0.8419211 0.2012172
G07Q13[SQ028] -1.3492289 0.6992244 -0.6614467
G07Q13[SQ029] -0.1826839 -0.9806495 0.4709171
G07Q13[SQ030] 0.3923762 -0.1501840 1.0374177
G07Q13[SQ031] -0.1565437 -1.1547716 -0.0733107
G07Q13[SQ032] -0.0436621 -1.3615160 -0.5417103
G07Q13[SQ033] 0.5957526 -1.9299018 0.0291191
G07Q13[SQ034] 0.3136338 -1.9783381 -0.3257159
G07Q13[SQ035] 0.3631082 -1.0968146 -1.1283769
results$zsc_n %>% knitr::kable(caption = "Statement factor scores")
Statement factor scores
fsc_f1 fsc_f2 fsc_f3
G07Q13[SQ001] 4 4 4
G07Q13[SQ002] 4 4 4
G07Q13[SQ003] 3 3 3
G07Q13[SQ004] 3 3 -1
G07Q13[SQ005] 3 3 -3
G07Q13[SQ006] 2 1 -2
G07Q13[SQ007] 2 0 -4
G07Q13[SQ008] 1 0 0
G07Q13[SQ009] 2 0 -2
G07Q13[SQ010] 1 1 2
G07Q13[SQ011] 0 -1 0
G07Q13[SQ012] 0 0 0
G07Q13[SQ013] -3 0 1
G07Q13[SQ014] -3 2 2
G07Q13[SQ015] -4 1 1
G07Q13[SQ016] -2 2 1
G07Q13[SQ017] -4 -1 0
G07Q13[SQ018] -2 -2 -1
G07Q13[SQ019] -1 -1 2
G07Q13[SQ020] -2 -3 -4
G07Q13[SQ021] -1 1 3
G07Q13[SQ022] -2 0 2
G07Q13[SQ023] -1 -1 -3
G07Q13[SQ024] -1 0 -2
G07Q13[SQ025] 0 1 -1
G07Q13[SQ026] 0 2 0
G07Q13[SQ027] -1 -2 1
G07Q13[SQ028] -3 2 -2
G07Q13[SQ029] 0 -2 1
G07Q13[SQ030] 1 -1 3
G07Q13[SQ031] 0 -3 0
G07Q13[SQ032] 0 -3 -1
G07Q13[SQ033] 2 -4 0
G07Q13[SQ034] 1 -4 -1
G07Q13[SQ035] 1 -2 -3

results$f_char$characteristics %>% knitr::kable(caption = "Factor characteristics")
Factor characteristics
av_rel_coef nload eigenvals expl_var reliability se_fscores
f1 0.8 21 10.275122 16.57278 0.9882353 0.1084652
f2 0.8 16 8.683763 14.00607 0.9846154 0.1240347
f3 0.8 14 7.471523 12.05084 0.9824561 0.1324532
results$f_char$cor_zsc %>% knitr::kable(caption = "Correlation between factor z-scores")
Correlation between factor z-scores
zsc_f1 zsc_f2 zsc_f3
zsc_f1 1.0000000 0.4334072 0.1612968
zsc_f2 0.4334072 1.0000000 0.4201442
zsc_f3 0.1612968 0.4201442 1.0000000
results$f_char$sd_dif %>% knitr::kable(caption = "Standard error of differences between factors")
Standard error of differences between factors
f1 f2 f3
f1 0.1533930 0.1647705 0.1711974
f2 0.1647705 0.1754116 0.1814620
f3 0.1711974 0.1814620 0.1873172
 
results$qdc %>% knitr::kable(caption = "Distinguishing and consensus statements")
Distinguishing and consensus statements
dist.and.cons f1_f2 sig_f1_f2 f1_f3 sig_f1_f3 f2_f3 sig_f2_f3
G07Q13[SQ001] 0.2593244 -0.2952194 -0.5545437 **
G07Q13[SQ002] Consensus 0.0613839 -0.1400570 -0.2014409
G07Q13[SQ003] Distinguishes f3 only 0.0210028 0.5754692 *** 0.5544664 **
G07Q13[SQ004] Distinguishes f3 only 0.2199104 2.0015793 6* 1.7816690 6*
G07Q13[SQ005] Distinguishes all 0.5747492 *** 3.0954076 6* 2.5206584 6*
G07Q13[SQ006] Distinguishes all 0.7454173 *** 2.2267740 6* 1.4813567 6*
G07Q13[SQ007] Distinguishes all 0.8718960 6* 2.6308008 6* 1.7589048 6*
G07Q13[SQ008] 0.1565733 0.4453421 ** 0.2887688
G07Q13[SQ009] Distinguishes f3 only 0.2069695 1.1569375 6* 0.9499679 6*
G07Q13[SQ010] Distinguishes f1 only -0.3407045 * -0.3494122 * -0.0087077
G07Q13[SQ011] Distinguishes f2 only 0.5883769 *** 0.2092240 -0.3791529 *
G07Q13[SQ012] Distinguishes f1 only -0.4027285 * -0.3828186 * 0.0199098
G07Q13[SQ013] Distinguishes all -1.1789136 6* -1.5387954 6* -0.3598818 *
G07Q13[SQ014] Distinguishes f1 only -1.8867447 6* -1.7908911 6* 0.0958536
G07Q13[SQ015] Distinguishes f1 only -1.6982360 6* -1.8026920 6* -0.1044560
G07Q13[SQ016] Distinguishes f1 only -1.5722121 6* -1.3731145 6* 0.1990976
G07Q13[SQ017] Distinguishes f1 only -0.8050063 *** -1.1354362 6* -0.3304298
G07Q13[SQ018] Distinguishes f3 only -0.1890064 -0.5687966 *** -0.3797902 *
G07Q13[SQ019] Distinguishes f3 only -0.1882681 -0.9126293 6* -0.7243612 ***
G07Q13[SQ020] 0.3212904 0.4527234 ** 0.1314330
G07Q13[SQ021] Distinguishes all -0.7106765 *** -2.5210444 6* -1.8103680 6*
G07Q13[SQ022] Distinguishes all -1.1468390 6* -1.8291066 6* -0.6822676 ***
G07Q13[SQ023] Distinguishes f3 only 0.0062466 0.9673285 6* 0.9610818 6*
G07Q13[SQ024] Distinguishes f2 only -0.6337909 *** 0.2107844 0.8445753 ***
G07Q13[SQ025] Distinguishes f2 only -0.5356687 ** 0.1623242 0.6979929 ***
G07Q13[SQ026] Distinguishes f2 only -0.8678342 6* 0.1848122 1.0526464 6*
G07Q13[SQ027] Distinguishes f3 only 0.2377856 -0.8053528 *** -1.0431384 6*
G07Q13[SQ028] Distinguishes all -2.0484532 6* -0.6877822 *** 1.3606710 6*
G07Q13[SQ029] Distinguishes all 0.7979656 *** -0.6536010 *** -1.4515666 6*
G07Q13[SQ030] Distinguishes all 0.5425602 *** -0.6450415 *** -1.1876017 6*
G07Q13[SQ031] Distinguishes f2 only 0.9982279 6* -0.0832330 -1.0814609 6*
G07Q13[SQ032] Distinguishes all 1.3178539 6* 0.4980483 ** -0.8198056 ***
G07Q13[SQ033] Distinguishes all 2.5256544 6* 0.5666335 *** -1.9590209 6*
G07Q13[SQ034] Distinguishes all 2.2919719 6* 0.6393497 *** -1.6526222 6*
G07Q13[SQ035] Distinguishes f1 only 1.4599229 6* 1.4914851 6* 0.0315623

# ----------------------------------------
# Plot
qmethod:::plot.QmethodRes(
  results,
  xlab = "z-scores", ylab = "",                        
  leg.pos = "topright", sort.items = FALSE
) 

# ----------------------------------------

# Order the results by the scores of each factor:
scores <- cbind(results$zsc_n, df_qsort_text)
# for (i in 1:length(results$loa)) {                 # this old code from doi:10.32614/RJ-2014-032 gives warning and additional ordering for 
#   View(                                            # unexistant factor
#     scores[base::order(scores[i], decreasing = TRUE), ],
#     title = paste0("Order for f", i)
#   )
# }

order_f1 <- 
  scores %>%
  select(fsc_f1, item_text) %>%
  arrange(desc(fsc_f1)) 
order_f1 %>% knitr::kable(caption = "Order f1") 
Order f1
fsc_f1 item_text
G07Q13[SQ001] 4 G07Q13[SQ001] 1. Preocuparea autentica pentru binele clientului.
G07Q13[SQ002] 4 G07Q13[SQ002] 2. Acceptarea clientului ca persoana.
G07Q13[SQ003] 3 G07Q13[SQ003] 3. Respectul reciproc (între terapeut <U+0219>i client).
G07Q13[SQ004] 3 G07Q13[SQ004] 4. Lucrul împreuna pe scopurile agreate mutual.
G07Q13[SQ005] 3 G07Q13[SQ005] 5. Acordul între terapeut <U+0219>i client cu privire la ce este important sa lucreze.
G07Q13[SQ006] 2 G07Q13[SQ006] 6. Acordul între terapeut <U+0219>i client cu privire la pa<U+0219>ii necesari pentru a facilita schimbarile dorite.
G07Q13[SQ007] 2 G07Q13[SQ007] 7. În<U+021B>elegerea reciproca a tipurilor de schimbari care pot ajuta clientul.
G07Q13[SQ009] 2 G07Q13[SQ009] 9. Optimismul clientului cu privire la viitor.
G07Q13[SQ033] 2 G07Q13[SQ033] 33. Ventilarea sau descarcarea emo<U+021B>ionala.
G07Q13[SQ008] 1 G07Q13[SQ008] 8. Sentimentul de mul<U+021B>umire de sine al clientului.
G07Q13[SQ010] 1 G07Q13[SQ010] 10. Rezilien<U+021B>a clientului în situa<U+021B>ii de adversitate.
G07Q13[SQ030] 1 G07Q13[SQ030] 30. Experien<U+021B>ele traumatice ale clientului.
G07Q13[SQ034] 1 G07Q13[SQ034] 34. Exprimarea aspectelor dificile, cum ar fi secrete sau alte lucruri care nu au mai fost exprimate anterior.
G07Q13[SQ035] 1 G07Q13[SQ035] 35. Deconstruirea strategiilor sau mecanismelor de evitare <U+0219>i aparare.
G07Q13[SQ011] 0 G07Q13[SQ011] 11. Capacitatea clientului de a-<U+0219>i atinge scopurile.
G07Q13[SQ012] 0 G07Q13[SQ012] 12. Stresul <U+0219>i dificulta<U+021B>ile emo<U+021B>ionale ale clientului.
G07Q13[SQ025] 0 G07Q13[SQ025] 25. Transformarea sensului experien<U+021B>elor clientului.
G07Q13[SQ026] 0 G07Q13[SQ026] 26. Capacitatea de autoreglare emo<U+021B>ionala a clientului.
G07Q13[SQ029] 0 G07Q13[SQ029] 29. Experien<U+021B>ele interpersonale trecute aflate la originea problemelor curente ale clientului.
G07Q13[SQ031] 0 G07Q13[SQ031] 31. Con<U+0219>tientizarea faptului ca manifestari disfunc<U+021B>ionale pot fi generate de mecanisme psihologice adaptive.
G07Q13[SQ032] 0 G07Q13[SQ032] 32. Controlul emo<U+021B>iilor <U+0219>i al gândurilor nedorite.
G07Q13[SQ019] -1 G07Q13[SQ019] 19. Sentimentul de auto-eficacitate <U+0219>i încredere în sine al clientului.
G07Q13[SQ021] -1 G07Q13[SQ021] 21. Nivelul de con<U+0219>tientizare a clientului asupra propriei persoane / propriilor emo<U+021B>ii.
G07Q13[SQ023] -1 G07Q13[SQ023] 23. Procesele de evitare ale clientului.
G07Q13[SQ024] -1 G07Q13[SQ024] 24. Procesele de gândire disfunc<U+021B>ionala (rumina<U+021B>ie, gândirea excesiva/ overthinking, îngrijorare, autocritica, etc.).
G07Q13[SQ027] -1 G07Q13[SQ027] 27. Asertivitatea <U+0219>i capacitatea clientului de a pune limite personale.
G07Q13[SQ016] -2 G07Q13[SQ016] 16. Capacitatea clientului de a stabili rela<U+021B>ii sanatoase, satisfacatoare.
G07Q13[SQ018] -2 G07Q13[SQ018] 18. Dificulta<U+021B>ile de adaptare ale clientului în mediile profesionale sau educa<U+021B>ionale.
G07Q13[SQ020] -2 G07Q13[SQ020] 20. Satisfac<U+021B>ia clientului în activitatea de munca sau înva<U+021B>are.
G07Q13[SQ022] -2 G07Q13[SQ022] 22. Capacitatea de exprimare emo<U+021B>ionala a clientului.
G07Q13[SQ013] -3 G07Q13[SQ013] 13. Acuzele somatice <U+0219>i tulburarile de somn ale clientului.
G07Q13[SQ014] -3 G07Q13[SQ014] 14. Sentimentul de nefericire <U+0219>i lipsa de speran<U+021B>a al clientului.
G07Q13[SQ028] -3 G07Q13[SQ028] 28. Autocompasiunea clientului.
G07Q13[SQ015] -4 G07Q13[SQ015] 15. Sentimentul de singuratate <U+0219>i izolare al clientului.
G07Q13[SQ017] -4 G07Q13[SQ017] 17. Rela<U+021B>iile tensionate su conflictuale cu alte persoane (ale clientului).

order_f2 <- 
  scores %>%
  select(fsc_f2, item_text) %>%
  arrange(desc(fsc_f2)) 
order_f2 %>% knitr::kable(caption = "Order f2") 
Order f2
fsc_f2 item_text
G07Q13[SQ001] 4 G07Q13[SQ001] 1. Preocuparea autentica pentru binele clientului.
G07Q13[SQ002] 4 G07Q13[SQ002] 2. Acceptarea clientului ca persoana.
G07Q13[SQ003] 3 G07Q13[SQ003] 3. Respectul reciproc (între terapeut <U+0219>i client).
G07Q13[SQ004] 3 G07Q13[SQ004] 4. Lucrul împreuna pe scopurile agreate mutual.
G07Q13[SQ005] 3 G07Q13[SQ005] 5. Acordul între terapeut <U+0219>i client cu privire la ce este important sa lucreze.
G07Q13[SQ014] 2 G07Q13[SQ014] 14. Sentimentul de nefericire <U+0219>i lipsa de speran<U+021B>a al clientului.
G07Q13[SQ016] 2 G07Q13[SQ016] 16. Capacitatea clientului de a stabili rela<U+021B>ii sanatoase, satisfacatoare.
G07Q13[SQ026] 2 G07Q13[SQ026] 26. Capacitatea de autoreglare emo<U+021B>ionala a clientului.
G07Q13[SQ028] 2 G07Q13[SQ028] 28. Autocompasiunea clientului.
G07Q13[SQ006] 1 G07Q13[SQ006] 6. Acordul între terapeut <U+0219>i client cu privire la pa<U+0219>ii necesari pentru a facilita schimbarile dorite.
G07Q13[SQ010] 1 G07Q13[SQ010] 10. Rezilien<U+021B>a clientului în situa<U+021B>ii de adversitate.
G07Q13[SQ015] 1 G07Q13[SQ015] 15. Sentimentul de singuratate <U+0219>i izolare al clientului.
G07Q13[SQ021] 1 G07Q13[SQ021] 21. Nivelul de con<U+0219>tientizare a clientului asupra propriei persoane / propriilor emo<U+021B>ii.
G07Q13[SQ025] 1 G07Q13[SQ025] 25. Transformarea sensului experien<U+021B>elor clientului.
G07Q13[SQ007] 0 G07Q13[SQ007] 7. În<U+021B>elegerea reciproca a tipurilor de schimbari care pot ajuta clientul.
G07Q13[SQ008] 0 G07Q13[SQ008] 8. Sentimentul de mul<U+021B>umire de sine al clientului.
G07Q13[SQ009] 0 G07Q13[SQ009] 9. Optimismul clientului cu privire la viitor.
G07Q13[SQ012] 0 G07Q13[SQ012] 12. Stresul <U+0219>i dificulta<U+021B>ile emo<U+021B>ionale ale clientului.
G07Q13[SQ013] 0 G07Q13[SQ013] 13. Acuzele somatice <U+0219>i tulburarile de somn ale clientului.
G07Q13[SQ022] 0 G07Q13[SQ022] 22. Capacitatea de exprimare emo<U+021B>ionala a clientului.
G07Q13[SQ024] 0 G07Q13[SQ024] 24. Procesele de gândire disfunc<U+021B>ionala (rumina<U+021B>ie, gândirea excesiva/ overthinking, îngrijorare, autocritica, etc.).
G07Q13[SQ011] -1 G07Q13[SQ011] 11. Capacitatea clientului de a-<U+0219>i atinge scopurile.
G07Q13[SQ017] -1 G07Q13[SQ017] 17. Rela<U+021B>iile tensionate su conflictuale cu alte persoane (ale clientului).
G07Q13[SQ019] -1 G07Q13[SQ019] 19. Sentimentul de auto-eficacitate <U+0219>i încredere în sine al clientului.
G07Q13[SQ023] -1 G07Q13[SQ023] 23. Procesele de evitare ale clientului.
G07Q13[SQ030] -1 G07Q13[SQ030] 30. Experien<U+021B>ele traumatice ale clientului.
G07Q13[SQ018] -2 G07Q13[SQ018] 18. Dificulta<U+021B>ile de adaptare ale clientului în mediile profesionale sau educa<U+021B>ionale.
G07Q13[SQ027] -2 G07Q13[SQ027] 27. Asertivitatea <U+0219>i capacitatea clientului de a pune limite personale.
G07Q13[SQ029] -2 G07Q13[SQ029] 29. Experien<U+021B>ele interpersonale trecute aflate la originea problemelor curente ale clientului.
G07Q13[SQ035] -2 G07Q13[SQ035] 35. Deconstruirea strategiilor sau mecanismelor de evitare <U+0219>i aparare.
G07Q13[SQ020] -3 G07Q13[SQ020] 20. Satisfac<U+021B>ia clientului în activitatea de munca sau înva<U+021B>are.
G07Q13[SQ031] -3 G07Q13[SQ031] 31. Con<U+0219>tientizarea faptului ca manifestari disfunc<U+021B>ionale pot fi generate de mecanisme psihologice adaptive.
G07Q13[SQ032] -3 G07Q13[SQ032] 32. Controlul emo<U+021B>iilor <U+0219>i al gândurilor nedorite.
G07Q13[SQ033] -4 G07Q13[SQ033] 33. Ventilarea sau descarcarea emo<U+021B>ionala.
G07Q13[SQ034] -4 G07Q13[SQ034] 34. Exprimarea aspectelor dificile, cum ar fi secrete sau alte lucruri care nu au mai fost exprimate anterior.

order_f3 <- 
  scores %>%
  select(fsc_f3, item_text) %>%
  arrange(desc(fsc_f3)) 
order_f3 %>% knitr::kable(caption = "Order f3") 
Order f3
fsc_f3 item_text
G07Q13[SQ001] 4 G07Q13[SQ001] 1. Preocuparea autentica pentru binele clientului.
G07Q13[SQ002] 4 G07Q13[SQ002] 2. Acceptarea clientului ca persoana.
G07Q13[SQ003] 3 G07Q13[SQ003] 3. Respectul reciproc (între terapeut <U+0219>i client).
G07Q13[SQ021] 3 G07Q13[SQ021] 21. Nivelul de con<U+0219>tientizare a clientului asupra propriei persoane / propriilor emo<U+021B>ii.
G07Q13[SQ030] 3 G07Q13[SQ030] 30. Experien<U+021B>ele traumatice ale clientului.
G07Q13[SQ010] 2 G07Q13[SQ010] 10. Rezilien<U+021B>a clientului în situa<U+021B>ii de adversitate.
G07Q13[SQ014] 2 G07Q13[SQ014] 14. Sentimentul de nefericire <U+0219>i lipsa de speran<U+021B>a al clientului.
G07Q13[SQ019] 2 G07Q13[SQ019] 19. Sentimentul de auto-eficacitate <U+0219>i încredere în sine al clientului.
G07Q13[SQ022] 2 G07Q13[SQ022] 22. Capacitatea de exprimare emo<U+021B>ionala a clientului.
G07Q13[SQ013] 1 G07Q13[SQ013] 13. Acuzele somatice <U+0219>i tulburarile de somn ale clientului.
G07Q13[SQ015] 1 G07Q13[SQ015] 15. Sentimentul de singuratate <U+0219>i izolare al clientului.
G07Q13[SQ016] 1 G07Q13[SQ016] 16. Capacitatea clientului de a stabili rela<U+021B>ii sanatoase, satisfacatoare.
G07Q13[SQ027] 1 G07Q13[SQ027] 27. Asertivitatea <U+0219>i capacitatea clientului de a pune limite personale.
G07Q13[SQ029] 1 G07Q13[SQ029] 29. Experien<U+021B>ele interpersonale trecute aflate la originea problemelor curente ale clientului.
G07Q13[SQ008] 0 G07Q13[SQ008] 8. Sentimentul de mul<U+021B>umire de sine al clientului.
G07Q13[SQ011] 0 G07Q13[SQ011] 11. Capacitatea clientului de a-<U+0219>i atinge scopurile.
G07Q13[SQ012] 0 G07Q13[SQ012] 12. Stresul <U+0219>i dificulta<U+021B>ile emo<U+021B>ionale ale clientului.
G07Q13[SQ017] 0 G07Q13[SQ017] 17. Rela<U+021B>iile tensionate su conflictuale cu alte persoane (ale clientului).
G07Q13[SQ026] 0 G07Q13[SQ026] 26. Capacitatea de autoreglare emo<U+021B>ionala a clientului.
G07Q13[SQ031] 0 G07Q13[SQ031] 31. Con<U+0219>tientizarea faptului ca manifestari disfunc<U+021B>ionale pot fi generate de mecanisme psihologice adaptive.
G07Q13[SQ033] 0 G07Q13[SQ033] 33. Ventilarea sau descarcarea emo<U+021B>ionala.
G07Q13[SQ004] -1 G07Q13[SQ004] 4. Lucrul împreuna pe scopurile agreate mutual.
G07Q13[SQ018] -1 G07Q13[SQ018] 18. Dificulta<U+021B>ile de adaptare ale clientului în mediile profesionale sau educa<U+021B>ionale.
G07Q13[SQ025] -1 G07Q13[SQ025] 25. Transformarea sensului experien<U+021B>elor clientului.
G07Q13[SQ032] -1 G07Q13[SQ032] 32. Controlul emo<U+021B>iilor <U+0219>i al gândurilor nedorite.
G07Q13[SQ034] -1 G07Q13[SQ034] 34. Exprimarea aspectelor dificile, cum ar fi secrete sau alte lucruri care nu au mai fost exprimate anterior.
G07Q13[SQ006] -2 G07Q13[SQ006] 6. Acordul între terapeut <U+0219>i client cu privire la pa<U+0219>ii necesari pentru a facilita schimbarile dorite.
G07Q13[SQ009] -2 G07Q13[SQ009] 9. Optimismul clientului cu privire la viitor.
G07Q13[SQ024] -2 G07Q13[SQ024] 24. Procesele de gândire disfunc<U+021B>ionala (rumina<U+021B>ie, gândirea excesiva/ overthinking, îngrijorare, autocritica, etc.).
G07Q13[SQ028] -2 G07Q13[SQ028] 28. Autocompasiunea clientului.
G07Q13[SQ005] -3 G07Q13[SQ005] 5. Acordul între terapeut <U+0219>i client cu privire la ce este important sa lucreze.
G07Q13[SQ023] -3 G07Q13[SQ023] 23. Procesele de evitare ale clientului.
G07Q13[SQ035] -3 G07Q13[SQ035] 35. Deconstruirea strategiilor sau mecanismelor de evitare <U+0219>i aparare.
G07Q13[SQ007] -4 G07Q13[SQ007] 7. În<U+021B>elegerea reciproca a tipurilor de schimbari care pot ajuta clientul.
G07Q13[SQ020] -4 G07Q13[SQ020] 20. Satisfac<U+021B>ia clientului în activitatea de munca sau înva<U+021B>are.

# ----------------------------------------

# Merge flagged/membership back to data

df_recoded2$QSort_mem <- factor(
  (results$flagged %*% (1:ncol(results$flagged))), 
  labels = c(NA_character_, colnames(results$flagged))
)
# cbind(as.data.frame(results$flagged), df_recoded2$QSort_mem) # test -- all fine

6 Analyses

6.1 Descriptives

# "G02Q03" = gen
# "G02Q05" = scoala formare
# "G02Q06" = no cursuri formare
# "G03Q08" = tehnici scoala
# "G03Q10" = ani practica

desc_table <- 
  df_recoded2 %>%
    select(G02Q03, G03Q05, G03Q06, G03Q08, G03Q10, QSort_mem) %>%
    gtsummary::tbl_summary()
gtsummary:::print.gtsummary(desc_table, print_engine = "kable")  
Characteristic N = 62
G02Q03
Feminin 49 (79%)
Masculin 13 (21%)
G03Q05
Cognitiva / comportamentala 17 (27%)
Integrativa 9 (15%)
Psihodinamica 11 (18%)
Umanist experien<U+021B>iala 25 (40%)
G03Q06
1 36 (58%)
2 15 (24%)
3 5 (8.1%)
4 1 (1.6%)
5+ 5 (8.1%)
G03Q08
cognitiva / comportamentala 10 (16%)
eclectica / integrativa 18 (29%)
psihodinamica 13 (21%)
umanist experien<U+021B>iala 21 (34%)
G03Q10
1-2 ani 5 (8.1%)
2-3 ani 6 (9.7%)
3-5 ani 6 (9.7%)
5-10 ani 16 (26%)
mai pu<U+021B>in de 1 an 7 (11%)
peste 10 ani 22 (35%)
QSort_mem
flag_f1 21 (41%)
flag_f2 16 (31%)
flag_f3 14 (27%)

7 QSort mem by school

ggpiestats(  
  data = df_recoded2, 
  x = QSort_mem,
  y = G03Q05,
  type = "np"
)

7.1 IRI

ggbetweenstats(
  data = df_recoded2, 
  x = G03Q05,
  y = IRI_EC,
  type = "np"
)


ggbetweenstats(
  data = df_recoded2, 
  x = G03Q05,
  y = IRI_PT,
  type = "np"              
)


ggbetweenstats(
  data = df_recoded2, 
  x = G03Q05,
  y = IRI_F,
  type = "np"              
)


ggbetweenstats(
  data = df_recoded2, 
  x = G03Q05,
  y = IRI_PD,
  type = "np"              
)

ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = IRI_EC,
  type = "np"
)


ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = IRI_PT,
  type = "np"              
)


ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = IRI_F,
  type = "np"              
)


ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = IRI_PD,
  type = "np"              
)

7.2 UT

ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = UT_QE,
  type = "np"
)


ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = UT_EU,
  type = "np"              
)


ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = UT_PO,
  type = "np"              
)


ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = UT_PS,
  type = "np"              
)


ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = UT_C,
  type = "np"              
)


ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = UT_BI,
  type = "np"              
)


ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = UT_Total,
  type = "np"              
)

grouped_ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = IRI_EC,
  grouping.var = G03Q05,
  type = "np"
)


grouped_ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = IRI_PT,
  grouping.var = G03Q05,
  type = "np"              
)


grouped_ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = IRI_F,
  grouping.var = G03Q05,
  type = "np"              
)


grouped_ggbetweenstats(
  data = df_recoded2, 
  x = QSort_mem,
  y = IRI_PD,
  grouping.var = G03Q05,
  type = "np"              
)


8 Session Info

R version 4.2.2 (2022-10-31 ucrt)
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.1252  LC_CTYPE=Romanian_Romania.1252    LC_MONETARY=Romanian_Romania.1252 LC_NUMERIC=C                     
[5] LC_TIME=Romanian_Romania.1252    

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

other attached packages:
 [1] qmethod_1.8             XML_3.99-0.13           gtsummary_1.7.0         report_0.5.5            scales_1.2.1           
 [6] ggstatsplot_0.11.0.9000 psych_2.2.9             rio_0.5.29              conflicted_1.2.0        fs_1.5.2               
[11] papaja_0.1.1            tinylabels_0.2.3        lubridate_1.9.2         forcats_1.0.0           stringr_1.5.0          
[16] dplyr_1.1.0             purrr_1.0.1             readr_2.1.3             tidyr_1.3.0             tibble_3.1.8           
[21] ggplot2_3.4.1           tidyverse_2.0.0         pacman_0.5.3           

loaded via a namespace (and not attached):
  [1] colorspace_2.0-3       ggsignif_0.6.4         rjson_0.2.21           ellipsis_0.3.2         rprojroot_2.0.3        parameters_0.20.1     
  [7] rstudioapi_0.14        farver_2.1.1           MatrixModels_0.5-1     ggrepel_0.9.3          DT_0.27                bit64_4.0.5           
 [13] fansi_1.0.3            mvtnorm_1.1-3          mnormt_2.1.1           cachem_1.0.6           knitr_1.41             SuppDists_1.1-9.7     
 [19] zeallot_0.1.0          jsonlite_1.8.4         gt_0.8.0               Rmpfr_0.9-0            effectsize_0.8.2       shiny_1.7.4           
 [25] compiler_4.2.2         PMCMRplus_1.9.6        Matrix_1.5-1           fastmap_1.1.0          cli_3.6.0              later_1.3.0           
 [31] htmltools_0.5.4        tools_4.2.2            gmp_0.6-9              coda_0.19-4            gtable_0.3.1           glue_1.6.2            
 [37] Rcpp_1.0.10            cellranger_1.1.0       jquerylib_0.1.4        vctrs_0.5.2            nlme_3.1-160           broom.helpers_1.12.0  
 [43] crosstalk_1.2.0        insight_0.19.0         xfun_0.36              openxlsx_4.2.5.1       timechange_0.2.0       mime_0.12             
 [49] lifecycle_1.0.3        MASS_7.3-58.1          vroom_1.6.0            BayesFactor_0.9.12-4.4 hms_1.1.2              promises_1.2.0.1      
 [55] parallel_4.2.2         rematch2_2.1.2         prismatic_1.1.1        yaml_2.3.6             curl_5.0.0             memoise_2.0.1         
 [61] pbapply_1.7-0          sass_0.4.4             stringi_1.7.12         paletteer_1.5.0        highr_0.10             bayestestR_0.13.0     
 [67] boot_1.3-28.1          zip_2.2.2              rlang_1.0.6            pkgconfig_2.0.3        commonmark_1.8.1       evaluate_0.20         
 [73] lattice_0.20-45        labeling_0.4.2         patchwork_1.1.2        htmlwidgets_1.6.1      bit_4.0.5              tidyselect_1.2.0      
 [79] here_1.0.1             magrittr_2.0.3         R6_2.5.1               multcompView_0.1-8     generics_0.1.3         BWStest_0.2.2         
 [85] pillar_1.8.1           haven_2.5.1            foreign_0.8-83         withr_2.5.0            datawizard_0.6.5       performance_0.10.2    
 [91] crayon_1.5.2           utf8_1.2.2             correlation_0.8.3      tzdb_0.3.0             rmarkdown_2.19         kSamples_1.2-9        
 [97] grid_4.2.2             readxl_1.4.1           data.table_1.14.6      digest_0.6.31          xtable_1.8-4           httpuv_1.6.8          
[103] GPArotation_2022.10-2  statsExpressions_1.4.0 munsell_0.5.0          bslib_0.4.2           
 

A work by Claudiu Papasteri

 

LS0tDQp0aXRsZTogIjxicj4gUU1ldCB0aGVyYXBpc3RzIHN0dWR5IiANCnN1YnRpdGxlOiAiSW5pdGlhbCBBbmFseXNpcyINCmF1dGhvcjogIjxicj4gQ2xhdWRpdSBQYXBhc3RlcmkiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlbSAlWScpYCINCm91dHB1dDogDQogICAgaHRtbF9ub3RlYm9vazoNCiAgICAgICAgICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgICAgICAgICAgdG9jOiB0cnVlDQogICAgICAgICAgICB0b2NfZGVwdGg6IDINCiAgICAgICAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgICAgICAgICAgdGhlbWU6IHNwYWNlbGFiDQogICAgICAgICAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgICAgICAgICBmb250LWZhbWlseTogQXJpYWwNCiAgICAgICAgICAgIGZpZ193aWR0aDogMTANCiAgICAgICAgICAgIGZpZ19oZWlnaHQ6IDkNCiAgICAjIHBkZl9kb2N1bWVudDogDQogICAgICAgICAgICAjIHRvYzogdHJ1ZQ0KICAgICAgICAgICAgIyB0b2NfZGVwdGg6IDINCiAgICAgICAgICAgICMgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgICAgICAgICAjIGZvbnRzaXplOiAxMXB0DQogICAgICAgICAgICAjIGdlb21ldHJ5OiBtYXJnaW49MWluDQogICAgICAgICAgICAjIGZpZ193aWR0aDogNw0KICAgICAgICAgICAgIyBmaWdfaGVpZ2h0OiA2DQogICAgICAgICAgICAjIGZpZ19jYXB0aW9uOiB0cnVlDQogICAgIyBnaXRodWJfZG9jdW1lbnQ6IA0KICAgICAgICAgICAgIyB0b2M6IHRydWUNCiAgICAgICAgICAgICMgdG9jX2RlcHRoOiAyDQogICAgICAgICAgICAjIGh0bWxfcHJldmlldzogZmFsc2UNCiAgICAgICAgICAgICMgZmlnX3dpZHRoOiA1DQogICAgICAgICAgICAjIGZpZ19oZWlnaHQ6IDUNCiAgICAgICAgICAgICMgZGV2OiBqcGVnDQotLS0NCg0KDQo8IS0tIFNldHVwIC0tPg0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBHZW5lcmFsIFIgb3B0aW9ucw0Kc2V0LnNlZWQoMTExKSAgICAgICAgICAgICAgICMgaW4gY2FzZSB3ZSB1c2UgcmFuZG9taXplZCBwcm9jZWR1cmVzICAgICAgIA0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICAgICAgICMgcG9zaXRpdmUgdmFsdWVzIGJpYXMgdG93YXJkcyBmaXhlZCBhbmQgbmVnYXRpdmUgdG93YXJkcyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHJlcG9zID0gYyhnZXRPcHRpb24oInJlcG9zIilbIkNSQU4iXSwgQ1JBTmV4dHJhID0gImh0dHBzOi8vbWlycm9yLmNsaWVudHZwcy5jb20vQ1JBTi8iKSkgICMgdXNlIENSQU4gYXMgZGVmYXVsdCwgc2V0IENSQU5leHRyYSB0byBOw7xybmJlcmcgbWlycm9yDQoNCmlmICghcmVxdWlyZSgicGFjbWFuIikpIGluc3RhbGwucGFja2FnZXMoInBhY21hbiIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KcGFja2FnZXMgPC0gYygNCiAgInBhcGFqYSIsDQogICJoZXJlIiwgImZzIiwNCiAgImNvbmZsaWN0ZWQiLA0KICAicmlvIiwNCiAgInBzeWNoIiwgICAgICAgICAgDQogICJnZ3N0YXRzcGxvdCIsDQogICJnZ3Bsb3QyIiwgInNjYWxlcyIsDQogICJyZXBvcnQiLA0KICAiZ3RzdW1tYXJ5IiwNCiAgIlhNTCIsDQogICJxbWV0aG9kIg0KICAjICwgLi4uDQopDQpwYWNtYW46OnBfbG9hZChjaGFyID0gcGFja2FnZXMsIHVwZGF0ZSA9IEZBTFNFKQ0KDQojIFNldCBoZXJlIHRvIFJub3RlYm9vayBkaXJlY3RvcnkNCmhlcmU6OnNldF9oZXJlKCkNCnVubG9hZE5hbWVzcGFjZSgiaGVyZSIpICAgICAgICAgICAgICAgICAgICMgbmVlZCBuZXcgUiBzZXNzaW9uIG9yIHVubG9hZCBuYW1lc3BhY2UgZm9yIC5oZXJlIGZpbGUgdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgLlJwcm9qDQpub3RlYm9va19uYW1lIDwtIGZzOjpwYXRoX2ZpbGUoaGVyZTo6aGVyZSgpKQ0KDQojIFNvbHZlIGNvbmZsaWN0cyBpbiBmYXZvciBvZiB0aWR5dmVyc2UNCmNvbmZsaWN0ZWQ6OmNvbmZsaWN0X3ByZWZlcigiZmlsdGVyIiwgd2lubmVyID0gImRwbHlyIikNCmNvbmZsaWN0ZWQ6OmNvbmZsaWN0X3ByZWZlcigic2VsZWN0Iiwgd2lubmVyID0gImRwbHlyIikNCmNvbmZsaWN0ZWQ6OmNvbmZsaWN0X3ByZWZlcigic2xpY2UiLCB3aW5uZXIgPSAiZHBseXIiKQ0KY29uZmxpY3RlZDo6Y29uZmxpY3RfcHJlZmVyKCJyZW5hbWUiLCB3aW5uZXIgPSAiZHBseXIiKQ0KY29uZmxpY3RlZDo6Y29uZmxpY3RfcHJlZmVyKCJjb3VudCIsIHdpbm5lciA9ICJkcGx5ciIpDQpjb25mbGljdGVkOjpjb25mbGljdF9wcmVmZXIoInJlY29kZSIsIHdpbm5lciA9ICJkcGx5ciIpDQpjb25mbGljdGVkOjpjb25mbGljdF9wcmVmZXIoImZpbGwiLCB3aW5uZXIgPSAidGlkeXIiKQ0KDQojIFNldCBraW50ciBvcHRpb25zIGluY2x1ZGluZyByb290LmRpciBwb2ludGluZyB0byB0aGUgLmhlcmUgZmlsZSBpbiBSbm90ZWJvb2sgZGlyZWN0b3J5DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIHJvb3QuZGlyID0gaGVyZTo6aGVyZSgpLA0KICAjZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDEvMywgDQogIGNvbW1lbnQgPSAiIyIsDQogIGNvbGxhcHNlID0gVFJVRSwNCiAgZWNobyA9IFRSVUUsIHdhcm5pbmcgPSBUUlVFLCBtZXNzYWdlID0gVFJVRSwgY2FjaGUgPSBUUlVFICAgICAgICMgZWNobyA9IEZhbHNlIGZvciBnaXRodWJfZG9jdW1lbnQsIGJ1dCB3aWxsIGJlIGZvbGRlZCBpbiBodG1sX25vdGVib29rDQopDQoNCiMgVGhlbWVzIGZvciBnZ3Bsb3QyIHBsb3R0aW5nIChoZXJlIHVzZWQgQVBBIHN0eWxlKQ0KdGhlbWVfc2V0KHBhcGFqYTo6dGhlbWVfYXBhKCkpDQpgYGANCg0KDQoNCg0KDQo8IS0tIEZ1bmN0aW9ucyAtLT4NCg0KIyBEZWZpbmUgZnVuY3Rpb25zDQoNCmBgYHtyfQ0KIyMgRGVmaW5lIGZ1bmN0aW9uIHRoYXQgcmVjb2RlcyB0byBudW1lcmljLCBidXQgd2F0Y2hlcyBvdXQgdG8gY29lcmNpb24gdG8gbm90IGludHJvZHVjZSBOQXMNCmNvbHN0b251bWVyaWMgPC0gZnVuY3Rpb24oZGYpew0KICB0cnlDYXRjaCh7DQogICAgZGZfbnVtIDwtIGFzLmRhdGEuZnJhbWUoDQogICAgICBsYXBwbHkoZGYsDQogICAgICAgICAgICAgZnVuY3Rpb24oeCkgeyBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih4KSl9KSkgDQogIH0sd2FybmluZyA9IGZ1bmN0aW9uKHN0b3Bfb25fd2FybmluZykgew0KICAgIG1lc3NhZ2UoIlN0b3BlZCB0aGUgZXhlY3V0aW9uIG9mIG51bWVyaWMgY29udmVyc2lvbjogIiwgY29uZGl0aW9uTWVzc2FnZShzdG9wX29uX3dhcm5pbmcpKQ0KICB9KSANCn0NCiMjDQojIyBEZWZpbmUgZnVuY3Rpb24gdGhhdCByZXZlcnNlIGNvZGVzIGl0ZW1zDQpSZXZlcnNlQ29kZSA8LSBmdW5jdGlvbihkZiwgdG9udW1lcmljID0gRkFMU0UsIG1pbiA9IE5VTEwsIG1heCA9IE5VTEwpIHsNCiAgaWYodG9udW1lcmljKSBkZiA8LSBjb2xzdG9udW1lcmljKGRmKQ0KICBkZiA8LSAobWF4ICsgbWluKSAtIGRmDQp9DQojIw0KIyMgRGVmaW5lIGZ1bmN0aW9uIHRoYXQgc2NvcmVzIG9ubHkgcm93cyB3aXRoIGxlc3MgdGhhbiAxMCUgTkFzIChyZXR1cm5zIE5BIGlmIGFsbCBvciBhYm92ZSB0aHJlc2hvbGQgcGVyY2VudGFnZSBvZiByb3dzIGFyZSBOQSk7IGNhbiByZXZlcnNlIGNvZGUgaWYgdmVjdG9yIG9mIGNvbHVtbiBpbmRleGVzIGFuZCBtaW4sIG1heCBhcmUgcHJvdmlkZWQuDQpTY29yZUxpa2VydCA8LSBmdW5jdGlvbihkZiwgbmFwZXJjZW50ID0gLjEsIHRvbnVtZXJpYyA9IEZBTFNFLCByZXZlcnNlY29scyA9IE5VTEwsIG1pbiA9IE5VTEwsIG1heCA9IE5VTEwsIGVuZ2luZSA9ICJzdW0iKSB7DQogIHJldmVyc2VfbGlzdCA8LSBsaXN0KHJldmVyc2Vjb2xzID0gcmV2ZXJzZWNvbHMsIG1pbiA9IG1pbiwgbWF4ID0gbWF4KQ0KICByZXZlcnNlX2NoZWNrIDwtICFzYXBwbHkocmV2ZXJzZV9saXN0LCBpcy5udWxsKQ0KICANCiAgIyBSZWNvZGUgdG8gbnVtZXJpYywgYnV0IHdhdGNoIG91dCB0byBjb2VyY2lvbiB0byBub3QgaW50cm9kdWNlIE5Bcw0KICBjb2xzdG9udW1lcmljIDwtIGZ1bmN0aW9uKGRmKXsNCiAgICB0cnlDYXRjaCh7DQogICAgICBkZl9udW0gPC0gYXMuZGF0YS5mcmFtZSgNCiAgICAgICAgbGFwcGx5KGRmLA0KICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgeyBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih4KSl9KSkgDQogICAgfSx3YXJuaW5nID0gZnVuY3Rpb24oc3RvcF9vbl93YXJuaW5nKSB7DQogICAgICBtZXNzYWdlKCJTdG9wZWQgdGhlIGV4ZWN1dGlvbiBvZiBudW1lcmljIGNvbnZlcnNpb246ICIsIGNvbmRpdGlvbk1lc3NhZ2Uoc3RvcF9vbl93YXJuaW5nKSkNCiAgICB9KSANCiAgfQ0KICANCiAgaWYodG9udW1lcmljKSBkZiA8LSBjb2xzdG9udW1lcmljKGRmKQ0KICANCiAgaWYoYWxsKHJldmVyc2VfY2hlY2spKXsNCiAgICBkZlsgLHJldmVyc2Vjb2xzXSA8LSAobWF4ICsgbWluKSAtIGRmWyAscmV2ZXJzZWNvbHNdDQogIH1lbHNlIGlmKGFueShyZXZlcnNlX2NoZWNrKSl7DQogICAgc3RvcCgiSW5zdWZpY2llbnQgaW5mbyBmb3IgcmV2ZXJzaW5nLiBQbGVhc2UgcHJvdmlkZTogIiwgcGFzdGUobmFtZXMocmV2ZXJzZV9saXN0KVshcmV2ZXJzZV9jaGVja10sIGNvbGxhcHNlID0gIiwgIikpDQogIH0NCiAgDQogIGlmKGVuZ2luZSA9PSAic3VtIikgew0KICAgIHJldHVybigNCiAgICAgIGlmZWxzZShyb3dTdW1zKGlzLm5hKGRmKSkgPiBuY29sKGRmKSAqIG5hcGVyY2VudCwNCiAgICAgICAgICAgICBOQSwNCiAgICAgICAgICAgICByb3dTdW1zKGRmLCBuYS5ybSA9IFRSVUUpICogTkEgXiAocm93U3VtcyghaXMubmEoZGYpKSA9PSAwKQ0KICAgICAgKQ0KICAgICkgIA0KICB9DQogIA0KICBpZihlbmdpbmUgPT0gIm1lYW4iKSB7DQogICAgcmV0dXJuKA0KICAgICAgaWZlbHNlKHJvd01lYW5zKGlzLm5hKGRmKSkgPiBuY29sKGRmKSAqIG5hcGVyY2VudCwNCiAgICAgICAgICAgICBOQSwNCiAgICAgICAgICAgICByb3dNZWFucyhkZiwgbmEucm0gPSBUUlVFKSAqIE5BIF4gKHJvd1N1bXMoIWlzLm5hKGRmKSkgPT0gMCkNCiAgICAgICkgICAgICAgDQogICAgKQ0KICB9DQogIA0KICAgIGlmKGVuZ2luZSA9PSAibWVhbl9uYSIpIHsNCiAgICAgIGRmW2lzLm5hKGRmKV0gPC0gMA0KICAgICAgcm93TWVhbnMoZGYpDQogICAgfQ0KfQ0KYGBgDQoNCg0KDQo8IS0tIFJlcG9ydCAtLT4NCg0KIyBSZWFkIHN1cnZleSBzdHJ1Y3R1cmUNCg0KYGBge3J9DQojIExpbWVTdXJ2ZXkgZXhwb3J0IHN1cnZleSBhcyAudHh0ICgueG1sIGlzIGdvb2QgdG9vLCBidXQgZWFzaWVyIHRvIHdvcmsgd2l0aCAudHh0KQ0Kc3VydmV5X2RmIDwtIHJlYWRyOjpyZWFkX2RlbGltKCJsaW1lc3VydmV5X3N1cnZleV8xOTI0ODUudHh0IiwgZGVsaW0gPSAnXHQnKQ0Kc3VydmV5X2RmIDwtIA0KICBzdXJ2ZXlfZGYgJT4lDQogIHNlbGVjdF9pZih+ICFhbGwoaXMubmEoLikpKQ0KDQpzdXJ2ZXlfY29kZXRleHQgPC0NCiAgc3VydmV5X2RmICU+JQ0KICBzZWxlY3QobmFtZSwgdGV4dCkgJT4lDQogIHNsaWNlKA0KICAgIHNlcSgNCiAgICAgIGZyb20gPSBtaW4od2hpY2goc3RyX2RldGVjdChuYW1lLCAibnQgSW5mb3JtYXQiKSkpLA0KICAgICAgdG8gPSBucm93KC4pDQogICkpICU+JQ0KICBtdXRhdGUocm93X25vID0gcm93X251bWJlcigpKSAlPiUNCiAgcmVsb2NhdGUocm93X25vKQ0KDQpEVDo6ZGF0YXRhYmxlKA0KICBzdXJ2ZXlfY29kZXRleHRbMzpucm93KHN1cnZleV9jb2RldGV4dCksXSwNCiAgZXh0ZW5zaW9ucyA9ICJCdXR0b25zIiwNCiAgZmlsbENvbnRhaW5lciA9IFRSVUUsDQogIHJvd25hbWVzID0gRkFMU0UsDQogIHNlbGVjdGlvbiA9ICJtdWx0aXBsZSIsDQogICMgc3R5bGUgPSAiYm9vdHN0cmFwIiwgDQogICMgY2xhc3MgPSAiY29tcGFjdCIsICN3aWR0aCA9ICIxMDAwcHgiLA0KICBvcHRpb25zID0gbGlzdCgNCiAgICAjYXV0b3dpZHRoID0gVFJVRSwNCiAgICBkZWZlclJlbmRlciA9IEZBTFNFLA0KICAgIHBhZ2VMZW5ndGggPSAzMCwNCiAgICBzY3JvbGxYID0gIjEwMHB4IiwNCiAgICAjIHNjcm9sbFkgPSAiNDAwcHgiDQogICAgZG9tID0gIkJmcnRpcCIsDQogICAgYnV0dG9ucyA9IGMoImV4Y2VsIiwgImNzdiIpDQogICkNCikNCmBgYA0KDQojIEl0ZW0gY29kaW5nIGJhc2VkIG9uIHN1cnZleSBzdHJ1Y3R1cmUNCg0KYGBge3J9DQppdGVtX2NvZGV0ZXh0IDwtDQogIHN1cnZleV9jb2RldGV4dCAlPiUNCiAgc2xpY2UoDQogICAgc2VxKA0KICAgICAgZnJvbSA9IHdoaWNoKHN0cl9kZXRlY3QobmFtZSwgIkRlbW9ncmFmaWNlIikpICsgMSwNCiAgICAgIHRvID0gbnJvdyguKQ0KICApKSAlPiUNCiAgbXV0YXRlKA0KICAgIGNsZWFuX3RleHQgPSBzdHJfcmVtb3ZlX2FsbCh0ZXh0LCAiPC4qPz4iKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBIVE1MIHRhZ3MNCiAgICBpc19xdWVzdGlvbiA9IHN0cl9kZXRlY3QobmFtZSwgIl5HMC4qIiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFnIHF1ZXN0aW9ucw0KICAgIGlzX3N1YnF1ZXN0aW9uID0gc3RyX2RldGVjdChuYW1lLCAiXlNRLioiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0YWcgc3VicXVlc3Rpb25zDQogICAgaXNfYW5zd2VyID0gc3RyX2RldGVjdChuYW1lLCAiXkFPLioiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhZyBhbnN3ZXIgZGVmaW5pdGlvbnMNCiAgICBxdWVzdF9ubyA9IGN1bXN1bShpc19xdWVzdGlvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBudW1iZXIgYWxsIHF1ZXN0aW9ucw0KICAgIHF1ZXN0aW9uID0gaWZfZWxzZShpc19xdWVzdGlvbiwgbmFtZSwgTkFfY2hhcmFjdGVyXyksICAgICAgICAgICAgICAgICAjIGdldCBxdWVzdGlvbiBjb2Rlcw0KICAgIHN1YnF1ZXN0aW9uID0gaWZfZWxzZShpc19zdWJxdWVzdGlvbiwgbmFtZSwgTkFfY2hhcmFjdGVyXyksICAgICAgICAgICAjIGdldCBzdWJxdWVzdGlvbiBjb2Rlcw0KICAgIHF1ZXN0aW9uX3RleHQgPSBpZl9lbHNlKGlzX3F1ZXN0aW9uLCBjbGVhbl90ZXh0LCBOQV9jaGFyYWN0ZXJfKSwgICAgICAgICAgICAgICAgICMgZ2V0IHF1ZXN0aW9uIHRleHRzDQogICAgc3VicXVlc3Rpb25fdGV4dCA9IGlmX2Vsc2UoaXNfc3VicXVlc3Rpb24sIGNsZWFuX3RleHQsIE5BX2NoYXJhY3Rlcl8pLCAgICAgICAgICAgIyBnZXQgc3VicXVlc3Rpb24gdGV4dHMNCiAgICBhbnN3ZXIgPSANCiAgICAgIGlmX2Vsc2UoaXNfYW5zd2VyLCANCiAgICAgICAgcGFzdGUwKCJcIiIsIG5hbWUsICJcIiIsICIgPSAiLCAiXCIiLCBjbGVhbl90ZXh0LCAiXCIiKSwgDQogICAgICAgIE5BX2NoYXJhY3Rlcl8NCiAgICAgICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXN0ZSBkZWZpbml0aW9uIG9mIGVhY2ggYW5zd2VyDQogICkgJT4lDQogIGZpbGwocXVlc3Rpb24sIC5kaXJlY3Rpb24gPSAiZG93biIpICU+JSAgICAgICAgICAgICAgICAgICAjIGZpbGwgd2l0aCBzYW1lIHF1ZXN0aW9uLCBpdCBhcHBpZXMgZm9yIHN1YnF1ZXN0aW9ucyBhbmQgYW5zd2Vycw0KICBmaWx0ZXIoaXNfcXVlc3Rpb24gfCBpc19zdWJxdWVzdGlvbiB8IGlzX2Fuc3dlcikgICAgICAgICAgICAgICAgICAgICAgICAjIGRyb3Agc2VjdGlvbnMgYW5kIG90aGVyIHVzZWxlc3MgaW5mbw0KDQojIEZ1bGwgaW5mbyBvbiBpdGVtcyBhcyBsaXN0LWNvbHVtbnMgZGF0YWZyYW1lDQppdGVtX2luZm8gPC0NCiAgaXRlbV9jb2RldGV4dCAlPiUNCiAgc2VsZWN0KHF1ZXN0aW9uLCBzdWJxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgc3VicXVlc3Rpb25fdGV4dCwgYW5zd2VyKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtcXVlc3Rpb24sIHZhbHVlc19kcm9wX25hID0gVFJVRSkgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBuYW1lLCB2YWx1ZXNfZnJvbSA9IHZhbHVlLCB2YWx1ZXNfZm4gPSBsaXN0KQ0KDQoNCiMgTWVhbnQgdG8gYmUgdXNlZCBhczogDQojIGRlZiA8LSBjKCJmb28iID0gImJhciIsICJ6YXIiID0gImZhciIpDQojIGRwbHlyOjpyZWNvZGUoYXMuY2hhcmFjdGVyKGNvbCksICEhIWRlZikNCiMgZS5nLiBpdGVtX2RlZiRhbnN3ZXJbaXRlbV9kZWYkcXVlc3Rpb24gPT0gIkcwMlEwMyJdDQojICAgICAgZXZhbChwYXJzZSh0ZXh0ID0gaXRlbV9kZWYkYW5zd2VyW2l0ZW1fZGVmJHF1ZXN0aW9uID09ICJHMDJRMDMiXSkpDQoNCml0ZW1fZGVmIDwtDQogIGl0ZW1fY29kZXRleHQgJT4lDQogIGZpbHRlcihpc19hbnN3ZXIpICU+JQ0KICBzZWxlY3QocXVlc3Rpb24sIGFuc3dlcikgJT4lDQogIGdyb3VwX2J5KHF1ZXN0aW9uKSAlPiUNCiAgbXV0YXRlKGFuc3dlciA9IHBhc3RlMChhbnN3ZXIsIGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBhbnN3ZXIgPSBwYXN0ZTAoImMoIiwgYW5zd2VyLCAiKSIpKSAlPiUNCiAgZGlzdGluY3QoKQ0KDQojZS5nLiBvbiBob3cgdG8gdXNlIGl0ZW1fZGVmDQojIHRlc3RfZGYgPC0gDQojICAgZGYgJT4lDQojICAgbXV0YXRlKA0KIyAgICAgYWNyb3NzKA0KIyAgICAgICAuY29scyA9IHN0YXJ0c193aXRoKCJHMDJRMDMiKSwNCiMgICAgICAgLmZucyA9IH5yZWNvZGUoLiwgISEhZXZhbChwYXJzZSh0ZXh0ID0gaXRlbV9kZWYkYW5zd2VyW2l0ZW1fZGVmJHF1ZXN0aW9uID09ICJHMDJRMDMiXSkpKSAgICAgDQojICAgICApDQojICAgKSAgDQoNCkRUOjpkYXRhdGFibGUoDQogIGl0ZW1fZGVmLA0KICBleHRlbnNpb25zID0gIkJ1dHRvbnMiLA0KICBmaWxsQ29udGFpbmVyID0gVFJVRSwNCiAgcm93bmFtZXMgPSBGQUxTRSwNCiAgc2VsZWN0aW9uID0gIm11bHRpcGxlIiwNCiAgIyBzdHlsZSA9ICJib290c3RyYXAiLCANCiAgIyBjbGFzcyA9ICJjb21wYWN0IiwgI3dpZHRoID0gIjEwMDBweCIsDQogIG9wdGlvbnMgPSBsaXN0KA0KICAgICNhdXRvd2lkdGggPSBUUlVFLA0KICAgIGRlZmVyUmVuZGVyID0gRkFMU0UsDQogICAgcGFnZUxlbmd0aCA9IDE1LA0KICAgIHNjcm9sbFggPSAiMTAwcHgiLA0KICAgICMgc2Nyb2xsWSA9ICI0MDBweCINCiAgICBkb20gPSAiQmZydGlwIiwNCiAgICBidXR0b25zID0gYygiZXhjZWwiLCAiY3N2IikNCiAgKQ0KKQ0KYGBgDQoNCiMgUmVhZCBkYXRhICYgdHJhbnNmb3JtDQoNCmBgYHtyfQ0KZGYgPC0gcmVhZHI6OnJlYWRfY3N2KCJzdXJ2ZXlfMTkyNDg1X1JfZGF0YV9maWxlLmNzdiIpDQoNCiMgdGVzdF9kZiA8LSANCiMgICBtYXBfZGZjKA0KIyAgICAgaXRlbV9kZWYkcXVlc3Rpb24sDQojICAgICBcKHgpIHsNCiMgICAgICAgbWFwKA0KIyAgICAgICAgIGRmICU+JQ0KIyAgICAgICAgICAgc2VsZWN0KGNvbnRhaW5zKHgpKSwNCiMgICAgICAgICBcKHkpIHJlY29kZSh5LCAhISFldmFsKHBhcnNlKHRleHQgPSBpdGVtX2RlZiRhbnN3ZXJbc3RyX2RldGVjdChpdGVtX2RlZiRxdWVzdGlvbiwgeCldKSkpDQojICAgICAgICkNCiMgICAgIH0NCiMgICApDQoNCiMgTmVlZCB0byBmaW5kIGEgd2F5IHRvIGl0ZXJhdGUgdGhpcyB3aXRoIHB1cnJyDQpkZl9yZWNvZGVkIDwtDQogIGRmICU+JQ0KICBtdXRhdGUoDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChpdGVtX2RlZiRxdWVzdGlvblsxXSksDQogICAgICAuZm5zID0gfnJlY29kZSguLCAhISFldmFsKHBhcnNlKHRleHQgPSBpdGVtX2RlZiRhbnN3ZXJbc3RyX2RldGVjdChpdGVtX2RlZiRxdWVzdGlvbiwgaXRlbV9kZWYkcXVlc3Rpb25bMV0pXSkpKQ0KICAgICksDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChpdGVtX2RlZiRxdWVzdGlvblsyXSksDQogICAgICAuZm5zID0gfnJlY29kZSguLCAhISFldmFsKHBhcnNlKHRleHQgPSBpdGVtX2RlZiRhbnN3ZXJbc3RyX2RldGVjdChpdGVtX2RlZiRxdWVzdGlvbiwgaXRlbV9kZWYkcXVlc3Rpb25bMl0pXSkpKQ0KICAgICksDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChpdGVtX2RlZiRxdWVzdGlvblszXSksDQogICAgICAuZm5zID0gfnJlY29kZSguLCAhISFldmFsKHBhcnNlKHRleHQgPSBpdGVtX2RlZiRhbnN3ZXJbc3RyX2RldGVjdChpdGVtX2RlZiRxdWVzdGlvbiwgaXRlbV9kZWYkcXVlc3Rpb25bM10pXSkpKQ0KICAgICksDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChpdGVtX2RlZiRxdWVzdGlvbls0XSksDQogICAgICAuZm5zID0gfnJlY29kZSguLCAhISFldmFsKHBhcnNlKHRleHQgPSBpdGVtX2RlZiRhbnN3ZXJbc3RyX2RldGVjdChpdGVtX2RlZiRxdWVzdGlvbiwgaXRlbV9kZWYkcXVlc3Rpb25bNF0pXSkpKQ0KICAgICksDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChpdGVtX2RlZiRxdWVzdGlvbls1XSksDQogICAgICAuZm5zID0gfnJlY29kZSguLCAhISFldmFsKHBhcnNlKHRleHQgPSBpdGVtX2RlZiRhbnN3ZXJbc3RyX2RldGVjdChpdGVtX2RlZiRxdWVzdGlvbiwgaXRlbV9kZWYkcXVlc3Rpb25bNV0pXSkpKQ0KICAgICksDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChpdGVtX2RlZiRxdWVzdGlvbls2XSksDQogICAgICAuZm5zID0gfnJlY29kZSguLCAhISFldmFsKHBhcnNlKHRleHQgPSBpdGVtX2RlZiRhbnN3ZXJbc3RyX2RldGVjdChpdGVtX2RlZiRxdWVzdGlvbiwgaXRlbV9kZWYkcXVlc3Rpb25bNl0pXSkpKQ0KICAgICksDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChpdGVtX2RlZiRxdWVzdGlvbls3XSksDQogICAgICAuZm5zID0gfnJlY29kZSguLCAhISFldmFsKHBhcnNlKHRleHQgPSBpdGVtX2RlZiRhbnN3ZXJbc3RyX2RldGVjdChpdGVtX2RlZiRxdWVzdGlvbiwgaXRlbV9kZWYkcXVlc3Rpb25bN10pXSkpKQ0KICAgICksDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChpdGVtX2RlZiRxdWVzdGlvbls4XSksDQogICAgICAuZm5zID0gfnJlY29kZSguLCAhISFldmFsKHBhcnNlKHRleHQgPSBpdGVtX2RlZiRhbnN3ZXJbc3RyX2RldGVjdChpdGVtX2RlZiRxdWVzdGlvbiwgaXRlbV9kZWYkcXVlc3Rpb25bOF0pXSkpKQ0KICAgICksDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChpdGVtX2RlZiRxdWVzdGlvbls5XSksDQogICAgICAuZm5zID0gfnJlY29kZSguLCAhISFldmFsKHBhcnNlKHRleHQgPSBpdGVtX2RlZiRhbnN3ZXJbc3RyX2RldGVjdChpdGVtX2RlZiRxdWVzdGlvbiwgaXRlbV9kZWYkcXVlc3Rpb25bOV0pXSkpKQ0KICAgICksDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChpdGVtX2RlZiRxdWVzdGlvblsxMF0pLA0KICAgICAgLmZucyA9IH5yZWNvZGUoLiwgISEhZXZhbChwYXJzZSh0ZXh0ID0gaXRlbV9kZWYkYW5zd2VyW3N0cl9kZXRlY3QoaXRlbV9kZWYkcXVlc3Rpb24sIGl0ZW1fZGVmJHF1ZXN0aW9uWzEwXSldKSkpDQogICAgKQ0KICApDQoNCiMgVG8gbnVtZXJpYyBhbmQgcmVzY2FsZSBxdWVzdGlvbm5haXJlIGl0ZW1zIA0KIyBmb3IgbnVtZXJpYyBleHRyYWN0aW9uOiBzdHJfZXh0cmFjdCh4LCAiWzAtOV0iKSAgICMgIlswLTldKyIgZm9yIG1vcmUgZGlnaXRzLCBidXQgTGlrZXIgc2NhbGVzIGhhdmUgb25seSAxIGRpZ2l0DQojIFs4XSAgPSBHMDRRMTAgPSBSZWFjdGl2IFsxLCA3XQ0KIyBbOV0gID0gRzA1UTExID0gRW1wYXRoIFswLCA0XQ0KIyBbMTBdID0gRzA2UTEyID0gT25saW5lX1RlcmFwIFsxLCA1XQ0KIyAgICAgICAgRzA3UTEzID0gUVNvcnQgKGlzIGFscmVhZHkgbnVtZXJpYywgYnV0IG5lZWRzIHRvIGJlIG9uIHNjYWxlIFstNCwgKzRdKQ0KDQpkZl9yZWNvZGVkMiA8LQ0KICBkZl9yZWNvZGVkICU+JQ0KICBtdXRhdGUoDQogICAgYWNyb3NzKA0KICAgICAgLmNvbHMgPSBzdGFydHNfd2l0aChjKCJHMDRRMTAiLCAiRzA1UTExIiwgIkcwNlExMiIpKSwNCiAgICAgIC5mbnMgPSB+YXMubnVtZXJpYyhzdHJfZXh0cmFjdCguLCAiWzAtOV0iKSkgICAgICMgZ2V0IG9ubHkgZGlnaXRzIGFuZCB0byBudW1lcmljDQogICAgKSwNCiAgICBhY3Jvc3MoDQogICAgICAuY29scyA9IHN0YXJ0c193aXRoKCJHMDdRMTMiKSwNCiAgICAgIC5mbnMgPSB+KCguLTUpKigtMSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0byBbLTQsICs0XSwgd2hlcmUgMT0rNCwgOT0tNA0KICAgICkNCiAgKQ0KIyBjaGVjayAtIGV2ZXJ5dGhpbmcgZmluZQ0KIyBkZl9yZWNvZGVkMiAlPiUgc2VsZWN0KHN0YXJ0c193aXRoKCJHMDRRMTAiKSkgJT4lIHN1bW1hcnkoKQ0KIyBkZl9yZWNvZGVkMiAlPiUgc2VsZWN0KHN0YXJ0c193aXRoKCJHMDVRMTEiKSkgJT4lIHN1bW1hcnkoKQ0KIyBkZl9yZWNvZGVkMiAlPiUgc2VsZWN0KHN0YXJ0c193aXRoKCJHMDZRMTIiKSkgJT4lIHN1bW1hcnkoKQ0KIyBkZl9yZWNvZGVkMiAlPiUgc2VsZWN0KHN0YXJ0c193aXRoKCJHMDdRMTMiKSkgJT4lIHN1bW1hcnkoKQ0KDQpgYGANCg0KIyMgU2NvcmluZyBJUkkNCg0KYGBge3J9DQojIyBJUkkNCiMgU2NhbGVzIHdpdGggcmV2ZXJzZWQgYygzLDQsNywxMiwxMywxNCwxNSwxOCwxOSkgICAgICAgICBtaW4gPSAwLCBtYXggPSA0DQojIEVtcGF0aGljIENvbmNlcm4gICAtIElSSV9FQyBjKDEsNSw3LDEyLDE2LDIzLDI2KQ0KIyBQZXJzcGVjdGl2ZSBUYWtpbmcgLSBJUklfUFQgYygzLDgsMTEsMTUsMjEsMjUsMjgpDQojIEZhbnRhc3kgICAgICAgICAgICAtIElSSV9GICBjKDIsNCw5LDE0LDE4LDIwLDIyKQ0KIyBQZXJzb25hbCBEaXN0cmVzcyAgLSBJUklfUEQgYyg2LDEwLDEzLDE3LDE5LDI0LDI3KQ0KaWR4X2lyaSA8LSBkZl9yZWNvZGVkMiAlPiUgc2VsZWN0KHN0YXJ0c193aXRoKCJHMDVRMTEiKSkgJT4lIGNvbG5hbWVzKCkNCmlkeF9pdGVtX2lyaV9yZXYgPC0gYygzLDQsNywxMiwxMywxNCwxNSwxOCwxOSkgJT4lIHNwcmludGYoJyUwLjNkJywgLikgJT4lIHBhc3RlMCgiRzA1UTExW1NRIiwgLiAsIl0iKQ0KaWR4X2l0ZW1faXJpX2VjIDwtIGMoMSw1LDcsMTIsMTYsMjMsMjYpICU+JSBzcHJpbnRmKCclMC4zZCcsIC4pICU+JSBwYXN0ZTAoIkcwNVExMVtTUSIsIC4gLCJdIikNCmlkeF9pdGVtX2lyaV9wdCA8LSBjKDMsOCwxMSwxNSwyMSwyNSwyOCkgJT4lIHNwcmludGYoJyUwLjNkJywgLikgJT4lIHBhc3RlMCgiRzA1UTExW1NRIiwgLiAsIl0iKQ0KaWR4X2l0ZW1faXJpX2YgPC0gYygyLDQsOSwxNCwxOCwyMCwyMikgJT4lIHNwcmludGYoJyUwLjNkJywgLikgJT4lIHBhc3RlMCgiRzA1UTExW1NRIiwgLiAsIl0iKQ0KaWR4X2l0ZW1faXJpX3BkIDwtIGMoNiwxMCwxMywxNywxOSwyNCwyNykgJT4lIHNwcmludGYoJyUwLjNkJywgLikgJT4lIHBhc3RlMCgiRzA1UTExW1NRIiwgLiAsIl0iKQ0KDQpkZl9yZWNvZGVkMiRJUklfRUMgPC0gU2NvcmVMaWtlcnQoZGZfcmVjb2RlZDJbaWR4X2l0ZW1faXJpX2VjXSwgcmV2ZXJzZWNvbHMgPSBpbnRlcnNlY3QoaWR4X2l0ZW1faXJpX3JldiwgaWR4X2l0ZW1faXJpX2VjKSwgbmFwZXJjZW50ID0gLjksIG1pbiA9IDAsIG1heCA9IDQpDQpkZl9yZWNvZGVkMiRJUklfUFQgPC0gU2NvcmVMaWtlcnQoZGZfcmVjb2RlZDJbaWR4X2l0ZW1faXJpX3B0XSwgcmV2ZXJzZWNvbHMgPSBpbnRlcnNlY3QoaWR4X2l0ZW1faXJpX3JldiwgaWR4X2l0ZW1faXJpX3B0KSwgbmFwZXJjZW50ID0gLjksIG1pbiA9IDAsIG1heCA9IDQpDQpkZl9yZWNvZGVkMiRJUklfRiAgPC0gU2NvcmVMaWtlcnQoZGZfcmVjb2RlZDJbaWR4X2l0ZW1faXJpX2ZdLCByZXZlcnNlY29scyA9IGludGVyc2VjdChpZHhfaXRlbV9pcmlfcmV2LCBpZHhfaXRlbV9pcmlfZiksIG5hcGVyY2VudCA9IC45LCBtaW4gPSAwLCBtYXggPSA0KQ0KZGZfcmVjb2RlZDIkSVJJX1BEIDwtIFNjb3JlTGlrZXJ0KGRmX3JlY29kZWQyW2lkeF9pdGVtX2lyaV9wZF0sIHJldmVyc2Vjb2xzID0gaW50ZXJzZWN0KGlkeF9pdGVtX2lyaV9yZXYsIGlkeF9pdGVtX2lyaV9wZCksIG5hcGVyY2VudCA9IC45LCBtaW4gPSAwLCBtYXggPSA0KQ0KDQpgYGANCg0KIyMgU2NvcmluZyBVVEFVVCAoT25saW5lIFRoZXJhcHkpDQoNCmBgYHtyfQ0KIyBVVEFVVA0KIyBTY2FsZXMgd2l0aCByZXZlcnNlZCBjKDUsOSwxMSwyMCwyMSkgICAgICAgICBtaW4gPSAxLCBtYXggPSA1DQojIFRoZXJhcHkgUXVhbGl0eSBFeHBlY3RhdGlvbjogMSwyLDVSLDYsOVIsMTFSLDE1LDE3LDIxUjsgLSBVVF9RRSBjKDEsMiw1LDYsOSwxMSwxNSwxNywyMSkNCiMgRWFzZSBvZiB1c2U6IDEyLDE0LDE4LDIwUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFVUX0VVIGMoMTIsMTQsMTgsMjApDQojIFByZXNzdXJlIGZyb20gb3RoZXJzOiA0LDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBVVF9QTyBjKDQsMTYpDQojIFByb2Zlc3Npb25hbCBTdXBwb3J0OiA4LDE5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBVVF9QUyBjKDgsMTkpIA0KIyBDb252ZW5pZW5jZTogMywxMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVVRfQyAgYygzLDEzKQ0KIyBCZWhhdmlvciBpbnRlbnRpb246IDcsMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gVVRfQkkgYyg3LDEwKQ0KaWR4X3V0IDwtIGRmX3JlY29kZWQyICU+JSBzZWxlY3Qoc3RhcnRzX3dpdGgoIkcwNlExMiIpKSAlPiUgY29sbmFtZXMoKQ0KaWR4X2l0ZW1fdXRfcmV2IDwtIGMoNSw5LDExLDIwLDIxKSAlPiUgc3ByaW50ZignJTAuM2QnLCAuKSAlPiUgcGFzdGUwKCJHMDZRMTJbU1EiLCAuICwiXSIpDQppZHhfaXRlbV91dF9xZSA8LSBjKDEsMiw1LDYsOSwxMSwxNSwxNywyMSkgJT4lIHNwcmludGYoJyUwLjNkJywgLikgJT4lIHBhc3RlMCgiRzA2UTEyW1NRIiwgLiAsIl0iKQ0KaWR4X2l0ZW1fdXRfZXUgPC0gYygxMiwxNCwxOCwyMCkgJT4lIHNwcmludGYoJyUwLjNkJywgLikgJT4lIHBhc3RlMCgiRzA2UTEyW1NRIiwgLiAsIl0iKQ0KaWR4X2l0ZW1fdXRfcG8gPC0gYyg0LDE2KSAlPiUgc3ByaW50ZignJTAuM2QnLCAuKSAlPiUgcGFzdGUwKCJHMDZRMTJbU1EiLCAuICwiXSIpDQppZHhfaXRlbV91dF9wcyA8LSBjKDgsMTkpICU+JSBzcHJpbnRmKCclMC4zZCcsIC4pICU+JSBwYXN0ZTAoIkcwNlExMltTUSIsIC4gLCJdIikNCmlkeF9pdGVtX3V0X2MgPC0gYygzLDEzKSAlPiUgc3ByaW50ZignJTAuM2QnLCAuKSAlPiUgcGFzdGUwKCJHMDZRMTJbU1EiLCAuICwiXSIpDQppZHhfaXRlbV91dF9iaSA8LSBjKDcsMTApICU+JSBzcHJpbnRmKCclMC4zZCcsIC4pICU+JSBwYXN0ZTAoIkcwNlExMltTUSIsIC4gLCJdIikNCg0KZGZfcmVjb2RlZDIkVVRfUUUgPC0gU2NvcmVMaWtlcnQoZGZfcmVjb2RlZDJbaWR4X2l0ZW1fdXRfcWVdLCByZXZlcnNlY29scyA9IGludGVyc2VjdChpZHhfaXRlbV91dF9yZXYsIGlkeF9pdGVtX3V0X3FlKSwgbmFwZXJjZW50ID0gLjksIG1pbiA9IDEsIG1heCA9IDUpDQpkZl9yZWNvZGVkMiRVVF9FVSA8LSBTY29yZUxpa2VydChkZl9yZWNvZGVkMltpZHhfaXRlbV91dF9ldV0sIHJldmVyc2Vjb2xzID0gaW50ZXJzZWN0KGlkeF9pdGVtX3V0X3JldiwgaWR4X2l0ZW1fdXRfZXUpLCBuYXBlcmNlbnQgPSAuOSwgbWluID0gMSwgbWF4ID0gNSkNCmRmX3JlY29kZWQyJFVUX1BPIDwtIFNjb3JlTGlrZXJ0KGRmX3JlY29kZWQyW2lkeF9pdGVtX3V0X3BvXSwgbmFwZXJjZW50ID0gLjkpDQpkZl9yZWNvZGVkMiRVVF9QUyA8LSBTY29yZUxpa2VydChkZl9yZWNvZGVkMltpZHhfaXRlbV91dF9wc10sIG5hcGVyY2VudCA9IC45KQ0KZGZfcmVjb2RlZDIkVVRfQyA8LSBTY29yZUxpa2VydChkZl9yZWNvZGVkMltpZHhfaXRlbV91dF9jXSwgbmFwZXJjZW50ID0gLjkpDQpkZl9yZWNvZGVkMiRVVF9CSSA8LSBTY29yZUxpa2VydChkZl9yZWNvZGVkMltpZHhfaXRlbV91dF9iaV0sIG5hcGVyY2VudCA9IC45KQ0KDQpkZl9yZWNvZGVkMiRVVF9Ub3RhbCA8LSByb3dTdW1zKGRmX3JlY29kZWQyWywgYygiVVRfUUUiLCAiVVRfRVUiLCAiVVRfUE8iLCAiVVRfUFMiLCAiVVRfQyIsICJVVF9CSSIpXSwgbmEucm0gPSBUUlVFKQ0KYGBgDQoNCg0KIyBRIE1ldGhvZA0KDQpgYGB7cn0NCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBJdGVtIHRleHRzDQppdGVtX3Fzb3J0X3RleHQgPC0gcmVhZF9saW5lcygiSkhQX29wZXJhdGlvbmFsaXNfaXRlbXMudHh0IikgJT4lIGFzLnZlY3RvcigpIA0KDQojIEdyaWQNCiMgMiArIA0KIyAgIDMgKyANCiMgICAgIDQgKyAgICAgICAgICAgIyA5IEltcG9ydGFudA0KIyAgICAgICA1ICsgDQojICAgICAgICAgNyArDQojICAgICAgIDUgKyAgICAgICAgICMgMTcgU29tZSB3aGF0IGltcG9ydGFudCAvIE5ldXRyYWwNCiMgICAgIDQgKw0KIyAgIDMgKw0KIyAyICAgICAgICAgICAgICAgICAjIDkgVW5pbXBvcnRhbnQNCg0KZGlzdHJvIDwtIGMoDQogIHJlcCgtNCwgMiksIHJlcCgtMywgMyksIHJlcCgtMiwgNCksIA0KICByZXAoLTEsIDUpLCByZXAoMCwgNyksIHJlcCgxLCA1KSwNCiAgcmVwKDIsIDQpLCByZXAoMywgMyksIHJlcCg0LCAyKQ0KKQ0KDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgUHJlcGFyZSBkYXRhIGZvciBRTWV0aG9kDQojIFFNZXRob2QgbmVlZHMgc3RhdGVtZW50cyBvbiByb3dzIGFuZCBzb3J0cyBvbiBjb2x1bW5zICh0KCkpDQppZHhfcXNvcnQgPC0gZGZfcmVjb2RlZDIgJT4lIHNlbGVjdChzdGFydHNfd2l0aCgiRzA3UTEzIikpICU+JSBjb2xuYW1lcygpDQpkZl9xc29ydF9kYXRhIDwtDQogIGRmX3JlY29kZWQyWywgYygiaWQiLCBpZHhfcXNvcnQpXSAlPiUNCiAgY29sdW1uX3RvX3Jvd25hbWVzKHZhciA9ICJpZCIpICU+JQ0KICB0KCkgJT4lIA0KICBhcy5kYXRhLmZyYW1lKCkgDQpkZl9xc29ydF90ZXh0IDwtIHBhc3RlKHJvd25hbWVzKGRmX3Fzb3J0X2RhdGEpLCBpdGVtX3Fzb3J0X3RleHQpICU+JSBkYXRhLmZyYW1lKGl0ZW1fdGV4dCA9IC4pDQpsaXN0X3Fzb3J0IDwtIGxpc3QoZGZfcXNvcnRfZGF0YSwgZGZfcXNvcnRfdGV4dCkNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIE51bWJlciBvZiBmYWN0b3JzIHRvIGV4dHJhY3QNCnNjcmVlcGxvdChwcmNvbXAoZGZfcXNvcnRfZGF0YSksIG1haW4gPSAiU2NyZWVwbG90IG9mIHVucm90YXRlZCBmYWN0b3JzIiwgdHlwZSA9ICJsIikgICMgMyBmYWN0b3JzPw0KIyBwc3ljaDo6ZmEucGFyYWxsZWwoZGZfcmVjb2RlZDJbaWR4X3Fzb3J0XSkNCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIFJ1biB0aGUgYW5hbHlzaXMgdXNpbmcgY2VudHJvaWQgZmFjdG9yIGV4dHJhY3Rpb24gaW5zdGVhZCBvZiBQQ0EsIGFuZCB3aXRob3V0IHJvdGF0aW9uOg0KcmVzdWx0cyA8LSBxbWV0aG9kOjpxbWV0aG9kKA0KICBkZl9xc29ydF9kYXRhLCBuZmFjdG9ycyA9IDMsDQogIGZvcmNlZCA9IEZBTFNFLCBzaWxlbnQgPSBUUlVFLA0KICBkaXN0cmlidXRpb24gPSBkaXN0cm8NCikNCiMgcW1ldGhvZDo6OnN1bW1hcnkuUW1ldGhvZFJlcyhyZXN1bHRzKQ0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgUHJpbnQgcmVzdWx0cw0KcmVzdWx0cyRsb2EgJT4lIGtuaXRyOjprYWJsZShjYXB0aW9uID0gIlEtc29ydCBmYWN0b3IgbG9hZGluZ3MiKQ0KcmVzdWx0cyRmbGFnZ2VkICU+JSBrbml0cjo6a2FibGUoY2FwdGlvbiA9ICJGbGFnZ2VkIFEtc29ydHMiKSAgDQoNCiMgSSB0aGluayBmbGFnZ2VkICBpcyBiYXNlZCBvbiBzb21lIGN1dG9mZiBvbiBsb2FkaW5ncw0KIyB0cnlfY2FsY19mbGFnIDwtICFyZXN1bHRzJGxvYSAtIGFwcGx5KHJlc3VsdHMkbG9hLCAxLCBtYXgpICYgYWJzKHJlc3VsdHMkbG9hKSA+PSAuMzcNCiMgaWRlbnRpY2FsKHRyeV9jYWxjX2ZsYWcsIHJlc3VsdHMkZmxhZ2dlZCkNCiMgYWxsLmVxdWFsKHRyeV9jYWxjX2ZsYWcsIHJlc3VsdHMkZmxhZ2dlZCkgICAjIGNsb3NlIGVub3VnaCAuLi4gc28gaXQncyBtYXggbG9hZGluZyBhbmQgc29tZSBjdXRvZmYgcHJvYmFibHkNCg0KcmVzdWx0cyR6c2MgJT4lIGtuaXRyOjprYWJsZShjYXB0aW9uID0gIlN0YXRlbWVudCB6LXNjb3JlcyIpDQpyZXN1bHRzJHpzY19uICU+JSBrbml0cjo6a2FibGUoY2FwdGlvbiA9ICJTdGF0ZW1lbnQgZmFjdG9yIHNjb3JlcyIpDQoNCnJlc3VsdHMkZl9jaGFyJGNoYXJhY3RlcmlzdGljcyAlPiUga25pdHI6OmthYmxlKGNhcHRpb24gPSAiRmFjdG9yIGNoYXJhY3RlcmlzdGljcyIpDQpyZXN1bHRzJGZfY2hhciRjb3JfenNjICU+JSBrbml0cjo6a2FibGUoY2FwdGlvbiA9ICJDb3JyZWxhdGlvbiBiZXR3ZWVuIGZhY3RvciB6LXNjb3JlcyIpDQpyZXN1bHRzJGZfY2hhciRzZF9kaWYgJT4lIGtuaXRyOjprYWJsZShjYXB0aW9uID0gIlN0YW5kYXJkIGVycm9yIG9mIGRpZmZlcmVuY2VzIGJldHdlZW4gZmFjdG9ycyIpDQogDQpyZXN1bHRzJHFkYyAlPiUga25pdHI6OmthYmxlKGNhcHRpb24gPSAiRGlzdGluZ3Vpc2hpbmcgYW5kIGNvbnNlbnN1cyBzdGF0ZW1lbnRzIikNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIFBsb3QNCnFtZXRob2Q6OjpwbG90LlFtZXRob2RSZXMoDQogIHJlc3VsdHMsDQogIHhsYWIgPSAiei1zY29yZXMiLCB5bGFiID0gIiIsICAgICAgICAgICAgICAgICAgICAgICAgDQogIGxlZy5wb3MgPSAidG9wcmlnaHQiLCBzb3J0Lml0ZW1zID0gRkFMU0UNCikgDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBPcmRlciB0aGUgcmVzdWx0cyBieSB0aGUgc2NvcmVzIG9mIGVhY2ggZmFjdG9yOg0Kc2NvcmVzIDwtIGNiaW5kKHJlc3VsdHMkenNjX24sIGRmX3Fzb3J0X3RleHQpDQojIGZvciAoaSBpbiAxOmxlbmd0aChyZXN1bHRzJGxvYSkpIHsgICAgICAgICAgICAgICAgICMgdGhpcyBvbGQgY29kZSBmcm9tIGRvaToxMC4zMjYxNC9SSi0yMDE0LTAzMiBnaXZlcyB3YXJuaW5nIGFuZCBhZGRpdGlvbmFsIG9yZGVyaW5nIGZvciANCiMgICBWaWV3KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmV4aXN0YW50IGZhY3Rvcg0KIyAgICAgc2NvcmVzW2Jhc2U6Om9yZGVyKHNjb3Jlc1tpXSwgZGVjcmVhc2luZyA9IFRSVUUpLCBdLA0KIyAgICAgdGl0bGUgPSBwYXN0ZTAoIk9yZGVyIGZvciBmIiwgaSkNCiMgICApDQojIH0NCg0Kb3JkZXJfZjEgPC0gDQogIHNjb3JlcyAlPiUNCiAgc2VsZWN0KGZzY19mMSwgaXRlbV90ZXh0KSAlPiUNCiAgYXJyYW5nZShkZXNjKGZzY19mMSkpIA0Kb3JkZXJfZjEgJT4lIGtuaXRyOjprYWJsZShjYXB0aW9uID0gIk9yZGVyIGYxIikgDQoNCm9yZGVyX2YyIDwtIA0KICBzY29yZXMgJT4lDQogIHNlbGVjdChmc2NfZjIsIGl0ZW1fdGV4dCkgJT4lDQogIGFycmFuZ2UoZGVzYyhmc2NfZjIpKSANCm9yZGVyX2YyICU+JSBrbml0cjo6a2FibGUoY2FwdGlvbiA9ICJPcmRlciBmMiIpIA0KDQpvcmRlcl9mMyA8LSANCiAgc2NvcmVzICU+JQ0KICBzZWxlY3QoZnNjX2YzLCBpdGVtX3RleHQpICU+JQ0KICBhcnJhbmdlKGRlc2MoZnNjX2YzKSkgDQpvcmRlcl9mMyAlPiUga25pdHI6OmthYmxlKGNhcHRpb24gPSAiT3JkZXIgZjMiKSANCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgTWVyZ2UgZmxhZ2dlZC9tZW1iZXJzaGlwIGJhY2sgdG8gZGF0YQ0KDQpkZl9yZWNvZGVkMiRRU29ydF9tZW0gPC0gZmFjdG9yKA0KICAocmVzdWx0cyRmbGFnZ2VkICUqJSAoMTpuY29sKHJlc3VsdHMkZmxhZ2dlZCkpKSwgDQogIGxhYmVscyA9IGMoTkFfY2hhcmFjdGVyXywgY29sbmFtZXMocmVzdWx0cyRmbGFnZ2VkKSkNCikNCiMgY2JpbmQoYXMuZGF0YS5mcmFtZShyZXN1bHRzJGZsYWdnZWQpLCBkZl9yZWNvZGVkMiRRU29ydF9tZW0pICMgdGVzdCAtLSBhbGwgZmluZQ0KDQpgYGANCg0KDQojIEFuYWx5c2VzDQoNCiMjIERlc2NyaXB0aXZlcw0KDQpgYGB7cn0NCiMgIkcwMlEwMyIgPSBnZW4NCiMgIkcwMlEwNSIgPSBzY29hbGEgZm9ybWFyZQ0KIyAiRzAyUTA2IiA9IG5vIGN1cnN1cmkgZm9ybWFyZQ0KIyAiRzAzUTA4IiA9IHRlaG5pY2kgc2NvYWxhDQojICJHMDNRMTAiID0gYW5pIHByYWN0aWNhDQoNCmRlc2NfdGFibGUgPC0gDQogIGRmX3JlY29kZWQyICU+JQ0KICAgIHNlbGVjdChHMDJRMDMsIEcwM1EwNSwgRzAzUTA2LCBHMDNRMDgsIEcwM1ExMCwgUVNvcnRfbWVtKSAlPiUNCiAgICBndHN1bW1hcnk6OnRibF9zdW1tYXJ5KCkNCmd0c3VtbWFyeTo6OnByaW50Lmd0c3VtbWFyeShkZXNjX3RhYmxlLCBwcmludF9lbmdpbmUgPSAia2FibGUiKSAgDQpgYGANCg0KIyBRU29ydCBtZW0gYnkgc2Nob29sDQoNCmBgYHtyfQ0KZ2dwaWVzdGF0cyggIA0KICBkYXRhID0gZGZfcmVjb2RlZDIsIA0KICB4ID0gUVNvcnRfbWVtLA0KICB5ID0gRzAzUTA1LA0KICB0eXBlID0gIm5wIg0KKQ0KYGBgDQoNCiMjIElSSQ0KDQpgYGB7cn0NCmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gZGZfcmVjb2RlZDIsIA0KICB4ID0gRzAzUTA1LA0KICB5ID0gSVJJX0VDLA0KICB0eXBlID0gIm5wIg0KKQ0KDQpnZ2JldHdlZW5zdGF0cygNCiAgZGF0YSA9IGRmX3JlY29kZWQyLCANCiAgeCA9IEcwM1EwNSwNCiAgeSA9IElSSV9QVCwNCiAgdHlwZSA9ICJucCIgICAgICAgICAgICAgIA0KKQ0KDQpnZ2JldHdlZW5zdGF0cygNCiAgZGF0YSA9IGRmX3JlY29kZWQyLCANCiAgeCA9IEcwM1EwNSwNCiAgeSA9IElSSV9GLA0KICB0eXBlID0gIm5wIiAgICAgICAgICAgICAgDQopDQoNCmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gZGZfcmVjb2RlZDIsIA0KICB4ID0gRzAzUTA1LA0KICB5ID0gSVJJX1BELA0KICB0eXBlID0gIm5wIiAgICAgICAgICAgICAgDQopDQpgYGANCg0KYGBge3J9DQpnZ2JldHdlZW5zdGF0cygNCiAgZGF0YSA9IGRmX3JlY29kZWQyLCANCiAgeCA9IFFTb3J0X21lbSwNCiAgeSA9IElSSV9FQywNCiAgdHlwZSA9ICJucCINCikNCg0KZ2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBkZl9yZWNvZGVkMiwgDQogIHggPSBRU29ydF9tZW0sDQogIHkgPSBJUklfUFQsDQogIHR5cGUgPSAibnAiICAgICAgICAgICAgICANCikNCg0KZ2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBkZl9yZWNvZGVkMiwgDQogIHggPSBRU29ydF9tZW0sDQogIHkgPSBJUklfRiwNCiAgdHlwZSA9ICJucCIgICAgICAgICAgICAgIA0KKQ0KDQpnZ2JldHdlZW5zdGF0cygNCiAgZGF0YSA9IGRmX3JlY29kZWQyLCANCiAgeCA9IFFTb3J0X21lbSwNCiAgeSA9IElSSV9QRCwNCiAgdHlwZSA9ICJucCIgICAgICAgICAgICAgIA0KKQ0KYGBgDQoNCiMjIFVUIA0KDQpgYGB7cn0NCmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gZGZfcmVjb2RlZDIsIA0KICB4ID0gUVNvcnRfbWVtLA0KICB5ID0gVVRfUUUsDQogIHR5cGUgPSAibnAiDQopDQoNCmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gZGZfcmVjb2RlZDIsIA0KICB4ID0gUVNvcnRfbWVtLA0KICB5ID0gVVRfRVUsDQogIHR5cGUgPSAibnAiICAgICAgICAgICAgICANCikNCg0KZ2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBkZl9yZWNvZGVkMiwgDQogIHggPSBRU29ydF9tZW0sDQogIHkgPSBVVF9QTywNCiAgdHlwZSA9ICJucCIgICAgICAgICAgICAgIA0KKQ0KDQpnZ2JldHdlZW5zdGF0cygNCiAgZGF0YSA9IGRmX3JlY29kZWQyLCANCiAgeCA9IFFTb3J0X21lbSwNCiAgeSA9IFVUX1BTLA0KICB0eXBlID0gIm5wIiAgICAgICAgICAgICAgDQopDQoNCmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gZGZfcmVjb2RlZDIsIA0KICB4ID0gUVNvcnRfbWVtLA0KICB5ID0gVVRfQywNCiAgdHlwZSA9ICJucCIgICAgICAgICAgICAgIA0KKQ0KDQpnZ2JldHdlZW5zdGF0cygNCiAgZGF0YSA9IGRmX3JlY29kZWQyLCANCiAgeCA9IFFTb3J0X21lbSwNCiAgeSA9IFVUX0JJLA0KICB0eXBlID0gIm5wIiAgICAgICAgICAgICAgDQopDQoNCmdnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gZGZfcmVjb2RlZDIsIA0KICB4ID0gUVNvcnRfbWVtLA0KICB5ID0gVVRfVG90YWwsDQogIHR5cGUgPSAibnAiICAgICAgICAgICAgICANCikNCmBgYA0KDQoNCg0KYGBge3J9DQpncm91cGVkX2dnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gZGZfcmVjb2RlZDIsIA0KICB4ID0gUVNvcnRfbWVtLA0KICB5ID0gSVJJX0VDLA0KICBncm91cGluZy52YXIgPSBHMDNRMDUsDQogIHR5cGUgPSAibnAiDQopDQoNCmdyb3VwZWRfZ2diZXR3ZWVuc3RhdHMoDQogIGRhdGEgPSBkZl9yZWNvZGVkMiwgDQogIHggPSBRU29ydF9tZW0sDQogIHkgPSBJUklfUFQsDQogIGdyb3VwaW5nLnZhciA9IEcwM1EwNSwNCiAgdHlwZSA9ICJucCIgICAgICAgICAgICAgIA0KKQ0KDQpncm91cGVkX2dnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gZGZfcmVjb2RlZDIsIA0KICB4ID0gUVNvcnRfbWVtLA0KICB5ID0gSVJJX0YsDQogIGdyb3VwaW5nLnZhciA9IEcwM1EwNSwNCiAgdHlwZSA9ICJucCIgICAgICAgICAgICAgIA0KKQ0KDQpncm91cGVkX2dnYmV0d2VlbnN0YXRzKA0KICBkYXRhID0gZGZfcmVjb2RlZDIsIA0KICB4ID0gUVNvcnRfbWVtLA0KICB5ID0gSVJJX1BELA0KICBncm91cGluZy52YXIgPSBHMDNRMDUsDQogIHR5cGUgPSAibnAiICAgICAgICAgICAgICANCikNCmBgYA0KDQoNCg0KDQoNCg0KDQo8IS0tIFNlc3Npb24gSW5mbyBhbmQgTGljZW5zZSAtLT4NCg0KPGJyPg0KDQojIFNlc3Npb24gSW5mbw0KYGBge3Igc2Vzc2lvbl9pbmZvLCBlY2hvID0gRkFMU0UsIHJlc3VsdHMgPSAnbWFya3VwJ30NCnNlc3Npb25JbmZvKCkgICAgDQpgYGANCg0KPCEtLSBGb290ZXIgLS0+DQombmJzcDsNCjxociAvPg0KPHAgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPkEgd29yayBieSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQ2xhdWRpdVBhcGFzdGVyaS8iPkNsYXVkaXUgUGFwYXN0ZXJpPC9hPjwvcD4NCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48c3BhbiBzdHlsZT0iY29sb3I6ICM4MDgwODA7Ij48ZW0+Y2xhdWRpdS5wYXBhc3RlcmlAZ21haWwuY29tPC9lbT48L3NwYW4+PC9wPg0KJm5ic3A7DQo=