SVM (Support Vector Machine)

1.1 SVM

  • 2개 이상의 집단 분류에 사용되는 기법
  • 이상치 영향이 가장 적음
  • 마진 경계를 최대로하는 서포트 벡터를 찾는 방법

1.2 Hyperplane

  • 데이터와 데이터 사이의 거리 = Margin
  • Margin 에서 가까운 데이터 = Support Vector
  • Margin 과 Support Vector를 이용하여 그린 선 = HyperPlance

1.3 Data Analysis

1.3.1 데이터 불러오기

## [1] "C:/Users/Administrator/Desktop/R Analysis"
## 'data.frame':    34139 obs. of  11 variables:
##  $ prod_no          : chr  "90784-76001" "90784-76001" "90784-76001" "90784-76001" ...
##  $ fix_time         : num  85.5 86.2 86 86.1 86.1 86.3 86.5 86.4 86.3 86 ...
##  $ a_speed          : num  0.611 0.606 0.609 0.61 0.603 0.606 0.606 0.607 0.604 0.608 ...
##  $ b_speed          : num  1.72 1.71 1.72 1.72 1.7 ...
##  $ separation       : num  242 245 243 242 242 ...
##  $ s_separation     : num  658 657 658 657 657 ...
##  $ rate_terms       : int  95 95 95 95 95 95 95 95 95 95 ...
##  $ mpa              : num  78.2 77.9 78 78.2 77.9 77.9 78.2 77.5 77.8 77.5 ...
##  $ load_time        : num  18.1 18.2 18.1 18.1 18.2 18 18.1 18.1 18 18.1 ...
##  $ highpressure_time: int  58 58 82 74 56 78 55 57 50 60 ...
##  $ c_thickness      : num  24.7 22.5 24.1 25.1 24.5 22.9 24.3 23.9 22.2 19 ...
##           prod_no          fix_time           a_speed           b_speed 
##                 0                 0                 0                 0 
##        separation      s_separation        rate_terms               mpa 
##                 0                 0                 0                 0 
##         load_time highpressure_time       c_thickness 
##                 0                 0                 0

## [1] "90784-76001"  "45231-3B660"  "45231-3B641"  "45231-3B610"  "45231-P3B750"
## [6] "45231-3B400"

## 
##     0     1 
## 18921  2836

1.3.2 데이터 나누기

## Support Vector Machines with Linear Kernel 
## 
## 15229 samples
##     9 predictor
##     2 classes: '0', '1' 
## 
## Pre-processing: centered (9), scaled (9) 
## Resampling: Cross-Validated (10 fold, repeated 5 times) 
## Summary of sample sizes: 13706, 13706, 13706, 13706, 13706, 13706, ... 
## Resampling results:
## 
##   Accuracy   Kappa    
##   0.9034079  0.4581467
## 
## Tuning parameter 'C' was held constant at a value of 1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 5638  510
##          1   72  308
##                                           
##                Accuracy : 0.9108          
##                  95% CI : (0.9037, 0.9177)
##     No Information Rate : 0.8747          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.4722          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
##                                           
##             Sensitivity : 0.9874          
##             Specificity : 0.3765          
##          Pos Pred Value : 0.9170          
##          Neg Pred Value : 0.8105          
##              Prevalence : 0.8747          
##          Detection Rate : 0.8637          
##    Detection Prevalence : 0.9418          
##       Balanced Accuracy : 0.6820          
##                                           
##        'Positive' Class : 0               
## 

1.3.3 새로운 데이터 예측

## [1] 0
## Levels: 0 1

SVM Linear Regression

  • 종속변수가 연속형인 경우에도 회귀분석과 유사한 결과
  • 서로 다른 분류에 속한 관측치 사이의 간격이 최대가 되는 선을 찾아 선으로 연결
  • Cost가 높을 수록 이상치를 포함할 가능성이 높아서 과대적합 위험
  • Cost가 작을 수록 이상치를 포함할 가능성이 낮아져서 과소적합 위험
  • Gamma가 클수록 개체간 분산이 작아져서 곡선률이 커지고, 개체간 영향력이 커져서 옆 개체에 미치는 영향력이 커져서 과대적합 위험

2.1 Support Vector Regreesion Model

c_thickness 연속형 변수의 예측 모델

