Research question : HR wants to evaluate how satisfied employees working for their Organization in order to define better employee retention policies

Hypothesis: Is there any significant difference between dependent & independent variables

Null Hypothesis: There is NO significant difference between Satisfaction level & number of projects, average monthly hours, time spend in company, work accident, promotion last year, last evaluation
Alternate Hypothesis: There is a significant difference between Satisfaction level & number of projects, average monthly hours, time spent in company, work accident, promotion last year, last evaluation

Proportion tables

                        Retain      Left
left                  76.19175 23.808254
Work_accident         85.53904 14.460964
promotion_last_5years 97.87319  2.126808
          Retain       Left
high    7.700513  0.5467031
low    34.295620 14.4809654
medium 34.195613  8.7805854
               Retain      Left
accounting   3.753584 1.3600907
hr           3.493566 1.4334289
IT           6.360424 1.8201213
management   3.593573 0.6067071
marketing    4.366958 1.3534236
product_mng  4.693646 1.3200880
RandD        4.440296 0.8067204
sales       20.841389 6.7604507
support     11.160744 3.7002467
technical   13.487566 4.6469765

Insights

  • ~24% of employees has left organization
  • ~14% of employees had Work accident
  • ~2% of employees got promoted
  • ~ 14% of employees from Low salary & ~9% of employees from medium salary has left organization
  • ~7%, 4% and 5% of employees from Sales, Support & Technical department has left organization respectively

Distribution of Variables : Histogram

$Retain
   vars     n mean   sd median trimmed  mad  min max range skew kurtosis se
X1    1 11428 0.67 0.22   0.69    0.69 0.22 0.12   1  0.88 -0.6    -0.22  0

$Left
   vars    n mean   sd median trimmed  mad  min  max range skew kurtosis se
X1    1 3571 0.44 0.26   0.41    0.43 0.44 0.09 0.92  0.83 0.29    -1.03  0
  • Distribution of Satisfaction levels across employees who retained & left in/from the organization appears normal

$Retain
   vars     n mean   sd median trimmed  mad  min max range  skew kurtosis se
X1    1 11428 0.72 0.16   0.71    0.72 0.19 0.36   1  0.64 -0.04    -1.01  0

$Left
   vars    n mean  sd median trimmed mad  min max range  skew kurtosis se
X1    1 3571 0.72 0.2   0.79    0.72 0.3 0.45   1  0.55 -0.01    -1.71  0
  • Distribution of Last Evaluation across employees who retained & left in/from the organization appears normal

$Retain
   vars     n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 11428 3.79 0.98      4    3.77 1.48   2   6     4 0.27    -0.44 0.01

$Left
   vars    n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 3571 3.86 1.82      4    3.73 2.97   2   7     5 0.25     -1.5 0.03
  • Distribution of Number of Projects across employees who retained & left in/from the organization appears normal

$Retain
   vars     n   mean    sd median trimmed   mad min max range  skew kurtosis   se
X1    1 11428 199.06 45.68    198  199.48 56.34  96 287   191 -0.06    -0.99 0.43

$Left
   vars    n   mean   sd median trimmed   mad min max range skew kurtosis   se
X1    1 3571 207.42 61.2    224  205.71 97.85 126 310   184 0.05    -1.63 1.02
  • Distribution of Average Monthly hours across employees who retained & left in/from the organization appears normal

$Retain
   vars     n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 11428 3.38 1.56      3    3.08 1.48   2  10     8 2.08     5.19 0.01

$Left
   vars    n mean   sd median trimmed  mad min max range skew kurtosis   se
X1    1 3571 3.88 0.98      4    3.79 1.48   2   6     4 0.53     -0.8 0.02
  • Distribution of Time Spend in Company of the employees who retained appears right skewed & who left appears normal

Distribution of Variables : Boxplot

  • Distribution of Satisfaction levels across employees who retained & left in/from the organization appears normal

  • Distribution of Last Evaluation across employees who retained & left in/from the organization appears normal

  • 50th & 75th percentile of employees who retained shares same number of projects with one outlier(6)
  • Distribution of Number of Projects across employees who left from the organization appears normal

  • Distribution of Average Monthly Hours across employees who retained & left in/from the organization appears normal

  • Distribution of Average Monthly Hours across employees who retained appeared right skewed with outliers
  • Distribution of Average Monthly Hours across employees who left appears normal

Relationship between Variables : Scatterplot

[1] 0.1050212
  • There is Weak relationship between Satisfaction level & Last evaluation across employees who retained & left in/from the Organization

[1] -0.1429696
  • There is Weak relationship between Satisfaction level & Number of Projects across employees who retained & left in/from the Organization

[1] -0.02004811
  • There is Weak relationship between Satisfaction level & Average Monthly Hours across employees who retained & left in/from the Organization

[1] -0.1008661
  • There is Weak relationship between Satisfaction level & Time Spend across employees who retained in the Organization
  • There is fairly strong relationship between Satisfaction level & Time Spend across employees who left from Organization

Relationship between Variables(Correlation Analysis) : Tetrachoric & Polychoric Correlation Reference


Polychoric Correlation, ML est. = -0.3908 (0.01739)

  Row Threshold
  Threshold Std.Err.
     0.7125  0.01124


  Column Threshold
  Threshold Std.Err.
       1.06  0.01262
  • There is fairly negative relationship between employees who left & work accident


Polychoric Correlation, ML est. = -0.3219 (0.03705)

  Row Threshold
  Threshold Std.Err.
     0.7125  0.01124


  Column Threshold
  Threshold Std.Err.
      2.028   0.0231
  • There is fairly negative relationship between employees who left & given promotion in last 5-years


Polychoric Correlation, ML est. = -0.00565 (0.01314)
Test of bivariate normality: Chisquare = 434.3, df = 1, p = 1.88e-96

  Row Threshold
  Threshold Std.Err.
     0.7125  0.01124


  Column Thresholds
  Threshold Std.Err.
1    -1.389  0.01477
2     0.177  0.01029
  • There is weak negative relationship between employees who left & salary break-up

Correlation Matrix

                      satisfaction_level last_evaluation number_project average_monthly_hours
satisfaction_level            1.00000000       0.1050212     -0.1429696           -0.02004811
last_evaluation               0.10502121       1.0000000      0.3493326            0.33974180
number_project               -0.14296959       0.3493326      1.0000000            0.41721063
average_monthly_hours        -0.02004811       0.3397418      0.4172106            1.00000000
time_spend_company           -0.10086607       0.1315907      0.1967859            0.12775491
                      time_spend_company
