ReadMe

This document includes an overview of all analyses reported in the paper as well as additional tables and figures for the paper “Be Yourself and Behave Appropriately: Exploring Associations between Incongruent Personality States and Positive Affect, Tiredness, and Cognitive Performance”.

Tabs
To make the document easier to read, we use tabs. You will find tabs in gray in many places, where you can choose between different information (e.g., tables or graphics on a topic). Note: Sometimes there are several levels of tabs, so for example, on the first level you decide whether you want to see tables or graphics and on the next level you choose a sport.

Analysis Code
The document includes all R code used to create the graphs and tables or to perform the analyses. However, the code is hidden by default to enhance readability. If you want to see the code, simply click on the respective CODE button in the right hand side just above the figure or table—you will then see the associated codechunk. If you want to show all codechunks by default, click CODE > Show all Code at the very top of the document. Moreover, you can also download the RMarkdown source document there.

Methodological Aspects

Participants

data.raw <- data.raw %>% 
   mutate(screening = factor(ifelse(screener.1==1 & screener.2==4 & screener.3==2 & screener.4==1 & screener.5==1,"passed", "failed")),
          requirements = factor(ifelse(consent==1 & old.enough==1 & device%in%c(1,2),"passed", "failed")),
          careful.responding = factor(ifelse(bhi_25==3 & sit_13==6,"passed", "failed")),
          exclude = ifelse(screening=="passed" & requirements=="passed" & careful.responding=="passed", FALSE, TRUE))


start <- boxGrob(glue("N = {pop}",
                      "participants started the study",
                      pop = txtInt(nrow(data.raw)),
                      .sep = "\n"),
                 txt_gp = gpar(cex = 0.8),
                 box_gp = gpar(fill = "#d6d6d6"),
                 width = 0.25)
screening <- boxGrob(glue("Language comprehension and\nattention screening",
                          "N = {pop}",
                          pop = nrow(subset(data.raw, requirements!="failed")),
                          .sep = "\n"),
                     txt_gp = gpar(cex = 0.8),
                     box_gp = gpar(fill = "#d6d6d6"),
                     width = 0.25)
traits <- boxGrob(glue("Personality trait assessment &\ndemographics",
                       "N = {incl}",
                       incl = nrow(subset(data.raw, screening=="passed" & requirements=="passed")),
                       .sep = "\n"),
                  txt_gp = gpar(cex = 0.8),
                  box_gp = gpar(fill = "#d6d6d6"),
                  width = 0.25)

manip <- boxGrob(glue("Introduction and instruction for the game",
                      "(incl. manipulation of situation and behavior)",
                      "N = {incl}",
                      incl = sum(table(as.numeric(subset(data.raw, screening=="passed" & requirements=="passed")$pb))[3:length(unique(subset(data.raw, screening=="passed" & requirements=="passed")$pb))]),
                      .sep = "\n"),
                 txt_gp = gpar(cex = 0.8),
                 box_gp = gpar(fill = "#d6d6d6"),
                 width = 0.25)

game <- boxGrob(glue("Prisoner's Dilemma game",
                     "N = {incl}",
                     incl = sum(table(as.numeric(subset(data.raw, screening=="passed" & requirements=="passed")$pb))[5:length(unique(subset(data.raw, screening=="passed" & requirements=="passed")$pb))]),
                     .sep = "\n"),
                txt_gp = gpar(cex = 0.8),
                box_gp = gpar(fill = "#d6d6d6"),
                width = 0.25)

states <- boxGrob(glue("Assessment of situation characteristics,",
                       " personality states, positive affect, and",
                       " tiredness during the game",
                       "N = {incl}",
                       incl = sum(table(as.numeric(subset(data.raw, screening=="passed" & requirements=="passed")$pb))[14:length(unique(subset(data.raw, screening=="passed" & requirements=="passed")$pb))]),
                       .sep = "\n"),
                  txt_gp = gpar(cex = 0.8),
                  box_gp = gpar(fill = "#d6d6d6"),
                  width = 0.25)

stroop <- boxGrob(glue("Numerical Stroop task",
                       "N = {incl}",
                       incl = sum(table(as.numeric(subset(data.raw, screening=="passed" & requirements=="passed")$pb))[15:length(unique(subset(data.raw, screening=="passed" & requirements=="passed")$pb))]),
                       .sep = "\n"),
                  txt_gp = gpar(cex = 0.8),
                  box_gp = gpar(fill = "#d6d6d6"),
                  width = 0.25)

comments <- boxGrob(glue("Comments and personalized code",
                         "N = {incl}",
                         incl = table(as.numeric(subset(data.raw, screening=="passed" & requirements=="passed")$pb))[18],
                         .sep = "\n"),
                    txt_gp = gpar(cex = 0.8),
                    box_gp = gpar(fill = "#d6d6d6"),
                    width = 0.25)

excluded <- boxGrob(glue("Exclusion Criteria:",
                         " - No consent (N = {uninterested})",
                         " - Younger than 18 (N = {tooyoung})",
                         " - No desktop or laptop (N = {device})",
                         uninterested = nrow(subset(data.raw, consent==2 | is.na(consent))),
                         tooyoung = nrow(subset(data.raw, old.enough==2 | is.na(old.enough))) - nrow(subset(data.raw, consent==2 | is.na(consent))),
                         device = nrow(subset(data.raw, !(device%in%c(1,2)))) - nrow(subset(data.raw, old.enough==2 | is.na(old.enough))),
                         .sep = "\n"),
                    just = "left",
                    txt_gp = gpar(cex = 0.8),
                    box_gp = gpar(fill = "#ffafaf"),
                    width = 0.2)

excluded2 <- boxGrob(glue("Exclusion Criteria:",
                          " - Failed screening (N = {screening})",
                          screening = nrow(subset(data.raw, requirements=="passed" & screening=="failed")),
                          .sep = "\n"),
                     just = "left",
                     txt_gp = gpar(cex = 0.8),
                     box_gp = gpar(fill = "#ffafaf"),
                     width = 0.2)

final1 <- boxGrob(glue("Final sample for analyses\nwith positive affect and\ntiredness as DV:",
                       "N = {final1}*",
                       final1 = nrow(data),
                       .sep = "\n"),
                  just = "center",
                  txt_gp = gpar(cex = 0.8),
                  box_gp = gpar(fill = "#add8a4"),
                  width = 0.2)

final2 <- boxGrob(glue("Final sample for analyses\nwith Stroop performance as DV:",
                       "N = {final2}*",
                       final2 = nrow(subset(data, progress==96)),
                       .sep = "\n"),
                  txt_gp = gpar(cex = 0.8),
                  box_gp = gpar(fill = "#add8a4"),
                  width = 0.2,
                  just = "center")

note <- boxGrob(glue("* N = {careless} participants were exluded because of careless responding",
                     careless = nrow(subset(data.raw, pb>65)) - nrow(subset(data, progress>65)),
                     .sep = "\n"),
                txt_gp = gpar(cex = 0.8),
                box_gp = gpar(fill = "white", col="white"),
                just = "left")



grid.newpage()
vert <- spreadVertical(start = start,
                       screening = screening,
                       traits = traits,
                       manip = manip,
                       game = game,
                       states = states,
                       stroop = stroop,
                       comments = comments,
                       final2 = final2)

excluded <- moveBox(excluded, x = .8, y = coords(vert$screening)$top + distance(vert$start, vert$screening, half = TRUE))
excluded2 <- moveBox(excluded2, x = .8, y = coords(vert$traits)$top + distance(vert$screening, vert$traits, half = TRUE))
final1 <- moveBox(final1, x = .2, y = coords(vert$stroop)$top + distance(vert$states, vert$stroop, half = TRUE))
vert$final2 <- moveBox(vert$final2, x = .2)
note <- moveBox(note, x=.8, y=.01)

# print arrows
for (i in 1:(length(vert) - 2)) {
   connectGrob(vert[[i]], vert[[i + 1]], type = "vert", arrow_obj = getOption("connectGrobArrow", default = arrow(ends = "last", type = "closed", length = unit(0.1, "inches")))) %>%
      print
}

connectGrob(vert$start, excluded, type = "L", arrow_obj = getOption("connectGrobArrow", default = arrow(ends = "last", type = "closed", length = unit(0.1, "inches"))))
connectGrob(vert$traits, excluded2, type = "L", arrow_obj = getOption("connectGrobArrow", default = arrow(ends = "last", type = "closed", length = unit(0.1, "inches"))))
connectGrob(vert$states, final1, type = "L", arrow_obj = getOption("connectGrobArrow", default = arrow(ends = "last", type = "closed", length = unit(0.1, "inches"))))
connectGrob(vert$comments, vert$final2, type = "L", arrow_obj = getOption("connectGrobArrow", default = arrow(ends = "last", type = "closed", length = unit(0.1, "inches"))))

# Print boxes
vert
excluded
excluded2
final1
note
Flow of participants through the study including exclusion criteria, dropouts, and final sample sizes.

Figure 1: Flow of participants through the study including exclusion criteria, dropouts, and final sample sizes.

Manipulations

Situation Manipulations

Further information on the game and the manipulations can also be found in the “Documentation of the Game”-file that was upload with the preregistration.

The situation was manipulated in two ways. First, during the explanation of the game, the other partner was framed either as a partner or an opponent and was said the behave accordingly. Second, also during the explanation of the game, the payoffs were altered such that they either signal that stealing is not worthwhile or that stealing does pay off:

High Adversity and Deception-Condition

Let’s play a game!

You were randomly assigned an opponent. You and your opponent will play a game: In every round, there is a jackpot of coins to win. Both of you have the choice to either share the jackpot with your opponent or to steal the jackpot from your opponent.

If you both choose to share, each of you will receive 15 coins.
If both steal, each will receive 10 coins.
If you share, but your opponent steals, your opponent will receive 40 coins and you none.
The other way around, if you steal and your opponent shares, you will receive 40 coins and your opponent will receive none.

You will both decide simultaneously without knowing what the other will choose. However, in each round, you will have the chance to communicate with your opponent which decision you plan to make; but you are both allowed to lie. Unfortunately, your opponent is a rather dishonest person and will often play dirty. You will play multiple rounds.

t <- data.frame(a=c("", 
                    "<b style='color:red;display:inline;'>you</b> share", 
                    "<b style='color:red;display:inline;'>you</b> steal"), 
                b=c("<b style='color:blue;display:inline;'>your opponent</b> shares", 
                    "<b style='color:red;display:inline;'>15</b> | <b style='color:blue;display:inline;'>15</b>", 
                    "<b style='color:red;display:inline;'>40</b> | <b style='color:blue;display:inline;'>0</b>"), 
                c=c("<b style='color:blue;display:inline;'>your opponent</b> steals", 
                    "<b style='color:red;display:inline;'>0</b> | <b style='color:blue;display:inline;'>40</b>", 
                    "<b style='color:red;display:inline;'>10</b> | <b style='color:blue;display:inline;'>10</b>"))

kable(t, 
      col.names=c("", "", ""),
      align=c("r", "c", "c"),
      escape = F) %>% 
   kable_paper(bootstrap_options = "bordered", full_width = F, position = "left") %>% 
   column_spec(1, bold = T) %>%
   row_spec(1, bold = T)
your opponent shares your opponent steals
you share 15 | 15 0 | 40
you steal 40 | 0 10 | 10

Low Adversity and Deception-Condition

Let’s play a game!

You were randomly assigned a partner. You and your partner will play a game: In every round, there is a jackpot of coins to win. Both of you have the choice to either share the jackpot with your partner or to steal the jackpot from your partner.

you both choose to share, each of you will receive 20 coins. If both steal, the jackpot is lost and none of you receives anything.
If you share, but your partner steals, your partner will receive 30 coins and you will receive 5 coins. The other way around, if you steal and your partner cooperates, you will receive 30 coins and your partner will receive 5 coins.

You will both decide simultaneously without knowing what the other will choose. However, in each round, you will have the chance to communicate with your partner which decision you plan to make; but you are both allowed to lie. Luckily, your partner is a pretty honest person and is most of the time true to their word. You will play multiple rounds.

t <- data.frame(a=c("", 
                    "<b style='color:red;display:inline;'>you</b> share", 
                    "<b style='color:red;display:inline;'>you</b> steal"), 
                b=c("<b style='color:blue;display:inline;'>your partner</b> shares", 
                    "<b style='color:red;display:inline;'>20</b> | <b style='color:blue;display:inline;'>20</b>", 
                    "<b style='color:red;display:inline;'>30</b> | <b style='color:blue;display:inline;'>5</b>"), 
                c=c("<b style='color:blue;display:inline;'>your partner</b> steals", 
                    "<b style='color:red;display:inline;'>5</b> | <b style='color:blue;display:inline;'>30</b>", 
                    "<b style='color:red;display:inline;'>0</b> | <b style='color:blue;display:inline;'>0</b>"))

kable(t, 
      col.names=c("", "", ""),
      align=c("r", "c", "c"),
      escape = F) %>% 
   kable_paper(bootstrap_options = "bordered", full_width = F, position = "left") %>% 
   column_spec(1, bold = T) %>%
   row_spec(1, bold = T)
your partner shares your partner steals
you share 20 | 20 5 | 30
you steal 30 | 5 0 | 0

Behavior Manipulations

Further information on the game and the manipulations can also be found in the “Documentation of the Game”-file that was upload with the preregistration.

Participants’ behaviors and personality states were manipulated during the instructions for the Prisoner’s Dilemma game. Following the general explanation of the game, participants were informed about their task:

High Agreeableness and Honesty-Condition

Your task

Your task is to behave honestly and cooperatively with your [partner/opponent]. Please try to be true to your word most of the time. Of course, you do not always have to do as you proposed, but please try to be honest and cooperative as much as you can."

Low Agreeableness and Honesty-Condition

Your task

Your task is to behave dishonestly and uncooperatively with your [partner/opponent]. Please try to play dirty most of the time. Of course, you do not always have to deceive your [partner/opponent], but please try to be dishonest and uncooperative as much as you can.

Measures

Personality Traits

HEXACO model personality traits were measured with the Brief Hexaco Inventory (de Vries, 2019). The original article including the items is:

De Vries, R. E. (2013). The 24-item brief hexaco inventory (bhi). Journal of Research in Personality, 47(6), 871–880. https://doi.org/10.1016/j.jrp.2013.09.003

tab <- codebook.raw %>% 
   filter(stringr::str_detect(`Variable Name`, 'bhi')) %>% 
   filter(`Variable Name` != "bhi_25") %>% 
   arrange(Description) %>% 
   mutate(`Reverse Coding` = ifelse(is.na(`Reverse Coding`),"No", `Reverse Coding`)) 

kable(tab[c(1:24),c(2,4,6,5)]
      , col.names = c("Item text", "Scale", "Facet", "Reverse coding necessary")
      , caption="Items of the BHI used for personality trait assessment"
      , escape=F
) %>%
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) %>% 
   footnote(general=paste0("The instruction was '", tab$Instruction[1], "' and the response scale was ", tab$`Value Labels`[1], "."), escape = F)
Table 1: Items of the BHI used for personality trait assessment
Item text Scale Facet Reverse coding necessary
I remain unfriendly to someone who was mean to me. Agreeableness Forgiveness Yes
I often express criticism. Agreeableness Gentleness Yes
I tend to quickly agree with others. Agreeableness Flexibility No
Even when I’m treated badly, I remain calm. Agreeableness Patience No
I make sure that things are in the right spot. Conscientiousness Organization No
I postpone complicated tasks as long as possible. Conscientiousness Diligence Yes
I work very precisely. Conscientiousness Perfectionism No
I often do things without really thinking. Conscientiousness Prudence Yes
I am afraid of feeling pain. Emotionality Fearfulness No
I worry less than others. Emotionality Anxiety Yes
I can easily overcome difficulties on my own. Emotionality Dependence Yes
I have to cry during sad or romantic movies. Emotionality Sentimentality No
Nobody likes talking with me. Extraversion Social Self-esteem Yes
I easily approach strangers. Extraversion Social Boldness No
I like to talk with others. Extraversion Sociability No
I am seldom cheerful. Extraversion Liveliness Yes
I find it difficult to lie. Honesty-Humility Sincerity No
I would like to know how to make lots of money in a dishonest manner. Honesty-Humility Fairness Yes
I want to be famous. Honesty-Humility Greed Avoidance Yes
I am entitled to special treatment. Honesty-Humility Modesty Yes
I can look at a painting for a long time. Openness to Experience Aesthetic Appreciation No
I think science is boring. Openness to Experience Inquisitiveness Yes
I have a lot of imagination. Openness to Experience Creativity No
I like people with strange ideas. Openness to Experience Unconventionality No
Note:

The instruction was ’First, we would like to learn a bit about you.

Please indicate to what extent you agree with the following statements, using the following answering categories:’ and the response scale was 1=strongly disagree 2=disagree 3=neutral (neither agree, nor disagree) 4=agree 5=strongly agree.

Personality States

HEXACO model personality states were measured with bipolar items adopted from Sherman et al. (2015) and Churchyard (2013). All personality states were measured with one bipolar item each adopted from Sherman et al. (2015). State honesty-humility and state agreeableness were additionally measured with three items from Churchyard (2013), and all four items were combined into one scale score for these states. The original articles using these items are:

Sherman, R. A., Rauthmann, J. F., Brown, N. A., Serfass, D. G., & Jones, A. B. (2015). The independent effects of personality and situations on real-time expressions of behavior and emotion. Journal of Personality and Social Psychology, 109(5), 872–888. https://doi.org/10.1037/pspp0000036

Churchyard, J. S. (2013). Within-person variation in personality and psychological well-being [Dissertation]. University of Hertfordshire, Hertfordshire. https://doi.org/10.18745/th.15432

tab <- codebook.raw %>% 
   filter(Description=="behavior") 

kable(tab[,c(2,6,5)]
      , col.names = c("Item text (bipolar)", "Scale", "Reverse coding necessary")
      , caption="Items of the MDMQ used for the assessment of tiredness"
      , escape=F
) %>%
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) %>% 
   footnote(general=paste0("The instruction was '", tab$Instruction[1], "'."), escape = F)
Table 2: Items of the MDMQ used for the assessment of tiredness
Item text (bipolar) Scale Reverse coding necessary
arrogant, dishonest - humble, honest Honesty-Humility No
insincere - sincere Honesty-Humility No
unfair - fair Honesty-Humility No
arrogant - modest Honesty-Humility No
calm, unemotional - nervous, emotional Emotionality No
reserved, quiet - outgoing, sociable Extraversion No
cold, quarrelsome - warm, agreeable Agreeableness No
harsh - gentle Agreeableness No
inflexible - flexible Agreeableness No
temperamental - patient Agreeableness No
disorganized, lazy - organized, hardworking Conscientiousness No
unintelligent, uncreative - intelligent, creative Openness No
Note:
The instruction was ‘Please indicate on a scale from 1 (not at all) to 7 (totally) how well each of the following adjectives describes how you behaved in the game that you just played.’.

Situation Characteristics

Perceived situation characteristics from the Situational Eight DIAMONDS taxonomy (Rauthmann et al., 2014) were measured with the S8* (Rauthmann & Sherman, 2016a) for adversity and deception and with the shorter S8-I Rauthmann & Sherman, 2016b) for the remaining situation characteristics. The original articles including the items are:

Rauthmann, J. F., & Sherman, R. A. (2016). Measuring the situational eight diamonds characteristics of situations. European Journal of Psychological Assessment, 32(2), 155–164. https://doi.org/10.1027/1015-5759/a000246

Rauthmann, J. F., & Sherman, R. A. (2016). Ultra-brief measures for the situational eight diamonds domains. European Journal of Psychological Assessment, 32(2), 165–174. https://doi.org/10.1027/1015-5759/a000245

tab <- codebook.raw %>% 
   filter(stringr::str_detect(`Variable Name`, 'sit_')) %>% 
   filter(`Variable Name` != "sit_13") %>% 
   mutate(Description = ifelse(Subscale=="Adversity" | Subscale=="Deception", "S8* (Rauthmann & Sherman, 2016a)", "S8-I (Rauthmann & Sherman, 2016b)"),
          `Reverse Coding` = ifelse(is.na(`Reverse Coding`),"No", `Reverse Coding`)) 

kable(tab[,c(2,6,4,5)]
      , col.names = c("Item text", "Scale", "Questionnaire", "Reverse coding necessary")
      , caption="Items of the S8* and S8-I used for the assessment of perceived situation characteristics"
      , escape=F
) %>%
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) %>% 
   footnote(general=paste0("The instruction was '", tab$Instruction[1], "' and the response scale was ", tab$`Value Labels`[1], "."), escape = F)
Table 3: Items of the S8* and S8-I used for the assessment of perceived situation characteristics
Item text Scale Questionnaire Reverse coding necessary
Work has to be done. Duty S8-I (Rauthmann & Sherman, 2016b) No
Deep thinking is required. Intellect S8-I (Rauthmann & Sherman, 2016b) No
Potential romantic partners are present. Mating S8-I (Rauthmann & Sherman, 2016b) No
The situation is pleasant. Positivity S8-I (Rauthmann & Sherman, 2016b) No
The situation contains negative feelings (e.g., stress, anxiety, guilt, etc.). Negativity S8-I (Rauthmann & Sherman, 2016b) No
Social interactions are possible or required. Sociality S8-I (Rauthmann & Sherman, 2016b) No
I am being blamed for something. Adversity S8* (Rauthmann & Sherman, 2016a) No
I am being criticized. Adversity S8* (Rauthmann & Sherman, 2016a) No
I am being threatened by someone or something. Adversity S8* (Rauthmann & Sherman, 2016a) No
It is possible to deceive someone. Deception S8* (Rauthmann & Sherman, 2016a) No
Someone in this situation could be deceptive. Deception S8* (Rauthmann & Sherman, 2016a) No
Not dealing with others in an honest way is possible. Deception S8* (Rauthmann & Sherman, 2016a) No
Note:
The instruction was ‘We will now ask you some questions about the game you just played. Recall that we are interested in your subjective opinion and ratings. Therefore, answers cannot be correct or incorrect. Please answer all questions as honestly and openly as possible.Please indicate on a scale from 1 (=not at all) to 7 (=totally) how well each of the following sentences describes the game situation you just encountered’ and the response scale was 1= not at all 7 = totally.

Positive Affect

Positive affect was measured with a short form of the English version of the multidimensional mood state questionnaire (Steyer et al., 1994). The original version can be found here.

tab <- codebook.raw %>% 
   filter(stringr::str_detect(Subscale, 'GB')) %>% 
   mutate(Subscale = "positive affect (good-bad mood)")

kable(tab[,c(2,4,6,5)]
      , col.names = c("Item text", "Scale", "Subscale", "Reverse coding necessary")
      , caption="Items of the MDMQ used for the assessment of positive affect"
      , escape=F
) %>%
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) %>% 
   footnote(general=paste0("The instruction was '", tab$Instruction[1], "' and the response scale was ", tab$`Value Labels`[1], "."), escape = F)
Table 4: Items of the MDMQ used for the assessment of positive affect
Item text Scale Subscale Reverse coding necessary
content affect positive affect (good-bad mood) No
bad affect positive affect (good-bad mood) Yes
great affect positive affect (good-bad mood) No
uncomfortable affect positive affect (good-bad mood) Yes
Note:
The instruction was ‘In the following you find a list of expressions that characterize different moods. Please take a look at the list, word by word, and mark for each word the answer that represents best the actual intensity of your mood status at the end of the game.’ and the response scale was 1= not at all 5= totally.

Tiredness

Tiredness was measured with a short form of the English version of the multidimensional mood state questionnaire (Steyer et al., 1994). The original version can be found here. Tiredness was reverse-coded such that higher levels indicate less tiredness, or more active mood.

tab <- codebook.raw %>% 
   filter(stringr::str_detect(Subscale, 'AT')) %>% 
   mutate(Subscale = "tiredness (active-tired mood)")

kable(tab[,c(2,4,6,5)]
      , col.names = c("Item text", "Scale", "Subscale", "Reverse coding necessary")
      , caption="Items of the MDMQ used for the assessment of tiredness"
      , escape=F
) %>%
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) %>% 
   footnote(general=paste0("The instruction was '", tab$Instruction[1], "' and the response scale was ", tab$`Value Labels`[1], "."), escape = F)
Table 5: Items of the MDMQ used for the assessment of tiredness
Item text Scale Subscale Reverse coding necessary
rested affect tiredness (active-tired mood) No
worn-out affect tiredness (active-tired mood) Yes
tired affect tiredness (active-tired mood) Yes
energetic affect tiredness (active-tired mood) No
Note:
The instruction was ‘In the following you find a list of expressions that characterize different moods. Please take a look at the list, word by word, and mark for each word the answer that represents best the actual intensity of your mood status at the end of the game.’ and the response scale was 1= not at all 5= totally.

Analytical Strategy

R Version and Packages

This is a list of the packages used to prepare and analyze the data and to present the results. We explicitly thank the authors of all packages for the work they have put and are putting into the development and maintenance of the packages.

report_packages(include_R=FALSE, prefix="\n * ")
  • papaja (version 0.1.0.9997; Aust, Barth, 2020)

  • tinylabels (version 0.2.1; Barth, 2021)

  • cowplot (version 1.1.1; Claus Wilke, 2020)

  • Rcpp (version 1.0.6; Dirk Eddelbuettel and Romain Francois, 2011)

  • Matrix (version 1.2.18; Douglas Bates and Martin Maechler, 2019)

  • lme4 (version 1.1.27; Douglas Bates et al., 2015)

  • ggplot2 (version 3.3.4; Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.)

  • stringr (version 1.4.0; Hadley Wickham, 2019)

  • forcats (version 0.5.1; Hadley Wickham, 2021)

  • tidyr (version 1.1.3; Hadley Wickham, 2021)

  • readxl (version 1.3.1; Hadley Wickham and Jennifer Bryan, 2019)

  • readr (version 1.4.0; Hadley Wickham and Jim Hester, 2020)

  • dplyr (version 1.0.6; Hadley Wickham et al., 2021)

  • kableExtra (version 1.3.4; Hao Zhu, 2021)

  • afex (version 0.28.1; Henrik Singmann et al., 2021)

  • corx (version 1.0.6.1; James Conigrave, 2020)

  • glue (version 1.4.2; Jim Hester, 2020)

  • tibble (version 3.1.2; Kirill Müller and Hadley Wickham, 2021)

  • purrr (version 0.3.4; Lionel Henry and Hadley Wickham, 2020)

  • report (version 0.3.0; Makowski et al., 2020)

  • specr (version 0.2.2; Masur et al., 2020)

  • Gmisc (version 2.0.2; Max Gordon, 2021)

  • htmlTable (version 2.1.0; Max Gordon, Stephen Gragg and Peter Konings, 2020)

  • psych (version 2.1.3; Revelle, 2020)

  • lattice (version 0.20.41; Sarkar, Deepayan, 2008)

  • RSA (version 0.10.4; Schönbrodt et al., 2021)

  • patchwork (version 1.1.1; Thomas Lin Pedersen, 2020)

  • tidyverse (version 1.3.1; Wickham et al., 2019)

  • DT (version 0.18; Yihui Xie, Joe Cheng and Xianying Tan, 2021)

  • lavaan (version 0.6.8; Yves Rosseel, 2012)

report_system()

Analyses were conducted using the R Statistical language (version 4.0.3; R Core Team, 2020) on Windows 10 x64 (build 19042)

Planned Analyses

The planned analyses were preregistered along with the study design. This preregistration, including a detailed account of the analytic strategy, can be found on OSF: https://osf.io/hnu4b/

Codebook of the Final Data

This is the codebook for the final data (without the reaction time and error-rate specifications) to give an overview of the data.

# print table
datatable(codebook, 
          caption="Codebook of the final dataset.") 

Pretest

We tested an earlier version of the experimental paradigm in a preliminary study to determine if the manipulation works. Here, we briefly summarize the design of the game and the manipulations and the findings from this pretest.

Game

These are the original instructions for the prisoner’s dilemma game in the pretest:

“You were randomly assigned a partner[opponent]. You and your partner[opponent] will play a game: You are standing in front of a machine that multiplies and distributes coins. In every round, each of you will receive a coin. You have the choice to either put your coin into the machine (i.e., cooperate with your partner[opponent]) or keep your coin (i.e., cheat on your partner[opponent]). Your partner[opponent] will have the same choice.
If you both cooperate, that is, both put their coin into the machine, each of you will receive 19[10] coins out of the machine. If both cheat, each will receive 1[8] coin. If you cooperate, but your partner[opponent] cheats, your partner[opponent] will receive 20 coins and you none. The other way around, if you cheat and your partner[opponent] cooperates, you will receive 20 coins and your partner[opponent] will receive none. You will both decide simultaneously without knowing what the other will choose. You will play multiple rounds.”

In this version, we aimed to covertly manipulate the participants’ behaviors by varying the goal of the game:

“Your task is to play with your partner/opponent such that you will together gain as many coins as possible. In the end, your result will be number of coins that you have gained on average, that is, the mean of your and your partner/opponent’s coins. If you gained, for example, 300 coins and your partner/opponent gained 100, you will receive (300+100)/2, that is, 200 tickets for the lottery.”

— high agreeableness and honesty-condition

“Your task is to play against your partner/opponent such that you will gain more points than your partner/opponent. In the end, your result will be your advantage over your partner/opponent, that is, the difference between your and your partner/opponent’s coins. If you gained, for example, 300 coins and your partner/opponent gained 100, you will receive 300-100, that is, 200 tickets for the lottery.”

— low agreeableness and honesty-condition

The situation was manipulated by the description of the computer (i.e., partner or opponent) and by changing the payoffs of the game.

Results

aov.coop  <- aov_car(coopSum ~ behavior_factor * situation_factor + Error(ResponseId), data=pretest)
aov.agree <- aov_car(state.agreeableness ~ behavior_factor * situation_factor + Error(ResponseId), data=pretest)
aov.hon   <- aov_car(state.honesty.humility ~ behavior_factor * situation_factor + Error(ResponseId), data=pretest)
aov.adv   <- aov_car(adversity ~ behavior_factor * situation_factor + Error(ResponseId), data=pretest)
aov.dec   <- aov_car(deception ~ behavior_factor * situation_factor + Error(ResponseId), data=pretest)

tab <- bind_rows(as.data.frame(nice(aov.coop, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.agree, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.hon, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.adv, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.dec, es="pes", sig_symbols = rep("", 4), MSE=FALSE))
)

tab$p.value[tab$p.value=="<.001"] <- "&lt;.001"
tab$pes[tab$pes=="<.001"] <- "&lt;.001"
tab$Effect <- c("Behavior conditions", "Situation conditions", "Behavior x Situation conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i> value"),
      caption="Analysis of variance examining associations between experimental conditions and the targeted personality states and situation characteristics in the pretest.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   pack_rows("DV: Sum of cooperative decisions", 1, 3) %>%
   pack_rows("DV: State agreeableness", 4, 6) %>%
   pack_rows("DV: State honesty-humility", 7, 9) %>%
   pack_rows("DV: Adversity", 10, 12) %>%
   pack_rows("DV: Deception", 13, 15) 
Table 6: Analysis of variance examining associations between experimental conditions and the targeted personality states and situation characteristics in the pretest.
Effect df F ηp2 p value
DV: Sum of cooperative decisions
Behavior conditions 1, 174 34.52 .166 <.001
Situation conditions 1, 174 0.91 .005 .340
Behavior x Situation conditions 1, 174 0.18 .001 .676
DV: State agreeableness
Behavior conditions 1, 174 27.14 .135 <.001
Situation conditions 1, 174 0.79 .005 .376
Behavior x Situation conditions 1, 174 1.63 .009 .204
DV: State honesty-humility
Behavior conditions 1, 174 20.45 .105 <.001
Situation conditions 1, 174 0.71 .004 .401
Behavior x Situation conditions 1, 174 0.12 <.001 .735
DV: Adversity
Behavior conditions 1, 174 2.83 .016 .094
Situation conditions 1, 174 0.78 .004 .379
Behavior x Situation conditions 1, 174 2.85 .016 .093
DV: Deception
Behavior conditions 1, 174 0.01 <.001 .938
Situation conditions 1, 174 0.08 <.001 .783
Behavior x Situation conditions 1, 174 4.37 .024 .038
# plot interaction diagram
r1 <- ggplot(pretest %>% 
                group_by(situation_factor, behavior_factor) %>% 
                summarise(groups = mean(coopSum, na.rm=TRUE)), 
             aes(x = situation_factor, y = groups, color = behavior_factor)) +
   theme_pub() + xlab("Situation conditions") + ylab("Sum of cooperative decisions") + 
   scale_y_continuous(limits=c(1,15), labels=c(1:15), breaks=c(1:15)) +
   ggtitle("Cooperative Decisions") + 
   theme(legend.position=c(0.3,0.85), legend.direction="vertical") + labs(color="Behavior conditions") +
   scale_colour_manual(values=cols.beh) +
   geom_line(aes(group = behavior_factor), size=1.5) +
   geom_point(size=2.5) + theme(legend.title = element_text(size=9))

r2 <- ggplot(pretest %>% 
                group_by(situation_factor, behavior_factor) %>% 
                summarise(groups = mean(state.agreeableness, na.rm=TRUE)), 
             aes(x = situation_factor, y = groups, color = behavior_factor)) +
   theme_pub() + xlab("Situation conditions") + ylab("State agreeableness score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("State Agreeableness") + 
   theme(legend.position=c(0.3,0.85), legend.direction="vertical") + labs(color="Behavior conditions") +
   scale_colour_manual(values=cols.beh) +
   geom_line(aes(group = behavior_factor), size=1.5) +
   geom_point(size=2.5) + theme(legend.title = element_text(size=9))

r3 <- ggplot(pretest %>% 
                group_by(situation_factor, behavior_factor) %>% 
                summarise(groups = mean(state.honesty.humility, na.rm=TRUE)), 
             aes(x = situation_factor, y = groups, color = behavior_factor)) +
   theme_pub() + xlab("Situation conditions") + ylab("State honesty-humility score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("State Honesty-Humility") + 
   theme(legend.position=c(0.3,0.85), legend.direction="vertical") + labs(color="Behavior conditions") + 
   scale_colour_manual(values=cols.beh) +
   geom_line(aes(group = behavior_factor), size=1.5) +
   geom_point(size=2.5) + theme(legend.title = element_text(size=9))

r4 <- ggplot(pretest %>% 
                group_by(situation_factor, behavior_factor) %>% 
                summarise(groups = mean(adversity, na.rm=TRUE)), 
             aes(x = behavior_factor, y = groups, color = situation_factor)) +
   theme_pub() + xlab("Behavior conditions") + ylab("Adversity score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Adversity") + 
   theme(legend.position=c(0.3,0.85), legend.direction="vertical") + labs(color="Situation conditions") +
   scale_colour_manual(values=cols.sit) +
   geom_line(aes(group = situation_factor), size=1.5) +
   geom_point(size=2.5) + theme(legend.title = element_text(size=9))

r5 <- ggplot(pretest %>% 
                group_by(situation_factor, behavior_factor) %>% 
                summarise(groups = mean(deception, na.rm=TRUE)), 
             aes(x = behavior_factor, y = groups, color = situation_factor)) +
   theme_pub() + xlab("Behavior conditions") + ylab("Deception score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Deception") + 
   theme(legend.position=c(0.3,0.85), legend.direction="vertical") + labs(color="Situation conditions") + 
   scale_colour_manual(values=cols.sit) +
   geom_line(aes(group = situation_factor), size=1.5) +
   geom_point(size=2.5) + theme(legend.title = element_text(size=9))


### combine plots
r1 + r2 + r3 + r4 + r5 + plot_layout(ncol=2) + plot_annotation(tag_levels = "A") 
Associations between the experimental conditions and the targeted personality states and situation characteristics in the pretest.

Figure 2: Associations between the experimental conditions and the targeted personality states and situation characteristics in the pretest.

Conclusion

The game in the pretest successfully manipulated participant’s levels of state agreeableness and state honesty-humility, but it had no effect on the perceptions of adversity and deception. In sum, this pretest thus revealed that the manipulation of the situation was unsuccessful and that aiming to covertly manipulate behavior via goal instructions may have unwanted effect on the perception of the situations. We therefore adapted the experimental paradigm for the main study described in the methods below.

Descriptives

Descriptive Statistics

Table 7: Descriptive statistics of the relevant variables.
n mean sd median trimmed mad min max range skew kurtosis se Internal consistency (α)
Personality Traits
Trait Honesty-Humility 307 4.04 0.77 4.25 4.12 0.74 2.0 5.0 3.0 -0.80 -0.03 0.04 0.61
Trait Emotionality 307 2.88 0.66 3.00 2.90 0.74 1.0 4.5 3.5 -0.26 -0.11 0.04 0.28
Trait Extraversion 307 3.62 0.77 3.75 3.65 0.74 1.5 5.0 3.5 -0.31 -0.33 0.04 0.59
Trait Agreeableness 307 3.01 0.57 3.00 3.00 0.37 1.5 5.0 3.5 0.35 0.82 0.03 0.22
Trait Conscientiousness 307 3.37 0.51 3.25 3.37 0.37 2.0 5.0 3.0 0.04 0.10 0.03 0.52
Trait Openness 306 3.38 0.72 3.50 3.39 0.74 1.5 5.0 3.5 -0.09 -0.12 0.04 0.54
Personality States
State Honesty-Humility 257 4.43 1.93 4.75 4.51 2.59 1.0 7.0 6.0 -0.24 -1.17 0.12 0.93
State Emotionality 257 2.68 1.73 2.00 2.43 1.48 1.0 7.0 6.0 0.91 -0.02 0.11
State Extraversion 257 3.88 1.91 4.00 3.86 1.48 1.0 7.0 6.0 0.16 -0.93 0.12
State Agreeableness 257 4.77 1.60 5.00 4.87 1.48 1.0 7.0 6.0 -0.45 -0.47 0.10 0.84
State Conscientiousness 257 5.22 1.64 5.00 5.44 1.48 1.0 7.0 6.0 -0.88 0.33 0.10
State Openness 257 5.09 1.66 5.00 5.29 1.48 1.0 7.0 6.0 -0.77 0.00 0.10
Concrete Behaviors
Sharing Behaviors 250 7.25 4.68 6.50 7.04 5.19 1.0 15.0 14.0 0.35 -1.23 0.30
Honest Behaviors 297 10.72 3.63 11.00 11.07 4.45 1.0 15.0 14.0 -0.59 -0.46 0.21
Situation Characteristics
Duty 305 4.42 1.89 4.00 4.53 1.48 1.0 7.0 6.0 -0.33 -0.81 0.11
Intellect 304 3.69 2.02 4.00 3.61 2.97 1.0 7.0 6.0 0.07 -1.24 0.12
Adversity 304 2.42 1.56 2.00 2.20 1.48 1.0 7.0 6.0 0.98 0.17 0.09 0.83
Mating 307 2.30 1.79 1.00 1.98 0.00 1.0 7.0 6.0 1.19 0.23 0.10
pOsitivity 307 3.90 1.88 4.00 3.88 1.48 1.0 7.0 6.0 0.00 -0.95 0.11
Negativity 307 3.55 2.11 4.00 3.45 2.97 1.0 7.0 6.0 0.22 -1.27 0.12
Deception 304 5.35 1.41 5.67 5.50 1.48 1.0 7.0 6.0 -0.77 0.15 0.08 0.72
Sociality 306 4.27 1.98 4.00 4.34 2.97 1.0 7.0 6.0 -0.32 -1.02 0.11
Outcomes
Positive Affect 255 3.59 1.05 3.75 3.67 1.11 1.0 5.0 4.0 -0.54 -0.38 0.07 0.80
Tiredness(r) 255 3.39 0.92 3.25 3.42 1.11 1.0 5.0 4.0 -0.32 -0.04 0.06 0.67
Note:
Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Internal consistencies are reported for all measured that included more than one item.

Intercorrelations

rel <- data %>% 
   ungroup() %>% 
   select(# Traits
      "trait.h", "trait.e", "trait.x", "trait.a", "trait.c", "trait.o",
      # Behaviors
      "state.h", "state.e", "state.x", "state.a", "state.c", "state.o", "nCoop", "nHon",
      # Situation
      "dut", "int", "adv", "mat", "pos", "neg", "dec", "soc",
      # Outcomes
      "mood.gb", "mood.at")

x <- corx::corx(rel,
                triangle = "lower",
                stars = c(0.05))

row.names(x$apa) <- c(# Traits
   "1 Trait Honesty-Humility", "2 Trait Emotionality", "3 Trait Extraversion", "4 Trait Agreeableness", "5 Trait Conscientiousness", "6 Trait Openness",
   # Behaviors
   "7 State Honesty-Humility", "8 State Emotionality", "9 State Extraversion", "10 State Agreeableness", "11 State Conscientiousness", "12 State Openness", "13 Sharing Behaviors", "14 Honest Behaviors",
   # Situation
   "15 Duty", "16 Intellect", "17 Adversity", "18 Mating", "19 pOsitivity", "20 Negativity", "21 Deception", "22 Sociality",
   # Outcomes
   "23 Positive Affect", "24 Tiredness(r)")

x$apa[which(x$apa==' - ', arr.ind=T)] <- "--"


kable(x$apa
      , caption="Intercorrelations of the relevant variables."
      , escape=FALSE
) %>%
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), fixed_thead = T) %>% 
   column_spec(c(1), width = "16em")
Table 8: Intercorrelations of the relevant variables.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
1 Trait Honesty-Humility
2 Trait Emotionality -.06
3 Trait Extraversion .21* -.19*
4 Trait Agreeableness .08 -.11* .29*
5 Trait Conscientiousness -.05 -.12* .15* .08
6 Trait Openness -.17* -.12* .19* .19* .25*
7 State Honesty-Humility -.05 -.01 .15* .23* .14* .09
8 State Emotionality -.18* .24* -.11 -.07 -.02 .02 -.14*
9 State Extraversion -.24* -.03 .19* .05 .16* .15* .28* .15*
10 State Agreeableness .00 -.10 .18* .24* .15* .11 .82* -.24* .34*
11 State Conscientiousness -.03 -.10 .17* .17* .22* .12 .45* -.18* .25* .53*
12 State Openness -.13* -.14* .10 .21* .20* .24* .41* -.06 .31* .47* .61*
13 Sharing Behaviors .17* .02 .03 .08 -.07 -.09 .50* -.05 .01 .39* .11 -.02
14 Honest Behaviors .06 .04 -.01 .05 .03 -.01 .23* .05 -.01 .14* .06 .01 .47*
15 Duty -.23* .00 .10 .11 .20* .07 .03 .07 .10 .01 .22* .11 -.10 -.06
16 Intellect -.25* .05 .08 .24* .17* .23* .16* .12 .24* .18* .21* .25* -.06 -.12* .35*
17 Adversity -.45* .10 -.20* -.04 .14* .06 -.08 .27* .00 -.19* -.09 -.01 -.15* -.12* .30* .32*
18 Mating -.54* -.01 -.01 .08 .12* .16* .20* .18* .30* .15* .07 .16* .01 -.03 .32* .42* .49*
19 pOsitivity -.21* -.11 .08 .19* .08 .09 .52* -.16* .37* .54* .26* .34* .16* .04 .17* .31* .01 .37*
20 Negativity -.18* .12* -.11* -.10 .13* .02 -.30* .23* -.21* -.34* -.17* -.16* -.08 -.04 .18* .15* .55* .17* -.31*
21 Deception .11* .04 .03 -.14* .01 -.05 -.16* -.10 -.16* -.06 .08 -.04 -.04 -.11 -.02 .00 .10 -.15* -.17* .27*
22 Sociality -.21* .06 .07 .06 .03 .07 .12 .08 .31* .10 .07 .04 -.03 -.09 .31* .39* .28* .35* .22* .18* .12*
23 Positive Affect -.01 -.18* .20* .13* .07 .03 .52* -.26* .28* .52* .43* .43* .18* .13* .04 .12 -.27* .07 .57* -.53* -.14* .03
24 Tiredness(r) .01 -.16* .21* .19* .11 .10 .37* -.19* .30* .41* .34* .38* .12 .16* .06 .10 -.20* .08 .49* -.37* -.09 .07 .67*

Histograms

th <- ggplot(data=data, aes(x=trait.h)) + geom_histogram(color="black", fill=cols.beh[1], binwidth=1)  +
   scale_x_continuous(limits=c(0.5,5.5), breaks=c(1:5), labels=c(1:5)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Trait H-H") + xlab("") + theme_pub()

te <- ggplot(data=data, aes(x=trait.e)) + geom_histogram(color="black", fill=cols.beh[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,5.5), breaks=c(1:5), labels=c(1:5)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Trait E") + xlab("") + theme_pub()

tx <- ggplot(data=data, aes(x=trait.x)) + geom_histogram(color="black", fill=cols.beh[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,5.5), breaks=c(1:5), labels=c(1:5)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Trait X") + xlab("") + theme_pub()

ta <- ggplot(data=data, aes(x=trait.a)) + geom_histogram(color="black", fill=cols.beh[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,5.5), breaks=c(1:5), labels=c(1:5)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Trait A") + xlab("") + theme_pub()

tc <- ggplot(data=data, aes(x=trait.c)) + geom_histogram(color="black", fill=cols.beh[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,5.5), breaks=c(1:5), labels=c(1:5)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Trait C") + xlab("") + theme_pub()

to <- ggplot(data=data, aes(x=trait.o)) + geom_histogram(color="black", fill=cols.beh[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,5.5), breaks=c(1:5), labels=c(1:5)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Trait O") + xlab("") + theme_pub()

sh <- ggplot(data=data, aes(x=state.h)) + geom_histogram(color="black", fill=cols.beh[2], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("State H-H") + xlab("") + theme_pub()

se <- ggplot(data=data, aes(x=state.e)) + geom_histogram(color="black", fill=cols.beh[2], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("State E") + xlab("") + theme_pub()

sx <- ggplot(data=data, aes(x=state.x)) + geom_histogram(color="black", fill=cols.beh[2], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("State X") + xlab("") + theme_pub()

sa <- ggplot(data=data, aes(x=state.a)) + geom_histogram(color="black", fill=cols.beh[2], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("State A") + xlab("") + theme_pub()

sc <- ggplot(data=data, aes(x=state.c)) + geom_histogram(color="black", fill=cols.beh[2], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("State C") + xlab("") + theme_pub()

so <- ggplot(data=data, aes(x=state.o)) + geom_histogram(color="black", fill=cols.beh[2], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("State O") + xlab("") + theme_pub()

d <- ggplot(data=data, aes(x=dut)) + geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Duty") + xlab("") + theme_pub()

i <- ggplot(data=data, aes(x=int)) + geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Intellect") + xlab("") + theme_pub()

a <- ggplot(data=data, aes(x=adv)) + geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Adversity") + xlab("") + theme_pub()

m <- ggplot(data=data, aes(x=mat)) + geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Mating") + xlab("") + theme_pub()

o <- ggplot(data=data, aes(x=pos)) + geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("pOsitivity") + xlab("") + theme_pub()

n <- ggplot(data=data, aes(x=neg)) + geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Negativity") + xlab("") + theme_pub()

de <- ggplot(data=data, aes(x=dec)) + geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Deception") + xlab("") + theme_pub()

s <- ggplot(data=data, aes(x=soc)) + geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   scale_x_continuous(limits=c(0.5,7.5), breaks=c(1:7), labels=c(1:7)) + scale_y_continuous(expand = c(0, 0.01)) +
   ggtitle("Sociality") + xlab("") + theme_pub()


# (th | te | tx | ta | tc | to) /
#    (sh | se | sx | sa | sc | so) /
#    (d | i | a | m) /
#    (o | n | de | s)


traits <- cowplot::plot_grid(th, te, tx, ta, tc, to, ncol=4)
states <- cowplot::plot_grid(sh, se, sx, sa, sc, so, ncol=4)
sits <- cowplot::plot_grid(d, i, a, m, o, n, de, s, ncol=4)

cowplot::plot_grid(traits, NULL, states, NULL, sits, ncol=1, rel_heights = c(1, 0.05, 1, 0.05, 1))
Histograms of the distributions of personality traits, personality states, and situation characteristics in the sample.

Figure 3: Histograms of the distributions of personality traits, personality states, and situation characteristics in the sample.

Manipulation Check

Share Decisions

Hypothesis

The behavior manipulation is related to participants’ actual behavior (i.e., number of share decisions and/or number of honest trials) such that participants in the ‘act honestly and agreeably’ condition make more share decisions and/or have more honest trials than participants in the ‘act dishonestly and disagreeably’ condition.

Descriptives

kable(describeBy(data$nCoop, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
      col.names = c("behavior condition", "situation condition", "vars", "n", "mean", "sd", "median", 
                    "trimmed", "mad", "min", "max", "range", "skew", "kurtosis"),
      row.names = FALSE,
      caption="Descriptive statistics of the number of share decisions in the different experimental groups.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Table 9: Descriptive statistics of the number of share decisions in the different experimental groups.
behavior condition situation condition vars n mean sd median trimmed mad min max range skew kurtosis
low agreeableness and honesty low adversity and deception 1 63 6.41 3.95 6.0 6.08 4.45 1 15 14 0.50 -0.82
high agreeableness and honesty low adversity and deception 1 76 11.00 3.69 11.5 11.39 4.45 1 15 14 -0.71 -0.39
low agreeableness and honesty high adversity and deception 1 49 3.92 3.48 3.0 3.27 2.97 1 15 14 1.78 2.76
high agreeableness and honesty high adversity and deception 1 62 6.13 4.32 4.0 5.66 2.97 1 15 14 0.91 -0.32

ANOVA

aov <- aov_car(nCoop ~ condition.beh * condition.sit + Error(ResponseId), data=data)
tab <- as.data.frame(nice(aov, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt;.001"
tab$Effect <- c("Behavior conditions", "Situation conditions", "Behavior x Situation conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i> value"),
      caption="Analysis of variance examining associations between experimental conditions and the number of share decisions.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em")
Table 10: Analysis of variance examining associations between experimental conditions and the number of share decisions.
Effect df F ηp2 p value
Behavior conditions 1, 246 46.76 .160 <.001
Situation conditions 1, 246 54.89 .182 <.001
Behavior x Situation conditions 1, 246 5.72 .023 .018

Visualization

# plot means and distributions
l <- ggplot(data, aes(x=condition.sit, y=nCoop)) + 
   theme_pub() + xlab("Situation conditions") + ylab("Number of decisions") + 
   ggtitle("Means and distributions") + ylim(c(0,15)) +
   geom_violin(aes(x = condition.sit, y = nCoop), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.beh) +
   facet_wrap(~condition.beh) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r <- ggplot(data %>% 
               group_by(condition.sit, condition.beh) %>% 
               summarise(m = mean(nCoop, na.rm=TRUE), 
                         sd = sd(nCoop, na.rm=T)), 
            aes(x = condition.sit, y = m, color = condition.beh)) +
   theme_pub() + xlab("Situation conditions") + ylab("Number of decisions") + 
   ggtitle("Main effects and interactions") + ylim(c(0,15)) +
   theme(legend.position=c(0.3,0.2), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.beh) +
   scale_fill_manual(values=cols.beh) +
   geom_line(aes(group = condition.beh), size=1.5) +
   geom_point(size=2.5) 


# combine plots
(l | plot_spacer() | r) + plot_annotation(tag_levels = "A") + plot_layout(width=c(1,0.1,1))
Associations between the experimental conditions and the number of share decisions.

Figure 4: Associations between the experimental conditions and the number of share decisions.

Honest Decisions

Hypothesis

The behavior manipulation is related to participants’ actual behavior (i.e., number of share decisions and/or number of honest trials) such that participants in the ‘act honestly and agreeably’ condition make more share decisions and/or have more honest trials than participants in the ‘act dishonestly and disagreeably’ condition.

Descriptives

kable(describeBy(data$nHon, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
      col.names = c("behavior condition", "situation condition", "vars", "n", "mean", "sd", "median", 
                    "trimmed", "mad", "min", "max", "range", "skew", "kurtosis"),
      row.names = FALSE,
      caption="Descriptive statistics of the number of honest decisions in the different experimental groups.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Table 11: Descriptive statistics of the number of honest decisions in the different experimental groups.
behavior condition situation condition vars n mean sd median trimmed mad min max range skew kurtosis
low agreeableness and honesty low adversity and deception 1 80 9.76 3.96 10.0 9.95 5.19 2 15 13 -0.21 -1.12
high agreeableness and honesty low adversity and deception 1 78 12.09 2.78 12.5 12.38 3.71 5 15 10 -0.64 -0.66
low agreeableness and honesty high adversity and deception 1 73 10.21 4.05 11.0 10.63 4.45 1 15 14 -0.67 -0.44
high agreeableness and honesty high adversity and deception 1 66 10.83 3.16 11.0 11.00 4.45 4 15 11 -0.24 -1.03

ANOVA

hon.aov <- aov_car(nHon ~ condition.beh * condition.sit + Error(ResponseId), data=data)
tab <- as.data.frame(nice(aov, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt;.001"
tab$Effect <- c("Behavior conditions", "Situation conditions", "Behavior x Situation conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i> value"),
      caption="Analysis of variance examining associations between experimental conditions and the number of honest decisions.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em")
Table 12: Analysis of variance examining associations between experimental conditions and the number of honest decisions.
Effect df F ηp2 p value
Behavior conditions 1, 246 46.76 .160 <.001
Situation conditions 1, 246 54.89 .182 <.001
Behavior x Situation conditions 1, 246 5.72 .023 .018

Visualization

# plot means and distributions
l <- ggplot(data, aes(x=condition.sit, y=nHon)) + 
   theme_pub() + xlab("Situation conditions") + ylab("Number of decisions") + 
   ggtitle("Means and distributions") + ylim(c(0,15)) +
   geom_violin(aes(x = condition.sit, y = nHon), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.beh) +
   facet_wrap(~condition.beh) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r <- ggplot(data %>% 
               group_by(condition.sit, condition.beh) %>% 
               summarise(groups = mean(nHon, na.rm=TRUE)), 
            aes(x = condition.sit, y = groups, color = condition.beh)) +
   theme_pub() + xlab("Situation conditions") + ylab("Number of decisions") + 
   ggtitle("Main effects and interactions") + ylim(c(0,15)) +
   theme(legend.position=c(0.3,0.2), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.beh) +
   geom_line(aes(group = condition.beh), size=1.5) +
   geom_point(size=2.5) 


# combine plots
(l | plot_spacer() | r) + plot_annotation(tag_levels = "A") + plot_layout(width=c(1,0.1,1))
Associations between the experimental conditions and the number of honest decisions.

Figure 5: Associations between the experimental conditions and the number of honest decisions.

State Agreeableness

Hypothesis

The behavior manipulation is also related to participants’ self-reported behavior (i.e., state Agreeableness and/or state Honesty-Humility) such that participants in the ‘act honestly and agreeably’ condition report higher levels of state Agreeableness and/or state Honesty-Humility than participants in the ‘act dishonestly and disagreeably’ condition.

Descriptives

kable(describeBy(data$state.a, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
      col.names = c("behavior condition", "situation condition", "vars", "n", "mean", "sd", "median", 
                    "trimmed", "mad", "min", "max", "range", "skew", "kurtosis"),
      row.names = FALSE,
      caption="Descriptive statistics of state agreeableness in the different experimental groups.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Table 13: Descriptive statistics of state agreeableness in the different experimental groups.
behavior condition situation condition vars n mean sd median trimmed mad min max range skew kurtosis
low agreeableness and honesty low adversity and deception 1 70 4.33 1.76 4.50 4.39 1.85 1.00 7 6.00 -0.20 -0.87
high agreeableness and honesty low adversity and deception 1 67 5.53 1.21 5.75 5.65 1.11 1.75 7 5.25 -0.83 0.50
low agreeableness and honesty high adversity and deception 1 61 4.32 1.54 4.00 4.30 1.11 1.00 7 6.00 0.17 -0.52
high agreeableness and honesty high adversity and deception 1 59 4.90 1.52 5.25 5.02 1.48 1.00 7 6.00 -0.69 -0.01

ANOVA

aov <- aov_car(state.a ~ condition.beh * condition.sit + Error(ResponseId), data=data)
tab <- as.data.frame(nice(aov, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt;.001"
tab$Effect <- c("Behavior conditions", "Situation conditions", "Behavior x Situation conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i> value"),
      caption="Analysis of variance examining associations between experimental conditions and state agreeableness.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em")
Table 14: Analysis of variance examining associations between experimental conditions and state agreeableness.
Effect df F ηp2 p value
Behavior conditions 1, 253 21.92 .080 <.001
Situation conditions 1, 253 2.86 .011 .092
Behavior x Situation conditions 1, 253 2.64 .010 .106

Visualization

# plot means and distributions
l <- ggplot(data, aes(x=condition.sit, y=state.a)) + 
   theme_pub() + xlab("Situation conditions") + ylab("State agreeableness score") + 
   ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.sit, y = state.a), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.beh) +
   facet_wrap(~condition.beh) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r <- ggplot(data %>% 
               group_by(condition.sit, condition.beh) %>% 
               summarise(groups = mean(state.a, na.rm=TRUE)), 
            aes(x = condition.sit, y = groups, color = condition.beh)) +
   theme_pub() + xlab("Situation conditions") + ylab("State agreeableness score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.3,0.2), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.beh) +
   geom_line(aes(group = condition.beh), size=1.5) +
   geom_point(size=2.5) 


# combine plots
(l | plot_spacer() | r) + plot_annotation(tag_levels = "A") + plot_layout(width=c(1,0.1,1))
Associations between the experimental conditions and state agreeableness.

Figure 6: Associations between the experimental conditions and state agreeableness.

State Honesty-Humility

Hypothesis

The behavior manipulation is also related to participants’ self-reported behavior (i.e., state Agreeableness and/or state Honesty-Humility) such that participants in the ‘act honestly and agreeably’ condition report higher levels of state Agreeableness and/or state Honesty-Humility than participants in the ‘act dishonestly and disagreeably’ condition.

Descriptives

kable(describeBy(data$state.h, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
      row.names = FALSE,
      col.names = c("behavior condition", "situation condition", "vars", "n", "mean", "sd", "median", 
                    "trimmed", "mad", "min", "max", "range", "skew", "kurtosis"),
      caption="Descriptive statistics of state honesty-humility in the different experimental groups.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Table 15: Descriptive statistics of state honesty-humility in the different experimental groups.
behavior condition situation condition vars n mean sd median trimmed mad min max range skew kurtosis
low agreeableness and honesty low adversity and deception 1 70 3.69 2.00 3.38 3.62 2.41 1.00 7 6.00 0.27 -1.22
high agreeableness and honesty low adversity and deception 1 67 5.55 1.33 5.50 5.69 1.85 2.25 7 4.75 -0.68 -0.49
low agreeableness and honesty high adversity and deception 1 61 3.45 1.84 3.25 3.32 2.22 1.00 7 6.00 0.46 -0.88
high agreeableness and honesty high adversity and deception 1 59 5.03 1.65 5.50 5.17 1.85 1.00 7 6.00 -0.64 -0.51

ANOVA

aov <- aov_car(state.h ~ condition.beh * condition.sit + Error(ResponseId), data=data)
tab <- as.data.frame(nice(aov, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt;.001"
tab$Effect <- c("Behavior conditions", "Situation conditions", "Behavior x Situation conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i> value"),
      caption="Analysis of variance examining associations between experimental conditions and state honesty-humility.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em")
Table 16: Analysis of variance examining associations between experimental conditions and state honesty-humility.
Effect df F ηp2 p value
Behavior conditions 1, 253 63.16 .200 <.001
Situation conditions 1, 253 3.14 .012 .077
Behavior x Situation conditions 1, 253 0.42 .002 .516

Visualization

# plot means and distributions
l <- ggplot(data, aes(x=condition.sit, y=state.h)) + 
   theme_pub() + xlab("Situation conditions")  + ylab("State honesty-humility score") + 
   ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.sit, y = state.h), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.beh) +
   facet_wrap(~condition.beh) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r <- ggplot(data %>% 
               group_by(condition.sit, condition.beh) %>% 
               summarise(groups = mean(state.h, na.rm=TRUE)), 
            aes(x = condition.sit, y = groups, color = condition.beh)) +
   theme_pub() + xlab("Situation conditions") + ylab("State honesty-humility score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.3,0.2), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.beh) +
   geom_line(aes(group = condition.beh), size=1.5) +
   geom_point(size=2.5) 


# combine plots
(l | plot_spacer() | r) + plot_annotation(tag_levels = "A") + plot_layout(width=c(1,0.1,1))
Associations between the experimental conditions and state honesty-humility.

Figure 7: Associations between the experimental conditions and state honesty-humility.

Adversity

Hypothesis

The situation manipulation is related to participants’ self-reported situation perceptions (i.e., Deception and/or Adversity of the situation) such that participants in the ‘trustworthy partner’ condition report lower levels of perceived Deception and/or Adversity than participants in the ‘untrustworthy opponent’ condition.

Descriptives

kable(describeBy(data$adv, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
      col.names = c("behavior condition", "situation condition", "vars", "n", "mean", "sd", "median", 
                    "trimmed", "mad", "min", "max", "range", "skew", "kurtosis"),
      row.names = FALSE,
      caption="Descriptive statistics of adversity in the different experimental groups.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Table 17: Descriptive statistics of adversity in the different experimental groups.
behavior condition situation condition vars n mean sd median trimmed mad min max range skew kurtosis
low agreeableness and honesty low adversity and deception 1 83 2.37 1.47 2.00 2.19 1.48 1 7.00 6.00 0.84 -0.20
high agreeableness and honesty low adversity and deception 1 77 2.05 1.27 1.33 1.87 0.49 1 5.33 4.33 1.03 -0.23
low agreeableness and honesty high adversity and deception 1 76 2.52 1.58 2.33 2.34 1.98 1 7.00 6.00 0.69 -0.60
high agreeableness and honesty high adversity and deception 1 68 2.80 1.83 2.33 2.56 1.98 1 7.00 6.00 0.92 -0.15

ANOVA

aov <- aov_car(adv ~ condition.beh * condition.sit + Error(ResponseId), data=data)
tab <- as.data.frame(nice(aov, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt;.001"
tab$Effect <- c("Behavior conditions", "Situation conditions", "Behavior x Situation conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i> value"),
      caption="Analysis of variance examining associations between experimental conditions and adversity.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(1, width = "15em") %>% 
   column_spec(c(2:4), width = "8em")
</.001>
Table 18: Analysis of variance examining associations between experimental conditions and adversity.
Effect df F ηp2 p value
Behavior conditions 1, 300 0.01 <.001> .930
Situation conditions 1, 300 6.44 .021 .012
Behavior x Situation conditions 1, 300 2.90 .010 .090

Visualization

# plot means and distributions
l <- ggplot(data, aes(x=condition.beh, y=adv)) + 
   theme_pub() + xlab("Behavior conditions")  + ylab("Adversity score") + ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.beh, y = adv), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.sit) +
   facet_wrap(~condition.sit) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r <- ggplot(data %>% 
               group_by(condition.sit, condition.beh) %>% 
               summarise(groups = mean(adv, na.rm=TRUE)), 
            aes(x = condition.beh, y = groups, color = condition.sit)) +
   theme_pub() + xlab("Behavior conditions") + ylab("Adversity score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.25,0.85), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.sit) +
   geom_line(aes(group = condition.sit), size=1.5) +
   geom_point(size=2.5) 


# combine plots
(l | plot_spacer() | r) + plot_annotation(tag_levels = "A") + plot_layout(width=c(1,0.1,1))
Associations between the experimental conditions and adversity.

Figure 8: Associations between the experimental conditions and adversity.

Deception

Hypothesis

The situation manipulation is related to participants’ self-reported situation perceptions (i.e., Deception and/or Adversity of the situation) such that participants in the ‘trustworthy partner’ condition report lower levels of perceived Deception and/or Adversity than participants in the ‘untrustworthy opponent’ condition.

Descriptives

kable(describeBy(data$dec, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
      col.names = c("behavior condition", "situation condition", "vars", "n", "mean", "sd", "median", 
                    "trimmed", "mad", "min", "max", "range", "skew", "kurtosis"),
      row.names = FALSE,
      caption="Descriptive statistics of deception in the different experimental groups.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Table 19: Descriptive statistics of deception in the different experimental groups.
behavior condition situation condition vars n mean sd median trimmed mad min max range skew kurtosis
low agreeableness and honesty low adversity and deception 1 82 5.46 1.34 5.67 5.58 1.48 2.67 7 4.33 -0.49 -1.00
high agreeableness and honesty low adversity and deception 1 79 5.08 1.44 5.00 5.22 0.99 1.00 7 6.00 -0.93 0.75
low agreeableness and honesty high adversity and deception 1 75 5.47 1.37 6.00 5.60 1.48 2.00 7 5.00 -0.54 -0.71
high agreeableness and honesty high adversity and deception 1 68 5.39 1.50 5.67 5.57 1.48 1.00 7 6.00 -0.98 0.52

ANOVA

aov <- aov_car(dec ~ condition.beh * condition.sit + Error(ResponseId), data=data)
tab <- as.data.frame(nice(aov, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt;.001"
tab$Effect <- c("Behavior conditions", "Situation conditions", "Behavior x Situation conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i> value"),
      caption="Analysis of variance examining associations between experimental conditions and deception.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em")
Table 20: Analysis of variance examining associations between experimental conditions and deception.
Effect df F ηp2 p value
Behavior conditions 1, 300 2.11 .007 .147
Situation conditions 1, 300 0.97 .003 .326
Behavior x Situation conditions 1, 300 0.88 .003 .350

Visualization

# plot means and distributions
l <- ggplot(data, aes(x=condition.beh, y=dec)) + 
   theme_pub() + xlab("Behavior conditions")  + ylab("Deception score") + ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.beh, y = dec), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.sit) +
   facet_wrap(~condition.sit) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r <- ggplot(data %>% 
               group_by(condition.sit, condition.beh) %>% 
               summarise(groups = mean(dec, na.rm=TRUE)), 
            aes(x = condition.beh, y = groups, color = condition.sit)) +
   theme_pub() + xlab("Behavior conditions") + ylab("Deception score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.25,0.2), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.sit) +
   geom_line(aes(group = condition.sit), size=1.5) +
   geom_point(size=2.5) 


# combine plots
(l | plot_spacer() | r) + plot_annotation(tag_levels = "A") + plot_layout(width=c(1,0.1,1))
Associations between the experimental conditions and deception.

Figure 9: Associations between the experimental conditions and deception.

Not Targeted Personality States and Situation Characteristics

Hypothesis

The manipulations are neither related to the reported levels of state openness, state conscientiousness, state extraversion, and state emotional stability nor to the reported levels of Duty, Intellect, Mating, pOsitivity, Negativity, and Sociality.

Descriptives

tab <- bind_rows(describeBy(data$state.e, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$state.x, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$state.c, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$state.o, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$dut, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$int, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$mat, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$pos, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$neg, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$soc, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],)

kable(tab,
      row.names = FALSE,
      col.names = c("behavior condition", "situation condition", "vars", "n", "mean", "sd", "median", 
                    "trimmed", "mad", "min", "max", "range", "skew", "kurtosis"),
      caption="Descriptive statistics of the remaining personality states and situation characteristics in the different experimental groups.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T)  %>% 
   pack_rows("State Emotionality", 1, 4) %>%
   pack_rows("State Extraversion", 5, 8) %>%
   pack_rows("State Conscientiousness", 9, 12) %>%
   pack_rows("State Openness", 13, 16) %>%
   pack_rows("Duty", 17, 20) %>%
   pack_rows("Intellect", 21, 24) %>%
   pack_rows("Mating", 25, 28) %>%
   pack_rows("pOsitivity", 29, 32) %>%
   pack_rows("Negativity", 33, 36) %>%
   pack_rows("Sociality", 37, 40)
Table 21: Descriptive statistics of the remaining personality states and situation characteristics in the different experimental groups.
behavior condition situation condition vars n mean sd median trimmed mad min max range skew kurtosis
State Emotionality
low agreeableness and honesty low adversity and deception 1 70 2.94 1.80 3.0 2.70 1.48 1 7 6 0.82 -0.09
high agreeableness and honesty low adversity and deception 1 67 2.46 1.64 2.0 2.20 1.48 1 7 6 1.15 0.49
low agreeableness and honesty high adversity and deception 1 61 2.90 1.89 2.0 2.67 1.48 1 7 6 0.64 -0.73
high agreeableness and honesty high adversity and deception 1 59 2.41 1.54 2.0 2.22 1.48 1 7 6 0.92 -0.07
State Extraversion
low agreeableness and honesty low adversity and deception 1 70 4.07 1.83 4.0 4.09 1.48 1 7 6 0.06 -0.82
high agreeableness and honesty low adversity and deception 1 67 4.12 1.84 4.0 4.15 1.48 1 7 6 -0.04 -0.85
low agreeableness and honesty high adversity and deception 1 61 3.70 1.89 4.0 3.63 1.48 1 7 6 0.22 -0.91
high agreeableness and honesty high adversity and deception 1 59 3.58 2.08 3.0 3.49 1.48 1 7 6 0.46 -1.05
State Conscientiousness
low agreeableness and honesty low adversity and deception 1 70 4.87 1.83 5.0 5.07 1.48 1 7 6 -0.72 -0.40
high agreeableness and honesty low adversity and deception 1 67 5.54 1.23 5.0 5.60 1.48 3 7 4 -0.23 -1.14
low agreeableness and honesty high adversity and deception 1 61 5.00 1.87 5.0 5.24 1.48 1 7 6 -0.74 -0.36
high agreeableness and honesty high adversity and deception 1 59 5.51 1.44 6.0 5.65 1.48 1 7 6 -0.98 0.98
State Openness
low agreeableness and honesty low adversity and deception 1 70 4.73 1.89 5.0 4.91 1.48 1 7 6 -0.70 -0.44
high agreeableness and honesty low adversity and deception 1 67 5.60 1.26 6.0 5.71 1.48 2 7 5 -0.62 -0.35
low agreeableness and honesty high adversity and deception 1 61 4.92 1.73 5.0 5.10 1.48 1 7 6 -0.64 -0.36
high agreeableness and honesty high adversity and deception 1 59 5.12 1.60 5.0 5.24 1.48 1 7 6 -0.44 -0.71
Duty
low agreeableness and honesty low adversity and deception 1 83 4.43 1.87 4.0 4.54 1.48 1 7 6 -0.26 -0.75
high agreeableness and honesty low adversity and deception 1 79 4.23 1.85 4.0 4.28 1.48 1 7 6 -0.26 -0.89
low agreeableness and honesty high adversity and deception 1 75 4.47 1.93 4.0 4.57 2.97 1 7 6 -0.33 -0.98
high agreeableness and honesty high adversity and deception 1 68 4.59 1.93 5.0 4.71 1.48 1 7 6 -0.52 -0.71
Intellect
low agreeableness and honesty low adversity and deception 1 83 3.80 2.10 4.0 3.75 2.97 1 7 6 -0.01 -1.38
high agreeableness and honesty low adversity and deception 1 77 3.51 1.84 4.0 3.46 1.48 1 7 6 -0.02 -1.20
low agreeableness and honesty high adversity and deception 1 76 3.58 1.91 4.0 3.52 2.97 1 7 6 0.14 -1.20
high agreeableness and honesty high adversity and deception 1 68 3.88 2.23 4.0 3.86 2.97 1 7 6 0.03 -1.41
Mating
low agreeableness and honesty low adversity and deception 1 84 2.21 1.76 1.0 1.90 0.00 1 7 6 1.14 0.02
high agreeableness and honesty low adversity and deception 1 79 2.43 1.79 2.0 2.17 1.48 1 7 6 1.00 -0.17
low agreeableness and honesty high adversity and deception 1 76 2.05 1.56 1.0 1.74 0.00 1 7 6 1.59 1.70
high agreeableness and honesty high adversity and deception 1 68 2.51 2.06 1.0 2.20 0.00 1 7 6 0.98 -0.49
pOsitivity
low agreeableness and honesty low adversity and deception 1 84 3.75 1.96 4.0 3.69 2.97 1 7 6 0.12 -1.12
high agreeableness and honesty low adversity and deception 1 79 4.44 1.61 4.0 4.52 1.48 1 7 6 -0.33 -0.22
low agreeableness and honesty high adversity and deception 1 76 3.33 1.76 3.5 3.19 2.22 1 7 6 0.47 -0.59
high agreeableness and honesty high adversity and deception 1 68 4.10 2.05 4.0 4.12 2.97 1 7 6 -0.20 -1.13
Negativity
low agreeableness and honesty low adversity and deception 1 84 3.71 2.03 4.0 3.65 2.97 1 7 6 0.10 -1.17
high agreeableness and honesty low adversity and deception 1 79 3.01 1.90 3.0 2.85 2.97 1 7 6 0.45 -1.05
low agreeableness and honesty high adversity and deception 1 76 3.83 2.19 4.0 3.79 2.97 1 7 6 0.04 -1.40
high agreeableness and honesty high adversity and deception 1 68 3.68 2.28 4.0 3.61 2.97 1 7 6 0.19 -1.49
Sociality
low agreeableness and honesty low adversity and deception 1 84 4.14 1.99 4.0 4.18 2.97 1 7 6 -0.29 -1.07
high agreeableness and honesty low adversity and deception 1 78 4.44 1.83 5.0 4.53 1.48 1 7 6 -0.50 -0.73
low agreeableness and honesty high adversity and deception 1 76 4.16 2.01 4.0 4.19 2.97 1 7 6 -0.22 -1.19
high agreeableness and honesty high adversity and deception 1 68 4.38 2.14 4.0 4.46 2.97 1 7 6 -0.27 -1.18

ANOVA

aov.e <- aov_car(state.e ~ condition.beh * condition.sit + Error(ResponseId), data=data)
aov.x <- aov_car(state.x ~ condition.beh * condition.sit + Error(ResponseId), data=data)
aov.c <- aov_car(state.c ~ condition.beh * condition.sit + Error(ResponseId), data=data)
aov.o <- aov_car(state.o ~ condition.beh * condition.sit + Error(ResponseId), data=data)
aov.dut <- aov_car(dut ~ condition.beh * condition.sit + Error(ResponseId), data=data)
aov.int <- aov_car(int ~ condition.beh * condition.sit + Error(ResponseId), data=data)
aov.mat <- aov_car(mat ~ condition.beh * condition.sit + Error(ResponseId), data=data)
aov.pos <- aov_car(pos ~ condition.beh * condition.sit + Error(ResponseId), data=data)
aov.neg <- aov_car(neg ~ condition.beh * condition.sit + Error(ResponseId), data=data)
aov.soc <- aov_car(dec ~ condition.beh * condition.sit + Error(ResponseId), data=data)


tab <- bind_rows(as.data.frame(nice(aov.e, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.x, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.c, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.o, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.dut, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.int, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.mat, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.pos, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.neg, es="pes", sig_symbols = rep("", 4), MSE=FALSE)),
                 as.data.frame(nice(aov.soc, es="pes", sig_symbols = rep("", 4), MSE=FALSE))
)

tab$p.value[tab$p.value=="<.001"] <- "&lt;.001"
tab$pes[tab$pes=="<.001"] <- "&lt;.001"
tab$Effect <- rep(c("Behavior conditions", "Situation conditions", "Behavior x Situation conditions"),10)

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i> value"),
      caption="Analyses of variance examining associations between experimental conditions and the remaining personality states and situation characteristics.") %>% 
   pack_rows("DV: State Emotionality", 1, 3) %>%
   pack_rows("DV: State Extraversion", 4, 6) %>%
   pack_rows("DV: State Conscientiousness", 7, 9) %>%
   pack_rows("DV: State Openness", 10, 12) %>%
   pack_rows("DV: Duty", 13, 15) %>%
   pack_rows("DV: Intellect", 16, 18) %>%
   pack_rows("DV: Mating", 19, 21) %>%
   pack_rows("DV: pOsitivity", 22, 24) %>%
   pack_rows("DV: Negativity", 25, 27) %>%
   pack_rows("DV: Sociality", 28, 30) %>%  
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em")
Table 22: Analyses of variance examining associations between experimental conditions and the remaining personality states and situation characteristics.
Effect df F ηp2 p value
DV: State Emotionality
Behavior conditions 1, 253 5.10 .020 .025
Situation conditions 1, 253 0.05 <.001 .822
Behavior x Situation conditions 1, 253 0.00 <.001 .973
DV: State Extraversion
Behavior conditions 1, 253 0.03 <.001 .866
Situation conditions 1, 253 3.64 .014 .057
Behavior x Situation conditions 1, 253 0.14 <.001 .711
DV: State Conscientiousness
Behavior conditions 1, 253 8.41 .032 .004
Situation conditions 1, 253 0.06 <.001 .806
Behavior x Situation conditions 1, 253 0.15 <.001 .698
DV: State Openness
Behavior conditions 1, 253 6.83 .026 .009
Situation conditions 1, 253 0.50 .002 .481
Behavior x Situation conditions 1, 253 2.67 .010 .104
DV: Duty
Behavior conditions 1, 301 0.04 <.001 .846
Situation conditions 1, 301 0.82 .003 .367
Behavior x Situation conditions 1, 301 0.57 .002 .452
DV: Intellect
Behavior conditions 1, 300 0.00 <.001 .975
Situation conditions 1, 300 0.12 <.001 .732
Behavior x Situation conditions 1, 300 1.62 .005 .204
DV: Mating
Behavior conditions 1, 303 2.73 .009 .100
Situation conditions 1, 303 0.04 <.001 .851
Behavior x Situation conditions 1, 303 0.36 .001 .550
DV: pOsitivity
Behavior conditions 1, 303 12.05 .038 <.001
Situation conditions 1, 303 3.24 .011 .073
Behavior x Situation conditions 1, 303 0.04 <.001 .848
DV: Negativity
Behavior conditions 1, 303 3.17 .010 .076
Situation conditions 1, 303 2.63 .009 .106
Behavior x Situation conditions 1, 303 1.31 .004 .254
DV: Sociality
Behavior conditions 1, 300 2.11 .007 .147
Situation conditions 1, 300 0.97 .003 .326
Behavior x Situation conditions 1, 300 0.88 .003 .350

Visualization

#### Personality States

### State Emotionality

# plot means and distributions
l1 <- ggplot(data, aes(x=condition.sit, y=state.e)) + 
   theme_pub() + xlab("Situation conditions")  + ylab("State emotionality score") + 
   ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.sit, y = state.e), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.beh) +
   facet_wrap(~condition.beh) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r1 <- ggplot(data %>% 
                group_by(condition.sit, condition.beh) %>% 
                summarise(groups = mean(state.e, na.rm=TRUE)), 
             aes(x = condition.sit, y = groups, color = condition.beh)) +
   theme_pub() + xlab("Situation conditions") + ylab("State emotionality score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.3,0.85), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.beh) +
   geom_line(aes(group = condition.beh), size=1.5) +
   geom_point(size=2.5) 

row1 <- (l1 | plot_spacer() | r1) + plot_layout(width=c(1,0.1,1))



### State Extraversion

# plot means and distributions
l2 <- ggplot(data, aes(x=condition.sit, y=state.x)) + 
   theme_pub() + xlab("Situation conditions")  + ylab("State extraversion score") + 
   ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.sit, y = state.x), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.beh) +
   facet_wrap(~condition.beh) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r2 <- ggplot(data %>% 
                group_by(condition.sit, condition.beh) %>% 
                summarise(groups = mean(state.x, na.rm=TRUE)), 
             aes(x = condition.sit, y = groups, color = condition.beh)) +
   theme_pub() + xlab("Situation conditions") + ylab("State extraversion score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.3,0.2), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.beh) +
   geom_line(aes(group = condition.beh), size=1.5) +
   geom_point(size=2.5) 

row2 <- (l2 | plot_spacer() | r2) + plot_layout(width=c(1,0.1,1))



### State Conscientiousness

# plot means and distributions
l3 <- ggplot(data, aes(x=condition.sit, y=state.c)) + 
   theme_pub() + xlab("Situation conditions") + ylab("State conscientiousness score") + 
   ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.sit, y = state.c), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.beh) +
   facet_wrap(~condition.beh) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r3 <- ggplot(data %>% 
                group_by(condition.sit, condition.beh) %>% 
                summarise(groups = mean(state.c, na.rm=TRUE)), 
             aes(x = condition.sit, y = groups, color = condition.beh)) +
   theme_pub() + xlab("Situation conditions") + ylab("State conscientiousness score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.3,0.2), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.beh) +
   geom_line(aes(group = condition.beh), size=1.5) +
   geom_point(size=2.5) 

row3 <- (l3 | plot_spacer() | r3) + plot_layout(width=c(1,0.1,1))



### State Openness

# plot means and distributions
l4 <- ggplot(data, aes(x=condition.sit, y=state.o)) + 
   theme_pub() + xlab("Situation conditions") + ylab("State openness score") + ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.sit, y = state.o), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.beh) +
   facet_wrap(~condition.beh) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r4 <- ggplot(data %>% 
                group_by(condition.sit, condition.beh) %>% 
                summarise(groups = mean(state.o, na.rm=TRUE)), 
             aes(x = condition.sit, y = groups, color = condition.beh)) +
   theme_pub() + xlab("Situation conditions") + ylab("State openness score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.3,0.2), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.beh) +
   geom_line(aes(group = condition.beh), size=1.5) +
   geom_point(size=2.5) 

row4 <- (l4 | plot_spacer() | r4) + plot_layout(width=c(1,0.1,1))



### titles

e <- ggdraw() + draw_label("State Emotionality", fontface = c('bold'), size=14, hjust = 0.5, lineheight = 1) 
x <- ggdraw() + draw_label("State Extraversion", fontface = c('bold'), size=14, hjust = 0.5, lineheight = 1) 
c <- ggdraw() + draw_label("State Conscientiousness", fontface = c('bold'), size=14, hjust = 0.5, lineheight = 1) 
o <- ggdraw() + draw_label("State Openness", fontface = c('bold'), size=14, hjust = 0.5, lineheight = 1) 




### combine plots
e/
   row1 /
   x/
   row2/
   c/
   row3/
   o/
   row4 + plot_layout(heights=rep(c(0.3,1),4)) #+ plot_annotation(tag_levels = c("A", "", "", 
Associations between the experimental conditions and the remaining personality states.

Figure 10: Associations between the experimental conditions and the remaining personality states.

#                                                                              "B", "", "", 
#                                                                              "C", "", "",
#                                                                              "D", "", "")) 
#### Situation characteristics

### Duty

# plot means and distributions
l1 <- ggplot(data, aes(x=condition.beh, y=dut)) + 
   theme_pub() + xlab("Behavior conditions") + ylab("Duty score") + ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.beh, y = dut), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.sit) +
   facet_wrap(~condition.sit) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r1 <- ggplot(data %>% 
                group_by(condition.sit, condition.beh) %>% 
                summarise(groups = mean(dut, na.rm=TRUE)), 
             aes(x = condition.beh, y = groups, color = condition.sit)) +
   theme_pub() + xlab("Behavior conditions") + ylab("Duty score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.25,0.85), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.sit) +
   geom_line(aes(group = condition.sit), size=1.5) +
   geom_point(size=2.5) 

row1 <- (l1 | plot_spacer() | r1) + plot_layout(widths=c(1,0.1,1))



### Intellect

# plot means and distributions
l2 <- ggplot(data, aes(x=condition.beh, y=int)) + 
   theme_pub() + xlab("Behavior conditions") + ylab("Intellect score") + ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.beh, y = int), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.sit) +
   facet_wrap(~condition.sit) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r2 <- ggplot(data %>% 
                group_by(condition.sit, condition.beh) %>% 
                summarise(groups = mean(int, na.rm=TRUE)), 
             aes(x = condition.beh, y = groups, color = condition.sit)) +
   theme_pub() + xlab("Behavior conditions") + ylab("Intellect score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.25,0.85), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.sit) +
   geom_line(aes(group = condition.sit), size=1.5) +
   geom_point(size=2.5) 

row2 <- (l2 | plot_spacer() | r2) + plot_layout(widths=c(1,0.1,1))



### Mating

# plot means and distributions
l3 <- ggplot(data, aes(x=condition.beh, y=mat)) + 
   theme_pub() + xlab("Behavior conditions") + ylab("Mating score") + ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.beh, y = mat), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.sit) +
   facet_wrap(~condition.sit) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r3 <- ggplot(data %>% 
                group_by(condition.sit, condition.beh) %>% 
                summarise(groups = mean(mat, na.rm=TRUE)), 
             aes(x = condition.beh, y = groups, color = condition.sit)) +
   theme_pub() + xlab("Behavior conditions") + ylab("Mating score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.25,0.85), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.sit) +
   geom_line(aes(group = condition.sit), size=1.5) +
   geom_point(size=2.5) 

row3 <- (l3 | plot_spacer() | r3) + plot_layout(widths=c(1,0.1,1))



### pOsitivity

# plot means and distributions
l4 <- ggplot(data, aes(x=condition.beh, y=pos)) + 
   theme_pub() + xlab("Behavior conditions") + ylab("pOsitivity score") + ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.beh, y = pos), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.sit) +
   facet_wrap(~condition.sit) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r4 <- ggplot(data %>% 
                group_by(condition.sit, condition.beh) %>% 
                summarise(groups = mean(pos, na.rm=TRUE)), 
             aes(x = condition.beh, y = groups, color = condition.sit)) +
   theme_pub() + xlab("Behavior conditions") + ylab("pOsitivity score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.25,0.85), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.sit) +
   geom_line(aes(group = condition.sit), size=1.5) +
   geom_point(size=2.5) 

row4 <- (l4 | plot_spacer() | r4) + plot_layout(widths=c(1,0.1,1))



### Negativity

# plot means and distributions
l5 <- ggplot(data, aes(x=condition.beh, y=neg)) + 
   theme_pub() + xlab("Behavior conditions") + ylab("Negativity score") + ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.beh, y = neg), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.sit) +
   facet_wrap(~condition.sit) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r5 <- ggplot(data %>% 
                group_by(condition.sit, condition.beh) %>% 
                summarise(groups = mean(neg, na.rm=TRUE)), 
             aes(x = condition.beh, y = groups, color = condition.sit)) +
   theme_pub() + xlab("Behavior conditions") + ylab("Negativity score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.25,0.85), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.sit) +
   geom_line(aes(group = condition.sit), size=1.5) +
   geom_point(size=2.5) 

row5 <- (l5 | plot_spacer() | r5) + plot_layout(widths=c(1,0.1,1))



### Sociality

# plot means and distributions
l6 <- ggplot(data, aes(x=condition.beh, y=soc)) + 
   theme_pub() + xlab("Behavior conditions") + ylab("Sociality score") + ggtitle("Means and distributions") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   geom_violin(aes(x = condition.beh, y = soc), width=1, fill='#EEEEEE', color="#EEEEEE", trim=FALSE) +
   stat_summary(fun = mean, geom = "crossbar", width = 0.75, 
                position = position_dodge(width = .75), colour="#808080") +
   geom_jitter(aes(colour=condition.beh), shape = 16, width = .1, alpha=.5, size=2.5) + 
   scale_colour_manual(values=cols.sit) +
   facet_wrap(~condition.sit) + 
   theme(axis.text.x=element_text(angle=20, hjust=1, vjust=1)) +
   theme(legend.position="", strip.text.x = element_text(size=9,face="bold")) 


# plot interaction diagram
r6 <- ggplot(data %>% 
                group_by(condition.sit, condition.beh) %>% 
                summarise(groups = mean(soc, na.rm=TRUE)), 
             aes(x = condition.beh, y = groups, color = condition.sit)) +
   theme_pub() + xlab("Behavior conditions") + ylab("Sociality score") + 
   scale_y_continuous(limits=c(1,7), labels=c(1:7), breaks=c(1:7)) +
   ggtitle("Main effects and interactions") + 
   theme(legend.position=c(0.25,0.85), legend.direction="vertical") + labs(color = "") + 
   scale_colour_manual(values=cols.sit) +
   geom_line(aes(group = condition.sit), size=1.5) +
   geom_point(size=2.5) 

row6 <- (l6 | plot_spacer() | r6) + plot_layout(widths=c(1,0.1,1))



### titles

dut <- ggdraw() + draw_label("Duty", fontface = c('bold'), size=14, hjust = 0.5, lineheight = 1) 
int <- ggdraw() + draw_label("Intellect", fontface = c('bold'), size=14, hjust = 0.5, lineheight = 1) 
mat <- ggdraw() + draw_label("Mating", fontface = c('bold'), size=14, hjust = 0.5, lineheight = 1) 
pos <- ggdraw() + draw_label("pOsitivity", fontface = c('bold'), size=14, hjust = 0.5, lineheight = 1) 
neg <- ggdraw() + draw_label("Negativity", fontface = c('bold'), size=14, hjust = 0.5, lineheight = 1) 
soc <- ggdraw() + draw_label("Sociality", fontface = c('bold'), size=14, hjust = 0.5, lineheight = 1) 



### combine plots
dut/
   row1 /
   int/
   row2/
   mat/
   row3/
   pos/
   row4/
   neg/
   row5/
   soc/
   row6 + plot_layout(heights=rep(c(0.3,1),6)) #+ plot_annotation(tag_levels = c("A", "", "", 
Associations between the experimental conditions and the remaining situation characteristics.

Figure 11: Associations between the experimental conditions and the remaining situation characteristics.

#                                                                              "B", "", "", 
#                                                                              "C", "", "",
#                                                                              "D", "", "", 
#                                                                              "E", "", "", 
#                                                                              "F", "", "")) 

Replication of Main Effects

Hypothesis and Analystic Strategy

Hypothesis
H2a: Higher levels of reported state Agreeableness and state Honesty-Humility are associated with more positive mood.

H2b: Higher levels of perceived Deception and Adversity are associated with more negative mood.

Analytic Strategy
We estimated a multiple regression model with the positive affect dimension as the DV and grand-mean centered state Agreeableness, state Honesty-Humility, perceived Adversity, and perceived Deception as IVs. We will add trait Agreeableness and trait Honesty-Humility and their interactions with their corresponding personality states as predictors in a next step to examine between-person differences in the associations between personality states and mood. We included the experimental conditions as covariates in the regressions to control for the hierarchical data structure with participants nested in experimental conditions.

Additionally, we examined whether controlling for possible associations between the results of the game (points earned by the participant and difference between the participant’s and the computer’s points) and the DV by including these variables as covariates in the models changed the results.

Regression Models

## estimate models
h2 <- lm(mood.gb ~ state.a.c + state.h.c + adv.c + dec.c + 
             condition.beh + condition.sit, data=data, 
          contrasts = list(condition.beh = contr.sum, condition.sit = contr.sum))
h2.z <- lm(scale(mood.gb) ~ scale(state.a) + scale(state.h) + scale(adv) + scale(dec) + 
               condition.beh + condition.sit, data=data, 
            contrasts = list(condition.beh = contr.sum, condition.sit = contr.sum))

## estimate models
h2a <- lm(mood.gb ~ state.a.c + state.h.c + adv.c + dec.c + 
             points.c + points.diff + condition.beh + condition.sit, data=data, 
          contrasts = list(condition.beh = contr.sum, condition.sit = contr.sum))
h2a.z <- lm(scale(mood.gb) ~ scale(state.a) + scale(state.h) + scale(adv) + scale(dec) + 
               scale(points.c) + scale(points.diff) + condition.beh + condition.sit, data=data, 
            contrasts = list(condition.beh = contr.sum, condition.sit = contr.sum))
#summary(h2a)

h2a.2 <- lm(mood.gb ~ state.a.c + state.h.c + adv.c + dec.c + 
               points.c + points.diff + condition.beh + condition.sit +
               state.a.c*trait.a.c + state.h.c*trait.h.c, data=data, 
            contrasts = list(condition.beh = contr.sum, condition.sit = contr.sum))
h2a.2.z <- lm(scale(mood.gb) ~ scale(state.a) + scale(state.h) + scale(adv) + scale(dec) + 
                 scale(points.c) + scale(points.diff) + condition.beh + condition.sit +
                 scale(state.a)*scale(trait.a) + scale(state.h)*scale(trait.h), data=data, 
              contrasts = list(condition.beh = contr.sum, condition.sit = contr.sum))
#summary(h2a.2)



## build table

tab <- data.frame(predictor=rep(NA, nrow(summary(h2a.2)$coefficients)+1), Model1=NA, Model2=NA, Model3=NA)
tab[,1] <- c("(Intercept)", "State Agreeableness", "State Honesty-Humility", "Adversity", "Deception",
             "Points earned", "Difference in points", "Behavior conditions", "Situation conditions",
             "Trait Agreeableness", "Trait Honesty", "Trait A x State A", "Trait HH x State HH", "")
tab[c(1,2,3,4,5,8,9),2] <-  c(paste0(printnum(summary(h2.z)$coefficients[,1]), " ",
                                     stars(summary(h2.z)$coefficients[,4]),
                                     "<br>[",printnum(confint(h2.z)[,1]), ", ",
                                     printnum(confint(h2.z)[,2]), "]"))
tab[1:nrow(summary(h2a)$coefficients),3] <- c(paste0(printnum(summary(h2a.z)$coefficients[,1]), " ",
                                                     stars(summary(h2a.z)$coefficients[,4]),
                                                     "<br>[",printnum(confint(h2a.z)[,1]), ", ",
                                                     printnum(confint(h2a.z)[,2]), "]"))
tab[1:nrow(summary(h2a.2)$coefficients),4] <- c(paste0(printnum(summary(h2a.2.z)$coefficients[,1]), " ",
                                                       stars(summary(h2a.2.z)$coefficients[,4]),
                                                       "<br>[",printnum(confint(h2a.2.z)[,1]), ", ",
                                                       printnum(confint(h2a.2.z)[,2]), "]"))
tab[nrow(summary(h2a.2)$coefficients)+1,2:4] <- c(print.clean(apa_print(h2.z)$estimate$modelfit$r2),
                                                  paste0(print.clean(apa_print(h2a.z)$estimate$modelfit$r2),
                                                         "<br>&Delta; *R^2^* = ",
                                                         printnum(summary(h2a.z)$r.squared - 
                                                                     summary(h2.z)$r.squared), 
                                                         ", *F*(", anova(h2.z, h2a.z)[2,3], ", ", 
                                                         anova(h2.z, h2a.z)[2,1], ") = ", 
                                                         printnum(anova(h2.z, h2a.z)[2,5]), ", *p* ", 
                                                         printp(anova(h2.z, h2a.z)[2,6], 
                                                                add_equals = T)),
                                                  paste0(print.clean(apa_print(h2a.2.z)$estimate$modelfit$r2),
                                                         "<br>&Delta; *R^2^* = ",
                                                         printnum(summary(h2a.2.z)$r.squared - 
                                                                     summary(h2a.z)$r.squared), 
                                                         ", *F*(", anova(h2a.z, h2a.2.z)[2,3], ", ", 
                                                         anova(h2a.z, h2a.2.z)[2,1], ") = ", 
                                                         printnum(anova(h2a.z, h2a.2.z)[2,5]), ", *p* ", 
                                                         printp(anova(h2a.z, h2a.2.z)[2,6], 
                                                                add_equals = T)))

## print table
kable(
   tab
   , align = c("l", "c", "c", "c")
   , col.names = c("Predictor", "Model 1", "Model 2", "Model 3")
   , caption = "Multiple regression models of associations between positive affect and state agreeableness, state honesty-humility, deception, and adversity controlling for the outcome of the game and the experimental groups."
   , escape = FALSE
   , row.names = FALSE
) %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T)  %>% 
   column_spec(1, width = "15em") %>%
   pack_rows("Standardized Coefficients", 1, nrow(summary(h2a.2)$coefficients)) %>%
   pack_rows("Model Fit", nrow(summary(h2a.2)$coefficients)+1, nrow(summary(h2a.2)$coefficients)+1) %>%
   footnote(general="Values standardized regression coefficients, values in brackets represent 95% confidence intervals of the regression coefficients")
Table 23: Multiple regression models of associations between positive affect and state agreeableness, state honesty-humility, deception, and adversity controlling for the outcome of the game and the experimental groups.
Predictor Model 1 Model 2 Model 3
Standardized Coefficients
(Intercept) 0.02
[-0.09, 0.13]
0.03
[-0.08, 0.14]
0.04
[-0.07, 0.15]
State Agreeableness 0.26 **
[0.07, 0.46]
0.25 *
[0.05, 0.44]
0.23 *
[0.03, 0.43]
State Honesty-Humility 0.25 *
[0.04, 0.46]
0.32 **
[0.10, 0.54]
0.32 **
[0.10, 0.55]
Adversity -0.21 ***
[-0.32, -0.09]
-0.21 ***
[-0.32, -0.09]
-0.25 ***
[-0.38, -0.12]
Deception -0.05
[-0.17, 0.07]
-0.03
[-0.15, 0.09]
-0.01
[-0.13, 0.11]
Points earned -0.08
[-0.45, 0.29]
-0.09
[-0.46, 0.29]
Difference in points 0.21
[-0.11, 0.52]
0.22
[-0.10, 0.54]
Behavior conditions -0.04
[-0.16, 0.08]
-0.07
[-0.19, 0.05]
-0.07
[-0.20, 0.05]
Situation conditions 0.01
[-0.09, 0.12]
-0.02
[-0.21, 0.16]
-0.03
[-0.22, 0.16]
Trait Agreeableness 0.00
[-0.11, 0.11]
Trait Honesty -0.11
[-0.24, 0.02]
Trait A x State A -0.03
[-0.13, 0.07]
Trait HH x State HH 0.09
[-0.03, 0.21]
Model Fit
R2 = .33, 90% CI [0.24, 0.40] R2 = .35, 90% CI [0.24, 0.41]
Δ R2 = 0.01, F(2, 226) = 2.17, p = .117
R2 = .36, 90% CI [0.24, 0.41]
Δ R2 = 0.01, F(4, 222) = 0.98, p = .421
Note:
Values standardized regression coefficients, values in brackets represent 95% confidence intervals of the regression coefficients

Visualization

a <- ggplot(data, aes(x=state.a, y=mood.gb)) + 
   theme_pub() + xlab("State Agreeableness") + ylab("Positive affect") +
   scale_x_continuous(limits=c(1,7), breaks=c(1:7), labels=c(1:7)) +
   geom_jitter(size=2.5, alpha=.5, color=cols.beh[1]) + 
   geom_smooth(method="lm", color="black", size=1.2)

b <- ggplot(data, aes(x=state.h, y=mood.gb)) + 
   theme_pub() + xlab("State Honesty-Humility") + ylab("Positive affect") +
   scale_x_continuous(limits=c(1,7), breaks=c(1:7), labels=c(1:7)) +
   geom_jitter(size=2.5, alpha=.5, color=cols.beh[2]) + 
   geom_smooth(method="lm", color="black", size=1.2)

c <- ggplot(data, aes(x=adv, y=mood.gb)) + 
   theme_pub() + xlab("Adversity") + ylab("Positive affect") +
   scale_x_continuous(limits=c(1,7), breaks=c(1:7), labels=c(1:7)) +
   geom_jitter(size=2.5, alpha=.5, color=cols.sit[1]) + 
   geom_smooth(method="lm", color="black", size=1.2)

d <- ggplot(data, aes(x=dec, y=mood.gb)) + 
   theme_pub() + xlab("Deception") + ylab("Positive affect") +
   scale_x_continuous(limits=c(1,7), breaks=c(1:7), labels=c(1:7)) +
   geom_jitter(size=2.5, alpha=.5, color=cols.sit[2]) + 
   geom_smooth(method="lm", color="black", size=1.2)

r1 <- (a + plot_spacer() + b) + plot_layout(widths=c(1,0.1,1))
r2 <- (c + plot_spacer() + d) + plot_layout(widths=c(1,0.1,1))

r1/
   plot_spacer() /
   r2 + plot_annotation(tag_level="A") + plot_layout(heights=c(1,0.1,1))
Associations between positive affect and state agreeableness (A), state honesty-humility (B), adversity (C), and deception (D).

Figure 12: Associations between positive affect and state agreeableness (A), state honesty-humility (B), adversity (C), and deception (D).

Conclusion

Overall, the data mostly supported Hypothesis 2:

  • Higher levels of state agreeableness, β = 0.23, 95% CI [0.03, 0.43], and state honesty-humility, β = 0.32, 95% CI [0.10, 0.55], were significantly associated with more positive affect within groups

  • Higher levels of perceived adversity, β = -0.25, 95% CI [-0.38, -0.12], but not deception, β = -0.01, 95% CI [-0.13, 0.11], were significantly associated with less positive affect within groups

  • Trait agreeableness and trait adversity were not significantly associated with positive affect and neither were their interactions with the respective personality traits

Congruence and Positive Affect

Hypothesis & Analytic Strategy

Hypothesis

H3a: Congruence between personality trait and personality state is associated with positive affect such that trait-congruent personality states are related to more positive mood than trait-incongruent personality states.

H4a: Congruence between personality state and situation characteristic is associated with positive affect such that situation-congruent personality states are related to more positive mood than situation-incongruent personality states.

Analytic Strategy

Step 1: Analysis of Variance
We conducted a median split of trait Agreeableness / trait Honesty-Humility and conduct variance analyses with positive affect as DV and the variables representing behavior conditions and median-split personality traits and their interaction as IVs. This replicates analyses performed in Zelenski et al. (2012).

Additionally, we examined whether controlling for possible associations between the results of the game (points earned by the participant and difference between the participant’s and the computer’s points) and the DV by including these variables as covariates in the models changed the results.

Step 2: Response Surface Analysis
We conducted response surface analyses with midpoint-centered personality state and midpoint-centered personality trait as IVs and positive affect as DV. We included the experimental conditions as covariates in the polynomial regressions to control for the hierarchical data structure with participants nested in experimental conditions.

Additionally, we examined whether controlling for possible associations between the results of the game (points earned by the participant and difference between the participant’s and the computer’s points) and the DV by including these variables as covariates in the models changed the results.

Analysis of Variance

Trait–State Congruence: Agreeableness

Model without Covariates

aov.a <- aov_car(mood.gb ~ trait.a.ms * condition.beh + condition.sit + Error(ResponseId), data=data)


tab <- as.data.frame(nice(aov.a, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt; .001"
tab$pes[tab$pes=="<.001"] <- "&lt;.001"
tab$Effect <- c("Trait (median-split)", "Behavior conditions", "Situation conditions", 
                "Trait x Behavior conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between median-split personality traits, the behavior manipulation and positive affect.") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.")
Table 24: Analyses of variance examining associations between median-split personality traits, the behavior manipulation and positive affect.
Effect df F ηp2 p
Trait (median-split) 1, 250 2.29 .009 .132
Behavior conditions 1, 250 12.89 .049 < .001
Situation conditions 1, 250 3.22 .013 .074
Trait x Behavior conditions 1, 250 0.02 <.001 .894
Note:
We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.

Model with Covariates

lm.a <- lm(mood.gb ~ trait.a.ms * condition.beh + points.c + points.diff + condition.sit, data=data, 
           contrasts = list(condition.sit=contr.sum, trait.a.ms=contr.sum, condition.beh=contr.sum))


tab <- apa_print(car::Anova(lm.a, type=3))$table
tab$dfs <- paste0(tab$df, ", ", tab$df.residual)
tab$term <- c("Trait (median-split)", "Behavior conditions", "Points earned", 
              "Difference in points", "Situation conditions", "Trait x Behavior conditions")


kable(tab[,c(1,8,3,2,7)],
      escape=F,
      row.names = F,
      align=c("l", "r", "r", "r", "r"),
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between median-split personality traits, the behavior manipulation and positive affect with additional covariates controlling for the results of the game.") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "20em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.")
Table 25: Analyses of variance examining associations between median-split personality traits, the behavior manipulation and positive affect with additional covariates controlling for the results of the game.
Effect df F ηp2 p
Trait (median-split) 1, 248 2.17 .009 .142
Behavior conditions 1, 248 7.86 .031 .005
Points earned 1, 248 0.53 .002 .466
Difference in points 1, 248 1.06 .004 .305
Situation conditions 1, 248 0.55 .002 .458
Trait x Behavior conditions 1, 248 0.01 .000 .944
Note:
We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.

Trait–State Congruence: Honesty

Model without Covariates

aov.h <- aov_car(mood.gb ~ trait.h.ms * condition.beh + condition.sit + Error(ResponseId), data=data)


tab <- as.data.frame(nice(aov.h, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt; .001"
tab$pes[tab$pes=="<.001"] <- "&lt;.001"
tab$Effect <- c("Trait (median-split)", "Behavior conditions", "Situation conditions", 
                "Trait x Behavior conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between median-split personality traits, the behavior manipulation and positive affect.") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.")
Table 26: Analyses of variance examining associations between median-split personality traits, the behavior manipulation and positive affect.
Effect df F ηp2 p
Trait (median-split) 1, 250 0.00 <.001 .958
Behavior conditions 1, 250 14.09 .053 < .001
Situation conditions 1, 250 2.87 .011 .092
Trait x Behavior conditions 1, 250 2.28 .009 .132
Note:
We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.

Model with Covariates

lm.h <- lm(mood.gb ~ trait.h.ms * condition.beh + points.c + points.diff + condition.sit, data=data, 
           contrasts = list(condition.sit=contr.sum, trait.h.ms=contr.sum, condition.beh=contr.sum))


tab <- apa_print(car::Anova(lm.h, type=3))$table
tab$dfs <- paste0(tab$df, ", ", tab$df.residual)
tab$term <- c("Trait (median-split)", "Behavior conditions", "Points earned", 
              "Difference in points", "Situation conditions", "Trait x Behavior conditions")


kable(tab[,c(1,8,3,2,7)],
      escape=F,
      row.names = F,
      align=c("l", "r", "r", "r", "r"),
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between median-split personality traits, the behavior manipulation and positive affect with additional covariates controlling for the results of the game.") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "20em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.")
Table 27: Analyses of variance examining associations between median-split personality traits, the behavior manipulation and positive affect with additional covariates controlling for the results of the game.
Effect df F ηp2 p
Trait (median-split) 1, 248 0.01 .000 .925
Behavior conditions 1, 248 8.85 .034 .003
Points earned 1, 248 0.60 .002 .438
Difference in points 1, 248 1.06 .004 .305
Situation conditions 1, 248 0.38 .002 .537
Trait x Behavior conditions 1, 248 2.02 .008 .156
Note:
We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.

State–Situation Congruence

Model without Covariates

aov.sit <- aov_car(mood.gb ~ condition.beh * condition.sit + Error(ResponseId), data=data)


tab <- as.data.frame(nice(aov.sit, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt; .001"
tab$pes[tab$pes=="<.001"] <- "&lt;.001"
tab$Effect <- c("Behavior conditions", "Situation conditions", 
                "Situation x Behavior conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between the situation conditions and the behavior manipulation and positive affect.") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em")  %>% 
   footnote(general="Situation conditions and behavior conditions were effect-coded.")
Table 28: Analyses of variance examining associations between the situation conditions and the behavior manipulation and positive affect.
Effect df F ηp2 p
Behavior conditions 1, 251 13.56 .051 < .001
Situation conditions 1, 251 2.96 .012 .086
Situation x Behavior conditions 1, 251 1.56 .006 .212
Note:
Situation conditions and behavior conditions were effect-coded.

Model with Covariates

data$points.c <- scale(data$points, scale=FALSE)

lm.sit <- lm(mood.gb ~ condition.sit * condition.beh + points.c + points.diff, data=data, 
             contrasts = list(condition.sit=contr.sum, condition.beh=contr.sum))



tab <- apa_print(car::Anova(lm.sit, type=3))$table
tab$dfs <- paste0(tab$df, ", ", tab$df.residual)
tab$term <- c("Situation conditions", "Behavior conditions", "Points earned", 
              "Difference in points", "Situation x Behavior conditions")


kable(tab[,c(1,8,3,2,7)],
      escape=F,
      row.names = F,
      align=c("l", "r", "r", "r", "r"),
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between median-split personality traits, the behavior manipulation and positive affect with additional covariates controlling for the results of the game.") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "20em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="Situation conditions and behavior conditions were effect-coded.")
Table 29: Analyses of variance examining associations between median-split personality traits, the behavior manipulation and positive affect with additional covariates controlling for the results of the game.
Effect df F ηp2 p
Situation conditions 1, 249 0.62 .002 .433
Behavior conditions 1, 249 8.32 .032 .004
Points earned 1, 249 0.38 .002 .536
Difference in points 1, 249 0.88 .004 .349
Situation x Behavior conditions 1, 249 1.33 .005 .250
Note:
Situation conditions and behavior conditions were effect-coded.

Response Surface Analysis

contrasts(data$condition.sit) <- contr.sum(2)
contrasts(data$condition.beh) <- contr.sum(2)

data$trait.a.long <- 6*(data$trait.a-1)/4+1
data$trait.h.long <- 6*(data$trait.h-1)/4+1
data$trait.a.long.mc <- data$trait.a.long-4
data$trait.h.long.mc <- data$trait.h.long-4

h3a.rsa.a <- RSA(mood.gb ~ state.a.mc*trait.a.long.mc, data=data, 
                 model="full", verbose=F,
                 control.variables = c("condition.beh", "condition.sit"))

h3a.rsa.h <- RSA(mood.gb ~ state.h.mc*trait.h.long.mc, data=data, 
                 model="full", verbose=F,
                 control.variables = c("condition.beh", "condition.sit"))

h4a.rsa.a.a <- RSA(mood.gb ~ state.a.mc*adv.mc.r, data=data, 
                   model="full", verbose=F,
                   control.variables = c("condition.beh", "condition.sit"))
h4a.rsa.a.d <- RSA(mood.gb ~ state.a.mc*dec.mc.r, data=data, 
                   model="full", verbose=F,
                   control.variables = c("condition.beh", "condition.sit"))
h4a.rsa.h.a <- RSA(mood.gb ~ state.h.mc*adv.mc.r, data=data, 
                   model="full", verbose=F,
                   control.variables = c("condition.beh", "condition.sit"))
h4a.rsa.h.d <- RSA(mood.gb ~ state.h.mc*dec.mc.r, data=data, 
                   model="full", verbose=F,
                   control.variables = c("condition.beh", "condition.sit"))

Trait–State Congruence: Agreeableness

tab <- getPar(h3a.rsa.a, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State A", "Trait A", "State A<sup>2</sup>", "State A x Trait A", "Trait A<sup>2</sup>", "Behavior conditions", "Situation conditions")


## print table
kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align = c("l", "r", "r", "r", "r", "r")
      , col.names = c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
      , caption = "Parameters of the response surface analysis of trait agreeableness and state agreeableness predicting positive affect."
      , escape = FALSE
) %>% 
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State A represents state agreeableness, Trait A represents trait agreeableness. Personality traits were transformed from a 5-point scale to a 7-point scale. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F) %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "15em") 
Table 30: Parameters of the response surface analysis of trait agreeableness and state agreeableness predicting positive affect.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 3.10 [2.56, 3.64] 2.98 < .001
State A b1 0.28 [0.19, 0.38] 0.43 < .001
Trait A b2 0.01 [-0.15, 0.17] 0.01 .906
State A2 b3 0.04 [0.00, 0.08] 0.14 .035
State A x Trait A b4 -0.01 [-0.09, 0.06] -0.02 .704
Trait A2 b5 0.01 [-0.07, 0.09] 0.01 .808
Behavior conditions cv1 0.19 [-0.04, 0.41] 0.09 .107
Situation conditions cv2 -0.10 [-0.32, 0.13] -0.05 .405
Response Surface Parameters
a1:=b1+b2 a1 0.29 [0.12, 0.46] 0.44 .001
a2:=b3+b4+b5 a2 0.04 [-0.05, 0.13] 0.12 .404
a3:=b1-b2 a3 0.27 [0.07, 0.48] 0.42 .008
a4:=b3-b4+b5 a4 0.07 [-0.06, 0.19] 0.17 .289
a5:=b3-b5 a5 0.03 [-0.06, 0.13] 0.12 .490
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State A represents state agreeableness, Trait A represents trait agreeableness. Personality traits were transformed from a 5-point scale to a 7-point scale. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

Trait–State Congruence: Honesty

tab <- getPar(h3a.rsa.h, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State HH", "Trait HH", "State HH<sup>2</sup>", "State HH x Trait HH", "Trait HH<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of trait honesty-humility and state honesty-humility predicting positive affect."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State HH represents state honesty-humility, Trait HH represents trait honesty-humility. Personality traits were transformed from a 5-point scale to a 7-point scale. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 31: Parameters of the response surface analysis of trait honesty-humility and state honesty-humility predicting positive affect.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 3.60 [3.06, 4.14] 3.45 < .001
State HH b1 0.20 [0.09, 0.32] 0.37 .001
Trait HH b2 -0.13 [-0.32, 0.06] -0.14 .186
State HH2 b3 0.00 [-0.04, 0.03] -0.01 .902
State HH x Trait HH b4 0.04 [-0.02, 0.10] 0.15 .176
Trait HH2 b5 0.05 [-0.03, 0.12] 0.13 .224
Behavior conditions cv1 0.04 [-0.21, 0.29] 0.02 .747
Situation conditions cv2 -0.09 [-0.32, 0.13] -0.04 .423
Response Surface Parameters
a1:=b1+b2 a1 0.07 [-0.18, 0.33] 0.23 .576
a2:=b3+b4+b5 a2 0.08 [-0.01, 0.17] 0.27 .068
a3:=b1-b2 a3 0.33 [0.15, 0.51] 0.51 < .001
a4:=b3-b4+b5 a4 0.00 [-0.10, 0.11] -0.03 .941
a5:=b3-b5 a5 -0.05 [-0.13, 0.04] -0.13 .272
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State HH represents state honesty-humility, Trait HH represents trait honesty-humility. Personality traits were transformed from a 5-point scale to a 7-point scale. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

State–Situation Congruence: Agreeableness and Adversity

tab <- getPar(h4a.rsa.a.a, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State A", "Adv(r)", "State A<sup>2</sup>", "State A x Adv(r)", "Adv(r)<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of state agreeableness and adversity predicting positive affect."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State A represents state agreeableness, Adv(r) represents reverse-coded Adversity. Adversity was reverse-coded such that higher levels indicate less adversity. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 32: Parameters of the response surface analysis of state agreeableness and adversity predicting positive affect.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 2.81 [2.29, 3.34] 2.70 < .001
State A b1 0.23 [0.11, 0.35] 0.35 < .001
Adv(r) b2 0.05 [-0.07, 0.17] 0.08 .420
State A2 b3 0.03 [-0.01, 0.08] 0.11 .108
State A x Adv(r) b4 0.02 [-0.04, 0.07] 0.06 .546
Adv(r)2 b5 0.03 [-0.01, 0.08] 0.11 .187
Behavior conditions cv1 0.20 [-0.02, 0.41] 0.09 .075
Situation conditions cv2 -0.04 [-0.25, 0.18] -0.02 .743
Response Surface Parameters
a1:=b1+b2 a1 0.28 [0.09, 0.47] 0.43 .004
a2:=b3+b4+b5 a2 0.08 [0.01, 0.15] 0.28 .026
a3:=b1-b2 a3 0.18 [0.04, 0.32] 0.28 .014
a4:=b3-b4+b5 a4 0.05 [-0.04, 0.14] 0.15 .292
a5:=b3-b5 a5 0.00 [-0.06, 0.07] 0.00 .916
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State A represents state agreeableness, Adv(r) represents reverse-coded Adversity. Adversity was reverse-coded such that higher levels indicate less adversity. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

State–Situation Congruence: Agreeableness and Deception

tab <- getPar(h4a.rsa.a.d, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State A", "Dec(r)", "State A<sup>2</sup>", "State A x Dec(r)", "Dec(r)<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of state agreeableness and deception predicting positive affect."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State A represents state agreeableness, Dec(r) represents reverse-coded Deception. Deception was reverse-coded such that higher levels indicate less deception. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 33: Parameters of the response surface analysis of state agreeableness and deception predicting positive affect.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 3.22 [2.65, 3.80] 3.09 < .001
State A b1 0.26 [0.16, 0.36] 0.40 < .001
Dec(r) b2 0.07 [-0.05, 0.19] 0.10 .254
State A2 b3 0.04 [-0.01, 0.08] 0.12 .088
State A x Dec(r) b4 -0.02 [-0.07, 0.03] -0.07 .372
Dec(r)2 b5 0.00 [-0.05, 0.04] -0.01 .882
Behavior conditions cv1 0.17 [-0.06, 0.40] 0.08 .152
Situation conditions cv2 -0.08 [-0.30, 0.15] -0.04 .504
Response Surface Parameters
a1:=b1+b2 a1 0.33 [0.18, 0.48] 0.49 < .001
a2:=b3+b4+b5 a2 0.01 [-0.06, 0.08] 0.03 .749
a3:=b1-b2 a3 0.19 [0.02, 0.36] 0.30 .026
a4:=b3-b4+b5 a4 0.06 [-0.01, 0.12] 0.18 .092
a5:=b3-b5 a5 0.04 [-0.03, 0.12] 0.13 .287
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State A represents state agreeableness, Dec(r) represents reverse-coded Deception. Deception was reverse-coded such that higher levels indicate less deception. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

State–Situation Congruence: Honesty and Adversity

tab <- getPar(h4a.rsa.h.a, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State HH", "Adv(r)", "State HH<sup>2</sup>", "State HH x Adv(r)", "Adv(r)<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of state honesty-humility and adversity predicting positive affect."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State HH represents state honesty-humility, Adv(r) represents reverse-coded Adversity. Adversity was reverse-coded such that higher levels indicate less adversity. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 34: Parameters of the response surface analysis of state honesty-humility and adversity predicting positive affect.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 3.24 [2.71, 3.77] 3.12 < .001
State HH b1 0.23 [0.13, 0.33] 0.42 < .001
Adv(r) b2 0.08 [-0.05, 0.21] 0.12 .248
State HH2 b3 -0.02 [-0.05, 0.02] -0.05 .417
State HH x Adv(r) b4 0.02 [-0.03, 0.06] 0.07 .486
Adv(r)2 b5 0.04 [-0.01, 0.09] 0.15 .095
Behavior conditions cv1 0.01 [-0.22, 0.25] 0.01 .909
Situation conditions cv2 -0.03 [-0.25, 0.19] -0.01 .779
Response Surface Parameters
a1:=b1+b2 a1 0.31 [0.11, 0.50] 0.54 .002
a2:=b3+b4+b5 a2 0.04 [-0.03, 0.11] 0.17 .222
a3:=b1-b2 a3 0.15 [0.02, 0.28] 0.30 .025
a4:=b3-b4+b5 a4 0.01 [-0.05, 0.08] 0.03 .725
a5:=b3-b5 a5 -0.06 [-0.13, 0.01] -0.20 .113
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State HH represents state honesty-humility, Adv(r) represents reverse-coded Adversity. Adversity was reverse-coded such that higher levels indicate less adversity. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

State–Situation Congruence: Honesty and Deception

tab <- getPar(h4a.rsa.h.d, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State HH", "Dec(r)", "State HH<sup>2</sup>", "State HH x Dec(r)", "Dec(r)<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of state honesty-humility and deception predicting positive affect."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State HH represents state honesty-humility, Dec(r) represents reverse-coded Deception. Deception was reverse-coded such that higher levels indicate less deception. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 35: Parameters of the response surface analysis of state honesty-humility and deception predicting positive affect.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 3.64 [3.10, 4.19] 3.49 < .001
State HH b1 0.29 [0.18, 0.39] 0.53 < .001
Dec(r) b2 0.07 [-0.03, 0.17] 0.10 .146
State HH2 b3 0.00 [-0.04, 0.03] -0.01 .894
State HH x Dec(r) b4 0.01 [-0.04, 0.05] 0.03 .767
Dec(r)2 b5 0.03 [-0.02, 0.07] 0.08 .262
Behavior conditions cv1 0.00 [-0.25, 0.25] 0.00 .990
Situation conditions cv2 -0.10 [-0.33, 0.12] -0.05 .358
Response Surface Parameters
a1:=b1+b2 a1 0.36 [0.24, 0.48] 0.63 < .001
a2:=b3+b4+b5 a2 0.03 [-0.04, 0.10] 0.10 .376
a3:=b1-b2 a3 0.21 [0.05, 0.38] 0.43 .012
a4:=b3-b4+b5 a4 0.02 [-0.05, 0.09] 0.05 .658
a5:=b3-b5 a5 -0.03 [-0.09, 0.04] -0.09 .400
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State HH represents state honesty-humility, Dec(r) represents reverse-coded Deception. Deception was reverse-coded such that higher levels indicate less deception. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

Visualization

ANOVA Interaction Plots

p1 <- interactions::cat_plot(lm.a, pred=condition.beh, modx=trait.a.ms, 
                             plot.points = T, point.size=1, point.alpha=.3, jtter=.2,
                             geom="line", interval=T, interval.geom = "linerange",
                             pred.point.size = 5, dodge.width = 0.3,
                             x.label="Behavior Conditions", y.label="Positive Affect",
                             main.title = "Trait Agreeableness x Behavior Conditions",
                             legend.main = "Trait Agreeableness (median-split)",
                             colors=cols.beh) + 
   theme_pub() + theme(legend.position = "right", legend.title = element_text(size=10,face="bold")) +
   scale_x_discrete(expand=c(0.2, 0.2))


p2 <- interactions::cat_plot(lm.h, pred=condition.beh, modx=trait.h.ms, 
                             plot.points = T, point.size=1, point.alpha=.3, jtter=.2,
                             geom="line", interval=T, interval.geom = "linerange",
                             pred.point.size = 5, dodge.width = 0.3,
                             x.label="Behavior Conditions", y.label="Positive Affect",
                             main.title = "Trait Honesty x Behavior Conditions",
                             legend.main = "Trait Honesty (median-split)",
                             colors=cols.beh) + 
   theme_pub() + theme(legend.position = "right", legend.title = element_text(size=10,face="bold")) +
   scale_x_discrete(expand=c(0.2, 0.2))


p3 <- interactions::cat_plot(lm.sit, pred=condition.beh, modx=condition.sit, 
                             plot.points = T, point.size=1, point.alpha=.3, jtter=.2,
                             geom="line", interval=T, interval.geom = "linerange",
                             pred.point.size = 5, dodge.width = 0.3,
                             x.label="Behavior Conditions", y.label="Positive Affect",
                             main.title = "Situation x Behavior Conditions",
                             legend.main = "Situation Conditions",
                             colors=cols.beh) + 
   theme_pub() + theme(legend.position = "right", legend.title = element_text(size=10,face="bold")) +
   scale_x_discrete(expand=c(0.2, 0.2))


p1 / plot_spacer() / p2 / plot_spacer() / p3 + plot_layout(heights=c(1,0.1, 1, 0.1,1)) + plot_annotation(tag_levels = "A")
Interaction plots of interactions between median-split personality traits, behavior conditions, and situation conditions predicting positive affect.

Figure 13: Interaction plots of interactions between median-split personality traits, behavior conditions, and situation conditions predicting positive affect.

Response Surface Plots

a <- plot(h3a.rsa.a, xlab="State Agreeableness", ylab="Trait Agreeableness", zlab="Positive affect",
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="Trait-State Congruence: Agreeableness",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F, pad=2,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

b <- plot(h3a.rsa.h, xlab="State Honesty", ylab="Trait Honesty", zlab="Positive affect", 
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="Trait--State Congruence: Honesty-humility",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,pad=2,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

c <- plot(h4a.rsa.a.a, xlab="State Agreeableness", ylab="Adversity(r)", zlab="Positive affect",
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="State-Situation Congruence:\nAgreeableness and Adversity",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,pad=2,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

d <- plot(h4a.rsa.h.a, xlab="State Honesty", ylab="Adversity(r)", zlab="Positive affect", 
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="State-Situation Congruence:\nHonesty and Adversity",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,pad=2,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

e <- plot(h4a.rsa.a.d, xlab="State Agreeableness", ylab="Deception(r)", zlab="Positive affect",
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="State-Situation Congruence:\nAgreeableness and Deception",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,pad=2,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

f <- plot(h4a.rsa.h.d, xlab="State Honesty", ylab="Deception(r)", zlab="Positive affect", 
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="State-Situation Congruence:\nHonesty and Deception",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,pad=2,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

## combine plots
cowplot::plot_grid(a,b,c,d,e,f, ncol = 2, labels="AUTO", label_size = 12)
Response surface plots of the association between trait--state congruence, state--situation congruence, and positive affect. Adversity and deception were reverse-coded (indicated by *(r)*) such that higher values indicate less adversity and decpetion, respectively. The response surface parameters are listed below the titles. The blue lines represent the line of congruence (LOC; i.e., X = Y) and the line of incongruence (LOIC; i.e., X = -Y). The black lines represent the range of observed values as a twodimensional boxplot.

Figure 14: Response surface plots of the association between trait–state congruence, state–situation congruence, and positive affect. Adversity and deception were reverse-coded (indicated by (r)) such that higher values indicate less adversity and decpetion, respectively. The response surface parameters are listed below the titles. The blue lines represent the line of congruence (LOC; i.e., X = Y) and the line of incongruence (LOIC; i.e., X = -Y). The black lines represent the range of observed values as a twodimensional boxplot.

Conclusion

Overall, the data did not support the congruence hypotheses with regard to positive affect:

  • Analyses of variance did not yield any significant interaction effects (all Fs < 2.28, all ps > .132)

  • Only the behavior conditions were significantly associated with positive affect such that participants in the high agreeableness and honesty-condition (M = 3.83, SD = 0.87) reported significantly more positive affect than participants in the low agreeableness and honesty-condition (M = 3.36, SD = 1.14, d = 0.47, 95% CI [0.21, 0.72])

  • Polynomial regressions also showed that only higher levels of state agreeableness and state honesty-humility (but not interactions of fit patterns) were significantly associated with more positive affect across all models (bs ranging from 0.21 to 0.29)

  • In summary, across both analysis of variance and response surface analysis, neither interactions nor fit patterns were significantly associated with positive affect

Congruence and Tiredness

Hypothesis & Analytic Strategy

Hypothesis

H3a: Congruence between personality trait and personality state is associated with tiredness such that trait-congruent personality states are related to less tiredness than trait-incongruent personality states.

H4a: Congruence between personality state and situation characteristic is associated with tiredness such that situation-congruent personality states are related to less tiredness than situation-incongruent personality states.

Analytic Strategy

Step 1: Analysis of Variance
We conducted a median split of trait Agreeableness / trait Honesty-Humility and conduct variance analyses with reverse-coded tiredness as DV and the variables representing behavior conditions and median-split personality traits and their interaction as IVs. This replicates analyses performed in Zelenski et al. (2012).

Additionally, we examined whether controlling for possible associations between the results of the game (points earned by the participant and difference between the participant’s and the computer’s points) and the DV by including these variables as covariates in the models changed the results.

Step 2: Response Surface Analysis
We conducted response surface analyses with midpoint-centered personality state and midpoint-centered personality trait as IVs and reverse-coded tiredness as DV. We included the experimental conditions as covariates in the polynomial regressions to control for the hierarchical data structure with participants nested in experimental conditions.

Additionally, we examined whether controlling for possible associations between the results of the game (points earned by the participant and difference between the participant’s and the computer’s points) and the DV by including these variables as covariates in the models changed the results.

Analysis of Variance

Trait–State Congruence: Agreeableness

Model without Covariates

aov.a <- aov_car(mood.at ~ trait.a.ms * condition.beh + condition.sit + Error(ResponseId), data=data)


tab <- as.data.frame(nice(aov.a, es="pes", sig_symbols = rep("", 4), MSE=FALSE))


tab$p.value[tab$p.value=="<.001"] <- "&lt; .001"
tab$pes[tab$pes=="<.001"] <- "&lt;.001"
tab$Effect <- c("Trait (median-split)", "Behavior conditions", "Situation conditions", 
                "Trait x Behavior conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between median-split personality traits, the behavior manipulation and tiredness") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.")
Table 36: Analyses of variance examining associations between median-split personality traits, the behavior manipulation and tiredness
Effect df F ηp2 p
Trait (median-split) 1, 250 6.25 .024 .013
Behavior conditions 1, 250 5.84 .023 .016
Situation conditions 1, 250 0.38 .002 .537
Trait x Behavior conditions 1, 250 1.82 .007 .179
Note:
We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.

Model with Covariates

data$points.c <- scale(data$points, scale=FALSE)

lm.a <- lm(mood.at ~ trait.a.ms * condition.beh + points.c + points.diff + condition.sit, data=data, 
           contrasts = list(condition.sit=contr.sum, trait.a.ms=contr.sum, condition.beh=contr.sum))


tab <- apa_print(car::Anova(lm.a, type=3))$table
tab$dfs <- paste0(tab$df, ", ", tab$df.residual)
tab$term <- c("Trait (median-split)", "Behavior conditions", "Points earned", 
              "Difference in points", "Situation conditions", "Trait x Behavior conditions")


kable(tab[,c(1,8,3,2,7)],
      escape=F,
      row.names = F,
      align=c("l", "r", "r", "r", "r"),
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between experimental conditions and the remaining personality states and situation characteristics with additional covariates controlling for the results of the game.") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "20em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.")
Table 37: Analyses of variance examining associations between experimental conditions and the remaining personality states and situation characteristics with additional covariates controlling for the results of the game.
Effect df F ηp2 p
Trait (median-split) 1, 248 6.15 .024 .014
Behavior conditions 1, 248 4.54 .018 .034
Points earned 1, 248 0.54 .002 .463
Difference in points 1, 248 0.38 .002 .538
Situation conditions 1, 248 0.06 .000 .810
Trait x Behavior conditions 1, 248 1.77 .007 .184
Note:
We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.

Trait–State Congruence: Honesty

Model without Covariates

aov.h <- aov_car(mood.at ~ trait.h.ms * condition.beh + condition.sit + Error(ResponseId), data=data)


tab <- as.data.frame(nice(aov.h, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt; .001"
tab$pes[tab$pes=="<.001"] <- "&lt;.001"
tab$Effect <- c("Trait (median-split)", "Behavior conditions", "Situation conditions", 
                "Trait x Behavior conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between median-split personality traits, the behavior manipulation and tiredness") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.")
Table 38: Analyses of variance examining associations between median-split personality traits, the behavior manipulation and tiredness
Effect df F ηp2 p
Trait (median-split) 1, 250 0.01 <.001 .908
Behavior conditions 1, 250 6.87 .027 .009
Situation conditions 1, 250 0.18 <.001 .669
Trait x Behavior conditions 1, 250 0.80 .003 .372
Note:
We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.

Model with Covariates

data$points.c <- scale(data$points, scale=FALSE)

lm.h <- lm(mood.at ~ trait.h.ms * condition.beh + points.c + points.diff + condition.sit, data=data, 
           contrasts = list(condition.sit=contr.sum, trait.h.ms=contr.sum, condition.beh=contr.sum))


tab <- apa_print(car::Anova(lm.h, type=3))$table
tab$dfs <- paste0(tab$df, ", ", tab$df.residual)
tab$term <- c("Trait (median-split)", "Behavior conditions", "Points earned", 
              "Difference in points", "Situation conditions", "Trait x Behavior conditions")


kable(tab[,c(1,8,3,2,7)],
      escape=F,
      row.names = F,
      align=c("l", "r", "r", "r", "r"),
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between experimental conditions and the remaining personality states and situation characteristics with additional covariates controlling for the results of the game.") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "20em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.")
Table 39: Analyses of variance examining associations between experimental conditions and the remaining personality states and situation characteristics with additional covariates controlling for the results of the game.
Effect df F ηp2 p
Trait (median-split) 1, 248 0.02 .000 .879
Behavior conditions 1, 248 5.23 .021 .023
Points earned 1, 248 0.68 .003 .411
Difference in points 1, 248 0.50 .002 .479
Situation conditions 1, 248 0.17 .001 .684
Trait x Behavior conditions 1, 248 0.83 .003 .364
Note:
We included the situation conditions as covariates in this model to control for dependencies among participants who experienced the same situation condition. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions, median-split personality traits, and behavior conditions were effect-coded.

State–Situation Congruence

Model without Covariates

aov.sit <- aov_car(mood.at ~ condition.beh * condition.sit + Error(ResponseId), data=data)


tab <- as.data.frame(nice(aov.sit, es="pes", sig_symbols = rep("", 4), MSE=FALSE))

tab$p.value[tab$p.value=="<.001"] <- "&lt; .001"
tab$pes[tab$pes=="<.001"] <- "&lt;.001"
tab$Effect <- c("Behavior conditions", "Situation conditions", 
                "Situation x Behavior conditions")

kable(tab,
      escape=F,
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between the situation conditions and the behavior manipulation and tiredness.") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "15em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions and behavior conditions were effect-coded.")
Table 40: Analyses of variance examining associations between the situation conditions and the behavior manipulation and tiredness.
Effect df F ηp2 p
Behavior conditions 1, 251 6.64 .026 .011
Situation conditions 1, 251 0.23 <.001 .633
Situation x Behavior conditions 1, 251 2.20 .009 .139
Note:
Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions and behavior conditions were effect-coded.

Model with Covariates

lm.sit <- lm(mood.at ~ condition.sit * condition.beh + points.c + points.diff, data=data, 
             contrasts = list(condition.sit=contr.sum, condition.beh=contr.sum))


tab <- apa_print(car::Anova(lm.sit, type=3))$table
tab$dfs <- paste0(tab$df, ", ", tab$df.residual)
tab$term <- c("Situation conditions", "Behavior conditions", "Points earned", 
              "Difference in points", "Situation x Behavior conditions")


kable(tab[,c(1,8,3,2,7)],
      escape=F,
      row.names = F,
      align=c("l", "r", "r", "r", "r"),
      col.names=c("Effect", "df", "F", "&#951;<sub>p</sub><sup>2</sup>", "<i>p</i>"),
      caption="Analyses of variance examining associations between median-split personality traits, the behavior manipulation and tiredness with additional covariates controlling for the results of the game.") %>% 
   kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                 full_width = F, position = "left", fixed_thead = T) %>% 
   column_spec(c(1), width = "20em") %>% 
   column_spec(c(2:4), width = "8em") %>% 
   footnote(general="Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions and behavior conditions were effect-coded.")
Table 41: Analyses of variance examining associations between median-split personality traits, the behavior manipulation and tiredness with additional covariates controlling for the results of the game.
Effect df F ηp2 p
Situation conditions 1, 249 0.05 .000 .830
Behavior conditions 1, 249 5.01 .020 .026
Points earned 1, 249 0.41 .002 .523
Difference in points 1, 249 0.34 .001 .562
Situation x Behavior conditions 1, 249 1.94 .008 .165
Note:
Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Situation conditions and behavior conditions were effect-coded.

Response Surface Analysis

contrasts(data$condition.sit) <- contr.sum(2)
contrasts(data$condition.beh) <- contr.sum(2)

h3b.rsa.a <- RSA(mood.at ~ state.a.mc*trait.a.long.mc, data=data, model="full", verbose=F,
                 control.variables = c("condition.beh", "condition.sit"))
h3b.rsa.h <- RSA(mood.at ~ state.h.mc*trait.h.long.mc, data=data, model="full", verbose=F,
                 control.variables = c("condition.beh", "condition.sit"))
h4b.rsa.a.a <- RSA(mood.at ~ state.a.mc*adv.mc.r, data=data, model="full", verbose=F,
                   control.variables = c("condition.beh", "condition.sit"))
h4b.rsa.a.d <- RSA(mood.at ~ state.a.mc*dec.mc.r, data=data, model="full", verbose=F,
                   control.variables = c("condition.beh", "condition.sit"))
h4b.rsa.h.a <- RSA(mood.at ~ state.h.mc*adv.mc.r, data=data, model="full", verbose=F,
                   control.variables = c("condition.beh", "condition.sit"))
h4b.rsa.h.d <- RSA(mood.at ~ state.h.mc*dec.mc.r, data=data, model="full", verbose=F,
                   control.variables = c("condition.beh", "condition.sit"))

Trait–State Congruence: Agreeableness

tab <- getPar(h3b.rsa.a, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State A", "Trait A", "State A<sup>2</sup>", "State A x Trait A", "Trait A<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of trait agreeableness and state agreeableness predicting tiredness."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State A represents state agreeableness, Trait A represents trait agreeableness. Personality traits were transformed from a 5-point scale to a 7-point scale. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 42: Parameters of the response surface analysis of trait agreeableness and state agreeableness predicting tiredness.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 3.03 [2.54, 3.52] 3.31 < .001
State A b1 0.19 [0.11, 0.28] 0.34 < .001
Trait A b2 0.12 [0.00, 0.24] 0.11 .059
State A2 b3 0.02 [-0.01, 0.06] 0.09 .206
State A x Trait A b4 -0.05 [-0.12, 0.02] -0.09 .134
Trait A2 b5 0.06 [-0.01, 0.13] 0.08 .093
Behavior conditions cv1 0.07 [-0.14, 0.28] 0.04 .494
Situation conditions cv2 0.00 [-0.21, 0.21] 0.00 .982
Response Surface Parameters
a1:=b1+b2 a1 0.31 [0.18, 0.44] 0.45 < .001
a2:=b3+b4+b5 a2 0.04 [-0.04, 0.11] 0.08 .372
a3:=b1-b2 a3 0.08 [-0.08, 0.23] 0.23 .332
a4:=b3-b4+b5 a4 0.14 [0.02, 0.25] 0.26 .021
a5:=b3-b5 a5 -0.04 [-0.12, 0.05] 0.00 .417
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State A represents state agreeableness, Trait A represents trait agreeableness. Personality traits were transformed from a 5-point scale to a 7-point scale. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

Trait–State Congruence: Honesty

tab <- getPar(h3b.rsa.h, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State HH", "Trait HH", "State HH<sup>2</sup>", "State HH x Trait HH", "Trait HH<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of trait honesty-humility and state honesty-humility predicting tiredness."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State HH represents state honesty-humility, Trait HH represents trait honesty-humility. Personality traits were transformed from a 5-point scale to a 7-point scale. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 43: Parameters of the response surface analysis of trait honesty-humility and state honesty-humility predicting tiredness.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 3.27 [2.76, 3.77] 3.56 < .001
State HH b1 0.11 [-0.01, 0.22] 0.23 .067
Trait HH b2 -0.13 [-0.29, 0.03] -0.17 .105
State HH2 b3 -0.01 [-0.04, 0.03] -0.03 .628
State HH x Trait HH b4 0.04 [-0.01, 0.09] 0.16 .156
Trait HH2 b5 0.06 [-0.01, 0.12] 0.19 .079
Behavior conditions cv1 0.02 [-0.21, 0.24] 0.01 .874
Situation conditions cv2 0.04 [-0.18, 0.25] 0.02 .732
Response Surface Parameters
a1:=b1+b2 a1 -0.02 [-0.26, 0.21] 0.06 .836
a2:=b3+b4+b5 a2 0.09 [0.00, 0.17] 0.32 .042
a3:=b1-b2 a3 0.24 [0.08, 0.40] 0.39 .003
a4:=b3-b4+b5 a4 0.01 [-0.07, 0.10] -0.01 .800
a5:=b3-b5 a5 -0.07 [-0.15, 0.01] -0.22 .103
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State HH represents state honesty-humility, Trait HH represents trait honesty-humility. Personality traits were transformed from a 5-point scale to a 7-point scale. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

State–Situation Congruence: Agreeableness and Adversity

tab <- getPar(h4b.rsa.a.a, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State A", "Adv(r)", "State A<sup>2</sup>", "State A x Adv(r)", "Adv(r)<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of state agreeableness and adversity predicting tiredness."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State A represents state agreeableness, Adv(r) represents reverse-coded Adversity. Adversity was reverse-coded such that higher levels indicate less adversity. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 44: Parameters of the response surface analysis of state agreeableness and adversity predicting tiredness.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 2.81 [2.32, 3.31] 3.07 < .001
State A b1 0.13 [0.02, 0.24] 0.23 .018
Adv(r) b2 0.00 [-0.12, 0.11] -0.01 .957
State A2 b3 0.01 [-0.02, 0.05] 0.05 .457
State A x Adv(r) b4 0.04 [-0.01, 0.09] 0.16 .157
Adv(r)2 b5 0.03 [-0.02, 0.07] 0.11 .221
Behavior conditions cv1 0.09 [-0.12, 0.29] 0.05 .404
Situation conditions cv2 0.08 [-0.13, 0.29] 0.04 .479
Response Surface Parameters
a1:=b1+b2 a1 0.13 [-0.06, 0.32] 0.22 .187
a2:=b3+b4+b5 a2 0.08 [0.01, 0.15] 0.32 .031
a3:=b1-b2 a3 0.14 [0.02, 0.25] 0.24 .018
a4:=b3-b4+b5 a4 0.00 [-0.08, 0.09] 0.00 .936
a5:=b3-b5 a5 -0.01 [-0.07, 0.05] -0.05 .703
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State A represents state agreeableness, Adv(r) represents reverse-coded Adversity. Adversity was reverse-coded such that higher levels indicate less adversity. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

State–Situation Congruence: Agreeableness and Deception

tab <- getPar(h4b.rsa.a.d, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State A", "Dec(r)", "State A<sup>2</sup>", "State A x Dec(r)", "Dec(r)<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of state agreeableness and deception predicting tiredness."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State A represents state agreeableness, Dec(r) represents reverse-coded Deception. Deception was reverse-coded such that higher levels indicate less deception. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 45: Parameters of the response surface analysis of state agreeableness and deception predicting tiredness.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 2.99 [2.47, 3.52] 3.26 < .001
State A b1 0.23 [0.14, 0.32] 0.40 < .001
Dec(r) b2 0.09 [-0.01, 0.20] 0.15 .084
State A2 b3 0.01 [-0.03, 0.05] 0.05 .508
State A x Dec(r) b4 0.01 [-0.04, 0.06] 0.04 .692
Dec(r)2 b5 0.04 [0.00, 0.08] 0.15 .060
Behavior conditions cv1 0.08 [-0.14, 0.29] 0.04 .474
Situation conditions cv2 0.04 [-0.17, 0.24] 0.02 .736
Response Surface Parameters
a1:=b1+b2 a1 0.33 [0.19, 0.46] 0.55 < .001
a2:=b3+b4+b5 a2 0.06 [-0.01, 0.13] 0.23 .084
a3:=b1-b2 a3 0.14 [-0.01, 0.28] 0.26 .067
a4:=b3-b4+b5 a4 0.04 [-0.02, 0.11] 0.16 .166
a5:=b3-b5 a5 -0.03 [-0.09, 0.04] -0.10 .443
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State A represents state agreeableness, Dec(r) represents reverse-coded Deception. Deception was reverse-coded such that higher levels indicate less deception. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

State–Situation Congruence: Honesty and Adversity

tab <- getPar(h4b.rsa.h.a, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State HH", "Adv(r)", "State HH<sup>2</sup>", "State HH x Adv(r)", "Adv(r)<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of state honesty-humility and adversity predicting tiredness."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State HH represents state honesty-humility, Adv(r) represents reverse-coded Adversity. Adversity was reverse-coded such that higher levels indicate less adversity. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 46: Parameters of the response surface analysis of state honesty-humility and adversity predicting tiredness.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 3.06 [2.57, 3.56] 3.34 < .001
State HH b1 0.11 [0.00, 0.22] 0.23 .046
Adv(r) b2 0.01 [-0.11, 0.13] 0.02 .843
State HH2 b3 -0.02 [-0.05, 0.02] -0.07 .295
State HH x Adv(r) b4 0.03 [-0.01, 0.08] 0.17 .136
Adv(r)2 b5 0.04 [0.00, 0.09] 0.18 .064
Behavior conditions cv1 -0.01 [-0.23, 0.21] 0.00 .937
Situation conditions cv2 0.08 [-0.13, 0.29] 0.04 .477
Response Surface Parameters
a1:=b1+b2 a1 0.12 [-0.08, 0.32] 0.25 .232
a2:=b3+b4+b5 a2 0.06 [-0.02, 0.13] 0.27 .121
a3:=b1-b2 a3 0.10 [-0.01, 0.20] 0.21 .068
a4:=b3-b4+b5 a4 -0.01 [-0.07, 0.05] -0.06 .806
a5:=b3-b5 a5 -0.06 [-0.13, 0.00] -0.25 .059
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State HH represents state honesty-humility, Adv(r) represents reverse-coded Adversity. Adversity was reverse-coded such that higher levels indicate less adversity. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

State–Situation Congruence: Honesty and Deception

tab <- getPar(h4b.rsa.h.d, standardized=TRUE)[c(8, 1:7, 9:13),]
tab$ci <- paste0("[",printnum(tab$ci.lower), ", ", printnum(tab$ci.upper), "]")
tab$pvalue <- printp(tab$pvalue)
row.names(tab)[1:8] <- c("(Intercept)", "State HH", "Dec(r)", "State HH<sup>2</sup>", "State HH x Dec(r)", "Dec(r)<sup>2</sup>", "Behavior conditions", "Situation conditions")


kable(tab[,c(1,2,11,9,5)]
      , digits=c(2,2,2,2,2)
      , align=c("l", "r", "r", "r", "r", "r")
      , caption = "Parameters of the response surface analysis of state honesty-humility and deception predicting tiredness."
      , escape = FALSE
      , col.names=c("Label", "<i>b</i>", "95% Confidence Interval", "&beta;", "<i>p</i> value")
)  %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T, full_width = F, position = "left")  %>% 
   column_spec(1, width = "18em") %>%
   pack_rows("Regression Parameters", 1, 8) %>%
   pack_rows("Response Surface Parameters", 9, 13) %>% 
   footnote(general="b represents unstandardized regression coefficients, &beta; represents standardized regression coeficients. State HH represents state honesty-humility, Dec(r) represents reverse-coded Deception. Deception was reverse-coded such that higher levels indicate less deception. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.", escape=F)
Table 47: Parameters of the response surface analysis of state honesty-humility and deception predicting tiredness.
Label b 95% Confidence Interval β p value
Regression Parameters
(Intercept) b0 3.31 [2.80, 3.82] 3.61 < .001
State HH b1 0.23 [0.14, 0.32] 0.48 < .001
Dec(r) b2 0.10 [0.00, 0.19] 0.15 .040
State HH2 b3 -0.01 [-0.05, 0.02] -0.05 .423
State HH x Dec(r) b4 0.02 [-0.02, 0.07] 0.10 .303
Dec(r)2 b5 0.06 [0.02, 0.10] 0.21 .005
Behavior conditions cv1 -0.04 [-0.27, 0.20] -0.02 .765
Situation conditions cv2 0.01 [-0.19, 0.22] 0.01 .895
Response Surface Parameters
a1:=b1+b2 a1 0.33 [0.21, 0.45] 0.63 < .001
a2:=b3+b4+b5 a2 0.07 [0.00, 0.14] 0.26 .063
a3:=b1-b2 a3 0.13 [0.00, 0.27] 0.33 .053
a4:=b3-b4+b5 a4 0.02 [-0.04, 0.08] 0.05 .546
a5:=b3-b5 a5 -0.07 [-0.13, -0.01] -0.26 .015
Note:
b represents unstandardized regression coefficients, β represents standardized regression coeficients. State HH represents state honesty-humility, Dec(r) represents reverse-coded Deception. Deception was reverse-coded such that higher levels indicate less deception. Tiredness was reverse-coded such that higher values indicate less tiredness or a more active mood. Control variables (i.e., points earned in the game, difference in points, and experimental groups) are not listed in the output.

Visualization

ANOVA Interaction Plots

p1 <- interactions::cat_plot(lm.a, pred=condition.beh, modx=trait.a.ms, 
                             plot.points = T, point.size=1, point.alpha=.3, jtter=.2,
                             geom="line", interval=T, interval.geom = "linerange",
                             pred.point.size = 5, dodge.width = 0.3,
                             x.label="Behavior Conditions", y.label="Tiredness (r)",
                             main.title = "Trait Agreeableness x Behavior Conditions",
                             legend.main = "Trait Agreeableness (median-split)",
                             colors=cols.beh) + 
   theme_pub() + theme(legend.position = "right", legend.title = element_text(size=10,face="bold")) +
   scale_x_discrete(expand=c(0.2, 0.2))


p2 <- interactions::cat_plot(lm.h, pred=condition.beh, modx=trait.h.ms, 
                             plot.points = T, point.size=1, point.alpha=.3, jtter=.2,
                             geom="line", interval=T, interval.geom = "linerange",
                             pred.point.size = 5, dodge.width = 0.3,
                             x.label="Behavior Conditions", y.label="Tiredness (r)",
                             main.title = "Trait Honesty x Behavior Conditions",
                             legend.main = "Trait Honesty (median-split)",
                             colors=cols.beh) + 
   theme_pub() + theme(legend.position = "right", legend.title = element_text(size=10,face="bold")) +
   scale_x_discrete(expand=c(0.2, 0.2))


p3 <- interactions::cat_plot(lm.sit, pred=condition.beh, modx=condition.sit, 
                             plot.points = T, point.size=1, point.alpha=.3, jtter=.2,
                             geom="line", interval=T, interval.geom = "linerange",
                             pred.point.size = 5, dodge.width = 0.3,
                             x.label="Behavior Conditions", y.label="Tiredness (r)",
                             main.title = "Situation x Behavior Conditions",
                             legend.main = "Situation Conditions",
                             colors=cols.beh) + 
   theme_pub() + theme(legend.position = "right", legend.title = element_text(size=10,face="bold")) +
   scale_x_discrete(expand=c(0.2, 0.2))


p1 / plot_spacer() / p2 / plot_spacer() / p3 + plot_layout(heights=c(1,0.1, 1, 0.1,1)) + plot_annotation(tag_levels = "A")
Interaction plots of interactions between median-split personality traits, behavior conditions, and situation conditions predicting reverse-coded tiredness (i.e., higher levels indicate less tiredness).

Figure 15: Interaction plots of interactions between median-split personality traits, behavior conditions, and situation conditions predicting reverse-coded tiredness (i.e., higher levels indicate less tiredness).

Response Surface Plots

## print RSA plots
a <- plot(h3b.rsa.a, xlab="State Agreeableness", ylab="Trait Agreeableness", zlab="Tiredness(r)",
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="Trait-State Congruence: Agreeableness",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

b <- plot(h3b.rsa.h, xlab="State Honesty", ylab="Trait Honesty", zlab="Tiredness(r)", 
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="Trait-State Congruence: Honesty-humility",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

c <- plot(h4b.rsa.a.a, xlab="State Agreeableness", ylab="Adversity(r)", zlab="Tiredness(r)",
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="State-Situation Congruence:\nAgreeableness and Adversity",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

d <- plot(h4b.rsa.h.a, xlab="State Honesty", ylab="Adversity(r)", zlab="Tiredness(r)", 
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="State-Situation Congruence:\nHonesty and Adversity",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

e <- plot(h4b.rsa.a.d, xlab="State Agreeableness", ylab="Deception(r)", zlab="Tiredness(r)",
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="State-Situation Congruence:\nAgreeableness and Deception",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))

f <- plot(h4b.rsa.h.d, xlab="State Honesty", ylab="Deception(r)", zlab="Tiredness(r)", 
           legend=FALSE, distance = c(1.3, 1.3, 1.4), main="State-Situation Congruence:\nHonesty and Deception",
           project = c("contour"), axes = c("LOC", "LOIC"), hull=F,
           param=T, gridsize=7, points=list(show=FALSE), zlim=c(1, 5.5))


## combine plots
cowplot::plot_grid(a,b,c,d,e,f, ncol = 2, labels="AUTO", label_size = 12)
Response surface plots of the association between trait--state congruence, state--situation congruence, and tiredness. Adversity, deception, and tiredness were reverse-coded (indicated by *(r)*) such that higher values indicate less adversity, decpetion, and tiredness, respectively. The response surface parameters are listed below the titles. The blue lines represent the line of congruence (LOC; i.e., X = Y) and the line of incongruence (LOIC; i.e., X = -Y). The black lines represent the range of observed values as a twodimensional boxplot.

Figure 16: Response surface plots of the association between trait–state congruence, state–situation congruence, and tiredness. Adversity, deception, and tiredness were reverse-coded (indicated by (r)) such that higher values indicate less adversity, decpetion, and tiredness, respectively. The response surface parameters are listed below the titles. The blue lines represent the line of congruence (LOC; i.e., X = Y) and the line of incongruence (LOIC; i.e., X = -Y). The black lines represent the range of observed values as a twodimensional boxplot.

Conclusion

Overall, the data did not support the congruence hypotheses with regard to tiredness:

  • Analyses of variance did not yield any significant interaction effects (all Fs < 2.20, all ps > .139)

  • Only the behavior conditions were significantly associated with reverse-coded tiredness such that participants in the high agreeableness and honesty condition (M = 3.54, SD = 0.78) reported significantly more active mood—that is, less tiredness—than participants in the low agreeableness and honesty condition (M = 3.25, SD = 1.02, d =0.33, 95% CI [0.08, 0.58])

  • Polynomial regressions also showed that only higher levels of state agreeableness and state honesty-humility (but not interactions of fit patterns) were significantly associated with more active mood across all models (bs ranging from 0.11 to 0.24)

  • In summary, across both analysis of variance and response surface analysis, neither interactions nor fit patterns were significantly associated with positive affect

Congruence and Stroop Performance

Hypothesis

H3c: Congruence between personality trait and personality state is associated with with Stroop performance such that trait-congruent personality states are related to faster reaction times or less errors than trait-incongruent personality states.

H4c: Congruence between personality state and situation characteristic is associated with Stroop performance such that situation-congruent personality states are related are related to faster reaction times or less errors than situation-incongruent personality states.

Analytic Strategy

Statistical data analysis inevitably offers so-called researcher degrees of freedom. Many decisions must be made for which there are several equally valid options. Therefore, any decision is often both defensible and arbitrary (Simonsohn, Simmons, & Nelson, 2019). Handling of reaction times (RTs) in psychological experiments seems to offer a particularly great amount of researcher degrees of freedom. Therefore, we decided to conduct a mini specification-curve analysis (Simonsohn, Simmons, & Nelson, 2019) for all hypotheses that involve RTs. We call it mini specification-curve analysis because it does not involve all analyses or all steps of data handling, but merely focuses on identifying and handling outliers and calculating summary statistics in RT data. Additionally, we want to emphasize that we most certainly did not include all conceivable options for these decisions, but surely selected a fair and representative amount.

Step 1: Set of Reasonable Specifications

Here, we list the specifications we will include for four different decisions: (1) How to identify outliers in RTs, (2) how to treat these outliers, (3) which trials to use for calculation, and (4) which summary statistic to calculate. Numbers in brackets represent the number of specifications in the branch.

Reaction Times

Total Number of Specifications

Total Number of Specifications
46 methods for the identification of outliers x 3 methods for the treatment of outliers x 8 options for selecting trials to be included x 2 methods for the summary statistic x 4 options for covariates + no identification/treatment of outliers x 8 options for selecting trials to be included x 2 methods for the summary statistic x 4 options for covariates = 8832 + 64 = 8896 analyses

Identification of Outliers
Fixed Cutoffs (4)

All RTs below or above a certain, prespecified cutoff are identified as outliers

  • < 100ms, > 1500ms
  • < 350ms, > 2000ms
  • < 300ms, > 4000ms
  • < 200ms, > 2000ms
Relative cutoffs: Global (14)

Applied to all RTs from all participants and all conditions at the same time

Mean RT +- SDs (5)

  • Mean RT ± 2 SDs
  • Mean RT ± 2.5 SDs
  • Mean RT ± 3 SDs
  • Mean RT ± 3.5 SDs
  • Mean RT ± 4 SDs

Mean RT +- IQR (2)

  • Mean RT ± 3 IQR
  • Tukey (1977) fences: Q1-1.5 IQR or above Q3+1.5 IQR

Median +- MADs (3)

  • median plus or minus 2 times the MAD
  • median plus or minus 2.5 times the MAD
  • median plus or minus 3 times the MAD

Percentages (4)

  • 2% most extreme values
  • 5% most extreme values
  • 10% most extreme values
  • 15% most extreme values
Relative cutoffs: Per cell (14)

Applied separately to the RTs from each experimental cell, i.e., condition (but across participants)

Mean RT +- SDs (5)

  • Mean RT ± 2 SDs
  • Mean RT ± 2.5 SDs
  • Mean RT ± 3 SDs
  • Mean RT ± 3.5 SDs
  • Mean RT ± 4 SDs

Mean RT +- IQR (2)

  • Mean RT ± 3 IQR
  • Tukey (1977) fences: Q1-1.5 IQR or above Q3+1.5 IQR

Median +- MADs (3)

  • median plus or minus 2 times the MAD
  • median plus or minus 2.5 times the MAD
  • median plus or minus 3 times the MAD

Percentages (4)

  • 2% most extreme values
  • 5% most extreme values
  • 10% most extreme values
  • 15% most extreme values
Relative cutoffs: Per participant (14)

Applied separately to RTs from each participant (but across cells)

Mean RT +- SDs (5)

  • Mean RT ± 2 SDs
  • Mean RT ± 2.5 SDs
  • Mean RT ± 3 SDs
  • Mean RT ± 3.5 SDs
  • Mean RT ± 4 SDs

Mean RT +- IQR (2)

  • Mean RT ± 3 IQR
  • Tukey (1977) fences: Q1-1.5 IQR or above Q3+1.5 IQR

Median +- MADs (3)

  • median plus or minus 2 times the MAD
  • median plus or minus 2.5 times the MAD
  • median plus or minus 3 times the MAD

Percentages (4)

  • 2% most extreme values
  • 5% most extreme values
  • 10% most extreme values
  • 15% most extreme values
Treatment of Outliers
  • Trimming (i.e. outliers are removed)
  • Winsorizing (i.e., outliers are replaced by the cutoff)
  • Interpolating (i.e., outliers are replaced by the mean/median)
  • None (i.e., outliers are kept in the data)
Selection of the Trials to be Considered

Use all trials (4)

  • Overall (i.e., across all conditions)
  • Congruent trials only
  • Incongruent trials only
  • Neutral trials only

Use only correctly answered trials (4)

  • Overall (i.e., across all conditions)
  • Congruent trials only
  • Incongruent trials only
  • Neutral trials only
Summary Statistic
  • Mean
  • Median
Inclusion of Covariates
  • Experimental conditions only
  • Experimental conditions & points won in the game
  • Experimental conditions & point difference in the game
  • Experimental conditions, points won in the game, & point difference in the game

Error Rates

Total Number of Specifications

Total Number of Specifications
46 methods for the identification of outliers x 3 methods for the treatment of outliers x 4 options for selecting trials to be included x 1 methods for the calculation of summary statistics x 4 options for covariates + no identification/treatment of outliers x 4 options for selecting trials to be included x 1 methods for the calculation of summary statistics x 4 options for covariates = 2224 analyses

Identification of Outliers
Fixed cutoffs (4)

All RTs below or above a certain, pre-specified cutoff are identified as outliers

  • < 100ms, > 1500ms
  • < 350ms, > 2000ms
  • < 300ms, > 4000ms
  • < 200ms, > 2000ms
Relative cutoffs: Global (14)

Applied to all RTs from all participants and all conditions at the same time

Mean RT +- SDs (5)

  • Mean RT ± 2 SDs
  • Mean RT ± 2.5 SDs
  • Mean RT ± 3 SDs
  • Mean RT ± 3.5 SDs
  • Mean RT ± 4 SDs

Mean RT +- IQR (2)

  • Mean RT ± 3 IQR
  • Tukey (1977) fences: Q1-1.5 IQR or above Q3+1.5 IQR

Median +- MADs (3)

  • median plus or minus 2 times the MAD
  • median plus or minus 2.5 times the MAD
  • median plus or minus 3 times the MAD

Percentages (4)

  • 2% most extreme values
  • 5% most extreme values
  • 10% most extreme values
  • 15% most extreme values
Relative cutoffs: Per cell (14)

Applied separately to the RTs from each experimental cell, i.e., condition (but across participants)

Mean RT +- SDs (5)

  • Mean RT ± 2 SDs
  • Mean RT ± 2.5 SDs
  • Mean RT ± 3 SDs
  • Mean RT ± 3.5 SDs
  • Mean RT ± 4 SDs

Mean RT +- IQR (2)

  • Mean RT ± 3 IQR
  • Tukey (1977) fences: Q1-1.5 IQR or above Q3+1.5 IQR

Median +- MADs (3)

  • median plus or minus 2 times the MAD
  • median plus or minus 2.5 times the MAD
  • median plus or minus 3 times the MAD

Percentages (4)

  • 2% most extreme values
  • 5% most extreme values
  • 10% most extreme values
  • 15% most extreme values
Relative cutoffs: Per participant (14)

Applied separately to RTs from each participant

Mean RT +- SDs (5)

  • Mean RT ± 2 SDs
  • Mean RT ± 2.5 SDs
  • Mean RT ± 3 SDs
  • Mean RT ± 3.5 SDs *Mean RT ± 4 SDs

Mean RT +- IQR (2)

  • Mean RT ± 3 IQR
  • Tukey (1977) fences: Q1-1.5 IQR or above Q3+1.5 IQR

Median +- MADs (3)

  • median plus or minus 2 times the MAD
  • median plus or minus 2.5 times the MAD
  • median plus or minus 3 times the MAD

Percentages (4)

  • 2% most extreme values
  • 5% most extreme values
  • 10% most extreme values
  • 15% most extreme values
Treatment of Outliers
  • Trimming (i.e. outliers are removed)
  • None (i.e., outliers are kept in the data)
  • Error (i.e., outliers are considered errors)
  • Correct (i.e., outliers are considered correct)
Selection of the Trials to be Considered
  • Overall (i.e., across all conditions)
  • Congruent trials only
  • Incongruent trials only
  • Neutral trials only
Inclusion of Covariates
  • Experimental conditions
  • Experimental conditions & points won in the game
  • Experimental conditions & point difference in the game
  • Experimental conditions, points won in the game, & point difference in the game

Step 2: Descriptive Specification Curves

We conducted all analyses that include Stroop performance (RTs or error rates) separately for each specification. The results from the different specifications were then be graphically displayed in descriptive specification curves. These curves displayed the effects of interest (i.e., interaction coefficients or presence of fit patterns) from all specifications ranked by size of the effect. Additionally, these plots indicate which analytic decisions lead to which effects. Descriptive specification curves were used to examine the range of the effects across all specifications, the proportion of significant effects, and how the analytic decisions impacted the estimated effects.

Step 3: Permutation Test

Finally, we applied a permutation technique to test how inconsistent the results are with the null hypothesis of no effect across the specification curve. We created 500 data sets by shuffling the dependent variable (RT or error rate). In these datasets, because of the random distribution of RTs/error rates, the null hypothesis is per definition true.

We then needed to derive a test statistic from the specification curves under the null hypothesis (obtained with the 500 shuffled datasets). Because the congruence hypotheses are compound hypotheses for which several conditions must be fulfilled (see Humberg, Nestler, & Back, 2019), we used the percentage of specifications supporting the alternative hypothesis (i.e., the congruence effect) as the test statistic.

For each shuffled dataset, we calculated the percentage of specifications supporting the congruence hypothesis and compared the distribution of this percentage across the 500 samples to the observed percentage in the real data.

This comparison allowed us to determine whether we could reject the null hypothesis of no congruence effect across the specification curve. Specifically, the relative frequency of shuffled samples with at least as many specifications supporting the congruence effect as the unshuffled data represented the p value of the permutation test. This p value reflects the probability of observing this many or even more significant specifications under the assumption of no congruence effect.

Additionally, we graphically compared the observed and the expected-under-the-null specification curves.

Stroop Effect

sub <- data.clean %>% 
   ungroup() %>% 
   select("ResponseId", contains("Stroop"), "condition.bs") %>% 
   rename(id=ResponseId) %>% 
   filter(numStroopTrial=="passed")

stroop.long <- data.frame(id=NA, answer=NA, correct=NA, stimulus=NA, condition=NA, rt=NA, exp.cell=NA)

for(i in 1:nrow(sub)) {
   if(length(unlist(str_split(sub$numStroopAnswer[i],",")))==75) {
      answer=unlist(str_split(sub$numStroopAnswer[i],","))
   } else {
      answer=rep("-999",75)
   }
   new <- data.frame(id=rep(as.character(sub[i,1]),75), answer=answer, correct=unlist(str_split(sub$numStroopCorrectAnswer[i],",")),
                     stimulus=unlist(str_split(sub$numStroopStimulus[i],",")), condition=unlist(str_split(sub$numStroopCondition[i],",")),
                     rt=unlist(str_split(sub$numStroopReactionTime[i],",")), exp.cell=sub$condition.bs[i])
   stroop.long <- rbind(stroop.long, new)
}

stroop.long <- stroop.long[2:nrow(stroop.long),]
stroop.long$rt <- as.numeric(stroop.long$rt)
stroop.long$rt[which(stroop.long$rt==-999)] <- NA
stroop.long$rt[which(is.na(stroop.long$answer))] <- NA
stroop.long$answer[which(is.na(stroop.long$rt))] <- NA
stroop.long$condition <- factor(stroop.long$condition, levels=c(0, -1, 1), labels=c("neutral", "congruent", "incongruent"))
stroop.long$correct <- factor(stroop.long$correct, levels=c(0,1), labels=c("right", "left"))
stroop.long$answer[stroop.long$answer!="ArrowLeft" & stroop.long$answer!="ArrowRight"] <- NA
stroop.long$answer <- factor(stroop.long$answer, levels=c("ArrowLeft", "ArrowRight"), labels=c("left", "right"))
stroop.long$error <- ifelse(stroop.long$answer==stroop.long$correct, FALSE, TRUE) # TRUE means that there is an error as in error? true


stroop.short <- stroop.long %>% 
   filter(!is.na(condition)) %>% 
   filter(!is.na(rt)) %>% 
   filter(!is.na(error)) %>% 
   group_by(id, condition) %>% 
   summarize(error.rate = sum(error)*1/75,
             error.perc = sum(error)*100/75,
             mean.rt = mean(rt)) %>% 
   ungroup() %>% 
   left_join(., subset(data, select=c("ResponseId", "condition.beh", "condition.sit", "condition.bs")), by=c("id" = "ResponseId"))

Exemplary Specification

Descriptives

Here we present exemplary analyses of the Stroop effect for the one specification of reaction time (mean across all trials, no treatment of outliers) and error rate (error rate across all trials, no treatment of outliers). Below, we additionally provide a specification curve analysis of the Stroop effect.

tab <- bind_rows(describeBy(stroop.short$mean.rt, group=stroop.short$condition, mat = T, digits=2)[,c(2, 5:15, 4)],
                 describeBy(stroop.short$error.rate, group=stroop.short$condition, mat = T, digits=2)[,c(2, 5:15, 4)])

kable(tab,
      row.names = FALSE,
      col.names = c("Stroop trial type", "mean", "sd", "median", 
                    "trimmed", "mad", "min", "max", "range", "skew", "kurtosis", "se", "n"),
      caption="Descriptive statistics of average reaction times and error rates in the different Stroop trial types aggregated within persons.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) %>% 
   pack_rows("DV: Reaction Time", 1, 3) %>% 
   pack_rows("DV: Error Rate", 4, 6)
Table 48: Descriptive statistics of average reaction times and error rates in the different Stroop trial types aggregated within persons.
Stroop trial type mean sd median trimmed mad min max range skew kurtosis se n
DV: Reaction Time
neutral 816.47 187.30 777.33 798.01 130.61 477.73 1694.80 1217.07 1.47 3.65 14.76 161
congruent 763.98 180.06 735.33 744.50 146.04 418.70 1695.77 1277.07 1.60 4.88 14.19 161
incongruent 867.10 192.24 834.30 850.34 142.38 492.63 1836.07 1343.43 1.36 3.85 15.15 161
DV: Error Rate
neutral 0.00 0.01 0.00 0.00 0.00 0.00 0.03 0.03 3.32 10.98 0.00 161
congruent 0.00 0.01 0.00 0.00 0.00 0.00 0.07 0.07 4.55 27.26 0.00 161
incongruent 0.02 0.02 0.01 0.01 0.02 0.00 0.13 0.13 2.22 7.42 0.00 161

Regression Models

Here we present exemplary analyses of the Stroop effect for the one specification of reaction time (mean across all trials, no treatment of outliers) and error rate (error rate across all trials, no treatment of outliers). Below, we additionally provide a specification curve analysis of the Stroop effect.

stroop.short$condition <- relevel(stroop.short$condition, ref="congruent")

# model 
m.rt <- lmer(mean.rt ~ condition + (1|id), data=stroop.short)
m.er <- lmer(error.perc ~ condition + (1|id), data=stroop.short)

tab <- bind_rows(as.data.frame(summary(m.rt)$coefficients),as.data.frame(summary(m.er)$coefficients))
tab$df <- floor(tab$df)
tab$`Pr(>|t|)` <- printp(tab$`Pr(>|t|)`)
row.names(tab) <- c("Intercept (i.e., mean of congruent trials)", 
                    "Difference (in ms) between congruent and neutral trials",
                    "Difference (in ms) between congruent and incongruent trials", 
                    "Intercept (i.e., error rate of congruent trials)", 
                    "Difference (in %) between congruent and neutral trials",
                    "Difference (in %) between congruent and incongruent trials")

kable(tab,
      row.names = TRUE,
      escape = FALSE,
      digits = 3,
      align = "r",
      col.names = c("Coefficient", "SE", "df", "<i>t</i>", "<i>p</i>"),
      caption="Multilevel regression model predicting average reaction times and error rates from the different Stroop trial types aggregated within persons.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) %>% 
   pack_rows("DV: Reaction Time", 1, 3) %>% 
   pack_rows("DV: Error Rate", 4, 6) %>% 
   column_spec(1, width = "20em") %>%
   column_spec(2:5, width = "8em")
Table 49: Multilevel regression model predicting average reaction times and error rates from the different Stroop trial types aggregated within persons.
Coefficient SE df t p
DV: Reaction Time
Intercept (i.e., mean of congruent trials) 763.981 14.706 179 51.950 < .001
Difference (in ms) between congruent and neutral trials 52.485 6.027 320 8.709 < .001
Difference (in ms) between congruent and incongruent trials 103.114 6.027 320 17.110 < .001
DV: Error Rate
Intercept (i.e., error rate of congruent trials) 0.265 0.104 452 2.558 .011
Difference (in %) between congruent and neutral trials -0.108 0.133 319 -0.808 .420
Difference (in %) between congruent and incongruent trials 1.342 0.133 319 10.069 < .001

Visualization

Here we present exemplary analyses of the Stroop effect for the one specification of reaction time (mean across all trials, no treatment of outliers) and error rate (error rate across all trials, no treatment of outliers). Below, we additionally provide a specification curve analysis of the Stroop effect.

rt <- ggplot(stroop.short, aes(x = condition, y = mean.rt, fill = condition, colour = condition)) +
   theme_pub() +
   geom_point(position = position_jitter(width = .25), size = 1, alpha = .5) +
   geom_boxplot(outlier.shape = NA, alpha = 0.3, width = .15, colour = "BLACK") +
   guides(fill = "none", colour = "none") +
   ylab("Mean reaction   time") +
   theme_pub() +
   theme(axis.title.x = element_blank()) +
   ggtitle("Mean Reaction Time")

er <- ggplot(stroop.short, aes(x = condition, y = error.perc, fill = condition, colour = condition)) +
   theme_pub() +
   geom_point(position = position_jitter(width = .25, height = .1), size = 1, alpha = .5) +
   geom_boxplot(outlier.shape = NA, alpha = 0.5, width = .15, colour = "BLACK") +
   guides(fill = "none", colour = "none") +
   ylab("Error rate (%)") +
   theme_pub() +
   theme(axis.title.x = element_blank()) +
   ggtitle("Error Rate")

rt | er

Descriptive Specification Curves

p1a <- plot_curve_aov(results.stroop.rt,
                      "estimate_conditionincongruent",
                      desc = FALSE,
                      ci = FALSE,
                      ribbon = TRUE,
                      legend = FALSE,
                      null = 0) + 
   theme_pub() + ylab("numerical Stroop effect (in ms)") + ggtitle("Reaction Time") +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

p2a <- plot_curve_aov(results.stroop.er,
                      "estimate_conditionincongruent",
                      desc = FALSE,
                      ci = FALSE,
                      ribbon = TRUE,
                      legend = FALSE,
                      null = 0) + 
   theme_pub() + ylab("numerical Stroop effect\n(in % of errors)") +
   scale_y_continuous(labels = function(x) x * 100) + ggtitle("Error Rate") +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

p1b <- plot_choices_aov(results.stroop.rt,
                        "estimate_conditionincongruent",
                        choices = c("identification", "treatment", "summary", "subset"),
                        desc = FALSE,
                        null = 0) + theme_pub() + 
   theme(strip.text.y = element_text(size=9,face="bold"),
         panel.spacing = unit(.6, "lines"),
         axis.text.y = element_text(size=10, hjust=1)) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

p2b <- plot_choices_aov(results.stroop.er,
                        "estimate_conditionincongruent",
                        choices = c("identification", "treatment"),
                        desc = FALSE,
                        null = 0) + theme_pub() +
   theme(strip.text.y = element_text(size=9,face="bold", hjust=1, margin=margin(l=10, b=10, r=10)),
         axis.text.y = element_text(size=10, hjust=1)) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

#p1/p2

cowplot::plot_grid(p1a, p2a, p1b, p2b, ncol=2, labels=c("A","B","",""), label_size = 10, align = "v", axis = "rbl", rel_heights = c(1, 1.3))

Permutation Test

## create table
tab <- bind_cols(data.frame(dv=c("Reaction time", "Error rate")), res.stroop)

tab$predictor <- c("Stroop effect: difference in reaction time (in ms) between incongruent and congruent trials",
                   "Stroop effect: difference in error rate (in %) between incongruent and congruent trials")
tab$med.eff[2] <- tab$med.eff[2]*100
tab$p.val <- printp(tab$p.val)
tab$n.sig <- round(tab$n.sig*100/tab$n.specs,0)


## print table
kable(tab,
      align = c("l", "l", "r", "r", "r", "r", "r"),
      escape = F, 
      col.names = c("DV", "Relevant predictor", "Number of specifications", "Median effect size", 
                    "Significant specifications (%)", "Number of shuffled samples with more significant 
                    specifications than for the original sample", "<i>p</i> value of permutation test")) %>% 
   add_header_above(c(" " = 2, 
                      "Description of specification curve\n(for original sample)" = 3, 
                      "Permutation test with\n500 shuffled samples" = 2)) %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Description of specification curve
(for original sample)
Permutation test with
500 shuffled samples
DV Relevant predictor Number of specifications Median effect size Significant specifications (%) Number of shuffled samples with more significant specifications than for the original sample p value of permutation test
Reaction time Stroop effect: difference in reaction time (in ms) between incongruent and congruent trials 556 106.71 100 0 < .001
Error rate Stroop effect: difference in error rate (in %) between incongruent and congruent trials 139 3.00 100 7 .014

Inferential Specification Curves

p1 <- plot_curve_aov(results.stroop.rt, "estimate_conditionincongruent", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "numerical Stroop effect (in ms)") +
   theme_pub() + 
   geom_ribbon(data=conf.curves[["conf.curve.stroop.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   scale_x_continuous(breaks = seq(0,600,100)) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Reaction time") 

p2 <- plot_curve_aov(results.stroop.er, "estimate_conditionincongruent", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "numerical Stroop effect (in % of errors)") +
   theme_pub() + 
   geom_ribbon(data=conf.curves[["conf.curve.stroop.er"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   scale_y_continuous(labels = function(x) x * 100) +
   scale_x_continuous(breaks = seq(0,150,25)) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Error rates")

cowplot::plot_grid(p1, p2, ncol=2, labels=c("A","B"), label_size = 10, align = "v", axis = "rbl")

Conclusion

As expected, we found significant Stroop effects in the numerical Stroop task:

  • Participants had significantly longer reaction times in incongruent trials than in congruent trials (median difference across all specifications: 106.71ms)
  • Participants made significantly more errors in incongruent trials than in congruent trials (median difference across all specifications: 3%)
  • Permutation tests demonstrated that the null hypothesis of no Stroop effect had to be rejected across the whole specification curve, p < .001 for reaction times and p = .014 for error rates

Analysis of Variance

Descriptive Specification Curves

Reaction Time

labels.pre = c("condition.beh + condition.sit", 
               "condition.beh + condition.sit + points.c",
               "condition.beh + condition.sit + points.c + points.diff",
               "condition.beh + condition.sit + points.diff")
labels.post = c("exp. groups",
                "exp. groups + points",
                "exp. groups + points + diff",
                "exp. groups + diff")

res.aov.rt.a <- res.aov.rt.a %>% 
   mutate(controls = factor(controls, 
                            levels=c("condition.beh + trait.a.ms + condition.sit", 
                                     "condition.beh + trait.a.ms + condition.sit + points.c",
                                     "condition.beh + trait.a.ms + condition.sit + points.c + points.diff",
                                     "condition.beh + trait.a.ms + condition.sit + points.diff"), 
                            labels=c("exp. groups",
                                     "exp. groups + points",
                                     "exp. groups + points + diff",
                                     "exp. groups + diff")))



res.aov.rt.h <- res.aov.rt.h %>% 
   mutate(controls = factor(controls, 
                            levels=c("condition.beh + trait.h.ms + condition.sit", 
                                     "condition.beh + trait.h.ms + condition.sit + points.c",
                                     "condition.beh + trait.h.ms + condition.sit + points.c + points.diff",
                                     "condition.beh + trait.h.ms + condition.sit + points.diff"), 
                            labels=c("exp. groups",
                                     "exp. groups + points",
                                     "exp. groups + points + diff",
                                     "exp. groups + diff")))

res.aov.rt.sit <- res.aov.rt.sit %>% 
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

a <- plot_curve_aov(res.aov.rt.a, "estimate_condition.behhigh agreeableness and honesty:trait.a.mshigh trait agreeableness", ci = FALSE, ribbon = T) +
   geom_hline(yintercept = 0,  linetype = "dashed",  color = "black") +
   labs(x = "", y = "interaction effect (in ms)") +
   theme_pub() + ggtitle("Trait Agreeableness x Behavior Conditions") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

b <- plot_curve_aov(res.aov.rt.h, "estimate_condition.behhigh agreeableness and honesty:trait.h.mshigh trait honesty-humility", ci = FALSE, ribbon = T) +
   geom_hline(yintercept = 0,  linetype = "dashed",  color = "black") +
   labs(x = "", y = "interaction effect (in ms)") +
   theme_pub() + ggtitle("Trait Honesty x Behavior Conditions") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

c <- plot_curve_aov(res.aov.rt.sit, "estimate_condition.behhigh agreeableness and honesty:condition.sit2", ci = FALSE, ribbon = T) +
   geom_hline(yintercept = 0,  linetype = "dashed",  color = "black") +
   labs(x = "", y = "interaction effect (in ms)") +
   theme_pub() + ggtitle("Situation x Behavior Conditions") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

d <- plot_choices_aov(res.aov.rt.a, "estimate_condition.behhigh agreeableness and honesty:trait.a.mshigh trait agreeableness", 
                      choices = c("identification", "treatment", "conditions", "summary", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

e <- plot_choices_aov(res.aov.rt.h, "estimate_condition.behhigh agreeableness and honesty:trait.h.mshigh trait honesty-humility", 
                      choices = c("identification", "treatment", "conditions", "summary", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left


f <- plot_choices_aov(res.aov.rt.sit, "estimate_condition.behhigh agreeableness and honesty:condition.sit2", 
                      choices = c("identification", "treatment", "conditions", "summary", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left



## combine plots
cowplot::plot_grid(a,b,d,e,c,NULL,f, ncol=2,  labels=c("A","B", "","", "C","", ""), label_size = 12, align = "v", axis = "rbl", rel_heights = c(1, 1.5))
Descriptive specification curves of trait-state and state-situation interaction coefficients predicting Stroop error rates.

Figure 17: Descriptive specification curves of trait-state and state-situation interaction coefficients predicting Stroop error rates.

d <- res.aov.rt.a %>% 
   select(contains("estimate")) %>% 
   summarize(intercept = median(`estimate_(Intercept)`),
             cond.high = median(`estimate_condition.behhigh agreeableness and honesty`),
             trait.high = median(`estimate_trait.a.mshigh trait agreeableness`),
             interaction = median(`estimate_condition.behhigh agreeableness and honesty:trait.a.mshigh trait agreeableness`)) 

df <- data.frame(value=rep(NA,4), trait=rep(c("disagreeable", "agreeable"),2), behavior=rep(c("disagreeable", "agreeable"),each=2))
df$value <- c(d$intercept, d$intercept+d$trait.high, d$intercept+d$cond.high, d$intercept+d$cond.high+d$trait.high+d$interaction)

ggplot(df, aes(x=behavior, y=value, group=trait, linetype=trait)) + theme_pub() +
   geom_line() + geom_point() +
   scale_x_discrete(expand=c(0.1,0.1)) +
   scale_y_continuous(limits=c(740,830)) +
   theme(legend.position = "right", legend.title = element_text(size=10,face="bold")) + 
   labs(x="Behavior conditions", y="Median predicted reaction time\nacross all specifications (in ms)", linetype="Trait Agreeableness") + ggtitle("Trait Agreeableness x Behavior Conditions")
Illustration of the significant interaction between median-split trait agreeableness and the behavior conditions predicting reaction times.

Figure 18: Illustration of the significant interaction between median-split trait agreeableness and the behavior conditions predicting reaction times.

Error Rate

res.aov.er.a <- res.aov.er.a %>% 
   mutate(controls = factor(controls, 
                            levels=c("condition.beh + trait.a.ms + condition.sit", 
                                     "condition.beh + trait.a.ms + condition.sit + points.c",
                                     "condition.beh + trait.a.ms + condition.sit + points.c + points.diff",
                                     "condition.beh + trait.a.ms + condition.sit + points.diff"), 
                            labels=c("exp. groups",
                                     "exp. groups + points",
                                     "exp. groups + points + diff",
                                     "exp. groups + diff")))

res.aov.er.h <- res.aov.er.h %>% 
   mutate(controls = factor(controls, 
                            levels=c("condition.beh + trait.h.ms + condition.sit", 
                                     "condition.beh + trait.h.ms + condition.sit + points.c",
                                     "condition.beh + trait.h.ms + condition.sit + points.c + points.diff",
                                     "condition.beh + trait.h.ms + condition.sit + points.diff"), 
                            labels=c("exp. groups",
                                     "exp. groups + points",
                                     "exp. groups + points + diff",
                                     "exp. groups + diff")))

res.aov.er.sit <- res.aov.er.sit %>% 
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

a <- plot_curve_aov(res.aov.er.a, "estimate_condition.behhigh agreeableness and honesty:trait.a.mshigh trait agreeableness", ci = FALSE, ribbon = T) +
   geom_hline(yintercept = 0,  linetype = "dashed",  color = "black") +
   labs(x = "", y = "interaction effect\n(in % of errors)") +
   theme_pub() + ggtitle("Trait-State Agreeableness") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   scale_x_continuous(breaks=seq(0,2400,500)) +
   scale_y_continuous(labels = function(x) x * 100) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

b <- plot_curve_aov(res.aov.er.h, "estimate_condition.behhigh agreeableness and honesty:trait.h.mshigh trait honesty-humility", ci = FALSE, ribbon = T) +
   geom_hline(yintercept = 0,  linetype = "dashed",  color = "black") +
   labs(x = "", y = "interaction effect\n(in % of errors)") +
   theme_pub() + ggtitle("Trait-State Honesty") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   scale_x_continuous(breaks=seq(0,2400,500)) +
   scale_y_continuous(labels = function(x) x * 100) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

c <- plot_curve_aov(res.aov.er.sit, "estimate_condition.behhigh agreeableness and honesty:condition.sit2", ci = FALSE, ribbon = T) +
   geom_hline(yintercept = 0,  linetype = "dashed",  color = "black") +
   labs(x = "", y = "interaction effect\n(in % of errors)") +
   theme_pub() + ggtitle("Situation x Behavior Conditions") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   scale_x_continuous(breaks=seq(0,2400,500)) +
   scale_y_continuous(labels = function(x) x * 100) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

d <- plot_choices_aov(res.aov.er.a, "estimate_condition.behhigh agreeableness and honesty:trait.a.mshigh trait agreeableness", 
                      choices = c("identification", "treatment", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   scale_x_continuous(breaks=seq(0,2400,500)) +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

e <- plot_choices_aov(res.aov.er.h, "estimate_condition.behhigh agreeableness and honesty:trait.h.mshigh trait honesty-humility", 
                      choices = c("identification", "treatment", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   scale_x_continuous(breaks=seq(0,2400,500)) +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left


f <- plot_choices_aov(res.aov.er.sit, "estimate_condition.behhigh agreeableness and honesty:condition.sit2", 
                      choices = c("identification", "treatment", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   scale_x_continuous(breaks=seq(0,2400,500)) +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left



## combine plots
cowplot::plot_grid(a,b,d,e,c,NULL,f, ncol=2,  labels=c("A","B", "","", "C","", ""), label_size = 12, align = "v", axis = "rbl", rel_heights = c(1, 1.5))
Descriptive specification curves of trait-state and state-situation interaction coefficients predicting Stroop error rates.

Figure 19: Descriptive specification curves of trait-state and state-situation interaction coefficients predicting Stroop error rates.

Permutation Test

Reaction Time

## create table
tab <- data.frame(congruence.op=rep("Interaction",3), 
                  predictor=c("Median-split Trait A x Behavior Conditions", 
                              "Median-split Trait H x Behavior Conditions",
                              "Situation x Behavior Conditions"),
                  n.specs = NA,
                  med.effect = NA,
                  perc.sig = NA,
                  n.shuff = NA,
                  p.val = NA)

## fill table
tab[c(1:3),3:7] <- res.aov.rt[,2:6]


## format table
tab$p.val <- printp(tab$p.val)
tab$perc.sig <- ifelse(is.na(tab$perc.sig),NA,paste0(round(tab$perc.sig*100/tab$n.specs,0),"%"))



## print table
kable(tab,
      align = c("l", "l", "r", "r", "r", "r", "r"),
      escape=F,
      col.names = c("Operationalization", 
                    "Relevant predictor", "Number of specifications", 
                    "Median effect size",  "Significant specifications (%)", 
                    "Number of shuffled samples\nwith more significant 
                    specifications\nthan for the original sample", "<i>p</i> value of permutation test")) %>% 
   add_header_above(c(" " = 2, 
                      "Description of specification curve (for original sample)" = 3, 
                      "Permutation test with 500 shuffled samples" = 2)) %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Description of specification curve (for original sample)
Permutation test with 500 shuffled samples
Operationalization Relevant predictor Number of specifications Median effect size Significant specifications (%) Number of shuffled samples with more significant specifications than for the original sample p value of permutation test
Interaction Median-split Trait A x Behavior Conditions 8896 114.00 66% 9 .018
Interaction Median-split Trait H x Behavior Conditions 8896 -11.40 0% 500 > .999
Interaction Situation x Behavior Conditions 8896 48.61 0% 500 > .999

Error Rate

## create table
tab <- data.frame(congruence.op=rep("Interaction",3), 
                  predictor=c("Median-split Trait A x Behavior Conditions", 
                              "Median-split Trait H x Behavior Conditions",
                              "Situation x Behavior Conditions"),
                  n.specs = NA,
                  med.effect = NA,
                  perc.sig = NA,
                  n.shuff = NA,
                  p.val = NA)

## fill table
tab[c(1:3),3:7] <- res.aov.error[,2:6]


## format table
tab$p.val <- printp(tab$p.val)
tab$perc.sig <- ifelse(is.na(tab$perc.sig),NA,paste0(round(tab$perc.sig*100/tab$n.specs,0),"%"))



## print table
kable(tab,
      align = c("l", "l", "r", "r", "r", "r", "r"),
      escape=F,
      col.names = c("Operationalization", 
                    "Relevant predictor", "Number of specifications", 
                    "Median effect size",  "Significant specifications (%)", 
                    "Number of shuffled samples with more significant 
                    specifications than for the original sample", "<i>p</i> value of permutation test")) %>% 
   add_header_above(c(" " = 2, 
                      "Description of specification curve (for original sample)" = 3, 
                      "Permutation test with 500 shuffled samples" = 2)) %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Description of specification curve (for original sample)
Permutation test with 500 shuffled samples
Operationalization Relevant predictor Number of specifications Median effect size Significant specifications (%) Number of shuffled samples with more significant specifications than for the original sample p value of permutation test
Interaction Median-split Trait A x Behavior Conditions 2224 -0.01 5% 127 .254
Interaction Median-split Trait H x Behavior Conditions 2224 0.00 0% 376 .752
Interaction Situation x Behavior Conditions 2224 0.00 0% 370 .740

Inferential Specification Curves

Reaction Time

a <- plot_curve_aov(res.aov.rt.a, "estimate_condition.behhigh agreeableness and honesty:trait.a.mshigh trait agreeableness", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1500)) +
   geom_ribbon(data=conf.curves[["conf.curves.aov.rt"]][["results.aov.rt.a"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait Agreeableness x Behavior Conditions")

b <- plot_curve_aov(res.aov.rt.h, "estimate_condition.behhigh agreeableness and honesty:trait.h.mshigh trait honesty-humility", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1500)) +
   geom_ribbon(data=conf.curves[["conf.curves.aov.rt"]][["results.aov.rt.h"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait Honesty x Behavior Conditions") 


c <- plot_curve_aov(res.aov.rt.sit, "estimate_condition.behhigh agreeableness and honesty:condition.sit2", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1500)) +
   geom_ribbon(data=conf.curves[["conf.curves.aov.rt"]][["results.aov.rt.sit"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Situation x Behavior Conditions") 

cowplot::plot_grid(a,b,c, ncol=2,  labels=c("A","B","C"), label_size = 12, align = "v", axis = "rbl")
Comparison of observed (descriptive) specification curves (black dots) and expected under-the-null specification curves (shaded area). The shaded area represents the range of effects observed in the shuffled datasets (between the 2.5th and and 97.5th percentiles of the ranked estimates).

Figure 20: Comparison of observed (descriptive) specification curves (black dots) and expected under-the-null specification curves (shaded area). The shaded area represents the range of effects observed in the shuffled datasets (between the 2.5th and and 97.5th percentiles of the ranked estimates).

Error Rate

a <- plot_curve_aov(res.aov.er.a, "estimate_condition.behhigh agreeableness and honesty:trait.a.mshigh trait agreeableness", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.aov.er"]][["results.aov.er.a"]], 
               mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   scale_y_continuous(labels = function(x) x * 100) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait Agreeableness x Behavior Conditions")

b <- plot_curve_aov(res.aov.er.h, "estimate_condition.behhigh agreeableness and honesty:trait.h.mshigh trait honesty-humility", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.aov.er"]][["results.aov.er.h"]], 
               mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   scale_y_continuous(labels = function(x) x * 100) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait Honesty x Behavior Conditions") 


c <- plot_curve_aov(res.aov.er.sit, "estimate_condition.behhigh agreeableness and honesty:condition.sit2", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.aov.er"]][["results.aov.er.sit"]], 
               mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   scale_y_continuous(labels = function(x) x * 100) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Situation x Behavior Conditions") 

cowplot::plot_grid(a,b,c, ncol=2,  labels=c("A","B","C"), label_size = 12, align = "v", axis = "rbl")
Comparison of observed (descriptive) specification curves (black dots) and expected under-the-null specification curves (shaded area). The shaded area represents the range of effects observed in the shuffled datasets (between the 2.5th and and 97.5th percentiles of the ranked estimates).

Figure 21: Comparison of observed (descriptive) specification curves (black dots) and expected under-the-null specification curves (shaded area). The shaded area represents the range of effects observed in the shuffled datasets (between the 2.5th and and 97.5th percentiles of the ranked estimates).

Response Surface Analysis

Descriptive Specification Curves

Reaction Time

labels.pre = c("condition.beh + condition.sit", 
               "condition.beh + condition.sit + points.c",
               "condition.beh + condition.sit + points.c + points.diff",
               "condition.beh + condition.sit + points.diff")
labels.post = c("exp. groups",
                "exp. groups + points",
                "exp. groups + points + diff",
                "exp. groups + diff")

res.rsa.rt.a <- res.rsa.rt.a %>%
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

res.rsa.rt.h <- res.rsa.rt.h %>% 
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

res.rsa.rt.a.adv <- res.rsa.rt.a.adv %>% 
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

res.rsa.rt.a.dec <- res.rsa.rt.a.dec %>%
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

res.rsa.rt.h.adv <- res.rsa.rt.h.adv %>%
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

res.rsa.rt.h.dec <- res.rsa.rt.h.dec %>%
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))



a <- plot_curve_rsa(res.rsa.rt.a, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed",  color = "black") +
   labs(x = "", y = "interaction effect (in ms)") +
   theme_pub() + ggtitle("Trait-State Agreeableness") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

b <- plot_curve_rsa(res.rsa.rt.h, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "interaction effect (in ms)") +
   theme_pub() + ggtitle("Trait-State Honesty-Humility") +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

c <- plot_choices_rsa(res.rsa.rt.a, "est_b4", choices = c("identification", "treatment", "summary", "trials", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) +
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

d <- plot_choices_rsa(res.rsa.rt.h, "est_b4", choices = c("identification", "treatment", "summary", "trials", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

e <- plot_curve_rsa(res.rsa.rt.a.adv, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "interaction effect (in ms)") +
   theme_pub() + ggtitle("State Agreeableness-Adversity")+
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

f <- plot_curve_rsa(res.rsa.rt.h.adv, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "interaction effect (in ms)") +
   theme_pub() + ggtitle("State Honesty-Adversity")+
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

g <- plot_choices_rsa(res.rsa.rt.a.adv, "est_b4", choices = c("identification", "treatment", "summary", "trials", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

h <- plot_choices_rsa(res.rsa.rt.h.adv, "est_b4", choices = c("identification", "treatment", "summary", "trials", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(strip.text.x = element_blank()) +
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left


i <- plot_curve_rsa(res.rsa.rt.a.dec, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "interaction effect (in ms)") +
   theme_pub() + ggtitle("State Agreeableness-Deception")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

j <- plot_curve_rsa(res.rsa.rt.h.dec, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "interaction effect (in ms)") +
   theme_pub() + ggtitle("State Honesty-Deception")+
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

k <- plot_choices_rsa(res.rsa.rt.a.dec, "est_b4", choices = c("identification", "treatment", "summary", "trials", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) +
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

l <- plot_choices_rsa(res.rsa.rt.h.dec, "est_b4", choices = c("identification", "treatment", "summary", "trials", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   scale_x_continuous(breaks=seq(0,9000,1500)) +
   theme(strip.text.x = element_blank()) +
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold"),
         panel.spacing = unit(.75, "lines")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left


## combine plots
cowplot::plot_grid(a,b,c,d,e,f,g,h,i,j,k,l, ncol=2, labels=c("A","B","","","C","D","","","E","F","",""), 
                   label_size = 10, align = "v", axis = "rbl", rel_heights = c(1,2,1,2,1,2))
Descriptive specification curves of trait-state and state-situation interaction coefficients predicting Stroop reaction times.

Figure 22: Descriptive specification curves of trait-state and state-situation interaction coefficients predicting Stroop reaction times.

a <- plot_curve_rsa(res.rsa.rt.a, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed",  color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("Trait-State Agreeableness") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

b <- plot_curve_rsa(res.rsa.rt.h, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("Trait-State Honesty-Humility") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

c <- plot_choices_rsa(res.rsa.rt.a, "fit", choices = c("identification", "treatment", "summary", "trials", "conditions")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

d <- plot_choices_rsa(res.rsa.rt.h, "fit", choices = c("identification", "treatment", "summary", "trials", "conditions")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

e <- plot_curve_rsa(res.rsa.rt.a.adv, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("State Agreeableness-Adversity")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

f <- plot_curve_rsa(res.rsa.rt.h.adv, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("State Honesty-Adversity")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

g <- plot_choices_rsa(res.rsa.rt.a.adv, "fit", choices = c("identification", "treatment", "summary", "trials", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

h <- plot_choices_rsa(res.rsa.rt.h.adv, "fit", choices = c("identification", "treatment", "summary", "trials", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left


i <- plot_curve_rsa(res.rsa.rt.a.dec, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("State Agreeableness-Deception")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

j <- plot_curve_rsa(res.rsa.rt.h.dec, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("State Honesty-Deception")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

k <- plot_choices_rsa(res.rsa.rt.a.dec, "fit", choices = c("identification", "treatment", "summary", "trials", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

l <- plot_choices_rsa(res.rsa.rt.h.dec, "fit", choices = c("identification", "treatment", "summary", "trials", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left


## combine plots
cowplot::plot_grid(a,b,c,d,e,f,g,h,i,j,k,l, ncol=2, labels=c("A","B","","","C","D","","","E","F","",""), label_size = 10, align = "v", axis = "rbl", rel_heights = c(1, 1.8,1,1.8,1,1.8))
Descriptive specification curves of trait-state congruence and state-situation congruence predicting Stroop reaction times.

Figure 23: Descriptive specification curves of trait-state congruence and state-situation congruence predicting Stroop reaction times.

Error Rate

res.rsa.er.a <- res.rsa.er.a %>% 
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

res.rsa.er.h <- res.rsa.er.h %>% 
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

res.rsa.er.a.adv <- res.rsa.er.a.adv %>% 
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

res.rsa.er.a.dec <- res.rsa.er.a.dec %>% 
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

res.rsa.er.h.adv <- res.rsa.er.h.adv %>% 
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

res.rsa.er.h.dec <- res.rsa.er.h.dec %>% 
   mutate(controls = factor(controls, levels=labels.pre, labels=labels.post))

a <- plot_curve_rsa(res.rsa.er.a, "est_b4", ci = FALSE, ribbon = T) +
   geom_hline(yintercept = 0,  linetype = "dashed",  color = "black") +
   labs(x = "", y = "interaction effect\n(in % of errors)") +
   theme_pub() + ggtitle("Trait-State Agreeableness") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   scale_y_continuous(labels = function(x) x * 100) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

b <- plot_curve_rsa(res.rsa.er.h, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "interaction effect\n(in % of errors)") +
   scale_y_continuous(labels = function(x) x * 100) +
   theme_pub() + ggtitle("Trait-State Honesty-Humility") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

c <- plot_choices_rsa(res.rsa.er.a, "est_b4", choices = c("identification", "treatment", "conditions","controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

d <- plot_choices_rsa(res.rsa.er.h, "est_b4", choices = c("identification", "treatment", "conditions","controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

e <- plot_curve_rsa(res.rsa.er.a.adv, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "interaction effect\n(in % of errors)") +
   scale_y_continuous(labels = function(x) x * 100) +
   theme_pub() + ggtitle("State Agreeableness-Adversity")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

f <- plot_curve_rsa(res.rsa.er.h.adv, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   scale_y_continuous(labels = function(x) x * 100) +
   labs(x = "", y = "interaction effect\n(in % of errors)") +
   theme_pub() + ggtitle("State Honesty-Adversity")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

g <- plot_choices_rsa(res.rsa.er.a.adv, "est_b4", choices = c("identification", "treatment", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

h <- plot_choices_rsa(res.rsa.er.h.adv, "est_b4", choices = c("identification", "treatment", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

i <- plot_curve_rsa(res.rsa.er.a.dec, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   scale_y_continuous(labels = function(x) x * 100) +
   labs(x = "", y = "interaction effect\n(in % of errors)") +
   theme_pub() + ggtitle("State Agreeableness-Deception")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

j <- plot_curve_rsa(res.rsa.er.h.dec, "est_b4", ci = FALSE, ribbon = TRUE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "interaction effect\n(in % of errors)") +
   scale_y_continuous(labels = function(x) x * 100) +
   theme_pub() + ggtitle("State Honesty-Deception")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

k <- plot_choices_rsa(res.rsa.er.a.dec, "est_b4", choices = c("identification", "treatment", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

l <- plot_choices_rsa(res.rsa.er.h.dec, "est_b4", choices = c("identification", "treatment", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10, hjust=1),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left


## combine plots
cowplot::plot_grid(a,b,c,d,e,f,g,h,i,j,k,l, ncol=2, labels=c("A","B","","","C","D","","","E","F","",""), label_size = 12, align = "v", axis = "rbl", rel_heights = c(1, 1.6,1,1.6,1,1.6))
Descriptive specification curves of trait-state and state-situation interaction coefficients predicting Stroop error rates.

Figure 24: Descriptive specification curves of trait-state and state-situation interaction coefficients predicting Stroop error rates.

a <- plot_curve_rsa(res.rsa.er.a, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed",  color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("Trait-State Agreeableness") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

b <- plot_curve_rsa(res.rsa.er.h, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("Trait-State Honesty-Humility") +
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

c <- plot_choices_rsa(res.rsa.er.a, "fit", choices = c("identification", "treatment", "conditions",  "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

d <- plot_choices_rsa(res.rsa.er.h, "fit", choices = c("identification", "treatment","conditions",  "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

e <- plot_curve_rsa(res.rsa.er.a.adv, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("State Agreeableness-Adversity")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

f <- plot_curve_rsa(res.rsa.er.h.adv, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("State Honesty-Adversity")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

g <- plot_choices_rsa(res.rsa.er.a.adv, "fit", choices = c("identification", "treatment","conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

h <- plot_choices_rsa(res.rsa.er.h.adv, "fit", choices = c("identification", "treatment","conditions",  "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left


i <- plot_curve_rsa(res.rsa.er.a.dec, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("State Agreeableness-Deception")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

j <- plot_curve_rsa(res.rsa.er.h.dec, "fit", ci = FALSE, ribbon = FALSE) +
   geom_hline(yintercept = 0,  linetype = "dashed", color = "black") +
   labs(x = "", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + ggtitle("State Honesty-Deception")+
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(20,0,-20,-10), "pt")) #top, right, bottom, left

k <- plot_choices_rsa(res.rsa.er.a.dec, "fit", choices = c("identification", "treatment", "conditions", "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left

l <- plot_choices_rsa(res.rsa.er.h.dec, "fit", choices = c("identification", "treatment", "conditions",  "controls")) +
   labs(x = "specifications (ranked)") + theme_pub() +
   theme(strip.text.x = element_blank()) + 
   theme(axis.text.y = element_text(size=10),
         axis.text.x = element_text(size=10),
         strip.text.y = element_text(size=9),
         axis.title=element_text(size=10,face="bold")) +
   theme(plot.margin = unit(c(0,0,10,-10), "pt")) #top, right, bottom, left


## combine plots
cowplot::plot_grid(a,b,c,d,e,f,g,h,i,j,k,l, ncol=2, labels=c("A","B","","","C","D","","","E","F","",""), label_size = 10, align = "v", axis = "rbl", rel_heights = c(1, 1.6,1,1.6,1,1.6))
Descriptive specification curves of trait-state congruence and state-situation congruence predicting Stroop error rates.

Figure 25: Descriptive specification curves of trait-state congruence and state-situation congruence predicting Stroop error rates.

Permutation Test

Reaction Time

## create table
tab <- data.frame(congruence.op=c(rep("Interaction",6), rep("Fit pattern",6)),
                  predictor=rep(c("Trait A x State A", "Trait HH x State HH",
                                    "State A x Adversity", "State A x Deception",
                                    "State HH x Adversity", "State HH x Deception"),2),
                  n.specs = NA,
                  med.effect = NA,
                  perc.sig = NA,
                  n.shuff = NA,
                  p.val = NA)

## fill table
tab[,3:7] <- res.rsa.rt[,2:6]


## format table
tab$p.val <- printp(tab$p.val)
tab$med.effect[c(7:12)] <- ifelse(tab$med.effect[c(7:12)]==0, "no", "yes")
tab$perc.sig <- ifelse(is.na(tab$perc.sig),NA,paste0(round(tab$perc.sig*100/tab$n.specs,0),"%"))



## print table
kable(tab,
      align = c("l", "l", "r", "r", "r", "r", "r"),
      col.names = c("Operationalization", 
                    "Relevant predictor", "Number of specifications", 
                    "Median effect size",  "Significant specifications (%)", 
                    "Number of shuffled samples with more significant 
                    specifications than for the original sample", "<i>p</i> value of permutation test")) %>% 
   add_header_above(c(" " = 2, 
                      "Description of specification curve (for original sample)" = 3, 
                      "Permutation test with 500 shuffled samples" = 2)) %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Description of specification curve (for original sample)
Permutation test with 500 shuffled samples
Operationalization Relevant predictor Number of specifications Median effect size Significant specifications (%) Number of shuffled samples with more significant specifications than for the original sample <i>p</i> value of permutation test
Interaction Trait A x State A 8896 -1.15 0% 400 > .999
Interaction Trait HH x State HH 8896 -5.02 3% 105 .210
Interaction State A x Adversity 8896 3.07 0% 192 .384
Interaction State A x Deception 8896 -4.25 0% 500 > .999
Interaction State HH x Adversity 8896 -2.36 0% 500 > .999
Interaction State HH x Deception 8896 -0.58 0% 500 > .999
Fit pattern Trait A x State A 8896 no 0% 161 .402
Fit pattern Trait HH x State HH 8896 no 1% 89 .178
Fit pattern State A x Adversity 8896 no 0% 500 > .999
Fit pattern State A x Deception 8896 no 0% 500 > .999
Fit pattern State HH x Adversity 8896 no 0% 500 > .999
Fit pattern State HH x Deception 8896 no 0% 500 > .999

Error Rate

## create table
tab <- data.frame(congruence.op=c(rep("Interaction",6), rep("Fit pattern",6)),
                  predictor=rep(c("Trait A x State A", "Trait HH x State HH",
                                    "State A x Adversity", "State A x Deception",
                                    "State HH x Adversity", "State HH x Deception"),2),
                  n.specs = NA,
                  med.effect = NA,
                  perc.sig = NA,
                  n.shuff = NA,
                  p.val = NA)

## fill table
tab[,3:7] <- res.rsa.error[,2:6]



## format table
tab$p.val <- printp(tab$p.val)
tab$med.effect[c(7:12)] <- ifelse(tab$med.effect[c(7:12)]==0, "no", "yes")
tab$perc.sig <- ifelse(is.na(tab$perc.sig),NA,paste0(round(tab$perc.sig*100/tab$n.specs,0),"%"))



## print table
kable(tab,
      align = c("l", "l", "r", "r", "r", "r", "r"),
      col.names = c("Operationalization", 
                    "Relevant predictor", "Number of specifications", "Median effect size", 
                    "Significant specifications (%)", "Number of shuffled samples with more significant 
                    specifications than for the original sample", "<i>p</i> value of permutation test")) %>% 
   add_header_above(c(" " = 2, 
                      "Description of specification curve (for original sample)" = 3, 
                      "Permutation test with 500 shuffled samples" = 2)) %>% 
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) 
Description of specification curve (for original sample)
Permutation test with 500 shuffled samples
Operationalization Relevant predictor Number of specifications Median effect size Significant specifications (%) Number of shuffled samples with more significant specifications than for the original sample <i>p</i> value of permutation test
Interaction Trait A x State A 2224 0 1% 274 .548
Interaction Trait HH x State HH 2224 0 0% 500 > .999
Interaction State A x Adversity 2224 0 0% 500 > .999
Interaction State A x Deception 2224 0 0% 420 .840
Interaction State HH x Adversity 2224 0 0% 441 .882
Interaction State HH x Deception 2224 0 0% 396 .792
Fit pattern Trait A x State A 2224 no 2% 217 .434
Fit pattern Trait HH x State HH 2224 no 7% 89 .178
Fit pattern State A x Adversity 2224 no 0% 500 > .999
Fit pattern State A x Deception 2224 no 20% 30 .060
Fit pattern State HH x Adversity 2224 no 0% 416 .832
Fit pattern State HH x Deception 2224 no 25% 15 .030

Inferential Specification Curves

Reaction Time

a <- plot_curve_rsa(res.rsa.rt.a, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt"]][["state.trait.a.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait-State Agreeableness")

b <- plot_curve_rsa(res.rsa.rt.h, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt"]][["state.trait.h.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait-State Honesty-Humility") 


c <- plot_curve_rsa(res.rsa.rt.a.adv, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt"]][["state.a.adv.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Agreeableness-Adversity") 

d <- plot_curve_rsa(res.rsa.rt.h.adv, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt"]][["state.h.adv.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Honesty-Adversity")

e <- plot_curve_rsa(res.rsa.rt.a.dec, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt"]][["state.a.dec.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Agreeableness-Deception")

f <- plot_curve_rsa(res.rsa.rt.h.dec, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt"]][["state.h.dec.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Honesty-Deception")



cowplot::plot_grid(a,b,c,NULL,NULL,NULL, ncol=2, labels=c("A","B","C","D","E","F"), 
                   label_size = 12, align = "v", axis = "rbl")
Comparison of observed (descriptive) specification curves (black dots) and expected under-the-null specification curves (shaded area). The shaded area represents the range of effects observed in the shuffled datasets (between the 2.5th and and 97.5th percentiles of the ranked estimates).

Figure 26: Comparison of observed (descriptive) specification curves (black dots) and expected under-the-null specification curves (shaded area). The shaded area represents the range of effects observed in the shuffled datasets (between the 2.5th and and 97.5th percentiles of the ranked estimates).

a <- plot_curve_rsa(res.rsa.rt.a, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1000)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt.fit"]][["state.trait.a.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait-State Agreeableness")

b <- plot_curve_rsa(res.rsa.rt.h, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1000)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt.fit"]][["state.trait.h.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait-State Honesty-Humility") 


c <- plot_curve_rsa(res.rsa.rt.a.adv, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1000)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt.fit"]][["state.a.adv.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Agreeableness-Adversity") 

d <- plot_curve_rsa(res.rsa.rt.h.adv, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1000)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt.fit"]][["state.h.adv.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Honesty-Adversity")

e <- plot_curve_rsa(res.rsa.rt.a.dec, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1000)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt.fit"]][["state.a.dec.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Agreeableness-Deception")

f <- plot_curve_rsa(res.rsa.rt.h.dec, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect (in ms)") +
   theme_pub() + scale_x_continuous(breaks=seq(0,9000,1000)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.rt.fit"]][["state.h.dec.rt"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Honesty-Deception")


cowplot::plot_grid(a,b,c,d,e,f, ncol=2, labels=c("A","B","C","D","E","F"), 
                   label_size = 12, align = "v", axis = "rbl")

Error Rate

a <- plot_curve_rsa(res.rsa.er.a, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect\n(in % of errors)") +
   scale_y_continuous(labels = function(x) x * 100) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er"]][["state.trait.a.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait-State Agreeableness")

b <- plot_curve_rsa(res.rsa.er.h, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect\n(in % of errors)") +
   scale_y_continuous(labels = function(x) x * 100) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er"]][["state.trait.h.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait-State Honesty-Humility") 


c <- plot_curve_rsa(res.rsa.er.a.adv, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect\n(in % of errors)") +
   scale_y_continuous(labels = function(x) x * 100) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er"]][["state.a.adv.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Agreeableness-Adversity") 

d <- plot_curve_rsa(res.rsa.er.h.adv, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect\n(in % of errors)") +
   scale_y_continuous(labels = function(x) x * 100) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er"]][["state.h.adv.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Honesty-Adversity") 


e <- plot_curve_rsa(res.rsa.er.a.dec, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect\n(in % of errors)") +
   scale_y_continuous(labels = function(x) x * 100) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er"]][["state.a.dec.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Agreeableness-Deception")

f <- plot_curve_rsa(res.rsa.er.h.dec, "est_b4", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "interaction effect\n(in % of errors)") +
   scale_y_continuous(labels = function(x) x * 100) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er"]][["state.h.dec.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Honesty-Deception") 


## combine plots
(a|b)/
   (c|d)/
   (e|f) + plot_annotation(tag_levels = 'A') 
Comparison of observed (descriptive) specification curves (black dots) and expected under-the-null specification curves (shaded area). The shaded area represents the range of effects observed in the shuffled datasets (between the 2.5th and and 97.5th percentiles of the ranked estimates).

Figure 27: Comparison of observed (descriptive) specification curves (black dots) and expected under-the-null specification curves (shaded area). The shaded area represents the range of effects observed in the shuffled datasets (between the 2.5th and and 97.5th percentiles of the ranked estimates).

a <- plot_curve_rsa(res.rsa.er.a, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er.fit"]][["state.trait.a.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait-State Agreeableness") 

b <- plot_curve_rsa(res.rsa.er.h, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er.fit"]][["state.trait.h.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("Trait-State Honesty-Humility") 


c <- plot_curve_rsa(res.rsa.er.a.adv, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er.fit"]][["state.a.adv.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)), 
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Agreeableness-Adversity") 

d <- plot_curve_rsa(res.rsa.er.h.adv, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er.fit"]][["state.h.adv.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Honesty-Adversity") 


e <- plot_curve_rsa(res.rsa.er.a.dec, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er.fit"]][["state.a.dec.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Agreeableness-Deception")

f <- plot_curve_rsa(res.rsa.er.h.dec, "fit", ci = FALSE, ribbon = F) +
   geom_hline(yintercept = 0, linetype = "solid", color = "black", size=0.5) +
   labs(x = "specifications (ranked)", y = "fit pattern") +
   scale_y_discrete(breaks=c(FALSE, TRUE), limits=c(FALSE, TRUE)) +
   theme_pub() + scale_x_continuous(breaks=seq(0,2400,500)) +
   geom_ribbon(data=conf.curves[["conf.curves.rsa.er.fit"]][["state.h.dec.e"]], mapping=(aes(ymin=low.perc, ymax=high.perc, x=rank)),
               inherit.aes = FALSE, alpha=.2, linetype="dashed", color="black")+
   geom_point(aes(color = "black"), size = 1) +
   theme(axis.title=element_text(size=10,face="bold")) + ggtitle("State Honesty-Deception") 

(a|b)/
   (c|d)/
   (e|f) + plot_annotation(tag_levels = 'A') 

Exploratory Analyses

Difference Scores for Congruence

Descriptive Statistics

We calculated descriptive difference score between personality traits and personality states and between situation characteristics and personality states to represent congruence. However, these difference scores should be interpreted with caution because they assume strong equivalence between the trait and state scales which may not be given in this study.

data$diff.a <- data$state.a-data$trait.a.long
data$diff.h <- data$state.h-data$trait.h.long
data$diff.a.a <- data$state.a-8-data$adv
data$diff.d.a <- data$state.a-8-data$dec
data$diff.a.h <- data$state.h-8-data$adv
data$diff.d.h <- data$state.h-8-data$dec


tab <- bind_rows(as.data.frame(describe(data$diff.a))[,2:13],
                 as.data.frame(describe(data$diff.h))[,2:13],
                 as.data.frame(describe(data$diff.a.a))[,2:13],
                 as.data.frame(describe(data$diff.d.a))[,2:13],
                 as.data.frame(describe(data$diff.a.h))[,2:13],
                 as.data.frame(describe(data$diff.d.h))[,2:13]
)
row.names(tab) <- c("State A - Trait A", "State HH - Trait HH", 
                    "State A - Adversity(r)", "State A - Deception(r)",
                    "State HH - Adversity(r)", "State HH - Deception(r)")

kable(tab,
      digits=2,
      row.names = TRUE,
      col.names = c("n", "mean", "sd", "median", 
                    "trimmed", "mad", "min", "max", "range", "skew", "kurtosis", "se"),
      caption = "Descriptive statistics of the descriptive difference scores representing congruence in the different experimental groups.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) %>% 
   footnote(general="Adversity and deception were reverse-coded (indicted by (r) ) such that higher levels indicate less adversity and deception, respectively. ")
Table 50: Descriptive statistics of the descriptive difference scores representing congruence in the different experimental groups.
n mean sd median trimmed mad min max range skew kurtosis se
State A - Trait A 257 0.75 1.62 0.88 0.81 1.67 -4.88 4.5 9.38 -0.32 0.06 0.10
State HH - Trait HH 257 -1.14 2.28 -1.00 -1.15 2.59 -6.00 4.5 10.50 0.06 -0.52 0.14
State A - Adversity(r) 254 -5.70 2.44 -5.50 -5.61 2.84 -11.83 -2.0 9.83 -0.28 -0.76 0.15
State A - Deception(r) 254 -8.60 2.13 -8.54 -8.60 2.16 -14.00 -2.0 12.00 0.07 -0.05 0.13
State HH - Adversity(r) 254 -6.05 2.58 -6.33 -6.01 2.84 -12.00 -2.0 10.00 -0.04 -0.90 0.16
State HH - Deception(r) 254 -8.93 2.49 -8.54 -8.91 2.53 -14.00 -3.0 11.00 -0.12 -0.68 0.16
Note:
Adversity and deception were reverse-coded (indicted by (r) ) such that higher levels indicate less adversity and deception, respectively.

Histograms

We calculated descriptive difference score between personality traits and personality states and between situation characteristics and personality states to represent congruence. However, these difference scores should be interpreted with caution because they assume strong equivalence between the trait and state scales which may not be given in this study.

a <- ggplot(data=data, aes(x=trait.h-state.h)) + theme_pub() + 
   geom_histogram(color="black", fill=cols.beh[1], binwidth=1)  +
   scale_x_continuous(limits=c(-4.5,4.5), breaks=c(-4:4), labels=c(-4:4)) + 
   scale_y_continuous(expand = c(0, 0.01)) +
   labs(title="Trait-State Congruence:\nHonesty", x="Deviation of state honesty from trait honesty") 

b <- ggplot(data=data, aes(x=trait.a-state.a)) + theme_pub() +
   geom_histogram(color="black", fill=cols.beh[1], binwidth=1)  +
   scale_x_continuous(limits=c(-4.5,4.5), breaks=c(-4:4), labels=c(-4:4)) + 
   scale_y_continuous(expand = c(0, 0.01)) +
   labs(title="Trait-State Congruence:\nAgreeableness", x="Deviation of state agreeableness from trait agreeableness")

c <- ggplot(data=data, aes(x=8-adv-state.a)) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1)  +
   scale_x_continuous(limits=c(-4.5,4.5), breaks=c(-4:4), labels=c(-4:4)) + 
   scale_y_continuous(expand = c(0, 0.01)) +
   labs(title="State-Situation Congruence:\nAgreeableness and Adversity", 
        x="Deviation of state agreeableness from adversity (reverse coded)")

d <- ggplot(data=data, aes(x=8-dec-state.a)) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1)  +
   scale_x_continuous(limits=c(-4.5,4.5), breaks=c(-4:4), labels=c(-4:4)) + 
   scale_y_continuous(expand = c(0, 0.01)) +
   labs(title="State-Situation Congruence:\nAgreeableness and Deception", 
        x="Deviation of state agreeableness from deception (reverse coded)")

e <- ggplot(data=data, aes(x=8-adv-state.h)) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1)  +
   scale_x_continuous(limits=c(-4.5,4.5), breaks=c(-4:4), labels=c(-4:4)) + 
   scale_y_continuous(expand = c(0, 0.01)) +
   labs(title="State-Situation Congruence:\nHonesty and Adversity", 
        x="Deviation of state honesty from adversity (reverse coded)")

f <- ggplot(data=data, aes(x=8-dec-state.h)) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1)  +
   scale_x_continuous(limits=c(-4.5,4.5), breaks=c(-4:4), labels=c(-4:4)) + 
   scale_y_continuous(expand = c(0, 0.01)) +
   labs(title="State-Situation Congruence:\nHonesty and Deception", 
        x="Deviation of state honesty from deception (reverse coded)")

(a + b)/
   plot_spacer()/
   (c + d)/
   plot_spacer()/
   (e + f) + plot_annotation(tag_levels="A") + plot_layout(heights=c(1,0.2,1,0.2,1))
Histograms of difference scores between between personality traits and personality states and between situation characteristics and personality states as a descriptive indicator of congruence.

Figure 28: Histograms of difference scores between between personality traits and personality states and between situation characteristics and personality states as a descriptive indicator of congruence.

Difference Scores in the Experimental Conditions

Descriptive Statistics

We calculated descriptive difference score between personality traits and personality states and between situation characteristics and personality states to represent congruence. However, these difference scores should be interpreted with caution because they assume strong equivalence between the trait and state scales which may not be given in this study.

data$diff.a <- data$state.a-data$trait.a.long
data$diff.h <- data$state.h-data$trait.h.long
data$diff.a.a <- 8-data$adv-data$state.a
data$diff.d.a <- 8-data$dec-data$state.a
data$diff.a.h <- 8-data$adv-data$state.h
data$diff.d.h <- 8-data$dec-data$state.h


tab <- bind_rows(describeBy(data$diff.a, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$diff.h, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$diff.a.a, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$diff.d.a, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$diff.a.h, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15],
                 describeBy(data$diff.d.h, group=list(data$condition.beh, data$condition.sit), mat=TRUE, digits=2)[,2:15]
)
names(tab)[1] <- "Experimental conditions"

kable(tab,
      row.names = FALSE,
      col.names = c("behavior condition", "situation condition", "vars", "n", "mean", "sd", "median", 
                    "trimmed", "mad", "min", "max", "range", "skew", "kurtosis"),
      caption = "Descriptive statistics of the descriptive difference scores representing congruence in the different experimental groups.") %>%  
   kable_styling(bootstrap_options = c("striped", "hover"), fixed_thead = T) %>% 
   pack_rows("DV: Difference between trait agreeableness and state agreeableness", 1, 4) %>%
   pack_rows("DV: Difference between trait honesty-humility and state honesty-humility", 5, 8) %>%
   pack_rows("DV: Difference between aversity(r) and state agreeableness", 9, 12) %>%
   pack_rows("DV: Difference between deception(r) and state agreeableness", 13, 16) %>%
   pack_rows("DV: Difference between adversity(r) and state honesty-humility", 17, 20) %>%
   pack_rows("DV: Difference between deception(r) and state honesty-humility", 21, 24) %>% 
   footnote(general="Adversity and deception were reverse-coded (indicted by (r) ) such that higher levels indicate less adversity and deception, respectively. ")
Table 51: Descriptive statistics of the descriptive difference scores representing congruence in the different experimental groups.
behavior condition situation condition vars n mean sd median trimmed mad min max range skew kurtosis
DV: Difference between trait agreeableness and state agreeableness
low agreeableness and honesty low adversity and deception 1 70 0.38 1.58 0.12 0.37 1.30 -3.00 4.50 7.50 0.16 -0.14
high agreeableness and honesty low adversity and deception 1 67 1.46 1.27 1.50 1.50 1.11 -2.62 4.38 7.00 -0.46 0.73
low agreeableness and honesty high adversity and deception 1 61 0.38 1.67 0.38 0.36 1.67 -3.00 3.75 6.75 0.13 -0.41
high agreeableness and honesty high adversity and deception 1 59 0.80 1.73 1.38 0.93 1.48 -4.88 4.50 9.38 -0.78 0.78
DV: Difference between trait honesty-humility and state honesty-humility
low agreeableness and honesty low adversity and deception 1 70 -1.87 2.28 -2.00 -2.01 2.69 -5.38 4.50 9.88 0.57 -0.19
high agreeableness and honesty low adversity and deception 1 67 -0.21 1.54 0.12 -0.19 1.48 -3.62 4.12 7.75 -0.05 0.02
low agreeableness and honesty high adversity and deception 1 61 -2.02 2.48 -2.62 -2.12 2.41 -6.00 4.50 10.50 0.46 -0.74
high agreeableness and honesty high adversity and deception 1 59 -0.40 2.18 -0.25 -0.42 1.67 -5.25 4.50 9.75 0.02 -0.10
DV: Difference between aversity(r) and state agreeableness
low agreeableness and honesty low adversity and deception 1 69 1.16 2.17 1.17 1.24 1.73 -6.00 6.00 12.00 -0.49 1.10
high agreeableness and honesty low adversity and deception 1 65 0.48 1.34 0.50 0.50 0.86 -3.33 4.25 7.58 -0.23 0.90
low agreeableness and honesty high adversity and deception 1 61 1.17 2.08 1.00 1.24 1.98 -6.00 5.25 11.25 -0.51 0.82
high agreeableness and honesty high adversity and deception 1 59 0.17 2.19 0.50 0.25 1.73 -6.00 4.67 10.67 -0.47 0.21
DV: Difference between deception(r) and state agreeableness
low agreeableness and honesty low adversity and deception 1 68 -1.81 1.97 -1.75 -1.87 1.85 -6.00 4.00 10.00 0.46 0.71
high agreeableness and honesty low adversity and deception 1 67 -2.66 2.00 -2.75 -2.75 1.85 -6.00 3.58 9.58 0.49 0.24
low agreeableness and honesty high adversity and deception 1 60 -1.79 1.90 -1.54 -1.78 1.67 -6.00 4.00 10.00 0.13 0.79
high agreeableness and honesty high adversity and deception 1 59 -2.40 2.05 -2.08 -2.47 1.98 -6.00 6.00 12.00 0.93 2.83
DV: Difference between adversity(r) and state honesty-humility
low agreeableness and honesty low adversity and deception 1 69 1.80 2.44 1.92 1.88 2.84 -6.00 6.00 12.00 -0.37 0.13
high agreeableness and honesty low adversity and deception 1 65 0.46 1.57 0.25 0.47 1.24 -3.33 4.42 7.75 -0.03 -0.02
low agreeableness and honesty high adversity and deception 1 61 2.03 2.47 2.17 2.11 3.09 -6.00 6.00 12.00 -0.47 0.13
high agreeableness and honesty high adversity and deception 1 59 0.04 2.42 0.17 0.19 1.98 -6.00 5.75 11.75 -0.56 0.60
DV: Difference between deception(r) and state honesty-humility
low agreeableness and honesty low adversity and deception 1 68 -1.16 2.00 -1.21 -1.20 1.54 -6.00 4.00 10.00 0.10 0.72
high agreeableness and honesty low adversity and deception 1 67 -2.68 2.13 -3.00 -2.78 2.22 -6.00 3.00 9.00 0.44 -0.17
low agreeableness and honesty high adversity and deception 1 60 -0.96 1.95 -0.92 -0.88 1.61 -6.00 4.00 10.00 -0.37 0.42
high agreeableness and honesty high adversity and deception 1 59 -2.52 2.01 -2.50 -2.60 2.22 -6.00 5.25 11.25 0.82 1.94
Note:
Adversity and deception were reverse-coded (indicted by (r) ) such that higher levels indicate less adversity and deception, respectively.

Histograms

We calculated descriptive difference score between personality traits and personality states and between situation characteristics and personality states to represent congruence. However, these difference scores should be interpreted with caution because they assume strong equivalence between the trait and state scales which may not be given in this study.

p1 <- ggplot(subset(data, condition.beh=="high agreeableness and honesty"), aes(x=diff.a)) + 
   geom_histogram(color="black", fill=cols.beh[1], binwidth=1) + 
   labs(title="high agreeableness and honesty-condition", 
        x="Deviation of state agreeableness from trait agreeableness") + xlim(-6,6) + theme_pub() 

p2 <- ggplot(subset(data, condition.beh=="low agreeableness and honesty"), aes(x=diff.a)) + 
   geom_histogram(color="black", fill=cols.beh[1], binwidth=1) + 
   labs(title="low agreeableness and honesty-condition", 
        x="Deviation of state agreeableness from trait agreeableness") + xlim(-6,6) + theme_pub()


## combine plots
(p1+p2) + plot_annotation(
   title = 'Trait-State Congruence',
   subtitle = 'Difference scores between trait agreeableness and state agreeableness in the two behavior conditions'
) 
Histograms of difference scores between between personality traits and personality states as a descriptive indicator of congruence in the different experimental groups.

Figure 29: Histograms of difference scores between between personality traits and personality states as a descriptive indicator of congruence in the different experimental groups.

p1 <- ggplot(subset(data, condition.beh=="high agreeableness and honesty"), aes(x=diff.h)) + 
   geom_histogram(color="black", fill=cols.beh[1], binwidth=1) + 
   labs(title="high agreeableness and honesty-condition", 
        x="Deviation of state honesty-humility from trait honesty-humility") + xlim(-6,6) + theme_pub() 

p2 <- ggplot(subset(data, condition.beh=="low agreeableness and honesty"), aes(x=diff.h)) + 
   geom_histogram(color="black", fill=cols.beh[1], binwidth=1) + 
   labs(title="low agreeableness and honesty-condition", 
        x="Deviation of state honesty-humility from trait honesty-humility") + xlim(-6,6) + theme_pub()


## combine plots
(p1+p2) + plot_annotation(
   title = 'Trait-State Congruence',
   subtitle = 'Difference scores between trait honesty and state honesty in the two behavior conditions'
) 
Histograms of difference scores between between personality traits and personality states as a descriptive indicator of congruence in the different experimental groups.

Figure 30: Histograms of difference scores between between personality traits and personality states as a descriptive indicator of congruence in the different experimental groups.

p1 <- ggplot(subset(data, condition.bs=="friendly-friendly"), aes(x=diff.a.a)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="congruent", subtitle="(behehavior: high, situation: high)",
        x="Deviation of state agreeableness from adversity (reverse coded)")

p2 <- ggplot(subset(data, condition.bs=="unfriendly-unfriendly"), aes(x=diff.a.a)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="congruent", subtitle="(behavior: low, situation: low)",
        x="Deviation of state agreeableness from adversity (reverse coded)")

p3 <- ggplot(subset(data, condition.bs=="friendly-unfriendly"), aes(x=diff.a.a)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="incongruent", subtitle="(behavior: high, situation: low)",
        x="Deviation of state agreeableness from adversity (reverse coded)")

p4 <- ggplot(subset(data, condition.bs=="unfriendly-friendly"), aes(x=diff.a.a)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="incongruent", subtitle="(behavior: low, situation: high)",
        x="Deviation of state agreeableness from adversity (reverse coded)")


## combine plots
(p1+p2)/
   plot_spacer()/
   (p3+p4) + plot_layout(heights=c(1,0.2,1)) + 
   plot_annotation(
      title = 'State-Situation Congruence',
      subtitle = 'Difference scores between reverse-coded adversity and state agreeableness in the four experimental groups'
   ) 
Histograms of difference scores between between situation characteristics and personality states as a descriptive indicator of congruence in the different experimental groups.

Figure 31: Histograms of difference scores between between situation characteristics and personality states as a descriptive indicator of congruence in the different experimental groups.

p1 <- ggplot(subset(data, condition.bs=="friendly-friendly"), aes(x=diff.d.a)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="congruent", subtitle="(behehavior: high, situation: high)",
        x="Deviation of state agreeableness from deception (reverse coded)")

p2 <- ggplot(subset(data, condition.bs=="unfriendly-unfriendly"), aes(x=diff.d.a)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="congruent", subtitle="(behavior: low, situation: low)",
        x="Deviation of state agreeableness from deception (reverse coded)")

p3 <- ggplot(subset(data, condition.bs=="friendly-unfriendly"), aes(x=diff.d.a)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="incongruent", subtitle="(behavior: high, situation: low)",
        x="Deviation of state agreeableness from deception (reverse coded)")

p4 <- ggplot(subset(data, condition.bs=="unfriendly-friendly"), aes(x=diff.d.a)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="incongruent", subtitle="(behavior: low, situation: high)",
        x="Deviation of state agreeableness from deception (reverse coded)")


## combine plots
(p1+p2)/
   plot_spacer()/
   (p3+p4) + plot_layout(heights=c(1,0.2,1)) + 
   plot_annotation(
      title = 'State-Situation Congruence',
      subtitle = 'Difference scores between reverse-coded deception and state agreeableness in the four experimental groups'
   ) 
Histograms of difference scores between between situation characteristics and personality states as a descriptive indicator of congruence in the different experimental groups.

Figure 32: Histograms of difference scores between between situation characteristics and personality states as a descriptive indicator of congruence in the different experimental groups.

p1 <- ggplot(subset(data, condition.bs=="friendly-friendly"), aes(x=diff.a.h)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="congruent", subtitle="(behehavior: high, situation: high)",
        x="Deviation of state honesty from adversity (reverse coded)")

p2 <- ggplot(subset(data, condition.bs=="unfriendly-unfriendly"), aes(x=diff.a.h)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="congruent", subtitle="(behavior: low, situation: low)",
        x="Deviation of state honesty from adversity (reverse coded)")

p3 <- ggplot(subset(data, condition.bs=="friendly-unfriendly"), aes(x=diff.a.h)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="incongruent", subtitle="(behavior: high, situation: low)",
        x="Deviation of state honesty from adversity (reverse coded)")

p4 <- ggplot(subset(data, condition.bs=="unfriendly-friendly"), aes(x=diff.a.h)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="incongruent", subtitle="(behavior: low, situation: high)",
        x="Deviation of state honesty from adversity (reverse coded)")


## combine plots
(p1+p2)/
   plot_spacer()/
   (p3+p4) + plot_layout(heights=c(1,0.2,1)) + 
   plot_annotation(
      title = 'State-Situation Congruence',
      subtitle = 'Difference scores between reverse-coded adversity and state honesty in the four experimental groups'
   )
Histograms of difference scores between between situation characteristics and personality states as a descriptive indicator of congruence in the different experimental groups.

Figure 33: Histograms of difference scores between between situation characteristics and personality states as a descriptive indicator of congruence in the different experimental groups.

p1 <- ggplot(subset(data, condition.bs=="friendly-friendly"), aes(x=diff.d.h)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="congruent", subtitle="(behehavior: high, situation: high)",
        x="Deviation of state honesty from deception (reverse coded)")

p2 <- ggplot(subset(data, condition.bs=="unfriendly-unfriendly"), aes(x=diff.d.h)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="congruent", subtitle="(behavior: low, situation: low)",
        x="Deviation of state honesty from deception (reverse coded)")

p3 <- ggplot(subset(data, condition.bs=="friendly-unfriendly"), aes(x=diff.d.h)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="incongruent", subtitle="(behavior: high, situation: low)",
        x="Deviation of state honesty from deception (reverse coded)")

p4 <- ggplot(subset(data, condition.bs=="unfriendly-friendly"), aes(x=diff.d.h)) + xlim(-6,6) + theme_pub() +
   geom_histogram(color="black", fill=cols.sit[1], binwidth=1) + 
   labs(title="incongruent", subtitle="(behavior: low, situation: high)",
        x="Deviation of state honesty from deception (reverse coded)")


## combine plots
(p1+p2)/
   plot_spacer()/
   (p3+p4) + plot_layout(heights=c(1,0.2,1)) +
   plot_annotation(
      title = 'State-Situation Congruence',
      subtitle = 'Difference scores between reverse-coded deception and state honesty in the four experimental groups'
   ) 
Histograms of difference scores between between situation characteristics and personality states as a descriptive indicator of congruence in the different experimental groups.

Figure 34: Histograms of difference scores between between situation characteristics and personality states as a descriptive indicator of congruence in the different experimental groups.

LS0tDQp0aXRsZTogIk9ubGluZSBTdXBwbGVtZW50YXJ5IE1hdGVyaWFsIg0KYXV0aG9yOiAiQmUgWW91cnNlbGYgYW5kIEJlaGF2ZSBBcHByb3ByaWF0ZWx5OiBFeHBsb3JpbmcgQXNzb2NpYXRpb25zIGJldHdlZW4gSW5jb25ncnVlbnQgUGVyc29uYWxpdHkgU3RhdGVzIGFuZCBQb3NpdGl2ZSBBZmZlY3QsIFRpcmVkbmVzcywgYW5kIENvZ25pdGl2ZSBQZXJmb3JtYW5jZSINCm91dHB1dDoNCiAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOg0KICAgIHRoZW1lOiBwYXBlcg0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDENCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KLS0tDQoNCmBgYHtjc3MgY2NzLXN0eWxpbmcsIGVjaG89RkFMU0V9DQoNCiMgdGhpcyBqdXN0IHNvbWUgLmNzcyBtb2RpZmljYXRpb25zIHRvIHRoZSB0ZW1wbGF0ZSB0byBtYWtlIGEgbmljZXIgZGlzcGxheQ0KDQoubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSwgLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIsIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIHsNCiAgIHotaW5kZXg6IDI7DQogICBjb2xvcjogI2ZmZmZmZjsNCiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4MDgwODA7DQogICAgICBib3JkZXItY29sb3I6ICM4MDgwODA7DQp9DQoNCmJvZHkubWFpbi1jb250YWluZXIgew0KICAgbWF4LXdpZHRoOiA5NSUgOw0KICAgd2lkdGg6IDk1JTsNCn0NCg0KYm9keSB7DQogICBtYXgtd2lkdGg6IDk1JTsNCiAgIGZvbnQtc2l6ZTogMTRweDsNCn0NCg0KZGl2Lm1haW4tY29udGFpbmVyIHsNCiAgIHdpZHRoOiA5NSU7DQogICBtYXgtd2lkdGg6IDk1JTsNCn0NCg0KLmNvbC1sZy0zIHsNCiAgIHdpZHRoOiAyNSU7DQp9DQoNCmEgew0KICAgY29sb3I6ICM4MDgwODA7DQogICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7DQp9DQphIHsNCiAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Ow0KfQ0KDQphOmhvdmVyIHsNCiAgIGNvbG9yOiAjODA4MDgwOw0KICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0RERERERDsNCn0NCg0KLm5hdi1waWxscyA+IGxpLmFjdGl2ZSA+IGEsIC5uYXYtcGlsbHMgPiBsaS5hY3RpdmUgPiBhOmhvdmVyLCAubmF2LXBpbGxzID4gbGkuYWN0aXZlID4gYTpmb2N1cyB7DQogICBjb2xvcjogI2ZmZmZmZjsNCiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4MDgwODA7DQp9DQoNCmRpdi50b2NpZnkgew0KICAgd2lkdGg6IDIwJTsNCiAgIG1heC13aWR0aDogMjYwcHg7DQogICBtYXgtaGVpZ2h0OiA4NSU7DQp9DQoNCi5saXN0LWdyb3VwLWl0ZW0gew0KICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgZGlzcGxheTogYmxvY2s7DQogICBwYWRkaW5nOiAyMHB4IDBweCAyMHB4IDBweDsNCiAgIG1hcmdpbjogMjBweCAwcHggMjBweCAwcHg7DQogICBjb2xvcjogIzgwODA4MDsNCiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQogICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOw0KfQ0KDQoudG9jaWZ5IHVsLCAudG9jaWZ5IGxpIHsNCiAgIGxpc3Qtc3R5bGU6IG5vbmU7DQogICBtYXJnaW46IDEwcHggMHB4IDEwcHggMHB4Ow0KICAgcGFkZGluZzogMDsNCiAgIGJvcmRlcjogbm9uZTsNCiAgIGxpbmUtaGVpZ2h0OiAyMHB4Ow0KfQ0KDQoubGlzdC1ncm91cC1pdGVtLmFjdGl2ZSwgLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmU6aG92ZXIsIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzIHsNCiAgIHotaW5kZXg6IDI7DQogICBjb2xvcjogI2ZmZmZmZjsNCiAgICAgIGJhY2tncm91bmQtY29sb3I6ICM4MDgwODA7DQogICAgICBib3JkZXItY29sb3I6ICM4MDgwODA7DQp9DQoNCmgxIHsNCiAgIGZvbnQtc2l6ZTogMjRweCAhaW1wb3J0YW50Ow0KICAgZm9udC13ZWlnaHQ6IGJvbGQ7IA0KICAgbWFyZ2luLXRvcDogNWVtICFpbXBvcnRhbnQ7DQp9DQoNCmgxLnRpdGxlIHsNCiAgIGZvbnQtc2l6ZTogMzBweCAhaW1wb3J0YW50Ow0KfQ0KDQpoMiB7DQogICBmb250LXNpemU6IDI0cHggIWltcG9ydGFudDsNCiAgIG1hcmdpbi10b3A6IDNlbSAhaW1wb3J0YW50Ow0KfQ0KDQpoMyB7DQogICBmb250LXNpemU6IDIwcHg7DQogICBtYXJnaW4tdG9wOiAzZW0gIWltcG9ydGFudDsNCn0NCg0KaDMuc3VidGl0bGUgew0KICAgZm9udC1zaXplOiAyNHB4ICFpbXBvcnRhbnQ7DQogICBmb250LXN0eWxlOiBpdGFsaWM7DQp9DQoNCmg0IHsNCiAgIGZvbnQtc2l6ZTogMjBweCAhaW1wb3J0YW50Ow0KICAgbWFyZ2luLXRvcDogMmVtICFpbXBvcnRhbnQ7DQp9DQoNCmg1IHsNCiAgIGZvbnQtc2l6ZTogMThweCAhaW1wb3J0YW50Ow0KICAgbWFyZ2luLXRvcDogMWVtICFpbXBvcnRhbnQ7DQp9DQoNCmg2IHsNCiAgIGZvbnQtc2l6ZTogMTZweCAhaW1wb3J0YW50Ow0KICAgbWFyZ2luLXRvcDogMWVtICFpbXBvcnRhbnQ7DQp9DQoNCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCm9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAnJykNCg0KIyMjIyBsb2FkIHBhY2thZ2VzDQoNCmxpYnJhcnkocmVwb3J0KSAgICAgIyByZXBvcnRpbmcgcGFja2FnZXMNCmxpYnJhcnkoZ2dwbG90MikgICAgIyB2aXN1YWxpemF0aW9ucw0KbGlicmFyeShwYXBhamEpICAgICAjIHJlcG9ydGluZyByZXN1bHRzDQpsaWJyYXJ5KHBhdGNod29yaykgICMgcGxvdCBsYXlvdXRzDQpsaWJyYXJ5KGNvd3Bsb3QpICAgICMgcGxvdCBsYXlvdXRzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkgICMgZGF0YSBwcmVwYXJhdGlvbg0KbGlicmFyeShwc3ljaCkgICAgICAjIGRlc2NyaXB0aXZlcw0KbGlicmFyeShrYWJsZUV4dHJhKSAjIHRhYmxlIGxheW91dHMNCmxpYnJhcnkoRFQpICAgICAgICAgIyB0YWJsZSBsYXlvdXRzDQpsaWJyYXJ5KFJTQSkgICAgICAgICMgcmVzcG9uc2Ugc3VyZmFjZSBhbmFseXNpcw0KbGlicmFyeShzcGVjcikgICAgICAjIHNwZWNpZmljYXRpb24gY3VydmUgYW5hbHlzaXMNCmxpYnJhcnkoYWZleCkgICAgICAgIyBhbmFseXNpcyBvZiB2YXJpYW5jZQ0KbGlicmFyeShjb3J4KSAgICAgICAjIGNvcnJlbGF0aW9uIHRhYmxlcw0KbGlicmFyeShyZWFkeGwpICAgICAjIGltcG9ydCBleGNlbCBmaWxlDQpsaWJyYXJ5KEdtaXNjKSAgICAgICMgZmxvd2NoYXJ0DQpsaWJyYXJ5KGdsdWUpICAgICAgICMgZmxvd2NoYXJ0IGhlbHBlcg0KbGlicmFyeShncmlkKSAgICAgICAjIGZsb3djaGFydCBoZWxwZXINCg0KDQoNCiMjIyMgbG9hZCBjdXN0b20gZnVuY3Rpb25zDQoNCnNvdXJjZSgiU2NyaXB0cy9mdW5jdGlvbnMuUiIpDQpzb3VyY2UoIlNjcmlwdHMvZnVuY3Rpb25zX3NwZWNpZmljYXRpb24gY3VydmUgYW5hbHlzaXNfbmV3LlIiKQ0KDQoNCg0KIyMjIyBsb2FkIGRhdGENCg0KbG9hZCgiRGF0YS9QcmV0ZXN0L2RhdGFfcHJldGVzdC5SRGF0YSIpDQpsb2FkKCJEYXRhL01haW4gc3R1ZHkvZGF0YV9yYXcuUkRhdGEiKSAjIHJhdyBkYXRhDQpsb2FkKCJEYXRhL01haW4gc3R1ZHkvZGF0YV9jbGVhbi5SRGF0YSIpICMgcmF3IGRhdGENCmxvYWQoIkRhdGEvTWFpbiBzdHVkeS9kYXRhX2NvbXBsZXRlLlJEYXRhIikgIyBmaW5hbCBkYXRhDQpsb2FkKCJEYXRhL01haW4gU3R1ZHkvcmVzdWx0c19zcGVjaWZpY2F0aW9uIGN1cnZlIGFuYWx5c2lzLlJEYXRhIikgIyByZXN1bHRzIGZyb20gYWxsIHNwZWNpZmljYXRpb24gY3VydmUgYW5hbHlzZXMNCmNvZGVib29rIDwtIHJlYWRfeGxzeCgiRGF0YS9NYWluIHN0dWR5L2NvZGVib29rX2RhdGFfY29tcGxldGUueGxzeCIpICMgY29kZWJvb2sgZmluYWwgZGF0YQ0KY29kZWJvb2sucmF3IDwtIHJlYWRfeGxzeCgiRGF0YS9NYWluIHN0dWR5L2NvZGVib29rX3Jhd19kYXRhLnhsc3giKQ0KDQojIyMgdHJhbnNmb3JtIHBlcnNvbmFsaXR5IHRyYWl0cyB0byBhIDctcG9pbnQgc2NhbGUNCmRhdGEkdHJhaXQuYS5sb25nIDwtIDYqKGRhdGEkdHJhaXQuYS0xKS80KzENCmRhdGEkdHJhaXQuaC5sb25nIDwtIDYqKGRhdGEkdHJhaXQuaC0xKS80KzENCmRhdGEkdHJhaXQuYS5sb25nLm1jIDwtIGRhdGEkdHJhaXQuYS5sb25nLTQNCmRhdGEkdHJhaXQuaC5sb25nLm1jIDwtIGRhdGEkdHJhaXQuaC5sb25nLTQNCg0KIyMjIGNoYW5nZSBuYW1lcyBvZiBleHBlcmltZW50YWwgY29uZGl0aW9ucw0KbGV2ZWxzKGRhdGEkY29uZGl0aW9uLmJlaCkgPC0gYygibG93IGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHkiLCAiaGlnaCBhZ3JlZWFibGVuZXNzIGFuZCBob25lc3R5IikNCmxldmVscyhkYXRhJGNvbmRpdGlvbi5zaXQpIDwtIGMoImxvdyBhZHZlcnNpdHkgYW5kIGRlY2VwdGlvbiIsICJoaWdoIGFkdmVyc2l0eSBhbmQgZGVjZXB0aW9uICIpDQoNCiMjIyBjZW50ZXINCmRhdGEkcG9pbnRzLmMgPC0gYXMubnVtZXJpYyhzY2FsZShkYXRhJHBvaW50cywgc2NhbGU9RkFMU0UpKQ0KDQoNCg0KIyMjIyBzZXQgY29sb3JzDQoNCmNvbHMuYmVoID0gaW5sbWlzYzo6R2V0Q29sb3JzKDExLCBzY2hlbWUgPSAic3Vuc2V0IilbYygxMSwxMCldDQpjb2xzLnNpdCA9IGlubG1pc2M6OkdldENvbG9ycygxMSwgc2NoZW1lID0gInN1bnNldCIpWzE6Ml0NCg0KDQoNCiMjIyMgYW5hbHlzaXMgcHJlZmVyZW5jZXMNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlLmV4dHJhID0ga25pdHI6OnJhbmRfc2VlZCkgIyBEaXNjYXJkIGNhY2hlIHdoZW4gcmFuZG9tIHNlZWQgY2hhbmdlcw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlLnBhdGggPSAiRGF0YS9jYWNoZS9PU00vIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcucGF0aCA9ICJPdXRwdXQvT1NNLyIpDQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGUuY29tbWVudHMgPSBGQUxTRSkgIyBJZ25vcmUgY2hhbmdlcyB0byBjb21tZW50cw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlLmV4dHJhID0gbGlzdChSLnZlcnNpb24sIHNlc3Npb25JbmZvKCkpKSAjRGlzY2FyZCBjYWNoZSBpZiB0aGUgUiBlbnZpcm9ubWVudCBjaGFuZ2VzDQprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2ID0gYygianBlZyIsICJzdmciLCAicGRmIikpDQoNCmBgYA0KDQojIFJlYWRNZSB7LnRhYnNldCAudGFic2V0LXBpbGxzIC19DQoNClRoaXMgZG9jdW1lbnQgaW5jbHVkZXMgYW4gb3ZlcnZpZXcgb2YgYWxsIGFuYWx5c2VzIHJlcG9ydGVkIGluIHRoZSBwYXBlciBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgdGFibGVzIGFuZCBmaWd1cmVzIGZvciB0aGUgcGFwZXIgIipCZSBZb3Vyc2VsZiBhbmQgQmVoYXZlIEFwcHJvcHJpYXRlbHk6IEV4cGxvcmluZyBBc3NvY2lhdGlvbnMgYmV0d2VlbiBJbmNvbmdydWVudCBQZXJzb25hbGl0eSBTdGF0ZXMgYW5kIFBvc2l0aXZlIEFmZmVjdCwgVGlyZWRuZXNzLCBhbmQgQ29nbml0aXZlIFBlcmZvcm1hbmNlKiIuIA0KDQoqKlRhYnMqKiAgDQpUbyBtYWtlIHRoZSBkb2N1bWVudCBlYXNpZXIgdG8gcmVhZCwgd2UgdXNlIHRhYnMuIFlvdSB3aWxsIGZpbmQgdGFicyBpbiBncmF5IGluIG1hbnkgcGxhY2VzLCB3aGVyZSB5b3UgY2FuIGNob29zZSBiZXR3ZWVuIGRpZmZlcmVudCBpbmZvcm1hdGlvbiAoZS5nLiwgdGFibGVzIG9yIGdyYXBoaWNzIG9uIGEgdG9waWMpLiAqTm90ZSo6IFNvbWV0aW1lcyB0aGVyZSBhcmUgc2V2ZXJhbCBsZXZlbHMgb2YgdGFicywgc28gZm9yIGV4YW1wbGUsIG9uIHRoZSBmaXJzdCBsZXZlbCB5b3UgZGVjaWRlIHdoZXRoZXIgeW91IHdhbnQgdG8gc2VlIHRhYmxlcyBvciBncmFwaGljcyBhbmQgb24gdGhlIG5leHQgbGV2ZWwgeW91IGNob29zZSBhIHNwb3J0Lg0KDQoqKkFuYWx5c2lzIENvZGUqKiAgDQpUaGUgZG9jdW1lbnQgaW5jbHVkZXMgYWxsIFIgY29kZSB1c2VkIHRvIGNyZWF0ZSB0aGUgZ3JhcGhzIGFuZCB0YWJsZXMgb3IgdG8gcGVyZm9ybSB0aGUgYW5hbHlzZXMuIEhvd2V2ZXIsIHRoZSBjb2RlIGlzIGhpZGRlbiBieSBkZWZhdWx0IHRvIGVuaGFuY2UgcmVhZGFiaWxpdHkuIElmIHlvdSB3YW50IHRvIHNlZSB0aGUgY29kZSwgc2ltcGx5IGNsaWNrIG9uIHRoZSByZXNwZWN0aXZlICoqQ09ERSoqIGJ1dHRvbiBpbiB0aGUgcmlnaHQgaGFuZCBzaWRlIGp1c3QgYWJvdmUgdGhlIGZpZ3VyZSBvciB0YWJsZS0tLXlvdSB3aWxsIHRoZW4gc2VlIHRoZSBhc3NvY2lhdGVkIGNvZGVjaHVuay4gSWYgeW91IHdhbnQgdG8gc2hvdyBhbGwgY29kZWNodW5rcyBieSBkZWZhdWx0LCBjbGljayAqKkNPREUqKiA+ICoqU2hvdyBhbGwgQ29kZSoqIGF0IHRoZSB2ZXJ5IHRvcCBvZiB0aGUgZG9jdW1lbnQuIE1vcmVvdmVyLCB5b3UgY2FuIGFsc28gZG93bmxvYWQgdGhlIFJNYXJrZG93biBzb3VyY2UgZG9jdW1lbnQgdGhlcmUuDQoNCg0KIyBNZXRob2RvbG9naWNhbCBBc3BlY3RzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KIyMgUGFydGljaXBhbnRzIHstfQ0KDQpgYGB7ciBwYXJ0aWNpcGFudC1mbG93LCBmaWcuYXNwPTEsIGZpZy53aWR0aD0xMSwgb3V0LndpZHRoPSI5MCUiLCBmaWcua2VlcD0nbGFzdCcsIHdhcm5pbmc9RiwgbWVzc2FnZT1GLCBmaWcuY2FwPSJGbG93IG9mIHBhcnRpY2lwYW50cyB0aHJvdWdoIHRoZSBzdHVkeSBpbmNsdWRpbmcgZXhjbHVzaW9uIGNyaXRlcmlhLCBkcm9wb3V0cywgYW5kIGZpbmFsIHNhbXBsZSBzaXplcy4ifQ0KDQpkYXRhLnJhdyA8LSBkYXRhLnJhdyAlPiUgDQogICBtdXRhdGUoc2NyZWVuaW5nID0gZmFjdG9yKGlmZWxzZShzY3JlZW5lci4xPT0xICYgc2NyZWVuZXIuMj09NCAmIHNjcmVlbmVyLjM9PTIgJiBzY3JlZW5lci40PT0xICYgc2NyZWVuZXIuNT09MSwicGFzc2VkIiwgImZhaWxlZCIpKSwNCiAgICAgICAgICByZXF1aXJlbWVudHMgPSBmYWN0b3IoaWZlbHNlKGNvbnNlbnQ9PTEgJiBvbGQuZW5vdWdoPT0xICYgZGV2aWNlJWluJWMoMSwyKSwicGFzc2VkIiwgImZhaWxlZCIpKSwNCiAgICAgICAgICBjYXJlZnVsLnJlc3BvbmRpbmcgPSBmYWN0b3IoaWZlbHNlKGJoaV8yNT09MyAmIHNpdF8xMz09NiwicGFzc2VkIiwgImZhaWxlZCIpKSwNCiAgICAgICAgICBleGNsdWRlID0gaWZlbHNlKHNjcmVlbmluZz09InBhc3NlZCIgJiByZXF1aXJlbWVudHM9PSJwYXNzZWQiICYgY2FyZWZ1bC5yZXNwb25kaW5nPT0icGFzc2VkIiwgRkFMU0UsIFRSVUUpKQ0KDQoNCnN0YXJ0IDwtIGJveEdyb2IoZ2x1ZSgiTiA9IHtwb3B9IiwNCiAgICAgICAgICAgICAgICAgICAgICAicGFydGljaXBhbnRzIHN0YXJ0ZWQgdGhlIHN0dWR5IiwNCiAgICAgICAgICAgICAgICAgICAgICBwb3AgPSB0eHRJbnQobnJvdyhkYXRhLnJhdykpLA0KICAgICAgICAgICAgICAgICAgICAgIC5zZXAgPSAiXG4iKSwNCiAgICAgICAgICAgICAgICAgdHh0X2dwID0gZ3BhcihjZXggPSAwLjgpLA0KICAgICAgICAgICAgICAgICBib3hfZ3AgPSBncGFyKGZpbGwgPSAiI2Q2ZDZkNiIpLA0KICAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMjUpDQpzY3JlZW5pbmcgPC0gYm94R3JvYihnbHVlKCJMYW5ndWFnZSBjb21wcmVoZW5zaW9uIGFuZFxuYXR0ZW50aW9uIHNjcmVlbmluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJOID0ge3BvcH0iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBwb3AgPSBucm93KHN1YnNldChkYXRhLnJhdywgcmVxdWlyZW1lbnRzIT0iZmFpbGVkIikpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VwID0gIlxuIiksDQogICAgICAgICAgICAgICAgICAgICB0eHRfZ3AgPSBncGFyKGNleCA9IDAuOCksDQogICAgICAgICAgICAgICAgICAgICBib3hfZ3AgPSBncGFyKGZpbGwgPSAiI2Q2ZDZkNiIpLA0KICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAwLjI1KQ0KdHJhaXRzIDwtIGJveEdyb2IoZ2x1ZSgiUGVyc29uYWxpdHkgdHJhaXQgYXNzZXNzbWVudCAmXG5kZW1vZ3JhcGhpY3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTiA9IHtpbmNsfSIsDQogICAgICAgICAgICAgICAgICAgICAgIGluY2wgPSBucm93KHN1YnNldChkYXRhLnJhdywgc2NyZWVuaW5nPT0icGFzc2VkIiAmIHJlcXVpcmVtZW50cz09InBhc3NlZCIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgLnNlcCA9ICJcbiIpLA0KICAgICAgICAgICAgICAgICAgdHh0X2dwID0gZ3BhcihjZXggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYm94X2dwID0gZ3BhcihmaWxsID0gIiNkNmQ2ZDYiKSwNCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yNSkNCg0KbWFuaXAgPC0gYm94R3JvYihnbHVlKCJJbnRyb2R1Y3Rpb24gYW5kIGluc3RydWN0aW9uIGZvciB0aGUgZ2FtZSIsDQogICAgICAgICAgICAgICAgICAgICAgIihpbmNsLiBtYW5pcHVsYXRpb24gb2Ygc2l0dWF0aW9uIGFuZCBiZWhhdmlvcikiLA0KICAgICAgICAgICAgICAgICAgICAgICJOID0ge2luY2x9IiwNCiAgICAgICAgICAgICAgICAgICAgICBpbmNsID0gc3VtKHRhYmxlKGFzLm51bWVyaWMoc3Vic2V0KGRhdGEucmF3LCBzY3JlZW5pbmc9PSJwYXNzZWQiICYgcmVxdWlyZW1lbnRzPT0icGFzc2VkIikkcGIpKVszOmxlbmd0aCh1bmlxdWUoc3Vic2V0KGRhdGEucmF3LCBzY3JlZW5pbmc9PSJwYXNzZWQiICYgcmVxdWlyZW1lbnRzPT0icGFzc2VkIikkcGIpKV0pLA0KICAgICAgICAgICAgICAgICAgICAgIC5zZXAgPSAiXG4iKSwNCiAgICAgICAgICAgICAgICAgdHh0X2dwID0gZ3BhcihjZXggPSAwLjgpLA0KICAgICAgICAgICAgICAgICBib3hfZ3AgPSBncGFyKGZpbGwgPSAiI2Q2ZDZkNiIpLA0KICAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMjUpDQoNCmdhbWUgPC0gYm94R3JvYihnbHVlKCJQcmlzb25lcidzIERpbGVtbWEgZ2FtZSIsDQogICAgICAgICAgICAgICAgICAgICAiTiA9IHtpbmNsfSIsDQogICAgICAgICAgICAgICAgICAgICBpbmNsID0gc3VtKHRhYmxlKGFzLm51bWVyaWMoc3Vic2V0KGRhdGEucmF3LCBzY3JlZW5pbmc9PSJwYXNzZWQiICYgcmVxdWlyZW1lbnRzPT0icGFzc2VkIikkcGIpKVs1Omxlbmd0aCh1bmlxdWUoc3Vic2V0KGRhdGEucmF3LCBzY3JlZW5pbmc9PSJwYXNzZWQiICYgcmVxdWlyZW1lbnRzPT0icGFzc2VkIikkcGIpKV0pLA0KICAgICAgICAgICAgICAgICAgICAgLnNlcCA9ICJcbiIpLA0KICAgICAgICAgICAgICAgIHR4dF9ncCA9IGdwYXIoY2V4ID0gMC44KSwNCiAgICAgICAgICAgICAgICBib3hfZ3AgPSBncGFyKGZpbGwgPSAiI2Q2ZDZkNiIpLA0KICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yNSkNCg0Kc3RhdGVzIDwtIGJveEdyb2IoZ2x1ZSgiQXNzZXNzbWVudCBvZiBzaXR1YXRpb24gY2hhcmFjdGVyaXN0aWNzLCIsDQogICAgICAgICAgICAgICAgICAgICAgICIgcGVyc29uYWxpdHkgc3RhdGVzLCBwb3NpdGl2ZSBhZmZlY3QsIGFuZCIsDQogICAgICAgICAgICAgICAgICAgICAgICIgdGlyZWRuZXNzIGR1cmluZyB0aGUgZ2FtZSIsDQogICAgICAgICAgICAgICAgICAgICAgICJOID0ge2luY2x9IiwNCiAgICAgICAgICAgICAgICAgICAgICAgaW5jbCA9IHN1bSh0YWJsZShhcy5udW1lcmljKHN1YnNldChkYXRhLnJhdywgc2NyZWVuaW5nPT0icGFzc2VkIiAmIHJlcXVpcmVtZW50cz09InBhc3NlZCIpJHBiKSlbMTQ6bGVuZ3RoKHVuaXF1ZShzdWJzZXQoZGF0YS5yYXcsIHNjcmVlbmluZz09InBhc3NlZCIgJiByZXF1aXJlbWVudHM9PSJwYXNzZWQiKSRwYikpXSksDQogICAgICAgICAgICAgICAgICAgICAgIC5zZXAgPSAiXG4iKSwNCiAgICAgICAgICAgICAgICAgIHR4dF9ncCA9IGdwYXIoY2V4ID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGdwYXIoZmlsbCA9ICIjZDZkNmQ2IiksDQogICAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMjUpDQoNCnN0cm9vcCA8LSBib3hHcm9iKGdsdWUoIk51bWVyaWNhbCBTdHJvb3AgdGFzayIsDQogICAgICAgICAgICAgICAgICAgICAgICJOID0ge2luY2x9IiwNCiAgICAgICAgICAgICAgICAgICAgICAgaW5jbCA9IHN1bSh0YWJsZShhcy5udW1lcmljKHN1YnNldChkYXRhLnJhdywgc2NyZWVuaW5nPT0icGFzc2VkIiAmIHJlcXVpcmVtZW50cz09InBhc3NlZCIpJHBiKSlbMTU6bGVuZ3RoKHVuaXF1ZShzdWJzZXQoZGF0YS5yYXcsIHNjcmVlbmluZz09InBhc3NlZCIgJiByZXF1aXJlbWVudHM9PSJwYXNzZWQiKSRwYikpXSksDQogICAgICAgICAgICAgICAgICAgICAgIC5zZXAgPSAiXG4iKSwNCiAgICAgICAgICAgICAgICAgIHR4dF9ncCA9IGdwYXIoY2V4ID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGdwYXIoZmlsbCA9ICIjZDZkNmQ2IiksDQogICAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMjUpDQoNCmNvbW1lbnRzIDwtIGJveEdyb2IoZ2x1ZSgiQ29tbWVudHMgYW5kIHBlcnNvbmFsaXplZCBjb2RlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiTiA9IHtpbmNsfSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgaW5jbCA9IHRhYmxlKGFzLm51bWVyaWMoc3Vic2V0KGRhdGEucmF3LCBzY3JlZW5pbmc9PSJwYXNzZWQiICYgcmVxdWlyZW1lbnRzPT0icGFzc2VkIikkcGIpKVsxOF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgLnNlcCA9ICJcbiIpLA0KICAgICAgICAgICAgICAgICAgICB0eHRfZ3AgPSBncGFyKGNleCA9IDAuOCksDQogICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGdwYXIoZmlsbCA9ICIjZDZkNmQ2IiksDQogICAgICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yNSkNCg0KZXhjbHVkZWQgPC0gYm94R3JvYihnbHVlKCJFeGNsdXNpb24gQ3JpdGVyaWE6IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiIC0gTm8gY29uc2VudCAoTiA9IHt1bmludGVyZXN0ZWR9KSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIiAtIFlvdW5nZXIgdGhhbiAxOCAoTiA9IHt0b295b3VuZ30pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAiIC0gTm8gZGVza3RvcCBvciBsYXB0b3AgKE4gPSB7ZGV2aWNlfSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJlc3RlZCA9IG5yb3coc3Vic2V0KGRhdGEucmF3LCBjb25zZW50PT0yIHwgaXMubmEoY29uc2VudCkpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICB0b295b3VuZyA9IG5yb3coc3Vic2V0KGRhdGEucmF3LCBvbGQuZW5vdWdoPT0yIHwgaXMubmEob2xkLmVub3VnaCkpKSAtIG5yb3coc3Vic2V0KGRhdGEucmF3LCBjb25zZW50PT0yIHwgaXMubmEoY29uc2VudCkpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgPSBucm93KHN1YnNldChkYXRhLnJhdywgIShkZXZpY2UlaW4lYygxLDIpKSkpIC0gbnJvdyhzdWJzZXQoZGF0YS5yYXcsIG9sZC5lbm91Z2g9PTIgfCBpcy5uYShvbGQuZW5vdWdoKSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXAgPSAiXG4iKSwNCiAgICAgICAgICAgICAgICAgICAganVzdCA9ICJsZWZ0IiwNCiAgICAgICAgICAgICAgICAgICAgdHh0X2dwID0gZ3BhcihjZXggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgICBib3hfZ3AgPSBncGFyKGZpbGwgPSAiI2ZmYWZhZiIpLA0KICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDAuMikNCg0KZXhjbHVkZWQyIDwtIGJveEdyb2IoZ2x1ZSgiRXhjbHVzaW9uIENyaXRlcmlhOiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICIgLSBGYWlsZWQgc2NyZWVuaW5nIChOID0ge3NjcmVlbmluZ30pIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuaW5nID0gbnJvdyhzdWJzZXQoZGF0YS5yYXcsIHJlcXVpcmVtZW50cz09InBhc3NlZCIgJiBzY3JlZW5pbmc9PSJmYWlsZWQiKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXAgPSAiXG4iKSwNCiAgICAgICAgICAgICAgICAgICAgIGp1c3QgPSAibGVmdCIsDQogICAgICAgICAgICAgICAgICAgICB0eHRfZ3AgPSBncGFyKGNleCA9IDAuOCksDQogICAgICAgICAgICAgICAgICAgICBib3hfZ3AgPSBncGFyKGZpbGwgPSAiI2ZmYWZhZiIpLA0KICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAwLjIpDQoNCmZpbmFsMSA8LSBib3hHcm9iKGdsdWUoIkZpbmFsIHNhbXBsZSBmb3IgYW5hbHlzZXNcbndpdGggcG9zaXRpdmUgYWZmZWN0IGFuZFxudGlyZWRuZXNzIGFzIERWOiIsDQogICAgICAgICAgICAgICAgICAgICAgICJOID0ge2ZpbmFsMX0qIiwNCiAgICAgICAgICAgICAgICAgICAgICAgZmluYWwxID0gbnJvdyhkYXRhKSwNCiAgICAgICAgICAgICAgICAgICAgICAgLnNlcCA9ICJcbiIpLA0KICAgICAgICAgICAgICAgICAganVzdCA9ICJjZW50ZXIiLA0KICAgICAgICAgICAgICAgICAgdHh0X2dwID0gZ3BhcihjZXggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYm94X2dwID0gZ3BhcihmaWxsID0gIiNhZGQ4YTQiKSwNCiAgICAgICAgICAgICAgICAgIHdpZHRoID0gMC4yKQ0KDQpmaW5hbDIgPC0gYm94R3JvYihnbHVlKCJGaW5hbCBzYW1wbGUgZm9yIGFuYWx5c2VzXG53aXRoIFN0cm9vcCBwZXJmb3JtYW5jZSBhcyBEVjoiLA0KICAgICAgICAgICAgICAgICAgICAgICAiTiA9IHtmaW5hbDJ9KiIsDQogICAgICAgICAgICAgICAgICAgICAgIGZpbmFsMiA9IG5yb3coc3Vic2V0KGRhdGEsIHByb2dyZXNzPT05NikpLA0KICAgICAgICAgICAgICAgICAgICAgICAuc2VwID0gIlxuIiksDQogICAgICAgICAgICAgICAgICB0eHRfZ3AgPSBncGFyKGNleCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBib3hfZ3AgPSBncGFyKGZpbGwgPSAiI2FkZDhhNCIpLA0KICAgICAgICAgICAgICAgICAgd2lkdGggPSAwLjIsDQogICAgICAgICAgICAgICAgICBqdXN0ID0gImNlbnRlciIpDQoNCm5vdGUgPC0gYm94R3JvYihnbHVlKCIqIE4gPSB7Y2FyZWxlc3N9IHBhcnRpY2lwYW50cyB3ZXJlIGV4bHVkZWQgYmVjYXVzZSBvZiBjYXJlbGVzcyByZXNwb25kaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIGNhcmVsZXNzID0gbnJvdyhzdWJzZXQoZGF0YS5yYXcsIHBiPjY1KSkgLSBucm93KHN1YnNldChkYXRhLCBwcm9ncmVzcz42NSkpLA0KICAgICAgICAgICAgICAgICAgICAgLnNlcCA9ICJcbiIpLA0KICAgICAgICAgICAgICAgIHR4dF9ncCA9IGdwYXIoY2V4ID0gMC44KSwNCiAgICAgICAgICAgICAgICBib3hfZ3AgPSBncGFyKGZpbGwgPSAid2hpdGUiLCBjb2w9IndoaXRlIiksDQogICAgICAgICAgICAgICAganVzdCA9ICJsZWZ0IikNCg0KDQoNCmdyaWQubmV3cGFnZSgpDQp2ZXJ0IDwtIHNwcmVhZFZlcnRpY2FsKHN0YXJ0ID0gc3RhcnQsDQogICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbmluZyA9IHNjcmVlbmluZywNCiAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzID0gdHJhaXRzLA0KICAgICAgICAgICAgICAgICAgICAgICBtYW5pcCA9IG1hbmlwLA0KICAgICAgICAgICAgICAgICAgICAgICBnYW1lID0gZ2FtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzID0gc3RhdGVzLA0KICAgICAgICAgICAgICAgICAgICAgICBzdHJvb3AgPSBzdHJvb3AsDQogICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzID0gY29tbWVudHMsDQogICAgICAgICAgICAgICAgICAgICAgIGZpbmFsMiA9IGZpbmFsMikNCg0KZXhjbHVkZWQgPC0gbW92ZUJveChleGNsdWRlZCwgeCA9IC44LCB5ID0gY29vcmRzKHZlcnQkc2NyZWVuaW5nKSR0b3AgKyBkaXN0YW5jZSh2ZXJ0JHN0YXJ0LCB2ZXJ0JHNjcmVlbmluZywgaGFsZiA9IFRSVUUpKQ0KZXhjbHVkZWQyIDwtIG1vdmVCb3goZXhjbHVkZWQyLCB4ID0gLjgsIHkgPSBjb29yZHModmVydCR0cmFpdHMpJHRvcCArIGRpc3RhbmNlKHZlcnQkc2NyZWVuaW5nLCB2ZXJ0JHRyYWl0cywgaGFsZiA9IFRSVUUpKQ0KZmluYWwxIDwtIG1vdmVCb3goZmluYWwxLCB4ID0gLjIsIHkgPSBjb29yZHModmVydCRzdHJvb3ApJHRvcCArIGRpc3RhbmNlKHZlcnQkc3RhdGVzLCB2ZXJ0JHN0cm9vcCwgaGFsZiA9IFRSVUUpKQ0KdmVydCRmaW5hbDIgPC0gbW92ZUJveCh2ZXJ0JGZpbmFsMiwgeCA9IC4yKQ0Kbm90ZSA8LSBtb3ZlQm94KG5vdGUsIHg9LjgsIHk9LjAxKQ0KDQojIHByaW50IGFycm93cw0KZm9yIChpIGluIDE6KGxlbmd0aCh2ZXJ0KSAtIDIpKSB7DQogICBjb25uZWN0R3JvYih2ZXJ0W1tpXV0sIHZlcnRbW2kgKyAxXV0sIHR5cGUgPSAidmVydCIsIGFycm93X29iaiA9IGdldE9wdGlvbigiY29ubmVjdEdyb2JBcnJvdyIsIGRlZmF1bHQgPSBhcnJvdyhlbmRzID0gImxhc3QiLCB0eXBlID0gImNsb3NlZCIsIGxlbmd0aCA9IHVuaXQoMC4xLCAiaW5jaGVzIikpKSkgJT4lDQogICAgICBwcmludA0KfQ0KDQpjb25uZWN0R3JvYih2ZXJ0JHN0YXJ0LCBleGNsdWRlZCwgdHlwZSA9ICJMIiwgYXJyb3dfb2JqID0gZ2V0T3B0aW9uKCJjb25uZWN0R3JvYkFycm93IiwgZGVmYXVsdCA9IGFycm93KGVuZHMgPSAibGFzdCIsIHR5cGUgPSAiY2xvc2VkIiwgbGVuZ3RoID0gdW5pdCgwLjEsICJpbmNoZXMiKSkpKQ0KY29ubmVjdEdyb2IodmVydCR0cmFpdHMsIGV4Y2x1ZGVkMiwgdHlwZSA9ICJMIiwgYXJyb3dfb2JqID0gZ2V0T3B0aW9uKCJjb25uZWN0R3JvYkFycm93IiwgZGVmYXVsdCA9IGFycm93KGVuZHMgPSAibGFzdCIsIHR5cGUgPSAiY2xvc2VkIiwgbGVuZ3RoID0gdW5pdCgwLjEsICJpbmNoZXMiKSkpKQ0KY29ubmVjdEdyb2IodmVydCRzdGF0ZXMsIGZpbmFsMSwgdHlwZSA9ICJMIiwgYXJyb3dfb2JqID0gZ2V0T3B0aW9uKCJjb25uZWN0R3JvYkFycm93IiwgZGVmYXVsdCA9IGFycm93KGVuZHMgPSAibGFzdCIsIHR5cGUgPSAiY2xvc2VkIiwgbGVuZ3RoID0gdW5pdCgwLjEsICJpbmNoZXMiKSkpKQ0KY29ubmVjdEdyb2IodmVydCRjb21tZW50cywgdmVydCRmaW5hbDIsIHR5cGUgPSAiTCIsIGFycm93X29iaiA9IGdldE9wdGlvbigiY29ubmVjdEdyb2JBcnJvdyIsIGRlZmF1bHQgPSBhcnJvdyhlbmRzID0gImxhc3QiLCB0eXBlID0gImNsb3NlZCIsIGxlbmd0aCA9IHVuaXQoMC4xLCAiaW5jaGVzIikpKSkNCg0KIyBQcmludCBib3hlcw0KdmVydA0KZXhjbHVkZWQNCmV4Y2x1ZGVkMg0KZmluYWwxDQpub3RlDQoNCmBgYA0KDQojIyBNYW5pcHVsYXRpb25zIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KIyMjIFNpdHVhdGlvbiBNYW5pcHVsYXRpb25zIHstfQ0KDQpGdXJ0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBnYW1lIGFuZCB0aGUgbWFuaXB1bGF0aW9ucyBjYW4gYWxzbyBiZSBmb3VuZCBpbiB0aGUgIkRvY3VtZW50YXRpb24gb2YgdGhlIEdhbWUiLWZpbGUgdGhhdCB3YXMgdXBsb2FkIHdpdGggdGhlIHByZXJlZ2lzdHJhdGlvbi4NCg0KVGhlIHNpdHVhdGlvbiB3YXMgbWFuaXB1bGF0ZWQgaW4gdHdvIHdheXMuIEZpcnN0LCBkdXJpbmcgdGhlIGV4cGxhbmF0aW9uIG9mIHRoZSBnYW1lLCB0aGUgb3RoZXIgcGFydG5lciB3YXMgZnJhbWVkIGVpdGhlciBhcyBhIHBhcnRuZXIgb3IgYW4gb3Bwb25lbnQgYW5kIHdhcyBzYWlkIHRoZSBiZWhhdmUgYWNjb3JkaW5nbHkuIFNlY29uZCwgYWxzbyBkdXJpbmcgdGhlIGV4cGxhbmF0aW9uIG9mIHRoZSBnYW1lLCB0aGUgcGF5b2ZmcyB3ZXJlIGFsdGVyZWQgc3VjaCB0aGF0IHRoZXkgZWl0aGVyIHNpZ25hbCB0aGF0IHN0ZWFsaW5nIGlzIG5vdCB3b3J0aHdoaWxlIG9yIHRoYXQgc3RlYWxpbmcgZG9lcyBwYXkgb2ZmOg0KDQojIyMjIEhpZ2ggQWR2ZXJzaXR5IGFuZCBEZWNlcHRpb24tQ29uZGl0aW9uIHstfQ0KDQo+KipMZXQncyBwbGF5IGEgZ2FtZSEqKg0KPiANCj5Zb3Ugd2VyZSByYW5kb21seSBhc3NpZ25lZCAqKmFuIG9wcG9uZW50KiouIFlvdSBhbmQgeW91ciBvcHBvbmVudCB3aWxsICoqcGxheSBhIGdhbWUqKjogSW4gZXZlcnkgcm91bmQsIHRoZXJlIGlzIGEgamFja3BvdCBvZiBjb2lucyB0byB3aW4uIEJvdGggb2YgeW91IGhhdmUgdGhlICoqY2hvaWNlIHRvIGVpdGhlciBzaGFyZSB0aGUgamFja3BvdCoqIHdpdGggeW91ciBvcHBvbmVudCAqKm9yIHRvIHN0ZWFsIHRoZSBqYWNrcG90KiogZnJvbSB5b3VyIG9wcG9uZW50LiANCj4NCj5JZiB5b3UgYm90aCBjaG9vc2UgdG8gc2hhcmUsIGVhY2ggb2YgeW91IHdpbGwgcmVjZWl2ZSAxNSBjb2lucy4gIA0KPklmIGJvdGggc3RlYWwsIGVhY2ggd2lsbCByZWNlaXZlIDEwIGNvaW5zLiAgDQo+SWYgeW91IHNoYXJlLCBidXQgeW91ciBvcHBvbmVudCBzdGVhbHMsIHlvdXIgb3Bwb25lbnQgd2lsbCByZWNlaXZlIDQwIGNvaW5zIGFuZCB5b3Ugbm9uZS4gIA0KVGhlIG90aGVyIHdheSBhcm91bmQsIGlmIHlvdSBzdGVhbCBhbmQgeW91ciBvcHBvbmVudCBzaGFyZXMsIHlvdSB3aWxsIHJlY2VpdmUgNDAgY29pbnMgYW5kIHlvdXIgb3Bwb25lbnQgd2lsbCByZWNlaXZlIG5vbmUuICAgDQo+DQo+WW91IHdpbGwgYm90aCBkZWNpZGUgc2ltdWx0YW5lb3VzbHkgd2l0aG91dCBrbm93aW5nIHdoYXQgdGhlIG90aGVyIHdpbGwgY2hvb3NlLiBIb3dldmVyLCBpbiBlYWNoIHJvdW5kLCB5b3Ugd2lsbCBoYXZlIHRoZSAqKmNoYW5jZSB0byBjb21tdW5pY2F0ZSB3aXRoIHlvdXIgb3Bwb25lbnQgd2hpY2ggZGVjaXNpb24geW91IHBsYW4gdG8gbWFrZSoqOyBidXQgeW91IGFyZSBib3RoIGFsbG93ZWQgdG8gbGllLiBVbmZvcnR1bmF0ZWx5LCAqKnlvdXIgb3Bwb25lbnQgaXMgYSByYXRoZXIgZGlzaG9uZXN0IHBlcnNvbiBhbmQgd2lsbCBvZnRlbiBwbGF5IGRpcnR5LioqIFlvdSB3aWxsIHBsYXkgbXVsdGlwbGUgcm91bmRzLiANCg0KYGBge3J9DQoNCnQgPC0gZGF0YS5mcmFtZShhPWMoIiIsIA0KICAgICAgICAgICAgICAgICAgICAiPGIgc3R5bGU9J2NvbG9yOnJlZDtkaXNwbGF5OmlubGluZTsnPnlvdTwvYj4gc2hhcmUiLCANCiAgICAgICAgICAgICAgICAgICAgIjxiIHN0eWxlPSdjb2xvcjpyZWQ7ZGlzcGxheTppbmxpbmU7Jz55b3U8L2I+IHN0ZWFsIiksIA0KICAgICAgICAgICAgICAgIGI9YygiPGIgc3R5bGU9J2NvbG9yOmJsdWU7ZGlzcGxheTppbmxpbmU7Jz55b3VyIG9wcG9uZW50PC9iPiBzaGFyZXMiLCANCiAgICAgICAgICAgICAgICAgICAgIjxiIHN0eWxlPSdjb2xvcjpyZWQ7ZGlzcGxheTppbmxpbmU7Jz4xNTwvYj4gfCA8YiBzdHlsZT0nY29sb3I6Ymx1ZTtkaXNwbGF5OmlubGluZTsnPjE1PC9iPiIsIA0KICAgICAgICAgICAgICAgICAgICAiPGIgc3R5bGU9J2NvbG9yOnJlZDtkaXNwbGF5OmlubGluZTsnPjQwPC9iPiB8IDxiIHN0eWxlPSdjb2xvcjpibHVlO2Rpc3BsYXk6aW5saW5lOyc+MDwvYj4iKSwgDQogICAgICAgICAgICAgICAgYz1jKCI8YiBzdHlsZT0nY29sb3I6Ymx1ZTtkaXNwbGF5OmlubGluZTsnPnlvdXIgb3Bwb25lbnQ8L2I+IHN0ZWFscyIsIA0KICAgICAgICAgICAgICAgICAgICAiPGIgc3R5bGU9J2NvbG9yOnJlZDtkaXNwbGF5OmlubGluZTsnPjA8L2I+IHwgPGIgc3R5bGU9J2NvbG9yOmJsdWU7ZGlzcGxheTppbmxpbmU7Jz40MDwvYj4iLCANCiAgICAgICAgICAgICAgICAgICAgIjxiIHN0eWxlPSdjb2xvcjpyZWQ7ZGlzcGxheTppbmxpbmU7Jz4xMDwvYj4gfCA8YiBzdHlsZT0nY29sb3I6Ymx1ZTtkaXNwbGF5OmlubGluZTsnPjEwPC9iPiIpKQ0KDQprYWJsZSh0LCANCiAgICAgIGNvbC5uYW1lcz1jKCIiLCAiIiwgIiIpLA0KICAgICAgYWxpZ249YygiciIsICJjIiwgImMiKSwNCiAgICAgIGVzY2FwZSA9IEYpICU+JSANCiAgIGthYmxlX3BhcGVyKGJvb3RzdHJhcF9vcHRpb25zID0gImJvcmRlcmVkIiwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAlPiUgDQogICBjb2x1bW5fc3BlYygxLCBib2xkID0gVCkgJT4lDQogICByb3dfc3BlYygxLCBib2xkID0gVCkNCg0KYGBgDQoNCiMjIyMgTG93IEFkdmVyc2l0eSBhbmQgRGVjZXB0aW9uLUNvbmRpdGlvbiB7LX0NCg0KPioqTGV0J3MgcGxheSBhIGdhbWUhKioNCj4gDQo+WW91IHdlcmUgcmFuZG9tbHkgYXNzaWduZWQgKiphIHBhcnRuZXIqKi4gWW91IGFuZCB5b3VyIHBhcnRuZXIgd2lsbCAqKnBsYXkgYSBnYW1lKio6IEluIGV2ZXJ5IHJvdW5kLCB0aGVyZSBpcyBhIGphY2twb3Qgb2YgY29pbnMgdG8gd2luLiBCb3RoIG9mIHlvdSBoYXZlIHRoZSAqKmNob2ljZSB0byBlaXRoZXIgc2hhcmUqKiB0aGUgamFja3BvdCB3aXRoIHlvdXIgcGFydG5lciAqKm9yIHRvIHN0ZWFsIHRoZSBqYWNrcG90KiogZnJvbSB5b3VyIHBhcnRuZXIuIA0KPg0KPiB5b3UgYm90aCBjaG9vc2UgdG8gc2hhcmUsIGVhY2ggb2YgeW91IHdpbGwgcmVjZWl2ZSAyMCBjb2lucy4gDQo+SWYgYm90aCBzdGVhbCwgdGhlIGphY2twb3QgaXMgbG9zdCBhbmQgbm9uZSBvZiB5b3UgcmVjZWl2ZXMgYW55dGhpbmcuICANCj5JZiB5b3Ugc2hhcmUsIGJ1dCB5b3VyIHBhcnRuZXIgc3RlYWxzLCB5b3VyIHBhcnRuZXIgd2lsbCByZWNlaXZlIDMwIGNvaW5zIGFuZCB5b3Ugd2lsbCByZWNlaXZlIDUgY29pbnMuIA0KPlRoZSBvdGhlciB3YXkgYXJvdW5kLCBpZiB5b3Ugc3RlYWwgYW5kIHlvdXIgcGFydG5lciBjb29wZXJhdGVzLCB5b3Ugd2lsbCByZWNlaXZlIDMwIGNvaW5zIGFuZCB5b3VyIHBhcnRuZXIgd2lsbCByZWNlaXZlIDUgY29pbnMuDQo+DQo+WW91IHdpbGwgYm90aCBkZWNpZGUgc2ltdWx0YW5lb3VzbHkgd2l0aG91dCBrbm93aW5nIHdoYXQgdGhlIG90aGVyIHdpbGwgY2hvb3NlLiBIb3dldmVyLCBpbiBlYWNoIHJvdW5kLCB5b3Ugd2lsbCBoYXZlIHRoZSAqKmNoYW5jZSB0byBjb21tdW5pY2F0ZSB3aXRoIHlvdXIgcGFydG5lciB3aGljaCBkZWNpc2lvbiB5b3UgcGxhbiB0byBtYWtlKio7IGJ1dCB5b3UgYXJlIGJvdGggYWxsb3dlZCB0byBsaWUuIEx1Y2tpbHksICoqeW91ciBwYXJ0bmVyIGlzIGEgcHJldHR5IGhvbmVzdCBwZXJzb24gYW5kIGlzIG1vc3Qgb2YgdGhlIHRpbWUgdHJ1ZSB0byB0aGVpciB3b3JkKiouIFlvdSB3aWxsIHBsYXkgbXVsdGlwbGUgcm91bmRzLiAgIA0KDQpgYGB7cn0NCnQgPC0gZGF0YS5mcmFtZShhPWMoIiIsIA0KICAgICAgICAgICAgICAgICAgICAiPGIgc3R5bGU9J2NvbG9yOnJlZDtkaXNwbGF5OmlubGluZTsnPnlvdTwvYj4gc2hhcmUiLCANCiAgICAgICAgICAgICAgICAgICAgIjxiIHN0eWxlPSdjb2xvcjpyZWQ7ZGlzcGxheTppbmxpbmU7Jz55b3U8L2I+IHN0ZWFsIiksIA0KICAgICAgICAgICAgICAgIGI9YygiPGIgc3R5bGU9J2NvbG9yOmJsdWU7ZGlzcGxheTppbmxpbmU7Jz55b3VyIHBhcnRuZXI8L2I+IHNoYXJlcyIsIA0KICAgICAgICAgICAgICAgICAgICAiPGIgc3R5bGU9J2NvbG9yOnJlZDtkaXNwbGF5OmlubGluZTsnPjIwPC9iPiB8IDxiIHN0eWxlPSdjb2xvcjpibHVlO2Rpc3BsYXk6aW5saW5lOyc+MjA8L2I+IiwgDQogICAgICAgICAgICAgICAgICAgICI8YiBzdHlsZT0nY29sb3I6cmVkO2Rpc3BsYXk6aW5saW5lOyc+MzA8L2I+IHwgPGIgc3R5bGU9J2NvbG9yOmJsdWU7ZGlzcGxheTppbmxpbmU7Jz41PC9iPiIpLCANCiAgICAgICAgICAgICAgICBjPWMoIjxiIHN0eWxlPSdjb2xvcjpibHVlO2Rpc3BsYXk6aW5saW5lOyc+eW91ciBwYXJ0bmVyPC9iPiBzdGVhbHMiLCANCiAgICAgICAgICAgICAgICAgICAgIjxiIHN0eWxlPSdjb2xvcjpyZWQ7ZGlzcGxheTppbmxpbmU7Jz41PC9iPiB8IDxiIHN0eWxlPSdjb2xvcjpibHVlO2Rpc3BsYXk6aW5saW5lOyc+MzA8L2I+IiwgDQogICAgICAgICAgICAgICAgICAgICI8YiBzdHlsZT0nY29sb3I6cmVkO2Rpc3BsYXk6aW5saW5lOyc+MDwvYj4gfCA8YiBzdHlsZT0nY29sb3I6Ymx1ZTtkaXNwbGF5OmlubGluZTsnPjA8L2I+IikpDQoNCmthYmxlKHQsIA0KICAgICAgY29sLm5hbWVzPWMoIiIsICIiLCAiIiksDQogICAgICBhbGlnbj1jKCJyIiwgImMiLCAiYyIpLA0KICAgICAgZXNjYXBlID0gRikgJT4lIA0KICAga2FibGVfcGFwZXIoYm9vdHN0cmFwX29wdGlvbnMgPSAiYm9yZGVyZWQiLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICU+JSANCiAgIGNvbHVtbl9zcGVjKDEsIGJvbGQgPSBUKSAlPiUNCiAgIHJvd19zcGVjKDEsIGJvbGQgPSBUKQ0KDQpgYGANCg0KIyMjIEJlaGF2aW9yIE1hbmlwdWxhdGlvbnMgey19DQoNCkZ1cnRoZXIgaW5mb3JtYXRpb24gb24gdGhlIGdhbWUgYW5kIHRoZSBtYW5pcHVsYXRpb25zIGNhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSAiRG9jdW1lbnRhdGlvbiBvZiB0aGUgR2FtZSItZmlsZSB0aGF0IHdhcyB1cGxvYWQgd2l0aCB0aGUgcHJlcmVnaXN0cmF0aW9uLg0KDQpQYXJ0aWNpcGFudHMnIGJlaGF2aW9ycyBhbmQgcGVyc29uYWxpdHkgc3RhdGVzIHdlcmUgbWFuaXB1bGF0ZWQgZHVyaW5nIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBQcmlzb25lcidzIERpbGVtbWEgZ2FtZS4gRm9sbG93aW5nIHRoZSBnZW5lcmFsIGV4cGxhbmF0aW9uIG9mIHRoZSBnYW1lLCBwYXJ0aWNpcGFudHMgd2VyZSBpbmZvcm1lZCBhYm91dCB0aGVpciB0YXNrOg0KDQojIyMjIEhpZ2ggQWdyZWVhYmxlbmVzcyBhbmQgSG9uZXN0eS1Db25kaXRpb24gey19DQoNCj4gKipZb3VyIHRhc2sqKg0KPg0KPiBZb3VyIHRhc2sgaXMgdG8gKipiZWhhdmUgaG9uZXN0bHkgYW5kIGNvb3BlcmF0aXZlbHkqKiB3aXRoIHlvdXIgW3BhcnRuZXIvb3Bwb25lbnRdLiAqKlBsZWFzZSB0cnkgdG8gYmUgdHJ1ZSB0byB5b3VyIHdvcmQgbW9zdCBvZiB0aGUgdGltZS4qKiBPZiBjb3Vyc2UsIHlvdSBkbyBub3QgYWx3YXlzIGhhdmUgdG8gZG8gYXMgeW91IHByb3Bvc2VkLCBidXQgcGxlYXNlIHRyeSB0byBiZSBob25lc3QgYW5kIGNvb3BlcmF0aXZlIGFzIG11Y2ggYXMgeW91IGNhbi4iDQoNCiMjIyMgTG93IEFncmVlYWJsZW5lc3MgYW5kIEhvbmVzdHktQ29uZGl0aW9uIHstfQ0KDQo+KipZb3VyIHRhc2sqKiAgDQo+DQo+WW91ciB0YXNrIGlzIHRvIGJlaGF2ZSAqKmRpc2hvbmVzdGx5IGFuZCB1bmNvb3BlcmF0aXZlbHkqKiB3aXRoIHlvdXIgW3BhcnRuZXIvb3Bwb25lbnRdLiAqKlBsZWFzZSB0cnkgdG8gcGxheSBkaXJ0eSBtb3N0IG9mIHRoZSB0aW1lLioqIE9mIGNvdXJzZSwgeW91IGRvIG5vdCBhbHdheXMgaGF2ZSB0byBkZWNlaXZlIHlvdXIgW3BhcnRuZXIvb3Bwb25lbnRdLCBidXQgcGxlYXNlIHRyeSB0byBiZSBkaXNob25lc3QgYW5kIHVuY29vcGVyYXRpdmUgYXMgbXVjaCBhcyB5b3UgY2FuLiAgDQoNCiMjIE1lYXN1cmVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KIyMjIFBlcnNvbmFsaXR5IFRyYWl0cyB7LX0NCg0KSEVYQUNPIG1vZGVsIHBlcnNvbmFsaXR5IHRyYWl0cyB3ZXJlIG1lYXN1cmVkIHdpdGggdGhlIEJyaWVmIEhleGFjbyBJbnZlbnRvcnkgKGRlIFZyaWVzLCAyMDE5KS4gVGhlIG9yaWdpbmFsIGFydGljbGUgaW5jbHVkaW5nIHRoZSBpdGVtcyBpczoNCg0KRGUgVnJpZXMsIFIuIEUuICgyMDEzKS4gVGhlIDI0LWl0ZW0gYnJpZWYgaGV4YWNvIGludmVudG9yeSAoYmhpKS4gSm91cm5hbCBvZiBSZXNlYXJjaCBpbiBQZXJzb25hbGl0eSwgNDcoNiksIDg3MeKAkzg4MC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMTYvai5qcnAuMjAxMy4wOS4wMDMgDQoNCmBgYHtyfQ0KDQp0YWIgPC0gY29kZWJvb2sucmF3ICU+JSANCiAgIGZpbHRlcihzdHJpbmdyOjpzdHJfZGV0ZWN0KGBWYXJpYWJsZSBOYW1lYCwgJ2JoaScpKSAlPiUgDQogICBmaWx0ZXIoYFZhcmlhYmxlIE5hbWVgICE9ICJiaGlfMjUiKSAlPiUgDQogICBhcnJhbmdlKERlc2NyaXB0aW9uKSAlPiUgDQogICBtdXRhdGUoYFJldmVyc2UgQ29kaW5nYCA9IGlmZWxzZShpcy5uYShgUmV2ZXJzZSBDb2RpbmdgKSwiTm8iLCBgUmV2ZXJzZSBDb2RpbmdgKSkgDQoNCmthYmxlKHRhYltjKDE6MjQpLGMoMiw0LDYsNSldDQogICAgICAsIGNvbC5uYW1lcyA9IGMoIkl0ZW0gdGV4dCIsICJTY2FsZSIsICJGYWNldCIsICJSZXZlcnNlIGNvZGluZyBuZWNlc3NhcnkiKQ0KICAgICAgLCBjYXB0aW9uPSJJdGVtcyBvZiB0aGUgQkhJIHVzZWQgZm9yIHBlcnNvbmFsaXR5IHRyYWl0IGFzc2Vzc21lbnQiDQogICAgICAsIGVzY2FwZT1GDQopICU+JQ0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSAlPiUgDQogICBmb290bm90ZShnZW5lcmFsPXBhc3RlMCgiVGhlIGluc3RydWN0aW9uIHdhcyAnIiwgdGFiJEluc3RydWN0aW9uWzFdLCAiJyBhbmQgdGhlIHJlc3BvbnNlIHNjYWxlIHdhcyAiLCB0YWIkYFZhbHVlIExhYmVsc2BbMV0sICIuIiksIGVzY2FwZSA9IEYpDQoNCmBgYA0KDQojIyMgUGVyc29uYWxpdHkgU3RhdGVzIHstfQ0KDQpIRVhBQ08gbW9kZWwgcGVyc29uYWxpdHkgc3RhdGVzIHdlcmUgbWVhc3VyZWQgd2l0aCBiaXBvbGFyIGl0ZW1zIGFkb3B0ZWQgZnJvbSBTaGVybWFuIGV0IGFsLiAoMjAxNSkgYW5kIENodXJjaHlhcmQgKDIwMTMpLiBBbGwgcGVyc29uYWxpdHkgc3RhdGVzIHdlcmUgbWVhc3VyZWQgd2l0aCBvbmUgYmlwb2xhciBpdGVtIGVhY2ggYWRvcHRlZCBmcm9tIFNoZXJtYW4gZXQgYWwuICgyMDE1KS4gU3RhdGUgaG9uZXN0eS1odW1pbGl0eSBhbmQgc3RhdGUgYWdyZWVhYmxlbmVzcyB3ZXJlIGFkZGl0aW9uYWxseSBtZWFzdXJlZCB3aXRoIHRocmVlIGl0ZW1zIGZyb20gQ2h1cmNoeWFyZCAoMjAxMyksIGFuZCBhbGwgZm91ciBpdGVtcyB3ZXJlIGNvbWJpbmVkIGludG8gb25lIHNjYWxlIHNjb3JlIGZvciB0aGVzZSBzdGF0ZXMuIFRoZSBvcmlnaW5hbCBhcnRpY2xlcyB1c2luZyB0aGVzZSBpdGVtcyBhcmU6DQoNClNoZXJtYW4sIFIuIEEuLCBSYXV0aG1hbm4sIEouIEYuLCBCcm93biwgTi4gQS4sIFNlcmZhc3MsIEQuIEcuLCAmIEpvbmVzLCBBLiBCLiAoMjAxNSkuIFRoZSBpbmRlcGVuZGVudCBlZmZlY3RzIG9mIHBlcnNvbmFsaXR5IGFuZCBzaXR1YXRpb25zIG9uIHJlYWwtdGltZSBleHByZXNzaW9ucyBvZiBiZWhhdmlvciBhbmQgZW1vdGlvbi4gSm91cm5hbCBvZiBQZXJzb25hbGl0eSBhbmQgU29jaWFsIFBzeWNob2xvZ3ksIDEwOSg1KSwgODcy4oCTODg4LiBodHRwczovL2RvaS5vcmcvMTAuMTAzNy9wc3BwMDAwMDAzNg0KDQpDaHVyY2h5YXJkLCBKLiBTLiAoMjAxMykuIFdpdGhpbi1wZXJzb24gdmFyaWF0aW9uIGluIHBlcnNvbmFsaXR5IGFuZCBwc3ljaG9sb2dpY2FsIHdlbGwtYmVpbmcgW0Rpc3NlcnRhdGlvbl0uIFVuaXZlcnNpdHkgb2YgSGVydGZvcmRzaGlyZSwgSGVydGZvcmRzaGlyZS4gaHR0cHM6Ly9kb2kub3JnLzEwLjE4NzQ1L3RoLjE1NDMyDQoNCg0KYGBge3J9DQoNCnRhYiA8LSBjb2RlYm9vay5yYXcgJT4lIA0KICAgZmlsdGVyKERlc2NyaXB0aW9uPT0iYmVoYXZpb3IiKSANCg0Ka2FibGUodGFiWyxjKDIsNiw1KV0NCiAgICAgICwgY29sLm5hbWVzID0gYygiSXRlbSB0ZXh0IChiaXBvbGFyKSIsICJTY2FsZSIsICJSZXZlcnNlIGNvZGluZyBuZWNlc3NhcnkiKQ0KICAgICAgLCBjYXB0aW9uPSJJdGVtcyBvZiB0aGUgTURNUSB1c2VkIGZvciB0aGUgYXNzZXNzbWVudCBvZiB0aXJlZG5lc3MiDQogICAgICAsIGVzY2FwZT1GDQopICU+JQ0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSAlPiUgDQogICBmb290bm90ZShnZW5lcmFsPXBhc3RlMCgiVGhlIGluc3RydWN0aW9uIHdhcyAnIiwgdGFiJEluc3RydWN0aW9uWzFdLCAiJy4iKSwgZXNjYXBlID0gRikNCg0KYGBgDQoNCiMjIyBTaXR1YXRpb24gQ2hhcmFjdGVyaXN0aWNzIHstfQ0KDQpQZXJjZWl2ZWQgc2l0dWF0aW9uIGNoYXJhY3RlcmlzdGljcyBmcm9tIHRoZSBTaXR1YXRpb25hbCBFaWdodCBESUFNT05EUyB0YXhvbm9teSAoUmF1dGhtYW5uIGV0IGFsLiwgMjAxNCkgd2VyZSBtZWFzdXJlZCB3aXRoIHRoZSBTOCogKFJhdXRobWFubiAmIFNoZXJtYW4sIDIwMTZhKSBmb3IgYWR2ZXJzaXR5IGFuZCBkZWNlcHRpb24gYW5kIHdpdGggdGhlIHNob3J0ZXIgUzgtSSBSYXV0aG1hbm4gJiBTaGVybWFuLCAyMDE2YikgZm9yIHRoZSByZW1haW5pbmcgc2l0dWF0aW9uIGNoYXJhY3RlcmlzdGljcy4gVGhlIG9yaWdpbmFsIGFydGljbGVzIGluY2x1ZGluZyB0aGUgaXRlbXMgYXJlOiANCg0KUmF1dGhtYW5uLCBKLiBGLiwgJiBTaGVybWFuLCBSLiBBLiAoMjAxNikuIE1lYXN1cmluZyB0aGUgc2l0dWF0aW9uYWwgZWlnaHQgZGlhbW9uZHMgY2hhcmFjdGVyaXN0aWNzIG9mIHNpdHVhdGlvbnMuIEV1cm9wZWFuIEpvdXJuYWwgb2YgUHN5Y2hvbG9naWNhbCBBc3Nlc3NtZW50LCAzMigyKSwgMTU14oCTMTY0LiBodHRwczovL2RvaS5vcmcvMTAuMTAyNy8xMDE1LTU3NTkvYTAwMDI0Ng0KDQpSYXV0aG1hbm4sIEouIEYuLCAmIFNoZXJtYW4sIFIuIEEuICgyMDE2KS4gVWx0cmEtYnJpZWYgbWVhc3VyZXMgZm9yIHRoZSBzaXR1YXRpb25hbCBlaWdodCBkaWFtb25kcyBkb21haW5zLiBFdXJvcGVhbiBKb3VybmFsIG9mIFBzeWNob2xvZ2ljYWwgQXNzZXNzbWVudCwgMzIoMiksIDE2NeKAkzE3NC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMjcvMTAxNS01NzU5L2EwMDAyNDUNCg0KDQpgYGB7cn0NCg0KdGFiIDwtIGNvZGVib29rLnJhdyAlPiUgDQogICBmaWx0ZXIoc3RyaW5ncjo6c3RyX2RldGVjdChgVmFyaWFibGUgTmFtZWAsICdzaXRfJykpICU+JSANCiAgIGZpbHRlcihgVmFyaWFibGUgTmFtZWAgIT0gInNpdF8xMyIpICU+JSANCiAgIG11dGF0ZShEZXNjcmlwdGlvbiA9IGlmZWxzZShTdWJzY2FsZT09IkFkdmVyc2l0eSIgfCBTdWJzY2FsZT09IkRlY2VwdGlvbiIsICJTOCogKFJhdXRobWFubiAmIFNoZXJtYW4sIDIwMTZhKSIsICJTOC1JIChSYXV0aG1hbm4gJiBTaGVybWFuLCAyMDE2YikiKSwNCiAgICAgICAgICBgUmV2ZXJzZSBDb2RpbmdgID0gaWZlbHNlKGlzLm5hKGBSZXZlcnNlIENvZGluZ2ApLCJObyIsIGBSZXZlcnNlIENvZGluZ2ApKSANCg0Ka2FibGUodGFiWyxjKDIsNiw0LDUpXQ0KICAgICAgLCBjb2wubmFtZXMgPSBjKCJJdGVtIHRleHQiLCAiU2NhbGUiLCAiUXVlc3Rpb25uYWlyZSIsICJSZXZlcnNlIGNvZGluZyBuZWNlc3NhcnkiKQ0KICAgICAgLCBjYXB0aW9uPSJJdGVtcyBvZiB0aGUgUzgqIGFuZCBTOC1JIHVzZWQgZm9yIHRoZSBhc3Nlc3NtZW50IG9mIHBlcmNlaXZlZCBzaXR1YXRpb24gY2hhcmFjdGVyaXN0aWNzIg0KICAgICAgLCBlc2NhcGU9Rg0KKSAlPiUNCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gVCkgJT4lIA0KICAgZm9vdG5vdGUoZ2VuZXJhbD1wYXN0ZTAoIlRoZSBpbnN0cnVjdGlvbiB3YXMgJyIsIHRhYiRJbnN0cnVjdGlvblsxXSwgIicgYW5kIHRoZSByZXNwb25zZSBzY2FsZSB3YXMgIiwgdGFiJGBWYWx1ZSBMYWJlbHNgWzFdLCAiLiIpLCBlc2NhcGUgPSBGKQ0KDQpgYGANCg0KIyMjIFBvc2l0aXZlIEFmZmVjdCB7LX0NCg0KUG9zaXRpdmUgYWZmZWN0IHdhcyBtZWFzdXJlZCB3aXRoIGEgc2hvcnQgZm9ybSBvZiB0aGUgRW5nbGlzaCB2ZXJzaW9uIG9mIHRoZSBtdWx0aWRpbWVuc2lvbmFsIG1vb2Qgc3RhdGUgcXVlc3Rpb25uYWlyZSAoU3RleWVyIGV0IGFsLiwgMTk5NCkuIFRoZSBvcmlnaW5hbCB2ZXJzaW9uIGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly93d3cubWV0aGV2YWwudW5pLWplbmEuZGUvbWRiZi5waHApLiANCg0KYGBge3J9DQoNCnRhYiA8LSBjb2RlYm9vay5yYXcgJT4lIA0KICAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoU3Vic2NhbGUsICdHQicpKSAlPiUgDQogICBtdXRhdGUoU3Vic2NhbGUgPSAicG9zaXRpdmUgYWZmZWN0IChnb29kLWJhZCBtb29kKSIpDQoNCmthYmxlKHRhYlssYygyLDQsNiw1KV0NCiAgICAgICwgY29sLm5hbWVzID0gYygiSXRlbSB0ZXh0IiwgIlNjYWxlIiwgIlN1YnNjYWxlIiwgIlJldmVyc2UgY29kaW5nIG5lY2Vzc2FyeSIpDQogICAgICAsIGNhcHRpb249Ikl0ZW1zIG9mIHRoZSBNRE1RIHVzZWQgZm9yIHRoZSBhc3Nlc3NtZW50IG9mIHBvc2l0aXZlIGFmZmVjdCINCiAgICAgICwgZXNjYXBlPUYNCikgJT4lDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9cGFzdGUwKCJUaGUgaW5zdHJ1Y3Rpb24gd2FzICciLCB0YWIkSW5zdHJ1Y3Rpb25bMV0sICInIGFuZCB0aGUgcmVzcG9uc2Ugc2NhbGUgd2FzICIsIHRhYiRgVmFsdWUgTGFiZWxzYFsxXSwgIi4iKSwgZXNjYXBlID0gRikNCg0KYGBgDQoNCiMjIyBUaXJlZG5lc3Mgey19DQoNClRpcmVkbmVzcyB3YXMgbWVhc3VyZWQgd2l0aCBhIHNob3J0IGZvcm0gb2YgdGhlIEVuZ2xpc2ggdmVyc2lvbiBvZiB0aGUgbXVsdGlkaW1lbnNpb25hbCBtb29kIHN0YXRlIHF1ZXN0aW9ubmFpcmUgKFN0ZXllciBldCBhbC4sIDE5OTQpLiBUaGUgb3JpZ2luYWwgdmVyc2lvbiBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vd3d3Lm1ldGhldmFsLnVuaS1qZW5hLmRlL21kYmYucGhwKS4gVGlyZWRuZXNzIHdhcyByZXZlcnNlLWNvZGVkIHN1Y2ggdGhhdCBoaWdoZXIgbGV2ZWxzIGluZGljYXRlIGxlc3MgdGlyZWRuZXNzLCBvciBtb3JlIGFjdGl2ZSBtb29kLiANCg0KYGBge3J9DQoNCnRhYiA8LSBjb2RlYm9vay5yYXcgJT4lIA0KICAgZmlsdGVyKHN0cmluZ3I6OnN0cl9kZXRlY3QoU3Vic2NhbGUsICdBVCcpKSAlPiUgDQogICBtdXRhdGUoU3Vic2NhbGUgPSAidGlyZWRuZXNzIChhY3RpdmUtdGlyZWQgbW9vZCkiKQ0KDQprYWJsZSh0YWJbLGMoMiw0LDYsNSldDQogICAgICAsIGNvbC5uYW1lcyA9IGMoIkl0ZW0gdGV4dCIsICJTY2FsZSIsICJTdWJzY2FsZSIsICJSZXZlcnNlIGNvZGluZyBuZWNlc3NhcnkiKQ0KICAgICAgLCBjYXB0aW9uPSJJdGVtcyBvZiB0aGUgTURNUSB1c2VkIGZvciB0aGUgYXNzZXNzbWVudCBvZiB0aXJlZG5lc3MiDQogICAgICAsIGVzY2FwZT1GDQopICU+JQ0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSAlPiUgDQogICBmb290bm90ZShnZW5lcmFsPXBhc3RlMCgiVGhlIGluc3RydWN0aW9uIHdhcyAnIiwgdGFiJEluc3RydWN0aW9uWzFdLCAiJyBhbmQgdGhlIHJlc3BvbnNlIHNjYWxlIHdhcyAiLCB0YWIkYFZhbHVlIExhYmVsc2BbMV0sICIuIiksIGVzY2FwZSA9IEYpDQoNCmBgYA0KDQojIyBBbmFseXRpY2FsIFN0cmF0ZWd5IHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KIyMjIFIgVmVyc2lvbiBhbmQgUGFja2FnZXMgey19DQoNClRoaXMgaXMgYSBsaXN0IG9mIHRoZSBwYWNrYWdlcyB1c2VkIHRvIHByZXBhcmUgYW5kIGFuYWx5emUgdGhlIGRhdGEgYW5kIHRvIHByZXNlbnQgdGhlIHJlc3VsdHMuIFdlIGV4cGxpY2l0bHkgdGhhbmsgdGhlIGF1dGhvcnMgb2YgYWxsIHBhY2thZ2VzIGZvciB0aGUgd29yayB0aGV5IGhhdmUgcHV0IGFuZCBhcmUgcHV0dGluZyBpbnRvIHRoZSBkZXZlbG9wbWVudCBhbmQgbWFpbnRlbmFuY2Ugb2YgdGhlIHBhY2thZ2VzLiAgIA0KDQpgYGB7ciwgcmVzdWx0cz0nYXNpcyd9DQoNCnJlcG9ydF9wYWNrYWdlcyhpbmNsdWRlX1I9RkFMU0UsIHByZWZpeD0iXG4gKiAiKQ0KDQpyZXBvcnRfc3lzdGVtKCkNCg0KYGBgDQoNCiMjIyBQbGFubmVkIEFuYWx5c2VzIHstfQ0KDQpUaGUgcGxhbm5lZCBhbmFseXNlcyB3ZXJlIHByZXJlZ2lzdGVyZWQgYWxvbmcgd2l0aCB0aGUgc3R1ZHkgZGVzaWduLiBUaGlzIHByZXJlZ2lzdHJhdGlvbiwgIGluY2x1ZGluZyBhIGRldGFpbGVkIGFjY291bnQgb2YgdGhlIGFuYWx5dGljIHN0cmF0ZWd5LCBjYW4gYmUgZm91bmQgb24gT1NGOiBodHRwczovL29zZi5pby9obnU0Yi8NCg0KIyMjIENvZGVib29rIG9mIHRoZSBGaW5hbCBEYXRhIHstfQ0KDQpUaGlzIGlzIHRoZSBjb2RlYm9vayBmb3IgdGhlIGZpbmFsIGRhdGEgKHdpdGhvdXQgdGhlIHJlYWN0aW9uIHRpbWUgYW5kIGVycm9yLXJhdGUgc3BlY2lmaWNhdGlvbnMpIHRvIGdpdmUgYW4gb3ZlcnZpZXcgb2YgdGhlIGRhdGEuDQoNCmBgYHtyIGNvZGVib29rLCBlY2hvID0gVFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCiMgcHJpbnQgdGFibGUNCmRhdGF0YWJsZShjb2RlYm9vaywgDQogICAgICAgICAgY2FwdGlvbj0iQ29kZWJvb2sgb2YgdGhlIGZpbmFsIGRhdGFzZXQuIikgDQoNCmBgYA0KDQojIyBQcmV0ZXN0IHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KV2UgdGVzdGVkIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGUgZXhwZXJpbWVudGFsIHBhcmFkaWdtIGluIGEgcHJlbGltaW5hcnkgc3R1ZHkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtYW5pcHVsYXRpb24gd29ya3MuIEhlcmUsIHdlIGJyaWVmbHkgc3VtbWFyaXplIHRoZSBkZXNpZ24gb2YgdGhlIGdhbWUgYW5kIHRoZSBtYW5pcHVsYXRpb25zIGFuZCB0aGUgZmluZGluZ3MgZnJvbSB0aGlzIHByZXRlc3QuDQoNCiMjIyBHYW1lIHstfQ0KDQpUaGVzZSBhcmUgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9ucyBmb3IgdGhlIHByaXNvbmVyJ3MgZGlsZW1tYSBnYW1lIGluIHRoZSBwcmV0ZXN0Og0KDQo+ICJZb3Ugd2VyZSByYW5kb21seSBhc3NpZ25lZCBhIHBhcnRuZXJbb3Bwb25lbnRdLiBZb3UgYW5kIHlvdXIgcGFydG5lcltvcHBvbmVudF0gd2lsbCBwbGF5IGENCmdhbWU6IFlvdSBhcmUgc3RhbmRpbmcgaW4gZnJvbnQgb2YgYSBtYWNoaW5lIHRoYXQgbXVsdGlwbGllcyBhbmQgZGlzdHJpYnV0ZXMNCmNvaW5zLiBJbiBldmVyeSByb3VuZCwgZWFjaCBvZiB5b3Ugd2lsbCByZWNlaXZlIGEgY29pbi4gWW91IGhhdmUgdGhlIGNob2ljZQ0KdG8gZWl0aGVyIHB1dCB5b3VyIGNvaW4gaW50byB0aGUgbWFjaGluZSAoaS5lLiwgY29vcGVyYXRlIHdpdGggeW91cg0KcGFydG5lcltvcHBvbmVudF0pIG9yIGtlZXAgeW91ciBjb2luIChpLmUuLCBjaGVhdCBvbiB5b3VyIHBhcnRuZXJbb3Bwb25lbnRdKS4gWW91ciBwYXJ0bmVyW29wcG9uZW50XSB3aWxsDQpoYXZlIHRoZSBzYW1lIGNob2ljZS4gIA0KSWYgeW91IGJvdGggY29vcGVyYXRlLCB0aGF0IGlzLCBib3RoIHB1dCB0aGVpciBjb2luIGludG8gdGhlIG1hY2hpbmUsIGVhY2ggb2YNCnlvdSB3aWxsIHJlY2VpdmUgMTlbMTBdIGNvaW5zIG91dCBvZiB0aGUgbWFjaGluZS4gSWYgYm90aCBjaGVhdCwgZWFjaCB3aWxsIHJlY2VpdmUNCjFbOF0gY29pbi4gSWYgeW91IGNvb3BlcmF0ZSwgYnV0IHlvdXIgcGFydG5lcltvcHBvbmVudF0gY2hlYXRzLCB5b3VyIHBhcnRuZXJbb3Bwb25lbnRdIHdpbGwgcmVjZWl2ZSAyMA0KY29pbnMgYW5kIHlvdSBub25lLiBUaGUgb3RoZXIgd2F5IGFyb3VuZCwgaWYgeW91IGNoZWF0IGFuZCB5b3VyIHBhcnRuZXJbb3Bwb25lbnRdDQpjb29wZXJhdGVzLCB5b3Ugd2lsbCByZWNlaXZlIDIwIGNvaW5zIGFuZCB5b3VyIHBhcnRuZXJbb3Bwb25lbnRdIHdpbGwgcmVjZWl2ZSBub25lLg0KWW91IHdpbGwgYm90aCBkZWNpZGUgc2ltdWx0YW5lb3VzbHkgd2l0aG91dCBrbm93aW5nIHdoYXQgdGhlIG90aGVyIHdpbGwNCmNob29zZS4gWW91IHdpbGwgcGxheSBtdWx0aXBsZSByb3VuZHMuIg0KDQpJbiB0aGlzIHZlcnNpb24sIHdlIGFpbWVkIHRvIGNvdmVydGx5IG1hbmlwdWxhdGUgdGhlIHBhcnRpY2lwYW50cycgYmVoYXZpb3JzIGJ5IHZhcnlpbmcgdGhlIGdvYWwgb2YgdGhlIGdhbWU6IA0KDQo+ICJZb3VyIHRhc2sgaXMgdG8gcGxheSB3aXRoIHlvdXIgcGFydG5lci9vcHBvbmVudCBzdWNoIHRoYXQgeW91IHdpbGwNCnRvZ2V0aGVyIGdhaW4gYXMgbWFueSBjb2lucyBhcyBwb3NzaWJsZS4gSW4gdGhlIGVuZCwgeW91ciByZXN1bHQgd2lsbCBiZQ0KbnVtYmVyIG9mIGNvaW5zIHRoYXQgeW91IGhhdmUgZ2FpbmVkIG9uIGF2ZXJhZ2UsIHRoYXQgaXMsIHRoZSBtZWFuIG9mDQp5b3VyIGFuZCB5b3VyIHBhcnRuZXIvb3Bwb25lbnQncyBjb2lucy4NCklmIHlvdSBnYWluZWQsIGZvciBleGFtcGxlLCAzMDAgY29pbnMgYW5kIHlvdXIgcGFydG5lci9vcHBvbmVudCBnYWluZWQNCjEwMCwgeW91IHdpbGwgcmVjZWl2ZSAoMzAwKzEwMCkvMiwgdGhhdCBpcywgMjAwIHRpY2tldHMgZm9yIHRoZSBsb3R0ZXJ5LiINCj4NCj4gLS0tIGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eS1jb25kaXRpb24NCg0KPiAiWW91ciB0YXNrIGlzIHRvIHBsYXkgYWdhaW5zdCB5b3VyIHBhcnRuZXIvb3Bwb25lbnQgc3VjaCB0aGF0IHlvdSB3aWxsDQpnYWluIG1vcmUgcG9pbnRzIHRoYW4geW91ciBwYXJ0bmVyL29wcG9uZW50LiBJbiB0aGUgZW5kLCB5b3VyIHJlc3VsdA0Kd2lsbCBiZSB5b3VyIGFkdmFudGFnZSBvdmVyIHlvdXIgcGFydG5lci9vcHBvbmVudCwgdGhhdCBpcywgdGhlDQpkaWZmZXJlbmNlIGJldHdlZW4geW91ciBhbmQgeW91ciBwYXJ0bmVyL29wcG9uZW50J3MgY29pbnMuDQpJZiB5b3UgZ2FpbmVkLCBmb3IgZXhhbXBsZSwgMzAwIGNvaW5zIGFuZCB5b3VyIHBhcnRuZXIvb3Bwb25lbnQgZ2FpbmVkDQoxMDAsIHlvdSB3aWxsIHJlY2VpdmUgMzAwLTEwMCwgdGhhdCBpcywgMjAwIHRpY2tldHMgZm9yIHRoZSBsb3R0ZXJ5LiINCj4NCj4gLS0tIGxvdyBhZ3JlZWFibGVuZXNzIGFuZCBob25lc3R5LWNvbmRpdGlvbg0KDQpUaGUgc2l0dWF0aW9uIHdhcyBtYW5pcHVsYXRlZCBieSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGNvbXB1dGVyIChpLmUuLCBwYXJ0bmVyIG9yIG9wcG9uZW50KSBhbmQgYnkgY2hhbmdpbmcgdGhlIHBheW9mZnMgb2YgdGhlIGdhbWUuDQoNCiMjIyBSZXN1bHRzIHstfQ0KDQpgYGB7ciBwcmV0ZXN0LWFub3Zhcy0xLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KYW92LmNvb3AgIDwtIGFvdl9jYXIoY29vcFN1bSB+IGJlaGF2aW9yX2ZhY3RvciAqIHNpdHVhdGlvbl9mYWN0b3IgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1wcmV0ZXN0KQ0KYW92LmFncmVlIDwtIGFvdl9jYXIoc3RhdGUuYWdyZWVhYmxlbmVzcyB+IGJlaGF2aW9yX2ZhY3RvciAqIHNpdHVhdGlvbl9mYWN0b3IgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1wcmV0ZXN0KQ0KYW92LmhvbiAgIDwtIGFvdl9jYXIoc3RhdGUuaG9uZXN0eS5odW1pbGl0eSB+IGJlaGF2aW9yX2ZhY3RvciAqIHNpdHVhdGlvbl9mYWN0b3IgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1wcmV0ZXN0KQ0KYW92LmFkdiAgIDwtIGFvdl9jYXIoYWR2ZXJzaXR5IH4gYmVoYXZpb3JfZmFjdG9yICogc2l0dWF0aW9uX2ZhY3RvciArIEVycm9yKFJlc3BvbnNlSWQpLCBkYXRhPXByZXRlc3QpDQphb3YuZGVjICAgPC0gYW92X2NhcihkZWNlcHRpb24gfiBiZWhhdmlvcl9mYWN0b3IgKiBzaXR1YXRpb25fZmFjdG9yICsgRXJyb3IoUmVzcG9uc2VJZCksIGRhdGE9cHJldGVzdCkNCg0KdGFiIDwtIGJpbmRfcm93cyhhcy5kYXRhLmZyYW1lKG5pY2UoYW92LmNvb3AsIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpLA0KICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKG5pY2UoYW92LmFncmVlLCBlcz0icGVzIiwgc2lnX3N5bWJvbHMgPSByZXAoIiIsIDQpLCBNU0U9RkFMU0UpKSwNCiAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZShuaWNlKGFvdi5ob24sIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpLA0KICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKG5pY2UoYW92LmFkdiwgZXM9InBlcyIsIHNpZ19zeW1ib2xzID0gcmVwKCIiLCA0KSwgTVNFPUZBTFNFKSksDQogICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUobmljZShhb3YuZGVjLCBlcz0icGVzIiwgc2lnX3N5bWJvbHMgPSByZXAoIiIsIDQpLCBNU0U9RkFMU0UpKQ0KKQ0KDQp0YWIkcC52YWx1ZVt0YWIkcC52YWx1ZT09IjwuMDAxIl0gPC0gIiZsdDsuMDAxIg0KdGFiJHBlc1t0YWIkcGVzPT0iPC4wMDEiXSA8LSAiJmx0Oy4wMDEiDQp0YWIkRWZmZWN0IDwtIGMoIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiLCAiQmVoYXZpb3IgeCBTaXR1YXRpb24gY29uZGl0aW9ucyIpDQoNCmthYmxlKHRhYiwNCiAgICAgIGVzY2FwZT1GLA0KICAgICAgY29sLm5hbWVzPWMoIkVmZmVjdCIsICJkZiIsICJGIiwgIiYjOTUxOzxzdWI+cDwvc3ViPjxzdXA+Mjwvc3VwPiIsICI8aT5wPC9pPiB2YWx1ZSIpLA0KICAgICAgY2FwdGlvbj0iQW5hbHlzaXMgb2YgdmFyaWFuY2UgZXhhbWluaW5nIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIGFuZCB0aGUgdGFyZ2V0ZWQgcGVyc29uYWxpdHkgc3RhdGVzIGFuZCBzaXR1YXRpb24gY2hhcmFjdGVyaXN0aWNzIGluIHRoZSBwcmV0ZXN0LiIpICU+JSAgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgDQogICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwgZml4ZWRfdGhlYWQgPSBUKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDEpLCB3aWR0aCA9ICIxNWVtIikgJT4lIA0KICAgY29sdW1uX3NwZWMoYygyOjQpLCB3aWR0aCA9ICI4ZW0iKSAlPiUgDQogICBwYWNrX3Jvd3MoIkRWOiBTdW0gb2YgY29vcGVyYXRpdmUgZGVjaXNpb25zIiwgMSwgMykgJT4lDQogICBwYWNrX3Jvd3MoIkRWOiBTdGF0ZSBhZ3JlZWFibGVuZXNzIiwgNCwgNikgJT4lDQogICBwYWNrX3Jvd3MoIkRWOiBTdGF0ZSBob25lc3R5LWh1bWlsaXR5IiwgNywgOSkgJT4lDQogICBwYWNrX3Jvd3MoIkRWOiBBZHZlcnNpdHkiLCAxMCwgMTIpICU+JQ0KICAgcGFja19yb3dzKCJEVjogRGVjZXB0aW9uIiwgMTMsIDE1KSANCg0KYGBgDQoNCmBgYHtyIHByZXRlc3QtcGxvdCwgZmlnLndpZHRoPTExLCBmaWcuYXNwPTEuMiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGZpZy5jYXA9IkFzc29jaWF0aW9ucyBiZXR3ZWVuIHRoZSBleHBlcmltZW50YWwgY29uZGl0aW9ucyBhbmQgdGhlIHRhcmdldGVkIHBlcnNvbmFsaXR5IHN0YXRlcyBhbmQgc2l0dWF0aW9uIGNoYXJhY3RlcmlzdGljcyBpbiB0aGUgcHJldGVzdC4ifQ0KDQojIHBsb3QgaW50ZXJhY3Rpb24gZGlhZ3JhbQ0KcjEgPC0gZ2dwbG90KHByZXRlc3QgJT4lIA0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KHNpdHVhdGlvbl9mYWN0b3IsIGJlaGF2aW9yX2ZhY3RvcikgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKGNvb3BTdW0sIG5hLnJtPVRSVUUpKSwgDQogICAgICAgICAgICAgYWVzKHggPSBzaXR1YXRpb25fZmFjdG9yLCB5ID0gZ3JvdXBzLCBjb2xvciA9IGJlaGF2aW9yX2ZhY3RvcikpICsNCiAgIHRoZW1lX3B1YigpICsgeGxhYigiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKSArIHlsYWIoIlN1bSBvZiBjb29wZXJhdGl2ZSBkZWNpc2lvbnMiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsMTUpLCBsYWJlbHM9YygxOjE1KSwgYnJlYWtzPWMoMToxNSkpICsNCiAgIGdndGl0bGUoIkNvb3BlcmF0aXZlIERlY2lzaW9ucyIpICsgDQogICB0aGVtZShsZWdlbmQucG9zaXRpb249YygwLjMsMC44NSksIGxlZ2VuZC5kaXJlY3Rpb249InZlcnRpY2FsIikgKyBsYWJzKGNvbG9yPSJCZWhhdmlvciBjb25kaXRpb25zIikgKw0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5iZWgpICsNCiAgIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWhhdmlvcl9mYWN0b3IpLCBzaXplPTEuNSkgKw0KICAgZ2VvbV9wb2ludChzaXplPTIuNSkgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT05KSkNCg0KcjIgPC0gZ2dwbG90KHByZXRlc3QgJT4lIA0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KHNpdHVhdGlvbl9mYWN0b3IsIGJlaGF2aW9yX2ZhY3RvcikgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKHN0YXRlLmFncmVlYWJsZW5lc3MsIG5hLnJtPVRSVUUpKSwgDQogICAgICAgICAgICAgYWVzKHggPSBzaXR1YXRpb25fZmFjdG9yLCB5ID0gZ3JvdXBzLCBjb2xvciA9IGJlaGF2aW9yX2ZhY3RvcikpICsNCiAgIHRoZW1lX3B1YigpICsgeGxhYigiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKSArIHlsYWIoIlN0YXRlIGFncmVlYWJsZW5lc3Mgc2NvcmUiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdndGl0bGUoIlN0YXRlIEFncmVlYWJsZW5lc3MiKSArIA0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPWMoMC4zLDAuODUpLCBsZWdlbmQuZGlyZWN0aW9uPSJ2ZXJ0aWNhbCIpICsgbGFicyhjb2xvcj0iQmVoYXZpb3IgY29uZGl0aW9ucyIpICsNCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuYmVoKSArDQogICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gYmVoYXZpb3JfZmFjdG9yKSwgc2l6ZT0xLjUpICsNCiAgIGdlb21fcG9pbnQoc2l6ZT0yLjUpICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9OSkpDQoNCnIzIDwtIGdncGxvdChwcmV0ZXN0ICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShzaXR1YXRpb25fZmFjdG9yLCBiZWhhdmlvcl9mYWN0b3IpICU+JSANCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoZ3JvdXBzID0gbWVhbihzdGF0ZS5ob25lc3R5Lmh1bWlsaXR5LCBuYS5ybT1UUlVFKSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gc2l0dWF0aW9uX2ZhY3RvciwgeSA9IGdyb3VwcywgY29sb3IgPSBiZWhhdmlvcl9mYWN0b3IpKSArDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIlNpdHVhdGlvbiBjb25kaXRpb25zIikgKyB5bGFiKCJTdGF0ZSBob25lc3R5LWh1bWlsaXR5IHNjb3JlIikgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygxLDcpLCBsYWJlbHM9YygxOjcpLCBicmVha3M9YygxOjcpKSArDQogICBnZ3RpdGxlKCJTdGF0ZSBIb25lc3R5LUh1bWlsaXR5IikgKyANCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDAuMywwLjg1KSwgbGVnZW5kLmRpcmVjdGlvbj0idmVydGljYWwiKSArIGxhYnMoY29sb3I9IkJlaGF2aW9yIGNvbmRpdGlvbnMiKSArIA0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5iZWgpICsNCiAgIGdlb21fbGluZShhZXMoZ3JvdXAgPSBiZWhhdmlvcl9mYWN0b3IpLCBzaXplPTEuNSkgKw0KICAgZ2VvbV9wb2ludChzaXplPTIuNSkgKyB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT05KSkNCg0KcjQgPC0gZ2dwbG90KHByZXRlc3QgJT4lIA0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KHNpdHVhdGlvbl9mYWN0b3IsIGJlaGF2aW9yX2ZhY3RvcikgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKGFkdmVyc2l0eSwgbmEucm09VFJVRSkpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGJlaGF2aW9yX2ZhY3RvciwgeSA9IGdyb3VwcywgY29sb3IgPSBzaXR1YXRpb25fZmFjdG9yKSkgKw0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJCZWhhdmlvciBjb25kaXRpb25zIikgKyB5bGFiKCJBZHZlcnNpdHkgc2NvcmUiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdndGl0bGUoIkFkdmVyc2l0eSIpICsgDQogICB0aGVtZShsZWdlbmQucG9zaXRpb249YygwLjMsMC44NSksIGxlZ2VuZC5kaXJlY3Rpb249InZlcnRpY2FsIikgKyBsYWJzKGNvbG9yPSJTaXR1YXRpb24gY29uZGl0aW9ucyIpICsNCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuc2l0KSArDQogICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc2l0dWF0aW9uX2ZhY3RvciksIHNpemU9MS41KSArDQogICBnZW9tX3BvaW50KHNpemU9Mi41KSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTkpKQ0KDQpyNSA8LSBnZ3Bsb3QocHJldGVzdCAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoc2l0dWF0aW9uX2ZhY3RvciwgYmVoYXZpb3JfZmFjdG9yKSAlPiUgDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKGdyb3VwcyA9IG1lYW4oZGVjZXB0aW9uLCBuYS5ybT1UUlVFKSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gYmVoYXZpb3JfZmFjdG9yLCB5ID0gZ3JvdXBzLCBjb2xvciA9IHNpdHVhdGlvbl9mYWN0b3IpKSArDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIkJlaGF2aW9yIGNvbmRpdGlvbnMiKSArIHlsYWIoIkRlY2VwdGlvbiBzY29yZSIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2d0aXRsZSgiRGVjZXB0aW9uIikgKyANCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDAuMywwLjg1KSwgbGVnZW5kLmRpcmVjdGlvbj0idmVydGljYWwiKSArIGxhYnMoY29sb3I9IlNpdHVhdGlvbiBjb25kaXRpb25zIikgKyANCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuc2l0KSArDQogICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc2l0dWF0aW9uX2ZhY3RvciksIHNpemU9MS41KSArDQogICBnZW9tX3BvaW50KHNpemU9Mi41KSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTkpKQ0KDQoNCiMjIyBjb21iaW5lIHBsb3RzDQpyMSArIHIyICsgcjMgKyByNCArIHI1ICsgcGxvdF9sYXlvdXQobmNvbD0yKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gIkEiKSANCg0KYGBgDQoNCiMjIyBDb25jbHVzaW9uIHstfQ0KDQpUaGUgZ2FtZSBpbiB0aGUgcHJldGVzdCBzdWNjZXNzZnVsbHkgbWFuaXB1bGF0ZWQgcGFydGljaXBhbnQncyBsZXZlbHMgb2Ygc3RhdGUgYWdyZWVhYmxlbmVzcyBhbmQgc3RhdGUgaG9uZXN0eS1odW1pbGl0eSwgYnV0IGl0IGhhZCBubyBlZmZlY3Qgb24gdGhlIHBlcmNlcHRpb25zIG9mIGFkdmVyc2l0eSBhbmQgZGVjZXB0aW9uLiBJbiBzdW0sIHRoaXMgcHJldGVzdCB0aHVzIHJldmVhbGVkIHRoYXQgdGhlIG1hbmlwdWxhdGlvbiBvZiB0aGUgc2l0dWF0aW9uIHdhcyB1bnN1Y2Nlc3NmdWwgYW5kIHRoYXQgYWltaW5nIHRvIGNvdmVydGx5IG1hbmlwdWxhdGUgYmVoYXZpb3IgdmlhIGdvYWwgaW5zdHJ1Y3Rpb25zIG1heSBoYXZlIHVud2FudGVkIGVmZmVjdCBvbiB0aGUgcGVyY2VwdGlvbiBvZiB0aGUgc2l0dWF0aW9ucy4gV2UgdGhlcmVmb3JlIGFkYXB0ZWQgdGhlIGV4cGVyaW1lbnRhbCBwYXJhZGlnbSBmb3IgdGhlIG1haW4gc3R1ZHkgZGVzY3JpYmVkIGluIHRoZSBtZXRob2RzIGJlbG93LiANCg0KIyBEZXNjcmlwdGl2ZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIHstfQ0KDQpgYGB7ciBiaWctZml2ZS1kZXNjLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPUYsIGRlcGVuZHNvbj0iY3JlYXRlLW1hc3Rlci1kYXRhZnJhbWVzIn0NCg0KIyMgZXh0cmFjdCByZWxldmFudCB2YXJpYWJsZXMNCnJlbCA8LSBkYXRhICU+JSANCiAgIHVuZ3JvdXAoKSAlPiUgDQogICBzZWxlY3QoIyBUcmFpdHMNCiAgICAgICJ0cmFpdC5oIiwgInRyYWl0LmUiLCAidHJhaXQueCIsICJ0cmFpdC5hIiwgInRyYWl0LmMiLCAidHJhaXQubyIsDQogICAgICAjIEJlaGF2aW9ycw0KICAgICAgInN0YXRlLmgiLCAic3RhdGUuZSIsICJzdGF0ZS54IiwgInN0YXRlLmEiLCAic3RhdGUuYyIsICJzdGF0ZS5vIiwgIm5Db29wIiwgIm5Ib24iLA0KICAgICAgIyBTaXR1YXRpb24NCiAgICAgICJkdXQiLCAiaW50IiwgImFkdiIsICJtYXQiLCAicG9zIiwgIm5lZyIsICJkZWMiLCAic29jIiwNCiAgICAgICMgT3V0Y29tZXMNCiAgICAgICJtb29kLmdiIiwgIm1vb2QuYXQiKQ0KDQoNCiMjIGFycmFuZ2UgZGVzY3JpcHRpdmVzIGluIHRhYmxlDQp0YWIgPC0gcm91bmQoYXMuZGF0YS5mcmFtZShkZXNjcmliZShyZWwpKVssMjoxM10sMikNCnJvdy5uYW1lcyh0YWIpIDwtIGMoIyBUcmFpdHMNCiAgICJUcmFpdCBIb25lc3R5LUh1bWlsaXR5IiwgIlRyYWl0IEVtb3Rpb25hbGl0eSIsICJUcmFpdCBFeHRyYXZlcnNpb24iLCAiVHJhaXQgQWdyZWVhYmxlbmVzcyIsICJUcmFpdCBDb25zY2llbnRpb3VzbmVzcyIsICJUcmFpdCBPcGVubmVzcyIsDQogICAjIEJlaGF2aW9ycw0KICAgIlN0YXRlIEhvbmVzdHktSHVtaWxpdHkiLCAiU3RhdGUgRW1vdGlvbmFsaXR5IiwgIlN0YXRlIEV4dHJhdmVyc2lvbiIsICJTdGF0ZSBBZ3JlZWFibGVuZXNzIiwgIlN0YXRlIENvbnNjaWVudGlvdXNuZXNzIiwgIlN0YXRlIE9wZW5uZXNzIiwgIlNoYXJpbmcgQmVoYXZpb3JzIiwgIkhvbmVzdCBCZWhhdmlvcnMiLA0KICAgIyBTaXR1YXRpb24NCiAgICJEdXR5IiwgIkludGVsbGVjdCIsICJBZHZlcnNpdHkiLCAiTWF0aW5nIiwgInBPc2l0aXZpdHkiLCAiTmVnYXRpdml0eSIsICJEZWNlcHRpb24iLCAiU29jaWFsaXR5IiwNCiAgICMgT3V0Y29tZXMNCiAgICJQb3NpdGl2ZSBBZmZlY3QiLCAiVGlyZWRuZXNzKHIpIikNCg0KDQojIGFkZCByZWxpYWJpbGl0eQ0KcmF3IDwtIGRhdGEucmF3ICU+JSANCiAgIG11dGF0ZShzY3JlZW5pbmcgPSBmYWN0b3IoaWZlbHNlKHNjcmVlbmVyLjE9PTEgJiBzY3JlZW5lci4yPT00ICYgc2NyZWVuZXIuMz09MiAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuZXIuND09MSAmIHNjcmVlbmVyLjU9PTEsInBhc3NlZCIsICJmYWlsZWQiKSksDQogICAgICAgICAgcmVxdWlyZW1lbnRzID0gZmFjdG9yKGlmZWxzZShjb25zZW50PT0xICYgb2xkLmVub3VnaD09MSAmIGRldmljZSVpbiVjKDEsMiksInBhc3NlZCIsICJmYWlsZWQiKSksDQogICAgICAgICAgY2FyZWZ1bC5yZXNwb25kaW5nID0gZmFjdG9yKGlmZWxzZShiaGlfMjU9PTMgJiBzaXRfMTM9PTYsInBhc3NlZCIsICJmYWlsZWQiKSksDQogICAgICAgICAgZXhjbHVkZSA9IGlmZWxzZShzY3JlZW5pbmc9PSJwYXNzZWQiICYgcmVxdWlyZW1lbnRzPT0icGFzc2VkIiAmIGNhcmVmdWwucmVzcG9uZGluZz09InBhc3NlZCIsIEZBTFNFLCBUUlVFKSkgJT4lIA0KICAgZmlsdGVyKGV4Y2x1ZGU9PUZBTFNFKQ0KDQp0YWIkYEludGVybmFsIGNvbnNpc3RlbmN5ICgmYWxwaGE7KWAgPC0gcm91bmQoYyhwc3ljaDo6YWxwaGEoc3Vic2V0KHJhdywgc2VsZWN0PWMoImJoaV82IiwgImJoaV8xMiIsICJiaGlfMTgiLCAiYmhpXzI0IikpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzPWMoImJoaV8xMiIsICJiaGlfMTgiLCAiYmhpXzI0IikpJHRvdGFsJHN0ZC5hbHBoYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeWNoOjphbHBoYShzdWJzZXQocmF3LCBzZWxlY3Q9YygiYmhpXzUiLCAiYmhpXzExIiwgImJoaV8xNyIsICJiaGlfMjMiKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXM9YygiYmhpXzExIiwgImJoaV8xNyIpKSR0b3RhbCRzdGQuYWxwaGEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3ljaDo6YWxwaGEoc3Vic2V0KHJhdywgc2VsZWN0PWMoImJoaV80IiwgImJoaV8xMCIsICJiaGlfMTYiLCAiYmhpXzIyIikpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzPWMoImJoaV80IiwgImJoaV8yMiIpKSR0b3RhbCRzdGQuYWxwaGEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3ljaDo6YWxwaGEoc3Vic2V0KHJhdywgc2VsZWN0PWMoImJoaV8zIiwgImJoaV85IiwgImJoaV8xNSIsICJiaGlfMjEiKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXM9YygiYmhpXzMiLCAiYmhpXzkiKSkkdG90YWwkc3RkLmFscGhhLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Y2g6OmFscGhhKHN1YnNldChyYXcsIHNlbGVjdD1jKCJiaGlfMiIsICJiaGlfOCIsICJiaGlfMTQiLCAiYmhpXzIwIikpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzPWMoImJoaV84IiwgImJoaV8yMCIpKSR0b3RhbCRzdGQuYWxwaGEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3ljaDo6YWxwaGEoc3Vic2V0KHJhdywgc2VsZWN0PWMoImJoaV8xIiwgImJoaV83IiwgImJoaV8xMyIsICJiaGlfMTkiKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXM9YygiYmhpXzciKSkkdG90YWwkc3RkLmFscGhhLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Y2g6OmFscGhhKHN1YnNldChyYXcsIHNlbGVjdD1jKCJoZXhhY28uc3RhdGVfMSIsICJoZXhhY28uc3RhdGVfMiIsICJoZXhhY28uc3RhdGVfMyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZXhhY28uc3RhdGVfNCIpKSkkdG90YWwkc3RkLmFscGhhLCBOQSwgTkEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Y2g6OmFscGhhKHN1YnNldChyYXcsIHNlbGVjdD1jKCJoZXhhY28uc3RhdGVfNyIsICJoZXhhY28uc3RhdGVfOCIsICJoZXhhY28uc3RhdGVfOSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZXhhY28uc3RhdGVfMTAiKSkpJHRvdGFsJHN0ZC5hbHBoYSxOQSxOQSxOQSxOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BLE5BLHBzeWNoOjphbHBoYShzdWJzZXQocmF3LCBzZWxlY3Q9Yygic2l0XzciLCAic2l0XzgiLCAic2l0XzkiKSkpJHRvdGFsJHN0ZC5hbHBoYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BLCBOQSwgTkEscHN5Y2g6OmFscGhhKHN1YnNldChyYXcsIHNlbGVjdD1jKCJzaXRfMTAiLCAic2l0XzExIiwgInNpdF8xMiIpKSkkdG90YWwkc3RkLmFscGhhLE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHN5Y2g6OmFscGhhKHN1YnNldChyYXcsIHNlbGVjdD1jKCJtZGJmXzEiLCAibWRiZl80IiwgIm1kYmZfOCIsICJtZGJmXzExIikpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzPWMoIm1kYmZfNCIsICJtZGJmXzExIikpJHRvdGFsJHN0ZC5hbHBoYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeWNoOjphbHBoYShzdWJzZXQocmF3LCBzZWxlY3Q9YygibWRiZl8yIiwgIm1kYmZfNSIsICJtZGJmXzciLCAibWRiZl8xMCIpKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cz1jKCJtZGJmXzUiLCAibWRiZl83IikpJHRvdGFsJHN0ZC5hbHBoYSksMikNCg0KDQojIyBwcmludCB0YWJsZQ0Ka2FibGUodGFiDQogICAgICAsIGNhcHRpb249IkRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIHJlbGV2YW50IHZhcmlhYmxlcy4iDQogICAgICAsIGVzY2FwZT1GQUxTRQ0KKSAlPiUNCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gVCkgJT4lIA0KICAgcGFja19yb3dzKCJQZXJzb25hbGl0eSBUcmFpdHMiLCAxLCA2KSAlPiUNCiAgIHBhY2tfcm93cygiUGVyc29uYWxpdHkgU3RhdGVzIiwgNywgMTIpICU+JQ0KICAgcGFja19yb3dzKCJDb25jcmV0ZSBCZWhhdmlvcnMiLCAxMywgMTQpICU+JQ0KICAgcGFja19yb3dzKCJTaXR1YXRpb24gQ2hhcmFjdGVyaXN0aWNzIiwgMTUsIDIyKSAlPiUNCiAgIHBhY2tfcm93cygiT3V0Y29tZXMiLCAyMywgMjQpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9IlRpcmVkbmVzcyB3YXMgcmV2ZXJzZS1jb2RlZCBzdWNoIHRoYXQgaGlnaGVyIHZhbHVlcyBpbmRpY2F0ZSBsZXNzIHRpcmVkbmVzcyBvciBhIG1vcmUgYWN0aXZlIG1vb2QuIEludGVybmFsIGNvbnNpc3RlbmNpZXMgYXJlIHJlcG9ydGVkIGZvciBhbGwgbWVhc3VyZWQgdGhhdCBpbmNsdWRlZCBtb3JlIHRoYW4gb25lIGl0ZW0uIikNCg0KYGBgDQoNCiMjIEludGVyY29ycmVsYXRpb25zIHstfQ0KDQpgYGB7ciBjb3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPUZBTFNFfQ0KDQpyZWwgPC0gZGF0YSAlPiUgDQogICB1bmdyb3VwKCkgJT4lIA0KICAgc2VsZWN0KCMgVHJhaXRzDQogICAgICAidHJhaXQuaCIsICJ0cmFpdC5lIiwgInRyYWl0LngiLCAidHJhaXQuYSIsICJ0cmFpdC5jIiwgInRyYWl0Lm8iLA0KICAgICAgIyBCZWhhdmlvcnMNCiAgICAgICJzdGF0ZS5oIiwgInN0YXRlLmUiLCAic3RhdGUueCIsICJzdGF0ZS5hIiwgInN0YXRlLmMiLCAic3RhdGUubyIsICJuQ29vcCIsICJuSG9uIiwNCiAgICAgICMgU2l0dWF0aW9uDQogICAgICAiZHV0IiwgImludCIsICJhZHYiLCAibWF0IiwgInBvcyIsICJuZWciLCAiZGVjIiwgInNvYyIsDQogICAgICAjIE91dGNvbWVzDQogICAgICAibW9vZC5nYiIsICJtb29kLmF0IikNCg0KeCA8LSBjb3J4Ojpjb3J4KHJlbCwNCiAgICAgICAgICAgICAgICB0cmlhbmdsZSA9ICJsb3dlciIsDQogICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDUpKQ0KDQpyb3cubmFtZXMoeCRhcGEpIDwtIGMoIyBUcmFpdHMNCiAgICIxIFRyYWl0IEhvbmVzdHktSHVtaWxpdHkiLCAiMiBUcmFpdCBFbW90aW9uYWxpdHkiLCAiMyBUcmFpdCBFeHRyYXZlcnNpb24iLCAiNCBUcmFpdCBBZ3JlZWFibGVuZXNzIiwgIjUgVHJhaXQgQ29uc2NpZW50aW91c25lc3MiLCAiNiBUcmFpdCBPcGVubmVzcyIsDQogICAjIEJlaGF2aW9ycw0KICAgIjcgU3RhdGUgSG9uZXN0eS1IdW1pbGl0eSIsICI4IFN0YXRlIEVtb3Rpb25hbGl0eSIsICI5IFN0YXRlIEV4dHJhdmVyc2lvbiIsICIxMCBTdGF0ZSBBZ3JlZWFibGVuZXNzIiwgIjExIFN0YXRlIENvbnNjaWVudGlvdXNuZXNzIiwgIjEyIFN0YXRlIE9wZW5uZXNzIiwgIjEzIFNoYXJpbmcgQmVoYXZpb3JzIiwgIjE0IEhvbmVzdCBCZWhhdmlvcnMiLA0KICAgIyBTaXR1YXRpb24NCiAgICIxNSBEdXR5IiwgIjE2IEludGVsbGVjdCIsICIxNyBBZHZlcnNpdHkiLCAiMTggTWF0aW5nIiwgIjE5IHBPc2l0aXZpdHkiLCAiMjAgTmVnYXRpdml0eSIsICIyMSBEZWNlcHRpb24iLCAiMjIgU29jaWFsaXR5IiwNCiAgICMgT3V0Y29tZXMNCiAgICIyMyBQb3NpdGl2ZSBBZmZlY3QiLCAiMjQgVGlyZWRuZXNzKHIpIikNCg0KeCRhcGFbd2hpY2goeCRhcGE9PScgLSAnLCBhcnIuaW5kPVQpXSA8LSAiLS0iDQoNCg0Ka2FibGUoeCRhcGENCiAgICAgICwgY2FwdGlvbj0iSW50ZXJjb3JyZWxhdGlvbnMgb2YgdGhlIHJlbGV2YW50IHZhcmlhYmxlcy4iDQogICAgICAsIGVzY2FwZT1GQUxTRQ0KKSAlPiUNCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMSksIHdpZHRoID0gIjE2ZW0iKQ0KYGBgDQoNCiMjIEhpc3RvZ3JhbXMgey19DQoNCmBgYHtyLCBmaWcuYXNwPTEuMywgZmlnLndpZHRoPTExLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZmlnLmNhcD0iSGlzdG9ncmFtcyBvZiB0aGUgZGlzdHJpYnV0aW9ucyBvZiBwZXJzb25hbGl0eSB0cmFpdHMsIHBlcnNvbmFsaXR5IHN0YXRlcywgYW5kIHNpdHVhdGlvbiBjaGFyYWN0ZXJpc3RpY3MgaW4gdGhlIHNhbXBsZS4ifQ0KDQp0aCA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD10cmFpdC5oKSkgKyBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuYmVoWzFdLCBiaW53aWR0aD0xKSAgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAuNSw1LjUpLCBicmVha3M9YygxOjUpLCBsYWJlbHM9YygxOjUpKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBnZ3RpdGxlKCJUcmFpdCBILUgiKSArIHhsYWIoIiIpICsgdGhlbWVfcHViKCkNCg0KdGUgPC0gZ2dwbG90KGRhdGE9ZGF0YSwgYWVzKHg9dHJhaXQuZSkpICsgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLmJlaFsxXSwgYmlud2lkdGg9MSkgKyANCiAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygwLjUsNS41KSwgYnJlYWtzPWMoMTo1KSwgbGFiZWxzPWMoMTo1KSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwLjAxKSkgKw0KICAgZ2d0aXRsZSgiVHJhaXQgRSIpICsgeGxhYigiIikgKyB0aGVtZV9wdWIoKQ0KDQp0eCA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD10cmFpdC54KSkgKyBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuYmVoWzFdLCBiaW53aWR0aD0xKSArIA0KICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAuNSw1LjUpLCBicmVha3M9YygxOjUpLCBsYWJlbHM9YygxOjUpKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBnZ3RpdGxlKCJUcmFpdCBYIikgKyB4bGFiKCIiKSArIHRoZW1lX3B1YigpDQoNCnRhIDwtIGdncGxvdChkYXRhPWRhdGEsIGFlcyh4PXRyYWl0LmEpKSArIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5iZWhbMV0sIGJpbndpZHRoPTEpICsgDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMC41LDUuNSksIGJyZWFrcz1jKDE6NSksIGxhYmVscz1jKDE6NSkpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMC4wMSkpICsNCiAgIGdndGl0bGUoIlRyYWl0IEEiKSArIHhsYWIoIiIpICsgdGhlbWVfcHViKCkNCg0KdGMgPC0gZ2dwbG90KGRhdGE9ZGF0YSwgYWVzKHg9dHJhaXQuYykpICsgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLmJlaFsxXSwgYmlud2lkdGg9MSkgKyANCiAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygwLjUsNS41KSwgYnJlYWtzPWMoMTo1KSwgbGFiZWxzPWMoMTo1KSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwLjAxKSkgKw0KICAgZ2d0aXRsZSgiVHJhaXQgQyIpICsgeGxhYigiIikgKyB0aGVtZV9wdWIoKQ0KDQp0byA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD10cmFpdC5vKSkgKyBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuYmVoWzFdLCBiaW53aWR0aD0xKSArIA0KICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAuNSw1LjUpLCBicmVha3M9YygxOjUpLCBsYWJlbHM9YygxOjUpKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBnZ3RpdGxlKCJUcmFpdCBPIikgKyB4bGFiKCIiKSArIHRoZW1lX3B1YigpDQoNCnNoIDwtIGdncGxvdChkYXRhPWRhdGEsIGFlcyh4PXN0YXRlLmgpKSArIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5iZWhbMl0sIGJpbndpZHRoPTEpICsgDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMC41LDcuNSksIGJyZWFrcz1jKDE6NyksIGxhYmVscz1jKDE6NykpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMC4wMSkpICsNCiAgIGdndGl0bGUoIlN0YXRlIEgtSCIpICsgeGxhYigiIikgKyB0aGVtZV9wdWIoKQ0KDQpzZSA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD1zdGF0ZS5lKSkgKyBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuYmVoWzJdLCBiaW53aWR0aD0xKSArIA0KICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAuNSw3LjUpLCBicmVha3M9YygxOjcpLCBsYWJlbHM9YygxOjcpKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBnZ3RpdGxlKCJTdGF0ZSBFIikgKyB4bGFiKCIiKSArIHRoZW1lX3B1YigpDQoNCnN4IDwtIGdncGxvdChkYXRhPWRhdGEsIGFlcyh4PXN0YXRlLngpKSArIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5iZWhbMl0sIGJpbndpZHRoPTEpICsgDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMC41LDcuNSksIGJyZWFrcz1jKDE6NyksIGxhYmVscz1jKDE6NykpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMC4wMSkpICsNCiAgIGdndGl0bGUoIlN0YXRlIFgiKSArIHhsYWIoIiIpICsgdGhlbWVfcHViKCkNCg0Kc2EgPC0gZ2dwbG90KGRhdGE9ZGF0YSwgYWVzKHg9c3RhdGUuYSkpICsgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLmJlaFsyXSwgYmlud2lkdGg9MSkgKyANCiAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygwLjUsNy41KSwgYnJlYWtzPWMoMTo3KSwgbGFiZWxzPWMoMTo3KSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwLjAxKSkgKw0KICAgZ2d0aXRsZSgiU3RhdGUgQSIpICsgeGxhYigiIikgKyB0aGVtZV9wdWIoKQ0KDQpzYyA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD1zdGF0ZS5jKSkgKyBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuYmVoWzJdLCBiaW53aWR0aD0xKSArIA0KICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAuNSw3LjUpLCBicmVha3M9YygxOjcpLCBsYWJlbHM9YygxOjcpKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBnZ3RpdGxlKCJTdGF0ZSBDIikgKyB4bGFiKCIiKSArIHRoZW1lX3B1YigpDQoNCnNvIDwtIGdncGxvdChkYXRhPWRhdGEsIGFlcyh4PXN0YXRlLm8pKSArIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5iZWhbMl0sIGJpbndpZHRoPTEpICsgDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMC41LDcuNSksIGJyZWFrcz1jKDE6NyksIGxhYmVscz1jKDE6NykpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMC4wMSkpICsNCiAgIGdndGl0bGUoIlN0YXRlIE8iKSArIHhsYWIoIiIpICsgdGhlbWVfcHViKCkNCg0KZCA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD1kdXQpKSArIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5zaXRbMV0sIGJpbndpZHRoPTEpICsgDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMC41LDcuNSksIGJyZWFrcz1jKDE6NyksIGxhYmVscz1jKDE6NykpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMC4wMSkpICsNCiAgIGdndGl0bGUoIkR1dHkiKSArIHhsYWIoIiIpICsgdGhlbWVfcHViKCkNCg0KaSA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD1pbnQpKSArIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5zaXRbMV0sIGJpbndpZHRoPTEpICsgDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMC41LDcuNSksIGJyZWFrcz1jKDE6NyksIGxhYmVscz1jKDE6NykpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMC4wMSkpICsNCiAgIGdndGl0bGUoIkludGVsbGVjdCIpICsgeGxhYigiIikgKyB0aGVtZV9wdWIoKQ0KDQphIDwtIGdncGxvdChkYXRhPWRhdGEsIGFlcyh4PWFkdikpICsgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLnNpdFsxXSwgYmlud2lkdGg9MSkgKyANCiAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygwLjUsNy41KSwgYnJlYWtzPWMoMTo3KSwgbGFiZWxzPWMoMTo3KSkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwLjAxKSkgKw0KICAgZ2d0aXRsZSgiQWR2ZXJzaXR5IikgKyB4bGFiKCIiKSArIHRoZW1lX3B1YigpDQoNCm0gPC0gZ2dwbG90KGRhdGE9ZGF0YSwgYWVzKHg9bWF0KSkgKyBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSArIA0KICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAuNSw3LjUpLCBicmVha3M9YygxOjcpLCBsYWJlbHM9YygxOjcpKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBnZ3RpdGxlKCJNYXRpbmciKSArIHhsYWIoIiIpICsgdGhlbWVfcHViKCkNCg0KbyA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD1wb3MpKSArIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5zaXRbMV0sIGJpbndpZHRoPTEpICsgDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMC41LDcuNSksIGJyZWFrcz1jKDE6NyksIGxhYmVscz1jKDE6NykpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMC4wMSkpICsNCiAgIGdndGl0bGUoInBPc2l0aXZpdHkiKSArIHhsYWIoIiIpICsgdGhlbWVfcHViKCkNCg0KbiA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD1uZWcpKSArIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5zaXRbMV0sIGJpbndpZHRoPTEpICsgDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMC41LDcuNSksIGJyZWFrcz1jKDE6NyksIGxhYmVscz1jKDE6NykpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMC4wMSkpICsNCiAgIGdndGl0bGUoIk5lZ2F0aXZpdHkiKSArIHhsYWIoIiIpICsgdGhlbWVfcHViKCkNCg0KZGUgPC0gZ2dwbG90KGRhdGE9ZGF0YSwgYWVzKHg9ZGVjKSkgKyBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSArIA0KICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAuNSw3LjUpLCBicmVha3M9YygxOjcpLCBsYWJlbHM9YygxOjcpKSArIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBnZ3RpdGxlKCJEZWNlcHRpb24iKSArIHhsYWIoIiIpICsgdGhlbWVfcHViKCkNCg0KcyA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD1zb2MpKSArIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5zaXRbMV0sIGJpbndpZHRoPTEpICsgDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMC41LDcuNSksIGJyZWFrcz1jKDE6NyksIGxhYmVscz1jKDE6NykpICsgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMC4wMSkpICsNCiAgIGdndGl0bGUoIlNvY2lhbGl0eSIpICsgeGxhYigiIikgKyB0aGVtZV9wdWIoKQ0KDQoNCiMgKHRoIHwgdGUgfCB0eCB8IHRhIHwgdGMgfCB0bykgLw0KIyAgICAoc2ggfCBzZSB8IHN4IHwgc2EgfCBzYyB8IHNvKSAvDQojICAgIChkIHwgaSB8IGEgfCBtKSAvDQojICAgIChvIHwgbiB8IGRlIHwgcykNCg0KDQp0cmFpdHMgPC0gY293cGxvdDo6cGxvdF9ncmlkKHRoLCB0ZSwgdHgsIHRhLCB0YywgdG8sIG5jb2w9NCkNCnN0YXRlcyA8LSBjb3dwbG90OjpwbG90X2dyaWQoc2gsIHNlLCBzeCwgc2EsIHNjLCBzbywgbmNvbD00KQ0Kc2l0cyA8LSBjb3dwbG90OjpwbG90X2dyaWQoZCwgaSwgYSwgbSwgbywgbiwgZGUsIHMsIG5jb2w9NCkNCg0KY293cGxvdDo6cGxvdF9ncmlkKHRyYWl0cywgTlVMTCwgc3RhdGVzLCBOVUxMLCBzaXRzLCBuY29sPTEsIHJlbF9oZWlnaHRzID0gYygxLCAwLjA1LCAxLCAwLjA1LCAxKSkNCg0KYGBgDQoNCiMgTWFuaXB1bGF0aW9uIENoZWNrIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KIyMgU2hhcmUgRGVjaXNpb25zIHstfQ0KDQojIyMgSHlwb3RoZXNpcyB7LX0NCg0KVGhlIGJlaGF2aW9yIG1hbmlwdWxhdGlvbiBpcyByZWxhdGVkIHRvIHBhcnRpY2lwYW50cycgYWN0dWFsIGJlaGF2aW9yIChpLmUuLCBudW1iZXIgb2Ygc2hhcmUgZGVjaXNpb25zIGFuZC9vciBudW1iZXIgb2YgaG9uZXN0IHRyaWFscykgc3VjaCB0aGF0IHBhcnRpY2lwYW50cyBpbiB0aGUgJ2FjdCBob25lc3RseSBhbmQgYWdyZWVhYmx5JyBjb25kaXRpb24gbWFrZSBtb3JlIHNoYXJlIGRlY2lzaW9ucyBhbmQvb3IgaGF2ZSBtb3JlIGhvbmVzdCB0cmlhbHMgdGhhbiBwYXJ0aWNpcGFudHMgaW4gdGhlICdhY3QgZGlzaG9uZXN0bHkgYW5kIGRpc2FncmVlYWJseScgY29uZGl0aW9uLiANCg0KIyMjIERlc2NyaXB0aXZlcyB7LX0NCg0KYGBge3IgaDFhLWRlc2NyaXB0aXZlcy0xLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0Ka2FibGUoZGVzY3JpYmVCeShkYXRhJG5Db29wLCBncm91cD1saXN0KGRhdGEkY29uZGl0aW9uLmJlaCwgZGF0YSRjb25kaXRpb24uc2l0KSwgbWF0PVRSVUUsIGRpZ2l0cz0yKVssMjoxNV0sDQogICAgICBjb2wubmFtZXMgPSBjKCJiZWhhdmlvciBjb25kaXRpb24iLCAic2l0dWF0aW9uIGNvbmRpdGlvbiIsICJ2YXJzIiwgIm4iLCAibWVhbiIsICJzZCIsICJtZWRpYW4iLCANCiAgICAgICAgICAgICAgICAgICAgInRyaW1tZWQiLCAibWFkIiwgIm1pbiIsICJtYXgiLCAicmFuZ2UiLCAic2tldyIsICJrdXJ0b3NpcyIpLA0KICAgICAgcm93Lm5hbWVzID0gRkFMU0UsDQogICAgICBjYXB0aW9uPSJEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIG9mIHRoZSBudW1iZXIgb2Ygc2hhcmUgZGVjaXNpb25zIGluIHRoZSBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGdyb3Vwcy4iKSAlPiUgIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSANCg0KYGBgDQoNCiMjIyBBTk9WQSB7LX0NCg0KDQpgYGB7ciBoMWEtYW5vdmFzLTEsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KDQphb3YgPC0gYW92X2NhcihuQ29vcCB+IGNvbmRpdGlvbi5iZWggKiBjb25kaXRpb24uc2l0ICsgRXJyb3IoUmVzcG9uc2VJZCksIGRhdGE9ZGF0YSkNCnRhYiA8LSBhcy5kYXRhLmZyYW1lKG5pY2UoYW92LCBlcz0icGVzIiwgc2lnX3N5bWJvbHMgPSByZXAoIiIsIDQpLCBNU0U9RkFMU0UpKQ0KDQp0YWIkcC52YWx1ZVt0YWIkcC52YWx1ZT09IjwuMDAxIl0gPC0gIiZsdDsuMDAxIg0KdGFiJEVmZmVjdCA8LSBjKCJCZWhhdmlvciBjb25kaXRpb25zIiwgIlNpdHVhdGlvbiBjb25kaXRpb25zIiwgIkJlaGF2aW9yIHggU2l0dWF0aW9uIGNvbmRpdGlvbnMiKQ0KDQprYWJsZSh0YWIsDQogICAgICBlc2NhcGU9RiwNCiAgICAgIGNvbC5uYW1lcz1jKCJFZmZlY3QiLCAiZGYiLCAiRiIsICImIzk1MTs8c3ViPnA8L3N1Yj48c3VwPjI8L3N1cD4iLCAiPGk+cDwvaT4gdmFsdWUiKSwNCiAgICAgIGNhcHRpb249IkFuYWx5c2lzIG9mIHZhcmlhbmNlIGV4YW1pbmluZyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBleHBlcmltZW50YWwgY29uZGl0aW9ucyBhbmQgdGhlIG51bWJlciBvZiBzaGFyZSBkZWNpc2lvbnMuIikgJT4lICANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCANCiAgICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMSksIHdpZHRoID0gIjE1ZW0iKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDI6NCksIHdpZHRoID0gIjhlbSIpDQoNCmBgYA0KDQojIyMgVmlzdWFsaXphdGlvbiB7LX0NCg0KYGBge3IgaDFhLXBsb3QsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9MC41LCBmaWcuY2FwPSJBc3NvY2lhdGlvbnMgYmV0d2VlbiB0aGUgZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgYW5kIHRoZSBudW1iZXIgb2Ygc2hhcmUgZGVjaXNpb25zLiJ9DQoNCiMgcGxvdCBtZWFucyBhbmQgZGlzdHJpYnV0aW9ucw0KbCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHg9Y29uZGl0aW9uLnNpdCwgeT1uQ29vcCkpICsgDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIlNpdHVhdGlvbiBjb25kaXRpb25zIikgKyB5bGFiKCJOdW1iZXIgb2YgZGVjaXNpb25zIikgKyANCiAgIGdndGl0bGUoIk1lYW5zIGFuZCBkaXN0cmlidXRpb25zIikgKyB5bGltKGMoMCwxNSkpICsNCiAgIGdlb21fdmlvbGluKGFlcyh4ID0gY29uZGl0aW9uLnNpdCwgeSA9IG5Db29wKSwgd2lkdGg9MSwgZmlsbD0nI0VFRUVFRScsIGNvbG9yPSIjRUVFRUVFIiwgdHJpbT1GQUxTRSkgKw0KICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAiY3Jvc3NiYXIiLCB3aWR0aCA9IDAuNzUsIA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNzUpLCBjb2xvdXI9IiM4MDgwODAiKSArDQogICBnZW9tX2ppdHRlcihhZXMoY29sb3VyPWNvbmRpdGlvbi5iZWgpLCBzaGFwZSA9IDE2LCB3aWR0aCA9IC4xLCBhbHBoYT0uNSwgc2l6ZT0yLjUpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLmJlaCkgKw0KICAgZmFjZXRfd3JhcCh+Y29uZGl0aW9uLmJlaCkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsNCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iIiwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSxmYWNlPSJib2xkIikpIA0KDQoNCiMgcGxvdCBpbnRlcmFjdGlvbiBkaWFncmFtDQpyIDwtIGdncGxvdChkYXRhICU+JSANCiAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbmRpdGlvbi5zaXQsIGNvbmRpdGlvbi5iZWgpICU+JSANCiAgICAgICAgICAgICAgIHN1bW1hcmlzZShtID0gbWVhbihuQ29vcCwgbmEucm09VFJVRSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2QobkNvb3AsIG5hLnJtPVQpKSwgDQogICAgICAgICAgICBhZXMoeCA9IGNvbmRpdGlvbi5zaXQsIHkgPSBtLCBjb2xvciA9IGNvbmRpdGlvbi5iZWgpKSArDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIlNpdHVhdGlvbiBjb25kaXRpb25zIikgKyB5bGFiKCJOdW1iZXIgb2YgZGVjaXNpb25zIikgKyANCiAgIGdndGl0bGUoIk1haW4gZWZmZWN0cyBhbmQgaW50ZXJhY3Rpb25zIikgKyB5bGltKGMoMCwxNSkpICsNCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDAuMywwLjIpLCBsZWdlbmQuZGlyZWN0aW9uPSJ2ZXJ0aWNhbCIpICsgbGFicyhjb2xvciA9ICIiKSArIA0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5iZWgpICsNCiAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jb2xzLmJlaCkgKw0KICAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbmRpdGlvbi5iZWgpLCBzaXplPTEuNSkgKw0KICAgZ2VvbV9wb2ludChzaXplPTIuNSkgDQoNCg0KIyBjb21iaW5lIHBsb3RzDQoobCB8IHBsb3Rfc3BhY2VyKCkgfCByKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gIkEiKSArIHBsb3RfbGF5b3V0KHdpZHRoPWMoMSwwLjEsMSkpDQoNCmBgYA0KDQojIyBIb25lc3QgRGVjaXNpb25zIHstfQ0KDQojIyMgSHlwb3RoZXNpcyB7LX0NCg0KVGhlIGJlaGF2aW9yIG1hbmlwdWxhdGlvbiBpcyByZWxhdGVkIHRvIHBhcnRpY2lwYW50cycgYWN0dWFsIGJlaGF2aW9yIChpLmUuLCBudW1iZXIgb2Ygc2hhcmUgZGVjaXNpb25zIGFuZC9vciBudW1iZXIgb2YgaG9uZXN0IHRyaWFscykgc3VjaCB0aGF0IHBhcnRpY2lwYW50cyBpbiB0aGUgJ2FjdCBob25lc3RseSBhbmQgYWdyZWVhYmx5JyBjb25kaXRpb24gbWFrZSBtb3JlIHNoYXJlIGRlY2lzaW9ucyBhbmQvb3IgaGF2ZSBtb3JlIGhvbmVzdCB0cmlhbHMgdGhhbiBwYXJ0aWNpcGFudHMgaW4gdGhlICdhY3QgZGlzaG9uZXN0bHkgYW5kIGRpc2FncmVlYWJseScgY29uZGl0aW9uLiANCg0KIyMjIERlc2NyaXB0aXZlcyB7LX0NCg0KYGBge3IgaDFhLWRlc2NyaXB0aXZlcy0yLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0Ka2FibGUoZGVzY3JpYmVCeShkYXRhJG5Ib24sIGdyb3VwPWxpc3QoZGF0YSRjb25kaXRpb24uYmVoLCBkYXRhJGNvbmRpdGlvbi5zaXQpLCBtYXQ9VFJVRSwgZGlnaXRzPTIpWywyOjE1XSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoImJlaGF2aW9yIGNvbmRpdGlvbiIsICJzaXR1YXRpb24gY29uZGl0aW9uIiwgInZhcnMiLCAibiIsICJtZWFuIiwgInNkIiwgIm1lZGlhbiIsIA0KICAgICAgICAgICAgICAgICAgICAidHJpbW1lZCIsICJtYWQiLCAibWluIiwgIm1heCIsICJyYW5nZSIsICJza2V3IiwgImt1cnRvc2lzIiksDQogICAgICByb3cubmFtZXMgPSBGQUxTRSwNCiAgICAgIGNhcHRpb249IkRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIG51bWJlciBvZiBob25lc3QgZGVjaXNpb25zIGluIHRoZSBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGdyb3Vwcy4iKSAlPiUgIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSANCg0KYGBgDQoNCiMjIyBBTk9WQSB7LX0NCg0KYGBge3IgaDFhLWFub3Zhcy0yLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KaG9uLmFvdiA8LSBhb3ZfY2FyKG5Ib24gfiBjb25kaXRpb24uYmVoICogY29uZGl0aW9uLnNpdCArIEVycm9yKFJlc3BvbnNlSWQpLCBkYXRhPWRhdGEpDQp0YWIgPC0gYXMuZGF0YS5mcmFtZShuaWNlKGFvdiwgZXM9InBlcyIsIHNpZ19zeW1ib2xzID0gcmVwKCIiLCA0KSwgTVNFPUZBTFNFKSkNCg0KdGFiJHAudmFsdWVbdGFiJHAudmFsdWU9PSI8LjAwMSJdIDwtICImbHQ7LjAwMSINCnRhYiRFZmZlY3QgPC0gYygiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJTaXR1YXRpb24gY29uZGl0aW9ucyIsICJCZWhhdmlvciB4IFNpdHVhdGlvbiBjb25kaXRpb25zIikNCg0Ka2FibGUodGFiLA0KICAgICAgZXNjYXBlPUYsDQogICAgICBjb2wubmFtZXM9YygiRWZmZWN0IiwgImRmIiwgIkYiLCAiJiM5NTE7PHN1Yj5wPC9zdWI+PHN1cD4yPC9zdXA+IiwgIjxpPnA8L2k+IHZhbHVlIiksDQogICAgICBjYXB0aW9uPSJBbmFseXNpcyBvZiB2YXJpYW5jZSBleGFtaW5pbmcgYXNzb2NpYXRpb25zIGJldHdlZW4gZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgYW5kIHRoZSBudW1iZXIgb2YgaG9uZXN0IGRlY2lzaW9ucy4iKSAlPiUgIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIA0KICAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsIGZpeGVkX3RoZWFkID0gVCkgJT4lIA0KICAgY29sdW1uX3NwZWMoYygxKSwgd2lkdGggPSAiMTVlbSIpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMjo0KSwgd2lkdGggPSAiOGVtIikNCg0KYGBgDQoNCiMjIyBWaXN1YWxpemF0aW9uIHstfQ0KDQpgYGB7ciBoMWEtcGxvdC0yLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZmlnLndpZHRoPTExLCBmaWcuYXNwPTAuNSwgZmlnLmNhcD0iQXNzb2NpYXRpb25zIGJldHdlZW4gdGhlIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIGFuZCB0aGUgbnVtYmVyIG9mIGhvbmVzdCBkZWNpc2lvbnMuIn0NCg0KIyBwbG90IG1lYW5zIGFuZCBkaXN0cmlidXRpb25zDQpsIDwtIGdncGxvdChkYXRhLCBhZXMoeD1jb25kaXRpb24uc2l0LCB5PW5Ib24pKSArIA0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJTaXR1YXRpb24gY29uZGl0aW9ucyIpICsgeWxhYigiTnVtYmVyIG9mIGRlY2lzaW9ucyIpICsgDQogICBnZ3RpdGxlKCJNZWFucyBhbmQgZGlzdHJpYnV0aW9ucyIpICsgeWxpbShjKDAsMTUpKSArDQogICBnZW9tX3Zpb2xpbihhZXMoeCA9IGNvbmRpdGlvbi5zaXQsIHkgPSBuSG9uKSwgd2lkdGg9MSwgZmlsbD0nI0VFRUVFRScsIGNvbG9yPSIjRUVFRUVFIiwgdHJpbT1GQUxTRSkgKw0KICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAiY3Jvc3NiYXIiLCB3aWR0aCA9IDAuNzUsIA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNzUpLCBjb2xvdXI9IiM4MDgwODAiKSArDQogICBnZW9tX2ppdHRlcihhZXMoY29sb3VyPWNvbmRpdGlvbi5iZWgpLCBzaGFwZSA9IDE2LCB3aWR0aCA9IC4xLCBhbHBoYT0uNSwgc2l6ZT0yLjUpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLmJlaCkgKw0KICAgZmFjZXRfd3JhcCh+Y29uZGl0aW9uLmJlaCkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsNCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iIiwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSxmYWNlPSJib2xkIikpIA0KDQoNCiMgcGxvdCBpbnRlcmFjdGlvbiBkaWFncmFtDQpyIDwtIGdncGxvdChkYXRhICU+JSANCiAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbmRpdGlvbi5zaXQsIGNvbmRpdGlvbi5iZWgpICU+JSANCiAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKG5Ib24sIG5hLnJtPVRSVUUpKSwgDQogICAgICAgICAgICBhZXMoeCA9IGNvbmRpdGlvbi5zaXQsIHkgPSBncm91cHMsIGNvbG9yID0gY29uZGl0aW9uLmJlaCkpICsNCiAgIHRoZW1lX3B1YigpICsgeGxhYigiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKSArIHlsYWIoIk51bWJlciBvZiBkZWNpc2lvbnMiKSArIA0KICAgZ2d0aXRsZSgiTWFpbiBlZmZlY3RzIGFuZCBpbnRlcmFjdGlvbnMiKSArIHlsaW0oYygwLDE1KSkgKw0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPWMoMC4zLDAuMiksIGxlZ2VuZC5kaXJlY3Rpb249InZlcnRpY2FsIikgKyBsYWJzKGNvbG9yID0gIiIpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLmJlaCkgKw0KICAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbmRpdGlvbi5iZWgpLCBzaXplPTEuNSkgKw0KICAgZ2VvbV9wb2ludChzaXplPTIuNSkgDQoNCg0KIyBjb21iaW5lIHBsb3RzDQoobCB8IHBsb3Rfc3BhY2VyKCkgfCByKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gIkEiKSArIHBsb3RfbGF5b3V0KHdpZHRoPWMoMSwwLjEsMSkpDQoNCmBgYA0KDQojIyBTdGF0ZSBBZ3JlZWFibGVuZXNzIHstfQ0KDQojIyMgSHlwb3RoZXNpcyB7LX0NCg0KVGhlIGJlaGF2aW9yIG1hbmlwdWxhdGlvbiBpcyBhbHNvIHJlbGF0ZWQgdG8gcGFydGljaXBhbnRzJyBzZWxmLXJlcG9ydGVkIGJlaGF2aW9yIChpLmUuLCBzdGF0ZSBBZ3JlZWFibGVuZXNzIGFuZC9vciBzdGF0ZSBIb25lc3R5LUh1bWlsaXR5KSBzdWNoIHRoYXQgcGFydGljaXBhbnRzIGluIHRoZSAnYWN0IGhvbmVzdGx5IGFuZCBhZ3JlZWFibHknIGNvbmRpdGlvbiByZXBvcnQgaGlnaGVyIGxldmVscyBvZiBzdGF0ZSBBZ3JlZWFibGVuZXNzIGFuZC9vciBzdGF0ZSBIb25lc3R5LUh1bWlsaXR5IHRoYW4gcGFydGljaXBhbnRzIGluIHRoZSAnYWN0IGRpc2hvbmVzdGx5IGFuZCBkaXNhZ3JlZWFibHknIGNvbmRpdGlvbi4NCg0KIyMjIERlc2NyaXB0aXZlcyB7LX0NCg0KYGBge3IgaDFiLWRlc2NyaXB0aXZlcy0xLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0Ka2FibGUoZGVzY3JpYmVCeShkYXRhJHN0YXRlLmEsIGdyb3VwPWxpc3QoZGF0YSRjb25kaXRpb24uYmVoLCBkYXRhJGNvbmRpdGlvbi5zaXQpLCBtYXQ9VFJVRSwgZGlnaXRzPTIpWywyOjE1XSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoImJlaGF2aW9yIGNvbmRpdGlvbiIsICJzaXR1YXRpb24gY29uZGl0aW9uIiwgInZhcnMiLCAibiIsICJtZWFuIiwgInNkIiwgIm1lZGlhbiIsIA0KICAgICAgICAgICAgICAgICAgICAidHJpbW1lZCIsICJtYWQiLCAibWluIiwgIm1heCIsICJyYW5nZSIsICJza2V3IiwgImt1cnRvc2lzIiksDQogICAgICByb3cubmFtZXMgPSBGQUxTRSwNCiAgICAgIGNhcHRpb249IkRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2Ygc3RhdGUgYWdyZWVhYmxlbmVzcyBpbiB0aGUgZGlmZmVyZW50IGV4cGVyaW1lbnRhbCBncm91cHMuIikgJT4lICANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gVCkgDQoNCmBgYA0KDQojIyMgQU5PVkEgey19DQoNCmBgYHtyIGgxYi1hbm92YXMtMSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCmFvdiA8LSBhb3ZfY2FyKHN0YXRlLmEgfiBjb25kaXRpb24uYmVoICogY29uZGl0aW9uLnNpdCArIEVycm9yKFJlc3BvbnNlSWQpLCBkYXRhPWRhdGEpDQp0YWIgPC0gYXMuZGF0YS5mcmFtZShuaWNlKGFvdiwgZXM9InBlcyIsIHNpZ19zeW1ib2xzID0gcmVwKCIiLCA0KSwgTVNFPUZBTFNFKSkNCg0KdGFiJHAudmFsdWVbdGFiJHAudmFsdWU9PSI8LjAwMSJdIDwtICImbHQ7LjAwMSINCnRhYiRFZmZlY3QgPC0gYygiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJTaXR1YXRpb24gY29uZGl0aW9ucyIsICJCZWhhdmlvciB4IFNpdHVhdGlvbiBjb25kaXRpb25zIikNCg0Ka2FibGUodGFiLA0KICAgICAgZXNjYXBlPUYsDQogICAgICBjb2wubmFtZXM9YygiRWZmZWN0IiwgImRmIiwgIkYiLCAiJiM5NTE7PHN1Yj5wPC9zdWI+PHN1cD4yPC9zdXA+IiwgIjxpPnA8L2k+IHZhbHVlIiksDQogICAgICBjYXB0aW9uPSJBbmFseXNpcyBvZiB2YXJpYW5jZSBleGFtaW5pbmcgYXNzb2NpYXRpb25zIGJldHdlZW4gZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgYW5kIHN0YXRlIGFncmVlYWJsZW5lc3MuIikgJT4lICANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCANCiAgICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMSksIHdpZHRoID0gIjE1ZW0iKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDI6NCksIHdpZHRoID0gIjhlbSIpDQoNCmBgYA0KDQojIyMgVmlzdWFsaXphdGlvbiB7LX0NCg0KYGBge3IgaDFiLXBsb3QtMSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGZpZy53aWR0aD0xMSwgZmlnLmFzcD0wLjUsIGZpZy5jYXA9IkFzc29jaWF0aW9ucyBiZXR3ZWVuIHRoZSBleHBlcmltZW50YWwgY29uZGl0aW9ucyBhbmQgc3RhdGUgYWdyZWVhYmxlbmVzcy4ifQ0KDQojIHBsb3QgbWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMNCmwgPC0gZ2dwbG90KGRhdGEsIGFlcyh4PWNvbmRpdGlvbi5zaXQsIHk9c3RhdGUuYSkpICsgDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIlNpdHVhdGlvbiBjb25kaXRpb25zIikgKyB5bGFiKCJTdGF0ZSBhZ3JlZWFibGVuZXNzIHNjb3JlIikgKyANCiAgIGdndGl0bGUoIk1lYW5zIGFuZCBkaXN0cmlidXRpb25zIikgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygxLDcpLCBsYWJlbHM9YygxOjcpLCBicmVha3M9YygxOjcpKSArDQogICBnZW9tX3Zpb2xpbihhZXMoeCA9IGNvbmRpdGlvbi5zaXQsIHkgPSBzdGF0ZS5hKSwgd2lkdGg9MSwgZmlsbD0nI0VFRUVFRScsIGNvbG9yPSIjRUVFRUVFIiwgdHJpbT1GQUxTRSkgKw0KICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAiY3Jvc3NiYXIiLCB3aWR0aCA9IDAuNzUsIA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNzUpLCBjb2xvdXI9IiM4MDgwODAiKSArDQogICBnZW9tX2ppdHRlcihhZXMoY29sb3VyPWNvbmRpdGlvbi5iZWgpLCBzaGFwZSA9IDE2LCB3aWR0aCA9IC4xLCBhbHBoYT0uNSwgc2l6ZT0yLjUpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLmJlaCkgKw0KICAgZmFjZXRfd3JhcCh+Y29uZGl0aW9uLmJlaCkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsNCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iIiwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSxmYWNlPSJib2xkIikpIA0KDQoNCiMgcGxvdCBpbnRlcmFjdGlvbiBkaWFncmFtDQpyIDwtIGdncGxvdChkYXRhICU+JSANCiAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbmRpdGlvbi5zaXQsIGNvbmRpdGlvbi5iZWgpICU+JSANCiAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKHN0YXRlLmEsIG5hLnJtPVRSVUUpKSwgDQogICAgICAgICAgICBhZXMoeCA9IGNvbmRpdGlvbi5zaXQsIHkgPSBncm91cHMsIGNvbG9yID0gY29uZGl0aW9uLmJlaCkpICsNCiAgIHRoZW1lX3B1YigpICsgeGxhYigiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKSArIHlsYWIoIlN0YXRlIGFncmVlYWJsZW5lc3Mgc2NvcmUiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdndGl0bGUoIk1haW4gZWZmZWN0cyBhbmQgaW50ZXJhY3Rpb25zIikgKyANCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDAuMywwLjIpLCBsZWdlbmQuZGlyZWN0aW9uPSJ2ZXJ0aWNhbCIpICsgbGFicyhjb2xvciA9ICIiKSArIA0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5iZWgpICsNCiAgIGdlb21fbGluZShhZXMoZ3JvdXAgPSBjb25kaXRpb24uYmVoKSwgc2l6ZT0xLjUpICsNCiAgIGdlb21fcG9pbnQoc2l6ZT0yLjUpIA0KDQoNCiMgY29tYmluZSBwbG90cw0KKGwgfCBwbG90X3NwYWNlcigpIHwgcikgKyBwbG90X2Fubm90YXRpb24odGFnX2xldmVscyA9ICJBIikgKyBwbG90X2xheW91dCh3aWR0aD1jKDEsMC4xLDEpKQ0KDQpgYGANCg0KIyMgU3RhdGUgSG9uZXN0eS1IdW1pbGl0eSB7LX0NCg0KIyMjIEh5cG90aGVzaXMgey19DQoNClRoZSBiZWhhdmlvciBtYW5pcHVsYXRpb24gaXMgYWxzbyByZWxhdGVkIHRvIHBhcnRpY2lwYW50cycgc2VsZi1yZXBvcnRlZCBiZWhhdmlvciAoaS5lLiwgc3RhdGUgQWdyZWVhYmxlbmVzcyBhbmQvb3Igc3RhdGUgSG9uZXN0eS1IdW1pbGl0eSkgc3VjaCB0aGF0IHBhcnRpY2lwYW50cyBpbiB0aGUgJ2FjdCBob25lc3RseSBhbmQgYWdyZWVhYmx5JyBjb25kaXRpb24gcmVwb3J0IGhpZ2hlciBsZXZlbHMgb2Ygc3RhdGUgQWdyZWVhYmxlbmVzcyBhbmQvb3Igc3RhdGUgSG9uZXN0eS1IdW1pbGl0eSB0aGFuIHBhcnRpY2lwYW50cyBpbiB0aGUgJ2FjdCBkaXNob25lc3RseSBhbmQgZGlzYWdyZWVhYmx5JyBjb25kaXRpb24uDQoNCiMjIyBEZXNjcmlwdGl2ZXMgey19DQoNCmBgYHtyIGgxYi1kZXNjcmlwdGl2ZXMtMiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCmthYmxlKGRlc2NyaWJlQnkoZGF0YSRzdGF0ZS5oLCBncm91cD1saXN0KGRhdGEkY29uZGl0aW9uLmJlaCwgZGF0YSRjb25kaXRpb24uc2l0KSwgbWF0PVRSVUUsIGRpZ2l0cz0yKVssMjoxNV0sDQogICAgICByb3cubmFtZXMgPSBGQUxTRSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoImJlaGF2aW9yIGNvbmRpdGlvbiIsICJzaXR1YXRpb24gY29uZGl0aW9uIiwgInZhcnMiLCAibiIsICJtZWFuIiwgInNkIiwgIm1lZGlhbiIsIA0KICAgICAgICAgICAgICAgICAgICAidHJpbW1lZCIsICJtYWQiLCAibWluIiwgIm1heCIsICJyYW5nZSIsICJza2V3IiwgImt1cnRvc2lzIiksDQogICAgICBjYXB0aW9uPSJEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIG9mIHN0YXRlIGhvbmVzdHktaHVtaWxpdHkgaW4gdGhlIGRpZmZlcmVudCBleHBlcmltZW50YWwgZ3JvdXBzLiIpICU+JSAgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmaXhlZF90aGVhZCA9IFQpIA0KDQpgYGANCg0KIyMjIEFOT1ZBIHstfQ0KDQpgYGB7ciBoMWItYW5vdmFzLTIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KDQphb3YgPC0gYW92X2NhcihzdGF0ZS5oIH4gY29uZGl0aW9uLmJlaCAqIGNvbmRpdGlvbi5zaXQgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1kYXRhKQ0KdGFiIDwtIGFzLmRhdGEuZnJhbWUobmljZShhb3YsIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpDQoNCnRhYiRwLnZhbHVlW3RhYiRwLnZhbHVlPT0iPC4wMDEiXSA8LSAiJmx0Oy4wMDEiDQp0YWIkRWZmZWN0IDwtIGMoIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiLCAiQmVoYXZpb3IgeCBTaXR1YXRpb24gY29uZGl0aW9ucyIpDQoNCmthYmxlKHRhYiwNCiAgICAgIGVzY2FwZT1GLA0KICAgICAgY29sLm5hbWVzPWMoIkVmZmVjdCIsICJkZiIsICJGIiwgIiYjOTUxOzxzdWI+cDwvc3ViPjxzdXA+Mjwvc3VwPiIsICI8aT5wPC9pPiB2YWx1ZSIpLA0KICAgICAgY2FwdGlvbj0iQW5hbHlzaXMgb2YgdmFyaWFuY2UgZXhhbWluaW5nIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIGFuZCBzdGF0ZSBob25lc3R5LWh1bWlsaXR5LiIpICU+JSAgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgDQogICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwgZml4ZWRfdGhlYWQgPSBUKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDEpLCB3aWR0aCA9ICIxNWVtIikgJT4lIA0KICAgY29sdW1uX3NwZWMoYygyOjQpLCB3aWR0aCA9ICI4ZW0iKQ0KDQpgYGANCg0KIyMjIFZpc3VhbGl6YXRpb24gey19DQoNCmBgYHtyIGgxYi1wbG90LTIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9MC41LCBmaWcuY2FwPSJBc3NvY2lhdGlvbnMgYmV0d2VlbiB0aGUgZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgYW5kIHN0YXRlIGhvbmVzdHktaHVtaWxpdHkuIn0NCg0KIyBwbG90IG1lYW5zIGFuZCBkaXN0cmlidXRpb25zDQpsIDwtIGdncGxvdChkYXRhLCBhZXMoeD1jb25kaXRpb24uc2l0LCB5PXN0YXRlLmgpKSArIA0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJTaXR1YXRpb24gY29uZGl0aW9ucyIpICArIHlsYWIoIlN0YXRlIGhvbmVzdHktaHVtaWxpdHkgc2NvcmUiKSArIA0KICAgZ2d0aXRsZSgiTWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdlb21fdmlvbGluKGFlcyh4ID0gY29uZGl0aW9uLnNpdCwgeSA9IHN0YXRlLmgpLCB3aWR0aD0xLCBmaWxsPScjRUVFRUVFJywgY29sb3I9IiNFRUVFRUUiLCB0cmltPUZBTFNFKSArDQogICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJjcm9zc2JhciIsIHdpZHRoID0gMC43NSwgDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC43NSksIGNvbG91cj0iIzgwODA4MCIpICsNCiAgIGdlb21faml0dGVyKGFlcyhjb2xvdXI9Y29uZGl0aW9uLmJlaCksIHNoYXBlID0gMTYsIHdpZHRoID0gLjEsIGFscGhhPS41LCBzaXplPTIuNSkgKyANCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuYmVoKSArDQogICBmYWNldF93cmFwKH5jb25kaXRpb24uYmVoKSArIA0KICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTIwLCBoanVzdD0xLCB2anVzdD0xKSkgKw0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSIiLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT05LGZhY2U9ImJvbGQiKSkgDQoNCg0KIyBwbG90IGludGVyYWN0aW9uIGRpYWdyYW0NCnIgPC0gZ2dwbG90KGRhdGEgJT4lIA0KICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29uZGl0aW9uLnNpdCwgY29uZGl0aW9uLmJlaCkgJT4lIA0KICAgICAgICAgICAgICAgc3VtbWFyaXNlKGdyb3VwcyA9IG1lYW4oc3RhdGUuaCwgbmEucm09VFJVRSkpLCANCiAgICAgICAgICAgIGFlcyh4ID0gY29uZGl0aW9uLnNpdCwgeSA9IGdyb3VwcywgY29sb3IgPSBjb25kaXRpb24uYmVoKSkgKw0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJTaXR1YXRpb24gY29uZGl0aW9ucyIpICsgeWxhYigiU3RhdGUgaG9uZXN0eS1odW1pbGl0eSBzY29yZSIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2d0aXRsZSgiTWFpbiBlZmZlY3RzIGFuZCBpbnRlcmFjdGlvbnMiKSArIA0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPWMoMC4zLDAuMiksIGxlZ2VuZC5kaXJlY3Rpb249InZlcnRpY2FsIikgKyBsYWJzKGNvbG9yID0gIiIpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLmJlaCkgKw0KICAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbmRpdGlvbi5iZWgpLCBzaXplPTEuNSkgKw0KICAgZ2VvbV9wb2ludChzaXplPTIuNSkgDQoNCg0KIyBjb21iaW5lIHBsb3RzDQoobCB8IHBsb3Rfc3BhY2VyKCkgfCByKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gIkEiKSArIHBsb3RfbGF5b3V0KHdpZHRoPWMoMSwwLjEsMSkpDQoNCmBgYA0KDQojIyBBZHZlcnNpdHkgey19DQoNCiMjIyBIeXBvdGhlc2lzIHstfQ0KDQpUaGUgc2l0dWF0aW9uIG1hbmlwdWxhdGlvbiBpcyByZWxhdGVkIHRvIHBhcnRpY2lwYW50cycgc2VsZi1yZXBvcnRlZCBzaXR1YXRpb24gcGVyY2VwdGlvbnMgKGkuZS4sIERlY2VwdGlvbiBhbmQvb3IgQWR2ZXJzaXR5IG9mIHRoZSBzaXR1YXRpb24pIHN1Y2ggdGhhdCBwYXJ0aWNpcGFudHMgaW4gdGhlICd0cnVzdHdvcnRoeSBwYXJ0bmVyJyBjb25kaXRpb24gcmVwb3J0IGxvd2VyIGxldmVscyBvZiBwZXJjZWl2ZWQgRGVjZXB0aW9uIGFuZC9vciBBZHZlcnNpdHkgdGhhbiBwYXJ0aWNpcGFudHMgaW4gdGhlICd1bnRydXN0d29ydGh5IG9wcG9uZW50JyBjb25kaXRpb24uDQoNCiMjIyBEZXNjcmlwdGl2ZXMgey19DQoNCmBgYHtyIGgxYy1kZXNjcmlwdGl2ZXMtMSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCmthYmxlKGRlc2NyaWJlQnkoZGF0YSRhZHYsIGdyb3VwPWxpc3QoZGF0YSRjb25kaXRpb24uYmVoLCBkYXRhJGNvbmRpdGlvbi5zaXQpLCBtYXQ9VFJVRSwgZGlnaXRzPTIpWywyOjE1XSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoImJlaGF2aW9yIGNvbmRpdGlvbiIsICJzaXR1YXRpb24gY29uZGl0aW9uIiwgInZhcnMiLCAibiIsICJtZWFuIiwgInNkIiwgIm1lZGlhbiIsIA0KICAgICAgICAgICAgICAgICAgICAidHJpbW1lZCIsICJtYWQiLCAibWluIiwgIm1heCIsICJyYW5nZSIsICJza2V3IiwgImt1cnRvc2lzIiksDQogICAgICByb3cubmFtZXMgPSBGQUxTRSwNCiAgICAgIGNhcHRpb249IkRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgYWR2ZXJzaXR5IGluIHRoZSBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGdyb3Vwcy4iKSAlPiUgIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSANCg0KYGBgDQoNCiMjIyBBTk9WQSB7LX0NCg0KYGBge3IgaDFjLWFub3Zhcy0xLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KYW92IDwtIGFvdl9jYXIoYWR2IH4gY29uZGl0aW9uLmJlaCAqIGNvbmRpdGlvbi5zaXQgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1kYXRhKQ0KdGFiIDwtIGFzLmRhdGEuZnJhbWUobmljZShhb3YsIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpDQoNCnRhYiRwLnZhbHVlW3RhYiRwLnZhbHVlPT0iPC4wMDEiXSA8LSAiJmx0Oy4wMDEiDQp0YWIkRWZmZWN0IDwtIGMoIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiLCAiQmVoYXZpb3IgeCBTaXR1YXRpb24gY29uZGl0aW9ucyIpDQoNCmthYmxlKHRhYiwNCiAgICAgIGVzY2FwZT1GLA0KICAgICAgY29sLm5hbWVzPWMoIkVmZmVjdCIsICJkZiIsICJGIiwgIiYjOTUxOzxzdWI+cDwvc3ViPjxzdXA+Mjwvc3VwPiIsICI8aT5wPC9pPiB2YWx1ZSIpLA0KICAgICAgY2FwdGlvbj0iQW5hbHlzaXMgb2YgdmFyaWFuY2UgZXhhbWluaW5nIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIGFuZCBhZHZlcnNpdHkuIikgJT4lICANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCANCiAgICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjE1ZW0iKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDI6NCksIHdpZHRoID0gIjhlbSIpDQoNCmBgYA0KDQojIyMgVmlzdWFsaXphdGlvbiB7LX0NCg0KYGBge3IgaDFjLXBsb3QtMSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGZpZy53aWR0aD0xMSwgZmlnLmFzcD0wLjUsIGZpZy5jYXA9IkFzc29jaWF0aW9ucyBiZXR3ZWVuIHRoZSBleHBlcmltZW50YWwgY29uZGl0aW9ucyBhbmQgYWR2ZXJzaXR5LiJ9DQoNCiMgcGxvdCBtZWFucyBhbmQgZGlzdHJpYnV0aW9ucw0KbCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHg9Y29uZGl0aW9uLmJlaCwgeT1hZHYpKSArIA0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJCZWhhdmlvciBjb25kaXRpb25zIikgICsgeWxhYigiQWR2ZXJzaXR5IHNjb3JlIikgKyBnZ3RpdGxlKCJNZWFucyBhbmQgZGlzdHJpYnV0aW9ucyIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2VvbV92aW9saW4oYWVzKHggPSBjb25kaXRpb24uYmVoLCB5ID0gYWR2KSwgd2lkdGg9MSwgZmlsbD0nI0VFRUVFRScsIGNvbG9yPSIjRUVFRUVFIiwgdHJpbT1GQUxTRSkgKw0KICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAiY3Jvc3NiYXIiLCB3aWR0aCA9IDAuNzUsIA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNzUpLCBjb2xvdXI9IiM4MDgwODAiKSArDQogICBnZW9tX2ppdHRlcihhZXMoY29sb3VyPWNvbmRpdGlvbi5iZWgpLCBzaGFwZSA9IDE2LCB3aWR0aCA9IC4xLCBhbHBoYT0uNSwgc2l6ZT0yLjUpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLnNpdCkgKw0KICAgZmFjZXRfd3JhcCh+Y29uZGl0aW9uLnNpdCkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsNCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iIiwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSxmYWNlPSJib2xkIikpIA0KDQoNCiMgcGxvdCBpbnRlcmFjdGlvbiBkaWFncmFtDQpyIDwtIGdncGxvdChkYXRhICU+JSANCiAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbmRpdGlvbi5zaXQsIGNvbmRpdGlvbi5iZWgpICU+JSANCiAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKGFkdiwgbmEucm09VFJVRSkpLCANCiAgICAgICAgICAgIGFlcyh4ID0gY29uZGl0aW9uLmJlaCwgeSA9IGdyb3VwcywgY29sb3IgPSBjb25kaXRpb24uc2l0KSkgKw0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJCZWhhdmlvciBjb25kaXRpb25zIikgKyB5bGFiKCJBZHZlcnNpdHkgc2NvcmUiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdndGl0bGUoIk1haW4gZWZmZWN0cyBhbmQgaW50ZXJhY3Rpb25zIikgKyANCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDAuMjUsMC44NSksIGxlZ2VuZC5kaXJlY3Rpb249InZlcnRpY2FsIikgKyBsYWJzKGNvbG9yID0gIiIpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLnNpdCkgKw0KICAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbmRpdGlvbi5zaXQpLCBzaXplPTEuNSkgKw0KICAgZ2VvbV9wb2ludChzaXplPTIuNSkgDQoNCg0KIyBjb21iaW5lIHBsb3RzDQoobCB8IHBsb3Rfc3BhY2VyKCkgfCByKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gIkEiKSArIHBsb3RfbGF5b3V0KHdpZHRoPWMoMSwwLjEsMSkpDQoNCmBgYA0KDQojIyBEZWNlcHRpb24gey19DQoNCiMjIyBIeXBvdGhlc2lzIHstfQ0KDQpUaGUgc2l0dWF0aW9uIG1hbmlwdWxhdGlvbiBpcyByZWxhdGVkIHRvIHBhcnRpY2lwYW50cycgc2VsZi1yZXBvcnRlZCBzaXR1YXRpb24gcGVyY2VwdGlvbnMgKGkuZS4sIERlY2VwdGlvbiBhbmQvb3IgQWR2ZXJzaXR5IG9mIHRoZSBzaXR1YXRpb24pIHN1Y2ggdGhhdCBwYXJ0aWNpcGFudHMgaW4gdGhlICd0cnVzdHdvcnRoeSBwYXJ0bmVyJyBjb25kaXRpb24gcmVwb3J0IGxvd2VyIGxldmVscyBvZiBwZXJjZWl2ZWQgRGVjZXB0aW9uIGFuZC9vciBBZHZlcnNpdHkgdGhhbiBwYXJ0aWNpcGFudHMgaW4gdGhlICd1bnRydXN0d29ydGh5IG9wcG9uZW50JyBjb25kaXRpb24uDQoNCiMjIyBEZXNjcmlwdGl2ZXMgey19DQoNCmBgYHtyIGgxYy1kZXNjcmlwdGl2ZXMtMiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCmthYmxlKGRlc2NyaWJlQnkoZGF0YSRkZWMsIGdyb3VwPWxpc3QoZGF0YSRjb25kaXRpb24uYmVoLCBkYXRhJGNvbmRpdGlvbi5zaXQpLCBtYXQ9VFJVRSwgZGlnaXRzPTIpWywyOjE1XSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoImJlaGF2aW9yIGNvbmRpdGlvbiIsICJzaXR1YXRpb24gY29uZGl0aW9uIiwgInZhcnMiLCAibiIsICJtZWFuIiwgInNkIiwgIm1lZGlhbiIsIA0KICAgICAgICAgICAgICAgICAgICAidHJpbW1lZCIsICJtYWQiLCAibWluIiwgIm1heCIsICJyYW5nZSIsICJza2V3IiwgImt1cnRvc2lzIiksDQogICAgICByb3cubmFtZXMgPSBGQUxTRSwNCiAgICAgIGNhcHRpb249IkRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgZGVjZXB0aW9uIGluIHRoZSBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGdyb3Vwcy4iKSAlPiUgIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSANCg0KYGBgDQoNCiMjIyBBTk9WQSB7LX0NCg0KYGBge3IgaDFjLWFub3Zhcy0yLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KYW92IDwtIGFvdl9jYXIoZGVjIH4gY29uZGl0aW9uLmJlaCAqIGNvbmRpdGlvbi5zaXQgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1kYXRhKQ0KdGFiIDwtIGFzLmRhdGEuZnJhbWUobmljZShhb3YsIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpDQoNCnRhYiRwLnZhbHVlW3RhYiRwLnZhbHVlPT0iPC4wMDEiXSA8LSAiJmx0Oy4wMDEiDQp0YWIkRWZmZWN0IDwtIGMoIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiLCAiQmVoYXZpb3IgeCBTaXR1YXRpb24gY29uZGl0aW9ucyIpDQoNCmthYmxlKHRhYiwNCiAgICAgIGVzY2FwZT1GLA0KICAgICAgY29sLm5hbWVzPWMoIkVmZmVjdCIsICJkZiIsICJGIiwgIiYjOTUxOzxzdWI+cDwvc3ViPjxzdXA+Mjwvc3VwPiIsICI8aT5wPC9pPiB2YWx1ZSIpLA0KICAgICAgY2FwdGlvbj0iQW5hbHlzaXMgb2YgdmFyaWFuY2UgZXhhbWluaW5nIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIGFuZCBkZWNlcHRpb24uIikgJT4lICANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCANCiAgICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMSksIHdpZHRoID0gIjE1ZW0iKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDI6NCksIHdpZHRoID0gIjhlbSIpDQoNCmBgYA0KDQojIyMgVmlzdWFsaXphdGlvbiB7LX0NCg0KYGBge3IgaDFjLXBsb3QtMiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGZpZy53aWR0aD0xMSwgZmlnLmFzcD0wLjUsIGZpZy5jYXA9IkFzc29jaWF0aW9ucyBiZXR3ZWVuIHRoZSBleHBlcmltZW50YWwgY29uZGl0aW9ucyBhbmQgZGVjZXB0aW9uLiJ9DQoNCiMgcGxvdCBtZWFucyBhbmQgZGlzdHJpYnV0aW9ucw0KbCA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHg9Y29uZGl0aW9uLmJlaCwgeT1kZWMpKSArIA0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJCZWhhdmlvciBjb25kaXRpb25zIikgICsgeWxhYigiRGVjZXB0aW9uIHNjb3JlIikgKyBnZ3RpdGxlKCJNZWFucyBhbmQgZGlzdHJpYnV0aW9ucyIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2VvbV92aW9saW4oYWVzKHggPSBjb25kaXRpb24uYmVoLCB5ID0gZGVjKSwgd2lkdGg9MSwgZmlsbD0nI0VFRUVFRScsIGNvbG9yPSIjRUVFRUVFIiwgdHJpbT1GQUxTRSkgKw0KICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAiY3Jvc3NiYXIiLCB3aWR0aCA9IDAuNzUsIA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNzUpLCBjb2xvdXI9IiM4MDgwODAiKSArDQogICBnZW9tX2ppdHRlcihhZXMoY29sb3VyPWNvbmRpdGlvbi5iZWgpLCBzaGFwZSA9IDE2LCB3aWR0aCA9IC4xLCBhbHBoYT0uNSwgc2l6ZT0yLjUpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLnNpdCkgKw0KICAgZmFjZXRfd3JhcCh+Y29uZGl0aW9uLnNpdCkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsNCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iIiwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSxmYWNlPSJib2xkIikpIA0KDQoNCiMgcGxvdCBpbnRlcmFjdGlvbiBkaWFncmFtDQpyIDwtIGdncGxvdChkYXRhICU+JSANCiAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbmRpdGlvbi5zaXQsIGNvbmRpdGlvbi5iZWgpICU+JSANCiAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKGRlYywgbmEucm09VFJVRSkpLCANCiAgICAgICAgICAgIGFlcyh4ID0gY29uZGl0aW9uLmJlaCwgeSA9IGdyb3VwcywgY29sb3IgPSBjb25kaXRpb24uc2l0KSkgKw0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJCZWhhdmlvciBjb25kaXRpb25zIikgKyB5bGFiKCJEZWNlcHRpb24gc2NvcmUiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdndGl0bGUoIk1haW4gZWZmZWN0cyBhbmQgaW50ZXJhY3Rpb25zIikgKyANCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDAuMjUsMC4yKSwgbGVnZW5kLmRpcmVjdGlvbj0idmVydGljYWwiKSArIGxhYnMoY29sb3IgPSAiIikgKyANCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuc2l0KSArDQogICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gY29uZGl0aW9uLnNpdCksIHNpemU9MS41KSArDQogICBnZW9tX3BvaW50KHNpemU9Mi41KSANCg0KDQojIGNvbWJpbmUgcGxvdHMNCihsIHwgcGxvdF9zcGFjZXIoKSB8IHIpICsgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSAiQSIpICsgcGxvdF9sYXlvdXQod2lkdGg9YygxLDAuMSwxKSkNCg0KYGBgDQoNCiMjIE5vdCBUYXJnZXRlZCBQZXJzb25hbGl0eSBTdGF0ZXMgYW5kIFNpdHVhdGlvbiBDaGFyYWN0ZXJpc3RpY3Mgey19DQoNCiMjIyBIeXBvdGhlc2lzIHstfQ0KDQpUaGUgbWFuaXB1bGF0aW9ucyBhcmUgbmVpdGhlciByZWxhdGVkIHRvIHRoZSByZXBvcnRlZCBsZXZlbHMgb2Ygc3RhdGUgb3Blbm5lc3MsIHN0YXRlIGNvbnNjaWVudGlvdXNuZXNzLCBzdGF0ZSBleHRyYXZlcnNpb24sIGFuZCBzdGF0ZSBlbW90aW9uYWwgc3RhYmlsaXR5IG5vciB0byB0aGUgcmVwb3J0ZWQgbGV2ZWxzIG9mIER1dHksIEludGVsbGVjdCwgTWF0aW5nLCBwT3NpdGl2aXR5LCBOZWdhdGl2aXR5LCBhbmQgU29jaWFsaXR5Lg0KDQojIyMgRGVzY3JpcHRpdmVzIHstfQ0KDQpgYGB7ciBoMWQtZGVzY3JpcHRpdmVzLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KdGFiIDwtIGJpbmRfcm93cyhkZXNjcmliZUJ5KGRhdGEkc3RhdGUuZSwgZ3JvdXA9bGlzdChkYXRhJGNvbmRpdGlvbi5iZWgsIGRhdGEkY29uZGl0aW9uLnNpdCksIG1hdD1UUlVFLCBkaWdpdHM9MilbLDI6MTVdLA0KICAgICAgICAgICAgICAgICBkZXNjcmliZUJ5KGRhdGEkc3RhdGUueCwgZ3JvdXA9bGlzdChkYXRhJGNvbmRpdGlvbi5iZWgsIGRhdGEkY29uZGl0aW9uLnNpdCksIG1hdD1UUlVFLCBkaWdpdHM9MilbLDI6MTVdLA0KICAgICAgICAgICAgICAgICBkZXNjcmliZUJ5KGRhdGEkc3RhdGUuYywgZ3JvdXA9bGlzdChkYXRhJGNvbmRpdGlvbi5iZWgsIGRhdGEkY29uZGl0aW9uLnNpdCksIG1hdD1UUlVFLCBkaWdpdHM9MilbLDI6MTVdLA0KICAgICAgICAgICAgICAgICBkZXNjcmliZUJ5KGRhdGEkc3RhdGUubywgZ3JvdXA9bGlzdChkYXRhJGNvbmRpdGlvbi5iZWgsIGRhdGEkY29uZGl0aW9uLnNpdCksIG1hdD1UUlVFLCBkaWdpdHM9MilbLDI6MTVdLA0KICAgICAgICAgICAgICAgICBkZXNjcmliZUJ5KGRhdGEkZHV0LCBncm91cD1saXN0KGRhdGEkY29uZGl0aW9uLmJlaCwgZGF0YSRjb25kaXRpb24uc2l0KSwgbWF0PVRSVUUsIGRpZ2l0cz0yKVssMjoxNV0sDQogICAgICAgICAgICAgICAgIGRlc2NyaWJlQnkoZGF0YSRpbnQsIGdyb3VwPWxpc3QoZGF0YSRjb25kaXRpb24uYmVoLCBkYXRhJGNvbmRpdGlvbi5zaXQpLCBtYXQ9VFJVRSwgZGlnaXRzPTIpWywyOjE1XSwNCiAgICAgICAgICAgICAgICAgZGVzY3JpYmVCeShkYXRhJG1hdCwgZ3JvdXA9bGlzdChkYXRhJGNvbmRpdGlvbi5iZWgsIGRhdGEkY29uZGl0aW9uLnNpdCksIG1hdD1UUlVFLCBkaWdpdHM9MilbLDI6MTVdLA0KICAgICAgICAgICAgICAgICBkZXNjcmliZUJ5KGRhdGEkcG9zLCBncm91cD1saXN0KGRhdGEkY29uZGl0aW9uLmJlaCwgZGF0YSRjb25kaXRpb24uc2l0KSwgbWF0PVRSVUUsIGRpZ2l0cz0yKVssMjoxNV0sDQogICAgICAgICAgICAgICAgIGRlc2NyaWJlQnkoZGF0YSRuZWcsIGdyb3VwPWxpc3QoZGF0YSRjb25kaXRpb24uYmVoLCBkYXRhJGNvbmRpdGlvbi5zaXQpLCBtYXQ9VFJVRSwgZGlnaXRzPTIpWywyOjE1XSwNCiAgICAgICAgICAgICAgICAgZGVzY3JpYmVCeShkYXRhJHNvYywgZ3JvdXA9bGlzdChkYXRhJGNvbmRpdGlvbi5iZWgsIGRhdGEkY29uZGl0aW9uLnNpdCksIG1hdD1UUlVFLCBkaWdpdHM9MilbLDI6MTVdLCkNCg0Ka2FibGUodGFiLA0KICAgICAgcm93Lm5hbWVzID0gRkFMU0UsDQogICAgICBjb2wubmFtZXMgPSBjKCJiZWhhdmlvciBjb25kaXRpb24iLCAic2l0dWF0aW9uIGNvbmRpdGlvbiIsICJ2YXJzIiwgIm4iLCAibWVhbiIsICJzZCIsICJtZWRpYW4iLCANCiAgICAgICAgICAgICAgICAgICAgInRyaW1tZWQiLCAibWFkIiwgIm1pbiIsICJtYXgiLCAicmFuZ2UiLCAic2tldyIsICJrdXJ0b3NpcyIpLA0KICAgICAgY2FwdGlvbj0iRGVzY3JpcHRpdmUgc3RhdGlzdGljcyBvZiB0aGUgcmVtYWluaW5nIHBlcnNvbmFsaXR5IHN0YXRlcyBhbmQgc2l0dWF0aW9uIGNoYXJhY3RlcmlzdGljcyBpbiB0aGUgZGlmZmVyZW50IGV4cGVyaW1lbnRhbCBncm91cHMuIikgJT4lICANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gVCkgICU+JSANCiAgIHBhY2tfcm93cygiU3RhdGUgRW1vdGlvbmFsaXR5IiwgMSwgNCkgJT4lDQogICBwYWNrX3Jvd3MoIlN0YXRlIEV4dHJhdmVyc2lvbiIsIDUsIDgpICU+JQ0KICAgcGFja19yb3dzKCJTdGF0ZSBDb25zY2llbnRpb3VzbmVzcyIsIDksIDEyKSAlPiUNCiAgIHBhY2tfcm93cygiU3RhdGUgT3Blbm5lc3MiLCAxMywgMTYpICU+JQ0KICAgcGFja19yb3dzKCJEdXR5IiwgMTcsIDIwKSAlPiUNCiAgIHBhY2tfcm93cygiSW50ZWxsZWN0IiwgMjEsIDI0KSAlPiUNCiAgIHBhY2tfcm93cygiTWF0aW5nIiwgMjUsIDI4KSAlPiUNCiAgIHBhY2tfcm93cygicE9zaXRpdml0eSIsIDI5LCAzMikgJT4lDQogICBwYWNrX3Jvd3MoIk5lZ2F0aXZpdHkiLCAzMywgMzYpICU+JQ0KICAgcGFja19yb3dzKCJTb2NpYWxpdHkiLCAzNywgNDApDQoNCmBgYA0KDQojIyMgQU5PVkEgey19DQoNCmBgYHtyIGgxZC1hbm92YXMsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KDQphb3YuZSA8LSBhb3ZfY2FyKHN0YXRlLmUgfiBjb25kaXRpb24uYmVoICogY29uZGl0aW9uLnNpdCArIEVycm9yKFJlc3BvbnNlSWQpLCBkYXRhPWRhdGEpDQphb3YueCA8LSBhb3ZfY2FyKHN0YXRlLnggfiBjb25kaXRpb24uYmVoICogY29uZGl0aW9uLnNpdCArIEVycm9yKFJlc3BvbnNlSWQpLCBkYXRhPWRhdGEpDQphb3YuYyA8LSBhb3ZfY2FyKHN0YXRlLmMgfiBjb25kaXRpb24uYmVoICogY29uZGl0aW9uLnNpdCArIEVycm9yKFJlc3BvbnNlSWQpLCBkYXRhPWRhdGEpDQphb3YubyA8LSBhb3ZfY2FyKHN0YXRlLm8gfiBjb25kaXRpb24uYmVoICogY29uZGl0aW9uLnNpdCArIEVycm9yKFJlc3BvbnNlSWQpLCBkYXRhPWRhdGEpDQphb3YuZHV0IDwtIGFvdl9jYXIoZHV0IH4gY29uZGl0aW9uLmJlaCAqIGNvbmRpdGlvbi5zaXQgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1kYXRhKQ0KYW92LmludCA8LSBhb3ZfY2FyKGludCB+IGNvbmRpdGlvbi5iZWggKiBjb25kaXRpb24uc2l0ICsgRXJyb3IoUmVzcG9uc2VJZCksIGRhdGE9ZGF0YSkNCmFvdi5tYXQgPC0gYW92X2NhcihtYXQgfiBjb25kaXRpb24uYmVoICogY29uZGl0aW9uLnNpdCArIEVycm9yKFJlc3BvbnNlSWQpLCBkYXRhPWRhdGEpDQphb3YucG9zIDwtIGFvdl9jYXIocG9zIH4gY29uZGl0aW9uLmJlaCAqIGNvbmRpdGlvbi5zaXQgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1kYXRhKQ0KYW92Lm5lZyA8LSBhb3ZfY2FyKG5lZyB+IGNvbmRpdGlvbi5iZWggKiBjb25kaXRpb24uc2l0ICsgRXJyb3IoUmVzcG9uc2VJZCksIGRhdGE9ZGF0YSkNCmFvdi5zb2MgPC0gYW92X2NhcihkZWMgfiBjb25kaXRpb24uYmVoICogY29uZGl0aW9uLnNpdCArIEVycm9yKFJlc3BvbnNlSWQpLCBkYXRhPWRhdGEpDQoNCg0KdGFiIDwtIGJpbmRfcm93cyhhcy5kYXRhLmZyYW1lKG5pY2UoYW92LmUsIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpLA0KICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKG5pY2UoYW92LngsIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpLA0KICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKG5pY2UoYW92LmMsIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpLA0KICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKG5pY2UoYW92Lm8sIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpLA0KICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKG5pY2UoYW92LmR1dCwgZXM9InBlcyIsIHNpZ19zeW1ib2xzID0gcmVwKCIiLCA0KSwgTVNFPUZBTFNFKSksDQogICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUobmljZShhb3YuaW50LCBlcz0icGVzIiwgc2lnX3N5bWJvbHMgPSByZXAoIiIsIDQpLCBNU0U9RkFMU0UpKSwNCiAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZShuaWNlKGFvdi5tYXQsIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpLA0KICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKG5pY2UoYW92LnBvcywgZXM9InBlcyIsIHNpZ19zeW1ib2xzID0gcmVwKCIiLCA0KSwgTVNFPUZBTFNFKSksDQogICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUobmljZShhb3YubmVnLCBlcz0icGVzIiwgc2lnX3N5bWJvbHMgPSByZXAoIiIsIDQpLCBNU0U9RkFMU0UpKSwNCiAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZShuaWNlKGFvdi5zb2MsIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpDQopDQoNCnRhYiRwLnZhbHVlW3RhYiRwLnZhbHVlPT0iPC4wMDEiXSA8LSAiJmx0Oy4wMDEiDQp0YWIkcGVzW3RhYiRwZXM9PSI8LjAwMSJdIDwtICImbHQ7LjAwMSINCnRhYiRFZmZlY3QgPC0gcmVwKGMoIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiLCAiQmVoYXZpb3IgeCBTaXR1YXRpb24gY29uZGl0aW9ucyIpLDEwKQ0KDQprYWJsZSh0YWIsDQogICAgICBlc2NhcGU9RiwNCiAgICAgIGNvbC5uYW1lcz1jKCJFZmZlY3QiLCAiZGYiLCAiRiIsICImIzk1MTs8c3ViPnA8L3N1Yj48c3VwPjI8L3N1cD4iLCAiPGk+cDwvaT4gdmFsdWUiKSwNCiAgICAgIGNhcHRpb249IkFuYWx5c2VzIG9mIHZhcmlhbmNlIGV4YW1pbmluZyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBleHBlcmltZW50YWwgY29uZGl0aW9ucyBhbmQgdGhlIHJlbWFpbmluZyBwZXJzb25hbGl0eSBzdGF0ZXMgYW5kIHNpdHVhdGlvbiBjaGFyYWN0ZXJpc3RpY3MuIikgJT4lIA0KICAgcGFja19yb3dzKCJEVjogU3RhdGUgRW1vdGlvbmFsaXR5IiwgMSwgMykgJT4lDQogICBwYWNrX3Jvd3MoIkRWOiBTdGF0ZSBFeHRyYXZlcnNpb24iLCA0LCA2KSAlPiUNCiAgIHBhY2tfcm93cygiRFY6IFN0YXRlIENvbnNjaWVudGlvdXNuZXNzIiwgNywgOSkgJT4lDQogICBwYWNrX3Jvd3MoIkRWOiBTdGF0ZSBPcGVubmVzcyIsIDEwLCAxMikgJT4lDQogICBwYWNrX3Jvd3MoIkRWOiBEdXR5IiwgMTMsIDE1KSAlPiUNCiAgIHBhY2tfcm93cygiRFY6IEludGVsbGVjdCIsIDE2LCAxOCkgJT4lDQogICBwYWNrX3Jvd3MoIkRWOiBNYXRpbmciLCAxOSwgMjEpICU+JQ0KICAgcGFja19yb3dzKCJEVjogcE9zaXRpdml0eSIsIDIyLCAyNCkgJT4lDQogICBwYWNrX3Jvd3MoIkRWOiBOZWdhdGl2aXR5IiwgMjUsIDI3KSAlPiUNCiAgIHBhY2tfcm93cygiRFY6IFNvY2lhbGl0eSIsIDI4LCAzMCkgJT4lICANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCANCiAgICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMSksIHdpZHRoID0gIjE1ZW0iKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDI6NCksIHdpZHRoID0gIjhlbSIpDQoNCmBgYA0KDQojIyMgVmlzdWFsaXphdGlvbiB7LX0NCg0KYGBge3IgaDFkLXBsb3QtMSwgZmlnLndpZHRoPTExLCBmaWcuYXNwPTIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBmaWcuY2FwPSJBc3NvY2lhdGlvbnMgYmV0d2VlbiB0aGUgZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgYW5kIHRoZSByZW1haW5pbmcgcGVyc29uYWxpdHkgc3RhdGVzLiJ9DQoNCiMjIyMgUGVyc29uYWxpdHkgU3RhdGVzDQoNCiMjIyBTdGF0ZSBFbW90aW9uYWxpdHkNCg0KIyBwbG90IG1lYW5zIGFuZCBkaXN0cmlidXRpb25zDQpsMSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHg9Y29uZGl0aW9uLnNpdCwgeT1zdGF0ZS5lKSkgKyANCiAgIHRoZW1lX3B1YigpICsgeGxhYigiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKSAgKyB5bGFiKCJTdGF0ZSBlbW90aW9uYWxpdHkgc2NvcmUiKSArIA0KICAgZ2d0aXRsZSgiTWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdlb21fdmlvbGluKGFlcyh4ID0gY29uZGl0aW9uLnNpdCwgeSA9IHN0YXRlLmUpLCB3aWR0aD0xLCBmaWxsPScjRUVFRUVFJywgY29sb3I9IiNFRUVFRUUiLCB0cmltPUZBTFNFKSArDQogICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJjcm9zc2JhciIsIHdpZHRoID0gMC43NSwgDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC43NSksIGNvbG91cj0iIzgwODA4MCIpICsNCiAgIGdlb21faml0dGVyKGFlcyhjb2xvdXI9Y29uZGl0aW9uLmJlaCksIHNoYXBlID0gMTYsIHdpZHRoID0gLjEsIGFscGhhPS41LCBzaXplPTIuNSkgKyANCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuYmVoKSArDQogICBmYWNldF93cmFwKH5jb25kaXRpb24uYmVoKSArIA0KICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTIwLCBoanVzdD0xLCB2anVzdD0xKSkgKw0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSIiLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT05LGZhY2U9ImJvbGQiKSkgDQoNCg0KIyBwbG90IGludGVyYWN0aW9uIGRpYWdyYW0NCnIxIDwtIGdncGxvdChkYXRhICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShjb25kaXRpb24uc2l0LCBjb25kaXRpb24uYmVoKSAlPiUgDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKGdyb3VwcyA9IG1lYW4oc3RhdGUuZSwgbmEucm09VFJVRSkpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGNvbmRpdGlvbi5zaXQsIHkgPSBncm91cHMsIGNvbG9yID0gY29uZGl0aW9uLmJlaCkpICsNCiAgIHRoZW1lX3B1YigpICsgeGxhYigiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKSArIHlsYWIoIlN0YXRlIGVtb3Rpb25hbGl0eSBzY29yZSIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2d0aXRsZSgiTWFpbiBlZmZlY3RzIGFuZCBpbnRlcmFjdGlvbnMiKSArIA0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPWMoMC4zLDAuODUpLCBsZWdlbmQuZGlyZWN0aW9uPSJ2ZXJ0aWNhbCIpICsgbGFicyhjb2xvciA9ICIiKSArIA0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5iZWgpICsNCiAgIGdlb21fbGluZShhZXMoZ3JvdXAgPSBjb25kaXRpb24uYmVoKSwgc2l6ZT0xLjUpICsNCiAgIGdlb21fcG9pbnQoc2l6ZT0yLjUpIA0KDQpyb3cxIDwtIChsMSB8IHBsb3Rfc3BhY2VyKCkgfCByMSkgKyBwbG90X2xheW91dCh3aWR0aD1jKDEsMC4xLDEpKQ0KDQoNCg0KIyMjIFN0YXRlIEV4dHJhdmVyc2lvbg0KDQojIHBsb3QgbWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMNCmwyIDwtIGdncGxvdChkYXRhLCBhZXMoeD1jb25kaXRpb24uc2l0LCB5PXN0YXRlLngpKSArIA0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJTaXR1YXRpb24gY29uZGl0aW9ucyIpICArIHlsYWIoIlN0YXRlIGV4dHJhdmVyc2lvbiBzY29yZSIpICsgDQogICBnZ3RpdGxlKCJNZWFucyBhbmQgZGlzdHJpYnV0aW9ucyIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2VvbV92aW9saW4oYWVzKHggPSBjb25kaXRpb24uc2l0LCB5ID0gc3RhdGUueCksIHdpZHRoPTEsIGZpbGw9JyNFRUVFRUUnLCBjb2xvcj0iI0VFRUVFRSIsIHRyaW09RkFMU0UpICsNCiAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gImNyb3NzYmFyIiwgd2lkdGggPSAwLjc1LCANCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjc1KSwgY29sb3VyPSIjODA4MDgwIikgKw0KICAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG91cj1jb25kaXRpb24uYmVoKSwgc2hhcGUgPSAxNiwgd2lkdGggPSAuMSwgYWxwaGE9LjUsIHNpemU9Mi41KSArIA0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5iZWgpICsNCiAgIGZhY2V0X3dyYXAofmNvbmRpdGlvbi5iZWgpICsgDQogICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MjAsIGhqdXN0PTEsIHZqdXN0PTEpKSArDQogICB0aGVtZShsZWdlbmQucG9zaXRpb249IiIsIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTksZmFjZT0iYm9sZCIpKSANCg0KDQojIHBsb3QgaW50ZXJhY3Rpb24gZGlhZ3JhbQ0KcjIgPC0gZ2dwbG90KGRhdGEgJT4lIA0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbmRpdGlvbi5zaXQsIGNvbmRpdGlvbi5iZWgpICU+JSANCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoZ3JvdXBzID0gbWVhbihzdGF0ZS54LCBuYS5ybT1UUlVFKSksIA0KICAgICAgICAgICAgIGFlcyh4ID0gY29uZGl0aW9uLnNpdCwgeSA9IGdyb3VwcywgY29sb3IgPSBjb25kaXRpb24uYmVoKSkgKw0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJTaXR1YXRpb24gY29uZGl0aW9ucyIpICsgeWxhYigiU3RhdGUgZXh0cmF2ZXJzaW9uIHNjb3JlIikgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygxLDcpLCBsYWJlbHM9YygxOjcpLCBicmVha3M9YygxOjcpKSArDQogICBnZ3RpdGxlKCJNYWluIGVmZmVjdHMgYW5kIGludGVyYWN0aW9ucyIpICsgDQogICB0aGVtZShsZWdlbmQucG9zaXRpb249YygwLjMsMC4yKSwgbGVnZW5kLmRpcmVjdGlvbj0idmVydGljYWwiKSArIGxhYnMoY29sb3IgPSAiIikgKyANCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuYmVoKSArDQogICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gY29uZGl0aW9uLmJlaCksIHNpemU9MS41KSArDQogICBnZW9tX3BvaW50KHNpemU9Mi41KSANCg0Kcm93MiA8LSAobDIgfCBwbG90X3NwYWNlcigpIHwgcjIpICsgcGxvdF9sYXlvdXQod2lkdGg9YygxLDAuMSwxKSkNCg0KDQoNCiMjIyBTdGF0ZSBDb25zY2llbnRpb3VzbmVzcw0KDQojIHBsb3QgbWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMNCmwzIDwtIGdncGxvdChkYXRhLCBhZXMoeD1jb25kaXRpb24uc2l0LCB5PXN0YXRlLmMpKSArIA0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJTaXR1YXRpb24gY29uZGl0aW9ucyIpICsgeWxhYigiU3RhdGUgY29uc2NpZW50aW91c25lc3Mgc2NvcmUiKSArIA0KICAgZ2d0aXRsZSgiTWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdlb21fdmlvbGluKGFlcyh4ID0gY29uZGl0aW9uLnNpdCwgeSA9IHN0YXRlLmMpLCB3aWR0aD0xLCBmaWxsPScjRUVFRUVFJywgY29sb3I9IiNFRUVFRUUiLCB0cmltPUZBTFNFKSArDQogICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJjcm9zc2JhciIsIHdpZHRoID0gMC43NSwgDQogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC43NSksIGNvbG91cj0iIzgwODA4MCIpICsNCiAgIGdlb21faml0dGVyKGFlcyhjb2xvdXI9Y29uZGl0aW9uLmJlaCksIHNoYXBlID0gMTYsIHdpZHRoID0gLjEsIGFscGhhPS41LCBzaXplPTIuNSkgKyANCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuYmVoKSArDQogICBmYWNldF93cmFwKH5jb25kaXRpb24uYmVoKSArIA0KICAgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTIwLCBoanVzdD0xLCB2anVzdD0xKSkgKw0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSIiLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT05LGZhY2U9ImJvbGQiKSkgDQoNCg0KIyBwbG90IGludGVyYWN0aW9uIGRpYWdyYW0NCnIzIDwtIGdncGxvdChkYXRhICU+JSANCiAgICAgICAgICAgICAgICBncm91cF9ieShjb25kaXRpb24uc2l0LCBjb25kaXRpb24uYmVoKSAlPiUgDQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKGdyb3VwcyA9IG1lYW4oc3RhdGUuYywgbmEucm09VFJVRSkpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGNvbmRpdGlvbi5zaXQsIHkgPSBncm91cHMsIGNvbG9yID0gY29uZGl0aW9uLmJlaCkpICsNCiAgIHRoZW1lX3B1YigpICsgeGxhYigiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKSArIHlsYWIoIlN0YXRlIGNvbnNjaWVudGlvdXNuZXNzIHNjb3JlIikgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygxLDcpLCBsYWJlbHM9YygxOjcpLCBicmVha3M9YygxOjcpKSArDQogICBnZ3RpdGxlKCJNYWluIGVmZmVjdHMgYW5kIGludGVyYWN0aW9ucyIpICsgDQogICB0aGVtZShsZWdlbmQucG9zaXRpb249YygwLjMsMC4yKSwgbGVnZW5kLmRpcmVjdGlvbj0idmVydGljYWwiKSArIGxhYnMoY29sb3IgPSAiIikgKyANCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuYmVoKSArDQogICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gY29uZGl0aW9uLmJlaCksIHNpemU9MS41KSArDQogICBnZW9tX3BvaW50KHNpemU9Mi41KSANCg0Kcm93MyA8LSAobDMgfCBwbG90X3NwYWNlcigpIHwgcjMpICsgcGxvdF9sYXlvdXQod2lkdGg9YygxLDAuMSwxKSkNCg0KDQoNCiMjIyBTdGF0ZSBPcGVubmVzcw0KDQojIHBsb3QgbWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMNCmw0IDwtIGdncGxvdChkYXRhLCBhZXMoeD1jb25kaXRpb24uc2l0LCB5PXN0YXRlLm8pKSArIA0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJTaXR1YXRpb24gY29uZGl0aW9ucyIpICsgeWxhYigiU3RhdGUgb3Blbm5lc3Mgc2NvcmUiKSArIGdndGl0bGUoIk1lYW5zIGFuZCBkaXN0cmlidXRpb25zIikgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygxLDcpLCBsYWJlbHM9YygxOjcpLCBicmVha3M9YygxOjcpKSArDQogICBnZW9tX3Zpb2xpbihhZXMoeCA9IGNvbmRpdGlvbi5zaXQsIHkgPSBzdGF0ZS5vKSwgd2lkdGg9MSwgZmlsbD0nI0VFRUVFRScsIGNvbG9yPSIjRUVFRUVFIiwgdHJpbT1GQUxTRSkgKw0KICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAiY3Jvc3NiYXIiLCB3aWR0aCA9IDAuNzUsIA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNzUpLCBjb2xvdXI9IiM4MDgwODAiKSArDQogICBnZW9tX2ppdHRlcihhZXMoY29sb3VyPWNvbmRpdGlvbi5iZWgpLCBzaGFwZSA9IDE2LCB3aWR0aCA9IC4xLCBhbHBoYT0uNSwgc2l6ZT0yLjUpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLmJlaCkgKw0KICAgZmFjZXRfd3JhcCh+Y29uZGl0aW9uLmJlaCkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsNCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iIiwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSxmYWNlPSJib2xkIikpIA0KDQoNCiMgcGxvdCBpbnRlcmFjdGlvbiBkaWFncmFtDQpyNCA8LSBnZ3Bsb3QoZGF0YSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29uZGl0aW9uLnNpdCwgY29uZGl0aW9uLmJlaCkgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKHN0YXRlLm8sIG5hLnJtPVRSVUUpKSwgDQogICAgICAgICAgICAgYWVzKHggPSBjb25kaXRpb24uc2l0LCB5ID0gZ3JvdXBzLCBjb2xvciA9IGNvbmRpdGlvbi5iZWgpKSArDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIlNpdHVhdGlvbiBjb25kaXRpb25zIikgKyB5bGFiKCJTdGF0ZSBvcGVubmVzcyBzY29yZSIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2d0aXRsZSgiTWFpbiBlZmZlY3RzIGFuZCBpbnRlcmFjdGlvbnMiKSArIA0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPWMoMC4zLDAuMiksIGxlZ2VuZC5kaXJlY3Rpb249InZlcnRpY2FsIikgKyBsYWJzKGNvbG9yID0gIiIpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLmJlaCkgKw0KICAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbmRpdGlvbi5iZWgpLCBzaXplPTEuNSkgKw0KICAgZ2VvbV9wb2ludChzaXplPTIuNSkgDQoNCnJvdzQgPC0gKGw0IHwgcGxvdF9zcGFjZXIoKSB8IHI0KSArIHBsb3RfbGF5b3V0KHdpZHRoPWMoMSwwLjEsMSkpDQoNCg0KDQojIyMgdGl0bGVzDQoNCmUgPC0gZ2dkcmF3KCkgKyBkcmF3X2xhYmVsKCJTdGF0ZSBFbW90aW9uYWxpdHkiLCBmb250ZmFjZSA9IGMoJ2JvbGQnKSwgc2l6ZT0xNCwgaGp1c3QgPSAwLjUsIGxpbmVoZWlnaHQgPSAxKSANCnggPC0gZ2dkcmF3KCkgKyBkcmF3X2xhYmVsKCJTdGF0ZSBFeHRyYXZlcnNpb24iLCBmb250ZmFjZSA9IGMoJ2JvbGQnKSwgc2l6ZT0xNCwgaGp1c3QgPSAwLjUsIGxpbmVoZWlnaHQgPSAxKSANCmMgPC0gZ2dkcmF3KCkgKyBkcmF3X2xhYmVsKCJTdGF0ZSBDb25zY2llbnRpb3VzbmVzcyIsIGZvbnRmYWNlID0gYygnYm9sZCcpLCBzaXplPTE0LCBoanVzdCA9IDAuNSwgbGluZWhlaWdodCA9IDEpIA0KbyA8LSBnZ2RyYXcoKSArIGRyYXdfbGFiZWwoIlN0YXRlIE9wZW5uZXNzIiwgZm9udGZhY2UgPSBjKCdib2xkJyksIHNpemU9MTQsIGhqdXN0ID0gMC41LCBsaW5laGVpZ2h0ID0gMSkgDQoNCg0KDQoNCiMjIyBjb21iaW5lIHBsb3RzDQplLw0KICAgcm93MSAvDQogICB4Lw0KICAgcm93Mi8NCiAgIGMvDQogICByb3czLw0KICAgby8NCiAgIHJvdzQgKyBwbG90X2xheW91dChoZWlnaHRzPXJlcChjKDAuMywxKSw0KSkgIysgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSBjKCJBIiwgIiIsICIiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQiIsICIiLCAiIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMiLCAiIiwgIiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkQiLCAiIiwgIiIpKSANCg0KYGBgDQoNCmBgYHtyIGgxZC1wbG90LTIsIGZpZy53aWR0aD0xMSwgZmlnLmFzcD0zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZmlnLmNhcD0iQXNzb2NpYXRpb25zIGJldHdlZW4gdGhlIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIGFuZCB0aGUgcmVtYWluaW5nIHNpdHVhdGlvbiBjaGFyYWN0ZXJpc3RpY3MuIn0NCg0KIyMjIyBTaXR1YXRpb24gY2hhcmFjdGVyaXN0aWNzDQoNCiMjIyBEdXR5DQoNCiMgcGxvdCBtZWFucyBhbmQgZGlzdHJpYnV0aW9ucw0KbDEgPC0gZ2dwbG90KGRhdGEsIGFlcyh4PWNvbmRpdGlvbi5iZWgsIHk9ZHV0KSkgKyANCiAgIHRoZW1lX3B1YigpICsgeGxhYigiQmVoYXZpb3IgY29uZGl0aW9ucyIpICsgeWxhYigiRHV0eSBzY29yZSIpICsgZ2d0aXRsZSgiTWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdlb21fdmlvbGluKGFlcyh4ID0gY29uZGl0aW9uLmJlaCwgeSA9IGR1dCksIHdpZHRoPTEsIGZpbGw9JyNFRUVFRUUnLCBjb2xvcj0iI0VFRUVFRSIsIHRyaW09RkFMU0UpICsNCiAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gImNyb3NzYmFyIiwgd2lkdGggPSAwLjc1LCANCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjc1KSwgY29sb3VyPSIjODA4MDgwIikgKw0KICAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG91cj1jb25kaXRpb24uYmVoKSwgc2hhcGUgPSAxNiwgd2lkdGggPSAuMSwgYWxwaGE9LjUsIHNpemU9Mi41KSArIA0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5zaXQpICsNCiAgIGZhY2V0X3dyYXAofmNvbmRpdGlvbi5zaXQpICsgDQogICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MjAsIGhqdXN0PTEsIHZqdXN0PTEpKSArDQogICB0aGVtZShsZWdlbmQucG9zaXRpb249IiIsIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTksZmFjZT0iYm9sZCIpKSANCg0KDQojIHBsb3QgaW50ZXJhY3Rpb24gZGlhZ3JhbQ0KcjEgPC0gZ2dwbG90KGRhdGEgJT4lIA0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbmRpdGlvbi5zaXQsIGNvbmRpdGlvbi5iZWgpICU+JSANCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoZ3JvdXBzID0gbWVhbihkdXQsIG5hLnJtPVRSVUUpKSwgDQogICAgICAgICAgICAgYWVzKHggPSBjb25kaXRpb24uYmVoLCB5ID0gZ3JvdXBzLCBjb2xvciA9IGNvbmRpdGlvbi5zaXQpKSArDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIkJlaGF2aW9yIGNvbmRpdGlvbnMiKSArIHlsYWIoIkR1dHkgc2NvcmUiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdndGl0bGUoIk1haW4gZWZmZWN0cyBhbmQgaW50ZXJhY3Rpb25zIikgKyANCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDAuMjUsMC44NSksIGxlZ2VuZC5kaXJlY3Rpb249InZlcnRpY2FsIikgKyBsYWJzKGNvbG9yID0gIiIpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLnNpdCkgKw0KICAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbmRpdGlvbi5zaXQpLCBzaXplPTEuNSkgKw0KICAgZ2VvbV9wb2ludChzaXplPTIuNSkgDQoNCnJvdzEgPC0gKGwxIHwgcGxvdF9zcGFjZXIoKSB8IHIxKSArIHBsb3RfbGF5b3V0KHdpZHRocz1jKDEsMC4xLDEpKQ0KDQoNCg0KIyMjIEludGVsbGVjdA0KDQojIHBsb3QgbWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMNCmwyIDwtIGdncGxvdChkYXRhLCBhZXMoeD1jb25kaXRpb24uYmVoLCB5PWludCkpICsgDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIkJlaGF2aW9yIGNvbmRpdGlvbnMiKSArIHlsYWIoIkludGVsbGVjdCBzY29yZSIpICsgZ2d0aXRsZSgiTWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdlb21fdmlvbGluKGFlcyh4ID0gY29uZGl0aW9uLmJlaCwgeSA9IGludCksIHdpZHRoPTEsIGZpbGw9JyNFRUVFRUUnLCBjb2xvcj0iI0VFRUVFRSIsIHRyaW09RkFMU0UpICsNCiAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gImNyb3NzYmFyIiwgd2lkdGggPSAwLjc1LCANCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjc1KSwgY29sb3VyPSIjODA4MDgwIikgKw0KICAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG91cj1jb25kaXRpb24uYmVoKSwgc2hhcGUgPSAxNiwgd2lkdGggPSAuMSwgYWxwaGE9LjUsIHNpemU9Mi41KSArIA0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5zaXQpICsNCiAgIGZhY2V0X3dyYXAofmNvbmRpdGlvbi5zaXQpICsgDQogICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MjAsIGhqdXN0PTEsIHZqdXN0PTEpKSArDQogICB0aGVtZShsZWdlbmQucG9zaXRpb249IiIsIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTksZmFjZT0iYm9sZCIpKSANCg0KDQojIHBsb3QgaW50ZXJhY3Rpb24gZGlhZ3JhbQ0KcjIgPC0gZ2dwbG90KGRhdGEgJT4lIA0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbmRpdGlvbi5zaXQsIGNvbmRpdGlvbi5iZWgpICU+JSANCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoZ3JvdXBzID0gbWVhbihpbnQsIG5hLnJtPVRSVUUpKSwgDQogICAgICAgICAgICAgYWVzKHggPSBjb25kaXRpb24uYmVoLCB5ID0gZ3JvdXBzLCBjb2xvciA9IGNvbmRpdGlvbi5zaXQpKSArDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIkJlaGF2aW9yIGNvbmRpdGlvbnMiKSArIHlsYWIoIkludGVsbGVjdCBzY29yZSIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2d0aXRsZSgiTWFpbiBlZmZlY3RzIGFuZCBpbnRlcmFjdGlvbnMiKSArIA0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPWMoMC4yNSwwLjg1KSwgbGVnZW5kLmRpcmVjdGlvbj0idmVydGljYWwiKSArIGxhYnMoY29sb3IgPSAiIikgKyANCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuc2l0KSArDQogICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gY29uZGl0aW9uLnNpdCksIHNpemU9MS41KSArDQogICBnZW9tX3BvaW50KHNpemU9Mi41KSANCg0Kcm93MiA8LSAobDIgfCBwbG90X3NwYWNlcigpIHwgcjIpICsgcGxvdF9sYXlvdXQod2lkdGhzPWMoMSwwLjEsMSkpDQoNCg0KDQojIyMgTWF0aW5nDQoNCiMgcGxvdCBtZWFucyBhbmQgZGlzdHJpYnV0aW9ucw0KbDMgPC0gZ2dwbG90KGRhdGEsIGFlcyh4PWNvbmRpdGlvbi5iZWgsIHk9bWF0KSkgKyANCiAgIHRoZW1lX3B1YigpICsgeGxhYigiQmVoYXZpb3IgY29uZGl0aW9ucyIpICsgeWxhYigiTWF0aW5nIHNjb3JlIikgKyBnZ3RpdGxlKCJNZWFucyBhbmQgZGlzdHJpYnV0aW9ucyIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2VvbV92aW9saW4oYWVzKHggPSBjb25kaXRpb24uYmVoLCB5ID0gbWF0KSwgd2lkdGg9MSwgZmlsbD0nI0VFRUVFRScsIGNvbG9yPSIjRUVFRUVFIiwgdHJpbT1GQUxTRSkgKw0KICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAiY3Jvc3NiYXIiLCB3aWR0aCA9IDAuNzUsIA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNzUpLCBjb2xvdXI9IiM4MDgwODAiKSArDQogICBnZW9tX2ppdHRlcihhZXMoY29sb3VyPWNvbmRpdGlvbi5iZWgpLCBzaGFwZSA9IDE2LCB3aWR0aCA9IC4xLCBhbHBoYT0uNSwgc2l6ZT0yLjUpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLnNpdCkgKw0KICAgZmFjZXRfd3JhcCh+Y29uZGl0aW9uLnNpdCkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsNCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iIiwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSxmYWNlPSJib2xkIikpIA0KDQoNCiMgcGxvdCBpbnRlcmFjdGlvbiBkaWFncmFtDQpyMyA8LSBnZ3Bsb3QoZGF0YSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29uZGl0aW9uLnNpdCwgY29uZGl0aW9uLmJlaCkgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKG1hdCwgbmEucm09VFJVRSkpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGNvbmRpdGlvbi5iZWgsIHkgPSBncm91cHMsIGNvbG9yID0gY29uZGl0aW9uLnNpdCkpICsNCiAgIHRoZW1lX3B1YigpICsgeGxhYigiQmVoYXZpb3IgY29uZGl0aW9ucyIpICsgeWxhYigiTWF0aW5nIHNjb3JlIikgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygxLDcpLCBsYWJlbHM9YygxOjcpLCBicmVha3M9YygxOjcpKSArDQogICBnZ3RpdGxlKCJNYWluIGVmZmVjdHMgYW5kIGludGVyYWN0aW9ucyIpICsgDQogICB0aGVtZShsZWdlbmQucG9zaXRpb249YygwLjI1LDAuODUpLCBsZWdlbmQuZGlyZWN0aW9uPSJ2ZXJ0aWNhbCIpICsgbGFicyhjb2xvciA9ICIiKSArIA0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5zaXQpICsNCiAgIGdlb21fbGluZShhZXMoZ3JvdXAgPSBjb25kaXRpb24uc2l0KSwgc2l6ZT0xLjUpICsNCiAgIGdlb21fcG9pbnQoc2l6ZT0yLjUpIA0KDQpyb3czIDwtIChsMyB8IHBsb3Rfc3BhY2VyKCkgfCByMykgKyBwbG90X2xheW91dCh3aWR0aHM9YygxLDAuMSwxKSkNCg0KDQoNCiMjIyBwT3NpdGl2aXR5DQoNCiMgcGxvdCBtZWFucyBhbmQgZGlzdHJpYnV0aW9ucw0KbDQgPC0gZ2dwbG90KGRhdGEsIGFlcyh4PWNvbmRpdGlvbi5iZWgsIHk9cG9zKSkgKyANCiAgIHRoZW1lX3B1YigpICsgeGxhYigiQmVoYXZpb3IgY29uZGl0aW9ucyIpICsgeWxhYigicE9zaXRpdml0eSBzY29yZSIpICsgZ2d0aXRsZSgiTWVhbnMgYW5kIGRpc3RyaWJ1dGlvbnMiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdlb21fdmlvbGluKGFlcyh4ID0gY29uZGl0aW9uLmJlaCwgeSA9IHBvcyksIHdpZHRoPTEsIGZpbGw9JyNFRUVFRUUnLCBjb2xvcj0iI0VFRUVFRSIsIHRyaW09RkFMU0UpICsNCiAgIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gImNyb3NzYmFyIiwgd2lkdGggPSAwLjc1LCANCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjc1KSwgY29sb3VyPSIjODA4MDgwIikgKw0KICAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG91cj1jb25kaXRpb24uYmVoKSwgc2hhcGUgPSAxNiwgd2lkdGggPSAuMSwgYWxwaGE9LjUsIHNpemU9Mi41KSArIA0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5zaXQpICsNCiAgIGZhY2V0X3dyYXAofmNvbmRpdGlvbi5zaXQpICsgDQogICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9MjAsIGhqdXN0PTEsIHZqdXN0PTEpKSArDQogICB0aGVtZShsZWdlbmQucG9zaXRpb249IiIsIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTksZmFjZT0iYm9sZCIpKSANCg0KDQojIHBsb3QgaW50ZXJhY3Rpb24gZGlhZ3JhbQ0KcjQgPC0gZ2dwbG90KGRhdGEgJT4lIA0KICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNvbmRpdGlvbi5zaXQsIGNvbmRpdGlvbi5iZWgpICU+JSANCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UoZ3JvdXBzID0gbWVhbihwb3MsIG5hLnJtPVRSVUUpKSwgDQogICAgICAgICAgICAgYWVzKHggPSBjb25kaXRpb24uYmVoLCB5ID0gZ3JvdXBzLCBjb2xvciA9IGNvbmRpdGlvbi5zaXQpKSArDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIkJlaGF2aW9yIGNvbmRpdGlvbnMiKSArIHlsYWIoInBPc2l0aXZpdHkgc2NvcmUiKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGxhYmVscz1jKDE6NyksIGJyZWFrcz1jKDE6NykpICsNCiAgIGdndGl0bGUoIk1haW4gZWZmZWN0cyBhbmQgaW50ZXJhY3Rpb25zIikgKyANCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj1jKDAuMjUsMC44NSksIGxlZ2VuZC5kaXJlY3Rpb249InZlcnRpY2FsIikgKyBsYWJzKGNvbG9yID0gIiIpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLnNpdCkgKw0KICAgZ2VvbV9saW5lKGFlcyhncm91cCA9IGNvbmRpdGlvbi5zaXQpLCBzaXplPTEuNSkgKw0KICAgZ2VvbV9wb2ludChzaXplPTIuNSkgDQoNCnJvdzQgPC0gKGw0IHwgcGxvdF9zcGFjZXIoKSB8IHI0KSArIHBsb3RfbGF5b3V0KHdpZHRocz1jKDEsMC4xLDEpKQ0KDQoNCg0KIyMjIE5lZ2F0aXZpdHkNCg0KIyBwbG90IG1lYW5zIGFuZCBkaXN0cmlidXRpb25zDQpsNSA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHg9Y29uZGl0aW9uLmJlaCwgeT1uZWcpKSArIA0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJCZWhhdmlvciBjb25kaXRpb25zIikgKyB5bGFiKCJOZWdhdGl2aXR5IHNjb3JlIikgKyBnZ3RpdGxlKCJNZWFucyBhbmQgZGlzdHJpYnV0aW9ucyIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2VvbV92aW9saW4oYWVzKHggPSBjb25kaXRpb24uYmVoLCB5ID0gbmVnKSwgd2lkdGg9MSwgZmlsbD0nI0VFRUVFRScsIGNvbG9yPSIjRUVFRUVFIiwgdHJpbT1GQUxTRSkgKw0KICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAiY3Jvc3NiYXIiLCB3aWR0aCA9IDAuNzUsIA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNzUpLCBjb2xvdXI9IiM4MDgwODAiKSArDQogICBnZW9tX2ppdHRlcihhZXMoY29sb3VyPWNvbmRpdGlvbi5iZWgpLCBzaGFwZSA9IDE2LCB3aWR0aCA9IC4xLCBhbHBoYT0uNSwgc2l6ZT0yLjUpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLnNpdCkgKw0KICAgZmFjZXRfd3JhcCh+Y29uZGl0aW9uLnNpdCkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsNCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iIiwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSxmYWNlPSJib2xkIikpIA0KDQoNCiMgcGxvdCBpbnRlcmFjdGlvbiBkaWFncmFtDQpyNSA8LSBnZ3Bsb3QoZGF0YSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29uZGl0aW9uLnNpdCwgY29uZGl0aW9uLmJlaCkgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKG5lZywgbmEucm09VFJVRSkpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGNvbmRpdGlvbi5iZWgsIHkgPSBncm91cHMsIGNvbG9yID0gY29uZGl0aW9uLnNpdCkpICsNCiAgIHRoZW1lX3B1YigpICsgeGxhYigiQmVoYXZpb3IgY29uZGl0aW9ucyIpICsgeWxhYigiTmVnYXRpdml0eSBzY29yZSIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2d0aXRsZSgiTWFpbiBlZmZlY3RzIGFuZCBpbnRlcmFjdGlvbnMiKSArIA0KICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPWMoMC4yNSwwLjg1KSwgbGVnZW5kLmRpcmVjdGlvbj0idmVydGljYWwiKSArIGxhYnMoY29sb3IgPSAiIikgKyANCiAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNvbHMuc2l0KSArDQogICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gY29uZGl0aW9uLnNpdCksIHNpemU9MS41KSArDQogICBnZW9tX3BvaW50KHNpemU9Mi41KSANCg0Kcm93NSA8LSAobDUgfCBwbG90X3NwYWNlcigpIHwgcjUpICsgcGxvdF9sYXlvdXQod2lkdGhzPWMoMSwwLjEsMSkpDQoNCg0KDQojIyMgU29jaWFsaXR5DQoNCiMgcGxvdCBtZWFucyBhbmQgZGlzdHJpYnV0aW9ucw0KbDYgPC0gZ2dwbG90KGRhdGEsIGFlcyh4PWNvbmRpdGlvbi5iZWgsIHk9c29jKSkgKyANCiAgIHRoZW1lX3B1YigpICsgeGxhYigiQmVoYXZpb3IgY29uZGl0aW9ucyIpICsgeWxhYigiU29jaWFsaXR5IHNjb3JlIikgKyBnZ3RpdGxlKCJNZWFucyBhbmQgZGlzdHJpYnV0aW9ucyIpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgbGFiZWxzPWMoMTo3KSwgYnJlYWtzPWMoMTo3KSkgKw0KICAgZ2VvbV92aW9saW4oYWVzKHggPSBjb25kaXRpb24uYmVoLCB5ID0gc29jKSwgd2lkdGg9MSwgZmlsbD0nI0VFRUVFRScsIGNvbG9yPSIjRUVFRUVFIiwgdHJpbT1GQUxTRSkgKw0KICAgc3RhdF9zdW1tYXJ5KGZ1biA9IG1lYW4sIGdlb20gPSAiY3Jvc3NiYXIiLCB3aWR0aCA9IDAuNzUsIA0KICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNzUpLCBjb2xvdXI9IiM4MDgwODAiKSArDQogICBnZW9tX2ppdHRlcihhZXMoY29sb3VyPWNvbmRpdGlvbi5iZWgpLCBzaGFwZSA9IDE2LCB3aWR0aCA9IC4xLCBhbHBoYT0uNSwgc2l6ZT0yLjUpICsgDQogICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1jb2xzLnNpdCkgKw0KICAgZmFjZXRfd3JhcCh+Y29uZGl0aW9uLnNpdCkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChhbmdsZT0yMCwgaGp1c3Q9MSwgdmp1c3Q9MSkpICsNCiAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iIiwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9OSxmYWNlPSJib2xkIikpIA0KDQoNCiMgcGxvdCBpbnRlcmFjdGlvbiBkaWFncmFtDQpyNiA8LSBnZ3Bsb3QoZGF0YSAlPiUgDQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY29uZGl0aW9uLnNpdCwgY29uZGl0aW9uLmJlaCkgJT4lIA0KICAgICAgICAgICAgICAgIHN1bW1hcmlzZShncm91cHMgPSBtZWFuKHNvYywgbmEucm09VFJVRSkpLCANCiAgICAgICAgICAgICBhZXMoeCA9IGNvbmRpdGlvbi5iZWgsIHkgPSBncm91cHMsIGNvbG9yID0gY29uZGl0aW9uLnNpdCkpICsNCiAgIHRoZW1lX3B1YigpICsgeGxhYigiQmVoYXZpb3IgY29uZGl0aW9ucyIpICsgeWxhYigiU29jaWFsaXR5IHNjb3JlIikgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhsaW1pdHM9YygxLDcpLCBsYWJlbHM9YygxOjcpLCBicmVha3M9YygxOjcpKSArDQogICBnZ3RpdGxlKCJNYWluIGVmZmVjdHMgYW5kIGludGVyYWN0aW9ucyIpICsgDQogICB0aGVtZShsZWdlbmQucG9zaXRpb249YygwLjI1LDAuODUpLCBsZWdlbmQuZGlyZWN0aW9uPSJ2ZXJ0aWNhbCIpICsgbGFicyhjb2xvciA9ICIiKSArIA0KICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y29scy5zaXQpICsNCiAgIGdlb21fbGluZShhZXMoZ3JvdXAgPSBjb25kaXRpb24uc2l0KSwgc2l6ZT0xLjUpICsNCiAgIGdlb21fcG9pbnQoc2l6ZT0yLjUpIA0KDQpyb3c2IDwtIChsNiB8IHBsb3Rfc3BhY2VyKCkgfCByNikgKyBwbG90X2xheW91dCh3aWR0aHM9YygxLDAuMSwxKSkNCg0KDQoNCiMjIyB0aXRsZXMNCg0KZHV0IDwtIGdnZHJhdygpICsgZHJhd19sYWJlbCgiRHV0eSIsIGZvbnRmYWNlID0gYygnYm9sZCcpLCBzaXplPTE0LCBoanVzdCA9IDAuNSwgbGluZWhlaWdodCA9IDEpIA0KaW50IDwtIGdnZHJhdygpICsgZHJhd19sYWJlbCgiSW50ZWxsZWN0IiwgZm9udGZhY2UgPSBjKCdib2xkJyksIHNpemU9MTQsIGhqdXN0ID0gMC41LCBsaW5laGVpZ2h0ID0gMSkgDQptYXQgPC0gZ2dkcmF3KCkgKyBkcmF3X2xhYmVsKCJNYXRpbmciLCBmb250ZmFjZSA9IGMoJ2JvbGQnKSwgc2l6ZT0xNCwgaGp1c3QgPSAwLjUsIGxpbmVoZWlnaHQgPSAxKSANCnBvcyA8LSBnZ2RyYXcoKSArIGRyYXdfbGFiZWwoInBPc2l0aXZpdHkiLCBmb250ZmFjZSA9IGMoJ2JvbGQnKSwgc2l6ZT0xNCwgaGp1c3QgPSAwLjUsIGxpbmVoZWlnaHQgPSAxKSANCm5lZyA8LSBnZ2RyYXcoKSArIGRyYXdfbGFiZWwoIk5lZ2F0aXZpdHkiLCBmb250ZmFjZSA9IGMoJ2JvbGQnKSwgc2l6ZT0xNCwgaGp1c3QgPSAwLjUsIGxpbmVoZWlnaHQgPSAxKSANCnNvYyA8LSBnZ2RyYXcoKSArIGRyYXdfbGFiZWwoIlNvY2lhbGl0eSIsIGZvbnRmYWNlID0gYygnYm9sZCcpLCBzaXplPTE0LCBoanVzdCA9IDAuNSwgbGluZWhlaWdodCA9IDEpIA0KDQoNCg0KIyMjIGNvbWJpbmUgcGxvdHMNCmR1dC8NCiAgIHJvdzEgLw0KICAgaW50Lw0KICAgcm93Mi8NCiAgIG1hdC8NCiAgIHJvdzMvDQogICBwb3MvDQogICByb3c0Lw0KICAgbmVnLw0KICAgcm93NS8NCiAgIHNvYy8NCiAgIHJvdzYgKyBwbG90X2xheW91dChoZWlnaHRzPXJlcChjKDAuMywxKSw2KSkgIysgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSBjKCJBIiwgIiIsICIiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQiIsICIiLCAiIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMiLCAiIiwgIiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkQiLCAiIiwgIiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFIiwgIiIsICIiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRiIsICIiLCAiIikpIA0KDQpgYGANCg0KDQojIFJlcGxpY2F0aW9uIG9mIE1haW4gRWZmZWN0cyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC19DQoNCiMjIEh5cG90aGVzaXMgYW5kIEFuYWx5c3RpYyBTdHJhdGVneSB7LX0NCg0KKipIeXBvdGhlc2lzKiogIA0KSDJhOiBIaWdoZXIgbGV2ZWxzIG9mIHJlcG9ydGVkIHN0YXRlIEFncmVlYWJsZW5lc3MgYW5kIHN0YXRlIEhvbmVzdHktSHVtaWxpdHkgYXJlIGFzc29jaWF0ZWQgd2l0aCBtb3JlIHBvc2l0aXZlIG1vb2QuICANCg0KSDJiOiBIaWdoZXIgbGV2ZWxzIG9mIHBlcmNlaXZlZCBEZWNlcHRpb24gYW5kIEFkdmVyc2l0eSBhcmUgYXNzb2NpYXRlZCB3aXRoIG1vcmUgbmVnYXRpdmUgbW9vZC4NCg0KKipBbmFseXRpYyBTdHJhdGVneSoqICANCldlIGVzdGltYXRlZCBhIG11bHRpcGxlIHJlZ3Jlc3Npb24gbW9kZWwgd2l0aCB0aGUgcG9zaXRpdmUgYWZmZWN0IGRpbWVuc2lvbiBhcyB0aGUgRFYgYW5kIGdyYW5kLW1lYW4gY2VudGVyZWQgc3RhdGUgQWdyZWVhYmxlbmVzcywgc3RhdGUgSG9uZXN0eS1IdW1pbGl0eSwgcGVyY2VpdmVkIEFkdmVyc2l0eSwgYW5kIHBlcmNlaXZlZCBEZWNlcHRpb24gYXMgSVZzLiBXZSB3aWxsIGFkZCB0cmFpdCBBZ3JlZWFibGVuZXNzIGFuZCB0cmFpdCBIb25lc3R5LUh1bWlsaXR5IGFuZCB0aGVpciBpbnRlcmFjdGlvbnMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHBlcnNvbmFsaXR5IHN0YXRlcyBhcyBwcmVkaWN0b3JzIGluIGEgbmV4dCBzdGVwIHRvIGV4YW1pbmUgYmV0d2Vlbi1wZXJzb24gZGlmZmVyZW5jZXMgaW4gdGhlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIHBlcnNvbmFsaXR5IHN0YXRlcyBhbmQgbW9vZC4gV2UgaW5jbHVkZWQgdGhlIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIGFzIGNvdmFyaWF0ZXMgaW4gdGhlIHJlZ3Jlc3Npb25zIHRvIGNvbnRyb2wgZm9yIHRoZSBoaWVyYXJjaGljYWwgZGF0YSBzdHJ1Y3R1cmUgd2l0aCBwYXJ0aWNpcGFudHMgbmVzdGVkIGluIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zLg0KDQpBZGRpdGlvbmFsbHksIHdlIGV4YW1pbmVkIHdoZXRoZXIgY29udHJvbGxpbmcgZm9yIHBvc3NpYmxlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIHRoZSByZXN1bHRzIG9mIHRoZSBnYW1lIChwb2ludHMgZWFybmVkIGJ5IHRoZSBwYXJ0aWNpcGFudCBhbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwYXJ0aWNpcGFudCdzIGFuZCB0aGUgY29tcHV0ZXIncyBwb2ludHMpIGFuZCB0aGUgRFYgYnkgaW5jbHVkaW5nIHRoZXNlIHZhcmlhYmxlcyBhcyBjb3ZhcmlhdGVzIGluIHRoZSBtb2RlbHMgY2hhbmdlZCB0aGUgcmVzdWx0cy4NCg0KIyMgUmVncmVzc2lvbiBNb2RlbHMgey19DQoNCmBgYHtyIGgyYX0NCg0KIyMgZXN0aW1hdGUgbW9kZWxzDQpoMiA8LSBsbShtb29kLmdiIH4gc3RhdGUuYS5jICsgc3RhdGUuaC5jICsgYWR2LmMgKyBkZWMuYyArIA0KICAgICAgICAgICAgIGNvbmRpdGlvbi5iZWggKyBjb25kaXRpb24uc2l0LCBkYXRhPWRhdGEsIA0KICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoY29uZGl0aW9uLmJlaCA9IGNvbnRyLnN1bSwgY29uZGl0aW9uLnNpdCA9IGNvbnRyLnN1bSkpDQpoMi56IDwtIGxtKHNjYWxlKG1vb2QuZ2IpIH4gc2NhbGUoc3RhdGUuYSkgKyBzY2FsZShzdGF0ZS5oKSArIHNjYWxlKGFkdikgKyBzY2FsZShkZWMpICsgDQogICAgICAgICAgICAgICBjb25kaXRpb24uYmVoICsgY29uZGl0aW9uLnNpdCwgZGF0YT1kYXRhLCANCiAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoY29uZGl0aW9uLmJlaCA9IGNvbnRyLnN1bSwgY29uZGl0aW9uLnNpdCA9IGNvbnRyLnN1bSkpDQoNCiMjIGVzdGltYXRlIG1vZGVscw0KaDJhIDwtIGxtKG1vb2QuZ2IgfiBzdGF0ZS5hLmMgKyBzdGF0ZS5oLmMgKyBhZHYuYyArIGRlYy5jICsgDQogICAgICAgICAgICAgcG9pbnRzLmMgKyBwb2ludHMuZGlmZiArIGNvbmRpdGlvbi5iZWggKyBjb25kaXRpb24uc2l0LCBkYXRhPWRhdGEsIA0KICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoY29uZGl0aW9uLmJlaCA9IGNvbnRyLnN1bSwgY29uZGl0aW9uLnNpdCA9IGNvbnRyLnN1bSkpDQpoMmEueiA8LSBsbShzY2FsZShtb29kLmdiKSB+IHNjYWxlKHN0YXRlLmEpICsgc2NhbGUoc3RhdGUuaCkgKyBzY2FsZShhZHYpICsgc2NhbGUoZGVjKSArIA0KICAgICAgICAgICAgICAgc2NhbGUocG9pbnRzLmMpICsgc2NhbGUocG9pbnRzLmRpZmYpICsgY29uZGl0aW9uLmJlaCArIGNvbmRpdGlvbi5zaXQsIGRhdGE9ZGF0YSwgDQogICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGNvbmRpdGlvbi5iZWggPSBjb250ci5zdW0sIGNvbmRpdGlvbi5zaXQgPSBjb250ci5zdW0pKQ0KI3N1bW1hcnkoaDJhKQ0KDQpoMmEuMiA8LSBsbShtb29kLmdiIH4gc3RhdGUuYS5jICsgc3RhdGUuaC5jICsgYWR2LmMgKyBkZWMuYyArIA0KICAgICAgICAgICAgICAgcG9pbnRzLmMgKyBwb2ludHMuZGlmZiArIGNvbmRpdGlvbi5iZWggKyBjb25kaXRpb24uc2l0ICsNCiAgICAgICAgICAgICAgIHN0YXRlLmEuYyp0cmFpdC5hLmMgKyBzdGF0ZS5oLmMqdHJhaXQuaC5jLCBkYXRhPWRhdGEsIA0KICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChjb25kaXRpb24uYmVoID0gY29udHIuc3VtLCBjb25kaXRpb24uc2l0ID0gY29udHIuc3VtKSkNCmgyYS4yLnogPC0gbG0oc2NhbGUobW9vZC5nYikgfiBzY2FsZShzdGF0ZS5hKSArIHNjYWxlKHN0YXRlLmgpICsgc2NhbGUoYWR2KSArIHNjYWxlKGRlYykgKyANCiAgICAgICAgICAgICAgICAgc2NhbGUocG9pbnRzLmMpICsgc2NhbGUocG9pbnRzLmRpZmYpICsgY29uZGl0aW9uLmJlaCArIGNvbmRpdGlvbi5zaXQgKw0KICAgICAgICAgICAgICAgICBzY2FsZShzdGF0ZS5hKSpzY2FsZSh0cmFpdC5hKSArIHNjYWxlKHN0YXRlLmgpKnNjYWxlKHRyYWl0LmgpLCBkYXRhPWRhdGEsIA0KICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGNvbmRpdGlvbi5iZWggPSBjb250ci5zdW0sIGNvbmRpdGlvbi5zaXQgPSBjb250ci5zdW0pKQ0KI3N1bW1hcnkoaDJhLjIpDQoNCg0KDQojIyBidWlsZCB0YWJsZQ0KDQp0YWIgPC0gZGF0YS5mcmFtZShwcmVkaWN0b3I9cmVwKE5BLCBucm93KHN1bW1hcnkoaDJhLjIpJGNvZWZmaWNpZW50cykrMSksIE1vZGVsMT1OQSwgTW9kZWwyPU5BLCBNb2RlbDM9TkEpDQp0YWJbLDFdIDwtIGMoIihJbnRlcmNlcHQpIiwgIlN0YXRlIEFncmVlYWJsZW5lc3MiLCAiU3RhdGUgSG9uZXN0eS1IdW1pbGl0eSIsICJBZHZlcnNpdHkiLCAiRGVjZXB0aW9uIiwNCiAgICAgICAgICAgICAiUG9pbnRzIGVhcm5lZCIsICJEaWZmZXJlbmNlIGluIHBvaW50cyIsICJCZWhhdmlvciBjb25kaXRpb25zIiwgIlNpdHVhdGlvbiBjb25kaXRpb25zIiwNCiAgICAgICAgICAgICAiVHJhaXQgQWdyZWVhYmxlbmVzcyIsICJUcmFpdCBIb25lc3R5IiwgIlRyYWl0IEEgeCBTdGF0ZSBBIiwgIlRyYWl0IEhIIHggU3RhdGUgSEgiLCAiIikNCnRhYltjKDEsMiwzLDQsNSw4LDkpLDJdIDwtICBjKHBhc3RlMChwcmludG51bShzdW1tYXJ5KGgyLnopJGNvZWZmaWNpZW50c1ssMV0pLCAiICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnMoc3VtbWFyeShoMi56KSRjb2VmZmljaWVudHNbLDRdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlsiLHByaW50bnVtKGNvbmZpbnQoaDIueilbLDFdKSwgIiwgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludG51bShjb25maW50KGgyLnopWywyXSksICJdIikpDQp0YWJbMTpucm93KHN1bW1hcnkoaDJhKSRjb2VmZmljaWVudHMpLDNdIDwtIGMocGFzdGUwKHByaW50bnVtKHN1bW1hcnkoaDJhLnopJGNvZWZmaWNpZW50c1ssMV0pLCAiICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJzKHN1bW1hcnkoaDJhLnopJGNvZWZmaWNpZW50c1ssNF0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPlsiLHByaW50bnVtKGNvbmZpbnQoaDJhLnopWywxXSksICIsICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bnVtKGNvbmZpbnQoaDJhLnopWywyXSksICJdIikpDQp0YWJbMTpucm93KHN1bW1hcnkoaDJhLjIpJGNvZWZmaWNpZW50cyksNF0gPC0gYyhwYXN0ZTAocHJpbnRudW0oc3VtbWFyeShoMmEuMi56KSRjb2VmZmljaWVudHNbLDFdKSwgIiAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJzKHN1bW1hcnkoaDJhLjIueikkY29lZmZpY2llbnRzWyw0XSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5bIixwcmludG51bShjb25maW50KGgyYS4yLnopWywxXSksICIsICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRudW0oY29uZmludChoMmEuMi56KVssMl0pLCAiXSIpKQ0KdGFiW25yb3coc3VtbWFyeShoMmEuMikkY29lZmZpY2llbnRzKSsxLDI6NF0gPC0gYyhwcmludC5jbGVhbihhcGFfcHJpbnQoaDIueikkZXN0aW1hdGUkbW9kZWxmaXQkcjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAocHJpbnQuY2xlYW4oYXBhX3ByaW50KGgyYS56KSRlc3RpbWF0ZSRtb2RlbGZpdCRyMiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiZEZWx0YTsgKlJeMl4qID0gIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bnVtKHN1bW1hcnkoaDJhLnopJHIuc3F1YXJlZCAtIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShoMi56KSRyLnNxdWFyZWQpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICpGKigiLCBhbm92YShoMi56LCBoMmEueilbMiwzXSwgIiwgIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm92YShoMi56LCBoMmEueilbMiwxXSwgIikgPSAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50bnVtKGFub3ZhKGgyLnosIGgyYS56KVsyLDVdKSwgIiwgKnAqICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRwKGFub3ZhKGgyLnosIGgyYS56KVsyLDZdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfZXF1YWxzID0gVCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAocHJpbnQuY2xlYW4oYXBhX3ByaW50KGgyYS4yLnopJGVzdGltYXRlJG1vZGVsZml0JHIyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+JkRlbHRhOyAqUl4yXiogPSAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRudW0oc3VtbWFyeShoMmEuMi56KSRyLnNxdWFyZWQgLSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoaDJhLnopJHIuc3F1YXJlZCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgKkYqKCIsIGFub3ZhKGgyYS56LCBoMmEuMi56KVsyLDNdLCAiLCAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub3ZhKGgyYS56LCBoMmEuMi56KVsyLDFdLCAiKSA9ICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRudW0oYW5vdmEoaDJhLnosIGgyYS4yLnopWzIsNV0pLCAiLCAqcCogIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludHAoYW5vdmEoaDJhLnosIGgyYS4yLnopWzIsNl0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9lcXVhbHMgPSBUKSkpDQoNCiMjIHByaW50IHRhYmxlDQprYWJsZSgNCiAgIHRhYg0KICAgLCBhbGlnbiA9IGMoImwiLCAiYyIsICJjIiwgImMiKQ0KICAgLCBjb2wubmFtZXMgPSBjKCJQcmVkaWN0b3IiLCAiTW9kZWwgMSIsICJNb2RlbCAyIiwgIk1vZGVsIDMiKQ0KICAgLCBjYXB0aW9uID0gIk11bHRpcGxlIHJlZ3Jlc3Npb24gbW9kZWxzIG9mIGFzc29jaWF0aW9ucyBiZXR3ZWVuIHBvc2l0aXZlIGFmZmVjdCBhbmQgc3RhdGUgYWdyZWVhYmxlbmVzcywgc3RhdGUgaG9uZXN0eS1odW1pbGl0eSwgZGVjZXB0aW9uLCBhbmQgYWR2ZXJzaXR5IGNvbnRyb2xsaW5nIGZvciB0aGUgb3V0Y29tZSBvZiB0aGUgZ2FtZSBhbmQgdGhlIGV4cGVyaW1lbnRhbCBncm91cHMuIg0KICAgLCBlc2NhcGUgPSBGQUxTRQ0KICAgLCByb3cubmFtZXMgPSBGQUxTRQ0KKSAlPiUgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmaXhlZF90aGVhZCA9IFQpICAlPiUgDQogICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIxNWVtIikgJT4lDQogICBwYWNrX3Jvd3MoIlN0YW5kYXJkaXplZCBDb2VmZmljaWVudHMiLCAxLCBucm93KHN1bW1hcnkoaDJhLjIpJGNvZWZmaWNpZW50cykpICU+JQ0KICAgcGFja19yb3dzKCJNb2RlbCBGaXQiLCBucm93KHN1bW1hcnkoaDJhLjIpJGNvZWZmaWNpZW50cykrMSwgbnJvdyhzdW1tYXJ5KGgyYS4yKSRjb2VmZmljaWVudHMpKzEpICU+JQ0KICAgZm9vdG5vdGUoZ2VuZXJhbD0iVmFsdWVzIHN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cywgdmFsdWVzIGluIGJyYWNrZXRzIHJlcHJlc2VudCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb2YgdGhlIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIikNCg0KYGBgDQoNCiMjIFZpc3VhbGl6YXRpb24gey19DQoNCmBgYHtyLCBmaWcuYXNwPTAuOCwgZmlnLndpZHRoPTExLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZmlnLmNhcD0iQXNzb2NpYXRpb25zIGJldHdlZW4gcG9zaXRpdmUgYWZmZWN0IGFuZCBzdGF0ZSBhZ3JlZWFibGVuZXNzIChBKSwgc3RhdGUgaG9uZXN0eS1odW1pbGl0eSAoQiksIGFkdmVyc2l0eSAoQyksIGFuZCBkZWNlcHRpb24gKEQpLiJ9DQoNCmEgPC0gZ2dwbG90KGRhdGEsIGFlcyh4PXN0YXRlLmEsIHk9bW9vZC5nYikpICsgDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIlN0YXRlIEFncmVlYWJsZW5lc3MiKSArIHlsYWIoIlBvc2l0aXZlIGFmZmVjdCIpICsNCiAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxLDcpLCBicmVha3M9YygxOjcpLCBsYWJlbHM9YygxOjcpKSArDQogICBnZW9tX2ppdHRlcihzaXplPTIuNSwgYWxwaGE9LjUsIGNvbG9yPWNvbHMuYmVoWzFdKSArIA0KICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSJibGFjayIsIHNpemU9MS4yKQ0KDQpiIDwtIGdncGxvdChkYXRhLCBhZXMoeD1zdGF0ZS5oLCB5PW1vb2QuZ2IpKSArIA0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJTdGF0ZSBIb25lc3R5LUh1bWlsaXR5IikgKyB5bGFiKCJQb3NpdGl2ZSBhZmZlY3QiKSArDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMSw3KSwgYnJlYWtzPWMoMTo3KSwgbGFiZWxzPWMoMTo3KSkgKw0KICAgZ2VvbV9qaXR0ZXIoc2l6ZT0yLjUsIGFscGhhPS41LCBjb2xvcj1jb2xzLmJlaFsyXSkgKyANCiAgIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0iYmxhY2siLCBzaXplPTEuMikNCg0KYyA8LSBnZ3Bsb3QoZGF0YSwgYWVzKHg9YWR2LCB5PW1vb2QuZ2IpKSArIA0KICAgdGhlbWVfcHViKCkgKyB4bGFiKCJBZHZlcnNpdHkiKSArIHlsYWIoIlBvc2l0aXZlIGFmZmVjdCIpICsNCiAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygxLDcpLCBicmVha3M9YygxOjcpLCBsYWJlbHM9YygxOjcpKSArDQogICBnZW9tX2ppdHRlcihzaXplPTIuNSwgYWxwaGE9LjUsIGNvbG9yPWNvbHMuc2l0WzFdKSArIA0KICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSJibGFjayIsIHNpemU9MS4yKQ0KDQpkIDwtIGdncGxvdChkYXRhLCBhZXMoeD1kZWMsIHk9bW9vZC5nYikpICsgDQogICB0aGVtZV9wdWIoKSArIHhsYWIoIkRlY2VwdGlvbiIpICsgeWxhYigiUG9zaXRpdmUgYWZmZWN0IikgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDEsNyksIGJyZWFrcz1jKDE6NyksIGxhYmVscz1jKDE6NykpICsNCiAgIGdlb21faml0dGVyKHNpemU9Mi41LCBhbHBoYT0uNSwgY29sb3I9Y29scy5zaXRbMl0pICsgDQogICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xLjIpDQoNCnIxIDwtIChhICsgcGxvdF9zcGFjZXIoKSArIGIpICsgcGxvdF9sYXlvdXQod2lkdGhzPWMoMSwwLjEsMSkpDQpyMiA8LSAoYyArIHBsb3Rfc3BhY2VyKCkgKyBkKSArIHBsb3RfbGF5b3V0KHdpZHRocz1jKDEsMC4xLDEpKQ0KDQpyMS8NCiAgIHBsb3Rfc3BhY2VyKCkgLw0KICAgcjIgKyBwbG90X2Fubm90YXRpb24odGFnX2xldmVsPSJBIikgKyBwbG90X2xheW91dChoZWlnaHRzPWMoMSwwLjEsMSkpDQoNCmBgYA0KDQoNCg0KDQojIyBDb25jbHVzaW9uIHstfQ0KDQpPdmVyYWxsLCB0aGUgZGF0YSBtb3N0bHkgc3VwcG9ydGVkIEh5cG90aGVzaXMgMjoNCg0KKiBIaWdoZXIgbGV2ZWxzIG9mIHN0YXRlIGFncmVlYWJsZW5lc3MsIGByIHByaW50LmNsZWFuKGFwYV9wcmludChoMmEuMi56KSRlc3RpbWF0ZSRzY2FsZXN0YXRlX2EsIHN0YW5kYXJkaXplZD1UKWAsIGFuZCBzdGF0ZSBob25lc3R5LWh1bWlsaXR5LCBgciBwcmludC5jbGVhbihhcGFfcHJpbnQoaDJhLjIueikkZXN0aW1hdGUkc2NhbGVzdGF0ZV9oLCBzdGFuZGFyZGl6ZWQ9VClgLCB3ZXJlIHNpZ25pZmljYW50bHkgYXNzb2NpYXRlZCB3aXRoIG1vcmUgcG9zaXRpdmUgYWZmZWN0IHdpdGhpbiBncm91cHMNCg0KKiBIaWdoZXIgbGV2ZWxzIG9mIHBlcmNlaXZlZCBhZHZlcnNpdHksIGByIHByaW50LmNsZWFuKGFwYV9wcmludChoMmEuMi56KSRlc3RpbWF0ZSRzY2FsZWFkdiwgc3RhbmRhcmRpemVkPVQpYCwgYnV0IG5vdCBkZWNlcHRpb24sIGByIHByaW50LmNsZWFuKGFwYV9wcmludChoMmEuMi56KSRlc3RpbWF0ZSRzY2FsZWRlYywgc3RhbmRhcmRpemVkPVQpYCwgd2VyZSBzaWduaWZpY2FudGx5IGFzc29jaWF0ZWQgd2l0aCBsZXNzIHBvc2l0aXZlIGFmZmVjdCB3aXRoaW4gZ3JvdXBzDQoNCiogVHJhaXQgYWdyZWVhYmxlbmVzcyBhbmQgdHJhaXQgYWR2ZXJzaXR5IHdlcmUgbm90IHNpZ25pZmljYW50bHkgYXNzb2NpYXRlZCB3aXRoIHBvc2l0aXZlIGFmZmVjdCBhbmQgbmVpdGhlciB3ZXJlIHRoZWlyIGludGVyYWN0aW9ucyB3aXRoIHRoZSByZXNwZWN0aXZlIHBlcnNvbmFsaXR5IHRyYWl0cw0KDQoNCiMgQ29uZ3J1ZW5jZSBhbmQgUG9zaXRpdmUgQWZmZWN0IHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KIyMgSHlwb3RoZXNpcyAmIEFuYWx5dGljIFN0cmF0ZWd5IHstfQ0KDQojIyMgSHlwb3RoZXNpcyB7LX0NCg0KSDNhOiBDb25ncnVlbmNlIGJldHdlZW4gcGVyc29uYWxpdHkgdHJhaXQgYW5kIHBlcnNvbmFsaXR5IHN0YXRlIGlzIGFzc29jaWF0ZWQgd2l0aCBwb3NpdGl2ZSBhZmZlY3Qgc3VjaCB0aGF0IHRyYWl0LWNvbmdydWVudCBwZXJzb25hbGl0eSBzdGF0ZXMgYXJlIHJlbGF0ZWQgdG8gbW9yZSBwb3NpdGl2ZSBtb29kIHRoYW4gdHJhaXQtaW5jb25ncnVlbnQgcGVyc29uYWxpdHkgc3RhdGVzLg0KDQpINGE6IENvbmdydWVuY2UgYmV0d2VlbiBwZXJzb25hbGl0eSBzdGF0ZSBhbmQgc2l0dWF0aW9uIGNoYXJhY3RlcmlzdGljIGlzIGFzc29jaWF0ZWQgd2l0aCBwb3NpdGl2ZSBhZmZlY3Qgc3VjaCB0aGF0IHNpdHVhdGlvbi1jb25ncnVlbnQgcGVyc29uYWxpdHkgc3RhdGVzIGFyZSByZWxhdGVkIHRvIG1vcmUgcG9zaXRpdmUgbW9vZCB0aGFuIHNpdHVhdGlvbi1pbmNvbmdydWVudCBwZXJzb25hbGl0eSBzdGF0ZXMuDQoNCiMjIyBBbmFseXRpYyBTdHJhdGVneSB7LX0gDQoNCioqU3RlcCAxOiBBbmFseXNpcyBvZiBWYXJpYW5jZSoqICANCldlIGNvbmR1Y3RlZCBhIG1lZGlhbiBzcGxpdCBvZiB0cmFpdCBBZ3JlZWFibGVuZXNzIC8gdHJhaXQgSG9uZXN0eS1IdW1pbGl0eSBhbmQgY29uZHVjdCB2YXJpYW5jZSBhbmFseXNlcyB3aXRoIHBvc2l0aXZlIGFmZmVjdCBhcyBEViBhbmQgdGhlIHZhcmlhYmxlcyByZXByZXNlbnRpbmcgYmVoYXZpb3IgY29uZGl0aW9ucyBhbmQgbWVkaWFuLXNwbGl0IHBlcnNvbmFsaXR5IHRyYWl0cyBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gYXMgSVZzLiBUaGlzIHJlcGxpY2F0ZXMgYW5hbHlzZXMgcGVyZm9ybWVkIGluIFplbGVuc2tpIGV0IGFsLiAoMjAxMikuDQoNCkFkZGl0aW9uYWxseSwgd2UgZXhhbWluZWQgd2hldGhlciBjb250cm9sbGluZyBmb3IgcG9zc2libGUgYXNzb2NpYXRpb25zIGJldHdlZW4gdGhlIHJlc3VsdHMgb2YgdGhlIGdhbWUgKHBvaW50cyBlYXJuZWQgYnkgdGhlIHBhcnRpY2lwYW50IGFuZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBhcnRpY2lwYW50J3MgYW5kIHRoZSBjb21wdXRlcidzIHBvaW50cykgYW5kIHRoZSBEViBieSBpbmNsdWRpbmcgdGhlc2UgdmFyaWFibGVzIGFzIGNvdmFyaWF0ZXMgaW4gdGhlIG1vZGVscyBjaGFuZ2VkIHRoZSByZXN1bHRzLg0KDQoqKlN0ZXAgMjogUmVzcG9uc2UgU3VyZmFjZSBBbmFseXNpcyoqICANCldlIGNvbmR1Y3RlZCByZXNwb25zZSBzdXJmYWNlIGFuYWx5c2VzIHdpdGggbWlkcG9pbnQtY2VudGVyZWQgcGVyc29uYWxpdHkgc3RhdGUgYW5kIG1pZHBvaW50LWNlbnRlcmVkIHBlcnNvbmFsaXR5IHRyYWl0IGFzIElWcyBhbmQgcG9zaXRpdmUgYWZmZWN0IGFzIERWLiBXZSBpbmNsdWRlZCB0aGUgZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgYXMgY292YXJpYXRlcyBpbiB0aGUgcG9seW5vbWlhbCByZWdyZXNzaW9ucyB0byBjb250cm9sIGZvciB0aGUgaGllcmFyY2hpY2FsIGRhdGEgc3RydWN0dXJlIHdpdGggcGFydGljaXBhbnRzIG5lc3RlZCBpbiBleHBlcmltZW50YWwgY29uZGl0aW9ucy4gDQoNCkFkZGl0aW9uYWxseSwgd2UgZXhhbWluZWQgd2hldGhlciBjb250cm9sbGluZyBmb3IgcG9zc2libGUgYXNzb2NpYXRpb25zIGJldHdlZW4gdGhlIHJlc3VsdHMgb2YgdGhlIGdhbWUgKHBvaW50cyBlYXJuZWQgYnkgdGhlIHBhcnRpY2lwYW50IGFuZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBhcnRpY2lwYW50J3MgYW5kIHRoZSBjb21wdXRlcidzIHBvaW50cykgYW5kIHRoZSBEViBieSBpbmNsdWRpbmcgdGhlc2UgdmFyaWFibGVzIGFzIGNvdmFyaWF0ZXMgaW4gdGhlIG1vZGVscyBjaGFuZ2VkIHRoZSByZXN1bHRzLg0KDQoNCiMjIEFuYWx5c2lzIG9mIFZhcmlhbmNlIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KIyMjIFRyYWl0LS1TdGF0ZSBDb25ncnVlbmNlOiBBZ3JlZWFibGVuZXNzIHstfQ0KDQojIyMjIE1vZGVsIHdpdGhvdXQgQ292YXJpYXRlcyB7LX0NCg0KYGBge3IgYW92LWdiLWEsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQ0KDQphb3YuYSA8LSBhb3ZfY2FyKG1vb2QuZ2IgfiB0cmFpdC5hLm1zICogY29uZGl0aW9uLmJlaCArIGNvbmRpdGlvbi5zaXQgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1kYXRhKQ0KDQoNCnRhYiA8LSBhcy5kYXRhLmZyYW1lKG5pY2UoYW92LmEsIGVzPSJwZXMiLCBzaWdfc3ltYm9scyA9IHJlcCgiIiwgNCksIE1TRT1GQUxTRSkpDQoNCnRhYiRwLnZhbHVlW3RhYiRwLnZhbHVlPT0iPC4wMDEiXSA8LSAiJmx0OyAuMDAxIg0KdGFiJHBlc1t0YWIkcGVzPT0iPC4wMDEiXSA8LSAiJmx0Oy4wMDEiDQp0YWIkRWZmZWN0IDwtIGMoIlRyYWl0IChtZWRpYW4tc3BsaXQpIiwgIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiLCANCiAgICAgICAgICAgICAgICAiVHJhaXQgeCBCZWhhdmlvciBjb25kaXRpb25zIikNCg0Ka2FibGUodGFiLA0KICAgICAgZXNjYXBlPUYsDQogICAgICBjb2wubmFtZXM9YygiRWZmZWN0IiwgImRmIiwgIkYiLCAiJiM5NTE7PHN1Yj5wPC9zdWI+PHN1cD4yPC9zdXA+IiwgIjxpPnA8L2k+IiksDQogICAgICBjYXB0aW9uPSJBbmFseXNlcyBvZiB2YXJpYW5jZSBleGFtaW5pbmcgYXNzb2NpYXRpb25zIGJldHdlZW4gbWVkaWFuLXNwbGl0IHBlcnNvbmFsaXR5IHRyYWl0cywgdGhlIGJlaGF2aW9yIG1hbmlwdWxhdGlvbiBhbmQgcG9zaXRpdmUgYWZmZWN0LiIpICU+JSANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCANCiAgICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMSksIHdpZHRoID0gIjE1ZW0iKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDI6NCksIHdpZHRoID0gIjhlbSIpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9IldlIGluY2x1ZGVkIHRoZSBzaXR1YXRpb24gY29uZGl0aW9ucyBhcyBjb3ZhcmlhdGVzIGluIHRoaXMgbW9kZWwgdG8gY29udHJvbCBmb3IgZGVwZW5kZW5jaWVzIGFtb25nIHBhcnRpY2lwYW50cyB3aG8gZXhwZXJpZW5jZWQgdGhlIHNhbWUgc2l0dWF0aW9uIGNvbmRpdGlvbi4gU2l0dWF0aW9uIGNvbmRpdGlvbnMsIG1lZGlhbi1zcGxpdCBwZXJzb25hbGl0eSB0cmFpdHMsIGFuZCBiZWhhdmlvciBjb25kaXRpb25zIHdlcmUgZWZmZWN0LWNvZGVkLiIpDQoNCmBgYA0KDQojIyMjIE1vZGVsIHdpdGggQ292YXJpYXRlcyB7LX0NCg0KYGBge3IgYW92LWdiLWEtY292LCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0NCg0KbG0uYSA8LSBsbShtb29kLmdiIH4gdHJhaXQuYS5tcyAqIGNvbmRpdGlvbi5iZWggKyBwb2ludHMuYyArIHBvaW50cy5kaWZmICsgY29uZGl0aW9uLnNpdCwgZGF0YT1kYXRhLCANCiAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChjb25kaXRpb24uc2l0PWNvbnRyLnN1bSwgdHJhaXQuYS5tcz1jb250ci5zdW0sIGNvbmRpdGlvbi5iZWg9Y29udHIuc3VtKSkNCg0KDQp0YWIgPC0gYXBhX3ByaW50KGNhcjo6QW5vdmEobG0uYSwgdHlwZT0zKSkkdGFibGUNCnRhYiRkZnMgPC0gcGFzdGUwKHRhYiRkZiwgIiwgIiwgdGFiJGRmLnJlc2lkdWFsKQ0KdGFiJHRlcm0gPC0gYygiVHJhaXQgKG1lZGlhbi1zcGxpdCkiLCAiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJQb2ludHMgZWFybmVkIiwgDQogICAgICAgICAgICAgICJEaWZmZXJlbmNlIGluIHBvaW50cyIsICJTaXR1YXRpb24gY29uZGl0aW9ucyIsICJUcmFpdCB4IEJlaGF2aW9yIGNvbmRpdGlvbnMiKQ0KDQoNCmthYmxlKHRhYlssYygxLDgsMywyLDcpXSwNCiAgICAgIGVzY2FwZT1GLA0KICAgICAgcm93Lm5hbWVzID0gRiwNCiAgICAgIGFsaWduPWMoImwiLCAiciIsICJyIiwgInIiLCAiciIpLA0KICAgICAgY29sLm5hbWVzPWMoIkVmZmVjdCIsICJkZiIsICJGIiwgIiYjOTUxOzxzdWI+cDwvc3ViPjxzdXA+Mjwvc3VwPiIsICI8aT5wPC9pPiIpLA0KICAgICAgY2FwdGlvbj0iQW5hbHlzZXMgb2YgdmFyaWFuY2UgZXhhbWluaW5nIGFzc29jaWF0aW9ucyBiZXR3ZWVuIG1lZGlhbi1zcGxpdCBwZXJzb25hbGl0eSB0cmFpdHMsIHRoZSBiZWhhdmlvciBtYW5pcHVsYXRpb24gYW5kIHBvc2l0aXZlIGFmZmVjdCB3aXRoIGFkZGl0aW9uYWwgY292YXJpYXRlcyBjb250cm9sbGluZyBmb3IgdGhlIHJlc3VsdHMgb2YgdGhlIGdhbWUuIikgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIA0KICAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsIGZpeGVkX3RoZWFkID0gVCkgJT4lIA0KICAgY29sdW1uX3NwZWMoYygxKSwgd2lkdGggPSAiMjBlbSIpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMjo0KSwgd2lkdGggPSAiOGVtIikgJT4lIA0KICAgZm9vdG5vdGUoZ2VuZXJhbD0iV2UgaW5jbHVkZWQgdGhlIHNpdHVhdGlvbiBjb25kaXRpb25zIGFzIGNvdmFyaWF0ZXMgaW4gdGhpcyBtb2RlbCB0byBjb250cm9sIGZvciBkZXBlbmRlbmNpZXMgYW1vbmcgcGFydGljaXBhbnRzIHdobyBleHBlcmllbmNlZCB0aGUgc2FtZSBzaXR1YXRpb24gY29uZGl0aW9uLiBTaXR1YXRpb24gY29uZGl0aW9ucywgbWVkaWFuLXNwbGl0IHBlcnNvbmFsaXR5IHRyYWl0cywgYW5kIGJlaGF2aW9yIGNvbmRpdGlvbnMgd2VyZSBlZmZlY3QtY29kZWQuIikNCg0KYGBgDQoNCiMjIyBUcmFpdC0tU3RhdGUgQ29uZ3J1ZW5jZTogSG9uZXN0eSB7LX0NCg0KIyMjIyBNb2RlbCB3aXRob3V0IENvdmFyaWF0ZXMgey19DQoNCmBgYHtyIGFvdi1nYi1oLCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0NCg0KYW92LmggPC0gYW92X2Nhcihtb29kLmdiIH4gdHJhaXQuaC5tcyAqIGNvbmRpdGlvbi5iZWggKyBjb25kaXRpb24uc2l0ICsgRXJyb3IoUmVzcG9uc2VJZCksIGRhdGE9ZGF0YSkNCg0KDQp0YWIgPC0gYXMuZGF0YS5mcmFtZShuaWNlKGFvdi5oLCBlcz0icGVzIiwgc2lnX3N5bWJvbHMgPSByZXAoIiIsIDQpLCBNU0U9RkFMU0UpKQ0KDQp0YWIkcC52YWx1ZVt0YWIkcC52YWx1ZT09IjwuMDAxIl0gPC0gIiZsdDsgLjAwMSINCnRhYiRwZXNbdGFiJHBlcz09IjwuMDAxIl0gPC0gIiZsdDsuMDAxIg0KdGFiJEVmZmVjdCA8LSBjKCJUcmFpdCAobWVkaWFuLXNwbGl0KSIsICJCZWhhdmlvciBjb25kaXRpb25zIiwgIlNpdHVhdGlvbiBjb25kaXRpb25zIiwgDQogICAgICAgICAgICAgICAgIlRyYWl0IHggQmVoYXZpb3IgY29uZGl0aW9ucyIpDQoNCmthYmxlKHRhYiwNCiAgICAgIGVzY2FwZT1GLA0KICAgICAgY29sLm5hbWVzPWMoIkVmZmVjdCIsICJkZiIsICJGIiwgIiYjOTUxOzxzdWI+cDwvc3ViPjxzdXA+Mjwvc3VwPiIsICI8aT5wPC9pPiIpLA0KICAgICAgY2FwdGlvbj0iQW5hbHlzZXMgb2YgdmFyaWFuY2UgZXhhbWluaW5nIGFzc29jaWF0aW9ucyBiZXR3ZWVuIG1lZGlhbi1zcGxpdCBwZXJzb25hbGl0eSB0cmFpdHMsIHRoZSBiZWhhdmlvciBtYW5pcHVsYXRpb24gYW5kIHBvc2l0aXZlIGFmZmVjdC4iKSAlPiUgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgDQogICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IiwgZml4ZWRfdGhlYWQgPSBUKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDEpLCB3aWR0aCA9ICIxNWVtIikgJT4lIA0KICAgY29sdW1uX3NwZWMoYygyOjQpLCB3aWR0aCA9ICI4ZW0iKSAlPiUgDQogICBmb290bm90ZShnZW5lcmFsPSJXZSBpbmNsdWRlZCB0aGUgc2l0dWF0aW9uIGNvbmRpdGlvbnMgYXMgY292YXJpYXRlcyBpbiB0aGlzIG1vZGVsIHRvIGNvbnRyb2wgZm9yIGRlcGVuZGVuY2llcyBhbW9uZyBwYXJ0aWNpcGFudHMgd2hvIGV4cGVyaWVuY2VkIHRoZSBzYW1lIHNpdHVhdGlvbiBjb25kaXRpb24uIFNpdHVhdGlvbiBjb25kaXRpb25zLCBtZWRpYW4tc3BsaXQgcGVyc29uYWxpdHkgdHJhaXRzLCBhbmQgYmVoYXZpb3IgY29uZGl0aW9ucyB3ZXJlIGVmZmVjdC1jb2RlZC4iKQ0KDQpgYGANCg0KIyMjIyBNb2RlbCB3aXRoIENvdmFyaWF0ZXMgey19DQoNCmBgYHtyIGFvdi1nYi1oLWNvdiwgd2FybmluZz1GLCBtZXNzYWdlPUZ9DQoNCmxtLmggPC0gbG0obW9vZC5nYiB+IHRyYWl0LmgubXMgKiBjb25kaXRpb24uYmVoICsgcG9pbnRzLmMgKyBwb2ludHMuZGlmZiArIGNvbmRpdGlvbi5zaXQsIGRhdGE9ZGF0YSwgDQogICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoY29uZGl0aW9uLnNpdD1jb250ci5zdW0sIHRyYWl0LmgubXM9Y29udHIuc3VtLCBjb25kaXRpb24uYmVoPWNvbnRyLnN1bSkpDQoNCg0KdGFiIDwtIGFwYV9wcmludChjYXI6OkFub3ZhKGxtLmgsIHR5cGU9MykpJHRhYmxlDQp0YWIkZGZzIDwtIHBhc3RlMCh0YWIkZGYsICIsICIsIHRhYiRkZi5yZXNpZHVhbCkNCnRhYiR0ZXJtIDwtIGMoIlRyYWl0IChtZWRpYW4tc3BsaXQpIiwgIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiUG9pbnRzIGVhcm5lZCIsIA0KICAgICAgICAgICAgICAiRGlmZmVyZW5jZSBpbiBwb2ludHMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiLCAiVHJhaXQgeCBCZWhhdmlvciBjb25kaXRpb25zIikNCg0KDQprYWJsZSh0YWJbLGMoMSw4LDMsMiw3KV0sDQogICAgICBlc2NhcGU9RiwNCiAgICAgIHJvdy5uYW1lcyA9IEYsDQogICAgICBhbGlnbj1jKCJsIiwgInIiLCAiciIsICJyIiwgInIiKSwNCiAgICAgIGNvbC5uYW1lcz1jKCJFZmZlY3QiLCAiZGYiLCAiRiIsICImIzk1MTs8c3ViPnA8L3N1Yj48c3VwPjI8L3N1cD4iLCAiPGk+cDwvaT4iKSwNCiAgICAgIGNhcHRpb249IkFuYWx5c2VzIG9mIHZhcmlhbmNlIGV4YW1pbmluZyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBtZWRpYW4tc3BsaXQgcGVyc29uYWxpdHkgdHJhaXRzLCB0aGUgYmVoYXZpb3IgbWFuaXB1bGF0aW9uIGFuZCBwb3NpdGl2ZSBhZmZlY3Qgd2l0aCBhZGRpdGlvbmFsIGNvdmFyaWF0ZXMgY29udHJvbGxpbmcgZm9yIHRoZSByZXN1bHRzIG9mIHRoZSBnYW1lLiIpICU+JSANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCANCiAgICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMSksIHdpZHRoID0gIjIwZW0iKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDI6NCksIHdpZHRoID0gIjhlbSIpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9IldlIGluY2x1ZGVkIHRoZSBzaXR1YXRpb24gY29uZGl0aW9ucyBhcyBjb3ZhcmlhdGVzIGluIHRoaXMgbW9kZWwgdG8gY29udHJvbCBmb3IgZGVwZW5kZW5jaWVzIGFtb25nIHBhcnRpY2lwYW50cyB3aG8gZXhwZXJpZW5jZWQgdGhlIHNhbWUgc2l0dWF0aW9uIGNvbmRpdGlvbi4gU2l0dWF0aW9uIGNvbmRpdGlvbnMsIG1lZGlhbi1zcGxpdCBwZXJzb25hbGl0eSB0cmFpdHMsIGFuZCBiZWhhdmlvciBjb25kaXRpb25zIHdlcmUgZWZmZWN0LWNvZGVkLiIpDQoNCmBgYA0KDQojIyMgU3RhdGUtLVNpdHVhdGlvbiBDb25ncnVlbmNlIHstfQ0KDQojIyMjIE1vZGVsIHdpdGhvdXQgQ292YXJpYXRlcyB7LX0NCg0KYGBge3IgYW92LWdiLXNpdCwgd2FybmluZz1GLCBtZXNzYWdlPUZ9DQoNCmFvdi5zaXQgPC0gYW92X2Nhcihtb29kLmdiIH4gY29uZGl0aW9uLmJlaCAqIGNvbmRpdGlvbi5zaXQgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1kYXRhKQ0KDQoNCnRhYiA8LSBhcy5kYXRhLmZyYW1lKG5pY2UoYW92LnNpdCwgZXM9InBlcyIsIHNpZ19zeW1ib2xzID0gcmVwKCIiLCA0KSwgTVNFPUZBTFNFKSkNCg0KdGFiJHAudmFsdWVbdGFiJHAudmFsdWU9PSI8LjAwMSJdIDwtICImbHQ7IC4wMDEiDQp0YWIkcGVzW3RhYiRwZXM9PSI8LjAwMSJdIDwtICImbHQ7LjAwMSINCnRhYiRFZmZlY3QgPC0gYygiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJTaXR1YXRpb24gY29uZGl0aW9ucyIsIA0KICAgICAgICAgICAgICAgICJTaXR1YXRpb24geCBCZWhhdmlvciBjb25kaXRpb25zIikNCg0Ka2FibGUodGFiLA0KICAgICAgZXNjYXBlPUYsDQogICAgICBjb2wubmFtZXM9YygiRWZmZWN0IiwgImRmIiwgIkYiLCAiJiM5NTE7PHN1Yj5wPC9zdWI+PHN1cD4yPC9zdXA+IiwgIjxpPnA8L2k+IiksDQogICAgICBjYXB0aW9uPSJBbmFseXNlcyBvZiB2YXJpYW5jZSBleGFtaW5pbmcgYXNzb2NpYXRpb25zIGJldHdlZW4gdGhlIHNpdHVhdGlvbiBjb25kaXRpb25zIGFuZCB0aGUgYmVoYXZpb3IgbWFuaXB1bGF0aW9uIGFuZCBwb3NpdGl2ZSBhZmZlY3QuIikgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIA0KICAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsIGZpeGVkX3RoZWFkID0gVCkgJT4lIA0KICAgY29sdW1uX3NwZWMoYygxKSwgd2lkdGggPSAiMTVlbSIpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMjo0KSwgd2lkdGggPSAiOGVtIikgICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9IlNpdHVhdGlvbiBjb25kaXRpb25zIGFuZCBiZWhhdmlvciBjb25kaXRpb25zIHdlcmUgZWZmZWN0LWNvZGVkLiIpDQoNCmBgYA0KDQojIyMjIE1vZGVsIHdpdGggQ292YXJpYXRlcyB7LX0NCg0KYGBge3IgYW92LWdiLXNpdC1jb3YsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQ0KDQpkYXRhJHBvaW50cy5jIDwtIHNjYWxlKGRhdGEkcG9pbnRzLCBzY2FsZT1GQUxTRSkNCg0KbG0uc2l0IDwtIGxtKG1vb2QuZ2IgfiBjb25kaXRpb24uc2l0ICogY29uZGl0aW9uLmJlaCArIHBvaW50cy5jICsgcG9pbnRzLmRpZmYsIGRhdGE9ZGF0YSwgDQogICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChjb25kaXRpb24uc2l0PWNvbnRyLnN1bSwgY29uZGl0aW9uLmJlaD1jb250ci5zdW0pKQ0KDQoNCg0KdGFiIDwtIGFwYV9wcmludChjYXI6OkFub3ZhKGxtLnNpdCwgdHlwZT0zKSkkdGFibGUNCnRhYiRkZnMgPC0gcGFzdGUwKHRhYiRkZiwgIiwgIiwgdGFiJGRmLnJlc2lkdWFsKQ0KdGFiJHRlcm0gPC0gYygiU2l0dWF0aW9uIGNvbmRpdGlvbnMiLCAiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJQb2ludHMgZWFybmVkIiwgDQogICAgICAgICAgICAgICJEaWZmZXJlbmNlIGluIHBvaW50cyIsICJTaXR1YXRpb24geCBCZWhhdmlvciBjb25kaXRpb25zIikNCg0KDQprYWJsZSh0YWJbLGMoMSw4LDMsMiw3KV0sDQogICAgICBlc2NhcGU9RiwNCiAgICAgIHJvdy5uYW1lcyA9IEYsDQogICAgICBhbGlnbj1jKCJsIiwgInIiLCAiciIsICJyIiwgInIiKSwNCiAgICAgIGNvbC5uYW1lcz1jKCJFZmZlY3QiLCAiZGYiLCAiRiIsICImIzk1MTs8c3ViPnA8L3N1Yj48c3VwPjI8L3N1cD4iLCAiPGk+cDwvaT4iKSwNCiAgICAgIGNhcHRpb249IkFuYWx5c2VzIG9mIHZhcmlhbmNlIGV4YW1pbmluZyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBtZWRpYW4tc3BsaXQgcGVyc29uYWxpdHkgdHJhaXRzLCB0aGUgYmVoYXZpb3IgbWFuaXB1bGF0aW9uIGFuZCBwb3NpdGl2ZSBhZmZlY3Qgd2l0aCBhZGRpdGlvbmFsIGNvdmFyaWF0ZXMgY29udHJvbGxpbmcgZm9yIHRoZSByZXN1bHRzIG9mIHRoZSBnYW1lLiIpICU+JSANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCANCiAgICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMSksIHdpZHRoID0gIjIwZW0iKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDI6NCksIHdpZHRoID0gIjhlbSIpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9IlNpdHVhdGlvbiBjb25kaXRpb25zIGFuZCBiZWhhdmlvciBjb25kaXRpb25zIHdlcmUgZWZmZWN0LWNvZGVkLiIpDQoNCmBgYA0KDQojIyBSZXNwb25zZSBTdXJmYWNlIEFuYWx5c2lzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KYGBge3IgcGEtcnNhLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9DQoNCmNvbnRyYXN0cyhkYXRhJGNvbmRpdGlvbi5zaXQpIDwtIGNvbnRyLnN1bSgyKQ0KY29udHJhc3RzKGRhdGEkY29uZGl0aW9uLmJlaCkgPC0gY29udHIuc3VtKDIpDQoNCmRhdGEkdHJhaXQuYS5sb25nIDwtIDYqKGRhdGEkdHJhaXQuYS0xKS80KzENCmRhdGEkdHJhaXQuaC5sb25nIDwtIDYqKGRhdGEkdHJhaXQuaC0xKS80KzENCmRhdGEkdHJhaXQuYS5sb25nLm1jIDwtIGRhdGEkdHJhaXQuYS5sb25nLTQNCmRhdGEkdHJhaXQuaC5sb25nLm1jIDwtIGRhdGEkdHJhaXQuaC5sb25nLTQNCg0KaDNhLnJzYS5hIDwtIFJTQShtb29kLmdiIH4gc3RhdGUuYS5tYyp0cmFpdC5hLmxvbmcubWMsIGRhdGE9ZGF0YSwgDQogICAgICAgICAgICAgICAgIG1vZGVsPSJmdWxsIiwgdmVyYm9zZT1GLA0KICAgICAgICAgICAgICAgICBjb250cm9sLnZhcmlhYmxlcyA9IGMoImNvbmRpdGlvbi5iZWgiLCAiY29uZGl0aW9uLnNpdCIpKQ0KDQpoM2EucnNhLmggPC0gUlNBKG1vb2QuZ2IgfiBzdGF0ZS5oLm1jKnRyYWl0LmgubG9uZy5tYywgZGF0YT1kYXRhLCANCiAgICAgICAgICAgICAgICAgbW9kZWw9ImZ1bGwiLCB2ZXJib3NlPUYsDQogICAgICAgICAgICAgICAgIGNvbnRyb2wudmFyaWFibGVzID0gYygiY29uZGl0aW9uLmJlaCIsICJjb25kaXRpb24uc2l0IikpDQoNCmg0YS5yc2EuYS5hIDwtIFJTQShtb29kLmdiIH4gc3RhdGUuYS5tYyphZHYubWMuciwgZGF0YT1kYXRhLCANCiAgICAgICAgICAgICAgICAgICBtb2RlbD0iZnVsbCIsIHZlcmJvc2U9RiwNCiAgICAgICAgICAgICAgICAgICBjb250cm9sLnZhcmlhYmxlcyA9IGMoImNvbmRpdGlvbi5iZWgiLCAiY29uZGl0aW9uLnNpdCIpKQ0KaDRhLnJzYS5hLmQgPC0gUlNBKG1vb2QuZ2IgfiBzdGF0ZS5hLm1jKmRlYy5tYy5yLCBkYXRhPWRhdGEsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsPSJmdWxsIiwgdmVyYm9zZT1GLA0KICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudmFyaWFibGVzID0gYygiY29uZGl0aW9uLmJlaCIsICJjb25kaXRpb24uc2l0IikpDQpoNGEucnNhLmguYSA8LSBSU0EobW9vZC5nYiB+IHN0YXRlLmgubWMqYWR2Lm1jLnIsIGRhdGE9ZGF0YSwgDQogICAgICAgICAgICAgICAgICAgbW9kZWw9ImZ1bGwiLCB2ZXJib3NlPUYsDQogICAgICAgICAgICAgICAgICAgY29udHJvbC52YXJpYWJsZXMgPSBjKCJjb25kaXRpb24uYmVoIiwgImNvbmRpdGlvbi5zaXQiKSkNCmg0YS5yc2EuaC5kIDwtIFJTQShtb29kLmdiIH4gc3RhdGUuaC5tYypkZWMubWMuciwgZGF0YT1kYXRhLCANCiAgICAgICAgICAgICAgICAgICBtb2RlbD0iZnVsbCIsIHZlcmJvc2U9RiwNCiAgICAgICAgICAgICAgICAgICBjb250cm9sLnZhcmlhYmxlcyA9IGMoImNvbmRpdGlvbi5iZWgiLCAiY29uZGl0aW9uLnNpdCIpKQ0KDQpgYGANCg0KIyMjIFRyYWl0LS1TdGF0ZSBDb25ncnVlbmNlOiBBZ3JlZWFibGVuZXNzIHstfQ0KDQpgYGB7ciBwYS1yc2EtdGFibGVzLWEsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KDQp0YWIgPC0gZ2V0UGFyKGgzYS5yc2EuYSwgc3RhbmRhcmRpemVkPVRSVUUpW2MoOCwgMTo3LCA5OjEzKSxdDQp0YWIkY2kgPC0gcGFzdGUwKCJbIixwcmludG51bSh0YWIkY2kubG93ZXIpLCAiLCAiLCBwcmludG51bSh0YWIkY2kudXBwZXIpLCAiXSIpDQp0YWIkcHZhbHVlIDwtIHByaW50cCh0YWIkcHZhbHVlKQ0Kcm93Lm5hbWVzKHRhYilbMTo4XSA8LSBjKCIoSW50ZXJjZXB0KSIsICJTdGF0ZSBBIiwgIlRyYWl0IEEiLCAiU3RhdGUgQTxzdXA+Mjwvc3VwPiIsICJTdGF0ZSBBIHggVHJhaXQgQSIsICJUcmFpdCBBPHN1cD4yPC9zdXA+IiwgIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKQ0KDQoNCiMjIHByaW50IHRhYmxlDQprYWJsZSh0YWJbLGMoMSwyLDExLDksNSldDQogICAgICAsIGRpZ2l0cz1jKDIsMiwyLDIsMikNCiAgICAgICwgYWxpZ24gPSBjKCJsIiwgInIiLCAiciIsICJyIiwgInIiLCAiciIpDQogICAgICAsIGNvbC5uYW1lcyA9IGMoIkxhYmVsIiwgIjxpPmI8L2k+IiwgIjk1JSBDb25maWRlbmNlIEludGVydmFsIiwgIiZiZXRhOyIsICI8aT5wPC9pPiB2YWx1ZSIpDQogICAgICAsIGNhcHRpb24gPSAiUGFyYW1ldGVycyBvZiB0aGUgcmVzcG9uc2Ugc3VyZmFjZSBhbmFseXNpcyBvZiB0cmFpdCBhZ3JlZWFibGVuZXNzIGFuZCBzdGF0ZSBhZ3JlZWFibGVuZXNzIHByZWRpY3RpbmcgcG9zaXRpdmUgYWZmZWN0LiINCiAgICAgICwgZXNjYXBlID0gRkFMU0UNCikgJT4lIA0KICAgcGFja19yb3dzKCJSZWdyZXNzaW9uIFBhcmFtZXRlcnMiLCAxLCA4KSAlPiUNCiAgIHBhY2tfcm93cygiUmVzcG9uc2UgU3VyZmFjZSBQYXJhbWV0ZXJzIiwgOSwgMTMpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9ImIgcmVwcmVzZW50cyB1bnN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cywgJmJldGE7IHJlcHJlc2VudHMgc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gY29lZmljaWVudHMuIFN0YXRlIEEgcmVwcmVzZW50cyBzdGF0ZSBhZ3JlZWFibGVuZXNzLCBUcmFpdCBBIHJlcHJlc2VudHMgdHJhaXQgYWdyZWVhYmxlbmVzcy4gUGVyc29uYWxpdHkgdHJhaXRzIHdlcmUgdHJhbnNmb3JtZWQgZnJvbSBhIDUtcG9pbnQgc2NhbGUgdG8gYSA3LXBvaW50IHNjYWxlLiBDb250cm9sIHZhcmlhYmxlcyAoaS5lLiwgcG9pbnRzIGVhcm5lZCBpbiB0aGUgZ2FtZSwgZGlmZmVyZW5jZSBpbiBwb2ludHMsIGFuZCBleHBlcmltZW50YWwgZ3JvdXBzKSBhcmUgbm90IGxpc3RlZCBpbiB0aGUgb3V0cHV0LiIsIGVzY2FwZT1GKSAlPiUgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmaXhlZF90aGVhZCA9IFQsIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgICU+JSANCiAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjE1ZW0iKSANCg0KYGBgDQoNCiMjIyBUcmFpdC0tU3RhdGUgQ29uZ3J1ZW5jZTogSG9uZXN0eSB7LX0NCg0KYGBge3IgcGEtcnNhLXRhYmxlcy1oLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KdGFiIDwtIGdldFBhcihoM2EucnNhLmgsIHN0YW5kYXJkaXplZD1UUlVFKVtjKDgsIDE6NywgOToxMyksXQ0KdGFiJGNpIDwtIHBhc3RlMCgiWyIscHJpbnRudW0odGFiJGNpLmxvd2VyKSwgIiwgIiwgcHJpbnRudW0odGFiJGNpLnVwcGVyKSwgIl0iKQ0KdGFiJHB2YWx1ZSA8LSBwcmludHAodGFiJHB2YWx1ZSkNCnJvdy5uYW1lcyh0YWIpWzE6OF0gPC0gYygiKEludGVyY2VwdCkiLCAiU3RhdGUgSEgiLCAiVHJhaXQgSEgiLCAiU3RhdGUgSEg8c3VwPjI8L3N1cD4iLCAiU3RhdGUgSEggeCBUcmFpdCBISCIsICJUcmFpdCBISDxzdXA+Mjwvc3VwPiIsICJCZWhhdmlvciBjb25kaXRpb25zIiwgIlNpdHVhdGlvbiBjb25kaXRpb25zIikNCg0KDQprYWJsZSh0YWJbLGMoMSwyLDExLDksNSldDQogICAgICAsIGRpZ2l0cz1jKDIsMiwyLDIsMikNCiAgICAgICwgYWxpZ249YygibCIsICJyIiwgInIiLCAiciIsICJyIiwgInIiKQ0KICAgICAgLCBjYXB0aW9uID0gIlBhcmFtZXRlcnMgb2YgdGhlIHJlc3BvbnNlIHN1cmZhY2UgYW5hbHlzaXMgb2YgdHJhaXQgaG9uZXN0eS1odW1pbGl0eSBhbmQgc3RhdGUgaG9uZXN0eS1odW1pbGl0eSBwcmVkaWN0aW5nIHBvc2l0aXZlIGFmZmVjdC4iDQogICAgICAsIGVzY2FwZSA9IEZBTFNFDQogICAgICAsIGNvbC5uYW1lcz1jKCJMYWJlbCIsICI8aT5iPC9pPiIsICI5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbCIsICImYmV0YTsiLCAiPGk+cDwvaT4gdmFsdWUiKQ0KKSAgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBULCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICAlPiUgDQogICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIxOGVtIikgJT4lDQogICBwYWNrX3Jvd3MoIlJlZ3Jlc3Npb24gUGFyYW1ldGVycyIsIDEsIDgpICU+JQ0KICAgcGFja19yb3dzKCJSZXNwb25zZSBTdXJmYWNlIFBhcmFtZXRlcnMiLCA5LCAxMykgJT4lIA0KICAgZm9vdG5vdGUoZ2VuZXJhbD0iYiByZXByZXNlbnRzIHVuc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLCAmYmV0YTsgcmVwcmVzZW50cyBzdGFuZGFyZGl6ZWQgcmVncmVzc2lvbiBjb2VmaWNpZW50cy4gU3RhdGUgSEggcmVwcmVzZW50cyBzdGF0ZSBob25lc3R5LWh1bWlsaXR5LCBUcmFpdCBISCByZXByZXNlbnRzIHRyYWl0IGhvbmVzdHktaHVtaWxpdHkuIFBlcnNvbmFsaXR5IHRyYWl0cyB3ZXJlIHRyYW5zZm9ybWVkIGZyb20gYSA1LXBvaW50IHNjYWxlIHRvIGEgNy1wb2ludCBzY2FsZS4gQ29udHJvbCB2YXJpYWJsZXMgKGkuZS4sIHBvaW50cyBlYXJuZWQgaW4gdGhlIGdhbWUsIGRpZmZlcmVuY2UgaW4gcG9pbnRzLCBhbmQgZXhwZXJpbWVudGFsIGdyb3VwcykgYXJlIG5vdCBsaXN0ZWQgaW4gdGhlIG91dHB1dC4iLCBlc2NhcGU9RikNCg0KYGBgDQoNCiMjIyBTdGF0ZS0tU2l0dWF0aW9uIENvbmdydWVuY2U6IEFncmVlYWJsZW5lc3MgYW5kIEFkdmVyc2l0eSB7LX0NCg0KYGBge3IgcGEtcnNhLXRhYmxlcy1hLWEsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KDQp0YWIgPC0gZ2V0UGFyKGg0YS5yc2EuYS5hLCBzdGFuZGFyZGl6ZWQ9VFJVRSlbYyg4LCAxOjcsIDk6MTMpLF0NCnRhYiRjaSA8LSBwYXN0ZTAoIlsiLHByaW50bnVtKHRhYiRjaS5sb3dlciksICIsICIsIHByaW50bnVtKHRhYiRjaS51cHBlciksICJdIikNCnRhYiRwdmFsdWUgPC0gcHJpbnRwKHRhYiRwdmFsdWUpDQpyb3cubmFtZXModGFiKVsxOjhdIDwtIGMoIihJbnRlcmNlcHQpIiwgIlN0YXRlIEEiLCAiQWR2KHIpIiwgIlN0YXRlIEE8c3VwPjI8L3N1cD4iLCAiU3RhdGUgQSB4IEFkdihyKSIsICJBZHYocik8c3VwPjI8L3N1cD4iLCAiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJTaXR1YXRpb24gY29uZGl0aW9ucyIpDQoNCg0Ka2FibGUodGFiWyxjKDEsMiwxMSw5LDUpXQ0KICAgICAgLCBkaWdpdHM9YygyLDIsMiwyLDIpDQogICAgICAsIGFsaWduPWMoImwiLCAiciIsICJyIiwgInIiLCAiciIsICJyIikNCiAgICAgICwgY2FwdGlvbiA9ICJQYXJhbWV0ZXJzIG9mIHRoZSByZXNwb25zZSBzdXJmYWNlIGFuYWx5c2lzIG9mIHN0YXRlIGFncmVlYWJsZW5lc3MgYW5kIGFkdmVyc2l0eSBwcmVkaWN0aW5nIHBvc2l0aXZlIGFmZmVjdC4iDQogICAgICAsIGVzY2FwZSA9IEZBTFNFDQogICAgICAsIGNvbC5uYW1lcz1jKCJMYWJlbCIsICI8aT5iPC9pPiIsICI5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbCIsICImYmV0YTsiLCAiPGk+cDwvaT4gdmFsdWUiKQ0KKSAgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBULCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICAlPiUgDQogICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIxOGVtIikgJT4lDQogICBwYWNrX3Jvd3MoIlJlZ3Jlc3Npb24gUGFyYW1ldGVycyIsIDEsIDgpICU+JQ0KICAgcGFja19yb3dzKCJSZXNwb25zZSBTdXJmYWNlIFBhcmFtZXRlcnMiLCA5LCAxMykgJT4lIA0KICAgZm9vdG5vdGUoZ2VuZXJhbD0iYiByZXByZXNlbnRzIHVuc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLCAmYmV0YTsgcmVwcmVzZW50cyBzdGFuZGFyZGl6ZWQgcmVncmVzc2lvbiBjb2VmaWNpZW50cy4gU3RhdGUgQSByZXByZXNlbnRzIHN0YXRlIGFncmVlYWJsZW5lc3MsIEFkdihyKSByZXByZXNlbnRzIHJldmVyc2UtY29kZWQgQWR2ZXJzaXR5LiBBZHZlcnNpdHkgd2FzIHJldmVyc2UtY29kZWQgc3VjaCB0aGF0IGhpZ2hlciBsZXZlbHMgaW5kaWNhdGUgbGVzcyBhZHZlcnNpdHkuIENvbnRyb2wgdmFyaWFibGVzIChpLmUuLCBwb2ludHMgZWFybmVkIGluIHRoZSBnYW1lLCBkaWZmZXJlbmNlIGluIHBvaW50cywgYW5kIGV4cGVyaW1lbnRhbCBncm91cHMpIGFyZSBub3QgbGlzdGVkIGluIHRoZSBvdXRwdXQuIiwgZXNjYXBlPUYpDQoNCmBgYA0KDQojIyMgU3RhdGUtLVNpdHVhdGlvbiBDb25ncnVlbmNlOiBBZ3JlZWFibGVuZXNzIGFuZCBEZWNlcHRpb24gey19DQoNCmBgYHtyIHBhLXJzYS10YWJsZXMtYS1kLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KdGFiIDwtIGdldFBhcihoNGEucnNhLmEuZCwgc3RhbmRhcmRpemVkPVRSVUUpW2MoOCwgMTo3LCA5OjEzKSxdDQp0YWIkY2kgPC0gcGFzdGUwKCJbIixwcmludG51bSh0YWIkY2kubG93ZXIpLCAiLCAiLCBwcmludG51bSh0YWIkY2kudXBwZXIpLCAiXSIpDQp0YWIkcHZhbHVlIDwtIHByaW50cCh0YWIkcHZhbHVlKQ0Kcm93Lm5hbWVzKHRhYilbMTo4XSA8LSBjKCIoSW50ZXJjZXB0KSIsICJTdGF0ZSBBIiwgIkRlYyhyKSIsICJTdGF0ZSBBPHN1cD4yPC9zdXA+IiwgIlN0YXRlIEEgeCBEZWMocikiLCAiRGVjKHIpPHN1cD4yPC9zdXA+IiwgIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKQ0KDQoNCmthYmxlKHRhYlssYygxLDIsMTEsOSw1KV0NCiAgICAgICwgZGlnaXRzPWMoMiwyLDIsMiwyKQ0KICAgICAgLCBhbGlnbj1jKCJsIiwgInIiLCAiciIsICJyIiwgInIiLCAiciIpDQogICAgICAsIGNhcHRpb24gPSAiUGFyYW1ldGVycyBvZiB0aGUgcmVzcG9uc2Ugc3VyZmFjZSBhbmFseXNpcyBvZiBzdGF0ZSBhZ3JlZWFibGVuZXNzIGFuZCBkZWNlcHRpb24gcHJlZGljdGluZyBwb3NpdGl2ZSBhZmZlY3QuIg0KICAgICAgLCBlc2NhcGUgPSBGQUxTRQ0KICAgICAgLCBjb2wubmFtZXM9YygiTGFiZWwiLCAiPGk+YjwvaT4iLCAiOTUlIENvbmZpZGVuY2UgSW50ZXJ2YWwiLCAiJmJldGE7IiwgIjxpPnA8L2k+IHZhbHVlIikNCikgICU+JSANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gVCwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAgJT4lIA0KICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMThlbSIpICU+JQ0KICAgcGFja19yb3dzKCJSZWdyZXNzaW9uIFBhcmFtZXRlcnMiLCAxLCA4KSAlPiUNCiAgIHBhY2tfcm93cygiUmVzcG9uc2UgU3VyZmFjZSBQYXJhbWV0ZXJzIiwgOSwgMTMpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9ImIgcmVwcmVzZW50cyB1bnN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cywgJmJldGE7IHJlcHJlc2VudHMgc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gY29lZmljaWVudHMuIFN0YXRlIEEgcmVwcmVzZW50cyBzdGF0ZSBhZ3JlZWFibGVuZXNzLCBEZWMocikgcmVwcmVzZW50cyByZXZlcnNlLWNvZGVkIERlY2VwdGlvbi4gRGVjZXB0aW9uIHdhcyByZXZlcnNlLWNvZGVkIHN1Y2ggdGhhdCBoaWdoZXIgbGV2ZWxzIGluZGljYXRlIGxlc3MgZGVjZXB0aW9uLiBDb250cm9sIHZhcmlhYmxlcyAoaS5lLiwgcG9pbnRzIGVhcm5lZCBpbiB0aGUgZ2FtZSwgZGlmZmVyZW5jZSBpbiBwb2ludHMsIGFuZCBleHBlcmltZW50YWwgZ3JvdXBzKSBhcmUgbm90IGxpc3RlZCBpbiB0aGUgb3V0cHV0LiIsIGVzY2FwZT1GKQ0KDQpgYGANCg0KIyMjIFN0YXRlLS1TaXR1YXRpb24gQ29uZ3J1ZW5jZTogSG9uZXN0eSBhbmQgQWR2ZXJzaXR5IHstfQ0KDQpgYGB7ciBwYS1yc2EtdGFibGVzLWgtYSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCnRhYiA8LSBnZXRQYXIoaDRhLnJzYS5oLmEsIHN0YW5kYXJkaXplZD1UUlVFKVtjKDgsIDE6NywgOToxMyksXQ0KdGFiJGNpIDwtIHBhc3RlMCgiWyIscHJpbnRudW0odGFiJGNpLmxvd2VyKSwgIiwgIiwgcHJpbnRudW0odGFiJGNpLnVwcGVyKSwgIl0iKQ0KdGFiJHB2YWx1ZSA8LSBwcmludHAodGFiJHB2YWx1ZSkNCnJvdy5uYW1lcyh0YWIpWzE6OF0gPC0gYygiKEludGVyY2VwdCkiLCAiU3RhdGUgSEgiLCAiQWR2KHIpIiwgIlN0YXRlIEhIPHN1cD4yPC9zdXA+IiwgIlN0YXRlIEhIIHggQWR2KHIpIiwgIkFkdihyKTxzdXA+Mjwvc3VwPiIsICJCZWhhdmlvciBjb25kaXRpb25zIiwgIlNpdHVhdGlvbiBjb25kaXRpb25zIikNCg0KDQprYWJsZSh0YWJbLGMoMSwyLDExLDksNSldDQogICAgICAsIGRpZ2l0cz1jKDIsMiwyLDIsMikNCiAgICAgICwgYWxpZ249YygibCIsICJyIiwgInIiLCAiciIsICJyIiwgInIiKQ0KICAgICAgLCBjYXB0aW9uID0gIlBhcmFtZXRlcnMgb2YgdGhlIHJlc3BvbnNlIHN1cmZhY2UgYW5hbHlzaXMgb2Ygc3RhdGUgaG9uZXN0eS1odW1pbGl0eSBhbmQgYWR2ZXJzaXR5IHByZWRpY3RpbmcgcG9zaXRpdmUgYWZmZWN0LiINCiAgICAgICwgZXNjYXBlID0gRkFMU0UNCiAgICAgICwgY29sLm5hbWVzPWMoIkxhYmVsIiwgIjxpPmI8L2k+IiwgIjk1JSBDb25maWRlbmNlIEludGVydmFsIiwgIiZiZXRhOyIsICI8aT5wPC9pPiB2YWx1ZSIpDQopICAlPiUgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmaXhlZF90aGVhZCA9IFQsIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgICU+JSANCiAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjE4ZW0iKSAlPiUNCiAgIHBhY2tfcm93cygiUmVncmVzc2lvbiBQYXJhbWV0ZXJzIiwgMSwgOCkgJT4lDQogICBwYWNrX3Jvd3MoIlJlc3BvbnNlIFN1cmZhY2UgUGFyYW1ldGVycyIsIDksIDEzKSAlPiUgDQogICBmb290bm90ZShnZW5lcmFsPSJiIHJlcHJlc2VudHMgdW5zdGFuZGFyZGl6ZWQgcmVncmVzc2lvbiBjb2VmZmljaWVudHMsICZiZXRhOyByZXByZXNlbnRzIHN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZpY2llbnRzLiBTdGF0ZSBISCByZXByZXNlbnRzIHN0YXRlIGhvbmVzdHktaHVtaWxpdHksIEFkdihyKSByZXByZXNlbnRzIHJldmVyc2UtY29kZWQgQWR2ZXJzaXR5LiBBZHZlcnNpdHkgd2FzIHJldmVyc2UtY29kZWQgc3VjaCB0aGF0IGhpZ2hlciBsZXZlbHMgaW5kaWNhdGUgbGVzcyBhZHZlcnNpdHkuIENvbnRyb2wgdmFyaWFibGVzIChpLmUuLCBwb2ludHMgZWFybmVkIGluIHRoZSBnYW1lLCBkaWZmZXJlbmNlIGluIHBvaW50cywgYW5kIGV4cGVyaW1lbnRhbCBncm91cHMpIGFyZSBub3QgbGlzdGVkIGluIHRoZSBvdXRwdXQuIiwgZXNjYXBlPUYpDQoNCmBgYA0KDQojIyMgU3RhdGUtLVNpdHVhdGlvbiBDb25ncnVlbmNlOiBIb25lc3R5IGFuZCBEZWNlcHRpb24gey19DQoNCmBgYHtyIHBhLXJzYS10YWJsZXMtaC1kLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KdGFiIDwtIGdldFBhcihoNGEucnNhLmguZCwgc3RhbmRhcmRpemVkPVRSVUUpW2MoOCwgMTo3LCA5OjEzKSxdDQp0YWIkY2kgPC0gcGFzdGUwKCJbIixwcmludG51bSh0YWIkY2kubG93ZXIpLCAiLCAiLCBwcmludG51bSh0YWIkY2kudXBwZXIpLCAiXSIpDQp0YWIkcHZhbHVlIDwtIHByaW50cCh0YWIkcHZhbHVlKQ0Kcm93Lm5hbWVzKHRhYilbMTo4XSA8LSBjKCIoSW50ZXJjZXB0KSIsICJTdGF0ZSBISCIsICJEZWMocikiLCAiU3RhdGUgSEg8c3VwPjI8L3N1cD4iLCAiU3RhdGUgSEggeCBEZWMocikiLCAiRGVjKHIpPHN1cD4yPC9zdXA+IiwgIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKQ0KDQoNCmthYmxlKHRhYlssYygxLDIsMTEsOSw1KV0NCiAgICAgICwgZGlnaXRzPWMoMiwyLDIsMiwyKQ0KICAgICAgLCBhbGlnbj1jKCJsIiwgInIiLCAiciIsICJyIiwgInIiLCAiciIpDQogICAgICAsIGNhcHRpb24gPSAiUGFyYW1ldGVycyBvZiB0aGUgcmVzcG9uc2Ugc3VyZmFjZSBhbmFseXNpcyBvZiBzdGF0ZSBob25lc3R5LWh1bWlsaXR5IGFuZCBkZWNlcHRpb24gcHJlZGljdGluZyBwb3NpdGl2ZSBhZmZlY3QuIg0KICAgICAgLCBlc2NhcGUgPSBGQUxTRQ0KICAgICAgLCBjb2wubmFtZXM9YygiTGFiZWwiLCAiPGk+YjwvaT4iLCAiOTUlIENvbmZpZGVuY2UgSW50ZXJ2YWwiLCAiJmJldGE7IiwgIjxpPnA8L2k+IHZhbHVlIikNCikgICU+JSANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gVCwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAgJT4lIA0KICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMThlbSIpICU+JQ0KICAgcGFja19yb3dzKCJSZWdyZXNzaW9uIFBhcmFtZXRlcnMiLCAxLCA4KSAlPiUNCiAgIHBhY2tfcm93cygiUmVzcG9uc2UgU3VyZmFjZSBQYXJhbWV0ZXJzIiwgOSwgMTMpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9ImIgcmVwcmVzZW50cyB1bnN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cywgJmJldGE7IHJlcHJlc2VudHMgc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gY29lZmljaWVudHMuIFN0YXRlIEhIIHJlcHJlc2VudHMgc3RhdGUgaG9uZXN0eS1odW1pbGl0eSwgRGVjKHIpIHJlcHJlc2VudHMgcmV2ZXJzZS1jb2RlZCBEZWNlcHRpb24uIERlY2VwdGlvbiB3YXMgcmV2ZXJzZS1jb2RlZCBzdWNoIHRoYXQgaGlnaGVyIGxldmVscyBpbmRpY2F0ZSBsZXNzIGRlY2VwdGlvbi4gQ29udHJvbCB2YXJpYWJsZXMgKGkuZS4sIHBvaW50cyBlYXJuZWQgaW4gdGhlIGdhbWUsIGRpZmZlcmVuY2UgaW4gcG9pbnRzLCBhbmQgZXhwZXJpbWVudGFsIGdyb3VwcykgYXJlIG5vdCBsaXN0ZWQgaW4gdGhlIG91dHB1dC4iLCBlc2NhcGU9RikNCg0KYGBgDQoNCiMjIFZpc3VhbGl6YXRpb24gey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyMgQU5PVkEgSW50ZXJhY3Rpb24gUGxvdHMgey19DQoNCmBgYHtyIHBhLWFvdi1wbG90LCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZmlnLndpZHRoPTExLCBmaWcuYXNwPTEuMiwgb3V0LndpZHRoPSc5MCUnLCBmaWcuY2FwPSJJbnRlcmFjdGlvbiBwbG90cyBvZiBpbnRlcmFjdGlvbnMgYmV0d2VlbiBtZWRpYW4tc3BsaXQgcGVyc29uYWxpdHkgdHJhaXRzLCBiZWhhdmlvciBjb25kaXRpb25zLCBhbmQgc2l0dWF0aW9uIGNvbmRpdGlvbnMgcHJlZGljdGluZyBwb3NpdGl2ZSBhZmZlY3QuIn0NCg0KcDEgPC0gaW50ZXJhY3Rpb25zOjpjYXRfcGxvdChsbS5hLCBwcmVkPWNvbmRpdGlvbi5iZWgsIG1vZHg9dHJhaXQuYS5tcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QucG9pbnRzID0gVCwgcG9pbnQuc2l6ZT0xLCBwb2ludC5hbHBoYT0uMywganR0ZXI9LjIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb209ImxpbmUiLCBpbnRlcnZhbD1ULCBpbnRlcnZhbC5nZW9tID0gImxpbmVyYW5nZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQucG9pbnQuc2l6ZSA9IDUsIGRvZGdlLndpZHRoID0gMC4zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LmxhYmVsPSJCZWhhdmlvciBDb25kaXRpb25zIiwgeS5sYWJlbD0iUG9zaXRpdmUgQWZmZWN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbi50aXRsZSA9ICJUcmFpdCBBZ3JlZWFibGVuZXNzIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYWluID0gIlRyYWl0IEFncmVlYWJsZW5lc3MgKG1lZGlhbi1zcGxpdCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9Y29scy5iZWgpICsgDQogICB0aGVtZV9wdWIoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQ9YygwLjIsIDAuMikpDQoNCg0KcDIgPC0gaW50ZXJhY3Rpb25zOjpjYXRfcGxvdChsbS5oLCBwcmVkPWNvbmRpdGlvbi5iZWgsIG1vZHg9dHJhaXQuaC5tcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QucG9pbnRzID0gVCwgcG9pbnQuc2l6ZT0xLCBwb2ludC5hbHBoYT0uMywganR0ZXI9LjIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb209ImxpbmUiLCBpbnRlcnZhbD1ULCBpbnRlcnZhbC5nZW9tID0gImxpbmVyYW5nZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQucG9pbnQuc2l6ZSA9IDUsIGRvZGdlLndpZHRoID0gMC4zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LmxhYmVsPSJCZWhhdmlvciBDb25kaXRpb25zIiwgeS5sYWJlbD0iUG9zaXRpdmUgQWZmZWN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbi50aXRsZSA9ICJUcmFpdCBIb25lc3R5IHggQmVoYXZpb3IgQ29uZGl0aW9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYWluID0gIlRyYWl0IEhvbmVzdHkgKG1lZGlhbi1zcGxpdCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9Y29scy5iZWgpICsgDQogICB0aGVtZV9wdWIoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQ9YygwLjIsIDAuMikpDQoNCg0KcDMgPC0gaW50ZXJhY3Rpb25zOjpjYXRfcGxvdChsbS5zaXQsIHByZWQ9Y29uZGl0aW9uLmJlaCwgbW9keD1jb25kaXRpb24uc2l0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5wb2ludHMgPSBULCBwb2ludC5zaXplPTEsIHBvaW50LmFscGhhPS4zLCBqdHRlcj0uMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbT0ibGluZSIsIGludGVydmFsPVQsIGludGVydmFsLmdlb20gPSAibGluZXJhbmdlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZC5wb2ludC5zaXplID0gNSwgZG9kZ2Uud2lkdGggPSAwLjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgubGFiZWw9IkJlaGF2aW9yIENvbmRpdGlvbnMiLCB5LmxhYmVsPSJQb3NpdGl2ZSBBZmZlY3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWluLnRpdGxlID0gIlNpdHVhdGlvbiB4IEJlaGF2aW9yIENvbmRpdGlvbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFpbiA9ICJTaXR1YXRpb24gQ29uZGl0aW9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jb2xzLmJlaCkgKyANCiAgIHRoZW1lX3B1YigpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICBzY2FsZV94X2Rpc2NyZXRlKGV4cGFuZD1jKDAuMiwgMC4yKSkNCg0KDQpwMSAvIHBsb3Rfc3BhY2VyKCkgLyBwMiAvIHBsb3Rfc3BhY2VyKCkgLyBwMyArIHBsb3RfbGF5b3V0KGhlaWdodHM9YygxLDAuMSwgMSwgMC4xLDEpKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gIkEiKQ0KDQpgYGANCg0KDQojIyMgUmVzcG9uc2UgU3VyZmFjZSBQbG90cyB7LX0NCg0KYGBge3IgcGEtcnNhLXBsb3QsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9MS41LCBmaWcuY2FwPSJSZXNwb25zZSBzdXJmYWNlIHBsb3RzIG9mIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRyYWl0LS1zdGF0ZSBjb25ncnVlbmNlLCBzdGF0ZS0tc2l0dWF0aW9uIGNvbmdydWVuY2UsIGFuZCBwb3NpdGl2ZSBhZmZlY3QuIEFkdmVyc2l0eSBhbmQgZGVjZXB0aW9uIHdlcmUgcmV2ZXJzZS1jb2RlZCAoaW5kaWNhdGVkIGJ5ICoocikqKSBzdWNoIHRoYXQgaGlnaGVyIHZhbHVlcyBpbmRpY2F0ZSBsZXNzIGFkdmVyc2l0eSBhbmQgZGVjcGV0aW9uLCByZXNwZWN0aXZlbHkuIFRoZSByZXNwb25zZSBzdXJmYWNlIHBhcmFtZXRlcnMgYXJlIGxpc3RlZCBiZWxvdyB0aGUgdGl0bGVzLiBUaGUgYmx1ZSBsaW5lcyByZXByZXNlbnQgdGhlIGxpbmUgb2YgY29uZ3J1ZW5jZSAoTE9DOyBpLmUuLCBYID0gWSkgYW5kIHRoZSBsaW5lIG9mIGluY29uZ3J1ZW5jZSAoTE9JQzsgaS5lLiwgWCA9IC1ZKS4gVGhlIGJsYWNrIGxpbmVzIHJlcHJlc2VudCB0aGUgcmFuZ2Ugb2Ygb2JzZXJ2ZWQgdmFsdWVzIGFzIGEgdHdvZGltZW5zaW9uYWwgYm94cGxvdC4ifQ0KDQphIDwtIHBsb3QoaDNhLnJzYS5hLCB4bGFiPSJTdGF0ZSBBZ3JlZWFibGVuZXNzIiwgeWxhYj0iVHJhaXQgQWdyZWVhYmxlbmVzcyIsIHpsYWI9IlBvc2l0aXZlIGFmZmVjdCIsDQogICAgICAgICAgIGxlZ2VuZD1GQUxTRSwgZGlzdGFuY2UgPSBjKDEuMywgMS4zLCAxLjQpLCBtYWluPSJUcmFpdC1TdGF0ZSBDb25ncnVlbmNlOiBBZ3JlZWFibGVuZXNzIiwNCiAgICAgICAgICAgcHJvamVjdCA9IGMoImNvbnRvdXIiKSwgYXhlcyA9IGMoIkxPQyIsICJMT0lDIiksIGh1bGw9RiwgcGFkPTIsDQogICAgICAgICAgIHBhcmFtPVQsIGdyaWRzaXplPTcsIHBvaW50cz1saXN0KHNob3c9RkFMU0UpLCB6bGltPWMoMSwgNS41KSkNCg0KYiA8LSBwbG90KGgzYS5yc2EuaCwgeGxhYj0iU3RhdGUgSG9uZXN0eSIsIHlsYWI9IlRyYWl0IEhvbmVzdHkiLCB6bGFiPSJQb3NpdGl2ZSBhZmZlY3QiLCANCiAgICAgICAgICAgbGVnZW5kPUZBTFNFLCBkaXN0YW5jZSA9IGMoMS4zLCAxLjMsIDEuNCksIG1haW49IlRyYWl0LS1TdGF0ZSBDb25ncnVlbmNlOiBIb25lc3R5LWh1bWlsaXR5IiwNCiAgICAgICAgICAgcHJvamVjdCA9IGMoImNvbnRvdXIiKSwgYXhlcyA9IGMoIkxPQyIsICJMT0lDIiksIGh1bGw9RixwYWQ9MiwNCiAgICAgICAgICAgcGFyYW09VCwgZ3JpZHNpemU9NywgcG9pbnRzPWxpc3Qoc2hvdz1GQUxTRSksIHpsaW09YygxLCA1LjUpKQ0KDQpjIDwtIHBsb3QoaDRhLnJzYS5hLmEsIHhsYWI9IlN0YXRlIEFncmVlYWJsZW5lc3MiLCB5bGFiPSJBZHZlcnNpdHkocikiLCB6bGFiPSJQb3NpdGl2ZSBhZmZlY3QiLA0KICAgICAgICAgICBsZWdlbmQ9RkFMU0UsIGRpc3RhbmNlID0gYygxLjMsIDEuMywgMS40KSwgbWFpbj0iU3RhdGUtU2l0dWF0aW9uIENvbmdydWVuY2U6XG5BZ3JlZWFibGVuZXNzIGFuZCBBZHZlcnNpdHkiLA0KICAgICAgICAgICBwcm9qZWN0ID0gYygiY29udG91ciIpLCBheGVzID0gYygiTE9DIiwgIkxPSUMiKSwgaHVsbD1GLHBhZD0yLA0KICAgICAgICAgICBwYXJhbT1ULCBncmlkc2l6ZT03LCBwb2ludHM9bGlzdChzaG93PUZBTFNFKSwgemxpbT1jKDEsIDUuNSkpDQoNCmQgPC0gcGxvdChoNGEucnNhLmguYSwgeGxhYj0iU3RhdGUgSG9uZXN0eSIsIHlsYWI9IkFkdmVyc2l0eShyKSIsIHpsYWI9IlBvc2l0aXZlIGFmZmVjdCIsIA0KICAgICAgICAgICBsZWdlbmQ9RkFMU0UsIGRpc3RhbmNlID0gYygxLjMsIDEuMywgMS40KSwgbWFpbj0iU3RhdGUtU2l0dWF0aW9uIENvbmdydWVuY2U6XG5Ib25lc3R5IGFuZCBBZHZlcnNpdHkiLA0KICAgICAgICAgICBwcm9qZWN0ID0gYygiY29udG91ciIpLCBheGVzID0gYygiTE9DIiwgIkxPSUMiKSwgaHVsbD1GLHBhZD0yLA0KICAgICAgICAgICBwYXJhbT1ULCBncmlkc2l6ZT03LCBwb2ludHM9bGlzdChzaG93PUZBTFNFKSwgemxpbT1jKDEsIDUuNSkpDQoNCmUgPC0gcGxvdChoNGEucnNhLmEuZCwgeGxhYj0iU3RhdGUgQWdyZWVhYmxlbmVzcyIsIHlsYWI9IkRlY2VwdGlvbihyKSIsIHpsYWI9IlBvc2l0aXZlIGFmZmVjdCIsDQogICAgICAgICAgIGxlZ2VuZD1GQUxTRSwgZGlzdGFuY2UgPSBjKDEuMywgMS4zLCAxLjQpLCBtYWluPSJTdGF0ZS1TaXR1YXRpb24gQ29uZ3J1ZW5jZTpcbkFncmVlYWJsZW5lc3MgYW5kIERlY2VwdGlvbiIsDQogICAgICAgICAgIHByb2plY3QgPSBjKCJjb250b3VyIiksIGF4ZXMgPSBjKCJMT0MiLCAiTE9JQyIpLCBodWxsPUYscGFkPTIsDQogICAgICAgICAgIHBhcmFtPVQsIGdyaWRzaXplPTcsIHBvaW50cz1saXN0KHNob3c9RkFMU0UpLCB6bGltPWMoMSwgNS41KSkNCg0KZiA8LSBwbG90KGg0YS5yc2EuaC5kLCB4bGFiPSJTdGF0ZSBIb25lc3R5IiwgeWxhYj0iRGVjZXB0aW9uKHIpIiwgemxhYj0iUG9zaXRpdmUgYWZmZWN0IiwgDQogICAgICAgICAgIGxlZ2VuZD1GQUxTRSwgZGlzdGFuY2UgPSBjKDEuMywgMS4zLCAxLjQpLCBtYWluPSJTdGF0ZS1TaXR1YXRpb24gQ29uZ3J1ZW5jZTpcbkhvbmVzdHkgYW5kIERlY2VwdGlvbiIsDQogICAgICAgICAgIHByb2plY3QgPSBjKCJjb250b3VyIiksIGF4ZXMgPSBjKCJMT0MiLCAiTE9JQyIpLCBodWxsPUYscGFkPTIsDQogICAgICAgICAgIHBhcmFtPVQsIGdyaWRzaXplPTcsIHBvaW50cz1saXN0KHNob3c9RkFMU0UpLCB6bGltPWMoMSwgNS41KSkNCg0KIyMgY29tYmluZSBwbG90cw0KY293cGxvdDo6cGxvdF9ncmlkKGEsYixjLGQsZSxmLCBuY29sID0gMiwgbGFiZWxzPSJBVVRPIiwgbGFiZWxfc2l6ZSA9IDEyKQ0KDQpgYGANCg0KIyMgQ29uY2x1c2lvbiB7LX0NCg0KT3ZlcmFsbCwgdGhlIGRhdGEgZGlkIG5vdCBzdXBwb3J0IHRoZSBjb25ncnVlbmNlIGh5cG90aGVzZXMgd2l0aCByZWdhcmQgdG8gcG9zaXRpdmUgYWZmZWN0Og0KDQoqIEFuYWx5c2VzIG9mIHZhcmlhbmNlIGRpZCBub3QgeWllbGQgYW55IHNpZ25pZmljYW50IGludGVyYWN0aW9uIGVmZmVjdHMgKGFsbCAqRipzIDwgYHIgcHJpbnRudW0obWF4KHN1bW1hcnkoYW92LmEpWzQsNF0sIHN1bW1hcnkoYW92LmgpWzQsNF0sIHN1bW1hcnkoYW92LnNpdClbMyw0XSkpYCwgYWxsICpwKnMgPiBgciBwcmludHAobWluKHN1bW1hcnkoYW92LmEpWzQsNl0sIHN1bW1hcnkoYW92LmgpWzQsNl0sIHN1bW1hcnkoYW92LnNpdClbMyw2XSkpYCkNCg0KKiBPbmx5IHRoZSBiZWhhdmlvciBjb25kaXRpb25zIHdlcmUgc2lnbmlmaWNhbnRseSBhc3NvY2lhdGVkIHdpdGggcG9zaXRpdmUgYWZmZWN0IHN1Y2ggdGhhdCBwYXJ0aWNpcGFudHMgaW4gdGhlIGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eS1jb25kaXRpb24gKCpNKiA9IGByIGRlc2NyaWJlQnkoZGF0YSRtb29kLmdiLCBncm91cD1kYXRhJGNvbmRpdGlvbi5iZWgsIGRpZ2l0cz0yLCBtYXQ9VCkkbWVhblsyXWAsICpTRCogPSBgciBkZXNjcmliZUJ5KGRhdGEkbW9vZC5nYiwgZ3JvdXA9ZGF0YSRjb25kaXRpb24uYmVoLCBkaWdpdHM9MiwgbWF0PVQpJHNkWzJdYCkgcmVwb3J0ZWQgc2lnbmlmaWNhbnRseSBtb3JlIHBvc2l0aXZlIGFmZmVjdCB0aGFuIHBhcnRpY2lwYW50cyBpbiB0aGUgbG93IGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHktY29uZGl0aW9uICgqTSogPSBgciBkZXNjcmliZUJ5KGRhdGEkbW9vZC5nYiwgZ3JvdXA9ZGF0YSRjb25kaXRpb24uYmVoLCBkaWdpdHM9MiwgbWF0PVQpJG1lYW5bMV1gLCAqU0QqID0gYHIgZGVzY3JpYmVCeShkYXRhJG1vb2QuZ2IsIGdyb3VwPWRhdGEkY29uZGl0aW9uLmJlaCwgZGlnaXRzPTIsIG1hdD1UKSRzZFsxXWAsICpkKiA9IGByIHBhc3RlMChwcmludG51bShjb2hlbi5kKGRhdGEkbW9vZC5nYiwgZGF0YSRjb25kaXRpb24uYmVoKSRjb2hlbi5kWzJdKSwgIiwgOTUlIENJIFsiLHByaW50bnVtKGNvaGVuLmQoZGF0YSRtb29kLmdiLCBkYXRhJGNvbmRpdGlvbi5iZWgpJGNvaGVuLmRbMV0pLCIsICIsIHByaW50bnVtKGNvaGVuLmQoZGF0YSRtb29kLmdiLCBkYXRhJGNvbmRpdGlvbi5iZWgpJGNvaGVuLmRbM10pICwiXSIpYCkNCg0KKiBQb2x5bm9taWFsIHJlZ3Jlc3Npb25zIGFsc28gc2hvd2VkIHRoYXQgb25seSBoaWdoZXIgbGV2ZWxzIG9mIHN0YXRlIGFncmVlYWJsZW5lc3MgYW5kIHN0YXRlIGhvbmVzdHktaHVtaWxpdHkgKGJ1dCBub3QgaW50ZXJhY3Rpb25zIG9mIGZpdCBwYXR0ZXJucykgd2VyZSBzaWduaWZpY2FudGx5IGFzc29jaWF0ZWQgd2l0aCBtb3JlIHBvc2l0aXZlIGFmZmVjdCBhY3Jvc3MgYWxsIG1vZGVscyAoKmIqcyByYW5naW5nIGZyb20gYHIgcHJpbnRudW0obWluKGMoaDNhLnJzYS5hJExNJGNvZWZmaWNpZW50c1syLDFdLCBoM2EucnNhLmgkTE0kY29lZmZpY2llbnRzWzIsMV0sIGg0YS5yc2EuYS5hJExNJGNvZWZmaWNpZW50c1syLDFdLCBoNGEucnNhLmEuZCRMTSRjb2VmZmljaWVudHNbMiwxXSwgaDRhLnJzYS5oLmEkTE0kY29lZmZpY2llbnRzWzIsMV0sIGg0YS5yc2EuaC5kJExNJGNvZWZmaWNpZW50c1syLDFdKSkpYCAgdG8gYHIgcHJpbnRudW0obWF4KGMoaDNhLnJzYS5hJExNJGNvZWZmaWNpZW50c1syLDFdLCBoM2EucnNhLmgkTE0kY29lZmZpY2llbnRzWzIsMV0sIGg0YS5yc2EuYS5hJExNJGNvZWZmaWNpZW50c1syLDFdLCBoNGEucnNhLmEuZCRMTSRjb2VmZmljaWVudHNbMiwxXSwgaDRhLnJzYS5oLmEkTE0kY29lZmZpY2llbnRzWzIsMV0sIGg0YS5yc2EuaC5kJExNJGNvZWZmaWNpZW50c1syLDFdKSkpYCkNCg0KKiBJbiBzdW1tYXJ5LCBhY3Jvc3MgYm90aCBhbmFseXNpcyBvZiB2YXJpYW5jZSBhbmQgcmVzcG9uc2Ugc3VyZmFjZSBhbmFseXNpcywgbmVpdGhlciBpbnRlcmFjdGlvbnMgbm9yIGZpdCBwYXR0ZXJucyB3ZXJlIHNpZ25pZmljYW50bHkgYXNzb2NpYXRlZCB3aXRoIHBvc2l0aXZlIGFmZmVjdA0KDQojIENvbmdydWVuY2UgYW5kIFRpcmVkbmVzcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC19DQoNCiMjIEh5cG90aGVzaXMgJiBBbmFseXRpYyBTdHJhdGVneSB7LX0NCg0KIyMjIEh5cG90aGVzaXMgey19DQoNCkgzYTogQ29uZ3J1ZW5jZSBiZXR3ZWVuIHBlcnNvbmFsaXR5IHRyYWl0IGFuZCBwZXJzb25hbGl0eSBzdGF0ZSBpcyBhc3NvY2lhdGVkIHdpdGggdGlyZWRuZXNzIHN1Y2ggdGhhdCB0cmFpdC1jb25ncnVlbnQgcGVyc29uYWxpdHkgc3RhdGVzIGFyZSByZWxhdGVkIHRvIGxlc3MgdGlyZWRuZXNzIHRoYW4gdHJhaXQtaW5jb25ncnVlbnQgcGVyc29uYWxpdHkgc3RhdGVzLg0KDQpINGE6IENvbmdydWVuY2UgYmV0d2VlbiBwZXJzb25hbGl0eSBzdGF0ZSBhbmQgc2l0dWF0aW9uIGNoYXJhY3RlcmlzdGljIGlzIGFzc29jaWF0ZWQgd2l0aCB0aXJlZG5lc3Mgc3VjaCB0aGF0IHNpdHVhdGlvbi1jb25ncnVlbnQgcGVyc29uYWxpdHkgc3RhdGVzIGFyZSByZWxhdGVkIHRvIGxlc3MgdGlyZWRuZXNzIHRoYW4gc2l0dWF0aW9uLWluY29uZ3J1ZW50IHBlcnNvbmFsaXR5IHN0YXRlcy4NCg0KIyMjIEFuYWx5dGljIFN0cmF0ZWd5IHstfSANCg0KKipTdGVwIDE6IEFuYWx5c2lzIG9mIFZhcmlhbmNlKiogIA0KV2UgY29uZHVjdGVkIGEgbWVkaWFuIHNwbGl0IG9mIHRyYWl0IEFncmVlYWJsZW5lc3MgLyB0cmFpdCBIb25lc3R5LUh1bWlsaXR5IGFuZCBjb25kdWN0IHZhcmlhbmNlIGFuYWx5c2VzIHdpdGggcmV2ZXJzZS1jb2RlZCB0aXJlZG5lc3MgYXMgRFYgYW5kIHRoZSB2YXJpYWJsZXMgcmVwcmVzZW50aW5nIGJlaGF2aW9yIGNvbmRpdGlvbnMgYW5kIG1lZGlhbi1zcGxpdCBwZXJzb25hbGl0eSB0cmFpdHMgYW5kIHRoZWlyIGludGVyYWN0aW9uIGFzIElWcy4gVGhpcyByZXBsaWNhdGVzIGFuYWx5c2VzIHBlcmZvcm1lZCBpbiBaZWxlbnNraSBldCBhbC4gKDIwMTIpLg0KDQpBZGRpdGlvbmFsbHksIHdlIGV4YW1pbmVkIHdoZXRoZXIgY29udHJvbGxpbmcgZm9yIHBvc3NpYmxlIGFzc29jaWF0aW9ucyBiZXR3ZWVuIHRoZSByZXN1bHRzIG9mIHRoZSBnYW1lIChwb2ludHMgZWFybmVkIGJ5IHRoZSBwYXJ0aWNpcGFudCBhbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBwYXJ0aWNpcGFudCdzIGFuZCB0aGUgY29tcHV0ZXIncyBwb2ludHMpIGFuZCB0aGUgRFYgYnkgaW5jbHVkaW5nIHRoZXNlIHZhcmlhYmxlcyBhcyBjb3ZhcmlhdGVzIGluIHRoZSBtb2RlbHMgY2hhbmdlZCB0aGUgcmVzdWx0cy4NCg0KKipTdGVwIDI6IFJlc3BvbnNlIFN1cmZhY2UgQW5hbHlzaXMqKiAgDQpXZSBjb25kdWN0ZWQgcmVzcG9uc2Ugc3VyZmFjZSBhbmFseXNlcyB3aXRoIG1pZHBvaW50LWNlbnRlcmVkIHBlcnNvbmFsaXR5IHN0YXRlIGFuZCBtaWRwb2ludC1jZW50ZXJlZCBwZXJzb25hbGl0eSB0cmFpdCBhcyBJVnMgYW5kIHJldmVyc2UtY29kZWQgdGlyZWRuZXNzIGFzIERWLiBXZSBpbmNsdWRlZCB0aGUgZXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgYXMgY292YXJpYXRlcyBpbiB0aGUgcG9seW5vbWlhbCByZWdyZXNzaW9ucyB0byBjb250cm9sIGZvciB0aGUgaGllcmFyY2hpY2FsIGRhdGEgc3RydWN0dXJlIHdpdGggcGFydGljaXBhbnRzIG5lc3RlZCBpbiBleHBlcmltZW50YWwgY29uZGl0aW9ucy4gDQoNCkFkZGl0aW9uYWxseSwgd2UgZXhhbWluZWQgd2hldGhlciBjb250cm9sbGluZyBmb3IgcG9zc2libGUgYXNzb2NpYXRpb25zIGJldHdlZW4gdGhlIHJlc3VsdHMgb2YgdGhlIGdhbWUgKHBvaW50cyBlYXJuZWQgYnkgdGhlIHBhcnRpY2lwYW50IGFuZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBhcnRpY2lwYW50J3MgYW5kIHRoZSBjb21wdXRlcidzIHBvaW50cykgYW5kIHRoZSBEViBieSBpbmNsdWRpbmcgdGhlc2UgdmFyaWFibGVzIGFzIGNvdmFyaWF0ZXMgaW4gdGhlIG1vZGVscyBjaGFuZ2VkIHRoZSByZXN1bHRzLg0KDQojIyBBbmFseXNpcyBvZiBWYXJpYW5jZSB7LnRhYnNldCAudGFic2V0LXBpbGxzIC19DQoNCiMjIyBUcmFpdC0tU3RhdGUgQ29uZ3J1ZW5jZTogQWdyZWVhYmxlbmVzcyB7LX0NCg0KIyMjIyBNb2RlbCB3aXRob3V0IENvdmFyaWF0ZXMgey19DQoNCmBgYHtyIGFvdi1hdC1hLCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0NCg0KYW92LmEgPC0gYW92X2Nhcihtb29kLmF0IH4gdHJhaXQuYS5tcyAqIGNvbmRpdGlvbi5iZWggKyBjb25kaXRpb24uc2l0ICsgRXJyb3IoUmVzcG9uc2VJZCksIGRhdGE9ZGF0YSkNCg0KDQp0YWIgPC0gYXMuZGF0YS5mcmFtZShuaWNlKGFvdi5hLCBlcz0icGVzIiwgc2lnX3N5bWJvbHMgPSByZXAoIiIsIDQpLCBNU0U9RkFMU0UpKQ0KDQoNCnRhYiRwLnZhbHVlW3RhYiRwLnZhbHVlPT0iPC4wMDEiXSA8LSAiJmx0OyAuMDAxIg0KdGFiJHBlc1t0YWIkcGVzPT0iPC4wMDEiXSA8LSAiJmx0Oy4wMDEiDQp0YWIkRWZmZWN0IDwtIGMoIlRyYWl0IChtZWRpYW4tc3BsaXQpIiwgIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiLCANCiAgICAgICAgICAgICAgICAiVHJhaXQgeCBCZWhhdmlvciBjb25kaXRpb25zIikNCg0Ka2FibGUodGFiLA0KICAgICAgZXNjYXBlPUYsDQogICAgICBjb2wubmFtZXM9YygiRWZmZWN0IiwgImRmIiwgIkYiLCAiJiM5NTE7PHN1Yj5wPC9zdWI+PHN1cD4yPC9zdXA+IiwgIjxpPnA8L2k+IiksDQogICAgICBjYXB0aW9uPSJBbmFseXNlcyBvZiB2YXJpYW5jZSBleGFtaW5pbmcgYXNzb2NpYXRpb25zIGJldHdlZW4gbWVkaWFuLXNwbGl0IHBlcnNvbmFsaXR5IHRyYWl0cywgdGhlIGJlaGF2aW9yIG1hbmlwdWxhdGlvbiBhbmQgdGlyZWRuZXNzIikgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIA0KICAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsIGZpeGVkX3RoZWFkID0gVCkgJT4lIA0KICAgY29sdW1uX3NwZWMoYygxKSwgd2lkdGggPSAiMTVlbSIpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMjo0KSwgd2lkdGggPSAiOGVtIikgJT4lIA0KICAgZm9vdG5vdGUoZ2VuZXJhbD0iV2UgaW5jbHVkZWQgdGhlIHNpdHVhdGlvbiBjb25kaXRpb25zIGFzIGNvdmFyaWF0ZXMgaW4gdGhpcyBtb2RlbCB0byBjb250cm9sIGZvciBkZXBlbmRlbmNpZXMgYW1vbmcgcGFydGljaXBhbnRzIHdobyBleHBlcmllbmNlZCB0aGUgc2FtZSBzaXR1YXRpb24gY29uZGl0aW9uLiBUaXJlZG5lc3Mgd2FzIHJldmVyc2UtY29kZWQgc3VjaCB0aGF0IGhpZ2hlciB2YWx1ZXMgaW5kaWNhdGUgbGVzcyB0aXJlZG5lc3Mgb3IgYSBtb3JlIGFjdGl2ZSBtb29kLiBTaXR1YXRpb24gY29uZGl0aW9ucywgbWVkaWFuLXNwbGl0IHBlcnNvbmFsaXR5IHRyYWl0cywgYW5kIGJlaGF2aW9yIGNvbmRpdGlvbnMgd2VyZSBlZmZlY3QtY29kZWQuIikNCg0KYGBgDQoNCiMjIyMgTW9kZWwgd2l0aCBDb3ZhcmlhdGVzIHstfQ0KDQpgYGB7ciBhb3YtYXQtYS1jb3YsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQ0KDQpkYXRhJHBvaW50cy5jIDwtIHNjYWxlKGRhdGEkcG9pbnRzLCBzY2FsZT1GQUxTRSkNCg0KbG0uYSA8LSBsbShtb29kLmF0IH4gdHJhaXQuYS5tcyAqIGNvbmRpdGlvbi5iZWggKyBwb2ludHMuYyArIHBvaW50cy5kaWZmICsgY29uZGl0aW9uLnNpdCwgZGF0YT1kYXRhLCANCiAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChjb25kaXRpb24uc2l0PWNvbnRyLnN1bSwgdHJhaXQuYS5tcz1jb250ci5zdW0sIGNvbmRpdGlvbi5iZWg9Y29udHIuc3VtKSkNCg0KDQp0YWIgPC0gYXBhX3ByaW50KGNhcjo6QW5vdmEobG0uYSwgdHlwZT0zKSkkdGFibGUNCnRhYiRkZnMgPC0gcGFzdGUwKHRhYiRkZiwgIiwgIiwgdGFiJGRmLnJlc2lkdWFsKQ0KdGFiJHRlcm0gPC0gYygiVHJhaXQgKG1lZGlhbi1zcGxpdCkiLCAiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJQb2ludHMgZWFybmVkIiwgDQogICAgICAgICAgICAgICJEaWZmZXJlbmNlIGluIHBvaW50cyIsICJTaXR1YXRpb24gY29uZGl0aW9ucyIsICJUcmFpdCB4IEJlaGF2aW9yIGNvbmRpdGlvbnMiKQ0KDQoNCmthYmxlKHRhYlssYygxLDgsMywyLDcpXSwNCiAgICAgIGVzY2FwZT1GLA0KICAgICAgcm93Lm5hbWVzID0gRiwNCiAgICAgIGFsaWduPWMoImwiLCAiciIsICJyIiwgInIiLCAiciIpLA0KICAgICAgY29sLm5hbWVzPWMoIkVmZmVjdCIsICJkZiIsICJGIiwgIiYjOTUxOzxzdWI+cDwvc3ViPjxzdXA+Mjwvc3VwPiIsICI8aT5wPC9pPiIpLA0KICAgICAgY2FwdGlvbj0iQW5hbHlzZXMgb2YgdmFyaWFuY2UgZXhhbWluaW5nIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIGFuZCB0aGUgcmVtYWluaW5nIHBlcnNvbmFsaXR5IHN0YXRlcyBhbmQgc2l0dWF0aW9uIGNoYXJhY3RlcmlzdGljcyB3aXRoIGFkZGl0aW9uYWwgY292YXJpYXRlcyBjb250cm9sbGluZyBmb3IgdGhlIHJlc3VsdHMgb2YgdGhlIGdhbWUuIikgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIA0KICAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsIGZpeGVkX3RoZWFkID0gVCkgJT4lIA0KICAgY29sdW1uX3NwZWMoYygxKSwgd2lkdGggPSAiMjBlbSIpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMjo0KSwgd2lkdGggPSAiOGVtIikgJT4lIA0KICAgZm9vdG5vdGUoZ2VuZXJhbD0iV2UgaW5jbHVkZWQgdGhlIHNpdHVhdGlvbiBjb25kaXRpb25zIGFzIGNvdmFyaWF0ZXMgaW4gdGhpcyBtb2RlbCB0byBjb250cm9sIGZvciBkZXBlbmRlbmNpZXMgYW1vbmcgcGFydGljaXBhbnRzIHdobyBleHBlcmllbmNlZCB0aGUgc2FtZSBzaXR1YXRpb24gY29uZGl0aW9uLiBUaXJlZG5lc3Mgd2FzIHJldmVyc2UtY29kZWQgc3VjaCB0aGF0IGhpZ2hlciB2YWx1ZXMgaW5kaWNhdGUgbGVzcyB0aXJlZG5lc3Mgb3IgYSBtb3JlIGFjdGl2ZSBtb29kLiBTaXR1YXRpb24gY29uZGl0aW9ucywgbWVkaWFuLXNwbGl0IHBlcnNvbmFsaXR5IHRyYWl0cywgYW5kIGJlaGF2aW9yIGNvbmRpdGlvbnMgd2VyZSBlZmZlY3QtY29kZWQuIikNCg0KYGBgDQoNCiMjIyBUcmFpdC0tU3RhdGUgQ29uZ3J1ZW5jZTogSG9uZXN0eSB7LX0NCg0KIyMjIyBNb2RlbCB3aXRob3V0IENvdmFyaWF0ZXMgey19DQoNCmBgYHtyIGFvdi1oLWF0LCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0NCg0KYW92LmggPC0gYW92X2Nhcihtb29kLmF0IH4gdHJhaXQuaC5tcyAqIGNvbmRpdGlvbi5iZWggKyBjb25kaXRpb24uc2l0ICsgRXJyb3IoUmVzcG9uc2VJZCksIGRhdGE9ZGF0YSkNCg0KDQp0YWIgPC0gYXMuZGF0YS5mcmFtZShuaWNlKGFvdi5oLCBlcz0icGVzIiwgc2lnX3N5bWJvbHMgPSByZXAoIiIsIDQpLCBNU0U9RkFMU0UpKQ0KDQp0YWIkcC52YWx1ZVt0YWIkcC52YWx1ZT09IjwuMDAxIl0gPC0gIiZsdDsgLjAwMSINCnRhYiRwZXNbdGFiJHBlcz09IjwuMDAxIl0gPC0gIiZsdDsuMDAxIg0KdGFiJEVmZmVjdCA8LSBjKCJUcmFpdCAobWVkaWFuLXNwbGl0KSIsICJCZWhhdmlvciBjb25kaXRpb25zIiwgIlNpdHVhdGlvbiBjb25kaXRpb25zIiwgDQogICAgICAgICAgICAgICAgIlRyYWl0IHggQmVoYXZpb3IgY29uZGl0aW9ucyIpDQoNCmthYmxlKHRhYiwNCiAgICAgIGVzY2FwZT1GLA0KICAgICAgY29sLm5hbWVzPWMoIkVmZmVjdCIsICJkZiIsICJGIiwgIiYjOTUxOzxzdWI+cDwvc3ViPjxzdXA+Mjwvc3VwPiIsICI8aT5wPC9pPiIpLA0KICAgICAgY2FwdGlvbj0iQW5hbHlzZXMgb2YgdmFyaWFuY2UgZXhhbWluaW5nIGFzc29jaWF0aW9ucyBiZXR3ZWVuIG1lZGlhbi1zcGxpdCBwZXJzb25hbGl0eSB0cmFpdHMsIHRoZSBiZWhhdmlvciBtYW5pcHVsYXRpb24gYW5kIHRpcmVkbmVzcyIpICU+JSANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCANCiAgICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMSksIHdpZHRoID0gIjE1ZW0iKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDI6NCksIHdpZHRoID0gIjhlbSIpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9IldlIGluY2x1ZGVkIHRoZSBzaXR1YXRpb24gY29uZGl0aW9ucyBhcyBjb3ZhcmlhdGVzIGluIHRoaXMgbW9kZWwgdG8gY29udHJvbCBmb3IgZGVwZW5kZW5jaWVzIGFtb25nIHBhcnRpY2lwYW50cyB3aG8gZXhwZXJpZW5jZWQgdGhlIHNhbWUgc2l0dWF0aW9uIGNvbmRpdGlvbi4gVGlyZWRuZXNzIHdhcyByZXZlcnNlLWNvZGVkIHN1Y2ggdGhhdCBoaWdoZXIgdmFsdWVzIGluZGljYXRlIGxlc3MgdGlyZWRuZXNzIG9yIGEgbW9yZSBhY3RpdmUgbW9vZC4gU2l0dWF0aW9uIGNvbmRpdGlvbnMsIG1lZGlhbi1zcGxpdCBwZXJzb25hbGl0eSB0cmFpdHMsIGFuZCBiZWhhdmlvciBjb25kaXRpb25zIHdlcmUgZWZmZWN0LWNvZGVkLiIpDQoNCmBgYA0KDQojIyMjIE1vZGVsIHdpdGggQ292YXJpYXRlcyB7LX0NCg0KYGBge3IgYW92LWF0LWgtY292LCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0NCg0KZGF0YSRwb2ludHMuYyA8LSBzY2FsZShkYXRhJHBvaW50cywgc2NhbGU9RkFMU0UpDQoNCmxtLmggPC0gbG0obW9vZC5hdCB+IHRyYWl0LmgubXMgKiBjb25kaXRpb24uYmVoICsgcG9pbnRzLmMgKyBwb2ludHMuZGlmZiArIGNvbmRpdGlvbi5zaXQsIGRhdGE9ZGF0YSwgDQogICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoY29uZGl0aW9uLnNpdD1jb250ci5zdW0sIHRyYWl0LmgubXM9Y29udHIuc3VtLCBjb25kaXRpb24uYmVoPWNvbnRyLnN1bSkpDQoNCg0KdGFiIDwtIGFwYV9wcmludChjYXI6OkFub3ZhKGxtLmgsIHR5cGU9MykpJHRhYmxlDQp0YWIkZGZzIDwtIHBhc3RlMCh0YWIkZGYsICIsICIsIHRhYiRkZi5yZXNpZHVhbCkNCnRhYiR0ZXJtIDwtIGMoIlRyYWl0IChtZWRpYW4tc3BsaXQpIiwgIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiUG9pbnRzIGVhcm5lZCIsIA0KICAgICAgICAgICAgICAiRGlmZmVyZW5jZSBpbiBwb2ludHMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiLCAiVHJhaXQgeCBCZWhhdmlvciBjb25kaXRpb25zIikNCg0KDQprYWJsZSh0YWJbLGMoMSw4LDMsMiw3KV0sDQogICAgICBlc2NhcGU9RiwNCiAgICAgIHJvdy5uYW1lcyA9IEYsDQogICAgICBhbGlnbj1jKCJsIiwgInIiLCAiciIsICJyIiwgInIiKSwNCiAgICAgIGNvbC5uYW1lcz1jKCJFZmZlY3QiLCAiZGYiLCAiRiIsICImIzk1MTs8c3ViPnA8L3N1Yj48c3VwPjI8L3N1cD4iLCAiPGk+cDwvaT4iKSwNCiAgICAgIGNhcHRpb249IkFuYWx5c2VzIG9mIHZhcmlhbmNlIGV4YW1pbmluZyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBleHBlcmltZW50YWwgY29uZGl0aW9ucyBhbmQgdGhlIHJlbWFpbmluZyBwZXJzb25hbGl0eSBzdGF0ZXMgYW5kIHNpdHVhdGlvbiBjaGFyYWN0ZXJpc3RpY3Mgd2l0aCBhZGRpdGlvbmFsIGNvdmFyaWF0ZXMgY29udHJvbGxpbmcgZm9yIHRoZSByZXN1bHRzIG9mIHRoZSBnYW1lLiIpICU+JSANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpLCANCiAgICAgICAgICAgICAgICAgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiLCBmaXhlZF90aGVhZCA9IFQpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMSksIHdpZHRoID0gIjIwZW0iKSAlPiUgDQogICBjb2x1bW5fc3BlYyhjKDI6NCksIHdpZHRoID0gIjhlbSIpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9IldlIGluY2x1ZGVkIHRoZSBzaXR1YXRpb24gY29uZGl0aW9ucyBhcyBjb3ZhcmlhdGVzIGluIHRoaXMgbW9kZWwgdG8gY29udHJvbCBmb3IgZGVwZW5kZW5jaWVzIGFtb25nIHBhcnRpY2lwYW50cyB3aG8gZXhwZXJpZW5jZWQgdGhlIHNhbWUgc2l0dWF0aW9uIGNvbmRpdGlvbi4gVGlyZWRuZXNzIHdhcyByZXZlcnNlLWNvZGVkIHN1Y2ggdGhhdCBoaWdoZXIgdmFsdWVzIGluZGljYXRlIGxlc3MgdGlyZWRuZXNzIG9yIGEgbW9yZSBhY3RpdmUgbW9vZC4gU2l0dWF0aW9uIGNvbmRpdGlvbnMsIG1lZGlhbi1zcGxpdCBwZXJzb25hbGl0eSB0cmFpdHMsIGFuZCBiZWhhdmlvciBjb25kaXRpb25zIHdlcmUgZWZmZWN0LWNvZGVkLiIpDQoNCmBgYA0KDQojIyMgU3RhdGUtLVNpdHVhdGlvbiBDb25ncnVlbmNlIHstfQ0KDQojIyMjIE1vZGVsIHdpdGhvdXQgQ292YXJpYXRlcyB7LX0NCg0KYGBge3IgYW92LWF0LXNpdCwgd2FybmluZz1GLCBtZXNzYWdlPUZ9DQoNCmFvdi5zaXQgPC0gYW92X2Nhcihtb29kLmF0IH4gY29uZGl0aW9uLmJlaCAqIGNvbmRpdGlvbi5zaXQgKyBFcnJvcihSZXNwb25zZUlkKSwgZGF0YT1kYXRhKQ0KDQoNCnRhYiA8LSBhcy5kYXRhLmZyYW1lKG5pY2UoYW92LnNpdCwgZXM9InBlcyIsIHNpZ19zeW1ib2xzID0gcmVwKCIiLCA0KSwgTVNFPUZBTFNFKSkNCg0KdGFiJHAudmFsdWVbdGFiJHAudmFsdWU9PSI8LjAwMSJdIDwtICImbHQ7IC4wMDEiDQp0YWIkcGVzW3RhYiRwZXM9PSI8LjAwMSJdIDwtICImbHQ7LjAwMSINCnRhYiRFZmZlY3QgPC0gYygiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJTaXR1YXRpb24gY29uZGl0aW9ucyIsIA0KICAgICAgICAgICAgICAgICJTaXR1YXRpb24geCBCZWhhdmlvciBjb25kaXRpb25zIikNCg0Ka2FibGUodGFiLA0KICAgICAgZXNjYXBlPUYsDQogICAgICBjb2wubmFtZXM9YygiRWZmZWN0IiwgImRmIiwgIkYiLCAiJiM5NTE7PHN1Yj5wPC9zdWI+PHN1cD4yPC9zdXA+IiwgIjxpPnA8L2k+IiksDQogICAgICBjYXB0aW9uPSJBbmFseXNlcyBvZiB2YXJpYW5jZSBleGFtaW5pbmcgYXNzb2NpYXRpb25zIGJldHdlZW4gdGhlIHNpdHVhdGlvbiBjb25kaXRpb25zIGFuZCB0aGUgYmVoYXZpb3IgbWFuaXB1bGF0aW9uIGFuZCB0aXJlZG5lc3MuIikgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIA0KICAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsIGZpeGVkX3RoZWFkID0gVCkgJT4lIA0KICAgY29sdW1uX3NwZWMoYygxKSwgd2lkdGggPSAiMTVlbSIpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMjo0KSwgd2lkdGggPSAiOGVtIikgJT4lIA0KICAgZm9vdG5vdGUoZ2VuZXJhbD0iVGlyZWRuZXNzIHdhcyByZXZlcnNlLWNvZGVkIHN1Y2ggdGhhdCBoaWdoZXIgdmFsdWVzIGluZGljYXRlIGxlc3MgdGlyZWRuZXNzIG9yIGEgbW9yZSBhY3RpdmUgbW9vZC4gU2l0dWF0aW9uIGNvbmRpdGlvbnMgYW5kIGJlaGF2aW9yIGNvbmRpdGlvbnMgd2VyZSBlZmZlY3QtY29kZWQuIikNCg0KYGBgDQoNCiMjIyMgTW9kZWwgd2l0aCBDb3ZhcmlhdGVzIHstfQ0KDQpgYGB7ciBhb3YtYXQtc2l0LWNvdiwgd2FybmluZz1GLCBtZXNzYWdlPUZ9DQoNCmxtLnNpdCA8LSBsbShtb29kLmF0IH4gY29uZGl0aW9uLnNpdCAqIGNvbmRpdGlvbi5iZWggKyBwb2ludHMuYyArIHBvaW50cy5kaWZmLCBkYXRhPWRhdGEsIA0KICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoY29uZGl0aW9uLnNpdD1jb250ci5zdW0sIGNvbmRpdGlvbi5iZWg9Y29udHIuc3VtKSkNCg0KDQp0YWIgPC0gYXBhX3ByaW50KGNhcjo6QW5vdmEobG0uc2l0LCB0eXBlPTMpKSR0YWJsZQ0KdGFiJGRmcyA8LSBwYXN0ZTAodGFiJGRmLCAiLCAiLCB0YWIkZGYucmVzaWR1YWwpDQp0YWIkdGVybSA8LSBjKCJTaXR1YXRpb24gY29uZGl0aW9ucyIsICJCZWhhdmlvciBjb25kaXRpb25zIiwgIlBvaW50cyBlYXJuZWQiLCANCiAgICAgICAgICAgICAgIkRpZmZlcmVuY2UgaW4gcG9pbnRzIiwgIlNpdHVhdGlvbiB4IEJlaGF2aW9yIGNvbmRpdGlvbnMiKQ0KDQoNCmthYmxlKHRhYlssYygxLDgsMywyLDcpXSwNCiAgICAgIGVzY2FwZT1GLA0KICAgICAgcm93Lm5hbWVzID0gRiwNCiAgICAgIGFsaWduPWMoImwiLCAiciIsICJyIiwgInIiLCAiciIpLA0KICAgICAgY29sLm5hbWVzPWMoIkVmZmVjdCIsICJkZiIsICJGIiwgIiYjOTUxOzxzdWI+cDwvc3ViPjxzdXA+Mjwvc3VwPiIsICI8aT5wPC9pPiIpLA0KICAgICAgY2FwdGlvbj0iQW5hbHlzZXMgb2YgdmFyaWFuY2UgZXhhbWluaW5nIGFzc29jaWF0aW9ucyBiZXR3ZWVuIG1lZGlhbi1zcGxpdCBwZXJzb25hbGl0eSB0cmFpdHMsIHRoZSBiZWhhdmlvciBtYW5pcHVsYXRpb24gYW5kIHRpcmVkbmVzcyB3aXRoIGFkZGl0aW9uYWwgY292YXJpYXRlcyBjb250cm9sbGluZyBmb3IgdGhlIHJlc3VsdHMgb2YgdGhlIGdhbWUuIikgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIA0KICAgICAgICAgICAgICAgICBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIsIGZpeGVkX3RoZWFkID0gVCkgJT4lIA0KICAgY29sdW1uX3NwZWMoYygxKSwgd2lkdGggPSAiMjBlbSIpICU+JSANCiAgIGNvbHVtbl9zcGVjKGMoMjo0KSwgd2lkdGggPSAiOGVtIikgJT4lIA0KICAgZm9vdG5vdGUoZ2VuZXJhbD0iVGlyZWRuZXNzIHdhcyByZXZlcnNlLWNvZGVkIHN1Y2ggdGhhdCBoaWdoZXIgdmFsdWVzIGluZGljYXRlIGxlc3MgdGlyZWRuZXNzIG9yIGEgbW9yZSBhY3RpdmUgbW9vZC4gU2l0dWF0aW9uIGNvbmRpdGlvbnMgYW5kIGJlaGF2aW9yIGNvbmRpdGlvbnMgd2VyZSBlZmZlY3QtY29kZWQuIikNCg0KYGBgDQoNCg0KIyMgUmVzcG9uc2UgU3VyZmFjZSBBbmFseXNpcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC19DQoNCmBgYHtyIGF0LXJzYSwgcmVzdWx0cz0iaGlkZSIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KDQpjb250cmFzdHMoZGF0YSRjb25kaXRpb24uc2l0KSA8LSBjb250ci5zdW0oMikNCmNvbnRyYXN0cyhkYXRhJGNvbmRpdGlvbi5iZWgpIDwtIGNvbnRyLnN1bSgyKQ0KDQpoM2IucnNhLmEgPC0gUlNBKG1vb2QuYXQgfiBzdGF0ZS5hLm1jKnRyYWl0LmEubG9uZy5tYywgZGF0YT1kYXRhLCBtb2RlbD0iZnVsbCIsIHZlcmJvc2U9RiwNCiAgICAgICAgICAgICAgICAgY29udHJvbC52YXJpYWJsZXMgPSBjKCJjb25kaXRpb24uYmVoIiwgImNvbmRpdGlvbi5zaXQiKSkNCmgzYi5yc2EuaCA8LSBSU0EobW9vZC5hdCB+IHN0YXRlLmgubWMqdHJhaXQuaC5sb25nLm1jLCBkYXRhPWRhdGEsIG1vZGVsPSJmdWxsIiwgdmVyYm9zZT1GLA0KICAgICAgICAgICAgICAgICBjb250cm9sLnZhcmlhYmxlcyA9IGMoImNvbmRpdGlvbi5iZWgiLCAiY29uZGl0aW9uLnNpdCIpKQ0KaDRiLnJzYS5hLmEgPC0gUlNBKG1vb2QuYXQgfiBzdGF0ZS5hLm1jKmFkdi5tYy5yLCBkYXRhPWRhdGEsIG1vZGVsPSJmdWxsIiwgdmVyYm9zZT1GLA0KICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudmFyaWFibGVzID0gYygiY29uZGl0aW9uLmJlaCIsICJjb25kaXRpb24uc2l0IikpDQpoNGIucnNhLmEuZCA8LSBSU0EobW9vZC5hdCB+IHN0YXRlLmEubWMqZGVjLm1jLnIsIGRhdGE9ZGF0YSwgbW9kZWw9ImZ1bGwiLCB2ZXJib3NlPUYsDQogICAgICAgICAgICAgICAgICAgY29udHJvbC52YXJpYWJsZXMgPSBjKCJjb25kaXRpb24uYmVoIiwgImNvbmRpdGlvbi5zaXQiKSkNCmg0Yi5yc2EuaC5hIDwtIFJTQShtb29kLmF0IH4gc3RhdGUuaC5tYyphZHYubWMuciwgZGF0YT1kYXRhLCBtb2RlbD0iZnVsbCIsIHZlcmJvc2U9RiwNCiAgICAgICAgICAgICAgICAgICBjb250cm9sLnZhcmlhYmxlcyA9IGMoImNvbmRpdGlvbi5iZWgiLCAiY29uZGl0aW9uLnNpdCIpKQ0KaDRiLnJzYS5oLmQgPC0gUlNBKG1vb2QuYXQgfiBzdGF0ZS5oLm1jKmRlYy5tYy5yLCBkYXRhPWRhdGEsIG1vZGVsPSJmdWxsIiwgdmVyYm9zZT1GLA0KICAgICAgICAgICAgICAgICAgIGNvbnRyb2wudmFyaWFibGVzID0gYygiY29uZGl0aW9uLmJlaCIsICJjb25kaXRpb24uc2l0IikpDQoNCmBgYA0KDQojIyMgVHJhaXQtLVN0YXRlIENvbmdydWVuY2U6IEFncmVlYWJsZW5lc3Mgey19DQoNCmBgYHtyIGF0LXJzYS10YWJsZXMtYSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCnRhYiA8LSBnZXRQYXIoaDNiLnJzYS5hLCBzdGFuZGFyZGl6ZWQ9VFJVRSlbYyg4LCAxOjcsIDk6MTMpLF0NCnRhYiRjaSA8LSBwYXN0ZTAoIlsiLHByaW50bnVtKHRhYiRjaS5sb3dlciksICIsICIsIHByaW50bnVtKHRhYiRjaS51cHBlciksICJdIikNCnRhYiRwdmFsdWUgPC0gcHJpbnRwKHRhYiRwdmFsdWUpDQpyb3cubmFtZXModGFiKVsxOjhdIDwtIGMoIihJbnRlcmNlcHQpIiwgIlN0YXRlIEEiLCAiVHJhaXQgQSIsICJTdGF0ZSBBPHN1cD4yPC9zdXA+IiwgIlN0YXRlIEEgeCBUcmFpdCBBIiwgIlRyYWl0IEE8c3VwPjI8L3N1cD4iLCAiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJTaXR1YXRpb24gY29uZGl0aW9ucyIpDQoNCg0Ka2FibGUodGFiWyxjKDEsMiwxMSw5LDUpXQ0KICAgICAgLCBkaWdpdHM9YygyLDIsMiwyLDIpDQogICAgICAsIGFsaWduPWMoImwiLCAiciIsICJyIiwgInIiLCAiciIsICJyIikNCiAgICAgICwgY2FwdGlvbiA9ICJQYXJhbWV0ZXJzIG9mIHRoZSByZXNwb25zZSBzdXJmYWNlIGFuYWx5c2lzIG9mIHRyYWl0IGFncmVlYWJsZW5lc3MgYW5kIHN0YXRlIGFncmVlYWJsZW5lc3MgcHJlZGljdGluZyB0aXJlZG5lc3MuIg0KICAgICAgLCBlc2NhcGUgPSBGQUxTRQ0KICAgICAgLCBjb2wubmFtZXM9YygiTGFiZWwiLCAiPGk+YjwvaT4iLCAiOTUlIENvbmZpZGVuY2UgSW50ZXJ2YWwiLCAiJmJldGE7IiwgIjxpPnA8L2k+IHZhbHVlIikNCikgICU+JSANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gVCwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAgJT4lIA0KICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMThlbSIpICU+JQ0KICAgcGFja19yb3dzKCJSZWdyZXNzaW9uIFBhcmFtZXRlcnMiLCAxLCA4KSAlPiUNCiAgIHBhY2tfcm93cygiUmVzcG9uc2UgU3VyZmFjZSBQYXJhbWV0ZXJzIiwgOSwgMTMpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9ImIgcmVwcmVzZW50cyB1bnN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cywgJmJldGE7IHJlcHJlc2VudHMgc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gY29lZmljaWVudHMuIFN0YXRlIEEgcmVwcmVzZW50cyBzdGF0ZSBhZ3JlZWFibGVuZXNzLCBUcmFpdCBBIHJlcHJlc2VudHMgdHJhaXQgYWdyZWVhYmxlbmVzcy4gUGVyc29uYWxpdHkgdHJhaXRzIHdlcmUgdHJhbnNmb3JtZWQgZnJvbSBhIDUtcG9pbnQgc2NhbGUgdG8gYSA3LXBvaW50IHNjYWxlLiBUaXJlZG5lc3Mgd2FzIHJldmVyc2UtY29kZWQgc3VjaCB0aGF0IGhpZ2hlciB2YWx1ZXMgaW5kaWNhdGUgbGVzcyB0aXJlZG5lc3Mgb3IgYSBtb3JlIGFjdGl2ZSBtb29kLiBDb250cm9sIHZhcmlhYmxlcyAoaS5lLiwgcG9pbnRzIGVhcm5lZCBpbiB0aGUgZ2FtZSwgZGlmZmVyZW5jZSBpbiBwb2ludHMsIGFuZCBleHBlcmltZW50YWwgZ3JvdXBzKSBhcmUgbm90IGxpc3RlZCBpbiB0aGUgb3V0cHV0LiIsIGVzY2FwZT1GKQ0KDQpgYGANCg0KIyMjIFRyYWl0LS1TdGF0ZSBDb25ncnVlbmNlOiBIb25lc3R5IHstfQ0KDQpgYGB7ciBhdC1yc2EtdGFibGVzLWgsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KDQp0YWIgPC0gZ2V0UGFyKGgzYi5yc2EuaCwgc3RhbmRhcmRpemVkPVRSVUUpW2MoOCwgMTo3LCA5OjEzKSxdDQp0YWIkY2kgPC0gcGFzdGUwKCJbIixwcmludG51bSh0YWIkY2kubG93ZXIpLCAiLCAiLCBwcmludG51bSh0YWIkY2kudXBwZXIpLCAiXSIpDQp0YWIkcHZhbHVlIDwtIHByaW50cCh0YWIkcHZhbHVlKQ0Kcm93Lm5hbWVzKHRhYilbMTo4XSA8LSBjKCIoSW50ZXJjZXB0KSIsICJTdGF0ZSBISCIsICJUcmFpdCBISCIsICJTdGF0ZSBISDxzdXA+Mjwvc3VwPiIsICJTdGF0ZSBISCB4IFRyYWl0IEhIIiwgIlRyYWl0IEhIPHN1cD4yPC9zdXA+IiwgIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKQ0KDQoNCmthYmxlKHRhYlssYygxLDIsMTEsOSw1KV0NCiAgICAgICwgZGlnaXRzPWMoMiwyLDIsMiwyKQ0KICAgICAgLCBhbGlnbj1jKCJsIiwgInIiLCAiciIsICJyIiwgInIiLCAiciIpDQogICAgICAsIGNhcHRpb24gPSAiUGFyYW1ldGVycyBvZiB0aGUgcmVzcG9uc2Ugc3VyZmFjZSBhbmFseXNpcyBvZiB0cmFpdCBob25lc3R5LWh1bWlsaXR5IGFuZCBzdGF0ZSBob25lc3R5LWh1bWlsaXR5IHByZWRpY3RpbmcgdGlyZWRuZXNzLiINCiAgICAgICwgZXNjYXBlID0gRkFMU0UNCiAgICAgICwgY29sLm5hbWVzPWMoIkxhYmVsIiwgIjxpPmI8L2k+IiwgIjk1JSBDb25maWRlbmNlIEludGVydmFsIiwgIiZiZXRhOyIsICI8aT5wPC9pPiB2YWx1ZSIpDQopICAlPiUgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmaXhlZF90aGVhZCA9IFQsIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgICU+JSANCiAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjE4ZW0iKSAlPiUNCiAgIHBhY2tfcm93cygiUmVncmVzc2lvbiBQYXJhbWV0ZXJzIiwgMSwgOCkgJT4lDQogICBwYWNrX3Jvd3MoIlJlc3BvbnNlIFN1cmZhY2UgUGFyYW1ldGVycyIsIDksIDEzKSAlPiUgDQogICBmb290bm90ZShnZW5lcmFsPSJiIHJlcHJlc2VudHMgdW5zdGFuZGFyZGl6ZWQgcmVncmVzc2lvbiBjb2VmZmljaWVudHMsICZiZXRhOyByZXByZXNlbnRzIHN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZpY2llbnRzLiBTdGF0ZSBISCByZXByZXNlbnRzIHN0YXRlIGhvbmVzdHktaHVtaWxpdHksIFRyYWl0IEhIIHJlcHJlc2VudHMgdHJhaXQgaG9uZXN0eS1odW1pbGl0eS4gUGVyc29uYWxpdHkgdHJhaXRzIHdlcmUgdHJhbnNmb3JtZWQgZnJvbSBhIDUtcG9pbnQgc2NhbGUgdG8gYSA3LXBvaW50IHNjYWxlLiBUaXJlZG5lc3Mgd2FzIHJldmVyc2UtY29kZWQgc3VjaCB0aGF0IGhpZ2hlciB2YWx1ZXMgaW5kaWNhdGUgbGVzcyB0aXJlZG5lc3Mgb3IgYSBtb3JlIGFjdGl2ZSBtb29kLiBDb250cm9sIHZhcmlhYmxlcyAoaS5lLiwgcG9pbnRzIGVhcm5lZCBpbiB0aGUgZ2FtZSwgZGlmZmVyZW5jZSBpbiBwb2ludHMsIGFuZCBleHBlcmltZW50YWwgZ3JvdXBzKSBhcmUgbm90IGxpc3RlZCBpbiB0aGUgb3V0cHV0LiIsIGVzY2FwZT1GKQ0KDQpgYGANCg0KIyMjIFN0YXRlLS1TaXR1YXRpb24gQ29uZ3J1ZW5jZTogQWdyZWVhYmxlbmVzcyBhbmQgQWR2ZXJzaXR5IHstfQ0KDQpgYGB7ciBhdC1yc2EtdGFibGVzLWEtYSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCnRhYiA8LSBnZXRQYXIoaDRiLnJzYS5hLmEsIHN0YW5kYXJkaXplZD1UUlVFKVtjKDgsIDE6NywgOToxMyksXQ0KdGFiJGNpIDwtIHBhc3RlMCgiWyIscHJpbnRudW0odGFiJGNpLmxvd2VyKSwgIiwgIiwgcHJpbnRudW0odGFiJGNpLnVwcGVyKSwgIl0iKQ0KdGFiJHB2YWx1ZSA8LSBwcmludHAodGFiJHB2YWx1ZSkNCnJvdy5uYW1lcyh0YWIpWzE6OF0gPC0gYygiKEludGVyY2VwdCkiLCAiU3RhdGUgQSIsICJBZHYocikiLCAiU3RhdGUgQTxzdXA+Mjwvc3VwPiIsICJTdGF0ZSBBIHggQWR2KHIpIiwgIkFkdihyKTxzdXA+Mjwvc3VwPiIsICJCZWhhdmlvciBjb25kaXRpb25zIiwgIlNpdHVhdGlvbiBjb25kaXRpb25zIikNCg0KDQprYWJsZSh0YWJbLGMoMSwyLDExLDksNSldDQogICAgICAsIGRpZ2l0cz1jKDIsMiwyLDIsMikNCiAgICAgICwgYWxpZ249YygibCIsICJyIiwgInIiLCAiciIsICJyIiwgInIiKQ0KICAgICAgLCBjYXB0aW9uID0gIlBhcmFtZXRlcnMgb2YgdGhlIHJlc3BvbnNlIHN1cmZhY2UgYW5hbHlzaXMgb2Ygc3RhdGUgYWdyZWVhYmxlbmVzcyBhbmQgYWR2ZXJzaXR5IHByZWRpY3RpbmcgdGlyZWRuZXNzLiINCiAgICAgICwgZXNjYXBlID0gRkFMU0UNCiAgICAgICwgY29sLm5hbWVzPWMoIkxhYmVsIiwgIjxpPmI8L2k+IiwgIjk1JSBDb25maWRlbmNlIEludGVydmFsIiwgIiZiZXRhOyIsICI8aT5wPC9pPiB2YWx1ZSIpDQopICAlPiUgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmaXhlZF90aGVhZCA9IFQsIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJsZWZ0IikgICU+JSANCiAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjE4ZW0iKSAlPiUNCiAgIHBhY2tfcm93cygiUmVncmVzc2lvbiBQYXJhbWV0ZXJzIiwgMSwgOCkgJT4lDQogICBwYWNrX3Jvd3MoIlJlc3BvbnNlIFN1cmZhY2UgUGFyYW1ldGVycyIsIDksIDEzKSAlPiUgDQogICBmb290bm90ZShnZW5lcmFsPSJiIHJlcHJlc2VudHMgdW5zdGFuZGFyZGl6ZWQgcmVncmVzc2lvbiBjb2VmZmljaWVudHMsICZiZXRhOyByZXByZXNlbnRzIHN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZpY2llbnRzLiBTdGF0ZSBBIHJlcHJlc2VudHMgc3RhdGUgYWdyZWVhYmxlbmVzcywgQWR2KHIpIHJlcHJlc2VudHMgcmV2ZXJzZS1jb2RlZCBBZHZlcnNpdHkuIEFkdmVyc2l0eSB3YXMgcmV2ZXJzZS1jb2RlZCBzdWNoIHRoYXQgaGlnaGVyIGxldmVscyBpbmRpY2F0ZSBsZXNzIGFkdmVyc2l0eS4gVGlyZWRuZXNzIHdhcyByZXZlcnNlLWNvZGVkIHN1Y2ggdGhhdCBoaWdoZXIgdmFsdWVzIGluZGljYXRlIGxlc3MgdGlyZWRuZXNzIG9yIGEgbW9yZSBhY3RpdmUgbW9vZC4gQ29udHJvbCB2YXJpYWJsZXMgKGkuZS4sIHBvaW50cyBlYXJuZWQgaW4gdGhlIGdhbWUsIGRpZmZlcmVuY2UgaW4gcG9pbnRzLCBhbmQgZXhwZXJpbWVudGFsIGdyb3VwcykgYXJlIG5vdCBsaXN0ZWQgaW4gdGhlIG91dHB1dC4iLCBlc2NhcGU9RikNCg0KYGBgDQoNCiMjIyBTdGF0ZS0tU2l0dWF0aW9uIENvbmdydWVuY2U6IEFncmVlYWJsZW5lc3MgYW5kIERlY2VwdGlvbiB7LX0NCg0KYGBge3IgYXQtcnNhLXRhYmxlcy1hLWQsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KDQp0YWIgPC0gZ2V0UGFyKGg0Yi5yc2EuYS5kLCBzdGFuZGFyZGl6ZWQ9VFJVRSlbYyg4LCAxOjcsIDk6MTMpLF0NCnRhYiRjaSA8LSBwYXN0ZTAoIlsiLHByaW50bnVtKHRhYiRjaS5sb3dlciksICIsICIsIHByaW50bnVtKHRhYiRjaS51cHBlciksICJdIikNCnRhYiRwdmFsdWUgPC0gcHJpbnRwKHRhYiRwdmFsdWUpDQpyb3cubmFtZXModGFiKVsxOjhdIDwtIGMoIihJbnRlcmNlcHQpIiwgIlN0YXRlIEEiLCAiRGVjKHIpIiwgIlN0YXRlIEE8c3VwPjI8L3N1cD4iLCAiU3RhdGUgQSB4IERlYyhyKSIsICJEZWMocik8c3VwPjI8L3N1cD4iLCAiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJTaXR1YXRpb24gY29uZGl0aW9ucyIpDQoNCg0Ka2FibGUodGFiWyxjKDEsMiwxMSw5LDUpXQ0KICAgICAgLCBkaWdpdHM9YygyLDIsMiwyLDIpDQogICAgICAsIGFsaWduPWMoImwiLCAiciIsICJyIiwgInIiLCAiciIsICJyIikNCiAgICAgICwgY2FwdGlvbiA9ICJQYXJhbWV0ZXJzIG9mIHRoZSByZXNwb25zZSBzdXJmYWNlIGFuYWx5c2lzIG9mIHN0YXRlIGFncmVlYWJsZW5lc3MgYW5kIGRlY2VwdGlvbiBwcmVkaWN0aW5nIHRpcmVkbmVzcy4iDQogICAgICAsIGVzY2FwZSA9IEZBTFNFDQogICAgICAsIGNvbC5uYW1lcz1jKCJMYWJlbCIsICI8aT5iPC9pPiIsICI5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbCIsICImYmV0YTsiLCAiPGk+cDwvaT4gdmFsdWUiKQ0KKSAgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBULCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICAlPiUgDQogICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIxOGVtIikgJT4lDQogICBwYWNrX3Jvd3MoIlJlZ3Jlc3Npb24gUGFyYW1ldGVycyIsIDEsIDgpICU+JQ0KICAgcGFja19yb3dzKCJSZXNwb25zZSBTdXJmYWNlIFBhcmFtZXRlcnMiLCA5LCAxMykgJT4lIA0KICAgZm9vdG5vdGUoZ2VuZXJhbD0iYiByZXByZXNlbnRzIHVuc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLCAmYmV0YTsgcmVwcmVzZW50cyBzdGFuZGFyZGl6ZWQgcmVncmVzc2lvbiBjb2VmaWNpZW50cy4gU3RhdGUgQSByZXByZXNlbnRzIHN0YXRlIGFncmVlYWJsZW5lc3MsIERlYyhyKSByZXByZXNlbnRzIHJldmVyc2UtY29kZWQgRGVjZXB0aW9uLiBEZWNlcHRpb24gd2FzIHJldmVyc2UtY29kZWQgc3VjaCB0aGF0IGhpZ2hlciBsZXZlbHMgaW5kaWNhdGUgbGVzcyBkZWNlcHRpb24uIFRpcmVkbmVzcyB3YXMgcmV2ZXJzZS1jb2RlZCBzdWNoIHRoYXQgaGlnaGVyIHZhbHVlcyBpbmRpY2F0ZSBsZXNzIHRpcmVkbmVzcyBvciBhIG1vcmUgYWN0aXZlIG1vb2QuIENvbnRyb2wgdmFyaWFibGVzIChpLmUuLCBwb2ludHMgZWFybmVkIGluIHRoZSBnYW1lLCBkaWZmZXJlbmNlIGluIHBvaW50cywgYW5kIGV4cGVyaW1lbnRhbCBncm91cHMpIGFyZSBub3QgbGlzdGVkIGluIHRoZSBvdXRwdXQuIiwgZXNjYXBlPUYpDQoNCmBgYA0KDQojIyMgU3RhdGUtLVNpdHVhdGlvbiBDb25ncnVlbmNlOiBIb25lc3R5IGFuZCBBZHZlcnNpdHkgey19DQoNCmBgYHtyIGF0LXJzYS10YWJsZXMtaC1hLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KdGFiIDwtIGdldFBhcihoNGIucnNhLmguYSwgc3RhbmRhcmRpemVkPVRSVUUpW2MoOCwgMTo3LCA5OjEzKSxdDQp0YWIkY2kgPC0gcGFzdGUwKCJbIixwcmludG51bSh0YWIkY2kubG93ZXIpLCAiLCAiLCBwcmludG51bSh0YWIkY2kudXBwZXIpLCAiXSIpDQp0YWIkcHZhbHVlIDwtIHByaW50cCh0YWIkcHZhbHVlKQ0Kcm93Lm5hbWVzKHRhYilbMTo4XSA8LSBjKCIoSW50ZXJjZXB0KSIsICJTdGF0ZSBISCIsICJBZHYocikiLCAiU3RhdGUgSEg8c3VwPjI8L3N1cD4iLCAiU3RhdGUgSEggeCBBZHYocikiLCAiQWR2KHIpPHN1cD4yPC9zdXA+IiwgIkJlaGF2aW9yIGNvbmRpdGlvbnMiLCAiU2l0dWF0aW9uIGNvbmRpdGlvbnMiKQ0KDQoNCmthYmxlKHRhYlssYygxLDIsMTEsOSw1KV0NCiAgICAgICwgZGlnaXRzPWMoMiwyLDIsMiwyKQ0KICAgICAgLCBhbGlnbj1jKCJsIiwgInIiLCAiciIsICJyIiwgInIiLCAiciIpDQogICAgICAsIGNhcHRpb24gPSAiUGFyYW1ldGVycyBvZiB0aGUgcmVzcG9uc2Ugc3VyZmFjZSBhbmFseXNpcyBvZiBzdGF0ZSBob25lc3R5LWh1bWlsaXR5IGFuZCBhZHZlcnNpdHkgcHJlZGljdGluZyB0aXJlZG5lc3MuIg0KICAgICAgLCBlc2NhcGUgPSBGQUxTRQ0KICAgICAgLCBjb2wubmFtZXM9YygiTGFiZWwiLCAiPGk+YjwvaT4iLCAiOTUlIENvbmZpZGVuY2UgSW50ZXJ2YWwiLCAiJmJldGE7IiwgIjxpPnA8L2k+IHZhbHVlIikNCikgICU+JSANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gVCwgZnVsbF93aWR0aCA9IEYsIHBvc2l0aW9uID0gImxlZnQiKSAgJT4lIA0KICAgY29sdW1uX3NwZWMoMSwgd2lkdGggPSAiMThlbSIpICU+JQ0KICAgcGFja19yb3dzKCJSZWdyZXNzaW9uIFBhcmFtZXRlcnMiLCAxLCA4KSAlPiUNCiAgIHBhY2tfcm93cygiUmVzcG9uc2UgU3VyZmFjZSBQYXJhbWV0ZXJzIiwgOSwgMTMpICU+JSANCiAgIGZvb3Rub3RlKGdlbmVyYWw9ImIgcmVwcmVzZW50cyB1bnN0YW5kYXJkaXplZCByZWdyZXNzaW9uIGNvZWZmaWNpZW50cywgJmJldGE7IHJlcHJlc2VudHMgc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gY29lZmljaWVudHMuIFN0YXRlIEhIIHJlcHJlc2VudHMgc3RhdGUgaG9uZXN0eS1odW1pbGl0eSwgQWR2KHIpIHJlcHJlc2VudHMgcmV2ZXJzZS1jb2RlZCBBZHZlcnNpdHkuIEFkdmVyc2l0eSB3YXMgcmV2ZXJzZS1jb2RlZCBzdWNoIHRoYXQgaGlnaGVyIGxldmVscyBpbmRpY2F0ZSBsZXNzIGFkdmVyc2l0eS4gVGlyZWRuZXNzIHdhcyByZXZlcnNlLWNvZGVkIHN1Y2ggdGhhdCBoaWdoZXIgdmFsdWVzIGluZGljYXRlIGxlc3MgdGlyZWRuZXNzIG9yIGEgbW9yZSBhY3RpdmUgbW9vZC4gQ29udHJvbCB2YXJpYWJsZXMgKGkuZS4sIHBvaW50cyBlYXJuZWQgaW4gdGhlIGdhbWUsIGRpZmZlcmVuY2UgaW4gcG9pbnRzLCBhbmQgZXhwZXJpbWVudGFsIGdyb3VwcykgYXJlIG5vdCBsaXN0ZWQgaW4gdGhlIG91dHB1dC4iLCBlc2NhcGU9RikNCg0KYGBgDQoNCiMjIyBTdGF0ZS0tU2l0dWF0aW9uIENvbmdydWVuY2U6IEhvbmVzdHkgYW5kIERlY2VwdGlvbiB7LX0NCg0KYGBge3IgYXQtcnNhLXRhYmxlcy1oLWQsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0KDQp0YWIgPC0gZ2V0UGFyKGg0Yi5yc2EuaC5kLCBzdGFuZGFyZGl6ZWQ9VFJVRSlbYyg4LCAxOjcsIDk6MTMpLF0NCnRhYiRjaSA8LSBwYXN0ZTAoIlsiLHByaW50bnVtKHRhYiRjaS5sb3dlciksICIsICIsIHByaW50bnVtKHRhYiRjaS51cHBlciksICJdIikNCnRhYiRwdmFsdWUgPC0gcHJpbnRwKHRhYiRwdmFsdWUpDQpyb3cubmFtZXModGFiKVsxOjhdIDwtIGMoIihJbnRlcmNlcHQpIiwgIlN0YXRlIEhIIiwgIkRlYyhyKSIsICJTdGF0ZSBISDxzdXA+Mjwvc3VwPiIsICJTdGF0ZSBISCB4IERlYyhyKSIsICJEZWMocik8c3VwPjI8L3N1cD4iLCAiQmVoYXZpb3IgY29uZGl0aW9ucyIsICJTaXR1YXRpb24gY29uZGl0aW9ucyIpDQoNCg0Ka2FibGUodGFiWyxjKDEsMiwxMSw5LDUpXQ0KICAgICAgLCBkaWdpdHM9YygyLDIsMiwyLDIpDQogICAgICAsIGFsaWduPWMoImwiLCAiciIsICJyIiwgInIiLCAiciIsICJyIikNCiAgICAgICwgY2FwdGlvbiA9ICJQYXJhbWV0ZXJzIG9mIHRoZSByZXNwb25zZSBzdXJmYWNlIGFuYWx5c2lzIG9mIHN0YXRlIGhvbmVzdHktaHVtaWxpdHkgYW5kIGRlY2VwdGlvbiBwcmVkaWN0aW5nIHRpcmVkbmVzcy4iDQogICAgICAsIGVzY2FwZSA9IEZBTFNFDQogICAgICAsIGNvbC5uYW1lcz1jKCJMYWJlbCIsICI8aT5iPC9pPiIsICI5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbCIsICImYmV0YTsiLCAiPGk+cDwvaT4gdmFsdWUiKQ0KKSAgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBULCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAibGVmdCIpICAlPiUgDQogICBjb2x1bW5fc3BlYygxLCB3aWR0aCA9ICIxOGVtIikgJT4lDQogICBwYWNrX3Jvd3MoIlJlZ3Jlc3Npb24gUGFyYW1ldGVycyIsIDEsIDgpICU+JQ0KICAgcGFja19yb3dzKCJSZXNwb25zZSBTdXJmYWNlIFBhcmFtZXRlcnMiLCA5LCAxMykgJT4lIA0KICAgZm9vdG5vdGUoZ2VuZXJhbD0iYiByZXByZXNlbnRzIHVuc3RhbmRhcmRpemVkIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzLCAmYmV0YTsgcmVwcmVzZW50cyBzdGFuZGFyZGl6ZWQgcmVncmVzc2lvbiBjb2VmaWNpZW50cy4gU3RhdGUgSEggcmVwcmVzZW50cyBzdGF0ZSBob25lc3R5LWh1bWlsaXR5LCBEZWMocikgcmVwcmVzZW50cyByZXZlcnNlLWNvZGVkIERlY2VwdGlvbi4gRGVjZXB0aW9uIHdhcyByZXZlcnNlLWNvZGVkIHN1Y2ggdGhhdCBoaWdoZXIgbGV2ZWxzIGluZGljYXRlIGxlc3MgZGVjZXB0aW9uLiBUaXJlZG5lc3Mgd2FzIHJldmVyc2UtY29kZWQgc3VjaCB0aGF0IGhpZ2hlciB2YWx1ZXMgaW5kaWNhdGUgbGVzcyB0aXJlZG5lc3Mgb3IgYSBtb3JlIGFjdGl2ZSBtb29kLiBDb250cm9sIHZhcmlhYmxlcyAoaS5lLiwgcG9pbnRzIGVhcm5lZCBpbiB0aGUgZ2FtZSwgZGlmZmVyZW5jZSBpbiBwb2ludHMsIGFuZCBleHBlcmltZW50YWwgZ3JvdXBzKSBhcmUgbm90IGxpc3RlZCBpbiB0aGUgb3V0cHV0LiIsIGVzY2FwZT1GKQ0KDQpgYGANCg0KIyMgVmlzdWFsaXphdGlvbiB7LnRhYnNldCAudGFic2V0LXBpbGxzIC19DQoNCiMjIyBBTk9WQSBJbnRlcmFjdGlvbiBQbG90cyB7LX0NCg0KYGBge3IgYXQtYW92LXBsb3QsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9MS4yLCBvdXQud2lkdGg9JzkwJScsIGZpZy5jYXA9IkludGVyYWN0aW9uIHBsb3RzIG9mIGludGVyYWN0aW9ucyBiZXR3ZWVuIG1lZGlhbi1zcGxpdCBwZXJzb25hbGl0eSB0cmFpdHMsIGJlaGF2aW9yIGNvbmRpdGlvbnMsIGFuZCBzaXR1YXRpb24gY29uZGl0aW9ucyBwcmVkaWN0aW5nIHJldmVyc2UtY29kZWQgdGlyZWRuZXNzIChpLmUuLCBoaWdoZXIgbGV2ZWxzIGluZGljYXRlIGxlc3MgdGlyZWRuZXNzKS4ifQ0KDQpwMSA8LSBpbnRlcmFjdGlvbnM6OmNhdF9wbG90KGxtLmEsIHByZWQ9Y29uZGl0aW9uLmJlaCwgbW9keD10cmFpdC5hLm1zLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxvdC5wb2ludHMgPSBULCBwb2ludC5zaXplPTEsIHBvaW50LmFscGhhPS4zLCBqdHRlcj0uMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbT0ibGluZSIsIGludGVydmFsPVQsIGludGVydmFsLmdlb20gPSAibGluZXJhbmdlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZC5wb2ludC5zaXplID0gNSwgZG9kZ2Uud2lkdGggPSAwLjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgubGFiZWw9IkJlaGF2aW9yIENvbmRpdGlvbnMiLCB5LmxhYmVsPSJUaXJlZG5lc3MgKHIpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbi50aXRsZSA9ICJUcmFpdCBBZ3JlZWFibGVuZXNzIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYWluID0gIlRyYWl0IEFncmVlYWJsZW5lc3MgKG1lZGlhbi1zcGxpdCkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9Y29scy5iZWgpICsgDQogICB0aGVtZV9wdWIoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQ9YygwLjIsIDAuMikpDQoNCg0KcDIgPC0gaW50ZXJhY3Rpb25zOjpjYXRfcGxvdChsbS5oLCBwcmVkPWNvbmRpdGlvbi5iZWgsIG1vZHg9dHJhaXQuaC5tcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QucG9pbnRzID0gVCwgcG9pbnQuc2l6ZT0xLCBwb2ludC5hbHBoYT0uMywganR0ZXI9LjIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb209ImxpbmUiLCBpbnRlcnZhbD1ULCBpbnRlcnZhbC5nZW9tID0gImxpbmVyYW5nZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQucG9pbnQuc2l6ZSA9IDUsIGRvZGdlLndpZHRoID0gMC4zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LmxhYmVsPSJCZWhhdmlvciBDb25kaXRpb25zIiwgeS5sYWJlbD0iVGlyZWRuZXNzIChyKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW4udGl0bGUgPSAiVHJhaXQgSG9uZXN0eSB4IEJlaGF2aW9yIENvbmRpdGlvbnMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQubWFpbiA9ICJUcmFpdCBIb25lc3R5IChtZWRpYW4tc3BsaXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWNvbHMuYmVoKSArIA0KICAgdGhlbWVfcHViKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHNjYWxlX3hfZGlzY3JldGUoZXhwYW5kPWMoMC4yLCAwLjIpKQ0KDQoNCnAzIDwtIGludGVyYWN0aW9uczo6Y2F0X3Bsb3QobG0uc2l0LCBwcmVkPWNvbmRpdGlvbi5iZWgsIG1vZHg9Y29uZGl0aW9uLnNpdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3QucG9pbnRzID0gVCwgcG9pbnQuc2l6ZT0xLCBwb2ludC5hbHBoYT0uMywganR0ZXI9LjIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb209ImxpbmUiLCBpbnRlcnZhbD1ULCBpbnRlcnZhbC5nZW9tID0gImxpbmVyYW5nZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQucG9pbnQuc2l6ZSA9IDUsIGRvZGdlLndpZHRoID0gMC4zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LmxhYmVsPSJCZWhhdmlvciBDb25kaXRpb25zIiwgeS5sYWJlbD0iVGlyZWRuZXNzIChyKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW4udGl0bGUgPSAiU2l0dWF0aW9uIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5tYWluID0gIlNpdHVhdGlvbiBDb25kaXRpb25zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWNvbHMuYmVoKSArIA0KICAgdGhlbWVfcHViKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHNjYWxlX3hfZGlzY3JldGUoZXhwYW5kPWMoMC4yLCAwLjIpKQ0KDQoNCnAxIC8gcGxvdF9zcGFjZXIoKSAvIHAyIC8gcGxvdF9zcGFjZXIoKSAvIHAzICsgcGxvdF9sYXlvdXQoaGVpZ2h0cz1jKDEsMC4xLCAxLCAwLjEsMSkpICsgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSAiQSIpDQoNCmBgYA0KDQojIyMgUmVzcG9uc2UgU3VyZmFjZSBQbG90cyB7LX0NCg0KYGBge3IgYXQtcnNhLXBsb3QsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9MS41LCBmaWcuY2FwPSJSZXNwb25zZSBzdXJmYWNlIHBsb3RzIG9mIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRyYWl0LS1zdGF0ZSBjb25ncnVlbmNlLCBzdGF0ZS0tc2l0dWF0aW9uIGNvbmdydWVuY2UsIGFuZCB0aXJlZG5lc3MuIEFkdmVyc2l0eSwgZGVjZXB0aW9uLCBhbmQgdGlyZWRuZXNzIHdlcmUgcmV2ZXJzZS1jb2RlZCAoaW5kaWNhdGVkIGJ5ICoocikqKSBzdWNoIHRoYXQgaGlnaGVyIHZhbHVlcyBpbmRpY2F0ZSBsZXNzIGFkdmVyc2l0eSwgZGVjcGV0aW9uLCBhbmQgdGlyZWRuZXNzLCByZXNwZWN0aXZlbHkuIFRoZSByZXNwb25zZSBzdXJmYWNlIHBhcmFtZXRlcnMgYXJlIGxpc3RlZCBiZWxvdyB0aGUgdGl0bGVzLiBUaGUgYmx1ZSBsaW5lcyByZXByZXNlbnQgdGhlIGxpbmUgb2YgY29uZ3J1ZW5jZSAoTE9DOyBpLmUuLCBYID0gWSkgYW5kIHRoZSBsaW5lIG9mIGluY29uZ3J1ZW5jZSAoTE9JQzsgaS5lLiwgWCA9IC1ZKS4gVGhlIGJsYWNrIGxpbmVzIHJlcHJlc2VudCB0aGUgcmFuZ2Ugb2Ygb2JzZXJ2ZWQgdmFsdWVzIGFzIGEgdHdvZGltZW5zaW9uYWwgYm94cGxvdC4ifQ0KDQojIyBwcmludCBSU0EgcGxvdHMNCmEgPC0gcGxvdChoM2IucnNhLmEsIHhsYWI9IlN0YXRlIEFncmVlYWJsZW5lc3MiLCB5bGFiPSJUcmFpdCBBZ3JlZWFibGVuZXNzIiwgemxhYj0iVGlyZWRuZXNzKHIpIiwNCiAgICAgICAgICAgbGVnZW5kPUZBTFNFLCBkaXN0YW5jZSA9IGMoMS4zLCAxLjMsIDEuNCksIG1haW49IlRyYWl0LVN0YXRlIENvbmdydWVuY2U6IEFncmVlYWJsZW5lc3MiLA0KICAgICAgICAgICBwcm9qZWN0ID0gYygiY29udG91ciIpLCBheGVzID0gYygiTE9DIiwgIkxPSUMiKSwgaHVsbD1GLA0KICAgICAgICAgICBwYXJhbT1ULCBncmlkc2l6ZT03LCBwb2ludHM9bGlzdChzaG93PUZBTFNFKSwgemxpbT1jKDEsIDUuNSkpDQoNCmIgPC0gcGxvdChoM2IucnNhLmgsIHhsYWI9IlN0YXRlIEhvbmVzdHkiLCB5bGFiPSJUcmFpdCBIb25lc3R5IiwgemxhYj0iVGlyZWRuZXNzKHIpIiwgDQogICAgICAgICAgIGxlZ2VuZD1GQUxTRSwgZGlzdGFuY2UgPSBjKDEuMywgMS4zLCAxLjQpLCBtYWluPSJUcmFpdC1TdGF0ZSBDb25ncnVlbmNlOiBIb25lc3R5LWh1bWlsaXR5IiwNCiAgICAgICAgICAgcHJvamVjdCA9IGMoImNvbnRvdXIiKSwgYXhlcyA9IGMoIkxPQyIsICJMT0lDIiksIGh1bGw9RiwNCiAgICAgICAgICAgcGFyYW09VCwgZ3JpZHNpemU9NywgcG9pbnRzPWxpc3Qoc2hvdz1GQUxTRSksIHpsaW09YygxLCA1LjUpKQ0KDQpjIDwtIHBsb3QoaDRiLnJzYS5hLmEsIHhsYWI9IlN0YXRlIEFncmVlYWJsZW5lc3MiLCB5bGFiPSJBZHZlcnNpdHkocikiLCB6bGFiPSJUaXJlZG5lc3MocikiLA0KICAgICAgICAgICBsZWdlbmQ9RkFMU0UsIGRpc3RhbmNlID0gYygxLjMsIDEuMywgMS40KSwgbWFpbj0iU3RhdGUtU2l0dWF0aW9uIENvbmdydWVuY2U6XG5BZ3JlZWFibGVuZXNzIGFuZCBBZHZlcnNpdHkiLA0KICAgICAgICAgICBwcm9qZWN0ID0gYygiY29udG91ciIpLCBheGVzID0gYygiTE9DIiwgIkxPSUMiKSwgaHVsbD1GLA0KICAgICAgICAgICBwYXJhbT1ULCBncmlkc2l6ZT03LCBwb2ludHM9bGlzdChzaG93PUZBTFNFKSwgemxpbT1jKDEsIDUuNSkpDQoNCmQgPC0gcGxvdChoNGIucnNhLmguYSwgeGxhYj0iU3RhdGUgSG9uZXN0eSIsIHlsYWI9IkFkdmVyc2l0eShyKSIsIHpsYWI9IlRpcmVkbmVzcyhyKSIsIA0KICAgICAgICAgICBsZWdlbmQ9RkFMU0UsIGRpc3RhbmNlID0gYygxLjMsIDEuMywgMS40KSwgbWFpbj0iU3RhdGUtU2l0dWF0aW9uIENvbmdydWVuY2U6XG5Ib25lc3R5IGFuZCBBZHZlcnNpdHkiLA0KICAgICAgICAgICBwcm9qZWN0ID0gYygiY29udG91ciIpLCBheGVzID0gYygiTE9DIiwgIkxPSUMiKSwgaHVsbD1GLA0KICAgICAgICAgICBwYXJhbT1ULCBncmlkc2l6ZT03LCBwb2ludHM9bGlzdChzaG93PUZBTFNFKSwgemxpbT1jKDEsIDUuNSkpDQoNCmUgPC0gcGxvdChoNGIucnNhLmEuZCwgeGxhYj0iU3RhdGUgQWdyZWVhYmxlbmVzcyIsIHlsYWI9IkRlY2VwdGlvbihyKSIsIHpsYWI9IlRpcmVkbmVzcyhyKSIsDQogICAgICAgICAgIGxlZ2VuZD1GQUxTRSwgZGlzdGFuY2UgPSBjKDEuMywgMS4zLCAxLjQpLCBtYWluPSJTdGF0ZS1TaXR1YXRpb24gQ29uZ3J1ZW5jZTpcbkFncmVlYWJsZW5lc3MgYW5kIERlY2VwdGlvbiIsDQogICAgICAgICAgIHByb2plY3QgPSBjKCJjb250b3VyIiksIGF4ZXMgPSBjKCJMT0MiLCAiTE9JQyIpLCBodWxsPUYsDQogICAgICAgICAgIHBhcmFtPVQsIGdyaWRzaXplPTcsIHBvaW50cz1saXN0KHNob3c9RkFMU0UpLCB6bGltPWMoMSwgNS41KSkNCg0KZiA8LSBwbG90KGg0Yi5yc2EuaC5kLCB4bGFiPSJTdGF0ZSBIb25lc3R5IiwgeWxhYj0iRGVjZXB0aW9uKHIpIiwgemxhYj0iVGlyZWRuZXNzKHIpIiwgDQogICAgICAgICAgIGxlZ2VuZD1GQUxTRSwgZGlzdGFuY2UgPSBjKDEuMywgMS4zLCAxLjQpLCBtYWluPSJTdGF0ZS1TaXR1YXRpb24gQ29uZ3J1ZW5jZTpcbkhvbmVzdHkgYW5kIERlY2VwdGlvbiIsDQogICAgICAgICAgIHByb2plY3QgPSBjKCJjb250b3VyIiksIGF4ZXMgPSBjKCJMT0MiLCAiTE9JQyIpLCBodWxsPUYsDQogICAgICAgICAgIHBhcmFtPVQsIGdyaWRzaXplPTcsIHBvaW50cz1saXN0KHNob3c9RkFMU0UpLCB6bGltPWMoMSwgNS41KSkNCg0KDQojIyBjb21iaW5lIHBsb3RzDQpjb3dwbG90OjpwbG90X2dyaWQoYSxiLGMsZCxlLGYsIG5jb2wgPSAyLCBsYWJlbHM9IkFVVE8iLCBsYWJlbF9zaXplID0gMTIpDQoNCmBgYA0KDQojIyBDb25jbHVzaW9uIHstfQ0KDQpPdmVyYWxsLCB0aGUgZGF0YSBkaWQgbm90IHN1cHBvcnQgdGhlIGNvbmdydWVuY2UgaHlwb3RoZXNlcyB3aXRoIHJlZ2FyZCB0byB0aXJlZG5lc3M6DQoNCiogQW5hbHlzZXMgb2YgdmFyaWFuY2UgZGlkIG5vdCB5aWVsZCBhbnkgc2lnbmlmaWNhbnQgaW50ZXJhY3Rpb24gZWZmZWN0cyAoYWxsICpGKnMgPCBgciBwcmludG51bShtYXgoc3VtbWFyeShhb3YuYSlbNCw0XSwgc3VtbWFyeShhb3YuaClbNCw0XSwgc3VtbWFyeShhb3Yuc2l0KVszLDRdKSlgLCBhbGwgKnAqcyA+IGByIHByaW50cChtaW4oc3VtbWFyeShhb3YuYSlbNCw2XSwgc3VtbWFyeShhb3YuaClbNCw2XSwgc3VtbWFyeShhb3Yuc2l0KVszLDZdKSlgKQ0KDQoqIE9ubHkgdGhlIGJlaGF2aW9yIGNvbmRpdGlvbnMgd2VyZSBzaWduaWZpY2FudGx5IGFzc29jaWF0ZWQgd2l0aCByZXZlcnNlLWNvZGVkIHRpcmVkbmVzcyBzdWNoIHRoYXQgcGFydGljaXBhbnRzIGluIHRoZSBoaWdoIGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHkgY29uZGl0aW9uICgqTSogPSBgciBkZXNjcmliZUJ5KGRhdGEkbW9vZC5hdCwgZ3JvdXA9ZGF0YSRjb25kaXRpb24uYmVoLCBkaWdpdHM9MiwgbWF0PVQpJG1lYW5bMl1gLCAqU0QqID0gYHIgZGVzY3JpYmVCeShkYXRhJG1vb2QuYXQsIGdyb3VwPWRhdGEkY29uZGl0aW9uLmJlaCwgZGlnaXRzPTIsIG1hdD1UKSRzZFsyXWApIHJlcG9ydGVkIHNpZ25pZmljYW50bHkgbW9yZSBhY3RpdmUgbW9vZC0tLXRoYXQgaXMsIGxlc3MgdGlyZWRuZXNzLS0tdGhhbiBwYXJ0aWNpcGFudHMgaW4gdGhlIGxvdyBhZ3JlZWFibGVuZXNzIGFuZCBob25lc3R5IGNvbmRpdGlvbiAoKk0qID0gYHIgZGVzY3JpYmVCeShkYXRhJG1vb2QuYXQsIGdyb3VwPWRhdGEkY29uZGl0aW9uLmJlaCwgZGlnaXRzPTIsIG1hdD1UKSRtZWFuWzFdYCwgKlNEKiA9IGByIGRlc2NyaWJlQnkoZGF0YSRtb29kLmF0LCBncm91cD1kYXRhJGNvbmRpdGlvbi5iZWgsIGRpZ2l0cz0yLCBtYXQ9VCkkc2RbMV1gLCAqZCogPWByIHBhc3RlMChwcmludG51bShjb2hlbi5kKGRhdGEkbW9vZC5hdCwgZGF0YSRjb25kaXRpb24uYmVoKSRjb2hlbi5kWzJdKSwgIiwgOTUlIENJIFsiLHByaW50bnVtKGNvaGVuLmQoZGF0YSRtb29kLmF0LCBkYXRhJGNvbmRpdGlvbi5iZWgpJGNvaGVuLmRbMV0pLCIsICIsIHByaW50bnVtKGNvaGVuLmQoZGF0YSRtb29kLmF0LCBkYXRhJGNvbmRpdGlvbi5iZWgpJGNvaGVuLmRbM10pICwiXSIpYCkNCg0KKiBQb2x5bm9taWFsIHJlZ3Jlc3Npb25zIGFsc28gc2hvd2VkIHRoYXQgb25seSBoaWdoZXIgbGV2ZWxzIG9mIHN0YXRlIGFncmVlYWJsZW5lc3MgYW5kIHN0YXRlIGhvbmVzdHktaHVtaWxpdHkgKGJ1dCBub3QgaW50ZXJhY3Rpb25zIG9mIGZpdCBwYXR0ZXJucykgd2VyZSBzaWduaWZpY2FudGx5IGFzc29jaWF0ZWQgd2l0aCBtb3JlIGFjdGl2ZSBtb29kIGFjcm9zcyBhbGwgbW9kZWxzICgqYipzIHJhbmdpbmcgZnJvbSBgciBwcmludG51bShtaW4oYyhoM2IucnNhLmEkTE0kY29lZmZpY2llbnRzWzIsMV0sIGgzYi5yc2EuaCRMTSRjb2VmZmljaWVudHNbMiwxXSwgaDRiLnJzYS5hLmEkTE0kY29lZmZpY2llbnRzWzIsMV0sIGg0Yi5yc2EuYS5kJExNJGNvZWZmaWNpZW50c1syLDFdLCBoNGIucnNhLmguYSRMTSRjb2VmZmljaWVudHNbMiwxXSwgaDRiLnJzYS5oLmQkTE0kY29lZmZpY2llbnRzWzIsMV0pKSlgICB0byBgciBwcmludG51bShtYXgoYyhoM2IucnNhLmEkTE0kY29lZmZpY2llbnRzWzIsMV0sIGgzYi5yc2EuaCRMTSRjb2VmZmljaWVudHNbMiwxXSwgaDRiLnJzYS5hLmEkTE0kY29lZmZpY2llbnRzWzIsMV0sIGg0Yi5yc2EuYS5kJExNJGNvZWZmaWNpZW50c1syLDFdLCBoNGIucnNhLmguYSRMTSRjb2VmZmljaWVudHNbMiwxXSwgaDRiLnJzYS5oLmQkTE0kY29lZmZpY2llbnRzWzIsMV0pKSlgKQ0KDQoqIEluIHN1bW1hcnksIGFjcm9zcyBib3RoIGFuYWx5c2lzIG9mIHZhcmlhbmNlIGFuZCByZXNwb25zZSBzdXJmYWNlIGFuYWx5c2lzLCBuZWl0aGVyIGludGVyYWN0aW9ucyBub3IgZml0IHBhdHRlcm5zIHdlcmUgc2lnbmlmaWNhbnRseSBhc3NvY2lhdGVkIHdpdGggcG9zaXRpdmUgYWZmZWN0DQoNCiMgQ29uZ3J1ZW5jZSBhbmQgU3Ryb29wIFBlcmZvcm1hbmNlIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KIyMgSHlwb3RoZXNpcyB7LX0NCg0KSDNjOiBDb25ncnVlbmNlIGJldHdlZW4gcGVyc29uYWxpdHkgdHJhaXQgYW5kIHBlcnNvbmFsaXR5IHN0YXRlIGlzIGFzc29jaWF0ZWQgd2l0aCB3aXRoIFN0cm9vcCBwZXJmb3JtYW5jZSBzdWNoIHRoYXQgdHJhaXQtY29uZ3J1ZW50IHBlcnNvbmFsaXR5IHN0YXRlcyBhcmUgcmVsYXRlZCB0byBmYXN0ZXIgcmVhY3Rpb24gdGltZXMgb3IgbGVzcyBlcnJvcnMgdGhhbiB0cmFpdC1pbmNvbmdydWVudCBwZXJzb25hbGl0eSBzdGF0ZXMuDQoNCkg0YzogQ29uZ3J1ZW5jZSBiZXR3ZWVuIHBlcnNvbmFsaXR5IHN0YXRlIGFuZCBzaXR1YXRpb24gY2hhcmFjdGVyaXN0aWMgaXMgYXNzb2NpYXRlZCB3aXRoIFN0cm9vcCBwZXJmb3JtYW5jZSBzdWNoIHRoYXQgc2l0dWF0aW9uLWNvbmdydWVudCBwZXJzb25hbGl0eSBzdGF0ZXMgYXJlIHJlbGF0ZWQgYXJlIHJlbGF0ZWQgdG8gZmFzdGVyIHJlYWN0aW9uIHRpbWVzIG9yIGxlc3MgZXJyb3JzIHRoYW4gc2l0dWF0aW9uLWluY29uZ3J1ZW50IHBlcnNvbmFsaXR5IHN0YXRlcy4NCg0KIyMgQW5hbHl0aWMgU3RyYXRlZ3kgey19DQoNClN0YXRpc3RpY2FsIGRhdGEgYW5hbHlzaXMgaW5ldml0YWJseSBvZmZlcnMgc28tY2FsbGVkIHJlc2VhcmNoZXIgZGVncmVlcyBvZiBmcmVlZG9tLiBNYW55IGRlY2lzaW9ucyBtdXN0IGJlIG1hZGUgZm9yIHdoaWNoIHRoZXJlIGFyZSBzZXZlcmFsIGVxdWFsbHkgdmFsaWQgb3B0aW9ucy4gVGhlcmVmb3JlLCBhbnkgZGVjaXNpb24gaXMgb2Z0ZW4gYm90aCBkZWZlbnNpYmxlIGFuZCBhcmJpdHJhcnkgKFNpbW9uc29obiwgU2ltbW9ucywgJiBOZWxzb24sIDIwMTkpLiBIYW5kbGluZyBvZiByZWFjdGlvbiB0aW1lcyAoUlRzKSBpbiBwc3ljaG9sb2dpY2FsIGV4cGVyaW1lbnRzIHNlZW1zIHRvIG9mZmVyIGEgcGFydGljdWxhcmx5IGdyZWF0IGFtb3VudCBvZiByZXNlYXJjaGVyIGRlZ3JlZXMgb2YgZnJlZWRvbS4gVGhlcmVmb3JlLCB3ZSBkZWNpZGVkIHRvIGNvbmR1Y3QgYSBtaW5pIHNwZWNpZmljYXRpb24tY3VydmUgYW5hbHlzaXMgKFNpbW9uc29obiwgU2ltbW9ucywgJiBOZWxzb24sIDIwMTkpIGZvciBhbGwgaHlwb3RoZXNlcyB0aGF0IGludm9sdmUgUlRzLiBXZSBjYWxsIGl0IG1pbmkgc3BlY2lmaWNhdGlvbi1jdXJ2ZSBhbmFseXNpcyBiZWNhdXNlIGl0IGRvZXMgbm90IGludm9sdmUgYWxsIGFuYWx5c2VzIG9yIGFsbCBzdGVwcyBvZiBkYXRhIGhhbmRsaW5nLCBidXQgbWVyZWx5IGZvY3VzZXMgb24gaWRlbnRpZnlpbmcgYW5kIGhhbmRsaW5nIG91dGxpZXJzIGFuZCBjYWxjdWxhdGluZyBzdW1tYXJ5IHN0YXRpc3RpY3MgaW4gUlQgZGF0YS4gQWRkaXRpb25hbGx5LCB3ZSB3YW50IHRvIGVtcGhhc2l6ZSB0aGF0IHdlIG1vc3QgY2VydGFpbmx5IGRpZCBub3QgaW5jbHVkZSBhbGwgY29uY2VpdmFibGUgb3B0aW9ucyBmb3IgdGhlc2UgZGVjaXNpb25zLCBidXQgc3VyZWx5IHNlbGVjdGVkIGEgZmFpciBhbmQgcmVwcmVzZW50YXRpdmUgYW1vdW50Lg0KDQojIyMgU3RlcCAxOiBTZXQgb2YgUmVhc29uYWJsZSBTcGVjaWZpY2F0aW9ucyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC19DQoNCkhlcmUsIHdlIGxpc3QgdGhlIHNwZWNpZmljYXRpb25zIHdlIHdpbGwgaW5jbHVkZSBmb3IgZm91ciBkaWZmZXJlbnQgZGVjaXNpb25zOiAoMSkgSG93IHRvIGlkZW50aWZ5IG91dGxpZXJzIGluIFJUcywgKDIpIGhvdyB0byB0cmVhdCB0aGVzZSBvdXRsaWVycywgKDMpIHdoaWNoIHRyaWFscyB0byB1c2UgZm9yIGNhbGN1bGF0aW9uLCBhbmQgKDQpIHdoaWNoIHN1bW1hcnkgc3RhdGlzdGljIHRvIGNhbGN1bGF0ZS4NCk51bWJlcnMgaW4gYnJhY2tldHMgcmVwcmVzZW50IHRoZSBudW1iZXIgb2Ygc3BlY2lmaWNhdGlvbnMgaW4gdGhlIGJyYW5jaC4NCg0KIyMjIyBSZWFjdGlvbiBUaW1lcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC19DQoNCiMjIyMjIFRvdGFsIE51bWJlciBvZiBTcGVjaWZpY2F0aW9ucyB7LX0NCg0KKipUb3RhbCBOdW1iZXIgb2YgU3BlY2lmaWNhdGlvbnMqKiAgDQo0NiBtZXRob2RzIGZvciB0aGUgaWRlbnRpZmljYXRpb24gb2Ygb3V0bGllcnMgeCAzIG1ldGhvZHMgZm9yIHRoZSB0cmVhdG1lbnQgb2Ygb3V0bGllcnMgeCA4IG9wdGlvbnMgZm9yIHNlbGVjdGluZyB0cmlhbHMgdG8gYmUgaW5jbHVkZWQgeCAyIG1ldGhvZHMgZm9yIHRoZSBzdW1tYXJ5IHN0YXRpc3RpYyB4IDQgb3B0aW9ucyBmb3IgY292YXJpYXRlcyArIG5vIGlkZW50aWZpY2F0aW9uL3RyZWF0bWVudCBvZiBvdXRsaWVycyB4IDggb3B0aW9ucyBmb3Igc2VsZWN0aW5nIHRyaWFscyB0byBiZSBpbmNsdWRlZCB4IDIgbWV0aG9kcyBmb3IgdGhlIHN1bW1hcnkgc3RhdGlzdGljIHggNCBvcHRpb25zIGZvciBjb3ZhcmlhdGVzID0gODgzMiArIDY0ID0gKio4ODk2IGFuYWx5c2VzKioNCg0KDQojIyMjIyBJZGVudGlmaWNhdGlvbiBvZiBPdXRsaWVycyB7LX0NCg0KIyMjIyMjIEZpeGVkIEN1dG9mZnMgKDQpIHstfQ0KKkFsbCBSVHMgYmVsb3cgb3IgYWJvdmUgYSBjZXJ0YWluLCBwcmVzcGVjaWZpZWQgY3V0b2ZmIGFyZSBpZGVudGlmaWVkIGFzIG91dGxpZXJzKg0KDQoqIDwgMTAwbXMsID4gMTUwMG1zDQoqIDwgMzUwbXMsID4gMjAwMG1zDQoqIDwgMzAwbXMsID4gNDAwMG1zDQoqIDwgMjAwbXMsID4gMjAwMG1zDQoNCg0KIyMjIyMjIFJlbGF0aXZlIGN1dG9mZnM6IEdsb2JhbCAoMTQpIHstfQ0KKkFwcGxpZWQgdG8gYWxsIFJUcyBmcm9tIGFsbCBwYXJ0aWNpcGFudHMgYW5kIGFsbCBjb25kaXRpb25zIGF0IHRoZSBzYW1lIHRpbWUqDQoNCioqTWVhbiBSVCArLSBTRHMgKDUpKioNCg0KKiBNZWFuIFJUIMKxIDIgU0RzDQoqIE1lYW4gUlQgwrEgMi41IFNEcw0KKiBNZWFuIFJUIMKxIDMgU0RzDQoqIE1lYW4gUlQgwrEgMy41IFNEcw0KKiBNZWFuIFJUIMKxIDQgU0RzDQoNCioqTWVhbiBSVCArLSBJUVIgKDIpKioNCg0KKiBNZWFuIFJUIMKxIDMgSVFSDQoqIFR1a2V5ICgxOTc3KSBmZW5jZXM6IFExLTEuNSBJUVIgb3IgYWJvdmUgUTMrMS41IElRUg0KDQoqKk1lZGlhbiArLSBNQURzICgzKSoqDQoNCiogbWVkaWFuIHBsdXMgb3IgbWludXMgMiB0aW1lcyB0aGUgTUFEDQoqIG1lZGlhbiBwbHVzIG9yIG1pbnVzIDIuNSB0aW1lcyB0aGUgTUFEDQoqIG1lZGlhbiBwbHVzIG9yIG1pbnVzIDMgdGltZXMgdGhlIE1BRA0KDQoqKlBlcmNlbnRhZ2VzICg0KSoqDQoNCiogMiUgbW9zdCBleHRyZW1lIHZhbHVlcw0KKiA1JSBtb3N0IGV4dHJlbWUgdmFsdWVzDQoqIDEwJSBtb3N0IGV4dHJlbWUgdmFsdWVzDQoqIDE1JSBtb3N0IGV4dHJlbWUgdmFsdWVzDQoNCg0KIyMjIyMjIFJlbGF0aXZlIGN1dG9mZnM6IFBlciBjZWxsICgxNCkgey19DQoqQXBwbGllZCBzZXBhcmF0ZWx5IHRvIHRoZSBSVHMgZnJvbSBlYWNoIGV4cGVyaW1lbnRhbCBjZWxsLCBpLmUuLCBjb25kaXRpb24gKGJ1dCBhY3Jvc3MgcGFydGljaXBhbnRzKSoNCg0KKipNZWFuIFJUICstIFNEcyAoNSkqKg0KDQoqIE1lYW4gUlQgwrEgMiBTRHMNCiogTWVhbiBSVCDCsSAyLjUgU0RzDQoqIE1lYW4gUlQgwrEgMyBTRHMNCiogTWVhbiBSVCDCsSAzLjUgU0RzDQoqIE1lYW4gUlQgwrEgNCBTRHMNCg0KKipNZWFuIFJUICstIElRUiAoMikqKg0KDQoqIE1lYW4gUlQgwrEgMyBJUVINCiogVHVrZXkgKDE5NzcpIGZlbmNlczogUTEtMS41IElRUiBvciBhYm92ZSBRMysxLjUgSVFSDQoNCioqTWVkaWFuICstIE1BRHMgKDMpKioNCg0KKiBtZWRpYW4gcGx1cyBvciBtaW51cyAyIHRpbWVzIHRoZSBNQUQNCiogbWVkaWFuIHBsdXMgb3IgbWludXMgMi41IHRpbWVzIHRoZSBNQUQNCiogbWVkaWFuIHBsdXMgb3IgbWludXMgMyB0aW1lcyB0aGUgTUFEDQoNCioqUGVyY2VudGFnZXMgKDQpKioNCg0KKiAyJSBtb3N0IGV4dHJlbWUgdmFsdWVzDQoqIDUlIG1vc3QgZXh0cmVtZSB2YWx1ZXMNCiogMTAlIG1vc3QgZXh0cmVtZSB2YWx1ZXMNCiogMTUlIG1vc3QgZXh0cmVtZSB2YWx1ZXMNCg0KIyMjIyMjIFJlbGF0aXZlIGN1dG9mZnM6IFBlciBwYXJ0aWNpcGFudCAoMTQpIHstfQ0KKkFwcGxpZWQgc2VwYXJhdGVseSB0byBSVHMgZnJvbSBlYWNoIHBhcnRpY2lwYW50IChidXQgYWNyb3NzIGNlbGxzKSoNCg0KKipNZWFuIFJUICstIFNEcyAoNSkqKg0KDQoqIE1lYW4gUlQgwrEgMiBTRHMNCiogTWVhbiBSVCDCsSAyLjUgU0RzDQoqIE1lYW4gUlQgwrEgMyBTRHMNCiogTWVhbiBSVCDCsSAzLjUgU0RzDQoqIE1lYW4gUlQgwrEgNCBTRHMNCg0KKipNZWFuIFJUICstIElRUiAoMikqKg0KDQoqIE1lYW4gUlQgwrEgMyBJUVINCiogVHVrZXkgKDE5NzcpIGZlbmNlczogUTEtMS41IElRUiBvciBhYm92ZSBRMysxLjUgSVFSDQoNCg0KKipNZWRpYW4gKy0gTUFEcyAoMykqKg0KDQoqIG1lZGlhbiBwbHVzIG9yIG1pbnVzIDIgdGltZXMgdGhlIE1BRA0KKiBtZWRpYW4gcGx1cyBvciBtaW51cyAyLjUgdGltZXMgdGhlIE1BRA0KKiBtZWRpYW4gcGx1cyBvciBtaW51cyAzIHRpbWVzIHRoZSBNQUQNCg0KKipQZXJjZW50YWdlcyAoNCkqKg0KDQoqIDIlIG1vc3QgZXh0cmVtZSB2YWx1ZXMNCiogNSUgbW9zdCBleHRyZW1lIHZhbHVlcw0KKiAxMCUgbW9zdCBleHRyZW1lIHZhbHVlcw0KKiAxNSUgbW9zdCBleHRyZW1lIHZhbHVlcw0KDQojIyMjIyBUcmVhdG1lbnQgb2YgT3V0bGllcnMgey19DQoNCiogVHJpbW1pbmcgKGkuZS4gb3V0bGllcnMgYXJlIHJlbW92ZWQpDQoqIFdpbnNvcml6aW5nIChpLmUuLCBvdXRsaWVycyBhcmUgcmVwbGFjZWQgYnkgdGhlIGN1dG9mZikNCiogSW50ZXJwb2xhdGluZyAoaS5lLiwgb3V0bGllcnMgYXJlIHJlcGxhY2VkIGJ5IHRoZSBtZWFuL21lZGlhbikNCiogTm9uZSAoaS5lLiwgb3V0bGllcnMgYXJlIGtlcHQgaW4gdGhlIGRhdGEpDQoNCiMjIyMjIFNlbGVjdGlvbiBvZiB0aGUgVHJpYWxzIHRvIGJlIENvbnNpZGVyZWQgey19DQoNCioqVXNlIGFsbCB0cmlhbHMgKDQpKioNCg0KKiBPdmVyYWxsIChpLmUuLCBhY3Jvc3MgYWxsIGNvbmRpdGlvbnMpDQoqIENvbmdydWVudCB0cmlhbHMgb25seQ0KKiBJbmNvbmdydWVudCB0cmlhbHMgb25seQ0KKiBOZXV0cmFsIHRyaWFscyBvbmx5DQoNCioqVXNlIG9ubHkgY29ycmVjdGx5IGFuc3dlcmVkIHRyaWFscyAoNCkqKg0KDQoqIE92ZXJhbGwgKGkuZS4sIGFjcm9zcyBhbGwgY29uZGl0aW9ucykNCiogQ29uZ3J1ZW50IHRyaWFscyBvbmx5DQoqIEluY29uZ3J1ZW50IHRyaWFscyBvbmx5DQoqIE5ldXRyYWwgdHJpYWxzIG9ubHkNCg0KIyMjIyMgU3VtbWFyeSBTdGF0aXN0aWMgey19DQoNCiogTWVhbg0KKiBNZWRpYW4NCg0KIyMjIyMgSW5jbHVzaW9uIG9mIENvdmFyaWF0ZXMgey19DQoNCiogRXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgb25seQ0KKiBFeHBlcmltZW50YWwgY29uZGl0aW9ucyAmIHBvaW50cyB3b24gaW4gdGhlIGdhbWUNCiogRXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgJiBwb2ludCBkaWZmZXJlbmNlIGluIHRoZSBnYW1lDQoqIEV4cGVyaW1lbnRhbCBjb25kaXRpb25zLCBwb2ludHMgd29uIGluIHRoZSBnYW1lLCAmIHBvaW50IGRpZmZlcmVuY2UgaW4gdGhlIGdhbWUNCg0KDQoNCiMjIyMgRXJyb3IgUmF0ZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyMjIyBUb3RhbCBOdW1iZXIgb2YgU3BlY2lmaWNhdGlvbnMgey19DQoNCioqVG90YWwgTnVtYmVyIG9mIFNwZWNpZmljYXRpb25zKiogIA0KNDYgbWV0aG9kcyBmb3IgdGhlIGlkZW50aWZpY2F0aW9uIG9mIG91dGxpZXJzIHggMyBtZXRob2RzIGZvciB0aGUgdHJlYXRtZW50IG9mIG91dGxpZXJzIHggNCBvcHRpb25zIGZvciBzZWxlY3RpbmcgdHJpYWxzIHRvIGJlIGluY2x1ZGVkIHggMSBtZXRob2RzIGZvciB0aGUgY2FsY3VsYXRpb24gb2Ygc3VtbWFyeSBzdGF0aXN0aWNzIHggNCBvcHRpb25zIGZvciBjb3ZhcmlhdGVzICsgbm8gaWRlbnRpZmljYXRpb24vdHJlYXRtZW50IG9mIG91dGxpZXJzIHggNCBvcHRpb25zIGZvciBzZWxlY3RpbmcgdHJpYWxzIHRvIGJlIGluY2x1ZGVkIHggMSBtZXRob2RzIGZvciB0aGUgY2FsY3VsYXRpb24gb2Ygc3VtbWFyeSBzdGF0aXN0aWNzIHggNCBvcHRpb25zIGZvciBjb3ZhcmlhdGVzID0gKioyMjI0IGFuYWx5c2VzKioNCg0KIyMjIyMgSWRlbnRpZmljYXRpb24gb2YgT3V0bGllcnMgey19DQoNCiMjIyMjIyBGaXhlZCBjdXRvZmZzICg0KSB7LX0NCipBbGwgUlRzIGJlbG93IG9yIGFib3ZlIGEgY2VydGFpbiwgcHJlLXNwZWNpZmllZCBjdXRvZmYgYXJlIGlkZW50aWZpZWQgYXMgb3V0bGllcnMqDQoNCiogPCAxMDBtcywgPiAxNTAwbXMNCiogPCAzNTBtcywgPiAyMDAwbXMNCiogPCAzMDBtcywgPiA0MDAwbXMNCiogPCAyMDBtcywgPiAyMDAwbXMNCg0KIyMjIyMjIFJlbGF0aXZlIGN1dG9mZnM6IEdsb2JhbCAoMTQpIHstfQ0KKkFwcGxpZWQgdG8gYWxsIFJUcyBmcm9tIGFsbCBwYXJ0aWNpcGFudHMgYW5kIGFsbCBjb25kaXRpb25zIGF0IHRoZSBzYW1lIHRpbWUqDQoNCioqTWVhbiBSVCArLSBTRHMgKDUpKioNCg0KKiBNZWFuIFJUIMKxIDIgU0RzDQoqIE1lYW4gUlQgwrEgMi41IFNEcw0KKiBNZWFuIFJUIMKxIDMgU0RzDQoqIE1lYW4gUlQgwrEgMy41IFNEcw0KKiBNZWFuIFJUIMKxIDQgU0RzDQoNCioqTWVhbiBSVCArLSBJUVIgKDIpKioNCg0KKiBNZWFuIFJUIMKxIDMgSVFSDQoqIFR1a2V5ICgxOTc3KSBmZW5jZXM6IFExLTEuNSBJUVIgb3IgYWJvdmUgUTMrMS41IElRUg0KDQoqKk1lZGlhbiArLSBNQURzICgzKSoqDQoNCiogbWVkaWFuIHBsdXMgb3IgbWludXMgMiB0aW1lcyB0aGUgTUFEDQoqIG1lZGlhbiBwbHVzIG9yIG1pbnVzIDIuNSB0aW1lcyB0aGUgTUFEDQoqIG1lZGlhbiBwbHVzIG9yIG1pbnVzIDMgdGltZXMgdGhlIE1BRA0KDQoqKlBlcmNlbnRhZ2VzICg0KSoqDQoNCiogMiUgbW9zdCBleHRyZW1lIHZhbHVlcw0KKiA1JSBtb3N0IGV4dHJlbWUgdmFsdWVzDQoqIDEwJSBtb3N0IGV4dHJlbWUgdmFsdWVzDQoqIDE1JSBtb3N0IGV4dHJlbWUgdmFsdWVzDQoNCg0KIyMjIyMjIFJlbGF0aXZlIGN1dG9mZnM6IFBlciBjZWxsICgxNCkgey19DQoqQXBwbGllZCBzZXBhcmF0ZWx5IHRvIHRoZSBSVHMgZnJvbSBlYWNoIGV4cGVyaW1lbnRhbCBjZWxsLCBpLmUuLCBjb25kaXRpb24gKGJ1dCBhY3Jvc3MgcGFydGljaXBhbnRzKSoNCg0KKipNZWFuIFJUICstIFNEcyAoNSkqKg0KDQoqIE1lYW4gUlQgwrEgMiBTRHMNCiogTWVhbiBSVCDCsSAyLjUgU0RzDQoqIE1lYW4gUlQgwrEgMyBTRHMNCiogTWVhbiBSVCDCsSAzLjUgU0RzDQoqIE1lYW4gUlQgwrEgNCBTRHMNCg0KKipNZWFuIFJUICstIElRUiAoMikqKg0KDQoqIE1lYW4gUlQgwrEgMyBJUVINCiogVHVrZXkgKDE5NzcpIGZlbmNlczogUTEtMS41IElRUiBvciBhYm92ZSBRMysxLjUgSVFSDQoNCioqTWVkaWFuICstIE1BRHMgKDMpKioNCg0KKiBtZWRpYW4gcGx1cyBvciBtaW51cyAyIHRpbWVzIHRoZSBNQUQNCiogbWVkaWFuIHBsdXMgb3IgbWludXMgMi41IHRpbWVzIHRoZSBNQUQNCiogbWVkaWFuIHBsdXMgb3IgbWludXMgMyB0aW1lcyB0aGUgTUFEDQoNCioqUGVyY2VudGFnZXMgKDQpKioNCg0KKiAyJSBtb3N0IGV4dHJlbWUgdmFsdWVzDQoqIDUlIG1vc3QgZXh0cmVtZSB2YWx1ZXMNCiogMTAlIG1vc3QgZXh0cmVtZSB2YWx1ZXMNCiogMTUlIG1vc3QgZXh0cmVtZSB2YWx1ZXMNCg0KIyMjIyMjIFJlbGF0aXZlIGN1dG9mZnM6IFBlciBwYXJ0aWNpcGFudCAoMTQpIHstfQ0KKkFwcGxpZWQgc2VwYXJhdGVseSB0byBSVHMgZnJvbSBlYWNoIHBhcnRpY2lwYW50Kg0KDQoqKk1lYW4gUlQgKy0gU0RzICg1KSoqDQoNCiogTWVhbiBSVCDCsSAyIFNEcw0KKiBNZWFuIFJUIMKxIDIuNSBTRHMNCiogTWVhbiBSVCDCsSAzIFNEcw0KKiBNZWFuIFJUIMKxIDMuNSBTRHMNCipNZWFuIFJUIMKxIDQgU0RzDQoNCioqTWVhbiBSVCArLSBJUVIgKDIpKioNCg0KKiBNZWFuIFJUIMKxIDMgSVFSDQoqIFR1a2V5ICgxOTc3KSBmZW5jZXM6IFExLTEuNSBJUVIgb3IgYWJvdmUgUTMrMS41IElRUg0KDQoNCioqTWVkaWFuICstIE1BRHMgKDMpKioNCg0KKiBtZWRpYW4gcGx1cyBvciBtaW51cyAyIHRpbWVzIHRoZSBNQUQNCiogbWVkaWFuIHBsdXMgb3IgbWludXMgMi41IHRpbWVzIHRoZSBNQUQNCiogbWVkaWFuIHBsdXMgb3IgbWludXMgMyB0aW1lcyB0aGUgTUFEDQoNCioqUGVyY2VudGFnZXMgKDQpKioNCg0KKiAyJSBtb3N0IGV4dHJlbWUgdmFsdWVzDQoqIDUlIG1vc3QgZXh0cmVtZSB2YWx1ZXMNCiogMTAlIG1vc3QgZXh0cmVtZSB2YWx1ZXMNCiogMTUlIG1vc3QgZXh0cmVtZSB2YWx1ZXMNCg0KDQojIyMjIyBUcmVhdG1lbnQgb2YgT3V0bGllcnMgey19DQoNCiogVHJpbW1pbmcgKGkuZS4gb3V0bGllcnMgYXJlIHJlbW92ZWQpDQoqIE5vbmUgKGkuZS4sIG91dGxpZXJzIGFyZSBrZXB0IGluIHRoZSBkYXRhKQ0KKiBFcnJvciAoaS5lLiwgb3V0bGllcnMgYXJlIGNvbnNpZGVyZWQgZXJyb3JzKQ0KKiBDb3JyZWN0IChpLmUuLCBvdXRsaWVycyBhcmUgY29uc2lkZXJlZCBjb3JyZWN0KQ0KDQojIyMjIyBTZWxlY3Rpb24gb2YgdGhlIFRyaWFscyB0byBiZSBDb25zaWRlcmVkIHstfQ0KDQoqIE92ZXJhbGwgKGkuZS4sIGFjcm9zcyBhbGwgY29uZGl0aW9ucykNCiogQ29uZ3J1ZW50IHRyaWFscyBvbmx5DQoqIEluY29uZ3J1ZW50IHRyaWFscyBvbmx5DQoqIE5ldXRyYWwgdHJpYWxzIG9ubHkNCg0KIyMjIyMgSW5jbHVzaW9uIG9mIENvdmFyaWF0ZXMgey19DQoNCiogRXhwZXJpbWVudGFsIGNvbmRpdGlvbnMNCiogRXhwZXJpbWVudGFsIGNvbmRpdGlvbnMgJiBwb2ludHMgd29uIGluIHRoZSBnYW1lDQoqIEV4cGVyaW1lbnRhbCBjb25kaXRpb25zICYgcG9pbnQgZGlmZmVyZW5jZSBpbiB0aGUgZ2FtZQ0KKiBFeHBlcmltZW50YWwgY29uZGl0aW9ucywgcG9pbnRzIHdvbiBpbiB0aGUgZ2FtZSwgJiBwb2ludCBkaWZmZXJlbmNlIGluIHRoZSBnYW1lDQoNCg0KIyMjIFN0ZXAgMjogRGVzY3JpcHRpdmUgU3BlY2lmaWNhdGlvbiBDdXJ2ZXMgey19DQoNCldlIGNvbmR1Y3RlZCBhbGwgYW5hbHlzZXMgdGhhdCBpbmNsdWRlIFN0cm9vcCBwZXJmb3JtYW5jZSAoUlRzIG9yIGVycm9yIHJhdGVzKSBzZXBhcmF0ZWx5IGZvciBlYWNoIHNwZWNpZmljYXRpb24uIFRoZSByZXN1bHRzIGZyb20gdGhlIGRpZmZlcmVudCBzcGVjaWZpY2F0aW9ucyB3ZXJlIHRoZW4gYmUgZ3JhcGhpY2FsbHkgZGlzcGxheWVkIGluIGRlc2NyaXB0aXZlIHNwZWNpZmljYXRpb24gY3VydmVzLiBUaGVzZSBjdXJ2ZXMgZGlzcGxheWVkIHRoZSBlZmZlY3RzIG9mIGludGVyZXN0IChpLmUuLCBpbnRlcmFjdGlvbiBjb2VmZmljaWVudHMgb3IgcHJlc2VuY2Ugb2YgZml0IHBhdHRlcm5zKSBmcm9tIGFsbCBzcGVjaWZpY2F0aW9ucyByYW5rZWQgYnkgc2l6ZSBvZiB0aGUgZWZmZWN0LiBBZGRpdGlvbmFsbHksIHRoZXNlIHBsb3RzIGluZGljYXRlIHdoaWNoIGFuYWx5dGljIGRlY2lzaW9ucyBsZWFkIHRvIHdoaWNoIGVmZmVjdHMuIERlc2NyaXB0aXZlIHNwZWNpZmljYXRpb24gY3VydmVzIHdlcmUgdXNlZCB0byBleGFtaW5lIHRoZSByYW5nZSBvZiB0aGUgZWZmZWN0cyBhY3Jvc3MgYWxsIHNwZWNpZmljYXRpb25zLCB0aGUgcHJvcG9ydGlvbiBvZiBzaWduaWZpY2FudCBlZmZlY3RzLCBhbmQgaG93IHRoZSBhbmFseXRpYyBkZWNpc2lvbnMgaW1wYWN0ZWQgdGhlIGVzdGltYXRlZCBlZmZlY3RzLg0KDQojIyMgU3RlcCAzOiBQZXJtdXRhdGlvbiBUZXN0IHstfQ0KDQpGaW5hbGx5LCB3ZSBhcHBsaWVkIGEgcGVybXV0YXRpb24gdGVjaG5pcXVlIHRvIHRlc3QgaG93IGluY29uc2lzdGVudCB0aGUgcmVzdWx0cyBhcmUgd2l0aCB0aGUgbnVsbCBoeXBvdGhlc2lzIG9mIG5vIGVmZmVjdCBhY3Jvc3MgdGhlIHNwZWNpZmljYXRpb24gY3VydmUuIFdlIGNyZWF0ZWQgNTAwIGRhdGEgc2V0cyBieSBzaHVmZmxpbmcgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSAoUlQgb3IgZXJyb3IgcmF0ZSkuIEluIHRoZXNlIGRhdGFzZXRzLCBiZWNhdXNlIG9mIHRoZSByYW5kb20gZGlzdHJpYnV0aW9uIG9mIFJUcy9lcnJvciByYXRlcywgdGhlIG51bGwgaHlwb3RoZXNpcyBpcyBwZXIgZGVmaW5pdGlvbiB0cnVlLiANCg0KV2UgdGhlbiBuZWVkZWQgdG8gZGVyaXZlIGEgdGVzdCBzdGF0aXN0aWMgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBjdXJ2ZXMgdW5kZXIgdGhlIG51bGwgaHlwb3RoZXNpcyAob2J0YWluZWQgd2l0aCB0aGUgNTAwIHNodWZmbGVkIGRhdGFzZXRzKS4gQmVjYXVzZSB0aGUgY29uZ3J1ZW5jZSBoeXBvdGhlc2VzIGFyZSBjb21wb3VuZCBoeXBvdGhlc2VzIGZvciB3aGljaCBzZXZlcmFsIGNvbmRpdGlvbnMgbXVzdCBiZSBmdWxmaWxsZWQgKHNlZSBIdW1iZXJnLCBOZXN0bGVyLCAmIEJhY2ssIDIwMTkpLCB3ZSB1c2VkIHRoZSBwZXJjZW50YWdlIG9mIHNwZWNpZmljYXRpb25zIHN1cHBvcnRpbmcgdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgKGkuZS4sIHRoZSBjb25ncnVlbmNlIGVmZmVjdCkgYXMgdGhlIHRlc3Qgc3RhdGlzdGljLiANCg0KRm9yIGVhY2ggc2h1ZmZsZWQgZGF0YXNldCwgd2UgY2FsY3VsYXRlZCB0aGUgcGVyY2VudGFnZSBvZiBzcGVjaWZpY2F0aW9ucyBzdXBwb3J0aW5nIHRoZSBjb25ncnVlbmNlIGh5cG90aGVzaXMgYW5kIGNvbXBhcmVkIHRoZSBkaXN0cmlidXRpb24gb2YgdGhpcyBwZXJjZW50YWdlIGFjcm9zcyB0aGUgNTAwIHNhbXBsZXMgdG8gdGhlIG9ic2VydmVkIHBlcmNlbnRhZ2UgaW4gdGhlIHJlYWwgZGF0YS4NCg0KVGhpcyBjb21wYXJpc29uIGFsbG93ZWQgdXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2UgY291bGQgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgb2Ygbm8gY29uZ3J1ZW5jZSBlZmZlY3QgYWNyb3NzIHRoZSBzcGVjaWZpY2F0aW9uIGN1cnZlLiBTcGVjaWZpY2FsbHksIHRoZSByZWxhdGl2ZSBmcmVxdWVuY3kgb2Ygc2h1ZmZsZWQgc2FtcGxlcyB3aXRoIGF0IGxlYXN0IGFzIG1hbnkgc3BlY2lmaWNhdGlvbnMgc3VwcG9ydGluZyB0aGUgY29uZ3J1ZW5jZSBlZmZlY3QgYXMgdGhlIHVuc2h1ZmZsZWQgZGF0YSByZXByZXNlbnRlZCB0aGUgKnAqIHZhbHVlIG9mIHRoZSBwZXJtdXRhdGlvbiB0ZXN0LiBUaGlzICpwKiB2YWx1ZSByZWZsZWN0cyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nIHRoaXMgbWFueSBvciBldmVuIG1vcmUgc2lnbmlmaWNhbnQgc3BlY2lmaWNhdGlvbnMgdW5kZXIgdGhlIGFzc3VtcHRpb24gb2Ygbm8gY29uZ3J1ZW5jZSBlZmZlY3QuDQoNCkFkZGl0aW9uYWxseSwgd2UgZ3JhcGhpY2FsbHkgY29tcGFyZWQgdGhlIG9ic2VydmVkIGFuZCB0aGUgZXhwZWN0ZWQtdW5kZXItdGhlLW51bGwgc3BlY2lmaWNhdGlvbiBjdXJ2ZXMuDQoNCiMjIFN0cm9vcCBFZmZlY3Qgey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQpgYGB7ciBzdHJvb3AtcHJlcCwgd2FybmluZz1GLCBtZXNzYWdlPUYsIGVycm9yPUZ9DQoNCnN1YiA8LSBkYXRhLmNsZWFuICU+JSANCiAgIHVuZ3JvdXAoKSAlPiUgDQogICBzZWxlY3QoIlJlc3BvbnNlSWQiLCBjb250YWlucygiU3Ryb29wIiksICJjb25kaXRpb24uYnMiKSAlPiUgDQogICByZW5hbWUoaWQ9UmVzcG9uc2VJZCkgJT4lIA0KICAgZmlsdGVyKG51bVN0cm9vcFRyaWFsPT0icGFzc2VkIikNCg0Kc3Ryb29wLmxvbmcgPC0gZGF0YS5mcmFtZShpZD1OQSwgYW5zd2VyPU5BLCBjb3JyZWN0PU5BLCBzdGltdWx1cz1OQSwgY29uZGl0aW9uPU5BLCBydD1OQSwgZXhwLmNlbGw9TkEpDQoNCmZvcihpIGluIDE6bnJvdyhzdWIpKSB7DQogICBpZihsZW5ndGgodW5saXN0KHN0cl9zcGxpdChzdWIkbnVtU3Ryb29wQW5zd2VyW2ldLCIsIikpKT09NzUpIHsNCiAgICAgIGFuc3dlcj11bmxpc3Qoc3RyX3NwbGl0KHN1YiRudW1TdHJvb3BBbnN3ZXJbaV0sIiwiKSkNCiAgIH0gZWxzZSB7DQogICAgICBhbnN3ZXI9cmVwKCItOTk5Iiw3NSkNCiAgIH0NCiAgIG5ldyA8LSBkYXRhLmZyYW1lKGlkPXJlcChhcy5jaGFyYWN0ZXIoc3ViW2ksMV0pLDc1KSwgYW5zd2VyPWFuc3dlciwgY29ycmVjdD11bmxpc3Qoc3RyX3NwbGl0KHN1YiRudW1TdHJvb3BDb3JyZWN0QW5zd2VyW2ldLCIsIikpLA0KICAgICAgICAgICAgICAgICAgICAgc3RpbXVsdXM9dW5saXN0KHN0cl9zcGxpdChzdWIkbnVtU3Ryb29wU3RpbXVsdXNbaV0sIiwiKSksIGNvbmRpdGlvbj11bmxpc3Qoc3RyX3NwbGl0KHN1YiRudW1TdHJvb3BDb25kaXRpb25baV0sIiwiKSksDQogICAgICAgICAgICAgICAgICAgICBydD11bmxpc3Qoc3RyX3NwbGl0KHN1YiRudW1TdHJvb3BSZWFjdGlvblRpbWVbaV0sIiwiKSksIGV4cC5jZWxsPXN1YiRjb25kaXRpb24uYnNbaV0pDQogICBzdHJvb3AubG9uZyA8LSByYmluZChzdHJvb3AubG9uZywgbmV3KQ0KfQ0KDQpzdHJvb3AubG9uZyA8LSBzdHJvb3AubG9uZ1syOm5yb3coc3Ryb29wLmxvbmcpLF0NCnN0cm9vcC5sb25nJHJ0IDwtIGFzLm51bWVyaWMoc3Ryb29wLmxvbmckcnQpDQpzdHJvb3AubG9uZyRydFt3aGljaChzdHJvb3AubG9uZyRydD09LTk5OSldIDwtIE5BDQpzdHJvb3AubG9uZyRydFt3aGljaChpcy5uYShzdHJvb3AubG9uZyRhbnN3ZXIpKV0gPC0gTkENCnN0cm9vcC5sb25nJGFuc3dlclt3aGljaChpcy5uYShzdHJvb3AubG9uZyRydCkpXSA8LSBOQQ0Kc3Ryb29wLmxvbmckY29uZGl0aW9uIDwtIGZhY3RvcihzdHJvb3AubG9uZyRjb25kaXRpb24sIGxldmVscz1jKDAsIC0xLCAxKSwgbGFiZWxzPWMoIm5ldXRyYWwiLCAiY29uZ3J1ZW50IiwgImluY29uZ3J1ZW50IikpDQpzdHJvb3AubG9uZyRjb3JyZWN0IDwtIGZhY3RvcihzdHJvb3AubG9uZyRjb3JyZWN0LCBsZXZlbHM9YygwLDEpLCBsYWJlbHM9YygicmlnaHQiLCAibGVmdCIpKQ0Kc3Ryb29wLmxvbmckYW5zd2VyW3N0cm9vcC5sb25nJGFuc3dlciE9IkFycm93TGVmdCIgJiBzdHJvb3AubG9uZyRhbnN3ZXIhPSJBcnJvd1JpZ2h0Il0gPC0gTkENCnN0cm9vcC5sb25nJGFuc3dlciA8LSBmYWN0b3Ioc3Ryb29wLmxvbmckYW5zd2VyLCBsZXZlbHM9YygiQXJyb3dMZWZ0IiwgIkFycm93UmlnaHQiKSwgbGFiZWxzPWMoImxlZnQiLCAicmlnaHQiKSkNCnN0cm9vcC5sb25nJGVycm9yIDwtIGlmZWxzZShzdHJvb3AubG9uZyRhbnN3ZXI9PXN0cm9vcC5sb25nJGNvcnJlY3QsIEZBTFNFLCBUUlVFKSAjIFRSVUUgbWVhbnMgdGhhdCB0aGVyZSBpcyBhbiBlcnJvciBhcyBpbiBlcnJvcj8gdHJ1ZQ0KDQoNCnN0cm9vcC5zaG9ydCA8LSBzdHJvb3AubG9uZyAlPiUgDQogICBmaWx0ZXIoIWlzLm5hKGNvbmRpdGlvbikpICU+JSANCiAgIGZpbHRlcighaXMubmEocnQpKSAlPiUgDQogICBmaWx0ZXIoIWlzLm5hKGVycm9yKSkgJT4lIA0KICAgZ3JvdXBfYnkoaWQsIGNvbmRpdGlvbikgJT4lIA0KICAgc3VtbWFyaXplKGVycm9yLnJhdGUgPSBzdW0oZXJyb3IpKjEvNzUsDQogICAgICAgICAgICAgZXJyb3IucGVyYyA9IHN1bShlcnJvcikqMTAwLzc1LA0KICAgICAgICAgICAgIG1lYW4ucnQgPSBtZWFuKHJ0KSkgJT4lIA0KICAgdW5ncm91cCgpICU+JSANCiAgIGxlZnRfam9pbiguLCBzdWJzZXQoZGF0YSwgc2VsZWN0PWMoIlJlc3BvbnNlSWQiLCAiY29uZGl0aW9uLmJlaCIsICJjb25kaXRpb24uc2l0IiwgImNvbmRpdGlvbi5icyIpKSwgYnk9YygiaWQiID0gIlJlc3BvbnNlSWQiKSkNCg0KYGBgDQoNCiMjIyBFeGVtcGxhcnkgU3BlY2lmaWNhdGlvbiB7LnRhYnNldCAudGFic2V0LXBpbGxzIC19DQoNCiMjIyMgRGVzY3JpcHRpdmVzIHstfQ0KDQpIZXJlIHdlIHByZXNlbnQgZXhlbXBsYXJ5IGFuYWx5c2VzIG9mIHRoZSBTdHJvb3AgZWZmZWN0IGZvciB0aGUgb25lIHNwZWNpZmljYXRpb24gb2YgcmVhY3Rpb24gdGltZSAobWVhbiBhY3Jvc3MgYWxsIHRyaWFscywgbm8gdHJlYXRtZW50IG9mIG91dGxpZXJzKSBhbmQgZXJyb3IgcmF0ZSAoZXJyb3IgcmF0ZSBhY3Jvc3MgYWxsIHRyaWFscywgbm8gdHJlYXRtZW50IG9mIG91dGxpZXJzKS4gQmVsb3csIHdlIGFkZGl0aW9uYWxseSBwcm92aWRlIGEgc3BlY2lmaWNhdGlvbiBjdXJ2ZSBhbmFseXNpcyBvZiB0aGUgU3Ryb29wIGVmZmVjdC4gDQoNCmBgYHtyfQ0KDQp0YWIgPC0gYmluZF9yb3dzKGRlc2NyaWJlQnkoc3Ryb29wLnNob3J0JG1lYW4ucnQsIGdyb3VwPXN0cm9vcC5zaG9ydCRjb25kaXRpb24sIG1hdCA9IFQsIGRpZ2l0cz0yKVssYygyLCA1OjE1LCA0KV0sDQogICAgICAgICAgICAgICAgIGRlc2NyaWJlQnkoc3Ryb29wLnNob3J0JGVycm9yLnJhdGUsIGdyb3VwPXN0cm9vcC5zaG9ydCRjb25kaXRpb24sIG1hdCA9IFQsIGRpZ2l0cz0yKVssYygyLCA1OjE1LCA0KV0pDQoNCmthYmxlKHRhYiwNCiAgICAgIHJvdy5uYW1lcyA9IEZBTFNFLA0KICAgICAgY29sLm5hbWVzID0gYygiU3Ryb29wIHRyaWFsIHR5cGUiLCAibWVhbiIsICJzZCIsICJtZWRpYW4iLCANCiAgICAgICAgICAgICAgICAgICAgInRyaW1tZWQiLCAibWFkIiwgIm1pbiIsICJtYXgiLCAicmFuZ2UiLCAic2tldyIsICJrdXJ0b3NpcyIsICJzZSIsICJuIiksDQogICAgICBjYXB0aW9uPSJEZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIG9mIGF2ZXJhZ2UgcmVhY3Rpb24gdGltZXMgYW5kIGVycm9yIHJhdGVzIGluIHRoZSBkaWZmZXJlbnQgU3Ryb29wIHRyaWFsIHR5cGVzIGFnZ3JlZ2F0ZWQgd2l0aGluIHBlcnNvbnMuIikgJT4lICANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gVCkgJT4lIA0KICAgcGFja19yb3dzKCJEVjogUmVhY3Rpb24gVGltZSIsIDEsIDMpICU+JSANCiAgIHBhY2tfcm93cygiRFY6IEVycm9yIFJhdGUiLCA0LCA2KQ0KDQpgYGANCg0KIyMjIyBSZWdyZXNzaW9uIE1vZGVscyB7LX0NCg0KSGVyZSB3ZSBwcmVzZW50IGV4ZW1wbGFyeSBhbmFseXNlcyBvZiB0aGUgU3Ryb29wIGVmZmVjdCBmb3IgdGhlIG9uZSBzcGVjaWZpY2F0aW9uIG9mIHJlYWN0aW9uIHRpbWUgKG1lYW4gYWNyb3NzIGFsbCB0cmlhbHMsIG5vIHRyZWF0bWVudCBvZiBvdXRsaWVycykgYW5kIGVycm9yIHJhdGUgKGVycm9yIHJhdGUgYWNyb3NzIGFsbCB0cmlhbHMsIG5vIHRyZWF0bWVudCBvZiBvdXRsaWVycykuIEJlbG93LCB3ZSBhZGRpdGlvbmFsbHkgcHJvdmlkZSBhIHNwZWNpZmljYXRpb24gY3VydmUgYW5hbHlzaXMgb2YgdGhlIFN0cm9vcCBlZmZlY3QuIA0KDQpgYGB7cn0NCnN0cm9vcC5zaG9ydCRjb25kaXRpb24gPC0gcmVsZXZlbChzdHJvb3Auc2hvcnQkY29uZGl0aW9uLCByZWY9ImNvbmdydWVudCIpDQoNCiMgbW9kZWwgDQptLnJ0IDwtIGxtZXIobWVhbi5ydCB+IGNvbmRpdGlvbiArICgxfGlkKSwgZGF0YT1zdHJvb3Auc2hvcnQpDQptLmVyIDwtIGxtZXIoZXJyb3IucGVyYyB+IGNvbmRpdGlvbiArICgxfGlkKSwgZGF0YT1zdHJvb3Auc2hvcnQpDQoNCnRhYiA8LSBiaW5kX3Jvd3MoYXMuZGF0YS5mcmFtZShzdW1tYXJ5KG0ucnQpJGNvZWZmaWNpZW50cyksYXMuZGF0YS5mcmFtZShzdW1tYXJ5KG0uZXIpJGNvZWZmaWNpZW50cykpDQp0YWIkZGYgPC0gZmxvb3IodGFiJGRmKQ0KdGFiJGBQcig+fHR8KWAgPC0gcHJpbnRwKHRhYiRgUHIoPnx0fClgKQ0Kcm93Lm5hbWVzKHRhYikgPC0gYygiSW50ZXJjZXB0IChpLmUuLCBtZWFuIG9mIGNvbmdydWVudCB0cmlhbHMpIiwgDQogICAgICAgICAgICAgICAgICAgICJEaWZmZXJlbmNlIChpbiBtcykgYmV0d2VlbiBjb25ncnVlbnQgYW5kIG5ldXRyYWwgdHJpYWxzIiwNCiAgICAgICAgICAgICAgICAgICAgIkRpZmZlcmVuY2UgKGluIG1zKSBiZXR3ZWVuIGNvbmdydWVudCBhbmQgaW5jb25ncnVlbnQgdHJpYWxzIiwgDQogICAgICAgICAgICAgICAgICAgICJJbnRlcmNlcHQgKGkuZS4sIGVycm9yIHJhdGUgb2YgY29uZ3J1ZW50IHRyaWFscykiLCANCiAgICAgICAgICAgICAgICAgICAgIkRpZmZlcmVuY2UgKGluICUpIGJldHdlZW4gY29uZ3J1ZW50IGFuZCBuZXV0cmFsIHRyaWFscyIsDQogICAgICAgICAgICAgICAgICAgICJEaWZmZXJlbmNlIChpbiAlKSBiZXR3ZWVuIGNvbmdydWVudCBhbmQgaW5jb25ncnVlbnQgdHJpYWxzIikNCg0Ka2FibGUodGFiLA0KICAgICAgcm93Lm5hbWVzID0gVFJVRSwNCiAgICAgIGVzY2FwZSA9IEZBTFNFLA0KICAgICAgZGlnaXRzID0gMywNCiAgICAgIGFsaWduID0gInIiLA0KICAgICAgY29sLm5hbWVzID0gYygiQ29lZmZpY2llbnQiLCAiU0UiLCAiZGYiLCAiPGk+dDwvaT4iLCAiPGk+cDwvaT4iKSwNCiAgICAgIGNhcHRpb249Ik11bHRpbGV2ZWwgcmVncmVzc2lvbiBtb2RlbCBwcmVkaWN0aW5nIGF2ZXJhZ2UgcmVhY3Rpb24gdGltZXMgYW5kIGVycm9yIHJhdGVzIGZyb20gdGhlIGRpZmZlcmVudCBTdHJvb3AgdHJpYWwgdHlwZXMgYWdncmVnYXRlZCB3aXRoaW4gcGVyc29ucy4iKSAlPiUgIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSAlPiUgDQogICBwYWNrX3Jvd3MoIkRWOiBSZWFjdGlvbiBUaW1lIiwgMSwgMykgJT4lIA0KICAgcGFja19yb3dzKCJEVjogRXJyb3IgUmF0ZSIsIDQsIDYpICU+JSANCiAgIGNvbHVtbl9zcGVjKDEsIHdpZHRoID0gIjIwZW0iKSAlPiUNCiAgIGNvbHVtbl9zcGVjKDI6NSwgd2lkdGggPSAiOGVtIikNCg0KYGBgDQoNCiMjIyMgVmlzdWFsaXphdGlvbiB7LX0NCg0KSGVyZSB3ZSBwcmVzZW50IGV4ZW1wbGFyeSBhbmFseXNlcyBvZiB0aGUgU3Ryb29wIGVmZmVjdCBmb3IgdGhlIG9uZSBzcGVjaWZpY2F0aW9uIG9mIHJlYWN0aW9uIHRpbWUgKG1lYW4gYWNyb3NzIGFsbCB0cmlhbHMsIG5vIHRyZWF0bWVudCBvZiBvdXRsaWVycykgYW5kIGVycm9yIHJhdGUgKGVycm9yIHJhdGUgYWNyb3NzIGFsbCB0cmlhbHMsIG5vIHRyZWF0bWVudCBvZiBvdXRsaWVycykuIEJlbG93LCB3ZSBhZGRpdGlvbmFsbHkgcHJvdmlkZSBhIHNwZWNpZmljYXRpb24gY3VydmUgYW5hbHlzaXMgb2YgdGhlIFN0cm9vcCBlZmZlY3QuIA0KDQpgYGB7ciAsIGZpZy5hc3A9MC40LCBmaWcud2lkdGg9MTEsIG91dC53aWR0aD0iXFx0ZXh0d2lkdGgiLCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0NCg0KcnQgPC0gZ2dwbG90KHN0cm9vcC5zaG9ydCwgYWVzKHggPSBjb25kaXRpb24sIHkgPSBtZWFuLnJ0LCBmaWxsID0gY29uZGl0aW9uLCBjb2xvdXIgPSBjb25kaXRpb24pKSArDQogICB0aGVtZV9wdWIoKSArDQogICBnZW9tX3BvaW50KHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gLjI1KSwgc2l6ZSA9IDEsIGFscGhhID0gLjUpICsNCiAgIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIGFscGhhID0gMC4zLCB3aWR0aCA9IC4xNSwgY29sb3VyID0gIkJMQUNLIikgKw0KICAgZ3VpZGVzKGZpbGwgPSAibm9uZSIsIGNvbG91ciA9ICJub25lIikgKw0KICAgeWxhYigiTWVhbiByZWFjdGlvbiAgIHRpbWUiKSArDQogICB0aGVtZV9wdWIoKSArDQogICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgIGdndGl0bGUoIk1lYW4gUmVhY3Rpb24gVGltZSIpDQoNCmVyIDwtIGdncGxvdChzdHJvb3Auc2hvcnQsIGFlcyh4ID0gY29uZGl0aW9uLCB5ID0gZXJyb3IucGVyYywgZmlsbCA9IGNvbmRpdGlvbiwgY29sb3VyID0gY29uZGl0aW9uKSkgKw0KICAgdGhlbWVfcHViKCkgKw0KICAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IC4yNSwgaGVpZ2h0ID0gLjEpLCBzaXplID0gMSwgYWxwaGEgPSAuNSkgKw0KICAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgYWxwaGEgPSAwLjUsIHdpZHRoID0gLjE1LCBjb2xvdXIgPSAiQkxBQ0siKSArDQogICBndWlkZXMoZmlsbCA9ICJub25lIiwgY29sb3VyID0gIm5vbmUiKSArDQogICB5bGFiKCJFcnJvciByYXRlICglKSIpICsNCiAgIHRoZW1lX3B1YigpICsNCiAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICAgZ2d0aXRsZSgiRXJyb3IgUmF0ZSIpDQoNCnJ0IHwgZXINCg0KYGBgDQoNCiMjIyBEZXNjcmlwdGl2ZSBTcGVjaWZpY2F0aW9uIEN1cnZlcyB7LX0NCg0KYGBge3Igc3Ryb29wLWVmZi1zcGVjLWN1cnZlcywgZmlnLmFzcD0wLjgsIGZpZy53aWR0aD0xMSwgb3V0LndpZHRoPSJcXHRleHR3aWR0aCIsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQ0KDQpwMWEgPC0gcGxvdF9jdXJ2ZV9hb3YocmVzdWx0cy5zdHJvb3AucnQsDQogICAgICAgICAgICAgICAgICAgICAgImVzdGltYXRlX2NvbmRpdGlvbmluY29uZ3J1ZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY2kgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICByaWJib24gPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIG51bGwgPSAwKSArIA0KICAgdGhlbWVfcHViKCkgKyB5bGFiKCJudW1lcmljYWwgU3Ryb29wIGVmZmVjdCAoaW4gbXMpIikgKyBnZ3RpdGxlKCJSZWFjdGlvbiBUaW1lIikgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KcDJhIDwtIHBsb3RfY3VydmVfYW92KHJlc3VsdHMuc3Ryb29wLmVyLA0KICAgICAgICAgICAgICAgICAgICAgICJlc3RpbWF0ZV9jb25kaXRpb25pbmNvbmdydWVudCIsDQogICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNpID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgcmliYm9uID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBudWxsID0gMCkgKyANCiAgIHRoZW1lX3B1YigpICsgeWxhYigibnVtZXJpY2FsIFN0cm9vcCBlZmZlY3RcbihpbiAlIG9mIGVycm9ycykiKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgeCAqIDEwMCkgKyBnZ3RpdGxlKCJFcnJvciBSYXRlIikgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KcDFiIDwtIHBsb3RfY2hvaWNlc19hb3YocmVzdWx0cy5zdHJvb3AucnQsDQogICAgICAgICAgICAgICAgICAgICAgICAiZXN0aW1hdGVfY29uZGl0aW9uaW5jb25ncnVlbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJzdW1tYXJ5IiwgInN1YnNldCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA9IDApICsgdGhlbWVfcHViKCkgKyANCiAgIHRoZW1lKHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTksZmFjZT0iYm9sZCIpLA0KICAgICAgICAgcGFuZWwuc3BhY2luZyA9IHVuaXQoLjYsICJsaW5lcyIpLA0KICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgaGp1c3Q9MSkpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwxMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpwMmIgPC0gcGxvdF9jaG9pY2VzX2FvdihyZXN1bHRzLnN0cm9vcC5lciwNCiAgICAgICAgICAgICAgICAgICAgICAgICJlc3RpbWF0ZV9jb25kaXRpb25pbmNvbmdydWVudCIsDQogICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiksDQogICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgICBudWxsID0gMCkgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT05LGZhY2U9ImJvbGQiLCBoanVzdD0xLCBtYXJnaW49bWFyZ2luKGw9MTAsIGI9MTAsIHI9MTApKSwNCiAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0PTEpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KI3AxL3AyDQoNCmNvd3Bsb3Q6OnBsb3RfZ3JpZChwMWEsIHAyYSwgcDFiLCBwMmIsIG5jb2w9MiwgbGFiZWxzPWMoIkEiLCJCIiwiIiwiIiksIGxhYmVsX3NpemUgPSAxMCwgYWxpZ24gPSAidiIsIGF4aXMgPSAicmJsIiwgcmVsX2hlaWdodHMgPSBjKDEsIDEuMykpDQoNCmBgYA0KDQojIyMgUGVybXV0YXRpb24gVGVzdCB7LX0NCg0KYGBge3Igc3Ryb29wLWVmZi1wZXJtLXRlc3R9DQoNCiMjIGNyZWF0ZSB0YWJsZQ0KdGFiIDwtIGJpbmRfY29scyhkYXRhLmZyYW1lKGR2PWMoIlJlYWN0aW9uIHRpbWUiLCAiRXJyb3IgcmF0ZSIpKSwgcmVzLnN0cm9vcCkNCg0KdGFiJHByZWRpY3RvciA8LSBjKCJTdHJvb3AgZWZmZWN0OiBkaWZmZXJlbmNlIGluIHJlYWN0aW9uIHRpbWUgKGluIG1zKSBiZXR3ZWVuIGluY29uZ3J1ZW50IGFuZCBjb25ncnVlbnQgdHJpYWxzIiwNCiAgICAgICAgICAgICAgICAgICAiU3Ryb29wIGVmZmVjdDogZGlmZmVyZW5jZSBpbiBlcnJvciByYXRlIChpbiAlKSBiZXR3ZWVuIGluY29uZ3J1ZW50IGFuZCBjb25ncnVlbnQgdHJpYWxzIikNCnRhYiRtZWQuZWZmWzJdIDwtIHRhYiRtZWQuZWZmWzJdKjEwMA0KdGFiJHAudmFsIDwtIHByaW50cCh0YWIkcC52YWwpDQp0YWIkbi5zaWcgPC0gcm91bmQodGFiJG4uc2lnKjEwMC90YWIkbi5zcGVjcywwKQ0KDQoNCiMjIHByaW50IHRhYmxlDQprYWJsZSh0YWIsDQogICAgICBhbGlnbiA9IGMoImwiLCAibCIsICJyIiwgInIiLCAiciIsICJyIiwgInIiKSwNCiAgICAgIGVzY2FwZSA9IEYsIA0KICAgICAgY29sLm5hbWVzID0gYygiRFYiLCAiUmVsZXZhbnQgcHJlZGljdG9yIiwgIk51bWJlciBvZiBzcGVjaWZpY2F0aW9ucyIsICJNZWRpYW4gZWZmZWN0IHNpemUiLCANCiAgICAgICAgICAgICAgICAgICAgIlNpZ25pZmljYW50IHNwZWNpZmljYXRpb25zICglKSIsICJOdW1iZXIgb2Ygc2h1ZmZsZWQgc2FtcGxlcyB3aXRoIG1vcmUgc2lnbmlmaWNhbnQgDQogICAgICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIHRoYW4gZm9yIHRoZSBvcmlnaW5hbCBzYW1wbGUiLCAiPGk+cDwvaT4gdmFsdWUgb2YgcGVybXV0YXRpb24gdGVzdCIpKSAlPiUgDQogICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgDQogICAgICAgICAgICAgICAgICAgICAgIkRlc2NyaXB0aW9uIG9mIHNwZWNpZmljYXRpb24gY3VydmVcbihmb3Igb3JpZ2luYWwgc2FtcGxlKSIgPSAzLCANCiAgICAgICAgICAgICAgICAgICAgICAiUGVybXV0YXRpb24gdGVzdCB3aXRoXG41MDAgc2h1ZmZsZWQgc2FtcGxlcyIgPSAyKSkgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSANCg0KYGBgDQoNCiMjIyBJbmZlcmVudGlhbCBTcGVjaWZpY2F0aW9uIEN1cnZlcyB7LX0NCg0KYGBge3Igc3Ryb29wLWVmZi1wZXJtLWN1cnZlcywgZmlnLmFzcD0wLjMsIGZpZy53aWR0aD0xMSwgb3V0LndpZHRoPSJcXHRleHR3aWR0aCIsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQ0KDQpwMSA8LSBwbG90X2N1cnZlX2FvdihyZXN1bHRzLnN0cm9vcC5ydCwgImVzdGltYXRlX2NvbmRpdGlvbmluY29uZ3J1ZW50IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gIm51bWVyaWNhbCBTdHJvb3AgZWZmZWN0IChpbiBtcykiKSArDQogICB0aGVtZV9wdWIoKSArIA0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmUuc3Ryb29wLnJ0Il1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLCANCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDYwMCwxMDApKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJSZWFjdGlvbiB0aW1lIikgDQoNCnAyIDwtIHBsb3RfY3VydmVfYW92KHJlc3VsdHMuc3Ryb29wLmVyLCAiZXN0aW1hdGVfY29uZGl0aW9uaW5jb25ncnVlbnQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAibnVtZXJpY2FsIFN0cm9vcCBlZmZlY3QgKGluICUgb2YgZXJyb3JzKSIpICsNCiAgIHRoZW1lX3B1YigpICsgDQogICBnZW9tX3JpYmJvbihkYXRhPWNvbmYuY3VydmVzW1siY29uZi5jdXJ2ZS5zdHJvb3AuZXIiXV0sIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksIA0KICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGE9LjIsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmxhY2siKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gImJsYWNrIiksIHNpemUgPSAxKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgeCAqIDEwMCkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDE1MCwyNSkpICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIkVycm9yIHJhdGVzIikNCg0KY293cGxvdDo6cGxvdF9ncmlkKHAxLCBwMiwgbmNvbD0yLCBsYWJlbHM9YygiQSIsIkIiKSwgbGFiZWxfc2l6ZSA9IDEwLCBhbGlnbiA9ICJ2IiwgYXhpcyA9ICJyYmwiKQ0KDQpgYGANCg0KIyMjIENvbmNsdXNpb24gey19DQoNCkFzIGV4cGVjdGVkLCB3ZSBmb3VuZCBzaWduaWZpY2FudCBTdHJvb3AgZWZmZWN0cyBpbiB0aGUgbnVtZXJpY2FsIFN0cm9vcCB0YXNrOg0KDQoqIFBhcnRpY2lwYW50cyBoYWQgc2lnbmlmaWNhbnRseSBsb25nZXIgcmVhY3Rpb24gdGltZXMgaW4gaW5jb25ncnVlbnQgdHJpYWxzIHRoYW4gaW4gY29uZ3J1ZW50IHRyaWFscyAobWVkaWFuIGRpZmZlcmVuY2UgYWNyb3NzIGFsbCBzcGVjaWZpY2F0aW9uczogYHIgcmVzLnN0cm9vcCRtZWQuZWZmWzFdYG1zKSANCiogUGFydGljaXBhbnRzIG1hZGUgc2lnbmlmaWNhbnRseSBtb3JlIGVycm9ycyBpbiBpbmNvbmdydWVudCB0cmlhbHMgdGhhbiBpbiBjb25ncnVlbnQgdHJpYWxzIChtZWRpYW4gZGlmZmVyZW5jZSBhY3Jvc3MgYWxsIHNwZWNpZmljYXRpb25zOiBgciByZXMuc3Ryb29wJG1lZC5lZmZbMl0qMTAwYCUpDQoqIFBlcm11dGF0aW9uIHRlc3RzIGRlbW9uc3RyYXRlZCB0aGF0IHRoZSBudWxsIGh5cG90aGVzaXMgb2Ygbm8gU3Ryb29wIGVmZmVjdCBoYWQgdG8gYmUgcmVqZWN0ZWQgYWNyb3NzIHRoZSB3aG9sZSBzcGVjaWZpY2F0aW9uIGN1cnZlLCAqcCogYHIgcHJpbnRwKHJlcy5zdHJvb3AkcC52YWxbMV0sIGFkZF9lcXVhbHM9VClgIGZvciByZWFjdGlvbiB0aW1lcyBhbmQgKnAqIGByIHByaW50cChyZXMuc3Ryb29wJHAudmFsWzJdLCBhZGRfZXF1YWxzPVQpYCBmb3IgZXJyb3IgcmF0ZXMNCg0KIyMgQW5hbHlzaXMgb2YgVmFyaWFuY2Ugey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyMgRGVzY3JpcHRpdmUgU3BlY2lmaWNhdGlvbiBDdXJ2ZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyMjIFJlYWN0aW9uIFRpbWUgey19DQoNCmBgYHtyIGRlc2NyaXB0aXZlLXNwZWMtY3VydmVzLWFvdi1ydCwgZXZhbD1ULCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9MS41LCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9VCwgZmlnLmNhcD0iRGVzY3JpcHRpdmUgc3BlY2lmaWNhdGlvbiBjdXJ2ZXMgb2YgdHJhaXQtc3RhdGUgYW5kIHN0YXRlLXNpdHVhdGlvbiBpbnRlcmFjdGlvbiBjb2VmZmljaWVudHMgcHJlZGljdGluZyBTdHJvb3AgZXJyb3IgcmF0ZXMuIn0NCg0KbGFiZWxzLnByZSA9IGMoImNvbmRpdGlvbi5iZWggKyBjb25kaXRpb24uc2l0IiwgDQogICAgICAgICAgICAgICAiY29uZGl0aW9uLmJlaCArIGNvbmRpdGlvbi5zaXQgKyBwb2ludHMuYyIsDQogICAgICAgICAgICAgICAiY29uZGl0aW9uLmJlaCArIGNvbmRpdGlvbi5zaXQgKyBwb2ludHMuYyArIHBvaW50cy5kaWZmIiwNCiAgICAgICAgICAgICAgICJjb25kaXRpb24uYmVoICsgY29uZGl0aW9uLnNpdCArIHBvaW50cy5kaWZmIikNCmxhYmVscy5wb3N0ID0gYygiZXhwLiBncm91cHMiLA0KICAgICAgICAgICAgICAgICJleHAuIGdyb3VwcyArIHBvaW50cyIsDQogICAgICAgICAgICAgICAgImV4cC4gZ3JvdXBzICsgcG9pbnRzICsgZGlmZiIsDQogICAgICAgICAgICAgICAgImV4cC4gZ3JvdXBzICsgZGlmZiIpDQoNCnJlcy5hb3YucnQuYSA8LSByZXMuYW92LnJ0LmEgJT4lIA0KICAgbXV0YXRlKGNvbnRyb2xzID0gZmFjdG9yKGNvbnRyb2xzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiY29uZGl0aW9uLmJlaCArIHRyYWl0LmEubXMgKyBjb25kaXRpb24uc2l0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmRpdGlvbi5iZWggKyB0cmFpdC5hLm1zICsgY29uZGl0aW9uLnNpdCArIHBvaW50cy5jIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uLmJlaCArIHRyYWl0LmEubXMgKyBjb25kaXRpb24uc2l0ICsgcG9pbnRzLmMgKyBwb2ludHMuZGlmZiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmRpdGlvbi5iZWggKyB0cmFpdC5hLm1zICsgY29uZGl0aW9uLnNpdCArIHBvaW50cy5kaWZmIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJleHAuIGdyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cC4gZ3JvdXBzICsgcG9pbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwLiBncm91cHMgKyBwb2ludHMgKyBkaWZmIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwLiBncm91cHMgKyBkaWZmIikpKQ0KDQoNCg0KcmVzLmFvdi5ydC5oIDwtIHJlcy5hb3YucnQuaCAlPiUgDQogICBtdXRhdGUoY29udHJvbHMgPSBmYWN0b3IoY29udHJvbHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJjb25kaXRpb24uYmVoICsgdHJhaXQuaC5tcyArIGNvbmRpdGlvbi5zaXQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uLmJlaCArIHRyYWl0LmgubXMgKyBjb25kaXRpb24uc2l0ICsgcG9pbnRzLmMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25kaXRpb24uYmVoICsgdHJhaXQuaC5tcyArIGNvbmRpdGlvbi5zaXQgKyBwb2ludHMuYyArIHBvaW50cy5kaWZmIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uLmJlaCArIHRyYWl0LmgubXMgKyBjb25kaXRpb24uc2l0ICsgcG9pbnRzLmRpZmYiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoImV4cC4gZ3JvdXBzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwLiBncm91cHMgKyBwb2ludHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHAuIGdyb3VwcyArIHBvaW50cyArIGRpZmYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHAuIGdyb3VwcyArIGRpZmYiKSkpDQoNCnJlcy5hb3YucnQuc2l0IDwtIHJlcy5hb3YucnQuc2l0ICU+JSANCiAgIG11dGF0ZShjb250cm9scyA9IGZhY3Rvcihjb250cm9scywgbGV2ZWxzPWxhYmVscy5wcmUsIGxhYmVscz1sYWJlbHMucG9zdCkpDQoNCmEgPC0gcGxvdF9jdXJ2ZV9hb3YocmVzLmFvdi5ydC5hLCAiZXN0aW1hdGVfY29uZGl0aW9uLmJlaGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eTp0cmFpdC5hLm1zaGlnaCB0cmFpdCBhZ3JlZWFibGVuZXNzIiwgY2kgPSBGQUxTRSwgcmliYm9uID0gVCkgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgIGxpbmV0eXBlID0gImRhc2hlZCIsICBjb2xvciA9ICJibGFjayIpICsNCiAgIGxhYnMoeCA9ICIiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdCAoaW4gbXMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBnZ3RpdGxlKCJUcmFpdCBBZ3JlZWFibGVuZXNzIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIpICsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw5MDAwLDE1MDApKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpiIDwtIHBsb3RfY3VydmVfYW92KHJlcy5hb3YucnQuaCwgImVzdGltYXRlX2NvbmRpdGlvbi5iZWhoaWdoIGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHk6dHJhaXQuaC5tc2hpZ2ggdHJhaXQgaG9uZXN0eS1odW1pbGl0eSIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IFQpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsICBsaW5ldHlwZSA9ICJkYXNoZWQiLCAgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiVHJhaXQgSG9uZXN0eSB4IEJlaGF2aW9yIENvbmRpdGlvbnMiKSArDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxNTAwKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KYyA8LSBwbG90X2N1cnZlX2FvdihyZXMuYW92LnJ0LnNpdCwgImVzdGltYXRlX2NvbmRpdGlvbi5iZWhoaWdoIGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHk6Y29uZGl0aW9uLnNpdDIiLCBjaSA9IEZBTFNFLCByaWJib24gPSBUKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgIGNvbG9yID0gImJsYWNrIikgKw0KICAgbGFicyh4ID0gIiIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0IChpbiBtcykiKSArDQogICB0aGVtZV9wdWIoKSArIGdndGl0bGUoIlNpdHVhdGlvbiB4IEJlaGF2aW9yIENvbmRpdGlvbnMiKSArDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxNTAwKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KZCA8LSBwbG90X2Nob2ljZXNfYW92KHJlcy5hb3YucnQuYSwgImVzdGltYXRlX2NvbmRpdGlvbi5iZWhoaWdoIGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHk6dHJhaXQuYS5tc2hpZ2ggdHJhaXQgYWdyZWVhYmxlbmVzcyIsIA0KICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXMgPSBjKCJpZGVudGlmaWNhdGlvbiIsICJ0cmVhdG1lbnQiLCAiY29uZGl0aW9ucyIsICJzdW1tYXJ5IiwgImNvbnRyb2xzIikpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIpICsgdGhlbWVfcHViKCkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw5MDAwLDE1MDApKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdD0xKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIiksDQogICAgICAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCguNzUsICJsaW5lcyIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KZSA8LSBwbG90X2Nob2ljZXNfYW92KHJlcy5hb3YucnQuaCwgImVzdGltYXRlX2NvbmRpdGlvbi5iZWhoaWdoIGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHk6dHJhaXQuaC5tc2hpZ2ggdHJhaXQgaG9uZXN0eS1odW1pbGl0eSIsIA0KICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXMgPSBjKCJpZGVudGlmaWNhdGlvbiIsICJ0cmVhdG1lbnQiLCAiY29uZGl0aW9ucyIsICJzdW1tYXJ5IiwgImNvbnRyb2xzIikpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIpICsgdGhlbWVfcHViKCkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw5MDAwLDE1MDApKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdD0xKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIiksDQogICAgICAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCguNzUsICJsaW5lcyIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KDQpmIDwtIHBsb3RfY2hvaWNlc19hb3YocmVzLmFvdi5ydC5zaXQsICJlc3RpbWF0ZV9jb25kaXRpb24uYmVoaGlnaCBhZ3JlZWFibGVuZXNzIGFuZCBob25lc3R5OmNvbmRpdGlvbi5zaXQyIiwgDQogICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJjb25kaXRpb25zIiwgInN1bW1hcnkiLCAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDkwMDAsMTUwMCkpICsNCiAgIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0PTEpLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSwNCiAgICAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KC43NSwgImxpbmVzIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwxMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQoNCg0KIyMgY29tYmluZSBwbG90cw0KY293cGxvdDo6cGxvdF9ncmlkKGEsYixkLGUsYyxOVUxMLGYsIG5jb2w9MiwgIGxhYmVscz1jKCJBIiwiQiIsICIiLCIiLCAiQyIsIiIsICIiKSwgbGFiZWxfc2l6ZSA9IDEyLCBhbGlnbiA9ICJ2IiwgYXhpcyA9ICJyYmwiLCByZWxfaGVpZ2h0cyA9IGMoMSwgMS41KSkNCg0KYGBgDQoNCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmFzcD0wLjcsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBmaWcuY2FwPSJJbGx1c3RyYXRpb24gb2YgdGhlIHNpZ25pZmljYW50IGludGVyYWN0aW9uIGJldHdlZW4gbWVkaWFuLXNwbGl0IHRyYWl0IGFncmVlYWJsZW5lc3MgYW5kIHRoZSBiZWhhdmlvciBjb25kaXRpb25zIHByZWRpY3RpbmcgcmVhY3Rpb24gdGltZXMuIn0NCg0KZCA8LSByZXMuYW92LnJ0LmEgJT4lIA0KICAgc2VsZWN0KGNvbnRhaW5zKCJlc3RpbWF0ZSIpKSAlPiUgDQogICBzdW1tYXJpemUoaW50ZXJjZXB0ID0gbWVkaWFuKGBlc3RpbWF0ZV8oSW50ZXJjZXB0KWApLA0KICAgICAgICAgICAgIGNvbmQuaGlnaCA9IG1lZGlhbihgZXN0aW1hdGVfY29uZGl0aW9uLmJlaGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eWApLA0KICAgICAgICAgICAgIHRyYWl0LmhpZ2ggPSBtZWRpYW4oYGVzdGltYXRlX3RyYWl0LmEubXNoaWdoIHRyYWl0IGFncmVlYWJsZW5lc3NgKSwNCiAgICAgICAgICAgICBpbnRlcmFjdGlvbiA9IG1lZGlhbihgZXN0aW1hdGVfY29uZGl0aW9uLmJlaGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eTp0cmFpdC5hLm1zaGlnaCB0cmFpdCBhZ3JlZWFibGVuZXNzYCkpIA0KDQpkZiA8LSBkYXRhLmZyYW1lKHZhbHVlPXJlcChOQSw0KSwgdHJhaXQ9cmVwKGMoImRpc2FncmVlYWJsZSIsICJhZ3JlZWFibGUiKSwyKSwgYmVoYXZpb3I9cmVwKGMoImRpc2FncmVlYWJsZSIsICJhZ3JlZWFibGUiKSxlYWNoPTIpKQ0KZGYkdmFsdWUgPC0gYyhkJGludGVyY2VwdCwgZCRpbnRlcmNlcHQrZCR0cmFpdC5oaWdoLCBkJGludGVyY2VwdCtkJGNvbmQuaGlnaCwgZCRpbnRlcmNlcHQrZCRjb25kLmhpZ2grZCR0cmFpdC5oaWdoK2QkaW50ZXJhY3Rpb24pDQoNCmdncGxvdChkZiwgYWVzKHg9YmVoYXZpb3IsIHk9dmFsdWUsIGdyb3VwPXRyYWl0LCBsaW5ldHlwZT10cmFpdCkpICsgdGhlbWVfcHViKCkgKw0KICAgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkgKw0KICAgc2NhbGVfeF9kaXNjcmV0ZShleHBhbmQ9YygwLjEsMC4xKSkgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cz1jKDc0MCw4MzApKSArDQogICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLCBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgDQogICBsYWJzKHg9IkJlaGF2aW9yIGNvbmRpdGlvbnMiLCB5PSJNZWRpYW4gcHJlZGljdGVkIHJlYWN0aW9uIHRpbWVcbmFjcm9zcyBhbGwgc3BlY2lmaWNhdGlvbnMgKGluIG1zKSIsIGxpbmV0eXBlPSJUcmFpdCBBZ3JlZWFibGVuZXNzIikgKyBnZ3RpdGxlKCJUcmFpdCBBZ3JlZWFibGVuZXNzIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIpDQoNCmBgYA0KDQojIyMjIEVycm9yIFJhdGUgey19DQoNCmBgYHtyIGRlc2NyaXB0aXZlLXNwZWMtY3VydmVzLWFvdi1lcnJvciwgZXZhbD1ULCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9MS41LCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9VCwgZmlnLmNhcD0iRGVzY3JpcHRpdmUgc3BlY2lmaWNhdGlvbiBjdXJ2ZXMgb2YgdHJhaXQtc3RhdGUgYW5kIHN0YXRlLXNpdHVhdGlvbiBpbnRlcmFjdGlvbiBjb2VmZmljaWVudHMgcHJlZGljdGluZyBTdHJvb3AgZXJyb3IgcmF0ZXMuIn0NCg0KcmVzLmFvdi5lci5hIDwtIHJlcy5hb3YuZXIuYSAlPiUgDQogICBtdXRhdGUoY29udHJvbHMgPSBmYWN0b3IoY29udHJvbHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJjb25kaXRpb24uYmVoICsgdHJhaXQuYS5tcyArIGNvbmRpdGlvbi5zaXQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uLmJlaCArIHRyYWl0LmEubXMgKyBjb25kaXRpb24uc2l0ICsgcG9pbnRzLmMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25kaXRpb24uYmVoICsgdHJhaXQuYS5tcyArIGNvbmRpdGlvbi5zaXQgKyBwb2ludHMuYyArIHBvaW50cy5kaWZmIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uLmJlaCArIHRyYWl0LmEubXMgKyBjb25kaXRpb24uc2l0ICsgcG9pbnRzLmRpZmYiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoImV4cC4gZ3JvdXBzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwLiBncm91cHMgKyBwb2ludHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHAuIGdyb3VwcyArIHBvaW50cyArIGRpZmYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHAuIGdyb3VwcyArIGRpZmYiKSkpDQoNCnJlcy5hb3YuZXIuaCA8LSByZXMuYW92LmVyLmggJT4lIA0KICAgbXV0YXRlKGNvbnRyb2xzID0gZmFjdG9yKGNvbnRyb2xzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiY29uZGl0aW9uLmJlaCArIHRyYWl0LmgubXMgKyBjb25kaXRpb24uc2l0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmRpdGlvbi5iZWggKyB0cmFpdC5oLm1zICsgY29uZGl0aW9uLnNpdCArIHBvaW50cy5jIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZGl0aW9uLmJlaCArIHRyYWl0LmgubXMgKyBjb25kaXRpb24uc2l0ICsgcG9pbnRzLmMgKyBwb2ludHMuZGlmZiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmRpdGlvbi5iZWggKyB0cmFpdC5oLm1zICsgY29uZGl0aW9uLnNpdCArIHBvaW50cy5kaWZmIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJleHAuIGdyb3VwcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cC4gZ3JvdXBzICsgcG9pbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwLiBncm91cHMgKyBwb2ludHMgKyBkaWZmIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwLiBncm91cHMgKyBkaWZmIikpKQ0KDQpyZXMuYW92LmVyLnNpdCA8LSByZXMuYW92LmVyLnNpdCAlPiUgDQogICBtdXRhdGUoY29udHJvbHMgPSBmYWN0b3IoY29udHJvbHMsIGxldmVscz1sYWJlbHMucHJlLCBsYWJlbHM9bGFiZWxzLnBvc3QpKQ0KDQphIDwtIHBsb3RfY3VydmVfYW92KHJlcy5hb3YuZXIuYSwgImVzdGltYXRlX2NvbmRpdGlvbi5iZWhoaWdoIGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHk6dHJhaXQuYS5tc2hpZ2ggdHJhaXQgYWdyZWVhYmxlbmVzcyIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IFQpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsICBsaW5ldHlwZSA9ICJkYXNoZWQiLCAgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3RcbihpbiAlIG9mIGVycm9ycykiKSArDQogICB0aGVtZV9wdWIoKSArIGdndGl0bGUoIlRyYWl0LVN0YXRlIEFncmVlYWJsZW5lc3MiKSArDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsMjQwMCw1MDApKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgeCAqIDEwMCkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KYiA8LSBwbG90X2N1cnZlX2FvdihyZXMuYW92LmVyLmgsICJlc3RpbWF0ZV9jb25kaXRpb24uYmVoaGlnaCBhZ3JlZWFibGVuZXNzIGFuZCBob25lc3R5OnRyYWl0LmgubXNoaWdoIHRyYWl0IGhvbmVzdHktaHVtaWxpdHkiLCBjaSA9IEZBTFNFLCByaWJib24gPSBUKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgIGNvbG9yID0gImJsYWNrIikgKw0KICAgbGFicyh4ID0gIiIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0XG4oaW4gJSBvZiBlcnJvcnMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBnZ3RpdGxlKCJUcmFpdC1TdGF0ZSBIb25lc3R5IikgKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDI0MDAsNTAwKSkgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHggKiAxMDApICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDIwLDAsLTIwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmMgPC0gcGxvdF9jdXJ2ZV9hb3YocmVzLmFvdi5lci5zaXQsICJlc3RpbWF0ZV9jb25kaXRpb24uYmVoaGlnaCBhZ3JlZWFibGVuZXNzIGFuZCBob25lc3R5OmNvbmRpdGlvbi5zaXQyIiwgY2kgPSBGQUxTRSwgcmliYm9uID0gVCkgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgIGxpbmV0eXBlID0gImRhc2hlZCIsICBjb2xvciA9ICJibGFjayIpICsNCiAgIGxhYnMoeCA9ICIiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdFxuKGluICUgb2YgZXJyb3JzKSIpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiU2l0dWF0aW9uIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIpICsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwyNDAwLDUwMCkpICsNCiAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmdW5jdGlvbih4KSB4ICogMTAwKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpkIDwtIHBsb3RfY2hvaWNlc19hb3YocmVzLmFvdi5lci5hLCAiZXN0aW1hdGVfY29uZGl0aW9uLmJlaGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eTp0cmFpdC5hLm1zaGlnaCB0cmFpdCBhZ3JlZWFibGVuZXNzIiwgDQogICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJjb25kaXRpb25zIiwgImNvbnRyb2xzIikpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIpICsgdGhlbWVfcHViKCkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwyNDAwLDUwMCkpICsNCiAgIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0PTEpLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSwNCiAgICAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KC43NSwgImxpbmVzIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwxMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQplIDwtIHBsb3RfY2hvaWNlc19hb3YocmVzLmFvdi5lci5oLCAiZXN0aW1hdGVfY29uZGl0aW9uLmJlaGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eTp0cmFpdC5oLm1zaGlnaCB0cmFpdCBob25lc3R5LWh1bWlsaXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJjb25kaXRpb25zIiwgImNvbnRyb2xzIikpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIpICsgdGhlbWVfcHViKCkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwyNDAwLDUwMCkpICsNCiAgIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0PTEpLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSwNCiAgICAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KC43NSwgImxpbmVzIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwxMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQoNCmYgPC0gcGxvdF9jaG9pY2VzX2FvdihyZXMuYW92LmVyLnNpdCwgImVzdGltYXRlX2NvbmRpdGlvbi5iZWhoaWdoIGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHk6Y29uZGl0aW9uLnNpdDIiLCANCiAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiwgImNvbmRpdGlvbnMiLCAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDI0MDAsNTAwKSkgKw0KICAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgaGp1c3Q9MSksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpLA0KICAgICAgICAgcGFuZWwuc3BhY2luZyA9IHVuaXQoLjc1LCAibGluZXMiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDEwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCg0KDQojIyBjb21iaW5lIHBsb3RzDQpjb3dwbG90OjpwbG90X2dyaWQoYSxiLGQsZSxjLE5VTEwsZiwgbmNvbD0yLCAgbGFiZWxzPWMoIkEiLCJCIiwgIiIsIiIsICJDIiwiIiwgIiIpLCBsYWJlbF9zaXplID0gMTIsIGFsaWduID0gInYiLCBheGlzID0gInJibCIsIHJlbF9oZWlnaHRzID0gYygxLCAxLjUpKQ0KDQpgYGANCg0KIyMjIFBlcm11dGF0aW9uIFRlc3Qgey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyMjIFJlYWN0aW9uIFRpbWUgey19DQoNCmBgYHtyIHBlcm0tdGFiLWFvdi1ydCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGNhY2hlPVR9DQoNCiMjIGNyZWF0ZSB0YWJsZQ0KdGFiIDwtIGRhdGEuZnJhbWUoY29uZ3J1ZW5jZS5vcD1yZXAoIkludGVyYWN0aW9uIiwzKSwgDQogICAgICAgICAgICAgICAgICBwcmVkaWN0b3I9YygiTWVkaWFuLXNwbGl0IFRyYWl0IEEgeCBCZWhhdmlvciBDb25kaXRpb25zIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWFuLXNwbGl0IFRyYWl0IEggeCBCZWhhdmlvciBDb25kaXRpb25zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaXR1YXRpb24geCBCZWhhdmlvciBDb25kaXRpb25zIiksDQogICAgICAgICAgICAgICAgICBuLnNwZWNzID0gTkEsDQogICAgICAgICAgICAgICAgICBtZWQuZWZmZWN0ID0gTkEsDQogICAgICAgICAgICAgICAgICBwZXJjLnNpZyA9IE5BLA0KICAgICAgICAgICAgICAgICAgbi5zaHVmZiA9IE5BLA0KICAgICAgICAgICAgICAgICAgcC52YWwgPSBOQSkNCg0KIyMgZmlsbCB0YWJsZQ0KdGFiW2MoMTozKSwzOjddIDwtIHJlcy5hb3YucnRbLDI6Nl0NCg0KDQojIyBmb3JtYXQgdGFibGUNCnRhYiRwLnZhbCA8LSBwcmludHAodGFiJHAudmFsKQ0KdGFiJHBlcmMuc2lnIDwtIGlmZWxzZShpcy5uYSh0YWIkcGVyYy5zaWcpLE5BLHBhc3RlMChyb3VuZCh0YWIkcGVyYy5zaWcqMTAwL3RhYiRuLnNwZWNzLDApLCIlIikpDQoNCg0KDQojIyBwcmludCB0YWJsZQ0Ka2FibGUodGFiLA0KICAgICAgYWxpZ24gPSBjKCJsIiwgImwiLCAiciIsICJyIiwgInIiLCAiciIsICJyIiksDQogICAgICBlc2NhcGU9RiwNCiAgICAgIGNvbC5uYW1lcyA9IGMoIk9wZXJhdGlvbmFsaXphdGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICAiUmVsZXZhbnQgcHJlZGljdG9yIiwgIk51bWJlciBvZiBzcGVjaWZpY2F0aW9ucyIsIA0KICAgICAgICAgICAgICAgICAgICAiTWVkaWFuIGVmZmVjdCBzaXplIiwgICJTaWduaWZpY2FudCBzcGVjaWZpY2F0aW9ucyAoJSkiLCANCiAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBzaHVmZmxlZCBzYW1wbGVzXG53aXRoIG1vcmUgc2lnbmlmaWNhbnQgDQogICAgICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb25zXG50aGFuIGZvciB0aGUgb3JpZ2luYWwgc2FtcGxlIiwgIjxpPnA8L2k+IHZhbHVlIG9mIHBlcm11dGF0aW9uIHRlc3QiKSkgJT4lIA0KICAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsIA0KICAgICAgICAgICAgICAgICAgICAgICJEZXNjcmlwdGlvbiBvZiBzcGVjaWZpY2F0aW9uIGN1cnZlIChmb3Igb3JpZ2luYWwgc2FtcGxlKSIgPSAzLCANCiAgICAgICAgICAgICAgICAgICAgICAiUGVybXV0YXRpb24gdGVzdCB3aXRoIDUwMCBzaHVmZmxlZCBzYW1wbGVzIiA9IDIpKSAlPiUgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmaXhlZF90aGVhZCA9IFQpIA0KDQpgYGANCg0KIyMjIyBFcnJvciBSYXRlIHstfQ0KDQpgYGB7ciBwZXJtLXRhYi1hb3YtZXIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1UfQ0KDQojIyBjcmVhdGUgdGFibGUNCnRhYiA8LSBkYXRhLmZyYW1lKGNvbmdydWVuY2Uub3A9cmVwKCJJbnRlcmFjdGlvbiIsMyksIA0KICAgICAgICAgICAgICAgICAgcHJlZGljdG9yPWMoIk1lZGlhbi1zcGxpdCBUcmFpdCBBIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZGlhbi1zcGxpdCBUcmFpdCBIIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l0dWF0aW9uIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIpLA0KICAgICAgICAgICAgICAgICAgbi5zcGVjcyA9IE5BLA0KICAgICAgICAgICAgICAgICAgbWVkLmVmZmVjdCA9IE5BLA0KICAgICAgICAgICAgICAgICAgcGVyYy5zaWcgPSBOQSwNCiAgICAgICAgICAgICAgICAgIG4uc2h1ZmYgPSBOQSwNCiAgICAgICAgICAgICAgICAgIHAudmFsID0gTkEpDQoNCiMjIGZpbGwgdGFibGUNCnRhYltjKDE6MyksMzo3XSA8LSByZXMuYW92LmVycm9yWywyOjZdDQoNCg0KIyMgZm9ybWF0IHRhYmxlDQp0YWIkcC52YWwgPC0gcHJpbnRwKHRhYiRwLnZhbCkNCnRhYiRwZXJjLnNpZyA8LSBpZmVsc2UoaXMubmEodGFiJHBlcmMuc2lnKSxOQSxwYXN0ZTAocm91bmQodGFiJHBlcmMuc2lnKjEwMC90YWIkbi5zcGVjcywwKSwiJSIpKQ0KDQoNCg0KIyMgcHJpbnQgdGFibGUNCmthYmxlKHRhYiwNCiAgICAgIGFsaWduID0gYygibCIsICJsIiwgInIiLCAiciIsICJyIiwgInIiLCAiciIpLA0KICAgICAgZXNjYXBlPUYsDQogICAgICBjb2wubmFtZXMgPSBjKCJPcGVyYXRpb25hbGl6YXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgIlJlbGV2YW50IHByZWRpY3RvciIsICJOdW1iZXIgb2Ygc3BlY2lmaWNhdGlvbnMiLCANCiAgICAgICAgICAgICAgICAgICAgIk1lZGlhbiBlZmZlY3Qgc2l6ZSIsICAiU2lnbmlmaWNhbnQgc3BlY2lmaWNhdGlvbnMgKCUpIiwgDQogICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2Ygc2h1ZmZsZWQgc2FtcGxlcyB3aXRoIG1vcmUgc2lnbmlmaWNhbnQgDQogICAgICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb25zIHRoYW4gZm9yIHRoZSBvcmlnaW5hbCBzYW1wbGUiLCAiPGk+cDwvaT4gdmFsdWUgb2YgcGVybXV0YXRpb24gdGVzdCIpKSAlPiUgDQogICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMiwgDQogICAgICAgICAgICAgICAgICAgICAgIkRlc2NyaXB0aW9uIG9mIHNwZWNpZmljYXRpb24gY3VydmUgKGZvciBvcmlnaW5hbCBzYW1wbGUpIiA9IDMsIA0KICAgICAgICAgICAgICAgICAgICAgICJQZXJtdXRhdGlvbiB0ZXN0IHdpdGggNTAwIHNodWZmbGVkIHNhbXBsZXMiID0gMikpICU+JSANCiAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZpeGVkX3RoZWFkID0gVCkgDQoNCmBgYA0KDQojIyMgSW5mZXJlbnRpYWwgU3BlY2lmaWNhdGlvbiBDdXJ2ZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyMjIFJlYWN0aW9uIFRpbWUgey19DQoNCmBgYHtyIHBlcm0tcGxvdC1hb3YtcnQsIGV2YWw9VCwgZmlnLndpZHRoPTExLCBmaWcuYXNwPTAuOCwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGNhY2hlPVQsIGZpZy5jYXA9IkNvbXBhcmlzb24gb2Ygb2JzZXJ2ZWQgKGRlc2NyaXB0aXZlKSBzcGVjaWZpY2F0aW9uIGN1cnZlcyAoYmxhY2sgZG90cykgYW5kIGV4cGVjdGVkIHVuZGVyLXRoZS1udWxsIHNwZWNpZmljYXRpb24gY3VydmVzIChzaGFkZWQgYXJlYSkuIFRoZSBzaGFkZWQgYXJlYSByZXByZXNlbnRzIHRoZSByYW5nZSBvZiBlZmZlY3RzIG9ic2VydmVkIGluIHRoZSBzaHVmZmxlZCBkYXRhc2V0cyAoYmV0d2VlbiB0aGUgMi41dGggYW5kIGFuZCA5Ny41dGggcGVyY2VudGlsZXMgb2YgdGhlIHJhbmtlZCBlc3RpbWF0ZXMpLiJ9DQoNCmEgPC0gcGxvdF9jdXJ2ZV9hb3YocmVzLmFvdi5ydC5hLCAiZXN0aW1hdGVfY29uZGl0aW9uLmJlaGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eTp0cmFpdC5hLm1zaGlnaCB0cmFpdCBhZ3JlZWFibGVuZXNzIiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdCAoaW4gbXMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDkwMDAsMTUwMCkpICsNCiAgIGdlb21fcmliYm9uKGRhdGE9Y29uZi5jdXJ2ZXNbWyJjb25mLmN1cnZlcy5hb3YucnQiXV1bWyJyZXN1bHRzLmFvdi5ydC5hIl1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLA0KICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGE9LjIsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmxhY2siKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gImJsYWNrIiksIHNpemUgPSAxKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJUcmFpdCBBZ3JlZWFibGVuZXNzIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIpDQoNCmIgPC0gcGxvdF9jdXJ2ZV9hb3YocmVzLmFvdi5ydC5oLCAiZXN0aW1hdGVfY29uZGl0aW9uLmJlaGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eTp0cmFpdC5oLm1zaGlnaCB0cmFpdCBob25lc3R5LWh1bWlsaXR5IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdCAoaW4gbXMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDkwMDAsMTUwMCkpICsNCiAgIGdlb21fcmliYm9uKGRhdGE9Y29uZi5jdXJ2ZXNbWyJjb25mLmN1cnZlcy5hb3YucnQiXV1bWyJyZXN1bHRzLmFvdi5ydC5oIl1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLCANCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgZ2d0aXRsZSgiVHJhaXQgSG9uZXN0eSB4IEJlaGF2aW9yIENvbmRpdGlvbnMiKSANCg0KDQpjIDwtIHBsb3RfY3VydmVfYW92KHJlcy5hb3YucnQuc2l0LCAiZXN0aW1hdGVfY29uZGl0aW9uLmJlaGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eTpjb25kaXRpb24uc2l0MiIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEYpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplPTAuNSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw5MDAwLDE1MDApKSArDQogICBnZW9tX3JpYmJvbihkYXRhPWNvbmYuY3VydmVzW1siY29uZi5jdXJ2ZXMuYW92LnJ0Il1dW1sicmVzdWx0cy5hb3YucnQuc2l0Il1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLCANCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgZ2d0aXRsZSgiU2l0dWF0aW9uIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIpIA0KDQpjb3dwbG90OjpwbG90X2dyaWQoYSxiLGMsIG5jb2w9MiwgIGxhYmVscz1jKCJBIiwiQiIsIkMiKSwgbGFiZWxfc2l6ZSA9IDEyLCBhbGlnbiA9ICJ2IiwgYXhpcyA9ICJyYmwiKQ0KDQpgYGANCg0KIyMjIyBFcnJvciBSYXRlIHstfQ0KDQpgYGB7ciBwZXJtLXBsb3QtYW92LWVyLCBldmFsPVQsIGZpZy53aWR0aD0xMSwgZmlnLmFzcD0wLjgsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1ULCBmaWcuY2FwPSJDb21wYXJpc29uIG9mIG9ic2VydmVkIChkZXNjcmlwdGl2ZSkgc3BlY2lmaWNhdGlvbiBjdXJ2ZXMgKGJsYWNrIGRvdHMpIGFuZCBleHBlY3RlZCB1bmRlci10aGUtbnVsbCBzcGVjaWZpY2F0aW9uIGN1cnZlcyAoc2hhZGVkIGFyZWEpLiBUaGUgc2hhZGVkIGFyZWEgcmVwcmVzZW50cyB0aGUgcmFuZ2Ugb2YgZWZmZWN0cyBvYnNlcnZlZCBpbiB0aGUgc2h1ZmZsZWQgZGF0YXNldHMgKGJldHdlZW4gdGhlIDIuNXRoIGFuZCBhbmQgOTcuNXRoIHBlcmNlbnRpbGVzIG9mIHRoZSByYW5rZWQgZXN0aW1hdGVzKS4ifQ0KDQphIDwtIHBsb3RfY3VydmVfYW92KHJlcy5hb3YuZXIuYSwgImVzdGltYXRlX2NvbmRpdGlvbi5iZWhoaWdoIGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHk6dHJhaXQuYS5tc2hpZ2ggdHJhaXQgYWdyZWVhYmxlbmVzcyIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEYpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplPTAuNSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwyNDAwLDUwMCkpICsNCiAgIGdlb21fcmliYm9uKGRhdGE9Y29uZi5jdXJ2ZXNbWyJjb25mLmN1cnZlcy5hb3YuZXIiXV1bWyJyZXN1bHRzLmFvdi5lci5hIl1dLCANCiAgICAgICAgICAgICAgIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmdW5jdGlvbih4KSB4ICogMTAwKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJUcmFpdCBBZ3JlZWFibGVuZXNzIHggQmVoYXZpb3IgQ29uZGl0aW9ucyIpDQoNCmIgPC0gcGxvdF9jdXJ2ZV9hb3YocmVzLmFvdi5lci5oLCAiZXN0aW1hdGVfY29uZGl0aW9uLmJlaGhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eTp0cmFpdC5oLm1zaGlnaCB0cmFpdCBob25lc3R5LWh1bWlsaXR5IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdCAoaW4gbXMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDI0MDAsNTAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLmFvdi5lciJdXVtbInJlc3VsdHMuYW92LmVyLmgiXV0sIA0KICAgICAgICAgICAgICAgbWFwcGluZz0oYWVzKHltaW49bG93LnBlcmMsIHltYXg9aGlnaC5wZXJjLCB4PXJhbmspKSwgDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmdW5jdGlvbih4KSB4ICogMTAwKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJUcmFpdCBIb25lc3R5IHggQmVoYXZpb3IgQ29uZGl0aW9ucyIpIA0KDQoNCmMgPC0gcGxvdF9jdXJ2ZV9hb3YocmVzLmFvdi5lci5zaXQsICJlc3RpbWF0ZV9jb25kaXRpb24uYmVoaGlnaCBhZ3JlZWFibGVuZXNzIGFuZCBob25lc3R5OmNvbmRpdGlvbi5zaXQyIiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdCAoaW4gbXMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDI0MDAsNTAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLmFvdi5lciJdXVtbInJlc3VsdHMuYW92LmVyLnNpdCJdXSwgDQogICAgICAgICAgICAgICBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLCANCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHggKiAxMDApICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIlNpdHVhdGlvbiB4IEJlaGF2aW9yIENvbmRpdGlvbnMiKSANCg0KY293cGxvdDo6cGxvdF9ncmlkKGEsYixjLCBuY29sPTIsICBsYWJlbHM9YygiQSIsIkIiLCJDIiksIGxhYmVsX3NpemUgPSAxMiwgYWxpZ24gPSAidiIsIGF4aXMgPSAicmJsIikNCg0KYGBgDQoNCiMjIFJlc3BvbnNlIFN1cmZhY2UgQW5hbHlzaXMgey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyMgRGVzY3JpcHRpdmUgU3BlY2lmaWNhdGlvbiBDdXJ2ZXMgey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyMjIFJlYWN0aW9uIFRpbWUgey19DQoNCmBgYHtyIGRlc2NyaXB0aXZlLXNwZWMtY3VydmVzLXJ0LCBldmFsPVQsIGZpZy53aWR0aD0xMSwgZmlnLmFzcD0yLjMsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1ULCBmaWcuY2FwPSJEZXNjcmlwdGl2ZSBzcGVjaWZpY2F0aW9uIGN1cnZlcyBvZiB0cmFpdC1zdGF0ZSBhbmQgc3RhdGUtc2l0dWF0aW9uIGludGVyYWN0aW9uIGNvZWZmaWNpZW50cyBwcmVkaWN0aW5nIFN0cm9vcCByZWFjdGlvbiB0aW1lcy4ifQ0KDQpsYWJlbHMucHJlID0gYygiY29uZGl0aW9uLmJlaCArIGNvbmRpdGlvbi5zaXQiLCANCiAgICAgICAgICAgICAgICJjb25kaXRpb24uYmVoICsgY29uZGl0aW9uLnNpdCArIHBvaW50cy5jIiwNCiAgICAgICAgICAgICAgICJjb25kaXRpb24uYmVoICsgY29uZGl0aW9uLnNpdCArIHBvaW50cy5jICsgcG9pbnRzLmRpZmYiLA0KICAgICAgICAgICAgICAgImNvbmRpdGlvbi5iZWggKyBjb25kaXRpb24uc2l0ICsgcG9pbnRzLmRpZmYiKQ0KbGFiZWxzLnBvc3QgPSBjKCJleHAuIGdyb3VwcyIsDQogICAgICAgICAgICAgICAgImV4cC4gZ3JvdXBzICsgcG9pbnRzIiwNCiAgICAgICAgICAgICAgICAiZXhwLiBncm91cHMgKyBwb2ludHMgKyBkaWZmIiwNCiAgICAgICAgICAgICAgICAiZXhwLiBncm91cHMgKyBkaWZmIikNCg0KcmVzLnJzYS5ydC5hIDwtIHJlcy5yc2EucnQuYSAlPiUNCiAgIG11dGF0ZShjb250cm9scyA9IGZhY3Rvcihjb250cm9scywgbGV2ZWxzPWxhYmVscy5wcmUsIGxhYmVscz1sYWJlbHMucG9zdCkpDQoNCnJlcy5yc2EucnQuaCA8LSByZXMucnNhLnJ0LmggJT4lIA0KICAgbXV0YXRlKGNvbnRyb2xzID0gZmFjdG9yKGNvbnRyb2xzLCBsZXZlbHM9bGFiZWxzLnByZSwgbGFiZWxzPWxhYmVscy5wb3N0KSkNCg0KcmVzLnJzYS5ydC5hLmFkdiA8LSByZXMucnNhLnJ0LmEuYWR2ICU+JSANCiAgIG11dGF0ZShjb250cm9scyA9IGZhY3Rvcihjb250cm9scywgbGV2ZWxzPWxhYmVscy5wcmUsIGxhYmVscz1sYWJlbHMucG9zdCkpDQoNCnJlcy5yc2EucnQuYS5kZWMgPC0gcmVzLnJzYS5ydC5hLmRlYyAlPiUNCiAgIG11dGF0ZShjb250cm9scyA9IGZhY3Rvcihjb250cm9scywgbGV2ZWxzPWxhYmVscy5wcmUsIGxhYmVscz1sYWJlbHMucG9zdCkpDQoNCnJlcy5yc2EucnQuaC5hZHYgPC0gcmVzLnJzYS5ydC5oLmFkdiAlPiUNCiAgIG11dGF0ZShjb250cm9scyA9IGZhY3Rvcihjb250cm9scywgbGV2ZWxzPWxhYmVscy5wcmUsIGxhYmVscz1sYWJlbHMucG9zdCkpDQoNCnJlcy5yc2EucnQuaC5kZWMgPC0gcmVzLnJzYS5ydC5oLmRlYyAlPiUNCiAgIG11dGF0ZShjb250cm9scyA9IGZhY3Rvcihjb250cm9scywgbGV2ZWxzPWxhYmVscy5wcmUsIGxhYmVscz1sYWJlbHMucG9zdCkpDQoNCg0KDQphIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EucnQuYSwgImVzdF9iNCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IFRSVUUpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsICBsaW5ldHlwZSA9ICJkYXNoZWQiLCAgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiVHJhaXQtU3RhdGUgQWdyZWVhYmxlbmVzcyIpICsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KYiA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLnJ0LmgsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBUUlVFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiVHJhaXQtU3RhdGUgSG9uZXN0eS1IdW1pbGl0eSIpICsNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxNTAwKSkgKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpjIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5ydC5hLCAiZXN0X2I0IiwgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJzdW1tYXJ5IiwgInRyaWFscyIsICJjb25kaXRpb25zIiwgImNvbnRyb2xzIikpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIpICsgdGhlbWVfcHViKCkgKw0KICAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdD0xKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9OSksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSwNCiAgICAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KC43NSwgImxpbmVzIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwxMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpkIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5ydC5oLCAiZXN0X2I0IiwgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJzdW1tYXJ5IiwgInRyaWFscyIsICJjb25kaXRpb25zIiwgImNvbnRyb2xzIikpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIpICsgdGhlbWVfcHViKCkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw5MDAwLDE1MDApKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdD0xKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9OSksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSwNCiAgICAgICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KC43NSwgImxpbmVzIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwxMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQplIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EucnQuYS5hZHYsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBUUlVFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiU3RhdGUgQWdyZWVhYmxlbmVzcy1BZHZlcnNpdHkiKSsNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxNTAwKSkgKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpmIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EucnQuaC5hZHYsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBUUlVFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiU3RhdGUgSG9uZXN0eS1BZHZlcnNpdHkiKSsNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxNTAwKSkgKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpnIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5ydC5hLmFkdiwgImVzdF9iNCIsIGNob2ljZXMgPSBjKCJpZGVudGlmaWNhdGlvbiIsICJ0cmVhdG1lbnQiLCAic3VtbWFyeSIsICJ0cmlhbHMiLCAiY29uZGl0aW9ucyIsICJjb250cm9scyIpKSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiKSArIHRoZW1lX3B1YigpICsNCiAgIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxNTAwKSkgKw0KICAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgaGp1c3Q9MSksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTkpLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIiksDQogICAgICAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCguNzUsICJsaW5lcyIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KaCA8LSBwbG90X2Nob2ljZXNfcnNhKHJlcy5yc2EucnQuaC5hZHYsICJlc3RfYjQiLCBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiwgInN1bW1hcnkiLCAidHJpYWxzIiwgImNvbmRpdGlvbnMiLCAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDkwMDAsMTUwMCkpICsNCiAgIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgaGp1c3Q9MSksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTkpLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIiksDQogICAgICAgICBwYW5lbC5zcGFjaW5nID0gdW5pdCguNzUsICJsaW5lcyIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KDQppIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EucnQuYS5kZWMsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBUUlVFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiU3RhdGUgQWdyZWVhYmxlbmVzcy1EZWNlcHRpb24iKSsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KaiA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLnJ0LmguZGVjLCAiZXN0X2I0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gVFJVRSkgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICAgbGFicyh4ID0gIiIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0IChpbiBtcykiKSArDQogICB0aGVtZV9wdWIoKSArIGdndGl0bGUoIlN0YXRlIEhvbmVzdHktRGVjZXB0aW9uIikrDQogICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDkwMDAsMTUwMCkpICsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KayA8LSBwbG90X2Nob2ljZXNfcnNhKHJlcy5yc2EucnQuYS5kZWMsICJlc3RfYjQiLCBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiwgInN1bW1hcnkiLCAidHJpYWxzIiwgImNvbmRpdGlvbnMiLCAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0PTEpLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpLA0KICAgICAgICAgcGFuZWwuc3BhY2luZyA9IHVuaXQoLjc1LCAibGluZXMiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDEwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmwgPC0gcGxvdF9jaG9pY2VzX3JzYShyZXMucnNhLnJ0LmguZGVjLCAiZXN0X2I0IiwgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJzdW1tYXJ5IiwgInRyaWFscyIsICJjb25kaXRpb25zIiwgImNvbnRyb2xzIikpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIpICsgdGhlbWVfcHViKCkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw5MDAwLDE1MDApKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0PTEpLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpLA0KICAgICAgICAgcGFuZWwuc3BhY2luZyA9IHVuaXQoLjc1LCAibGluZXMiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDEwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCg0KIyMgY29tYmluZSBwbG90cw0KY293cGxvdDo6cGxvdF9ncmlkKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLCBuY29sPTIsIGxhYmVscz1jKCJBIiwiQiIsIiIsIiIsIkMiLCJEIiwiIiwiIiwiRSIsIkYiLCIiLCIiKSwgDQogICAgICAgICAgICAgICAgICAgbGFiZWxfc2l6ZSA9IDEwLCBhbGlnbiA9ICJ2IiwgYXhpcyA9ICJyYmwiLCByZWxfaGVpZ2h0cyA9IGMoMSwyLDEsMiwxLDIpKQ0KDQpgYGANCg0KYGBge3IgZGVzY3JpcHRpdmUtc3BlYy1jdXJ2ZXMtZml0LXJ0LCBldmFsPVQsIGZpZy53aWR0aD0xMSwgZmlnLmFzcD0yLjMsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1ULCBmaWcuY2FwPSJEZXNjcmlwdGl2ZSBzcGVjaWZpY2F0aW9uIGN1cnZlcyBvZiB0cmFpdC1zdGF0ZSBjb25ncnVlbmNlIGFuZCBzdGF0ZS1zaXR1YXRpb24gY29uZ3J1ZW5jZSBwcmVkaWN0aW5nIFN0cm9vcCByZWFjdGlvbiB0aW1lcy4ifQ0KDQphIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EucnQuYSwgImZpdCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEZBTFNFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgIGNvbG9yID0gImJsYWNrIikgKw0KICAgbGFicyh4ID0gIiIsIHkgPSAiZml0IHBhdHRlcm4iKSArDQogICBzY2FsZV95X2Rpc2NyZXRlKGJyZWFrcz1jKEZBTFNFLCBUUlVFKSwgbGltaXRzPWMoRkFMU0UsIFRSVUUpKSArDQogICB0aGVtZV9wdWIoKSArIGdndGl0bGUoIlRyYWl0LVN0YXRlIEFncmVlYWJsZW5lc3MiKSArDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDIwLDAsLTIwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmIgPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5ydC5oLCAiZml0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRkFMU0UpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgIGxhYnMoeCA9ICIiLCB5ID0gImZpdCBwYXR0ZXJuIikgKw0KICAgc2NhbGVfeV9kaXNjcmV0ZShicmVha3M9YyhGQUxTRSwgVFJVRSksIGxpbWl0cz1jKEZBTFNFLCBUUlVFKSkgKw0KICAgdGhlbWVfcHViKCkgKyBnZ3RpdGxlKCJUcmFpdC1TdGF0ZSBIb25lc3R5LUh1bWlsaXR5IikgKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpjIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5ydC5hLCAiZml0IiwgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJzdW1tYXJ5IiwgInRyaWFscyIsICJjb25kaXRpb25zIikpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIpICsgdGhlbWVfcHViKCkgKw0KICAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9OSksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDEwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmQgPC0gcGxvdF9jaG9pY2VzX3JzYShyZXMucnNhLnJ0LmgsICJmaXQiLCBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiwgInN1bW1hcnkiLCAidHJpYWxzIiwgImNvbmRpdGlvbnMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9OSksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDEwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmUgPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5ydC5hLmFkdiwgImZpdCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEZBTFNFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJmaXQgcGF0dGVybiIpICsNCiAgIHNjYWxlX3lfZGlzY3JldGUoYnJlYWtzPWMoRkFMU0UsIFRSVUUpLCBsaW1pdHM9YyhGQUxTRSwgVFJVRSkpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiU3RhdGUgQWdyZWVhYmxlbmVzcy1BZHZlcnNpdHkiKSsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KZiA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLnJ0LmguYWR2LCAiZml0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRkFMU0UpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgIGxhYnMoeCA9ICIiLCB5ID0gImZpdCBwYXR0ZXJuIikgKw0KICAgc2NhbGVfeV9kaXNjcmV0ZShicmVha3M9YyhGQUxTRSwgVFJVRSksIGxpbWl0cz1jKEZBTFNFLCBUUlVFKSkgKw0KICAgdGhlbWVfcHViKCkgKyBnZ3RpdGxlKCJTdGF0ZSBIb25lc3R5LUFkdmVyc2l0eSIpKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpnIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5ydC5hLmFkdiwgImZpdCIsIGNob2ljZXMgPSBjKCJpZGVudGlmaWNhdGlvbiIsICJ0cmVhdG1lbnQiLCAic3VtbWFyeSIsICJ0cmlhbHMiLCAiY29uZGl0aW9ucyIsICJjb250cm9scyIpKSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiKSArIHRoZW1lX3B1YigpICsNCiAgIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KaCA8LSBwbG90X2Nob2ljZXNfcnNhKHJlcy5yc2EucnQuaC5hZHYsICJmaXQiLCBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiwgInN1bW1hcnkiLCAidHJpYWxzIiwgImNvbmRpdGlvbnMiLCAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KDQppIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EucnQuYS5kZWMsICJmaXQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGQUxTRSkgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICAgbGFicyh4ID0gIiIsIHkgPSAiZml0IHBhdHRlcm4iKSArDQogICBzY2FsZV95X2Rpc2NyZXRlKGJyZWFrcz1jKEZBTFNFLCBUUlVFKSwgbGltaXRzPWMoRkFMU0UsIFRSVUUpKSArDQogICB0aGVtZV9wdWIoKSArIGdndGl0bGUoIlN0YXRlIEFncmVlYWJsZW5lc3MtRGVjZXB0aW9uIikrDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDIwLDAsLTIwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmogPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5ydC5oLmRlYywgImZpdCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEZBTFNFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJmaXQgcGF0dGVybiIpICsNCiAgIHNjYWxlX3lfZGlzY3JldGUoYnJlYWtzPWMoRkFMU0UsIFRSVUUpLCBsaW1pdHM9YyhGQUxTRSwgVFJVRSkpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiU3RhdGUgSG9uZXN0eS1EZWNlcHRpb24iKSsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KayA8LSBwbG90X2Nob2ljZXNfcnNhKHJlcy5yc2EucnQuYS5kZWMsICJmaXQiLCBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiwgInN1bW1hcnkiLCAidHJpYWxzIiwgImNvbmRpdGlvbnMiLCAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KbCA8LSBwbG90X2Nob2ljZXNfcnNhKHJlcy5yc2EucnQuaC5kZWMsICJmaXQiLCBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiwgInN1bW1hcnkiLCAidHJpYWxzIiwgImNvbmRpdGlvbnMiLCAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KDQojIyBjb21iaW5lIHBsb3RzDQpjb3dwbG90OjpwbG90X2dyaWQoYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsIG5jb2w9MiwgbGFiZWxzPWMoIkEiLCJCIiwiIiwiIiwiQyIsIkQiLCIiLCIiLCJFIiwiRiIsIiIsIiIpLCBsYWJlbF9zaXplID0gMTAsIGFsaWduID0gInYiLCBheGlzID0gInJibCIsIHJlbF9oZWlnaHRzID0gYygxLCAxLjgsMSwxLjgsMSwxLjgpKQ0KDQpgYGANCg0KIyMjIyBFcnJvciBSYXRlIHstfQ0KDQpgYGB7ciBkZXNjcmlwdGl2ZS1zcGVjLWN1cnZlcy1lcnJvciwgZXZhbD1ULCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9Miwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGNhY2hlPVQsIGZpZy5jYXA9IkRlc2NyaXB0aXZlIHNwZWNpZmljYXRpb24gY3VydmVzIG9mIHRyYWl0LXN0YXRlIGFuZCBzdGF0ZS1zaXR1YXRpb24gaW50ZXJhY3Rpb24gY29lZmZpY2llbnRzIHByZWRpY3RpbmcgU3Ryb29wIGVycm9yIHJhdGVzLiJ9DQoNCnJlcy5yc2EuZXIuYSA8LSByZXMucnNhLmVyLmEgJT4lIA0KICAgbXV0YXRlKGNvbnRyb2xzID0gZmFjdG9yKGNvbnRyb2xzLCBsZXZlbHM9bGFiZWxzLnByZSwgbGFiZWxzPWxhYmVscy5wb3N0KSkNCg0KcmVzLnJzYS5lci5oIDwtIHJlcy5yc2EuZXIuaCAlPiUgDQogICBtdXRhdGUoY29udHJvbHMgPSBmYWN0b3IoY29udHJvbHMsIGxldmVscz1sYWJlbHMucHJlLCBsYWJlbHM9bGFiZWxzLnBvc3QpKQ0KDQpyZXMucnNhLmVyLmEuYWR2IDwtIHJlcy5yc2EuZXIuYS5hZHYgJT4lIA0KICAgbXV0YXRlKGNvbnRyb2xzID0gZmFjdG9yKGNvbnRyb2xzLCBsZXZlbHM9bGFiZWxzLnByZSwgbGFiZWxzPWxhYmVscy5wb3N0KSkNCg0KcmVzLnJzYS5lci5hLmRlYyA8LSByZXMucnNhLmVyLmEuZGVjICU+JSANCiAgIG11dGF0ZShjb250cm9scyA9IGZhY3Rvcihjb250cm9scywgbGV2ZWxzPWxhYmVscy5wcmUsIGxhYmVscz1sYWJlbHMucG9zdCkpDQoNCnJlcy5yc2EuZXIuaC5hZHYgPC0gcmVzLnJzYS5lci5oLmFkdiAlPiUgDQogICBtdXRhdGUoY29udHJvbHMgPSBmYWN0b3IoY29udHJvbHMsIGxldmVscz1sYWJlbHMucHJlLCBsYWJlbHM9bGFiZWxzLnBvc3QpKQ0KDQpyZXMucnNhLmVyLmguZGVjIDwtIHJlcy5yc2EuZXIuaC5kZWMgJT4lIA0KICAgbXV0YXRlKGNvbnRyb2xzID0gZmFjdG9yKGNvbnRyb2xzLCBsZXZlbHM9bGFiZWxzLnByZSwgbGFiZWxzPWxhYmVscy5wb3N0KSkNCg0KYSA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLmVyLmEsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBUKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgIGNvbG9yID0gImJsYWNrIikgKw0KICAgbGFicyh4ID0gIiIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0XG4oaW4gJSBvZiBlcnJvcnMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBnZ3RpdGxlKCJUcmFpdC1TdGF0ZSBBZ3JlZWFibGVuZXNzIikgKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgeCAqIDEwMCkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KYiA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLmVyLmgsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBUUlVFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3RcbihpbiAlIG9mIGVycm9ycykiKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgeCAqIDEwMCkgKw0KICAgdGhlbWVfcHViKCkgKyBnZ3RpdGxlKCJUcmFpdC1TdGF0ZSBIb25lc3R5LUh1bWlsaXR5IikgKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpjIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5lci5hLCAiZXN0X2I0IiwgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJjb25kaXRpb25zIiwiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdD0xKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwxMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpkIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5lci5oLCAiZXN0X2I0IiwgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJjb25kaXRpb25zIiwiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdD0xKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwxMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQplIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EuZXIuYS5hZHYsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBUUlVFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3RcbihpbiAlIG9mIGVycm9ycykiKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgeCAqIDEwMCkgKw0KICAgdGhlbWVfcHViKCkgKyBnZ3RpdGxlKCJTdGF0ZSBBZ3JlZWFibGVuZXNzLUFkdmVyc2l0eSIpKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpmIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EuZXIuaC5hZHYsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBUUlVFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgeCAqIDEwMCkgKw0KICAgbGFicyh4ID0gIiIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0XG4oaW4gJSBvZiBlcnJvcnMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBnZ3RpdGxlKCJTdGF0ZSBIb25lc3R5LUFkdmVyc2l0eSIpKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpnIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5lci5hLmFkdiwgImVzdF9iNCIsIGNob2ljZXMgPSBjKCJpZGVudGlmaWNhdGlvbiIsICJ0cmVhdG1lbnQiLCAiY29uZGl0aW9ucyIsICJjb250cm9scyIpKSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiKSArIHRoZW1lX3B1YigpICsNCiAgIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0PTEpLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDEwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmggPC0gcGxvdF9jaG9pY2VzX3JzYShyZXMucnNhLmVyLmguYWR2LCAiZXN0X2I0IiwgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJjb25kaXRpb25zIiwgImNvbnRyb2xzIikpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIpICsgdGhlbWVfcHViKCkgKw0KICAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgaGp1c3Q9MSksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KaSA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLmVyLmEuZGVjLCAiZXN0X2I0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gVFJVRSkgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHggKiAxMDApICsNCiAgIGxhYnMoeCA9ICIiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdFxuKGluICUgb2YgZXJyb3JzKSIpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiU3RhdGUgQWdyZWVhYmxlbmVzcy1EZWNlcHRpb24iKSsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KaiA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLmVyLmguZGVjLCAiZXN0X2I0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gVFJVRSkgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICAgbGFicyh4ID0gIiIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0XG4oaW4gJSBvZiBlcnJvcnMpIikgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHggKiAxMDApICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiU3RhdGUgSG9uZXN0eS1EZWNlcHRpb24iKSsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KayA8LSBwbG90X2Nob2ljZXNfcnNhKHJlcy5yc2EuZXIuYS5kZWMsICJlc3RfYjQiLCBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiwgImNvbmRpdGlvbnMiLCAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBoanVzdD0xKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwxMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpsIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5lci5oLmRlYywgImVzdF9iNCIsIGNob2ljZXMgPSBjKCJpZGVudGlmaWNhdGlvbiIsICJ0cmVhdG1lbnQiLCAiY29uZGl0aW9ucyIsICJjb250cm9scyIpKSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiKSArIHRoZW1lX3B1YigpICsNCiAgIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0PTEpLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDEwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCg0KIyMgY29tYmluZSBwbG90cw0KY293cGxvdDo6cGxvdF9ncmlkKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLCBuY29sPTIsIGxhYmVscz1jKCJBIiwiQiIsIiIsIiIsIkMiLCJEIiwiIiwiIiwiRSIsIkYiLCIiLCIiKSwgbGFiZWxfc2l6ZSA9IDEyLCBhbGlnbiA9ICJ2IiwgYXhpcyA9ICJyYmwiLCByZWxfaGVpZ2h0cyA9IGMoMSwgMS42LDEsMS42LDEsMS42KSkNCg0KYGBgDQoNCmBgYHtyIGRlc2NyaXB0aXZlLXNwZWMtY3VydmVzLWZpdC1lcnJvciwgZXZhbD1ULCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9Mi4zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9VCwgZmlnLmNhcD0iRGVzY3JpcHRpdmUgc3BlY2lmaWNhdGlvbiBjdXJ2ZXMgb2YgdHJhaXQtc3RhdGUgY29uZ3J1ZW5jZSBhbmQgc3RhdGUtc2l0dWF0aW9uIGNvbmdydWVuY2UgcHJlZGljdGluZyBTdHJvb3AgZXJyb3IgcmF0ZXMuIn0NCg0KYSA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLmVyLmEsICJmaXQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGQUxTRSkgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgIGxpbmV0eXBlID0gImRhc2hlZCIsICBjb2xvciA9ICJibGFjayIpICsNCiAgIGxhYnMoeCA9ICIiLCB5ID0gImZpdCBwYXR0ZXJuIikgKw0KICAgc2NhbGVfeV9kaXNjcmV0ZShicmVha3M9YyhGQUxTRSwgVFJVRSksIGxpbWl0cz1jKEZBTFNFLCBUUlVFKSkgKw0KICAgdGhlbWVfcHViKCkgKyBnZ3RpdGxlKCJUcmFpdC1TdGF0ZSBBZ3JlZWFibGVuZXNzIikgKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpiIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EuZXIuaCwgImZpdCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEZBTFNFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJmaXQgcGF0dGVybiIpICsNCiAgIHNjYWxlX3lfZGlzY3JldGUoYnJlYWtzPWMoRkFMU0UsIFRSVUUpLCBsaW1pdHM9YyhGQUxTRSwgVFJVRSkpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiVHJhaXQtU3RhdGUgSG9uZXN0eS1IdW1pbGl0eSIpICsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KYyA8LSBwbG90X2Nob2ljZXNfcnNhKHJlcy5yc2EuZXIuYSwgImZpdCIsIGNob2ljZXMgPSBjKCJpZGVudGlmaWNhdGlvbiIsICJ0cmVhdG1lbnQiLCAiY29uZGl0aW9ucyIsICAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9OSksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDEwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmQgPC0gcGxvdF9jaG9pY2VzX3JzYShyZXMucnNhLmVyLmgsICJmaXQiLCBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiwiY29uZGl0aW9ucyIsICAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9OSksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDEwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmUgPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5lci5hLmFkdiwgImZpdCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEZBTFNFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJmaXQgcGF0dGVybiIpICsNCiAgIHNjYWxlX3lfZGlzY3JldGUoYnJlYWtzPWMoRkFMU0UsIFRSVUUpLCBsaW1pdHM9YyhGQUxTRSwgVFJVRSkpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiU3RhdGUgQWdyZWVhYmxlbmVzcy1BZHZlcnNpdHkiKSsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KZiA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLmVyLmguYWR2LCAiZml0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRkFMU0UpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsICBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgIGxhYnMoeCA9ICIiLCB5ID0gImZpdCBwYXR0ZXJuIikgKw0KICAgc2NhbGVfeV9kaXNjcmV0ZShicmVha3M9YyhGQUxTRSwgVFJVRSksIGxpbWl0cz1jKEZBTFNFLCBUUlVFKSkgKw0KICAgdGhlbWVfcHViKCkgKyBnZ3RpdGxlKCJTdGF0ZSBIb25lc3R5LUFkdmVyc2l0eSIpKw0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygyMCwwLC0yMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpnIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5lci5hLmFkdiwgImZpdCIsIGNob2ljZXMgPSBjKCJpZGVudGlmaWNhdGlvbiIsICJ0cmVhdG1lbnQiLCJjb25kaXRpb25zIiwgImNvbnRyb2xzIikpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIpICsgdGhlbWVfcHViKCkgKw0KICAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpKSArIA0KICAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTkpLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwxMCwtMTApLCAicHQiKSkgI3RvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdA0KDQpoIDwtIHBsb3RfY2hvaWNlc19yc2EocmVzLnJzYS5lci5oLmFkdiwgImZpdCIsIGNob2ljZXMgPSBjKCJpZGVudGlmaWNhdGlvbiIsICJ0cmVhdG1lbnQiLCJjb25kaXRpb25zIiwgICJjb250cm9scyIpKSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiKSArIHRoZW1lX3B1YigpICsNCiAgIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KDQppIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EuZXIuYS5kZWMsICJmaXQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGQUxTRSkgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICAgbGFicyh4ID0gIiIsIHkgPSAiZml0IHBhdHRlcm4iKSArDQogICBzY2FsZV95X2Rpc2NyZXRlKGJyZWFrcz1jKEZBTFNFLCBUUlVFKSwgbGltaXRzPWMoRkFMU0UsIFRSVUUpKSArDQogICB0aGVtZV9wdWIoKSArIGdndGl0bGUoIlN0YXRlIEFncmVlYWJsZW5lc3MtRGVjZXB0aW9uIikrDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsNCiAgIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDIwLDAsLTIwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmogPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5lci5oLmRlYywgImZpdCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEZBTFNFKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiYmxhY2siKSArDQogICBsYWJzKHggPSAiIiwgeSA9ICJmaXQgcGF0dGVybiIpICsNCiAgIHNjYWxlX3lfZGlzY3JldGUoYnJlYWtzPWMoRkFMU0UsIFRSVUUpLCBsaW1pdHM9YyhGQUxTRSwgVFJVRSkpICsNCiAgIHRoZW1lX3B1YigpICsgZ2d0aXRsZSgiU3RhdGUgSG9uZXN0eS1EZWNlcHRpb24iKSsNCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMjAsMCwtMjAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KayA8LSBwbG90X2Nob2ljZXNfcnNhKHJlcy5yc2EuZXIuYS5kZWMsICJmaXQiLCBjaG9pY2VzID0gYygiaWRlbnRpZmljYXRpb24iLCAidHJlYXRtZW50IiwgImNvbmRpdGlvbnMiLCAiY29udHJvbHMiKSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIikgKyB0aGVtZV9wdWIoKSArDQogICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgDQogICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwNCiAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9OSksDQogICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKw0KICAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMCwwLDEwLC0xMCksICJwdCIpKSAjdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0DQoNCmwgPC0gcGxvdF9jaG9pY2VzX3JzYShyZXMucnNhLmVyLmguZGVjLCAiZml0IiwgY2hvaWNlcyA9IGMoImlkZW50aWZpY2F0aW9uIiwgInRyZWF0bWVudCIsICJjb25kaXRpb25zIiwgICJjb250cm9scyIpKSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiKSArIHRoZW1lX3B1YigpICsNCiAgIHRoZW1lKHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyANCiAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemU9MTApLA0KICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZT05KSwNCiAgICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArDQogICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLDAsMTAsLTEwKSwgInB0IikpICN0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQNCg0KDQojIyBjb21iaW5lIHBsb3RzDQpjb3dwbG90OjpwbG90X2dyaWQoYSxiLGMsZCxlLGYsZyxoLGksaixrLGwsIG5jb2w9MiwgbGFiZWxzPWMoIkEiLCJCIiwiIiwiIiwiQyIsIkQiLCIiLCIiLCJFIiwiRiIsIiIsIiIpLCBsYWJlbF9zaXplID0gMTAsIGFsaWduID0gInYiLCBheGlzID0gInJibCIsIHJlbF9oZWlnaHRzID0gYygxLCAxLjYsMSwxLjYsMSwxLjYpKQ0KDQpgYGANCg0KIyMjIFBlcm11dGF0aW9uIFRlc3Qgey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyMjIFJlYWN0aW9uIFRpbWUgey19DQoNCmBgYHtyIHBlcm0tdGFiLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9VH0NCg0KIyMgY3JlYXRlIHRhYmxlDQp0YWIgPC0gZGF0YS5mcmFtZShjb25ncnVlbmNlLm9wPWMocmVwKCJJbnRlcmFjdGlvbiIsNiksIHJlcCgiRml0IHBhdHRlcm4iLDYpKSwNCiAgICAgICAgICAgICAgICAgIHByZWRpY3Rvcj1yZXAoYygiVHJhaXQgQSB4IFN0YXRlIEEiLCAiVHJhaXQgSEggeCBTdGF0ZSBISCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhdGUgQSB4IEFkdmVyc2l0eSIsICJTdGF0ZSBBIHggRGVjZXB0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGF0ZSBISCB4IEFkdmVyc2l0eSIsICJTdGF0ZSBISCB4IERlY2VwdGlvbiIpLDIpLA0KICAgICAgICAgICAgICAgICAgbi5zcGVjcyA9IE5BLA0KICAgICAgICAgICAgICAgICAgbWVkLmVmZmVjdCA9IE5BLA0KICAgICAgICAgICAgICAgICAgcGVyYy5zaWcgPSBOQSwNCiAgICAgICAgICAgICAgICAgIG4uc2h1ZmYgPSBOQSwNCiAgICAgICAgICAgICAgICAgIHAudmFsID0gTkEpDQoNCiMjIGZpbGwgdGFibGUNCnRhYlssMzo3XSA8LSByZXMucnNhLnJ0WywyOjZdDQoNCg0KIyMgZm9ybWF0IHRhYmxlDQp0YWIkcC52YWwgPC0gcHJpbnRwKHRhYiRwLnZhbCkNCnRhYiRtZWQuZWZmZWN0W2MoNzoxMildIDwtIGlmZWxzZSh0YWIkbWVkLmVmZmVjdFtjKDc6MTIpXT09MCwgIm5vIiwgInllcyIpDQp0YWIkcGVyYy5zaWcgPC0gaWZlbHNlKGlzLm5hKHRhYiRwZXJjLnNpZyksTkEscGFzdGUwKHJvdW5kKHRhYiRwZXJjLnNpZyoxMDAvdGFiJG4uc3BlY3MsMCksIiUiKSkNCg0KDQoNCiMjIHByaW50IHRhYmxlDQprYWJsZSh0YWIsDQogICAgICBhbGlnbiA9IGMoImwiLCAibCIsICJyIiwgInIiLCAiciIsICJyIiwgInIiKSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoIk9wZXJhdGlvbmFsaXphdGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICAiUmVsZXZhbnQgcHJlZGljdG9yIiwgIk51bWJlciBvZiBzcGVjaWZpY2F0aW9ucyIsIA0KICAgICAgICAgICAgICAgICAgICAiTWVkaWFuIGVmZmVjdCBzaXplIiwgICJTaWduaWZpY2FudCBzcGVjaWZpY2F0aW9ucyAoJSkiLCANCiAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBzaHVmZmxlZCBzYW1wbGVzIHdpdGggbW9yZSBzaWduaWZpY2FudCANCiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgdGhhbiBmb3IgdGhlIG9yaWdpbmFsIHNhbXBsZSIsICI8aT5wPC9pPiB2YWx1ZSBvZiBwZXJtdXRhdGlvbiB0ZXN0IikpICU+JSANCiAgIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAyLCANCiAgICAgICAgICAgICAgICAgICAgICAiRGVzY3JpcHRpb24gb2Ygc3BlY2lmaWNhdGlvbiBjdXJ2ZSAoZm9yIG9yaWdpbmFsIHNhbXBsZSkiID0gMywgDQogICAgICAgICAgICAgICAgICAgICAgIlBlcm11dGF0aW9uIHRlc3Qgd2l0aCA1MDAgc2h1ZmZsZWQgc2FtcGxlcyIgPSAyKSkgJT4lIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSANCg0KYGBgDQoNCiMjIyMgRXJyb3IgUmF0ZSB7LX0NCg0KYGBge3IgcGVybS10YWItZXIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1UfQ0KDQojIyBjcmVhdGUgdGFibGUNCnRhYiA8LSBkYXRhLmZyYW1lKGNvbmdydWVuY2Uub3A9YyhyZXAoIkludGVyYWN0aW9uIiw2KSwgcmVwKCJGaXQgcGF0dGVybiIsNikpLA0KICAgICAgICAgICAgICAgICAgcHJlZGljdG9yPXJlcChjKCJUcmFpdCBBIHggU3RhdGUgQSIsICJUcmFpdCBISCB4IFN0YXRlIEhIIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGF0ZSBBIHggQWR2ZXJzaXR5IiwgIlN0YXRlIEEgeCBEZWNlcHRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXRlIEhIIHggQWR2ZXJzaXR5IiwgIlN0YXRlIEhIIHggRGVjZXB0aW9uIiksMiksDQogICAgICAgICAgICAgICAgICBuLnNwZWNzID0gTkEsDQogICAgICAgICAgICAgICAgICBtZWQuZWZmZWN0ID0gTkEsDQogICAgICAgICAgICAgICAgICBwZXJjLnNpZyA9IE5BLA0KICAgICAgICAgICAgICAgICAgbi5zaHVmZiA9IE5BLA0KICAgICAgICAgICAgICAgICAgcC52YWwgPSBOQSkNCg0KIyMgZmlsbCB0YWJsZQ0KdGFiWywzOjddIDwtIHJlcy5yc2EuZXJyb3JbLDI6Nl0NCg0KDQoNCiMjIGZvcm1hdCB0YWJsZQ0KdGFiJHAudmFsIDwtIHByaW50cCh0YWIkcC52YWwpDQp0YWIkbWVkLmVmZmVjdFtjKDc6MTIpXSA8LSBpZmVsc2UodGFiJG1lZC5lZmZlY3RbYyg3OjEyKV09PTAsICJubyIsICJ5ZXMiKQ0KdGFiJHBlcmMuc2lnIDwtIGlmZWxzZShpcy5uYSh0YWIkcGVyYy5zaWcpLE5BLHBhc3RlMChyb3VuZCh0YWIkcGVyYy5zaWcqMTAwL3RhYiRuLnNwZWNzLDApLCIlIikpDQoNCg0KDQojIyBwcmludCB0YWJsZQ0Ka2FibGUodGFiLA0KICAgICAgYWxpZ24gPSBjKCJsIiwgImwiLCAiciIsICJyIiwgInIiLCAiciIsICJyIiksDQogICAgICBjb2wubmFtZXMgPSBjKCJPcGVyYXRpb25hbGl6YXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgIlJlbGV2YW50IHByZWRpY3RvciIsICJOdW1iZXIgb2Ygc3BlY2lmaWNhdGlvbnMiLCAiTWVkaWFuIGVmZmVjdCBzaXplIiwgDQogICAgICAgICAgICAgICAgICAgICJTaWduaWZpY2FudCBzcGVjaWZpY2F0aW9ucyAoJSkiLCAiTnVtYmVyIG9mIHNodWZmbGVkIHNhbXBsZXMgd2l0aCBtb3JlIHNpZ25pZmljYW50IA0KICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9ucyB0aGFuIGZvciB0aGUgb3JpZ2luYWwgc2FtcGxlIiwgIjxpPnA8L2k+IHZhbHVlIG9mIHBlcm11dGF0aW9uIHRlc3QiKSkgJT4lIA0KICAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDIsIA0KICAgICAgICAgICAgICAgICAgICAgICJEZXNjcmlwdGlvbiBvZiBzcGVjaWZpY2F0aW9uIGN1cnZlIChmb3Igb3JpZ2luYWwgc2FtcGxlKSIgPSAzLCANCiAgICAgICAgICAgICAgICAgICAgICAiUGVybXV0YXRpb24gdGVzdCB3aXRoIDUwMCBzaHVmZmxlZCBzYW1wbGVzIiA9IDIpKSAlPiUgDQogICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmaXhlZF90aGVhZCA9IFQpIA0KDQpgYGANCg0KIyMjIEluZmVyZW50aWFsIFNwZWNpZmljYXRpb24gQ3VydmVzIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KIyMjIyBSZWFjdGlvbiBUaW1lIHstfQ0KDQpgYGB7ciBwZXJtLXJzYS1ydCwgZXZhbD1ULCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9MS4yLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9VCwgZmlnLmNhcD0iQ29tcGFyaXNvbiBvZiBvYnNlcnZlZCAoZGVzY3JpcHRpdmUpIHNwZWNpZmljYXRpb24gY3VydmVzIChibGFjayBkb3RzKSBhbmQgZXhwZWN0ZWQgdW5kZXItdGhlLW51bGwgc3BlY2lmaWNhdGlvbiBjdXJ2ZXMgKHNoYWRlZCBhcmVhKS4gVGhlIHNoYWRlZCBhcmVhIHJlcHJlc2VudHMgdGhlIHJhbmdlIG9mIGVmZmVjdHMgb2JzZXJ2ZWQgaW4gdGhlIHNodWZmbGVkIGRhdGFzZXRzIChiZXR3ZWVuIHRoZSAyLjV0aCBhbmQgYW5kIDk3LjV0aCBwZXJjZW50aWxlcyBvZiB0aGUgcmFua2VkIGVzdGltYXRlcykuIn0NCg0KYSA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLnJ0LmEsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0IChpbiBtcykiKSArDQogICB0aGVtZV9wdWIoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxNTAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLnJzYS5ydCJdXVtbInN0YXRlLnRyYWl0LmEucnQiXV0sIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIlRyYWl0LVN0YXRlIEFncmVlYWJsZW5lc3MiKQ0KDQpiIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EucnQuaCwgImVzdF9iNCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEYpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplPTAuNSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw5MDAwLDE1MDApKSArDQogICBnZW9tX3JpYmJvbihkYXRhPWNvbmYuY3VydmVzW1siY29uZi5jdXJ2ZXMucnNhLnJ0Il1dW1sic3RhdGUudHJhaXQuaC5ydCJdXSwgbWFwcGluZz0oYWVzKHltaW49bG93LnBlcmMsIHltYXg9aGlnaC5wZXJjLCB4PXJhbmspKSwgDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIlRyYWl0LVN0YXRlIEhvbmVzdHktSHVtaWxpdHkiKSANCg0KDQpjIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EucnQuYS5hZHYsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0IChpbiBtcykiKSArDQogICB0aGVtZV9wdWIoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxNTAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLnJzYS5ydCJdXVtbInN0YXRlLmEuYWR2LnJ0Il1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLCANCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgZ2d0aXRsZSgiU3RhdGUgQWdyZWVhYmxlbmVzcy1BZHZlcnNpdHkiKSANCg0KZCA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLnJ0LmguYWR2LCAiZXN0X2I0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdCAoaW4gbXMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDkwMDAsMTUwMCkpICsNCiAgIGdlb21fcmliYm9uKGRhdGE9Y29uZi5jdXJ2ZXNbWyJjb25mLmN1cnZlcy5yc2EucnQiXV1bWyJzdGF0ZS5oLmFkdi5ydCJdXSwgbWFwcGluZz0oYWVzKHltaW49bG93LnBlcmMsIHltYXg9aGlnaC5wZXJjLCB4PXJhbmspKSwNCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgZ2d0aXRsZSgiU3RhdGUgSG9uZXN0eS1BZHZlcnNpdHkiKQ0KDQplIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EucnQuYS5kZWMsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0IChpbiBtcykiKSArDQogICB0aGVtZV9wdWIoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxNTAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLnJzYS5ydCJdXVtbInN0YXRlLmEuZGVjLnJ0Il1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLA0KICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGE9LjIsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmxhY2siKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gImJsYWNrIiksIHNpemUgPSAxKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJTdGF0ZSBBZ3JlZWFibGVuZXNzLURlY2VwdGlvbiIpDQoNCmYgPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5ydC5oLmRlYywgImVzdF9iNCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEYpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplPTAuNSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw5MDAwLDE1MDApKSArDQogICBnZW9tX3JpYmJvbihkYXRhPWNvbmYuY3VydmVzW1siY29uZi5jdXJ2ZXMucnNhLnJ0Il1dW1sic3RhdGUuaC5kZWMucnQiXV0sIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIlN0YXRlIEhvbmVzdHktRGVjZXB0aW9uIikNCg0KDQoNCmNvd3Bsb3Q6OnBsb3RfZ3JpZChhLGIsYyxOVUxMLE5VTEwsTlVMTCwgbmNvbD0yLCBsYWJlbHM9YygiQSIsIkIiLCJDIiwiRCIsIkUiLCJGIiksIA0KICAgICAgICAgICAgICAgICAgIGxhYmVsX3NpemUgPSAxMiwgYWxpZ24gPSAidiIsIGF4aXMgPSAicmJsIikNCg0KYGBgDQoNCmBgYHtyIHBlcm0tcnNhLWZpdC1ydCwgZXZhbD1GLCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9MS4yLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9VCwgZmlnLmNhcD0iQ29tcGFyaXNvbiBvZiBvYnNlcnZlZCAoZGVzY3JpcHRpdmUpIHNwZWNpZmljYXRpb24gY3VydmVzIChibGFjayBkb3RzKSBhbmQgZXhwZWN0ZWQgdW5kZXItdGhlLW51bGwgc3BlY2lmaWNhdGlvbiBjdXJ2ZXMgKHNoYWRlZCBhcmVhKS4gVGhlIHNoYWRlZCBhcmVhIHJlcHJlc2VudHMgdGhlIHJhbmdlIG9mIGVmZmVjdHMgb2JzZXJ2ZWQgaW4gdGhlIHNodWZmbGVkIGRhdGFzZXRzIChiZXR3ZWVuIHRoZSAyLjV0aCBhbmQgYW5kIDk3LjV0aCBwZXJjZW50aWxlcyBvZiB0aGUgcmFua2VkIGVzdGltYXRlcykuIn0NCg0KYSA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLnJ0LmEsICJmaXQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0IChpbiBtcykiKSArDQogICB0aGVtZV9wdWIoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxMDAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLnJzYS5ydC5maXQiXV1bWyJzdGF0ZS50cmFpdC5hLnJ0Il1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLA0KICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGE9LjIsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmxhY2siKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gImJsYWNrIiksIHNpemUgPSAxKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJUcmFpdC1TdGF0ZSBBZ3JlZWFibGVuZXNzIikNCg0KYiA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLnJ0LmgsICJmaXQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0IChpbiBtcykiKSArDQogICB0aGVtZV9wdWIoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsOTAwMCwxMDAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLnJzYS5ydC5maXQiXV1bWyJzdGF0ZS50cmFpdC5oLnJ0Il1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLCANCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgZ2d0aXRsZSgiVHJhaXQtU3RhdGUgSG9uZXN0eS1IdW1pbGl0eSIpIA0KDQoNCmMgPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5ydC5hLmFkdiwgImZpdCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEYpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplPTAuNSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3QgKGluIG1zKSIpICsNCiAgIHRoZW1lX3B1YigpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw5MDAwLDEwMDApKSArDQogICBnZW9tX3JpYmJvbihkYXRhPWNvbmYuY3VydmVzW1siY29uZi5jdXJ2ZXMucnNhLnJ0LmZpdCJdXVtbInN0YXRlLmEuYWR2LnJ0Il1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLCANCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgZ2d0aXRsZSgiU3RhdGUgQWdyZWVhYmxlbmVzcy1BZHZlcnNpdHkiKSANCg0KZCA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLnJ0LmguYWR2LCAiZml0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdCAoaW4gbXMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDkwMDAsMTAwMCkpICsNCiAgIGdlb21fcmliYm9uKGRhdGE9Y29uZi5jdXJ2ZXNbWyJjb25mLmN1cnZlcy5yc2EucnQuZml0Il1dW1sic3RhdGUuaC5hZHYucnQiXV0sIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIlN0YXRlIEhvbmVzdHktQWR2ZXJzaXR5IikNCg0KZSA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLnJ0LmEuZGVjLCAiZml0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdCAoaW4gbXMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDkwMDAsMTAwMCkpICsNCiAgIGdlb21fcmliYm9uKGRhdGE9Y29uZi5jdXJ2ZXNbWyJjb25mLmN1cnZlcy5yc2EucnQuZml0Il1dW1sic3RhdGUuYS5kZWMucnQiXV0sIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIlN0YXRlIEFncmVlYWJsZW5lc3MtRGVjZXB0aW9uIikNCg0KZiA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLnJ0LmguZGVjLCAiZml0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdCAoaW4gbXMpIikgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDkwMDAsMTAwMCkpICsNCiAgIGdlb21fcmliYm9uKGRhdGE9Y29uZi5jdXJ2ZXNbWyJjb25mLmN1cnZlcy5yc2EucnQuZml0Il1dW1sic3RhdGUuaC5kZWMucnQiXV0sIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIlN0YXRlIEhvbmVzdHktRGVjZXB0aW9uIikNCg0KDQpjb3dwbG90OjpwbG90X2dyaWQoYSxiLGMsZCxlLGYsIG5jb2w9MiwgbGFiZWxzPWMoIkEiLCJCIiwiQyIsIkQiLCJFIiwiRiIpLCANCiAgICAgICAgICAgICAgICAgICBsYWJlbF9zaXplID0gMTIsIGFsaWduID0gInYiLCBheGlzID0gInJibCIpDQoNCmBgYA0KDQojIyMjIEVycm9yIFJhdGUgey19DQoNCmBgYHtyIHBlcm0tcnNhLWVycm9yLCBldmFsPVQsIGZpZy53aWR0aD0xMSwgZmlnLmFzcD0xLjIsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBjYWNoZT1ULCBmaWcuY2FwPSJDb21wYXJpc29uIG9mIG9ic2VydmVkIChkZXNjcmlwdGl2ZSkgc3BlY2lmaWNhdGlvbiBjdXJ2ZXMgKGJsYWNrIGRvdHMpIGFuZCBleHBlY3RlZCB1bmRlci10aGUtbnVsbCBzcGVjaWZpY2F0aW9uIGN1cnZlcyAoc2hhZGVkIGFyZWEpLiBUaGUgc2hhZGVkIGFyZWEgcmVwcmVzZW50cyB0aGUgcmFuZ2Ugb2YgZWZmZWN0cyBvYnNlcnZlZCBpbiB0aGUgc2h1ZmZsZWQgZGF0YXNldHMgKGJldHdlZW4gdGhlIDIuNXRoIGFuZCBhbmQgOTcuNXRoIHBlcmNlbnRpbGVzIG9mIHRoZSByYW5rZWQgZXN0aW1hdGVzKS4ifQ0KDQphIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EuZXIuYSwgImVzdF9iNCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEYpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplPTAuNSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3RcbihpbiAlIG9mIGVycm9ycykiKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgeCAqIDEwMCkgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDI0MDAsNTAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLnJzYS5lciJdXVtbInN0YXRlLnRyYWl0LmEuZSJdXSwgbWFwcGluZz0oYWVzKHltaW49bG93LnBlcmMsIHltYXg9aGlnaC5wZXJjLCB4PXJhbmspKSwNCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgZ2d0aXRsZSgiVHJhaXQtU3RhdGUgQWdyZWVhYmxlbmVzcyIpDQoNCmIgPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5lci5oLCAiZXN0X2I0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gImludGVyYWN0aW9uIGVmZmVjdFxuKGluICUgb2YgZXJyb3JzKSIpICsNCiAgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBmdW5jdGlvbih4KSB4ICogMTAwKSArDQogICB0aGVtZV9wdWIoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsMjQwMCw1MDApKSArDQogICBnZW9tX3JpYmJvbihkYXRhPWNvbmYuY3VydmVzW1siY29uZi5jdXJ2ZXMucnNhLmVyIl1dW1sic3RhdGUudHJhaXQuaC5lIl1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLCANCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgZ2d0aXRsZSgiVHJhaXQtU3RhdGUgSG9uZXN0eS1IdW1pbGl0eSIpIA0KDQoNCmMgPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5lci5hLmFkdiwgImVzdF9iNCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEYpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplPTAuNSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3RcbihpbiAlIG9mIGVycm9ycykiKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgeCAqIDEwMCkgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDI0MDAsNTAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLnJzYS5lciJdXVtbInN0YXRlLmEuYWR2LmUiXV0sIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksIA0KICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGE9LjIsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmxhY2siKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gImJsYWNrIiksIHNpemUgPSAxKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJTdGF0ZSBBZ3JlZWFibGVuZXNzLUFkdmVyc2l0eSIpIA0KDQpkIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EuZXIuaC5hZHYsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0XG4oaW4gJSBvZiBlcnJvcnMpIikgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHggKiAxMDApICsNCiAgIHRoZW1lX3B1YigpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwyNDAwLDUwMCkpICsNCiAgIGdlb21fcmliYm9uKGRhdGE9Y29uZi5jdXJ2ZXNbWyJjb25mLmN1cnZlcy5yc2EuZXIiXV1bWyJzdGF0ZS5oLmFkdi5lIl1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLCANCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgZ2d0aXRsZSgiU3RhdGUgSG9uZXN0eS1BZHZlcnNpdHkiKSANCg0KDQplIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EuZXIuYS5kZWMsICJlc3RfYjQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiaW50ZXJhY3Rpb24gZWZmZWN0XG4oaW4gJSBvZiBlcnJvcnMpIikgKw0KICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGZ1bmN0aW9uKHgpIHggKiAxMDApICsNCiAgIHRoZW1lX3B1YigpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwyNDAwLDUwMCkpICsNCiAgIGdlb21fcmliYm9uKGRhdGE9Y29uZi5jdXJ2ZXNbWyJjb25mLmN1cnZlcy5yc2EuZXIiXV1bWyJzdGF0ZS5hLmRlYy5lIl1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLA0KICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGE9LjIsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmxhY2siKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gImJsYWNrIiksIHNpemUgPSAxKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJTdGF0ZSBBZ3JlZWFibGVuZXNzLURlY2VwdGlvbiIpDQoNCmYgPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5lci5oLmRlYywgImVzdF9iNCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEYpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplPTAuNSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIiwgeSA9ICJpbnRlcmFjdGlvbiBlZmZlY3RcbihpbiAlIG9mIGVycm9ycykiKSArDQogICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZnVuY3Rpb24oeCkgeCAqIDEwMCkgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDI0MDAsNTAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLnJzYS5lciJdXVtbInN0YXRlLmguZGVjLmUiXV0sIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksIA0KICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGE9LjIsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmxhY2siKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gImJsYWNrIiksIHNpemUgPSAxKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJTdGF0ZSBIb25lc3R5LURlY2VwdGlvbiIpIA0KDQoNCiMjIGNvbWJpbmUgcGxvdHMNCihhfGIpLw0KICAgKGN8ZCkvDQogICAoZXxmKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gJ0EnKSANCg0KYGBgDQoNCmBgYHtyIHBlcm0tcnNhLWZpdC1lcnJvciwgZXZhbD1GLCBmaWcud2lkdGg9MTEsIGZpZy5hc3A9MS4yLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgY2FjaGU9VCwgZmlnLmNhcD0iQ29tcGFyaXNvbiBvZiBvYnNlcnZlZCAoZGVzY3JpcHRpdmUpIHNwZWNpZmljYXRpb24gY3VydmVzIChibGFjayBkb3RzKSBhbmQgZXhwZWN0ZWQgdW5kZXItdGhlLW51bGwgc3BlY2lmaWNhdGlvbiBjdXJ2ZXMgKHNoYWRlZCBhcmVhKS4gVGhlIHNoYWRlZCBhcmVhIHJlcHJlc2VudHMgdGhlIHJhbmdlIG9mIGVmZmVjdHMgb2JzZXJ2ZWQgaW4gdGhlIHNodWZmbGVkIGRhdGFzZXRzIChiZXR3ZWVuIHRoZSAyLjV0aCBhbmQgYW5kIDk3LjV0aCBwZXJjZW50aWxlcyBvZiB0aGUgcmFua2VkIGVzdGltYXRlcykuIn0NCg0KYSA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLmVyLmEsICJmaXQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiZml0IHBhdHRlcm4iKSArDQogICBzY2FsZV95X2Rpc2NyZXRlKGJyZWFrcz1jKEZBTFNFLCBUUlVFKSwgbGltaXRzPWMoRkFMU0UsIFRSVUUpKSArDQogICB0aGVtZV9wdWIoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsMjQwMCw1MDApKSArDQogICBnZW9tX3JpYmJvbihkYXRhPWNvbmYuY3VydmVzW1siY29uZi5jdXJ2ZXMucnNhLmVyLmZpdCJdXVtbInN0YXRlLnRyYWl0LmEuZSJdXSwgbWFwcGluZz0oYWVzKHltaW49bG93LnBlcmMsIHltYXg9aGlnaC5wZXJjLCB4PXJhbmspKSwgDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIlRyYWl0LVN0YXRlIEFncmVlYWJsZW5lc3MiKSANCg0KYiA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLmVyLmgsICJmaXQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiZml0IHBhdHRlcm4iKSArDQogICBzY2FsZV95X2Rpc2NyZXRlKGJyZWFrcz1jKEZBTFNFLCBUUlVFKSwgbGltaXRzPWMoRkFMU0UsIFRSVUUpKSArDQogICB0aGVtZV9wdWIoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsMjQwMCw1MDApKSArDQogICBnZW9tX3JpYmJvbihkYXRhPWNvbmYuY3VydmVzW1siY29uZi5jdXJ2ZXMucnNhLmVyLmZpdCJdXVtbInN0YXRlLnRyYWl0LmguZSJdXSwgbWFwcGluZz0oYWVzKHltaW49bG93LnBlcmMsIHltYXg9aGlnaC5wZXJjLCB4PXJhbmspKSwgDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIlRyYWl0LVN0YXRlIEhvbmVzdHktSHVtaWxpdHkiKSANCg0KDQpjIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EuZXIuYS5hZHYsICJmaXQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiZml0IHBhdHRlcm4iKSArDQogICBzY2FsZV95X2Rpc2NyZXRlKGJyZWFrcz1jKEZBTFNFLCBUUlVFKSwgbGltaXRzPWMoRkFMU0UsIFRSVUUpKSArDQogICB0aGVtZV9wdWIoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsMjQwMCw1MDApKSArDQogICBnZW9tX3JpYmJvbihkYXRhPWNvbmYuY3VydmVzW1siY29uZi5jdXJ2ZXMucnNhLmVyLmZpdCJdXVtbInN0YXRlLmEuYWR2LmUiXV0sIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksIA0KICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGE9LjIsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmxhY2siKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gImJsYWNrIiksIHNpemUgPSAxKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJTdGF0ZSBBZ3JlZWFibGVuZXNzLUFkdmVyc2l0eSIpIA0KDQpkIDwtIHBsb3RfY3VydmVfcnNhKHJlcy5yc2EuZXIuaC5hZHYsICJmaXQiLCBjaSA9IEZBTFNFLCByaWJib24gPSBGKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJzb2xpZCIsIGNvbG9yID0gImJsYWNrIiwgc2l6ZT0wLjUpICsNCiAgIGxhYnMoeCA9ICJzcGVjaWZpY2F0aW9ucyAocmFua2VkKSIsIHkgPSAiZml0IHBhdHRlcm4iKSArDQogICBzY2FsZV95X2Rpc2NyZXRlKGJyZWFrcz1jKEZBTFNFLCBUUlVFKSwgbGltaXRzPWMoRkFMU0UsIFRSVUUpKSArDQogICB0aGVtZV9wdWIoKSArIHNjYWxlX3hfY29udGludW91cyhicmVha3M9c2VxKDAsMjQwMCw1MDApKSArDQogICBnZW9tX3JpYmJvbihkYXRhPWNvbmYuY3VydmVzW1siY29uZi5jdXJ2ZXMucnNhLmVyLmZpdCJdXVtbInN0YXRlLmguYWR2LmUiXV0sIG1hcHBpbmc9KGFlcyh5bWluPWxvdy5wZXJjLCB5bWF4PWhpZ2gucGVyYywgeD1yYW5rKSksDQogICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IEZBTFNFLCBhbHBoYT0uMiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibGFjayIpKw0KICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiYmxhY2siKSwgc2l6ZSA9IDEpICsNCiAgIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTAsZmFjZT0iYm9sZCIpKSArIGdndGl0bGUoIlN0YXRlIEhvbmVzdHktQWR2ZXJzaXR5IikgDQoNCg0KZSA8LSBwbG90X2N1cnZlX3JzYShyZXMucnNhLmVyLmEuZGVjLCAiZml0IiwgY2kgPSBGQUxTRSwgcmliYm9uID0gRikgKw0KICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIsIHNpemU9MC41KSArDQogICBsYWJzKHggPSAic3BlY2lmaWNhdGlvbnMgKHJhbmtlZCkiLCB5ID0gImZpdCBwYXR0ZXJuIikgKw0KICAgc2NhbGVfeV9kaXNjcmV0ZShicmVha3M9YyhGQUxTRSwgVFJVRSksIGxpbWl0cz1jKEZBTFNFLCBUUlVFKSkgKw0KICAgdGhlbWVfcHViKCkgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDI0MDAsNTAwKSkgKw0KICAgZ2VvbV9yaWJib24oZGF0YT1jb25mLmN1cnZlc1tbImNvbmYuY3VydmVzLnJzYS5lci5maXQiXV1bWyJzdGF0ZS5hLmRlYy5lIl1dLCBtYXBwaW5nPShhZXMoeW1pbj1sb3cucGVyYywgeW1heD1oaWdoLnBlcmMsIHg9cmFuaykpLA0KICAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBGQUxTRSwgYWxwaGE9LjIsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmxhY2siKSsNCiAgIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gImJsYWNrIiksIHNpemUgPSAxKSArDQogICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwLGZhY2U9ImJvbGQiKSkgKyBnZ3RpdGxlKCJTdGF0ZSBBZ3JlZWFibGVuZXNzLURlY2VwdGlvbiIpDQoNCmYgPC0gcGxvdF9jdXJ2ZV9yc2EocmVzLnJzYS5lci5oLmRlYywgImZpdCIsIGNpID0gRkFMU0UsIHJpYmJvbiA9IEYpICsNCiAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gInNvbGlkIiwgY29sb3IgPSAiYmxhY2siLCBzaXplPTAuNSkgKw0KICAgbGFicyh4ID0gInNwZWNpZmljYXRpb25zIChyYW5rZWQpIiwgeSA9ICJmaXQgcGF0dGVybiIpICsNCiAgIHNjYWxlX3lfZGlzY3JldGUoYnJlYWtzPWMoRkFMU0UsIFRSVUUpLCBsaW1pdHM9YyhGQUxTRSwgVFJVRSkpICsNCiAgIHRoZW1lX3B1YigpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwyNDAwLDUwMCkpICsNCiAgIGdlb21fcmliYm9uKGRhdGE9Y29uZi5jdXJ2ZXNbWyJjb25mLmN1cnZlcy5yc2EuZXIuZml0Il1dW1sic3RhdGUuaC5kZWMuZSJdXSwgbWFwcGluZz0oYWVzKHltaW49bG93LnBlcmMsIHltYXg9aGlnaC5wZXJjLCB4PXJhbmspKSwNCiAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UsIGFscGhhPS4yLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsYWNrIikrDQogICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJibGFjayIpLCBzaXplID0gMSkgKw0KICAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCxmYWNlPSJib2xkIikpICsgZ2d0aXRsZSgiU3RhdGUgSG9uZXN0eS1EZWNlcHRpb24iKSANCg0KKGF8YikvDQogICAoY3xkKS8NCiAgIChlfGYpICsgcGxvdF9hbm5vdGF0aW9uKHRhZ19sZXZlbHMgPSAnQScpIA0KDQpgYGANCg0KIyBFeHBsb3JhdG9yeSBBbmFseXNlcyB7LnRhYnNldCAudGFic2V0LXBpbGxzIC19DQoNCiMjIERpZmZlcmVuY2UgU2NvcmVzIGZvciBDb25ncnVlbmNlIHsudGFic2V0IC50YWJzZXQtcGlsbHMgLX0NCg0KIyMjIERlc2NyaXB0aXZlIFN0YXRpc3RpY3Mgey19DQoNCldlIGNhbGN1bGF0ZWQgZGVzY3JpcHRpdmUgZGlmZmVyZW5jZSBzY29yZSBiZXR3ZWVuIHBlcnNvbmFsaXR5IHRyYWl0cyBhbmQgcGVyc29uYWxpdHkgc3RhdGVzIGFuZCBiZXR3ZWVuIHNpdHVhdGlvbiBjaGFyYWN0ZXJpc3RpY3MgYW5kIHBlcnNvbmFsaXR5IHN0YXRlcyB0byByZXByZXNlbnQgY29uZ3J1ZW5jZS4gSG93ZXZlciwgdGhlc2UgZGlmZmVyZW5jZSBzY29yZXMgc2hvdWxkIGJlIGludGVycHJldGVkIHdpdGggY2F1dGlvbiBiZWNhdXNlIHRoZXkgYXNzdW1lIHN0cm9uZyBlcXVpdmFsZW5jZSBiZXR3ZWVuIHRoZSB0cmFpdCBhbmQgc3RhdGUgc2NhbGVzIHdoaWNoIG1heSBub3QgYmUgZ2l2ZW4gaW4gdGhpcyBzdHVkeS4gDQoNCmBgYHtyIGRpZmZlcmVuY2Utc2NvcmUtdGFiLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRX0NCg0KZGF0YSRkaWZmLmEgPC0gZGF0YSRzdGF0ZS5hLWRhdGEkdHJhaXQuYS5sb25nDQpkYXRhJGRpZmYuaCA8LSBkYXRhJHN0YXRlLmgtZGF0YSR0cmFpdC5oLmxvbmcNCmRhdGEkZGlmZi5hLmEgPC0gZGF0YSRzdGF0ZS5hLTgtZGF0YSRhZHYNCmRhdGEkZGlmZi5kLmEgPC0gZGF0YSRzdGF0ZS5hLTgtZGF0YSRkZWMNCmRhdGEkZGlmZi5hLmggPC0gZGF0YSRzdGF0ZS5oLTgtZGF0YSRhZHYNCmRhdGEkZGlmZi5kLmggPC0gZGF0YSRzdGF0ZS5oLTgtZGF0YSRkZWMNCg0KDQp0YWIgPC0gYmluZF9yb3dzKGFzLmRhdGEuZnJhbWUoZGVzY3JpYmUoZGF0YSRkaWZmLmEpKVssMjoxM10sDQogICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoZGVzY3JpYmUoZGF0YSRkaWZmLmgpKVssMjoxM10sDQogICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoZGVzY3JpYmUoZGF0YSRkaWZmLmEuYSkpWywyOjEzXSwNCiAgICAgICAgICAgICAgICAgYXMuZGF0YS5mcmFtZShkZXNjcmliZShkYXRhJGRpZmYuZC5hKSlbLDI6MTNdLA0KICAgICAgICAgICAgICAgICBhcy5kYXRhLmZyYW1lKGRlc2NyaWJlKGRhdGEkZGlmZi5hLmgpKVssMjoxM10sDQogICAgICAgICAgICAgICAgIGFzLmRhdGEuZnJhbWUoZGVzY3JpYmUoZGF0YSRkaWZmLmQuaCkpWywyOjEzXQ0KKQ0Kcm93Lm5hbWVzKHRhYikgPC0gYygiU3RhdGUgQSAtIFRyYWl0IEEiLCAiU3RhdGUgSEggLSBUcmFpdCBISCIsIA0KICAgICAgICAgICAgICAgICAgICAiU3RhdGUgQSAtIEFkdmVyc2l0eShyKSIsICJTdGF0ZSBBIC0gRGVjZXB0aW9uKHIpIiwNCiAgICAgICAgICAgICAgICAgICAgIlN0YXRlIEhIIC0gQWR2ZXJzaXR5KHIpIiwgIlN0YXRlIEhIIC0gRGVjZXB0aW9uKHIpIikNCg0Ka2FibGUodGFiLA0KICAgICAgZGlnaXRzPTIsDQogICAgICByb3cubmFtZXMgPSBUUlVFLA0KICAgICAgY29sLm5hbWVzID0gYygibiIsICJtZWFuIiwgInNkIiwgIm1lZGlhbiIsIA0KICAgICAgICAgICAgICAgICAgICAidHJpbW1lZCIsICJtYWQiLCAibWluIiwgIm1heCIsICJyYW5nZSIsICJza2V3IiwgImt1cnRvc2lzIiwgInNlIiksDQogICAgICBjYXB0aW9uID0gIkRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIGRlc2NyaXB0aXZlIGRpZmZlcmVuY2Ugc2NvcmVzIHJlcHJlc2VudGluZyBjb25ncnVlbmNlIGluIHRoZSBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGdyb3Vwcy4iKSAlPiUgIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSAlPiUgDQogICBmb290bm90ZShnZW5lcmFsPSJBZHZlcnNpdHkgYW5kIGRlY2VwdGlvbiB3ZXJlIHJldmVyc2UtY29kZWQgKGluZGljdGVkIGJ5IChyKSApIHN1Y2ggdGhhdCBoaWdoZXIgbGV2ZWxzIGluZGljYXRlIGxlc3MgYWR2ZXJzaXR5IGFuZCBkZWNlcHRpb24sIHJlc3BlY3RpdmVseS4gIikNCg0KYGBgDQoNCiMjIyBIaXN0b2dyYW1zIHstfQ0KDQpXZSBjYWxjdWxhdGVkIGRlc2NyaXB0aXZlIGRpZmZlcmVuY2Ugc2NvcmUgYmV0d2VlbiBwZXJzb25hbGl0eSB0cmFpdHMgYW5kIHBlcnNvbmFsaXR5IHN0YXRlcyBhbmQgYmV0d2VlbiBzaXR1YXRpb24gY2hhcmFjdGVyaXN0aWNzIGFuZCBwZXJzb25hbGl0eSBzdGF0ZXMgdG8gcmVwcmVzZW50IGNvbmdydWVuY2UuIEhvd2V2ZXIsIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzIHNob3VsZCBiZSBpbnRlcnByZXRlZCB3aXRoIGNhdXRpb24gYmVjYXVzZSB0aGV5IGFzc3VtZSBzdHJvbmcgZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgdHJhaXQgYW5kIHN0YXRlIHNjYWxlcyB3aGljaCBtYXkgbm90IGJlIGdpdmVuIGluIHRoaXMgc3R1ZHkuIA0KDQpgYGB7ciwgZmlnLmFzcD0xLjIsIGZpZy53aWR0aD0xMSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGZpZy5jYXA9Ikhpc3RvZ3JhbXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBiZXR3ZWVuIHBlcnNvbmFsaXR5IHRyYWl0cyBhbmQgcGVyc29uYWxpdHkgc3RhdGVzIGFuZCBiZXR3ZWVuIHNpdHVhdGlvbiBjaGFyYWN0ZXJpc3RpY3MgYW5kIHBlcnNvbmFsaXR5IHN0YXRlcyBhcyBhIGRlc2NyaXB0aXZlIGluZGljYXRvciBvZiBjb25ncnVlbmNlLiJ9DQoNCmEgPC0gZ2dwbG90KGRhdGE9ZGF0YSwgYWVzKHg9dHJhaXQuaC1zdGF0ZS5oKSkgKyB0aGVtZV9wdWIoKSArIA0KICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLmJlaFsxXSwgYmlud2lkdGg9MSkgICsNCiAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtNC41LDQuNSksIGJyZWFrcz1jKC00OjQpLCBsYWJlbHM9YygtNDo0KSkgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBsYWJzKHRpdGxlPSJUcmFpdC1TdGF0ZSBDb25ncnVlbmNlOlxuSG9uZXN0eSIsIHg9IkRldmlhdGlvbiBvZiBzdGF0ZSBob25lc3R5IGZyb20gdHJhaXQgaG9uZXN0eSIpIA0KDQpiIDwtIGdncGxvdChkYXRhPWRhdGEsIGFlcyh4PXRyYWl0LmEtc3RhdGUuYSkpICsgdGhlbWVfcHViKCkgKw0KICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLmJlaFsxXSwgYmlud2lkdGg9MSkgICsNCiAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtNC41LDQuNSksIGJyZWFrcz1jKC00OjQpLCBsYWJlbHM9YygtNDo0KSkgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBsYWJzKHRpdGxlPSJUcmFpdC1TdGF0ZSBDb25ncnVlbmNlOlxuQWdyZWVhYmxlbmVzcyIsIHg9IkRldmlhdGlvbiBvZiBzdGF0ZSBhZ3JlZWFibGVuZXNzIGZyb20gdHJhaXQgYWdyZWVhYmxlbmVzcyIpDQoNCmMgPC0gZ2dwbG90KGRhdGE9ZGF0YSwgYWVzKHg9OC1hZHYtc3RhdGUuYSkpICsgdGhlbWVfcHViKCkgKw0KICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLnNpdFsxXSwgYmlud2lkdGg9MSkgICsNCiAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtNC41LDQuNSksIGJyZWFrcz1jKC00OjQpLCBsYWJlbHM9YygtNDo0KSkgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBsYWJzKHRpdGxlPSJTdGF0ZS1TaXR1YXRpb24gQ29uZ3J1ZW5jZTpcbkFncmVlYWJsZW5lc3MgYW5kIEFkdmVyc2l0eSIsIA0KICAgICAgICB4PSJEZXZpYXRpb24gb2Ygc3RhdGUgYWdyZWVhYmxlbmVzcyBmcm9tIGFkdmVyc2l0eSAocmV2ZXJzZSBjb2RlZCkiKQ0KDQpkIDwtIGdncGxvdChkYXRhPWRhdGEsIGFlcyh4PTgtZGVjLXN0YXRlLmEpKSArIHRoZW1lX3B1YigpICsNCiAgIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5zaXRbMV0sIGJpbndpZHRoPTEpICArDQogICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoLTQuNSw0LjUpLCBicmVha3M9YygtNDo0KSwgbGFiZWxzPWMoLTQ6NCkpICsgDQogICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwLjAxKSkgKw0KICAgbGFicyh0aXRsZT0iU3RhdGUtU2l0dWF0aW9uIENvbmdydWVuY2U6XG5BZ3JlZWFibGVuZXNzIGFuZCBEZWNlcHRpb24iLCANCiAgICAgICAgeD0iRGV2aWF0aW9uIG9mIHN0YXRlIGFncmVlYWJsZW5lc3MgZnJvbSBkZWNlcHRpb24gKHJldmVyc2UgY29kZWQpIikNCg0KZSA8LSBnZ3Bsb3QoZGF0YT1kYXRhLCBhZXMoeD04LWFkdi1zdGF0ZS5oKSkgKyB0aGVtZV9wdWIoKSArDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSAgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKC00LjUsNC41KSwgYnJlYWtzPWMoLTQ6NCksIGxhYmVscz1jKC00OjQpKSArIA0KICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMC4wMSkpICsNCiAgIGxhYnModGl0bGU9IlN0YXRlLVNpdHVhdGlvbiBDb25ncnVlbmNlOlxuSG9uZXN0eSBhbmQgQWR2ZXJzaXR5IiwgDQogICAgICAgIHg9IkRldmlhdGlvbiBvZiBzdGF0ZSBob25lc3R5IGZyb20gYWR2ZXJzaXR5IChyZXZlcnNlIGNvZGVkKSIpDQoNCmYgPC0gZ2dwbG90KGRhdGE9ZGF0YSwgYWVzKHg9OC1kZWMtc3RhdGUuaCkpICsgdGhlbWVfcHViKCkgKw0KICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLnNpdFsxXSwgYmlud2lkdGg9MSkgICsNCiAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygtNC41LDQuNSksIGJyZWFrcz1jKC00OjQpLCBsYWJlbHM9YygtNDo0KSkgKyANCiAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDAuMDEpKSArDQogICBsYWJzKHRpdGxlPSJTdGF0ZS1TaXR1YXRpb24gQ29uZ3J1ZW5jZTpcbkhvbmVzdHkgYW5kIERlY2VwdGlvbiIsIA0KICAgICAgICB4PSJEZXZpYXRpb24gb2Ygc3RhdGUgaG9uZXN0eSBmcm9tIGRlY2VwdGlvbiAocmV2ZXJzZSBjb2RlZCkiKQ0KDQooYSArIGIpLw0KICAgcGxvdF9zcGFjZXIoKS8NCiAgIChjICsgZCkvDQogICBwbG90X3NwYWNlcigpLw0KICAgKGUgKyBmKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzPSJBIikgKyBwbG90X2xheW91dChoZWlnaHRzPWMoMSwwLjIsMSwwLjIsMSkpDQoNCmBgYA0KDQojIyBEaWZmZXJlbmNlIFNjb3JlcyBpbiB0aGUgRXhwZXJpbWVudGFsIENvbmRpdGlvbnMgey50YWJzZXQgLnRhYnNldC1waWxscyAtfQ0KDQojIyMgRGVzY3JpcHRpdmUgU3RhdGlzdGljcyB7LX0NCg0KV2UgY2FsY3VsYXRlZCBkZXNjcmlwdGl2ZSBkaWZmZXJlbmNlIHNjb3JlIGJldHdlZW4gcGVyc29uYWxpdHkgdHJhaXRzIGFuZCBwZXJzb25hbGl0eSBzdGF0ZXMgYW5kIGJldHdlZW4gc2l0dWF0aW9uIGNoYXJhY3RlcmlzdGljcyBhbmQgcGVyc29uYWxpdHkgc3RhdGVzIHRvIHJlcHJlc2VudCBjb25ncnVlbmNlLiBIb3dldmVyLCB0aGVzZSBkaWZmZXJlbmNlIHNjb3JlcyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgd2l0aCBjYXV0aW9uIGJlY2F1c2UgdGhleSBhc3N1bWUgc3Ryb25nIGVxdWl2YWxlbmNlIGJldHdlZW4gdGhlIHRyYWl0IGFuZCBzdGF0ZSBzY2FsZXMgd2hpY2ggbWF5IG5vdCBiZSBnaXZlbiBpbiB0aGlzIHN0dWR5LiANCg0KYGBge3IgZGlmZmVyZW5jZS1zY29yZS10YWItMiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0V9DQoNCmRhdGEkZGlmZi5hIDwtIGRhdGEkc3RhdGUuYS1kYXRhJHRyYWl0LmEubG9uZw0KZGF0YSRkaWZmLmggPC0gZGF0YSRzdGF0ZS5oLWRhdGEkdHJhaXQuaC5sb25nDQpkYXRhJGRpZmYuYS5hIDwtIDgtZGF0YSRhZHYtZGF0YSRzdGF0ZS5hDQpkYXRhJGRpZmYuZC5hIDwtIDgtZGF0YSRkZWMtZGF0YSRzdGF0ZS5hDQpkYXRhJGRpZmYuYS5oIDwtIDgtZGF0YSRhZHYtZGF0YSRzdGF0ZS5oDQpkYXRhJGRpZmYuZC5oIDwtIDgtZGF0YSRkZWMtZGF0YSRzdGF0ZS5oDQoNCg0KdGFiIDwtIGJpbmRfcm93cyhkZXNjcmliZUJ5KGRhdGEkZGlmZi5hLCBncm91cD1saXN0KGRhdGEkY29uZGl0aW9uLmJlaCwgZGF0YSRjb25kaXRpb24uc2l0KSwgbWF0PVRSVUUsIGRpZ2l0cz0yKVssMjoxNV0sDQogICAgICAgICAgICAgICAgIGRlc2NyaWJlQnkoZGF0YSRkaWZmLmgsIGdyb3VwPWxpc3QoZGF0YSRjb25kaXRpb24uYmVoLCBkYXRhJGNvbmRpdGlvbi5zaXQpLCBtYXQ9VFJVRSwgZGlnaXRzPTIpWywyOjE1XSwNCiAgICAgICAgICAgICAgICAgZGVzY3JpYmVCeShkYXRhJGRpZmYuYS5hLCBncm91cD1saXN0KGRhdGEkY29uZGl0aW9uLmJlaCwgZGF0YSRjb25kaXRpb24uc2l0KSwgbWF0PVRSVUUsIGRpZ2l0cz0yKVssMjoxNV0sDQogICAgICAgICAgICAgICAgIGRlc2NyaWJlQnkoZGF0YSRkaWZmLmQuYSwgZ3JvdXA9bGlzdChkYXRhJGNvbmRpdGlvbi5iZWgsIGRhdGEkY29uZGl0aW9uLnNpdCksIG1hdD1UUlVFLCBkaWdpdHM9MilbLDI6MTVdLA0KICAgICAgICAgICAgICAgICBkZXNjcmliZUJ5KGRhdGEkZGlmZi5hLmgsIGdyb3VwPWxpc3QoZGF0YSRjb25kaXRpb24uYmVoLCBkYXRhJGNvbmRpdGlvbi5zaXQpLCBtYXQ9VFJVRSwgZGlnaXRzPTIpWywyOjE1XSwNCiAgICAgICAgICAgICAgICAgZGVzY3JpYmVCeShkYXRhJGRpZmYuZC5oLCBncm91cD1saXN0KGRhdGEkY29uZGl0aW9uLmJlaCwgZGF0YSRjb25kaXRpb24uc2l0KSwgbWF0PVRSVUUsIGRpZ2l0cz0yKVssMjoxNV0NCikNCm5hbWVzKHRhYilbMV0gPC0gIkV4cGVyaW1lbnRhbCBjb25kaXRpb25zIg0KDQprYWJsZSh0YWIsDQogICAgICByb3cubmFtZXMgPSBGQUxTRSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoImJlaGF2aW9yIGNvbmRpdGlvbiIsICJzaXR1YXRpb24gY29uZGl0aW9uIiwgInZhcnMiLCAibiIsICJtZWFuIiwgInNkIiwgIm1lZGlhbiIsIA0KICAgICAgICAgICAgICAgICAgICAidHJpbW1lZCIsICJtYWQiLCAibWluIiwgIm1heCIsICJyYW5nZSIsICJza2V3IiwgImt1cnRvc2lzIiksDQogICAgICBjYXB0aW9uID0gIkRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIGRlc2NyaXB0aXZlIGRpZmZlcmVuY2Ugc2NvcmVzIHJlcHJlc2VudGluZyBjb25ncnVlbmNlIGluIHRoZSBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGdyb3Vwcy4iKSAlPiUgIA0KICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiKSwgZml4ZWRfdGhlYWQgPSBUKSAlPiUgDQogICBwYWNrX3Jvd3MoIkRWOiBEaWZmZXJlbmNlIGJldHdlZW4gdHJhaXQgYWdyZWVhYmxlbmVzcyBhbmQgc3RhdGUgYWdyZWVhYmxlbmVzcyIsIDEsIDQpICU+JQ0KICAgcGFja19yb3dzKCJEVjogRGlmZmVyZW5jZSBiZXR3ZWVuIHRyYWl0IGhvbmVzdHktaHVtaWxpdHkgYW5kIHN0YXRlIGhvbmVzdHktaHVtaWxpdHkiLCA1LCA4KSAlPiUNCiAgIHBhY2tfcm93cygiRFY6IERpZmZlcmVuY2UgYmV0d2VlbiBhdmVyc2l0eShyKSBhbmQgc3RhdGUgYWdyZWVhYmxlbmVzcyIsIDksIDEyKSAlPiUNCiAgIHBhY2tfcm93cygiRFY6IERpZmZlcmVuY2UgYmV0d2VlbiBkZWNlcHRpb24ocikgYW5kIHN0YXRlIGFncmVlYWJsZW5lc3MiLCAxMywgMTYpICU+JQ0KICAgcGFja19yb3dzKCJEVjogRGlmZmVyZW5jZSBiZXR3ZWVuIGFkdmVyc2l0eShyKSBhbmQgc3RhdGUgaG9uZXN0eS1odW1pbGl0eSIsIDE3LCAyMCkgJT4lDQogICBwYWNrX3Jvd3MoIkRWOiBEaWZmZXJlbmNlIGJldHdlZW4gZGVjZXB0aW9uKHIpIGFuZCBzdGF0ZSBob25lc3R5LWh1bWlsaXR5IiwgMjEsIDI0KSAlPiUgDQogICBmb290bm90ZShnZW5lcmFsPSJBZHZlcnNpdHkgYW5kIGRlY2VwdGlvbiB3ZXJlIHJldmVyc2UtY29kZWQgKGluZGljdGVkIGJ5IChyKSApIHN1Y2ggdGhhdCBoaWdoZXIgbGV2ZWxzIGluZGljYXRlIGxlc3MgYWR2ZXJzaXR5IGFuZCBkZWNlcHRpb24sIHJlc3BlY3RpdmVseS4gIikNCg0KYGBgDQoNCiMjIyBIaXN0b2dyYW1zIHstfQ0KDQpXZSBjYWxjdWxhdGVkIGRlc2NyaXB0aXZlIGRpZmZlcmVuY2Ugc2NvcmUgYmV0d2VlbiBwZXJzb25hbGl0eSB0cmFpdHMgYW5kIHBlcnNvbmFsaXR5IHN0YXRlcyBhbmQgYmV0d2VlbiBzaXR1YXRpb24gY2hhcmFjdGVyaXN0aWNzIGFuZCBwZXJzb25hbGl0eSBzdGF0ZXMgdG8gcmVwcmVzZW50IGNvbmdydWVuY2UuIEhvd2V2ZXIsIHRoZXNlIGRpZmZlcmVuY2Ugc2NvcmVzIHNob3VsZCBiZSBpbnRlcnByZXRlZCB3aXRoIGNhdXRpb24gYmVjYXVzZSB0aGV5IGFzc3VtZSBzdHJvbmcgZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgdHJhaXQgYW5kIHN0YXRlIHNjYWxlcyB3aGljaCBtYXkgbm90IGJlIGdpdmVuIGluIHRoaXMgc3R1ZHkuIA0KDQpgYGB7ciwgZmlnLmFzcD0wLjUsIGZpZy53aWR0aD0xMSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGZpZy5jYXA9Ikhpc3RvZ3JhbXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBiZXR3ZWVuIHBlcnNvbmFsaXR5IHRyYWl0cyBhbmQgcGVyc29uYWxpdHkgc3RhdGVzIGFzIGEgZGVzY3JpcHRpdmUgaW5kaWNhdG9yIG9mIGNvbmdydWVuY2UgaW4gdGhlIGRpZmZlcmVudCBleHBlcmltZW50YWwgZ3JvdXBzLiJ9DQoNCnAxIDwtIGdncGxvdChzdWJzZXQoZGF0YSwgY29uZGl0aW9uLmJlaD09ImhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eSIpLCBhZXMoeD1kaWZmLmEpKSArIA0KICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLmJlaFsxXSwgYmlud2lkdGg9MSkgKyANCiAgIGxhYnModGl0bGU9ImhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eS1jb25kaXRpb24iLCANCiAgICAgICAgeD0iRGV2aWF0aW9uIG9mIHN0YXRlIGFncmVlYWJsZW5lc3MgZnJvbSB0cmFpdCBhZ3JlZWFibGVuZXNzIikgKyB4bGltKC02LDYpICsgdGhlbWVfcHViKCkgDQoNCnAyIDwtIGdncGxvdChzdWJzZXQoZGF0YSwgY29uZGl0aW9uLmJlaD09ImxvdyBhZ3JlZWFibGVuZXNzIGFuZCBob25lc3R5IiksIGFlcyh4PWRpZmYuYSkpICsgDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuYmVoWzFdLCBiaW53aWR0aD0xKSArIA0KICAgbGFicyh0aXRsZT0ibG93IGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHktY29uZGl0aW9uIiwgDQogICAgICAgIHg9IkRldmlhdGlvbiBvZiBzdGF0ZSBhZ3JlZWFibGVuZXNzIGZyb20gdHJhaXQgYWdyZWVhYmxlbmVzcyIpICsgeGxpbSgtNiw2KSArIHRoZW1lX3B1YigpDQoNCg0KIyMgY29tYmluZSBwbG90cw0KKHAxK3AyKSArIHBsb3RfYW5ub3RhdGlvbigNCiAgIHRpdGxlID0gJ1RyYWl0LVN0YXRlIENvbmdydWVuY2UnLA0KICAgc3VidGl0bGUgPSAnRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0cmFpdCBhZ3JlZWFibGVuZXNzIGFuZCBzdGF0ZSBhZ3JlZWFibGVuZXNzIGluIHRoZSB0d28gYmVoYXZpb3IgY29uZGl0aW9ucycNCikgDQoNCmBgYA0KDQpgYGB7ciwgZmlnLmFzcD0wLjUsIGZpZy53aWR0aD0xMSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGZpZy5jYXA9Ikhpc3RvZ3JhbXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBiZXR3ZWVuIHBlcnNvbmFsaXR5IHRyYWl0cyBhbmQgcGVyc29uYWxpdHkgc3RhdGVzIGFzIGEgZGVzY3JpcHRpdmUgaW5kaWNhdG9yIG9mIGNvbmdydWVuY2UgaW4gdGhlIGRpZmZlcmVudCBleHBlcmltZW50YWwgZ3JvdXBzLiJ9DQoNCnAxIDwtIGdncGxvdChzdWJzZXQoZGF0YSwgY29uZGl0aW9uLmJlaD09ImhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eSIpLCBhZXMoeD1kaWZmLmgpKSArIA0KICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLmJlaFsxXSwgYmlud2lkdGg9MSkgKyANCiAgIGxhYnModGl0bGU9ImhpZ2ggYWdyZWVhYmxlbmVzcyBhbmQgaG9uZXN0eS1jb25kaXRpb24iLCANCiAgICAgICAgeD0iRGV2aWF0aW9uIG9mIHN0YXRlIGhvbmVzdHktaHVtaWxpdHkgZnJvbSB0cmFpdCBob25lc3R5LWh1bWlsaXR5IikgKyB4bGltKC02LDYpICsgdGhlbWVfcHViKCkgDQoNCnAyIDwtIGdncGxvdChzdWJzZXQoZGF0YSwgY29uZGl0aW9uLmJlaD09ImxvdyBhZ3JlZWFibGVuZXNzIGFuZCBob25lc3R5IiksIGFlcyh4PWRpZmYuaCkpICsgDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuYmVoWzFdLCBiaW53aWR0aD0xKSArIA0KICAgbGFicyh0aXRsZT0ibG93IGFncmVlYWJsZW5lc3MgYW5kIGhvbmVzdHktY29uZGl0aW9uIiwgDQogICAgICAgIHg9IkRldmlhdGlvbiBvZiBzdGF0ZSBob25lc3R5LWh1bWlsaXR5IGZyb20gdHJhaXQgaG9uZXN0eS1odW1pbGl0eSIpICsgeGxpbSgtNiw2KSArIHRoZW1lX3B1YigpDQoNCg0KIyMgY29tYmluZSBwbG90cw0KKHAxK3AyKSArIHBsb3RfYW5ub3RhdGlvbigNCiAgIHRpdGxlID0gJ1RyYWl0LVN0YXRlIENvbmdydWVuY2UnLA0KICAgc3VidGl0bGUgPSAnRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiB0cmFpdCBob25lc3R5IGFuZCBzdGF0ZSBob25lc3R5IGluIHRoZSB0d28gYmVoYXZpb3IgY29uZGl0aW9ucycNCikgDQoNCmBgYA0KDQpgYGB7ciwgZmlnLmFzcD0wLjgsIGZpZy53aWR0aD0xMSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZXJyb3I9RkFMU0UsIGZpZy5jYXA9Ikhpc3RvZ3JhbXMgb2YgZGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiBiZXR3ZWVuIHNpdHVhdGlvbiBjaGFyYWN0ZXJpc3RpY3MgYW5kIHBlcnNvbmFsaXR5IHN0YXRlcyBhcyBhIGRlc2NyaXB0aXZlIGluZGljYXRvciBvZiBjb25ncnVlbmNlIGluIHRoZSBkaWZmZXJlbnQgZXhwZXJpbWVudGFsIGdyb3Vwcy4ifQ0KDQpwMSA8LSBnZ3Bsb3Qoc3Vic2V0KGRhdGEsIGNvbmRpdGlvbi5icz09ImZyaWVuZGx5LWZyaWVuZGx5IiksIGFlcyh4PWRpZmYuYS5hKSkgKyB4bGltKC02LDYpICsgdGhlbWVfcHViKCkgKw0KICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLnNpdFsxXSwgYmlud2lkdGg9MSkgKyANCiAgIGxhYnModGl0bGU9ImNvbmdydWVudCIsIHN1YnRpdGxlPSIoYmVoZWhhdmlvcjogaGlnaCwgc2l0dWF0aW9uOiBoaWdoKSIsDQogICAgICAgIHg9IkRldmlhdGlvbiBvZiBzdGF0ZSBhZ3JlZWFibGVuZXNzIGZyb20gYWR2ZXJzaXR5IChyZXZlcnNlIGNvZGVkKSIpDQoNCnAyIDwtIGdncGxvdChzdWJzZXQoZGF0YSwgY29uZGl0aW9uLmJzPT0idW5mcmllbmRseS11bmZyaWVuZGx5IiksIGFlcyh4PWRpZmYuYS5hKSkgKyB4bGltKC02LDYpICsgdGhlbWVfcHViKCkgKw0KICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLnNpdFsxXSwgYmlud2lkdGg9MSkgKyANCiAgIGxhYnModGl0bGU9ImNvbmdydWVudCIsIHN1YnRpdGxlPSIoYmVoYXZpb3I6IGxvdywgc2l0dWF0aW9uOiBsb3cpIiwNCiAgICAgICAgeD0iRGV2aWF0aW9uIG9mIHN0YXRlIGFncmVlYWJsZW5lc3MgZnJvbSBhZHZlcnNpdHkgKHJldmVyc2UgY29kZWQpIikNCg0KcDMgPC0gZ2dwbG90KHN1YnNldChkYXRhLCBjb25kaXRpb24uYnM9PSJmcmllbmRseS11bmZyaWVuZGx5IiksIGFlcyh4PWRpZmYuYS5hKSkgKyB4bGltKC02LDYpICsgdGhlbWVfcHViKCkgKw0KICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLnNpdFsxXSwgYmlud2lkdGg9MSkgKyANCiAgIGxhYnModGl0bGU9ImluY29uZ3J1ZW50Iiwgc3VidGl0bGU9IihiZWhhdmlvcjogaGlnaCwgc2l0dWF0aW9uOiBsb3cpIiwNCiAgICAgICAgeD0iRGV2aWF0aW9uIG9mIHN0YXRlIGFncmVlYWJsZW5lc3MgZnJvbSBhZHZlcnNpdHkgKHJldmVyc2UgY29kZWQpIikNCg0KcDQgPC0gZ2dwbG90KHN1YnNldChkYXRhLCBjb25kaXRpb24uYnM9PSJ1bmZyaWVuZGx5LWZyaWVuZGx5IiksIGFlcyh4PWRpZmYuYS5hKSkgKyB4bGltKC02LDYpICsgdGhlbWVfcHViKCkgKw0KICAgZ2VvbV9oaXN0b2dyYW0oY29sb3I9ImJsYWNrIiwgZmlsbD1jb2xzLnNpdFsxXSwgYmlud2lkdGg9MSkgKyANCiAgIGxhYnModGl0bGU9ImluY29uZ3J1ZW50Iiwgc3VidGl0bGU9IihiZWhhdmlvcjogbG93LCBzaXR1YXRpb246IGhpZ2gpIiwNCiAgICAgICAgeD0iRGV2aWF0aW9uIG9mIHN0YXRlIGFncmVlYWJsZW5lc3MgZnJvbSBhZHZlcnNpdHkgKHJldmVyc2UgY29kZWQpIikNCg0KDQojIyBjb21iaW5lIHBsb3RzDQoocDErcDIpLw0KICAgcGxvdF9zcGFjZXIoKS8NCiAgIChwMytwNCkgKyBwbG90X2xheW91dChoZWlnaHRzPWMoMSwwLjIsMSkpICsgDQogICBwbG90X2Fubm90YXRpb24oDQogICAgICB0aXRsZSA9ICdTdGF0ZS1TaXR1YXRpb24gQ29uZ3J1ZW5jZScsDQogICAgICBzdWJ0aXRsZSA9ICdEaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIHJldmVyc2UtY29kZWQgYWR2ZXJzaXR5IGFuZCBzdGF0ZSBhZ3JlZWFibGVuZXNzIGluIHRoZSBmb3VyIGV4cGVyaW1lbnRhbCBncm91cHMnDQogICApIA0KDQpgYGANCg0KYGBge3IsIGZpZy5hc3A9MC44LCBmaWcud2lkdGg9MTEsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFLCBmaWcuY2FwPSJIaXN0b2dyYW1zIG9mIGRpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gYmV0d2VlbiBzaXR1YXRpb24gY2hhcmFjdGVyaXN0aWNzIGFuZCBwZXJzb25hbGl0eSBzdGF0ZXMgYXMgYSBkZXNjcmlwdGl2ZSBpbmRpY2F0b3Igb2YgY29uZ3J1ZW5jZSBpbiB0aGUgZGlmZmVyZW50IGV4cGVyaW1lbnRhbCBncm91cHMuIn0NCg0KcDEgPC0gZ2dwbG90KHN1YnNldChkYXRhLCBjb25kaXRpb24uYnM9PSJmcmllbmRseS1mcmllbmRseSIpLCBhZXMoeD1kaWZmLmQuYSkpICsgeGxpbSgtNiw2KSArIHRoZW1lX3B1YigpICsNCiAgIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5zaXRbMV0sIGJpbndpZHRoPTEpICsgDQogICBsYWJzKHRpdGxlPSJjb25ncnVlbnQiLCBzdWJ0aXRsZT0iKGJlaGVoYXZpb3I6IGhpZ2gsIHNpdHVhdGlvbjogaGlnaCkiLA0KICAgICAgICB4PSJEZXZpYXRpb24gb2Ygc3RhdGUgYWdyZWVhYmxlbmVzcyBmcm9tIGRlY2VwdGlvbiAocmV2ZXJzZSBjb2RlZCkiKQ0KDQpwMiA8LSBnZ3Bsb3Qoc3Vic2V0KGRhdGEsIGNvbmRpdGlvbi5icz09InVuZnJpZW5kbHktdW5mcmllbmRseSIpLCBhZXMoeD1kaWZmLmQuYSkpICsgeGxpbSgtNiw2KSArIHRoZW1lX3B1YigpICsNCiAgIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5zaXRbMV0sIGJpbndpZHRoPTEpICsgDQogICBsYWJzKHRpdGxlPSJjb25ncnVlbnQiLCBzdWJ0aXRsZT0iKGJlaGF2aW9yOiBsb3csIHNpdHVhdGlvbjogbG93KSIsDQogICAgICAgIHg9IkRldmlhdGlvbiBvZiBzdGF0ZSBhZ3JlZWFibGVuZXNzIGZyb20gZGVjZXB0aW9uIChyZXZlcnNlIGNvZGVkKSIpDQoNCnAzIDwtIGdncGxvdChzdWJzZXQoZGF0YSwgY29uZGl0aW9uLmJzPT0iZnJpZW5kbHktdW5mcmllbmRseSIpLCBhZXMoeD1kaWZmLmQuYSkpICsgeGxpbSgtNiw2KSArIHRoZW1lX3B1YigpICsNCiAgIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5zaXRbMV0sIGJpbndpZHRoPTEpICsgDQogICBsYWJzKHRpdGxlPSJpbmNvbmdydWVudCIsIHN1YnRpdGxlPSIoYmVoYXZpb3I6IGhpZ2gsIHNpdHVhdGlvbjogbG93KSIsDQogICAgICAgIHg9IkRldmlhdGlvbiBvZiBzdGF0ZSBhZ3JlZWFibGVuZXNzIGZyb20gZGVjZXB0aW9uIChyZXZlcnNlIGNvZGVkKSIpDQoNCnA0IDwtIGdncGxvdChzdWJzZXQoZGF0YSwgY29uZGl0aW9uLmJzPT0idW5mcmllbmRseS1mcmllbmRseSIpLCBhZXMoeD1kaWZmLmQuYSkpICsgeGxpbSgtNiw2KSArIHRoZW1lX3B1YigpICsNCiAgIGdlb21faGlzdG9ncmFtKGNvbG9yPSJibGFjayIsIGZpbGw9Y29scy5zaXRbMV0sIGJpbndpZHRoPTEpICsgDQogICBsYWJzKHRpdGxlPSJpbmNvbmdydWVudCIsIHN1YnRpdGxlPSIoYmVoYXZpb3I6IGxvdywgc2l0dWF0aW9uOiBoaWdoKSIsDQogICAgICAgIHg9IkRldmlhdGlvbiBvZiBzdGF0ZSBhZ3JlZWFibGVuZXNzIGZyb20gZGVjZXB0aW9uIChyZXZlcnNlIGNvZGVkKSIpDQoNCg0KIyMgY29tYmluZSBwbG90cw0KKHAxK3AyKS8NCiAgIHBsb3Rfc3BhY2VyKCkvDQogICAocDMrcDQpICsgcGxvdF9sYXlvdXQoaGVpZ2h0cz1jKDEsMC4yLDEpKSArIA0KICAgcGxvdF9hbm5vdGF0aW9uKA0KICAgICAgdGl0bGUgPSAnU3RhdGUtU2l0dWF0aW9uIENvbmdydWVuY2UnLA0KICAgICAgc3VidGl0bGUgPSAnRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiByZXZlcnNlLWNvZGVkIGRlY2VwdGlvbiBhbmQgc3RhdGUgYWdyZWVhYmxlbmVzcyBpbiB0aGUgZm91ciBleHBlcmltZW50YWwgZ3JvdXBzJw0KICAgKSANCg0KYGBgDQoNCmBgYHtyLCBmaWcuYXNwPTAuOCwgZmlnLndpZHRoPTExLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZmlnLmNhcD0iSGlzdG9ncmFtcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIGJldHdlZW4gc2l0dWF0aW9uIGNoYXJhY3RlcmlzdGljcyBhbmQgcGVyc29uYWxpdHkgc3RhdGVzIGFzIGEgZGVzY3JpcHRpdmUgaW5kaWNhdG9yIG9mIGNvbmdydWVuY2UgaW4gdGhlIGRpZmZlcmVudCBleHBlcmltZW50YWwgZ3JvdXBzLiJ9DQoNCnAxIDwtIGdncGxvdChzdWJzZXQoZGF0YSwgY29uZGl0aW9uLmJzPT0iZnJpZW5kbHktZnJpZW5kbHkiKSwgYWVzKHg9ZGlmZi5hLmgpKSArIHhsaW0oLTYsNikgKyB0aGVtZV9wdWIoKSArDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSArIA0KICAgbGFicyh0aXRsZT0iY29uZ3J1ZW50Iiwgc3VidGl0bGU9IihiZWhlaGF2aW9yOiBoaWdoLCBzaXR1YXRpb246IGhpZ2gpIiwNCiAgICAgICAgeD0iRGV2aWF0aW9uIG9mIHN0YXRlIGhvbmVzdHkgZnJvbSBhZHZlcnNpdHkgKHJldmVyc2UgY29kZWQpIikNCg0KcDIgPC0gZ2dwbG90KHN1YnNldChkYXRhLCBjb25kaXRpb24uYnM9PSJ1bmZyaWVuZGx5LXVuZnJpZW5kbHkiKSwgYWVzKHg9ZGlmZi5hLmgpKSArIHhsaW0oLTYsNikgKyB0aGVtZV9wdWIoKSArDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSArIA0KICAgbGFicyh0aXRsZT0iY29uZ3J1ZW50Iiwgc3VidGl0bGU9IihiZWhhdmlvcjogbG93LCBzaXR1YXRpb246IGxvdykiLA0KICAgICAgICB4PSJEZXZpYXRpb24gb2Ygc3RhdGUgaG9uZXN0eSBmcm9tIGFkdmVyc2l0eSAocmV2ZXJzZSBjb2RlZCkiKQ0KDQpwMyA8LSBnZ3Bsb3Qoc3Vic2V0KGRhdGEsIGNvbmRpdGlvbi5icz09ImZyaWVuZGx5LXVuZnJpZW5kbHkiKSwgYWVzKHg9ZGlmZi5hLmgpKSArIHhsaW0oLTYsNikgKyB0aGVtZV9wdWIoKSArDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSArIA0KICAgbGFicyh0aXRsZT0iaW5jb25ncnVlbnQiLCBzdWJ0aXRsZT0iKGJlaGF2aW9yOiBoaWdoLCBzaXR1YXRpb246IGxvdykiLA0KICAgICAgICB4PSJEZXZpYXRpb24gb2Ygc3RhdGUgaG9uZXN0eSBmcm9tIGFkdmVyc2l0eSAocmV2ZXJzZSBjb2RlZCkiKQ0KDQpwNCA8LSBnZ3Bsb3Qoc3Vic2V0KGRhdGEsIGNvbmRpdGlvbi5icz09InVuZnJpZW5kbHktZnJpZW5kbHkiKSwgYWVzKHg9ZGlmZi5hLmgpKSArIHhsaW0oLTYsNikgKyB0aGVtZV9wdWIoKSArDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSArIA0KICAgbGFicyh0aXRsZT0iaW5jb25ncnVlbnQiLCBzdWJ0aXRsZT0iKGJlaGF2aW9yOiBsb3csIHNpdHVhdGlvbjogaGlnaCkiLA0KICAgICAgICB4PSJEZXZpYXRpb24gb2Ygc3RhdGUgaG9uZXN0eSBmcm9tIGFkdmVyc2l0eSAocmV2ZXJzZSBjb2RlZCkiKQ0KDQoNCiMjIGNvbWJpbmUgcGxvdHMNCihwMStwMikvDQogICBwbG90X3NwYWNlcigpLw0KICAgKHAzK3A0KSArIHBsb3RfbGF5b3V0KGhlaWdodHM9YygxLDAuMiwxKSkgKyANCiAgIHBsb3RfYW5ub3RhdGlvbigNCiAgICAgIHRpdGxlID0gJ1N0YXRlLVNpdHVhdGlvbiBDb25ncnVlbmNlJywNCiAgICAgIHN1YnRpdGxlID0gJ0RpZmZlcmVuY2Ugc2NvcmVzIGJldHdlZW4gcmV2ZXJzZS1jb2RlZCBhZHZlcnNpdHkgYW5kIHN0YXRlIGhvbmVzdHkgaW4gdGhlIGZvdXIgZXhwZXJpbWVudGFsIGdyb3VwcycNCiAgICkNCg0KYGBgDQoNCmBgYHtyLCBmaWcuYXNwPTAuOCwgZmlnLndpZHRoPTExLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlcnJvcj1GQUxTRSwgZmlnLmNhcD0iSGlzdG9ncmFtcyBvZiBkaWZmZXJlbmNlIHNjb3JlcyBiZXR3ZWVuIGJldHdlZW4gc2l0dWF0aW9uIGNoYXJhY3RlcmlzdGljcyBhbmQgcGVyc29uYWxpdHkgc3RhdGVzIGFzIGEgZGVzY3JpcHRpdmUgaW5kaWNhdG9yIG9mIGNvbmdydWVuY2UgaW4gdGhlIGRpZmZlcmVudCBleHBlcmltZW50YWwgZ3JvdXBzLiJ9DQoNCnAxIDwtIGdncGxvdChzdWJzZXQoZGF0YSwgY29uZGl0aW9uLmJzPT0iZnJpZW5kbHktZnJpZW5kbHkiKSwgYWVzKHg9ZGlmZi5kLmgpKSArIHhsaW0oLTYsNikgKyB0aGVtZV9wdWIoKSArDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSArIA0KICAgbGFicyh0aXRsZT0iY29uZ3J1ZW50Iiwgc3VidGl0bGU9IihiZWhlaGF2aW9yOiBoaWdoLCBzaXR1YXRpb246IGhpZ2gpIiwNCiAgICAgICAgeD0iRGV2aWF0aW9uIG9mIHN0YXRlIGhvbmVzdHkgZnJvbSBkZWNlcHRpb24gKHJldmVyc2UgY29kZWQpIikNCg0KcDIgPC0gZ2dwbG90KHN1YnNldChkYXRhLCBjb25kaXRpb24uYnM9PSJ1bmZyaWVuZGx5LXVuZnJpZW5kbHkiKSwgYWVzKHg9ZGlmZi5kLmgpKSArIHhsaW0oLTYsNikgKyB0aGVtZV9wdWIoKSArDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSArIA0KICAgbGFicyh0aXRsZT0iY29uZ3J1ZW50Iiwgc3VidGl0bGU9IihiZWhhdmlvcjogbG93LCBzaXR1YXRpb246IGxvdykiLA0KICAgICAgICB4PSJEZXZpYXRpb24gb2Ygc3RhdGUgaG9uZXN0eSBmcm9tIGRlY2VwdGlvbiAocmV2ZXJzZSBjb2RlZCkiKQ0KDQpwMyA8LSBnZ3Bsb3Qoc3Vic2V0KGRhdGEsIGNvbmRpdGlvbi5icz09ImZyaWVuZGx5LXVuZnJpZW5kbHkiKSwgYWVzKHg9ZGlmZi5kLmgpKSArIHhsaW0oLTYsNikgKyB0aGVtZV9wdWIoKSArDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSArIA0KICAgbGFicyh0aXRsZT0iaW5jb25ncnVlbnQiLCBzdWJ0aXRsZT0iKGJlaGF2aW9yOiBoaWdoLCBzaXR1YXRpb246IGxvdykiLA0KICAgICAgICB4PSJEZXZpYXRpb24gb2Ygc3RhdGUgaG9uZXN0eSBmcm9tIGRlY2VwdGlvbiAocmV2ZXJzZSBjb2RlZCkiKQ0KDQpwNCA8LSBnZ3Bsb3Qoc3Vic2V0KGRhdGEsIGNvbmRpdGlvbi5icz09InVuZnJpZW5kbHktZnJpZW5kbHkiKSwgYWVzKHg9ZGlmZi5kLmgpKSArIHhsaW0oLTYsNikgKyB0aGVtZV9wdWIoKSArDQogICBnZW9tX2hpc3RvZ3JhbShjb2xvcj0iYmxhY2siLCBmaWxsPWNvbHMuc2l0WzFdLCBiaW53aWR0aD0xKSArIA0KICAgbGFicyh0aXRsZT0iaW5jb25ncnVlbnQiLCBzdWJ0aXRsZT0iKGJlaGF2aW9yOiBsb3csIHNpdHVhdGlvbjogaGlnaCkiLA0KICAgICAgICB4PSJEZXZpYXRpb24gb2Ygc3RhdGUgaG9uZXN0eSBmcm9tIGRlY2VwdGlvbiAocmV2ZXJzZSBjb2RlZCkiKQ0KDQoNCiMjIGNvbWJpbmUgcGxvdHMNCihwMStwMikvDQogICBwbG90X3NwYWNlcigpLw0KICAgKHAzK3A0KSArIHBsb3RfbGF5b3V0KGhlaWdodHM9YygxLDAuMiwxKSkgKw0KICAgcGxvdF9hbm5vdGF0aW9uKA0KICAgICAgdGl0bGUgPSAnU3RhdGUtU2l0dWF0aW9uIENvbmdydWVuY2UnLA0KICAgICAgc3VidGl0bGUgPSAnRGlmZmVyZW5jZSBzY29yZXMgYmV0d2VlbiByZXZlcnNlLWNvZGVkIGRlY2VwdGlvbiBhbmQgc3RhdGUgaG9uZXN0eSBpbiB0aGUgZm91ciBleHBlcmltZW50YWwgZ3JvdXBzJw0KICAgKSANCg0KYGBg