Identitas Penulis:

Keterangan Informasi
Nama Sri Yuliana
NPM 140720250003
Program Studi Magister Statistika Terapan
Mata Kuliah Analisis Spasial


ABSTRAK

Tuberkulosis (TB) masih menjadi salah satu masalah kesehatan masyarakat di Provinsi Jawa Barat dengan jumlah kasus yang relatif tinggi. Penelitian ini bertujuan menganalisis faktor-faktor yang memengaruhi Incidence Rate (IR) TB tahun 2025 menggunakan pendekatan spasial Spatial Lag of X (SLX). Data yang digunakan mencakup 27 kabupaten/kota di Jawa Barat dengan variabel jumlah fasilitas kesehatan, persentase penduduk miskin, kepadatan penduduk, akses air minum layak, akses sanitasi layak, dan jumlah kasus HIV. Analisis dilakukan melalui statistik deskriptif, pemetaan spasial, uji autokorelasi spasial Moran’s I, regresi OLS, dan model SLX. Hasil menunjukkan bahwa model SLX memberikan kinerja yang lebih baik dibandingkan model OLS dengan nilai R² sebesar 0,6913 dan RMSE sebesar 123,49. Temuan ini mengindikasikan bahwa faktor-faktor yang memengaruhi kejadian TB tidak hanya berasal dari karakteristik wilayah itu sendiri, tetapi juga dipengaruhi oleh kondisi wilayah sekitarnya. Oleh karena itu, pendekatan spasial perlu dipertimbangkan dalam perencanaan program pengendalian TB di Jawa Barat.

Kata Kunci: Tuberkulosis, Incidence Rate, Analisis Spasial, Moran’s I, Spatial Lag of X (SLX), Jawa Barat.


1. Pendahuluan

1.1 Latar Belakang

Tuberkulosis (TB) merupakan salah satu penyakit menular yang masih menjadi permasalahan kesehatan masyarakat di dunia. Penyakit yang disebabkan oleh Mycobacterium tuberculosis ini menyebar melalui udara dan menjadi salah satu penyebab utama kematian akibat penyakit infeksi (WHO, 2025). Upaya pengendalian TB merupakan salah satu target dalam Sustainable Development Goals (SDGs), khususnya pada Tujuan ke-3 yaitu Kehidupan Sehat dan Sejahtera, dengan target 3.3 yang menargetkan pengakhiran epidemi TB pada tahun 2030. Hal ini menunjukkan bahwa penanggulangan TB bukan hanya prioritas nasional, tetapi juga bagian dari komitmen global yang harus didukung melalui upaya berbasis data dan wilayah. Indonesia termasuk negara dengan beban TB tertinggi di dunia dan menyumbang sekitar 10% dari total kasus TB global (WHO, 2025). Di Indonesia, jumlah kasus TB terus menunjukkan peningkatan. Berdasarkan Profil Kesehatan Indonesia 2024, jumlah kasus TB yang dilaporkan mencapai 856.420 kasus pada tahun 2024, meningkat dibandingkan tahun sebelumnya. Jawa Barat merupakan provinsi dengan jumlah kasus TB tertinggi di Indonesia, dengan 229.683 kasus pada tahun 2024 (Kementerian Kesehatan RI, 2025; Dinas Kesehatan Provinsi Jawa Barat, 2025).

Tingginya kasus TB dipengaruhi oleh berbagai faktor sosial, ekonomi, dan lingkungan. Beberapa penelitian menunjukkan bahwa kepadatan penduduk, tingkat kemiskinan, kualitas sanitasi, akses air minum layak, ketersediaan fasilitas kesehatan, serta kasus HIV berhubungan dengan kejadian TB (Sihaloho et al., 2021; Laoli et al., 2024; Handayani et al., 2024). Selain itu, karakteristik wilayah yang berbeda menyebabkan distribusi kasus TB tidak merata antar daerah.

Perbedaan distribusi kasus antarwilayah menunjukkan pentingnya pendekatan spasial dalam analisis epidemiologi. Analisis spasial memungkinkan identifikasi pola persebaran penyakit berdasarkan lokasi geografis sehingga dapat membantu menentukan wilayah prioritas pengendalian TB. Dalam penelitian ini, analisis dilakukan melalui pemetaan Incidence Rate (IR), pemodelan faktor-faktor yang berhubungan dengan tingkat penularan TB menggunakan regresi Ordinary Least Squares (OLS), serta pengujian efek ketergantungan spasial.

Model OLS konvensional mengasumsikan bahwa pengamatan di suatu wilayah bersifat independen dan tidak dipengaruhi oleh wilayah sekitarnya. Namun, penyakit menular seperti TB memiliki karakteristik bawaan berupa efek limpahan (spillover effect) akibat mobilitas penduduk lintas batas administratif. Oleh karena itu, jika terdapat ketergantungan spasial pada variabel penjelas, model Spatial Lag X (SLX) diterapkan untuk menghasilkan estimasi yang lebih akurat melalui pembobotan matriks ketetanggaan (spatial weight matrix). Hasil penelitian ini diharapkan dapat memberikan gambaran mengenai faktor lokal dan faktor lingkungan tetangga yang berhubungan dengan kejadian TB di Provinsi Jawa Barat sebagai dasar perencanaan program pengendalian berbasis wilayah.

1.2 Rumusan Masalah

  1. Bagaimana karakteristik dan distribusi spasial kasus TB di Jawa Barat?

  2. Bagaimana pola persebaran Incidence Rate TB?

  3. Bagaimana pengaruh faktor sosial-ekonomi dan kesehatan terhadap TB menggunakan OLS?

  4. Apakah terdapat efek spasial yang lebih baik dijelaskan dengan model SLX?

1.3 Tujuan Penelitian

  1. Mendeskripsikan karakteristik kasus TB di Jawa Barat.
  2. Memetakan distribusi Incidence Rate TB.
  3. Menganalisis faktor yang memengaruhi TB menggunakan OLS.
  4. Menguji dan membandingkan model OLS dan SLX.

2. Data dan Metode

2.1 Data Penelitian

Data yang digunakan merupakan data sekunder yang mencakup 27 kabupaten/kota di Provinsi Jawa Barat pada tahun 2025. Data atribut diperoleh dari Badan Pusat Statistik (BPS) Provinsi Jawa Barat serta Portal Open Data Jabar, sedangkan data spasial berupa batas administrasi kabupaten/kota dalam format shapefile (SHP) diperoleh dari Portal Open Data Jabar. Data spasial tersebut digunakan untuk membangun matriks pembobot spasial dan memvisualisasikan sebaran kasus Tuberkulosis (TB) antarwilayah. Variabel penelitian terdiri atas satu variabel respon yaitu IR Tuberkulosis (TB), enam variabel penjelas yang mencerminkan faktor sosial, ekonomi, dan kesehatan, serta jumlah penduduk yang digunakan sebagai dasar perhitungan Incidence Rate (IR). Definisi operasional variabel yang digunakan disajikan pada Tabel 1.

Tabel 1. Variabel Penelitian

Variabel Definisi Operasional Dasar Teori dan Empiris Arah Hubungan yang Diharapkan
IR Tuberkulosis (Y) Jumlah kasus TB per 100.000 penduduk pada setiap kabupaten/kota di Jawa Barat tahun 2025. Digunakan sebagai ukuran risiko kejadian TB yang memungkinkan perbandingan antarwilayah dengan jumlah penduduk berbeda. -
Fasilitas Kesehatan (X₁) Jumlah fasilitas kesehatan pada setiap kabupaten/kota. Akses terhadap pelayanan kesehatan berperan penting dalam penemuan kasus, diagnosis, dan pengobatan TB. Rahmawati et al. (2026) menunjukkan bahwa indikator infrastruktur kesehatan berupa jumlah dokter dan kepesertaan JKN berasosiasi dengan kasus TB yang terlaporkan. Dengan demikian, fasilitas kesehatan dipandang sebagai proksi kapasitas sistem kesehatan dalam pengendalian TB. Positif (+). Semakin banyak fasilitas kesehatan, semakin tinggi kemampuan penemuan dan pelaporan kasus TB (case detection).
Penduduk Miskin (X₂) Persentase penduduk miskin pada setiap kabupaten/kota. Faktor sosial ekonomi merupakan determinan utama TB. Studi spasial di Jawa menemukan bahwa kemiskinan termasuk faktor yang dianalisis bersama prevalensi TB. Selain itu, analisis nasional Indonesia menunjukkan bahwa faktor sosial ekonomi berasosiasi dengan variasi spasial kejadian TB. Oleh karena itu, wilayah dengan proporsi penduduk miskin yang lebih tinggi cenderung memiliki risiko TB yang lebih besar. Positif (+). Semakin tinggi proporsi penduduk miskin, semakin tinggi risiko kejadian TB akibat keterbatasan akses kesehatan, gizi, dan kondisi hunian yang kurang layak.
Kepadatan Penduduk (X₃) Jumlah penduduk per km² pada setiap kabupaten/kota. Putra et al. (2022) menemukan bahwa kepadatan rumah tangga berhubungan dengan prevalensi TB di Pulau Jawa. Rahmawati et al. (2026) juga menunjukkan bahwa kepadatan penduduk memiliki pengaruh positif terhadap kasus TB dan menghasilkan efek limpahan spasial (spatial spillover). Penelitian di Kabupaten Bekasi juga menunjukkan adanya hubungan spasial antara kepadatan penduduk dan persebaran kasus TB. Positif (+). Semakin padat suatu wilayah, semakin tinggi peluang kontak antarindividu sehingga meningkatkan risiko penularan TB.
Air Minum Layak (X₄) Persentase rumah tangga yang memiliki akses terhadap air minum layak. Rahmawati et al. (2026) menggunakan akses air minum sebagai salah satu indikator infrastruktur kesehatan dalam model spasial TB. Variabel ini dipertimbangkan sebagai indikator kualitas lingkungan dan kesehatan masyarakat yang dapat memengaruhi risiko penyakit menular. Negatif (-). Semakin tinggi akses air minum layak, semakin baik kondisi kesehatan lingkungan sehingga risiko TB cenderung menurun.
Sanitasi Layak (X₅) Persentase rumah tangga yang memiliki akses terhadap sanitasi layak. Rahmawati et al. (2026) memasukkan sanitasi sebagai indikator infrastruktur kesehatan. Selain itu, studi spasial TB di Jawa Barat menggunakan indikator sanitasi lingkungan sebagai faktor yang dianalisis bersama distribusi spasial TB. Sanitasi yang baik dapat mengurangi kerentanan masyarakat terhadap berbagai penyakit infeksi dan mencerminkan kualitas lingkungan yang lebih sehat. Negatif (-). Semakin tinggi cakupan sanitasi layak, semakin rendah risiko kejadian TB karena kualitas lingkungan yang lebih baik.
HIV (X₆) Jumlah kasus HIV pada setiap kabupaten/kota. HIV merupakan faktor risiko utama TB karena menyebabkan penurunan sistem imun sehingga meningkatkan risiko berkembangnya infeksi TB aktif. Kajian sistematis metode analisis spasial TB menunjukkan bahwa banyak penelitian telah menganalisis hubungan spasial antara TB dan HIV. Oleh karena itu, wilayah dengan jumlah kasus HIV yang lebih tinggi berpotensi memiliki beban TB yang lebih besar. Positif (+). Semakin tinggi jumlah kasus HIV, semakin tinggi risiko TB karena meningkatnya kerentanan terhadap infeksi oportunistik.
Jumlah Penduduk Jumlah penduduk pada setiap kabupaten/kota. Digunakan sebagai populasi berisiko (population at risk) dalam perhitungan incidence rate TB. Tidak dianalisis sebagai variabel prediktor.

Sumber Data: Badan Pusat Statistik Provinsi Jawa Barat dan Portal Open Data Jabar.

2.2 Metode Analisis

2.2.1 Analisis Deskriptif dan Incidance Rate

Analisis deskriptif dilakukan untuk memberikan gambaran umum mengenai distribusi kasus Tuberkulosis (TB) pada setiap kabupaten/kota di Provinsi Jawa Barat Tahun 2025. Incidance Rate sebagai ukuran epidemiologi digunakan untuk mengukur frekuensi kasus baru TB yang terjadi dalam populasi berisiko selama periode waktu tertentu di wilayah tertentu. Formula penghitungan IR dalam penelitian ini dengan per 100.000 penduduk dirumuskan sebagai berikut:

\[ IR_i = \frac{TB_i}{\text{Jumlah Penduduk}_i} \times 100.000 \]

Dengan:

\(IR_i\) : jumlah kasus TB pada kabupaten/kota i.

\({\text{Jumlah Penduduk}_i}\) : jumlah populasi di wilayah i.

2.2.3 Matrik Pembobot Spasial

nb <- poly2nb(
  jabar_tb,
  queen = TRUE
)

lw <- nb2listw(
  nb,
  style = "W",
  zero.policy = TRUE
)

Berdasarkan kriteria Queen Contiguity, dua wilayah spasial i dan j dinyatakan saling bertetangga jika keduanya berbagi batas wilayah bersama, baik berupa persinggungan garis (edge) maupun titik sudut (vertex). Secara matematis, elemen matriks ketetanggaan awal \(w_{ij}\) didefinisikan sebagai berikut:

\[ w_{ij} = \begin{cases} 1, & \text{jika wilayah } i \text{ dan } j \text{ berbagi batas garis atau titik}, \\ 0, & \text{jika wilayah } i \text{ dan } j \text{ tidak berbagi batas langsung atau } i=j. \end{cases} \] Dimana elemen pembobot spasial terstandardisasi baris \(w_{ij}\) dihitung dengan membagi setiap elemen biner dengan total jumlah tetangga pada baris tersebut. Transformasi ini mengubah interpretasi efek spasial menjadi nilai rata-rata spasial (spatial lag) dari karakteristik wilayah-wilayah tetangganya:

\[ W_{ij} = \frac{w_{ij}}{\sum_{j=1}^{n} w_{ij}} \]

2.2.3 Model OLS

Model OLS digunakan sebagai model baseline untuk mengestimasi hubungan linear global antara variabel independen dan Incidence Rate TB tanpa memperhitungkan aspek lokasi. Persamaan regresi linear berganda OLS dalam penelitian ini dirumuskan sebagai berikut:

\[Yi=β_0 +β_1 X_1i +β_2 X_{2i} +β_3 X_{3i} +β_4 X_{4i}+β_5 X_{5i} +β_6 X_{6i} +ε_i \] Dengan:

\(Y_i\) : Incidance Rate kasus TB

\(β_0\) : Konstanta (nilai parameter intercept).

\(β_1,…,β_6\) : Koefisien regresi masing-masing variabel independen lokal.

\(X\) : Variabel Prediktor

\(ε_i\) : galat yang diasumsikan berdistribusi normal

2.2.4 Spasial Lag X

Model Spatial Lag X (SLX) merupakan pengembangan dari model OLS konvensional dengan menambahkan variabel penjelas yang telah ditransformasikan menggunakan matriks pembobot spasial (spatial lag of exogenous variables). Model ini digunakan untuk menangkap efek limpahan (spillover effect), yaitu kondisi di mana variabel terikat (Y) di suatu wilayah tidak hanya dipengaruhi oleh karakteristik internal wilayah itu sendiri (X), melainkan juga dipengaruhi oleh karakteristik wilayah-wilayah tetangga yang berbatasan langsung (WX).

Secara matematis, persamaan model SLX untuk Incidence Rate kasus TB di 27 kabupaten/kota Provinsi Jawa Barat dirumuskan sebagai berikut:

\[ Y_i = \beta_0 + \sum_{k=1}^{6} \beta_k X_{ki} + \sum_{k=1}^{6} \gamma_k \sum_{j=1}^{n} W_{ij} X_{kj} + \varepsilon_i \]

Dengan:

\(Y_i\) : Incidence Rate TB pada wilayah ke-i.

\(X_{ki}\) : variabel independen lokal.

\(WX)_{ki}\): Variabel bebas yang telah diberi bobot spasial (Spasial Lag X).

\(β_k\) : Parameter koefisien regresi untuk variabel bebas lokal

\(\gamma_k\): Pengaruh tidak langsung (spillover effect) dari wilayah tetangga.

\(\epsilon_i\) : galat model.

3. Hasil dan Pembahasan

3.1 Analisis Deskriptif dan Peta IR

Tabel 2. Statistik Deskriptif

vars <- jabar_tb %>%
  st_drop_geometry() %>%
  dplyr::select(
    TB,
    incidence_rate_TB,
    faskes,
    penduduk_miskin,
    kepadatan,
    air_minum,
    sanitasi,
    hiv
  ) %>%
  mutate(across(everything(), as.numeric))

desc_table <- data.frame(
  Variabel = c(
    "TB",
    "Incidence Rate TB",
    "Faskes",
    "Penduduk Miskin",
    "Kepadatan",
    "Air Minum Layak",
    "Sanitasi Layak",
    "HIV"
  ),
  Mean = sapply(vars, mean, na.rm = TRUE),
  SD = sapply(vars, sd, na.rm = TRUE),
  Varians = sapply(vars, var, na.rm = TRUE),
  Min = sapply(vars, min, na.rm = TRUE),
  Max = sapply(vars, max, na.rm = TRUE)
)


