Mapping the percent Religious in America

Loading packages

library(tidyverse)
library(sf) 
library(tmap) 
library(tigris)  
library(spdep)
library(data.world)
library(readr)
library(dplyr)
library(texreg)
library(ggplot2)
library(tmap)
library(tmaptools)
library(tidyr)
library(Zelig)
library(visreg)

The United States have number of religious populations/groups. Overall it is found that 83% of Americans are Christian, 13% have no religion and 4% of population include Buddhists, Muslims and Jews, etc. This assignment will explore total religious groups in U.S by state and county. The data, Religion 2010, is obtained from social explorer gives total population, all religions population per county and state as well as the total percent religious in each area. It is interesting to compare the percent religious in different states as well as counties in America.

The dataset is used to analyze the distribution of total religious populations across the country. The data is derived by counties, states which is categorixed in a numerical form later in the study. The variables used in the analysis are STATEFP which identifies each state, County which gives names of each county by states, and Religiousperc which is the percentage of population for all religion populations in the total population. In other words, it is the percentage of total religious population by location.

This analysis will visualize our data on the percent of religious population through two different methods. The first method is a non-spatial regression and ggplot which will show the relationship between states and percent religious. The second method is through a spatial visualization of percent of relgiious among all counties and states, and the 11 nations of America.

Loading data

Amer.nation <- read_csv("/Users/Deepakie/Documents/Queens College/SOC712/Data/American Nations.csv")
head(Amer.nation)
religiondata$Geo_FIPS <- as.integer(religiondata$Geo_FIPS)
ct_map$GEOID <- as.integer(ct_map$GEOID)

Non-Spatial Regression

Non-spatial data gives a statistical correlation that is seperate of all spatial examinations. We will use a Ecological regressions and ggplots in this section.The ecological regression produced for this analysis is the relationship between total population and % population religious. The ecological regression, shown below give the mean of all religious population and total population of each state.

religiondata_er<- religiondata %>% 
  group_by(StateFP) %>% 
  summarise(mean_p = mean(Religiousperc, na.rm = TRUE), mean_s = mean(Totalpop, na.rm = TRUE))
eco <- lm(mean_p ~ mean_s, data = religiondata_er)
summary(eco)

Call:
lm(formula = mean_p ~ mean_s, data = religiondata_er)

Residuals:
     Min       1Q   Median       3Q      Max 
-24.4110  -7.6785   0.6961   7.7478  27.2981 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  5.073e+01  2.199e+00  23.074   <2e-16 ***
mean_s      -1.470e-05  9.640e-06  -1.525    0.133    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 11.65 on 50 degrees of freedom
Multiple R-squared:  0.04446,   Adjusted R-squared:  0.02535 
F-statistic: 2.327 on 1 and 50 DF,  p-value: 0.1335
GGPLOT
ggplot(data = religiondata, aes(x = StateFP, y = Religiousperc)) +
    geom_point() +
  coord_capped_cart(bottom='both', left='none') +
  theme_light() + theme(panel.border=element_blank(), axis.line = element_line())

The plot shows the percent of total religious population per each states. The plot is hard to read and confusing to understand so we will now look at this analysis by a Spatial mapping.

Spatial Mapping

Merging data

religiondata <- religiondata %>% 
  mutate(fips = as.integer(Geo_FIPS))
ct_map <- ct_map %>% 
  mutate(fips = parse_integer(GEOID))
combined_data <- ct_map %>% 
  left_join(religiondata, by = "fips")

Mapping

library(tmap)
tm_shape(combined_data) + tm_polygons("Religiousperc")

Excluding Alaska and Hawaii

combined_data_sub <- combined_data %>% 
  filter(STATEFP != "02") %>% 
  filter(STATEFP != "15") %>% 
  filter(STATEFP != "60") %>% 
  filter(STATEFP != "66") %>% 
  filter(STATEFP != "69") %>% 
  filter(STATEFP != "72") %>% 
  filter(STATEFP != "78")
tm_shape(combined_data_sub, projection = 2163) + tm_polygons("Religiousperc")

Mean of Religious Population

combined_data_sub <- combined_data_sub %>% 
  mutate(redblue = Religiousperc - 51.41)

The mean of “religiousperc” in this dataset help us differentiate the states percentage of religious population to observe differences between states in a clearer way. The mean also helps avoide extrapolation, in this case the mean is 51.41.

tm_shape(combined_data_sub, projection = 2163) + tm_polygons("redblue", palette = "-RdBu")

Highlighting State lines

us_states <- combined_data_sub %>% 
  aggregate_map(by = "STATEFP")
tm_shape(combined_data_sub, projection = 2163) + tm_polygons("redblue", palette = "-RdBu") + 
  tm_shape(us_states) + tm_borders(lwd = .36, col = "black", alpha = 1)

tm_shape(combined_data_sub, projection = 2163) + tm_polygons("redblue", palette = "-RdBu", border.col = "grey", border.alpha = .4) + 
  tm_shape(us_states) + tm_borders(lwd = .36, col = "black", alpha = 1)

This gives a spatial visualization by highlighting the state lines to understand the total percent regligious in the country among different states and counties. From the map above, the most religious areas are in scattered across the nation but we can identify large religious total percentages in the midnorth(North Dakota,South Dakota,Minnesota), midsouth(Texas, Louisiana,Oklahoma) and a little bit in midwest(mostly being in Utah). The map identifies by total religious percentage with ranges from -50 to 0, indiciating no relgiious populations, 0- 50 indicating religious population being between 0 -50%, 50 to 100% giving us higher total religious percentages and so on.

The American Nations

The American Nation: A History of the United States, written by Mark Carnes and John Garraty. The authors represent the political history of the United States tied with its social, economic and cultural development. Using the mapping file of the American Nations, this spatial analysis, shows county level percents of religious population among the 11 nations within America.

Amer.nation <- combined_data_sub %>% 
  aggregate_map(by = "STATEFP")
tm_shape(combined_data_sub, projection = 2163) + tm_polygons("redblue", palette = "-RdBu") + 
  tm_shape(Amer.nation) + tm_borders(lwd = .36, col = "black", alpha = 1)

Making the boudary lines clearer

tm_shape(combined_data_sub, projection = 2163) + tm_polygons("redblue", palette = "-RdBu", border.col = "grey", border.alpha = .4) + 
  tm_shape(Amer.nation) + tm_borders(lwd = .50, col = "black", alpha = 1)

Tigris

The Tigris package makes creating spatial mapping easier and smoother to apply for the analysis as many functions have a parameter,CB. On slide 32 of Professor’s slides, we coded counties(CB = TRUE).

