Yaroslava Soroka

Date: 27.05.2026

Context and Relevance to Sustainable Development

The development of the Dutch gas market, which began with the discovery of the giant Groningen field in 1959, made the country a leader in gas production and exports in the EU, making blue fuel the basis of national energy policy and electricity generation (Corbeau, 2018). But after decades of dominance as Europe’s main energy hub, the Dutch gas market has reached a turning point: the cessation of production at the Groningen field has created fundamental challenges, ultimately leading to a large-scale transformation of the entire gas sector. (Riemersma et al., 2020). Additionally, the Netherlands is demonstrating an ambitious climate strategy aimed at achieving neutrality by 2050. The country is already outperforming the EU average, having reduced net emissions by 32.3% and setting an even more ambitious domestic target of a 60% reduction by 2030 (Erbach & Dewulf, 2024).

Therefore, the focus of this analysis lies on the recent transformation of the Dutch energy system, specifically the period marked by a rising share of renewable energy and a simultaneous decline in CO₂ emissions per capita. In this context, the central research question is: How did the share of renewable energy (X) and CO₂ emissions per capita (Y) change in the Netherlands between 2018 and 2023, and what factors explain this transition?

Figure: Renewable energy share vs. CO₂​ emissions per capita (2018–2023)

The data reveals a clear upward trend in the share of renewable energy alongside a simultaneous decline in CO₂ emissions per capita. This inverse correlation suggests that the Dutch energy system is undergoing a fundamental structural transformation toward decarbonization

1.1. Chapter …

Description

library(tidyverse)
library(eurostat)
library(dplyr)

# 2. Завантажуємо дані
gas_raw <- get_eurostat("nrg_cb_gas")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/df45c61508f0e62885a3089aceaccc5f.rds
Table  nrg_cb_gas  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/df45c61508f0e62885a3089aceaccc5f.rds
# 3. Обробка через пайп (%>%)
prod <- gas_raw %>%
  filter(geo == "NL") %>%                    # Тільки Нідерланди
  filter(unit == "TJ_GCV") %>%               # Тільки певна одиниця виміру
  filter(nrg_bal %in% c("IPRD")) %>%         # Тільки Виробництво 
  filter(siec == "G3000")  

exp<- gas_raw %>%
  filter(geo == "NL") %>%                    # Тільки Нідерланди
  filter(unit == "TJ_GCV") %>%               # Тільки певна одиниця виміру
  filter(nrg_bal %in% c( "EXP")) %>%        # Тільки Експорт
  filter(siec == "G3000")   


plot(prod$TIME_PERIOD, prod$values,    
     type = "l", col = "blue",lwd = 2,
     xaxt = "n", 
     xlab = "Year", ylab = "Gas Volume", 
     main = "Gas Production vs Exports in the Netherlands")
caption = "Source: Eurostat [nrg_cb_gas]"


lines(exp$TIME_PERIOD, exp$values, col = "red", lwd = 2)

axis.Date(1, at = seq(min(prod$TIME_PERIOD), max(prod$TIME_PERIOD), by = "5 years"), format = "%Y")

legend("topright", 
       legend = c("Production", "Exports"), 
       col = c("blue", "red"), 
       lty = 1, lwd = 2, cex = 0.7)

grid()

2.1. Name

Description

library(eurostat)
library(dplyr)


ren <- get_eurostat("nrg_ind_ren")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/78ad026d0e415a56d0f1b89d1e337078.rds
Table  nrg_ind_ren  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/78ad026d0e415a56d0f1b89d1e337078.rds
co2 <- get_eurostat("env_air_gge")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/58a9992b00c628ab521a3b92df80b45b.rds
Table  env_air_gge  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/58a9992b00c628ab521a3b92df80b45b.rds
co2_smallest_order <- co2 %>%
  pull(values) %>%
  order()
co2_smallest <- co2_smallest_order[1]

ren_nl = ren %>%
  filter(geo == "NL", TIME_PERIOD >= "2018-01-01",TIME_PERIOD <= "2023-12-31",nrg_bal=="REN" )

co2_nl = co2 %>%
  filter(geo == "NL", airpol == "CO2", TIME_PERIOD >= "2018-01-01", TIME_PERIOD <= "2023-12-31", src_crf == "TOTXMEMO", unit=="MIO_T")

ren_nl <- ren_nl %>%
  rename(renewable = values)
co2_nl <- co2_nl %>%
  rename(co2 = values)

data_final <- ren_nl %>%
  inner_join(co2_nl, by = "TIME_PERIOD")

cor(data_final$renewable, data_final$co2)
[1] -0.9897367
model <- lm(co2 ~ renewable, data = data_final)
summary(model)

Call:
lm(formula = co2 ~ renewable, data = data_final)

Residuals:
     1      2      3      4      5      6 
-1.026 -1.036  2.994  2.565 -1.192 -2.305 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 192.2778     3.7595   51.14 8.75e-07 ***
renewable    -3.9464     0.2849  -13.85 0.000157 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.47 on 4 degrees of freedom
Multiple R-squared:  0.9796,    Adjusted R-squared:  0.9745 
F-statistic: 191.9 on 1 and 4 DF,  p-value: 0.0001575
plot(data_final$renewable, data_final$co2, col = "blue",lwd = 2,
     xlab = "Renewable energy (%)",
     ylab = "CO2 per capita (MIO_T)",
     main = "Relationship between Renewable Energy and CO2")
model <- lm(co2 ~ renewable, data = data_final)
abline(model, col = "red",lwd = 2)
legend("topright", 
       legend = c("Experimental data", "Model data"), 
       col = c("blue", "red"), 
       lty = 1, lwd = 2, cex = 0.7)

grid()

2.2. Name

Description

library(tidyverse)
library(eurostat)

# 1. Завантажуємо дані (якщо ще не завантажені)
raw_energy <- get_eurostat("nrg_bal_s")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/d3e73add764e8b0bdd8298c9ee0a57ec.rds
Table  nrg_bal_s  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/d3e73add764e8b0bdd8298c9ee0a57ec.rds
raw_gdp    <- get_eurostat("nama_10_gdp")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/5590e4702bb787ef42ec6e58b1b97c07.rds
Table  nama_10_gdp  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/5590e4702bb787ef42ec6e58b1b97c07.rds
energy_gdp_data <- raw_gdp %>%
  # Фільтруємо ВВП
  filter(geo == "NL", unit == "CLV15_MEUR", na_item == "B1GQ") %>%
  select(TIME_PERIOD, gdp_val = values) %>%
  # Приєднуємо дані по енергії
  inner_join(
    raw_energy %>%
      filter(geo == "NL", unit == "GWH", nrg_bal == "AFC") %>%
      group_by(TIME_PERIOD) %>%
      summarise(energy_val = sum(values, na.rm = TRUE)),
    by = "TIME_PERIOD"
  ) %>%
  # Рахуємо індекси (перший рік = 100)
  mutate(gdp_index = (gdp_val / first(gdp_val)) * 100,
         energy_index = (energy_val / first(energy_val)) * 100)
str(energy_gdp_data)
tibble [30 × 5] (S3: tbl_df/tbl/data.frame)
 $ TIME_PERIOD : Date[1:30], format: "1995-01-01" ...
 $ gdp_val     : num [1:30] 472563 488728 509492 533171 560061 ...
 $ energy_val  : num [1:30] 1315474 1393935 1345128 1348896 1348048 ...
 $ gdp_index   : num [1:30] 100 103 108 113 119 ...
 $ energy_index: num [1:30] 100 106 102 103 102 ...
y_min = min(energy_gdp_data$energy_index)
y_max = max(energy_gdp_data$gdp_index)

plot(energy_gdp_data$TIME_PERIOD, energy_gdp_data$gdp_index,
     ylim = c(y_min,y_max),
     type = "l", col = "blue",lwd = 2,
     xaxt = "n", 
     xlab = "Year", ylab = "Index Value, 1995 = 100%", 
     main = "Economic Growth vs Energy Use (Netherlands)",
     )

mtext("Source: Eurostat", side = 1, line = 4, adj = 1)
lines(energy_gdp_data$TIME_PERIOD, energy_gdp_data$energy_index, col = "red", lwd = 2)

axis.Date(1, at = seq(min(energy_gdp_data$TIME_PERIOD), max(energy_gdp_data$TIME_PERIOD), by = "4 years"), format = "%Y")

legend("topleft", 
       legend = c("GDP Growth", "Energy Use"), 
       col = c("blue", "red"), 
       lty = 1, lwd = 2, cex = 0.7)

grid()

3.1. Name

Description

library(eurostat)
library(dplyr)
library(tidyr)

# 2. ЗАВАНТАЖЕННЯ ДАНИХ 
# nrg_inf_epc — це код бази даних Eurostat для потужностей електростанцій
capacity_raw <- get_eurostat("nrg_inf_epc", time_format = "date")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/0bbff8a7e565f26af137d75b3ab7b781.rds
Table  nrg_inf_epc  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/0bbff8a7e565f26af137d75b3ab7b781.rds
# 3. ОБРОБКА ДАНИХ
capacity_full <- capacity_raw %>%
  filter(geo == "NL", 
         siec %in% c("RA420", "RA300", "N9000", "RA100")) %>% 
  mutate(Year = as.numeric(format(TIME_PERIOD, "%Y")),
         tech = case_when(
           siec == "RA420" ~ "Solar",
           siec == "RA300" ~ "Wind",
           siec == "N9000" ~ "Nuclear",
           siec == "RA100" ~ "Hydro",
           TRUE ~ "Other"
         )) %>%
  group_by(Year, tech) %>%
  summarise(values = sum(values, na.rm = TRUE), .groups = 'drop') %>%
  pivot_wider(names_from = tech, values_from = values)

# 4. ПЕРЕВІРКА РЕЗУЛЬТАТУ

print("Оброблена таблиця capacity_full:")
[1] "Оброблена таблиця capacity_full:"
print(head(capacity_full))

#gas_prices_raw <- get_eurostat("nrg_pc_202", time_format = "date")

gas_prices_clean <- gas_prices_raw %>%
  filter(geo == "NL", 
         unit == "KWH", 
         tax == "I_TAX", 
         currency == "EUR") %>%
  mutate(Year = as.numeric(format(TIME_PERIOD, "%Y"))) %>%
  group_by(Year) %>%
  summarise(gas_price = mean(values, na.rm = TRUE), .groups = 'drop')

