install.packages("ggplot2")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.4/ggplot2_3.5.2.tgz'
Content type 'application/x-gzip' length 4969589 bytes (4.7 MB)
==================================================
downloaded 4.7 MB

The downloaded binary packages are in
    /var/folders/pb/1w4ztck148q0fpwdbc879d7h0000gn/T//Rtmp0zV80i/downloaded_packages
install.packages("dplyr")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.4/dplyr_1.1.4.tgz'
Content type 'application/x-gzip' length 1599250 bytes (1.5 MB)
==================================================
downloaded 1.5 MB

The downloaded binary packages are in
    /var/folders/pb/1w4ztck148q0fpwdbc879d7h0000gn/T//Rtmp0zV80i/downloaded_packages
install.packages("GGally")
also installing the dependencies ‘patchwork’, ‘Rcpp’, ‘ggstats’, ‘plyr’

trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.4/patchwork_1.3.0.tgz'
Content type 'application/x-gzip' length 3349939 bytes (3.2 MB)
==================================================
downloaded 3.2 MB

trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.4/Rcpp_1.0.14.tgz'
Content type 'application/x-gzip' length 3354635 bytes (3.2 MB)
==================================================
downloaded 3.2 MB

trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.4/ggstats_0.9.0.tgz'
Content type 'application/x-gzip' length 1232644 bytes (1.2 MB)
==================================================
downloaded 1.2 MB

trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.4/plyr_1.8.9.tgz'
Content type 'application/x-gzip' length 1019337 bytes (995 KB)
==================================================
downloaded 995 KB

trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.4/GGally_2.2.1.tgz'
Content type 'application/x-gzip' length 1999036 bytes (1.9 MB)
==================================================
downloaded 1.9 MB

The downloaded binary packages are in
    /var/folders/pb/1w4ztck148q0fpwdbc879d7h0000gn/T//Rtmp0zV80i/downloaded_packages
#Infection Data Visualizations in R

#Create the data frame
infections <- c(245, 215, 2076, 5023, 189, 195, 123, 116, 3298, 430, 502, 126, 112, 67, 52, 39, 54, 2356, 6781, 120, 2389, 279, 257, 290, 234, 5689, 261, 672, 205)
ufo2010 <- c(2, 6, 2, 59, 0, 1, 1, 0, 115, 0, 0, 0, 0, 0, 0, 0, 6, 4, 2, 7, 2, 9, 2, 29, 10, 169, 1, 40, 16)
pop <- c(25101, 61912, 33341, 409061, 7481, 18675, 25581, 22286, 459598, 3915, 67197, 34365, 3911, 32122, 31459, 2311, 28350, 101482, 19005, 20679, 36745, 162812, 15927, 251417, 153920, 1554720, 16148, 305455, 37276)
df <- data.frame(infections, ufo2010, pop)

# Load necessary libraries
library(ggplot2)
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
# --- 1. Bar Graph: Comparing Infections and UFO Sightings ---
ggplot(df, aes(x = 1:nrow(df))) +
  geom_bar(aes(y = infections, fill = "Infections"), stat = "identity", position = "dodge") +
  geom_bar(aes(y = ufo2010, fill = "UFO Sightings (2010)"), stat = "identity", position = "dodge", alpha = 0.7) +
  scale_fill_manual("Variables", values = c("Infections" = "skyblue", "UFO Sightings (2010)" = "salmon")) +
  labs(x = "Data Point Index", y = "Count", title = "Comparison of Infections and UFO Sightings") +
  theme_minimal() +
  theme(legend.position = "top")

# Observation: This bar graph compares the number of infections and UFO sightings for each
# data point. The scale of infections is significantly higher than UFO sightings in most cases.
# There are few instances where UFO sightings are non-zero, but their counts are low relative
# to the infection numbers.
# --- 2. Line Chart: Trends in Infections and Population ---
ggplot(df, aes(x = 1:nrow(df))) +
  geom_line(aes(y = infections, color = "Infections"), linewidth = 1) +
  geom_line(aes(y = pop, color = "Population"), linewidth = 1, linetype = "dashed") +
  scale_color_manual("Variables", values = c("Infections" = "yellow", "Population" = "red")) +
  labs(x = "Data Point Index", y = "Count", title = "Trends in Infections and Population") +
  theme_minimal() +
  theme(legend.position = "top")

