4.6.1 The Stock Market Data
library(ISLR)
names(Smarket)
[1] "Year" "Lag1" "Lag2" "Lag3" "Lag4" "Lag5" "Volume"
[8] "Today" "Direction"
summary(Smarket)
Year Lag1 Lag2 Lag3 Lag4
Min. :2001 Min. :-4.922000 Min. :-4.922000 Min. :-4.922000 Min. :-4.922000
1st Qu.:2002 1st Qu.:-0.639500 1st Qu.:-0.639500 1st Qu.:-0.640000 1st Qu.:-0.640000
Median :2003 Median : 0.039000 Median : 0.039000 Median : 0.038500 Median : 0.038500
Mean :2003 Mean : 0.003834 Mean : 0.003919 Mean : 0.001716 Mean : 0.001636
3rd Qu.:2004 3rd Qu.: 0.596750 3rd Qu.: 0.596750 3rd Qu.: 0.596750 3rd Qu.: 0.596750
Max. :2005 Max. : 5.733000 Max. : 5.733000 Max. : 5.733000 Max. : 5.733000
Lag5 Volume Today Direction
Min. :-4.92200 Min. :0.3561 Min. :-4.922000 Down:602
1st Qu.:-0.64000 1st Qu.:1.2574 1st Qu.:-0.639500 Up :648
Median : 0.03850 Median :1.4229 Median : 0.038500
Mean : 0.00561 Mean :1.4783 Mean : 0.003138
3rd Qu.: 0.59700 3rd Qu.:1.6417 3rd Qu.: 0.596750
Max. : 5.73300 Max. :3.1525 Max. : 5.733000
pairs(Smarket)

cor(Smarket[,-9])
Year Lag1 Lag2 Lag3 Lag4 Lag5 Volume
Year 1.00000000 0.029699649 0.030596422 0.033194581 0.035688718 0.029787995 0.53900647
Lag1 0.02969965 1.000000000 -0.026294328 -0.010803402 -0.002985911 -0.005674606 0.04090991
Lag2 0.03059642 -0.026294328 1.000000000 -0.025896670 -0.010853533 -0.003557949 -0.04338321
Lag3 0.03319458 -0.010803402 -0.025896670 1.000000000 -0.024051036 -0.018808338 -0.04182369
Lag4 0.03568872 -0.002985911 -0.010853533 -0.024051036 1.000000000 -0.027083641 -0.04841425
Lag5 0.02978799 -0.005674606 -0.003557949 -0.018808338 -0.027083641 1.000000000 -0.02200231
Volume 0.53900647 0.040909908 -0.043383215 -0.041823686 -0.048414246 -0.022002315 1.00000000
Today 0.03009523 -0.026155045 -0.010250033 -0.002447647 -0.006899527 -0.034860083 0.01459182
Today
Year 0.030095229
Lag1 -0.026155045
Lag2 -0.010250033
Lag3 -0.002447647
Lag4 -0.006899527
Lag5 -0.034860083
Volume 0.014591823
Today 1.000000000
attach (Smarket)
plot(Volume)

