1 Zakład Bioinformatyki, Instytut Informatyki, Uniwersytet w Białymstoku

Correspondence: Jarosław Kotowicz <>

1 Zajęcia grupa 2

1.1 Czyszczeni środowiska

rm(list = ls())

1.2 Podczytanie bibliotek

library(tidyverse)
library(readxl)

1.3 Podczytanie danych pobranych z bdl GUS

mieszkania <- read_excel("GOSP_2909_XPIV_20200428091111.xlsx", 
                         sheet = "DANE")
mieszkania <- mieszkania[,-c(6:7)]
library(tidyverse)

1.4 Określenie kodu na województwa podlaskiego

mieszkania[which(str_detect(mieszkania$Nazwa, "Białystok")),]

1.5 Przekształcenia danych

1.5.1 Tworzenie nowych zmiennych związanych z kodem jednostki i nazwy

m_podlaskie <- mieszkania %>%
  filter(str_sub(Kod, start = 1, end = 2) == "20") %>%
  mutate(Kod.Gminy = str_sub(Kod, start = 1, end = 6),
         Typ.Gminy = str_sub(Kod, start = 7, end = 7),
         Nazwa.Oryginalna = Nazwa)

1.5.2 Dalsze zmiany np. zamiana kodu rodzaju gminy na nazwę

m_podlaskie_gm <- m_podlaskie %>%
  filter(Typ.Gminy %in% c(1:3)) %>%
  mutate(Typ.Gminy = str_replace(Typ.Gminy, "1", "miejska"),
         Typ.Gminy = str_replace(Typ.Gminy, "2", "wiejska"),
         Typ.Gminy = str_replace(Typ.Gminy, "3", "miejsko-wiejska"),
         Nazwa = trimws(str_remove_all(Nazwa, "[[:punct:]]\\d[[:punct:]]"))) %>%
  arrange(Nazwa, Typ.Gminy)

1.5.3 Wskazanie gmin wiejskich o identycznych nazwach, jak gminy miejskie np. Augustów

m_podlaskie_s <- m_podlaskie_gm %>%
  group_by(Nazwa) %>%
  summarise(m_w = n())
m_podlaskie_gm <- m_podlaskie_s %>%
  left_join(m_podlaskie_gm) %>%
  ungroup() %>%
  mutate(Typ.Gminy.Nowy = ifelse(m_w == 2 & Typ.Gminy == "wiejska", "(rural)", ""),
         Nazwa = trimws(paste0(Nazwa, " ", Typ.Gminy.Nowy)))  %>%
  select(Nazwa, Nazwa.Oryginalna, Kod, Kod.Gminy, Typ.Gminy, Wartosc)
Joining, by = "Nazwa"
colnames(m_podlaskie_gm)[length(m_podlaskie_gm)] <- "2017.Budynki.Mieszkalne"

1.6 Podczytanie konturów

library(sf)
gadm_3sf <- readRDS("dane/gadm36_POL_3_sf.rds")
g_podlaskie <- gadm_3sf %>%
  filter(NAME_1 == "Podlaskie") %>%
  arrange(NAME_3)

1.7 Łącznie danych z bdl i konturów

m_podlaskie_gm <- m_podlaskie_gm %>%
  mutate(NAME_3 = g_podlaskie$NAME_3)

1.8 Ilustracja graficzna danych na mapie

g_podlaskie %>%
  left_join(m_podlaskie_gm) %>% 
  ggplot() +
  geom_sf(aes(fill = `2017.Budynki.Mieszkalne`)) +
  scale_fill_gradient(low = "navajowhite", high = "navajowhite4") +
  theme_bw() +
  theme(axis.line = element_blank(), 
        panel.border = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid.major = element_blank(), 
        plot.title = element_text(hjust = 0.5, size = rel(1.2))) +
  labs(title = "Liczba budunków mieszkanych w gminach województwa podlaskiego",
       subtitle = "Stan na 31.12.2017r.",
       caption = "Źródło: opracowanie własne na podstawie danych z bdl GUS.")
Joining, by = "NAME_3"

