library(tidyverse)
library(readxl)
library(sf)
library(spdep)
library(ggrepel)
library(knitr)
library(kableExtra)
library(MASS)
library(car)
library(scales)
library(corrplot)
library(CARBayes)    

1 Abstrak

Latar belakang. Tuberkulosis (TB) masih menjadi tantangan utama kesehatan masyarakat, dan Indonesia secara konsisten tergolong negara dengan beban TB tertinggi kedua di dunia. Karena itu, faktor kejadian TB menunjukkan variasi antarwilayah yang dipengaruhi kondisi demografi, sosial ekonomi, lingkungan, dan akses pelayanan kesehatan, pemahaman atas pola spasial dan determinannya penting untuk mendukung pengendalian yang tepat sasaran.

Metode. Penelitian ini menganalisis data agregat tingkat provinsi (34 provinsi yang memiliki data lengkap dan konsisten dengan batas wilayah) selama 2022-2024, bersumber dari publikasi BPS dan Profil Kesehatan Indonesia. Kejadian TB dideskripsikan melalui incidence rate (IR) dan standardized incidence ratio (SIR), divisualisasikan dalam peta tematik. Autokorelasi spasial global dievaluasi dengan indeks Moran’s I, klaster lokal dengan Local Indicators of Spatial Association (LISA), dan intensitas pengelompokan dengan statistik Getis-Ord Gi*. Determinan jumlah kasus dimodelkan menggunakan regresi data cacah dengan offset jumlah penduduk terhadap lima prediktor: indeks pembangunan manusia (IPM), persentase penduduk miskin, akses sanitasi layak, kepadatan penduduk, dan rasio Puskesmas per kecamatan. Pemilihan model ditentukan secara empiris: uji overdispersi mengarahkan penggunaan regresi Negative Binomial, dan uji autokorelasi spasial pada residual menentukan kebutuhan model spasial. Bila residual tidak berautokorelasi, Negative Binomial dinilai memadai; bila residual berautokorelasi spasial, digunakan model Conditional Autoregressive (CAR) Poisson dengan efek acak spasial.

Hasil. Total kasus TB ternotifikasi meningkat dari 724.309 (2022) menjadi 842.383 (2024), dengan rata-rata incidence rate (IR) antarprovinsi naik dari 245,3 menjadi 286,3 per 100.000 penduduk. Berdasarkan SIR 2022, sebanyak sembilan provinsi memiliki risiko di atas rata-rata nasional, tertinggi di DKI Jakarta (SIR=1,83), Gorontalo (1,51), dan Jawa Barat (1,44). Indeks Moran’s I positif dan signifikan sepanjang periode (I=0,233–0,273; p<0,05), menunjukkan autokorelasi spasial yang konsisten — provinsi ber-IR tinggi cenderung mengelompok secara geografis. Pada model Negative Binomial 2022, rasio Puskesmas per kecamatan berasosiasi signifikan dengan penurunan insidens (IRR=0,644; 95% CI: 0,456–0,918) dan kepadatan penduduk dengan kenaikan insidens (p=0,002), sementara IPM, kemiskinan, dan sanitasi tidak signifikan. Uji autokorelasi residual mengarahkan penggunaan model CAR Poisson untuk 2024 (residual berautokorelasi, p=0,044), yang hasilnya konsisten dengan model Negative Binomial.

Kesimpulan. Insidens TB di Indonesia menunjukkan tren meningkat dan pengelompokan spasial yang menetap antarprovinsi sepanjang 2022–2024, dengan beban tertinggi terkonsentrasi di provinsi padat penduduk seperti DKI Jakarta dan sekitarnya. Rasio Puskesmas per kecamatan yang lebih tinggi berasosiasi dengan insidens lebih rendah, mengindikasikan peran penting ketersediaan fasilitas kesehatan primer. Temuan ini mendukung strategi pengendalian TB berbasis wilayah yang menargetkan provinsi hotspot dan penguatan layanan kesehatan primer.

Kata kunci: tuberkulosis; epidemiologi spasial; incidence rate; Indonesia; autokorelasi spasial; Negative Binomial; model CAR.

2 Pendahuluan

Tuberkulosis (TB) merupakan salah satu penyakit menular yang masih menjadi tantangan utama kesehatan masyarakat di dunia. Penyakit yang disebabkan oleh Mycobacterium tuberculosis ini ditularkan melalui udara dan menjadi salah satu penyebab utama kematian akibat penyakit infeksi. Indonesia termasuk negara dengan beban TB tertinggi di dunia dan secara konsisten berada dalam kelompok negara prioritas pengendalian TB menurut World Health Organization (WHO, 2023). Tingginya jumlah kasus dan kematian akibat TB menunjukkan bahwa upaya pengendalian penyakit ini masih memerlukan perhatian yang serius, terutama dalam mengidentifikasi wilayah dengan risiko tinggi dan faktor-faktor yang berkontribusi terhadap tingginya kejadian penyakit. Dalam epidemiologi, distribusi penyakit dipelajari berdasarkan dimensi orang (person), tempat (place), dan waktu (time). Dimensi tempat memiliki peran penting karena kejadian TB seringkali menunjukkan variasi antarwilayah yang dipengaruhi oleh kondisi demografi, sosial ekonomi, lingkungan, maupun akses terhadap pelayanan kesehatan. Sebagai negara kepulauan yang terdiri atas 38 provinsi dengan karakteristik yang sangat beragam, Indonesia memiliki potensi terjadinya perbedaan beban TB antarwilayah. Oleh karena itu, pemahaman mengenai pola distribusi geografis TB menjadi penting untuk mendukung perencanaan program pengendalian yang lebih efektif dan tepat sasaran. Pendekatan epidemiologi spasial menggunakan indeks Moran’s I dilakukan untuk mengidentifikasi pola pengelompokan (spatial clustering) kasus Tuberkulosis (TB) akibat faktor risiko regional. Selain aspek spasial, analisis determinan juga diperlukan menggunakan pendekatan data cacah (count data). Karena data epidemiologi TB sering mengalami overdispersi (varians melebihi rata-rata), model regresi negative binomial dipilih karena lebih akurat dibanding regresi Poisson standar. Pada skala provinsi dengan jumlah unit wilayah yang terbatas, model ini menjadi alternatif yang lebih sederhana namun memadai dibandingkan pendekatan Bayesian hierarkis yang kompleks. Penelitian ini bertujuan untuk menganalisis distribusi spasial, mengevaluasi autokorelasi, dan mengidentifikasi determinan kasus TB tingkat provinsi di Indonesia guna mendukung kebijakan pengendalian berbasis wilayah yang lebih efektif.

Pertanyaan penelitian.

  1. Bagaimana distribusi spasial kasus tuberkulosis antarprovinsi di Indonesia?
  2. Apakah terdapat autokorelasi spasial pada distribusi kasus tuberkulosis antarprovinsi?
  3. Faktor-faktor apa yang berhubungan dengan variasi jumlah kasus tuberkulosis pada tingkat provinsi di Indonesia?

3 Data dan Metode

3.1 Sumber dan Unit Data

sumber: Data dikumpulkan dari publikasi BPS dan Profil Kesehatan Indonesia yang diakses pada tanggal 12 Juni 2026. Unit: provinsi (34), 3 tahun.

Variabel Definisi Satuan
Kasus Jumlah kasus TB ternotifikasi (L+P) kasus
Penduduk Jumlah penduduk jiwa
IR Insidens rate = Kasus/Penduduk x 100.000 per 100.000
IPM Indeks Pembangunan Manusia indeks
Miskin Persentase penduduk miskin %
Sanitasi Persentase sanitasi layak %
Kepadatan Kepadatan penduduk per km2
Rasio_Pkm Rasio Puskesmas per kecamatan rasio
JKN Total peserta aktif JKN jiwa

3.2 Ringkasan Data TB 2022-2024

user   <- "Winaliaagwil"
repo   <- "analisis_tb_indonesia"
branch <- "main"
base   <- sprintf("https://raw.githubusercontent.com/%s/%s/%s/", user, repo, branch)

url_xlsx <- paste0(base, "Data%20TB%202022_2024.xlsx")
url_zip  <- paste0(base, "indonesia_34_provinsi.zip")

download.file(url_xlsx, "DataTB.xlsx", mode = "wb", quiet = TRUE)
download.file(url_zip,  "shp.zip",     mode = "wb", quiet = TRUE)
unzip("shp.zip", exdir = "shp_folder")

rename_map <- c(
  "Wilayah / Provinsi"             = "Provinsi",
  "IPM"                            = "IPM",
  "Persentase Penduduk Miskin"     = "Miskin",
  "Persentase Sanitasi Layak"      = "Sanitasi",
  "Kepadatan penduduk (per km2)"   = "Kepadatan",
  "Rasio Puskesmas per Kecamatan"  = "Rasio_Pkm",
  "Total Peserta Aktif JKN (Jiwa)" = "JKN",
  "IR TB per 100000 Penduduk"      = "IR",
  "Jumlah Kasus TB"                = "Kasus",
  "Jumlah Penduduk"                = "Penduduk"
)

baca_sheet <- function(path, sheet) {
  df <- read_excel(path, sheet = sheet)
  names(df) <- dplyr::recode(names(df), !!!rename_map)
  prov <- str_squish(toupper(df$Provinsi))
  prov[prov == "DI YOGYAKARTA"]        <- "DAERAH ISTIMEWA YOGYAKARTA"
  prov[prov == "KEP. BANGKA BELITUNG"] <- "KEPULAUAN BANGKA BELITUNG"
  df$Provinsi <- prov
  df$Tahun <- as.integer(sheet)
  df %>%
    dplyr::select(Provinsi, Tahun, Kasus, Penduduk, IR,
                  IPM, Miskin, Sanitasi, Kepadatan, Rasio_Pkm, JKN)
}

tb_all <- bind_rows(lapply(c("2022","2023","2024"),
                           function(s) baca_sheet("DataTB.xlsx", s)))
tb22 <- filter(tb_all, Tahun == 2022)
tb23 <- filter(tb_all, Tahun == 2023)
tb24 <- filter(tb_all, Tahun == 2024)

indo <- st_read(list.files("shp_folder", pattern="\\.shp$", full.names=TRUE)[1], quiet=TRUE)
indo$Provinsi <- str_squish(toupper(indo$Provinsi))

sf::sf_use_s2(FALSE)
indo <- sf::st_make_valid(indo)

tidak_cocok <- setdiff(indo$Provinsi, tb22$Provinsi)
if (length(tidak_cocok)>0) message("Provinsi peta tanpa data: ", paste(tidak_cocok, collapse=", "))

# daftar data per tahun untuk dipakai ulang
data_tahun <- list("2022"=tb22, "2023"=tb23, "2024"=tb24)

Tahun 2022

724,309
Total kasus
245.3
Rata-rata IR
34
Provinsi
Dki Jakarta
IR tertinggi

Tahun 2023

810,882
Total kasus
282.7
Rata-rata IR
34
Provinsi
Papua
IR tertinggi

Tahun 2024

842,383
Total kasus
286.3
Rata-rata IR
34
Provinsi
Papua
IR tertinggi

3.3 Metode Statistik

Incidence Rate (IR) dan Standardized Incidence Ratio (SIR): \[ IR=\frac{O_i}{P_i}\times 100{,}000, \qquad E_i=\bar r\times P_i, \qquad SIR_i=\frac{O_i}{E_i} \] dengan \(\bar r\) rate nasional. SIR > 1 = risiko di atas rata-rata nasional.

Pola & hotspot spasial. Moran’s I global (autokorelasi), LISA (klaster lokal), dan Getis-Ord Gi* (hotspot/coldspot). Menggunakan pembobot k-nearest neighbours (k=4) karena Indonesia kepulauan.

Determinan. Karena outcome berupa cacahan kasus dengan populasi sebagai offset, dipakai regresi count. Overdispersi diuji (Poisson vs Negative Binomial), autokorelasi spasial residual diuji, dan model spasial (CAR Poisson) disertakan sebagai analisis sensitivitas.

# ============================================================
# Fungsi-fungsi pembuat peta agar bisa dipakai ulang per tahun
# ============================================================

# bobot spasial (sama untuk semua tahun karena geometri tetap)
coords  <- suppressWarnings(st_coordinates(st_centroid(indo)))
k       <- 4
nb_k    <- knn2nb(knearneigh(coords, k=k))
lw      <- nb2listw(nb_k, style="W")
lw_self <- nb2listw(include.self(nb_k), style="W")

# --- Peta IR ---
peta_ir <- function(df, th){
  peta <- indo %>% left_join(df, by="Provinsi")
  top5 <- peta %>% filter(!is.na(IR)) %>% slice_max(IR, n=5)
  co <- as.data.frame(st_coordinates(suppressWarnings(st_centroid(top5))))
  co$label <- paste0(str_to_title(top5$Provinsi), "\n", round(top5$IR,1))
  ggplot(peta) +
    geom_sf(aes(fill=IR), color="white", linewidth=0.15) +
    scale_fill_viridis_c(option="plasma", direction=-1, name="IR TB\n(per 100.000)", na.value="grey85") +
    geom_point(data=co, aes(X,Y), size=1.3) +
    ggrepel::geom_label_repel(data=co, aes(X,Y,label=label), size=3, fontface="bold",
      alpha=0.9, box.padding=0.8, min.segment.length=0, segment.size=0.5,
      arrow=arrow(length=unit(0.015,"npc")), seed=42) +
    labs(title=paste0("Angka Insidensi TB per Provinsi, ", th),
         caption=paste0("Sumber: Profil Kesehatan Indonesia ", th)) +
    theme_minimal(base_size=12) +
    theme(axis.text=element_blank(), axis.title=element_blank(),
          axis.ticks=element_blank(), panel.grid=element_blank())
}

# --- Hitung SIR ---
hitung_sir <- function(df){
  rn <- sum(df$Kasus)/sum(df$Penduduk)
  df %>% mutate(Expected=rn*Penduduk, SIR=Kasus/Expected)
}

# --- Peta SIR ---
peta_sir_fun <- function(df, th){
  sir <- hitung_sir(df)
  peta <- indo %>% left_join(sir, by="Provinsi")
  ggplot(peta) +
    geom_sf(aes(fill=SIR), color="white", linewidth=0.15) +
    scale_fill_gradient2(low="#2166ac", mid="white", high="#b2182b", midpoint=1,
                         name="SIR", na.value="grey85") +
    labs(title=paste0("Standardized Incidence Ratio (SIR) TB, ", th),
         caption="SIR > 1 (merah) = risiko di atas rata-rata nasional") +
    theme_minimal(base_size=12) +
    theme(axis.text=element_blank(), axis.title=element_blank(),
          axis.ticks=element_blank(), panel.grid=element_blank())
}

# --- Tabel SIR ---
tabel_sir <- function(df, th){
  hitung_sir(df) %>% arrange(desc(SIR)) %>%
    transmute(Provinsi=str_to_title(Provinsi), Observed=Kasus,
              Expected=round(Expected,0), SIR=round(SIR,2)) %>%
    head(10) %>%
    kable(caption=paste0("Sepuluh provinsi SIR tertinggi (", th, ").")) %>%
    kable_styling(full_width=FALSE, bootstrap_options=c("striped","hover"))
}

# --- Peta LISA ---
peta_lisa <- function(df, th){
  peta <- indo %>% left_join(df, by="Provinsi")
  x <- peta$IR; xs <- as.numeric(scale(x)); lagxs <- lag.listw(lw, xs)
  locm <- localmoran(x, lw, zero.policy=TRUE); sig <- locm[,5] < 0.05
  peta$klaster <- "Tidak signifikan"
  peta$klaster[sig & xs>0 & lagxs>0] <- "High-High"
  peta$klaster[sig & xs<0 & lagxs<0] <- "Low-Low"
  peta$klaster[sig & xs>0 & lagxs<0] <- "High-Low"
  peta$klaster[sig & xs<0 & lagxs>0] <- "Low-High"
  peta$klaster <- factor(peta$klaster,
    levels=c("High-High","Low-Low","High-Low","Low-High","Tidak signifikan"))
  ggplot(peta) +
    geom_sf(aes(fill=klaster), color="white", linewidth=0.15) +
    scale_fill_manual(values=c("High-High"="#b2182b","Low-Low"="#2166ac",
      "High-Low"="#ef8a62","Low-High"="#67a9cf","Tidak signifikan"="grey88"),
      name="Klaster LISA", drop=FALSE) +
    labs(title=paste0("Klaster Spasial LISA Insidens TB, ", th),
         caption="High-High = hotspot; Low-Low = coldspot") +
    theme_minimal(base_size=12) +
    theme(axis.text=element_blank(), axis.title=element_blank(),
          axis.ticks=element_blank(), panel.grid=element_blank())
}

# --- Peta Hotspot Getis-Ord Gi* ---
peta_getis <- function(df, th){
  peta <- indo %>% left_join(df, by="Provinsi")
  gi <- as.numeric(localG(peta$IR, lw_self, zero.policy=TRUE))
  peta$hot <- cut(gi, breaks=c(-Inf,-2.58,-1.96,-1.65,1.65,1.96,2.58,Inf),
    labels=c("Coldspot 99%","Coldspot 95%","Coldspot 90%","Tidak signifikan",
             "Hotspot 90%","Hotspot 95%","Hotspot 99%"))
  warna_g <- c("Coldspot 99%"="#2166ac","Coldspot 95%"="#67a9cf","Coldspot 90%"="#d1e5f0",
    "Tidak signifikan"="grey88","Hotspot 90%"="#fddbc7","Hotspot 95%"="#ef8a62","Hotspot 99%"="#b2182b")
  ggplot(peta) +
    geom_sf(aes(fill=hot), color="white", linewidth=0.15) +
    scale_fill_manual(values=warna_g, name="Getis-Ord Gi*", drop=FALSE) +
    labs(title=paste0("Hotspot Insidens TB (Getis-Ord Gi*), ", th),
         caption="Merah = hotspot (kumpulan IR tinggi); biru = coldspot") +
    theme_minimal(base_size=12) +
    theme(axis.text=element_blank(), axis.title=element_blank(),
          axis.ticks=element_blank(), panel.grid=element_blank())
}

4 Hasil Analisis

4.1 Analisis Deskriptif

4.1.1 Tren Nasional

tb_all %>% group_by(Tahun) %>% summarise(Total=sum(Kasus)) %>%
  ggplot(aes(Tahun, Total)) +
  geom_col(fill="#1a6985", width=0.6) +
  geom_text(aes(label=comma(Total)), vjust=-0.5, size=3.5) +
  scale_x_continuous(breaks=2022:2024) +
  scale_y_continuous(labels=comma, expand=expansion(mult=c(0,0.12))) +
  labs(x=NULL, y="Total kasus TB") + theme_minimal(base_size=12)
Total kasus TB nasional, 2022-2024.

Total kasus TB nasional, 2022-2024.

Interpretasi. Total kasus TB nasional bergerak dari 724,309 (2022) menjadi 842,383 (2024), menunjukkan tren yang meningkat selama periode pengamatan. Perubahan ini dapat mencerminkan dinamika penemuan kasus maupun beban penyakit yang sesungguhnya.

4.1.2 Provinsi IR Tertinggi

plot_top10 <- function(df, th){
  df %>% slice_max(IR, n=10) %>%
    ggplot(aes(reorder(str_to_title(Provinsi), IR), IR)) +
    geom_col(fill="#e07b39") +
    geom_text(aes(label=round(IR,0)), hjust=-0.2, size=3) +
    coord_flip() + scale_y_continuous(expand=expansion(mult=c(0,0.12))) +
    labs(x=NULL, y=paste0("IR TB per 100.000 (", th, ")")) + theme_minimal(base_size=12)
}

4.1.2.1 2022

plot_top10(tb22, 2022)
Sepuluh provinsi IR tertinggi (2022).

Sepuluh provinsi IR tertinggi (2022).

Interpretasi. DKI Jakarta tercatat sebagai IR TB tertinggi pada 2022 (480 per 100.000), diikuti Gorontalo (397) dan Jawa Barat (379). Sepuluh provinsi teratas didominasi wilayah di Jawa dan Indonesia timur, menunjukkan beban insidens yang terkonsentrasi pada provinsi tertentu.

4.1.2.2 2023

plot_top10(tb23, 2023)
Sepuluh provinsi IR tertinggi (2023).

Sepuluh provinsi IR tertinggi (2023).

Interpretasi (2023). Papua tertinggi (570 per 100.000), menunjukkan pergeseran dari DKI Jakarta tahun sebelumnya.

4.1.2.3 2024

plot_top10(tb24, 2024)
Sepuluh provinsi IR tertinggi (2024).

Sepuluh provinsi IR tertinggi (2024).

Interpretasi (2024). Papua tetap tertinggi (616 per 100.000), mengindikasikan beban insidens yang menetap di wilayah timur.

4.1.3 Ringkasan Statistik

tb_all %>% group_by(Tahun) %>%
  summarise(Total_kasus=sum(Kasus), IR_min=round(min(IR),1),
            IR_median=round(median(IR),1), IR_mean=round(mean(IR),1),
            IR_max=round(max(IR),1)) %>%
  kable(caption="Tabel 1. Ringkasan kasus & IR per tahun.") %>%
  kable_styling(full_width=FALSE, bootstrap_options=c("striped","hover"))
Tabel 1. Ringkasan kasus & IR per tahun.
Tahun Total_kasus IR_min IR_median IR_mean IR_max
2022 724309 105.7 231.8 245.3 480.2
2023 810882 120.4 264.2 282.7 570.2
2024 842383 121.9 265.4 286.3 615.7

Interpretasi. Rata-rata IR antarprovinsi berkisar 245.3-286.3 per 100.000 penduduk sepanjang 2022-2024. Rentang nilai yang lebar (minimum sekitar 105.7 hingga maksimum 615.7) mengindikasikan disparitas insidens yang besar antarprovinsi, yang menjadi dasar perlunya analisis spasial untuk mengetahui apakah provinsi ber-IR tinggi cenderung mengelompok secara geografis.

4.1.4 Ringkasan Variabel per Tahun

Statistik deskriptif (min, median, rata-rata, maks) untuk seluruh variabel pada tiap tahun.

ringkas_var <- function(df, th){
  df %>%
    dplyr::select(Kasus, IR, IPM, Miskin, Sanitasi, Kepadatan, Rasio_Pkm) %>%
    pivot_longer(everything(), names_to="Variabel", values_to="Nilai") %>%
    group_by(Variabel) %>%
    summarise(Min=round(min(Nilai),1), Median=round(median(Nilai),1),
              Mean=round(mean(Nilai),1), Maks=round(max(Nilai),1), .groups="drop") %>%
    kable(caption=paste0("Ringkasan variabel, ", th, ".")) %>%
    kable_styling(full_width=FALSE, bootstrap_options=c("striped","hover"))
}

4.1.4.1 2022

ringkas_var(tb22, 2022)
Ringkasan variabel, 2022.
Variabel Min Median Mean Maks
IPM 61.4 72.2 72.0 81.7
IR 105.7 231.8 245.3 480.2
Kasus 1738.0 8793.0 21303.2 184406.0
Kepadatan 10.0 100.5 772.9 17031.0
Miskin 4.5 8.5 10.3 26.8
Rasio_Pkm 0.7 1.4 1.6 7.2
Sanitasi 40.3 81.7 81.0 96.2

Interpretasi. Pada 2022, IR TB antarprovinsi berkisar 105,7-480,2 per 100.000 (rata-rata 245,3), menunjukkan disparitas yang lebar. Jumlah kasus sangat bervariasi (1.738-184.406), sejalan dengan rentang kepadatan penduduk yang ekstrem (10-17.031 per km²), sehingga populasi perlu diperhitungkan sebagai offset dalam pemodelan.

4.1.4.2 2023

ringkas_var(tb23, 2023)
Ringkasan variabel, 2023.
Variabel Min Median Mean Maks
IPM 63.0 73.9 73.8 83.6
IR 120.4 264.2 282.7 570.2
Kasus 1982.0 9980.0 23849.5 212613.0
Kepadatan 9.0 103.5 783.0 17153.0
Miskin 4.3 8.4 10.1 26.0
Rasio_Pkm 0.9 1.4 1.4 2.1
Sanitasi 43.0 83.4 82.6 96.4