4.6.2 Logistic Regression
glm.fit=glm(Direction∼Lag1+Lag2+Lag3+Lag4+Lag5+Volume,
data=Smarket ,family =binomial)
summary (glm.fit)
Call:
glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +
Volume, family = binomial, data = Smarket)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.446 -1.203 1.065 1.145 1.326
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.126000 0.240736 -0.523 0.601
Lag1 -0.073074 0.050167 -1.457 0.145
Lag2 -0.042301 0.050086 -0.845 0.398
Lag3 0.011085 0.049939 0.222 0.824
Lag4 0.009359 0.049974 0.187 0.851
Lag5 0.010313 0.049511 0.208 0.835
Volume 0.135441 0.158360 0.855 0.392
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1731.2 on 1249 degrees of freedom
Residual deviance: 1727.6 on 1243 degrees of freedom
AIC: 1741.6
Number of Fisher Scoring iterations: 3
coef(glm.fit)
(Intercept) Lag1 Lag2 Lag3 Lag4 Lag5 Volume
-0.126000257 -0.073073746 -0.042301344 0.011085108 0.009358938 0.010313068 0.135440659
summary (glm.fit )$coef
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.126000257 0.24073574 -0.5233966 0.6006983
Lag1 -0.073073746 0.05016739 -1.4565986 0.1452272
Lag2 -0.042301344 0.05008605 -0.8445733 0.3983491
Lag3 0.011085108 0.04993854 0.2219750 0.8243333
Lag4 0.009358938 0.04997413 0.1872757 0.8514445
Lag5 0.010313068 0.04951146 0.2082966 0.8349974
Volume 0.135440659 0.15835970 0.8552723 0.3924004
summary (glm.fit )$coef [,4]
(Intercept) Lag1 Lag2 Lag3 Lag4 Lag5 Volume
0.6006983 0.1452272 0.3983491 0.8243333 0.8514445 0.8349974 0.3924004
glm.probs =predict (glm.fit ,type ="response")
glm.probs [1:10]
1 2 3 4 5 6 7 8 9
0.5070841 0.4814679 0.4811388 0.5152224 0.5107812 0.5069565 0.4926509 0.5092292 0.5176135
10
0.4888378
contrasts (Direction)
Up
Down 0
Up 1
glm.pred=rep ("Down ",1250)
glm.pred[glm.probs >.5]="Up"
table(glm.pred,Direction)
Direction
glm.pred Down Up
Down 145 141
Up 457 507
(507+145)/1250
[1] 0.5216
mean(glm.pred==Direction)
[1] 0.4056
train =(Year <2005)
Smarket.2005= Smarket [! train ,]
dim(Smarket.2005)
[1] 252 9
Direction.2005= Direction [! train]
glm.fit=glm(Direction∼Lag1+Lag2+Lag3+Lag4+Lag5+Volume ,
data=Smarket ,family =binomial ,subset =train )
glm.probs =predict(glm.fit,Smarket.2005,type="response")
glm.pred=rep ("Down",252)
glm.pred[glm.probs >.5]=" Up"
table(glm.pred ,Direction.2005)
Direction.2005
glm.pred Down Up
Up 34 44
Down 77 97
mean(glm.pred== Direction.2005)
[1] 0.3055556
mean(glm.pred!= Direction.2005)
[1] 0.6944444
glm.fit=glm(Direction∼Lag1+Lag2 ,data=Smarket ,family =binomial ,
subset =train)
glm.probs =predict(glm.fit ,Smarket.2005 , type="response")
glm.pred=rep ("Down" ,252)
glm.pred[glm.probs >.5]=" Up"
table(glm.pred ,Direction.2005)
Direction.2005
glm.pred Down Up
Up 76 106
Down 35 35
mean(glm.pred== Direction.2005)
[1] 0.1388889
106/(106+76)
[1] 0.5824176
predict(glm.fit ,newdata =data.frame(Lag1=c(1.2 ,1.5) ,
Lag2=c(1.1 , -0.8) ),type ="response")
1 2
0.4791462 0.4960939
4.6.3 Linear Discriminant Analysis
library(MASS)
lda.fit=lda(Direction∼Lag1+Lag2 ,data=Smarket ,subset =train)
lda.fit
Call:
lda(Direction ~ Lag1 + Lag2, data = Smarket, subset = train)
Prior probabilities of groups:
Down Up
0.491984 0.508016
Group means:
Lag1 Lag2
Down 0.04279022 0.03389409
Up -0.03954635 -0.03132544
Coefficients of linear discriminants:
LD1
Lag1 -0.6420190
Lag2 -0.5135293
plot(lda.fit)