knitr::kable( desc_table, digits = 4)
Variabel Mean SD Varians Min Max
TB TB 8347.7407 6046.3174 3.655795e+07 1024.0000 28134.000
incidence_rate_TB Incidence Rate TB 486.7945 226.4968 5.130079e+04 230.8394 1077.861
faskes Faskes 2185.3704 1387.9867 1.926507e+06 241.0000 5588.000
penduduk_miskin Penduduk Miskin 7.5956 2.4999 6.249300e+00 2.3100 11.020
kepadatan Kepadatan 3941.3333 4701.5895 2.210494e+07 387.0000 15300.000
air_minum Air Minum Layak 95.7793 4.5879 2.104910e+01 84.7900 100.000
sanitasi Sanitasi Layak 9.2563 6.5311 4.265500e+01 1.8700 22.830
hiv HIV 94.1852 100.4253 1.008523e+04 7.0000 389.000

Berdasarkan hasil statistik deskriptif, terlihat bahwa jumlah kasus Tuberkulosis (TB) di Jawa Barat memiliki nilai rata-rata sebesar 8.347,74 kasus dengan variasi yang cukup tinggi antar wilayah, yang ditunjukkan oleh standar deviasi sebesar 6.046,32. Sementara itu, incidence rate TB memiliki rata-rata 486,79 per 100.000 penduduk dengan rentang nilai yang cukup lebar, menunjukkan adanya ketimpangan beban penyakit antar kabupaten/kota.

Untuk variabel independen, kondisi sosial ekonomi dan kesehatan juga menunjukkan variasi antar wilayah. Variabel kepadatan penduduk memiliki sebaran yang paling tinggi dibanding variabel lain, sedangkan variabel seperti akses air minum layak relatif lebih homogen dengan nilai yang mendekati 100% di sebagian besar wilayah. Secara umum, hasil ini menunjukkan adanya heterogenitas kondisi antar wilayah di Jawa Barat, yang mengindikasikan potensi adanya perbedaan risiko Tuberkulosis antar daerah.

tm_shape(jabar_tb) +
  tm_polygons(
    "incidence_rate_TB",
    palette = "Reds",
    title = "Incidence Rate TB"
  ) +
  tm_text(
    text = "WADMKK",
    size = 0.5
  ) +
  tm_layout(
    legend.outside = TRUE
  )

Gambar 1. Visualisasi Peta Incidance Rate TB

Sebagian besar wilayah di Jawa Barat berada pada kategori incidence rate (IR) rendah hingga sedang (200–599 per 100.000 penduduk) yang tersebar di berbagai wilayah barat, selatan, dan timur. Sementara itu, wilayah dengan IR tinggi hingga sangat tinggi (>600 per 100.000 penduduk) cenderung membentuk pola terlokalisasi pada beberapa wilayah perkotaan yang padat penduduk. Hal ini menunjukkan adanya konsentrasi kasus TB pada wilayah dengan karakteristik urban dan kepadatan tinggi.

3.2 Uji Autokorelasi Spasial

Tabel 3. Hasil Uji Autokorelasi Spasial

var_list <- c( "incidence_rate_TB", "faskes", "penduduk_miskin", "kepadatan", "air_minum", "sanitasi", "hiv" )

nama_variabel <- c( "Incidence Rate (TB)", "Faskes", "Penduduk Miskin", "Kepadatan Penduduk", "Air Minum Layak", "Sanitasi Layak", "HIV" )

moran_summary <- data.frame( Variabel = nama_variabel, Moran_I = NA, Expectation = NA, Variance = NA, Z_score = NA, p_value = NA )

for(i in seq_along(var_list)) { x <- scale(jabar_tb[[var_list[i]]])[,1] 

moran_result <- moran.test( x, lw, zero.policy = TRUE ) 

moran_summary$Moran_I[i] <- moran_result$estimate[1] 

moran_summary$Expectation[i] <- moran_result$estimate[2] 

moran_summary$Variance[i] <- moran_result$estimate[3] 

moran_summary$Z_score[i] <- unname(moran_result$statistic) 

moran_summary$p_value[i] <- moran_result$p.value} 

knitr::kable( moran_summary, digits = 4)
Variabel Moran_I Expectation Variance Z_score p_value
Incidence Rate (TB) 0.0500 -0.0385 0.0187 0.6473 0.2587
Faskes -0.0392 -0.0385 0.0194 -0.0050 0.5020
Penduduk Miskin 0.5076 -0.0385 0.0201 3.8553 0.0001
Kepadatan Penduduk 0.2580 -0.0385 0.0191 2.1437 0.0160
Air Minum Layak 0.2847 -0.0385 0.0194 2.3232 0.0101
Sanitasi Layak 0.3514 -0.0385 0.0200 2.7573 0.0029
HIV 0.2562 -0.0385 0.0174 2.2316 0.0128

Berdasarkan hasil uji Moran’s I pada masing-masing variabel, ditemukan bahwa sebagian besar variabel independen menunjukkan adanya autokorelasi spasial yang signifikan. Variabel penduduk miskin, kepadatan penduduk, akses air minum layak, sanitasi layak, dan jumlah kasus HIV memiliki nilai Moran’s I positif dan signifikan (p < 0,05), yang menunjukkan adanya pola pengelompokan spasial (clustered) antar wilayah di Jawa Barat. Sebaliknya, variabel incidence rate Tuberkulosis dan jumlah fasilitas kesehatan (faskes) tidak menunjukkan autokorelasi spasial yang signifikan (p > 0,05), sehingga distribusinya cenderung acak secara spasial dan tidak membentuk pola pengelompokan yang jelas antar wilayah.

3.3 Model OLS

Hasil estimasi parameter menggunakan metode Ordinary Least Squares (OLS) disajikan pada Tabel 5 berikut:

Tabel 4. Hasil Estimasi Model OLS

ols_model <- lm(
  incidence_rate_TB ~
    faskes +
    penduduk_miskin +
    kepadatan +
    air_minum +
    sanitasi +
    hiv,
  data = jabar_tb
)

ols_coef <- summary(ols_model)$coefficients

ols_table <- data.frame(
  Variabel = rownames(ols_coef),
  Koefisien = ols_coef[, 1],
  Std_Error = ols_coef[, 2],
  t_value = ols_coef[, 3],
  p_value = ols_coef[, 4]
)

knitr::kable(
  ols_table,
  digits = 4)
Variabel Koefisien Std_Error t_value p_value
(Intercept) (Intercept) -177.6495 957.9636 -0.1854 0.8547
faskes faskes -0.0603 0.0431 -1.4002 0.1768
penduduk_miskin penduduk_miskin 14.6376 20.6729 0.7081 0.4871
kepadatan kepadatan 0.0211 0.0145 1.4580 0.1604
air_minum air_minum 5.4803 9.8547 0.5561 0.5843
sanitasi sanitasi 1.9850 8.4556 0.2348 0.8168
hiv hiv 0.6230 0.5724 1.0883 0.2894

Berdasarkan hasil OLS, variabel independen secara simultan berpengaruh signifikan terhadap incidence rate TB (p = 0,02078), namun secara parsial tidak ditemukan pengaruh yang signifikan (p > 0,05). Model mampu menjelaskan sekitar 49,55% variasi incidence rate (R² = 0,4955), dengan nilai Adjusted R² sebesar 0,3442. Secara umum, hasil ini menunjukkan bahwa model masih terbatas dalam menjelaskan variasi TB sehingga diperlukan pendekatan spasial untuk menangkap keterkaitan antar wilayah.

3.4 Diagnostik Model OLS

Tabel 5. Diagnostik Model OLS

Tabel 5. Diagnostik Model

jabar_tb$residual_ols <- residuals(ols_model)

# VIF
vif_values <- vif(ols_model)

# Uji diagnostik
shapiro_res <- shapiro.test(jabar_tb$residual_ols)
bp_res <- bptest(ols_model)
dw_res <- dwtest(ols_model)

moran_residual <- moran.test(
  jabar_tb$residual_ols,
  lw,
  zero.policy = TRUE
)

diagnostic_table <- data.frame(
  Uji = c(
    paste("VIF –", names(vif_values)),
    "Normalitas Residual (Shapiro-Wilk)",
    "Heteroskedastisitas (Breusch-Pagan)",
    "Autokorelasi (Durbin-Watson)",
    "Autokorelasi Spasial Residual (Moran's I)"
  ),
  Nilai = c(
    as.numeric(vif_values),
    shapiro_res$statistic,
    bp_res$statistic,
    dw_res$statistic,
    moran_residual$estimate[1]
  ),
  p_value = c(
    rep(NA, length(vif_values)),
    shapiro_res$p.value,
    bp_res$p.value,
    dw_res$p.value,
    moran_residual$p.value
  )
)

knitr::kable(
  diagnostic_table,
  digits = 4
)
Uji Nilai p_value
VIF – faskes 2.7618 NA
VIF – penduduk_miskin 2.0639 NA
VIF – kepadatan 3.5732 NA
VIF – air_minum 1.5797 NA
VIF – sanitasi 2.3568 NA
VIF – hiv 2.5539 NA
Normalitas Residual (Shapiro-Wilk) 0.9547 0.2787
Heteroskedastisitas (Breusch-Pagan) 8.4930 0.2042
Autokorelasi (Durbin-Watson) 3.0128 0.9971
Autokorelasi Spasial Residual (Moran’s I) 0.2573 0.0176

Hasil diagnostik model OLS menunjukkan bahwa seluruh asumsi klasik terpenuhi, yaitu tidak terdapat multikolinearitas, heteroskedastisitas, maupun autokorelasi residual secara temporal. Namun, uji Moran’s I pada residual menunjukkan adanya autokorelasi spasial yang signifikan (I = 0,2573; p = 0,0176), yang mengindikasikan bahwa residual masih memiliki pola ketergantungan antar wilayah. Temuan ini menunjukkan bahwa model OLS belum mampu menangkap efek spasial, sehingga diperlukan pendekatan model spasial seperti SLX untuk mengakomodasi keterkaitan antar wilayah.

3.5 Model SLX

Tabel 5. Hasil Estimasi Model SLX

jabar_tb$lag_faskes <- lag.listw(
  lw, jabar_tb$faskes,
  zero.policy = TRUE
)

jabar_tb$lag_penduduk_miskin <- lag.listw(
  lw, jabar_tb$penduduk_miskin,
  zero.policy = TRUE
)

jabar_tb$lag_kepadatan <- lag.listw(
  lw, jabar_tb$kepadatan,
  zero.policy = TRUE
)

jabar_tb$lag_air_minum <- lag.listw(
  lw, jabar_tb$air_minum,
  zero.policy = TRUE
)

jabar_tb$lag_sanitasi <- lag.listw(
  lw, jabar_tb$sanitasi,
  zero.policy = TRUE
)

jabar_tb$lag_hiv <- lag.listw(
  lw, jabar_tb$hiv,
  zero.policy = TRUE
)

slx_model <- lm(
  incidence_rate_TB ~
    faskes +
    penduduk_miskin +
    kepadatan +
    air_minum +
    sanitasi +
    hiv +
    lag_faskes +
    lag_penduduk_miskin +
    lag_kepadatan +
    lag_air_minum +
    lag_sanitasi +
    lag_hiv,
  data = jabar_tb
)

slx_coef <- summary(slx_model)$coefficients

slx_table <- data.frame(
  Variabel = c(
    "(Intercept)",
    "Faskes",
    "Penduduk Miskin",
    "Kepadatan Penduduk",
    "Air Minum Layak",
    "Sanitasi Layak",
    "HIV",
    "Lag Faskes",
    "Lag Penduduk Miskin",
    "Lag Kepadatan",
    "Lag Air Minum Layak",
    "Lag Sanitasi Layak",
    "Lag HIV"
  ),
  Koefisien = slx_coef[, 1],
  Std_Error = slx_coef[, 2],
  t_value = slx_coef[, 3],
  p_value = slx_coef[, 4]
)

knitr::kable(
  slx_table,
  digits = 4)
Variabel Koefisien Std_Error t_value p_value
(Intercept) (Intercept) 617.9421 2184.4884 0.2829 0.7814
faskes Faskes -0.0307 0.0512 -0.5992 0.5586
penduduk_miskin Penduduk Miskin -7.8117 29.5788 -0.2641 0.7956
kepadatan Kepadatan Penduduk 0.0228 0.0185 1.2328 0.2379
air_minum Air Minum Layak 8.6532 10.3198 0.8385 0.4158
sanitasi Sanitasi Layak 3.7075 9.7746 0.3793 0.7102
hiv HIV 0.6005 0.5896 1.0184 0.3258
lag_faskes Lag Faskes 0.0769 0.1117 0.6878 0.5028
lag_penduduk_miskin Lag Penduduk Miskin 32.5588 51.2840 0.6349 0.5357
lag_kepadatan Lag Kepadatan -0.0464 0.0446 -1.0391 0.3164
lag_air_minum Lag Air Minum Layak -15.1076 25.1085 -0.6017 0.5570
lag_sanitasi Lag Sanitasi Layak 9.2671 21.2031 0.4371 0.6687
lag_hiv Lag HIV 0.0116 1.1733 0.0099 0.9923

Hasil estimasi model SLX menunjukkan bahwa model secara simultan signifikan dalam menjelaskan variasi incidence rate Tuberkulosis (p = 0,04483). Nilai R² sebesar 0,6913 menunjukkan bahwa model mampu menjelaskan sekitar 69,13% variasi data, yang lebih tinggi dibandingkan model OLS. Namun demikian, secara parsial seluruh variabel baik variabel lokal maupun efek spasial (lag) tidak menunjukkan pengaruh yang signifikan (p > 0,05). Hal ini mengindikasikan bahwa pengaruh faktor risiko terhadap incidence rate TB tersebar secara spasial dan tidak terpusat pada satu variabel tertentu. Secara keseluruhan, model SLX menunjukkan adanya peningkatan kemampuan dalam menangkap variasi data dibandingkan OLS, sehingga mendukung adanya efek keterkaitan spasial antar wilayah dalam penyebaran Tuberkulosis.

3.6 Perbandingan Model

Tabel 6. Perbandingan Model

model_comparison <- data.frame(
  Model = c("OLS", "SLX"),
  
  AIC = round(
    c(
      AIC(ols_model),
      AIC(slx_model)
    ),
    2
  ),
  
  R_squared = round(
    c(
      summary(ols_model)$r.squared,
      summary(slx_model)$r.squared
    ),
    4
  ),
  
  LogLik = round(
    c(
      as.numeric(logLik(ols_model)),
      as.numeric(logLik(slx_model))
    ),
    2
  ),
  
  RMSE = round(
    c(
      sqrt(mean(ols_model$residuals^2)),
      sqrt(mean(slx_model$residuals^2))
    ),
    2
  )
)

comparison_table <- data.frame(
  Model = c("OLS", "SLX"),

  AIC = round(
    c(
      AIC(ols_model),
      AIC(slx_model)
    ),
    2
  ),

  R_squared = round(
    c(
      summary(ols_model)$r.squared,
      summary(slx_model)$r.squared
    ),
    4
  ),

  Log_Likelihood = round(
    c(
      as.numeric(logLik(ols_model)),
      as.numeric(logLik(slx_model))
    ),
    2
  ),

  RMSE = round(
    c(
      sqrt(mean(residuals(ols_model)^2)),
      sqrt(mean(residuals(slx_model)^2))
    ),
    2
  )
)

knitr::kable(
  comparison_table,
  digits = 4
)
Model AIC R_squared Log_Likelihood RMSE
OLS 365.96 0.4955 -174.98 157.87
SLX 364.69 0.6913 -168.35 123.49

Hasil perbandingan kinerja model menunjukkan bahwa model SLX memiliki performa yang lebih baik dibandingkan model OLS. Hal ini terlihat dari penurunan nilai AIC dan RMSE, serta peningkatan nilai R-squared dan log-likelihood. Peningkatan tersebut menunjukkan bahwa model SLX lebih mampu menjelaskan variasi incidence rate Tuberkulosis dengan mempertimbangkan efek spasial antar wilayah. Dengan demikian, model SLX lebih sesuai digunakan dalam analisis ini karena mampu menangkap keterkaitan spasial yang tidak dapat dijelaskan oleh model OLS.

3.7 Keterbatasan Penelitian

Penelitian ini memiliki beberapa keterbatasan yang perlu diperhatikan dalam interpretasi hasilnya: 1. Analisis dilakukan pada tingkat agregat kabupaten/kota, sehingga tidak mampu menangkap variasi dalam tingkat yang lebih mikro.

  1. Data bersifat cross-sectional, sehingga tidak dapat mencerminkan dinamika perubahan kasus TB dari waktu ke waktu.

  2. Jumlah variabel penjelas yang digunakan masih terbatas dan belum mencakup semua faktor risiko yang relevan.

  3. Model SLX yang digunakan belum mempertimbangkan ketergantungan temporal antar pengamatan.

4. Kesimpulan dan Saran

4.1 Kesimpulan