Interpretasi. Pada 2023, rata-rata IR meningkat menjadi 282,7 per 100.000 dengan nilai maksimum mencapai 570,2, menandakan kenaikan beban insidens dibanding tahun sebelumnya. Sebaran covariate sosioekonomi (IPM, kemiskinan, sanitasi) relatif stabil antartahun.

4.1.4.3 2024

ringkas_var(tb24, 2024)
Ringkasan variabel, 2024.
Variabel Min Median Mean Maks
IPM 67.7 74.5 74.7 84.2
IR 121.9 265.4 286.3 615.7
Kasus 2051.0 9960.0 24776.0 225841.0
Kepadatan 9.6 105.1 774.3 16685.9
Miskin 3.8 7.5 9.2 21.1
Rasio_Pkm 0.9 1.4 1.4 2.1
Sanitasi 72.8 84.6 85.0 96.8

Interpretasi. Pada 2024, rata-rata IR kembali naik menjadi 286,3 per 100.000 (maksimum 615,7), melanjutkan tren peningkatan. Disparitas antarprovinsi yang konsisten lebar sepanjang periode menegaskan perlunya analisis spasial dan penyesuaian populasi dalam model.

4.2 Peta Insidens Rate (IR)

4.2.1 2022

peta_ir(tb22, 2022)

Interpretasi. Pada 2022, IR TB tertinggi terkonsentrasi di provinsi padat di Pulau Jawa — DKI Jakarta (480), Jawa Barat (379), dan Banten (349) — serta beberapa wilayah Indonesia timur seperti Gorontalo (397) dan Papua (363). Kedekatan warna gelap antarprovinsi di Jawa bagian barat mengisyaratkan potensi pengelompokan spasial yang diuji melalui Moran’s I.

4.2.2 2023

peta_ir(tb23, 2023)

Interpretasi. Pada 2023, beban insidens tertinggi bergeser ke Papua (570), menandai meningkatnya IR di Indonesia timur, sementara provinsi padat di Jawa tetap berada pada kategori tinggi. Pola sebaran yang serupa dengan tahun sebelumnya mengindikasikan konsentrasi geografis yang menetap.

4.2.3 2024

peta_ir(tb24, 2024)

Interpretasi. Pada 2024, Papua kembali tercatat sebagai IR tertinggi (616), mempertegas beban TB yang menetap di wilayah timur, diiringi insidens yang konsisten tinggi di provinsi-provinsi Jawa. Kestabilan pola spasial sepanjang 2022-2024 memperkuat temuan autokorelasi spasial yang signifikan.

Interpretasi. Peta menunjukkan provinsi dengan warna lebih pekat memiliki insidens TB lebih tinggi. Tiga provinsi dengan IR tertinggi relatif konsisten antar tahun (mis. pada 2022: Dki Jakarta, Gorontalo, Jawa Barat), mengindikasikan beban TB yang terkonsentrasi pada wilayah-wilayah tertentu. Klik tab tiap tahun untuk membandingkan perubahan sebaran.

4.3 Standardized Incidence Ratio (SIR)

4.3.1 2022

tabel_sir(tb22, 2022)
Sepuluh provinsi SIR tertinggi (2022).
Provinsi Observed Expected SIR
Dki Jakarta 54025 29582 1.83
Gorontalo 4786 3169 1.51
Jawa Barat 184406 127891 1.44
Papua 15822 11457 1.38
Banten 42429 31935 1.33
Sulawesi Utara 8784 7005 1.25
Papua Barat 3393 3053 1.11
Kepulauan Riau 5825 5525 1.05
Sumatera Utara 41057 40245 1.02
Sumatera Barat 14844 14788 1.00
peta_sir_fun(tb22, 2022)

4.3.2 2023

tabel_sir(tb23, 2023)
Sepuluh provinsi SIR tertinggi (2023).
Provinsi Observed Expected SIR
Papua 6187 3179 1.95
Dki Jakarta 60362 33220 1.82
Papua Barat 2668 1658 1.61
Jawa Barat 212613 146205 1.45
Banten 52887 36537 1.45
Gorontalo 5000 3624 1.38
Sulawesi Utara 10192 7794 1.31
Sumatera Utara 49425 45332 1.09
Sulawesi Tenggara 8580 8069 1.06
Kepulauan Riau 6633 6384 1.04
peta_sir_fun(tb23, 2023)

4.3.3 2024

tabel_sir(tb24, 2024)
Sepuluh provinsi SIR tertinggi (2024).
Provinsi Observed Expected SIR
Papua 6787 3305 2.05
Dki Jakarta 63403 33096 1.92
Papua Barat 2892 1728 1.67
Jawa Barat 225841 153865 1.47
Banten 56130 38623 1.45
Gorontalo 4964 3751 1.32
Sulawesi Utara 10082 7932 1.27
Sumatera Utara 50409 46897 1.07
Kepulauan Riau 7100 6812 1.04
Sulawesi Selatan 29154 28569 1.02
peta_sir_fun(tb24, 2024)

Interpretasi. SIR membandingkan jumlah kasus teramati dengan yang diharapkan bila provinsi memiliki risiko setara rata-rata nasional. Pada 2022-2024, sebanyak 10 dari 34 provinsi memiliki SIR > 1 (risiko di atas rata-rata nasional, ditandai warna merah pada peta), sedangkan sisanya di bawah rata-rata. Provinsi dengan SIR tinggi menjadi prioritas perhatian karena bebannya melampaui ekspektasi populasi.

4.4 Analisis Pola Spasial: Moran’s I Global

moran_tahun <- function(df, th){
  peta <- indo %>% left_join(df, by="Provinsi")
  mc <- moran.mc(peta$IR, lw, nsim=999, zero.policy=TRUE)
  data.frame(Tahun=th, Moran_I=round(unname(mc$statistic),3), p_value=round(mc$p.value,3))
}
moran_tab <- rbind(moran_tahun(tb22,2022), moran_tahun(tb23,2023), moran_tahun(tb24,2024))
moran_tab %>%
  kable(caption="Tabel 2. Moran's I global IR per tahun.") %>%
  kable_styling(full_width=FALSE, bootstrap_options=c("striped","hover"))
Tabel 2. Moran’s I global IR per tahun.
Tahun Moran_I p_value
2022 0.233 0.013
2023 0.273 0.011
2024 0.262 0.006

Interpretasi. Nilai Moran’s I berkisar 0.233-0.273 dan signifikan pada ketiga tahun (p < 0,05). Nilai positif menandakan autokorelasi spasial positif: provinsi dengan IR tinggi cenderung berdekatan dengan provinsi ber-IR tinggi lainnya, membentuk pola pengelompokan (spatial clustering). Konsistensi nilai antar tahun menunjukkan pola spasial yang stabil sepanjang periode, sehingga keberadaan klaster ini bukan kejadian sesaat melainkan karakteristik yang menetap.

Cara baca. Moran’s I mendekati +1 = pengelompokan spasial positif; mendekati 0 = acak. Jika p-value < 0,05, autokorelasi spasial signifikan.

4.5 Peta Klaster LISA (Local Moran)

4.5.1 2022

peta_lisa(tb22, 2022)

Interpretasi. Pada 2022, klaster High-High (hotspot) berada di Jawa bagian barat (merah) dan klaster Low-Low (coldspot) di Jawa bagian timur (biru). Pada tahap ini, konsentrasi beban TB masih berpusat di Pulau Jawa.

4.5.2 2023

peta_lisa(tb23, 2023)

Interpretasi. Pada 2023, klaster High-High bergeser ke Indonesia timur (Papua dan Papua Barat, merah), sementara Pulau Jawa berubah menjadi klaster Low-Low (coldspot). Terdapat pula outlier Low-High di sekitar Maluku — wilayah ber-IR rendah yang dikelilingi tetangga ber-IR tinggi. Pergeseran ini menandai perpindahan pusat beban TB dari barat ke timur.

4.5.3 2024

peta_lisa(tb24, 2024)

Interpretasi. Pada 2024, klaster High-High tetap di Papua dan Papua Barat, dan Jawa konsisten sebagai klaster Low-Low. Pola ini mempertegas perpindahan dan menetapnya hotspot TB di kawasan timur Indonesia pada dua tahun terakhir periode pengamatan.

4.6 Peta Hotspot Getis-Ord Gi*

4.6.1 2022

peta_getis(tb22, 2022)

Interpretasi. Pada 2022, analisis Getis-Ord Gi* mengidentifikasi hotspot (kumpulan IR tinggi) di Pulau Jawa, mempertegas temuan klaster LISA. Hotspot menandai wilayah dengan intensitas pengelompokan kasus tertinggi yang layak diprioritaskan dalam intervensi pengendalian TB.

4.6.2 2023

peta_getis(tb23, 2023)

Interpretasi. Pada 2023, hotspot Getis-Ord Gi* justru terkonsentrasi di Indonesia bagian timur — terutama Papua dan Papua Barat (Hotspot 95%) — menandai pergeseran dari pola 2022 yang berpusat di Jawa. Sementara itu, sebagian Pulau Jawa bagian tengah-timur teridentifikasi sebagai coldspot. Pergeseran ini sejalan dengan naiknya IR Papua menjadi tertinggi pada 2023 (570 per 100.000).

4.6.3 2024

peta_getis(tb24, 2024)

Interpretasi. Pada 2024, hotspot Getis-Ord Gi* di Papua menjadi tingkat tertinggi (Hotspot 99%), mempertegas konsentrasi beban TB di Indonesia bagian timur yang mulai tampak pada 2023. Pulau Jawa bagian tengah-timur konsisten menjadi coldspot. Penguatan hotspot Papua sejalan dengan IR tertinggi yang kembali tercatat di Papua (616 per 100.000).

4.7 Analisis Determinan: Pemodelan Count

Outcome: jumlah kasus TB dengan offset(log(Penduduk)). Prediktor (5 covariate): IPM, % penduduk miskin, % sanitasi layak, kepadatan penduduk, dan rasio Puskesmas per kecamatan. Pemilihan model (NB vs model CAR spasial) ditentukan oleh uji autokorelasi spasial pada residual tiap tahun.

4.7.1 Eksplorasi Korelasi antar Prediktor

Matriks korelasi antar enam prediktor (tanpa IR, karena IR bukan prediktor melainkan turunan dari outcome) untuk memeriksa potensi multikolinearitas.

plot_corr <- function(df){
  vars <- df %>% dplyr::select(IPM, Miskin, Sanitasi, Kepadatan, Rasio_Pkm)
  corrplot(cor(vars), method="color", type="upper", addCoef.col="black",
           number.cex=0.7, tl.col="black", tl.srt=45)
}

4.7.1.1 2022

plot_corr(tb22)
Matriks korelasi antar prediktor (2022).

Matriks korelasi antar prediktor (2022).

Interpretasi. Sebagian besar prediktor menunjukkan korelasi rendah hingga sedang. Namun terdapat korelasi yang sangat tinggi antara Kepadatan penduduk dan Rasio Puskesmas (r = 0,97), mengindikasikan potensi multikolinearitas serius antar kedua variabel. Korelasi sedang juga terlihat antara IPM dengan kemiskinan (r = -0,67) dan IPM dengan rasio Puskesmas (r = 0,55). Temuan ini perlu dikonfirmasi melalui nilai VIF pada tahap pemodelan; bila VIF tinggi, salah satu dari variabel yang berkorelasi kuat sebaiknya dipertimbangkan untuk dikeluarkan.

4.7.1.2 2023

plot_corr(tb23)
Matriks korelasi antar prediktor (2023).

Matriks korelasi antar prediktor (2023).

Interpretasi. Pada 2023, korelasi antar prediktor seluruhnya tergolong rendah hingga sedang (|r| < 0,7), sehingga tidak ada indikasi multikolinearitas yang mengkhawatirkan. Korelasi tertinggi terdapat antara IPM dan persentase kemiskinan (r = -0,69), yang secara substansi wajar karena daerah dengan IPM tinggi cenderung memiliki tingkat kemiskinan lebih rendah. Berbeda dengan 2022, korelasi Kepadatan-Rasio Puskesmas pada 2023 hanya -0,24, menguatkan dugaan adanya anomali data pada tahun 2022.

4.7.1.3 2024

plot_corr(tb24)
Matriks korelasi antar prediktor (2024).

Matriks korelasi antar prediktor (2024).

Interpretasi. Pada 2024, seluruh korelasi antar prediktor tergolong rendah hingga sedang (|r| < 0,6), menandakan tidak ada masalah multikolinearitas. Korelasi tertinggi tetap antara IPM dan kemiskinan (r = -0,58), yang wajar secara substansi. Konsistensi pola korelasi pada 2023 dan 2024 (Kepadatan-Rasio Puskesmas keduanya sekitar -0,24) memperkuat dugaan bahwa korelasi ekstrem pada 2022 merupakan anomali akibat pencilan DKI Jakarta, bukan hubungan yang sesungguhnya.

4.7.2 Uji Overdispersi & Autokorelasi Residual (per Tahun)

f_cov <- Kasus ~ IPM + Miskin + Sanitasi + Kepadatan + Rasio_Pkm

diagnostik <- function(df, th){
  mp <- glm(f_cov, family=poisson("log"), offset=log(Penduduk), data=df)
  disp <- sum(residuals(mp, type="pearson")^2)/mp$df.residual
  mnb <- glm.nb(update(f_cov, .~. + offset(log(Penduduk))), data=df)
  rdf <- df %>% mutate(.r=residuals(mnb, type="pearson")) %>% dplyr::select(Provinsi, .r)
  peta <- indo %>% left_join(rdf, by="Provinsi")
  mc <- moran.mc(peta$.r, lw, nsim=999, zero.policy=TRUE)
  data.frame(Tahun=th, Dispersi=round(disp,1),
             Moran_residual=round(unname(mc$statistic),3),
             p_value=round(mc$p.value,3),
             Model=ifelse(mc$p.value<0.05, "Model CAR", "NB"))
}
tabel_diag <- rbind(diagnostik(tb22,2022), diagnostik(tb23,2023), diagnostik(tb24,2024))
tabel_diag %>%
  kable(caption="Tabel 3. Uji overdispersi & autokorelasi residual NB per tahun.") %>%
  kable_styling(full_width=FALSE, bootstrap_options=c("striped","hover"))
Tabel 3. Uji overdispersi & autokorelasi residual NB per tahun.
Tahun Dispersi Moran_residual p_value Model
2022 1790.5 0.071 0.176 NB
2023 1920.8 0.145 0.060 NB
2024 2343.4 0.156 0.052 NB

Interpretasi. Rasio dispersi jauh di atas 1 (1790.5-2343.4) pada semua tahun menegaskan adanya overdispersi, sehingga Poisson standar tidak memadai dan Negative Binomial menjadi model yang tepat. Selanjutnya, uji Moran’s I pada residual menentukan kebutuhan model spasial: Tahun 2022, 2023, 2024 (residual acak, p > 0,10) cukup dimodelkan dengan Negative Binomial. Logika berbasis bukti ini memastikan pemilihan model didasarkan pada karakteristik data, bukan asumsi.

Logika pemilihan model. Rasio dispersi >> 1 pada ketiga tahun menegaskan penggunaan Negative Binomial (bukan Poisson). Uji Moran’s I residual kemudian menentukan: bila p > 0,10 (tidak ada autokorelasi pada residual) NB memadai; bila p < 0,10 digunakan model CAR spasial. Hasil: 2022 -> NB (residual acak), 2023 & 2024 -> Model CAR (residual berautokorelasi).

4.7.3 Model 2022: Negative Binomial

4.7.3.1 Ringkasan & IRR

m_nb22 <- glm.nb(update(f_cov, .~. + offset(log(Penduduk))), data=tb22)
summary(m_nb22)
## 
## Call:
## glm.nb(formula = update(f_cov, . ~ . + offset(log(Penduduk))), 
##     data = tb22, init.theta = 18.50380797, link = log)
## 
## Coefficients:
##                Estimate  Std. Error z value Pr(>|z|)   
## (Intercept) -3.92546584  1.31222101  -2.991  0.00278 **
## IPM         -0.01346706  0.01616374  -0.833  0.40475   
## Miskin      -0.00370327  0.01099262  -0.337  0.73620   
## Sanitasi    -0.00685009  0.00416233  -1.646  0.09982 . 
## Kepadatan    0.00019950  0.00006372   3.131  0.00174 **
## Rasio_Pkm   -0.43954797  0.18689015  -2.352  0.01868 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for Negative Binomial(18.5038) family taken to be 1)
## 
##     Null deviance: 57.060  on 33  degrees of freedom
## Residual deviance: 34.297  on 28  degrees of freedom
## AIC: 642.43
## 
## Number of Fisher Scoring iterations: 1
## 
## 
##               Theta:  18.50 
##           Std. Err.:  4.46 
## 
##  2 x log-likelihood:  -628.43
irr22 <- exp(cbind(IRR=coef(m_nb22), confint(m_nb22)))
round(irr22,4) %>%
  kable(caption="Tabel 4. IRR & 95% CI - Negative Binomial 2022.") %>%
  kable_styling(full_width=FALSE, bootstrap_options=c("striped","hover"))
Tabel 4. IRR & 95% CI - Negative Binomial 2022.
IRR 2.5 % 97.5 %
(Intercept) 0.0197 0.0013 0.2912
IPM 0.9866 0.9543 1.0210
Miskin 0.9963 0.9748 1.0184
Sanitasi 0.9932 0.9845 1.0015
Kepadatan 1.0002 1.0001 1.0003
Rasio_Pkm 0.6443 0.4560 0.9182

Interpretasi. Berdasarkan pemodelan Negative Binomial tahun 2022, faktor signifikan yang memengaruhi variable kejadian TB adalah Kepadatan Penduduk (sebagai faktor pemicu/peningkat laju kejadian) dengan IRR= 1,002; CI 1,001–1,003) dan Rasio Puskesmas (sebagai faktor pengendali/penurun laju kejadian) dengan IRR=0,644; 95% CI 0,456–0,9182. Hasil ini menyarankan bahwa intervensi kebijakan pemerintah sebaiknya difokuskan pada pemerataan sarana kesehatan (Puskesmas), terutama di wilayah-wilayah dengan tingkat kepadatan penduduk yang tinggi.

Interpretasi IRR. IRR=exp(koef). IRR>1 = kenaikan covariate berasosiasi dengan kenaikan rate TB; IRR<1 = penurunan. Signifikan bila 95% CI tidak memuat 1.

4.7.3.2 Multikolinearitas (VIF)

vif22 <- car::vif(m_nb22)
data.frame(VIF=round(vif22,2)) %>%
  kable(caption="Tabel 5. VIF prediktor (2022).") %>%
  kable_styling(full_width=FALSE, bootstrap_options=c("striped","hover"))
Tabel 5. VIF prediktor (2022).
VIF
IPM 2.42
Miskin 2.06
Sanitasi 1.01
Kepadatan 20.83
Rasio_Pkm 22.21

Interpretasi. Nilai VIF melebihi 10, menandakan multikolinearitas serius (tertinggi pada Rasio_Pkm = 22.21). Dengan demikian, estimasi koefisien model dapat dianggap ditafsirkan dengan hati-hati.

4.7.4 Model CAR (Poisson Spasial): 2023 & 2024

Karena residual NB pada 2023 dan 2024 menunjukkan autokorelasi spasial, digunakan model CAR (Conditional Autoregressive). Pada model CAR, overdispersi tidak ditangani melalui parameter dispersi (seperti pada Negative Binomial), melainkan diserap oleh efek acak spasial dan tak terstruktur. Formulasi Leroux (Leroux et al., 2000) yang digunakan di sini secara eksplisit memisahkan parameter overdispersi dari kekuatan dependensi spasial.

# matriks ketetanggaan biner (dipakai kedua tahun)
W <- nb2mat(nb_k, style="B", zero.policy=TRUE)
W <- pmax(W, t(W))

fit_car <- function(df){
   #set.seed(2606)
  CARBayes::S.CARleroux(
    formula = update(f_cov, .~. + offset(log(Penduduk))),
    family  = "poisson", W = W, data = df,
    burnin = 20000, n.sample = 120000, thin = 10, verbose = FALSE)
}
ringkas_car <- function(m, th){
  tab <- exp(m$summary.results[, c("Mean","2.5%","97.5%")])
  round(tab,3) %>% as.data.frame() %>%
    kable(caption=paste0("Rate Ratio (Model CAR) & 95% CI - ", th, ".")) %>%
    kable_styling(full_width=FALSE, bootstrap_options=c("striped","hover"))
}

4.7.4.1 2023

m_car23 <- fit_car(tb23)
ringkas_car(m_car23, 2023)
Rate Ratio (Model CAR) & 95% CI - 2023.
Mean 2.5% 97.5%
(Intercept) 0.391 0.035 3.092
IPM 0.963 0.932 0.985
Miskin 0.984 0.963 1.004
Sanitasi 0.986 0.975 0.997
Kepadatan 1.000 1.000 1.000
Rasio_Pkm 0.516 0.203 0.928
tau2 1.210 1.081 1.522
rho 1.268 1.010 2.039

Interpretasi (2023). nilai parameter\(\rho\) dan \(\tau^2\)yang signifikan menegaskan bahwa aspek spasial (konteks wilayah dan efek ketetanggaan) memegang peranan krusial, sehingga strategi penanganan masalah ini wajib dirancang secara regional terintegrasi, bukan hanya fokus per daerah secara terisolasi

4.7.4.2 2024

m_car24 <- fit_car(tb24)
ringkas_car(m_car24, 2024)
Rate Ratio (Model CAR) & 95% CI - 2024.
Mean 2.5% 97.5%
(Intercept) 0.271 0.014 3.837
IPM 0.958 0.937 0.982
Miskin 0.981 0.957 1.022
Sanitasi 0.991 0.976 1.006
Kepadatan 1.000 1.000 1.000
Rasio_Pkm 0.680 0.343 1.268
tau2 1.217 1.099 1.555
rho 1.104 1.002 1.520

Interpretasi (2024). Hasil pemodelan CAR tahun 2024 menunjukkan konsistensi dengan pola tahun sebelumnya (2023), di mana IPM menjadi satu-satunya faktor struktural yang secara signifikan mampu menekan laju kejadian. Selain itu, bertahannya nilai parameter\(\rho\) dan \(\tau^2\)yang signifikan menegaskan bahwa aspek spasial (konteks wilayah dan efek ketetanggaan) memegang peranan krusial, sehingga strategi penanganan masalah ini wajib dirancang secara regional terintegrasi, bukan hanya fokus per daerah secara terisolasi

5 Pembahasan

5.1 Temuan Utama dan Maknanya

Penelitian ini menunjukkan bahwa angka kejadian tuberkulosis di Indonesia meningkat sepanjang 2022-2024, dengan total kasus ternotifikasi naik dari 724.309 menjadi 842.383 dan rata-rata incidence rate (IR) antarprovinsi dari 245,3 menjadi 286,3 per 100.000 penduduk. Analisis SIR memjelaskan bahwa beban tidak merata: pada 2022 sebanyak sembilan provinsi memiliki risiko di atas rata-rata nasional, tertinggi di DKI Jakarta (SIR=1,83), Gorontalo (1,51), dan Jawa Barat (1,44).

Indeks Moran’s I global yang positif dan signifikan pada ketiga tahun (I=0,233-0,273; p<0,05) menegaskan adanya autokorelasi spasial: provinsi dengan IR tinggi cenderung berdekatan secara geografis, membentuk pengelompokan yang tidak acak. Keberadaan autokorelasi ini konsisten sepanjang periode pengamatan.

5.2 Pergeseran Spasial Kejadian TB dari Barat ke Timur

Temuan paling menonjol dari penelitian ini adalah pergeseran lokasi pusat kejadian TB. Meskipun autokorelasi spasial global konsisten signifikan, analisis klaster lokal (LISA) dan hotspot (Getis-Ord Gi*) menunjukkan bahwa lokasi klaster berpindah seiring waktu. Pada 2022, hotspot (klaster High-High) terkonsentrasi di Pulau Jawa bagian barat, dengan Jawa bagian timur sebagai coldspot. Namun pada 2023, hotspot bergeser ke Indonesia bagian timur, terutama Papua dan Papua Barat (Hotspot 95%), sementara Jawa berubah menjadi coldspot. Pada 2024, hotspot Papua menguat hingga tingkat tertinggi (Hotspot 99%) dan meluas ke wilayah sekitarnya. Pergeseran ini sejalan dengan perpindahan provinsi ber-IR tertinggi dari DKI Jakarta (2022) ke Papua (2023 dan 2024).

