pacckages

if(!require(googlesheets4)){install.packages("googlesheets4")}
if(!require(AICcmodavg)){install.packages("AICcmodavg")}
if(!require(ggplot2)){install.packages("ggplot2")}
#
library(googlesheets4); gs4_deauth()
library(AICcmodavg)
library(ggplot2)

GLM

## Sitio ####
m.sitio <- glm( pres.roe ~ sitio, family= binomial, data=roe)
summary(m.sitio)

Call:
glm(formula = pres.roe ~ sitio, family = binomial, data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.0466  -0.8968  -0.6905   1.3141   1.7610  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -0.7033     0.1747  -4.026 5.66e-05 ***
sitioB        0.3874     0.2827   1.371   0.1705    
sitioC       -0.6089     0.2584  -2.356   0.0185 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 471.49  on 393  degrees of freedom
AIC: 477.49

Number of Fisher Scoring iterations: 4
#### pres.ROe ~ BUILDING  ####
# piso
m.piso <- glm( pres.roe ~ piso, family= binomial, data=roe)  ### piso
summary(m.piso)

Call:
glm(formula = pres.roe ~ piso, family = binomial, data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.8908  -0.8908  -0.8270   1.4942   1.6942  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)   
(Intercept)   -1.1632     0.3623  -3.211  0.00132 **
pisoConcrete   0.2659     0.3973   0.669  0.50326   
pisoDirt       0.4436     0.3972   1.117  0.26416   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 482.64  on 393  degrees of freedom
AIC: 488.64

Number of Fisher Scoring iterations: 4
# pared
m.pared <- glm( pres.roe ~ pared, family= binomial, data=roe) ### pared
summary(m.pared)

Call:
glm(formula = pres.roe ~ pared, family = binomial, data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.0415  -0.8582  -0.7409   1.4053   1.8930  

Coefficients:
                Estimate Std. Error z value Pr(>|z|)    
(Intercept)      -0.8091     0.1539  -5.257 1.47e-07 ***
paredadobe        0.4806     0.3453   1.392   0.1640    
paredWood-Cane   -0.3436     0.3652  -0.941   0.3468    
paredWood_other  -0.8003     0.3963  -2.020   0.0434 *  
paredzinc_other   0.2878     0.3280   0.878   0.3802    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 474.14  on 391  degrees of freedom
AIC: 484.14

Number of Fisher Scoring iterations: 4
# techo
m.techo <- glm( pres.roe ~ techo, family= binomial, data=roe) ### techo
summary(m.techo)

Call:
glm(formula = pres.roe ~ techo, family = binomial, data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9508  -0.8424  -0.8424   1.5546   1.5546  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)
(Intercept)  -0.5596     0.6268  -0.893    0.372
techozinc    -0.2939     0.6366  -0.462    0.644

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 483.94  on 394  degrees of freedom
AIC: 487.94

Number of Fisher Scoring iterations: 4
# restos de alimento
m.rest.alim <- glm( pres.roe ~ rest.alim, family= binomial, data=roe)   ### rest.alim
summary(m.rest.alim)

Call:
glm(formula = pres.roe ~ rest.alim, family = binomial, data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9127  -0.8246  -0.8246   1.4676   1.5774  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)   
(Intercept)  -0.6604     0.2212  -2.985  0.00283 **
rest.alimSi  -0.2438     0.2566  -0.950  0.34206   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 463.54  on 378  degrees of freedom
Residual deviance: 462.65  on 377  degrees of freedom
  (17 observations deleted due to missingness)
AIC: 466.65

Number of Fisher Scoring iterations: 4
m.house <- glm( pres.roe ~ piso + pared + rest.alim + roe$techo, family= binomial, data=roe)
summary(m.house)

Call:
glm(formula = pres.roe ~ piso + pared + rest.alim + roe$techo, 
    family = binomial, data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.1838  -0.9037  -0.7275   1.3689   1.9550  

Coefficients:
                Estimate Std. Error z value Pr(>|z|)  
(Intercept)      -0.8620     0.7357  -1.172   0.2413  
pisoConcrete      0.4638     0.4214   1.101   0.2710  
pisoDirt          0.7126     0.4599   1.550   0.1213  
paredadobe        0.3029     0.3898   0.777   0.4371  
paredWood-Cane   -0.6199     0.4578  -1.354   0.1757  
paredWood_other  -0.9278     0.4313  -2.151   0.0315 *
paredzinc_other  -0.0077     0.3763  -0.020   0.9837  
rest.alimSi      -0.1385     0.2675  -0.518   0.6047  
roe$techozinc    -0.2864     0.6562  -0.436   0.6625  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 463.54  on 378  degrees of freedom
Residual deviance: 451.04  on 370  degrees of freedom
  (17 observations deleted due to missingness)
AIC: 469.04

Number of Fisher Scoring iterations: 4
### pres.roe ~ DOMESTIC_ANIMAL ####

m.cat <- glm( pres.roe ~ pres.cat, family= binomial, data=roe)    ### gatos
summary(m.cat)

Call:
glm(formula = pres.roe ~ pres.cat, family = binomial, data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.0406  -1.0406  -0.5367   1.3206   2.0044  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -0.3306     0.1331  -2.483    0.013 *  
pres.cat     -1.5342     0.2650  -5.790 7.04e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 444.66  on 394  degrees of freedom
AIC: 448.66

Number of Fisher Scoring iterations: 4
m.dog <- glm( pres.roe ~ pres.dog, family= binomial, data=roe)    ### perros
summary(m.dog)

Call:
glm(formula = pres.roe ~ pres.dog, family = binomial, data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.9282  -0.8088  -0.8088   1.4490   1.5979  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)   
(Intercept)  -0.6190     0.1914  -3.234  0.00122 **
pres.dog     -0.3305     0.2338  -1.414  0.15745   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 482.17  on 394  degrees of freedom
AIC: 486.17

Number of Fisher Scoring iterations: 4
m.dom.anim <- glm( pres.roe ~ pres.dog * pres.cat, family= binomial, data=roe)
summary(m.dom.anim)

Call:
glm(formula = pres.roe ~ pres.dog * pres.cat, family = binomial, 
    data = roe)

Deviance Residuals: 
   Min      1Q  Median      3Q     Max  
-1.066  -1.025  -0.553   1.293   2.146  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)   
(Intercept)        -0.2683     0.2127  -1.261  0.20726   
pres.dog           -0.1021     0.2728  -0.374  0.70813   
pres.cat           -1.9290     0.6446  -2.992  0.00277 **
pres.dog:pres.cat   0.4988     0.7114   0.701  0.48315   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 444.13  on 392  degrees of freedom
AIC: 452.13

Number of Fisher Scoring iterations: 4
### combinaciones ####
m.pared.cat <- glm( pres.roe ~ pared + pres.cat        , family= binomial, data=roe)
summary(m.pared.cat)

Call:
glm(formula = pres.roe ~ pared + pres.cat, family = binomial, 
    data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.1740  -1.0341  -0.5521   1.2363   2.2317  

Coefficients:
                Estimate Std. Error z value Pr(>|z|)    
(Intercept)     -0.34679    0.17338  -2.000   0.0455 *  
paredadobe       0.33872    0.35988   0.941   0.3466    
paredWood-Cane  -0.09434    0.38499  -0.245   0.8064    
paredWood_other -0.59978    0.41179  -1.457   0.1453    
paredzinc_other  0.20941    0.34239   0.612   0.5408    
pres.cat        -1.45707    0.26913  -5.414 6.16e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 440.31  on 390  degrees of freedom
AIC: 452.31

Number of Fisher Scoring iterations: 4
#
m.pared.sitio <- glm( pres.roe ~ pared +            sitio, family= binomial, data=roe)
summary(m.pared.sitio)

Call:
glm(formula = pres.roe ~ pared + sitio, family = binomial, data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.1512  -0.8797  -0.7207   1.3197   1.9334  

Coefficients:
                Estimate Std. Error z value Pr(>|z|)    
(Intercept)     -0.74987    0.20954  -3.579 0.000345 ***
paredadobe      -0.01518    0.44640  -0.034 0.972875    
paredWood-Cane  -0.02271    0.41078  -0.055 0.955916    
paredWood_other -0.50866    0.42207  -1.205 0.228140    
paredzinc_other  0.25143    0.34591   0.727 0.467314    
sitioB           0.43655    0.37779   1.156 0.247871    
sitioC          -0.44299    0.31267  -1.417 0.156536    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 469.07  on 389  degrees of freedom
AIC: 483.07

Number of Fisher Scoring iterations: 4
#
m.cat.sitio <- glm( pres.roe ~         + pres.cat + sitio, family= binomial, data=roe)
summary(m.cat.sitio)

Call:
glm(formula = pres.roe ~ +pres.cat + sitio, family = binomial, 
    data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.1685  -0.9390  -0.5017   1.1864   2.0663  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -0.3632     0.1873  -1.939   0.0525 .  
pres.cat     -1.4184     0.2753  -5.151 2.59e-07 ***
sitioB        0.3421     0.2929   1.168   0.2428    
sitioC       -0.2273     0.2762  -0.823   0.4105    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 441.33  on 392  degrees of freedom
AIC: 449.33

Number of Fisher Scoring iterations: 4
### MODELO GLOBAL ####
global <- glm( pres.roe ~ pared + pres.cat + sitio, family= binomial, data=roe)
summary(global)

Call:
glm(formula = pres.roe ~ pared + pres.cat + sitio, family = binomial, 
    data = roe)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.1712  -0.9846  -0.5302   1.1925   2.2263  

Coefficients:
                Estimate Std. Error z value Pr(>|z|)    
(Intercept)     -0.41783    0.22311  -1.873   0.0611 .  
paredadobe       0.02078    0.46202   0.045   0.9641    
paredWood-Cane  -0.02297    0.42824  -0.054   0.9572    
paredWood_other -0.49926    0.43769  -1.141   0.2540    
paredzinc_other  0.26597    0.36019   0.738   0.4603    
pres.cat        -1.41924    0.27629  -5.137 2.79e-07 ***
sitioB           0.38238    0.39197   0.976   0.3293    
sitioC          -0.05416    0.33325  -0.163   0.8709    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 484.14  on 395  degrees of freedom
Residual deviance: 439.10  on 388  degrees of freedom
AIC: 455.1

Number of Fisher Scoring iterations: 4
  

AIC, AICc, Wi

## models

n.= length(roe$pres.roe)
## extracting AICc
extractAIC(global)[2]
[1] 455.0989
k=AICc(global, return.K = TRUE)
AICc.global <- extractAIC(global)[2] + (((2*k)*(k+1))/(n.-k-1))
k1=AICc(global, return.K = TRUE)

extractAIC(m.cat)[2]
[1] 448.6635
k=AICc(m.cat, return.K = TRUE)
AICc.m.cat <- extractAIC(m.cat)[2] + (((2*k)*(k+1))/(n.-k-1))
k2=AICc(m.cat, return.K = TRUE)

extractAIC(m.pared)[2]
[1] 484.1374
k=AICc(m.pared, return.K = TRUE)
AICc.m.pared <- extractAIC(m.pared)[2] + (((2*k)*(k+1))/(n.-k-1))
k3=AICc(m.pared, return.K = TRUE)

extractAIC(m.sitio)[2]
[1] 477.4893
k=AICc(m.sitio, return.K = TRUE)
AICc.m.sitio <- extractAIC(m.sitio)[2] + (((2*k)*(k+1))/(n.-k-1))
k4=AICc(m.sitio, return.K = TRUE)

extractAIC(m.pared.cat)[2]
[1] 452.3076
k=AICc(m.pared.cat, return.K = TRUE)
AICc.m.pared.cat <- extractAIC(m.pared.cat)[2] + (((2*k)*(k+1))/(n.-k-1))
k5=AICc(m.pared.cat, return.K = TRUE)

extractAIC(m.pared.sitio)[2]
[1] 483.0708
k=AICc(m.pared.sitio, return.K = TRUE)
AICc.m.pared.sitio <- extractAIC(m.pared.sitio)[2] + (((2*k)*(k+1))/(n.-k-1))
k6=AICc(m.pared.sitio, return.K = TRUE)

extractAIC(m.cat.sitio)[2]
[1] 449.3316
k=AICc(m.cat.sitio, return.K = TRUE)
AICc.m.cat.sitio <- extractAIC(m.cat.sitio)[2] + (((2*k)*(k+1))/(n.-k-1))
k7=AICc(m.cat.sitio, return.K = TRUE)

########## AIC table #####
aics<- data.frame(paste("m",c("Global", "Gato", "Pared", "Sitio", "pared.gato", "pared.sitio", "gato.sitio"),sep=""),
                  c(AICc.global,AICc.m.cat,AICc.m.pared, AICc.m.sitio, AICc.m.pared.cat, AICc.m.pared.sitio, AICc.m.cat.sitio),
                  c(k1,k2,k3,k4,k5,k6,k7),
                  row.names=NULL) 
colnames(aics) <- c("model","AICc", "k") 
# sort according to AIC
aics<-aics[order(aics$AICc),] 

wi (weights)

for(i in 1:dim(aics)[1]){
  aics$deltaAIC[i]<-aics$AICc[1]-aics$AICc[i]}
wi<-exp(aics$deltaAIC/2)
wi <- wi/sum(wi)
aics$wi <- round(wi/sum(wi), 3)
aics

Delta AICs. Cuánto “pierde” en ajuste (AICc) el modelo completo Gato+Pared+Sitio sacando (ó incluyendo) cada factor?

Deviance Gain Method [ loss of GOF]

###
global$formula; AICc(global)      ###### GATO + PARED 
pres.roe ~ pared + pres.cat + sitio
[1] 455.471
##########################  Contribution
m.pared.sitio$formula; AICc(m.pared.sitio); AICc(global) - AICc(m.pared.sitio)   ### 'GATO' contribution
pres.roe ~ pared + sitio
[1] 483.3595
[1] -27.88845
m.cat.sitio$formula; AICc(m.cat.sitio); AICc(global)- AICc(m.cat.sitio)          ### 'Pared' contribution
pres.roe ~ +pres.cat + sitio
[1] 449.4339
[1] 6.037145
m.pared.cat$formula; AICc(m.pared.cat); AICc(global)- AICc(m.pared.cat)          ### 'Sitio' contribution
pres.roe ~ pared + pres.cat
[1] 452.5235
[1] 2.947494
#
DeltaAics <- as.data.frame(cbind("Model"= c("global","Gato", "Pared", "Sitio"),
      "Delta.AIC"= c(0,AICc(global) - AICc(m.pared.sitio), AICc(global)- AICc(m.cat.sitio),AICc(global)- AICc(m.pared.cat))))

DeltaAics$Delta.AIC <- as.numeric(DeltaAics$Delta.AIC)
DeltaAics$Delta.AIC <- round(DeltaAics$Delta.AIC,2)
DeltaAics

El incluir pared y Sitio de hecho hace que el modelo empeore (aumenta el AICc)

LS0tDQp0aXRsZTogInJvZV9wcmVzIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KKioqcGFjY2thZ2VzKioqDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KaWYoIXJlcXVpcmUoZ29vZ2xlc2hlZXRzNCkpe2luc3RhbGwucGFja2FnZXMoImdvb2dsZXNoZWV0czQiKX0NCmlmKCFyZXF1aXJlKEFJQ2Ntb2RhdmcpKXtpbnN0YWxsLnBhY2thZ2VzKCJBSUNjbW9kYXZnIil9DQppZighcmVxdWlyZShnZ3Bsb3QyKSl7aW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpfQ0KIw0KbGlicmFyeShnb29nbGVzaGVldHM0KTsgZ3M0X2RlYXV0aCgpDQpsaWJyYXJ5KEFJQ2Ntb2RhdmcpDQpsaWJyYXJ5KGdncGxvdDIpDQpgYGAgIA0KDQojIyMjIGJhc2UgZGUgZGF0b3MgW2xpbmtdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFmQklCVXBwOGdDd1BJeW9fSHIxd1BYc2hQRElXWFlIckRYWS1VY0YtczdJL2VkaXQ/dXNwPXNoYXJpbmcpIA0KYGBge3J9DQpzaGVldD0iZmFjdG9yaWVzZ28iDQpyYW5nZT0iQjQ6SjQwMCINCnJvZSA8LSByZWFkX3NoZWV0KCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xZkJJQlVwcDhnQ3dQSXlvX0hyMXdQWHNoUERJV1hZSHJEWFktVWNGLXM3SS9lZGl0P3VzcD1zaGFyaW5nIiwNCiAgICAgICAgICAgICAgICAgIGNvbF9uYW1lcyA9IFRSVUUsDQogICAgICAgICAgICAgICAgICBzaGVldD1zaGVldCwNCiAgICAgICAgICAgICAgICAgIHJhbmdlPXJhbmdlLA0KICAgICAgICAgICAgICAgICAgY29sX3R5cGVzID0gTlVMTCwNCiAgICAgICAgICAgICAgICAgIG5hPSAiTkEiKQ0KZGltKHJvZSkNCmhlYWQocm9lKQ0KYGBgICANCg0KIyMjIyMgRXhwbG9yZSBkYXRhDQpgYGB7cn0NCnJvZSRwaXNvIDwtIGFzLmZhY3Rvcihyb2UkcGlzbykNCnJvZSRwYXJlZCA8LSBhcy5mYWN0b3Iocm9lJHBhcmVkKQ0Kcm9lJHJlc3QuYWxpbSA8LSBhcy5mYWN0b3Iocm9lJHJlc3QuYWxpbSkNCnJvZSRyZXN0LmFsaW0uRiA8LSBhcy5mYWN0b3Iocm9lJHJlc3QuYWxpbSkNCnJvZSR0ZWNobyA8LSBhcy5mYWN0b3Iocm9lJHRlY2hvKQ0Kcm9lJHNpdGlvIDwtIGFzLmZhY3Rvcihyb2Ukc2l0aW8pDQpyb2UkcHJlcy5yb2UuRiA8LSBhcy5mYWN0b3Iocm9lJHByZXMucm9lKQ0Kcm9lJHByZXMuZG9nLkYgPC0gYXMuZmFjdG9yKHJvZSRwcmVzLmRvZykNCnJvZSRwcmVzLmNhdC5GIDwtIGFzLmZhY3Rvcihyb2UkcHJlcy5jYXQpDQojDQpkaW0ocm9lKQ0KbmFtZXMocm9lKQ0Kc3VtbWFyeShyb2UpDQpgYGAgIA0KDQojIyMjIyBQbG90X2V4cGxvcmUNCg0KYGBge3J9DQojIyBQTE9UIFNpdGlvICMjIyMNCmdncGxvdChhZXMoeD0gc2l0aW8sIHk9IGFzLmZhY3RvcihwcmVzLnJvZSkgLCANCiAgICAgICAgICAgZmlsbD0gYXMuZmFjdG9yKHByZXMucm9lKSApLCBkYXRhPSByb2UgKSArDQogIGdlb21fY29sKCkgDQoNCmdncGxvdChhZXMoeD0gc2l0aW8sIHk9IGFzLmZhY3RvcihwcmVzLnJvZSkgLCBmaWxsPSBhcy5mYWN0b3IocHJlcy5yb2UpICksIA0KICAgICAgIGRhdGE9IHJvZSApICsgDQogIGdlb21fcG9pbnQoc2l6ZT0gMC41LCAgcG9zaXRpb249IHBvc2l0aW9uX2ppdHRlcih3aWR0aD0gMC4yICwgaGVpZ2h0ID0wLjEgKSkNCg0KIyMjIyBjaGlxcy50ZXN0DQphIDwtIGNoaXNxLnRlc3QodGFibGUocm9lJHNpdGlvLCByb2UkcHJlcy5yb2UpKTthOyBhJHN0ZHJlcw0KDQojIyBTZWfDum4gbGEgdGFibGEgZGUgdmFsb3JlcyBlc3BlcmFkb3MgZGUgbGEgQ2hpMiBhcnJpYmEsIGxvcyBzaXRpb3MgQiB5IEMgdGllbmVuIG3DoXMgeSBtZW5vcyAocmVzcGVjdGl2YW1lbnRlKSBwcm9wb3JjacOzbiBkZSBsbyAiZXNwZXJhZG8iIGJham8gdW4gbW9kZWxvIG51bG8uDQoNCiMjIFBMT1QgcmVzdG9zIGFsaW1lbnRvcyAjIyMjDQpnZ3Bsb3QoYWVzKHg9IHJlc3QuYWxpbS5GLCB5PSBhcy5mYWN0b3IocHJlcy5yb2UpICwgDQogICAgICAgICAgIGZpbGw9IGFzLmZhY3RvcihwcmVzLnJvZSkgKSwgZGF0YT0gcm9lICkgKw0KICBnZW9tX2NvbCgpIA0KDQpnZ3Bsb3QoYWVzKHg9IHJlc3QuYWxpbS5GLCB5PSBhcy5mYWN0b3IocHJlcy5yb2UpICwgZmlsbD0gYXMuZmFjdG9yKHByZXMucm9lKSApLCANCiAgICAgICBkYXRhPSByb2UgKSArIA0KICBnZW9tX3BvaW50KHNpemU9IDAuNSwgIHBvc2l0aW9uPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9IDAuMiAsIGhlaWdodCA9MC4xICkpDQoNCiMjICBQTE9UIHBpc28gICAgIyMjIw0KDQpnZ3Bsb3QoYWVzKHg9IHBpc28sIHk9IGFzLmZhY3RvcihwcmVzLnJvZSkgLCANCiAgICAgICAgICAgZmlsbD0gYXMuZmFjdG9yKHByZXMucm9lKSApLCBkYXRhPSByb2UgKSArDQogIGdlb21fY29sKCkgDQoNCmdncGxvdChhZXMoeD0gcGlzbywgeT0gYXMuZmFjdG9yKHByZXMucm9lKSAsIGZpbGw9IGFzLmZhY3RvcihwcmVzLnJvZSkgKSwgDQogICAgICAgZGF0YT0gcm9lICkgKyANCiAgZ2VvbV9wb2ludChzaXplPSAwLjUsICBwb3NpdGlvbj0gcG9zaXRpb25faml0dGVyKHdpZHRoPSAwLjIgLCBoZWlnaHQgPTAuMSApKQ0KDQojIyBQTE9UIHBhcmVkICMjIyMNCg0KZ2dwbG90KGFlcyh4PSBwYXJlZCwgeT0gYXMuZmFjdG9yKHByZXMucm9lKSAsIA0KICAgICAgICAgICBmaWxsPSBhcy5mYWN0b3IocHJlcy5yb2UpICksIGRhdGE9IHJvZSApICsNCiAgZ2VvbV9jb2woKSANCg0KZ2dwbG90KGFlcyh4PSBwYXJlZCwgeT0gYXMuZmFjdG9yKHByZXMucm9lKSAsIGZpbGw9IGFzLmZhY3RvcihwcmVzLnJvZSkgKSwgDQogICAgICAgZGF0YT0gcm9lICkgKyANCiAgZ2VvbV9wb2ludChzaXplPSAwLjUsICBwb3NpdGlvbj0gcG9zaXRpb25faml0dGVyKHdpZHRoPSAwLjIgLCBoZWlnaHQgPTAuMSApKQ0KDQojIGNoaXFzLnRlc3QNCmEgPC0gY2hpc3EudGVzdCh0YWJsZShyb2UkcGFyZWQsIHJvZSRwcmVzLnJvZSkpO2E7IGEkc3RkcmVzDQoNCiMjIFBMT1QgdGVjaG8gIyMjIw0KDQpnZ3Bsb3QoYWVzKHg9IHRlY2hvLCB5PSBhcy5mYWN0b3IocHJlcy5yb2UpICwgDQogICAgICAgICAgIGZpbGw9IGFzLmZhY3RvcihwcmVzLnJvZSkgKSwgZGF0YT0gcm9lICkgKw0KICBnZW9tX2NvbCgpIA0KDQpnZ3Bsb3QoYWVzKHg9IHRlY2hvLCB5PSBhcy5mYWN0b3IocHJlcy5yb2UpICwgZmlsbD0gYXMuZmFjdG9yKHByZXMucm9lKSApLCANCiAgICAgICBkYXRhPSByb2UgKSArIA0KICBnZW9tX3BvaW50KHNpemU9IDAuNSwgIHBvc2l0aW9uPSBwb3NpdGlvbl9qaXR0ZXIod2lkdGg9IDAuMiAsIGhlaWdodCA9MC4xICkpDQpgYGAgIA0KDQpgYGB7cn0NCiMjIyMgQXNvY2lhY2lbb24gZW50cmUgbGEgcHJlc2VuY2lhIGRlIGdhdG9zIHkgZWwgc2l0aW8gDQphIDwtIGNoaXNxLnRlc3QodGFibGUocm9lJHNpdGlvLCByb2UkcHJlcy5jYXQpKTsgYQ0KYSRzdGRyZXMNCmBgYCAgDQoNCiMjIyBHTE0NCmBgYHtyIHJlc3VsdHM9VFJVRX0NCiMjIFNpdGlvICMjIyMNCm0uc2l0aW8gPC0gZ2xtKCBwcmVzLnJvZSB+IHNpdGlvLCBmYW1pbHk9IGJpbm9taWFsLCBkYXRhPXJvZSkNCnN1bW1hcnkobS5zaXRpbykNCg0KIyMjIyBwcmVzLlJPZSB+IEJVSUxESU5HICAjIyMjDQojIHBpc28NCm0ucGlzbyA8LSBnbG0oIHByZXMucm9lIH4gcGlzbywgZmFtaWx5PSBiaW5vbWlhbCwgZGF0YT1yb2UpICAjIyMgcGlzbw0Kc3VtbWFyeShtLnBpc28pDQojIHBhcmVkDQptLnBhcmVkIDwtIGdsbSggcHJlcy5yb2UgfiBwYXJlZCwgZmFtaWx5PSBiaW5vbWlhbCwgZGF0YT1yb2UpICMjIyBwYXJlZA0Kc3VtbWFyeShtLnBhcmVkKQ0KIyB0ZWNobw0KbS50ZWNobyA8LSBnbG0oIHByZXMucm9lIH4gdGVjaG8sIGZhbWlseT0gYmlub21pYWwsIGRhdGE9cm9lKSAjIyMgdGVjaG8NCnN1bW1hcnkobS50ZWNobykNCiMgcmVzdG9zIGRlIGFsaW1lbnRvDQptLnJlc3QuYWxpbSA8LSBnbG0oIHByZXMucm9lIH4gcmVzdC5hbGltLCBmYW1pbHk9IGJpbm9taWFsLCBkYXRhPXJvZSkgICAjIyMgcmVzdC5hbGltDQpzdW1tYXJ5KG0ucmVzdC5hbGltKQ0KDQptLmhvdXNlIDwtIGdsbSggcHJlcy5yb2UgfiBwaXNvICsgcGFyZWQgKyByZXN0LmFsaW0gKyByb2UkdGVjaG8sIGZhbWlseT0gYmlub21pYWwsIGRhdGE9cm9lKQ0Kc3VtbWFyeShtLmhvdXNlKQ0KDQojIyMgcHJlcy5yb2UgfiBET01FU1RJQ19BTklNQUwgIyMjIw0KDQptLmNhdCA8LSBnbG0oIHByZXMucm9lIH4gcHJlcy5jYXQsIGZhbWlseT0gYmlub21pYWwsIGRhdGE9cm9lKSAgICAjIyMgZ2F0b3MNCnN1bW1hcnkobS5jYXQpDQoNCm0uZG9nIDwtIGdsbSggcHJlcy5yb2UgfiBwcmVzLmRvZywgZmFtaWx5PSBiaW5vbWlhbCwgZGF0YT1yb2UpICAgICMjIyBwZXJyb3MNCnN1bW1hcnkobS5kb2cpDQoNCm0uZG9tLmFuaW0gPC0gZ2xtKCBwcmVzLnJvZSB+IHByZXMuZG9nICogcHJlcy5jYXQsIGZhbWlseT0gYmlub21pYWwsIGRhdGE9cm9lKQ0Kc3VtbWFyeShtLmRvbS5hbmltKQ0KDQojIyMgY29tYmluYWNpb25lcyAjIyMjDQptLnBhcmVkLmNhdCA8LSBnbG0oIHByZXMucm9lIH4gcGFyZWQgKyBwcmVzLmNhdCAgICAgICAgLCBmYW1pbHk9IGJpbm9taWFsLCBkYXRhPXJvZSkNCnN1bW1hcnkobS5wYXJlZC5jYXQpDQojDQptLnBhcmVkLnNpdGlvIDwtIGdsbSggcHJlcy5yb2UgfiBwYXJlZCArICAgICAgICAgICAgc2l0aW8sIGZhbWlseT0gYmlub21pYWwsIGRhdGE9cm9lKQ0Kc3VtbWFyeShtLnBhcmVkLnNpdGlvKQ0KIw0KbS5jYXQuc2l0aW8gPC0gZ2xtKCBwcmVzLnJvZSB+ICAgICAgICAgKyBwcmVzLmNhdCArIHNpdGlvLCBmYW1pbHk9IGJpbm9taWFsLCBkYXRhPXJvZSkNCnN1bW1hcnkobS5jYXQuc2l0aW8pDQoNCiMjIyBNT0RFTE8gR0xPQkFMICMjIyMNCmdsb2JhbCA8LSBnbG0oIHByZXMucm9lIH4gcGFyZWQgKyBwcmVzLmNhdCArIHNpdGlvLCBmYW1pbHk9IGJpbm9taWFsLCBkYXRhPXJvZSkNCnN1bW1hcnkoZ2xvYmFsKQ0KICANCmBgYCAgDQoNCiMjIyBBSUMsIEFJQ2MsIFdpICANCmBgYHtyIHJlc3VsdHM9IFRSVUV9DQojIyBtb2RlbHMNCg0Kbi49IGxlbmd0aChyb2UkcHJlcy5yb2UpDQojIyBleHRyYWN0aW5nIEFJQ2MNCmV4dHJhY3RBSUMoZ2xvYmFsKVsyXQ0Kaz1BSUNjKGdsb2JhbCwgcmV0dXJuLksgPSBUUlVFKQ0KQUlDYy5nbG9iYWwgPC0gZXh0cmFjdEFJQyhnbG9iYWwpWzJdICsgKCgoMiprKSooaysxKSkvKG4uLWstMSkpDQprMT1BSUNjKGdsb2JhbCwgcmV0dXJuLksgPSBUUlVFKQ0KDQpleHRyYWN0QUlDKG0uY2F0KVsyXQ0Kaz1BSUNjKG0uY2F0LCByZXR1cm4uSyA9IFRSVUUpDQpBSUNjLm0uY2F0IDwtIGV4dHJhY3RBSUMobS5jYXQpWzJdICsgKCgoMiprKSooaysxKSkvKG4uLWstMSkpDQprMj1BSUNjKG0uY2F0LCByZXR1cm4uSyA9IFRSVUUpDQoNCmV4dHJhY3RBSUMobS5wYXJlZClbMl0NCms9QUlDYyhtLnBhcmVkLCByZXR1cm4uSyA9IFRSVUUpDQpBSUNjLm0ucGFyZWQgPC0gZXh0cmFjdEFJQyhtLnBhcmVkKVsyXSArICgoKDIqaykqKGsrMSkpLyhuLi1rLTEpKQ0KazM9QUlDYyhtLnBhcmVkLCByZXR1cm4uSyA9IFRSVUUpDQoNCmV4dHJhY3RBSUMobS5zaXRpbylbMl0NCms9QUlDYyhtLnNpdGlvLCByZXR1cm4uSyA9IFRSVUUpDQpBSUNjLm0uc2l0aW8gPC0gZXh0cmFjdEFJQyhtLnNpdGlvKVsyXSArICgoKDIqaykqKGsrMSkpLyhuLi1rLTEpKQ0KazQ9QUlDYyhtLnNpdGlvLCByZXR1cm4uSyA9IFRSVUUpDQoNCmV4dHJhY3RBSUMobS5wYXJlZC5jYXQpWzJdDQprPUFJQ2MobS5wYXJlZC5jYXQsIHJldHVybi5LID0gVFJVRSkNCkFJQ2MubS5wYXJlZC5jYXQgPC0gZXh0cmFjdEFJQyhtLnBhcmVkLmNhdClbMl0gKyAoKCgyKmspKihrKzEpKS8obi4tay0xKSkNCms1PUFJQ2MobS5wYXJlZC5jYXQsIHJldHVybi5LID0gVFJVRSkNCg0KZXh0cmFjdEFJQyhtLnBhcmVkLnNpdGlvKVsyXQ0Kaz1BSUNjKG0ucGFyZWQuc2l0aW8sIHJldHVybi5LID0gVFJVRSkNCkFJQ2MubS5wYXJlZC5zaXRpbyA8LSBleHRyYWN0QUlDKG0ucGFyZWQuc2l0aW8pWzJdICsgKCgoMiprKSooaysxKSkvKG4uLWstMSkpDQprNj1BSUNjKG0ucGFyZWQuc2l0aW8sIHJldHVybi5LID0gVFJVRSkNCg0KZXh0cmFjdEFJQyhtLmNhdC5zaXRpbylbMl0NCms9QUlDYyhtLmNhdC5zaXRpbywgcmV0dXJuLksgPSBUUlVFKQ0KQUlDYy5tLmNhdC5zaXRpbyA8LSBleHRyYWN0QUlDKG0uY2F0LnNpdGlvKVsyXSArICgoKDIqaykqKGsrMSkpLyhuLi1rLTEpKQ0Kazc9QUlDYyhtLmNhdC5zaXRpbywgcmV0dXJuLksgPSBUUlVFKQ0KDQojIyMjIyMjIyMjIEFJQyB0YWJsZSAjIyMjIw0KYWljczwtIGRhdGEuZnJhbWUocGFzdGUoIm0iLGMoIkdsb2JhbCIsICJHYXRvIiwgIlBhcmVkIiwgIlNpdGlvIiwgInBhcmVkLmdhdG8iLCAicGFyZWQuc2l0aW8iLCAiZ2F0by5zaXRpbyIpLHNlcD0iIiksDQogICAgICAgICAgICAgICAgICBjKEFJQ2MuZ2xvYmFsLEFJQ2MubS5jYXQsQUlDYy5tLnBhcmVkLCBBSUNjLm0uc2l0aW8sIEFJQ2MubS5wYXJlZC5jYXQsIEFJQ2MubS5wYXJlZC5zaXRpbywgQUlDYy5tLmNhdC5zaXRpbyksDQogICAgICAgICAgICAgICAgICBjKGsxLGsyLGszLGs0LGs1LGs2LGs3KSwNCiAgICAgICAgICAgICAgICAgIHJvdy5uYW1lcz1OVUxMKSANCmNvbG5hbWVzKGFpY3MpIDwtIGMoIm1vZGVsIiwiQUlDYyIsICJrIikgDQojIHNvcnQgYWNjb3JkaW5nIHRvIEFJQw0KYWljczwtYWljc1tvcmRlcihhaWNzJEFJQ2MpLF0gDQpgYGAgIA0KDQojIyMjICoqKndpKioqICh3ZWlnaHRzKSAgDQpgYGB7ciByZXN1bHRzPSBUUlVFfQ0KZm9yKGkgaW4gMTpkaW0oYWljcylbMV0pew0KICBhaWNzJGRlbHRhQUlDW2ldPC1haWNzJEFJQ2NbMV0tYWljcyRBSUNjW2ldfQ0Kd2k8LWV4cChhaWNzJGRlbHRhQUlDLzIpDQp3aSA8LSB3aS9zdW0od2kpDQphaWNzJHdpIDwtIHJvdW5kKHdpL3N1bSh3aSksIDMpDQphaWNzDQpgYGAgIA0KDQojIyMjIERlbHRhIEFJQ3MuIEN1w6FudG8gInBpZXJkZSIgZW4gYWp1c3RlIChBSUNjKSBlbCBtb2RlbG8gY29tcGxldG8gYEdhdG8rUGFyZWQrU2l0aW9gIHNhY2FuZG8gKMOzIGluY2x1eWVuZG8pIGNhZGEgZmFjdG9yPyAgIA0KIyMjIyBEZXZpYW5jZSBHYWluIE1ldGhvZCBbIGxvc3Mgb2YgR09GXSAjIyMjIw0KDQpgYGB7ciByZXN1bHRzPVRSVUV9DQojIyMNCmdsb2JhbCRmb3JtdWxhOyBBSUNjKGdsb2JhbCkgICAgICAjIyMjIyMgR0FUTyArIFBBUkVEIA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIENvbnRyaWJ1dGlvbg0KbS5wYXJlZC5zaXRpbyRmb3JtdWxhOyBBSUNjKG0ucGFyZWQuc2l0aW8pOyBBSUNjKGdsb2JhbCkgLSBBSUNjKG0ucGFyZWQuc2l0aW8pICAgIyMjICdHQVRPJyBjb250cmlidXRpb24NCm0uY2F0LnNpdGlvJGZvcm11bGE7IEFJQ2MobS5jYXQuc2l0aW8pOyBBSUNjKGdsb2JhbCktIEFJQ2MobS5jYXQuc2l0aW8pICAgICAgICAgICMjIyAnUGFyZWQnIGNvbnRyaWJ1dGlvbg0KbS5wYXJlZC5jYXQkZm9ybXVsYTsgQUlDYyhtLnBhcmVkLmNhdCk7IEFJQ2MoZ2xvYmFsKS0gQUlDYyhtLnBhcmVkLmNhdCkgICAgICAgICAgIyMjICdTaXRpbycgY29udHJpYnV0aW9uDQoNCiMNCkRlbHRhQWljcyA8LSBhcy5kYXRhLmZyYW1lKGNiaW5kKCJNb2RlbCI9IGMoImdsb2JhbCIsIkdhdG8iLCAiUGFyZWQiLCAiU2l0aW8iKSwNCiAgICAgICJEZWx0YS5BSUMiPSBjKDAsQUlDYyhnbG9iYWwpIC0gQUlDYyhtLnBhcmVkLnNpdGlvKSwgQUlDYyhnbG9iYWwpLSBBSUNjKG0uY2F0LnNpdGlvKSxBSUNjKGdsb2JhbCktIEFJQ2MobS5wYXJlZC5jYXQpKSkpDQoNCkRlbHRhQWljcyREZWx0YS5BSUMgPC0gYXMubnVtZXJpYyhEZWx0YUFpY3MkRGVsdGEuQUlDKQ0KRGVsdGFBaWNzJERlbHRhLkFJQyA8LSByb3VuZChEZWx0YUFpY3MkRGVsdGEuQUlDLDIpDQpEZWx0YUFpY3MNCmBgYCAgDQoNCioqKkVsIGluY2x1aXIgYHBhcmVkYCB5IGBTaXRpb2AgZGUgaGVjaG8gaGFjZSBxdWUgZWwgbW9kZWxvIGVtcGVvcmUgKGF1bWVudGEgZWwgQUlDYykqKiogDQoNCg==