Introduction
In this project, I wanted to create a rushing defense metric that can
give us a better overview of how defenses perform versus workhorse
rushers. I then compared my created metric to the NFL’s traditional
average yards per carry allowed stat.
Creating a Metric
Below, I filtered to games where a ball carrier had at least 14
rushing attempts. In today’s NFL it’s harder to find true 20+ carry
workloads every week, so 14 felt like a reasonable cutoff for “workhorse
usage.” I didn’t filter out quarterbacks because if a QB is carrying the
ball 14+ times, that rushing impact is still meaningful. For each
qualifying player-game, I computed that player’s yards per carry in the
game and compared it to their season-long yards per carry. The
difference (game YPC − season YPC) measures how much more (or less)
efficient that player was against a specific defense than they typically
are.

Comparing Metrics
Here, we compare my created metric to the NFL’s average yards per
carry allowed. Although both metrics are constructed from play-by-play
data, they differ in how the data are aggregated. The traditional
yards-per-carry allowed metric summarizes all rushing attempts faced by
a defense, treating each play equally and aggregating directly to the
team level. In contrast, the proposed metric conditions on high-volume
rushing performances and evaluates how a defense affects a runner’s
efficiency relative to their season baseline. Using play-by-play data
for both metrics ensures consistency in data coverage while isolating
the effect of aggregation strategy. So, the first metric answers “how
many yards per rush does a defense allow overall,” while the second
answers “do runners become more efficient than usual when they hit a
workhorse workload against this defense?” To keep the plot readable, I
show teams that rank in the bottom 10 by either metric.

