Housing Cost Burden (HCB) merupakan indikator yang digunakan
untuk mengukur tingkat tekanan biaya perumahan terhadap rumah tangga,
yang umumnya didefinisikan sebagai kondisi ketika rumah tangga
mengalokasikan 30 persen atau lebih dari total pengeluarannya untuk
biaya perumahan. Indikator ini banyak digunakan dalam analisis
kesejahteraan karena mencerminkan keterjangkauan perumahan serta potensi
kerentanan ekonomi rumah tangga (Stone, 2006; Joint Center for Housing
Studies of Harvard University, 2023).
Dalam konteks negara berkembang, termasuk Indonesia, variasi HCB
antardaerah dipengaruhi oleh perbedaan harga rumah dan sewa, struktur
pasar tenaga kerja, tingkat urbanisasi, serta akses terhadap
infrastruktur dan bahan bangunan. Oleh karena itu, analisis HCB secara
spasial hingga tingkat kabupaten/kota menjadi penting untuk
mengidentifikasi ketimpangan keterjangkauan perumahan antarwilayah
(World Bank, 2019).
Data survei rumah tangga seperti Survei Sosial Ekonomi Nasional
(Susenas) memungkinkan pengukuran HCB secara komprehensif karena
mencakup komponen pengeluaran perumahan dan karakteristik sosial ekonomi
rumah tangga. Pemanfaatan data ini memberikan dasar empiris yang kuat
dalam perumusan kebijakan perumahan yang lebih tepat sasaran.
knitr::opts_chunk$set(echo = TRUE)
Data yang digunakan adalah Susenas Konsumsi dan Pengeluaran (KP)
Maret 2025.
Housing Cost
Burden
Housing Cost Burden (HCB) dihitung sebagai rasio pengeluaran
perumahan terhadap total pengeluaran rumah tangga. Ambang batas 30
persen digunakan untuk mengklasifikasikan rumah tangga sebagai
unaffordable, mengikuti praktik yang luas digunakan dalam
literatur kebijakan perumahan dan perencanaan kota. Meskipun ambang ini
bersifat normatif, berbagai studi menunjukkan bahwa rumah tangga dengan
rasio pengeluaran perumahan di atas 30 persen cenderung mengalami
penurunan konsumsi kebutuhan dasar lainnya dan peningkatan kerentanan
ekonomi (Kutty, 2005).
Dalam analisis ini, pengeluaran perumahan mencakup biaya sewa aktual
maupun imputasi sewa rumah milik sendiri, utilitas dasar (listrik dan
air), dan energi bahan bakar untuk memasak. Pendekatan agregatif ini
sejalan dengan praktik pengukuran pengeluaran perumahan dalam survei
rumah tangga nasional dan internasional.
dataku <- dataku %>%
mutate(kabu = r101*100 + r102) %>%
rename(prov="r101", kab="r102") %>%
mutate(denom=100) %>%
mutate(
exp_housing = rowSums(across(
c(sebulan_228, sebulan_229, sebulan_230, sebulan_231,
sebulan_234, sebulan_236,
sebulan_253, sebulan_255, sebulan_257,
sebulan_259, sebulan_260, sebulan_261),
~replace_na(., 0)
)),
AMBANG = (exp_housing / expend) * 100,
HCB = if_else(AMBANG > 30, 100, 0)
)
Set Design
Sampling
Design sampling yang digunakan mengikuti design sampling yang
dilakukan pada SPSS yaitu Cluster Sampling design with replacement.
susenas.design<- svydesign(id=~psu, strata=~strata, data = dataku, weights=~fwt)
susenas.design
## Stratified 1 - level Cluster Sampling design (with replacement)
## With (34473) clusters.
## svydesign(id = ~psu, strata = ~strata, data = dataku, weights = ~fwt)
summary(susenas.design$prob)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000201 0.003795 0.008842 0.029646 0.025600 0.968267
Set Output
Statistics
Kualitas presisi hasil estimasi suatu survei bisa diamati dari nilai
RSE yang dihasilkan. Kesalahan sampling dari beberapa estimasi harus
digunakan secara hati-hati. Untuk estimasi yang berdasarkan jumlah kasus
yang kecil, kesalahan relatif cenderung besar.
Batasan nilai RSE ( Australian Bureau Statistics):
Jika \(RSE \le 25\%\), estimasi
bersifat presisi.
Jika \(25\% < RSE \le 50\%\),
estimasi perlu dilakukan dengan hati-hati.
Jika \(RSE > 50\%\), estimasi
dianggap sangat tidak presisi.
Provinsi
options(survey.adjust.domain.lonely=TRUE)
options(survey.lonely.psu="adjust")
hasilP = svyby(formula = ~HCB, denom= ~denom, ~prov, design = susenas.design, data = dataku, deff=TRUE, svyratio, vartype=c("se","ci","ci","cv","cvpct","var"))
hasilP[is.na(hasilP)] <- 0
hasilP$theta = round(hasilP$`HCB/denom`*100,2)
hasilP$SE = round(hasilP$`se.HCB/denom`*100,2)
hasilP$VAR = round(hasilP$SE*hasilP$SE,2)
hasilP$CI_LOWER = round(hasilP$`ci_l`*100,2)
hasilP$CI_LOWER[hasilP$CI_LOWER<0] <- 0
hasilP$CI_UPPER = round(hasilP$`ci_u`*100,2)
hasilP$RSE = round(hasilP$`cv%`,2)
hasilP$DEFF = round(hasilP$DEff,2)
Kabupaten/kota
options(survey.adjust.domain.lonely=TRUE)
options(survey.lonely.psu="adjust")
hasil = svyby(formula = ~HCB, denom= ~denom, ~kabu, design = susenas.design, data = dataku, deff=TRUE, svyratio, vartype=c("se","ci","ci","cv","cvpct","var"))
hasil[is.na(hasil)] <- 0
hasil$theta = round(hasil$`HCB/denom`*100,2)
hasil$SE = round(hasil$`se.HCB/denom`*100,2)
hasil$VAR = round(hasil$SE*hasil$SE,2)
hasil$CI_LOWER = round(hasil$`ci_l`*100,2)
hasil$CI_LOWER[hasil$CI_LOWER<0] <- 0
hasil$CI_UPPER = round(hasil$`ci_u`*100,2)
hasil$RSE = round(hasil$`cv%`,2)
hasil$DEFF = round(hasil$DEff,2)
Level Estimate
Estimation by
province
outputP = as.data.frame(cbind(hasilP$prov, hasilP$theta, hasilP$SE, hasilP$VAR, hasilP$CI_LOWER, hasilP$CI_UPPER, hasilP$RSE, hasilP$DEFF))
names(outputP) = c("Prov","Estimasi","SE","VAR","CI LOWER","CI UPPER","RSE","DEFF")
(outputP[order(outputP$Prov, decreasing = FALSE), ] )
## Prov Estimasi SE VAR CI LOWER CI UPPER RSE DEFF
## 1 11 1.27 0.13 0.02 1.01 1.54 10.49 1.96
## 2 12 2.16 0.28 0.08 1.61 2.70 12.90 7.88
## 3 13 2.37 0.24 0.06 1.91 2.84 9.95 2.81
## 4 14 2.18 0.23 0.05 1.72 2.63 10.63 2.16
## 5 15 1.95 0.24 0.06 1.48 2.42 12.36 2.20
## 6 16 2.77 0.33 0.11 2.12 3.42 11.91 4.79
## 7 17 2.16 0.26 0.07 1.65 2.66 11.87 1.87
## 8 18 2.06 0.26 0.07 1.56 2.56 12.45 3.52
## 9 19 4.77 0.56 0.31 3.66 5.87 11.83 3.00
## 10 21 6.64 1.17 1.37 4.34 8.93 17.64 9.24
## 11 31 20.38 1.19 1.42 18.05 22.71 5.83 4.43
## 12 32 6.35 0.27 0.07 5.82 6.87 4.21 2.96
## 13 33 4.38 0.21 0.04 3.98 4.78 4.70 2.97
## 14 34 9.22 0.72 0.52 7.81 10.62 7.77 2.42
## 15 35 4.05 0.18 0.03 3.71 4.40 4.39 2.57
## 16 36 6.64 0.58 0.34 5.50 7.79 8.79 3.89
## 17 51 11.89 0.69 0.48 10.53 13.25 5.82 2.88
## 18 52 4.59 0.46 0.21 3.70 5.48 9.93 3.39
## 19 53 7.57 0.42 0.18 6.75 8.40 5.57 3.36
## 20 61 3.82 0.43 0.18 2.98 4.65 11.13 4.63
## 21 62 5.20 0.44 0.19 4.34 6.06 8.49 3.31
## 22 63 5.41 0.38 0.14 4.67 6.16 7.02 2.47
## 23 64 12.09 0.71 0.50 10.70 13.47 5.84 3.05
## 24 65 12.07 1.31 1.72 9.51 14.62 10.82 4.31
## 25 71 7.45 0.54 0.29 6.39 8.52 7.29 3.68
## 26 72 9.15 0.59 0.35 8.00 10.31 6.45 3.31
## 27 73 8.05 0.51 0.26 7.05 9.05 6.35 5.63
## 28 74 8.63 0.61 0.37 7.44 9.82 7.03 4.41
## 29 75 10.00 0.84 0.71 8.35 11.64 8.41 2.84
## 30 76 4.35 0.52 0.27 3.32 5.37 12.07 2.39
## 31 81 15.59 1.00 1.00 13.62 17.56 6.44 4.67
## 32 82 16.06 1.07 1.14 13.97 18.15 6.64 4.45
## 33 91 17.18 1.26 1.59 14.72 19.65 7.31 3.79
## 34 92 21.34 2.25 5.06 16.92 25.75 10.56 8.91
## 35 94 26.10 1.52 2.31 23.13 29.07 5.81 5.29
## 36 95 12.26 1.43 2.04 9.47 15.06 11.64 3.92
## 37 96 14.40 1.25 1.56 11.94 16.85 8.70 5.57
## 38 97 11.52 1.10 1.21 9.36 13.68 9.56 4.95
Kelompok RSE Provinsi
hasilP <- hasilP %>%
mutate(
RSE = if_else(RSE == 0, NA_real_, RSE)
) %>%
arrange(RSE) %>%
mutate(
Urut = row_number(),
RSEP_kat = case_when(
is.na(RSE) ~ NA_character_,
RSE < 25.99 ~ "< 25%",
RSE <= 50.99 ~ "26–50%",
RSE > 50 ~ "> 50%"
)
)
table(hasilP$RSEP_kat, useNA = "ifany")
##
## < 25%
## 38
Visualisasi Provinsi
ggplot(hasilP, aes(x = Urut, y = RSE, group = 1, color = RSEP_kat)) +
geom_point(size = 3) +
geom_hline(yintercept = 25, linetype = "dashed", color = "red") +
geom_hline(yintercept = 50, linetype = "dashed", color = "blue") +
scale_color_manual(
name = "Kategori RSE",
limits = c("< 25%", "26–50%", "> 50%"),
values = c(
"< 25%" = "#1B9E77",
"26–50%" = "#FF8C00",
"> 50%" = "#7570B3"
),
na.value = "#D73027",
drop = FALSE
) +
labs(
title = "RSE HCB per Provinsi",
subtitle = "dengan garis batas RSE 25% dan 50%",
x = "Provinsi",
y = "Nilai RSE (%)"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(face = "bold", size = 15),
legend.position = "bottom",
axis.text.x = element_text(angle = 40, vjust = 1, hjust = 1)
)

