Ernesto Gomez
October 30, 2017

Introduction

Recent events involving mass shooters gunning down large groups of people in the United States has catalyzed a national conversation around guns, gun ownership, background checks, and mental health. This analysis is concerned with the question around access to guns and whether access to a larger arsenal on the part of a mass shooter is likelier to result in more fatalities. A multilevel method will be utilized to further analyze the relationship between fatalities and weaponry size and possible variations amongst all 50 states, who have varying rates of gun ownership. In the end, mental illness will be introduced to test for its influence in fatalities. The analysis will begin with an ecological analysis, complete pooling model, a no pool modeling, and conclude with multilevel modeling to ultimately determine the best fit and contributing factors to fatalities.


Method

To conduct this analysis, the primary data used was extracted from the Stanford Mass Shootings in America (MSA). Additionally, the percentage of gun ownership across the United States, taken from a heatmap based on General Social Survey data and stratified on the state-level, is also utilized and merged into the dataset.

Variables contained within the dataframe are defined and coded as follows:

library(nlme)
library(tidyverse)
library(dplyr)
library(sjmisc)
library(magrittr)
library(lmerTest)
library(texreg)
library(visreg)
library(ggplot2)
masshoot <- data.frame(read_csv("/Users/ernesto/Documents/Advanced Analytics/Data/MassShootings.csv")) %>%
  rename("mentalhistory" = History.of.Mental.Illness...General,
    "totalvictims" = Total.Number.of.Victims,
    "state" = State,
     "totalguns" = Total.Number.of.Guns) %>%
  select(state, totalvictims, mentalhistory, totalguns) %>%
  filter(!is.na(totalvictims),
         !is.na(state),
         !is.na(mentalhistory),
         !is.na(totalguns), 
        !totalvictims %in% c("Unknown"),
        !state %in% c("Unknown"),
        !mentalhistory %in% c("Unknown"),
        !totalguns %in% c("Unknown")) %>%
          mutate(mentalill=as.factor(ifelse(mentalhistory=="Yes", 1, 0)),
              totalguns=as.numeric(totalguns))
              #newtotalguns=as.factor(ifelse(totalguns<4, totalguns, 
                                           #ifelse(totalguns>=4, "4+","na"))))
statefull = c("Alaska","Alabama","Arkansas", 
                              "Arizona","California","Colorado",
                              "Connecticut","District of Columbia","Delaware",
                              "Florida" , "Georgia" ,"Hawaii",
                              "Iowa","Idaho","Illinois","Indiana","Kansas",
                              "Kentucky","Louisiana","Massachusetts",
                              "Maryland","Maine" ,"Michigan","Minnesota",
                              "Missouri","Mississippi","Montana",
                              "North Carolina","North Dakota","Nebraska",
                              "New Hampshire" , "New Jersey" ,  "New Mexico",
                              "Nevada","New York","Ohio","Oklahoma" ,"Oregon",
                              "Pennsylvania" , "Rhode Island",
                              "South Carolina", "South Dakota" ,"Tennessee" , 
                              "Texas" , "Utah", "Virginia","Vermont" ,"Washington",
                              "Wisconsin", "West Virginia" , "Wyoming")
PercHavGuns= c(57.8, 51.7, 55.3,
               31.1, 21.3, 34.7,
               16.7, 3.6, 25.5,
               24.5, 40.3, 6.7,
               42.9, 55.3, 20.2, 39.1, 42.1,
               47.7, 44.1, 12.6,
               21.3, 40.5, 38.4, 41.7,
               41.7, 55.3, 57.7,
               41.3, 50.7, 38.6,
               30.0, 12.3, 34.8,
               33.8, 18.0, 32.4, 42.9, 39.8,
               34.7, 12.8,
               42.3, 56.6, 43.9,
               35.9, 43.9, 35.1, 42.0, 33.1,
               44.4, 55.4, 59.7)
stateguns <- data.frame(statefull, PercHavGuns)
mshoot <- merge(stateguns, masshoot, all.x=FALSE, all.y=TRUE, by.x="statefull", by.y="state") %>%
  mutate(statefull=as.factor(statefull))
print(mshoot)

Ecological Analysis

The ecological regression seeks to understand whether, at the state level, does the number of guns owned relate to the number of mass shooting incidences in that state? What is found is that simply because a particular state has a higher rate of gun ownership this does not necessarily result in higher incidences of mass shootings. This is somewhat interesting because one might expect a state with more guns to mean easier access, greater ubiquity of access to guns, individuals who own more than one gun, and thus potentially a higher likelihood of more shootings and subsequently deaths.

shootd <- mshoot %>%
  group_by(statefull) %>%
  summarise(gunown=mean(PercHavGuns), totalvictims=sum(totalvictims), incidence=n())
summary(lm(incidence ~ gunown, data = shootd))

Call:
lm(formula = incidence ~ gunown, data = shootd)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.8074 -2.0221 -0.8676  1.1989 20.5414 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  7.08169    1.86923   3.789 0.000488 ***
gunown      -0.07620    0.04687  -1.626 0.111657    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.264 on 41 degrees of freedom
Multiple R-squared:  0.06056,   Adjusted R-squared:  0.03765 
F-statistic: 2.643 on 1 and 41 DF,  p-value: 0.1117

