library(dplyr)
library(plyr)

Extract Student Math Class data

file.name = "/Users/Audiorunner13/CUNY MSDS Course Work/R Programming Bridge/Data/student_mat.csv"
student_math <- read.csv(file=file.name, header = TRUE, sep = ",")
head(student_math, 10)

Run Summary on the Students’ Math file

summary(student_math)
    student         school              sex                 age         address            famsize         
 Min.   :  1.0   Length:395         Length:395         Min.   :15.0   Length:395         Length:395        
 1st Qu.: 99.5   Class :character   Class :character   1st Qu.:16.0   Class :character   Class :character  
 Median :198.0   Mode  :character   Mode  :character   Median :17.0   Mode  :character   Mode  :character  
 Mean   :198.0                                         Mean   :16.7                                        
 3rd Qu.:296.5                                         3rd Qu.:18.0                                        
 Max.   :395.0                                         Max.   :22.0                                        
   Pstatus               Medu            Fedu           Mjob               Fjob              reason         
 Length:395         Min.   :0.000   Min.   :0.000   Length:395         Length:395         Length:395        
 Class :character   1st Qu.:2.000   1st Qu.:2.000   Class :character   Class :character   Class :character  
 Mode  :character   Median :3.000   Median :2.000   Mode  :character   Mode  :character   Mode  :character  
                    Mean   :2.749   Mean   :2.522                                                           
                    3rd Qu.:4.000   3rd Qu.:3.000                                                           
                    Max.   :4.000   Max.   :4.000                                                           
   guardian           traveltime      studytime        failures       schoolsup            famsup         
 Length:395         Min.   :1.000   Min.   :1.000   Min.   :0.0000   Length:395         Length:395        
 Class :character   1st Qu.:1.000   1st Qu.:1.000   1st Qu.:0.0000   Class :character   Class :character  
 Mode  :character   Median :1.000   Median :2.000   Median :0.0000   Mode  :character   Mode  :character  
                    Mean   :1.448   Mean   :2.035   Mean   :0.3342                                        
                    3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.:0.0000                                        
                    Max.   :4.000   Max.   :4.000   Max.   :3.0000                                        
     paid            activities          nursery             higher            internet        
 Length:395         Length:395         Length:395         Length:395         Length:395        
 Class :character   Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                                               
                                                                                               
                                                                                               
   romantic             famrel         freetime         goout            Dalc            Walc      
 Length:395         Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000   Min.   :1.000  
 Class :character   1st Qu.:4.000   1st Qu.:3.000   1st Qu.:2.000   1st Qu.:1.000   1st Qu.:1.000  
 Mode  :character   Median :4.000   Median :3.000   Median :3.000   Median :1.000   Median :2.000  
                    Mean   :3.944   Mean   :3.235   Mean   :3.109   Mean   :1.481   Mean   :2.291  
                    3rd Qu.:5.000   3rd Qu.:4.000   3rd Qu.:4.000   3rd Qu.:2.000   3rd Qu.:3.000  
                    Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000   Max.   :5.000  
     health         absences            G1              G2              G3       
 Min.   :1.000   Min.   : 0.000   Min.   : 3.00   Min.   : 0.00   Min.   : 0.00  
 1st Qu.:3.000   1st Qu.: 0.000   1st Qu.: 8.00   1st Qu.: 9.00   1st Qu.: 8.00  
 Median :4.000   Median : 4.000   Median :11.00   Median :11.00   Median :11.00  
 Mean   :3.554   Mean   : 5.709   Mean   :10.91   Mean   :10.71   Mean   :10.42  
 3rd Qu.:5.000   3rd Qu.: 8.000   3rd Qu.:13.00   3rd Qu.:13.00   3rd Qu.:14.00  
 Max.   :5.000   Max.   :75.000   Max.   :19.00   Max.   :19.00   Max.   :20.00  

