General Issues
Make sure your file names and file references use identical
spelling, including upper/lower case. Your code will fail on a
case-sensitive file system if you don’t.
Make sure to commit your work to your local repository and push
your commits to GitLab. We can only see what is on GitLab, not what is
on your computer. You can check what we see by going to the GitLab web
interface.
Include your name and the date in the header of your
.Rmd file using author: and date:
tags. You can use an inline chunk to have the date computed when the
document is rendered. Your header should look something like this:
---
title: "Assignment 3"
author: "Fred Frog"
date: "`r Sys.Date()`"
output: html_document
---
If you want to increase the font size for the body text in your
HTML output one option is to add this line after your document
header:
<style type="text/css"> body{ font-size: 12pt; } </style>
Do not use markdown headers for this. Markdown headers
(lines starting with one or more # characters) should only
be used for section and subsection headers.
1. Choosing Between Faceting and Color
The faceted plot shows each of the seven groups in a sub-plot, or
facet, using the same axis scales for all plots.
library(ggplot2)
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point() +
facet_wrap(~ class, nrow = 2)

The plots are small and there is some over-plotting. The
over-plotting could be reduced by reducing the point size.
A single plot that maps class to color benefits from a
larger point size to improve discriminability of the colors:
ggplot(mpg, aes(x = displ, y = hwy, color = class)) +
geom_point(size = 2.5)

The number of colors is large, which makes discrimination more
difficult, even with the increased point size. But once groups are
identified, their relative positions are easier to see in the colored
plot as all comparisons are within a common set of scales.
Faceting reduces plot size and thus increases over-plotting for
larger data sets. Reducing point size is an option that can be effective
if color and shape are not being used as channels. A significant
drawback of faceting is that some group comparisons are moved from
common scale comparisons to unaligned scale comparisons. This can
sometimes be alleviated somewhat by showing a muted image of the
complete data in the background.
Overall, color may have a slight edge in this data set. But it should
be kept in mind that color is not effective on all display devices or
for all viewers.
In larger data sets color becomes less effective as there will be a
considerable amount of over-plotting, given the point size needed to
support good color discrimination. Faceting will also suffer from more
over-plotting in larger data sets for a given point size, but there is
more flexibility to reduce point size. The shape of the data also plays
a role, so both approaches are worth considering.
2. Faceting with Muted Full Data
The full data can be added as a background layer in a muted color,
such as a light grey:
library(ggplot2)
library(dplyr)
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_point(data = mutate(mpg, class = NULL), color = "lightgrey") +
geom_point() +
facet_wrap(~ class, nrow = 2)

With the full data group-to-whole comparisons are again on aligned
scales. For example, with the full data in the background it is easy to
see that the 2-seaters are quite different than the other cars. Seeing
this in the basic faceted plot shown above is also possible, but it
requires some work.
3. Gun Murders in US States
if (! file.exists("murders.csv"))
download.file("https://www.stat.uiowa.edu/~luke/data/murders.csv",
"murders.csv")
murders <- read.csv("murders.csv")
The following graph shows a plot of the total number of gun murders
against the population of each state and the District of Columbia. Log
axes are used as the distributions of both variables are highly skewed.
The points are colored to show the region associated with each
state.
ggplot(murders, aes(x = population, y = total, color = region)) +
geom_point(size = 2.5) +
scale_x_log10() +
scale_y_log10()

The relationship between the number of murders and the population
size appears to be close to linear. The states in the southern region
are mostly towards the top of the set of points: for a given population
size the number of murders in southern states appears to be higher than
in others.
4. Comparing Some Visualizations
All three plots clearly show that the 5 cylinder group is the
smallest. Distinguishing the sizes of the other groups is more
challenging.
Plot B uses aligned scales. It is easy to see the ordering, even
though the values for 8, 6, and 4 cylinders are quite close.
Plot C relies on length comparisons; it seems possible to recognize
that the 8 cylinder group is the smallest among the 4, 6, and 8 cylinder
groups, but determining which of the 4 and 6 cylinder groups is smaller
is very hard.
Plot A relies on area comparisons. The sizes of the 4, 6, and 8
cylinder groups are very hard to distinguish.
For comparing the group sizes in this data set Plot B is best,
followed by Plot C, and then Plot A.
LS0tCnRpdGxlOiAiQXNzaWdubWVudCAzIE5vdGVzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIgotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChjb2xsYXBzZSA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCiMjIEdlbmVyYWwgSXNzdWVzCgoqIE1ha2Ugc3VyZSB5b3VyIGZpbGUgbmFtZXMgYW5kIGZpbGUgcmVmZXJlbmNlcyB1c2UgaWRlbnRpY2FsCiAgc3BlbGxpbmcsIGluY2x1ZGluZyB1cHBlci9sb3dlciBjYXNlLiBZb3VyIGNvZGUgd2lsbCBmYWlsIG9uIGEKICBjYXNlLXNlbnNpdGl2ZSBmaWxlIHN5c3RlbSBpZiB5b3UgZG9uJ3QuCgoqIE1ha2Ugc3VyZSB0byBjb21taXQgeW91ciB3b3JrIHRvIHlvdXIgbG9jYWwgcmVwb3NpdG9yeSBhbmQgcHVzaCB5b3VyCiAgY29tbWl0cyB0byBHaXRMYWIuIFdlIGNhbiBvbmx5IHNlZSB3aGF0IGlzIG9uIEdpdExhYiwgbm90IHdoYXQgaXMgb24KICB5b3VyIGNvbXB1dGVyLiBZb3UgY2FuIGNoZWNrIHdoYXQgd2Ugc2VlIGJ5IGdvaW5nIHRvIHRoZSBHaXRMYWIgd2ViCiAgaW50ZXJmYWNlLgogCiogSW5jbHVkZSB5b3VyIG5hbWUgYW5kIHRoZSBkYXRlIGluIHRoZSBoZWFkZXIgb2YgeW91ciBgLlJtZGAgZmlsZQogIHVzaW5nIGBhdXRob3I6YCBhbmQgYGRhdGU6YCB0YWdzLiBZb3UgY2FuIHVzZSBhbiBpbmxpbmUgY2h1bmsgdG8KICBoYXZlIHRoZSBkYXRlIGNvbXB1dGVkIHdoZW4gdGhlIGRvY3VtZW50IGlzIHJlbmRlcmVkLiBZb3VyIGhlYWRlcgogIHNob3VsZCBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6CgpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFfQpyaW5saW5lIDwtIGZ1bmN0aW9uKGNvZGUpIHsKICAgIHNwcmludGYoImByICVzYCIsIGNvZGUpCn0KYGBgCiAgICBgYGAKICAgIC0tLQogICAgdGl0bGU6ICJBc3NpZ25tZW50IDMiCiAgICBhdXRob3I6ICJGcmVkIEZyb2ciCiAgICBkYXRlOiAiYHIgcmlubGluZSgiU3lzLkRhdGUoKSIpYCIKICAgIG91dHB1dDogaHRtbF9kb2N1bWVudAogICAgLS0tCiAgICBgYGAKCiogSWYgeW91IHdhbnQgdG8gaW5jcmVhc2UgdGhlIGZvbnQgc2l6ZSBmb3IgdGhlIGJvZHkgdGV4dCBpbiB5b3VyIEhUTUwKICBvdXRwdXQgb25lIG9wdGlvbiBpcyB0byBhZGQgdGhpcyBsaW5lIGFmdGVyIHlvdXIgZG9jdW1lbnQgaGVhZGVyOgoKICAgIGBgYAogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4gYm9keXsgZm9udC1zaXplOiAxMnB0OyB9IDwvc3R5bGU+CiAgICBgYGAKICAgIERvIF9ub3RfIHVzZSBtYXJrZG93biBoZWFkZXJzIGZvciB0aGlzLiBNYXJrZG93biBoZWFkZXJzIChsaW5lcwogICAgc3RhcnRpbmcgd2l0aCBvbmUgb3IgbW9yZSBgI2AgY2hhcmFjdGVycykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IKICAgIHNlY3Rpb24gYW5kIHN1YnNlY3Rpb24gaGVhZGVycy4KCgojIyBHZW5lcmFsIENvbW1lbnRzCgoqIFlvdXIgSFRNTCBmaWxlIHNob3VsZCBiZSBhIHJlcG9ydCBvZiB5b3VyIGZpbmRpbmdzLgoKICAgICogQW55IGdyYXBoIHlvdSBzaG93IHNob3VsZCBiZSBkaXNjdXNzZWQgaW4geW91ciBuYXJyYXRpdmUuCgogICAgKiBBbnkgY29kZSB5b3Ugc2hvdyBzaG91bGQgYmUgZGlzY3Vzc2VkIGluIHlvdXIgbmFycmF0aXZlLgoKICAgICogSWYgeW91IGRvIG5vdCBuZWVkIHRvIGRpc2N1c3MgYSBwaWVjZSBvZiBjb2RlIGluIHRoZSBuYXJyYXRpdmUsCiAgICAgIHVzZSBgZWNobyBGQUxTRWAgdG8gYXZvaWQgc2hvd2luZyBpdC4KCiAgICAqIFlvdXIgcmVwb3J0IHNob3VsZCBhbHNvIG5vdCBjb250YWluIHJhdyBSIG91dHB1dCB1bmxlc3MgeW91IGFyZQogICAgICBkaXNjdXNzaW5nIGhvdyBSIHByZXNlbnRzIHJlc3VsdHMuIE91dHB1dCBzaG91bGQgYmUgaW5jb3Jwb3JhdGVkCiAgICAgIGludG8geW91ciB0ZXh0IHdpdGggaW5saW5lIGNvZGUgb3IgcHJlc2VudGVkIGFzIG5pY2VseSBmb3JtYXR0ZWQKICAgICAgdGFibGVzLgoKKiBZb3VyIGAuUm1kYCBmaWxlLCBhbmQgcG9zc2libHkgc3VwcG9ydGluZyBgLlJgIGZpbGVzLCBjb250YWluIHRoZQogIGNvZGUgZm9yIHlvdXIgYW5hbHlzaXMuCgogICAgKiBJZiB5b3UgbmVlZCB0byB1cGRhdGUgeW91ciBjb2RlLCBvciBpZiBhIGNvbGxhYm9yYXRvciBuZWVkcyB0bwogICAgICB1cGRhdGUgeW91ciBjb2RlLCB0aGF0IHdvcmsgd2lsbCBiZSBkb25lIGluIHlvdXIgYC5SbWRgIGZpbGUuCgogICAgKiBZb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgY29kZSBpbiB5b3VyIGAuUm1kYCBmaWxlIGlzIHJlYWRhYmxlLgoKICAgICogRm9sbG93aW5nIHRoZSBbY29kaW5nIHN0YW5kYXJkc10oY29kaW5nLmh0bWwpIGhlbHBzIHdpdGggdGhpcy4KCiAgICAqIFBsZWFzZSBpbmRlbnQgYnkgNCBzcGFjZXMgZm9yIGVhY2ggbGV2ZWwuIEkgZmluZCB0aGlzIHRoZSBtb3N0CiAgICAgIHJlYWRhYmxlIG9wdGlvbi4KCiogSWYgeW91IHJlYWQgYSBkYXRhIGZpbGUgaW4geW91ciBjb2RlIG1ha2Ugc3VyZSB0aGF0IHlvdSByZWFkIGl0IGluIGEKICB3YXkgdGhhdCB3aWxsIHdvcmsgZm9yIHNvbWVvbmUgZWxzZSB1c2luZyB5b3VyIHJlcG9zaXRvcnkuIElmIHlvdQogIHdhbnQgdG8gcmVhZCBmcm9tIGEgbG9jYWwgZmlsZToKCiAgICAqIE1ha2Ugc3VyZSBpdCBpcyBhdmFpbGFibGUgbG9jYWxseSBlaXRoZXIgYnkgZG93bmxvYWRpbmcgaXQgYXMKICAgICAgbmVlZGVkIG9yIGluY2x1ZGluZyBpdCBpbiB5b3VyIHJlcG9zaXRvcnkuCgogICAgKiBSZWFkIHRoZSBmaWxlIHdpdGggYSByZWxhdGl2ZSBwYXRoIG5hbWUsIGFzc3VtaW5nIHlvdXIgd29ya2luZwogICAgICBkaXJlY3Rvcnkgd2lsbCBiZSB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgeW91ciBgUm1kYCBmaWxlLgoKIyMgMS4gQ2hvb3NpbmcgQmV0d2VlbiBGYWNldGluZyBhbmQgQ29sb3IKClRoZSBmYWNldGVkIHBsb3Qgc2hvd3MgZWFjaCBvZiB0aGUgc2V2ZW4gZ3JvdXBzIGluIGEgc3ViLXBsb3QsIG9yIGZhY2V0LAp1c2luZyB0aGUgc2FtZSBheGlzIHNjYWxlcyBmb3IgYWxsIHBsb3RzLgoKYGBge3IsIGZpZy53aWR0aCA9IDh9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KG1wZywgYWVzKHggPSBkaXNwbCwgeSA9IGh3eSkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBmYWNldF93cmFwKH4gY2xhc3MsIG5yb3cgPSAyKQpgYGAKClRoZSBwbG90cyBhcmUgc21hbGwgYW5kIHRoZXJlIGlzIHNvbWUgb3Zlci1wbG90dGluZy4gVGhlIG92ZXItcGxvdHRpbmcKY291bGQgYmUgcmVkdWNlZCBieSByZWR1Y2luZyB0aGUgcG9pbnQgc2l6ZS4KCkEgc2luZ2xlIHBsb3QgdGhhdCBtYXBzIGBjbGFzc2AgdG8gY29sb3IgYmVuZWZpdHMgZnJvbSBhIGxhcmdlciBwb2ludCBzaXplCnRvIGltcHJvdmUgZGlzY3JpbWluYWJpbGl0eSBvZiB0aGUgY29sb3JzOgoKYGBge3IsIGZpZy53aWR0aCA9IDh9CmdncGxvdChtcGcsIGFlcyh4ID0gZGlzcGwsIHkgPSBod3ksIGNvbG9yID0gY2xhc3MpKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSAyLjUpCmBgYAoKVGhlIG51bWJlciBvZiBjb2xvcnMgaXMgbGFyZ2UsIHdoaWNoIG1ha2VzIGRpc2NyaW1pbmF0aW9uIG1vcmUKZGlmZmljdWx0LCBldmVuIHdpdGggdGhlIGluY3JlYXNlZCBwb2ludCBzaXplLiBCdXQgb25jZSBncm91cHMgYXJlCmlkZW50aWZpZWQsIHRoZWlyIHJlbGF0aXZlIHBvc2l0aW9ucyBhcmUgZWFzaWVyIHRvIHNlZSBpbiB0aGUgY29sb3JlZApwbG90IGFzIGFsbCBjb21wYXJpc29ucyBhcmUgd2l0aGluIGEgY29tbW9uIHNldCBvZiBzY2FsZXMuCgpGYWNldGluZyByZWR1Y2VzIHBsb3Qgc2l6ZSBhbmQgdGh1cyBpbmNyZWFzZXMgb3Zlci1wbG90dGluZyBmb3IgbGFyZ2VyCmRhdGEgc2V0cy4gUmVkdWNpbmcgcG9pbnQgc2l6ZSBpcyBhbiBvcHRpb24gdGhhdCBjYW4gYmUgZWZmZWN0aXZlIGlmCmNvbG9yIGFuZCBzaGFwZSBhcmUgbm90IGJlaW5nIHVzZWQgYXMgY2hhbm5lbHMuIEEgc2lnbmlmaWNhbnQgZHJhd2JhY2sKb2YgZmFjZXRpbmcgaXMgdGhhdCBzb21lIGdyb3VwIGNvbXBhcmlzb25zIGFyZSBtb3ZlZCBmcm9tIGNvbW1vbiBzY2FsZQpjb21wYXJpc29ucyB0byB1bmFsaWduZWQgc2NhbGUgY29tcGFyaXNvbnMuIFRoaXMgY2FuIHNvbWV0aW1lcyBiZQphbGxldmlhdGVkIHNvbWV3aGF0IGJ5IHNob3dpbmcgYSBtdXRlZCBpbWFnZSBvZiB0aGUgY29tcGxldGUgZGF0YSBpbgp0aGUgYmFja2dyb3VuZC4KCk92ZXJhbGwsIGNvbG9yIG1heSBoYXZlIGEgc2xpZ2h0IGVkZ2UgaW4gdGhpcyBkYXRhIHNldC4gQnV0IGl0IHNob3VsZApiZSBrZXB0IGluIG1pbmQgdGhhdCBjb2xvciBpcyBub3QgZWZmZWN0aXZlIG9uIGFsbCBkaXNwbGF5IGRldmljZXMgb3IKZm9yIGFsbCB2aWV3ZXJzLgoKSW4gbGFyZ2VyIGRhdGEgc2V0cyBjb2xvciBiZWNvbWVzIGxlc3MgZWZmZWN0aXZlIGFzIHRoZXJlIHdpbGwgYmUgYQpjb25zaWRlcmFibGUgYW1vdW50IG9mIG92ZXItcGxvdHRpbmcsIGdpdmVuIHRoZSBwb2ludCBzaXplIG5lZWRlZCB0bwpzdXBwb3J0IGdvb2QgY29sb3IgZGlzY3JpbWluYXRpb24uIEZhY2V0aW5nIHdpbGwgYWxzbyBzdWZmZXIgZnJvbSBtb3JlCm92ZXItcGxvdHRpbmcgaW4gbGFyZ2VyIGRhdGEgc2V0cyBmb3IgYSBnaXZlbiBwb2ludCBzaXplLCBidXQgdGhlcmUgaXMgbW9yZQpmbGV4aWJpbGl0eSB0byByZWR1Y2UgcG9pbnQgc2l6ZS4gIFRoZSBzaGFwZSBvZiB0aGUgZGF0YSBhbHNvIHBsYXlzIGEKcm9sZSwgc28gYm90aCBhcHByb2FjaGVzIGFyZSB3b3J0aCBjb25zaWRlcmluZy4KCgojIyAyLiBGYWNldGluZyB3aXRoIE11dGVkIEZ1bGwgRGF0YQoKVGhlIGZ1bGwgZGF0YSBjYW4gYmUgYWRkZWQgYXMgYSBiYWNrZ3JvdW5kIGxheWVyIGluIGEgbXV0ZWQgY29sb3IsCnN1Y2ggYXMgYSBsaWdodCBncmV5OgoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gOH0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpnZ3Bsb3QobXBnLCBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5KSkgKwogICAgZ2VvbV9wb2ludChkYXRhID0gbXV0YXRlKG1wZywgY2xhc3MgPSBOVUxMKSwgY29sb3IgPSAibGlnaHRncmV5IikgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGZhY2V0X3dyYXAofiBjbGFzcywgbnJvdyA9IDIpCmBgYAoKV2l0aCB0aGUgZnVsbCBkYXRhIGdyb3VwLXRvLXdob2xlIGNvbXBhcmlzb25zIGFyZSBhZ2FpbiBvbiBhbGlnbmVkCnNjYWxlcy4gIEZvciBleGFtcGxlLCB3aXRoIHRoZSBmdWxsIGRhdGEgaW4gdGhlIGJhY2tncm91bmQgaXQgaXMgZWFzeQp0byBzZWUgdGhhdCB0aGUgMi1zZWF0ZXJzIGFyZSBxdWl0ZSBkaWZmZXJlbnQgdGhhbiB0aGUgb3RoZXIKY2Fycy4gU2VlaW5nIHRoaXMgaW4gdGhlIGJhc2ljIGZhY2V0ZWQgcGxvdCBzaG93biBhYm92ZSBpcyBhbHNvCnBvc3NpYmxlLCBidXQgaXQgcmVxdWlyZXMgc29tZSB3b3JrLgoKCiMjIDMuIEd1biBNdXJkZXJzIGluIFVTIFN0YXRlcwoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0KaWYgKCEgZmlsZS5leGlzdHMoIm11cmRlcnMuY3N2IikpCiAgICBkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zdGF0LnVpb3dhLmVkdS9+bHVrZS9kYXRhL211cmRlcnMuY3N2IiwKICAgICAgICAgICAgICAgICAgIm11cmRlcnMuY3N2IikKbXVyZGVycyA8LSByZWFkLmNzdigibXVyZGVycy5jc3YiKQpgYGAKClRoZSBmb2xsb3dpbmcgZ3JhcGggc2hvd3MgYSBwbG90IG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgZ3VuIG11cmRlcnMKYWdhaW5zdCB0aGUgcG9wdWxhdGlvbiBvZiBlYWNoIHN0YXRlIGFuZCB0aGUgRGlzdHJpY3Qgb2YgQ29sdW1iaWEuCkxvZyBheGVzIGFyZSB1c2VkIGFzIHRoZSBkaXN0cmlidXRpb25zIG9mIGJvdGggdmFyaWFibGVzIGFyZSBoaWdobHkKc2tld2VkLiBUaGUgcG9pbnRzIGFyZSBjb2xvcmVkIHRvIHNob3cgdGhlIHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggZWFjaApzdGF0ZS4KCmBgYHtyfQpnZ3Bsb3QobXVyZGVycywgYWVzKHggPSBwb3B1bGF0aW9uLCB5ID0gdG90YWwsIGNvbG9yID0gcmVnaW9uKSkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMi41KSArCiAgICBzY2FsZV94X2xvZzEwKCkgKwogICAgc2NhbGVfeV9sb2cxMCgpCmBgYAoKVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBudW1iZXIgb2YgbXVyZGVycyBhbmQgdGhlIHBvcHVsYXRpb24gc2l6ZQphcHBlYXJzIHRvIGJlIGNsb3NlIHRvIGxpbmVhci4gVGhlIHN0YXRlcyBpbiB0aGUgc291dGhlcm4gcmVnaW9uIGFyZQptb3N0bHkgdG93YXJkcyB0aGUgdG9wIG9mIHRoZSBzZXQgb2YgcG9pbnRzOiBmb3IgYSBnaXZlbiBwb3B1bGF0aW9uCnNpemUgdGhlIG51bWJlciBvZiBtdXJkZXJzIGluIHNvdXRoZXJuIHN0YXRlcyBhcHBlYXJzIHRvIGJlIGhpZ2hlcgp0aGFuIGluIG90aGVycy4KCiMjIDQuIENvbXBhcmluZyBTb21lIFZpc3VhbGl6YXRpb25zCgpBbGwgdGhyZWUgcGxvdHMgY2xlYXJseSBzaG93IHRoYXQgdGhlIDUgY3lsaW5kZXIgZ3JvdXAgaXMgdGhlCnNtYWxsZXN0LiBEaXN0aW5ndWlzaGluZyB0aGUgc2l6ZXMgb2YgdGhlIG90aGVyIGdyb3VwcyBpcyBtb3JlCmNoYWxsZW5naW5nLgoKUGxvdCBCIHVzZXMgYWxpZ25lZCBzY2FsZXMuIEl0IGlzIGVhc3kgdG8gc2VlIHRoZSBvcmRlcmluZywgZXZlbgp0aG91Z2ggdGhlIHZhbHVlcyBmb3IgOCwgNiwgYW5kIDQgY3lsaW5kZXJzIGFyZSBxdWl0ZSBjbG9zZS4KClBsb3QgQyByZWxpZXMgb24gbGVuZ3RoIGNvbXBhcmlzb25zOyBpdCBzZWVtcyBwb3NzaWJsZSB0byByZWNvZ25pemUKdGhhdCB0aGUgOCBjeWxpbmRlciBncm91cCBpcyB0aGUgc21hbGxlc3QgYW1vbmcgdGhlIDQsIDYsIGFuZCA4CmN5bGluZGVyIGdyb3VwcywgYnV0IGRldGVybWluaW5nIHdoaWNoIG9mIHRoZSA0IGFuZCA2IGN5bGluZGVyIGdyb3VwcwppcyBzbWFsbGVyIGlzIHZlcnkgaGFyZC4KClBsb3QgQSByZWxpZXMgb24gYXJlYSBjb21wYXJpc29ucy4gIFRoZSBzaXplcyBvZiB0aGUgNCwgNiwgYW5kIDgKY3lsaW5kZXIgZ3JvdXBzIGFyZSB2ZXJ5IGhhcmQgdG8gZGlzdGluZ3Vpc2guCgpGb3IgY29tcGFyaW5nIHRoZSBncm91cCBzaXplcyBpbiB0aGlzIGRhdGEgc2V0IFBsb3QgQiBpcyBiZXN0LCBmb2xsb3dlZApieSBQbG90IEMsIGFuZCB0aGVuIFBsb3QgQS4K