# Observation: This line chart shows the trends of infections and population across the data points.
# The population values are on a much larger scale than infection counts, making it difficult to
# observe detailed changes in infections on the same plot. However, we can see the overall
# fluctuations of both variables.

# --- 3. Scatter Plot: Relationship between Population and Infections ---
ggplot(df, aes(x = pop, y = infections)) +
  geom_point(color = "green", alpha = 0.6) +
  labs(x = "Population", y = "Number of Infections", title = "Relationship between Population and Number of Infections") +
  theme_minimal()

# Observation: This scatter plot explores the relationship between population size and the number
# of infections. There doesn't appear to be a strong linear correlation. While some high-population
# areas have high infection counts, this is not consistently the case.
# --- 4. Box Plot: Distribution of Infections ---
ggplot(df, aes(y = infections)) +
  geom_boxplot(fill = "cyan") +
  labs(y = "Number of Infections", title = "Distribution of Number of Infections") +
  theme_minimal()

# Observation: This box plot summarizes the distribution of the 'infections' variable. It shows the
# median, quartiles, and potential outliers. The plot indicates that the majority of infection
# counts are relatively low, with some higher values identified as outliers.
# --- 5. Histogram: Frequency Distribution of UFO Sightings ---
ggplot(df, aes(x = ufo2010)) +
  geom_histogram(binwidth = 5, fill = "brown", color = "purple", alpha = 0.7) +
  labs(x = "Number of UFO Sightings (2010)", y = "Frequency", title = "Frequency Distribution of UFO Sightings (2010)") +
  theme_minimal()

# Observation: This histogram shows the frequency distribution of UFO sightings in 2010. The
# distribution is heavily skewed towards zero, indicating that most data points have very few or
# no reported UFO sightings.
# --- 6. Scatter Plot: Relationship between Population and UFO Sightings ---
ggplot(df, aes(x = pop, y = ufo2010)) +
  geom_point(color = "black", alpha = 0.6) +
  labs(x = "Population", y = "Number of UFO Sightings (2010)", title = "Relationship between Population and UFO Sightings (2010)") +
  theme_minimal()

# Observation: This scatter plot examines the relationship between population size and the number
# of UFO sightings. There doesn't seem to be a clear linear relationship between these two variables.
# --- 7. Scatter Plot: Infections vs. UFOs with Population Size ---
ggplot(df, aes(x = ufo2010, y = infections, size = pop)) +
  geom_point(alpha = 0.6, color = "grey") +
  scale_size_continuous(name = "Population Size") +
  labs(x = "Number of UFO Sightings (2010)", y = "Number of Infections", title = "Infections vs. UFO Sightings, Size by Population") +
  theme_minimal()

# Observation: This scatter plot shows the relationship between infections and UFO sightings, with
# the size of each point representing the population size. It helps to visualize if areas with higher
# infections or UFO sightings also tend to have larger populations. No strong pattern is immediately
# apparent.
# --- 8. Pair Plot: Overview of Relationships ---
library(GGally)
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
ggpairs(df) +
  ggtitle("Pair Plot of Infections, UFO Sightings, and Population") +
  theme_minimal()

