Raven Shan
Introduction
The objective of this exercise is to utilize the Amelia package to perform multiple imputations as a way of handling missing data. Generating imputed values helps in reducing bias as well as increasing efficiency. For this assignment, I selected a cross-sectional time-series dataset that has a considerable amount of missing values, which could potentially affect the reliability of my results if not properly addressed.
The dataset I will be using, “USSeatBelts” found in the AER package, contains panel data on traffic fatalities for all US states from 1988 to 1997. The outcome variable is fatalities, representing the number of fatalities per 1,000 traffic miles by state. While there are multiple predictors to choose from, this analysis will specifically examine the relationship between fatalities and selected state-level predictors such as seatbelt usage rate and median per capita income. In addition, I will be examining the effect of some mandatory driving-related laws on the number of fatalities per state. The goal is to be able to answer the following questions: What affect does a state’s seatbelt usage rate have on fatalities? What is the relationship between between median per capita income and the the number of fatalities in each state? Do wealthier states have fewer or more vehicular deaths? Thirdly, does the implementation of a maximum .08 blood alcohol content substantially reduce fatalities, and if so, to what extent? Lastly, what impact does having a minimum speed limit of 70 miles per hour have?
First, I will estimate the regression model using listwise deletion, then I will estimate the same model after using Amelia to generate multiple imputed values. Finally, the two sets of results will be compared.
Data and Variables
The variables used in this analysis and their definitions are as follows:
- fatalities: Fatalities will serve as the dependent variable in this analysis. This contains the number of fatalities per 1,000 traffic miles in each state. Note that the original variable was multiplied by 1,000 for a more convenient unit.
- seatbelt: This is seat belt usage rate, as self-reported by state population survey
- income: This measures median per capita income for each state
- alcohol: This is a binary variable representing whether or not there is a maximum of 0.08 blood alcohol content for each state (“Yes”/“No”).
- speed70: This is a binary variable representing whether or not there is a 70 (or higher) mile per hour speed limit
##Viewing the total number of observations and variables
dim(USSeatBelts2)
[1] 765 7
There are 765 observations.
summary(USSeatBelts2)
state year fatalities seatbelt speed70
AK : 15 Min. : 1 Min. : 8.327 Min. :0.0600 no :711
AL : 15 1st Qu.: 4 1st Qu.:17.341 1st Qu.:0.4200 yes: 54
AR : 15 Median : 8 Median :21.199 Median :0.5500
AZ : 15 Mean : 8 Mean :21.490 Mean :0.5289
CA : 15 3rd Qu.:12 3rd Qu.:24.774 3rd Qu.:0.6500
CO : 15 Max. :15 Max. :45.470 Max. :0.8700
(Other):675 NA's :209
income alcohol
Min. : 8372 no :676
1st Qu.:14266 yes: 89
Median :17624
Mean :17993
3rd Qu.:21080
Max. :35863
The above summary output shows 209 N/A’s (missing values) for the variable ‘seatbelt’. This is a considerable amount of missing values in a dataset that has 765 observations. Meanwhile, the remaining variables have no missing observations.
missmap(USSeatBelts2, legend=FALSE)

