Introduction

In this assignment, I will be utilizing Zelig 5 syntax to interpret the probability of IBM employee attrition by simulation. The data set, which was retrieved from Kaggle, contains 1,470 observations and 35 variables. The binary outcome variable is attrition (“Yes”/“No”) and there are 33 possible predictor variables. This analysis will examine the relationship between attrition and the following predictors: age, number of companies worked, and overtime. The goal is to be able to answer the following questions: What effect does age have on the probability of attrition? How does the number of companies an employee has worked for affect their likelihood of leaving IBM? Finally, what impact does working overtime have?


Data and Variables

The variables used in this analysis are as follows:

head(AttritionDataset3)

Descriptive Analysis

Age

The majority of employees in this data set appear to be between the ages 30 and 40.

library(ggplot2)
ggplot (AttritionDataset3, aes (x = Age)) + geom_histogram()


Number of Companies Worked

Most employees have worked for one other company prior to IBM.

ggplot (AttritionDataset3, aes (x = NumCompaniesWorked)) + geom_bar()


Overtime

The vast majority of employees at IBM do not regularly work overtime.

ggplot (AttritionDataset3, aes (x = OverTime)) + geom_bar()


Estimating the Model

This regression model estimates the effect of age, the number of companies worked, and whether or not an employee works overtime on the probability of attrition. A square term of the variable, age, was included to account for non-linearity. Further analysis will be done after graphing the simulation. For the rest of the predictor variables, working at more companies prior to IBM increases the probability of attrition by 0.14, and the relationship is statistically significant. The model estimation also shows working overtime to increase the probability of attrition by 1.45; the results are statistically significant.

z5attrition <- zlogit$new()
z5attrition$zelig(Attrition ~ Age + I(Age^2) + NumCompaniesWorked + OverTime, data = AttritionDataset3)
summary(z5attrition)
Model: 

Call:
z5attrition$zelig(formula = Attrition ~ Age + I(Age^2) + NumCompaniesWorked + 
    OverTime, data = AttritionDataset3)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-1.6300  -0.5961  -0.4157  -0.3143   2.5680  

Coefficients:
                     Estimate Std. Error z value             Pr(>|z|)
(Intercept)         4.4242991  0.9875380   4.480        0.00000745975
Age                -0.3286633  0.0546210  -6.017        0.00000000178
I(Age^2)            0.0034658  0.0007076   4.898        0.00000096929
NumCompaniesWorked  0.1387759  0.0305315   4.545        0.00000548488
OverTimeYes         1.4511580  0.1549134   9.368 < 0.0000000000000002

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 1298.6  on 1469  degrees of freedom
Residual deviance: 1132.5  on 1465  degrees of freedom
AIC: 1142.5

Number of Fisher Scoring iterations: 5

Next step: Use 'setx' method

Setting Parameters, Generating Simulations, and Plotting/Summarizing

Effect of Age on Attrition

The simulation results indicate that as employees get older, the probability of leaving IBM decreases. However, this is only the case until around 50 years old, at which point the probability of attrition begins to increase again as depicted in the figure below.

z5attrition$setrange(Age = min(AttritionDataset3$Age):max (AttritionDataset3$Age))
z5attrition$sim()
z5attrition$graph()
Age chosen as the x-axis variable. Use the var argument to specify a different variable.


Effect of Number of Companies Worked on Attrition

Employees who have worked in more companies have a higher probability of attrition. In other words, those who have switched more companies are more likely to leave IBM as well.

z5attrition$setrange(NumCompaniesWorked = min(AttritionDataset3$NumCompaniesWorked):max (AttritionDataset3$NumCompaniesWorked))
z5attrition$sim()
z5attrition$graph()
NumCompaniesWorked chosen as the x-axis variable. Use the var argument to specify a different variable.


Effect of Working Overtime on Attrition

For the purpose of simplicity, I created a separate model object to examine the effect of working overtime on attrition. The results from the simulation indicate that the probability of leaving IBM is higher among those who work overtime, with a first difference of -0.17.

