Recording Keeping:

There are two master files that we are using for analyses. They are essentially the same file, though one is in wide format and the other is in long format.

The wide format dataset is called “Purrble_Master_Wide.” The long dataset format dataset is called “Purrble_Long_Master.” The wide dataset has all of the pre and posttest variables calculated, while the long does not. Otherwise, they do not differ.

This dataset includes the N=153 participants who were included in the randomized control trial examining Purrble with a population of university students. All participants were members of the LGTBQ+ community.

We use the “final” datasets in which we removed participant C72, who had no information on gender identity.

Preliminary Analyses

Sample Characteristics

These tables report the count of participants by condition, identity group, and by condition x identity group.

Table 1: Number of Participants by Condition
condition Count
Purrble Treatment 76
Waitlist Control 77
Total 153
Table 2: Number of Participants by Gender Identity
identity_group Count
Cisgender 76
Transgender 77
Total 153
Table 3: Cross-tabulation of Condition by Gender Identity
condition Cisgender TGD
Purrble Treatment 39 37
Waitlist Control 37 40

Age: Descriptives and Check for Baseline differences

Summarizes age (Mean, SD, Min, Max) by condition and runs a t-test comparing age by condition.

Table: Descriptive Statistics for Age by Condition (APA Format)

condition

Mean

SD

Min

Max

Purrble Treatment

20.44

2.29

16.00

25.00

Waitlist Control

20.09

2.46

16.00

25.00

Dependent Variable

t

df

p

d

95% CI

age

0.92

151.17

.361

0.15

[-0.17, 0.46]

Race, Nationality, and Sexual Orientation Descriptives

Sexual Orientation- Simplified

Table X. Simplified Sexual Orientation by Condition (n, %)
Sexual Orientation Waitlist (n, %) Purrble (n, %) Total (n, %)
asexual 9 (11.7%) 13 (17.1%) 22 (14.4%)
bisexual 25 (32.5%) 28 (36.8%) 53 (34.6%)
demisexual 1 (1.3%) 2 (2.6%) 3 (2%)
gay/lesbian 18 (23.4%) 11 (14.5%) 29 (19%)
heterosexual 0 (0%) 1 (1.3%) 1 (0.7%)
pansexual 9 (11.7%) 8 (10.5%) 17 (11.1%)
queer 15 (19.5%) 13 (17.1%) 28 (18.3%)

Nationality

Table: Nationality by Condition (Counts and Percentages)
Nationality Waitlist Control Purrble Treatment Total
bangladeshi 1 (1.3%) 0 (0%) 1 (0.7%)
british 36 (46.8%) 34 (44.7%) 70 (45.8%)
british-carribean 1 (1.3%) 1 (1.3%) 2 (1.3%)
british-indian 0 (0%) 1 (1.3%) 1 (0.7%)
british-japanese 1 (1.3%) 0 (0%) 1 (0.7%)
british-pakistani 1 (1.3%) 0 (0%) 1 (0.7%)
chinese 5 (6.5%) 1 (1.3%) 6 (3.9%)
filipino 0 (0%) 1 (1.3%) 1 (0.7%)
indian 5 (6.5%) 3 (3.9%) 8 (5.2%)
indonesian 1 (1.3%) 0 (0%) 1 (0.7%)
iranian 1 (1.3%) 0 (0%) 1 (0.7%)
irish 1 (1.3%) 1 (1.3%) 2 (1.3%)
irish-american 0 (0%) 1 (1.3%) 1 (0.7%)
irish-carribean 1 (1.3%) 0 (0%) 1 (0.7%)
malaysian chinese 1 (1.3%) 0 (0%) 1 (0.7%)
mexican 0 (0%) 1 (1.3%) 1 (0.7%)
nr 20 (26%) 29 (38.2%) 49 (32%)
pakistani 0 (0%) 1 (1.3%) 1 (0.7%)
polish 2 (2.6%) 2 (2.6%) 4 (2.6%)

Race

Table: Race Counts and Percentages by Condition
Race
Purrble Treatment
Waitlist Control
Total
Race count_Purrble Treatment percentage_Purrble Treatment count_Waitlist Control percentage_Waitlist Control total_count total_percentage
Race_Arabic 0 0.0 1 1.3 1 0.7
Race_Asian 10 13.2 17 22.1 27 17.6
Race_Black 1 1.3 3 3.9 4 2.6
Race_Hispanic 2 2.6 0 0.0 2 1.3
Race_White 60 78.9 55 71.4 115 75.2
Race_unknown 9 11.8 5 6.5 14 9.2
5 people in the Purrble Treatment condition reported multiple racial identities.
4 people in the Waitlist Control condition reported multiple racial identities.

Participation Over Time

Note: Weeks 1-3 were considered “pre-test.” Purrble was given (or not) after week 3. Weeks 11-13 are considered “Post-test”. ### Participation in Each Week over Time Analyses for the entire study and by treatment condition. Note: Something wonky in the table broken down by condition where Week 4 appears out of order- I don’t know why. The data is accurate.

### **Number of Participants in Each Condition**
Participant Counts by Condition
Condition N
Purrble 76
Waitlist Control 77

### **Completion Counts Over Time**
Number of Participants Completing Each Week
Week Count
1 146
2 148
3 149
4 141
5 138
6 138
7 138
8 141
9 126
10 128
11 128
12 117
13 130

### **Completion Counts by Week and Condition**
Number of Participants Completing Each Week (Columns: Weeks 1–13; Rows: Conditions)
Condition 1 2 3 5 6 7 8 9 10 12 13 4 11
Purrble 73 74 75 68 67 68 68 60 63 50 62 71 62
Waitlist Control 73 74 74 70 71 70 73 66 65 67 68 70 66

Follow-Up: Differences in Slope between the Two Groups Over Time

We examined whether the rate of decline in weekly completion counts differed between the Purrble and Waitlist Control groups by fitting a linear regression on aggregated counts (Count) with predictors Week (centered at Week 0), Condition (Waitlist Control = 0, Purrble = 1), and their interaction (Week × Condition). The interaction term (Week × Condition) was significant, B = −0.87, SE = 0.31, p = .009, indicating that the Purrble group’s weekly decline (approximately −1.52 participants per week) was significantly greater than in the Waitlist Control group (−0.65 participants per week).

### **Linear Model: Count ~ Week × Condition**
Regression Coefficients for Count ~ Week * Condition
Term Estimate Std. Error p-value
(Intercept) 74.3076923 1.7131218 0.0000000
Week -0.6483516 0.2158331 0.0065345
conditionPurrble 2.5769231 2.4227201 0.2990240
Week:conditionPurrble -0.8736264 0.3052340 0.0090576

### **Interaction Term (Difference in Slope)**
Week:conditionPurrble — Slope Difference (Purrble vs Waitlist)
Term Estimate Std. Error p-value
Week:conditionPurrble -0.8736264 0.305234 0.0090576

**Interpretation:**
The Week × condition interaction is statistically significant (p = 0.00906 ), indicating that the slope of completion counts over time differs between conditions.

Descriptives in Number of Sessions Attended

Descriptives of number of sessions attended by condition and gender identity group.

Table 2: Overall Total Sessions Attended
mean_sessions sd_sessions
12.60784 2.155883
Table 3: Total Sessions Attended by Condition
condition mean_sessions sd_sessions n
0 12.85714 2.056532 77
1 12.35526 2.237284 76
Table 4: Total Sessions Attended by Gender Identity
identity_group mean_sessions sd_sessions n
0 12.53947 2.193571 76
1 12.67532 2.130243 77
Table 5: Total Sessions Attended by Condition and Gender Identity
condition identity_group mean_sessions sd_sessions n
0 0 13.13514 1.417395 37
0 1 12.60000 2.499231 40
1 0 11.97436 2.630661 39
1 1 12.75676 1.673410 37

Attrition Analysis

Attrition is defined here as not having attended any post-test session (i.e., no attendance during Weeks 11–13). We create a binary indicator for post-test completion (1 = attended at least one post-test session, 0 = none) and calculate attrition rates overall, by condition and by gender identity. We used a chi-square test to determine if attrition differed by condition; it did not. ### Attrition Analysis by Condition The conditions did not significantly differ on any of the baseline measures of outcomes or by age. Attrition rates were low across both conditions, with 9.2% of participants in the Purrble condition and 6.5% in the Waitlist Control condition not completing the study. Attrition did not differ by condition, χ²(1) = 0.11, p = .75, or by gender identity, χ²(1) < 0.01, p = 1.

Chi-square test for differences in attrition by condition:

    Pearson's Chi-squared test with Yates' continuity correction

data:  attrition_ct
X-squared = 0.10517, df = 1, p-value = 0.7457
Table 7: Attrition Rate by Condition (with Completed and Not Completed counts)
condition n Completed Not_Completed attrition_rate attrition_percent
0 77 72 5 0.0649351 6.5
1 76 69 7 0.0921053 9.2

Attrition by Gender Identity

No differences!

Chi-square test for differences in attrition by gender identity:

    Pearson's Chi-squared test with Yates' continuity correction

data:  attrition_ct
X-squared = 1.4323e-30, df = 1, p-value = 1
Table 8: Attrition Rate by Gender Identity (with Completed and Not Completed counts)
identity_group n Completed Not_Completed attrition_rate attrition_percent
0 76 70 6 0.0789474 7.9
1 77 71 6 0.0779221 7.8

Attrition by Baseline Level of the Outcomes

In this section, we examined whether baseline scores on key outcome measures were associated with either condition or attrition status, or whether the effects of these two factors interacted. Loneliness was significant; follow-up below

Two-way ANOVA results for Pre_DERS8_Sum :
Two-way ANOVA for Pre_DERS8_Sum by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 7.983 7.983 0.356 0.552
attrition_status 1 30.432 30.432 1.356 0.246
condition:attrition_status 1 2.561 2.561 0.114 0.736
Residuals 148 3320.444 22.435 NA NA


Two-way ANOVA results for Pre_GAD7_Sum :
Two-way ANOVA for Pre_GAD7_Sum by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 0.658 0.658 0.041 0.841
attrition_status 1 1.190 1.190 0.073 0.787
condition:attrition_status 1 0.001 0.001 0.000 0.994
Residuals 148 2401.630 16.227 NA NA


Two-way ANOVA results for Pre_PHQ9_Sum :
Two-way ANOVA for Pre_PHQ9_Sum by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 18.249 18.249 0.859 0.356
attrition_status 1 2.796 2.796 0.132 0.717
condition:attrition_status 1 4.207 4.207 0.198 0.657
Residuals 148 3144.123 21.244 NA NA


Two-way ANOVA results for Pre_SHS_Pathways :
Two-way ANOVA for Pre_SHS_Pathways by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 35.106 35.106 1.907 0.169
attrition_status 1 3.918 3.918 0.213 0.645
condition:attrition_status 1 25.587 25.587 1.390 0.240
Residuals 144 2651.435 18.413 NA NA


Two-way ANOVA results for Pre_SHS_Agency :
Two-way ANOVA for Pre_SHS_Agency by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 34.935 34.935 1.450 0.231
attrition_status 1 8.541 8.541 0.354 0.553
condition:attrition_status 1 79.905 79.905 3.315 0.071
Residuals 144 3470.489 24.101 NA NA


Two-way ANOVA results for Pre_SHS_TotalHope :
Two-way ANOVA for Pre_SHS_TotalHope by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 140.081 140.081 2.039 0.155
attrition_status 1 24.029 24.029 0.350 0.555
condition:attrition_status 1 195.924 195.924 2.852 0.093
Residuals 144 9893.938 68.708 NA NA


Two-way ANOVA results for Pre_ucla_Sum :
Two-way ANOVA for Pre_ucla_Sum by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 3.945 3.945 1.556 0.214
attrition_status 1 1.318 1.318 0.520 0.472
condition:attrition_status 1 13.182 13.182 5.199 0.024
Residuals 143 362.575 2.535 NA NA


Two-way ANOVA results for Pre_pmerq_Focus_Avg :
Two-way ANOVA for Pre_pmerq_Focus_Avg by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 1.392 1.392 1.243 0.267
attrition_status 1 2.233 2.233 1.995 0.160
condition:attrition_status 1 1.281 1.281 1.144 0.287
Residuals 144 161.212 1.120 NA NA


Two-way ANOVA results for Pre_pmerq_Distract_Avg :
Two-way ANOVA for Pre_pmerq_Distract_Avg by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 1.554 1.554 1.247 0.266
attrition_status 1 4.213 4.213 3.380 0.068
condition:attrition_status 1 0.038 0.038 0.031 0.861
Residuals 144 179.482 1.246 NA NA


Two-way ANOVA results for Pre_pmerq_AD_Avg :
Two-way ANOVA for Pre_pmerq_AD_Avg by Condition and Attrition Status
term df sumsq meansq statistic p.value
condition 1 1.472 1.472 1.762 0.186
attrition_status 1 3.145 3.145 3.766 0.054
condition:attrition_status 1 0.440 0.440 0.527 0.469
Residuals 144 120.256 0.835 NA NA
NA

UCLA Loneliess Follow Up:

Results: Among Attriters, baseline loneliness was significantly higher in the Waitlist Control group compared to the Purrble group, t(143) = 2.51, p = .013. Among Completers, there was no significant difference in baseline loneliness scores by condition, t(143) = 0.58, p = .56.

attrition_status = Attriter:
 condition_factor emmean    SE  df lower.CL upper.CL
 Waitlist Control   8.25 0.796 143     6.68     9.82
 Purrble            5.67 0.650 143     4.38     6.95

attrition_status = Completer:
 condition_factor emmean    SE  df lower.CL upper.CL
 Waitlist Control   7.19 0.192 143     6.81     7.57
 Purrble            7.03 0.193 143     6.65     7.41

Confidence level used: 0.95 
attrition_status = Attriter:
 contrast                   estimate    SE  df t.ratio p.value
 Waitlist Control - Purrble    2.583 1.030 143   2.513  0.0131

attrition_status = Completer:
 contrast                   estimate    SE  df t.ratio p.value
 Waitlist Control - Purrble    0.159 0.272 143   0.584  0.5599

Cohen's d |        95% CI
-------------------------
0.10      | [-0.24, 0.43]

- Estimated using pooled SD.Cohen's d |       95% CI
------------------------
1.95      | [0.33, 3.48]

- Estimated using pooled SD.

Descriptive Statistics for Pre_ucla_Sum by Condition and Attrition Status

condition

attrition_status

N

Mean

SD

0

Attriter

5

8.25

0.96

0

Completer

72

7.19

1.35

1

Attriter

7

5.67

1.51

1

Completer

69

7.03

1.83

Note. Means and standard deviations for Pre_ucla_Sum across four groups defined by condition (Purrble, Waitlist Control) and attrition status (Completer, Attriter).

Simple Effects Analysis: Pre_ucla_Sum by Attrition Status within the Purrble Condition

Dependent Variable

t

df

p

d

95% CI

Pre_ucla_Sum

-2.09

6.38

.079

-0.75

[-1.60, 0.09]


Simple Effects Analysis: Pre_ucla_Sum by Attrition Status within the Waitlist Control Condition

Dependent Variable

t

df

p

d

95% CI

Pre_ucla_Sum

2.10

3.73

.109

0.79

[-0.23, 1.81]

Baseline Outcome Variables Analyses

Reliability

DERS-8 Cronbach’s α = 0.886 
GAD-7 Cronbach’s α = 0.87 
PHQ-9 Cronbach’s α = 0.859 
SHS Total Cronbach’s α = 0.867 
UCLA Loneliness Cronbach’s α = 0.767 
PMERQ-Engage Cronbach’s α = 0.869 

Descriptive Analyses

The table below shows Pre- and Post-Test Descriptives for Study Variables


### **Pre-Test Descriptive Statistics**
Descriptive Statistics for Pre-Test Data
N Mean SD Min Max Skewness Kurtosis
Pre_DERS8_Sum 152 28.148 4.718 14.333 38.333 -0.419 -0.132
Pre_GAD7_Sum 152 13.715 3.990 3.000 22.000 -0.166 -0.457
Pre_PHQ9_Sum 152 15.044 4.581 3.000 26.667 -0.019 -0.098
Pre_SHS_Pathways 148 13.287 4.298 3.000 24.000 -0.132 -0.420
Pre_SHS_Agency 148 10.699 4.945 3.000 24.000 0.343 -0.657
Pre_SHS_TotalHope 148 23.986 8.352 8.000 46.000 0.286 -0.304
Pre_ucla_Sum 147 7.082 1.615 3.000 9.000 -0.499 -0.663
Pre_pmerq_Focus_Avg 148 2.737 1.063 1.000 6.000 0.420 -0.095
Pre_pmerq_Distract_Avg 148 4.233 1.123 1.000 6.000 -0.857 0.698
Pre_pmerq_AD_Avg 148 3.485 0.923 1.000 6.000 -0.334 0.520

### **Post-Test Descriptive Statistics**
Descriptive Statistics for Post-Test Data
N Mean SD Min Max Skewness Kurtosis
Post_DERS8_Sum 141 26.972 7.343 8 40 -0.266 -0.835
Post_GAD7_Sum 141 12.613 4.994 1 22 -0.071 -0.771
Post_PHQ9_Sum 141 14.314 6.331 0 27 -0.004 -0.696
Post_SHS_Pathways 130 14.700 4.305 3 24 -0.266 -0.430
Post_SHS_Agency 130 12.646 5.228 3 24 -0.015 -0.855
Post_SHS_TotalHope 130 27.346 8.806 6 47 -0.058 -0.483
Post_ucla_Sum 130 6.785 1.698 3 9 -0.409 -0.678
Post_pmerq_Focus_Avg 129 3.008 1.185 1 6 0.289 -0.301
Post_pmerq_Distract_Avg 129 4.336 1.058 1 6 -1.127 1.635
Post_pmerq_AD_Avg 129 3.672 0.951 1 6 -0.334 0.951

Basleine Equivalence of Outcomes (t‑Tests):

We run independent samples t‑tests comparing the two conditions on each pre‑test variable using nice_t_test from rempsyc. This provides t‑statistics, degrees of freedom, p‑values, effect sizes (Cohen’s d), and confidence intervals, all formatted into an APA‑style table. Result: No differences by chance.

Outlier Detection and Visualization :

We first convert each pre‑test variable to z‑scores and flag any observations with an absolute z‑score greater than 3 as potential outliers. A summary table is created that lists the number of outliers for each variable. We then specifically inspect the outliers for the Pre_pmerq_Focus_Avg variable, which appears to have two cases exceeding our threshold. To better understand the distribution of Pre_pmerq_Focus_Avg, we generate a boxplot (with jittered data points) that visually highlights the extreme values.

Summary of Potential Outliers (|z| > 3) for Pre-Test Variables:
Summary of Outliers for Pre-Test Variables (|z| > 3)
Variable Outlier_Count
Pre_DERS8_Sum 0
Pre_GAD7_Sum 0
Pre_PHQ9_Sum 0
Pre_SHS_Pathways 0
Pre_SHS_Agency 0
Pre_SHS_TotalHope 0
Pre_ucla_Sum 0
Pre_pmerq_Focus_Avg 2
Pre_pmerq_Distract_Avg 0
Pre_pmerq_AD_Avg 0

Outliers for Pre_pmerq_Focus_Avg (|z| > 3):
Outliers for Pre_pmerq_Focus_Avg
psid Pre_pmerq_Focus_Avg z
C57 6 3.069197
C79 6 3.069197

Main Effects Analyses

We fit linear regression models to examine the effect of condition (coded as 1 = Purrble, 0 = Waitlist Control) on post-test outcomes, controlling for baseline levels of the outcome, gender identity (numeric), and age. DERS-8: Participants in the Purrble condition reported significantly better outcomes at post-test PPMERQ-AD: A significant positive effect of condition was found PHQ-9: The Purrble group showed lower depressive symptoms at post-test GAD-7: The condition effect was also significant, though smaller, favoring Purrble condition.

Dependent Variable

Predictor

df

b

t

p

sr2

95% CI

Post_DERS8_Sum

condition_num

135

-3.04

-3.20

.002**

.04

[0.00, 0.09]

Pre_DERS8_Sum

135

0.92

9.21

< .001***

.35

[0.23, 0.48]

identity_group_num

135

1.69

1.72

.088

.01

[0.00, 0.04]

age

135

0.13

0.60

.549

.00

[0.00, 0.01]

Post_pmerq_Focus_Avg

condition_num

121

0.31

1.96

.052

.02

[0.00, 0.05]

Pre_pmerq_Focus_Avg

121

0.73

9.40

< .001***

.39

[0.26, 0.52]

identity_group_num

121

-0.27

-1.61

.110

.01

[0.00, 0.04]

age

121

0.02

0.45

.654

.00

[0.00, 0.01]

Post_pmerq_Distract_Avg

condition_num

121

0.25

1.49

.138

.01

[0.00, 0.05]

Pre_pmerq_Distract_Avg

121

0.48

6.48

< .001***

.25

[0.12, 0.38]

identity_group_num

121

0.20

1.19

.238

.01

[0.00, 0.04]

age

121

0.02

0.64

.526

.00

[0.00, 0.02]

Post_pmerq_AD_Avg

condition_num

121

0.30

2.28

.024*

.02

[0.00, 0.06]

Pre_pmerq_AD_Avg

121

0.70

9.54

< .001***

.42

[0.29, 0.55]

identity_group_num

121

-0.04

-0.32

.747

.00

[0.00, 0.01]

age

121

0.03

1.06

.290

.01

[0.00, 0.02]

Post_GAD7_Sum

condition_num

135

-1.35

-2.04

.044*

.02

[0.00, 0.05]

Pre_GAD7_Sum

135

0.74

8.98

< .001***

.35

[0.23, 0.48]

identity_group_num

135

0.75

1.08

.281

.01

[0.00, 0.02]

age

135

0.27

1.84

.068

.01

[0.00, 0.05]

Post_PHQ9_Sum

condition_num

135

-2.60

-3.64

< .001***

.04

[0.00, 0.09]

Pre_PHQ9_Sum

135

1.00

12.96

< .001***

.53

[0.42, 0.65]

identity_group_num

135

0.25

0.34

.734

.00

[0.00, 0.00]

age

135

0.29

1.86

.064

.01

[0.00, 0.03]

Post_SHS_Pathways

condition_num

122

0.09

0.14

.889

.00

[0.00, 0.00]

Pre_SHS_Pathways

122

0.46

6.04

< .001***

.21

[0.09, 0.34]

identity_group_num

122

-0.84

-1.19

.237

.01

[0.00, 0.04]

age

122

-0.28

-1.86

.065

.02

[0.00, 0.06]

Post_SHS_Agency

condition_num

122

0.44

0.53

.595

.00

[0.00, 0.01]

Pre_SHS_Agency

122

0.53

6.57

< .001***

.26

[0.13, 0.39]

identity_group_num

122

-0.47

-0.55

.582

.00

[0.00, 0.01]

age

122

-0.17

-0.96

.337

.01

[0.00, 0.03]

Post_SHS_TotalHope

condition_num

122

0.62

0.46

.648

.00

[0.00, 0.01]

Pre_SHS_TotalHope

122

0.53

6.71

< .001***

.26

[0.13, 0.39]

identity_group_num

122

-1.16

-0.82

.414

.00

[0.00, 0.02]

age

122

-0.43

-1.45

.151

.01

[0.00, 0.04]

Post_ucla_Sum

condition_num

121

-0.09

-0.40

.688

.00

[0.00, 0.01]

Pre_ucla_Sum

121

0.70

10.02

< .001***

.43

[0.30, 0.56]

identity_group_num

121

0.52

2.20

.030*

.02

[0.00, 0.06]

age

121

0.11

2.12

.036*

.02

[0.00, 0.05]

Main Effects without outliers

Model Summary (Full Dataset):

Call:
lm(formula = Post_pmerq_Focus_Avg ~ condition_num + Pre_pmerq_Focus_Avg + 
    identity_group_num + age, data = Purrble_Master_Wide)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.16585 -0.64258 -0.05799  0.42448  2.73318 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          0.67215    0.93052   0.722   0.4715    
condition_num        0.31072    0.15864   1.959   0.0525 .  
Pre_pmerq_Focus_Avg  0.73177    0.07788   9.396 4.43e-16 ***
identity_group_num  -0.27202    0.16888  -1.611   0.1098    
age                  0.01586    0.03528   0.450   0.6538    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8845 on 121 degrees of freedom
  (27 observations deleted due to missingness)
Multiple R-squared:  0.4612,    Adjusted R-squared:  0.4434 
F-statistic: 25.89 on 4 and 121 DF,  p-value: 1.635e-15


Model Summary (Outliers Removed):

Call:
lm(formula = Post_pmerq_Focus_Avg ~ condition_num + Pre_pmerq_Focus_Avg + 
    identity_group_num + age, data = Purrble_Master_Wide_no_outliers)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.14889 -0.64074 -0.06666  0.43406  2.70464 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
(Intercept)          0.72091    0.95012   0.759   0.4495    
condition_num        0.31636    0.16113   1.963   0.0519 .  
Pre_pmerq_Focus_Avg  0.71604    0.08537   8.388 1.17e-13 ***
identity_group_num  -0.26936    0.17004  -1.584   0.1158    
age                  0.01469    0.03567   0.412   0.6812    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8902 on 119 degrees of freedom
  (27 observations deleted due to missingness)
Multiple R-squared:  0.4078,    Adjusted R-squared:  0.3879 
F-statistic: 20.48 on 4 and 119 DF,  p-value: 7.335e-13


