1 Introduction to the data

The analysis of impact of average annual income on life expectancy as seen globally in 2015, the single data of merged longitudinal and categorical (named LifeExp_Clean) data that was cleaned as part of “The Race to Immortality: An analysis of variables impacting average life expectancy” will be utilized. This overall merged data frame includes the following information for each country:

  • Average Life Expectancy
  • Average Annual Income
  • Annual Country Population Data
  • Country Region Data
life.raw <- read.xlsx("https://nlepera.github.io/sta553/w05_ggplot/LifeExp_Clean.xlsx")
str(life.raw)
'data.frame':   37590 obs. of  6 variables:
 $ Country   : chr  "Afghanistan" "Albania" "Algeria" "Angola" ...
 $ Year      : chr  "X1800" "X1800" "X1800" "X1800" ...
 $ Life_Exp  : num  28.2 35.4 28.8 27 33.5 33.2 34 34 34.4 29.2 ...
 $ Income    : num  603 667 715 618 757 1510 514 814 1850 775 ...
 $ Population: num  3280000 410000 2500000 1570000 37000 534000 413000 351000 3210000 880000 ...
 $ Continent : chr  "Asia" "Europe" "Africa" "Africa" ...
DT::datatable(life.raw, fillContainer = FALSE, options = list(pageLength = 10))




2 Pruning the Data for Visualization Purposes

In order to properly visualize data of this scale a subset for the year 2015 was taken (named data2015)

data2015 <- filter(life.raw, Year == "X2015")
str(data2015)
'data.frame':   174 obs. of  6 variables:
 $ Country   : chr  "Afghanistan" "Albania" "Algeria" "Andorra" ...
 $ Year      : chr  "X2015" "X2015" "X2015" "X2015" ...
 $ Life_Exp  : num  57.9 77.6 77.3 82.5 64 77.2 76.5 75.4 82.6 81.4 ...
 $ Income    : num  1750 11000 13700 46600 6230 20100 19100 8180 43800 44100 ...
 $ Population: num  33700000 2920000 39900000 78000 27900000 99900 43400000 2920000 23800000 8680000 ...
 $ Continent : chr  "Asia" "Europe" "Africa" "Europe" ...
DT::datatable(data2015, fillContainer = FALSE, options = list(pageLength = 10))




3 Plotting the Data

3.1 2015 Data

The Prepared and Pruned data as found in data2015 is plotted below. Due to the presence of 174 countries, color coding is on the continent level to allow for ease of visibility and differentiation.

plot_ly(
    data = data2015,
    x = ~Income,  
    y = ~Life_Exp,
    size = ~Population,
    color = ~factor(Continent),
    colors = c('#332288','#117733', '#0072B2', '#D55E00', '#882255'),
    text = ~paste("Continent: ", Continent,
                   "<br>Country: ", Country,
                   "<br>Population: ", Population), 
     hovertemplate = paste('<i><b>Life Expectancy<b></i>: %{y}',
                           '<br><b>Income</b>:  %{x}',
                           '<br><b>%{text}</b>'),
     alpha  = 0.8,
    marker = list(line=(list(color = "black"))),
     type = "scatter") %>% 
     layout(
      title = list(text="Impact of Income on Global Life Expectancy as Seen in 2015 <br> Controlled for both region (Continent) and population size (Population)", y = 1.2),
      xaxis = list(
        title = "Average Annual Income ($/year)",
        linecolor = "black"
      ),
      yaxis = list(
        title = "Average Life Expectancy (years)"
      ),
      legend = list(title = list(text="Continent"), y= 0.8, x = 1),
   annotations = list(  
                     x = 0.8,
                     y = 0.2, 
                  font = list(size = 12, color = "darkred"),   
                  text = "The point size is proportional to the country population size",   
                  xref = "paper",    
                  yref = "paper", 
               xanchor = "center", 
               yanchor = "bottom", 
             showarrow = FALSE))

