Misrepresentation in Statistics
Example 1:
During lectures we saw several examples where choosing the incorrect baseline could lead to inaccurate visual representations of data. One example we encountered was the case of circulation data of the daily newspapers The Times and the Daily Telegraph.
The daily sales figures for each newspaper are given in the following table
In the code block below we create a data frame to represent these data. The reason for creating this data frame is so it may be used with the plotting functions available in the library ggplot2, which has many more features than the regular barplot() function
Circulation <- c(485729,446954)
Papers<-c("The Times", "Daily Telegraph")
Sales<-data.frame(Papers,Circulation)
Sales
- We recall the basic syntax of the ggplot() function here:
- We plot the data frame Sales
- The argument aes() indicates which item is to appear on the horizontal and vertical axes
- The geom_bar() function controls most features of the bars appearing in the plot:
- stat=“identity” indicates that \(y\)-values correspond to bar height
- fill allows us to control the color of individual bars in the bar chart
- The function coord_catesian() is where the representation of the data is really controlled. By choosing our \(y\)-limits we can make the difference in sales look as we please
- In the plot below, we choose a baseline \(y=420000\), which will make the circulation of the Daily Telegraph look unrealistically small compared to the circulation of The Times. This baseline was used in a similar graph by The Times, in a story newspaper reporting these differences in circulation.
ggplot(Sales, aes(Papers,Circulation))+geom_bar(stat="identity",fill=c("azure4","cornflowerblue"))+coord_cartesian(ylim=c(420000,500000))

- Alternatively, if we make the \(y\)-range of the plot too large, then the difference in circulations will appear negligible. In the plot below, we use an appropriate baseline, however, the upper limit of the bar plot is set to \(y=4,000,000\), which will mean both bars appear to be essentially the same height.
ggplot(Sales, aes(Papers,Circulation))+geom_bar(stat="identity",fill=c("azure4","cornflowerblue"))+coord_cartesian(ylim=c(0,4000000))

- In the final version of this bar plot, we choose the baseline to be \(y=0\), while the upper limit of the bar plot is set to \(y=500,000\)
ggplot(Sales, aes(Papers,Circulation))+geom_bar(stat="identity",fill=c("azure4","cornflowerblue"))+coord_cartesian(ylim=c(0,500000))

- In this plot, we see that the difference in circulations is small, though not completely negligible, when compared to the overall circulation of each newspaper.
Exercise 1:
On 1 January 2013, tax cuts from the era of President George W Bush were set to expire. With the tax cuts in place, the tax rate was 35%, while the tax rate when the tax cuts expire climbed to 39.6%. In a Fox News story reporting this issue, a bar plot was used to represent these tax rates to highlight the difference in tax rates. The baseline use for the plot was a tax rate of 34%.
Given this, answer the following:
Create a data frame to represent the data relating to the tax rate pre and post the expiry date.
Use the base line 34% to plot a bar chart representing the change in tax rates.
Does the tax rate increase look significant or not, when compared to the actual tax rate?
Choose the \(y\)-limits of the graph to make the difference in tax rates look insignificant.
Use appropriate \(y\)-limits to represent the change in tax rate more accurately.
Example 2: Cumulative Revenue vs. Actual Revenue
As an example of how data may be misrepresented by selecting an inappropriate chart we consider the following revenue data at a company
| 1 |
1.22 |
1.22 |
| 2 |
1.81 |
3.03 |
| 3 |
2.14 |
5.17 |
| 4 |
1.65 |
6.82 |
| 5 |
1.50 |
8.32 |
| 6 |
1.36 |
9.68 |
| 7 |
1.17 |
10.85 |
| 8 |
1.08 |
11.93 |
| 9 |
1.07 |
13.00 |
| 10 |
0.98 |
13.98 |
We first create a data frame to represent this data
Q<-c("Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10")
R<-c(1.22,1.81,2.14,1.65,1.50,1.36,1.17,1.08,1.07, 0.98)
CR<-c(1.22,3.03,5.17,6.82,8.32,9.68,10.85,11.93,13.00,13.98)
Revenue<-data.frame(Q,R,CR)
Revenue$Q <- factor(Revenue$Q, levels = Revenue$Q[order(Revenue$CR)])# This will ensure ggplot will plot the data in the correct order
Revenue
The Cumulative Revenue
- We now plot the cumulative revenue of the company
ggplot(Revenue, aes(Q, CR, group=1))+geom_line(color="gray", size=1.5)+geom_point(size=4,color="red")+labs(x="Quarter", y="Cumulative Quarterly Revenue(€ Millions)")