The above map was generated using the missmmap() function in Amelia. It is an alternative way of demonstrating where missingness occurs in the data. Again, it is clear that all of the missing values occur in the variable seatbelt, while the remaining variables have no missing observations.
Results
Estimating Model with Listwise Deletion
Below, I am estimating a regression model after listwise deletion, which is performed automatically by Zelig. Initially, I began with a simple model that examined the effect of seatbelt usage rate on the number of fatalities per 1,000 traffic miles. Despite the relationship being insignificant, “seatbelt” is included in the model for the sake of this exercise as it was the only variable in the dataset with missing observations. I gradually added additional variables and tested various interactions. Although it would have been ideal, unfortunately, none of the tested interactions were significant. Therefore, the analysis (for both methods) will be based on the best fitting model below.
This model estimates the effect of the variables seatbelt, alcohol, income and speed70 on the total number of fatalities (per 1,000 traffic miles). Contrary to the common assumption, the results indicate one unit increase in seatbelt usage rate to increase the number of fatalities by 1.72, however it is not statistically significant. Nonetheless, the remaining predictors are significant. The results suggest a one unit increase in median income to reduce the number of fatalities by an extremely small margin, .0008 (This value was taken from the summary output, but note that the html table displays the number as -0.00). We can also predict the number of fatalities to drop by 1.98 in states when there is a minimum drinking age of 21, and to increase by 2.24 when there is a 70 mile per hour (or higher) speed limit.
Statistical models
|
|
Model 1
|
|
(Intercept)
|
35.23***
|
|
|
(0.69)
|
|
seatbelt
|
1.72
|
|
|
(1.16)
|
|
income
|
-0.00***
|
|
|
(0.00)
|
|
alcoholyes
|
-1.98***
|
|
|
(0.46)
|
|
speed70yes
|
2.24***
|
|
|
(0.53)
|
|
R2
|
0.51
|
|
Adj. R2
|
0.51
|
|
Num. obs.
|
556
|
|
RMSE
|
3.54
|
|
p < 0.001, p < 0.01, p < 0.05
|
zlist3$setx()
zlist3$sim()
plot(zlist3)

Estimating the Model with Multiple Imputation
Creating Multiple Imputations with Amelia
##Imputation output excluded due to length
a.out <- amelia(USSeatBelts2, m=10, ts="year", cs = "state", logs = "income",
noms = c("speed70", "alcohol"),
polytime = 2, intercs=TRUE)
summary(a.out)
Amelia output with 10 imputed datasets.
Return code: 1
Message: Normal EM convergence.
Chain Lengths:
--------------
Imputation 1: 1934
Imputation 2: 2
Imputation 3: 2
Imputation 4: 2
Imputation 5: 2
Imputation 6: 1431
Imputation 7: 5029
Imputation 8: 2
Imputation 9: 4625
Imputation 10: 2
Rows after Listwise Deletion: 556
Rows after Imputation: 765
Patterns of missingness in the data: 2
Fraction Missing for original variables:
-----------------------------------------
Fraction Missing
state 0.0000000
year 0.0000000
fatalities 0.0000000
seatbelt 0.2732026
speed70 0.0000000
income 0.0000000
alcohol 0.0000000
MI model Results
With multiple imputation, the results below indicate that a one unit increase in seatbelt usage rate decreases fatalities by .95, however the variable is not significant. Note that it was the other way around in the listwise deletion method, in which an increase in seatbelt use increased the number of fatalities. One unit increase in median income reduces the number of fatalities by .0008. We can also predict the number of fatalities to drop by 1.91 in states when there is a minimum drinking age of 21 in effect, and to increase by 2.34 when there is a 70 mile per hour (or higher) speed limit in place. I will later compare these results with those of the listwise deletion model.
z.out$zelig(fatalities ~ seatbelt + income + alcohol + speed70, data = a.out)
summary(z.out)
Model: Combined Imputations
Estimate Std.Error z value Pr(>|z|)
(Intercept) 37.863550 0.646498 58.57 < 2e-16
seatbelt -0.950882 1.532796 -0.62 0.53502
income -0.000883 0.000056 -15.78 < 2e-16
alcoholyes -1.915860 0.515520 -3.72 0.00020
speed70yes 2.343042 0.642672 3.65 0.00027
For results from individual imputed datasets, use summary(x, subset = i:j)
Next step: Use 'setx' method
z.out$setx()
z.out$sim()
plot(z.out)