# Observation: The pair plot provides a matrix of scatter plots for each pair of variables and
# density plots for the distribution of each individual variable. This gives a quick overview of
# potential linear relationships and the shape of the distributions. The distributions of
# infections and UFO sightings appear skewed, and the scatter plots reiterate the lack of strong
# linear correlations observed in the individual plots.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQpgYGAKCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCmBgYAoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpCmBgYAoKYGBge3J9CiNJbmZlY3Rpb24gRGF0YSBWaXN1YWxpemF0aW9ucyBpbiBSCgojQ3JlYXRlIHRoZSBkYXRhIGZyYW1lCmluZmVjdGlvbnMgPC0gYygyNDUsIDIxNSwgMjA3NiwgNTAyMywgMTg5LCAxOTUsIDEyMywgMTE2LCAzMjk4LCA0MzAsIDUwMiwgMTI2LCAxMTIsIDY3LCA1MiwgMzksIDU0LCAyMzU2LCA2NzgxLCAxMjAsIDIzODksIDI3OSwgMjU3LCAyOTAsIDIzNCwgNTY4OSwgMjYxLCA2NzIsIDIwNSkKdWZvMjAxMCA8LSBjKDIsIDYsIDIsIDU5LCAwLCAxLCAxLCAwLCAxMTUsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDYsIDQsIDIsIDcsIDIsIDksIDIsIDI5LCAxMCwgMTY5LCAxLCA0MCwgMTYpCnBvcCA8LSBjKDI1MTAxLCA2MTkxMiwgMzMzNDEsIDQwOTA2MSwgNzQ4MSwgMTg2NzUsIDI1NTgxLCAyMjI4NiwgNDU5NTk4LCAzOTE1LCA2NzE5NywgMzQzNjUsIDM5MTEsIDMyMTIyLCAzMTQ1OSwgMjMxMSwgMjgzNTAsIDEwMTQ4MiwgMTkwMDUsIDIwNjc5LCAzNjc0NSwgMTYyODEyLCAxNTkyNywgMjUxNDE3LCAxNTM5MjAsIDE1NTQ3MjAsIDE2MTQ4LCAzMDU0NTUsIDM3Mjc2KQpgYGAKCmBgYHtyfQpkZiA8LSBkYXRhLmZyYW1lKGluZmVjdGlvbnMsIHVmbzIwMTAsIHBvcCkKCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKCiMgLS0tIDEuIEJhciBHcmFwaDogQ29tcGFyaW5nIEluZmVjdGlvbnMgYW5kIFVGTyBTaWdodGluZ3MgLS0tCmdncGxvdChkZiwgYWVzKHggPSAxOm5yb3coZGYpKSkgKwogIGdlb21fYmFyKGFlcyh5ID0gaW5mZWN0aW9ucywgZmlsbCA9ICJJbmZlY3Rpb25zIiksIHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2JhcihhZXMoeSA9IHVmbzIwMTAsIGZpbGwgPSAiVUZPIFNpZ2h0aW5ncyAoMjAxMCkiKSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGEgPSAwLjcpICsKICBzY2FsZV9maWxsX21hbnVhbCgiVmFyaWFibGVzIiwgdmFsdWVzID0gYygiSW5mZWN0aW9ucyIgPSAic2t5Ymx1ZSIsICJVRk8gU2lnaHRpbmdzICgyMDEwKSIgPSAic2FsbW9uIikpICsKICBsYWJzKHggPSAiRGF0YSBQb2ludCBJbmRleCIsIHkgPSAiQ291bnQiLCB0aXRsZSA9ICJDb21wYXJpc29uIG9mIEluZmVjdGlvbnMgYW5kIFVGTyBTaWdodGluZ3MiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCgpgYGB7cn0KIyBPYnNlcnZhdGlvbjogVGhpcyBiYXIgZ3JhcGggY29tcGFyZXMgdGhlIG51bWJlciBvZiBpbmZlY3Rpb25zIGFuZCBVRk8gc2lnaHRpbmdzIGZvciBlYWNoCiMgZGF0YSBwb2ludC4gVGhlIHNjYWxlIG9mIGluZmVjdGlvbnMgaXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiBVRk8gc2lnaHRpbmdzIGluIG1vc3QgY2FzZXMuCiMgVGhlcmUgYXJlIGZldyBpbnN0YW5jZXMgd2hlcmUgVUZPIHNpZ2h0aW5ncyBhcmUgbm9uLXplcm8sIGJ1dCB0aGVpciBjb3VudHMgYXJlIGxvdyByZWxhdGl2ZQojIHRvIHRoZSBpbmZlY3Rpb24gbnVtYmVycy4KYGBgCgpgYGB7cn0KIyAtLS0gMi4gTGluZSBDaGFydDogVHJlbmRzIGluIEluZmVjdGlvbnMgYW5kIFBvcHVsYXRpb24gLS0tCmdncGxvdChkZiwgYWVzKHggPSAxOm5yb3coZGYpKSkgKwogIGdlb21fbGluZShhZXMoeSA9IGluZmVjdGlvbnMsIGNvbG9yID0gIkluZmVjdGlvbnMiKSwgbGluZXdpZHRoID0gMSkgKwogIGdlb21fbGluZShhZXMoeSA9IHBvcCwgY29sb3IgPSAiUG9wdWxhdGlvbiIpLCBsaW5ld2lkdGggPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKCJWYXJpYWJsZXMiLCB2YWx1ZXMgPSBjKCJJbmZlY3Rpb25zIiA9ICJ5ZWxsb3ciLCAiUG9wdWxhdGlvbiIgPSAicmVkIikpICsKICBsYWJzKHggPSAiRGF0YSBQb2ludCBJbmRleCIsIHkgPSAiQ291bnQiLCB0aXRsZSA9ICJUcmVuZHMgaW4gSW5mZWN0aW9ucyBhbmQgUG9wdWxhdGlvbiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQpgYGAKCmBgYHtyfQojIE9ic2VydmF0aW9uOiBUaGlzIGxpbmUgY2hhcnQgc2hvd3MgdGhlIHRyZW5kcyBvZiBpbmZlY3Rpb25zIGFuZCBwb3B1bGF0aW9uIGFjcm9zcyB0aGUgZGF0YSBwb2ludHMuCiMgVGhlIHBvcHVsYXRpb24gdmFsdWVzIGFyZSBvbiBhIG11Y2ggbGFyZ2VyIHNjYWxlIHRoYW4gaW5mZWN0aW9uIGNvdW50cywgbWFraW5nIGl0IGRpZmZpY3VsdCB0bwojIG9ic2VydmUgZGV0YWlsZWQgY2hhbmdlcyBpbiBpbmZlY3Rpb25zIG9uIHRoZSBzYW1lIHBsb3QuIEhvd2V2ZXIsIHdlIGNhbiBzZWUgdGhlIG92ZXJhbGwKIyBmbHVjdHVhdGlvbnMgb2YgYm90aCB2YXJpYWJsZXMuCgojIC0tLSAzLiBTY2F0dGVyIFBsb3Q6IFJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBvcHVsYXRpb24gYW5kIEluZmVjdGlvbnMgLS0tCmdncGxvdChkZiwgYWVzKHggPSBwb3AsIHkgPSBpbmZlY3Rpb25zKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiZ3JlZW4iLCBhbHBoYSA9IDAuNikgKwogIGxhYnMoeCA9ICJQb3B1bGF0aW9uIiwgeSA9ICJOdW1iZXIgb2YgSW5mZWN0aW9ucyIsIHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBvcHVsYXRpb24gYW5kIE51bWJlciBvZiBJbmZlY3Rpb25zIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyfQojIE9ic2VydmF0aW9uOiBUaGlzIHNjYXR0ZXIgcGxvdCBleHBsb3JlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcG9wdWxhdGlvbiBzaXplIGFuZCB0aGUgbnVtYmVyCiMgb2YgaW5mZWN0aW9ucy4gVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSBzdHJvbmcgbGluZWFyIGNvcnJlbGF0aW9uLiBXaGlsZSBzb21lIGhpZ2gtcG9wdWxhdGlvbgojIGFyZWFzIGhhdmUgaGlnaCBpbmZlY3Rpb24gY291bnRzLCB0aGlzIGlzIG5vdCBjb25zaXN0ZW50bHkgdGhlIGNhc2UuCmBgYAoKYGBge3J9CiMgLS0tIDQuIEJveCBQbG90OiBEaXN0cmlidXRpb24gb2YgSW5mZWN0aW9ucyAtLS0KZ2dwbG90KGRmLCBhZXMoeSA9IGluZmVjdGlvbnMpKSArCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAiY3lhbiIpICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEluZmVjdGlvbnMiLCB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIEluZmVjdGlvbnMiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3J9CiMgT2JzZXJ2YXRpb246IFRoaXMgYm94IHBsb3Qgc3VtbWFyaXplcyB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSAnaW5mZWN0aW9ucycgdmFyaWFibGUuIEl0IHNob3dzIHRoZQojIG1lZGlhbiwgcXVhcnRpbGVzLCBhbmQgcG90ZW50aWFsIG91dGxpZXJzLiBUaGUgcGxvdCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFqb3JpdHkgb2YgaW5mZWN0aW9uCiMgY291bnRzIGFyZSByZWxhdGl2ZWx5IGxvdywgd2l0aCBzb21lIGhpZ2hlciB2YWx1ZXMgaWRlbnRpZmllZCBhcyBvdXRsaWVycy4KYGBgCgpgYGB7cn0KIyAtLS0gNS4gSGlzdG9ncmFtOiBGcmVxdWVuY3kgRGlzdHJpYnV0aW9uIG9mIFVGTyBTaWdodGluZ3MgLS0tCmdncGxvdChkZiwgYWVzKHggPSB1Zm8yMDEwKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSwgZmlsbCA9ICJicm93biIsIGNvbG9yID0gInB1cnBsZSIsIGFscGhhID0gMC43KSArCiAgbGFicyh4ID0gIk51bWJlciBvZiBVRk8gU2lnaHRpbmdzICgyMDEwKSIsIHkgPSAiRnJlcXVlbmN5IiwgdGl0bGUgPSAiRnJlcXVlbmN5IERpc3RyaWJ1dGlvbiBvZiBVRk8gU2lnaHRpbmdzICgyMDEwKSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpgYGB7cn0KIyBPYnNlcnZhdGlvbjogVGhpcyBoaXN0b2dyYW0gc2hvd3MgdGhlIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gb2YgVUZPIHNpZ2h0aW5ncyBpbiAyMDEwLiBUaGUKIyBkaXN0cmlidXRpb24gaXMgaGVhdmlseSBza2V3ZWQgdG93YXJkcyB6ZXJvLCBpbmRpY2F0aW5nIHRoYXQgbW9zdCBkYXRhIHBvaW50cyBoYXZlIHZlcnkgZmV3IG9yCiMgbm8gcmVwb3J0ZWQgVUZPIHNpZ2h0aW5ncy4KYGBgCgpgYGB7cn0KIyAtLS0gNi4gU2NhdHRlciBQbG90OiBSZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3B1bGF0aW9uIGFuZCBVRk8gU2lnaHRpbmdzIC0tLQpnZ3Bsb3QoZGYsIGFlcyh4ID0gcG9wLCB5ID0gdWZvMjAxMCkpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjYpICsKICBsYWJzKHggPSAiUG9wdWxhdGlvbiIsIHkgPSAiTnVtYmVyIG9mIFVGTyBTaWdodGluZ3MgKDIwMTApIiwgdGl0bGUgPSAiUmVsYXRpb25zaGlwIGJldHdlZW4gUG9wdWxhdGlvbiBhbmQgVUZPIFNpZ2h0aW5ncyAoMjAxMCkiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3J9CiMgT2JzZXJ2YXRpb246IFRoaXMgc2NhdHRlciBwbG90IGV4YW1pbmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwb3B1bGF0aW9uIHNpemUgYW5kIHRoZSBudW1iZXIKIyBvZiBVRk8gc2lnaHRpbmdzLiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBjbGVhciBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2UgdHdvIHZhcmlhYmxlcy4KYGBgCgpgYGB7cn0KIyAtLS0gNy4gU2NhdHRlciBQbG90OiBJbmZlY3Rpb25zIHZzLiBVRk9zIHdpdGggUG9wdWxhdGlvbiBTaXplIC0tLQpnZ3Bsb3QoZGYsIGFlcyh4ID0gdWZvMjAxMCwgeSA9IGluZmVjdGlvbnMsIHNpemUgPSBwb3ApKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNiwgY29sb3IgPSAiZ3JleSIpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMobmFtZSA9ICJQb3B1bGF0aW9uIFNpemUiKSArCiAgbGFicyh4ID0gIk51bWJlciBvZiBVRk8gU2lnaHRpbmdzICgyMDEwKSIsIHkgPSAiTnVtYmVyIG9mIEluZmVjdGlvbnMiLCB0aXRsZSA9ICJJbmZlY3Rpb25zIHZzLiBVRk8gU2lnaHRpbmdzLCBTaXplIGJ5IFBvcHVsYXRpb24iKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3J9CiMgT2JzZXJ2YXRpb246IFRoaXMgc2NhdHRlciBwbG90IHNob3dzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBpbmZlY3Rpb25zIGFuZCBVRk8gc2lnaHRpbmdzLCB3aXRoCiMgdGhlIHNpemUgb2YgZWFjaCBwb2ludCByZXByZXNlbnRpbmcgdGhlIHBvcHVsYXRpb24gc2l6ZS4gSXQgaGVscHMgdG8gdmlzdWFsaXplIGlmIGFyZWFzIHdpdGggaGlnaGVyCiMgaW5mZWN0aW9ucyBvciBVRk8gc2lnaHRpbmdzIGFsc28gdGVuZCB0byBoYXZlIGxhcmdlciBwb3B1bGF0aW9ucy4gTm8gc3Ryb25nIHBhdHRlcm4gaXMgaW1tZWRpYXRlbHkKIyBhcHBhcmVudC4KYGBgCgpgYGB7cn0KIyAtLS0gOC4gUGFpciBQbG90OiBPdmVydmlldyBvZiBSZWxhdGlvbnNoaXBzIC0tLQpsaWJyYXJ5KEdHYWxseSkKZ2dwYWlycyhkZikgKwogIGdndGl0bGUoIlBhaXIgUGxvdCBvZiBJbmZlY3Rpb25zLCBVRk8gU2lnaHRpbmdzLCBhbmQgUG9wdWxhdGlvbiIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpgYGB7cn0KIyBPYnNlcnZhdGlvbjogVGhlIHBhaXIgcGxvdCBwcm92aWRlcyBhIG1hdHJpeCBvZiBzY2F0dGVyIHBsb3RzIGZvciBlYWNoIHBhaXIgb2YgdmFyaWFibGVzIGFuZAojIGRlbnNpdHkgcGxvdHMgZm9yIHRoZSBkaXN0cmlidXRpb24gb2YgZWFjaCBpbmRpdmlkdWFsIHZhcmlhYmxlLiBUaGlzIGdpdmVzIGEgcXVpY2sgb3ZlcnZpZXcgb2YKIyBwb3RlbnRpYWwgbGluZWFyIHJlbGF0aW9uc2hpcHMgYW5kIHRoZSBzaGFwZSBvZiB0aGUgZGlzdHJpYnV0aW9ucy4gVGhlIGRpc3RyaWJ1dGlvbnMgb2YKIyBpbmZlY3Rpb25zIGFuZCBVRk8gc2lnaHRpbmdzIGFwcGVhciBza2V3ZWQsIGFuZCB0aGUgc2NhdHRlciBwbG90cyByZWl0ZXJhdGUgdGhlIGxhY2sgb2Ygc3Ryb25nCiMgbGluZWFyIGNvcnJlbGF0aW9ucyBvYnNlcnZlZCBpbiB0aGUgaW5kaXZpZHVhbCBwbG90cy4KYGBgCgo=