Abstrak
Pneumonia merupakan salah satu penyebab utama kematian pada balita.
Penelitian ini memetakan sebaran risiko dan menganalisis dinamika
spasio-temporal insidens pneumonia balita di 30 kecamatan Kota Bandung
selama 2017–2021. Data kasus, jumlah balita, dan enam indikator cakupan
program kesehatan bersumber dari Profil Kesehatan Kota Bandung. Risiko
diukur dengan incidence rate (IR) dan standardized incidence ratio (SIR)
yang dihaluskan dengan Empirical Bayes, autokorelasi diuji dengan
Moran’s I spasial dan spasio-temporal, dan dinamika risiko dimodelkan
secara bertingkat dari Negative Binomial GLM hingga Negative Binomial
Mixed Model dengan efek acak kecamatan. Jumlah kasus tercatat menurun
tajam, dari 10.735 (2017) menjadi 2.003 (2021), dengan penurunan
terbesar pada masa pandemi yang kemungkinan mencerminkan gangguan
pelaporan. Hasil uji Moran’s I spasial per tahun tidak signifikan,
sedangkan Moran’s I spasio-temporal signifikan (0,186; p = 0,001),
menunjukkan dominasi dimensi temporal. NB Mixed Model terpilih sebagai
model terbaik (AIC 1788,4 vs 1843,6) dengan simpangan baku efek acak
kecamatan 0,514 dan residual yang acak secara spasial. Tidak ada
covariate program kesehatan yang signifikan (alpha 5%) pada model final.
Kecamatan Cinambo dan Bandung Kidul teridentifikasi sebagai wilayah
prioritas. Pengendalian pneumonia balita disarankan berbasis wilayah
dengan penguatan pencatatan kasus.
Kata kunci: disease mapping, Empirical Bayes, Negative Binomial Mixed
Model, pneumonia balita, spasio-temporal
Pendahuluan
Pneumonia adalah infeksi saluran pernapasan akut yang menyerang
alveoli, kantung-kantung udara di paru. Ketika terinfeksi, alveoli
terisi cairan atau nanah sehingga penderita sulit bernapas dan asupan
oksigennya berkurang. Penyakit ini menjadi penyebab kematian menular
terbesar pada anak di dunia: pada 2019, pneumonia merenggut 740.180 anak
di bawah lima tahun, atau 14% dari seluruh kematian balita global,
dengan beban tertinggi di Asia Selatan dan Afrika Sub-Sahara (WHO,
2022).
Di Indonesia, pneumonia menjadi salah satu penyebab utama kematian
balita. Menurut Kementerian Kesehatan, penyakit ini merenggut lebih
banyak nyawa balita daripada gabungan AIDS, malaria, dan campak,
sehingga pemerintah menyusun Rencana Aksi Nasional Penanggulangan
Pneumonia dan Diare 2023-2030 untuk menekan angka kematian (Kemenkes RI,
2023). Di Kota Bandung, pneumonia balita dipantau secara rutin melalui
cakupan penemuan dan penanganan kasus per kecamatan (Dinas Kesehatan
Kota Bandung, 2021). Sebagai kota besar dengan arus urbanisasi tinggi,
kepadatan penduduk yang bervariasi antarwilayah, dan strata sosial
ekonomi yang heterogen (Dinas Kesehatan Kota Bandung, 2016), risiko
pneumonia balita dapat berbeda-beda antarkecamatan.
Jumlah kasus pneumonia balita yang tercatat di Kota Bandung menurun
selama 2017-2021 (Gambar 1), dari 10.735 kasus pada 2017 menjadi 10.525
(2018), 9.716 (2019), 4.075 (2020), dan 2.003 kasus pada 2021 (Dinas
Kesehatan Kota Bandung, 2021). Angka agregat tahunan seperti ini
menyembunyikan dua hal: bagaimana risiko tersebar antarkecamatan, dan
bagaimana pola tersebut berubah dari tahun ke tahun. Penurunan tajam
pada 2020-2021 juga perlu ditelaah karena bertepatan dengan pandemi
COVID-19 yang dapat memengaruhi penemuan dan pelaporan kasus. Analisis
spasio-temporal menjawab keduanya sekaligus: memetakan risiko per
kecamatan dan menelusuri perubahannya antarwaktu, sehingga wilayah dan
periode berisiko tinggi dapat diidentifikasi lebih tepat.
Tujuan analisis: (1) mendeskripsikan sebaran dan
tren kasus pneumonia balita antarkecamatan di Kota Bandung; (2)
menghitung ukuran risiko epidemiologi (IR dan SIR); (3) memetakan
variasi risiko dan menerapkan penghalusan spasial; serta (4) memodelkan
dinamika risiko menurut wilayah dan waktu.
Data dan Metode
Sumber data. Jumlah kasus pneumonia balita dan
jumlah balita per kecamatan bersumber dari Profil Kesehatan Kota Bandung
(Dinas Kesehatan Kota Bandung). Batas wilayah kecamatan bersumber dari
data GeoJSON administrasi Kota Bandung. Unit analisis: 30 kecamatan;
periode: 2017-2021 (lima tahun, 30 kecamatan, total 150 observasi
kecamatan-tahun).
Variabel penelitian. Data memuat variabel respons
(jumlah kasus pneumonia balita), populasi berisiko (jumlah balita),
serta enam covariate cakupan program kesehatan (dalam persen):
Tabel 1. Deskripsi variabel dalam data.
|
Variabel
|
Keterangan
|
Peran
|
|
Pneumonia
|
Jumlah kasus pneumonia balita (variabel respons/outcome)
|
Respons
|
|
Jumlah_Balita
|
Jumlah balita (populasi berisiko, dipakai sebagai offset)
|
Offset
|
|
IDL
|
Cakupan Imunisasi Dasar Lengkap (%)
|
Prediktor
|
|
VIT
|
Cakupan pemberian Vitamin A pada balita (%)
|
Prediktor
|
|
BGK
|
Persentase balita dengan berat kurang / gizi kurang (%)
|
Prediktor
|
|
BBLR
|
Persentase Bayi Berat Lahir Rendah (%)
|
Prediktor
|
|
PHBS
|
Cakupan Perilaku Hidup Bersih dan Sehat (%)
|
Prediktor
|
|
RS
|
Persentase Rumah Sehat / memenuhi syarat (%)
|
Prediktor
|
Ukuran Epidemiologi. \[
IR=\frac{O_i}{P_i}\times 100{.}000, \quad E_i=P_i\times\frac{\sum
O}{\sum P}, \quad SIR_i=\frac{O_i}{E_i} \] dengan \(O_i\) kasus teramati, \(P_i\) populasi balita berisiko. SIR > 1
mengindikasikan risiko di atas rata-rata kota (Clayton & Kaldor,
1987).
Disease mapping. Peta risiko kasar (crude SIR) dan
penghalusan Empirical Bayes menggunakan estimator global berdasarkan
metode Marshall (1991) untuk menstabilkan estimasi pada wilayah
berpopulasi kecil. Autokorelasi spasial diuji dengan Moran’s I (Moran,
1950; Cliff & Ord, 1981)
Spasio-temporal. Pemodelan dilakukan bertahap: (1)
NB-GLM dengan efek tetap (covariate + efek tahun, offset jumlah balita);
(2) uji Moran’s I pada residual; (3) NB Mixed Model dengan efek acak
kecamatan bila terdapat heterogenitas antarwilayah; dan (4) model
Spatio-Temporal NB eksplisit hanya bila residual masih menunjukkan pola
spasio-temporal. Model Negative Binomial dipilih karena data cacahan
penyakit umumnya overdispersi (Hilbe, 2012).
Model NB dinyatakan sebagai \(\log(\mu_{it}) = \log(P_{it}) + \beta_0 + \sum_k
\beta_k X_{k,it} + \sum_t \gamma_t \text{Tahun}_t\), dengan
eksponen koefisien ditafsirkan sebagai incidence rate ratio
(IRR); pada model campuran ditambahkan efek acak kecamatan \(u_i \sim N(0,\sigma^2)\).
Hasil dan
Pembahasan
Analisis
Deskriptif
Berdasarkan data yang disajikan pada Tabel 2, jumlah kasus pneumonia
balita di Kota Bandung menurun dari 10.735 kasus pada 2017 menjadi 2.003
kasus pada 2021. Tren penurunan ini tercermin pula pada incidence
rate (IR) per 100.000 balita, yang menurun dari tahun ke tahun.
Berbeda dengan tren total kasus yang menurun, populasi balita
menunjukkan pergerakan yang fluktuatif. Populasi tertinggi tercatat pada
tahun 2019 (254,780 balita) dan mengalami penurunan signifikan pada
tahun 2020 (152,928 balita) sebelum kembali meningkat pada tahun 2021
(175,614 balita).
Tabel 2. Ringkasan kasus & populasi balita per tahun.
|
Tahun
|
Total_Kasus
|
Total_Balita
|
IR_kota
|
|
2017
|
10735
|
202758
|
5294.5
|
|
2018
|
10525
|
199679
|
5271.0
|
|
2019
|
9716
|
254780
|
3813.5
|
|
2020
|
4075
|
152928
|
2664.7
|
|
2021
|
2003
|
175614
|
1140.6
|
Jumlah kasus pneumonia balita di Kota Bandung menurun dari 10.735
kasus pada 2017 menjadi 2.003 kasus pada 2021, dengan penurunan tajam
pada tahun 2020-2021 seiring dengan menurunnya jumlah kunjungan
masyarakat ke fasilitas kesehatan akibat pandemi COVID-19 (Dinas
Kesehatan Kota Bandung, 2016). Tren total kasus pneumonia balita dari
tahun 2017 hingga 2021 dapat dilihat pada Gambar 1.
Ukuran Epidemiologi
(IR & SIR)
SIR per Kecamatan
Seluruh Tahun
Untuk melihat sebaran risiko relatif pneumonia pada balita secara
lebih spesifik di tingkat kewilayahan, dilakukan analisis terhadap nilai
Standardized Incidence Ratio (SIR) di 30 kecamatan dari tahun 2017
sampai dengan 2021 (Gambar 2). Nilai SIR digunakan untuk mengukur apakah
suatu wilayah memiliki jumlah kasus yang lebih tinggi (\(\text{SIR} > 1\)) atau lebih rendah
(\(\text{SIR} < 1\)) dibandingkan
dengan rata-rata wilayah secara keseluruhan dalam hal ini rata-rata
kasus Pneumonia Balita kota Bandung.
Dari Gambar 2 terlihat bahwa Cinambo dan Bandung Kidul secara
konsisten memiliki SIR tinggi (di atas 1) sepanjang tahun, menandakan
risiko pneumonia balita di kedua kecamatan ini lebih tinggi dibandingkan
rata-rata Kota Bandung. Sebaliknya, sejumlah kecamatan yang berwarna
biru dari 2017-2021 menunjukkan SIR rendah (di bawah 1). Terdapat pula
anomali pada Kecamatan Cicendo yang memiliki SIR sangat tinggi pada 2017
(5,31) namun turun drastis pada 2021 (0,07), pola yang perlu ditelusuri
lebih lanjut dan konsisten dengan dugaan gangguan pelaporan selama
pandemi.
10
Kecamatan SIR Tertinggi per Tahun
Sepuluh kecamatan dengan SIR tertinggi untuk tiap tahun (klik tab
tahun). SIR > 1 menandakan risiko di atas rata-rata kota.
2017
Sepuluh kecamatan SIR tertinggi, 2017.
|
Kecamatan
|
Kasus
|
Balita
|
IR
|
Expected
|
SIR
|
|
Cicendo
|
1583
|
7928
|
19967.2
|
298.0
|
5.31
|
|
Bandung Kidul
|
860
|
4813
|
17868.3
|
180.9
|
4.75
|
|
Andir
|
913
|
8624
|
10586.7
|
324.2
|
2.82
|
|
Cinambo
|
201
|
2019
|
9955.4
|
75.9
|
2.65
|
|
Sukasari
|
499
|
6128
|
8143.0
|
230.3
|
2.17
|
|
Panyileukan
|
244
|
3163
|
7714.2
|
118.9
|
2.05
|
|
Astanaanyar
|
445
|
6228
|
7145.2
|
234.1
|
1.90
|
|
Gedebage
|
200
|
3172
|
6305.2
|
119.2
|
1.68
|
|
Babakan Ciparay
|
666
|
11036
|
6034.8
|
414.8
|
1.61
|
|
Cidadap
|
265
|
4406
|
6014.5
|
165.6
|
1.60
|
2018
Sepuluh kecamatan SIR tertinggi, 2018.
|
Kecamatan
|
Kasus
|
Balita
|
IR
|
Expected
|
SIR
|
|
Andir
|
1155
|
8494
|
13597.8
|
319.3
|
3.62
|
|
Bandung Kidul
|
578
|
4740
|
12194.1
|
178.2
|
3.24
|
|
Cicendo
|
871
|
7808
|
11155.2
|
293.5
|
2.97
|
|
Sumur Bandung
|
277
|
2960
|
9358.1
|
111.3
|
2.49
|
|
Sukasari
|
563
|
6035
|
9328.9
|
226.9
|
2.48
|
|
Bojongloa Kidul
|
544
|
6938
|
7840.9
|
260.8
|
2.09
|
|
Cibeunying Kidul
|
709
|
9082
|
7806.7
|
341.4
|
2.08
|
|
Bandung Kulon
|
832
|
10875
|
7650.6
|
408.8
|
2.04
|
|
Cinambo
|
152
|
1988
|
7645.9
|
74.7
|
2.03
|
|
Panyileukan
|
190
|
3115
|
6099.5
|
117.1
|
1.62
|
2019
Sepuluh kecamatan SIR tertinggi, 2019.
|
Kecamatan
|
Kasus
|
Balita
|
IR
|
Expected
|
SIR
|
|
Bandung Kulon
|
1107
|
13635
|
8118.8
|
512.5
|
2.16
|
|
Cinambo
|
158
|
2493
|
6337.7
|
93.7
|
1.69
|
|
Cicendo
|
560
|
9790
|
5720.1
|
368.0
|
1.52
|
|
Panyileukan
|
284
|
5349
|
5309.4
|
201.1
|
1.41
|
|
Bojongloa Kidul
|
455
|
8698
|
5231.1
|
327.0
|
1.39
|
|
Sukasari
|
383
|
7567
|
5061.5
|
284.4
|
1.35
|
|
Cibeunying Kidul
|
575
|
11389
|
5048.7
|
428.1
|
1.34
|
|
Andir
|
530
|
10650
|
4976.5
|
400.3
|
1.32
|
|
Astanaanyar
|
354
|
7691
|
4602.8
|
289.1
|
1.22
|
|
Sumur Bandung
|
170
|
3711
|
4581.0
|
139.5
|
1.22
|
2020
Sepuluh kecamatan SIR tertinggi, 2020.
|
Kecamatan
|
Kasus
|
Balita
|
IR
|
Expected
|
SIR
|
|
Cinambo
|
171
|
1714
|
9976.7
|
64.4
|
2.65
|
|
Bandung Kidul
|
226
|
3709
|
6093.3
|
139.4
|
1.62
|
|
Bandung Kulon
|
472
|
8556
|
5516.6
|
321.6
|
1.47
|
|
Astanaanyar
|
184
|
4094
|
4494.4
|
153.9
|
1.20
|
|
Cicendo
|
241
|
5524
|
4362.8
|
207.6
|
1.16
|
|
Bojongloa Kidul
|
213
|
5538
|
3846.2
|
208.2
|
1.02
|
|
Andir
|
219
|
5745
|
3812.0
|
216.0
|
1.01
|
|
Sumur Bandung
|
75
|
1982
|
3784.1
|
74.5
|
1.01
|
|
Cibeunying Kidul
|
244
|
6785
|
3596.2
|
255.0
|
0.96
|
|
Panyileukan
|
80
|
2475
|
3232.3
|
93.0
|
0.86
|
2021
Sepuluh kecamatan SIR tertinggi, 2021.
|
Kecamatan
|
Kasus
|
Balita
|
IR
|
Expected
|
SIR
|
|
Cinambo
|
126
|
1948
|
6468.2
|
73.2
|
1.72
|
|
Bandung Kidul
|
191
|
4296
|
4446.0
|
161.5
|
1.18
|
|
Arcamanik
|
174
|
5696
|
3054.8
|
214.1
|
0.81
|
|
Babakan Ciparay
|
212
|
10661
|
1988.6
|
400.7
|
0.53
|
|
Astanaanyar
|
85
|
4594
|
1850.2
|
172.7
|
0.49
|
|
Lengkong
|
65
|
4245
|
1531.2
|
159.6
|
0.41
|
|
Sumur Bandung
|
34
|
2259
|
1505.1
|
84.9
|
0.40
|
|
Bojongloa Kidul
|
89
|
6245
|
1425.1
|
234.7
|
0.38
|
|
Andir
|
88
|
6630
|
1327.3
|
249.2
|
0.35
|
|
Bojongloa Kaler
|
118
|
8924
|
1322.3
|
335.4
|
0.35
|
Disease Mapping: Crude SIR & Empirical Bayes
Peta crude SIR dan hasil penghalusan Empirical Bayes ditampilkan
untuk seluruh tahun. EB menstabilkan estimasi pada kecamatan berpopulasi
kecil sehingga pola risiko lebih andal. Setiap kecamatan diberi nomor
pada peta; keterangan nomor tercantum pada kotak di bawah.
Keterangan nomor wilayah pada peta.
|
No
|
Kecamatan
|
No
|
Kecamatan
|
|
1
|
Andir
|
16
|
Cicendo
|
|
2
|
Antapani
|
17
|
Cidadap
|
|
3
|
Arcamanik
|
18
|
Cinambo
|
|
4
|
Astanaanyar
|
19
|
Coblong
|
|
5
|
Babakan Ciparay
|
20
|
Gedebage
|
|
6
|
Bandung Kidul
|
21
|
Kiaracondong
|
|
7
|
Bandung Kulon
|
22
|
Lengkong
|
|
8
|
Bandung Wetan
|
23
|
Mandalajati
|
|
9
|
Batununggal
|
24
|
Panyileukan
|
|
10
|
Bojongloa Kaler
|
25
|
Rancasari
|
|
11
|
Bojongloa Kidul
|
26
|
Regol
|
|
12
|
Buahbatu
|
27
|
Sukajadi
|
|
13
|
Cibeunying Kaler
|
28
|
Sukasari
|
|
14
|
Cibeunying Kidul
|
29
|
Sumur Bandung
|
|
15
|
Cibiru
|
30
|
Ujungberung
|
2017