2 Zajęcia grupa 1

2.1 Podczytanie danych

mieszkania <- read_excel("dane/GOSP_2909_XPIV_20200428103913.xlsx", 
                         sheet = "DANE")
mieszkania <- mieszkania[,-c(6,7)]
mieszkania <- mieszkania %>%
  mutate(Nazwa.old = Nazwa) %>%
  select(Kod:Nazwa, Nazwa.old, `Budynki mieszkalne`:Wartosc )
mieszkania[which(str_detect(mieszkania$Nazwa, "Białystok")),]
sum(str_detect(mieszkania$Kod, "20"))
[1] 102
mieszkania_podlaskie <- mieszkania %>%
  filter(str_sub(Kod, start = 1, end = 2) == "20")
gadm_2sf <- readRDS("dane/gadm36_POL_2_sf.rds")
names(gadm_2sf)
 [1] "GID_0"     "NAME_0"    "GID_1"     "NAME_1"    "NL_NAME_1" "GID_2"     "NAME_2"    "VARNAME_2" "NL_NAME_2"
[10] "TYPE_2"    "ENGTYPE_2" "CC_2"      "HASC_2"    "geometry" 
gadm_2sf$NAME_0 %>% head()
[1] "Poland" "Poland" "Poland" "Poland" "Poland" "Poland"
gadm_2sf$NAME_1 %>% head()
[1] "Dolnośląskie" "Dolnośląskie" "Dolnośląskie" "Dolnośląskie" "Dolnośląskie" "Dolnośląskie"
gadm_2sf$NAME_2 %>% tail
[1] "Świdwin"           "Świnoujście"       "Szczecin"          "Szczecinek"        "Wałcz"            
[6] "Zalew Szczeciński"
gadm_2sf_podlaskie <- gadm_2sf %>%
  filter(gadm_2sf$NAME_1 == "Podlaskie")
gadm_2sf_podlaskie$NAME_2
 [1] "Augustów"            "Białystok"           "Białystok (City)"    "Bielsk"              "Grajewo"            
 [6] "Hajnówka"            "Kolno"               "Łomża"               "Łomża (City)"        "Mońki"              
[11] "Sejny"               "Siemiatycze"         "Sokółka"             "Suwałki"             "Suwałki (City)"     
[16] "Wysokie Mazowieckie" "Zambrów"            
powiaty_angielskie <- gadm_2sf_podlaskie$NAME_2
powiaty_angielskie
 [1] "Augustów"            "Białystok"           "Białystok (City)"    "Bielsk"              "Grajewo"            
 [6] "Hajnówka"            "Kolno"               "Łomża"               "Łomża (City)"        "Mońki"              
[11] "Sejny"               "Siemiatycze"         "Sokółka"             "Suwałki"             "Suwałki (City)"     
[16] "Wysokie Mazowieckie" "Zambrów"            
mieszkania_podlaskie <- mieszkania_podlaskie %>%
  mutate(Nazwa = str_remove(Nazwa, "Powiat "))
mieszkania_podlaskie <- mieszkania_podlaskie %>%
  mutate(Nazwa = str_remove(Nazwa, "m\\."))
mieszkania_podlaskie <- mieszkania_podlaskie %>%
  arrange(Nazwa)
mieszkania_podlaskie$Nazwa
 [1] "augustowski"      "białostocki"      "Białystok"        "bielski"          "grajewski"       
 [6] "hajnowski"        "kolneński"        "Łomża"            "łomżyński"        "moniecki"        
[11] "sejneński"        "siemiatycki"      "sokólski"         "suwalski"         "Suwałki"         
[16] "wysokomazowiecki" "zambrowski"      
powiaty_angielskie
 [1] "Augustów"            "Białystok"           "Białystok (City)"    "Bielsk"              "Grajewo"            
 [6] "Hajnówka"            "Kolno"               "Łomża"               "Łomża (City)"        "Mońki"              