Influential Observations in the Full Model (Cook's Distance > 0.027):
[1] "C15" "C16" "C17" "C47" "C71" "T15" "T22" "T31" "T48"

Comparison of Model Estimates for Post_pmerq_Focus_Avg
Model Number Dependent Variable Predictor df b t p sr2 CI_lower CI_upper
Full1 1 Post_pmerq_Focus_Avg condition_num 121 0.311 1.959 0.052 0.017 0.000 0.051
Full2 1 Post_pmerq_Focus_Avg Pre_pmerq_Focus_Avg 121 0.732 9.396 0.000 0.393 0.263 0.523
Full3 1 Post_pmerq_Focus_Avg identity_group_num 121 -0.272 -1.611 0.110 0.012 0.000 0.039
Full4 1 Post_pmerq_Focus_Avg age 121 0.016 0.450 0.654 0.001 0.000 0.009
No Outliers1 2 Post_pmerq_Focus_Avg condition_num 119 0.316 1.963 0.052 0.019 0.000 0.057
No Outliers2 2 Post_pmerq_Focus_Avg Pre_pmerq_Focus_Avg 119 0.716 8.388 0.000 0.350 0.218 0.483
No Outliers3 2 Post_pmerq_Focus_Avg identity_group_num 119 -0.269 -1.584 0.116 0.012 0.000 0.043
No Outliers4 2 Post_pmerq_Focus_Avg age 119 0.015 0.412 0.681 0.001 0.000 0.009

Moderation Models for Main Effects

These models look at two questions: (1) Does the impact of condition depend on participants’ baseline level of that outcome? and (2) Does the impact of condition differ for TGD vs. cis participants? We find significant moderation by gender identity for DERS-8 and GAD-7; none for baseline version of the outcome.

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_DERS8_Sum

condition_num

134

-0.21

-3.17

.002**

.04

[0.00, 0.09]

Pre_DERS8_Sum

134

0.60

9.18

< .001***

.35

[0.23, 0.48]

identity_group_num

134

0.12

1.71

.089

.01

[0.00, 0.04]

age

134

0.04

0.53

.595

.00

[0.00, 0.01]

condition_num × Pre_DERS8_Sum

134

-0.04

-0.65

.517

.00

[0.00, 0.01]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_Focus_Avg

condition_num

120

0.13

1.93

.056

.02

[0.00, 0.05]

Pre_pmerq_Focus_Avg

120

0.65

9.35

< .001***

.39

[0.26, 0.52]

identity_group_num

120

-0.13

-1.74

.085

.01

[0.00, 0.04]

age

120

0.03

0.49

.625

.00

[0.00, 0.01]

condition_num × Pre_pmerq_Focus_Avg

120

-0.07

-1.02

.309

.00

[0.00, 0.02]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_Distract_Avg

condition_num

120

0.11

1.45

.150

.01

[0.00, 0.05]

Pre_pmerq_Distract_Avg

120

0.52

6.50

< .001***

.25

[0.12, 0.38]

identity_group_num

120

0.10

1.18

.241

.01

[0.00, 0.04]

age

120

0.06

0.66

.510

.00

[0.00, 0.02]

condition_num × Pre_pmerq_Distract_Avg

120

-0.05

-0.67

.505

.00

[0.00, 0.02]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_AD_Avg

condition_num

120

0.15

2.24

.027*

.02

[0.00, 0.06]

Pre_pmerq_AD_Avg

120

0.67

9.45

< .001***

.42

[0.29, 0.55]

identity_group_num

120

-0.03

-0.36

.722

.00

[0.00, 0.01]

age

120

0.08

1.07

.288

.01

[0.00, 0.02]

condition_num × Pre_pmerq_AD_Avg

120

-0.03

-0.38

.704

.00

[0.00, 0.01]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_DERS8_Sum

condition_num

134

-0.21

-3.23

.002**

.04

[0.00, 0.09]

identity_group_num

134

0.12

1.75

.082

.01

[0.00, 0.04]

Pre_DERS8_Sum

134

0.59

9.24

< .001***

.35

[0.23, 0.47]

age

134

0.04

0.59

.558

.00

[0.00, 0.01]

condition_num × identity_group_num

134

0.13

2.10

.038*

.02

[0.00, 0.05]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_Focus_Avg

condition_num

120

0.13

2.01

.046*

.02

[0.00, 0.05]

identity_group_num

120

-0.11

-1.55

.124

.01

[0.00, 0.04]

Pre_pmerq_Focus_Avg

120

0.68

9.65

< .001***

.41

[0.28, 0.54]

age

120

0.03

0.48

.630

.00

[0.00, 0.01]

condition_num × identity_group_num

120

0.12

1.79

.076

.01

[0.00, 0.04]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_Distract_Avg

condition_num

120

0.12

1.49

.139

.01

[0.00, 0.05]

identity_group_num

120

0.10

1.19

.238

.01

[0.00, 0.04]

Pre_pmerq_Distract_Avg

120

0.51

6.46

< .001***

.25

[0.12, 0.38]

age

120

0.05

0.63

.528

.00

[0.00, 0.02]

condition_num × identity_group_num

120

0.03

0.37

.708

.00

[0.00, 0.01]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_pmerq_AD_Avg

condition_num

120

0.16

2.31

.023*

.02

[0.00, 0.06]

identity_group_num

120

-0.02

-0.30

.766

.00

[0.00, 0.01]

Pre_pmerq_AD_Avg

120

0.68

9.65

< .001***

.43

[0.30, 0.56]

age

120

0.08

1.09

.279

.01

[0.00, 0.02]

condition_num × identity_group_num

120

0.09

1.30

.197

.01

[0.00, 0.03]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_GAD7_Sum

condition_num

134

-0.14

-2.03

.044*

.02

[0.00, 0.05]

Pre_GAD7_Sum

134

0.59

8.85

< .001***

.35

[0.22, 0.47]

identity_group_num

134

0.08

1.07

.284

.01

[0.00, 0.02]

age

134

0.13

1.83

.069

.01

[0.00, 0.05]

condition_num × Pre_GAD7_Sum

134

0.00

0.07

.941

.00

[0.00, 0.00]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_PHQ9_Sum

condition_num

134

-0.21

-3.64

< .001***

.04

[0.00, 0.09]

Pre_PHQ9_Sum

134

0.73

12.94

< .001***

.53

[0.42, 0.64]

identity_group_num

134

0.02

0.40

.687

.00

[0.00, 0.01]

age

134

0.11

1.83

.070

.01

[0.00, 0.03]

condition_num × Pre_PHQ9_Sum

134

-0.05

-0.88

.380

.00

[0.00, 0.01]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_GAD7_Sum

condition_num

134

-0.13

-2.05

.042*

.02

[0.00, 0.05]

identity_group_num

134

0.08

1.12

.263

.01

[0.00, 0.02]

Pre_GAD7_Sum

134

0.58

8.95

< .001***

.34

[0.22, 0.47]

age

134

0.13

1.85

.067

.01

[0.00, 0.04]

condition_num × identity_group_num

134

0.14

2.18

.031*

.02

[0.00, 0.06]

Dependent Variable

Predictor

df

b*

t

p

sr2

95% CI

Post_PHQ9_Sum

condition_num

134

-0.20

-3.64

< .001***

.04

[0.00, 0.09]

identity_group_num

134

0.02

0.38

.706

.00

[0.00, 0.00]

Pre_PHQ9_Sum

134

0.71

12.79

< .001***

.51

[0.39, 0.63]

age

134

0.11

1.86

.065

.01

[0.00, 0.03]

condition_num × identity_group_num

134

0.10

1.79

.076

.01

[0.00, 0.03]

Follow up: DERS 8

Since the interaction of condition by identity group was signifiacnt, I have to probe it using simple slopes.

Result:

For cisgender participants, controlling for pre‑test emotion regulation, condition significantly predicted post‑test scores, with the intervention yielding lower (i.e., better) scores (b = –4.90, SE = 1.41, t(67) = –3.47, p = .001, adjusted R² = .47). In contrast, for transgender/gender diverse participants, condition was not a significant predictor of post‑test emotion regulation (b = –1.07, SE = 1.23, t(67) = –0.87, p = .39, adjusted R² = .37). sad.


Call:
lm(formula = Post_DERS8_Sum ~ condition_num + Pre_DERS8_Sum, 
    data = filter(Purrble_Master_Wide, identity_group == "0"))

Residuals:
    Min      1Q  Median      3Q     Max 
-15.085  -3.353   1.433   3.929  14.517 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)     4.8137     4.9268   0.977  0.33206    
condition_num  -4.9030     1.4137  -3.468  0.00092 ***
Pre_DERS8_Sum   1.0170     0.1502   6.771 3.89e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.885 on 67 degrees of freedom
  (6 observations deleted due to missingness)
Multiple R-squared:  0.484, Adjusted R-squared:  0.4686 
F-statistic: 31.43 on 2 and 67 DF,  p-value: 2.361e-10


Call:
lm(formula = Post_DERS8_Sum ~ condition_num + Pre_DERS8_Sum, 
    data = filter(Purrble_Master_Wide, identity_group == "1"))

Residuals:
     Min       1Q   Median       3Q      Max 
-12.1803  -2.3719   0.0348   3.7168  10.4756 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)     6.1183     4.1405   1.478    0.144    
condition_num  -1.0671     1.2265  -0.870    0.387    
Pre_DERS8_Sum   0.8226     0.1274   6.456 1.41e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.13 on 67 degrees of freedom
  (7 observations deleted due to missingness)
Multiple R-squared:  0.3885,    Adjusted R-squared:  0.3703 
F-statistic: 21.29 on 2 and 67 DF,  p-value: 6.971e-08

Follow up: GAD 7

Since the interaction of condition by identity group was signifiacnt, I have to probe it using simple slopes. 0= Cisgender participants have significant condition effect 1=Transgender participants have no significant condition effect


Call:
lm(formula = Post_GAD7_Sum ~ condition_num + Pre_GAD7_Sum, data = filter(Purrble_Master_Wide, 
    identity_group == "0"))

Residuals:
    Min      1Q  Median      3Q     Max 
-9.9382 -2.9558 -0.6394  3.4989  9.1100 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)     7.0008     2.4057   2.910  0.00490 ** 
condition_num  -2.7678     1.0084  -2.745  0.00777 ** 
Pre_GAD7_Sum    0.6950     0.1314   5.289 1.46e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.211 on 67 degrees of freedom
  (6 observations deleted due to missingness)
Multiple R-squared:  0.3567,    Adjusted R-squared:  0.3375 
F-statistic: 18.57 on 2 and 67 DF,  p-value: 3.821e-07


Call:
lm(formula = Post_GAD7_Sum ~ condition_num + Pre_GAD7_Sum, data = filter(Purrble_Master_Wide, 
    identity_group == "1"))

Residuals:
    Min      1Q  Median      3Q     Max 
-8.2530 -2.1982  0.0676  2.7371  8.9484 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)     2.0787     1.9095   1.089    0.280    
condition_num   0.1055     0.8587   0.123    0.903    
Pre_GAD7_Sum    0.7715     0.1018   7.577 1.39e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.582 on 67 degrees of freedom
  (7 observations deleted due to missingness)
Multiple R-squared:  0.4635,    Adjusted R-squared:  0.4475 
F-statistic: 28.94 on 2 and 67 DF,  p-value: 8.721e-10

Self-Harm Analyses

Frequencies by Condition and Response over Time

Below, we display a table and graph of the frequency of responses for all self-harm questions, the frequency of flagged responses to each self-harm question over time, and the frequency of flagged responses to each self-harm question over time, separated by condition.

Self-Harm Logistic Regression

Post-test Logistic Regression to Investigate Intervention Effects on Self-Harm Outcomes Result: Condition was not a significant predictor of any self-harm outcome (coded binary).

Characteristic
SHQ1 Model
SHQ2 Model
SHQ3 Model
SHQ_Any Model
OR1,2 SE2 OR1,2 SE2 OR1,2 SE2 OR1,2 SE2
condition







    Purrble Treatment
    Waitlist Control 0.87 0.452 1.02 0.412 1.15 0.546 0.91 0.434
SHQ1_2 11.6*** 0.484





SHQ2_2

4.36*** 0.408



SHQ3_2



3.14* 0.559

SHQ_Any_2





5.83*** 0.486
1 *p<0.05; **p<0.01; ***p<0.001
2 OR = Odds Ratio, SE = Standard Error

Self-Harm Proportional Odds Regression

Frequencies Tables



**Frequencies for shqscreener1_w1 **
Response Count Percent
1 27 18.5
2 47 32.2
3 56 38.4
4 16 11.0


**Frequencies for shqscreener1_w12 **
Response Count Percent
1 47 40.2
2 29 24.8
3 34 29.1
4 7 6.0


**Frequencies for shqscreener2_w1 **
Response Count Percent
1 78 53.4
2 37 25.3
3 27 18.5
4 4 2.7


**Frequencies for shqscreener2_w12 **
Response Count Percent
1 70 59.8
2 27 23.1
3 15 12.8
4 5 4.3


**Frequencies for shqscreener3_w1 **
Response Count Percent
1 118 80.8
2 18 12.3
3 10 6.8


**Frequencies for shqscreener3_w12 **
Response Count Percent
1 100 85.5
2 12 10.3
3 5 4.3

Proportional Odds Models: Brant Tests

All six Brant tests (one for each screener at Week 1 and Week 12) produced non‐significant p‐values, indicating that the proportional‐odds (parallel regression) assumption holds in every case.

-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     1.8 2   0.41
condition1  1.8 2   0.41
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 1 at Week 1:"
                X2 df probability
Omnibus    1.80303  2   0.4059541
condition1 1.80303  2   0.4059541
-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     1.03    2   0.6
condition1  1.03    2   0.6
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 1 at Week 12:"
                 X2 df probability
Omnibus    1.031749  2   0.5969783
condition1 1.031749  2   0.5969783
-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     1.3 2   0.52
condition1  1.3 2   0.52
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 2 at Week 1:"
                 X2 df probability
Omnibus    1.303816  2   0.5210507
condition1 1.303816  2   0.5210507
-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     2.49    2   0.29
condition1  2.49    2   0.29
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 2 at Week 12:"
                 X2 df probability
Omnibus    2.493925  2   0.2873763
condition1 2.493925  2   0.2873763
-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     1.42    1   0.23
condition1  1.42    1   0.23
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 3 at Week 1:"
                 X2 df probability
Omnibus    1.417486  1   0.2338176
condition1 1.417486  1   0.2338176
-------------------------------------------- 
Test for    X2  df  probability 
-------------------------------------------- 
Omnibus     1.01    1   0.32
condition1  1.01    1   0.32
-------------------------------------------- 

H0: Parallel Regression Assumption holds
[1] "Brant Test for Screener 3 at Week 12:"
                 X2 df probability
Omnibus    1.005784  1    0.315915
condition1 1.005784  1    0.315915

No significant results of Purrble on self-harm using proprtional odds (ordinal data that maintains frequency)

Proportional Odds Regression Results Controlling for Age and Baseline Response (Week 1)
Model term estimate std.error odds_ratio statistic p.value
Screener 1 condition1 0.090 0.363 1.094 0.248 0.804
Screener 1 age 0.045 0.083 1.046 0.540 0.589
Screener 1 identity_group_num 0.595 0.375 1.813 1.587 0.113
Screener 1 shqscreener1_w1.L 1.856 0.486 6.400 3.822 0.000
Screener 1 shqscreener1_w1.Q -0.115 0.404 0.891 -0.284 0.776
Screener 1 shqscreener1_w1.C 0.194 0.324 1.214 0.600 0.549
Screener 1 1|2 1.412 1.917 4.102 0.736 0.462
Screener 1 2|3 2.500 1.929 12.184 1.296 0.195
Screener 1 3|4 4.935 1.980 139.059 2.493 0.013
Screener 2 condition1 0.300 0.427 1.350 0.703 0.482
Screener 2 age 0.122 0.094 1.129 1.298 0.194
Screener 2 identity_group_num 1.406 0.448 4.082 3.138 0.002
Screener 2 shqscreener2_w1.L 3.213 0.750 24.862 4.285 0.000
Screener 2 shqscreener2_w1.Q 0.593 0.599 1.809 0.989 0.323
Screener 2 shqscreener2_w1.C 0.623 0.473 1.864 1.316 0.188
Screener 2 1|2 3.999 2.230 54.559 1.794 0.073
Screener 2 2|3 5.510 2.266 247.255 2.432 0.015
Screener 2 3|4 7.450 2.328 1719.687 3.200 0.001
Screener 3 condition1 0.098 0.551 1.103 0.178 0.859
Screener 3 age 0.001 0.125 1.001 0.011 0.991
Screener 3 identity_group_num -0.140 0.566 0.869 -0.248 0.804
Screener 3 shqscreener3_w1.L 0.234 0.814 1.263 0.287 0.774
Screener 3 shqscreener3_w1.Q -0.712 0.667 0.491 -1.067 0.286
Screener 3 1|2 1.407 2.836 4.082 0.496 0.620
Screener 3 2|3 2.698 2.858 14.846 0.944 0.345

Self-Harm Moderation Models: Gender Identity

No moderation effect of gender identity in proprtional odds models.

Proportional Odds Regression Moderation Results (Condition * Identity_Group_Num Interaction)
Model term estimate std.error odds_ratio statistic p.value
Screener 1 condition1 0.619 1.174 1.857 0.527 0.598
Screener 1 identity_group_num 0.752 0.502 2.121 1.499 0.134
Screener 1 age 0.046 0.083 1.048 0.556 0.578
Screener 1 shqscreener1_w1.L 1.836 0.489 6.269 3.756 0.000
Screener 1 shqscreener1_w1.Q -0.148 0.411 0.862 -0.360 0.719
Screener 1 shqscreener1_w1.C 0.202 0.325 1.224 0.622 0.534
Screener 1 condition1:identity_group_num -0.351 0.741 0.704 -0.474 0.636
Screener 1 1|2 1.687 2.007 5.404 0.840 0.401
Screener 1 2|3 2.777 2.020 16.071 1.375 0.169
Screener 1 3|4 5.207 2.066 182.494 2.520 0.012
Screener 2 condition1 0.214 1.369 1.239 0.157 0.876
Screener 2 identity_group_num 1.381 0.592 3.978 2.332 0.020
Screener 2 age 0.122 0.094 1.129 1.295 0.195
Screener 2 shqscreener2_w1.L 3.215 0.751 24.905 4.280 0.000
Screener 2 shqscreener2_w1.Q 0.590 0.602 1.803 0.980 0.327
Screener 2 shqscreener2_w1.C 0.619 0.477 1.857 1.296 0.195
Screener 2 condition1:identity_group_num 0.055 0.838 1.057 0.066 0.947
Screener 2 1|2 3.954 2.332 52.120 1.696 0.090
Screener 2 2|3 5.464 2.368 236.111 2.308 0.021
Screener 2 3|4 7.403 2.432 1640.376 3.043 0.002
Screener 3 condition1 -0.321 1.761 0.725 -0.182 0.855
Screener 3 identity_group_num -0.264 0.752 0.768 -0.351 0.725
Screener 3 age 0.002 0.125 1.002 0.015 0.988
Screener 3 shqscreener3_w1.L 0.290 0.846 1.337 0.343 0.732
Screener 3 shqscreener3_w1.Q -0.699 0.669 0.497 -1.044 0.296
Screener 3 condition1:identity_group_num 0.290 1.155 1.336 0.251 0.802
Screener 3 1|2 1.212 2.940 3.360 0.412 0.680
Screener 3 2|3 2.504 2.960 12.233 0.846 0.398

Supplementary Materials: Mixed Effects Models

To evaluate how outcomes changed over time and whether these changes differed by condition, we fit mixed-effects models for each of our primary outcome variables. These models account for both within-person change and between-person differences.

For each outcomem we ran a linear mixed-effects model using the lmer() function.

The models tested: Main effects of Week (time), condition, and their interaction Covariates: identity group and age A random intercept and slope for each participant ((Week & psid)), allowing each person to have their own baseline and rate of change over time

Emotion Reg was significant Depression significant Anxiety not significant (close to marginal p=.11- more evidence of unstable effect)

Mixed-Effects Model for DERS8_Sum with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 22.165 3.733 5.937 148.275 0.000 14.848 29.481
fixed NA Week -0.265 0.064 -4.120 152.297 0.000 -0.391 -0.139
fixed NA conditionWaitlist Control -0.105 0.828 -0.127 148.835 0.899 -1.729 1.518
fixed NA identity_groupTGD 0.930 0.824 1.129 148.251 0.261 -0.685 2.545
fixed NA age 0.277 0.174 1.588 147.721 0.114 -0.065 0.619
fixed NA Week:conditionWaitlist Control 0.284 0.090 3.152 148.644 0.002 0.108 0.461
ran_pars psid sd__(Intercept) 4.594 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.103 NA NA NA NA NA NA
ran_pars psid sd__Week 0.468 NA NA NA NA NA NA
ran_pars Residual sd__Observation 3.608 NA NA NA NA NA NA
NULL

# R2 for Mixed Models

  Conditional R2: 0.717
     Marginal R2: 0.037
Mixed-Effects Model for DERS8_Sum with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 22.165 3.733 5.937 148.275 0.000 14.848 29.481
fixed NA Week -0.265 0.064 -4.120 152.297 0.000 -0.391 -0.139
fixed NA conditionWaitlist Control -0.105 0.828 -0.127 148.835 0.899 -1.729 1.518
fixed NA identity_groupTGD 0.930 0.824 1.129 148.251 0.261 -0.685 2.545
fixed NA age 0.277 0.174 1.588 147.721 0.114 -0.065 0.619
fixed NA Week:conditionWaitlist Control 0.284 0.090 3.152 148.644 0.002 0.108 0.461
ran_pars psid sd__(Intercept) 4.594 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.103 NA NA NA NA NA NA
ran_pars psid sd__Week 0.468 NA NA NA NA NA NA
ran_pars Residual sd__Observation 3.608 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.717
     Marginal R2: 0.037
Mixed-Effects Model for pmerq_Focus_Avg with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 3.943 0.738 5.345 149.531 0.000 2.497 5.389
fixed NA Week 0.048 0.012 4.139 125.908 0.000 0.025 0.070
fixed NA conditionWaitlist Control 0.258 0.188 1.372 143.494 0.172 -0.111 0.628
fixed NA identity_groupTGD -0.476 0.163 -2.927 147.047 0.004 -0.794 -0.157
fixed NA age -0.059 0.034 -1.705 146.966 0.090 -0.126 0.009
fixed NA Week:conditionWaitlist Control -0.035 0.016 -2.192 129.157 0.030 -0.067 -0.004
ran_pars psid sd__(Intercept) 0.799 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week 0.454 NA NA NA NA NA NA
ran_pars psid sd__Week 0.021 NA NA NA NA NA NA
ran_pars Residual sd__Observation 0.640 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.680
     Marginal R2: 0.060
Mixed-Effects Model for pmerq_Distract_Avg with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 5.349 0.709 7.543 151.365 0.000 3.959 6.739
fixed NA Week 0.031 0.013 2.307 135.818 0.023 0.005 0.057
fixed NA conditionWaitlist Control 0.265 0.202 1.310 145.068 0.192 -0.132 0.662
fixed NA identity_groupTGD 0.086 0.156 0.552 146.638 0.582 -0.219 0.391
fixed NA age -0.066 0.033 -2.006 146.580 0.047 -0.131 -0.002
fixed NA Week:conditionWaitlist Control -0.035 0.019 -1.849 137.700 0.067 -0.071 0.002
ran_pars psid sd__(Intercept) 0.906 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.412 NA NA NA NA NA NA
ran_pars psid sd__Week 0.057 NA NA NA NA NA NA
ran_pars Residual sd__Observation 0.648 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.650
     Marginal R2: 0.031
Mixed-Effects Model for pmerq_AD_Avg with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 4.685 0.625 7.501 150.411 0.000 3.461 5.909
fixed NA Week 0.040 0.010 4.079 252.556 0.000 0.021 0.059
fixed NA conditionWaitlist Control 0.261 0.161 1.622 160.864 0.107 -0.054 0.576
fixed NA identity_groupTGD -0.202 0.138 -1.465 147.788 0.145 -0.471 0.068
fixed NA age -0.064 0.029 -2.205 147.697 0.029 -0.121 -0.007
fixed NA Week:conditionWaitlist Control -0.035 0.014 -2.568 254.123 0.011 -0.062 -0.008
ran_pars psid sd__(Intercept) 0.674 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week 0.999 NA NA NA NA NA NA
ran_pars psid sd__Week 0.009 NA NA NA NA NA NA
ran_pars Residual sd__Observation 0.552 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.661
     Marginal R2: 0.042
Mixed-Effects Model for GAD7_Sum with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 10.890 2.892 3.766 149.580 0.000 5.222 16.558
fixed NA Week -0.156 0.046 -3.411 153.831 0.001 -0.246 -0.066
fixed NA conditionWaitlist Control -0.065 0.681 -0.095 149.312 0.924 -1.400 1.270
fixed NA identity_groupTGD 1.253 0.637 1.967 148.699 0.051 0.004 2.502
fixed NA age 0.110 0.135 0.815 148.162 0.416 -0.154 0.374
fixed NA Week:conditionWaitlist Control 0.103 0.064 1.608 148.732 0.110 -0.023 0.228
ran_pars psid sd__(Intercept) 3.702 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.240 NA NA NA NA NA NA
ran_pars psid sd__Week 0.293 NA NA NA NA NA NA
ran_pars Residual sd__Observation 3.220 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.606
     Marginal R2: 0.024
Mixed-Effects Model for PHQ9_Sum with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 14.141 3.462 4.085 148.102 0.000 7.356 20.926
fixed NA Week -0.177 0.048 -3.705 153.199 0.000 -0.271 -0.083
fixed NA conditionWaitlist Control -1.216 0.753 -1.614 148.674 0.109 -2.692 0.261
fixed NA identity_groupTGD 1.630 0.764 2.133 148.275 0.035 0.132 3.127
fixed NA age 0.038 0.162 0.234 147.817 0.816 -0.279 0.355
fixed NA Week:conditionWaitlist Control 0.222 0.067 3.320 148.205 0.001 0.091 0.353
ran_pars psid sd__(Intercept) 4.187 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week 0.056 NA NA NA NA NA NA
ran_pars psid sd__Week 0.313 NA NA NA NA NA NA
ran_pars Residual sd__Observation 3.262 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.703
     Marginal R2: 0.024
Mixed-Effects Model for SHS_Pathways with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 18.228 2.760 6.604 153.499 0.000 12.818 23.638
fixed NA Week 0.180 0.053 3.423 139.625 0.001 0.077 0.283
fixed NA conditionWaitlist Control 0.879 0.807 1.088 148.196 0.278 -0.704 2.461
fixed NA identity_groupTGD -1.888 0.605 -3.122 148.071 0.002 -3.074 -0.703
fixed NA age -0.246 0.128 -1.924 148.121 0.056 -0.497 0.005
fixed NA Week:conditionWaitlist Control -0.058 0.074 -0.783 141.089 0.435 -0.202 0.087
ran_pars psid sd__(Intercept) 3.517 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.431 NA NA NA NA NA NA
ran_pars psid sd__Week 0.201 NA NA NA NA NA NA
ran_pars Residual sd__Observation 2.669 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.630
     Marginal R2: 0.072
Mixed-Effects Model for SHS_Agency with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 11.036 3.221 3.426 151.999 0.001 4.723 17.350
fixed NA Week 0.239 0.063 3.810 135.590 0.000 0.116 0.361
fixed NA conditionWaitlist Control 0.986 0.897 1.099 144.887 0.274 -0.773 2.745
fixed NA identity_groupTGD -1.511 0.707 -2.136 147.876 0.034 -2.897 -0.124
fixed NA age -0.045 0.150 -0.300 147.892 0.765 -0.338 0.249
fixed NA Week:conditionWaitlist Control -0.069 0.088 -0.782 136.888 0.435 -0.240 0.103
ran_pars psid sd__(Intercept) 3.946 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.349 NA NA NA NA NA NA
ran_pars psid sd__Week 0.294 NA NA NA NA NA NA
ran_pars Residual sd__Observation 2.928 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.669
     Marginal R2: 0.051
Mixed-Effects Model for SHS_TotalHope with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 29.159 5.488 5.313 152.155 0.000 18.402 39.915
fixed NA Week 0.419 0.103 4.076 138.799 0.000 0.217 0.620
fixed NA conditionWaitlist Control 1.843 1.525 1.209 146.500 0.229 -1.146 4.831
fixed NA identity_groupTGD -3.422 1.205 -2.840 147.951 0.005 -5.784 -1.060
fixed NA age -0.285 0.255 -1.118 148.046 0.265 -0.785 0.215
fixed NA Week:conditionWaitlist Control -0.125 0.144 -0.869 139.873 0.386 -0.406 0.157
ran_pars psid sd__(Intercept) 7.134 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.419 NA NA NA NA NA NA
ran_pars psid sd__Week 0.522 NA NA NA NA NA NA
ran_pars Residual sd__Observation 4.604 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.714
     Marginal R2: 0.070