Estimation by
district
output = as.data.frame(cbind(hasil$kabu, hasil$theta, hasil$SE, hasil$VAR, hasil$CI_LOWER, hasil$CI_UPPER, hasil$RSE, hasil$DEFF))
names(output) = c("Kako","Estimasi","SE","VAR","CI LOWER","CI UPPER","RSE","DEFF")
head((output[order(output$Kako, decreasing = FALSE), ] ))
## Kako Estimasi SE VAR CI LOWER CI UPPER RSE DEFF
## 1 1101 0.59 0.31 0.10 0.00 1.19 51.71 0.82
## 2 1102 0.47 0.37 0.14 0.00 1.19 79.43 1.57
## 3 1103 0.77 0.48 0.23 0.00 1.70 61.69 1.85
## 4 1104 0.95 0.51 0.26 0.00 1.96 54.12 1.72
## 5 1105 0.32 0.21 0.04 0.00 0.73 64.23 0.93
## 6 1106 0.97 0.49 0.24 0.01 1.92 50.33 1.48
Kelompok RSE Kabupaten/kota
hasil <- hasil %>%
mutate(
RSE = if_else(RSE == 0, NA_real_, RSE)
) %>%
arrange(RSE) %>%
mutate(
Urut = row_number(),
RSE_kat = case_when(
is.na(RSE) ~ NA_character_,
RSE < 25.99 ~ "< 25%",
RSE <= 50.99 ~ "26–50%",
RSE > 50 ~ "> 50%"
)
)
table(hasil$RSE_kat, useNA = "ifany")
##
## < 25% > 50% 26–50% <NA>
## 251 39 223 1
hasil_plot <- hasil %>%
mutate(
RSE_plot = if_else(is.na(RSE), -2, RSE) # taruh NA di bawah sumbu
)
ggplot(hasil_plot, aes(x = Urut, y = RSE_plot, color = RSE_kat)) +
geom_jitter(width = 0.35, height = 0, size = 1.8, alpha = 0.85) +
geom_hline(yintercept = 25, linetype = "dashed", color = "red") +
geom_hline(yintercept = 50, linetype = "dashed", color = "blue") +
scale_y_continuous(
name = "Nilai RSE (%)",
breaks = c(0, 25, 50),
limits = c(-5, NA)
) +
scale_color_manual(
name = "Kategori RSE",
limits = c("< 25%", "26–50%", "> 50%"),
values = c(
"< 25%" = "#1B9E77",
"26–50%" = "#FF8C00",
"> 50%" = "#7570B3"
),
na.value = "#D73027",
drop = FALSE
) +
theme_minimal()