The cumulative revenue plot seems to suggest the company is doing well, with sales constantly increasing.
However, this is a result of plotting the incorrect data. When we plot the sales data directly, we find a very different picture
ggplot(Revenue, aes(Q, R, group=1))+geom_line(color="gray", size=1.5)+geom_point(size=4,color="red")+labs(x="Quarter", y="Quarterly Revenue(€ Millions)")

- When plotting the quarterly revenues directly, we see there is actually a steep decline in the company revenue between Q3 and Q4, and a steady decline in revenue after that.
Exercise 2
The data file RegionalGDPGrowth(2000-2016).csv contains GDP growth rate data for various economic regions around the world: The file is available at
Moodle \(\rightarrow\) Data Visualisation \(\rightarrow\) Workbook Files \(\rightarrow\) RegionalGDPGrowth(2000-2015).csv
Import this data file into the workbook folder using Data<-read.csv(file.chooe()) as usual. The create a data frame from this file using DF<-data.frame(Data)
Using this data frame answer the following:
- Obtain the mean GDP growth rate for each region using mean(DF$region)
- Create a bar plot comparing the average economic growth rate of each region, and choose a baseline such that the economic growth rate of China is exaggerated compared to all the others.
- Choose \(y\)-limits so that the average economic growth rate of each region all appear to be approximately the same.
- Choose \(y\)-limits so that the average growth rates are displayed accurately.
Omitting Data
Another common way data may be misrepresented in statistical charts is by omitting data.
In Example 2 we saw that the revenue of a company could be falsely represented by plotting the cumulative revenue as opposed to the quarterly revenue.
Another way we may misrepresent this data is by not displaying all data available to us:
ggplot(Revenue, aes(Q, R, group=1))+geom_line(color="gray", size=1.5)+geom_point(size=4,color="red")+labs(x="Quarter", y="Quarterly Revenue")+scale_x_discrete(limits=c("Q1","Q2","Q3" ))