##       prod_no fix_time a_speed b_speed separation s_separation rate_terms  mpa
## 1 90784-76001     85.5   0.611   1.715      242.0        657.6         95 78.2
## 2 90784-76001     86.2   0.606   1.708      244.7        657.1         95 77.9
## 3 90784-76001     86.0   0.609   1.715      242.7        657.5         95 78.0
## 4 90784-76001     86.1   0.610   1.718      241.9        657.3         95 78.2
## 5 90784-76001     86.1   0.603   1.704      242.5        657.3         95 77.9
## 6 90784-76001     86.3   0.606   1.707      244.5        656.9         95 77.9
##   load_time highpressure_time c_thickness
## 1      18.1                58        24.7
## 2      18.2                58        22.5
## 3      18.1                82        24.1
## 4      18.1                74        25.1
## 5      18.2                56        24.5
## 6      18.0                78        22.9
## 
## Call:
## svm(formula = c_thickness ~ ., data = train, gamma = 2, cost = 16)
## 
## 
## Parameters:
##    SVM-Type:  eps-regression 
##  SVM-Kernel:  radial 
##        cost:  16 
##       gamma:  2 
##     epsilon:  0.1 
## 
## 
## Number of Support Vectors:  2895
##      RMSE  Rsquared       MAE 
## 1.2528912 0.9030114 0.4062829
## 
## Call:
## lm(formula = c_thickness ~ ., data = train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -21.7653  -0.6136  -0.0209   0.5711  29.3171 
## 
## Coefficients:
##                     Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)        7.061e+02  4.012e+00  175.974   <2e-16 ***
## fix_time           7.028e-02  6.215e-03   11.308   <2e-16 ***
## a_speed           -1.695e+01  4.949e-01  -34.260   <2e-16 ***
## b_speed            1.995e+00  1.793e-01   11.132   <2e-16 ***
## separation        -7.509e-01  4.334e-03 -173.254   <2e-16 ***
## s_separation      -7.380e-01  4.381e-03 -168.449   <2e-16 ***
## rate_terms         9.898e-03  4.230e-03    2.340   0.0193 *  
## mpa               -1.523e-01  1.723e-03  -88.365   <2e-16 ***
## load_time         -1.721e-01  9.576e-03  -17.973   <2e-16 ***
## highpressure_time -1.267e-05  1.028e-05   -1.233   0.2177    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.772 on 15226 degrees of freedom
## Multiple R-squared:  0.7824, Adjusted R-squared:  0.7823 
## F-statistic:  6084 on 9 and 15226 DF,  p-value: < 2.2e-16
##      RMSE  Rsquared       MAE 
## 1.8528011 0.7874622 0.9664274
RMSE Rsquared MAE
SVM 1.1226402 0.9163979 0.3835772
linear 1.8068063 0.7824639 0.9443125

Logistic Regression

  • ODD Ratio (성공/1-성공) |Y=1|X=X|
## 
##         0         1 
## 0.8694354 0.1305646
## 
## Call:
## glm(formula = target ~ ., family = binomial(logit), data = train)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -5.3977  -0.3739  -0.2169  -0.1211   5.2106  
## 
## Coefficients:
##                     Estimate Std. Error z value Pr(>|z|)    
## (Intercept)       -4.545e+02  1.207e+01 -37.661  < 2e-16 ***
## fix_time          -3.382e-02  1.096e-02  -3.085 0.002034 ** 
## a_speed            1.852e+01  1.127e+00  16.437  < 2e-16 ***
## b_speed           -1.972e+00  4.753e-01  -4.148 3.36e-05 ***
## separation         5.364e-01  1.354e-02  39.628  < 2e-16 ***
## s_separation       5.022e-01  1.326e-02  37.871  < 2e-16 ***
## rate_terms        -3.209e-02  8.381e-03  -3.829 0.000129 ***
## mpa               -1.406e-01  4.032e-03 -34.867  < 2e-16 ***
## load_time         -5.116e-03  1.875e-02  -0.273 0.784955    
## highpressure_time  2.018e-04  1.864e-05  10.825  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 11816.9  on 15235  degrees of freedom
## Residual deviance:  7001.4  on 15226  degrees of freedom
## AIC: 7021.4
## 
## Number of Fisher Scoring iterations: 6
##     predict
## real     0     1
##    0 13015   229
##    1  1092   900

Question-1

  • Occupany 데이터 Logistic Regression/ test데이터 예측값과 정확도/ ROC & AUC
## 'data.frame':    8143 obs. of  7 variables:
##  $ date         : chr  "2015-02-04 17:51:00" "2015-02-04 17:51:59" "2015-02-04 17:53:00" "2015-02-04 17:54:00" ...
##  $ Temperature  : num  23.2 23.1 23.1 23.1 23.1 ...
##  $ Humidity     : num  27.3 27.3 27.2 27.2 27.2 ...
##  $ Light        : num  426 430 426 426 426 ...
##  $ CO2          : num  721 714 714 708 704 ...
##  $ HumidityRatio: num  0.00479 0.00478 0.00478 0.00477 0.00476 ...
##  $ Occupancy    : int  1 1 1 1 1 1 1 1 1 1 ...

Question-2

SVM Classifier 사용 Test 데이터 예측값 및 정확도/ ROC,AUC

