Relative growth rate

#load the files
RGR <- read.csv("~/Desktop/Data/RGR.csv")
View(RGR)
#plot a boxplot to visualise the data #we can see from the boxplot that ssu2 group has a much lower relative growth rate than the other two groups 
summary(RGR$Group)
ssu1 ssu2   wt 
  12   12   12 
levels(RGR$Group)
[1] "ssu1" "ssu2" "wt"  
p <- ggboxplot(RGR, x="Group", y= "RGR",color = "Group", palette = c("#00AFBB", "#E7B800", "#FC4E07")) + labs(x="Groups of plants", y = "relative growth rates (g g^-1 d^-1)") + geom_jitter(shape=19, position=position_jitter(0.2)) + geom_point() + theme(legend.position = "none")
p

#use anova for comparsion among three groups 
model <- aov(RGR~Group, data = RGR)
#check the assumption of the fitting model
plot(model)

#conclusion: ANOVA assumptions are met: data is adequately normally distributed, variances are homogeneous, although data point 30 and 33 appear to be outliers 
summary(model)
            Df   Sum Sq  Mean Sq F value Pr(>F)    
Group        2 0.015775 0.007888   142.1 <2e-16 ***
Residuals   33 0.001832 0.000056                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#post-hoc test for ANOVA: Tukey Honest Significant Differences test 
TukeyHSD(model)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = RGR ~ Group, data = RGR)

$Group
                  diff          lwr          upr     p adj
ssu2-ssu1 -0.043416667 -0.050879761 -0.035953572 0.0000000
wt-ssu1    0.001916667 -0.005546428  0.009379761 0.8046724
wt-ssu2    0.045333333  0.037870239  0.052796428 0.0000000
plot(TukeyHSD(model))

Conclusion for RGR: ANOVA assumptions are met: data is adequately normally distributed, variances are homogeneous, although data point 30 and 33 appear to be outliers. There is a very signficant relative growth rate difference among these three groups (ANOVA, F(2,33)= 142.1, p < 0.001). More specifically, relative growth rate of ssu2 group is very statistically significant lower than that of ssu1 group and wt group. (post-hoc TukeyHSD, padj (ssu2-ssu1) < 0.001, padj (wt-ssu2) < 0.001). The difference between the wild type group and the ssu1 group is not significant (p = 0.805)

Sucrose concentration

sucrose <- read.csv("~/Desktop/Data/Sucrose.csv")
View(sucrose)
#plot a boxplot to visualise the data #we can see from the boxplot that ssu2 group has a much lower relative growth rate than the other two groups 
summary(sucrose$Group)
ssu1 ssu2   wt 
  11   11   11 
levels(sucrose$Group)
[1] "ssu1" "ssu2" "wt"  
p <- ggboxplot(sucrose, x="Group", y= "Sucrose",color = "Group", palette = c("#00AFBB", "#E7B800", "#FC4E07")) + labs(x="Groups of plants", y = "sucrose concentrations(umol g^-1)") + geom_jitter(shape=19, position=position_jitter(0.2)) + geom_point() + theme(legend.position = "none")
p

#use anova for comparsion among three groups 
model1 <- aov(Sucrose~Group, data = sucrose)
plot(model1)

#conclusion: ANOVA assumptions are gernerally met: data is adequately normally distributed according to the normal Q-Q plot, variances are in general homogeneous, though data point 2,3 and 4 appear to be outliers 
summary(model1)
            Df Sum Sq Mean Sq F value   Pr(>F)    
Group        2  41.18  20.590   19.56 3.65e-06 ***
Residuals   30  31.57   1.052                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#post-hoc test for ANOVA: Tukey Honest Significant Differences test 
TukeyHSD(model1)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = Sucrose ~ Group, data = sucrose)

$Group
                diff        lwr       upr     p adj
ssu2-ssu1 -0.9018182 -1.9802375 0.1766012 0.1151764
wt-ssu1    1.7863636  0.7079443 2.8647830 0.0008618
wt-ssu2    2.6881818  1.6097625 3.7666012 0.0000027
plot(TukeyHSD(model1))

Report for sucrose concentration: ANOVA assumptions are gernerally met. Data is adequately normally distributed according to the normal Q-Q plot, variances are in general homogeneous, though data point 2,3 and 4 appear to be outliers. There is a signficant sucrose concentrations difference among these three groups (ANOVA, F(2,30)= 19.56, p < 0.001). More specifically,sucrose concentration of wild type (wt) group is very statistically significant higher than that of ssu1 group and ssu2 group. (TukeyHSD, padj (wt-ssu1) < 0.001, padj (wt-ssu2) < 0.001). The sucrose concentration difference between ssu1 and ssu2 is not significant (padj = 0.115)

Analysis of A-Ci data

AC <- read.csv("~/Desktop/Data/AciDataWT.csv")
View(AC)
#plot a scatterplot
plot(Ci ~ A, data = AC)

#assume linearlity 
#a function for plotting linear regression result
ggplotRegression <- function (fit) {
    
    require(ggplot2)
    
    ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) + 
        geom_point() +
        stat_smooth(method = "lm", col = "red") +
        labs(title = paste("Adj R2 = ",signif(summary(fit)$adj.r.squared, 5),
                           "Intercept =",signif(fit$coef[[1]],5 ),
                           " Slope =",signif(fit$coef[[2]], 5),
                           " P =",signif(summary(fit)$coef[2,4], 5)))
}
ggplotRegression(lm(Ci ~ A, data = AC)) + xlab("CO2 concentration (ppm)") + ylab("photosynthetic activity (umol CO2 M^-2 s^-1)")