z5OverTime <- zlogit$new()
z5OverTime$zelig(Attrition ~ Age + I(Age^2) + NumCompaniesWorked + OverTime, data = AttritionDataset3)
z5OverTime$setx(OverTime = "Yes")
z5OverTime$setx1(OverTime = "No")
z5OverTime$sim()
summary(z5OverTime)

 sim x :
 -----
ev
          mean         sd       50%      2.5%     97.5%
[1,] 0.2382665 0.02392028 0.2375257 0.1941806 0.2886036
pv
         0     1
[1,] 0.777 0.223

 sim x1 :
 -----
ev
           mean          sd        50%       2.5%      97.5%
[1,] 0.06870589 0.008498964 0.06826441 0.05401017 0.08703405
pv
         0     1
[1,] 0.941 0.059
fd
           mean         sd        50%       2.5%     97.5%
[1,] -0.1695606 0.02268267 -0.1689708 -0.2187875 -0.126963
plot(z5OverTime)


Analysis of Results

This logistic regression model examined the effect of age, the number of companies worked, and whether or not an employee works overtime on the probability of attrition. Unlike the model in the previous assignment, I included a square term of the variable, age, in order to account for non-linearity. The simulation results indicate that as employees get older, they become less likely to leave IBM. However, the effect starts to reverse around age 50, at which point the probability of attrition begins to increase again. This increase is to be expected as employees get closer to retirement age. In addition, the results suggest that employees who have worked in more companies have a higher probability of attrition. In other words, those who have switched more companies are more likely to leave IBM as well. More work needs to be done by IBM in figuring out how to best retain these particular employees. Lastly, in terms of the effect of working overtime on attrition, the results indicate that the probability of attrition for employees who work overtime is higher than that for those who do not, with a first difference of -0.17.