2018

2019

2020

2021

Perbandingan Crude
SIR vs EB-smoothed SIR
Secara visual, peta crude dan EB tampak serupa karena penyesuaian
Empirical Bayes umumnya kecil. Untuk melihat besarnya penyesuaian, tabel
berikut menyajikan lima kecamatan dengan selisih |crude − EB| terbesar
tiap tahun. Penyesuaian terbesar konsisten terjadi pada kecamatan
berpopulasi kecil (mis. Cinambo), sesuai prinsip EB yang menarik
estimasi wilayah kecil lebih kuat ke arah rata-rata kota.
Tabel 4. Lima kecamatan dengan penyesuaian Empirical Bayes terbesar per
tahun.
|
Tahun
|
Kecamatan
|
Balita
|
Crude_SIR
|
EB_SIR
|
Selisih
|
|
2017
|
Bandung Kidul
|
4813
|
4.75
|
4.73
|
0.02
|
|
Cinambo
|
2019
|
2.65
|
2.63
|
0.02
|
|
Andir
|
8624
|
2.82
|
2.81
|
0.01
|
|
Antapani
|
6259
|
0.40
|
0.41
|
0.01
|
|
Babakan Ciparay
|
11036
|
1.61
|
1.60
|
0.01
|
|
2018
|
Andir
|
8494
|
3.62
|
3.60
|
0.02
|
|
Bandung Wetan
|
2578
|
0.77
|
0.79
|
0.02
|
|
Sumur Bandung
|
2960
|
2.49
|
2.47
|
0.02
|
|
Bandung Kidul
|
4740
|
3.24
|
3.23
|
0.01
|
|
Bandung Kulon
|
10875
|
2.04
|
2.03
|
0.01
|
|
2019
|
Cinambo
|
2493
|
1.69
|
1.64
|
0.05
|
|
Bandung Wetan
|
3234
|
0.69
|
0.71
|
0.02
|
|
Antapani
|
7729
|
0.74
|
0.75
|
0.01
|
|
Bandung Kulon
|
13635
|
2.16
|
2.15
|
0.01
|
|
Batununggal
|
12188
|
0.58
|
0.59
|
0.01
|
|
2020
|
Cinambo
|
1714
|
2.65
|
2.54
|
0.11
|
|
Bandung Wetan
|
1496
|
0.25
|
0.28
|
0.03
|
|
Astanaanyar
|
4094
|
1.20
|
1.18
|
0.02
|
|
Bandung Kidul
|
3709
|
1.62
|
1.60
|
0.02
|
|
Sumur Bandung
|
1982
|
1.01
|
0.99
|
0.02
|
|
2021
|
Cinambo
|
1948
|
1.72
|
1.64
|
0.08
|
|
Bandung Kidul
|
4296
|
1.18
|
1.16
|
0.02
|
|
Bandung Wetan
|
1653
|
0.06
|
0.08
|
0.02
|
|
Arcamanik
|
5696
|
0.81
|
0.80
|
0.01
|
|
Buahbatu
|
7303
|
0.12
|
0.13
|
0.01
|
Interpretasi. Selisih crude vs EB kecil di sebagian
besar kecamatan, dengan penyesuaian terbesar pada wilayah berpopulasi
kecil seperti Cinambo. Kemiripan crude dan EB menunjukkan estimasi
risiko di sebagian besar kecamatan sudah stabil, sehingga pola yang
teramati mencerminkan variasi risiko yang nyata dan bukan
ketidakstabilan akibat populasi kecil.
Uji Moran’s I per
Tahun
Tabel 5. Moran’s I SIR pneumonia balita per tahun
|
Tahun
|
Moran_I
|
p_value
|
|
2017
|
-0.012
|
0.393
|
|
2018
|
0.005
|
0.317
|
|
2019
|
-0.015
|
0.413
|
|
2020
|
0.007
|
0.347
|
|
2021
|
-0.026
|
0.430
|
Interpretasi. Uji Moran’s I pada SIR menunjukkan
tidak ada autokorelasi spasial yang signifikan pada seluruh tahun yang
digunakan pada makalah ini (p > 0,05, dengan nilai Moran’s I
mendekati nol). Hal ini menandakan bahwa dalam satu tahun tertentu,
risiko pneumonia balita tidak mengelompok secara geografis, dengan kata
lain kecamatan berisiko tinggi tersebar tanpa pola spasial yang jelas.
Temuan ini konsisten dengan sebaran kecamatan berisiko tinggi (seperti
Cicendo, Cinambo dan Bandung Kidul) yang secara geografis tidak
berdekatan.
Uji Moran’s I
Spasio-Temporal
Selain Moran’s I per tahun (murni spasial), diuji pula autokorelasi
spasio-temporal melalui perluasan indeks Moran dengan bobot gabungan
ruang dan waktu (Lee & Li, 2017). Dua unit kecamatan-tahun dianggap
bertetangga spasio-temporal bila berada di kecamatan yang bersebelahan
dan pada tahun yang sama atau berdekatan (selisih satu tahun). Uji ini
menilai apakah SIR tinggi mengelompok tidak hanya secara geografis,
tetapi juga terbawa dari tahun ke tahun.
## Moran's I spasio-temporal: 0.186 | p-value (permutasi): 0.001
Interpretasi. Uji Moran’s I spasial per tahun
menunjukkan tidak adanya autokorelasi spasial yang signifikan (p >
0,05 pada seluruh tahun, dengan nilai mendekati nol). Sebaliknya,
Moran’s I spasio-temporal bernilai 0,186 dan signifikan (p = 0,001).
Kontras ini menandakan bahwa autokorelasi pada data pneumonia balita
didominasi oleh dimensi temporal, bukan spasial. Risiko suatu kecamatan
lebih persisten antarwaktu daripada mengelompok secara geografis dalam
satu tahun.
Pemodelan
Bertingkat
Pemodelan dilakukan secara bertingkat mengikuti prinsip parsimoni:
dimulai dari model paling sederhana, lalu ditingkatkan hanya bila
diagnostik residual menunjukkan kebutuhan. Tahapannya: (1)
NB-GLM dengan efek tetap; (2) uji Moran
residual untuk memeriksa pola spasial tersisa; (3) NB
Mixed Model dengan efek acak kecamatan bila diperlukan; dan (4)
model Spatio-Temporal NB hanya bila residual masih
menunjukkan pola spasio-temporal.
## Jumlah observasi (kecamatan-tahun): 150
## Rasio dispersi (Poisson): 93.47 -> overdispersi bila > 1, mendukung Negative Binomial
Tahap 1 — NB-GLM
(Efek Tetap)
Model Negative Binomial dengan efek tetap: enam covariate cakupan
program kesehatan dan efek tahun, dengan
offset(log(Balita)).
Tabel 6. IRR covariate — NB-GLM (Tahap 1).
|
Variabel
|
IRR
|
CI_2.5
|
CI_97.5
|
p_value
|
|
IDL
|
1.0026
|
0.9928
|
1.0124
|
0.606
|
|
VIT
|
1.0103
|
1.0023
|
1.0184
|
0.012
|
|
BGK
|
1.0709
|
1.0236
|
1.1204
|
0.003
|
|
BBLR
|
1.0180
|
1.0013
|
1.0350
|
0.035
|
|
PHBS
|
1.0016
|
0.9945
|
1.0088
|
0.654
|
|
RS
|
0.9943
|
0.9847
|
1.0039
|
0.242
|
Tabel 7. IRR efek tahun — NB-GLM (ref = 2017).
|
|
IRR
|
CI_2.5%
|
CI_97.5%
|
|
Tahun 2018
|
0.808
|
0.536
|
1.217
|
|
Tahun 2019
|
0.562
|
0.384
|
0.824
|
|
Tahun 2020
|
0.360
|
0.235
|
0.553
|
|
Tahun 2021
|
0.154
|
0.097
|
0.246
|
Interpretasi. Pada NB-GLM, gizi kurang (IRR=1,071,
p=0,003), vitamin A (IRR=1,010, p=0,012), dan BBLR (IRR=1,018, p=0,035)
tampak signifikan. Namun arah IRR vitamin A yang positif tidak sesuai
ekspektasi teoretis (kemungkinan bias ekologis). Efek tahun menurun
progresif (IRR 2021 = 0,154), signifikan sejak 2019; penurunan tajam
2020–2021 kemungkinan akibat pelaporan masa pandemi.
Tahap 2 — Uji Moran
Residual (NB-GLM)
Diperiksa apakah residual NB-GLM masih memuat autokorelasi spasial
per tahun. Bila signifikan (p < 0,05), model perlu ditingkatkan
(Tahap 3).
Tabel 8. Moran’s I residual NB-GLM per tahun.
|
Tahun
|
Moran_I
|
p_value
|
Kesimpulan
|
|
2017
|
0.100
|
0.127
|
Residual acak (memadai)
|
|
2018
|
-0.034
|
0.464
|
Residual acak (memadai)
|
|
2019
|
-0.151
|
0.851
|
Residual acak (memadai)
|
|
2020
|
0.035
|
0.271
|
Residual acak (memadai)
|
|
2021
|
-0.014
|
0.381
|
Residual acak (memadai)
|
Keputusan. Uji Moran’s I pada residual NB-GLM
menunjukkan residual yang acak secara spasial pada seluruh tahun (p >
0,05, nilai Moran’s I mendekati nol). Model efek tetap tidak menyisakan
autokorelasi spasial, sehingga model spasial eksplisit (CAR/BYM) tidak
diperlukan. Pemodelan tetap dilanjutkan ke NB Mixed Model untuk
mengakomodir kemungkinan heterogenitas risiko antarkecamatan.
Tahap 3 — NB Mixed
Model (Random Effect Kecamatan)
Sebagai peningkatan, ditambahkan efek acak kecamatan (random
intercept) untuk mengakomodir heterogenitas antarwilayah dan “meminjam
kekuatan” antarunit. Model NB campuran diestimasi dengan
glmmTMB.
## Simpangan baku efek acak kecamatan: 0.514 (0 = tak ada variasi antarwilayah tersisa)
Tabel 9. IRR covariate — NB Mixed Model (Tahap 3).
|
Variabel
|
IRR
|
p_value
|
|
IDL
|
0.9953
|
0.231
|
|
VIT
|
1.0031
|
0.397
|
|
BGK
|
1.0110
|
0.587
|
|
BBLR
|
1.0117
|
0.066
|
|
PHBS
|
1.0056
|
0.101
|
|
RS
|
1.0047
|
0.437
|
##
## Perbandingan AIC: NB-GLM = 1843.6 | NB Mixed = 1788.4
## (model dengan AIC lebih rendah lebih didukung)
Tabel 10. Moran’s I residual NB Mixed Model per tahun.
|
Tahun
|
Moran_I
|
p_value
|
Kesimpulan
|
|
2017
|
0.028
|
0.288
|
Residual acak (memadai)
|
|
2018
|
-0.148
|
0.842
|
Residual acak (memadai)
|
|
2019
|
-0.044
|
0.521
|
Residual acak (memadai)
|
|
2020
|
0.036
|
0.242
|
Residual acak (memadai)
|
|
2021
|
-0.039
|
0.492
|
Residual acak (memadai)
|
Keputusan. NB Mixed Model memberikan kecocokan jauh
lebih baik daripada NB-GLM (AIC 1788,4 vs 1843,6; selisih 55,2 poin),
dengan simpangan baku efek acak kecamatan 0,514 yang menunjukkan
heterogenitas risiko antarwilayah substansial. Setelah efek acak
dimasukkan, tidak ada covariate yang signifikan pada alpha 5% (Namun
BBLR signifikan pada alpha 10%). Residual Mixed Model acak secara
spasial di seluruh tahun (p > 0,05), sehingga model NB-Mixed Model
dinilai memadai dan dipilih sebagai model final.
Peta Risiko Wilayah
(dari NB Mixed Model)
Interpretasi & wilayah prioritas. Peta efek acak
kecamatan (Gambar 3) menggambarkan risiko relatif pneumonia balita
antarwilayah selama periode 2017-2021, setelah mengontrol efek tahun.
Kecamatan Cinambo dan Bandung Kidul menunjukkan risiko relatif tertinggi
(berwarna merah), sedangkan sebagian besar kecamatan lainnya berada di
sekitar atau di bawah rata-rata kota. Kecamatan berisiko tinggi tersebar
secara geografis dan tidak membentuk klaster konsisten dengan hasil uji
Moran’s I spasial yang tidak signifikan. Pola ini menegaskan bahwa
variasi risiko pneumonia balita di Kota Bandung bersifat antarwilayah
(heterogenitas lokal) alih-alih mengelompok secara spasial, sehingga
Cinambo dan Bandung Kidul menjadi kandidat prioritas intervensi berbasis
wilayah.
Implikasi
Temuan analisis ini memiliki beberapa implikasi. Peta risiko relatif
kecamatan mengidentifikasi Cinambo dan Bandung Kidul sebagai wilayah
dengan risiko pneumonia balita yang tinggi dan konsisten sepanjang
periode, sehingga keduanya menjadi kandidat prioritas untuk penguatan
surveilans, penemuan kasus dini, dan intervensi kesehatan. Karena
determinan program kesehatan tidak menunjukkan asosiasi yang signifikan
pada tingkat agregat kecamatan sementara variasi risiko antarwilayah
justru substansial, pengendalian pneumonia balita sebaiknya diarahkan
secara berbasis wilayah, memfokuskan sumber daya pada kecamatan berisiko
tinggi ketimbang hanya menaikkan cakupan program secara merata di
seluruh kota. Analisis ini memiliki sejumlah keterbatasan. Pertama,
jumlah balita yang digunakan sebagai penyebut merupakan angka
sasaran/estimasi yang dapat berbeda dari populasi riil. Kedua, data
kasus bersumber dari pelaporan fasilitas pelayanan kesehatan yang rentan
terhadap perbedaan cakupan pencatatan, hal ini sangat menonjol pada
2020–2021, ketika penurunan kasus kemungkinan besar mencerminkan
gangguan penemuan dan pelaporan selama pandemi COVID-19 sebagaimana
dinyatakan dalam Profil Kesehatan Kota Bandung, bukan penurunan beban
penyakit yang sesungguhnya. Ketiga, model menggunakan efek acak
kecamatan yang bersifat independen, adanya indikasi bahwa risiko dasar
antarwilayah cenderung mengelompok secara spasial menunjukkan bahwa
pemodelan dengan struktur spasial eksplisit (seperti CAR atau BYM) dapat
menjadi pengembangan yang lebih tepat pada studi lanjutan dan keempat,
dalam makalah hanya menggunakan 5 tahun sebaiknya ditambahkan informasi
tahun terupdate.
Kesimpulan
Insidens pneumonia balita yang tercatat di Kota Bandung menurun tajam
sepanjang 2017–2021, dari 10.735 kasus (IR 5.294 per 100.000 balita)
menjadi 2.003 kasus (IR 1.141), dengan penurunan terbesar pada masa
pandemi yang kemungkinan dipengaruhi gangguan pelaporan. Analisis SIR
dan penghalusan Empirical Bayes membantu mengidentifikasi kecamatan
berisiko tinggi secara lebih andal, dengan Cinambo dan Bandung Kidul
konsisten menunjukkan risiko di atas rata-rata kota. Uji autokorelasi
menunjukkan pola yang khas: Moran’s I spasial per tahun lemah dan tidak
signifikan, sementara Moran’s I spasio-temporal signifikan (0,186; p =
0,001), menandakan bahwa dinamika risiko lebih digerakkan oleh dimensi
temporal daripada pengelompokan geografis dalam satu tahun. Melalui
pemodelan bertingkat, NB Mixed Model dengan efek acak kecamatan terpilih
sebagai model terbaik (AIC 1788,4 vs 1843,6), dengan simpangan baku efek
acak 0,514 yang menegaskan heterogenitas risiko antarwilayah. Hanya satu
covariate cakupan program kesehatan yang berasosiasi signifikan pada
model final (menggunakan alpha 10%), yang mengindikasikan determinan
program tidak menunjukkan asosiasi kuat di tingkat agregat kecamatan.
Pengendalian pneumonia balita di Kota Bandung sebaiknya diarahkan
berbasis wilayah dengan memprioritaskan kecamatan berisiko tinggi
seperti Cinambo dan Bandung Kidul, disertai penguatan sistem pencatatan
dan pelaporan kasus agar data lebih mencerminkan beban penyakit yang
sesungguhnya.
Daftar Pustaka
- Brooks, M. E., et al. (2017). glmmTMB balances speed and flexibility
among packages for zero-inflated generalized linear mixed models. The R
Journal
- Clayton, D., & Kaldor, J. (1987). Empirical Bayes estimates of
age-standardized relative risks for use in disease mapping.
Biometrics
- Cliff, A. D., & Ord, J. K. (1981). Spatial processes: Models and
applications. London: Pion.
- Dinas Kesehatan Kota Bandung. (2016). Profil Kesehatan Kota Bandung
Tahun 2016. Bandung: Dinas Kesehatan Kota Bandung.
- Dinas Kesehatan Kota Bandung. (2021). Profil Kesehatan Kota Bandung
Tahun 2021. Bandung: Dinas Kesehatan Kota Bandung.
- Hilbe, J. M. (2012). Negative Binomial Regression (2nd ed.).
Cambridge: Cambridge University Press.
- Kementerian Kesehatan Republik Indonesia. (2023). Pemerintah
berkomitmen turunkan kasus kematian akibat pneumonia. Jakarta: Kemenkes
RI. Diakses dari https://www.kemkes.go.id/id/%20pemerintah-berkomitmen-turunkan-kasus-kematian-akibat-pneumonia
- Lee, J., & Li, S. (2017). Extending Moran’s index for measuring
spatiotemporal clustering of geographic events. Geographical
Analysis
- Marshall, R. J. (1991). Mapping disease and mortality rates using
empirical Bayes estimators. Journal of the Royal Statistical Society:
Series C (Applied Statistics)
- Moran, P. A. P. (1950). Notes on continuous stochastic phenomena.
Biometrika
- World Health Organization. (2022). Pneumonia in children. Geneva:
WHO. Diakses dari https://www.who.int/news-room/fact-sheets/detail/pneumonia
Informasi sesi R
## 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] glmmTMB_1.1.14 patchwork_1.3.2 scales_1.4.0 MASS_7.3-65
## [5] kableExtra_1.4.0 knitr_1.51 spdep_1.4-2 spData_2.3.5
## [9] sf_1.1-1 readxl_1.5.0 lubridate_1.9.5 forcats_1.0.1
## [13] stringr_1.6.0 dplyr_1.2.1 purrr_1.2.2 readr_2.2.0
## [17] tidyr_1.3.2 tibble_3.3.1 ggplot2_4.0.3 tidyverse_2.0.0
##
## loaded via a namespace (and not attached):
## [1] tidyselect_1.2.1 viridisLite_0.4.3 farver_2.1.2
## [4] S7_0.2.2 fastmap_1.2.0 digest_0.6.39
## [7] timechange_0.4.0 lifecycle_1.0.5 magrittr_2.0.5
## [10] compiler_4.5.2 rlang_1.2.0 sass_0.4.10
## [13] tools_4.5.2 igraph_2.3.2 yaml_2.3.12
## [16] labeling_0.4.3 sp_2.2-1 classInt_0.4-11
## [19] xml2_1.5.2 RColorBrewer_1.1-3 KernSmooth_2.23-26
## [22] numDeriv_2016.8-1.1 withr_3.0.2 grid_4.5.2
## [25] e1071_1.7-17 cli_3.6.6 rmarkdown_2.31
## [28] reformulas_0.4.4 generics_0.1.4 otel_0.2.0
## [31] rstudioapi_0.19.0 tzdb_0.5.0 minqa_1.2.8
## [34] DBI_1.3.0 cachem_1.1.0 proxy_0.4-29
## [37] splines_4.5.2 s2_1.1.11 cellranger_1.1.0
## [40] vctrs_0.7.3 sandwich_3.1-1 boot_1.3-32
## [43] Matrix_1.7-4 jsonlite_2.0.0 hms_1.1.4
## [46] systemfonts_1.3.2 jquerylib_0.1.4 units_1.0-1
## [49] glue_1.8.1 nloptr_2.2.1 stringi_1.8.7
## [52] gtable_0.3.6 deldir_2.0-4 lme4_2.0-1
## [55] pillar_1.11.1 htmltools_0.5.9 R6_2.6.1
## [58] TMB_1.9.21 wk_0.9.5 textshaping_1.0.5
## [61] Rdpack_2.6.6 evaluate_1.0.5 lattice_0.22-7
## [64] rbibutils_2.4.1 bslib_0.11.0 class_7.3-23
## [67] Rcpp_1.1.1-1.1 svglite_2.2.2 nlme_3.1-168
## [70] mgcv_1.9-3 xfun_0.58 zoo_1.8-15
## [73] pkgconfig_2.0.3
LS0tDQp0aXRsZTogIkFuYWxpc2lzIERpc2Vhc2UgTWFwcGluZyBkYW4gU3Bhc2lvLVRlbXBvcmFsIFBuZXVtb25pYSBCYWxpdGEgZGkgS290YSBCYW5kdW5nIg0KYXV0aG9yOiAiV2luYWxpYSBBZ3dpbCAoMjUwMjMwMjUwMDA3KSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVkICVCICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOg0KICAgICAgdmVyc2lvbjogNQ0KICAgICAgYm9vdHN3YXRjaDogY29zbW8NCiAgICAgIHByaW1hcnk6ICIjMWE2OTg1Ig0KICAgICAgYmFzZV9mb250OiB7IGdvb2dsZTogIkludGVyIiB9DQogICAgICBoZWFkaW5nX2ZvbnQ6IHsgZ29vZ2xlOiAiUG9wcGlucyIgfQ0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogeyBjb2xsYXBzZWQ6IGZhbHNlIH0NCiAgICB0b2NfZGVwdGg6IDMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgZGZfcHJpbnQ6IGRlZmF1bHQNCiAgICBmaWdfY2FwdGlvbjogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwNCiAgZmlnLmFsaWduPSJjZW50ZXIiLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD01LCBkcGk9MTUwLCBvdXQud2lkdGg9IjEwMCUiKQ0Kb3B0aW9ucyhzY2lwZW49OTk5KQ0Kc2V0LnNlZWQoMTIzKQ0KYGBgDQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQpib2R5eyBsaW5lLWhlaWdodDoxLjc7IH0gcHsgdGV4dC1hbGlnbjpqdXN0aWZ5OyB9DQpoMSxoMixoM3sgdGV4dC1hbGlnbjpsZWZ0OyB9DQouaW5mb2JveHsgYmFja2dyb3VuZDojZjRmOGZhOyBib3JkZXItbGVmdDo1cHggc29saWQgIzFhNjk4NTsgcGFkZGluZzoxNHB4IDE4cHg7IGJvcmRlci1yYWRpdXM6OHB4OyBtYXJnaW46MTZweCAwOyB9DQpjYXB0aW9ueyBjYXB0aW9uLXNpZGU6dG9wICFpbXBvcnRhbnQ7IHRleHQtYWxpZ246bGVmdDsgZm9udC13ZWlnaHQ6NjAwOyBjb2xvcjojMzMzOyBwYWRkaW5nLWJvdHRvbTo2cHg7IH0NCmBgYA0KDQpgYGB7ciBsaWJyYXJ5fQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHNwZGVwKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGdsbW1UTUIpDQpgYGANCg0KIyBBYnN0cmFrIHsjYWJzdHJha30NCg0KUG5ldW1vbmlhIG1lcnVwYWthbiBzYWxhaCBzYXR1IHBlbnllYmFiIHV0YW1hIGtlbWF0aWFuIHBhZGEgYmFsaXRhLiBQZW5lbGl0aWFuIGluaSBtZW1ldGFrYW4gc2ViYXJhbiByaXNpa28gZGFuIG1lbmdhbmFsaXNpcyBkaW5hbWlrYSBzcGFzaW8tdGVtcG9yYWwgaW5zaWRlbnMgcG5ldW1vbmlhIGJhbGl0YSBkaSAzMCBrZWNhbWF0YW4gS290YSBCYW5kdW5nIHNlbGFtYSAyMDE34oCTMjAyMS4gRGF0YSBrYXN1cywganVtbGFoIGJhbGl0YSwgZGFuIGVuYW0gaW5kaWthdG9yIGNha3VwYW4gcHJvZ3JhbSBrZXNlaGF0YW4gYmVyc3VtYmVyIGRhcmkgUHJvZmlsIEtlc2VoYXRhbiBLb3RhIEJhbmR1bmcuIFJpc2lrbyBkaXVrdXIgZGVuZ2FuIGluY2lkZW5jZSByYXRlIChJUikgZGFuIHN0YW5kYXJkaXplZCBpbmNpZGVuY2UgcmF0aW8gKFNJUikgeWFuZyBkaWhhbHVza2FuIGRlbmdhbiBFbXBpcmljYWwgQmF5ZXMsIGF1dG9rb3JlbGFzaSBkaXVqaSBkZW5nYW4gTW9yYW4ncyBJIHNwYXNpYWwgZGFuIHNwYXNpby10ZW1wb3JhbCwgZGFuIGRpbmFtaWthIHJpc2lrbyBkaW1vZGVsa2FuIHNlY2FyYSBiZXJ0aW5na2F0IGRhcmkgTmVnYXRpdmUgQmlub21pYWwgR0xNIGhpbmdnYSBOZWdhdGl2ZSBCaW5vbWlhbCBNaXhlZCBNb2RlbCBkZW5nYW4gZWZlayBhY2FrIGtlY2FtYXRhbi4gSnVtbGFoIGthc3VzIHRlcmNhdGF0IG1lbnVydW4gdGFqYW0sIGRhcmkgMTAuNzM1ICgyMDE3KSBtZW5qYWRpIDIuMDAzICgyMDIxKSwgZGVuZ2FuIHBlbnVydW5hbiB0ZXJiZXNhciBwYWRhIG1hc2EgcGFuZGVtaSB5YW5nIGtlbXVuZ2tpbmFuIG1lbmNlcm1pbmthbiBnYW5nZ3VhbiBwZWxhcG9yYW4uIEhhc2lsIHVqaSBNb3JhbidzIEkgc3Bhc2lhbCBwZXIgdGFodW4gdGlkYWsgc2lnbmlmaWthbiwgc2VkYW5na2FuIE1vcmFuJ3MgSSBzcGFzaW8tdGVtcG9yYWwgc2lnbmlmaWthbiAoMCwxODY7IHAgPSAwLDAwMSksIG1lbnVuanVra2FuIGRvbWluYXNpIGRpbWVuc2kgdGVtcG9yYWwuIE5CIE1peGVkIE1vZGVsIHRlcnBpbGloIHNlYmFnYWkgbW9kZWwgdGVyYmFpayAoQUlDIDE3ODgsNCB2cyAxODQzLDYpIGRlbmdhbiBzaW1wYW5nYW4gYmFrdSBlZmVrIGFjYWsga2VjYW1hdGFuIDAsNTE0IGRhbiByZXNpZHVhbCB5YW5nIGFjYWsgc2VjYXJhIHNwYXNpYWwuIFRpZGFrIGFkYSBjb3ZhcmlhdGUgcHJvZ3JhbSBrZXNlaGF0YW4geWFuZyBzaWduaWZpa2FuIChhbHBoYSA1JSkgcGFkYSBtb2RlbCBmaW5hbC4gS2VjYW1hdGFuIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwgdGVyaWRlbnRpZmlrYXNpIHNlYmFnYWkgd2lsYXlhaCBwcmlvcml0YXMuIFBlbmdlbmRhbGlhbiBwbmV1bW9uaWEgYmFsaXRhIGRpc2FyYW5rYW4gYmVyYmFzaXMgd2lsYXlhaCBkZW5nYW4gcGVuZ3VhdGFuIHBlbmNhdGF0YW4ga2FzdXMuDQoNCkthdGEga3VuY2k6IGRpc2Vhc2UgbWFwcGluZywgRW1waXJpY2FsIEJheWVzLCBOZWdhdGl2ZSBCaW5vbWlhbCBNaXhlZCBNb2RlbCwgcG5ldW1vbmlhIGJhbGl0YSwgIHNwYXNpby10ZW1wb3JhbA0KDQojIFBlbmRhaHVsdWFuIHsjcGVuZGFodWx1YW59DQoNClBuZXVtb25pYSBhZGFsYWggaW5mZWtzaSBzYWx1cmFuIHBlcm5hcGFzYW4gYWt1dCB5YW5nIG1lbnllcmFuZyBhbHZlb2xpLCBrYW50dW5nLWthbnR1bmcgdWRhcmEgZGkgcGFydS4gS2V0aWthIHRlcmluZmVrc2ksIGFsdmVvbGkgdGVyaXNpIGNhaXJhbiBhdGF1IG5hbmFoIHNlaGluZ2dhIHBlbmRlcml0YSBzdWxpdCBiZXJuYXBhcyBkYW4gYXN1cGFuIG9rc2lnZW5ueWEgYmVya3VyYW5nLiBQZW55YWtpdCBpbmkgbWVuamFkaSBwZW55ZWJhYiBrZW1hdGlhbiBtZW51bGFyIHRlcmJlc2FyIHBhZGEgYW5hayBkaSBkdW5pYTogcGFkYSAyMDE5LCBwbmV1bW9uaWEgbWVyZW5nZ3V0IDc0MC4xODAgYW5hayBkaSBiYXdhaCBsaW1hIHRhaHVuLCBhdGF1IDE0JSBkYXJpIHNlbHVydWgga2VtYXRpYW4gYmFsaXRhIGdsb2JhbCwgZGVuZ2FuIGJlYmFuIHRlcnRpbmdnaSBkaSBBc2lhIFNlbGF0YW4gZGFuIEFmcmlrYSBTdWItU2FoYXJhIChXSE8sIDIwMjIpLg0KDQpEaSBJbmRvbmVzaWEsIHBuZXVtb25pYSBtZW5qYWRpIHNhbGFoIHNhdHUgcGVueWViYWIgdXRhbWEga2VtYXRpYW4gYmFsaXRhLiBNZW51cnV0IEtlbWVudGVyaWFuIEtlc2VoYXRhbiwgcGVueWFraXQgaW5pIG1lcmVuZ2d1dCBsZWJpaCBiYW55YWsgbnlhd2EgYmFsaXRhIGRhcmlwYWRhIGdhYnVuZ2FuIEFJRFMsIG1hbGFyaWEsIGRhbiBjYW1wYWssIHNlaGluZ2dhIHBlbWVyaW50YWggbWVueXVzdW4gUmVuY2FuYSBBa3NpIE5hc2lvbmFsIFBlbmFuZ2d1bGFuZ2FuIFBuZXVtb25pYSBkYW4gRGlhcmUgMjAyMy0yMDMwIHVudHVrIG1lbmVrYW4gYW5na2Ega2VtYXRpYW4gKEtlbWVua2VzIFJJLCAyMDIzKS4gRGkgS290YSBCYW5kdW5nLCBwbmV1bW9uaWEgYmFsaXRhIGRpcGFudGF1IHNlY2FyYSBydXRpbiBtZWxhbHVpIGNha3VwYW4gcGVuZW11YW4gZGFuIHBlbmFuZ2FuYW4ga2FzdXMgcGVyIGtlY2FtYXRhbiAoRGluYXMgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZywgMjAyMSkuIFNlYmFnYWkga290YSBiZXNhciBkZW5nYW4gYXJ1cyB1cmJhbmlzYXNpIHRpbmdnaSwga2VwYWRhdGFuIHBlbmR1ZHVrIHlhbmcgYmVydmFyaWFzaSBhbnRhcndpbGF5YWgsIGRhbiBzdHJhdGEgc29zaWFsIGVrb25vbWkgeWFuZyBoZXRlcm9nZW4gKERpbmFzIEtlc2VoYXRhbiBLb3RhIEJhbmR1bmcsIDIwMTYpLCByaXNpa28gcG5ldW1vbmlhIGJhbGl0YSBkYXBhdCBiZXJiZWRhLWJlZGEgYW50YXJrZWNhbWF0YW4uDQoNCkp1bWxhaCBrYXN1cyBwbmV1bW9uaWEgYmFsaXRhIHlhbmcgdGVyY2F0YXQgZGkgS290YSBCYW5kdW5nIG1lbnVydW4gc2VsYW1hIDIwMTctMjAyMSAoR2FtYmFyIDEpLCBkYXJpIDEwLjczNSBrYXN1cyBwYWRhIDIwMTcgbWVuamFkaSAxMC41MjUgKDIwMTgpLCA5LjcxNiAoMjAxOSksIDQuMDc1ICgyMDIwKSwgZGFuIDIuMDAzIGthc3VzIHBhZGEgMjAyMSAoRGluYXMgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZywgMjAyMSkuIEFuZ2thIGFncmVnYXQgdGFodW5hbiBzZXBlcnRpIGluaSBtZW55ZW1idW55aWthbiBkdWEgaGFsOiBiYWdhaW1hbmEgcmlzaWtvIHRlcnNlYmFyIGFudGFya2VjYW1hdGFuLCBkYW4gYmFnYWltYW5hIHBvbGEgdGVyc2VidXQgYmVydWJhaCBkYXJpIHRhaHVuIGtlIHRhaHVuLiBQZW51cnVuYW4gdGFqYW0gcGFkYSAyMDIwLTIwMjEganVnYSBwZXJsdSBkaXRlbGFhaCBrYXJlbmEgYmVydGVwYXRhbiBkZW5nYW4gcGFuZGVtaSBDT1ZJRC0xOSB5YW5nIGRhcGF0IG1lbWVuZ2FydWhpIHBlbmVtdWFuIGRhbiBwZWxhcG9yYW4ga2FzdXMuIEFuYWxpc2lzIHNwYXNpby10ZW1wb3JhbCBtZW5qYXdhYiBrZWR1YW55YSBzZWthbGlndXM6IG1lbWV0YWthbiByaXNpa28gcGVyIGtlY2FtYXRhbiBkYW4gbWVuZWx1c3VyaSBwZXJ1YmFoYW5ueWEgYW50YXJ3YWt0dSwgc2VoaW5nZ2Egd2lsYXlhaCBkYW4gcGVyaW9kZSBiZXJpc2lrbyB0aW5nZ2kgZGFwYXQgZGlpZGVudGlmaWthc2kgbGViaWggdGVwYXQuDQoNCioqVHVqdWFuIGFuYWxpc2lzKio6ICgxKSBtZW5kZXNrcmlwc2lrYW4gc2ViYXJhbiBkYW4gdHJlbiBrYXN1cyBwbmV1bW9uaWEgYmFsaXRhIGFudGFya2VjYW1hdGFuDQpkaSBLb3RhIEJhbmR1bmc7ICgyKSBtZW5naGl0dW5nIHVrdXJhbiByaXNpa28gZXBpZGVtaW9sb2dpIChJUiBkYW4gU0lSKTsgKDMpIG1lbWV0YWthbg0KdmFyaWFzaSByaXNpa28gZGFuIG1lbmVyYXBrYW4gcGVuZ2hhbHVzYW4gc3Bhc2lhbDsgc2VydGEgKDQpIG1lbW9kZWxrYW4gZGluYW1pa2EgcmlzaWtvDQptZW51cnV0IHdpbGF5YWggZGFuIHdha3R1Lg0KDQojIERhdGEgZGFuIE1ldG9kZSB7I2RhdGEtbWV0b2RlfQ0KDQoqKlN1bWJlciBkYXRhLioqIEp1bWxhaCBrYXN1cyBwbmV1bW9uaWEgYmFsaXRhIGRhbiBqdW1sYWggYmFsaXRhIHBlciBrZWNhbWF0YW4gYmVyc3VtYmVyIGRhcmkNClByb2ZpbCBLZXNlaGF0YW4gS290YSBCYW5kdW5nIChEaW5hcyBLZXNlaGF0YW4gS290YSBCYW5kdW5nKS4gQmF0YXMgd2lsYXlhaCBrZWNhbWF0YW4NCmJlcnN1bWJlciBkYXJpIGRhdGEgR2VvSlNPTiBhZG1pbmlzdHJhc2kgS290YSBCYW5kdW5nLiBVbml0IGFuYWxpc2lzOiAzMCBrZWNhbWF0YW47IHBlcmlvZGU6DQoyMDE3LTIwMjEgKGxpbWEgdGFodW4sIDMwIGtlY2FtYXRhbiwgdG90YWwgMTUwIG9ic2VydmFzaSBrZWNhbWF0YW4tdGFodW4pLg0KDQoqKlZhcmlhYmVsIHBlbmVsaXRpYW4uKiogRGF0YSBtZW11YXQgdmFyaWFiZWwgcmVzcG9ucyAoanVtbGFoIGthc3VzIHBuZXVtb25pYSBiYWxpdGEpLCBwb3B1bGFzaQ0KYmVyaXNpa28gKGp1bWxhaCBiYWxpdGEpLCBzZXJ0YSBlbmFtIGNvdmFyaWF0ZSBjYWt1cGFuIHByb2dyYW0ga2VzZWhhdGFuIChkYWxhbSBwZXJzZW4pOg0KDQpgYGB7ciB0YWJlbC12YXJpYWJlbCwgZWNobz1GQUxTRX0NCmRhdGEuZnJhbWUoDQogIFZhcmlhYmVsID0gYygiUG5ldW1vbmlhIiwiSnVtbGFoX0JhbGl0YSIsIklETCIsIlZJVCIsIkJHSyIsIkJCTFIiLCJQSEJTIiwiUlMiKSwNCiAgS2V0ZXJhbmdhbiA9IGMoDQogICAgIkp1bWxhaCBrYXN1cyBwbmV1bW9uaWEgYmFsaXRhICh2YXJpYWJlbCByZXNwb25zL291dGNvbWUpIiwNCiAgICAiSnVtbGFoIGJhbGl0YSAocG9wdWxhc2kgYmVyaXNpa28sIGRpcGFrYWkgc2ViYWdhaSBvZmZzZXQpIiwNCiAgICAiQ2FrdXBhbiBJbXVuaXNhc2kgRGFzYXIgTGVuZ2thcCAoJSkiLA0KICAgICJDYWt1cGFuIHBlbWJlcmlhbiBWaXRhbWluIEEgcGFkYSBiYWxpdGEgKCUpIiwNCiAgICAiUGVyc2VudGFzZSBiYWxpdGEgZGVuZ2FuIGJlcmF0IGt1cmFuZyAvIGdpemkga3VyYW5nICglKSIsDQogICAgIlBlcnNlbnRhc2UgQmF5aSBCZXJhdCBMYWhpciBSZW5kYWggKCUpIiwNCiAgICAiQ2FrdXBhbiBQZXJpbGFrdSBIaWR1cCBCZXJzaWggZGFuIFNlaGF0ICglKSIsDQogICAgIlBlcnNlbnRhc2UgUnVtYWggU2VoYXQgLyBtZW1lbnVoaSBzeWFyYXQgKCUpIiksDQogIFBlcmFuID0gYygiUmVzcG9ucyIsIk9mZnNldCIsIlByZWRpa3RvciIsIlByZWRpa3RvciIsIlByZWRpa3RvciIsDQogICAgICAgICAgICAiUHJlZGlrdG9yIiwiUHJlZGlrdG9yIiwiUHJlZGlrdG9yIikNCikgJT4lDQogIGthYmxlKGNhcHRpb249IlRhYmVsIDEuIERlc2tyaXBzaSB2YXJpYWJlbCBkYWxhbSBkYXRhLiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KYGBgDQoNCioqVWt1cmFuIEVwaWRlbWlvbG9naS4qKg0KJCQgSVI9XGZyYWN7T19pfXtQX2l9XHRpbWVzIDEwMHsufTAwMCwgXHF1YWQgRV9pPVBfaVx0aW1lc1xmcmFje1xzdW0gT317XHN1bSBQfSwgXHF1YWQgU0lSX2k9XGZyYWN7T19pfXtFX2l9ICQkDQpkZW5nYW4gJE9faSQga2FzdXMgdGVyYW1hdGksICRQX2kkIHBvcHVsYXNpIGJhbGl0YSBiZXJpc2lrby4gU0lSID4gMSBtZW5naW5kaWthc2lrYW4gcmlzaWtvIGRpIGF0YXMNCnJhdGEtcmF0YSBrb3RhIChDbGF5dG9uICYgS2FsZG9yLCAxOTg3KS4NCg0KKipEaXNlYXNlIG1hcHBpbmcuKiogUGV0YSByaXNpa28ga2FzYXIgKGNydWRlIFNJUikgZGFuIHBlbmdoYWx1c2FuIEVtcGlyaWNhbCBCYXllcyBtZW5nZ3VuYWthbiBlc3RpbWF0b3IgZ2xvYmFsIGJlcmRhc2Fya2FuIG1ldG9kZSBNYXJzaGFsbCAoMTk5MSkgdW50dWsgbWVuc3RhYmlsa2FuIGVzdGltYXNpIHBhZGEgd2lsYXlhaCBiZXJwb3B1bGFzaSBrZWNpbC4gQXV0b2tvcmVsYXNpIHNwYXNpYWwgZGl1amkgZGVuZ2FuIE1vcmFuJ3MgSSAoTW9yYW4sIDE5NTA7IENsaWZmICYgT3JkLCAxOTgxKQ0KDQoqKlNwYXNpby10ZW1wb3JhbC4qKiBQZW1vZGVsYW4gZGlsYWt1a2FuIGJlcnRhaGFwOiAoMSkgTkItR0xNIGRlbmdhbiBlZmVrIHRldGFwDQooY292YXJpYXRlICsgZWZlayB0YWh1biwgb2Zmc2V0IGp1bWxhaCBiYWxpdGEpOyAoMikgdWppIE1vcmFuJ3MgSSBwYWRhIHJlc2lkdWFsOyAoMykgTkIgTWl4ZWQNCk1vZGVsIGRlbmdhbiBlZmVrIGFjYWsga2VjYW1hdGFuIGJpbGEgdGVyZGFwYXQgaGV0ZXJvZ2VuaXRhcyBhbnRhcndpbGF5YWg7IGRhbiAoNCkgbW9kZWwNClNwYXRpby1UZW1wb3JhbCBOQiBla3NwbGlzaXQgaGFueWEgYmlsYSByZXNpZHVhbCBtYXNpaCBtZW51bmp1a2thbiBwb2xhIHNwYXNpby10ZW1wb3JhbC4gTW9kZWwgTmVnYXRpdmUgQmlub21pYWwgZGlwaWxpaCBrYXJlbmEgZGF0YSBjYWNhaGFuIHBlbnlha2l0IHVtdW1ueWEgb3ZlcmRpc3BlcnNpIChIaWxiZSwgMjAxMikuDQoNCk1vZGVsDQpOQiBkaW55YXRha2FuIHNlYmFnYWkgJFxsb2coXG11X3tpdH0pID0gXGxvZyhQX3tpdH0pICsgXGJldGFfMCArIFxzdW1fayBcYmV0YV9rIFhfe2ssaXR9ICsgXHN1bV90IFxnYW1tYV90IFx0ZXh0e1RhaHVufV90JCwNCmRlbmdhbiBla3Nwb25lbiBrb2VmaXNpZW4gZGl0YWZzaXJrYW4gc2ViYWdhaSAqaW5jaWRlbmNlIHJhdGUgcmF0aW8qIChJUlIpOyBwYWRhIG1vZGVsDQpjYW1wdXJhbiBkaXRhbWJhaGthbiBlZmVrIGFjYWsga2VjYW1hdGFuICR1X2kgXHNpbSBOKDAsXHNpZ21hXjIpJC4NCg0KYGBge3IgYmFjYS1kYXRhfQ0KdXNlciA8LSAiV2luYWxpYWFnd2lsIjsgcmVwbyA8LSAiUG5ldW1vbmlhX0JhbmR1bmciOyBicmFuY2ggPC0gIm1haW4iDQpiYXNlIDwtIHNwcmludGYoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8lcy8lcy8lcy8iLCB1c2VyLCByZXBvLCBicmFuY2gpDQoNCmRvd25sb2FkLmZpbGUocGFzdGUwKGJhc2UsImRhdGFfcG5ldW1vbmlhX2JhbmR1bmdfdmVyMS54bHN4IiksICJkYXRhLnhsc3giLCBtb2RlPSJ3YiIsIHF1aWV0PVRSVUUpDQpkb3dubG9hZC5maWxlKHBhc3RlMChiYXNlLCJiYW5kdW5nX2tlY2FtYXRhbi56aXAiKSwgInNocC56aXAiLCBtb2RlPSJ3YiIsIHF1aWV0PVRSVUUpDQp1bnppcCgic2hwLnppcCIsIGV4ZGlyPSJzaHAiKQ0KDQpkYXQgPC0gcmVhZF9leGNlbCgiZGF0YS54bHN4IikgJT4lDQogIG11dGF0ZShLZWNhbWF0YW4gPSBzdHJfc3F1aXNoKHRvdXBwZXIoS2VjYW1hdGFuKSksDQogICAgICAgICBUYWh1biA9IGFzLmludGVnZXIoVGFodW4pLA0KICAgICAgICAgUG5ldW1vbmlhID0gYXMubnVtZXJpYyhQbmV1bW9uaWEpLA0KICAgICAgICAgQmFsaXRhID0gYXMubnVtZXJpYyhKdW1sYWhfQmFsaXRhKSkgJT4lDQogIGZpbHRlcighaXMubmEoQmFsaXRhKSkNCg0KcGV0YSA8LSBzdF9yZWFkKGxpc3QuZmlsZXMoInNocCIsIHBhdHRlcm49IlxcLnNocCQiLCBmdWxsLm5hbWVzPVRSVUUpWzFdLCBxdWlldD1UUlVFKQ0KcGV0YSRLZWNhbWF0YW4gPC0gc3RyX3NxdWlzaCh0b3VwcGVyKHBldGEkS2VjYW1hdGFuKSkNCnNmOjpzZl91c2VfczIoRkFMU0UpOyBwZXRhIDwtIHNmOjpzdF9tYWtlX3ZhbGlkKHBldGEpDQoNCg0KcGV0YSA8LSBwZXRhICU+JSBhcnJhbmdlKEtlY2FtYXRhbikgJT4lIG11dGF0ZShObyA9IHJvd19udW1iZXIoKSkNCg0KcGV0YV9sYmwgPC0gc3VwcHJlc3NXYXJuaW5ncygNCiAgY2JpbmQoc2Y6OnN0X2Ryb3BfZ2VvbWV0cnkocGV0YVssYygiTm8iLCJLZWNhbWF0YW4iKV0pLA0KICAgICAgICBzZjo6c3RfY29vcmRpbmF0ZXMoc2Y6OnN0X3BvaW50X29uX3N1cmZhY2UocGV0YSkpKQ0KKQ0KDQprZXRfd2lsYXlhaCA8LSBwZXRhICU+JSBzZjo6c3RfZHJvcF9nZW9tZXRyeSgpICU+JQ0KICB0cmFuc211dGUoTm8sIEtlY2FtYXRhbiA9IHN0cl90b190aXRsZShLZWNhbWF0YW4pKSAlPiUgYXJyYW5nZShObykNCg0KdGFodW5fdGVyc2VkaWEgPC0gc29ydCh1bmlxdWUoZGF0JFRhaHVuKSkNCmBgYA0KDQojIEhhc2lsIGRhbiBQZW1iYWhhc2FuIHsjaGFzaWx9DQoNCiMjIEFuYWxpc2lzIERlc2tyaXB0aWYNCg0KQmVyZGFzYXJrYW4gZGF0YSB5YW5nIGRpc2FqaWthbiBwYWRhIFRhYmVsIDIsIGp1bWxhaCBrYXN1cyBwbmV1bW9uaWEgYmFsaXRhIGRpIEtvdGEgQmFuZHVuZyBtZW51cnVuIGRhcmkgMTAuNzM1IGthc3VzIHBhZGEgMjAxNyBtZW5qYWRpIDIuMDAzIGthc3VzIHBhZGEgMjAyMS4gVHJlbiBwZW51cnVuYW4gaW5pIHRlcmNlcm1pbiBwdWxhIHBhZGEgKmluY2lkZW5jZSByYXRlKiAoSVIpIHBlciAxMDAuMDAwIGJhbGl0YSwgeWFuZyBtZW51cnVuIGRhcmkgdGFodW4ga2UgdGFodW4uIEJlcmJlZGEgZGVuZ2FuIHRyZW4gdG90YWwga2FzdXMgeWFuZyBtZW51cnVuLCBwb3B1bGFzaSBiYWxpdGEgbWVudW5qdWtrYW4gcGVyZ2VyYWthbiB5YW5nIGZsdWt0dWF0aWYuIFBvcHVsYXNpIHRlcnRpbmdnaSB0ZXJjYXRhdCBwYWRhIHRhaHVuIDIwMTkgKDI1NCw3ODAgYmFsaXRhKSBkYW4gbWVuZ2FsYW1pIHBlbnVydW5hbiBzaWduaWZpa2FuIHBhZGEgdGFodW4gMjAyMCAoMTUyLDkyOCBiYWxpdGEpIHNlYmVsdW0ga2VtYmFsaSBtZW5pbmdrYXQgcGFkYSB0YWh1biAyMDIxICgxNzUsNjE0IGJhbGl0YSkuDQoNCmBgYHtyIGRlc2tyaXB0aWZ9DQpkYXQgJT4lIGdyb3VwX2J5KFRhaHVuKSAlPiUNCiAgc3VtbWFyaXNlKFRvdGFsX0thc3VzPXN1bShQbmV1bW9uaWEpLCBUb3RhbF9CYWxpdGE9c3VtKEJhbGl0YSksDQogICAgICAgICAgICBJUl9rb3RhPXJvdW5kKHN1bShQbmV1bW9uaWEpL3N1bShCYWxpdGEpKjFlNSwxKSkgJT4lDQogIGthYmxlKGNhcHRpb249IlRhYmVsIDIuIFJpbmdrYXNhbiBrYXN1cyAmIHBvcHVsYXNpIGJhbGl0YSBwZXIgdGFodW4uIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aD1GQUxTRSwgYm9vdHN0cmFwX29wdGlvbnM9Yygic3RyaXBlZCIsImhvdmVyIikpDQpgYGANCg0KSnVtbGFoIGthc3VzIHBuZXVtb25pYSBiYWxpdGEgZGkgS290YSBCYW5kdW5nIG1lbnVydW4gZGFyaSAxMC43MzUga2FzdXMgcGFkYSAyMDE3IG1lbmphZGkgMi4wMDMga2FzdXMgcGFkYSAyMDIxLCBkZW5nYW4gcGVudXJ1bmFuIHRhamFtIHBhZGEgdGFodW4gMjAyMC0yMDIxIHNlaXJpbmcgZGVuZ2FuIG1lbnVydW5ueWEganVtbGFoIGt1bmp1bmdhbiBtYXN5YXJha2F0IGtlIGZhc2lsaXRhcyBrZXNlaGF0YW4gYWtpYmF0IHBhbmRlbWkgQ09WSUQtMTkgKERpbmFzIEtlc2VoYXRhbiBLb3RhIEJhbmR1bmcsIDIwMTYpLiBUcmVuIHRvdGFsIGthc3VzIHBuZXVtb25pYSBiYWxpdGEgZGFyaSB0YWh1biAyMDE3IGhpbmdnYSAyMDIxIGRhcGF0IGRpbGloYXQgcGFkYSBHYW1iYXIgMS4NCg0KYGBge3IgdHJlbiwgZmlnLmNhcD0iR2FtYmFyIDEuIFRyZW4gdG90YWwga2FzdXMgcG5ldW1vbmlhIGJhbGl0YS4ifQ0KZGF0ICU+JSBncm91cF9ieShUYWh1bikgJT4lIHN1bW1hcmlzZShUb3RhbD1zdW0oUG5ldW1vbmlhKSkgJT4lDQogIGdncGxvdChhZXMoZmFjdG9yKFRhaHVuKSwgVG90YWwsIGdyb3VwPTEpKSArDQogIGdlb21fbGluZShjb2xvcj0iIzFhNjk4NSIsIGxpbmV3aWR0aD0xKSArIGdlb21fcG9pbnQoc2l6ZT0zLCBjb2xvcj0iIzFhNjk4NSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1jb21tYShUb3RhbCkpLCB2anVzdD0tMSwgc2l6ZT0zLjUpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1jb21tYSwgZXhwYW5kPWV4cGFuc2lvbihtdWx0PWMoMC4wNSwwLjE1KSkpICsNCiAgbGFicyh4PSJUYWh1biIsIHk9IlRvdGFsIGthc3VzIHBuZXVtb25pYSBiYWxpdGEiKSArIHRoZW1lX21pbmltYWwoYmFzZV9zaXplPTEyKQ0KYGBgDQoNCiMjIFVrdXJhbiBFcGlkZW1pb2xvZ2kgKElSICYgU0lSKQ0KDQpgYGB7ciBpci1zaXJ9DQpyYXRlX2tvdGEgPC0gc3VtKGRhdCRQbmV1bW9uaWEpL3N1bShkYXQkQmFsaXRhKQ0KZGF0IDwtIGRhdCAlPiUgbXV0YXRlKElSPVBuZXVtb25pYS9CYWxpdGEqMWU1LA0KICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGVkPUJhbGl0YSpyYXRlX2tvdGEsDQogICAgICAgICAgICAgICAgICAgICAgU0lSPVBuZXVtb25pYS9FeHBlY3RlZCkNCmBgYA0KDQojIyMgU0lSIHBlciBLZWNhbWF0YW4gU2VsdXJ1aCBUYWh1bg0KDQpVbnR1ayBtZWxpaGF0IHNlYmFyYW4gcmlzaWtvIHJlbGF0aWYgcG5ldW1vbmlhIHBhZGEgYmFsaXRhIHNlY2FyYSBsZWJpaCBzcGVzaWZpayBkaSB0aW5na2F0IGtld2lsYXlhaGFuLCBkaWxha3VrYW4gYW5hbGlzaXMgdGVyaGFkYXAgbmlsYWkgU3RhbmRhcmRpemVkIEluY2lkZW5jZSBSYXRpbyAoU0lSKSBkaSAzMCBrZWNhbWF0YW4gZGFyaSB0YWh1biAyMDE3IHNhbXBhaSBkZW5nYW4gMjAyMSAoR2FtYmFyIDIpLiBOaWxhaSBTSVIgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIGFwYWthaCBzdWF0dSB3aWxheWFoIG1lbWlsaWtpIGp1bWxhaCBrYXN1cyB5YW5nIGxlYmloIHRpbmdnaSAoJFx0ZXh0e1NJUn0gPiAxJCkgYXRhdSBsZWJpaCByZW5kYWggKCRcdGV4dHtTSVJ9IDwgMSQpIGRpYmFuZGluZ2thbiBkZW5nYW4gcmF0YS1yYXRhIHdpbGF5YWggc2VjYXJhIGtlc2VsdXJ1aGFuIGRhbGFtIGhhbCBpbmkgcmF0YS1yYXRhIGthc3VzIFBuZXVtb25pYSBCYWxpdGEga290YSBCYW5kdW5nLg0KDQpgYGB7ciBzaXItaGVhdG1hcCwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9OC41LCBmaWcuY2FwPSJHYW1iYXIgMi4gSGVhdG1hcCBTSVIgcG5ldW1vbmlhIGJhbGl0YSBwZXIga2VjYW1hdGFuLCAyMDE3LTIwMjEuIE1lcmFoID0gcmlzaWtvIGRpIGF0YXMgcmF0YS1yYXRhIGtvdGEgKFNJUj4xKSwgYmlydSA9IGRpIGJhd2FoIHJhdGEtcmF0YTsga2VjYW1hdGFuIGRpdXJ1dGthbiBtZW51cnVuIGJlcmRhc2Fya2FuIFNJUiAyMDIxLiJ9DQoNCnVydXRfa2VjIDwtIGRhdCAlPiUgZmlsdGVyKFRhaHVuPT1tYXgodGFodW5fdGVyc2VkaWEpKSAlPiUNCiAgYXJyYW5nZShTSVIpICU+JSBtdXRhdGUoS2VjYW1hdGFuPXN0cl90b190aXRsZShLZWNhbWF0YW4pKSAlPiUgcHVsbChLZWNhbWF0YW4pDQoNCmhtIDwtIGRhdCAlPiUgbXV0YXRlKEtlY2FtYXRhbj1mYWN0b3Ioc3RyX3RvX3RpdGxlKEtlY2FtYXRhbiksIGxldmVscz11cnV0X2tlYykpDQoNCmdncGxvdChobSwgYWVzKHg9ZmFjdG9yKFRhaHVuKSwgeT1LZWNhbWF0YW4sIGZpbGw9U0lSKSkgKw0KICBnZW9tX3RpbGUoY29sb3I9IndoaXRlIiwgbGluZXdpZHRoPTAuNikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPWZvcm1hdEMoU0lSLCBmb3JtYXQ9ImYiLCBkaWdpdHM9MiksDQogICAgICAgICAgICAgICAgY29sb3I9U0lSPjIgfCBTSVI8MC40KSwgc2l6ZT0yLjcsIHNob3cubGVnZW5kPUZBTFNFKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iIzIxNjZhYyIsIG1pZD0iI2Y3ZjdmNyIsIGhpZ2g9IiNiMjE4MmIiLA0KICAgICAgICAgICAgICAgICAgICAgICBtaWRwb2ludD0xLCBuYW1lPSJTSVIiLCBsaW1pdHM9YygwLDUuNCksDQogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcz1jKDAsMSwyLDMsNCw1KSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoYEZBTFNFYD0iZ3JleTE1IiwgYFRSVUVgPSJ3aGl0ZSIpKSArDQogIGxhYnMoeD0iVGFodW4iLCB5PU5VTEwpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemU9MTEpICsNCiAgdGhlbWUocGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPTgpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT0xMCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0icmlnaHQiLA0KICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KDEuMiwiY20iKSkNCmBgYA0KDQpEYXJpIEdhbWJhciAyIHRlcmxpaGF0IGJhaHdhIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwgc2VjYXJhIGtvbnNpc3RlbiBtZW1pbGlraSBTSVIgdGluZ2dpIChkaSBhdGFzIDEpIHNlcGFuamFuZyB0YWh1biwgbWVuYW5kYWthbiByaXNpa28gcG5ldW1vbmlhIGJhbGl0YSBkaSBrZWR1YSBrZWNhbWF0YW4gaW5pIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4gcmF0YS1yYXRhIEtvdGEgQmFuZHVuZy4gU2ViYWxpa255YSwgc2VqdW1sYWgga2VjYW1hdGFuIHlhbmcgYmVyd2FybmEgYmlydSBkYXJpIDIwMTctMjAyMSBtZW51bmp1a2thbiBTSVIgcmVuZGFoIChkaSBiYXdhaCAxKS4gVGVyZGFwYXQgcHVsYSBhbm9tYWxpIHBhZGEgS2VjYW1hdGFuIENpY2VuZG8geWFuZyBtZW1pbGlraSBTSVIgc2FuZ2F0IHRpbmdnaSBwYWRhIDIwMTcgKDUsMzEpIG5hbXVuIHR1cnVuIGRyYXN0aXMgcGFkYSAyMDIxICgwLDA3KSwgcG9sYSB5YW5nIHBlcmx1IGRpdGVsdXN1cmkgbGViaWggbGFuanV0IGRhbiBrb25zaXN0ZW4gZGVuZ2FuIGR1Z2FhbiBnYW5nZ3VhbiBwZWxhcG9yYW4gc2VsYW1hIHBhbmRlbWkuDQoNCiMjIyAxMCBLZWNhbWF0YW4gU0lSIFRlcnRpbmdnaSBwZXIgVGFodW4gey50YWJzZXR9DQoNClNlcHVsdWgga2VjYW1hdGFuIGRlbmdhbiBTSVIgdGVydGluZ2dpIHVudHVrIHRpYXAgdGFodW4gKGtsaWsgdGFiIHRhaHVuKS4gU0lSID4gMSBtZW5hbmRha2FuDQpyaXNpa28gZGkgYXRhcyByYXRhLXJhdGEga290YS4NCg0KYGBge3IgdG9wMTAtc2lyLCByZXN1bHRzPSdhc2lzJ30NCmZvciAoeSBpbiB0YWh1bl90ZXJzZWRpYSl7DQogIGNhdCgiXG5cbiMjIyMgIiwgeSwgIiB7LX1cblxuIikNCiAgdGFiZWxfeSA8LSBkYXQgJT4lIGZpbHRlcihUYWh1bj09eSkgJT4lDQogICAgYXJyYW5nZShkZXNjKFNJUikpICU+JSBoZWFkKDEwKSAlPiUNCiAgICB0cmFuc211dGUoS2VjYW1hdGFuPXN0cl90b190aXRsZShLZWNhbWF0YW4pLA0KICAgICAgICAgICAgICBLYXN1cz1QbmV1bW9uaWEsDQogICAgICAgICAgICAgIEJhbGl0YT1yb3VuZChCYWxpdGEpLA0KICAgICAgICAgICAgICBJUj1yb3VuZChJUiwxKSwNCiAgICAgICAgICAgICAgRXhwZWN0ZWQ9cm91bmQoRXhwZWN0ZWQsMSksDQogICAgICAgICAgICAgIFNJUj1yb3VuZChTSVIsMikpDQogIHByaW50KA0KICAgIGthYmxlKHRhYmVsX3ksIHJvdy5uYW1lcz1GQUxTRSwNCiAgICAgICAgICBjYXB0aW9uPXBhc3RlMCgiU2VwdWx1aCBrZWNhbWF0YW4gU0lSIHRlcnRpbmdnaSwgIix5LCIuIikpICU+JQ0KICAgICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoPUZBTFNFLA0KICAgICAgICAgICAgICAgICAgICBib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiaG92ZXIiLCJjb25kZW5zZWQiKSwNCiAgICAgICAgICAgICAgICAgICAgZm9udF9zaXplPTEyKQ0KICApDQp9DQpgYGANCg0KIyMjIHstfQ0KDQoNCiMjIERpc2Vhc2UgTWFwcGluZzogQ3J1ZGUgU0lSICYgRW1waXJpY2FsIEJheWVzIHsudGFic2V0fQ0KDQpQZXRhIGNydWRlIFNJUiBkYW4gaGFzaWwgcGVuZ2hhbHVzYW4gRW1waXJpY2FsIEJheWVzIGRpdGFtcGlsa2FuIHVudHVrIHNlbHVydWggdGFodW4uIEVCDQptZW5zdGFiaWxrYW4gZXN0aW1hc2kgcGFkYSBrZWNhbWF0YW4gYmVycG9wdWxhc2kga2VjaWwgc2VoaW5nZ2EgcG9sYSByaXNpa28gbGViaWggYW5kYWwuIFNldGlhcA0Ka2VjYW1hdGFuIGRpYmVyaSBub21vciBwYWRhIHBldGE7IGtldGVyYW5nYW4gbm9tb3IgdGVyY2FudHVtIHBhZGEga290YWsgZGkgYmF3YWguDQoNCmBgYHtyIGtldC13aWxheWFoLCBlY2hvPUZBTFNFfQ0KDQpuIDwtIG5yb3coa2V0X3dpbGF5YWgpOyBoIDwtIGNlaWxpbmcobi8yKQ0Ka2lyaSAgPC0ga2V0X3dpbGF5YWhbMTpoLF0NCmthbmFuIDwtIGtldF93aWxheWFoWyhoKzEpOm4sXQ0KaWYgKG5yb3coa2FuYW4pIDwgbnJvdyhraXJpKSkga2FuYW4gPC0gcmJpbmQoa2FuYW4sIGRhdGEuZnJhbWUoTm89TkEsIEtlY2FtYXRhbj0iIikpDQp0YWJfa2V0IDwtIGRhdGEuZnJhbWUoDQogIE5vMT1raXJpJE5vLCBLZWNhbWF0YW4xPWtpcmkkS2VjYW1hdGFuLA0KICBObzI9a2FuYW4kTm8sIEtlY2FtYXRhbjI9a2FuYW4kS2VjYW1hdGFuDQopDQp0YWJfa2V0ICU+JQ0KICBrYWJsZShjb2wubmFtZXM9YygiTm8iLCJLZWNhbWF0YW4iLCJObyIsIktlY2FtYXRhbiIpLA0KICAgICAgICBjYXB0aW9uPSJLZXRlcmFuZ2FuIG5vbW9yIHdpbGF5YWggcGFkYSBwZXRhLiIsIGFsaWduPSJjbGNsIikgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aD1GQUxTRSwgYm9vdHN0cmFwX29wdGlvbnM9Yygic3RyaXBlZCIsImNvbmRlbnNlZCIpLA0KICAgICAgICAgICAgICAgIGZvbnRfc2l6ZT0xMikgJT4lDQogIGNvbHVtbl9zcGVjKDEsIGJvbGQ9VFJVRSkgJT4lIGNvbHVtbl9zcGVjKDMsIGJvbGQ9VFJVRSkNCmBgYA0KDQpgYGB7ciBmdW5nc2ktcGV0YX0NCg0KcGV0YV9zaXIgPC0gZnVuY3Rpb24odGFodW4pew0KICBkIDwtIGRhdCAlPiUgZmlsdGVyKFRhaHVuPT10YWh1bikNCiAgZWIgPC0gRUJlc3Qobj1kJFBuZXVtb25pYSwgeD1kJEJhbGl0YSkNCiAgZCRFQl9TSVIgPC0gZWIkZXN0bW0gLyByYXRlX2tvdGENCiAgcG0gPC0gcGV0YSAlPiUgbGVmdF9qb2luKGQsIGJ5PSJLZWNhbWF0YW4iKQ0KICBnMSA8LSBnZ3Bsb3QocG0pICsgZ2VvbV9zZihhZXMoZmlsbD1TSVIpLCBjb2xvcj0id2hpdGUiLCBsaW5ld2lkdGg9MC4yKSArDQogICAgZ2VvbV90ZXh0KGRhdGE9cGV0YV9sYmwsIGFlcyhYLCBZLCBsYWJlbD1ObyksIHNpemU9Mi41LCBjb2xvcj0iZ3JleTIwIikgKw0KICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iIzIxNjZhYyIsIG1pZD0id2hpdGUiLCBoaWdoPSIjYjIxODJiIiwgbWlkcG9pbnQ9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJDcnVkZSBTSVIiLCBuYS52YWx1ZT0iZ3JleTg1IikgKw0KICAgIGxhYnModGl0bGU9cGFzdGUwKCJDcnVkZSBTSVIsICIsdGFodW4pKSArDQogICAgdGhlbWVfbWluaW1hbCgpICsgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZD1lbGVtZW50X2JsYW5rKCkpDQogIGcyIDwtIGdncGxvdChwbSkgKyBnZW9tX3NmKGFlcyhmaWxsPUVCX1NJUiksIGNvbG9yPSJ3aGl0ZSIsIGxpbmV3aWR0aD0wLjIpICsNCiAgICBnZW9tX3RleHQoZGF0YT1wZXRhX2xibCwgYWVzKFgsIFksIGxhYmVsPU5vKSwgc2l6ZT0yLjUsIGNvbG9yPSJncmV5MjAiKSArDQogICAgc2NhbGVfZmlsbF9ncmFkaWVudDIobG93PSIjMjE2NmFjIiwgbWlkPSJ3aGl0ZSIsIGhpZ2g9IiNiMjE4MmIiLCBtaWRwb2ludD0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IkVCIFNJUiIsIG5hLnZhbHVlPSJncmV5ODUiKSArDQogICAgbGFicyh0aXRsZT1wYXN0ZTAoIkVCLXNtb290aGVkIFNJUiwgIix0YWh1bikpICsNCiAgICB0aGVtZV9taW5pbWFsKCkgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkPWVsZW1lbnRfYmxhbmsoKSkNCiAgbGlzdChjcnVkZT1nMSwgZWI9ZzIpDQp9DQpgYGANCg0KYGBge3IgcGV0YS10YWh1biwgcmVzdWx0cz0nYXNpcycsIGZpZy53aWR0aD0xMSwgZmlnLmhlaWdodD01fQ0KZm9yICh5IGluIHRhaHVuX3RlcnNlZGlhKXsNCiAgY2F0KCJcblxuIyMjICIsIHksICIgey19XG5cbiIpDQogIGdnIDwtIHBldGFfc2lyKHkpDQogIHByaW50KGdnJGNydWRlICsgZ2ckZWIpDQp9DQpgYGANCg0KIyMgey19DQoNCiMjIyBQZXJiYW5kaW5nYW4gQ3J1ZGUgU0lSIHZzIEVCLXNtb290aGVkIFNJUg0KDQpTZWNhcmEgdmlzdWFsLCBwZXRhIGNydWRlIGRhbiBFQiB0YW1wYWsgc2VydXBhIGthcmVuYSBwZW55ZXN1YWlhbiBFbXBpcmljYWwgQmF5ZXMgdW11bW55YQ0Ka2VjaWwuIFVudHVrIG1lbGloYXQgYmVzYXJueWEgcGVueWVzdWFpYW4sIHRhYmVsIGJlcmlrdXQgbWVueWFqaWthbiBsaW1hIGtlY2FtYXRhbiBkZW5nYW4NCnNlbGlzaWggfGNydWRlIOKIkiBFQnwgdGVyYmVzYXIgdGlhcCB0YWh1bi4gUGVueWVzdWFpYW4gdGVyYmVzYXIga29uc2lzdGVuIHRlcmphZGkgcGFkYSBrZWNhbWF0YW4NCmJlcnBvcHVsYXNpIGtlY2lsIChtaXMuIENpbmFtYm8pLCBzZXN1YWkgcHJpbnNpcCBFQiB5YW5nIG1lbmFyaWsgZXN0aW1hc2kgd2lsYXlhaCBrZWNpbCBsZWJpaA0Ka3VhdCBrZSBhcmFoIHJhdGEtcmF0YSBrb3RhLg0KDQpgYGB7ciBjcnVkZS12cy1lYn0NCmJhbmRpbmdfZWIgPC0gZnVuY3Rpb24odGFodW4pew0KICBkIDwtIGRhdCAlPiUgZmlsdGVyKFRhaHVuPT10YWh1bikNCiAgZWIgPC0gRUJlc3Qobj1kJFBuZXVtb25pYSwgeD1kJEJhbGl0YSkNCiAgdGliYmxlKFRhaHVuPXRhaHVuLA0KICAgICAgICAgS2VjYW1hdGFuPXN0cl90b190aXRsZShkJEtlY2FtYXRhbiksDQogICAgICAgICBCYWxpdGE9cm91bmQoZCRCYWxpdGEpLA0KICAgICAgICAgQ3J1ZGVfU0lSPXJvdW5kKGQkU0lSLDIpLA0KICAgICAgICAgRUJfU0lSPXJvdW5kKGViJGVzdG1tL3JhdGVfa290YSwyKSkgJT4lDQogICAgbXV0YXRlKFNlbGlzaWg9cm91bmQoYWJzKENydWRlX1NJUi1FQl9TSVIpLDMpKSAlPiUNCiAgICBhcnJhbmdlKGRlc2MoU2VsaXNpaCkpICU+JSBzbGljZSgxOjUpDQp9DQpkby5jYWxsKHJiaW5kLCBsYXBwbHkodGFodW5fdGVyc2VkaWEsIGJhbmRpbmdfZWIpKSAlPiUNCiAga2FibGUoY2FwdGlvbj0iVGFiZWwgNC4gTGltYSBrZWNhbWF0YW4gZGVuZ2FuIHBlbnllc3VhaWFuIEVtcGlyaWNhbCBCYXllcyB0ZXJiZXNhciBwZXIgdGFodW4uIiwNCiAgICAgICAgcm93Lm5hbWVzPUZBTFNFKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoPUZBTFNFLCBib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiaG92ZXIiLCJjb25kZW5zZWQiKSwNCiAgICAgICAgICAgICAgICBmb250X3NpemU9MTIpICU+JQ0KICBjb2xsYXBzZV9yb3dzKGNvbHVtbnM9MSwgdmFsaWduPSJ0b3AiKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBTZWxpc2loIGNydWRlIHZzIEVCIGtlY2lsIGRpIHNlYmFnaWFuIGJlc2FyIGtlY2FtYXRhbiwgZGVuZ2FuIHBlbnllc3VhaWFuDQp0ZXJiZXNhciBwYWRhIHdpbGF5YWggYmVycG9wdWxhc2kga2VjaWwgc2VwZXJ0aSBDaW5hbWJvLiBLZW1pcmlwYW4gY3J1ZGUgZGFuIEVCIG1lbnVuanVra2FuDQplc3RpbWFzaSByaXNpa28gZGkgc2ViYWdpYW4gYmVzYXIga2VjYW1hdGFuIHN1ZGFoIHN0YWJpbCwgc2VoaW5nZ2EgcG9sYSB5YW5nIHRlcmFtYXRpDQptZW5jZXJtaW5rYW4gdmFyaWFzaSByaXNpa28geWFuZyBueWF0YSBkYW4gYnVrYW4ga2V0aWRha3N0YWJpbGFuIGFraWJhdCBwb3B1bGFzaSBrZWNpbC4NCjo6Og0KDQojIyMgVWppIE1vcmFuJ3MgSSBwZXIgVGFodW4NCg0KYGBge3IgYm9ib3R9DQoNCm5iIDwtIHBvbHkybmIocGV0YSwgcXVlZW49VFJVRSkNCmx3IDwtIG5iMmxpc3R3KG5iLCBzdHlsZT0iVyIsIHplcm8ucG9saWN5PVRSVUUpDQpgYGANCg0KYGBge3IgbW9yYW59DQoNCm1vcmFuX3RhaHVuIDwtIGZ1bmN0aW9uKHRhaHVuKXsNCiAgZCA8LSBkYXQgJT4lIGZpbHRlcihUYWh1bj09dGFodW4pDQogIHBtIDwtIHBldGEgJT4lIGxlZnRfam9pbihkLCBieT0iS2VjYW1hdGFuIikNCiAgbWMgPC0gbW9yYW4ubWMocG0kU0lSLCBsdywgbnNpbT05OTksIHplcm8ucG9saWN5PVRSVUUsIG5hLmFjdGlvbj1uYS5vbWl0KQ0KICBkYXRhLmZyYW1lKFRhaHVuPXRhaHVuLCBNb3Jhbl9JPXJvdW5kKHVubmFtZShtYyRzdGF0aXN0aWMpLDMpLA0KICAgICAgICAgICAgIHBfdmFsdWU9cm91bmQobWMkcC52YWx1ZSwzKSkNCn0NCm1vcmFuX3RhYiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkodGFodW5fdGVyc2VkaWEsIG1vcmFuX3RhaHVuKSkNCm1vcmFuX3RhYiAlPiUNCiAga2FibGUoY2FwdGlvbj0iVGFiZWwgNS4gTW9yYW4ncyBJIFNJUiBwbmV1bW9uaWEgYmFsaXRhIHBlciB0YWh1biIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBVamkgTW9yYW4ncyBJIHBhZGEgU0lSIG1lbnVuanVra2FuIHRpZGFrIGFkYSBhdXRva29yZWxhc2kgc3Bhc2lhbCB5YW5nIHNpZ25pZmlrYW4gcGFkYSBzZWx1cnVoIHRhaHVuIHlhbmcgZGlndW5ha2FuIHBhZGEgbWFrYWxhaCBpbmkgKHAgPiAwLDA1LCBkZW5nYW4gbmlsYWkgTW9yYW4ncyBJIG1lbmRla2F0aSBub2wpLiBIYWwgaW5pIG1lbmFuZGFrYW4gYmFod2EgZGFsYW0gc2F0dSB0YWh1biB0ZXJ0ZW50dSwgcmlzaWtvIHBuZXVtb25pYSBiYWxpdGEgdGlkYWsgbWVuZ2Vsb21wb2sgc2VjYXJhIGdlb2dyYWZpcywgZGVuZ2FuIGthdGEgbGFpbiBrZWNhbWF0YW4gYmVyaXNpa28gdGluZ2dpIHRlcnNlYmFyIHRhbnBhIHBvbGEgc3Bhc2lhbCB5YW5nIGplbGFzLiBUZW11YW4gaW5pIGtvbnNpc3RlbiBkZW5nYW4gc2ViYXJhbiBrZWNhbWF0YW4gYmVyaXNpa28gdGluZ2dpIChzZXBlcnRpIENpY2VuZG8sIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwpIHlhbmcgc2VjYXJhIGdlb2dyYWZpcyB0aWRhayBiZXJkZWthdGFuLg0KOjo6DQoNCiMjIyBVamkgTW9yYW4ncyBJIFNwYXNpby1UZW1wb3JhbA0KDQpTZWxhaW4gTW9yYW4ncyBJIHBlciB0YWh1biAobXVybmkgc3Bhc2lhbCksIGRpdWppIHB1bGEgYXV0b2tvcmVsYXNpIHNwYXNpby10ZW1wb3JhbCBtZWxhbHVpIHBlcmx1YXNhbiBpbmRla3MgTW9yYW4gZGVuZ2FuIGJvYm90IGdhYnVuZ2FuIHJ1YW5nIGRhbiB3YWt0dSAoTGVlICYgTGksIDIwMTcpLiBEdWEgdW5pdCBrZWNhbWF0YW4tdGFodW4gZGlhbmdnYXANCmJlcnRldGFuZ2dhIHNwYXNpby10ZW1wb3JhbCBiaWxhIGJlcmFkYSBkaSBrZWNhbWF0YW4geWFuZyBiZXJzZWJlbGFoYW4gZGFuIHBhZGEgdGFodW4geWFuZw0Kc2FtYSBhdGF1IGJlcmRla2F0YW4gKHNlbGlzaWggc2F0dSB0YWh1bikuIFVqaSBpbmkgbWVuaWxhaSBhcGFrYWggU0lSIHRpbmdnaSBtZW5nZWxvbXBvayB0aWRhaw0KaGFueWEgc2VjYXJhIGdlb2dyYWZpcywgdGV0YXBpIGp1Z2EgdGVyYmF3YSBkYXJpIHRhaHVuIGtlIHRhaHVuLg0KDQpgYGB7ciBtb3Jhbi1zcGF0aW90ZW1wb3JhbH0NCg0Ka2VjX3VydXQgPC0gbGV2ZWxzKGZhY3RvcihwZXRhJEtlY2FtYXRhbikpDQp0aF91cnV0ICA8LSBzb3J0KHVuaXF1ZShkYXQkVGFodW4pKQ0KbksgPC0gbGVuZ3RoKGtlY191cnV0KTsgblQgPC0gbGVuZ3RoKHRoX3VydXQpDQoNCg0KV3MgPC0gbmIybWF0KG5iLCBzdHlsZT0iQiIsIHplcm8ucG9saWN5PVRSVUUpICAgICANCg0KDQpXdCA8LSBtYXRyaXgoMCwgblQsIG5UKQ0KZm9yIChhIGluIDE6blQpIGZvciAoYiBpbiAxOm5UKSBpZiAoYWJzKHRoX3VydXRbYV0tdGhfdXJ1dFtiXSk8PTEpIFd0W2EsYl0gPC0gMQ0KDQoNCldzdCA8LSBrcm9uZWNrZXIoV3QsIFdzKSAgICAgDQpkaWFnKFdzdCkgPC0gMA0KDQoNCmt1bmNpIDwtIHBhc3RlKHJlcCh0aF91cnV0LCBlYWNoPW5LKSwgcmVwKGtlY191cnV0LCB0aW1lcz1uVCkpDQpzaXJfdmVjIDwtIGRhdCRTSVJbbWF0Y2goa3VuY2ksIHBhc3RlKGRhdCRUYWh1biwgZGF0JEtlY2FtYXRhbikpXQ0KDQoNCm1vcmFuX3N0IDwtIGZ1bmN0aW9uKHgsIFcpew0KICBvayA8LSAhaXMubmEoeCk7IHggPC0geFtva107IFcgPC0gV1tvayxva10NCiAgbiA8LSBsZW5ndGgoeCk7IHogPC0geCAtIG1lYW4oeCk7IFMwIDwtIHN1bShXKQ0KICAobi9TMCkgKiAoYXMubnVtZXJpYyh0KHopICUqJSBXICUqJSB6KSAvIHN1bSh6XjIpKQ0KfQ0KSV9vYnMgPC0gbW9yYW5fc3Qoc2lyX3ZlYywgV3N0KQ0KDQoNCnNldC5zZWVkKDEyMykNCnBlcm0gPC0gcmVwbGljYXRlKDk5OSwgew0KICB4cCA8LSBzYW1wbGUoc2lyX3ZlYykNCiAgbW9yYW5fc3QoeHAsIFdzdCkNCn0pDQpwX3ZhbCA8LSAoc3VtKHBlcm0gPj0gSV9vYnMpICsgMSkgLyAoOTk5ICsgMSkNCmNhdCgiTW9yYW4ncyBJIHNwYXNpby10ZW1wb3JhbDoiLCByb3VuZChJX29icywzKSwNCiAgICAifCBwLXZhbHVlIChwZXJtdXRhc2kpOiIsIHJvdW5kKHBfdmFsLDMpLCAiXG4iKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaS4qKiBVamkgTW9yYW4ncyBJIHNwYXNpYWwgcGVyIHRhaHVuIG1lbnVuanVra2FuIHRpZGFrIGFkYW55YSBhdXRva29yZWxhc2kgc3Bhc2lhbCB5YW5nIHNpZ25pZmlrYW4gKHAgPiAwLDA1IHBhZGEgc2VsdXJ1aCB0YWh1biwgZGVuZ2FuIG5pbGFpIG1lbmRla2F0aSBub2wpLiBTZWJhbGlrbnlhLCBNb3JhbidzIEkgc3Bhc2lvLXRlbXBvcmFsIGJlcm5pbGFpIDAsMTg2IGRhbiBzaWduaWZpa2FuIChwID0gMCwwMDEpLiBLb250cmFzIGluaSBtZW5hbmRha2FuIGJhaHdhIGF1dG9rb3JlbGFzaSBwYWRhIGRhdGEgcG5ldW1vbmlhIGJhbGl0YSBkaWRvbWluYXNpIG9sZWggZGltZW5zaSB0ZW1wb3JhbCwgYnVrYW4gc3Bhc2lhbC4gUmlzaWtvIHN1YXR1IGtlY2FtYXRhbiBsZWJpaCBwZXJzaXN0ZW4gYW50YXJ3YWt0dSBkYXJpcGFkYSBtZW5nZWxvbXBvayBzZWNhcmEgZ2VvZ3JhZmlzIGRhbGFtIHNhdHUgdGFodW4uDQo6OjoNCg0KIyMgUGVtb2RlbGFuIEJlcnRpbmdrYXQNCg0KUGVtb2RlbGFuIGRpbGFrdWthbiBzZWNhcmEgYmVydGluZ2thdCBtZW5naWt1dGkgcHJpbnNpcCBwYXJzaW1vbmk6IGRpbXVsYWkgZGFyaSBtb2RlbA0KcGFsaW5nIHNlZGVyaGFuYSwgbGFsdSBkaXRpbmdrYXRrYW4gaGFueWEgYmlsYSBkaWFnbm9zdGlrIHJlc2lkdWFsIG1lbnVuanVra2FuIGtlYnV0dWhhbi4NClRhaGFwYW5ueWE6ICgxKSAqKk5CLUdMTSoqIGRlbmdhbiBlZmVrIHRldGFwOyAoMikgKip1amkgTW9yYW4gcmVzaWR1YWwqKiB1bnR1ayBtZW1lcmlrc2EgcG9sYQ0Kc3Bhc2lhbCB0ZXJzaXNhOyAoMykgKipOQiBNaXhlZCBNb2RlbCoqIGRlbmdhbiBlZmVrIGFjYWsga2VjYW1hdGFuIGJpbGEgZGlwZXJsdWthbjsgZGFuICg0KQ0KKiptb2RlbCBTcGF0aW8tVGVtcG9yYWwgTkIqKiBoYW55YSBiaWxhIHJlc2lkdWFsIG1hc2loIG1lbnVuanVra2FuIHBvbGEgc3Bhc2lvLXRlbXBvcmFsLg0KDQpgYGB7ciBtb2RlbC1zZXR1cH0NCmRhdF9tIDwtIGRhdCAlPiUNCiAgbXV0YXRlKEtlY2FtYXRhbj1mYWN0b3IoS2VjYW1hdGFuKSwNCiAgICAgICAgIFRhaHVuX2Y9ZmFjdG9yKFRhaHVuKSkNCmNhdCgiSnVtbGFoIG9ic2VydmFzaSAoa2VjYW1hdGFuLXRhaHVuKToiLCBucm93KGRhdF9tKSwgIlxuIikNCg0KbV9wb2lzIDwtIGdsbShQbmV1bW9uaWEgfiBJREwrVklUK0JHSytCQkxSK1BIQlMrUlMrVGFodW5fZiArIG9mZnNldChsb2coQmFsaXRhKSksDQogICAgICAgICAgICAgIGZhbWlseT1wb2lzc29uLCBkYXRhPWRhdF9tKQ0KZGlzcCA8LSBzdW0ocmVzaWR1YWxzKG1fcG9pcywgdHlwZT0icGVhcnNvbiIpXjIpL21fcG9pcyRkZi5yZXNpZHVhbA0KY2F0KCJSYXNpbyBkaXNwZXJzaSAoUG9pc3Nvbik6Iiwgcm91bmQoZGlzcCwyKSwNCiAgICAiIC0+IG92ZXJkaXNwZXJzaSBiaWxhID4gMSwgbWVuZHVrdW5nIE5lZ2F0aXZlIEJpbm9taWFsXG4iKQ0KYGBgDQoNCiMjIyBUYWhhcCAxIOKAlCBOQi1HTE0gKEVmZWsgVGV0YXApDQoNCk1vZGVsIE5lZ2F0aXZlIEJpbm9taWFsIGRlbmdhbiBlZmVrIHRldGFwOiBlbmFtIGNvdmFyaWF0ZSBjYWt1cGFuIHByb2dyYW0ga2VzZWhhdGFuIGRhbiBlZmVrDQp0YWh1biwgZGVuZ2FuIGBvZmZzZXQobG9nKEJhbGl0YSkpYC4NCg0KYGBge3IgbmItZ2xtfQ0KbV9nbG0gPC0gZ2xtLm5iKFBuZXVtb25pYSB+IElETCtWSVQrQkdLK0JCTFIrUEhCUytSUyArIFRhaHVuX2YgKyBvZmZzZXQobG9nKEJhbGl0YSkpLA0KICAgICAgICAgICAgICAgIGRhdGE9ZGF0X20pDQoNCmtmIDwtIHN1bW1hcnkobV9nbG0pJGNvZWZmaWNpZW50cw0KY292cyA8LSBjKCJJREwiLCJWSVQiLCJCR0siLCJCQkxSIiwiUEhCUyIsIlJTIikNCmlycl9jb3YgPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFiZWwgPSBjb3ZzLA0KICBJUlIgPSByb3VuZChleHAoY29lZihtX2dsbSlbY292c10pLDQpLA0KICBDSV8yLjUgPSByb3VuZChleHAoY29uZmludC5kZWZhdWx0KG1fZ2xtKVtjb3ZzLDFdKSw0KSwNCiAgQ0lfOTcuNSA9IHJvdW5kKGV4cChjb25maW50LmRlZmF1bHQobV9nbG0pW2NvdnMsMl0pLDQpLA0KICBwX3ZhbHVlID0gcm91bmQoa2ZbY292cywiUHIoPnx6fCkiXSwzKQ0KKQ0KaXJyX2NvdiAlPiUNCiAga2FibGUoY2FwdGlvbj0iVGFiZWwgNi4gSVJSIGNvdmFyaWF0ZSDigJQgTkItR0xNIChUYWhhcCAxKS4iLCByb3cubmFtZXM9RkFMU0UpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KYGBgDQoNCmBgYHtyIGlyci10YWh1bi1nbG19DQppZHhfdGggPC0gZ3JlcCgiXlRhaHVuX2YiLCByb3duYW1lcyhrZikpDQppcnJfdGggPC0gZXhwKGNiaW5kKElSUj1jb2VmKG1fZ2xtKVtpZHhfdGhdLCBjb25maW50LmRlZmF1bHQobV9nbG0pW2lkeF90aCwsZHJvcD1GQUxTRV0pKQ0Kcm93bmFtZXMoaXJyX3RoKSA8LSBnc3ViKCJUYWh1bl9mIiwiVGFodW4gIixyb3duYW1lcyhpcnJfdGgpKQ0Kcm91bmQoaXJyX3RoLDMpICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHNldE5hbWVzKGMoIklSUiIsIkNJXzIuNSUiLCJDSV85Ny41JSIpKSAlPiUNCiAga2FibGUoY2FwdGlvbj1wYXN0ZTAoIlRhYmVsIDcuIElSUiBlZmVrIHRhaHVuIOKAlCBOQi1HTE0gKHJlZiA9ICIsbWluKHRhaHVuX3RlcnNlZGlhKSwiKS4iKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aD1GQUxTRSwgYm9vdHN0cmFwX29wdGlvbnM9Yygic3RyaXBlZCIsImhvdmVyIikpDQpgYGANCg0KOjo6IHsuaW5mb2JveH0NCioqSW50ZXJwcmV0YXNpLioqIFBhZGEgTkItR0xNLCBnaXppIGt1cmFuZyAoSVJSPTEsMDcxLCBwPTAsMDAzKSwgdml0YW1pbiBBIChJUlI9MSwwMTAsIHA9MCwwMTIpLCBkYW4gQkJMUiAoSVJSPTEsMDE4LCBwPTAsMDM1KSB0YW1wYWsgc2lnbmlmaWthbi4gTmFtdW4gYXJhaCBJUlIgdml0YW1pbiBBIHlhbmcgcG9zaXRpZiB0aWRhayBzZXN1YWkgZWtzcGVrdGFzaSB0ZW9yZXRpcyAoa2VtdW5na2luYW4gYmlhcyBla29sb2dpcykuIEVmZWsgdGFodW4gbWVudXJ1biBwcm9ncmVzaWYgKElSUiAyMDIxID0gMCwxNTQpLCBzaWduaWZpa2FuIHNlamFrIDIwMTk7IHBlbnVydW5hbiB0YWphbSAyMDIw4oCTMjAyMSBrZW11bmdraW5hbiBha2liYXQgcGVsYXBvcmFuIG1hc2EgcGFuZGVtaS4NCjo6Og0KDQojIyMgVGFoYXAgMiDigJQgVWppIE1vcmFuIFJlc2lkdWFsIChOQi1HTE0pDQoNCkRpcGVyaWtzYSBhcGFrYWggcmVzaWR1YWwgTkItR0xNIG1hc2loIG1lbXVhdCBhdXRva29yZWxhc2kgc3Bhc2lhbCBwZXIgdGFodW4uIEJpbGEgc2lnbmlmaWthbg0KKHAgPCAwLDA1KSwgbW9kZWwgcGVybHUgZGl0aW5na2F0a2FuIChUYWhhcCAzKS4NCg0KYGBge3IgbW9yYW4tcmVzaWR1YWwtZ2xtfQ0KZGF0X20kcmVzaWRfZ2xtIDwtIHJlc2lkdWFscyhtX2dsbSwgdHlwZT0icGVhcnNvbiIpDQptb3Jhbl9yZXNpZCA8LSBmdW5jdGlvbih0YWh1biwga29sb20pew0KICBkICA8LSBkYXRfbSAlPiUgZmlsdGVyKFRhaHVuPT10YWh1bikNCiAgcG0gPC0gcGV0YSAlPiUgbGVmdF9qb2luKGQsIGJ5PSJLZWNhbWF0YW4iKQ0KICBtYyA8LSBtb3Jhbi5tYyhwbVtba29sb21dXSwgbHcsIG5zaW09OTk5LCB6ZXJvLnBvbGljeT1UUlVFLCBuYS5hY3Rpb249bmEub21pdCkNCiAgZGF0YS5mcmFtZShUYWh1bj10YWh1biwgTW9yYW5fST1yb3VuZCh1bm5hbWUobWMkc3RhdGlzdGljKSwzKSwNCiAgICAgICAgICAgICBwX3ZhbHVlPXJvdW5kKG1jJHAudmFsdWUsMyksDQogICAgICAgICAgICAgS2VzaW1wdWxhbj1pZmVsc2UobWMkcC52YWx1ZTwwLjA1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZGEgcG9sYSBzcGFzaWFsICh0aW5na2F0a2FuIG1vZGVsKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlc2lkdWFsIGFjYWsgKG1lbWFkYWkpIikpDQp9DQpyZXNpZF9nbG1fdGFiIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseSh0YWh1bl90ZXJzZWRpYSwgbW9yYW5fcmVzaWQsIGtvbG9tPSJyZXNpZF9nbG0iKSkNCnJlc2lkX2dsbV90YWIgJT4lDQogIGthYmxlKGNhcHRpb249IlRhYmVsIDguIE1vcmFuJ3MgSSByZXNpZHVhbCBOQi1HTE0gcGVyIHRhaHVuLiIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKktlcHV0dXNhbi4qKiBVamkgTW9yYW4ncyBJIHBhZGEgcmVzaWR1YWwgTkItR0xNIG1lbnVuanVra2FuIHJlc2lkdWFsIHlhbmcgYWNhayBzZWNhcmEgc3Bhc2lhbCBwYWRhIHNlbHVydWggdGFodW4gKHAgPiAwLDA1LCBuaWxhaSBNb3JhbidzIEkgbWVuZGVrYXRpIG5vbCkuIE1vZGVsIGVmZWsgdGV0YXAgdGlkYWsgbWVueWlzYWthbiBhdXRva29yZWxhc2kgc3Bhc2lhbCwgc2VoaW5nZ2EgbW9kZWwgc3Bhc2lhbCBla3NwbGlzaXQgKENBUi9CWU0pIHRpZGFrIGRpcGVybHVrYW4uIFBlbW9kZWxhbiB0ZXRhcCBkaWxhbmp1dGthbiBrZSBOQiBNaXhlZCBNb2RlbCB1bnR1ayBtZW5nYWtvbW9kaXIga2VtdW5na2luYW4gaGV0ZXJvZ2VuaXRhcyByaXNpa28gYW50YXJrZWNhbWF0YW4uDQoNCjo6Og0KDQojIyMgVGFoYXAgMyDigJQgTkIgTWl4ZWQgTW9kZWwgKFJhbmRvbSBFZmZlY3QgS2VjYW1hdGFuKQ0KDQpTZWJhZ2FpIHBlbmluZ2thdGFuLCBkaXRhbWJhaGthbiBlZmVrIGFjYWsga2VjYW1hdGFuIChyYW5kb20gaW50ZXJjZXB0KSB1bnR1ayBtZW5nYWtvbW9kaXINCmhldGVyb2dlbml0YXMgYW50YXJ3aWxheWFoIGRhbiAibWVtaW5qYW0ga2VrdWF0YW4iIGFudGFydW5pdC4gTW9kZWwgTkIgY2FtcHVyYW4gZGllc3RpbWFzaQ0KZGVuZ2FuIGBnbG1tVE1CYC4NCg0KYGBge3IgbmItbWl4ZWR9DQptX21peCA8LSBnbG1tVE1CKFBuZXVtb25pYSB+IElETCtWSVQrQkdLK0JCTFIrUEhCUytSUyArIFRhaHVuX2YgKw0KICAgICAgICAgICAgICAgICAgICgxIHwgS2VjYW1hdGFuKSArIG9mZnNldChsb2coQmFsaXRhKSksDQogICAgICAgICAgICAgICAgIGZhbWlseT1uYmlub20yLCBkYXRhPWRhdF9tKQ0KDQp2YyA8LSBhcy5udW1lcmljKGF0dHIoVmFyQ29ycihtX21peCkkY29uZCRLZWNhbWF0YW4sICJzdGRkZXYiKSkNCmNhdCgiU2ltcGFuZ2FuIGJha3UgZWZlayBhY2FrIGtlY2FtYXRhbjoiLCByb3VuZCh2YywzKSwNCiAgICAiICgwID0gdGFrIGFkYSB2YXJpYXNpIGFudGFyd2lsYXlhaCB0ZXJzaXNhKVxuXG4iKQ0KDQpmZSA8LSBzdW1tYXJ5KG1fbWl4KSRjb2VmZmljaWVudHMkY29uZA0KaXJyX21peCA8LSBkYXRhLmZyYW1lKA0KICBWYXJpYWJlbCA9IGNvdnMsDQogIElSUiA9IHJvdW5kKGV4cChmZVtjb3ZzLCJFc3RpbWF0ZSJdKSw0KSwNCiAgcF92YWx1ZSA9IHJvdW5kKGZlW2NvdnMsIlByKD58enwpIl0sMykNCikNCmlycl9taXggJT4lDQogIGthYmxlKGNhcHRpb249IlRhYmVsIDkuIElSUiBjb3ZhcmlhdGUg4oCUIE5CIE1peGVkIE1vZGVsIChUYWhhcCAzKS4iLCByb3cubmFtZXM9RkFMU0UpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGg9RkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zPWMoInN0cmlwZWQiLCJob3ZlciIpKQ0KDQpjYXQoIlxuUGVyYmFuZGluZ2FuIEFJQzogIE5CLUdMTSA9Iiwgcm91bmQoQUlDKG1fZ2xtKSwxKSwNCiAgICAiIHwgTkIgTWl4ZWQgPSIsIHJvdW5kKEFJQyhtX21peCksMSksDQogICAgIlxuKG1vZGVsIGRlbmdhbiBBSUMgbGViaWggcmVuZGFoIGxlYmloIGRpZHVrdW5nKVxuIikNCmBgYA0KDQpgYGB7ciBtb3Jhbi1yZXNpZHVhbC1taXh9DQoNCmRhdF9tJHJlc2lkX21peCA8LSByZXNpZHVhbHMobV9taXgsIHR5cGU9InBlYXJzb24iKQ0KcmVzaWRfbWl4X3RhYiA8LSBkby5jYWxsKHJiaW5kLCBsYXBwbHkodGFodW5fdGVyc2VkaWEsIG1vcmFuX3Jlc2lkLCBrb2xvbT0icmVzaWRfbWl4IikpDQpyZXNpZF9taXhfdGFiICU+JQ0KICBrYWJsZShjYXB0aW9uPSJUYWJlbCAxMC4gTW9yYW4ncyBJIHJlc2lkdWFsIE5CIE1peGVkIE1vZGVsIHBlciB0YWh1bi4iKSAlPiUNCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoPUZBTFNFLCBib290c3RyYXBfb3B0aW9ucz1jKCJzdHJpcGVkIiwiaG92ZXIiKSkNCmBgYA0KDQo6Ojogey5pbmZvYm94fQ0KKipLZXB1dHVzYW4uKiogTkIgTWl4ZWQgTW9kZWwgbWVtYmVyaWthbiBrZWNvY29rYW4gamF1aCBsZWJpaCBiYWlrIGRhcmlwYWRhIE5CLUdMTSAoQUlDIDE3ODgsNCB2cyAxODQzLDY7IHNlbGlzaWggNTUsMiBwb2luKSwgZGVuZ2FuIHNpbXBhbmdhbiBiYWt1IGVmZWsgYWNhayBrZWNhbWF0YW4gMCw1MTQgeWFuZyBtZW51bmp1a2thbiBoZXRlcm9nZW5pdGFzIHJpc2lrbyBhbnRhcndpbGF5YWggc3Vic3RhbnNpYWwuIFNldGVsYWggZWZlayBhY2FrIGRpbWFzdWtrYW4sIHRpZGFrIGFkYSBjb3ZhcmlhdGUgeWFuZyBzaWduaWZpa2FuIHBhZGEgYWxwaGEgNSUgKE5hbXVuIEJCTFIgc2lnbmlmaWthbiBwYWRhIGFscGhhIDEwJSkuIFJlc2lkdWFsIE1peGVkIE1vZGVsIGFjYWsgc2VjYXJhIHNwYXNpYWwgZGkgc2VsdXJ1aCB0YWh1biAocCA+IDAsMDUpLCBzZWhpbmdnYSBtb2RlbCBOQi1NaXhlZCBNb2RlbCBkaW5pbGFpIG1lbWFkYWkgZGFuIGRpcGlsaWggc2ViYWdhaSBtb2RlbCBmaW5hbC4NCjo6Og0KDQoNCiMjIyBQZXRhIFJpc2lrbyBXaWxheWFoIChkYXJpIE5CIE1peGVkIE1vZGVsKQ0KDQpgYGB7ciBwZXRhLW1vZGVsLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NiwgZmlnLmNhcD0iR2FtYmFyIDMuIFBldGEgZWZlayBhY2FrIGtlY2FtYXRhbiAoTkIgTWl4ZWQgTW9kZWwpLCBrZXNlbHVydWhhbiBwZXJpb2RlIDIwMTctMjAyMS4ifQ0KDQpyZSA8LSByYW5lZihtX21peCkkY29uZCRLZWNhbWF0YW4NCnJlX2RmIDwtIGRhdGEuZnJhbWUoS2VjYW1hdGFuPXJvd25hbWVzKHJlKSwgcmVmZj1yZVssMV0pDQpyZV9kZiRJUlIgPC0gZXhwKHJlX2RmJHJlZmYpDQpwbV9tb2RlbCA8LSBwZXRhICU+JSBsZWZ0X2pvaW4ocmVfZGYsIGJ5PSJLZWNhbWF0YW4iKQ0KZ2dwbG90KHBtX21vZGVsKSArDQogIGdlb21fc2YoYWVzKGZpbGw9SVJSKSwgY29sb3I9IndoaXRlIiwgbGluZXdpZHRoPTAuMikgKw0KICBnZW9tX3RleHQoZGF0YT1wZXRhX2xibCwgYWVzKFgsIFksIGxhYmVsPU5vKSwgc2l6ZT0yLjUsIGNvbG9yPSJncmV5MjAiKSArDQogIHNjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iIzIxNjZhYyIsIG1pZD0id2hpdGUiLCBoaWdoPSIjYjIxODJiIiwgbWlkcG9pbnQ9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iSVJSIHdpbGF5YWgiLCBuYS52YWx1ZT0iZ3JleTg1IikgKw0KICBsYWJzKHRpdGxlPSJSaXNpa28gUmVsYXRpZiBQbmV1bW9uaWEgQmFsaXRhIHBlciBLZWNhbWF0YW4gKEVmZWsgQWNhaykiLA0KICAgICAgIHN1YnRpdGxlPSJLZXNlbHVydWhhbiBwZXJpb2RlIDIwMTctMjAyMSIsDQogICAgICAgY2FwdGlvbj0iRGFyaSByYW5kb20gaW50ZXJjZXB0IE5CIE1peGVkIE1vZGVsOyBtZXJhaCA9IHJpc2lrbyBsZWJpaCB0aW5nZ2kuIExpaGF0IGtvdGFrIGtldGVyYW5nYW4gbm9tb3Igd2lsYXlhaC4iKSArDQogIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQ9ZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCjo6OiB7LmluZm9ib3h9DQoqKkludGVycHJldGFzaSAmIHdpbGF5YWggcHJpb3JpdGFzLioqIFBldGEgZWZlayBhY2FrIGtlY2FtYXRhbiAoR2FtYmFyIDMpIG1lbmdnYW1iYXJrYW4gcmlzaWtvIHJlbGF0aWYgcG5ldW1vbmlhIGJhbGl0YSBhbnRhcndpbGF5YWggc2VsYW1hIHBlcmlvZGUgMjAxNy0yMDIxLCBzZXRlbGFoIG1lbmdvbnRyb2wgZWZlayB0YWh1bi4gS2VjYW1hdGFuIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwgbWVudW5qdWtrYW4gcmlzaWtvIHJlbGF0aWYgdGVydGluZ2dpIChiZXJ3YXJuYSBtZXJhaCksIHNlZGFuZ2thbiBzZWJhZ2lhbiBiZXNhciBrZWNhbWF0YW4gbGFpbm55YSBiZXJhZGEgZGkgc2VraXRhciBhdGF1IGRpIGJhd2FoIHJhdGEtcmF0YSBrb3RhLiBLZWNhbWF0YW4gYmVyaXNpa28gdGluZ2dpIHRlcnNlYmFyIHNlY2FyYSBnZW9ncmFmaXMgZGFuIHRpZGFrIG1lbWJlbnR1ayBrbGFzdGVyIGtvbnNpc3RlbiBkZW5nYW4gaGFzaWwgdWppIE1vcmFuJ3MgSSBzcGFzaWFsIHlhbmcgdGlkYWsgc2lnbmlmaWthbi4gUG9sYSBpbmkgbWVuZWdhc2thbiBiYWh3YSB2YXJpYXNpIHJpc2lrbyBwbmV1bW9uaWEgYmFsaXRhIGRpIEtvdGEgQmFuZHVuZyBiZXJzaWZhdCBhbnRhcndpbGF5YWggKGhldGVyb2dlbml0YXMgbG9rYWwpIGFsaWgtYWxpaCBtZW5nZWxvbXBvayBzZWNhcmEgc3Bhc2lhbCwgc2VoaW5nZ2EgQ2luYW1ibyBkYW4gQmFuZHVuZyBLaWR1bCBtZW5qYWRpIGthbmRpZGF0IHByaW9yaXRhcyBpbnRlcnZlbnNpIGJlcmJhc2lzIHdpbGF5YWguDQo6OjoNCg0KIyMgSW1wbGlrYXNpDQoNClRlbXVhbiBhbmFsaXNpcyBpbmkgbWVtaWxpa2kgYmViZXJhcGEgaW1wbGlrYXNpLiBQZXRhIHJpc2lrbyByZWxhdGlmIGtlY2FtYXRhbiBtZW5naWRlbnRpZmlrYXNpIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwgc2ViYWdhaSB3aWxheWFoIGRlbmdhbiByaXNpa28gcG5ldW1vbmlhIGJhbGl0YSB5YW5nIHRpbmdnaSBkYW4ga29uc2lzdGVuIHNlcGFuamFuZyBwZXJpb2RlLCBzZWhpbmdnYSBrZWR1YW55YSBtZW5qYWRpIGthbmRpZGF0IHByaW9yaXRhcyB1bnR1ayBwZW5ndWF0YW4gc3VydmVpbGFucywgcGVuZW11YW4ga2FzdXMgZGluaSwgZGFuIGludGVydmVuc2kga2VzZWhhdGFuLiBLYXJlbmEgZGV0ZXJtaW5hbiBwcm9ncmFtIGtlc2VoYXRhbiB0aWRhayBtZW51bmp1a2thbiBhc29zaWFzaSB5YW5nIHNpZ25pZmlrYW4gcGFkYSB0aW5na2F0IGFncmVnYXQga2VjYW1hdGFuIHNlbWVudGFyYSB2YXJpYXNpIHJpc2lrbyBhbnRhcndpbGF5YWgganVzdHJ1IHN1YnN0YW5zaWFsLCBwZW5nZW5kYWxpYW4gcG5ldW1vbmlhIGJhbGl0YSBzZWJhaWtueWEgZGlhcmFoa2FuIHNlY2FyYSBiZXJiYXNpcyB3aWxheWFoLCBtZW1mb2t1c2thbiBzdW1iZXIgZGF5YSBwYWRhIGtlY2FtYXRhbiBiZXJpc2lrbyB0aW5nZ2kga2V0aW1iYW5nIGhhbnlhIG1lbmFpa2thbiBjYWt1cGFuIHByb2dyYW0gc2VjYXJhIG1lcmF0YSBkaSBzZWx1cnVoIGtvdGEuDQpBbmFsaXNpcyBpbmkgbWVtaWxpa2kgc2VqdW1sYWgga2V0ZXJiYXRhc2FuLiBQZXJ0YW1hLCBqdW1sYWggYmFsaXRhIHlhbmcgZGlndW5ha2FuIHNlYmFnYWkgcGVueWVidXQgbWVydXBha2FuIGFuZ2thIHNhc2FyYW4vZXN0aW1hc2kgeWFuZyBkYXBhdCBiZXJiZWRhIGRhcmkgcG9wdWxhc2kgcmlpbC4gS2VkdWEsIGRhdGEga2FzdXMgYmVyc3VtYmVyIGRhcmkgcGVsYXBvcmFuIGZhc2lsaXRhcyBwZWxheWFuYW4ga2VzZWhhdGFuIHlhbmcgcmVudGFuIHRlcmhhZGFwIHBlcmJlZGFhbiBjYWt1cGFuIHBlbmNhdGF0YW4sIGhhbCBpbmkgc2FuZ2F0IG1lbm9uam9sIHBhZGEgMjAyMOKAkzIwMjEsIGtldGlrYSBwZW51cnVuYW4ga2FzdXMga2VtdW5na2luYW4gYmVzYXIgbWVuY2VybWlua2FuIGdhbmdndWFuIHBlbmVtdWFuIGRhbiBwZWxhcG9yYW4gc2VsYW1hIHBhbmRlbWkgQ09WSUQtMTkgc2ViYWdhaW1hbmEgZGlueWF0YWthbiBkYWxhbSBQcm9maWwgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZywgYnVrYW4gcGVudXJ1bmFuIGJlYmFuIHBlbnlha2l0IHlhbmcgc2VzdW5nZ3VobnlhLiBLZXRpZ2EsIG1vZGVsIG1lbmdndW5ha2FuIGVmZWsgYWNhayBrZWNhbWF0YW4geWFuZyBiZXJzaWZhdCBpbmRlcGVuZGVuLCBhZGFueWEgaW5kaWthc2kgYmFod2EgcmlzaWtvIGRhc2FyIGFudGFyd2lsYXlhaCBjZW5kZXJ1bmcgbWVuZ2Vsb21wb2sgc2VjYXJhIHNwYXNpYWwgbWVudW5qdWtrYW4gYmFod2EgcGVtb2RlbGFuIGRlbmdhbiBzdHJ1a3R1ciBzcGFzaWFsIGVrc3BsaXNpdCAoc2VwZXJ0aSBDQVIgYXRhdSBCWU0pIGRhcGF0IG1lbmphZGkgcGVuZ2VtYmFuZ2FuIHlhbmcgbGViaWggdGVwYXQgcGFkYSBzdHVkaSBsYW5qdXRhbiBkYW4ga2VlbXBhdCwgZGFsYW0gbWFrYWxhaCBoYW55YSBtZW5nZ3VuYWthbiA1IHRhaHVuIHNlYmFpa255YSBkaXRhbWJhaGthbiBpbmZvcm1hc2kgdGFodW4gdGVydXBkYXRlLg0KDQojIEtlc2ltcHVsYW4geyNrZXNpbXB1bGFufQ0KDQpJbnNpZGVucyBwbmV1bW9uaWEgYmFsaXRhIHlhbmcgdGVyY2F0YXQgZGkgS290YSBCYW5kdW5nIG1lbnVydW4gdGFqYW0gc2VwYW5qYW5nIDIwMTfigJMyMDIxLCBkYXJpIDEwLjczNSBrYXN1cyAoSVIgNS4yOTQgcGVyIDEwMC4wMDAgYmFsaXRhKSBtZW5qYWRpIDIuMDAzIGthc3VzIChJUiAxLjE0MSksIGRlbmdhbiBwZW51cnVuYW4gdGVyYmVzYXIgcGFkYSBtYXNhIHBhbmRlbWkgeWFuZyBrZW11bmdraW5hbiBkaXBlbmdhcnVoaSBnYW5nZ3VhbiBwZWxhcG9yYW4uIEFuYWxpc2lzIFNJUiBkYW4gcGVuZ2hhbHVzYW4gRW1waXJpY2FsIEJheWVzIG1lbWJhbnR1IG1lbmdpZGVudGlmaWthc2kga2VjYW1hdGFuIGJlcmlzaWtvIHRpbmdnaSBzZWNhcmEgbGViaWggYW5kYWwsIGRlbmdhbiBDaW5hbWJvIGRhbiBCYW5kdW5nIEtpZHVsIGtvbnNpc3RlbiBtZW51bmp1a2thbiByaXNpa28gZGkgYXRhcyByYXRhLXJhdGEga290YS4NClVqaSBhdXRva29yZWxhc2kgbWVudW5qdWtrYW4gcG9sYSB5YW5nIGtoYXM6IE1vcmFuJ3MgSSBzcGFzaWFsIHBlciB0YWh1biBsZW1haCBkYW4gdGlkYWsgc2lnbmlmaWthbiwgc2VtZW50YXJhIE1vcmFuJ3MgSSBzcGFzaW8tdGVtcG9yYWwgc2lnbmlmaWthbiAoMCwxODY7IHAgPSAwLDAwMSksIG1lbmFuZGFrYW4gYmFod2EgZGluYW1pa2EgcmlzaWtvIGxlYmloIGRpZ2VyYWtrYW4gb2xlaCBkaW1lbnNpIHRlbXBvcmFsIGRhcmlwYWRhIHBlbmdlbG9tcG9rYW4gZ2VvZ3JhZmlzIGRhbGFtIHNhdHUgdGFodW4uIE1lbGFsdWkgcGVtb2RlbGFuIGJlcnRpbmdrYXQsIE5CIE1peGVkIE1vZGVsIGRlbmdhbiBlZmVrIGFjYWsga2VjYW1hdGFuIHRlcnBpbGloIHNlYmFnYWkgbW9kZWwgdGVyYmFpayAoQUlDIDE3ODgsNCB2cyAxODQzLDYpLCBkZW5nYW4gc2ltcGFuZ2FuIGJha3UgZWZlayBhY2FrIDAsNTE0IHlhbmcgbWVuZWdhc2thbiBoZXRlcm9nZW5pdGFzIHJpc2lrbyBhbnRhcndpbGF5YWguIEhhbnlhIHNhdHUgY292YXJpYXRlIGNha3VwYW4gcHJvZ3JhbSBrZXNlaGF0YW4geWFuZyBiZXJhc29zaWFzaSBzaWduaWZpa2FuIHBhZGEgbW9kZWwgZmluYWwgKG1lbmdndW5ha2FuIGFscGhhIDEwJSksIHlhbmcgbWVuZ2luZGlrYXNpa2FuIGRldGVybWluYW4gcHJvZ3JhbSB0aWRhayBtZW51bmp1a2thbiBhc29zaWFzaSBrdWF0IGRpIHRpbmdrYXQgYWdyZWdhdCBrZWNhbWF0YW4uDQpQZW5nZW5kYWxpYW4gcG5ldW1vbmlhIGJhbGl0YSBkaSBLb3RhIEJhbmR1bmcgc2ViYWlrbnlhIGRpYXJhaGthbiBiZXJiYXNpcyB3aWxheWFoIGRlbmdhbiBtZW1wcmlvcml0YXNrYW4ga2VjYW1hdGFuIGJlcmlzaWtvIHRpbmdnaSBzZXBlcnRpIENpbmFtYm8gZGFuIEJhbmR1bmcgS2lkdWwsIGRpc2VydGFpIHBlbmd1YXRhbiBzaXN0ZW0gcGVuY2F0YXRhbiBkYW4gcGVsYXBvcmFuIGthc3VzIGFnYXIgZGF0YSBsZWJpaCBtZW5jZXJtaW5rYW4gYmViYW4gcGVueWFraXQgeWFuZyBzZXN1bmdndWhueWEuDQoNCiMgRGFmdGFyIFB1c3Rha2EgeyNwdXN0YWthfQ0KDQoxLiBCcm9va3MsIE0uIEUuLCBldCBhbC4gKDIwMTcpLiBnbG1tVE1CIGJhbGFuY2VzIHNwZWVkIGFuZCBmbGV4aWJpbGl0eSBhbW9uZyBwYWNrYWdlcyBmb3IgemVyby1pbmZsYXRlZCBnZW5lcmFsaXplZCBsaW5lYXIgbWl4ZWQgbW9kZWxzLiBUaGUgUiBKb3VybmFsDQoyLiBDbGF5dG9uLCBELiwgJiBLYWxkb3IsIEouICgxOTg3KS4gRW1waXJpY2FsIEJheWVzIGVzdGltYXRlcyBvZiBhZ2Utc3RhbmRhcmRpemVkIHJlbGF0aXZlIHJpc2tzIGZvciB1c2UgaW4gZGlzZWFzZSBtYXBwaW5nLiBCaW9tZXRyaWNzDQozLiBDbGlmZiwgQS4gRC4sICYgT3JkLCBKLiBLLiAoMTk4MSkuIFNwYXRpYWwgcHJvY2Vzc2VzOiBNb2RlbHMgYW5kIGFwcGxpY2F0aW9ucy4gTG9uZG9uOiBQaW9uLg0KNC4gRGluYXMgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZy4gKDIwMTYpLiBQcm9maWwgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZyBUYWh1biAyMDE2LiBCYW5kdW5nOiBEaW5hcyBLZXNlaGF0YW4gS290YSBCYW5kdW5nLg0KNS4gRGluYXMgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZy4gKDIwMjEpLiBQcm9maWwgS2VzZWhhdGFuIEtvdGEgQmFuZHVuZyBUYWh1biAyMDIxLiBCYW5kdW5nOiBEaW5hcyBLZXNlaGF0YW4gS290YSBCYW5kdW5nLg0KNi4gIEhpbGJlLCBKLiBNLiAoMjAxMikuIE5lZ2F0aXZlIEJpbm9taWFsIFJlZ3Jlc3Npb24gKDJuZCBlZC4pLiBDYW1icmlkZ2U6IENhbWJyaWRnZSBVbml2ZXJzaXR5IFByZXNzLiANCjcuIEtlbWVudGVyaWFuIEtlc2VoYXRhbiBSZXB1YmxpayBJbmRvbmVzaWEuICgyMDIzKS4gUGVtZXJpbnRhaCBiZXJrb21pdG1lbiB0dXJ1bmthbiBrYXN1cyBrZW1hdGlhbiBha2liYXQgcG5ldW1vbmlhLiBKYWthcnRhOiBLZW1lbmtlcyBSSS4gRGlha3NlcyBkYXJpIGh0dHBzOi8vd3d3LmtlbWtlcy5nby5pZC9pZC8lMjBwZW1lcmludGFoLWJlcmtvbWl0bWVuLXR1cnVua2FuLWthc3VzLWtlbWF0aWFuLWFraWJhdC1wbmV1bW9uaWENCjguIExlZSwgSi4sICYgTGksIFMuICgyMDE3KS4gRXh0ZW5kaW5nIE1vcmFuJ3MgaW5kZXggZm9yIG1lYXN1cmluZyBzcGF0aW90ZW1wb3JhbCBjbHVzdGVyaW5nIG9mIGdlb2dyYXBoaWMgZXZlbnRzLiBHZW9ncmFwaGljYWwgQW5hbHlzaXMgDQo5LiBNYXJzaGFsbCwgUi4gSi4gKDE5OTEpLiBNYXBwaW5nIGRpc2Vhc2UgYW5kIG1vcnRhbGl0eSByYXRlcyB1c2luZyBlbXBpcmljYWwgQmF5ZXMgZXN0aW1hdG9ycy4gSm91cm5hbCBvZiB0aGUgUm95YWwgU3RhdGlzdGljYWwgU29jaWV0eTogU2VyaWVzIEMgKEFwcGxpZWQgU3RhdGlzdGljcykNCjEwLiBNb3JhbiwgUC4gQS4gUC4gKDE5NTApLiBOb3RlcyBvbiBjb250aW51b3VzIHN0b2NoYXN0aWMgcGhlbm9tZW5hLiBCaW9tZXRyaWthDQoxMS4gV29ybGQgSGVhbHRoIE9yZ2FuaXphdGlvbi4gKDIwMjIpLiBQbmV1bW9uaWEgaW4gY2hpbGRyZW4uIEdlbmV2YTogV0hPLiBEaWFrc2VzIGRhcmkgaHR0cHM6Ly93d3cud2hvLmludC9uZXdzLXJvb20vZmFjdC1zaGVldHMvZGV0YWlsL3BuZXVtb25pYQ0KDQotLS0NCg0KPGRldGFpbHM+PHN1bW1hcnk+SW5mb3JtYXNpIHNlc2kgUjwvc3VtbWFyeT4NCmBgYHtyIHNlc2l9DQpzZXNzaW9uSW5mbygpDQpgYGANCjwvZGV0YWlscz4NCg==