Comparing Results By Missing Data Methods: Listwise Deletion vs MI Method
The results from the two methods show interesting differences, specifically in the variable ‘seatbelt’(representing seatbelt usage rate per state) as this is the only variable with missing values. Despite the relationship being insignificant in both methods, the listwise deletion method shows an increase in seatbelt usage rates to increase fatalities, whereas the multiple imputation method shows an increase in seatbelt usage rates to decrease fatalities, which is indeed more logical. This is a substantially different story, and further attests to why the MI method is preferred. As for the remaining independent variables, the differences in coefficients were negligible as there were no missing observations in these variables to begin with. Ultimately, the multiple imputation method produces much more reliable results as it considers multiple predicted values and their distribution. Comparatively, the listwise deletion method simply disregards cases that could contain important information, making the findings much less convincing.
LS0tDQp0aXRsZTogIlNvYyA3MTIgSG9tZXdvcmsgIzExIC0gTWlzc2luZyBEYXRhIGFuZCBNdWx0aXBsZSBJbXB1dGF0aW9uIHdpdGggQW1lbGlhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCipSYXZlbiBTaGFuKg0KDQotLS0NCg0KIyNJbnRyb2R1Y3Rpb24NCg0KVGhlIG9iamVjdGl2ZSBvZiB0aGlzIGV4ZXJjaXNlIGlzIHRvIHV0aWxpemUgdGhlICpBbWVsaWEqIHBhY2thZ2UgdG8gcGVyZm9ybSBtdWx0aXBsZSBpbXB1dGF0aW9ucyBhcyBhIHdheSBvZiBoYW5kbGluZyBtaXNzaW5nIGRhdGEuIEdlbmVyYXRpbmcgaW1wdXRlZCB2YWx1ZXMgaGVscHMgaW4gcmVkdWNpbmcgYmlhcyBhcyB3ZWxsIGFzIGluY3JlYXNpbmcgZWZmaWNpZW5jeS4gRm9yIHRoaXMgYXNzaWdubWVudCwgSSBzZWxlY3RlZCBhIGNyb3NzLXNlY3Rpb25hbCB0aW1lLXNlcmllcyBkYXRhc2V0IHRoYXQgaGFzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBtaXNzaW5nIHZhbHVlcywgd2hpY2ggY291bGQgcG90ZW50aWFsbHkgYWZmZWN0IHRoZSByZWxpYWJpbGl0eSBvZiBteSByZXN1bHRzIGlmIG5vdCBwcm9wZXJseSBhZGRyZXNzZWQuDQoNClRoZSBkYXRhc2V0IEkgd2lsbCBiZSB1c2luZywgIlVTU2VhdEJlbHRzIiBmb3VuZCBpbiB0aGUgQUVSIHBhY2thZ2UsIGNvbnRhaW5zIHBhbmVsIGRhdGEgb24gdHJhZmZpYyBmYXRhbGl0aWVzIGZvciBhbGwgVVMgc3RhdGVzIGZyb20gMTk4OCB0byAxOTk3LiBUaGUgb3V0Y29tZSB2YXJpYWJsZSBpcyBmYXRhbGl0aWVzLCByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIHBlciAxLDAwMCB0cmFmZmljIG1pbGVzIGJ5IHN0YXRlLiBXaGlsZSB0aGVyZSBhcmUgbXVsdGlwbGUgcHJlZGljdG9ycyB0byBjaG9vc2UgZnJvbSwgdGhpcyBhbmFseXNpcyB3aWxsIHNwZWNpZmljYWxseSBleGFtaW5lIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBmYXRhbGl0aWVzIGFuZCBzZWxlY3RlZCBzdGF0ZS1sZXZlbCBwcmVkaWN0b3JzIHN1Y2ggYXMgc2VhdGJlbHQgdXNhZ2UgcmF0ZSBhbmQgbWVkaWFuIHBlciBjYXBpdGEgaW5jb21lLiBJbiBhZGRpdGlvbiwgSSB3aWxsIGJlIGV4YW1pbmluZyB0aGUgZWZmZWN0IG9mIHNvbWUgbWFuZGF0b3J5IGRyaXZpbmctcmVsYXRlZCBsYXdzIG9uIHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBwZXIgc3RhdGUuIFRoZSBnb2FsIGlzIHRvIGJlIGFibGUgdG8gYW5zd2VyIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zOiBXaGF0IGFmZmVjdCBkb2VzIGEgc3RhdGUncyBzZWF0YmVsdCB1c2FnZSByYXRlIGhhdmUgb24gZmF0YWxpdGllcz8gV2hhdCBpcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYmV0d2VlbiBtZWRpYW4gcGVyIGNhcGl0YSBpbmNvbWUgYW5kIHRoZSB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgaW4gZWFjaCBzdGF0ZT8gRG8gd2VhbHRoaWVyIHN0YXRlcyBoYXZlIGZld2VyIG9yIG1vcmUgdmVoaWN1bGFyIGRlYXRocz8gVGhpcmRseSwgZG9lcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtYXhpbXVtIC4wOCBibG9vZCBhbGNvaG9sIGNvbnRlbnQgc3Vic3RhbnRpYWxseSByZWR1Y2UgZmF0YWxpdGllcywgYW5kIGlmIHNvLCB0byB3aGF0IGV4dGVudD8gTGFzdGx5LCB3aGF0IGltcGFjdCBkb2VzIGhhdmluZyBhIG1pbmltdW0gc3BlZWQgbGltaXQgb2YgNzAgbWlsZXMgcGVyIGhvdXIgaGF2ZT8NCg0KRmlyc3QsIEkgd2lsbCBlc3RpbWF0ZSB0aGUgcmVncmVzc2lvbiBtb2RlbCB1c2luZyBsaXN0d2lzZSBkZWxldGlvbiwgdGhlbiBJIHdpbGwgZXN0aW1hdGUgdGhlIHNhbWUgbW9kZWwgYWZ0ZXIgdXNpbmcgKkFtZWxpYSogdG8gZ2VuZXJhdGUgbXVsdGlwbGUgaW1wdXRlZCB2YWx1ZXMuIEZpbmFsbHksIHRoZSB0d28gc2V0cyBvZiByZXN1bHRzIHdpbGwgYmUgY29tcGFyZWQuIA0KDQotLS0NCg0KIyNEYXRhIGFuZCBWYXJpYWJsZXMgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShBbWVsaWEpDQpsaWJyYXJ5KFplbGlnKQ0KbGlicmFyeSh0ZXhyZWcpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KEFFUikNCmRhdGEoIlVTU2VhdEJlbHRzIikNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NClVTU2VhdEJlbHRzMiA8LSBkcGx5cjo6c2VsZWN0IChVU1NlYXRCZWx0cywgc3RhdGUsIHllYXIsIGZhdGFsaXRpZXMsIHNlYXRiZWx0LCBzcGVlZDcwLCBpbmNvbWUsIGFsY29ob2wpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpVU1NlYXRCZWx0czIkeWVhciA8LSBhcy5udW1lcmljKFVTU2VhdEJlbHRzMiR5ZWFyKQ0KVVNTZWF0QmVsdHMyJHN0YXRlIDwtIGFzLmZhY3RvcihVU1NlYXRCZWx0czIkc3RhdGUpDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQojI211bHRpcGx5aW5nIGJ5IDEsMDAwIHRvIGdldCBiZXR0ZXIgdW5pdHMNClVTU2VhdEJlbHRzMiRmYXRhbGl0aWVzIDwtIFVTU2VhdEJlbHRzMiRmYXRhbGl0aWVzKjEwMDANCmBgYA0KDQpUaGUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBhbmFseXNpcyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMgYXJlIGFzIGZvbGxvd3M6DQoNCiogKipmYXRhbGl0aWVzKio6IEZhdGFsaXRpZXMgd2lsbCBzZXJ2ZSBhcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGluIHRoaXMgYW5hbHlzaXMuIFRoaXMgY29udGFpbnMgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIHBlciAxLDAwMCB0cmFmZmljIG1pbGVzIGluIGVhY2ggc3RhdGUuIE5vdGUgdGhhdCB0aGUgb3JpZ2luYWwgdmFyaWFibGUgd2FzIG11bHRpcGxpZWQgYnkgMSwwMDAgZm9yIGEgbW9yZSBjb252ZW5pZW50IHVuaXQuIA0KKiAqKnNlYXRiZWx0Kio6IFRoaXMgaXMgc2VhdCBiZWx0IHVzYWdlIHJhdGUsIGFzIHNlbGYtcmVwb3J0ZWQgYnkgc3RhdGUgcG9wdWxhdGlvbiBzdXJ2ZXkgDQoqICoqaW5jb21lKio6IFRoaXMgbWVhc3VyZXMgbWVkaWFuIHBlciBjYXBpdGEgaW5jb21lIGZvciBlYWNoIHN0YXRlDQoqICoqYWxjb2hvbCoqOiBUaGlzIGlzIGEgYmluYXJ5IHZhcmlhYmxlIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBhIG1heGltdW0gb2YgMC4wOCBibG9vZCBhbGNvaG9sIGNvbnRlbnQgZm9yIGVhY2ggc3RhdGUgKCJZZXMiLyJObyIpLg0KKiAqKnNwZWVkNzAqKjogVGhpcyBpcyBhIGJpbmFyeSB2YXJpYWJsZSByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlcmUgaXMgYSA3MCAob3IgaGlnaGVyKSBtaWxlIHBlciBob3VyIHNwZWVkIGxpbWl0DQoNCmBgYHtyfQ0KIyNWaWV3aW5nIHRoZSB0b3RhbCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGFuZCB2YXJpYWJsZXMgDQpkaW0oVVNTZWF0QmVsdHMyKQ0KYGBgDQpUaGVyZSBhcmUgKio3NjUqKiBvYnNlcnZhdGlvbnMuIA0KDQpgYGB7cn0NCnN1bW1hcnkoVVNTZWF0QmVsdHMyKQ0KYGBgDQoNClRoZSBhYm92ZSBzdW1tYXJ5IG91dHB1dCBzaG93cyAyMDkgTi9BJ3MgKG1pc3NpbmcgdmFsdWVzKSBmb3IgdGhlIHZhcmlhYmxlICdzZWF0YmVsdCcuIFRoaXMgaXMgYSBjb25zaWRlcmFibGUgYW1vdW50IG9mIG1pc3NpbmcgdmFsdWVzIGluIGEgZGF0YXNldCB0aGF0IGhhcyA3NjUgb2JzZXJ2YXRpb25zLiBNZWFud2hpbGUsIHRoZSByZW1haW5pbmcgdmFyaWFibGVzIGhhdmUgbm8gbWlzc2luZyBvYnNlcnZhdGlvbnMuICANCg0KYGBge3J9DQptaXNzbWFwKFVTU2VhdEJlbHRzMiwgbGVnZW5kPUZBTFNFKQ0KYGBgDQpUaGUgYWJvdmUgbWFwIHdhcyBnZW5lcmF0ZWQgdXNpbmcgdGhlIG1pc3NtbWFwKCkgZnVuY3Rpb24gaW4gKkFtZWxpYSouIEl0IGlzIGFuIGFsdGVybmF0aXZlIHdheSBvZiBkZW1vbnN0cmF0aW5nIHdoZXJlIG1pc3NpbmduZXNzIG9jY3VycyBpbiB0aGUgZGF0YS4gQWdhaW4sIGl0IGlzIGNsZWFyIHRoYXQgYWxsIG9mIHRoZSBtaXNzaW5nIHZhbHVlcyBvY2N1ciBpbiB0aGUgdmFyaWFibGUgc2VhdGJlbHQsIHdoaWxlIHRoZSByZW1haW5pbmcgdmFyaWFibGVzIGhhdmUgbm8gbWlzc2luZyBvYnNlcnZhdGlvbnMuDQoNCi0tLQ0KDQojUmVzdWx0cyANCg0KIyNFc3RpbWF0aW5nIE1vZGVsIHdpdGggTGlzdHdpc2UgRGVsZXRpb24NCg0KQmVsb3csIEkgYW0gZXN0aW1hdGluZyBhIHJlZ3Jlc3Npb24gbW9kZWwgYWZ0ZXIgbGlzdHdpc2UgZGVsZXRpb24sIHdoaWNoIGlzIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5IGJ5IFplbGlnLiBJbml0aWFsbHksIEkgYmVnYW4gd2l0aCBhIHNpbXBsZSBtb2RlbCB0aGF0IGV4YW1pbmVkIHRoZSBlZmZlY3Qgb2Ygc2VhdGJlbHQgdXNhZ2UgcmF0ZSBvbiB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgcGVyIDEsMDAwIHRyYWZmaWMgbWlsZXMuIERlc3BpdGUgdGhlIHJlbGF0aW9uc2hpcCBiZWluZyBpbnNpZ25pZmljYW50LCAic2VhdGJlbHQiIGlzIGluY2x1ZGVkIGluIHRoZSBtb2RlbCBmb3IgdGhlIHNha2Ugb2YgdGhpcyBleGVyY2lzZSBhcyBpdCB3YXMgdGhlIG9ubHkgdmFyaWFibGUgaW4gdGhlIGRhdGFzZXQgd2l0aCBtaXNzaW5nIG9ic2VydmF0aW9ucy4gSSBncmFkdWFsbHkgYWRkZWQgYWRkaXRpb25hbCB2YXJpYWJsZXMgYW5kIHRlc3RlZCB2YXJpb3VzIGludGVyYWN0aW9ucy4gQWx0aG91Z2ggaXQgd291bGQgaGF2ZSBiZWVuIGlkZWFsLCB1bmZvcnR1bmF0ZWx5LCBub25lIG9mIHRoZSB0ZXN0ZWQgaW50ZXJhY3Rpb25zIHdlcmUgc2lnbmlmaWNhbnQuIFRoZXJlZm9yZSwgdGhlIGFuYWx5c2lzIChmb3IgYm90aCBtZXRob2RzKSB3aWxsIGJlIGJhc2VkIG9uIHRoZSBiZXN0IGZpdHRpbmcgbW9kZWwgYmVsb3cuIA0KDQpUaGlzIG1vZGVsIGVzdGltYXRlcyB0aGUgZWZmZWN0IG9mIHRoZSB2YXJpYWJsZXMgKipzZWF0YmVsdCoqLCAqKmFsY29ob2wqKiwgKippbmNvbWUqKiBhbmQgKipzcGVlZDcwKiogb24gdGhlIHRvdGFsIG51bWJlciBvZiBmYXRhbGl0aWVzIChwZXIgMSwwMDAgdHJhZmZpYyBtaWxlcykuICBDb250cmFyeSB0byB0aGUgY29tbW9uIGFzc3VtcHRpb24sIHRoZSByZXN1bHRzIGluZGljYXRlIG9uZSB1bml0IGluY3JlYXNlIGluIHNlYXRiZWx0IHVzYWdlIHJhdGUgdG8gKmluY3JlYXNlKiB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYnkgMS43MiwgaG93ZXZlciBpdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gTm9uZXRoZWxlc3MsIHRoZSByZW1haW5pbmcgcHJlZGljdG9ycyBhcmUgc2lnbmlmaWNhbnQuIFRoZSByZXN1bHRzIHN1Z2dlc3QgYSBvbmUgdW5pdCBpbmNyZWFzZSBpbiBtZWRpYW4gaW5jb21lIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYnkgYW4gZXh0cmVtZWx5IHNtYWxsIG1hcmdpbiwgLjAwMDggKFRoaXMgdmFsdWUgd2FzIHRha2VuIGZyb20gdGhlIHN1bW1hcnkgb3V0cHV0LCBidXQgbm90ZSB0aGF0IHRoZSBodG1sIHRhYmxlIGRpc3BsYXlzIHRoZSBudW1iZXIgYXMgLTAuMDApLiBXZSBjYW4gYWxzbyBwcmVkaWN0IHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyB0byBkcm9wIGJ5IDEuOTggaW4gc3RhdGVzIHdoZW4gdGhlcmUgaXMgYSBtaW5pbXVtIGRyaW5raW5nIGFnZSBvZiAyMSwgYW5kIHRvIGluY3JlYXNlIGJ5IDIuMjQgd2hlbiB0aGVyZSBpcyBhIDcwIG1pbGUgcGVyIGhvdXIgKG9yIGhpZ2hlcikgc3BlZWQgbGltaXQuIA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnpsaXN0MyA8LSB6ZWxpZyhmYXRhbGl0aWVzIH4gc2VhdGJlbHQgKyBpbmNvbWUgKyBhbGNvaG9sICsgc3BlZWQ3MCwgbW9kZWwgPSAibHMiLCBkYXRhID0gVVNTZWF0QmVsdHMyLCBjaXRlID0gRikNCmBgYA0KDQpgYGB7ciByZXN1bHRzPSdhc2lzJywgZWNobz1GQUxTRX0NCmxpYnJhcnkodGV4cmVnKQ0KaHRtbHJlZyAoemxpc3QzKQ0KYGBgDQoNCg0KYGBge3J9DQp6bGlzdDMkc2V0eCgpDQp6bGlzdDMkc2ltKCkNCnBsb3Qoemxpc3QzKQ0KYGBgDQoNCi0tLQ0KDQojI0VzdGltYXRpbmcgdGhlIE1vZGVsIHdpdGggTXVsdGlwbGUgSW1wdXRhdGlvbg0KDQojIyNDcmVhdGluZyBNdWx0aXBsZSBJbXB1dGF0aW9ucyB3aXRoICpBbWVsaWEqDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShBbWVsaWEpDQpsaWJyYXJ5KFplbGlnKQ0KYGBgDQoNCg0KYGBge3J9DQojI0ltcHV0YXRpb24gb3V0cHV0IGV4Y2x1ZGVkIGR1ZSB0byBsZW5ndGggDQoNCmEub3V0IDwtIGFtZWxpYShVU1NlYXRCZWx0czIsIG09MTAsIHRzPSJ5ZWFyIiwgY3MgPSAic3RhdGUiLCBsb2dzID0gImluY29tZSIsIA0KICAgICAgICAgICAgICAgIG5vbXMgPSBjKCJzcGVlZDcwIiwgImFsY29ob2wiKSwNCiAgICAgICAgICAgICAgICBwb2x5dGltZSA9IDIsIGludGVyY3M9VFJVRSkNCmBgYA0KDQpgYGB7cn0NCnN1bW1hcnkoYS5vdXQpDQpgYGANCg0KLS0tDQoNCiMjI01JIG1vZGVsIFJlc3VsdHMgDQoNCldpdGggbXVsdGlwbGUgaW1wdXRhdGlvbiwgdGhlIHJlc3VsdHMgYmVsb3cgaW5kaWNhdGUgdGhhdCBhIG9uZSB1bml0IGluY3JlYXNlIGluIHNlYXRiZWx0IHVzYWdlIHJhdGUgZGVjcmVhc2VzIGZhdGFsaXRpZXMgYnkgLjk1LCBob3dldmVyIHRoZSB2YXJpYWJsZSBpcyBub3Qgc2lnbmlmaWNhbnQuIE5vdGUgdGhhdCBpdCB3YXMgdGhlIG90aGVyIHdheSBhcm91bmQgaW4gdGhlIGxpc3R3aXNlIGRlbGV0aW9uIG1ldGhvZCwgaW4gd2hpY2ggYW4gaW5jcmVhc2UgaW4gc2VhdGJlbHQgdXNlIGluY3JlYXNlZCB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMuIE9uZSB1bml0IGluY3JlYXNlIGluIG1lZGlhbiBpbmNvbWUgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGZhdGFsaXRpZXMgYnkgLjAwMDguIFdlIGNhbiBhbHNvIHByZWRpY3QgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzIHRvIGRyb3AgYnkgMS45MSBpbiBzdGF0ZXMgd2hlbiB0aGVyZSBpcyBhIG1pbmltdW0gZHJpbmtpbmcgYWdlIG9mIDIxIGluIGVmZmVjdCwgYW5kIHRvIGluY3JlYXNlIGJ5IDIuMzQgd2hlbiB0aGVyZSBpcyBhIDcwIG1pbGUgcGVyIGhvdXIgKG9yIGhpZ2hlcikgc3BlZWQgbGltaXQgaW4gcGxhY2UuIEkgd2lsbCBsYXRlciBjb21wYXJlIHRoZXNlIHJlc3VsdHMgd2l0aCB0aG9zZSBvZiB0aGUgbGlzdHdpc2UgZGVsZXRpb24gbW9kZWwuIA0KDQpgYGB7cn0NCnoub3V0JHplbGlnKGZhdGFsaXRpZXMgfiBzZWF0YmVsdCArIGluY29tZSArIGFsY29ob2wgKyBzcGVlZDcwLCBkYXRhID0gYS5vdXQpDQpzdW1tYXJ5KHoub3V0KQ0KYGBgDQoNCmBgYHtyfQ0Kei5vdXQkc2V0eCgpDQp6Lm91dCRzaW0oKQ0KcGxvdCh6Lm91dCkNCmBgYA0KDQotLS0NCg0KIyNDb21wYXJpbmcgUmVzdWx0cyBCeSBNaXNzaW5nIERhdGEgTWV0aG9kczogTGlzdHdpc2UgRGVsZXRpb24gdnMgTUkgTWV0aG9kICAgDQoNClRoZSByZXN1bHRzIGZyb20gdGhlIHR3byBtZXRob2RzIHNob3cgaW50ZXJlc3RpbmcgZGlmZmVyZW5jZXMsIHNwZWNpZmljYWxseSBpbiB0aGUgdmFyaWFibGUgJ3NlYXRiZWx0JyhyZXByZXNlbnRpbmcgc2VhdGJlbHQgdXNhZ2UgcmF0ZSBwZXIgc3RhdGUpIGFzIHRoaXMgaXMgdGhlIG9ubHkgdmFyaWFibGUgd2l0aCBtaXNzaW5nIHZhbHVlcy4gRGVzcGl0ZSB0aGUgcmVsYXRpb25zaGlwIGJlaW5nIGluc2lnbmlmaWNhbnQgaW4gYm90aCBtZXRob2RzLCB0aGUgbGlzdHdpc2UgZGVsZXRpb24gbWV0aG9kIHNob3dzIGFuIGluY3JlYXNlIGluIHNlYXRiZWx0IHVzYWdlIHJhdGVzIHRvICppbmNyZWFzZSogZmF0YWxpdGllcywgd2hlcmVhcyB0aGUgbXVsdGlwbGUgaW1wdXRhdGlvbiBtZXRob2Qgc2hvd3MgYW4gaW5jcmVhc2UgaW4gc2VhdGJlbHQgdXNhZ2UgcmF0ZXMgdG8gKmRlY3JlYXNlKiBmYXRhbGl0aWVzLCB3aGljaCBpcyBpbmRlZWQgbW9yZSBsb2dpY2FsLiBUaGlzIGlzIGEgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQgc3RvcnksIGFuZCBmdXJ0aGVyIGF0dGVzdHMgdG8gd2h5IHRoZSBNSSBtZXRob2QgaXMgcHJlZmVycmVkLiBBcyBmb3IgdGhlIHJlbWFpbmluZyBpbmRlcGVuZGVudCB2YXJpYWJsZXMsIHRoZSBkaWZmZXJlbmNlcyBpbiBjb2VmZmljaWVudHMgd2VyZSBuZWdsaWdpYmxlIGFzIHRoZXJlIHdlcmUgbm8gbWlzc2luZyBvYnNlcnZhdGlvbnMgaW4gdGhlc2UgdmFyaWFibGVzIHRvIGJlZ2luIHdpdGguIFVsdGltYXRlbHksIHRoZSBtdWx0aXBsZSBpbXB1dGF0aW9uIG1ldGhvZCBwcm9kdWNlcyBtdWNoIG1vcmUgcmVsaWFibGUgcmVzdWx0cyBhcyBpdCBjb25zaWRlcnMgbXVsdGlwbGUgcHJlZGljdGVkIHZhbHVlcyBhbmQgdGhlaXIgZGlzdHJpYnV0aW9uLiBDb21wYXJhdGl2ZWx5LCB0aGUgbGlzdHdpc2UgZGVsZXRpb24gbWV0aG9kIHNpbXBseSBkaXNyZWdhcmRzIGNhc2VzIHRoYXQgY291bGQgY29udGFpbiBpbXBvcnRhbnQgaW5mb3JtYXRpb24sIG1ha2luZyB0aGUgZmluZGluZ3MgbXVjaCBsZXNzIGNvbnZpbmNpbmcuIA0K