## Support Vector Machines with Linear Kernel 
## 
## 8143 samples
##    5 predictor
##    2 classes: '0', '1' 
## 
## Pre-processing: centered (5), scaled (5) 
## Resampling: Cross-Validated (10 fold, repeated 5 times) 
## Summary of sample sizes: 7328, 7329, 7328, 7330, 7329, 7329, ... 
## Resampling results:
## 
##   Accuracy   Kappa    
##   0.9861476  0.9592325
## 
## Tuning parameter 'C' was held constant at a value of 1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 1639    3
##          1   54  969
##                                           
##                Accuracy : 0.9786          
##                  95% CI : (0.9724, 0.9838)
##     No Information Rate : 0.6353          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9544          
##                                           
##  Mcnemar's Test P-Value : 3.528e-11       
##                                           
##             Sensitivity : 0.9681          
##             Specificity : 0.9969          
##          Pos Pred Value : 0.9982          
##          Neg Pred Value : 0.9472          
##              Prevalence : 0.6353          
##          Detection Rate : 0.6150          
##    Detection Prevalence : 0.6161          
##       Balanced Accuracy : 0.9825          
##                                           
##        'Positive' Class : 0               
## 

Result

  • Accuarcy : 0.9786
  • ROC Curve : 0.983

L1 + L2 = Regularized Logistic

L1 Rasso + L2 Ridge 제약식을 사용하는 logistic 사용

## Regularized Logistic Regression 
## 
## 8143 samples
##    5 predictor
##    2 classes: '0', '1' 
## 
## Pre-processing: centered (5), scaled (5) 
## Resampling: Cross-Validated (10 fold, repeated 5 times) 
## Summary of sample sizes: 7329, 7329, 7328, 7329, 7329, 7328, ... 
## Resampling results across tuning parameters:
## 
##   cost  loss       epsilon  Accuracy   Kappa    
##   0.5   L1         0.001    0.9860248  0.9588660
##   0.5   L1         0.010    0.9860985  0.9590744
##   0.5   L1         0.100    0.9875724  0.9634957
##   0.5   L2_dual    0.001    0.9860248  0.9588660
##   0.5   L2_dual    0.010    0.9860248  0.9588660
##   0.5   L2_dual    0.100    0.9860248  0.9588660
##   0.5   L2_primal  0.001    0.9860248  0.9588660
##   0.5   L2_primal  0.010    0.9860002  0.9587943
##   0.5   L2_primal  0.100    0.9861230  0.9591648
##   1.0   L1         0.001    0.9860248  0.9588660
##   1.0   L1         0.010    0.9860739  0.9590050
##   1.0   L1         0.100    0.9874985  0.9632924
##   1.0   L2_dual    0.001    0.9860248  0.9588660
##   1.0   L2_dual    0.010    0.9860248  0.9588660
##   1.0   L2_dual    0.100    0.9860248  0.9588660
##   1.0   L2_primal  0.001    0.9860248  0.9588660
##   1.0   L2_primal  0.010    0.9860002  0.9587943
##   1.0   L2_primal  0.100    0.9861230  0.9591652
##   2.0   L1         0.001    0.9860248  0.9588660
##   2.0   L1         0.010    0.9860739  0.9590050
##   2.0   L1         0.100    0.9874002  0.9629941
##   2.0   L2_dual    0.001    0.9860002  0.9587943
##   2.0   L2_dual    0.010    0.9860002  0.9587943
##   2.0   L2_dual    0.100    0.9860002  0.9587943
##   2.0   L2_primal  0.001    0.9860002  0.9587943
##   2.0   L2_primal  0.010    0.9860248  0.9588660
##   2.0   L2_primal  0.100    0.9861230  0.9591652
## 
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were cost = 0.5, loss = L1 and epsilon
##  = 0.1.

  • epsilon: 0.100, L1 (Lasso) 정규화 시 가장 정확도 높음
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 1638    3
##          1   55  969
##                                          
##                Accuracy : 0.9782         
##                  95% CI : (0.972, 0.9834)
##     No Information Rate : 0.6353         
##     P-Value [Acc > NIR] : < 2.2e-16      
##                                          
##                   Kappa : 0.9536         
##                                          
##  Mcnemar's Test P-Value : 2.133e-11      
##                                          
##             Sensitivity : 0.9675         
##             Specificity : 0.9969         
##          Pos Pred Value : 0.9982         
##          Neg Pred Value : 0.9463         
##              Prevalence : 0.6353         
##          Detection Rate : 0.6146         
##    Detection Prevalence : 0.6158         
##       Balanced Accuracy : 0.9822         
##                                          
##        'Positive' Class : 0              
## 
  • Accuracy : 0.9782

  • SVM 비교, TP/FP 중 1개의 차이 : SVM 이 한개 더 맞음

iiiㅁ{r}