[11] "Sejny"               "Siemiatycze"         "Sokółka"             "Suwałki"             "Suwałki (City)"     
[16] "Wysokie Mazowieckie" "Zambrów"            
w0107 <- slice(mieszkania_podlaskie, 1:7) 
w1017 <- slice(mieszkania_podlaskie, 10:17) 
mieszkania_podlaskie <- bind_rows(w0107, slice(mieszkania_podlaskie, 9)) %>%
  bind_rows(slice(mieszkania_podlaskie, 8)) %>%
  bind_rows(w1017)
mieszkania_podlaskie <- mieszkania_podlaskie %>%
  mutate(NAME_2 = powiaty_angielskie)
powiaty_angielskie
 [1] "Augustów"            "Białystok"           "Białystok (City)"    "Bielsk"              "Grajewo"            
 [6] "Hajnówka"            "Kolno"               "Łomża"               "Łomża (City)"        "Mońki"              
[11] "Sejny"               "Siemiatycze"         "Sokółka"             "Suwałki"             "Suwałki (City)"     
[16] "Wysokie Mazowieckie" "Zambrów"            
mieszkania_podlaskie$Nazwa
 [1] "augustowski"      "białostocki"      "Białystok"        "bielski"          "grajewski"       
 [6] "hajnowski"        "kolneński"        "łomżyński"        "Łomża"            "moniecki"        
[11] "sejneński"        "siemiatycki"      "sokólski"         "suwalski"         "Suwałki"         
[16] "wysokomazowiecki" "zambrowski"      
test <- gadm_2sf_podlaskie %>%
  left_join(mieszkania_podlaskie)
Joining, by = "NAME_2"
colnames(gadm_2sf_podlaskie)
 [1] "GID_0"     "NAME_0"    "GID_1"     "NAME_1"    "NL_NAME_1" "GID_2"     "NAME_2"    "VARNAME_2" "NL_NAME_2"
[10] "TYPE_2"    "ENGTYPE_2" "CC_2"      "HASC_2"    "geometry" 
colnames(test)
 [1] "GID_0"              "NAME_0"             "GID_1"              "NAME_1"             "NL_NAME_1"         
 [6] "GID_2"              "NAME_2"             "VARNAME_2"          "NL_NAME_2"          "TYPE_2"            
[11] "ENGTYPE_2"          "CC_2"               "HASC_2"             "Kod"                "Nazwa"             
[16] "Nazwa.old"          "Budynki mieszkalne" "Rok"                "Wartosc"            "geometry"          

2.2 Ilustracja graficzna

library(cartography)
test %>% ggplot() +
  geom_sf(aes(fill = Wartosc)) +
  scale_fill_gradient(low = "grey90", high = "grey30") +
  theme_bw() +
  theme(axis.line = element_blank(), 
        panel.border = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid.major = element_blank(), 
        plot.title = element_text(hjust = 0.5, size = rel(1.2))) +
  labs(title = "Liczba budunków mieszkanych w powiatach województwo podlaskiego",
       subtitle = "Stan na 31.12.2018r.",
       caption = "Źródło: opracowanie własne na podstawie danych z bdl GUS.")

test %>% ggplot() +
  geom_sf(aes(fill = as.factor(Wartosc))) +
  scale_fill_manual(values = carto.pal(pal1 = "red.pal", n1 = 17)) +
  theme_bw() +
  theme(axis.line = element_blank(), 
        panel.border = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid.major = element_blank(), 
        plot.title = element_text(hjust = 0.5, size = rel(1.2))) +
  labs(title = "Liczba budunków mieszkanych w powiatach województwo podlaskiego",
       subtitle = "Stan na 31.12.2018r.",
       caption = "Źródło: opracowanie własne na podstawie danych z bdl GUS.",
       fill = "Liczba budunków")

test_01 <- test %>%
  as.data.frame() %>%
  select(Nazwa, Nazwa.old, NAME_2, Wartosc)
test_01
mieszkania %>%
  filter(str_locate(Kod, "20")[,1] == 1 & is.na(str_locate(Kod, "20")[,1])==FALSE)
#detach(package:readxl)