If CF is set to TRUE, it will direct tigris to load a cartographic boundry file. Cartographic boundry files default to a simplified resoultion of 1:500k. In some cases such as states, resolutions of 1.5 million and 1:20 million are available. For example, R specify the following modifications to the states() function and retrieves a simplified dataset. In other words when CB is set to FALSE, we get a detailed TIGER/line file. When it is set to TRUE, the file is generalized to (1:500K).

options(tigris_class = "sf")
t_county <- counties(cb = TRUE)
#names(t_county)
t_combined_data <- t_county %>% 
  mutate(fips_code = parse_integer(GEOID))
t_combined_data_sub <- t_combined_data %>% 
  filter(STATEFP != "02") %>% 
  filter(STATEFP != "15") %>% 
  filter(STATEFP != "60") %>% 
  filter(STATEFP != "66") %>% 
  filter(STATEFP != "69") %>% 
  filter(STATEFP != "72") %>% 
  filter(STATEFP != "78")
us_states <- t_combined_data_sub %>% 
  aggregate_map(by = "STATEFP")
Amer.nation <- t_combined_data_sub %>% 
  aggregate_map(by = "STATEFP")
t_combined_data_sub <- combined_data_sub %>% 
  mutate(redblue = Religiousperc - mean(religiondata$Religiousperc))
tm_shape(combined_data_sub, projection = 2163) + tm_polygons("redblue", palette = "-RdBu", border.col = "grey", border.alpha = .4) + 
  tm_shape(Amer.nation) + tm_borders(lwd = .50, col = "black", alpha = 1)


