# Load library yang dibutuhkan
library(data.table)
library(dplyr)
library(lubridate)
library(ggplot2)
library(tidyr)
library(patchwork)

# Membaca dataset yang digunakan
wifi_data    <- read.csv(r"C:/Users/DHEA CANTIK/Downloads/wifi.csv")
energy_lib1  <- read.csv(r"C:/Users/DHEA CANTIK/Downloads/library1.csv")
energy_lib2  <- read.csv(r"C:/Users/DHEA CANTIK/Downloads/library2.csv")
energy_lib3  <- read.csv(r"C:/Users/DHEA CANTIK/Downloads/library3.csv")

# Menyimpan nama kolom yang relevan
keep_cols <- c("time", "Building", "Floor", "Associated Client Count")

# Cek jumlah observasi awal
message("Jumlah baris awal wifi_data: ", nrow(wifi_data))

# Menghapus duplikat yang benar-benar identik
wifi_clean <- wifi_data %>%
  distinct(across(all_of(keep_cols)), .keep_all = TRUE)

message("Jumlah baris setelah duplikat dihapus: ", nrow(wifi_clean))

# Memfokuskan pada data Library saja
wifi_library <- wifi_clean %>%
  filter(tolower(trimws(Building)) == "library")

# Ubah kolom time ke format datetime
wifi_library$time <- ymd_hms(wifi_library$time, quiet = TRUE)
# Format kolom waktu untuk semua dataset energi
energy_lib1$ts <- ymd_hms(energy_lib1$ts, quiet = TRUE)
energy_lib2$ts <- ymd_hms(energy_lib2$ts, quiet = TRUE)
energy_lib3$ts <- ymd_hms(energy_lib3$ts, quiet = TRUE)

# Mengubah nama kolom agar konsisten sebelum digabung
colnames(energy_lib1)[colnames(energy_lib1) == "ts"]   <- "time"
colnames(energy_lib2)[colnames(energy_lib2) == "ts"]   <- "time"
colnames(energy_lib3)[colnames(energy_lib3) == "ts"]   <- "time"
colnames(energy_lib1)[colnames(energy_lib1) == "kWh"]  <- "Energy"
colnames(energy_lib2)[colnames(energy_lib2) == "kWh"]  <- "Energy"
colnames(energy_lib3)[colnames(energy_lib3) == "kWh"]  <- "Energy"

# Gabungkan semua data energi jadi satu
energy_all <- bind_rows(
  energy_lib1 %>% mutate(Source = "Lib1"),
  energy_lib2 %>% mutate(Source = "Lib2"),
  energy_lib3 %>% mutate(Source = "Lib3")
)

# Urutkan berdasarkan waktu
energy_all <- energy_all %>% arrange(time)

message("Ukuran data energi gabungan: ", nrow(energy_all), " baris")

# Membuat kolom waktu (jam) agar lebih mudah dianalisis
wifi_library <- wifi_library %>%
  mutate(hour = floor_date(time, unit = "hour"))

energy_all <- energy_all %>%
  mutate(hour = floor_date(time, unit = "hour"))

# Ringkas data wifi per jam
wifi_hourly <- wifi_library %>%
  group_by(hour, Floor) %>%
  summarise(avg_clients = mean(`Associated Client Count`, na.rm = TRUE),
            .groups = "drop")

# Ringkas data energi per jam
energy_hourly <- energy_all %>%
  group_by(hour) %>%
  summarise(total_energy = sum(Energy, na.rm = TRUE),
            .groups = "drop")
# Visualisasi tren rata-rata jumlah pengguna wifi per lantai
plot_wifi <- ggplot(wifi_hourly, aes(x = hour, y = avg_clients, color = Floor)) +
  geom_line(size = 1) +
  labs(
    title = "Rata-rata Jumlah Client WiFi per Jam di Perpustakaan",
    x = "Waktu (Jam)",
    y = "Jumlah Client"
  ) +
  theme_minimal()

# Visualisasi tren total energi yang dipakai
plot_energy <- ggplot(energy_hourly, aes(x = hour, y = total_energy)) +
  geom_line(color = "steelblue", size = 1) +
  labs(
    title = "Total Konsumsi Energi per Jam",
    x = "Waktu (Jam)",
    y = "Energi (kWh)"
  ) +
  theme_light()