- The function scale_x_discrete() allows us to choose which quarters we actually show in the line graph. By only showing data for the first 3 quarters, we manage to give a false impression of the company revenue growth.
Exercise 3:
Using the data frame constructed in Exercise 2 answer the following:
- Plot the GDP growth rate for each region between the years 2000-2007.
- From these plots, what conclusion might be made about economic growth in each region?
- Plot the GDP growth rate for each region between the years 2007-2012.
- What trend might be deduced about the economic growth rate in each region, from these new plots?
- Plot the GDP growth rate for each region between 2000 and 2016.
- What would be a more accurate assessment of the economic growth rate of each region, base on these plot?
LS0tCnRpdGxlOiAiRGF0YSBWaXN1YWxpc2F0aW9uIDIwMTkgLSBBc3NpZ25tZW50IDciCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgoKIyMgTGlzdCBvZiBSIGNvbG9yczoKaHR0cDovL3d3dy5zdGF0LmNvbHVtYmlhLmVkdS9+dHpoZW5nL2ZpbGVzL1Jjb2xvci5wZGYKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKIyBNaXNyZXByZXNlbnRhdGlvbiBpbiBTdGF0aXN0aWNzCiMjIEV4YW1wbGUgMToKCiogRHVyaW5nIGxlY3R1cmVzIHdlIHNhdyBzZXZlcmFsIGV4YW1wbGVzIHdoZXJlIGNob29zaW5nIHRoZSBpbmNvcnJlY3QgYmFzZWxpbmUgY291bGQgbGVhZCB0byBpbmFjY3VyYXRlIHZpc3VhbCByZXByZXNlbnRhdGlvbnMgb2YgZGF0YS4gT25lIGV4YW1wbGUgd2UgZW5jb3VudGVyZWQgd2FzIHRoZSBjYXNlIG9mIGNpcmN1bGF0aW9uIGRhdGEgb2YgdGhlIGRhaWx5IG5ld3NwYXBlcnMgX19UaGUgVGltZXNfXyBhbmQgdGhlICBfX0RhaWx5IFRlbGVncmFwaF9fLgoKKiBUaGUgZGFpbHkgc2FsZXMgZmlndXJlcyBmb3IgZWFjaCBuZXdzcGFwZXIgYXJlIGdpdmVuIGluIHRoZSBmb2xsb3dpbmcgdGFibGUKCiAgfCBEYWlseSBUZWxlZ3JhcGggfCBUaGUgVGltZXMgfAogIHwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwKICB8ICAgICAgNDQ2OTU0ICAgICB8ICA0ODU3MjkgICB8CiogSW4gdGhlIGNvZGUgYmxvY2sgYmVsb3cgd2UgY3JlYXRlIGEgX19kYXRhIGZyYW1lX18gdG8gcmVwcmVzZW50IHRoZXNlIGRhdGEuIFRoZSByZWFzb24gZm9yIGNyZWF0aW5nIHRoaXMgZGF0YSBmcmFtZSBpcyBzbyBpdCBtYXkgYmUgdXNlZCB3aXRoIHRoZSBwbG90dGluZyBmdW5jdGlvbnMgYXZhaWxhYmxlIGluIHRoZSBsaWJyYXJ5IF9fZ2dwbG90Ml9fLCB3aGljaCBoYXMgbWFueSBtb3JlIGZlYXR1cmVzIHRoYW4gdGhlIHJlZ3VsYXIgX19iYXJwbG90KClfXyBmdW5jdGlvbgpgYGB7cn0KQ2lyY3VsYXRpb24gPC0gYyg0ODU3MjksNDQ2OTU0KQpQYXBlcnM8LWMoIlRoZSBUaW1lcyIsICJEYWlseSBUZWxlZ3JhcGgiKQpTYWxlczwtZGF0YS5mcmFtZShQYXBlcnMsQ2lyY3VsYXRpb24pClNhbGVzCmBgYAoqIFdlIHJlY2FsbCB0aGUgYmFzaWMgc3ludGF4IG9mIHRoZSBfX2dncGxvdCgpX18gZnVuY3Rpb24gIGhlcmU6CiAgICAxLiBXZSBwbG90IHRoZSBkYXRhIGZyYW1lIF9fU2FsZXNfXwogICAgMi4gVGhlIGFyZ3VtZW50IF9fYWVzKClfXyBpbmRpY2F0ZXMgd2hpY2ggaXRlbSBpcyB0byBhcHBlYXIgb24gdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGF4ZXMKICAgIDMuIFRoZSBfX2dlb21fYmFyKClfXyBmdW5jdGlvbiBjb250cm9scyBtb3N0IGZlYXR1cmVzIG9mIHRoZSBiYXJzIGFwcGVhcmluZyBpbiB0aGUgcGxvdDoKICAgICAgICAgICogX19zdGF0PSJpZGVudGl0eSJfXyBpbmRpY2F0ZXMgdGhhdCAkeSQtdmFsdWVzIGNvcnJlc3BvbmQgdG8gYmFyIGhlaWdodAogICAgICAgICAgKiBfX2ZpbGxfXyBhbGxvd3MgdXMgdG8gY29udHJvbCB0aGUgY29sb3Igb2YgaW5kaXZpZHVhbCBiYXJzIGluIHRoZSBiYXIgY2hhcnQKICAgIDQuIFRoZSBmdW5jdGlvbiBfX2Nvb3JkX2NhdGVzaWFuKClfXyBpcyB3aGVyZSB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgaXMgcmVhbGx5IGNvbnRyb2xsZWQuIEJ5IGNob29zaW5nIG91ciAkeSQtbGltaXRzIHdlIGNhbiBtYWtlIHRoZSAgICAgICAgIGRpZmZlcmVuY2UgaW4gc2FsZXMgbG9vayBhcyB3ZSBwbGVhc2UgCiogSW4gdGhlIHBsb3QgYmVsb3csIHdlIGNob29zZSBhIGJhc2VsaW5lICR5PTQyMDAwMCQsIHdoaWNoIHdpbGwgbWFrZSB0aGUgY2lyY3VsYXRpb24gb2YgdGhlIF9fRGFpbHkgVGVsZWdyYXBoX18gbG9vayB1bnJlYWxpc3RpY2FsbHkgc21hbGwgY29tcGFyZWQgdG8gdGhlIGNpcmN1bGF0aW9uIG9mIF9fVGhlIFRpbWVzX18uIFRoaXMgYmFzZWxpbmUgd2FzIHVzZWQgaW4gYSBzaW1pbGFyIGdyYXBoIGJ5IF9fVGhlIFRpbWVzX18sIGluIGEgc3RvcnkgbmV3c3BhcGVyIHJlcG9ydGluZyB0aGVzZSBkaWZmZXJlbmNlcyBpbiBjaXJjdWxhdGlvbi4gIApgYGB7cn0KZ2dwbG90KFNhbGVzLCBhZXMoUGFwZXJzLENpcmN1bGF0aW9uKSkrZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLGZpbGw9YygiYXp1cmU0IiwiY29ybmZsb3dlcmJsdWUiKSkrY29vcmRfY2FydGVzaWFuKHlsaW09Yyg0MjAwMDAsNTAwMDAwKSkKYGBgCgoqIEFsdGVybmF0aXZlbHksIGlmIHdlIG1ha2UgdGhlICR5JC1yYW5nZSBvZiB0aGUgcGxvdCB0b28gbGFyZ2UsIHRoZW4gdGhlIGRpZmZlcmVuY2UgaW4gY2lyY3VsYXRpb25zIHdpbGwgX2FwcGVhcl8gbmVnbGlnaWJsZS4gSW4gdGhlIHBsb3QgYmVsb3csIHdlIHVzZSBhbiBhcHByb3ByaWF0ZSBiYXNlbGluZSwgaG93ZXZlciwgdGhlIHVwcGVyIGxpbWl0IG9mIHRoZSBiYXIgcGxvdCBpcyBzZXQgdG8gJHk9NCwwMDAsMDAwJCwgd2hpY2ggd2lsbCBtZWFuIGJvdGggYmFycyBhcHBlYXIgdG8gYmUgZXNzZW50aWFsbHkgdGhlIHNhbWUgaGVpZ2h0LgpgYGB7cn0KZ2dwbG90KFNhbGVzLCBhZXMoUGFwZXJzLENpcmN1bGF0aW9uKSkrZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLGZpbGw9YygiYXp1cmU0IiwiY29ybmZsb3dlcmJsdWUiKSkrY29vcmRfY2FydGVzaWFuKHlsaW09YygwLDQwMDAwMDApKQpgYGAKKiBJbiB0aGUgZmluYWwgdmVyc2lvbiBvZiB0aGlzIGJhciBwbG90LCB3ZSBjaG9vc2UgdGhlIGJhc2VsaW5lIHRvIGJlICR5PTAkLCB3aGlsZSB0aGUgdXBwZXIgbGltaXQgb2YgdGhlIGJhciBwbG90IGlzIHNldCB0byAkeT01MDAsMDAwJAoKYGBge3J9CmdncGxvdChTYWxlcywgYWVzKFBhcGVycyxDaXJjdWxhdGlvbikpK2dlb21fYmFyKHN0YXQ9ImlkZW50aXR5IixmaWxsPWMoImF6dXJlNCIsImNvcm5mbG93ZXJibHVlIikpK2Nvb3JkX2NhcnRlc2lhbih5bGltPWMoMCw1MDAwMDApKQpgYGAKCgoqIEluIHRoaXMgcGxvdCwgd2Ugc2VlIHRoYXQgdGhlIGRpZmZlcmVuY2UgaW4gY2lyY3VsYXRpb25zIGlzIHNtYWxsLCB0aG91Z2ggbm90IGNvbXBsZXRlbHkgbmVnbGlnaWJsZSwgd2hlbiBjb21wYXJlZCB0byB0aGUgb3ZlcmFsbCBjaXJjdWxhdGlvbiBvZiBlYWNoIG5ld3NwYXBlci4KCgojIyBFeGVyY2lzZSAxOgoKT24gMSBKYW51YXJ5IDIwMTMsIHRheCBjdXRzIGZyb20gdGhlIGVyYSBvZiBQcmVzaWRlbnQgR2VvcmdlIFcgQnVzaCB3ZXJlIHNldCB0byBleHBpcmUuIFdpdGggdGhlIHRheCBjdXRzIGluIHBsYWNlLCB0aGUgdGF4IHJhdGUgd2FzIDM1JSwgd2hpbGUgdGhlIHRheCByYXRlIHdoZW4gdGhlIHRheCBjdXRzIGV4cGlyZSBjbGltYmVkIHRvIDM5LjYlLiBJbiBhIEZveCBOZXdzIHN0b3J5IHJlcG9ydGluZyB0aGlzIGlzc3VlLCBhIGJhciBwbG90IHdhcyB1c2VkIHRvIHJlcHJlc2VudCB0aGVzZSB0YXggcmF0ZXMgdG8gaGlnaGxpZ2h0IHRoZSBkaWZmZXJlbmNlIGluIHRheCByYXRlcy4gVGhlIGJhc2VsaW5lIHVzZSBmb3IgdGhlIHBsb3Qgd2FzIGEgdGF4IHJhdGUgb2YgMzQlLgoKR2l2ZW4gdGhpcywgYW5zd2VyIHRoZSBmb2xsb3dpbmc6CgoxLiBDcmVhdGUgYSBkYXRhIGZyYW1lIHRvIHJlcHJlc2VudCB0aGUgZGF0YSByZWxhdGluZyB0byB0aGUgdGF4IHJhdGUgcHJlIGFuZCBwb3N0IHRoZSBleHBpcnkgZGF0ZS4KCjIuIFVzZSB0aGUgYmFzZSBsaW5lIDM0JSB0byBwbG90IGEgYmFyIGNoYXJ0IHJlcHJlc2VudGluZyB0aGUgY2hhbmdlIGluIHRheCByYXRlcy4KCjMuIERvZXMgdGhlIHRheCByYXRlIGluY3JlYXNlIGxvb2sgc2lnbmlmaWNhbnQgb3Igbm90LCB3aGVuIGNvbXBhcmVkIHRvIHRoZSBhY3R1YWwgdGF4IHJhdGU/Cgo0LiBDaG9vc2UgdGhlICR5JC1saW1pdHMgb2YgdGhlIGdyYXBoIHRvIG1ha2UgdGhlIGRpZmZlcmVuY2UgaW4gdGF4IHJhdGVzIGxvb2sgaW5zaWduaWZpY2FudC4KCjUuIFVzZSBhcHByb3ByaWF0ZSAkeSQtbGltaXRzIHRvIHJlcHJlc2VudCB0aGUgY2hhbmdlIGluIHRheCByYXRlIG1vcmUgYWNjdXJhdGVseS4KCiMjICBFeGFtcGxlIDI6IEN1bXVsYXRpdmUgUmV2ZW51ZSB2cy4gQWN0dWFsIFJldmVudWUKCkFzIGFuIGV4YW1wbGUgb2YgaG93IGRhdGEgbWF5IGJlIG1pc3JlcHJlc2VudGVkIGJ5IHNlbGVjdGluZyBhbiBfX2luYXBwcm9wcmlhdGUgY2hhcnRfXyB3ZSBjb25zaWRlciB0aGUgZm9sbG93aW5nIHJldmVudWUgZGF0YSBhdCBhIGNvbXBhbnkKCnwgUXVhcnRlciB8IFJldmVudWUo4oKsMSwwMDAsMDAwKSB8IEN1bXVsYXRpdmUgUmV2ZW51ZSjigqwxLDAwMCwwMDApICAgICB8CnwtLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCAgICAxICAgIHwgICAgICAgMS4yMiAgICAgICAgICB8ICAgICAgICAgIDEuMjIgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgIDIgICAgfCAgICAgICAxLjgxICAgICAgICAgIHwgICAgICAgICAgMy4wMyAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgMyAgICB8ICAgICAgIDIuMTQgICAgICAgICAgfCAgICAgICAgICA1LjE3ICAgICAgICAgICAgICAgICAgICAgIHwgICAgCnwgICAgNCAgICB8ICAgICAgIDEuNjUgICAgICAgICAgfCAgICAgICAgICA2LjgyICAgICAgICAgICAgICAgICAgICAgIHwKfCAgICA1ICAgIHwgICAgICAgMS41MCAgICAgICAgICB8ICAgICAgICAgIDguMzIgICAgICAgICAgICAgICAgICAgICAgfAp8ICAgIDYgICAgfCAgICAgICAxLjM2ICAgICAgICAgIHwgICAgICAgICAgOS42OCAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgNyAgICB8ICAgICAgIDEuMTcgICAgICAgICAgfCAgICAgICAgICAxMC44NSAgICAgICAgICAgICAgICAgICAgIHwKfCAgICA4ICAgIHwgICAgICAgMS4wOCAgICAgICAgICB8ICAgICAgICAgIDExLjkzICAgICAgICAgICAgICAgICAgICAgfAp8ICAgIDkgICAgfCAgICAgICAxLjA3ICAgICAgICAgIHwgICAgICAgICAgMTMuMDAgICAgICAgICAgICAgICAgICAgICB8CnwgICAgMTAgICB8ICAgICAgIDAuOTggICAgICAgICAgfCAgICAgICAgICAxMy45OCAgICAgICAgICAgICAgICAgICAgIHwKCldlIGZpcnN0IGNyZWF0ZSBhIGRhdGEgZnJhbWUgdG8gcmVwcmVzZW50IHRoaXMgZGF0YQpgYGB7cn0KUTwtYygiUTEiLCAiUTIiLCAiUTMiLCAiUTQiLCAiUTUiLCAiUTYiLCAiUTciLCAiUTgiLCAiUTkiLCAiUTEwIikKUjwtYygxLjIyLDEuODEsMi4xNCwxLjY1LDEuNTAsMS4zNiwxLjE3LDEuMDgsMS4wNywgMC45OCkKQ1I8LWMoMS4yMiwzLjAzLDUuMTcsNi44Miw4LjMyLDkuNjgsMTAuODUsMTEuOTMsMTMuMDAsMTMuOTgpClJldmVudWU8LWRhdGEuZnJhbWUoUSxSLENSKQpSZXZlbnVlJFEgPC0gZmFjdG9yKFJldmVudWUkUSwgbGV2ZWxzID0gUmV2ZW51ZSRRW29yZGVyKFJldmVudWUkQ1IpXSkjIFRoaXMgd2lsbCBlbnN1cmUgZ2dwbG90IHdpbGwgcGxvdCB0aGUgZGF0YSBpbiB0aGUgY29ycmVjdCBvcmRlcgpSZXZlbnVlCmBgYAoKCgoKCgojIyMgVGhlIEN1bXVsYXRpdmUgUmV2ZW51ZQoqIFdlIG5vdyBwbG90IHRoZSBjdW11bGF0aXZlIHJldmVudWUgb2YgdGhlIGNvbXBhbnkKYGBge3J9CmdncGxvdChSZXZlbnVlLCBhZXMoUSwgQ1IsIGdyb3VwPTEpKStnZW9tX2xpbmUoY29sb3I9ImdyYXkiLCBzaXplPTEuNSkrZ2VvbV9wb2ludChzaXplPTQsY29sb3I9InJlZCIpK2xhYnMoeD0iUXVhcnRlciIsIHk9IkN1bXVsYXRpdmUgUXVhcnRlcmx5IFJldmVudWUo4oKsIE1pbGxpb25zKSIpCmBgYAoKKiBUaGUgY3VtdWxhdGl2ZSByZXZlbnVlIHBsb3Qgc2VlbXMgdG8gc3VnZ2VzdCB0aGUgY29tcGFueSBpcyBkb2luZyB3ZWxsLCB3aXRoIHNhbGVzIGNvbnN0YW50bHkgaW5jcmVhc2luZy4gCgoqIEhvd2V2ZXIsIHRoaXMgaXMgYSByZXN1bHQgb2YgcGxvdHRpbmcgdGhlIGluY29ycmVjdCBkYXRhLiBXaGVuIHdlIHBsb3QgdGhlIHNhbGVzIGRhdGEgZGlyZWN0bHksIHdlIGZpbmQgYSB2ZXJ5IGRpZmZlcmVudCBwaWN0dXJlCgpgYGB7cn0KZ2dwbG90KFJldmVudWUsIGFlcyhRLCBSLCBncm91cD0xKSkrZ2VvbV9saW5lKGNvbG9yPSJncmF5Iiwgc2l6ZT0xLjUpK2dlb21fcG9pbnQoc2l6ZT00LGNvbG9yPSJyZWQiKStsYWJzKHg9IlF1YXJ0ZXIiLCB5PSJRdWFydGVybHkgUmV2ZW51ZSjigqwgTWlsbGlvbnMpIikKYGBgCiogV2hlbiBwbG90dGluZyB0aGUgcXVhcnRlcmx5IHJldmVudWVzIGRpcmVjdGx5LCB3ZSBzZWUgdGhlcmUgaXMgYWN0dWFsbHkgYSBzdGVlcCBkZWNsaW5lIGluIHRoZSBjb21wYW55IHJldmVudWUgYmV0d2VlbiBRMyBhbmQgUTQsIGFuZCBhIHN0ZWFkeSBkZWNsaW5lIGluIHJldmVudWUgYWZ0ZXIgdGhhdC4KCgojIyBFeGVyY2lzZSAyCgpUaGUgZGF0YSBmaWxlIF9fUmVnaW9uYWxHRFBHcm93dGgoMjAwMC0yMDE2KS5jc3ZfXyBjb250YWlucyBHRFAgZ3Jvd3RoIHJhdGUgZGF0YSBmb3IgdmFyaW91cyBlY29ub21pYyByZWdpb25zIGFyb3VuZCB0aGUgd29ybGQ6IFRoZSBmaWxlIGlzIGF2YWlsYWJsZSBhdAoKICBfX01vb2RsZV9fICRccmlnaHRhcnJvdyQgX19EYXRhIFZpc3VhbGlzYXRpb25fXyAkXHJpZ2h0YXJyb3ckIF9fV29ya2Jvb2sgRmlsZXNfXyAkXHJpZ2h0YXJyb3ckIF9fUmVnaW9uYWxHRFBHcm93dGgoMjAwMC0yMDE1KS5jc3ZfXwogIApJbXBvcnQgdGhpcyBkYXRhIGZpbGUgaW50byB0aGUgd29ya2Jvb2sgZm9sZGVyIHVzaW5nIF9fRGF0YTwtcmVhZC5jc3YoZmlsZS5jaG9vZSgpKV9fIGFzIHVzdWFsLiBUaGUgY3JlYXRlIGEgZGF0YSBmcmFtZSBmcm9tIHRoaXMgZmlsZSB1c2luZyBfX0RGPC1kYXRhLmZyYW1lKERhdGEpX18KClVzaW5nIHRoaXMgZGF0YSBmcmFtZSBhbnN3ZXIgdGhlIGZvbGxvd2luZzoKCiAgMS4gT2J0YWluIHRoZSBtZWFuIEdEUCBncm93dGggcmF0ZSBmb3IgZWFjaCByZWdpb24gdXNpbmcgX19tZWFuKERGJHJlZ2lvbilfXwogIDIuIENyZWF0ZSBhIGJhciBwbG90IGNvbXBhcmluZyB0aGUgYXZlcmFnZSBlY29ub21pYyBncm93dGggcmF0ZSBvZiBlYWNoIHJlZ2lvbiwgYW5kIGNob29zZSBhIGJhc2VsaW5lIHN1Y2ggdGhhdCB0aGUgZWNvbm9taWMgZ3Jvd3RoIHJhdGUgb2YgICAgICBfX0NoaW5hX18gaXMgZXhhZ2dlcmF0ZWQgY29tcGFyZWQgdG8gYWxsIHRoZSBvdGhlcnMuCiAgMy4gQ2hvb3NlICR5JC1saW1pdHMgc28gdGhhdCB0aGUgYXZlcmFnZSBlY29ub21pYyBncm93dGggcmF0ZSBvZiBlYWNoIHJlZ2lvbiBhbGwgYXBwZWFyIHRvIGJlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUuCiAgNC4gQ2hvb3NlICR5JC1saW1pdHMgc28gdGhhdCB0aGUgYXZlcmFnZSBncm93dGggcmF0ZXMgYXJlIGRpc3BsYXllZCBhY2N1cmF0ZWx5LgoKCiMjIE9taXR0aW5nIERhdGEKKiBBbm90aGVyIGNvbW1vbiB3YXkgZGF0YSBtYXkgYmUgbWlzcmVwcmVzZW50ZWQgaW4gc3RhdGlzdGljYWwgY2hhcnRzIGlzIGJ5IG9taXR0aW5nIGRhdGEuCgoqIEluIEV4YW1wbGUgMiB3ZSBzYXcgdGhhdCB0aGUgcmV2ZW51ZSBvZiBhIGNvbXBhbnkgY291bGQgYmUgZmFsc2VseSByZXByZXNlbnRlZCBieSBwbG90dGluZyB0aGUgY3VtdWxhdGl2ZSByZXZlbnVlIGFzIG9wcG9zZWQgdG8gdGhlIHF1YXJ0ZXJseSByZXZlbnVlLgoKKiBBbm90aGVyIHdheSB3ZSBtYXkgbWlzcmVwcmVzZW50IHRoaXMgZGF0YSBpcyBieSBub3QgZGlzcGxheWluZyBhbGwgZGF0YSBhdmFpbGFibGUgdG8gdXM6CgpgYGB7cn0KZ2dwbG90KFJldmVudWUsIGFlcyhRLCBSLCBncm91cD0xKSkrZ2VvbV9saW5lKGNvbG9yPSJncmF5Iiwgc2l6ZT0xLjUpK2dlb21fcG9pbnQoc2l6ZT00LGNvbG9yPSJyZWQiKStsYWJzKHg9IlF1YXJ0ZXIiLCB5PSJRdWFydGVybHkgUmV2ZW51ZSIpK3NjYWxlX3hfZGlzY3JldGUobGltaXRzPWMoIlExIiwiUTIiLCJRMyIgKSkKYGBgICAgCiAgKiBUaGUgZnVuY3Rpb24gX19zY2FsZV94X2Rpc2NyZXRlKClfXyBhbGxvd3MgdXMgdG8gY2hvb3NlIHdoaWNoIHF1YXJ0ZXJzIHdlIGFjdHVhbGx5IHNob3cgaW4gdGhlIGxpbmUgZ3JhcGguIEJ5IG9ubHkgc2hvd2luZyBkYXRhIGZvciB0aGUgZmlyc3QgMyBxdWFydGVycywgd2UgbWFuYWdlIHRvIGdpdmUgYSBmYWxzZSBpbXByZXNzaW9uIG9mIHRoZSBjb21wYW55IHJldmVudWUgZ3Jvd3RoLgogIAojIyBFeGVyY2lzZSAzOgoKVXNpbmcgdGhlIGRhdGEgZnJhbWUgY29uc3RydWN0ZWQgaW4gX19FeGVyY2lzZSAyX18gYW5zd2VyIHRoZSBmb2xsb3dpbmc6CgoxLiBQbG90IHRoZSBHRFAgZ3Jvd3RoIHJhdGUgZm9yIGVhY2ggcmVnaW9uIGJldHdlZW4gdGhlIHllYXJzIDIwMDAtMjAwNy4KMi4gRnJvbSB0aGVzZSBwbG90cywgd2hhdCBjb25jbHVzaW9uIG1pZ2h0IGJlIG1hZGUgYWJvdXQgZWNvbm9taWMgZ3Jvd3RoIGluIGVhY2ggcmVnaW9uPwozLiBQbG90IHRoZSBHRFAgZ3Jvd3RoIHJhdGUgZm9yIGVhY2ggcmVnaW9uIGJldHdlZW4gdGhlIHllYXJzIDIwMDctMjAxMi4KNC4gV2hhdCB0cmVuZCBtaWdodCBiZSBkZWR1Y2VkIGFib3V0IHRoZSBlY29ub21pYyBncm93dGggcmF0ZSBpbiBlYWNoIHJlZ2lvbiwgZnJvbSB0aGVzZSBuZXcgcGxvdHM/CjUuIFBsb3QgdGhlIEdEUCBncm93dGggcmF0ZSBmb3IgZWFjaCByZWdpb24gYmV0d2VlbiAyMDAwIGFuZCAyMDE2Lgo2LiBXaGF0IHdvdWxkIGJlIGEgbW9yZSBhY2N1cmF0ZSBhc3Nlc3NtZW50IG9mIHRoZSBlY29ub21pYyBncm93dGggcmF0ZSBvZiBlYWNoIHJlZ2lvbiwgYmFzZSBvbiB0aGVzZSBwbG90Pw==