# Об'єднуємо за роком
geo_data_final <- gas_prices_clean %>%
  inner_join(capacity_full, by = "Year") %>%
  filter(Year >= 2018)

# Дивимось результат
print(geo_data_final)

# 1. Перераховуємо все у відсотки (Індексація: 2018 рік = 100)
geo_data_indexed <- geo_data_final %>%
  mutate(
    Solar_idx = (Solar / Solar[Year == 2018]) * 100,
    Wind_idx = (Wind / Wind[Year == 2018]) * 100,
    Nuclear_idx = (Nuclear / Nuclear[Year == 2018]) * 100,
    Hydro_idx = (Hydro / Hydro[Year == 2018]) * 100,
    Gas_idx = (gas_price / gas_price[Year == 2018]) * 100
  )

y_min = min(geo_data_indexed$Solar_idx)
y_max = max(geo_data_indexed$Solar_idx)

plot(geo_data_indexed$Year, geo_data_indexed$Solar_idx,
     ylim = c(y_min,y_max),
     type = "l", col = "red",lwd = 2,
     xaxt = "n", 
     xlab = "Year", ylab = "Growth relative to 2018, 2018 = 100%", 
     main = "Netherlands Energy Landscape (2018-2024)",)

grid()
mtext("Source: Eurostat Data Analysis (2026)", side = 1, line = 4, adj = 1)

lines(geo_data_indexed$Year, geo_data_indexed$Wind_idx, col = "blue", lwd = 2)
lines(geo_data_indexed$Year, geo_data_indexed$Gas_idx, col = "lightblue", lwd = 2)
lines(geo_data_indexed$Year, geo_data_indexed$Nuclear_idx, col = "black", lwd = 2)
lines(geo_data_indexed$Year, geo_data_indexed$Hydro_idx, col = "darkblue", lwd = 2)


axis(1, at = seq(min(geo_data_indexed$Year), max(geo_data_indexed$Year)))

legend("topleft", 
       legend = c("Solar", "Wind","Gas Price","Nuclear","Hydro"), 
       col = c("red", "blue","lightblue","black","darkblue"), 
       lty = 1, lwd = 2, cex = 0.7)

3.2. Name

Description

library(eurostat)
library(dplyr)
library(ggplot2)

# 1. Отримання даних з правильними ID
tax_raw <- get_eurostat("env_ac_tax")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/7ac6eba40fc48406f3b5a838b1bc7300.rds
Table  env_ac_tax  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/7ac6eba40fc48406f3b5a838b1bc7300.rds
# env_ac_epneis1 — видатки (замість env_ac_exp1, який видавав помилку)
exp_raw <- get_eurostat("env_ac_epneis1")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/9c36de815110a194639e1ba9b01144c6.rds
Table  env_ac_epneis1  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/9c36de815110a194639e1ba9b01144c6.rds
# 1. Processing Environmental Tax Revenues
tax_clean <- tax_raw %>%
  filter(geo == "NL", unit == "MIO_EUR") %>%
  mutate(Year = as.numeric(format(TIME_PERIOD, "%Y"))) %>%
  group_by(Year) %>%
  summarise(tax_revenue = sum(values, na.rm = TRUE), .groups = 'drop')

# 2. Processing Environmental Protection Expenditure
# Here we rename the variable to the full term you requested
exp_clean <- exp_raw %>%
  filter(geo == "NL", unit == "MIO_EUR") %>%
  mutate(Year = as.numeric(format(TIME_PERIOD, "%Y"))) %>%
  group_by(Year) %>%
  summarise(environmental_protection_expenditure = sum(values, na.rm = TRUE), .groups = 'drop')

tax_clean <-tax_clean %>%
  filter(Year >= 2018,Year <= 2022)

y_min = min(exp_clean$environmental_protection_expenditure)
y_max = max(tax_clean$tax_revenue)+10000


plot(tax_clean$Year, tax_clean$tax_revenue,
     ylim = c(y_min,y_max),
     xlim = c(2017.7,2022.3),
     type = "l", col = "red",lwd = 2,
     xaxt = "n", 
     xlab = "Year", ylab = "Amount (Million EUR)", 
     main = "Netherlands: Environmental Fiscal Trends",)

text(tax_clean$Year, tax_clean$tax_revenue, labels = tax_clean$tax_revenue, pos=1)

grid()

axis(1, at = seq(min(tax_clean), max(tax_clean$Year)))

legend("topleft", 
       legend = c("Tax Revenue", "Environmental Protection Expenditure"), 
       col = c("red", "blue"), 
       lty = 1, lwd = 2, cex = 0.7)


mtext("Source: Eurostat Data Analysis (2026)", side = 1, line = 4, adj = 1)

lines(exp_clean$Year, exp_clean$environmental_protection_expenditure, col = "blue", lwd = 2)
text(exp_clean$Year, exp_clean$environmental_protection_expenditure, labels = round(exp_clean$environmental_protection_expenditure), pos=3)

3.3. Name

Description

library(eurostat)
library(dplyr)

rd_e_gerdtot_raw <- get_eurostat("rd_e_gerdtot")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/88347b7c6c418358a0d682033c7044a1.rds
Table  rd_e_gerdtot  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/88347b7c6c418358a0d682033c7044a1.rds
sdg_09_40_raw <- get_eurostat("sdg_09_40")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/15abb4dea79736a34ef5ff3e0c5369e5.rds
Table  sdg_09_40  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/15abb4dea79736a34ef5ff3e0c5369e5.rds
# 1. Get R&D Data (X-axis equivalent: Time)
rd_recent <- rd_e_gerdtot_raw %>%
  mutate(Year = as.numeric(format(TIME_PERIOD, "%Y"))) %>%
  filter(geo == "NL", sectperf == "TOTAL", unit == "EUR_HAB", Year >= 2018,Year<=2024) %>%
  select(Year, values)

# 2. Get Patent Data
pat_recent <- sdg_09_40_raw %>%
  mutate(Year = as.numeric(format(TIME_PERIOD, "%Y"))) %>%
  filter(geo == "NL", unit == "NR", Year >= 2018,Year<=2024 ,coop_ptn == "APPL" ) %>%
  select(Year,  values)


y_min = min(rd_recent$values)
y_max = max(pat_recent$values)+2000

plot(pat_recent$Year, pat_recent$values,
     ylim = c(y_min,y_max),
     xlim = c(2017.8,2024.2),
     type = "l", col = "red",lwd = 2,
     xaxt = "n", 
     xlab = "Year", ylab = "Value (Units vary by indicator)", 
     main = "Netherlands: Innovation Indicators (2018-2023)\n Yearly trends in R&D investment\n and Climate Technology patents",)

text(pat_recent$Year, pat_recent$values, labels = pat_recent$values, pos=1)

grid()

axis(1, at = seq(2018, 2024))

legend("topleft", 
       legend = c("Climate Tech Patents (Count)", "R&D Expenditure (EUR/hab)"), 
       col = c("red", "blue"), 
       lty = 1, lwd = 2, cex = 0.7)


mtext("Source: Eurostat Data Analysis (2026)", side = 1, line = 4, adj = 1)

lines(rd_recent$Year, rd_recent$values, col = "blue", lwd = 2)
text(rd_recent$Year, rd_recent$values, labels = round(rd_recent$values), pos=3)

4.1. Name

Description

library(eurostat)
library(dplyr)
library(ggplot2)

# 1. Завантажуємо дані
gge_raw <- get_eurostat("env_air_gge")
Dataset query already saved in cache_list.json...
Reading cache file C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/58a9992b00c628ab521a3b92df80b45b.rds
Table  env_air_gge  read from cache file:  C:\Users\Admin\AppData\Local\Temp\RtmpMrh3Mh/eurostat/58a9992b00c628ab521a3b92df80b45b.rds
# 2. Фільтруємо дані 
gge_2023 <- gge_raw %>%
  filter(geo == "NL") %>%
  mutate(Year = as.numeric(format(TIME_PERIOD, "%Y"))) %>%
  # Беремо період 2018-2023
  filter(Year >= 2018 & Year <= 2023) %>%
  # Фільтруємо парникові гази та основні сектори
  filter(airpol == "GHG") %>%
  filter(src_crf %in% c("CRF1A1", "CRF1A2", "CRF1A3", "CRF1A4", "CRF3")) %>%
  # Групуємо, щоб прибрати дублікати
  group_by(Year, src_crf) %>%
  summarise(values = mean(values, na.rm = TRUE), .groups = 'drop')

# 3. Додаємо назви секторів
sector_labels <- c(
  "CRF1A1" = "Energy",
  "CRF1A2" = "Industry",
  "CRF1A3" = "Transport",
  "CRF1A4" = "Residential",
  "CRF3"   = "Agriculture"
)
gge_2023$Sector <- sector_labels[gge_2023$src_crf]

gge_2023_Energy <-gge_2023 %>% filter(Sector=="Energy")
gge_2023_Industry <-gge_2023 %>% filter(Sector=="Industry")
gge_2023_Transport <-gge_2023 %>% filter(Sector=="Transport")
gge_2023_Residential <-gge_2023 %>% filter(Sector=="Residential")
gge_2023_Agriculture <-gge_2023 %>% filter(Sector=="Agriculture")

# 4. МАЛЮЄМО

y_min = min(gge_2023$values)-1000
y_max = max(gge_2023$values)+3000

plot(gge_2023_Energy$Year, gge_2023_Energy$values,
     ylim = c(y_min,y_max),
     xlim = c(2017.8,2023.2),
     type = "l", col = "red",lwd = 2,
     xaxt = "n", 
     xlab = "Year", ylab = "Thousand Tonnes", 
     main = "Netherlands GHG Emissions (2018-2023)\n Progress towards climate goals by sector",)

text(gge_2023_Energy$Year, gge_2023_Energy$values, labels = round(gge_2023_Energy$values), pos=1, col = "red",cex=0.7)

grid()

axis(1, at = seq(2018, 2023))

legend("topright", 
       legend = c("Energy", "Industry","Transport","Residential","Agriculture"), 
       col = c("red", "blue","violet","orange","green"), 
       lty = 1, lwd = 2, cex = 0.7)


mtext("Source: Eurostat Data Analysis (2026)", side = 1, line = 4, adj = 1)

