Section -
Objectives
The objective of this project is to create a relational database and
pull various data sets together into in order to perform exploratory
data analysis of Election, Unemployment, Poverty, and Education data.
The goal is to learn how to use sql and data management skills to pull
needed variables into one dataframe to perform necessary Exploratory
Data Analysis.
Data Integration
Data Preparation -
Initial Download and Analysis
In order to create a database all four of the datasets needed must be
downloaded. Once all data is incorporated it is necessary to get a basic
understanding of each dataset. The four datasets used in this project as
education, which contains variables looking at education levels in
various states. The second dataset is unemployment, which contains
information pertaining to unemployment rates in different states and
counties. The third dataset is poverty, which pertains information about
poverty rates across the united states. The final dataset is contains
election data, such as parties and the winning party for previous
elections.
Here is a quick summary of the four datasets. A connection is then
made to a sqlite database and data tables are input. Now the process of
data integration can begin.
Data Preparation -
Presidential Election Data
When preparing the first data set, Presidential Election Data, it
must fit the following requirements: 1.only use the 2020 election data
2.only keep the data for the two major parties: Democrats and
Republicans 3.aggregate the total votes and keep the winning party in
the data 4.county FIPS code, State name, county name, total votes
received in the winning party, and the name of the party.
SELECT
county_fips AS fips_code,
state,
county_name,
SUM(totalvotes) AS total_votes,
CASE
WHEN SUM(CASE WHEN party = 'DEMOCRAT' THEN candidatevotes ELSE 0 END) >
SUM(CASE WHEN party = 'REPUBLICAN' THEN candidatevotes ELSE 0 END)
THEN 'DEMOCRAT'
ELSE 'REPUBLICAN'
END AS winning_party
FROM
election
WHERE
year = 2020
AND party IN ('DEMOCRAT', 'REPUBLICAN')
GROUP BY
county_fips, state, county_name;
Data Preparation -
Unemployment Data
When preparing the second data set, Unemployment Data, it must fit
the following requirements: 1.Only keep the unemployment date in the
year 2020 or the most recent year if the 2020 employment rate is
unavailable 2.County FIPS code 3.Unemployment rate
I renamed ‘FIPS_Code’ to ‘fips_code’ for data consistency. Value was
also renamed to unemployment_rate for clarity when it comes to merging
datasets. The substring function was used on the ‘Attribute’ varible in
order to extract the year 2020. This was aptly named ‘year’.
SELECT
FIPS_Code AS fips_code,
Value AS unemployment_rate,
SUBSTR(Attribute, -4) AS year
FROM
unemployment
WHERE
year = "2020"
Data Preparation -
Poverty Data
When preparing the third data set, Poverty Data, it must fit the
following requirements: 1.Keep only 2019 poverty rate 2.County FIPS
code
I renamed ‘FIPStxt’ to ‘fips_code’ for data consistancy. Value was
also renamed to poverty_rate for clarity when it comes to merging
datasets.
SELECT
FIPStxt AS fips_code,
Value as poverty_rate
FROM
poverty
WHERE
Attribute = "PCTPOVALL_2019";
Data Preparation -
Education Data
When preparing the final data set, Education Data, it must fit the
following requirements: 1.only keep the percentage of education levels
between 2015 and 2019. a.Education levels b.less than a high school
diploma c.high school diploma d.completed some college (1-3 years)
e.completed four years of college 2.County FIPS code
I renamed the variables above to ‘fips_code’ and replaced all “.”
with “_” in order to run a sql query.
SELECT
fips_code,
Percent_of_adults_with_less_than_a_high_school_diploma__2015_19,
Percent_of_adults_with_a_high_school_diploma_only__2015_19,
Percent_of_adults_completing_some_college_or_associate_s_degree__2015_19,
Percent_of_adults_with_a_bachelor_s_degree_or_higher__2015_19
FROM
education
GROUP BY
fips_code;
Merge Datasets
Here I left joined all datasets together. Then, using the dplyr
library, I removed all duplicates based on the fips_code and any missing
observations. The final dataset is called fips_202_elections. This
dataset has 3113 observations consisting of 12 variables of
interest.
Exploratory Data
Anaylsis
Univariate
Analysis
The first EDA I want to do is a univariate analysis of the variable
“winning_party” Below is pie chart that shows the distribution of
winning parties.
From this chart we can see that the republican party has a higher amount
of winning counties than the democratic party. However, in the electoral
college, it is not how many counties your party wins, but how many
delegates belong to that county. In 2020 the Democratic party won the
presidency, this was done by winning fewer but larger counties with more
delegates.
Bivariate
Anaylsis
In looking at two continous varibles “poverty_rate” and
“unemployment_rate” the best way to visualize if there is any
association is through a scatterplot. The plot can be seen below.