satisfaction_level            -0.1008661
last_evaluation                0.1315907
number_project                 0.1967859
average_monthly_hours          0.1277549
time_spend_company             1.0000000
  • In general, there is no strong correlation exists between variables

ANOVA

Null Hypothesis: There is NO significant relationship between means(SL) of groups of left & other attributes
Alternate Hypothesis: There is significant relationship between means(SL) of groups of left & other attributes
Analysis of Variance Table

Response: satisfaction_level
                         Df Sum Sq Mean Sq F value    Pr(>F)    
Work_accident             1   3.19  3.1943 51.9854 5.859e-13 ***
promotion_last_5years     1   0.50  0.5042  8.2052  0.004183 ** 
salary                    2   2.11  1.0544 17.1595 3.599e-08 ***
Residuals             14994 921.33  0.0614                      
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = satisfaction_level ~ Work_accident + promotion_last_5years + salary, data = HR_Analytics)

$Work_accident
          diff        lwr        upr p adj
1-0 0.04149321 0.03021295 0.05277348     0

$promotion_last_5years
          diff        lwr        upr     p adj
1-0 0.04015407 0.01265588 0.06765227 0.0042122

$salary
                   diff         lwr          upr     p adj
low-high    -0.03420511 -0.05206715 -0.016343068 0.0000215
medium-high -0.01403907 -0.03207460  0.003996465 0.1615779
medium-low   0.02016604  0.01024054  0.030091540 0.0000058
Insights
  • There is a significant difference in the means of satisfaction level against work accident, promotion last 5-years & salary(low-high,medium-low)
  • However, there is only 84% significant difference in the means of satisfaction level against medium-high salary bucket

Principal Component Analysis

Standard deviations:
[1] 1.3504058 0.9603645 0.8235570 0.7588532

Rotation:
                            PC1         PC2         PC3         PC4
last_evaluation       0.5205189 -0.21869921 -0.82394561 -0.04841845
number_project        0.5740580 -0.06378274  0.33586240  0.74403334
average_monthly_hours 0.5530046 -0.24900053  0.45381212 -0.65287002
time_spend_company    0.3061101  0.94132946 -0.04862758 -0.13353197
Importance of components:
                          PC1    PC2    PC3    PC4
Standard deviation     1.3504 0.9604 0.8236 0.7589
Proportion of Variance 0.4559 0.2306 0.1696 0.1440
Cumulative Proportion  0.4559 0.6865 0.8560 1.0000

     satisfaction_level last_evaluation number_project average_monthly_hours time_spend_company
[1,] 0.2486307          0.1711691       1.232592       49.9431               1.460136          
     satisfaction_level last_evaluation number_project average_monthly_hours time_spend_company
[1,] 40.57067           23.9029         32.4106        24.84109              41.73925          
  • Drop time_spend_company variable & continue transformation with first-3-components

  • Note: As there are only few Variables, PCA is unable/not-suitable to explain more variances. Hence regression might not be prefered on PCA loadings


Linear Regression

Null Hypothesis: There is NO significant relationship between satisfaction level & other attributes
Alternate Hypothesis: There is significant relationship between satisfaction level & other attributes
Simple/Stratified Random Sampling
Linear Model Reference

Call:
lm(formula = satisfaction_level ~ last_evaluation + number_project + 
    average_monthly_hours + Work_accident + promotion_last_5years + 
    salary, data = HR_Analytics_Trans_StRS)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.64886 -0.17989  0.02279  0.19838  0.57074 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)             0.637910   0.008362  76.290  < 2e-16 ***
last_evaluation        -0.007965   0.001755  -4.539 5.73e-06 ***
number_project         -0.029163   0.002464 -11.838  < 2e-16 ***
average_monthly_hours  -0.048339   0.002847 -16.978  < 2e-16 ***
Work_accident1          0.040722   0.006751   6.032 1.67e-09 ***
promotion_last_5years1  0.035646   0.016333   2.182   0.0291 *  
salarylow              -0.045788   0.008956  -5.113 3.23e-07 ***
salarymedium           -0.018362   0.009011  -2.038   0.0416 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2422 on 10493 degrees of freedom
Multiple R-squared:  0.04811,   Adjusted R-squared:  0.04748 
F-statistic: 75.77 on 7 and 10493 DF,  p-value: < 2.2e-16



Call:
lm(formula = log(satisfaction_level) ~ last_evaluation + number_project + 
    average_monthly_hours + Work_accident + promotion_last_5years + 
    salary, data = HR_Analytics_Trans_StRS)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.9751 -0.3358  0.1401  0.4192  1.1345 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)            -0.544863   0.019356 -28.149  < 2e-16 ***
last_evaluation        -0.092905   0.004062 -22.870  < 2e-16 ***
number_project         -0.052265   0.005703  -9.165  < 2e-16 ***
average_monthly_hours  -0.131399   0.006591 -19.936  < 2e-16 ***
Work_accident1          0.101834   0.015628   6.516 7.54e-11 ***
promotion_last_5years1  0.112891   0.037809   2.986  0.00283 ** 
salarylow              -0.130374   0.020732  -6.289 3.33e-10 ***
salarymedium           -0.061151   0.020859  -2.932  0.00338 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.5608 on 10493 degrees of freedom
Multiple R-squared:  0.09644,   Adjusted R-squared:  0.09584 
F-statistic:   160 on 7 and 10493 DF,  p-value: < 2.2e-16

Insights
  • Log-transformation is successful. However, overall varaitions explained by the model is just 10%(5%). Hence model will have poor prediction power
  • Since p<0.05, we reject NH & conclude that there is a signficant relationship between satisfaction level & other attributes