Fatalities and Number of Guns Used - A Complete Pooling Model

This individual analysis/complete pooling model examines the number of guns used during an incidence and whether this influences the number of fatalities. The model’s results indicate a highly statistically significant increase in fatalities the more guns used by a shooter during an incident.

cpooling <- lm(totalvictims ~ totalguns, data=mshoot)
summary(cpooling)

Call:
lm(formula = totalvictims ~ totalguns, data = mshoot)

Residuals:
    Min      1Q  Median      3Q     Max 
-19.701  -3.323  -2.206   0.677  54.217 

Coefficients:
            Estimate Std. Error t value           Pr(>|t|)    
(Intercept)   3.1700     0.8145   3.892           0.000127 ***
totalguns     3.1531     0.3990   7.903 0.0000000000000775 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 7.706 on 260 degrees of freedom
Multiple R-squared:  0.1937,    Adjusted R-squared:  0.1906 
F-statistic: 62.46 on 1 and 260 DF,  p-value: 0.00000000000007745

Fatalities and Number of Guns - A No Pooling Model


Intercept

When considering the intercept model, which is an indication of fatalities, we see that most intercepts range between 0-18 when there is no consideration of number of guns used.

dcoef <- mshoot %>%
  group_by(statefull) %>%
  do(mod=lm(totalvictims ~ totalguns, data=.))
coef <- dcoef %>% do(data.frame(intc=coef(.$mod)[1]))
ggplot(coef, aes(x=intc)) + geom_histogram(fill="black")


Slope

Our slope models show a consistently positive impact, suggesting that the more guns used during a particular shooting resulted in more fatalities.

dcoef1 <- mshoot %>%
  group_by(statefull) %>%
  do(mod=lm(totalvictims ~ totalguns, data=.))
coef1 <- dcoef1 %>% do(data.frame(totalgunc = coef(.$mod)[2]))
ggplot (coef1, aes(x=totalgunc)) + geom_histogram(fill="darkred")


Multilevel Modeling


Fatalities & Number of Guns by State - A Random Intercept Model

m1_lme <- lme(totalvictims~totalguns, data=mshoot, random = ~1|statefull, method="ML")
summary(m1_lme)
Linear mixed-effects model fit by maximum likelihood
 Data: mshoot 
       AIC      BIC    logLik
  1816.377 1830.651 -904.1887

Random effects:
 Formula: ~1 | statefull
        (Intercept) Residual
StdDev:    1.854707  7.44623

Fixed effects: totalvictims ~ totalguns 
               Value Std.Error  DF  t-value p-value
(Intercept) 3.152600 0.8656005 215 3.642096  0.0003
totalguns   3.076404 0.3953991 215 7.780504  0.0000
 Correlation: 
          (Intr)
totalguns -0.747

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-2.51797073 -0.38017819 -0.19661757  0.09522077  6.91271424 

Number of Observations: 262
Number of Groups: 46 

Fatalities and Number of Guns by State - A Random Slope Model

m2_lme <- lme(totalvictims~totalguns, data=mshoot, random = ~totalguns|statefull, method="ML")
summary(m2_lme)
Linear mixed-effects model fit by maximum likelihood
 Data: mshoot 
       AIC      BIC    logLik
  1779.533 1800.943 -883.7663

Random effects:
 Formula: ~totalguns | statefull
 Structure: General positive-definite, Log-Cholesky parametrization
            StdDev   Corr  
(Intercept) 3.066593 (Intr)
totalguns   3.203568 -0.987
Residual    6.566262       

Fixed effects: totalvictims ~ totalguns 
               Value Std.Error  DF  t-value p-value
(Intercept) 2.708586 1.0514729 215 2.575992  0.0107
totalguns   3.447483 0.7935152 215 4.344570  0.0000
 Correlation: 
          (Intr)
totalguns -0.892

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-3.5028251 -0.4510911 -0.2105835  0.1330508  5.2161427 

Number of Observations: 262
Number of Groups: 46 

Model(s) Summary

When accounting for the variations/differences between states we continue to see a statistically significant relationship between number of guns used and fatalities, which still increase as the number of guns used similarly increases.


Introducing Covariate - The Effect of Mental Illness

The model maintains its significance in regards to number of guns used, and the model also reveal statistical significance and an increase in fatalities when considering mental illness amongst convicted mass shooters.

m3_lme <- lme(totalvictims ~ totalguns+mentalill, data=mshoot, random = ~totalguns|statefull, method="ML")
summary(m3_lme)
Linear mixed-effects model fit by maximum likelihood
 Data: mshoot 
       AIC      BIC   logLik
  1765.498 1790.476 -875.749

Random effects:
 Formula: ~totalguns | statefull
 Structure: General positive-definite, Log-Cholesky parametrization
            StdDev   Corr  
(Intercept) 2.721248 (Intr)
totalguns   2.925215 -0.987
Residual    6.393374       

Fixed effects: totalvictims ~ totalguns + mentalill 
               Value Std.Error  DF  t-value p-value
