Use the following data to produce 1 table of summary information and
2-3 graphs.
Notes on the data: the total, professional, and computer_all job
groups are available for all four years of data. Focus on these if you
want to produce graphs of jobs over time. The individual occupations
change from one year to the next, so you will not be able to graph them
over time (with the exception of computer programmers). You may,
however, filter one year of data and make a bar or point plot for each
occupation in that year.
The All variable is measured as total jobs in that category, while
Women, Black, Asian, and Latino are the percent of workers who identify
with each group. You cannot put All on the same plot as one of these
variables, since they are measured in different units.
The goal of the assignment is not only to practice making plots: your
task is to present the data in a clear and meaningful way. Points will
be deducted, for example, from plots that are hard to read or
understand. You are also encouraged to think about how to use colors,
labels, and themes effectively. Graphs with multiple groups must have a
legend.
Although you will need to filter the data, it does not need to be
cleaned up too much in order to be graphed. Don’t overthink it!
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
library(ggplot2)
install.packages("grafify")
trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.3/grafify_4.0.1.tgz'
Content type 'application/x-gzip' length 4335968 bytes (4.1 MB)
==================================================
downloaded 4.1 MB
The downloaded binary packages are in
/var/folders/br/x7ljhm5n45dbkdhv_z2qsx180000gp/T//Rtmp6ARG3Q/downloaded_packages
library(grafify)
Registered S3 method overwritten by 'data.table':
method from
print.data.table
job_cateogry <- data %>%
filter(job_type %in% c("total", "computer_all"))
summary_job <- job_cateogry %>%
group_by(year, job_type) %>%
summarise(
Total_Workers = sum(All, na.rm = TRUE),
Women_Average = mean(Women, na.rm = TRUE),
Black_Average = mean(Black, na.rm = TRUE),
Asian_Average = mean(Asian, na.rm = TRUE),
Hispanic_Latino_Average = mean(Hispanic.Latino, na.rm = TRUE)
)
`summarise()` has grouped output by 'year'. You can override using the `.groups` argument.
print(summary_job)
Based on the summary information for the total and computer_all
categories, we can infer that throughout the past 15 years, we have seen
little growth in the total workers for all computer occupations. While
we see bigger growth for computer occupations every five years, we only
saw around a 50% around for the past 15 years. On average, the women in
the field had decreased going from an average of 27% down to 25.2%.
Despite that, people of color have seen a higher percentage of people in
the field, with Asians almost doubling since 2005, going from 14.7% to
23%. On average, Black, Hispanic, and Latino people did not see the same
growth jump, though, there were was an average of a 3% increase in the
past 15 years. Based on this table summary, we see that there are some
growth of minorities in computer occupations, but in the past 15 years,
these growths are pretty minimal. We can also infer that the total has
stayed relatively the same for women, but the computer occupations with
women has decreased , showing that despite seeing some increases, it
doesn’t apply to all.
specific_occupation <- data %>%
filter(description %in% c("Web developers", "Information security analysts"))
summary_jobs <- specific_occupation %>%
group_by(year, job_type, description) %>%
summarise(
Total_Workers = sum(All, na.rm = TRUE),
Women_Average = mean(Women, na.rm = TRUE),
Black_Average = mean(Black, na.rm = TRUE),
Asian_Average = mean(Asian, na.rm = TRUE),
Hispanic_Latino_Average = mean(Hispanic.Latino, na.rm = TRUE)
)
`summarise()` has grouped output by 'year', 'job_type'. You can override using the `.groups` argument.
print(summary_jobs)
Based on the specific occupations from 2015 to 2020, we can see the
changes in the past 5 years for Information Security Analysts and Web
developers in the computer occupations. Based on this table summary, it
can be noted that information security analysts saw almost a 50% growth
in the total workers while web developers saw a 50% loss in total
workers. Some of these loses can be noted for the percentage of women,
Black, and Hispanic/Latino in the web developer occupation. Women were
the greatest loss going from 34.3% to 27.% in just five years, while the
average of Black people that left came into a close second going from
9.1% in 2015 down to 3.7% in 2020. Hispanic and Latino saw loses though
not at the same impact as women and black. In comparison, the percentage
of Asian nearly doubled, going from 9.6% to 16.2%, despite all the other
minorities and the total workers seeing decreases. While information
security analysts saw almost a double increase in the total workers, we
can see decreases in women from 19.7% down to 11.4%. In comparison,
minorities saw increases, the most being from Black people from a 3% to
11.9%, almost quadrupling. Hispanics and Latinos saw a slightly lower
same rate of growth from 5.2% to 15.8%. While Asians saw some growth, it
wasn’t nearly as big, but had still doubled in the percentage in the
information security analysts field. Based on all these, we can see why
the total workers had doubled for information security analysts, and why
web developers had lost half of its total workers.