#linear regression analysis
AC_lm <- lm(Ci ~ A, data = AC)
summary(AC_lm)

Call:
lm(formula = Ci ~ A, data = AC)

Residuals:
    Min      1Q  Median      3Q     Max 
-167.44  -98.87  -29.79   71.62  315.37 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)   -26.19      92.71  -0.283  0.78471   
A              29.79       7.19   4.143  0.00324 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 151.8 on 8 degrees of freedom
Multiple R-squared:  0.6821,    Adjusted R-squared:  0.6423 
F-statistic: 17.16 on 1 and 8 DF,  p-value: 0.00324
#check the assumptions of linear model by looking at the R square value

Conclusion: By looking at the right end of the graph, we suspect that the best fit line may underestimate the higher Ci values.By looking at the R squared value, we can tell 64% of the variation has been accounted for by the linear model. Therefore, fitting a straight line to this data set was probably not justified.

Concenration on the lower Ci part

low_AC <- read.csv("~/Desktop/Data/AciDataWTTruncate.csv")
View(low_AC)
#plot a scatterplot
plot(Ci ~ A, data = low_AC)

#assume linearlity 
#a function for plotting linear regression result
ggplotRegression <- function (fit) {
    
    require(ggplot2)
    
    ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) + 
        geom_point() +
        stat_smooth(method = "lm", col = "red") +
        labs(title = paste("Adj R2 = ",signif(summary(fit)$adj.r.squared, 5),
                           "Intercept =",signif(fit$coef[[1]],5 ),
                           " Slope =",signif(fit$coef[[2]], 5),
                           " P =",signif(summary(fit)$coef[2,4], 5)))
}
ggplotRegression(lm(Ci ~ A, data = low_AC)) + xlab("CO2 concentration (ppm)") + ylab("photosynthetic activity (umol CO2 M^-2 s^-1)")

#linear regression analysis
AC_lm1 <- lm(A ~ Ci, data = low_AC)
summary(AC_lm1)

Call:
lm(formula = A ~ Ci, data = low_AC)

Residuals:
       1        2        3        4        5        6        7 
-0.25151  0.05768  0.11436  0.36188 -0.08775 -0.33278  0.13812 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) -3.33181    0.22588  -14.75 2.59e-05 ***
Ci           0.06857    0.00124   55.28 3.66e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2639 on 5 degrees of freedom
Multiple R-squared:  0.9984,    Adjusted R-squared:  0.998 
F-statistic:  3056 on 1 and 5 DF,  p-value: 3.664e-08
#test the normality of the data
plot(AC_lm1)

#the data in general is noramlly distributed, though point 10 appears to be an outlier and out of cook's distnace
#make prediction 
prediction <- predict(AC_lm1)
plot(A ~ Ci, data = low_AC)
lines(low_AC$Ci,prediction)

Conclusion: By looking at the Q-Q plot, the data points do not resemble an “S shape” and therefore are noramlly distributed. By looking at the R square value (R^2 = 0.998), we can tell that the linearity assumption is met. CO2 concentration is strongly positively correlated to the photosynthetic activity (linear regression, R^2 = 0.998, p < 0.001) The photosynthetic activity (A) could be predicted from CO2 concentration (Ci) via A = -3.33 + 0.0686 Ci (R^2 = 0.998) CO2 concentration is a significant predictor of photosynthetic activity (p < 0.001, F(1,5) = 3056)

A-Ci for all 3 groups of the plants

#load package 
library(MASS)
#import the files
full_aci <- read.csv("~/Desktop/Data/AciDataFull.csv")
View(full_aci)
#visualise the data
p <- ggplot(full_aci,aes(full_aci$Ci,full_aci$A)) + geom_point(aes(colour=Group)) + geom_line(aes(colour=Group)) + xlab("CO2 concentration (ppm)") + ylab("photosynthetic activity(CO2 m^-2 s^-1)") + labs(col = "Genotype")
p

#from looking at the graph, which appears non-linear, a subset of <300ppm is selected
subset_aci <- full_aci[full_aci[, 1] < 300, ]
View(subset_aci)
#visualise the data again
p <- ggplot(subset_aci,aes(subset_aci$Ci,subset_aci$A)) + geom_point(aes(colour=Group)) + geom_line(aes(colour=Group)) + xlab("CO2 concentration (ppm)") + ylab("photosynthetic activity(CO2 m^-2 s^-1)") + labs(col = "Genotype")
p

#fit a linear model 
aci_lm4 <- lm(A ~ Ci + Group + Ci:Group, data = subset_aci)
summary(aci_lm4)

Call:
lm(formula = A ~ Ci + Group + Ci:Group, data = subset_aci)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.70505 -0.08332  0.07070  0.12077  0.36188 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -3.435899   0.265058 -12.963 2.04e-08 ***
Ci            0.051104   0.001426  35.828 1.43e-13 ***
Groupssu2     2.114889   0.408037   5.183 0.000228 ***
Groupwt       0.104088   0.366857   0.284 0.781454    
Ci:Groupssu2 -0.037248   0.002315 -16.090 1.74e-09 ***
Ci:Groupwt    0.017466   0.001994   8.761 1.47e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2963 on 12 degrees of freedom
Multiple R-squared:  0.9977,    Adjusted R-squared:  0.9968 
F-statistic:  1047 on 5 and 12 DF,  p-value: 2.089e-15
Anova(aci_lm4)
Anova Table (Type II tests)