lines(gge_2023_Industry$Year, gge_2023_Industry$values, col = "blue", lwd = 2)
text(gge_2023_Industry$Year, gge_2023_Industry$values, labels = round(gge_2023_Industry$values), pos=3,cex = 0.7, col = "blue")

lines(gge_2023_Transport$Year, gge_2023_Transport$values, col = "violet", lwd = 2)
text(gge_2023_Transport$Year, gge_2023_Transport$values, labels = round(gge_2023_Transport$values), pos=1,cex = 0.7, col = "violet")
lines(gge_2023_Residential$Year, gge_2023_Residential$values, col = "orange", lwd = 2)
text(gge_2023_Residential$Year, gge_2023_Residential$values, labels = round(gge_2023_Residential$values), pos=3 ,cex = 0.7, col = "orange")
lines(gge_2023_Agriculture$Year, gge_2023_Agriculture$values, col = "green", lwd = 2)
text(gge_2023_Agriculture$Year, gge_2023_Agriculture$values, labels = round(gge_2023_Agriculture$values), pos=1,cex = 0.7,col = "green")

NA
NA

5.1. Name

Description

library(eurostat)
library(dplyr)

# ЗАВАНТАЖЕННЯ 
#ge_raw <- get_eurostat("env_air_gge")

ge_clean <- ge_raw %>%
  filter(geo == "NL", airpol == "GHG", unit == "THS_T") %>%
  mutate(Year = as.numeric(format(TIME_PERIOD, "%Y"))) %>%
  filter(Year %in% 2018:2023)

# Створення категорій та групування
compare_df <- ge_clean %>%
  filter(grepl("MEMO", src_crf)) %>%
  mutate(Indicator = case_when(
    grepl("X4|XL", src_crf) ~ "Excl",
    TRUE ~ "Incl"
  )) %>%
  group_by(Year, Indicator) %>%
  summarise(values = mean(values, na.rm = TRUE), .groups = 'drop')
# Рахуємо математику перед графіком
analysis_data <- compare_df %>% 
  pivot_wider(names_from = Indicator, values_from = values)

correlation <- cor(analysis_data$Excl, analysis_data$Incl)
reg_summary <- summary(lm(Incl ~ Excl, data = analysis_data))


# Розділення даних
excl <- subset(compare_df, Indicator == "Excl")
incl <- subset(compare_df, Indicator == "Incl")

# Відступи
x_pad <- 0.3
y_pad <- diff(range(compare_df$values)) * 0.05

# Поля для legend/caption
par(mar = c(7,4,5,2))


y_min = min(excl$values)-1000
y_max = max(excl$values)+3000

# Основний графік
plot(excl$Year, excl$values,
     xlim = c(2018,2023),
     ylim = c(y_min,y_max),
     type = "o", pch = 16, lwd = 2,
     col = "red",
     main = "Comparison of Emissions: Total vs. Total with LULUCF",
     sub = paste0("Correlation: ",round(correlation, 4)," | R²: ",round(reg_summary$r.squared, 4)     ),
     xlab = "Year",  ylab = "Thousand Tonnes (CO2 eq.)",
     col.sub = "grey30")


grid()
# Власна вісь X
axis(1, at = seq(2018, 2023))

# Друга лінія
lines(incl$Year, incl$values, type = "o", pch = 16,lwd = 2, col = "blue")

# Лінія тренду для Excl
abline(lm(values ~ Year, data = excl),col = "red",lty = 2,  lwd = 1)

# Лінія тренду для Incl
abline(lm(values ~ Year, data = incl),col = "blue",  lty = 2,  lwd = 1)

# Легенда
legend("topright", legend = c("Total (Excl. LULUCF)","Total (Incl. LULUCF)"),
       col = c("red", "blue"),
       lty = 1, lwd = 2, pch = 16, cex = 0.7)

# Caption
mtext(  "Source: Eurostat [env_air_gge] | Dashed lines represent linear trends",
  side = 1,  line = 5,  cex = 0.8,  col = "grey40"
)

