knitr::opts_chunk$set(echo = TRUE)

Perumahan adalah salah satu indikator utama kesejahteraan masyarakat. Tidak cukup hanya mengetahui berapa banyak rumah yang layak huni secara rata-rata, karena rata-rata tidak menangkap ketimpangan antar rumah tangga. Dua wilayah bisa memiliki persentase rumah layak huni yang sama, tetapi distribusi kualitas hunian di dalamnya bisa sangat berbeda. Wilayah pertama mungkin relatif merata, sedangkan wilayah kedua sebagian kecil rumah tangga memiliki hunian layak, dan mayoritas lainnya kurang layak. Fenomena ini disebut ketimpangan kualitas hunian.

Untuk mengukur ketimpangan ini secara sistematis, digunakan Housing Adequacy Curve (HAC), sebuah kurva yang memetakan proporsi kumulatif rumah tangga terhadap proporsi kumulatif skor kelayakan hunian (Housing Adequacy Score (HAS)). Dari HAC ini, dapat dihitung Housing Adequacy Inequality Index (HAII), yaitu satu angka yang meringkas seberapa timpang distribusi kualitas hunian. HAII yang lebih tinggi menunjukkan distribusi hunian yang relatif merata, sedangkan HAII yang lebih rendah menandakan ketimpangan yang lebih besar.

Setiap rumah tangga diberikan Housing Adequacy Score (HAS), yaitu skor yang merepresentasikan kualitas hunian secara menyeluruh.

HAS dihitung dari beberapa indikator, antara lain:

  • Luas lantai per kapita: mengukur kepadatan hunian (luas lantai per kapita).

  • Akses air layak: akses rumah tangga terhadap air minum layak.

  • Sanitasi layak: akses rumah tangga terhadap sanitasi layak.

  • Material bangunan: akses rumah tangga terhadap ketahanan bangunan.

  • Kepadatan rumah tangga: kecukupan luas lantai.

Seluruh indikator ini dinormalisasikan ke dalam skala 0–1 dan dirata-ratakan untuk menghasilkan HAS per rumah tangga. Skor ini digunakan untuk mengukur kualitas hunian dan menjadi dasar perhitungan ketimpangan hunian.

1 Inequality Nasional

Analisis dilakukan pada tingkat nasional dengan menggabungkan seluruh rumah tangga di Indonesia. HAC nasional menunjukkan distribusi kumulatif dari HAS seluruh rumah tangga. Kurva mendekati garis diagonal 45° jika distribusi merata, dan semakin melengkung ke bawah, semakin timpang distribusinya. Nilai HAII nasional memberikan gambaran ringkas mengenai ketimpangan hunian di seluruh Indonesia. Angka ini bisa digunakan sebagai referensi untuk membandingkan provinsi atau kabupaten/kota dengan kondisi nasional.

hac_nasional <- data %>%
  arrange(HAS) %>%
  mutate(
    cum_household = seq_len(n())/n(),
    cum_score     = cumsum(HAS)/sum(HAS)
  )
ggplot(hac_nasional, aes(x = cum_household, y = cum_score)) +
  geom_line(color = "#2C7FB8", size = 1.2) +
  geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "red") +
  labs(
    title = "National Housing Adequacy Curve (HAC)",
    x = "Proporsi Kumulatif Rumah Tangga",
    y = "Proporsi Kumulatif Housing Adequacy Score"
  ) +
  theme_minimal()

HAII_nasional <- compute_haii(hac_nasional)
cat("HAII Nasional:", round(HAII_nasional,3), "\n")
## HAII Nasional: 0.448

Meskipun terdapat peningkatan kualitas hunian secara agregat, nilai Housing Adequacy Inequality Index (HAII) nasional sebesar 0,448 menunjukkan bahwa distribusi kualitas hunian di Indonesia masih berada pada kategori ketimpangan menengah. Kondisi ini mengindikasikan bahwa peningkatan kualitas hunian belum dinikmati secara merata oleh seluruh rumah tangga.

2 Inequality Provinsi

Untuk tingkat provinsi, rumah tangga dikelompokkan berdasarkan wilayah. Setiap provinsi dihitung HAII dan confidence interval (CI) menggunakan bootstrap, sehingga diketahui tidak hanya ukuran ketimpangan, tetapi juga ketidakpastian estimasinya. Provinsi dengan HAII tinggi menandakan bahwa distribusi hunian relatif merata, meskipun rata-rata HAS-nya mungkin rendah. Sebaliknya, provinsi dengan HAII rendah menandakan sebagian rumah tangga memiliki hunian baik, tetapi mayoritas lainnya tertinggal.