options(tigris_class = "sf")
t_county <- counties(cb = FALSE)

  |                                                                                                
  |                                                                                          |   0%
  |                                                                                                
  |                                                                                          |   1%
  |                                                                                                
  |=                                                                                         |   1%
  |                                                                                                
  |=                                                                                         |   2%
  |                                                                                                
  |==                                                                                        |   2%
  |                                                                                                
  |==                                                                                        |   3%
  |                                                                                                
  |===                                                                                       |   3%
  |                                                                                                
  |===                                                                                       |   4%
  |                                                                                                
  |====                                                                                      |   4%
  |                                                                                                
  |====                                                                                      |   5%
  |                                                                                                
  |=====                                                                                     |   5%
  |                                                                                                
  |=====                                                                                     |   6%
  |                                                                                                
  |======                                                                                    |   6%
  |                                                                                                
  |======                                                                                    |   7%
  |                                                                                                
  |=======                                                                                   |   7%
  |                                                                                                
  |=======                                                                                   |   8%
  |                                                                                                
  |========                                                                                  |   8%
  |                                                                                                
  |========                                                                                  |   9%
  |                                                                                                
  |=========                                                                                 |   9%
  |                                                                                                
  |=========                                                                                 |  10%
  |                                                                                                
  |=========                                                                                 |  11%
  |                                                                                                
  |==========                                                                                |  11%
  |                                                                                                
  |==========                                                                                |  12%
  |                                                                                                
  |===========                                                                               |  12%
  |                                                                                                
  |===========                                                                               |  13%
  |                                                                                                
  |============                                                                              |  13%
  |                                                                                                
  |============                                                                              |  14%
  |                                                                                                
  |=============                                                                             |  14%
  |                                                                                                
  |=============                                                                             |  15%
  |                                                                                                
  |==============                                                                            |  15%
  |                                                                                                
  |==============                                                                            |  16%
  |                                                                                                
  |===============                                                                           |  16%
  |                                                                                                
  |===============                                                                           |  17%
  |                                                                                                
  |================                                                                          |  17%
  |                                                                                                
  |================                                                                          |  18%
  |                                                                                                
  |=================                                                                         |  18%
  |                                                                                                
  |=================                                                                         |  19%
  |                                                                                                
  |==================                                                                        |  19%
  |                                                                                                
  |==================                                                                        |  20%
  |                                                                                                
  |==================                                                                        |  21%
  |                                                                                                
  |===================                                                                       |  21%
  |                                                                                                
  |===================                                                                       |  22%
  |                                                                                                
  |====================                                                                      |  22%
  |                                                                                                
  |====================                                                                      |  23%
  |                                                                                                
  |=====================                                                                     |  23%
  |                                                                                                
  |=====================                                                                     |  24%
  |                                                                                                
  |======================                                                                    |  24%
  |                                                                                                
  |======================                                                                    |  25%
  |                                                                                                
  |=======================                                                                   |  25%
  |                                                                                                
  |=======================                                                                   |  26%
  |                                                                                                
  |========================                                                                  |  26%
  |                                                                                                
  |========================                                                                  |  27%
  |                                                                                                
  |=========================                                                                 |  27%
  |                                                                                                
  |=========================                                                                 |  28%
  |                                                                                                
  |==========================                                                                |  28%
  |                                                                                                
  |==========================                                                                |  29%
  |                                                                                                
  |===========================                                                               |  29%
  |                                                                                                
  |===========================                                                               |  30%
  |                                                                                                
  |===========================                                                               |  31%
  |                                                                                                
  |============================                                                              |  31%
  |                                                                                                
  |============================                                                              |  32%
  |                                                                                                
  |=============================                                                             |  32%
  |                                                                                                
  |=============================                                                             |  33%
  |                                                                                                
  |==============================                                                            |  33%
  |                                                                                                
  |==============================                                                            |  34%
  |                                                                                                
  |===============================                                                           |  34%
  |                                                                                                
  |===============================                                                           |  35%
  |                                                                                                
  |================================                                                          |  35%
  |                                                                                                
  |================================                                                          |  36%
  |                                                                                                
  |=================================                                                         |  36%
  |                                                                                                
  |=================================                                                         |  37%
  |                                                                                                
  |==================================                                                        |  37%
  |                                                                                                
  |==================================                                                        |  38%
  |                                                                                                
  |===================================                                                       |  38%
  |                                                                                                
  |===================================                                                       |  39%
  |                                                                                                
  |====================================                                                      |  39%
  |                                                                                                
  |====================================                                                      |  40%
  |                                                                                                
  |====================================                                                      |  41%
  |                                                                                                
  |=====================================                                                     |  41%
  |                                                                                                
  |=====================================                                                     |  42%
  |                                                                                                
  |======================================                                                    |  42%
  |                                                                                                
  |======================================                                                    |  43%
  |                                                                                                
  |=======================================                                                   |  43%
  |                                                                                                
  |=======================================                                                   |  44%
  |                                                                                                
  |========================================                                                  |  44%
  |                                                                                                
  |========================================                                                  |  45%
  |                                                                                                
  |=========================================                                                 |  45%
  |                                                                                                
  |=========================================                                                 |  46%
  |                                                                                                
  |==========================================                                                |  46%
  |                                                                                                
  |==========================================                                                |  47%
  |                                                                                                
  |===========================================                                               |  47%
  |                                                                                                
  |===========================================                                               |  48%
  |                                                                                                
  |============================================                                              |  48%
  |                                                                                                
  |============================================                                              |  49%
  |                                                                                                
  |=============================================                                             |  49%
  |                                                                                                
  |=============================================                                             |  50%
  |                                                                                                
  |=============================================                                             |  51%
  |                                                                                                
  |==============================================                                            |  51%
  |                                                                                                
  |==============================================                                            |  52%
  |                                                                                                
  |===============================================                                           |  52%
  |                                                                                                
  |===============================================                                           |  53%
  |                                                                                                
  |================================================                                          |  53%
  |                                                                                                
  |================================================                                          |  54%
  |                                                                                                
  |=================================================                                         |  54%
  |                                                                                                
  |=================================================                                         |  55%
  |                                                                                                
  |==================================================                                        |  55%
  |                                                                                                
  |==================================================                                        |  56%
  |                                                                                                
  |===================================================                                       |  56%
  |                                                                                                
  |===================================================                                       |  57%
  |                                                                                                
  |====================================================                                      |  57%
  |                                                                                                
  |====================================================                                      |  58%
  |                                                                                                
  |=====================================================                                     |  58%
  |                                                                                                
  |=====================================================                                     |  59%
  |                                                                                                
  |======================================================                                    |  59%
  |                                                                                                
  |======================================================                                    |  60%
  |                                                                                                
  |======================================================                                    |  61%
  |                                                                                                
  |=======================================================                                   |  61%
  |                                                                                                
  |=======================================================                                   |  62%
  |                                                                                                
  |========================================================                                  |  62%
  |                                                                                                
  |========================================================                                  |  63%
  |                                                                                                
  |=========================================================                                 |  63%
  |                                                                                                
  |=========================================================                                 |  64%
  |                                                                                                
  |==========================================================                                |  64%
  |                                                                                                
  |==========================================================                                |  65%
  |                                                                                                
  |===========================================================                               |  65%
  |                                                                                                
  |===========================================================                               |  66%
  |                                                                                                
  |============================================================                              |  66%
  |                                                                                                
  |============================================================                              |  67%
  |                                                                                                
  |=============================================================                             |  67%
  |                                                                                                
  |=============================================================                             |  68%
  |                                                                                                
  |==============================================================                            |  68%
  |                                                                                                
  |==============================================================                            |  69%
  |                                                                                                
  |===============================================================                           |  69%
  |                                                                                                
  |===============================================================                           |  70%
  |                                                                                                
  |===============================================================                           |  71%
  |                                                                                                
  |================================================================                          |  71%
  |                                                                                                
  |================================================================                          |  72%
  |                                                                                                
  |=================================================================                         |  72%
  |                                                                                                
  |=================================================================                         |  73%
  |                                                                                                
  |==================================================================                        |  73%
  |                                                                                                
  |==================================================================                        |  74%
  |                                                                                                
  |===================================================================                       |  74%
  |                                                                                                
  |===================================================================                       |  75%
  |                                                                                                
  |====================================================================                      |  75%
  |                                                                                                
  |====================================================================                      |  76%
  |                                                                                                
  |=====================================================================                     |  76%
  |                                                                                                
  |=====================================================================                     |  77%
  |                                                                                                
  |======================================================================                    |  77%
  |                                                                                                
  |======================================================================                    |  78%
  |                                                                                                
  |=======================================================================                   |  78%
  |                                                                                                
  |=======================================================================                   |  79%
  |                                                                                                
  |========================================================================                  |  79%
  |                                                                                                
  |========================================================================                  |  80%
  |                                                                                                
  |========================================================================                  |  81%
  |                                                                                                
  |=========================================================================                 |  81%
  |                                                                                                
  |=========================================================================                 |  82%
  |                                                                                                
  |==========================================================================                |  82%
  |                                                                                                
  |==========================================================================                |  83%
  |                                                                                                
  |===========================================================================               |  83%
  |                                                                                                
  |===========================================================================               |  84%
  |                                                                                                
  |============================================================================              |  84%
  |                                                                                                
  |============================================================================              |  85%
  |                                                                                                
  |=============================================================================             |  85%
  |                                                                                                
  |=============================================================================             |  86%
  |                                                                                                
  |==============================================================================            |  86%
  |                                                                                                
  |==============================================================================            |  87%
  |                                                                                                
  |===============================================================================           |  87%
  |                                                                                                
  |===============================================================================           |  88%
  |                                                                                                
  |================================================================================          |  88%
  |                                                                                                
  |================================================================================          |  89%
  |                                                                                                
  |=================================================================================         |  89%
  |                                                                                                
  |=================================================================================         |  90%
  |                                                                                                
  |=================================================================================         |  91%
  |                                                                                                
  |==================================================================================        |  91%
  |                                                                                                
  |==================================================================================        |  92%
  |                                                                                                
  |===================================================================================       |  92%
  |                                                                                                
  |===================================================================================       |  93%
  |                                                                                                
  |====================================================================================      |  93%
  |                                                                                                
  |====================================================================================      |  94%
  |                                                                                                
  |=====================================================================================     |  94%
  |                                                                                                
  |=====================================================================================     |  95%
  |                                                                                                
  |======================================================================================    |  95%
  |                                                                                                
  |======================================================================================    |  96%
  |                                                                                                
  |=======================================================================================   |  96%
  |                                                                                                
  |=======================================================================================   |  97%
  |                                                                                                
  |========================================================================================  |  97%
  |                                                                                                
  |========================================================================================  |  98%
  |                                                                                                
  |========================================================================================= |  98%
  |                                                                                                
  |========================================================================================= |  99%
  |                                                                                                
  |==========================================================================================|  99%
  |                                                                                                
  |==========================================================================================| 100%
#names(t_county)
t_combined_data <- t_county %>% 
  mutate(fips_code = parse_integer(GEOID))
t_combined_data_sub <- t_combined_data %>% 
  filter(STATEFP != "02") %>% 
  filter(STATEFP != "15") %>% 
  filter(STATEFP != "60") %>% 
  filter(STATEFP != "66") %>% 
  filter(STATEFP != "69") %>% 
  filter(STATEFP != "72") %>% 
  filter(STATEFP != "78")
religiondata1 <- religiondata %>% 
  mutate(fips= Geo_FIPS)
us_states <- t_combined_data_sub %>% 
  aggregate_map(by = "STATEFP")
Amer.nation <- t_combined_data_sub %>% 
  aggregate_map(by = "STATEFP")
t_combined_data_sub <- combined_data_sub %>% 
  mutate(redblue = Religiousperc - mean(religiondata$Religiousperc))
tm_shape(combined_data_sub, projection = 2163) + tm_polygons("redblue", palette = "-RdBu", border.col = "grey", border.alpha = .4) + 
  tm_shape(Amer.nation) + tm_borders(lwd = .50, col = "black", alpha = 1)