# Gabungkan kedua grafik agar bisa dibandingkan
plot_wifi + plot_energy

# Cek korelasi sederhana antara jumlah client dan konsumsi energi
merged_data <- wifi_hourly %>%
  group_by(hour) %>%
  summarise(total_clients = sum(avg_clients, na.rm = TRUE), .groups = "drop") %>%
  left_join(energy_hourly, by = "hour")

correlation_value <- cor(merged_data$total_clients, merged_data$total_energy, use = "complete.obs")
message("Nilai korelasi antara jumlah client wifi dan energi: ", round(correlation_value, 3))
# Analisis detail per lantai
wifi_floor_summary <- wifi_library %>%
  group_by(Floor, hour) %>%
  summarise(mean_clients = mean(`Associated Client Count`, na.rm = TRUE),
            .groups = "drop")

ggplot(wifi_floor_summary, aes(x = hour, y = mean_clients, color = Floor)) +
  geom_line(linewidth = 1) +
  facet_wrap(~Floor, scales = "free_y") +
  labs(
    title = "Tren Rata-rata Pengguna WiFi per Lantai",
    x = "Jam",
    y = "Rata-rata Client"
  ) +
  theme_bw()

# Visualisasi distribusi energi untuk masing-masing sumber
ggplot(energy_all, aes(x = hour, y = Energy, color = Source)) +
  geom_line() +
  facet_wrap(~Source, scales = "free_y") +
  labs(
    title = "Distribusi Pemakaian Energi per Sumber",
    x = "Waktu (Jam)",
    y = "Energi (kWh)"
  ) +
  theme_minimal()

# Patchwork: gabungan visualisasi wifi & energi dalam 1 layout
p1 <- ggplot(wifi_hourly, aes(x = hour, y = avg_clients)) +
  geom_line(color = "darkgreen") +
  labs(
    title = "Tren Rata-rata Client WiFi",
    x = "Jam",
    y = "Jumlah Client"
  )

p2 <- ggplot(energy_hourly, aes(x = hour, y = total_energy)) +
  geom_line(color = "darkred") +
  labs(
    title = "Tren Total Energi",
    x = "Jam",
    y = "Energi (kWh)"
  )

# Gabungkan dengan patchwork
p1 / p2

# Scatter plot untuk melihat hubungan client vs energi
ggplot(merged_data, aes(x = total_clients, y = total_energy)) +
  geom_point(alpha = 0.5, color = "purple") +
  geom_smooth(method = "lm", se = FALSE, color = "black") +
  labs(
    title = "Hubungan antara Jumlah Client WiFi dan Konsumsi Energi",
    x = "Total Client",
    y = "Total Energi (kWh)"
  ) +
  theme_classic()