print(haii_provinsi %>% select(R101, HAII, CI_low, CI_high))
## # A tibble: 38 × 4
##    R101                            HAII CI_low CI_high
##    <dbl+lbl>                      <dbl>  <dbl>   <dbl>
##  1 11 [Aceh]                      0.457  0.456   0.458
##  2 12 [Sumatera Utara]            0.449  0.448   0.450
##  3 13 [Sumatera Barat]            0.451  0.450   0.452
##  4 14 [Riau]                      0.464  0.462   0.465
##  5 15 [Jambi]                     0.457  0.456   0.458
##  6 16 [Sumatera Selatan]          0.451  0.450   0.452
##  7 17 [Bengkulu]                  0.446  0.444   0.447
##  8 18 [Lampung]                   0.452  0.450   0.453
##  9 19 [Kepulauan Bangka Belitung] 0.444  0.443   0.446
## 10 21 [Kepulauan Riau]            0.427  0.426   0.430
## # ℹ 28 more rows

Visualisasi berupa barplot memudahkan perbandingan antar provinsi, sedangkan peta menunjukkan sebaran ketimpangan secara geografis. Informasi ini penting untuk membantu pembuat kebijakan memprioritaskan intervensi, misalnya program rumah layak huni atau perbaikan infrastruktur sanitasi.

## Barplot HAII per Provinsi
ggplot(haii_provinsi, aes(x = reorder(R101, HAII), y = HAII)) +
  geom_col(fill = "#2C7FB8") +
  geom_errorbar(aes(ymin = CI_low, ymax = CI_high), width = 0.2) +
  coord_flip() +
  labs(title = "Housing Adequacy Inequality Index (HAII)",
       x = "Provinsi",
       y = "HAII") +
  theme_minimal()

Pada tingkat provinsi, rumah tangga dikelompokkan berdasarkan wilayah. Untuk setiap provinsi dihitung HAII beserta bootstrap 95% confidence interval (CI), sehingga diketahui ukuran ketimpangan sekaligus ketidakpastian estimasinya.

prov_map <- st_read("Peta_Provinsi38_shp785.shp") %>%
  mutate(kdprov = as.character(kdprov))
## Reading layer `Peta_Provinsi38_shp785' from data source 
##   `D:\2. Pengembangan diri\1 Exercise Bagus\Housing Analysis\Peta_Provinsi38_shp785.shp' 
##   using driver `ESRI Shapefile'
## Simple feature collection with 38 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
haii_provinsi <- haii_provinsi %>%
  mutate(R101 = as.character(R101))

map_data <- prov_map %>%
  left_join(haii_provinsi, by = c("kdprov" = "R101"))

ggplot(map_data) +
  geom_sf(aes(fill = HAII), color = "white", size = 0.15) +
  scale_fill_viridis(option = "plasma", name = "HAII", na.value = "grey90") +
  labs(
    title = "Housing Adequacy Inequality Index (HAII)",
    subtitle = "Provinsi"
  ) +
  theme_minimal()

3 Inequality Kab/kota

print(haii_kako %>% select(KABU, HAII, CI_low, CI_high))
## # A tibble: 514 × 4
##    KABU                         HAII CI_low CI_high
##    <dbl+lbl>                   <dbl>  <dbl>   <dbl>
##  1 1101 [ 1101. SIMEULUE]      0.444  0.439   0.449
##  2 1102 [ 1102. ACEH SINGKIL]  0.439  0.435   0.443
##  3 1103 [ 1103. ACEH SELATAN]  0.458  0.455   0.462
##  4 1104 [ 1104. ACEH TENGGARA] 0.450  0.447   0.453
##  5 1105 [ 1105. ACEH TIMUR]    0.447  0.443   0.451
##  6 1106 [ 1106. ACEH TENGAH]   0.461  0.457   0.466
##  7 1107 [ 1107. ACEH BARAT]    0.473  0.469   0.476
##  8 1108 [ 1108. ACEH BESAR]    0.470  0.466   0.472
##  9 1109 [ 1109. PIDIE]         0.443  0.439   0.447
## 10 1110 [ 1110. BIREUEN]       0.463  0.460   0.467
## # ℹ 504 more rows
# Barplot HAII per Kabupaten/kota
ggplot(haii_kako, aes(x = reorder(KABU, HAII), y = HAII)) +
  geom_col(fill = "#2C7FB8") +
  geom_errorbar(aes(ymin = CI_low, ymax = CI_high), width = 0.2) +
  coord_flip() +
  labs(title = "Housing Adequacy Inequality Index (HAII)",
       x = "Kabupaten/kota",
       y = "HAII") +
  theme_minimal()