Differences between Spatial and Non-Spatial Data

Spatial data evulates the percent religious as a whole and its relationship between states but not in a precise and particular way as non-spatial. Non-spatial data is usually independent rather than multidemensional and auro correlated as spatial. Locational data as used for this analysis is assessed through spatial analysis rather than coverting location functions which have ecological fallacies due to other influenceing variables. Overall, by evaluating both spatial and non-spatial analysis for this assignment have advantages and disadvantages. Spatial data is simple but does not give a indepth analysis. When we combine both data analysis, we are able to evaluate total religious population percentage easily by location.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQojIyNNYXBwaW5nIHRoZSBwZXJjZW50IFJlbGlnaW91cyBpbiBBbWVyaWNhCgojIyNMb2FkaW5nIHBhY2thZ2VzCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzZikgCmxpYnJhcnkodG1hcCkgCmxpYnJhcnkodGlncmlzKSAgCmxpYnJhcnkoc3BkZXApCmxpYnJhcnkoZGF0YS53b3JsZCkKbGlicmFyeShyZWFkcikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0ZXhyZWcpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeSh0bWFwKQpsaWJyYXJ5KHRtYXB0b29scykKbGlicmFyeSh0aWR5cikKbGlicmFyeShaZWxpZykKbGlicmFyeSh2aXNyZWcpCmBgYAoKIyMjIyMjIyBUaGUgVW5pdGVkIFN0YXRlcyBoYXZlIG51bWJlciBvZiByZWxpZ2lvdXMgcG9wdWxhdGlvbnMvZ3JvdXBzLiBPdmVyYWxsIGl0IGlzIGZvdW5kIHRoYXQgODMlIG9mIEFtZXJpY2FucyBhcmUgQ2hyaXN0aWFuLCAxMyUgaGF2ZSBubyByZWxpZ2lvbiBhbmQgNCUgb2YgcG9wdWxhdGlvbiBpbmNsdWRlIEJ1ZGRoaXN0cywgTXVzbGltcyBhbmQgSmV3cywgZXRjLiBUaGlzIGFzc2lnbm1lbnQgd2lsbCBleHBsb3JlIHRvdGFsIHJlbGlnaW91cyBncm91cHMgaW4gVS5TIGJ5IHN0YXRlIGFuZCBjb3VudHkuIFRoZSBkYXRhLCBSZWxpZ2lvbiAyMDEwLCBpcyBvYnRhaW5lZCBmcm9tIHNvY2lhbCBleHBsb3JlciBnaXZlcyB0b3RhbCBwb3B1bGF0aW9uLCBhbGwgcmVsaWdpb25zIHBvcHVsYXRpb24gcGVyIGNvdW50eSBhbmQgc3RhdGUgYXMgd2VsbCBhcyB0aGUgdG90YWwgcGVyY2VudCByZWxpZ2lvdXMgaW4gZWFjaCBhcmVhLiBJdCBpcyBpbnRlcmVzdGluZyB0byBjb21wYXJlIHRoZSBwZXJjZW50IHJlbGlnaW91cyBpbiBkaWZmZXJlbnQgc3RhdGVzIGFzIHdlbGwgYXMgY291bnRpZXMgaW4gQW1lcmljYS4gClRoZSBkYXRhc2V0IGlzIHVzZWQgdG8gYW5hbHl6ZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHRvdGFsIHJlbGlnaW91cyBwb3B1bGF0aW9ucyBhY3Jvc3MgdGhlIGNvdW50cnkuIFRoZSBkYXRhIGlzIGRlcml2ZWQgYnkgY291bnRpZXMsIHN0YXRlcyB3aGljaCBpcyBjYXRlZ29yaXhlZCBpbiBhIG51bWVyaWNhbCBmb3JtIGxhdGVyIGluIHRoZSBzdHVkeS4gVGhlIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBhbmFseXNpcyBhcmUgU1RBVEVGUCB3aGljaCBpZGVudGlmaWVzIGVhY2ggc3RhdGUsIENvdW50eSB3aGljaCBnaXZlcyBuYW1lcyBvZiBlYWNoIGNvdW50eSBieSBzdGF0ZXMsIGFuZCBSZWxpZ2lvdXNwZXJjIHdoaWNoIGlzIHRoZSBwZXJjZW50YWdlIG9mIHBvcHVsYXRpb24gZm9yIGFsbCByZWxpZ2lvbiBwb3B1bGF0aW9ucyBpbiB0aGUgdG90YWwgcG9wdWxhdGlvbi4gSW4gb3RoZXIgd29yZHMsIGl0IGlzIHRoZSBwZXJjZW50YWdlIG9mIHRvdGFsIHJlbGlnaW91cyBwb3B1bGF0aW9uIGJ5IGxvY2F0aW9uLgoKVGhpcyBhbmFseXNpcyB3aWxsIHZpc3VhbGl6ZSBvdXIgZGF0YSBvbiB0aGUgcGVyY2VudCBvZiByZWxpZ2lvdXMgcG9wdWxhdGlvbiB0aHJvdWdoIHR3byBkaWZmZXJlbnQgbWV0aG9kcy4gVGhlIGZpcnN0IG1ldGhvZCBpcyBhIG5vbi1zcGF0aWFsIHJlZ3Jlc3Npb24gYW5kIGdncGxvdCB3aGljaCB3aWxsIHNob3cgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHN0YXRlcyBhbmQgcGVyY2VudCByZWxpZ2lvdXMuIFRoZSBzZWNvbmQgbWV0aG9kIGlzIHRocm91Z2ggYSBzcGF0aWFsIHZpc3VhbGl6YXRpb24gb2YgcGVyY2VudCBvZiByZWxnaWlvdXMgYW1vbmcgYWxsIGNvdW50aWVzIGFuZCBzdGF0ZXMsIGFuZCB0aGUgMTEgbmF0aW9ucyBvZiBBbWVyaWNhLgoKIyMjTG9hZGluZyBkYXRhCmBgYHtyfQpyZWxpZ2lvbmRhdGEgPC0gcmVhZF9jc3YoIi9Vc2Vycy9EZWVwYWtpZS9Eb2N1bWVudHMvUXVlZW5zIENvbGxlZ2UvU09DNzEyL0RhdGEvUmVnbGlvbmRhdGEuY3N2IikKI2hlYWQocmVsaWdpb25kYXRhKQpgYGAKCmBgYHtyfQpyZWxpZ2lvbmRhdGEgPC0gcmVsaWdpb25kYXRhJT4lCiAgc2VsZWN0KEdlb19GSVBTLEdlb19OYW1lLCBHZW9fU1RBVEUsUkNNUzEwX1QwMDFfMDAxLFJDTVMxMF9OVjAwOV8wMDEpJT4lCiAgcmVuYW1lKENvdW50eSA9IEdlb19OYW1lLAogICAgICAgICBTdGF0ZUZQID0gR2VvX1NUQVRFLAogICAgICAgICBUb3RhbHBvcCA9IFJDTVMxMF9UMDAxXzAwMSwKICAgICAgICAgUmVsaWdpb3VzcGVyYyA9IFJDTVMxMF9OVjAwOV8wMDEpCmBgYAoKYGBge3J9CmhlYWQocmVsaWdpb25kYXRhKQpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CkFtZXIubmF0aW9uIDwtIHJlYWRfY3N2KCIvVXNlcnMvRGVlcGFraWUvRG9jdW1lbnRzL1F1ZWVucyBDb2xsZWdlL1NPQzcxMi9EYXRhL0FtZXJpY2FuIE5hdGlvbnMuY3N2IikKI2hlYWQoQW1lci5uYXRpb24pCmBgYCAgIAoKCmBgYHtyfQpjdF9tYXAgPC0gc3RfcmVhZCgiL1VzZXJzL0RlZXBha2llL0RvY3VtZW50cy9RdWVlbnMgQ29sbGVnZS9TT0M3MTIvRGF0YS90bF8yMDE2X3VzX2NvdW50eS90bF8yMDE2X3VzX2NvdW50eS5zaHAiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmBgYAoKYGBge3J9CiNuYW1lcyhjdF9tYXApCmBgYAoKYGBge3J9CnJlbGlnaW9uZGF0YSRHZW9fRklQUyA8LSBhcy5pbnRlZ2VyKHJlbGlnaW9uZGF0YSRHZW9fRklQUykKY3RfbWFwJEdFT0lEIDwtIGFzLmludGVnZXIoY3RfbWFwJEdFT0lEKQpgYGAKCiMjI05vbi1TcGF0aWFsIFJlZ3Jlc3Npb24gCk5vbi1zcGF0aWFsIGRhdGEgZ2l2ZXMgYSBzdGF0aXN0aWNhbCBjb3JyZWxhdGlvbiB0aGF0IGlzIHNlcGVyYXRlIG9mIGFsbCBzcGF0aWFsIGV4YW1pbmF0aW9ucy4gV2Ugd2lsbCB1c2UgYSAgRWNvbG9naWNhbCByZWdyZXNzaW9ucyBhbmQgZ2dwbG90cyBpbiB0aGlzIHNlY3Rpb24uVGhlIGVjb2xvZ2ljYWwgcmVncmVzc2lvbiBwcm9kdWNlZCBmb3IgdGhpcyBhbmFseXNpcyBpcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdG90YWwgcG9wdWxhdGlvbiBhbmQgJSBwb3B1bGF0aW9uIHJlbGlnaW91cy4gVGhlIGVjb2xvZ2ljYWwgcmVncmVzc2lvbiwgc2hvd24gYmVsb3cgZ2l2ZSB0aGUgbWVhbiBvZiBhbGwgcmVsaWdpb3VzIHBvcHVsYXRpb24gYW5kIHRvdGFsIHBvcHVsYXRpb24gb2YgZWFjaCBzdGF0ZS4gIAoKYGBge3J9CnJlbGlnaW9uZGF0YV9lcjwtIHJlbGlnaW9uZGF0YSAlPiUgCiAgZ3JvdXBfYnkoU3RhdGVGUCkgJT4lIAogIHN1bW1hcmlzZShtZWFuX3AgPSBtZWFuKFJlbGlnaW91c3BlcmMsIG5hLnJtID0gVFJVRSksIG1lYW5fcyA9IG1lYW4oVG90YWxwb3AsIG5hLnJtID0gVFJVRSkpCgplY28gPC0gbG0obWVhbl9wIH4gbWVhbl9zLCBkYXRhID0gcmVsaWdpb25kYXRhX2VyKQpzdW1tYXJ5KGVjbykKYGBgCiMjIyMjR0dQTE9UCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IHJlbGlnaW9uZGF0YSwgYWVzKHggPSBTdGF0ZUZQLCB5ID0gUmVsaWdpb3VzcGVyYykpICsKICAgIGdlb21fcG9pbnQoKSArCiAgY29vcmRfY2FwcGVkX2NhcnQoYm90dG9tPSdib3RoJywgbGVmdD0nbm9uZScpICsKICB0aGVtZV9saWdodCgpICsgdGhlbWUocGFuZWwuYm9yZGVyPWVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKCkpCmBgYApUaGUgcGxvdCAgc2hvd3MgdGhlIHBlcmNlbnQgb2YgdG90YWwgcmVsaWdpb3VzIHBvcHVsYXRpb24gcGVyIGVhY2ggc3RhdGVzLiBUaGUgcGxvdCBpcyBoYXJkIHRvIHJlYWQgYW5kIGNvbmZ1c2luZyB0byB1bmRlcnN0YW5kIHNvIHdlIHdpbGwgbm93IGxvb2sgYXQgdGhpcyBhbmFseXNpcyBieSBhIFNwYXRpYWwgbWFwcGluZy4gIAoKIyMjU3BhdGlhbCBNYXBwaW5nCiMjI01lcmdpbmcgZGF0YQpgYGB7cn0KcmVsaWdpb25kYXRhIDwtIHJlbGlnaW9uZGF0YSAlPiUgCiAgbXV0YXRlKGZpcHMgPSBhcy5pbnRlZ2VyKEdlb19GSVBTKSkKY3RfbWFwIDwtIGN0X21hcCAlPiUgCiAgbXV0YXRlKGZpcHMgPSBwYXJzZV9pbnRlZ2VyKEdFT0lEKSkKY29tYmluZWRfZGF0YSA8LSBjdF9tYXAgJT4lIAogIGxlZnRfam9pbihyZWxpZ2lvbmRhdGEsIGJ5ID0gImZpcHMiKQpgYGAKCiMjI01hcHBpbmcKYGBge3J9CmxpYnJhcnkodG1hcCkKdG1fc2hhcGUoY29tYmluZWRfZGF0YSkgKyB0bV9wb2x5Z29ucygiUmVsaWdpb3VzcGVyYyIpCmBgYAoKIyMjRXhjbHVkaW5nIEFsYXNrYSBhbmQgSGF3YWlpCmBgYHtyfQpjb21iaW5lZF9kYXRhX3N1YiA8LSBjb21iaW5lZF9kYXRhICU+JSAKICBmaWx0ZXIoU1RBVEVGUCAhPSAiMDIiKSAlPiUgCiAgZmlsdGVyKFNUQVRFRlAgIT0gIjE1IikgJT4lIAogIGZpbHRlcihTVEFURUZQICE9ICI2MCIpICU+JSAKICBmaWx0ZXIoU1RBVEVGUCAhPSAiNjYiKSAlPiUgCiAgZmlsdGVyKFNUQVRFRlAgIT0gIjY5IikgJT4lIAogIGZpbHRlcihTVEFURUZQICE9ICI3MiIpICU+JSAKICBmaWx0ZXIoU1RBVEVGUCAhPSAiNzgiKQpgYGAKCmBgYHtyfQp0bV9zaGFwZShjb21iaW5lZF9kYXRhX3N1YiwgcHJvamVjdGlvbiA9IDIxNjMpICsgdG1fcG9seWdvbnMoIlJlbGlnaW91c3BlcmMiKQpgYGAKIyNNZWFuIG9mIFJlbGlnaW91cyBQb3B1bGF0aW9uCmBgYHtyfQpjb21iaW5lZF9kYXRhX3N1YiA8LSBjb21iaW5lZF9kYXRhX3N1YiAlPiUgCiAgbXV0YXRlKHJlZGJsdWUgPSBSZWxpZ2lvdXNwZXJjIC0gNTEuNDEpCmBgYAojIyMjIyMjIFRoZSBtZWFuIG9mICJyZWxpZ2lvdXNwZXJjIiBpbiB0aGlzIGRhdGFzZXQgaGVscCB1cyBkaWZmZXJlbnRpYXRlIHRoZSBzdGF0ZXMgcGVyY2VudGFnZSBvZiByZWxpZ2lvdXMgcG9wdWxhdGlvbiB0byBvYnNlcnZlIGRpZmZlcmVuY2VzIGJldHdlZW4gc3RhdGVzIGluIGEgY2xlYXJlciB3YXkuIFRoZSBtZWFuIGFsc28gaGVscHMgYXZvaWRlIGV4dHJhcG9sYXRpb24sIGluIHRoaXMgY2FzZSB0aGUgbWVhbiBpcyA1MS40MS4KCmBgYHtyfQp0bV9zaGFwZShjb21iaW5lZF9kYXRhX3N1YiwgcHJvamVjdGlvbiA9IDIxNjMpICsgdG1fcG9seWdvbnMoInJlZGJsdWUiLCBwYWxldHRlID0gIi1SZEJ1IikKYGBgCgojIyNIaWdobGlnaHRpbmcgU3RhdGUgbGluZXMKYGBge3J9CnVzX3N0YXRlcyA8LSBjb21iaW5lZF9kYXRhX3N1YiAlPiUgCiAgYWdncmVnYXRlX21hcChieSA9ICJTVEFURUZQIikKYGBgCgpgYGB7cn0KdG1fc2hhcGUoY29tYmluZWRfZGF0YV9zdWIsIHByb2plY3Rpb24gPSAyMTYzKSArIHRtX3BvbHlnb25zKCJyZWRibHVlIiwgcGFsZXR0ZSA9ICItUmRCdSIpICsgCiAgdG1fc2hhcGUodXNfc3RhdGVzKSArIHRtX2JvcmRlcnMobHdkID0gLjM2LCBjb2wgPSAiYmxhY2siLCBhbHBoYSA9IDEpCmBgYAoKYGBge3J9CnRtX3NoYXBlKGNvbWJpbmVkX2RhdGFfc3ViLCBwcm9qZWN0aW9uID0gMjE2MykgKyB0bV9wb2x5Z29ucygicmVkYmx1ZSIsIHBhbGV0dGUgPSAiLVJkQnUiLCBib3JkZXIuY29sID0gImdyZXkiLCBib3JkZXIuYWxwaGEgPSAuNCkgKyAKICB0bV9zaGFwZSh1c19zdGF0ZXMpICsgdG1fYm9yZGVycyhsd2QgPSAuMzYsIGNvbCA9ICJibGFjayIsIGFscGhhID0gMSkKYGBgCgoKIyMjIyMjIyNUaGlzIGdpdmVzIGEgc3BhdGlhbCB2aXN1YWxpemF0aW9uIGJ5IGhpZ2hsaWdodGluZyB0aGUgc3RhdGUgbGluZXMgdG8gdW5kZXJzdGFuZCB0aGUgdG90YWwgcGVyY2VudCByZWdsaWdpb3VzIGluIHRoZSBjb3VudHJ5IGFtb25nIGRpZmZlcmVudCBzdGF0ZXMgYW5kIGNvdW50aWVzLiBGcm9tIHRoZSBtYXAgYWJvdmUsIHRoZSBtb3N0IHJlbGlnaW91cyBhcmVhcyBhcmUgaW4gc2NhdHRlcmVkIGFjcm9zcyB0aGUgbmF0aW9uIGJ1dCB3ZSBjYW4gaWRlbnRpZnkgbGFyZ2UgcmVsaWdpb3VzIHRvdGFsIHBlcmNlbnRhZ2VzIGluIHRoZSBtaWRub3J0aChOb3J0aCBEYWtvdGEsU291dGggRGFrb3RhLE1pbm5lc290YSksIG1pZHNvdXRoKFRleGFzLCBMb3Vpc2lhbmEsT2tsYWhvbWEpIGFuZCBhIGxpdHRsZSBiaXQgaW4gbWlkd2VzdChtb3N0bHkgYmVpbmcgaW4gVXRhaCkuIFRoZSBtYXAgaWRlbnRpZmllcyBieSB0b3RhbCByZWxpZ2lvdXMgcGVyY2VudGFnZSB3aXRoIHJhbmdlcyBmcm9tIC01MCB0byAwLCBpbmRpY2lhdGluZyBubyByZWxnaWlvdXMgcG9wdWxhdGlvbnMsIDAtIDUwIGluZGljYXRpbmcgcmVsaWdpb3VzIHBvcHVsYXRpb24gYmVpbmcgYmV0d2VlbiAwIC01MCUsIDUwIHRvIDEwMCUgZ2l2aW5nIHVzIGhpZ2hlciB0b3RhbCByZWxpZ2lvdXMgcGVyY2VudGFnZXMgYW5kIHNvIG9uLiAKCiMjIyNUaGUgQW1lcmljYW4gTmF0aW9ucwpUaGUgQW1lcmljYW4gTmF0aW9uOiBBIEhpc3Rvcnkgb2YgdGhlIFVuaXRlZCBTdGF0ZXMsIHdyaXR0ZW4gYnkgTWFyayBDYXJuZXMgYW5kIEpvaG4gR2FycmF0eS4gVGhlIGF1dGhvcnMgcmVwcmVzZW50IHRoZSBwb2xpdGljYWwgaGlzdG9yeSBvZiB0aGUgVW5pdGVkIFN0YXRlcyB0aWVkIHdpdGggaXRzIHNvY2lhbCwgZWNvbm9taWMgYW5kIGN1bHR1cmFsIGRldmVsb3BtZW50LiBVc2luZyB0aGUgbWFwcGluZyBmaWxlIG9mIHRoZSBBbWVyaWNhbiBOYXRpb25zLCB0aGlzIHNwYXRpYWwgYW5hbHlzaXMsIHNob3dzIGNvdW50eSBsZXZlbCBwZXJjZW50cyBvZiByZWxpZ2lvdXMgcG9wdWxhdGlvbiBhbW9uZyB0aGUgMTEgbmF0aW9ucyB3aXRoaW4gQW1lcmljYS4KCmBgYHtyfQpBbWVyLm5hdGlvbiA8LSBjb21iaW5lZF9kYXRhX3N1YiAlPiUgCiAgYWdncmVnYXRlX21hcChieSA9ICJTVEFURUZQIikKYGBgCgpgYGB7cn0KdG1fc2hhcGUoY29tYmluZWRfZGF0YV9zdWIsIHByb2plY3Rpb24gPSAyMTYzKSArIHRtX3BvbHlnb25zKCJyZWRibHVlIiwgcGFsZXR0ZSA9ICItUmRCdSIpICsgCiAgdG1fc2hhcGUoQW1lci5uYXRpb24pICsgdG1fYm9yZGVycyhsd2QgPSAuMzYsIGNvbCA9ICJibGFjayIsIGFscGhhID0gMSkKYGBgCgojIyNNYWtpbmcgdGhlIGJvdWRhcnkgbGluZXMgY2xlYXJlcgpgYGB7cn0KdG1fc2hhcGUoY29tYmluZWRfZGF0YV9zdWIsIHByb2plY3Rpb24gPSAyMTYzKSArIHRtX3BvbHlnb25zKCJyZWRibHVlIiwgcGFsZXR0ZSA9ICItUmRCdSIsIGJvcmRlci5jb2wgPSAiZ3JleSIsIGJvcmRlci5hbHBoYSA9IC40KSArIAogIHRtX3NoYXBlKEFtZXIubmF0aW9uKSArIHRtX2JvcmRlcnMobHdkID0gLjUwLCBjb2wgPSAiYmxhY2siLCBhbHBoYSA9IDEpCmBgYAoKIyMjVGlncmlzCiMjIyMjIyMjIFRoZSBUaWdyaXMgcGFja2FnZSBtYWtlcyBjcmVhdGluZyBzcGF0aWFsIG1hcHBpbmcgZWFzaWVyIGFuZCBzbW9vdGhlciB0byBhcHBseSBmb3IgdGhlIGFuYWx5c2lzIGFzIG1hbnkgZnVuY3Rpb25zIGhhdmUgYSBwYXJhbWV0ZXIsQ0IuIE9uIHNsaWRlIDMyIG9mIFByb2Zlc3NvcidzIHNsaWRlcywgd2UgY29kZWQgY291bnRpZXMoQ0IgPSBUUlVFKS4KSWYgQ0YgaXMgc2V0IHRvIFRSVUUsIGl0IHdpbGwgZGlyZWN0IHRpZ3JpcyB0byBsb2FkIGEgY2FydG9ncmFwaGljIGJvdW5kcnkgZmlsZS4gQ2FydG9ncmFwaGljIGJvdW5kcnkgZmlsZXMgZGVmYXVsdCB0byBhIHNpbXBsaWZpZWQgcmVzb3VsdGlvbiBvZiAxOjUwMGsuIEluIHNvbWUgY2FzZXMgc3VjaCBhcyBzdGF0ZXMsIHJlc29sdXRpb25zIG9mIDEuNSBtaWxsaW9uIGFuZCAxOjIwIG1pbGxpb24gYXJlIGF2YWlsYWJsZS4gRm9yIGV4YW1wbGUsIFIgc3BlY2lmeSB0aGUgZm9sbG93aW5nIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHN0YXRlcygpIGZ1bmN0aW9uIGFuZCByZXRyaWV2ZXMgYSBzaW1wbGlmaWVkIGRhdGFzZXQuIEluIG90aGVyIHdvcmRzIHdoZW4gQ0IgaXMgc2V0IHRvIEZBTFNFLCB3ZSBnZXQgYSBkZXRhaWxlZCBUSUdFUi9saW5lIGZpbGUuIFdoZW4gaXQgaXMgc2V0IHRvIFRSVUUsIHRoZSBmaWxlIGlzIGdlbmVyYWxpemVkIHRvICgxOjUwMEspLiAKCmBgYHtyfQpvcHRpb25zKHRpZ3Jpc19jbGFzcyA9ICJzZiIpCnRfY291bnR5IDwtIGNvdW50aWVzKGNiID0gVFJVRSkKI25hbWVzKHRfY291bnR5KQpgYGAKCmBgYHtyfQp0X2NvbWJpbmVkX2RhdGEgPC0gdF9jb3VudHkgJT4lIAogIG11dGF0ZShmaXBzX2NvZGUgPSBwYXJzZV9pbnRlZ2VyKEdFT0lEKSkKYGBgCgpgYGB7cn0KdF9jb21iaW5lZF9kYXRhX3N1YiA8LSB0X2NvbWJpbmVkX2RhdGEgJT4lIAogIGZpbHRlcihTVEFURUZQICE9ICIwMiIpICU+JSAKICBmaWx0ZXIoU1RBVEVGUCAhPSAiMTUiKSAlPiUgCiAgZmlsdGVyKFNUQVRFRlAgIT0gIjYwIikgJT4lIAogIGZpbHRlcihTVEFURUZQICE9ICI2NiIpICU+JSAKICBmaWx0ZXIoU1RBVEVGUCAhPSAiNjkiKSAlPiUgCiAgZmlsdGVyKFNUQVRFRlAgIT0gIjcyIikgJT4lIAogIGZpbHRlcihTVEFURUZQICE9ICI3OCIpCmBgYAoKYGBge3J9CnJlbGlnaW9uZGF0YTEgPC0gcmVsaWdpb25kYXRhICU+JSAKICBtdXRhdGUoZmlwcz0gR2VvX0ZJUFMpCmBgYAoKYGBge3J9CnVzX3N0YXRlcyA8LSB0X2NvbWJpbmVkX2RhdGFfc3ViICU+JSAKICBhZ2dyZWdhdGVfbWFwKGJ5ID0gIlNUQVRFRlAiKQpBbWVyLm5hdGlvbiA8LSB0X2NvbWJpbmVkX2RhdGFfc3ViICU+JSAKICBhZ2dyZWdhdGVfbWFwKGJ5ID0gIlNUQVRFRlAiKQp0X2NvbWJpbmVkX2RhdGFfc3ViIDwtIGNvbWJpbmVkX2RhdGFfc3ViICU+JSAKICBtdXRhdGUocmVkYmx1ZSA9IFJlbGlnaW91c3BlcmMgLSBtZWFuKHJlbGlnaW9uZGF0YSRSZWxpZ2lvdXNwZXJjKSkKYGBgCgpgYGB7cn0KdG1fc2hhcGUoY29tYmluZWRfZGF0YV9zdWIsIHByb2plY3Rpb24gPSAyMTYzKSArIHRtX3BvbHlnb25zKCJyZWRibHVlIiwgcGFsZXR0ZSA9ICItUmRCdSIsIGJvcmRlci5jb2wgPSAiZ3JleSIsIGJvcmRlci5hbHBoYSA9IC40KSArIAogIHRtX3NoYXBlKEFtZXIubmF0aW9uKSArIHRtX2JvcmRlcnMobHdkID0gLjUwLCBjb2wgPSAiYmxhY2siLCBhbHBoYSA9IDEpCmBgYAoKCgoKCgoKCgotLS0tLQpgYGB7cn0Kb3B0aW9ucyh0aWdyaXNfY2xhc3MgPSAic2YiKQp0X2NvdW50eSA8LSBjb3VudGllcyhjYiA9IEZBTFNFKQojbmFtZXModF9jb3VudHkpCmBgYAoKYGBge3J9CnRfY29tYmluZWRfZGF0YSA8LSB0X2NvdW50eSAlPiUgCiAgbXV0YXRlKGZpcHNfY29kZSA9IHBhcnNlX2ludGVnZXIoR0VPSUQpKQpgYGAKCmBgYHtyfQp0X2NvbWJpbmVkX2RhdGFfc3ViIDwtIHRfY29tYmluZWRfZGF0YSAlPiUgCiAgZmlsdGVyKFNUQVRFRlAgIT0gIjAyIikgJT4lIAogIGZpbHRlcihTVEFURUZQICE9ICIxNSIpICU+JSAKICBmaWx0ZXIoU1RBVEVGUCAhPSAiNjAiKSAlPiUgCiAgZmlsdGVyKFNUQVRFRlAgIT0gIjY2IikgJT4lIAogIGZpbHRlcihTVEFURUZQICE9ICI2OSIpICU+JSAKICBmaWx0ZXIoU1RBVEVGUCAhPSAiNzIiKSAlPiUgCiAgZmlsdGVyKFNUQVRFRlAgIT0gIjc4IikKYGBgCgpgYGB7cn0KcmVsaWdpb25kYXRhMSA8LSByZWxpZ2lvbmRhdGEgJT4lIAogIG11dGF0ZShmaXBzPSBHZW9fRklQUykKYGBgCgpgYGB7cn0KdXNfc3RhdGVzIDwtIHRfY29tYmluZWRfZGF0YV9zdWIgJT4lIAogIGFnZ3JlZ2F0ZV9tYXAoYnkgPSAiU1RBVEVGUCIpCkFtZXIubmF0aW9uIDwtIHRfY29tYmluZWRfZGF0YV9zdWIgJT4lIAogIGFnZ3JlZ2F0ZV9tYXAoYnkgPSAiU1RBVEVGUCIpCnRfY29tYmluZWRfZGF0YV9zdWIgPC0gY29tYmluZWRfZGF0YV9zdWIgJT4lIAogIG11dGF0ZShyZWRibHVlID0gUmVsaWdpb3VzcGVyYyAtIG1lYW4ocmVsaWdpb25kYXRhJFJlbGlnaW91c3BlcmMpKQpgYGAKCmBgYHtyfQp0bV9zaGFwZShjb21iaW5lZF9kYXRhX3N1YiwgcHJvamVjdGlvbiA9IDIxNjMpICsgdG1fcG9seWdvbnMoInJlZGJsdWUiLCBwYWxldHRlID0gIi1SZEJ1IiwgYm9yZGVyLmNvbCA9ICJncmV5IiwgYm9yZGVyLmFscGhhID0gLjQpICsgCiAgdG1fc2hhcGUoQW1lci5uYXRpb24pICsgdG1fYm9yZGVycyhsd2QgPSAuNTAsIGNvbCA9ICJibGFjayIsIGFscGhhID0gMSkKYGBgCgojIyNEaWZmZXJlbmNlcyBiZXR3ZWVuIFNwYXRpYWwgYW5kIE5vbi1TcGF0aWFsIERhdGEKU3BhdGlhbCBkYXRhIGV2dWxhdGVzIHRoZSBwZXJjZW50IHJlbGlnaW91cyBhcyBhIHdob2xlIGFuZCBpdHMgcmVsYXRpb25zaGlwIGJldHdlZW4gc3RhdGVzIGJ1dCBub3QgaW4gYSBwcmVjaXNlIGFuZCBwYXJ0aWN1bGFyIHdheSBhcyBub24tc3BhdGlhbC4gTm9uLXNwYXRpYWwgZGF0YSBpcyB1c3VhbGx5IGluZGVwZW5kZW50IHJhdGhlciB0aGFuIG11bHRpZGVtZW5zaW9uYWwgYW5kIGF1cm8gY29ycmVsYXRlZCBhcyBzcGF0aWFsLiBMb2NhdGlvbmFsIGRhdGEgYXMgdXNlZCBmb3IgdGhpcyBhbmFseXNpcyBpcyBhc3Nlc3NlZCB0aHJvdWdoIHNwYXRpYWwgYW5hbHlzaXMgcmF0aGVyIHRoYW4gY292ZXJ0aW5nIGxvY2F0aW9uIGZ1bmN0aW9ucyB3aGljaCBoYXZlIGVjb2xvZ2ljYWwgZmFsbGFjaWVzIGR1ZSB0byBvdGhlciBpbmZsdWVuY2VpbmcgdmFyaWFibGVzLiBPdmVyYWxsLCBieSBldmFsdWF0aW5nIGJvdGggc3BhdGlhbCBhbmQgbm9uLXNwYXRpYWwgYW5hbHlzaXMgZm9yIHRoaXMgYXNzaWdubWVudCBoYXZlIGFkdmFudGFnZXMgYW5kIGRpc2FkdmFudGFnZXMuIFNwYXRpYWwgZGF0YSBpcyBzaW1wbGUgYnV0IGRvZXMgbm90IGdpdmUgYSBpbmRlcHRoIGFuYWx5c2lzLiBXaGVuIHdlIGNvbWJpbmUgYm90aCBkYXRhIGFuYWx5c2lzLCB3ZSBhcmUgYWJsZSB0byBldmFsdWF0ZSB0b3RhbCByZWxpZ2lvdXMgcG9wdWxhdGlvbiBwZXJjZW50YWdlIGVhc2lseSBieSBsb2NhdGlvbi4K