Berdasarkan hasil analisis yang telah dilakukan, dapat disimpulkan bahwa:

  1. Kasus TB di Jawa Barat menunjukkan variasi spasial yang tinggi antar kabupaten/kota, dengan distribusi Incidence Rate yang tidak merata.

  2. Sebagian besar variabel sosial-ekonomi dan kesehatan menunjukkan pola clustering spasial yang signifikan berdasarkan uji Moran’s I.

  3. Model OLS belum mampu menangkap efek spasial secara memadai, sebagaimana ditunjukkan oleh autokorelasi spasial pada residual model.

  4. Model SLX lebih baik dalam menjelaskan variasi Incidence Rate TB dibandingkan OLS, dengan peningkatan R² dari 0,4955 menjadi 0,6913.

  5. Terdapat indikasi kuat adanya spillover effect, yaitu kondisi sosial-ekonomi di suatu wilayah turut memengaruhi beban TB di wilayah tetangganya.

4.2 Saran

Berdasarkan temuan penelitian, beberapa saran dapat dirumuskan sebagai berikut:

  1. Intervensi dan program pengendalian TB perlu difokuskan secara prioritas pada wilayah dengan Incidence Rate tinggi dan kondisi sosial-ekonomi rendah.

  2. Penguatan program kolaborasi TB-HIV perlu ditingkatkan mengingat kasus HIV merupakan faktor risiko penting dalam penyebaran TB.

  3. Penelitian selanjutnya disarankan menggunakan data spasio-temporal agar dapat menangkap dinamika persebaran TB dari waktu ke waktu.

  4. Model spasial lanjutan, seperti Spatial Autoregressive (SAR) atau model Bayesian (BYM), dapat dipertimbangkan untuk analisis yang lebih komprehensif.

Daftar Pustaka

Alma, L. R., Olivionita, V., & Wardani, H. E. (2024). An ecological study of determinants of the incidence of tuberculosis in Malang Raya area. Preventia: The Indonesian Journal of Public Health, 9(1), 112–120. https://doi.org/10.17977/um044v9i12024p112-120

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

Atillah, C. N., Wulandari, R. A., & Kurniasari, F. (2023). Environmental factors and pulmonary tuberculosis cases in Bandung City. Jurnal Ilmiah Kesehatan Masyarakat, 15(4), 167–175. https://doi.org/10.52022/jikm.v15i4.566

Besag, J., York, J., & Mollié, A. (1991). Bayesian image restoration, with two applications in spatial statistics. Annals of the Institute of Statistical Mathematics, 43(1), 1–20. https://doi.org/10.1007/BF00116466

Bivand, R. S., Pebesma, E., & Gómez-Rubio, V. (2013). Applied spatial data analysis with R (2nd ed.). Springer.

Cliff, A. D., & Ord, J. K. (1981). Spatial processes: Models and applications. Pion.

Dinas Kesehatan Provinsi Jawa Barat. (2023). Profil kesehatan Provinsi Jawa Barat tahun 2022.

Dinas Kesehatan Provinsi Jawa Barat. (2024). Profil kesehatan Provinsi Jawa Barat tahun 2023.

Dinas Kesehatan Provinsi Jawa Barat. (2025). Profil kesehatan Provinsi Jawa Barat tahun 2024.

Dzakiyah, R. N., Karima, U. Q., Simanjorang, C., & Apriningsih. (2023). Determinan kejadian tuberkulosis paru pada usia dewasa. Jurnal Penelitian Kesehatan Suara Forikes.

Handayani, S., Musfirah, M., & Apriana, A. (2024). Determinants of pulmonary tuberculosis. Jurnal Ilmiah Kesehatan, 6(1), 45–54. https://doi.org/10.36590/jika.v6i1.374

Haq, A., Achmadi, U. F., & Susanna, D. (2020). Analisis spasial TB paru. Jurnal Ekologi Kesehatan, 18(3). https://doi.org/10.22435/jek.v3i18.80 Kementerian Kesehatan Republik Indonesia. (2025). Profil kesehatan Indonesia 2024.

Kristianingrum, E. N. (2024). Kepadatan penduduk dan TB paru (Skripsi). Universitas Duta Bangsa.

Laoli, H. A., Nazira, A., Faleria, I., Tarigan, B., & Girsang, V. I. (2024). Cases of pulmonary tuberculosis and population density. MIHHICo Conference Proceedings.

Montgomery, D. C., Peck, E. A., & Vining, G. G. (2021). Introduction to linear regression analysis (6th ed.). Wiley.

Nurdin, A., et al. (2025). Analisis faktor risiko TB. Jurnal Kesehatan Yamasi Makassar, 9(2), 1–9.

Rosady, D. S., Zulfa, N. R. A., & Pratama, S. B. (2024). Spatial analysis TB Bandung. Global Medical & Health Communication, 12(1). https://doi.org/10.29313/gmhc.v12i1.12410

Sasmita, S., Junaid, J., & Ainurafiq, A. (2017). Pola spasial TB paru. Jurnal Ilmiah Mahasiswa Kesehatan Masyarakat.

Sihaloho, E. D., et al. (2021). Pengaruh kemiskinan terhadap TB. Journal of Applied Business and Economic, 7(3). https://doi.org/10.30998/jabe.v7i3.6470

Suryani, F. T., & Ibad, M. (2022). Faktor kepadatan dan sanitasi terhadap TB. Jurnal Sosial Sains, 2(10). https://doi.org/10.36418/jurnalsosains.v2i10.468

Turner, R. D., et al. (2017). Tuberculosis infectiousness and host susceptibility. Journal of Infectious Diseases, 216. https://doi.org/10.1093/infdis/jix361

World Health Organization. (2025). Global tuberculosis report 2025. WHO.