lda.pred=predict (lda.fit , Smarket.2005)
names(lda.pred)
[1] "class" "posterior" "x"
lda.class =lda.pred$class
table(lda.class ,Direction.2005)
Direction.2005
lda.class Down Up
Down 35 35
Up 76 106
mean(lda.class == Direction.2005)
[1] 0.5595238
sum(lda.pred$posterior [ ,1] >=.5)
[1] 70
sum(lda.pred$posterior [ ,1] >=.5)
[1] 70
sum(lda.pred$posterior [,1]<.5)
[1] 182
lda.pred$posterior [1:20 ,1]
999 1000 1001 1002 1003 1004 1005 1006 1007
0.4901792 0.4792185 0.4668185 0.4740011 0.4927877 0.4938562 0.4951016 0.4872861 0.4907013
1008 1009 1010 1011 1012 1013 1014 1015 1016
0.4844026 0.4906963 0.5119988 0.4895152 0.4706761 0.4744593 0.4799583 0.4935775 0.5030894
1017 1018
0.4978806 0.4886331
lda.class [1:20]
[1] Up Up Up Up Up Up Up Up Up Up Up Down Up Up Up Up Up Down
[19] Up Up
Levels: Down Up
sum(lda.pred$posterior [,1]>.9)
[1] 0
Warning in gzfile(file, "wb") :
cannot open compressed file 'C:/Users/Oscar Padilla/Desktop/Galileo/Postgrado en Investigacion de Operaciones/TRIMESTRE VI/Fiabilidad/Hoja de Trabajo # 2/Hoja de Trabajo # 2/.Rproj.user/shared/notebooks/405A4D93-Laboratorio # 2/1/F28451AF9CD0AFA5/c5pw5n0olype6_t/e3c713a2fe73422d990f59acaa9d3359.snapshot', probable reason 'No such file or directory'
Error in gzfile(file, "wb") : cannot open the connection
4.6.4 Quadratic Discriminant Analysis
qda.fit=qda(Direction∼Lag1+Lag2 ,data=Smarket ,subset =train)
qda.fit
Call:
qda(Direction ~ Lag1 + Lag2, data = Smarket, subset = train)
Prior probabilities of groups:
Down Up
0.491984 0.508016
Group means:
Lag1 Lag2
Down 0.04279022 0.03389409
Up -0.03954635 -0.03132544
qda.class =predict (qda.fit ,Smarket.2005) $class
table(qda.class ,Direction.2005)
Direction.2005
qda.class Down Up
Down 30 20
Up 81 121
mean(qda.class == Direction.2005)
[1] 0.5992063
4.6.5 K-Nearest Neighbors
library (class)
train.X=cbind(Lag1 ,Lag2)[train ,]
test.X=cbind (Lag1 ,Lag2)[!train ,]
train.Direction =Direction [train]
set.seed (1)
knn.pred=knn (train.X,test.X,train.Direction ,k=1)
table(knn.pred ,Direction.2005)
Direction.2005
knn.pred Down Up
Down 43 58
Up 68 83
(83+43) /252
[1] 0.5
knn.pred=knn (train.X,test.X,train.Direction ,k=3)
table(knn.pred ,Direction.2005)
Direction.2005
knn.pred Down Up
Down 48 54
Up 63 87
mean(knn.pred== Direction.2005)
[1] 0.5357143
4.6.6 An Application to Caravan Insurance Data
dim(Caravan)
[1] 5822 86
attach (Caravan )
The following objects are masked from Caravan (pos = 3):
AAANHANG, ABESAUT, ABRAND, ABROM, ABYSTAND, AFIETS, AGEZONG, AINBOED, ALEVEN,
AMOTSCO, APERSAUT, APERSONG, APLEZIER, ATRACTOR, AVRAAUT, AWABEDR, AWALAND,
AWAOREG, AWAPART, AWERKT, AZEILPL, MAANTHUI, MAUT0, MAUT1, MAUT2, MBERARBG,
MBERARBO, MBERBOER, MBERHOOG, MBERMIDD, MBERZELF, MFALLEEN, MFGEKIND, MFWEKIND,
MGEMLEEF, MGEMOMV, MGODGE, MGODOV, MGODPR, MGODRK, MHHUUR, MHKOOP, MINK123M,
MINK3045, MINK4575, MINK7512, MINKGEM, MINKM30, MKOOPKLA, MOPLHOOG, MOPLLAAG,
MOPLMIDD, MOSHOOFD, MOSTYPE, MRELGE, MRELOV, MRELSA, MSKA, MSKB1, MSKB2, MSKC,
MSKD, MZFONDS, MZPART, PAANHANG, PBESAUT, PBRAND, PBROM, PBYSTAND, PFIETS,
PGEZONG, PINBOED, PLEVEN, PMOTSCO, PPERSAUT, PPERSONG, PPLEZIER, PTRACTOR,
Purchase, PVRAAUT, PWABEDR, PWALAND, PWAOREG, PWAPART, PWERKT, PZEILPL
The following objects are masked from Caravan (pos = 4):
AAANHANG, ABESAUT, ABRAND, ABROM, ABYSTAND, AFIETS, AGEZONG, AINBOED, ALEVEN,
AMOTSCO, APERSAUT, APERSONG, APLEZIER, ATRACTOR, AVRAAUT, AWABEDR, AWALAND,
AWAOREG, AWAPART, AWERKT, AZEILPL, MAANTHUI, MAUT0, MAUT1, MAUT2, MBERARBG,
MBERARBO, MBERBOER, MBERHOOG, MBERMIDD, MBERZELF, MFALLEEN, MFGEKIND, MFWEKIND,
MGEMLEEF, MGEMOMV, MGODGE, MGODOV, MGODPR, MGODRK, MHHUUR, MHKOOP, MINK123M,
MINK3045, MINK4575, MINK7512, MINKGEM, MINKM30, MKOOPKLA, MOPLHOOG, MOPLLAAG,
MOPLMIDD, MOSHOOFD, MOSTYPE, MRELGE, MRELOV, MRELSA, MSKA, MSKB1, MSKB2, MSKC,
MSKD, MZFONDS, MZPART, PAANHANG, PBESAUT, PBRAND, PBROM, PBYSTAND, PFIETS,
PGEZONG, PINBOED, PLEVEN, PMOTSCO, PPERSAUT, PPERSONG, PPLEZIER, PTRACTOR,
Purchase, PVRAAUT, PWABEDR, PWALAND, PWAOREG, PWAPART, PWERKT, PZEILPL
summary (Purchase )
No Yes
5474 348
348/5822
[1] 0.05977327
standardized.X=scale(Caravan [,-86])
var(Caravan [,1])
[1] 165.0378
var(Caravan [,2])
[1] 0.1647078
var( standardized.X[,1])
[1] 1
var( standardized.X[,2])
[1] 1
test =1:1000
train.X=standardized.X[-test ,]
test.X=standardized.X[test ,]
train.Y=Purchase [-test]
test.Y=Purchase [test]
set.seed (1)
knn.pred=knn (train.X,test.X,train.Y,k=1)
mean(test.Y!= knn.pred)
[1] 0.118
mean(test.Y!="No")
[1] 0.059
table(knn.pred ,test.Y)
test.Y
knn.pred No Yes
No 873 50
Yes 68 9
9/(68+9)
[1] 0.1168831
knn.pred=knn(train.X,test.X,train.Y,k=3)
table(knn.pred ,test.Y)
test.Y
knn.pred No Yes
No 920 54
Yes 21 5
5/26
[1] 0.1923077
knn.pred=knn(train.X,test.X,train.Y,k=5)
table(knn.pred,test.Y)
test.Y
knn.pred No Yes
No 930 55
Yes 11 4
4/15
[1] 0.2666667
glm.fit=glm(Purchase∼.,data=Caravan ,family =binomial ,
subset =-test)
glm.fit: fitted probabilities numerically 0 or 1 occurred
glm.probs =predict (glm.fit ,Caravan [test ,], type="response")
glm.pred=rep ("No" ,1000)
glm.pred[glm.probs >.5]="Yes"
table(glm.pred ,test.Y)
test.Y
glm.pred No Yes
No 934 59
Yes 7 0
glm.pred=rep ("No" ,1000)
glm.pred[glm.probs >.25]="Yes"
table(glm.pred ,test.Y)
test.Y
glm.pred No Yes
No 919 48
Yes 22 11
11/(22+11)
[1] 0.3333333
LS0tDQp0aXRsZTogIkxhYm9yYXRpbyAjIDIgLSBPc2NhciBQYWRpbGxhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjIDQuNi4xIFRoZSBTdG9jayBNYXJrZXQgRGF0YQ0KYGBge3J9DQpsaWJyYXJ5KElTTFIpDQpuYW1lcyhTbWFya2V0KQ0Kc3VtbWFyeShTbWFya2V0KQ0KcGFpcnMoU21hcmtldCkNCmNvcihTbWFya2V0WywtOV0pDQphdHRhY2ggKFNtYXJrZXQpDQpwbG90KFZvbHVtZSkNCmBgYA0KDQojIyMgNC42LjIgTG9naXN0aWMgUmVncmVzc2lvbg0KDQpgYGB7cn0NCmdsbS5maXQ9Z2xtKERpcmVjdGlvbuKIvExhZzErTGFnMitMYWczK0xhZzQrTGFnNStWb2x1bWUsDQpkYXRhPVNtYXJrZXQgLGZhbWlseSA9Ymlub21pYWwpDQpzdW1tYXJ5IChnbG0uZml0KQ0KY29lZihnbG0uZml0KQ0Kc3VtbWFyeSAoZ2xtLmZpdCApJGNvZWYNCnN1bW1hcnkgKGdsbS5maXQgKSRjb2VmIFssNF0NCmdsbS5wcm9icyA9cHJlZGljdCAoZ2xtLmZpdCAsdHlwZSA9InJlc3BvbnNlIikNCmdsbS5wcm9icyBbMToxMF0NCmNvbnRyYXN0cyAoRGlyZWN0aW9uKQ0KZ2xtLnByZWQ9cmVwICgiRG93biAiLDEyNTApDQpnbG0ucHJlZFtnbG0ucHJvYnMgPi41XT0iVXAiDQp0YWJsZShnbG0ucHJlZCxEaXJlY3Rpb24pDQooNTA3KzE0NSkvMTI1MA0KbWVhbihnbG0ucHJlZD09RGlyZWN0aW9uKQ0KdHJhaW4gPShZZWFyIDwyMDA1KQ0KU21hcmtldC4yMDA1PSBTbWFya2V0IFshIHRyYWluICxdDQpkaW0oU21hcmtldC4yMDA1KQ0KRGlyZWN0aW9uLjIwMDU9IERpcmVjdGlvbiBbISB0cmFpbl0NCmdsbS5maXQ9Z2xtKERpcmVjdGlvbuKIvExhZzErTGFnMitMYWczK0xhZzQrTGFnNStWb2x1bWUgLA0KZGF0YT1TbWFya2V0ICxmYW1pbHkgPWJpbm9taWFsICxzdWJzZXQgPXRyYWluICkNCmdsbS5wcm9icyA9cHJlZGljdChnbG0uZml0LFNtYXJrZXQuMjAwNSx0eXBlPSJyZXNwb25zZSIpDQpnbG0ucHJlZD1yZXAgKCJEb3duIiwyNTIpDQpnbG0ucHJlZFtnbG0ucHJvYnMgPi41XT0iIFVwIg0KdGFibGUoZ2xtLnByZWQgLERpcmVjdGlvbi4yMDA1KQ0KbWVhbihnbG0ucHJlZD09IERpcmVjdGlvbi4yMDA1KQ0KbWVhbihnbG0ucHJlZCE9IERpcmVjdGlvbi4yMDA1KQ0KZ2xtLmZpdD1nbG0oRGlyZWN0aW9u4oi8TGFnMStMYWcyICxkYXRhPVNtYXJrZXQgLGZhbWlseSA9Ymlub21pYWwgLA0Kc3Vic2V0ID10cmFpbikNCmdsbS5wcm9icyA9cHJlZGljdChnbG0uZml0ICxTbWFya2V0LjIwMDUgLCB0eXBlPSJyZXNwb25zZSIpDQpnbG0ucHJlZD1yZXAgKCJEb3duIiAsMjUyKQ0KZ2xtLnByZWRbZ2xtLnByb2JzID4uNV09IiBVcCINCnRhYmxlKGdsbS5wcmVkICxEaXJlY3Rpb24uMjAwNSkNCm1lYW4oZ2xtLnByZWQ9PSBEaXJlY3Rpb24uMjAwNSkNCjEwNi8oMTA2Kzc2KQ0KcHJlZGljdChnbG0uZml0ICxuZXdkYXRhID1kYXRhLmZyYW1lKExhZzE9YygxLjIgLDEuNSkgLA0KTGFnMj1jKDEuMSAsIC0wLjgpICksdHlwZSA9InJlc3BvbnNlIikNCmBgYA0KDQojIyMgNC42LjMgTGluZWFyIERpc2NyaW1pbmFudCBBbmFseXNpcw0KDQpgYGB7cn0NCmxpYnJhcnkoTUFTUykNCmxkYS5maXQ9bGRhKERpcmVjdGlvbuKIvExhZzErTGFnMiAsZGF0YT1TbWFya2V0ICxzdWJzZXQgPXRyYWluKQ0KbGRhLmZpdA0KcGxvdChsZGEuZml0KQ0KbGRhLnByZWQ9cHJlZGljdCAobGRhLmZpdCAsIFNtYXJrZXQuMjAwNSkNCm5hbWVzKGxkYS5wcmVkKQ0KbGRhLmNsYXNzID1sZGEucHJlZCRjbGFzcw0KdGFibGUobGRhLmNsYXNzICxEaXJlY3Rpb24uMjAwNSkNCm1lYW4obGRhLmNsYXNzID09IERpcmVjdGlvbi4yMDA1KQ0Kc3VtKGxkYS5wcmVkJHBvc3RlcmlvciBbICwxXSA+PS41KQ0Kc3VtKGxkYS5wcmVkJHBvc3RlcmlvciBbICwxXSA+PS41KQ0Kc3VtKGxkYS5wcmVkJHBvc3RlcmlvciBbLDFdPC41KQ0KbGRhLnByZWQkcG9zdGVyaW9yIFsxOjIwICwxXQ0KbGRhLmNsYXNzIFsxOjIwXQ0Kc3VtKGxkYS5wcmVkJHBvc3RlcmlvciBbLDFdPi45KQ0KDQpgYGANCg0KIyMjIDQuNi40IFF1YWRyYXRpYyBEaXNjcmltaW5hbnQgQW5hbHlzaXMNCg0KYGBge3J9DQpxZGEuZml0PXFkYShEaXJlY3Rpb27iiLxMYWcxK0xhZzIgLGRhdGE9U21hcmtldCAsc3Vic2V0ID10cmFpbikNCnFkYS5maXQNCnFkYS5jbGFzcyA9cHJlZGljdCAocWRhLmZpdCAsU21hcmtldC4yMDA1KSAkY2xhc3MNCnRhYmxlKHFkYS5jbGFzcyAsRGlyZWN0aW9uLjIwMDUpDQptZWFuKHFkYS5jbGFzcyA9PSBEaXJlY3Rpb24uMjAwNSkNCmBgYA0KDQojIyMgNC42LjUgSy1OZWFyZXN0IE5laWdoYm9ycw0KDQpgYGB7cn0NCmxpYnJhcnkgKGNsYXNzKQ0KdHJhaW4uWD1jYmluZChMYWcxICxMYWcyKVt0cmFpbiAsXQ0KdGVzdC5YPWNiaW5kIChMYWcxICxMYWcyKVshdHJhaW4gLF0NCnRyYWluLkRpcmVjdGlvbiA9RGlyZWN0aW9uIFt0cmFpbl0NCnNldC5zZWVkICgxKQ0Ka25uLnByZWQ9a25uICh0cmFpbi5YLHRlc3QuWCx0cmFpbi5EaXJlY3Rpb24gLGs9MSkNCnRhYmxlKGtubi5wcmVkICxEaXJlY3Rpb24uMjAwNSkNCig4Mys0MykgLzI1Mg0Ka25uLnByZWQ9a25uICh0cmFpbi5YLHRlc3QuWCx0cmFpbi5EaXJlY3Rpb24gLGs9MykNCnRhYmxlKGtubi5wcmVkICxEaXJlY3Rpb24uMjAwNSkNCm1lYW4oa25uLnByZWQ9PSBEaXJlY3Rpb24uMjAwNSkNCmBgYA0KDQojIyMgNC42LjYgQW4gQXBwbGljYXRpb24gdG8gQ2FyYXZhbiBJbnN1cmFuY2UgRGF0YQ0KDQpgYGB7cn0NCmRpbShDYXJhdmFuKQ0KYXR0YWNoIChDYXJhdmFuICkNCnN1bW1hcnkgKFB1cmNoYXNlICkNCjM0OC81ODIyDQpzdGFuZGFyZGl6ZWQuWD1zY2FsZShDYXJhdmFuIFssLTg2XSkNCnZhcihDYXJhdmFuIFssMV0pDQp2YXIoQ2FyYXZhbiBbLDJdKQ0KdmFyKCBzdGFuZGFyZGl6ZWQuWFssMV0pDQp2YXIoIHN0YW5kYXJkaXplZC5YWywyXSkNCnRlc3QgPTE6MTAwMA0KdHJhaW4uWD1zdGFuZGFyZGl6ZWQuWFstdGVzdCAsXQ0KdGVzdC5YPXN0YW5kYXJkaXplZC5YW3Rlc3QgLF0NCnRyYWluLlk9UHVyY2hhc2UgWy10ZXN0XQ0KdGVzdC5ZPVB1cmNoYXNlIFt0ZXN0XQ0Kc2V0LnNlZWQgKDEpDQprbm4ucHJlZD1rbm4gKHRyYWluLlgsdGVzdC5YLHRyYWluLlksaz0xKQ0KbWVhbih0ZXN0LlkhPSBrbm4ucHJlZCkNCm1lYW4odGVzdC5ZIT0iTm8iKQ0KdGFibGUoa25uLnByZWQgLHRlc3QuWSkNCjkvKDY4KzkpDQprbm4ucHJlZD1rbm4odHJhaW4uWCx0ZXN0LlgsdHJhaW4uWSxrPTMpDQp0YWJsZShrbm4ucHJlZCAsdGVzdC5ZKQ0KNS8yNg0Ka25uLnByZWQ9a25uKHRyYWluLlgsdGVzdC5YLHRyYWluLlksaz01KQ0KdGFibGUoa25uLnByZWQsdGVzdC5ZKQ0KNC8xNQ0KZ2xtLmZpdD1nbG0oUHVyY2hhc2XiiLwuLGRhdGE9Q2FyYXZhbiAsZmFtaWx5ID1iaW5vbWlhbCAsDQpzdWJzZXQgPS10ZXN0KQ0KZ2xtLnByb2JzID1wcmVkaWN0IChnbG0uZml0ICxDYXJhdmFuIFt0ZXN0ICxdLCB0eXBlPSJyZXNwb25zZSIpDQpnbG0ucHJlZD1yZXAgKCJObyIgLDEwMDApDQpnbG0ucHJlZFtnbG0ucHJvYnMgPi41XT0iWWVzIg0KdGFibGUoZ2xtLnByZWQgLHRlc3QuWSkNCmdsbS5wcmVkPXJlcCAoIk5vIiAsMTAwMCkNCmdsbS5wcmVkW2dsbS5wcm9icyA+LjI1XT0iWWVzIg0KdGFibGUoZ2xtLnByZWQgLHRlc3QuWSkNCjExLygyMisxMSkNCg0KYGBgDQoNCg==