LS0tDQp0aXRsZTogIlNWTSAmIExvZ2lzdGljIg0KYXV0aG9yOiAiRE9FVU4iDQpkYXRlOiAnMjAyMSAzIDE2ICcNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICMgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgaGlnaGxpZ2h0OiB6ZW5idXJuDQogICAgIyBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiAiZmxhdGx5Ig0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KLS0tDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGNhY2hlID0gVFJVRSkNCg0KI2luc3RhbGwucGFja2FnZXMoInVzZWZ1bCIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShmYWN0b2V4dHJhKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGNhcmV0KQ0KbGlicmFyeShlMTA3MSkNCg0Kcm0obGlzdD1scygpKQ0KYGBgDQoNCiMjIFNWTSAoU3VwcG9ydCBWZWN0b3IgTWFjaGluZSkNCg0KMS4xIFNWTSANCg0KKyAy6rCcIOydtOyDgeydmCDsp5Hri6gg67aE66WY7JeQIOyCrOyaqeuQmOuKlCDquLDrspUgDQorIOydtOyDgey5mCDsmIHtlqXsnbQg6rCA7J6lIOyggeydjCANCisg66eI7KeEIOqyveqzhOulvCDstZzrjIDroZztlZjripQg7ISc7Y+s7Yq4IOuyoe2EsOulvCDssL7ripQg67Cp67KVIA0KDQoxLjIgSHlwZXJwbGFuZSANCg0KKyDrjbDsnbTthLDsmYAg642w7J207YSwIOyCrOydtOydmCDqsbDrpqwgPSBNYXJnaW4gDQorIE1hcmdpbiDsl5DshJwg6rCA6rmM7Jq0IOuNsOydtO2EsCA9IFN1cHBvcnQgVmVjdG9yIA0KKyBNYXJnaW4g6rO8IFN1cHBvcnQgVmVjdG9y66W8IOydtOyaqe2VmOyXrCDqt7jrprAg7ISgID0gSHlwZXJQbGFuY2UgDQoNCjEuMyBEYXRhIEFuYWx5c2lzIA0KDQoxLjMuMSDrjbDsnbTthLAg67aI65+s7Jik6riwIA0KDQpgYGB7ciBjYXJzfQ0KZ2V0d2QoKQ0KDQpyZWFkLmNzdignYXV0b3BhcnRzLmNzdicpIC0+IGF1dG9wYXJ0DQoNCg0Kc3RyKGF1dG9wYXJ0KQ0KDQoNCmBgYA0KDQpgYGB7cn0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICAgIE5BIO2ZleyduCANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmNvbFN1bXMoaXMubmEoYXV0b3BhcnQpKQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgICBCb3hwbG90IC0g6re564uo7KCB7J24IG91dGxpZXIg6rCAIOyeiOydjOycvOuhnCDsnZggMTAwMCDsnbTtlZjsnZgg6rCS66eMIOu2iOufrOyYqOuLpCANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmJveHBsb3QoYXV0b3BhcnRbLDI6MTFdKQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIDkwNzg0LTc2MDAxIOydmCDrjbDsnbTthLAg67aA67aE66eMIOy2lOy2nO2VmOq4sCAgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQp1bmlxdWUoYXV0b3BhcnQkcHJvZF9ubykNCg0KDQphdXRvcGFydCAlPiUgDQogIGZpbHRlcihwcm9kX25vID09ICI5MDc4NC03NjAwMSIpICU+JSANCiAgZmlsdGVyKGNfdGhpY2tuZXNzIDwgMTAwMCkgJT4lIA0KICBmaWx0ZXIoaGlnaHByZXNzdXJlX3RpbWUgPCAxMDAwKS0+IGRmX2F1dG8NCg0KDQoNCmJveHBsb3QoZGZfYXV0b1ssMjoxMV0pDQoNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICAgWSDshKTsoJUgOiBjX3RoaWNrbmVzcyDquLDspIDsnLzroZwg7IOI66Gc7Jq0IOuzgOyImCDsg53shLHtlbTso7zquLAgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpkZl9hdXRvJHRhcmdldCA8LSBpZmVsc2UoZGZfYXV0byRjX3RoaWNrbmVzcyA8IDIwfChkZl9hdXRvJGNfdGhpY2tuZXNzPjMyKSwxLDApDQoNCnRhYmxlKGRmX2F1dG8kdGFyZ2V0KQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgICDrjbDsnbTthLAg7KCV66asIHByb2Rfbm8g7KCc6rGw7ZWY6rOgLCB0YXJnZXQg67OA7IiYIGZhY3RvciDrs4DtmZgsIGNfdGhpbmtuZXNzIOydhCDtmZzsmqntlojsnYzsnLzroZwgZmVhdHVyZSDsoJzqsbAgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCg0KZGZfYXV0byAlPiUgDQogIHNlbGVjdCgtcHJvZF9ubywgLWNfdGhpY2tuZXNzKSAlPiUgDQogIG11dGF0ZSh0YXJnZXQgPSBhcy5mYWN0b3IodGFyZ2V0KSkgLT4gZGZfYXV0bw0KDQoNCg0KYGBgDQoNCjEuMy4yIOuNsOydtO2EsCDrgpjriITquLAgDQoNCmBgYHtyfQ0KDQpzZXQuc2VlZCgyMjAwKQ0KDQoNCnNvcnQoc2FtcGxlKG5yb3coZGZfYXV0byksIG5yb3coZGZfYXV0bykqMC43KSkgLT4gZmxhZw0KDQp0cmFpbiA8LSBkZl9hdXRvW2ZsYWcsXQ0KdGVzdCA8LSBkZl9hdXRvWy1mbGFnLF0NCg0KDQp0cmFpbkNvbnRyb2wobWV0aG9kPSJyZXBlYXRlZGN2IiwgcmVwZWF0cyA9IDUpIC0+IGN0cmwNCg0KdHJhaW4odGFyZ2V0fi4sIA0KICAgICAgZGF0YSA9IHRyYWluLCANCiAgICAgIG1ldGhvZCA9ICJzdm1MaW5lYXIiLA0KICAgICAgdHJDb250cm9sPSAgY3RybCwgDQogICAgICBwcmVQcm9jZXNzPSBjKCJjZW50ZXIiLCJzY2FsZSIpLA0KICAgICAgbWV0cmljID0gIkFjY3VyYWN5IikgLT4gIHN2bV9maXQNCg0KDQpzdm1fZml0DQoNCmBgYA0KDQoNCmBgYHtyfQ0KcHJlZGljdChzdm1fZml0LCBuZXdkYXRhID0gdGVzdCktPnByZWRfc3ZtX2ZpdA0KY29uZnVzaW9uTWF0cml4KHByZWRfc3ZtX2ZpdCwgdGVzdCR0YXJnZXQpDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoRXBpKQ0KI2luc3RhbGwucGFja2FnZXMoIkVwaSIpDQpST0ModGVzdD0gcHJlZF9zdm1fZml0LCBzdGF0PXRlc3QkdGFyZ2V0LCBwbG90PSAiUk9DIiwgQVVDPVQsIG1haW49IlNWTSIpDQpgYGANCg0KMS4zLjMg7IOI66Gc7Jq0IOuNsOydtO2EsCDsmIjsuKEgDQoNCmBgYHtyfQ0KbmV3LmRhdGE9ZGF0YS5mcmFtZShmaXhfdGltZT04NyxhX3NwZWVkPTAuNjA5LGJfc3BlZWQ9MS43MTUsc2VwYXJhdGlvbj0yNDIuNyxzX3NlcGFyYXRpb249NjU3LjUscmF0ZV90ZXJtcz05NSxtcGE9NzgsbG9hZF90aW1lPTE4LjEsaGlnaHByZXNzdXJlX3RpbWU9ODIsdGFyZ2V0PU5BKQ0KDQpwcmVkaWN0KHN2bV9maXQsIG5ld2RhdGE9IG5ldy5kYXRhKQ0KYGBgDQoNCg0KYGBge3J9DQpgYGANCg0KDQojIyBTVk0gTGluZWFyIFJlZ3Jlc3Npb24gDQoNCisg7KKF7IaN67OA7IiY6rCAIOyXsOyGje2YleyduCDqsr3smrDsl5Drj4Qg7ZqM6reA67aE7ISd6rO8IOycoOyCrO2VnCDqsrDqs7wgDQorIOyEnOuhnCDri6Trpbgg67aE66WY7JeQIOyGje2VnCDqtIDsuKHsuZgg7IKs7J207J2YIOqwhOqyqeydtCDstZzrjIDqsIAg65CY64qUIOyEoOydhCDssL7slYQg7ISg7Jy866GcIOyXsOqysA0KKyBDb3N06rCAIOuGkuydhCDsiJjroZ0g7J207IOB7LmY66W8IO2PrO2VqO2VoCDqsIDriqXshLHsnbQg64aS7JWE7IScIOqzvOuMgOygge2VqSDsnITtl5ggDQorIENvc3TqsIAg7J6R7J2EIOyImOuhnSDsnbTsg4HsuZjrpbwg7Y+s7ZWo7ZWgIOqwgOuKpeyEseydtCDrgq7slYTsoLjshJwg6rO87IaM7KCB7ZWpIOychO2XmCANCisgR2FtbWHqsIAg7YG07IiY66GdIOqwnOyytOqwhCDrtoTsgrDsnbQg7J6R7JWE7KC47IScIOqzoeyEoOuloOydtCDsu6Tsp4Dqs6AsIOqwnOyytOqwhCDsmIHtlqXroKXsnbQg7Luk7KC47IScIOyYhiDqsJzssrTsl5Ag66+47LmY64qUIOyYge2WpeugpeydtCDsu6TsoLjshJwg6rO864yA7KCB7ZWpIOychO2XmCANCg0KMi4xIFN1cHBvcnQgVmVjdG9yIFJlZ3JlZXNpb24gTW9kZWwNCg0KY190aGlja25lc3Mg7Jew7IaN7ZiVIOuzgOyImOydmCDsmIjsuKEg66qo6424IA0KDQpgYGB7ciBwcmVzc3VyZSwgZWNobz1GQUxTRX0NCg0KaGVhZChhdXRvcGFydCkNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIOuNsOydtO2EsCDstpTstpwg67CPIOuzgO2ZmCANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KYXV0b3BhcnQgJT4lIA0KICBtdXRhdGUodGFyZ2V0ID0gaWZlbHNlKGNfdGhpY2tuZXNzIDwyMCB8IGNfdGhpY2tuZXNzID4gMzIsIDEsIDApICU+JSANCiAgICAgICAgICAgYXMuZmFjdG9yKCkpICU+JSANCiAgZmlsdGVyKHByb2Rfbm8gPT0gIjkwNzg0LTc2MDAxIikgJT4lIA0KICBmaWx0ZXIoY190aGlja25lc3MgPCAxMDAwKSAlPiUgDQogIHNlbGVjdCgtcHJvZF9ubywgLXRhcmdldCkgLT4gZGZfMg0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgVHJhaW4vVGVzdCDrtoTrpqwgIA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpzb3J0KHNhbXBsZShucm93KGRmXzIpLCBucm93KGRmXzIpKjAuNykpIC0+IGZsYWcNCg0KDQpkZl8yW2ZsYWcsXSAtPiB0cmFpbg0KZGZfMlstZmxhZyxdIC0+IHRlc3QNCg0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgTW9kZWxsaW5nICAtIHN2bSBsaW5lYXIgcmVncmVzc2lvbiANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCnN2bShjX3RoaWNrbmVzc34uLCBkYXRhPXRyYWluLCBnYW1tYT0yLCBjb3N0PTE2KSAtPiBzdm1fZml0DQoNCnN1bW1hcnkoc3ZtX2ZpdCkNCg0KcHJlZGljdChzdm1fZml0LCBuZXdkYXRhPXRlc3QpIC0+IHByZWRfc3ZtX3JlZ19maXQgDQoNCnBvc3RSZXNhbXBsZShwcmVkX3N2bV9yZWdfZml0LCBvYnM9dGVzdCRjX3RoaWNrbmVzcykNCmBgYA0KDQpgYGB7cn0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIE1vZGVsbGluZyAgLSBNdWx0aXBsZSBSZWdyZXNzaW9uIExpbmVhcg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KbG0oY190aGlja25lc3N+LiwgZGF0YT10cmFpbikgLT5sbV9maXQNCg0Kc3VtbWFyeShsbV9maXQpDQoNCnByZWRpY3QobG1fZml0LCBuZXdkYXRhID0gdGVzdCkgLT4gcHJlZF9sbQ0KDQpwb3N0UmVzYW1wbGUocHJlZF9sbSwgb2JzPXRlc3QkY190aGlja25lc3MpDQpgYGANCiAgfC0tLSB8IFJNU0UgICB8ICAgICBSc3F1YXJlZCAgIHwgICBNQUUgIHwgDQp8LS0tIHwtLS0tLS18LS0tfC0tLXwNClNWTSAgICAgfCAgIDEuMTIyNjQwMiAgfCAwLjkxNjM5NzkgIHwgIDAuMzgzNTc3MiANCmxpbmVhciAgfCAgIDEuODA2ODA2MyAgfCAwLjc4MjQ2MzkgIHwgMC45NDQzMTI1DQoNCmBgYHtyfQ0KcGFyKG1mcm93PSBjKDEsMikpDQpwbG90KHg9dGVzdCRjX3RoaWNrbmVzcywgcHJlZF9zdm1fcmVnX2ZpdCwgbWFpbj0gIlNWTSIpDQpwbG90KHg9dGVzdCRjX3RoaWNrbmVzcywgcHJlZF9sbSwgbWFpbiA9IkxpbmVhciIpDQpgYGANCg0KIyMgTG9naXN0aWMgUmVncmVzc2lvbiANCg0KKyBPREQgUmF0aW8gKOyEseqztS8xLeyEseqztSkgfFk9MXxYPVh8IA0KDQpgYGB7cn0NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICBTZWxlY3RpbmcgZmVhdHVyZXMgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KYXV0b3BhcnQgJT4lIA0KICBmaWx0ZXIocHJvZF9ubyA9PSAiOTA3ODQtNzYwMDEiKSAlPiUgDQogIG11dGF0ZSh0YXJnZXQgPSBpZmVsc2UoY190aGlja25lc3M8MjB8IGNfdGhpY2tuZXNzPjMyLDEgLDApICU+JSANCiAgICAgICAgICAgYXMuZmFjdG9yKCkpICU+JSANCiAgIGZpbHRlcihjX3RoaWNrbmVzcyA8IDEwMDApICU+JSANCiAgc2VsZWN0KC1wcm9kX25vLCAtY190aGlja25lc3MpIC0+IGRmX2xvZ2l0DQoNCg0KcHJvcC50YWJsZSh0YWJsZShkZl9sb2dpdCR0YXJnZXQpKQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICBUcmFpbi9UZXN0IA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQpzZXQuc2VlZCgyMjIyKQ0KDQpzb3J0KHNhbXBsZShucm93KGRmX2xvZ2l0KSwgbnJvdyhkZl9sb2dpdCkqMC43KSkgLT4gZmxhZw0KDQoNCmRmX2xvZ2l0W2ZsYWcsIF0gLT4gdHJhaW4NCmRmX2xvZ2l0Wy1mbGFnLCBdIC0+IHRlc3QNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIE1vZGVsbGluZyANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCmdsbSh0YXJnZXR+LiwgZGF0YT10cmFpbiwgZmFtaWx5PWJpbm9taWFsKGxvZ2l0KSkgLT4gbG9naXRfcmVnDQoNCnN1bW1hcnkobG9naXRfcmVnKQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICDquLDspIDqsJIg7ISk7KCVIDAuNSDquLDspIAgIA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCmlmZWxzZShsb2dpdF9yZWckZml0dGVkLnZhbHVlcyA+PSAwLjUsIDEsIDApIC0+IGxvZ2l0X3RhYmxlDQoNCg0KdGFibGUocmVhbD10cmFpbiR0YXJnZXQsIHByZWRpY3Q9IGxvZ2l0X3RhYmxlKQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICDsmIjsuKHtlZjquLAgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnByZWRpY3QobG9naXRfcmVnLCB0ZXN0LCB0eXBlPSJyZXNwb25zZSIpLT4gcHJlZF9sb2dpdF9yZWcNCg0KDQoNClJPQyh0ZXN0ID0gcHJlZF9sb2dpdF9yZWcsIHN0YXQ9IHRlc3QkdGFyZ2V0LCBwbG90PSJST0MiKQ0KYGBgDQoNCg0KIyMgUXVlc3Rpb24tMSANCg0KKyBPY2N1cGFueSDrjbDsnbTthLAgTG9naXN0aWMgUmVncmVzc2lvbi8gdGVzdOuNsOydtO2EsCDsmIjsuKHqsJLqs7wg7KCV7ZmV64+ELyBST0MgJiBBVUMgDQoNCmBgYHtyfQ0KDQpyZWFkLmNzdigib2NjdXBhbmN5X3RyYWluLmNzdiIpIC0+IG9jY3UNCg0Kc3RyKG9jY3UpDQoNCm9jY3UgJT4lICANCiAgc2VsZWN0KC1kYXRlKSAtPiB0cmFpbg0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgTW9kZWxsaW5nIC0g7ZqM6reA7IudICANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY3RybCA8LSB0cmFpbkNvbnRyb2wobWV0aG9kID0gInJlcGVhdGVkY3YiLCByZXBlYXRzID0gNSkNCg0KdHJhaW4oT2NjdXBhbmN5fi4sIA0KICAgICAgZGF0YT10cmFpbiwgDQogICAgICBtZXRob2QgPSAiZ2xtIiwgDQogICAgICB0ckNvbnRyb2w9Y3RybCwgDQogICAgICBtZXRyaWMgPSAiUk1TRSIpIC0+IGxvZ2l0Mg0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgVEVTVCDrjbDsnbTthLAgDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnRlc3Q9cmVhZC5jc3YoIm9jY3VwYW5jeV90ZXN0LmNzdiIpDQoNCg0KDQpwcmVkaWN0KGxvZ2l0MiwgdGVzdCkgLT4gcHJlZF90ZXN0DQoNCg0KDQpST0ModGVzdD1wcmVkX3Rlc3QsIHN0YXQgPSB0ZXN0JE9jY3VwYW5jeSwgcGxvdD0iUk9DIikNCmBgYA0KDQojIyBRdWVzdGlvbi0yIA0KDQoNClNWTSBDbGFzc2lmaWVyIOyCrOyaqSBUZXN0IOuNsOydtO2EsCDsmIjsuKHqsJIg67CPIOygle2ZleuPhC8gUk9DLEFVQyANCg0KYGBge3J9DQoNCnJlYWQuY3N2KCJvY2N1cGFuY3lfdHJhaW4uY3N2IikgLT4gdHJhaW4NCnJlYWQuY3N2KCJvY2N1cGFuY3lfdGVzdC5jc3YiKSAtPiB0ZXN0DQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICBGYWN0b3Ig67OA7ZmYIOuwjyBzZWxlY3RpbmcgZmVhc3R1cmVzIA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQp0cmFpbiRPY2N1cGFuY3kgPC0gYXMuZmFjdG9yKHRyYWluJE9jY3VwYW5jeSkNCnRyYWluWywtMV0gLT50cmFpbg0KDQp0ZXN0JE9jY3VwYW5jeSA8LSBhcy5mYWN0b3IodGVzdCRPY2N1cGFuY3kpDQp0ZXN0WywtMV0gLT50ZXN0DQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojICBTVk0gTW9kZWxsaW5nICANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnRyYWluQ29udHJvbChtZXRob2Q9InJlcGVhdGVkY3YiLCByZXBlYXRzID0gNSkgLT4gY3RybA0KDQp0cmFpbihPY2N1cGFuY3l+LiwgDQogICAgICBkYXRhID0gdHJhaW4sIA0KICAgICAgbWV0aG9kID0gInN2bUxpbmVhciIsDQogICAgICB0ckNvbnRyb2w9ICBjdHJsLCANCiAgICAgIHByZVByb2Nlc3M9IGMoImNlbnRlciIsInNjYWxlIiksDQogICAgICBtZXRyaWMgPSAiQWNjdXJhY3kiKSAtPiAgc3ZtX2ZpdA0KDQoNCnN2bV9maXQNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIHByZWRpY3QgJiBjb25mdXNpb24gTWF0cml4IA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KcHJlZGljdChzdm1fZml0LCBuZXdkYXRhPSB0ZXN0KS0+IHByZWRfc3ZtDQoNCg0KY29uZnVzaW9uTWF0cml4KHByZWRfc3ZtLCB0ZXN0JE9jY3VwYW5jeSkNCg0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgUk9DIA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpST0ModGVzdD1wcmVkX3N2bSwgc3RhdD0gdGVzdCRPY2N1cGFuY3ksIHBsb3Q9IlJPQyIpDQpgYGANCg0KKioqUmVzdWx0KioqIA0KDQorIEFjY3VhcmN5IDogMC45Nzg2IA0KKyBST0MgQ3VydmUgOiAwLjk4MyANCg0KIyMgTDEgKyBMMiA9IFJlZ3VsYXJpemVkIExvZ2lzdGljIA0KDQpMMSBSYXNzbyArIEwyIFJpZGdlIOygnOyVveyLneydhCDsgqzsmqntlZjripQgbG9naXN0aWMg7IKs7JqpIA0KDQpgYGB7cn0NCg0KDQp0cmFpbkNvbnRyb2wobWV0aG9kPSJyZXBlYXRlZGN2IiwgcmVwZWF0cyA9IDUpIC0+IGN0cmwNCg0KdHJhaW4oT2NjdXBhbmN5fi4sIA0KICAgICAgZGF0YSA9IHRyYWluLCANCiAgICAgIG1ldGhvZCA9ICJyZWdMb2dpc3RpYyIsDQogICAgICB0ckNvbnRyb2w9ICBjdHJsLCANCiAgICAgIHByZVByb2Nlc3M9IGMoImNlbnRlciIsInNjYWxlIiksDQogICAgICBtZXRyaWMgPSAiQWNjdXJhY3kiKSAtPiAgcmVnX2ZpdA0KDQoNCnJlZ19maXQNCg0KYGBgDQoNCg0KYGBge3J9DQpwbG90KHJlZ19maXQpDQpgYGANCg0KKyBlcHNpbG9uOiAwLjEwMCwgTDEgKExhc3NvKSDsoJXqt5ztmZQg7IucIOqwgOyepSDsoJXtmZXrj4Qg64aS7J2MIA0KDQpgYGB7cn0NCg0KcHJlZGljdChyZWdfZml0LCBuZXdkYXRhID0gdGVzdCkgLT4gcHJlZF9yZWdfZml0DQoNCmNvbmZ1c2lvbk1hdHJpeChwcmVkX3JlZ19maXQsIHRlc3QkT2NjdXBhbmN5KQ0KYGBgDQoNCisgQWNjdXJhY3kgOiAwLjk3ODIgDQoNCmBgYHtyfQ0KDQpST0ModGVzdCA9IHByZWRfcmVnX2ZpdCwgc3RhdD0gdGVzdCRPY2N1cGFuY3ksIHBsb3Q9IlJPQyIsIG1haW49ICJSZWd1YWxyaXplZCBMb2dpc3RpYyBSZWdyZXNzaW9uIikNCmBgYA0KDQoNCisgU1ZNIOu5hOq1kCwgVFAvRlAg7KSRIDHqsJzsnZgg7LCo7J20IDogU1ZNIOydtCDtlZzqsJwg642UIOunnuydjCANCg0KYGBge3J9DQpgYGANCg0KDQpgYGB7cn0NCmBgYA0KDQoNCmBgYHtyfQ0KYGBgDQoNCg0KYGBge3J9DQpgYGANCg0KDQpgYGB7cn0NCmBgYA0KDQoNCmBgYHtyfQ0KYGBgDQoNCg0KYGBge3J9DQpgYGANCg0KDQpgYGB7cn0NCmBgYA0KDQoNCmBgYHtyfQ0KYGBgDQoNCg0KYGBge3J9DQpgYGANCg0KDQppaWnjhYFgYGB7cn0NCmBgYA0KDQo=