Here we can see that there does not seem to be an association between
poverty rate and unemployment rate in the 2020 presidential election. A
statistical test to confirm this would be Pearson’s Correlation test. ##
Pairwise comparisons
A pairwise comparisons was conducted for adults and various
educational levels. The graphic can be seen below.
# Results and Discussions In this project four datasets were queried in
a SQLite database and merged into one dataframe in order to perform
Exploratory Data Analysis. When looking at the distribution of winning
parties, we see that the Republication Party won a larger amount of
counties compared to the Democratic Party. In a Bivariate analysis
looking for an association between poverty rate and unemployment rate,
none was found. Finally a pairwise analysis was conducted looking at
correlations between party and educational levels. Here it can be seen
higher education had a negative correlation both parties, except for
republicans with a bachelor degree or higher. This can be due to where
colleges are located in specific counties or job opportunists for
professionals.
DQotLS0NCnRpdGxlOiAiU1FMIGFuZCBFREEgb2YgRWxlY3Rpb24gRGF0YSINCmF1dGhvcjogIkplc3NpY2EgR29yciINCmRhdGU6ICI5LzI1LzIwMjQiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OmJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgYXV0aG9ycyAgKi8NCiAgZm9udC1zaXplOiAyMHB4Ow0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgdGhlIGRhdGUgICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICAgIGZvbnQtd2VpZ2h0OmJvbGQ7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCmgyIHsgLyogSGVhZGVyIDIgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciBsZXZlbCAyIHNlY3Rpb24gdGl0bGUgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6Ym9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCAzIHNlY3Rpb24gdGl0bGUgICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OmJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQo8L3N0eWxlPg0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpvcHRpb25zKHJlcG9zID0gbGlzdChDUkFOPSJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKSkNCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJvZGJjIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIm9kYmMiKQ0KICAgbGlicmFyeShvZGJjKQ0KfQ0KaWYgKCFyZXF1aXJlKCJEQkkiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygiREJJIikNCiAgIGxpYnJhcnkoREJJKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSU1FMaXRlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIlJTUUxpdGUiKQ0KICAgbGlicmFyeShSU1FMaXRlKQ0KfQ0KDQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSkNCmBgYA0KDQoNClwNCg0KIyBTZWN0aW9uIC0gT2JqZWN0aXZlcw0KVGhlIG9iamVjdGl2ZSBvZiB0aGlzIHByb2plY3QgaXMgdG8gY3JlYXRlIGEgcmVsYXRpb25hbCBkYXRhYmFzZSBhbmQgcHVsbCB2YXJpb3VzIGRhdGEgc2V0cyB0b2dldGhlciBpbnRvIGluIG9yZGVyIHRvIHBlcmZvcm0gZXhwbG9yYXRvcnkgZGF0YSBhbmFseXNpcyBvZiBFbGVjdGlvbiwgVW5lbXBsb3ltZW50LCBQb3ZlcnR5LCBhbmQgRWR1Y2F0aW9uIGRhdGEuIFRoZSBnb2FsIGlzIHRvIGxlYXJuIGhvdyB0byB1c2Ugc3FsIGFuZCBkYXRhIG1hbmFnZW1lbnQgc2tpbGxzIHRvIHB1bGwgbmVlZGVkIHZhcmlhYmxlcyBpbnRvIG9uZSBkYXRhZnJhbWUgdG8gcGVyZm9ybSBuZWNlc3NhcnkgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcy4NCg0KIyMgRGF0YSBJbnRlZ3JhdGlvbg0KIyMjIERhdGEgUHJlcGFyYXRpb24gLSBJbml0aWFsIERvd25sb2FkIGFuZCBBbmFseXNpcw0KSW4gb3JkZXIgdG8gY3JlYXRlIGEgZGF0YWJhc2UgYWxsIGZvdXIgb2YgdGhlIGRhdGFzZXRzIG5lZWRlZCBtdXN0IGJlIGRvd25sb2FkZWQuIE9uY2UgYWxsIGRhdGEgaXMgaW5jb3Jwb3JhdGVkIGl0IGlzIG5lY2Vzc2FyeSB0byBnZXQgYSBiYXNpYyB1bmRlcnN0YW5kaW5nIG9mIGVhY2ggZGF0YXNldC4gVGhlIGZvdXIgZGF0YXNldHMgdXNlZCBpbiB0aGlzIHByb2plY3QgYXMgZWR1Y2F0aW9uLCB3aGljaCBjb250YWlucyB2YXJpYWJsZXMgbG9va2luZyBhdCBlZHVjYXRpb24gbGV2ZWxzIGluIHZhcmlvdXMgc3RhdGVzLiBUaGUgc2Vjb25kIGRhdGFzZXQgaXMgdW5lbXBsb3ltZW50LCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBwZXJ0YWluaW5nIHRvIHVuZW1wbG95bWVudCByYXRlcyBpbiBkaWZmZXJlbnQgc3RhdGVzIGFuZCBjb3VudGllcy4gVGhlIHRoaXJkIGRhdGFzZXQgaXMgcG92ZXJ0eSwgd2hpY2ggcGVydGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgcG92ZXJ0eSByYXRlcyBhY3Jvc3MgdGhlIHVuaXRlZCBzdGF0ZXMuIFRoZSBmaW5hbCBkYXRhc2V0IGlzIGNvbnRhaW5zIGVsZWN0aW9uIGRhdGEsIHN1Y2ggYXMgcGFydGllcyBhbmQgdGhlIHdpbm5pbmcgcGFydHkgZm9yIHByZXZpb3VzIGVsZWN0aW9ucy4NCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCiNMb2FkIHRoZSBzYW1wbGUgZGF0YQ0KZWR1Y2F0aW9uIDwtIHJlYWQuY3N2KCJodHRwczovL2plc3Nnb3JyMDEuZ2l0aHViLmlvL1NUQTU1MS9FZHVjYXRpb24uY3N2IikNCnBvdmVydHkgPC0gcmVhZC5jc3YoImh0dHBzOi8vamVzc2dvcnIwMS5naXRodWIuaW8vU1RBNTUxL1BvdmVydHlFc3RpbWF0ZXMuY3N2IikNCnVuZW1wbG95bWVudCA8LSByZWFkLmNzdigiaHR0cHM6Ly9qZXNzZ29ycjAxLmdpdGh1Yi5pby9TVEE1NTEvVW5lbXBsb3ltZW50LmNzdiIpDQplbGVjdGlvbiA8LSByZWFkLmNzdigiaHR0cHM6Ly9qZXNzZ29ycjAxLmdpdGh1Yi5pby9TVEE1NTEvY291bnR5cHJlc2lkZW50aWFsX2VsZWN0aW9uXzIwMDAtMjAyMC5jc3YiKQ0KDQplZHVjYXRpb24gPC0gZWR1Y2F0aW9uICU+JQ0KICByZW5hbWUoZmlwc19jb2RlID0gRklQUy5Db2RlLA0KICAgICAgICAgUGVyY2VudF9vZl9hZHVsdHNfd2l0aF9sZXNzX3RoYW5fYV9oaWdoX3NjaG9vbF9kaXBsb21hX18yMDE1XzE5ID0gUGVyY2VudC5vZi5hZHVsdHMud2l0aC5sZXNzLnRoYW4uYS5oaWdoLnNjaG9vbC5kaXBsb21hLi4yMDE1LjE5LA0KICAgICAgICAgUGVyY2VudF9vZl9hZHVsdHNfd2l0aF9hX2hpZ2hfc2Nob29sX2RpcGxvbWFfb25seV9fMjAxNV8xOSA9IFBlcmNlbnQub2YuYWR1bHRzLndpdGguYS5oaWdoLnNjaG9vbC5kaXBsb21hLm9ubHkuLjIwMTUuMTksDQogICAgICAgICBQZXJjZW50X29mX2FkdWx0c19jb21wbGV0aW5nX3NvbWVfY29sbGVnZV9vcl9hc3NvY2lhdGVfc19kZWdyZWVfXzIwMTVfMTkgPSBQZXJjZW50Lm9mLmFkdWx0cy5jb21wbGV0aW5nLnNvbWUuY29sbGVnZS5vci5hc3NvY2lhdGUucy5kZWdyZWUuLjIwMTUuMTksDQogICAgICAgICBQZXJjZW50X29mX2FkdWx0c193aXRoX2FfYmFjaGVsb3Jfc19kZWdyZWVfb3JfaGlnaGVyX18yMDE1XzE5ID0gUGVyY2VudC5vZi5hZHVsdHMud2l0aC5hLmJhY2hlbG9yLnMuZGVncmVlLm9yLmhpZ2hlci4uMjAxNS4xOSkNCmBgYA0KSGVyZSBpcyBhIHF1aWNrIHN1bW1hcnkgb2YgdGhlIGZvdXIgZGF0YXNldHMuIEEgY29ubmVjdGlvbiBpcyB0aGVuIG1hZGUgdG8gYSBzcWxpdGUgZGF0YWJhc2UgYW5kIGRhdGEgdGFibGVzIGFyZSBpbnB1dC4gTm93IHRoZSBwcm9jZXNzIG9mIGRhdGEgaW50ZWdyYXRpb24gY2FuIGJlZ2luLg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpzdW1tYXJ5KGVkdWNhdGlvbikNCnN1bW1hcnkocG92ZXJ0eSkNCnN1bW1hcnkodW5lbXBsb3ltZW50KQ0Kc3VtbWFyeShlbGVjdGlvbikNCmBgYA0KYGBgYGBge3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KI0NyZWF0ZSBkYXRhYmFzZQ0KY29uIDwtIGRiQ29ubmVjdChkcnYgPSBTUUxpdGUoKSwNCiAgICAgICAgICAgICAgICAgZGJuYW1lID0gIjptZW1vcnk6IikNCg0KI3N0b3JlIHNhbXBsZSBkYXRhIGluIHRoZSBkYXRhYmFzZQ0KZGJXcml0ZVRhYmxlKGNvbm4gPSBjb24sIA0KICAgICAgICAgICAgIG5hbWUgPSAiZWR1Y2F0aW9uIiwNCiAgICAgICAgICAgICB2YWx1ZSA9IGVkdWNhdGlvbikNCg0KZGJXcml0ZVRhYmxlKGNvbm4gPSBjb24sIA0KICAgICAgICAgICAgIG5hbWUgPSAicG92ZXJ0eSIsDQogICAgICAgICAgICAgdmFsdWUgPSBwb3ZlcnR5KQ0KDQpkYldyaXRlVGFibGUoY29ubiA9IGNvbiwgDQogICAgICAgICAgICAgbmFtZSA9ICJ1bmVtcGxveW1lbnQiLA0KICAgICAgICAgICAgIHZhbHVlID0gdW5lbXBsb3ltZW50KQ0KZGJXcml0ZVRhYmxlKGNvbm4gPSBjb24sIA0KICAgICAgICAgICAgIG5hbWUgPSAiZWxlY3Rpb24iLA0KICAgICAgICAgICAgIHZhbHVlID0gZWxlY3Rpb24pDQogDQojcmVtb3ZlIHRoZSBsb2NhbCBkYXRhIGZyb20gdGhlIGVudmlyb25tZW50DQpybShlZHVjYXRpb24scG92ZXJ0eSwgdW5lbXBsb3ltZW50LCBlbGVjdGlvbikNCmBgYA0KDQpgYGBgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQp0Ymwoc3JjID0gY29uLCAgICAgICAgICMgIHRoZSBzb3VyY2UgaWYgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZQ0KICAgIGMoImVkdWNhdGlvbiIpKSAgICAgICMgIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBwcmV2aWV3DQp0Ymwoc3JjID0gY29uLCAicG92ZXJ0eSIpDQp0Ymwoc3JjID0gY29uLCAidW5lbXBsb3ltZW50IikNCnRibChzcmMgPSBjb24sICJlbGVjdGlvbiIpDQpgYGANCiMjIyBEYXRhIFByZXBhcmF0aW9uIC0gUHJlc2lkZW50aWFsIEVsZWN0aW9uIERhdGENCg0KV2hlbiBwcmVwYXJpbmcgdGhlIGZpcnN0IGRhdGEgc2V0LCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gRGF0YSwgaXQgbXVzdCBmaXQgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQogIDEub25seSB1c2UgdGhlIDIwMjAgZWxlY3Rpb24gZGF0YQ0KICAyLm9ubHkga2VlcCB0aGUgZGF0YSBmb3IgdGhlIHR3byBtYWpvciBwYXJ0aWVzOiBEZW1vY3JhdHMgYW5kIFJlcHVibGljYW5zDQogIDMuYWdncmVnYXRlIHRoZSB0b3RhbCB2b3RlcyBhbmQga2VlcCB0aGUgd2lubmluZyBwYXJ0eSBpbiB0aGUgZGF0YQ0KICA0LmNvdW50eSBGSVBTIGNvZGUsIFN0YXRlIG5hbWUsIGNvdW50eSBuYW1lLCB0b3RhbCB2b3RlcyByZWNlaXZlZCBpbiB0aGUgd2lubmluZyBwYXJ0eSwgYW5kIHRoZSBuYW1lIG9mIHRoZSBwYXJ0eS4NCiAgDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gImNvbiIsIG91dHB1dC52YXIgPSAiZWxlY3Rpb25fbmV3In0NClNFTEVDVCANCiAgICBjb3VudHlfZmlwcyBBUyBmaXBzX2NvZGUsDQogICAgc3RhdGUsDQogICAgY291bnR5X25hbWUsDQogICAgU1VNKHRvdGFsdm90ZXMpIEFTIHRvdGFsX3ZvdGVzLA0KICAgIENBU0UgDQogICAgICAgIFdIRU4gU1VNKENBU0UgV0hFTiBwYXJ0eSA9ICdERU1PQ1JBVCcgVEhFTiBjYW5kaWRhdGV2b3RlcyBFTFNFIDAgRU5EKSA+IA0KICAgICAgICAgICAgIFNVTShDQVNFIFdIRU4gcGFydHkgPSAnUkVQVUJMSUNBTicgVEhFTiBjYW5kaWRhdGV2b3RlcyBFTFNFIDAgRU5EKSANCiAgICAgICAgVEhFTiAnREVNT0NSQVQnDQogICAgICAgIEVMU0UgJ1JFUFVCTElDQU4nDQogICAgRU5EIEFTIHdpbm5pbmdfcGFydHkNCkZST00gDQogICAgZWxlY3Rpb24NCldIRVJFIA0KICAgIHllYXIgPSAyMDIwIA0KICAgIEFORCBwYXJ0eSBJTiAoJ0RFTU9DUkFUJywgJ1JFUFVCTElDQU4nKQ0KR1JPVVAgQlkgDQogICAgY291bnR5X2ZpcHMsIHN0YXRlLCBjb3VudHlfbmFtZTsNCg0KYGBgDQojIyMgRGF0YSBQcmVwYXJhdGlvbiAtIFVuZW1wbG95bWVudCBEYXRhDQpXaGVuIHByZXBhcmluZyB0aGUgc2Vjb25kIGRhdGEgc2V0LCBVbmVtcGxveW1lbnQgRGF0YSwgaXQgbXVzdCBmaXQgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQogIDEuT25seSBrZWVwIHRoZSB1bmVtcGxveW1lbnQgZGF0ZSBpbiB0aGUgeWVhciAyMDIwIG9yIHRoZSBtb3N0IHJlY2VudCB5ZWFyIGlmIHRoZSAyMDIwIGVtcGxveW1lbnQgcmF0ZSBpcyB1bmF2YWlsYWJsZQ0KICAyLkNvdW50eSBGSVBTIGNvZGUNCiAgMy5VbmVtcGxveW1lbnQgcmF0ZQ0KICANCkkgcmVuYW1lZCAnRklQU19Db2RlJyB0byAnZmlwc19jb2RlJyBmb3IgZGF0YSBjb25zaXN0ZW5jeS4gVmFsdWUgd2FzIGFsc28gcmVuYW1lZCB0byB1bmVtcGxveW1lbnRfcmF0ZSBmb3IgY2xhcml0eSB3aGVuIGl0IGNvbWVzIHRvIG1lcmdpbmcgZGF0YXNldHMuIFRoZSBzdWJzdHJpbmcgZnVuY3Rpb24gd2FzIHVzZWQgb24gdGhlICdBdHRyaWJ1dGUnIHZhcmlibGUgaW4gb3JkZXIgdG8gZXh0cmFjdCB0aGUgeWVhciAyMDIwLiBUaGlzIHdhcyBhcHRseSBuYW1lZCAneWVhcicuDQpgYGB7c3FsLCBjb25uZWN0aW9uID0gImNvbiIsIG91dHB1dC52YXIgPSAidW5lbXBsb3ltZW50X25ldyJ9DQpTRUxFQ1QgDQogICAgRklQU19Db2RlIEFTIGZpcHNfY29kZSwNCiAgICBWYWx1ZSBBUyB1bmVtcGxveW1lbnRfcmF0ZSwgDQogICAgU1VCU1RSKEF0dHJpYnV0ZSwgLTQpIEFTIHllYXINCkZST00gDQogICAgdW5lbXBsb3ltZW50DQpXSEVSRSANCiAgICB5ZWFyID0gIjIwMjAiDQoNCmBgYA0KICANCiMjIyBEYXRhIFByZXBhcmF0aW9uIC0gUG92ZXJ0eSBEYXRhDQpXaGVuIHByZXBhcmluZyB0aGUgdGhpcmQgZGF0YSBzZXQsIFBvdmVydHkgRGF0YSwgaXQgbXVzdCBmaXQgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQogIDEuS2VlcCBvbmx5IDIwMTkgcG92ZXJ0eSByYXRlDQogIDIuQ291bnR5IEZJUFMgY29kZQ0KDQpJIHJlbmFtZWQgJ0ZJUFN0eHQnIHRvICdmaXBzX2NvZGUnIGZvciBkYXRhIGNvbnNpc3RhbmN5LiBWYWx1ZSB3YXMgYWxzbyByZW5hbWVkIHRvIHBvdmVydHlfcmF0ZSBmb3IgY2xhcml0eSB3aGVuIGl0IGNvbWVzIHRvIG1lcmdpbmcgZGF0YXNldHMuICANCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSAiY29uIiwgb3V0cHV0LnZhciA9ICJwb3ZlcnR5X25ldyJ9DQpTRUxFQ1QgDQogICAgRklQU3R4dCBBUyBmaXBzX2NvZGUsDQogICAgVmFsdWUgYXMgcG92ZXJ0eV9yYXRlDQpGUk9NIA0KICAgIHBvdmVydHkNCldIRVJFIA0KICAgIEF0dHJpYnV0ZSA9ICJQQ1RQT1ZBTExfMjAxOSI7DQpgYGANCg0KIyMjIERhdGEgUHJlcGFyYXRpb24gLSBFZHVjYXRpb24gRGF0YQ0KV2hlbiBwcmVwYXJpbmcgdGhlIGZpbmFsIGRhdGEgc2V0LCBFZHVjYXRpb24gRGF0YSwgaXQgbXVzdCBmaXQgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6DQogIDEub25seSBrZWVwIHRoZSBwZXJjZW50YWdlIG9mIGVkdWNhdGlvbiBsZXZlbHMgYmV0d2VlbiAyMDE1IGFuZCAyMDE5Lg0KICAgICAgYS5FZHVjYXRpb24gbGV2ZWxzDQogICAgICBiLmxlc3MgdGhhbiBhIGhpZ2ggc2Nob29sIGRpcGxvbWENCiAgICAgIGMuaGlnaCBzY2hvb2wgZGlwbG9tYQ0KICAgICAgZC5jb21wbGV0ZWQgc29tZSBjb2xsZWdlICgxLTMgeWVhcnMpDQogICAgICBlLmNvbXBsZXRlZCBmb3VyIHllYXJzIG9mIGNvbGxlZ2UNCiAgMi5Db3VudHkgRklQUyBjb2RlDQoNCkkgcmVuYW1lZCB0aGUgdmFyaWFibGVzIGFib3ZlIHRvICdmaXBzX2NvZGUnIGFuZCByZXBsYWNlZCBhbGwgIi4iIHdpdGggIl8iIGluIG9yZGVyIHRvIHJ1biBhIHNxbCBxdWVyeS4NCmBgYHtzcWwsIGNvbm5lY3Rpb24gPSAiY29uIiwgb3V0cHV0LnZhciA9ICJlZHVjYXRpb25fbmV3In0NClNFTEVDVCANCiAgICBmaXBzX2NvZGUsDQogICAgUGVyY2VudF9vZl9hZHVsdHNfd2l0aF9sZXNzX3RoYW5fYV9oaWdoX3NjaG9vbF9kaXBsb21hX18yMDE1XzE5LA0KICAgIFBlcmNlbnRfb2ZfYWR1bHRzX3dpdGhfYV9oaWdoX3NjaG9vbF9kaXBsb21hX29ubHlfXzIwMTVfMTksDQogICAgUGVyY2VudF9vZl9hZHVsdHNfY29tcGxldGluZ19zb21lX2NvbGxlZ2Vfb3JfYXNzb2NpYXRlX3NfZGVncmVlX18yMDE1XzE5LA0KICAgIFBlcmNlbnRfb2ZfYWR1bHRzX3dpdGhfYV9iYWNoZWxvcl9zX2RlZ3JlZV9vcl9oaWdoZXJfXzIwMTVfMTkNCkZST00gDQogICAgZWR1Y2F0aW9uDQpHUk9VUCBCWSANCiAgICBmaXBzX2NvZGU7DQpgYGANCiMjIyBNZXJnZSBEYXRhc2V0cw0KSGVyZSBJIGxlZnQgam9pbmVkIGFsbCBkYXRhc2V0cyB0b2dldGhlci4gVGhlbiwgdXNpbmcgdGhlIGRwbHlyIGxpYnJhcnksIEkgcmVtb3ZlZCBhbGwgZHVwbGljYXRlcyBiYXNlZCBvbiB0aGUgZmlwc19jb2RlIGFuZCBhbnkgbWlzc2luZyBvYnNlcnZhdGlvbnMuIFRoZSBmaW5hbCBkYXRhc2V0IGlzIGNhbGxlZCBmaXBzXzIwMl9lbGVjdGlvbnMuIFRoaXMgZGF0YXNldCBoYXMgMzExMyBvYnNlcnZhdGlvbnMgY29uc2lzdGluZyBvZiAxMiB2YXJpYWJsZXMgb2YgaW50ZXJlc3QuDQpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQojIExvYWQgZHBseXIgZm9yIGRhdGEgbWFuaXB1bGF0aW9uDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIE1lcmdlIGRhdGFzZXRzDQpjb21iaW5lZF9kYXRhIDwtIGVsZWN0aW9uX25ldyAlPiUNCiAgICBsZWZ0X2pvaW4odW5lbXBsb3ltZW50X25ldywgYnkgPSAiZmlwc19jb2RlIikgJT4lDQogICAgbGVmdF9qb2luKHBvdmVydHlfbmV3LCBieSA9ICJmaXBzX2NvZGUiKSAlPiUNCiAgICBsZWZ0X2pvaW4oZWR1Y2F0aW9uX25ldywgYnkgPSAiZmlwc19jb2RlIikNCiNyZW1vdmUgYW55IGR1cGxpY2F0ZXMNCmZpcHNfMjAyMF9lbGVjdGlvbiA8LWNvbWJpbmVkX2RhdGEgJT4lDQogIGRpc3RpbmN0KGZpcHNfY29kZSwgLmtlZXBfYWxsID0gVFJVRSklPiUNCiAgZHJvcF9uYSgpDQoNCiMgVmlldyB0aGUgZmluYWwgY29tYmluZWQgZGF0YXNldA0KaGVhZChmaXBzXzIwMjBfZWxlY3Rpb24pDQp3cml0ZV9jc3YoZmlwc18yMDIwX2VsZWN0aW9uLCAiQzovVXNlcnMvamVzc2cvT25lRHJpdmUgLSBXZXN0IENoZXN0ZXIgVW5pdmVyc2l0eSBvZiBQQS9zdGE1NTEvZmlwc18yMDIwX2VsZWN0aW9uLmNzdiIpDQojd3JpdGUuY3N2KGZpcHNfMjAyMF9lbGVjdGlvbiwgZmlsZSA9ICJmaXBzXzIwMjBfZWxlY3Rpb24uY3N2Iiwgcm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCg0KIyBFeHBsb3JhdG9yeSBEYXRhIEFuYXlsc2lzDQoNCiMjIFVuaXZhcmlhdGUgQW5hbHlzaXMNClRoZSBmaXJzdCBFREEgSSB3YW50IHRvIGRvIGlzIGEgdW5pdmFyaWF0ZSBhbmFseXNpcyBvZiB0aGUgdmFyaWFibGUgIndpbm5pbmdfcGFydHkiIEJlbG93IGlzIHBpZSBjaGFydCB0aGF0IHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2Ygd2lubmluZyBwYXJ0aWVzLg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KZnJlcS50YmwgPSB0YWJsZShmaXBzXzIwMjBfZWxlY3Rpb24kd2lubmluZ19wYXJ0eSkNCnBpZShmcmVxLnRibCwgeGxhYj0iV2lubmluZyBQYXJ0eSIsIHlsYWIgPSAiQ291bnRzIiwgbWFpbj0iRGlzdHJpYnV0aW9uIG9mIFdpbm5pbmcgUGFydHkgaW4gdGhlIDIwMjAgRWxlY3Rpb24iKQ0KDQpgYGANCkZyb20gdGhpcyBjaGFydCB3ZSBjYW4gc2VlIHRoYXQgdGhlIHJlcHVibGljYW4gcGFydHkgaGFzIGEgaGlnaGVyIGFtb3VudCBvZiB3aW5uaW5nIGNvdW50aWVzIHRoYW4gdGhlIGRlbW9jcmF0aWMgcGFydHkuIEhvd2V2ZXIsIGluIHRoZSBlbGVjdG9yYWwgY29sbGVnZSwgaXQgaXMgbm90IGhvdyBtYW55IGNvdW50aWVzIHlvdXIgcGFydHkgd2lucywgYnV0IGhvdyBtYW55IGRlbGVnYXRlcyBiZWxvbmcgdG8gdGhhdCBjb3VudHkuIEluIDIwMjAgdGhlIERlbW9jcmF0aWMgcGFydHkgd29uIHRoZSBwcmVzaWRlbmN5LCB0aGlzIHdhcyBkb25lIGJ5IHdpbm5pbmcgZmV3ZXIgYnV0IGxhcmdlciBjb3VudGllcyB3aXRoIG1vcmUgZGVsZWdhdGVzLg0KDQojIyBCaXZhcmlhdGUgQW5heWxzaXMNCkluIGxvb2tpbmcgYXQgdHdvIGNvbnRpbm91cyB2YXJpYmxlcyAicG92ZXJ0eV9yYXRlIiBhbmQgInVuZW1wbG95bWVudF9yYXRlIiB0aGUgYmVzdCB3YXkgdG8gdmlzdWFsaXplIGlmIHRoZXJlIGlzIGFueSBhc3NvY2lhdGlvbiBpcyB0aHJvdWdoIGEgc2NhdHRlcnBsb3QuIFRoZSBwbG90IGNhbiBiZSBzZWVuIGJlbG93Lg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KI3Bsb3QoZmlwc18yMDIwX2VsZWN0aW9uJHBvdmVydHlfcmF0ZSwgZmlwc18yMDIwX2VsZWN0aW9uJHVuZW1wbG95bWVudF9yYXRlKQ0KDQpwbG90KGZpcHNfMjAyMF9lbGVjdGlvbiRwb3ZlcnR5X3JhdGUsIGZpcHNfMjAyMF9lbGVjdGlvbiR1bmVtcGxveW1lbnRfcmF0ZSwNCiAgICAgbWFpbiA9ICJBc3NvY2lhdGlvbiBiZXR3ZWVuIFBvdmVydHkgUmF0ZSBhbmQgVW5lbXBsb3ltZW50IFJhdGUiLCAgICAgIyBUaXRsZQ0KICAgICB4bGFiID0gIlBvdmVydHkgUmF0ZSIsICAgICAgICAgICAgICMgWC1heGlzIGxhYmVsDQogICAgIHlsYWIgPSAiVW5lbXBsb3ltZW50IFJhdGUiLCAgICAgICAgICAgICAjIFktYXhpcyBsYWJlbA0KICAgICBwY2ggPSAxOSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgUG9pbnQgdHlwZQ0KICAgICBjb2wgPSAiYmx1ZSIpICAgICAgICAgICAgICAgICAgICAgIyBQb2ludCBjb2xvcg0KYGBgDQoNCg0KSGVyZSB3ZSBjYW4gc2VlIHRoYXQgdGhlcmUgZG9lcyBub3Qgc2VlbSB0byBiZSBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHBvdmVydHkgcmF0ZSBhbmQgdW5lbXBsb3ltZW50IHJhdGUgaW4gdGhlIDIwMjAgcHJlc2lkZW50aWFsIGVsZWN0aW9uLiBBIHN0YXRpc3RpY2FsIHRlc3QgdG8gY29uZmlybSB0aGlzIHdvdWxkIGJlIFBlYXJzb24ncyBDb3JyZWxhdGlvbiB0ZXN0Lg0KIyMgUGFpcndpc2UgY29tcGFyaXNvbnMNCg0KQSBwYWlyd2lzZSBjb21wYXJpc29ucyB3YXMgY29uZHVjdGVkIGZvciBhZHVsdHMgYW5kIHZhcmlvdXMgZWR1Y2F0aW9uYWwgbGV2ZWxzLiBUaGUgZ3JhcGhpYyBjYW4gYmUgc2VlbiBiZWxvdy4NCg0KYGBge3IsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KEdHYWxseSkNCmdncGFpcnMoZmlwc18yMDIwX2VsZWN0aW9uLCBjb2x1bW5zID0gOToxMiwgYWVzKGNvbG9yPXdpbm5pbmdfcGFydHksIGFscGhhID0gMC41KSwNCiAgICAgICAgbG93ZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSAic21vb3RoIikpDQpgYGANCiMgUmVzdWx0cyBhbmQgRGlzY3Vzc2lvbnMNCkluIHRoaXMgcHJvamVjdCBmb3VyIGRhdGFzZXRzIHdlcmUgcXVlcmllZCBpbiBhIFNRTGl0ZSBkYXRhYmFzZSBhbmQgbWVyZ2VkIGludG8gb25lIGRhdGFmcmFtZSBpbiBvcmRlciB0byBwZXJmb3JtIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMuIFdoZW4gbG9va2luZyBhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHdpbm5pbmcgcGFydGllcywgd2Ugc2VlIHRoYXQgdGhlIFJlcHVibGljYXRpb24gUGFydHkgd29uIGEgbGFyZ2VyIGFtb3VudCBvZiBjb3VudGllcyBjb21wYXJlZCB0byB0aGUgRGVtb2NyYXRpYyBQYXJ0eS4gSW4gYSBCaXZhcmlhdGUgYW5hbHlzaXMgbG9va2luZyBmb3IgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBwb3ZlcnR5IHJhdGUgYW5kIHVuZW1wbG95bWVudCByYXRlLCBub25lIHdhcyBmb3VuZC4gRmluYWxseSBhIHBhaXJ3aXNlIGFuYWx5c2lzIHdhcyBjb25kdWN0ZWQgbG9va2luZyBhdCBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwYXJ0eSBhbmQgZWR1Y2F0aW9uYWwgbGV2ZWxzLiBIZXJlIGl0IGNhbiBiZSBzZWVuIGhpZ2hlciBlZHVjYXRpb24gaGFkIGEgbmVnYXRpdmUgY29ycmVsYXRpb24gYm90aCBwYXJ0aWVzLCBleGNlcHQgZm9yIHJlcHVibGljYW5zIHdpdGggYSBiYWNoZWxvciBkZWdyZWUgb3IgaGlnaGVyLiBUaGlzIGNhbiBiZSBkdWUgdG8gd2hlcmUgY29sbGVnZXMgYXJlIGxvY2F0ZWQgaW4gc3BlY2lmaWMgY291bnRpZXMgb3Igam9iIG9wcG9ydHVuaXN0cyBmb3IgcHJvZmVzc2lvbmFscy4NClwNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=