Satu kabupaten/kota memiliki nilai RSE = 0 sehingga diperlakukan
sebagai data tidak tersedia (NA) dan ditampilkan dalam visualisasi
sebagai titik berwarna merah.
write.xlsx(outputP,"HCB 2025_Prov.xlsx")
write.xlsx(output,"HCB 2025_Kako.xlsx")
Peta
library(sf)
petaku <- st_read("PetaSHP514_38.shp")
## Reading layer `PetaSHP514_38' from data source
## `D:\2. Pengembangan diri\1 Exercise Bagus\Housing Analysis\PetaSHP514_38.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 514 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 95.00971 ymin: -11.00766 xmax: 141.02 ymax: 6.076809
## Geodetic CRS: WGS 84
petaku <- petaku %>%
mutate(idkab = as.character(idkab))
hasil <- hasil %>%
mutate(kabu = as.character(kabu))
names(petaku)
## [1] "fid" "idkab" "nmprov" "nmkab" "kdprov" "kdkab" "sumber"
## [8] "periode" "geometry"
kab_map <- petaku %>%
left_join(
hasil %>% select(kabu, RSE, RSE_kat),
by = c("idkab" = "kabu")
)
kab_map$RSE_kat <- factor(
kab_map$RSE_kat,
levels = c("< 25%", "26–50%", "> 50%")
)