(Intercept) 1.891857 1.0171853 214 1.859894  0.0643
totalguns   3.164054 0.7467198 214 4.237271  0.0000
mentalill1  3.541143 0.8743448 214 4.050054  0.0001
 Correlation: 
           (Intr) ttlgns
totalguns  -0.845       
mentalill1 -0.208 -0.084

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-3.2790555 -0.4322534 -0.1487146  0.2175075  5.2065406 

Number of Observations: 262
Number of Groups: 46 

Mental Illness and Access to Many Guns by State - An Interaction Model

When interacting number of guns used and mental illness – do shooters with a history of mental history kill more with more guns – the model is weakened and loses significance. There may be no interactive effect.

m4_lme <- lme(totalvictims ~ totalguns*mentalill, data=mshoot, random = ~totalguns|statefull, method="ML")
summary(m4_lme)
Linear mixed-effects model fit by maximum likelihood
 Data: mshoot 
       AIC      BIC    logLik
  1765.536 1794.082 -874.7678

Random effects:
 Formula: ~totalguns | statefull
 Structure: General positive-definite, Log-Cholesky parametrization
            StdDev   Corr  
(Intercept) 2.684024 (Intr)
totalguns   2.770195 -0.976
Residual    6.390776       

Fixed effects: totalvictims ~ totalguns * mentalill 
                        Value Std.Error  DF   t-value p-value
(Intercept)          2.748995 1.1913864 213 2.3073917  0.0220
totalguns            2.540068 0.8506662 213 2.9859753  0.0032
mentalill1           1.516140 1.6772752 213 0.9039303  0.3671
totalguns:mentalill1 1.342273 0.9392529 213 1.4290860  0.1544
 Correlation: 
                     (Intr) ttlgns mntll1
totalguns            -0.886              
mentalill1           -0.543  0.407       
totalguns:mentalill1  0.528 -0.523 -0.853

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-3.0193090 -0.4341919 -0.1737580  0.2379613  5.0829045 

Number of Observations: 262
Number of Groups: 46 

Model Selection

Our third multilevel model proves to be the best fit when models are grouped and viewed for the lowest AIC value.

AIC(cpooling, m1_lme, m2_lme, m3_lme, m4_lme)

Best Fit Models

htmlreg(list(m2_lme, m3_lme, m4_lme))
Statistical models
Model 1 Model 2 Model 3
(Intercept) 2.71* 1.89 2.75*
(1.05) (1.02) (1.19)
totalguns 3.45*** 3.16*** 2.54**
(0.79) (0.75) (0.85)
mentalill1 3.54*** 1.52
(0.87) (1.68)
totalguns:mentalill1 1.34
(0.94)
AIC 1779.53 1765.50 1765.54
BIC 1800.94 1790.48 1794.08
Log Likelihood -883.77 -875.75 -874.77
Num. obs. 262 262 262
Num. groups 46 46 46
p < 0.001, p < 0.01, p < 0.05

In Conclusion

A graphical representation of the best fit model indicates that more guns used means more fatalities. Additionally, if a shooter is reported to have a history of mental illness they are also likelier to kill more than those with no prior history. The interaction between the two showed no significant effect.

visreg(m3_lme)

Note

It was my intention to also include the covariate in the pooling/no pooling models but encountered an error last minute when adjusting the lm to account for the covariate in the slopes. I tried to understand how to fix it but couldn’t. My mistake.