LS0tDQp0aXRsZTogIkxpbmVhciBSZWdyZXNzaW9uIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyMjICoqUmVzZWFyY2ggcXVlc3Rpb24gOiBIUiB3YW50cyB0byBldmFsdWF0ZSBob3cgc2F0aXNmaWVkIGVtcGxveWVlcyB3b3JraW5nIGZvciB0aGVpciBPcmdhbml6YXRpb24gaW4gb3JkZXIgdG8gZGVmaW5lIGJldHRlciBlbXBsb3llZSByZXRlbnRpb24gcG9saWNpZXMqKg0KDQojIyMjICoqSHlwb3RoZXNpczogSXMgdGhlcmUgYW55IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBkZXBlbmRlbnQgJiBpbmRlcGVuZGVudCB2YXJpYWJsZXMqKg0KIyMjIyMgCU51bGwgSHlwb3RoZXNpczogVGhlcmUgaXMgTk8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIFNhdGlzZmFjdGlvbiBsZXZlbCAmIG51bWJlciBvZiBwcm9qZWN0cywgYXZlcmFnZSBtb250aGx5IGhvdXJzLCB0aW1lIHNwZW5kIGluIGNvbXBhbnksIHdvcmsgYWNjaWRlbnQsIHByb21vdGlvbiBsYXN0IHllYXIsIGxhc3QgZXZhbHVhdGlvbg0KIyMjIyMgCUFsdGVybmF0ZSBIeXBvdGhlc2lzOiBUaGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBudW1iZXIgb2YgcHJvamVjdHMsIGF2ZXJhZ2UgbW9udGhseSBob3VycywgdGltZSBzcGVudCBpbiBjb21wYW55LCB3b3JrIGFjY2lkZW50LCBwcm9tb3Rpb24gbGFzdCB5ZWFyLCBsYXN0IGV2YWx1YXRpb24NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KbGlicmFyeShvcGVueGxzeCkNCkhSX0FuYWx5dGljcyA8LSByZWFkLnhsc3goIkg6L1lhc2h3YW50aC9LYWdnbGUvSFJfY29tbWFfc2VwLnhsc3giLHNoZWV0ID0gMSkNCkhSX0FuYWx5dGljcyRsZWZ0IDwtIGZhY3RvcihIUl9BbmFseXRpY3MkbGVmdCwgbGFiZWxzID0gYygiUmV0YWluIiwiTGVmdCIpKQ0KSFJfQW5hbHl0aWNzJFdvcmtfYWNjaWRlbnQgPC0gYXMuZmFjdG9yKEhSX0FuYWx5dGljcyRXb3JrX2FjY2lkZW50KQ0KSFJfQW5hbHl0aWNzJHByb21vdGlvbl9sYXN0XzV5ZWFycyA8LSBhcy5mYWN0b3IoSFJfQW5hbHl0aWNzJHByb21vdGlvbl9sYXN0XzV5ZWFycykNCmBgYA0KLS0tDQoNCiMjIyMgKipQcm9wb3J0aW9uIHRhYmxlcyoqDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQpwcmludChyYmluZChsZWZ0PXByb3AudGFibGUodGFibGUoSFJfQW5hbHl0aWNzJGxlZnQpKSoxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICBXb3JrX2FjY2lkZW50PXByb3AudGFibGUodGFibGUoSFJfQW5hbHl0aWNzJFdvcmtfYWNjaWRlbnQpKSoxMDAsDQogICAgICBwcm9tb3Rpb25fbGFzdF81eWVhcnM9cHJvcC50YWJsZSh0YWJsZShIUl9BbmFseXRpY3MkcHJvbW90aW9uX2xhc3RfNXllYXJzKSkqMTAwKSkNCiAgICAgIA0KcHJpbnQocmJpbmQoc2FsYXJ5PXByb3AudGFibGUodGFibGUoSFJfQW5hbHl0aWNzJHNhbGFyeSxIUl9BbmFseXRpY3MkbGVmdCkpKjEwMCkpDQoNCnByaW50KHJiaW5kKERlcGFydG1lbnQ9cHJvcC50YWJsZSh0YWJsZShIUl9BbmFseXRpY3MkRGVwYXJ0bWVudCxIUl9BbmFseXRpY3MkbGVmdCkpKjEwMCkpDQpgYGANCioqSW5zaWdodHMqKg0KDQoqIH4yNCUgb2YgZW1wbG95ZWVzIGhhcyBsZWZ0IG9yZ2FuaXphdGlvbg0KKiB+MTQlIG9mIGVtcGxveWVlcyBoYWQgV29yayBhY2NpZGVudA0KKiB+MiUgb2YgZW1wbG95ZWVzIGdvdCBwcm9tb3RlZA0KKiB+IDE0JSBvZiBlbXBsb3llZXMgZnJvbSBMb3cgc2FsYXJ5ICYgfjklIG9mIGVtcGxveWVlcyBmcm9tIG1lZGl1bSBzYWxhcnkgaGFzIGxlZnQgb3JnYW5pemF0aW9uDQoqIH43JSwgNCUgYW5kIDUlIG9mIGVtcGxveWVlcyBmcm9tIFNhbGVzLCBTdXBwb3J0ICYgVGVjaG5pY2FsIGRlcGFydG1lbnQgaGFzIGxlZnQgb3JnYW5pemF0aW9uIHJlc3BlY3RpdmVseQ0KDQotLS0NCg0KIyMjIyAqKkRpc3RyaWJ1dGlvbiBvZiBWYXJpYWJsZXMgOiBIaXN0b2dyYW0qKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyh4PXNhdGlzZmFjdGlvbl9sZXZlbCkpICsNCiAgZmFjZXRfd3JhcCh+IGxlZnQpKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sID0gImJsdWUyIixiaW5zID0gNDApICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSxhcmdzID0gbGlzdChtZWFuPW1lYW4obGFzdF9ldmFsdWF0aW9uKSxzZD1zZChsYXN0X2V2YWx1YXRpb24pKSxjb2xvdXIgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBTYXRpc2ZhY3Rpb24gbGV2ZWwiLCB4ID0gImxlZnQiLCB5ID0gIlNhdGlzZmFjdGlvbiBsZXZlbCIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmxpYnJhcnkocHN5Y2gpDQpwcmludChkZXNjcmliZUJ5KEhSX0FuYWx5dGljcyRzYXRpc2ZhY3Rpb25fbGV2ZWwsZ3JvdXAgPSBIUl9BbmFseXRpY3MkbGVmdClbMToyXSkNCmBgYA0KDQoqIERpc3RyaWJ1dGlvbiBvZiBTYXRpc2ZhY3Rpb24gbGV2ZWxzIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBvcmdhbml6YXRpb24gYXBwZWFycyBub3JtYWwNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyh4PWxhc3RfZXZhbHVhdGlvbikpICsNCiAgZmFjZXRfd3JhcCh+IGxlZnQpKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sID0gImJsdWUyIiwgYmlucyA9IDQwKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sYXJncyA9IGxpc3QobWVhbj1tZWFuKGxhc3RfZXZhbHVhdGlvbiksc2Q9c2QobGFzdF9ldmFsdWF0aW9uKSksY29sb3VyID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTGFzdCBFdmFsdWF0aW9uIiwgeCA9ICJsZWZ0IiwgeSA9ICJMYXN0IEV2YWx1YXRpb24iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUwKSkNCmRldGFjaChIUl9BbmFseXRpY3MpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KcHJpbnQoZGVzY3JpYmVCeShIUl9BbmFseXRpY3MkbGFzdF9ldmFsdWF0aW9uLGdyb3VwID0gSFJfQW5hbHl0aWNzJGxlZnQpWzE6Ml0pDQpgYGANCg0KKiBEaXN0cmlidXRpb24gb2YgTGFzdCBFdmFsdWF0aW9uIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBvcmdhbml6YXRpb24gYXBwZWFycyBub3JtYWwNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyh4PW51bWJlcl9wcm9qZWN0KSkgKw0KICBmYWNldF93cmFwKH4gbGVmdCkrDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSxjb2wgPSAiYmx1ZTIiLCBiaW5zID0gMjApICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSxhcmdzID0gbGlzdChtZWFuPW1lYW4obnVtYmVyX3Byb2plY3QpLHNkPXNkKG51bWJlcl9wcm9qZWN0KSksY29sb3VyID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIFByb2plY3RzIiwgeCA9ICJsZWZ0IiwgeSA9ICJOdW1iZXIgb2YgUHJvamVjdCIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCnByaW50KGRlc2NyaWJlQnkoSFJfQW5hbHl0aWNzJG51bWJlcl9wcm9qZWN0LGdyb3VwID0gSFJfQW5hbHl0aWNzJGxlZnQpWzE6Ml0pDQpgYGANCg0KKiBEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIFByb2plY3RzIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBvcmdhbml6YXRpb24gYXBwZWFycyBub3JtYWwNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyh4PWF2ZXJhZ2VfbW9udGhseV9ob3VycykpICsNCiAgZmFjZXRfd3JhcCh+IGxlZnQpKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksY29sID0gImJsdWUyIiwgYmlucyA9IDQwKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuID0gZG5vcm0sYXJncyA9IGxpc3QobWVhbj1tZWFuKGF2ZXJhZ2VfbW9udGhseV9ob3Vycyksc2Q9c2QoYXZlcmFnZV9tb250aGx5X2hvdXJzKSksDQogICAgICAgICAgICAgICAgY29sb3VyID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgQXZlcmFnZSBNb250aGx5IEhvdXJzIiwgeCA9ICJsZWZ0IiwgeSA9ICJBdmVyYWdlIE1vbnRobHkgSG91cnMiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KZGV0YWNoKEhSX0FuYWx5dGljcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQpwcmludChkZXNjcmliZUJ5KEhSX0FuYWx5dGljcyRhdmVyYWdlX21vbnRobHlfaG91cnMsZ3JvdXAgPSBIUl9BbmFseXRpY3MkbGVmdClbMToyXSkNCmBgYA0KDQoqIERpc3RyaWJ1dGlvbiBvZiBBdmVyYWdlIE1vbnRobHkgaG91cnMgYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgJiBsZWZ0IGluL2Zyb20gdGhlIG9yZ2FuaXphdGlvbiBhcHBlYXJzIG5vcm1hbA0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KYXR0YWNoKEhSX0FuYWx5dGljcykNCmdncGxvdChIUl9BbmFseXRpY3MsYWVzKHg9dGltZV9zcGVuZF9jb21wYW55KSkgKw0KICBmYWNldF93cmFwKH4gbGVmdCkrDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSxjb2wgPSAiYmx1ZTIiLCBiaW5zID0gNDApICsNCiAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSxhcmdzID0gbGlzdChtZWFuPW1lYW4odGltZV9zcGVuZF9jb21wYW55KSxzZD1zZCh0aW1lX3NwZW5kX2NvbXBhbnkpKSxjb2xvdXIgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBUaW1lIFNwZW5kIGluIENvbXBhbnkiLCB4ID0gImxlZnQiLCB5ID0gIlRpbWUgU3BlbmQgaW4gQ29tcGFueSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCnByaW50KGRlc2NyaWJlQnkoSFJfQW5hbHl0aWNzJHRpbWVfc3BlbmRfY29tcGFueSxncm91cCA9IEhSX0FuYWx5dGljcyRsZWZ0KVsxOjJdKQ0KYGBgDQoNCiogRGlzdHJpYnV0aW9uIG9mIFRpbWUgU3BlbmQgaW4gQ29tcGFueSBvZiB0aGUgZW1wbG95ZWVzIHdobyByZXRhaW5lZCBhcHBlYXJzIHJpZ2h0IHNrZXdlZCAmIHdobyBsZWZ0IGFwcGVhcnMgbm9ybWFsDQoNCi0tLQ0KDQojIyMjICoqRGlzdHJpYnV0aW9uIG9mIFZhcmlhYmxlcyA6IEJveHBsb3QqKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQphdHRhY2goSFJfQW5hbHl0aWNzKQ0KZ2dwbG90KEhSX0FuYWx5dGljcyxhZXMobGVmdCxzYXRpc2ZhY3Rpb25fbGV2ZWwpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgU2F0aXNmYWN0aW9uIGxldmVsIiwgeCA9ICJsZWZ0IiwgeSA9ICJTYXRpc2ZhY3Rpb24gbGV2ZWwiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KZGV0YWNoKEhSX0FuYWx5dGljcykNCmBgYA0KDQoqIERpc3RyaWJ1dGlvbiBvZiBTYXRpc2ZhY3Rpb24gbGV2ZWxzIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBvcmdhbml6YXRpb24gYXBwZWFycyBub3JtYWwNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyhsZWZ0LGxhc3RfZXZhbHVhdGlvbikpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBMYXN0IEV2YWx1YXRpb24iLCB4ID0gImxlZnQiLCB5ID0gIkxhc3QgRXZhbHVhdGlvbiIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoqIERpc3RyaWJ1dGlvbiBvZiBMYXN0IEV2YWx1YXRpb24gYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgJiBsZWZ0IGluL2Zyb20gdGhlIG9yZ2FuaXphdGlvbiBhcHBlYXJzIG5vcm1hbA0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KYXR0YWNoKEhSX0FuYWx5dGljcykNCmdncGxvdChIUl9BbmFseXRpY3MsYWVzKGxlZnQsbnVtYmVyX3Byb2plY3QpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIFByb2plY3RzIiwgeCA9ICJsZWZ0IiwgeSA9ICJOdW1iZXIgb2YgUHJvamVjdCIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoqIDUwdGggJiA3NXRoIHBlcmNlbnRpbGUgb2YgZW1wbG95ZWVzIHdobyByZXRhaW5lZCBzaGFyZXMgc2FtZSBudW1iZXIgb2YgcHJvamVjdHMgd2l0aCBvbmUgb3V0bGllcig2KQ0KKiBEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIFByb2plY3RzIGFjcm9zcyBlbXBsb3llZXMgd2hvIGxlZnQgZnJvbSB0aGUgb3JnYW5pemF0aW9uIGFwcGVhcnMgbm9ybWFsDQoNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQphdHRhY2goSFJfQW5hbHl0aWNzKQ0KZ2dwbG90KEhSX0FuYWx5dGljcyxhZXMobGVmdCxhdmVyYWdlX21vbnRobHlfaG91cnMpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgQXZlcmFnZSBNb250aGx5IEhvdXJzIiwgeCA9ICJsZWZ0IiwgeSA9ICJBdmVyYWdlIE1vbnRobHkgSG91cnMiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KZGV0YWNoKEhSX0FuYWx5dGljcykNCmBgYA0KKiBEaXN0cmlidXRpb24gb2YgQXZlcmFnZSBNb250aGx5IEhvdXJzIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBvcmdhbml6YXRpb24gYXBwZWFycyBub3JtYWwNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLGFlcyhsZWZ0LHRpbWVfc3BlbmRfY29tcGFueSkpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBUaW1lIFNwZW5kIGluIENvbXBhbnkiLCB4ID0gImxlZnQiLCB5ID0gIlRpbWUgU3BlbmQgaW4gQ29tcGFueSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpkZXRhY2goSFJfQW5hbHl0aWNzKQ0KYGBgDQoqIERpc3RyaWJ1dGlvbiBvZiBBdmVyYWdlIE1vbnRobHkgSG91cnMgYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgYXBwZWFyZWQgcmlnaHQgc2tld2VkIHdpdGggb3V0bGllcnMNCiogRGlzdHJpYnV0aW9uIG9mIEF2ZXJhZ2UgTW9udGhseSBIb3VycyBhY3Jvc3MgZW1wbG95ZWVzIHdobyBsZWZ0IGFwcGVhcnMgbm9ybWFsDQoNCi0tLQ0KDQojIyMjICoqUmVsYXRpb25zaGlwIGJldHdlZW4gVmFyaWFibGVzIDogU2NhdHRlcnBsb3QqKg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQphdHRhY2goSFJfQW5hbHl0aWNzKQ0KZ2dwbG90KEhSX0FuYWx5dGljcywgYWVzKGxhc3RfZXZhbHVhdGlvbixzYXRpc2ZhY3Rpb25fbGV2ZWwpKSArDQogIGZhY2V0X3dyYXAofmxlZnQpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9bGVmdCkpICsNCiAgZ2VvbV9hYmxpbmUoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBMYXN0IEV2YWx1YXRpb24iLCANCiAgICAgICB4ID0gImxhc3QgZXZhbHVhdGlvbiIsIHkgPSAic2F0aXNmYWN0aW9uIGxldmVsIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmRldGFjaChIUl9BbmFseXRpY3MpDQpgYGANCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmxpYnJhcnkoZGF0YS50YWJsZSkNCkhSX0FuYWx5dGljcyA8LSBkYXRhLnRhYmxlKEhSX0FuYWx5dGljcykNCnByaW50KEhSX0FuYWx5dGljc1ssLihjb3Ioc2F0aXNmYWN0aW9uX2xldmVsLCBsYXN0X2V2YWx1YXRpb24pKSwgYnkgPSBsZWZ0XSkNCkhSX0FuYWx5dGljcyA8LSBkYXRhLmZyYW1lKEhSX0FuYWx5dGljcykNCnByaW50KGNvcihIUl9BbmFseXRpY3Mkc2F0aXNmYWN0aW9uX2xldmVsLEhSX0FuYWx5dGljcyRsYXN0X2V2YWx1YXRpb24pKQ0KYGBgDQoNCiogVGhlcmUgaXMgV2VhayByZWxhdGlvbnNoaXAgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBMYXN0IGV2YWx1YXRpb24gYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgJiBsZWZ0IGluL2Zyb20gdGhlIE9yZ2FuaXphdGlvbg0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KYXR0YWNoKEhSX0FuYWx5dGljcykNCmdncGxvdChIUl9BbmFseXRpY3MsIGFlcyhzY2FsZShIUl9BbmFseXRpY3MkbnVtYmVyX3Byb2plY3QpWywxXSxzY2FsZShIUl9BbmFseXRpY3Mkc2F0aXNmYWN0aW9uX2xldmVsKVssMV0pKSArDQogIGZhY2V0X3dyYXAofmxlZnQpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9bGVmdCkpICsNCiAgZ2VvbV9hYmxpbmUoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBOdW1iZXIgb2YgUHJvamVjdHMiLCANCiAgICAgICB4ID0gIk51bWJlciBvZiBQcm9qZWN0cyIsIHkgPSAic2F0aXNmYWN0aW9uIGxldmVsIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmRldGFjaChIUl9BbmFseXRpY3MpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KSFJfQW5hbHl0aWNzIDwtIGRhdGEudGFibGUoSFJfQW5hbHl0aWNzKQ0KcHJpbnQoSFJfQW5hbHl0aWNzWywuKGNvcihzYXRpc2ZhY3Rpb25fbGV2ZWwsIG51bWJlcl9wcm9qZWN0KSksIGJ5ID0gbGVmdF0pDQpIUl9BbmFseXRpY3MgPC0gZGF0YS5mcmFtZShIUl9BbmFseXRpY3MpDQpwcmludChjb3IoSFJfQW5hbHl0aWNzJHNhdGlzZmFjdGlvbl9sZXZlbCxIUl9BbmFseXRpY3MkbnVtYmVyX3Byb2plY3QpKQ0KYGBgDQoNCiogVGhlcmUgaXMgV2VhayByZWxhdGlvbnNoaXAgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBOdW1iZXIgb2YgUHJvamVjdHMgYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgJiBsZWZ0IGluL2Zyb20gdGhlIE9yZ2FuaXphdGlvbg0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KYXR0YWNoKEhSX0FuYWx5dGljcykNCmdncGxvdChIUl9BbmFseXRpY3MsIGFlcyhzY2FsZShhdmVyYWdlX21vbnRobHlfaG91cnMpWywxXSxzY2FsZShzYXRpc2ZhY3Rpb25fbGV2ZWwpWywxXSkpICsNCiAgZmFjZXRfd3JhcCh+bGVmdCkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvcj1sZWZ0KSkgKw0KICBnZW9tX2FibGluZShjb2xvciA9ICJyZWQiKSArDQogIGxhYnModGl0bGU9IlJlbGF0aW9uc2hpcCBiZXR3ZWVuIFNhdGlzZmFjdGlvbiBsZXZlbCAmIEF2ZXJhZ2UgTW9udGhseSBIb3VycyIsIA0KICAgICAgIHggPSAiYXZlcmFnZSBtb250aGx5IGhvdXJzIiwgeSA9ICJzYXRpc2ZhY3Rpb24gbGV2ZWwiKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KZGV0YWNoKEhSX0FuYWx5dGljcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQpIUl9BbmFseXRpY3MgPC0gZGF0YS50YWJsZShIUl9BbmFseXRpY3MpDQpwcmludChIUl9BbmFseXRpY3NbLC4oY29yKHNhdGlzZmFjdGlvbl9sZXZlbCwgYXZlcmFnZV9tb250aGx5X2hvdXJzKSksIGJ5ID0gbGVmdF0pDQpIUl9BbmFseXRpY3MgPC0gZGF0YS5mcmFtZShIUl9BbmFseXRpY3MpDQpwcmludChjb3IoSFJfQW5hbHl0aWNzJHNhdGlzZmFjdGlvbl9sZXZlbCxIUl9BbmFseXRpY3MkYXZlcmFnZV9tb250aGx5X2hvdXJzKSkNCmBgYA0KDQoqIFRoZXJlIGlzIFdlYWsgcmVsYXRpb25zaGlwIGJldHdlZW4gU2F0aXNmYWN0aW9uIGxldmVsICYgQXZlcmFnZSBNb250aGx5IEhvdXJzIGFjcm9zcyBlbXBsb3llZXMgd2hvIHJldGFpbmVkICYgbGVmdCBpbi9mcm9tIHRoZSBPcmdhbml6YXRpb24NCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmF0dGFjaChIUl9BbmFseXRpY3MpDQpnZ3Bsb3QoSFJfQW5hbHl0aWNzLCBhZXMoc2NhbGUodGltZV9zcGVuZF9jb21wYW55KVssMV0sc2NhbGUoc2F0aXNmYWN0aW9uX2xldmVsKVssMV0pKSArDQogIGZhY2V0X3dyYXAofmxlZnQpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9bGVmdCkpICsNCiAgZ2VvbV9hYmxpbmUoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlPSJSZWxhdGlvbnNoaXAgYmV0d2VlbiBTYXRpc2ZhY3Rpb24gbGV2ZWwgJiBUaW1lIFNwZW5kIGluIENvbXBhbnkiLCANCiAgICAgICB4ID0gInRpbWUgc3BlbmQgaW4gY29tcGFueSIsIHkgPSAic2F0aXNmYWN0aW9uIGxldmVsIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmRldGFjaChIUl9BbmFseXRpY3MpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KSFJfQW5hbHl0aWNzIDwtIGRhdGEudGFibGUoSFJfQW5hbHl0aWNzKQ0KcHJpbnQoSFJfQW5hbHl0aWNzWywuKGNvcihzYXRpc2ZhY3Rpb25fbGV2ZWwsIHRpbWVfc3BlbmRfY29tcGFueSkpLCBieSA9IGxlZnRdKQ0KSFJfQW5hbHl0aWNzIDwtIGRhdGEuZnJhbWUoSFJfQW5hbHl0aWNzKQ0KcHJpbnQoY29yKEhSX0FuYWx5dGljcyRzYXRpc2ZhY3Rpb25fbGV2ZWwsSFJfQW5hbHl0aWNzJHRpbWVfc3BlbmRfY29tcGFueSkpDQpgYGANCg0KKiBUaGVyZSBpcyBXZWFrIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFNhdGlzZmFjdGlvbiBsZXZlbCAmIFRpbWUgU3BlbmQgYWNyb3NzIGVtcGxveWVlcyB3aG8gcmV0YWluZWQgaW4gdGhlIE9yZ2FuaXphdGlvbg0KKiBUaGVyZSBpcyBmYWlybHkgc3Ryb25nIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFNhdGlzZmFjdGlvbiBsZXZlbCAmIFRpbWUgU3BlbmQgYWNyb3NzIGVtcGxveWVlcyB3aG8gbGVmdCBmcm9tIE9yZ2FuaXphdGlvbg0KDQotLS0NCg0KIyMjIyAqKlJlbGF0aW9uc2hpcCBiZXR3ZWVuIFZhcmlhYmxlcyhDb3JyZWxhdGlvbiBBbmFseXNpcykgOiBUZXRyYWNob3JpYyAmIFBvbHljaG9yaWMgQ29ycmVsYXRpb24qKiBbUmVmZXJlbmNlXShodHRwOi8vam9obi11ZWJlcnNheC5jb20vc3RhdC90ZXRyYS5odG0jdHNvZnQpDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmxpYnJhcnkocG9seWNvcikNCnBvbHljaG9yKHRhYmxlKEhSX0FuYWx5dGljcyRsZWZ0LEhSX0FuYWx5dGljcyRXb3JrX2FjY2lkZW50KSwgTUwgPSBULCBzdGQuZXJyID0gVCkNCmBgYA0KKiBUaGVyZSBpcyBmYWlybHkgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gZW1wbG95ZWVzIHdobyBsZWZ0ICYgd29yayBhY2NpZGVudA0KDQotLS0NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KcG9seWNob3IodGFibGUoSFJfQW5hbHl0aWNzJGxlZnQsSFJfQW5hbHl0aWNzJHByb21vdGlvbl9sYXN0XzV5ZWFycyksIE1MID0gVCwgc3RkLmVyciA9IFQpDQpgYGANCiogVGhlcmUgaXMgZmFpcmx5IG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVtcGxveWVlcyB3aG8gbGVmdCAmIGdpdmVuIHByb21vdGlvbiBpbiBsYXN0IDUteWVhcnMNCg0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCnBvbHljaG9yKHRhYmxlKEhSX0FuYWx5dGljcyRsZWZ0LEhSX0FuYWx5dGljcyRzYWxhcnkpLCBNTCA9IFQsIHN0ZC5lcnIgPSBUKQ0KYGBgDQoqIFRoZXJlIGlzIHdlYWsgbmVnYXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gZW1wbG95ZWVzIHdobyBsZWZ0ICYgc2FsYXJ5IGJyZWFrLXVwDQoNCi0tLQ0KDQojIyMjICoqQ29ycmVsYXRpb24gTWF0cml4KioNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KY29yKEhSX0FuYWx5dGljc1tzYXBwbHkoSFJfQW5hbHl0aWNzLGlzLm51bWVyaWMpXSkNCmBgYA0KKiBJbiBnZW5lcmFsLCB0aGVyZSBpcyBubyBzdHJvbmcgY29ycmVsYXRpb24gZXhpc3RzIGJldHdlZW4gdmFyaWFibGVzDQoNCi0tLQ0KDQojIyMjICoqQU5PVkEqKg0KIyMjIyMgTnVsbCBIeXBvdGhlc2lzOiBUaGVyZSBpcyBOTyBzaWduaWZpY2FudCByZWxhdGlvbnNoaXAgYmV0d2VlbiBtZWFucyhTTCkgb2YgZ3JvdXBzIG9mIGxlZnQgJiBvdGhlciBhdHRyaWJ1dGVzDQojIyMjIyBBbHRlcm5hdGUgSHlwb3RoZXNpczogVGhlcmUgaXMgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gbWVhbnMoU0wpIG9mIGdyb3VwcyBvZiBsZWZ0ICYgb3RoZXIgYXR0cmlidXRlcw0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQphbm92YShsbShzYXRpc2ZhY3Rpb25fbGV2ZWwgfiBXb3JrX2FjY2lkZW50K3Byb21vdGlvbl9sYXN0XzV5ZWFycytzYWxhcnksIGRhdGEgPSBIUl9BbmFseXRpY3MpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NClR1a2V5SFNEKGFvdihzYXRpc2ZhY3Rpb25fbGV2ZWwgfiBXb3JrX2FjY2lkZW50K3Byb21vdGlvbl9sYXN0XzV5ZWFycytzYWxhcnksIGRhdGEgPSBIUl9BbmFseXRpY3MpKQ0KYGBgDQoNCiMjIyMjICoqSW5zaWdodHMqKg0KDQoqIFRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgbWVhbnMgb2Ygc2F0aXNmYWN0aW9uIGxldmVsIGFnYWluc3Qgd29yayBhY2NpZGVudCwgcHJvbW90aW9uIGxhc3QgNS15ZWFycyAmIHNhbGFyeShsb3ctaGlnaCxtZWRpdW0tbG93KQ0KKiBIb3dldmVyLCB0aGVyZSBpcyBvbmx5IDg0JSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRoZSBtZWFucyBvZiBzYXRpc2ZhY3Rpb24gbGV2ZWwgYWdhaW5zdCBtZWRpdW0taGlnaCBzYWxhcnkgYnVja2V0DQoNCi0tLQ0KDQojIyMjICoqUHJpbmNpcGFsIENvbXBvbmVudCBBbmFseXNpcyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBQQ0ENClBDQSA8LSBwcmNvbXAoSFJfQW5hbHl0aWNzW3NhcHBseShIUl9BbmFseXRpY3MsaXMubnVtZXJpYyldWzI6NV0sY29yPVRSVUUsIHNjYWxlLiA9IFRSVUUsIHJldHggPSBUUlVFKTtQQ0ENCnN1bW1hcnkoUENBKQ0KI1RoZSBsb2FkaW5ncyBmb3IgdGhlIHByaW5jaXBhbCBjb21wb25lbnRzIGFyZSBzdG9yZWQgaW46DQojcHJpbnQoUENBJHJvdGF0aW9uKSAjIHdpdGggcHJpbmNvbXAoKTogcGNhJGxvYWRpbmdzDQoNCiNwbG90IG9mIHZhcmlhbmNlIG9mIGVhY2ggUENBLiBJdCB3aWxsIGJlIHVzZWZ1bCB0byBkZWNpZGUgaG93IG1hbnkgcHJpbmNpcGFsIGNvbXBvbmVudHMgc2hvdWxkIGJlIHJldGFpbmVkLg0Kc2NyZWVwbG90KFBDQSwgdHlwZT0ibGluZXMiLGNvbD0zKSAjIDMtY29tcG9uZW50cyBjYW4gYmUgcmV0YWluZWQNCg0KI2JpcGxvdCBvZiBmaXJzdCB0d28gcHJpbmNpcGFsIGNvbXBvbmVudHMNCmJpcGxvdChQQ0EsY2V4PTAuOCkNCmFibGluZShoID0gMCwgdiA9IDAsIGx0eSA9IDIsIGNvbCA9IDgpDQp0aXRsZSgiQmktUGxvdCIpDQoNCiMgSWRlbnRpZnkgd2hpY2ggdmFyaWFibGUgdG8gZHJvcA0KbGlicmFyeShyYXN0ZXIpDQpwcmludCh0KGxhcHBseShIUl9BbmFseXRpY3Nbc2FwcGx5KEhSX0FuYWx5dGljcyxpcy5udW1lcmljKV0sc2QpKSkNCnByaW50KHQobGFwcGx5KEhSX0FuYWx5dGljc1tzYXBwbHkoSFJfQW5hbHl0aWNzLGlzLm51bWVyaWMpXSxjdikpKQ0KDQpgYGANCg0KKiBEcm9wIHRpbWVfc3BlbmRfY29tcGFueSB2YXJpYWJsZSAmIGNvbnRpbnVlIHRyYW5zZm9ybWF0aW9uIHdpdGggZmlyc3QtMy1jb21wb25lbnRzDQoNCiogTm90ZTogQXMgdGhlcmUgYXJlIG9ubHkgZmV3IFZhcmlhYmxlcywgUENBIGlzIHVuYWJsZS9ub3Qtc3VpdGFibGUgdG8gZXhwbGFpbiBtb3JlIHZhcmlhbmNlcy4gSGVuY2UgcmVncmVzc2lvbiBtaWdodCBub3QgYmUgcHJlZmVyZWQgb24gUENBIGxvYWRpbmdzDQoNCi0tLQ0KDQojIyMjICoqTGluZWFyIFJlZ3Jlc3Npb24qKg0KIyMjIyMgTnVsbCBIeXBvdGhlc2lzOiBUaGVyZSBpcyBOTyBzaWduaWZpY2FudCByZWxhdGlvbnNoaXAgYmV0d2VlbiBzYXRpc2ZhY3Rpb24gbGV2ZWwgJiBvdGhlciBhdHRyaWJ1dGVzDQojIyMjIyBBbHRlcm5hdGUgSHlwb3RoZXNpczogVGhlcmUgaXMgc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gc2F0aXNmYWN0aW9uIGxldmVsICYgb3RoZXIgYXR0cmlidXRlcw0KDQojIyMjIyAqKlNpbXBsZS9TdHJhdGlmaWVkIFJhbmRvbSBTYW1wbGluZyoqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5ncz1GQUxTRX0NCmxpYnJhcnkoc2FtcGxpbmcpDQpIUl9BbmFseXRpY3NfVHJhbnMgPC0gZGF0YS5mcmFtZShQQ0EkeFssMTozXSkNCm5hbWVzKEhSX0FuYWx5dGljc19UcmFucykgPC0gbmFtZXMoSFJfQW5hbHl0aWNzKVsyOjRdDQpIUl9BbmFseXRpY3NfVHJhbnNfRmluYWwgPC0gY2JpbmQoc2F0aXNmYWN0aW9uX2xldmVsPUhSX0FuYWx5dGljcyRzYXRpc2ZhY3Rpb25fbGV2ZWwsSFJfQW5hbHl0aWNzX1RyYW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhSX0FuYWx5dGljc1tjKCJXb3JrX2FjY2lkZW50IiwicHJvbW90aW9uX2xhc3RfNXllYXJzIiwic2FsYXJ5IildKQ0KDQpIUl9BbmFseXRpY3NfVHJhbnNfRmluYWxfRlQgPC0gZGF0YS5mcmFtZSh0YWJsZShIUl9BbmFseXRpY3NfVHJhbnNfRmluYWwkc2FsYXJ5KSkNCkhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVCRQZXIgPC0gKEhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVCRGcmVxL3N1bShIUl9BbmFseXRpY3NfVHJhbnNfRmluYWxfRlQkRnJlcSkpKjEwMA0KbmFtZXMoSFJfQW5hbHl0aWNzX1RyYW5zX0ZpbmFsX0ZUKVsxXSA8LSAic2FsYXJ5Ig0KDQojIENvbnNpZGVyIDcwJSBvZiB0aGUgZGF0YSBhcyBzYW1wbGUNCkhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVCRTdHJhdGFfU2l6ZSA8LSBjZWlsaW5nKChIUl9BbmFseXRpY3NfVHJhbnNfRmluYWxfRlQkRnJlcSooY2VpbGluZygoZGltKEhSX0FuYWx5dGljc19UcmFuc19GaW5hbClbMV0vMTAwKSo3MCkvc3VtKEhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVCRGcmVxKSkpKQ0KSFJfQW5hbHl0aWNzX1RyYW5zX0ZpbmFsX0ZUIDwtIHdpdGgoSFJfQW5hbHl0aWNzX1RyYW5zX0ZpbmFsX0ZULEhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVFtvcmRlcihTdHJhdGFfU2l6ZSxkZWNyZWFzaW5nID0gVFJVRSksXSkNCg0KIyBTdHJhdGlmaWNhdGlvbg0KSFJfQW5hbHl0aWNzX1RyYW5zX0ZpbmFsX1N0cmF0YSA8LSBzdHJhdGEoSFJfQW5hbHl0aWNzX1RyYW5zX0ZpbmFsLGMoInNhbGFyeSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IEhSX0FuYWx5dGljc19UcmFuc19GaW5hbF9GVCRTdHJhdGFfU2l6ZSwgbWV0aG9kID0gInNyc3dvciIpDQpIUl9BbmFseXRpY3NfVHJhbnNfU3RSUyA8LSBnZXRkYXRhKEhSX0FuYWx5dGljc19UcmFuc19GaW5hbCxIUl9BbmFseXRpY3NfVHJhbnNfRmluYWxfU3RyYXRhKQ0KaGVhZChIUl9BbmFseXRpY3NfVHJhbnNfU3RSUykNCmBgYA0KDQojIyMjIyAqKkxpbmVhciBNb2RlbCoqIFtSZWZlcmVuY2VdKGh0dHA6Ly9zdGF0dHJlay5jb20vcmVncmVzc2lvbi9saW5lYXItdHJhbnNmb3JtYXRpb24uYXNweD9UdXRvcmlhbD1BUCkNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmdzPUZBTFNFfQ0KIyBMaW5lYXIgTW9kZWwNCnN1bW1hcnkobG0oc2F0aXNmYWN0aW9uX2xldmVsIH4gbGFzdF9ldmFsdWF0aW9uK251bWJlcl9wcm9qZWN0K2F2ZXJhZ2VfbW9udGhseV9ob3VycytXb3JrX2FjY2lkZW50Kw0KICAgICAgICAgICAgIHByb21vdGlvbl9sYXN0XzV5ZWFycytzYWxhcnksIGRhdGEgPSBIUl9BbmFseXRpY3NfVHJhbnNfU3RSUykpDQpwYXIobWZyb3cgPSBjKDIsMikpDQpwbG90KGxtKHNhdGlzZmFjdGlvbl9sZXZlbCB+IGxhc3RfZXZhbHVhdGlvbitudW1iZXJfcHJvamVjdCthdmVyYWdlX21vbnRobHlfaG91cnMrV29ya19hY2NpZGVudCsNCiAgICAgICAgICAgICBwcm9tb3Rpb25fbGFzdF81eWVhcnMrc2FsYXJ5LCBkYXRhID0gSFJfQW5hbHl0aWNzX1RyYW5zX1N0UlMpKQ0KYGBgDQoNCi0tLQ0KDQpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZ3M9RkFMU0V9DQojIFRyYW5zZm9ybWF0aW9uIG1ldGhvZHM6IExpbmVhciBNb2RlbA0Kc3VtbWFyeShsbShsb2coc2F0aXNmYWN0aW9uX2xldmVsKSB+IGxhc3RfZXZhbHVhdGlvbitudW1iZXJfcHJvamVjdCthdmVyYWdlX21vbnRobHlfaG91cnMrV29ya19hY2NpZGVudCsNCiAgICAgICAgICAgICBwcm9tb3Rpb25fbGFzdF81eWVhcnMrc2FsYXJ5LCBkYXRhID0gSFJfQW5hbHl0aWNzX1RyYW5zX1N0UlMpKQ0KcGFyKG1mcm93ID0gYygyLDIpKQ0KcGxvdChsbShleHAoc2F0aXNmYWN0aW9uX2xldmVsKSB+IGxhc3RfZXZhbHVhdGlvbitudW1iZXJfcHJvamVjdCthdmVyYWdlX21vbnRobHlfaG91cnMrV29ya19hY2NpZGVudCsNCiAgICAgICAgICAgICBwcm9tb3Rpb25fbGFzdF81eWVhcnMrc2FsYXJ5LCBkYXRhID0gSFJfQW5hbHl0aWNzX1RyYW5zX1N0UlMpKQ0KYGBgDQoNCiMjIyMjICoqSW5zaWdodHMqKg0KDQoqIExvZy10cmFuc2Zvcm1hdGlvbiBpcyBzdWNjZXNzZnVsLiBIb3dldmVyLCBvdmVyYWxsIHZhcmFpdGlvbnMgZXhwbGFpbmVkIGJ5IHRoZSBtb2RlbCBpcyBqdXN0IH4xMCUofjUlKS4gSGVuY2UgbW9kZWwgd2lsbCBoYXZlIHBvb3IgcHJlZGljdGlvbiBwb3dlcg0KKiBTaW5jZSBwPDAuMDUsIHdlIHJlamVjdCBOSCAmIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYSBzaWduZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNhdGlzZmFjdGlvbiBsZXZlbCAmIG90aGVyIGF0dHJpYnV0ZXMNCg==