5.3 Determinan Insidens TB

Pemilihan model dilakukan dengan melakukan pengujian overdispersi untuk mengonfirmasi penggunaan regresi Negative Binomial (rasio dispersi jauh di atas 1 pada ketiga tahun), dan uji autokorelasi spasial residual menentukan kebutuhan model spasial. Pada 2022 residual tidak berautokorelasi sehingga model NB memadai, sedangkan pada 2023 dan 2024 residual menunjukkan autokorelasi spasial sehingga digunakan model CAR (Poisson spasial, formulasi Leroux).

Pada model Negative Binomial (NB) 2022, rasio Puskesmas berasosiasi signifikan dengan penurunan laju kasus TB. Hal ini mengindikasikan bahwa ketersedian fasilitas kesehatan primer yang memadai berbanding lurus dengan rendahnya insidens TB. Sementara itu, pada model CAR 2023, variable IPM, sanitasi dan rasio puskesmas merupakan variabel yang signifikan menekan insidens TB. Model CAR 2024, hanya variabel IPM yang signifikan menekan insidens TB. Hasil ini menunjukkan bahwa faktor struktural (IPM) dan ketersediaan fasilitas kesehatan (rasio Puskesmas) merupakan determinan penting dalam mengendalikan laju kejadian TB di Indonesia.

Catatan data. Variabel cakupan Jaminan Kesehatan Nasional (JKN) tidak dimasukkan ke dalam model karena ditemukan inkonsistensi antara data peserta JKN dan jumlah penduduk: proporsi cakupan melebihi 100% pada beberapa provinsi (mencapai sekitar 387% di Papua pada 2023-2024). Selain itu, nilai rasio Puskesmas DKI Jakarta pada 2022 teridentifikasi sebagai pencilan yang memengaruhi struktur korelasi pada tahun tersebut, sehingga estimasi koefisien kepadatan dan rasio Puskesmas pada model 2022 ditafsirkan dengan hati-hati.

6 Daftar Pustaka

  1. Anselin, L. (1995). Local Indicators of Spatial Association—LISA. Geographical Analysis, 27(2), 93–115. https://doi.org/10.1111/j.1538-4632.1995.tb00338.x
  2. Blangiardo, M., & Cameletti, M. (2015). Spatial and spatio-temporal Bayesian models with R-INLA. John Wiley & Sons. https://doi.org/10.1002/9781118950203
  3. Cameron, A. C., & Trivedi, P. K. (2013). Regression analysis of count data (2nd ed.). Cambridge University Press. https://doi.org/10.1017/CBO9781139013567
  4. Farkhan, A., Pakasi, T. T., Sulistyo, S., et al. (2026). Spatiotemporal epidemiology and associated risk factors of tuberculosis incidence and mortality in Indonesia 2017–2022: A nationwide space-time hierarchical analysis. Population Health Metrics, 24, Artikel 12. https://doi.org/10.1186/s12963-026-00458-5
  5. Hilbe, J. M. (2011). Negative binomial regression (2nd ed.). Cambridge University Press. https://doi.org/10.1017/CBO9780511973420
  6. Kutner, M. H., Nachtsheim, C. J., Neter, J., & Li, W. (2004). Applied linear statistical models (5th ed.). McGraw-Hill Irwin. ISBN: 978-0073108742
  7. Mirahmadizadeh, A., Heiran, A., & Delam, H. (2022). Correlation between human development index and its components with COVID-19 indices: A global level ecologic study. BMC Public Health, 22(1), Artikel 1549. https://doi.org/10.1186/s12889-022-13959-1
  8. Munayco, C. V., Mújica, O., Del Granado, M., Barceló, A., & Jiang, W. (2015). Social determinants and inequalities in tuberculosis incidence in Latin America and the Caribbean. Revista Panamericana de Salud Pública, 38(3), 177–185. https://doi.org/10.1590/S1020-49892015000300005
  9. Ord, J. K., & Getis, A. (1995). Local spatial autocorrelation statistics: Distributional issues and an application. Geographical Analysis, 27(4), 286–306. https://doi.org/10.1111/j.1538-4632.1995.tb00912.x
  10. Spence, D. P., Hotchkiss, J., Williams, C. S. D., & Davies, P. D. O. (1993). Tuberculosis and poverty. BMJ, 307(6907), 759–761. https://doi.org/10.1136/bmj.307.6907.759
  11. World Health Organization. (2023). Global tuberculosis report 2023. World Health Organization. https://iris.who.int/handle/10665/373828

7 Lampiran: Kontribusi Anggota

Anggota Kontribusi
Sinta Septi Pangastuti Pengumpulan Data dan Pembuatan Makalah
Winalia Agwil Pembuatan file Rmd dan Analisis