NA
NA
LS0tDQp0aXRsZTogIkR1dGNoIEdhcyBUcmFuc2l0aW9uIEFuYWx5c2lzICgxOTkw4oCTMjAyMykiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KKipZYXJvc2xhdmEgU29yb2thKiogIA0KDQoqKkRhdGU6IDI3LjA1LjIwMjYqKiAgDQogIA0KIyMgQ29udGV4dCBhbmQgUmVsZXZhbmNlIHRvIFN1c3RhaW5hYmxlIERldmVsb3BtZW50DQoNCg0KVGhlIGRldmVsb3BtZW50IG9mIHRoZSBEdXRjaCBnYXMgbWFya2V0LCB3aGljaCBiZWdhbiB3aXRoIHRoZSBkaXNjb3Zlcnkgb2YgdGhlIGdpYW50IEdyb25pbmdlbiBmaWVsZCBpbiAxOTU5LCBtYWRlIHRoZSBjb3VudHJ5IGEgbGVhZGVyIGluIGdhcyBwcm9kdWN0aW9uIGFuZCBleHBvcnRzIGluIHRoZSBFVSwgbWFraW5nIGJsdWUgZnVlbCB0aGUgYmFzaXMgb2YgbmF0aW9uYWwgZW5lcmd5IHBvbGljeSBhbmQgZWxlY3RyaWNpdHkgZ2VuZXJhdGlvbiAoQ29yYmVhdSwgMjAxOCkuIEJ1dCBhZnRlciBkZWNhZGVzIG9mIGRvbWluYW5jZSBhcyBFdXJvcGUncyBtYWluIGVuZXJneSBodWIsIHRoZSBEdXRjaCBnYXMgbWFya2V0IGhhcyByZWFjaGVkIGEgdHVybmluZyBwb2ludDogdGhlIGNlc3NhdGlvbiBvZiBwcm9kdWN0aW9uIGF0IHRoZSBHcm9uaW5nZW4gZmllbGQgaGFzIGNyZWF0ZWQgZnVuZGFtZW50YWwgY2hhbGxlbmdlcywgdWx0aW1hdGVseSBsZWFkaW5nIHRvIGEgbGFyZ2Utc2NhbGUgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGVudGlyZSBnYXMgc2VjdG9yLiAoUmllbWVyc21hIGV0IGFsLiwgMjAyMCkuIEFkZGl0aW9uYWxseSwgdGhlIE5ldGhlcmxhbmRzIGlzIGRlbW9uc3RyYXRpbmcgYW4gYW1iaXRpb3VzIGNsaW1hdGUgc3RyYXRlZ3kgYWltZWQgYXQgYWNoaWV2aW5nIG5ldXRyYWxpdHkgYnkgMjA1MC4gVGhlIGNvdW50cnkgaXMgYWxyZWFkeSBvdXRwZXJmb3JtaW5nIHRoZSBFVSBhdmVyYWdlLCBoYXZpbmcgcmVkdWNlZCBuZXQgZW1pc3Npb25zIGJ5IDMyLjMlIGFuZCBzZXR0aW5nIGFuIGV2ZW4gbW9yZSBhbWJpdGlvdXMgZG9tZXN0aWMgdGFyZ2V0IG9mIGEgNjAlIHJlZHVjdGlvbiBieSAyMDMwIChFcmJhY2ggJiBEZXd1bGYsIDIwMjQpLiAgDQoNClRoZXJlZm9yZSwgdGhlIGZvY3VzIG9mIHRoaXMgYW5hbHlzaXMgbGllcyBvbiB0aGUgcmVjZW50IHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBEdXRjaCBlbmVyZ3kgc3lzdGVtLCBzcGVjaWZpY2FsbHkgdGhlIHBlcmlvZCBtYXJrZWQgYnkgYSByaXNpbmcgc2hhcmUgb2YgcmVuZXdhYmxlIGVuZXJneSBhbmQgYSBzaW11bHRhbmVvdXMgZGVjbGluZSBpbiBDT+KCgiBlbWlzc2lvbnMgcGVyIGNhcGl0YS4gSW4gdGhpcyBjb250ZXh0LCB0aGUgY2VudHJhbCByZXNlYXJjaCBxdWVzdGlvbiBpczogSG93IGRpZCB0aGUgc2hhcmUgb2YgcmVuZXdhYmxlIGVuZXJneSAoWCkgYW5kIENP4oKCIGVtaXNzaW9ucyBwZXIgY2FwaXRhIChZKSBjaGFuZ2UgaW4gdGhlIE5ldGhlcmxhbmRzIGJldHdlZW4gMjAxOCBhbmQgMjAyMywgYW5kIHdoYXQgZmFjdG9ycyBleHBsYWluIHRoaXMgdHJhbnNpdGlvbj8gIA0KDQoNCkZpZ3VyZTogUmVuZXdhYmxlIGVuZXJneSBzaGFyZSB2cy4gQ0/igoLigIsgZW1pc3Npb25zIHBlciBjYXBpdGEgKDIwMTjigJMyMDIzKQ0KDQoNClRoZSBkYXRhIHJldmVhbHMgYSBjbGVhciB1cHdhcmQgdHJlbmQgaW4gdGhlIHNoYXJlIG9mIHJlbmV3YWJsZSBlbmVyZ3kgYWxvbmdzaWRlIGEgc2ltdWx0YW5lb3VzIGRlY2xpbmUgaW4gQ0/igoIgZW1pc3Npb25zIHBlciBjYXBpdGEuIFRoaXMgaW52ZXJzZSBjb3JyZWxhdGlvbiBzdWdnZXN0cyB0aGF0IHRoZSBEdXRjaCBlbmVyZ3kgc3lzdGVtIGlzIHVuZGVyZ29pbmcgYSBmdW5kYW1lbnRhbCBzdHJ1Y3R1cmFsIHRyYW5zZm9ybWF0aW9uIHRvd2FyZCBkZWNhcmJvbml6YXRpb24NCg0KIyMgMS4xLiBDaGFwdGVyIC4uLiANCg0KRGVzY3JpcHRpb24NCg0KYGBge3IsIGZpZy5oZWlnaHQ9Nn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShldXJvc3RhdCkNCmxpYnJhcnkoZHBseXIpDQoNCiMgMi4g0JfQsNCy0LDQvdGC0LDQttGD0ZTQvNC+INC00LDQvdGWDQpnYXNfcmF3IDwtIGdldF9ldXJvc3RhdCgibnJnX2NiX2dhcyIpDQoNCiMgMy4g0J7QsdGA0L7QsdC60LAg0YfQtdGA0LXQtyDQv9Cw0LnQvyAoJT4lKQ0KcHJvZCA8LSBnYXNfcmF3ICU+JQ0KICBmaWx0ZXIoZ2VvID09ICJOTCIpICU+JSAgICAgICAgICAgICAgICAgICAgIyDQotGW0LvRjNC60Lgg0J3RltC00LXRgNC70LDQvdC00LgNCiAgZmlsdGVyKHVuaXQgPT0gIlRKX0dDViIpICU+JSAgICAgICAgICAgICAgICMg0KLRltC70YzQutC4INC/0LXQstC90LAg0L7QtNC40L3QuNGG0Y8g0LLQuNC80ZbRgNGDDQogIGZpbHRlcihucmdfYmFsICVpbiUgYygiSVBSRCIpKSAlPiUgICAgICAgICAjINCi0ZbQu9GM0LrQuCDQktC40YDQvtCx0L3QuNGG0YLQstC+IA0KICBmaWx0ZXIoc2llYyA9PSAiRzMwMDAiKSAgDQoNCmV4cDwtIGdhc19yYXcgJT4lDQogIGZpbHRlcihnZW8gPT0gIk5MIikgJT4lICAgICAgICAgICAgICAgICAgICAjINCi0ZbQu9GM0LrQuCDQndGW0LTQtdGA0LvQsNC90LTQuA0KICBmaWx0ZXIodW5pdCA9PSAiVEpfR0NWIikgJT4lICAgICAgICAgICAgICAgIyDQotGW0LvRjNC60Lgg0L/QtdCy0L3QsCDQvtC00LjQvdC40YbRjyDQstC40LzRltGA0YMNCiAgZmlsdGVyKG5yZ19iYWwgJWluJSBjKCAiRVhQIikpICU+JSAgICAgICAgIyDQotGW0LvRjNC60Lgg0JXQutGB0L/QvtGA0YINCiAgZmlsdGVyKHNpZWMgPT0gIkczMDAwIikgICANCg0KDQpwbG90KHByb2QkVElNRV9QRVJJT0QsIHByb2QkdmFsdWVzLCAgICANCiAgICAgdHlwZSA9ICJsIiwgY29sID0gImJsdWUiLGx3ZCA9IDIsDQogICAgIHhheHQgPSAibiIsIA0KICAgICB4bGFiID0gIlllYXIiLCB5bGFiID0gIkdhcyBWb2x1bWUiLCANCiAgICAgbWFpbiA9ICJHYXMgUHJvZHVjdGlvbiB2cyBFeHBvcnRzIGluIHRoZSBOZXRoZXJsYW5kcyIpDQpjYXB0aW9uID0gIlNvdXJjZTogRXVyb3N0YXQgW25yZ19jYl9nYXNdIg0KDQoNCmxpbmVzKGV4cCRUSU1FX1BFUklPRCwgZXhwJHZhbHVlcywgY29sID0gInJlZCIsIGx3ZCA9IDIpDQoNCmF4aXMuRGF0ZSgxLCBhdCA9IHNlcShtaW4ocHJvZCRUSU1FX1BFUklPRCksIG1heChwcm9kJFRJTUVfUEVSSU9EKSwgYnkgPSAiNSB5ZWFycyIpLCBmb3JtYXQgPSAiJVkiKQ0KDQpsZWdlbmQoInRvcHJpZ2h0IiwgDQogICAgICAgbGVnZW5kID0gYygiUHJvZHVjdGlvbiIsICJFeHBvcnRzIiksIA0KICAgICAgIGNvbCA9IGMoImJsdWUiLCAicmVkIiksIA0KICAgICAgIGx0eSA9IDEsIGx3ZCA9IDIsIGNleCA9IDAuNykNCg0KZ3JpZCgpDQoNCmBgYA0KDQoNCiMjIDIuMS4gTmFtZSANCg0KRGVzY3JpcHRpb24NCmBgYHtyLCBmaWcuaGVpZ2h0PTZ9DQpsaWJyYXJ5KGV1cm9zdGF0KQ0KbGlicmFyeShkcGx5cikNCg0KDQpyZW4gPC0gZ2V0X2V1cm9zdGF0KCJucmdfaW5kX3JlbiIpDQpjbzIgPC0gZ2V0X2V1cm9zdGF0KCJlbnZfYWlyX2dnZSIpDQoNCmNvMl9zbWFsbGVzdF9vcmRlciA8LSBjbzIgJT4lDQogIHB1bGwodmFsdWVzKSAlPiUNCiAgb3JkZXIoKQ0KY28yX3NtYWxsZXN0IDwtIGNvMl9zbWFsbGVzdF9vcmRlclsxXQ0KDQpyZW5fbmwgPSByZW4gJT4lDQogIGZpbHRlcihnZW8gPT0gIk5MIiwgVElNRV9QRVJJT0QgPj0gIjIwMTgtMDEtMDEiLFRJTUVfUEVSSU9EIDw9ICIyMDIzLTEyLTMxIixucmdfYmFsPT0iUkVOIiApDQoNCmNvMl9ubCA9IGNvMiAlPiUNCiAgZmlsdGVyKGdlbyA9PSAiTkwiLCBhaXJwb2wgPT0gIkNPMiIsIFRJTUVfUEVSSU9EID49ICIyMDE4LTAxLTAxIiwgVElNRV9QRVJJT0QgPD0gIjIwMjMtMTItMzEiLCBzcmNfY3JmID09ICJUT1RYTUVNTyIsIHVuaXQ9PSJNSU9fVCIpDQoNCnJlbl9ubCA8LSByZW5fbmwgJT4lDQogIHJlbmFtZShyZW5ld2FibGUgPSB2YWx1ZXMpDQpjbzJfbmwgPC0gY28yX25sICU+JQ0KICByZW5hbWUoY28yID0gdmFsdWVzKQ0KDQpkYXRhX2ZpbmFsIDwtIHJlbl9ubCAlPiUNCiAgaW5uZXJfam9pbihjbzJfbmwsIGJ5ID0gIlRJTUVfUEVSSU9EIikNCg0KY29yKGRhdGFfZmluYWwkcmVuZXdhYmxlLCBkYXRhX2ZpbmFsJGNvMikNCg0KbW9kZWwgPC0gbG0oY28yIH4gcmVuZXdhYmxlLCBkYXRhID0gZGF0YV9maW5hbCkNCnN1bW1hcnkobW9kZWwpDQoNCnBsb3QoZGF0YV9maW5hbCRyZW5ld2FibGUsIGRhdGFfZmluYWwkY28yLCBjb2wgPSAiYmx1ZSIsbHdkID0gMiwNCiAgICAgeGxhYiA9ICJSZW5ld2FibGUgZW5lcmd5ICglKSIsDQogICAgIHlsYWIgPSAiQ08yIHBlciBjYXBpdGEgKE1JT19UKSIsDQogICAgIG1haW4gPSAiUmVsYXRpb25zaGlwIGJldHdlZW4gUmVuZXdhYmxlIEVuZXJneSBhbmQgQ08yIikNCm1vZGVsIDwtIGxtKGNvMiB+IHJlbmV3YWJsZSwgZGF0YSA9IGRhdGFfZmluYWwpDQphYmxpbmUobW9kZWwsIGNvbCA9ICJyZWQiLGx3ZCA9IDIpDQpsZWdlbmQoInRvcHJpZ2h0IiwgDQogICAgICAgbGVnZW5kID0gYygiRXhwZXJpbWVudGFsIGRhdGEiLCAiTW9kZWwgZGF0YSIpLCANCiAgICAgICBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCANCiAgICAgICBsdHkgPSAxLCBsd2QgPSAyLCBjZXggPSAwLjcpDQoNCmdyaWQoKQ0KDQpgYGANCg0KIyMgMi4yLiBOYW1lIA0KDQpEZXNjcmlwdGlvbg0KDQpgYGB7ciwgZmlnLmhlaWdodD02fQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGV1cm9zdGF0KQ0KDQojIDEuINCX0LDQstCw0L3RgtCw0LbRg9GU0LzQviDQtNCw0L3RliAo0Y/QutGJ0L4g0YnQtSDQvdC1INC30LDQstCw0L3RgtCw0LbQtdC90ZYpDQpyYXdfZW5lcmd5IDwtIGdldF9ldXJvc3RhdCgibnJnX2JhbF9zIikNCnJhd19nZHAgICAgPC0gZ2V0X2V1cm9zdGF0KCJuYW1hXzEwX2dkcCIpDQoNCg0KZW5lcmd5X2dkcF9kYXRhIDwtIHJhd19nZHAgJT4lDQogICMg0KTRltC70YzRgtGA0YPRlNC80L4g0JLQktCfDQogIGZpbHRlcihnZW8gPT0gIk5MIiwgdW5pdCA9PSAiQ0xWMTVfTUVVUiIsIG5hX2l0ZW0gPT0gIkIxR1EiKSAlPiUNCiAgc2VsZWN0KFRJTUVfUEVSSU9ELCBnZHBfdmFsID0gdmFsdWVzKSAlPiUNCiAgIyDQn9GA0LjRlNC00L3Rg9GU0LzQviDQtNCw0L3RliDQv9C+INC10L3QtdGA0LPRltGXDQogIGlubmVyX2pvaW4oDQogICAgcmF3X2VuZXJneSAlPiUNCiAgICAgIGZpbHRlcihnZW8gPT0gIk5MIiwgdW5pdCA9PSAiR1dIIiwgbnJnX2JhbCA9PSAiQUZDIikgJT4lDQogICAgICBncm91cF9ieShUSU1FX1BFUklPRCkgJT4lDQogICAgICBzdW1tYXJpc2UoZW5lcmd5X3ZhbCA9IHN1bSh2YWx1ZXMsIG5hLnJtID0gVFJVRSkpLA0KICAgIGJ5ID0gIlRJTUVfUEVSSU9EIg0KICApICU+JQ0KICAjINCg0LDRhdGD0ZTQvNC+INGW0L3QtNC10LrRgdC4ICjQv9C10YDRiNC40Lkg0YDRltC6ID0gMTAwKQ0KICBtdXRhdGUoZ2RwX2luZGV4ID0gKGdkcF92YWwgLyBmaXJzdChnZHBfdmFsKSkgKiAxMDAsDQogICAgICAgICBlbmVyZ3lfaW5kZXggPSAoZW5lcmd5X3ZhbCAvIGZpcnN0KGVuZXJneV92YWwpKSAqIDEwMCkNCnN0cihlbmVyZ3lfZ2RwX2RhdGEpDQoNCnlfbWluID0gbWluKGVuZXJneV9nZHBfZGF0YSRlbmVyZ3lfaW5kZXgpDQp5X21heCA9IG1heChlbmVyZ3lfZ2RwX2RhdGEkZ2RwX2luZGV4KQ0KDQpwbG90KGVuZXJneV9nZHBfZGF0YSRUSU1FX1BFUklPRCwgZW5lcmd5X2dkcF9kYXRhJGdkcF9pbmRleCwNCiAgICAgeWxpbSA9IGMoeV9taW4seV9tYXgpLA0KICAgICB0eXBlID0gImwiLCBjb2wgPSAiYmx1ZSIsbHdkID0gMiwNCiAgICAgeGF4dCA9ICJuIiwgDQogICAgIHhsYWIgPSAiWWVhciIsIHlsYWIgPSAiSW5kZXggVmFsdWUsIDE5OTUgPSAxMDAlIiwgDQogICAgIG1haW4gPSAiRWNvbm9taWMgR3Jvd3RoIHZzIEVuZXJneSBVc2UgKE5ldGhlcmxhbmRzKSIsDQogICAgICkNCg0KbXRleHQoIlNvdXJjZTogRXVyb3N0YXQiLCBzaWRlID0gMSwgbGluZSA9IDQsIGFkaiA9IDEpDQpsaW5lcyhlbmVyZ3lfZ2RwX2RhdGEkVElNRV9QRVJJT0QsIGVuZXJneV9nZHBfZGF0YSRlbmVyZ3lfaW5kZXgsIGNvbCA9ICJyZWQiLCBsd2QgPSAyKQ0KDQpheGlzLkRhdGUoMSwgYXQgPSBzZXEobWluKGVuZXJneV9nZHBfZGF0YSRUSU1FX1BFUklPRCksIG1heChlbmVyZ3lfZ2RwX2RhdGEkVElNRV9QRVJJT0QpLCBieSA9ICI0IHllYXJzIiksIGZvcm1hdCA9ICIlWSIpDQoNCmxlZ2VuZCgidG9wbGVmdCIsIA0KICAgICAgIGxlZ2VuZCA9IGMoIkdEUCBHcm93dGgiLCAiRW5lcmd5IFVzZSIpLCANCiAgICAgICBjb2wgPSBjKCJibHVlIiwgInJlZCIpLCANCiAgICAgICBsdHkgPSAxLCBsd2QgPSAyLCBjZXggPSAwLjcpDQoNCmdyaWQoKQ0KDQpgYGANCg0KDQoNCiMjIDMuMS4gTmFtZSANCg0KRGVzY3JpcHRpb24NCg0KYGBge3IsIGZpZy5oZWlnaHQ9Nn0NCmxpYnJhcnkoZXVyb3N0YXQpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCg0KIyAyLiDQl9CQ0JLQkNCd0KLQkNCW0JXQndCd0K8g0JTQkNCd0JjQpSANCiMgbnJnX2luZl9lcGMg4oCUINGG0LUg0LrQvtC0INCx0LDQt9C4INC00LDQvdC40YUgRXVyb3N0YXQg0LTQu9GPINC/0L7RgtGD0LbQvdC+0YHRgtC10Lkg0LXQu9C10LrRgtGA0L7RgdGC0LDQvdGG0ZbQuQ0KY2FwYWNpdHlfcmF3IDwtIGdldF9ldXJvc3RhdCgibnJnX2luZl9lcGMiLCB0aW1lX2Zvcm1hdCA9ICJkYXRlIikNCg0KIyAzLiDQntCR0KDQntCR0JrQkCDQlNCQ0J3QmNClDQpjYXBhY2l0eV9mdWxsIDwtIGNhcGFjaXR5X3JhdyAlPiUNCiAgZmlsdGVyKGdlbyA9PSAiTkwiLCANCiAgICAgICAgIHNpZWMgJWluJSBjKCJSQTQyMCIsICJSQTMwMCIsICJOOTAwMCIsICJSQTEwMCIpKSAlPiUgDQogIG11dGF0ZShZZWFyID0gYXMubnVtZXJpYyhmb3JtYXQoVElNRV9QRVJJT0QsICIlWSIpKSwNCiAgICAgICAgIHRlY2ggPSBjYXNlX3doZW4oDQogICAgICAgICAgIHNpZWMgPT0gIlJBNDIwIiB+ICJTb2xhciIsDQogICAgICAgICAgIHNpZWMgPT0gIlJBMzAwIiB+ICJXaW5kIiwNCiAgICAgICAgICAgc2llYyA9PSAiTjkwMDAiIH4gIk51Y2xlYXIiLA0KICAgICAgICAgICBzaWVjID09ICJSQTEwMCIgfiAiSHlkcm8iLA0KICAgICAgICAgICBUUlVFIH4gIk90aGVyIg0KICAgICAgICAgKSkgJT4lDQogIGdyb3VwX2J5KFllYXIsIHRlY2gpICU+JQ0KICBzdW1tYXJpc2UodmFsdWVzID0gc3VtKHZhbHVlcywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB0ZWNoLCB2YWx1ZXNfZnJvbSA9IHZhbHVlcykNCg0KIyA0LiDQn9CV0KDQldCS0IbQoNCa0JAg0KDQldCX0KPQm9Cs0KLQkNCi0KMNCg0KcHJpbnQoItCe0LHRgNC+0LHQu9C10L3QsCDRgtCw0LHQu9C40YbRjyBjYXBhY2l0eV9mdWxsOiIpDQpwcmludChoZWFkKGNhcGFjaXR5X2Z1bGwpKQ0KDQojZ2FzX3ByaWNlc19yYXcgPC0gZ2V0X2V1cm9zdGF0KCJucmdfcGNfMjAyIiwgdGltZV9mb3JtYXQgPSAiZGF0ZSIpDQoNCmdhc19wcmljZXNfY2xlYW4gPC0gZ2FzX3ByaWNlc19yYXcgJT4lDQogIGZpbHRlcihnZW8gPT0gIk5MIiwgDQogICAgICAgICB1bml0ID09ICJLV0giLCANCiAgICAgICAgIHRheCA9PSAiSV9UQVgiLCANCiAgICAgICAgIGN1cnJlbmN5ID09ICJFVVIiKSAlPiUNCiAgbXV0YXRlKFllYXIgPSBhcy5udW1lcmljKGZvcm1hdChUSU1FX1BFUklPRCwgIiVZIikpKSAlPiUNCiAgZ3JvdXBfYnkoWWVhcikgJT4lDQogIHN1bW1hcmlzZShnYXNfcHJpY2UgPSBtZWFuKHZhbHVlcywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICdkcm9wJykNCg0KIyDQntCxJ9GU0LTQvdGD0ZTQvNC+INC30LAg0YDQvtC60L7QvA0KZ2VvX2RhdGFfZmluYWwgPC0gZ2FzX3ByaWNlc19jbGVhbiAlPiUNCiAgaW5uZXJfam9pbihjYXBhY2l0eV9mdWxsLCBieSA9ICJZZWFyIikgJT4lDQogIGZpbHRlcihZZWFyID49IDIwMTgpDQoNCiMg0JTQuNCy0LjQvNC+0YHRjCDRgNC10LfRg9C70YzRgtCw0YINCnByaW50KGdlb19kYXRhX2ZpbmFsKQ0KDQojIDEuINCf0LXRgNC10YDQsNGF0L7QstGD0ZTQvNC+INCy0YHQtSDRgyDQstGW0LTRgdC+0YLQutC4ICjQhtC90LTQtdC60YHQsNGG0ZbRjzogMjAxOCDRgNGW0LogPSAxMDApDQpnZW9fZGF0YV9pbmRleGVkIDwtIGdlb19kYXRhX2ZpbmFsICU+JQ0KICBtdXRhdGUoDQogICAgU29sYXJfaWR4ID0gKFNvbGFyIC8gU29sYXJbWWVhciA9PSAyMDE4XSkgKiAxMDAsDQogICAgV2luZF9pZHggPSAoV2luZCAvIFdpbmRbWWVhciA9PSAyMDE4XSkgKiAxMDAsDQogICAgTnVjbGVhcl9pZHggPSAoTnVjbGVhciAvIE51Y2xlYXJbWWVhciA9PSAyMDE4XSkgKiAxMDAsDQogICAgSHlkcm9faWR4ID0gKEh5ZHJvIC8gSHlkcm9bWWVhciA9PSAyMDE4XSkgKiAxMDAsDQogICAgR2FzX2lkeCA9IChnYXNfcHJpY2UgLyBnYXNfcHJpY2VbWWVhciA9PSAyMDE4XSkgKiAxMDANCiAgKQ0KDQp5X21pbiA9IG1pbihnZW9fZGF0YV9pbmRleGVkJFNvbGFyX2lkeCkNCnlfbWF4ID0gbWF4KGdlb19kYXRhX2luZGV4ZWQkU29sYXJfaWR4KQ0KDQpwbG90KGdlb19kYXRhX2luZGV4ZWQkWWVhciwgZ2VvX2RhdGFfaW5kZXhlZCRTb2xhcl9pZHgsDQogICAgIHlsaW0gPSBjKHlfbWluLHlfbWF4KSwNCiAgICAgdHlwZSA9ICJsIiwgY29sID0gInJlZCIsbHdkID0gMiwNCiAgICAgeGF4dCA9ICJuIiwgDQogICAgIHhsYWIgPSAiWWVhciIsIHlsYWIgPSAiR3Jvd3RoIHJlbGF0aXZlIHRvIDIwMTgsIDIwMTggPSAxMDAlIiwgDQogICAgIG1haW4gPSAiTmV0aGVybGFuZHMgRW5lcmd5IExhbmRzY2FwZSAoMjAxOC0yMDI0KSIsKQ0KDQpncmlkKCkNCm10ZXh0KCJTb3VyY2U6IEV1cm9zdGF0IERhdGEgQW5hbHlzaXMgKDIwMjYpIiwgc2lkZSA9IDEsIGxpbmUgPSA0LCBhZGogPSAxKQ0KDQpsaW5lcyhnZW9fZGF0YV9pbmRleGVkJFllYXIsIGdlb19kYXRhX2luZGV4ZWQkV2luZF9pZHgsIGNvbCA9ICJibHVlIiwgbHdkID0gMikNCmxpbmVzKGdlb19kYXRhX2luZGV4ZWQkWWVhciwgZ2VvX2RhdGFfaW5kZXhlZCRHYXNfaWR4LCBjb2wgPSAibGlnaHRibHVlIiwgbHdkID0gMikNCmxpbmVzKGdlb19kYXRhX2luZGV4ZWQkWWVhciwgZ2VvX2RhdGFfaW5kZXhlZCROdWNsZWFyX2lkeCwgY29sID0gImJsYWNrIiwgbHdkID0gMikNCmxpbmVzKGdlb19kYXRhX2luZGV4ZWQkWWVhciwgZ2VvX2RhdGFfaW5kZXhlZCRIeWRyb19pZHgsIGNvbCA9ICJkYXJrYmx1ZSIsIGx3ZCA9IDIpDQoNCg0KYXhpcygxLCBhdCA9IHNlcShtaW4oZ2VvX2RhdGFfaW5kZXhlZCRZZWFyKSwgbWF4KGdlb19kYXRhX2luZGV4ZWQkWWVhcikpKQ0KDQpsZWdlbmQoInRvcGxlZnQiLCANCiAgICAgICBsZWdlbmQgPSBjKCJTb2xhciIsICJXaW5kIiwiR2FzIFByaWNlIiwiTnVjbGVhciIsIkh5ZHJvIiksIA0KICAgICAgIGNvbCA9IGMoInJlZCIsICJibHVlIiwibGlnaHRibHVlIiwiYmxhY2siLCJkYXJrYmx1ZSIpLCANCiAgICAgICBsdHkgPSAxLCBsd2QgPSAyLCBjZXggPSAwLjcpDQpgYGANCg0KIyMgMy4yLiBOYW1lIA0KDQpEZXNjcmlwdGlvbg0KDQpgYGB7ciwgZmlnLmhlaWdodD02fQ0KbGlicmFyeShldXJvc3RhdCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgMS4g0J7RgtGA0LjQvNCw0L3QvdGPINC00LDQvdC40YUg0Lcg0L/RgNCw0LLQuNC70YzQvdC40LzQuCBJRA0KdGF4X3JhdyA8LSBnZXRfZXVyb3N0YXQoImVudl9hY190YXgiKQ0KDQojIGVudl9hY19lcG5laXMxIOKAlCDQstC40LTQsNGC0LrQuCAo0LfQsNC80ZbRgdGC0YwgZW52X2FjX2V4cDEsINGP0LrQuNC5INCy0LjQtNCw0LLQsNCyINC/0L7QvNC40LvQutGDKQ0KZXhwX3JhdyA8LSBnZXRfZXVyb3N0YXQoImVudl9hY19lcG5laXMxIikNCg0KIyAxLiBQcm9jZXNzaW5nIEVudmlyb25tZW50YWwgVGF4IFJldmVudWVzDQp0YXhfY2xlYW4gPC0gdGF4X3JhdyAlPiUNCiAgZmlsdGVyKGdlbyA9PSAiTkwiLCB1bml0ID09ICJNSU9fRVVSIikgJT4lDQogIG11dGF0ZShZZWFyID0gYXMubnVtZXJpYyhmb3JtYXQoVElNRV9QRVJJT0QsICIlWSIpKSkgJT4lDQogIGdyb3VwX2J5KFllYXIpICU+JQ0KICBzdW1tYXJpc2UodGF4X3JldmVudWUgPSBzdW0odmFsdWVzLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQojIDIuIFByb2Nlc3NpbmcgRW52aXJvbm1lbnRhbCBQcm90ZWN0aW9uIEV4cGVuZGl0dXJlDQojIEhlcmUgd2UgcmVuYW1lIHRoZSB2YXJpYWJsZSB0byB0aGUgZnVsbCB0ZXJtIHlvdSByZXF1ZXN0ZWQNCmV4cF9jbGVhbiA8LSBleHBfcmF3ICU+JQ0KICBmaWx0ZXIoZ2VvID09ICJOTCIsIHVuaXQgPT0gIk1JT19FVVIiKSAlPiUNCiAgbXV0YXRlKFllYXIgPSBhcy5udW1lcmljKGZvcm1hdChUSU1FX1BFUklPRCwgIiVZIikpKSAlPiUNCiAgZ3JvdXBfYnkoWWVhcikgJT4lDQogIHN1bW1hcmlzZShlbnZpcm9ubWVudGFsX3Byb3RlY3Rpb25fZXhwZW5kaXR1cmUgPSBzdW0odmFsdWVzLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gJ2Ryb3AnKQ0KDQp0YXhfY2xlYW4gPC10YXhfY2xlYW4gJT4lDQogIGZpbHRlcihZZWFyID49IDIwMTgsWWVhciA8PSAyMDIyKQ0KDQp5X21pbiA9IG1pbihleHBfY2xlYW4kZW52aXJvbm1lbnRhbF9wcm90ZWN0aW9uX2V4cGVuZGl0dXJlKQ0KeV9tYXggPSBtYXgodGF4X2NsZWFuJHRheF9yZXZlbnVlKSsxMDAwMA0KDQoNCnBsb3QodGF4X2NsZWFuJFllYXIsIHRheF9jbGVhbiR0YXhfcmV2ZW51ZSwNCiAgICAgeWxpbSA9IGMoeV9taW4seV9tYXgpLA0KICAgICB4bGltID0gYygyMDE3LjcsMjAyMi4zKSwNCiAgICAgdHlwZSA9ICJsIiwgY29sID0gInJlZCIsbHdkID0gMiwNCiAgICAgeGF4dCA9ICJuIiwgDQogICAgIHhsYWIgPSAiWWVhciIsIHlsYWIgPSAiQW1vdW50IChNaWxsaW9uIEVVUikiLCANCiAgICAgbWFpbiA9ICJOZXRoZXJsYW5kczogRW52aXJvbm1lbnRhbCBGaXNjYWwgVHJlbmRzIiwpDQoNCnRleHQodGF4X2NsZWFuJFllYXIsIHRheF9jbGVhbiR0YXhfcmV2ZW51ZSwgbGFiZWxzID0gdGF4X2NsZWFuJHRheF9yZXZlbnVlLCBwb3M9MSkNCg0KZ3JpZCgpDQoNCmF4aXMoMSwgYXQgPSBzZXEobWluKHRheF9jbGVhbiksIG1heCh0YXhfY2xlYW4kWWVhcikpKQ0KDQpsZWdlbmQoInRvcGxlZnQiLCANCiAgICAgICBsZWdlbmQgPSBjKCJUYXggUmV2ZW51ZSIsICJFbnZpcm9ubWVudGFsIFByb3RlY3Rpb24gRXhwZW5kaXR1cmUiKSwgDQogICAgICAgY29sID0gYygicmVkIiwgImJsdWUiKSwgDQogICAgICAgbHR5ID0gMSwgbHdkID0gMiwgY2V4ID0gMC43KQ0KDQoNCm10ZXh0KCJTb3VyY2U6IEV1cm9zdGF0IERhdGEgQW5hbHlzaXMgKDIwMjYpIiwgc2lkZSA9IDEsIGxpbmUgPSA0LCBhZGogPSAxKQ0KDQpsaW5lcyhleHBfY2xlYW4kWWVhciwgZXhwX2NsZWFuJGVudmlyb25tZW50YWxfcHJvdGVjdGlvbl9leHBlbmRpdHVyZSwgY29sID0gImJsdWUiLCBsd2QgPSAyKQ0KdGV4dChleHBfY2xlYW4kWWVhciwgZXhwX2NsZWFuJGVudmlyb25tZW50YWxfcHJvdGVjdGlvbl9leHBlbmRpdHVyZSwgbGFiZWxzID0gcm91bmQoZXhwX2NsZWFuJGVudmlyb25tZW50YWxfcHJvdGVjdGlvbl9leHBlbmRpdHVyZSksIHBvcz0zKQ0KDQpgYGANCg0KDQojIyAzLjMuIE5hbWUgDQoNCkRlc2NyaXB0aW9uDQoNCmBgYHtyLCBmaWcuaGVpZ2h0PTZ9DQpsaWJyYXJ5KGV1cm9zdGF0KQ0KbGlicmFyeShkcGx5cikNCg0KcmRfZV9nZXJkdG90X3JhdyA8LSBnZXRfZXVyb3N0YXQoInJkX2VfZ2VyZHRvdCIpDQpzZGdfMDlfNDBfcmF3IDwtIGdldF9ldXJvc3RhdCgic2RnXzA5XzQwIikNCg0KIyAxLiBHZXQgUiZEIERhdGEgKFgtYXhpcyBlcXVpdmFsZW50OiBUaW1lKQ0KcmRfcmVjZW50IDwtIHJkX2VfZ2VyZHRvdF9yYXcgJT4lDQogIG11dGF0ZShZZWFyID0gYXMubnVtZXJpYyhmb3JtYXQoVElNRV9QRVJJT0QsICIlWSIpKSkgJT4lDQogIGZpbHRlcihnZW8gPT0gIk5MIiwgc2VjdHBlcmYgPT0gIlRPVEFMIiwgdW5pdCA9PSAiRVVSX0hBQiIsIFllYXIgPj0gMjAxOCxZZWFyPD0yMDI0KSAlPiUNCiAgc2VsZWN0KFllYXIsIHZhbHVlcykNCg0KIyAyLiBHZXQgUGF0ZW50IERhdGENCnBhdF9yZWNlbnQgPC0gc2RnXzA5XzQwX3JhdyAlPiUNCiAgbXV0YXRlKFllYXIgPSBhcy5udW1lcmljKGZvcm1hdChUSU1FX1BFUklPRCwgIiVZIikpKSAlPiUNCiAgZmlsdGVyKGdlbyA9PSAiTkwiLCB1bml0ID09ICJOUiIsIFllYXIgPj0gMjAxOCxZZWFyPD0yMDI0ICxjb29wX3B0biA9PSAiQVBQTCIgKSAlPiUNCiAgc2VsZWN0KFllYXIsICB2YWx1ZXMpDQoNCg0KeV9taW4gPSBtaW4ocmRfcmVjZW50JHZhbHVlcykNCnlfbWF4ID0gbWF4KHBhdF9yZWNlbnQkdmFsdWVzKSsyMDAwDQoNCnBsb3QocGF0X3JlY2VudCRZZWFyLCBwYXRfcmVjZW50JHZhbHVlcywNCiAgICAgeWxpbSA9IGMoeV9taW4seV9tYXgpLA0KICAgICB4bGltID0gYygyMDE3LjgsMjAyNC4yKSwNCiAgICAgdHlwZSA9ICJsIiwgY29sID0gInJlZCIsbHdkID0gMiwNCiAgICAgeGF4dCA9ICJuIiwgDQogICAgIHhsYWIgPSAiWWVhciIsIHlsYWIgPSAiVmFsdWUgKFVuaXRzIHZhcnkgYnkgaW5kaWNhdG9yKSIsIA0KICAgICBtYWluID0gIk5ldGhlcmxhbmRzOiBJbm5vdmF0aW9uIEluZGljYXRvcnMgKDIwMTgtMjAyMylcbiBZZWFybHkgdHJlbmRzIGluIFImRCBpbnZlc3RtZW50XG4gYW5kIENsaW1hdGUgVGVjaG5vbG9neSBwYXRlbnRzIiwpDQoNCnRleHQocGF0X3JlY2VudCRZZWFyLCBwYXRfcmVjZW50JHZhbHVlcywgbGFiZWxzID0gcGF0X3JlY2VudCR2YWx1ZXMsIHBvcz0xKQ0KDQpncmlkKCkNCg0KYXhpcygxLCBhdCA9IHNlcSgyMDE4LCAyMDI0KSkNCg0KbGVnZW5kKCJ0b3BsZWZ0IiwgDQogICAgICAgbGVnZW5kID0gYygiQ2xpbWF0ZSBUZWNoIFBhdGVudHMgKENvdW50KSIsICJSJkQgRXhwZW5kaXR1cmUgKEVVUi9oYWIpIiksIA0KICAgICAgIGNvbCA9IGMoInJlZCIsICJibHVlIiksIA0KICAgICAgIGx0eSA9IDEsIGx3ZCA9IDIsIGNleCA9IDAuNykNCg0KDQptdGV4dCgiU291cmNlOiBFdXJvc3RhdCBEYXRhIEFuYWx5c2lzICgyMDI2KSIsIHNpZGUgPSAxLCBsaW5lID0gNCwgYWRqID0gMSkNCg0KbGluZXMocmRfcmVjZW50JFllYXIsIHJkX3JlY2VudCR2YWx1ZXMsIGNvbCA9ICJibHVlIiwgbHdkID0gMikNCnRleHQocmRfcmVjZW50JFllYXIsIHJkX3JlY2VudCR2YWx1ZXMsIGxhYmVscyA9IHJvdW5kKHJkX3JlY2VudCR2YWx1ZXMpLCBwb3M9MykNCg0KYGBgDQoNCg0KIyMgNC4xLiBOYW1lIA0KDQpEZXNjcmlwdGlvbg0KDQpgYGB7ciwgZmlnLmhlaWdodD02fQ0KbGlicmFyeShldXJvc3RhdCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgMS4g0JfQsNCy0LDQvdGC0LDQttGD0ZTQvNC+INC00LDQvdGWDQpnZ2VfcmF3IDwtIGdldF9ldXJvc3RhdCgiZW52X2Fpcl9nZ2UiKQ0KDQojIDIuINCk0ZbQu9GM0YLRgNGD0ZTQvNC+INC00LDQvdGWIA0KZ2dlXzIwMjMgPC0gZ2dlX3JhdyAlPiUNCiAgZmlsdGVyKGdlbyA9PSAiTkwiKSAlPiUNCiAgbXV0YXRlKFllYXIgPSBhcy5udW1lcmljKGZvcm1hdChUSU1FX1BFUklPRCwgIiVZIikpKSAlPiUNCiAgIyDQkdC10YDQtdC80L4g0L/QtdGA0ZbQvtC0IDIwMTgtMjAyMw0KICBmaWx0ZXIoWWVhciA+PSAyMDE4ICYgWWVhciA8PSAyMDIzKSAlPiUNCiAgIyDQpNGW0LvRjNGC0YDRg9GU0LzQviDQv9Cw0YDQvdC40LrQvtCy0ZYg0LPQsNC30Lgg0YLQsCDQvtGB0L3QvtCy0L3RliDRgdC10LrRgtC+0YDQuA0KICBmaWx0ZXIoYWlycG9sID09ICJHSEciKSAlPiUNCiAgZmlsdGVyKHNyY19jcmYgJWluJSBjKCJDUkYxQTEiLCAiQ1JGMUEyIiwgIkNSRjFBMyIsICJDUkYxQTQiLCAiQ1JGMyIpKSAlPiUNCiAgIyDQk9GA0YPQv9GD0ZTQvNC+LCDRidC+0LEg0L/RgNC40LHRgNCw0YLQuCDQtNGD0LHQu9GW0LrQsNGC0LgNCiAgZ3JvdXBfYnkoWWVhciwgc3JjX2NyZikgJT4lDQogIHN1bW1hcmlzZSh2YWx1ZXMgPSBtZWFuKHZhbHVlcywgbmEucm0gPSBUUlVFKSwgLmdyb3VwcyA9ICdkcm9wJykNCg0KIyAzLiDQlNC+0LTQsNGU0LzQviDQvdCw0LfQstC4INGB0LXQutGC0L7RgNGW0LINCnNlY3Rvcl9sYWJlbHMgPC0gYygNCiAgIkNSRjFBMSIgPSAiRW5lcmd5IiwNCiAgIkNSRjFBMiIgPSAiSW5kdXN0cnkiLA0KICAiQ1JGMUEzIiA9ICJUcmFuc3BvcnQiLA0KICAiQ1JGMUE0IiA9ICJSZXNpZGVudGlhbCIsDQogICJDUkYzIiAgID0gIkFncmljdWx0dXJlIg0KKQ0KZ2dlXzIwMjMkU2VjdG9yIDwtIHNlY3Rvcl9sYWJlbHNbZ2dlXzIwMjMkc3JjX2NyZl0NCg0KZ2dlXzIwMjNfRW5lcmd5IDwtZ2dlXzIwMjMgJT4lIGZpbHRlcihTZWN0b3I9PSJFbmVyZ3kiKQ0KZ2dlXzIwMjNfSW5kdXN0cnkgPC1nZ2VfMjAyMyAlPiUgZmlsdGVyKFNlY3Rvcj09IkluZHVzdHJ5IikNCmdnZV8yMDIzX1RyYW5zcG9ydCA8LWdnZV8yMDIzICU+JSBmaWx0ZXIoU2VjdG9yPT0iVHJhbnNwb3J0IikNCmdnZV8yMDIzX1Jlc2lkZW50aWFsIDwtZ2dlXzIwMjMgJT4lIGZpbHRlcihTZWN0b3I9PSJSZXNpZGVudGlhbCIpDQpnZ2VfMjAyM19BZ3JpY3VsdHVyZSA8LWdnZV8yMDIzICU+JSBmaWx0ZXIoU2VjdG9yPT0iQWdyaWN1bHR1cmUiKQ0KDQojIDQuINCc0JDQm9Cu0ITQnNCeDQoNCnlfbWluID0gbWluKGdnZV8yMDIzJHZhbHVlcyktMTAwMA0KeV9tYXggPSBtYXgoZ2dlXzIwMjMkdmFsdWVzKSszMDAwDQoNCnBsb3QoZ2dlXzIwMjNfRW5lcmd5JFllYXIsIGdnZV8yMDIzX0VuZXJneSR2YWx1ZXMsDQogICAgIHlsaW0gPSBjKHlfbWluLHlfbWF4KSwNCiAgICAgeGxpbSA9IGMoMjAxNy44LDIwMjMuMiksDQogICAgIHR5cGUgPSAibCIsIGNvbCA9ICJyZWQiLGx3ZCA9IDIsDQogICAgIHhheHQgPSAibiIsIA0KICAgICB4bGFiID0gIlllYXIiLCB5bGFiID0gIlRob3VzYW5kIFRvbm5lcyIsIA0KICAgICBtYWluID0gIk5ldGhlcmxhbmRzIEdIRyBFbWlzc2lvbnMgKDIwMTgtMjAyMylcbiBQcm9ncmVzcyB0b3dhcmRzIGNsaW1hdGUgZ29hbHMgYnkgc2VjdG9yIiwpDQoNCnRleHQoZ2dlXzIwMjNfRW5lcmd5JFllYXIsIGdnZV8yMDIzX0VuZXJneSR2YWx1ZXMsIGxhYmVscyA9IHJvdW5kKGdnZV8yMDIzX0VuZXJneSR2YWx1ZXMpLCBwb3M9MSwgY29sID0gInJlZCIsY2V4PTAuNykNCg0KZ3JpZCgpDQoNCmF4aXMoMSwgYXQgPSBzZXEoMjAxOCwgMjAyMykpDQoNCmxlZ2VuZCgidG9wcmlnaHQiLCANCiAgICAgICBsZWdlbmQgPSBjKCJFbmVyZ3kiLCAiSW5kdXN0cnkiLCJUcmFuc3BvcnQiLCJSZXNpZGVudGlhbCIsIkFncmljdWx0dXJlIiksIA0KICAgICAgIGNvbCA9IGMoInJlZCIsICJibHVlIiwidmlvbGV0Iiwib3JhbmdlIiwiZ3JlZW4iKSwgDQogICAgICAgbHR5ID0gMSwgbHdkID0gMiwgY2V4ID0gMC43KQ0KDQoNCm10ZXh0KCJTb3VyY2U6IEV1cm9zdGF0IERhdGEgQW5hbHlzaXMgKDIwMjYpIiwgc2lkZSA9IDEsIGxpbmUgPSA0LCBhZGogPSAxKQ0KDQpsaW5lcyhnZ2VfMjAyM19JbmR1c3RyeSRZZWFyLCBnZ2VfMjAyM19JbmR1c3RyeSR2YWx1ZXMsIGNvbCA9ICJibHVlIiwgbHdkID0gMikNCnRleHQoZ2dlXzIwMjNfSW5kdXN0cnkkWWVhciwgZ2dlXzIwMjNfSW5kdXN0cnkkdmFsdWVzLCBsYWJlbHMgPSByb3VuZChnZ2VfMjAyM19JbmR1c3RyeSR2YWx1ZXMpLCBwb3M9MyxjZXggPSAwLjcsIGNvbCA9ICJibHVlIikNCg0KbGluZXMoZ2dlXzIwMjNfVHJhbnNwb3J0JFllYXIsIGdnZV8yMDIzX1RyYW5zcG9ydCR2YWx1ZXMsIGNvbCA9ICJ2aW9sZXQiLCBsd2QgPSAyKQ0KdGV4dChnZ2VfMjAyM19UcmFuc3BvcnQkWWVhciwgZ2dlXzIwMjNfVHJhbnNwb3J0JHZhbHVlcywgbGFiZWxzID0gcm91bmQoZ2dlXzIwMjNfVHJhbnNwb3J0JHZhbHVlcyksIHBvcz0xLGNleCA9IDAuNywgY29sID0gInZpb2xldCIpDQpsaW5lcyhnZ2VfMjAyM19SZXNpZGVudGlhbCRZZWFyLCBnZ2VfMjAyM19SZXNpZGVudGlhbCR2YWx1ZXMsIGNvbCA9ICJvcmFuZ2UiLCBsd2QgPSAyKQ0KdGV4dChnZ2VfMjAyM19SZXNpZGVudGlhbCRZZWFyLCBnZ2VfMjAyM19SZXNpZGVudGlhbCR2YWx1ZXMsIGxhYmVscyA9IHJvdW5kKGdnZV8yMDIzX1Jlc2lkZW50aWFsJHZhbHVlcyksIHBvcz0zICxjZXggPSAwLjcsIGNvbCA9ICJvcmFuZ2UiKQ0KbGluZXMoZ2dlXzIwMjNfQWdyaWN1bHR1cmUkWWVhciwgZ2dlXzIwMjNfQWdyaWN1bHR1cmUkdmFsdWVzLCBjb2wgPSAiZ3JlZW4iLCBsd2QgPSAyKQ0KdGV4dChnZ2VfMjAyM19BZ3JpY3VsdHVyZSRZZWFyLCBnZ2VfMjAyM19BZ3JpY3VsdHVyZSR2YWx1ZXMsIGxhYmVscyA9IHJvdW5kKGdnZV8yMDIzX0FncmljdWx0dXJlJHZhbHVlcyksIHBvcz0xLGNleCA9IDAuNyxjb2wgPSAiZ3JlZW4iKQ0KDQoNCmBgYA0KDQoNCiMjIDUuMS4gTmFtZSANCg0KRGVzY3JpcHRpb24NCg0KYGBge3IsIGZpZy5oZWlnaHQ9Nn0NCmxpYnJhcnkoZXVyb3N0YXQpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojINCX0JDQktCQ0J3QotCQ0JbQldCd0J3QryANCmdlX3JhdyA8LSBnZXRfZXVyb3N0YXQoImVudl9haXJfZ2dlIikNCg0KZ2VfY2xlYW4gPC0gZ2VfcmF3ICU+JQ0KICBmaWx0ZXIoZ2VvID09ICJOTCIsIGFpcnBvbCA9PSAiR0hHIiwgdW5pdCA9PSAiVEhTX1QiKSAlPiUNCiAgbXV0YXRlKFllYXIgPSBhcy5udW1lcmljKGZvcm1hdChUSU1FX1BFUklPRCwgIiVZIikpKSAlPiUNCiAgZmlsdGVyKFllYXIgJWluJSAyMDE4OjIwMjMpDQoNCiMg0KHRgtCy0L7RgNC10L3QvdGPINC60LDRgtC10LPQvtGA0ZbQuSDRgtCwINCz0YDRg9C/0YPQstCw0L3QvdGPDQpjb21wYXJlX2RmIDwtIGdlX2NsZWFuICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIk1FTU8iLCBzcmNfY3JmKSkgJT4lDQogIG11dGF0ZShJbmRpY2F0b3IgPSBjYXNlX3doZW4oDQogICAgZ3JlcGwoIlg0fFhMIiwgc3JjX2NyZikgfiAiRXhjbCIsDQogICAgVFJVRSB+ICJJbmNsIg0KICApKSAlPiUNCiAgZ3JvdXBfYnkoWWVhciwgSW5kaWNhdG9yKSAlPiUNCiAgc3VtbWFyaXNlKHZhbHVlcyA9IG1lYW4odmFsdWVzLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gJ2Ryb3AnKQ0KIyDQoNCw0YXRg9GU0LzQviDQvNCw0YLQtdC80LDRgtC40LrRgyDQv9C10YDQtdC0INCz0YDQsNGE0ZbQutC+0LwNCmFuYWx5c2lzX2RhdGEgPC0gY29tcGFyZV9kZiAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBJbmRpY2F0b3IsIHZhbHVlc19mcm9tID0gdmFsdWVzKQ0KDQpjb3JyZWxhdGlvbiA8LSBjb3IoYW5hbHlzaXNfZGF0YSRFeGNsLCBhbmFseXNpc19kYXRhJEluY2wpDQpyZWdfc3VtbWFyeSA8LSBzdW1tYXJ5KGxtKEluY2wgfiBFeGNsLCBkYXRhID0gYW5hbHlzaXNfZGF0YSkpDQoNCg0KIyDQoNC+0LfQtNGW0LvQtdC90L3RjyDQtNCw0L3QuNGFDQpleGNsIDwtIHN1YnNldChjb21wYXJlX2RmLCBJbmRpY2F0b3IgPT0gIkV4Y2wiKQ0KaW5jbCA8LSBzdWJzZXQoY29tcGFyZV9kZiwgSW5kaWNhdG9yID09ICJJbmNsIikNCg0KIyDQktGW0LTRgdGC0YPQv9C4DQp4X3BhZCA8LSAwLjMNCnlfcGFkIDwtIGRpZmYocmFuZ2UoY29tcGFyZV9kZiR2YWx1ZXMpKSAqIDAuMDUNCg0KIyDQn9C+0LvRjyDQtNC70Y8gbGVnZW5kL2NhcHRpb24NCnBhcihtYXIgPSBjKDcsNCw1LDIpKQ0KDQoNCnlfbWluID0gbWluKGV4Y2wkdmFsdWVzKS0xMDAwDQp5X21heCA9IG1heChleGNsJHZhbHVlcykrMzAwMA0KDQojINCe0YHQvdC+0LLQvdC40Lkg0LPRgNCw0YTRltC6DQpwbG90KGV4Y2wkWWVhciwgZXhjbCR2YWx1ZXMsDQogICAgIHhsaW0gPSBjKDIwMTgsMjAyMyksDQogICAgIHlsaW0gPSBjKHlfbWluLHlfbWF4KSwNCiAgICAgdHlwZSA9ICJvIiwgcGNoID0gMTYsIGx3ZCA9IDIsDQogICAgIGNvbCA9ICJyZWQiLA0KICAgICBtYWluID0gIkNvbXBhcmlzb24gb2YgRW1pc3Npb25zOiBUb3RhbCB2cy4gVG90YWwgd2l0aCBMVUxVQ0YiLA0KICAgICBzdWIgPSBwYXN0ZTAoIkNvcnJlbGF0aW9uOiAiLHJvdW5kKGNvcnJlbGF0aW9uLCA0KSwiIHwgUsKyOiAiLHJvdW5kKHJlZ19zdW1tYXJ5JHIuc3F1YXJlZCwgNCkgICAgICksDQogICAgIHhsYWIgPSAiWWVhciIsICB5bGFiID0gIlRob3VzYW5kIFRvbm5lcyAoQ08yIGVxLikiLA0KICAgICBjb2wuc3ViID0gImdyZXkzMCIpDQoNCg0KZ3JpZCgpDQojINCS0LvQsNGB0L3QsCDQstGW0YHRjCBYDQpheGlzKDEsIGF0ID0gc2VxKDIwMTgsIDIwMjMpKQ0KDQojINCU0YDRg9Cz0LAg0LvRltC90ZbRjw0KbGluZXMoaW5jbCRZZWFyLCBpbmNsJHZhbHVlcywgdHlwZSA9ICJvIiwgcGNoID0gMTYsbHdkID0gMiwgY29sID0gImJsdWUiKQ0KDQojINCb0ZbQvdGW0Y8g0YLRgNC10L3QtNGDINC00LvRjyBFeGNsDQphYmxpbmUobG0odmFsdWVzIH4gWWVhciwgZGF0YSA9IGV4Y2wpLGNvbCA9ICJyZWQiLGx0eSA9IDIsICBsd2QgPSAxKQ0KDQojINCb0ZbQvdGW0Y8g0YLRgNC10L3QtNGDINC00LvRjyBJbmNsDQphYmxpbmUobG0odmFsdWVzIH4gWWVhciwgZGF0YSA9IGluY2wpLGNvbCA9ICJibHVlIiwgIGx0eSA9IDIsICBsd2QgPSAxKQ0KDQojINCb0LXQs9C10L3QtNCwDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiVG90YWwgKEV4Y2wuIExVTFVDRikiLCJUb3RhbCAoSW5jbC4gTFVMVUNGKSIpLA0KICAgICAgIGNvbCA9IGMoInJlZCIsICJibHVlIiksDQogICAgICAgbHR5ID0gMSwgbHdkID0gMiwgcGNoID0gMTYsIGNleCA9IDAuNykNCg0KIyBDYXB0aW9uDQptdGV4dCggICJTb3VyY2U6IEV1cm9zdGF0IFtlbnZfYWlyX2dnZV0gfCBEYXNoZWQgbGluZXMgcmVwcmVzZW50IGxpbmVhciB0cmVuZHMiLA0KICBzaWRlID0gMSwgIGxpbmUgPSA1LCAgY2V4ID0gMC44LCAgY29sID0gImdyZXk0MCINCikNCg0KDQpgYGANCg0K