LS0tCnRpdGxlOiAiRXhhbWluaW5nIE1hc3MgU2hvb3RpbmdzIGFuZCBGYXRhbGl0aWVzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyMjI0VybmVzdG8gR29tZXoKIyMjIyNPY3RvYmVyIDMwLCAyMDE3Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgojIyoqSW50cm9kdWN0aW9uKioKClJlY2VudCBldmVudHMgaW52b2x2aW5nIG1hc3Mgc2hvb3RlcnMgZ3VubmluZyBkb3duIGxhcmdlIGdyb3VwcyBvZiBwZW9wbGUgaW4gdGhlIFVuaXRlZCBTdGF0ZXMgaGFzIGNhdGFseXplZCBhIG5hdGlvbmFsIGNvbnZlcnNhdGlvbiBhcm91bmQgZ3VucywgZ3VuIG93bmVyc2hpcCwgYmFja2dyb3VuZCBjaGVja3MsIGFuZCBtZW50YWwgaGVhbHRoLiBUaGlzIGFuYWx5c2lzIGlzIGNvbmNlcm5lZCB3aXRoIHRoZSBxdWVzdGlvbiBhcm91bmQgYWNjZXNzIHRvIGd1bnMgYW5kIHdoZXRoZXIgYWNjZXNzIHRvIGEgbGFyZ2VyIGFyc2VuYWwgb24gdGhlIHBhcnQgb2YgYSBtYXNzIHNob290ZXIgaXMgbGlrZWxpZXIgdG8gcmVzdWx0IGluIG1vcmUgZmF0YWxpdGllcy4gQSBtdWx0aWxldmVsIG1ldGhvZCB3aWxsIGJlIHV0aWxpemVkIHRvIGZ1cnRoZXIgYW5hbHl6ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZmF0YWxpdGllcyBhbmQgd2VhcG9ucnkgc2l6ZSBhbmQgcG9zc2libGUgdmFyaWF0aW9ucyBhbW9uZ3N0IGFsbCA1MCBzdGF0ZXMsIHdobyBoYXZlIHZhcnlpbmcgcmF0ZXMgb2YgZ3VuIG93bmVyc2hpcC4gSW4gdGhlIGVuZCwgbWVudGFsIGlsbG5lc3Mgd2lsbCBiZSBpbnRyb2R1Y2VkIHRvIHRlc3QgZm9yIGl0cyBpbmZsdWVuY2UgaW4gZmF0YWxpdGllcy4gVGhlIGFuYWx5c2lzIHdpbGwgYmVnaW4gd2l0aCBhbiBlY29sb2dpY2FsIGFuYWx5c2lzLCBjb21wbGV0ZSBwb29saW5nIG1vZGVsLCBhIG5vIHBvb2wgbW9kZWxpbmcsIGFuZCBjb25jbHVkZSB3aXRoIG11bHRpbGV2ZWwgbW9kZWxpbmcgdG8gdWx0aW1hdGVseSBkZXRlcm1pbmUgdGhlIGJlc3QgZml0IGFuZCBjb250cmlidXRpbmcgZmFjdG9ycyB0byBmYXRhbGl0aWVzLgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiMjKipNZXRob2QqKgoKVG8gY29uZHVjdCB0aGlzIGFuYWx5c2lzLCB0aGUgcHJpbWFyeSBkYXRhIHVzZWQgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBTdGFuZm9yZCBNYXNzIFNob290aW5ncyBpbiBBbWVyaWNhIChNU0EpLiBBZGRpdGlvbmFsbHksIHRoZSBwZXJjZW50YWdlIG9mIGd1biBvd25lcnNoaXAgYWNyb3NzIHRoZSBVbml0ZWQgU3RhdGVzLCB0YWtlbiBmcm9tIGEgaGVhdG1hcCBiYXNlZCBvbiBHZW5lcmFsIFNvY2lhbCBTdXJ2ZXkgZGF0YSBhbmQgc3RyYXRpZmllZCBvbiB0aGUgc3RhdGUtbGV2ZWwsIGlzIGFsc28gdXRpbGl6ZWQgYW5kIG1lcmdlZCBpbnRvIHRoZSBkYXRhc2V0LgoKVmFyaWFibGVzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGRhdGFmcmFtZSBhcmUgZGVmaW5lZCBhbmQgY29kZWQgYXMgZm9sbG93czoKCiogKip0b3RhbHZpY3RpbXMqKiAtIFRoaXMgdmFyaWFibGUgd2lsbCBiZSB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLCBpdCBpcyBhIG1lYXN1cmVtZW50IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgZmF0YWxpdGllcyBmb3IgZXZlcnkgaW5jaWRlbmNlIG9mIGEgbWFzcyBzaG9vdGluZy4KKyAqKm1lbnRhbGhpc3RvcnkqKiAtIFRoaXMgdmFyaWFibGUgbWVhc3VyZXMgd2hldGhlciBhIG1hc3Mgc2hvb3RlciBoYWQgYSByZXBvcnRlZCBvciBjb25maXJtZWQgaGlzdG9yeSBvZiBtZW50YWwgaWxsbmVzcywgIlllcyIgZm9yIGEgaGlzdG9yeSBvZiBtZW50YWwgaWxsbmVzcyBhbmQgIk5vIiBmb3Igbm8gaGlzdG9yeS4KKyAqKm1lbnRhbGlsbCoqIC0gQSByZWNvZGVkIDEsMCB2YXJpYWJsZSBvZiBoaXN0b3J5IG9mIG1lbnRhbCBpbGxuZXNzLCAxIGZvciAiWWVzIiBhbmQgMCBmb3IgIk5vIi4KKyAqKnRvdGFsZ3VucyoqIC0gVGhpcyB2YXJpYWJsZSBpcyBhIG1lYXN1cmVtZW50IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgZ3VucyB1c2VkIGR1cmluZyBhIHBhcnRpY3VsYXIgc2hvb3RpbmcuCisgKipzdGF0ZWZ1bGwqKiAtIFRoZSBzdGF0ZSBpbiB3aGljaCBhIG1hc3Mgc2hvb3RpbmcgaW5jaWRlbmNlIHRvb2sgcGxhY2UuCisgKipQZXJjSGF2R3VuKiogLSBUaGUgcGVyY2VudGFnZSBvZiBndW4gb3duZXJzaGlwIGZyb20gYSBwYXJ0aWN1bGFyIHN0YXRlIChkZXJpdmVkIGZyb20gdGhlIEdlbmVyYWwgU29jaWFsIFN1cnZleeKAmXMgVHJlbmRzIGluIEd1biBPd25lcnNoaXAgaW4gdGhlIFVuaXRlZCBTdGF0ZXMpIG1hdGNoZWQgYnkgc3RhdGUuIAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkobmxtZSkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoc2ptaXNjKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KHRleHJlZykKbGlicmFyeSh2aXNyZWcpCmxpYnJhcnkoZ2dwbG90MikKCm1hc3Nob290IDwtIGRhdGEuZnJhbWUocmVhZF9jc3YoIi9Vc2Vycy9lcm5lc3RvL0RvY3VtZW50cy9BZHZhbmNlZCBBbmFseXRpY3MvRGF0YS9NYXNzU2hvb3RpbmdzLmNzdiIpKSAlPiUKICByZW5hbWUoIm1lbnRhbGhpc3RvcnkiID0gSGlzdG9yeS5vZi5NZW50YWwuSWxsbmVzcy4uLkdlbmVyYWwsCiAgICAidG90YWx2aWN0aW1zIiA9IFRvdGFsLk51bWJlci5vZi5WaWN0aW1zLAogICAgInN0YXRlIiA9IFN0YXRlLAogICAgICJ0b3RhbGd1bnMiID0gVG90YWwuTnVtYmVyLm9mLkd1bnMpICU+JQogIHNlbGVjdChzdGF0ZSwgdG90YWx2aWN0aW1zLCBtZW50YWxoaXN0b3J5LCB0b3RhbGd1bnMpICU+JQogIGZpbHRlcighaXMubmEodG90YWx2aWN0aW1zKSwKICAgICAgICAgIWlzLm5hKHN0YXRlKSwKICAgICAgICAgIWlzLm5hKG1lbnRhbGhpc3RvcnkpLAogICAgICAgICAhaXMubmEodG90YWxndW5zKSwgCiAgICAgICAgIXRvdGFsdmljdGltcyAlaW4lIGMoIlVua25vd24iKSwKICAgICAgICAhc3RhdGUgJWluJSBjKCJVbmtub3duIiksCiAgICAgICAgIW1lbnRhbGhpc3RvcnkgJWluJSBjKCJVbmtub3duIiksCiAgICAgICAgIXRvdGFsZ3VucyAlaW4lIGMoIlVua25vd24iKSkgJT4lCiAgICAgICAgICBtdXRhdGUobWVudGFsaWxsPWFzLmZhY3RvcihpZmVsc2UobWVudGFsaGlzdG9yeT09IlllcyIsIDEsIDApKSwKICAgICAgICAgICAgICB0b3RhbGd1bnM9YXMubnVtZXJpYyh0b3RhbGd1bnMpKQogICAgICAgICAgICAgICNuZXd0b3RhbGd1bnM9YXMuZmFjdG9yKGlmZWxzZSh0b3RhbGd1bnM8NCwgdG90YWxndW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmVsc2UodG90YWxndW5zPj00LCAiNCsiLCJuYSIpKSkpCgoKc3RhdGVmdWxsID0gYygiQWxhc2thIiwiQWxhYmFtYSIsIkFya2Fuc2FzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcml6b25hIiwiQ2FsaWZvcm5pYSIsIkNvbG9yYWRvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3RpY3V0IiwiRGlzdHJpY3Qgb2YgQ29sdW1iaWEiLCJEZWxhd2FyZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGbG9yaWRhIiAsICJHZW9yZ2lhIiAsIkhhd2FpaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJb3dhIiwiSWRhaG8iLCJJbGxpbm9pcyIsIkluZGlhbmEiLCJLYW5zYXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS2VudHVja3kiLCJMb3Vpc2lhbmEiLCJNYXNzYWNodXNldHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcnlsYW5kIiwiTWFpbmUiICwiTWljaGlnYW4iLCJNaW5uZXNvdGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc291cmkiLCJNaXNzaXNzaXBwaSIsIk1vbnRhbmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9ydGggQ2Fyb2xpbmEiLCJOb3J0aCBEYWtvdGEiLCJOZWJyYXNrYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXcgSGFtcHNoaXJlIiAsICJOZXcgSmVyc2V5IiAsICAiTmV3IE1leGljbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZXZhZGEiLCJOZXcgWW9yayIsIk9oaW8iLCJPa2xhaG9tYSIgLCJPcmVnb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVubnN5bHZhbmlhIiAsICJSaG9kZSBJc2xhbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU291dGggQ2Fyb2xpbmEiLCAiU291dGggRGFrb3RhIiAsIlRlbm5lc3NlZSIgLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRleGFzIiAsICJVdGFoIiwgIlZpcmdpbmlhIiwiVmVybW9udCIgLCJXYXNoaW5ndG9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldpc2NvbnNpbiIsICJXZXN0IFZpcmdpbmlhIiAsICJXeW9taW5nIikKClBlcmNIYXZHdW5zPSBjKDU3LjgsIDUxLjcsIDU1LjMsCiAgICAgICAgICAgICAgIDMxLjEsIDIxLjMsIDM0LjcsCiAgICAgICAgICAgICAgIDE2LjcsIDMuNiwgMjUuNSwKICAgICAgICAgICAgICAgMjQuNSwgNDAuMywgNi43LAogICAgICAgICAgICAgICA0Mi45LCA1NS4zLCAyMC4yLCAzOS4xLCA0Mi4xLAogICAgICAgICAgICAgICA0Ny43LCA0NC4xLCAxMi42LAogICAgICAgICAgICAgICAyMS4zLCA0MC41LCAzOC40LCA0MS43LAogICAgICAgICAgICAgICA0MS43LCA1NS4zLCA1Ny43LAogICAgICAgICAgICAgICA0MS4zLCA1MC43LCAzOC42LAogICAgICAgICAgICAgICAzMC4wLCAxMi4zLCAzNC44LAogICAgICAgICAgICAgICAzMy44LCAxOC4wLCAzMi40LCA0Mi45LCAzOS44LAogICAgICAgICAgICAgICAzNC43LCAxMi44LAogICAgICAgICAgICAgICA0Mi4zLCA1Ni42LCA0My45LAogICAgICAgICAgICAgICAzNS45LCA0My45LCAzNS4xLCA0Mi4wLCAzMy4xLAogICAgICAgICAgICAgICA0NC40LCA1NS40LCA1OS43KQoKc3RhdGVndW5zIDwtIGRhdGEuZnJhbWUoc3RhdGVmdWxsLCBQZXJjSGF2R3VucykKCm1zaG9vdCA8LSBtZXJnZShzdGF0ZWd1bnMsIG1hc3Nob290LCBhbGwueD1GQUxTRSwgYWxsLnk9VFJVRSwgYnkueD0ic3RhdGVmdWxsIiwgYnkueT0ic3RhdGUiKSAlPiUKICBtdXRhdGUoc3RhdGVmdWxsPWFzLmZhY3RvcihzdGF0ZWZ1bGwpKQoKcHJpbnQobXNob290KQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiMjKipFY29sb2dpY2FsIEFuYWx5c2lzKioKClRoZSBlY29sb2dpY2FsIHJlZ3Jlc3Npb24gc2Vla3MgdG8gdW5kZXJzdGFuZCB3aGV0aGVyLCBhdCB0aGUgc3RhdGUgbGV2ZWwsIGRvZXMgdGhlIG51bWJlciBvZiBndW5zIG93bmVkIHJlbGF0ZSB0byB0aGUgbnVtYmVyIG9mIG1hc3Mgc2hvb3RpbmcgaW5jaWRlbmNlcyBpbiB0aGF0IHN0YXRlPyBXaGF0IGlzIGZvdW5kIGlzIHRoYXQgc2ltcGx5IGJlY2F1c2UgYSBwYXJ0aWN1bGFyIHN0YXRlIGhhcyBhIGhpZ2hlciByYXRlIG9mIGd1biBvd25lcnNoaXAgdGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSByZXN1bHQgaW4gaGlnaGVyIGluY2lkZW5jZXMgb2YgbWFzcyBzaG9vdGluZ3MuIFRoaXMgaXMgc29tZXdoYXQgaW50ZXJlc3RpbmcgYmVjYXVzZSBvbmUgbWlnaHQgZXhwZWN0IGEgc3RhdGUgd2l0aCBtb3JlIGd1bnMgdG8gbWVhbiBlYXNpZXIgYWNjZXNzLCBncmVhdGVyIHViaXF1aXR5IG9mIGFjY2VzcyB0byBndW5zLCBpbmRpdmlkdWFscyB3aG8gb3duIG1vcmUgdGhhbiBvbmUgZ3VuLCBhbmQgdGh1cyBwb3RlbnRpYWxseSBhIGhpZ2hlciBsaWtlbGlob29kIG9mIG1vcmUgc2hvb3RpbmdzIGFuZCBzdWJzZXF1ZW50bHkgZGVhdGhzLgoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNob290ZCA8LSBtc2hvb3QgJT4lCiAgZ3JvdXBfYnkoc3RhdGVmdWxsKSAlPiUKICBzdW1tYXJpc2UoZ3Vub3duPW1lYW4oUGVyY0hhdkd1bnMpLCB0b3RhbHZpY3RpbXM9c3VtKHRvdGFsdmljdGltcyksIGluY2lkZW5jZT1uKCkpCgpzdW1tYXJ5KGxtKGluY2lkZW5jZSB+IGd1bm93biwgZGF0YSA9IHNob290ZCkpCmBgYApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKIyMqKkZhdGFsaXRpZXMgYW5kIE51bWJlciBvZiBHdW5zIFVzZWQgLSBBIENvbXBsZXRlIFBvb2xpbmcgTW9kZWwqKgoKVGhpcyBpbmRpdmlkdWFsIGFuYWx5c2lzL2NvbXBsZXRlIHBvb2xpbmcgbW9kZWwgZXhhbWluZXMgdGhlIG51bWJlciBvZiBndW5zIHVzZWQgZHVyaW5nIGFuIGluY2lkZW5jZSBhbmQgd2hldGhlciB0aGlzIGluZmx1ZW5jZXMgdGhlIG51bWJlciBvZiBmYXRhbGl0aWVzLiBUaGUgbW9kZWwncyByZXN1bHRzIGluZGljYXRlIGEgaGlnaGx5IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gZmF0YWxpdGllcyB0aGUgbW9yZSBndW5zIHVzZWQgYnkgYSBzaG9vdGVyIGR1cmluZyBhbiBpbmNpZGVudC4gCgpgYGB7cn0KY3Bvb2xpbmcgPC0gbG0odG90YWx2aWN0aW1zIH4gdG90YWxndW5zLCBkYXRhPW1zaG9vdCkKc3VtbWFyeShjcG9vbGluZykKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjKipGYXRhbGl0aWVzIGFuZCBOdW1iZXIgb2YgR3VucyAtIEEgTm8gUG9vbGluZyBNb2RlbCoqCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjIyoqSW50ZXJjZXB0KioKCldoZW4gY29uc2lkZXJpbmcgdGhlIGludGVyY2VwdCBtb2RlbCwgd2hpY2ggaXMgYW4gaW5kaWNhdGlvbiBvZiBmYXRhbGl0aWVzLCB3ZSBzZWUgdGhhdCBtb3N0IGludGVyY2VwdHMgcmFuZ2UgYmV0d2VlbiAwLTE4IHdoZW4gdGhlcmUgaXMgbm8gY29uc2lkZXJhdGlvbiBvZiBudW1iZXIgb2YgZ3VucyB1c2VkLgoKYGBge3IsIGZpZy5oZWlnaHQ9MS41LCBmaWcud2lkdGg9MiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZGNvZWYgPC0gbXNob290ICU+JQogIGdyb3VwX2J5KHN0YXRlZnVsbCkgJT4lCiAgZG8obW9kPWxtKHRvdGFsdmljdGltcyB+IHRvdGFsZ3VucywgZGF0YT0uKSkKY29lZiA8LSBkY29lZiAlPiUgZG8oZGF0YS5mcmFtZShpbnRjPWNvZWYoLiRtb2QpWzFdKSkKZ2dwbG90KGNvZWYsIGFlcyh4PWludGMpKSArIGdlb21faGlzdG9ncmFtKGZpbGw9ImJsYWNrIikKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjIyoqU2xvcGUqKgoKT3VyIHNsb3BlIG1vZGVscyBzaG93IGEgY29uc2lzdGVudGx5IHBvc2l0aXZlIGltcGFjdCwgc3VnZ2VzdGluZyB0aGF0IHRoZSBtb3JlIGd1bnMgdXNlZCBkdXJpbmcgYSBwYXJ0aWN1bGFyIHNob290aW5nIHJlc3VsdGVkIGluIG1vcmUgZmF0YWxpdGllcy4KCmBgYHtyLCBmaWcuaGVpZ2h0PTEuNSwgZmlnLndpZHRoPTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmRjb2VmMSA8LSBtc2hvb3QgJT4lCiAgZ3JvdXBfYnkoc3RhdGVmdWxsKSAlPiUKICBkbyhtb2Q9bG0odG90YWx2aWN0aW1zIH4gdG90YWxndW5zLCBkYXRhPS4pKQpjb2VmMSA8LSBkY29lZjEgJT4lIGRvKGRhdGEuZnJhbWUodG90YWxndW5jID0gY29lZiguJG1vZClbMl0pKQpnZ3Bsb3QgKGNvZWYxLCBhZXMoeD10b3RhbGd1bmMpKSArIGdlb21faGlzdG9ncmFtKGZpbGw9ImRhcmtyZWQiKQpgYGAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiMjTXVsdGlsZXZlbCBNb2RlbGluZwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKIyMqKkZhdGFsaXRpZXMgJiBOdW1iZXIgb2YgR3VucyBieSBTdGF0ZSAtIEEgUmFuZG9tIEludGVyY2VwdCBNb2RlbCoqCgpgYGB7cn0KbTFfbG1lIDwtIGxtZSh0b3RhbHZpY3RpbXN+dG90YWxndW5zLCBkYXRhPW1zaG9vdCwgcmFuZG9tID0gfjF8c3RhdGVmdWxsLCBtZXRob2Q9Ik1MIikKc3VtbWFyeShtMV9sbWUpCmBgYApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKIyMqKkZhdGFsaXRpZXMgYW5kIE51bWJlciBvZiBHdW5zIGJ5IFN0YXRlIC0gQSBSYW5kb20gU2xvcGUgTW9kZWwqKgoKYGBge3J9Cm0yX2xtZSA8LSBsbWUodG90YWx2aWN0aW1zfnRvdGFsZ3VucywgZGF0YT1tc2hvb3QsIHJhbmRvbSA9IH50b3RhbGd1bnN8c3RhdGVmdWxsLCBtZXRob2Q9Ik1MIikKc3VtbWFyeShtMl9sbWUpCmBgYAoKIyMjTW9kZWwocykgU3VtbWFyeQoKV2hlbiBhY2NvdW50aW5nIGZvciB0aGUgdmFyaWF0aW9ucy9kaWZmZXJlbmNlcyBiZXR3ZWVuIHN0YXRlcyB3ZSBjb250aW51ZSB0byBzZWUgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG51bWJlciBvZiBndW5zIHVzZWQgYW5kIGZhdGFsaXRpZXMsIHdoaWNoIHN0aWxsIGluY3JlYXNlIGFzIHRoZSBudW1iZXIgb2YgZ3VucyB1c2VkIHNpbWlsYXJseSBpbmNyZWFzZXMuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwojIyoqSW50cm9kdWNpbmcgQ292YXJpYXRlIC0gVGhlIEVmZmVjdCBvZiBNZW50YWwgSWxsbmVzcyoqCgpUaGUgbW9kZWwgbWFpbnRhaW5zIGl0cyBzaWduaWZpY2FuY2UgaW4gcmVnYXJkcyB0byBudW1iZXIgb2YgZ3VucyB1c2VkLCBhbmQgdGhlIG1vZGVsIGFsc28gcmV2ZWFsIHN0YXRpc3RpY2FsIHNpZ25pZmljYW5jZSBhbmQgYW4gaW5jcmVhc2UgaW4gZmF0YWxpdGllcyB3aGVuIGNvbnNpZGVyaW5nIG1lbnRhbCBpbGxuZXNzIGFtb25nc3QgY29udmljdGVkIG1hc3Mgc2hvb3RlcnMuCgpgYGB7cn0KbTNfbG1lIDwtIGxtZSh0b3RhbHZpY3RpbXMgfiB0b3RhbGd1bnMrbWVudGFsaWxsLCBkYXRhPW1zaG9vdCwgcmFuZG9tID0gfnRvdGFsZ3Vuc3xzdGF0ZWZ1bGwsIG1ldGhvZD0iTUwiKQpzdW1tYXJ5KG0zX2xtZSkKYGBgCgojIyoqTWVudGFsIElsbG5lc3MgYW5kIEFjY2VzcyB0byBNYW55IEd1bnMgYnkgU3RhdGUgLSBBbiBJbnRlcmFjdGlvbiBNb2RlbCoqCgpXaGVuIGludGVyYWN0aW5nIG51bWJlciBvZiBndW5zIHVzZWQgYW5kIG1lbnRhbCBpbGxuZXNzIC0tIGRvIHNob290ZXJzIHdpdGggYSBoaXN0b3J5IG9mIG1lbnRhbCBoaXN0b3J5IGtpbGwgbW9yZSB3aXRoIG1vcmUgZ3VucyAtLSB0aGUgbW9kZWwgaXMgd2Vha2VuZWQgYW5kIGxvc2VzIHNpZ25pZmljYW5jZS4gVGhlcmUgbWF5IGJlIG5vIGludGVyYWN0aXZlIGVmZmVjdC4gCgpgYGB7cn0KbTRfbG1lIDwtIGxtZSh0b3RhbHZpY3RpbXMgfiB0b3RhbGd1bnMqbWVudGFsaWxsLCBkYXRhPW1zaG9vdCwgcmFuZG9tID0gfnRvdGFsZ3Vuc3xzdGF0ZWZ1bGwsIG1ldGhvZD0iTUwiKQpzdW1tYXJ5KG00X2xtZSkKYGBgCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgojIyoqTW9kZWwgU2VsZWN0aW9uKioKCk91ciB0aGlyZCBtdWx0aWxldmVsIG1vZGVsIHByb3ZlcyB0byBiZSB0aGUgYmVzdCBmaXQgd2hlbiBtb2RlbHMgYXJlIGdyb3VwZWQgYW5kIHZpZXdlZCBmb3IgdGhlIGxvd2VzdCBBSUMgdmFsdWUuIApgYGB7cn0KQUlDKGNwb29saW5nLCBtMV9sbWUsIG0yX2xtZSwgbTNfbG1lLCBtNF9sbWUpCmBgYAoKIyMqKkJlc3QgRml0IE1vZGVscyoqCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSJhc2lzIn0KaHRtbHJlZyhsaXN0KG0yX2xtZSwgbTNfbG1lLCBtNF9sbWUpKQpgYGAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiMjKipJbiBDb25jbHVzaW9uKioKCkEgZ3JhcGhpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiZXN0IGZpdCBtb2RlbCBpbmRpY2F0ZXMgdGhhdCBtb3JlIGd1bnMgdXNlZCBtZWFucyBtb3JlIGZhdGFsaXRpZXMuIEFkZGl0aW9uYWxseSwgaWYgYSBzaG9vdGVyIGlzIHJlcG9ydGVkIHRvIGhhdmUgYSBoaXN0b3J5IG9mIG1lbnRhbCBpbGxuZXNzIHRoZXkgYXJlIGFsc28gbGlrZWxpZXIgdG8ga2lsbCBtb3JlIHRoYW4gdGhvc2Ugd2l0aCBubyBwcmlvciBoaXN0b3J5LiBUaGUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgdHdvIHNob3dlZCBubyBzaWduaWZpY2FudCBlZmZlY3QuIAoKYGBge3IsIGZpZy5oZWlnaHQ9MS41LCBmaWcud2lkdGg9MiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdmlzcmVnKG0zX2xtZSkKYGBgCgojIyMjI05vdGUKSXQgd2FzIG15IGludGVudGlvbiB0byBhbHNvIGluY2x1ZGUgdGhlIGNvdmFyaWF0ZSBpbiB0aGUgcG9vbGluZy9ubyBwb29saW5nIG1vZGVscyBidXQgZW5jb3VudGVyZWQgYW4gZXJyb3IgbGFzdCBtaW51dGUgd2hlbiBhZGp1c3RpbmcgdGhlIGxtIHRvIGFjY291bnQgZm9yIHRoZSBjb3ZhcmlhdGUgaW4gdGhlIHNsb3Blcy4gSSB0cmllZCB0byB1bmRlcnN0YW5kIGhvdyB0byBmaXggaXQgYnV0IGNvdWxkbid0LiBNeSBtaXN0YWtlLiAgCg==