The 2015 data shows similar trends as was seen in the 2000 data, with a positive correlation between average annual income and average life expectancy across all continents. Continents with a greater range of average incomes per person demonstrate a greater positive correlation between income and life expectancy.Population size is more difficult to observe with the above plot, but there appears to be a minor negative correlation for the Asia continent between both population size and life expectancy as well as population size and income per person. This correlation is identified by the clustering of larger sized points closer towards the bottom left of the plot (lower values for both income and life expectancy)

3.2 All Data over Time

plot_ly(
    data = life.raw,
    x = ~Income,  
    y = ~Life_Exp,
    size = ~Population,
    color = ~factor(Continent),
    colors = c('#332288','#117733', '#0072B2', '#D55E00', '#882255'),
    frame = ~Year,
    text = ~paste("Continent: ", Continent,
                   "<br>Country: ", Country,
                   "<br>Population: ", Population), 
     hovertemplate = paste('<i><b>Life Expectancy<b></i>: %{y}',
                           '<br><b>Income</b>:  %{x}',
                           '<br><b>%{text}</b>'),
     alpha  = 0.8,
    marker = list(line=(list(color = "black"))),
     type = "scatter") %>% 
     layout(
      title = list(text="Impact of Income on Global Life Expectancy for All Years <br> Controlled for both region (Continent) and population size (Population)", y = 1.2),
      xaxis = list(
        title = "Average Annual Income ($/year)"
      ),
      yaxis = list(
        title = "Average Life Expectancy (years)"
      ),
      legend = list(title = list(text="Continent"), y= 0.8, x = 1),
   annotations = list(  
                     x = 0.8,
                     y = 0.2, 
                  font = list(size = 12, color = "darkred"),   
                  text = "The point size is proportional to the country population size",   
                  xref = "paper",    
                  yref = "paper", 
               xanchor = "center", 
               yanchor = "bottom", 
             showarrow = FALSE))

In reviewing the Average Life Expectancy on a global scale to the Average Annual Income, the correlations seen in both the year 2000 and year 2015 analyses are not present throughout the entire range of years in which data is available. Until approximately 1950 there was significant increase in Average Life Expectancy globally, with little increase in Average Annual Income. Barring temporary Average Life Expectancy decreases that correspond to the years of both World Wars, Average Life Expectancy appears to be near independent from Average Annual Income. After 1950 the trends of positive correlation between Average Life Expectancy and Average Annual Income becomes more prevalent each year.