Response: A
           Sum Sq Df F value    Pr(>F)    
Ci        280.414  1 3194.21 6.211e-16 ***
Group     106.609  2  607.20 8.776e-13 ***
Ci:Group   50.111  2  285.41 7.619e-11 ***
Residuals   1.053 12                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
plot(aci_lm4)

#we can see from the linear model that because the R-squared value is 0.9977, therefore the data has a linear relationship, therefore the linearity assumption is met. 
#by looking at the normal Q-Q plot, we can tell the data is roughly normally distributed, though point14,6 and 16 appear to be outliers.
#test the significance of factors
aci_lm <- lm(A ~ Ci + Group, data = subset_aci)
aci_lm3 <- lm(A ~ Ci * Group, data = subset_aci)
anova(aci_lm,aci_lm3,test="F")
Analysis of Variance Table

Model 1: A ~ Ci + Group
Model 2: A ~ Ci * Group
  Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
1     14 51.164                                  
2     12  1.053  2    50.111 285.41 7.619e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#the interaction between genotype (Group) and CO2 concentration factor (Ci) is significant, (F(2,14) = 285.41, p < 0.001)
#Use linear model to test correlations among Aci, CO2 and genotype
aci_lm <- lm(A ~ Ci + Group, data = subset_aci)
aci_lm1 <- lm(A ~ Ci, data = subset_aci)
anova(aci_lm1,aci_lm,test="F")
Analysis of Variance Table

Model 1: A ~ Ci
Model 2: A ~ Ci + Group
  Res.Df     RSS Df Sum of Sq      F    Pr(>F)    
1     16 157.774                                  
2     14  51.164  2    106.61 14.586 0.0003772 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#genotype factor (Group) is significant, (F(2,14) = 14.586, p < 0.001)
aci_lm <- lm(A ~ Ci + Group, data = subset_aci)
aci_lm2 <- lm(A ~ Group, data = subset_aci)
anova(aci_lm2,aci_lm,test="F")
Analysis of Variance Table

Model 1: A ~ Group
Model 2: A ~ Ci + Group
  Res.Df    RSS Df Sum of Sq      F    Pr(>F)    
1     15 331.58                                  
2     14  51.16  1    280.41 76.729 4.692e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#CO2 concentration factor (Ci) is significant, (F(2,14) = 76.729, p < 0.001)
#backward stepwise elimination 
aci_glm <- glm(A ~ Ci * Group, data = subset_aci)
summary(aci_glm)

Call:
glm(formula = A ~ Ci * Group, data = subset_aci)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-0.70505  -0.08332   0.07070   0.12077   0.36188  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  -3.435899   0.265058 -12.963 2.04e-08 ***
Ci            0.051104   0.001426  35.828 1.43e-13 ***
Groupssu2     2.114889   0.408037   5.183 0.000228 ***
Groupwt       0.104088   0.366857   0.284 0.781454    
Ci:Groupssu2 -0.037248   0.002315 -16.090 1.74e-09 ***
Ci:Groupwt    0.017466   0.001994   8.761 1.47e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for gaussian family taken to be 0.08778842)

    Null deviance: 460.7228  on 17  degrees of freedom
Residual deviance:   1.0535  on 12  degrees of freedom
AIC: 13.993

Number of Fisher Scoring iterations: 2
Anova(aci_glm)
Analysis of Deviance Table (Type II tests)

Response: A
         LR Chisq Df Pr(>Chisq)    
Ci         3194.2  1  < 2.2e-16 ***
Group      1214.4  2  < 2.2e-16 ***
Ci:Group    570.8  2  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#no factor can be dropped 

conclusion: By looking at the correlation plot for the full dataset, we can see when CO2 concentration is larger than 300 ppm, the correlation between CO2 concentration and photosynthetic activity is no longer linear. Therefore a subset of < 300 ppm is chosen, which is linear, as shown by the new plot I produced. This is confrimed by the R-squared value of 0.9977 in the linear model Photosynthetic activity increases with CO2 concentration (df =1, p < 0.001), the interaction between CO2 concentration and also depends on the genotypes, where photosyntheitc activity of wt > ssu1 > ssu2, (df =2, p < 0.001) Photosynthetic activity(A) could be predicted by CO2 concentration(Ci), genotypes(Group) and the interaction between the two variables. A = -3.43 + 0.0511 Ci + 2.11 ssu2 + 0.104 wt - 0.0372 Ci:ssu2 + 0.0175 Ci:wt