The mean and median for age, study time, and Final Grade for Math students at both Gabriel Pereira (GP and Mousino da Silveira (MS) schools

sprintf("The mean age of math students in the dataset: %s", mean(student_math$age))
[1] "The mean age of math students in the dataset: 16.6962025316456"
sprintf("The median age of math students in the dataset: %s", median(student_math$age))
[1] "The median age of math students in the dataset: 17"
sprintf("The mean study time of math students in the dataset: %s", mean(student_math$studytime))
[1] "The mean study time of math students in the dataset: 2.03544303797468"
sprintf("The median study time of math students in the dataset: %s", median(student_math$studytime))
[1] "The median study time of math students in the dataset: 2"
sprintf("The mean final grade of math students in the dataset: %s", mean(student_math$G3))
[1] "The mean final grade of math students in the dataset: 10.4151898734177"
sprintf("The median final grade of math students in the dataset: %s", median(student_math$G3))
[1] "The median final grade of math students in the dataset: 11"

Subset the data extracting only male students from the Gabriel Pereira (GP) School and fewer fields. Record count is lower at 166 Male and 183 Female.

# subset data.frame, reduce the number of fields
student_math.GP_M <- student_math %>% filter(sex == 'M') %>% filter(school == 'GP')
student_math.GP_M <- student_math.GP_M[c("student","school","sex","age","Pstatus","Medu","Fedu","Mjob","Fjob","studytime","internet","G3")]

student_math.GP_F <- student_math %>% filter(sex == 'F') %>% filter(school == 'GP')
student_math.GP_F <- student_math.GP_F[c("student","school","sex","age","Pstatus","Medu","Fedu","Mjob","Fjob","studytime","internet","G3")]

student_math.GP_M <- rename(student_math.GP_M,"Student"="student","School"="school","Gender"="sex","Age"="age","ParentLivingStatus"="Pstatus","MotherEducation"="Medu","FatherEducation"="Fedu","MotherJob"="Mjob","FatherJob"="Fjob","StudyTime"="studytime","Internet"="internet","FinalGrade"="G3")

student_math.GP_F <- rename(student_math.GP_F,"Student"="student","School"="school","Gender"="sex","Age"="age","ParentLivingStatus"="Pstatus","MotherEducation"="Medu","FatherEducation"="Fedu","MotherJob"="Mjob","FatherJob"="Fjob","StudyTime"="studytime","Internet"="internet","FinalGrade"="G3")

Replace the values for fields Gender, ParentLivingStatus, MotherEducation, FatherEducation with Apart for value A and Together for value T and verifty all data wrangling.

student_math.GP_M$Gender[student_math.GP_M$Gender == "F"] <- "Female"
student_math.GP_M$Gender[student_math.GP_M$Gender == "M"] <- "Male"
student_math.GP_M$ParentLivingStatus[student_math.GP_M$ParentLivingStatus == "A"] <- "Apart"
student_math.GP_M$ParentLivingStatus[student_math.GP_M$ParentLivingStatus == "T"] <- "Together"
student_math.GP_M$MotherEducation[student_math.GP_M$MotherEducation == "0"] <- "None"
student_math.GP_M$MotherEducation[student_math.GP_M$MotherEducation == "1"] <- "Primary"
student_math.GP_M$MotherEducation[student_math.GP_M$MotherEducation == "2"] <- "Grades 5 - 9"
student_math.GP_M$MotherEducation[student_math.GP_M$MotherEducation == "3"] <- "Secondary"
student_math.GP_M$MotherEducation[student_math.GP_M$MotherEducation == "4"] <- "College"
student_math.GP_M$FatherEducation[student_math.GP_M$FatherEducation == "0"] <- "None"
student_math.GP_M$FatherEducation[student_math.GP_M$FatherEducation == "1"] <- "Primary"
student_math.GP_M$FatherEducation[student_math.GP_M$FatherEducation == "2"] <- "Grades 5 - 9"
student_math.GP_M$FatherEducation[student_math.GP_M$FatherEducation == "3"] <- "Secondary"
student_math.GP_M$FatherEducation[student_math.GP_M$FatherEducation == "4"] <- "College"
head(student_math.GP_M,10)
student_math.GP_F$Gender[student_math.GP_F$Gender == "F"] <- "Female"
student_math.GP_F$Gender[student_math.GP_F$Gender == "M"] <- "Male"
student_math.GP_F$ParentLivingStatus[student_math.GP_F$ParentLivingStatus == "A"] <- "Apart"
student_math.GP_F$ParentLivingStatus[student_math.GP_F$ParentLivingStatus == "T"] <- "Together"
student_math.GP_F$MotherEducation[student_math.GP_F$MotherEducation == "0"] <- "None"
student_math.GP_F$MotherEducation[student_math.GP_F$MotherEducation == "1"] <- "Primary"
student_math.GP_F$MotherEducation[student_math.GP_F$MotherEducation == "2"] <- "Grades 5 - 9"
student_math.GP_F$MotherEducation[student_math.GP_F$MotherEducation == "3"] <- "Secondary"
student_math.GP_F$MotherEducation[student_math.GP_F$MotherEducation == "4"] <- "College"
student_math.GP_F$FatherEducation[student_math.GP_F$FatherEducation == "0"] <- "None"
student_math.GP_F$FatherEducation[student_math.GP_F$FatherEducation == "1"] <- "Primary"
student_math.GP_F$FatherEducation[student_math.GP_F$FatherEducation == "2"] <- "Grades 5 - 9"
student_math.GP_F$FatherEducation[student_math.GP_F$FatherEducation == "3"] <- "Secondary"
student_math.GP_F$FatherEducation[student_math.GP_F$FatherEducation == "4"] <- "College"
head(student_math.GP_F,10)

Summarize the male and female math data subsets

summary(student_math.GP_M)
    Student          School             Gender               Age        ParentLivingStatus MotherEducation   
 Min.   :  6.00   Length:166         Length:166         Min.   :15.00   Length:166         Length:166        
 1st Qu.: 85.25   Class :character   Class :character   1st Qu.:15.00   Class :character   Class :character  
 Median :163.50   Mode  :character   Mode  :character   Median :16.00   Mode  :character   Mode  :character  
 Mean   :165.64                                         Mean   :16.46                                        
 3rd Qu.:247.75                                         3rd Qu.:17.00                                        
 Max.   :348.00                                         Max.   :22.00                                        
 FatherEducation     MotherJob          FatherJob           StudyTime       Internet           FinalGrade   
 Length:166         Length:166         Length:166         Min.   :1.000   Length:166         Min.   : 0.00  
 Class :character   Class :character   Class :character   1st Qu.:1.000   Class :character   1st Qu.: 9.00  
 Mode  :character   Mode  :character   Mode  :character   Median :2.000   Mode  :character   Median :11.00  
                                                          Mean   :1.801                      Mean   :11.06  
                                                          3rd Qu.:2.000                      3rd Qu.:14.00  
                                                          Max.   :4.000                      Max.   :20.00  
summary(student_math.GP_F)
    Student         School             Gender               Age        ParentLivingStatus MotherEducation   
 Min.   :  1.0   Length:183         Length:183         Min.   :15.00   Length:183         Length:183        
 1st Qu.: 89.5   Class :character   Class :character   1st Qu.:16.00   Class :character   Class :character  
 Median :192.0   Mode  :character   Mode  :character   Median :16.00   Mode  :character   Mode  :character  
 Mean   :183.5                                         Mean   :16.58                                        
 3rd Qu.:281.0                                         3rd Qu.:17.00                                        
 Max.   :349.0                                         Max.   :19.00                                        
 FatherEducation     MotherJob          FatherJob           StudyTime       Internet           FinalGrade    
 Length:183         Length:183         Length:183         Min.   :1.000   Length:183         Min.   : 0.000  
 Class :character   Class :character   Class :character   1st Qu.:2.000   Class :character   1st Qu.: 8.000  
 Mode  :character   Mode  :character   Mode  :character   Median :2.000   Mode  :character   Median :11.000  
                                                          Mean   :2.301                      Mean   : 9.973  
                                                          3rd Qu.:3.000                      3rd Qu.:13.000  
                                                          Max.   :4.000                      Max.   :19.000  
sprintf("The mean and median for age, study time, and Final Grade for Math students at both Gabriel Pereira (GP)")
[1] "The mean and median for age, study time, and Final Grade for Math students at both Gabriel Pereira (GP)"
sprintf("The mean age of GP male math students: %s,", mean(student_math.GP_M$Age))
[1] "The mean age of GP male math students: 16.4578313253012,"
sprintf("The mean age of GP female math students: %s", mean(student_math.GP_F$Age))
[1] "The mean age of GP female math students: 16.5792349726776"
sprintf("The median age of GP male math students: %s", median(student_math.GP_M$Age))
[1] "The median age of GP male math students: 16"
sprintf("The median age of GP female math students: %s", median(student_math.GP_F$Age))
[1] "The median age of GP female math students: 16"

It is not surprising that the mean and median age for the male and female students is the same since they are attending a school with students there own age.

sprintf("The mean study time of GP male math students: %s", mean(student_math.GP_M$StudyTime))
[1] "The mean study time of GP male math students: 1.80120481927711"
sprintf("The mean study time of GP female math students: %s", mean(student_math.GP_F$StudyTime))
[1] "The mean study time of GP female math students: 2.30054644808743"
sprintf("The median study time of GP male math students: %s", median(student_math.GP_M$StudyTime))
[1] "The median study time of GP male math students: 2"
sprintf("The median study time of GP female math students: %s", median(student_math.GP_F$StudyTime))
[1] "The median study time of GP female math students: 2"

While the median study time for both male and female students is equal at 2 hours of study time, looking at the mean studytime between male and female, females tend to study 30 minutes more on average.


sprintf("The mean final grade of GP male math students: %s", mean(student_math.GP_M$FinalGrade))
[1] "The mean final grade of GP male math students: 11.0602409638554"
sprintf("The mean final grade of GP female math students: %s", mean(student_math.GP_F$FinalGrade))
[1] "The mean final grade of GP female math students: 9.97267759562842"
sprintf("The median final grade of GP male math students: %s", median(student_math.GP_M$FinalGrade))
[1] "The median final grade of GP male math students: 11"
sprintf("The median final grade of GP female math students: %s", median(student_math.GP_F$FinalGrade))
[1] "The median final grade of GP female math students: 11"

Here again, the median final grade for male and female students is equal at 11. However, the mean (average) final grade for males is 1.09 points higher than that of females even though it appears that females study a little more.

Scatterplots for the male and female math datasets

# Final Math Grade at Gabriel Pereira school Scatterplot
ggplot(student_math.GP_M, aes(x = Student, y = FinalGrade)) + 
  geom_point(color = "#0099f9") + labs(x = "Male Math Students", y = "Final Grade")

At first glance it appears that both scatterplots show almost identical results. However, if you look closely you will notice that in the female scatterplot below that more grades fall between the 5 and 10 lines than the males and also more females have more points on the zero line. This will certainly explain why the female mean final grade is lower than the male mean final grade.

# Final Math Grade at Gabriel Pereira school Scatterplot
ggplot(student_math.GP_F, aes(x = Student, y = FinalGrade)) + 
  geom_point(color = "#0099f9") + labs(x = "Female Math Students", y = "Final Grade")

Boxplots for the male and female math datasets

boxplot(FinalGrade ~ StudyTime, data = student_math.GP_M, xlab = "Study Time (in hours)",
        ylab = "Final Grade", main = "Male Student Math Grade Data", 
        notch = FALSE, varwidth = TRUE, col = c("blue","green","yellow","purple"))

The boxplots can show a more clearly the median, mean and any outliers in the female and male final grade data broken down by the amount of study time for each by getting a little into the weeds. In the first boxplot where studytime is one hour here are some points. 1. Median for both is 11. 2. More males scored with one hour of study time than females. 3. The lowest score of 0 for males and 6 for females. In study time hour you see 1. an outlier at 0. 2. Median of 11. 3. For those that spent 2 hours studying more females than males final grades are represented by the box.

boxplot(FinalGrade ~ StudyTime, data = student_math.GP_F, xlab = "Study Time (in hours)",
        ylab = "Final Grade", main = "Female Student Math Grade Data", 
        notch = FALSE, varwidth = TRUE, col = c("blue","green","yellow","purple"))

Histograms for the male and female math datasets

hist(student_math.GP_M$FinalGrade, xlab = "Math Final Grade 0 to 20 - Male", main = "Male Final Grade", prob = TRUE)
lines(df, lwd=1, col = "blue")

In these histograms with density curves, one can see that more females scored between 0 and 1 for a final grade than males did. However, it appears that the total percentage of females and males final grade score that lay between 7 and 16 is just about equal. You can see this in the two scatterplots above as well. The density curve supports this as well with the most density being at Final Grade 11 which is equal to the median for both datasets.

hist(student_math.GP_F$FinalGrade, xlab = "Math Final Grade 0 to 20 - Female", main = "Female Final Grade", prob = TRUE)
df <- density(student_math.GP_F$FinalGrade)
lines(df, lwd=1, col = "red")

Density plots for the male and female math datasets

densityplot( ~ student_math.GP_M$FinalGrade, data = student_math, xlab = "Math Final Grade - Male")

The density plot is my favorite because it immediately shows just how close to identical is the performance of male and females students in this math class. If it were not for the labels one could not tell which is the female graph and which is the male. These density plots show exactly what is explained in the historgram with density curve above.

densityplot( ~ student_math.GP_F$FinalGrade, data = student_math, xlab = "Math Final Grade - Female")

BONUS - place the original .csv in a github file and have R read from the link. This will be a very useful skill as you progress in your data science education and career.

library(RCurl)
filename <- getURL("https://raw.githubusercontent.com/audiorunner13/Masters-Coursework/main/student_mat.csv")
student_mat_bonus <- read.csv(text = filename)
head(student_mat_bonus, 10)
LS0tCnRpdGxlOiAiUiBCcmlkZ2UgV2VlayAzIEFzc2lnbm1lbnQiCmF1dGhvcjogJ0F1dGhvcjogUGV0ZXIgR2F0aWNhJwpkYXRlOiAnRGF0ZTogMDEvMTUvMjAyMScKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeShwbHlyKQpgYGAKIyBFeHRyYWN0IFN0dWRlbnQgTWF0aCBDbGFzcyBkYXRhCmBgYHtyfQpmaWxlLm5hbWUgPSAiL1VzZXJzL0F1ZGlvcnVubmVyMTMvQ1VOWSBNU0RTIENvdXJzZSBXb3JrL1IgUHJvZ3JhbW1pbmcgQnJpZGdlL0RhdGEvc3R1ZGVudF9tYXQuY3N2IgpzdHVkZW50X21hdGggPC0gcmVhZC5jc3YoZmlsZT1maWxlLm5hbWUsIGhlYWRlciA9IFRSVUUsIHNlcCA9ICIsIikKaGVhZChzdHVkZW50X21hdGgsIDEwKQpgYGAKIyBSdW4gU3VtbWFyeSBvbiB0aGUgU3R1ZGVudHMnIE1hdGggZmlsZQpgYGB7cn0Kc3VtbWFyeShzdHVkZW50X21hdGgpCmBgYAojIFRoZSBtZWFuIGFuZCBtZWRpYW4gZm9yIGFnZSwgc3R1ZHkgdGltZSwgYW5kIEZpbmFsIEdyYWRlIGZvciBNYXRoIHN0dWRlbnRzIGF0IGJvdGggR2FicmllbCBQZXJlaXJhIChHUCBhbmQgTW91c2lubyBkYSBTaWx2ZWlyYSAoTVMpIHNjaG9vbHMKYGBge3J9CnNwcmludGYoIlRoZSBtZWFuIGFnZSBvZiBtYXRoIHN0dWRlbnRzIGluIHRoZSBkYXRhc2V0OiAlcyIsIG1lYW4oc3R1ZGVudF9tYXRoJGFnZSkpCnNwcmludGYoIlRoZSBtZWRpYW4gYWdlIG9mIG1hdGggc3R1ZGVudHMgaW4gdGhlIGRhdGFzZXQ6ICVzIiwgbWVkaWFuKHN0dWRlbnRfbWF0aCRhZ2UpKQoKc3ByaW50ZigiVGhlIG1lYW4gc3R1ZHkgdGltZSBvZiBtYXRoIHN0dWRlbnRzIGluIHRoZSBkYXRhc2V0OiAlcyIsIG1lYW4oc3R1ZGVudF9tYXRoJHN0dWR5dGltZSkpCnNwcmludGYoIlRoZSBtZWRpYW4gc3R1ZHkgdGltZSBvZiBtYXRoIHN0dWRlbnRzIGluIHRoZSBkYXRhc2V0OiAlcyIsIG1lZGlhbihzdHVkZW50X21hdGgkc3R1ZHl0aW1lKSkKCnNwcmludGYoIlRoZSBtZWFuIGZpbmFsIGdyYWRlIG9mIG1hdGggc3R1ZGVudHMgaW4gdGhlIGRhdGFzZXQ6ICVzIiwgbWVhbihzdHVkZW50X21hdGgkRzMpKQpzcHJpbnRmKCJUaGUgbWVkaWFuIGZpbmFsIGdyYWRlIG9mIG1hdGggc3R1ZGVudHMgaW4gdGhlIGRhdGFzZXQ6ICVzIiwgbWVkaWFuKHN0dWRlbnRfbWF0aCRHMykpCmBgYAojIFN1YnNldCB0aGUgZGF0YSBleHRyYWN0aW5nIG9ubHkgbWFsZSBzdHVkZW50cyBmcm9tIHRoZSBHYWJyaWVsIFBlcmVpcmEgKEdQKSBTY2hvb2wgYW5kIGZld2VyIGZpZWxkcy4gUmVjb3JkIGNvdW50IGlzIGxvd2VyIGF0IDE2NiBNYWxlIGFuZCAxODMgRmVtYWxlLgpgYGB7cn0KIyBzdWJzZXQgZGF0YS5mcmFtZSwgcmVkdWNlIHRoZSBudW1iZXIgb2YgZmllbGRzCnN0dWRlbnRfbWF0aC5HUF9NIDwtIHN0dWRlbnRfbWF0aCAlPiUgZmlsdGVyKHNleCA9PSAnTScpICU+JSBmaWx0ZXIoc2Nob29sID09ICdHUCcpCnN0dWRlbnRfbWF0aC5HUF9NIDwtIHN0dWRlbnRfbWF0aC5HUF9NW2MoInN0dWRlbnQiLCJzY2hvb2wiLCJzZXgiLCJhZ2UiLCJQc3RhdHVzIiwiTWVkdSIsIkZlZHUiLCJNam9iIiwiRmpvYiIsInN0dWR5dGltZSIsImludGVybmV0IiwiRzMiKV0KCnN0dWRlbnRfbWF0aC5HUF9GIDwtIHN0dWRlbnRfbWF0aCAlPiUgZmlsdGVyKHNleCA9PSAnRicpICU+JSBmaWx0ZXIoc2Nob29sID09ICdHUCcpCnN0dWRlbnRfbWF0aC5HUF9GIDwtIHN0dWRlbnRfbWF0aC5HUF9GW2MoInN0dWRlbnQiLCJzY2hvb2wiLCJzZXgiLCJhZ2UiLCJQc3RhdHVzIiwiTWVkdSIsIkZlZHUiLCJNam9iIiwiRmpvYiIsInN0dWR5dGltZSIsImludGVybmV0IiwiRzMiKV0KCnN0dWRlbnRfbWF0aC5HUF9NIDwtIHJlbmFtZShzdHVkZW50X21hdGguR1BfTSwiU3R1ZGVudCI9InN0dWRlbnQiLCJTY2hvb2wiPSJzY2hvb2wiLCJHZW5kZXIiPSJzZXgiLCJBZ2UiPSJhZ2UiLCJQYXJlbnRMaXZpbmdTdGF0dXMiPSJQc3RhdHVzIiwiTW90aGVyRWR1Y2F0aW9uIj0iTWVkdSIsIkZhdGhlckVkdWNhdGlvbiI9IkZlZHUiLCJNb3RoZXJKb2IiPSJNam9iIiwiRmF0aGVySm9iIj0iRmpvYiIsIlN0dWR5VGltZSI9InN0dWR5dGltZSIsIkludGVybmV0Ij0iaW50ZXJuZXQiLCJGaW5hbEdyYWRlIj0iRzMiKQoKc3R1ZGVudF9tYXRoLkdQX0YgPC0gcmVuYW1lKHN0dWRlbnRfbWF0aC5HUF9GLCJTdHVkZW50Ij0ic3R1ZGVudCIsIlNjaG9vbCI9InNjaG9vbCIsIkdlbmRlciI9InNleCIsIkFnZSI9ImFnZSIsIlBhcmVudExpdmluZ1N0YXR1cyI9IlBzdGF0dXMiLCJNb3RoZXJFZHVjYXRpb24iPSJNZWR1IiwiRmF0aGVyRWR1Y2F0aW9uIj0iRmVkdSIsIk1vdGhlckpvYiI9Ik1qb2IiLCJGYXRoZXJKb2IiPSJGam9iIiwiU3R1ZHlUaW1lIj0ic3R1ZHl0aW1lIiwiSW50ZXJuZXQiPSJpbnRlcm5ldCIsIkZpbmFsR3JhZGUiPSJHMyIpCmBgYAoKIyBSZXBsYWNlIHRoZSB2YWx1ZXMgZm9yIGZpZWxkcyBHZW5kZXIsIFBhcmVudExpdmluZ1N0YXR1cywgTW90aGVyRWR1Y2F0aW9uLCBGYXRoZXJFZHVjYXRpb24gd2l0aCBBcGFydCBmb3IgdmFsdWUgQSBhbmQgVG9nZXRoZXIgZm9yIHZhbHVlIFQgYW5kIHZlcmlmdHkgYWxsIGRhdGEgd3JhbmdsaW5nLgpgYGB7cn0Kc3R1ZGVudF9tYXRoLkdQX00kR2VuZGVyW3N0dWRlbnRfbWF0aC5HUF9NJEdlbmRlciA9PSAiRiJdIDwtICJGZW1hbGUiCnN0dWRlbnRfbWF0aC5HUF9NJEdlbmRlcltzdHVkZW50X21hdGguR1BfTSRHZW5kZXIgPT0gIk0iXSA8LSAiTWFsZSIKc3R1ZGVudF9tYXRoLkdQX00kUGFyZW50TGl2aW5nU3RhdHVzW3N0dWRlbnRfbWF0aC5HUF9NJFBhcmVudExpdmluZ1N0YXR1cyA9PSAiQSJdIDwtICJBcGFydCIKc3R1ZGVudF9tYXRoLkdQX00kUGFyZW50TGl2aW5nU3RhdHVzW3N0dWRlbnRfbWF0aC5HUF9NJFBhcmVudExpdmluZ1N0YXR1cyA9PSAiVCJdIDwtICJUb2dldGhlciIKc3R1ZGVudF9tYXRoLkdQX00kTW90aGVyRWR1Y2F0aW9uW3N0dWRlbnRfbWF0aC5HUF9NJE1vdGhlckVkdWNhdGlvbiA9PSAiMCJdIDwtICJOb25lIgpzdHVkZW50X21hdGguR1BfTSRNb3RoZXJFZHVjYXRpb25bc3R1ZGVudF9tYXRoLkdQX00kTW90aGVyRWR1Y2F0aW9uID09ICIxIl0gPC0gIlByaW1hcnkiCnN0dWRlbnRfbWF0aC5HUF9NJE1vdGhlckVkdWNhdGlvbltzdHVkZW50X21hdGguR1BfTSRNb3RoZXJFZHVjYXRpb24gPT0gIjIiXSA8LSAiR3JhZGVzIDUgLSA5IgpzdHVkZW50X21hdGguR1BfTSRNb3RoZXJFZHVjYXRpb25bc3R1ZGVudF9tYXRoLkdQX00kTW90aGVyRWR1Y2F0aW9uID09ICIzIl0gPC0gIlNlY29uZGFyeSIKc3R1ZGVudF9tYXRoLkdQX00kTW90aGVyRWR1Y2F0aW9uW3N0dWRlbnRfbWF0aC5HUF9NJE1vdGhlckVkdWNhdGlvbiA9PSAiNCJdIDwtICJDb2xsZWdlIgpzdHVkZW50X21hdGguR1BfTSRGYXRoZXJFZHVjYXRpb25bc3R1ZGVudF9tYXRoLkdQX00kRmF0aGVyRWR1Y2F0aW9uID09ICIwIl0gPC0gIk5vbmUiCnN0dWRlbnRfbWF0aC5HUF9NJEZhdGhlckVkdWNhdGlvbltzdHVkZW50X21hdGguR1BfTSRGYXRoZXJFZHVjYXRpb24gPT0gIjEiXSA8LSAiUHJpbWFyeSIKc3R1ZGVudF9tYXRoLkdQX00kRmF0aGVyRWR1Y2F0aW9uW3N0dWRlbnRfbWF0aC5HUF9NJEZhdGhlckVkdWNhdGlvbiA9PSAiMiJdIDwtICJHcmFkZXMgNSAtIDkiCnN0dWRlbnRfbWF0aC5HUF9NJEZhdGhlckVkdWNhdGlvbltzdHVkZW50X21hdGguR1BfTSRGYXRoZXJFZHVjYXRpb24gPT0gIjMiXSA8LSAiU2Vjb25kYXJ5IgpzdHVkZW50X21hdGguR1BfTSRGYXRoZXJFZHVjYXRpb25bc3R1ZGVudF9tYXRoLkdQX00kRmF0aGVyRWR1Y2F0aW9uID09ICI0Il0gPC0gIkNvbGxlZ2UiCmhlYWQoc3R1ZGVudF9tYXRoLkdQX00sMTApCmBgYAoKYGBge3J9CnN0dWRlbnRfbWF0aC5HUF9GJEdlbmRlcltzdHVkZW50X21hdGguR1BfRiRHZW5kZXIgPT0gIkYiXSA8LSAiRmVtYWxlIgpzdHVkZW50X21hdGguR1BfRiRHZW5kZXJbc3R1ZGVudF9tYXRoLkdQX0YkR2VuZGVyID09ICJNIl0gPC0gIk1hbGUiCnN0dWRlbnRfbWF0aC5HUF9GJFBhcmVudExpdmluZ1N0YXR1c1tzdHVkZW50X21hdGguR1BfRiRQYXJlbnRMaXZpbmdTdGF0dXMgPT0gIkEiXSA8LSAiQXBhcnQiCnN0dWRlbnRfbWF0aC5HUF9GJFBhcmVudExpdmluZ1N0YXR1c1tzdHVkZW50X21hdGguR1BfRiRQYXJlbnRMaXZpbmdTdGF0dXMgPT0gIlQiXSA8LSAiVG9nZXRoZXIiCnN0dWRlbnRfbWF0aC5HUF9GJE1vdGhlckVkdWNhdGlvbltzdHVkZW50X21hdGguR1BfRiRNb3RoZXJFZHVjYXRpb24gPT0gIjAiXSA8LSAiTm9uZSIKc3R1ZGVudF9tYXRoLkdQX0YkTW90aGVyRWR1Y2F0aW9uW3N0dWRlbnRfbWF0aC5HUF9GJE1vdGhlckVkdWNhdGlvbiA9PSAiMSJdIDwtICJQcmltYXJ5IgpzdHVkZW50X21hdGguR1BfRiRNb3RoZXJFZHVjYXRpb25bc3R1ZGVudF9tYXRoLkdQX0YkTW90aGVyRWR1Y2F0aW9uID09ICIyIl0gPC0gIkdyYWRlcyA1IC0gOSIKc3R1ZGVudF9tYXRoLkdQX0YkTW90aGVyRWR1Y2F0aW9uW3N0dWRlbnRfbWF0aC5HUF9GJE1vdGhlckVkdWNhdGlvbiA9PSAiMyJdIDwtICJTZWNvbmRhcnkiCnN0dWRlbnRfbWF0aC5HUF9GJE1vdGhlckVkdWNhdGlvbltzdHVkZW50X21hdGguR1BfRiRNb3RoZXJFZHVjYXRpb24gPT0gIjQiXSA8LSAiQ29sbGVnZSIKc3R1ZGVudF9tYXRoLkdQX0YkRmF0aGVyRWR1Y2F0aW9uW3N0dWRlbnRfbWF0aC5HUF9GJEZhdGhlckVkdWNhdGlvbiA9PSAiMCJdIDwtICJOb25lIgpzdHVkZW50X21hdGguR1BfRiRGYXRoZXJFZHVjYXRpb25bc3R1ZGVudF9tYXRoLkdQX0YkRmF0aGVyRWR1Y2F0aW9uID09ICIxIl0gPC0gIlByaW1hcnkiCnN0dWRlbnRfbWF0aC5HUF9GJEZhdGhlckVkdWNhdGlvbltzdHVkZW50X21hdGguR1BfRiRGYXRoZXJFZHVjYXRpb24gPT0gIjIiXSA8LSAiR3JhZGVzIDUgLSA5IgpzdHVkZW50X21hdGguR1BfRiRGYXRoZXJFZHVjYXRpb25bc3R1ZGVudF9tYXRoLkdQX0YkRmF0aGVyRWR1Y2F0aW9uID09ICIzIl0gPC0gIlNlY29uZGFyeSIKc3R1ZGVudF9tYXRoLkdQX0YkRmF0aGVyRWR1Y2F0aW9uW3N0dWRlbnRfbWF0aC5HUF9GJEZhdGhlckVkdWNhdGlvbiA9PSAiNCJdIDwtICJDb2xsZWdlIgpoZWFkKHN0dWRlbnRfbWF0aC5HUF9GLDEwKQpgYGAKIyBTdW1tYXJpemUgdGhlIG1hbGUgYW5kIGZlbWFsZSBtYXRoIGRhdGEgc3Vic2V0cwpgYGB7cn0Kc3VtbWFyeShzdHVkZW50X21hdGguR1BfTSkKCnN1bW1hcnkoc3R1ZGVudF9tYXRoLkdQX0YpCmBgYAoKYGBge3J9CnNwcmludGYoIlRoZSBtZWFuIGFuZCBtZWRpYW4gZm9yIGFnZSwgc3R1ZHkgdGltZSwgYW5kIEZpbmFsIEdyYWRlIGZvciBNYXRoIHN0dWRlbnRzIGF0IGJvdGggR2FicmllbCBQZXJlaXJhIChHUCkiKQoKc3ByaW50ZigiVGhlIG1lYW4gYWdlIG9mIEdQIG1hbGUgbWF0aCBzdHVkZW50czogJXMsIiwgbWVhbihzdHVkZW50X21hdGguR1BfTSRBZ2UpKQpzcHJpbnRmKCJUaGUgbWVhbiBhZ2Ugb2YgR1AgZmVtYWxlIG1hdGggc3R1ZGVudHM6ICVzIiwgbWVhbihzdHVkZW50X21hdGguR1BfRiRBZ2UpKQoKc3ByaW50ZigiVGhlIG1lZGlhbiBhZ2Ugb2YgR1AgbWFsZSBtYXRoIHN0dWRlbnRzOiAlcyIsIG1lZGlhbihzdHVkZW50X21hdGguR1BfTSRBZ2UpKQpzcHJpbnRmKCJUaGUgbWVkaWFuIGFnZSBvZiBHUCBmZW1hbGUgbWF0aCBzdHVkZW50czogJXMiLCBtZWRpYW4oc3R1ZGVudF9tYXRoLkdQX0YkQWdlKSkKCmBgYApJdCBpcyBub3Qgc3VycHJpc2luZyB0aGF0IHRoZSBtZWFuIGFuZCBtZWRpYW4gYWdlIGZvciB0aGUgbWFsZSBhbmQgZmVtYWxlIHN0dWRlbnRzIGlzIHRoZSBzYW1lIHNpbmNlIHRoZXkgYXJlIGF0dGVuZGluZyBhIHNjaG9vbCB3aXRoIHN0dWRlbnRzIHRoZXJlIG93biBhZ2UuCmBgYHtyfQpzcHJpbnRmKCJUaGUgbWVhbiBzdHVkeSB0aW1lIG9mIEdQIG1hbGUgbWF0aCBzdHVkZW50czogJXMiLCBtZWFuKHN0dWRlbnRfbWF0aC5HUF9NJFN0dWR5VGltZSkpCnNwcmludGYoIlRoZSBtZWFuIHN0dWR5IHRpbWUgb2YgR1AgZmVtYWxlIG1hdGggc3R1ZGVudHM6ICVzIiwgbWVhbihzdHVkZW50X21hdGguR1BfRiRTdHVkeVRpbWUpKQoKc3ByaW50ZigiVGhlIG1lZGlhbiBzdHVkeSB0aW1lIG9mIEdQIG1hbGUgbWF0aCBzdHVkZW50czogJXMiLCBtZWRpYW4oc3R1ZGVudF9tYXRoLkdQX00kU3R1ZHlUaW1lKSkKc3ByaW50ZigiVGhlIG1lZGlhbiBzdHVkeSB0aW1lIG9mIEdQIGZlbWFsZSBtYXRoIHN0dWRlbnRzOiAlcyIsIG1lZGlhbihzdHVkZW50X21hdGguR1BfRiRTdHVkeVRpbWUpKQoKYGBgCldoaWxlIHRoZSBtZWRpYW4gc3R1ZHkgdGltZSBmb3IgYm90aCBtYWxlIGFuZCBmZW1hbGUgc3R1ZGVudHMgaXMgZXF1YWwgYXQgMiBob3VycyBvZiBzdHVkeSB0aW1lLCBsb29raW5nIGF0IHRoZSBtZWFuIHN0dWR5dGltZSBiZXR3ZWVuIG1hbGUgYW5kIGZlbWFsZSwgZmVtYWxlcyB0ZW5kIHRvIHN0dWR5IDMwIG1pbnV0ZXMgbW9yZSBvbiBhdmVyYWdlLgoKYGBge3J9CgpzcHJpbnRmKCJUaGUgbWVhbiBmaW5hbCBncmFkZSBvZiBHUCBtYWxlIG1hdGggc3R1ZGVudHM6ICVzIiwgbWVhbihzdHVkZW50X21hdGguR1BfTSRGaW5hbEdyYWRlKSkKc3ByaW50ZigiVGhlIG1lYW4gZmluYWwgZ3JhZGUgb2YgR1AgZmVtYWxlIG1hdGggc3R1ZGVudHM6ICVzIiwgbWVhbihzdHVkZW50X21hdGguR1BfRiRGaW5hbEdyYWRlKSkKCnNwcmludGYoIlRoZSBtZWRpYW4gZmluYWwgZ3JhZGUgb2YgR1AgbWFsZSBtYXRoIHN0dWRlbnRzOiAlcyIsIG1lZGlhbihzdHVkZW50X21hdGguR1BfTSRGaW5hbEdyYWRlKSkKc3ByaW50ZigiVGhlIG1lZGlhbiBmaW5hbCBncmFkZSBvZiBHUCBmZW1hbGUgbWF0aCBzdHVkZW50czogJXMiLCBtZWRpYW4oc3R1ZGVudF9tYXRoLkdQX0YkRmluYWxHcmFkZSkpCmBgYApIZXJlIGFnYWluLCB0aGUgbWVkaWFuIGZpbmFsIGdyYWRlIGZvciBtYWxlIGFuZCBmZW1hbGUgc3R1ZGVudHMgaXMgZXF1YWwgYXQgMTEuICBIb3dldmVyLCB0aGUgbWVhbiAoYXZlcmFnZSkgZmluYWwgZ3JhZGUgZm9yIG1hbGVzIGlzIDEuMDkgcG9pbnRzIGhpZ2hlciB0aGFuIHRoYXQgb2YgZmVtYWxlcyBldmVuIHRob3VnaCBpdCBhcHBlYXJzIHRoYXQgZmVtYWxlcyBzdHVkeSBhIGxpdHRsZSBtb3JlLgoKIyBTY2F0dGVycGxvdHMgZm9yIHRoZSBtYWxlIGFuZCBmZW1hbGUgbWF0aCBkYXRhc2V0cwpgYGB7cn0gCmdncGxvdChzdHVkZW50X21hdGguR1BfTSwgYWVzKHggPSBTdHVkZW50LCB5ID0gRmluYWxHcmFkZSkpICsgCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjMDA5OWY5IikgKyBsYWJzKHggPSAiTWFsZSBNYXRoIFN0dWRlbnRzIiwgeSA9ICJGaW5hbCBHcmFkZSIpCmBgYApBdCBmaXJzdCBnbGFuY2UgaXQgYXBwZWFycyB0aGF0IGJvdGggc2NhdHRlcnBsb3RzIHNob3cgYWxtb3N0IGlkZW50aWNhbCByZXN1bHRzLiAgSG93ZXZlciwgaWYgeW91IGxvb2sgY2xvc2VseSB5b3Ugd2lsbCBub3RpY2UgdGhhdCBpbiB0aGUgZmVtYWxlIHNjYXR0ZXJwbG90IGJlbG93IHRoYXQgbW9yZSBncmFkZXMgZmFsbCBiZXR3ZWVuIHRoZSA1IGFuZCAxMCBsaW5lcyB0aGFuIHRoZSBtYWxlcyBhbmQgYWxzbyBtb3JlIGZlbWFsZXMgaGF2ZSBtb3JlIHBvaW50cyBvbiB0aGUgemVybyBsaW5lLiBUaGlzIHdpbGwgY2VydGFpbmx5IGV4cGxhaW4gd2h5IHRoZSBmZW1hbGUgbWVhbiBmaW5hbCBncmFkZSBpcyBsb3dlciB0aGFuIHRoZSBtYWxlIG1lYW4gZmluYWwgZ3JhZGUuCmBgYHtyfSAKZ2dwbG90KHN0dWRlbnRfbWF0aC5HUF9GLCBhZXMoeCA9IFN0dWRlbnQsIHkgPSBGaW5hbEdyYWRlKSkgKyAKICBnZW9tX3BvaW50KGNvbG9yID0gIiMwMDk5ZjkiKSArIGxhYnMoeCA9ICJGZW1hbGUgTWF0aCBTdHVkZW50cyIsIHkgPSAiRmluYWwgR3JhZGUiKQpgYGAKIyBCb3hwbG90cyBmb3IgdGhlIG1hbGUgYW5kIGZlbWFsZSBtYXRoIGRhdGFzZXRzCmBgYHtyfQpib3hwbG90KEZpbmFsR3JhZGUgfiBTdHVkeVRpbWUsIGRhdGEgPSBzdHVkZW50X21hdGguR1BfTSwgeGxhYiA9ICJTdHVkeSBUaW1lIChpbiBob3VycykiLAogICAgICAgIHlsYWIgPSAiRmluYWwgR3JhZGUiLCBtYWluID0gIk1hbGUgU3R1ZGVudCBNYXRoIEdyYWRlIERhdGEiLCAKICAgICAgICBub3RjaCA9IEZBTFNFLCB2YXJ3aWR0aCA9IFRSVUUsIGNvbCA9IGMoImJsdWUiLCJncmVlbiIsInllbGxvdyIsInB1cnBsZSIpKQpgYGAKVGhlIGJveHBsb3RzIGNhbiBzaG93IGEgbW9yZSBjbGVhcmx5IHRoZSBtZWRpYW4sIG1lYW4gYW5kIGFueSBvdXRsaWVycyBpbiB0aGUgZmVtYWxlIGFuZCBtYWxlIGZpbmFsIGdyYWRlIGRhdGEgYnJva2VuIGRvd24gYnkgdGhlIGFtb3VudCBvZiBzdHVkeSB0aW1lIGZvciBlYWNoIGJ5IGdldHRpbmcgYSBsaXR0bGUgaW50byB0aGUgd2VlZHMuICBJbiB0aGUgZmlyc3QgYm94cGxvdCB3aGVyZSBzdHVkeXRpbWUgaXMgb25lIGhvdXIgaGVyZSBhcmUgc29tZSBwb2ludHMuIDEuIE1lZGlhbiBmb3IgYm90aCBpcyAxMS4gIDIuIE1vcmUgbWFsZXMgc2NvcmVkIHdpdGggb25lIGhvdXIgb2Ygc3R1ZHkgdGltZSB0aGFuIGZlbWFsZXMuICAzLiBUaGUgbG93ZXN0IHNjb3JlIG9mIDAgZm9yIG1hbGVzIGFuZCA2IGZvciBmZW1hbGVzLiBJbiBzdHVkeSB0aW1lIGhvdXIgeW91IHNlZSAxLiBhbiBvdXRsaWVyIGF0IDAuIDIuIE1lZGlhbiBvZiAxMS4gMy4gRm9yIHRob3NlIHRoYXQgc3BlbnQgMiBob3VycyBzdHVkeWluZyBtb3JlIGZlbWFsZXMgdGhhbiBtYWxlcyBmaW5hbCBncmFkZXMgYXJlIHJlcHJlc2VudGVkIGJ5IHRoZSBib3guICAKYGBge3J9CmJveHBsb3QoRmluYWxHcmFkZSB+IFN0dWR5VGltZSwgZGF0YSA9IHN0dWRlbnRfbWF0aC5HUF9GLCB4bGFiID0gIlN0dWR5IFRpbWUgKGluIGhvdXJzKSIsCiAgICAgICAgeWxhYiA9ICJGaW5hbCBHcmFkZSIsIG1haW4gPSAiRmVtYWxlIFN0dWRlbnQgTWF0aCBHcmFkZSBEYXRhIiwgCiAgICAgICAgbm90Y2ggPSBGQUxTRSwgdmFyd2lkdGggPSBUUlVFLCBjb2wgPSBjKCJibHVlIiwiZ3JlZW4iLCJ5ZWxsb3ciLCJwdXJwbGUiKSkKYGBgCiMgSGlzdG9ncmFtcyBmb3IgdGhlIG1hbGUgYW5kIGZlbWFsZSBtYXRoIGRhdGFzZXRzCmBgYHtyfQpoaXN0KHN0dWRlbnRfbWF0aC5HUF9NJEZpbmFsR3JhZGUsIHhsYWIgPSAiTWF0aCBGaW5hbCBHcmFkZSAwIHRvIDIwIC0gTWFsZSIsIG1haW4gPSAiTWFsZSBGaW5hbCBHcmFkZSIsIHByb2IgPSBUUlVFKQpsaW5lcyhkZiwgbHdkPTEsIGNvbCA9ICJibHVlIikKYGBgCkluIHRoZXNlIGhpc3RvZ3JhbXMgd2l0aCBkZW5zaXR5IGN1cnZlcywgb25lIGNhbiBzZWUgdGhhdCBtb3JlIGZlbWFsZXMgc2NvcmVkIGJldHdlZW4gMCBhbmQgMSBmb3IgYSBmaW5hbCBncmFkZSB0aGFuIG1hbGVzIGRpZC4gIEhvd2V2ZXIsIGl0IGFwcGVhcnMgdGhhdCB0aGUgdG90YWwgcGVyY2VudGFnZSBvZiBmZW1hbGVzIGFuZCBtYWxlcyBmaW5hbCBncmFkZSBzY29yZSB0aGF0IGxheSBiZXR3ZWVuIDcgYW5kIDE2IGlzIGp1c3QgYWJvdXQgZXF1YWwuIFlvdSBjYW4gc2VlIHRoaXMgaW4gdGhlIHR3byBzY2F0dGVycGxvdHMgYWJvdmUgYXMgd2VsbC4gIFRoZSBkZW5zaXR5IGN1cnZlIHN1cHBvcnRzIHRoaXMgYXMgd2VsbCB3aXRoIHRoZSBtb3N0IGRlbnNpdHkgYmVpbmcgYXQgRmluYWwgR3JhZGUgMTEgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIG1lZGlhbiBmb3IgYm90aCBkYXRhc2V0cy4KCmBgYHtyfQpoaXN0KHN0dWRlbnRfbWF0aC5HUF9GJEZpbmFsR3JhZGUsIHhsYWIgPSAiTWF0aCBGaW5hbCBHcmFkZSAwIHRvIDIwIC0gRmVtYWxlIiwgbWFpbiA9ICJGZW1hbGUgRmluYWwgR3JhZGUiLCBwcm9iID0gVFJVRSkKZGYgPC0gZGVuc2l0eShzdHVkZW50X21hdGguR1BfRiRGaW5hbEdyYWRlKQpsaW5lcyhkZiwgbHdkPTEsIGNvbCA9ICJyZWQiKQoKYGBgCiMgRGVuc2l0eSBwbG90cyBmb3IgdGhlIG1hbGUgYW5kIGZlbWFsZSBtYXRoIGRhdGFzZXRzCmBgYHtyfQpkZW5zaXR5cGxvdCggfiBzdHVkZW50X21hdGguR1BfTSRGaW5hbEdyYWRlLCBkYXRhID0gc3R1ZGVudF9tYXRoLCB4bGFiID0gIk1hdGggRmluYWwgR3JhZGUgLSBNYWxlIikKYGBgClRoZSBkZW5zaXR5IHBsb3QgaXMgbXkgZmF2b3JpdGUgYmVjYXVzZSBpdCBpbW1lZGlhdGVseSBzaG93cyBqdXN0IGhvdyBjbG9zZSB0byBpZGVudGljYWwgaXMgdGhlIHBlcmZvcm1hbmNlIG9mIG1hbGUgYW5kIGZlbWFsZXMgc3R1ZGVudHMgaW4gdGhpcyBtYXRoIGNsYXNzLiBJZiBpdCB3ZXJlIG5vdCBmb3IgdGhlIGxhYmVscyBvbmUgY291bGQgbm90IHRlbGwgd2hpY2ggaXMgdGhlIGZlbWFsZSBncmFwaCBhbmQgd2hpY2ggaXMgdGhlIG1hbGUuIFRoZXNlIGRlbnNpdHkgcGxvdHMgc2hvdyBleGFjdGx5IHdoYXQgaXMgZXhwbGFpbmVkIGluIHRoZSBoaXN0b3JncmFtIHdpdGggZGVuc2l0eSBjdXJ2ZSBhYm92ZS4KYGBge3J9CmRlbnNpdHlwbG90KCB+IHN0dWRlbnRfbWF0aC5HUF9GJEZpbmFsR3JhZGUsIGRhdGEgPSBzdHVkZW50X21hdGgsIHhsYWIgPSAiTWF0aCBGaW5hbCBHcmFkZSAtIEZlbWFsZSIpCmBgYApCT05VUyAtIHBsYWNlIHRoZSBvcmlnaW5hbCAuY3N2IGluIGEgZ2l0aHViIGZpbGUgYW5kIGhhdmUgUiByZWFkIGZyb20gdGhlIGxpbmsuIFRoaXMgd2lsbCBiZSBhIHZlcnkgdXNlZnVsIHNraWxsIGFzIHlvdSBwcm9ncmVzcyBpbiB5b3VyIGRhdGEgc2NpZW5jZSBlZHVjYXRpb24gYW5kIGNhcmVlci4gCmBgYHtyfQpsaWJyYXJ5KFJDdXJsKQpmaWxlbmFtZSA8LSBnZXRVUkwoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hdWRpb3J1bm5lcjEzL01hc3RlcnMtQ291cnNld29yay9tYWluL3N0dWRlbnRfbWF0LmNzdiIpCnN0dWRlbnRfbWF0X2JvbnVzIDwtIHJlYWQuY3N2KHRleHQgPSBmaWxlbmFtZSkKaGVhZChzdHVkZW50X21hdF9ib251cywgMTApCmBgYAoK