References
[1] Joint Center for Housing Studies of Harvard University. (2023).
The state of the nation’s housing 2023. Cambridge, MA: Harvard
University.
[2] Kutty, N. K. (2005). A new measure of housing affordability:
Estimates and analytical results. Housing Policy Debate, 16(1),
113–142.
[3] Stone, M. E. (2006). What is housing affordability? The case
for the residual income approach. Housing Policy Debate, 17(1),
151–184. https://doi.org/10.1080/10511482.2006.9521564
[4] World Bank. (2019). Indonesia affordable housing: Policy and
institutional assessment. Washington, DC: World Bank.
Direktorat Statistik Kesejahteraan Rakyat, BPS, saptahas@bps.go.id
LS0tDQp0aXRsZTogIkhvdXNpbmcgQ29zdCBCdXJkZW4gKEhDQikgMjAyNSINCmF1dGhvcjogIlNhcHRhIEhhc3RobyBQb25jbyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keXsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQoNCl9Ib3VzaW5nIENvc3QgQnVyZGVuXyAoSENCKSBtZXJ1cGFrYW4gaW5kaWthdG9yIHlhbmcgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIHRpbmdrYXQgdGVrYW5hbiBiaWF5YSBwZXJ1bWFoYW4gdGVyaGFkYXAgcnVtYWggdGFuZ2dhLCB5YW5nIHVtdW1ueWEgZGlkZWZpbmlzaWthbiBzZWJhZ2FpIGtvbmRpc2kga2V0aWthIHJ1bWFoIHRhbmdnYSBtZW5nYWxva2FzaWthbiAzMCBwZXJzZW4gYXRhdSBsZWJpaCBkYXJpIHRvdGFsIHBlbmdlbHVhcmFubnlhIHVudHVrIGJpYXlhIHBlcnVtYWhhbi4gSW5kaWthdG9yIGluaSBiYW55YWsgZGlndW5ha2FuIGRhbGFtIGFuYWxpc2lzIGtlc2VqYWh0ZXJhYW4ga2FyZW5hIG1lbmNlcm1pbmthbiBrZXRlcmphbmdrYXVhbiBwZXJ1bWFoYW4gc2VydGEgcG90ZW5zaSBrZXJlbnRhbmFuIGVrb25vbWkgcnVtYWggdGFuZ2dhIChTdG9uZSwgMjAwNjsgSm9pbnQgQ2VudGVyIGZvciBIb3VzaW5nIFN0dWRpZXMgb2YgSGFydmFyZCBVbml2ZXJzaXR5LCAyMDIzKS4NCg0KRGFsYW0ga29udGVrcyBuZWdhcmEgYmVya2VtYmFuZywgdGVybWFzdWsgSW5kb25lc2lhLCB2YXJpYXNpIEhDQiBhbnRhcmRhZXJhaCBkaXBlbmdhcnVoaSBvbGVoIHBlcmJlZGFhbiBoYXJnYSBydW1haCBkYW4gc2V3YSwgc3RydWt0dXIgcGFzYXIgdGVuYWdhIGtlcmphLCB0aW5na2F0IHVyYmFuaXNhc2ksIHNlcnRhIGFrc2VzIHRlcmhhZGFwIGluZnJhc3RydWt0dXIgZGFuIGJhaGFuIGJhbmd1bmFuLiBPbGVoIGthcmVuYSBpdHUsIGFuYWxpc2lzIEhDQiBzZWNhcmEgc3Bhc2lhbCBoaW5nZ2EgdGluZ2thdCBrYWJ1cGF0ZW4va290YSBtZW5qYWRpIHBlbnRpbmcgdW50dWsgbWVuZ2lkZW50aWZpa2FzaSBrZXRpbXBhbmdhbiBrZXRlcmphbmdrYXVhbiBwZXJ1bWFoYW4gYW50YXJ3aWxheWFoIChXb3JsZCBCYW5rLCAyMDE5KS4NCg0KRGF0YSBzdXJ2ZWkgcnVtYWggdGFuZ2dhIHNlcGVydGkgU3VydmVpIFNvc2lhbCBFa29ub21pIE5hc2lvbmFsIChTdXNlbmFzKSBtZW11bmdraW5rYW4gcGVuZ3VrdXJhbiBIQ0Igc2VjYXJhIGtvbXByZWhlbnNpZiBrYXJlbmEgbWVuY2FrdXAga29tcG9uZW4gcGVuZ2VsdWFyYW4gcGVydW1haGFuIGRhbiBrYXJha3RlcmlzdGlrIHNvc2lhbCBla29ub21pIHJ1bWFoIHRhbmdnYS4gUGVtYW5mYWF0YW4gZGF0YSBpbmkgbWVtYmVyaWthbiBkYXNhciBlbXBpcmlzIHlhbmcga3VhdCBkYWxhbSBwZXJ1bXVzYW4ga2ViaWpha2FuIHBlcnVtYWhhbiB5YW5nIGxlYmloIHRlcGF0IHNhc2FyYW4uDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzdXJ2ZXkpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KG9wZW54bHN4KQ0KbGlicmFyeShzZikNCmxpYnJhcnkodmlyaWRpcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldHdkKCJEOlxcMi4gUGVuZ2VtYmFuZ2FuIGRpcmlcXDEgRXhlcmNpc2UgQmFndXNcXEhvdXNpbmcgQW5hbHlzaXMiKQ0KYGBgDQoNCkRhdGEgeWFuZyBkaWd1bmFrYW4gYWRhbGFoIFN1c2VuYXMgS29uc3Vtc2kgZGFuIFBlbmdlbHVhcmFuIChLUCkgTWFyZXQgMjAyNS4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpkYXRha3UgPC0gcmVhZF9zYXYoIkJMT0s0M18yMDI1LnNhdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KIyBIb3VzaW5nIENvc3QgQnVyZGVuDQoNCl9Ib3VzaW5nIENvc3QgQnVyZGVuXyAoSENCKSBkaWhpdHVuZyBzZWJhZ2FpIHJhc2lvIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiB0ZXJoYWRhcCB0b3RhbCBwZW5nZWx1YXJhbiBydW1haCB0YW5nZ2EuIEFtYmFuZyBiYXRhcyAzMCBwZXJzZW4gZGlndW5ha2FuIHVudHVrIG1lbmdrbGFzaWZpa2FzaWthbiBydW1haCB0YW5nZ2Egc2ViYWdhaSBfdW5hZmZvcmRhYmxlXywgbWVuZ2lrdXRpIHByYWt0aWsgeWFuZyBsdWFzIGRpZ3VuYWthbiBkYWxhbSBsaXRlcmF0dXIga2ViaWpha2FuIHBlcnVtYWhhbiBkYW4gcGVyZW5jYW5hYW4ga290YS4gTWVza2lwdW4gYW1iYW5nIGluaSBiZXJzaWZhdCBub3JtYXRpZiwgYmVyYmFnYWkgc3R1ZGkgbWVudW5qdWtrYW4gYmFod2EgcnVtYWggdGFuZ2dhIGRlbmdhbiByYXNpbyBwZW5nZWx1YXJhbiBwZXJ1bWFoYW4gZGkgYXRhcyAzMCBwZXJzZW4gY2VuZGVydW5nIG1lbmdhbGFtaSBwZW51cnVuYW4ga29uc3Vtc2kga2VidXR1aGFuIGRhc2FyIGxhaW5ueWEgZGFuIHBlbmluZ2thdGFuIGtlcmVudGFuYW4gZWtvbm9taSAoS3V0dHksIDIwMDUpLg0KDQpEYWxhbSBhbmFsaXNpcyBpbmksIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBtZW5jYWt1cCBiaWF5YSBzZXdhIGFrdHVhbCBtYXVwdW4gaW1wdXRhc2kgc2V3YSBydW1haCBtaWxpayBzZW5kaXJpLCB1dGlsaXRhcyBkYXNhciAobGlzdHJpayBkYW4gYWlyKSwgZGFuIGVuZXJnaSBiYWhhbiBiYWthciB1bnR1ayBtZW1hc2FrLiBQZW5kZWthdGFuIGFncmVnYXRpZiBpbmkgc2VqYWxhbiBkZW5nYW4gcHJha3RpayBwZW5ndWt1cmFuIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBkYWxhbSBzdXJ2ZWkgcnVtYWggdGFuZ2dhIG5hc2lvbmFsIGRhbiBpbnRlcm5hc2lvbmFsLg0KDQpgYGB7cn0NCmRhdGFrdSA8LSBkYXRha3UgJT4lDQogIG11dGF0ZShrYWJ1ID0gcjEwMSoxMDAgKyByMTAyKSAlPiUNCiAgcmVuYW1lKHByb3Y9InIxMDEiLCBrYWI9InIxMDIiKSAlPiUNCiAgbXV0YXRlKGRlbm9tPTEwMCkgJT4lDQogIG11dGF0ZSgNCiAgICBleHBfaG91c2luZyA9IHJvd1N1bXMoYWNyb3NzKA0KICAgICAgYyhzZWJ1bGFuXzIyOCwgc2VidWxhbl8yMjksIHNlYnVsYW5fMjMwLCBzZWJ1bGFuXzIzMSwNCiAgICAgICAgc2VidWxhbl8yMzQsIHNlYnVsYW5fMjM2LA0KICAgICAgICBzZWJ1bGFuXzI1Mywgc2VidWxhbl8yNTUsIHNlYnVsYW5fMjU3LA0KICAgICAgICBzZWJ1bGFuXzI1OSwgc2VidWxhbl8yNjAsIHNlYnVsYW5fMjYxKSwNCiAgICAgIH5yZXBsYWNlX25hKC4sIDApDQogICAgKSksDQogICAgQU1CQU5HID0gKGV4cF9ob3VzaW5nIC8gZXhwZW5kKSAqIDEwMCwNCiAgICBIQ0IgPSBpZl9lbHNlKEFNQkFORyA+IDMwLCAxMDAsIDApDQogICkNCmBgYA0KICANCiMgU2V0IERlc2lnbiBTYW1wbGluZw0KDQpEZXNpZ24gc2FtcGxpbmcgeWFuZyBkaWd1bmFrYW4gbWVuZ2lrdXRpIGRlc2lnbiBzYW1wbGluZyB5YW5nIGRpbGFrdWthbiBwYWRhIFNQU1MgeWFpdHUgQ2x1c3RlciBTYW1wbGluZyBkZXNpZ24gd2l0aCByZXBsYWNlbWVudC4NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpzdXNlbmFzLmRlc2lnbjwtIHN2eWRlc2lnbihpZD1+cHN1LCBzdHJhdGE9fnN0cmF0YSwgZGF0YSA9IGRhdGFrdSwgd2VpZ2h0cz1+Znd0KQ0Kc3VzZW5hcy5kZXNpZ24NCnN1bW1hcnkoc3VzZW5hcy5kZXNpZ24kcHJvYikNCmBgYA0KDQojIFNldCBPdXRwdXQgU3RhdGlzdGljcw0KDQpLdWFsaXRhcyBwcmVzaXNpIGhhc2lsIGVzdGltYXNpIHN1YXR1IHN1cnZlaSBiaXNhIGRpYW1hdGkgZGFyaSBuaWxhaSBSU0UgeWFuZyBkaWhhc2lsa2FuLiBLZXNhbGFoYW4gc2FtcGxpbmcgZGFyaSBiZWJlcmFwYSBlc3RpbWFzaSBoYXJ1cyBkaWd1bmFrYW4gc2VjYXJhIGhhdGktaGF0aS4gVW50dWsgZXN0aW1hc2kgeWFuZyBiZXJkYXNhcmthbiBqdW1sYWgga2FzdXMgeWFuZyBrZWNpbCwga2VzYWxhaGFuIHJlbGF0aWYgY2VuZGVydW5nIGJlc2FyLg0KDQpCYXRhc2FuIG5pbGFpIFJTRSAoIF9BdXN0cmFsaWFuIEJ1cmVhdSBTdGF0aXN0aWNzXyk6DQoNCjEuICBKaWthICRSU0UgXGxlIDI1XCUkLCBlc3RpbWFzaSBiZXJzaWZhdCBwcmVzaXNpLg0KDQoyLiAgSmlrYSAkMjVcJSA8IFJTRSBcbGUgNTBcJSQsIGVzdGltYXNpIHBlcmx1IGRpbGFrdWthbiBkZW5nYW4gaGF0aS1oYXRpLg0KDQozLiAgSmlrYSAkUlNFID4gNTBcJSQsIGVzdGltYXNpIGRpYW5nZ2FwIHNhbmdhdCB0aWRhayBwcmVzaXNpLg0KDQoNCioqUHJvdmluc2kqKg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm9wdGlvbnMoc3VydmV5LmFkanVzdC5kb21haW4ubG9uZWx5PVRSVUUpDQpvcHRpb25zKHN1cnZleS5sb25lbHkucHN1PSJhZGp1c3QiKQ0KaGFzaWxQID0gc3Z5YnkoZm9ybXVsYSA9IH5IQ0IsIGRlbm9tPSB+ZGVub20sIH5wcm92LCBkZXNpZ24gPSBzdXNlbmFzLmRlc2lnbiwgZGF0YSA9IGRhdGFrdSwgZGVmZj1UUlVFLCBzdnlyYXRpbywgdmFydHlwZT1jKCJzZSIsImNpIiwiY2kiLCJjdiIsImN2cGN0IiwidmFyIikpDQpoYXNpbFBbaXMubmEoaGFzaWxQKV0gPC0gMA0KaGFzaWxQJHRoZXRhID0gcm91bmQoaGFzaWxQJGBIQ0IvZGVub21gKjEwMCwyKQ0KaGFzaWxQJFNFID0gcm91bmQoaGFzaWxQJGBzZS5IQ0IvZGVub21gKjEwMCwyKQ0KaGFzaWxQJFZBUiA9IHJvdW5kKGhhc2lsUCRTRSpoYXNpbFAkU0UsMikNCmhhc2lsUCRDSV9MT1dFUiA9IHJvdW5kKGhhc2lsUCRgY2lfbGAqMTAwLDIpDQpoYXNpbFAkQ0lfTE9XRVJbaGFzaWxQJENJX0xPV0VSPDBdIDwtIDANCmhhc2lsUCRDSV9VUFBFUiA9IHJvdW5kKGhhc2lsUCRgY2lfdWAqMTAwLDIpDQpoYXNpbFAkUlNFID0gcm91bmQoaGFzaWxQJGBjdiVgLDIpDQpoYXNpbFAkREVGRiA9IHJvdW5kKGhhc2lsUCRERWZmLDIpDQpgYGANCg0KKipLYWJ1cGF0ZW4va290YSoqDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0Kb3B0aW9ucyhzdXJ2ZXkuYWRqdXN0LmRvbWFpbi5sb25lbHk9VFJVRSkNCm9wdGlvbnMoc3VydmV5LmxvbmVseS5wc3U9ImFkanVzdCIpDQpoYXNpbCA9IHN2eWJ5KGZvcm11bGEgPSB+SENCLCBkZW5vbT0gfmRlbm9tLCB+a2FidSwgZGVzaWduID0gc3VzZW5hcy5kZXNpZ24sIGRhdGEgPSBkYXRha3UsIGRlZmY9VFJVRSwgc3Z5cmF0aW8sIHZhcnR5cGU9Yygic2UiLCJjaSIsImNpIiwiY3YiLCJjdnBjdCIsInZhciIpKQ0KaGFzaWxbaXMubmEoaGFzaWwpXSA8LSAwDQpoYXNpbCR0aGV0YSA9IHJvdW5kKGhhc2lsJGBIQ0IvZGVub21gKjEwMCwyKQ0KaGFzaWwkU0UgPSByb3VuZChoYXNpbCRgc2UuSENCL2Rlbm9tYCoxMDAsMikNCmhhc2lsJFZBUiA9IHJvdW5kKGhhc2lsJFNFKmhhc2lsJFNFLDIpDQpoYXNpbCRDSV9MT1dFUiA9IHJvdW5kKGhhc2lsJGBjaV9sYCoxMDAsMikNCmhhc2lsJENJX0xPV0VSW2hhc2lsJENJX0xPV0VSPDBdIDwtIDANCmhhc2lsJENJX1VQUEVSID0gcm91bmQoaGFzaWwkYGNpX3VgKjEwMCwyKQ0KaGFzaWwkUlNFID0gcm91bmQoaGFzaWwkYGN2JWAsMikNCmhhc2lsJERFRkYgPSByb3VuZChoYXNpbCRERWZmLDIpDQpgYGANCg0KIyBMZXZlbCBFc3RpbWF0ZQ0KDQojIyBFc3RpbWF0aW9uIGJ5IHByb3ZpbmNlDQoNCmBgYHtyfQ0Kb3V0cHV0UCA9IGFzLmRhdGEuZnJhbWUoY2JpbmQoaGFzaWxQJHByb3YsIGhhc2lsUCR0aGV0YSwgaGFzaWxQJFNFLCBoYXNpbFAkVkFSLCBoYXNpbFAkQ0lfTE9XRVIsIGhhc2lsUCRDSV9VUFBFUiwgaGFzaWxQJFJTRSwgaGFzaWxQJERFRkYpKQ0KbmFtZXMob3V0cHV0UCkgPSBjKCJQcm92IiwiRXN0aW1hc2kiLCJTRSIsIlZBUiIsIkNJIExPV0VSIiwiQ0kgVVBQRVIiLCJSU0UiLCJERUZGIikNCihvdXRwdXRQW29yZGVyKG91dHB1dFAkUHJvdiwgZGVjcmVhc2luZyA9IEZBTFNFKSwgXSAgICkNCmBgYA0KDQoqKktlbG9tcG9rIFJTRSBQcm92aW5zaSoqDQoNCmBgYHtyfQ0KaGFzaWxQIDwtIGhhc2lsUCAlPiUNCiAgbXV0YXRlKA0KICAgIFJTRSA9IGlmX2Vsc2UoUlNFID09IDAsIE5BX3JlYWxfLCBSU0UpDQogICkgJT4lDQogIGFycmFuZ2UoUlNFKSAlPiUNCiAgbXV0YXRlKA0KICAgIFVydXQgPSByb3dfbnVtYmVyKCksDQogICAgUlNFUF9rYXQgPSBjYXNlX3doZW4oDQogICAgICBpcy5uYShSU0UpICAgICAgICAgICAgICAgICB+IE5BX2NoYXJhY3Rlcl8sDQogICAgICBSU0UgPCAyNS45OSAgICAgICAgICAgICAgICB+ICI8IDI1JSIsDQogICAgICBSU0UgPD0gNTAuOTkgICAgICAgICAgICAgICB+ICIyNuKAkzUwJSIsDQogICAgICBSU0UgPiA1MCAgICAgICAgICAgICAgICAgICB+ICI+IDUwJSINCiAgICApDQogICkNCg0KdGFibGUoaGFzaWxQJFJTRVBfa2F0LCB1c2VOQSA9ICJpZmFueSIpDQpgYGANCg0KDQoqKlZpc3VhbGlzYXNpIFByb3ZpbnNpKioNCg0KYGBge3J9DQpnZ3Bsb3QoaGFzaWxQLCBhZXMoeCA9IFVydXQsIHkgPSBSU0UsIGdyb3VwID0gMSwgY29sb3IgPSBSU0VQX2thdCkpICsNCiAgZ2VvbV9wb2ludChzaXplID0gMykgKw0KICANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSArDQogIA0Kc2NhbGVfY29sb3JfbWFudWFsKA0KICBuYW1lID0gIkthdGVnb3JpIFJTRSIsDQogIGxpbWl0cyA9IGMoIjwgMjUlIiwgIjI24oCTNTAlIiwgIj4gNTAlIiksDQogIHZhbHVlcyA9IGMoDQogICAgIjwgMjUlIiAgPSAiIzFCOUU3NyIsDQogICAgIjI24oCTNTAlIiA9ICIjRkY4QzAwIiwNCiAgICAiPiA1MCUiICA9ICIjNzU3MEIzIg0KICApLA0KICBuYS52YWx1ZSA9ICIjRDczMDI3IiwNCiAgZHJvcCA9IEZBTFNFDQopICsNCiAgICBsYWJzKA0KICAgIHRpdGxlID0gIlJTRSBIQ0IgcGVyIFByb3ZpbnNpIiwNCiAgICBzdWJ0aXRsZSA9ICJkZW5nYW4gZ2FyaXMgYmF0YXMgUlNFIDI1JSBkYW4gNTAlIiwNCiAgICB4ID0gIlByb3ZpbnNpIiwNCiAgICB5ID0gIk5pbGFpIFJTRSAoJSkiDQogICkgKw0KICANCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNSksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0MCwgdmp1c3QgPSAxLCBoanVzdCA9IDEpDQogICkNCmBgYA0KDQojIyBFc3RpbWF0aW9uIGJ5IGRpc3RyaWN0DQoNCmBgYHtyfQ0Kb3V0cHV0ID0gYXMuZGF0YS5mcmFtZShjYmluZChoYXNpbCRrYWJ1LCBoYXNpbCR0aGV0YSwgaGFzaWwkU0UsIGhhc2lsJFZBUiwgaGFzaWwkQ0lfTE9XRVIsIGhhc2lsJENJX1VQUEVSLCBoYXNpbCRSU0UsIGhhc2lsJERFRkYpKQ0KbmFtZXMob3V0cHV0KSA9IGMoIktha28iLCJFc3RpbWFzaSIsIlNFIiwiVkFSIiwiQ0kgTE9XRVIiLCJDSSBVUFBFUiIsIlJTRSIsIkRFRkYiKQ0KaGVhZCgob3V0cHV0W29yZGVyKG91dHB1dCRLYWtvLCBkZWNyZWFzaW5nID0gRkFMU0UpLCBdICAgKSkNCmBgYA0KDQoqKktlbG9tcG9rIFJTRSBLYWJ1cGF0ZW4va290YSoqDQoNCmBgYHtyfQ0KaGFzaWwgPC0gaGFzaWwgJT4lDQogIG11dGF0ZSgNCiAgICBSU0UgPSBpZl9lbHNlKFJTRSA9PSAwLCBOQV9yZWFsXywgUlNFKQ0KICApICU+JQ0KICBhcnJhbmdlKFJTRSkgJT4lDQogIG11dGF0ZSgNCiAgICBVcnV0ID0gcm93X251bWJlcigpLA0KICAgIFJTRV9rYXQgPSBjYXNlX3doZW4oDQogICAgICBpcy5uYShSU0UpICAgICAgICAgICAgICAgICB+IE5BX2NoYXJhY3Rlcl8sDQogICAgICBSU0UgPCAyNS45OSAgICAgICAgICAgICAgICB+ICI8IDI1JSIsDQogICAgICBSU0UgPD0gNTAuOTkgICAgICAgICAgICAgICB+ICIyNuKAkzUwJSIsDQogICAgICBSU0UgPiA1MCAgICAgICAgICAgICAgICAgICB+ICI+IDUwJSINCiAgICApDQogICkNCg0KdGFibGUoaGFzaWwkUlNFX2thdCwgdXNlTkEgPSAiaWZhbnkiKQ0KYGBgDQoNCg0KYGBge3J9DQpoYXNpbF9wbG90IDwtIGhhc2lsICU+JQ0KICBtdXRhdGUoDQogICAgUlNFX3Bsb3QgPSBpZl9lbHNlKGlzLm5hKFJTRSksIC0yLCBSU0UpICAjIHRhcnVoIE5BIGRpIGJhd2FoIHN1bWJ1DQogICkNCg0KZ2dwbG90KGhhc2lsX3Bsb3QsIGFlcyh4ID0gVXJ1dCwgeSA9IFJTRV9wbG90LCBjb2xvciA9IFJTRV9rYXQpKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gMC4zNSwgaGVpZ2h0ID0gMCwgc2l6ZSA9IDEuOCwgYWxwaGEgPSAwLjg1KSArDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSArDQoNCiAgc2NhbGVfeV9jb250aW51b3VzKA0KICAgIG5hbWUgPSAiTmlsYWkgUlNFICglKSIsDQogICAgYnJlYWtzID0gYygwLCAyNSwgNTApLA0KICAgIGxpbWl0cyA9IGMoLTUsIE5BKQ0KICApICsNCg0KICBzY2FsZV9jb2xvcl9tYW51YWwoDQogICAgbmFtZSA9ICJLYXRlZ29yaSBSU0UiLA0KICAgIGxpbWl0cyA9IGMoIjwgMjUlIiwgIjI24oCTNTAlIiwgIj4gNTAlIiksDQogICAgdmFsdWVzID0gYygNCiAgICAgICI8IDI1JSIgID0gIiMxQjlFNzciLA0KICAgICAgIjI24oCTNTAlIiA9ICIjRkY4QzAwIiwNCiAgICAgICI+IDUwJSIgID0gIiM3NTcwQjMiDQogICAgKSwNCiAgICBuYS52YWx1ZSA9ICIjRDczMDI3IiwNCiAgICBkcm9wID0gRkFMU0UNCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNClNhdHUga2FidXBhdGVuL2tvdGEgbWVtaWxpa2kgbmlsYWkgUlNFID0gMCBzZWhpbmdnYSBkaXBlcmxha3VrYW4gc2ViYWdhaSBkYXRhIHRpZGFrIHRlcnNlZGlhIChOQSkgZGFuIGRpdGFtcGlsa2FuIGRhbGFtIHZpc3VhbGlzYXNpIHNlYmFnYWkgdGl0aWsgYmVyd2FybmEgbWVyYWguDQoNCmBgYHtyfQ0Kd3JpdGUueGxzeChvdXRwdXRQLCJIQ0IgMjAyNV9Qcm92Lnhsc3giKQ0Kd3JpdGUueGxzeChvdXRwdXQsIkhDQiAyMDI1X0tha28ueGxzeCIpDQpgYGANCg0KIyBQZXRhDQoNCmBgYHtyfQ0KbGlicmFyeShzZikNCnBldGFrdSA8LSBzdF9yZWFkKCJQZXRhU0hQNTE0XzM4LnNocCIpDQoNCnBldGFrdSA8LSBwZXRha3UgJT4lDQogIG11dGF0ZShpZGthYiA9IGFzLmNoYXJhY3RlcihpZGthYikpDQpoYXNpbCA8LSBoYXNpbCAlPiUNCiAgbXV0YXRlKGthYnUgPSBhcy5jaGFyYWN0ZXIoa2FidSkpDQpuYW1lcyhwZXRha3UpDQpgYGANCg0KYGBge3J9DQprYWJfbWFwIDwtIHBldGFrdSAlPiUNCiAgbGVmdF9qb2luKA0KICAgIGhhc2lsICU+JSBzZWxlY3Qoa2FidSwgUlNFLCBSU0Vfa2F0KSwNCiAgICBieSA9IGMoImlka2FiIiA9ICJrYWJ1IikNCiAgKQ0Ka2FiX21hcCRSU0Vfa2F0IDwtIGZhY3RvcigNCiAga2FiX21hcCRSU0Vfa2F0LA0KICBsZXZlbHMgPSBjKCI8IDI1JSIsICIyNuKAkzUwJSIsICI+IDUwJSIpDQopDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQpnZ3Bsb3Qoa2FiX21hcCkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gUlNFX2thdCksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDAuMSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCgNCiAgICB2YWx1ZXMgPSBjKA0KICAgICAgIjwgMjUlIiAgID0gIiMxYTk4NTAiLCAgIyBzYW5nYXQgYmFpaw0KICAgICAgIjI24oCTNTAlIiAgPSAiI2ZlZTA4YiIsICAjIGhhdGktaGF0aQ0KICAgICAgIj4gNTAlIiAgID0gIiNkNzMwMjciICAgIyB0aWRhayByZWxpYWJlbA0KICAgICksDQogICAgbmEudmFsdWUgPSAiZGFya2JsdWUiLA0KICAgIGRyb3AgPSBGQUxTRQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJSU0UgSENCIHBlciBLYWJ1cGF0ZW4va290YSIsDQogICAgZmlsbCAgPSAiS2F0ZWdvcmkgUlNFIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyBfUmVmZXJlbmNlc18NCg0KWzFdIEpvaW50IENlbnRlciBmb3IgSG91c2luZyBTdHVkaWVzIG9mIEhhcnZhcmQgVW5pdmVyc2l0eS4gKDIwMjMpLiBfVGhlIHN0YXRlIG9mIHRoZSBuYXRpb27igJlzIGhvdXNpbmcgMjAyM18uIENhbWJyaWRnZSwgTUE6IEhhcnZhcmQgVW5pdmVyc2l0eS4NCg0KWzJdIEt1dHR5LCBOLiBLLiAoMjAwNSkuIF9BIG5ldyBtZWFzdXJlIG9mIGhvdXNpbmcgYWZmb3JkYWJpbGl0eTogRXN0aW1hdGVzIGFuZCBhbmFseXRpY2FsIHJlc3VsdHNfLiBIb3VzaW5nIFBvbGljeSBEZWJhdGUsIDE2KDEpLCAxMTPigJMxNDIuDQoNClszXSBTdG9uZSwgTS4gRS4gKDIwMDYpLiBfV2hhdCBpcyBob3VzaW5nIGFmZm9yZGFiaWxpdHk/IFRoZSBjYXNlIGZvciB0aGUgcmVzaWR1YWwgaW5jb21lIGFwcHJvYWNoXy4gSG91c2luZyBQb2xpY3kgRGViYXRlLCAxNygxKSwgMTUx4oCTMTg0LiBodHRwczovL2RvaS5vcmcvMTAuMTA4MC8xMDUxMTQ4Mi4yMDA2Ljk1MjE1NjQNCg0KWzRdIFdvcmxkIEJhbmsuICgyMDE5KS4gX0luZG9uZXNpYSBhZmZvcmRhYmxlIGhvdXNpbmc6IFBvbGljeSBhbmQgaW5zdGl0dXRpb25hbCBhc3Nlc3NtZW50Xy4gV2FzaGluZ3RvbiwgREM6IFdvcmxkIEJhbmsuDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4gRGlyZWt0b3JhdCBTdGF0aXN0aWsgS2VzZWphaHRlcmFhbiBSYWt5YXQsIEJQUywgc2FwdGFoYXNAYnBzLmdvLmlkDQoNCg0KDQoNCg==