LS0tDQp0aXRsZTogIlRoZSBQcmljZSBvZiBMb25nZXZpdHk6IEFuIEFuYWx5c2lzIG9mIEFubnVhbCBJbmNvbWUgb24gTGlmZSBFeHBlY3RhbmN5PGJyPjxicj48aT5HbG9iYWwgRGF0YSBmb3IgMjAxNSB2cyBBbGwgWWVhcnM8L2k+Ig0KYXV0aG9yOiAiTmF0YWxpZSBMZVBlcmEiDQpkYXRlOiAiV2VzdCBDaGVzdGVyIFVuaXZlcnNpdHkgPGJyPlNUQSA1MDM6IERhdGEgVmlzdWFsaXphdGlvbiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KLS0tDQoNCmBgYHs9aHRtbH0NCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCmRpdiNUT0MgbGkgew0KICAgIGxpc3Qtc3R5bGU6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLWNvbG9yOmxpZ2h0Z3JheTsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQogICAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogICAgY29sb3I6ICM3ODBjMGM7DQp9DQoNCi8qIG1vdXNlIG92ZXIgbGluayAqLw0KZGl2I1RPQyBhOmhvdmVyIHsNCiAgY29sb3I6IHJlZDsNCn0NCg0KLyogdW52aXNpdGVkIGxpbmsgKi8NCmRpdiNUT0MgYTpsaW5rIHsNCiAgY29sb3I6IGJsdWU7DQp9DQoNCg0KDQpoMS50aXRsZSB7DQogIGZvbnQtc2l6ZTogMjRweDsNCiAgY29sb3I6IERhcmtibHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KICBmb250LXZhcmlhbnQtY2Fwczogbm9ybWFsOw0KfQ0KaDQuc3VidGl0bGUgew0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuYXV0aG9yIHsgDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmg0LmRhdGUgeyANCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7DQogICAgZm9udC1zaXplOiAyNHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgyIHsNCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMyB7IA0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQphOmxpbmsgew0KICBjb2xvcjogZ3JlZW47DQp9DQoNCi8qIHZpc2l0ZWQgbGluayAqLw0KYTp2aXNpdGVkIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiBtb3VzZSBvdmVyIGxpbmsgKi8NCmE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiBzZWxlY3RlZCBsaW5rICovDQphOmFjdGl2ZSB7DQogIGNvbG9yOiB5ZWxsb3c7DQp9DQoNCjwvc3R5bGU+DQpgYGANCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQpvcHRpb25zKHJlcG9zID0gbGlzdChDUkFOPSJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKSkNCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgiY293cGxvdCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjb3dwbG90IikNCiAgIGxpYnJhcnkoY293cGxvdCkNCn0NCmlmICghcmVxdWlyZSgibGF0ZXgyZXhwIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxhdGV4MmV4cCIpDQogICBsaWJyYXJ5KGxhdGV4MmV4cCkNCn0NCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogICBsaWJyYXJ5KHBsb3RseSkNCn0NCmlmICghcmVxdWlyZSgiZ2FwbWluZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQogICBsaWJyYXJ5KGdhcG1pbmRlcikNCn0NCmlmICghcmVxdWlyZSgicG5nIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJwbmciKSAgICAgICAgICAgICAjIEluc3RhbGwgcG5nIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJwbmciKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSQ3VybCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkN1cmwiKSAgICAgICAgICAgIyBJbnN0YWxsIFJDdXJsIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImNvbG91cnBpY2tlciIpDQp9DQppZiAoIXJlcXVpcmUoImdpZnNraSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIm1hZ2ljayIpDQp9DQppZiAoIXJlcXVpcmUoImdyRGV2aWNlcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JEZXZpY2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyRGV2aWNlcyIpDQp9DQojIyMgZ2dwbG90IGFuZCBleHRlbnNpb25zDQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dwbG90MiIpDQp9DQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dhbmltYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoImdncmlkZ2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3JpZGdlcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ3JpZGdlcyIpDQp9DQppZiAoIXJlcXVpcmUoImdyYXBoaWNzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJncmFwaGljcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJncmFwaGljcyIpDQp9DQppZiAoIXJlcXVpcmUoIm9wZW54bHN4IikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJvcGVueGxzeCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJvcGVueGxzeCIpDQp9DQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSkNCmBgYA0KXA0KDQojIEludHJvZHVjdGlvbiB0byB0aGUgZGF0YQ0KVGhlIGFuYWx5c2lzIG9mIGltcGFjdCBvZiBhdmVyYWdlIGFubnVhbCBpbmNvbWUgb24gbGlmZSBleHBlY3RhbmN5IGFzIHNlZW4gZ2xvYmFsbHkgaW4gMjAxNSwgdGhlIHNpbmdsZSBkYXRhIG9mIG1lcmdlZCBsb25naXR1ZGluYWwgYW5kIGNhdGVnb3JpY2FsIChuYW1lZCBMaWZlRXhwX0NsZWFuKSBkYXRhIHRoYXQgd2FzIGNsZWFuZWQgYXMgcGFydCBvZiA8YSBocmVmPSJodHRwczovL25sZXBlcmEuZ2l0aHViLmlvL3N0YTU1My93MDVfZ2dwbG90LyI+IlRoZSBSYWNlIHRvIEltbW9ydGFsaXR5OiBBbiBhbmFseXNpcyBvZiB2YXJpYWJsZXMgaW1wYWN0aW5nIGF2ZXJhZ2UgbGlmZSBleHBlY3RhbmN5IjwvYT4gd2lsbCBiZSB1dGlsaXplZC4gIFRoaXMgb3ZlcmFsbCBtZXJnZWQgZGF0YSBmcmFtZSBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIGZvciBlYWNoIGNvdW50cnk6DQoNCi0gICBBdmVyYWdlIExpZmUgRXhwZWN0YW5jeQ0KLSAgIEF2ZXJhZ2UgQW5udWFsIEluY29tZQ0KLSAgIEFubnVhbCBDb3VudHJ5IFBvcHVsYXRpb24gRGF0YQ0KLSAgIENvdW50cnkgUmVnaW9uIERhdGENCg0KYGBge3J9DQpsaWZlLnJhdyA8LSByZWFkLnhsc3goImh0dHBzOi8vbmxlcGVyYS5naXRodWIuaW8vc3RhNTUzL3cwNV9nZ3Bsb3QvTGlmZUV4cF9DbGVhbi54bHN4IikNCmBgYA0KDQpgYGB7ciBlY2hvID0gVFJVRX0NCnN0cihsaWZlLnJhdykNCmBgYA0KDQpgYGB7cn0NCkRUOjpkYXRhdGFibGUobGlmZS5yYXcsIGZpbGxDb250YWluZXIgPSBGQUxTRSwgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwKSkNCmBgYA0KPGJyPg0KPGJyPg0KPGJyPg0KDQojIFBydW5pbmcgdGhlIERhdGEgZm9yIFZpc3VhbGl6YXRpb24gUHVycG9zZXMNCkluIG9yZGVyIHRvIHByb3Blcmx5IHZpc3VhbGl6ZSBkYXRhIG9mIHRoaXMgc2NhbGUgYSBzdWJzZXQgZm9yIHRoZSB5ZWFyIDIwMTUgd2FzIHRha2VuIChuYW1lZCA8Zm9udCBjb2xvciA9ICJwdXJwbGUiPjxpPmRhdGEyMDE1PC9pPjwvZm9udD4pDQoNCmBgYHtyfQ0KZGF0YTIwMTUgPC0gZmlsdGVyKGxpZmUucmF3LCBZZWFyID09ICJYMjAxNSIpDQpgYGANCg0KYGBge3IgZWNobyA9IFRSVUV9DQpzdHIoZGF0YTIwMTUpDQpgYGANCg0KYGBge3J9DQpEVDo6ZGF0YXRhYmxlKGRhdGEyMDE1LCBmaWxsQ29udGFpbmVyID0gRkFMU0UsIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCkpDQpgYGANCjxicj4NCjxicj4NCjxicj4NCg0KIyBQbG90dGluZyB0aGUgRGF0YQ0KDQojIyAyMDE1IERhdGENClRoZSBQcmVwYXJlZCBhbmQgUHJ1bmVkIGRhdGEgYXMgZm91bmQgaW4gPGZvbnQgY29sb3IgPSAicHVycGxlIj48aT5kYXRhMjAxNTwvaT48L2ZvbnQ+IGlzIHBsb3R0ZWQgYmVsb3cuIER1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgMTc0IGNvdW50cmllcywgY29sb3IgY29kaW5nIGlzIG9uIHRoZSBjb250aW5lbnQgbGV2ZWwgdG8gYWxsb3cgZm9yIGVhc2Ugb2YgdmlzaWJpbGl0eSBhbmQgZGlmZmVyZW50aWF0aW9uLg0KDQpgYGB7cn0NCnBsb3RfbHkoDQogICAgZGF0YSA9IGRhdGEyMDE1LA0KICAgIHggPSB+SW5jb21lLCAgDQogICAgeSA9IH5MaWZlX0V4cCwNCiAgICBzaXplID0gflBvcHVsYXRpb24sDQogICAgY29sb3IgPSB+ZmFjdG9yKENvbnRpbmVudCksDQogICAgY29sb3JzID0gYygnIzMzMjI4OCcsJyMxMTc3MzMnLCAnIzAwNzJCMicsICcjRDU1RTAwJywgJyM4ODIyNTUnKSwNCiAgICB0ZXh0ID0gfnBhc3RlKCJDb250aW5lbnQ6ICIsIENvbnRpbmVudCwNCiAgICAgICAgICAgICAgICAgICAiPGJyPkNvdW50cnk6ICIsIENvdW50cnksDQogICAgICAgICAgICAgICAgICAgIjxicj5Qb3B1bGF0aW9uOiAiLCBQb3B1bGF0aW9uKSwgDQogICAgIGhvdmVydGVtcGxhdGUgPSBwYXN0ZSgnPGk+PGI+TGlmZSBFeHBlY3RhbmN5PGI+PC9pPjogJXt5fScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPjxiPkluY29tZTwvYj46ICAle3h9JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICc8YnI+PGI+JXt0ZXh0fTwvYj4nKSwNCiAgICAgYWxwaGEgID0gMC44LA0KICAgIG1hcmtlciA9IGxpc3QobGluZT0obGlzdChjb2xvciA9ICJibGFjayIpKSksDQogICAgIHR5cGUgPSAic2NhdHRlciIpICU+JSANCiAgICAgbGF5b3V0KA0KICAgICAgdGl0bGUgPSBsaXN0KHRleHQ9IkltcGFjdCBvZiBJbmNvbWUgb24gR2xvYmFsIExpZmUgRXhwZWN0YW5jeSBhcyBTZWVuIGluIDIwMTUgPGJyPiBDb250cm9sbGVkIGZvciBib3RoIHJlZ2lvbiAoQ29udGluZW50KSBhbmQgcG9wdWxhdGlvbiBzaXplIChQb3B1bGF0aW9uKSIsIHkgPSAxLjIpLA0KICAgICAgeGF4aXMgPSBsaXN0KA0KICAgICAgICB0aXRsZSA9ICJBdmVyYWdlIEFubnVhbCBJbmNvbWUgKCQveWVhcikiLA0KICAgICAgICBsaW5lY29sb3IgPSAiYmxhY2siDQogICAgICApLA0KICAgICAgeWF4aXMgPSBsaXN0KA0KICAgICAgICB0aXRsZSA9ICJBdmVyYWdlIExpZmUgRXhwZWN0YW5jeSAoeWVhcnMpIg0KICAgICAgKSwNCiAgICAgIGxlZ2VuZCA9IGxpc3QodGl0bGUgPSBsaXN0KHRleHQ9IkNvbnRpbmVudCIpLCB5PSAwLjgsIHggPSAxKSwNCiAgIGFubm90YXRpb25zID0gbGlzdCggIA0KICAgICAgICAgICAgICAgICAgICAgeCA9IDAuOCwNCiAgICAgICAgICAgICAgICAgICAgIHkgPSAwLjIsIA0KICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDEyLCBjb2xvciA9ICJkYXJrcmVkIiksICAgDQogICAgICAgICAgICAgICAgICB0ZXh0ID0gIlRoZSBwb2ludCBzaXplIGlzIHByb3BvcnRpb25hbCB0byB0aGUgY291bnRyeSBwb3B1bGF0aW9uIHNpemUiLCAgIA0KICAgICAgICAgICAgICAgICAgeHJlZiA9ICJwYXBlciIsICAgIA0KICAgICAgICAgICAgICAgICAgeXJlZiA9ICJwYXBlciIsIA0KICAgICAgICAgICAgICAgeGFuY2hvciA9ICJjZW50ZXIiLCANCiAgICAgICAgICAgICAgIHlhbmNob3IgPSAiYm90dG9tIiwgDQogICAgICAgICAgICAgc2hvd2Fycm93ID0gRkFMU0UpKQ0KICAgICAgDQpgYGANCg0KDQpUaGUgMjAxNSBkYXRhIHNob3dzIHNpbWlsYXIgdHJlbmRzIGFzIHdhcyBzZWVuIGluIHRoZSAyMDAwIGRhdGEsIHdpdGggYSBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGF2ZXJhZ2UgYW5udWFsIGluY29tZSBhbmQgYXZlcmFnZSBsaWZlIGV4cGVjdGFuY3kgYWNyb3NzIGFsbCBjb250aW5lbnRzLiBDb250aW5lbnRzIHdpdGggYSBncmVhdGVyIHJhbmdlIG9mIGF2ZXJhZ2UgaW5jb21lcyBwZXIgcGVyc29uIGRlbW9uc3RyYXRlIGEgZ3JlYXRlciBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGluY29tZSBhbmQgbGlmZSBleHBlY3RhbmN5LlBvcHVsYXRpb24gc2l6ZSBpcyBtb3JlIGRpZmZpY3VsdCB0byBvYnNlcnZlIHdpdGggdGhlIGFib3ZlIHBsb3QsIGJ1dCB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgbWlub3IgbmVnYXRpdmUgY29ycmVsYXRpb24gZm9yIHRoZSBBc2lhIGNvbnRpbmVudCBiZXR3ZWVuIGJvdGggcG9wdWxhdGlvbiBzaXplIGFuZCBsaWZlIGV4cGVjdGFuY3kgYXMgd2VsbCBhcyBwb3B1bGF0aW9uIHNpemUgYW5kIGluY29tZSBwZXIgcGVyc29uLiAgVGhpcyBjb3JyZWxhdGlvbiBpcyBpZGVudGlmaWVkIGJ5IHRoZSBjbHVzdGVyaW5nIG9mIGxhcmdlciBzaXplZCBwb2ludHMgY2xvc2VyIHRvd2FyZHMgdGhlIGJvdHRvbSBsZWZ0IG9mIHRoZSBwbG90IChsb3dlciB2YWx1ZXMgZm9yIGJvdGggaW5jb21lIGFuZCBsaWZlIGV4cGVjdGFuY3kpDQoNCg0KIyMgQWxsIERhdGEgb3ZlciBUaW1lDQoNCmBgYHtyfQ0KcGxvdF9seSgNCiAgICBkYXRhID0gbGlmZS5yYXcsDQogICAgeCA9IH5JbmNvbWUsICANCiAgICB5ID0gfkxpZmVfRXhwLA0KICAgIHNpemUgPSB+UG9wdWxhdGlvbiwNCiAgICBjb2xvciA9IH5mYWN0b3IoQ29udGluZW50KSwNCiAgICBjb2xvcnMgPSBjKCcjMzMyMjg4JywnIzExNzczMycsICcjMDA3MkIyJywgJyNENTVFMDAnLCAnIzg4MjI1NScpLA0KICAgIGZyYW1lID0gflllYXIsDQogICAgdGV4dCA9IH5wYXN0ZSgiQ29udGluZW50OiAiLCBDb250aW5lbnQsDQogICAgICAgICAgICAgICAgICAgIjxicj5Db3VudHJ5OiAiLCBDb3VudHJ5LA0KICAgICAgICAgICAgICAgICAgICI8YnI+UG9wdWxhdGlvbjogIiwgUG9wdWxhdGlvbiksIA0KICAgICBob3ZlcnRlbXBsYXRlID0gcGFzdGUoJzxpPjxiPkxpZmUgRXhwZWN0YW5jeTxiPjwvaT46ICV7eX0nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxicj48Yj5JbmNvbWU8L2I+OiAgJXt4fScsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAnPGJyPjxiPiV7dGV4dH08L2I+JyksDQogICAgIGFscGhhICA9IDAuOCwNCiAgICBtYXJrZXIgPSBsaXN0KGxpbmU9KGxpc3QoY29sb3IgPSAiYmxhY2siKSkpLA0KICAgICB0eXBlID0gInNjYXR0ZXIiKSAlPiUgDQogICAgIGxheW91dCgNCiAgICAgIHRpdGxlID0gbGlzdCh0ZXh0PSJJbXBhY3Qgb2YgSW5jb21lIG9uIEdsb2JhbCBMaWZlIEV4cGVjdGFuY3kgZm9yIEFsbCBZZWFycyA8YnI+IENvbnRyb2xsZWQgZm9yIGJvdGggcmVnaW9uIChDb250aW5lbnQpIGFuZCBwb3B1bGF0aW9uIHNpemUgKFBvcHVsYXRpb24pIiwgeSA9IDEuMiksDQogICAgICB4YXhpcyA9IGxpc3QoDQogICAgICAgIHRpdGxlID0gIkF2ZXJhZ2UgQW5udWFsIEluY29tZSAoJC95ZWFyKSINCiAgICAgICksDQogICAgICB5YXhpcyA9IGxpc3QoDQogICAgICAgIHRpdGxlID0gIkF2ZXJhZ2UgTGlmZSBFeHBlY3RhbmN5ICh5ZWFycykiDQogICAgICApLA0KICAgICAgbGVnZW5kID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dD0iQ29udGluZW50IiksIHk9IDAuOCwgeCA9IDEpLA0KICAgYW5ub3RhdGlvbnMgPSBsaXN0KCAgDQogICAgICAgICAgICAgICAgICAgICB4ID0gMC44LA0KICAgICAgICAgICAgICAgICAgICAgeSA9IDAuMiwgDQogICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChzaXplID0gMTIsIGNvbG9yID0gImRhcmtyZWQiKSwgICANCiAgICAgICAgICAgICAgICAgIHRleHQgPSAiVGhlIHBvaW50IHNpemUgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBjb3VudHJ5IHBvcHVsYXRpb24gc2l6ZSIsICAgDQogICAgICAgICAgICAgICAgICB4cmVmID0gInBhcGVyIiwgICAgDQogICAgICAgICAgICAgICAgICB5cmVmID0gInBhcGVyIiwgDQogICAgICAgICAgICAgICB4YW5jaG9yID0gImNlbnRlciIsIA0KICAgICAgICAgICAgICAgeWFuY2hvciA9ICJib3R0b20iLCANCiAgICAgICAgICAgICBzaG93YXJyb3cgPSBGQUxTRSkpDQogICAgICANCmBgYA0KDQoNCkluIHJldmlld2luZyB0aGUgQXZlcmFnZSBMaWZlIEV4cGVjdGFuY3kgb24gYSBnbG9iYWwgc2NhbGUgdG8gdGhlIEF2ZXJhZ2UgQW5udWFsIEluY29tZSwgdGhlIGNvcnJlbGF0aW9ucyBzZWVuIGluIGJvdGggdGhlIHllYXIgMjAwMCBhbmQgeWVhciAyMDE1IGFuYWx5c2VzIGFyZSBub3QgcHJlc2VudCB0aHJvdWdob3V0IHRoZSBlbnRpcmUgcmFuZ2Ugb2YgeWVhcnMgaW4gd2hpY2ggZGF0YSBpcyBhdmFpbGFibGUuICBVbnRpbCBhcHByb3hpbWF0ZWx5IDE5NTAgdGhlcmUgd2FzIHNpZ25pZmljYW50IGluY3JlYXNlIGluIEF2ZXJhZ2UgTGlmZSBFeHBlY3RhbmN5IGdsb2JhbGx5LCB3aXRoIGxpdHRsZSBpbmNyZWFzZSBpbiBBdmVyYWdlIEFubnVhbCBJbmNvbWUuICBCYXJyaW5nIHRlbXBvcmFyeSBBdmVyYWdlIExpZmUgRXhwZWN0YW5jeSBkZWNyZWFzZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSB5ZWFycyBvZiBib3RoIFdvcmxkIFdhcnMsIEF2ZXJhZ2UgTGlmZSBFeHBlY3RhbmN5IGFwcGVhcnMgdG8gYmUgbmVhciBpbmRlcGVuZGVudCBmcm9tIEF2ZXJhZ2UgQW5udWFsIEluY29tZS4gQWZ0ZXIgMTk1MCB0aGUgdHJlbmRzIG9mIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gQXZlcmFnZSBMaWZlIEV4cGVjdGFuY3kgYW5kIEF2ZXJhZ2UgQW5udWFsIEluY29tZSBiZWNvbWVzIG1vcmUgcHJldmFsZW50IGVhY2ggeWVhci4gDQoNClwNCg==