Mixed-Effects Model for ucla_Sum with 95% CI
effect group term estimate std.error statistic df p.value 2.5 % 97.5 %
fixed NA (Intercept) 6.511 1.162 5.602 150.166 0.000 4.232 8.789
fixed NA Week -0.028 0.017 -1.668 134.259 0.098 -0.060 0.005
fixed NA conditionWaitlist Control 0.301 0.295 1.019 144.435 0.310 -0.278 0.880
fixed NA identity_groupTGD 0.498 0.256 1.948 146.945 0.053 -0.003 1.000
fixed NA age 0.013 0.054 0.240 147.172 0.810 -0.093 0.119
fixed NA Week:conditionWaitlist Control -0.008 0.023 -0.366 136.105 0.715 -0.054 0.037
ran_pars psid sd__(Intercept) 1.389 NA NA NA NA NA NA
ran_pars psid cor__(Intercept).Week -0.052 NA NA NA NA NA NA
ran_pars psid sd__Week 0.045 NA NA NA NA NA NA
ran_pars Residual sd__Observation 0.888 NA NA NA NA NA NA

# R2 for Mixed Models

  Conditional R2: 0.729
     Marginal R2: 0.030
LS0tCnRpdGxlOiAnUHVycmJsZSBSQ1QgRW50aXJlIFJlc3VsdHMgd2l0aCBXcml0ZSBVcCcKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIFJlY29yZGluZyBLZWVwaW5nOiAKClRoZXJlIGFyZSB0d28gbWFzdGVyIGZpbGVzIHRoYXQgd2UgYXJlIHVzaW5nIGZvciBhbmFseXNlcy4gVGhleSBhcmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgZmlsZSwgdGhvdWdoIG9uZSBpcyBpbiB3aWRlIGZvcm1hdCBhbmQgdGhlIG90aGVyIGlzIGluIGxvbmcgZm9ybWF0LgoKVGhlIHdpZGUgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkIOKAnFB1cnJibGVfTWFzdGVyX1dpZGUu4oCdIFRoZSBsb25nIGRhdGFzZXQgZm9ybWF0IGRhdGFzZXQgaXMgY2FsbGVkIOKAnFB1cnJibGVfTG9uZ19NYXN0ZXIu4oCdIFRoZSB3aWRlIGRhdGFzZXQgaGFzIGFsbCBvZiB0aGUgcHJlIGFuZCBwb3N0dGVzdCB2YXJpYWJsZXMgY2FsY3VsYXRlZCwgd2hpbGUgdGhlIGxvbmcgZG9lcyBub3QuIE90aGVyd2lzZSwgdGhleSBkbyBub3QgZGlmZmVyLiAKClRoaXMgZGF0YXNldCBpbmNsdWRlcyB0aGUgTj0xNTMgcGFydGljaXBhbnRzIHdobyB3ZXJlIGluY2x1ZGVkIGluIHRoZSByYW5kb21pemVkIGNvbnRyb2wgdHJpYWwgZXhhbWluaW5nIFB1cnJibGUgd2l0aCBhIHBvcHVsYXRpb24gb2YgdW5pdmVyc2l0eSBzdHVkZW50cy4gQWxsIHBhcnRpY2lwYW50cyB3ZXJlIG1lbWJlcnMgb2YgdGhlIExHVEJRKyBjb21tdW5pdHkuCgpXZSB1c2UgdGhlICJmaW5hbCIgZGF0YXNldHMgaW4gd2hpY2ggd2UgcmVtb3ZlZCBwYXJ0aWNpcGFudCBDNzIsIHdobyBoYWQgbm8gaW5mb3JtYXRpb24gb24gZ2VuZGVyIGlkZW50aXR5LgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIGluY2x1ZGUgPSBUUlVFLCAgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCgpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShncmlkRXh0cmEpIApsaWJyYXJ5KHBhdGNod29yaykgICAgICAKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobG1lNCkKbGlicmFyeShtYXJrZG93bikKbGlicmFyeShzdGFyZ2F6ZXIpCmxpYnJhcnkoTU9URSkKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShicm9vbSkKbGlicmFyeShicm9vbS5taXhlZCkgCmxpYnJhcnkodGlkeW1vZGVscykgCmxpYnJhcnkobXVsdGlsZXZlbG1vZCkgCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZWZmZWN0c2l6ZSkKbGlicmFyeShndCkKbGlicmFyeShyZW1wc3ljKSAKCiMgUmVtb3ZlIEM3MiBiZWNhdXNlIHRoZXkgaGF2ZSBubyBnZW5kZXLigJBpZGVudGl0eSBpbmZvcm1hdGlvbgpwdXJyYmxlX3dpZGVfZmluYWwgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIGZpbHRlcihwc2lkICE9ICJDNzIiKQoKIyAzYSkgT3ZlcndyaXRlIGZpbmFsIGZpbGUKd3JpdGVfY3N2KHB1cnJibGVfd2lkZV9maW5hbCwgInB1cnJibGVfd2lkZV9maW5hbC5jc3YiKQoKYGBgCiMgUHJlbGltaW5hcnkgQW5hbHlzZXMKCiMjIFNhbXBsZSBDaGFyYWN0ZXJpc3RpY3MKVGhlc2UgdGFibGVzIHJlcG9ydCB0aGUgY291bnQgb2YgcGFydGljaXBhbnRzIGJ5IGNvbmRpdGlvbiwgaWRlbnRpdHkgZ3JvdXAsIGFuZCBieSBjb25kaXRpb24geCBpZGVudGl0eSBncm91cC4KYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgVGFibGUgMTogTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBieSBDb25kaXRpb24KY29uZGl0aW9uX2NvdW50cyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbikgJT4lCiAgY291bnQoY29uZGl0aW9uLCBuYW1lID0gIkNvdW50IikgJT4lCiAgYXJyYW5nZShjb25kaXRpb24pICU+JQogIGFkZF9yb3coY29uZGl0aW9uID0gIlRvdGFsIiwgQ291bnQgPSBzdW0oLiRDb3VudCkpCgojIFRhYmxlIDI6IE51bWJlciBvZiBQYXJ0aWNpcGFudHMgYnkgR2VuZGVyIElkZW50aXR5CmlkZW50aXR5X2NvdW50cyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGlkZW50aXR5X2dyb3VwKSAlPiUKICBtdXRhdGUoaWRlbnRpdHlfZ3JvdXAgPSByZWNvZGUoaWRlbnRpdHlfZ3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDIiA9ICJDaXNnZW5kZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEdEIiA9ICJUcmFuc2dlbmRlciIpKSAlPiUKICBjb3VudChpZGVudGl0eV9ncm91cCwgbmFtZSA9ICJDb3VudCIpICU+JQogIGFycmFuZ2UoaWRlbnRpdHlfZ3JvdXApICU+JQogIGFkZF9yb3coaWRlbnRpdHlfZ3JvdXAgPSAiVG90YWwiLCBDb3VudCA9IHN1bSguJENvdW50KSkKCiMgVGFibGUgMzogQ3Jvc3MtdGFidWxhdGlvbiBvZiBDb25kaXRpb24gYnkgR2VuZGVyIElkZW50aXR5CmNyb3NzX3RhYiA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbiwgaWRlbnRpdHlfZ3JvdXApICU+JQogIG11dGF0ZShpZGVudGl0eV9ncm91cCA9IHJlY29kZShpZGVudGl0eV9ncm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMiID0gIkNpc2dlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUR0IiID0gIlRyYW5zZ2VuZGVyIikpICU+JQogIGNvdW50KGNvbmRpdGlvbiwgaWRlbnRpdHlfZ3JvdXApICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBpZGVudGl0eV9ncm91cCwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IGxpc3QobiA9IDApKQoKIyBEaXNwbGF5IHRoZSB0YWJsZXMgdXNpbmcga2FibGUKa2FibGUoY29uZGl0aW9uX2NvdW50cywgY2FwdGlvbiA9ICJUYWJsZSAxOiBOdW1iZXIgb2YgUGFydGljaXBhbnRzIGJ5IENvbmRpdGlvbiIsIGZvcm1hdCA9ICJtYXJrZG93biIpCmthYmxlKGlkZW50aXR5X2NvdW50cywgY2FwdGlvbiA9ICJUYWJsZSAyOiBOdW1iZXIgb2YgUGFydGljaXBhbnRzIGJ5IEdlbmRlciBJZGVudGl0eSIsIGZvcm1hdCA9ICJtYXJrZG93biIpCmthYmxlKGNyb3NzX3RhYiwgY2FwdGlvbiA9ICJUYWJsZSAzOiBDcm9zcy10YWJ1bGF0aW9uIG9mIENvbmRpdGlvbiBieSBHZW5kZXIgSWRlbnRpdHkiLCBmb3JtYXQgPSAibWFya2Rvd24iKQpgYGAKIyMgQWdlOiBEZXNjcmlwdGl2ZXMgYW5kIENoZWNrIGZvciBCYXNlbGluZSBkaWZmZXJlbmNlcyAKU3VtbWFyaXplcyBhZ2UgKE1lYW4sIFNELCBNaW4sIE1heCkgYnkgY29uZGl0aW9uIGFuZCBydW5zIGEgdC10ZXN0IGNvbXBhcmluZyBhZ2UgYnkgY29uZGl0aW9uLgpgYGB7cn0KIyBMb2FkIHJlcXVpcmVkIHBhY2thZ2VzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkocmVtcHN5YykgCiMgaWYgbm90IGluc3RhbGxlZCwgcnVuOiBpbnN0YWxsLnBhY2thZ2VzKCJyZW1wc3ljIikKCiMgUHJlcGFyZSBkYXRhOiBlbnN1cmUgb25lIG9ic2VydmF0aW9uIHBlciBwYXJ0aWNpcGFudAphZ2VfZGF0YSA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JSAKICBkaXN0aW5jdChwc2lkLCBjb25kaXRpb24sIGFnZSkKCiMgQ29tcHV0ZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIChNZWFuLCBTRCwgTWluLCBNYXgpIGJ5IGNvbmRpdGlvbgpkZXNjcmlwdGl2ZV9zdGF0cyA8LSBhZ2VfZGF0YSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZSgKICAgIE1lYW4gPSBtZWFuKGFnZSwgbmEucm0gPSBUUlVFKSwKICAgIFNEICAgPSBzZChhZ2UsIG5hLnJtID0gVFJVRSksCiAgICBNaW4gID0gbWluKGFnZSwgbmEucm0gPSBUUlVFKSwKICAgIE1heCAgPSBtYXgoYWdlLCBuYS5ybSA9IFRSVUUpCiAgKSAlPiUgCiAgdW5ncm91cCgpCgpjYXQoIlRhYmxlOiBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBBZ2UgYnkgQ29uZGl0aW9uIChBUEEgRm9ybWF0KVxuXG4iKQojIERpc3BsYXkgdGhlIEFQQS1mb3JtYXR0ZWQgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyB0YWJsZQpuaWNlX3RhYmxlKGRlc2NyaXB0aXZlX3N0YXRzKQoKIyBFbnN1cmUgb25lIG9ic2VydmF0aW9uIHBlciBwYXJ0aWNpcGFudCBmb3IgYWdlCmFnZV9kYXRhIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lIAogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbiwgYWdlKQoKIyBSdW4gdGhlIHQtdGVzdCB1c2luZyByZW1wc3ljJ3MgbmljZV90X3Rlc3QoKSBmdW5jdGlvbgphZ2VfdHRlc3RfcmVzdWx0cyA8LSBuaWNlX3RfdGVzdCgKICBkYXRhID0gYWdlX2RhdGEsCiAgcmVzcG9uc2UgPSAiYWdlIiwKICBncm91cCA9ICJjb25kaXRpb24iLAogIHdhcm5pbmcgPSBGQUxTRQopCgojIERpc3BsYXkgYSBwdWJsaWNhdGlvbi1yZWFkeSB0LXRlc3QgdGFibGUKbmljZV90YWJsZShhZ2VfdHRlc3RfcmVzdWx0cykKYGBgCiMjIFJhY2UsIE5hdGlvbmFsaXR5LCBhbmQgU2V4dWFsIE9yaWVudGF0aW9uIERlc2NyaXB0aXZlcwojIyMgU2V4dWFsIE9yaWVudGF0aW9uLSBTaW1wbGlmaWVkCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIDEuIE9uZSByb3cgcGVyIHBhcnRpY2lwYW50LCBwZXIgc2ltcGxpZmllZCBvcmllbnRhdGlvbgpzb19jb3VudHMgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBkaXN0aW5jdChwc2lkLCBjb25kaXRpb24sIHNvX3NpbXBsaWZpZWQpICU+JQogIG11dGF0ZShzb19zaW1wbGlmaWVkID0gdG9sb3dlcihzb19zaW1wbGlmaWVkKSkgJT4lCiAgY291bnQoc29fc2ltcGxpZmllZCwgY29uZGl0aW9uKSAlPiUKICBwaXZvdF93aWRlcigKICAgIG5hbWVzX2Zyb20gID0gY29uZGl0aW9uLAogICAgdmFsdWVzX2Zyb20gPSBuLAogICAgdmFsdWVzX2ZpbGwgPSBsaXN0KG4gPSAwKQogICkKIyBOb3cgc29fY291bnRzIGhhcyBjb2x1bW5zOiAic29fc2ltcGxpZmllZCIsICJQdXJyYmxlIFRyZWF0bWVudCIsICJXYWl0bGlzdCBDb250cm9sIgoKIyAyLiBBZGQgVG90YWwgdmlhIGFjcm9zcygpIChpLmUuLCBzdW0gdGhlIG51bWVyaWMgY29sdW1ucykKc29fY291bnRzIDwtIHNvX2NvdW50cyAlPiUKICBtdXRhdGUoCiAgICBUb3RhbCA9IHJvd1N1bXMoYWNyb3NzKHdoZXJlKGlzLm51bWVyaWMpKSkKICApCgojIDMuIERlbm9taW5hdG9ycyBmb3IgcGVyY2VudCBjYWxjdWxhdGlvbgpkZW5vbV9zbyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQsIGNvbmRpdGlvbikgJT4lCiAgY291bnQoY29uZGl0aW9uLCBuYW1lID0gInRvdGFsIikKIyBlLmcuLCBkZW5vbV9zbyR0b3RhbFsgZGVub21fc28kY29uZGl0aW9uID09ICJXYWl0bGlzdCBDb250cm9sIiBdIGlzIHRoZSBOIGZvciBXYWl0bGlzdAoKb3ZlcmFsbF9kZW5vbSA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIGRpc3RpbmN0KHBzaWQpICU+JQogIG5yb3coKQoKIyA0LiBCdWlsZCB0aGUgZGlzcGxheSB0YWJsZSwgcmVmZXJyaW5nIHRvIHRoZSBhY3R1YWwgY29sdW1uIG5hbWVzOgpzb190YWJsZV9maW5hbCA8LSBzb19jb3VudHMgJT4lCiAgbXV0YXRlKAogICAgYFdhaXRsaXN0IChuLCAlKWAgPSBwYXN0ZTAoCiAgICAgIGBXYWl0bGlzdCBDb250cm9sYCwgCiAgICAgICIgKCIsIHJvdW5kKAogICAgICAgICAgICAgYFdhaXRsaXN0IENvbnRyb2xgIC8KICAgICAgICAgICAgIGRlbm9tX3NvJHRvdGFsWyBkZW5vbV9zbyRjb25kaXRpb24gPT0gIldhaXRsaXN0IENvbnRyb2wiIF0gKiAxMDAsIAogICAgICAgICAgIDEpLAogICAgICAiJSkiCiAgICApLAogICAgYFB1cnJibGUgKG4sICUpYCA9IHBhc3RlMCgKICAgICAgYFB1cnJibGUgVHJlYXRtZW50YCwKICAgICAgIiAoIiwgcm91bmQoCiAgICAgICAgICAgICBgUHVycmJsZSBUcmVhdG1lbnRgIC8KICAgICAgICAgICAgIGRlbm9tX3NvJHRvdGFsWyBkZW5vbV9zbyRjb25kaXRpb24gPT0gIlB1cnJibGUgVHJlYXRtZW50IiBdICogMTAwLAogICAgICAgICAgIDEpLAogICAgICAiJSkiCiAgICApLAogICAgYFRvdGFsIChuLCAlKWAgPSBwYXN0ZTAoCiAgICAgIFRvdGFsLAogICAgICAiICgiLCByb3VuZChUb3RhbCAvIG92ZXJhbGxfZGVub20gKiAxMDAsIDEpLCAiJSkiCiAgICApCiAgKSAlPiUKICBzZWxlY3QoCiAgICBgU2V4dWFsIE9yaWVudGF0aW9uYCA9IHNvX3NpbXBsaWZpZWQsCiAgICBgV2FpdGxpc3QgKG4sICUpYCwKICAgIGBQdXJyYmxlIChuLCAlKWAsCiAgICBgVG90YWwgKG4sICUpYAogICkKCiMgNS4gUHJpbnQgd2l0aCBrYWJsZUV4dHJhCnNvX3RhYmxlX2ZpbmFsICU+JQogIGthYmxlKAogICAgY2FwdGlvbiA9ICJUYWJsZSBYLiBTaW1wbGlmaWVkIFNleHVhbCBPcmllbnRhdGlvbiBieSBDb25kaXRpb24gKG4sICUpIiwKICAgIGFsaWduICAgPSBjKCJsIiwiYyIsImMiLCJjIikKICApICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQpgYGAKIyMjIE5hdGlvbmFsaXR5CmBgYHtyfQojIyMgTmF0aW9uYWxpdHkgYnkgQ29uZGl0aW9uCgojIDEuIENyZWF0ZSBhIGNvdW50cyB0YWJsZTogb25lIHJvdyBwZXIgdW5pcXVlIE5hdGlvbmFsaXR5LCB3aXRoIGNvbHVtbnMgZm9yIGVhY2ggY29uZGl0aW9uLgpuYXRpb25hbGl0eV9jb3VudHMgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBkaXN0aW5jdChwc2lkLCBjb25kaXRpb24sIE5hdGlvbmFsaXR5KSAlPiUgICMgb25lIHJlY29yZCBwZXIgcGFydGljaXBhbnQKICBtdXRhdGUoTmF0aW9uYWxpdHkgPSB0b2xvd2VyKE5hdGlvbmFsaXR5KSkgJT4lICAjIGNvbnZlcnQgdG8gbG93ZXJjYXNlCiAgY291bnQoTmF0aW9uYWxpdHksIGNvbmRpdGlvbikgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGNvbmRpdGlvbiwgCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBuLCAKICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IGxpc3QobiA9IDApKSAlPiUKICBhcnJhbmdlKE5hdGlvbmFsaXR5KQoKIyAyLiBBZGQgYSBUb3RhbCBjb2x1bW4uCm5hdGlvbmFsaXR5X2NvdW50cyA8LSBuYXRpb25hbGl0eV9jb3VudHMgJT4lCiAgbXV0YXRlKFRvdGFsID0gcm93U3VtcyhzZWxlY3QoLiwgLU5hdGlvbmFsaXR5KSkpCgojIDMuIEdldCBkZW5vbWluYXRvcnMgKHNhbWUgYXMgZm9yIHNvKQpkZW5vbV9uYXQgPC0gUHVycmJsZV9Mb25nX01hc3RlciAlPiUKICBkaXN0aW5jdChwc2lkLCBjb25kaXRpb24pICU+JQogIGNvdW50KGNvbmRpdGlvbiwgbmFtZSA9ICJ0b3RhbCIpCm92ZXJhbGxfZGVub21fbmF0IDwtIG92ZXJhbGxfZGVub20gICMgc2FtZSBvdmVyYWxsIGRlbm9taW5hdG9yCgojIDQuIENvbnZlcnQgY291bnRzIHRvICJjb3VudCAocGVyY2VudGFnZSUpIiBmb3JtYXQuCm5hdGlvbmFsaXR5X3RhYmxlX2ZpbmFsIDwtIG5hdGlvbmFsaXR5X2NvdW50cwpmb3IoY29sIGluIHNldGRpZmYobmFtZXMobmF0aW9uYWxpdHlfY291bnRzKSwgIk5hdGlvbmFsaXR5IikpewogIGlmKGNvbCAhPSAiVG90YWwiKXsKICAgIGRlbm9tX3ZhbCA8LSBkZW5vbV9uYXQkdG90YWxbZGVub21fbmF0JGNvbmRpdGlvbiA9PSBjb2xdCiAgICBuYXRpb25hbGl0eV90YWJsZV9maW5hbFtbY29sXV0gPC0gcGFzdGUwKG5hdGlvbmFsaXR5X2NvdW50c1tbY29sXV0sICIgKCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChuYXRpb25hbGl0eV9jb3VudHNbW2NvbF1dIC8gZGVub21fdmFsICogMTAwLCAxKSwgIiUpIikKICB9IGVsc2UgewogICAgbmF0aW9uYWxpdHlfdGFibGVfZmluYWxbW2NvbF1dIDwtIHBhc3RlMChuYXRpb25hbGl0eV9jb3VudHNbW2NvbF1dLCAiICgiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoYXMubnVtZXJpYyhuYXRpb25hbGl0eV9jb3VudHNbW2NvbF1dKSAvIG92ZXJhbGxfZGVub21fbmF0ICogMTAwLCAxKSwgIiUpIikKICB9Cn0KCnByaW50KGthYmxlKG5hdGlvbmFsaXR5X3RhYmxlX2ZpbmFsLCBjYXB0aW9uID0gIlRhYmxlOiBOYXRpb25hbGl0eSBieSBDb25kaXRpb24gKENvdW50cyBhbmQgUGVyY2VudGFnZXMpIiwgZm9ybWF0ID0gIm1hcmtkb3duIikpCgpgYGAKIyMjIFJhY2UKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgRGVmaW5lIHJhY2UgdmFyaWFibGVzCnJhY2VfdmFycyA8LSBjKCJSYWNlX0FzaWFuIiwgIlJhY2VfQXJhYmljIiwgIlJhY2VfQmxhY2siLCAiUmFjZV9IaXNwYW5pYyIsIAogICAgICAgICAgICAgICAiUmFjZV9QYWNpZmljIiwgIlJhY2VfV2hpdGUiLCAiUmFjZV91bmtub3duIikKCiMgU3RlcCAxOiBDcmVhdGUgcGFydGljaXBhbnQtbGV2ZWwgcmFjZSBkYXRhCnJhY2VfZGF0YSA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIHNlbGVjdChwc2lkLCBjb25kaXRpb24sIGFsbF9vZihyYWNlX3ZhcnMpKSAlPiUgICMgc2VsZWN0IG5lZWRlZCBjb2x1bW5zIGZpcnN0CiAgZGlzdGluY3QoKQoKIyBTdGVwIDI6IFBpdm90IHRvIGxvbmcgZm9ybWF0IHNvIHRoYXQgZWFjaCByb3cgaXMgb25lIHJhY2Ugb3B0aW9uIHBlciBwYXJ0aWNpcGFudCwgdGhlbiBmaWx0ZXIgZm9yIGluZGljYXRvciA9PSAxCnJhY2VfbG9uZyA8LSByYWNlX2RhdGEgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBhbGxfb2YocmFjZV92YXJzKSwgbmFtZXNfdG8gPSAiUmFjZSIsIHZhbHVlc190byA9ICJpbmRpY2F0b3IiKSAlPiUKICBmaWx0ZXIoaW5kaWNhdG9yID09IDEpCgojIFN0ZXAgMzogQ29tcHV0ZSBjb3VudHMgYnkgY29uZGl0aW9uIGZvciBlYWNoIFJhY2Ugb3B0aW9uCnJhY2VfY291bnRzIDwtIHJhY2VfbG9uZyAlPiUKICBncm91cF9ieShSYWNlLCBjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZShjb3VudCA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikKCiMgU3RlcCA0OiBDb21wdXRlIGRlbm9taW5hdG9ycyAodG90YWwgcGFydGljaXBhbnRzKSBwZXIgY29uZGl0aW9uCmRlbm9tIDwtIFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lCiAgZGlzdGluY3QocHNpZCwgY29uZGl0aW9uKSAlPiUKICBjb3VudChjb25kaXRpb24sIG5hbWUgPSAiZGVub20iKQoKIyBTdGVwIDU6IEpvaW4gZGVub21pbmF0b3JzIGFuZCBjb21wdXRlIHBlcmNlbnRhZ2VzIGZvciBlYWNoIFJhY2Ugb3B0aW9uIHBlciBjb25kaXRpb24KcmFjZV9jb3VudHMgPC0gcmFjZV9jb3VudHMgJT4lCiAgbGVmdF9qb2luKGRlbm9tLCBieSA9ICJjb25kaXRpb24iKSAlPiUKICBtdXRhdGUocGVyY2VudGFnZSA9IHJvdW5kKGNvdW50IC8gZGVub20gKiAxMDAsIDEpKQoKIyBTdGVwIDY6IFBpdm90IHdpZGVyIHNvIHRoYXQgZWFjaCByYWNlIG9wdGlvbiBpcyBvbmUgcm93LgpyYWNlX3dpZGUgPC0gcmFjZV9jb3VudHMgJT4lCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IFJhY2UsIAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBjb25kaXRpb24sIAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYyhjb3VudCwgcGVyY2VudGFnZSksCiAgICAgICAgICAgICAgdmFsdWVzX2ZpbGwgPSBsaXN0KGNvdW50ID0gMCwgcGVyY2VudGFnZSA9IDApLAogICAgICAgICAgICAgIHZhbHVlc19mbiA9IGxpc3QoY291bnQgPSBzdW0sIHBlcmNlbnRhZ2UgPSBzdW0pKQoKIyBTdGVwIDc6IENvbXB1dGUgb3ZlcmFsbCB0b3RhbHMgZm9yIGVhY2ggUmFjZSBvcHRpb24Kb3ZlcmFsbF9kZW5vbSA8LSBucm93KFB1cnJibGVfTG9uZ19NYXN0ZXIgJT4lIGRpc3RpbmN0KHBzaWQpKQpvdmVyYWxsX2NvdW50cyA8LSByYWNlX2xvbmcgJT4lCiAgZ3JvdXBfYnkoUmFjZSkgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX2NvdW50ID0gbigpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUKICBtdXRhdGUodG90YWxfcGVyY2VudGFnZSA9IHJvdW5kKHRvdGFsX2NvdW50IC8gb3ZlcmFsbF9kZW5vbSAqIDEwMCwgMSkpCgojIFN0ZXAgODogTWVyZ2Ugb3ZlcmFsbCB0b3RhbHMgd2l0aCB0aGUgd2lkZSB0YWJsZQpyYWNlX3RhYmxlIDwtIHJhY2Vfd2lkZSAlPiUKICBsZWZ0X2pvaW4ob3ZlcmFsbF9jb3VudHMsIGJ5ID0gIlJhY2UiKQoKIyBTdGVwIDk6IFJlb3JkZXIgY29sdW1ucyBzbyB0aGF0IGZvciBlYWNoIGNvbmRpdGlvbiB0aGUgY291bnQgYW5kIHBlcmNlbnRhZ2UgY29sdW1ucyBhcHBlYXIgc2lkZS1ieS1zaWRlLAojIGFuZCB0aGVuIGFkZCBvdmVyYWxsIChUb3RhbCkgY29sdW1ucy4KY29uZGl0aW9ucyA8LSBzb3J0KHVuaXF1ZShQdXJyYmxlX0xvbmdfTWFzdGVyJGNvbmRpdGlvbikpCm9yZGVyZWRfY29scyA8LSBjKCJSYWNlIikKZm9yIChjb25kIGluIGNvbmRpdGlvbnMpIHsKICBvcmRlcmVkX2NvbHMgPC0gYyhvcmRlcmVkX2NvbHMsIHBhc3RlMCgiY291bnRfIiwgY29uZCksIHBhc3RlMCgicGVyY2VudGFnZV8iLCBjb25kKSkKfQpvcmRlcmVkX2NvbHMgPC0gYyhvcmRlcmVkX2NvbHMsICJ0b3RhbF9jb3VudCIsICJ0b3RhbF9wZXJjZW50YWdlIikKcmFjZV90YWJsZSA8LSByYWNlX3RhYmxlICU+JSBzZWxlY3QoYWxsX29mKG9yZGVyZWRfY29scykpCgojIFN0ZXAgMTA6IENyZWF0ZSBhIHNwYW5uaW5nIGhlYWRlcjoKIyBGaXJzdCBjb2x1bW46ICJSYWNlIiwgdGhlbiBlYWNoIGNvbmRpdGlvbiBzcGFucyAyIGNvbHVtbnMgKENvdW50IGFuZCBQZXJjZW50KSwgdGhlbiAiVG90YWwiIHNwYW5zIDIgY29sdW1ucy4KaGVhZGVyX3ZlYyA8LSBjKCJSYWNlIiA9IDEpCmZvciAoY29uZCBpbiBjb25kaXRpb25zKSB7CiAgaGVhZGVyX3ZlYyA8LSBjKGhlYWRlcl92ZWMsIHNldE5hbWVzKDIsIGNvbmQpKQp9CmhlYWRlcl92ZWMgPC0gYyhoZWFkZXJfdmVjLCAiVG90YWwiID0gMikKCiMgRGlzcGxheSB0aGUgZmluYWwgcmFjZSB0YWJsZSB3aXRoIHRoZSBzcGFubmluZyBoZWFkZXIuCmthYmxlKHJhY2VfdGFibGUsIGNhcHRpb24gPSAiVGFibGU6IFJhY2UgQ291bnRzIGFuZCBQZXJjZW50YWdlcyBieSBDb25kaXRpb24iLCBmb3JtYXQgPSAibWFya2Rvd24iKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShoZWFkZXJfdmVjKQoKCiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFydGljaXBhbnRzIHdpdGggbXVsdGlwbGUgcmFjaWFsIGlkZW50aXRpZXMgcGVyIGNvbmRpdGlvbgptdWx0aXBsZV9yYWNlX2NvdW50cyA8LSBQdXJyYmxlX0xvbmdfTWFzdGVyICU+JQogIHNlbGVjdChwc2lkLCBjb25kaXRpb24sIG9uZV9vZihyYWNlX3ZhcnMpKSAlPiUgICMgc2VsZWN0IG5lY2Vzc2FyeSBjb2x1bW5zIGZpcnN0CiAgZGlzdGluY3QoKSAlPiUKICBtdXRhdGUobXVsdGlwbGUgPSByb3dTdW1zKGFjcm9zcyhvbmVfb2YocmFjZV92YXJzKSksIG5hLnJtID0gVFJVRSkgPiAxKSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcml6ZShtdWx0aXBsZV9jb3VudCA9IHN1bShtdWx0aXBsZSksIC5ncm91cHMgPSAiZHJvcCIpCgojIFByaW50IG91dHB1dCBtZXNzYWdlcyBmb3IgZWFjaCBjb25kaXRpb24KbXVsdGlwbGVfcmFjZV9jb3VudHMgJT4lCiAgcm93d2lzZSgpICU+JQogIG11dGF0ZShtZXNzYWdlID0gcGFzdGUwKG11bHRpcGxlX2NvdW50LCAiIHBlb3BsZSBpbiB0aGUgIiwgY29uZGl0aW9uLCAiIGNvbmRpdGlvbiByZXBvcnRlZCBtdWx0aXBsZSByYWNpYWwgaWRlbnRpdGllcy4iKSkgJT4lCiAgcHVsbChtZXNzYWdlKSAlPiUKICBwYXN0ZShjb2xsYXBzZSA9ICJcbiIpICU+JQogIGNhdCgpCgpgYGAKIyMgUGFydGljaXBhdGlvbiBPdmVyIFRpbWUKTm90ZTogV2Vla3MgMS0zIHdlcmUgY29uc2lkZXJlZCAicHJlLXRlc3QuIiBQdXJyYmxlIHdhcyBnaXZlbiAob3Igbm90KSBhZnRlciB3ZWVrIDMuIFdlZWtzIDExLTEzIGFyZSBjb25zaWRlcmVkICJQb3N0LXRlc3QiLgojIyMgUGFydGljaXBhdGlvbiBpbiBFYWNoIFdlZWsgb3ZlciBUaW1lIApBbmFseXNlcyBmb3IgdGhlIGVudGlyZSBzdHVkeSBhbmQgYnkgdHJlYXRtZW50IGNvbmRpdGlvbi4KTm90ZTogU29tZXRoaW5nIHdvbmt5IGluIHRoZSB0YWJsZSBicm9rZW4gZG93biBieSBjb25kaXRpb24gd2hlcmUgV2VlayA0IGFwcGVhcnMgb3V0IG9mIG9yZGVyLSBJIGRvbid0IGtub3cgd2h5LiBUaGUgZGF0YSBpcyBhY2N1cmF0ZS4KYGBge3J9CmxpYnJhcnkoa2FibGVFeHRyYSkKY29uZGl0aW9uX2NvdW50cyA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgY291bnQoY29uZGl0aW9uKSAlPiUKICByZW5hbWUoQ29uZGl0aW9uID0gY29uZGl0aW9uLCBOID0gbikKCiMgRGlzcGxheSB0aGUgZm9ybWF0dGVkIHRhYmxlCmNhdCgiIyMjICoqTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBpbiBFYWNoIENvbmRpdGlvbioqXG4iKQprYWJsZShjb25kaXRpb25fY291bnRzLCBjYXB0aW9uID0gIlBhcnRpY2lwYW50IENvdW50cyBieSBDb25kaXRpb24iKQoKIyBTZWxlY3QgQ29tcGxldGVfWCB2YXJpYWJsZXMKY29tcGxldGVfdmFycyA8LSBwYXN0ZTAoIkNvbXBsZXRlXyIsIDE6MTMpCgojIFN1bW1hcml6ZSBob3cgbWFueSBwZW9wbGUgaGF2ZSBhIDEgZm9yIGVhY2ggQ29tcGxldGVfWCB2YXJpYWJsZQpjb21wbGV0ZV90YWJsZSA8LSBwdXJyYmxlX3dpZGVfZmluYWwgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhhbGxfb2YoY29tcGxldGVfdmFycyksIHN1bSwgbmEucm0gPSBUUlVFKSkKCiMgUmVzaGFwZSBpbnRvIGxvbmcgZm9ybWF0IGZvciBjbGVhbmVyIGRpc3BsYXkKY29tcGxldGVfdGFibGVfbG9uZyA8LSBjb21wbGV0ZV90YWJsZSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiV2VlayIsIHZhbHVlc190byA9ICJDb3VudCIpICU+JQogIG11dGF0ZShXZWVrID0gYXMubnVtZXJpYyhnc3ViKCJDb21wbGV0ZV8iLCAiIiwgV2VlaykpKSAlPiUKICBhcnJhbmdlKFdlZWspICMgRW5zdXJlIHByb3BlciBvcmRlcgoKIyBEaXNwbGF5IHRoZSBmb3JtYXR0ZWQgdGFibGUKY2F0KCJcbiMjIyAqKkNvbXBsZXRpb24gQ291bnRzIE92ZXIgVGltZSoqXG4iKQprYWJsZShjb21wbGV0ZV90YWJsZV9sb25nLCBjYXB0aW9uID0gIk51bWJlciBvZiBQYXJ0aWNpcGFudHMgQ29tcGxldGluZyBFYWNoIFdlZWsiKQoKIyBMaW5lIGdyYXBoIHNob3dpbmcgdHJlbmQgb2YgY29tcGxldGlvbiBvdmVyIHRpbWUKIyBDcmVhdGUgdGhlIGxpbmUgZ3JhcGgKZ2dwbG90KGNvbXBsZXRlX3RhYmxlX2xvbmcsIGFlcyh4ID0gV2VlaywgeSA9IENvdW50KSkgKwogIGdlb21fbGluZShjb2xvciA9ICJibHVlIiwgbGluZXdpZHRoID0gMSkgKyAgIyBMaW5lIGNvbG9yIGFuZCB0aGlja25lc3MKICBnZW9tX3BvaW50KHNpemUgPSAzLCBjb2xvciA9ICJibHVlIikgKyAgIyBSZWQgcG9pbnRzIGZvciBlbXBoYXNpcwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDE1NSksIGJyZWFrcyA9IHNlcSgwLCAxNTUsIGJ5ID0gMjUpKSArICAjIFktYXhpcyBsaW1pdHMgYW5kIGludGVydmFscwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEzKSArICAjIEVuc3VyZSBhbGwgd2Vla3MgKDEgdG8gMTMpIGFwcGVhciBvbiBYLWF4aXMKICBsYWJzKAogICAgdGl0bGUgPSAiQ29tcGxldGlvbiBSYXRlcyBPdmVyIFRpbWUiLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSAiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksICAjIE1ha2UgWC1heGlzIGxhYmVscyByZWFkYWJsZQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpICAjIE1ha2UgWS1heGlzIGxhYmVscyByZWFkYWJsZQoKIyAxKSBSZWNvbXB1dGUgc3VtcyBvZiBDb21wbGV0ZV8xOkNvbXBsZXRlXzEzIHNlcGFyYXRlbHkgZm9yIGVhY2ggY29uZGl0aW9uCmNvbXBsZXRlX3RhYmxlX2J5X2NvbmQgPC0gcHVycmJsZV93aWRlX2ZpbmFsICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbikgJT4lCiAgc3VtbWFyaXNlKGFjcm9zcyhzdGFydHNfd2l0aCgiQ29tcGxldGVfIiksIHN1bSwgbmEucm0gPSBUUlVFKSkgJT4lCiAgdW5ncm91cCgpCgojIDIpIFJlbmFtZSB0aGUgQ29tcGxldGVfWCBjb2x1bW5zIHRvIGp1c3QgdGhlIHdlZWsgbnVtYmVyICgx4oCTMTMpCiMgICAgVGhpcyBtYWtlcyBlYWNoIGNvbHVtbiBoZWFkZXIg4oCcMeKAnSwg4oCcMuKAnSwg4oCmLCDigJwxM+KAnQpjb21wbGV0ZV90YWJsZV93aWRlIDwtIGNvbXBsZXRlX3RhYmxlX2J5X2NvbmQgJT4lCiAgcmVuYW1lX3dpdGgofiBnc3ViKCJeQ29tcGxldGVfIiwgIiIsIC54KSwgc3RhcnRzX3dpdGgoIkNvbXBsZXRlXyIpKQoKIyAzKSBEaXNwbGF5IHRoZSB3aWRlIHRhYmxlOiBvbmUgcm93IHBlciBjb25kaXRpb24sIGNvbHVtbnMgMeKAkzEzCmNhdCgiIyMjICoqQ29tcGxldGlvbiBDb3VudHMgYnkgV2VlayBhbmQgQ29uZGl0aW9uKipcbiIpCmNvbXBsZXRlX3RhYmxlX3dpZGUgJT4lCiAgcmVuYW1lKAogICAgQ29uZGl0aW9uID0gY29uZGl0aW9uCiAgKSAlPiUKICBrYWJsZSgKICAgIGNhcHRpb24gPSAiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBDb21wbGV0aW5nIEVhY2ggV2VlayAoQ29sdW1uczogV2Vla3MgMeKAkzEzOyBSb3dzOiBDb25kaXRpb25zKSIsCiAgICBhbGlnbiAgID0gYygibCIsIHJlcCgiciIsIDEzKSkKICApICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKIyA0KSBQbG90IGNvbXBsZXRpb24gY291bnRzIG92ZXIgdGltZSwgd2l0aCBvbmUgbGluZSBwZXIgY29uZGl0aW9uCmdncGxvdChjb21wbGV0ZV9sb25nX2J5X2NvbmQsIGFlcyh4ID0gV2VlaywgeSA9IENvdW50LCBjb2xvciA9IGNvbmRpdGlvbikpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTMpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoCiAgICBsaW1pdHMgPSBjKDAsIG1heChjb21wbGV0ZV9sb25nX2J5X2NvbmQkQ291bnQpICsgNSksCiAgICBicmVha3MgPSBzZXEoMCwgbWF4KGNvbXBsZXRlX2xvbmdfYnlfY29uZCRDb3VudCkgKyA1LCBieSA9IDI1KQogICkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJDb21wbGV0aW9uIENvdW50cyBPdmVyIFRpbWUgYnkgQ29uZGl0aW9uIiwKICAgIHggICAgID0gIldlZWsiLAogICAgeSAgICAgPSAiTnVtYmVyIG9mIFBhcnRpY2lwYW50cyBDb21wbGV0aW5nIiwKICAgIGNvbG9yID0gIkNvbmRpdGlvbiIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKAogICAgYXhpcy50ZXh0LnggICAgID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSksCiAgICBheGlzLnRleHQueSAgICAgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwKICAgIGxlZ2VuZC50aXRsZSAgICA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iCiAgKQpgYGAKIyMjIyBGb2xsb3ctVXA6IERpZmZlcmVuY2VzIGluIFNsb3BlIGJldHdlZW4gdGhlIFR3byBHcm91cHMgT3ZlciBUaW1lIApXZSBleGFtaW5lZCB3aGV0aGVyIHRoZSByYXRlIG9mIGRlY2xpbmUgaW4gd2Vla2x5IGNvbXBsZXRpb24gY291bnRzIGRpZmZlcmVkIGJldHdlZW4gdGhlIFB1cnJibGUgYW5kIFdhaXRsaXN0IENvbnRyb2wgZ3JvdXBzIGJ5IGZpdHRpbmcgYSBsaW5lYXIgcmVncmVzc2lvbiBvbiBhZ2dyZWdhdGVkIGNvdW50cyAoQ291bnQpIHdpdGggcHJlZGljdG9ycyBXZWVrIChjZW50ZXJlZCBhdCBXZWVrIDApLCBDb25kaXRpb24gKFdhaXRsaXN0IENvbnRyb2wgPSAwLCBQdXJyYmxlID0gMSksIGFuZCB0aGVpciBpbnRlcmFjdGlvbiAoV2VlayDDlyBDb25kaXRpb24pLiBUaGUgaW50ZXJhY3Rpb24gdGVybSAoV2VlayDDlyBDb25kaXRpb24pIHdhcyBzaWduaWZpY2FudCwgQiA9IOKIkjAuODcsIFNFID0gMC4zMSwgcCA9IC4wMDksIGluZGljYXRpbmcgdGhhdCB0aGUgUHVycmJsZSBncm91cOKAmXMgd2Vla2x5IGRlY2xpbmUgKGFwcHJveGltYXRlbHkg4oiSMS41MiBwYXJ0aWNpcGFudHMgcGVyIHdlZWspIHdhcyBzaWduaWZpY2FudGx5IGdyZWF0ZXIgdGhhbiBpbiB0aGUgV2FpdGxpc3QgQ29udHJvbCBncm91cCAo4oiSMC42NSBwYXJ0aWNpcGFudHMgcGVyIHdlZWspLgpgYGB7cn0KCiMgMSkgUmVjb21wdXRlIHN1bXMgb2YgQ29tcGxldGVfMTpDb21wbGV0ZV8xMyBzZXBhcmF0ZWx5IGZvciBlYWNoIGNvbmRpdGlvbgpjb21wbGV0ZV90YWJsZV9ieV9jb25kIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcmlzZShhY3Jvc3Moc3RhcnRzX3dpdGgoIkNvbXBsZXRlXyIpLCBzdW0sIG5hLnJtID0gVFJVRSkpICU+JQogIHVuZ3JvdXAoKQoKIyAyKSBQaXZvdCB0byBsb25nIGZvcm1hdCBmb3Igc2xvcGUgYW5hbHlzaXM6IG9uZSByb3cgcGVyIChjb25kaXRpb24sIFdlZWssIENvdW50KQpjb21wbGV0ZV9sb25nX2J5X2NvbmQgPC0gY29tcGxldGVfdGFibGVfYnlfY29uZCAlPiUKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzICAgICA9IHN0YXJ0c193aXRoKCJDb21wbGV0ZV8iKSwKICAgIG5hbWVzX3RvID0gIldlZWsiLAogICAgdmFsdWVzX3RvID0gIkNvdW50IgogICkgJT4lCiAgbXV0YXRlKFdlZWsgPSBhcy5pbnRlZ2VyKGdzdWIoIkNvbXBsZXRlXyIsICIiLCBXZWVrKSkpICU+JQogIGFycmFuZ2UoY29uZGl0aW9uLCBXZWVrKQoKIyAzKSBGaXQgYSBsaW5lYXIgbW9kZWw6IENvdW50IH4gV2VlayAqIGNvbmRpdGlvbgojICAgIEVuc3VyZSBjb25kaXRpb24gaXMgYSBmYWN0b3Igd2l0aCBhIHJlZmVyZW5jZSBsZXZlbApjb21wbGV0ZV9sb25nX2J5X2NvbmQgPC0gY29tcGxldGVfbG9uZ19ieV9jb25kICU+JQogIG11dGF0ZShjb25kaXRpb24gPSBmYWN0b3IoY29uZGl0aW9uLCBsZXZlbHMgPSBjKCJXYWl0bGlzdCBDb250cm9sIiwgIlB1cnJibGUiKSkpCgpzbG9wZV9sbSA8LSBsbShDb3VudCB+IFdlZWsgKiBjb25kaXRpb24sIGRhdGEgPSBjb21wbGV0ZV9sb25nX2J5X2NvbmQpCnNsb3BlX3N1bW1hcnkgPC0gYnJvb206OnRpZHkoc2xvcGVfbG0pCgojIDQpIERpc3BsYXkgdGhlIGZ1bGwgc2V0IG9mIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzCmNhdCgiIyMjICoqTGluZWFyIE1vZGVsOiBDb3VudCB+IFdlZWsgw5cgQ29uZGl0aW9uKipcbiIpCnNsb3BlX3N1bW1hcnkgJT4lCiAgc2VsZWN0KHRlcm0sIGVzdGltYXRlLCBzdGQuZXJyb3IsIHAudmFsdWUpICU+JQogIHJlbmFtZSgKICAgIFRlcm0gICAgICAgPSB0ZXJtLAogICAgRXN0aW1hdGUgICA9IGVzdGltYXRlLAogICAgYFN0ZC4gRXJyb3JgID0gc3RkLmVycm9yLAogICAgYHAtdmFsdWVgICA9IHAudmFsdWUKICApICU+JQogIGthYmxlKAogICAgY2FwdGlvbiA9ICJSZWdyZXNzaW9uIENvZWZmaWNpZW50cyBmb3IgQ291bnQgfiBXZWVrICogQ29uZGl0aW9uIiwKICAgIGFsaWduICAgPSBjKCJsIiwgInIiLCAiciIsICJyIikKICApICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKIyA1KSBFeHRyYWN0IGFuZCBkaXNwbGF5IGp1c3QgdGhlIGludGVyYWN0aW9uIHRlcm0gKFdlZWs6Y29uZGl0aW9uUHVycmJsZSkKaW50ZXJhY3Rpb25fcm93IDwtIHNsb3BlX3N1bW1hcnkgJT4lCiAgZmlsdGVyKHRlcm0gPT0gIldlZWs6Y29uZGl0aW9uUHVycmJsZSIpCgpjYXQoIlxuIyMjICoqSW50ZXJhY3Rpb24gVGVybSAoRGlmZmVyZW5jZSBpbiBTbG9wZSkqKlxuIikKaW50ZXJhY3Rpb25fcm93ICU+JQogIHNlbGVjdCh0ZXJtLCBlc3RpbWF0ZSwgc3RkLmVycm9yLCBwLnZhbHVlKSAlPiUKICByZW5hbWUoCiAgICBUZXJtICAgICAgICA9IHRlcm0sCiAgICBFc3RpbWF0ZSAgICA9IGVzdGltYXRlLAogICAgYFN0ZC4gRXJyb3JgID0gc3RkLmVycm9yLAogICAgYHAtdmFsdWVgICAgPSBwLnZhbHVlCiAgKSAlPiUKICBrYWJsZSgKICAgIGNhcHRpb24gPSAiV2Vlazpjb25kaXRpb25QdXJyYmxlIOKAlCBTbG9wZSBEaWZmZXJlbmNlIChQdXJyYmxlIHZzIFdhaXRsaXN0KSIsCiAgICBhbGlnbiAgID0gYygibCIsICJyIiwgInIiLCAiciIpCiAgKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKCiMgNikgKE9wdGlvbmFsKSBQcmludCBhIG1lc3NhZ2UgaW50ZXJwcmV0aW5nIHRoZSBpbnRlcmFjdGlvbgpjYXQoIlxuKipJbnRlcnByZXRhdGlvbjoqKlxuIikKaWYgKGludGVyYWN0aW9uX3JvdyRwLnZhbHVlIDwgMC4wNSkgewogIGNhdCgiVGhlIFdlZWsgw5cgY29uZGl0aW9uIGludGVyYWN0aW9uIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgKHAgPSIsIAogICAgICBzaWduaWYoaW50ZXJhY3Rpb25fcm93JHAudmFsdWUsIDMpLCAKICAgICAgIiksIGluZGljYXRpbmcgdGhhdCB0aGUgc2xvcGUgb2YgY29tcGxldGlvbiBjb3VudHMgb3ZlciB0aW1lIGRpZmZlcnMgYmV0d2VlbiBjb25kaXRpb25zLlxuIikKfSBlbHNlIHsKICBjYXQoIlRoZSBXZWVrIMOXIGNvbmRpdGlvbiBpbnRlcmFjdGlvbiBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAocCA9IiwgCiAgICAgIHNpZ25pZihpbnRlcmFjdGlvbl9yb3ckcC52YWx1ZSwgMyksIAogICAgICAiKSwgc3VnZ2VzdGluZyBubyBldmlkZW5jZSB0aGF0IHRoZSBzbG9wZXMgZGlmZmVyIGJldHdlZW4gY29uZGl0aW9ucy5cbiIpCn0KYGBgCiMjIyBEZXNjcmlwdGl2ZXMgaW4gTnVtYmVyIG9mIFNlc3Npb25zIEF0dGVuZGVkIApEZXNjcmlwdGl2ZXMgb2YgbnVtYmVyIG9mIHNlc3Npb25zIGF0dGVuZGVkIGJ5IGNvbmRpdGlvbiBhbmQgZ2VuZGVyIGlkZW50aXR5IGdyb3VwLiAKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgSWRlbnRpZnkgYXR0ZW5kYW5jZSBjb2x1bW5zICh0aG9zZSBzdGFydGluZyB3aXRoICJXZWVrXyIpCmF0dGVuZGFuY2VfY29scyA8LSBncmVwKCJeV2Vla18iLCBuYW1lcyhQdXJyYmxlX01hc3Rlcl9XaWRlKSwgdmFsdWUgPSBUUlVFKQoKIyBDYWxjdWxhdGUgdG90YWwgc2Vzc2lvbnMgYXR0ZW5kZWQgcGVyIHBhcnRpY2lwYW50ClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUodG90YWxfc2Vzc2lvbnMgPSByb3dTdW1zKGFjcm9zcyhhbGxfb2YoYXR0ZW5kYW5jZV9jb2xzKSkpKQoKIyBPdmVyYWxsIHNlc3Npb25zIGF0dGVuZGVkCm92ZXJhbGxfc2Vzc2lvbnMgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBzdW1tYXJpemUobWVhbl9zZXNzaW9ucyA9IG1lYW4odG90YWxfc2Vzc2lvbnMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNkX3Nlc3Npb25zID0gc2QodG90YWxfc2Vzc2lvbnMsIG5hLnJtID0gVFJVRSkpCgojIFNlc3Npb25zIGF0dGVuZGVkIGJ5IENvbmRpdGlvbgpzZXNzaW9uc19ieV9jb25kaXRpb24gPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24pICU+JQogIHN1bW1hcml6ZShtZWFuX3Nlc3Npb25zID0gbWVhbih0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbiA9IG4oKSkKCiMgU2Vzc2lvbnMgYXR0ZW5kZWQgYnkgR2VuZGVyIElkZW50aXR5CnNlc3Npb25zX2J5X2lkZW50aXR5IDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoaWRlbnRpdHlfZ3JvdXApICU+JQogIHN1bW1hcml6ZShtZWFuX3Nlc3Npb25zID0gbWVhbih0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbiA9IG4oKSkKCiMgU2Vzc2lvbnMgYXR0ZW5kZWQgYnkgQ29uZGl0aW9uIGFuZCBHZW5kZXIgSWRlbnRpdHkKc2Vzc2lvbnNfYnlfYm90aCA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIGdyb3VwX2J5KGNvbmRpdGlvbiwgaWRlbnRpdHlfZ3JvdXApICU+JQogIHN1bW1hcml6ZShtZWFuX3Nlc3Npb25zID0gbWVhbih0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2Rfc2Vzc2lvbnMgPSBzZCh0b3RhbF9zZXNzaW9ucywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbiA9IG4oKSkKCiMgQVBBLWZvcm1hdHRlZCB0YWJsZXMKb3ZlcmFsbF9zZXNzaW9ucyAlPiUKICBrYWJsZShjYXB0aW9uID0gIlRhYmxlIDI6IE92ZXJhbGwgVG90YWwgU2Vzc2lvbnMgQXR0ZW5kZWQiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKCnNlc3Npb25zX2J5X2NvbmRpdGlvbiAlPiUKICBrYWJsZShjYXB0aW9uID0gIlRhYmxlIDM6IFRvdGFsIFNlc3Npb25zIEF0dGVuZGVkIGJ5IENvbmRpdGlvbiIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKc2Vzc2lvbnNfYnlfaWRlbnRpdHkgJT4lCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsZSA0OiBUb3RhbCBTZXNzaW9ucyBBdHRlbmRlZCBieSBHZW5kZXIgSWRlbnRpdHkiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKCnNlc3Npb25zX2J5X2JvdGggJT4lCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsZSA1OiBUb3RhbCBTZXNzaW9ucyBBdHRlbmRlZCBieSBDb25kaXRpb24gYW5kIEdlbmRlciBJZGVudGl0eSIpICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKYGBgCiMjIEF0dHJpdGlvbiBBbmFseXNpcwpBdHRyaXRpb24gaXMgZGVmaW5lZCBoZXJlIGFzIG5vdCBoYXZpbmcgYXR0ZW5kZWQgYW55IHBvc3QtdGVzdCBzZXNzaW9uIChpLmUuLCBubyBhdHRlbmRhbmNlIGR1cmluZyBXZWVrcyAxMeKAkzEzKS4gV2UgY3JlYXRlIGEgYmluYXJ5IGluZGljYXRvciBmb3IgcG9zdC10ZXN0IGNvbXBsZXRpb24gKDEgPSBhdHRlbmRlZCBhdCBsZWFzdCBvbmUgcG9zdC10ZXN0IHNlc3Npb24sIDAgPSBub25lKSBhbmQgY2FsY3VsYXRlIGF0dHJpdGlvbiByYXRlcyBvdmVyYWxsLCBieSBjb25kaXRpb24gYW5kIGJ5IGdlbmRlciBpZGVudGl0eS4gV2UgdXNlZCBhIGNoaS1zcXVhcmUgdGVzdCB0byBkZXRlcm1pbmUgaWYgYXR0cml0aW9uIGRpZmZlcmVkIGJ5IGNvbmRpdGlvbjsgaXQgZGlkIG5vdC4gCiMjIyBBdHRyaXRpb24gQW5hbHlzaXMgYnkgQ29uZGl0aW9uClRoZSBjb25kaXRpb25zIGRpZCBub3Qgc2lnbmlmaWNhbnRseSBkaWZmZXIgb24gYW55IG9mIHRoZSBiYXNlbGluZSBtZWFzdXJlcyBvZiBvdXRjb21lcyBvciBieSBhZ2UuIEF0dHJpdGlvbiByYXRlcyB3ZXJlIGxvdyBhY3Jvc3MgYm90aCBjb25kaXRpb25zLCB3aXRoIDkuMiUgb2YgcGFydGljaXBhbnRzIGluIHRoZSBQdXJyYmxlIGNvbmRpdGlvbiBhbmQgNi41JSBpbiB0aGUgV2FpdGxpc3QgQ29udHJvbCBjb25kaXRpb24gbm90IGNvbXBsZXRpbmcgdGhlIHN0dWR5LiAgQXR0cml0aW9uIGRpZCBub3QgZGlmZmVyIGJ5IGNvbmRpdGlvbiwgz4fCsigxKSA9IDAuMTEsIHAgPSAuNzUsIG9yIGJ5IGdlbmRlciBpZGVudGl0eSwgz4fCsigxKSA8IDAuMDEsIHAgPSAxLgpgYGB7cn0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIyBSZXZpc2VkIEF0dHJpdGlvbiBBbmFseXNpcyB3aXRoIENvbXBsZXRlZCBhbmQgTm90IENvbXBsZXRlZCBDb3VudHMKCiMgRGVmaW5lIHBvc3QtdGVzdCBhdHRlbmRhbmNlIGNvbHVtbnMgKFdlZWtzIDExLCAxMiwgMTMpCnBvc3RfdGVzdF9jb2xzIDwtIGMoIldlZWtfMTEiLCAiV2Vla18xMiIsICJXZWVrXzEzIikKCiMgQ3JlYXRlIGF0dHJpdGlvbiBpbmRpY2F0b3I6IHBvc3RfdGVzdF9jb21wbGV0ZSA9IDEgaWYgYW55IHBvc3QtdGVzdCBzZXNzaW9uIGF0dGVuZGVkLCAwIG90aGVyd2lzZQpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKHBvc3RfdGVzdF9jb21wbGV0ZSA9IGlmX2Vsc2Uocm93U3VtcyhhY3Jvc3MoYWxsX29mKHBvc3RfdGVzdF9jb2xzKSkpID4gMCwgMSwgMCkpCgojIC0tLSBTdGF0aXN0aWNhbCBUZXN0cyBmb3IgQXR0cml0aW9uIGJ5IENvbmRpdGlvbiAtLS0KCiMgQ3JlYXRlIGEgY29udGluZ2VuY3kgdGFibGUgZm9yIGNvbmRpdGlvbiBieSBwb3N0LXRlc3QgY29tcGxldGlvbiBzdGF0dXMKYXR0cml0aW9uX2N0IDwtIHRhYmxlKFB1cnJibGVfTWFzdGVyX1dpZGUkY29uZGl0aW9uLCBQdXJyYmxlX01hc3Rlcl9XaWRlJHBvc3RfdGVzdF9jb21wbGV0ZSkKCiMgQ2hpLXNxdWFyZSB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBhdHRyaXRpb24gYnkgY29uZGl0aW9uCmNoaV9yZXN1bHQgPC0gY2hpc3EudGVzdChhdHRyaXRpb25fY3QpCmNhdCgiQ2hpLXNxdWFyZSB0ZXN0IGZvciBkaWZmZXJlbmNlcyBpbiBhdHRyaXRpb24gYnkgY29uZGl0aW9uOlxuIikKcHJpbnQoY2hpX3Jlc3VsdCkKCiMgQXR0cml0aW9uIGJ5IENvbmRpdGlvbiB3aXRoIGFkZGl0aW9uYWwgY29sdW1ucyBmb3IgQ29tcGxldGVkIGFuZCBOb3QgQ29tcGxldGVkIGNvdW50cwphdHRyaXRpb25fYnlfY29uZGl0aW9uIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgZ3JvdXBfYnkoY29uZGl0aW9uKSAlPiUKICBzdW1tYXJpemUoCiAgICBuID0gbigpLAogICAgQ29tcGxldGVkID0gc3VtKHBvc3RfdGVzdF9jb21wbGV0ZSwgbmEucm0gPSBUUlVFKSwKICAgIE5vdF9Db21wbGV0ZWQgPSBuIC0gQ29tcGxldGVkLAogICAgYXR0cml0aW9uX3JhdGUgPSAxIC0gbWVhbihwb3N0X3Rlc3RfY29tcGxldGUsIG5hLnJtID0gVFJVRSksCiAgICBhdHRyaXRpb25fcGVyY2VudCA9IHJvdW5kKGF0dHJpdGlvbl9yYXRlICogMTAwLCAxKSwKICAgIC5ncm91cHMgPSAiZHJvcCIKICApCgoKIyBEaXNwbGF5IHRoZSBBUEEtZm9ybWF0dGVkIHRhYmxlcyBmb3IgdGhlIHJldmlzZWQgYXR0cml0aW9uIGFuYWx5c2VzCmF0dHJpdGlvbl9ieV9jb25kaXRpb24gJT4lCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsZSA3OiBBdHRyaXRpb24gUmF0ZSBieSBDb25kaXRpb24gKHdpdGggQ29tcGxldGVkIGFuZCBOb3QgQ29tcGxldGVkIGNvdW50cykiLCBmb3JtYXQgPSAibWFya2Rvd24iKSAlPiUKICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCiMjIyBBdHRyaXRpb24gYnkgR2VuZGVyIElkZW50aXR5Ck5vIGRpZmZlcmVuY2VzIQpgYGB7cn0KIyBMb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIyBSZXZpc2VkIEF0dHJpdGlvbiBBbmFseXNpcyB3aXRoIENvbXBsZXRlZCBhbmQgTm90IENvbXBsZXRlZCBDb3VudHMKCiMgRGVmaW5lIHBvc3QtdGVzdCBhdHRlbmRhbmNlIGNvbHVtbnMgKFdlZWtzIDExLCAxMiwgMTMpCnBvc3RfdGVzdF9jb2xzIDwtIGMoIldlZWtfMTEiLCAiV2Vla18xMiIsICJXZWVrXzEzIikKCiMgQ3JlYXRlIGF0dHJpdGlvbiBpbmRpY2F0b3I6IHBvc3RfdGVzdF9jb21wbGV0ZSA9IDEgaWYgYW55IHBvc3QtdGVzdCBzZXNzaW9uIGF0dGVuZGVkLCAwIG90aGVyd2lzZQpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKHBvc3RfdGVzdF9jb21wbGV0ZSA9IGlmX2Vsc2Uocm93U3VtcyhhY3Jvc3MoYWxsX29mKHBvc3RfdGVzdF9jb2xzKSkpID4gMCwgMSwgMCkpCgojIC0tLSBTdGF0aXN0aWNhbCBUZXN0cyBmb3IgQXR0cml0aW9uIGJ5IENvbmRpdGlvbiAtLS0KCiMgQ3JlYXRlIGEgY29udGluZ2VuY3kgdGFibGUgZm9yIGNvbmRpdGlvbiBieSBwb3N0LXRlc3QgY29tcGxldGlvbiBzdGF0dXMKYXR0cml0aW9uX2N0IDwtIHRhYmxlKFB1cnJibGVfTWFzdGVyX1dpZGUkaWRlbnRpdHlfZ3JvdXAsIFB1cnJibGVfTWFzdGVyX1dpZGUkcG9zdF90ZXN0X2NvbXBsZXRlKQoKIyBDaGktc3F1YXJlIHRlc3QgZm9yIGRpZmZlcmVuY2VzIGluIGF0dHJpdGlvbiBieSBkbwpjaGlfcmVzdWx0IDwtIGNoaXNxLnRlc3QoYXR0cml0aW9uX2N0KQpjYXQoIkNoaS1zcXVhcmUgdGVzdCBmb3IgZGlmZmVyZW5jZXMgaW4gYXR0cml0aW9uIGJ5IGdlbmRlciBpZGVudGl0eTpcbiIpCnByaW50KGNoaV9yZXN1bHQpCgojIEF0dHJpdGlvbiBieSBHZW5kZXIgSWRlbnRpdHkgd2l0aCBhZGRpdGlvbmFsIGNvdW50cwphdHRyaXRpb25fYnlfaWRlbnRpdHkgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShpZGVudGl0eV9ncm91cCkgJT4lCiAgc3VtbWFyaXplKAogICAgbiA9IG4oKSwKICAgIENvbXBsZXRlZCA9IHN1bShwb3N0X3Rlc3RfY29tcGxldGUsIG5hLnJtID0gVFJVRSksCiAgICBOb3RfQ29tcGxldGVkID0gbiAtIENvbXBsZXRlZCwKICAgIGF0dHJpdGlvbl9yYXRlID0gMSAtIG1lYW4ocG9zdF90ZXN0X2NvbXBsZXRlLCBuYS5ybSA9IFRSVUUpLAogICAgYXR0cml0aW9uX3BlcmNlbnQgPSByb3VuZChhdHRyaXRpb25fcmF0ZSAqIDEwMCwgMSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKYXR0cml0aW9uX2J5X2lkZW50aXR5ICU+JQogIGthYmxlKGNhcHRpb24gPSAiVGFibGUgODogQXR0cml0aW9uIFJhdGUgYnkgR2VuZGVyIElkZW50aXR5ICh3aXRoIENvbXBsZXRlZCBhbmQgTm90IENvbXBsZXRlZCBjb3VudHMpIiwgZm9ybWF0ID0gIm1hcmtkb3duIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAojIyMgQXR0cml0aW9uIGJ5ICBCYXNlbGluZSBMZXZlbCBvZiB0aGUgT3V0Y29tZXMKSW4gdGhpcyBzZWN0aW9uLCB3ZSBleGFtaW5lZCB3aGV0aGVyIGJhc2VsaW5lIHNjb3JlcyBvbiBrZXkgb3V0Y29tZSBtZWFzdXJlcyB3ZXJlIGFzc29jaWF0ZWQgd2l0aCBlaXRoZXIgY29uZGl0aW9uIG9yIGF0dHJpdGlvbiBzdGF0dXMsIG9yIHdoZXRoZXIgdGhlIGVmZmVjdHMgb2YgdGhlc2UgdHdvIGZhY3RvcnMgaW50ZXJhY3RlZC4gTG9uZWxpbmVzcyB3YXMgc2lnbmlmaWNhbnQ7ICBmb2xsb3ctdXAgYmVsb3cKYGBge3J9CgojIExvYWQgcmVxdWlyZWQgbGlicmFyaWVzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgRGVmaW5lIHByZeKAkXRlc3QgdmFyaWFibGUgbmFtZXMKcHJlX3ZhcnMgIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgICJQcmVfU0hTX1BhdGh3YXlzIiwgIlByZV9TSFNfQWdlbmN5IiwgIlByZV9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAgIlByZV91Y2xhX1N1bSIsICJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgIlByZV9wbWVycV9EaXN0cmFjdF9BdmciLCAiUHJlX3BtZXJxX0FEX0F2ZyIpCgojIFJ1biB0d28td2F5IEFOT1ZBcyBmb3IgZWFjaCBwcmUtdGVzdCB2YXJpYWJsZSB1c2luZyBjb25kaXRpb24gYW5kIGF0dHJpdGlvbl9zdGF0dXMgYXMgZmFjdG9ycywKIyB0aGVuIHRpZHkgYW5kIGRpc3BsYXkgdGhlIHJlc3VsdHMuCmFub3ZhX3RhYmxlX2xpc3QgPC0gbGFwcGx5KHByZV92YXJzLCBmdW5jdGlvbih2YXIpIHsKICAjIENyZWF0ZSB0aGUgZm9ybXVsYTogZS5nLiwgUHJlX1BIUTlfU3VtIH4gY29uZGl0aW9uICogYXR0cml0aW9uX3N0YXR1cwogIG1vZGVsIDwtIGFvdihhcy5mb3JtdWxhKHBhc3RlKHZhciwgIn4gY29uZGl0aW9uICogYXR0cml0aW9uX3N0YXR1cyIpKSwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUpCiAgdGlkeShtb2RlbCkKfSkKbmFtZXMoYW5vdmFfdGFibGVfbGlzdCkgPC0gcHJlX3ZhcnMKCiMgUHJpbnQgYSBzZXBhcmF0ZSBBUEEtc3R5bGVkIHRhYmxlIGZvciBlYWNoIHByZS10ZXN0IHZhcmlhYmxlJ3MgQU5PVkEgcmVzdWx0cwpmb3IgKHZhciBpbiBwcmVfdmFycykgewogIGNhdCgiVHdvLXdheSBBTk9WQSByZXN1bHRzIGZvciIsIHZhciwgIjpcbiIpCiAgcHJpbnQoa2FibGUoYW5vdmFfdGFibGVfbGlzdFtbdmFyXV0sIGRpZ2l0cyA9IDMsCiAgICAgICAgICAgICAgY2FwdGlvbiA9IHBhc3RlKCJUd28td2F5IEFOT1ZBIGZvciIsIHZhciwgImJ5IENvbmRpdGlvbiBhbmQgQXR0cml0aW9uIFN0YXR1cyIpLAogICAgICAgICAgICAgIGZvcm1hdCA9ICJtYXJrZG93biIpICU+JQogICAgICAgICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpKQogIGNhdCgiXG5cbiIpCn0KCmBgYAojIyMjIFVDTEEgTG9uZWxpZXNzIEZvbGxvdyBVcDoKKlJlc3VsdHMqOiBBbW9uZyBBdHRyaXRlcnMsIGJhc2VsaW5lIGxvbmVsaW5lc3Mgd2FzIHNpZ25pZmljYW50bHkgaGlnaGVyIGluIHRoZSBXYWl0bGlzdCBDb250cm9sIGdyb3VwIGNvbXBhcmVkIHRvIHRoZSBQdXJyYmxlIGdyb3VwLCB0KDE0MykgPSAyLjUxLCBwID0gLjAxMy4KQW1vbmcgQ29tcGxldGVycywgdGhlcmUgd2FzIG5vIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gYmFzZWxpbmUgbG9uZWxpbmVzcyBzY29yZXMgYnkgY29uZGl0aW9uLCB0KDE0MykgPSAwLjU4LCBwID0gLjU2LgpgYGB7cn0KIyBMb2FkIHJlcXVpcmVkIHBhY2thZ2VzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZW1tZWFucykKbGlicmFyeShlZmZlY3RzaXplKQpsaWJyYXJ5KHJlbXBzeWMpICAgIyBmb3IgbmljZV90YWJsZQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIFN1cHBvc2UgeW91IGhhdmUgYWxyZWFkeSBmaXQgeW91ciBtb2RlbDoKbW9kZWwgPC0gYW92KFByZV91Y2xhX1N1bSB+IGNvbmRpdGlvbl9mYWN0b3IgKiBhdHRyaXRpb25fc3RhdHVzLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKCiMgT2J0YWluIGVzdGltYXRlZCBtYXJnaW5hbCBtZWFucyBmb3IgJ2NvbmRpdGlvbl9mYWN0b3InIGF0IGVhY2ggbGV2ZWwgb2YgJ2F0dHJpdGlvbl9zdGF0dXMnCmVtbV9yZXN1bHRzIDwtIGVtbWVhbnMobW9kZWwsIH4gY29uZGl0aW9uX2ZhY3RvciB8IGF0dHJpdGlvbl9zdGF0dXMpCnByaW50KGVtbV9yZXN1bHRzKQoKIyBQZXJmb3JtIHBhaXJ3aXNlIGNvbXBhcmlzb25zIHdpdGhpbiBlYWNoIGF0dHJpdGlvbiBzdGF0dXMgZ3JvdXAKcGFpcndpc2VfcmVzdWx0cyA8LSBjb250cmFzdChlbW1fcmVzdWx0cywgbWV0aG9kID0gInBhaXJ3aXNlIikKcHJpbnQocGFpcndpc2VfcmVzdWx0cykKCiMgQ2FsY3VsYXRlIENvaGVuJ3MgZCBmb3IgdGhlIGVmZmVjdCBvZiBjb25kaXRpb24gd2l0aGluIGVhY2ggbGV2ZWwgb2YgYXR0cml0aW9uIHN0YXR1cwoKIyBGb3IgQ29tcGxldGVyczoKZGF0YV9jb21wbGV0ZXIgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUgZmlsdGVyKGF0dHJpdGlvbl9zdGF0dXMgPT0gIkNvbXBsZXRlciIpCmRfY29tcGxldGVyIDwtIGNvaGVuc19kKFByZV91Y2xhX1N1bSB+IGNvbmRpdGlvbl9mYWN0b3IsIGRhdGEgPSBkYXRhX2NvbXBsZXRlcikKcHJpbnQoZF9jb21wbGV0ZXIpCgojIEZvciBBdHRyaXRlcnM6CmRhdGFfYXR0cml0ZXIgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUgZmlsdGVyKGF0dHJpdGlvbl9zdGF0dXMgPT0gIkF0dHJpdGVyIikKZF9hdHRyaXRlciA8LSBjb2hlbnNfZChQcmVfdWNsYV9TdW0gfiBjb25kaXRpb25fZmFjdG9yLCBkYXRhID0gZGF0YV9hdHRyaXRlcikKcHJpbnQoZF9hdHRyaXRlcikKCiMgRW5zdXJlIHRoYXQgY29uZGl0aW9uIGFuZCBhdHRyaXRpb25fc3RhdHVzIGFyZSBmYWN0b3JzClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoY29uZGl0aW9uID0gYXMuZmFjdG9yKGNvbmRpdGlvbiksCiAgICAgICAgIGF0dHJpdGlvbl9zdGF0dXMgPSBhcy5mYWN0b3IoYXR0cml0aW9uX3N0YXR1cykpCgojIENvbXB1dGUgZGVzY3JpcHRpdmVzIGZvciBQcmVfdWNsYV9TdW0gYnkgY29uZGl0aW9uIGFuZCBhdHRyaXRpb25fc3RhdHVzCmdyb3VwX2Rlc2MgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBncm91cF9ieShjb25kaXRpb24sIGF0dHJpdGlvbl9zdGF0dXMpICU+JQogIHN1bW1hcmlzZSgKICAgIE4gPSBuKCksCiAgICBNZWFuID0gcm91bmQobWVhbihQcmVfdWNsYV9TdW0sIG5hLnJtID0gVFJVRSksIDIpLAogICAgU0QgPSByb3VuZChzZChQcmVfdWNsYV9TdW0sIG5hLnJtID0gVFJVRSksIDIpLAogICAgLmdyb3VwcyA9ICJkcm9wIgogICkKCiMgRGlzcGxheSB0aGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyB0YWJsZSB1c2luZyByZW1wc3ljJ3MgbmljZV90YWJsZQpuaWNlX3RhYmxlKGdyb3VwX2Rlc2MsIAogICAgICAgICAgIHRpdGxlID0gIkRlc2NyaXB0aXZlIFN0YXRpc3RpY3MgZm9yIFByZV91Y2xhX1N1bSBieSBDb25kaXRpb24gYW5kIEF0dHJpdGlvbiBTdGF0dXMiLCAKICAgICAgICAgICBub3RlID0gIk1lYW5zIGFuZCBzdGFuZGFyZCBkZXZpYXRpb25zIGZvciBQcmVfdWNsYV9TdW0gYWNyb3NzIGZvdXIgZ3JvdXBzIGRlZmluZWQgYnkgY29uZGl0aW9uIChQdXJyYmxlLCBXYWl0bGlzdCBDb250cm9sKSBhbmQgYXR0cml0aW9uIHN0YXR1cyAoQ29tcGxldGVyLCBBdHRyaXRlcikuIikKCiMgRW5zdXJlIHRoYXQgY29uZGl0aW9uIGFuZCBhdHRyaXRpb25fc3RhdHVzIGFyZSBmYWN0b3JzClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoY29uZGl0aW9uID0gYXMuZmFjdG9yKGNvbmRpdGlvbiksCiAgICAgICAgIGF0dHJpdGlvbl9zdGF0dXMgPSBhcy5mYWN0b3IoYXR0cml0aW9uX3N0YXR1cykpCgojIFNpbXBsZSBFZmZlY3RzIEFuYWx5c2lzIGZvciBQcmVfdWNsYV9TdW0gYnkgYXR0cml0aW9uX3N0YXR1cyB3aXRoaW4gdGhlIFB1cnJibGUgY29uZGl0aW9uCnB1cnJibGVfdHRlc3QgPC0gbmljZV90X3Rlc3QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lIGZpbHRlcihjb25kaXRpb24gPT0gIjEiKSwKICByZXNwb25zZSA9ICJQcmVfdWNsYV9TdW0iLAogIGdyb3VwID0gImF0dHJpdGlvbl9zdGF0dXMiLAogIHdhcm5pbmcgPSBGQUxTRQopCgojIFNpbXBsZSBFZmZlY3RzIEFuYWx5c2lzIGZvciBQcmVfdWNsYV9TdW0gYnkgYXR0cml0aW9uX3N0YXR1cyB3aXRoaW4gdGhlIFdhaXRsaXN0IENvbnRyb2wgY29uZGl0aW9uCndhaXRsaXN0X3R0ZXN0IDwtIG5pY2VfdF90ZXN0KAogIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JSBmaWx0ZXIoY29uZGl0aW9uID09ICIwIiksCiAgcmVzcG9uc2UgPSAiUHJlX3VjbGFfU3VtIiwKICBncm91cCA9ICJhdHRyaXRpb25fc3RhdHVzIiwKICB3YXJuaW5nID0gRkFMU0UKKQoKIyBEaXNwbGF5IHRoZSByZXN1bHRzIHVzaW5nIHJlbXBzeWMncyBuaWNlX3RhYmxlCmNhdCgiU2ltcGxlIEVmZmVjdHMgQW5hbHlzaXM6IFByZV91Y2xhX1N1bSBieSBBdHRyaXRpb24gU3RhdHVzIHdpdGhpbiB0aGUgUHVycmJsZSBDb25kaXRpb25cbiIpCm5pY2VfdGFibGUocHVycmJsZV90dGVzdCkKCmNhdCgiXG5TaW1wbGUgRWZmZWN0cyBBbmFseXNpczogUHJlX3VjbGFfU3VtIGJ5IEF0dHJpdGlvbiBTdGF0dXMgd2l0aGluIHRoZSBXYWl0bGlzdCBDb250cm9sIENvbmRpdGlvblxuIikKbmljZV90YWJsZSh3YWl0bGlzdF90dGVzdCkKCmBgYAojIyBCYXNlbGluZSBPdXRjb21lIFZhcmlhYmxlcyBBbmFseXNlcwojIyMgUmVsaWFiaWxpdHkKYGBge3J9CiMgTG9hZCBwc3ljaCBmb3IgQ3JvbmJhY2jigJlzIGFscGhhCmxpYnJhcnkocHN5Y2gpCgojIEFzc3VtZSB5b3VyIGRhdGEgZnJhbWUgaXMgbmFtZWQgTm9EdXBfUHVycmJsZUFub24KZGYgPC0gTm9EdXBfUHVycmJsZUFub24KCiMgSGVscGVyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYW5kIHByaW50IG9ubHkgdGhlIG92ZXJhbGwgQ3JvbmJhY2jigJlzIM6xCmdldF9hbHBoYSA8LSBmdW5jdGlvbihpdGVtc19kZikgewogIGEgPC0gYWxwaGEoaXRlbXNfZGYsIHdhcm5pbmdzID0gRkFMU0UpCiAgcmV0dXJuKGEkdG90YWxbWyJyYXdfYWxwaGEiXV0pCn0KCiMgMSkgREVSU+KAkDggKGRlcnM4XzEgdGhyb3VnaCBkZXJzOF84KQpkZXJzOF9pdGVtcyA8LSBkZlssIGMoImRlcnM4XzEiLCAiZGVyczhfMiIsICJkZXJzOF8zIiwgImRlcnM4XzQiLAogICAgICAgICAgICAgICAgICAgICAgImRlcnM4XzUiLCAiZGVyczhfNiIsICJkZXJzOF83IiwgImRlcnM4XzgiKV0KZGVyczhfYWxwaGEgPC0gZ2V0X2FscGhhKGRlcnM4X2l0ZW1zKQpjYXQoIkRFUlMtOCBDcm9uYmFjaOKAmXMgzrEgPSIsIHJvdW5kKGRlcnM4X2FscGhhLCAzKSwgIlxuIikKCiMgMikgR0FELTcgKGdhZDdfMSB0aHJvdWdoIGdhZDdfNykKZ2FkN19pdGVtcyA8LSBkZlssIGMoImdhZDdfMSIsICJnYWQ3XzIiLCAiZ2FkN18zIiwgImdhZDdfNCIsCiAgICAgICAgICAgICAgICAgICAgICJnYWQ3XzUiLCAiZ2FkN182IiwgImdhZDdfNyIpXQpnYWQ3X2FscGhhIDwtIGdldF9hbHBoYShnYWQ3X2l0ZW1zKQpjYXQoIkdBRC03IENyb25iYWNo4oCZcyDOsSA9Iiwgcm91bmQoZ2FkN19hbHBoYSwgMyksICJcbiIpCgojIDMpIFBIUS05IChwaHE5XzEgdGhyb3VnaCBwaHE5XzkpCnBocTlfaXRlbXMgPC0gZGZbLCBjKCJwaHE5XzEiLCAicGhxOV8yIiwgInBocTlfMyIsICJwaHE5XzQiLAogICAgICAgICAgICAgICAgICAgICAicGhxOV81IiwgInBocTlfNiIsICJwaHE5XzciLCAicGhxOV84IiwgInBocTlfOSIpXQpwaHE5X2FscGhhIDwtIGdldF9hbHBoYShwaHE5X2l0ZW1zKQpjYXQoIlBIUS05IENyb25iYWNo4oCZcyDOsSA9Iiwgcm91bmQocGhxOV9hbHBoYSwgMyksICJcbiIpCgojIDQpIFNIUyAoc2hzXzEgdGhyb3VnaCBzaHNfNikKc2hzX2l0ZW1zIDwtIGRmWywgYygic2hzXzEiLCAic2hzXzIiLCAic2hzXzMiLCAic2hzXzQiLCAic2hzXzUiLCAic2hzXzYiKV0Kc2hzX2FscGhhIDwtIGdldF9hbHBoYShzaHNfaXRlbXMpCmNhdCgiU0hTIFRvdGFsIENyb25iYWNo4oCZcyDOsSA9Iiwgcm91bmQoc2hzX2FscGhhLCAzKSwgIlxuIikKCiMgNSkgVUNMQSAodWNsYTEgdGhyb3VnaCB1Y2xhMykKdWNsYV9pdGVtcyA8LSBkZlssIGMoInVjbGExIiwgInVjbGEyIiwgInVjbGEzIildCnVjbGFfYWxwaGEgPC0gZ2V0X2FscGhhKHVjbGFfaXRlbXMpCmNhdCgiVUNMQSBMb25lbGluZXNzIENyb25iYWNo4oCZcyDOsSA9Iiwgcm91bmQodWNsYV9hbHBoYSwgMyksICJcbiIpCgojIDYpIFBNRVJRLUVuZ2FnZSAocG1lcnFfZW5nYWdlXzEgdGhyb3VnaCBwbWVycV9lbmdhZ2VfOSkKcG1lcnFfaXRlbXMgPC0gZGZbLCBjKCJwbWVycV9lbmdhZ2VfMSIsICJwbWVycV9lbmdhZ2VfMiIsICJwbWVycV9lbmdhZ2VfMyIsCiAgICAgICAgICAgICAgICAgICAgICAicG1lcnFfZW5nYWdlXzQiLCAicG1lcnFfZW5nYWdlXzUiLCAicG1lcnFfZW5nYWdlXzYiLAogICAgICAgICAgICAgICAgICAgICAgInBtZXJxX2VuZ2FnZV83IiwgInBtZXJxX2VuZ2FnZV84IiwgInBtZXJxX2VuZ2FnZV85IildCnBtZXJxX2FscGhhIDwtIGdldF9hbHBoYShwbWVycV9pdGVtcykKY2F0KCJQTUVSUS1FbmdhZ2UgQ3JvbmJhY2jigJlzIM6xID0iLCByb3VuZChwbWVycV9hbHBoYSwgMyksICJcbiIpCmBgYAoKIyMjIERlc2NyaXB0aXZlIEFuYWx5c2VzClRoZSB0YWJsZSBiZWxvdyBzaG93cyBQcmUtIGFuZCBQb3N0LVRlc3QgRGVzY3JpcHRpdmVzIGZvciBTdHVkeSBWYXJpYWJsZXMKYGBge3J9CiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoYnJvb20pCgojIERlZmluZSBwcmUtdGVzdCBhbmQgcG9zdC10ZXN0IHZhcmlhYmxlcwpwcmVfdmFycyA8LSBjKCJQcmVfREVSUzhfU3VtIiwgIlByZV9HQUQ3X1N1bSIsICJQcmVfUEhROV9TdW0iLAogICAgICAgICAgICAgICJQcmVfU0hTX1BhdGh3YXlzIiwgIlByZV9TSFNfQWdlbmN5IiwgIlByZV9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAiUHJlX3VjbGFfU3VtIiwgIlByZV9wbWVycV9Gb2N1c19BdmciLCAiUHJlX3BtZXJxX0Rpc3RyYWN0X0F2ZyIsICJQcmVfcG1lcnFfQURfQXZnIikKCnBvc3RfdmFycyA8LSBjKCJQb3N0X0RFUlM4X1N1bSIsICJQb3N0X0dBRDdfU3VtIiwgIlBvc3RfUEhROV9TdW0iLAogICAgICAgICAgICAgICAiUG9zdF9TSFNfUGF0aHdheXMiLCAiUG9zdF9TSFNfQWdlbmN5IiwgIlBvc3RfU0hTX1RvdGFsSG9wZSIsCiAgICAgICAgICAgICAgICJQb3N0X3VjbGFfU3VtIiwgIlBvc3RfcG1lcnFfRm9jdXNfQXZnIiwgIlBvc3RfcG1lcnFfRGlzdHJhY3RfQXZnIiwgIlBvc3RfcG1lcnFfQURfQXZnIikKCgojIENvbXB1dGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBmb3IgUHJlLVRlc3QgRGF0YQpwcmVfZGVzY3JpcHRpdmVzIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBzZWxlY3QoYWxsX29mKHByZV92YXJzKSkgJT4lCiAgcHN5Y2g6OmRlc2NyaWJlKCkgJT4lCiAgYXMuZGF0YS5mcmFtZSgpICU+JQogIHNlbGVjdChuLCBtZWFuLCBzZCwgbWluLCBtYXgsIHNrZXcsIGt1cnRvc2lzKSAlPiUKICByZW5hbWUoTiA9IG4sIE1lYW4gPSBtZWFuLCBTRCA9IHNkLCBNaW4gPSBtaW4sIE1heCA9IG1heCwgU2tld25lc3MgPSBza2V3LCBLdXJ0b3NpcyA9IGt1cnRvc2lzKQoKIyBDb21wdXRlIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgZm9yIFBvc3QtVGVzdCBEYXRhCnBvc3RfZGVzY3JpcHRpdmVzIDwtIHB1cnJibGVfd2lkZV9maW5hbCAlPiUKICBzZWxlY3QoYWxsX29mKHBvc3RfdmFycykpICU+JQogIHBzeWNoOjpkZXNjcmliZSgpICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBzZWxlY3QobiwgbWVhbiwgc2QsIG1pbiwgbWF4LCBza2V3LCBrdXJ0b3NpcykgJT4lCiAgcmVuYW1lKE4gPSBuLCBNZWFuID0gbWVhbiwgU0QgPSBzZCwgTWluID0gbWluLCBNYXggPSBtYXgsIFNrZXduZXNzID0gc2tldywgS3VydG9zaXMgPSBrdXJ0b3NpcykKCiMgRGlzcGxheSBEZXNjcmlwdGl2ZSBUYWJsZXMKY2F0KCJcbiMjIyAqKlByZS1UZXN0IERlc2NyaXB0aXZlIFN0YXRpc3RpY3MqKlxuIikKa2FibGUocHJlX2Rlc2NyaXB0aXZlcywgY2FwdGlvbiA9ICJEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBQcmUtVGVzdCBEYXRhIiwgZGlnaXRzID0gMykKCmNhdCgiXG4jIyMgKipQb3N0LVRlc3QgRGVzY3JpcHRpdmUgU3RhdGlzdGljcyoqXG4iKQprYWJsZShwb3N0X2Rlc2NyaXB0aXZlcywgY2FwdGlvbiA9ICJEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzIGZvciBQb3N0LVRlc3QgRGF0YSIsIGRpZ2l0cyA9IDMpCgpgYGAKIyMjIEJhc2xlaW5lIEVxdWl2YWxlbmNlIG9mIE91dGNvbWVzICh04oCRVGVzdHMpOgpXZSBydW4gaW5kZXBlbmRlbnQgc2FtcGxlcyB04oCRdGVzdHMgY29tcGFyaW5nIHRoZSB0d28gY29uZGl0aW9ucyBvbiBlYWNoIHByZeKAkXRlc3QgdmFyaWFibGUgdXNpbmcgbmljZV90X3Rlc3QgZnJvbSByZW1wc3ljLiBUaGlzIHByb3ZpZGVzIHTigJFzdGF0aXN0aWNzLCBkZWdyZWVzIG9mIGZyZWVkb20sIHDigJF2YWx1ZXMsIGVmZmVjdCBzaXplcyAoQ29oZW4ncyBkKSwgYW5kIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCBhbGwgZm9ybWF0dGVkIGludG8gYW4gQVBB4oCRc3R5bGUgdGFibGUuCipSZXN1bHQqOiBObyBkaWZmZXJlbmNlcyBieSBjaGFuY2UuCmBgYHtyfQpsaWJyYXJ5KHJlbXBzeWMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKCiMgRGVmaW5lIHByZeKAkXRlc3QgdmFyaWFibGUgbmFtZXMgCnByZV92YXJzICA8LSBjKCJQcmVfREVSUzhfU3VtIiwgIlByZV9HQUQ3X1N1bSIsICJQcmVfUEhROV9TdW0iLAogICAgICAgICAgICAgICAiUHJlX1NIU19QYXRod2F5cyIsICJQcmVfU0hTX0FnZW5jeSIsICJQcmVfU0hTX1RvdGFsSG9wZSIsCiAgICAgICAgICAgICAgICJQcmVfdWNsYV9TdW0iLCAiUHJlX3BtZXJxX0ZvY3VzX0F2ZyIsICJQcmVfcG1lcnFfRGlzdHJhY3RfQXZnIiwgIlByZV9wbWVycV9BRF9BdmciKQoKCiMgUnVuIHQtdGVzdHMgZm9yIGFsbCBwcmXigJF0ZXN0IG91dGNvbWVzIGJ5IGNvbmRpdGlvbgpzdGF0cy50YWJsZS5wcmUgPC0gbmljZV90X3Rlc3QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSBwcmVfdmFycywKICBncm91cCA9ICJjb25kaXRpb24iLAogIHdhcm5pbmcgPSBGQUxTRQopCgojIERpc3BsYXkgdGhlIHByZeKAkXRlc3QgdC10ZXN0IHRhYmxlIGluIEFQQSBzdHlsZQpuaWNlX3RhYmxlKHN0YXRzLnRhYmxlLnByZSkKYGBgCiMjIyBPdXRsaWVyIERldGVjdGlvbiBhbmQgVmlzdWFsaXphdGlvbiA6CldlIGZpcnN0IGNvbnZlcnQgZWFjaCBwcmXigJF0ZXN0IHZhcmlhYmxlIHRvIHrigJFzY29yZXMgYW5kIGZsYWcgYW55IG9ic2VydmF0aW9ucyB3aXRoIGFuIGFic29sdXRlIHrigJFzY29yZSBncmVhdGVyIHRoYW4gMyBhcyBwb3RlbnRpYWwgb3V0bGllcnMuIEEgc3VtbWFyeSB0YWJsZSBpcyBjcmVhdGVkIHRoYXQgbGlzdHMgdGhlIG51bWJlciBvZiBvdXRsaWVycyBmb3IgZWFjaCB2YXJpYWJsZS4gV2UgdGhlbiBzcGVjaWZpY2FsbHkgaW5zcGVjdCB0aGUgb3V0bGllcnMgZm9yIHRoZSBQcmVfcG1lcnFfRm9jdXNfQXZnIHZhcmlhYmxlLCB3aGljaCBhcHBlYXJzIHRvIGhhdmUgdHdvIGNhc2VzIGV4Y2VlZGluZyBvdXIgdGhyZXNob2xkLgpUbyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgZGlzdHJpYnV0aW9uIG9mIFByZV9wbWVycV9Gb2N1c19BdmcsIHdlIGdlbmVyYXRlIGEgYm94cGxvdCAod2l0aCBqaXR0ZXJlZCBkYXRhIHBvaW50cykgdGhhdCB2aXN1YWxseSBoaWdobGlnaHRzIHRoZSBleHRyZW1lIHZhbHVlcy4KYGBge3J9CmxpYnJhcnkocmVtcHN5YykKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyBEZWZpbmUgcHJl4oCRdGVzdCB2YXJpYWJsZSBuYW1lcyAKcHJlX3ZhcnMgIDwtIGMoIlByZV9ERVJTOF9TdW0iLCAiUHJlX0dBRDdfU3VtIiwgIlByZV9QSFE5X1N1bSIsCiAgICAgICAgICAgICAgICJQcmVfU0hTX1BhdGh3YXlzIiwgIlByZV9TSFNfQWdlbmN5IiwgIlByZV9TSFNfVG90YWxIb3BlIiwKICAgICAgICAgICAgICAgIlByZV91Y2xhX1N1bSIsICJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgIlByZV9wbWVycV9EaXN0cmFjdF9BdmciLCAiUHJlX3BtZXJxX0FEX0F2ZyIpCgojIFNldCB0aHJlc2hvbGQgZm9yIG91dGxpZXJzIChjb21tb25seSB8enwgPiAzKQp0aHJlc2hvbGQgPC0gMwoKIyBDb21wdXRlIHotc2NvcmVzIGFuZCBpZGVudGlmeSBvdXRsaWVycyBmb3IgZWFjaCBwcmUtdGVzdCB2YXJpYWJsZQpvdXRsaWVyX2xpc3QgPC0gbGFwcGx5KHByZV92YXJzLCBmdW5jdGlvbih2YXIpIHsKICBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogICAgc2VsZWN0KHBzaWQsIGFsbF9vZih2YXIpKSAlPiUKICAgIG11dGF0ZSh6ID0gYXMubnVtZXJpYyhzY2FsZShnZXQodmFyKSkpKSAlPiUKICAgIGZpbHRlcihhYnMoeikgPiB0aHJlc2hvbGQpCn0pCm5hbWVzKG91dGxpZXJfbGlzdCkgPC0gcHJlX3ZhcnMKCiMgQ3JlYXRlIGEgc3VtbWFyeSB0YWJsZSBvZiB0aGUgbnVtYmVyIG9mIG91dGxpZXJzIHBlciB2YXJpYWJsZQpvdXRsaWVyX3N1bW1hcnkgPC0gc2FwcGx5KG91dGxpZXJfbGlzdCwgbnJvdykKb3V0bGllcl9zdW1tYXJ5X2RmIDwtIGRhdGEuZnJhbWUoVmFyaWFibGUgPSBuYW1lcyhvdXRsaWVyX3N1bW1hcnkpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0bGllcl9Db3VudCA9IGFzLnZlY3RvcihvdXRsaWVyX3N1bW1hcnkpKQoKY2F0KCJTdW1tYXJ5IG9mIFBvdGVudGlhbCBPdXRsaWVycyAofHp8ID4gMykgZm9yIFByZS1UZXN0IFZhcmlhYmxlczpcbiIpCnByaW50KGthYmxlKG91dGxpZXJfc3VtbWFyeV9kZiwgY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIE91dGxpZXJzIGZvciBQcmUtVGVzdCBWYXJpYWJsZXMgKHx6fCA+IDMpIiwgZm9ybWF0ID0gIm1hcmtkb3duIikpCgoKY2F0KCJcbk91dGxpZXJzIGZvciBQcmVfcG1lcnFfRm9jdXNfQXZnICh8enwgPiAzKTpcbiIpCnByaW50KGthYmxlKG91dGxpZXJfbGlzdFtbIlByZV9wbWVycV9Gb2N1c19BdmciXV0sIGNhcHRpb24gPSAiT3V0bGllcnMgZm9yIFByZV9wbWVycV9Gb2N1c19BdmciLCBmb3JtYXQgPSAibWFya2Rvd24iKSkKCmxpYnJhcnkoZ2dwbG90MikKCiMgQm94cGxvdCBmb3IgUHJlX3BtZXJxX0ZvY3VzX0F2ZwpnZ3Bsb3QoUHVycmJsZV9NYXN0ZXJfV2lkZSwgYWVzKHggPSAiIiwgeSA9IFByZV9wbWVycV9Gb2N1c19BdmcpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3VyID0gInJlZCIsIG91dGxpZXIuc2hhcGUgPSAxNiwgb3V0bGllci5zaXplID0gMykgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4xLCBhbHBoYSA9IDAuNiwgY29sb3IgPSAiYmx1ZSIpICsKICBsYWJzKHRpdGxlID0gIkJveHBsb3Qgb2YgUHJlX3BtZXJxX0ZvY3VzX0F2ZyIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIlByZV9wbWVycV9Gb2N1c19BdmciKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCiMgTWFpbiBFZmZlY3RzIEFuYWx5c2VzCldlIGZpdCBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbHMgdG8gZXhhbWluZSB0aGUgZWZmZWN0IG9mIGNvbmRpdGlvbiAoY29kZWQgYXMgMSA9IFB1cnJibGUsIDAgPSBXYWl0bGlzdCBDb250cm9sKSBvbiBwb3N0LXRlc3Qgb3V0Y29tZXMsIGNvbnRyb2xsaW5nIGZvciBiYXNlbGluZSBsZXZlbHMgb2YgdGhlIG91dGNvbWUsIGdlbmRlciBpZGVudGl0eSAobnVtZXJpYyksIGFuZCBhZ2UuCkRFUlMtODogUGFydGljaXBhbnRzIGluIHRoZSBQdXJyYmxlIGNvbmRpdGlvbiByZXBvcnRlZCBzaWduaWZpY2FudGx5IGJldHRlciBvdXRjb21lcyBhdCBwb3N0LXRlc3QKUFBNRVJRLUFEOiBBIHNpZ25pZmljYW50IHBvc2l0aXZlIGVmZmVjdCBvZiBjb25kaXRpb24gd2FzIGZvdW5kClBIUS05OiBUaGUgUHVycmJsZSBncm91cCBzaG93ZWQgbG93ZXIgZGVwcmVzc2l2ZSBzeW1wdG9tcyBhdCBwb3N0LXRlc3QKR0FELTc6IFRoZSBjb25kaXRpb24gZWZmZWN0IHdhcyBhbHNvIHNpZ25pZmljYW50LCB0aG91Z2ggc21hbGxlciwgZmF2b3JpbmcgUHVycmJsZSBjb25kaXRpb24uCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHJlbXBzeWMpICAgIyBmb3IgbmljZV9sbSBhbmQgbmljZV90YWJsZQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIERlZmluZSBwb3N04oCRdGVzdCBvdXRjb21lcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBwcmXigJF0ZXN0IGNvdmFyaWF0ZXMKcG9zdF92YXJzIDwtIGMoIlBvc3RfREVSUzhfU3VtIiwgIlBvc3RfcG1lcnFfRm9jdXNfQXZnIiwgIlBvc3RfcG1lcnFfRGlzdHJhY3RfQXZnIiwgCiAgICAgICAgICAgICAgICJQb3N0X3BtZXJxX0FEX0F2ZyIsICJQb3N0X0dBRDdfU3VtIiwgIlBvc3RfUEhROV9TdW0iLCAKICAgICAgICAgICAgICAgIlBvc3RfU0hTX1BhdGh3YXlzIiwgIlBvc3RfU0hTX0FnZW5jeSIsICJQb3N0X1NIU19Ub3RhbEhvcGUiLCAiUG9zdF91Y2xhX1N1bSIpCnByZV92YXJzICA8LSBzdWIoIl5Qb3N0XyIsICJQcmVfIiwgcG9zdF92YXJzKQoKIyBDcmVhdGUgYW4gZW1wdHkgbGlzdCB0byBzdG9yZSByZWdyZXNzaW9uIG1vZGVscwptb2RlbF9saXN0IDwtIGxpc3QoKQoKIyBMb29wIHRocm91Z2ggZWFjaCBvdXRjb21lIHBhaXIKZm9yIChpIGluIHNlcV9hbG9uZyhwb3N0X3ZhcnMpKSB7CiAgb3V0Y29tZSA8LSBwb3N0X3ZhcnNbaV0KICBwcmVfdmFyIDwtIHByZV92YXJzW2ldCiAgCiAgIyBGaXQgdGhlIHJlZ3Jlc3Npb24gbW9kZWw6CiAgIyBPdXRjb21lIH4gY29uZGl0aW9uX251bSArIGNvcnJlc3BvbmRpbmcgcHJlLXRlc3Qgb3V0Y29tZSArIGlkZW50aXR5X2dyb3VwX251bSArIGFnZQogIGZvcm11bGFfc3RyIDwtIHBhc3RlKG91dGNvbWUsICJ+IGNvbmRpdGlvbl9udW0gKyIsIHByZV92YXIsICIrIGlkZW50aXR5X2dyb3VwX251bSArIGFnZSIpCiAgbW9kZWxfbGlzdFtbb3V0Y29tZV1dIDwtIGxtKGFzLmZvcm11bGEoZm9ybXVsYV9zdHIpLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKfQoKIyBGb3JtYXQgdGhlIGxpc3Qgb2YgbW9kZWxzIHVzaW5nIHJlbXBzeWMncyBuaWNlX2xtKCkgZnVuY3Rpb24KIyBUaGlzIHdpbGwgcHJvZHVjZSBhIGNvbWJpbmVkIHRhYmxlIGZvciBhbGwgbW9kZWxzLCBoaWdobGlnaHRpbmcgdGhlIGVmZmVjdCBvZiBjb25kaXRpb25fbnVtLgpyZXN1bHRzX3RhYmxlIDwtIG5pY2VfbG0obW9kZWxfbGlzdCkKCiMgRGlzcGxheSB0aGUgdGFibGUgaW4gQVBBIGZvcm1hdCB1c2luZyBuaWNlX3RhYmxlCm5pY2VfdGFibGUocmVzdWx0c190YWJsZSwgaGlnaGxpZ2h0ID0gVFJVRSkKCmBgYAojIyBNYWluIEVmZmVjdHMgd2l0aG91dCBvdXRsaWVycwpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShyZW1wc3ljKSAgICMgZm9yIG5pY2VfbG0gYW5kIG5pY2VfdGFibGUKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDEuIENyZWF0ZSBhIGRhdGFzZXQgd2l0aCB0aGUgb3V0bGllcnMgcmVtb3ZlZAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClB1cnJibGVfTWFzdGVyX1dpZGVfbm9fb3V0bGllcnMgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBmaWx0ZXIoIXBzaWQgJWluJSBjKCJDNTciLCAiQzc5IikpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMi4gRml0IHRoZSByZWdyZXNzaW9uIG1vZGVscyBmb3IgUG9zdF9wbWVycV9Gb2N1c19BdmcKIyAgICBPdXRjb21lIH4gY29uZGl0aW9uX251bSArIFByZV9wbWVycV9Gb2N1c19BdmcgKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBNb2RlbCB1c2luZyB0aGUgZnVsbCBkYXRhc2V0ICh3aXRoIG91dGxpZXJzKQptb2RlbF9mb2N1c19mdWxsIDwtIGxtKFBvc3RfcG1lcnFfRm9jdXNfQXZnIH4gY29uZGl0aW9uX251bSArIFByZV9wbWVycV9Gb2N1c19BdmcgKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSkKCiMgTW9kZWwgdXNpbmcgdGhlIGRhdGFzZXQgd2l0aCBvdXRsaWVycyByZW1vdmVkCm1vZGVsX2ZvY3VzX25vX291dGxpZXJzIDwtIGxtKFBvc3RfcG1lcnFfRm9jdXNfQXZnIH4gY29uZGl0aW9uX251bSArIFByZV9wbWVycV9Gb2N1c19BdmcgKyBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlX25vX291dGxpZXJzKQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDMuIENvbXBhcmUgdGhlIG1vZGVsIHN1bW1hcmllcyB0byBhc3Nlc3MgdGhlIGltcGFjdCBvZiBvdXRsaWVycwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmNhdCgiTW9kZWwgU3VtbWFyeSAoRnVsbCBEYXRhc2V0KTpcbiIpCnByaW50KHN1bW1hcnkobW9kZWxfZm9jdXNfZnVsbCkpCgpjYXQoIlxuTW9kZWwgU3VtbWFyeSAoT3V0bGllcnMgUmVtb3ZlZCk6XG4iKQpwcmludChzdW1tYXJ5KG1vZGVsX2ZvY3VzX25vX291dGxpZXJzKSkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyA0LiBDb21wdXRlIGFuZCBpbnNwZWN0IENvb2sncyBEaXN0YW5jZSBpbiB0aGUgZnVsbCBtb2RlbAojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ2FsY3VsYXRlIENvb2sncyBkaXN0YW5jZSBmb3IgdGhlIGZ1bGwgbW9kZWwKY29va3NfZnVsbCA8LSBjb29rcy5kaXN0YW5jZShtb2RlbF9mb2N1c19mdWxsKQoKIyBJZGVudGlmeSBpbmZsdWVudGlhbCBvYnNlcnZhdGlvbnMgdXNpbmcgdGhlIGNvbW1vbiB0aHJlc2hvbGQ6IDQvKG4gLSBrIC0gMSkKbl9mdWxsIDwtIG5yb3coUHVycmJsZV9NYXN0ZXJfV2lkZSkKa19mdWxsIDwtIGxlbmd0aChjb2VmKG1vZGVsX2ZvY3VzX2Z1bGwpKSAtIDEgICMgbnVtYmVyIG9mIHByZWRpY3RvcnMgKGV4Y2x1ZGluZyBpbnRlcmNlcHQpCnRocmVzaG9sZF9jZCA8LSA0IC8gKG5fZnVsbCAtIGtfZnVsbCAtIDEpCgojIEZpbmQgd2hpY2ggb2JzZXJ2YXRpb25zIGV4Y2VlZCB0aGlzIHRocmVzaG9sZAppbmZsdWVudGlhbF9pbmRpY2VzIDwtIHdoaWNoKGNvb2tzX2Z1bGwgPiB0aHJlc2hvbGRfY2QpCmluZmx1ZW50aWFsX2lkcyA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlJHBzaWRbaW5mbHVlbnRpYWxfaW5kaWNlc10KCmNhdCgiXG5JbmZsdWVudGlhbCBPYnNlcnZhdGlvbnMgaW4gdGhlIEZ1bGwgTW9kZWwgKENvb2sncyBEaXN0YW5jZSA+ICIsIHJvdW5kKHRocmVzaG9sZF9jZCwgNCksICIpOlxuIiwgc2VwID0gIiIpCnByaW50KGluZmx1ZW50aWFsX2lkcykKCiMgT3B0aW9uYWxseSwgcGxvdCBDb29rJ3MgZGlzdGFuY2VzIGZvciBhIHZpc3VhbCBjaGVjawpwbG90KG1vZGVsX2ZvY3VzX2Z1bGwsIHdoaWNoID0gNCwgbWFpbiA9ICJDb29rJ3MgRGlzdGFuY2UgLSBGdWxsIE1vZGVsIikKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyA1LiBDcmVhdGUgYSBjb21wYXJpc29uIHRhYmxlIHVzaW5nIHJlbXBzeWMncyBuaWNlX2xtIChpZiBkZXNpcmVkKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1vZGVsc190b19jb21wYXJlIDwtIGxpc3QoIkZ1bGwiID0gbW9kZWxfZm9jdXNfZnVsbCwgIk5vIE91dGxpZXJzIiA9IG1vZGVsX2ZvY3VzX25vX291dGxpZXJzKQpjb21wYXJpc29uX3RhYmxlIDwtIG5pY2VfbG0obW9kZWxzX3RvX2NvbXBhcmUpCmthYmxlKGNvbXBhcmlzb25fdGFibGUsIGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiQ29tcGFyaXNvbiBvZiBNb2RlbCBFc3RpbWF0ZXMgZm9yIFBvc3RfcG1lcnFfRm9jdXNfQXZnIikgJT4lCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAojIyBNb2RlcmF0aW9uIE1vZGVscyBmb3IgTWFpbiBFZmZlY3RzClRoZXNlIG1vZGVscyBsb29rIGF0IHR3byBxdWVzdGlvbnM6ICgxKSBEb2VzIHRoZSBpbXBhY3Qgb2YgY29uZGl0aW9uIGRlcGVuZCBvbiBwYXJ0aWNpcGFudHMnIGJhc2VsaW5lIGxldmVsIG9mIHRoYXQgb3V0Y29tZT8gYW5kICgyKSBEb2VzIHRoZSBpbXBhY3Qgb2YgY29uZGl0aW9uIGRpZmZlciBmb3IgVEdEIHZzLiBjaXMgcGFydGljaXBhbnRzPwpXZSBmaW5kIHNpZ25pZmljYW50IG1vZGVyYXRpb24gYnkgZ2VuZGVyIGlkZW50aXR5IGZvciBERVJTLTggYW5kIEdBRC03OyBub25lIGZvciBiYXNlbGluZSB2ZXJzaW9uIG9mIHRoZSBvdXRjb21lLgpgYGB7cn0KbGlicmFyeShyZW1wc3ljKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZHBseXIpCgojIENvbnZlcnQgaWRlbnRpdHlfZ3JvdXAgZmFjdG9yIHRvIG51bWVyaWMgY29kZXMKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZShpZGVudGl0eV9ncm91cF9udW0gPSBhcy5udW1lcmljKGlkZW50aXR5X2dyb3VwKSkKCiMgTW9kZWwgMTogTW9kZXJhdGlvbiBieSBCYXNlbGluZSBjb250cm9sbGluZyBmb3IgaWRlbnRpdHlfZ3JvdXAKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9ERVJTOF9TdW0iLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX0RFUlM4X1N1bSIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9wbWVycV9Gb2N1c19BdmciLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX3BtZXJxX0ZvY3VzX0F2ZyIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9wbWVycV9EaXN0cmFjdF9BdmciLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX3BtZXJxX0Rpc3RyYWN0X0F2ZyIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9wbWVycV9BRF9BdmciLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX3BtZXJxX0FEX0F2ZyIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKCgojIE1vZGVsIDI6IE1vZGVyYXRpb24gYnkgR2VuZGVyIElkZW50aXR5IGNvbnRyb2xsaW5nIGZvciBiYXNlbGluZQpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X0RFUlM4X1N1bSIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfREVSUzhfU3VtIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X3BtZXJxX0ZvY3VzX0F2ZyIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfcG1lcnFfRm9jdXNfQXZnIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X3BtZXJxX0Rpc3RyYWN0X0F2ZyIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfcG1lcnFfRGlzdHJhY3RfQXZnIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X3BtZXJxX0FEX0F2ZyIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfcG1lcnFfQURfQXZnIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCmBgYAoKYGBge3J9CmxpYnJhcnkocmVtcHN5YykKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGRwbHlyKQoKIyBDb252ZXJ0IGlkZW50aXR5X2dyb3VwIGZhY3RvciB0byBudW1lcmljIGNvZGVzClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoaWRlbnRpdHlfZ3JvdXBfbnVtID0gYXMubnVtZXJpYyhpZGVudGl0eV9ncm91cCkpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2RlbCBTZXQgMTogTW9kZXJhdGlvbiBieSBCYXNlbGluZQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgQW54aWV0eSBtb2RlbDogTW9kZXJhdGlvbiBieSBQcmVfR0FEN19TdW0sIGNvbnRyb2xsaW5nIGZvciBpZGVudGl0eV9ncm91cF9udW0gYW5kIGFnZQpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X0dBRDdfU3VtIiwKICBwcmVkaWN0b3IgPSAiY29uZGl0aW9uX251bSIsCiAgbW9kZXJhdG9yID0gIlByZV9HQUQ3X1N1bSIsCiAgY292YXJpYXRlcyA9IGMoImlkZW50aXR5X2dyb3VwX251bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKIyBEZXByZXNzaW9uIG1vZGVsOiBNb2RlcmF0aW9uIGJ5IFByZV9QSFE5X1N1bSwgY29udHJvbGxpbmcgZm9yIGlkZW50aXR5X2dyb3VwX251bSBhbmQgYWdlCm5pY2VfbW9kKAogIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLAogIHJlc3BvbnNlID0gIlBvc3RfUEhROV9TdW0iLAogIHByZWRpY3RvciA9ICJjb25kaXRpb25fbnVtIiwKICBtb2RlcmF0b3IgPSAiUHJlX1BIUTlfU3VtIiwKICBjb3ZhcmlhdGVzID0gYygiaWRlbnRpdHlfZ3JvdXBfbnVtIiwgImFnZSIpCikgfD4KICBuaWNlX3RhYmxlKGhpZ2hsaWdodCA9IFRSVUUpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2RlbCBTZXQgMjogTW9kZXJhdGlvbiBieSBHZW5kZXIgSWRlbnRpdHkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIEFueGlldHkgbW9kZWw6IE1vZGVyYXRpb24gYnkgaWRlbnRpdHlfZ3JvdXBfbnVtLCBjb250cm9sbGluZyBmb3IgUHJlX0dBRDdfU3VtIGFuZCBhZ2UKbmljZV9tb2QoCiAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsCiAgcmVzcG9uc2UgPSAiUG9zdF9HQUQ3X1N1bSIsCiAgcHJlZGljdG9yID0gImNvbmRpdGlvbl9udW0iLAogIG1vZGVyYXRvciA9ICJpZGVudGl0eV9ncm91cF9udW0iLAogIGNvdmFyaWF0ZXMgPSBjKCJQcmVfR0FEN19TdW0iLCAiYWdlIikKKSB8PgogIG5pY2VfdGFibGUoaGlnaGxpZ2h0ID0gVFJVRSkKCiMgRGVwcmVzc2lvbiBtb2RlbDogTW9kZXJhdGlvbiBieSBpZGVudGl0eV9ncm91cF9udW0sIGNvbnRyb2xsaW5nIGZvciBQcmVfUEhROV9TdW0gYW5kIGFnZQpuaWNlX21vZCgKICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwKICByZXNwb25zZSA9ICJQb3N0X1BIUTlfU3VtIiwKICBwcmVkaWN0b3IgPSAiY29uZGl0aW9uX251bSIsCiAgbW9kZXJhdG9yID0gImlkZW50aXR5X2dyb3VwX251bSIsCiAgY292YXJpYXRlcyA9IGMoIlByZV9QSFE5X1N1bSIsICJhZ2UiKQopIHw+CiAgbmljZV90YWJsZShoaWdobGlnaHQgPSBUUlVFKQoKYGBgCgojIyMgRm9sbG93IHVwOiBERVJTIDggClNpbmNlIHRoZSBpbnRlcmFjdGlvbiBvZiBjb25kaXRpb24gYnkgaWRlbnRpdHkgZ3JvdXAgd2FzIHNpZ25pZmlhY250LCBJIGhhdmUgdG8gcHJvYmUgaXQgdXNpbmcgc2ltcGxlIHNsb3Blcy4gCgojIyMjIFJlc3VsdDogCgpGb3IgY2lzZ2VuZGVyIHBhcnRpY2lwYW50cywgY29udHJvbGxpbmcgZm9yIHByZeKAkXRlc3QgZW1vdGlvbiByZWd1bGF0aW9uLCBjb25kaXRpb24gc2lnbmlmaWNhbnRseSBwcmVkaWN0ZWQgcG9zdOKAkXRlc3Qgc2NvcmVzLCB3aXRoIHRoZSBpbnRlcnZlbnRpb24geWllbGRpbmcgbG93ZXIgKGkuZS4sIGJldHRlcikgc2NvcmVzIChiID0g4oCTNC45MCwgU0UgPSAxLjQxLCB0KDY3KSA9IOKAkzMuNDcsIHAgPSAuMDAxLCBhZGp1c3RlZCBSwrIgPSAuNDcpLiBJbiBjb250cmFzdCwgZm9yIHRyYW5zZ2VuZGVyL2dlbmRlciBkaXZlcnNlIHBhcnRpY2lwYW50cywgY29uZGl0aW9uIHdhcyBub3QgYSBzaWduaWZpY2FudCBwcmVkaWN0b3Igb2YgcG9zdOKAkXRlc3QgZW1vdGlvbiByZWd1bGF0aW9uIChiID0g4oCTMS4wNywgU0UgPSAxLjIzLCB0KDY3KSA9IOKAkzAuODcsIHAgPSAuMzksIGFkanVzdGVkIFLCsiA9IC4zNykuCnNhZC4KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCgojIEVuc3VyZSB0aGF0IGlkZW50aXR5X2dyb3VwIGlzIGEgZmFjdG9yICh3aXRoIGxldmVscyAiMCIgZm9yIENpc2dlbmRlciBhbmQgIjEiIGZvciBUR0QpClB1cnJibGVfTWFzdGVyX1dpZGUgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICBtdXRhdGUoaWRlbnRpdHlfZ3JvdXAgPSBhcy5mYWN0b3IoaWRlbnRpdHlfZ3JvdXApKQoKIyBSdW4gc2VwYXJhdGUgcmVncmVzc2lvbnMgZm9yIGVhY2ggbGV2ZWwgb2YgaWRlbnRpdHlfZ3JvdXA6CiMgTW9kZWw6IFBvc3RfREVSUzhfU3VtIH4gY29uZGl0aW9uX251bSArIFByZV9ERVJTOF9TdW0KCiMgRm9yIENpc2dlbmRlciAoaWRlbnRpdHlfZ3JvdXAgPT0gMCkKbW9kZWxfY2lzIDwtIGxtKFBvc3RfREVSUzhfU3VtIH4gY29uZGl0aW9uX251bSArIFByZV9ERVJTOF9TdW0sCiAgICAgICAgICAgICAgICBkYXRhID0gZmlsdGVyKFB1cnJibGVfTWFzdGVyX1dpZGUsIGlkZW50aXR5X2dyb3VwID09ICIwIikpCiMgUHJpbnQgc3VtbWFyeSBmb3IgQ2lzZ2VuZGVyIG1vZGVsCnN1bW1hcnkobW9kZWxfY2lzKQoKIyBGb3IgVEdEIChpZGVudGl0eV9ncm91cCA9PSAxKQptb2RlbF90Z2QgPC0gbG0oUG9zdF9ERVJTOF9TdW0gfiBjb25kaXRpb25fbnVtICsgUHJlX0RFUlM4X1N1bSwKICAgICAgICAgICAgICAgIGRhdGEgPSBmaWx0ZXIoUHVycmJsZV9NYXN0ZXJfV2lkZSwgaWRlbnRpdHlfZ3JvdXAgPT0gIjEiKSkKIyBQcmludCBzdW1tYXJ5IGZvciBUR0QgbW9kZWwKc3VtbWFyeShtb2RlbF90Z2QpCgpgYGAKCgojIyMgRm9sbG93IHVwOiBHQUQgNwpTaW5jZSB0aGUgaW50ZXJhY3Rpb24gb2YgY29uZGl0aW9uIGJ5IGlkZW50aXR5IGdyb3VwIHdhcyBzaWduaWZpYWNudCwgSSBoYXZlIHRvIHByb2JlIGl0IHVzaW5nIHNpbXBsZSBzbG9wZXMuCjA9IENpc2dlbmRlciAgcGFydGljaXBhbnRzIGhhdmUgc2lnbmlmaWNhbnQgY29uZGl0aW9uIGVmZmVjdAoxPVRyYW5zZ2VuZGVyIHBhcnRpY2lwYW50cyBoYXZlIG5vIHNpZ25pZmljYW50IGNvbmRpdGlvbiBlZmZlY3QKCmBgYHtyfQoKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQoKIyBFbnN1cmUgdGhhdCBpZGVudGl0eV9ncm91cCBpcyBhIGZhY3RvciAod2l0aCBsZXZlbHMgIjAiIGZvciBDaXNnZW5kZXIgYW5kICIxIiBmb3IgVEdEKQpQdXJyYmxlX01hc3Rlcl9XaWRlIDwtIFB1cnJibGVfTWFzdGVyX1dpZGUgJT4lCiAgbXV0YXRlKGlkZW50aXR5X2dyb3VwID0gYXMuZmFjdG9yKGlkZW50aXR5X2dyb3VwKSkKCiMgUnVuIHNlcGFyYXRlIHJlZ3Jlc3Npb25zIGZvciBlYWNoIGxldmVsIG9mIGlkZW50aXR5X2dyb3VwOgoKIyBGb3IgQ2lzZ2VuZGVyIChpZGVudGl0eV9ncm91cCA9PSAwKQptb2RlbF9jaXMgPC0gbG0oUG9zdF9HQUQ3X1N1bSB+IGNvbmRpdGlvbl9udW0gKyBQcmVfR0FEN19TdW0sCiAgICAgICAgICAgICAgICBkYXRhID0gZmlsdGVyKFB1cnJibGVfTWFzdGVyX1dpZGUsIGlkZW50aXR5X2dyb3VwID09ICIwIikpCiMgUHJpbnQgc3VtbWFyeSBmb3IgQ2lzZ2VuZGVyIG1vZGVsCnN1bW1hcnkobW9kZWxfY2lzKQoKIyBGb3IgVEdEIChpZGVudGl0eV9ncm91cCA9PSAxKQptb2RlbF90Z2QgPC0gbG0oUG9zdF9HQUQ3X1N1bSB+IGNvbmRpdGlvbl9udW0gKyBQcmVfR0FEN19TdW0sCiAgICAgICAgICAgICAgICBkYXRhID0gZmlsdGVyKFB1cnJibGVfTWFzdGVyX1dpZGUsIGlkZW50aXR5X2dyb3VwID09ICIxIikpCiMgUHJpbnQgc3VtbWFyeSBmb3IgVEdEIG1vZGVsCnN1bW1hcnkobW9kZWxfdGdkKQoKYGBgCgojIFNlbGYtSGFybSBBbmFseXNlcwojIyBGcmVxdWVuY2llcyBieSBDb25kaXRpb24gYW5kIFJlc3BvbnNlIG92ZXIgVGltZQpCZWxvdywgd2UgZGlzcGxheSBhIHRhYmxlIGFuZCBncmFwaCBvZiB0aGUgZnJlcXVlbmN5IG9mIHJlc3BvbnNlcyBmb3IgYWxsIHNlbGYtaGFybSBxdWVzdGlvbnMsIHRoZSBmcmVxdWVuY3kgb2YgZmxhZ2dlZCByZXNwb25zZXMgdG8gZWFjaCBzZWxmLWhhcm0gcXVlc3Rpb24gb3ZlciB0aW1lLCBhbmQgdGhlIGZyZXF1ZW5jeSBvZiBmbGFnZ2VkIHJlc3BvbnNlcyB0byBlYWNoIHNlbGYtaGFybSBxdWVzdGlvbiBvdmVyIHRpbWUsIHNlcGFyYXRlZCBieSBjb25kaXRpb24uCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3QpCgpzaHFfc3VtbWFyeSA8LSBOb0R1cF9QdXJyYmxlQW5vbiAlPiUKICBncm91cF9ieShXZWVrKSAlPiUKICBzdW1tYXJpc2UoCiAgICBOX1NIUTEgPSBzdW0oIWlzLm5hKFNIUTEpKSwKICAgIE5fU0hRMiA9IHN1bSghaXMubmEoU0hRMikpLAogICAgTl9TSFEzID0gc3VtKCFpcy5uYShTSFEzKSkKICApICU+JQogIHVuZ3JvdXAoKQoKIyBSZW1vdmUgd2VlayAwIGFuZCBOQSB2YWx1ZXMKc2hxX3N1bW1hcnlfY2xlYW4gPC0gc2hxX3N1bW1hcnkgJT4lCiAgZmlsdGVyKCFpcy5uYShXZWVrKSAmIFdlZWsgIT0gMCkKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUGxvdDogTGluZSBHcmFwaCBmb3IgUmVzcG9uc2UgUmF0ZSBPdmVyIFRpbWUKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZ2dwbG90KHNocV9zdW1tYXJ5X2NsZWFuLCBhZXMoeCA9IFdlZWspKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gTl9TSFExLCBjb2xvciA9ICJTSFExIiksIHNpemUgPSAxKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gTl9TSFEyLCBjb2xvciA9ICJTSFEyIiksIHNpemUgPSAxKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gTl9TSFEzLCBjb2xvciA9ICJTSFEzIiksIHNpemUgPSAxKSArCiAgbGFicygKICAgIHRpdGxlID0gIlJlc3BvbnNlIFJhdGUgT3ZlciBUaW1lIGZvciBTSFEgVmFyaWFibGVzIiwKICAgIHggPSAiV2VlayIsCiAgICB5ID0gIk51bWJlciBvZiBOb24tTWlzc2luZyBSZXNwb25zZXMiLAogICAgY29sb3IgPSAiU0hRIFZhcmlhYmxlIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHVuaXF1ZShzaHFfc3VtbWFyeV9jbGVhbiRXZWVrKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJTSFExIiA9ICJibHVlIiwgIlNIUTIiID0gInJlZCIsICJTSFEzIiA9ICJncmVlbiIpKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBEaXNwbGF5IFRhYmxlOiBSZXNwb25zZSBDb3VudHMgT3ZlciBUaW1lCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNocV9zdW1tYXJ5X2NsZWFuICU+JQogIGd0KCkgJT4lCiAgZ3Q6OnRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJOdW1iZXIgb2YgUmVzcG9uc2VzIGZvciBTZWxmLUhhcm0gUXVlc3Rpb25zIE92ZXIgVGltZSIKICApCgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ3QpCgojIFJlc2hhcGUgaW50byBsb25nIGZvcm1hdApzaHFfbG9uZyA8LSBOb0R1cF9QdXJyYmxlQW5vbiAlPiUKICBzZWxlY3QoV2VlaywgU0hRMSwgU0hRMiwgU0hRMykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiU0hRIiksIG5hbWVzX3RvID0gIlNIUV9WYXIiLCB2YWx1ZXNfdG8gPSAiUmVzcG9uc2UiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFdlZWspICYgV2VlayAhPSAwKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFJlc3BvbnNlKSkgJT4lCiAgbXV0YXRlKFJlc3BvbnNlID0gZmFjdG9yKFJlc3BvbnNlLCBsZXZlbHMgPSBjKDEsIDApLCBsYWJlbHMgPSBjKCIxIiwgIjAiKSkpCgojIENvdW50IGhvdyBtYW55IHNlbGVjdGVkIGVhY2ggY2F0ZWdvcnkgKDAgb3IgMSkgcGVyIFNIUSB2YXJpYWJsZSBwZXIgd2VlawpzaHFfY291bnRzIDwtIHNocV9sb25nICU+JQogIGdyb3VwX2J5KFdlZWssIFNIUV9WYXIsIFJlc3BvbnNlKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSwgLmdyb3VwcyA9ICJkcm9wIikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUGxvdDogTGluZSBHcmFwaCBvZiAxIChmbGFnZ2VkKSByZXNwb25zZSBvdmVyIHRpbWUKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZ2dwbG90KAogIHNocV9jb3VudHMgJT4lIGZpbHRlcihSZXNwb25zZSA9PSAiMSIpLCAKICBhZXMoeCA9IFdlZWssIHkgPSBuLCBjb2xvciA9IFNIUV9WYXIpCikgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJOdW1iZXIgb2YgRmxhZ2dlZCBTSFEgUmVzcG9uc2VzIE92ZXIgVGltZSAoUmVzcG9uc2UgPSAxKSIsCiAgICB4ID0gIldlZWsiLAogICAgeSA9ICJDb3VudCBvZiBSZXNwb25zZSA9IDEiLAogICAgY29sb3IgPSAiU0hRIFZhcmlhYmxlIgogICkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHVuaXF1ZShzaHFfY291bnRzJFdlZWspKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUYWJsZTogQ291bnQgb2YgMCBhbmQgMSBSZXNwb25zZXMgcGVyIFdlZWsgcGVyIFNIUQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzaHFfY291bnRzICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBSZXNwb25zZSwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHJlbmFtZShgUmVzcG9uc2UgPSAxYCA9IGAxYCwgYFJlc3BvbnNlID0gMGAgPSBgMGApICU+JQogIGd0KCkgJT4lCiAgdGFiX2hlYWRlcih0aXRsZSA9ICJDb3VudHMgb2YgU0hRIFJlc3BvbnNlcyAoMCB2cy4gMSkgYnkgV2VlayBhbmQgVmFyaWFibGUiKQoKIyBSZXNoYXBlIGludG8gbG9uZyBmb3JtYXQgYW5kIGluY2x1ZGUgY29uZGl0aW9uCnNocV9sb25nX2dyb3VwZWQgPC0gTm9EdXBfUHVycmJsZUFub24gJT4lCiAgc2VsZWN0KHBzaWQsIFdlZWssIGNvbmRpdGlvbiwgU0hRMSwgU0hRMiwgU0hRMykgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgiU0hRIiksIG5hbWVzX3RvID0gIlNIUV9WYXIiLCB2YWx1ZXNfdG8gPSAiUmVzcG9uc2UiKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFdlZWspICYgV2VlayAhPSAwKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFJlc3BvbnNlKSkgJT4lCiAgbXV0YXRlKFJlc3BvbnNlID0gZmFjdG9yKFJlc3BvbnNlLCBsZXZlbHMgPSBjKDEsIDApLCBsYWJlbHMgPSBjKCIxIiwgIjAiKSksCiAgICAgICAgIGNvbmRpdGlvbiA9IGFzLmZhY3Rvcihjb25kaXRpb24pKQoKIyBDb3VudCBob3cgbWFueSBzZWxlY3RlZCBlYWNoIGNhdGVnb3J5ICgwIG9yIDEpIHBlciBTSFEgdmFyaWFibGUsIHBlciB3ZWVrLCBwZXIgZ3JvdXAKc2hxX2NvdW50c19ncm91cGVkIDwtIHNocV9sb25nX2dyb3VwZWQgJT4lCiAgZ3JvdXBfYnkoV2VlaywgY29uZGl0aW9uLCBTSFFfVmFyLCBSZXNwb25zZSkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCksIC5ncm91cHMgPSAiZHJvcCIpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIFBsb3Q6IExpbmUgR3JhcGggb2YgMSAoZmxhZ2dlZCkgcmVzcG9uc2Ugb3ZlciB0aW1lIGJ5IGdyb3VwCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmdncGxvdCgKICBzaHFfY291bnRzX2dyb3VwZWQgJT4lIGZpbHRlcihSZXNwb25zZSA9PSAiMSIpLCAKICBhZXMoeCA9IFdlZWssIHkgPSBuLCBjb2xvciA9IFNIUV9WYXIpCikgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGZhY2V0X3dyYXAofiBjb25kaXRpb24pICsKICBsYWJzKAogICAgdGl0bGUgPSAiTnVtYmVyIG9mIEZsYWdnZWQgU0hRIFJlc3BvbnNlcyBPdmVyIFRpbWUgKFJlc3BvbnNlID0gMSkiLAogICAgc3VidGl0bGUgPSAiRmFjZXRlZCBieSBDb25kaXRpb24iLAogICAgeCA9ICJXZWVrIiwKICAgIHkgPSAiQ291bnQgb2YgUmVzcG9uc2UgPSAxIiwKICAgIGNvbG9yID0gIlNIUSBWYXJpYWJsZSIKICApICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSB1bmlxdWUoc2hxX2NvdW50c19ncm91cGVkJFdlZWspKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBUYWJsZTogQ291bnQgb2YgMCBhbmQgMSBSZXNwb25zZXMgcGVyIFdlZWsgcGVyIFNIUSwgYnkgR3JvdXAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc2hxX2NvdW50c19ncm91cGVkICU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBSZXNwb25zZSwgdmFsdWVzX2Zyb20gPSBuLCB2YWx1ZXNfZmlsbCA9IDApICU+JQogIHJlbmFtZShgUmVzcG9uc2UgPSAxYCA9IGAxYCwgYFJlc3BvbnNlID0gMGAgPSBgMGApICU+JQogIGFycmFuZ2UoY29uZGl0aW9uLCBTSFFfVmFyLCBXZWVrKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGUgPSAiQ291bnRzIG9mIFNIUSBSZXNwb25zZXMgKDAgdnMuIDEpIGJ5IFdlZWssIFZhcmlhYmxlLCBhbmQgR3JvdXAiKQpgYGAKIyMgU2VsZi1IYXJtIExvZ2lzdGljIFJlZ3Jlc3Npb24KUG9zdC10ZXN0IExvZ2lzdGljIFJlZ3Jlc3Npb24gdG8gSW52ZXN0aWdhdGUgSW50ZXJ2ZW50aW9uIEVmZmVjdHMgb24gU2VsZi1IYXJtIE91dGNvbWVzCipSZXN1bHQ6KiBDb25kaXRpb24gd2FzIG5vdCBhIHNpZ25pZmljYW50IHByZWRpY3RvciBvZiBhbnkgc2VsZi1oYXJtIG91dGNvbWUgKGNvZGVkIGJpbmFyeSkuCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGd0c3VtbWFyeSkgICAKbGlicmFyeShicm9vbSkKbGlicmFyeShndHN1bW1hcnkpCgpOb0R1cF9QdXJyYmxlQW5vbiA8LSBOb0R1cF9QdXJyYmxlQW5vbiAlPiUKICBmaWx0ZXIocHNpZCAhPSAiQzcyIikgJT4lCiAgbXV0YXRlKAogICAgIyBJZiBtaXNzaW5nLCB0aGVuIE5BLiBJZiA8PSAxIHRoZW4gMCwgZWxzZSAxCiAgICBTSFExID0gaWZlbHNlKGlzLm5hKHNocXNjcmVlbmVyMSksIE5BLCBpZmVsc2Uoc2hxc2NyZWVuZXIxIDw9IDEsIDAsIDEpKSwKICAgIFNIUTIgPSBpZmVsc2UoaXMubmEoc2hxc2NyZWVuZXIyKSwgTkEsIGlmZWxzZShzaHFzY3JlZW5lcjIgPD0gMSwgMCwgMSkpLAogICAgU0hRMyA9IGlmZWxzZShpcy5uYShzaHFzY3JlZW5lcjMpLCBOQSwgaWZlbHNlKHNocXNjcmVlbmVyMyA8PSAxLCAwLCAxKSkKICApICU+JQogIG11dGF0ZSgKICAgICMgSWYgYW55IG9mIFNIUTEsIFNIUTIsIG9yIFNIUTMgaXMgbWlzc2luZywgU0hRX0FueSBpcyBtaXNzaW5nLgogICAgIyBJZiBhbGwgdGhyZWUgYXJlIDAsIFNIUV9BbnkgaXMgMCwgZWxzZSAxLgogICAgU0hRX0FueSA9IGNhc2Vfd2hlbigKICAgICAgaXMubmEoU0hRMSkgfCBpcy5uYShTSFEyKSB8IGlzLm5hKFNIUTMpIH4gTkFfcmVhbF8sCiAgICAgIFNIUTEgPT0gMCAmIFNIUTIgPT0gMCAmIFNIUTMgPT0gMCB+IDAsCiAgICAgIFRSVUUgfiAxCiAgICApCiAgKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAxKSBMb2dpc3RpYyByZWdyZXNzaW9uIGZvciBTSFExIGF0IFdlZWsgMTIKIyAgICBjb250cm9sbGluZyBmb3IgV2VlayAyIFNIUTEgYW5kIENvbmRpdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptb2RlbF9zaHExIDwtIGdsbSgKICBTSFExXzEyIH4gY29uZGl0aW9uICsgU0hRMV8yLCAKICBkYXRhID0gcHVycmJsZV93aWRlLCAKICBmYW1pbHkgPSBiaW5vbWlhbAopCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIDIpIExvZ2lzdGljIHJlZ3Jlc3Npb24gZm9yIFNIUTIgYXQgV2VlayAxMgojICAgIGNvbnRyb2xsaW5nIGZvciBXZWVrIDIgU0hRMiBhbmQgQ29uZGl0aW9uCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm1vZGVsX3NocTIgPC0gZ2xtKAogIFNIUTJfMTIgfiBjb25kaXRpb24gKyBTSFEyXzIsIAogIGRhdGEgPSBwdXJyYmxlX3dpZGUsIAogIGZhbWlseSA9IGJpbm9taWFsCikKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgMykgTG9naXN0aWMgcmVncmVzc2lvbiBmb3IgU0hRMyBhdCBXZWVrIDEyCiMgICAgY29udHJvbGxpbmcgZm9yIFdlZWsgMiBTSFEzIGFuZCBDb25kaXRpb24KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KbW9kZWxfc2hxMyA8LSBnbG0oCiAgU0hRM18xMiB+IGNvbmRpdGlvbiArIFNIUTNfMiwgCiAgZGF0YSA9IHB1cnJibGVfd2lkZSwgCiAgZmFtaWx5ID0gYmlub21pYWwKKQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyA0KSBMb2dpc3RpYyByZWdyZXNzaW9uIGZvciBTSFFfQW55IGF0IFdlZWsgMTIKIyAgICBjb250cm9sbGluZyBmb3IgV2VlayAyIFNIUV9BbnkgYW5kIENvbmRpdGlvbgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQptb2RlbF9zaHFBbnkgPC0gZ2xtKAogIFNIUV9BbnlfMTIgfiBjb25kaXRpb24gKyBTSFFfQW55XzIsIAogIGRhdGEgPSBwdXJyYmxlX3dpZGUsIAogIGZhbWlseSA9IGJpbm9taWFsCikKCiMgQ3JlYXRlIGd0c3VtbWFyeSB0YWJsZXMgZm9yIGVhY2ggbW9kZWwsIGV4cG9uZW50aWF0aW5nIGZvciBPUgp0Ymxfc2hxMSAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTEsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxMiAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTIsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxMyAgIDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocTMsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JQogIGJvbGRfbGFiZWxzKCkgJT4lCiAgYWRkX3NpZ25pZmljYW5jZV9zdGFycygpCgp0Ymxfc2hxQW55IDwtIHRibF9yZWdyZXNzaW9uKG1vZGVsX3NocUFueSwgZXhwb25lbnRpYXRlID0gVFJVRSkgJT4lCiAgYm9sZF9sYWJlbHMoKSAlPiUKICBhZGRfc2lnbmlmaWNhbmNlX3N0YXJzKCkKCm1lcmdlZF90YmwgPC0gdGJsX21lcmdlKAogICB0YmxzID0gbGlzdCh0Ymxfc2hxMSwgdGJsX3NocTIsIHRibF9zaHEzLCB0Ymxfc2hxQW55KSwKICAgdGFiX3NwYW5uZXIgPSBjKCJTSFExIE1vZGVsIiwgIlNIUTIgTW9kZWwiLCAiU0hRMyBNb2RlbCIsICJTSFFfQW55IE1vZGVsIikKICkKIG1lcmdlZF90YmwKYGBgCiMjIFNlbGYtSGFybSBQcm9wb3J0aW9uYWwgT2RkcyBSZWdyZXNzaW9uCkZyZXF1ZW5jaWVzIFRhYmxlcwpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKCiMgRGVmaW5lIHRoZSBzaXggb3JkZXJlZOKAkGZhY3RvciB2YXJpYWJsZXMgKHdlZWtzIDEgYW5kIDEyIGZvciBzY3JlZW5lcnMgMeKAkzMpCnNjcmVlbmVyX3ZhcnMgPC0gYygKICAic2hxc2NyZWVuZXIxX3cxIiwgICJzaHFzY3JlZW5lcjFfdzEyIiwKICAic2hxc2NyZWVuZXIyX3cxIiwgICJzaHFzY3JlZW5lcjJfdzEyIiwKICAic2hxc2NyZWVuZXIzX3cxIiwgICJzaHFzY3JlZW5lcjNfdzEyIgopCgojIExvb3Agb3ZlciBlYWNoIHZhcmlhYmxlIGFuZCBwcmludCBhIGZyZXF1ZW5jeSB0YWJsZSAoY291bnQgKyBwZXJjZW50KQpmb3IgKHZhciBpbiBzY3JlZW5lcl92YXJzKSB7CiAgZnJlcV90YmwgPC0gUHVycmJsZV9NYXN0ZXJfV2lkZSAlPiUKICAgIGZpbHRlcighaXMubmEoLmRhdGFbW3Zhcl1dKSkgJT4lIAogICAgY291bnQocmVzcG9uc2UgPSAuZGF0YVtbdmFyXV0pICU+JQogICAgbXV0YXRlKHBlcmNlbnQgPSByb3VuZChuIC8gc3VtKG4pICogMTAwLCAxKSkKICAKICBjYXQoIlxuXG4qKkZyZXF1ZW5jaWVzIGZvciIsIHZhciwgIioqXG4iKQogIHByaW50KGthYmxlKGZyZXFfdGJsLCBjb2wubmFtZXMgPSBjKCJSZXNwb25zZSIsICJDb3VudCIsICJQZXJjZW50IiksIGRpZ2l0cyA9IDEpKQp9CmBgYAojIyMgUHJvcG9ydGlvbmFsIE9kZHMgTW9kZWxzOiBCcmFudCBUZXN0cwpBbGwgc2l4IEJyYW50IHRlc3RzIChvbmUgZm9yIGVhY2ggc2NyZWVuZXIgYXQgV2VlayAxIGFuZCBXZWVrIDEyKSBwcm9kdWNlZCBub27igJBzaWduaWZpY2FudCBw4oCQdmFsdWVzLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHByb3BvcnRpb25hbOKAkG9kZHMgKHBhcmFsbGVsIHJlZ3Jlc3Npb24pIGFzc3VtcHRpb24gaG9sZHMgaW4gZXZlcnkgY2FzZS4KYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoTUFTUykKbGlicmFyeShicmFudCkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgUHJvcG9ydGlvbmFsIE9kZHMgTW9kZWxzICYgQnJhbnQgVGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgU2NyZWVuZXIgMTogV2VlayAxCm1vZGVsX3MxX3cxIDwtIHBvbHIoc2hxc2NyZWVuZXIxX3cxIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MxX3cxIDwtIGJyYW50KG1vZGVsX3MxX3cxKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMSBhdCBXZWVrIDE6IikKcHJpbnQoYnJhbnRfczFfdzEpCgojIFNjcmVlbmVyIDE6IFdlZWsgMTIKbW9kZWxfczFfdzEyIDwtIHBvbHIoc2hxc2NyZWVuZXIxX3cxMiB+IGNvbmRpdGlvbiwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQpicmFudF9zMV93MTIgPC0gYnJhbnQobW9kZWxfczFfdzEyKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMSBhdCBXZWVrIDEyOiIpCnByaW50KGJyYW50X3MxX3cxMikKCiMgU2NyZWVuZXIgMjogV2VlayAxCm1vZGVsX3MyX3cxIDwtIHBvbHIoc2hxc2NyZWVuZXIyX3cxIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MyX3cxIDwtIGJyYW50KG1vZGVsX3MyX3cxKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMiBhdCBXZWVrIDE6IikKcHJpbnQoYnJhbnRfczJfdzEpCgojIFNjcmVlbmVyIDI6IFdlZWsgMTIKbW9kZWxfczJfdzEyIDwtIHBvbHIoc2hxc2NyZWVuZXIyX3cxMiB+IGNvbmRpdGlvbiwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQpicmFudF9zMl93MTIgPC0gYnJhbnQobW9kZWxfczJfdzEyKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMiBhdCBXZWVrIDEyOiIpCnByaW50KGJyYW50X3MyX3cxMikKCiMgU2NyZWVuZXIgMzogV2VlayAxCm1vZGVsX3MzX3cxIDwtIHBvbHIoc2hxc2NyZWVuZXIzX3cxIH4gY29uZGl0aW9uLCBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCmJyYW50X3MzX3cxIDwtIGJyYW50KG1vZGVsX3MzX3cxKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMyBhdCBXZWVrIDE6IikKcHJpbnQoYnJhbnRfczNfdzEpCgojIFNjcmVlbmVyIDM6IFdlZWsgMTIKbW9kZWxfczNfdzEyIDwtIHBvbHIoc2hxc2NyZWVuZXIzX3cxMiB+IGNvbmRpdGlvbiwgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQpicmFudF9zM193MTIgPC0gYnJhbnQobW9kZWxfczNfdzEyKQpwcmludCgiQnJhbnQgVGVzdCBmb3IgU2NyZWVuZXIgMyBhdCBXZWVrIDEyOiIpCnByaW50KGJyYW50X3MzX3cxMikKYGBgCk5vIHNpZ25pZmljYW50IHJlc3VsdHMgb2YgUHVycmJsZSBvbiBzZWxmLWhhcm0gdXNpbmcgcHJvcHJ0aW9uYWwgb2RkcyAob3JkaW5hbCBkYXRhIHRoYXQgbWFpbnRhaW5zIGZyZXF1ZW5jeSkKYGBge3J9CmxpYnJhcnkoTUFTUykKbGlicmFyeShicm9vbSkKbGlicmFyeShrbml0cikKCiMgQ29udmVydCBvdXRjb21lcyB0byBvcmRlcmVkIGZhY3RvcnMgKGFkanVzdCB0aGUgbGV2ZWxzIGlmIG5lZWRlZCkKUHVycmJsZV9NYXN0ZXJfV2lkZSA8LSBQdXJyYmxlX01hc3Rlcl9XaWRlICU+JQogIG11dGF0ZSgKICAgIHNocXNjcmVlbmVyMV93MSAgPSBmYWN0b3Ioc2hxc2NyZWVuZXIxX3cxLCBvcmRlcmVkID0gVFJVRSksCiAgICBzaHFzY3JlZW5lcjJfdzEgID0gZmFjdG9yKHNocXNjcmVlbmVyMl93MSwgb3JkZXJlZCA9IFRSVUUpLAogICAgc2hxc2NyZWVuZXIzX3cxICA9IGZhY3RvcihzaHFzY3JlZW5lcjNfdzEsIG9yZGVyZWQgPSBUUlVFKSwKICAgIHNocXNjcmVlbmVyMV93MTIgPSBmYWN0b3Ioc2hxc2NyZWVuZXIxX3cxMiwgb3JkZXJlZCA9IFRSVUUpLAogICAgc2hxc2NyZWVuZXIyX3cxMiA9IGZhY3RvcihzaHFzY3JlZW5lcjJfdzEyLCBvcmRlcmVkID0gVFJVRSksCiAgICBzaHFzY3JlZW5lcjNfdzEyID0gZmFjdG9yKHNocXNjcmVlbmVyM193MTIsIG9yZGVyZWQgPSBUUlVFKQogICkKCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgRml0IFByb3BvcnRpb25hbCBPZGRzIE1vZGVscyBmb3IgV2VlayAxMiBvdXRjb21lcwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIE1vZGVsIGZvciBTY3JlZW5lciAxIGNvbnRyb2xsaW5nIGZvciBjb25kaXRpb24sIGFnZSwgYW5kIGJhc2VsaW5lICh3MSkKbW9kZWxfczEgPC0gcG9scihzaHFzY3JlZW5lcjFfdzEyIH4gY29uZGl0aW9uICsgYWdlICsgaWRlbnRpdHlfZ3JvdXBfbnVtICsgc2hxc2NyZWVuZXIxX3cxLCAKICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCgojIE1vZGVsIGZvciBTY3JlZW5lciAyCm1vZGVsX3MyIDwtIHBvbHIoc2hxc2NyZWVuZXIyX3cxMiB+IGNvbmRpdGlvbiArIGFnZSArIGlkZW50aXR5X2dyb3VwX251bSArICBzaHFzY3JlZW5lcjJfdzEsIAogICAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLCBIZXNzID0gVFJVRSkKCiMgTW9kZWwgZm9yIFNjcmVlbmVyIDMKbW9kZWxfczMgPC0gcG9scihzaHFzY3JlZW5lcjNfdzEyIH4gY29uZGl0aW9uICsgYWdlICsgaWRlbnRpdHlfZ3JvdXBfbnVtICsgc2hxc2NyZWVuZXIzX3cxLCAKICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENyZWF0ZSBhIENvbWJpbmVkIFRhYmxlIG9mIFJlc3VsdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KdGlkeV9zMSA8LSB0aWR5KG1vZGVsX3MxKSAlPiUgbXV0YXRlKE1vZGVsID0gIlNjcmVlbmVyIDEiKQp0aWR5X3MyIDwtIHRpZHkobW9kZWxfczIpICU+JSBtdXRhdGUoTW9kZWwgPSAiU2NyZWVuZXIgMiIpCnRpZHlfczMgPC0gdGlkeShtb2RlbF9zMykgJT4lIG11dGF0ZShNb2RlbCA9ICJTY3JlZW5lciAzIikKCiMgQ29tYmluZSB0aGUgcmVzdWx0cwpyZXN1bHRzIDwtIGJpbmRfcm93cyh0aWR5X3MxLCB0aWR5X3MyLCB0aWR5X3MzKQoKbGlicmFyeShkcGx5cikKcmVzdWx0cyA8LSByZXN1bHRzICU+JQogIG11dGF0ZSgKICAgIG9kZHNfcmF0aW8gPSBleHAoZXN0aW1hdGUpLAogICAgcC52YWx1ZSA9IDIgKiBwbm9ybSgtYWJzKHN0YXRpc3RpYykpCiAgKSAlPiUKICBkcGx5cjo6c2VsZWN0KE1vZGVsLCB0ZXJtLCBlc3RpbWF0ZSwgc3RkLmVycm9yLCBvZGRzX3JhdGlvLCBzdGF0aXN0aWMsIHAudmFsdWUpCgojIFByaW50IHRoZSB0YWJsZQprYWJsZShyZXN1bHRzLCBkaWdpdHMgPSAzLCBjYXB0aW9uID0gIlByb3BvcnRpb25hbCBPZGRzIFJlZ3Jlc3Npb24gUmVzdWx0cyBDb250cm9sbGluZyBmb3IgQWdlIGFuZCBCYXNlbGluZSBSZXNwb25zZSAoV2VlayAxKSIpCgpgYGAKIyMjIFNlbGYtSGFybSBNb2RlcmF0aW9uIE1vZGVsczogR2VuZGVyIElkZW50aXR5Ck5vIG1vZGVyYXRpb24gZWZmZWN0IG9mIGdlbmRlciBpZGVudGl0eSBpbiBwcm9wcnRpb25hbCBvZGRzIG1vZGVscy4KYGBge3J9CgojIE1vZGVyYXRpb24gQW5hbHlzaXMgZm9yIEFsbCBUaHJlZSBTY3JlZW5lciBNb2RlbHMgKFdlZWsgMTIpCgojIFNjcmVlbmVyIDEgbW9kZXJhdGlvbiBtb2RlbAptb2RlbF9zMV9tb2QgPC0gcG9scihzaHFzY3JlZW5lcjFfdzEyIH4gY29uZGl0aW9uICogaWRlbnRpdHlfZ3JvdXBfbnVtICsgYWdlICsgc2hxc2NyZWVuZXIxX3cxLCAKICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFB1cnJibGVfTWFzdGVyX1dpZGUsIEhlc3MgPSBUUlVFKQoKIyBTY3JlZW5lciAyIG1vZGVyYXRpb24gbW9kZWwKbW9kZWxfczJfbW9kIDwtIHBvbHIoc2hxc2NyZWVuZXIyX3cxMiB+IGNvbmRpdGlvbiAqIGlkZW50aXR5X2dyb3VwX251bSArIGFnZSArIHNocXNjcmVlbmVyMl93MSwgCiAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX01hc3Rlcl9XaWRlLCBIZXNzID0gVFJVRSkKCiMgU2NyZWVuZXIgMyBtb2RlcmF0aW9uIG1vZGVsCm1vZGVsX3MzX21vZCA8LSBwb2xyKHNocXNjcmVlbmVyM193MTIgfiBjb25kaXRpb24gKiBpZGVudGl0eV9ncm91cF9udW0gKyBhZ2UgKyBzaHFzY3JlZW5lcjNfdzEsIAogICAgICAgICAgICAgICAgICAgICBkYXRhID0gUHVycmJsZV9NYXN0ZXJfV2lkZSwgSGVzcyA9IFRSVUUpCgojIFRpZHkgYW5kIGxhYmVsIGVhY2ggbW9kZWwncyBvdXRwdXQKdGlkeV9zMV9tb2QgPC0gdGlkeShtb2RlbF9zMV9tb2QpICU+JSBtdXRhdGUoTW9kZWwgPSAiU2NyZWVuZXIgMSIpCnRpZHlfczJfbW9kIDwtIHRpZHkobW9kZWxfczJfbW9kKSAlPiUgbXV0YXRlKE1vZGVsID0gIlNjcmVlbmVyIDIiKQp0aWR5X3MzX21vZCA8LSB0aWR5KG1vZGVsX3MzX21vZCkgJT4lIG11dGF0ZShNb2RlbCA9ICJTY3JlZW5lciAzIikKCiMgQ29tYmluZSB0aGUgcmVzdWx0cyBmcm9tIGFsbCB0aHJlZSBtb2RlbHMKbW9kX3Jlc3VsdHMgPC0gYmluZF9yb3dzKHRpZHlfczFfbW9kLCB0aWR5X3MyX21vZCwgdGlkeV9zM19tb2QpICU+JQogIG11dGF0ZSgKICAgIG9kZHNfcmF0aW8gPSBleHAoZXN0aW1hdGUpLAogICAgcC52YWx1ZSA9IDIgKiBwbm9ybSgtYWJzKHN0YXRpc3RpYykpCiAgKSAlPiUKICBkcGx5cjo6c2VsZWN0KE1vZGVsLCB0ZXJtLCBlc3RpbWF0ZSwgc3RkLmVycm9yLCBvZGRzX3JhdGlvLCBzdGF0aXN0aWMsIHAudmFsdWUpCgojIFByaW50IHRoZSBjb21iaW5lZCB0YWJsZQprYWJsZShtb2RfcmVzdWx0cywgZGlnaXRzID0gMywgCiAgICAgIGNhcHRpb24gPSAiUHJvcG9ydGlvbmFsIE9kZHMgUmVncmVzc2lvbiBNb2RlcmF0aW9uIFJlc3VsdHMgKENvbmRpdGlvbiAqIElkZW50aXR5X0dyb3VwX051bSBJbnRlcmFjdGlvbikiKQoKCmBgYAojIFN1cHBsZW1lbnRhcnkgTWF0ZXJpYWxzOiBNaXhlZCBFZmZlY3RzIE1vZGVscwpUbyBldmFsdWF0ZSBob3cgb3V0Y29tZXMgY2hhbmdlZCBvdmVyIHRpbWUgYW5kIHdoZXRoZXIgdGhlc2UgY2hhbmdlcyBkaWZmZXJlZCBieSBjb25kaXRpb24sIHdlIGZpdCBtaXhlZC1lZmZlY3RzIG1vZGVscyBmb3IgZWFjaCBvZiBvdXIgcHJpbWFyeSBvdXRjb21lIHZhcmlhYmxlcy4gVGhlc2UgbW9kZWxzIGFjY291bnQgZm9yIGJvdGggd2l0aGluLXBlcnNvbiBjaGFuZ2UgYW5kIGJldHdlZW4tcGVyc29uIGRpZmZlcmVuY2VzLgoKRm9yIGVhY2ggb3V0Y29tZW0gd2UgcmFuIGEgbGluZWFyIG1peGVkLWVmZmVjdHMgbW9kZWwgdXNpbmcgdGhlIGxtZXIoKSBmdW5jdGlvbi4KClRoZSBtb2RlbHMgdGVzdGVkOgogIE1haW4gZWZmZWN0cyBvZiBXZWVrICh0aW1lKSwgY29uZGl0aW9uLCBhbmQgdGhlaXIgaW50ZXJhY3Rpb24KICBDb3ZhcmlhdGVzOiBpZGVudGl0eSBncm91cCBhbmQgYWdlCiAgQSByYW5kb20gaW50ZXJjZXB0IGFuZCBzbG9wZSBmb3IgZWFjaCBwYXJ0aWNpcGFudCAoKFdlZWsgJiBwc2lkKSksIGFsbG93aW5nIGVhY2ggcGVyc29uIHRvIGhhdmUgdGhlaXIgb3duIGJhc2VsaW5lIGFuZCByYXRlIG9mIGNoYW5nZSBvdmVyIHRpbWUKICAKICBFbW90aW9uIFJlZyB3YXMgc2lnbmlmaWNhbnQKICBEZXByZXNzaW9uIHNpZ25pZmljYW50CiAgQW54aWV0eSBub3Qgc2lnbmlmaWNhbnQgKGNsb3NlIHRvIG1hcmdpbmFsIHA9LjExLSBtb3JlIGV2aWRlbmNlIG9mIHVuc3RhYmxlIGVmZmVjdCkKYGBge3J9CmxpYnJhcnkobG1lNCkKbGlicmFyeShicm9vbS5taXhlZCkKbGlicmFyeShkcGx5cikKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KHBlcmZvcm1hbmNlKSAgIyBGb3IgcjIoKQoKIyBEZWZpbmUgdGhlIHZlY3RvciBvZiBvdXRjb21lcyAoYXMgdGhleSBhcHBlYXIgaW4gdGhlIGxvbmcgZGF0YXNldCkKb3V0Y29tZXMgPC0gYygiREVSUzhfU3VtIiwgInBtZXJxX0ZvY3VzX0F2ZyIsICJwbWVycV9EaXN0cmFjdF9BdmciLCAicG1lcnFfQURfQXZnIiwgCiAgICAgICAgICAgICAgIkdBRDdfU3VtIiwgIlBIUTlfU3VtIiwgIlNIU19QYXRod2F5cyIsICJTSFNfQWdlbmN5IiwgIlNIU19Ub3RhbEhvcGUiLCAidWNsYV9TdW0iKQoKIyBJbml0aWFsaXplIGEgbGlzdCB0byBzdG9yZSBtb2RlbCBzdW1tYXJpZXMgd2l0aCBjb25maWRlbmNlIGludGVydmFscyBhbmQgZWZmZWN0IHNpemVzCnJlc3VsdHNfbGlzdCA8LSBsaXN0KCkKCiMgTG9vcCBvdmVyIGVhY2ggb3V0Y29tZSBhbmQgZml0IHRoZSBtaXhlZC1lZmZlY3RzIG1vZGVsIGNvbnRyb2xsaW5nIGZvciBpZGVudGl0eV9ncm91cF9udW0gYW5kIGFnZQpmb3IgKG91dGNvbWUgaW4gb3V0Y29tZXMpIHsKICBtb2RlbCA8LSBsbWVyKGFzLmZvcm11bGEocGFzdGUob3V0Y29tZSwgIn4gV2VlayAqIGNvbmRpdGlvbiArIGlkZW50aXR5X2dyb3VwICsgYWdlICsgKFdlZWsgfCBwc2lkKSIpKSwKICAgICAgICAgICAgICAgIGRhdGEgPSBQdXJyYmxlX0xvbmdfTWFzdGVyKQogIAogICMgVGlkeSB0aGUgZml4ZWQgZWZmZWN0cyBlc3RpbWF0ZXMKICB0aWR5X21vZGVsIDwtIHRpZHkobW9kZWwpCiAgCiAgIyBPYnRhaW4gOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciBmaXhlZCBlZmZlY3RzIHVzaW5nIHRoZSBXYWxkIG1ldGhvZAogIGNpX21vZGVsIDwtIGNvbmZpbnQobW9kZWwsIG1ldGhvZCA9ICJXYWxkIiwgbGV2ZWwgPSAwLjk1KQogIGNpX2RmIDwtIGFzLmRhdGEuZnJhbWUoY2lfbW9kZWwpCiAgY2lfZGYkdGVybSA8LSByb3duYW1lcyhjaV9kZikKICAKICAjIE1lcmdlIHRoZSB0aWR5IG91dHB1dCB3aXRoIGNvbmZpZGVuY2UgaW50ZXJ2YWxzCiAgdGlkeV9tb2RlbCA8LSBsZWZ0X2pvaW4odGlkeV9tb2RlbCwgY2lfZGYsIGJ5ID0gInRlcm0iKQogIAogICMgQ2FsY3VsYXRlIG1hcmdpbmFsIGFuZCBjb25kaXRpb25hbCBSwrIgYXMgZWZmZWN0IHNpemVzCiAgcjJfdmFscyA8LSByMihtb2RlbCkKICAKICAjIFN0b3JlIHRoZSByZXN1bHRzIGluIHRoZSBsaXN0CiAgcmVzdWx0c19saXN0W1tvdXRjb21lXV0gPC0gbGlzdCgKICAgIG1vZGVsX3N1bW1hcnkgPSB0aWR5X21vZGVsLAogICAgcjIgPSByMl92YWxzCiAgKQp9CgojIE5vdywgZm9yIGRlbW9uc3RyYXRpb24sIGxldCdzIHByaW50IHRoZSBzdW1tYXJ5IGZvciBvbmUgb3V0Y29tZSAoZS5nLiwgREVSUzhfU3VtKQpwcmludChrYWJsZShyZXN1bHRzX2xpc3RbWyJERVJTOF9TdW0iXV1bWyJtb2RlbF9zdW1tYXJ5Il1dLCAKICAgICAgICAgICAgY2FwdGlvbiA9ICJNaXhlZC1FZmZlY3RzIE1vZGVsIGZvciBERVJTOF9TdW0gd2l0aCA5NSUgQ0kiLCAKICAgICAgICAgICAgZGlnaXRzID0gMykgJT4lIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKSkKY2F0KCJcbiIpCnByaW50KHJlc3VsdHNfbGlzdFtbIkRFUlM4X1N1bSJdXVtbInIyIl1dKQoKZm9yIChvdXRjb21lIGluIG5hbWVzKHJlc3VsdHNfbGlzdCkpIHsKICAjIENyZWF0ZSBhIGNhcHRpb24gdGhhdCBpbmNsdWRlcyB0aGUgb3V0Y29tZSBuYW1lCiAgY2FwdGlvbl90ZXh0IDwtIHBhc3RlKCJNaXhlZC1FZmZlY3RzIE1vZGVsIGZvciIsIG91dGNvbWUsICJ3aXRoIDk1JSBDSSIpCiAgCiAgIyBQcmludCB0aGUgbW9kZWwgc3VtbWFyeSB3aXRoIGEgY2FwdGlvbiBhbmQgZm9ybWF0dGVkIHRhYmxlCiAgcHJpbnQoa2FibGUocmVzdWx0c19saXN0W1tvdXRjb21lXV1bWyJtb2RlbF9zdW1tYXJ5Il1dLCAKICAgICAgICAgICAgICBjYXB0aW9uID0gY2FwdGlvbl90ZXh0LCAKICAgICAgICAgICAgICBkaWdpdHMgPSAzKSAlPiUga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpKQogIGNhdCgiXG4iKQogIAogICMgUHJpbnQgdGhlIGNvcnJlc3BvbmRpbmcgUsKyIHZhbHVlKHMpCiAgcHJpbnQocmVzdWx0c19saXN0W1tvdXRjb21lXV1bWyJyMiJdXSkKICBjYXQoIlxuXG4iKSAgIyBleHRyYSBzcGFjaW5nIGJldHdlZW4gb3V0Y29tZXMKfQoKYGBgCgoKCgo=