LS0tDQp0aXRsZTogIkFuYWxpc2lzIFNwYXNpYWwgRmFrdG9yLUZha3RvciB5YW5nIE1lbWVuZ2FydWhpIEluY2lkZW5jZSBSYXRlIFR1YmVya3Vsb3NpcyBkaSBQcm92aW5zaSBKYXdhIEJhcmF0IFRhaHVuIDIwMjUgTWVuZ2d1bmFrYW4gTW9kZWwgU3BhdGlhbCBMYWcgb2YgWCAoU0xYKSINCg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmNzczogc3R5bGUuY3NzDQotLS0NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShzZikNCmxpYnJhcnkoc3BkZXApDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodG1hcCkNCmxpYnJhcnkoSU5MQSkNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShsbXRlc3QpDQp0bWFwX21vZGUoInBsb3QiKQ0KYGBgDQoNCg0KLS0tDQoNCioqSWRlbnRpdGFzIFBlbnVsaXM6KioNCg0KfCBLZXRlcmFuZ2FuIHwgSW5mb3JtYXNpIHwNCnwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS18DQp8IE5hbWEgfCBTcmkgWXVsaWFuYSB8DQp8IE5QTSB8IDE0MDcyMDI1MDAwMyB8DQp8IFByb2dyYW0gU3R1ZGkgfCBNYWdpc3RlciBTdGF0aXN0aWthIFRlcmFwYW4gfA0KfCBNYXRhIEt1bGlhaCB8IEFuYWxpc2lzIFNwYXNpYWwgfA0KDQotLS0NCg0KLS0tDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQojICoqQUJTVFJBSyoqDQo8L2Rpdj4NCg0KVHViZXJrdWxvc2lzIChUQikgbWFzaWggbWVuamFkaSBzYWxhaCBzYXR1IG1hc2FsYWgga2VzZWhhdGFuIG1hc3lhcmFrYXQgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBkZW5nYW4ganVtbGFoIGthc3VzIHlhbmcgcmVsYXRpZiB0aW5nZ2kuIFBlbmVsaXRpYW4gaW5pIGJlcnR1anVhbiBtZW5nYW5hbGlzaXMgZmFrdG9yLWZha3RvciB5YW5nIG1lbWVuZ2FydWhpIEluY2lkZW5jZSBSYXRlIChJUikgVEIgdGFodW4gMjAyNSBtZW5nZ3VuYWthbiBwZW5kZWthdGFuIHNwYXNpYWwgU3BhdGlhbCBMYWcgb2YgWCAoU0xYKS4gRGF0YSB5YW5nIGRpZ3VuYWthbiBtZW5jYWt1cCAyNyBrYWJ1cGF0ZW4va290YSBkaSBKYXdhIEJhcmF0IGRlbmdhbiB2YXJpYWJlbCBqdW1sYWggZmFzaWxpdGFzIGtlc2VoYXRhbiwgcGVyc2VudGFzZSBwZW5kdWR1ayBtaXNraW4sIGtlcGFkYXRhbiBwZW5kdWR1aywgYWtzZXMgYWlyIG1pbnVtIGxheWFrLCBha3NlcyBzYW5pdGFzaSBsYXlhaywgZGFuIGp1bWxhaCBrYXN1cyBISVYuIEFuYWxpc2lzIGRpbGFrdWthbiBtZWxhbHVpIHN0YXRpc3RpayBkZXNrcmlwdGlmLCBwZW1ldGFhbiBzcGFzaWFsLCB1amkgYXV0b2tvcmVsYXNpIHNwYXNpYWwgTW9yYW7igJlzIEksIHJlZ3Jlc2kgT0xTLCBkYW4gbW9kZWwgU0xYLiBIYXNpbCBtZW51bmp1a2thbiBiYWh3YSBtb2RlbCBTTFggbWVtYmVyaWthbiBraW5lcmphIHlhbmcgbGViaWggYmFpayBkaWJhbmRpbmdrYW4gbW9kZWwgT0xTIGRlbmdhbiBuaWxhaSBSwrIgc2ViZXNhciAwLDY5MTMgZGFuIFJNU0Ugc2ViZXNhciAxMjMsNDkuIFRlbXVhbiBpbmkgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIGZha3Rvci1mYWt0b3IgeWFuZyBtZW1lbmdhcnVoaSBrZWphZGlhbiBUQiB0aWRhayBoYW55YSBiZXJhc2FsIGRhcmkga2FyYWt0ZXJpc3RpayB3aWxheWFoIGl0dSBzZW5kaXJpLCB0ZXRhcGkganVnYSBkaXBlbmdhcnVoaSBvbGVoIGtvbmRpc2kgd2lsYXlhaCBzZWtpdGFybnlhLiBPbGVoIGthcmVuYSBpdHUsIHBlbmRla2F0YW4gc3Bhc2lhbCBwZXJsdSBkaXBlcnRpbWJhbmdrYW4gZGFsYW0gcGVyZW5jYW5hYW4gcHJvZ3JhbSBwZW5nZW5kYWxpYW4gVEIgZGkgSmF3YSBCYXJhdC4NCg0KKipLYXRhIEt1bmNpOioqIFR1YmVya3Vsb3NpcywgSW5jaWRlbmNlIFJhdGUsIEFuYWxpc2lzIFNwYXNpYWwsIE1vcmFuJ3MgSSwgU3BhdGlhbCBMYWcgb2YgWCAoU0xYKSwgSmF3YSBCYXJhdC4NCg0KDQotLS0NCg0KDQojIDEuIFBlbmRhaHVsdWFuDQojIyAxLjEgTGF0YXIgQmVsYWthbmcgDQoNClR1YmVya3Vsb3NpcyAoVEIpIG1lcnVwYWthbiBzYWxhaCBzYXR1IHBlbnlha2l0IG1lbnVsYXIgeWFuZyBtYXNpaCBtZW5qYWRpIHBlcm1hc2FsYWhhbiBrZXNlaGF0YW4gbWFzeWFyYWthdCBkaSBkdW5pYS4gUGVueWFraXQgeWFuZyBkaXNlYmFia2FuIG9sZWggTXljb2JhY3Rlcml1bSB0dWJlcmN1bG9zaXMgaW5pIG1lbnllYmFyIG1lbGFsdWkgdWRhcmEgZGFuIG1lbmphZGkgc2FsYWggc2F0dSBwZW55ZWJhYiB1dGFtYSBrZW1hdGlhbiBha2liYXQgcGVueWFraXQgaW5mZWtzaSAoV0hPLCAyMDI1KS4gVXBheWEgcGVuZ2VuZGFsaWFuIFRCIG1lcnVwYWthbiBzYWxhaCBzYXR1IHRhcmdldCBkYWxhbSBTdXN0YWluYWJsZSBEZXZlbG9wbWVudCBHb2FscyAoU0RHcyksIGtodXN1c255YSBwYWRhIFR1anVhbiBrZS0zIHlhaXR1IEtlaGlkdXBhbiBTZWhhdCBkYW4gU2VqYWh0ZXJhLCBkZW5nYW4gdGFyZ2V0IDMuMyB5YW5nIG1lbmFyZ2V0a2FuIHBlbmdha2hpcmFuIGVwaWRlbWkgVEIgcGFkYSB0YWh1biAyMDMwLiBIYWwgaW5pIG1lbnVuanVra2FuIGJhaHdhIHBlbmFuZ2d1bGFuZ2FuIFRCIGJ1a2FuIGhhbnlhIHByaW9yaXRhcyBuYXNpb25hbCwgdGV0YXBpIGp1Z2EgYmFnaWFuIGRhcmkga29taXRtZW4gZ2xvYmFsIHlhbmcgaGFydXMgZGlkdWt1bmcgbWVsYWx1aSB1cGF5YSBiZXJiYXNpcyBkYXRhIGRhbiB3aWxheWFoLiBJbmRvbmVzaWEgdGVybWFzdWsgbmVnYXJhIGRlbmdhbiBiZWJhbiBUQiB0ZXJ0aW5nZ2kgZGkgZHVuaWEgZGFuIG1lbnl1bWJhbmcgc2VraXRhciAxMCUgZGFyaSB0b3RhbCBrYXN1cyBUQiBnbG9iYWwgKFdITywgMjAyNSkuDQpEaSBJbmRvbmVzaWEsIGp1bWxhaCBrYXN1cyBUQiB0ZXJ1cyBtZW51bmp1a2thbiBwZW5pbmdrYXRhbi4gQmVyZGFzYXJrYW4gUHJvZmlsIEtlc2VoYXRhbiBJbmRvbmVzaWEgMjAyNCwganVtbGFoIGthc3VzIFRCIHlhbmcgZGlsYXBvcmthbiBtZW5jYXBhaSA4NTYuNDIwIGthc3VzIHBhZGEgdGFodW4gMjAyNCwgbWVuaW5na2F0IGRpYmFuZGluZ2thbiB0YWh1biBzZWJlbHVtbnlhLiBKYXdhIEJhcmF0IG1lcnVwYWthbiBwcm92aW5zaSBkZW5nYW4ganVtbGFoIGthc3VzIFRCIHRlcnRpbmdnaSBkaSBJbmRvbmVzaWEsIGRlbmdhbiAyMjkuNjgzIGthc3VzIHBhZGEgdGFodW4gMjAyNCAoS2VtZW50ZXJpYW4gS2VzZWhhdGFuIFJJLCAyMDI1OyBEaW5hcyBLZXNlaGF0YW4gUHJvdmluc2kgSmF3YSBCYXJhdCwgMjAyNSkuDQoNClRpbmdnaW55YSBrYXN1cyBUQiBkaXBlbmdhcnVoaSBvbGVoIGJlcmJhZ2FpIGZha3RvciBzb3NpYWwsIGVrb25vbWksIGRhbiBsaW5na3VuZ2FuLiBCZWJlcmFwYSBwZW5lbGl0aWFuIG1lbnVuanVra2FuIGJhaHdhIGtlcGFkYXRhbiBwZW5kdWR1aywgdGluZ2thdCBrZW1pc2tpbmFuLCBrdWFsaXRhcyBzYW5pdGFzaSwgYWtzZXMgYWlyIG1pbnVtIGxheWFrLCBrZXRlcnNlZGlhYW4gZmFzaWxpdGFzIGtlc2VoYXRhbiwgc2VydGEga2FzdXMgSElWIGJlcmh1YnVuZ2FuIGRlbmdhbiBrZWphZGlhbiBUQiAoU2loYWxvaG8gZXQgYWwuLCAyMDIxOyBMYW9saSBldCBhbC4sIDIwMjQ7IEhhbmRheWFuaSBldCBhbC4sIDIwMjQpLiBTZWxhaW4gaXR1LCBrYXJha3RlcmlzdGlrIHdpbGF5YWggeWFuZyBiZXJiZWRhIG1lbnllYmFia2FuIGRpc3RyaWJ1c2kga2FzdXMgVEIgdGlkYWsgbWVyYXRhIGFudGFyIGRhZXJhaC4NCg0KUGVyYmVkYWFuIGRpc3RyaWJ1c2kga2FzdXMgYW50YXJ3aWxheWFoIG1lbnVuanVra2FuIHBlbnRpbmdueWEgcGVuZGVrYXRhbiBzcGFzaWFsIGRhbGFtIGFuYWxpc2lzIGVwaWRlbWlvbG9naS4gQW5hbGlzaXMgc3Bhc2lhbCBtZW11bmdraW5rYW4gaWRlbnRpZmlrYXNpIHBvbGEgcGVyc2ViYXJhbiBwZW55YWtpdCBiZXJkYXNhcmthbiBsb2thc2kgZ2VvZ3JhZmlzIHNlaGluZ2dhIGRhcGF0IG1lbWJhbnR1IG1lbmVudHVrYW4gd2lsYXlhaCBwcmlvcml0YXMgcGVuZ2VuZGFsaWFuIFRCLiBEYWxhbSBwZW5lbGl0aWFuIGluaSwgYW5hbGlzaXMgZGlsYWt1a2FuIG1lbGFsdWkgcGVtZXRhYW4gSW5jaWRlbmNlIFJhdGUgKElSKSwgcGVtb2RlbGFuIGZha3Rvci1mYWt0b3IgeWFuZyBiZXJodWJ1bmdhbiBkZW5nYW4gdGluZ2thdCBwZW51bGFyYW4gVEIgbWVuZ2d1bmFrYW4gcmVncmVzaSBPcmRpbmFyeSBMZWFzdCBTcXVhcmVzIChPTFMpLCBzZXJ0YSBwZW5ndWppYW4gZWZlayBrZXRlcmdhbnR1bmdhbiBzcGFzaWFsLg0KDQpNb2RlbCBPTFMga29udmVuc2lvbmFsIG1lbmdhc3Vtc2lrYW4gYmFod2EgcGVuZ2FtYXRhbiBkaSBzdWF0dSB3aWxheWFoIGJlcnNpZmF0IGluZGVwZW5kZW4gZGFuIHRpZGFrIGRpcGVuZ2FydWhpIG9sZWggd2lsYXlhaCBzZWtpdGFybnlhLiBOYW11biwgcGVueWFraXQgbWVudWxhciBzZXBlcnRpIFRCIG1lbWlsaWtpIGthcmFrdGVyaXN0aWsgYmF3YWFuIGJlcnVwYSBlZmVrIGxpbXBhaGFuIChzcGlsbG92ZXIgZWZmZWN0KSBha2liYXQgbW9iaWxpdGFzIHBlbmR1ZHVrIGxpbnRhcyBiYXRhcyBhZG1pbmlzdHJhdGlmLiBPbGVoIGthcmVuYSBpdHUsIGppa2EgdGVyZGFwYXQga2V0ZXJnYW50dW5nYW4gc3Bhc2lhbCBwYWRhIHZhcmlhYmVsIHBlbmplbGFzLCBtb2RlbCBTcGF0aWFsIExhZyBYIChTTFgpIGRpdGVyYXBrYW4gdW50dWsgbWVuZ2hhc2lsa2FuIGVzdGltYXNpIHlhbmcgbGViaWggYWt1cmF0IG1lbGFsdWkgcGVtYm9ib3RhbiBtYXRyaWtzIGtldGV0YW5nZ2FhbiAoc3BhdGlhbCB3ZWlnaHQgbWF0cml4KS4gSGFzaWwgcGVuZWxpdGlhbiBpbmkgZGloYXJhcGthbiBkYXBhdCBtZW1iZXJpa2FuIGdhbWJhcmFuIG1lbmdlbmFpIGZha3RvciBsb2thbCBkYW4gZmFrdG9yIGxpbmdrdW5nYW4gdGV0YW5nZ2EgeWFuZyBiZXJodWJ1bmdhbiBkZW5nYW4ga2VqYWRpYW4gVEIgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBzZWJhZ2FpIGRhc2FyIHBlcmVuY2FuYWFuIHByb2dyYW0gcGVuZ2VuZGFsaWFuIGJlcmJhc2lzIHdpbGF5YWguDQoNCiMjIDEuMiBSdW11c2FuIE1hc2FsYWgNCg0KMSkgQmFnYWltYW5hIGthcmFrdGVyaXN0aWsgZGFuIGRpc3RyaWJ1c2kgc3Bhc2lhbCBrYXN1cyBUQiBkaSBKYXdhIEJhcmF0PyANCg0KMikgQmFnYWltYW5hIHBvbGEgcGVyc2ViYXJhbiBJbmNpZGVuY2UgUmF0ZSBUQj8gDQoNCjMpIEJhZ2FpbWFuYSBwZW5nYXJ1aCBmYWt0b3Igc29zaWFsLWVrb25vbWkgZGFuIGtlc2VoYXRhbiB0ZXJoYWRhcCBUQiBtZW5nZ3VuYWthbiBPTFM/IA0KNCkgQXBha2FoIHRlcmRhcGF0IGVmZWsgc3Bhc2lhbCB5YW5nIGxlYmloIGJhaWsgZGlqZWxhc2thbiBkZW5nYW4gbW9kZWwgU0xYPw0KDQoNCg0KIyMgMS4zIFR1anVhbiBQZW5lbGl0aWFuDQoNCjEpIE1lbmRlc2tyaXBzaWthbiBrYXJha3RlcmlzdGlrIGthc3VzIFRCIGRpIEphd2EgQmFyYXQuIA0KMikgTWVtZXRha2FuIGRpc3RyaWJ1c2kgSW5jaWRlbmNlIFJhdGUgVEIuIA0KMykgTWVuZ2FuYWxpc2lzIGZha3RvciB5YW5nIG1lbWVuZ2FydWhpIFRCIG1lbmdndW5ha2FuIE9MUy4gDQo0KSBNZW5ndWppIGRhbiBtZW1iYW5kaW5na2FuIG1vZGVsIE9MUyBkYW4gU0xYLg0KDQojIDIuIERhdGEgZGFuIE1ldG9kZSANCiMjIDIuMSBEYXRhIFBlbmVsaXRpYW4NCg0KRGF0YSB5YW5nIGRpZ3VuYWthbiBtZXJ1cGFrYW4gZGF0YSBzZWt1bmRlciB5YW5nIG1lbmNha3VwIDI3IGthYnVwYXRlbi9rb3RhIGRpIFByb3ZpbnNpIEphd2EgQmFyYXQgcGFkYSB0YWh1biAyMDI1LiBEYXRhIGF0cmlidXQgZGlwZXJvbGVoIGRhcmkgQmFkYW4gUHVzYXQgU3RhdGlzdGlrIChCUFMpIFByb3ZpbnNpIEphd2EgQmFyYXQgc2VydGEgUG9ydGFsIE9wZW4gRGF0YSBKYWJhciwgc2VkYW5na2FuIGRhdGEgc3Bhc2lhbCBiZXJ1cGEgYmF0YXMgYWRtaW5pc3RyYXNpIGthYnVwYXRlbi9rb3RhIGRhbGFtIGZvcm1hdCAqc2hhcGVmaWxlKiAoU0hQKSBkaXBlcm9sZWggZGFyaSBQb3J0YWwgT3BlbiBEYXRhIEphYmFyLiBEYXRhIHNwYXNpYWwgdGVyc2VidXQgZGlndW5ha2FuIHVudHVrIG1lbWJhbmd1biBtYXRyaWtzIHBlbWJvYm90IHNwYXNpYWwgZGFuIG1lbXZpc3VhbGlzYXNpa2FuIHNlYmFyYW4ga2FzdXMgVHViZXJrdWxvc2lzIChUQikgYW50YXJ3aWxheWFoLiBWYXJpYWJlbCBwZW5lbGl0aWFuIHRlcmRpcmkgYXRhcyBzYXR1IHZhcmlhYmVsIHJlc3BvbiB5YWl0dSBJUiBUdWJlcmt1bG9zaXMgKFRCKSwgZW5hbSB2YXJpYWJlbCBwZW5qZWxhcyB5YW5nIG1lbmNlcm1pbmthbiBmYWt0b3Igc29zaWFsLCBla29ub21pLCBkYW4ga2VzZWhhdGFuLCBzZXJ0YSBqdW1sYWggcGVuZHVkdWsgeWFuZyBkaWd1bmFrYW4gc2ViYWdhaSBkYXNhciBwZXJoaXR1bmdhbiAqSW5jaWRlbmNlIFJhdGUqIChJUikuIERlZmluaXNpIG9wZXJhc2lvbmFsIHZhcmlhYmVsIHlhbmcgZGlndW5ha2FuIGRpc2FqaWthbiBwYWRhIFRhYmVsIDEuDQoNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCnNldHdkKCJEOi9NQUdJU1RFUi9TRU1FU1RFUiAyIikNCg0KZGF0YSA8LSByZWFkX2V4Y2VsKA0KICAiZGF0YXNldCBUQi54bHN4IiwNCiAgc2hlZXQgPSAic3Bhc2lhbCINCikNCg0KZGF0YSA8LSBkYXRhICU+JQ0KICByZW5hbWUoDQogICAgcGVuZHVkdWtfbWlza2luID0gYHBlcnNlbnRhc2UgcGVuZHVkdWsgbWlza2luYCwNCiAgICBrZXBhZGF0YW4gPSBga2VwYWRhdGFuIHBlbmR1ZHVrYCwNCiAgICBhaXJfbWludW0gPSBgYWlyIG1pbnVtIGxheWFrYCwNCiAgICBzYW5pdGFzaSA9IGBzYW5pdGFzaSBsYXlha2AsDQogICAgaGl2ID0gYGp1bWxhaCBrYXN1cyBISVZgLA0KICAgIGp1bWxhaF9wZW5kdWR1ayA9IGBKdW1sYWggUGVuZHVkdWtgDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBUQiAgICAgICAgICAgICAgICA9IGFzLm51bWVyaWMoVEIpLA0KICAgIGZhc2tlcyAgICAgICAgICAgID0gYXMubnVtZXJpYyhmYXNrZXMpLA0KICAgIHBlbmR1ZHVrX21pc2tpbiAgID0gYXMubnVtZXJpYyhwZW5kdWR1a19taXNraW4pLA0KICAgIGtlcGFkYXRhbiAgICAgICAgID0gYXMubnVtZXJpYyhrZXBhZGF0YW4pLA0KICAgIGFpcl9taW51bSAgICAgICAgID0gYXMubnVtZXJpYyhhaXJfbWludW0pLA0KICAgIHNhbml0YXNpICAgICAgICAgID0gYXMubnVtZXJpYyhzYW5pdGFzaSksDQogICAgaGl2ICAgICAgICAgICAgICAgPSBhcy5udW1lcmljKGhpdiksDQogICAganVtbGFoX3BlbmR1ZHVrICAgPSBhcy5udW1lcmljKGp1bWxhaF9wZW5kdWR1ayksDQoNCmluY2lkZW5jZV9yYXRlX1RCID0NCiAgICAgIChUQiAvIGp1bWxhaF9wZW5kdWR1aykgKiAxMDAwMDANCiAgKQ0KDQpzZXR3ZCgiRDovQmF0YXMvQmF0YXMiKQ0KDQpqYWJhciA8LSBzdF9yZWFkKA0KICAiQmF0YXNfS2FidXBhdGVuX0phd2FfQmFyYXQuc2hwIiwNCiAgcXVpZXQgPSBUUlVFDQopDQoNCmRhdGEka2FiX2NsZWFuIDwtIGRhdGEkbmFtYV9rYWJ1cGF0ZW5fa290YSAlPiUNCiAgdG91cHBlcigpICU+JQ0KICBnc3ViKCJLQUJVUEFURU4gIiwgIiIsIC4pDQoNCmphYmFyJGthYl9jbGVhbiA8LSB0b3VwcGVyKGphYmFyJFdBRE1LSykNCg0KamFiYXJfdGIgPC0gbWVyZ2UoDQogIGphYmFyLA0KICBkYXRhLA0KICBieSA9ICJrYWJfY2xlYW4iDQopDQoNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCAxLioqIFZhcmlhYmVsIFBlbmVsaXRpYW4NCjwvZGl2Pg0KDQoNCnwgVmFyaWFiZWwgICAgICAgICAgICAgICAgICAgICB8IERlZmluaXNpIE9wZXJhc2lvbmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGFzYXIgVGVvcmkgZGFuIEVtcGlyaXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFyYWggSHVidW5nYW4geWFuZyBEaWhhcmFwa2FuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8ICoqSVIgVHViZXJrdWxvc2lzIChZKSoqICAgICAgfCBKdW1sYWgga2FzdXMgVEIgcGVyIDEwMC4wMDAgcGVuZHVkdWsgcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEgZGkgSmF3YSBCYXJhdCB0YWh1biAyMDI1LiB8IERpZ3VuYWthbiBzZWJhZ2FpIHVrdXJhbiByaXNpa28ga2VqYWRpYW4gVEIgeWFuZyBtZW11bmdraW5rYW4gcGVyYmFuZGluZ2FuIGFudGFyd2lsYXlhaCBkZW5nYW4ganVtbGFoIHBlbmR1ZHVrIGJlcmJlZGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipGYXNpbGl0YXMgS2VzZWhhdGFuIChY4oKBKSoqIHwgSnVtbGFoIGZhc2lsaXRhcyBrZXNlaGF0YW4gcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBa3NlcyB0ZXJoYWRhcCBwZWxheWFuYW4ga2VzZWhhdGFuIGJlcnBlcmFuIHBlbnRpbmcgZGFsYW0gcGVuZW11YW4ga2FzdXMsIGRpYWdub3NpcywgZGFuIHBlbmdvYmF0YW4gVEIuIFJhaG1hd2F0aSBldCBhbC4gKDIwMjYpIG1lbnVuanVra2FuIGJhaHdhIGluZGlrYXRvciBpbmZyYXN0cnVrdHVyIGtlc2VoYXRhbiBiZXJ1cGEganVtbGFoIGRva3RlciBkYW4ga2VwZXNlcnRhYW4gSktOIGJlcmFzb3NpYXNpIGRlbmdhbiBrYXN1cyBUQiB5YW5nIHRlcmxhcG9ya2FuLiBEZW5nYW4gZGVtaWtpYW4sIGZhc2lsaXRhcyBrZXNlaGF0YW4gZGlwYW5kYW5nIHNlYmFnYWkgcHJva3NpIGthcGFzaXRhcyBzaXN0ZW0ga2VzZWhhdGFuIGRhbGFtIHBlbmdlbmRhbGlhbiBUQi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKipQb3NpdGlmICgrKSoqLiBTZW1ha2luIGJhbnlhayBmYXNpbGl0YXMga2VzZWhhdGFuLCBzZW1ha2luIHRpbmdnaSBrZW1hbXB1YW4gcGVuZW11YW4gZGFuIHBlbGFwb3JhbiBrYXN1cyBUQiAoKmNhc2UgZGV0ZWN0aW9uKikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqUGVuZHVkdWsgTWlza2luIChY4oKCKSoqICAgICB8IFBlcnNlbnRhc2UgcGVuZHVkdWsgbWlza2luIHBhZGEgc2V0aWFwIGthYnVwYXRlbi9rb3RhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRmFrdG9yIHNvc2lhbCBla29ub21pIG1lcnVwYWthbiBkZXRlcm1pbmFuIHV0YW1hIFRCLiBTdHVkaSBzcGFzaWFsIGRpIEphd2EgbWVuZW11a2FuIGJhaHdhIGtlbWlza2luYW4gdGVybWFzdWsgZmFrdG9yIHlhbmcgZGlhbmFsaXNpcyBiZXJzYW1hIHByZXZhbGVuc2kgVEIuIFNlbGFpbiBpdHUsIGFuYWxpc2lzIG5hc2lvbmFsIEluZG9uZXNpYSBtZW51bmp1a2thbiBiYWh3YSBmYWt0b3Igc29zaWFsIGVrb25vbWkgYmVyYXNvc2lhc2kgZGVuZ2FuIHZhcmlhc2kgc3Bhc2lhbCBrZWphZGlhbiBUQi4gT2xlaCBrYXJlbmEgaXR1LCB3aWxheWFoIGRlbmdhbiBwcm9wb3JzaSBwZW5kdWR1ayBtaXNraW4geWFuZyBsZWJpaCB0aW5nZ2kgY2VuZGVydW5nIG1lbWlsaWtpIHJpc2lrbyBUQiB5YW5nIGxlYmloIGJlc2FyLiB8ICoqUG9zaXRpZiAoKykqKi4gU2VtYWtpbiB0aW5nZ2kgcHJvcG9yc2kgcGVuZHVkdWsgbWlza2luLCBzZW1ha2luIHRpbmdnaSByaXNpa28ga2VqYWRpYW4gVEIgYWtpYmF0IGtldGVyYmF0YXNhbiBha3NlcyBrZXNlaGF0YW4sIGdpemksIGRhbiBrb25kaXNpIGh1bmlhbiB5YW5nIGt1cmFuZyBsYXlhay4gfA0KfCAqKktlcGFkYXRhbiBQZW5kdWR1ayAoWOKCgykqKiAgfCBKdW1sYWggcGVuZHVkdWsgcGVyIGttwrIgcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQdXRyYSBldCBhbC4gKDIwMjIpIG1lbmVtdWthbiBiYWh3YSBrZXBhZGF0YW4gcnVtYWggdGFuZ2dhIGJlcmh1YnVuZ2FuIGRlbmdhbiBwcmV2YWxlbnNpIFRCIGRpIFB1bGF1IEphd2EuIFJhaG1hd2F0aSBldCBhbC4gKDIwMjYpIGp1Z2EgbWVudW5qdWtrYW4gYmFod2Ega2VwYWRhdGFuIHBlbmR1ZHVrIG1lbWlsaWtpIHBlbmdhcnVoIHBvc2l0aWYgdGVyaGFkYXAga2FzdXMgVEIgZGFuIG1lbmdoYXNpbGthbiBlZmVrIGxpbXBhaGFuIHNwYXNpYWwgKCpzcGF0aWFsIHNwaWxsb3ZlciopLiBQZW5lbGl0aWFuIGRpIEthYnVwYXRlbiBCZWthc2kganVnYSBtZW51bmp1a2thbiBhZGFueWEgaHVidW5nYW4gc3Bhc2lhbCBhbnRhcmEga2VwYWRhdGFuIHBlbmR1ZHVrIGRhbiBwZXJzZWJhcmFuIGthc3VzIFRCLiAgICAgIHwgKipQb3NpdGlmICgrKSoqLiBTZW1ha2luIHBhZGF0IHN1YXR1IHdpbGF5YWgsIHNlbWFraW4gdGluZ2dpIHBlbHVhbmcga29udGFrIGFudGFyaW5kaXZpZHUgc2VoaW5nZ2EgbWVuaW5na2F0a2FuIHJpc2lrbyBwZW51bGFyYW4gVEIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQWlyIE1pbnVtIExheWFrIChY4oKEKSoqICAgICB8IFBlcnNlbnRhc2UgcnVtYWggdGFuZ2dhIHlhbmcgbWVtaWxpa2kgYWtzZXMgdGVyaGFkYXAgYWlyIG1pbnVtIGxheWFrLiAgICAgICAgICAgICAgICAgICAgIHwgUmFobWF3YXRpIGV0IGFsLiAoMjAyNikgbWVuZ2d1bmFrYW4gYWtzZXMgYWlyIG1pbnVtIHNlYmFnYWkgc2FsYWggc2F0dSBpbmRpa2F0b3IgaW5mcmFzdHJ1a3R1ciBrZXNlaGF0YW4gZGFsYW0gbW9kZWwgc3Bhc2lhbCBUQi4gVmFyaWFiZWwgaW5pIGRpcGVydGltYmFuZ2thbiBzZWJhZ2FpIGluZGlrYXRvciBrdWFsaXRhcyBsaW5na3VuZ2FuIGRhbiBrZXNlaGF0YW4gbWFzeWFyYWthdCB5YW5nIGRhcGF0IG1lbWVuZ2FydWhpIHJpc2lrbyBwZW55YWtpdCBtZW51bGFyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICoqTmVnYXRpZiAoLSkqKi4gU2VtYWtpbiB0aW5nZ2kgYWtzZXMgYWlyIG1pbnVtIGxheWFrLCBzZW1ha2luIGJhaWsga29uZGlzaSBrZXNlaGF0YW4gbGluZ2t1bmdhbiBzZWhpbmdnYSByaXNpa28gVEIgY2VuZGVydW5nIG1lbnVydW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlNhbml0YXNpIExheWFrIChY4oKFKSoqICAgICAgfCBQZXJzZW50YXNlIHJ1bWFoIHRhbmdnYSB5YW5nIG1lbWlsaWtpIGFrc2VzIHRlcmhhZGFwIHNhbml0YXNpIGxheWFrLiAgICAgICAgICAgICAgICAgICAgICB8IFJhaG1hd2F0aSBldCBhbC4gKDIwMjYpIG1lbWFzdWtrYW4gc2FuaXRhc2kgc2ViYWdhaSBpbmRpa2F0b3IgaW5mcmFzdHJ1a3R1ciBrZXNlaGF0YW4uIFNlbGFpbiBpdHUsIHN0dWRpIHNwYXNpYWwgVEIgZGkgSmF3YSBCYXJhdCBtZW5nZ3VuYWthbiBpbmRpa2F0b3Igc2FuaXRhc2kgbGluZ2t1bmdhbiBzZWJhZ2FpIGZha3RvciB5YW5nIGRpYW5hbGlzaXMgYmVyc2FtYSBkaXN0cmlidXNpIHNwYXNpYWwgVEIuIFNhbml0YXNpIHlhbmcgYmFpayBkYXBhdCBtZW5ndXJhbmdpIGtlcmVudGFuYW4gbWFzeWFyYWthdCB0ZXJoYWRhcCBiZXJiYWdhaSBwZW55YWtpdCBpbmZla3NpIGRhbiBtZW5jZXJtaW5rYW4ga3VhbGl0YXMgbGluZ2t1bmdhbiB5YW5nIGxlYmloIHNlaGF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKk5lZ2F0aWYgKC0pKiouIFNlbWFraW4gdGluZ2dpIGNha3VwYW4gc2FuaXRhc2kgbGF5YWssIHNlbWFraW4gcmVuZGFoIHJpc2lrbyBrZWphZGlhbiBUQiBrYXJlbmEga3VhbGl0YXMgbGluZ2t1bmdhbiB5YW5nIGxlYmloIGJhaWsuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipISVYgKFjigoYpKiogICAgICAgICAgICAgICAgIHwgSnVtbGFoIGthc3VzIEhJViBwYWRhIHNldGlhcCBrYWJ1cGF0ZW4va290YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISVYgbWVydXBha2FuIGZha3RvciByaXNpa28gdXRhbWEgVEIga2FyZW5hIG1lbnllYmFia2FuIHBlbnVydW5hbiBzaXN0ZW0gaW11biBzZWhpbmdnYSBtZW5pbmdrYXRrYW4gcmlzaWtvIGJlcmtlbWJhbmdueWEgaW5mZWtzaSBUQiBha3RpZi4gS2FqaWFuIHNpc3RlbWF0aXMgbWV0b2RlIGFuYWxpc2lzIHNwYXNpYWwgVEIgbWVudW5qdWtrYW4gYmFod2EgYmFueWFrIHBlbmVsaXRpYW4gdGVsYWggbWVuZ2FuYWxpc2lzIGh1YnVuZ2FuIHNwYXNpYWwgYW50YXJhIFRCIGRhbiBISVYuIE9sZWgga2FyZW5hIGl0dSwgd2lsYXlhaCBkZW5nYW4ganVtbGFoIGthc3VzIEhJViB5YW5nIGxlYmloIHRpbmdnaSBiZXJwb3RlbnNpIG1lbWlsaWtpIGJlYmFuIFRCIHlhbmcgbGViaWggYmVzYXIuICAgICAgICAgICAgICAgICAgIHwgKipQb3NpdGlmICgrKSoqLiBTZW1ha2luIHRpbmdnaSBqdW1sYWgga2FzdXMgSElWLCBzZW1ha2luIHRpbmdnaSByaXNpa28gVEIga2FyZW5hIG1lbmluZ2thdG55YSBrZXJlbnRhbmFuIHRlcmhhZGFwIGluZmVrc2kgb3BvcnR1bmlzdGlrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqSnVtbGFoIFBlbmR1ZHVrKiogICAgICAgICAgfCBKdW1sYWggcGVuZHVkdWsgcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERpZ3VuYWthbiBzZWJhZ2FpIHBvcHVsYXNpIGJlcmlzaWtvICgqcG9wdWxhdGlvbiBhdCByaXNrKikgZGFsYW0gcGVyaGl0dW5nYW4gaW5jaWRlbmNlIHJhdGUgVEIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUaWRhayBkaWFuYWxpc2lzIHNlYmFnYWkgdmFyaWFiZWwgcHJlZGlrdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCg0KKipTdW1iZXIgRGF0YToqKiBCYWRhbiBQdXNhdCBTdGF0aXN0aWsgUHJvdmluc2kgSmF3YSBCYXJhdCBkYW4gUG9ydGFsIE9wZW4gRGF0YSBKYWJhci4NCg0KDQojIyAyLjIgTWV0b2RlIEFuYWxpc2lzDQojIyMgMi4yLjEgQW5hbGlzaXMgRGVza3JpcHRpZiBkYW4gSW5jaWRhbmNlIFJhdGUNCg0KQW5hbGlzaXMgZGVza3JpcHRpZiBkaWxha3VrYW4gdW50dWsgbWVtYmVyaWthbiBnYW1iYXJhbiB1bXVtIG1lbmdlbmFpIGRpc3RyaWJ1c2kga2FzdXMgVHViZXJrdWxvc2lzIChUQikgcGFkYSBzZXRpYXAga2FidXBhdGVuL2tvdGEgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBUYWh1biAyMDI1LiBJbmNpZGFuY2UgUmF0ZSBzZWJhZ2FpIHVrdXJhbiBlcGlkZW1pb2xvZ2kgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIGZyZWt1ZW5zaSBrYXN1cyBiYXJ1IFRCIHlhbmcgdGVyamFkaSBkYWxhbSBwb3B1bGFzaSBiZXJpc2lrbyBzZWxhbWEgcGVyaW9kZSB3YWt0dSB0ZXJ0ZW50dSBkaSB3aWxheWFoIHRlcnRlbnR1LiBGb3JtdWxhIHBlbmdoaXR1bmdhbiBJUiBkYWxhbSBwZW5lbGl0aWFuIGluaSBkZW5nYW4gcGVyIDEwMC4wMDAgcGVuZHVkdWsgZGlydW11c2thbiBzZWJhZ2FpIGJlcmlrdXQ6DQoNCiQkDQpJUl9pID0gXGZyYWN7VEJfaX17XHRleHR7SnVtbGFoIFBlbmR1ZHVrfV9pfSBcdGltZXMgMTAwLjAwMA0KJCQNCg0KDQpEZW5nYW46DQoNCiRJUl9pJAkJCTogIGp1bWxhaCBrYXN1cyBUQiBwYWRhIGthYnVwYXRlbi9rb3RhIGkuDQoNCiR7XHRleHR7SnVtbGFoIFBlbmR1ZHVrfV9pfSQJOiBqdW1sYWggcG9wdWxhc2kgZGkgd2lsYXlhaCBpLg0KDQoNCiMjIyAyLjIuMyBNYXRyaWsgUGVtYm9ib3QgU3Bhc2lhbA0KDQpgYGB7ciB9DQpuYiA8LSBwb2x5Mm5iKA0KICBqYWJhcl90YiwNCiAgcXVlZW4gPSBUUlVFDQopDQoNCmx3IDwtIG5iMmxpc3R3KA0KICBuYiwNCiAgc3R5bGUgPSAiVyIsDQogIHplcm8ucG9saWN5ID0gVFJVRQ0KKQ0KYGBgDQoNCkJlcmRhc2Fya2FuIGtyaXRlcmlhIFF1ZWVuIENvbnRpZ3VpdHksIGR1YSB3aWxheWFoIHNwYXNpYWwgaSBkYW4gaiBkaW55YXRha2FuIHNhbGluZyBiZXJ0ZXRhbmdnYSBqaWthIGtlZHVhbnlhIGJlcmJhZ2kgYmF0YXMgd2lsYXlhaCBiZXJzYW1hLCBiYWlrIGJlcnVwYSBwZXJzaW5nZ3VuZ2FuIGdhcmlzIChlZGdlKSBtYXVwdW4gdGl0aWsgc3VkdXQgKHZlcnRleCkuIFNlY2FyYSBtYXRlbWF0aXMsIGVsZW1lbiBtYXRyaWtzIGtldGV0YW5nZ2FhbiBhd2FsICR3X3tpan0kIGRpZGVmaW5pc2lrYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQokJA0Kd197aWp9ID0NClxiZWdpbntjYXNlc30NCjEsICYgXHRleHR7amlrYSB3aWxheWFoIH0gaSBcdGV4dHsgZGFuIH0gaiBcdGV4dHsgYmVyYmFnaSBiYXRhcyBnYXJpcyBhdGF1IHRpdGlrfSwgXFwNCjAsICYgXHRleHR7amlrYSB3aWxheWFoIH0gaSBcdGV4dHsgZGFuIH0gaiBcdGV4dHsgdGlkYWsgYmVyYmFnaSBiYXRhcyBsYW5nc3VuZyBhdGF1IH0gaT1qLg0KXGVuZHtjYXNlc30NCiQkDQpEaW1hbmEgZWxlbWVuIHBlbWJvYm90IHNwYXNpYWwgdGVyc3RhbmRhcmRpc2FzaSBiYXJpcyAkd197aWp9JCBkaWhpdHVuZyBkZW5nYW4gbWVtYmFnaSBzZXRpYXAgZWxlbWVuIGJpbmVyIGRlbmdhbiB0b3RhbCBqdW1sYWggdGV0YW5nZ2EgcGFkYSBiYXJpcyB0ZXJzZWJ1dC4gVHJhbnNmb3JtYXNpIGluaSBtZW5ndWJhaCBpbnRlcnByZXRhc2kgZWZlayBzcGFzaWFsIG1lbmphZGkgbmlsYWkgcmF0YS1yYXRhIHNwYXNpYWwgKHNwYXRpYWwgbGFnKSBkYXJpIGthcmFrdGVyaXN0aWsgd2lsYXlhaC13aWxheWFoIHRldGFuZ2dhbnlhOg0KDQokJA0KV197aWp9ID0gXGZyYWN7d197aWp9fXtcc3VtX3tqPTF9XntufSB3X3tpan19DQokJA0KCQ0KIyMjIDIuMi4zIE1vZGVsIE9MUw0KTW9kZWwgT0xTIGRpZ3VuYWthbiBzZWJhZ2FpIG1vZGVsIGJhc2VsaW5lIHVudHVrIG1lbmdlc3RpbWFzaSBodWJ1bmdhbiBsaW5lYXIgZ2xvYmFsIGFudGFyYSB2YXJpYWJlbCBpbmRlcGVuZGVuIGRhbiBJbmNpZGVuY2UgUmF0ZSBUQiB0YW5wYSBtZW1wZXJoaXR1bmdrYW4gYXNwZWsgbG9rYXNpLiBQZXJzYW1hYW4gcmVncmVzaSBsaW5lYXIgYmVyZ2FuZGEgT0xTIGRhbGFtIHBlbmVsaXRpYW4gaW5pIGRpcnVtdXNrYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQokJFlpPc6yXzAgK86yXzEgWF8xaSArzrJfMiBYX3syaX0gK86yXzMgWF97M2l9ICvOsl80IFhfezRpfSvOsl81IFhfezVpfSArzrJfNiBYX3s2aX0gK861X2kgJCQNCkRlbmdhbjoNCg0KJFlfaSQJOiBJbmNpZGFuY2UgUmF0ZSBrYXN1cyBUQiANCg0KJM6yXzAkCTogS29uc3RhbnRhIChuaWxhaSBwYXJhbWV0ZXIgaW50ZXJjZXB0KS4NCg0KJM6yXzEs4oCmLM6yXzYkIDogS29lZmlzaWVuIHJlZ3Jlc2kgbWFzaW5nLW1hc2luZyB2YXJpYWJlbCBpbmRlcGVuZGVuIGxva2FsLg0KDQokWCQJOiBWYXJpYWJlbCBQcmVkaWt0b3INCg0KJM61X2kkCTogZ2FsYXQgeWFuZyBkaWFzdW1zaWthbiBiZXJkaXN0cmlidXNpIG5vcm1hbA0KDQojIyMgMi4yLjQgU3Bhc2lhbCBMYWcgWA0KDQpNb2RlbCBTcGF0aWFsIExhZyBYIChTTFgpIG1lcnVwYWthbiBwZW5nZW1iYW5nYW4gZGFyaSBtb2RlbCBPTFMga29udmVuc2lvbmFsIGRlbmdhbiBtZW5hbWJhaGthbiB2YXJpYWJlbCBwZW5qZWxhcyB5YW5nIHRlbGFoIGRpdHJhbnNmb3JtYXNpa2FuIG1lbmdndW5ha2FuIG1hdHJpa3MgcGVtYm9ib3Qgc3Bhc2lhbCAoc3BhdGlhbCBsYWcgb2YgZXhvZ2Vub3VzIHZhcmlhYmxlcykuIE1vZGVsIGluaSBkaWd1bmFrYW4gdW50dWsgbWVuYW5na2FwIGVmZWsgbGltcGFoYW4gKHNwaWxsb3ZlciBlZmZlY3QpLCB5YWl0dSBrb25kaXNpIGRpIG1hbmEgdmFyaWFiZWwgdGVyaWthdCAoWSkgZGkgc3VhdHUgd2lsYXlhaCB0aWRhayBoYW55YSBkaXBlbmdhcnVoaSBvbGVoIGthcmFrdGVyaXN0aWsgaW50ZXJuYWwgd2lsYXlhaCBpdHUgc2VuZGlyaSAoWCksIG1lbGFpbmthbiBqdWdhIGRpcGVuZ2FydWhpIG9sZWgga2FyYWt0ZXJpc3RpayB3aWxheWFoLXdpbGF5YWggdGV0YW5nZ2EgeWFuZyBiZXJiYXRhc2FuIGxhbmdzdW5nIChXWCkuDQoNClNlY2FyYSBtYXRlbWF0aXMsIHBlcnNhbWFhbiBtb2RlbCBTTFggdW50dWsgSW5jaWRlbmNlIFJhdGUga2FzdXMgVEIgZGkgMjcga2FidXBhdGVuL2tvdGEgUHJvdmluc2kgSmF3YSBCYXJhdCBkaXJ1bXVza2FuIHNlYmFnYWkgYmVyaWt1dDoNCg0KJCQNCllfaSA9IFxiZXRhXzAgKw0KXHN1bV97az0xfV57Nn0gXGJldGFfayBYX3traX0gKw0KXHN1bV97az0xfV57Nn0gXGdhbW1hX2sgXHN1bV97aj0xfV57bn0gV197aWp9IFhfe2tqfQ0KKyBcdmFyZXBzaWxvbl9pDQokJA0KDQpEZW5nYW46DQoNCiRZX2kkCTogSW5jaWRlbmNlIFJhdGUgVEIgcGFkYSB3aWxheWFoIGtlLWkuDQoNCiRYX3traX0kCTogdmFyaWFiZWwgaW5kZXBlbmRlbiBsb2thbC4NCg0KJFdYKV97a2l9JDogVmFyaWFiZWwgYmViYXMgeWFuZyB0ZWxhaCBkaWJlcmkgYm9ib3Qgc3Bhc2lhbCAoU3Bhc2lhbCBMYWcgWCkuDQoNCiTOsl9rJAk6IFBhcmFtZXRlciBrb2VmaXNpZW4gcmVncmVzaSB1bnR1ayB2YXJpYWJlbCBiZWJhcyBsb2thbA0KDQokXGdhbW1hX2skOiBQZW5nYXJ1aCB0aWRhayBsYW5nc3VuZyAoc3BpbGxvdmVyIGVmZmVjdCkgZGFyaSB3aWxheWFoIHRldGFuZ2dhLiANCg0KJFxlcHNpbG9uX2kkCTogZ2FsYXQgbW9kZWwuDQoNCg0KIyAzLiBIYXNpbCBkYW4gUGVtYmFoYXNhbiANCiMjIDMuMSBBbmFsaXNpcyBEZXNrcmlwdGlmIGRhbiBQZXRhIElSDQoNCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqVGFiZWwgMi4qKiBTdGF0aXN0aWsgRGVza3JpcHRpZiANCjwvZGl2Pg0KDQoNCg0KYGBge3J9DQp2YXJzIDwtIGphYmFyX3RiICU+JQ0KICBzdF9kcm9wX2dlb21ldHJ5KCkgJT4lDQogIGRwbHlyOjpzZWxlY3QoDQogICAgVEIsDQogICAgaW5jaWRlbmNlX3JhdGVfVEIsDQogICAgZmFza2VzLA0KICAgIHBlbmR1ZHVrX21pc2tpbiwNCiAgICBrZXBhZGF0YW4sDQogICAgYWlyX21pbnVtLA0KICAgIHNhbml0YXNpLA0KICAgIGhpdg0KICApICU+JQ0KICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMubnVtZXJpYykpDQoNCmRlc2NfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFiZWwgPSBjKA0KICAgICJUQiIsDQogICAgIkluY2lkZW5jZSBSYXRlIFRCIiwNCiAgICAiRmFza2VzIiwNCiAgICAiUGVuZHVkdWsgTWlza2luIiwNCiAgICAiS2VwYWRhdGFuIiwNCiAgICAiQWlyIE1pbnVtIExheWFrIiwNCiAgICAiU2FuaXRhc2kgTGF5YWsiLA0KICAgICJISVYiDQogICksDQogIE1lYW4gPSBzYXBwbHkodmFycywgbWVhbiwgbmEucm0gPSBUUlVFKSwNCiAgU0QgPSBzYXBwbHkodmFycywgc2QsIG5hLnJtID0gVFJVRSksDQogIFZhcmlhbnMgPSBzYXBwbHkodmFycywgdmFyLCBuYS5ybSA9IFRSVUUpLA0KICBNaW4gPSBzYXBwbHkodmFycywgbWluLCBuYS5ybSA9IFRSVUUpLA0KICBNYXggPSBzYXBwbHkodmFycywgbWF4LCBuYS5ybSA9IFRSVUUpDQopDQoNCg0Ka25pdHI6OmthYmxlKCBkZXNjX3RhYmxlLCBkaWdpdHMgPSA0KQ0KYGBgDQoNCg0KQmVyZGFzYXJrYW4gaGFzaWwgc3RhdGlzdGlrIGRlc2tyaXB0aWYsIHRlcmxpaGF0IGJhaHdhIGp1bWxhaCBrYXN1cyBUdWJlcmt1bG9zaXMgKFRCKSBkaSBKYXdhIEJhcmF0IG1lbWlsaWtpIG5pbGFpIHJhdGEtcmF0YSBzZWJlc2FyIDguMzQ3LDc0IGthc3VzIGRlbmdhbiB2YXJpYXNpIHlhbmcgY3VrdXAgdGluZ2dpIGFudGFyIHdpbGF5YWgsIHlhbmcgZGl0dW5qdWtrYW4gb2xlaCBzdGFuZGFyIGRldmlhc2kgc2ViZXNhciA2LjA0NiwzMi4gU2VtZW50YXJhIGl0dSwgaW5jaWRlbmNlIHJhdGUgVEIgbWVtaWxpa2kgcmF0YS1yYXRhIDQ4Niw3OSBwZXIgMTAwLjAwMCBwZW5kdWR1ayBkZW5nYW4gcmVudGFuZyBuaWxhaSB5YW5nIGN1a3VwIGxlYmFyLCBtZW51bmp1a2thbiBhZGFueWEga2V0aW1wYW5nYW4gYmViYW4gcGVueWFraXQgYW50YXIga2FidXBhdGVuL2tvdGEuDQoNClVudHVrIHZhcmlhYmVsIGluZGVwZW5kZW4sIGtvbmRpc2kgc29zaWFsIGVrb25vbWkgZGFuIGtlc2VoYXRhbiBqdWdhIG1lbnVuanVra2FuIHZhcmlhc2kgYW50YXIgd2lsYXlhaC4gVmFyaWFiZWwga2VwYWRhdGFuIHBlbmR1ZHVrIG1lbWlsaWtpIHNlYmFyYW4geWFuZyBwYWxpbmcgdGluZ2dpIGRpYmFuZGluZyB2YXJpYWJlbCBsYWluLCBzZWRhbmdrYW4gdmFyaWFiZWwgc2VwZXJ0aSBha3NlcyBhaXIgbWludW0gbGF5YWsgcmVsYXRpZiBsZWJpaCBob21vZ2VuIGRlbmdhbiBuaWxhaSB5YW5nIG1lbmRla2F0aSAxMDAlIGRpIHNlYmFnaWFuIGJlc2FyIHdpbGF5YWguIFNlY2FyYSB1bXVtLCBoYXNpbCBpbmkgbWVudW5qdWtrYW4gYWRhbnlhIGhldGVyb2dlbml0YXMga29uZGlzaSBhbnRhciB3aWxheWFoIGRpIEphd2EgQmFyYXQsIHlhbmcgbWVuZ2luZGlrYXNpa2FuIHBvdGVuc2kgYWRhbnlhIHBlcmJlZGFhbiByaXNpa28gVHViZXJrdWxvc2lzIGFudGFyIGRhZXJhaC4NCg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQp0bV9zaGFwZShqYWJhcl90YikgKw0KICB0bV9wb2x5Z29ucygNCiAgICAiaW5jaWRlbmNlX3JhdGVfVEIiLA0KICAgIHBhbGV0dGUgPSAiUmVkcyIsDQogICAgdGl0bGUgPSAiSW5jaWRlbmNlIFJhdGUgVEIiDQogICkgKw0KICB0bV90ZXh0KA0KICAgIHRleHQgPSAiV0FETUtLIiwNCiAgICBzaXplID0gMC41DQogICkgKw0KICB0bV9sYXlvdXQoDQogICAgbGVnZW5kLm91dHNpZGUgPSBUUlVFDQogICkNCmBgYA0KDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKkdhbWJhciAxLioqIFZpc3VhbGlzYXNpIFBldGEgSW5jaWRhbmNlIFJhdGUgVEIgDQo8L2Rpdj4NCiANClNlYmFnaWFuIGJlc2FyIHdpbGF5YWggZGkgSmF3YSBCYXJhdCBiZXJhZGEgcGFkYSBrYXRlZ29yaSBpbmNpZGVuY2UgcmF0ZSAoSVIpIHJlbmRhaCBoaW5nZ2Egc2VkYW5nICgyMDDigJM1OTkgcGVyIDEwMC4wMDAgcGVuZHVkdWspIHlhbmcgdGVyc2ViYXIgZGkgYmVyYmFnYWkgd2lsYXlhaCBiYXJhdCwgc2VsYXRhbiwgZGFuIHRpbXVyLiBTZW1lbnRhcmEgaXR1LCB3aWxheWFoIGRlbmdhbiBJUiB0aW5nZ2kgaGluZ2dhIHNhbmdhdCB0aW5nZ2kgKD42MDAgcGVyIDEwMC4wMDAgcGVuZHVkdWspIGNlbmRlcnVuZyBtZW1iZW50dWsgcG9sYSB0ZXJsb2thbGlzYXNpIHBhZGEgYmViZXJhcGEgd2lsYXlhaCBwZXJrb3RhYW4geWFuZyBwYWRhdCBwZW5kdWR1ay4gSGFsIGluaSBtZW51bmp1a2thbiBhZGFueWEga29uc2VudHJhc2kga2FzdXMgVEIgcGFkYSB3aWxheWFoIGRlbmdhbiBrYXJha3RlcmlzdGlrIHVyYmFuIGRhbiBrZXBhZGF0YW4gdGluZ2dpLg0KDQojIyAzLjIgVWppIEF1dG9rb3JlbGFzaSBTcGFzaWFsIA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCAzLioqICBIYXNpbCBVamkgQXV0b2tvcmVsYXNpIFNwYXNpYWwNCjwvZGl2Pg0KDQpgYGB7cn0NCnZhcl9saXN0IDwtIGMoICJpbmNpZGVuY2VfcmF0ZV9UQiIsICJmYXNrZXMiLCAicGVuZHVkdWtfbWlza2luIiwgImtlcGFkYXRhbiIsICJhaXJfbWludW0iLCAic2FuaXRhc2kiLCAiaGl2IiApDQoNCm5hbWFfdmFyaWFiZWwgPC0gYyggIkluY2lkZW5jZSBSYXRlIChUQikiLCAiRmFza2VzIiwgIlBlbmR1ZHVrIE1pc2tpbiIsICJLZXBhZGF0YW4gUGVuZHVkdWsiLCAiQWlyIE1pbnVtIExheWFrIiwgIlNhbml0YXNpIExheWFrIiwgIkhJViIgKQ0KDQptb3Jhbl9zdW1tYXJ5IDwtIGRhdGEuZnJhbWUoIFZhcmlhYmVsID0gbmFtYV92YXJpYWJlbCwgTW9yYW5fSSA9IE5BLCBFeHBlY3RhdGlvbiA9IE5BLCBWYXJpYW5jZSA9IE5BLCBaX3Njb3JlID0gTkEsIHBfdmFsdWUgPSBOQSApDQoNCmZvcihpIGluIHNlcV9hbG9uZyh2YXJfbGlzdCkpIHsgeCA8LSBzY2FsZShqYWJhcl90YltbdmFyX2xpc3RbaV1dXSlbLDFdIA0KDQptb3Jhbl9yZXN1bHQgPC0gbW9yYW4udGVzdCggeCwgbHcsIHplcm8ucG9saWN5ID0gVFJVRSApIA0KDQptb3Jhbl9zdW1tYXJ5JE1vcmFuX0lbaV0gPC0gbW9yYW5fcmVzdWx0JGVzdGltYXRlWzFdIA0KDQptb3Jhbl9zdW1tYXJ5JEV4cGVjdGF0aW9uW2ldIDwtIG1vcmFuX3Jlc3VsdCRlc3RpbWF0ZVsyXSANCg0KbW9yYW5fc3VtbWFyeSRWYXJpYW5jZVtpXSA8LSBtb3Jhbl9yZXN1bHQkZXN0aW1hdGVbM10gDQoNCm1vcmFuX3N1bW1hcnkkWl9zY29yZVtpXSA8LSB1bm5hbWUobW9yYW5fcmVzdWx0JHN0YXRpc3RpYykgDQoNCm1vcmFuX3N1bW1hcnkkcF92YWx1ZVtpXSA8LSBtb3Jhbl9yZXN1bHQkcC52YWx1ZX0gDQoNCmtuaXRyOjprYWJsZSggbW9yYW5fc3VtbWFyeSwgZGlnaXRzID0gNCkNCmBgYA0KDQoNCg0KDQpCZXJkYXNhcmthbiBoYXNpbCB1amkgTW9yYW7igJlzIEkgcGFkYSBtYXNpbmctbWFzaW5nIHZhcmlhYmVsLCBkaXRlbXVrYW4gYmFod2Egc2ViYWdpYW4gYmVzYXIgdmFyaWFiZWwgaW5kZXBlbmRlbiBtZW51bmp1a2thbiBhZGFueWEgYXV0b2tvcmVsYXNpIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuLiBWYXJpYWJlbCBwZW5kdWR1ayBtaXNraW4sIGtlcGFkYXRhbiBwZW5kdWR1aywgYWtzZXMgYWlyIG1pbnVtIGxheWFrLCBzYW5pdGFzaSBsYXlhaywgZGFuIGp1bWxhaCBrYXN1cyBISVYgbWVtaWxpa2kgbmlsYWkgTW9yYW7igJlzIEkgcG9zaXRpZiBkYW4gc2lnbmlmaWthbiAocCA8IDAsMDUpLCB5YW5nIG1lbnVuanVra2FuIGFkYW55YSBwb2xhIHBlbmdlbG9tcG9rYW4gc3Bhc2lhbCAoY2x1c3RlcmVkKSBhbnRhciB3aWxheWFoIGRpIEphd2EgQmFyYXQuIFNlYmFsaWtueWEsIHZhcmlhYmVsIGluY2lkZW5jZSByYXRlIFR1YmVya3Vsb3NpcyBkYW4ganVtbGFoIGZhc2lsaXRhcyBrZXNlaGF0YW4gKGZhc2tlcykgdGlkYWsgbWVudW5qdWtrYW4gYXV0b2tvcmVsYXNpIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuIChwID4gMCwwNSksIHNlaGluZ2dhIGRpc3RyaWJ1c2lueWEgY2VuZGVydW5nIGFjYWsgc2VjYXJhIHNwYXNpYWwgZGFuIHRpZGFrIG1lbWJlbnR1ayBwb2xhIHBlbmdlbG9tcG9rYW4geWFuZyBqZWxhcyBhbnRhciB3aWxheWFoLg0KDQojIyAzLjMgIE1vZGVsIE9MUyANCg0KSGFzaWwgZXN0aW1hc2kgcGFyYW1ldGVyIG1lbmdndW5ha2FuIG1ldG9kZSBPcmRpbmFyeSBMZWFzdCBTcXVhcmVzIChPTFMpIGRpc2FqaWthbiBwYWRhIFRhYmVsIDUgYmVyaWt1dDoNCg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCA0LioqICBIYXNpbCBFc3RpbWFzaSBNb2RlbCBPTFMNCjwvZGl2Pg0KDQpgYGB7cn0NCm9sc19tb2RlbCA8LSBsbSgNCiAgaW5jaWRlbmNlX3JhdGVfVEIgfg0KICAgIGZhc2tlcyArDQogICAgcGVuZHVkdWtfbWlza2luICsNCiAgICBrZXBhZGF0YW4gKw0KICAgIGFpcl9taW51bSArDQogICAgc2FuaXRhc2kgKw0KICAgIGhpdiwNCiAgZGF0YSA9IGphYmFyX3RiDQopDQoNCm9sc19jb2VmIDwtIHN1bW1hcnkob2xzX21vZGVsKSRjb2VmZmljaWVudHMNCg0Kb2xzX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIFZhcmlhYmVsID0gcm93bmFtZXMob2xzX2NvZWYpLA0KICBLb2VmaXNpZW4gPSBvbHNfY29lZlssIDFdLA0KICBTdGRfRXJyb3IgPSBvbHNfY29lZlssIDJdLA0KICB0X3ZhbHVlID0gb2xzX2NvZWZbLCAzXSwNCiAgcF92YWx1ZSA9IG9sc19jb2VmWywgNF0NCikNCg0Ka25pdHI6OmthYmxlKA0KICBvbHNfdGFibGUsDQogIGRpZ2l0cyA9IDQpDQpgYGANCg0KQmVyZGFzYXJrYW4gaGFzaWwgT0xTLCB2YXJpYWJlbCBpbmRlcGVuZGVuIHNlY2FyYSBzaW11bHRhbiBiZXJwZW5nYXJ1aCBzaWduaWZpa2FuIHRlcmhhZGFwIGluY2lkZW5jZSByYXRlIFRCIChwID0gMCwwMjA3OCksIG5hbXVuIHNlY2FyYSBwYXJzaWFsIHRpZGFrIGRpdGVtdWthbiBwZW5nYXJ1aCB5YW5nIHNpZ25pZmlrYW4gKHAgPiAwLDA1KS4gTW9kZWwgbWFtcHUgbWVuamVsYXNrYW4gc2VraXRhciA0OSw1NSUgdmFyaWFzaSBpbmNpZGVuY2UgcmF0ZSAoUsKyID0gMCw0OTU1KSwgZGVuZ2FuIG5pbGFpIEFkanVzdGVkIFLCsiBzZWJlc2FyIDAsMzQ0Mi4gU2VjYXJhIHVtdW0sIGhhc2lsIGluaSBtZW51bmp1a2thbiBiYWh3YSBtb2RlbCBtYXNpaCB0ZXJiYXRhcyBkYWxhbSBtZW5qZWxhc2thbiB2YXJpYXNpIFRCIHNlaGluZ2dhIGRpcGVybHVrYW4gcGVuZGVrYXRhbiBzcGFzaWFsIHVudHVrIG1lbmFuZ2thcCBrZXRlcmthaXRhbiBhbnRhciB3aWxheWFoLg0KDQojIyAzLjQgRGlhZ25vc3RpayBNb2RlbCBPTFMNCg0KVGFiZWwgNS4gRGlhZ25vc3RpayBNb2RlbCBPTFMgDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCA1LioqICBEaWFnbm9zdGlrIE1vZGVsDQo8L2Rpdj4NCg0KYGBge3J9DQpqYWJhcl90YiRyZXNpZHVhbF9vbHMgPC0gcmVzaWR1YWxzKG9sc19tb2RlbCkNCg0KIyBWSUYNCnZpZl92YWx1ZXMgPC0gdmlmKG9sc19tb2RlbCkNCg0KIyBVamkgZGlhZ25vc3Rpaw0Kc2hhcGlyb19yZXMgPC0gc2hhcGlyby50ZXN0KGphYmFyX3RiJHJlc2lkdWFsX29scykNCmJwX3JlcyA8LSBicHRlc3Qob2xzX21vZGVsKQ0KZHdfcmVzIDwtIGR3dGVzdChvbHNfbW9kZWwpDQoNCm1vcmFuX3Jlc2lkdWFsIDwtIG1vcmFuLnRlc3QoDQogIGphYmFyX3RiJHJlc2lkdWFsX29scywNCiAgbHcsDQogIHplcm8ucG9saWN5ID0gVFJVRQ0KKQ0KDQpkaWFnbm9zdGljX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIFVqaSA9IGMoDQogICAgcGFzdGUoIlZJRiDigJMiLCBuYW1lcyh2aWZfdmFsdWVzKSksDQogICAgIk5vcm1hbGl0YXMgUmVzaWR1YWwgKFNoYXBpcm8tV2lsaykiLA0KICAgICJIZXRlcm9za2VkYXN0aXNpdGFzIChCcmV1c2NoLVBhZ2FuKSIsDQogICAgIkF1dG9rb3JlbGFzaSAoRHVyYmluLVdhdHNvbikiLA0KICAgICJBdXRva29yZWxhc2kgU3Bhc2lhbCBSZXNpZHVhbCAoTW9yYW4ncyBJKSINCiAgKSwNCiAgTmlsYWkgPSBjKA0KICAgIGFzLm51bWVyaWModmlmX3ZhbHVlcyksDQogICAgc2hhcGlyb19yZXMkc3RhdGlzdGljLA0KICAgIGJwX3JlcyRzdGF0aXN0aWMsDQogICAgZHdfcmVzJHN0YXRpc3RpYywNCiAgICBtb3Jhbl9yZXNpZHVhbCRlc3RpbWF0ZVsxXQ0KICApLA0KICBwX3ZhbHVlID0gYygNCiAgICByZXAoTkEsIGxlbmd0aCh2aWZfdmFsdWVzKSksDQogICAgc2hhcGlyb19yZXMkcC52YWx1ZSwNCiAgICBicF9yZXMkcC52YWx1ZSwNCiAgICBkd19yZXMkcC52YWx1ZSwNCiAgICBtb3Jhbl9yZXNpZHVhbCRwLnZhbHVlDQogICkNCikNCg0Ka25pdHI6OmthYmxlKA0KICBkaWFnbm9zdGljX3RhYmxlLA0KICBkaWdpdHMgPSA0DQopDQpgYGANCg0KDQpIYXNpbCBkaWFnbm9zdGlrIG1vZGVsIE9MUyBtZW51bmp1a2thbiBiYWh3YSBzZWx1cnVoIGFzdW1zaSBrbGFzaWsgdGVycGVudWhpLCB5YWl0dSB0aWRhayB0ZXJkYXBhdCBtdWx0aWtvbGluZWFyaXRhcywgaGV0ZXJvc2tlZGFzdGlzaXRhcywgbWF1cHVuIGF1dG9rb3JlbGFzaSByZXNpZHVhbCBzZWNhcmEgdGVtcG9yYWwuIE5hbXVuLCB1amkgTW9yYW7igJlzIEkgcGFkYSByZXNpZHVhbCBtZW51bmp1a2thbiBhZGFueWEgYXV0b2tvcmVsYXNpIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuIChJID0gMCwyNTczOyBwID0gMCwwMTc2KSwgeWFuZyBtZW5naW5kaWthc2lrYW4gYmFod2EgcmVzaWR1YWwgbWFzaWggbWVtaWxpa2kgcG9sYSBrZXRlcmdhbnR1bmdhbiBhbnRhciB3aWxheWFoLiBUZW11YW4gaW5pIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIE9MUyBiZWx1bSBtYW1wdSBtZW5hbmdrYXAgZWZlayBzcGFzaWFsLCBzZWhpbmdnYSBkaXBlcmx1a2FuIHBlbmRla2F0YW4gbW9kZWwgc3Bhc2lhbCBzZXBlcnRpIFNMWCB1bnR1ayBtZW5nYWtvbW9kYXNpIGtldGVya2FpdGFuIGFudGFyIHdpbGF5YWguDQoNCg0KIyMgMy41IE1vZGVsIFNMWA0KDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDUuKiogIEhhc2lsIEVzdGltYXNpIE1vZGVsIFNMWCANCjwvZGl2Pg0KDQpgYGB7cn0NCmphYmFyX3RiJGxhZ19mYXNrZXMgPC0gbGFnLmxpc3R3KA0KICBsdywgamFiYXJfdGIkZmFza2VzLA0KICB6ZXJvLnBvbGljeSA9IFRSVUUNCikNCg0KamFiYXJfdGIkbGFnX3BlbmR1ZHVrX21pc2tpbiA8LSBsYWcubGlzdHcoDQogIGx3LCBqYWJhcl90YiRwZW5kdWR1a19taXNraW4sDQogIHplcm8ucG9saWN5ID0gVFJVRQ0KKQ0KDQpqYWJhcl90YiRsYWdfa2VwYWRhdGFuIDwtIGxhZy5saXN0dygNCiAgbHcsIGphYmFyX3RiJGtlcGFkYXRhbiwNCiAgemVyby5wb2xpY3kgPSBUUlVFDQopDQoNCmphYmFyX3RiJGxhZ19haXJfbWludW0gPC0gbGFnLmxpc3R3KA0KICBsdywgamFiYXJfdGIkYWlyX21pbnVtLA0KICB6ZXJvLnBvbGljeSA9IFRSVUUNCikNCg0KamFiYXJfdGIkbGFnX3Nhbml0YXNpIDwtIGxhZy5saXN0dygNCiAgbHcsIGphYmFyX3RiJHNhbml0YXNpLA0KICB6ZXJvLnBvbGljeSA9IFRSVUUNCikNCg0KamFiYXJfdGIkbGFnX2hpdiA8LSBsYWcubGlzdHcoDQogIGx3LCBqYWJhcl90YiRoaXYsDQogIHplcm8ucG9saWN5ID0gVFJVRQ0KKQ0KDQpzbHhfbW9kZWwgPC0gbG0oDQogIGluY2lkZW5jZV9yYXRlX1RCIH4NCiAgICBmYXNrZXMgKw0KICAgIHBlbmR1ZHVrX21pc2tpbiArDQogICAga2VwYWRhdGFuICsNCiAgICBhaXJfbWludW0gKw0KICAgIHNhbml0YXNpICsNCiAgICBoaXYgKw0KICAgIGxhZ19mYXNrZXMgKw0KICAgIGxhZ19wZW5kdWR1a19taXNraW4gKw0KICAgIGxhZ19rZXBhZGF0YW4gKw0KICAgIGxhZ19haXJfbWludW0gKw0KICAgIGxhZ19zYW5pdGFzaSArDQogICAgbGFnX2hpdiwNCiAgZGF0YSA9IGphYmFyX3RiDQopDQoNCnNseF9jb2VmIDwtIHN1bW1hcnkoc2x4X21vZGVsKSRjb2VmZmljaWVudHMNCg0Kc2x4X3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIFZhcmlhYmVsID0gYygNCiAgICAiKEludGVyY2VwdCkiLA0KICAgICJGYXNrZXMiLA0KICAgICJQZW5kdWR1ayBNaXNraW4iLA0KICAgICJLZXBhZGF0YW4gUGVuZHVkdWsiLA0KICAgICJBaXIgTWludW0gTGF5YWsiLA0KICAgICJTYW5pdGFzaSBMYXlhayIsDQogICAgIkhJViIsDQogICAgIkxhZyBGYXNrZXMiLA0KICAgICJMYWcgUGVuZHVkdWsgTWlza2luIiwNCiAgICAiTGFnIEtlcGFkYXRhbiIsDQogICAgIkxhZyBBaXIgTWludW0gTGF5YWsiLA0KICAgICJMYWcgU2FuaXRhc2kgTGF5YWsiLA0KICAgICJMYWcgSElWIg0KICApLA0KICBLb2VmaXNpZW4gPSBzbHhfY29lZlssIDFdLA0KICBTdGRfRXJyb3IgPSBzbHhfY29lZlssIDJdLA0KICB0X3ZhbHVlID0gc2x4X2NvZWZbLCAzXSwNCiAgcF92YWx1ZSA9IHNseF9jb2VmWywgNF0NCikNCg0Ka25pdHI6OmthYmxlKA0KICBzbHhfdGFibGUsDQogIGRpZ2l0cyA9IDQpDQpgYGANCg0KSGFzaWwgZXN0aW1hc2kgbW9kZWwgU0xYIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIHNlY2FyYSBzaW11bHRhbiBzaWduaWZpa2FuIGRhbGFtIG1lbmplbGFza2FuIHZhcmlhc2kgaW5jaWRlbmNlIHJhdGUgVHViZXJrdWxvc2lzIChwID0gMCwwNDQ4MykuIE5pbGFpIFLCsiBzZWJlc2FyIDAsNjkxMyBtZW51bmp1a2thbiBiYWh3YSBtb2RlbCBtYW1wdSBtZW5qZWxhc2thbiBzZWtpdGFyIDY5LDEzJSB2YXJpYXNpIGRhdGEsIHlhbmcgbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiBtb2RlbCBPTFMuDQpOYW11biBkZW1pa2lhbiwgc2VjYXJhIHBhcnNpYWwgc2VsdXJ1aCB2YXJpYWJlbCBiYWlrIHZhcmlhYmVsIGxva2FsIG1hdXB1biBlZmVrIHNwYXNpYWwgKGxhZykgdGlkYWsgbWVudW5qdWtrYW4gcGVuZ2FydWggeWFuZyBzaWduaWZpa2FuIChwID4gMCwwNSkuIEhhbCBpbmkgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIHBlbmdhcnVoIGZha3RvciByaXNpa28gdGVyaGFkYXAgaW5jaWRlbmNlIHJhdGUgVEIgdGVyc2ViYXIgc2VjYXJhIHNwYXNpYWwgZGFuIHRpZGFrIHRlcnB1c2F0IHBhZGEgc2F0dSB2YXJpYWJlbCB0ZXJ0ZW50dS4gU2VjYXJhIGtlc2VsdXJ1aGFuLCBtb2RlbCBTTFggbWVudW5qdWtrYW4gYWRhbnlhIHBlbmluZ2thdGFuIGtlbWFtcHVhbiBkYWxhbSBtZW5hbmdrYXAgdmFyaWFzaSBkYXRhIGRpYmFuZGluZ2thbiBPTFMsIHNlaGluZ2dhIG1lbmR1a3VuZyBhZGFueWEgZWZlayBrZXRlcmthaXRhbiBzcGFzaWFsIGFudGFyIHdpbGF5YWggZGFsYW0gcGVueWViYXJhbiBUdWJlcmt1bG9zaXMuDQoNCiMjIDMuNiBQZXJiYW5kaW5nYW4gTW9kZWwNCg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCA2LioqIFBlcmJhbmRpbmdhbiBNb2RlbA0KPC9kaXY+DQoNCmBgYHtyfQ0KbW9kZWxfY29tcGFyaXNvbiA8LSBkYXRhLmZyYW1lKA0KICBNb2RlbCA9IGMoIk9MUyIsICJTTFgiKSwNCiAgDQogIEFJQyA9IHJvdW5kKA0KICAgIGMoDQogICAgICBBSUMob2xzX21vZGVsKSwNCiAgICAgIEFJQyhzbHhfbW9kZWwpDQogICAgKSwNCiAgICAyDQogICksDQogIA0KICBSX3NxdWFyZWQgPSByb3VuZCgNCiAgICBjKA0KICAgICAgc3VtbWFyeShvbHNfbW9kZWwpJHIuc3F1YXJlZCwNCiAgICAgIHN1bW1hcnkoc2x4X21vZGVsKSRyLnNxdWFyZWQNCiAgICApLA0KICAgIDQNCiAgKSwNCiAgDQogIExvZ0xpayA9IHJvdW5kKA0KICAgIGMoDQogICAgICBhcy5udW1lcmljKGxvZ0xpayhvbHNfbW9kZWwpKSwNCiAgICAgIGFzLm51bWVyaWMobG9nTGlrKHNseF9tb2RlbCkpDQogICAgKSwNCiAgICAyDQogICksDQogIA0KICBSTVNFID0gcm91bmQoDQogICAgYygNCiAgICAgIHNxcnQobWVhbihvbHNfbW9kZWwkcmVzaWR1YWxzXjIpKSwNCiAgICAgIHNxcnQobWVhbihzbHhfbW9kZWwkcmVzaWR1YWxzXjIpKQ0KICAgICksDQogICAgMg0KICApDQopDQoNCmNvbXBhcmlzb25fdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgTW9kZWwgPSBjKCJPTFMiLCAiU0xYIiksDQoNCiAgQUlDID0gcm91bmQoDQogICAgYygNCiAgICAgIEFJQyhvbHNfbW9kZWwpLA0KICAgICAgQUlDKHNseF9tb2RlbCkNCiAgICApLA0KICAgIDINCiAgKSwNCg0KICBSX3NxdWFyZWQgPSByb3VuZCgNCiAgICBjKA0KICAgICAgc3VtbWFyeShvbHNfbW9kZWwpJHIuc3F1YXJlZCwNCiAgICAgIHN1bW1hcnkoc2x4X21vZGVsKSRyLnNxdWFyZWQNCiAgICApLA0KICAgIDQNCiAgKSwNCg0KICBMb2dfTGlrZWxpaG9vZCA9IHJvdW5kKA0KICAgIGMoDQogICAgICBhcy5udW1lcmljKGxvZ0xpayhvbHNfbW9kZWwpKSwNCiAgICAgIGFzLm51bWVyaWMobG9nTGlrKHNseF9tb2RlbCkpDQogICAgKSwNCiAgICAyDQogICksDQoNCiAgUk1TRSA9IHJvdW5kKA0KICAgIGMoDQogICAgICBzcXJ0KG1lYW4ocmVzaWR1YWxzKG9sc19tb2RlbCleMikpLA0KICAgICAgc3FydChtZWFuKHJlc2lkdWFscyhzbHhfbW9kZWwpXjIpKQ0KICAgICksDQogICAgMg0KICApDQopDQoNCmtuaXRyOjprYWJsZSgNCiAgY29tcGFyaXNvbl90YWJsZSwNCiAgZGlnaXRzID0gNA0KKQ0KDQpgYGANCg0KSGFzaWwgcGVyYmFuZGluZ2FuIGtpbmVyamEgbW9kZWwgbWVudW5qdWtrYW4gYmFod2EgbW9kZWwgU0xYIG1lbWlsaWtpIHBlcmZvcm1hIHlhbmcgbGViaWggYmFpayBkaWJhbmRpbmdrYW4gbW9kZWwgT0xTLiBIYWwgaW5pIHRlcmxpaGF0IGRhcmkgcGVudXJ1bmFuIG5pbGFpIEFJQyBkYW4gUk1TRSwgc2VydGEgcGVuaW5na2F0YW4gbmlsYWkgUi1zcXVhcmVkIGRhbiBsb2ctbGlrZWxpaG9vZC4gUGVuaW5na2F0YW4gdGVyc2VidXQgbWVudW5qdWtrYW4gYmFod2EgbW9kZWwgU0xYIGxlYmloIG1hbXB1IG1lbmplbGFza2FuIHZhcmlhc2kgaW5jaWRlbmNlIHJhdGUgVHViZXJrdWxvc2lzIGRlbmdhbiBtZW1wZXJ0aW1iYW5na2FuIGVmZWsgc3Bhc2lhbCBhbnRhciB3aWxheWFoLiBEZW5nYW4gZGVtaWtpYW4sIG1vZGVsIFNMWCBsZWJpaCBzZXN1YWkgZGlndW5ha2FuIGRhbGFtIGFuYWxpc2lzIGluaSBrYXJlbmEgbWFtcHUgbWVuYW5na2FwIGtldGVya2FpdGFuIHNwYXNpYWwgeWFuZyB0aWRhayBkYXBhdCBkaWplbGFza2FuIG9sZWggbW9kZWwgT0xTLg0KDQoNCiMjIDMuNyBLZXRlcmJhdGFzYW4gUGVuZWxpdGlhbg0KDQpQZW5lbGl0aWFuIGluaSBtZW1pbGlraSBiZWJlcmFwYSBrZXRlcmJhdGFzYW4geWFuZyBwZXJsdSBkaXBlcmhhdGlrYW4gZGFsYW0gaW50ZXJwcmV0YXNpIGhhc2lsbnlhOg0KMS4JQW5hbGlzaXMgZGlsYWt1a2FuIHBhZGEgdGluZ2thdCBhZ3JlZ2F0IGthYnVwYXRlbi9rb3RhLCBzZWhpbmdnYSB0aWRhayBtYW1wdSBtZW5hbmdrYXAgdmFyaWFzaSBkYWxhbSB0aW5na2F0IHlhbmcgbGViaWggbWlrcm8uDQoNCjIuIERhdGEgYmVyc2lmYXQgY3Jvc3Mtc2VjdGlvbmFsLCBzZWhpbmdnYSB0aWRhayBkYXBhdCBtZW5jZXJtaW5rYW4gZGluYW1pa2EgcGVydWJhaGFuIGthc3VzIFRCIGRhcmkgd2FrdHUga2Ugd2FrdHUuDQoNCjMuCUp1bWxhaCB2YXJpYWJlbCBwZW5qZWxhcyB5YW5nIGRpZ3VuYWthbiBtYXNpaCB0ZXJiYXRhcyBkYW4gYmVsdW0gbWVuY2FrdXAgc2VtdWEgZmFrdG9yIHJpc2lrbyB5YW5nIHJlbGV2YW4uDQoNCjQuIE1vZGVsIFNMWCB5YW5nIGRpZ3VuYWthbiBiZWx1bSBtZW1wZXJ0aW1iYW5na2FuIGtldGVyZ2FudHVuZ2FuIHRlbXBvcmFsIGFudGFyIHBlbmdhbWF0YW4uDQoNCiMgNC4JS2VzaW1wdWxhbiBkYW4gU2FyYW4NCg0KIyMgNC4xIEtlc2ltcHVsYW4NCg0KQmVyZGFzYXJrYW4gaGFzaWwgYW5hbGlzaXMgeWFuZyB0ZWxhaCBkaWxha3VrYW4sIGRhcGF0IGRpc2ltcHVsa2FuIGJhaHdhOg0KDQoxLiBLYXN1cyBUQiBkaSBKYXdhIEJhcmF0IG1lbnVuanVra2FuIHZhcmlhc2kgc3Bhc2lhbCB5YW5nIHRpbmdnaSBhbnRhciBrYWJ1cGF0ZW4va290YSwgZGVuZ2FuIGRpc3RyaWJ1c2kgSW5jaWRlbmNlIFJhdGUgeWFuZyB0aWRhayBtZXJhdGEuDQoNCjIuCVNlYmFnaWFuIGJlc2FyIHZhcmlhYmVsIHNvc2lhbC1la29ub21pIGRhbiBrZXNlaGF0YW4gbWVudW5qdWtrYW4gcG9sYSBjbHVzdGVyaW5nIHNwYXNpYWwgeWFuZyBzaWduaWZpa2FuIGJlcmRhc2Fya2FuIHVqaSBNb3JhbidzIEkuDQoJDQozLglNb2RlbCBPTFMgYmVsdW0gbWFtcHUgbWVuYW5na2FwIGVmZWsgc3Bhc2lhbCBzZWNhcmEgbWVtYWRhaSwgc2ViYWdhaW1hbmEgZGl0dW5qdWtrYW4gb2xlaCBhdXRva29yZWxhc2kgc3Bhc2lhbCBwYWRhIHJlc2lkdWFsIG1vZGVsLg0KDQo0LglNb2RlbCBTTFggbGViaWggYmFpayBkYWxhbSBtZW5qZWxhc2thbiB2YXJpYXNpIEluY2lkZW5jZSBSYXRlIFRCIGRpYmFuZGluZ2thbiBPTFMsIGRlbmdhbiBwZW5pbmdrYXRhbiBSwrIgZGFyaSAwLDQ5NTUgbWVuamFkaSAwLDY5MTMuDQoJDQo1LiBUZXJkYXBhdCBpbmRpa2FzaSBrdWF0IGFkYW55YSBzcGlsbG92ZXIgZWZmZWN0LCB5YWl0dSBrb25kaXNpIHNvc2lhbC1la29ub21pIGRpIHN1YXR1IHdpbGF5YWggdHVydXQgbWVtZW5nYXJ1aGkgYmViYW4gVEIgZGkgd2lsYXlhaCB0ZXRhbmdnYW55YS4NCg0KIyMgNC4yIFNhcmFuIA0KQmVyZGFzYXJrYW4gdGVtdWFuIHBlbmVsaXRpYW4sIGJlYmVyYXBhIHNhcmFuIGRhcGF0IGRpcnVtdXNrYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQoxLiBJbnRlcnZlbnNpIGRhbiBwcm9ncmFtIHBlbmdlbmRhbGlhbiBUQiBwZXJsdSBkaWZva3Vza2FuIHNlY2FyYSBwcmlvcml0YXMgcGFkYSB3aWxheWFoIGRlbmdhbiBJbmNpZGVuY2UgUmF0ZSB0aW5nZ2kgZGFuIGtvbmRpc2kgc29zaWFsLWVrb25vbWkgcmVuZGFoLg0KCQ0KMi4gUGVuZ3VhdGFuIHByb2dyYW0ga29sYWJvcmFzaSBUQi1ISVYgcGVybHUgZGl0aW5na2F0a2FuIG1lbmdpbmdhdCBrYXN1cyBISVYgbWVydXBha2FuIGZha3RvciByaXNpa28gcGVudGluZyBkYWxhbSBwZW55ZWJhcmFuIFRCLg0KCQ0KMy4gUGVuZWxpdGlhbiBzZWxhbmp1dG55YSBkaXNhcmFua2FuIG1lbmdndW5ha2FuIGRhdGEgc3Bhc2lvLXRlbXBvcmFsIGFnYXIgZGFwYXQgbWVuYW5na2FwIGRpbmFtaWthIHBlcnNlYmFyYW4gVEIgZGFyaSB3YWt0dSBrZSB3YWt0dS4NCgkNCjQuIE1vZGVsIHNwYXNpYWwgbGFuanV0YW4sIHNlcGVydGkgU3BhdGlhbCBBdXRvcmVncmVzc2l2ZSAoU0FSKSBhdGF1IG1vZGVsIEJheWVzaWFuIChCWU0pLCBkYXBhdCBkaXBlcnRpbWJhbmdrYW4gdW50dWsgYW5hbGlzaXMgeWFuZyBsZWJpaCBrb21wcmVoZW5zaWYuDQoNCiMgRGFmdGFyIFB1c3Rha2EgDQoNCkFsbWEsIEwuIFIuLCBPbGl2aW9uaXRhLCBWLiwgJiBXYXJkYW5pLCBILiBFLiAoMjAyNCkuIEFuIGVjb2xvZ2ljYWwgc3R1ZHkgb2YgZGV0ZXJtaW5hbnRzIG9mIHRoZSBpbmNpZGVuY2Ugb2YgdHViZXJjdWxvc2lzIGluIE1hbGFuZyBSYXlhIGFyZWEuIFByZXZlbnRpYTogVGhlIEluZG9uZXNpYW4gSm91cm5hbCBvZiBQdWJsaWMgSGVhbHRoLCA5KDEpLCAxMTLigJMxMjAuIGh0dHBzOi8vZG9pLm9yZy8xMC4xNzk3Ny91bTA0NHY5aTEyMDI0cDExMi0xMjANCg0KQW5zZWxpbiwgTC4gKDE5OTUpLiBMb2NhbCBpbmRpY2F0b3JzIG9mIHNwYXRpYWwgYXNzb2NpYXRpb24gTElTQS4gR2VvZ3JhcGhpY2FsIEFuYWx5c2lzLCAyNygyKSwgOTPigJMxMTUuaHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvai4xNTM4LTQ2MzIuMTk5NS50YjAwMzM4LngNCg0KQXRpbGxhaCwgQy4gTi4sIFd1bGFuZGFyaSwgUi4gQS4sICYgS3Vybmlhc2FyaSwgRi4gKDIwMjMpLiBFbnZpcm9ubWVudGFsIGZhY3RvcnMgYW5kIHB1bG1vbmFyeSB0dWJlcmN1bG9zaXMgY2FzZXMgaW4gQmFuZHVuZyBDaXR5LiBKdXJuYWwgSWxtaWFoIEtlc2VoYXRhbiBNYXN5YXJha2F0LCAxNSg0KSwgMTY34oCTMTc1LiBodHRwczovL2RvaS5vcmcvMTAuNTIwMjIvamlrbS52MTVpNC41NjYNCg0KQmVzYWcsIEouLCBZb3JrLCBKLiwgJiBNb2xsacOpLCBBLiAoMTk5MSkuIEJheWVzaWFuIGltYWdlIHJlc3RvcmF0aW9uLCB3aXRoIHR3byBhcHBsaWNhdGlvbnMgaW4gc3BhdGlhbCBzdGF0aXN0aWNzLiBBbm5hbHMgb2YgdGhlIEluc3RpdHV0ZSBvZiBTdGF0aXN0aWNhbCBNYXRoZW1hdGljcywgNDMoMSksIDHigJMyMC4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDcvQkYwMDExNjQ2Ng0KDQpCaXZhbmQsIFIuIFMuLCBQZWJlc21hLCBFLiwgJiBHw7NtZXotUnViaW8sIFYuICgyMDEzKS4gQXBwbGllZCBzcGF0aWFsIGRhdGEgYW5hbHlzaXMgd2l0aCBSICgybmQgZWQuKS4gU3ByaW5nZXIuDQoNCkNsaWZmLCBBLiBELiwgJiBPcmQsIEouIEsuICgxOTgxKS4gU3BhdGlhbCBwcm9jZXNzZXM6IE1vZGVscyBhbmQgYXBwbGljYXRpb25zLiBQaW9uLg0KDQpEaW5hcyBLZXNlaGF0YW4gUHJvdmluc2kgSmF3YSBCYXJhdC4gKDIwMjMpLiBQcm9maWwga2VzZWhhdGFuIFByb3ZpbnNpIEphd2EgQmFyYXQgdGFodW4gMjAyMi4NCg0KRGluYXMgS2VzZWhhdGFuIFByb3ZpbnNpIEphd2EgQmFyYXQuICgyMDI0KS4gUHJvZmlsIGtlc2VoYXRhbiBQcm92aW5zaSBKYXdhIEJhcmF0IHRhaHVuIDIwMjMuDQoNCkRpbmFzIEtlc2VoYXRhbiBQcm92aW5zaSBKYXdhIEJhcmF0LiAoMjAyNSkuIFByb2ZpbCBrZXNlaGF0YW4gUHJvdmluc2kgSmF3YSBCYXJhdCB0YWh1biAyMDI0Lg0KDQpEemFraXlhaCwgUi4gTi4sIEthcmltYSwgVS4gUS4sIFNpbWFuam9yYW5nLCBDLiwgJiBBcHJpbmluZ3NpaC4gKDIwMjMpLiBEZXRlcm1pbmFuIGtlamFkaWFuIHR1YmVya3Vsb3NpcyBwYXJ1IHBhZGEgdXNpYSBkZXdhc2EuIEp1cm5hbCBQZW5lbGl0aWFuIEtlc2VoYXRhbiBTdWFyYSBGb3Jpa2VzLg0KDQpIYW5kYXlhbmksIFMuLCBNdXNmaXJhaCwgTS4sICYgQXByaWFuYSwgQS4gKDIwMjQpLiBEZXRlcm1pbmFudHMgb2YgcHVsbW9uYXJ5IHR1YmVyY3Vsb3Npcy4gSnVybmFsIElsbWlhaCBLZXNlaGF0YW4sIDYoMSksIDQ14oCTNTQuIGh0dHBzOi8vZG9pLm9yZy8xMC4zNjU5MC9qaWthLnY2aTEuMzc0DQoNCkhhcSwgQS4sIEFjaG1hZGksIFUuIEYuLCAmIFN1c2FubmEsIEQuICgyMDIwKS4gQW5hbGlzaXMgc3Bhc2lhbCBUQiBwYXJ1LiBKdXJuYWwgRWtvbG9naSBLZXNlaGF0YW4sIDE4KDMpLiBodHRwczovL2RvaS5vcmcvMTAuMjI0MzUvamVrLnYzaTE4LjgwDQpLZW1lbnRlcmlhbiBLZXNlaGF0YW4gUmVwdWJsaWsgSW5kb25lc2lhLiAoMjAyNSkuIFByb2ZpbCBrZXNlaGF0YW4gSW5kb25lc2lhIDIwMjQuDQoNCktyaXN0aWFuaW5ncnVtLCBFLiBOLiAoMjAyNCkuIEtlcGFkYXRhbiBwZW5kdWR1ayBkYW4gVEIgcGFydSAoU2tyaXBzaSkuIFVuaXZlcnNpdGFzIER1dGEgQmFuZ3NhLg0KDQpMYW9saSwgSC4gQS4sIE5hemlyYSwgQS4sIEZhbGVyaWEsIEkuLCBUYXJpZ2FuLCBCLiwgJiBHaXJzYW5nLCBWLiBJLiAoMjAyNCkuIENhc2VzIG9mIHB1bG1vbmFyeSB0dWJlcmN1bG9zaXMgYW5kIHBvcHVsYXRpb24gZGVuc2l0eS4gTUlISElDbyBDb25mZXJlbmNlIFByb2NlZWRpbmdzLg0KDQpNb250Z29tZXJ5LCBELiBDLiwgUGVjaywgRS4gQS4sICYgVmluaW5nLCBHLiBHLiAoMjAyMSkuIEludHJvZHVjdGlvbiB0byBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcyAoNnRoIGVkLikuIFdpbGV5Lg0KDQpOdXJkaW4sIEEuLCBldCBhbC4gKDIwMjUpLiBBbmFsaXNpcyBmYWt0b3IgcmlzaWtvIFRCLiBKdXJuYWwgS2VzZWhhdGFuIFlhbWFzaSBNYWthc3NhciwgOSgyKSwgMeKAkzkuDQoNClJvc2FkeSwgRC4gUy4sIFp1bGZhLCBOLiBSLiBBLiwgJiBQcmF0YW1hLCBTLiBCLiAoMjAyNCkuIFNwYXRpYWwgYW5hbHlzaXMgVEIgQmFuZHVuZy4gR2xvYmFsIE1lZGljYWwgJiBIZWFsdGggQ29tbXVuaWNhdGlvbiwgMTIoMSkuIGh0dHBzOi8vZG9pLm9yZy8xMC4yOTMxMy9nbWhjLnYxMmkxLjEyNDEwDQoNClNhc21pdGEsIFMuLCBKdW5haWQsIEouLCAmIEFpbnVyYWZpcSwgQS4gKDIwMTcpLiBQb2xhIHNwYXNpYWwgVEIgcGFydS4gSnVybmFsIElsbWlhaCBNYWhhc2lzd2EgS2VzZWhhdGFuIE1hc3lhcmFrYXQuDQoNClNpaGFsb2hvLCBFLiBELiwgZXQgYWwuICgyMDIxKS4gUGVuZ2FydWgga2VtaXNraW5hbiB0ZXJoYWRhcCBUQi4gSm91cm5hbCBvZiBBcHBsaWVkIEJ1c2luZXNzIGFuZCBFY29ub21pYywgNygzKS4gaHR0cHM6Ly9kb2kub3JnLzEwLjMwOTk4L2phYmUudjdpMy42NDcwDQoNClN1cnlhbmksIEYuIFQuLCAmIEliYWQsIE0uICgyMDIyKS4gRmFrdG9yIGtlcGFkYXRhbiBkYW4gc2FuaXRhc2kgdGVyaGFkYXAgVEIuIEp1cm5hbCBTb3NpYWwgU2FpbnMsIDIoMTApLiBodHRwczovL2RvaS5vcmcvMTAuMzY0MTgvanVybmFsc29zYWlucy52MmkxMC40NjgNCg0KVHVybmVyLCBSLiBELiwgZXQgYWwuICgyMDE3KS4gVHViZXJjdWxvc2lzIGluZmVjdGlvdXNuZXNzIGFuZCBob3N0IHN1c2NlcHRpYmlsaXR5LiBKb3VybmFsIG9mIEluZmVjdGlvdXMgRGlzZWFzZXMsIDIxNi4gaHR0cHM6Ly9kb2kub3JnLzEwLjEwOTMvaW5mZGlzL2ppeDM2MQ0KDQpXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uLiAoMjAyNSkuIEdsb2JhbCB0dWJlcmN1bG9zaXMgcmVwb3J0IDIwMjUuIFdITy4NCg==