1 Introduction

In this project we are going to fit the quasi-Poisson regression model on the counts of cyclists who entered and left the Williamsburg Bridge. We will report the value of the estimated dispersion parameter and based on the value determine whether the regular Poisson model or the quasi-Poisson should be used as the final model. Lastly, we will make a visualization to show the relationship between the number of cyclists who entered and left the bridge and the related predictor variables.

1.1 Data

Here are all the variables in this project:

  • Date- observation ID
  • AvgTemp-(HighTemp + LowTemp)/2.
  • NewPrecip-if Precipitation = 0, then NewPrecip = 0; if Precipitation > 0, then NewPrecip = 1.
  • WilliamsburgBridge- bike count on the Williamsburg Bridge.
  • Total-Bike count of all bridges

2 Poisson Regression on Rates

The following model assesses the potential relationship between biker count rates on the Williamsburg bridge and Date, AvgTemp, and NewPrecip,. This is the primary interest of the model.

Poisson regression on the rate of the the bike rate of people coming in and out of the bridge.
  Estimate Std. Error z value Pr(>|z|)
(Intercept) 5.036 14.68 0.343 0.7316
Date -0.0001417 0.0003429 -0.4132 0.6795
AvgTemp -0.001413 0.0003525 -4.009 6.095e-05
NewPrecip 0.01941 0.005767 3.366 0.0007623

The above table indicates that Date is not a good fit for this model due to its p-value. The coefficients represent the log change in expected count for a one unit increase in our predictor value. The log rates of NewPrecip were higher than any other variable since its absolute value is the highest out of all predictor variables.

2.1 Quasi-Poisson Rate Model

The quasi-Poisson returns the dispersion coefficient.

Quasi-Poisson regression on the rate of the bike rate of people coming in and out of the bridge.
  Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.036 30.44 0.1654 0.8699
Date -0.0001417 0.000711 -0.1993 0.8436
AvgTemp -0.001413 0.0007308 -1.934 0.06412
NewPrecip 0.01941 0.01196 1.624 0.1165

Looking at this table we can see that Date still is not a good predictor variable and we will have to take the variable out of the final model. In this model, Date still is the lowest estimate and NewPrecip is the highest of the predictor variables. AvgTemp is the most significant value based on p-value.

The dispersion index can be extracted from the quasi-Poisson object with the following code

Dispersion
7.451

The dispersion index is 7.451. This is a high number so there is over dispersion. This means that we stay with the Quasi-Poisson rate model.

2.2 Visuals

These visuals below are to show the relationship between the number of cyclists who entered and left the bridge and their relation to AvgTemp, Date, and Precipitation.

Looking at these graphs you can see that both of their predicted bikers go down as the date passes. If you look at the other graph you will see that “no precipitation” has a higher average of predicted bikers than “precipitation”. Precipitation effects both graphs in a big way.

3 Discussions and Conclusions

The quasi-poisson rate model based on the bike count is not appropriate since the information on the total biker count is a key variable in the study of WilliamsburgBridge distribution. Including the total biker count in the quasi-poisson rate model will reduce the statistical significance of AvgTemp and NewPrecip. See the following output of the fitted quasi-poisson rate model of Williamsburg Bridge bike count adjusted by total bike count.

The Poisson regression model for the counts of bikers versus the average temp, precipitation, and the total biker count.
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.5851487 0.1735099 -3.3724224 0.0023420
AvgTemp -0.0000765 0.0008017 -0.0954342 0.9247017
NewPrecip 0.0053194 0.0117947 0.4509952 0.6557320
log(Total) 0.9458853 0.0206076 45.8998833 0.0000000

The log(Total) in bike rate is significantly higher than the other predictor variables . There should be more investigation in why the log(Total) is distributing the data.

There is a negative linear relationship between AvgTemp and Date. The AvgTemp decreases as Date increase.

The last statistical observation is that there is no interaction effect between the precip groups and nonprecip. The rate curves are “parallel”.

This is only a small data set with limited information. All conclusions in this report are only based on the given data set.