prov_map <- st_read("PetaSHP514_38.shp") %>%
  mutate(idkab = as.character(idkab))
## 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
haii_kako <- haii_kako %>%
  mutate(KABU = as.character(KABU))

map_data <- prov_map %>%
  left_join(haii_kako, by = c("idkab" = "KABU"))

ggplot(map_data) +
  geom_sf(aes(fill = HAII), color = "white", size = 0.15) +
  scale_fill_viridis(option = "plasma", name = "HAII", na.value = "grey90") +
  labs(
    title = "Housing Adequacy Inequality Index (HAII)",
    subtitle = "Kabupaten/kota"
  ) +
  theme_minimal()


Direktorat Statistik Kesejahteraan Rakyat, BPS,

LS0tDQp0aXRsZTogIktldGltcGFuZ2FuIEt1YWxpdGFzIEh1bmlhbiAyMDI1Ig0Kc3VidGl0bGU6ICJCZXJkYXNhcmthbiBkYXRhIFN1c2VuYXMgTWFyZXQgMjAyNSINCmF1dGhvcjogIlNhcHRhIEhhc3RobyBQb25jbyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keXsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpQZXJ1bWFoYW4gYWRhbGFoIHNhbGFoIHNhdHUgaW5kaWthdG9yIHV0YW1hIGtlc2VqYWh0ZXJhYW4gbWFzeWFyYWthdC4gVGlkYWsgY3VrdXAgaGFueWEgbWVuZ2V0YWh1aSBiZXJhcGEgYmFueWFrIHJ1bWFoIHlhbmcgbGF5YWsgaHVuaSBzZWNhcmEgcmF0YS1yYXRhLCBrYXJlbmEgcmF0YS1yYXRhIHRpZGFrIG1lbmFuZ2thcCBrZXRpbXBhbmdhbiBhbnRhciBydW1haCB0YW5nZ2EuIER1YSB3aWxheWFoIGJpc2EgbWVtaWxpa2kgcGVyc2VudGFzZSBydW1haCBsYXlhayBodW5pIHlhbmcgc2FtYSwgdGV0YXBpIGRpc3RyaWJ1c2kga3VhbGl0YXMgaHVuaWFuIGRpIGRhbGFtbnlhIGJpc2Egc2FuZ2F0IGJlcmJlZGEuIFdpbGF5YWggcGVydGFtYSBtdW5na2luIHJlbGF0aWYgbWVyYXRhLCBzZWRhbmdrYW4gd2lsYXlhaCBrZWR1YSBzZWJhZ2lhbiBrZWNpbCBydW1haCB0YW5nZ2EgbWVtaWxpa2kgaHVuaWFuIGxheWFrLCBkYW4gbWF5b3JpdGFzIGxhaW5ueWEga3VyYW5nIGxheWFrLiBGZW5vbWVuYSBpbmkgZGlzZWJ1dCBrZXRpbXBhbmdhbiBrdWFsaXRhcyBodW5pYW4uDQoNClVudHVrIG1lbmd1a3VyIGtldGltcGFuZ2FuIGluaSBzZWNhcmEgc2lzdGVtYXRpcywgZGlndW5ha2FuIF9Ib3VzaW5nIEFkZXF1YWN5IEN1cnZlXyAoSEFDKSwgc2VidWFoIGt1cnZhIHlhbmcgbWVtZXRha2FuIHByb3BvcnNpIGt1bXVsYXRpZiBydW1haCB0YW5nZ2EgdGVyaGFkYXAgcHJvcG9yc2kga3VtdWxhdGlmIHNrb3Iga2VsYXlha2FuIGh1bmlhbiAoX0hvdXNpbmcgQWRlcXVhY3kgU2NvcmVfIChIQVMpKS4gRGFyaSBIQUMgaW5pLCBkYXBhdCBkaWhpdHVuZyBfSG91c2luZyBBZGVxdWFjeSBJbmVxdWFsaXR5IEluZGV4XyAoSEFJSSksIHlhaXR1IHNhdHUgYW5na2EgeWFuZyBtZXJpbmdrYXMgc2ViZXJhcGEgdGltcGFuZyBkaXN0cmlidXNpIGt1YWxpdGFzIGh1bmlhbi4gSEFJSSB5YW5nIGxlYmloIHRpbmdnaSBtZW51bmp1a2thbiBkaXN0cmlidXNpIGh1bmlhbiB5YW5nIHJlbGF0aWYgbWVyYXRhLCBzZWRhbmdrYW4gSEFJSSB5YW5nIGxlYmloIHJlbmRhaCBtZW5hbmRha2FuIGtldGltcGFuZ2FuIHlhbmcgbGViaWggYmVzYXIuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShoYXZlbikNCmxpYnJhcnkob3Blbnhsc3gpDQpsaWJyYXJ5KGRwbHlyKSAgICANCmxpYnJhcnkocHVycnIpICAgIA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzZikNCmxpYnJhcnkodmlyaWRpcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldHdkKCJEOlxcMi4gUGVuZ2VtYmFuZ2FuIGRpcmlcXDEgRXhlcmNpc2UgQmFndXNcXEhvdXNpbmcgQW5hbHlzaXMiKQ0KYGBgDQoNCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmRhdGEgPC0gcmVhZF9zYXYoIlJMSDIwMjUuc2F2IikNCmBgYA0KDQpTZXRpYXAgcnVtYWggdGFuZ2dhIGRpYmVyaWthbiBfSG91c2luZyBBZGVxdWFjeSBTY29yZV8gKEhBUyksIHlhaXR1IHNrb3IgeWFuZyBtZXJlcHJlc2VudGFzaWthbiBrdWFsaXRhcyBodW5pYW4gc2VjYXJhIG1lbnllbHVydWguIA0KDQpIQVMgZGloaXR1bmcgZGFyaSBiZWJlcmFwYSBpbmRpa2F0b3IsIGFudGFyYSBsYWluOg0KDQotIEx1YXMgbGFudGFpIHBlciBrYXBpdGE6IG1lbmd1a3VyIGtlcGFkYXRhbiBodW5pYW4gKGx1YXMgbGFudGFpIHBlciBrYXBpdGEpLg0KDQotIEFrc2VzIGFpciBsYXlhazogYWtzZXMgcnVtYWggdGFuZ2dhIHRlcmhhZGFwIGFpciBtaW51bSBsYXlhay4NCg0KLSBTYW5pdGFzaSBsYXlhazogYWtzZXMgcnVtYWggdGFuZ2dhIHRlcmhhZGFwIHNhbml0YXNpIGxheWFrLg0KDQotIE1hdGVyaWFsIGJhbmd1bmFuOiBha3NlcyBydW1haCB0YW5nZ2EgdGVyaGFkYXAga2V0YWhhbmFuIGJhbmd1bmFuLg0KDQotIEtlcGFkYXRhbiBydW1haCB0YW5nZ2E6IGtlY3VrdXBhbiBsdWFzIGxhbnRhaS4NCg0KU2VsdXJ1aCBpbmRpa2F0b3IgaW5pIGRpbm9ybWFsaXNhc2lrYW4ga2UgZGFsYW0gc2thbGEgMOKAkzEgZGFuIGRpcmF0YS1yYXRha2FuIHVudHVrIG1lbmdoYXNpbGthbiBIQVMgcGVyIHJ1bWFoIHRhbmdnYS4gU2tvciBpbmkgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIGt1YWxpdGFzIGh1bmlhbiBkYW4gbWVuamFkaSBkYXNhciBwZXJoaXR1bmdhbiBrZXRpbXBhbmdhbiBodW5pYW4uDQoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIE1lbmdoaXR1bmcgSEFTDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShIQVMgPSByb3dNZWFucyhzZWxlY3QoLiwgTHVhc19jYXAsIEFfTEFZQUssIFNfTEFZQUssIER1cmFiZWwsIFJzdWZmaSksIG5hLnJtID0gVFJVRSkpDQpgYGANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIEhBQyAmIEhBSUkgRnVuY3Rpb25zDQpjb21wdXRlX2hhYyA8LSBmdW5jdGlvbihzY29yZSkgew0KICAjIEhBQzogY3VtdWxhdGl2ZSBwcm9wb3J0aW9uIG9mIGhvdXNlaG9sZHMgdnMgY3VtdWxhdGl2ZSBIQVMNCiAgc2NvcmUgPC0gc29ydChzY29yZSkNCiAgbiA8LSBsZW5ndGgoc2NvcmUpDQogIGRhdGEuZnJhbWUoDQogICAgY3VtX2hvdXNlaG9sZCA9IHNlcV9sZW4obikvbiwNCiAgICBjdW1fc2NvcmUgICAgID0gY3Vtc3VtKHNjb3JlKS9zdW0oc2NvcmUpDQogICkNCn0NCg0KY29tcHV0ZV9oYWlpIDwtIGZ1bmN0aW9uKGhhY19kZikgew0KICAjIEhBSUk6IGFyZWEgdW5kZXIgSEFDDQogIHdpdGgoaGFjX2RmLA0KICAgICAgIHN1bShkaWZmKGN1bV9ob3VzZWhvbGQpICogKGhlYWQoY3VtX3Njb3JlLC0xKSt0YWlsKGN1bV9zY29yZSwtMSkpLzIpDQogICkNCn0NCmBgYA0KDQojIEluZXF1YWxpdHkgTmFzaW9uYWwNCg0KQW5hbGlzaXMgZGlsYWt1a2FuIHBhZGEgdGluZ2thdCBuYXNpb25hbCBkZW5nYW4gbWVuZ2dhYnVuZ2thbiBzZWx1cnVoIHJ1bWFoIHRhbmdnYSBkaSBJbmRvbmVzaWEuIEhBQyBuYXNpb25hbCBtZW51bmp1a2thbiBkaXN0cmlidXNpIGt1bXVsYXRpZiBkYXJpIEhBUyBzZWx1cnVoIHJ1bWFoIHRhbmdnYS4gS3VydmEgbWVuZGVrYXRpIGdhcmlzIGRpYWdvbmFsIDQ1wrAgamlrYSBkaXN0cmlidXNpIG1lcmF0YSwgZGFuIHNlbWFraW4gbWVsZW5na3VuZyBrZSBiYXdhaCwgc2VtYWtpbiB0aW1wYW5nIGRpc3RyaWJ1c2lueWEuIE5pbGFpIEhBSUkgbmFzaW9uYWwgbWVtYmVyaWthbiBnYW1iYXJhbiByaW5na2FzIG1lbmdlbmFpIGtldGltcGFuZ2FuIGh1bmlhbiBkaSBzZWx1cnVoIEluZG9uZXNpYS4gQW5na2EgaW5pIGJpc2EgZGlndW5ha2FuIHNlYmFnYWkgcmVmZXJlbnNpIHVudHVrIG1lbWJhbmRpbmdrYW4gcHJvdmluc2kgYXRhdSBrYWJ1cGF0ZW4va290YSBkZW5nYW4ga29uZGlzaSBuYXNpb25hbC4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIyBIQUlJICsgQm9vdHN0cmFwIENJDQpib290c3RyYXBfaGFpaSA8LSBmdW5jdGlvbihzY29yZSwgQiA9IDMwMCkgew0KICAjIEJvb3RzdHJhcCBIQUlJIHVudHVrIENJDQogIHJlcGxpY2F0ZShCLCBjb21wdXRlX2hhaWkoY29tcHV0ZV9oYWMoc2FtcGxlKHNjb3JlLCByZXBsYWNlID0gVFJVRSkpKSkNCn0NCmBgYA0KDQoNCmBgYHtyfQ0KaGFjX25hc2lvbmFsIDwtIGRhdGEgJT4lDQogIGFycmFuZ2UoSEFTKSAlPiUNCiAgbXV0YXRlKA0KICAgIGN1bV9ob3VzZWhvbGQgPSBzZXFfbGVuKG4oKSkvbigpLA0KICAgIGN1bV9zY29yZSAgICAgPSBjdW1zdW0oSEFTKS9zdW0oSEFTKQ0KICApDQpgYGANCiAgDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ2dwbG90KGhhY19uYXNpb25hbCwgYWVzKHggPSBjdW1faG91c2Vob2xkLCB5ID0gY3VtX3Njb3JlKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzJDN0ZCOCIsIHNpemUgPSAxLjIpICsNCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTmF0aW9uYWwgSG91c2luZyBBZGVxdWFjeSBDdXJ2ZSAoSEFDKSIsDQogICAgeCA9ICJQcm9wb3JzaSBLdW11bGF0aWYgUnVtYWggVGFuZ2dhIiwNCiAgICB5ID0gIlByb3BvcnNpIEt1bXVsYXRpZiBIb3VzaW5nIEFkZXF1YWN5IFNjb3JlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCkhBSUlfbmFzaW9uYWwgPC0gY29tcHV0ZV9oYWlpKGhhY19uYXNpb25hbCkNCmNhdCgiSEFJSSBOYXNpb25hbDoiLCByb3VuZChIQUlJX25hc2lvbmFsLDMpLCAiXG4iKQ0KYGBgDQoNCk1lc2tpcHVuIHRlcmRhcGF0IHBlbmluZ2thdGFuIGt1YWxpdGFzIGh1bmlhbiBzZWNhcmEgYWdyZWdhdCwgbmlsYWkgX0hvdXNpbmcgQWRlcXVhY3kgSW5lcXVhbGl0eSBJbmRleF8gKEhBSUkpIG5hc2lvbmFsIHNlYmVzYXIgMCw0NDggbWVudW5qdWtrYW4gYmFod2EgZGlzdHJpYnVzaSBrdWFsaXRhcyBodW5pYW4gZGkgSW5kb25lc2lhIG1hc2loIGJlcmFkYSBwYWRhIGthdGVnb3JpIGtldGltcGFuZ2FuIG1lbmVuZ2FoLiBLb25kaXNpIGluaSBtZW5naW5kaWthc2lrYW4gYmFod2EgcGVuaW5na2F0YW4ga3VhbGl0YXMgaHVuaWFuIGJlbHVtIGRpbmlrbWF0aSBzZWNhcmEgbWVyYXRhIG9sZWggc2VsdXJ1aCBydW1haCB0YW5nZ2EuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0Kd3JpdGUueGxzeChIQUlJX25hc2lvbmFsLCBmaWxlID0gIkhBSUlfbmFzaW9uYWwueGxzeCIsDQogICAgICAgICAgIHNoZWV0TmFtZSA9ICJIQUlJIiwgb3ZlcndyaXRlID0gVFJVRSkNCmBgYA0KDQojIEluZXF1YWxpdHkgUHJvdmluc2kNCg0KVW50dWsgdGluZ2thdCBwcm92aW5zaSwgcnVtYWggdGFuZ2dhIGRpa2Vsb21wb2trYW4gYmVyZGFzYXJrYW4gd2lsYXlhaC4gU2V0aWFwIHByb3ZpbnNpIGRpaGl0dW5nIEhBSUkgZGFuIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKENJKSBtZW5nZ3VuYWthbiBib290c3RyYXAsIHNlaGluZ2dhIGRpa2V0YWh1aSB0aWRhayBoYW55YSB1a3VyYW4ga2V0aW1wYW5nYW4sIHRldGFwaSBqdWdhIGtldGlkYWtwYXN0aWFuIGVzdGltYXNpbnlhLiBQcm92aW5zaSBkZW5nYW4gSEFJSSB0aW5nZ2kgbWVuYW5kYWthbiBiYWh3YSBkaXN0cmlidXNpIGh1bmlhbiByZWxhdGlmIG1lcmF0YSwgbWVza2lwdW4gcmF0YS1yYXRhIEhBUy1ueWEgbXVuZ2tpbiByZW5kYWguIFNlYmFsaWtueWEsIHByb3ZpbnNpIGRlbmdhbiBIQUlJIHJlbmRhaCBtZW5hbmRha2FuIHNlYmFnaWFuIHJ1bWFoIHRhbmdnYSBtZW1pbGlraSBodW5pYW4gYmFpaywgdGV0YXBpIG1heW9yaXRhcyBsYWlubnlhIHRlcnRpbmdnYWwuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyMgSEFJSSArIEJvb3RzdHJhcCBDSQ0Kc2V0LnNlZWQoMTIzKQ0KaGFpaV9wcm92aW5zaSA8LSBkYXRhICU+JQ0KICBncm91cF9ieShSMTAxKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIEhBSUkgICAgPSBjb21wdXRlX2hhaWkoY29tcHV0ZV9oYWMoSEFTKSksDQogICAgQ0lfbG93ICA9IHF1YW50aWxlKGJvb3RzdHJhcF9oYWlpKEhBUyksIDAuMDI1KSwNCiAgICBDSV9oaWdoID0gcXVhbnRpbGUoYm9vdHN0cmFwX2hhaWkoSEFTKSwgMC45NzUpLA0KICAgIG5fcnQgICAgPSBuKCksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBhcnJhbmdlKFIxMDEpICAjIGFzY2VuZGluZyBtZW51cnV0IG5hbWEgcHJvdmluc2kNCmBgYA0KDQpgYGB7cn0NCnByaW50KGhhaWlfcHJvdmluc2kgJT4lIHNlbGVjdChSMTAxLCBIQUlJLCBDSV9sb3csIENJX2hpZ2gpKQ0KYGBgDQoNClZpc3VhbGlzYXNpIGJlcnVwYSBiYXJwbG90IG1lbXVkYWhrYW4gcGVyYmFuZGluZ2FuIGFudGFyIHByb3ZpbnNpLCBzZWRhbmdrYW4gcGV0YSBtZW51bmp1a2thbiBzZWJhcmFuIGtldGltcGFuZ2FuIHNlY2FyYSBnZW9ncmFmaXMuIEluZm9ybWFzaSBpbmkgcGVudGluZyB1bnR1ayBtZW1iYW50dSBwZW1idWF0IGtlYmlqYWthbiBtZW1wcmlvcml0YXNrYW4gaW50ZXJ2ZW5zaSwgbWlzYWxueWEgcHJvZ3JhbSBydW1haCBsYXlhayBodW5pIGF0YXUgcGVyYmFpa2FuIGluZnJhc3RydWt0dXIgc2FuaXRhc2kuDQoNCmBgYHtyfQ0KIyMgQmFycGxvdCBIQUlJIHBlciBQcm92aW5zaQ0KZ2dwbG90KGhhaWlfcHJvdmluc2ksIGFlcyh4ID0gcmVvcmRlcihSMTAxLCBIQUlJKSwgeSA9IEhBSUkpKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzJDN0ZCOCIpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IENJX2xvdywgeW1heCA9IENJX2hpZ2gpLCB3aWR0aCA9IDAuMikgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIkhvdXNpbmcgQWRlcXVhY3kgSW5lcXVhbGl0eSBJbmRleCAoSEFJSSkiLA0KICAgICAgIHggPSAiUHJvdmluc2kiLA0KICAgICAgIHkgPSAiSEFJSSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KUGFkYSB0aW5na2F0IHByb3ZpbnNpLCBydW1haCB0YW5nZ2EgZGlrZWxvbXBva2thbiBiZXJkYXNhcmthbiB3aWxheWFoLiBVbnR1ayBzZXRpYXAgcHJvdmluc2kgZGloaXR1bmcgSEFJSSBiZXNlcnRhIGJvb3RzdHJhcCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoQ0kpLCBzZWhpbmdnYSBkaWtldGFodWkgdWt1cmFuIGtldGltcGFuZ2FuIHNla2FsaWd1cyBrZXRpZGFrcGFzdGlhbiBlc3RpbWFzaW55YS4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcm92X21hcCA8LSBzdF9yZWFkKCJQZXRhX1Byb3ZpbnNpMzhfc2hwNzg1LnNocCIpICU+JQ0KICBtdXRhdGUoa2Rwcm92ID0gYXMuY2hhcmFjdGVyKGtkcHJvdikpDQoNCmhhaWlfcHJvdmluc2kgPC0gaGFpaV9wcm92aW5zaSAlPiUNCiAgbXV0YXRlKFIxMDEgPSBhcy5jaGFyYWN0ZXIoUjEwMSkpDQoNCm1hcF9kYXRhIDwtIHByb3ZfbWFwICU+JQ0KICBsZWZ0X2pvaW4oaGFpaV9wcm92aW5zaSwgYnkgPSBjKCJrZHByb3YiID0gIlIxMDEiKSkNCg0KZ2dwbG90KG1hcF9kYXRhKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBIQUlJKSwgY29sb3IgPSAid2hpdGUiLCBzaXplID0gMC4xNSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIsIG5hbWUgPSAiSEFJSSIsIG5hLnZhbHVlID0gImdyZXk5MCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJIb3VzaW5nIEFkZXF1YWN5IEluZXF1YWxpdHkgSW5kZXggKEhBSUkpIiwNCiAgICBzdWJ0aXRsZSA9ICJQcm92aW5zaSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0Kd3JpdGUueGxzeChoYWlpX3Byb3ZpbnNpLCBmaWxlID0gIkhBSUlfcGVyX3Byb3ZpbnNpLnhsc3giLA0KICAgICAgICAgICBzaGVldE5hbWUgPSAiSEFJSSIsIG92ZXJ3cml0ZSA9IFRSVUUpDQpgYGANCg0KIyBJbmVxdWFsaXR5IEthYi9rb3RhDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyMgSEFJSSArIEJvb3RzdHJhcCBDSQ0Kc2V0LnNlZWQoMTIzKQ0KaGFpaV9rYWtvIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KEtBQlUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgSEFJSSAgICA9IGNvbXB1dGVfaGFpaShjb21wdXRlX2hhYyhIQVMpKSwNCiAgICBDSV9sb3cgID0gcXVhbnRpbGUoYm9vdHN0cmFwX2hhaWkoSEFTKSwgMC4wMjUpLA0KICAgIENJX2hpZ2ggPSBxdWFudGlsZShib290c3RyYXBfaGFpaShIQVMpLCAwLjk3NSksDQogICAgbl9ydCAgICA9IG4oKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIGFycmFuZ2UoS0FCVSkNCmBgYA0KDQpgYGB7cn0NCnByaW50KGhhaWlfa2FrbyAlPiUgc2VsZWN0KEtBQlUsIEhBSUksIENJX2xvdywgQ0lfaGlnaCkpDQpgYGANCg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgQmFycGxvdCBIQUlJIHBlciBLYWJ1cGF0ZW4va290YQ0KZ2dwbG90KGhhaWlfa2FrbywgYWVzKHggPSByZW9yZGVyKEtBQlUsIEhBSUkpLCB5ID0gSEFJSSkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMkM3RkI4IikgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gQ0lfbG93LCB5bWF4ID0gQ0lfaGlnaCksIHdpZHRoID0gMC4yKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnModGl0bGUgPSAiSG91c2luZyBBZGVxdWFjeSBJbmVxdWFsaXR5IEluZGV4IChIQUlJKSIsDQogICAgICAgeCA9ICJLYWJ1cGF0ZW4va290YSIsDQogICAgICAgeSA9ICJIQUlJIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJvdl9tYXAgPC0gc3RfcmVhZCgiUGV0YVNIUDUxNF8zOC5zaHAiKSAlPiUNCiAgbXV0YXRlKGlka2FiID0gYXMuY2hhcmFjdGVyKGlka2FiKSkNCg0KaGFpaV9rYWtvIDwtIGhhaWlfa2FrbyAlPiUNCiAgbXV0YXRlKEtBQlUgPSBhcy5jaGFyYWN0ZXIoS0FCVSkpDQoNCm1hcF9kYXRhIDwtIHByb3ZfbWFwICU+JQ0KICBsZWZ0X2pvaW4oaGFpaV9rYWtvLCBieSA9IGMoImlka2FiIiA9ICJLQUJVIikpDQoNCmdncGxvdChtYXBfZGF0YSkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gSEFJSSksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDAuMTUpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCBuYW1lID0gIkhBSUkiLCBuYS52YWx1ZSA9ICJncmV5OTAiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSG91c2luZyBBZGVxdWFjeSBJbmVxdWFsaXR5IEluZGV4IChIQUlJKSIsDQogICAgc3VidGl0bGUgPSAiS2FidXBhdGVuL2tvdGEiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCndyaXRlLnhsc3goaGFpaV9rYWtvLCBmaWxlID0gIkhBSUlfcGVyX2tha28ueGxzeCIsDQogICAgICAgICAgIHNoZWV0TmFtZSA9ICJIQUlJIiwgb3ZlcndyaXRlID0gVFJVRSkNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiBEaXJla3RvcmF0IFN0YXRpc3RpayBLZXNlamFodGVyYWFuIFJha3lhdCwgQlBTLCBzYXB0YWhhc0BicHMuZ28uaWQNCg0KDQoNCg0K