LS0tCnRpdGxlOiAiUE1TIHByYWN0aWNhbCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKUmVsYXRpdmUgZ3Jvd3RoIHJhdGUgCmBgYHtyfQojbG9hZCB0aGUgZmlsZXMKUkdSIDwtIHJlYWQuY3N2KCJ+L0Rlc2t0b3AvRGF0YS9SR1IuY3N2IikKVmlldyhSR1IpCiNwbG90IGEgYm94cGxvdCB0byB2aXN1YWxpc2UgdGhlIGRhdGEgI3dlIGNhbiBzZWUgZnJvbSB0aGUgYm94cGxvdCB0aGF0IHNzdTIgZ3JvdXAgaGFzIGEgbXVjaCBsb3dlciByZWxhdGl2ZSBncm93dGggcmF0ZSB0aGFuIHRoZSBvdGhlciB0d28gZ3JvdXBzIApzdW1tYXJ5KFJHUiRHcm91cCkKbGV2ZWxzKFJHUiRHcm91cCkKcCA8LSBnZ2JveHBsb3QoUkdSLCB4PSJHcm91cCIsIHk9ICJSR1IiLGNvbG9yID0gIkdyb3VwIiwgcGFsZXR0ZSA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IikpICsgbGFicyh4PSJHcm91cHMgb2YgcGxhbnRzIiwgeSA9ICJyZWxhdGl2ZSBncm93dGggcmF0ZXMgKGcgZ14tMSBkXi0xKSIpICsgZ2VvbV9qaXR0ZXIoc2hhcGU9MTksIHBvc2l0aW9uPXBvc2l0aW9uX2ppdHRlcigwLjIpKSArIGdlb21fcG9pbnQoKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKcAojdXNlIGFub3ZhIGZvciBjb21wYXJzaW9uIGFtb25nIHRocmVlIGdyb3VwcyAKbW9kZWwgPC0gYW92KFJHUn5Hcm91cCwgZGF0YSA9IFJHUikKI2NoZWNrIHRoZSBhc3N1bXB0aW9uIG9mIHRoZSBmaXR0aW5nIG1vZGVsCnBsb3QobW9kZWwpCiNjb25jbHVzaW9uOiBBTk9WQSBhc3N1bXB0aW9ucyBhcmUgbWV0OiBkYXRhIGlzIGFkZXF1YXRlbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIHZhcmlhbmNlcyBhcmUgaG9tb2dlbmVvdXMsIGFsdGhvdWdoIGRhdGEgcG9pbnQgMzAgYW5kIDMzIGFwcGVhciB0byBiZSBvdXRsaWVycyAKc3VtbWFyeShtb2RlbCkKI3Bvc3QtaG9jIHRlc3QgZm9yIEFOT1ZBOiBUdWtleSBIb25lc3QgU2lnbmlmaWNhbnQgRGlmZmVyZW5jZXMgdGVzdCAKVHVrZXlIU0QobW9kZWwpCnBsb3QoVHVrZXlIU0QobW9kZWwpKQpgYGAKQ29uY2x1c2lvbiBmb3IgUkdSOgpBTk9WQSBhc3N1bXB0aW9ucyBhcmUgbWV0OiBkYXRhIGlzIGFkZXF1YXRlbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIHZhcmlhbmNlcyBhcmUgaG9tb2dlbmVvdXMsIGFsdGhvdWdoIGRhdGEgcG9pbnQgMzAgYW5kIDMzIGFwcGVhciB0byBiZSBvdXRsaWVycy4gVGhlcmUgaXMgYSB2ZXJ5IHNpZ25maWNhbnQgcmVsYXRpdmUgZ3Jvd3RoIHJhdGUgZGlmZmVyZW5jZSBhbW9uZyB0aGVzZSB0aHJlZSBncm91cHMgKEFOT1ZBLCBGKDIsMzMpPSAxNDIuMSwgcCA8IDAuMDAxKS4gTW9yZSBzcGVjaWZpY2FsbHksIHJlbGF0aXZlIGdyb3d0aCByYXRlIG9mIHNzdTIgZ3JvdXAgaXMgdmVyeSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGxvd2VyIHRoYW4gdGhhdCBvZiBzc3UxIGdyb3VwIGFuZCB3dCBncm91cC4gKHBvc3QtaG9jIFR1a2V5SFNELCBwYWRqIChzc3UyLXNzdTEpIDwgMC4wMDEsIHBhZGogKHd0LXNzdTIpIDwgMC4wMDEpLiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB3aWxkIHR5cGUgZ3JvdXAgYW5kIHRoZSBzc3UxIGdyb3VwIGlzIG5vdCBzaWduaWZpY2FudCAocCA9IDAuODA1KQoKU3Vjcm9zZSBjb25jZW50cmF0aW9uCmBgYHtyfQpzdWNyb3NlIDwtIHJlYWQuY3N2KCJ+L0Rlc2t0b3AvRGF0YS9TdWNyb3NlLmNzdiIpClZpZXcoc3Vjcm9zZSkKI3Bsb3QgYSBib3hwbG90IHRvIHZpc3VhbGlzZSB0aGUgZGF0YSAjd2UgY2FuIHNlZSBmcm9tIHRoZSBib3hwbG90IHRoYXQgc3N1MiBncm91cCBoYXMgYSBtdWNoIGxvd2VyIHJlbGF0aXZlIGdyb3d0aCByYXRlIHRoYW4gdGhlIG90aGVyIHR3byBncm91cHMgCnN1bW1hcnkoc3Vjcm9zZSRHcm91cCkKbGV2ZWxzKHN1Y3Jvc2UkR3JvdXApCnAgPC0gZ2dib3hwbG90KHN1Y3Jvc2UsIHg9Ikdyb3VwIiwgeT0gIlN1Y3Jvc2UiLGNvbG9yID0gIkdyb3VwIiwgcGFsZXR0ZSA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IikpICsgbGFicyh4PSJHcm91cHMgb2YgcGxhbnRzIiwgeSA9ICJzdWNyb3NlIGNvbmNlbnRyYXRpb25zKHVtb2wgZ14tMSkiKSArIGdlb21faml0dGVyKHNoYXBlPTE5LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoMC4yKSkgKyBnZW9tX3BvaW50KCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCnAKI3VzZSBhbm92YSBmb3IgY29tcGFyc2lvbiBhbW9uZyB0aHJlZSBncm91cHMgCm1vZGVsMSA8LSBhb3YoU3Vjcm9zZX5Hcm91cCwgZGF0YSA9IHN1Y3Jvc2UpCnBsb3QobW9kZWwxKQojY29uY2x1c2lvbjogQU5PVkEgYXNzdW1wdGlvbnMgYXJlIGdlcm5lcmFsbHkgbWV0OiBkYXRhIGlzIGFkZXF1YXRlbHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBub3JtYWwgUS1RIHBsb3QsIHZhcmlhbmNlcyBhcmUgaW4gZ2VuZXJhbCBob21vZ2VuZW91cywgdGhvdWdoIGRhdGEgcG9pbnQgMiwzIGFuZCA0IGFwcGVhciB0byBiZSBvdXRsaWVycyAKc3VtbWFyeShtb2RlbDEpCiNwb3N0LWhvYyB0ZXN0IGZvciBBTk9WQTogVHVrZXkgSG9uZXN0IFNpZ25pZmljYW50IERpZmZlcmVuY2VzIHRlc3QgClR1a2V5SFNEKG1vZGVsMSkKcGxvdChUdWtleUhTRChtb2RlbDEpKQpgYGAKUmVwb3J0IGZvciBzdWNyb3NlIGNvbmNlbnRyYXRpb246IEFOT1ZBIGFzc3VtcHRpb25zIGFyZSBnZXJuZXJhbGx5IG1ldC4gRGF0YSBpcyBhZGVxdWF0ZWx5IG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgbm9ybWFsIFEtUSBwbG90LCB2YXJpYW5jZXMgYXJlIGluIGdlbmVyYWwgaG9tb2dlbmVvdXMsIHRob3VnaCBkYXRhIHBvaW50IDIsMyBhbmQgNCBhcHBlYXIgdG8gYmUgb3V0bGllcnMuIApUaGVyZSBpcyBhIHNpZ25maWNhbnQgc3Vjcm9zZSBjb25jZW50cmF0aW9ucyBkaWZmZXJlbmNlIGFtb25nIHRoZXNlIHRocmVlIGdyb3VwcyAoQU5PVkEsIEYoMiwzMCk9IDE5LjU2LCBwIDwgMC4wMDEpLiBNb3JlIHNwZWNpZmljYWxseSxzdWNyb3NlIGNvbmNlbnRyYXRpb24gb2Ygd2lsZCB0eXBlICh3dCkgZ3JvdXAgaXMgdmVyeSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGhpZ2hlciB0aGFuIHRoYXQgb2Ygc3N1MSBncm91cCBhbmQgc3N1MiBncm91cC4gKFR1a2V5SFNELCBwYWRqICh3dC1zc3UxKSA8IDAuMDAxLCBwYWRqICh3dC1zc3UyKSA8IDAuMDAxKS4gVGhlIHN1Y3Jvc2UgY29uY2VudHJhdGlvbiBkaWZmZXJlbmNlIGJldHdlZW4gc3N1MSBhbmQgc3N1MiBpcyBub3Qgc2lnbmlmaWNhbnQgKHBhZGogPSAwLjExNSkKCkFuYWx5c2lzIG9mIEEtQ2kgZGF0YQpgYGB7cn0KQUMgPC0gcmVhZC5jc3YoIn4vRGVza3RvcC9EYXRhL0FjaURhdGFXVC5jc3YiKQpWaWV3KEFDKQojcGxvdCBhIHNjYXR0ZXJwbG90CnBsb3QoQ2kgfiBBLCBkYXRhID0gQUMpCiNhc3N1bWUgbGluZWFybGl0eSAKI2EgZnVuY3Rpb24gZm9yIHBsb3R0aW5nIGxpbmVhciByZWdyZXNzaW9uIHJlc3VsdApnZ3Bsb3RSZWdyZXNzaW9uIDwtIGZ1bmN0aW9uIChmaXQpIHsKICAgIAogICAgcmVxdWlyZShnZ3Bsb3QyKQogICAgCiAgICBnZ3Bsb3QoZml0JG1vZGVsLCBhZXNfc3RyaW5nKHggPSBuYW1lcyhmaXQkbW9kZWwpWzJdLCB5ID0gbmFtZXMoZml0JG1vZGVsKVsxXSkpICsgCiAgICAgICAgZ2VvbV9wb2ludCgpICsKICAgICAgICBzdGF0X3Ntb290aChtZXRob2QgPSAibG0iLCBjb2wgPSAicmVkIikgKwogICAgICAgIGxhYnModGl0bGUgPSBwYXN0ZSgiQWRqIFIyID0gIixzaWduaWYoc3VtbWFyeShmaXQpJGFkai5yLnNxdWFyZWQsIDUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJjZXB0ID0iLHNpZ25pZihmaXQkY29lZltbMV1dLDUgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBTbG9wZSA9IixzaWduaWYoZml0JGNvZWZbWzJdXSwgNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUCA9IixzaWduaWYoc3VtbWFyeShmaXQpJGNvZWZbMiw0XSwgNSkpKQp9CmdncGxvdFJlZ3Jlc3Npb24obG0oQ2kgfiBBLCBkYXRhID0gQUMpKSArIHhsYWIoIkNPMiBjb25jZW50cmF0aW9uIChwcG0pIikgKyB5bGFiKCJwaG90b3N5bnRoZXRpYyBhY3Rpdml0eSAodW1vbCBDTzIgTV4tMiBzXi0xKSIpCiNsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcwpBQ19sbSA8LSBsbShDaSB+IEEsIGRhdGEgPSBBQykKc3VtbWFyeShBQ19sbSkKI2NoZWNrIHRoZSBhc3N1bXB0aW9ucyBvZiBsaW5lYXIgbW9kZWwgYnkgbG9va2luZyBhdCB0aGUgUiBzcXVhcmUgdmFsdWUKYGBgCkNvbmNsdXNpb246IEJ5IGxvb2tpbmcgYXQgdGhlIHJpZ2h0IGVuZCBvZiB0aGUgZ3JhcGgsIHdlIHN1c3BlY3QgdGhhdCB0aGUgYmVzdCBmaXQgbGluZSBtYXkgdW5kZXJlc3RpbWF0ZSB0aGUgaGlnaGVyIENpIHZhbHVlcy5CeSBsb29raW5nIGF0IHRoZSBSIHNxdWFyZWQgdmFsdWUsIHdlIGNhbiB0ZWxsIDY0JSBvZiB0aGUgdmFyaWF0aW9uIGhhcyBiZWVuIGFjY291bnRlZCBmb3IgYnkgdGhlIGxpbmVhciBtb2RlbC4gVGhlcmVmb3JlLCBmaXR0aW5nIGEgc3RyYWlnaHQgbGluZSB0byB0aGlzIGRhdGEgc2V0IHdhcyBwcm9iYWJseSBub3QganVzdGlmaWVkLiAKCkNvbmNlbnJhdGlvbiBvbiB0aGUgbG93ZXIgQ2kgcGFydApgYGB7cn0KbG93X0FDIDwtIHJlYWQuY3N2KCJ+L0Rlc2t0b3AvRGF0YS9BY2lEYXRhV1RUcnVuY2F0ZS5jc3YiKQpWaWV3KGxvd19BQykKI3Bsb3QgYSBzY2F0dGVycGxvdApwbG90KENpIH4gQSwgZGF0YSA9IGxvd19BQykKI2Fzc3VtZSBsaW5lYXJsaXR5IAojYSBmdW5jdGlvbiBmb3IgcGxvdHRpbmcgbGluZWFyIHJlZ3Jlc3Npb24gcmVzdWx0CmdncGxvdFJlZ3Jlc3Npb24gPC0gZnVuY3Rpb24gKGZpdCkgewogICAgCiAgICByZXF1aXJlKGdncGxvdDIpCiAgICAKICAgIGdncGxvdChmaXQkbW9kZWwsIGFlc19zdHJpbmcoeCA9IG5hbWVzKGZpdCRtb2RlbClbMl0sIHkgPSBuYW1lcyhmaXQkbW9kZWwpWzFdKSkgKyAKICAgICAgICBnZW9tX3BvaW50KCkgKwogICAgICAgIHN0YXRfc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbCA9ICJyZWQiKSArCiAgICAgICAgbGFicyh0aXRsZSA9IHBhc3RlKCJBZGogUjIgPSAiLHNpZ25pZihzdW1tYXJ5KGZpdCkkYWRqLnIuc3F1YXJlZCwgNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcmNlcHQgPSIsc2lnbmlmKGZpdCRjb2VmW1sxXV0sNSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiIFNsb3BlID0iLHNpZ25pZihmaXQkY29lZltbMl1dLCA1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBQID0iLHNpZ25pZihzdW1tYXJ5KGZpdCkkY29lZlsyLDRdLCA1KSkpCn0KZ2dwbG90UmVncmVzc2lvbihsbShDaSB+IEEsIGRhdGEgPSBsb3dfQUMpKSArIHhsYWIoIkNPMiBjb25jZW50cmF0aW9uIChwcG0pIikgKyB5bGFiKCJwaG90b3N5bnRoZXRpYyBhY3Rpdml0eSAodW1vbCBDTzIgTV4tMiBzXi0xKSIpCiNsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcwpBQ19sbTEgPC0gbG0oQSB+IENpLCBkYXRhID0gbG93X0FDKQpzdW1tYXJ5KEFDX2xtMSkKI3Rlc3QgdGhlIG5vcm1hbGl0eSBvZiB0aGUgZGF0YQpwbG90KEFDX2xtMSkKI3RoZSBkYXRhIGluIGdlbmVyYWwgaXMgbm9yYW1sbHkgZGlzdHJpYnV0ZWQsIHRob3VnaCBwb2ludCAxMCBhcHBlYXJzIHRvIGJlIGFuIG91dGxpZXIgYW5kIG91dCBvZiBjb29rJ3MgZGlzdG5hY2UKI21ha2UgcHJlZGljdGlvbiAKcHJlZGljdGlvbiA8LSBwcmVkaWN0KEFDX2xtMSkKcGxvdChBIH4gQ2ksIGRhdGEgPSBsb3dfQUMpCmxpbmVzKGxvd19BQyRDaSxwcmVkaWN0aW9uKQpgYGAKQ29uY2x1c2lvbjogQnkgbG9va2luZyBhdCB0aGUgUS1RIHBsb3QsIHRoZSBkYXRhIHBvaW50cyBkbyBub3QgcmVzZW1ibGUgYW4gIlMgc2hhcGUiIGFuZCB0aGVyZWZvcmUgYXJlIG5vcmFtbGx5IGRpc3RyaWJ1dGVkLiBCeSBsb29raW5nIGF0IHRoZSBSIHNxdWFyZSB2YWx1ZSAoUl4yID0gMC45OTgpLCB3ZSBjYW4gdGVsbCB0aGF0IHRoZSBsaW5lYXJpdHkgYXNzdW1wdGlvbiBpcyBtZXQuIApDTzIgY29uY2VudHJhdGlvbiBpcyBzdHJvbmdseSBwb3NpdGl2ZWx5IGNvcnJlbGF0ZWQgdG8gdGhlIHBob3Rvc3ludGhldGljIGFjdGl2aXR5IChsaW5lYXIgcmVncmVzc2lvbiwgUl4yID0gMC45OTgsIHAgPCAwLjAwMSkKVGhlIHBob3Rvc3ludGhldGljIGFjdGl2aXR5IChBKSBjb3VsZCBiZSBwcmVkaWN0ZWQgZnJvbSBDTzIgY29uY2VudHJhdGlvbiAoQ2kpIHZpYSBBID0gLTMuMzMgKyAwLjA2ODYgQ2kgKFJeMiA9IDAuOTk4KQpDTzIgY29uY2VudHJhdGlvbiBpcyBhIHNpZ25pZmljYW50IHByZWRpY3RvciBvZiBwaG90b3N5bnRoZXRpYyBhY3Rpdml0eSAocCA8IDAuMDAxLCBGKDEsNSkgPSAzMDU2KQoKQS1DaSBmb3IgYWxsIDMgZ3JvdXBzIG9mIHRoZSBwbGFudHMKYGBge3J9CiNsb2FkIHBhY2thZ2UgCmxpYnJhcnkoTUFTUykKI2ltcG9ydCB0aGUgZmlsZXMKZnVsbF9hY2kgPC0gcmVhZC5jc3YoIn4vRGVza3RvcC9EYXRhL0FjaURhdGFGdWxsLmNzdiIpClZpZXcoZnVsbF9hY2kpCgoKI3Zpc3VhbGlzZSB0aGUgZGF0YQpwIDwtIGdncGxvdChmdWxsX2FjaSxhZXMoZnVsbF9hY2kkQ2ksZnVsbF9hY2kkQSkpICsgZ2VvbV9wb2ludChhZXMoY29sb3VyPUdyb3VwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbG91cj1Hcm91cCkpICsgeGxhYigiQ08yIGNvbmNlbnRyYXRpb24gKHBwbSkiKSArIHlsYWIoInBob3Rvc3ludGhldGljIGFjdGl2aXR5KENPMiBtXi0yIHNeLTEpIikgKyBsYWJzKGNvbCA9ICJHZW5vdHlwZSIpCnAKI2Zyb20gbG9va2luZyBhdCB0aGUgZ3JhcGgsIHdoaWNoIGFwcGVhcnMgbm9uLWxpbmVhciwgYSBzdWJzZXQgb2YgPDMwMHBwbSBpcyBzZWxlY3RlZApzdWJzZXRfYWNpIDwtIGZ1bGxfYWNpW2Z1bGxfYWNpWywgMV0gPCAzMDAsIF0KVmlldyhzdWJzZXRfYWNpKQojdmlzdWFsaXNlIHRoZSBkYXRhIGFnYWluCnAgPC0gZ2dwbG90KHN1YnNldF9hY2ksYWVzKHN1YnNldF9hY2kkQ2ksc3Vic2V0X2FjaSRBKSkgKyBnZW9tX3BvaW50KGFlcyhjb2xvdXI9R3JvdXApKSArIGdlb21fbGluZShhZXMoY29sb3VyPUdyb3VwKSkgKyB4bGFiKCJDTzIgY29uY2VudHJhdGlvbiAocHBtKSIpICsgeWxhYigicGhvdG9zeW50aGV0aWMgYWN0aXZpdHkoQ08yIG1eLTIgc14tMSkiKSArIGxhYnMoY29sID0gIkdlbm90eXBlIikKcAoKI2ZpdCBhIGxpbmVhciBtb2RlbCAKYWNpX2xtNCA8LSBsbShBIH4gQ2kgKyBHcm91cCArIENpOkdyb3VwLCBkYXRhID0gc3Vic2V0X2FjaSkKc3VtbWFyeShhY2lfbG00KQpBbm92YShhY2lfbG00KQpwbG90KGFjaV9sbTQpCiN3ZSBjYW4gc2VlIGZyb20gdGhlIGxpbmVhciBtb2RlbCB0aGF0IGJlY2F1c2UgdGhlIFItc3F1YXJlZCB2YWx1ZSBpcyAwLjk5NzcsIHRoZXJlZm9yZSB0aGUgZGF0YSBoYXMgYSBsaW5lYXIgcmVsYXRpb25zaGlwLCB0aGVyZWZvcmUgdGhlIGxpbmVhcml0eSBhc3N1bXB0aW9uIGlzIG1ldC4gCiNieSBsb29raW5nIGF0IHRoZSBub3JtYWwgUS1RIHBsb3QsIHdlIGNhbiB0ZWxsIHRoZSBkYXRhIGlzIHJvdWdobHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIHRob3VnaCBwb2ludDE0LDYgYW5kIDE2IGFwcGVhciB0byBiZSBvdXRsaWVycy4KCiN0ZXN0IHRoZSBzaWduaWZpY2FuY2Ugb2YgZmFjdG9ycwphY2lfbG0gPC0gbG0oQSB+IENpICsgR3JvdXAsIGRhdGEgPSBzdWJzZXRfYWNpKQphY2lfbG0zIDwtIGxtKEEgfiBDaSAqIEdyb3VwLCBkYXRhID0gc3Vic2V0X2FjaSkKYW5vdmEoYWNpX2xtLGFjaV9sbTMsdGVzdD0iRiIpCiN0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBnZW5vdHlwZSAoR3JvdXApIGFuZCBDTzIgY29uY2VudHJhdGlvbiBmYWN0b3IgKENpKSBpcyBzaWduaWZpY2FudCwgKEYoMiwxNCkgPSAyODUuNDEsIHAgPCAwLjAwMSkKI1VzZSBsaW5lYXIgbW9kZWwgdG8gdGVzdCBjb3JyZWxhdGlvbnMgYW1vbmcgQWNpLCBDTzIgYW5kIGdlbm90eXBlCmFjaV9sbSA8LSBsbShBIH4gQ2kgKyBHcm91cCwgZGF0YSA9IHN1YnNldF9hY2kpCmFjaV9sbTEgPC0gbG0oQSB+IENpLCBkYXRhID0gc3Vic2V0X2FjaSkKYW5vdmEoYWNpX2xtMSxhY2lfbG0sdGVzdD0iRiIpCiNnZW5vdHlwZSBmYWN0b3IgKEdyb3VwKSBpcyBzaWduaWZpY2FudCwgKEYoMiwxNCkgPSAxNC41ODYsIHAgPCAwLjAwMSkKYWNpX2xtIDwtIGxtKEEgfiBDaSArIEdyb3VwLCBkYXRhID0gc3Vic2V0X2FjaSkKYWNpX2xtMiA8LSBsbShBIH4gR3JvdXAsIGRhdGEgPSBzdWJzZXRfYWNpKQphbm92YShhY2lfbG0yLGFjaV9sbSx0ZXN0PSJGIikKI0NPMiBjb25jZW50cmF0aW9uIGZhY3RvciAoQ2kpIGlzIHNpZ25pZmljYW50LCAoRigyLDE0KSA9IDc2LjcyOSwgcCA8IDAuMDAxKQoKI2JhY2t3YXJkIHN0ZXB3aXNlIGVsaW1pbmF0aW9uIAphY2lfZ2xtIDwtIGdsbShBIH4gQ2kgKiBHcm91cCwgZGF0YSA9IHN1YnNldF9hY2kpCnN1bW1hcnkoYWNpX2dsbSkKQW5vdmEoYWNpX2dsbSkKI25vIGZhY3RvciBjYW4gYmUgZHJvcHBlZCAKYGBgCmNvbmNsdXNpb246IApCeSBsb29raW5nIGF0IHRoZSBjb3JyZWxhdGlvbiBwbG90IGZvciB0aGUgZnVsbCBkYXRhc2V0LCB3ZSBjYW4gc2VlIHdoZW4gQ08yIGNvbmNlbnRyYXRpb24gaXMgbGFyZ2VyIHRoYW4gMzAwIHBwbSwgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gQ08yIGNvbmNlbnRyYXRpb24gYW5kIHBob3Rvc3ludGhldGljIGFjdGl2aXR5IGlzIG5vIGxvbmdlciBsaW5lYXIuIFRoZXJlZm9yZSBhIHN1YnNldCBvZiA8IDMwMCBwcG0gaXMgY2hvc2VuLCB3aGljaCBpcyBsaW5lYXIsIGFzIHNob3duIGJ5IHRoZSBuZXcgcGxvdCBJIHByb2R1Y2VkLiBUaGlzIGlzIGNvbmZyaW1lZCBieSB0aGUgUi1zcXVhcmVkIHZhbHVlIG9mIDAuOTk3NyBpbiB0aGUgbGluZWFyIG1vZGVsIApQaG90b3N5bnRoZXRpYyBhY3Rpdml0eSBpbmNyZWFzZXMgd2l0aCBDTzIgY29uY2VudHJhdGlvbiAoZGYgPTEsIHAgPCAwLjAwMSksIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIENPMiBjb25jZW50cmF0aW9uIGFuZCBhbHNvIGRlcGVuZHMgb24gdGhlIGdlbm90eXBlcywgd2hlcmUgcGhvdG9zeW50aGVpdGMgYWN0aXZpdHkgb2Ygd3QgPiBzc3UxID4gc3N1MiwgIChkZiA9MiwgcCA8IDAuMDAxKQpQaG90b3N5bnRoZXRpYyBhY3Rpdml0eShBKSBjb3VsZCBiZSBwcmVkaWN0ZWQgYnkgQ08yIGNvbmNlbnRyYXRpb24oQ2kpLCBnZW5vdHlwZXMoR3JvdXApIGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcy4gQSA9IC0zLjQzICsgMC4wNTExIENpICsgMi4xMSBzc3UyICsgMC4xMDQgd3QgLSAwLjAzNzIgQ2k6c3N1MiArIDAuMDE3NSBDaTp3dCAKCg==