LS0tDQp0aXRsZTogIlNvYyA3MTIgSG9tZXdvcmsgIzZiIC0gQW5hbHl6aW5nIElCTSBFbXBsb3llZSBBdHRyaXRpb24gdXNpbmcgWmVsaWcgNSBzeW50YXgiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQotLS0NCg0KIyMgSW50cm9kdWN0aW9uIA0KDQpJbiB0aGlzIGFzc2lnbm1lbnQsIEkgd2lsbCBiZSB1dGlsaXppbmcgWmVsaWcgNSBzeW50YXggdG8gaW50ZXJwcmV0IHRoZSBwcm9iYWJpbGl0eSBvZiBJQk0gZW1wbG95ZWUgYXR0cml0aW9uIGJ5IHNpbXVsYXRpb24uIFRoZSBkYXRhIHNldCwgd2hpY2ggd2FzIHJldHJpZXZlZCBmcm9tIEthZ2dsZSwgY29udGFpbnMgMSw0NzAgb2JzZXJ2YXRpb25zIGFuZCAzNSB2YXJpYWJsZXMuIFRoZSBiaW5hcnkgb3V0Y29tZSB2YXJpYWJsZSBpcyBhdHRyaXRpb24gKCJZZXMiLyJObyIpIGFuZCB0aGVyZSBhcmUgMzMgcG9zc2libGUgcHJlZGljdG9yIHZhcmlhYmxlcy4gVGhpcyBhbmFseXNpcyB3aWxsIGV4YW1pbmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGF0dHJpdGlvbiBhbmQgdGhlIGZvbGxvd2luZyBwcmVkaWN0b3JzOiAqYWdlKiwgKm51bWJlciBvZiBjb21wYW5pZXMgd29ya2VkKiwgYW5kICpvdmVydGltZSouIFRoZSBnb2FsIGlzIHRvIGJlIGFibGUgdG8gYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zOiBXaGF0IGVmZmVjdCBkb2VzIGFnZSBoYXZlIG9uIHRoZSBwcm9iYWJpbGl0eSBvZiBhdHRyaXRpb24/IEhvdyBkb2VzIHRoZSBudW1iZXIgb2YgY29tcGFuaWVzIGFuIGVtcGxveWVlIGhhcyB3b3JrZWQgZm9yIGFmZmVjdCB0aGVpciBsaWtlbGlob29kIG9mIGxlYXZpbmcgSUJNPyBGaW5hbGx5LCB3aGF0IGltcGFjdCBkb2VzIHdvcmtpbmcgb3ZlcnRpbWUgaGF2ZT8gDQoNCi0tLQ0KDQojIyBEYXRhIGFuZCBWYXJpYWJsZXMNCg0KVGhlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgYW5hbHlzaXMgYXJlIGFzIGZvbGxvd3M6DQoNCiogKipBdHRyaXRpb24qKiAtIEF0dHJpdGlvbiB3aWxsIHNlcnZlIGFzIHRoZSBvdXRjb21lIHZhcmlhYmxlO3RoZSByZXNwb25zZXMgYXJlIGVpdGhlciAiWWVzIiBvciAiTm8iLg0KKiAqKkFnZSoqIC0gVGhpcyB2YXJpYWJsZSBtZWFzdXJlcyB0aGUgZW1wbG95ZWUncyBhZ2UuDQoqICoqTnVtQ29tcGFuaWVzV29ya2VkKiogLSBUaGlzIHZhcmlhYmxlIHJlY29yZHMgdGhlIG51bWJlciBvZiBjb21wYW5pZXMgYW4gZW1wbG95ZWUgaGFzIHdvcmtlZCBmb3IgcHJpb3IgdG8gSUJNLiANCiogKipPdmVyVGltZSoqIC0gVGhpcyB2YXJpYWJsZSBkZXNjcmliZXMgd2hldGhlciBvciBub3QgdGhlIGVtcGxveWVlIHJlZ3VsYXJseSB3b3JrcyBvdmVydGltZTsgdGhlIHJlc3BvbnNlcyBhcmUgZWl0aGVyICJZZXMiIG9yICJObyIuIA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxpYnJhcnkocmVhZHIpDQpBdHRyaXRpb25EYXRhc2V0IDwtIHJlYWRfY3N2KCJDOi9Vc2Vycy9SYXZlbi9EZXNrdG9wL0F0dHJpdGlvbkRhdGFzZXQueGxzIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpBdHRyaXRpb25EYXRhc2V0MyA8LSBzZWxlY3QoQXR0cml0aW9uRGF0YXNldCwgDQogICAgICAgICAgICAgICBBdHRyaXRpb24sIEFnZSwgTnVtQ29tcGFuaWVzV29ya2VkLCBPdmVyVGltZSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCkF0dHJpdGlvbkRhdGFzZXQzJEF0dHJpdGlvbiA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihBdHRyaXRpb25EYXRhc2V0MyRBdHRyaXRpb24pKQ0KQXR0cml0aW9uRGF0YXNldDMkT3ZlclRpbWUgPC0gYXMuZmFjdG9yKEF0dHJpdGlvbkRhdGFzZXQzJE92ZXJUaW1lKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KQXR0cml0aW9uRGF0YXNldDMgPC0gbXV0YXRlKEF0dHJpdGlvbkRhdGFzZXQzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpdGlvbiA9IHNqbWlzYzo6cmVjKEF0dHJpdGlvbiwgcmVjID0gIjI9MTsgMT0wIikpDQpgYGANCg0KDQpgYGB7cn0NCmhlYWQoQXR0cml0aW9uRGF0YXNldDMpDQpgYGANCg0KLS0tDQoNCiMjICBEZXNjcmlwdGl2ZSBBbmFseXNpcw0KDQoqKkFnZSoqDQoNClRoZSBtYWpvcml0eSBvZiBlbXBsb3llZXMgaW4gdGhpcyBkYXRhIHNldCBhcHBlYXIgdG8gYmUgYmV0d2VlbiB0aGUgYWdlcyAzMCBhbmQgNDAuDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdCAoQXR0cml0aW9uRGF0YXNldDMsIGFlcyAoeCA9IEFnZSkpICsgZ2VvbV9oaXN0b2dyYW0oKQ0KYGBgDQoNCi0tLQ0KDQoqKk51bWJlciBvZiBDb21wYW5pZXMgV29ya2VkKioNCg0KTW9zdCBlbXBsb3llZXMgaGF2ZSB3b3JrZWQgZm9yIG9uZSBvdGhlciBjb21wYW55IHByaW9yIHRvIElCTS4gIA0KYGBge3J9DQpnZ3Bsb3QgKEF0dHJpdGlvbkRhdGFzZXQzLCBhZXMgKHggPSBOdW1Db21wYW5pZXNXb3JrZWQpKSArIGdlb21fYmFyKCkNCmBgYA0KDQotLS0NCg0KKipPdmVydGltZSoqDQoNClRoZSB2YXN0IG1ham9yaXR5IG9mIGVtcGxveWVlcyBhdCBJQk0gZG8gKm5vdCogcmVndWxhcmx5IHdvcmsgb3ZlcnRpbWUuDQpgYGB7cn0NCmdncGxvdCAoQXR0cml0aW9uRGF0YXNldDMsIGFlcyAoeCA9IE92ZXJUaW1lKSkgKyBnZW9tX2JhcigpDQpgYGANCg0KLS0tDQoNCiMjIEVzdGltYXRpbmcgdGhlIE1vZGVsIA0KDQpUaGlzIHJlZ3Jlc3Npb24gbW9kZWwgZXN0aW1hdGVzIHRoZSBlZmZlY3Qgb2YgYWdlLCB0aGUgbnVtYmVyIG9mIGNvbXBhbmllcyB3b3JrZWQsIGFuZCB3aGV0aGVyIG9yIG5vdCBhbiBlbXBsb3llZSB3b3JrcyBvdmVydGltZSBvbiB0aGUgcHJvYmFiaWxpdHkgb2YgYXR0cml0aW9uLiBBIHNxdWFyZSB0ZXJtIG9mIHRoZSB2YXJpYWJsZSwgYWdlLCB3YXMgaW5jbHVkZWQgdG8gYWNjb3VudCBmb3Igbm9uLWxpbmVhcml0eS4gRnVydGhlciBhbmFseXNpcyB3aWxsIGJlIGRvbmUgYWZ0ZXIgZ3JhcGhpbmcgdGhlIHNpbXVsYXRpb24uIEZvciB0aGUgcmVzdCBvZiB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcywgd29ya2luZyBhdCBtb3JlIGNvbXBhbmllcyBwcmlvciB0byBJQk0gaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eSBvZiBhdHRyaXRpb24gYnkgMC4xNCwgYW5kIHRoZSByZWxhdGlvbnNoaXAgaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gVGhlIG1vZGVsIGVzdGltYXRpb24gYWxzbyBzaG93cyB3b3JraW5nIG92ZXJ0aW1lIHRvIGluY3JlYXNlIHRoZSBwcm9iYWJpbGl0eSBvZiBhdHRyaXRpb24gYnkgMS40NTsgdGhlIHJlc3VsdHMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIA0KDQpgYGB7cn0NCno1YXR0cml0aW9uIDwtIHpsb2dpdCRuZXcoKQ0KejVhdHRyaXRpb24kemVsaWcoQXR0cml0aW9uIH4gQWdlICsgSShBZ2VeMikgKyBOdW1Db21wYW5pZXNXb3JrZWQgKyBPdmVyVGltZSwgZGF0YSA9IEF0dHJpdGlvbkRhdGFzZXQzKQ0Kc3VtbWFyeSh6NWF0dHJpdGlvbikNCmBgYA0KDQoNCi0tLQ0KDQojI1NldHRpbmcgUGFyYW1ldGVycywgR2VuZXJhdGluZyBTaW11bGF0aW9ucywgYW5kIFBsb3R0aW5nL1N1bW1hcml6aW5nDQoNCiMjI0VmZmVjdCBvZiBBZ2Ugb24gQXR0cml0aW9uIA0KICANClRoZSBzaW11bGF0aW9uIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCBhcyBlbXBsb3llZXMgZ2V0IG9sZGVyLCB0aGUgcHJvYmFiaWxpdHkgb2YgbGVhdmluZyBJQk0gZGVjcmVhc2VzLiBIb3dldmVyLCB0aGlzIGlzIG9ubHkgdGhlIGNhc2UgdW50aWwgYXJvdW5kIDUwIHllYXJzIG9sZCwgYXQgd2hpY2ggcG9pbnQgdGhlIHByb2JhYmlsaXR5IG9mIGF0dHJpdGlvbiBiZWdpbnMgdG8gaW5jcmVhc2UgYWdhaW4gYXMgZGVwaWN0ZWQgaW4gdGhlIGZpZ3VyZSBiZWxvdy4NCg0KYGBge3J9DQp6NWF0dHJpdGlvbiRzZXRyYW5nZShBZ2UgPSBtaW4oQXR0cml0aW9uRGF0YXNldDMkQWdlKTptYXggKEF0dHJpdGlvbkRhdGFzZXQzJEFnZSkpDQp6NWF0dHJpdGlvbiRzaW0oKQ0KejVhdHRyaXRpb24kZ3JhcGgoKQ0KYGBgDQoNCi0tLQ0KDQojIyNFZmZlY3Qgb2YgTnVtYmVyIG9mIENvbXBhbmllcyBXb3JrZWQgb24gQXR0cml0aW9uIA0KDQpFbXBsb3llZXMgd2hvIGhhdmUgd29ya2VkIGluIG1vcmUgY29tcGFuaWVzIGhhdmUgYSBoaWdoZXIgcHJvYmFiaWxpdHkgb2YgYXR0cml0aW9uLiBJbiBvdGhlciB3b3JkcywgdGhvc2Ugd2hvIGhhdmUgc3dpdGNoZWQgbW9yZSBjb21wYW5pZXMgYXJlIG1vcmUgbGlrZWx5IHRvIGxlYXZlIElCTSBhcyB3ZWxsLiAgIA0KDQpgYGB7cn0NCno1YXR0cml0aW9uJHNldHJhbmdlKE51bUNvbXBhbmllc1dvcmtlZCA9IG1pbihBdHRyaXRpb25EYXRhc2V0MyROdW1Db21wYW5pZXNXb3JrZWQpOm1heCAoQXR0cml0aW9uRGF0YXNldDMkTnVtQ29tcGFuaWVzV29ya2VkKSkNCno1YXR0cml0aW9uJHNpbSgpDQp6NWF0dHJpdGlvbiRncmFwaCgpDQpgYGANCg0KLS0tDQoNCiMjI0VmZmVjdCBvZiBXb3JraW5nIE92ZXJ0aW1lIG9uIEF0dHJpdGlvbiANCg0KRm9yIHRoZSBwdXJwb3NlIG9mIHNpbXBsaWNpdHksIEkgY3JlYXRlZCBhIHNlcGFyYXRlIG1vZGVsIG9iamVjdCB0byBleGFtaW5lIHRoZSBlZmZlY3Qgb2Ygd29ya2luZyBvdmVydGltZSBvbiBhdHRyaXRpb24uIFRoZSByZXN1bHRzIGZyb20gdGhlIHNpbXVsYXRpb24gaW5kaWNhdGUgdGhhdCB0aGUgcHJvYmFiaWxpdHkgb2YgbGVhdmluZyBJQk0gaXMgaGlnaGVyIGFtb25nIHRob3NlIHdobyB3b3JrIG92ZXJ0aW1lLCB3aXRoIGEgZmlyc3QgZGlmZmVyZW5jZSBvZiAqKi0wLjE3KiouDQoNCmBgYHtyfQ0KejVPdmVyVGltZSA8LSB6bG9naXQkbmV3KCkNCno1T3ZlclRpbWUkemVsaWcoQXR0cml0aW9uIH4gQWdlICsgSShBZ2VeMikgKyBOdW1Db21wYW5pZXNXb3JrZWQgKyBPdmVyVGltZSwgZGF0YSA9IEF0dHJpdGlvbkRhdGFzZXQzKQ0KejVPdmVyVGltZSRzZXR4KE92ZXJUaW1lID0gIlllcyIpDQp6NU92ZXJUaW1lJHNldHgxKE92ZXJUaW1lID0gIk5vIikNCno1T3ZlclRpbWUkc2ltKCkNCnN1bW1hcnkoejVPdmVyVGltZSkNCmBgYA0KDQpgYGB7ciBmaWcuaGVpZ2h0PTh9DQpwbG90KHo1T3ZlclRpbWUpDQpgYGANCg0KLS0tDQoNCiMjQW5hbHlzaXMgb2YgUmVzdWx0cyANCg0KVGhpcyBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIGV4YW1pbmVkIHRoZSBlZmZlY3Qgb2YgYWdlLCB0aGUgbnVtYmVyIG9mIGNvbXBhbmllcyB3b3JrZWQsIGFuZCB3aGV0aGVyIG9yIG5vdCBhbiBlbXBsb3llZSB3b3JrcyBvdmVydGltZSBvbiB0aGUgcHJvYmFiaWxpdHkgb2YgYXR0cml0aW9uLiBVbmxpa2UgdGhlIG1vZGVsIGluIHRoZSBwcmV2aW91cyBhc3NpZ25tZW50LCBJIGluY2x1ZGVkIGEgc3F1YXJlIHRlcm0gb2YgdGhlIHZhcmlhYmxlLCBhZ2UsIGluIG9yZGVyIHRvIGFjY291bnQgZm9yIG5vbi1saW5lYXJpdHkuIFRoZSBzaW11bGF0aW9uIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCBhcyBlbXBsb3llZXMgZ2V0IG9sZGVyLCB0aGV5IGJlY29tZSBsZXNzIGxpa2VseSB0byBsZWF2ZSBJQk0uIEhvd2V2ZXIsIHRoZSBlZmZlY3Qgc3RhcnRzIHRvIHJldmVyc2UgYXJvdW5kIGFnZSA1MCwgYXQgd2hpY2ggcG9pbnQgdGhlIHByb2JhYmlsaXR5IG9mIGF0dHJpdGlvbiBiZWdpbnMgdG8gaW5jcmVhc2UgYWdhaW4uIFRoaXMgaW5jcmVhc2UgaXMgdG8gYmUgZXhwZWN0ZWQgYXMgZW1wbG95ZWVzIGdldCBjbG9zZXIgdG8gcmV0aXJlbWVudCBhZ2UuIEluIGFkZGl0aW9uLCB0aGUgcmVzdWx0cyBzdWdnZXN0IHRoYXQgZW1wbG95ZWVzIHdobyBoYXZlIHdvcmtlZCBpbiBtb3JlIGNvbXBhbmllcyBoYXZlIGEgaGlnaGVyIHByb2JhYmlsaXR5IG9mIGF0dHJpdGlvbi4gSW4gb3RoZXIgd29yZHMsIHRob3NlIHdobyBoYXZlIHN3aXRjaGVkIG1vcmUgY29tcGFuaWVzIGFyZSBtb3JlIGxpa2VseSB0byBsZWF2ZSBJQk0gYXMgd2VsbC4gTW9yZSB3b3JrIG5lZWRzIHRvIGJlIGRvbmUgYnkgSUJNIGluIGZpZ3VyaW5nIG91dCBob3cgdG8gYmVzdCByZXRhaW4gdGhlc2UgcGFydGljdWxhciBlbXBsb3llZXMuIExhc3RseSwgaW4gdGVybXMgb2YgdGhlIGVmZmVjdCBvZiB3b3JraW5nIG92ZXJ0aW1lIG9uIGF0dHJpdGlvbiwgdGhlIHJlc3VsdHMgaW5kaWNhdGUgdGhhdCB0aGUgcHJvYmFiaWxpdHkgb2YgYXR0cml0aW9uIGZvciBlbXBsb3llZXMgd2hvIHdvcmsgb3ZlcnRpbWUgaXMgaGlnaGVyIHRoYW4gdGhhdCBmb3IgdGhvc2Ugd2hvIGRvIG5vdCwgd2l0aCBhIGZpcnN0IGRpZmZlcmVuY2Ugb2YgKiotMC4xNyoqLg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K