The two graphs focused on the job types over time and a specific
year’s individual job totals. Job types over time would show me the
trends throughout the past 15 years. As suspected, the lines stayed
relatively straight for all computer applications, while the
professional job types shows a steep growth. We see non-linear growth
for total jobs, which started with a decrease from 2005 to 2010 before
making a decent growth for the next five years and then having a more
steeper growth after. Though, if we were to compare from just 2005 to
2020, excluding the movements it made, we see very minimal growth. The
second graph looked into the total individual occupations in the year
2020. This shows us where all the workers tend to be gathered at. Based
on the graph, software developers dominated the graph with over 1500
employees, while Mathematicians had close to 0. Everything else on
average typically had no more than 250 total workers.
LS0tCnRpdGxlOiAiSGFycCAzMjUgTWlkdGVybSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVXNlIHRoZSBmb2xsb3dpbmcgZGF0YSB0byBwcm9kdWNlIDEgdGFibGUgb2Ygc3VtbWFyeSBpbmZvcm1hdGlvbiBhbmQgMi0zIGdyYXBocy4gCgpOb3RlcyBvbiB0aGUgZGF0YTogdGhlIHRvdGFsLCBwcm9mZXNzaW9uYWwsIGFuZCBjb21wdXRlcl9hbGwgam9iIGdyb3VwcyBhcmUgYXZhaWxhYmxlIGZvciBhbGwgZm91ciB5ZWFycyBvZiBkYXRhLiBGb2N1cyBvbiB0aGVzZSBpZiB5b3Ugd2FudCB0byBwcm9kdWNlIGdyYXBocyBvZiBqb2JzIG92ZXIgdGltZS4gVGhlIGluZGl2aWR1YWwgb2NjdXBhdGlvbnMgY2hhbmdlIGZyb20gb25lIHllYXIgdG8gdGhlIG5leHQsIHNvIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGdyYXBoIHRoZW0gb3ZlciB0aW1lICh3aXRoIHRoZSBleGNlcHRpb24gb2YgY29tcHV0ZXIgcHJvZ3JhbW1lcnMpLiBZb3UgbWF5LCBob3dldmVyLCBmaWx0ZXIgb25lIHllYXIgb2YgZGF0YSBhbmQgbWFrZSBhIGJhciBvciBwb2ludCBwbG90IGZvciBlYWNoIG9jY3VwYXRpb24gaW4gdGhhdCB5ZWFyLiAKClRoZSBBbGwgdmFyaWFibGUgaXMgbWVhc3VyZWQgYXMgdG90YWwgam9icyBpbiB0aGF0IGNhdGVnb3J5LCB3aGlsZSBXb21lbiwgQmxhY2ssIEFzaWFuLCBhbmQgTGF0aW5vIGFyZSB0aGUgcGVyY2VudCBvZiB3b3JrZXJzIHdobyBpZGVudGlmeSB3aXRoIGVhY2ggZ3JvdXAuIFlvdSBjYW5ub3QgcHV0IEFsbCBvbiB0aGUgc2FtZSBwbG90IGFzIG9uZSBvZiB0aGVzZSB2YXJpYWJsZXMsIHNpbmNlIHRoZXkgYXJlIG1lYXN1cmVkIGluIGRpZmZlcmVudCB1bml0cy4gCgpUaGUgZ29hbCBvZiB0aGUgYXNzaWdubWVudCBpcyBub3Qgb25seSB0byBwcmFjdGljZSBtYWtpbmcgcGxvdHM6IHlvdXIgdGFzayBpcyB0byBwcmVzZW50IHRoZSBkYXRhIGluIGEgY2xlYXIgYW5kIG1lYW5pbmdmdWwgd2F5LiBQb2ludHMgd2lsbCBiZSBkZWR1Y3RlZCwgZm9yIGV4YW1wbGUsIGZyb20gcGxvdHMgdGhhdCBhcmUgaGFyZCB0byByZWFkIG9yIHVuZGVyc3RhbmQuIFlvdSBhcmUgYWxzbyBlbmNvdXJhZ2VkIHRvIHRoaW5rIGFib3V0IGhvdyB0byB1c2UgY29sb3JzLCBsYWJlbHMsIGFuZCB0aGVtZXMgZWZmZWN0aXZlbHkuIEdyYXBocyB3aXRoIG11bHRpcGxlIGdyb3VwcyBtdXN0IGhhdmUgYSBsZWdlbmQuIAoKQWx0aG91Z2ggeW91IHdpbGwgbmVlZCB0byBmaWx0ZXIgdGhlIGRhdGEsIGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgY2xlYW5lZCB1cCB0b28gbXVjaCBpbiBvcmRlciB0byBiZSBncmFwaGVkLiBEb24ndCBvdmVydGhpbmsgaXQhCgpgYGB7cn0Kc2V0d2QoIn4vRG9jdW1lbnRzL0RvY3VtZW50cyAtIEplc3MncyBNYWNCb29rIEFpci9ESURBIDMyNSIpCmRhdGEgPC0gcmVhZC5jc3YoIi9Vc2Vycy9qZXNzL0RvY3VtZW50cy9Eb2N1bWVudHMgLSBKZXNzJ3MgTWFjQm9vayBBaXIvRElEQSAzMjUvb2NjdXBhdGlvbl9nZW5kZXJfcmFjZS5jc3YiKQoKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQoKaW5zdGFsbC5wYWNrYWdlcygiZ3JhZmlmeSIpCmxpYnJhcnkoZ3JhZmlmeSkKCmBgYAoKCmBgYCB7cn0KI2NyZWF0ZSAxIHRhYmxlIG9mIHN1bW1hcnkgaW5mb3JtYXRpb24gZm9yIHRoZSB0b3RhbCBhbmQgY29tcHV0ZXJfYWxsIGNhdGVnb3JpZXMKCiNZb3Ugc2hvdWxkICBpbmNsdWRlIGEgcGFyYWdyYXBoIG9yIHR3byB3aXRoIHlvdXIgYW5hbHlzaXMgdGhhdCBzdW1tYXJpemVzIGtleSBmaW5kaW5ncyBmcm9tIHlvdXIgd29yay4gCgpqb2JfY2F0ZW9ncnkgPC0gZGF0YSAlPiUKICBmaWx0ZXIoam9iX3R5cGUgJWluJSBjKCJ0b3RhbCIsICJjb21wdXRlcl9hbGwiKSkKCnN1bW1hcnlfam9iIDwtIGpvYl9jYXRlb2dyeSAlPiUKICBncm91cF9ieSh5ZWFyLCBqb2JfdHlwZSkgJT4lCiAgc3VtbWFyaXNlKAogICAgVG90YWxfV29ya2VycyA9IHN1bShBbGwsIG5hLnJtID0gVFJVRSksCiAgICBXb21lbl9BdmVyYWdlID0gbWVhbihXb21lbiwgbmEucm0gPSBUUlVFKSwKICAgIEJsYWNrX0F2ZXJhZ2UgPSBtZWFuKEJsYWNrLCBuYS5ybSA9IFRSVUUpLAogICAgQXNpYW5fQXZlcmFnZSA9IG1lYW4oQXNpYW4sIG5hLnJtID0gVFJVRSksCiAgICBIaXNwYW5pY19MYXRpbm9fQXZlcmFnZSA9IG1lYW4oSGlzcGFuaWMuTGF0aW5vLCBuYS5ybSA9IFRSVUUpCiAgKQoKcHJpbnQoc3VtbWFyeV9qb2IpCgoKYGBgCgpCYXNlZCBvbiB0aGUgc3VtbWFyeSBpbmZvcm1hdGlvbiBmb3IgdGhlIHRvdGFsIGFuZCBjb21wdXRlcl9hbGwgY2F0ZWdvcmllcywgd2UgY2FuIGluZmVyIHRoYXQgdGhyb3VnaG91dCB0aGUgcGFzdCAxNSB5ZWFycywgd2UgaGF2ZSBzZWVuIGxpdHRsZSBncm93dGggaW4gdGhlIHRvdGFsIHdvcmtlcnMgZm9yIGFsbCBjb21wdXRlciBvY2N1cGF0aW9ucy4gV2hpbGUgd2Ugc2VlIGJpZ2dlciBncm93dGggZm9yIGNvbXB1dGVyIG9jY3VwYXRpb25zIGV2ZXJ5IGZpdmUgeWVhcnMsIHdlIG9ubHkgc2F3IGFyb3VuZCBhIDUwJSBhcm91bmQgZm9yIHRoZSBwYXN0IDE1IHllYXJzLiBPbiBhdmVyYWdlLCB0aGUgd29tZW4gaW4gdGhlIGZpZWxkIGhhZCBkZWNyZWFzZWQgZ29pbmcgZnJvbSBhbiBhdmVyYWdlIG9mIDI3JSBkb3duIHRvIDI1LjIlLiBEZXNwaXRlIHRoYXQsIHBlb3BsZSBvZiBjb2xvciBoYXZlIHNlZW4gYSBoaWdoZXIgcGVyY2VudGFnZSBvZiBwZW9wbGUgaW4gdGhlIGZpZWxkLCB3aXRoIEFzaWFucyBhbG1vc3QgZG91Ymxpbmcgc2luY2UgMjAwNSwgZ29pbmcgZnJvbSAxNC43JSB0byAyMyUuIE9uIGF2ZXJhZ2UsIEJsYWNrLCBIaXNwYW5pYywgYW5kIExhdGlubyBwZW9wbGUgZGlkIG5vdCBzZWUgdGhlIHNhbWUgZ3Jvd3RoIGp1bXAsIHRob3VnaCwgdGhlcmUgd2VyZSB3YXMgYW4gYXZlcmFnZSBvZiBhIDMlIGluY3JlYXNlIGluIHRoZSBwYXN0IDE1IHllYXJzLiBCYXNlZCBvbiB0aGlzIHRhYmxlIHN1bW1hcnksIHdlIHNlZSB0aGF0IHRoZXJlIGFyZSBzb21lIGdyb3d0aCBvZiBtaW5vcml0aWVzIGluIGNvbXB1dGVyIG9jY3VwYXRpb25zLCBidXQgaW4gdGhlIHBhc3QgMTUgeWVhcnMsIHRoZXNlIGdyb3d0aHMgYXJlIHByZXR0eSBtaW5pbWFsLiBXZSBjYW4gYWxzbyBpbmZlciB0aGF0IHRoZSB0b3RhbCBoYXMgc3RheWVkIHJlbGF0aXZlbHkgdGhlIHNhbWUgZm9yIHdvbWVuLCBidXQgdGhlIGNvbXB1dGVyIG9jY3VwYXRpb25zIHdpdGggd29tZW4gaGFzIGRlY3JlYXNlZCAsIHNob3dpbmcgdGhhdCBkZXNwaXRlIHNlZWluZyBzb21lIGluY3JlYXNlcywgaXQgZG9lc24ndCBhcHBseSB0byBhbGwuIAoKCmBgYHtyfQojc3VtbWFyeSB0YWJsZSBmb3IgMS0yIG9jY3VwYXRpb25zOiAKCnNwZWNpZmljX29jY3VwYXRpb24gPC0gZGF0YSAlPiUKICBmaWx0ZXIoZGVzY3JpcHRpb24gJWluJSBjKCJXZWIgZGV2ZWxvcGVycyIsICJJbmZvcm1hdGlvbiBzZWN1cml0eSBhbmFseXN0cyIpKQoKc3VtbWFyeV9qb2JzIDwtIHNwZWNpZmljX29jY3VwYXRpb24gJT4lCiAgZ3JvdXBfYnkoeWVhciwgam9iX3R5cGUsIGRlc2NyaXB0aW9uKSAlPiUKICBzdW1tYXJpc2UoCiAgICBUb3RhbF9Xb3JrZXJzID0gc3VtKEFsbCwgbmEucm0gPSBUUlVFKSwKICAgIFdvbWVuX0F2ZXJhZ2UgPSBtZWFuKFdvbWVuLCBuYS5ybSA9IFRSVUUpLAogICAgQmxhY2tfQXZlcmFnZSA9IG1lYW4oQmxhY2ssIG5hLnJtID0gVFJVRSksCiAgICBBc2lhbl9BdmVyYWdlID0gbWVhbihBc2lhbiwgbmEucm0gPSBUUlVFKSwKICAgIEhpc3BhbmljX0xhdGlub19BdmVyYWdlID0gbWVhbihIaXNwYW5pYy5MYXRpbm8sIG5hLnJtID0gVFJVRSkKICApCgpwcmludChzdW1tYXJ5X2pvYnMpCgoKYGBgCkJhc2VkIG9uIHRoZSBzcGVjaWZpYyBvY2N1cGF0aW9ucyBmcm9tIDIwMTUgdG8gMjAyMCwgd2UgY2FuIHNlZSB0aGUgY2hhbmdlcyBpbiB0aGUgcGFzdCA1IHllYXJzIGZvciBJbmZvcm1hdGlvbiBTZWN1cml0eSBBbmFseXN0cyBhbmQgV2ViIGRldmVsb3BlcnMgaW4gdGhlIGNvbXB1dGVyIG9jY3VwYXRpb25zLiBCYXNlZCBvbiB0aGlzIHRhYmxlIHN1bW1hcnksIGl0IGNhbiBiZSBub3RlZCB0aGF0IGluZm9ybWF0aW9uIHNlY3VyaXR5IGFuYWx5c3RzIHNhdyBhbG1vc3QgYSA1MCUgZ3Jvd3RoIGluIHRoZSB0b3RhbCB3b3JrZXJzIHdoaWxlIHdlYiBkZXZlbG9wZXJzIHNhdyBhIDUwJSBsb3NzIGluIHRvdGFsIHdvcmtlcnMuIFNvbWUgb2YgdGhlc2UgbG9zZXMgY2FuIGJlIG5vdGVkIGZvciB0aGUgcGVyY2VudGFnZSBvZiB3b21lbiwgQmxhY2ssIGFuZCBIaXNwYW5pYy9MYXRpbm8gaW4gdGhlIHdlYiBkZXZlbG9wZXIgb2NjdXBhdGlvbi4gV29tZW4gd2VyZSB0aGUgZ3JlYXRlc3QgbG9zcyBnb2luZyBmcm9tIDM0LjMlIHRvIDI3LiUgaW4ganVzdCBmaXZlIHllYXJzLCB3aGlsZSB0aGUgYXZlcmFnZSBvZiBCbGFjayBwZW9wbGUgdGhhdCBsZWZ0IGNhbWUgaW50byBhIGNsb3NlIHNlY29uZCBnb2luZyBmcm9tIDkuMSUgaW4gMjAxNSBkb3duIHRvIDMuNyUgaW4gMjAyMC4gSGlzcGFuaWMgYW5kIExhdGlubyBzYXcgbG9zZXMgdGhvdWdoIG5vdCBhdCB0aGUgc2FtZSBpbXBhY3QgYXMgd29tZW4gYW5kIGJsYWNrLiBJbiBjb21wYXJpc29uLCB0aGUgcGVyY2VudGFnZSBvZiBBc2lhbiBuZWFybHkgZG91YmxlZCwgZ29pbmcgZnJvbSA5LjYlIHRvIDE2LjIlLCBkZXNwaXRlIGFsbCB0aGUgb3RoZXIgbWlub3JpdGllcyBhbmQgdGhlIHRvdGFsIHdvcmtlcnMgc2VlaW5nIGRlY3JlYXNlcy4gV2hpbGUgaW5mb3JtYXRpb24gc2VjdXJpdHkgYW5hbHlzdHMgc2F3IGFsbW9zdCBhIGRvdWJsZSBpbmNyZWFzZSBpbiB0aGUgdG90YWwgd29ya2Vycywgd2UgY2FuIHNlZSBkZWNyZWFzZXMgaW4gd29tZW4gZnJvbSAxOS43JSBkb3duIHRvIDExLjQlLiBJbiBjb21wYXJpc29uLCBtaW5vcml0aWVzIHNhdyBpbmNyZWFzZXMsIHRoZSBtb3N0IGJlaW5nIGZyb20gQmxhY2sgcGVvcGxlIGZyb20gYSAzJSB0byAxMS45JSwgYWxtb3N0IHF1YWRydXBsaW5nLiBIaXNwYW5pY3MgYW5kIExhdGlub3Mgc2F3IGEgc2xpZ2h0bHkgbG93ZXIgc2FtZSByYXRlIG9mIGdyb3d0aCBmcm9tIDUuMiUgdG8gMTUuOCUuIFdoaWxlIEFzaWFucyBzYXcgc29tZSBncm93dGgsIGl0IHdhc24ndCBuZWFybHkgYXMgYmlnLCBidXQgaGFkIHN0aWxsIGRvdWJsZWQgaW4gdGhlIHBlcmNlbnRhZ2UgaW4gdGhlIGluZm9ybWF0aW9uIHNlY3VyaXR5IGFuYWx5c3RzIGZpZWxkLiBCYXNlZCBvbiBhbGwgdGhlc2UsIHdlIGNhbiBzZWUgd2h5IHRoZSB0b3RhbCB3b3JrZXJzIGhhZCBkb3VibGVkIGZvciBpbmZvcm1hdGlvbiBzZWN1cml0eSBhbmFseXN0cywgYW5kIHdoeSB3ZWIgZGV2ZWxvcGVycyBoYWQgbG9zdCBoYWxmIG9mIGl0cyB0b3RhbCB3b3JrZXJzLiAKCmBgYHtyfQogIyAyLTMgcGxvdHMgdXNpbmcgdGhlIGdncGxvdDIgcGFja2FnZSBpbiBSCgpqb2JfdHJlbmQgPC0gYygidG90YWwiLCAicHJvZmVzc2lvbmFsIiwgImNvbXB1dGVyX2FsbCIpCm92ZXJfdGltZSA8LSBkYXRhICU+JQogIGZpbHRlcihqb2JfdHlwZSAlaW4lIGpvYl90cmVuZCkKCgpnZ3Bsb3Qob3Zlcl90aW1lLCBhZXMoeCA9IHllYXIsIHkgPSBBbGwsIGNvbG9yID0gam9iX3R5cGUsIGdyb3VwID0gam9iX3R5cGUpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiVG90YWwsIFByb2Zlc3Npb25hbCwgYW5kIEFsbCBDb21wdXRlciBKb2IgVHJlbmRzIE92ZXIgVGltZSIsCiAgICAgICB4ID0gIlllYXIiLCB5ID0gIlRvdGFsIEpvYnMiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInRvdGFsIiA9ICJwbHVtMSIsICJwcm9mZXNzaW9uYWwiID0gInB1cnBsZSIsICJjb21wdXRlcl9hbGwiID0gInN0ZWVsYmx1ZTEiKSkgKwogIHRoZW1lX21pbmltYWwoKQoKYGBgCgpgYGB7cn0KCgp5ZWFycyA8LSBjKDIwMjApCgpvY2N1cGF0aW9uX2RhdGEgPC0gZGF0YSAlPiUKICBmaWx0ZXIoeWVhciAlaW4lIHllYXJzLCBqb2JfdHlwZSAlaW4lIGMoImNvbXB1dGVyIikpCgoKZ2dwbG90KG9jY3VwYXRpb25fZGF0YSwgYWVzKHggPSBkZXNjcmlwdGlvbiwgeSA9IEFsbCwgZmlsbCA9IGZhY3Rvcih5ZWFyKSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAic3RhY2siKSArCiAgbGFicyh0aXRsZSA9ICJDb21wYXJpc29uIG9mIFRvdGFsIEpvYnMgYnkgT2NjdXBhdGlvbiBpbiAyMDIwIiwKICAgICAgIHggPSAiT2NjdXBhdGlvbiIsIHkgPSAiVG90YWwgSm9icyIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDIwIiA9ICJwb3dkZXJibHVlIiksIG5hbWUgPSAiWWVhciIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0PTEgKSkKI2hhZCBzb21lIGlzc3VlcyB3aXRoIHRoZSB4LWF4aXMgaW50ZXJmZXJpbmcgd2l0aCB0aGUgZ3JhcGgsIGFuZCB1c2VkIHRoaXMgZm9yIGhlbHAgZm9yIGxpbmUgMTEzOmh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEzMzA5ODkvcm90YXRpbmctYW5kLXNwYWNpbmctYXhpcy1sYWJlbHMtaW4tZ2dwbG90MgoKYGBgClRoZSB0d28gZ3JhcGhzIGZvY3VzZWQgb24gdGhlIGpvYiB0eXBlcyBvdmVyIHRpbWUgYW5kIGEgc3BlY2lmaWMgeWVhcidzIGluZGl2aWR1YWwgam9iIHRvdGFscy4gSm9iIHR5cGVzIG92ZXIgdGltZSB3b3VsZCBzaG93IG1lIHRoZSB0cmVuZHMgdGhyb3VnaG91dCB0aGUgcGFzdCAxNSB5ZWFycy4gQXMgc3VzcGVjdGVkLCB0aGUgbGluZXMgc3RheWVkIHJlbGF0aXZlbHkgc3RyYWlnaHQgZm9yIGFsbCBjb21wdXRlciBhcHBsaWNhdGlvbnMsIHdoaWxlIHRoZSBwcm9mZXNzaW9uYWwgam9iIHR5cGVzIHNob3dzIGEgc3RlZXAgZ3Jvd3RoLiBXZSBzZWUgbm9uLWxpbmVhciBncm93dGggZm9yIHRvdGFsIGpvYnMsIHdoaWNoIHN0YXJ0ZWQgd2l0aCBhIGRlY3JlYXNlIGZyb20gMjAwNSB0byAyMDEwIGJlZm9yZSBtYWtpbmcgYSBkZWNlbnQgZ3Jvd3RoIGZvciB0aGUgbmV4dCBmaXZlIHllYXJzIGFuZCB0aGVuIGhhdmluZyBhIG1vcmUgc3RlZXBlciBncm93dGggYWZ0ZXIuIFRob3VnaCwgaWYgd2Ugd2VyZSB0byBjb21wYXJlIGZyb20ganVzdCAyMDA1IHRvIDIwMjAsIGV4Y2x1ZGluZyB0aGUgbW92ZW1lbnRzIGl0IG1hZGUsIHdlIHNlZSB2ZXJ5IG1pbmltYWwgZ3Jvd3RoLiBUaGUgc2Vjb25kIGdyYXBoIGxvb2tlZCBpbnRvIHRoZSB0b3RhbCBpbmRpdmlkdWFsIG9jY3VwYXRpb25zIGluIHRoZSB5ZWFyIDIwMjAuIFRoaXMgc2hvd3MgdXMgd2hlcmUgYWxsIHRoZSB3b3JrZXJzIHRlbmQgdG8gYmUgZ2F0aGVyZWQgYXQuIEJhc2VkIG9uIHRoZSBncmFwaCwgc29mdHdhcmUgZGV2ZWxvcGVycyBkb21pbmF0ZWQgdGhlIGdyYXBoIHdpdGggb3ZlciAxNTAwIGVtcGxveWVlcywgd2hpbGUgTWF0aGVtYXRpY2lhbnMgaGFkIGNsb3NlIHRvIDAuIEV2ZXJ5dGhpbmcgZWxzZSBvbiBhdmVyYWdlIHR5cGljYWxseSBoYWQgbm8gbW9yZSB0aGFuIDI1MCB0b3RhbCB3b3JrZXJzLiAK