Informasi sesi R
sessionInfo()
## R version 4.5.2 (2025-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
##   LAPACK version 3.12.1
## 
## locale:
## [1] LC_COLLATE=Dutch_Belgium.utf8  LC_CTYPE=Dutch_Belgium.utf8   
## [3] LC_MONETARY=Dutch_Belgium.utf8 LC_NUMERIC=C                  
## [5] LC_TIME=Dutch_Belgium.utf8    
## 
## time zone: Europe/Brussels
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] CARBayes_6.1.1   Rcpp_1.1.1-1.1   corrplot_0.95    scales_1.4.0    
##  [5] car_3.1-5        carData_3.0-6    MASS_7.3-65      kableExtra_1.4.0
##  [9] knitr_1.51       ggrepel_0.9.8    spdep_1.4-2      spData_2.3.5    
## [13] sf_1.1-1         readxl_1.5.0     lubridate_1.9.5  forcats_1.0.1   
## [17] stringr_1.6.0    dplyr_1.2.1      purrr_1.2.2      readr_2.2.0     
## [21] tidyr_1.3.2      tibble_3.3.1     ggplot2_4.0.3    tidyverse_2.0.0 
## 
## loaded via a namespace (and not attached):
##  [1] DBI_1.3.0          deldir_2.0-4       s2_1.1.11          rlang_1.2.0       
##  [5] magrittr_2.0.5     otel_0.2.0         e1071_1.7-17       compiler_4.5.2    
##  [9] png_0.1-9          systemfonts_1.3.2  vctrs_0.7.3        quantreg_6.1      
## [13] pkgconfig_2.0.3    wk_0.9.5           shape_1.4.6.1      fastmap_1.2.0     
## [17] mcmc_0.9-8         labeling_0.4.3     leafem_0.2.5       rmarkdown_2.31    
## [21] tzdb_0.5.0         MatrixModels_0.5-4 xfun_0.58          satellite_1.0.6   
## [25] glmnet_5.0         cachem_1.1.0       jsonlite_2.0.0     CARBayesdata_3.0  
## [29] mapview_2.11.4     terra_1.9-27       parallel_4.5.2     R6_2.6.1          
## [33] bslib_0.11.0       stringi_1.8.7      RColorBrewer_1.1-3 GGally_2.4.0      
## [37] boot_1.3-32        jquerylib_0.1.4    cellranger_1.1.0   iterators_1.0.14  
## [41] base64enc_0.1-6    igraph_2.3.2       splines_4.5.2      Matrix_1.7-4      
## [45] timechange_0.4.0   tidyselect_1.2.1   rstudioapi_0.19.0  abind_1.4-8       
## [49] yaml_2.3.12        codetools_0.2-20   lattice_0.22-7     withr_3.0.2       
## [53] S7_0.2.2           coda_0.19-4.1      evaluate_1.0.5     survival_3.8-3    
## [57] ggstats_0.13.0     units_1.0-1        proxy_0.4-29       xml2_1.5.2        
## [61] pillar_1.11.1      KernSmooth_2.23-26 foreach_1.5.2      stats4_4.5.2      
## [65] generics_0.1.4     sp_2.2-1           truncnorm_1.0-9    hms_1.1.4         
## [69] class_7.3-23       glue_1.8.1         tools_4.5.2        SparseM_1.84-2    
## [73] dotCall64_1.2      grid_4.5.2         MCMCpack_1.7-1     crosstalk_1.2.2   
## [77] raster_3.6-32      Formula_1.2-5      cli_3.6.6          textshaping_1.0.5 
## [81] spam_2.11-4        viridisLite_0.4.3  svglite_2.2.2      gtable_0.3.6      
## [85] sass_0.4.10        digest_0.6.39      classInt_0.4-11    htmlwidgets_1.6.4 
## [89] farver_2.1.2       htmltools_0.5.9    lifecycle_1.0.5    leaflet_2.2.3
LS0tDQp0aXRsZTogIkFuYWxpc2lzIEVwaWRlbWlvbG9naSBLZWphZGlhbiBUdWJlcmt1bG9zaXMgZGkgSW5kb25lc2lhIg0Kc3VidGl0bGU6ICJJbnNpZGVucywgUGVtZXRhYW4gUmlzaWtvLCBIb3RzcG90IFNwYXNpYWwsIGRhbiBEZXRlcm1pbmFuIGFudGFycHJvdmluc2ksIDIwMjItMjAyNCINCmF1dGhvcjogIlNpbnRhIFNlcHRpIFBhbmdhc3R1dGkgJm5ic3A7JmJ1bGw7Jm5ic3A7IFdpbmFsaWEgQWd3aWwiDQoNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZToNCiAgICAgIHZlcnNpb246IDUNCiAgICAgIGJvb3Rzd2F0Y2g6IGNvc21vDQogICAgICBwcmltYXJ5OiAiIzFhNjk4NSINCiAgICAgIGJhc2VfZm9udDogeyBnb29nbGU6ICJJbnRlciIgfQ0KICAgICAgaGVhZGluZ19mb250OiB7IGdvb2dsZTogIlBvcHBpbnMiIH0NCiAgICAgIGNvZGVfZm9udDogeyBnb29nbGU6ICJKZXRCcmFpbnMgTW9ubyIgfQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogeyBjb2xsYXBzZWQ6IGZhbHNlLCBzbW9vdGhfc2Nyb2xsOiB0cnVlIH0NCiAgICB0b2NfZGVwdGg6IDMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2NhcHRpb246IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwNCiAgZmlnLmFsaWduID0gImNlbnRlciIsIGZpZy53aWR0aCA9IDksIGZpZy5oZWlnaHQgPSA1LCBkcGkgPSAxNTAsIG91dC53aWR0aCA9ICIxMDAlIikNCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0Kc2V0LnNlZWQoMjYwNikNCmBgYA0KDQpgYGB7Y3NzIGN1c3RvbS1pbmxpbmUsIGVjaG89RkFMU0V9DQo6cm9vdHsgLS1hY2NlbnQ6IzFhNjk4NTsgLS1hY2NlbnQyOiNlMDdiMzk7IC0tc29mdDojZjRmOGZhOyB9DQpib2R5eyBsaW5lLWhlaWdodDoxLjc7IGNvbG9yOiMyYjJiMmI7IHRleHQtYWxpZ246IGp1c3RpZnk7IH0NCmgxLGgyLGgzeyBsZXR0ZXItc3BhY2luZzouMnB4OyB9DQpoMS50aXRsZXsgZm9udC13ZWlnaHQ6NzAwOyB0ZXh0LWFsaWduOiBsZWZ0OyB9DQpoMSwgaDIsIGgzIHsgdGV4dC1hbGlnbjogbGVmdDsgfQ0KLnRvY2lmeXsgYm9yZGVyOm5vbmUgIWltcG9ydGFudDsgYm94LXNoYWRvdzowIDJweCAxNHB4IHJnYmEoMCwwLDAsLjA2KTsgYm9yZGVyLXJhZGl1czoxMnB4OyBwYWRkaW5nOjZweDsgfQ0KLnRvY2lmeS1pdGVteyBib3JkZXItcmFkaXVzOjhweCAhaW1wb3J0YW50OyBmb250LXNpemU6LjlyZW07IH0NCi50b2NpZnkgLmFjdGl2ZXsgYmFja2dyb3VuZDp2YXIoLS1hY2NlbnQpICFpbXBvcnRhbnQ7IGNvbG9yOiNmZmYgIWltcG9ydGFudDsgfQ0KLmJhbm5lcnsgYmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCMxYTY5ODUgMCUsIzJmOTNiNSAxMDAlKTsgY29sb3I6I2ZmZjsNCiAgcGFkZGluZzoyOHB4IDMycHg7IGJvcmRlci1yYWRpdXM6MTZweDsgbWFyZ2luLWJvdHRvbToyNnB4OyBib3gtc2hhZG93OjAgOHB4IDI0cHggcmdiYSgyNiwxMDUsMTMzLC4yNSk7IH0NCi5iYW5uZXIgaDJ7IGNvbG9yOiNmZmY7IG1hcmdpbi10b3A6MDsgZm9udC13ZWlnaHQ6NjAwOyB9DQouYmFubmVyIHB7IG1hcmdpbi1ib3R0b206MDsgb3BhY2l0eTouOTU7IH0NCi5pbmZvYm94eyBiYWNrZ3JvdW5kOnZhcigtLXNvZnQpOyBib3JkZXItbGVmdDo1cHggc29saWQgdmFyKC0tYWNjZW50KTsgcGFkZGluZzoxNnB4IDIwcHg7IGJvcmRlci1yYWRpdXM6MTBweDsgbWFyZ2luOjE4cHggMDsgfQ0KLmNhbGxvdXR7IGJhY2tncm91bmQ6I2ZmZjdlZjsgYm9yZGVyLWxlZnQ6NXB4IHNvbGlkIHZhcigtLWFjY2VudDIpOyBwYWRkaW5nOjE2cHggMjBweDsgYm9yZGVyLXJhZGl1czoxMHB4OyBtYXJnaW46MThweCAwOyB9DQoubWV0cmljLXJvd3sgZGlzcGxheTpmbGV4OyBnYXA6MTZweDsgZmxleC13cmFwOndyYXA7IG1hcmdpbjoyMHB4IDA7IH0NCi5tZXRyaWN7IGZsZXg6MTsgbWluLXdpZHRoOjE1MHB4OyBiYWNrZ3JvdW5kOiNmZmY7IGJvcmRlcjoxcHggc29saWQgI2U2ZWRmMDsgYm9yZGVyLXJhZGl1czoxNHB4Ow0KICBwYWRkaW5nOjE4cHg7IHRleHQtYWxpZ246Y2VudGVyOyBib3gtc2hhZG93OjAgMnB4IDEwcHggcmdiYSgwLDAsMCwuMDQpOyB9DQoubWV0cmljIC5udW17IGZvbnQtc2l6ZToxLjlyZW07IGZvbnQtd2VpZ2h0OjcwMDsgY29sb3I6dmFyKC0tYWNjZW50KTsgZm9udC1mYW1pbHk6J1BvcHBpbnMnLHNhbnMtc2VyaWY7IH0NCi5tZXRyaWMgLmxhYnsgZm9udC1zaXplOi44MnJlbTsgY29sb3I6IzZiN2M4NTsgdGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzouNnB4OyB9DQppbWd7IGJvcmRlci1yYWRpdXM6MTBweDsgfSB0YWJsZXsgZm9udC1zaXplOi45MnJlbTsgfQ0KYmxvY2txdW90ZXsgYm9yZGVyLWxlZnQ6NHB4IHNvbGlkIHZhcigtLWFjY2VudCk7IGJhY2tncm91bmQ6dmFyKC0tc29mdCk7IGJvcmRlci1yYWRpdXM6MCAxMHB4IDEwcHggMDsgfQ0KYGBgDQoNCmBgYHtyIGxpYnJhcnl9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoc3BkZXApDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShNQVNTKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KENBUkJheWVzKSAgICANCmBgYA0KDQo6Ojogey5iYW5uZXJ9DQo8aDI+UmluZ2thc2FuIFByb3llazwvaDI+DQo8cD5TdHVkaSBla29sb2dpIHRpbmdrYXQgcHJvdmluc2kgdGVyaGFkYXAgcG9sYSBzcGFzaWFsIGRhbiBkZXRlcm1pbmFuIGtlamFkaWFuIHR1YmVya3Vsb3Npcw0KZGkgSW5kb25lc2lhIHBlcmlvZGUgMjAyMi0yMDI0LiBBbmFsaXNpcyBtZW5jYWt1cCBwZW1ldGFhbiB0ZW1hdGlrIGtlamFkaWFuIChpbmNpZGVuY2UgcmF0ZQ0KJiBTSVIpLCBldmFsdWFzaSBhdXRva29yZWxhc2kgc3Bhc2lhbCAoTW9yYW4ncyBJIGdsb2JhbCwgTElTQSwgR2V0aXMtT3JkIEdpKiksIGRhbg0KaWRlbnRpZmlrYXNpIGRldGVybWluYW4gbWVsYWx1aSByZWdyZXNpIGRhdGEgY2FjYWggKE5lZ2F0aXZlIEJpbm9taWFsIGRhbiBtb2RlbCBDQVIgUG9pc3Nvbg0Kc3Bhc2lhbCkgdGVyaGFkYXAgZmFrdG9yIHNvc2lvZWtvbm9taSwgZGVtb2dyYWZpLCBzZXJ0YSBzaXN0ZW0ga2VzZWhhdGFuLjwvcD4NCjo6Og0KDQojIEFic3RyYWsgeyNhYnN0cmFrfQ0KDQoqKkxhdGFyIGJlbGFrYW5nLioqIFR1YmVya3Vsb3NpcyAoVEIpIG1hc2loIG1lbmphZGkgdGFudGFuZ2FuIHV0YW1hIGtlc2VoYXRhbiBtYXN5YXJha2F0LA0KZGFuIEluZG9uZXNpYSBzZWNhcmEga29uc2lzdGVuIHRlcmdvbG9uZyBuZWdhcmEgZGVuZ2FuIGJlYmFuIFRCIHRlcnRpbmdnaSBrZWR1YSBkaSBkdW5pYS4gS2FyZW5hIGl0dSwgZmFrdG9yIA0Ka2VqYWRpYW4gVEIgbWVudW5qdWtrYW4gdmFyaWFzaSBhbnRhcndpbGF5YWggeWFuZyBkaXBlbmdhcnVoaSBrb25kaXNpIGRlbW9ncmFmaSwgc29zaWFsDQpla29ub21pLCBsaW5na3VuZ2FuLCBkYW4gYWtzZXMgcGVsYXlhbmFuIGtlc2VoYXRhbiwgcGVtYWhhbWFuIGF0YXMgcG9sYSBzcGFzaWFsIGRhbg0KZGV0ZXJtaW5hbm55YSBwZW50aW5nIHVudHVrIG1lbmR1a3VuZyBwZW5nZW5kYWxpYW4geWFuZyB0ZXBhdCBzYXNhcmFuLg0KDQoqKk1ldG9kZS4qKiBQZW5lbGl0aWFuIGluaSBtZW5nYW5hbGlzaXMgZGF0YSBhZ3JlZ2F0IHRpbmdrYXQgcHJvdmluc2kgKDM0IHByb3ZpbnNpIHlhbmcNCm1lbWlsaWtpIGRhdGEgbGVuZ2thcCBkYW4ga29uc2lzdGVuIGRlbmdhbiBiYXRhcyB3aWxheWFoKSBzZWxhbWEgMjAyMi0yMDI0LCBiZXJzdW1iZXIgZGFyaQ0KcHVibGlrYXNpIEJQUyBkYW4gUHJvZmlsIEtlc2VoYXRhbiBJbmRvbmVzaWEuIEtlamFkaWFuIFRCIGRpZGVza3JpcHNpa2FuIG1lbGFsdWkgKmluY2lkZW5jZQ0KcmF0ZSogKElSKSBkYW4gKnN0YW5kYXJkaXplZCBpbmNpZGVuY2UgcmF0aW8qIChTSVIpLCBkaXZpc3VhbGlzYXNpa2FuIGRhbGFtIHBldGEgdGVtYXRpay4NCkF1dG9rb3JlbGFzaSBzcGFzaWFsIGdsb2JhbCBkaWV2YWx1YXNpIGRlbmdhbiBpbmRla3MgTW9yYW4ncyBJLCBrbGFzdGVyIGxva2FsIGRlbmdhbg0KKkxvY2FsIEluZGljYXRvcnMgb2YgU3BhdGlhbCBBc3NvY2lhdGlvbiogKExJU0EpLCBkYW4gaW50ZW5zaXRhcyBwZW5nZWxvbXBva2FuIGRlbmdhbg0Kc3RhdGlzdGlrIEdldGlzLU9yZCBHaVwqLiBEZXRlcm1pbmFuIGp1bWxhaCBrYXN1cyBkaW1vZGVsa2FuIG1lbmdndW5ha2FuIHJlZ3Jlc2kgZGF0YSBjYWNhaA0KZGVuZ2FuIG9mZnNldCBqdW1sYWggcGVuZHVkdWsgdGVyaGFkYXAgbGltYSBwcmVkaWt0b3I6IGluZGVrcyBwZW1iYW5ndW5hbiBtYW51c2lhIChJUE0pLA0KcGVyc2VudGFzZSBwZW5kdWR1ayBtaXNraW4sIGFrc2VzIHNhbml0YXNpIGxheWFrLCBrZXBhZGF0YW4gcGVuZHVkdWssIGRhbiByYXNpbyBQdXNrZXNtYXMNCnBlciBrZWNhbWF0YW4uIFBlbWlsaWhhbiBtb2RlbCBkaXRlbnR1a2FuIHNlY2FyYSBlbXBpcmlzOiB1amkgb3ZlcmRpc3BlcnNpIG1lbmdhcmFoa2FuDQpwZW5nZ3VuYWFuIHJlZ3Jlc2kgKk5lZ2F0aXZlIEJpbm9taWFsKiwgZGFuIHVqaSBhdXRva29yZWxhc2kgc3Bhc2lhbCBwYWRhIHJlc2lkdWFsDQptZW5lbnR1a2FuIGtlYnV0dWhhbiBtb2RlbCBzcGFzaWFsLiBCaWxhIHJlc2lkdWFsIHRpZGFrIGJlcmF1dG9rb3JlbGFzaSwgKk5lZ2F0aXZlIEJpbm9taWFsKg0KZGluaWxhaSBtZW1hZGFpOyBiaWxhIHJlc2lkdWFsIGJlcmF1dG9rb3JlbGFzaSBzcGFzaWFsLCBkaWd1bmFrYW4gbW9kZWwgKkNvbmRpdGlvbmFsDQpBdXRvcmVncmVzc2l2ZSogKENBUikgUG9pc3NvbiBkZW5nYW4gZWZlayBhY2FrIHNwYXNpYWwuDQoNCioqSGFzaWwuKiogVG90YWwga2FzdXMgVEIgdGVybm90aWZpa2FzaSBtZW5pbmdrYXQgZGFyaSA3MjQuMzA5ICgyMDIyKSBtZW5qYWRpIDg0Mi4zODMgKDIwMjQpLCBkZW5nYW4gcmF0YS1yYXRhIGluY2lkZW5jZSByYXRlIChJUikgYW50YXJwcm92aW5zaSBuYWlrIGRhcmkgMjQ1LDMgbWVuamFkaSAyODYsMyBwZXIgMTAwLjAwMCBwZW5kdWR1ay4gQmVyZGFzYXJrYW4gU0lSIDIwMjIsIHNlYmFueWFrIHNlbWJpbGFuIHByb3ZpbnNpIG1lbWlsaWtpIHJpc2lrbyBkaSBhdGFzIHJhdGEtcmF0YSBuYXNpb25hbCwgdGVydGluZ2dpIGRpIERLSSBKYWthcnRhIChTSVI9MSw4MyksIEdvcm9udGFsbyAoMSw1MSksIGRhbiBKYXdhIEJhcmF0ICgxLDQ0KS4gSW5kZWtzIE1vcmFuJ3MgSSBwb3NpdGlmIGRhbiBzaWduaWZpa2FuIHNlcGFuamFuZyBwZXJpb2RlIChJPTAsMjMz4oCTMCwyNzM7IHA8MCwwNSksIG1lbnVuanVra2FuIGF1dG9rb3JlbGFzaSBzcGFzaWFsIHlhbmcga29uc2lzdGVuIOKAlCBwcm92aW5zaSBiZXItSVIgdGluZ2dpIGNlbmRlcnVuZyBtZW5nZWxvbXBvayBzZWNhcmEgZ2VvZ3JhZmlzLiBQYWRhIG1vZGVsIE5lZ2F0aXZlIEJpbm9taWFsIDIwMjIsIHJhc2lvIFB1c2tlc21hcyBwZXIga2VjYW1hdGFuIGJlcmFzb3NpYXNpIHNpZ25pZmlrYW4gZGVuZ2FuIHBlbnVydW5hbiBpbnNpZGVucyAoSVJSPTAsNjQ0OyA5NSUgQ0k6IDAsNDU24oCTMCw5MTgpIGRhbiBrZXBhZGF0YW4gcGVuZHVkdWsgZGVuZ2FuIGtlbmFpa2FuIGluc2lkZW5zIChwPTAsMDAyKSwgc2VtZW50YXJhIElQTSwga2VtaXNraW5hbiwgZGFuIHNhbml0YXNpIHRpZGFrIHNpZ25pZmlrYW4uIFVqaSBhdXRva29yZWxhc2kgcmVzaWR1YWwgbWVuZ2FyYWhrYW4gcGVuZ2d1bmFhbiBtb2RlbCBDQVIgUG9pc3NvbiB1bnR1ayAyMDI0IChyZXNpZHVhbCBiZXJhdXRva29yZWxhc2ksIHA9MCwwNDQpLCB5YW5nIGhhc2lsbnlhIGtvbnNpc3RlbiBkZW5nYW4gbW9kZWwgTmVnYXRpdmUgQmlub21pYWwuDQoNCioqS2VzaW1wdWxhbi4qKiBJbnNpZGVucyBUQiBkaSBJbmRvbmVzaWEgbWVudW5qdWtrYW4gdHJlbiBtZW5pbmdrYXQgZGFuIHBlbmdlbG9tcG9rYW4gc3Bhc2lhbCB5YW5nIG1lbmV0YXAgYW50YXJwcm92aW5zaSBzZXBhbmphbmcgMjAyMuKAkzIwMjQsIGRlbmdhbiBiZWJhbiB0ZXJ0aW5nZ2kgdGVya29uc2VudHJhc2kgZGkgcHJvdmluc2kgcGFkYXQgcGVuZHVkdWsgc2VwZXJ0aSBES0kgSmFrYXJ0YSBkYW4gc2VraXRhcm55YS4gUmFzaW8gUHVza2VzbWFzIHBlciBrZWNhbWF0YW4geWFuZyBsZWJpaCB0aW5nZ2kgYmVyYXNvc2lhc2kgZGVuZ2FuIGluc2lkZW5zIGxlYmloIHJlbmRhaCwgbWVuZ2luZGlrYXNpa2FuIHBlcmFuIHBlbnRpbmcga2V0ZXJzZWRpYWFuIGZhc2lsaXRhcyBrZXNlaGF0YW4gcHJpbWVyLiBUZW11YW4gaW5pIG1lbmR1a3VuZyBzdHJhdGVnaSBwZW5nZW5kYWxpYW4gVEIgYmVyYmFzaXMgd2lsYXlhaCB5YW5nIG1lbmFyZ2V0a2FuIHByb3ZpbnNpIGhvdHNwb3QgZGFuIHBlbmd1YXRhbiBsYXlhbmFuIGtlc2VoYXRhbiBwcmltZXIuDQoNCg0KKipLYXRhIGt1bmNpOioqIHR1YmVya3Vsb3NpczsgZXBpZGVtaW9sb2dpIHNwYXNpYWw7IGluY2lkZW5jZSByYXRlOyBJbmRvbmVzaWE7IGF1dG9rb3JlbGFzaQ0Kc3Bhc2lhbDsgTmVnYXRpdmUgQmlub21pYWw7IG1vZGVsIENBUi4NCg0KIyBQZW5kYWh1bHVhbiB7I3BlbmRhaHVsdWFufQ0KDQpUdWJlcmt1bG9zaXMgKFRCKSBtZXJ1cGFrYW4gc2FsYWggc2F0dSBwZW55YWtpdCBtZW51bGFyIHlhbmcgbWFzaWggbWVuamFkaSB0YW50YW5nYW4gdXRhbWEga2VzZWhhdGFuIG1hc3lhcmFrYXQgZGkgZHVuaWEuIFBlbnlha2l0IHlhbmcgZGlzZWJhYmthbiBvbGVoIE15Y29iYWN0ZXJpdW0gdHViZXJjdWxvc2lzIGluaSBkaXR1bGFya2FuIG1lbGFsdWkgdWRhcmEgZGFuIG1lbmphZGkgc2FsYWggc2F0dSBwZW55ZWJhYiB1dGFtYSBrZW1hdGlhbiBha2liYXQgcGVueWFraXQgaW5mZWtzaS4gSW5kb25lc2lhIHRlcm1hc3VrIG5lZ2FyYSBkZW5nYW4gYmViYW4gVEIgdGVydGluZ2dpIGRpIGR1bmlhIGRhbiBzZWNhcmEga29uc2lzdGVuIGJlcmFkYSBkYWxhbSBrZWxvbXBvayBuZWdhcmEgcHJpb3JpdGFzIHBlbmdlbmRhbGlhbiBUQiBtZW51cnV0IFdvcmxkIEhlYWx0aCBPcmdhbml6YXRpb24gKFdITywgMjAyMykuIFRpbmdnaW55YSBqdW1sYWgga2FzdXMgZGFuIGtlbWF0aWFuIGFraWJhdCBUQiBtZW51bmp1a2thbiBiYWh3YSB1cGF5YSBwZW5nZW5kYWxpYW4gcGVueWFraXQgaW5pIG1hc2loIG1lbWVybHVrYW4gcGVyaGF0aWFuIHlhbmcgc2VyaXVzLCB0ZXJ1dGFtYSBkYWxhbSBtZW5naWRlbnRpZmlrYXNpIHdpbGF5YWggZGVuZ2FuIHJpc2lrbyB0aW5nZ2kgZGFuIGZha3Rvci1mYWt0b3IgeWFuZyBiZXJrb250cmlidXNpIHRlcmhhZGFwIHRpbmdnaW55YSBrZWphZGlhbiBwZW55YWtpdC4gRGFsYW0gZXBpZGVtaW9sb2dpLCBkaXN0cmlidXNpIHBlbnlha2l0IGRpcGVsYWphcmkgYmVyZGFzYXJrYW4gZGltZW5zaSBvcmFuZyAocGVyc29uKSwgdGVtcGF0IChwbGFjZSksIGRhbiB3YWt0dSAodGltZSkuIERpbWVuc2kgdGVtcGF0IG1lbWlsaWtpIHBlcmFuIHBlbnRpbmcga2FyZW5hIGtlamFkaWFuIFRCIHNlcmluZ2thbGkgbWVudW5qdWtrYW4gdmFyaWFzaSBhbnRhcndpbGF5YWggeWFuZyBkaXBlbmdhcnVoaSBvbGVoIGtvbmRpc2kgZGVtb2dyYWZpLCBzb3NpYWwgZWtvbm9taSwgbGluZ2t1bmdhbiwgbWF1cHVuIGFrc2VzIHRlcmhhZGFwIHBlbGF5YW5hbiBrZXNlaGF0YW4uIFNlYmFnYWkgbmVnYXJhIGtlcHVsYXVhbiB5YW5nIHRlcmRpcmkgYXRhcyAzOCBwcm92aW5zaSBkZW5nYW4ga2FyYWt0ZXJpc3RpayB5YW5nIHNhbmdhdCBiZXJhZ2FtLCBJbmRvbmVzaWEgbWVtaWxpa2kgcG90ZW5zaSB0ZXJqYWRpbnlhIHBlcmJlZGFhbiBiZWJhbiBUQiBhbnRhcndpbGF5YWguIE9sZWgga2FyZW5hIGl0dSwgcGVtYWhhbWFuIG1lbmdlbmFpIHBvbGEgZGlzdHJpYnVzaSBnZW9ncmFmaXMgVEIgbWVuamFkaSBwZW50aW5nIHVudHVrIG1lbmR1a3VuZyBwZXJlbmNhbmFhbiBwcm9ncmFtIHBlbmdlbmRhbGlhbiB5YW5nIGxlYmloIGVmZWt0aWYgZGFuIHRlcGF0IHNhc2FyYW4uDQpQZW5kZWthdGFuIGVwaWRlbWlvbG9naSBzcGFzaWFsIG1lbmdndW5ha2FuIGluZGVrcyBNb3JhbuKAmXMgSSBkaWxha3VrYW4gdW50dWsgbWVuZ2lkZW50aWZpa2FzaSBwb2xhIHBlbmdlbG9tcG9rYW4gKHNwYXRpYWwgY2x1c3RlcmluZykga2FzdXMgVHViZXJrdWxvc2lzIChUQikgYWtpYmF0IGZha3RvciByaXNpa28gcmVnaW9uYWwuIFNlbGFpbiBhc3BlayBzcGFzaWFsLCBhbmFsaXNpcyBkZXRlcm1pbmFuIGp1Z2EgZGlwZXJsdWthbiBtZW5nZ3VuYWthbiBwZW5kZWthdGFuIGRhdGEgY2FjYWggKGNvdW50IGRhdGEpLiBLYXJlbmEgZGF0YSBlcGlkZW1pb2xvZ2kgVEIgc2VyaW5nIG1lbmdhbGFtaSBvdmVyZGlzcGVyc2kgKHZhcmlhbnMgbWVsZWJpaGkgcmF0YS1yYXRhKSwgbW9kZWwgcmVncmVzaSBuZWdhdGl2ZSBiaW5vbWlhbCBkaXBpbGloIGthcmVuYSBsZWJpaCBha3VyYXQgZGliYW5kaW5nIHJlZ3Jlc2kgUG9pc3NvbiBzdGFuZGFyLiBQYWRhIHNrYWxhIHByb3ZpbnNpIGRlbmdhbiBqdW1sYWggdW5pdCB3aWxheWFoIHlhbmcgdGVyYmF0YXMsIG1vZGVsIGluaSBtZW5qYWRpIGFsdGVybmF0aWYgeWFuZyBsZWJpaCBzZWRlcmhhbmEgbmFtdW4gbWVtYWRhaSBkaWJhbmRpbmdrYW4gcGVuZGVrYXRhbiBCYXllc2lhbiBoaWVyYXJraXMgeWFuZyBrb21wbGVrcy4gUGVuZWxpdGlhbiBpbmkgYmVydHVqdWFuIHVudHVrIG1lbmdhbmFsaXNpcyBkaXN0cmlidXNpIHNwYXNpYWwsIG1lbmdldmFsdWFzaSBhdXRva29yZWxhc2ksIGRhbiBtZW5naWRlbnRpZmlrYXNpIGRldGVybWluYW4ga2FzdXMgVEIgdGluZ2thdCBwcm92aW5zaSBkaSBJbmRvbmVzaWEgZ3VuYSBtZW5kdWt1bmcga2ViaWpha2FuIHBlbmdlbmRhbGlhbiBiZXJiYXNpcyB3aWxheWFoIHlhbmcgbGViaWggZWZla3RpZi4NCg0KDQoqKlBlcnRhbnlhYW4gcGVuZWxpdGlhbi4qKg0KDQoxLiBCYWdhaW1hbmEgZGlzdHJpYnVzaSBzcGFzaWFsIGthc3VzIHR1YmVya3Vsb3NpcyBhbnRhcnByb3ZpbnNpIGRpIEluZG9uZXNpYT8NCjIuIEFwYWthaCB0ZXJkYXBhdCBhdXRva29yZWxhc2kgc3Bhc2lhbCBwYWRhIGRpc3RyaWJ1c2kga2FzdXMgdHViZXJrdWxvc2lzIGFudGFycHJvdmluc2k/DQozLiBGYWt0b3ItZmFrdG9yIGFwYSB5YW5nIGJlcmh1YnVuZ2FuIGRlbmdhbiB2YXJpYXNpIGp1bWxhaCBrYXN1cyB0dWJlcmt1bG9zaXMgcGFkYSB0aW5na2F0DQogICBwcm92aW5zaSBkaSBJbmRvbmVzaWE/DQoNCiMgRGF0YSBkYW4gTWV0b2RlIHsjZGF0YS1tZXRvZGV9DQoNCiMjIFN1bWJlciBkYW4gVW5pdCBEYXRhDQoNCjo6OiB7LmluZm9ib3h9DQpzdW1iZXI6IERhdGEgZGlrdW1wdWxrYW4gZGFyaSBwdWJsaWthc2kgQlBTIGRhbiBQcm9maWwgS2VzZWhhdGFuIEluZG9uZXNpYSB5YW5nIGRpYWtzZXMgcGFkYSB0YW5nZ2FsIDEyIEp1bmkgMjAyNi4gVW5pdDogcHJvdmluc2kgKDM0KSwNCjMgdGFodW4uDQo6OjoNCg0KfCBWYXJpYWJlbCB8IERlZmluaXNpIHwgU2F0dWFuIHwNCnwtLS18LS0tfC0tLXwNCnwgYEthc3VzYCB8IEp1bWxhaCBrYXN1cyBUQiB0ZXJub3RpZmlrYXNpIChMK1ApIHwga2FzdXMgfA0KfCBgUGVuZHVkdWtgIHwgSnVtbGFoIHBlbmR1ZHVrIHwgaml3YSB8DQp8IGBJUmAgfCBJbnNpZGVucyByYXRlID0gS2FzdXMvUGVuZHVkdWsgeCAxMDAuMDAwIHwgcGVyIDEwMC4wMDAgfA0KfCBgSVBNYCB8IEluZGVrcyBQZW1iYW5ndW5hbiBNYW51c2lhIHwgaW5kZWtzIHwNCnwgYE1pc2tpbmAgfCBQZXJzZW50YXNlIHBlbmR1ZHVrIG1pc2tpbiB8ICUgfA0KfCBgU2FuaXRhc2lgIHwgUGVyc2VudGFzZSBzYW5pdGFzaSBsYXlhayB8ICUgfA0KfCBgS2VwYWRhdGFuYCB8IEtlcGFkYXRhbiBwZW5kdWR1ayB8IHBlciBrbTIgfA0KfCBgUmFzaW9fUGttYCB8IFJhc2lvIFB1c2tlc21hcyBwZXIga2VjYW1hdGFuIHwgcmFzaW8gfA0KfCBgSktOYCB8IFRvdGFsIHBlc2VydGEgYWt0aWYgSktOIHwgaml3YSB8DQoNCiMjIFJpbmdrYXNhbiBEYXRhIFRCIDIwMjItMjAyNA0KDQpgYGB7ciBiYWNhLWRhdGF9DQp1c2VyICAgPC0gIldpbmFsaWFhZ3dpbCINCnJlcG8gICA8LSAiYW5hbGlzaXNfdGJfaW5kb25lc2lhIg0KYnJhbmNoIDwtICJtYWluIg0KYmFzZSAgIDwtIHNwcmludGYoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8lcy8lcy8lcy8iLCB1c2VyLCByZXBvLCBicmFuY2gpDQoNCnVybF94bHN4IDwtIHBhc3RlMChiYXNlLCAiRGF0YSUyMFRCJTIwMjAyMl8yMDI0Lnhsc3giKQ0KdXJsX3ppcCAgPC0gcGFzdGUwKGJhc2UsICJpbmRvbmVzaWFfMzRfcHJvdmluc2kuemlwIikNCg0KZG93bmxvYWQuZmlsZSh1cmxfeGxzeCwgIkRhdGFUQi54bHN4IiwgbW9kZSA9ICJ3YiIsIHF1aWV0ID0gVFJVRSkNCmRvd25sb2FkLmZpbGUodXJsX3ppcCwgICJzaHAuemlwIiwgICAgIG1vZGUgPSAid2IiLCBxdWlldCA9IFRSVUUpDQp1bnppcCgic2hwLnppcCIsIGV4ZGlyID0gInNocF9mb2xkZXIiKQ0KDQpyZW5hbWVfbWFwIDwtIGMoDQogICJXaWxheWFoIC8gUHJvdmluc2kiICAgICAgICAgICAgID0gIlByb3ZpbnNpIiwNCiAgIklQTSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAiSVBNIiwNCiAgIlBlcnNlbnRhc2UgUGVuZHVkdWsgTWlza2luIiAgICAgPSAiTWlza2luIiwNCiAgIlBlcnNlbnRhc2UgU2FuaXRhc2kgTGF5YWsiICAgICAgPSAiU2FuaXRhc2kiLA0KICAiS2VwYWRhdGFuIHBlbmR1ZHVrIChwZXIga20yKSIgICA9ICJLZXBhZGF0YW4iLA0KICAiUmFzaW8gUHVza2VzbWFzIHBlciBLZWNhbWF0YW4iICA9ICJSYXNpb19Qa20iLA0KICAiVG90YWwgUGVzZXJ0YSBBa3RpZiBKS04gKEppd2EpIiA9ICJKS04iLA0KICAiSVIgVEIgcGVyIDEwMDAwMCBQZW5kdWR1ayIgICAgICA9ICJJUiIsDQogICJKdW1sYWggS2FzdXMgVEIiICAgICAgICAgICAgICAgID0gIkthc3VzIiwNCiAgIkp1bWxhaCBQZW5kdWR1ayIgICAgICAgICAgICAgICAgPSAiUGVuZHVkdWsiDQopDQoNCmJhY2Ffc2hlZXQgPC0gZnVuY3Rpb24ocGF0aCwgc2hlZXQpIHsNCiAgZGYgPC0gcmVhZF9leGNlbChwYXRoLCBzaGVldCA9IHNoZWV0KQ0KICBuYW1lcyhkZikgPC0gZHBseXI6OnJlY29kZShuYW1lcyhkZiksICEhIXJlbmFtZV9tYXApDQogIHByb3YgPC0gc3RyX3NxdWlzaCh0b3VwcGVyKGRmJFByb3ZpbnNpKSkNCiAgcHJvdltwcm92ID09ICJESSBZT0dZQUtBUlRBIl0gICAgICAgIDwtICJEQUVSQUggSVNUSU1FV0EgWU9HWUFLQVJUQSINCiAgcHJvdltwcm92ID09ICJLRVAuIEJBTkdLQSBCRUxJVFVORyJdIDwtICJLRVBVTEFVQU4gQkFOR0tBIEJFTElUVU5HIg0KICBkZiRQcm92aW5zaSA8LSBwcm92DQogIGRmJFRhaHVuIDwtIGFzLmludGVnZXIoc2hlZXQpDQogIGRmICU+JQ0KICAgIGRwbHlyOjpzZWxlY3QoUHJvdmluc2ksIFRhaHVuLCBLYXN1cywgUGVuZHVkdWssIElSLA0KICAgICAgICAgICAgICAgICAgSVBNLCBNaXNraW4sIFNhbml0YXNpLCBLZXBhZGF0YW4sIFJhc2lvX1BrbSwgSktOKQ0KfQ0KDQp0Yl9hbGwgPC0gYmluZF9yb3dzKGxhcHBseShjKCIyMDIyIiwiMjAyMyIsIjIwMjQiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHMpIGJhY2Ffc2hlZXQoIkRhdGFUQi54bHN4IiwgcykpKQ0KdGIyMiA8LSBmaWx0ZXIodGJfYWxsLCBUYWh1biA9PSAyMDIyKQ0KdGIyMyA8LSBmaWx0ZXIodGJfYWxsLCBUYWh1biA9PSAyMDIzKQ0KdGIyNCA8LSBmaWx0ZXIodGJfYWxsLCBUYWh1biA9PSAyMDI0KQ0KDQppbmRvIDwtIHN0X3JlYWQobGlzdC5maWxlcygic2hwX2ZvbGRlciIsIHBhdHRlcm49IlxcLnNocCQiLCBmdWxsLm5hbWVzPVRSVUUpWzFdLCBxdWlldD1UUlVFKQ0KaW5kbyRQcm92aW5zaSA8LSBzdHJfc3F1aXNoKHRvdXBwZXIoaW5kbyRQcm92aW5zaSkpDQoNCnNmOjpzZl91c2VfczIoRkFMU0UpDQppbmRvIDwtIHNmOjpzdF9tYWtlX3ZhbGlkKGluZG8pDQoNCnRpZGFrX2NvY29rIDwtIHNldGRpZmYoaW5kbyRQcm92aW5zaSwgdGIyMiRQcm92aW5zaSkNCmlmIChsZW5ndGgodGlkYWtfY29jb2spPjApIG1lc3NhZ2UoIlByb3ZpbnNpIHBldGEgdGFucGEgZGF0YTogIiwgcGFzdGUodGlkYWtfY29jb2ssIGNvbGxhcHNlPSIsICIpKQ0KDQojIGRhZnRhciBkYXRhIHBlciB0YWh1biB1bnR1ayBkaXBha2FpIHVsYW5nDQpkYXRhX3RhaHVuIDwtIGxpc3QoIjIwMjIiPXRiMjIsICIyMDIzIj10YjIzLCAiMjAyNCI9dGIyNCkNCmBgYA0KDQpgYGB7ciBtZXRyaWssIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0Ka2FydHVfdGFodW4gPC0gZnVuY3Rpb24oZGYsIHRoKXsNCiAgdG90IDwtIGNvbW1hKHN1bShkZiRLYXN1cykpDQogIGlybSA8LSByb3VuZChtZWFuKGRmJElSKSwxKQ0KICBwdG9wIDwtIHN0cl90b190aXRsZShkZiRQcm92aW5zaVt3aGljaC5tYXgoZGYkSVIpXSkNCiAgc3ByaW50ZignDQo8cCBzdHlsZT0iZm9udC13ZWlnaHQ6NjAwO2NvbG9yOiMxYTY5ODU7bWFyZ2luOjE0cHggMCA0cHg7Ij5UYWh1biAlczwvcD4NCjxkaXYgY2xhc3M9Im1ldHJpYy1yb3ciPg0KICA8ZGl2IGNsYXNzPSJtZXRyaWMiPjxkaXYgY2xhc3M9Im51bSI+JXM8L2Rpdj48ZGl2IGNsYXNzPSJsYWIiPlRvdGFsIGthc3VzPC9kaXY+PC9kaXY+DQogIDxkaXYgY2xhc3M9Im1ldHJpYyI+PGRpdiBjbGFzcz0ibnVtIj4lczwvZGl2PjxkaXYgY2xhc3M9ImxhYiI+UmF0YS1yYXRhIElSPC9kaXY+PC9kaXY+DQogIDxkaXYgY2xhc3M9Im1ldHJpYyI+PGRpdiBjbGFzcz0ibnVtIj4zNDwvZGl2PjxkaXYgY2xhc3M9ImxhYiI+UHJvdmluc2k8L2Rpdj48L2Rpdj4NCiAgPGRpdiBjbGFzcz0ibWV0cmljIj48ZGl2IGNsYXNzPSJudW0iPiVzPC9kaXY+PGRpdiBjbGFzcz0ibGFiIj5JUiB0ZXJ0aW5nZ2k8L2Rpdj48L2Rpdj4NCjwvZGl2PicsIHRoLCB0b3QsIGlybSwgcHRvcCkNCn0NCmNhdChrYXJ0dV90YWh1bih0YjIyLCAyMDIyKSkNCmNhdChrYXJ0dV90YWh1bih0YjIzLCAyMDIzKSkNCmNhdChrYXJ0dV90YWh1bih0YjI0LCAyMDI0KSkNCmBgYA0KDQojIyBNZXRvZGUgU3RhdGlzdGlrDQoNCioqSW5jaWRlbmNlIFJhdGUgKElSKSoqIGRhbiAqKlN0YW5kYXJkaXplZCBJbmNpZGVuY2UgUmF0aW8gKFNJUik6KioNCiQkIElSPVxmcmFje09faX17UF9pfVx0aW1lcyAxMDB7LH0wMDAsIFxxcXVhZCBFX2k9XGJhciByXHRpbWVzIFBfaSwgXHFxdWFkIFNJUl9pPVxmcmFje09faX17RV9pfSAkJA0KZGVuZ2FuICRcYmFyIHIkIHJhdGUgbmFzaW9uYWwuIFNJUiA+IDEgPSByaXNpa28gZGkgYXRhcyByYXRhLXJhdGEgbmFzaW9uYWwuDQoNCioqUG9sYSAmIGhvdHNwb3Qgc3Bhc2lhbC4qKiBNb3JhbidzIEkgZ2xvYmFsIChhdXRva29yZWxhc2kpLCBMSVNBIChrbGFzdGVyIGxva2FsKSwgZGFuDQpHZXRpcy1PcmQgR2kqIChob3RzcG90L2NvbGRzcG90KS4gTWVuZ2d1bmFrYW4gcGVtYm9ib3QgKmstbmVhcmVzdCBuZWlnaGJvdXJzKiAoaz00KSBrYXJlbmEgSW5kb25lc2lhIGtlcHVsYXVhbi4NCg0KKipEZXRlcm1pbmFuLioqIEthcmVuYSBvdXRjb21lIGJlcnVwYSBjYWNhaGFuIGthc3VzIGRlbmdhbiBwb3B1bGFzaSBzZWJhZ2FpIG9mZnNldCwNCmRpcGFrYWkgcmVncmVzaSBjb3VudC4gT3ZlcmRpc3BlcnNpIGRpdWppIChQb2lzc29uIHZzIE5lZ2F0aXZlIEJpbm9taWFsKSwgYXV0b2tvcmVsYXNpDQpzcGFzaWFsIHJlc2lkdWFsIGRpdWppLCBkYW4gbW9kZWwgc3Bhc2lhbCAoQ0FSIFBvaXNzb24pIGRpc2VydGFrYW4gc2ViYWdhaQ0KYW5hbGlzaXMgc2Vuc2l0aXZpdGFzLg0KDQpgYGB7ciBmdW5nc2ktcGV0YX0NCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojIEZ1bmdzaS1mdW5nc2kgcGVtYnVhdCBwZXRhIGFnYXIgYmlzYSBkaXBha2FpIHVsYW5nIHBlciB0YWh1bg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KIyBib2JvdCBzcGFzaWFsIChzYW1hIHVudHVrIHNlbXVhIHRhaHVuIGthcmVuYSBnZW9tZXRyaSB0ZXRhcCkNCmNvb3JkcyAgPC0gc3VwcHJlc3NXYXJuaW5ncyhzdF9jb29yZGluYXRlcyhzdF9jZW50cm9pZChpbmRvKSkpDQprICAgICAgIDwtIDQNCm5iX2sgICAgPC0ga25uMm5iKGtuZWFybmVpZ2goY29vcmRzLCBrPWspKQ0KbHcgICAgICA8LSBuYjJsaXN0dyhuYl9rLCBzdHlsZT0iVyIpDQpsd19zZWxmIDwtIG5iMmxpc3R3KGluY2x1ZGUuc2VsZihuYl9rKSwgc3R5bGU9IlciKQ0KDQojIC0tLSBQZXRhIElSIC0tLQ0KcGV0YV9pciA8LSBmdW5jdGlvbihkZiwgdGgpew0KICBwZXRhIDwtIGluZG8gJT4lIGxlZnRfam9pbihkZiwgYnk9IlByb3ZpbnNpIikNCiAgdG9wNSA8LSBwZXRhICU+JSBmaWx0ZXIoIWlzLm5hKElSKSkgJT4lIHNsaWNlX21heChJUiwgbj01KQ0KICBjbyA8LSBhcy5kYXRhLmZyYW1lKHN0X2Nvb3JkaW5hdGVzKHN1cHByZXNzV2FybmluZ3Moc3RfY2VudHJvaWQodG9wNSkpKSkNCiAgY28kbGFiZWwgPC0gcGFzdGUwKHN0cl90b190aXRsZSh0b3A1JFByb3ZpbnNpKSwgIlxuIiwgcm91bmQodG9wNSRJUiwxKSkNCiAgZ2dwbG90KHBldGEpICsNCiAgICBnZW9tX3NmKGFlcyhmaWxsPUlSKSwgY29sb3I9IndoaXRlIiwgbGluZXdpZHRoPTAuMTUpICsNCiAgICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb249InBsYXNtYSIsIGRpcmVjdGlvbj0tMSwgbmFtZT0iSVIgVEJcbihwZXIgMTAwLjAwMCkiLCBuYS52YWx1ZT0iZ3JleTg1IikgKw0KICAgIGdlb21fcG9pbnQoZGF0YT1jbywgYWVzKFgsWSksIHNpemU9MS4zKSArDQogICAgZ2dyZXBlbDo6Z2VvbV9sYWJlbF9yZXBlbChkYXRhPWNvLCBhZXMoWCxZLGxhYmVsPWxhYmVsKSwgc2l6ZT0zLCBmb250ZmFjZT0iYm9sZCIsDQogICAgICBhbHBoYT0wLjksIGJveC5wYWRkaW5nPTAuOCwgbWluLnNlZ21lbnQubGVuZ3RoPTAsIHNlZ21lbnQuc2l6ZT0wLjUsDQogICAgICBhcnJvdz1hcnJvdyhsZW5ndGg9dW5pdCgwLjAxNSwibnBjIikpLCBzZWVkPTQyKSArDQogICAgbGFicyh0aXRsZT1wYXN0ZTAoIkFuZ2thIEluc2lkZW5zaSBUQiBwZXIgUHJvdmluc2ksICIsIHRoKSwNCiAgICAgICAgIGNhcHRpb249cGFzdGUwKCJTdW1iZXI6IFByb2ZpbCBLZXNlaGF0YW4gSW5kb25lc2lhICIsIHRoKSkgKw0KICAgIHRoZW1lX21pbmltYWwoYmFzZV9zaXplPTEyKSArDQogICAgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZT1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50aWNrcz1lbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpKQ0KfQ0KDQojIC0tLSBIaXR1bmcgU0lSIC0tLQ0KaGl0dW5nX3NpciA8LSBmdW5jdGlvbihkZil7DQogIHJuIDwtIHN1bShkZiRLYXN1cykvc3VtKGRmJFBlbmR1ZHVrKQ0KICBkZiAlPiUgbXV0YXRlKEV4cGVjdGVkPXJuKlBlbmR1ZHVrLCBTSVI9S2FzdXMvRXhwZWN0ZWQpDQp9DQoNCiMgLS0tIFBldGEgU0lSIC0tLQ0KcGV0YV9zaXJfZnVuIDwtIGZ1bmN0aW9uKGRmLCB0aCl7DQogIHNpciA8LSBoaXR1bmdfc2lyKGRmKQ0KICBwZXRhIDwtIGluZG8gJT4lIGxlZnRfam9pbihzaXIsIGJ5PSJQcm92aW5zaSIpDQogIGdncGxvdChwZXRhKSArDQogICAgZ2VvbV9zZihhZXMoZmlsbD1TSVIpLCBjb2xvcj0id2hpdGUiLCBsaW5ld2lkdGg9MC4xNSkgKw0KICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iIzIxNjZhYyIsIG1pZD0id2hpdGUiLCBoaWdoPSIjYjIxODJiIiwgbWlkcG9pbnQ9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJTSVIiLCBuYS52YWx1ZT0iZ3JleTg1IikgKw0KICAgIGxhYnModGl0bGU9cGFzdGUwKCJTdGFuZGFyZGl6ZWQgSW5jaWRlbmNlIFJhdGlvIChTSVIpIFRCLCAiLCB0aCksDQogICAgICAgICBjYXB0aW9uPSJTSVIgPiAxIChtZXJhaCkgPSByaXNpa28gZGkgYXRhcyByYXRhLXJhdGEgbmFzaW9uYWwiKSArDQogICAgdGhlbWVfbWluaW1hbChiYXNlX3NpemU9MTIpICsNCiAgICB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICBheGlzLnRpY2tzPWVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCkpDQp9DQoNCiMgLS0tIFRhYmVsIFNJUiAtLS0NCnRhYmVsX3NpciA8LSBmdW5jdGlvbihkZiwgdGgpew0KICBoaXR1bmdfc2lyKGRmKSAlPiUgYXJyYW5nZShkZXNjKFNJUikpICU+JQ0KICAgIHRyYW5zbXV0ZShQcm92aW5zaT1zdHJfdG9fdGl0bGUoUHJvdmluc2kpLCBPYnNlcnZlZD1LYXN1cywNCiAgICAgICAgICAgICAgRXhwZWN0ZWQ9cm91bmQoRXhwZWN0ZWQsMCksIFNJUj1yb3VuZChTSVIsMikpICU+JQ0KICAgIGhlYWQoMTApICU+JQ0KICAgIGthYmxlKGNhcHRpb249cGFzdGUwKCJTZXB1bHVoIHByb3ZpbnNpIFNJUiB0ZXJ0aW5nZ2kgKCIsIHRoLCAiKS4iKSkgJT4lDQogICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoPUZBTFNFLCBib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiaG92ZXIiKSkNCn0NCg0KIyAtLS0gUGV0YSBMSVNBIC0tLQ0KcGV0YV9saXNhIDwtIGZ1bmN0aW9uKGRmLCB0aCl7DQogIHBldGEgPC0gaW5kbyAlPiUgbGVmdF9qb2luKGRmLCBieT0iUHJvdmluc2kiKQ0KICB4IDwtIHBldGEkSVI7IHhzIDwtIGFzLm51bWVyaWMoc2NhbGUoeCkpOyBsYWd4cyA8LSBsYWcubGlzdHcobHcsIHhzKQ0KICBsb2NtIDwtIGxvY2FsbW9yYW4oeCwgbHcsIHplcm8ucG9saWN5PVRSVUUpOyBzaWcgPC0gbG9jbVssNV0gPCAwLjA1DQogIHBldGEka2xhc3RlciA8LSAiVGlkYWsgc2lnbmlmaWthbiINCiAgcGV0YSRrbGFzdGVyW3NpZyAmIHhzPjAgJiBsYWd4cz4wXSA8LSAiSGlnaC1IaWdoIg0KICBwZXRhJGtsYXN0ZXJbc2lnICYgeHM8MCAmIGxhZ3hzPDBdIDwtICJMb3ctTG93Ig0KICBwZXRhJGtsYXN0ZXJbc2lnICYgeHM+MCAmIGxhZ3hzPDBdIDwtICJIaWdoLUxvdyINCiAgcGV0YSRrbGFzdGVyW3NpZyAmIHhzPDAgJiBsYWd4cz4wXSA8LSAiTG93LUhpZ2giDQogIHBldGEka2xhc3RlciA8LSBmYWN0b3IocGV0YSRrbGFzdGVyLA0KICAgIGxldmVscz1jKCJIaWdoLUhpZ2giLCJMb3ctTG93IiwiSGlnaC1Mb3ciLCJMb3ctSGlnaCIsIlRpZGFrIHNpZ25pZmlrYW4iKSkNCiAgZ2dwbG90KHBldGEpICsNCiAgICBnZW9tX3NmKGFlcyhmaWxsPWtsYXN0ZXIpLCBjb2xvcj0id2hpdGUiLCBsaW5ld2lkdGg9MC4xNSkgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJIaWdoLUhpZ2giPSIjYjIxODJiIiwiTG93LUxvdyI9IiMyMTY2YWMiLA0KICAgICAgIkhpZ2gtTG93Ij0iI2VmOGE2MiIsIkxvdy1IaWdoIj0iIzY3YTljZiIsIlRpZGFrIHNpZ25pZmlrYW4iPSJncmV5ODgiKSwNCiAgICAgIG5hbWU9IktsYXN0ZXIgTElTQSIsIGRyb3A9RkFMU0UpICsNCiAgICBsYWJzKHRpdGxlPXBhc3RlMCgiS2xhc3RlciBTcGFzaWFsIExJU0EgSW5zaWRlbnMgVEIsICIsIHRoKSwNCiAgICAgICAgIGNhcHRpb249IkhpZ2gtSGlnaCA9IGhvdHNwb3Q7IExvdy1Mb3cgPSBjb2xkc3BvdCIpICsNCiAgICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZT0xMikgKw0KICAgIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGU9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkPWVsZW1lbnRfYmxhbmsoKSkNCn0NCg0KIyAtLS0gUGV0YSBIb3RzcG90IEdldGlzLU9yZCBHaSogLS0tDQpwZXRhX2dldGlzIDwtIGZ1bmN0aW9uKGRmLCB0aCl7DQogIHBldGEgPC0gaW5kbyAlPiUgbGVmdF9qb2luKGRmLCBieT0iUHJvdmluc2kiKQ0KICBnaSA8LSBhcy5udW1lcmljKGxvY2FsRyhwZXRhJElSLCBsd19zZWxmLCB6ZXJvLnBvbGljeT1UUlVFKSkNCiAgcGV0YSRob3QgPC0gY3V0KGdpLCBicmVha3M9YygtSW5mLC0yLjU4LC0xLjk2LC0xLjY1LDEuNjUsMS45NiwyLjU4LEluZiksDQogICAgbGFiZWxzPWMoIkNvbGRzcG90IDk5JSIsIkNvbGRzcG90IDk1JSIsIkNvbGRzcG90IDkwJSIsIlRpZGFrIHNpZ25pZmlrYW4iLA0KICAgICAgICAgICAgICJIb3RzcG90IDkwJSIsIkhvdHNwb3QgOTUlIiwiSG90c3BvdCA5OSUiKSkNCiAgd2FybmFfZyA8LSBjKCJDb2xkc3BvdCA5OSUiPSIjMjE2NmFjIiwiQ29sZHNwb3QgOTUlIj0iIzY3YTljZiIsIkNvbGRzcG90IDkwJSI9IiNkMWU1ZjAiLA0KICAgICJUaWRhayBzaWduaWZpa2FuIj0iZ3JleTg4IiwiSG90c3BvdCA5MCUiPSIjZmRkYmM3IiwiSG90c3BvdCA5NSUiPSIjZWY4YTYyIiwiSG90c3BvdCA5OSUiPSIjYjIxODJiIikNCiAgZ2dwbG90KHBldGEpICsNCiAgICBnZW9tX3NmKGFlcyhmaWxsPWhvdCksIGNvbG9yPSJ3aGl0ZSIsIGxpbmV3aWR0aD0wLjE1KSArDQogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXdhcm5hX2csIG5hbWU9IkdldGlzLU9yZCBHaSoiLCBkcm9wPUZBTFNFKSArDQogICAgbGFicyh0aXRsZT1wYXN0ZTAoIkhvdHNwb3QgSW5zaWRlbnMgVEIgKEdldGlzLU9yZCBHaSopLCAiLCB0aCksDQogICAgICAgICBjYXB0aW9uPSJNZXJhaCA9IGhvdHNwb3QgKGt1bXB1bGFuIElSIHRpbmdnaSk7IGJpcnUgPSBjb2xkc3BvdCIpICsNCiAgICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZT0xMikgKw0KICAgIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGU9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGF4aXMudGlja3M9ZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkPWVsZW1lbnRfYmxhbmsoKSkNCn0NCmBgYA0KDQojIEhhc2lsIEFuYWxpc2lzIHsjaGFzaWx9DQoNCiMjIEFuYWxpc2lzIERlc2tyaXB0aWYgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KIyMjIFRyZW4gTmFzaW9uYWwNCg0KYGBge3IgdHJlbiwgZmlnLmNhcD0iVG90YWwga2FzdXMgVEIgbmFzaW9uYWwsIDIwMjItMjAyNC4ifQ0KdGJfYWxsICU+JSBncm91cF9ieShUYWh1bikgJT4lIHN1bW1hcmlzZShUb3RhbD1zdW0oS2FzdXMpKSAlPiUNCiAgZ2dwbG90KGFlcyhUYWh1biwgVG90YWwpKSArDQogIGdlb21fY29sKGZpbGw9IiMxYTY5ODUiLCB3aWR0aD0wLjYpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1jb21tYShUb3RhbCkpLCB2anVzdD0tMC41LCBzaXplPTMuNSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPTIwMjI6MjAyNCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWNvbW1hLCBleHBhbmQ9ZXhwYW5zaW9uKG11bHQ9YygwLDAuMTIpKSkgKw0KICBsYWJzKHg9TlVMTCwgeT0iVG90YWwga2FzdXMgVEIiKSArIHRoZW1lX21pbmltYWwoYmFzZV9zaXplPTEyKQ0KYGBgDQoNCmBgYHtyIGludGVycC10cmVuLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCnR0IDwtIHRiX2FsbCAlPiUgZ3JvdXBfYnkoVGFodW4pICU+JSBzdW1tYXJpc2UoVD1zdW0oS2FzdXMpKSAlPiUgYXJyYW5nZShUYWh1bikNCmFyYWggPC0gaWZlbHNlKHR0JFRbM10gPiB0dCRUWzFdLCAibWVuaW5na2F0IiwgIm1lbnVydW4iKQ0KY2F0KHNwcmludGYoIioqSW50ZXJwcmV0YXNpLioqIFRvdGFsIGthc3VzIFRCIG5hc2lvbmFsIGJlcmdlcmFrIGRhcmkgJXMgKDIwMjIpIG1lbmphZGkgJXMgKDIwMjQpLCBtZW51bmp1a2thbiB0cmVuIHlhbmcgKiolcyoqIHNlbGFtYSBwZXJpb2RlIHBlbmdhbWF0YW4uIFBlcnViYWhhbiBpbmkgZGFwYXQgbWVuY2VybWlua2FuIGRpbmFtaWthIHBlbmVtdWFuIGthc3VzIG1hdXB1biBiZWJhbiBwZW55YWtpdCB5YW5nIHNlc3VuZ2d1aG55YS4iLA0KICBjb21tYSh0dCRUWzFdKSwgY29tbWEodHQkVFszXSksIGFyYWgpKQ0KYGBgDQoNCiMjIyBQcm92aW5zaSBJUiBUZXJ0aW5nZ2kgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KYGBge3IgdG9wMTAtZnVufQ0KcGxvdF90b3AxMCA8LSBmdW5jdGlvbihkZiwgdGgpew0KICBkZiAlPiUgc2xpY2VfbWF4KElSLCBuPTEwKSAlPiUNCiAgICBnZ3Bsb3QoYWVzKHJlb3JkZXIoc3RyX3RvX3RpdGxlKFByb3ZpbnNpKSwgSVIpLCBJUikpICsNCiAgICBnZW9tX2NvbChmaWxsPSIjZTA3YjM5IikgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWw9cm91bmQoSVIsMCkpLCBoanVzdD0tMC4yLCBzaXplPTMpICsNCiAgICBjb29yZF9mbGlwKCkgKyBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kPWV4cGFuc2lvbihtdWx0PWMoMCwwLjEyKSkpICsNCiAgICBsYWJzKHg9TlVMTCwgeT1wYXN0ZTAoIklSIFRCIHBlciAxMDAuMDAwICgiLCB0aCwgIikiKSkgKyB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZT0xMikNCn0NCmBgYA0KDQojIyMjIDIwMjINCmBgYHtyIHRvcDEwLTIwMjIsIGZpZy5jYXA9IlNlcHVsdWggcHJvdmluc2kgSVIgdGVydGluZ2dpICgyMDIyKS4ifQ0KcGxvdF90b3AxMCh0YjIyLCAyMDIyKQ0KYGBgDQo6Ojogey5pbmZvYm94fQ0KKipJbnRlcnByZXRhc2kuKiogREtJIEpha2FydGEgdGVyY2F0YXQgIHNlYmFnYWkgSVIgVEIgdGVydGluZ2dpIHBhZGEgMjAyMiAoNDgwIHBlciAxMDAuMDAwKSwgZGlpa3V0aSBHb3JvbnRhbG8gKDM5NykgZGFuIEphd2EgQmFyYXQgKDM3OSkuIFNlcHVsdWggcHJvdmluc2kgdGVyYXRhcyBkaWRvbWluYXNpIHdpbGF5YWggZGkgSmF3YSBkYW4gSW5kb25lc2lhIHRpbXVyLCBtZW51bmp1a2thbiBiZWJhbiBpbnNpZGVucyB5YW5nIHRlcmtvbnNlbnRyYXNpIHBhZGEgcHJvdmluc2kgdGVydGVudHUuDQo6OjoNCg0KIyMjIyAyMDIzDQpgYGB7ciB0b3AxMC0yMDIzLCBmaWcuY2FwPSJTZXB1bHVoIHByb3ZpbnNpIElSIHRlcnRpbmdnaSAoMjAyMykuIn0NCnBsb3RfdG9wMTAodGIyMywgMjAyMykNCmBgYA0KOjo6IHsuaW5mb2JveH0NCioqSW50ZXJwcmV0YXNpICgyMDIzKS4qKiBQYXB1YSB0ZXJ0aW5nZ2kgKDU3MCBwZXIgMTAwLjAwMCksIG1lbnVuanVra2FuIHBlcmdlc2VyYW4gZGFyaSBES0kgSmFrYXJ0YSB0YWh1biBzZWJlbHVtbnlhLg0KOjo6DQoNCiMjIyMgMjAyNA0KYGBge3IgdG9wMTAtMjAyNCwgZmlnLmNhcD0iU2VwdWx1aCBwcm92aW5zaSBJUiB0ZXJ0aW5nZ2kgKDIwMjQpLiJ9DQpwbG90X3RvcDEwKHRiMjQsIDIwMjQpDQpgYGANCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaSAoMjAyNCkuKiogUGFwdWEgdGV0YXAgdGVydGluZ2dpICg2MTYgcGVyIDEwMC4wMDApLCBtZW5naW5kaWthc2lrYW4gYmViYW4gaW5zaWRlbnMgeWFuZyBtZW5ldGFwIGRpIHdpbGF5YWggdGltdXIuDQo6OjoNCg0KIyMjIFJpbmdrYXNhbiBTdGF0aXN0aWsNCg0KYGBge3IgcmluZ2thc30NCnRiX2FsbCAlPiUgZ3JvdXBfYnkoVGFodW4pICU+JQ0KICBzdW1tYXJpc2UoVG90YWxfa2FzdXM9c3VtKEthc3VzKSwgSVJfbWluPXJvdW5kKG1pbihJUiksMSksDQogICAgICAgICAgICBJUl9tZWRpYW49cm91bmQobWVkaWFuKElSKSwxKSwgSVJfbWVhbj1yb3VuZChtZWFuKElSKSwxKSwNCiAgICAgICAgICAgIElSX21heD1yb3VuZChtYXgoSVIpLDEpKSAlPiUNCiAga2FibGUoY2FwdGlvbj0iVGFiZWwgMS4gUmluZ2thc2FuIGthc3VzICYgSVIgcGVyIHRhaHVuLiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KYGBgDQoNCmBgYHtyIGludGVycC1yaW5nLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCnJyIDwtIHRiX2FsbCAlPiUgZ3JvdXBfYnkoVGFodW4pICU+JSBzdW1tYXJpc2UobT1tZWFuKElSKSwgbW49bWluKElSKSwgbXg9bWF4KElSKSkNCmNhdChzcHJpbnRmKCIqKkludGVycHJldGFzaS4qKiBSYXRhLXJhdGEgSVIgYW50YXJwcm92aW5zaSBiZXJraXNhciAlLjFmLSUuMWYgcGVyIDEwMC4wMDAgcGVuZHVkdWsgc2VwYW5qYW5nIDIwMjItMjAyNC4gUmVudGFuZyBuaWxhaSB5YW5nIGxlYmFyIChtaW5pbXVtIHNla2l0YXIgJS4xZiBoaW5nZ2EgbWFrc2ltdW0gJS4xZikgbWVuZ2luZGlrYXNpa2FuICoqZGlzcGFyaXRhcyBpbnNpZGVucyB5YW5nIGJlc2FyIGFudGFycHJvdmluc2kqKiwgeWFuZyBtZW5qYWRpIGRhc2FyIHBlcmx1bnlhIGFuYWxpc2lzIHNwYXNpYWwgdW50dWsgbWVuZ2V0YWh1aSBhcGFrYWggcHJvdmluc2kgYmVyLUlSIHRpbmdnaSBjZW5kZXJ1bmcgbWVuZ2Vsb21wb2sgc2VjYXJhIGdlb2dyYWZpcy4iLA0KICBtaW4ocnIkbSksIG1heChyciRtKSwgbWluKHJyJG1uKSwgbWF4KHJyJG14KSkpDQpgYGANCg0KIyMjIFJpbmdrYXNhbiBWYXJpYWJlbCBwZXIgVGFodW4gey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KU3RhdGlzdGlrIGRlc2tyaXB0aWYgKG1pbiwgbWVkaWFuLCByYXRhLXJhdGEsIG1ha3MpIHVudHVrIHNlbHVydWggdmFyaWFiZWwgcGFkYSB0aWFwIHRhaHVuLg0KDQpgYGB7ciByaW5na2FzLWZ1bn0NCnJpbmdrYXNfdmFyIDwtIGZ1bmN0aW9uKGRmLCB0aCl7DQogIGRmICU+JQ0KICAgIGRwbHlyOjpzZWxlY3QoS2FzdXMsIElSLCBJUE0sIE1pc2tpbiwgU2FuaXRhc2ksIEtlcGFkYXRhbiwgUmFzaW9fUGttKSAlPiUNCiAgICBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLCBuYW1lc190bz0iVmFyaWFiZWwiLCB2YWx1ZXNfdG89Ik5pbGFpIikgJT4lDQogICAgZ3JvdXBfYnkoVmFyaWFiZWwpICU+JQ0KICAgIHN1bW1hcmlzZShNaW49cm91bmQobWluKE5pbGFpKSwxKSwgTWVkaWFuPXJvdW5kKG1lZGlhbihOaWxhaSksMSksDQogICAgICAgICAgICAgIE1lYW49cm91bmQobWVhbihOaWxhaSksMSksIE1ha3M9cm91bmQobWF4KE5pbGFpKSwxKSwgLmdyb3Vwcz0iZHJvcCIpICU+JQ0KICAgIGthYmxlKGNhcHRpb249cGFzdGUwKCJSaW5na2FzYW4gdmFyaWFiZWwsICIsIHRoLCAiLiIpKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KfQ0KYGBgDQoNCiMjIyMgMjAyMg0KYGBge3IgcmluZ2thc3Zhci0yMDIyfQ0KcmluZ2thc192YXIodGIyMiwgMjAyMikNCmBgYA0KDQo6Ojogey5pbmZvYm94fQ0KKipJbnRlcnByZXRhc2kuKiogUGFkYSAyMDIyLCBJUiBUQiBhbnRhcnByb3ZpbnNpIGJlcmtpc2FyIDEwNSw3LTQ4MCwyIHBlciAxMDAuMDAwIChyYXRhLXJhdGEgMjQ1LDMpLCBtZW51bmp1a2thbiBkaXNwYXJpdGFzIHlhbmcgbGViYXIuIEp1bWxhaCBrYXN1cyBzYW5nYXQgYmVydmFyaWFzaSAoMS43MzgtMTg0LjQwNiksIHNlamFsYW4gZGVuZ2FuIHJlbnRhbmcga2VwYWRhdGFuIHBlbmR1ZHVrIHlhbmcgZWtzdHJlbSAoMTAtMTcuMDMxIHBlciBrbcKyKSwgc2VoaW5nZ2EgcG9wdWxhc2kgcGVybHUgZGlwZXJoaXR1bmdrYW4gc2ViYWdhaSBvZmZzZXQgZGFsYW0gcGVtb2RlbGFuLg0KOjo6DQoNCiMjIyMgMjAyMw0KYGBge3IgcmluZ2thc3Zhci0yMDIzfQ0KcmluZ2thc192YXIodGIyMywgMjAyMykNCmBgYA0KDQo6Ojogey5pbmZvYm94fQ0KKipJbnRlcnByZXRhc2kuKiogUGFkYSAyMDIzLCByYXRhLXJhdGEgSVIgbWVuaW5na2F0IG1lbmphZGkgMjgyLDcgcGVyIDEwMC4wMDAgZGVuZ2FuIG5pbGFpIG1ha3NpbXVtIG1lbmNhcGFpIDU3MCwyLCBtZW5hbmRha2FuIGtlbmFpa2FuIGJlYmFuIGluc2lkZW5zIGRpYmFuZGluZyB0YWh1biBzZWJlbHVtbnlhLiBTZWJhcmFuIGNvdmFyaWF0ZSBzb3Npb2Vrb25vbWkgKElQTSwga2VtaXNraW5hbiwgc2FuaXRhc2kpIHJlbGF0aWYgc3RhYmlsIGFudGFydGFodW4uDQo6OjoNCg0KIyMjIyAyMDI0DQpgYGB7ciByaW5na2FzdmFyLTIwMjR9DQpyaW5na2FzX3Zhcih0YjI0LCAyMDI0KQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBQYWRhIDIwMjQsIHJhdGEtcmF0YSBJUiBrZW1iYWxpIG5haWsgbWVuamFkaSAyODYsMyBwZXIgMTAwLjAwMCAobWFrc2ltdW0gNjE1LDcpLCBtZWxhbmp1dGthbiB0cmVuIHBlbmluZ2thdGFuLiBEaXNwYXJpdGFzIGFudGFycHJvdmluc2kgeWFuZyBrb25zaXN0ZW4gbGViYXIgc2VwYW5qYW5nIHBlcmlvZGUgbWVuZWdhc2thbiBwZXJsdW55YSBhbmFsaXNpcyBzcGFzaWFsIGRhbiBwZW55ZXN1YWlhbiBwb3B1bGFzaSBkYWxhbSBtb2RlbC4NCjo6Og0KDQojIyBQZXRhIEluc2lkZW5zIFJhdGUgKElSKSB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMgMjAyMg0KYGBge3IgaXItMjAyMiwgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTUuNX0NCnBldGFfaXIodGIyMiwgMjAyMikNCmBgYA0KDQo6Ojogey5pbmZvYm94fQ0KKipJbnRlcnByZXRhc2kuKiogUGFkYSAyMDIyLCBJUiBUQiB0ZXJ0aW5nZ2kgdGVya29uc2VudHJhc2kgZGkgcHJvdmluc2kgcGFkYXQgZGkgUHVsYXUgSmF3YSDigJQgREtJIEpha2FydGEgKDQ4MCksIEphd2EgQmFyYXQgKDM3OSksIGRhbiBCYW50ZW4gKDM0OSkg4oCUIHNlcnRhIGJlYmVyYXBhIHdpbGF5YWggSW5kb25lc2lhIHRpbXVyIHNlcGVydGkgR29yb250YWxvICgzOTcpIGRhbiBQYXB1YSAoMzYzKS4gS2VkZWthdGFuIHdhcm5hIGdlbGFwIGFudGFycHJvdmluc2kgZGkgSmF3YSBiYWdpYW4gYmFyYXQgbWVuZ2lzeWFyYXRrYW4gcG90ZW5zaSBwZW5nZWxvbXBva2FuIHNwYXNpYWwgeWFuZyBkaXVqaSBtZWxhbHVpIE1vcmFuJ3MgSS4NCjo6Og0KDQojIyMgMjAyMw0KYGBge3IgaXItMjAyMywgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTUuNX0NCnBldGFfaXIodGIyMywgMjAyMykNCmBgYA0KDQo6Ojogey5pbmZvYm94fQ0KKipJbnRlcnByZXRhc2kuKiogUGFkYSAyMDIzLCBiZWJhbiBpbnNpZGVucyB0ZXJ0aW5nZ2kgYmVyZ2VzZXIga2UgUGFwdWEgKDU3MCksIG1lbmFuZGFpIG1lbmluZ2thdG55YSBJUiBkaSBJbmRvbmVzaWEgdGltdXIsIHNlbWVudGFyYSBwcm92aW5zaSBwYWRhdCBkaSBKYXdhIHRldGFwIGJlcmFkYSBwYWRhIGthdGVnb3JpIHRpbmdnaS4gUG9sYSBzZWJhcmFuIHlhbmcgc2VydXBhIGRlbmdhbiB0YWh1biBzZWJlbHVtbnlhIG1lbmdpbmRpa2FzaWthbiBrb25zZW50cmFzaSBnZW9ncmFmaXMgeWFuZyBtZW5ldGFwLg0KOjo6DQoNCiMjIyAyMDI0DQpgYGB7ciBpci0yMDI0LCBmaWcud2lkdGg9MTEsIGZpZy5oZWlnaHQ9NS41fQ0KcGV0YV9pcih0YjI0LCAyMDI0KQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBQYWRhIDIwMjQsIFBhcHVhIGtlbWJhbGkgdGVyY2F0YXQgc2ViYWdhaSBJUiB0ZXJ0aW5nZ2kgKDYxNiksIG1lbXBlcnRlZ2FzIGJlYmFuIFRCIHlhbmcgbWVuZXRhcCBkaSB3aWxheWFoIHRpbXVyLCBkaWlyaW5naSBpbnNpZGVucyB5YW5nIGtvbnNpc3RlbiB0aW5nZ2kgZGkgcHJvdmluc2ktcHJvdmluc2kgSmF3YS4gS2VzdGFiaWxhbiBwb2xhIHNwYXNpYWwgc2VwYW5qYW5nIDIwMjItMjAyNCBtZW1wZXJrdWF0IHRlbXVhbiBhdXRva29yZWxhc2kgc3Bhc2lhbCB5YW5nIHNpZ25pZmlrYW4uDQo6OjoNCg0KYGBge3IgaW50ZXJwLXBldGEtaXIsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQ0KdG9wX2lyIDwtIHRiX2FsbCAlPiUgZ3JvdXBfYnkoVGFodW4pICU+JSBzbGljZV9tYXgoSVIsIG49MykgJT4lDQogIHN1bW1hcmlzZShwcm92PXBhc3RlKHN0cl90b190aXRsZShQcm92aW5zaSksIGNvbGxhcHNlPSIsICIpLCAuZ3JvdXBzPSJkcm9wIikNCmNhdChzcHJpbnRmKCIqKkludGVycHJldGFzaS4qKiBQZXRhIG1lbnVuanVra2FuIHByb3ZpbnNpIGRlbmdhbiB3YXJuYSBsZWJpaCBwZWthdCBtZW1pbGlraSBpbnNpZGVucyBUQiBsZWJpaCB0aW5nZ2kuIFRpZ2EgcHJvdmluc2kgZGVuZ2FuIElSIHRlcnRpbmdnaSByZWxhdGlmIGtvbnNpc3RlbiBhbnRhciB0YWh1biAobWlzLiBwYWRhIDIwMjI6ICVzKSwgbWVuZ2luZGlrYXNpa2FuIGJlYmFuIFRCIHlhbmcgdGVya29uc2VudHJhc2kgcGFkYSB3aWxheWFoLXdpbGF5YWggdGVydGVudHUuIEtsaWsgdGFiIHRpYXAgdGFodW4gdW50dWsgbWVtYmFuZGluZ2thbiBwZXJ1YmFoYW4gc2ViYXJhbi4iLA0KICB0b3BfaXIkcHJvdlt0b3BfaXIkVGFodW49PTIwMjJdKSkNCmBgYA0KDQojIyBTdGFuZGFyZGl6ZWQgSW5jaWRlbmNlIFJhdGlvIChTSVIpIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyAyMDIyDQpgYGB7ciBzaXItMjAyMiwgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTUuNX0NCnRhYmVsX3Npcih0YjIyLCAyMDIyKQ0KcGV0YV9zaXJfZnVuKHRiMjIsIDIwMjIpDQpgYGANCg0KIyMjIDIwMjMNCmBgYHtyIHNpci0yMDIzLCBmaWcud2lkdGg9MTEsIGZpZy5oZWlnaHQ9NS41fQ0KdGFiZWxfc2lyKHRiMjMsIDIwMjMpDQpwZXRhX3Npcl9mdW4odGIyMywgMjAyMykNCmBgYA0KDQojIyMgMjAyNA0KYGBge3Igc2lyLTIwMjQsIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD01LjV9DQp0YWJlbF9zaXIodGIyNCwgMjAyNCkNCnBldGFfc2lyX2Z1bih0YjI0LCAyMDI0KQ0KYGBgDQoNCmBgYHtyIGludGVycC1wZXRhLXNpciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQpzaXIyMmQgPC0gaGl0dW5nX3Npcih0YjIyKQ0Kbl9hdGFzIDwtIHN1bShzaXIyMmQkU0lSPjEpDQpjYXQoc3ByaW50ZigiKipJbnRlcnByZXRhc2kuKiogU0lSIG1lbWJhbmRpbmdrYW4ganVtbGFoIGthc3VzIHRlcmFtYXRpIGRlbmdhbiB5YW5nIGRpaGFyYXBrYW4gYmlsYSBwcm92aW5zaSBtZW1pbGlraSByaXNpa28gc2V0YXJhIHJhdGEtcmF0YSBuYXNpb25hbC4gUGFkYSAyMDIyLTIwMjQsIHNlYmFueWFrICoqJWQgZGFyaSAzNCBwcm92aW5zaSBtZW1pbGlraSBTSVIgPiAxKiogKHJpc2lrbyBkaSBhdGFzIHJhdGEtcmF0YSBuYXNpb25hbCwgZGl0YW5kYWkgd2FybmEgbWVyYWggcGFkYSBwZXRhKSwgc2VkYW5na2FuIHNpc2FueWEgZGkgYmF3YWggcmF0YS1yYXRhLiBQcm92aW5zaSBkZW5nYW4gU0lSIHRpbmdnaSBtZW5qYWRpIHByaW9yaXRhcyBwZXJoYXRpYW4ga2FyZW5hIGJlYmFubnlhIG1lbGFtcGF1aSBla3NwZWt0YXNpIHBvcHVsYXNpLiIsDQogIG5fYXRhcykpDQpgYGANCg0KIyMgQW5hbGlzaXMgUG9sYSBTcGFzaWFsOiBNb3JhbidzIEkgR2xvYmFsDQoNCmBgYHtyIG1vcmFufQ0KbW9yYW5fdGFodW4gPC0gZnVuY3Rpb24oZGYsIHRoKXsNCiAgcGV0YSA8LSBpbmRvICU+JSBsZWZ0X2pvaW4oZGYsIGJ5PSJQcm92aW5zaSIpDQogIG1jIDwtIG1vcmFuLm1jKHBldGEkSVIsIGx3LCBuc2ltPTk5OSwgemVyby5wb2xpY3k9VFJVRSkNCiAgZGF0YS5mcmFtZShUYWh1bj10aCwgTW9yYW5fST1yb3VuZCh1bm5hbWUobWMkc3RhdGlzdGljKSwzKSwgcF92YWx1ZT1yb3VuZChtYyRwLnZhbHVlLDMpKQ0KfQ0KbW9yYW5fdGFiIDwtIHJiaW5kKG1vcmFuX3RhaHVuKHRiMjIsMjAyMiksIG1vcmFuX3RhaHVuKHRiMjMsMjAyMyksIG1vcmFuX3RhaHVuKHRiMjQsMjAyNCkpDQptb3Jhbl90YWIgJT4lDQogIGthYmxlKGNhcHRpb249IlRhYmVsIDIuIE1vcmFuJ3MgSSBnbG9iYWwgSVIgcGVyIHRhaHVuLiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KYGBgDQoNCmBgYHtyIGludGVycC1tb3JhbiwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQpzaWdfbiA8LSBzdW0obW9yYW5fdGFiJHBfdmFsdWUgPCAwLjA1KQ0Kcm5nIDwtIHNwcmludGYoIiUuM2YtJS4zZiIsIG1pbihtb3Jhbl90YWIkTW9yYW5fSSksIG1heChtb3Jhbl90YWIkTW9yYW5fSSkpDQprZXQgPC0gaWYgKHNpZ19uPT0zKSAic2lnbmlmaWthbiBwYWRhIGtldGlnYSB0YWh1biIgZWxzZSBpZiAoc2lnX24+MCkgc3ByaW50Zigic2lnbmlmaWthbiBwYWRhICVkIGRhcmkgMyB0YWh1biIsIHNpZ19uKSBlbHNlICJ0aWRhayBzaWduaWZpa2FuIg0KY2F0KHNwcmludGYoIioqSW50ZXJwcmV0YXNpLioqIE5pbGFpIE1vcmFuJ3MgSSBiZXJraXNhciAlcyBkYW4gJXMgKHAgPCAwLDA1KS4gTmlsYWkgcG9zaXRpZiBtZW5hbmRha2FuICoqYXV0b2tvcmVsYXNpIHNwYXNpYWwgcG9zaXRpZioqOiBwcm92aW5zaSBkZW5nYW4gSVIgdGluZ2dpIGNlbmRlcnVuZyBiZXJkZWthdGFuIGRlbmdhbiBwcm92aW5zaSBiZXItSVIgdGluZ2dpIGxhaW5ueWEsIG1lbWJlbnR1ayBwb2xhIHBlbmdlbG9tcG9rYW4gKHNwYXRpYWwgY2x1c3RlcmluZykuIEtvbnNpc3RlbnNpIG5pbGFpIGFudGFyIHRhaHVuIG1lbnVuanVra2FuIHBvbGEgc3Bhc2lhbCB5YW5nICoqc3RhYmlsKiogc2VwYW5qYW5nIHBlcmlvZGUsIHNlaGluZ2dhIGtlYmVyYWRhYW4ga2xhc3RlciBpbmkgYnVrYW4ga2VqYWRpYW4gc2VzYWF0IG1lbGFpbmthbiBrYXJha3RlcmlzdGlrIHlhbmcgbWVuZXRhcC4iLA0KICBybmcsIGtldCkpDQpgYGANCg0KOjo6IHsuaW5mb2JveH0NCioqQ2FyYSBiYWNhLioqIE1vcmFuJ3MgSSBtZW5kZWthdGkgKzEgPSBwZW5nZWxvbXBva2FuIHNwYXNpYWwgcG9zaXRpZjsgbWVuZGVrYXRpIDAgPSBhY2FrLg0KSmlrYSBwLXZhbHVlIDwgMCwwNSwgYXV0b2tvcmVsYXNpIHNwYXNpYWwgc2lnbmlmaWthbi4NCjo6Og0KDQojIyBQZXRhIEtsYXN0ZXIgTElTQSAoTG9jYWwgTW9yYW4pIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyAyMDIyDQpgYGB7ciBsaXNhLTIwMjIsIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD01LjV9DQpwZXRhX2xpc2EodGIyMiwgMjAyMikNCmBgYA0KDQo6Ojogey5pbmZvYm94fQ0KKipJbnRlcnByZXRhc2kuKiogUGFkYSAyMDIyLCBrbGFzdGVyICoqSGlnaC1IaWdoIChob3RzcG90KSoqIGJlcmFkYSBkaSBKYXdhIGJhZ2lhbiBiYXJhdCAobWVyYWgpIGRhbiBrbGFzdGVyICoqTG93LUxvdyAoY29sZHNwb3QpKiogZGkgSmF3YSBiYWdpYW4gdGltdXIgKGJpcnUpLiBQYWRhIHRhaGFwIGluaSwga29uc2VudHJhc2kgYmViYW4gVEIgbWFzaWggYmVycHVzYXQgZGkgUHVsYXUgSmF3YS4NCjo6Og0KDQojIyMgMjAyMw0KYGBge3IgbGlzYS0yMDIzLCBmaWcud2lkdGg9MTEsIGZpZy5oZWlnaHQ9NS41fQ0KcGV0YV9saXNhKHRiMjMsIDIwMjMpDQpgYGANCg0KOjo6IHsuaW5mb2JveH0NCioqSW50ZXJwcmV0YXNpLioqIFBhZGEgMjAyMywga2xhc3RlciAqKkhpZ2gtSGlnaCBiZXJnZXNlciBrZSBJbmRvbmVzaWEgdGltdXIqKiAoUGFwdWEgZGFuIFBhcHVhIEJhcmF0LCBtZXJhaCksIHNlbWVudGFyYSBQdWxhdSBKYXdhIGJlcnViYWggbWVuamFkaSBrbGFzdGVyICoqTG93LUxvdyAoY29sZHNwb3QpKiouIFRlcmRhcGF0IHB1bGEgb3V0bGllciAqKkxvdy1IaWdoKiogZGkgc2VraXRhciBNYWx1a3Ug4oCUIHdpbGF5YWggYmVyLUlSIHJlbmRhaCB5YW5nIGRpa2VsaWxpbmdpIHRldGFuZ2dhIGJlci1JUiB0aW5nZ2kuIFBlcmdlc2VyYW4gaW5pIG1lbmFuZGFpIHBlcnBpbmRhaGFuIHB1c2F0IGJlYmFuIFRCIGRhcmkgYmFyYXQga2UgdGltdXIuDQo6OjoNCg0KIyMjIDIwMjQNCmBgYHtyIGxpc2EtMjAyNCwgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTUuNX0NCnBldGFfbGlzYSh0YjI0LCAyMDI0KQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBQYWRhIDIwMjQsIGtsYXN0ZXIgKipIaWdoLUhpZ2ggdGV0YXAgZGkgUGFwdWEgZGFuIFBhcHVhIEJhcmF0KiosIGRhbiBKYXdhIGtvbnNpc3RlbiBzZWJhZ2FpIGtsYXN0ZXIgKipMb3ctTG93KiouIFBvbGEgaW5pIG1lbXBlcnRlZ2FzIHBlcnBpbmRhaGFuIGRhbiBtZW5ldGFwbnlhIGhvdHNwb3QgVEIgZGkga2F3YXNhbiB0aW11ciBJbmRvbmVzaWEgcGFkYSBkdWEgdGFodW4gdGVyYWtoaXIgcGVyaW9kZSBwZW5nYW1hdGFuLg0KOjo6DQoNCiMjIFBldGEgSG90c3BvdCBHZXRpcy1PcmQgR2kqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCiMjIyAyMDIyDQpgYGB7ciBnZXRpcy0yMDIyLCBmaWcud2lkdGg9MTEsIGZpZy5oZWlnaHQ9NS41fQ0KcGV0YV9nZXRpcyh0YjIyLCAyMDIyKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBQYWRhIDIwMjIsIGFuYWxpc2lzIEdldGlzLU9yZCBHaSogbWVuZ2lkZW50aWZpa2FzaSAqKmhvdHNwb3QqKiAoa3VtcHVsYW4gSVIgdGluZ2dpKSBkaSBQdWxhdSBKYXdhLCBtZW1wZXJ0ZWdhcyB0ZW11YW4ga2xhc3RlciBMSVNBLiBIb3RzcG90IG1lbmFuZGFpIHdpbGF5YWggZGVuZ2FuIGludGVuc2l0YXMgcGVuZ2Vsb21wb2thbiBrYXN1cyB0ZXJ0aW5nZ2kgeWFuZyBsYXlhayBkaXByaW9yaXRhc2thbiBkYWxhbSBpbnRlcnZlbnNpIHBlbmdlbmRhbGlhbiBUQi4NCjo6Og0KDQojIyMgMjAyMw0KYGBge3IgZ2V0aXMtMjAyMywgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTUuNX0NCnBldGFfZ2V0aXModGIyMywgMjAyMykNCmBgYA0KDQo6Ojogey5pbmZvYm94fQ0KKipJbnRlcnByZXRhc2kuKiogUGFkYSAyMDIzLCBob3RzcG90IEdldGlzLU9yZCBHaSoganVzdHJ1IHRlcmtvbnNlbnRyYXNpIGRpICoqSW5kb25lc2lhIGJhZ2lhbiB0aW11cioqIOKAlCB0ZXJ1dGFtYSBQYXB1YSBkYW4gUGFwdWEgQmFyYXQgKEhvdHNwb3QgOTUlKSDigJQgbWVuYW5kYWkgcGVyZ2VzZXJhbiBkYXJpIHBvbGEgMjAyMiB5YW5nIGJlcnB1c2F0IGRpIEphd2EuIFNlbWVudGFyYSBpdHUsIHNlYmFnaWFuIFB1bGF1IEphd2EgYmFnaWFuIHRlbmdhaC10aW11ciB0ZXJpZGVudGlmaWthc2kgc2ViYWdhaSAqKmNvbGRzcG90KiouIFBlcmdlc2VyYW4gaW5pIHNlamFsYW4gZGVuZ2FuIG5haWtueWEgSVIgUGFwdWEgbWVuamFkaSB0ZXJ0aW5nZ2kgcGFkYSAyMDIzICg1NzAgcGVyIDEwMC4wMDApLg0KOjo6DQojIyMgMjAyNA0KYGBge3IgZ2V0aXMtMjAyNCwgZmlnLndpZHRoPTExLCBmaWcuaGVpZ2h0PTUuNX0NCnBldGFfZ2V0aXModGIyNCwgMjAyNCkNCmBgYA0KDQo6Ojogey5pbmZvYm94fQ0KKipJbnRlcnByZXRhc2kuKiogUGFkYSAyMDI0LCBob3RzcG90IEdldGlzLU9yZCBHaSogZGkgKipQYXB1YSBtZW5qYWRpIHRpbmdrYXQgdGVydGluZ2dpIChIb3RzcG90IDk5JSkqKiwgbWVtcGVydGVnYXMga29uc2VudHJhc2kgYmViYW4gVEIgZGkgSW5kb25lc2lhIGJhZ2lhbiB0aW11ciB5YW5nIG11bGFpIHRhbXBhayBwYWRhIDIwMjMuIFB1bGF1IEphd2EgYmFnaWFuIHRlbmdhaC10aW11ciBrb25zaXN0ZW4gbWVuamFkaSBjb2xkc3BvdC4gUGVuZ3VhdGFuIGhvdHNwb3QgUGFwdWEgc2VqYWxhbiBkZW5nYW4gSVIgdGVydGluZ2dpIHlhbmcga2VtYmFsaSB0ZXJjYXRhdCBkaSBQYXB1YSAoNjE2IHBlciAxMDAuMDAwKS4NCjo6Og0KIyMgQW5hbGlzaXMgRGV0ZXJtaW5hbjogUGVtb2RlbGFuIENvdW50DQoNCk91dGNvbWU6IGp1bWxhaCBrYXN1cyBUQiBkZW5nYW4gYG9mZnNldChsb2coUGVuZHVkdWspKWAuIFByZWRpa3RvciAoNSBjb3ZhcmlhdGUpOiBJUE0sDQolIHBlbmR1ZHVrIG1pc2tpbiwgJSBzYW5pdGFzaSBsYXlhaywga2VwYWRhdGFuIHBlbmR1ZHVrLCBkYW4gcmFzaW8gUHVza2VzbWFzIHBlciBrZWNhbWF0YW4uDQpQZW1pbGloYW4gbW9kZWwgKE5CIHZzIG1vZGVsIENBUiBzcGFzaWFsKSBkaXRlbnR1a2FuDQpvbGVoIHVqaSBhdXRva29yZWxhc2kgc3Bhc2lhbCBwYWRhIHJlc2lkdWFsIHRpYXAgdGFodW4uDQoNCiMjIyBFa3NwbG9yYXNpIEtvcmVsYXNpIGFudGFyIFByZWRpa3RvciB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpNYXRyaWtzIGtvcmVsYXNpIGFudGFyIGVuYW0gcHJlZGlrdG9yICh0YW5wYSBJUiwga2FyZW5hIElSIGJ1a2FuIHByZWRpa3RvciBtZWxhaW5rYW4NCnR1cnVuYW4gZGFyaSBvdXRjb21lKSB1bnR1ayBtZW1lcmlrc2EgcG90ZW5zaSBtdWx0aWtvbGluZWFyaXRhcy4NCg0KYGBge3IgY29yci1mdW59DQpwbG90X2NvcnIgPC0gZnVuY3Rpb24oZGYpew0KICB2YXJzIDwtIGRmICU+JSBkcGx5cjo6c2VsZWN0KElQTSwgTWlza2luLCBTYW5pdGFzaSwgS2VwYWRhdGFuLCBSYXNpb19Qa20pDQogIGNvcnJwbG90KGNvcih2YXJzKSwgbWV0aG9kPSJjb2xvciIsIHR5cGU9InVwcGVyIiwgYWRkQ29lZi5jb2w9ImJsYWNrIiwNCiAgICAgICAgICAgbnVtYmVyLmNleD0wLjcsIHRsLmNvbD0iYmxhY2siLCB0bC5zcnQ9NDUpDQp9DQpgYGANCg0KIyMjIyAyMDIyDQpgYGB7ciBjb3JyLTIwMjIsIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTYsIGZpZy5jYXA9Ik1hdHJpa3Mga29yZWxhc2kgYW50YXIgcHJlZGlrdG9yICgyMDIyKS4ifQ0KcGxvdF9jb3JyKHRiMjIpDQpgYGANCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBTZWJhZ2lhbiBiZXNhciBwcmVkaWt0b3IgbWVudW5qdWtrYW4ga29yZWxhc2kgcmVuZGFoIGhpbmdnYSBzZWRhbmcuIE5hbXVuIHRlcmRhcGF0IGtvcmVsYXNpIHlhbmcgc2FuZ2F0IHRpbmdnaSBhbnRhcmEgKipLZXBhZGF0YW4gcGVuZHVkdWsgZGFuIFJhc2lvIFB1c2tlc21hcyAociA9IDAsOTcpKiosIG1lbmdpbmRpa2FzaWthbiBwb3RlbnNpICoqbXVsdGlrb2xpbmVhcml0YXMgc2VyaXVzKiogYW50YXIga2VkdWEgdmFyaWFiZWwuIEtvcmVsYXNpIHNlZGFuZyBqdWdhIHRlcmxpaGF0IGFudGFyYSBJUE0gZGVuZ2FuIGtlbWlza2luYW4gKHIgPSAtMCw2NykgZGFuIElQTSBkZW5nYW4gcmFzaW8gUHVza2VzbWFzIChyID0gMCw1NSkuIFRlbXVhbiBpbmkgcGVybHUgZGlrb25maXJtYXNpIG1lbGFsdWkgbmlsYWkgVklGIHBhZGEgdGFoYXAgcGVtb2RlbGFuOyBiaWxhIFZJRiB0aW5nZ2ksIHNhbGFoIHNhdHUgZGFyaSB2YXJpYWJlbCB5YW5nIGJlcmtvcmVsYXNpIGt1YXQgc2ViYWlrbnlhIGRpcGVydGltYmFuZ2thbiB1bnR1ayBkaWtlbHVhcmthbi4NCjo6Og0KDQojIyMjIDIwMjMNCmBgYHtyIGNvcnItMjAyMywgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NiwgZmlnLmNhcD0iTWF0cmlrcyBrb3JlbGFzaSBhbnRhciBwcmVkaWt0b3IgKDIwMjMpLiJ9DQpwbG90X2NvcnIodGIyMykNCmBgYA0KOjo6IHsuaW5mb2JveH0NCioqSW50ZXJwcmV0YXNpLioqIFBhZGEgMjAyMywga29yZWxhc2kgYW50YXIgcHJlZGlrdG9yIHNlbHVydWhueWEgdGVyZ29sb25nIHJlbmRhaCBoaW5nZ2Egc2VkYW5nICh8cnwgPCAwLDcpLCBzZWhpbmdnYSAqKnRpZGFrIGFkYSBpbmRpa2FzaSBtdWx0aWtvbGluZWFyaXRhcyB5YW5nIG1lbmdraGF3YXRpcmthbioqLiBLb3JlbGFzaSB0ZXJ0aW5nZ2kgdGVyZGFwYXQgYW50YXJhIElQTSBkYW4gcGVyc2VudGFzZSBrZW1pc2tpbmFuIChyID0gLTAsNjkpLCB5YW5nIHNlY2FyYSBzdWJzdGFuc2kgd2FqYXIga2FyZW5hIGRhZXJhaCBkZW5nYW4gSVBNIHRpbmdnaSBjZW5kZXJ1bmcgbWVtaWxpa2kgdGluZ2thdCBrZW1pc2tpbmFuIGxlYmloIHJlbmRhaC4gQmVyYmVkYSBkZW5nYW4gMjAyMiwga29yZWxhc2kgS2VwYWRhdGFuLVJhc2lvIFB1c2tlc21hcyBwYWRhIDIwMjMgaGFueWEgLTAsMjQsIG1lbmd1YXRrYW4gZHVnYWFuIGFkYW55YSBhbm9tYWxpIGRhdGEgcGFkYSB0YWh1biAyMDIyLg0KOjo6DQoNCiMjIyMgMjAyNA0KYGBge3IgY29yci0yMDI0LCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD02LCBmaWcuY2FwPSJNYXRyaWtzIGtvcmVsYXNpIGFudGFyIHByZWRpa3RvciAoMjAyNCkuIn0NCnBsb3RfY29ycih0YjI0KQ0KYGBgDQo6Ojogey5pbmZvYm94fQ0KKipJbnRlcnByZXRhc2kuKiogUGFkYSAyMDI0LCBzZWx1cnVoIGtvcmVsYXNpIGFudGFyIHByZWRpa3RvciB0ZXJnb2xvbmcgcmVuZGFoIGhpbmdnYSBzZWRhbmcgKHxyfCA8IDAsNiksIG1lbmFuZGFrYW4gKip0aWRhayBhZGEgbWFzYWxhaCBtdWx0aWtvbGluZWFyaXRhcyoqLiBLb3JlbGFzaSB0ZXJ0aW5nZ2kgdGV0YXAgYW50YXJhIElQTSBkYW4ga2VtaXNraW5hbiAociA9IC0wLDU4KSwgeWFuZyB3YWphciBzZWNhcmEgc3Vic3RhbnNpLiBLb25zaXN0ZW5zaSBwb2xhIGtvcmVsYXNpIHBhZGEgMjAyMyBkYW4gMjAyNCAoS2VwYWRhdGFuLVJhc2lvIFB1c2tlc21hcyBrZWR1YW55YSBzZWtpdGFyIC0wLDI0KSBtZW1wZXJrdWF0IGR1Z2FhbiBiYWh3YSBrb3JlbGFzaSBla3N0cmVtIHBhZGEgMjAyMiBtZXJ1cGFrYW4gYW5vbWFsaSBha2liYXQgcGVuY2lsYW4gREtJIEpha2FydGEsIGJ1a2FuIGh1YnVuZ2FuIHlhbmcgc2VzdW5nZ3VobnlhLg0KOjo6DQoNCiMjIyBVamkgT3ZlcmRpc3BlcnNpICYgQXV0b2tvcmVsYXNpIFJlc2lkdWFsIChwZXIgVGFodW4pDQoNCmBgYHtyIGRpYWdub3N0aWt9DQpmX2NvdiA8LSBLYXN1cyB+IElQTSArIE1pc2tpbiArIFNhbml0YXNpICsgS2VwYWRhdGFuICsgUmFzaW9fUGttDQoNCmRpYWdub3N0aWsgPC0gZnVuY3Rpb24oZGYsIHRoKXsNCiAgbXAgPC0gZ2xtKGZfY292LCBmYW1pbHk9cG9pc3NvbigibG9nIiksIG9mZnNldD1sb2coUGVuZHVkdWspLCBkYXRhPWRmKQ0KICBkaXNwIDwtIHN1bShyZXNpZHVhbHMobXAsIHR5cGU9InBlYXJzb24iKV4yKS9tcCRkZi5yZXNpZHVhbA0KICBtbmIgPC0gZ2xtLm5iKHVwZGF0ZShmX2NvdiwgLn4uICsgb2Zmc2V0KGxvZyhQZW5kdWR1aykpKSwgZGF0YT1kZikNCiAgcmRmIDwtIGRmICU+JSBtdXRhdGUoLnI9cmVzaWR1YWxzKG1uYiwgdHlwZT0icGVhcnNvbiIpKSAlPiUgZHBseXI6OnNlbGVjdChQcm92aW5zaSwgLnIpDQogIHBldGEgPC0gaW5kbyAlPiUgbGVmdF9qb2luKHJkZiwgYnk9IlByb3ZpbnNpIikNCiAgbWMgPC0gbW9yYW4ubWMocGV0YSQuciwgbHcsIG5zaW09OTk5LCB6ZXJvLnBvbGljeT1UUlVFKQ0KICBkYXRhLmZyYW1lKFRhaHVuPXRoLCBEaXNwZXJzaT1yb3VuZChkaXNwLDEpLA0KICAgICAgICAgICAgIE1vcmFuX3Jlc2lkdWFsPXJvdW5kKHVubmFtZShtYyRzdGF0aXN0aWMpLDMpLA0KICAgICAgICAgICAgIHBfdmFsdWU9cm91bmQobWMkcC52YWx1ZSwzKSwNCiAgICAgICAgICAgICBNb2RlbD1pZmVsc2UobWMkcC52YWx1ZTwwLjA1LCAiTW9kZWwgQ0FSIiwgIk5CIikpDQp9DQp0YWJlbF9kaWFnIDwtIHJiaW5kKGRpYWdub3N0aWsodGIyMiwyMDIyKSwgZGlhZ25vc3Rpayh0YjIzLDIwMjMpLCBkaWFnbm9zdGlrKHRiMjQsMjAyNCkpDQp0YWJlbF9kaWFnICU+JQ0KICBrYWJsZShjYXB0aW9uPSJUYWJlbCAzLiBVamkgb3ZlcmRpc3BlcnNpICYgYXV0b2tvcmVsYXNpIHJlc2lkdWFsIE5CIHBlciB0YWh1bi4iKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoPUZBTFNFLCBib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiaG92ZXIiKSkNCmBgYA0KDQpgYGB7ciBpbnRlcnAtZGlhZywgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQpuYl90aCAgPC0gdGFiZWxfZGlhZyRUYWh1blt0YWJlbF9kaWFnJE1vZGVsPT0iTkIiXQ0KY2FyX3RoIDwtIHRhYmVsX2RpYWckVGFodW5bdGFiZWxfZGlhZyRNb2RlbD09Ik1vZGVsIENBUiJdDQpkaXNwX3JuZyA8LSBzcHJpbnRmKCIlLjFmLSUuMWYiLCBtaW4odGFiZWxfZGlhZyREaXNwZXJzaSksIG1heCh0YWJlbF9kaWFnJERpc3BlcnNpKSkNCnRla3NfbmIgIDwtIGlmKGxlbmd0aChuYl90aCkpICBwYXN0ZTAoIlRhaHVuICIsIHBhc3RlKG5iX3RoLCBjb2xsYXBzZT0iLCAiKSwgIiAocmVzaWR1YWwgYWNhaywgcCA+IDAsMTApIGN1a3VwIGRpbW9kZWxrYW4gZGVuZ2FuICoqTmVnYXRpdmUgQmlub21pYWwqKi4gIikgZWxzZSAiIg0KdGVrc19jYXIgPC0gaWYobGVuZ3RoKGNhcl90aCkpIHBhc3RlMCgiVGFodW4gIiwgcGFzdGUoY2FyX3RoLCBjb2xsYXBzZT0iLCAiKSwgIiBtZW51bmp1a2thbiAqKmF1dG9rb3JlbGFzaSBzcGFzaWFsIHJlc2lkdWFsKiogKHAgPCAwLDEwKSBzZWhpbmdnYSBkaWxhbmp1dGthbiBrZSAqKk1vZGVsIENBUiAoUG9pc3NvbiBzcGFzaWFsKSoqLiAiKSBlbHNlICIiDQpjYXQoc3ByaW50ZigiKipJbnRlcnByZXRhc2kuKiogUmFzaW8gZGlzcGVyc2kgamF1aCBkaSBhdGFzIDEgKCVzKSBwYWRhIHNlbXVhIHRhaHVuIG1lbmVnYXNrYW4gYWRhbnlhICoqb3ZlcmRpc3BlcnNpKiosIHNlaGluZ2dhIFBvaXNzb24gc3RhbmRhciB0aWRhayBtZW1hZGFpIGRhbiBOZWdhdGl2ZSBCaW5vbWlhbCBtZW5qYWRpIG1vZGVsIHlhbmcgdGVwYXQuIFNlbGFuanV0bnlhLCB1amkgTW9yYW4ncyBJIHBhZGEgcmVzaWR1YWwgbWVuZW50dWthbiBrZWJ1dHVoYW4gbW9kZWwgc3Bhc2lhbDogJXMlc0xvZ2lrYSBiZXJiYXNpcyBidWt0aSBpbmkgbWVtYXN0aWthbiBwZW1pbGloYW4gbW9kZWwgZGlkYXNhcmthbiBwYWRhIGthcmFrdGVyaXN0aWsgZGF0YSwgYnVrYW4gYXN1bXNpLiIsDQogIGRpc3Bfcm5nLCB0ZWtzX25iLCB0ZWtzX2NhcikpDQpgYGANCg0KOjo6IHsuaW5mb2JveH0NCioqTG9naWthIHBlbWlsaWhhbiBtb2RlbC4qKiBSYXNpbyBkaXNwZXJzaSA+PiAxIHBhZGEga2V0aWdhIHRhaHVuIG1lbmVnYXNrYW4gcGVuZ2d1bmFhbg0KTmVnYXRpdmUgQmlub21pYWwgKGJ1a2FuIFBvaXNzb24pLiBVamkgTW9yYW4ncyBJIHJlc2lkdWFsIGtlbXVkaWFuIG1lbmVudHVrYW46IGJpbGEgcCA+IDAsMTAgKHRpZGFrIGFkYSBhdXRva29yZWxhc2kgcGFkYSByZXNpZHVhbCkgTkIgbWVtYWRhaTsgYmlsYSBwIDwgMCwxMCBkaWd1bmFrYW4gbW9kZWwgQ0FSIHNwYXNpYWwuDQpIYXNpbDogKioyMDIyIC0+IE5CKiogKHJlc2lkdWFsIGFjYWspLCAqKjIwMjMgJiAyMDI0IC0+IE1vZGVsIENBUioqIChyZXNpZHVhbCBiZXJhdXRva29yZWxhc2kpLg0KOjo6DQoNCiMjIyBNb2RlbCAyMDIyOiBOZWdhdGl2ZSBCaW5vbWlhbCB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMjIFJpbmdrYXNhbiAmIElSUg0KDQpgYGB7ciBuYi0yMDIyfQ0KbV9uYjIyIDwtIGdsbS5uYih1cGRhdGUoZl9jb3YsIC5+LiArIG9mZnNldChsb2coUGVuZHVkdWspKSksIGRhdGE9dGIyMikNCnN1bW1hcnkobV9uYjIyKQ0KaXJyMjIgPC0gZXhwKGNiaW5kKElSUj1jb2VmKG1fbmIyMiksIGNvbmZpbnQobV9uYjIyKSkpDQpyb3VuZChpcnIyMiw0KSAlPiUNCiAga2FibGUoY2FwdGlvbj0iVGFiZWwgNC4gSVJSICYgOTUlIENJIC0gTmVnYXRpdmUgQmlub21pYWwgMjAyMi4iKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoPUZBTFNFLCBib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiaG92ZXIiKSkNCmBgYA0KDQo6Ojogey5pbmZvYm94fQ0KKipJbnRlcnByZXRhc2kuKiogQmVyZGFzYXJrYW4gcGVtb2RlbGFuIE5lZ2F0aXZlIEJpbm9taWFsIHRhaHVuIDIwMjIsIGZha3RvciBzaWduaWZpa2FuIHlhbmcgbWVtZW5nYXJ1aGkgdmFyaWFibGUga2VqYWRpYW4gVEIgYWRhbGFoIEtlcGFkYXRhbiBQZW5kdWR1ayAoc2ViYWdhaSBmYWt0b3IgcGVtaWN1L3BlbmluZ2thdCBsYWp1IGtlamFkaWFuKSAgZGVuZ2FuIElSUj0gMSwwMDI7IENJIDEsMDAx4oCTMSwwMDMpIGRhbiBSYXNpbyBQdXNrZXNtYXMgKHNlYmFnYWkgZmFrdG9yIHBlbmdlbmRhbGkvcGVudXJ1biBsYWp1IGtlamFkaWFuKSBkZW5nYW4gSVJSPTAsNjQ0OyA5NSUgQ0kgMCw0NTbigJMwLDkxODIuIEhhc2lsIGluaSBtZW55YXJhbmthbiBiYWh3YSBpbnRlcnZlbnNpIGtlYmlqYWthbiBwZW1lcmludGFoIHNlYmFpa255YSBkaWZva3Vza2FuIHBhZGEgcGVtZXJhdGFhbiBzYXJhbmEga2VzZWhhdGFuIChQdXNrZXNtYXMpLCB0ZXJ1dGFtYSBkaSB3aWxheWFoLXdpbGF5YWggZGVuZ2FuIHRpbmdrYXQga2VwYWRhdGFuIHBlbmR1ZHVrIHlhbmcgdGluZ2dpLg0KOjo6DQo6Ojogey5jYWxsb3V0fQ0KKipJbnRlcnByZXRhc2kgSVJSLioqIElSUj1leHAoa29lZikuIElSUj4xID0ga2VuYWlrYW4gY292YXJpYXRlIGJlcmFzb3NpYXNpIGRlbmdhbiBrZW5haWthbg0KcmF0ZSBUQjsgSVJSPDEgPSBwZW51cnVuYW4uIFNpZ25pZmlrYW4gYmlsYSA5NSUgQ0kgdGlkYWsgbWVtdWF0IDEuDQo6OjoNCg0KIyMjIyBNdWx0aWtvbGluZWFyaXRhcyAoVklGKQ0KDQpgYGB7ciB2aWYtMjAyMn0NCnZpZjIyIDwtIGNhcjo6dmlmKG1fbmIyMikNCmRhdGEuZnJhbWUoVklGPXJvdW5kKHZpZjIyLDIpKSAlPiUNCiAga2FibGUoY2FwdGlvbj0iVGFiZWwgNS4gVklGIHByZWRpa3RvciAoMjAyMikuIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aD1GQUxTRSwgYm9vdHN0cmFwX29wdGlvbnM9Yygic3RyaXBlZCIsImhvdmVyIikpDQpgYGANCg0KYGBge3IgaW50ZXJwLXZpZiwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQp2bWF4IDwtIG1heCh2aWYyMik7IHZubSA8LSBuYW1lcyh2aWYyMilbd2hpY2gubWF4KHZpZjIyKV0NCnN0YXR1cyA8LSBpZih2bWF4PDUpICJzZWx1cnVobnlhIGRpIGJhd2FoIDUsIG1lbmFuZGFrYW4gKip0aWRhayBhZGEgbWFzYWxhaCBtdWx0aWtvbGluZWFyaXRhcyoqIiBlbHNlIGlmKHZtYXg8MTApICJ0ZXJ0aW5nZ2kgZGkga2lzYXJhbiA1LTEwLCBtZW5naW5kaWthc2lrYW4gKiptdWx0aWtvbGluZWFyaXRhcyBtb2RlcmF0IHlhbmcgcGVybHUgZGl3YXNwYWRhaSoqIiBlbHNlICJtZWxlYmloaSAxMCwgbWVuYW5kYWthbiAqKm11bHRpa29saW5lYXJpdGFzIHNlcml1cyoqIg0KY2F0KHNwcmludGYoIioqSW50ZXJwcmV0YXNpLioqIE5pbGFpIFZJRiAlcyAodGVydGluZ2dpIHBhZGEgJXMgPSAlLjJmKS4gRGVuZ2FuIGRlbWlraWFuLCBlc3RpbWFzaSBrb2VmaXNpZW4gbW9kZWwgZGFwYXQgZGlhbmdnYXAgJXMuIiwNCiAgc3RhdHVzLCB2bm0sIHZtYXgsIGlmZWxzZSh2bWF4PDUsInN0YWJpbCBkYW4gZGFwYXQgZGlpbnRlcnByZXRhc2lrYW4gZGVuZ2FuIGFtYW4iLCJkaXRhZnNpcmthbiBkZW5nYW4gaGF0aS1oYXRpIikpKQ0KYGBgDQoNCg0KDQojIyMgTW9kZWwgQ0FSIChQb2lzc29uIFNwYXNpYWwpOiAyMDIzICYgMjAyNCB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpLYXJlbmEgcmVzaWR1YWwgTkIgcGFkYSAyMDIzIGRhbiAyMDI0IG1lbnVuanVra2FuIGF1dG9rb3JlbGFzaSBzcGFzaWFsLCBkaWd1bmFrYW4gbW9kZWwNCioqQ0FSIChDb25kaXRpb25hbCBBdXRvcmVncmVzc2l2ZSkqKi4gUGFkYSBtb2RlbCBDQVIsIG92ZXJkaXNwZXJzaSB0aWRhayBkaXRhbmdhbmkgbWVsYWx1aSBwYXJhbWV0ZXIgZGlzcGVyc2kgKHNlcGVydGkgcGFkYSBOZWdhdGl2ZSBCaW5vbWlhbCksIG1lbGFpbmthbiBkaXNlcmFwIG9sZWggZWZlayBhY2FrIHNwYXNpYWwgZGFuIHRhayB0ZXJzdHJ1a3R1ci4gRm9ybXVsYXNpIExlcm91eCAoTGVyb3V4IGV0IGFsLiwgMjAwMCkgeWFuZyBkaWd1bmFrYW4gZGkgc2luaSBzZWNhcmEgZWtzcGxpc2l0IG1lbWlzYWhrYW4gcGFyYW1ldGVyIG92ZXJkaXNwZXJzaSBkYXJpIGtla3VhdGFuIGRlcGVuZGVuc2kgc3Bhc2lhbC4NCg0KYGBge3IgY2FyLXNldHVwfQ0KIyBtYXRyaWtzIGtldGV0YW5nZ2FhbiBiaW5lciAoZGlwYWthaSBrZWR1YSB0YWh1bikNClcgPC0gbmIybWF0KG5iX2ssIHN0eWxlPSJCIiwgemVyby5wb2xpY3k9VFJVRSkNClcgPC0gcG1heChXLCB0KFcpKQ0KDQpmaXRfY2FyIDwtIGZ1bmN0aW9uKGRmKXsNCiAgICNzZXQuc2VlZCgyNjA2KQ0KICBDQVJCYXllczo6Uy5DQVJsZXJvdXgoDQogICAgZm9ybXVsYSA9IHVwZGF0ZShmX2NvdiwgLn4uICsgb2Zmc2V0KGxvZyhQZW5kdWR1aykpKSwNCiAgICBmYW1pbHkgID0gInBvaXNzb24iLCBXID0gVywgZGF0YSA9IGRmLA0KICAgIGJ1cm5pbiA9IDIwMDAwLCBuLnNhbXBsZSA9IDEyMDAwMCwgdGhpbiA9IDEwLCB2ZXJib3NlID0gRkFMU0UpDQp9DQpyaW5na2FzX2NhciA8LSBmdW5jdGlvbihtLCB0aCl7DQogIHRhYiA8LSBleHAobSRzdW1tYXJ5LnJlc3VsdHNbLCBjKCJNZWFuIiwiMi41JSIsIjk3LjUlIildKQ0KICByb3VuZCh0YWIsMykgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUNCiAgICBrYWJsZShjYXB0aW9uPXBhc3RlMCgiUmF0ZSBSYXRpbyAoTW9kZWwgQ0FSKSAmIDk1JSBDSSAtICIsIHRoLCAiLiIpKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KfQ0KYGBgDQoNCiMjIyMgMjAyMw0KDQpgYGB7ciBjYXItMjAyM30NCm1fY2FyMjMgPC0gZml0X2Nhcih0YjIzKQ0KcmluZ2thc19jYXIobV9jYXIyMywgMjAyMykNCmBgYA0KOjo6IHsuaW5mb2JveH0NCioqSW50ZXJwcmV0YXNpICgyMDIzKS4qKiAgbmlsYWkgcGFyYW1ldGVyJFxyaG8kIGRhbiAkXHRhdV4yJHlhbmcgc2lnbmlmaWthbiBtZW5lZ2Fza2FuIGJhaHdhIGFzcGVrIHNwYXNpYWwgKGtvbnRla3Mgd2lsYXlhaCBkYW4gZWZlayBrZXRldGFuZ2dhYW4pIG1lbWVnYW5nIHBlcmFuYW4ga3J1c2lhbCwgc2VoaW5nZ2Egc3RyYXRlZ2kgcGVuYW5nYW5hbiBtYXNhbGFoIGluaSB3YWppYiBkaXJhbmNhbmcgc2VjYXJhIHJlZ2lvbmFsIHRlcmludGVncmFzaSwgYnVrYW4gaGFueWEgZm9rdXMgcGVyIGRhZXJhaCBzZWNhcmEgdGVyaXNvbGFzaQ0KOjo6DQoNCiMjIyMgMjAyNA0KDQpgYGB7ciBjYXItMjAyNH0NCm1fY2FyMjQgPC0gZml0X2Nhcih0YjI0KQ0KcmluZ2thc19jYXIobV9jYXIyNCwgMjAyNCkNCmBgYA0KOjo6IHsuaW5mb2JveH0NCioqSW50ZXJwcmV0YXNpICgyMDI0KS4qKiBIYXNpbCBwZW1vZGVsYW4gQ0FSIHRhaHVuIDIwMjQgbWVudW5qdWtrYW4ga29uc2lzdGVuc2kgZGVuZ2FuIHBvbGEgdGFodW4gc2ViZWx1bW55YSAoMjAyMyksIGRpIG1hbmEgSVBNIG1lbmphZGkgc2F0dS1zYXR1bnlhIGZha3RvciBzdHJ1a3R1cmFsIHlhbmcgc2VjYXJhIHNpZ25pZmlrYW4gbWFtcHUgbWVuZWthbiBsYWp1IGtlamFkaWFuLiBTZWxhaW4gaXR1LCBiZXJ0YWhhbm55YSBuaWxhaSBwYXJhbWV0ZXIkXHJobyQgZGFuICRcdGF1XjIkeWFuZyBzaWduaWZpa2FuIG1lbmVnYXNrYW4gYmFod2EgYXNwZWsgc3Bhc2lhbCAoa29udGVrcyB3aWxheWFoIGRhbiBlZmVrIGtldGV0YW5nZ2FhbikgbWVtZWdhbmcgcGVyYW5hbiBrcnVzaWFsLCBzZWhpbmdnYSBzdHJhdGVnaSBwZW5hbmdhbmFuIG1hc2FsYWggaW5pIHdhamliIGRpcmFuY2FuZyBzZWNhcmEgcmVnaW9uYWwgdGVyaW50ZWdyYXNpLCBidWthbiBoYW55YSBmb2t1cyBwZXIgZGFlcmFoIHNlY2FyYSB0ZXJpc29sYXNpDQo6OjoNCg0KIyBQZW1iYWhhc2FuIHsjcGVtYmFoYXNhbn0NCg0KIyMgVGVtdWFuIFV0YW1hIGRhbiBNYWtuYW55YQ0KDQpQZW5lbGl0aWFuIGluaSBtZW51bmp1a2thbiBiYWh3YSBhbmdrYSBrZWphZGlhbiB0dWJlcmt1bG9zaXMgZGkgSW5kb25lc2lhIG1lbmluZ2thdCBzZXBhbmphbmcNCjIwMjItMjAyNCwgZGVuZ2FuIHRvdGFsIGthc3VzIHRlcm5vdGlmaWthc2kgbmFpayBkYXJpIDcyNC4zMDkgbWVuamFkaSA4NDIuMzgzIGRhbiByYXRhLXJhdGENCippbmNpZGVuY2UgcmF0ZSogKElSKSBhbnRhcnByb3ZpbnNpIGRhcmkgMjQ1LDMgbWVuamFkaSAyODYsMyBwZXIgMTAwLjAwMCBwZW5kdWR1ay4NCkFuYWxpc2lzIFNJUiBtZW1qZWxhc2thbiBiYWh3YSBiZWJhbg0KdGlkYWsgbWVyYXRhOiBwYWRhIDIwMjIgc2ViYW55YWsgc2VtYmlsYW4gcHJvdmluc2kgbWVtaWxpa2kgcmlzaWtvIGRpIGF0YXMgcmF0YS1yYXRhIG5hc2lvbmFsLA0KdGVydGluZ2dpIGRpIERLSSBKYWthcnRhIChTSVI9MSw4MyksIEdvcm9udGFsbyAoMSw1MSksIGRhbiBKYXdhIEJhcmF0ICgxLDQ0KS4NCg0KSW5kZWtzIE1vcmFuJ3MgSSBnbG9iYWwgeWFuZyBwb3NpdGlmIGRhbiBzaWduaWZpa2FuIHBhZGEga2V0aWdhIHRhaHVuIChJPTAsMjMzLTAsMjczOyBwPDAsMDUpDQptZW5lZ2Fza2FuIGFkYW55YSBhdXRva29yZWxhc2kgc3Bhc2lhbDogcHJvdmluc2kgZGVuZ2FuIElSIHRpbmdnaSBjZW5kZXJ1bmcgYmVyZGVrYXRhbiBzZWNhcmENCmdlb2dyYWZpcywgbWVtYmVudHVrIHBlbmdlbG9tcG9rYW4geWFuZyB0aWRhayBhY2FrLiBLZWJlcmFkYWFuIGF1dG9rb3JlbGFzaSBpbmkga29uc2lzdGVuDQpzZXBhbmphbmcgcGVyaW9kZSBwZW5nYW1hdGFuLg0KDQojIyBQZXJnZXNlcmFuIFNwYXNpYWwgS2VqYWRpYW4gVEIgZGFyaSBCYXJhdCBrZSBUaW11cg0KDQpUZW11YW4gcGFsaW5nIG1lbm9uam9sIGRhcmkgcGVuZWxpdGlhbiBpbmkgYWRhbGFoICoqcGVyZ2VzZXJhbiBsb2thc2kgcHVzYXQga2VqYWRpYW4gVEIqKi4NCk1lc2tpcHVuIGF1dG9rb3JlbGFzaSBzcGFzaWFsIGdsb2JhbCBrb25zaXN0ZW4gc2lnbmlmaWthbiwgYW5hbGlzaXMga2xhc3RlciBsb2thbCAoTElTQSkgZGFuDQpob3RzcG90IChHZXRpcy1PcmQgR2lcKikgbWVudW5qdWtrYW4gYmFod2EgKmxva2FzaSoga2xhc3RlciBiZXJwaW5kYWggc2VpcmluZyB3YWt0dS4gUGFkYQ0KMjAyMiwgaG90c3BvdCAoa2xhc3RlciBIaWdoLUhpZ2gpIHRlcmtvbnNlbnRyYXNpIGRpIFB1bGF1IEphd2EgYmFnaWFuIGJhcmF0LCBkZW5nYW4gSmF3YQ0KYmFnaWFuIHRpbXVyIHNlYmFnYWkgY29sZHNwb3QuIE5hbXVuIHBhZGEgMjAyMywgaG90c3BvdCBiZXJnZXNlciBrZSBJbmRvbmVzaWEgYmFnaWFuIHRpbXVyLA0KdGVydXRhbWEgUGFwdWEgZGFuIFBhcHVhIEJhcmF0IChIb3RzcG90IDk1JSksIHNlbWVudGFyYSBKYXdhIGJlcnViYWggbWVuamFkaSBjb2xkc3BvdC4gUGFkYQ0KMjAyNCwgaG90c3BvdCBQYXB1YSBtZW5ndWF0IGhpbmdnYSB0aW5na2F0IHRlcnRpbmdnaSAoSG90c3BvdCA5OSUpIGRhbiBtZWx1YXMga2Ugd2lsYXlhaA0Kc2VraXRhcm55YS4gUGVyZ2VzZXJhbiBpbmkgc2VqYWxhbiBkZW5nYW4gcGVycGluZGFoYW4gcHJvdmluc2kgYmVyLUlSIHRlcnRpbmdnaSBkYXJpIERLSQ0KSmFrYXJ0YSAoMjAyMikga2UgUGFwdWEgKDIwMjMgZGFuIDIwMjQpLg0KDQojIyBEZXRlcm1pbmFuIEluc2lkZW5zIFRCDQoNClBlbWlsaWhhbiBtb2RlbCBkaWxha3VrYW4gZGVuZ2FuIG1lbGFrdWthbiBwZW5ndWppYW4gb3ZlcmRpc3BlcnNpIHVudHVrIG1lbmdvbmZpcm1hc2kgcGVuZ2d1bmFhbiByZWdyZXNpDQoqTmVnYXRpdmUgQmlub21pYWwqIChyYXNpbyBkaXNwZXJzaSBqYXVoIGRpIGF0YXMgMSBwYWRhIGtldGlnYSB0YWh1biksIGRhbiB1amkgYXV0b2tvcmVsYXNpDQpzcGFzaWFsIHJlc2lkdWFsIG1lbmVudHVrYW4ga2VidXR1aGFuIG1vZGVsIHNwYXNpYWwuIFBhZGEgMjAyMiByZXNpZHVhbCB0aWRhayBiZXJhdXRva29yZWxhc2kNCnNlaGluZ2dhIG1vZGVsIE5CIG1lbWFkYWksIHNlZGFuZ2thbiBwYWRhIDIwMjMgZGFuIDIwMjQgcmVzaWR1YWwgbWVudW5qdWtrYW4gYXV0b2tvcmVsYXNpIHNwYXNpYWwNCnNlaGluZ2dhIGRpZ3VuYWthbiBtb2RlbCBDQVIgKFBvaXNzb24gc3Bhc2lhbCwgZm9ybXVsYXNpIExlcm91eCkuDQoNClBhZGEgbW9kZWwgTmVnYXRpdmUgQmlub21pYWwgKE5CKSAyMDIyLCByYXNpbyBQdXNrZXNtYXMgYmVyYXNvc2lhc2kgc2lnbmlmaWthbiBkZW5nYW4gcGVudXJ1bmFuIGxhanUga2FzdXMgVEIuIEhhbCBpbmkgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIGtldGVyc2VkaWFuIGZhc2lsaXRhcyBrZXNlaGF0YW4gcHJpbWVyIHlhbmcgbWVtYWRhaSBiZXJiYW5kaW5nIGx1cnVzIGRlbmdhbiByZW5kYWhueWEgaW5zaWRlbnMgVEIuIFNlbWVudGFyYSBpdHUsIHBhZGEgbW9kZWwgQ0FSIDIwMjMsIHZhcmlhYmxlIElQTSwgc2FuaXRhc2kgZGFuIHJhc2lvIHB1c2tlc21hcyBtZXJ1cGFrYW4gdmFyaWFiZWwgeWFuZyBzaWduaWZpa2FuIG1lbmVrYW4gaW5zaWRlbnMgVEIuIE1vZGVsIENBUiAyMDI0LCBoYW55YSB2YXJpYWJlbCBJUE0geWFuZyBzaWduaWZpa2FuIG1lbmVrYW4gaW5zaWRlbnMgVEIuIEhhc2lsIGluaSBtZW51bmp1a2thbiBiYWh3YSBmYWt0b3Igc3RydWt0dXJhbCAoSVBNKSBkYW4ga2V0ZXJzZWRpYWFuIGZhc2lsaXRhcyBrZXNlaGF0YW4gKHJhc2lvIFB1c2tlc21hcykgbWVydXBha2FuIGRldGVybWluYW4gcGVudGluZyBkYWxhbSBtZW5nZW5kYWxpa2FuIGxhanUga2VqYWRpYW4gVEIgZGkgSW5kb25lc2lhLg0KDQoNCg0KOjo6IHsuY2FsbG91dH0NCioqQ2F0YXRhbiBkYXRhLioqIFZhcmlhYmVsIGNha3VwYW4gSmFtaW5hbiBLZXNlaGF0YW4gTmFzaW9uYWwgKEpLTikgdGlkYWsgZGltYXN1a2thbiBrZSBkYWxhbQ0KbW9kZWwga2FyZW5hIGRpdGVtdWthbiBpbmtvbnNpc3RlbnNpIGFudGFyYSBkYXRhIHBlc2VydGEgSktOIGRhbiBqdW1sYWggcGVuZHVkdWs6IHByb3BvcnNpDQpjYWt1cGFuIG1lbGViaWhpIDEwMCUgcGFkYSBiZWJlcmFwYSBwcm92aW5zaSAobWVuY2FwYWkgc2VraXRhciAzODclIGRpIFBhcHVhIHBhZGEgMjAyMy0yMDI0KS4NClNlbGFpbiBpdHUsIG5pbGFpIHJhc2lvIFB1c2tlc21hcyBES0kgSmFrYXJ0YSBwYWRhIDIwMjIgdGVyaWRlbnRpZmlrYXNpIHNlYmFnYWkgcGVuY2lsYW4geWFuZw0KbWVtZW5nYXJ1aGkgc3RydWt0dXIga29yZWxhc2kgcGFkYSB0YWh1biB0ZXJzZWJ1dCwgc2VoaW5nZ2EgZXN0aW1hc2kga29lZmlzaWVuIGtlcGFkYXRhbiBkYW4NCnJhc2lvIFB1c2tlc21hcyBwYWRhIG1vZGVsIDIwMjIgZGl0YWZzaXJrYW4gZGVuZ2FuIGhhdGktaGF0aS4NCjo6Og0KDQoNCiMgRGFmdGFyIFB1c3Rha2EgeyNwdXN0YWthfQ0KDQoxLiBBbnNlbGluLCBMLiAoMTk5NSkuIExvY2FsIEluZGljYXRvcnMgb2YgU3BhdGlhbCBBc3NvY2lhdGlvbuKAlExJU0EuIEdlb2dyYXBoaWNhbCBBbmFseXNpcywgMjcoMiksIDkz4oCTMTE1LiBodHRwczovL2RvaS5vcmcvMTAuMTExMS9qLjE1MzgtNDYzMi4xOTk1LnRiMDAzMzgueA0KMi4gQmxhbmdpYXJkbywgTS4sICYgQ2FtZWxldHRpLCBNLiAoMjAxNSkuIFNwYXRpYWwgYW5kIHNwYXRpby10ZW1wb3JhbCBCYXllc2lhbiBtb2RlbHMgd2l0aCBSLUlOTEEuIEpvaG4gV2lsZXkgJiBTb25zLiBodHRwczovL2RvaS5vcmcvMTAuMTAwMi85NzgxMTE4OTUwMjAzDQozLiBDYW1lcm9uLCBBLiBDLiwgJiBUcml2ZWRpLCBQLiBLLiAoMjAxMykuIFJlZ3Jlc3Npb24gYW5hbHlzaXMgb2YgY291bnQgZGF0YSAoMm5kIGVkLikuIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLiBodHRwczovL2RvaS5vcmcvMTAuMTAxNy9DQk85NzgxMTM5MDEzNTY3DQo0LiBGYXJraGFuLCBBLiwgUGFrYXNpLCBULiBULiwgU3VsaXN0eW8sIFMuLCBldCBhbC4gKDIwMjYpLiBTcGF0aW90ZW1wb3JhbCBlcGlkZW1pb2xvZ3kgYW5kIGFzc29jaWF0ZWQgcmlzayBmYWN0b3JzIG9mIHR1YmVyY3Vsb3NpcyBpbmNpZGVuY2UgYW5kIG1vcnRhbGl0eSBpbiBJbmRvbmVzaWEgMjAxN+KAkzIwMjI6IEEgbmF0aW9ud2lkZSBzcGFjZS10aW1lIGhpZXJhcmNoaWNhbCBhbmFseXNpcy4gUG9wdWxhdGlvbiBIZWFsdGggTWV0cmljcywgMjQsIEFydGlrZWwgMTIuIGh0dHBzOi8vZG9pLm9yZy8xMC4xMTg2L3MxMjk2My0wMjYtMDA0NTgtNQ0KNS4gSGlsYmUsIEouIE0uICgyMDExKS4gTmVnYXRpdmUgYmlub21pYWwgcmVncmVzc2lvbiAoMm5kIGVkLikuIENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLiBodHRwczovL2RvaS5vcmcvMTAuMTAxNy9DQk85NzgwNTExOTczNDIwDQo2LiBLdXRuZXIsIE0uIEguLCBOYWNodHNoZWltLCBDLiBKLiwgTmV0ZXIsIEouLCAmIExpLCBXLiAoMjAwNCkuIEFwcGxpZWQgbGluZWFyIHN0YXRpc3RpY2FsIG1vZGVscyAoNXRoIGVkLikuIE1jR3Jhdy1IaWxsIElyd2luLiBJU0JOOiA5NzgtMDA3MzEwODc0Mg0KNy4gTWlyYWhtYWRpemFkZWgsIEEuLCBIZWlyYW4sIEEuLCAmIERlbGFtLCBILiAoMjAyMikuIENvcnJlbGF0aW9uIGJldHdlZW4gaHVtYW4gZGV2ZWxvcG1lbnQgaW5kZXggYW5kIGl0cyBjb21wb25lbnRzIHdpdGggQ09WSUQtMTkgaW5kaWNlczogQSBnbG9iYWwgbGV2ZWwgZWNvbG9naWMgc3R1ZHkuIEJNQyBQdWJsaWMgSGVhbHRoLCAyMigxKSwgQXJ0aWtlbCAxNTQ5LiBodHRwczovL2RvaS5vcmcvMTAuMTE4Ni9zMTI4ODktMDIyLTEzOTU5LTENCjguIE11bmF5Y28sIEMuIFYuLCBNw7pqaWNhLCBPLiwgRGVsIEdyYW5hZG8sIE0uLCBCYXJjZWzDsywgQS4sICYgSmlhbmcsIFcuICgyMDE1KS4gU29jaWFsIGRldGVybWluYW50cyBhbmQgaW5lcXVhbGl0aWVzIGluIHR1YmVyY3Vsb3NpcyBpbmNpZGVuY2UgaW4gTGF0aW4gQW1lcmljYSBhbmQgdGhlIENhcmliYmVhbi4gUmV2aXN0YSBQYW5hbWVyaWNhbmEgZGUgU2FsdWQgUMO6YmxpY2EsIDM4KDMpLCAxNzfigJMxODUuIGh0dHBzOi8vZG9pLm9yZy8xMC4xNTkwL1MxMDIwLTQ5ODkyMDE1MDAwMzAwMDA1DQo5LiBPcmQsIEouIEsuLCAmIEdldGlzLCBBLiAoMTk5NSkuIExvY2FsIHNwYXRpYWwgYXV0b2NvcnJlbGF0aW9uIHN0YXRpc3RpY3M6IERpc3RyaWJ1dGlvbmFsIGlzc3VlcyBhbmQgYW4gYXBwbGljYXRpb24uIEdlb2dyYXBoaWNhbCBBbmFseXNpcywgMjcoNCksIDI4NuKAkzMwNi4gaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvai4xNTM4LTQ2MzIuMTk5NS50YjAwOTEyLngNCjEwLiBTcGVuY2UsIEQuIFAuLCBIb3RjaGtpc3MsIEouLCBXaWxsaWFtcywgQy4gUy4gRC4sICYgRGF2aWVzLCBQLiBELiBPLiAoMTk5MykuIFR1YmVyY3Vsb3NpcyBhbmQgcG92ZXJ0eS4gQk1KLCAzMDcoNjkwNyksIDc1OeKAkzc2MS4gaHR0cHM6Ly9kb2kub3JnLzEwLjExMzYvYm1qLjMwNy42OTA3Ljc1OQ0KMTEuIFdvcmxkIEhlYWx0aCBPcmdhbml6YXRpb24uICgyMDIzKS4gR2xvYmFsIHR1YmVyY3Vsb3NpcyByZXBvcnQgMjAyMy4gV29ybGQgSGVhbHRoIE9yZ2FuaXphdGlvbi4gaHR0cHM6Ly9pcmlzLndoby5pbnQvaGFuZGxlLzEwNjY1LzM3MzgyOA0KKg0KDQojIExhbXBpcmFuOiBLb250cmlidXNpIEFuZ2dvdGEgeyNrb250cmlidXNpfQ0KDQp8IEFuZ2dvdGEgfCBLb250cmlidXNpIHwNCnwtLS18LS0tfA0KfCBTaW50YSBTZXB0aSBQYW5nYXN0dXRpIHwgUGVuZ3VtcHVsYW4gRGF0YSBkYW4gUGVtYnVhdGFuIE1ha2FsYWggfA0KfCBXaW5hbGlhIEFnd2lsIHwgUGVtYnVhdGFuIGZpbGUgUm1kIGRhbiBBbmFsaXNpcyB8DQoNCi0tLQ0KDQo8ZGV0YWlscz48c3VtbWFyeT5JbmZvcm1hc2kgc2VzaSBSPC9zdW1tYXJ5Pg0KYGBge3Igc2VzaX0NCnNlc3Npb25JbmZvKCkNCmBgYA0KPC9kZXRhaWxzPg0K