LS0tCnRpdGxlOiAiV2lsbGlhbXNidXJnIEJyaWRnZSBQb2lzc29uIFJlZ3Jlc3Npb24iCmF1dGhvcjogIlJ5YW4gTGVibyIKZGF0ZTogIjIwMjQtMTEtMTIiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIHRvY19mbG9hdDogeWVzCiAgICBmaWdfd2lkdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMKICAgIHRoZW1lOiBsdW1lbgogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBrZWVwX21kOiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgZmlnX3dpZHRoOiAzCiAgICBmaWdfaGVpZ2h0OiAzCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKc2x3YXlzX2FsbG93X2h0bWw6IHRydWUKLS0tCgpgYGB7PWh0bWx9Cgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoKLyogQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyAoQ1NTKSBpcyBhIHN0eWxlc2hlZXQgbGFuZ3VhZ2UgdXNlZCB0byBkZXNjcmliZSB0aGUgcHJlc2VudGF0aW9uIG9mIGEgZG9jdW1lbnQgd3JpdHRlbiBpbiBIVE1MIG9yIFhNTC4gaXQgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIGZvciBhZGRpbmcgc3R5bGUgKGUuZy4sIGZvbnRzLCBjb2xvcnMsIHNwYWNpbmcpIHRvIFdlYiBkb2N1bWVudHMuICovCgpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLwogIGZvbnQtc2l6ZTogMjRweDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOwp9Cmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8KICBmb250LXNpemU6IDIwcHg7CiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7CiAgY29sb3I6IERhcmtCbHVlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLwogICAgZm9udC1zaXplOiAyMnB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovCiAgICBmb250LXNpemU6IDIwcHg7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgMyBzZWN0aW9uIHRpdGxlICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCmg0IHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDQgc2VjdGlvbiB0aXRsZSAgKi8KICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IGRhcmtyZWQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9Cgpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQoKLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0KCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9Cgo8L3N0eWxlPgpgYGAKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CiMgRGV0ZWN0LCBpbnN0YWxsLCBhbmQgbG9hZCBwYWNrYWdlcyBpZiBuZWVkZWQuCmlmICghcmVxdWlyZSgia25pdHIiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpCiAgIGxpYnJhcnkoa25pdHIpCn0KaWYgKCFyZXF1aXJlKCJsZWFmbGV0IikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpCiAgIGxpYnJhcnkobGVhZmxldCkKfQppZiAoIXJlcXVpcmUoIkVudlN0YXRzIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiRW52U3RhdHMiKQogICBsaWJyYXJ5KEVudlN0YXRzKQp9CmlmICghcmVxdWlyZSgiTUFTUyIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQogICBsaWJyYXJ5KE1BU1MpCn0KaWYgKCFyZXF1aXJlKCJwaHl0b29scyIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoInBoeXRvb2xzIikKICAgbGlicmFyeShwaHl0b29scykKfQppZiAoIXJlcXVpcmUoIm1sYmVuY2giKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJtbGJlbmNoIikKICAgbGlicmFyeShtbGJlbmNoKQp9CmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikKICAgbGlicmFyeShwYW5kZXIpCn0KaWYgKCFyZXF1aXJlKCJJU3dSIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygiSVN3UiIpCiAgIGxpYnJhcnkoSVN3UikKfQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikKICAgbGlicmFyeShnZ3Bsb3QyKQp9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsICAKICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICAKICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgCiAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gRkFMU0UgICAKICAgICAgICAgICAgICAgICAgICAgICkgICAKYGBgCgoKYGBge3J9CmJpa2VzIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUnlhbkxlYm8vU1RBLTMyMS9yZWZzL2hlYWRzL21haW4vRGF0YSUyMGZpbGVXaWxsaWFtc2J1cmdCcmlkZ2UuY3N2IiwgaGVhZGVyID0gVFJVRSkKYGBgCgoKYGBge3J9CmJpa2VzJEF2Z1RlbXAgPC0gKGJpa2VzJEhpZ2hUZW1wICsgYmlrZXMkTG93VGVtcCkgLyAyCgpiaWtlcyROZXdQcmVjaXAgPC0gaWZlbHNlKGJpa2VzJFByZWNpcGl0YXRpb24gPiAwLCAxLCAwKQoKYGBgCgojIEludHJvZHVjdGlvbgpJbiB0aGlzIHByb2plY3Qgd2UgYXJlIGdvaW5nIHRvIGZpdCB0aGUgcXVhc2ktUG9pc3NvbiByZWdyZXNzaW9uIG1vZGVsIG9uIHRoZSBjb3VudHMgb2YgY3ljbGlzdHMgd2hvIGVudGVyZWQgYW5kIGxlZnQgdGhlIFdpbGxpYW1zYnVyZyBCcmlkZ2UuIFdlIHdpbGwgcmVwb3J0IHRoZSB2YWx1ZSBvZiB0aGUgZXN0aW1hdGVkIGRpc3BlcnNpb24gcGFyYW1ldGVyIGFuZCBiYXNlZCBvbiB0aGUgdmFsdWUgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJlZ3VsYXIgUG9pc3NvbiBtb2RlbCBvciB0aGUgcXVhc2ktUG9pc3NvbiBzaG91bGQgYmUgdXNlZCBhcyB0aGUgZmluYWwgbW9kZWwuIExhc3RseSwgd2Ugd2lsbCBtYWtlIGEgdmlzdWFsaXphdGlvbiB0byBzaG93IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgbnVtYmVyIG9mIGN5Y2xpc3RzIHdobyBlbnRlcmVkIGFuZCBsZWZ0IHRoZSBicmlkZ2UgYW5kIHRoZSByZWxhdGVkIHByZWRpY3RvciB2YXJpYWJsZXMuCgojIyBEYXRhCkhlcmUgYXJlIGFsbCB0aGUgdmFyaWFibGVzIGluIHRoaXMgcHJvamVjdDoKCiogRGF0ZS0gb2JzZXJ2YXRpb24gSUQKKiBBdmdUZW1wLShIaWdoVGVtcCArIExvd1RlbXApLzIuCiogTmV3UHJlY2lwLWlmIFByZWNpcGl0YXRpb24gPSAwLCB0aGVuIE5ld1ByZWNpcCA9IDA7IGlmIFByZWNpcGl0YXRpb24gPiAwLCB0aGVuIE5ld1ByZWNpcCA9IDEuCiogV2lsbGlhbXNidXJnQnJpZGdlLSBiaWtlIGNvdW50IG9uIHRoZSBXaWxsaWFtc2J1cmcgQnJpZGdlLgoqIFRvdGFsLUJpa2UgY291bnQgb2YgYWxsIGJyaWRnZXMKCgoKCiMgUG9pc3NvbiBSZWdyZXNzaW9uIG9uIFJhdGVzCgpUaGUgZm9sbG93aW5nIG1vZGVsIGFzc2Vzc2VzIHRoZSBwb3RlbnRpYWwgcmVsYXRpb25zaGlwIGJldHdlZW4gYmlrZXIgY291bnQgcmF0ZXMgb24gdGhlIFdpbGxpYW1zYnVyZyBicmlkZ2UgYW5kIERhdGUsIEF2Z1RlbXAsIGFuZCBOZXdQcmVjaXAsLiBUaGlzIGlzIHRoZSBwcmltYXJ5IGludGVyZXN0IG9mIHRoZSBtb2RlbC4gCgpgYGB7cn0KbW9kZWwucmF0ZXMgPC0gZ2xtKFdpbGxpYW1zYnVyZ0JyaWRnZSB+IERhdGUgKyBBdmdUZW1wKyBOZXdQcmVjaXAsIG9mZnNldCA9IGxvZyhUb3RhbCksIAogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gcG9pc3NvbihsaW5rID0gImxvZyIpLCBkYXRhID0gYmlrZXMpCnBhbmRlcihzdW1tYXJ5KG1vZGVsLnJhdGVzKSRjb2VmLCBjYXB0aW9uID0gIlBvaXNzb24gcmVncmVzc2lvbiBvbiB0aGUgcmF0ZSBvZiB0aGUgCiAgICAgIHRoZSBiaWtlIHJhdGUgb2YgcGVvcGxlIGNvbWluZyBpbiBhbmQgb3V0IG9mIHRoZSBicmlkZ2UuIikKYGBgCgpUaGUgYWJvdmUgdGFibGUgaW5kaWNhdGVzIHRoYXQgRGF0ZSBpcyBub3QgYSBnb29kIGZpdCBmb3IgdGhpcyBtb2RlbCBkdWUgdG8gaXRzIHAtdmFsdWUuIFRoZSBjb2VmZmljaWVudHMgcmVwcmVzZW50IHRoZSBsb2cgY2hhbmdlIGluIGV4cGVjdGVkIGNvdW50IGZvciBhIG9uZSB1bml0IGluY3JlYXNlIGluIG91ciBwcmVkaWN0b3IgdmFsdWUuIFRoZSBsb2cgcmF0ZXMgb2YgTmV3UHJlY2lwIHdlcmUgaGlnaGVyIHRoYW4gYW55IG90aGVyIHZhcmlhYmxlIHNpbmNlIGl0cyBhYnNvbHV0ZSB2YWx1ZSBpcyB0aGUgaGlnaGVzdCBvdXQgb2YgYWxsIHByZWRpY3RvciB2YXJpYWJsZXMuIAoKCiMjIFF1YXNpLVBvaXNzb24gUmF0ZSBNb2RlbAoKIFRoZSBxdWFzaS1Qb2lzc29uIHJldHVybnMgdGhlIGRpc3BlcnNpb24gY29lZmZpY2llbnQuCgpgYGB7cn0KcXVhc2ltb2RlbC5yYXRlcyA8LSBnbG0oV2lsbGlhbXNidXJnQnJpZGdlIH4gRGF0ZSsgQXZnVGVtcCsgTmV3UHJlY2lwLCBvZmZzZXQgPSBsb2coVG90YWwpLCAKICAgICAgICAgICAgICAgICAgIGZhbWlseSA9IHF1YXNpcG9pc3NvbiwgZGF0YSA9IGJpa2VzKQpwYW5kZXIoc3VtbWFyeShxdWFzaW1vZGVsLnJhdGVzKSRjb2VmLCBjYXB0aW9uID0gIlF1YXNpLVBvaXNzb24gcmVncmVzc2lvbiBvbiB0aGUgcmF0ZSBvZiB0aGUgYmlrZSByYXRlIG9mIHBlb3BsZSBjb21pbmcgaW4gYW5kIG91dCBvZiB0aGUgYnJpZGdlLiIpCgpgYGAKCkxvb2tpbmcgYXQgdGhpcyB0YWJsZSB3ZSBjYW4gc2VlIHRoYXQgRGF0ZSBzdGlsbCBpcyBub3QgYSBnb29kIHByZWRpY3RvciB2YXJpYWJsZSBhbmQgd2Ugd2lsbCBoYXZlIHRvIHRha2UgdGhlIHZhcmlhYmxlIG91dCBvZiB0aGUgZmluYWwgbW9kZWwuIEluIHRoaXMgbW9kZWwsIERhdGUgc3RpbGwgaXMgdGhlIGxvd2VzdCBlc3RpbWF0ZSBhbmQgTmV3UHJlY2lwIGlzIHRoZSBoaWdoZXN0IG9mIHRoZSBwcmVkaWN0b3IgdmFyaWFibGVzLiBBdmdUZW1wIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IHZhbHVlIGJhc2VkIG9uIHAtdmFsdWUuCgpUaGUgZGlzcGVyc2lvbiBpbmRleCBjYW4gYmUgZXh0cmFjdGVkIGZyb20gdGhlIHF1YXNpLVBvaXNzb24gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBjb2RlCgpgYGB7cn0KeWRpZj1iaWtlcyRXaWxsaWFtc2J1cmdCcmlkZ2UtZXhwKG1vZGVsLnJhdGVzJGxpbmVhci5wcmVkaWN0b3JzKSAgCnByc2QgPSB5ZGlmL3NxcnQoZXhwKG1vZGVsLnJhdGVzJGxpbmVhci5wcmVkaWN0b3JzKSkgICAKcGhpID0gc3VtKHByc2ReMikvMTUgICAgICAgICAgIApwYW5kZXIoY2JpbmQoRGlzcGVyc2lvbiA9IHBoaSkpCmBgYAoKVGhlIGRpc3BlcnNpb24gaW5kZXggaXMgNy40NTEuIFRoaXMgaXMgYSBoaWdoIG51bWJlciBzbyB0aGVyZSBpcyBvdmVyIGRpc3BlcnNpb24uIFRoaXMgbWVhbnMgdGhhdCB3ZSBzdGF5IHdpdGggdGhlIFF1YXNpLVBvaXNzb24gcmF0ZSBtb2RlbC4KCiMjIFZpc3VhbHMKClRoZXNlIHZpc3VhbHMgYmVsb3cgYXJlIHRvIHNob3cgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgY3ljbGlzdHMgd2hvIGVudGVyZWQgYW5kIGxlZnQgdGhlIGJyaWRnZSBhbmQgdGhlaXIgcmVsYXRpb24gdG8gQXZnVGVtcCwgRGF0ZSwgYW5kIFByZWNpcGl0YXRpb24uCgpgYGB7cn0KCmJpa2VzJHByZWRpY3RfYjwtIGV4cCg1LjAzNiAtIDAuMDAwMTQqYmlrZXMkRGF0ZSAtIDAuMDAxNCpiaWtlcyRBdmdUZW1wIC0gMC4wMTk0KmJpa2VzJE5ld1ByZWNpcCApCmdncGxvdChiaWtlcywgYWVzKHg9QXZnVGVtcCwgeT1wcmVkaWN0X2IsIGNvbG9yPSBmYWN0b3IoTmV3UHJlY2lwKSkpKyBnZW9tX2xpbmUoKSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygicmVkIiwgImJsdWUiKSwgbGFiZWxzPSBjKCJObyBQcmVjaXAiLCJQcmVjaXAiKSkgKyBsYWJzKHRpdGxlPSAiRGF0ZSBlZmZlY3Qgb24gV2lsbGlhbXNidXJnIEJyaWRnZSBiaWtlcnMiLCB4PSJEYXRlIiwgeT0gIlByZWRpY3RlZCBiaWtlcnMiLCBjb2xvcj0gIk5ld1ByZWNpcCIpKwogIHRoZW1lX21pbmltYWwoKQoKYmlrZXMkcHJlZGljdF9iPC0gZXhwKDUuMDM2IC0gMC4wMDAxNCpiaWtlcyREYXRlIC0gMC4wMDE0KmJpa2VzJEF2Z1RlbXAgLSAwLjAxOTQqYmlrZXMkTmV3UHJlY2lwICkKZ2dwbG90KGJpa2VzLCBhZXMoeD1EYXRlLCB5PXByZWRpY3RfYiwgY29sb3I9IGZhY3RvcihOZXdQcmVjaXApKSkrIGdlb21fbGluZSgpKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCAiYmx1ZSIpLCBsYWJlbHM9IGMoIk5vIFByZWNpcCIsIlByZWNpcCIpKSArIGxhYnModGl0bGU9ICJBdmdUZW1wIGVmZmVjdCBvbiBXaWxsaWFtc2J1cmcgQnJpZGdlIGJpa2VycyIsIHg9IkF2Z1RlbXAiLCB5PSAiUHJlZGljdGVkIGJpa2VycyIsIGNvbG9yPSAiTmV3UHJlY2lwIikrCiAgdGhlbWVfbWluaW1hbCgpCgoKYGBgCgpMb29raW5nIGF0IHRoZXNlIGdyYXBocyB5b3UgY2FuIHNlZSB0aGF0IGJvdGggb2YgdGhlaXIgcHJlZGljdGVkIGJpa2VycyBnbyBkb3duIGFzIHRoZSBkYXRlIHBhc3Nlcy4gSWYgeW91IGxvb2sgYXQgdGhlIG90aGVyIGdyYXBoIHlvdSB3aWxsIHNlZSB0aGF0ICJubyBwcmVjaXBpdGF0aW9uIiBoYXMgYSBoaWdoZXIgYXZlcmFnZSBvZiBwcmVkaWN0ZWQgYmlrZXJzIHRoYW4gInByZWNpcGl0YXRpb24iLiBQcmVjaXBpdGF0aW9uIGVmZmVjdHMgYm90aCBncmFwaHMgaW4gYSBiaWcgd2F5LiAKCgojIERpc2N1c3Npb25zIGFuZCBDb25jbHVzaW9ucwoKVGhlIHF1YXNpLXBvaXNzb24gcmF0ZSBtb2RlbCBiYXNlZCBvbiB0aGUgYmlrZSBjb3VudCBpcyBub3QgYXBwcm9wcmlhdGUgc2luY2UgdGhlIGluZm9ybWF0aW9uIG9uIHRoZSB0b3RhbCBiaWtlciBjb3VudCBpcyBhIGtleSB2YXJpYWJsZSBpbiB0aGUgc3R1ZHkgb2YgV2lsbGlhbXNidXJnQnJpZGdlIGRpc3RyaWJ1dGlvbi4gSW5jbHVkaW5nIHRoZSB0b3RhbCBiaWtlciBjb3VudCBpbiB0aGUgcXVhc2ktcG9pc3NvbiByYXRlIG1vZGVsIHdpbGwgcmVkdWNlIHRoZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2Ugb2YgQXZnVGVtcCBhbmQgTmV3UHJlY2lwLiBTZWUgdGhlIGZvbGxvd2luZyBvdXRwdXQgb2YgdGhlIGZpdHRlZCBxdWFzaS1wb2lzc29uIHJhdGUgbW9kZWwgb2YgV2lsbGlhbXNidXJnIEJyaWRnZSBiaWtlIGNvdW50IGFkanVzdGVkIGJ5IHRvdGFsIGJpa2UgY291bnQuCgpgYGB7cn0KbW9kZWwuZnJlcS5wb3AgPC0gZ2xtKFdpbGxpYW1zYnVyZ0JyaWRnZSB+IEF2Z1RlbXArIE5ld1ByZWNpcCsgbG9nKFRvdGFsKSwgCiAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBxdWFzaXBvaXNzb24sIGRhdGEgPSBiaWtlcykKCnBvaXMuY291bnQuY29lZi5wb3AgPSBzdW1tYXJ5KG1vZGVsLmZyZXEucG9wKSRjb2VmCmthYmxlKHBvaXMuY291bnQuY29lZi5wb3AsIGNhcHRpb24gPSAiVGhlIFBvaXNzb24gcmVncmVzc2lvbiBtb2RlbCBmb3IgCiAgICAgICAgIHRoZSBjb3VudHMgb2YgYmlrZXJzIHZlcnN1cyB0aGUgYXZlcmFnZSB0ZW1wLCAKICAgICAgICAgcHJlY2lwaXRhdGlvbiwgYW5kIHRoZSB0b3RhbCBiaWtlciBjb3VudC4iKQpgYGAKCgpUaGUgbG9nKFRvdGFsKSBpbiBiaWtlIHJhdGUgaXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiB0aGUgb3RoZXIgcHJlZGljdG9yIHZhcmlhYmxlcyAuIFRoZXJlIHNob3VsZCBiZSBtb3JlIGludmVzdGlnYXRpb24gaW4gd2h5IHRoZSBsb2coVG90YWwpIGlzIGRpc3RyaWJ1dGluZyB0aGUgZGF0YS4KClRoZXJlIGlzIGEgbmVnYXRpdmUgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIEF2Z1RlbXAgYW5kIERhdGUuIFRoZSBBdmdUZW1wIGRlY3JlYXNlcyBhcyBEYXRlIGluY3JlYXNlLgoKVGhlIGxhc3Qgc3RhdGlzdGljYWwgb2JzZXJ2YXRpb24gaXMgdGhhdCB0aGVyZSBpcyBubyBpbnRlcmFjdGlvbiBlZmZlY3QgYmV0d2VlbiB0aGUgcHJlY2lwIGdyb3VwcyBhbmQgbm9ucHJlY2lwLiBUaGUgcmF0ZSBjdXJ2ZXMgYXJlICJwYXJhbGxlbCIuCgpUaGlzIGlzIG9ubHkgYSBzbWFsbCBkYXRhIHNldCB3aXRoIGxpbWl0ZWQgaW5mb3JtYXRpb24uIEFsbCBjb25jbHVzaW9ucyBpbiB0aGlzIHJlcG9ydCBhcmUgb25seSBiYXNlZCBvbiB0aGUgZ2l2ZW4gZGF0YSBzZXQuCgoKCgoK