# Kesimpulan analisis
cat("
Dari hasil eksplorasi data, terlihat bahwa:
1. Jumlah pengguna WiFi di perpustakaan bervariasi menurut jam dan lantai, dengan pola tertentu yang muncul di jam sibuk.
2. Konsumsi energi juga menunjukkan tren fluktuatif seiring dengan aktivitas pengguna.
3. Korelasi positif terdeteksi antara jumlah client WiFi dengan pemakaian energi, yang artinya semakin banyak pengguna, semakin tinggi pula konsumsi energi.
4. Visualisasi gabungan memperkuat hubungan ini dan memberikan gambaran menyeluruh mengenai interaksi antara penggunaan fasilitas jaringan dan energi listrik.
")
LS0tDQp0aXRsZTogIlJlZG8gQXNzaWdubWVudCBEYXRhIE1hZGRuZXNzIChSZXZpc2VkKSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KDQpOYW1lIDogRGhlYSBBcnkgU2hvZnlhbg0KTlJQIDogNTAwMzIzMTIxMA0KQ2xhc3MgOiBEYXRhIE1pbmluZyBhbmQgVmlzdWFsaXphdGlvbiBLDQotLS0NCg0KYGBge3J9DQojIExvYWQgbGlicmFyeSB5YW5nIGRpYnV0dWhrYW4NCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KHBhdGNod29yaykNCg0KIyBNZW1iYWNhIGRhdGFzZXQgeWFuZyBkaWd1bmFrYW4NCndpZmlfZGF0YSAgICA8LSByZWFkLmNzdihyIkM6L1VzZXJzL0RIRUEgQ0FOVElLL0Rvd25sb2Fkcy93aWZpLmNzdiIpDQplbmVyZ3lfbGliMSAgPC0gcmVhZC5jc3YociJDOi9Vc2Vycy9ESEVBIENBTlRJSy9Eb3dubG9hZHMvbGlicmFyeTEuY3N2IikNCmVuZXJneV9saWIyICA8LSByZWFkLmNzdihyIkM6L1VzZXJzL0RIRUEgQ0FOVElLL0Rvd25sb2Fkcy9saWJyYXJ5Mi5jc3YiKQ0KZW5lcmd5X2xpYjMgIDwtIHJlYWQuY3N2KHIiQzovVXNlcnMvREhFQSBDQU5USUsvRG93bmxvYWRzL2xpYnJhcnkzLmNzdiIpDQoNCiMgTWVueWltcGFuIG5hbWEga29sb20geWFuZyByZWxldmFuDQprZWVwX2NvbHMgPC0gYygidGltZSIsICJCdWlsZGluZyIsICJGbG9vciIsICJBc3NvY2lhdGVkIENsaWVudCBDb3VudCIpDQoNCiMgQ2VrIGp1bWxhaCBvYnNlcnZhc2kgYXdhbA0KbWVzc2FnZSgiSnVtbGFoIGJhcmlzIGF3YWwgd2lmaV9kYXRhOiAiLCBucm93KHdpZmlfZGF0YSkpDQoNCiMgTWVuZ2hhcHVzIGR1cGxpa2F0IHlhbmcgYmVuYXItYmVuYXIgaWRlbnRpaw0Kd2lmaV9jbGVhbiA8LSB3aWZpX2RhdGEgJT4lDQogIGRpc3RpbmN0KGFjcm9zcyhhbGxfb2Yoa2VlcF9jb2xzKSksIC5rZWVwX2FsbCA9IFRSVUUpDQoNCm1lc3NhZ2UoIkp1bWxhaCBiYXJpcyBzZXRlbGFoIGR1cGxpa2F0IGRpaGFwdXM6ICIsIG5yb3cod2lmaV9jbGVhbikpDQoNCiMgTWVtZm9rdXNrYW4gcGFkYSBkYXRhIExpYnJhcnkgc2FqYQ0Kd2lmaV9saWJyYXJ5IDwtIHdpZmlfY2xlYW4gJT4lDQogIGZpbHRlcih0b2xvd2VyKHRyaW13cyhCdWlsZGluZykpID09ICJsaWJyYXJ5IikNCg0KIyBVYmFoIGtvbG9tIHRpbWUga2UgZm9ybWF0IGRhdGV0aW1lDQp3aWZpX2xpYnJhcnkkdGltZSA8LSB5bWRfaG1zKHdpZmlfbGlicmFyeSR0aW1lLCBxdWlldCA9IFRSVUUpDQoNCmBgYHtyfQ0KIyBGb3JtYXQga29sb20gd2FrdHUgdW50dWsgc2VtdWEgZGF0YXNldCBlbmVyZ2kNCmVuZXJneV9saWIxJHRzIDwtIHltZF9obXMoZW5lcmd5X2xpYjEkdHMsIHF1aWV0ID0gVFJVRSkNCmVuZXJneV9saWIyJHRzIDwtIHltZF9obXMoZW5lcmd5X2xpYjIkdHMsIHF1aWV0ID0gVFJVRSkNCmVuZXJneV9saWIzJHRzIDwtIHltZF9obXMoZW5lcmd5X2xpYjMkdHMsIHF1aWV0ID0gVFJVRSkNCg0KIyBNZW5ndWJhaCBuYW1hIGtvbG9tIGFnYXIga29uc2lzdGVuIHNlYmVsdW0gZGlnYWJ1bmcNCmNvbG5hbWVzKGVuZXJneV9saWIxKVtjb2xuYW1lcyhlbmVyZ3lfbGliMSkgPT0gInRzIl0gICA8LSAidGltZSINCmNvbG5hbWVzKGVuZXJneV9saWIyKVtjb2xuYW1lcyhlbmVyZ3lfbGliMikgPT0gInRzIl0gICA8LSAidGltZSINCmNvbG5hbWVzKGVuZXJneV9saWIzKVtjb2xuYW1lcyhlbmVyZ3lfbGliMykgPT0gInRzIl0gICA8LSAidGltZSINCmNvbG5hbWVzKGVuZXJneV9saWIxKVtjb2xuYW1lcyhlbmVyZ3lfbGliMSkgPT0gImtXaCJdICA8LSAiRW5lcmd5Ig0KY29sbmFtZXMoZW5lcmd5X2xpYjIpW2NvbG5hbWVzKGVuZXJneV9saWIyKSA9PSAia1doIl0gIDwtICJFbmVyZ3kiDQpjb2xuYW1lcyhlbmVyZ3lfbGliMylbY29sbmFtZXMoZW5lcmd5X2xpYjMpID09ICJrV2giXSAgPC0gIkVuZXJneSINCg0KIyBHYWJ1bmdrYW4gc2VtdWEgZGF0YSBlbmVyZ2kgamFkaSBzYXR1DQplbmVyZ3lfYWxsIDwtIGJpbmRfcm93cygNCiAgZW5lcmd5X2xpYjEgJT4lIG11dGF0ZShTb3VyY2UgPSAiTGliMSIpLA0KICBlbmVyZ3lfbGliMiAlPiUgbXV0YXRlKFNvdXJjZSA9ICJMaWIyIiksDQogIGVuZXJneV9saWIzICU+JSBtdXRhdGUoU291cmNlID0gIkxpYjMiKQ0KKQ0KDQojIFVydXRrYW4gYmVyZGFzYXJrYW4gd2FrdHUNCmVuZXJneV9hbGwgPC0gZW5lcmd5X2FsbCAlPiUgYXJyYW5nZSh0aW1lKQ0KDQptZXNzYWdlKCJVa3VyYW4gZGF0YSBlbmVyZ2kgZ2FidW5nYW46ICIsIG5yb3coZW5lcmd5X2FsbCksICIgYmFyaXMiKQ0KDQojIE1lbWJ1YXQga29sb20gd2FrdHUgKGphbSkgYWdhciBsZWJpaCBtdWRhaCBkaWFuYWxpc2lzDQp3aWZpX2xpYnJhcnkgPC0gd2lmaV9saWJyYXJ5ICU+JQ0KICBtdXRhdGUoaG91ciA9IGZsb29yX2RhdGUodGltZSwgdW5pdCA9ICJob3VyIikpDQoNCmVuZXJneV9hbGwgPC0gZW5lcmd5X2FsbCAlPiUNCiAgbXV0YXRlKGhvdXIgPSBmbG9vcl9kYXRlKHRpbWUsIHVuaXQgPSAiaG91ciIpKQ0KDQojIFJpbmdrYXMgZGF0YSB3aWZpIHBlciBqYW0NCndpZmlfaG91cmx5IDwtIHdpZmlfbGlicmFyeSAlPiUNCiAgZ3JvdXBfYnkoaG91ciwgRmxvb3IpICU+JQ0KICBzdW1tYXJpc2UoYXZnX2NsaWVudHMgPSBtZWFuKGBBc3NvY2lhdGVkIENsaWVudCBDb3VudGAsIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKQ0KDQojIFJpbmdrYXMgZGF0YSBlbmVyZ2kgcGVyIGphbQ0KZW5lcmd5X2hvdXJseSA8LSBlbmVyZ3lfYWxsICU+JQ0KICBncm91cF9ieShob3VyKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX2VuZXJneSA9IHN1bShFbmVyZ3ksIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKQ0KDQpgYGB7cn0NCiMgVmlzdWFsaXNhc2kgdHJlbiByYXRhLXJhdGEganVtbGFoIHBlbmdndW5hIHdpZmkgcGVyIGxhbnRhaQ0KcGxvdF93aWZpIDwtIGdncGxvdCh3aWZpX2hvdXJseSwgYWVzKHggPSBob3VyLCB5ID0gYXZnX2NsaWVudHMsIGNvbG9yID0gRmxvb3IpKSArDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlJhdGEtcmF0YSBKdW1sYWggQ2xpZW50IFdpRmkgcGVyIEphbSBkaSBQZXJwdXN0YWthYW4iLA0KICAgIHggPSAiV2FrdHUgKEphbSkiLA0KICAgIHkgPSAiSnVtbGFoIENsaWVudCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQojIFZpc3VhbGlzYXNpIHRyZW4gdG90YWwgZW5lcmdpIHlhbmcgZGlwYWthaQ0KcGxvdF9lbmVyZ3kgPC0gZ2dwbG90KGVuZXJneV9ob3VybHksIGFlcyh4ID0gaG91ciwgeSA9IHRvdGFsX2VuZXJneSkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gInN0ZWVsYmx1ZSIsIHNpemUgPSAxKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVG90YWwgS29uc3Vtc2kgRW5lcmdpIHBlciBKYW0iLA0KICAgIHggPSAiV2FrdHUgKEphbSkiLA0KICAgIHkgPSAiRW5lcmdpIChrV2gpIg0KICApICsNCiAgdGhlbWVfbGlnaHQoKQ0KDQojIEdhYnVuZ2thbiBrZWR1YSBncmFmaWsgYWdhciBiaXNhIGRpYmFuZGluZ2thbg0KcGxvdF93aWZpICsgcGxvdF9lbmVyZ3kNCg0KIyBDZWsga29yZWxhc2kgc2VkZXJoYW5hIGFudGFyYSBqdW1sYWggY2xpZW50IGRhbiBrb25zdW1zaSBlbmVyZ2kNCm1lcmdlZF9kYXRhIDwtIHdpZmlfaG91cmx5ICU+JQ0KICBncm91cF9ieShob3VyKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX2NsaWVudHMgPSBzdW0oYXZnX2NsaWVudHMsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBsZWZ0X2pvaW4oZW5lcmd5X2hvdXJseSwgYnkgPSAiaG91ciIpDQoNCmNvcnJlbGF0aW9uX3ZhbHVlIDwtIGNvcihtZXJnZWRfZGF0YSR0b3RhbF9jbGllbnRzLCBtZXJnZWRfZGF0YSR0b3RhbF9lbmVyZ3ksIHVzZSA9ICJjb21wbGV0ZS5vYnMiKQ0KbWVzc2FnZSgiTmlsYWkga29yZWxhc2kgYW50YXJhIGp1bWxhaCBjbGllbnQgd2lmaSBkYW4gZW5lcmdpOiAiLCByb3VuZChjb3JyZWxhdGlvbl92YWx1ZSwgMykpDQoNCmBgYHtyfQ0KIyBBbmFsaXNpcyBkZXRhaWwgcGVyIGxhbnRhaQ0Kd2lmaV9mbG9vcl9zdW1tYXJ5IDwtIHdpZmlfbGlicmFyeSAlPiUNCiAgZ3JvdXBfYnkoRmxvb3IsIGhvdXIpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9jbGllbnRzID0gbWVhbihgQXNzb2NpYXRlZCBDbGllbnQgQ291bnRgLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikNCg0KZ2dwbG90KHdpZmlfZmxvb3Jfc3VtbWFyeSwgYWVzKHggPSBob3VyLCB5ID0gbWVhbl9jbGllbnRzLCBjb2xvciA9IEZsb29yKSkgKw0KICBnZW9tX2xpbmUobGluZXdpZHRoID0gMSkgKw0KICBmYWNldF93cmFwKH5GbG9vciwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJUcmVuIFJhdGEtcmF0YSBQZW5nZ3VuYSBXaUZpIHBlciBMYW50YWkiLA0KICAgIHggPSAiSmFtIiwNCiAgICB5ID0gIlJhdGEtcmF0YSBDbGllbnQiDQogICkgKw0KICB0aGVtZV9idygpDQoNCiMgVmlzdWFsaXNhc2kgZGlzdHJpYnVzaSBlbmVyZ2kgdW50dWsgbWFzaW5nLW1hc2luZyBzdW1iZXINCmdncGxvdChlbmVyZ3lfYWxsLCBhZXMoeCA9IGhvdXIsIHkgPSBFbmVyZ3ksIGNvbG9yID0gU291cmNlKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGZhY2V0X3dyYXAoflNvdXJjZSwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0cmlidXNpIFBlbWFrYWlhbiBFbmVyZ2kgcGVyIFN1bWJlciIsDQogICAgeCA9ICJXYWt0dSAoSmFtKSIsDQogICAgeSA9ICJFbmVyZ2kgKGtXaCkiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KIyBQYXRjaHdvcms6IGdhYnVuZ2FuIHZpc3VhbGlzYXNpIHdpZmkgJiBlbmVyZ2kgZGFsYW0gMSBsYXlvdXQNCnAxIDwtIGdncGxvdCh3aWZpX2hvdXJseSwgYWVzKHggPSBob3VyLCB5ID0gYXZnX2NsaWVudHMpKSArDQogIGdlb21fbGluZShjb2xvciA9ICJkYXJrZ3JlZW4iKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVHJlbiBSYXRhLXJhdGEgQ2xpZW50IFdpRmkiLA0KICAgIHggPSAiSmFtIiwNCiAgICB5ID0gIkp1bWxhaCBDbGllbnQiDQogICkNCg0KcDIgPC0gZ2dwbG90KGVuZXJneV9ob3VybHksIGFlcyh4ID0gaG91ciwgeSA9IHRvdGFsX2VuZXJneSkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImRhcmtyZWQiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVHJlbiBUb3RhbCBFbmVyZ2kiLA0KICAgIHggPSAiSmFtIiwNCiAgICB5ID0gIkVuZXJnaSAoa1doKSINCiAgKQ0KDQojIEdhYnVuZ2thbiBkZW5nYW4gcGF0Y2h3b3JrDQpwMSAvIHAyDQoNCiMgU2NhdHRlciBwbG90IHVudHVrIG1lbGloYXQgaHVidW5nYW4gY2xpZW50IHZzIGVuZXJnaQ0KZ2dwbG90KG1lcmdlZF9kYXRhLCBhZXMoeCA9IHRvdGFsX2NsaWVudHMsIHkgPSB0b3RhbF9lbmVyZ3kpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIGNvbG9yID0gInB1cnBsZSIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSHVidW5nYW4gYW50YXJhIEp1bWxhaCBDbGllbnQgV2lGaSBkYW4gS29uc3Vtc2kgRW5lcmdpIiwNCiAgICB4ID0gIlRvdGFsIENsaWVudCIsDQogICAgeSA9ICJUb3RhbCBFbmVyZ2kgKGtXaCkiDQogICkgKw0KICB0aGVtZV9jbGFzc2ljKCkNCg0KYGBge3J9DQojIEtlc2ltcHVsYW4gYW5hbGlzaXMNCmNhdCgiDQpEYXJpIGhhc2lsIGVrc3Bsb3Jhc2kgZGF0YSwgdGVybGloYXQgYmFod2E6DQoxLiBKdW1sYWggcGVuZ2d1bmEgV2lGaSBkaSBwZXJwdXN0YWthYW4gYmVydmFyaWFzaSBtZW51cnV0IGphbSBkYW4gbGFudGFpLCBkZW5nYW4gcG9sYSB0ZXJ0ZW50dSB5YW5nIG11bmN1bCBkaSBqYW0gc2lidWsuDQoyLiBLb25zdW1zaSBlbmVyZ2kganVnYSBtZW51bmp1a2thbiB0cmVuIGZsdWt0dWF0aWYgc2VpcmluZyBkZW5nYW4gYWt0aXZpdGFzIHBlbmdndW5hLg0KMy4gS29yZWxhc2kgcG9zaXRpZiB0ZXJkZXRla3NpIGFudGFyYSBqdW1sYWggY2xpZW50IFdpRmkgZGVuZ2FuIHBlbWFrYWlhbiBlbmVyZ2ksIHlhbmcgYXJ0aW55YSBzZW1ha2luIGJhbnlhayBwZW5nZ3VuYSwgc2VtYWtpbiB0aW5nZ2kgcHVsYSBrb25zdW1zaSBlbmVyZ2kuDQo0LiBWaXN1YWxpc2FzaSBnYWJ1bmdhbiBtZW1wZXJrdWF0IGh1YnVuZ2FuIGluaSBkYW4gbWVtYmVyaWthbiBnYW1iYXJhbiBtZW55ZWx1cnVoIG1lbmdlbmFpIGludGVyYWtzaSBhbnRhcmEgcGVuZ2d1bmFhbiBmYXNpbGl0YXMgamFyaW5nYW4gZGFuIGVuZXJnaSBsaXN0cmlrLg0KIikNCg0KDQoNCg==