We see that a few teams remain in similar ranks (Bills, Giants,
Bengals, Dolphins, Cardinals, etc), but we also see some major
discrepancies. The Panthers are ranked 11th in yards per carry but 3rd
when they allow 14+ carries. The Chargers drop from 16th to 9th.
Surprisingly, the Bears, Jets, and Falcons become more stout as their
opponent gets more carries.
Conclusion
This project shows how using the same play-by-play data but changing
how it’s aggregated can lead to very different conclusions about run
defense. Traditional yards per carry allowed reflects overall
efficiency, but it misses how defenses perform when opponents commit to
a heavy rushing workload. By focusing on high-volume rushing games and
comparing performance to season baselines, the workhorse rusher metric
highlights situational weaknesses that standard metrics overlook. Some
defenses remain consistent across both measures, while others change
dramatically, suggesting that workload context plays an important role
in evaluating run defense performance.
LS0tDQp0aXRsZTogIldoaWNoIE5GTCBEZWZlbnNlcyBQZXJmb3JtZWQgdGhlIFdvcnN0IEFnYWluc3QgV29ya2hvcnNlIFJ1c2hlcnM/Ig0KYXV0aG9yOiAiTHVrZSBWb2xtIg0KZGF0ZTogIjIwMjYtMDEtMDciDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6ICAgICAgICAgICAjIG91dHB1dCBkb2N1bWVudCBmb3JtYXQNCiAgICB0b2M6IHllcyAgICAgICAgICAgICAgICMgYWRkIHRhYmxlIGNvbnRlbnRzDQogICAgdG9jX2Zsb2F0OiB5ZXMgICAgICAgICAjIHRvY19wcm9wZXJ0eTogZmxvYXRpbmcNCiAgICB0b2NfZGVwdGg6IDQgICAgICAgICAgICMgZGVwdGggb2YgVE9DIGhlYWRpbmdzDQogICAgZmlnX3dpZHRoOiA2ICAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgd2lkdGgNCiAgICBmaWdfaGVpZ2h0OiA0ICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSBoZWlnaHQNCiAgICBmaWdfY2FwdGlvbjogeWVzICAgICAgICMgYWRkIGZpZ3VyZSBjYXB0aW9uDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubyAgICMgbnVtYmVyaW5nIHNlY3Rpb24gaGVhZGluZ3MNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMgICAgICMgVE9DIHN1YmhlYWRpbmcgY29sbGFwc2luZw0KICAgIGNvZGVfZm9sZGluZzogaGlkZSAgICAgIyBmb2xkaW5nL3Nob3dpbmcgY29kZSANCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICMgYWxsb3cgdG8gZG93bmxvYWQgY29tcGxldGUgUk1hcmtkb3duIHNvdXJjZSBjb2RlDQogICAgc21vb3RoX3Njcm9sbDogeWVzICAgICAjIHNjcm9sbGluZyB0ZXh0IG9mIHRoZSBkb2N1bWVudA0KICAgIHRoZW1lOiBsdW1lbiAgICAgICAgICAgIyB2aXN1YWwgdGhlbWUgZm9yIEhUTUwgZG9jdW1lbnQgb25seQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gICAgICAgIyBjb2RlIHN5bnRheCBoaWdobGlnaHRpbmcgc3R5bGVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogJzQnDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KZGl2I1RPQyB7DQogIGxpc3Qtc3R5bGU6IHVwcGVyLXJvbWFuOw0KICBiYWNrZ3JvdW5kLWltYWdlOiBub25lOw0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCn0NCmBgYA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG5mbHJlYWRyKQ0KbGlicmFyeShwdXJycikNCmN1cnJlbnRfc2Vhc29uIDwtIG5mbHJlYWRyOjptb3N0X3JlY2VudF9zZWFzb24oKQ0KDQoNCm5mbHJlYWRyOjouY2xlYXJfY2FjaGUoKQ0KDQpwYnAgPC0gbmZscmVhZHI6OmxvYWRfcGJwKGN1cnJlbnRfc2Vhc29uKQ0KDQptYXgocGJwJHdlZWssIG5hLnJtID0gVFJVRSkNCmBgYA0KDQojIEludHJvZHVjdGlvbg0KDQpJbiB0aGlzIHByb2plY3QsIEkgd2FudGVkIHRvIGNyZWF0ZSBhIHJ1c2hpbmcgZGVmZW5zZSBtZXRyaWMgdGhhdCBjYW4gZ2l2ZSB1cyBhIGJldHRlciBvdmVydmlldyBvZiBob3cgZGVmZW5zZXMgcGVyZm9ybSB2ZXJzdXMgd29ya2hvcnNlIHJ1c2hlcnMuIEkgdGhlbiBjb21wYXJlZCBteSBjcmVhdGVkIG1ldHJpYyB0byB0aGUgTkZMJ3MgdHJhZGl0aW9uYWwgYXZlcmFnZSB5YXJkcyBwZXIgY2FycnkgYWxsb3dlZCBzdGF0LiANCg0KIyBDcmVhdGluZyBhIE1ldHJpYw0KDQpCZWxvdywgSSBmaWx0ZXJlZCB0byBnYW1lcyB3aGVyZSBhIGJhbGwgY2FycmllciBoYWQgYXQgbGVhc3QgMTQgcnVzaGluZyBhdHRlbXB0cy4gSW4gdG9kYXnigJlzIE5GTCBpdOKAmXMgaGFyZGVyIHRvIGZpbmQgdHJ1ZSAyMCsgY2Fycnkgd29ya2xvYWRzIGV2ZXJ5IHdlZWssIHNvIDE0IGZlbHQgbGlrZSBhIHJlYXNvbmFibGUgY3V0b2ZmIGZvciDigJx3b3JraG9yc2UgdXNhZ2Uu4oCdIEkgZGlkbuKAmXQgZmlsdGVyIG91dCBxdWFydGVyYmFja3MgYmVjYXVzZSBpZiBhIFFCIGlzIGNhcnJ5aW5nIHRoZSBiYWxsIDE0KyB0aW1lcywgdGhhdCBydXNoaW5nIGltcGFjdCBpcyBzdGlsbCBtZWFuaW5nZnVsLiBGb3IgZWFjaCBxdWFsaWZ5aW5nIHBsYXllci1nYW1lLCBJIGNvbXB1dGVkIHRoYXQgcGxheWVy4oCZcyB5YXJkcyBwZXIgY2FycnkgaW4gdGhlIGdhbWUgYW5kIGNvbXBhcmVkIGl0IHRvIHRoZWlyIHNlYXNvbi1sb25nIHlhcmRzIHBlciBjYXJyeS4gVGhlIGRpZmZlcmVuY2UgKGdhbWUgWVBDIOKIkiBzZWFzb24gWVBDKSBtZWFzdXJlcyBob3cgbXVjaCBtb3JlIChvciBsZXNzKSBlZmZpY2llbnQgdGhhdCBwbGF5ZXIgd2FzIGFnYWluc3QgYSBzcGVjaWZpYyBkZWZlbnNlIHRoYW4gdGhleSB0eXBpY2FsbHkgYXJlLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0iaGlkZSJ9DQoNCiMgcGJwIG11c3QgYWxyZWFkeSBleGlzdCAoZXg6IHBicCA8LSBsb2FkX3BicChjdXJyZW50X3NlYXNvbikpDQoNCiMgLS0tIFNlYXNvbi1sb25nIGJhc2VsaW5lIChjb21wdXRlIG9uY2UpIC0tLQ0KcmJfc2Vhc29uIDwtIHBicCAlPiUNCiAgZmlsdGVyKHJ1c2hfYXR0ZW1wdCA9PSAxLCAhaXMubmEocnVzaGVyX3BsYXllcl9pZCkpICU+JQ0KICBncm91cF9ieShydXNoZXJfcGxheWVyX2lkLCBydXNoZXJfcGxheWVyX25hbWUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgdG90YWxfYXR0ICAgPSBuKCksDQogICAgdG90YWxfeWFyZHMgPSBzdW0ocnVzaGluZ195YXJkcywgbmEucm0gPSBUUlVFKSwNCiAgICBzZWFzb25feXBjICA9IHRvdGFsX3lhcmRzIC8gdG90YWxfYXR0LA0KICAgIC5ncm91cHMgPSAiZHJvcCINCiAgKQ0KDQojIC0tLSBGdW5jdGlvbjogcmV0dXJucyBzdW1tYXJ5IGZvciBvbmUgZGVmZW5zZSAtLS0NCnJiX3ZzX2RlZl9zdW1tYXJ5IDwtIGZ1bmN0aW9uKGRlZl9hYmJyLCBtaW5fYXR0ID0gMTQpIHsNCg0KICBjb21wIDwtIHBicCAlPiUNCiAgICBmaWx0ZXIocnVzaF9hdHRlbXB0ID09IDEsICFpcy5uYShydXNoZXJfcGxheWVyX2lkKSwgZGVmdGVhbSA9PSBkZWZfYWJicikgJT4lDQogICAgZ3JvdXBfYnkoZ2FtZV9pZCwgd2VlaywgcnVzaGVyX3BsYXllcl9pZCwgcnVzaGVyX3BsYXllcl9uYW1lKSAlPiUNCiAgICBzdW1tYXJpc2UoDQogICAgICBhdHRfdnNfZGVmICAgPSBuKCksDQogICAgICB5YXJkc192c19kZWYgPSBzdW0ocnVzaGluZ195YXJkcywgbmEucm0gPSBUUlVFKSwNCiAgICAgIHlwY192c19kZWYgICA9IHlhcmRzX3ZzX2RlZiAvIGF0dF92c19kZWYsDQogICAgICAuZ3JvdXBzID0gImRyb3AiDQogICAgKSAlPiUNCiAgICBsZWZ0X2pvaW4ocmJfc2Vhc29uLCBieSA9IGMoInJ1c2hlcl9wbGF5ZXJfaWQiLCAicnVzaGVyX3BsYXllcl9uYW1lIikpICU+JQ0KICAgIG11dGF0ZSgNCiAgICAgIGRpZmZfeXBjID0geXBjX3ZzX2RlZiAtIHNlYXNvbl95cGMsDQogICAgICBwZXJjZW50X2NoYW5nZSA9ICh5cGNfdnNfZGVmIC8gc2Vhc29uX3lwYyAtIDEpICogMTAwDQogICAgKSAlPiUNCiAgICBmaWx0ZXIoYXR0X3ZzX2RlZiA+PSBtaW5fYXR0KQ0KDQogIGNvbXAgJT4lDQogICAgc3VtbWFyaXNlKA0KICAgICAgZGVmdGVhbSA9IGRlZl9hYmJyLA0KICAgICAgbl9wbGF5ZXJfZ2FtZXMgPSBuKCksDQogICAgICBhdmdfZGlmZl95cGMgPSBtZWFuKGRpZmZfeXBjLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgYXZnX3BlcmNlbnRfY2hhbmdlID0gbWVhbihwZXJjZW50X2NoYW5nZSwgbmEucm0gPSBUUlVFKSwNCiAgICAgIC5ncm91cHMgPSAiZHJvcCINCiAgICApDQp9DQoNCiMgLS0tIFJ1biBmb3IgZXZlcnkgZGVmZW5zZSBpbiB0aGUgZGF0YSAtLS0NCmFsbF90ZWFtcyA8LSBzb3J0KHVuaXF1ZShuYS5vbWl0KHBicCRkZWZ0ZWFtKSkpDQoNCmFsbF9zdW1tYXJpZXMgPC0gbWFwX2RmcihhbGxfdGVhbXMsIH4gcmJfdnNfZGVmX3N1bW1hcnkoLngsIG1pbl9hdHQgPSAxNCkpICU+JQ0KICBhcnJhbmdlKGRlc2MoYXZnX2RpZmZfeXBjKSkNCg0KYWxsX3N1bW1hcmllcw0KDQpgYGANCg0KDQpgYGB7cn0NCg0KcGxvdF9kZiA8LSBhbGxfc3VtbWFyaWVzDQoNCmdncGxvdChwbG90X2RmLA0KICAgICAgIGFlcyh4ID0gcmVvcmRlcihkZWZ0ZWFtLCBhdmdfZGlmZl95cGMpLA0KICAgICAgICAgICB5ID0gYXZnX2RpZmZfeXBjLA0KICAgICAgICAgICBmaWxsID0gYXZnX2RpZmZfeXBjID4gMCkpICsNCiAgZ2VvbV9jb2woKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKA0KICAgIHZhbHVlcyA9IGMoIlRSVUUiID0gInN0ZWVsYmx1ZSIsICJGQUxTRSIgPSAiZmlyZWJyaWNrIiksDQogICAgbGFiZWxzID0gYygiVFJVRSIgPSAiUkJzIG91dHBlcmZvcm0iLCAiRkFMU0UiID0gIlJCcyB1bmRlcnBlcmZvcm0iKQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJXb3JzdCBEZWZlbnNlcyB2cyBXb3JraG9yc2UgUnVzaGVycyIsDQogICAgeCA9ICJEZWZlbnNlIiwNCiAgICB5ID0gIkF2ZyBZUEMgRGlmZmVyZW5jZSAodnMgc2Vhc29uIGF2ZXJhZ2UpIg0KICApICsNCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9ImhpZGUifQ0KDQpkZWZfeXBjX2FsbG93ZWQgPC0gcGJwICU+JQ0KICBmaWx0ZXIocnVzaF9hdHRlbXB0ID09IDEsICFpcy5uYShkZWZ0ZWFtKSkgJT4lDQogIGdyb3VwX2J5KGRlZnRlYW0pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgeXBjX2FsbG93ZWQgPSBtZWFuKHJ1c2hpbmdfeWFyZHMsIG5hLnJtID0gVFJVRSksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBhcnJhbmdlKGRlc2MoeXBjX2FsbG93ZWQpKQ0KDQpkZWZfeXBjX2FsbG93ZWQNCmBgYA0KDQojIENvbXBhcmluZyBNZXRyaWNzDQoNCkhlcmUsIHdlIGNvbXBhcmUgbXkgY3JlYXRlZCBtZXRyaWMgdG8gdGhlIE5GTCdzIGF2ZXJhZ2UgeWFyZHMgcGVyIGNhcnJ5IGFsbG93ZWQuIEFsdGhvdWdoIGJvdGggbWV0cmljcyBhcmUgY29uc3RydWN0ZWQgZnJvbSBwbGF5LWJ5LXBsYXkgZGF0YSwgdGhleSBkaWZmZXIgaW4gaG93IHRoZSBkYXRhIGFyZSBhZ2dyZWdhdGVkLiBUaGUgdHJhZGl0aW9uYWwgeWFyZHMtcGVyLWNhcnJ5IGFsbG93ZWQgbWV0cmljIHN1bW1hcml6ZXMgYWxsIHJ1c2hpbmcgYXR0ZW1wdHMgZmFjZWQgYnkgYSBkZWZlbnNlLCB0cmVhdGluZyBlYWNoIHBsYXkgZXF1YWxseSBhbmQgYWdncmVnYXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRlYW0gbGV2ZWwuIEluIGNvbnRyYXN0LCB0aGUgcHJvcG9zZWQgbWV0cmljIGNvbmRpdGlvbnMgb24gaGlnaC12b2x1bWUgcnVzaGluZyBwZXJmb3JtYW5jZXMgYW5kIGV2YWx1YXRlcyBob3cgYSBkZWZlbnNlIGFmZmVjdHMgYSBydW5uZXLigJlzIGVmZmljaWVuY3kgcmVsYXRpdmUgdG8gdGhlaXIgc2Vhc29uIGJhc2VsaW5lLiBVc2luZyBwbGF5LWJ5LXBsYXkgZGF0YSBmb3IgYm90aCBtZXRyaWNzIGVuc3VyZXMgY29uc2lzdGVuY3kgaW4gZGF0YSBjb3ZlcmFnZSB3aGlsZSBpc29sYXRpbmcgdGhlIGVmZmVjdCBvZiBhZ2dyZWdhdGlvbiBzdHJhdGVneS4gU28sIHRoZSBmaXJzdCBtZXRyaWMgYW5zd2VycyAiaG93IG1hbnkgeWFyZHMgcGVyIHJ1c2ggZG9lcyBhIGRlZmVuc2UgYWxsb3cgb3ZlcmFsbCwiIHdoaWxlIHRoZSBzZWNvbmQgYW5zd2VycyAiZG8gcnVubmVycyBiZWNvbWUgbW9yZSBlZmZpY2llbnQgdGhhbiB1c3VhbCB3aGVuIHRoZXkgaGl0IGEgd29ya2hvcnNlIHdvcmtsb2FkIGFnYWluc3QgdGhpcyBkZWZlbnNlPyIgVG8ga2VlcCB0aGUgcGxvdCByZWFkYWJsZSwgSSBzaG93IHRlYW1zIHRoYXQgcmFuayBpbiB0aGUgYm90dG9tIDEwIGJ5IGVpdGhlciBtZXRyaWMuDQoNCmBgYHtyfQ0KcmFua19jb21wYXJlIDwtIGFsbF9zdW1tYXJpZXMgJT4lDQogIGRwbHlyOjpzZWxlY3QoZGVmdGVhbSwgYXZnX2RpZmZfeXBjKSAlPiUNCiAgbGVmdF9qb2luKGRlZl95cGNfYWxsb3dlZCwgYnkgPSAiZGVmdGVhbSIpICU+JQ0KICBtdXRhdGUoDQogICAgcmFua19hdmdfZGlmZl95cGMgPSBkZW5zZV9yYW5rKGRlc2MoYXZnX2RpZmZfeXBjKSksDQogICAgcmFua195cGNfYWxsb3dlZCAgPSBkZW5zZV9yYW5rKGRlc2MoeXBjX2FsbG93ZWQpKSwNCiAgICByYW5rX2dhcCAgICAgICAgICA9IHJhbmtfYXZnX2RpZmZfeXBjIC0gcmFua195cGNfYWxsb3dlZA0KICApDQoNCiMgcGxvdCAxMCB0ZWFtcyB0aGF0IGFyZSB0b3AtMTAgd29yc3QgYnkgZWl0aGVyIG1ldHJpYw0KZHVtYmJlbGxfZGYgPC0gcmFua19jb21wYXJlICU+JQ0KICBmaWx0ZXIocmFua19hdmdfZGlmZl95cGMgPD0gMTAgfCByYW5rX3lwY19hbGxvd2VkIDw9IDEwKSAlPiUNCiAgbXV0YXRlKGRlZnRlYW0gPSByZW9yZGVyKGRlZnRlYW0sIHJhbmtfYXZnX2RpZmZfeXBjKSkgJT4lDQogIGFycmFuZ2UocmFua19hdmdfZGlmZl95cGMpDQoNCmdncGxvdChkdW1iYmVsbF9kZiwgYWVzKHkgPSBkZWZ0ZWFtKSkgKw0KICBnZW9tX3NlZ21lbnQoDQogICAgYWVzKHggPSByYW5rX3lwY19hbGxvd2VkLCB4ZW5kID0gcmFua19hdmdfZGlmZl95cGMpLA0KICAgIGxpbmV3aWR0aCA9IDEsDQogICAgY29sb3IgPSAiZ3JheTYwIg0KICApICsNCiAgZ2VvbV9wb2ludChhZXMoeCA9IHJhbmtfeXBjX2FsbG93ZWQsIGNvbG9yID0gIlRyYWRpdGlvbmFsIFlQQyBBbGxvd2VkIiksIHNpemUgPSAzKSArDQogIGdlb21fcG9pbnQoYWVzKHggPSByYW5rX2F2Z19kaWZmX3lwYywgY29sb3IgPSAiV29ya2hvcnNlIFJCIE1ldHJpYyIpLCBzaXplID0gMykgKw0KICBzY2FsZV94X3JldmVyc2UoDQogICAgYnJlYWtzID0gc2VxKDEsIDMyLCA0KSwNCiAgICBsaW1pdHMgPSBjKDMyLCAxKQ0KICApICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKA0KICAgIG5hbWUgPSAiTWV0cmljIiwNCiAgICB2YWx1ZXMgPSBjKA0KICAgICAgIlRyYWRpdGlvbmFsIFlQQyBBbGxvd2VkIiA9ICJmaXJlYnJpY2siLA0KICAgICAgIldvcmtob3JzZSBSdXNoaW5nIE1ldHJpYyIgICAgID0gInN0ZWVsYmx1ZSINCiAgICApDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlJ1biBEZWZlbnNlIFJhbmsgRGlmZmVyZW5jZXMgYnkgTWV0cmljIiwNCiAgICB4ID0gIkRlZmVuc2l2ZSBSYW5rICgxID0gV29yc3QsIDMyID0gQmVzdCkiLA0KICAgIHkgPSAiVGVhbSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKQ0KICApDQpgYGANCg0KV2Ugc2VlIHRoYXQgYSBmZXcgdGVhbXMgcmVtYWluIGluIHNpbWlsYXIgcmFua3MgKEJpbGxzLCBHaWFudHMsIEJlbmdhbHMsIERvbHBoaW5zLCBDYXJkaW5hbHMsIGV0YyksIGJ1dCB3ZSBhbHNvIHNlZSBzb21lIG1ham9yIGRpc2NyZXBhbmNpZXMuIFRoZSBQYW50aGVycyBhcmUgcmFua2VkIDExdGggaW4geWFyZHMgcGVyIGNhcnJ5IGJ1dCAzcmQgd2hlbiB0aGV5IGFsbG93IDE0KyBjYXJyaWVzLiBUaGUgQ2hhcmdlcnMgZHJvcCBmcm9tIDE2dGggdG8gOXRoLiBTdXJwcmlzaW5nbHksIHRoZSBCZWFycywgSmV0cywgYW5kIEZhbGNvbnMgYmVjb21lIG1vcmUgc3RvdXQgYXMgdGhlaXIgb3Bwb25lbnQgZ2V0cyBtb3JlIGNhcnJpZXMuDQoNCiMgQ29uY2x1c2lvbg0KDQpUaGlzIHByb2plY3Qgc2hvd3MgaG93IHVzaW5nIHRoZSBzYW1lIHBsYXktYnktcGxheSBkYXRhIGJ1dCBjaGFuZ2luZyBob3cgaXTigJlzIGFnZ3JlZ2F0ZWQgY2FuIGxlYWQgdG8gdmVyeSBkaWZmZXJlbnQgY29uY2x1c2lvbnMgYWJvdXQgcnVuIGRlZmVuc2UuIFRyYWRpdGlvbmFsIHlhcmRzIHBlciBjYXJyeSBhbGxvd2VkIHJlZmxlY3RzIG92ZXJhbGwgZWZmaWNpZW5jeSwgYnV0IGl0IG1pc3NlcyBob3cgZGVmZW5zZXMgcGVyZm9ybSB3aGVuIG9wcG9uZW50cyBjb21taXQgdG8gYSBoZWF2eSBydXNoaW5nIHdvcmtsb2FkLiBCeSBmb2N1c2luZyBvbiBoaWdoLXZvbHVtZSBydXNoaW5nIGdhbWVzIGFuZCBjb21wYXJpbmcgcGVyZm9ybWFuY2UgdG8gc2Vhc29uIGJhc2VsaW5lcywgdGhlIHdvcmtob3JzZSBydXNoZXIgbWV0cmljIGhpZ2hsaWdodHMgc2l0dWF0aW9uYWwgd2Vha25lc3NlcyB0aGF0IHN0YW5kYXJkIG1ldHJpY3Mgb3Zlcmxvb2suIFNvbWUgZGVmZW5zZXMgcmVtYWluIGNvbnNpc3RlbnQgYWNyb3NzIGJvdGggbWVhc3VyZXMsIHdoaWxlIG90aGVycyBjaGFuZ2UgZHJhbWF0aWNhbGx5LCBzdWdnZXN0aW5nIHRoYXQgd29ya2xvYWQgY29udGV4dCBwbGF5cyBhbiBpbXBvcnRhbnQgcm9sZSBpbiBldmFsdWF0aW5nIHJ1biBkZWZlbnNlIHBlcmZvcm1hbmNlLg==