#detach(package:tidyverse)
#detach(package:ggplot2)
#detach(package:tibble)
#detach(package:tidyr)
#detach(package:readr)
#detach(package:purrr)
#detach(package:dplyr)
#detach(package:stringr)
#detach(package:forcats)

#detach(package:sf)
LS0tDQp0aXRsZTogIkluZm9ybWF0eWthIGVrb25vbWljem5hIChraWVydW5layBpbmZvcm1hdHlrYSBpIGVrb25vbWV0cmlhKSAtIGxhYm9yYXRvcml1bSA5IGkgMTAiDQpzdWJ0aXRsZTogIlByemVrc3p0YcWCYW5pZSBkYW55Y2ggaSByeXNvd2FuaWUgbWFwIGlsdXN0cnVqxIV5Y2ggZGFuZSINCmF1dGhvcjoNCi0gSmFyb3PFgmF3IEtvdG93aWN6Og0KICAgIGNvcnJlc3BvbmRlbmNlOiBubw0KICAgIGVtYWlsOiBqLmtvdG93aWN6QHV3Yi5lZHUucGwNCiAgICBpbnN0aXR1dGU6IElJVXdCDQpkYXRlOiAiMjgga3dpZXRuaWEgaSA1IG1hamEgMjAyMCByLiINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgaGlnaGxpZ2h0OiBoYWRkb2NrDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBwYW5kb2NfYXJnczoNCiAgICAtIC0tbHVhLWZpbHRlcj1zY2hvbGFybHktbWV0YWRhdGEubHVhDQogICAgLSAtLWx1YS1maWx0ZXI9YXV0aG9yLWluZm8tYmxvY2tzLmx1YQ0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQppbnN0aXR1dGU6DQotIElJVXdCOiBaYWvFgmFkIEJpb2luZm9ybWF0eWtpLCBJbnN0eXR1dCBJbmZvcm1hdHlraSwgVW5pd2Vyc3l0ZXQgdyBCaWHFgnltc3Rva3UNCmNzbDogYmlnLWRhdGEtYW5kLWluZm9ybWF0aW9uLWFuYWx5dGljcy5jc2wNCmFsd2F5c19hbGxvd19odG1sOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIFphasSZY2lhIGdydXBhIDIgDQoNCiMjIEN6eXN6Y3plbmkgxZtyb2Rvd2lza2ENCmBgYHtyfQ0Kcm0obGlzdCA9IGxzKCkpDQpgYGANCg0KIyMgUG9kY3p5dGFuaWUgYmlibGlvdGVrDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpgYGANCg0KIyMgUG9kY3p5dGFuaWUgZGFueWNoIHBvYnJhbnljaCB6IGJkbCBHVVMNCmBgYHtyfQ0KbWllc3prYW5pYSA8LSByZWFkX2V4Y2VsKCJHT1NQXzI5MDlfWFBJVl8yMDIwMDQyODA5MTExMS54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiREFORSIpDQptaWVzemthbmlhIDwtIG1pZXN6a2FuaWFbLC1jKDY6NyldDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KDQojIyBPa3JlxZtsZW5pZSBrb2R1IG5hIHdvamV3w7NkenR3YSBwb2RsYXNraWVnbw0KYGBge3J9DQptaWVzemthbmlhW3doaWNoKHN0cl9kZXRlY3QobWllc3prYW5pYSROYXp3YSwgIkJpYcWCeXN0b2siKSksXQ0KYGBgDQoNCiMjIFByemVrc3p0YcWCY2VuaWEgZGFueWNoDQojIyMgVHdvcnplbmllIG5vd3ljaCB6bWllbm55Y2ggendpxIV6YW55Y2ggeiBrb2RlbSBqZWRub3N0a2kgaSBuYXp3eQ0KYGBge3J9DQptX3BvZGxhc2tpZSA8LSBtaWVzemthbmlhICU+JQ0KICBmaWx0ZXIoc3RyX3N1YihLb2QsIHN0YXJ0ID0gMSwgZW5kID0gMikgPT0gIjIwIikgJT4lDQogIG11dGF0ZShLb2QuR21pbnkgPSBzdHJfc3ViKEtvZCwgc3RhcnQgPSAxLCBlbmQgPSA2KSwNCiAgICAgICAgIFR5cC5HbWlueSA9IHN0cl9zdWIoS29kLCBzdGFydCA9IDcsIGVuZCA9IDcpLA0KICAgICAgICAgTmF6d2EuT3J5Z2luYWxuYSA9IE5hendhKQ0KYGBgDQoNCiMjIyBEYWxzemUgem1pYW55IG5wLiB6YW1pYW5hIGtvZHUgcm9kemFqdSBnbWlueSBuYSBuYXp3xJkNCmBgYHtyfQ0KbV9wb2RsYXNraWVfZ20gPC0gbV9wb2RsYXNraWUgJT4lDQogIGZpbHRlcihUeXAuR21pbnkgJWluJSBjKDE6MykpICU+JQ0KICBtdXRhdGUoVHlwLkdtaW55ID0gc3RyX3JlcGxhY2UoVHlwLkdtaW55LCAiMSIsICJtaWVqc2thIiksDQogICAgICAgICBUeXAuR21pbnkgPSBzdHJfcmVwbGFjZShUeXAuR21pbnksICIyIiwgIndpZWpza2EiKSwNCiAgICAgICAgIFR5cC5HbWlueSA9IHN0cl9yZXBsYWNlKFR5cC5HbWlueSwgIjMiLCAibWllanNrby13aWVqc2thIiksDQogICAgICAgICBOYXp3YSA9IHRyaW13cyhzdHJfcmVtb3ZlX2FsbChOYXp3YSwgIltbOnB1bmN0Ol1dXFxkW1s6cHVuY3Q6XV0iKSkpICU+JQ0KICBhcnJhbmdlKE5hendhLCBUeXAuR21pbnkpDQpgYGANCg0KIyMjIFdza2F6YW5pZSBnbWluIHdpZWpza2ljaCBvIGlkZW50eWN6bnljaCBuYXp3YWNoLCBqYWsgZ21pbnkgbWllanNraWUgbnAuIEF1Z3VzdMOzdw0KYGBge3J9DQptX3BvZGxhc2tpZV9zIDwtIG1fcG9kbGFza2llX2dtICU+JQ0KICBncm91cF9ieShOYXp3YSkgJT4lDQogIHN1bW1hcmlzZShtX3cgPSBuKCkpDQpgYGANCg0KYGBge3J9DQptX3BvZGxhc2tpZV9nbSA8LSBtX3BvZGxhc2tpZV9zICU+JQ0KICBsZWZ0X2pvaW4obV9wb2RsYXNraWVfZ20pICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIG11dGF0ZShUeXAuR21pbnkuTm93eSA9IGlmZWxzZShtX3cgPT0gMiAmIFR5cC5HbWlueSA9PSAid2llanNrYSIsICIocnVyYWwpIiwgIiIpLA0KICAgICAgICAgTmF6d2EgPSB0cmltd3MocGFzdGUwKE5hendhLCAiICIsIFR5cC5HbWlueS5Ob3d5KSkpICAlPiUNCiAgc2VsZWN0KE5hendhLCBOYXp3YS5PcnlnaW5hbG5hLCBLb2QsIEtvZC5HbWlueSwgVHlwLkdtaW55LCBXYXJ0b3NjKQ0KYGBgDQoNCmBgYHtyfQ0KY29sbmFtZXMobV9wb2RsYXNraWVfZ20pW2xlbmd0aChtX3BvZGxhc2tpZV9nbSldIDwtICIyMDE3LkJ1ZHlua2kuTWllc3prYWxuZSINCmBgYA0KDQojIyBQb2Rjenl0YW5pZSBrb250dXLDs3cNCmBgYHtyfQ0KbGlicmFyeShzZikNCmBgYA0KDQpgYGB7cn0NCmdhZG1fM3NmIDwtIHJlYWRSRFMoImRhbmUvZ2FkbTM2X1BPTF8zX3NmLnJkcyIpDQpgYGANCg0KYGBge3J9DQpnX3BvZGxhc2tpZSA8LSBnYWRtXzNzZiAlPiUNCiAgZmlsdGVyKE5BTUVfMSA9PSAiUG9kbGFza2llIikgJT4lDQogIGFycmFuZ2UoTkFNRV8zKQ0KYGBgDQoNCiMjIMWBxIVjem5pZSBkYW55Y2ggeiBiZGwgaSBrb250dXLDs3cNCmBgYHtyfQ0KbV9wb2RsYXNraWVfZ20gPC0gbV9wb2RsYXNraWVfZ20gJT4lDQogIG11dGF0ZShOQU1FXzMgPSBnX3BvZGxhc2tpZSROQU1FXzMpDQpgYGANCg0KIyMgSWx1c3RyYWNqYSBncmFmaWN6bmEgZGFueWNoIG5hIG1hcGllDQpgYGB7ciBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9DQpnX3BvZGxhc2tpZSAlPiUNCiAgbGVmdF9qb2luKG1fcG9kbGFza2llX2dtKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGAyMDE3LkJ1ZHlua2kuTWllc3prYWxuZWApKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gIm5hdmFqb3doaXRlIiwgaGlnaCA9ICJuYXZham93aGl0ZTQiKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSByZWwoMS4yKSkpICsNCiAgbGFicyh0aXRsZSA9ICJMaWN6YmEgYnVkdW5rw7N3IG1pZXN6a2FueWNoIHcgZ21pbmFjaCB3b2pld8OzZHp0d2EgcG9kbGFza2llZ28iLA0KICAgICAgIHN1YnRpdGxlID0gIlN0YW4gbmEgMzEuMTIuMjAxN3IuIiwNCiAgICAgICBjYXB0aW9uID0gIsW5csOzZMWCbzogb3ByYWNvd2FuaWUgd8WCYXNuZSBuYSBwb2RzdGF3aWUgZGFueWNoIHogYmRsIEdVUy4iKQ0KYGBgDQojIFphasSZY2lhIGdydXBhIDENCg0KIyMgUG9kY3p5dGFuaWUgZGFueWNoDQpgYGB7cn0NCm1pZXN6a2FuaWEgPC0gcmVhZF9leGNlbCgiZGFuZS9HT1NQXzI5MDlfWFBJVl8yMDIwMDQyODEwMzkxMy54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiREFORSIpDQptaWVzemthbmlhIDwtIG1pZXN6a2FuaWFbLC1jKDYsNyldDQpgYGANCg0KYGBge3J9DQptaWVzemthbmlhIDwtIG1pZXN6a2FuaWEgJT4lDQogIG11dGF0ZShOYXp3YS5vbGQgPSBOYXp3YSkgJT4lDQogIHNlbGVjdChLb2Q6TmF6d2EsIE5hendhLm9sZCwgYEJ1ZHlua2kgbWllc3prYWxuZWA6V2FydG9zYyApDQptaWVzemthbmlhW3doaWNoKHN0cl9kZXRlY3QobWllc3prYW5pYSROYXp3YSwgIkJpYcWCeXN0b2siKSksXQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtKHN0cl9kZXRlY3QobWllc3prYW5pYSRLb2QsICIyMCIpKQ0KYGBgDQoNCmBgYHtyfQ0KbWllc3prYW5pYV9wb2RsYXNraWUgPC0gbWllc3prYW5pYSAlPiUNCiAgZmlsdGVyKHN0cl9zdWIoS29kLCBzdGFydCA9IDEsIGVuZCA9IDIpID09ICIyMCIpDQpgYGANCg0KYGBge3J9DQpnYWRtXzJzZiA8LSByZWFkUkRTKCJkYW5lL2dhZG0zNl9QT0xfMl9zZi5yZHMiKQ0KYGBgDQoNCmBgYHtyfQ0KbmFtZXMoZ2FkbV8yc2YpDQpgYGANCg0KYGBge3J9DQpnYWRtXzJzZiROQU1FXzAgJT4lIGhlYWQoKQ0KYGBgDQoNCmBgYHtyfQ0KZ2FkbV8yc2YkTkFNRV8xICU+JSBoZWFkKCkNCmBgYA0KDQpgYGB7cn0NCmdhZG1fMnNmJE5BTUVfMiAlPiUgdGFpbA0KYGBgDQoNCmBgYHtyfQ0KZ2FkbV8yc2ZfcG9kbGFza2llIDwtIGdhZG1fMnNmICU+JQ0KICBmaWx0ZXIoZ2FkbV8yc2YkTkFNRV8xID09ICJQb2RsYXNraWUiKQ0KYGBgDQoNCmBgYHtyfQ0KZ2FkbV8yc2ZfcG9kbGFza2llJE5BTUVfMg0KYGBgDQoNCmBgYHtyfQ0KcG93aWF0eV9hbmdpZWxza2llIDwtIGdhZG1fMnNmX3BvZGxhc2tpZSROQU1FXzINCnBvd2lhdHlfYW5naWVsc2tpZQ0KYGBgDQoNCmBgYHtyfQ0KbWllc3prYW5pYV9wb2RsYXNraWUgPC0gbWllc3prYW5pYV9wb2RsYXNraWUgJT4lDQogIG11dGF0ZShOYXp3YSA9IHN0cl9yZW1vdmUoTmF6d2EsICJQb3dpYXQgIikpDQpgYGANCg0KYGBge3J9DQptaWVzemthbmlhX3BvZGxhc2tpZSA8LSBtaWVzemthbmlhX3BvZGxhc2tpZSAlPiUNCiAgbXV0YXRlKE5hendhID0gc3RyX3JlbW92ZShOYXp3YSwgIm1cXC4iKSkNCmBgYA0KDQpgYGB7cn0NCm1pZXN6a2FuaWFfcG9kbGFza2llIDwtIG1pZXN6a2FuaWFfcG9kbGFza2llICU+JQ0KICBhcnJhbmdlKE5hendhKQ0KYGBgDQoNCmBgYHtyfQ0KbWllc3prYW5pYV9wb2RsYXNraWUkTmF6d2ENCmBgYA0KDQpgYGB7cn0NCnBvd2lhdHlfYW5naWVsc2tpZQ0KYGBgDQoNCmBgYHtyfQ0KdzAxMDcgPC0gc2xpY2UobWllc3prYW5pYV9wb2RsYXNraWUsIDE6NykgDQp3MTAxNyA8LSBzbGljZShtaWVzemthbmlhX3BvZGxhc2tpZSwgMTA6MTcpIA0KYGBgDQoNCmBgYHtyfQ0KbWllc3prYW5pYV9wb2RsYXNraWUgPC0gYmluZF9yb3dzKHcwMTA3LCBzbGljZShtaWVzemthbmlhX3BvZGxhc2tpZSwgOSkpICU+JQ0KICBiaW5kX3Jvd3Moc2xpY2UobWllc3prYW5pYV9wb2RsYXNraWUsIDgpKSAlPiUNCiAgYmluZF9yb3dzKHcxMDE3KQ0KYGBgDQoNCg0KYGBge3J9DQptaWVzemthbmlhX3BvZGxhc2tpZSA8LSBtaWVzemthbmlhX3BvZGxhc2tpZSAlPiUNCiAgbXV0YXRlKE5BTUVfMiA9IHBvd2lhdHlfYW5naWVsc2tpZSkNCmBgYA0KDQpgYGB7cn0NCnBvd2lhdHlfYW5naWVsc2tpZQ0KYGBgDQoNCmBgYHtyfQ0KbWllc3prYW5pYV9wb2RsYXNraWUkTmF6d2ENCmBgYA0KDQpgYGB7cn0NCnRlc3QgPC0gZ2FkbV8yc2ZfcG9kbGFza2llICU+JQ0KICBsZWZ0X2pvaW4obWllc3prYW5pYV9wb2RsYXNraWUpDQpgYGANCg0KYGBge3J9DQpjb2xuYW1lcyhnYWRtXzJzZl9wb2RsYXNraWUpDQpjb2xuYW1lcyh0ZXN0KQ0KYGBgDQoNCiMjIElsdXN0cmFjamEgZ3JhZmljem5hDQpgYGB7cn0NCmxpYnJhcnkoY2FydG9ncmFwaHkpDQpgYGANCg0KYGBge3IgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwfQ0KdGVzdCAlPiUgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gV2FydG9zYykpICsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JleTkwIiwgaGlnaCA9ICJncmV5MzAiKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSByZWwoMS4yKSkpICsNCiAgbGFicyh0aXRsZSA9ICJMaWN6YmEgYnVkdW5rw7N3IG1pZXN6a2FueWNoIHcgcG93aWF0YWNoIHdvamV3w7NkenR3byBwb2RsYXNraWVnbyIsDQogICAgICAgc3VidGl0bGUgPSAiU3RhbiBuYSAzMS4xMi4yMDE4ci4iLA0KICAgICAgIGNhcHRpb24gPSAixblyw7NkxYJvOiBvcHJhY293YW5pZSB3xYJhc25lIG5hIHBvZHN0YXdpZSBkYW55Y2ggeiBiZGwgR1VTLiIpDQpgYGANCg0KYGBge3IgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwfQ0KdGVzdCAlPiUgZ2dwbG90KCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gYXMuZmFjdG9yKFdhcnRvc2MpKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjYXJ0by5wYWwocGFsMSA9ICJyZWQucGFsIiwgbjEgPSAxNykpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IHJlbCgxLjIpKSkgKw0KICBsYWJzKHRpdGxlID0gIkxpY3piYSBidWR1bmvDs3cgbWllc3prYW55Y2ggdyBwb3dpYXRhY2ggd29qZXfDs2R6dHdvIHBvZGxhc2tpZWdvIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJTdGFuIG5hIDMxLjEyLjIwMThyLiIsDQogICAgICAgY2FwdGlvbiA9ICLFuXLDs2TFgm86IG9wcmFjb3dhbmllIHfFgmFzbmUgbmEgcG9kc3Rhd2llIGRhbnljaCB6IGJkbCBHVVMuIiwNCiAgICAgICBmaWxsID0gIkxpY3piYSBidWR1bmvDs3ciKQ0KYGBgDQoNCmBgYHtyfQ0KdGVzdF8wMSA8LSB0ZXN0ICU+JQ0KICBhcy5kYXRhLmZyYW1lKCkgJT4lDQogIHNlbGVjdChOYXp3YSwgTmF6d2Eub2xkLCBOQU1FXzIsIFdhcnRvc2MpDQp0ZXN0XzAxDQpgYGANCg0KYGBge3J9DQptaWVzemthbmlhICU+JQ0KICBmaWx0ZXIoc3RyX2xvY2F0ZShLb2QsICIyMCIpWywxXSA9PSAxICYgaXMubmEoc3RyX2xvY2F0ZShLb2QsICIyMCIpWywxXSk9PUZBTFNFKQ0KYGBgDQoNCg0KYGBge3J9DQojZGV0YWNoKHBhY2thZ2U6cmVhZHhsKQ0KDQojZGV0YWNoKHBhY2thZ2U6dGlkeXZlcnNlKQ0KI2RldGFjaChwYWNrYWdlOmdncGxvdDIpDQojZGV0YWNoKHBhY2thZ2U6dGliYmxlKQ0KI2RldGFjaChwYWNrYWdlOnRpZHlyKQ0KI2RldGFjaChwYWNrYWdlOnJlYWRyKQ0KI2RldGFjaChwYWNrYWdlOnB1cnJyKQ0KI2RldGFjaChwYWNrYWdlOmRwbHlyKQ0KI2RldGFjaChwYWNrYWdlOnN0cmluZ3IpDQojZGV0YWNoKHBhY2thZ2U6Zm9yY2F0cykNCg0KI2RldGFjaChwYWNrYWdlOnNmKQ0KDQpgYGANCg==